["^ ","~:foreign-libs",[],"~:externs",[],"~:resources",[["^ ","~:cache-key",[1579837703000],"~:output-name","goog.labs.testing.objectmatcher.js","~:resource-id",["~:shadow.build.classpath/resource","goog/labs/testing/objectmatcher.js"],"~:resource-name","goog/labs/testing/objectmatcher.js","~:type","~:goog","~:source","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides the built-in object matchers like equalsObject,\n *     hasProperty, instanceOf, etc.\n */\n\ngoog.provide('goog.labs.testing.AnyObjectMatcher');\ngoog.provide('goog.labs.testing.HasPropertyMatcher');\ngoog.provide('goog.labs.testing.InstanceOfMatcher');\ngoog.provide('goog.labs.testing.IsNullMatcher');\ngoog.provide('goog.labs.testing.IsNullOrUndefinedMatcher');\ngoog.provide('goog.labs.testing.IsUndefinedMatcher');\ngoog.provide('goog.labs.testing.ObjectEqualsMatcher');\n\ngoog.require('goog.labs.testing.Matcher');\n\n\n\n/**\n * Matches any object value.\n *\n * @constructor @struct @implements {goog.labs.testing.Matcher} @final\n */\ngoog.labs.testing.AnyObjectMatcher = function() {};\n\n\n/** @override */\ngoog.labs.testing.AnyObjectMatcher.prototype.matches = function(actualValue) {\n  return goog.isObject(actualValue);\n};\n\n\n/** @override */\ngoog.labs.testing.AnyObjectMatcher.prototype.describe = function(actualValue) {\n  return '<' + actualValue + '> is not an object';\n};\n\n\n\n/**\n * The Equals matcher.\n *\n * @param {!Object} expectedObject The expected object.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.ObjectEqualsMatcher = function(expectedObject) {\n  /**\n   * @type {!Object}\n   * @private\n   */\n  this.object_ = expectedObject;\n};\n\n\n/**\n * Determines if two objects are the same.\n *\n * @override\n */\ngoog.labs.testing.ObjectEqualsMatcher.prototype.matches = function(\n    actualObject) {\n  return actualObject === this.object_;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.ObjectEqualsMatcher.prototype.describe = function(\n    actualObject) {\n  return 'Input object is not the same as the expected object.';\n};\n\n\n\n/**\n * The HasProperty matcher.\n *\n * @param {string} property Name of the property to test.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.HasPropertyMatcher = function(property) {\n  /**\n   * @type {string}\n   * @private\n   */\n  this.property_ = property;\n};\n\n\n/**\n * Determines if an object has a property.\n *\n * @override\n */\ngoog.labs.testing.HasPropertyMatcher.prototype.matches = function(\n    actualObject) {\n  return this.property_ in actualObject;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.HasPropertyMatcher.prototype.describe = function(\n    actualObject) {\n  return 'Object does not have property: ' + this.property_;\n};\n\n\n\n/**\n * The InstanceOf matcher.\n *\n * @param {!Object} object The expected class object.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.InstanceOfMatcher = function(object) {\n  /**\n   * @type {!Object}\n   * @private\n   */\n  this.object_ = object;\n};\n\n\n/**\n * Determines if an object is an instance of another object.\n *\n * @override\n */\ngoog.labs.testing.InstanceOfMatcher.prototype.matches = function(actualObject) {\n  return actualObject instanceof this.object_;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.InstanceOfMatcher.prototype.describe = function(\n    actualObject) {\n  return 'Input object is not an instance of the expected object';\n};\n\n\n\n/**\n * The IsNullOrUndefined matcher.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.IsNullOrUndefinedMatcher = function() {};\n\n\n/**\n * Determines if input value is null or undefined.\n *\n * @override\n */\ngoog.labs.testing.IsNullOrUndefinedMatcher.prototype.matches = function(\n    actualValue) {\n  return actualValue == null;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.IsNullOrUndefinedMatcher.prototype.describe = function(\n    actualValue) {\n  return actualValue + ' is not null or undefined.';\n};\n\n\n\n/**\n * The IsNull matcher.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.IsNullMatcher = function() {};\n\n\n/**\n * Determines if input value is null.\n *\n * @override\n */\ngoog.labs.testing.IsNullMatcher.prototype.matches = function(actualValue) {\n  return actualValue === null;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.IsNullMatcher.prototype.describe = function(actualValue) {\n  return actualValue + ' is not null.';\n};\n\n\n\n/**\n * The IsUndefined matcher.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.IsUndefinedMatcher = function() {};\n\n\n/**\n * Determines if input value is undefined.\n *\n * @override\n */\ngoog.labs.testing.IsUndefinedMatcher.prototype.matches = function(actualValue) {\n  return actualValue === undefined;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.IsUndefinedMatcher.prototype.describe = function(\n    actualValue) {\n  return actualValue + ' is not undefined.';\n};\n\n\n/** @return {!goog.labs.testing.AnyObjectMatcher} */\nvar anyObject = goog.labs.testing.AnyObjectMatcher.anyObject = function() {\n  return new goog.labs.testing.AnyObjectMatcher();\n};\n\n\n/**\n * Returns a matcher that matches objects that are equal to the input object.\n * Equality in this case means the two objects are references to the same\n * object.\n *\n * @param {!Object} object The expected object.\n *\n * @return {!goog.labs.testing.ObjectEqualsMatcher} A\n *     ObjectEqualsMatcher.\n */\nvar equalsObject =\n    goog.labs.testing.ObjectEqualsMatcher.equalsObject = function(object) {\n      return new goog.labs.testing.ObjectEqualsMatcher(object);\n    };\n\n\n/**\n * Returns a matcher that matches objects that contain the input property.\n *\n * @param {string} property The property name to check.\n *\n * @return {!goog.labs.testing.HasPropertyMatcher} A HasPropertyMatcher.\n */\nvar hasProperty =\n    goog.labs.testing.HasPropertyMatcher.hasProperty = function(property) {\n      return new goog.labs.testing.HasPropertyMatcher(property);\n    };\n\n\n/**\n * Returns a matcher that matches instances of the input class.\n *\n * @param {!Object} object The class object.\n *\n * @return {!goog.labs.testing.InstanceOfMatcher} A\n *     InstanceOfMatcher.\n */\nvar instanceOfClass =\n    goog.labs.testing.InstanceOfMatcher.instanceOfClass = function(object) {\n      return new goog.labs.testing.InstanceOfMatcher(object);\n    };\n\n\n/**\n * Returns a matcher that matches all null values.\n *\n * @return {!goog.labs.testing.IsNullMatcher} A IsNullMatcher.\n */\nvar isNull = goog.labs.testing.IsNullMatcher.isNull = function() {\n  return new goog.labs.testing.IsNullMatcher();\n};\n\n\n/**\n * Returns a matcher that matches all null and undefined values.\n *\n * @return {!goog.labs.testing.IsNullOrUndefinedMatcher} A\n *     IsNullOrUndefinedMatcher.\n */\nvar isNullOrUndefined =\n    goog.labs.testing.IsNullOrUndefinedMatcher.isNullOrUndefined = function() {\n      return new goog.labs.testing.IsNullOrUndefinedMatcher();\n    };\n\n\n/**\n * Returns a matcher that matches undefined values.\n *\n * @return {!goog.labs.testing.IsUndefinedMatcher} A IsUndefinedMatcher.\n */\nvar isUndefined =\n    goog.labs.testing.IsUndefinedMatcher.isUndefined = function() {\n      return new goog.labs.testing.IsUndefinedMatcher();\n    };\n","~:last-modified",1579837703000,"~:requires",["~#set",["~$goog.labs.testing.Matcher","~$goog"]],"~:pom-info",["^ ","~:description","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","~:group-id","~$org.clojure","~:artifact-id","~$google-closure-library","~:name","Google Closure Library","~:id","~$org.clojure/google-closure-library","~:url","http://code.google.com/p/closure-library/","~:parent-group-id","~$org.sonatype.oss","~:coordinate",["^H","0.0-20191016-6ae1f72f"],"~:version","0.0-20191016-6ae1f72f"],"^I",["~#url","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/testing/objectmatcher.js"],"~:provides",["^=",["~$goog.labs.testing.IsNullMatcher","~$goog.labs.testing.HasPropertyMatcher","~$goog.labs.testing.ObjectEqualsMatcher","~$goog.labs.testing.IsNullOrUndefinedMatcher","~$goog.labs.testing.IsUndefinedMatcher","~$goog.labs.testing.AnyObjectMatcher","~$goog.labs.testing.InstanceOfMatcher"]],"~:from-jar",true,"~:deps",["^?","^>"]],["^ ","^3",[1579837703000],"^4","goog.editor.plugins.emoticons.js","^5",["^6","goog/editor/plugins/emoticons.js"],"^7","goog/editor/plugins/emoticons.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved\n\n/**\n * @fileoverview Plugin for generating emoticons.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.provide('goog.editor.plugins.Emoticons');\n\ngoog.require('goog.dom.TagName');\ngoog.require('goog.editor.Plugin');\ngoog.require('goog.editor.range');\ngoog.require('goog.functions');\ngoog.require('goog.ui.emoji.Emoji');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Plugin for generating emoticons.\n *\n * @constructor\n * @extends {goog.editor.Plugin}\n * @final\n */\ngoog.editor.plugins.Emoticons = function() {\n  goog.editor.plugins.Emoticons.base(this, 'constructor');\n};\ngoog.inherits(goog.editor.plugins.Emoticons, goog.editor.Plugin);\n\n\n/** The emoticon command. */\ngoog.editor.plugins.Emoticons.COMMAND = '+emoticon';\n\n\n/** @override */\ngoog.editor.plugins.Emoticons.prototype.getTrogClassId =\n    goog.functions.constant(goog.editor.plugins.Emoticons.COMMAND);\n\n\n/** @override */\ngoog.editor.plugins.Emoticons.prototype.isSupportedCommand = function(command) {\n  return command == goog.editor.plugins.Emoticons.COMMAND;\n};\n\n\n/**\n * Inserts an emoticon into the editor at the cursor location. Places the\n * cursor to the right of the inserted emoticon.\n * @param {string} command Command to execute.\n * @param {*=} opt_arg Emoji to insert.\n * @return {!Object|undefined} The result of the command.\n * @override\n */\ngoog.editor.plugins.Emoticons.prototype.execCommandInternal = function(\n    command, opt_arg) {\n  var emoji = /** @type {goog.ui.emoji.Emoji} */ (opt_arg);\n\n  var styleProperties = 'margin:0 0.2ex;vertical-align:middle;';\n  var emojiHeight = emoji.getHeight();\n  styleProperties += emojiHeight ? 'height:' + emojiHeight + 'px;' : '';\n  var emojiWidth = emoji.getWidth();\n  styleProperties += emojiWidth ? 'width:' + emojiWidth + 'px;' : '';\n\n  var dom = this.getFieldDomHelper();\n  var imgAttributes = {'src': emoji.getUrl(), 'style': styleProperties};\n  if (emoji.getAltText()) {\n    imgAttributes['alt'] = emoji.getAltText();\n  }\n  var img = dom.createDom(goog.dom.TagName.IMG, imgAttributes);\n\n  img.setAttribute(goog.ui.emoji.Emoji.ATTRIBUTE, emoji.getId());\n  img.setAttribute(goog.ui.emoji.Emoji.DATA_ATTRIBUTE, emoji.getId());\n\n  this.getFieldObject().getRange().replaceContentsWithNode(img);\n\n  // IE8 does the right thing with the cursor, and has a js error when we try\n  // to place the cursor manually.\n  // IE9 loses the cursor when the window is focused, so focus first.\n  if (!goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9)) {\n    this.getFieldObject().focus();\n    goog.editor.range.placeCursorNextTo(img, false);\n  }\n};\n","^;",1579837703000,"^<",["^=",["~$goog.functions","~$goog.editor.range","^?","~$goog.userAgent","~$goog.ui.emoji.Emoji","~$goog.editor.Plugin","~$goog.dom.TagName"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/emoticons.js"],"^O",["^=",["~$goog.editor.plugins.Emoticons"]],"^W",true,"^X",["^?","^12","^11","^Z","^Y","^10","^["]],["^ ","^3",[1579837703000],"^4","goog.module.module.js","^5",["^6","goog/module/module.js"],"^7","goog/module/module.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n *\n * @fileoverview This class supports the dynamic loading of compiled\n * javascript modules at runtime, as described in the designdoc.\n *\n *   <http://go/js_modules_design>\n *\n */\n\ngoog.provide('goog.module');\n\n// TODO(johnlenz): Here we explicitly initialize the namespace to avoid\n// problems with the goog.module method in base.js. We should rename this\n// entire package to goog.loader and then we can delete this file.\n//\n// However, note that it is tricky to do that without breaking the world.\n/**\n * @suppress {duplicate}\n * @type {function(string):void}\n */\ngoog.module = goog.module || {};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/module/module.js"],"^O",["^=",["~$goog.module"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.i18n.uchar.remotenamefetcher.js","^5",["^6","goog/i18n/uchar/remotenamefetcher.js"],"^7","goog/i18n/uchar/remotenamefetcher.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Object which fetches Unicode codepoint names from a remote data\n * source. This data source should accept two parameters:\n * <ol>\n * <li>c - the list of codepoints in hexadecimal format\n * <li>p - the name property\n * </ol>\n * and return a JSON object representation of the result.\n * For example, calling this data source with the following URL:\n * http://datasource?c=50,ff,102bd&p=name\n * Should return a JSON object which looks like this:\n * <pre>\n * {\"50\":{\"name\":\"LATIN CAPITAL LETTER P\"},\n * \"ff\":{\"name\":\"LATIN SMALL LETTER Y WITH DIAERESIS\"},\n * \"102bd\":{\"name\":\"CARIAN LETTER K2\"}}\n * </pre>.\n */\n\ngoog.provide('goog.i18n.uChar.RemoteNameFetcher');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.Uri');\ngoog.require('goog.events');\ngoog.require('goog.i18n.uChar');\ngoog.require('goog.i18n.uChar.NameFetcher');\ngoog.require('goog.log');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.XhrIo');\n\n\n\n/**\n * Builds the RemoteNameFetcher object. This object retrieves codepoint names\n * from a remote data source.\n *\n * @param {string} dataSourceUri URI to the data source.\n * @constructor\n * @implements {goog.i18n.uChar.NameFetcher}\n * @extends {goog.Disposable}\n * @final\n */\ngoog.i18n.uChar.RemoteNameFetcher = function(dataSourceUri) {\n  goog.i18n.uChar.RemoteNameFetcher.base(this, 'constructor');\n\n  /**\n   * XHRIo object for prefetch() asynchronous calls.\n   *\n   * @type {!goog.net.XhrIo}\n   * @private\n   */\n  this.prefetchXhrIo_ = new goog.net.XhrIo();\n\n  /**\n   * XHRIo object for getName() asynchronous calls.\n   *\n   * @type {!goog.net.XhrIo}\n   * @private\n   */\n  this.getNameXhrIo_ = new goog.net.XhrIo();\n\n  /**\n   * URI to the data.\n   *\n   * @type {string}\n   * @private\n   */\n  this.dataSourceUri_ = dataSourceUri;\n\n  /**\n   * A cache of all the collected names from the server.\n   *\n   * @type {!Map<string, string>}\n   * @private\n   */\n  this.charNames_ = new Map();\n};\ngoog.inherits(goog.i18n.uChar.RemoteNameFetcher, goog.Disposable);\n\n\n/**\n * Key to the listener on XHR for prefetch(). Used to clear previous listeners.\n *\n * @type {goog.events.Key}\n * @private\n */\ngoog.i18n.uChar.RemoteNameFetcher.prototype.prefetchLastListenerKey_;\n\n\n/**\n * Key to the listener on XHR for getName(). Used to clear previous listeners.\n *\n * @type {goog.events.Key}\n * @private\n */\ngoog.i18n.uChar.RemoteNameFetcher.prototype.getNameLastListenerKey_;\n\n\n/**\n * A reference to the RemoteNameFetcher logger.\n *\n * @type {goog.log.Logger}\n * @private\n */\ngoog.i18n.uChar.RemoteNameFetcher.logger_ =\n    goog.log.getLogger('goog.i18n.uChar.RemoteNameFetcher');\n\n\n\n\n/** @override */\ngoog.i18n.uChar.RemoteNameFetcher.prototype.disposeInternal = function() {\n  goog.i18n.uChar.RemoteNameFetcher.base(this, 'disposeInternal');\n  this.prefetchXhrIo_.dispose();\n  this.getNameXhrIo_.dispose();\n};\n\n\n/** @override */\ngoog.i18n.uChar.RemoteNameFetcher.prototype.prefetch = function(characters) {\n  // Abort the current request if there is one\n  if (this.prefetchXhrIo_.isActive()) {\n    goog.log.info(\n        goog.i18n.uChar.RemoteNameFetcher.logger_,\n        'Aborted previous prefetch() call for new incoming request');\n    this.prefetchXhrIo_.abort();\n  }\n  if (this.prefetchLastListenerKey_) {\n    goog.events.unlistenByKey(this.prefetchLastListenerKey_);\n  }\n\n  // Set up new listener\n  var preFetchCallback = goog.bind(this.prefetchCallback_, this);\n  this.prefetchLastListenerKey_ = goog.events.listenOnce(\n      this.prefetchXhrIo_, goog.net.EventType.COMPLETE, preFetchCallback);\n\n  this.fetch_(\n      goog.i18n.uChar.RemoteNameFetcher.RequestType_.BASE_88, characters,\n      this.prefetchXhrIo_);\n};\n\n\n/**\n * Callback on completion of the prefetch operation.\n *\n * @private\n */\ngoog.i18n.uChar.RemoteNameFetcher.prototype.prefetchCallback_ = function() {\n  this.processResponse_(this.prefetchXhrIo_);\n};\n\n\n/** @override */\ngoog.i18n.uChar.RemoteNameFetcher.prototype.getName = function(\n    character, callback) {\n  var codepoint = goog.i18n.uChar.toCharCode(character).toString(16);\n\n  if (this.charNames_.has(codepoint)) {\n    var name = this.charNames_.get(codepoint);\n    callback(name);\n    return;\n  }\n\n  // Abort the current request if there is one\n  if (this.getNameXhrIo_.isActive()) {\n    goog.log.info(\n        goog.i18n.uChar.RemoteNameFetcher.logger_,\n        'Aborted previous getName() call for new incoming request');\n    this.getNameXhrIo_.abort();\n  }\n  if (this.getNameLastListenerKey_) {\n    goog.events.unlistenByKey(this.getNameLastListenerKey_);\n  }\n\n  // Set up new listener\n  var getNameCallback =\n      goog.bind(this.getNameCallback_, this, codepoint, callback);\n  this.getNameLastListenerKey_ = goog.events.listenOnce(\n      this.getNameXhrIo_, goog.net.EventType.COMPLETE, getNameCallback);\n\n  this.fetch_(\n      goog.i18n.uChar.RemoteNameFetcher.RequestType_.CODEPOINT, codepoint,\n      this.getNameXhrIo_);\n};\n\n\n/**\n * Callback on completion of the getName operation.\n *\n * @param {string} codepoint The codepoint in hexadecimal format.\n * @param {function(?string)} callback The callback function called when the\n *     name retrieval is complete, contains a single string parameter with the\n *     codepoint name, this parameter will be null if the character name is not\n *     defined.\n * @private\n */\ngoog.i18n.uChar.RemoteNameFetcher.prototype.getNameCallback_ = function(\n    codepoint, callback) {\n  this.processResponse_(this.getNameXhrIo_);\n  var name =\n      this.charNames_.has(codepoint) ? this.charNames_.get(codepoint) : null;\n  callback(name);\n};\n\n\n/**\n * Process the response received from the server and store results in the cache.\n *\n * @param {!goog.net.XhrIo} xhrIo The XhrIo object used to make the request.\n * @private\n */\ngoog.i18n.uChar.RemoteNameFetcher.prototype.processResponse_ = function(xhrIo) {\n  if (!xhrIo.isSuccess()) {\n    goog.log.error(\n        goog.i18n.uChar.RemoteNameFetcher.logger_,\n        'Problem with data source: ' + xhrIo.getLastError());\n    return;\n  }\n  var result = xhrIo.getResponseJson();\n  for (var codepoint in result) {\n    if (result[codepoint].hasOwnProperty('name')) {\n      this.charNames_.set(codepoint, result[codepoint]['name']);\n    }\n  }\n};\n\n\n/**\n * Enum for the different request types.\n *\n * @enum {string}\n * @private\n */\ngoog.i18n.uChar.RemoteNameFetcher.RequestType_ = {\n\n  /**\n   * Request type that uses a base 88 string containing a set of codepoints to\n   * be fetched from the server (see goog.i18n.charpickerdata for more\n   * information on b88).\n   */\n  BASE_88: 'b88',\n\n  /**\n   * Request type that uses a a string of comma separated codepoint values.\n   */\n  CODEPOINT: 'c'\n};\n\n\n/**\n * Fetches a set of codepoint names from the data source.\n *\n * @param {!goog.i18n.uChar.RemoteNameFetcher.RequestType_} requestType The\n *     request type of the operation. This parameter specifies how the server is\n *     called to fetch a particular set of codepoints.\n * @param {string} requestInput The input to the request, this is the value that\n *     is passed onto the server to complete the request.\n * @param {!goog.net.XhrIo} xhrIo The XHRIo object to execute the server call.\n * @private\n */\ngoog.i18n.uChar.RemoteNameFetcher.prototype.fetch_ = function(\n    requestType, requestInput, xhrIo) {\n  var url = new goog.Uri(this.dataSourceUri_);\n  url.setParameterValue(requestType, requestInput);\n  url.setParameterValue('p', 'name');\n  goog.log.info(\n      goog.i18n.uChar.RemoteNameFetcher.logger_, 'Request: ' + url.toString());\n  xhrIo.send(url);\n};\n\n\n/** @override */\ngoog.i18n.uChar.RemoteNameFetcher.prototype.isNameAvailable = function(\n    character) {\n  return true;\n};\n","^;",1579837703000,"^<",["^=",["~$goog.net.XhrIo","~$goog.Uri","^?","~$goog.i18n.uChar","~$goog.log","~$goog.net.EventType","~$goog.Disposable","~$goog.i18n.uChar.NameFetcher","~$goog.events"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/uchar/remotenamefetcher.js"],"^O",["^=",["~$goog.i18n.uChar.RemoteNameFetcher"]],"^W",true,"^X",["^?","^1:","^16","^1<","^17","^1;","^18","^19","^15"]],["^ ","^3",[1579837703000],"^4","goog.editor.seamlessfield.js","^5",["^6","goog/editor/seamlessfield.js"],"^7","goog/editor/seamlessfield.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class to encapsulate an editable field that blends in with\n * the style of the page. The field can be fixed height, grow with its\n * contents, or have a min height after which it grows to its contents.\n * This is a goog.editor.Field, but with blending and sizing capabilities,\n * and avoids using an iframe whenever possible.\n *\n * @author nicksantos@google.com (Nick Santos)\n * @see ../demos/editor/seamlessfield.html\n */\n\n\ngoog.provide('goog.editor.SeamlessField');\n\ngoog.require('goog.cssom.iframe.style');\ngoog.require('goog.dom');\ngoog.require('goog.dom.Range');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.editor.BrowserFeature');\ngoog.require('goog.editor.Field');\ngoog.require('goog.editor.icontent');\ngoog.require('goog.editor.icontent.FieldFormatInfo');\ngoog.require('goog.editor.icontent.FieldStyleInfo');\ngoog.require('goog.editor.node');\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.log');\ngoog.require('goog.style');\n\n\n\n/**\n * This class encapsulates an editable field that blends in with the\n * surrounding page.\n * To see events fired by this object, please see the base class.\n *\n * @param {string} id An identifer for the field. This is used to find the\n *     field and the element associated with this field.\n * @param {Document=} opt_doc The document that the element with the given\n *     id can be found it.\n * @constructor\n * @extends {goog.editor.Field}\n */\ngoog.editor.SeamlessField = function(id, opt_doc) {\n  goog.editor.Field.call(this, id, opt_doc);\n};\ngoog.inherits(goog.editor.SeamlessField, goog.editor.Field);\n\n\n/**\n * @override\n */\ngoog.editor.SeamlessField.prototype.logger =\n    goog.log.getLogger('goog.editor.SeamlessField');\n\n// Functions dealing with field sizing.\n\n\n/**\n * The key used for listening for the \"dragover\" event.\n * @type {goog.events.Key}\n * @private\n */\ngoog.editor.SeamlessField.prototype.listenForDragOverEventKey_;\n\n\n/**\n * The key used for listening for the iframe \"load\" event.\n * @type {goog.events.Key}\n * @private\n */\ngoog.editor.SeamlessField.prototype.listenForIframeLoadEventKey_;\n\n\n/**\n * Sets the min height of this editable field's iframe. Only used in growing\n * mode when an iframe is used. This will cause an immediate field sizing to\n * update the field if necessary based on the new min height.\n * @param {number} height The min height specified as a number of pixels,\n *    e.g., 75.\n */\ngoog.editor.SeamlessField.prototype.setMinHeight = function(height) {\n  if (height == this.minHeight_) {\n    // Do nothing if the min height isn't changing.\n    return;\n  }\n  this.minHeight_ = height;\n  if (this.usesIframe()) {\n    this.doFieldSizingGecko();\n  }\n};\n\n\n/**\n * Whether the field should be rendered with a fixed height, or should expand\n * to fit its contents.\n * @type {boolean}\n * @private\n */\ngoog.editor.SeamlessField.prototype.isFixedHeight_ = false;\n\n\n/**\n * Whether the fixed-height handling has been overridden manually.\n * @type {boolean}\n * @private\n */\ngoog.editor.SeamlessField.prototype.isFixedHeightOverridden_ = false;\n\n\n/**\n * @return {boolean} Whether the field should be rendered with a fixed\n *    height, or should expand to fit its contents.\n * @override\n */\ngoog.editor.SeamlessField.prototype.isFixedHeight = function() {\n  return this.isFixedHeight_;\n};\n\n\n/**\n * @param {boolean} newVal Explicitly set whether the field should be\n *    of a fixed-height. This overrides auto-detection.\n */\ngoog.editor.SeamlessField.prototype.overrideFixedHeight = function(newVal) {\n  this.isFixedHeight_ = newVal;\n  this.isFixedHeightOverridden_ = true;\n};\n\n\n/**\n * Auto-detect whether the current field should have a fixed height.\n * @private\n */\ngoog.editor.SeamlessField.prototype.autoDetectFixedHeight_ = function() {\n  if (!this.isFixedHeightOverridden_) {\n    var originalElement = this.getOriginalElement();\n    if (originalElement) {\n      this.isFixedHeight_ =\n          goog.style.getComputedOverflowY(originalElement) == 'auto';\n    }\n  }\n};\n\n\n/**\n * Resize the iframe in response to the wrapper div changing size.\n * @private\n */\ngoog.editor.SeamlessField.prototype.handleOuterDocChange_ = function() {\n  if (this.isEventStopped(goog.editor.Field.EventType.CHANGE)) {\n    return;\n  }\n  this.sizeIframeToWrapperGecko_();\n};\n\n\n/**\n * Sizes the iframe to its body's height.\n * @private\n */\ngoog.editor.SeamlessField.prototype.sizeIframeToBodyHeightGecko_ = function() {\n  if (this.acquireSizeIframeLockGecko_()) {\n    var resized = false;\n    var ifr = this.getEditableIframe();\n    if (ifr) {\n      var fieldHeight = this.getIframeBodyHeightGecko_();\n\n      if (this.minHeight_) {\n        fieldHeight = Math.max(fieldHeight, this.minHeight_);\n      }\n      if (parseInt(goog.style.getStyle(ifr, 'height'), 10) != fieldHeight) {\n        ifr.style.height = fieldHeight + 'px';\n        resized = true;\n      }\n    }\n    this.releaseSizeIframeLockGecko_();\n    if (resized) {\n      this.dispatchEvent(goog.editor.Field.EventType.IFRAME_RESIZED);\n    }\n  }\n};\n\n\n/**\n * @return {number} The height of the editable iframe's body.\n * @private\n */\ngoog.editor.SeamlessField.prototype.getIframeBodyHeightGecko_ = function() {\n  var ifr = this.getEditableIframe();\n  var body = ifr.contentDocument.body;\n  var htmlElement = /** @type {!HTMLElement} */ (body.parentNode);\n\n\n  // If the iframe's height is 0, then the offsetHeight/scrollHeight of the\n  // HTML element in the iframe can be totally wack (i.e. too large\n  // by 50-500px). Also, in standard's mode the clientHeight is 0.\n  if (parseInt(goog.style.getStyle(ifr, 'height'), 10) === 0) {\n    goog.style.setStyle(ifr, 'height', 1 + 'px');\n  }\n\n  var fieldHeight;\n  if (goog.editor.node.isStandardsMode(body)) {\n    // If in standards-mode,\n    // grab the HTML element as it will contain all the field's\n    // contents. The body's height, for example, will not include that of\n    // floated images at the bottom in standards mode.\n    // Note that this value include all scrollbars *except* for scrollbars\n    // on the HTML element itself.\n    fieldHeight = htmlElement.offsetHeight;\n  } else {\n    // In quirks-mode, the body-element always seems\n    // to size to the containing window.  The html-element however,\n    // sizes to the content, and can thus end up with a value smaller\n    // than its child body-element if the content is shrinking.\n    // We want to make the iframe shrink too when the content shrinks,\n    // so rather than size the iframe to the body-element, size it to\n    // the html-element.\n    fieldHeight = htmlElement.scrollHeight;\n\n    // If there is a horizontal scroll, add in the thickness of the\n    // scrollbar.\n    if (htmlElement.clientHeight != htmlElement.offsetHeight) {\n      fieldHeight += goog.editor.SeamlessField.getScrollbarWidth_();\n    }\n  }\n\n  return fieldHeight;\n};\n\n\n/**\n * Grabs the width of a scrollbar from the browser and caches the result.\n * @return {number} The scrollbar width in pixels.\n * @private\n */\ngoog.editor.SeamlessField.getScrollbarWidth_ = function() {\n  return goog.editor.SeamlessField.scrollbarWidth_ ||\n      (goog.editor.SeamlessField.scrollbarWidth_ =\n           goog.style.getScrollbarWidth());\n};\n\n\n/**\n * Sizes the iframe to its container div's width. The width of the div\n * is controlled by its containing context, not by its contents.\n * if it extends outside of it's contents, then it gets a horizontal scroll.\n * @private\n */\ngoog.editor.SeamlessField.prototype.sizeIframeToWrapperGecko_ = function() {\n  if (this.acquireSizeIframeLockGecko_()) {\n    var ifr = this.getEditableIframe();\n    var field = this.getElement();\n    var resized = false;\n    if (ifr && field) {\n      var fieldPaddingBox;\n      var widthDiv = /** @type {!HTMLElement} */ (ifr.parentNode);\n\n      var width = widthDiv.offsetWidth;\n      if (parseInt(goog.style.getStyle(ifr, 'width'), 10) != width) {\n        fieldPaddingBox = goog.style.getPaddingBox(field);\n        ifr.style.width = width + 'px';\n        field.style.width =\n            width - fieldPaddingBox.left - fieldPaddingBox.right + 'px';\n        resized = true;\n      }\n\n      var height = widthDiv.offsetHeight;\n      if (this.isFixedHeight() &&\n          parseInt(goog.style.getStyle(ifr, 'height'), 10) != height) {\n        if (!fieldPaddingBox) {\n          fieldPaddingBox = goog.style.getPaddingBox(field);\n        }\n        ifr.style.height = height + 'px';\n        field.style.height =\n            height - fieldPaddingBox.top - fieldPaddingBox.bottom + 'px';\n        resized = true;\n      }\n    }\n    this.releaseSizeIframeLockGecko_();\n    if (resized) {\n      this.dispatchEvent(goog.editor.Field.EventType.IFRAME_RESIZED);\n    }\n  }\n};\n\n\n/**\n * Perform all the sizing immediately.\n */\ngoog.editor.SeamlessField.prototype.doFieldSizingGecko = function() {\n  // Because doFieldSizingGecko can be called after a setTimeout\n  // it is possible that the field has been destroyed before this call\n  // to do the sizing is executed. Check for field existence and do nothing\n  // if it has already been destroyed.\n  if (this.getElement()) {\n    // The order of operations is important here.  Sizing the iframe to the\n    // wrapper could cause the width to change, which could change the line\n    // wrapping, which could change the body height.  So we need to do that\n    // first, then size the iframe to fit the body height.\n    this.sizeIframeToWrapperGecko_();\n    if (!this.isFixedHeight()) {\n      this.sizeIframeToBodyHeightGecko_();\n    }\n  }\n};\n\n\n/**\n * Acquires a lock on resizing the field iframe. This is used to ensure that\n * modifications we make while in a mutation event handler don't cause\n * infinite loops.\n * @return {boolean} False if the lock is already acquired.\n * @private\n */\ngoog.editor.SeamlessField.prototype.acquireSizeIframeLockGecko_ = function() {\n  if (this.sizeIframeLock_) {\n    return false;\n  }\n  return this.sizeIframeLock_ = true;\n};\n\n\n/**\n * Releases a lock on resizing the field iframe. This is used to ensure that\n * modifications we make while in a mutation event handler don't cause\n * infinite loops.\n * @private\n */\ngoog.editor.SeamlessField.prototype.releaseSizeIframeLockGecko_ = function() {\n  this.sizeIframeLock_ = false;\n};\n\n\n// Functions dealing with blending in with the surrounding page.\n\n\n/**\n * String containing the css rules that, if applied to a document's body,\n * would style that body as if it were the original element we made editable.\n * See goog.cssom.iframe.style.getElementContext for more details.\n * @type {string}\n * @private\n */\ngoog.editor.SeamlessField.prototype.iframeableCss_ = '';\n\n\n/**\n * Gets the css rules that should be used to style an iframe's body as if it\n * were the original element that we made editable.\n * @param {boolean=} opt_forceRegeneration Set to true to not read the cached\n * copy and instead completely regenerate the css rules.\n * @return {string} The string containing the css rules to use.\n */\ngoog.editor.SeamlessField.prototype.getIframeableCss = function(\n    opt_forceRegeneration) {\n  if (!this.iframeableCss_ || opt_forceRegeneration) {\n    var originalElement = this.getOriginalElement();\n    if (originalElement) {\n      this.iframeableCss_ = goog.cssom.iframe.style.getElementContext(\n          originalElement, opt_forceRegeneration);\n    }\n  }\n  return this.iframeableCss_;\n};\n\n\n/**\n * Sets the css rules that should be used inside the editable iframe.\n * Note: to clear the css cache between makeNotEditable/makeEditable,\n * call this with \"\" as iframeableCss.\n * TODO(user): Unify all these css setting methods + Nick's open\n * CL.  This is getting ridiculous.\n * @param {string} iframeableCss String containing the css rules to use.\n */\ngoog.editor.SeamlessField.prototype.setIframeableCss = function(iframeableCss) {\n  this.iframeableCss_ = iframeableCss;\n};\n\n\n/**\n * Used to ensure that CSS stylings are only installed once for none\n * iframe seamless mode.\n * TODO(user): Make it a formal part of the API that you can only\n * set one set of styles globally.\n * In seamless, non-iframe mode, all the stylings would go in the\n * same document and conflict.\n * @type {boolean}\n * @private\n */\ngoog.editor.SeamlessField.haveInstalledCss_ = false;\n\n\n// Overridden methods.\n\n\n/** @override */\ngoog.editor.SeamlessField.prototype.usesIframe = function() {\n  // TODO(user): Switch Firefox to using contentEditable\n  // rather than designMode iframe once contentEditable support\n  // is less buggy.\n  return !goog.editor.BrowserFeature.HAS_CONTENT_EDITABLE;\n};\n\n\n/** @override */\ngoog.editor.SeamlessField.prototype.setupMutationEventHandlersGecko =\n    function() {\n  goog.editor.SeamlessField.superClass_.setupMutationEventHandlersGecko.call(\n      this);\n\n  if (this.usesIframe()) {\n    var iframe = this.getEditableIframe();\n    var outerDoc = iframe.ownerDocument;\n    this.eventRegister.listen(\n        outerDoc, goog.editor.Field.MUTATION_EVENTS_GECKO,\n        this.handleOuterDocChange_, true);\n\n    // If the images load after we do the initial sizing, then this will\n    // force a field resize.\n    this.listenForIframeLoadEventKey_ = goog.events.listenOnce(\n        this.getEditableDomHelper().getWindow(), goog.events.EventType.LOAD,\n        this.sizeIframeToBodyHeightGecko_, true, this);\n\n    this.eventRegister.listen(\n        outerDoc, 'DOMAttrModified',\n        goog.bind(this.handleDomAttrChange, this, this.handleOuterDocChange_),\n        true);\n  }\n};\n\n\n/** @override */\ngoog.editor.SeamlessField.prototype.handleChange = function() {\n  if (this.isEventStopped(goog.editor.Field.EventType.CHANGE)) {\n    return;\n  }\n\n  goog.editor.SeamlessField.superClass_.handleChange.call(this);\n\n  if (this.usesIframe()) {\n    this.sizeIframeToBodyHeightGecko_();\n  }\n};\n\n\n/** @override */\ngoog.editor.SeamlessField.prototype.dispatchBlur = function() {\n  if (this.isEventStopped(goog.editor.Field.EventType.BLUR)) {\n    return;\n  }\n\n  goog.editor.SeamlessField.superClass_.dispatchBlur.call(this);\n\n  // Clear the selection and restore the current range back after collapsing\n  // it. The ideal solution would have been to just leave the range intact; but\n  // when there are multiple fields present on the page, its important that\n  // the selection isn't retained when we switch between the fields. We also\n  // have to make sure that the cursor position is retained when we tab in and\n  // out of a field and our approach addresses both these issues.\n  // Another point to note is that we do it on a setTimeout to allow for\n  // DOM modifications on blur. Otherwise, something like setLoremIpsum will\n  // leave a blinking cursor in the field even though it's blurred.\n  if (!goog.editor.BrowserFeature.HAS_CONTENT_EDITABLE &&\n      !goog.editor.BrowserFeature.CLEARS_SELECTION_WHEN_FOCUS_LEAVES) {\n    var win = this.getEditableDomHelper().getWindow();\n    var dragging = false;\n    goog.events.unlistenByKey(this.listenForDragOverEventKey_);\n    this.listenForDragOverEventKey_ = goog.events.listenOnce(\n        win.document.body, 'dragover', function() { dragging = true; });\n    goog.global.setTimeout(goog.bind(function() {\n      // Do not clear the selection if we're only dragging text.\n      // This addresses a bug on FF1.5/linux where dragging fires a blur,\n      // but clearing the selection confuses Firefox's drag-and-drop\n      // implementation. For more info, see http://b/1061064\n      if (!dragging) {\n        if (this.editableDomHelper) {\n          var rng = this.getRange();\n\n          // If there are multiple fields on a page, we need to make sure that\n          // the selection isn't retained when we switch between fields. We\n          // could have collapsed the range but there is a bug in GECKO where\n          // the selection stays highlighted even though its backing range is\n          // collapsed (http://b/1390115). To get around this, we clear the\n          // selection and restore the collapsed range back in. Restoring the\n          // range is important so that the cursor stays intact when we tab out\n          // and into a field (See http://b/1790301 for additional details on\n          // this).\n          var iframeWindow = this.editableDomHelper.getWindow();\n          goog.dom.Range.clearSelection(iframeWindow);\n\n          if (rng) {\n            rng.collapse(true);\n            rng.select();\n          }\n        }\n      }\n    }, this), 0);\n  }\n};\n\n\n/** @override */\ngoog.editor.SeamlessField.prototype.turnOnDesignModeGecko = function() {\n  goog.editor.SeamlessField.superClass_.turnOnDesignModeGecko.call(this);\n  var doc = this.getEditableDomHelper().getDocument();\n\n  doc.execCommand('enableInlineTableEditing', false, 'false');\n  doc.execCommand('enableObjectResizing', false, 'false');\n};\n\n\n/** @override */\ngoog.editor.SeamlessField.prototype.installStyles = function() {\n  if (!this.usesIframe()) {\n    if (!goog.editor.SeamlessField.haveInstalledCss_) {\n      if (this.cssStyles.getTypedStringValue()) {\n        goog.style.installSafeStyleSheet(this.cssStyles, this.getElement());\n      }\n\n      // TODO(user): this should be reset to false when the editor is quit.\n      // In non-iframe mode, CSS styles should only be instaled once.\n      goog.editor.SeamlessField.haveInstalledCss_ = true;\n    }\n  }\n};\n\n\n/** @override */\ngoog.editor.SeamlessField.prototype.makeEditableInternal = function(\n    opt_iframeSrc) {\n  if (this.usesIframe()) {\n    goog.editor.SeamlessField.superClass_.makeEditableInternal.call(\n        this, opt_iframeSrc);\n  } else {\n    var field = this.getOriginalElement();\n    if (field) {\n      this.setupFieldObject(field);\n      field.contentEditable = true;\n\n      this.injectContents(field.innerHTML, field);\n\n      this.handleFieldLoad();\n    }\n  }\n};\n\n\n/** @override */\ngoog.editor.SeamlessField.prototype.handleFieldLoad = function() {\n  if (this.usesIframe()) {\n    // If the CSS inheriting code screws up (e.g. makes fonts too large) and\n    // the field is sized off in goog.editor.Field.makeIframeField, then we need\n    // to size it correctly, but it needs to be visible for the browser\n    // to have fully rendered it. We need to put this on a timeout to give\n    // the browser time to render.\n    var self = this;\n    goog.global.setTimeout(function() { self.doFieldSizingGecko(); }, 0);\n  }\n  goog.editor.SeamlessField.superClass_.handleFieldLoad.call(this);\n};\n\n\n/** @override */\ngoog.editor.SeamlessField.prototype.getIframeAttributes = function() {\n  return {'frameBorder': 0, 'style': 'padding:0;'};\n};\n\n\n/** @override */\ngoog.editor.SeamlessField.prototype.attachIframe = function(iframe) {\n  this.autoDetectFixedHeight_();\n  var field = this.getOriginalElement();\n  var dh = goog.dom.getDomHelper(field);\n\n  // Grab the width/height values of the field before modifying any CSS\n  // as some of the modifications affect its size (e.g. innerHTML='')\n  // Here, we set the size of the field to fixed so there's not too much\n  // jiggling when we set the innerHTML of the field.\n  var oldWidth = field.style.width;\n  var oldHeight = field.style.height;\n  goog.style.setStyle(field, 'visibility', 'hidden');\n\n  // If there is a floated element at the bottom of the field,\n  // then it needs a clearing div at the end to cause the clientHeight\n  // to contain the entire field.\n  // Also, with css re-writing, the margins of the first/last\n  // paragraph don't seem to get included in the clientHeight. Specifically,\n  // the extra divs below force the field's clientHeight to include the\n  // margins on the first and last elements contained within it.\n  var startDiv = dh.createDom(\n      goog.dom.TagName.DIV,\n      {'style': 'height:0;clear:both', 'innerHTML': '&nbsp;'});\n  var endDiv = startDiv.cloneNode(true);\n  field.insertBefore(startDiv, field.firstChild);\n  goog.dom.appendChild(field, endDiv);\n\n  var contentBox = goog.style.getContentBoxSize(field);\n  var width = contentBox.width;\n  var height = contentBox.height;\n\n  var html = '';\n  if (this.isFixedHeight()) {\n    html = '&nbsp;';\n\n    goog.style.setStyle(field, 'position', 'relative');\n    goog.style.setStyle(field, 'overflow', 'visible');\n\n    goog.style.setStyle(iframe, 'position', 'absolute');\n    goog.style.setStyle(iframe, 'top', '0');\n    goog.style.setStyle(iframe, 'left', '0');\n  }\n  goog.style.setSize(field, width, height);\n\n  // In strict mode, browsers put blank space at the bottom and right\n  // if a field when it has an iframe child, to fill up the remaining line\n  // height. So make the line height = 0.\n  if (goog.editor.node.isStandardsMode(field)) {\n    this.originalFieldLineHeight_ = field.style.lineHeight;\n    goog.style.setStyle(field, 'lineHeight', '0');\n  }\n\n  goog.editor.node.replaceInnerHtml(field, html);\n  // Set the initial size\n  goog.style.setSize(iframe, width, height);\n  goog.style.setSize(field, oldWidth, oldHeight);\n  goog.style.setStyle(field, 'visibility', '');\n  goog.dom.appendChild(field, iframe);\n\n  // Only write if its not IE HTTPS in which case we're waiting for load.\n  if (!this.shouldLoadAsynchronously()) {\n    var doc = iframe.contentWindow.document;\n    if (goog.editor.node.isStandardsMode(iframe.ownerDocument)) {\n      doc.open();\n      var emptyHtml = goog.html.SafeHtml.concat(\n          goog.html.SafeHtml.DOCTYPE_HTML, goog.html.SafeHtml.create('html'));\n      goog.dom.safe.documentWrite(doc, emptyHtml);\n      doc.close();\n    }\n  }\n};\n\n\n/** @override */\ngoog.editor.SeamlessField.prototype.getFieldFormatInfo = function(extraStyles) {\n  var originalElement = this.getOriginalElement();\n  if (originalElement) {\n    return new goog.editor.icontent.FieldFormatInfo(\n        this.id, goog.editor.node.isStandardsMode(originalElement), true,\n        this.isFixedHeight(), extraStyles);\n  }\n  throw new Error('no field');\n};\n\n\n/** @override */\ngoog.editor.SeamlessField.prototype.writeIframeContent = function(\n    iframe, innerHtml, extraStyles) {\n  // For seamless iframes, hide the iframe while we're laying it out to\n  // prevent the flicker.\n  goog.style.setStyle(iframe, 'visibility', 'hidden');\n  var formatInfo = this.getFieldFormatInfo(extraStyles);\n  var styleInfo = new goog.editor.icontent.FieldStyleInfo(\n      this.getOriginalElement(),\n      this.cssStyles.getTypedStringValue() + this.getIframeableCss());\n  goog.editor.icontent.writeNormalInitialBlendedIframe(\n      formatInfo, innerHtml, styleInfo, iframe);\n  this.doFieldSizingGecko();\n  goog.style.setStyle(iframe, 'visibility', 'visible');\n};\n\n\n/** @override */\ngoog.editor.SeamlessField.prototype.restoreDom = function() {\n  // TODO(user): Consider only removing the iframe if we are\n  // restoring the original node.\n  if (this.usesIframe()) {\n    goog.dom.removeNode(this.getEditableIframe());\n  }\n};\n\n\n/** @override */\ngoog.editor.SeamlessField.prototype.clearListeners = function() {\n  goog.events.unlistenByKey(this.listenForDragOverEventKey_);\n  goog.events.unlistenByKey(this.listenForIframeLoadEventKey_);\n\n  goog.editor.SeamlessField.base(this, 'clearListeners');\n};\n","^;",1579837703000,"^<",["^=",["~$goog.dom","~$goog.editor.icontent.FieldFormatInfo","~$goog.editor.BrowserFeature","^?","~$goog.editor.Field","^18","~$goog.editor.icontent.FieldStyleInfo","~$goog.events.EventType","~$goog.cssom.iframe.style","~$goog.dom.safe","~$goog.style","~$goog.editor.node","~$goog.dom.Range","^1<","~$goog.html.SafeHtml","^12","~$goog.editor.icontent"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/seamlessfield.js"],"^O",["^=",["~$goog.editor.SeamlessField"]],"^W",true,"^X",["^?","^1D","^1>","^1H","^12","^1E","^1@","^1A","^1J","^1?","^1B","^1G","^1<","^1C","^1I","^18","^1F"]],["^ ","^3",[1579837703000],"^4","goog.ui.progressbar.js","^5",["^6","goog/ui/progressbar.js"],"^7","goog/ui/progressbar.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implementation of a progress bar.\n *\n * @author arv@google.com (Erik Arvidsson)\n * @see ../demos/progressbar.html\n */\n\n\ngoog.provide('goog.ui.ProgressBar');\ngoog.provide('goog.ui.ProgressBar.Orientation');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.RangeModel');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * This creates a progress bar object.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.Component}\n */\ngoog.ui.ProgressBar = function(opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /** @type {?HTMLDivElement} */\n  this.thumbElement_;\n\n  /**\n   * The underlying data model for the progress bar.\n   * @type {goog.ui.RangeModel}\n   * @private\n   */\n  this.rangeModel_ = new goog.ui.RangeModel;\n  goog.events.listen(\n      this.rangeModel_, goog.ui.Component.EventType.CHANGE, this.handleChange_,\n      false, this);\n};\ngoog.inherits(goog.ui.ProgressBar, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.ProgressBar);\n\n\n/**\n * Enum for representing the orientation of the progress bar.\n *\n * @enum {string}\n */\ngoog.ui.ProgressBar.Orientation = {\n  VERTICAL: 'vertical',\n  HORIZONTAL: 'horizontal'\n};\n\n\n/**\n * Map from progress bar orientation to CSS class names.\n * @type {!Object<string, string>}\n * @private\n */\ngoog.ui.ProgressBar.ORIENTATION_TO_CSS_NAME_ = {};\ngoog.ui.ProgressBar\n    .ORIENTATION_TO_CSS_NAME_[goog.ui.ProgressBar.Orientation.VERTICAL] =\n    goog.getCssName('progress-bar-vertical');\ngoog.ui.ProgressBar\n    .ORIENTATION_TO_CSS_NAME_[goog.ui.ProgressBar.Orientation.HORIZONTAL] =\n    goog.getCssName('progress-bar-horizontal');\n\n\n/**\n * Creates the DOM nodes needed for the progress bar\n * @override\n */\ngoog.ui.ProgressBar.prototype.createDom = function() {\n  this.thumbElement_ = this.createThumb_();\n  this.setElementInternal(this.getDomHelper().createDom(\n      goog.dom.TagName.DIV,\n      goog.ui.ProgressBar.ORIENTATION_TO_CSS_NAME_[this.orientation_],\n      this.thumbElement_));\n  this.setValueState_();\n  this.setMinimumState_();\n  this.setMaximumState_();\n};\n\n\n/** @override */\ngoog.ui.ProgressBar.prototype.enterDocument = function() {\n  goog.ui.ProgressBar.superClass_.enterDocument.call(this);\n  this.attachEvents_();\n  this.updateUi_();\n\n  var element = this.getElement();\n  goog.asserts.assert(element, 'The progress bar DOM element cannot be null.');\n  // state live = polite will notify the user of updates,\n  // but will not interrupt ongoing feedback\n  goog.a11y.aria.setRole(element, 'progressbar');\n  goog.a11y.aria.setState(element, 'live', 'polite');\n};\n\n\n/** @override */\ngoog.ui.ProgressBar.prototype.exitDocument = function() {\n  goog.ui.ProgressBar.superClass_.exitDocument.call(this);\n  this.detachEvents_();\n};\n\n\n/**\n * This creates the thumb element.\n * @private\n * @return {HTMLDivElement} The created thumb element.\n */\ngoog.ui.ProgressBar.prototype.createThumb_ = function() {\n  return this.getDomHelper().createDom(\n      goog.dom.TagName.DIV, goog.getCssName('progress-bar-thumb'));\n};\n\n\n/**\n * Adds the initial event listeners to the element.\n * @private\n * @suppress {strictPrimitiveOperators} Part of the go/strict_warnings_migration\n */\ngoog.ui.ProgressBar.prototype.attachEvents_ = function() {\n  if (goog.userAgent.IE && goog.userAgent.VERSION < 7) {\n    goog.events.listen(\n        this.getElement(), goog.events.EventType.RESIZE, this.updateUi_, false,\n        this);\n  }\n};\n\n\n/**\n * Removes the event listeners added by attachEvents_.\n * @private\n * @suppress {strictPrimitiveOperators} Part of the go/strict_warnings_migration\n */\ngoog.ui.ProgressBar.prototype.detachEvents_ = function() {\n  if (goog.userAgent.IE && goog.userAgent.VERSION < 7) {\n    goog.events.unlisten(\n        this.getElement(), goog.events.EventType.RESIZE, this.updateUi_, false,\n        this);\n  }\n};\n\n\n/**\n * Decorates an existing HTML DIV element as a progress bar input. If the\n * element contains a child with a class name of 'progress-bar-thumb' that will\n * be used as the thumb.\n * @param {Element} element  The HTML element to decorate.\n * @override\n */\ngoog.ui.ProgressBar.prototype.decorateInternal = function(element) {\n  goog.ui.ProgressBar.superClass_.decorateInternal.call(this, element);\n  goog.dom.classlist.add(\n      goog.asserts.assert(this.getElement()),\n      goog.ui.ProgressBar.ORIENTATION_TO_CSS_NAME_[this.orientation_]);\n\n  // find thumb\n  var thumb = goog.dom.getElementsByTagNameAndClass(\n      null, goog.getCssName('progress-bar-thumb'), this.getElement())[0];\n  if (!thumb) {\n    thumb = this.createThumb_();\n    this.getElement().appendChild(thumb);\n  }\n  this.thumbElement_ = /** @type {!HTMLDivElement} */ (thumb);\n};\n\n\n/**\n * @return {number} The value.\n */\ngoog.ui.ProgressBar.prototype.getValue = function() {\n  return this.rangeModel_.getValue();\n};\n\n\n/**\n * Sets the value\n * @param {number} v The value.\n */\ngoog.ui.ProgressBar.prototype.setValue = function(v) {\n  this.rangeModel_.setValue(v);\n  if (this.getElement()) {\n    this.setValueState_();\n  }\n};\n\n\n/**\n * Sets the state for a11y of the current value.\n * @private\n */\ngoog.ui.ProgressBar.prototype.setValueState_ = function() {\n  var element = this.getElement();\n  goog.asserts.assert(element, 'The progress bar DOM element cannot be null.');\n  goog.a11y.aria.setState(element, 'valuenow', this.getValue());\n};\n\n\n/**\n * @return {number} The minimum value.\n */\ngoog.ui.ProgressBar.prototype.getMinimum = function() {\n  return this.rangeModel_.getMinimum();\n};\n\n\n/**\n * Sets the minimum number\n * @param {number} v The minimum value.\n */\ngoog.ui.ProgressBar.prototype.setMinimum = function(v) {\n  this.rangeModel_.setMinimum(v);\n  if (this.getElement()) {\n    this.setMinimumState_();\n  }\n};\n\n\n/**\n * Sets the state for a11y of the minimum value.\n * @private\n */\ngoog.ui.ProgressBar.prototype.setMinimumState_ = function() {\n  var element = this.getElement();\n  goog.asserts.assert(element, 'The progress bar DOM element cannot be null.');\n  goog.a11y.aria.setState(element, 'valuemin', this.getMinimum());\n};\n\n\n/**\n * @return {number} The maximum value.\n */\ngoog.ui.ProgressBar.prototype.getMaximum = function() {\n  return this.rangeModel_.getMaximum();\n};\n\n\n/**\n * Sets the maximum number\n * @param {number} v The maximum value.\n */\ngoog.ui.ProgressBar.prototype.setMaximum = function(v) {\n  this.rangeModel_.setMaximum(v);\n  if (this.getElement()) {\n    this.setMaximumState_();\n  }\n};\n\n\n/**\n * Sets the state for a11y of the maximum valiue.\n * @private\n */\ngoog.ui.ProgressBar.prototype.setMaximumState_ = function() {\n  var element = this.getElement();\n  goog.asserts.assert(element, 'The progress bar DOM element cannot be null.');\n  goog.a11y.aria.setState(element, 'valuemax', this.getMaximum());\n};\n\n\n/**\n *\n * @type {goog.ui.ProgressBar.Orientation}\n * @private\n */\ngoog.ui.ProgressBar.prototype.orientation_ =\n    goog.ui.ProgressBar.Orientation.HORIZONTAL;\n\n\n/**\n * Call back when the internal range model changes\n * @param {goog.events.Event} e The event object.\n * @private\n */\ngoog.ui.ProgressBar.prototype.handleChange_ = function(e) {\n  this.updateUi_();\n  this.dispatchEvent(goog.ui.Component.EventType.CHANGE);\n};\n\n\n/**\n * This is called when we need to update the size of the thumb. This happens\n * when first created as well as when the value and the orientation changes.\n * @private\n * @suppress {strictPrimitiveOperators} Part of the go/strict_warnings_migration\n */\ngoog.ui.ProgressBar.prototype.updateUi_ = function() {\n  if (this.thumbElement_) {\n    var min = this.getMinimum();\n    var max = this.getMaximum();\n    var val = this.getValue();\n    var ratio = (val - min) / (max - min);\n    var size = Math.round(ratio * 100);\n    if (this.orientation_ == goog.ui.ProgressBar.Orientation.VERTICAL) {\n      // Note(arv): IE up to version 6 has some serious computation bugs when\n      // using percentages or bottom. We therefore first set the height to\n      // 100% and measure that and base the top and height on that size instead.\n      if (goog.userAgent.IE && goog.userAgent.VERSION < 7) {\n        this.thumbElement_.style.top = '0';\n        this.thumbElement_.style.height = '100%';\n        var h = this.thumbElement_.offsetHeight;\n        var bottom = Math.round(ratio * h);\n        this.thumbElement_.style.top = h - bottom + 'px';\n        this.thumbElement_.style.height = bottom + 'px';\n      } else {\n        this.thumbElement_.style.top = (100 - size) + '%';\n        this.thumbElement_.style.height = size + '%';\n      }\n    } else {\n      this.thumbElement_.style.width = size + '%';\n    }\n  }\n};\n\n\n/**\n * This is called when we need to setup the UI sizes and positions. This\n * happens when we create the element and when we change the orientation.\n * @private\n */\ngoog.ui.ProgressBar.prototype.initializeUi_ = function() {\n  var tStyle = this.thumbElement_.style;\n  if (this.orientation_ == goog.ui.ProgressBar.Orientation.VERTICAL) {\n    tStyle.left = '0';\n    tStyle.width = '100%';\n  } else {\n    tStyle.top = tStyle.left = '0';\n    tStyle.height = '100%';\n  }\n};\n\n\n/**\n * Changes the orientation\n * @param {goog.ui.ProgressBar.Orientation} orient The orientation.\n */\ngoog.ui.ProgressBar.prototype.setOrientation = function(orient) {\n  if (this.orientation_ != orient) {\n    var oldCss =\n        goog.ui.ProgressBar.ORIENTATION_TO_CSS_NAME_[this.orientation_];\n    var newCss = goog.ui.ProgressBar.ORIENTATION_TO_CSS_NAME_[orient];\n    this.orientation_ = orient;\n\n    // Update the DOM\n    var element = this.getElement();\n    if (element) {\n      goog.dom.classlist.swap(element, oldCss, newCss);\n      this.initializeUi_();\n      this.updateUi_();\n    }\n  }\n};\n\n\n/**\n * @return {goog.ui.ProgressBar.Orientation} The orientation of the\n *     progress bar.\n */\ngoog.ui.ProgressBar.prototype.getOrientation = function() {\n  return this.orientation_;\n};\n\n\n/** @override */\ngoog.ui.ProgressBar.prototype.disposeInternal = function() {\n  this.detachEvents_();\n  goog.ui.ProgressBar.superClass_.disposeInternal.call(this);\n  this.thumbElement_ = null;\n  this.rangeModel_.dispose();\n};\n\n\n/**\n * @return {?number} The step value used to determine how to round the value.\n */\ngoog.ui.ProgressBar.prototype.getStep = function() {\n  return this.rangeModel_.getStep();\n};\n\n\n/**\n * Sets the step value. The step value is used to determine how to round the\n * value.\n * @param {?number} step  The step size.\n */\ngoog.ui.ProgressBar.prototype.setStep = function(step) {\n  this.rangeModel_.setStep(step);\n};\n","^;",1579837703000,"^<",["^=",["~$goog.asserts","^1>","~$goog.dom.classlist","~$goog.ui.RangeModel","~$goog.a11y.aria","~$goog.ui.Component","^?","^[","^1C","^1<","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/progressbar.js"],"^O",["^=",["~$goog.ui.ProgressBar.Orientation","~$goog.ui.ProgressBar"]],"^W",true,"^X",["^?","^1O","^1L","^1>","^12","^1M","^1<","^1C","^1P","^1N","^["]],["^ ","^3",[1579837703000],"^4","goog.dom.animationframe.polyfill.js","^5",["^6","goog/dom/animationframe/polyfill.js"],"^7","goog/dom/animationframe/polyfill.js","^8","^9","^:","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A polyfill for window.requestAnimationFrame and\n * window.cancelAnimationFrame.\n * Code based on https://gist.github.com/paulirish/1579671\n */\n\ngoog.provide('goog.dom.animationFrame.polyfill');\n\n\n/**\n * @define {boolean} If true, will install the requestAnimationFrame polyfill.\n */\ngoog.dom.animationFrame.polyfill.ENABLED =\n    goog.define('goog.dom.animationFrame.polyfill.ENABLED', true);\n\n\n/**\n * Installs the requestAnimationFrame (and cancelAnimationFrame) polyfill.\n */\ngoog.dom.animationFrame.polyfill.install = function() {\n  if (goog.dom.animationFrame.polyfill.ENABLED) {\n    const vendors = ['ms', 'moz', 'webkit', 'o'];\n    let v;\n    for (let i = 0; v = vendors[i] && !goog.global.requestAnimationFrame; ++i) {\n      goog.global.requestAnimationFrame =\n          goog.global[v + 'RequestAnimationFrame'];\n      goog.global.cancelAnimationFrame =\n          goog.global[v + 'CancelAnimationFrame'] ||\n          goog.global[v + 'CancelRequestAnimationFrame'];\n    }\n\n    if (!goog.global.requestAnimationFrame) {\n      let lastTime = 0;\n      goog.global.requestAnimationFrame = function(callback) {\n        const currTime = new Date().getTime();\n        const timeToCall = Math.max(0, 16 - (currTime - lastTime));\n        lastTime = currTime + timeToCall;\n        return goog.global.setTimeout(function() {\n          callback(currTime + timeToCall);\n        }, timeToCall);\n      };\n\n      if (!goog.global.cancelAnimationFrame) {\n        goog.global.cancelAnimationFrame = function(id) { clearTimeout(id); };\n      }\n    }\n  }\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/animationframe/polyfill.js"],"^O",["^=",["~$goog.dom.animationFrame.polyfill"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.ui.editor.tabpane.js","^5",["^6","goog/ui/editor/tabpane.js"],"^7","goog/ui/editor/tabpane.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Tabbed pane with style and functionality specific to\n * Editor dialogs.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.ui.editor.TabPane');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Control');\ngoog.require('goog.ui.Tab');\ngoog.require('goog.ui.TabBar');\n\n\n\n/**\n * Creates a new Editor-style tab pane.\n * @param {goog.dom.DomHelper} dom The dom helper for the window to create this\n *     tab pane in.\n * @param {string=} opt_caption Optional caption of the tab pane.\n * @constructor\n * @extends {goog.ui.Component}\n * @final\n */\ngoog.ui.editor.TabPane = function(dom, opt_caption) {\n  goog.ui.editor.TabPane.base(this, 'constructor', dom);\n\n  /**\n   * The event handler used to register events.\n   * @type {goog.events.EventHandler<!goog.ui.editor.TabPane>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n  this.registerDisposable(this.eventHandler_);\n\n  /**\n   * The tab bar used to render the tabs.\n   * @type {goog.ui.TabBar}\n   * @private\n   */\n  this.tabBar_ =\n      new goog.ui.TabBar(goog.ui.TabBar.Location.START, undefined, this.dom_);\n  this.tabBar_.setFocusable(false);\n\n  /**\n   * The content element.\n   * @private\n   */\n  this.tabContent_ = this.dom_.createDom(\n      goog.dom.TagName.DIV, {className: goog.getCssName('goog-tab-content')});\n\n  /**\n   * The currently selected radio button.\n   * @type {?Element}\n   * @private\n   */\n  this.selectedRadio_ = null;\n\n  /**\n   * The currently visible tab content.\n   * @type {?Element}\n   * @private\n   */\n  this.visibleContent_ = null;\n\n\n  // Add the caption as the first element in the tab bar.\n  if (opt_caption) {\n    var captionControl = new goog.ui.Control(opt_caption, undefined, this.dom_);\n    captionControl.addClassName(goog.getCssName('tr-tabpane-caption'));\n    captionControl.setEnabled(false);\n    this.tabBar_.addChild(captionControl, true);\n  }\n};\ngoog.inherits(goog.ui.editor.TabPane, goog.ui.Component);\n\n\n/**\n * @return {string} The ID of the content element for the current tab.\n */\ngoog.ui.editor.TabPane.prototype.getCurrentTabId = function() {\n  return this.tabBar_.getSelectedTab().getId();\n};\n\n\n/**\n * Selects the tab with the given id.\n * @param {string} id Id of the tab to select.\n */\ngoog.ui.editor.TabPane.prototype.setSelectedTabId = function(id) {\n  this.tabBar_.setSelectedTab(this.tabBar_.getChild(id));\n};\n\n\n/**\n * Adds a tab to the tab pane.\n * @param {string} id The id of the tab to add.\n * @param {string} caption The caption of the tab.\n * @param {string} tooltip The tooltip for the tab.\n * @param {string} groupName for the radio button group.\n * @param {Element} content The content element to show when this tab is\n *     selected.\n */\ngoog.ui.editor.TabPane.prototype.addTab = function(\n    id, caption, tooltip, groupName, content) {\n  var radio = this.dom_.createDom(\n      goog.dom.TagName.INPUT,\n      {name: groupName, type: goog.dom.InputType.RADIO});\n\n  var tab = new goog.ui.Tab(\n      [radio, this.dom_.createTextNode(caption)], undefined, this.dom_);\n  tab.setId(id);\n  tab.setTooltip(tooltip);\n  this.tabBar_.addChild(tab, true);\n\n  // When you navigate the radio buttons with TAB and then the Arrow keys on\n  // Chrome and FF, you get a CLICK event on them, and the radio button\n  // is selected.  You don't get a SELECT at all.  We listen for SELECT\n  // nonetheless because it's possible that some browser will issue only\n  // SELECT.\n  this.eventHandler_.listen(\n      radio, [goog.events.EventType.SELECT, goog.events.EventType.CLICK],\n      goog.bind(this.tabBar_.setSelectedTab, this.tabBar_, tab));\n\n  content.id = id + '-tab';\n  this.tabContent_.appendChild(content);\n  goog.style.setElementShown(content, false);\n};\n\n\n/** @override */\ngoog.ui.editor.TabPane.prototype.enterDocument = function() {\n  goog.ui.editor.TabPane.base(this, 'enterDocument');\n\n  // Get the root element and add a class name to it.\n  var root = this.getElement();\n  goog.asserts.assert(root);\n  goog.dom.classlist.add(root, goog.getCssName('tr-tabpane'));\n\n  // Add the tabs.\n  this.addChild(this.tabBar_, true);\n  this.eventHandler_.listen(\n      this.tabBar_, goog.ui.Component.EventType.SELECT, this.handleTabSelect_);\n\n  // Add the tab content.\n  root.appendChild(this.tabContent_);\n\n  // Add an element to clear the tab float.\n  root.appendChild(this.dom_.createDom(goog.dom.TagName.DIV, {\n    className: goog.getCssName('goog-tab-bar-clear')\n  }));\n};\n\n\n/**\n * Handles a tab change.\n * @param {goog.events.Event} e The browser change event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.editor.TabPane.prototype.handleTabSelect_ = function(e) {\n  var tab = /** @type {goog.ui.Tab} */ (e.target);\n\n  // Show the tab content.\n  if (this.visibleContent_) {\n    goog.style.setElementShown(this.visibleContent_, false);\n  }\n  this.visibleContent_ = this.dom_.getElement(tab.getId() + '-tab');\n  goog.style.setElementShown(this.visibleContent_, true);\n\n  // Select the appropriate radio button (and deselect the current one).\n  if (this.selectedRadio_) {\n    this.selectedRadio_.checked = false;\n  }\n  this.selectedRadio_ = goog.dom.getElementsByTagName(\n      goog.dom.TagName.INPUT, tab.getElementStrict())[0];\n  this.selectedRadio_.checked = true;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^1>","~$goog.events.EventHandler","^1M","^1P","~$goog.dom.InputType","^?","~$goog.ui.TabBar","^1C","~$goog.ui.Control","^1F","~$goog.ui.Tab","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/editor/tabpane.js"],"^O",["^=",["~$goog.ui.editor.TabPane"]],"^W",true,"^X",["^?","^1L","^1>","^1U","^12","^1M","^1T","^1C","^1F","^1P","^1W","^1X","^1V"]],["^ ","^3",[1579837703000],"^4","goog.events.keynames.js","^5",["^6","goog/events/keynames.js"],"^7","goog/events/keynames.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Constant declarations for common key codes.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.events.KeyNames');\n\n\n/**\n * Key names for common characters. These should be used with keyup/keydown\n * events, since the .keyCode property on those is meant to indicate the\n * *physical key* the user held down on the keyboard. Hence the mapping uses\n * only the unshifted version of each key (e.g. no '#', since that's shift+3).\n * Keypress events on the other hand generate (mostly) ASCII codes since they\n * correspond to *characters* the user typed.\n *\n * For further reference: http://unixpapa.com/js/key.html\n *\n * This list is not localized and therefore some of the key codes are not\n * correct for non-US keyboard layouts.\n *\n * @see goog.events.KeyCodes\n * @enum {string}\n */\ngoog.events.KeyNames = {\n  8: 'backspace',\n  9: 'tab',\n  13: 'enter',\n  16: 'shift',\n  17: 'ctrl',\n  18: 'alt',\n  19: 'pause',\n  20: 'caps-lock',\n  27: 'esc',\n  32: 'space',\n  33: 'pg-up',\n  34: 'pg-down',\n  35: 'end',\n  36: 'home',\n  37: 'left',\n  38: 'up',\n  39: 'right',\n  40: 'down',\n  45: 'insert',\n  46: 'delete',\n  48: '0',\n  49: '1',\n  50: '2',\n  51: '3',\n  52: '4',\n  53: '5',\n  54: '6',\n  55: '7',\n  56: '8',\n  57: '9',\n  59: 'semicolon',\n  61: 'equals',\n  65: 'a',\n  66: 'b',\n  67: 'c',\n  68: 'd',\n  69: 'e',\n  70: 'f',\n  71: 'g',\n  72: 'h',\n  73: 'i',\n  74: 'j',\n  75: 'k',\n  76: 'l',\n  77: 'm',\n  78: 'n',\n  79: 'o',\n  80: 'p',\n  81: 'q',\n  82: 'r',\n  83: 's',\n  84: 't',\n  85: 'u',\n  86: 'v',\n  87: 'w',\n  88: 'x',\n  89: 'y',\n  90: 'z',\n  93: 'context',\n  96: 'num-0',\n  97: 'num-1',\n  98: 'num-2',\n  99: 'num-3',\n  100: 'num-4',\n  101: 'num-5',\n  102: 'num-6',\n  103: 'num-7',\n  104: 'num-8',\n  105: 'num-9',\n  106: 'num-multiply',\n  107: 'num-plus',\n  109: 'num-minus',\n  110: 'num-period',\n  111: 'num-division',\n  112: 'f1',\n  113: 'f2',\n  114: 'f3',\n  115: 'f4',\n  116: 'f5',\n  117: 'f6',\n  118: 'f7',\n  119: 'f8',\n  120: 'f9',\n  121: 'f10',\n  122: 'f11',\n  123: 'f12',\n  186: 'semicolon',\n  187: 'equals',\n  189: 'dash',\n  188: ',',\n  190: '.',\n  191: '/',\n  192: '`',\n  219: 'open-square-bracket',\n  220: '\\\\',\n  221: 'close-square-bracket',\n  222: 'single-quote',\n  224: 'win'\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/keynames.js"],"^O",["^=",["~$goog.events.KeyNames"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.dom.inputtype.js","^5",["^6","goog/dom/inputtype.js"],"^7","goog/dom/inputtype.js","^8","^9","^:","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines the goog.dom.InputType enum.  This enumerates\n * all input element types (for INPUT, BUTTON, SELECT and TEXTAREA\n * elements) in either the the W3C HTML 4.01 index of elements or the\n * HTML5 draft specification.\n *\n * References:\n * http://www.w3.org/TR/html401/sgml/dtd.html#InputType\n * http://www.w3.org/TR/html-markup/input.html#input\n * https://html.spec.whatwg.org/multipage/forms.html#dom-input-type\n * https://html.spec.whatwg.org/multipage/forms.html#dom-button-type\n * https://html.spec.whatwg.org/multipage/forms.html#dom-select-type\n * https://html.spec.whatwg.org/multipage/forms.html#dom-textarea-type\n *\n * @author mpn@google.com (Michal Nazarewicz)\n */\ngoog.provide('goog.dom.InputType');\n\n\n/**\n * Enum of all input types (for INPUT, BUTTON, SELECT and TEXTAREA elements)\n * specified by the W3C HTML4.01 and HTML5 specifications.\n * @enum {string}\n */\ngoog.dom.InputType = {\n  BUTTON: 'button',\n  CHECKBOX: 'checkbox',\n  COLOR: 'color',\n  DATE: 'date',\n  DATETIME: 'datetime',\n  DATETIME_LOCAL: 'datetime-local',\n  EMAIL: 'email',\n  FILE: 'file',\n  HIDDEN: 'hidden',\n  IMAGE: 'image',\n  MENU: 'menu',\n  MONTH: 'month',\n  NUMBER: 'number',\n  PASSWORD: 'password',\n  RADIO: 'radio',\n  RANGE: 'range',\n  RESET: 'reset',\n  SEARCH: 'search',\n  SELECT_MULTIPLE: 'select-multiple',\n  SELECT_ONE: 'select-one',\n  SUBMIT: 'submit',\n  TEL: 'tel',\n  TEXT: 'text',\n  TEXTAREA: 'textarea',\n  TIME: 'time',\n  URL: 'url',\n  WEEK: 'week'\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/inputtype.js"],"^O",["^=",["^1U"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.ui.cssnames.js","^5",["^6","goog/ui/cssnames.js"],"^7","goog/ui/cssnames.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Common CSS class name constants.\n *\n * @author mkretzschmar@google.com (Martin Kretzschmar)\n */\n\ngoog.provide('goog.ui.INLINE_BLOCK_CLASSNAME');\n\n\n/**\n * CSS class name for applying the \"display: inline-block\" property in a\n * cross-browser way.\n * @type {string}\n */\ngoog.ui.INLINE_BLOCK_CLASSNAME = goog.getCssName('goog-inline-block');\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/cssnames.js"],"^O",["^=",["~$goog.ui.INLINE_BLOCK_CLASSNAME","~$goog.ui.INLINE-BLOCK-CLASSNAME"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.graphics.vmlelement.js","^5",["^6","goog/graphics/vmlelement.js"],"^7","goog/graphics/vmlelement.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Thin wrappers around the DOM element returned from\n * the different draw methods of the graphics. This is the VML implementation.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.graphics.VmlEllipseElement');\ngoog.provide('goog.graphics.VmlGroupElement');\ngoog.provide('goog.graphics.VmlImageElement');\ngoog.provide('goog.graphics.VmlPathElement');\ngoog.provide('goog.graphics.VmlRectElement');\ngoog.provide('goog.graphics.VmlTextElement');\n\n\ngoog.require('goog.dom');\ngoog.require('goog.graphics.EllipseElement');\ngoog.require('goog.graphics.GroupElement');\ngoog.require('goog.graphics.ImageElement');\ngoog.require('goog.graphics.PathElement');\ngoog.require('goog.graphics.RectElement');\ngoog.require('goog.graphics.TextElement');\n\n\n/**\n * Returns the VML element corresponding to this object.  This method is added\n * to several classes below.  Note that the return value of this method may\n * change frequently in IE8, so it should not be cached externally.\n * @return {Element} The VML element corresponding to this object.\n * @this {goog.graphics.VmlGroupElement|goog.graphics.VmlEllipseElement|\n *     goog.graphics.VmlRectElement|goog.graphics.VmlPathElement|\n *     goog.graphics.VmlTextElement|goog.graphics.VmlImageElement}\n * @private\n */\ngoog.graphics.vmlGetElement_ = function() {\n  this.element_ = this.getGraphics().getVmlElement(this.id_) || this.element_;\n  return this.element_;\n};\n\n\n\n/**\n * Thin wrapper for VML group elements.\n * This is an implementation of the goog.graphics.GroupElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.VmlGraphics} graphics The graphics creating\n *     this element.\n * @constructor\n * @extends {goog.graphics.GroupElement}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n * @final\n */\ngoog.graphics.VmlGroupElement = function(element, graphics) {\n  this.id_ = element.id;\n  goog.graphics.GroupElement.call(this, element, graphics);\n};\ngoog.inherits(goog.graphics.VmlGroupElement, goog.graphics.GroupElement);\n\n\n/** @override */\ngoog.graphics.VmlGroupElement.prototype.getElement =\n    goog.graphics.vmlGetElement_;\n\n\n/**\n * Remove all drawing elements from the group.\n * @override\n */\ngoog.graphics.VmlGroupElement.prototype.clear = function() {\n  goog.dom.removeChildren(this.getElement());\n};\n\n\n/**\n * @return {boolean} True if this group is the root canvas element.\n * @private\n */\ngoog.graphics.VmlGroupElement.prototype.isRootElement_ = function() {\n  return this.getGraphics().getCanvasElement() == this;\n};\n\n\n/**\n * Set the size of the group element.\n * @param {number|string} width The width of the group element.\n * @param {number|string} height The height of the group element.\n * @override\n * @suppress {missingRequire} goog.graphics.VmlGraphics\n */\ngoog.graphics.VmlGroupElement.prototype.setSize = function(width, height) {\n  var element = this.getElement();\n\n  var style = element.style;\n  style.width = goog.graphics.VmlGraphics.toSizePx(width);\n  style.height = goog.graphics.VmlGraphics.toSizePx(height);\n\n  element.coordsize = goog.graphics.VmlGraphics.toSizeCoord(width) + ' ' +\n      goog.graphics.VmlGraphics.toSizeCoord(height);\n\n  // Don't overwrite the root element's origin.\n  if (!this.isRootElement_()) {\n    element.coordorigin = '0 0';\n  }\n};\n\n\n\n/**\n * Thin wrapper for VML ellipse elements.\n * This is an implementation of the goog.graphics.EllipseElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.VmlGraphics} graphics  The graphics creating\n *     this element.\n * @param {number} cx Center X coordinate.\n * @param {number} cy Center Y coordinate.\n * @param {number} rx Radius length for the x-axis.\n * @param {number} ry Radius length for the y-axis.\n * @param {goog.graphics.Stroke?} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill?} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.EllipseElement}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n * @final\n */\ngoog.graphics.VmlEllipseElement = function(\n    element, graphics, cx, cy, rx, ry, stroke, fill) {\n  this.id_ = element.id;\n\n  goog.graphics.EllipseElement.call(this, element, graphics, stroke, fill);\n\n  // Store center and radius for future calls to setRadius or setCenter.\n\n  /**\n   * X coordinate of the ellipse center.\n   * @type {number}\n   */\n  this.cx = cx;\n\n\n  /**\n   * Y coordinate of the ellipse center.\n   * @type {number}\n   */\n  this.cy = cy;\n\n\n  /**\n   * Radius length for the x-axis.\n   * @type {number}\n   */\n  this.rx = rx;\n\n\n  /**\n   * Radius length for the y-axis.\n   * @type {number}\n   */\n  this.ry = ry;\n};\ngoog.inherits(goog.graphics.VmlEllipseElement, goog.graphics.EllipseElement);\n\n\n/** @override */\ngoog.graphics.VmlEllipseElement.prototype.getElement =\n    goog.graphics.vmlGetElement_;\n\n\n/**\n * Update the center point of the ellipse.\n * @param {number} cx Center X coordinate.\n * @param {number} cy Center Y coordinate.\n * @override\n */\ngoog.graphics.VmlEllipseElement.prototype.setCenter = function(cx, cy) {\n  this.cx = cx;\n  this.cy = cy;\n  /** @suppress {missingRequire} */\n  goog.graphics.VmlGraphics.setPositionAndSize(\n      this.getElement(), cx - this.rx, cy - this.ry, this.rx * 2, this.ry * 2);\n};\n\n\n/**\n * Update the radius of the ellipse.\n * @param {number} rx Center X coordinate.\n * @param {number} ry Center Y coordinate.\n * @override\n */\ngoog.graphics.VmlEllipseElement.prototype.setRadius = function(rx, ry) {\n  this.rx = rx;\n  this.ry = ry;\n  /** @suppress {missingRequire} */\n  goog.graphics.VmlGraphics.setPositionAndSize(\n      this.getElement(), this.cx - rx, this.cy - ry, rx * 2, ry * 2);\n};\n\n\n\n/**\n * Thin wrapper for VML rectangle elements.\n * This is an implementation of the goog.graphics.RectElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.VmlGraphics} graphics The graphics creating\n *     this element.\n * @param {goog.graphics.Stroke?} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill?} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.RectElement}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n * @final\n */\ngoog.graphics.VmlRectElement = function(element, graphics, stroke, fill) {\n  this.id_ = element.id;\n  goog.graphics.RectElement.call(this, element, graphics, stroke, fill);\n};\ngoog.inherits(goog.graphics.VmlRectElement, goog.graphics.RectElement);\n\n\n/** @override */\ngoog.graphics.VmlRectElement.prototype.getElement =\n    goog.graphics.vmlGetElement_;\n\n\n/**\n * Update the position of the rectangle.\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @override\n */\ngoog.graphics.VmlRectElement.prototype.setPosition = function(x, y) {\n  var style = this.getElement().style;\n\n  style.left = /** @suppress {missingRequire} */\n      goog.graphics.VmlGraphics.toPosPx(x);\n  style.top = /** @suppress {missingRequire} */\n      goog.graphics.VmlGraphics.toPosPx(y);\n};\n\n\n/**\n * Update the size of the rectangle.\n * @param {number} width Width of rectangle.\n * @param {number} height Height of rectangle.\n * @override\n * @suppress {missingRequire} goog.graphics.VmlGraphics\n */\ngoog.graphics.VmlRectElement.prototype.setSize = function(width, height) {\n  var style = this.getElement().style;\n  style.width = goog.graphics.VmlGraphics.toSizePx(width);\n  style.height = goog.graphics.VmlGraphics.toSizePx(height);\n};\n\n\n\n/**\n * Thin wrapper for VML path elements.\n * This is an implementation of the goog.graphics.PathElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.VmlGraphics} graphics The graphics creating\n *     this element.\n * @param {goog.graphics.Stroke?} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill?} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.PathElement}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n * @final\n */\ngoog.graphics.VmlPathElement = function(element, graphics, stroke, fill) {\n  this.id_ = element.id;\n  goog.graphics.PathElement.call(this, element, graphics, stroke, fill);\n};\ngoog.inherits(goog.graphics.VmlPathElement, goog.graphics.PathElement);\n\n\n/** @override */\ngoog.graphics.VmlPathElement.prototype.getElement =\n    goog.graphics.vmlGetElement_;\n\n\n/**\n * Update the underlying path.\n * @param {!goog.graphics.Path} path The path object to draw.\n * @override\n */\ngoog.graphics.VmlPathElement.prototype.setPath = function(path) {\n  /** @suppress {missingRequire} */\n  goog.graphics.VmlGraphics.setAttribute(\n      this.getElement(), 'path',\n      /** @suppress {missingRequire} */\n      goog.graphics.VmlGraphics.getVmlPath(path));\n};\n\n\n\n/**\n * Thin wrapper for VML text elements.\n * This is an implementation of the goog.graphics.TextElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.VmlGraphics} graphics The graphics creating\n *     this element.\n * @param {goog.graphics.Stroke?} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill?} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.TextElement}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n * @final\n */\ngoog.graphics.VmlTextElement = function(element, graphics, stroke, fill) {\n  this.id_ = element.id;\n  goog.graphics.TextElement.call(this, element, graphics, stroke, fill);\n};\ngoog.inherits(goog.graphics.VmlTextElement, goog.graphics.TextElement);\n\n\n/** @override */\ngoog.graphics.VmlTextElement.prototype.getElement =\n    goog.graphics.vmlGetElement_;\n\n\n/**\n * Update the displayed text of the element.\n * @param {string} text The text to draw.\n * @override\n */\ngoog.graphics.VmlTextElement.prototype.setText = function(text) {\n  /** @suppress {missingRequire} */\n  goog.graphics.VmlGraphics.setAttribute(\n      /** @type {!Element} */ (this.getElement().childNodes[1]), 'string',\n      text);\n};\n\n\n\n/**\n * Thin wrapper for VML image elements.\n * This is an implementation of the goog.graphics.ImageElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.VmlGraphics} graphics The graphics creating\n *     this element.\n * @constructor\n * @extends {goog.graphics.ImageElement}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n * @final\n */\ngoog.graphics.VmlImageElement = function(element, graphics) {\n  this.id_ = element.id;\n  goog.graphics.ImageElement.call(this, element, graphics);\n};\ngoog.inherits(goog.graphics.VmlImageElement, goog.graphics.ImageElement);\n\n\n/** @override */\ngoog.graphics.VmlImageElement.prototype.getElement =\n    goog.graphics.vmlGetElement_;\n\n\n/**\n * Update the position of the image.\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @override\n */\ngoog.graphics.VmlImageElement.prototype.setPosition = function(x, y) {\n  var style = this.getElement().style;\n\n  style.left = /** @suppress {missingRequire} */\n      goog.graphics.VmlGraphics.toPosPx(x);\n  style.top = /** @suppress {missingRequire} */\n      goog.graphics.VmlGraphics.toPosPx(y);\n};\n\n\n/**\n * Update the size of the image.\n * @param {number} width Width of rectangle.\n * @param {number} height Height of rectangle.\n * @override\n * @suppress {missingRequire} goog.graphics.VmlGraphics\n */\ngoog.graphics.VmlImageElement.prototype.setSize = function(width, height) {\n  var style = this.getElement().style;\n  style.width = goog.graphics.VmlGraphics.toPosPx(width);\n  style.height = goog.graphics.VmlGraphics.toPosPx(height);\n};\n\n\n/**\n * Update the source of the image.\n * @param {string} src Source of the image.\n * @override\n */\ngoog.graphics.VmlImageElement.prototype.setSource = function(src) {\n  /** @suppress {missingRequire} */\n  goog.graphics.VmlGraphics.setAttribute(this.getElement(), 'src', src);\n};\n","^;",1579837703000,"^<",["^=",["~$goog.graphics.RectElement","^1>","~$goog.graphics.EllipseElement","~$goog.graphics.GroupElement","^?","~$goog.graphics.PathElement","~$goog.graphics.ImageElement","~$goog.graphics.TextElement"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/vmlelement.js"],"^O",["^=",["~$goog.graphics.VmlTextElement","~$goog.graphics.VmlGroupElement","~$goog.graphics.VmlPathElement","~$goog.graphics.VmlImageElement","~$goog.graphics.VmlEllipseElement","~$goog.graphics.VmlRectElement"]],"^W",true,"^X",["^?","^1>","^22","^23","^25","^24","^21","^26"]],["^ ","^3",[1579837703000],"^4","goog.ui.ac.ac.js","^5",["^6","goog/ui/ac/ac.js"],"^7","goog/ui/ac/ac.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility methods supporting the autocomplete package.\n *\n * @author adamwos@google.com (Adam Wos)\n * @see ../../demos/autocomplete-basic.html\n */\n\ngoog.provide('goog.ui.ac');\n\ngoog.require('goog.ui.ac.ArrayMatcher');\ngoog.require('goog.ui.ac.AutoComplete');\ngoog.require('goog.ui.ac.InputHandler');\ngoog.require('goog.ui.ac.Renderer');\n\n\n/**\n * Factory function for building a basic autocomplete widget that autocompletes\n * an inputbox or text area from a data array.\n * @param {Array<?>} data Data array.\n * @param {Element} input Input element or text area.\n * @param {boolean=} opt_multi Whether to allow multiple entries separated with\n *     semi-colons or commas.\n * @param {boolean=} opt_useSimilar use similar matches. e.g. \"gost\" => \"ghost\".\n * @return {!goog.ui.ac.AutoComplete} A new autocomplete object.\n */\ngoog.ui.ac.createSimpleAutoComplete = function(\n    data, input, opt_multi, opt_useSimilar) {\n  var matcher = new goog.ui.ac.ArrayMatcher(data, !opt_useSimilar);\n  var renderer = new goog.ui.ac.Renderer();\n  var inputHandler = new goog.ui.ac.InputHandler(null, null, !!opt_multi);\n\n  var autoComplete =\n      new goog.ui.ac.AutoComplete(matcher, renderer, inputHandler);\n  inputHandler.attachAutoComplete(autoComplete);\n  inputHandler.attachInputs(input);\n  return autoComplete;\n};\n","^;",1579837703000,"^<",["^=",["~$goog.ui.ac.AutoComplete","~$goog.ui.ac.Renderer","^?","~$goog.ui.ac.ArrayMatcher","~$goog.ui.ac.InputHandler"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/ac/ac.js"],"^O",["^=",["~$goog.ui.ac"]],"^W",true,"^X",["^?","^2?","^2=","^2@","^2>"]],["^ ","^3",[1579837703000],"^4","goog.messaging.loggerserver.js","^5",["^6","goog/messaging/loggerserver.js"],"^7","goog/messaging/loggerserver.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This class listens on a message channel for logger commands and\n * logs them on the local page. This is useful when dealing with message\n * channels to contexts that don't have access to their own logging facilities.\n *\n */\n\ngoog.provide('goog.messaging.LoggerServer');\n\ngoog.forwardDeclare('goog.messaging.MessageChannel');\ngoog.require('goog.Disposable');\ngoog.require('goog.log');\ngoog.require('goog.log.Level');\n\n\n\n/**\n * Creates a logger server that logs messages on behalf of the remote end of a\n * message channel. The remote end of the channel should use a\n * {goog.messaging.LoggerClient} with the same service name.\n *\n * @param {!goog.messaging.MessageChannel} channel The channel that is sending\n *     the log messages.\n * @param {string} serviceName The name of the logging service to listen for.\n * @param {string=} opt_channelName The name of this channel. Used to help\n *     distinguish this client's messages.\n * @constructor\n * @extends {goog.Disposable}\n * @final\n */\ngoog.messaging.LoggerServer = function(channel, serviceName, opt_channelName) {\n  goog.messaging.LoggerServer.base(this, 'constructor');\n\n  /**\n   * The channel that is sending the log messages.\n   * @type {!goog.messaging.MessageChannel}\n   * @private\n   */\n  this.channel_ = channel;\n\n  /**\n   * The name of the logging service to listen for.\n   * @type {string}\n   * @private\n   */\n  this.serviceName_ = serviceName;\n\n  /**\n   * The name of the channel.\n   * @type {string}\n   * @private\n   */\n  this.channelName_ = opt_channelName || 'remote logger';\n\n  this.channel_.registerService(\n      this.serviceName_, goog.bind(this.log_, this), true /* opt_json */);\n};\ngoog.inherits(goog.messaging.LoggerServer, goog.Disposable);\n\n\n/**\n * Handles logging messages from the client.\n * @param {!Object|string} message\n *     The logging information from the client.\n * @private\n */\ngoog.messaging.LoggerServer.prototype.log_ = function(message) {\n  var args =\n      /**\n       * @type {{level: number, message: string,\n       *           name: string, exception: Object}}\n       */ (message);\n  var level = goog.log.Level.getPredefinedLevelByValue(args['level']);\n  if (level) {\n    var msg = '[' + this.channelName_ + '] ' + args['message'];\n    goog.log.getLogger(args['name']).log(level, msg, args['exception']);\n  }\n};\n\n\n/** @override */\ngoog.messaging.LoggerServer.prototype.disposeInternal = function() {\n  goog.messaging.LoggerServer.base(this, 'disposeInternal');\n  this.channel_.registerService(this.serviceName_, goog.nullFunction, true);\n  delete this.channel_;\n};\n","^;",1579837703000,"^<",["^=",["~$goog.log.Level","^?","^18","^1:"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/loggerserver.js"],"^O",["^=",["~$goog.messaging.LoggerServer"]],"^W",true,"^X",["^?","^1:","^18","^2B"]],["^ ","^3",[1579837703000],"^4","goog.net.streams.streamparser.js","^5",["^6","goog/net/streams/streamparser.js"],"^7","goog/net/streams/streamparser.js","^8","^9","^:","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview the private interface for implementing parsers responsible\n * for decoding the input stream (e.g. an HTTP body) to objects per their\n * specified content-types, e.g. JSON, Protobuf.\n *\n * A default JSON parser is provided,\n *\n * A Protobuf stream parser is also provided.\n */\n\ngoog.provide('goog.net.streams.StreamParser');\n\n\n\n/**\n * This interface represents a stream parser.\n *\n * @interface\n * @package\n */\ngoog.net.streams.StreamParser = function() {};\n\n\n/**\n * Checks if the parser is aborted due to invalid input.\n *\n * @return {boolean} true if the input is still valid.\n */\ngoog.net.streams.StreamParser.prototype.isInputValid = goog.abstractMethod;\n\n\n/**\n * Checks the error message.\n *\n * @return {?string} any debug info on the first invalid input, or null if\n *    the input is still valid.\n */\ngoog.net.streams.StreamParser.prototype.getErrorMessage = goog.abstractMethod;\n\n\n/**\n * Parse the new input.\n *\n * Note that there is no Parser state to indicate the end of a stream.\n *\n * @param {string|!ArrayBuffer|!Array<number>} input The input data\n * @throws {!Error} if the input is invalid, and the parser will remain invalid\n *    once an error has been thrown.\n * @return {?Array<string|!Object>} any parsed objects (atomic messages)\n *    in an array, or null if more data needs be read to parse any new object.\n */\ngoog.net.streams.StreamParser.prototype.parse = goog.abstractMethod;\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/streams/streamparser.js"],"^O",["^=",["~$goog.net.streams.StreamParser"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.ui.tree.treecontrol.js","^5",["^6","goog/ui/tree/treecontrol.js"],"^7","goog/ui/tree/treecontrol.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the goog.ui.tree.TreeControl class, which\n * provides a way to view a hierarchical set of data.\n *\n * @author arv@google.com (Erik Arvidsson)\n * @author eae@google.com (Emil A Eklund)\n *\n * This is a based on the webfx tree control. It since been updated to add\n * typeahead support, as well as accessibility support using ARIA framework.\n *\n * @see ../../demos/tree/demo.html\n */\n\ngoog.provide('goog.ui.tree.TreeControl');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.asserts');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.FocusHandler');\ngoog.require('goog.events.KeyHandler');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.log');\ngoog.require('goog.ui.tree.BaseNode');\ngoog.require('goog.ui.tree.TreeNode');\ngoog.require('goog.ui.tree.TypeAhead');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * This creates a TreeControl object. A tree control provides a way to\n * view a hierarchical set of data.\n * @param {string|!goog.html.SafeHtml} content The content of the node label.\n *     Strings are treated as plain-text and will be HTML escaped.\n * @param {Object=} opt_config The configuration for the tree. See\n *    goog.ui.tree.TreeControl.defaultConfig. If not specified, a default config\n *    will be used.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.tree.BaseNode}\n */\ngoog.ui.tree.TreeControl = function(content, opt_config, opt_domHelper) {\n  goog.ui.tree.BaseNode.call(this, content, opt_config, opt_domHelper);\n\n  // The root is open and selected by default.\n  this.setExpandedInternal(true);\n  this.setSelectedInternal(true);\n\n  this.selectedItem_ = this;\n\n  /**\n   * Used for typeahead support.\n   * @private {!goog.ui.tree.TypeAhead}\n   */\n  this.typeAhead_ = new goog.ui.tree.TypeAhead();\n\n  /**\n   * The object handling keyboard events.\n   * @private {?goog.events.KeyHandler}\n   */\n  this.keyHandler_ = null;\n\n  /**\n   * The object handling focus events.\n   * @private {?goog.events.FocusHandler}\n   */\n  this.focusHandler_ = null;\n\n  /**\n   * Logger\n   * @private {?goog.log.Logger}\n   */\n  this.logger_ = goog.log.getLogger('this');\n\n  /**\n   * Whether the tree is focused.\n   * @private {boolean}\n   */\n  this.focused_ = false;\n\n  /**\n   * Child node that currently has focus.\n   * @private {?goog.ui.tree.BaseNode}\n   */\n  this.focusedNode_ = null;\n\n  /**\n   * Whether to show lines.\n   * @private {boolean}\n   */\n  this.showLines_ = true;\n\n  /**\n   * Whether to show expanded lines.\n   * @private {boolean}\n   */\n  this.showExpandIcons_ = true;\n\n  /**\n   * Whether to show the root node.\n   * @private {boolean}\n   */\n  this.showRootNode_ = true;\n\n  /**\n   * Whether to show the root lines.\n   * @private {boolean}\n   */\n  this.showRootLines_ = true;\n\n  if (goog.userAgent.IE) {\n\n    try {\n      // works since IE6SP1\n      document.execCommand('BackgroundImageCache', false, true);\n    } catch (e) {\n      goog.log.warning(this.logger_, 'Failed to enable background image cache');\n    }\n  }\n};\ngoog.inherits(goog.ui.tree.TreeControl, goog.ui.tree.BaseNode);\n\n\n/** @override */\ngoog.ui.tree.TreeControl.prototype.getTree = function() {\n  return this;\n};\n\n\n/** @override */\ngoog.ui.tree.TreeControl.prototype.getDepth = function() {\n  return 0;\n};\n\n\n/**\n * Expands the parent chain of this node so that it is visible.\n * @override\n */\ngoog.ui.tree.TreeControl.prototype.reveal = function() {\n  // always expanded by default\n  // needs to be overriden so that we don't try to reveal our parent\n  // which is a generic component\n};\n\n\n/**\n * Handles focus on the tree.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.ui.tree.TreeControl.prototype.handleFocus_ = function(e) {\n  this.focused_ = true;\n  goog.dom.classlist.add(\n      goog.asserts.assert(this.getElement()), goog.getCssName('focused'));\n\n  if (this.selectedItem_) {\n    this.selectedItem_.select();\n  }\n};\n\n\n/**\n * Handles blur on the tree.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.ui.tree.TreeControl.prototype.handleBlur_ = function(e) {\n  this.focused_ = false;\n  goog.dom.classlist.remove(\n      goog.asserts.assert(this.getElement()), goog.getCssName('focused'));\n};\n\n\n/**\n * @return {boolean} Whether the tree has keyboard focus.\n */\ngoog.ui.tree.TreeControl.prototype.hasFocus = function() {\n  return this.focused_;\n};\n\n\n/** @override */\ngoog.ui.tree.TreeControl.prototype.getExpanded = function() {\n  return !this.showRootNode_ ||\n      goog.ui.tree.TreeControl.superClass_.getExpanded.call(this);\n};\n\n\n/** @override */\ngoog.ui.tree.TreeControl.prototype.setExpanded = function(expanded) {\n  if (!this.showRootNode_) {\n    this.setExpandedInternal(expanded);\n  } else {\n    goog.ui.tree.TreeControl.superClass_.setExpanded.call(this, expanded);\n  }\n};\n\n\n/** @override */\ngoog.ui.tree.TreeControl.prototype.getExpandIconSafeHtml = function() {\n  // no expand icon for root element\n  return goog.html.SafeHtml.EMPTY;\n};\n\n\n/** @override */\ngoog.ui.tree.TreeControl.prototype.getIconElement = function() {\n  var el = this.getRowElement();\n  return el ? /** @type {Element} */ (el.firstChild) : null;\n};\n\n\n/** @override */\ngoog.ui.tree.TreeControl.prototype.getExpandIconElement = function() {\n  // no expand icon for root element\n  return null;\n};\n\n\n/** @override */\ngoog.ui.tree.TreeControl.prototype.updateExpandIcon = function() {\n  // no expand icon\n};\n\n\n/** @override */\ngoog.ui.tree.TreeControl.prototype.getRowClassName = function() {\n  return goog.ui.tree.TreeControl.superClass_.getRowClassName.call(this) +\n      (this.showRootNode_ ? '' : ' ' + this.getConfig().cssHideRoot);\n};\n\n\n/**\n * Returns the source for the icon.\n * @return {string} Src for the icon.\n * @override\n */\ngoog.ui.tree.TreeControl.prototype.getCalculatedIconClass = function() {\n  var expanded = this.getExpanded();\n  var expandedIconClass = this.getExpandedIconClass();\n  if (expanded && expandedIconClass) {\n    return expandedIconClass;\n  }\n  var iconClass = this.getIconClass();\n  if (!expanded && iconClass) {\n    return iconClass;\n  }\n\n  // fall back on default icons\n  var config = this.getConfig();\n  if (expanded && config.cssExpandedRootIcon) {\n    return config.cssTreeIcon + ' ' + config.cssExpandedRootIcon;\n  } else if (!expanded && config.cssCollapsedRootIcon) {\n    return config.cssTreeIcon + ' ' + config.cssCollapsedRootIcon;\n  }\n  return '';\n};\n\n\n/**\n * Sets the selected item.\n * @param {goog.ui.tree.BaseNode} node The item to select.\n */\ngoog.ui.tree.TreeControl.prototype.setSelectedItem = function(node) {\n  if (this.selectedItem_ == node) {\n    return;\n  }\n\n  var hadFocus = false;\n  if (this.selectedItem_) {\n    hadFocus = this.selectedItem_ == this.focusedNode_;\n    this.selectedItem_.setSelectedInternal(false);\n  }\n\n  this.selectedItem_ = node;\n\n  if (node) {\n    node.setSelectedInternal(true);\n    if (hadFocus) {\n      node.select();\n    }\n  }\n\n  this.dispatchEvent(goog.events.EventType.CHANGE);\n};\n\n\n/**\n * Returns the selected item.\n * @return {goog.ui.tree.BaseNode} The currently selected item.\n */\ngoog.ui.tree.TreeControl.prototype.getSelectedItem = function() {\n  return this.selectedItem_;\n};\n\n\n/**\n * Sets whether to show lines.\n * @param {boolean} b Whether to show lines.\n */\ngoog.ui.tree.TreeControl.prototype.setShowLines = function(b) {\n  if (this.showLines_ != b) {\n    this.showLines_ = b;\n    if (this.isInDocument()) {\n      this.updateLinesAndExpandIcons_();\n    }\n  }\n};\n\n\n/**\n * @return {boolean} Whether to show lines.\n */\ngoog.ui.tree.TreeControl.prototype.getShowLines = function() {\n  return this.showLines_;\n};\n\n\n/**\n * Updates the lines after the tree has been drawn.\n * @private\n */\ngoog.ui.tree.TreeControl.prototype.updateLinesAndExpandIcons_ = function() {\n  var tree = this;\n  var showLines = tree.getShowLines();\n  var showRootLines = tree.getShowRootLines();\n\n  /**\n   * Recursively walk through all nodes and update the class names of the\n   * expand icon and the children element.\n   * @param {!goog.ui.tree.BaseNode} node\n   */\n  function updateShowLines(node) {\n    var childrenEl = node.getChildrenElement();\n    if (childrenEl) {\n      var hideLines = !showLines || tree == node.getParent() && !showRootLines;\n      var childClass = hideLines ? node.getConfig().cssChildrenNoLines :\n                                   node.getConfig().cssChildren;\n      childrenEl.className = childClass;\n\n      var expandIconEl = node.getExpandIconElement();\n      if (expandIconEl) {\n        expandIconEl.className = node.getExpandIconClass();\n      }\n    }\n    node.forEachChild(updateShowLines);\n  }\n  updateShowLines(this);\n};\n\n\n/**\n * Sets whether to show root lines.\n * @param {boolean} b Whether to show root lines.\n */\ngoog.ui.tree.TreeControl.prototype.setShowRootLines = function(b) {\n  if (this.showRootLines_ != b) {\n    this.showRootLines_ = b;\n    if (this.isInDocument()) {\n      this.updateLinesAndExpandIcons_();\n    }\n  }\n};\n\n\n/**\n * @return {boolean} Whether to show root lines.\n */\ngoog.ui.tree.TreeControl.prototype.getShowRootLines = function() {\n  return this.showRootLines_;\n};\n\n\n/**\n * Sets whether to show expand icons.\n * @param {boolean} b Whether to show expand icons.\n */\ngoog.ui.tree.TreeControl.prototype.setShowExpandIcons = function(b) {\n  if (this.showExpandIcons_ != b) {\n    this.showExpandIcons_ = b;\n    if (this.isInDocument()) {\n      this.updateLinesAndExpandIcons_();\n    }\n  }\n};\n\n\n/**\n * @return {boolean} Whether to show expand icons.\n */\ngoog.ui.tree.TreeControl.prototype.getShowExpandIcons = function() {\n  return this.showExpandIcons_;\n};\n\n\n/**\n * Sets whether to show the root node.\n * @param {boolean} b Whether to show the root node.\n */\ngoog.ui.tree.TreeControl.prototype.setShowRootNode = function(b) {\n  if (this.showRootNode_ != b) {\n    this.showRootNode_ = b;\n    if (this.isInDocument()) {\n      var el = this.getRowElement();\n      if (el) {\n        el.className = this.getRowClassName();\n      }\n    }\n    // Ensure that we do not hide the selected item.\n    if (!b && this.getSelectedItem() == this && this.getFirstChild()) {\n      this.setSelectedItem(this.getFirstChild());\n    }\n  }\n};\n\n\n/**\n * @return {boolean} Whether to show the root node.\n */\ngoog.ui.tree.TreeControl.prototype.getShowRootNode = function() {\n  return this.showRootNode_;\n};\n\n\n/**\n * Add roles and states.\n * @protected\n * @override\n */\ngoog.ui.tree.TreeControl.prototype.initAccessibility = function() {\n  goog.ui.tree.TreeControl.superClass_.initAccessibility.call(this);\n\n  var elt = this.getElement();\n  goog.asserts.assert(elt, 'The DOM element for the tree cannot be null.');\n  goog.a11y.aria.setRole(elt, 'tree');\n  goog.a11y.aria.setState(elt, 'labelledby', this.getLabelElement().id);\n};\n\n\n/** @override */\ngoog.ui.tree.TreeControl.prototype.enterDocument = function() {\n  goog.ui.tree.TreeControl.superClass_.enterDocument.call(this);\n  var el = this.getElement();\n  el.className = this.getConfig().cssRoot;\n  el.setAttribute('hideFocus', 'true');\n  this.attachEvents_();\n  this.initAccessibility();\n};\n\n\n/** @override */\ngoog.ui.tree.TreeControl.prototype.exitDocument = function() {\n  goog.ui.tree.TreeControl.superClass_.exitDocument.call(this);\n  this.detachEvents_();\n};\n\n\n/**\n * Adds the event listeners to the tree.\n * @private\n */\ngoog.ui.tree.TreeControl.prototype.attachEvents_ = function() {\n  var el = this.getElement();\n  el.tabIndex = 0;\n\n  var kh = this.keyHandler_ = new goog.events.KeyHandler(el);\n  var fh = this.focusHandler_ = new goog.events.FocusHandler(el);\n\n  this.getHandler()\n      .listen(fh, goog.events.FocusHandler.EventType.FOCUSOUT, this.handleBlur_)\n      .listen(fh, goog.events.FocusHandler.EventType.FOCUSIN, this.handleFocus_)\n      .listen(kh, goog.events.KeyHandler.EventType.KEY, this.handleKeyEvent)\n      .listen(el, goog.events.EventType.MOUSEDOWN, this.handleMouseEvent_)\n      .listen(el, goog.events.EventType.CLICK, this.handleMouseEvent_)\n      .listen(el, goog.events.EventType.DBLCLICK, this.handleMouseEvent_);\n};\n\n\n/**\n * Removes the event listeners from the tree.\n * @private\n */\ngoog.ui.tree.TreeControl.prototype.detachEvents_ = function() {\n  this.keyHandler_.dispose();\n  this.keyHandler_ = null;\n  this.focusHandler_.dispose();\n  this.focusHandler_ = null;\n};\n\n\n/**\n * Handles mouse events.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.ui.tree.TreeControl.prototype.handleMouseEvent_ = function(e) {\n  goog.log.fine(this.logger_, 'Received event ' + e.type);\n  var node = this.getNodeFromEvent_(e);\n  if (node) {\n    switch (e.type) {\n      case goog.events.EventType.MOUSEDOWN:\n        node.onMouseDown(e);\n        break;\n      case goog.events.EventType.CLICK:\n        node.onClick_(e);\n        break;\n      case goog.events.EventType.DBLCLICK:\n        node.onDoubleClick_(e);\n        break;\n    }\n  }\n};\n\n\n/**\n * Handles key down on the tree.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @return {boolean} The handled value.\n */\ngoog.ui.tree.TreeControl.prototype.handleKeyEvent = function(e) {\n  var handled = false;\n\n  // Handle typeahead and navigation keystrokes.\n  handled = this.typeAhead_.handleNavigation(e) ||\n      (this.selectedItem_ && this.selectedItem_.onKeyDown(e)) ||\n      this.typeAhead_.handleTypeAheadChar(e);\n\n  if (handled) {\n    e.preventDefault();\n  }\n\n  return handled;\n};\n\n\n/**\n * Finds the containing node given an event.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @return {goog.ui.tree.BaseNode} The containing node or null if no node is\n *     found.\n * @private\n */\ngoog.ui.tree.TreeControl.prototype.getNodeFromEvent_ = function(e) {\n  // find the right node\n  var node = null;\n  var target = e.target;\n  while (target != null) {\n    var id = target.id;\n    node = goog.ui.tree.BaseNode.allNodes[id];\n    if (node) {\n      return node;\n    }\n    if (target == this.getElement()) {\n      break;\n    }\n    target = target.parentNode;\n  }\n  return null;\n};\n\n\n/**\n * Creates a new tree node using the same config as the root.\n * @param {string=} opt_content The content of the node label. Strings are\n *     treated as plain-text and will be HTML escaped. To set SafeHtml content,\n *     omit opt_content and call setSafeHtml on the resulting node.\n * @return {!goog.ui.tree.TreeNode} The new item.\n */\ngoog.ui.tree.TreeControl.prototype.createNode = function(opt_content) {\n  return new goog.ui.tree.TreeNode(opt_content || goog.html.SafeHtml.EMPTY,\n      this.getConfig(), this.getDomHelper());\n};\n\n\n/**\n * Allows the caller to notify that the given node has been added or just had\n * been updated in the tree.\n * @param {goog.ui.tree.BaseNode} node New node being added or existing node\n *    that just had been updated.\n */\ngoog.ui.tree.TreeControl.prototype.setNode = function(node) {\n  this.typeAhead_.setNodeInMap(node);\n};\n\n\n/**\n * Allows the caller to notify that the given node is being removed from the\n * tree.\n * @param {goog.ui.tree.BaseNode} node Node being removed.\n */\ngoog.ui.tree.TreeControl.prototype.removeNode = function(node) {\n  this.typeAhead_.removeNodeFromMap(node);\n};\n\n\n/**\n * Clear the typeahead buffer.\n */\ngoog.ui.tree.TreeControl.prototype.clearTypeAhead = function() {\n  this.typeAhead_.clear();\n};\n\n\n/**\n * A default configuration for the tree.\n */\ngoog.ui.tree.TreeControl.defaultConfig = goog.ui.tree.BaseNode.defaultConfig;\n","^;",1579837703000,"^<",["^=",["^1L","~$goog.ui.tree.TreeNode","~$goog.ui.tree.BaseNode","^1M","^1O","~$goog.events.KeyHandler","^?","^[","^18","^1C","~$goog.events.FocusHandler","~$goog.ui.tree.TypeAhead","^1I"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/tree/treecontrol.js"],"^O",["^=",["~$goog.ui.tree.TreeControl"]],"^W",true,"^X",["^?","^1O","^1L","^1M","^1C","^2H","^2G","^1I","^18","^2F","^2E","^2I","^["]],["^ ","^3",[1579837703000],"^4","goog.dom.browserrange.w3crange.js","^5",["^6","goog/dom/browserrange/w3crange.js"],"^7","goog/dom/browserrange/w3crange.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the W3C spec following range wrapper.\n *\n * DO NOT USE THIS FILE DIRECTLY.  Use goog.dom.Range instead.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.dom.browserrange.W3cRange');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.RangeEndpoint');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.browserrange.AbstractRange');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * The constructor for W3C specific browser ranges.\n * @param {Range} range The range object.\n * @constructor\n * @extends {goog.dom.browserrange.AbstractRange}\n */\ngoog.dom.browserrange.W3cRange = function(range) {\n  this.range_ = range;\n};\ngoog.inherits(\n    goog.dom.browserrange.W3cRange, goog.dom.browserrange.AbstractRange);\n\n\n/**\n * Returns a browser range spanning the given node's contents.\n * @param {Node} node The node to select.\n * @return {!Range} A browser range spanning the node's contents.\n * @protected\n */\ngoog.dom.browserrange.W3cRange.getBrowserRangeForNode = function(node) {\n  var nodeRange = goog.dom.getOwnerDocument(node).createRange();\n\n  if (node.nodeType == goog.dom.NodeType.TEXT) {\n    nodeRange.setStart(node, 0);\n    nodeRange.setEnd(node, node.length);\n  } else {\n    /** @suppress {missingRequire} */\n    if (!goog.dom.browserrange.canContainRangeEndpoint(node)) {\n      var rangeParent = node.parentNode;\n      var rangeStartOffset = goog.array.indexOf(rangeParent.childNodes, node);\n      nodeRange.setStart(rangeParent, rangeStartOffset);\n      nodeRange.setEnd(rangeParent, rangeStartOffset + 1);\n    } else {\n      var tempNode, leaf = node;\n      while ((tempNode = leaf.firstChild) &&\n             /** @suppress {missingRequire} */\n             goog.dom.browserrange.canContainRangeEndpoint(tempNode)) {\n        leaf = tempNode;\n      }\n      nodeRange.setStart(leaf, 0);\n\n      leaf = node;\n      /** @suppress {missingRequire} Circular dep with browserrange */\n      while ((tempNode = leaf.lastChild) &&\n             goog.dom.browserrange.canContainRangeEndpoint(tempNode)) {\n        leaf = tempNode;\n      }\n      nodeRange.setEnd(\n          leaf, leaf.nodeType == goog.dom.NodeType.ELEMENT ?\n              leaf.childNodes.length :\n              leaf.length);\n    }\n  }\n\n  return nodeRange;\n};\n\n\n/**\n * Returns a browser range spanning the given nodes.\n * @param {Node} startNode The node to start with - should not be a BR.\n * @param {number} startOffset The offset within the start node.\n * @param {Node} endNode The node to end with - should not be a BR.\n * @param {number} endOffset The offset within the end node.\n * @return {!Range} A browser range spanning the node's contents.\n * @protected\n */\ngoog.dom.browserrange.W3cRange.getBrowserRangeForNodes = function(\n    startNode, startOffset, endNode, endOffset) {\n  // Create and return the range.\n  var nodeRange = goog.dom.getOwnerDocument(startNode).createRange();\n  nodeRange.setStart(startNode, startOffset);\n  nodeRange.setEnd(endNode, endOffset);\n  return nodeRange;\n};\n\n\n/**\n * Creates a range object that selects the given node's text.\n * @param {Node} node The node to select.\n * @return {!goog.dom.browserrange.W3cRange} A Gecko range wrapper object.\n */\ngoog.dom.browserrange.W3cRange.createFromNodeContents = function(node) {\n  return new goog.dom.browserrange.W3cRange(\n      goog.dom.browserrange.W3cRange.getBrowserRangeForNode(node));\n};\n\n\n/**\n * Creates a range object that selects between the given nodes.\n * @param {Node} startNode The node to start with.\n * @param {number} startOffset The offset within the start node.\n * @param {Node} endNode The node to end with.\n * @param {number} endOffset The offset within the end node.\n * @return {!goog.dom.browserrange.W3cRange} A wrapper object.\n */\ngoog.dom.browserrange.W3cRange.createFromNodes = function(\n    startNode, startOffset, endNode, endOffset) {\n  return new goog.dom.browserrange.W3cRange(\n      goog.dom.browserrange.W3cRange.getBrowserRangeForNodes(\n          startNode, startOffset, endNode, endOffset));\n};\n\n\n/**\n * @return {!goog.dom.browserrange.W3cRange} A clone of this range.\n * @override\n */\ngoog.dom.browserrange.W3cRange.prototype.clone = function() {\n  return new this.constructor(this.range_.cloneRange());\n};\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.getBrowserRange = function() {\n  return this.range_;\n};\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.getContainer = function() {\n  return this.range_.commonAncestorContainer;\n};\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.getStartNode = function() {\n  return this.range_.startContainer;\n};\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.getStartOffset = function() {\n  return this.range_.startOffset;\n};\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.getEndNode = function() {\n  return this.range_.endContainer;\n};\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.getEndOffset = function() {\n  return this.range_.endOffset;\n};\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.compareBrowserRangeEndpoints =\n    function(range, thisEndpoint, otherEndpoint) {\n  return this.range_.compareBoundaryPoints(\n      otherEndpoint == goog.dom.RangeEndpoint.START ?\n          (thisEndpoint == goog.dom.RangeEndpoint.START ?\n               goog.global['Range'].START_TO_START :\n               goog.global['Range'].START_TO_END) :\n          (thisEndpoint == goog.dom.RangeEndpoint.START ?\n               goog.global['Range'].END_TO_START :\n               goog.global['Range'].END_TO_END),\n      /** @type {Range} */ (range));\n};\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.isCollapsed = function() {\n  return this.range_.collapsed;\n};\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.getText = function() {\n  return this.range_.toString();\n};\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.getValidHtml = function() {\n  var div = goog.dom.getDomHelper(this.range_.startContainer)\n                .createDom(goog.dom.TagName.DIV);\n  div.appendChild(this.range_.cloneContents());\n  var result = div.innerHTML;\n\n  if (goog.string.startsWith(result, '<') ||\n      !this.isCollapsed() && !goog.string.contains(result, '<')) {\n    // We attempt to mimic IE, which returns no containing element when a\n    // only text nodes are selected, does return the containing element when\n    // the selection is empty, and does return the element when multiple nodes\n    // are selected.\n    return result;\n  }\n\n  var container = this.getContainer();\n  container = container.nodeType == goog.dom.NodeType.ELEMENT ?\n      container :\n      container.parentNode;\n\n  var html = goog.dom.getOuterHtml(\n      /** @type {!Element} */ (container.cloneNode(false)));\n  return html.replace('>', '>' + result);\n};\n\n\n// SELECTION MODIFICATION\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.select = function(reverse) {\n  var win = goog.dom.getWindow(goog.dom.getOwnerDocument(this.getStartNode()));\n  this.selectInternal(win.getSelection(), reverse);\n};\n\n\n/**\n * Select this range.\n * @param {Selection} selection Browser selection object.\n * @param {*} reverse Whether to select this range in reverse.\n * @protected\n */\ngoog.dom.browserrange.W3cRange.prototype.selectInternal = function(\n    selection, reverse) {\n  // Browser-specific tricks are needed to create reversed selections\n  // programatically. For this generic W3C codepath, ignore the reverse\n  // parameter.\n  selection.removeAllRanges();\n  selection.addRange(this.range_);\n};\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.removeContents = function() {\n  var range = this.range_;\n  range.extractContents();\n\n  if (range.startContainer.hasChildNodes()) {\n    // Remove any now empty nodes surrounding the extracted contents.\n    var rangeStartContainer =\n        range.startContainer.childNodes[range.startOffset];\n    if (rangeStartContainer) {\n      var rangePrevious = rangeStartContainer.previousSibling;\n\n      if (goog.dom.getRawTextContent(rangeStartContainer) == '') {\n        goog.dom.removeNode(rangeStartContainer);\n      }\n\n      if (rangePrevious && goog.dom.getRawTextContent(rangePrevious) == '') {\n        goog.dom.removeNode(rangePrevious);\n      }\n    }\n  }\n\n  if (goog.userAgent.EDGE_OR_IE) {\n    // Unfortunately, when deleting a portion of a single text node, IE creates\n    // an extra text node instead of modifying the nodeValue of the start node.\n    // We normalize for that behavior here, similar to code in\n    // goog.dom.browserrange.IeRange#removeContents\n    // See https://connect.microsoft.com/IE/feedback/details/746591\n    var startNode = this.getStartNode();\n    var startOffset = this.getStartOffset();\n    var endNode = this.getEndNode();\n    var endOffset = this.getEndOffset();\n    var sibling = startNode.nextSibling;\n    if (startNode == endNode && startNode.parentNode &&\n        startNode.nodeType == goog.dom.NodeType.TEXT && sibling &&\n        sibling.nodeType == goog.dom.NodeType.TEXT) {\n      startNode.nodeValue += sibling.nodeValue;\n      goog.dom.removeNode(sibling);\n\n      // Modifying the node value clears the range offsets. Reselect the\n      // position in the modified start node.\n      range.setStart(startNode, startOffset);\n      range.setEnd(endNode, endOffset);\n    }\n  }\n};\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.surroundContents = function(element) {\n  this.range_.surroundContents(element);\n  return element;\n};\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.insertNode = function(node, before) {\n  var range = this.range_.cloneRange();\n  range.collapse(before);\n  range.insertNode(node);\n  range.detach();\n\n  return node;\n};\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.surroundWithNodes = function(\n    startNode, endNode) {\n  var win = goog.dom.getWindow(goog.dom.getOwnerDocument(this.getStartNode()));\n  /** @suppress {missingRequire} */\n  var selectionRange = goog.dom.Range.createFromWindow(win);\n  if (selectionRange) {\n    var sNode = selectionRange.getStartNode();\n    var eNode = selectionRange.getEndNode();\n    var sOffset = selectionRange.getStartOffset();\n    var eOffset = selectionRange.getEndOffset();\n  }\n\n  var clone1 = this.range_.cloneRange();\n  var clone2 = this.range_.cloneRange();\n\n  clone1.collapse(false);\n  clone2.collapse(true);\n\n  clone1.insertNode(endNode);\n  clone2.insertNode(startNode);\n\n  clone1.detach();\n  clone2.detach();\n\n  if (selectionRange) {\n    // There are 4 ways that surroundWithNodes can wreck the saved\n    // selection object. All of them happen when an inserted node splits\n    // a text node, and one of the end points of the selection was in the\n    // latter half of that text node.\n    //\n    // Clients of this library should use saveUsingCarets to avoid this\n    // problem. Unfortunately, saveUsingCarets uses this method, so that's\n    // not really an option for us. :( We just recompute the offsets.\n    var isInsertedNode = function(n) { return n == startNode || n == endNode; };\n    if (sNode.nodeType == goog.dom.NodeType.TEXT) {\n      while (sOffset > sNode.length) {\n        sOffset -= sNode.length;\n        do {\n          sNode = sNode.nextSibling;\n        } while (isInsertedNode(sNode));\n      }\n    }\n\n    if (eNode.nodeType == goog.dom.NodeType.TEXT) {\n      while (eOffset > eNode.length) {\n        eOffset -= eNode.length;\n        do {\n          eNode = eNode.nextSibling;\n        } while (isInsertedNode(eNode));\n      }\n    }\n\n    /** @suppress {missingRequire} */\n    goog.dom.Range\n        .createFromNodes(\n            sNode, /** @type {number} */ (sOffset), eNode,\n            /** @type {number} */ (eOffset))\n        .select();\n  }\n};\n\n\n/** @override */\ngoog.dom.browserrange.W3cRange.prototype.collapse = function(toStart) {\n  this.range_.collapse(toStart);\n};\n","^;",1579837703000,"^<",["^=",["^1>","~$goog.dom.NodeType","~$goog.string","^?","^[","~$goog.dom.browserrange.AbstractRange","~$goog.dom.RangeEndpoint","~$goog.array","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/browserrange/w3crange.js"],"^O",["^=",["~$goog.dom.browserrange.W3cRange"]],"^W",true,"^X",["^?","^2O","^1>","^2K","^2N","^12","^2M","^2L","^["]],["^ ","^3",[1579837703000],"^4","goog.structs.inversionmap.js","^5",["^6","goog/structs/inversionmap.js"],"^7","goog/structs/inversionmap.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides inversion and inversion map functionality for storing\n * integer ranges and corresponding values.\n *\n */\n\ngoog.provide('goog.structs.InversionMap');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\n\n\n\n/**\n * Maps ranges to values.\n * @param {Array<number>} rangeArray An array of monotonically\n *     increasing integer values, with at least one instance.\n * @param {Array<T>} valueArray An array of corresponding values.\n *     Length must be the same as rangeArray.\n * @param {boolean=} opt_delta If true, saves only delta from previous value.\n * @constructor\n * @template T\n */\ngoog.structs.InversionMap = function(rangeArray, valueArray, opt_delta) {\n  /**\n   * @protected {?Array<number>}\n   */\n  this.rangeArray = null;\n\n  goog.asserts.assert(\n      rangeArray.length == valueArray.length,\n      'rangeArray and valueArray must have the same length.');\n  this.storeInversion_(rangeArray, opt_delta);\n\n  /** @protected {Array<T>} */\n  this.values = valueArray;\n};\n\n\n/**\n * Stores the integers as ranges (half-open).\n * If delta is true, the integers are delta from the previous value and\n * will be restored to the absolute value.\n * When used as a set, even indices are IN, and odd are OUT.\n * @param {Array<number>} rangeArray An array of monotonically\n *     increasing integer values, with at least one instance.\n * @param {boolean=} opt_delta If true, saves only delta from previous value.\n * @private\n */\ngoog.structs.InversionMap.prototype.storeInversion_ = function(\n    rangeArray, opt_delta) {\n  this.rangeArray = rangeArray;\n\n  for (var i = 1; i < rangeArray.length; i++) {\n    if (rangeArray[i] == null) {\n      rangeArray[i] = rangeArray[i - 1] + 1;\n    } else if (opt_delta) {\n      rangeArray[i] += rangeArray[i - 1];\n    }\n  }\n};\n\n\n/**\n * Splices a range -> value map into this inversion map.\n * @param {Array<number>} rangeArray An array of monotonically\n *     increasing integer values, with at least one instance.\n * @param {Array<T>} valueArray An array of corresponding values.\n *     Length must be the same as rangeArray.\n * @param {boolean=} opt_delta If true, saves only delta from previous value.\n */\ngoog.structs.InversionMap.prototype.spliceInversion = function(\n    rangeArray, valueArray, opt_delta) {\n  // By building another inversion map, we build the arrays that we need\n  // to splice in.\n  var otherMap =\n      new goog.structs.InversionMap(rangeArray, valueArray, opt_delta);\n\n  // Figure out where to splice those arrays.\n  var startRange = otherMap.rangeArray[0];\n  var endRange =\n      /** @type {number} */ (goog.array.peek(otherMap.rangeArray));\n  var startSplice = this.getLeast(startRange);\n  var endSplice = this.getLeast(endRange);\n\n  // The inversion map works by storing the start points of ranges...\n  if (startRange != this.rangeArray[startSplice]) {\n    // ...if we're splicing in a start point that isn't already here,\n    // then we need to insert it after the insertion point.\n    startSplice++;\n  }  // otherwise we overwrite the insertion point.\n\n  this.rangeArray = this.rangeArray.slice(0, startSplice)\n                        .concat(otherMap.rangeArray)\n                        .concat(this.rangeArray.slice(endSplice + 1));\n  this.values = this.values.slice(0, startSplice)\n                    .concat(otherMap.values)\n                    .concat(this.values.slice(endSplice + 1));\n};\n\n\n/**\n * Gets the value corresponding to a number from the inversion map.\n * @param {number} intKey The number for which value needs to be retrieved\n *     from inversion map.\n * @return {T|null} Value retrieved from inversion map; null if not found.\n */\ngoog.structs.InversionMap.prototype.at = function(intKey) {\n  var index = this.getLeast(intKey);\n  if (index < 0) {\n    return null;\n  }\n  return this.values[index];\n};\n\n\n/**\n * Gets the largest index such that rangeArray[index] <= intKey from the\n * inversion map.\n * @param {number} intKey The probe for which rangeArray is searched.\n * @return {number} Largest index such that rangeArray[index] <= intKey.\n * @protected\n */\ngoog.structs.InversionMap.prototype.getLeast = function(intKey) {\n  var arr = this.rangeArray;\n  var low = 0;\n  var high = arr.length;\n  while (high - low > 8) {\n    var mid = (high + low) >> 1;\n    if (arr[mid] <= intKey) {\n      low = mid;\n    } else {\n      high = mid;\n    }\n  }\n  for (; low < high; ++low) {\n    if (intKey < arr[low]) {\n      break;\n    }\n  }\n  return low - 1;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^?","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/inversionmap.js"],"^O",["^=",["~$goog.structs.InversionMap"]],"^W",true,"^X",["^?","^2O","^1L"]],["^ ","^3",[1579837703000],"^4","goog.ui.inputdatepicker.js","^5",["^6","goog/ui/inputdatepicker.js"],"^7","goog/ui/inputdatepicker.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Input Date Picker implementation.  Pairs a\n * goog.ui.PopupDatePicker with an input element and handles the input from\n * either.\n *\n * @see ../demos/inputdatepicker.html\n */\n\ngoog.provide('goog.ui.InputDatePicker');\n\ngoog.require('goog.date.DateTime');\ngoog.require('goog.dom');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.i18n.DateTimeParse');\ngoog.require('goog.string');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.DatePicker');\n/** @suppress {extraRequire} */\ngoog.require('goog.ui.LabelInput');\ngoog.require('goog.ui.PopupBase');\ngoog.require('goog.ui.PopupDatePicker');\n\n\n\n/**\n * Input date picker widget.\n *\n * @param {goog.i18n.DateTimeFormat} dateTimeFormatter A formatter instance\n *     used to format the date picker's date for display in the input element.\n * @param {goog.i18n.DateTimeParse} dateTimeParser A parser instance used to\n *     parse the input element's string as a date to set the picker.\n * @param {goog.ui.DatePicker=} opt_datePicker Optional DatePicker.  This\n *     enables the use of a custom date-picker instance.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @extends {goog.ui.Component}\n * @constructor\n */\ngoog.ui.InputDatePicker = function(\n    dateTimeFormatter, dateTimeParser, opt_datePicker, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  this.dateTimeFormatter_ = dateTimeFormatter;\n  this.dateTimeParser_ = dateTimeParser;\n\n  this.popupDatePicker_ =\n      new goog.ui.PopupDatePicker(opt_datePicker, opt_domHelper);\n  this.addChild(this.popupDatePicker_);\n  this.popupDatePicker_.setAllowAutoFocus(false);\n};\ngoog.inherits(goog.ui.InputDatePicker, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.InputDatePicker);\n\n\n/**\n * Used to format the date picker's date for display in the input element.\n * @type {?goog.i18n.DateTimeFormat}\n * @private\n */\ngoog.ui.InputDatePicker.prototype.dateTimeFormatter_ = null;\n\n\n/**\n * Used to parse the input element's string as a date to set the picker.\n * @type {?goog.i18n.DateTimeParse}\n * @private\n */\ngoog.ui.InputDatePicker.prototype.dateTimeParser_ = null;\n\n\n/**\n * The instance of goog.ui.PopupDatePicker used to pop up and select the date.\n * @type {?goog.ui.PopupDatePicker}\n * @private\n */\ngoog.ui.InputDatePicker.prototype.popupDatePicker_ = null;\n\n\n/**\n * The element that the PopupDatePicker should be parented to. Defaults to the\n * body element of the page.\n * @type {?Element}\n * @private\n */\ngoog.ui.InputDatePicker.prototype.popupParentElement_ = null;\n\n\n/**\n * Returns the PopupDatePicker's internal DatePicker instance.  This can be\n * used to customize the date picker's styling.\n *\n * @return {goog.ui.DatePicker} The internal DatePicker instance.\n */\ngoog.ui.InputDatePicker.prototype.getDatePicker = function() {\n  return this.popupDatePicker_.getDatePicker();\n};\n\n\n/**\n * Returns the PopupDatePicker instance.\n *\n * @return {goog.ui.PopupDatePicker} Popup instance.\n */\ngoog.ui.InputDatePicker.prototype.getPopupDatePicker = function() {\n  return this.popupDatePicker_;\n};\n\n\n/**\n * Returns the selected date, if any.  Compares the dates from the date picker\n * and the input field, causing them to be synced if different.\n * @return {goog.date.DateTime} The selected date, if any.\n */\ngoog.ui.InputDatePicker.prototype.getDate = function() {\n\n  // The user expectation is that the date be whatever the input shows.\n  // This method biases towards the input value to conform to that expectation.\n\n  var inputDate = this.getInputValueAsDate_();\n  var pickerDate = this.popupDatePicker_.getDate();\n\n  if (inputDate && pickerDate) {\n    if (!inputDate.equals(pickerDate)) {\n      this.popupDatePicker_.setDate(inputDate);\n    }\n  } else {\n    this.popupDatePicker_.setDate(null);\n  }\n\n  return inputDate;\n};\n\n\n/**\n * Sets the selected date.  See goog.ui.PopupDatePicker.setDate().\n * @param {goog.date.Date} date The date to set.\n */\ngoog.ui.InputDatePicker.prototype.setDate = function(date) {\n  this.popupDatePicker_.setDate(date);\n};\n\n\n/**\n * Sets the value of the input element.  This can be overridden to support\n * alternative types of input setting.\n * @param {string} value The value to set.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.InputDatePicker.prototype.setInputValue = function(value) {\n  var el = this.getElement();\n  if (el.labelInput_) {\n    var labelInput = /** @type {goog.ui.LabelInput} */ (el.labelInput_);\n    labelInput.setValue(value);\n  } else {\n    el.value = value;\n  }\n};\n\n\n/**\n * Returns the value of the input element.  This can be overridden to support\n * alternative types of input getting.\n * @return {string} The input value.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.InputDatePicker.prototype.getInputValue = function() {\n  var el = this.getElement();\n  if (el.labelInput_) {\n    var labelInput = /** @type {goog.ui.LabelInput} */ (el.labelInput_);\n    return labelInput.getValue();\n  } else {\n    return el.value;\n  }\n};\n\n\n/**\n * Sets the value of the input element from date object.\n *\n * @param {?goog.date.Date} date The value to set.\n * @private\n */\ngoog.ui.InputDatePicker.prototype.setInputValueAsDate_ = function(date) {\n  this.setInputValue(date ? this.dateTimeFormatter_.format(date) : '');\n};\n\n\n/**\n * Gets the input element value and attempts to parse it as a date.\n *\n * @return {goog.date.DateTime} The date object is returned if the parse\n *      is successful, null is returned on failure.\n * @private\n */\ngoog.ui.InputDatePicker.prototype.getInputValueAsDate_ = function() {\n  var value = goog.string.trim(this.getInputValue());\n  if (value) {\n    var date = new goog.date.DateTime();\n    // DateTime needed as parse assumes it can call getHours(), getMinutes(),\n    // etc, on the date if hours and minutes aren't defined.\n    if (this.dateTimeParser_.strictParse(value, date) > 0) {\n      // Parser with YYYY format string will interpret 1 as year 1 A.D.\n      // However, datepicker.setDate() method will change it into 1901.\n      // Same is true for any other pattern when number entered by user is\n      // different from number of digits in the pattern. (YY and 1 will be 1AD).\n      // See i18n/datetimeparse.js\n      // Conversion happens in goog.date.Date/DateTime constructor\n      // when it calls new Date(year...). See ui/datepicker.js.\n      return date;\n    }\n  }\n\n  return null;\n};\n\n\n/**\n * Creates an input element for use with the popup date picker.\n * @override\n */\ngoog.ui.InputDatePicker.prototype.createDom = function() {\n  this.setElementInternal(\n      this.getDomHelper().createDom(\n          goog.dom.TagName.INPUT, {'type': goog.dom.InputType.TEXT}));\n  this.popupDatePicker_.createDom();\n};\n\n\n/**\n * Sets the element that the PopupDatePicker should be parented to. If not set,\n * defaults to the body element of the page.\n * @param {Element} el The element that the PopupDatePicker should be parented\n *     to.\n */\ngoog.ui.InputDatePicker.prototype.setPopupParentElement = function(el) {\n  this.popupParentElement_ = el;\n};\n\n\n/** @override */\ngoog.ui.InputDatePicker.prototype.enterDocument = function() {\n  // this.popupDatePicker_ has been added as a child even though it isn't really\n  // a child (since its root element is not within InputDatePicker's DOM tree).\n  // The PopupDatePicker will have its enterDocument method called as a result\n  // of calling the superClass's enterDocument method. The PopupDatePicker needs\n  // to be attached to the document *before* calling enterDocument so that when\n  // PopupDatePicker decorates its element as a DatePicker, the element will be\n  // in the document and enterDocument will be called for the DatePicker. Having\n  // the PopupDatePicker's element in the document before calling enterDocument\n  // will ensure that the event handlers for DatePicker are attached.\n  //\n  // An alternative could be to stop adding popupDatePicker_ as a child and\n  // instead keep a reference to it and sync some event handlers, etc. but\n  // appending the element to the document before calling enterDocument is a\n  // less intrusive option.\n  //\n  // See cl/100837907 for more context and the discussion around this decision.\n  (this.popupParentElement_ || this.getDomHelper().getDocument().body)\n      .appendChild(this.popupDatePicker_.getElement());\n\n  goog.ui.InputDatePicker.superClass_.enterDocument.call(this);\n  var el = this.getElement();\n\n  this.popupDatePicker_.attach(el);\n\n  // Set the date picker to have the input's initial value, if any.\n  this.popupDatePicker_.setDate(this.getInputValueAsDate_());\n\n  var handler = this.getHandler();\n  handler.listen(\n      this.popupDatePicker_, goog.ui.DatePicker.Events.CHANGE,\n      this.onDateChanged_);\n  handler.listen(\n      this.popupDatePicker_, goog.ui.PopupBase.EventType.SHOW, this.onPopup_);\n};\n\n\n/** @override */\ngoog.ui.InputDatePicker.prototype.exitDocument = function() {\n  goog.ui.InputDatePicker.superClass_.exitDocument.call(this);\n  var el = this.getElement();\n\n  this.popupDatePicker_.detach(el);\n  this.popupDatePicker_.exitDocument();\n  goog.dom.removeNode(this.popupDatePicker_.getElement());\n};\n\n\n/** @override */\ngoog.ui.InputDatePicker.prototype.decorateInternal = function(element) {\n  goog.ui.InputDatePicker.superClass_.decorateInternal.call(this, element);\n\n  this.popupDatePicker_.createDom();\n};\n\n\n/** @override */\ngoog.ui.InputDatePicker.prototype.disposeInternal = function() {\n  goog.ui.InputDatePicker.superClass_.disposeInternal.call(this);\n  this.popupDatePicker_.dispose();\n  this.popupDatePicker_ = null;\n  this.popupParentElement_ = null;\n};\n\n\n/**\n * See goog.ui.PopupDatePicker.showPopup().\n * @param {Element} element Reference element for displaying the popup -- popup\n *     will appear at the bottom-left corner of this element.\n */\ngoog.ui.InputDatePicker.prototype.showForElement = function(element) {\n  this.popupDatePicker_.showPopup(element);\n};\n\n\n/**\n * See goog.ui.PopupDatePicker.hidePopup().\n */\ngoog.ui.InputDatePicker.prototype.hidePopup = function() {\n  this.popupDatePicker_.hidePopup();\n};\n\n\n/**\n * Event handler for popup date picker popup events.\n *\n * @param {goog.events.Event} e popup event.\n * @private\n */\ngoog.ui.InputDatePicker.prototype.onPopup_ = function(e) {\n  var inputValueAsDate = this.getInputValueAsDate_();\n  this.setDate(inputValueAsDate);\n  // don't overwrite the input value with empty date if input is not valid\n  if (inputValueAsDate) {\n    this.setInputValueAsDate_(this.getDatePicker().getDate());\n  }\n};\n\n\n/**\n * Event handler for date change events.  Called when the date changes.\n *\n * @param {goog.ui.DatePickerEvent} e Date change event.\n * @private\n */\ngoog.ui.InputDatePicker.prototype.onDateChanged_ = function(e) {\n  this.setInputValueAsDate_(e.date);\n};\n","^;",1579837703000,"^<",["^=",["^1>","~$goog.ui.DatePicker","~$goog.ui.PopupBase","^2L","^1P","^1U","~$goog.ui.PopupDatePicker","^?","~$goog.i18n.DateTimeParse","~$goog.date.DateTime","~$goog.ui.LabelInput","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/inputdatepicker.js"],"^O",["^=",["~$goog.ui.InputDatePicker"]],"^W",true,"^X",["^?","^2V","^1>","^1U","^12","^2U","^2L","^1P","^2R","^2W","^2S","^2T"]],["^ ","^3",[1579837703000],"^4","goog.testing.fs.progressevent.js","^5",["^6","goog/testing/fs/progressevent.js"],"^7","goog/testing/fs/progressevent.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Mock ProgressEvent object.\n *\n */\n\ngoog.setTestOnly('goog.testing.fs.ProgressEvent');\ngoog.provide('goog.testing.fs.ProgressEvent');\n\ngoog.forwardDeclare('goog.fs.FileReader.EventType');\ngoog.forwardDeclare('goog.fs.FileSaver.EventType');\ngoog.require('goog.events.Event');\n\n\n\n/**\n * A mock progress event.\n *\n * @param {!goog.fs.FileSaver.EventType|!goog.fs.FileReader.EventType} type\n *     Event type.\n * @param {number} loaded The number of bytes processed.\n * @param {number} total The total data that was to be processed, in bytes.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.testing.fs.ProgressEvent = function(type, loaded, total) {\n  goog.testing.fs.ProgressEvent.base(this, 'constructor', type);\n\n  /**\n   * The number of bytes processed.\n   * @type {number}\n   * @private\n   */\n  this.loaded_ = loaded;\n\n\n  /**\n   * The total data that was to be procesed, in bytes.\n   * @type {number}\n   * @private\n   */\n  this.total_ = total;\n};\ngoog.inherits(goog.testing.fs.ProgressEvent, goog.events.Event);\n\n\n/**\n * @see {goog.fs.ProgressEvent#isLengthComputable}\n * @return {boolean} True if the length is known.\n */\ngoog.testing.fs.ProgressEvent.prototype.isLengthComputable = function() {\n  return true;\n};\n\n\n/**\n * @see {goog.fs.ProgressEvent#getLoaded}\n * @return {number} The number of bytes loaded or written.\n */\ngoog.testing.fs.ProgressEvent.prototype.getLoaded = function() {\n  return this.loaded_;\n};\n\n\n/**\n * @see {goog.fs.ProgressEvent#getTotal}\n * @return {number} The total bytes to load or write.\n */\ngoog.testing.fs.ProgressEvent.prototype.getTotal = function() {\n  return this.total_;\n};\n","^;",1579837703000,"^<",["^=",["^?","~$goog.events.Event"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/fs/progressevent.js"],"^O",["^=",["~$goog.testing.fs.ProgressEvent"]],"^W",true,"^X",["^?","^2Y"]],["^ ","^3",[1579837703000],"^4","goog.testing.benchmark.js","^5",["^6","goog/testing/benchmark.js"],"^7","goog/testing/benchmark.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.testing.benchmark');\ngoog.setTestOnly('goog.testing.benchmark');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.testing.PerformanceTable');\ngoog.require('goog.testing.PerformanceTimer');\ngoog.require('goog.testing.TestCase');\n\n\n/**\n * Run the benchmarks.\n * @private\n */\ngoog.testing.benchmark.run_ = function() {\n  // Parse the 'times' query parameter if it's set.\n  var times = 200;\n  var search = window.location.search;\n  var timesMatch = search.match(/(?:\\?|&)times=([^?&]+)/i);\n  if (timesMatch) {\n    times = Number(timesMatch[1]);\n  }\n\n  var prefix = 'benchmark';\n\n  // First, get the functions.\n  var testSources = goog.testing.TestCase.getGlobals();\n\n  var benchmarks = {};\n  var names = [];\n\n  for (var i = 0; i < testSources.length; i++) {\n    var testSource = testSources[i];\n    for (var name in testSource) {\n      if ((new RegExp('^' + prefix)).test(name)) {\n        var ref;\n        try {\n          ref = testSource[name];\n        } catch (ex) {\n          // NOTE(brenneman): When running tests from a file:// URL on Firefox\n          // 3.5 for Windows, any reference to window.sessionStorage raises\n          // an \"Operation is not supported\" exception. Ignore any exceptions\n          // raised by simply accessing global properties.\n          ref = undefined;\n        }\n\n        if (goog.isFunction(ref)) {\n          benchmarks[name] = ref;\n          names.push(name);\n        }\n      }\n    }\n  }\n\n  document.body.appendChild(\n      goog.dom.createTextNode(\n          'Running ' + names.length + ' benchmarks ' + times + ' times each.'));\n  document.body.appendChild(goog.dom.createElement(goog.dom.TagName.BR));\n\n  names.sort();\n\n  // Build a table and timer.\n  var performanceTimer = new goog.testing.PerformanceTimer(times);\n  performanceTimer.setDiscardOutliers(true);\n\n  var performanceTable =\n      new goog.testing.PerformanceTable(document.body, performanceTimer, 2);\n\n  // Next, run the benchmarks.\n  for (var i = 0; i < names.length; i++) {\n    performanceTable.run(benchmarks[names[i]], names[i]);\n  }\n};\n\n\n/**\n * Onload handler that runs the benchmarks.\n * @param {Event} e The event object.\n */\nwindow.onload = function(e) {\n  goog.testing.benchmark.run_();\n};\n","^;",1579837703000,"^<",["^=",["^1>","^?","~$goog.testing.PerformanceTable","~$goog.testing.TestCase","~$goog.testing.PerformanceTimer","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/benchmark.js"],"^O",["^=",["~$goog.testing.benchmark"]],"^W",true,"^X",["^?","^1>","^12","^2[","^31","^30"]],["^ ","^3",[1579837703000],"^4","goog.editor.plugins.headerformatter.js","^5",["^6","goog/editor/plugins/headerformatter.js"],"^7","goog/editor/plugins/headerformatter.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Handles applying header styles to text.\n *\n */\n\ngoog.provide('goog.editor.plugins.HeaderFormatter');\n\ngoog.require('goog.editor.Command');\ngoog.require('goog.editor.Plugin');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Applies header styles to text.\n * @constructor\n * @extends {goog.editor.Plugin}\n * @final\n */\ngoog.editor.plugins.HeaderFormatter = function() {\n  goog.editor.Plugin.call(this);\n};\ngoog.inherits(goog.editor.plugins.HeaderFormatter, goog.editor.Plugin);\n\n\n/** @override */\ngoog.editor.plugins.HeaderFormatter.prototype.getTrogClassId = function() {\n  return 'HeaderFormatter';\n};\n\n// TODO(user):  Move execCommand functionality from basictextformatter into\n// here for headers.  I'm not doing this now because it depends on the\n// switch statements in basictextformatter and we'll need to abstract that out\n// in order to separate out any of the functions from basictextformatter.\n\n\n/**\n * Commands that can be passed as the optional argument to execCommand.\n * @enum {string}\n */\ngoog.editor.plugins.HeaderFormatter.HEADER_COMMAND = {\n  H1: 'H1',\n  H2: 'H2',\n  H3: 'H3',\n  H4: 'H4'\n};\n\n\n/**\n * @override\n */\ngoog.editor.plugins.HeaderFormatter.prototype.handleKeyboardShortcut = function(\n    e, key, isModifierPressed) {\n  if (!isModifierPressed) {\n    return false;\n  }\n  var command = null;\n  switch (key) {\n    case '1':\n      command = goog.editor.plugins.HeaderFormatter.HEADER_COMMAND.H1;\n      break;\n    case '2':\n      command = goog.editor.plugins.HeaderFormatter.HEADER_COMMAND.H2;\n      break;\n    case '3':\n      command = goog.editor.plugins.HeaderFormatter.HEADER_COMMAND.H3;\n      break;\n    case '4':\n      command = goog.editor.plugins.HeaderFormatter.HEADER_COMMAND.H4;\n      break;\n  }\n  if (command) {\n    this.getFieldObject().execCommand(\n        goog.editor.Command.FORMAT_BLOCK, command);\n    // Prevent default isn't enough to cancel tab navigation in FF.\n    if (goog.userAgent.GECKO) {\n      e.stopPropagation();\n    }\n    return true;\n  }\n  return false;\n};\n","^;",1579837703000,"^<",["^=",["~$goog.editor.Command","^?","^[","^11"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/headerformatter.js"],"^O",["^=",["~$goog.editor.plugins.HeaderFormatter"]],"^W",true,"^X",["^?","^33","^11","^["]],["^ ","^3",[1579837703000],"^4","goog.testing.jstdtestcaseadapter.js","^5",["^6","goog/testing/jstdtestcaseadapter.js"],"^7","goog/testing/jstdtestcaseadapter.js","^8","^9","^:","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Conditionally add \"adapter\" methods to allow JSTD test cases\n * to run under the Closure Test Runner.  The goal is to allow tests\n * to function regardless of the environment they are running under to allow\n * them to transition to the Closure test runner and allow JSTD runner to be\n * deprecated.\n */\ngoog.setTestOnly('goog.testing.JsTdTestCaseAdapter');\ngoog.provide('goog.testing.JsTdTestCaseAdapter');\n\ngoog.require('goog.async.run');\ngoog.require('goog.functions');\ngoog.require('goog.testing.JsTdAsyncWrapper');\ngoog.require('goog.testing.TestCase');\ngoog.require('goog.testing.jsunit');\n\n\n/**\n * @param {string} testCaseName The name of the test case.\n * @param {function(): boolean} condition A condition to determine whether to\n *     run the tests.\n * @param {?=} opt_proto An optional prototype object for the test case.\n * @param {boolean=} opt_isAsync Whether this test is an async test using the\n *     JSTD testing queue.\n * @return {!Function}\n * @private\n * @suppress {checkPrototypalTypes}\n */\ngoog.testing.JsTdTestCaseAdapter.TestCaseFactory_ = function(\n    testCaseName, condition, opt_proto, opt_isAsync) {\n  /** @constructor */\n  var T = function() {};\n  if (opt_proto) T.prototype = opt_proto;\n  T.displayName = testCaseName;\n\n  goog.async.run(function() {\n    var t = new T();\n    if (opt_isAsync) {\n      t = goog.testing.JsTdAsyncWrapper.convertToAsyncTestObj(t);\n    }\n    var testCase = new goog.testing.TestCase(testCaseName);\n    testCase.shouldRunTests = condition;\n    testCase.setTestObj(t);\n    testCase.autoDiscoverTests();\n    goog.testing.TestCase.initializeTestRunner(testCase, undefined);\n  });\n\n  return T;\n};\n\n\n/**\n * @param {string} testCaseName The name of the test case.\n * @param {?=} opt_proto An optional prototype object for the test case.\n * @return {!Function}\n * @private\n */\ngoog.testing.JsTdTestCaseAdapter.TestCase_ = function(testCaseName, opt_proto) {\n  return goog.testing.JsTdTestCaseAdapter.TestCaseFactory_(\n      testCaseName, goog.functions.TRUE, opt_proto);\n};\n\n\n/**\n * @param {string} testCaseName The name of the test case.\n * @param {function(): boolean} condition A condition to determine whether to\n *     run the tests.\n * @param {?=} opt_proto An optional prototype object for the test case.\n * @return {!Function}\n * @private\n */\ngoog.testing.JsTdTestCaseAdapter.ConditionalTestCase_ = function(\n    testCaseName, condition, opt_proto) {\n  return goog.testing.JsTdTestCaseAdapter.TestCaseFactory_(\n      testCaseName, condition, opt_proto);\n};\n\n\n/**\n * @param {string} testCaseName The name of the test case.\n * @param {?=} opt_proto An optional prototype object for the test case.\n * @return {!Function}\n * @private\n */\ngoog.testing.JsTdTestCaseAdapter.AsyncTestCase_ = function(\n    testCaseName, opt_proto) {\n  return goog.testing.JsTdTestCaseAdapter.TestCaseFactory_(\n      testCaseName, goog.functions.TRUE, opt_proto, true);\n};\n\n\n/**\n * @param {string} testCaseName The name of the test case.\n * @param {function(): boolean} condition A condition to determine whether to\n *     run the tests.\n * @param {?=} opt_proto An optional prototype object for the test case.\n * @return {!Function}\n * @private\n */\ngoog.testing.JsTdTestCaseAdapter.AsyncConditionalTestCase_ = function(\n    testCaseName, condition, opt_proto) {\n  return goog.testing.JsTdTestCaseAdapter.TestCaseFactory_(\n      testCaseName, condition, opt_proto, true);\n};\n\n\n// --- conditionally add polyfills for the basic JSTD API ---\n\n\n/** @suppress {duplicate} */\nvar TestCase = TestCase || goog.testing.JsTdTestCaseAdapter.TestCase_;\n\n\n/** @suppress {duplicate} */\nvar ConditionalTestCase = ConditionalTestCase ||\n    goog.testing.JsTdTestCaseAdapter.ConditionalTestCase_;\n\n\n/** @suppress {duplicate} */\nvar AsyncTestCase =\n    AsyncTestCase || goog.testing.JsTdTestCaseAdapter.AsyncTestCase_;\n\n\n/** @suppress {duplicate} */\nvar AsyncConditionalTestCase = AsyncConditionalTestCase ||\n    goog.testing.JsTdTestCaseAdapter.AsyncConditionalTestCase_;\n\n\n/** @suppress {duplicate} */\nvar ConditionalAsyncTestCase = ConditionalAsyncTestCase ||\n    goog.testing.JsTdTestCaseAdapter.AsyncConditionalTestCase_;\n\n\n// The API is also available under the jstestdriver namespace.\n\n/** @suppress {duplicate} */\nvar jstestdriver = jstestdriver || {};\nif (!jstestdriver.testCaseManager) {\n  /** A jstestdriver API polyfill. */\n  jstestdriver.testCaseManager = {\n    TestCase: TestCase,\n    ConditionalTestCase: ConditionalTestCase,\n    AsyncTestCase: AsyncTestCase,\n    AsyncConditionalTestCase: AsyncConditionalTestCase,\n    ConditionalAsyncTestCase: ConditionalAsyncTestCase\n  };\n}\n","^;",1579837703000,"^<",["^=",["^Y","~$goog.async.run","^?","~$goog.testing.JsTdAsyncWrapper","~$goog.testing.jsunit","^30"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/jstdtestcaseadapter.js"],"^O",["^=",["~$goog.testing.JsTdTestCaseAdapter"]],"^W",true,"^X",["^?","^35","^Y","^36","^30","^37"]],["^ ","^3",[1579837703000],"^4","goog.vec.float32array.js","^5",["^6","goog/vec/float32array.js"],"^7","goog/vec/float32array.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Supplies a Float32Array implementation that implements\n *     most of the Float32Array spec and that can be used when a built-in\n *     implementation is not available.\n *\n *     Note that if no existing Float32Array implementation is found then\n *     this class and all its public properties are exported as Float32Array.\n *\n *     Adding support for the other TypedArray classes here does not make sense\n *     since this vector math library only needs Float32Array.\n *\n */\ngoog.provide('goog.vec.Float32Array');\n\n\n\n/**\n * Constructs a new Float32Array. The new array is initialized to all zeros.\n *\n * @param {goog.vec.Float32Array|Array|ArrayBuffer|number} p0\n *     The length of the array, or an array to initialize the contents of the\n *     new Float32Array.\n * @constructor\n * @implements {IArrayLike<number>}\n * @final\n */\ngoog.vec.Float32Array = function(p0) {\n  /** @type {number} */\n  this.length = /** @type {number} */ (p0.length || p0);\n  for (let i = 0; i < this.length; i++) {\n    this[i] = p0[i] || 0;\n  }\n};\n\n\n/**\n * The number of bytes in an element (as defined by the Typed Array\n * specification).\n *\n * @type {number}\n */\ngoog.vec.Float32Array.BYTES_PER_ELEMENT = 4;\n\n\n/**\n * The number of bytes in an element (as defined by the Typed Array\n * specification).\n *\n * @type {number}\n */\ngoog.vec.Float32Array.prototype.BYTES_PER_ELEMENT = 4;\n\n\n/**\n * Sets elements of the array.\n * @param {Array<number>|Float32Array} values The array of values.\n * @param {number=} opt_offset The offset in this array to start.\n */\ngoog.vec.Float32Array.prototype.set = function(values, opt_offset) {\n  opt_offset = opt_offset || 0;\n  for (let i = 0; i < values.length && opt_offset + i < this.length; i++) {\n    this[opt_offset + i] = values[i];\n  }\n};\n\n\n/**\n * Creates a string representation of this array.\n * @return {string} The string version of this array.\n * @override\n */\ngoog.vec.Float32Array.prototype.toString = Array.prototype.join;\n\n\n/**\n * Note that we cannot implement the subarray() or (deprecated) slice()\n * methods properly since doing so would require being able to overload\n * the [] operator which is not possible in javascript.  So we leave\n * them unimplemented.  Any attempt to call these methods will just result\n * in a javascript error since we leave them undefined.\n */\n\n\n/**\n * If no existing Float32Array implementation is found then we export\n * goog.vec.Float32Array as Float32Array.\n */\nif (typeof Float32Array == 'undefined') {\n  goog.exportProperty(\n      goog.vec.Float32Array, 'BYTES_PER_ELEMENT',\n      goog.vec.Float32Array.BYTES_PER_ELEMENT);\n  goog.exportProperty(\n      goog.vec.Float32Array.prototype, 'BYTES_PER_ELEMENT',\n      goog.vec.Float32Array.prototype.BYTES_PER_ELEMENT);\n  goog.exportProperty(\n      goog.vec.Float32Array.prototype, 'set',\n      goog.vec.Float32Array.prototype.set);\n  goog.exportProperty(\n      goog.vec.Float32Array.prototype, 'toString',\n      goog.vec.Float32Array.prototype.toString);\n  goog.exportSymbol('Float32Array', goog.vec.Float32Array);\n}\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/float32array.js"],"^O",["^=",["~$goog.vec.Float32Array"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.editor.plugins.removeformatting.js","^5",["^6","goog/editor/plugins/removeformatting.js"],"^7","goog/editor/plugins/removeformatting.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved.\n\n/**\n * @fileoverview Plugin to handle Remove Formatting.\n *\n */\n\ngoog.provide('goog.editor.plugins.RemoveFormatting');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.Range');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.editor.BrowserFeature');\ngoog.require('goog.editor.Plugin');\ngoog.require('goog.editor.node');\ngoog.require('goog.editor.range');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A plugin to handle removing formatting from selected text.\n * @constructor\n * @extends {goog.editor.Plugin}\n * @final\n */\ngoog.editor.plugins.RemoveFormatting = function() {\n  goog.editor.Plugin.call(this);\n\n  /**\n   * Optional function to perform remove formatting in place of the\n   * provided removeFormattingWorker_.\n   * @type {?function(string): string}\n   * @private\n   */\n  this.optRemoveFormattingFunc_ = null;\n\n  /**\n   * The key that this plugin triggers on when pressed with the platform\n   * modifier key. Can be set by calling {@link #setKeyboardShortcutKey}.\n   * @type {string}\n   * @private\n   */\n  this.keyboardShortcutKey_ = ' ';\n};\ngoog.inherits(goog.editor.plugins.RemoveFormatting, goog.editor.Plugin);\n\n\n/**\n * The editor command this plugin in handling.\n * @type {string}\n */\ngoog.editor.plugins.RemoveFormatting.REMOVE_FORMATTING_COMMAND =\n    '+removeFormat';\n\n\n/**\n * Regular expression that matches a block tag name.\n * @type {RegExp}\n * @private\n */\ngoog.editor.plugins.RemoveFormatting.BLOCK_RE_ =\n    /^(DIV|TR|LI|BLOCKQUOTE|H\\d|PRE|XMP)/;\n\n\n/**\n * Appends a new line to a string buffer.\n * @param {Array<string>} sb The string buffer to add to.\n * @private\n */\ngoog.editor.plugins.RemoveFormatting.appendNewline_ = function(sb) {\n  sb.push('<br>');\n};\n\n\n/**\n * Create a new range delimited by the start point of the first range and\n * the end point of the second range.\n * @param {goog.dom.AbstractRange} startRange Use the start point of this\n *    range as the beginning of the new range.\n * @param {goog.dom.AbstractRange} endRange Use the end point of this\n *    range as the end of the new range.\n * @return {!goog.dom.AbstractRange} The new range.\n * @private\n */\ngoog.editor.plugins.RemoveFormatting.createRangeDelimitedByRanges_ = function(\n    startRange, endRange) {\n  return goog.dom.Range.createFromNodes(\n      startRange.getStartNode(), startRange.getStartOffset(),\n      endRange.getEndNode(), endRange.getEndOffset());\n};\n\n\n/** @override */\ngoog.editor.plugins.RemoveFormatting.prototype.getTrogClassId = function() {\n  return 'RemoveFormatting';\n};\n\n\n/** @override */\ngoog.editor.plugins.RemoveFormatting.prototype.isSupportedCommand = function(\n    command) {\n  return command ==\n      goog.editor.plugins.RemoveFormatting.REMOVE_FORMATTING_COMMAND;\n};\n\n\n/** @override */\ngoog.editor.plugins.RemoveFormatting.prototype.execCommandInternal = function(\n    command, var_args) {\n  if (command ==\n      goog.editor.plugins.RemoveFormatting.REMOVE_FORMATTING_COMMAND) {\n    this.removeFormatting_();\n  }\n};\n\n\n/** @override */\ngoog.editor.plugins.RemoveFormatting.prototype.handleKeyboardShortcut =\n    function(e, key, isModifierPressed) {\n  if (!isModifierPressed) {\n    return false;\n  }\n\n  // Disregard the shortcut if more than one modifier key is pressed\n  // because the user may have intended a different shortcut (for example OSX\n  // uses ctrlKey + metaKey + space to open the emoji picker).\n  if (e.metaKey && e.ctrlKey) {\n    return false;\n  }\n\n  // Disregard the shortcut if the shift key is also pressed because the user\n  // may have intended a different shortcut (for example Chrome OS uses shiftKey\n  // + ctrlKey + space to toggle input languages.\n  if (e.shiftKey) {\n    return false;\n  }\n\n  if (key == this.keyboardShortcutKey_) {\n    this.getFieldObject().execCommand(\n        goog.editor.plugins.RemoveFormatting.REMOVE_FORMATTING_COMMAND);\n    return true;\n  }\n\n  return false;\n};\n\n\n/**\n * @param {string} key\n */\ngoog.editor.plugins.RemoveFormatting.prototype.setKeyboardShortcutKey =\n    function(key) {\n  this.keyboardShortcutKey_ = key;\n};\n\n\n/**\n * Removes formatting from the current selection.  Removes basic formatting\n * (B/I/U) using the browser's execCommand.  Then extracts the html from the\n * selection to convert, calls either a client's specified removeFormattingFunc\n * callback or trogedit's general built-in removeFormattingWorker_,\n * and then replaces the current selection with the converted text.\n * @private\n */\ngoog.editor.plugins.RemoveFormatting.prototype.removeFormatting_ = function() {\n  var range = this.getFieldObject().getRange();\n  if (range.isCollapsed()) {\n    return;\n  }\n\n  // Get the html to format and send it off for formatting. Built in\n  // removeFormat only strips some inline elements and some inline CSS styles\n  var convFunc = this.optRemoveFormattingFunc_ ||\n      goog.bind(this.removeFormattingWorker_, this);\n  this.convertSelectedHtmlText_(convFunc);\n\n  // Do the execCommand last as it needs block elements removed to work\n  // properly on background/fontColor in FF. There are, unfortunately, still\n  // cases where background/fontColor are not removed here.\n  var doc = this.getFieldDomHelper().getDocument();\n  doc.execCommand('RemoveFormat', false, undefined);\n\n  if (goog.editor.BrowserFeature.ADDS_NBSPS_IN_REMOVE_FORMAT) {\n    // WebKit converts spaces to non-breaking spaces when doing a RemoveFormat.\n    // See: https://bugs.webkit.org/show_bug.cgi?id=14062\n    this.convertSelectedHtmlText_(function(text) {\n      // This loses anything that might have legitimately been a non-breaking\n      // space, but that's better than the alternative of only having non-\n      // breaking spaces.\n      // Old versions of WebKit (Safari 3, Chrome 1) incorrectly match /u00A0\n      // and newer versions properly match &nbsp;.\n      var nbspRegExp =\n          goog.userAgent.isVersionOrHigher('528') ? /&nbsp;/g : /\\u00A0/g;\n      return text.replace(nbspRegExp, ' ');\n    });\n  }\n};\n\n\n/**\n * Finds the nearest ancestor of the node that is a table.\n * @param {Node} nodeToCheck Node to search from.\n * @return {Node} The table, or null if one was not found.\n * @private\n */\ngoog.editor.plugins.RemoveFormatting.prototype.getTableAncestor_ = function(\n    nodeToCheck) {\n  var fieldElement = this.getFieldObject().getElement();\n  while (nodeToCheck && nodeToCheck != fieldElement) {\n    if (nodeToCheck.tagName == goog.dom.TagName.TABLE) {\n      return nodeToCheck;\n    }\n    nodeToCheck = nodeToCheck.parentNode;\n  }\n  return null;\n};\n\n\n/**\n * Replaces the contents of the selection with html. Does its best to maintain\n * the original selection. Also does its best to result in a valid DOM.\n *\n * TODO(user): See if there's any way to make this work on Ranges, and then\n * move it into goog.editor.range. The Firefox implementation uses execCommand\n * on the document, so must work on the actual selection.\n *\n * @param {string} html The html string to insert into the range.\n * @private\n */\ngoog.editor.plugins.RemoveFormatting.prototype.pasteHtml_ = function(html) {\n  var range = this.getFieldObject().getRange();\n\n  var dh = this.getFieldDomHelper();\n  // Use markers to set the extent of the selection so that we can reselect it\n  // afterwards. This works better than builtin range manipulation in FF and IE\n  // because their implementations are so self-inconsistent and buggy.\n  var startSpanId = goog.string.createUniqueString();\n  var endSpanId = goog.string.createUniqueString();\n  html = '<span id=\"' + startSpanId + '\"></span>' + html + '<span id=\"' +\n      endSpanId + '\"></span>';\n  var dummyNodeId = goog.string.createUniqueString();\n  var dummySpanText = '<span id=\"' + dummyNodeId + '\"></span>';\n\n  if (goog.editor.BrowserFeature.HAS_IE_RANGES) {\n    // IE's selection often doesn't include the outermost tags.\n    // We want to use pasteHTML to replace the range contents with the newly\n    // unformatted text, so we have to check to make sure we aren't just\n    // pasting into some stray tags.  To do this, we first clear out the\n    // contents of the range and then delete all empty nodes parenting the now\n    // empty range. This way, the pasted contents are never re-embedded into\n    // formated nodes. Pasting purely empty html does not work, since IE moves\n    // the selection inside the next node, so we insert a dummy span.\n    var textRange = range.getTextRange(0).getBrowserRangeObject();\n    textRange.pasteHTML(dummySpanText);\n    var parent;\n    while ((parent = textRange.parentElement()) &&\n           goog.editor.node.isEmpty(parent) &&\n           !goog.editor.node.isEditableContainer(parent)) {\n      var tag = parent.nodeName;\n      // We can't remove these table tags as it will invalidate the table dom.\n      if (tag == goog.dom.TagName.TD || tag == goog.dom.TagName.TR ||\n          tag == goog.dom.TagName.TH) {\n        break;\n      }\n\n      goog.dom.removeNode(parent);\n    }\n    textRange.pasteHTML(html);\n    var dummySpan = dh.getElement(dummyNodeId);\n    // If we entered the while loop above, the node has already been removed\n    // since it was a child of parent and parent was removed.\n    if (dummySpan) {\n      goog.dom.removeNode(dummySpan);\n    }\n  } else if (goog.editor.BrowserFeature.HAS_W3C_RANGES) {\n    // insertHtml and range.insertNode don't merge blocks correctly.\n    // (e.g. if your selection spans two paragraphs)\n    dh.getDocument().execCommand('insertImage', false, dummyNodeId);\n    var dummyImageNodePattern = new RegExp('<[^<]*' + dummyNodeId + '[^>]*>');\n    var parent = this.getFieldObject().getRange().getContainerElement();\n    if (parent.nodeType == goog.dom.NodeType.TEXT) {\n      // Opera sometimes returns a text node here.\n      // TODO(user): perhaps we should modify getParentContainer?\n      parent = parent.parentNode;\n    }\n\n    // We have to search up the DOM because in some cases, notably when\n    // selecting li's within a list, execCommand('insertImage') actually splits\n    // tags in such a way that parent that used to contain the selection does\n    // not contain inserted image.\n    while (!dummyImageNodePattern.test(parent.innerHTML)) {\n      parent = parent.parentNode;\n    }\n\n    // Like the IE case above, sometimes the selection does not include the\n    // outermost tags.  For Gecko, we have already expanded the range so that\n    // it does, so we can just replace the dummy image with the final html.\n    // For WebKit, we use the same approach as we do with IE  - we\n    // inject a dummy span where we will eventually place the contents, and\n    // remove parentNodes of the span while they are empty.\n\n    if (goog.userAgent.GECKO) {\n      // Escape dollars passed in second argument of String.proto.replace.\n      // And since we're using that to replace, we need to escape those as well,\n      // hence the 2*2 dollar signs.\n      goog.editor.node.replaceInnerHtml(\n          parent, parent.innerHTML.replace(\n                      dummyImageNodePattern, html.replace(/\\$/g, '$$$$')));\n    } else {\n      goog.editor.node.replaceInnerHtml(\n          parent,\n          parent.innerHTML.replace(dummyImageNodePattern, dummySpanText));\n      var dummySpan = dh.getElement(dummyNodeId);\n      parent = dummySpan;\n      while ((parent = dummySpan.parentNode) &&\n             goog.editor.node.isEmpty(parent) &&\n             !goog.editor.node.isEditableContainer(parent)) {\n        var tag = parent.nodeName;\n        // We can't remove these table tags as it will invalidate the table dom.\n        if (tag == goog.dom.TagName.TD || tag == goog.dom.TagName.TR ||\n            tag == goog.dom.TagName.TH) {\n          break;\n        }\n\n        // We can't just remove parent since dummySpan is inside it, and we need\n        // to keep dummy span around for the replacement.  So we move the\n        // dummySpan up as we go.\n        goog.dom.insertSiblingAfter(dummySpan, parent);\n        goog.dom.removeNode(parent);\n      }\n      goog.editor.node.replaceInnerHtml(\n          parent,\n          // Escape dollars passed in second argument of String.proto.replace\n          parent.innerHTML.replace(\n              new RegExp(dummySpanText, 'i'), html.replace(/\\$/g, '$$$$')));\n    }\n  }\n\n  var startSpan = dh.getElement(startSpanId);\n  var endSpan = dh.getElement(endSpanId);\n  goog.dom.Range\n      .createFromNodes(startSpan, 0, endSpan, endSpan.childNodes.length)\n      .select();\n  goog.dom.removeNode(startSpan);\n  goog.dom.removeNode(endSpan);\n};\n\n\n/**\n * Gets the html inside the selection to send off for further processing.\n *\n * TODO(user): Make this general so that it can be moved into\n * goog.editor.range.  The main reason it can't be moved is because we need to\n * get the range before we do the execCommand and continue to operate on that\n * same range (reasons are documented above).\n *\n * @param {goog.dom.AbstractRange} range The selection.\n * @return {string} The html string to format.\n * @private\n */\ngoog.editor.plugins.RemoveFormatting.prototype.getHtmlText_ = function(range) {\n  var div = this.getFieldDomHelper().createDom(goog.dom.TagName.DIV);\n  var textRange = range.getBrowserRangeObject();\n\n  if (goog.editor.BrowserFeature.HAS_W3C_RANGES) {\n    // Get the text to convert.\n    div.appendChild(textRange.cloneContents());\n  } else if (goog.editor.BrowserFeature.HAS_IE_RANGES) {\n    // Trim the whitespace on the ends of the range, so that it the container\n    // will be the container of only the text content that we are changing.\n    // This gets around issues in IE where the spaces are included in the\n    // selection, but ignored sometimes by execCommand, and left orphaned.\n    var rngText = range.getText();\n\n    // BRs get reported as \\r\\n, but only count as one character for moves.\n    // Adjust the string so our move counter is correct.\n    rngText = rngText.replace(/\\r\\n/g, '\\r');\n\n    var rngTextLength = rngText.length;\n    var left = rngTextLength - goog.string.trimLeft(rngText).length;\n    var right = rngTextLength - goog.string.trimRight(rngText).length;\n\n    textRange.moveStart('character', left);\n    textRange.moveEnd('character', -right);\n\n    var htmlText = textRange.htmlText;\n    // Check if in pretag and fix up formatting so that new lines are preserved.\n    if (textRange.queryCommandValue('formatBlock') == 'Formatted') {\n      htmlText = goog.string.newLineToBr(textRange.htmlText);\n    }\n    div.innerHTML = htmlText;\n  }\n\n  // Get the innerHTML of the node instead of just returning the text above\n  // so that its properly html escaped.\n  return div.innerHTML;\n};\n\n\n/**\n * Move the range so that it doesn't include any partially selected tables.\n * @param {goog.dom.AbstractRange} range The range to adjust.\n * @param {Node} startInTable Table node that the range starts in.\n * @param {Node} endInTable Table node that the range ends in.\n * @return {!goog.dom.SavedCaretRange} Range to use to restore the\n *     selection after we run our custom remove formatting.\n * @private\n */\ngoog.editor.plugins.RemoveFormatting.prototype.adjustRangeForTables_ = function(\n    range, startInTable, endInTable) {\n  // Create placeholders for the current selection so we can restore it\n  // later.\n  var savedCaretRange = goog.editor.range.saveUsingNormalizedCarets(range);\n\n  var startNode = range.getStartNode();\n  var startOffset = range.getStartOffset();\n  var endNode = range.getEndNode();\n  var endOffset = range.getEndOffset();\n  var dh = this.getFieldDomHelper();\n\n  // Move start after the table.\n  if (startInTable) {\n    var textNode = dh.createTextNode('');\n    goog.dom.insertSiblingAfter(textNode, startInTable);\n    startNode = textNode;\n    startOffset = 0;\n  }\n  // Move end before the table.\n  if (endInTable) {\n    var textNode = dh.createTextNode('');\n    goog.dom.insertSiblingBefore(textNode, endInTable);\n    endNode = textNode;\n    endOffset = 0;\n  }\n\n  goog.dom.Range.createFromNodes(startNode, startOffset, endNode, endOffset)\n      .select();\n\n  return savedCaretRange;\n};\n\n\n/**\n * Remove a caret from the dom and hide it in a safe place, so it can\n * be restored later via restoreCaretsFromCave.\n * @param {goog.dom.SavedCaretRange} caretRange The caret range to\n *     get the carets from.\n * @param {boolean} isStart Whether this is the start or end caret.\n * @private\n */\ngoog.editor.plugins.RemoveFormatting.prototype.putCaretInCave_ = function(\n    caretRange, isStart) {\n  var cavedCaret = goog.dom.removeNode(caretRange.getCaret(isStart));\n  if (isStart) {\n    this.startCaretInCave_ = cavedCaret;\n  } else {\n    this.endCaretInCave_ = cavedCaret;\n  }\n};\n\n\n/**\n * Restore carets that were hidden away by adding them back into the dom.\n * Note: this does not restore to the original dom location, as that\n * will likely have been modified with remove formatting.  The only\n * guarantees here are that start will still be before end, and that\n * they will be in the editable region.  This should only be used when\n * you don't actually intend to USE the caret again.\n * @private\n */\ngoog.editor.plugins.RemoveFormatting.prototype.restoreCaretsFromCave_ =\n    function() {\n  // To keep start before end, we put the end caret at the bottom of the field\n  // and the start caret at the start of the field.\n  var field = this.getFieldObject().getElement();\n  if (this.startCaretInCave_) {\n    field.insertBefore(this.startCaretInCave_, field.firstChild);\n    this.startCaretInCave_ = null;\n  }\n  if (this.endCaretInCave_) {\n    field.appendChild(this.endCaretInCave_);\n    this.endCaretInCave_ = null;\n  }\n};\n\n\n/**\n * Gets the html inside the current selection, passes it through the given\n * conversion function, and puts it back into the selection.\n *\n * @param {function(string): string} convertFunc A conversion function that\n *    transforms an html string to new html string.\n * @private\n */\ngoog.editor.plugins.RemoveFormatting.prototype.convertSelectedHtmlText_ =\n    function(convertFunc) {\n  var range = this.getFieldObject().getRange();\n\n  // For multiple ranges, it is really hard to do our custom remove formatting\n  // without invalidating other ranges. So instead of always losing the\n  // content, this solution at least lets the browser do its own remove\n  // formatting which works correctly most of the time.\n  if (range.getTextRangeCount() > 1) {\n    return;\n  }\n\n  if (goog.userAgent.GECKO || goog.userAgent.EDGE) {\n    // Determine if we need to handle tables, since they are special cases.\n    // If the selection is entirely within a table, there is no extra\n    // formatting removal we can do.  If a table is fully selected, we will\n    // just blow it away. If a table is only partially selected, we can\n    // perform custom remove formatting only on the non table parts, since we\n    // we can't just remove the parts and paste back into it (eg. we can't\n    // inject html where a TR used to be).\n    // If the selection contains the table and more, this is automatically\n    // handled, but if just the table is selected, it can be tricky to figure\n    // this case out, because of the numerous ways selections can be formed -\n    // ex. if a table has a single tr with a single td with a single text node\n    // in it, and the selection is (textNode: 0), (textNode: nextNode.length)\n    // then the entire table is selected, even though the start and end aren't\n    // the table itself. We are truly inside a table if the expanded endpoints\n    // are still inside the table.\n\n    // Expand the selection to include any outermost tags that weren't included\n    // in the selection, but have the same visible selection. Stop expanding\n    // if we reach the top level field.\n    var expandedRange =\n        goog.editor.range.expand(range, this.getFieldObject().getElement());\n\n    var startInTable = this.getTableAncestor_(expandedRange.getStartNode());\n    var endInTable = this.getTableAncestor_(expandedRange.getEndNode());\n\n    if (startInTable || endInTable) {\n      if (startInTable == endInTable) {\n        // We are fully contained in the same table, there is no extra\n        // remove formatting that we can do, just return and run browser\n        // formatting only.\n        return;\n      }\n\n      // Adjust the range to not contain any partially selected tables, since\n      // we don't want to run our custom remove formatting on them.\n      var savedCaretRange =\n          this.adjustRangeForTables_(range, startInTable, endInTable);\n\n      // Hack alert!!\n      // If start is not in a table, then the saved caret will get sent out\n      // for uber remove formatting, and it will get blown away.  This is\n      // fine, except that we need to be able to re-create a range from the\n      // savedCaretRange later on.  So, we just remove it from the dom, and\n      // put it back later so we can create a range later (not exactly in the\n      // same spot, but don't worry we don't actually try to use it later)\n      // and then it will be removed when we dispose the range.\n      if (!startInTable) {\n        this.putCaretInCave_(savedCaretRange, true);\n      }\n      if (!endInTable) {\n        this.putCaretInCave_(savedCaretRange, false);\n      }\n\n      // Re-fetch the range, and re-expand it, since we just modified it.\n      range = this.getFieldObject().getRange();\n      expandedRange =\n          goog.editor.range.expand(range, this.getFieldObject().getElement());\n    }\n\n    expandedRange.select();\n    range = expandedRange;\n  }\n\n  // Convert the selected text to the format-less version, paste back into\n  // the selection.\n  var text = this.getHtmlText_(range);\n  this.pasteHtml_(convertFunc(text));\n\n  if ((goog.userAgent.GECKO || goog.userAgent.EDGE) && savedCaretRange) {\n    // If we moved the selection, move it back so the user can't tell we did\n    // anything crazy and so the browser removeFormat that we call next\n    // will operate on the entire originally selected range.\n    range = this.getFieldObject().getRange();\n    this.restoreCaretsFromCave_();\n    var realSavedCaretRange = savedCaretRange.toAbstractRange();\n    var startRange = startInTable ? realSavedCaretRange : range;\n    var endRange = endInTable ? realSavedCaretRange : range;\n    var restoredRange =\n        goog.editor.plugins.RemoveFormatting.createRangeDelimitedByRanges_(\n            startRange, endRange);\n    restoredRange.select();\n    savedCaretRange.dispose();\n  }\n};\n\n\n/**\n * Does a best-effort attempt at clobbering all formatting that the\n * browser's execCommand couldn't clobber without being totally inefficient.\n * Attempts to convert visual line breaks to BRs. Leaves anchors that contain an\n * href and images.\n * Adapted from Gmail's MessageUtil's htmlToPlainText. http://go/messageutil.js\n * @param {string} html The original html of the message.\n * @return {string} The unformatted html, which is just text, br's, anchors and\n *     images.\n * @private\n */\ngoog.editor.plugins.RemoveFormatting.prototype.removeFormattingWorker_ =\n    function(html) {\n  var el = goog.dom.createElement(goog.dom.TagName.DIV);\n  el.innerHTML = html;\n\n  // Put everything into a string buffer to avoid lots of expensive string\n  // concatenation along the way.\n  var sb = [];\n  var stack = [el.childNodes, 0];\n\n  // Keep separate stacks for places where we need to keep track of\n  // how deeply embedded we are.  These are analogous to the general stack.\n  var preTagStack = [];\n  var preTagLevel = 0;  // Length of the prestack.\n  var tableStack = [];\n  var tableLevel = 0;\n\n  // sp = stack pointer, pointing to the stack array.\n  // decrement by 2 since the stack alternates node lists and\n  // processed node counts\n  for (var sp = 0; sp >= 0; sp -= 2) {\n    // Check if we should pop the table level.\n    var changedLevel = false;\n    while (tableLevel > 0 && sp <= tableStack[tableLevel - 1]) {\n      tableLevel--;\n      changedLevel = true;\n    }\n    if (changedLevel) {\n      goog.editor.plugins.RemoveFormatting.appendNewline_(sb);\n    }\n\n\n    // Check if we should pop the <pre>/<xmp> level.\n    changedLevel = false;\n    while (preTagLevel > 0 && sp <= preTagStack[preTagLevel - 1]) {\n      preTagLevel--;\n      changedLevel = true;\n    }\n    if (changedLevel) {\n      goog.editor.plugins.RemoveFormatting.appendNewline_(sb);\n    }\n\n    // The list of of nodes to process at the current stack level.\n    var nodeList = stack[sp];\n    // The number of nodes processed so far, stored in the stack immediately\n    // following the node list for that stack level.\n    var numNodesProcessed = stack[sp + 1];\n\n    while (numNodesProcessed < nodeList.length) {\n      var node = nodeList[numNodesProcessed++];\n      var nodeName = node.nodeName;\n\n      var formatted = this.getValueForNode(node);\n      if (formatted != null) {\n        sb.push(formatted);\n        continue;\n      }\n\n      // TODO(user): Handle case 'EMBED' and case 'OBJECT'.\n      switch (nodeName) {\n        case '#text':\n          // Note that IE does not preserve whitespace in the dom\n          // values, even in a pre tag, so this is useless for IE.\n          var nodeValue = preTagLevel > 0 ?\n              node.nodeValue :\n              goog.string.stripNewlines(node.nodeValue);\n          nodeValue = goog.string.htmlEscape(nodeValue);\n          sb.push(nodeValue);\n          continue;\n\n        case String(goog.dom.TagName.P):\n          goog.editor.plugins.RemoveFormatting.appendNewline_(sb);\n          goog.editor.plugins.RemoveFormatting.appendNewline_(sb);\n          break;  // break (not continue) so that child nodes are processed.\n\n        case String(goog.dom.TagName.BR):\n          goog.editor.plugins.RemoveFormatting.appendNewline_(sb);\n          continue;\n\n        case String(goog.dom.TagName.TABLE):\n          goog.editor.plugins.RemoveFormatting.appendNewline_(sb);\n          tableStack[tableLevel++] = sp;\n          break;\n\n        case String(goog.dom.TagName.PRE):\n        case 'XMP':\n          // This doesn't fully handle xmp, since\n          // it doesn't actually ignore tags within the xmp tag.\n          preTagStack[preTagLevel++] = sp;\n          break;\n\n        case String(goog.dom.TagName.STYLE):\n        case String(goog.dom.TagName.SCRIPT):\n        case String(goog.dom.TagName.SELECT):\n          continue;\n\n        case String(goog.dom.TagName.A):\n          if (node.href && node.href != '') {\n            sb.push(\"<a href='\");\n            sb.push(node.href);\n            sb.push(\"'>\");\n            sb.push(this.removeFormattingWorker_(node.innerHTML));\n            sb.push('</a>');\n            continue;  // Children taken care of.\n          } else {\n            break;  // Take care of the children.\n          }\n\n        case String(goog.dom.TagName.IMG):\n          sb.push(\"<img src='\");\n          sb.push(node.src);\n          sb.push(\"'\");\n          // border=0 is a common way to not show a blue border around an image\n          // that is wrapped by a link. If we remove that, the blue border will\n          // show up, which to the user looks like adding format, not removing.\n          if (node.border == '0') {\n            sb.push(\" border='0'\");\n          }\n          sb.push('>');\n          continue;\n\n        case String(goog.dom.TagName.TD):\n          // Don't add a space for the first TD, we only want spaces to\n          // separate td's.\n          if (node.previousSibling) {\n            sb.push(' ');\n          }\n          break;\n\n        case String(goog.dom.TagName.TR):\n          // Don't add a newline for the first TR.\n          if (node.previousSibling) {\n            goog.editor.plugins.RemoveFormatting.appendNewline_(sb);\n          }\n          break;\n\n        case String(goog.dom.TagName.DIV):\n          var parent = node.parentNode;\n          if (parent.firstChild == node &&\n              goog.editor.plugins.RemoveFormatting.BLOCK_RE_.test(\n                  parent.tagName)) {\n            // If a DIV is the first child of another element that itself is a\n            // block element, the DIV does not add a new line.\n            break;\n          }\n        // Otherwise, the DIV does add a new line.  Fall through.\n\n        default:\n          if (goog.editor.plugins.RemoveFormatting.BLOCK_RE_.test(nodeName)) {\n            goog.editor.plugins.RemoveFormatting.appendNewline_(sb);\n          }\n      }\n\n      // Recurse down the node.\n      var children = node.childNodes;\n      if (children.length > 0) {\n        // Push the current state on the stack.\n        stack[sp++] = nodeList;\n        stack[sp++] = numNodesProcessed;\n\n        // Iterate through the children nodes.\n        nodeList = children;\n        numNodesProcessed = 0;\n      }\n    }\n  }\n\n  // Replace &nbsp; with white space.\n  return goog.string.normalizeSpaces(sb.join(''));\n};\n\n\n/**\n * Handle per node special processing if necessary. If this function returns\n * null then standard cleanup is applied. Otherwise this node and all children\n * are assumed to be cleaned.\n * NOTE(user): If an alternate RemoveFormatting processor is provided\n * (setRemoveFormattingFunc()), this will no longer work.\n * @param {Element} node The node to clean.\n * @return {?string} The HTML strig representation of the cleaned data.\n */\ngoog.editor.plugins.RemoveFormatting.prototype.getValueForNode = function(\n    node) {\n  return null;\n};\n\n\n/**\n * Sets a function to be used for remove formatting.\n * @param {function(string): string} removeFormattingFunc - A function that\n *     takes  a string of html and returns a string of html that does any other\n *     formatting changes desired.  Use this only if trogedit's behavior doesn't\n *     meet your needs.\n */\ngoog.editor.plugins.RemoveFormatting.prototype.setRemoveFormattingFunc =\n    function(removeFormattingFunc) {\n  this.optRemoveFormattingFunc_ = removeFormattingFunc;\n};\n","^;",1579837703000,"^<",["^=",["^1>","^2K","^2L","^Z","^1@","^?","^[","^11","^1G","^1H","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/removeformatting.js"],"^O",["^=",["~$goog.editor.plugins.RemoveFormatting"]],"^W",true,"^X",["^?","^1>","^2K","^1H","^12","^1@","^11","^1G","^Z","^2L","^["]],["^ ","^3",[1579837703000],"^4","goog.ui.advancedtooltip.js","^5",["^6","goog/ui/advancedtooltip.js"],"^7","goog/ui/advancedtooltip.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Advanced tooltip widget implementation.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/advancedtooltip.html\n */\n\ngoog.provide('goog.ui.AdvancedTooltip');\n\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.math.Box');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.style');\ngoog.require('goog.ui.Tooltip');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Advanced tooltip widget with cursor tracking abilities. Works like a regular\n * tooltip but can track the cursor position and direction to determine if the\n * tooltip should be dismissed or remain open.\n *\n * @param {Element|string=} opt_el Element to display tooltip for, either\n *     element reference or string id.\n * @param {?string=} opt_str Text message to display in tooltip.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.Tooltip}\n */\ngoog.ui.AdvancedTooltip = function(opt_el, opt_str, opt_domHelper) {\n  goog.ui.Tooltip.call(this, opt_el, opt_str, opt_domHelper);\n};\ngoog.inherits(goog.ui.AdvancedTooltip, goog.ui.Tooltip);\ngoog.tagUnsealableClass(goog.ui.AdvancedTooltip);\n\n\n/**\n * Whether to track the cursor and thereby close the tooltip if it moves away\n * from the tooltip and keep it open if it moves towards it.\n *\n * @type {boolean}\n * @private\n */\ngoog.ui.AdvancedTooltip.prototype.cursorTracking_ = false;\n\n\n/**\n * Delay in milliseconds before tooltips are hidden if cursor tracking is\n * enabled and the cursor is moving away from the tooltip.\n *\n * @type {number}\n * @private\n */\ngoog.ui.AdvancedTooltip.prototype.cursorTrackingHideDelayMs_ = 100;\n\n\n/**\n * Box object representing a margin around the tooltip where the cursor is\n * allowed without dismissing the tooltip.\n *\n * @type {goog.math.Box}\n * @private\n */\ngoog.ui.AdvancedTooltip.prototype.hotSpotPadding_;\n\n\n/**\n * Bounding box.\n *\n * @type {goog.math.Box}\n * @private\n */\ngoog.ui.AdvancedTooltip.prototype.boundingBox_;\n\n\n/**\n * Anchor bounding box.\n *\n * @type {goog.math.Box}\n * @private\n */\ngoog.ui.AdvancedTooltip.prototype.anchorBox_;\n\n\n/**\n * Whether the cursor tracking is active.\n *\n * @type {boolean}\n * @private\n */\ngoog.ui.AdvancedTooltip.prototype.tracking_ = false;\n\n\n/**\n * Sets margin around the tooltip where the cursor is allowed without dismissing\n * the tooltip.\n *\n * @param {goog.math.Box=} opt_box The margin around the tooltip.\n */\ngoog.ui.AdvancedTooltip.prototype.setHotSpotPadding = function(opt_box) {\n  this.hotSpotPadding_ = opt_box || null;\n};\n\n\n/**\n * @return {goog.math.Box} box The margin around the tooltip where the cursor is\n *     allowed without dismissing the tooltip.\n */\ngoog.ui.AdvancedTooltip.prototype.getHotSpotPadding = function() {\n  return this.hotSpotPadding_;\n};\n\n\n/**\n * Sets whether to track the cursor and thereby close the tooltip if it moves\n * away from the tooltip and keep it open if it moves towards it.\n *\n * @param {boolean} b Whether to track the cursor.\n */\ngoog.ui.AdvancedTooltip.prototype.setCursorTracking = function(b) {\n  this.cursorTracking_ = b;\n};\n\n\n/**\n * @return {boolean} Whether to track the cursor and thereby close the tooltip\n *     if it moves away from the tooltip and keep it open if it moves towards\n *     it.\n */\ngoog.ui.AdvancedTooltip.prototype.getCursorTracking = function() {\n  return this.cursorTracking_;\n};\n\n\n/**\n * Sets delay in milliseconds before tooltips are hidden if cursor tracking is\n * enabled and the cursor is moving away from the tooltip.\n *\n * @param {number} delay The delay in milliseconds.\n */\ngoog.ui.AdvancedTooltip.prototype.setCursorTrackingHideDelayMs = function(\n    delay) {\n  this.cursorTrackingHideDelayMs_ = delay;\n};\n\n\n/**\n * @return {number} The delay in milliseconds before tooltips are hidden if\n *     cursor tracking is enabled and the cursor is moving away from the\n *     tooltip.\n */\ngoog.ui.AdvancedTooltip.prototype.getCursorTrackingHideDelayMs = function() {\n  return this.cursorTrackingHideDelayMs_;\n};\n\n\n/**\n * Called after the popup is shown.\n * @protected\n * @override\n */\ngoog.ui.AdvancedTooltip.prototype.onShow = function() {\n  goog.ui.AdvancedTooltip.superClass_.onShow.call(this);\n\n  this.boundingBox_ = goog.style.getBounds(this.getElement()).toBox();\n  if (this.anchor) {\n    this.anchorBox_ = goog.style.getBounds(this.anchor).toBox();\n  }\n\n  this.tracking_ = this.cursorTracking_;\n  goog.events.listen(\n      this.getDomHelper().getDocument(), goog.events.EventType.MOUSEMOVE,\n      this.handleMouseMove, false, this);\n};\n\n\n/**\n * Called after the popup is hidden.\n * @protected\n * @override\n */\ngoog.ui.AdvancedTooltip.prototype.onHide = function() {\n  goog.events.unlisten(\n      this.getDomHelper().getDocument(), goog.events.EventType.MOUSEMOVE,\n      this.handleMouseMove, false, this);\n\n  this.boundingBox_ = null;\n  this.anchorBox_ = null;\n  this.tracking_ = false;\n\n  goog.ui.AdvancedTooltip.superClass_.onHide.call(this);\n};\n\n\n/**\n * Returns true if the mouse is in the tooltip.\n * @return {boolean} True if the mouse is in the tooltip.\n */\ngoog.ui.AdvancedTooltip.prototype.isMouseInTooltip = function() {\n  return this.isCoordinateInTooltip(this.cursorPosition);\n};\n\n\n/**\n * Checks whether the supplied coordinate is inside the tooltip, including\n * padding if any.\n * @param {goog.math.Coordinate} coord Coordinate being tested.\n * @return {boolean} Whether the coord is in the tooltip.\n * @override\n */\ngoog.ui.AdvancedTooltip.prototype.isCoordinateInTooltip = function(coord) {\n  // Check if coord is inside the bounding box of the tooltip\n  if (this.hotSpotPadding_) {\n    var offset = goog.style.getPageOffset(this.getElement());\n    var size = goog.style.getSize(this.getElement());\n    return offset.x - this.hotSpotPadding_.left <= coord.x &&\n        coord.x <= offset.x + size.width + this.hotSpotPadding_.right &&\n        offset.y - this.hotSpotPadding_.top <= coord.y &&\n        coord.y <= offset.y + size.height + this.hotSpotPadding_.bottom;\n  }\n\n  return goog.ui.AdvancedTooltip.superClass_.isCoordinateInTooltip.call(\n      this, coord);\n};\n\n\n/**\n * Checks if supplied coordinate is in the tooltip, its triggering anchor, or\n * a tooltip that has been triggered by a child of this tooltip.\n * Called from handleMouseMove to determine if hide timer should be started,\n * and from maybeHide to determine if tooltip should be hidden.\n * @param {goog.math.Coordinate} coord Coordinate being tested.\n * @return {boolean} Whether coordinate is in the anchor, the tooltip, or any\n *     tooltip whose anchor is a child of this tooltip.\n * @private\n */\ngoog.ui.AdvancedTooltip.prototype.isCoordinateActive_ = function(coord) {\n  if ((this.anchorBox_ && this.anchorBox_.contains(coord)) ||\n      this.isCoordinateInTooltip(coord)) {\n    return true;\n  }\n\n  // Check if mouse might be in active child element.\n  var childTooltip = this.getChildTooltip();\n  return !!childTooltip && childTooltip.isCoordinateInTooltip(coord);\n};\n\n\n/**\n * Called by timer from mouse out handler. Hides tooltip if cursor is still\n * outside element and tooltip.\n * @param {?Element|undefined} el Anchor when hide timer was started.\n * @override\n */\ngoog.ui.AdvancedTooltip.prototype.maybeHide = function(el) {\n  this.hideTimer = undefined;\n  if (el == this.anchor) {\n    // Check if cursor is inside the bounding box of the tooltip or the element\n    // that triggered it, or if tooltip is active (possibly due to receiving\n    // the focus), or if there is a nested tooltip being shown.\n    if (!this.isCoordinateActive_(this.cursorPosition) &&\n        !this.getActiveElement() && !this.hasActiveChild()) {\n      // Under certain circumstances gecko fires ghost mouse events with the\n      // coordinates 0, 0 regardless of the cursors position.\n      if (goog.userAgent.GECKO && this.cursorPosition.x == 0 &&\n          this.cursorPosition.y == 0) {\n        return;\n      }\n      this.setVisible(false);\n    }\n  }\n};\n\n\n/**\n * Handler for mouse move events.\n *\n * @param {goog.events.BrowserEvent} event Event object.\n * @protected\n * @override\n */\ngoog.ui.AdvancedTooltip.prototype.handleMouseMove = function(event) {\n  var startTimer = this.isVisible();\n  if (this.boundingBox_) {\n    var scroll = this.getDomHelper().getDocumentScroll();\n    var c = new goog.math.Coordinate(\n        event.clientX + scroll.x, event.clientY + scroll.y);\n    if (this.isCoordinateActive_(c)) {\n      startTimer = false;\n    } else if (this.tracking_) {\n      var prevDist =\n          goog.math.Box.distance(this.boundingBox_, this.cursorPosition);\n      var currDist = goog.math.Box.distance(this.boundingBox_, c);\n      startTimer = currDist >= prevDist;\n    }\n  }\n\n  if (startTimer) {\n    this.startHideTimer();\n\n    // Even though the mouse coordinate is not on the tooltip (or nested child),\n    // they may have an active element because of a focus event.  Don't let\n    // that prevent us from taking down the tooltip(s) on this mouse move.\n    this.setActiveElement(null);\n    var childTooltip = this.getChildTooltip();\n    if (childTooltip) {\n      childTooltip.setActiveElement(null);\n    }\n  } else if (this.getState() == goog.ui.Tooltip.State.WAITING_TO_HIDE) {\n    this.clearHideTimer();\n  }\n\n  goog.ui.AdvancedTooltip.superClass_.handleMouseMove.call(this, event);\n};\n\n\n/**\n * Handler for mouse over events for the tooltip element.\n *\n * @param {goog.events.BrowserEvent} event Event object.\n * @protected\n * @override\n */\ngoog.ui.AdvancedTooltip.prototype.handleTooltipMouseOver = function(event) {\n  if (this.getActiveElement() != this.getElement()) {\n    this.tracking_ = false;\n    this.setActiveElement(this.getElement());\n  }\n};\n\n\n/**\n * Override hide delay with cursor tracking hide delay while tracking.\n * @return {number} Hide delay to use.\n * @override\n */\ngoog.ui.AdvancedTooltip.prototype.getHideDelayMs = function() {\n  return this.tracking_ ? this.cursorTrackingHideDelayMs_ :\n                          goog.ui.AdvancedTooltip.base(this, 'getHideDelayMs');\n};\n\n\n/**\n * Forces the recalculation of the hotspot on the next mouse over event.\n * @deprecated Not ever necessary to call this function. Hot spot is calculated\n *     as necessary.\n */\ngoog.ui.AdvancedTooltip.prototype.resetHotSpot = goog.nullFunction;\n","^;",1579837703000,"^<",["^=",["^?","^[","~$goog.ui.Tooltip","~$goog.math.Box","^1C","~$goog.math.Coordinate","^1F","^1<"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/advancedtooltip.js"],"^O",["^=",["~$goog.ui.AdvancedTooltip"]],"^W",true,"^X",["^?","^1<","^1C","^3<","^3=","^1F","^3;","^["]],["^ ","^3",[1579837703000],"~:goog-module",true,"^4","goog.net.streams.pbjsonstreamparser.js","^5",["^6","goog/net/streams/pbjsonstreamparser.js"],"^7","goog/net/streams/pbjsonstreamparser.js","^8","^9","^:","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A stream parser of StreamBody message in Protobuf-JSON format.\n *\n * 1. StreamBody proto message is defined as following:\n *\n *    message StreamBody {\n *      repeated bytes messages = 1;\n *      google.rpc.Status status = 2;\n *    }\n *\n * 2. In Protobuf-JSON format, StreamBody is represented as a JSON array:\n *\n *    - [ [ message1, message2, ..., messageN ] ]  (no status)\n *    - [ null, status ]  (no message)\n *    - [ [ message1, message2, ..., messageN ] , status ]\n *\n * 3. All parsed messages and status will be delivered in a batch (array),\n *    with each constructed as {tag-id: content-string}.\n */\n\ngoog.module('goog.net.streams.PbJsonStreamParser');\n\nvar JsonStreamParser = goog.require('goog.net.streams.JsonStreamParser');\nvar StreamParser = goog.require('goog.net.streams.StreamParser');\nvar asserts = goog.require('goog.asserts');\nvar utils = goog.require('goog.net.streams.utils');\n\n\n/**\n * A stream parser of StreamBody message in Protobuf-JSON format.\n *\n * @constructor\n * @struct\n * @implements {StreamParser}\n * @final\n */\nvar PbJsonStreamParser = function() {\n  /**\n   * Protobuf raw bytes stream parser\n   * @private {?JsonStreamParser}\n   */\n  this.jsonStreamParser_ = null;\n\n  /**\n   * The current error message, if any.\n   * @private {?string}\n   */\n  this.errorMessage_ = null;\n\n  /**\n   * The current position in the streamed data.\n   * @private {number}\n   */\n  this.streamPos_ = 0;\n\n  /**\n   * The current parser state.\n   * @private {!State}\n   */\n  this.state_ = State.INIT;\n\n  /**\n   * The currently buffered result (parsed JSON objects).\n   * @private {!Array<!Object>}\n   */\n  this.result_ = [];\n\n  /**\n   * Whether the status has been parsed.\n   * @private {boolean}\n   */\n  this.statusParsed_ = false;\n};\n\n\n/**\n * The parser state.\n * @enum {number}\n */\nvar State = {\n  INIT: 0,           // expecting the beginning \"[\"\n  ARRAY_OPEN: 1,     // expecting the message array or the msg-status separator\n  MESSAGES: 2,       // expecting the message array\n  MESSAGES_DONE: 3,  // expecting the msg-status separator or the ending \"]\"\n  STATUS: 4,         // expecting the status\n  ARRAY_END: 5,      // expecting NO more non-whitespace input\n  INVALID: 6         // the stream has become invalid\n};\n\n\n/** @override */\nPbJsonStreamParser.prototype.isInputValid = function() {\n  return this.errorMessage_ === null;\n};\n\n\n/** @override */\nPbJsonStreamParser.prototype.getErrorMessage = function() {\n  return this.errorMessage_;\n};\n\n\n/** @override */\nPbJsonStreamParser.prototype.parse = function(input) {\n  asserts.assertString(input);\n\n  var parser = this;\n  var pos = 0;\n  while (pos < input.length) {\n    if (!readMore()) {\n      return null;\n    }\n\n    switch (parser.state_) {\n      case State.INVALID: {\n        reportError('stream already broken');\n        break;\n      }\n      case State.INIT: {\n        if (input[pos] === '[') {\n          parser.state_ = State.ARRAY_OPEN;\n          pos++;\n          parser.streamPos_++;\n        } else {\n          reportError('unexpected input token');\n        }\n        break;\n      }\n      case State.ARRAY_OPEN: {\n        if (input[pos] === '[') {\n          parser.state_ = State.MESSAGES;\n          resetJsonStreamParser();\n          // Feed the '[' again in the next loop.\n        } else if (input[pos] === ',' || input.substr(pos, 5) == 'null,') {\n          parser.state_ = State.MESSAGES_DONE;\n          // Feed the ',' again in the next loop.\n        } else if (input[pos] === ']') {\n          parser.state_ = State.ARRAY_END;\n          pos++;\n          parser.streamPos_++;\n        } else {\n          reportError('unexpected input token');\n        }\n        break;\n      }\n      case State.MESSAGES: {\n        var messages = parser.jsonStreamParser_.parse(input.substring(pos));\n        addResultMessages(messages);\n\n        if (!parser.jsonStreamParser_.done()) {\n          parser.streamPos_ += input.length - pos;\n          pos = input.length;  // end the loop\n        } else {\n          parser.state_ = State.MESSAGES_DONE;\n          var extra = parser.jsonStreamParser_.getExtraInput();\n          parser.streamPos_ += input.length - pos - extra.length;\n          input = extra;\n          pos = 0;\n        }\n        break;\n      }\n      case State.MESSAGES_DONE: {\n        if (input[pos] === ',' || input.substr(pos, 5) == 'null,') {\n          parser.state_ = State.STATUS;\n          resetJsonStreamParser();\n          // Feed a dummy \"[\" to match the ending \"]\".\n          parser.jsonStreamParser_.parse('[');\n          pos += (input[pos] === ',' ? 1 : 5);\n          parser.streamPos_++;\n        } else if (input[pos] === ']') {\n          parser.state_ = State.ARRAY_END;\n          pos++;\n          parser.streamPos_++;\n        }\n        break;\n      }\n      case State.STATUS: {\n        var status = parser.jsonStreamParser_.parse(input.substring(pos));\n        addResultStatus(status);\n\n        if (!parser.jsonStreamParser_.done()) {\n          parser.streamPos_ += input.length - pos;\n          pos = input.length;  // end the loop\n        } else {\n          parser.state_ = State.ARRAY_END;\n          var extra = parser.jsonStreamParser_.getExtraInput();\n          parser.streamPos_ += input.length - pos - extra.length;\n          input = extra;\n          pos = 0;\n        }\n        break;\n      }\n      case State.ARRAY_END: {\n        reportError('extra input after stream end');\n        break;\n      }\n    }\n  }\n\n  if (parser.result_.length > 0) {\n    var results = parser.result_;\n    parser.result_ = [];\n    return results;\n  }\n  return null;\n\n\n  /**\n   * @param {string} errorMessage Additional error message\n   * @throws {!Error} Throws an error indicating where the stream is broken\n   */\n  function reportError(errorMessage) {\n    parser.state_ = State.INVALID;\n    parser.errorMessage_ = 'The stream is broken @' + parser.streamPos_ + '/' +\n        pos + '. Error: ' + errorMessage + '. With input:\\n';\n    throw new Error(parser.errorMessage_);\n  }\n\n\n  /**\n   * Advances to the first non-whitespace input character.\n   *\n   * @return {boolean} return false if no more non-whitespace input character\n   */\n  function readMore() {\n    while (pos < input.length) {\n      if (!utils.isJsonWhitespace(input[pos])) {\n        return true;\n      }\n      pos++;\n      parser.streamPos_++;\n    }\n    return false;\n  }\n\n  function resetJsonStreamParser() {\n    parser.jsonStreamParser_ = new JsonStreamParser(\n        {allowCompactJsonArrayFormat: true, deliverMessageAsRawString: true});\n  }\n\n  /** @param {?Array<string>} messages Parsed messages */\n  function addResultMessages(messages) {\n    if (messages) {\n      for (var i = 0; i < messages.length; i++) {\n        var tagged = {};\n        tagged[1] = messages[i];\n        parser.result_.push(tagged);\n      }\n    }\n  }\n\n  /** @param {?Array<string>} status Parsed status */\n  function addResultStatus(status) {\n    if (status) {\n      if (parser.statusParsed_ || status.length > 1) {\n        reportError('extra status: ' + status);\n      }\n      parser.statusParsed_ = true;\n\n      var tagged = {};\n      tagged[2] = status[0];\n      parser.result_.push(tagged);\n    }\n  }\n};\n\n\nexports = PbJsonStreamParser;\n","^;",1579837703000,"^<",["^=",["^1L","~$goog.net.streams.utils","^?","~$goog.net.streams.JsonStreamParser","^2D"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/streams/pbjsonstreamparser.js"],"^O",["^=",["~$goog.net.streams.PbJsonStreamParser"]],"^W",true,"^X",["^?","^3A","^2D","^1L","^3@"]],["^ ","^3",[1579837703000],"^4","goog.ui.toolbarbuttonrenderer.js","^5",["^6","goog/ui/toolbarbuttonrenderer.js"],"^7","goog/ui/toolbarbuttonrenderer.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for toolbar buttons.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ToolbarButtonRenderer');\n\ngoog.require('goog.ui.CustomButtonRenderer');\n\n\n\n/**\n * Toolbar-specific renderer for {@link goog.ui.Button}s, based on {@link\n * goog.ui.CustomButtonRenderer}.\n * @constructor\n * @extends {goog.ui.CustomButtonRenderer}\n */\ngoog.ui.ToolbarButtonRenderer = function() {\n  goog.ui.CustomButtonRenderer.call(this);\n};\ngoog.inherits(goog.ui.ToolbarButtonRenderer, goog.ui.CustomButtonRenderer);\ngoog.addSingletonGetter(goog.ui.ToolbarButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of buttons rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.ToolbarButtonRenderer.CSS_CLASS =\n    goog.getCssName('goog-toolbar-button');\n\n\n/**\n * Returns the CSS class to be applied to the root element of buttons rendered\n * using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.ToolbarButtonRenderer.prototype.getCssClass = function() {\n  return goog.ui.ToolbarButtonRenderer.CSS_CLASS;\n};\n","^;",1579837703000,"^<",["^=",["^?","~$goog.ui.CustomButtonRenderer"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/toolbarbuttonrenderer.js"],"^O",["^=",["~$goog.ui.ToolbarButtonRenderer"]],"^W",true,"^X",["^?","^3C"]],["^ ","^3",[1579837703000],"^4","goog.ui.checkbox.js","^5",["^6","goog/ui/checkbox.js"],"^7","goog/ui/checkbox.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Tristate checkbox widget.\n *\n * @see ../demos/checkbox.html\n */\n\ngoog.provide('goog.ui.Checkbox');\ngoog.provide('goog.ui.Checkbox.State');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.string');\ngoog.require('goog.ui.CheckboxRenderer');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Control');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * 3-state checkbox widget. Fires CHECK or UNCHECK events before toggled and\n * CHANGE event after toggled by user.\n * The checkbox can also be enabled/disabled and get focused and highlighted.\n *\n * @param {goog.ui.Checkbox.State=} opt_checked Checked state to set.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @param {goog.ui.CheckboxRenderer=} opt_renderer Renderer used to render or\n *     decorate the checkbox; defaults to {@link goog.ui.CheckboxRenderer}.\n * @constructor\n * @extends {goog.ui.Control}\n */\ngoog.ui.Checkbox = function(opt_checked, opt_domHelper, opt_renderer) {\n  var renderer = opt_renderer || goog.ui.CheckboxRenderer.getInstance();\n  goog.ui.Control.call(this, null, renderer, opt_domHelper);\n  // The checkbox maintains its own tri-state CHECKED state.\n  // The control class maintains DISABLED, ACTIVE, and FOCUSED (which enable tab\n  // navigation, and keyHandling with SPACE).\n\n  /**\n   * Checked state of the checkbox.\n   * @type {goog.ui.Checkbox.State}\n   * @private\n   */\n  this.checked_ = (opt_checked !== undefined) ?\n      opt_checked :\n      goog.ui.Checkbox.State.UNCHECKED;\n};\ngoog.inherits(goog.ui.Checkbox, goog.ui.Control);\ngoog.tagUnsealableClass(goog.ui.Checkbox);\n\n\n/**\n * Possible checkbox states.\n * @enum {?boolean}\n */\ngoog.ui.Checkbox.State = {\n  CHECKED: true,\n  UNCHECKED: false,\n  UNDETERMINED: null\n};\n\n\n/**\n * Label element bound to the checkbox.\n * @type {?Element}\n * @private\n */\ngoog.ui.Checkbox.prototype.label_ = null;\n\n\n/**\n * @return {goog.ui.Checkbox.State} Checked state of the checkbox.\n */\ngoog.ui.Checkbox.prototype.getChecked = function() {\n  return this.checked_;\n};\n\n\n/**\n * @return {boolean} Whether the checkbox is checked.\n * @override\n */\ngoog.ui.Checkbox.prototype.isChecked = function() {\n  return this.checked_ == goog.ui.Checkbox.State.CHECKED;\n};\n\n\n/**\n * @return {boolean} Whether the checkbox is not checked.\n */\ngoog.ui.Checkbox.prototype.isUnchecked = function() {\n  return this.checked_ == goog.ui.Checkbox.State.UNCHECKED;\n};\n\n\n/**\n * @return {boolean} Whether the checkbox is in partially checked state.\n */\ngoog.ui.Checkbox.prototype.isUndetermined = function() {\n  return this.checked_ == goog.ui.Checkbox.State.UNDETERMINED;\n};\n\n\n/**\n * Sets the checked state of the checkbox.\n * @param {?boolean} checked The checked state to set.\n * @override\n */\ngoog.ui.Checkbox.prototype.setChecked = function(checked) {\n  if (checked != this.checked_) {\n    this.checked_ = /** @type {goog.ui.Checkbox.State} */ (checked);\n    this.getRenderer().setCheckboxState(this.getElement(), this.checked_);\n  }\n};\n\n\n/**\n * Sets the checked state for the checkbox.  Unlike {@link #setChecked},\n * doesn't update the checkbox's DOM.  Considered protected; to be called\n * only by renderer code during element decoration.\n * @param {goog.ui.Checkbox.State} checked New checkbox state.\n */\ngoog.ui.Checkbox.prototype.setCheckedInternal = function(checked) {\n  this.checked_ = checked;\n};\n\n\n/**\n * Binds an HTML element to the checkbox which if clicked toggles the checkbox.\n * Behaves the same way as the 'label' HTML tag. The label element has to be the\n * direct or non-direct ancestor of the checkbox element because it will get the\n * focus when keyboard support is implemented.\n * Note: Control#enterDocument also sets aria-label on the element but\n * Checkbox#enterDocument sets aria-labeledby on the same element which\n * overrides the aria-label in all modern screen readers.\n *\n * @param {?Element} label The label control to set. If null, only the checkbox\n *     reacts to clicks.\n */\ngoog.ui.Checkbox.prototype.setLabel = function(label) {\n  if (this.isInDocument()) {\n    var wasFocused = this.isFocused();\n    this.exitDocument();\n    this.label_ = label;\n    this.enterDocument();\n    if (wasFocused) {\n      this.getElementStrict().focus();\n    }\n  } else {\n    this.label_ = label;\n  }\n};\n\n\n/**\n * Toggles the checkbox. State transitions:\n * <ul>\n *   <li>unchecked -> checked\n *   <li>undetermined -> checked\n *   <li>checked -> unchecked\n * </ul>\n */\ngoog.ui.Checkbox.prototype.toggle = function() {\n  this.setChecked(\n      this.checked_ ? goog.ui.Checkbox.State.UNCHECKED :\n                      goog.ui.Checkbox.State.CHECKED);\n};\n\n\n/** @override */\ngoog.ui.Checkbox.prototype.enterDocument = function() {\n  goog.ui.Checkbox.base(this, 'enterDocument');\n  if (this.isHandleMouseEvents()) {\n    var handler = this.getHandler();\n    // Listen to the label, if it was set.\n    if (this.label_) {\n      // Any mouse events that happen to the associated label should have the\n      // same effect on the checkbox as if they were happening to the checkbox\n      // itself.\n      handler\n          .listen(\n              this.label_, goog.events.EventType.CLICK,\n              this.handleClickOrSpace_)\n          .listen(\n              this.label_, goog.events.EventType.MOUSEOVER,\n              this.handleMouseOver)\n          .listen(\n              this.label_, goog.events.EventType.MOUSEOUT, this.handleMouseOut)\n          .listen(\n              this.label_, goog.events.EventType.MOUSEDOWN,\n              this.handleMouseDown)\n          .listen(\n              this.label_, goog.events.EventType.MOUSEUP, this.handleMouseUp);\n    }\n    // Checkbox needs to explicitly listen for click event.\n    handler.listen(\n        this.getElement(), goog.events.EventType.CLICK,\n        this.handleClickOrSpace_);\n  }\n\n  // Set aria label.\n  var checkboxElement = this.getElementStrict();\n  if (this.label_ && checkboxElement != this.label_ &&\n      goog.string.isEmptyOrWhitespace(\n          goog.a11y.aria.getLabel(checkboxElement))) {\n    if (!this.label_.id) {\n      this.label_.id = this.makeId('lbl');\n    }\n    goog.a11y.aria.setState(\n        checkboxElement, goog.a11y.aria.State.LABELLEDBY, this.label_.id);\n  }\n};\n\n\n/**\n * Handles the click event.\n * @param {!goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.ui.Checkbox.prototype.handleClickOrSpace_ = function(e) {\n  e.stopPropagation();\n  var eventType = this.checked_ ? goog.ui.Component.EventType.UNCHECK :\n                                  goog.ui.Component.EventType.CHECK;\n  if (this.isEnabled() && !e.target.href && this.dispatchEvent(eventType)) {\n    e.preventDefault();  // Prevent scrolling in Chrome if SPACE is pressed.\n    this.toggle();\n    this.dispatchEvent(goog.ui.Component.EventType.CHANGE);\n  }\n};\n\n\n/** @override */\ngoog.ui.Checkbox.prototype.handleKeyEventInternal = function(e) {\n  if (e.keyCode == goog.events.KeyCodes.SPACE) {\n    this.performActionInternal(e);\n    this.handleClickOrSpace_(e);\n  }\n  return false;\n};\n\n\n/**\n * Register this control so it can be created from markup.\n */\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.CheckboxRenderer.CSS_CLASS,\n    function() { return new goog.ui.Checkbox(); });\n","^;",1579837703000,"^<",["^=",["~$goog.ui.CheckboxRenderer","^1O","^2L","^1P","^?","~$goog.ui.registry","^1C","^1W","~$goog.a11y.aria.State","~$goog.events.KeyCodes"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/checkbox.js"],"^O",["^=",["~$goog.ui.Checkbox","~$goog.ui.Checkbox.State"]],"^W",true,"^X",["^?","^1O","^3G","^1C","^3H","^2L","^3E","^1P","^1W","^3F"]],["^ ","^3",[1579837703000],"^4","goog.storage.errorcode.js","^5",["^6","goog/storage/errorcode.js"],"^7","goog/storage/errorcode.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines errors to be thrown by the storage.\n *\n */\n\ngoog.provide('goog.storage.ErrorCode');\n\n\n/**\n * Errors thrown by the storage.\n * @enum {string}\n */\ngoog.storage.ErrorCode = {\n  INVALID_VALUE: 'Storage: Invalid value was encountered',\n  DECRYPTION_ERROR: 'Storage: The value could not be decrypted'\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/errorcode.js"],"^O",["^=",["~$goog.storage.ErrorCode"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.ui.bubble.js","^5",["^6","goog/ui/bubble.js"],"^7","goog/ui/bubble.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the Bubble class.\n *\n *\n * @see ../demos/bubble.html\n *\n * TODO: support decoration and addChild\n */\n\ngoog.provide('goog.ui.Bubble');\n\ngoog.require('goog.Timer');\ngoog.require('goog.dom.safe');\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.math.Box');\ngoog.require('goog.positioning');\ngoog.require('goog.positioning.AbsolutePosition');\ngoog.require('goog.positioning.AnchoredPosition');\ngoog.require('goog.positioning.Corner');\ngoog.require('goog.positioning.CornerBit');\ngoog.require('goog.string.Const');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Popup');\n\n\n/**\n * The Bubble provides a general purpose bubble implementation that can be\n * anchored to a particular element and displayed for a period of time.\n *\n * @param {string|!goog.html.SafeHtml|?Element} message Message or an element\n *     to display inside the bubble. Strings are treated as plain-text and will\n *     be HTML escaped.\n * @param {Object=} opt_config The configuration\n *     for the bubble. If not specified, the default configuration will be\n *     used. {@see goog.ui.Bubble.defaultConfig}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.Component}\n */\ngoog.ui.Bubble = function(message, opt_config, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  if (typeof message === 'string') {\n    message = goog.html.SafeHtml.htmlEscape(message);\n  }\n\n  /**\n   * The HTML string or element to display inside the bubble.\n   *\n   * @type {!goog.html.SafeHtml|Element}\n   * @private\n   */\n  this.message_ = message;\n\n  /**\n   * The Popup element used to position and display the bubble.\n   *\n   * @type {goog.ui.Popup}\n   * @private\n   */\n  this.popup_ = new goog.ui.Popup();\n\n  /**\n   * Configuration map that contains bubble's UI elements.\n   *\n   * @type {Object}\n   * @private\n   */\n  this.config_ = opt_config || goog.ui.Bubble.defaultConfig;\n\n  /**\n   * Id of the close button for this bubble.\n   *\n   * @type {string}\n   * @private\n   */\n  this.closeButtonId_ = this.makeId('cb');\n\n  /**\n   * Id of the div for the embedded element.\n   *\n   * @type {string}\n   * @private\n   */\n  this.messageId_ = this.makeId('mi');\n\n};\ngoog.inherits(goog.ui.Bubble, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.Bubble);\n\n\n/**\n * In milliseconds, timeout after which the button auto-hides. Null means\n * infinite.\n * @type {?number}\n * @private\n */\ngoog.ui.Bubble.prototype.timeout_ = null;\n\n\n/**\n * Key returned by the bubble timer.\n * @type {?number}\n * @private\n */\ngoog.ui.Bubble.prototype.timerId_ = 0;\n\n\n/**\n * Key returned by the listen function for the close button.\n * @type {?goog.events.Key}\n * @private\n */\ngoog.ui.Bubble.prototype.listener_ = null;\n\n\n\n/** @override */\ngoog.ui.Bubble.prototype.createDom = function() {\n  goog.ui.Bubble.superClass_.createDom.call(this);\n\n  var element = this.getElement();\n  element.style.position = 'absolute';\n  element.style.visibility = 'hidden';\n\n  this.popup_.setElement(element);\n};\n\n\n/**\n * Attaches the bubble to an anchor element. Computes the positioning and\n * orientation of the bubble.\n *\n * @param {Element} anchorElement The element to which we are attaching.\n */\ngoog.ui.Bubble.prototype.attach = function(anchorElement) {\n  this.setAnchoredPosition_(\n      anchorElement, this.computePinnedCorner_(anchorElement));\n};\n\n\n/**\n * Sets the corner of the bubble to used in the positioning algorithm.\n *\n * @param {goog.positioning.Corner} corner The bubble corner used for\n *     positioning constants.\n */\ngoog.ui.Bubble.prototype.setPinnedCorner = function(corner) {\n  this.popup_.setPinnedCorner(corner);\n};\n\n\n/**\n * Sets the position of the bubble. Pass null for corner in AnchoredPosition\n * for corner to be computed automatically.\n *\n * @param {goog.positioning.AbstractPosition} position The position of the\n *     bubble.\n */\ngoog.ui.Bubble.prototype.setPosition = function(position) {\n  if (position instanceof goog.positioning.AbsolutePosition) {\n    this.popup_.setPosition(position);\n  } else if (position instanceof goog.positioning.AnchoredPosition) {\n    this.setAnchoredPosition_(position.element, position.corner);\n  } else {\n    throw new Error('Bubble only supports absolute and anchored positions!');\n  }\n};\n\n\n/**\n * Sets the timeout after which bubble hides itself.\n *\n * @param {number} timeout Timeout of the bubble.\n */\ngoog.ui.Bubble.prototype.setTimeout = function(timeout) {\n  this.timeout_ = timeout;\n};\n\n\n/**\n * Sets whether the bubble should be automatically hidden whenever user clicks\n * outside the bubble element.\n *\n * @param {boolean} autoHide Whether to hide if user clicks outside the bubble.\n */\ngoog.ui.Bubble.prototype.setAutoHide = function(autoHide) {\n  this.popup_.setAutoHide(autoHide);\n};\n\n\n/**\n * Sets whether the bubble should be visible.\n *\n * @param {boolean} visible Desired visibility state.\n */\ngoog.ui.Bubble.prototype.setVisible = function(visible) {\n  if (visible && !this.popup_.isVisible()) {\n    this.configureElement_();\n  }\n  this.popup_.setVisible(visible);\n  if (!this.popup_.isVisible()) {\n    this.unconfigureElement_();\n  }\n};\n\n\n/**\n * @return {boolean} Whether the bubble is visible.\n */\ngoog.ui.Bubble.prototype.isVisible = function() {\n  return this.popup_.isVisible();\n};\n\n\n/** @override */\ngoog.ui.Bubble.prototype.disposeInternal = function() {\n  this.unconfigureElement_();\n  this.popup_.dispose();\n  this.popup_ = null;\n  goog.ui.Bubble.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * Creates element's contents and configures all timers. This is called on\n * setVisible(true).\n * @private\n */\ngoog.ui.Bubble.prototype.configureElement_ = function() {\n  if (!this.isInDocument()) {\n    throw new Error('You must render the bubble before showing it!');\n  }\n\n  var element = this.getElement();\n  var corner = this.popup_.getPinnedCorner();\n  goog.dom.safe.setInnerHtml(\n      /** @type {!Element} */ (element), this.computeHtmlForCorner_(corner));\n\n  if (!(this.message_ instanceof goog.html.SafeHtml)) {\n    var messageDiv = this.getDomHelper().getElement(this.messageId_);\n    this.getDomHelper().appendChild(messageDiv, this.message_);\n  }\n  var closeButton = this.getDomHelper().getElement(this.closeButtonId_);\n  this.listener_ = goog.events.listen(\n      closeButton, goog.events.EventType.CLICK, this.hideBubble_, false, this);\n\n  if (this.timeout_) {\n    this.timerId_ = goog.Timer.callOnce(this.hideBubble_, this.timeout_, this);\n  }\n};\n\n\n/**\n * Gets rid of the element's contents and all associated timers and listeners.\n * This is called on dispose as well as on setVisible(false).\n * @private\n */\ngoog.ui.Bubble.prototype.unconfigureElement_ = function() {\n  if (this.listener_) {\n    goog.events.unlistenByKey(this.listener_);\n    this.listener_ = null;\n  }\n  if (this.timerId_) {\n    goog.Timer.clear(this.timerId_);\n    this.timerId_ = null;\n  }\n\n  var element = this.getElement();\n  if (element) {\n    this.getDomHelper().removeChildren(element);\n    goog.dom.safe.setInnerHtml(element, goog.html.SafeHtml.EMPTY);\n  }\n};\n\n\n/**\n * Computes bubble position based on anchored element.\n *\n * @param {Element} anchorElement The element to which we are attaching.\n * @param {goog.positioning.Corner} corner The bubble corner used for\n *     positioning.\n * @private\n */\ngoog.ui.Bubble.prototype.setAnchoredPosition_ = function(\n    anchorElement, corner) {\n  this.popup_.setPinnedCorner(corner);\n  var margin = this.createMarginForCorner_(corner);\n  this.popup_.setMargin(margin);\n  var anchorCorner = goog.positioning.flipCorner(corner);\n  this.popup_.setPosition(\n      new goog.positioning.AnchoredPosition(anchorElement, anchorCorner));\n};\n\n\n/**\n * Hides the bubble. This is called asynchronously by timer of event processor\n * for the mouse click on the close button.\n * @private\n */\ngoog.ui.Bubble.prototype.hideBubble_ = function() {\n  this.setVisible(false);\n};\n\n\n/**\n * Returns an AnchoredPosition that will position the bubble optimally\n * given the position of the anchor element and the size of the viewport.\n *\n * @param {Element} anchorElement The element to which the bubble is attached.\n * @return {!goog.positioning.AnchoredPosition} The AnchoredPosition\n *     to give to {@link #setPosition}.\n */\ngoog.ui.Bubble.prototype.getComputedAnchoredPosition = function(anchorElement) {\n  return new goog.positioning.AnchoredPosition(\n      anchorElement, this.computePinnedCorner_(anchorElement));\n};\n\n\n/**\n * Computes the pinned corner for the bubble.\n * @param {Element} anchorElement The element to which the button is attached.\n * @return {goog.positioning.Corner} The pinned corner.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Bubble.prototype.computePinnedCorner_ = function(anchorElement) {\n  var doc = this.getDomHelper().getOwnerDocument(anchorElement);\n  var viewportElement = goog.style.getClientViewportElement(doc);\n  var viewportWidth = viewportElement.offsetWidth;\n  var viewportHeight = viewportElement.offsetHeight;\n  var anchorElementOffset = goog.style.getPageOffset(anchorElement);\n  var anchorElementSize = goog.style.getSize(anchorElement);\n  var anchorType = 0;\n  // right margin or left?\n  if (viewportWidth - anchorElementOffset.x - anchorElementSize.width >\n      anchorElementOffset.x) {\n    anchorType += 1;\n  }\n  // attaches to the top or to the bottom?\n  if (viewportHeight - anchorElementOffset.y - anchorElementSize.height >\n      anchorElementOffset.y) {\n    anchorType += 2;\n  }\n  return goog.ui.Bubble.corners_[anchorType];\n};\n\n\n/**\n * Computes the right offset for a given bubble corner\n * and creates a margin element for it. This is done to have the\n * button anchor element on its frame rather than on the corner.\n * @param {goog.positioning.Corner} corner The corner.\n * @return {!goog.math.Box} the computed margin. Only left or right fields are\n *     non-zero, but they may be negative.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Bubble.prototype.createMarginForCorner_ = function(corner) {\n  var margin = new goog.math.Box(0, 0, 0, 0);\n  if (corner & goog.positioning.CornerBit.RIGHT) {\n    margin.right -= this.config_.marginShift;\n  } else {\n    margin.left -= this.config_.marginShift;\n  }\n  return margin;\n};\n\n\n/**\n * Computes the HTML string for a given bubble orientation.\n * @param {goog.positioning.Corner} corner The corner.\n * @return {!goog.html.SafeHtml} The HTML string to place inside the\n *     bubble's popup.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Bubble.prototype.computeHtmlForCorner_ = function(corner) {\n  var bubbleTopClass;\n  var bubbleBottomClass;\n  switch (corner) {\n    case goog.positioning.Corner.TOP_LEFT:\n      bubbleTopClass = this.config_.cssBubbleTopLeftAnchor;\n      bubbleBottomClass = this.config_.cssBubbleBottomNoAnchor;\n      break;\n    case goog.positioning.Corner.TOP_RIGHT:\n      bubbleTopClass = this.config_.cssBubbleTopRightAnchor;\n      bubbleBottomClass = this.config_.cssBubbleBottomNoAnchor;\n      break;\n    case goog.positioning.Corner.BOTTOM_LEFT:\n      bubbleTopClass = this.config_.cssBubbleTopNoAnchor;\n      bubbleBottomClass = this.config_.cssBubbleBottomLeftAnchor;\n      break;\n    case goog.positioning.Corner.BOTTOM_RIGHT:\n      bubbleTopClass = this.config_.cssBubbleTopNoAnchor;\n      bubbleBottomClass = this.config_.cssBubbleBottomRightAnchor;\n      break;\n    default:\n      throw new Error('This corner type is not supported by bubble!');\n  }\n  var message = null;\n  if (this.message_ instanceof goog.html.SafeHtml) {\n    message = this.message_;\n  } else {\n    message = goog.html.SafeHtml.create('div', {'id': this.messageId_});\n  }\n\n  var tableRows = goog.html.SafeHtml.concat(\n      goog.html.SafeHtml.create(\n          'tr', {},\n          goog.html.SafeHtml.create(\n              'td', {'colspan': 4, 'class': bubbleTopClass})),\n      goog.html.SafeHtml.create(\n          'tr', {},\n          goog.html.SafeHtml.concat(\n              goog.html.SafeHtml.create(\n                  'td', {'class': this.config_.cssBubbleLeft}),\n              goog.html.SafeHtml.create(\n                  'td', {\n                    'class': this.config_.cssBubbleFont,\n                    'style':\n                        goog.string.Const.from('padding:0 4px;background:white')\n                  },\n                  message),\n              goog.html.SafeHtml.create('td', {\n                'id': this.closeButtonId_,\n                'class': this.config_.cssCloseButton\n              }),\n              goog.html.SafeHtml.create(\n                  'td', {'class': this.config_.cssBubbleRight}))),\n      goog.html.SafeHtml.create(\n          'tr', {},\n          goog.html.SafeHtml.create(\n              'td', {'colspan': 4, 'class': bubbleBottomClass})));\n\n  return goog.html.SafeHtml.create(\n      'table', {\n        'border': 0,\n        'cellspacing': 0,\n        'cellpadding': 0,\n        'width': this.config_.bubbleWidth,\n        'style': goog.string.Const.from('z-index:1')\n      },\n      tableRows);\n};\n\n\n/**\n * A default configuration for the bubble.\n *\n * @type {Object}\n */\ngoog.ui.Bubble.defaultConfig = {\n  bubbleWidth: 147,\n  marginShift: 60,\n  cssBubbleFont: goog.getCssName('goog-bubble-font'),\n  cssCloseButton: goog.getCssName('goog-bubble-close-button'),\n  cssBubbleTopRightAnchor: goog.getCssName('goog-bubble-top-right-anchor'),\n  cssBubbleTopLeftAnchor: goog.getCssName('goog-bubble-top-left-anchor'),\n  cssBubbleTopNoAnchor: goog.getCssName('goog-bubble-top-no-anchor'),\n  cssBubbleBottomRightAnchor:\n      goog.getCssName('goog-bubble-bottom-right-anchor'),\n  cssBubbleBottomLeftAnchor: goog.getCssName('goog-bubble-bottom-left-anchor'),\n  cssBubbleBottomNoAnchor: goog.getCssName('goog-bubble-bottom-no-anchor'),\n  cssBubbleLeft: goog.getCssName('goog-bubble-left'),\n  cssBubbleRight: goog.getCssName('goog-bubble-right')\n};\n\n\n/**\n * An auxiliary array optimizing the corner computation.\n *\n * @type {Array<goog.positioning.Corner>}\n * @private\n */\ngoog.ui.Bubble.corners_ = [\n  goog.positioning.Corner.BOTTOM_RIGHT, goog.positioning.Corner.BOTTOM_LEFT,\n  goog.positioning.Corner.TOP_RIGHT, goog.positioning.Corner.TOP_LEFT\n];\n","^;",1579837703000,"^<",["^=",["~$goog.positioning.Corner","~$goog.positioning.AnchoredPosition","~$goog.positioning.AbsolutePosition","~$goog.Timer","~$goog.positioning","^1P","^?","~$goog.string.Const","^3<","^1C","^1E","~$goog.positioning.CornerBit","^1F","~$goog.ui.Popup","^1<","^1I"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/bubble.js"],"^O",["^=",["~$goog.ui.Bubble"]],"^W",true,"^X",["^?","^3O","^1E","^1<","^1C","^1I","^3<","^3P","^3N","^3M","^3L","^3R","^3Q","^1F","^1P","^3S"]],["^ ","^3",[1579837703000],"^4","goog.crypt.hmac.js","^5",["^6","goog/crypt/hmac.js"],"^7","goog/crypt/hmac.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implementation of HMAC in JavaScript.\n *\n * Usage:\n *   var hmac = new goog.crypt.Hmac(new goog.crypt.sha1(), key, 64);\n *   var digest = hmac.getHmac(bytes);\n *\n * @author benyu@google.com (Jige Yu) - port to closure\n */\n\n\ngoog.provide('goog.crypt.Hmac');\n\ngoog.require('goog.crypt.Hash');\n\n\n\n/**\n * @constructor\n * @param {!goog.crypt.Hash} hasher An object to serve as a hash function.\n * @param {Array<number>} key The secret key to use to calculate the hmac.\n *     Should be an array of not more than `blockSize` integers in\n       {0, 255}.\n * @param {number=} opt_blockSize Optional. The block size `hasher` uses.\n *     If not specified, uses the block size from the hasher, or 16 if it is\n *     not specified.\n * @extends {goog.crypt.Hash}\n * @final\n * @struct\n */\ngoog.crypt.Hmac = function(hasher, key, opt_blockSize) {\n  goog.crypt.Hmac.base(this, 'constructor');\n\n  /**\n   * The underlying hasher to calculate hash.\n   *\n   * @type {!goog.crypt.Hash}\n   * @private\n   */\n  this.hasher_ = hasher;\n\n  this.blockSize = opt_blockSize || hasher.blockSize || 16;\n\n  /**\n   * The outer padding array of hmac\n   *\n   * @type {!Array<number>}\n   * @private\n   */\n  this.keyO_ = new Array(this.blockSize);\n\n  /**\n   * The inner padding array of hmac\n   *\n   * @type {!Array<number>}\n   * @private\n   */\n  this.keyI_ = new Array(this.blockSize);\n\n  this.initialize_(key);\n};\ngoog.inherits(goog.crypt.Hmac, goog.crypt.Hash);\n\n\n/**\n * Outer padding byte of HMAC algorith, per http://en.wikipedia.org/wiki/HMAC\n *\n * @type {number}\n * @private\n */\ngoog.crypt.Hmac.OPAD_ = 0x5c;\n\n\n/**\n * Inner padding byte of HMAC algorith, per http://en.wikipedia.org/wiki/HMAC\n *\n * @type {number}\n * @private\n */\ngoog.crypt.Hmac.IPAD_ = 0x36;\n\n\n/**\n * Initializes Hmac by precalculating the inner and outer paddings.\n *\n * @param {Array<number>} key The secret key to use to calculate the hmac.\n *     Should be an array of not more than `blockSize` integers in\n       {0, 255}.\n * @private\n */\ngoog.crypt.Hmac.prototype.initialize_ = function(key) {\n  if (key.length > this.blockSize) {\n    this.hasher_.update(key);\n    key = this.hasher_.digest();\n    this.hasher_.reset();\n  }\n  // Precalculate padded and xor'd keys.\n  var keyByte;\n  for (var i = 0; i < this.blockSize; i++) {\n    if (i < key.length) {\n      keyByte = key[i];\n    } else {\n      keyByte = 0;\n    }\n    this.keyO_[i] = keyByte ^ goog.crypt.Hmac.OPAD_;\n    this.keyI_[i] = keyByte ^ goog.crypt.Hmac.IPAD_;\n  }\n  // Be ready for an immediate update.\n  this.hasher_.update(this.keyI_);\n};\n\n\n/** @override */\ngoog.crypt.Hmac.prototype.reset = function() {\n  this.hasher_.reset();\n  this.hasher_.update(this.keyI_);\n};\n\n\n/** @override */\ngoog.crypt.Hmac.prototype.update = function(bytes, opt_length) {\n  this.hasher_.update(bytes, opt_length);\n};\n\n\n/** @override */\ngoog.crypt.Hmac.prototype.digest = function() {\n  var temp = this.hasher_.digest();\n  this.hasher_.reset();\n  this.hasher_.update(this.keyO_);\n  this.hasher_.update(temp);\n  return this.hasher_.digest();\n};\n\n\n/**\n * Calculates an HMAC for a given message.\n *\n * @param {Array<number>|Uint8Array|string} message  Data to Hmac.\n * @return {!Array<number>} the digest of the given message.\n */\ngoog.crypt.Hmac.prototype.getHmac = function(message) {\n  this.reset();\n  this.update(message);\n  return this.digest();\n};\n","^;",1579837703000,"^<",["^=",["^?","~$goog.crypt.Hash"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/hmac.js"],"^O",["^=",["~$goog.crypt.Hmac"]],"^W",true,"^X",["^?","^3U"]],["^ ","^3",[1579837703000],"^4","goog.ui.activitymonitor.js","^5",["^6","goog/ui/activitymonitor.js"],"^7","goog/ui/activitymonitor.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Activity Monitor.\n *\n * Fires throttled events when a user interacts with the specified document.\n * This class also exposes the amount of time since the last user event.\n *\n * If you would prefer to get BECOME_ACTIVE and BECOME_IDLE events when the\n * user changes states, then you should use the IdleTimer class instead.\n *\n */\n\ngoog.provide('goog.ui.ActivityMonitor');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\n\n\n\n/**\n * Once initialized with a document, the activity monitor can be queried for\n * the current idle time.\n *\n * @param {goog.dom.DomHelper|Array<goog.dom.DomHelper>=} opt_domHelper\n *     DomHelper which contains the document(s) to listen to.  If null, the\n *     default document is usedinstead.\n * @param {boolean=} opt_useBubble Whether to use the bubble phase to listen for\n *     events. By default listens on the capture phase so that it won't miss\n *     events that get stopPropagation/cancelBubble'd. However, this can cause\n *     problems in IE8 if the page loads multiple scripts that include the\n *     closure event handling code.\n *\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.ui.ActivityMonitor = function(opt_domHelper, opt_useBubble) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * Array of documents that are being listened to.\n   * @type {Array<Document>}\n   * @private\n   */\n  this.documents_ = [];\n\n  /**\n   * Whether to use the bubble phase to listen for events.\n   * @type {boolean}\n   * @private\n   */\n  this.useBubble_ = !!opt_useBubble;\n\n  /**\n   * The event handler.\n   * @type {goog.events.EventHandler<!goog.ui.ActivityMonitor>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  /**\n   * Whether the current window is an iframe.\n   * TODO(user): Move to goog.dom.\n   * @type {boolean}\n   * @private\n   */\n  this.isIframe_ = window.parent != window;\n\n  if (!opt_domHelper) {\n    this.addDocument(goog.dom.getDomHelper().getDocument());\n  } else if (goog.isArray(opt_domHelper)) {\n    for (var i = 0; i < opt_domHelper.length; i++) {\n      this.addDocument(opt_domHelper[i].getDocument());\n    }\n  } else {\n    this.addDocument(opt_domHelper.getDocument());\n  }\n\n  /**\n   * The time (in milliseconds) of the last user event.\n   * @type {number}\n   * @private\n   */\n  this.lastEventTime_ = goog.now();\n\n};\ngoog.inherits(goog.ui.ActivityMonitor, goog.events.EventTarget);\ngoog.tagUnsealableClass(goog.ui.ActivityMonitor);\n\n\n/**\n * The last event type that was detected.\n * @type {string}\n * @private\n */\ngoog.ui.ActivityMonitor.prototype.lastEventType_ = '';\n\n\n/**\n * The mouse x-position after the last user event.\n * @type {number}\n * @private\n */\ngoog.ui.ActivityMonitor.prototype.lastMouseX_;\n\n\n/**\n * The mouse y-position after the last user event.\n * @type {number}\n * @private\n */\ngoog.ui.ActivityMonitor.prototype.lastMouseY_;\n\n\n/**\n * The earliest time that another throttled ACTIVITY event will be dispatched\n * @type {number}\n * @private\n */\ngoog.ui.ActivityMonitor.prototype.minEventTime_ = 0;\n\n\n/**\n * Minimum amount of time in ms between throttled ACTIVITY events\n * @type {number}\n */\ngoog.ui.ActivityMonitor.MIN_EVENT_SPACING = 3 * 1000;\n\n\n/**\n * If a user executes one of these events, s/he is considered not idle.\n * @type {Array<goog.events.EventType>}\n * @private\n */\ngoog.ui.ActivityMonitor.userEventTypesBody_ = [\n  goog.events.EventType.CLICK, goog.events.EventType.DBLCLICK,\n  goog.events.EventType.MOUSEDOWN, goog.events.EventType.MOUSEMOVE,\n  goog.events.EventType.MOUSEUP\n];\n\n\n/**\n * If a user executes one of these events, s/he is considered not idle.\n * Note: monitoring touch events within iframe cause problems in iOS.\n * @type {Array<goog.events.EventType>}\n * @private\n */\ngoog.ui.ActivityMonitor.userTouchEventTypesBody_ = [\n  goog.events.EventType.TOUCHEND, goog.events.EventType.TOUCHMOVE,\n  goog.events.EventType.TOUCHSTART\n];\n\n\n/**\n * If a user executes one of these events, s/he is considered not idle.\n * @type {Array<goog.events.EventType>}\n * @private\n */\ngoog.ui.ActivityMonitor.userEventTypesDocuments_ =\n    [goog.events.EventType.KEYDOWN, goog.events.EventType.KEYUP];\n\n\n/**\n * Event constants for the activity monitor.\n * @enum {string}\n */\ngoog.ui.ActivityMonitor.Event = {\n  /** Event fired when the user does something interactive */\n  ACTIVITY: 'activity'\n};\n\n\n/** @override */\ngoog.ui.ActivityMonitor.prototype.disposeInternal = function() {\n  goog.ui.ActivityMonitor.superClass_.disposeInternal.call(this);\n  this.eventHandler_.dispose();\n  this.eventHandler_ = null;\n  delete this.documents_;\n};\n\n\n/**\n * Adds a document to those being monitored by this class.\n *\n * @param {Document} doc Document to monitor.\n */\ngoog.ui.ActivityMonitor.prototype.addDocument = function(doc) {\n  if (goog.array.contains(this.documents_, doc)) {\n    return;\n  }\n  this.documents_.push(doc);\n  var useCapture = !this.useBubble_;\n\n  var eventsToListenTo = goog.array.concat(\n      goog.ui.ActivityMonitor.userEventTypesDocuments_,\n      goog.ui.ActivityMonitor.userEventTypesBody_);\n\n  if (!this.isIframe_) {\n    // Monitoring touch events in iframe causes problems interacting with text\n    // fields in iOS (input text, textarea, contenteditable, select/copy/paste),\n    // so just ignore these events. This shouldn't matter much given that a\n    // touchstart event followed by touchend event produces a click event,\n    // which is being monitored correctly.\n    goog.array.extend(\n        eventsToListenTo, goog.ui.ActivityMonitor.userTouchEventTypesBody_);\n  }\n\n  this.eventHandler_.listen(\n      doc, eventsToListenTo, this.handleEvent_, useCapture);\n};\n\n\n/**\n * Removes a document from those being monitored by this class.\n *\n * @param {Document} doc Document to monitor.\n */\ngoog.ui.ActivityMonitor.prototype.removeDocument = function(doc) {\n  if (this.isDisposed()) {\n    return;\n  }\n  goog.array.remove(this.documents_, doc);\n  var useCapture = !this.useBubble_;\n\n  var eventsToUnlistenTo = goog.array.concat(\n      goog.ui.ActivityMonitor.userEventTypesDocuments_,\n      goog.ui.ActivityMonitor.userEventTypesBody_);\n\n  if (!this.isIframe_) {\n    // See note above about monitoring touch events in iframe.\n    goog.array.extend(\n        eventsToUnlistenTo, goog.ui.ActivityMonitor.userTouchEventTypesBody_);\n  }\n\n  this.eventHandler_.unlisten(\n      doc, eventsToUnlistenTo, this.handleEvent_, useCapture);\n};\n\n\n/**\n * Updates the last event time when a user action occurs.\n * @param {goog.events.BrowserEvent} e Event object.\n * @private\n */\ngoog.ui.ActivityMonitor.prototype.handleEvent_ = function(e) {\n  var update = false;\n  switch (e.type) {\n    case goog.events.EventType.MOUSEMOVE:\n      // In FF 1.5, we get spurious mouseover and mouseout events when the UI\n      // redraws. We only want to update the idle time if the mouse has moved.\n      if (typeof this.lastMouseX_ == 'number' &&\n              this.lastMouseX_ != e.clientX ||\n          typeof this.lastMouseY_ == 'number' &&\n              this.lastMouseY_ != e.clientY) {\n        update = true;\n      }\n      this.lastMouseX_ = e.clientX;\n      this.lastMouseY_ = e.clientY;\n      break;\n    default:\n      update = true;\n  }\n\n  if (update) {\n    var type = goog.asserts.assertString(e.type);\n    this.updateIdleTime(goog.now(), type);\n  }\n};\n\n\n/**\n * Updates the last event time to be the present time, useful for non-DOM\n * events that should update idle time.\n */\ngoog.ui.ActivityMonitor.prototype.resetTimer = function() {\n  this.updateIdleTime(goog.now(), 'manual');\n};\n\n\n/**\n * Updates the idle time and fires an event if time has elapsed since\n * the last update.\n * @param {number} eventTime Time (in MS) of the event that cleared the idle\n *     timer.\n * @param {string} eventType Type of the event, used only for debugging.\n * @protected\n */\ngoog.ui.ActivityMonitor.prototype.updateIdleTime = function(\n    eventTime, eventType) {\n  // update internal state noting whether the user was idle\n  this.lastEventTime_ = eventTime;\n  this.lastEventType_ = eventType;\n\n  // dispatch event\n  if (eventTime > this.minEventTime_) {\n    this.dispatchEvent(goog.ui.ActivityMonitor.Event.ACTIVITY);\n    this.minEventTime_ = eventTime + goog.ui.ActivityMonitor.MIN_EVENT_SPACING;\n  }\n};\n\n\n/**\n * Returns the amount of time the user has been idle.\n * @param {number=} opt_now The current time can optionally be passed in for the\n *     computation to avoid an extra Date allocation.\n * @return {number} The amount of time in ms that the user has been idle.\n */\ngoog.ui.ActivityMonitor.prototype.getIdleTime = function(opt_now) {\n  var now = opt_now || goog.now();\n  return now - this.lastEventTime_;\n};\n\n\n/**\n * Returns the type of the last user event.\n * @return {string} event type.\n */\ngoog.ui.ActivityMonitor.prototype.getLastEventType = function() {\n  return this.lastEventType_;\n};\n\n\n/**\n * Returns the time of the last event\n * @return {number} last event time.\n */\ngoog.ui.ActivityMonitor.prototype.getLastEventTime = function() {\n  return this.lastEventTime_;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^1>","^1T","^?","~$goog.events.EventTarget","^1C","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/activitymonitor.js"],"^O",["^=",["~$goog.ui.ActivityMonitor"]],"^W",true,"^X",["^?","^2O","^1L","^1>","^1T","^3W","^1C"]],["^ ","^3",[1579837703000],"^4","goog.ui.emoji.emojipicker.js","^5",["^6","goog/ui/emoji/emojipicker.js"],"^7","goog/ui/emoji/emojipicker.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Emoji Picker implementation. This provides a UI widget for\n * choosing an emoji from a grid of possible choices.\n *\n * @see ../demos/popupemojipicker.html for an example of how to instantiate\n * an emoji picker.\n *\n * Based on goog.ui.ColorPicker (colorpicker.js).\n *\n * @see ../../demos/popupemojipicker.html\n */\n\ngoog.provide('goog.ui.emoji.EmojiPicker');\n\ngoog.require('goog.dom.TagName');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.TabPane');\ngoog.require('goog.ui.emoji.Emoji');\ngoog.require('goog.ui.emoji.EmojiPalette');\ngoog.require('goog.ui.emoji.EmojiPaletteRenderer');\ngoog.require('goog.ui.emoji.ProgressiveEmojiPaletteRenderer');\n\n\n\n/**\n * Creates a new, empty emoji picker. An emoji picker is a grid of emoji, each\n * cell of the grid containing a single emoji. The picker may contain multiple\n * pages of emoji.\n *\n * When a user selects an emoji, by either clicking or pressing enter, the\n * picker fires a goog.ui.Component.EventType.ACTION event with the id. The\n * client listens on this event and in the handler can retrieve the id of the\n * selected emoji and do something with it, for instance, inserting an image\n * tag into a rich text control. An emoji picker does not maintain state. That\n * is, once an emoji is selected, the emoji picker does not remember which emoji\n * was selected.\n *\n * The emoji picker is implemented as a tabpane with each tabpage being a table.\n * Each of the tables are the same size to prevent jittering when switching\n * between pages.\n *\n * @param {string} defaultImgUrl Url of the img that should be used to fill up\n *     the cells in the emoji table, to prevent jittering. Should be the same\n *     size as the emoji.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @extends {goog.ui.Component}\n * @constructor\n */\ngoog.ui.emoji.EmojiPicker = function(defaultImgUrl, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  this.defaultImgUrl_ = defaultImgUrl;\n\n  /**\n   * Emoji that this picker displays.\n   *\n   * @type {Array<Object>}\n   * @private\n   */\n  this.emoji_ = [];\n\n  /**\n   * Pages of this emoji picker.\n   *\n   * @type {Array<goog.ui.emoji.EmojiPalette>}\n   * @private\n   */\n  this.pages_ = [];\n\n  /**\n   * Keeps track of which pages in the picker have been loaded. Used for delayed\n   * loading of tabs.\n   *\n   * @type {Array<boolean>}\n   * @private\n   */\n  this.pageLoadStatus_ = [];\n\n  /**\n   * Tabpane to hold the pages of this emojipicker.\n   *\n   * @type {?goog.ui.TabPane}\n   * @private\n   */\n  this.tabPane_ = null;\n\n  this.getHandler().listen(\n      this, goog.ui.Component.EventType.ACTION, this.onEmojiPaletteAction_);\n};\ngoog.inherits(goog.ui.emoji.EmojiPicker, goog.ui.Component);\n\n\n/**\n * Default number of rows per grid of emoji.\n *\n * @type {number}\n */\ngoog.ui.emoji.EmojiPicker.DEFAULT_NUM_ROWS = 5;\n\n\n/**\n * Default number of columns per grid of emoji.\n *\n * @type {number}\n */\ngoog.ui.emoji.EmojiPicker.DEFAULT_NUM_COLS = 10;\n\n\n/**\n * Default location of the tabs in relation to the emoji grids.\n *\n * @type {goog.ui.TabPane.TabLocation}\n */\ngoog.ui.emoji.EmojiPicker.DEFAULT_TAB_LOCATION =\n    goog.ui.TabPane.TabLocation.TOP;\n\n\n/** @private {goog.ui.emoji.Emoji} */\ngoog.ui.emoji.EmojiPicker.prototype.selectedEmoji_;\n\n\n/** @private {goog.ui.emoji.EmojiPaletteRenderer} */\ngoog.ui.emoji.EmojiPicker.prototype.renderer_;\n\n\n/**\n * Number of rows per grid of emoji.\n *\n * @type {number}\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.numRows_ =\n    goog.ui.emoji.EmojiPicker.DEFAULT_NUM_ROWS;\n\n\n/**\n * Number of columns per grid of emoji.\n *\n * @type {number}\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.numCols_ =\n    goog.ui.emoji.EmojiPicker.DEFAULT_NUM_COLS;\n\n\n/**\n * Whether the number of rows in the picker should be automatically determined\n * by the specified number of columns so as to minimize/eliminate jitter when\n * switching between tabs.\n *\n * @type {boolean}\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.autoSizeByColumnCount_ = true;\n\n\n/**\n * Location of the tabs for the picker tabpane.\n *\n * @type {goog.ui.TabPane.TabLocation}\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.tabLocation_ =\n    goog.ui.emoji.EmojiPicker.DEFAULT_TAB_LOCATION;\n\n\n/**\n * Whether the component is focusable.\n * @type {boolean}\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.focusable_ = true;\n\n\n/**\n * Url of the img that should be used for cells in the emoji picker that are\n * not filled with emoji, i.e., after all the emoji have already been placed\n * on a page.\n *\n * @type {string}\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.defaultImgUrl_;\n\n\n/**\n * If present, indicates a prefix that should be prepended to all URLs\n * of images in this emojipicker. This provides an optimization if the URLs\n * are long, so that the client does not have to send a long string for each\n * emoji.\n *\n * @type {string|undefined}\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.urlPrefix_;\n\n\n/**\n * If true, delay loading the images for the emojipalettes until after\n * construction. This gives a better user experience before the images are in\n * the cache, since other widgets waiting for construction of the emojipalettes\n * won't have to wait for all the images (which may be a substantial amount) to\n * load.\n *\n * @type {boolean}\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.delayedLoad_ = false;\n\n\n/**\n * Whether to use progressive rendering in the emojipicker's palette, if using\n * sprited imgs. If true, then uses img tags, which most browsers render\n * progressively (i.e., as the data comes in). If false, then uses div tags\n * with the background-image, which some newer browsers render progressively\n * but older ones do not.\n *\n * @type {boolean}\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.progressiveRender_ = false;\n\n\n/**\n * Whether to require the caller to manually specify when to start loading\n * animated emoji. This is primarily for unittests to be able to test the\n * structure of the emojipicker palettes before and after the animated emoji\n * have been loaded.\n *\n * @type {boolean}\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.manualLoadOfAnimatedEmoji_ = false;\n\n\n/**\n * Index of the active page in the picker.\n *\n * @type {number}\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.activePage_ = -1;\n\n\n/**\n * Adds a group of emoji to the picker.\n *\n * @param {string|Element} title Title for the group.\n * @param {Array<Array<string>>} emojiGroup A new group of emoji to be added\n *    Each internal array contains [emojiUrl, emojiId].\n */\ngoog.ui.emoji.EmojiPicker.prototype.addEmojiGroup = function(\n    title, emojiGroup) {\n  this.emoji_.push({title: title, emoji: emojiGroup});\n};\n\n\n/**\n * Gets the number of rows per grid in the emoji picker.\n *\n * @return {number} number of rows per grid.\n */\ngoog.ui.emoji.EmojiPicker.prototype.getNumRows = function() {\n  return this.numRows_;\n};\n\n\n/**\n * Gets the number of columns per grid in the emoji picker.\n *\n * @return {number} number of columns per grid.\n */\ngoog.ui.emoji.EmojiPicker.prototype.getNumColumns = function() {\n  return this.numCols_;\n};\n\n\n/**\n * Sets the number of rows per grid in the emoji picker. This should only be\n * called before the picker has been rendered.\n *\n * @param {number} numRows Number of rows per grid.\n */\ngoog.ui.emoji.EmojiPicker.prototype.setNumRows = function(numRows) {\n  this.numRows_ = numRows;\n};\n\n\n/**\n * Sets the number of columns per grid in the emoji picker. This should only be\n * called before the picker has been rendered.\n *\n * @param {number} numCols Number of columns per grid.\n */\ngoog.ui.emoji.EmojiPicker.prototype.setNumColumns = function(numCols) {\n  this.numCols_ = numCols;\n};\n\n\n/**\n * Sets whether to automatically size the emojipicker based on the number of\n * columns and the number of emoji in each group, so as to reduce jitter.\n *\n * @param {boolean} autoSize Whether to automatically size the picker.\n */\ngoog.ui.emoji.EmojiPicker.prototype.setAutoSizeByColumnCount = function(\n    autoSize) {\n  this.autoSizeByColumnCount_ = autoSize;\n};\n\n\n/**\n * Sets the location of the tabs in relation to the emoji grids. This should\n * only be called before the picker has been rendered.\n *\n * @param {goog.ui.TabPane.TabLocation} tabLocation The location of the tabs.\n */\ngoog.ui.emoji.EmojiPicker.prototype.setTabLocation = function(tabLocation) {\n  this.tabLocation_ = tabLocation;\n};\n\n\n/**\n * Sets whether loading of images should be delayed until after dom creation.\n * Thus, this function must be called before {@link #createDom}. If set to true,\n * the client must call {@link #loadImages} when they wish the images to be\n * loaded.\n *\n * @param {boolean} shouldDelay Whether to delay loading the images.\n */\ngoog.ui.emoji.EmojiPicker.prototype.setDelayedLoad = function(shouldDelay) {\n  this.delayedLoad_ = shouldDelay;\n};\n\n\n/**\n * Sets whether to require the caller to manually specify when to start loading\n * animated emoji. This is primarily for unittests to be able to test the\n * structure of the emojipicker palettes before and after the animated emoji\n * have been loaded. This only affects sprited emojipickers with sprite data\n * for animated emoji.\n *\n * @param {boolean} manual Whether to load animated emoji manually.\n */\ngoog.ui.emoji.EmojiPicker.prototype.setManualLoadOfAnimatedEmoji = function(\n    manual) {\n  this.manualLoadOfAnimatedEmoji_ = manual;\n};\n\n\n/**\n * Returns true if the component is focusable, false otherwise.  The default\n * is true.  Focusable components always have a tab index and allocate a key\n * handler to handle keyboard events while focused.\n * @return {boolean} Whether the component is focusable.\n */\ngoog.ui.emoji.EmojiPicker.prototype.isFocusable = function() {\n  return this.focusable_;\n};\n\n\n/**\n * Sets whether the component is focusable.  The default is true.\n * Focusable components always have a tab index and allocate a key handler to\n * handle keyboard events while focused.\n * @param {boolean} focusable Whether the component is focusable.\n */\ngoog.ui.emoji.EmojiPicker.prototype.setFocusable = function(focusable) {\n  this.focusable_ = focusable;\n  for (var i = 0; i < this.pages_.length; i++) {\n    if (this.pages_[i]) {\n      this.pages_[i].setSupportedState(\n          goog.ui.Component.State.FOCUSED, focusable);\n    }\n  }\n};\n\n\n/**\n * Sets the URL prefix for the emoji URLs.\n *\n * @param {string} urlPrefix Prefix that should be prepended to all URLs.\n */\ngoog.ui.emoji.EmojiPicker.prototype.setUrlPrefix = function(urlPrefix) {\n  this.urlPrefix_ = urlPrefix;\n};\n\n\n/**\n * Sets the progressive rendering aspect of this emojipicker. Must be called\n * before createDom to have an effect.\n *\n * @param {boolean} progressive Whether this picker should render progressively.\n */\ngoog.ui.emoji.EmojiPicker.prototype.setProgressiveRender = function(\n    progressive) {\n  this.progressiveRender_ = progressive;\n};\n\n\n/**\n * Adjusts the number of rows to be the maximum row count out of all the emoji\n * groups, in order to prevent jitter in switching among the tabs.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.emoji.EmojiPicker.prototype.adjustNumRowsIfNecessary_ = function() {\n  var currentMax = 0;\n\n  for (var i = 0; i < this.emoji_.length; i++) {\n    var numEmoji = this.emoji_[i].emoji.length;\n    var rowsNeeded = Math.ceil(numEmoji / this.numCols_);\n    if (rowsNeeded > currentMax) {\n      currentMax = rowsNeeded;\n    }\n  }\n\n  this.setNumRows(currentMax);\n};\n\n\n/**\n * Causes the emoji imgs to be loaded into the picker. Used for delayed loading.\n * No-op if delayed loading is not set.\n */\ngoog.ui.emoji.EmojiPicker.prototype.loadImages = function() {\n  if (!this.delayedLoad_) {\n    return;\n  }\n\n  // Load the first page only\n  this.loadPage_(0);\n  this.activePage_ = 0;\n};\n\n\n/**\n * @override\n * @suppress {deprecated,strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.emoji.EmojiPicker.prototype.createDom = function() {\n  this.setElementInternal(this.getDomHelper().createDom(goog.dom.TagName.DIV));\n\n  if (this.autoSizeByColumnCount_) {\n    this.adjustNumRowsIfNecessary_();\n  }\n\n  if (this.emoji_.length == 0) {\n    throw new Error('Must add some emoji to the picker');\n  }\n\n  // If there is more than one group of emoji, we construct a tabpane\n  if (this.emoji_.length > 1) {\n    // Give the tabpane a div to use as its content element, since tabpane\n    // overwrites the CSS class of the element it's passed\n    var div = this.getDomHelper().createDom(goog.dom.TagName.DIV);\n    this.getElement().appendChild(div);\n    this.tabPane_ = new goog.ui.TabPane(\n        div, this.tabLocation_, this.getDomHelper(), true /* use MOUSEDOWN */);\n  }\n\n  this.renderer_ = this.progressiveRender_ ?\n      new goog.ui.emoji.ProgressiveEmojiPaletteRenderer(this.defaultImgUrl_) :\n      new goog.ui.emoji.EmojiPaletteRenderer(this.defaultImgUrl_);\n\n  for (var i = 0; i < this.emoji_.length; i++) {\n    var emoji = this.emoji_[i].emoji;\n    var page = this.delayedLoad_ ? this.createPlaceholderEmojiPage_(emoji) :\n                                   this.createEmojiPage_(emoji, i);\n    this.pages_.push(page);\n  }\n\n  this.activePage_ = 0;\n  this.getElement().tabIndex = 0;\n};\n\n\n/**\n * Used by unittests to manually load the animated emoji for this picker.\n */\ngoog.ui.emoji.EmojiPicker.prototype.manuallyLoadAnimatedEmoji = function() {\n  for (var i = 0; i < this.pages_.length; i++) {\n    this.pages_[i].loadAnimatedEmoji();\n  }\n};\n\n\n/**\n * Creates a page if it has not already been loaded. This has the side effects\n * of setting the load status of the page to true.\n *\n * @param {Array<Array<string>>} emoji Emoji for this page. See\n *     {@link addEmojiGroup} for more details.\n * @param {number} index Index of the page in the emojipicker.\n * @return {goog.ui.emoji.EmojiPalette} the emoji page.\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.createEmojiPage_ = function(emoji, index) {\n  // Safeguard against trying to create the same page twice\n  if (this.pageLoadStatus_[index]) {\n    return null;\n  }\n\n  var palette = new goog.ui.emoji.EmojiPalette(\n      emoji, this.urlPrefix_, this.renderer_, this.getDomHelper());\n  if (!this.manualLoadOfAnimatedEmoji_) {\n    palette.loadAnimatedEmoji();\n  }\n  palette.setSize(this.numCols_, this.numRows_);\n  palette.setSupportedState(goog.ui.Component.State.FOCUSED, this.focusable_);\n  palette.createDom();\n  palette.setParent(this);\n\n  this.pageLoadStatus_[index] = true;\n\n  return palette;\n};\n\n\n/**\n * Returns an array of emoji whose real URLs have been replaced with the\n * default img URL. Used for delayed loading.\n *\n * @param {Array<Array<string>>} emoji Original emoji array.\n * @return {!Array<!Array<string>>} emoji array with all emoji pointing to the\n *     default img.\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.getPlaceholderEmoji_ = function(emoji) {\n  var placeholderEmoji = [];\n\n  for (var i = 0; i < emoji.length; i++) {\n    placeholderEmoji.push([this.defaultImgUrl_, emoji[i][1]]);\n  }\n\n  return placeholderEmoji;\n};\n\n\n/**\n * Creates an emoji page using placeholder emoji pointing to the default\n * img instead of the real emoji. Used for delayed loading.\n *\n * @param {Array<Array<string>>} emoji Emoji for this page. See\n *     {@link addEmojiGroup} for more details.\n * @return {!goog.ui.emoji.EmojiPalette} the emoji page.\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.createPlaceholderEmojiPage_ = function(\n    emoji) {\n  var placeholderEmoji = this.getPlaceholderEmoji_(emoji);\n\n  var palette = new goog.ui.emoji.EmojiPalette(\n      placeholderEmoji,\n      null,  // no url prefix\n      this.renderer_, this.getDomHelper());\n  palette.setSize(this.numCols_, this.numRows_);\n  palette.setSupportedState(goog.ui.Component.State.FOCUSED, this.focusable_);\n  palette.createDom();\n  palette.setParent(this);\n\n  return palette;\n};\n\n\n/**\n * EmojiPickers cannot be used to decorate pre-existing html, since the\n * structure they build is fairly complicated.\n * @param {Element} element Element to decorate.\n * @return {boolean} Returns always false.\n * @override\n */\ngoog.ui.emoji.EmojiPicker.prototype.canDecorate = function(element) {\n  return false;\n};\n\n\n/**\n * @override\n * @suppress {deprecated,strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.emoji.EmojiPicker.prototype.enterDocument = function() {\n  goog.ui.emoji.EmojiPicker.superClass_.enterDocument.call(this);\n\n  for (var i = 0; i < this.pages_.length; i++) {\n    this.pages_[i].enterDocument();\n    var pageElement = this.pages_[i].getElement();\n\n    // Add a new tab to the tabpane if there's more than one group of emoji.\n    // If there is just one group of emoji, then we simply use the single\n    // page's element as the content for the picker\n    if (this.pages_.length > 1) {\n      // Create a simple default title containg the page number if the title\n      // was not provided in the emoji group params\n      var title = this.emoji_[i].title || (i + 1);\n      this.tabPane_.addPage(\n          new goog.ui.TabPane.TabPage(pageElement, title, this.getDomHelper()));\n    } else {\n      this.getElement().appendChild(pageElement);\n    }\n  }\n\n  // Initialize listeners. Note that we need to initialize this listener\n  // after createDom, because addPage causes the goog.ui.TabPane.Events.CHANGE\n  // event to fire, but we only want the handler (which loads delayed images)\n  // to run after the picker has been constructed.\n  if (this.tabPane_) {\n    this.getHandler().listen(\n        this.tabPane_, goog.ui.TabPane.Events.CHANGE, this.onPageChanged_);\n\n    // Make the tabpane unselectable so that changing tabs doesn't disturb the\n    // cursor\n    goog.style.setUnselectable(this.tabPane_.getElement(), true);\n  }\n\n  this.getElement().unselectable = 'on';\n};\n\n\n/** @override */\ngoog.ui.emoji.EmojiPicker.prototype.exitDocument = function() {\n  goog.ui.emoji.EmojiPicker.superClass_.exitDocument.call(this);\n  for (var i = 0; i < this.pages_.length; i++) {\n    this.pages_[i].exitDocument();\n  }\n};\n\n\n/** @override */\ngoog.ui.emoji.EmojiPicker.prototype.disposeInternal = function() {\n  goog.ui.emoji.EmojiPicker.superClass_.disposeInternal.call(this);\n\n  if (this.tabPane_) {\n    this.tabPane_.dispose();\n    this.tabPane_ = null;\n  }\n\n  for (var i = 0; i < this.pages_.length; i++) {\n    this.pages_[i].dispose();\n  }\n  this.pages_.length = 0;\n};\n\n\n/**\n * @return {string} CSS class for the root element of EmojiPicker.\n */\ngoog.ui.emoji.EmojiPicker.prototype.getCssClass = function() {\n  return goog.getCssName('goog-ui-emojipicker');\n};\n\n\n/**\n * Returns the currently selected emoji from this picker. If the picker is\n * using the URL prefix optimization, allocates a new emoji object with the\n * full URL. This method is meant to be used by clients of the emojipicker,\n * e.g., in a listener on goog.ui.component.EventType.ACTION that wants to use\n * the just-selected emoji.\n *\n * @return {goog.ui.emoji.Emoji} The currently selected emoji from this picker.\n */\ngoog.ui.emoji.EmojiPicker.prototype.getSelectedEmoji = function() {\n  return this.urlPrefix_ ?\n      new goog.ui.emoji.Emoji(\n          this.urlPrefix_ + this.selectedEmoji_.getId(),\n          this.selectedEmoji_.getId()) :\n      this.selectedEmoji_;\n};\n\n\n/**\n * Returns the number of emoji groups in this picker.\n *\n * @return {number} The number of emoji groups in this picker.\n */\ngoog.ui.emoji.EmojiPicker.prototype.getNumEmojiGroups = function() {\n  return this.emoji_.length;\n};\n\n\n/**\n * Returns a page from the picker. This should be considered protected, and is\n * ONLY FOR TESTING.\n *\n * @param {number} index Index of the page to return.\n * @return {goog.ui.emoji.EmojiPalette?} the page at the specified index or null\n *     if none exists.\n */\ngoog.ui.emoji.EmojiPicker.prototype.getPage = function(index) {\n  return this.pages_[index];\n};\n\n\n/**\n * Returns all the pages from the picker. This should be considered protected,\n * and is ONLY FOR TESTING.\n *\n * @return {Array<goog.ui.emoji.EmojiPalette>?} the pages in the picker or\n *     null if none exist.\n */\ngoog.ui.emoji.EmojiPicker.prototype.getPages = function() {\n  return this.pages_;\n};\n\n\n/**\n * Returns the tabpane if this is a multipage picker. This should be considered\n * protected, and is ONLY FOR TESTING.\n *\n * @return {goog.ui.TabPane} the tabpane if it is a multipage picker,\n *     or null if it does not exist or is a single page picker.\n */\ngoog.ui.emoji.EmojiPicker.prototype.getTabPane = function() {\n  return this.tabPane_;\n};\n\n\n/**\n * @return {goog.ui.emoji.EmojiPalette} The active page of the emoji picker.\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.getActivePage_ = function() {\n  return this.pages_[this.activePage_];\n};\n\n\n/**\n * Handles actions from the EmojiPalettes that this picker contains.\n *\n * @param {goog.ui.Component.EventType} e The event object.\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.onEmojiPaletteAction_ = function(e) {\n  this.selectedEmoji_ = this.getActivePage_().getSelectedEmoji();\n};\n\n\n/**\n * Handles changes in the active page in the tabpane.\n *\n * @param {goog.ui.TabPaneEvent} e The event object.\n * @private\n */\ngoog.ui.emoji.EmojiPicker.prototype.onPageChanged_ = function(e) {\n  var index = /** @type {number} */ (e.page.getIndex());\n  this.loadPage_(index);\n  this.activePage_ = index;\n};\n\n\n/**\n * Loads a page into the picker if it has not yet been loaded.\n * @param {number} index Index of the page to load.\n * @private\n * @suppress {deprecated,strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.emoji.EmojiPicker.prototype.loadPage_ = function(index) {\n  if (index < 0 || index > this.pages_.length) {\n    throw new Error('Index out of bounds');\n  }\n\n  if (!this.pageLoadStatus_[index]) {\n    var oldPage = this.pages_[index];\n    this.pages_[index] = this.createEmojiPage_(this.emoji_[index].emoji, index);\n    this.pages_[index].enterDocument();\n    var pageElement = this.pages_[index].getElement();\n    if (this.pages_.length > 1) {\n      this.tabPane_.removePage(index);\n      var title = this.emoji_[index].title || (index + 1);\n      this.tabPane_.addPage(\n          new goog.ui.TabPane.TabPage(pageElement, title, this.getDomHelper()),\n          index);\n      this.tabPane_.setSelectedIndex(index);\n    } else {\n      var el = this.getElement();\n      el.appendChild(pageElement);\n    }\n    if (oldPage) {\n      oldPage.dispose();\n    }\n  }\n};\n","^;",1579837703000,"^<",["^=",["~$goog.ui.emoji.EmojiPaletteRenderer","~$goog.ui.emoji.EmojiPalette","~$goog.ui.TabPane","^1P","^?","^10","~$goog.ui.emoji.ProgressiveEmojiPaletteRenderer","^1F","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/emoji/emojipicker.js"],"^O",["^=",["~$goog.ui.emoji.EmojiPicker"]],"^W",true,"^X",["^?","^12","^1F","^1P","^3[","^10","^3Z","^3Y","^40"]],["^ ","^3",[1579837703000],"^4","goog.labs.testing.dictionarymatcher.js","^5",["^6","goog/labs/testing/dictionarymatcher.js"],"^7","goog/labs/testing/dictionarymatcher.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides the built-in dictionary matcher methods like\n *     hasEntry, hasEntries, hasKey, hasValue, etc.\n */\n\n\ngoog.provide('goog.labs.testing.HasEntriesMatcher');\ngoog.provide('goog.labs.testing.HasEntryMatcher');\ngoog.provide('goog.labs.testing.HasKeyMatcher');\ngoog.provide('goog.labs.testing.HasValueMatcher');\n\ngoog.require('goog.asserts');\ngoog.require('goog.labs.testing.Matcher');\ngoog.require('goog.object');\n\n\n\n/**\n * The HasEntries matcher.\n *\n * @param {!Object} entries The entries to check in the object.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.HasEntriesMatcher = function(entries) {\n  /**\n   * @type {Object}\n   * @private\n   */\n  this.entries_ = entries;\n};\n\n\n/**\n * Determines if an object has particular entries.\n *\n * @override\n */\ngoog.labs.testing.HasEntriesMatcher.prototype.matches = function(actualObject) {\n  goog.asserts.assertObject(actualObject, 'Expected an Object');\n  var object = /** @type {!Object} */ (actualObject);\n  return goog.object.every(this.entries_, function(value, key) {\n    return goog.object.containsKey(object, key) && object[key] === value;\n  });\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.HasEntriesMatcher.prototype.describe = function(\n    actualObject) {\n  goog.asserts.assertObject(actualObject, 'Expected an Object');\n  var object = /** @type {!Object} */ (actualObject);\n  var errorString = 'Input object did not contain the following entries:\\n';\n  goog.object.forEach(this.entries_, function(value, key) {\n    if (!goog.object.containsKey(object, key) || object[key] !== value) {\n      errorString += key + ': ' + value + '\\n';\n    }\n  });\n  return errorString;\n};\n\n\n\n/**\n * The HasEntry matcher.\n *\n * @param {string} key The key for the entry.\n * @param {*} value The value for the key.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.HasEntryMatcher = function(key, value) {\n  /**\n   * @type {string}\n   * @private\n   */\n  this.key_ = key;\n  /**\n   * @type {*}\n   * @private\n   */\n  this.value_ = value;\n};\n\n\n/**\n * Determines if an object has a particular entry.\n *\n * @override\n */\ngoog.labs.testing.HasEntryMatcher.prototype.matches = function(actualObject) {\n  goog.asserts.assertObject(actualObject);\n  return goog.object.containsKey(actualObject, this.key_) &&\n      actualObject[this.key_] === this.value_;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.HasEntryMatcher.prototype.describe = function(actualObject) {\n  goog.asserts.assertObject(actualObject);\n  var errorMsg;\n  if (goog.object.containsKey(actualObject, this.key_)) {\n    errorMsg = 'Input object did not contain key: ' + this.key_;\n  } else {\n    errorMsg = 'Value for key did not match value: ' + this.value_;\n  }\n  return errorMsg;\n};\n\n\n\n/**\n * The HasKey matcher.\n *\n * @param {string} key The key to check in the object.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.HasKeyMatcher = function(key) {\n  /**\n   * @type {string}\n   * @private\n   */\n  this.key_ = key;\n};\n\n\n/**\n * Determines if an object has a key.\n *\n * @override\n */\ngoog.labs.testing.HasKeyMatcher.prototype.matches = function(actualObject) {\n  goog.asserts.assertObject(actualObject);\n  return goog.object.containsKey(actualObject, this.key_);\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.HasKeyMatcher.prototype.describe = function(actualObject) {\n  goog.asserts.assertObject(actualObject);\n  return 'Input object did not contain the key: ' + this.key_;\n};\n\n\n\n/**\n * The HasValue matcher.\n *\n * @param {*} value The value to check in the object.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.HasValueMatcher = function(value) {\n  /**\n   * @type {*}\n   * @private\n   */\n  this.value_ = value;\n};\n\n\n/**\n * Determines if an object contains a value\n *\n * @override\n */\ngoog.labs.testing.HasValueMatcher.prototype.matches = function(actualObject) {\n  goog.asserts.assertObject(actualObject, 'Expected an Object');\n  var object = /** @type {!Object} */ (actualObject);\n  return goog.object.containsValue(object, this.value_);\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.HasValueMatcher.prototype.describe = function(actualObject) {\n  return 'Input object did not contain the value: ' + this.value_;\n};\n\n\n/**\n * Gives a matcher that asserts an object contains all the given key-value pairs\n * in the input object.\n *\n * @param {!Object} entries The entries to check for presence in the object.\n * @return {!goog.labs.testing.HasEntriesMatcher} A HasEntriesMatcher.\n */\nvar hasEntries =\n    goog.labs.testing.HasEntriesMatcher.hasEntries = function(entries) {\n      return new goog.labs.testing.HasEntriesMatcher(entries);\n    };\n\n\n/**\n * Gives a matcher that asserts an object contains the given key-value pair.\n *\n * @param {string} key The key to check for presence in the object.\n * @param {*} value The value to check for presence in the object.\n * @return {!goog.labs.testing.HasEntryMatcher} A HasEntryMatcher.\n */\nvar hasEntry =\n    goog.labs.testing.HasEntryMatcher.hasEntry = function(key, value) {\n      return new goog.labs.testing.HasEntryMatcher(key, value);\n    };\n\n\n/**\n * Gives a matcher that asserts an object contains the given key.\n *\n * @param {string} key The key to check for presence in the object.\n * @return {!goog.labs.testing.HasKeyMatcher} A HasKeyMatcher.\n */\nvar hasKey = goog.labs.testing.HasKeyMatcher.hasKey = function(key) {\n  return new goog.labs.testing.HasKeyMatcher(key);\n};\n\n\n/**\n * Gives a matcher that asserts an object contains the given value.\n *\n * @param {*} value The value to check for presence in the object.\n * @return {!goog.labs.testing.HasValueMatcher} A HasValueMatcher.\n */\nvar hasValue = goog.labs.testing.HasValueMatcher.hasValue = function(value) {\n  return new goog.labs.testing.HasValueMatcher(value);\n};\n","^;",1579837703000,"^<",["^=",["^1L","^>","^?","~$goog.object"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/testing/dictionarymatcher.js"],"^O",["^=",["~$goog.labs.testing.HasKeyMatcher","~$goog.labs.testing.HasEntryMatcher","~$goog.labs.testing.HasEntriesMatcher","~$goog.labs.testing.HasValueMatcher"]],"^W",true,"^X",["^?","^1L","^>","^42"]],["^ ","^3",[1579837703000],"^4","goog.i18n.collation.js","^5",["^6","goog/i18n/collation.js"],"^7","goog/i18n/collation.js","^8","^9","^:","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Contains helper functions for performing locale-sensitive\n *     collation.\n */\n\n\ngoog.provide('goog.i18n.collation');\n\n\n/**\n * Returns the comparator for a locale. If a locale is not explicitly specified,\n * a comparator for the user's locale will be returned. Note that if the browser\n * does not support locale-sensitive string comparisons, the comparator returned\n * will be a simple codepoint comparator.\n *\n * @param {string=} opt_locale the locale that the comparator is used for.\n * @param {{usage: (string|undefined), localeMatcher: (string|undefined),\n *     sensitivity: (string|undefined), ignorePunctuation: (boolean|undefined),\n *     numeric: (boolean|undefined), caseFirst: (string|undefined)}=}\n *         opt_options the optional set of options for use with the native\n *         collator.\n * @return {function(string, string): number} The locale-specific comparator.\n */\ngoog.i18n.collation.createComparator = function(opt_locale, opt_options) {\n  // See http://code.google.com/p/v8-i18n.\n  if (goog.i18n.collation.hasNativeComparator()) {\n    const intl = goog.global.Intl;\n    return new intl.Collator([opt_locale || goog.LOCALE], opt_options || {})\n        .compare;\n  } else {\n    return function(arg1, arg2) { return arg1.localeCompare(arg2); };\n  }\n};\n\n\n/**\n * Returns true if a locale-sensitive comparator is available for a locale. If\n * a locale is not explicitly specified, the user's locale is used instead.\n *\n * @param {string=} opt_locale The locale to be checked.\n * @return {boolean} Whether there is a locale-sensitive comparator available\n *     for the locale.\n */\ngoog.i18n.collation.hasNativeComparator = function(opt_locale) {\n  const intl = goog.global.Intl;\n  return !!(intl && intl.Collator);\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/collation.js"],"^O",["^=",["~$goog.i18n.collation"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.html.sanitizer.tagwhitelist.js","^5",["^6","goog/html/sanitizer/tagwhitelist.js"],"^7","goog/html/sanitizer/tagwhitelist.js","^8","^9","^:","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Contains the tag whitelist for use in the Html sanitizer.\n */\n\ngoog.provide('goog.html.sanitizer.TagWhitelist');\n\n\n/**\n * A tag whitelist for allowed tags. Tag names must be in all caps.\n * @const @dict {boolean}\n */\ngoog.html.sanitizer.TagWhitelist = {\n  'A': true,           // HTMLAnchorElement\n  'ABBR': true,        // HTMLElement\n  'ACRONYM': true,     // HTMLElement\n  'ADDRESS': true,     // HTMLElement\n  'AREA': true,        // HTMLAreaElement\n  'ARTICLE': true,     // HTMLElement\n  'ASIDE': true,       // HTMLElement\n  'B': true,           // HTMLElement\n  'BDI': true,         // HTMLElement\n  'BDO': true,         // HTMLElement\n  'BIG': true,         // HTMLElement\n  'BLOCKQUOTE': true,  // HTMLQuoteElement\n  'BR': true,          // HTMLBRElement\n  'BUTTON': true,      // HTMLButtonElement\n  'CAPTION': true,     // HTMLTableCaptionElement\n  'CENTER': true,      // HTMLElement\n  'CITE': true,        // HTMLElement\n  'CODE': true,        // HTMLElement\n  'COL': true,         // HTMLTableColElement\n  'COLGROUP': true,    // HTMLTableColElement\n  'DATA': true,        // HTMLElement\n  'DATALIST': true,    // HTMLDataListElement\n  'DD': true,          // HTMLElement\n  'DEL': true,         // HTMLModElement\n  'DETAILS': true,     // HTMLDetailsElement\n  'DFN': true,         // HTMLElement\n  'DIALOG': true,      // HTMLDialogElement\n  'DIR': true,         // HTMLDirectoryElement\n  'DIV': true,         // HTMLDivElement\n  'DL': true,          // HTMLDListElement\n  'DT': true,          // HTMLElement\n  'EM': true,          // HTMLElement\n  'FIELDSET': true,    // HTMLFieldSetElement\n  'FIGCAPTION': true,  // HTMLElement\n  'FIGURE': true,      // HTMLElement\n  'FONT': true,        // HTMLFontElement\n  'FOOTER': true,      // HTMLElement\n  // Disallowed by default via tagBlacklist unless allowed via the builder.\n  'FORM': true,      // HTMLFormElement\n  'H1': true,        // HTMLHeadingElement\n  'H2': true,        // HTMLHeadingElement\n  'H3': true,        // HTMLHeadingElement\n  'H4': true,        // HTMLHeadingElement\n  'H5': true,        // HTMLHeadingElement\n  'H6': true,        // HTMLHeadingElement\n  'HEADER': true,    // HTMLElement\n  'HGROUP': true,    // HTMLElement\n  'HR': true,        // HTMLHRElement\n  'I': true,         // HTMLElement\n  'IMG': true,       // HTMLImageElement\n  'INPUT': true,     // HTMLInputElement\n  'INS': true,       // HTMLModElement\n  'KBD': true,       // HTMLElement\n  'LABEL': true,     // HTMLLabelElement\n  'LEGEND': true,    // HTMLLegendElement\n  'LI': true,        // HTMLLIElement\n  'MAIN': true,      // HTMLElement\n  'MAP': true,       // HTMLMapElement\n  'MARK': true,      // HTMLElement\n  'MENU': true,      // HTMLMenuElement\n  'METER': true,     // HTMLMeterElement\n  'NAV': true,       // HTMLElement\n  'NOSCRIPT': true,  // HTMLElement\n  'OL': true,        // HTMLOListElement\n  'OPTGROUP': true,  // HTMLOptGroupElement\n  'OPTION': true,    // HTMLOptionElement\n  'OUTPUT': true,    // HTMLOutputElement\n  'P': true,         // HTMLParagraphElement\n  'PRE': true,       // HTMLPreElement\n  'PROGRESS': true,  // HTMLProgressElement\n  'Q': true,         // HTMLQuoteElement\n  'S': true,         // HTMLElement\n  'SAMP': true,      // HTMLElement\n  'SECTION': true,   // HTMLElement\n  'SELECT': true,    // HTMLSelectElement\n  'SMALL': true,     // HTMLElement\n  'SOURCE': true,    // HTMLSourceElement\n  'SPAN': true,      // HTMLSpanElement\n  'STRIKE': true,    // HTMLElement\n  'STRONG': true,    // HTMLElement\n  // Disallowed by default via tagBlacklist unless allowed via the builder.\n  'STYLE': true,     // HTMLStyleElement\n  'SUB': true,       // HTMLElement\n  'SUMMARY': true,   // HTMLElement\n  'SUP': true,       // HTMLElement\n  'TABLE': true,     // HTMLTableElement\n  'TBODY': true,     // HTMLTableSectionElement\n  'TD': true,        // HTMLTableDataCellElement\n  'TEXTAREA': true,  // HTMLTextAreaElement\n  'TFOOT': true,     // HTMLTableSectionElement\n  'TH': true,        // HTMLTableHeaderCellElement\n  'THEAD': true,     // HTMLTableSectionElement\n  'TIME': true,      // HTMLTimeElement\n  'TR': true,        // HTMLTableRowElement\n  'TT': true,        // HTMLElement\n  'U': true,         // HTMLElement\n  'UL': true,        // HTMLUListElement\n  'VAR': true,       // HTMLElement\n  'WBR': true        // HTMLElement\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/sanitizer/tagwhitelist.js"],"^O",["^=",["~$goog.html.sanitizer.TagWhitelist"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.net.testdata.jsloader_test4.js","^5",["^6","goog/net/testdata/jsloader_test4.js"],"^7","goog/net/testdata/jsloader_test4.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved\n\n/**\n * @fileoverview Test #4 of jsloader.\n */\n\ngoog.provide('goog.net.testdata.jsloader_test4');\ngoog.setTestOnly('jsloader_test4');\n\nwindow['test4Callback']('Test #4 loaded');\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/testdata/jsloader_test4.js"],"^O",["^=",["~$goog.net.testdata.jsloader_test4","~$goog.net.testdata.jsloader-test4"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.ui.tooltip.js","^5",["^6","goog/ui/tooltip.js"],"^7","goog/ui/tooltip.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Tooltip widget implementation.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/tooltip.html\n */\n\ngoog.provide('goog.ui.Tooltip');\ngoog.provide('goog.ui.Tooltip.CursorTooltipPosition');\ngoog.provide('goog.ui.Tooltip.ElementTooltipPosition');\ngoog.provide('goog.ui.Tooltip.State');\n\ngoog.require('goog.Timer');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.FocusHandler');\ngoog.require('goog.math.Box');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.positioning');\ngoog.require('goog.positioning.AnchoredPosition');\ngoog.require('goog.positioning.Corner');\ngoog.require('goog.positioning.Overflow');\ngoog.require('goog.positioning.OverflowStatus');\ngoog.require('goog.positioning.ViewportPosition');\ngoog.require('goog.structs.Set');\ngoog.require('goog.style');\ngoog.require('goog.ui.Popup');\ngoog.require('goog.ui.PopupBase');\n\n\n\n/**\n * Tooltip widget. Can be attached to one or more elements and is shown, with a\n * slight delay, when the the cursor is over the element or the element gains\n * focus.\n *\n * @param {Element|string=} opt_el Element to display tooltip for, either\n *     element reference or string id.\n * @param {?string=} opt_str Text message to display in tooltip.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.Popup}\n */\ngoog.ui.Tooltip = function(opt_el, opt_str, opt_domHelper) {\n  /**\n   * Dom Helper\n   * @type {goog.dom.DomHelper}\n   * @private\n   */\n  this.dom_ = opt_domHelper ||\n      (opt_el ? goog.dom.getDomHelper(goog.dom.getElement(opt_el)) :\n                goog.dom.getDomHelper());\n\n  goog.ui.Popup.call(this, this.dom_.createDom(goog.dom.TagName.DIV, {\n    'style': 'position:absolute;display:none;'\n  }));\n\n  /**\n   * Cursor position relative to the page.\n   * @type {!goog.math.Coordinate}\n   * @protected\n   */\n  this.cursorPosition = new goog.math.Coordinate(1, 1);\n\n  /**\n   * Elements this widget is attached to.\n   * @type {goog.structs.Set}\n   * @private\n   */\n  this.elements_ = new goog.structs.Set();\n\n  /**\n   * Keyboard focus event handler for elements inside the tooltip.\n   * @private {?goog.events.FocusHandler}\n   */\n  this.tooltipFocusHandler_ = null;\n\n  // Attach to element, if specified\n  if (opt_el) {\n    this.attach(opt_el);\n  }\n\n  // Set message, if specified.\n  if (opt_str != null) {\n    this.setText(opt_str);\n  }\n};\ngoog.inherits(goog.ui.Tooltip, goog.ui.Popup);\ngoog.tagUnsealableClass(goog.ui.Tooltip);\n\n\n/**\n * List of active (open) tooltip widgets. Used to prevent multiple tooltips\n * from appearing at once.\n *\n * @type {!Array<goog.ui.Tooltip>}\n * @private\n */\ngoog.ui.Tooltip.activeInstances_ = [];\n\n\n/**\n * Active element reference. Used by the delayed show functionality to keep\n * track of the element the mouse is over or the element with focus.\n * @type {?Element}\n * @private\n */\ngoog.ui.Tooltip.prototype.activeEl_ = null;\n\n\n/**\n * CSS class name for tooltip.\n *\n * @type {string}\n */\ngoog.ui.Tooltip.prototype.className = goog.getCssName('goog-tooltip');\n\n\n/**\n * Delay in milliseconds since the last mouseover or mousemove before the\n * tooltip is displayed for an element.\n *\n * @type {number}\n * @private\n */\ngoog.ui.Tooltip.prototype.showDelayMs_ = 500;\n\n\n/**\n * Timer for when to show.\n *\n * @type {number|undefined}\n * @protected\n */\ngoog.ui.Tooltip.prototype.showTimer;\n\n\n/**\n * Delay in milliseconds before tooltips are hidden.\n *\n * @type {number}\n * @private\n */\ngoog.ui.Tooltip.prototype.hideDelayMs_ = 0;\n\n\n/**\n * Timer for when to hide.\n *\n * @type {number|undefined}\n * @protected\n */\ngoog.ui.Tooltip.prototype.hideTimer;\n\n\n/**\n * Element that triggered the tooltip.  Note that if a second element triggers\n * this tooltip, anchor becomes that second element, even if its show is\n * cancelled and the original tooltip survives.\n *\n * @type {Element|undefined}\n * @protected\n */\ngoog.ui.Tooltip.prototype.anchor;\n\n\n/**\n * Possible states for the tooltip to be in.\n * @enum {number}\n */\ngoog.ui.Tooltip.State = {\n  INACTIVE: 0,\n  WAITING_TO_SHOW: 1,\n  SHOWING: 2,\n  WAITING_TO_HIDE: 3,\n  UPDATING: 4  // waiting to show new hovercard while old one still showing.\n};\n\n\n/**\n * Popup activation types. Used to select a positioning strategy.\n * @enum {number}\n */\ngoog.ui.Tooltip.Activation = {\n  CURSOR: 0,\n  FOCUS: 1\n};\n\n\n/**\n * Whether the anchor has seen the cursor move or has received focus since the\n * tooltip was last shown. Used to ignore mouse over events triggered by view\n * changes and UI updates.\n * @type {boolean|undefined}\n * @private\n */\ngoog.ui.Tooltip.prototype.seenInteraction_;\n\n\n/**\n * Whether the cursor must have moved before the tooltip will be shown.\n * @type {boolean|undefined}\n * @private\n */\ngoog.ui.Tooltip.prototype.requireInteraction_;\n\n\n/**\n * If this tooltip's element contains another tooltip that becomes active, this\n * property identifies that tooltip so that we can check if this tooltip should\n * not be hidden because the nested tooltip is active.\n * @type {goog.ui.Tooltip}\n * @private\n */\ngoog.ui.Tooltip.prototype.childTooltip_;\n\n\n/**\n * If this tooltip is inside another tooltip's element, then it may have\n * prevented that tooltip from hiding.  When this tooltip hides, we'll need\n * to check if the parent should be hidden as well.\n * @type {goog.ui.Tooltip}\n * @private\n */\ngoog.ui.Tooltip.prototype.parentTooltip_;\n\n\n/**\n * Returns the dom helper that is being used on this component.\n * @return {goog.dom.DomHelper} The dom helper used on this component.\n */\ngoog.ui.Tooltip.prototype.getDomHelper = function() {\n  return this.dom_;\n};\n\n\n/**\n * @return {goog.ui.Tooltip} Active tooltip in a child element, or null if none.\n * @protected\n */\ngoog.ui.Tooltip.prototype.getChildTooltip = function() {\n  return this.childTooltip_;\n};\n\n\n/**\n * Attach to element. Tooltip will be displayed when the cursor is over the\n * element or when the element has been active for a few milliseconds.\n *\n * @param {Element|string} el Element to display tooltip for, either element\n *                            reference or string id.\n */\ngoog.ui.Tooltip.prototype.attach = function(el) {\n  el = goog.dom.getElement(el);\n\n  this.elements_.add(el);\n  goog.events.listen(\n      el, goog.events.EventType.MOUSEOVER, this.handleMouseOver, false, this);\n  goog.events.listen(\n      el, goog.events.EventType.MOUSEOUT, this.handleMouseOutAndBlur, false,\n      this);\n  goog.events.listen(\n      el, goog.events.EventType.MOUSEMOVE, this.handleMouseMove, false, this);\n  goog.events.listen(\n      el, goog.events.EventType.FOCUS, this.handleFocus, false, this);\n  goog.events.listen(\n      el, goog.events.EventType.BLUR, this.handleMouseOutAndBlur, false, this);\n};\n\n\n/**\n * Detach from element(s).\n *\n * @param {Element|string=} opt_el Element to detach from, either element\n *                                reference or string id. If no element is\n *                                specified all are detached.\n */\ngoog.ui.Tooltip.prototype.detach = function(opt_el) {\n  if (opt_el) {\n    var el = goog.dom.getElement(opt_el);\n    this.detachElement_(el);\n    this.elements_.remove(el);\n  } else {\n    var a = this.elements_.getValues();\n    for (var el, i = 0; el = a[i]; i++) {\n      this.detachElement_(el);\n    }\n    this.elements_.clear();\n  }\n};\n\n\n/**\n * Detach from element.\n *\n * @param {Element} el Element to detach from.\n * @private\n */\ngoog.ui.Tooltip.prototype.detachElement_ = function(el) {\n  goog.events.unlisten(\n      el, goog.events.EventType.MOUSEOVER, this.handleMouseOver, false, this);\n  goog.events.unlisten(\n      el, goog.events.EventType.MOUSEOUT, this.handleMouseOutAndBlur, false,\n      this);\n  goog.events.unlisten(\n      el, goog.events.EventType.MOUSEMOVE, this.handleMouseMove, false, this);\n  goog.events.unlisten(\n      el, goog.events.EventType.FOCUS, this.handleFocus, false, this);\n  goog.events.unlisten(\n      el, goog.events.EventType.BLUR, this.handleMouseOutAndBlur, false, this);\n};\n\n\n/**\n * Sets delay in milliseconds before tooltip is displayed for an element.\n *\n * @param {number} delay The delay in milliseconds.\n */\ngoog.ui.Tooltip.prototype.setShowDelayMs = function(delay) {\n  this.showDelayMs_ = delay;\n};\n\n\n/**\n * @return {number} The delay in milliseconds before tooltip is displayed for an\n *     element.\n */\ngoog.ui.Tooltip.prototype.getShowDelayMs = function() {\n  return this.showDelayMs_;\n};\n\n\n/**\n * Sets delay in milliseconds before tooltip is hidden once the cursor leavs\n * the element.\n *\n * @param {number} delay The delay in milliseconds.\n */\ngoog.ui.Tooltip.prototype.setHideDelayMs = function(delay) {\n  this.hideDelayMs_ = delay;\n};\n\n\n/**\n * @return {number} The delay in milliseconds before tooltip is hidden once the\n *     cursor leaves the element.\n */\ngoog.ui.Tooltip.prototype.getHideDelayMs = function() {\n  return this.hideDelayMs_;\n};\n\n\n/**\n * Sets tooltip message as plain text.\n *\n * @param {string} str Text message to display in tooltip.\n */\ngoog.ui.Tooltip.prototype.setText = function(str) {\n  goog.dom.setTextContent(this.getElement(), str);\n};\n\n\n/**\n * Sets tooltip message as HTML markup.\n * @param {!goog.html.SafeHtml} html HTML message to display in tooltip.\n */\ngoog.ui.Tooltip.prototype.setSafeHtml = function(html) {\n  var element = this.getElement();\n  if (element) {\n    goog.dom.safe.setInnerHtml(element, html);\n  }\n};\n\n\n/**\n * Sets tooltip element.\n *\n * @param {Element} el HTML element to use as the tooltip.\n * @override\n */\ngoog.ui.Tooltip.prototype.setElement = function(el) {\n  var oldElement = this.getElement();\n  if (oldElement) {\n    goog.dom.removeNode(oldElement);\n  }\n  goog.ui.Tooltip.superClass_.setElement.call(this, el);\n  if (el) {\n    var body = this.dom_.getDocument().body;\n    body.insertBefore(el, body.lastChild);\n    this.registerContentFocusEvents_();\n  } else {\n    goog.dispose(this.tooltipFocusHandler_);\n    this.tooltipFocusHandler_ = null;\n  }\n};\n\n\n/**\n * Handler for keyboard focus events of elements inside the tooltip's content\n * element. This should only be invoked if this.getElement() != null.\n * @private\n */\ngoog.ui.Tooltip.prototype.registerContentFocusEvents_ = function() {\n  goog.dispose(this.tooltipFocusHandler_);\n  this.tooltipFocusHandler_ =\n      new goog.events.FocusHandler(goog.asserts.assert(this.getElement()));\n  this.registerDisposable(this.tooltipFocusHandler_);\n\n  goog.events.listen(\n      this.tooltipFocusHandler_, goog.events.FocusHandler.EventType.FOCUSIN,\n      this.clearHideTimer, undefined /* opt_capt */, this);\n  goog.events.listen(\n      this.tooltipFocusHandler_, goog.events.FocusHandler.EventType.FOCUSOUT,\n      this.startHideTimer, undefined /* opt_capt */, this);\n};\n\n\n/**\n * @return {string} The tooltip message as plain text.\n */\ngoog.ui.Tooltip.prototype.getText = function() {\n  return goog.dom.getTextContent(this.getElement());\n};\n\n\n/**\n * @return {string} The tooltip message as HTML as plain string.\n */\ngoog.ui.Tooltip.prototype.getHtml = function() {\n  return this.getElement().innerHTML;\n};\n\n\n/**\n * @return {goog.ui.Tooltip.State} Current state of tooltip.\n */\ngoog.ui.Tooltip.prototype.getState = function() {\n  return this.showTimer ?\n      (this.isVisible() ? goog.ui.Tooltip.State.UPDATING :\n                          goog.ui.Tooltip.State.WAITING_TO_SHOW) :\n      this.hideTimer ? goog.ui.Tooltip.State.WAITING_TO_HIDE :\n                       this.isVisible() ? goog.ui.Tooltip.State.SHOWING :\n                                          goog.ui.Tooltip.State.INACTIVE;\n};\n\n\n/**\n * Sets whether tooltip requires the mouse to have moved or the anchor receive\n * focus before the tooltip will be shown.\n * @param {boolean} requireInteraction Whether tooltip should require some user\n *     interaction before showing tooltip.\n */\ngoog.ui.Tooltip.prototype.setRequireInteraction = function(requireInteraction) {\n  this.requireInteraction_ = requireInteraction;\n};\n\n\n/**\n * Returns true if the coord is in the tooltip.\n * @param {goog.math.Coordinate} coord Coordinate being tested.\n * @return {boolean} Whether the coord is in the tooltip.\n */\ngoog.ui.Tooltip.prototype.isCoordinateInTooltip = function(coord) {\n  // Check if coord is inside the the tooltip\n  if (!this.isVisible()) {\n    return false;\n  }\n\n  var offset = goog.style.getPageOffset(this.getElement());\n  var size = goog.style.getSize(this.getElement());\n  return offset.x <= coord.x && coord.x <= offset.x + size.width &&\n      offset.y <= coord.y && coord.y <= offset.y + size.height;\n};\n\n\n/**\n * Called before the popup is shown.\n *\n * @return {boolean} Whether tooltip should be shown.\n * @protected\n * @override\n */\ngoog.ui.Tooltip.prototype.onBeforeShow = function() {\n  if (!goog.ui.PopupBase.prototype.onBeforeShow.call(this)) {\n    return false;\n  }\n\n  // Hide all open tooltips except if this tooltip is triggered by an element\n  // inside another tooltip.\n  if (this.anchor) {\n    for (var tt, i = 0; tt = goog.ui.Tooltip.activeInstances_[i]; i++) {\n      if (!goog.dom.contains(tt.getElement(), this.anchor)) {\n        tt.setVisible(false);\n      }\n    }\n  }\n  goog.array.insert(goog.ui.Tooltip.activeInstances_, this);\n\n  var element = this.getElement();\n  element.className = this.className;\n  this.clearHideTimer();\n\n  // Register event handlers for tooltip. Used to prevent the tooltip from\n  // closing if the cursor is over the tooltip rather then the element that\n  // triggered it.\n  goog.events.listen(\n      element, goog.events.EventType.MOUSEOVER, this.handleTooltipMouseOver,\n      false, this);\n  goog.events.listen(\n      element, goog.events.EventType.MOUSEOUT, this.handleTooltipMouseOut,\n      false, this);\n\n  this.clearShowTimer();\n  return true;\n};\n\n\n/** @override */\ngoog.ui.Tooltip.prototype.onHide = function() {\n  goog.array.remove(goog.ui.Tooltip.activeInstances_, this);\n\n  // Hide all open tooltips triggered by an element inside this tooltip.\n  var element = this.getElement();\n  for (var tt, i = 0; tt = goog.ui.Tooltip.activeInstances_[i]; i++) {\n    if (tt.anchor && goog.dom.contains(element, tt.anchor)) {\n      tt.setVisible(false);\n    }\n  }\n\n  // If this tooltip is inside another tooltip, start hide timer for that\n  // tooltip in case this tooltip was the only reason it was still showing.\n  if (this.parentTooltip_) {\n    this.parentTooltip_.startHideTimer();\n  }\n\n  goog.events.unlisten(\n      element, goog.events.EventType.MOUSEOVER, this.handleTooltipMouseOver,\n      false, this);\n  goog.events.unlisten(\n      element, goog.events.EventType.MOUSEOUT, this.handleTooltipMouseOut,\n      false, this);\n\n  this.anchor = undefined;\n  // If we are still waiting to show a different hovercard, don't abort it\n  // because you think you haven't seen a mouse move:\n  if (this.getState() == goog.ui.Tooltip.State.INACTIVE) {\n    this.seenInteraction_ = false;\n  }\n\n  goog.ui.PopupBase.prototype.onHide.call(this);\n};\n\n\n/**\n * Called by timer from mouse over handler. Shows tooltip if cursor is still\n * over the same element.\n *\n * @param {Element} el Element to show tooltip for.\n * @param {goog.positioning.AbstractPosition=} opt_pos Position to display popup\n *     at.\n */\ngoog.ui.Tooltip.prototype.maybeShow = function(el, opt_pos) {\n  // Assert that the mouse is still over the same element, and that we have not\n  // detached from the anchor in the meantime.\n  if (this.anchor == el && this.elements_.contains(this.anchor)) {\n    if (this.seenInteraction_ || !this.requireInteraction_) {\n      // If it is currently showing, then hide it, and abort if it doesn't hide.\n      this.setVisible(false);\n      if (!this.isVisible()) {\n        this.positionAndShow_(el, opt_pos);\n      }\n    } else {\n      this.anchor = undefined;\n    }\n  }\n  this.showTimer = undefined;\n};\n\n\n/**\n * @return {goog.structs.Set} Elements this widget is attached to.\n * @protected\n */\ngoog.ui.Tooltip.prototype.getElements = function() {\n  return this.elements_;\n};\n\n\n/**\n * @return {Element} Active element reference.\n */\ngoog.ui.Tooltip.prototype.getActiveElement = function() {\n  return this.activeEl_;\n};\n\n\n/**\n * @param {Element} activeEl Active element reference.\n * @protected\n */\ngoog.ui.Tooltip.prototype.setActiveElement = function(activeEl) {\n  this.activeEl_ = activeEl;\n};\n\n\n/**\n * Shows tooltip for a specific element.\n *\n * @param {Element} el Element to show tooltip for.\n * @param {goog.positioning.AbstractPosition=} opt_pos Position to display popup\n *     at.\n */\ngoog.ui.Tooltip.prototype.showForElement = function(el, opt_pos) {\n  this.attach(el);\n  this.activeEl_ = el;\n\n  this.positionAndShow_(el, opt_pos);\n};\n\n\n/**\n * Sets tooltip position and shows it.\n *\n * @param {Element} el Element to show tooltip for.\n * @param {goog.positioning.AbstractPosition=} opt_pos Position to display popup\n *     at.\n * @private\n */\ngoog.ui.Tooltip.prototype.positionAndShow_ = function(el, opt_pos) {\n  this.anchor = el;\n  this.setPosition(\n      opt_pos ||\n      this.getPositioningStrategy(goog.ui.Tooltip.Activation.CURSOR));\n  this.setVisible(true);\n};\n\n\n/**\n * Called by timer from mouse out handler. Hides tooltip if cursor is still\n * outside element and tooltip, or if a child of tooltip has the focus.\n * @param {?Element|undefined} el Tooltip's anchor when hide timer was started.\n */\ngoog.ui.Tooltip.prototype.maybeHide = function(el) {\n  this.hideTimer = undefined;\n  if (el == this.anchor) {\n    var dom = this.getDomHelper();\n    var focusedEl = dom.getActiveElement();\n    // If the tooltip content is focused, then don't hide the tooltip.\n    var tooltipContentFocused = focusedEl && this.getElement() &&\n        dom.contains(this.getElement(), focusedEl);\n    if ((this.activeEl_ == null ||\n         (this.activeEl_ != this.getElement() &&\n          !this.elements_.contains(this.activeEl_))) &&\n        !tooltipContentFocused && !this.hasActiveChild()) {\n      this.setVisible(false);\n    }\n  }\n};\n\n\n/**\n * @return {boolean} Whether tooltip element contains an active child tooltip,\n *     and should thus not be hidden.  When the child tooltip is hidden, it\n *     will check if the parent should be hidden, too.\n * @protected\n */\ngoog.ui.Tooltip.prototype.hasActiveChild = function() {\n  return !!(this.childTooltip_ && this.childTooltip_.activeEl_);\n};\n\n\n/**\n * Saves the current mouse cursor position to `this.cursorPosition`.\n * @param {goog.events.BrowserEvent} event MOUSEOVER or MOUSEMOVE event.\n * @private\n */\ngoog.ui.Tooltip.prototype.saveCursorPosition_ = function(event) {\n  var scroll = this.dom_.getDocumentScroll();\n  this.cursorPosition.x = event.clientX + scroll.x;\n  this.cursorPosition.y = event.clientY + scroll.y;\n};\n\n\n/**\n * Handler for mouse over events.\n *\n * @param {goog.events.BrowserEvent} event Event object.\n * @protected\n */\ngoog.ui.Tooltip.prototype.handleMouseOver = function(event) {\n  var el = this.getAnchorFromElement(/** @type {Element} */ (event.target));\n  this.activeEl_ = el;\n  this.clearHideTimer();\n  if (el != this.anchor) {\n    this.anchor = el;\n    this.startShowTimer(el);\n    this.checkForParentTooltip_();\n    this.saveCursorPosition_(event);\n  }\n};\n\n\n/**\n * Find anchor containing the given element, if any.\n *\n * @param {Element} el Element that triggered event.\n * @return {Element} Element in elements_ array that contains given element,\n *     or null if not found.\n * @protected\n */\ngoog.ui.Tooltip.prototype.getAnchorFromElement = function(el) {\n  // FireFox has a bug where mouse events relating to <input> elements are\n  // sometimes duplicated (often in FF2, rarely in FF3): once for the\n  // <input> element and once for a magic hidden <div> element.  JavaScript\n  // code does not have sufficient permissions to read properties on that\n  // magic element and thus will throw an error in this call to\n  // getAnchorFromElement_().  In that case we swallow the error.\n  // See https://bugzilla.mozilla.org/show_bug.cgi?id=330961\n  try {\n    while (el && !this.elements_.contains(el)) {\n      el = /** @type {Element} */ (el.parentNode);\n    }\n    return el;\n  } catch (e) {\n    return null;\n  }\n};\n\n\n/**\n * Handler for mouse move events.\n *\n * @param {goog.events.BrowserEvent} event MOUSEMOVE event.\n * @protected\n */\ngoog.ui.Tooltip.prototype.handleMouseMove = function(event) {\n  this.saveCursorPosition_(event);\n  this.seenInteraction_ = true;\n};\n\n\n/**\n * Handler for focus events.\n *\n * @param {goog.events.BrowserEvent} event Event object.\n * @protected\n */\ngoog.ui.Tooltip.prototype.handleFocus = function(event) {\n  var el = this.getAnchorFromElement(/** @type {Element} */ (event.target));\n  this.activeEl_ = el;\n  this.seenInteraction_ = true;\n\n  if (this.anchor != el) {\n    this.anchor = el;\n    var pos = this.getPositioningStrategy(goog.ui.Tooltip.Activation.FOCUS);\n    this.clearHideTimer();\n    this.startShowTimer(el, pos);\n\n    this.checkForParentTooltip_();\n  }\n};\n\n\n/**\n * Return a Position instance for repositioning the tooltip. Override in\n * subclasses to customize the way repositioning is done.\n *\n * @param {goog.ui.Tooltip.Activation} activationType Information about what\n *    kind of event caused the popup to be shown.\n * @return {!goog.positioning.AbstractPosition} The position object used\n *    to position the tooltip.\n * @protected\n */\ngoog.ui.Tooltip.prototype.getPositioningStrategy = function(activationType) {\n  if (activationType == goog.ui.Tooltip.Activation.CURSOR) {\n    var coord = this.cursorPosition.clone();\n    return new goog.ui.Tooltip.CursorTooltipPosition(coord);\n  }\n  return new goog.ui.Tooltip.ElementTooltipPosition(this.activeEl_);\n};\n\n\n/**\n * Looks for an active tooltip whose element contains this tooltip's anchor.\n * This allows us to prevent hides until they are really necessary.\n *\n * @private\n */\ngoog.ui.Tooltip.prototype.checkForParentTooltip_ = function() {\n  if (this.anchor) {\n    for (var tt, i = 0; tt = goog.ui.Tooltip.activeInstances_[i]; i++) {\n      if (goog.dom.contains(tt.getElement(), this.anchor)) {\n        tt.childTooltip_ = this;\n        this.parentTooltip_ = tt;\n      }\n    }\n  }\n};\n\n\n/**\n * Handler for mouse out and blur events.\n *\n * @param {goog.events.BrowserEvent} event Event object.\n * @protected\n */\ngoog.ui.Tooltip.prototype.handleMouseOutAndBlur = function(event) {\n  var el = this.getAnchorFromElement(/** @type {Element} */ (event.target));\n  var elTo = this.getAnchorFromElement(\n      /** @type {Element} */ (event.relatedTarget));\n  if (el == elTo) {\n    // We haven't really left the anchor, just moved from one child to\n    // another.\n    return;\n  }\n\n  if (el == this.activeEl_) {\n    this.activeEl_ = null;\n  }\n\n  this.clearShowTimer();\n  this.seenInteraction_ = false;\n  if (this.isVisible() &&\n      (!event.relatedTarget ||\n       !goog.dom.contains(this.getElement(), event.relatedTarget))) {\n    this.startHideTimer();\n  } else {\n    this.anchor = undefined;\n  }\n};\n\n\n/**\n * Handler for mouse over events for the tooltip element.\n *\n * @param {goog.events.BrowserEvent} event Event object.\n * @protected\n */\ngoog.ui.Tooltip.prototype.handleTooltipMouseOver = function(event) {\n  var element = this.getElement();\n  if (this.activeEl_ != element) {\n    this.clearHideTimer();\n    this.activeEl_ = element;\n  }\n};\n\n\n/**\n * Handler for mouse out events for the tooltip element.\n *\n * @param {goog.events.BrowserEvent} event Event object.\n * @protected\n */\ngoog.ui.Tooltip.prototype.handleTooltipMouseOut = function(event) {\n  var element = this.getElement();\n  if (this.activeEl_ == element &&\n      (!event.relatedTarget ||\n       !goog.dom.contains(element, event.relatedTarget))) {\n    this.activeEl_ = null;\n    this.startHideTimer();\n  }\n};\n\n\n/**\n * Helper method, starts timer that calls maybeShow. Parameters are passed to\n * the maybeShow method.\n *\n * @param {Element} el Element to show tooltip for.\n * @param {goog.positioning.AbstractPosition=} opt_pos Position to display popup\n *     at.\n * @protected\n */\ngoog.ui.Tooltip.prototype.startShowTimer = function(el, opt_pos) {\n  if (!this.showTimer) {\n    this.showTimer = goog.Timer.callOnce(\n        goog.bind(this.maybeShow, this, el, opt_pos), this.showDelayMs_);\n  }\n};\n\n\n/**\n * Helper method called to clear the show timer.\n *\n * @protected\n */\ngoog.ui.Tooltip.prototype.clearShowTimer = function() {\n  if (this.showTimer) {\n    goog.Timer.clear(this.showTimer);\n    this.showTimer = undefined;\n  }\n};\n\n\n/**\n * Helper method called to start the close timer.\n * @protected\n */\ngoog.ui.Tooltip.prototype.startHideTimer = function() {\n  if (this.getState() == goog.ui.Tooltip.State.SHOWING) {\n    this.hideTimer = goog.Timer.callOnce(\n        goog.bind(this.maybeHide, this, this.anchor), this.getHideDelayMs());\n  }\n};\n\n\n/**\n * Helper method called to clear the close timer.\n * @protected\n */\ngoog.ui.Tooltip.prototype.clearHideTimer = function() {\n  if (this.hideTimer) {\n    goog.Timer.clear(this.hideTimer);\n    this.hideTimer = undefined;\n  }\n};\n\n\n/** @override */\ngoog.ui.Tooltip.prototype.disposeInternal = function() {\n  this.setVisible(false);\n  this.clearShowTimer();\n  this.detach();\n  if (this.getElement()) {\n    goog.dom.removeNode(this.getElement());\n  }\n  this.activeEl_ = null;\n  delete this.dom_;\n  goog.ui.Tooltip.superClass_.disposeInternal.call(this);\n};\n\n\n\n/**\n * Popup position implementation that positions the popup (the tooltip in this\n * case) based on the cursor position. It's positioned below the cursor to the\n * right if there's enough room to fit all of it inside the Viewport. Otherwise\n * it's displayed as far right as possible either above or below the element.\n *\n * Used to position tooltips triggered by the cursor.\n *\n * @param {number|!goog.math.Coordinate} arg1 Left position or coordinate.\n * @param {number=} opt_arg2 Top position.\n * @constructor\n * @extends {goog.positioning.ViewportPosition}\n * @final\n */\ngoog.ui.Tooltip.CursorTooltipPosition = function(arg1, opt_arg2) {\n  goog.positioning.ViewportPosition.call(this, arg1, opt_arg2);\n};\ngoog.inherits(\n    goog.ui.Tooltip.CursorTooltipPosition, goog.positioning.ViewportPosition);\n\n\n/**\n * Repositions the popup based on cursor position.\n *\n * @param {Element} element The DOM element of the popup.\n * @param {goog.positioning.Corner} popupCorner The corner of the popup element\n *     that that should be positioned adjacent to the anchorElement.\n * @param {goog.math.Box=} opt_margin A margin specified in pixels.\n * @override\n */\ngoog.ui.Tooltip.CursorTooltipPosition.prototype.reposition = function(\n    element, popupCorner, opt_margin) {\n  var viewportElt = goog.style.getClientViewportElement(element);\n  var viewport = goog.style.getVisibleRectForElement(viewportElt);\n  var margin = opt_margin ? new goog.math.Box(\n                                opt_margin.top + 10, opt_margin.right,\n                                opt_margin.bottom, opt_margin.left + 10) :\n                            new goog.math.Box(10, 0, 0, 10);\n\n  if (goog.positioning.positionAtCoordinate(\n          this.coordinate, element, goog.positioning.Corner.TOP_START, margin,\n          viewport,\n          goog.positioning.Overflow.ADJUST_X |\n              goog.positioning.Overflow.FAIL_Y) &\n      goog.positioning.OverflowStatus.FAILED) {\n    goog.positioning.positionAtCoordinate(\n        this.coordinate, element, goog.positioning.Corner.TOP_START, margin,\n        viewport,\n        goog.positioning.Overflow.ADJUST_X |\n            goog.positioning.Overflow.ADJUST_Y);\n  }\n};\n\n\n\n/**\n * Popup position implementation that positions the popup (the tooltip in this\n * case) based on the element position. It's positioned below the element to the\n * right if there's enough room to fit all of it inside the Viewport. Otherwise\n * it's displayed as far right as possible either above or below the element.\n *\n * Used to position tooltips triggered by focus changes.\n *\n * @param {Element} element The element to anchor the popup at.\n * @constructor\n * @extends {goog.positioning.AnchoredPosition}\n */\ngoog.ui.Tooltip.ElementTooltipPosition = function(element) {\n  goog.positioning.AnchoredPosition.call(\n      this, element, goog.positioning.Corner.BOTTOM_RIGHT);\n};\ngoog.inherits(\n    goog.ui.Tooltip.ElementTooltipPosition, goog.positioning.AnchoredPosition);\n\n\n/**\n * Repositions the popup based on element position.\n *\n * @param {Element} element The DOM element of the popup.\n * @param {goog.positioning.Corner} popupCorner The corner of the popup element\n *     that should be positioned adjacent to the anchorElement.\n * @param {goog.math.Box=} opt_margin A margin specified in pixels.\n * @override\n */\ngoog.ui.Tooltip.ElementTooltipPosition.prototype.reposition = function(\n    element, popupCorner, opt_margin) {\n  var offset = new goog.math.Coordinate(10, 0);\n\n  if (goog.positioning.positionAtAnchor(\n          this.element, this.corner, element, popupCorner, offset, opt_margin,\n          goog.positioning.Overflow.ADJUST_X |\n              goog.positioning.Overflow.FAIL_Y) &\n      goog.positioning.OverflowStatus.FAILED) {\n    goog.positioning.positionAtAnchor(\n        this.element, goog.positioning.Corner.TOP_RIGHT, element,\n        goog.positioning.Corner.BOTTOM_LEFT, offset, opt_margin,\n        goog.positioning.Overflow.ADJUST_X |\n            goog.positioning.Overflow.ADJUST_Y);\n  }\n};\n","^;",1579837703000,"^<",["^=",["^1L","^1>","^3L","^3M","^3O","^2S","^3P","~$goog.positioning.ViewportPosition","^?","^3<","^1C","^3=","~$goog.positioning.Overflow","^1E","~$goog.positioning.OverflowStatus","^1F","^2H","^3S","^2O","^1<","^12","~$goog.structs.Set"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/tooltip.js"],"^O",["^=",["~$goog.ui.Tooltip.State","^3;","~$goog.ui.Tooltip.ElementTooltipPosition","~$goog.ui.Tooltip.CursorTooltipPosition"]],"^W",true,"^X",["^?","^3O","^2O","^1L","^1>","^12","^1E","^1<","^1C","^2H","^3<","^3=","^3P","^3M","^3L","^4<","^4=","^4;","^4>","^1F","^3S","^2S"]],["^ ","^3",[1579837703000],"^4","goog.html.uncheckedconversions.js","^5",["^6","goog/html/uncheckedconversions.js"],"^7","goog/html/uncheckedconversions.js","^8","^9","^:","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Unchecked conversions to create values of goog.html types from\n * plain strings.  Use of these functions could potentially result in instances\n * of goog.html types that violate their type contracts, and hence result in\n * security vulnerabilties.\n *\n * Therefore, all uses of the methods herein must be carefully security\n * reviewed.  Avoid use of the methods in this file whenever possible; instead\n * prefer to create instances of goog.html types using inherently safe builders\n * or template systems.\n *\n *\n */\n\n\ngoog.provide('goog.html.uncheckedconversions');\n\ngoog.require('goog.asserts');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.SafeScript');\ngoog.require('goog.html.SafeStyle');\ngoog.require('goog.html.SafeStyleSheet');\ngoog.require('goog.html.SafeUrl');\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.string.Const');\ngoog.require('goog.string.internal');\n\n\n/**\n * Performs an \"unchecked conversion\" to SafeHtml from a plain string that is\n * known to satisfy the SafeHtml type contract.\n *\n * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure\n * that the value of `html` satisfies the SafeHtml type contract in all\n * possible program states.\n *\n *\n * @param {!goog.string.Const} justification A constant string explaining why\n *     this use of this method is safe. May include a security review ticket\n *     number.\n * @param {string} html A string that is claimed to adhere to the SafeHtml\n *     contract.\n * @param {?goog.i18n.bidi.Dir=} opt_dir The optional directionality of the\n *     SafeHtml to be constructed. A null or undefined value signifies an\n *     unknown directionality.\n * @return {!goog.html.SafeHtml} The value of html, wrapped in a SafeHtml\n *     object.\n */\ngoog.html.uncheckedconversions.safeHtmlFromStringKnownToSatisfyTypeContract =\n    function(justification, html, opt_dir) {\n  // unwrap() called inside an assert so that justification can be optimized\n  // away in production code.\n  goog.asserts.assertString(\n      goog.string.Const.unwrap(justification), 'must provide justification');\n  goog.asserts.assert(\n      !goog.string.internal.isEmptyOrWhitespace(\n          goog.string.Const.unwrap(justification)),\n      'must provide non-empty justification');\n  return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(\n      html, opt_dir || null);\n};\n\n\n/**\n * Performs an \"unchecked conversion\" to SafeScript from a plain string that is\n * known to satisfy the SafeScript type contract.\n *\n * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure\n * that the value of `script` satisfies the SafeScript type contract in\n * all possible program states.\n *\n *\n * @param {!goog.string.Const} justification A constant string explaining why\n *     this use of this method is safe. May include a security review ticket\n *     number.\n * @param {string} script The string to wrap as a SafeScript.\n * @return {!goog.html.SafeScript} The value of `script`, wrapped in a\n *     SafeScript object.\n */\ngoog.html.uncheckedconversions.safeScriptFromStringKnownToSatisfyTypeContract =\n    function(justification, script) {\n  // unwrap() called inside an assert so that justification can be optimized\n  // away in production code.\n  goog.asserts.assertString(\n      goog.string.Const.unwrap(justification), 'must provide justification');\n  goog.asserts.assert(\n      !goog.string.internal.isEmptyOrWhitespace(\n          goog.string.Const.unwrap(justification)),\n      'must provide non-empty justification');\n  return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(\n      script);\n};\n\n\n/**\n * Performs an \"unchecked conversion\" to SafeStyle from a plain string that is\n * known to satisfy the SafeStyle type contract.\n *\n * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure\n * that the value of `style` satisfies the SafeStyle type contract in all\n * possible program states.\n *\n *\n * @param {!goog.string.Const} justification A constant string explaining why\n *     this use of this method is safe. May include a security review ticket\n *     number.\n * @param {string} style The string to wrap as a SafeStyle.\n * @return {!goog.html.SafeStyle} The value of `style`, wrapped in a\n *     SafeStyle object.\n */\ngoog.html.uncheckedconversions.safeStyleFromStringKnownToSatisfyTypeContract =\n    function(justification, style) {\n  // unwrap() called inside an assert so that justification can be optimized\n  // away in production code.\n  goog.asserts.assertString(\n      goog.string.Const.unwrap(justification), 'must provide justification');\n  goog.asserts.assert(\n      !goog.string.internal.isEmptyOrWhitespace(\n          goog.string.Const.unwrap(justification)),\n      'must provide non-empty justification');\n  return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(\n      style);\n};\n\n\n/**\n * Performs an \"unchecked conversion\" to SafeStyleSheet from a plain string\n * that is known to satisfy the SafeStyleSheet type contract.\n *\n * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure\n * that the value of `styleSheet` satisfies the SafeStyleSheet type\n * contract in all possible program states.\n *\n *\n * @param {!goog.string.Const} justification A constant string explaining why\n *     this use of this method is safe. May include a security review ticket\n *     number.\n * @param {string} styleSheet The string to wrap as a SafeStyleSheet.\n * @return {!goog.html.SafeStyleSheet} The value of `styleSheet`, wrapped\n *     in a SafeStyleSheet object.\n */\ngoog.html.uncheckedconversions\n    .safeStyleSheetFromStringKnownToSatisfyTypeContract = function(\n    justification, styleSheet) {\n  // unwrap() called inside an assert so that justification can be optimized\n  // away in production code.\n  goog.asserts.assertString(\n      goog.string.Const.unwrap(justification), 'must provide justification');\n  goog.asserts.assert(\n      !goog.string.internal.isEmptyOrWhitespace(\n          goog.string.Const.unwrap(justification)),\n      'must provide non-empty justification');\n  return goog.html.SafeStyleSheet\n      .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(styleSheet);\n};\n\n\n/**\n * Performs an \"unchecked conversion\" to SafeUrl from a plain string that is\n * known to satisfy the SafeUrl type contract.\n *\n * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure\n * that the value of `url` satisfies the SafeUrl type contract in all\n * possible program states.\n *\n *\n * @param {!goog.string.Const} justification A constant string explaining why\n *     this use of this method is safe. May include a security review ticket\n *     number.\n * @param {string} url The string to wrap as a SafeUrl.\n * @return {!goog.html.SafeUrl} The value of `url`, wrapped in a SafeUrl\n *     object.\n */\ngoog.html.uncheckedconversions.safeUrlFromStringKnownToSatisfyTypeContract =\n    function(justification, url) {\n  // unwrap() called inside an assert so that justification can be optimized\n  // away in production code.\n  goog.asserts.assertString(\n      goog.string.Const.unwrap(justification), 'must provide justification');\n  goog.asserts.assert(\n      !goog.string.internal.isEmptyOrWhitespace(\n          goog.string.Const.unwrap(justification)),\n      'must provide non-empty justification');\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);\n};\n\n\n/**\n * Performs an \"unchecked conversion\" to TrustedResourceUrl from a plain string\n * that is known to satisfy the TrustedResourceUrl type contract.\n *\n * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure\n * that the value of `url` satisfies the TrustedResourceUrl type contract\n * in all possible program states.\n *\n *\n * @param {!goog.string.Const} justification A constant string explaining why\n *     this use of this method is safe. May include a security review ticket\n *     number.\n * @param {string} url The string to wrap as a TrustedResourceUrl.\n * @return {!goog.html.TrustedResourceUrl} The value of `url`, wrapped in\n *     a TrustedResourceUrl object.\n */\ngoog.html.uncheckedconversions\n    .trustedResourceUrlFromStringKnownToSatisfyTypeContract = function(\n    justification, url) {\n  // unwrap() called inside an assert so that justification can be optimized\n  // away in production code.\n  goog.asserts.assertString(\n      goog.string.Const.unwrap(justification), 'must provide justification');\n  goog.asserts.assert(\n      !goog.string.internal.isEmptyOrWhitespace(\n          goog.string.Const.unwrap(justification)),\n      'must provide non-empty justification');\n  return goog.html.TrustedResourceUrl\n      .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(url);\n};\n","^;",1579837703000,"^<",["^=",["^1L","~$goog.html.SafeScript","~$goog.html.TrustedResourceUrl","~$goog.html.SafeUrl","^?","^3Q","~$goog.html.SafeStyle","~$goog.html.SafeStyleSheet","~$goog.string.internal","^1I"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/uncheckedconversions.js"],"^O",["^=",["~$goog.html.uncheckedconversions"]],"^W",true,"^X",["^?","^1L","^1I","^4B","^4E","^4F","^4D","^4C","^3Q","^4G"]],["^ ","^3",[1579837703000],"^4","goog.testing.jsunitexception.js","^5",["^6","goog/testing/jsunitexception.js"],"^7","goog/testing/jsunitexception.js","^8","^9","^:","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.testing.JsUnitException');\ngoog.setTestOnly();\n\ngoog.require('goog.testing.stacktrace');\n\n\n/**\n * @param {string} comment A summary for the exception.\n * @param {?string=} opt_message A description of the exception.\n * @constructor\n * @extends {Error}\n * @final\n */\ngoog.testing.JsUnitException = function(comment, opt_message) {\n  this.isJsUnitException = true;\n  this.message = (comment ? comment : '') +\n      (comment && opt_message ? '\\n' : '') + (opt_message ? opt_message : '');\n  this.stackTrace = goog.testing.stacktrace.get();\n  // These fields are for compatibility with jsUnitTestManager.\n  this.comment = comment || null;\n  this.jsUnitMessage = opt_message || '';\n\n  // Ensure there is a stack trace.\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, goog.testing.JsUnitException);\n  } else {\n    this.stack = new Error().stack || '';\n  }\n};\ngoog.inherits(goog.testing.JsUnitException, Error);\n\n\n/** @override */\ngoog.testing.JsUnitException.prototype.toString = function() {\n  return this.message || this.jsUnitMessage;\n};\n","^;",1579837703000,"^<",["^=",["^?","~$goog.testing.stacktrace"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/jsunitexception.js"],"^O",["^=",["~$goog.testing.JsUnitException"]],"^W",true,"^X",["^?","^4I"]],["^ ","^3",[1579837703000],"^4","goog.dom.safe.js","^5",["^6","goog/dom/safe.js"],"^7","goog/dom/safe.js","^8","^9","^:","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Type-safe wrappers for unsafe DOM APIs.\n *\n * This file provides type-safe wrappers for DOM APIs that can result in\n * cross-site scripting (XSS) vulnerabilities, if the API is supplied with\n * untrusted (attacker-controlled) input.  Instead of plain strings, the type\n * safe wrappers consume values of types from the goog.html package whose\n * contract promises that values are safe to use in the corresponding context.\n *\n * Hence, a program that exclusively uses the wrappers in this file (i.e., whose\n * only reference to security-sensitive raw DOM APIs are in this file) is\n * guaranteed to be free of XSS due to incorrect use of such DOM APIs (modulo\n * correctness of code that produces values of the respective goog.html types,\n * and absent code that violates type safety).\n *\n * For example, assigning to an element's .innerHTML property a string that is\n * derived (even partially) from untrusted input typically results in an XSS\n * vulnerability. The type-safe wrapper goog.dom.safe.setInnerHtml consumes a\n * value of type goog.html.SafeHtml, whose contract states that using its values\n * in a HTML context will not result in XSS. Hence a program that is free of\n * direct assignments to any element's innerHTML property (with the exception of\n * the assignment to .innerHTML in this file) is guaranteed to be free of XSS\n * due to assignment of untrusted strings to the innerHTML property.\n */\n\ngoog.provide('goog.dom.safe');\ngoog.provide('goog.dom.safe.InsertAdjacentHtmlPosition');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom.asserts');\ngoog.require('goog.functions');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.SafeScript');\ngoog.require('goog.html.SafeStyle');\ngoog.require('goog.html.SafeUrl');\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.html.uncheckedconversions');\ngoog.require('goog.string.Const');\ngoog.require('goog.string.internal');\n\n\n/** @enum {string} */\ngoog.dom.safe.InsertAdjacentHtmlPosition = {\n  AFTERBEGIN: 'afterbegin',\n  AFTEREND: 'afterend',\n  BEFOREBEGIN: 'beforebegin',\n  BEFOREEND: 'beforeend'\n};\n\n\n/**\n * Inserts known-safe HTML into a Node, at the specified position.\n * @param {!Node} node The node on which to call insertAdjacentHTML.\n * @param {!goog.dom.safe.InsertAdjacentHtmlPosition} position Position where\n *     to insert the HTML.\n * @param {!goog.html.SafeHtml} html The known-safe HTML to insert.\n */\ngoog.dom.safe.insertAdjacentHtml = function(node, position, html) {\n  node.insertAdjacentHTML(position, goog.html.SafeHtml.unwrapTrustedHTML(html));\n};\n\n\n/**\n * Tags not allowed in goog.dom.safe.setInnerHtml.\n * @private @const {!Object<string, boolean>}\n */\ngoog.dom.safe.SET_INNER_HTML_DISALLOWED_TAGS_ = {\n  'MATH': true,\n  'SCRIPT': true,\n  'STYLE': true,\n  'SVG': true,\n  'TEMPLATE': true\n};\n\n\n/**\n * Whether assigning to innerHTML results in a non-spec-compliant clean-up. Used\n * to define goog.dom.safe.unsafeSetInnerHtmlDoNotUseOrElse.\n *\n * <p>As mentioned in https://stackoverflow.com/questions/28741528, re-rendering\n * an element in IE by setting innerHTML causes IE to recursively disconnect all\n * parent/children connections that were in the previous contents of the\n * element. Unfortunately, this can unexpectedly result in confusing cases where\n * a function is run (typically asynchronously) on element that has since\n * disconnected from the DOM but assumes the presence of its children. A simple\n * workaround is to remove all children first. Testing on IE11 via\n * https://jsperf.com/innerhtml-vs-removechild/239, removeChild seems to be\n * ~10x faster than innerHTML='' for a large number of children (perhaps due\n * to the latter's recursive behavior), implying that this workaround would\n * not hurt performance and might actually improve it.\n * @return {boolean}\n * @private\n */\ngoog.dom.safe.isInnerHtmlCleanupRecursive_ =\n    goog.functions.cacheReturnValue(function() {\n      // `document` missing in some test frameworks.\n      if (goog.DEBUG && typeof document === 'undefined') {\n        return false;\n      }\n      // Create 3 nested <div>s without using innerHTML.\n      // We're not chaining the appendChilds in one call,  as this breaks\n      // in a DocumentFragment.\n      var div = document.createElement('div');\n      var childDiv = document.createElement('div');\n      childDiv.appendChild(document.createElement('div'));\n      div.appendChild(childDiv);\n      // `firstChild` is null in Google Js Test.\n      if (goog.DEBUG && !div.firstChild) {\n        return false;\n      }\n      var innerChild = div.firstChild.firstChild;\n      div.innerHTML =\n          goog.html.SafeHtml.unwrapTrustedHTML(goog.html.SafeHtml.EMPTY);\n      return !innerChild.parentElement;\n    });\n\n\n/**\n * Assigns HTML to an element's innerHTML property. Helper to use only here and\n * in soy.js.\n * @param {?Element} elem The element whose innerHTML is to be assigned to.\n * @param {!goog.html.SafeHtml} html\n */\ngoog.dom.safe.unsafeSetInnerHtmlDoNotUseOrElse = function(elem, html) {\n  // See comment above goog.dom.safe.isInnerHtmlCleanupRecursive_.\n  if (goog.dom.safe.isInnerHtmlCleanupRecursive_()) {\n    while (elem.lastChild) {\n      elem.removeChild(elem.lastChild);\n    }\n  }\n  elem.innerHTML = goog.html.SafeHtml.unwrapTrustedHTML(html);\n};\n\n\n/**\n * Assigns known-safe HTML to an element's innerHTML property.\n * @param {!Element} elem The element whose innerHTML is to be assigned to.\n * @param {!goog.html.SafeHtml} html The known-safe HTML to assign.\n * @throws {Error} If called with one of these tags: math, script, style, svg,\n *     template.\n */\ngoog.dom.safe.setInnerHtml = function(elem, html) {\n  if (goog.asserts.ENABLE_ASSERTS) {\n    var tagName = elem.tagName.toUpperCase();\n    if (goog.dom.safe.SET_INNER_HTML_DISALLOWED_TAGS_[tagName]) {\n      throw new Error(\n          'goog.dom.safe.setInnerHtml cannot be used to set content of ' +\n          elem.tagName + '.');\n    }\n  }\n\n  goog.dom.safe.unsafeSetInnerHtmlDoNotUseOrElse(elem, html);\n};\n\n\n/**\n * Assigns known-safe HTML to an element's outerHTML property.\n * @param {!Element} elem The element whose outerHTML is to be assigned to.\n * @param {!goog.html.SafeHtml} html The known-safe HTML to assign.\n */\ngoog.dom.safe.setOuterHtml = function(elem, html) {\n  elem.outerHTML = goog.html.SafeHtml.unwrapTrustedHTML(html);\n};\n\n\n/**\n * Safely assigns a URL a form element's action property.\n *\n * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to\n * form's action property.  If url is of type string however, it is first\n * sanitized using goog.html.SafeUrl.sanitize.\n *\n * Example usage:\n *   goog.dom.safe.setFormElementAction(formEl, url);\n * which is a safe alternative to\n *   formEl.action = url;\n * The latter can result in XSS vulnerabilities if url is a\n * user-/attacker-controlled value.\n *\n * @param {!Element} form The form element whose action property\n *     is to be assigned to.\n * @param {string|!goog.html.SafeUrl} url The URL to assign.\n * @see goog.html.SafeUrl#sanitize\n */\ngoog.dom.safe.setFormElementAction = function(form, url) {\n  /** @type {!goog.html.SafeUrl} */\n  var safeUrl;\n  if (url instanceof goog.html.SafeUrl) {\n    safeUrl = url;\n  } else {\n    safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);\n  }\n  goog.dom.asserts.assertIsHTMLFormElement(form).action =\n      goog.html.SafeUrl.unwrap(safeUrl);\n};\n\n/**\n * Safely assigns a URL to a button element's formaction property.\n *\n * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to\n * button's formaction property.  If url is of type string however, it is first\n * sanitized using goog.html.SafeUrl.sanitize.\n *\n * Example usage:\n *   goog.dom.safe.setButtonFormAction(buttonEl, url);\n * which is a safe alternative to\n *   buttonEl.action = url;\n * The latter can result in XSS vulnerabilities if url is a\n * user-/attacker-controlled value.\n *\n * @param {!Element} button The button element whose action property\n *     is to be assigned to.\n * @param {string|!goog.html.SafeUrl} url The URL to assign.\n * @see goog.html.SafeUrl#sanitize\n */\ngoog.dom.safe.setButtonFormAction = function(button, url) {\n  /** @type {!goog.html.SafeUrl} */\n  var safeUrl;\n  if (url instanceof goog.html.SafeUrl) {\n    safeUrl = url;\n  } else {\n    safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);\n  }\n  goog.dom.asserts.assertIsHTMLButtonElement(button).formAction =\n      goog.html.SafeUrl.unwrap(safeUrl);\n};\n/**\n * Safely assigns a URL to an input element's formaction property.\n *\n * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to\n * input's formaction property.  If url is of type string however, it is first\n * sanitized using goog.html.SafeUrl.sanitize.\n *\n * Example usage:\n *   goog.dom.safe.setInputFormAction(inputEl, url);\n * which is a safe alternative to\n *   inputEl.action = url;\n * The latter can result in XSS vulnerabilities if url is a\n * user-/attacker-controlled value.\n *\n * @param {!Element} input The input element whose action property\n *     is to be assigned to.\n * @param {string|!goog.html.SafeUrl} url The URL to assign.\n * @see goog.html.SafeUrl#sanitize\n */\ngoog.dom.safe.setInputFormAction = function(input, url) {\n  /** @type {!goog.html.SafeUrl} */\n  var safeUrl;\n  if (url instanceof goog.html.SafeUrl) {\n    safeUrl = url;\n  } else {\n    safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);\n  }\n  goog.dom.asserts.assertIsHTMLInputElement(input).formAction =\n      goog.html.SafeUrl.unwrap(safeUrl);\n};\n\n/**\n * Sets the given element's style property to the contents of the provided\n * SafeStyle object.\n * @param {!Element} elem\n * @param {!goog.html.SafeStyle} style\n */\ngoog.dom.safe.setStyle = function(elem, style) {\n  elem.style.cssText = goog.html.SafeStyle.unwrap(style);\n};\n\n\n/**\n * Writes known-safe HTML to a document.\n * @param {!Document} doc The document to be written to.\n * @param {!goog.html.SafeHtml} html The known-safe HTML to assign.\n */\ngoog.dom.safe.documentWrite = function(doc, html) {\n  doc.write(goog.html.SafeHtml.unwrapTrustedHTML(html));\n};\n\n\n/**\n * Safely assigns a URL to an anchor element's href property.\n *\n * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to\n * anchor's href property.  If url is of type string however, it is first\n * sanitized using goog.html.SafeUrl.sanitize.\n *\n * Example usage:\n *   goog.dom.safe.setAnchorHref(anchorEl, url);\n * which is a safe alternative to\n *   anchorEl.href = url;\n * The latter can result in XSS vulnerabilities if url is a\n * user-/attacker-controlled value.\n *\n * @param {!HTMLAnchorElement} anchor The anchor element whose href property\n *     is to be assigned to.\n * @param {string|!goog.html.SafeUrl} url The URL to assign.\n * @see goog.html.SafeUrl#sanitize\n */\ngoog.dom.safe.setAnchorHref = function(anchor, url) {\n  goog.dom.asserts.assertIsHTMLAnchorElement(anchor);\n  /** @type {!goog.html.SafeUrl} */\n  var safeUrl;\n  if (url instanceof goog.html.SafeUrl) {\n    safeUrl = url;\n  } else {\n    safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);\n  }\n  anchor.href = goog.html.SafeUrl.unwrap(safeUrl);\n};\n\n\n/**\n * Safely assigns a URL to an image element's src property.\n *\n * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to\n * image's src property.  If url is of type string however, it is first\n * sanitized using goog.html.SafeUrl.sanitize.\n *\n * @param {!HTMLImageElement} imageElement The image element whose src property\n *     is to be assigned to.\n * @param {string|!goog.html.SafeUrl} url The URL to assign.\n * @see goog.html.SafeUrl#sanitize\n */\ngoog.dom.safe.setImageSrc = function(imageElement, url) {\n  goog.dom.asserts.assertIsHTMLImageElement(imageElement);\n  /** @type {!goog.html.SafeUrl} */\n  var safeUrl;\n  if (url instanceof goog.html.SafeUrl) {\n    safeUrl = url;\n  } else {\n    var allowDataUrl = /^data:image\\//i.test(url);\n    safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url, allowDataUrl);\n  }\n  imageElement.src = goog.html.SafeUrl.unwrap(safeUrl);\n};\n\n/**\n * Safely assigns a URL to a audio element's src property.\n *\n * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to\n * audio's src property.  If url is of type string however, it is first\n * sanitized using goog.html.SafeUrl.sanitize.\n *\n * @param {!HTMLAudioElement} audioElement The audio element whose src property\n *     is to be assigned to.\n * @param {string|!goog.html.SafeUrl} url The URL to assign.\n * @see goog.html.SafeUrl#sanitize\n */\ngoog.dom.safe.setAudioSrc = function(audioElement, url) {\n  goog.dom.asserts.assertIsHTMLAudioElement(audioElement);\n  /** @type {!goog.html.SafeUrl} */\n  var safeUrl;\n  if (url instanceof goog.html.SafeUrl) {\n    safeUrl = url;\n  } else {\n    var allowDataUrl = /^data:audio\\//i.test(url);\n    safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url, allowDataUrl);\n  }\n  audioElement.src = goog.html.SafeUrl.unwrap(safeUrl);\n};\n\n/**\n * Safely assigns a URL to a video element's src property.\n *\n * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to\n * video's src property.  If url is of type string however, it is first\n * sanitized using goog.html.SafeUrl.sanitize.\n *\n * @param {!HTMLVideoElement} videoElement The video element whose src property\n *     is to be assigned to.\n * @param {string|!goog.html.SafeUrl} url The URL to assign.\n * @see goog.html.SafeUrl#sanitize\n */\ngoog.dom.safe.setVideoSrc = function(videoElement, url) {\n  goog.dom.asserts.assertIsHTMLVideoElement(videoElement);\n  /** @type {!goog.html.SafeUrl} */\n  var safeUrl;\n  if (url instanceof goog.html.SafeUrl) {\n    safeUrl = url;\n  } else {\n    var allowDataUrl = /^data:video\\//i.test(url);\n    safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url, allowDataUrl);\n  }\n  videoElement.src = goog.html.SafeUrl.unwrap(safeUrl);\n};\n\n/**\n * Safely assigns a URL to an embed element's src property.\n *\n * Example usage:\n *   goog.dom.safe.setEmbedSrc(embedEl, url);\n * which is a safe alternative to\n *   embedEl.src = url;\n * The latter can result in loading untrusted code unless it is ensured that\n * the URL refers to a trustworthy resource.\n *\n * @param {!HTMLEmbedElement} embed The embed element whose src property\n *     is to be assigned to.\n * @param {!goog.html.TrustedResourceUrl} url The URL to assign.\n */\ngoog.dom.safe.setEmbedSrc = function(embed, url) {\n  goog.dom.asserts.assertIsHTMLEmbedElement(embed);\n  embed.src = goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(url);\n};\n\n\n/**\n * Safely assigns a URL to a frame element's src property.\n *\n * Example usage:\n *   goog.dom.safe.setFrameSrc(frameEl, url);\n * which is a safe alternative to\n *   frameEl.src = url;\n * The latter can result in loading untrusted code unless it is ensured that\n * the URL refers to a trustworthy resource.\n *\n * @param {!HTMLFrameElement} frame The frame element whose src property\n *     is to be assigned to.\n * @param {!goog.html.TrustedResourceUrl} url The URL to assign.\n */\ngoog.dom.safe.setFrameSrc = function(frame, url) {\n  goog.dom.asserts.assertIsHTMLFrameElement(frame);\n  frame.src = goog.html.TrustedResourceUrl.unwrap(url);\n};\n\n\n/**\n * Safely assigns a URL to an iframe element's src property.\n *\n * Example usage:\n *   goog.dom.safe.setIframeSrc(iframeEl, url);\n * which is a safe alternative to\n *   iframeEl.src = url;\n * The latter can result in loading untrusted code unless it is ensured that\n * the URL refers to a trustworthy resource.\n *\n * @param {!HTMLIFrameElement} iframe The iframe element whose src property\n *     is to be assigned to.\n * @param {!goog.html.TrustedResourceUrl} url The URL to assign.\n */\ngoog.dom.safe.setIframeSrc = function(iframe, url) {\n  goog.dom.asserts.assertIsHTMLIFrameElement(iframe);\n  iframe.src = goog.html.TrustedResourceUrl.unwrap(url);\n};\n\n\n/**\n * Safely assigns HTML to an iframe element's srcdoc property.\n *\n * Example usage:\n *   goog.dom.safe.setIframeSrcdoc(iframeEl, safeHtml);\n * which is a safe alternative to\n *   iframeEl.srcdoc = html;\n * The latter can result in loading untrusted code.\n *\n * @param {!HTMLIFrameElement} iframe The iframe element whose srcdoc property\n *     is to be assigned to.\n * @param {!goog.html.SafeHtml} html The HTML to assign.\n */\ngoog.dom.safe.setIframeSrcdoc = function(iframe, html) {\n  goog.dom.asserts.assertIsHTMLIFrameElement(iframe);\n  iframe.srcdoc = goog.html.SafeHtml.unwrapTrustedHTML(html);\n};\n\n\n/**\n * Safely sets a link element's href and rel properties. Whether or not\n * the URL assigned to href has to be a goog.html.TrustedResourceUrl\n * depends on the value of the rel property. If rel contains \"stylesheet\"\n * then a TrustedResourceUrl is required.\n *\n * Example usage:\n *   goog.dom.safe.setLinkHrefAndRel(linkEl, url, 'stylesheet');\n * which is a safe alternative to\n *   linkEl.rel = 'stylesheet';\n *   linkEl.href = url;\n * The latter can result in loading untrusted code unless it is ensured that\n * the URL refers to a trustworthy resource.\n *\n * @param {!HTMLLinkElement} link The link element whose href property\n *     is to be assigned to.\n * @param {string|!goog.html.SafeUrl|!goog.html.TrustedResourceUrl} url The URL\n *     to assign to the href property. Must be a TrustedResourceUrl if the\n *     value assigned to rel contains \"stylesheet\". A string value is\n *     sanitized with goog.html.SafeUrl.sanitize.\n * @param {string} rel The value to assign to the rel property.\n * @throws {Error} if rel contains \"stylesheet\" and url is not a\n *     TrustedResourceUrl\n * @see goog.html.SafeUrl#sanitize\n */\ngoog.dom.safe.setLinkHrefAndRel = function(link, url, rel) {\n  goog.dom.asserts.assertIsHTMLLinkElement(link);\n  link.rel = rel;\n  if (goog.string.internal.caseInsensitiveContains(rel, 'stylesheet')) {\n    goog.asserts.assert(\n        url instanceof goog.html.TrustedResourceUrl,\n        'URL must be TrustedResourceUrl because \"rel\" contains \"stylesheet\"');\n    link.href = goog.html.TrustedResourceUrl.unwrap(url);\n  } else if (url instanceof goog.html.TrustedResourceUrl) {\n    link.href = goog.html.TrustedResourceUrl.unwrap(url);\n  } else if (url instanceof goog.html.SafeUrl) {\n    link.href = goog.html.SafeUrl.unwrap(url);\n  } else {  // string\n    // SafeUrl.sanitize must return legitimate SafeUrl when passed a string.\n    link.href = goog.html.SafeUrl.unwrap(\n        goog.html.SafeUrl.sanitizeAssertUnchanged(url));\n  }\n};\n\n\n/**\n * Safely assigns a URL to an object element's data property.\n *\n * Example usage:\n *   goog.dom.safe.setObjectData(objectEl, url);\n * which is a safe alternative to\n *   objectEl.data = url;\n * The latter can result in loading untrusted code unless setit is ensured that\n * the URL refers to a trustworthy resource.\n *\n * @param {!HTMLObjectElement} object The object element whose data property\n *     is to be assigned to.\n * @param {!goog.html.TrustedResourceUrl} url The URL to assign.\n */\ngoog.dom.safe.setObjectData = function(object, url) {\n  goog.dom.asserts.assertIsHTMLObjectElement(object);\n  object.data = goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(url);\n};\n\n\n/**\n * Safely assigns a URL to a script element's src property.\n *\n * Example usage:\n *   goog.dom.safe.setScriptSrc(scriptEl, url);\n * which is a safe alternative to\n *   scriptEl.src = url;\n * The latter can result in loading untrusted code unless it is ensured that\n * the URL refers to a trustworthy resource.\n *\n * @param {!HTMLScriptElement} script The script element whose src property\n *     is to be assigned to.\n * @param {!goog.html.TrustedResourceUrl} url The URL to assign.\n */\ngoog.dom.safe.setScriptSrc = function(script, url) {\n  goog.dom.asserts.assertIsHTMLScriptElement(script);\n  script.src = goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(url);\n\n  // If CSP nonces are used, propagate them to dynamically created scripts.\n  // This is necessary to allow nonce-based CSPs without 'strict-dynamic'.\n  var nonce = goog.getScriptNonce();\n  if (nonce) {\n    script.setAttribute('nonce', nonce);\n  }\n};\n\n\n/**\n * Safely assigns a value to a script element's content.\n *\n * Example usage:\n *   goog.dom.safe.setScriptContent(scriptEl, content);\n * which is a safe alternative to\n *   scriptEl.text = content;\n * The latter can result in executing untrusted code unless it is ensured that\n * the code is loaded from a trustworthy resource.\n *\n * @param {!HTMLScriptElement} script The script element whose content is being\n *     set.\n * @param {!goog.html.SafeScript} content The content to assign.\n */\ngoog.dom.safe.setScriptContent = function(script, content) {\n  goog.dom.asserts.assertIsHTMLScriptElement(script);\n  script.text = goog.html.SafeScript.unwrapTrustedScript(content);\n\n  // If CSP nonces are used, propagate them to dynamically created scripts.\n  // This is necessary to allow nonce-based CSPs without 'strict-dynamic'.\n  var nonce = goog.getScriptNonce();\n  if (nonce) {\n    script.setAttribute('nonce', nonce);\n  }\n};\n\n\n/**\n * Safely assigns a URL to a Location object's href property.\n *\n * If url is of type goog.html.SafeUrl, its value is unwrapped and assigned to\n * loc's href property.  If url is of type string however, it is first sanitized\n * using goog.html.SafeUrl.sanitize.\n *\n * Example usage:\n *   goog.dom.safe.setLocationHref(document.location, redirectUrl);\n * which is a safe alternative to\n *   document.location.href = redirectUrl;\n * The latter can result in XSS vulnerabilities if redirectUrl is a\n * user-/attacker-controlled value.\n *\n * @param {!Location} loc The Location object whose href property is to be\n *     assigned to.\n * @param {string|!goog.html.SafeUrl} url The URL to assign.\n * @see goog.html.SafeUrl#sanitize\n */\ngoog.dom.safe.setLocationHref = function(loc, url) {\n  goog.dom.asserts.assertIsLocation(loc);\n  /** @type {!goog.html.SafeUrl} */\n  var safeUrl;\n  if (url instanceof goog.html.SafeUrl) {\n    safeUrl = url;\n  } else {\n    safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);\n  }\n  loc.href = goog.html.SafeUrl.unwrap(safeUrl);\n};\n\n/**\n * Safely assigns the URL of a Location object.\n *\n * If url is of type goog.html.SafeUrl, its value is unwrapped and\n * passed to Location#assign. If url is of type string however, it is\n * first sanitized using goog.html.SafeUrl.sanitize.\n *\n * Example usage:\n *   goog.dom.safe.assignLocation(document.location, newUrl);\n * which is a safe alternative to\n *   document.location.assign(newUrl);\n * The latter can result in XSS vulnerabilities if newUrl is a\n * user-/attacker-controlled value.\n *\n * This has the same behaviour as setLocationHref, however some test\n * mock Location.assign instead of a property assignment.\n *\n * @param {!Location} loc The Location object which is to be assigned.\n * @param {string|!goog.html.SafeUrl} url The URL to assign.\n * @see goog.html.SafeUrl#sanitize\n */\ngoog.dom.safe.assignLocation = function(loc, url) {\n  goog.dom.asserts.assertIsLocation(loc);\n  /** @type {!goog.html.SafeUrl} */\n  var safeUrl;\n  if (url instanceof goog.html.SafeUrl) {\n    safeUrl = url;\n  } else {\n    safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);\n  }\n  loc.assign(goog.html.SafeUrl.unwrap(safeUrl));\n};\n\n\n/**\n * Safely replaces the URL of a Location object.\n *\n * If url is of type goog.html.SafeUrl, its value is unwrapped and\n * passed to Location#replace. If url is of type string however, it is\n * first sanitized using goog.html.SafeUrl.sanitize.\n *\n * Example usage:\n *   goog.dom.safe.replaceLocation(document.location, newUrl);\n * which is a safe alternative to\n *   document.location.replace(newUrl);\n * The latter can result in XSS vulnerabilities if newUrl is a\n * user-/attacker-controlled value.\n *\n * @param {!Location} loc The Location object which is to be replaced.\n * @param {string|!goog.html.SafeUrl} url The URL to assign.\n * @see goog.html.SafeUrl#sanitize\n */\ngoog.dom.safe.replaceLocation = function(loc, url) {\n  goog.dom.asserts.assertIsLocation(loc);\n  /** @type {!goog.html.SafeUrl} */\n  var safeUrl;\n  if (url instanceof goog.html.SafeUrl) {\n    safeUrl = url;\n  } else {\n    safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);\n  }\n  loc.replace(goog.html.SafeUrl.unwrap(safeUrl));\n};\n\n\n/**\n * Safely opens a URL in a new window (via window.open).\n *\n * If url is of type goog.html.SafeUrl, its value is unwrapped and passed in to\n * window.open.  If url is of type string however, it is first sanitized\n * using goog.html.SafeUrl.sanitize.\n *\n * Note that this function does not prevent leakages via the referer that is\n * sent by window.open. It is advised to only use this to open 1st party URLs.\n *\n * Example usage:\n *   goog.dom.safe.openInWindow(url);\n * which is a safe alternative to\n *   window.open(url);\n * The latter can result in XSS vulnerabilities if redirectUrl is a\n * user-/attacker-controlled value.\n *\n * @param {string|!goog.html.SafeUrl} url The URL to open.\n * @param {Window=} opt_openerWin Window of which to call the .open() method.\n *     Defaults to the global window.\n * @param {!goog.string.Const=} opt_name Name of the window to open in. Can be\n *     _top, etc as allowed by window.open().\n * @param {string=} opt_specs Comma-separated list of specifications, same as\n *     in window.open().\n * @param {boolean=} opt_replace Whether to replace the current entry in browser\n *     history, same as in window.open().\n * @return {Window} Window the url was opened in.\n */\ngoog.dom.safe.openInWindow = function(\n    url, opt_openerWin, opt_name, opt_specs, opt_replace) {\n  /** @type {!goog.html.SafeUrl} */\n  var safeUrl;\n  if (url instanceof goog.html.SafeUrl) {\n    safeUrl = url;\n  } else {\n    safeUrl = goog.html.SafeUrl.sanitizeAssertUnchanged(url);\n  }\n  var win = opt_openerWin || goog.global;\n  return win.open(\n      goog.html.SafeUrl.unwrap(safeUrl),\n      // If opt_name is undefined, simply passing that in to open() causes IE to\n      // reuse the current window instead of opening a new one. Thus we pass ''\n      // in instead, which according to spec opens a new window. See\n      // https://html.spec.whatwg.org/multipage/browsers.html#dom-open .\n      opt_name ? goog.string.Const.unwrap(opt_name) : '', opt_specs,\n      opt_replace);\n};\n\n\n/**\n * Parses the HTML as 'text/html'.\n * @param {!DOMParser} parser\n * @param {!goog.html.SafeHtml} html The HTML to be parsed.\n * @return {?Document}\n */\ngoog.dom.safe.parseFromStringHtml = function(parser, html) {\n  return goog.dom.safe.parseFromString(parser, html, 'text/html');\n};\n\n\n/**\n * Parses the string.\n * @param {!DOMParser} parser\n * @param {!goog.html.SafeHtml} content Note: We don't have a special type for\n *     XML od SVG supported by this function so we use SafeHtml.\n * @param {string} type\n * @return {?Document}\n */\ngoog.dom.safe.parseFromString = function(parser, content, type) {\n  return parser.parseFromString(\n      goog.html.SafeHtml.unwrapTrustedHTML(content), type);\n};\n\n\n/**\n * Safely creates an HTMLImageElement from a Blob.\n *\n * Example usage:\n *     goog.dom.safe.createImageFromBlob(blob);\n * which is a safe alternative to\n *     image.src = createObjectUrl(blob)\n * The latter can result in executing malicious same-origin scripts from a bad\n * Blob.\n * @param {!Blob} blob The blob to create the image from.\n * @return {!HTMLImageElement} The image element created from the blob.\n * @throws {!Error} If called with a Blob with a MIME type other than image/.*.\n */\ngoog.dom.safe.createImageFromBlob = function(blob) {\n  // Any image/* MIME type is accepted as safe.\n  if (!/^image\\/.*/g.test(blob.type)) {\n    throw new Error(\n        'goog.dom.safe.createImageFromBlob only accepts MIME type image/.*.');\n  }\n  var objectUrl = goog.global.URL.createObjectURL(blob);\n  var image = new goog.global.Image();\n  image.onload = function() {\n    goog.global.URL.revokeObjectURL(objectUrl);\n  };\n  goog.dom.safe.setImageSrc(\n      image,\n      goog.html.uncheckedconversions\n          .safeUrlFromStringKnownToSatisfyTypeContract(\n              goog.string.Const.from('Image blob URL.'), objectUrl));\n  return image;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^4B","^4C","^Y","^4D","~$goog.dom.asserts","^?","^4H","^3Q","^4E","^4G","^1I"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/safe.js"],"^O",["^=",["~$goog.dom.safe.InsertAdjacentHtmlPosition","^1E"]],"^W",true,"^X",["^?","^1L","^4K","^Y","^1I","^4B","^4E","^4D","^4C","^4H","^3Q","^4G"]],["^ ","^3",[1579837703000],"^4","goog.net.xpc.transport.js","^5",["^6","goog/net/xpc/transport.js"],"^7","goog/net/xpc/transport.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Contains the base class for transports.\n *\n */\n\n\ngoog.provide('goog.net.xpc.Transport');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.dom');\ngoog.require('goog.net.xpc.TransportNames');\n\n\n\n/**\n * The base class for transports.\n * @param {goog.dom.DomHelper=} opt_domHelper The dom helper to use for\n *     finding the window objects.\n * @constructor\n * @extends {goog.Disposable};\n */\ngoog.net.xpc.Transport = function(opt_domHelper) {\n  goog.Disposable.call(this);\n\n  /**\n   * The dom helper to use for finding the window objects to reference.\n   * @type {goog.dom.DomHelper}\n   * @private\n   */\n  this.domHelper_ = opt_domHelper || goog.dom.getDomHelper();\n};\ngoog.inherits(goog.net.xpc.Transport, goog.Disposable);\n\n\n/**\n * The transport type.\n * @type {number}\n * @protected\n */\ngoog.net.xpc.Transport.prototype.transportType = 0;\n\n\n/**\n * @return {number} The transport type identifier.\n */\ngoog.net.xpc.Transport.prototype.getType = function() {\n  return this.transportType;\n};\n\n\n/**\n * Returns the window associated with this transport instance.\n * @return {!Window} The window to use.\n */\ngoog.net.xpc.Transport.prototype.getWindow = function() {\n  return this.domHelper_.getWindow();\n};\n\n\n/**\n * Return the transport name.\n * @return {string} the transport name.\n */\ngoog.net.xpc.Transport.prototype.getName = function() {\n  return goog.net.xpc.TransportNames[String(this.transportType)] || '';\n};\n\n\n/**\n * Handles transport service messages (internal signalling).\n * @param {string} payload The message content.\n */\ngoog.net.xpc.Transport.prototype.transportServiceHandler = goog.abstractMethod;\n\n\n/**\n * Connects this transport.\n * The transport implementation is expected to call\n * CrossPageChannel.prototype.notifyConnected when the channel is ready\n * to be used.\n */\ngoog.net.xpc.Transport.prototype.connect = goog.abstractMethod;\n\n\n/**\n * Sends a message.\n * @param {string} service The name off the service the message is to be\n * delivered to.\n * @param {string} payload The message content.\n */\ngoog.net.xpc.Transport.prototype.send = goog.abstractMethod;\n","^;",1579837703000,"^<",["^=",["^1>","^?","~$goog.net.xpc.TransportNames","^1:"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/xpc/transport.js"],"^O",["^=",["~$goog.net.xpc.Transport"]],"^W",true,"^X",["^?","^1:","^1>","^4M"]],["^ ","^3",[1579837703000],"^4","goog.net.channeldebug.js","^5",["^6","goog/net/channeldebug.js"],"^7","goog/net/channeldebug.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the ChannelDebug class. ChannelDebug provides\n * a utility for tracing and debugging the BrowserChannel requests.\n *\n */\n\n\n/**\n * Namespace for BrowserChannel\n */\ngoog.provide('goog.net.ChannelDebug');\n\ngoog.forwardDeclare('goog.Uri');\ngoog.forwardDeclare('goog.net.XmlHttp.ReadyState');\ngoog.require('goog.json');\ngoog.require('goog.log');\n\n\n\n/**\n * Logs and keeps a buffer of debugging info for the Channel.\n *\n * @constructor\n */\ngoog.net.ChannelDebug = function() {\n  /**\n   * The logger instance.\n   * @const\n   * @private {?goog.debug.Logger}\n   */\n  this.logger_ = goog.log.getLogger('goog.net.BrowserChannel');\n};\n\n\n/**\n * Gets the logger used by this ChannelDebug.\n * @return {goog.debug.Logger} The logger used by this ChannelDebug.\n */\ngoog.net.ChannelDebug.prototype.getLogger = function() {\n  return this.logger_;\n};\n\n\n/**\n * Logs that the browser went offline during the lifetime of a request.\n * @param {goog.Uri} url The URL being requested.\n */\ngoog.net.ChannelDebug.prototype.browserOfflineResponse = function(url) {\n  this.info('BROWSER_OFFLINE: ' + url);\n};\n\n\n/**\n * Logs an XmlHttp request..\n * @param {string} verb The request type (GET/POST).\n * @param {goog.Uri} uri The request destination.\n * @param {string|number|undefined} id The request id.\n * @param {number} attempt Which attempt # the request was.\n * @param {?string} postData The data posted in the request.\n */\ngoog.net.ChannelDebug.prototype.xmlHttpChannelRequest = function(\n    verb, uri, id, attempt, postData) {\n  this.info(\n      'XMLHTTP REQ (' + id + ') [attempt ' + attempt + ']: ' + verb + '\\n' +\n      uri + '\\n' + this.maybeRedactPostData_(postData));\n};\n\n\n/**\n * Logs the meta data received from an XmlHttp request.\n * @param {string} verb The request type (GET/POST).\n * @param {goog.Uri} uri The request destination.\n * @param {string|number|undefined} id The request id.\n * @param {number} attempt Which attempt # the request was.\n * @param {goog.net.XmlHttp.ReadyState} readyState The ready state.\n * @param {number} statusCode The HTTP status code.\n */\ngoog.net.ChannelDebug.prototype.xmlHttpChannelResponseMetaData = function(\n    verb, uri, id, attempt, readyState, statusCode) {\n  this.info(\n      'XMLHTTP RESP (' + id + ') [ attempt ' + attempt + ']: ' + verb + '\\n' +\n      uri + '\\n' + readyState + ' ' + statusCode);\n};\n\n\n/**\n * Logs the response data received from an XmlHttp request.\n * @param {string|number|undefined} id The request id.\n * @param {?string} responseText The response text.\n * @param {?string=} opt_desc Optional request description.\n */\ngoog.net.ChannelDebug.prototype.xmlHttpChannelResponseText = function(\n    id, responseText, opt_desc) {\n  this.info(\n      'XMLHTTP TEXT (' + id + '): ' + this.redactResponse_(responseText) +\n      (opt_desc ? ' ' + opt_desc : ''));\n};\n\n\n/**\n * Logs a Trident ActiveX request.\n * @param {string} verb The request type (GET/POST).\n * @param {goog.Uri} uri The request destination.\n * @param {string|number|undefined} id The request id.\n * @param {number} attempt Which attempt # the request was.\n */\ngoog.net.ChannelDebug.prototype.tridentChannelRequest = function(\n    verb, uri, id, attempt) {\n  this.info(\n      'TRIDENT REQ (' + id + ') [ attempt ' + attempt + ']: ' + verb + '\\n' +\n      uri);\n};\n\n\n/**\n * Logs the response text received from a Trident ActiveX request.\n * @param {string|number|undefined} id The request id.\n * @param {string} responseText The response text.\n */\ngoog.net.ChannelDebug.prototype.tridentChannelResponseText = function(\n    id, responseText) {\n  this.info('TRIDENT TEXT (' + id + '): ' + this.redactResponse_(responseText));\n};\n\n\n/**\n * Logs the done response received from a Trident ActiveX request.\n * @param {string|number|undefined} id The request id.\n * @param {boolean} successful Whether the request was successful.\n */\ngoog.net.ChannelDebug.prototype.tridentChannelResponseDone = function(\n    id, successful) {\n  this.info('TRIDENT TEXT (' + id + '): ' + successful ? 'success' : 'failure');\n};\n\n\n/**\n * Logs a request timeout.\n * @param {goog.Uri} uri The uri that timed out.\n */\ngoog.net.ChannelDebug.prototype.timeoutResponse = function(uri) {\n  this.info('TIMEOUT: ' + uri);\n};\n\n\n/**\n * Logs a debug message.\n * @param {string} text The message.\n */\ngoog.net.ChannelDebug.prototype.debug = function(text) {\n  this.info(text);\n};\n\n\n/**\n * Logs an exception\n * @param {!Error} e The error or error event.\n * @param {string=} msg The optional message, defaults to 'Exception'.\n */\ngoog.net.ChannelDebug.prototype.dumpException = function(e, msg = 'Exception') {\n  this.severe(msg, e);\n};\n\n\n/**\n * Logs an info message.\n * @param {string} text The message.\n */\ngoog.net.ChannelDebug.prototype.info = function(text) {\n  goog.log.info(this.logger_, text);\n};\n\n\n/**\n * Logs a warning message.\n * @param {string} text The message.\n */\ngoog.net.ChannelDebug.prototype.warning = function(text) {\n  goog.log.warning(this.logger_, text);\n};\n\n\n/**\n * Logs a severe message.\n * @param {string} text The message.\n * @param {!Error=} error An exception associated with the message.\n */\ngoog.net.ChannelDebug.prototype.severe = function(text, error = undefined) {\n  goog.log.error(this.logger_, text, error);\n};\n\n\n/**\n * Removes potentially private data from a response so that we don't\n * accidentally save private and personal data to the server logs.\n * @param {?string} responseText A JSON response to clean.\n * @return {?string} The cleaned response.\n * @private\n */\ngoog.net.ChannelDebug.prototype.redactResponse_ = function(responseText) {\n  // first check if it's not JS - the only non-JS should be the magic cookie\n  if (!responseText ||\n      responseText == goog.net.ChannelDebug.MAGIC_RESPONSE_COOKIE) {\n    return responseText;\n  }\n\n  try {\n    var responseArray = JSON.parse(responseText);\n    if (responseArray) {\n      for (var i = 0; i < responseArray.length; i++) {\n        if (goog.isArray(responseArray[i])) {\n          this.maybeRedactArray_(responseArray[i]);\n        }\n      }\n    }\n\n    return goog.json.serialize(responseArray);\n  } catch (e) {\n    this.debug('Exception parsing expected JS array - probably was not JS');\n    return responseText;\n  }\n};\n\n\n/**\n * Removes data from a response array that may be sensitive.\n * @param {Array<?>} array The array to clean.\n * @private\n */\ngoog.net.ChannelDebug.prototype.maybeRedactArray_ = function(array) {\n  if (array.length < 2) {\n    return;\n  }\n  var dataPart = array[1];\n  if (!goog.isArray(dataPart)) {\n    return;\n  }\n  if (dataPart.length < 1) {\n    return;\n  }\n\n  var type = dataPart[0];\n  if (type != 'noop' && type != 'stop') {\n    // redact all fields in the array\n    for (var i = 1; i < dataPart.length; i++) {\n      dataPart[i] = '';\n    }\n  }\n};\n\n\n/**\n * Removes potentially private data from a request POST body so that we don't\n * accidentally save private and personal data to the server logs.\n * @param {?string} data The data string to clean.\n * @return {?string} The data string with sensitive data replaced by 'redacted'.\n * @private\n */\ngoog.net.ChannelDebug.prototype.maybeRedactPostData_ = function(data) {\n  if (!data) {\n    return null;\n  }\n  var out = '';\n  var params = data.split('&');\n  for (var i = 0; i < params.length; i++) {\n    var param = params[i];\n    var keyValue = param.split('=');\n    if (keyValue.length > 1) {\n      var key = keyValue[0];\n      var value = keyValue[1];\n\n      var keyParts = key.split('_');\n      if (keyParts.length >= 2 && keyParts[1] == 'type') {\n        out += key + '=' + value + '&';\n      } else {\n        out += key + '=' +\n            'redacted' +\n            '&';\n      }\n    }\n  }\n  return out;\n};\n\n\n/**\n * The normal response for forward channel requests.\n * Used only before version 8 of the protocol.\n * @const\n */\ngoog.net.ChannelDebug.MAGIC_RESPONSE_COOKIE = 'y2f%';\n","^;",1579837703000,"^<",["^=",["~$goog.json","^?","^18"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/channeldebug.js"],"^O",["^=",["~$goog.net.ChannelDebug"]],"^W",true,"^X",["^?","^4O","^18"]],["^ ","^3",[1579837703000],"^4","goog.math.math.js","^5",["^6","goog/math/math.js"],"^7","goog/math/math.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Additional mathematical functions.\n */\n\ngoog.provide('goog.math');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\n\n\n/**\n * Returns a random integer greater than or equal to 0 and less than `a`.\n * @param {number} a  The upper bound for the random integer (exclusive).\n * @return {number} A random integer N such that 0 <= N < a.\n */\ngoog.math.randomInt = function(a) {\n  return Math.floor(Math.random() * a);\n};\n\n\n/**\n * Returns a random number greater than or equal to `a` and less than\n * `b`.\n * @param {number} a  The lower bound for the random number (inclusive).\n * @param {number} b  The upper bound for the random number (exclusive).\n * @return {number} A random number N such that a <= N < b.\n */\ngoog.math.uniformRandom = function(a, b) {\n  return a + Math.random() * (b - a);\n};\n\n\n/**\n * Takes a number and clamps it to within the provided bounds.\n * @param {number} value The input number.\n * @param {number} min The minimum value to return.\n * @param {number} max The maximum value to return.\n * @return {number} The input number if it is within bounds, or the nearest\n *     number within the bounds.\n */\ngoog.math.clamp = function(value, min, max) {\n  return Math.min(Math.max(value, min), max);\n};\n\n\n/**\n * The % operator in JavaScript returns the remainder of a / b, but differs from\n * some other languages in that the result will have the same sign as the\n * dividend. For example, -1 % 8 == -1, whereas in some other languages\n * (such as Python) the result would be 7. This function emulates the more\n * correct modulo behavior, which is useful for certain applications such as\n * calculating an offset index in a circular list.\n *\n * @param {number} a The dividend.\n * @param {number} b The divisor.\n * @return {number} a % b where the result is between 0 and b (either 0 <= x < b\n *     or b < x <= 0, depending on the sign of b).\n */\ngoog.math.modulo = function(a, b) {\n  var r = a % b;\n  // If r and b differ in sign, add b to wrap the result to the correct sign.\n  return (r * b < 0) ? r + b : r;\n};\n\n\n/**\n * Performs linear interpolation between values a and b. Returns the value\n * between a and b proportional to x (when x is between 0 and 1. When x is\n * outside this range, the return value is a linear extrapolation).\n * @param {number} a A number.\n * @param {number} b A number.\n * @param {number} x The proportion between a and b.\n * @return {number} The interpolated value between a and b.\n */\ngoog.math.lerp = function(a, b, x) {\n  return a + x * (b - a);\n};\n\n\n/**\n * Tests whether the two values are equal to each other, within a certain\n * tolerance to adjust for floating point errors.\n * @param {number} a A number.\n * @param {number} b A number.\n * @param {number=} opt_tolerance Optional tolerance range. Defaults\n *     to 0.000001. If specified, should be greater than 0.\n * @return {boolean} Whether `a` and `b` are nearly equal.\n */\ngoog.math.nearlyEquals = function(a, b, opt_tolerance) {\n  return Math.abs(a - b) <= (opt_tolerance || 0.000001);\n};\n\n\n// TODO(user): Rename to normalizeAngle, retaining old name as deprecated\n// alias.\n/**\n * Normalizes an angle to be in range [0-360). Angles outside this range will\n * be normalized to be the equivalent angle with that range.\n * @param {number} angle Angle in degrees.\n * @return {number} Standardized angle.\n */\ngoog.math.standardAngle = function(angle) {\n  return goog.math.modulo(angle, 360);\n};\n\n\n/**\n * Normalizes an angle to be in range [0-2*PI). Angles outside this range will\n * be normalized to be the equivalent angle with that range.\n * @param {number} angle Angle in radians.\n * @return {number} Standardized angle.\n */\ngoog.math.standardAngleInRadians = function(angle) {\n  return goog.math.modulo(angle, 2 * Math.PI);\n};\n\n\n/**\n * Converts degrees to radians.\n * @param {number} angleDegrees Angle in degrees.\n * @return {number} Angle in radians.\n */\ngoog.math.toRadians = function(angleDegrees) {\n  return angleDegrees * Math.PI / 180;\n};\n\n\n/**\n * Converts radians to degrees.\n * @param {number} angleRadians Angle in radians.\n * @return {number} Angle in degrees.\n */\ngoog.math.toDegrees = function(angleRadians) {\n  return angleRadians * 180 / Math.PI;\n};\n\n\n/**\n * For a given angle and radius, finds the X portion of the offset.\n * @param {number} degrees Angle in degrees (zero points in +X direction).\n * @param {number} radius Radius.\n * @return {number} The x-distance for the angle and radius.\n */\ngoog.math.angleDx = function(degrees, radius) {\n  return radius * Math.cos(goog.math.toRadians(degrees));\n};\n\n\n/**\n * For a given angle and radius, finds the Y portion of the offset.\n * @param {number} degrees Angle in degrees (zero points in +X direction).\n * @param {number} radius Radius.\n * @return {number} The y-distance for the angle and radius.\n */\ngoog.math.angleDy = function(degrees, radius) {\n  return radius * Math.sin(goog.math.toRadians(degrees));\n};\n\n\n/**\n * Computes the angle between two points (x1,y1) and (x2,y2).\n * Angle zero points in the +X direction, 90 degrees points in the +Y\n * direction (down) and from there we grow clockwise towards 360 degrees.\n * @param {number} x1 x of first point.\n * @param {number} y1 y of first point.\n * @param {number} x2 x of second point.\n * @param {number} y2 y of second point.\n * @return {number} Standardized angle in degrees of the vector from\n *     x1,y1 to x2,y2.\n */\ngoog.math.angle = function(x1, y1, x2, y2) {\n  return goog.math.standardAngle(\n      goog.math.toDegrees(Math.atan2(y2 - y1, x2 - x1)));\n};\n\n\n/**\n * Computes the difference between startAngle and endAngle (angles in degrees).\n * @param {number} startAngle  Start angle in degrees.\n * @param {number} endAngle  End angle in degrees.\n * @return {number} The number of degrees that when added to\n *     startAngle will result in endAngle. Positive numbers mean that the\n *     direction is clockwise. Negative numbers indicate a counter-clockwise\n *     direction.\n *     The shortest route (clockwise vs counter-clockwise) between the angles\n *     is used.\n *     When the difference is 180 degrees, the function returns 180 (not -180)\n *     angleDifference(30, 40) is 10, and angleDifference(40, 30) is -10.\n *     angleDifference(350, 10) is 20, and angleDifference(10, 350) is -20.\n */\ngoog.math.angleDifference = function(startAngle, endAngle) {\n  var d =\n      goog.math.standardAngle(endAngle) - goog.math.standardAngle(startAngle);\n  if (d > 180) {\n    d = d - 360;\n  } else if (d <= -180) {\n    d = 360 + d;\n  }\n  return d;\n};\n\n\n/**\n * Returns the sign of a number as per the \"sign\" or \"signum\" function.\n * @param {number} x The number to take the sign of.\n * @return {number} -1 when negative, 1 when positive, 0 when 0. Preserves\n *     signed zeros and NaN.\n */\ngoog.math.sign = function(x) {\n  if (x > 0) {\n    return 1;\n  }\n  if (x < 0) {\n    return -1;\n  }\n  return x;  // Preserves signed zeros and NaN.\n};\n\n\n/**\n * JavaScript implementation of Longest Common Subsequence problem.\n * http://en.wikipedia.org/wiki/Longest_common_subsequence\n *\n * Returns the longest possible array that is subarray of both of given arrays.\n *\n * @param {IArrayLike<S>} array1 First array of objects.\n * @param {IArrayLike<T>} array2 Second array of objects.\n * @param {Function=} opt_compareFn Function that acts as a custom comparator\n *     for the array ojects. Function should return true if objects are equal,\n *     otherwise false.\n * @param {Function=} opt_collectorFn Function used to decide what to return\n *     as a result subsequence. It accepts 2 arguments: index of common element\n *     in the first array and index in the second. The default function returns\n *     element from the first array.\n * @return {!Array<S|T>} A list of objects that are common to both arrays\n *     such that there is no common subsequence with size greater than the\n *     length of the list.\n * @template S,T\n */\ngoog.math.longestCommonSubsequence = function(\n    array1, array2, opt_compareFn, opt_collectorFn) {\n\n  var compare = opt_compareFn || function(a, b) { return a == b; };\n\n  var collect = opt_collectorFn || function(i1, i2) { return array1[i1]; };\n\n  var length1 = array1.length;\n  var length2 = array2.length;\n\n  var arr = [];\n  for (var i = 0; i < length1 + 1; i++) {\n    arr[i] = [];\n    arr[i][0] = 0;\n  }\n\n  for (var j = 0; j < length2 + 1; j++) {\n    arr[0][j] = 0;\n  }\n\n  for (i = 1; i <= length1; i++) {\n    for (j = 1; j <= length2; j++) {\n      if (compare(array1[i - 1], array2[j - 1])) {\n        arr[i][j] = arr[i - 1][j - 1] + 1;\n      } else {\n        arr[i][j] = Math.max(arr[i - 1][j], arr[i][j - 1]);\n      }\n    }\n  }\n\n  // Backtracking\n  var result = [];\n  var i = length1, j = length2;\n  while (i > 0 && j > 0) {\n    if (compare(array1[i - 1], array2[j - 1])) {\n      result.unshift(collect(i - 1, j - 1));\n      i--;\n      j--;\n    } else {\n      if (arr[i - 1][j] > arr[i][j - 1]) {\n        i--;\n      } else {\n        j--;\n      }\n    }\n  }\n\n  return result;\n};\n\n\n/**\n * Returns the sum of the arguments.\n * @param {...number} var_args Numbers to add.\n * @return {number} The sum of the arguments (0 if no arguments were provided,\n *     `NaN` if any of the arguments is not a valid number).\n */\ngoog.math.sum = function(var_args) {\n  return /** @type {number} */ (\n      goog.array.reduce(\n          arguments, function(sum, value) { return sum + value; }, 0));\n};\n\n\n/**\n * Returns the arithmetic mean of the arguments.\n * @param {...number} var_args Numbers to average.\n * @return {number} The average of the arguments (`NaN` if no arguments\n *     were provided or any of the arguments is not a valid number).\n */\ngoog.math.average = function(var_args) {\n  return goog.math.sum.apply(null, arguments) / arguments.length;\n};\n\n\n/**\n * Returns the unbiased sample variance of the arguments. For a definition,\n * see e.g. http://en.wikipedia.org/wiki/Variance\n * @param {...number} var_args Number samples to analyze.\n * @return {number} The unbiased sample variance of the arguments (0 if fewer\n *     than two samples were provided, or `NaN` if any of the samples is\n *     not a valid number).\n */\ngoog.math.sampleVariance = function(var_args) {\n  var sampleSize = arguments.length;\n  if (sampleSize < 2) {\n    return 0;\n  }\n\n  var mean = goog.math.average.apply(null, arguments);\n  var variance =\n      goog.math.sum.apply(null, goog.array.map(arguments, function(val) {\n        return Math.pow(val - mean, 2);\n      })) / (sampleSize - 1);\n\n  return variance;\n};\n\n\n/**\n * Returns the sample standard deviation of the arguments.  For a definition of\n * sample standard deviation, see e.g.\n * http://en.wikipedia.org/wiki/Standard_deviation\n * @param {...number} var_args Number samples to analyze.\n * @return {number} The sample standard deviation of the arguments (0 if fewer\n *     than two samples were provided, or `NaN` if any of the samples is\n *     not a valid number).\n */\ngoog.math.standardDeviation = function(var_args) {\n  return Math.sqrt(goog.math.sampleVariance.apply(null, arguments));\n};\n\n\n/**\n * Returns whether the supplied number represents an integer, i.e. that is has\n * no fractional component.  No range-checking is performed on the number.\n * @param {number} num The number to test.\n * @return {boolean} Whether `num` is an integer.\n */\ngoog.math.isInt = function(num) {\n  return isFinite(num) && num % 1 == 0;\n};\n\n\n/**\n * Returns whether the supplied number is finite and not NaN.\n * @param {number} num The number to test.\n * @return {boolean} Whether `num` is a finite number.\n * @deprecated Use {@link isFinite} instead.\n */\ngoog.math.isFiniteNumber = function(num) {\n  return isFinite(num);\n};\n\n\n/**\n * @param {number} num The number to test.\n * @return {boolean} Whether it is negative zero.\n */\ngoog.math.isNegativeZero = function(num) {\n  return num == 0 && 1 / num < 0;\n};\n\n\n/**\n * Returns the precise value of floor(log10(num)).\n * Simpler implementations didn't work because of floating point rounding\n * errors. For example\n * <ul>\n * <li>Math.floor(Math.log(num) / Math.LN10) is off by one for num == 1e+3.\n * <li>Math.floor(Math.log(num) * Math.LOG10E) is off by one for num == 1e+15.\n * <li>Math.floor(Math.log10(num)) is off by one for num == 1e+15 - 1.\n * </ul>\n * @param {number} num A floating point number.\n * @return {number} Its logarithm to base 10 rounded down to the nearest\n *     integer if num > 0. -Infinity if num == 0. NaN if num < 0.\n */\ngoog.math.log10Floor = function(num) {\n  if (num > 0) {\n    var x = Math.round(Math.log(num) * Math.LOG10E);\n    return x - (parseFloat('1e' + x) > num ? 1 : 0);\n  }\n  return num == 0 ? -Infinity : NaN;\n};\n\n\n/**\n * A tweaked variant of `Math.floor` which tolerates if the passed number\n * is infinitesimally smaller than the closest integer. It often happens with\n * the results of floating point calculations because of the finite precision\n * of the intermediate results. For example {@code Math.floor(Math.log(1000) /\n * Math.LN10) == 2}, not 3 as one would expect.\n * @param {number} num A number.\n * @param {number=} opt_epsilon An infinitesimally small positive number, the\n *     rounding error to tolerate.\n * @return {number} The largest integer less than or equal to `num`.\n */\ngoog.math.safeFloor = function(num, opt_epsilon) {\n  goog.asserts.assert(opt_epsilon === undefined || opt_epsilon > 0);\n  return Math.floor(num + (opt_epsilon || 2e-15));\n};\n\n\n/**\n * A tweaked variant of `Math.ceil`. See `goog.math.safeFloor` for\n * details.\n * @param {number} num A number.\n * @param {number=} opt_epsilon An infinitesimally small positive number, the\n *     rounding error to tolerate.\n * @return {number} The smallest integer greater than or equal to `num`.\n */\ngoog.math.safeCeil = function(num, opt_epsilon) {\n  goog.asserts.assert(opt_epsilon === undefined || opt_epsilon > 0);\n  return Math.ceil(num - (opt_epsilon || 2e-15));\n};\n","^;",1579837703000,"^<",["^=",["^1L","^?","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/math.js"],"^O",["^=",["~$goog.math"]],"^W",true,"^X",["^?","^2O","^1L"]],["^ ","^3",[1579837703000],"^4","goog.useragent.product_isversion.js","^5",["^6","goog/useragent/product_isversion.js"],"^7","goog/useragent/product_isversion.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions for understanding the version of the browser.\n * This is pulled out of product.js to ensure that only builds that need\n * this functionality actually get it, without having to rely on the compiler\n * to strip out unneeded pieces.\n *\n * TODO(nnaze): Move to more appropriate filename/namespace.\n *\n */\n\n\ngoog.provide('goog.userAgent.product.isVersion');\n\n\ngoog.require('goog.labs.userAgent.platform');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\ngoog.require('goog.userAgent.product');\n\n\n/**\n * @return {string} The string that describes the version number of the user\n *     agent product.  This is a string rather than a number because it may\n *     contain 'b', 'a', and so on.\n * @private\n */\ngoog.userAgent.product.determineVersion_ = function() {\n  // All browsers have different ways to detect the version and they all have\n  // different naming schemes.\n\n  if (goog.userAgent.product.FIREFOX) {\n    // Firefox/2.0.0.1 or Firefox/3.5.3\n    return goog.userAgent.product.getFirstRegExpGroup_(/Firefox\\/([0-9.]+)/);\n  }\n\n  if (goog.userAgent.product.IE || goog.userAgent.product.EDGE ||\n      goog.userAgent.product.OPERA) {\n    return goog.userAgent.VERSION;\n  }\n\n  if (goog.userAgent.product.CHROME) {\n    if (goog.labs.userAgent.platform.isIos()) {\n      // CriOS/56.0.2924.79\n      return goog.userAgent.product.getFirstRegExpGroup_(/CriOS\\/([0-9.]+)/);\n    }\n    // Chrome/4.0.223.1\n    return goog.userAgent.product.getFirstRegExpGroup_(/Chrome\\/([0-9.]+)/);\n  }\n\n  // This replicates legacy logic, which considered Safari and iOS to be\n  // different products.\n  if (goog.userAgent.product.SAFARI && !goog.labs.userAgent.platform.isIos()) {\n    // Version/5.0.3\n    //\n    // NOTE: Before version 3, Safari did not report a product version number.\n    // The product version number for these browsers will be the empty string.\n    // They may be differentiated by WebKit version number in goog.userAgent.\n    return goog.userAgent.product.getFirstRegExpGroup_(/Version\\/([0-9.]+)/);\n  }\n\n  if (goog.userAgent.product.IPHONE || goog.userAgent.product.IPAD) {\n    // Mozilla/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1\n    // (KHTML, like Gecko) Version/3.0 Mobile/3A100a Safari/419.3\n    // Version is the browser version, Mobile is the build number. We combine\n    // the version string with the build number: 3.0.3A100a for the example.\n    var arr =\n        goog.userAgent.product.execRegExp_(/Version\\/(\\S+).*Mobile\\/(\\S+)/);\n    if (arr) {\n      return arr[1] + '.' + arr[2];\n    }\n  } else if (goog.userAgent.product.ANDROID) {\n    // Mozilla/5.0 (Linux; U; Android 0.5; en-us) AppleWebKit/522+\n    // (KHTML, like Gecko) Safari/419.3\n    //\n    // Mozilla/5.0 (Linux; U; Android 1.0; en-us; dream) AppleWebKit/525.10+\n    // (KHTML, like Gecko) Version/3.0.4 Mobile Safari/523.12.2\n    //\n    // Prefer Version number if present, else make do with the OS number\n    var version =\n        goog.userAgent.product.getFirstRegExpGroup_(/Android\\s+([0-9.]+)/);\n    if (version) {\n      return version;\n    }\n\n    return goog.userAgent.product.getFirstRegExpGroup_(/Version\\/([0-9.]+)/);\n  }\n\n  return '';\n};\n\n\n/**\n * Return the first group of the given regex.\n * @param {!RegExp} re Regular expression with at least one group.\n * @return {string} Contents of the first group or an empty string if no match.\n * @private\n */\ngoog.userAgent.product.getFirstRegExpGroup_ = function(re) {\n  var arr = goog.userAgent.product.execRegExp_(re);\n  return arr ? arr[1] : '';\n};\n\n\n/**\n * Run regexp's exec() on the userAgent string.\n * @param {!RegExp} re Regular expression.\n * @return {?IArrayLike<string>} A result array, or null for no match.\n * @private\n */\ngoog.userAgent.product.execRegExp_ = function(re) {\n  return re.exec(goog.userAgent.getUserAgentString());\n};\n\n\n/**\n * The version of the user agent. This is a string because it might contain\n * 'b' (as in beta) as well as multiple dots.\n * @type {string}\n */\ngoog.userAgent.product.VERSION = goog.userAgent.product.determineVersion_();\n\n\n/**\n * Whether the user agent product version is higher or the same as the given\n * version.\n *\n * @param {string|number} version The version to check.\n * @return {boolean} Whether the user agent product version is higher or the\n *     same as the given version.\n */\ngoog.userAgent.product.isVersion = function(version) {\n  return goog.string.compareVersions(goog.userAgent.product.VERSION, version) >=\n      0;\n};\n","^;",1579837703000,"^<",["^=",["~$goog.userAgent.product","^2L","^?","^[","~$goog.labs.userAgent.platform"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/useragent/product_isversion.js"],"^O",["^=",["~$goog.userAgent.product.isVersion"]],"^W",true,"^X",["^?","^4S","^2L","^[","^4R"]],["^ ","^3",[1579837703000],"^4","goog.events.events.js","^5",["^6","goog/events/events.js"],"^7","goog/events/events.js","^8","^9","^:","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An event manager for both native browser event\n * targets and custom JavaScript event targets\n * (`goog.events.Listenable`). This provides an abstraction\n * over browsers' event systems.\n *\n * It also provides a simulation of W3C event model's capture phase in\n * Internet Explorer (IE 8 and below). Caveat: the simulation does not\n * interact well with listeners registered directly on the elements\n * (bypassing goog.events) or even with listeners registered via\n * goog.events in a separate JS binary. In these cases, we provide\n * no ordering guarantees.\n *\n * The listeners will receive a \"patched\" event object. Such event object\n * contains normalized values for certain event properties that differs in\n * different browsers.\n *\n * Example usage:\n * <pre>\n * goog.events.listen(myNode, 'click', function(e) { alert('woo') });\n * goog.events.listen(myNode, 'mouseover', mouseHandler, true);\n * goog.events.unlisten(myNode, 'mouseover', mouseHandler, true);\n * goog.events.removeAll(myNode);\n * </pre>\n *\n *                                            in IE and event object patching]\n * @author arv@google.com (Erik Arvidsson)\n *\n * @see ../demos/events.html\n * @see ../demos/event-propagation.html\n * @see ../demos/stopevent.html\n */\n\n// IMPLEMENTATION NOTES:\n// goog.events stores an auxiliary data structure on each EventTarget\n// source being listened on. This allows us to take advantage of GC,\n// having the data structure GC'd when the EventTarget is GC'd. This\n// GC behavior is equivalent to using W3C DOM Events directly.\n\ngoog.provide('goog.events');\ngoog.provide('goog.events.CaptureSimulationMode');\ngoog.provide('goog.events.Key');\ngoog.provide('goog.events.ListenableType');\n\ngoog.forwardDeclare('goog.debug.ErrorHandler');\ngoog.forwardDeclare('goog.events.EventWrapper');\ngoog.require('goog.asserts');\ngoog.require('goog.debug.entryPointRegistry');\ngoog.require('goog.events.BrowserEvent');\ngoog.require('goog.events.BrowserFeature');\ngoog.require('goog.events.Listenable');\ngoog.require('goog.events.ListenerMap');\n\n\n/**\n * @typedef {number|goog.events.ListenableKey}\n */\ngoog.events.Key;\n\n\n/**\n * @typedef {EventTarget|goog.events.Listenable}\n */\ngoog.events.ListenableType;\n\n\n/**\n * Property name on a native event target for the listener map\n * associated with the event target.\n * @private @const {string}\n */\ngoog.events.LISTENER_MAP_PROP_ = 'closure_lm_' + ((Math.random() * 1e6) | 0);\n\n\n/**\n * String used to prepend to IE event types.\n * @const\n * @private\n */\ngoog.events.onString_ = 'on';\n\n\n/**\n * Map of computed \"on<eventname>\" strings for IE event types. Caching\n * this removes an extra object allocation in goog.events.listen which\n * improves IE6 performance.\n * @const\n * @dict\n * @private\n */\ngoog.events.onStringMap_ = {};\n\n\n/**\n * @enum {number} Different capture simulation mode for IE8-.\n */\ngoog.events.CaptureSimulationMode = {\n  /**\n   * Does not perform capture simulation. Will asserts in IE8- when you\n   * add capture listeners.\n   */\n  OFF_AND_FAIL: 0,\n\n  /**\n   * Does not perform capture simulation, silently ignore capture\n   * listeners.\n   */\n  OFF_AND_SILENT: 1,\n\n  /**\n   * Performs capture simulation.\n   */\n  ON: 2\n};\n\n\n/**\n * @define {number} The capture simulation mode for IE8-. By default,\n *     this is ON.\n */\ngoog.events.CAPTURE_SIMULATION_MODE =\n    goog.define('goog.events.CAPTURE_SIMULATION_MODE', 2);\n\n\n/**\n * Estimated count of total native listeners.\n * @private {number}\n */\ngoog.events.listenerCountEstimate_ = 0;\n\n\n/**\n * Adds an event listener for a specific event on a native event\n * target (such as a DOM element) or an object that has implemented\n * {@link goog.events.Listenable}. A listener can only be added once\n * to an object and if it is added again the key for the listener is\n * returned. Note that if the existing listener is a one-off listener\n * (registered via listenOnce), it will no longer be a one-off\n * listener after a call to listen().\n *\n * @param {EventTarget|goog.events.Listenable} src The node to listen\n *     to events on.\n * @param {string|Array<string>|\n *     !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n *     type Event type or array of event types.\n * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(?):?}|null}\n *     listener Callback method, or an object with a handleEvent function.\n *     WARNING: passing an Object is now softly deprecated.\n * @param {(boolean|!AddEventListenerOptions)=} opt_options\n * @param {T=} opt_handler Element in whose scope to call the listener.\n * @return {goog.events.Key} Unique key for the listener.\n * @template T,EVENTOBJ\n */\ngoog.events.listen = function(src, type, listener, opt_options, opt_handler) {\n  if (opt_options && opt_options.once) {\n    return goog.events.listenOnce(\n        src, type, listener, opt_options, opt_handler);\n  }\n  if (goog.isArray(type)) {\n    for (var i = 0; i < type.length; i++) {\n      goog.events.listen(src, type[i], listener, opt_options, opt_handler);\n    }\n    return null;\n  }\n\n  listener = goog.events.wrapListener(listener);\n  if (goog.events.Listenable.isImplementedBy(src)) {\n    var capture =\n        goog.isObject(opt_options) ? !!opt_options.capture : !!opt_options;\n    return src.listen(\n        /** @type {string|!goog.events.EventId} */ (type), listener, capture,\n        opt_handler);\n  } else {\n    return goog.events.listen_(\n        /** @type {!EventTarget} */ (src), type, listener,\n        /* callOnce */ false, opt_options, opt_handler);\n  }\n};\n\n\n/**\n * Adds an event listener for a specific event on a native event\n * target. A listener can only be added once to an object and if it\n * is added again the key for the listener is returned.\n *\n * Note that a one-off listener will not change an existing listener,\n * if any. On the other hand a normal listener will change existing\n * one-off listener to become a normal listener.\n *\n * @param {EventTarget} src The node to listen to events on.\n * @param {string|?goog.events.EventId<EVENTOBJ>} type Event type.\n * @param {!Function} listener Callback function.\n * @param {boolean} callOnce Whether the listener is a one-off\n *     listener or otherwise.\n * @param {(boolean|!AddEventListenerOptions)=} opt_options\n * @param {Object=} opt_handler Element in whose scope to call the listener.\n * @return {goog.events.ListenableKey} Unique key for the listener.\n * @template EVENTOBJ\n * @private\n */\ngoog.events.listen_ = function(\n    src, type, listener, callOnce, opt_options, opt_handler) {\n  if (!type) {\n    throw new Error('Invalid event type');\n  }\n\n  var capture =\n      goog.isObject(opt_options) ? !!opt_options.capture : !!opt_options;\n  if (capture && !goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) {\n    if (goog.events.CAPTURE_SIMULATION_MODE ==\n        goog.events.CaptureSimulationMode.OFF_AND_FAIL) {\n      goog.asserts.fail('Can not register capture listener in IE8-.');\n      return null;\n    } else if (\n        goog.events.CAPTURE_SIMULATION_MODE ==\n        goog.events.CaptureSimulationMode.OFF_AND_SILENT) {\n      return null;\n    }\n  }\n\n  var listenerMap = goog.events.getListenerMap_(src);\n  if (!listenerMap) {\n    src[goog.events.LISTENER_MAP_PROP_] = listenerMap =\n        new goog.events.ListenerMap(src);\n  }\n\n  var listenerObj = /** @type {goog.events.Listener} */ (\n      listenerMap.add(type, listener, callOnce, capture, opt_handler));\n\n  // If the listenerObj already has a proxy, it has been set up\n  // previously. We simply return.\n  if (listenerObj.proxy) {\n    return listenerObj;\n  }\n\n  var proxy = goog.events.getProxy();\n  listenerObj.proxy = proxy;\n\n  proxy.src = src;\n  proxy.listener = listenerObj;\n\n  // Attach the proxy through the browser's API\n  if (src.addEventListener) {\n    // Don't pass an object as `capture` if the browser doesn't support that.\n    if (!goog.events.BrowserFeature.PASSIVE_EVENTS) {\n      opt_options = capture;\n    }\n    // Don't break tests that expect a boolean.\n    if (opt_options === undefined) opt_options = false;\n    src.addEventListener(type.toString(), proxy, opt_options);\n  } else if (src.attachEvent) {\n    // The else if above used to be an unconditional else. It would call\n    // exception on IE11, spoiling the day of some callers. The previous\n    // incarnation of this code, from 2007, indicates that it replaced an\n    // earlier still version that caused excess allocations on IE6.\n    src.attachEvent(goog.events.getOnString_(type.toString()), proxy);\n  } else if (src.addListener && src.removeListener) {\n    // In IE, MediaQueryList uses addListener() insteadd of addEventListener. In\n    // Safari, there is no global for the MediaQueryList constructor, so we just\n    // check whether the object \"looks like\" MediaQueryList.\n    goog.asserts.assert(\n        type === 'change', 'MediaQueryList only has a change event');\n    src.addListener(proxy);\n  } else {\n    throw new Error('addEventListener and attachEvent are unavailable.');\n  }\n\n  goog.events.listenerCountEstimate_++;\n  return listenerObj;\n};\n\n\n/**\n * Helper function for returning a proxy function.\n * @return {!Function} A new or reused function object.\n */\ngoog.events.getProxy = function() {\n  var proxyCallbackFunction = goog.events.handleBrowserEvent_;\n  // Use a local var f to prevent one allocation.\n  var f =\n      goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT ? function(eventObject) {\n        return proxyCallbackFunction.call(f.src, f.listener, eventObject);\n      } : function(eventObject) {\n        var v = proxyCallbackFunction.call(f.src, f.listener, eventObject);\n        // NOTE(chrishenry): In IE, we hack in a capture phase. However, if\n        // there is inline event handler which tries to prevent default (for\n        // example <a href=\"...\" onclick=\"return false\">...</a>) in a\n        // descendant element, the prevent default will be overridden\n        // by this listener if this listener were to return true. Hence, we\n        // return undefined.\n        if (!v) return v;\n      };\n  return f;\n};\n\n\n/**\n * Adds an event listener for a specific event on a native event\n * target (such as a DOM element) or an object that has implemented\n * {@link goog.events.Listenable}. After the event has fired the event\n * listener is removed from the target.\n *\n * If an existing listener already exists, listenOnce will do\n * nothing. In particular, if the listener was previously registered\n * via listen(), listenOnce() will not turn the listener into a\n * one-off listener. Similarly, if there is already an existing\n * one-off listener, listenOnce does not modify the listeners (it is\n * still a once listener).\n *\n * @param {EventTarget|goog.events.Listenable} src The node to listen\n *     to events on.\n * @param {string|Array<string>|\n *     !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n *     type Event type or array of event types.\n * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(?):?}|null}\n *     listener Callback method.\n * @param {(boolean|!AddEventListenerOptions)=} opt_options\n * @param {T=} opt_handler Element in whose scope to call the listener.\n * @return {goog.events.Key} Unique key for the listener.\n * @template T,EVENTOBJ\n */\ngoog.events.listenOnce = function(\n    src, type, listener, opt_options, opt_handler) {\n  if (goog.isArray(type)) {\n    for (var i = 0; i < type.length; i++) {\n      goog.events.listenOnce(src, type[i], listener, opt_options, opt_handler);\n    }\n    return null;\n  }\n\n  listener = goog.events.wrapListener(listener);\n  if (goog.events.Listenable.isImplementedBy(src)) {\n    var capture =\n        goog.isObject(opt_options) ? !!opt_options.capture : !!opt_options;\n    return src.listenOnce(\n        /** @type {string|!goog.events.EventId} */ (type), listener, capture,\n        opt_handler);\n  } else {\n    return goog.events.listen_(\n        /** @type {!EventTarget} */ (src), type, listener,\n        /* callOnce */ true, opt_options, opt_handler);\n  }\n};\n\n\n/**\n * Adds an event listener with a specific event wrapper on a DOM Node or an\n * object that has implemented {@link goog.events.Listenable}. A listener can\n * only be added once to an object.\n *\n * @param {EventTarget|goog.events.Listenable} src The target to\n *     listen to events on.\n * @param {goog.events.EventWrapper} wrapper Event wrapper to use.\n * @param {function(this:T, ?):?|{handleEvent:function(?):?}|null} listener\n *     Callback method, or an object with a handleEvent function.\n * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to\n *     false).\n * @param {T=} opt_handler Element in whose scope to call the listener.\n * @template T\n */\ngoog.events.listenWithWrapper = function(\n    src, wrapper, listener, opt_capt, opt_handler) {\n  wrapper.listen(src, listener, opt_capt, opt_handler);\n};\n\n\n/**\n * Removes an event listener which was added with listen().\n *\n * @param {EventTarget|goog.events.Listenable} src The target to stop\n *     listening to events on.\n * @param {string|Array<string>|\n *     !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n *     type Event type or array of event types to unlisten to.\n * @param {function(?):?|{handleEvent:function(?):?}|null} listener The\n *     listener function to remove.\n * @param {(boolean|!EventListenerOptions)=} opt_options\n *     whether the listener is fired during the capture or bubble phase of the\n *     event.\n * @param {Object=} opt_handler Element in whose scope to call the listener.\n * @return {?boolean} indicating whether the listener was there to remove.\n * @template EVENTOBJ\n */\ngoog.events.unlisten = function(src, type, listener, opt_options, opt_handler) {\n  if (goog.isArray(type)) {\n    for (var i = 0; i < type.length; i++) {\n      goog.events.unlisten(src, type[i], listener, opt_options, opt_handler);\n    }\n    return null;\n  }\n  var capture =\n      goog.isObject(opt_options) ? !!opt_options.capture : !!opt_options;\n\n  listener = goog.events.wrapListener(listener);\n  if (goog.events.Listenable.isImplementedBy(src)) {\n    return src.unlisten(\n        /** @type {string|!goog.events.EventId} */ (type), listener, capture,\n        opt_handler);\n  }\n\n  if (!src) {\n    // TODO(chrishenry): We should tighten the API to only accept\n    // non-null objects, or add an assertion here.\n    return false;\n  }\n\n  var listenerMap = goog.events.getListenerMap_(\n      /** @type {!EventTarget} */ (src));\n  if (listenerMap) {\n    var listenerObj = listenerMap.getListener(\n        /** @type {string|!goog.events.EventId} */ (type), listener, capture,\n        opt_handler);\n    if (listenerObj) {\n      return goog.events.unlistenByKey(listenerObj);\n    }\n  }\n\n  return false;\n};\n\n\n/**\n * Removes an event listener which was added with listen() by the key\n * returned by listen().\n *\n * @param {goog.events.Key} key The key returned by listen() for this\n *     event listener.\n * @return {boolean} indicating whether the listener was there to remove.\n */\ngoog.events.unlistenByKey = function(key) {\n  // TODO(chrishenry): Remove this check when tests that rely on this\n  // are fixed.\n  if (typeof key === 'number') {\n    return false;\n  }\n\n  var listener = key;\n  if (!listener || listener.removed) {\n    return false;\n  }\n\n  var src = listener.src;\n  if (goog.events.Listenable.isImplementedBy(src)) {\n    return /** @type {!goog.events.Listenable} */ (src).unlistenByKey(listener);\n  }\n\n  var type = listener.type;\n  var proxy = listener.proxy;\n  if (src.removeEventListener) {\n    src.removeEventListener(type, proxy, listener.capture);\n  } else if (src.detachEvent) {\n    src.detachEvent(goog.events.getOnString_(type), proxy);\n  } else if (src.addListener && src.removeListener) {\n    src.removeListener(proxy);\n  }\n  goog.events.listenerCountEstimate_--;\n\n  var listenerMap = goog.events.getListenerMap_(\n      /** @type {!EventTarget} */ (src));\n  // TODO(chrishenry): Try to remove this conditional and execute the\n  // first branch always. This should be safe.\n  if (listenerMap) {\n    listenerMap.removeByKey(listener);\n    if (listenerMap.getTypeCount() == 0) {\n      // Null the src, just because this is simple to do (and useful\n      // for IE <= 7).\n      listenerMap.src = null;\n      // We don't use delete here because IE does not allow delete\n      // on a window object.\n      src[goog.events.LISTENER_MAP_PROP_] = null;\n    }\n  } else {\n    /** @type {!goog.events.Listener} */ (listener).markAsRemoved();\n  }\n\n  return true;\n};\n\n\n/**\n * Removes an event listener which was added with listenWithWrapper().\n *\n * @param {EventTarget|goog.events.Listenable} src The target to stop\n *     listening to events on.\n * @param {goog.events.EventWrapper} wrapper Event wrapper to use.\n * @param {function(?):?|{handleEvent:function(?):?}|null} listener The\n *     listener function to remove.\n * @param {boolean=} opt_capt In DOM-compliant browsers, this determines\n *     whether the listener is fired during the capture or bubble phase of the\n *     event.\n * @param {Object=} opt_handler Element in whose scope to call the listener.\n */\ngoog.events.unlistenWithWrapper = function(\n    src, wrapper, listener, opt_capt, opt_handler) {\n  wrapper.unlisten(src, listener, opt_capt, opt_handler);\n};\n\n\n/**\n * Removes all listeners from an object. You can also optionally\n * remove listeners of a particular type.\n *\n * @param {Object|undefined} obj Object to remove listeners from. Must be an\n *     EventTarget or a goog.events.Listenable.\n * @param {string|!goog.events.EventId=} opt_type Type of event to remove.\n *     Default is all types.\n * @return {number} Number of listeners removed.\n */\ngoog.events.removeAll = function(obj, opt_type) {\n  // TODO(chrishenry): Change the type of obj to\n  // (!EventTarget|!goog.events.Listenable).\n\n  if (!obj) {\n    return 0;\n  }\n\n  if (goog.events.Listenable.isImplementedBy(obj)) {\n    return /** @type {?} */ (obj).removeAllListeners(opt_type);\n  }\n\n  var listenerMap = goog.events.getListenerMap_(\n      /** @type {!EventTarget} */ (obj));\n  if (!listenerMap) {\n    return 0;\n  }\n\n  var count = 0;\n  var typeStr = opt_type && opt_type.toString();\n  for (var type in listenerMap.listeners) {\n    if (!typeStr || type == typeStr) {\n      // Clone so that we don't need to worry about unlistenByKey\n      // changing the content of the ListenerMap.\n      var listeners = listenerMap.listeners[type].concat();\n      for (var i = 0; i < listeners.length; ++i) {\n        if (goog.events.unlistenByKey(listeners[i])) {\n          ++count;\n        }\n      }\n    }\n  }\n  return count;\n};\n\n\n/**\n * Gets the listeners for a given object, type and capture phase.\n *\n * @param {Object} obj Object to get listeners for.\n * @param {string|!goog.events.EventId} type Event type.\n * @param {boolean} capture Capture phase?.\n * @return {Array<!goog.events.Listener>} Array of listener objects.\n */\ngoog.events.getListeners = function(obj, type, capture) {\n  if (goog.events.Listenable.isImplementedBy(obj)) {\n    return /** @type {!goog.events.Listenable} */ (obj).getListeners(\n        type, capture);\n  } else {\n    if (!obj) {\n      // TODO(chrishenry): We should tighten the API to accept\n      // !EventTarget|goog.events.Listenable, and add an assertion here.\n      return [];\n    }\n\n    var listenerMap = goog.events.getListenerMap_(\n        /** @type {!EventTarget} */ (obj));\n    return listenerMap ? listenerMap.getListeners(type, capture) : [];\n  }\n};\n\n\n/**\n * Gets the goog.events.Listener for the event or null if no such listener is\n * in use.\n *\n * @param {EventTarget|goog.events.Listenable} src The target from\n *     which to get listeners.\n * @param {?string|!goog.events.EventId<EVENTOBJ>} type The type of the event.\n * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null} listener The\n *     listener function to get.\n * @param {boolean=} opt_capt In DOM-compliant browsers, this determines\n *                            whether the listener is fired during the\n *                            capture or bubble phase of the event.\n * @param {Object=} opt_handler Element in whose scope to call the listener.\n * @return {goog.events.ListenableKey} the found listener or null if not found.\n * @template EVENTOBJ\n */\ngoog.events.getListener = function(src, type, listener, opt_capt, opt_handler) {\n  // TODO(chrishenry): Change type from ?string to string, or add assertion.\n  type = /** @type {string} */ (type);\n  listener = goog.events.wrapListener(listener);\n  var capture = !!opt_capt;\n  if (goog.events.Listenable.isImplementedBy(src)) {\n    return src.getListener(type, listener, capture, opt_handler);\n  }\n\n  if (!src) {\n    // TODO(chrishenry): We should tighten the API to only accept\n    // non-null objects, or add an assertion here.\n    return null;\n  }\n\n  var listenerMap = goog.events.getListenerMap_(\n      /** @type {!EventTarget} */ (src));\n  if (listenerMap) {\n    return listenerMap.getListener(type, listener, capture, opt_handler);\n  }\n  return null;\n};\n\n\n/**\n * Returns whether an event target has any active listeners matching the\n * specified signature. If either the type or capture parameters are\n * unspecified, the function will match on the remaining criteria.\n *\n * @param {EventTarget|goog.events.Listenable} obj Target to get\n *     listeners for.\n * @param {string|!goog.events.EventId=} opt_type Event type.\n * @param {boolean=} opt_capture Whether to check for capture or bubble-phase\n *     listeners.\n * @return {boolean} Whether an event target has one or more listeners matching\n *     the requested type and/or capture phase.\n */\ngoog.events.hasListener = function(obj, opt_type, opt_capture) {\n  if (goog.events.Listenable.isImplementedBy(obj)) {\n    return obj.hasListener(opt_type, opt_capture);\n  }\n\n  var listenerMap = goog.events.getListenerMap_(\n      /** @type {!EventTarget} */ (obj));\n  return !!listenerMap && listenerMap.hasListener(opt_type, opt_capture);\n};\n\n\n/**\n * Provides a nice string showing the normalized event objects public members\n * @param {Object} e Event Object.\n * @return {string} String of the public members of the normalized event object.\n */\ngoog.events.expose = function(e) {\n  var str = [];\n  for (var key in e) {\n    if (e[key] && e[key].id) {\n      str.push(key + ' = ' + e[key] + ' (' + e[key].id + ')');\n    } else {\n      str.push(key + ' = ' + e[key]);\n    }\n  }\n  return str.join('\\n');\n};\n\n\n/**\n * Returns a string with on prepended to the specified type. This is used for IE\n * which expects \"on\" to be prepended. This function caches the string in order\n * to avoid extra allocations in steady state.\n * @param {string} type Event type.\n * @return {string} The type string with 'on' prepended.\n * @private\n */\ngoog.events.getOnString_ = function(type) {\n  if (type in goog.events.onStringMap_) {\n    return goog.events.onStringMap_[type];\n  }\n  return goog.events.onStringMap_[type] = goog.events.onString_ + type;\n};\n\n\n/**\n * Fires an object's listeners of a particular type and phase\n *\n * @param {Object} obj Object whose listeners to call.\n * @param {string|!goog.events.EventId} type Event type.\n * @param {boolean} capture Which event phase.\n * @param {Object} eventObject Event object to be passed to listener.\n * @return {boolean} True if all listeners returned true else false.\n */\ngoog.events.fireListeners = function(obj, type, capture, eventObject) {\n  if (goog.events.Listenable.isImplementedBy(obj)) {\n    return /** @type {!goog.events.Listenable} */ (obj).fireListeners(\n        type, capture, eventObject);\n  }\n\n  return goog.events.fireListeners_(obj, type, capture, eventObject);\n};\n\n\n/**\n * Fires an object's listeners of a particular type and phase.\n * @param {Object} obj Object whose listeners to call.\n * @param {string|!goog.events.EventId} type Event type.\n * @param {boolean} capture Which event phase.\n * @param {Object} eventObject Event object to be passed to listener.\n * @return {boolean} True if all listeners returned true else false.\n * @private\n */\ngoog.events.fireListeners_ = function(obj, type, capture, eventObject) {\n  /** @type {boolean} */\n  var retval = true;\n\n  var listenerMap = goog.events.getListenerMap_(\n      /** @type {EventTarget} */ (obj));\n  if (listenerMap) {\n    // TODO(chrishenry): Original code avoids array creation when there\n    // is no listener, so we do the same. If this optimization turns\n    // out to be not required, we can replace this with\n    // listenerMap.getListeners(type, capture) instead, which is simpler.\n    var listenerArray = listenerMap.listeners[type.toString()];\n    if (listenerArray) {\n      listenerArray = listenerArray.concat();\n      for (var i = 0; i < listenerArray.length; i++) {\n        var listener = listenerArray[i];\n        // We might not have a listener if the listener was removed.\n        if (listener && listener.capture == capture && !listener.removed) {\n          var result = goog.events.fireListener(listener, eventObject);\n          retval = retval && (result !== false);\n        }\n      }\n    }\n  }\n  return retval;\n};\n\n\n/**\n * Fires a listener with a set of arguments\n *\n * @param {goog.events.Listener} listener The listener object to call.\n * @param {Object} eventObject The event object to pass to the listener.\n * @return {*} Result of listener.\n */\ngoog.events.fireListener = function(listener, eventObject) {\n  var listenerFn = listener.listener;\n  var listenerHandler = listener.handler || listener.src;\n\n  if (listener.callOnce) {\n    goog.events.unlistenByKey(listener);\n  }\n  return listenerFn.call(listenerHandler, eventObject);\n};\n\n\n/**\n * Gets the total number of listeners currently in the system.\n * @return {number} Number of listeners.\n * @deprecated This returns estimated count, now that Closure no longer\n * stores a central listener registry. We still return an estimation\n * to keep existing listener-related tests passing. In the near future,\n * this function will be removed.\n */\ngoog.events.getTotalListenerCount = function() {\n  return goog.events.listenerCountEstimate_;\n};\n\n\n/**\n * Dispatches an event (or event like object) and calls all listeners\n * listening for events of this type. The type of the event is decided by the\n * type property on the event object.\n *\n * If any of the listeners returns false OR calls preventDefault then this\n * function will return false.  If one of the capture listeners calls\n * stopPropagation, then the bubble listeners won't fire.\n *\n * @param {goog.events.Listenable} src The event target.\n * @param {goog.events.EventLike} e Event object.\n * @return {boolean} If anyone called preventDefault on the event object (or\n *     if any of the handlers returns false) this will also return false.\n *     If there are no handlers, or if all handlers return true, this returns\n *     true.\n */\ngoog.events.dispatchEvent = function(src, e) {\n  goog.asserts.assert(\n      goog.events.Listenable.isImplementedBy(src),\n      'Can not use goog.events.dispatchEvent with ' +\n          'non-goog.events.Listenable instance.');\n  return src.dispatchEvent(e);\n};\n\n\n/**\n * Installs exception protection for the browser event entry point using the\n * given error handler.\n *\n * @param {goog.debug.ErrorHandler} errorHandler Error handler with which to\n *     protect the entry point.\n */\ngoog.events.protectBrowserEventEntryPoint = function(errorHandler) {\n  goog.events.handleBrowserEvent_ =\n      errorHandler.protectEntryPoint(goog.events.handleBrowserEvent_);\n};\n\n\n/**\n * Handles an event and dispatches it to the correct listeners. This\n * function is a proxy for the real listener the user specified.\n *\n * @param {goog.events.Listener} listener The listener object.\n * @param {Event=} opt_evt Optional event object that gets passed in via the\n *     native event handlers.\n * @return {*} Result of the event handler.\n * @this {EventTarget} The object or Element that fired the event.\n * @private\n */\ngoog.events.handleBrowserEvent_ = function(listener, opt_evt) {\n  if (listener.removed) {\n    return true;\n  }\n\n  // Synthesize event propagation if the browser does not support W3C\n  // event model.\n  if (!goog.events.BrowserFeature.HAS_W3C_EVENT_SUPPORT) {\n    var ieEvent = opt_evt ||\n        /** @type {Event} */ (goog.getObjectByName('window.event'));\n    var evt = new goog.events.BrowserEvent(ieEvent, this);\n    /** @type {*} */\n    var retval = true;\n\n    if (goog.events.CAPTURE_SIMULATION_MODE ==\n        goog.events.CaptureSimulationMode.ON) {\n      // If we have not marked this event yet, we should perform capture\n      // simulation.\n      if (!goog.events.isMarkedIeEvent_(ieEvent)) {\n        goog.events.markIeEvent_(ieEvent);\n\n        var ancestors = [];\n        for (var parent = evt.currentTarget; parent;\n             parent = parent.parentNode) {\n          ancestors.push(parent);\n        }\n\n        // Fire capture listeners.\n        var type = listener.type;\n        for (var i = ancestors.length - 1; !evt.propagationStopped_ && i >= 0;\n             i--) {\n          evt.currentTarget = ancestors[i];\n          var result =\n              goog.events.fireListeners_(ancestors[i], type, true, evt);\n          retval = retval && result;\n        }\n\n        // Fire bubble listeners.\n        //\n        // We can technically rely on IE to perform bubble event\n        // propagation. However, it turns out that IE fires events in\n        // opposite order of attachEvent registration, which broke\n        // some code and tests that rely on the order. (While W3C DOM\n        // Level 2 Events TR leaves the event ordering unspecified,\n        // modern browsers and W3C DOM Level 3 Events Working Draft\n        // actually specify the order as the registration order.)\n        for (var i = 0; !evt.propagationStopped_ && i < ancestors.length; i++) {\n          evt.currentTarget = ancestors[i];\n          var result =\n              goog.events.fireListeners_(ancestors[i], type, false, evt);\n          retval = retval && result;\n        }\n      }\n    } else {\n      retval = goog.events.fireListener(listener, evt);\n    }\n    return retval;\n  }\n\n  // Otherwise, simply fire the listener.\n  return goog.events.fireListener(\n      listener, new goog.events.BrowserEvent(opt_evt, this));\n};\n\n\n/**\n * This is used to mark the IE event object so we do not do the Closure pass\n * twice for a bubbling event.\n * @param {Event} e The IE browser event.\n * @private\n */\ngoog.events.markIeEvent_ = function(e) {\n  // Only the keyCode and the returnValue can be changed. We use keyCode for\n  // non keyboard events.\n  // event.returnValue is a bit more tricky. It is undefined by default. A\n  // boolean false prevents the default action. In a window.onbeforeunload and\n  // the returnValue is non undefined it will be alerted. However, we will only\n  // modify the returnValue for keyboard events. We can get a problem if non\n  // closure events sets the keyCode or the returnValue\n\n  var useReturnValue = false;\n\n  if (e.keyCode == 0) {\n    // We cannot change the keyCode in case that srcElement is input[type=file].\n    // We could test that that is the case but that would allocate 3 objects.\n    // If we use try/catch we will only allocate extra objects in the case of a\n    // failure.\n\n    try {\n      e.keyCode = -1;\n      return;\n    } catch (ex) {\n      useReturnValue = true;\n    }\n  }\n\n  if (useReturnValue ||\n      /** @type {boolean|undefined} */ (e.returnValue) == undefined) {\n    e.returnValue = true;\n  }\n};\n\n\n/**\n * This is used to check if an IE event has already been handled by the Closure\n * system so we do not do the Closure pass twice for a bubbling event.\n * @param {Event} e  The IE browser event.\n * @return {boolean} True if the event object has been marked.\n * @private\n */\ngoog.events.isMarkedIeEvent_ = function(e) {\n  return e.keyCode < 0 || e.returnValue != undefined;\n};\n\n\n/**\n * Counter to create unique event ids.\n * @private {number}\n */\ngoog.events.uniqueIdCounter_ = 0;\n\n\n/**\n * Creates a unique event id.\n *\n * @param {string} identifier The identifier.\n * @return {string} A unique identifier.\n * @idGenerator {unique}\n */\ngoog.events.getUniqueId = function(identifier) {\n  return identifier + '_' + goog.events.uniqueIdCounter_++;\n};\n\n\n/**\n * @param {EventTarget} src The source object.\n * @return {goog.events.ListenerMap} A listener map for the given\n *     source object, or null if none exists.\n * @private\n */\ngoog.events.getListenerMap_ = function(src) {\n  var listenerMap = src[goog.events.LISTENER_MAP_PROP_];\n  // IE serializes the property as well (e.g. when serializing outer\n  // HTML). So we must check that the value is of the correct type.\n  return listenerMap instanceof goog.events.ListenerMap ? listenerMap : null;\n};\n\n\n/**\n * Expando property for listener function wrapper for Object with\n * handleEvent.\n * @private @const {string}\n */\ngoog.events.LISTENER_WRAPPER_PROP_ =\n    '__closure_events_fn_' + ((Math.random() * 1e9) >>> 0);\n\n\n/**\n * @param {Object|Function} listener The listener function or an\n *     object that contains handleEvent method.\n * @return {!Function} Either the original function or a function that\n *     calls obj.handleEvent. If the same listener is passed to this\n *     function more than once, the same function is guaranteed to be\n *     returned.\n */\ngoog.events.wrapListener = function(listener) {\n  goog.asserts.assert(listener, 'Listener can not be null.');\n\n  if (goog.isFunction(listener)) {\n    return listener;\n  }\n\n  goog.asserts.assert(\n      listener.handleEvent, 'An object listener must have handleEvent method.');\n  if (!listener[goog.events.LISTENER_WRAPPER_PROP_]) {\n    listener[goog.events.LISTENER_WRAPPER_PROP_] = function(e) {\n      return /** @type {?} */ (listener).handleEvent(e);\n    };\n  }\n  return listener[goog.events.LISTENER_WRAPPER_PROP_];\n};\n\n\n// Register the browser event handler as an entry point, so that\n// it can be monitored for exception handling, etc.\ngoog.debug.entryPointRegistry.register(\n    /**\n     * @param {function(!Function): !Function} transformer The transforming\n     *     function.\n     */\n    function(transformer) {\n      goog.events.handleBrowserEvent_ =\n          transformer(goog.events.handleBrowserEvent_);\n    });\n","^;",1579837703000,"^<",["^=",["^1L","~$goog.events.Listenable","^?","~$goog.debug.entryPointRegistry","~$goog.events.BrowserFeature","~$goog.events.ListenerMap","~$goog.events.BrowserEvent"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/events.js"],"^O",["^=",["~$goog.events.ListenableType","~$goog.events.Key","~$goog.events.CaptureSimulationMode","^1<"]],"^W",true,"^X",["^?","^1L","^4V","^4Y","^4W","^4U","^4X"]],["^ ","^3",[1579837703000],"^4","goog.net.xpc.crosspagechannel.js","^5",["^6","goog/net/xpc/crosspagechannel.js"],"^7","goog/net/xpc/crosspagechannel.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides the class CrossPageChannel, the main class in\n * goog.net.xpc.\n *\n * @see ../../demos/xpc/index.html\n */\n\ngoog.provide('goog.net.xpc.CrossPageChannel');\n\ngoog.require('goog.Uri');\ngoog.require('goog.async.Deferred');\ngoog.require('goog.async.Delay');\ngoog.require('goog.dispose');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.events');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.html.legacyconversions');\ngoog.require('goog.json');\ngoog.require('goog.log');\ngoog.require('goog.messaging.AbstractChannel');\ngoog.require('goog.net.xpc');\ngoog.require('goog.net.xpc.CfgFields');\ngoog.require('goog.net.xpc.ChannelStates');\ngoog.require('goog.net.xpc.CrossPageChannelRole');\ngoog.require('goog.net.xpc.DirectTransport');\ngoog.require('goog.net.xpc.NativeMessagingTransport');\ngoog.require('goog.net.xpc.TransportTypes');\ngoog.require('goog.net.xpc.UriCfgFields');\ngoog.require('goog.string');\ngoog.require('goog.uri.utils');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A communication channel between two documents from different domains.\n * Provides asynchronous messaging.\n *\n * @param {Object} cfg Channel configuration object.\n * @param {goog.dom.DomHelper=} opt_domHelper The optional dom helper to\n *     use for looking up elements in the dom.\n * @constructor\n * @extends {goog.messaging.AbstractChannel}\n * @deprecated Prefer goog.messaging.MessageChannel and friends.\n */\ngoog.net.xpc.CrossPageChannel = function(cfg, opt_domHelper) {\n  goog.net.xpc.CrossPageChannel.base(this, 'constructor');\n\n  for (var i = 0, uriField; uriField = goog.net.xpc.UriCfgFields[i]; i++) {\n    if (uriField in cfg && !/^https?:\\/\\//.test(cfg[uriField])) {\n      throw new Error(\n          'URI ' + cfg[uriField] + ' is invalid for field ' + uriField);\n    }\n  }\n\n  /**\n   * The configuration for this channel.\n   * @type {Object}\n   * @private\n   */\n  this.cfg_ = cfg;\n\n  /**\n   * The name of the channel. Please use\n   * <code>updateChannelNameAndCatalog</code> to change this from the transports\n   * vs changing the property directly.\n   * @type {string}\n   */\n  this.name = this.cfg_[goog.net.xpc.CfgFields.CHANNEL_NAME] ||\n      goog.net.xpc.getRandomString(10);\n\n  /**\n   * The dom helper to use for accessing the dom.\n   * @type {goog.dom.DomHelper}\n   * @private\n   */\n  this.domHelper_ = opt_domHelper || goog.dom.getDomHelper();\n\n  /**\n   * Collects deferred function calls which will be made once the connection\n   * has been fully set up.\n   * @type {!Array<function()>}\n   * @private\n   */\n  this.deferredDeliveries_ = [];\n\n  /**\n   * An event handler used to listen for load events on peer iframes.\n   * @type {!goog.events.EventHandler<!goog.net.xpc.CrossPageChannel>}\n   * @private\n   */\n  this.peerLoadHandler_ = new goog.events.EventHandler(this);\n\n  // If LOCAL_POLL_URI or PEER_POLL_URI is not available, try using\n  // robots.txt from that host.\n  cfg[goog.net.xpc.CfgFields.LOCAL_POLL_URI] =\n      cfg[goog.net.xpc.CfgFields.LOCAL_POLL_URI] ||\n      goog.uri.utils.getHost(this.domHelper_.getWindow().location.href) +\n          '/robots.txt';\n  // PEER_URI is sometimes undefined in tests.\n  cfg[goog.net.xpc.CfgFields.PEER_POLL_URI] =\n      cfg[goog.net.xpc.CfgFields.PEER_POLL_URI] ||\n      goog.uri.utils.getHost(cfg[goog.net.xpc.CfgFields.PEER_URI] || '') +\n          '/robots.txt';\n\n  goog.net.xpc.channels[this.name] = this;\n\n  if (!goog.events.getListener(\n          window, goog.events.EventType.UNLOAD,\n          goog.net.xpc.CrossPageChannel.disposeAll_)) {\n    // Set listener to dispose all registered channels on page unload.\n    goog.events.listenOnce(\n        window, goog.events.EventType.UNLOAD,\n        goog.net.xpc.CrossPageChannel.disposeAll_);\n  }\n\n  goog.log.info(goog.net.xpc.logger, 'CrossPageChannel created: ' + this.name);\n};\ngoog.inherits(goog.net.xpc.CrossPageChannel, goog.messaging.AbstractChannel);\n\n\n/**\n * Regexp for escaping service names.\n * @type {RegExp}\n * @private\n */\ngoog.net.xpc.CrossPageChannel.TRANSPORT_SERVICE_ESCAPE_RE_ =\n    new RegExp('^%*' + goog.net.xpc.TRANSPORT_SERVICE_ + '$');\n\n\n/**\n * Regexp for unescaping service names.\n * @type {RegExp}\n * @private\n */\ngoog.net.xpc.CrossPageChannel.TRANSPORT_SERVICE_UNESCAPE_RE_ =\n    new RegExp('^%+' + goog.net.xpc.TRANSPORT_SERVICE_ + '$');\n\n\n/**\n * A delay between the transport reporting as connected and the calling of the\n * connection callback.  Sometimes used to paper over timing vulnerabilities.\n * @type {?goog.async.Delay}\n * @private\n */\ngoog.net.xpc.CrossPageChannel.prototype.connectionDelay_ = null;\n\n\n/**\n * A deferred which is set to non-null while a peer iframe is being created\n * but has not yet thrown its load event, and which fires when that load event\n * arrives.\n * @type {?goog.async.Deferred}\n * @private\n */\ngoog.net.xpc.CrossPageChannel.prototype.peerWindowDeferred_ = null;\n\n\n/**\n * The transport.\n * @type {goog.net.xpc.Transport?}\n * @private\n */\ngoog.net.xpc.CrossPageChannel.prototype.transport_ = null;\n\n\n/**\n * The channel state.\n * @type {number}\n * @private\n */\ngoog.net.xpc.CrossPageChannel.prototype.state_ =\n    goog.net.xpc.ChannelStates.NOT_CONNECTED;\n\n\n/**\n * @override\n * @return {boolean} Whether the channel is connected.\n */\ngoog.net.xpc.CrossPageChannel.prototype.isConnected = function() {\n  return this.state_ == goog.net.xpc.ChannelStates.CONNECTED;\n};\n\n\n/**\n * Reference to the window-object of the peer page.\n * @type {?Object}\n * @private\n */\ngoog.net.xpc.CrossPageChannel.prototype.peerWindowObject_ = null;\n\n\n/**\n * Reference to the iframe-element.\n * @type {?HTMLIFrameElement}\n * @private\n */\ngoog.net.xpc.CrossPageChannel.prototype.iframeElement_ = null;\n\n\n/**\n * Returns the configuration object for this channel.\n * Package private. Do not call from outside goog.net.xpc.\n *\n * @return {Object} The configuration object for this channel.\n */\ngoog.net.xpc.CrossPageChannel.prototype.getConfig = function() {\n  return this.cfg_;\n};\n\n\n/**\n * Returns a reference to the iframe-element.\n * Package private. Do not call from outside goog.net.xpc.\n *\n * @return {?HTMLIFrameElement} A reference to the iframe-element.\n */\ngoog.net.xpc.CrossPageChannel.prototype.getIframeElement = function() {\n  return this.iframeElement_;\n};\n\n\n/**\n * Sets the window object the foreign document resides in.\n *\n * @param {Object} peerWindowObject The window object of the peer.\n */\ngoog.net.xpc.CrossPageChannel.prototype.setPeerWindowObject = function(\n    peerWindowObject) {\n  this.peerWindowObject_ = peerWindowObject;\n};\n\n\n/**\n * Returns the window object the foreign document resides in.\n *\n * @return {Object} The window object of the peer.\n * @package\n */\ngoog.net.xpc.CrossPageChannel.prototype.getPeerWindowObject = function() {\n  return this.peerWindowObject_;\n};\n\n\n/**\n * Determines whether the peer window is available (e.g. not closed).\n *\n * @return {boolean} Whether the peer window is available.\n * @package\n */\ngoog.net.xpc.CrossPageChannel.prototype.isPeerAvailable = function() {\n  // NOTE(user): This check is not reliable in IE, where a document in an\n  // iframe does not get unloaded when removing the iframe element from the DOM.\n  // TODO(user): Find something that works in IE as well.\n  // NOTE(user): \"!this.peerWindowObject_.closed\" evaluates to 'false' in IE9\n  // sometimes even though typeof(this.peerWindowObject_.closed) is boolean and\n  // this.peerWindowObject_.closed evaluates to 'false'. Casting it to a Boolean\n  // results in sane evaluation. When this happens, it's in the inner iframe\n  // when querying its parent's 'closed' status. Note that this is a different\n  // case than mibuerge@'s note above.\n  try {\n    return !!this.peerWindowObject_ && !this.peerWindowObject_.closed;\n  } catch (e) {\n    // If the window is closing, an error may be thrown.\n    return false;\n  }\n};\n\n\n/**\n * Determine which transport type to use for this channel / useragent.\n * @return {!goog.net.xpc.TransportTypes} The best transport type.\n * @private\n */\ngoog.net.xpc.CrossPageChannel.prototype.determineTransportType_ = function() {\n  var transportType;\n  if (goog.isFunction(document.postMessage) ||\n      goog.isFunction(window.postMessage) ||\n      // IE8 supports window.postMessage, but\n      // typeof window.postMessage returns \"object\"\n      (goog.userAgent.IE && window.postMessage)) {\n    transportType = goog.net.xpc.TransportTypes.NATIVE_MESSAGING;\n  } else {\n    transportType = goog.net.xpc.TransportTypes.UNDEFINED;\n  }\n  return transportType;\n};\n\n\n/**\n * Creates the transport for this channel. Chooses from the available\n * transport based on the user agent and the configuration.\n * @private\n */\ngoog.net.xpc.CrossPageChannel.prototype.createTransport_ = function() {\n  // return, if the transport has already been created\n  if (this.transport_) {\n    return;\n  }\n\n  // TODO(user): Use goog.scope.\n  var CfgFields = goog.net.xpc.CfgFields;\n\n  if (!this.cfg_[CfgFields.TRANSPORT]) {\n    this.cfg_[CfgFields.TRANSPORT] = this.determineTransportType_();\n  }\n\n  // If TRANSPORT cfg is a function, we assume it's a constructor to a\n  // Transport implementation. Allows fine-grained dependency control over\n  // what Transport impls are brought in.\n  if (goog.isFunction(this.cfg_[CfgFields.TRANSPORT])) {\n    this.transport_ = /** @type {!goog.net.xpc.Transport} */ (\n        new this.cfg_[CfgFields.TRANSPORT](this, this.domHelper_));\n  } else {\n    switch (this.cfg_[CfgFields.TRANSPORT]) {\n      case goog.net.xpc.TransportTypes.NATIVE_MESSAGING:\n        var protocolVersion =\n            this.cfg_[CfgFields.NATIVE_TRANSPORT_PROTOCOL_VERSION] || 2;\n        this.transport_ = new goog.net.xpc.NativeMessagingTransport(\n            this, this.cfg_[CfgFields.PEER_HOSTNAME], this.domHelper_,\n            !!this.cfg_[CfgFields.ONE_SIDED_HANDSHAKE], protocolVersion);\n        break;\n      case goog.net.xpc.TransportTypes.DIRECT:\n        if (this.peerWindowObject_ &&\n            goog.net.xpc.DirectTransport.isSupported(\n                /** @type {!Window} */ (this.peerWindowObject_))) {\n          this.transport_ =\n              new goog.net.xpc.DirectTransport(this, this.domHelper_);\n        } else {\n          goog.log.info(\n              goog.net.xpc.logger,\n              'DirectTransport not supported for this window, peer window in' +\n                  ' different security context or not set yet.');\n        }\n        break;\n    }\n  }\n\n  if (this.transport_) {\n    goog.log.info(\n        goog.net.xpc.logger, 'Transport created: ' + this.transport_.getName());\n  } else {\n    throw new Error(\n        'CrossPageChannel: No suitable transport found! You may ' +\n        'try injecting a Transport constructor directly via the channel ' +\n        'config object.');\n  }\n};\n\n\n/**\n * Returns the transport type in use for this channel.\n * @return {number} Transport-type identifier.\n */\ngoog.net.xpc.CrossPageChannel.prototype.getTransportType = function() {\n  return this.transport_.getType();\n};\n\n\n/**\n * Returns the tranport name in use for this channel.\n * @return {string} The transport name.\n */\ngoog.net.xpc.CrossPageChannel.prototype.getTransportName = function() {\n  return this.transport_.getName();\n};\n\n\n/**\n * @return {!Object} Configuration-object to be used by the peer to\n *     initialize the channel.\n */\ngoog.net.xpc.CrossPageChannel.prototype.getPeerConfiguration = function() {\n  var peerCfg = {};\n  peerCfg[goog.net.xpc.CfgFields.CHANNEL_NAME] = this.name;\n  peerCfg[goog.net.xpc.CfgFields.TRANSPORT] =\n      this.cfg_[goog.net.xpc.CfgFields.TRANSPORT];\n  peerCfg[goog.net.xpc.CfgFields.ONE_SIDED_HANDSHAKE] =\n      this.cfg_[goog.net.xpc.CfgFields.ONE_SIDED_HANDSHAKE];\n\n  if (this.cfg_[goog.net.xpc.CfgFields.LOCAL_RELAY_URI]) {\n    peerCfg[goog.net.xpc.CfgFields.PEER_RELAY_URI] =\n        this.cfg_[goog.net.xpc.CfgFields.LOCAL_RELAY_URI];\n  }\n  if (this.cfg_[goog.net.xpc.CfgFields.LOCAL_POLL_URI]) {\n    peerCfg[goog.net.xpc.CfgFields.PEER_POLL_URI] =\n        this.cfg_[goog.net.xpc.CfgFields.LOCAL_POLL_URI];\n  }\n  if (this.cfg_[goog.net.xpc.CfgFields.PEER_POLL_URI]) {\n    peerCfg[goog.net.xpc.CfgFields.LOCAL_POLL_URI] =\n        this.cfg_[goog.net.xpc.CfgFields.PEER_POLL_URI];\n  }\n  var role = this.cfg_[goog.net.xpc.CfgFields.ROLE];\n  if (role) {\n    peerCfg[goog.net.xpc.CfgFields.ROLE] =\n        role == goog.net.xpc.CrossPageChannelRole.INNER ?\n        goog.net.xpc.CrossPageChannelRole.OUTER :\n        goog.net.xpc.CrossPageChannelRole.INNER;\n  }\n\n  return peerCfg;\n};\n\n\n/**\n * Creates the iframe containing the peer page in a specified parent element.\n * This method does not connect the channel, connect() still has to be called\n * separately.\n *\n * @param {!Element} parentElm The container element the iframe is appended to.\n * @param {Function=} opt_configureIframeCb If present, this function gets\n *     called with the iframe element as parameter to allow setting properties\n *     on it before it gets added to the DOM. If absent, the iframe's width and\n *     height are set to '100%'.\n * @param {boolean=} opt_addCfgParam Whether to add the peer configuration as\n *     URL parameter (default: true).\n * @return {!HTMLIFrameElement} The iframe element.\n */\ngoog.net.xpc.CrossPageChannel.prototype.createPeerIframe = function(\n    parentElm, opt_configureIframeCb, opt_addCfgParam) {\n  goog.log.info(goog.net.xpc.logger, 'createPeerIframe()');\n\n  var iframeId = this.cfg_[goog.net.xpc.CfgFields.IFRAME_ID];\n  if (!iframeId) {\n    // Create a randomized ID for the iframe element to avoid\n    // bfcache-related issues.\n    iframeId = this.cfg_[goog.net.xpc.CfgFields.IFRAME_ID] =\n        'xpcpeer' + goog.net.xpc.getRandomString(4);\n  }\n\n  // TODO(user) Opera creates a history-entry when creating an iframe\n  // programmatically as follows. Find a way which avoids this.\n\n  var iframeElm =\n      goog.dom.getDomHelper(parentElm).createElement(goog.dom.TagName.IFRAME);\n  iframeElm.id = iframeElm.name = iframeId;\n  if (opt_configureIframeCb) {\n    opt_configureIframeCb(iframeElm);\n  } else {\n    iframeElm.style.width = iframeElm.style.height = '100%';\n  }\n\n  this.cleanUpIncompleteConnection_();\n  this.peerWindowDeferred_ = new goog.async.Deferred(undefined, this);\n  var peerUri = this.getPeerUri(opt_addCfgParam);\n  this.peerLoadHandler_.listenOnceWithScope(\n      iframeElm, 'load', this.peerWindowDeferred_.callback, false,\n      this.peerWindowDeferred_);\n\n  if (goog.userAgent.GECKO || goog.userAgent.WEBKIT) {\n    // Appending the iframe in a timeout to avoid a weird fastback issue, which\n    // is present in Safari and Gecko.\n    window.setTimeout(goog.bind(function() {\n      parentElm.appendChild(iframeElm);\n      goog.dom.safe.setIframeSrc(\n          iframeElm,\n          goog.html.legacyconversions.trustedResourceUrlFromString(\n              peerUri.toString()));\n      goog.log.info(\n          goog.net.xpc.logger, 'peer iframe created (' + iframeId + ')');\n    }, this), 1);\n  } else {\n    goog.dom.safe.setIframeSrc(\n        iframeElm,\n        goog.html.legacyconversions.trustedResourceUrlFromString(\n            peerUri.toString()));\n    parentElm.appendChild(iframeElm);\n    goog.log.info(\n        goog.net.xpc.logger, 'peer iframe created (' + iframeId + ')');\n  }\n\n  return /** @type {!HTMLIFrameElement} */ (iframeElm);\n};\n\n\n/**\n * Clean up after any incomplete attempt to establish and connect to a peer\n * iframe.\n * @private\n */\ngoog.net.xpc.CrossPageChannel.prototype.cleanUpIncompleteConnection_ =\n    function() {\n  if (this.peerWindowDeferred_) {\n    this.peerWindowDeferred_.cancel();\n    this.peerWindowDeferred_ = null;\n  }\n  this.deferredDeliveries_.length = 0;\n  this.peerLoadHandler_.removeAll();\n};\n\n\n/**\n * Returns the peer URI, with an optional URL parameter for configuring the peer\n * window.\n *\n * @param {boolean=} opt_addCfgParam Whether to add the peer configuration as\n *     URL parameter (default: true).\n * @return {!goog.Uri} The peer URI.\n */\ngoog.net.xpc.CrossPageChannel.prototype.getPeerUri = function(opt_addCfgParam) {\n  var peerUri = this.cfg_[goog.net.xpc.CfgFields.PEER_URI];\n  if (typeof peerUri === 'string') {\n    peerUri = this.cfg_[goog.net.xpc.CfgFields.PEER_URI] =\n        new goog.Uri(peerUri);\n  }\n\n  // Add the channel configuration used by the peer as URL parameter.\n  if (opt_addCfgParam !== false) {\n    peerUri.setParameterValue(\n        'xpc', goog.json.serialize(this.getPeerConfiguration()));\n  }\n\n  return peerUri;\n};\n\n\n/**\n * Initiates connecting the channel. When this method is called, all the\n * information needed to connect the channel has to be available.\n *\n * @override\n * @param {Function=} opt_connectCb The function to be called when the\n * channel has been connected and is ready to be used.\n */\ngoog.net.xpc.CrossPageChannel.prototype.connect = function(opt_connectCb) {\n  this.connectCb_ = opt_connectCb || goog.nullFunction;\n\n  // If this channel was previously closed, transition back to the NOT_CONNECTED\n  // state to ensure that the connection can proceed (xpcDeliver blocks\n  // transport messages while the connection state is CLOSED).\n  if (this.state_ == goog.net.xpc.ChannelStates.CLOSED) {\n    this.state_ = goog.net.xpc.ChannelStates.NOT_CONNECTED;\n  }\n\n  // If we know of a peer window whose creation has been requested but is not\n  // complete, peerWindowDeferred_ will be non-null, and we should block on it.\n  if (this.peerWindowDeferred_) {\n    this.peerWindowDeferred_.addCallback(this.continueConnection_);\n  } else {\n    this.continueConnection_();\n  }\n};\n\n\n/**\n * Continues the connection process once we're as sure as we can be that the\n * peer iframe has been created.\n * @private\n */\ngoog.net.xpc.CrossPageChannel.prototype.continueConnection_ = function() {\n  goog.log.info(goog.net.xpc.logger, 'continueConnection_()');\n  this.peerWindowDeferred_ = null;\n  if (this.cfg_[goog.net.xpc.CfgFields.IFRAME_ID]) {\n    this.iframeElement_ = /** @type {?HTMLIFrameElement} */ (\n        this.domHelper_.getElement(\n            this.cfg_[goog.net.xpc.CfgFields.IFRAME_ID]));\n  }\n  if (this.iframeElement_) {\n    var winObj = this.iframeElement_.contentWindow;\n    // accessing the window using contentWindow doesn't work in safari\n    if (!winObj) {\n      winObj = window.frames[this.cfg_[goog.net.xpc.CfgFields.IFRAME_ID]];\n    }\n    this.setPeerWindowObject(winObj);\n  }\n\n  // if the peer window object has not been set at this point, we assume\n  // being in an iframe and the channel is meant to be to the containing page\n  if (!this.peerWindowObject_) {\n    // throw an error if we are in the top window (== not in an iframe)\n    if (window == window.top) {\n      throw new Error(\n          'CrossPageChannel: Can\\'t connect, peer window-object not set.');\n    } else {\n      this.setPeerWindowObject(window.parent);\n    }\n  }\n\n  this.createTransport_();\n\n  this.transport_.connect();\n\n  // Now we run any deferred deliveries collected while connection was deferred.\n  while (this.deferredDeliveries_.length > 0) {\n    this.deferredDeliveries_.shift()();\n  }\n};\n\n\n/**\n * Closes the channel.\n */\ngoog.net.xpc.CrossPageChannel.prototype.close = function() {\n  this.cleanUpIncompleteConnection_();\n  this.state_ = goog.net.xpc.ChannelStates.CLOSED;\n  goog.dispose(this.transport_);\n  this.transport_ = null;\n  this.connectCb_ = null;\n  goog.dispose(this.connectionDelay_);\n  this.connectionDelay_ = null;\n  goog.log.info(goog.net.xpc.logger, 'Channel \"' + this.name + '\" closed');\n};\n\n\n/**\n * Package-private.\n * Called by the transport when the channel is connected.\n * @param {number=} opt_delay Delay this number of milliseconds before calling\n *     the connection callback. Usage is discouraged, but can be used to paper\n *     over timing vulnerabilities when there is no alternative.\n */\ngoog.net.xpc.CrossPageChannel.prototype.notifyConnected = function(opt_delay) {\n  if (this.isConnected() ||\n      (this.connectionDelay_ && this.connectionDelay_.isActive())) {\n    return;\n  }\n  this.state_ = goog.net.xpc.ChannelStates.CONNECTED;\n  goog.log.info(goog.net.xpc.logger, 'Channel \"' + this.name + '\" connected');\n  goog.dispose(this.connectionDelay_);\n  if (opt_delay !== undefined) {\n    this.connectionDelay_ = new goog.async.Delay(this.connectCb_, opt_delay);\n    this.connectionDelay_.start();\n  } else {\n    this.connectionDelay_ = null;\n    this.connectCb_();\n  }\n};\n\n\n/**\n * Called by the transport in case of an unrecoverable failure.\n * Package private. Do not call from outside goog.net.xpc.\n */\ngoog.net.xpc.CrossPageChannel.prototype.notifyTransportError = function() {\n  goog.log.info(goog.net.xpc.logger, 'Transport Error');\n  this.close();\n};\n\n\n/** @override */\ngoog.net.xpc.CrossPageChannel.prototype.send = function(serviceName, payload) {\n  if (!this.isConnected()) {\n    goog.log.error(goog.net.xpc.logger, 'Can\\'t send. Channel not connected.');\n    return;\n  }\n  // Check if the peer is still around.\n  if (!this.isPeerAvailable()) {\n    goog.log.error(goog.net.xpc.logger, 'Peer has disappeared.');\n    this.close();\n    return;\n  }\n  if (goog.isObject(payload)) {\n    payload = goog.json.serialize(payload);\n  }\n\n  // Partially URL-encode the service name because some characters (: and |) are\n  // used as delimiters for some transports, and we want to allow those\n  // characters in service names.\n  this.transport_.send(this.escapeServiceName_(serviceName), payload);\n};\n\n\n/**\n * Delivers messages to the appropriate service-handler. Named xpcDeliver to\n * avoid name conflict with `deliver` function in superclass\n * goog.messaging.AbstractChannel.\n *\n * @param {string} serviceName The name of the port.\n * @param {string} payload The payload.\n * @param {string=} opt_origin An optional origin for the message, where the\n *     underlying transport makes that available.  If this is specified, and\n *     the PEER_HOSTNAME parameter was provided, they must match or the message\n *     will be rejected.\n * @package\n */\ngoog.net.xpc.CrossPageChannel.prototype.xpcDeliver = function(\n    serviceName, payload, opt_origin) {\n\n  // This check covers the very rare (but producable) case where the inner frame\n  // becomes ready and sends its setup message while the outer frame is\n  // deferring its connect method waiting for the inner frame to be ready. The\n  // resulting deferral ensures the message will not be processed until the\n  // channel is fully configured.\n  if (this.peerWindowDeferred_) {\n    this.deferredDeliveries_.push(\n        goog.bind(this.xpcDeliver, this, serviceName, payload, opt_origin));\n    return;\n  }\n\n  // Check whether the origin of the message is as expected.\n  if (!this.isMessageOriginAcceptable(opt_origin)) {\n    goog.log.warning(\n        goog.net.xpc.logger, 'Message received from unapproved origin \"' +\n            opt_origin + '\" - rejected.');\n    return;\n  }\n\n  // If there is another channel still open, the native transport's global\n  // postMessage listener will still be active.  This will mean that messages\n  // being sent to the now-closed channel will still be received and delivered,\n  // such as transport service traffic from its previous correspondent in the\n  // other frame.  Ensure these messages don't cause exceptions.\n  // Example: http://b/12419303\n  if (this.isDisposed() || this.state_ == goog.net.xpc.ChannelStates.CLOSED) {\n    goog.log.warning(\n        goog.net.xpc.logger, 'CrossPageChannel::xpcDeliver(): Channel closed.');\n  } else if (!serviceName || serviceName == goog.net.xpc.TRANSPORT_SERVICE_) {\n    this.transport_.transportServiceHandler(payload);\n  } else {\n    // only deliver messages if connected\n    if (this.isConnected()) {\n      this.deliver(this.unescapeServiceName_(serviceName), payload);\n    } else {\n      goog.log.info(\n          goog.net.xpc.logger,\n          'CrossPageChannel::xpcDeliver(): Not connected.');\n    }\n  }\n};\n\n\n/**\n * Escape the user-provided service name for sending across the channel. This\n * URL-encodes certain special characters so they don't conflict with delimiters\n * used by some of the transports, and adds a special prefix if the name\n * conflicts with the reserved transport service name.\n *\n * This is the opposite of {@link #unescapeServiceName_}.\n *\n * @param {string} name The name of the service to escape.\n * @return {string} The escaped service name.\n * @private\n */\ngoog.net.xpc.CrossPageChannel.prototype.escapeServiceName_ = function(name) {\n  if (goog.net.xpc.CrossPageChannel.TRANSPORT_SERVICE_ESCAPE_RE_.test(name)) {\n    name = '%' + name;\n  }\n  return name.replace(/[%:|]/g, encodeURIComponent);\n};\n\n\n/**\n * Unescape the escaped service name that was sent across the channel. This is\n * the opposite of {@link #escapeServiceName_}.\n *\n * @param {string} name The name of the service to unescape.\n * @return {string} The unescaped service name.\n * @private\n */\ngoog.net.xpc.CrossPageChannel.prototype.unescapeServiceName_ = function(name) {\n  name = name.replace(/%[0-9a-f]{2}/gi, decodeURIComponent);\n  if (goog.net.xpc.CrossPageChannel.TRANSPORT_SERVICE_UNESCAPE_RE_.test(name)) {\n    return name.substring(1);\n  } else {\n    return name;\n  }\n};\n\n\n/**\n * Returns the role of this channel (either inner or outer).\n * @return {number} The role of this channel.\n */\ngoog.net.xpc.CrossPageChannel.prototype.getRole = function() {\n  var role = this.cfg_[goog.net.xpc.CfgFields.ROLE];\n  if (typeof role === 'number') {\n    return role;\n  } else {\n    return window.parent == this.peerWindowObject_ ?\n        goog.net.xpc.CrossPageChannelRole.INNER :\n        goog.net.xpc.CrossPageChannelRole.OUTER;\n  }\n};\n\n\n/**\n * Sets the channel name. Note, this doesn't establish a unique channel to\n * communicate on.\n * @param {string} name The new channel name.\n */\ngoog.net.xpc.CrossPageChannel.prototype.updateChannelNameAndCatalog = function(\n    name) {\n  goog.log.fine(goog.net.xpc.logger, 'changing channel name to ' + name);\n  delete goog.net.xpc.channels[this.name];\n  this.name = name;\n  goog.net.xpc.channels[name] = this;\n};\n\n\n/**\n * Returns whether an incoming message with the given origin is acceptable.\n * If an incoming request comes with a specified (non-empty) origin, and the\n * PEER_HOSTNAME config parameter has also been provided, the two must match,\n * or the message is unacceptable.\n * @param {string=} opt_origin The origin associated with the incoming message.\n * @return {boolean} Whether the message is acceptable.\n * @package\n */\ngoog.net.xpc.CrossPageChannel.prototype.isMessageOriginAcceptable = function(\n    opt_origin) {\n  var peerHostname = this.cfg_[goog.net.xpc.CfgFields.PEER_HOSTNAME];\n  return goog.string.isEmptyOrWhitespace(goog.string.makeSafe(opt_origin)) ||\n      goog.string.isEmptyOrWhitespace(goog.string.makeSafe(peerHostname)) ||\n      opt_origin == this.cfg_[goog.net.xpc.CfgFields.PEER_HOSTNAME];\n};\n\n\n/** @override */\ngoog.net.xpc.CrossPageChannel.prototype.disposeInternal = function() {\n  this.close();\n\n  this.peerWindowObject_ = null;\n  this.iframeElement_ = null;\n  delete goog.net.xpc.channels[this.name];\n  goog.dispose(this.peerLoadHandler_);\n  delete this.peerLoadHandler_;\n  goog.net.xpc.CrossPageChannel.base(this, 'disposeInternal');\n};\n\n\n/**\n * Disposes all channels.\n * @private\n */\ngoog.net.xpc.CrossPageChannel.disposeAll_ = function() {\n  for (var name in goog.net.xpc.channels) {\n    goog.dispose(goog.net.xpc.channels[name]);\n  }\n};\n","^;",1579837703000,"^<",["^=",["~$goog.messaging.AbstractChannel","~$goog.net.xpc.CfgFields","^1>","~$goog.net.xpc","~$goog.net.xpc.CrossPageChannelRole","^1T","~$goog.net.xpc.NativeMessagingTransport","~$goog.uri.utils","^4O","^2L","^16","~$goog.net.xpc.TransportTypes","~$goog.net.xpc.DirectTransport","^?","^[","^18","~$goog.net.xpc.ChannelStates","~$goog.html.legacyconversions","^1C","~$goog.net.xpc.UriCfgFields","^1E","~$goog.async.Deferred","~$goog.dispose","^1<","^12","~$goog.async.Delay"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/xpc/crosspagechannel.js"],"^O",["^=",["~$goog.net.xpc.CrossPageChannel"]],"^W",true,"^X",["^?","^16","^5<","^5>","^5=","^1>","^12","^1E","^1<","^1T","^1C","^5:","^4O","^18","^51","^53","^52","^59","^54","^58","^55","^57","^5;","^2L","^56","^["]],["^ ","^3",[1579837703000],"^4","goog.ui.control.js","^5",["^6","goog/ui/control.js"],"^7","goog/ui/control.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Base class for UI controls such as buttons, menus, menu items,\n * toolbar buttons, etc.  The implementation is based on a generalized version\n * of {@link goog.ui.MenuItem}.\n * TODO(attila):  If the renderer framework works well, pull it into Component.\n *\n * @author attila@google.com (Attila Bodis)\n * @see ../demos/control.html\n * @see http://code.google.com/p/closure-library/wiki/IntroToControls\n */\n\ngoog.provide('goog.ui.Control');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.events.BrowserEvent');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.events.KeyHandler');\ngoog.require('goog.string');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.ComponentUtil');\n/** @suppress {extraRequire} */\ngoog.require('goog.ui.ControlContent');\ngoog.require('goog.ui.ControlRenderer');\ngoog.require('goog.ui.registry');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Base class for UI controls.  Extends {@link goog.ui.Component} by adding\n * the following:\n *  <ul>\n *    <li>a {@link goog.events.KeyHandler}, to simplify keyboard handling,\n *    <li>a pluggable <em>renderer</em> framework, to simplify the creation of\n *        simple controls without the need to subclass this class,\n *    <li>the notion of component <em>content</em>, like a text caption or DOM\n *        structure displayed in the component (e.g. a button label),\n *    <li>getter and setter for component content, as well as a getter and\n *        setter specifically for caption text (for convenience),\n *    <li>support for hiding/showing the component,\n      <li>fine-grained control over supported states and state transition\n          events, and\n *    <li>default mouse and keyboard event handling.\n *  </ul>\n * This class has sufficient built-in functionality for most simple UI controls.\n * All controls dispatch SHOW, HIDE, ENTER, LEAVE, and ACTION events on show,\n * hide, mouseover, mouseout, and user action, respectively.  Additional states\n * are also supported.  See closure/demos/control.html\n * for example usage.\n * @param {goog.ui.ControlContent=} opt_content Text caption or DOM structure\n *     to display as the content of the control (if any).\n * @param {goog.ui.ControlRenderer=} opt_renderer Renderer used to render or\n *     decorate the component; defaults to {@link goog.ui.ControlRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.Component}\n */\ngoog.ui.Control = function(opt_content, opt_renderer, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n  this.renderer_ =\n      opt_renderer || goog.ui.registry.getDefaultRenderer(this.constructor);\n  this.setContentInternal(opt_content !== undefined ? opt_content : null);\n\n  /** @private {?string} The control's aria-label. */\n  this.ariaLabel_ = null;\n\n  /** @private {goog.ui.Control.IeMouseEventSequenceSimulator_} */\n  this.ieMouseEventSequenceSimulator_;\n};\ngoog.inherits(goog.ui.Control, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.Control);\n\n\n// Renderer registry.\n// TODO(attila): Refactor existing usages inside Google in a follow-up CL.\n\n\n/**\n * Maps a CSS class name to a function that returns a new instance of\n * {@link goog.ui.Control} or a subclass thereof, suitable to decorate\n * an element that has the specified CSS class.  UI components that extend\n * {@link goog.ui.Control} and want {@link goog.ui.Container}s to be able\n * to discover and decorate elements using them should register a factory\n * function via this API.\n * @param {string} className CSS class name.\n * @param {Function} decoratorFunction Function that takes no arguments and\n *     returns a new instance of a control to decorate an element with the\n *     given class.\n * @deprecated Use {@link goog.ui.registry.setDecoratorByClassName} instead.\n */\ngoog.ui.Control.registerDecorator = goog.ui.registry.setDecoratorByClassName;\n\n\n/**\n * Takes an element and returns a new instance of {@link goog.ui.Control}\n * or a subclass, suitable to decorate it (based on the element's CSS class).\n * @param {Element} element Element to decorate.\n * @return {goog.ui.Control?} New control instance to decorate the element\n *     (null if none).\n * @deprecated Use {@link goog.ui.registry.getDecorator} instead.\n */\ngoog.ui.Control.getDecorator =\n    /** @type {function(Element): goog.ui.Control} */ (\n        goog.ui.registry.getDecorator);\n\n\n/**\n * Renderer associated with the component.\n * @type {goog.ui.ControlRenderer|undefined}\n * @private\n */\ngoog.ui.Control.prototype.renderer_;\n\n\n/**\n * Text caption or DOM structure displayed in the component.\n * @type {?goog.ui.ControlContent}\n * @private\n */\ngoog.ui.Control.prototype.content_ = null;\n\n\n/**\n * Current component state; a bit mask of {@link goog.ui.Component.State}s.\n * @type {number}\n * @private\n */\ngoog.ui.Control.prototype.state_ = 0x00;\n\n\n/**\n * A bit mask of {@link goog.ui.Component.State}s this component supports.\n * @type {number}\n * @private\n */\ngoog.ui.Control.prototype.supportedStates_ = goog.ui.Component.State.DISABLED |\n    goog.ui.Component.State.HOVER | goog.ui.Component.State.ACTIVE |\n    goog.ui.Component.State.FOCUSED;\n\n\n/**\n * A bit mask of {@link goog.ui.Component.State}s for which this component\n * provides default event handling.  For example, a component that handles\n * the HOVER state automatically will highlight itself on mouseover, whereas\n * a component that doesn't handle HOVER automatically will only dispatch\n * ENTER and LEAVE events but not call {@link setHighlighted} on itself.\n * By default, components provide default event handling for all states.\n * Controls hosted in containers (e.g. menu items in a menu, or buttons in a\n * toolbar) will typically want to have their container manage their highlight\n * state.  Selectable controls managed by a selection model will also typically\n * want their selection state to be managed by the model.\n * @type {number}\n * @private\n */\ngoog.ui.Control.prototype.autoStates_ = goog.ui.Component.State.ALL;\n\n\n/**\n * A bit mask of {@link goog.ui.Component.State}s for which this component\n * dispatches state transition events.  Because events are expensive, the\n * default behavior is to not dispatch any state transition events at all.\n * Use the {@link #setDispatchTransitionEvents} API to request transition\n * events  as needed.  Subclasses may enable transition events by default.\n * Controls hosted in containers or managed by a selection model will typically\n * want to dispatch transition events.\n * @type {number}\n * @private\n */\ngoog.ui.Control.prototype.statesWithTransitionEvents_ = 0x00;\n\n\n/**\n * Component visibility.\n * @type {boolean}\n * @private\n */\ngoog.ui.Control.prototype.visible_ = true;\n\n\n/**\n * Keyboard event handler.\n * @type {goog.events.KeyHandler}\n * @private\n */\ngoog.ui.Control.prototype.keyHandler_;\n\n\n/**\n * Additional class name(s) to apply to the control's root element, if any.\n * @type {Array<string>?}\n * @private\n */\ngoog.ui.Control.prototype.extraClassNames_ = null;\n\n\n/**\n * Whether the control should listen for and handle mouse events; defaults to\n * true.\n * @type {boolean}\n * @private\n */\ngoog.ui.Control.prototype.handleMouseEvents_ = true;\n\n\n/**\n * Whether the control allows text selection within its DOM.  Defaults to false.\n * @type {boolean}\n * @private\n */\ngoog.ui.Control.prototype.allowTextSelection_ = false;\n\n\n/**\n * The control's preferred ARIA role.\n * @type {?goog.a11y.aria.Role}\n * @private\n */\ngoog.ui.Control.prototype.preferredAriaRole_ = null;\n\n\n// Event handler and renderer management.\n\n\n/**\n * Returns true if the control is configured to handle its own mouse events,\n * false otherwise.  Controls not hosted in {@link goog.ui.Container}s have\n * to handle their own mouse events, but controls hosted in containers may\n * allow their parent to handle mouse events on their behalf.  Considered\n * protected; should only be used within this package and by subclasses.\n * @return {boolean} Whether the control handles its own mouse events.\n */\ngoog.ui.Control.prototype.isHandleMouseEvents = function() {\n  return this.handleMouseEvents_;\n};\n\n\n/**\n * Enables or disables mouse event handling for the control.  Containers may\n * use this method to disable mouse event handling in their child controls.\n * Considered protected; should only be used within this package and by\n * subclasses.\n * @param {boolean} enable Whether to enable or disable mouse event handling.\n */\ngoog.ui.Control.prototype.setHandleMouseEvents = function(enable) {\n  if (this.isInDocument() && enable != this.handleMouseEvents_) {\n    // Already in the document; need to update event handler.\n    this.enableMouseEventHandling_(enable);\n  }\n  this.handleMouseEvents_ = enable;\n};\n\n\n/**\n * Returns the DOM element on which the control is listening for keyboard\n * events (null if none).\n * @return {Element} Element on which the control is listening for key\n *     events.\n */\ngoog.ui.Control.prototype.getKeyEventTarget = function() {\n  // Delegate to renderer.\n  return this.renderer_.getKeyEventTarget(this);\n};\n\n\n/**\n * Returns the keyboard event handler for this component, lazily created the\n * first time this method is called.  Considered protected; should only be\n * used within this package and by subclasses.\n * @return {!goog.events.KeyHandler} Keyboard event handler for this component.\n * @protected\n */\ngoog.ui.Control.prototype.getKeyHandler = function() {\n  return this.keyHandler_ || (this.keyHandler_ = new goog.events.KeyHandler());\n};\n\n\n/**\n * Returns the renderer used by this component to render itself or to decorate\n * an existing element.\n * @return {goog.ui.ControlRenderer|undefined} Renderer used by the component\n *     (undefined if none).\n */\ngoog.ui.Control.prototype.getRenderer = function() {\n  return this.renderer_;\n};\n\n\n/**\n * Registers the given renderer with the component.  Changing renderers after\n * the component has entered the document is an error.\n * @param {goog.ui.ControlRenderer} renderer Renderer used by the component.\n * @throws {Error} If the control is already in the document.\n */\ngoog.ui.Control.prototype.setRenderer = function(renderer) {\n  if (this.isInDocument()) {\n    // Too late.\n    throw new Error(goog.ui.Component.Error.ALREADY_RENDERED);\n  }\n\n  if (this.getElement()) {\n    // The component has already been rendered, but isn't yet in the document.\n    // Replace the renderer and delete the current DOM, so it can be re-rendered\n    // using the new renderer the next time someone calls render().\n    this.setElementInternal(null);\n  }\n\n  this.renderer_ = renderer;\n};\n\n\n// Support for additional styling.\n\n\n/**\n * Returns any additional class name(s) to be applied to the component's\n * root element, or null if no extra class names are needed.\n * @return {Array<string>?} Additional class names to be applied to\n *     the component's root element (null if none).\n */\ngoog.ui.Control.prototype.getExtraClassNames = function() {\n  return this.extraClassNames_;\n};\n\n\n/**\n * Adds the given class name to the list of classes to be applied to the\n * component's root element.\n * @param {string} className Additional class name to be applied to the\n *     component's root element.\n */\ngoog.ui.Control.prototype.addClassName = function(className) {\n  if (className) {\n    if (this.extraClassNames_) {\n      if (!goog.array.contains(this.extraClassNames_, className)) {\n        this.extraClassNames_.push(className);\n      }\n    } else {\n      this.extraClassNames_ = [className];\n    }\n    this.renderer_.enableExtraClassName(this, className, true);\n  }\n};\n\n\n/**\n * Removes the given class name from the list of classes to be applied to\n * the component's root element.\n * @param {string} className Class name to be removed from the component's root\n *     element.\n */\ngoog.ui.Control.prototype.removeClassName = function(className) {\n  if (className && this.extraClassNames_ &&\n      goog.array.remove(this.extraClassNames_, className)) {\n    if (this.extraClassNames_.length == 0) {\n      this.extraClassNames_ = null;\n    }\n    this.renderer_.enableExtraClassName(this, className, false);\n  }\n};\n\n\n/**\n * Adds or removes the given class name to/from the list of classes to be\n * applied to the component's root element.\n * @param {string} className CSS class name to add or remove.\n * @param {boolean} enable Whether to add or remove the class name.\n */\ngoog.ui.Control.prototype.enableClassName = function(className, enable) {\n  if (enable) {\n    this.addClassName(className);\n  } else {\n    this.removeClassName(className);\n  }\n};\n\n\n// Standard goog.ui.Component implementation.\n\n\n/**\n * Creates the control's DOM.  Overrides {@link goog.ui.Component#createDom} by\n * delegating DOM manipulation to the control's renderer.\n * @override\n */\ngoog.ui.Control.prototype.createDom = function() {\n  var element = this.renderer_.createDom(this);\n  this.setElementInternal(element);\n\n  // Initialize ARIA role.\n  this.renderer_.setAriaRole(element, this.getPreferredAriaRole());\n\n  // Initialize text selection.\n  if (!this.isAllowTextSelection()) {\n    // The renderer is assumed to create selectable elements.  Since making\n    // elements unselectable is expensive, only do it if needed (bug 1037090).\n    this.renderer_.setAllowTextSelection(element, false);\n  }\n\n  // Initialize visibility.\n  if (!this.isVisible()) {\n    // The renderer is assumed to create visible elements. Since hiding\n    // elements can be expensive, only do it if needed (bug 1037105).\n    this.renderer_.setVisible(element, false);\n  }\n};\n\n\n/**\n * Returns the control's preferred ARIA role. This can be used by a control to\n * override the role that would be assigned by the renderer.  This is useful in\n * cases where a different ARIA role is appropriate for a control because of the\n * context in which it's used.  E.g., a {@link goog.ui.MenuButton} added to a\n * {@link goog.ui.Select} should have an ARIA role of LISTBOX and not MENUITEM.\n * @return {?goog.a11y.aria.Role} This control's preferred ARIA role or null if\n *     no preferred ARIA role is set.\n */\ngoog.ui.Control.prototype.getPreferredAriaRole = function() {\n  return this.preferredAriaRole_;\n};\n\n\n/**\n * Sets the control's preferred ARIA role. This can be used to override the role\n * that would be assigned by the renderer.  This is useful in cases where a\n * different ARIA role is appropriate for a control because of the\n * context in which it's used.  E.g., a {@link goog.ui.MenuButton} added to a\n * {@link goog.ui.Select} should have an ARIA role of LISTBOX and not MENUITEM.\n * @param {goog.a11y.aria.Role} role This control's preferred ARIA role.\n */\ngoog.ui.Control.prototype.setPreferredAriaRole = function(role) {\n  this.preferredAriaRole_ = role;\n};\n\n\n/**\n * Gets the control's aria label.\n * @return {?string} This control's aria label.\n */\ngoog.ui.Control.prototype.getAriaLabel = function() {\n  return this.ariaLabel_;\n};\n\n\n/**\n * Sets the control's aria label. This can be used to assign aria label to the\n * element after it is rendered.\n * @param {string} label The string to set as the aria label for this control.\n *     No escaping is done on this value.\n */\ngoog.ui.Control.prototype.setAriaLabel = function(label) {\n  this.ariaLabel_ = label;\n  var element = this.getElement();\n  if (element) {\n    this.renderer_.setAriaLabel(element, label);\n  }\n};\n\n\n/**\n * Returns the DOM element into which child components are to be rendered,\n * or null if the control itself hasn't been rendered yet.  Overrides\n * {@link goog.ui.Component#getContentElement} by delegating to the renderer.\n * @return {Element} Element to contain child elements (null if none).\n * @override\n */\ngoog.ui.Control.prototype.getContentElement = function() {\n  // Delegate to renderer.\n  return this.renderer_.getContentElement(this.getElement());\n};\n\n\n/**\n * Returns true if the given element can be decorated by this component.\n * Overrides {@link goog.ui.Component#canDecorate}.\n * @param {Element} element Element to decorate.\n * @return {boolean} Whether the element can be decorated by this component.\n * @override\n */\ngoog.ui.Control.prototype.canDecorate = function(element) {\n  // Controls support pluggable renderers; delegate to the renderer.\n  return this.renderer_.canDecorate(element);\n};\n\n\n/**\n * Decorates the given element with this component. Overrides {@link\n * goog.ui.Component#decorateInternal} by delegating DOM manipulation\n * to the control's renderer.\n * @param {Element} element Element to decorate.\n * @protected\n * @override\n */\ngoog.ui.Control.prototype.decorateInternal = function(element) {\n  element = this.renderer_.decorate(this, element);\n  this.setElementInternal(element);\n\n  // Initialize ARIA role.\n  this.renderer_.setAriaRole(element, this.getPreferredAriaRole());\n\n  // Initialize text selection.\n  if (!this.isAllowTextSelection()) {\n    // Decorated elements are assumed to be selectable.  Since making elements\n    // unselectable is expensive, only do it if needed (bug 1037090).\n    this.renderer_.setAllowTextSelection(element, false);\n  }\n\n  // Initialize visibility based on the decorated element's styling.\n  this.visible_ = element.style.display != 'none';\n};\n\n\n/**\n * Configures the component after its DOM has been rendered, and sets up event\n * handling.  Overrides {@link goog.ui.Component#enterDocument}.\n * @override\n */\ngoog.ui.Control.prototype.enterDocument = function() {\n  goog.ui.Control.superClass_.enterDocument.call(this);\n\n  // Call the renderer's setAriaStates method to set element's aria attributes.\n  this.renderer_.setAriaStates(this, this.getElementStrict());\n\n  // Call the renderer's initializeDom method to configure properties of the\n  // control's DOM that can only be done once it's in the document.\n  this.renderer_.initializeDom(this);\n\n  // Initialize event handling if at least one state other than DISABLED is\n  // supported.\n  if (this.supportedStates_ & ~goog.ui.Component.State.DISABLED) {\n    // Initialize mouse event handling if the control is configured to handle\n    // its own mouse events.  (Controls hosted in containers don't need to\n    // handle their own mouse events.)\n    if (this.isHandleMouseEvents()) {\n      this.enableMouseEventHandling_(true);\n    }\n\n    // Initialize keyboard event handling if the control is focusable and has\n    // a key event target.  (Controls hosted in containers typically aren't\n    // focusable, allowing their container to handle keyboard events for them.)\n    if (this.isSupportedState(goog.ui.Component.State.FOCUSED)) {\n      var keyTarget = this.getKeyEventTarget();\n      if (keyTarget) {\n        var keyHandler = this.getKeyHandler();\n        keyHandler.attach(keyTarget);\n        this.getHandler()\n            .listen(\n                keyHandler, goog.events.KeyHandler.EventType.KEY,\n                this.handleKeyEvent)\n            .listen(keyTarget, goog.events.EventType.FOCUS, this.handleFocus)\n            .listen(keyTarget, goog.events.EventType.BLUR, this.handleBlur);\n      }\n    }\n  }\n};\n\n\n/**\n * Enables or disables mouse event handling on the control.\n * @param {boolean} enable Whether to enable mouse event handling.\n * @private\n */\ngoog.ui.Control.prototype.enableMouseEventHandling_ = function(enable) {\n  var MouseEventType = goog.ui.ComponentUtil.getMouseEventType(this);\n\n  var handler = this.getHandler();\n  var element = this.getElement();\n  if (enable) {\n    handler.listen(element, MouseEventType.MOUSEDOWN, this.handleMouseDown)\n        .listen(\n            element, [MouseEventType.MOUSEUP, MouseEventType.MOUSECANCEL],\n            this.handleMouseUp)\n        .listen(element, goog.events.EventType.MOUSEOVER, this.handleMouseOver)\n        .listen(element, goog.events.EventType.MOUSEOUT, this.handleMouseOut);\n    if (this.pointerEventsEnabled()) {\n      // Prevent pointer events from capturing the target element so they behave\n      // more like mouse events.\n      handler.listen(\n          element, goog.events.EventType.GOTPOINTERCAPTURE,\n          this.preventPointerCapture_);\n    }\n    if (this.handleContextMenu != goog.nullFunction) {\n      handler.listen(\n          element, goog.events.EventType.CONTEXTMENU, this.handleContextMenu);\n    }\n    if (goog.userAgent.IE) {\n      // Versions of IE before 9 send only one click event followed by a\n      // dblclick, so we must explicitly listen for these. In later versions,\n      // two click events are fired  and so a dblclick listener is unnecessary.\n      if (!goog.userAgent.isVersionOrHigher(9)) {\n        handler.listen(\n            element, goog.events.EventType.DBLCLICK, this.handleDblClick);\n      }\n      if (!this.ieMouseEventSequenceSimulator_) {\n        this.ieMouseEventSequenceSimulator_ =\n            new goog.ui.Control.IeMouseEventSequenceSimulator_(this);\n        this.registerDisposable(this.ieMouseEventSequenceSimulator_);\n      }\n    }\n  } else {\n    handler.unlisten(element, MouseEventType.MOUSEDOWN, this.handleMouseDown)\n        .unlisten(\n            element, [MouseEventType.MOUSEUP, MouseEventType.MOUSECANCEL],\n            this.handleMouseUp)\n        .unlisten(\n            element, goog.events.EventType.MOUSEOVER, this.handleMouseOver)\n        .unlisten(element, goog.events.EventType.MOUSEOUT, this.handleMouseOut);\n    if (this.pointerEventsEnabled()) {\n      handler.unlisten(\n          element, goog.events.EventType.GOTPOINTERCAPTURE,\n          this.preventPointerCapture_);\n    }\n    if (this.handleContextMenu != goog.nullFunction) {\n      handler.unlisten(\n          element, goog.events.EventType.CONTEXTMENU, this.handleContextMenu);\n    }\n    if (goog.userAgent.IE) {\n      if (!goog.userAgent.isVersionOrHigher(9)) {\n        handler.unlisten(\n            element, goog.events.EventType.DBLCLICK, this.handleDblClick);\n      }\n      goog.dispose(this.ieMouseEventSequenceSimulator_);\n      this.ieMouseEventSequenceSimulator_ = null;\n    }\n  }\n};\n\n\n/**\n * Cleans up the component before its DOM is removed from the document, and\n * removes event handlers.  Overrides {@link goog.ui.Component#exitDocument}\n * by making sure that components that are removed from the document aren't\n * focusable (i.e. have no tab index).\n * @override\n */\ngoog.ui.Control.prototype.exitDocument = function() {\n  goog.ui.Control.superClass_.exitDocument.call(this);\n  if (this.keyHandler_) {\n    this.keyHandler_.detach();\n  }\n  if (this.isVisible() && this.isEnabled()) {\n    this.renderer_.setFocusable(this, false);\n  }\n};\n\n\n/** @override */\ngoog.ui.Control.prototype.disposeInternal = function() {\n  goog.ui.Control.superClass_.disposeInternal.call(this);\n  if (this.keyHandler_) {\n    this.keyHandler_.dispose();\n    delete this.keyHandler_;\n  }\n  delete this.renderer_;\n  this.content_ = null;\n  this.extraClassNames_ = null;\n  this.ieMouseEventSequenceSimulator_ = null;\n};\n\n\n// Component content management.\n\n\n/**\n * Returns the text caption or DOM structure displayed in the component.\n * @return {goog.ui.ControlContent} Text caption or DOM structure\n *     comprising the component's contents.\n */\ngoog.ui.Control.prototype.getContent = function() {\n  return this.content_;\n};\n\n\n/**\n * Sets the component's content to the given text caption, element, or array of\n * nodes.  (If the argument is an array of nodes, it must be an actual array,\n * not an array-like object.)\n * @param {goog.ui.ControlContent} content Text caption or DOM\n *     structure to set as the component's contents.\n */\ngoog.ui.Control.prototype.setContent = function(content) {\n  // Controls support pluggable renderers; delegate to the renderer.\n  this.renderer_.setContent(this.getElement(), content);\n\n  // setContentInternal needs to be after the renderer, since the implementation\n  // may depend on the content being in the DOM.\n  this.setContentInternal(content);\n};\n\n\n/**\n * Sets the component's content to the given text caption, element, or array\n * of nodes.  Unlike {@link #setContent}, doesn't modify the component's DOM.\n * Called by renderers during element decoration.\n *\n * This should only be used by subclasses and its associated renderers.\n *\n * @param {goog.ui.ControlContent} content Text caption or DOM structure\n *     to set as the component's contents.\n */\ngoog.ui.Control.prototype.setContentInternal = function(content) {\n  this.content_ = content;\n};\n\n\n/**\n * @return {string} Text caption of the control or empty string if none.\n */\ngoog.ui.Control.prototype.getCaption = function() {\n  var content = this.getContent();\n  if (!content) {\n    return '';\n  }\n  var caption = (typeof content === 'string') ?\n      content :\n      goog.isArray(content) ?\n      goog.array.map(content, goog.dom.getRawTextContent).join('') :\n      goog.dom.getTextContent(/** @type {!Node} */ (content));\n  return goog.string.collapseBreakingSpaces(caption);\n};\n\n\n/**\n * Sets the text caption of the component.\n * @param {string} caption Text caption of the component.\n */\ngoog.ui.Control.prototype.setCaption = function(caption) {\n  this.setContent(caption);\n};\n\n\n// Component state management.\n\n\n/** @override */\ngoog.ui.Control.prototype.setRightToLeft = function(rightToLeft) {\n  // The superclass implementation ensures the control isn't in the document.\n  goog.ui.Control.superClass_.setRightToLeft.call(this, rightToLeft);\n\n  var element = this.getElement();\n  if (element) {\n    this.renderer_.setRightToLeft(element, rightToLeft);\n  }\n};\n\n\n/**\n * Returns true if the control allows text selection within its DOM, false\n * otherwise.  Controls that disallow text selection have the appropriate\n * unselectable styling applied to their elements.  Note that controls hosted\n * in containers will report that they allow text selection even if their\n * container disallows text selection.\n * @return {boolean} Whether the control allows text selection.\n */\ngoog.ui.Control.prototype.isAllowTextSelection = function() {\n  return this.allowTextSelection_;\n};\n\n\n/**\n * Allows or disallows text selection within the control's DOM.\n * @param {boolean} allow Whether the control should allow text selection.\n */\ngoog.ui.Control.prototype.setAllowTextSelection = function(allow) {\n  this.allowTextSelection_ = allow;\n\n  var element = this.getElement();\n  if (element) {\n    this.renderer_.setAllowTextSelection(element, allow);\n  }\n};\n\n\n/**\n * Returns true if the component's visibility is set to visible, false if\n * it is set to hidden.  A component that is set to hidden is guaranteed\n * to be hidden from the user, but the reverse isn't necessarily true.\n * A component may be set to visible but can otherwise be obscured by another\n * element, rendered off-screen, or hidden using direct CSS manipulation.\n * @return {boolean} Whether the component is visible.\n */\ngoog.ui.Control.prototype.isVisible = function() {\n  return this.visible_;\n};\n\n\n/**\n * Shows or hides the component.  Does nothing if the component already has\n * the requested visibility.  Otherwise, dispatches a SHOW or HIDE event as\n * appropriate, giving listeners a chance to prevent the visibility change.\n * When showing a component that is both enabled and focusable, ensures that\n * its key target has a tab index.  When hiding a component that is enabled\n * and focusable, blurs its key target and removes its tab index.\n * @param {boolean} visible Whether to show or hide the component.\n * @param {boolean=} opt_force If true, doesn't check whether the component\n *     already has the requested visibility, and doesn't dispatch any events.\n * @return {boolean} Whether the visibility was changed.\n */\ngoog.ui.Control.prototype.setVisible = function(visible, opt_force) {\n  if (opt_force || (this.visible_ != visible &&\n                    this.dispatchEvent(\n                        visible ? goog.ui.Component.EventType.SHOW :\n                                  goog.ui.Component.EventType.HIDE))) {\n    var element = this.getElement();\n    if (element) {\n      this.renderer_.setVisible(element, visible);\n    }\n    if (this.isEnabled()) {\n      this.renderer_.setFocusable(this, visible);\n    }\n    this.visible_ = visible;\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Returns true if the component is enabled, false otherwise.\n * @return {boolean} Whether the component is enabled.\n */\ngoog.ui.Control.prototype.isEnabled = function() {\n  return !this.hasState(goog.ui.Component.State.DISABLED);\n};\n\n\n/**\n * Returns true if the control has a parent that is itself disabled, false\n * otherwise.\n * @return {boolean} Whether the component is hosted in a disabled container.\n * @private\n */\ngoog.ui.Control.prototype.isParentDisabled_ = function() {\n  var parent = this.getParent();\n  return !!parent && typeof parent.isEnabled == 'function' &&\n      !parent.isEnabled();\n};\n\n\n/**\n * Enables or disables the component.  Does nothing if this state transition\n * is disallowed.  If the component is both visible and focusable, updates its\n * focused state and tab index as needed.  If the component is being disabled,\n * ensures that it is also deactivated and un-highlighted first.  Note that the\n * component's enabled/disabled state is \"locked\" as long as it is hosted in a\n * {@link goog.ui.Container} that is itself disabled; this is to prevent clients\n * from accidentally re-enabling a control that is in a disabled container.\n * @param {boolean} enable Whether to enable or disable the component.\n * @see #isTransitionAllowed\n */\ngoog.ui.Control.prototype.setEnabled = function(enable) {\n  if (!this.isParentDisabled_() &&\n      this.isTransitionAllowed(goog.ui.Component.State.DISABLED, !enable)) {\n    if (!enable) {\n      this.setActive(false);\n      this.setHighlighted(false);\n    }\n    if (this.isVisible()) {\n      this.renderer_.setFocusable(this, enable);\n    }\n    this.setState(goog.ui.Component.State.DISABLED, !enable, true);\n  }\n};\n\n\n/**\n * Returns true if the component is currently highlighted, false otherwise.\n * @return {boolean} Whether the component is highlighted.\n */\ngoog.ui.Control.prototype.isHighlighted = function() {\n  return this.hasState(goog.ui.Component.State.HOVER);\n};\n\n\n/**\n * Highlights or unhighlights the component.  Does nothing if this state\n * transition is disallowed.\n * @param {boolean} highlight Whether to highlight or unhighlight the component.\n * @see #isTransitionAllowed\n */\ngoog.ui.Control.prototype.setHighlighted = function(highlight) {\n  if (this.isTransitionAllowed(goog.ui.Component.State.HOVER, highlight)) {\n    this.setState(goog.ui.Component.State.HOVER, highlight);\n  }\n};\n\n\n/**\n * Returns true if the component is active (pressed), false otherwise.\n * @return {boolean} Whether the component is active.\n */\ngoog.ui.Control.prototype.isActive = function() {\n  return this.hasState(goog.ui.Component.State.ACTIVE);\n};\n\n\n/**\n * Activates or deactivates the component.  Does nothing if this state\n * transition is disallowed.\n * @param {boolean} active Whether to activate or deactivate the component.\n * @see #isTransitionAllowed\n */\ngoog.ui.Control.prototype.setActive = function(active) {\n  if (this.isTransitionAllowed(goog.ui.Component.State.ACTIVE, active)) {\n    this.setState(goog.ui.Component.State.ACTIVE, active);\n  }\n};\n\n\n/**\n * Returns true if the component is selected, false otherwise.\n * @return {boolean} Whether the component is selected.\n */\ngoog.ui.Control.prototype.isSelected = function() {\n  return this.hasState(goog.ui.Component.State.SELECTED);\n};\n\n\n/**\n * Selects or unselects the component.  Does nothing if this state transition\n * is disallowed.\n * @param {boolean} select Whether to select or unselect the component.\n * @see #isTransitionAllowed\n */\ngoog.ui.Control.prototype.setSelected = function(select) {\n  if (this.isTransitionAllowed(goog.ui.Component.State.SELECTED, select)) {\n    this.setState(goog.ui.Component.State.SELECTED, select);\n  }\n};\n\n\n/**\n * Returns true if the component is checked, false otherwise.\n * @return {boolean} Whether the component is checked.\n */\ngoog.ui.Control.prototype.isChecked = function() {\n  return this.hasState(goog.ui.Component.State.CHECKED);\n};\n\n\n/**\n * Checks or unchecks the component.  Does nothing if this state transition\n * is disallowed.\n * @param {boolean} check Whether to check or uncheck the component.\n * @see #isTransitionAllowed\n */\ngoog.ui.Control.prototype.setChecked = function(check) {\n  if (this.isTransitionAllowed(goog.ui.Component.State.CHECKED, check)) {\n    this.setState(goog.ui.Component.State.CHECKED, check);\n  }\n};\n\n\n/**\n * Returns true if the component is styled to indicate that it has keyboard\n * focus, false otherwise.  Note that `isFocused()` returning true\n * doesn't guarantee that the component's key event target has keyboard focus,\n * only that it is styled as such.\n * @return {boolean} Whether the component is styled to indicate as having\n *     keyboard focus.\n */\ngoog.ui.Control.prototype.isFocused = function() {\n  return this.hasState(goog.ui.Component.State.FOCUSED);\n};\n\n\n/**\n * Applies or removes styling indicating that the component has keyboard focus.\n * Note that unlike the other \"set\" methods, this method is called as a result\n * of the component's element having received or lost keyboard focus, not the\n * other way around, so calling `setFocused(true)` doesn't guarantee that\n * the component's key event target has keyboard focus, only that it is styled\n * as such.\n * @param {boolean} focused Whether to apply or remove styling to indicate that\n *     the component's element has keyboard focus.\n */\ngoog.ui.Control.prototype.setFocused = function(focused) {\n  if (this.isTransitionAllowed(goog.ui.Component.State.FOCUSED, focused)) {\n    this.setState(goog.ui.Component.State.FOCUSED, focused);\n  }\n};\n\n\n/**\n * Returns true if the component is open (expanded), false otherwise.\n * @return {boolean} Whether the component is open.\n */\ngoog.ui.Control.prototype.isOpen = function() {\n  return this.hasState(goog.ui.Component.State.OPENED);\n};\n\n\n/**\n * Opens (expands) or closes (collapses) the component.  Does nothing if this\n * state transition is disallowed.\n * @param {boolean} open Whether to open or close the component.\n * @see #isTransitionAllowed\n */\ngoog.ui.Control.prototype.setOpen = function(open) {\n  if (this.isTransitionAllowed(goog.ui.Component.State.OPENED, open)) {\n    this.setState(goog.ui.Component.State.OPENED, open);\n  }\n};\n\n\n/**\n * Returns the component's state as a bit mask of {@link\n * goog.ui.Component.State}s.\n * @return {number} Bit mask representing component state.\n */\ngoog.ui.Control.prototype.getState = function() {\n  return this.state_;\n};\n\n\n/**\n * Returns true if the component is in the specified state, false otherwise.\n * @param {goog.ui.Component.State} state State to check.\n * @return {boolean} Whether the component is in the given state.\n */\ngoog.ui.Control.prototype.hasState = function(state) {\n  return !!(this.state_ & state);\n};\n\n\n/**\n * Sets or clears the given state on the component, and updates its styling\n * accordingly.  Does nothing if the component is already in the correct state\n * or if it doesn't support the specified state.  Doesn't dispatch any state\n * transition events; use advisedly.\n * @param {goog.ui.Component.State} state State to set or clear.\n * @param {boolean} enable Whether to set or clear the state (if supported).\n * @param {boolean=} opt_calledFrom Prevents looping with setEnabled.\n */\ngoog.ui.Control.prototype.setState = function(state, enable, opt_calledFrom) {\n  if (!opt_calledFrom && state == goog.ui.Component.State.DISABLED) {\n    this.setEnabled(!enable);\n    return;\n  }\n  if (this.isSupportedState(state) && enable != this.hasState(state)) {\n    // Delegate actual styling to the renderer, since it is DOM-specific.\n    this.renderer_.setState(this, state, enable);\n    this.state_ = enable ? this.state_ | state : this.state_ & ~state;\n  }\n};\n\n\n/**\n * Sets the component's state to the state represented by a bit mask of\n * {@link goog.ui.Component.State}s.  Unlike {@link #setState}, doesn't\n * update the component's styling, and doesn't reject unsupported states.\n * Called by renderers during element decoration.  Considered protected;\n * should only be used within this package and by subclasses.\n *\n * This should only be used by subclasses and its associated renderers.\n *\n * @param {number} state Bit mask representing component state.\n */\ngoog.ui.Control.prototype.setStateInternal = function(state) {\n  this.state_ = state;\n};\n\n\n/**\n * Returns true if the component supports the specified state, false otherwise.\n * @param {goog.ui.Component.State} state State to check.\n * @return {boolean} Whether the component supports the given state.\n */\ngoog.ui.Control.prototype.isSupportedState = function(state) {\n  return !!(this.supportedStates_ & state);\n};\n\n\n/**\n * Enables or disables support for the given state. Disabling support\n * for a state while the component is in that state is an error.\n * @param {goog.ui.Component.State} state State to support or de-support.\n * @param {boolean} support Whether the component should support the state.\n * @throws {Error} If disabling support for a state the control is currently in.\n */\ngoog.ui.Control.prototype.setSupportedState = function(state, support) {\n  if (this.isInDocument() && this.hasState(state) && !support) {\n    // Since we hook up event handlers in enterDocument(), this is an error.\n    throw new Error(goog.ui.Component.Error.ALREADY_RENDERED);\n  }\n\n  if (!support && this.hasState(state)) {\n    // We are removing support for a state that the component is currently in.\n    this.setState(state, false);\n  }\n\n  this.supportedStates_ =\n      support ? this.supportedStates_ | state : this.supportedStates_ & ~state;\n};\n\n\n/**\n * Returns true if the component provides default event handling for the state,\n * false otherwise.\n * @param {goog.ui.Component.State} state State to check.\n * @return {boolean} Whether the component provides default event handling for\n *     the state.\n */\ngoog.ui.Control.prototype.isAutoState = function(state) {\n  return !!(this.autoStates_ & state) && this.isSupportedState(state);\n};\n\n\n/**\n * Enables or disables automatic event handling for the given state(s).\n * @param {number} states Bit mask of {@link goog.ui.Component.State}s for which\n *     default event handling is to be enabled or disabled.\n * @param {boolean} enable Whether the component should provide default event\n *     handling for the state(s).\n */\ngoog.ui.Control.prototype.setAutoStates = function(states, enable) {\n  this.autoStates_ =\n      enable ? this.autoStates_ | states : this.autoStates_ & ~states;\n};\n\n\n/**\n * Returns true if the component is set to dispatch transition events for the\n * given state, false otherwise.\n * @param {goog.ui.Component.State} state State to check.\n * @return {boolean} Whether the component dispatches transition events for\n *     the state.\n */\ngoog.ui.Control.prototype.isDispatchTransitionEvents = function(state) {\n  return !!(this.statesWithTransitionEvents_ & state) &&\n      this.isSupportedState(state);\n};\n\n\n/**\n * Enables or disables transition events for the given state(s).  Controls\n * handle state transitions internally by default, and only dispatch state\n * transition events if explicitly requested to do so by calling this method.\n * @param {number} states Bit mask of {@link goog.ui.Component.State}s for\n *     which transition events should be enabled or disabled.\n * @param {boolean} enable Whether transition events should be enabled.\n */\ngoog.ui.Control.prototype.setDispatchTransitionEvents = function(\n    states, enable) {\n  this.statesWithTransitionEvents_ = enable ?\n      this.statesWithTransitionEvents_ | states :\n      this.statesWithTransitionEvents_ & ~states;\n};\n\n\n/**\n * Returns true if the transition into or out of the given state is allowed to\n * proceed, false otherwise.  A state transition is allowed under the following\n * conditions:\n * <ul>\n *   <li>the component supports the state,\n *   <li>the component isn't already in the target state,\n *   <li>either the component is configured not to dispatch events for this\n *       state transition, or a transition event was dispatched and wasn't\n *       canceled by any event listener, and\n *   <li>the component hasn't been disposed of\n * </ul>\n * Considered protected; should only be used within this package and by\n * subclasses.\n * @param {goog.ui.Component.State} state State to/from which the control is\n *     transitioning.\n * @param {boolean} enable Whether the control is entering or leaving the state.\n * @return {boolean} Whether the state transition is allowed to proceed.\n * @protected\n */\ngoog.ui.Control.prototype.isTransitionAllowed = function(state, enable) {\n  return this.isSupportedState(state) && this.hasState(state) != enable &&\n      (!(this.statesWithTransitionEvents_ & state) ||\n       this.dispatchEvent(\n           goog.ui.Component.getStateTransitionEvent(state, enable))) &&\n      !this.isDisposed();\n};\n\n\n// Default event handlers, to be overridden in subclasses.\n\n\n/**\n * Handles mouseover events.  Dispatches an ENTER event; if the event isn't\n * canceled, the component is enabled, and it supports auto-highlighting,\n * highlights the component.  Considered protected; should only be used\n * within this package and by subclasses.\n * @param {goog.events.BrowserEvent} e Mouse event to handle.\n */\ngoog.ui.Control.prototype.handleMouseOver = function(e) {\n  // Ignore mouse moves between descendants.\n  if (!goog.ui.Control.isMouseEventWithinElement_(e, this.getElement()) &&\n      this.dispatchEvent(goog.ui.Component.EventType.ENTER) &&\n      this.isEnabled() && this.isAutoState(goog.ui.Component.State.HOVER)) {\n    this.setHighlighted(true);\n  }\n};\n\n\n/**\n * Handles mouseout events.  Dispatches a LEAVE event; if the event isn't\n * canceled, and the component supports auto-highlighting, deactivates and\n * un-highlights the component.  Considered protected; should only be used\n * within this package and by subclasses.\n * @param {goog.events.BrowserEvent} e Mouse event to handle.\n */\ngoog.ui.Control.prototype.handleMouseOut = function(e) {\n  if (!goog.ui.Control.isMouseEventWithinElement_(e, this.getElement()) &&\n      this.dispatchEvent(goog.ui.Component.EventType.LEAVE)) {\n    if (this.isAutoState(goog.ui.Component.State.ACTIVE)) {\n      // Deactivate on mouseout; otherwise we lose track of the mouse button.\n      this.setActive(false);\n    }\n    if (this.isAutoState(goog.ui.Component.State.HOVER)) {\n      this.setHighlighted(false);\n    }\n  }\n};\n\n\n/**\n * @param {!goog.events.BrowserEvent} e Event to handle.\n * @private\n */\ngoog.ui.Control.prototype.preventPointerCapture_ = function(e) {\n  var elem = /** @type {!Element} */ (e.target);\n  if (!!elem.releasePointerCapture) {\n    elem.releasePointerCapture(e.pointerId);\n  }\n};\n\n\n/**\n * Handles contextmenu events.\n * @param {goog.events.BrowserEvent} e Event to handle.\n */\ngoog.ui.Control.prototype.handleContextMenu = goog.nullFunction;\n\n\n/**\n * Checks if a mouse event (mouseover or mouseout) occurred below an element.\n * @param {goog.events.BrowserEvent} e Mouse event (should be mouseover or\n *     mouseout).\n * @param {Element} elem The ancestor element.\n * @return {boolean} Whether the event has a relatedTarget (the element the\n *     mouse is coming from) and it's a descendant of elem.\n * @private\n */\ngoog.ui.Control.isMouseEventWithinElement_ = function(e, elem) {\n  // If relatedTarget is null, it means there was no previous element (e.g.\n  // the mouse moved out of the window).  Assume this means that the mouse\n  // event was not within the element.\n  return !!e.relatedTarget && goog.dom.contains(elem, e.relatedTarget);\n};\n\n\n/**\n * Handles mousedown events.  If the component is enabled, highlights and\n * activates it.  If the component isn't configured for keyboard access,\n * prevents it from receiving keyboard focus.  Considered protected; should\n * only be used within this package and by subclasses.\n * @param {goog.events.Event} e Mouse event to handle.\n */\ngoog.ui.Control.prototype.handleMouseDown = function(e) {\n  if (this.isEnabled()) {\n    // Highlight enabled control on mousedown, regardless of the mouse button.\n    if (this.isAutoState(goog.ui.Component.State.HOVER)) {\n      this.setHighlighted(true);\n    }\n\n    // For the left button only, activate the control, and focus its key event\n    // target (if supported).\n    if (e.isMouseActionButton()) {\n      if (this.isAutoState(goog.ui.Component.State.ACTIVE)) {\n        this.setActive(true);\n      }\n      if (this.renderer_ && this.renderer_.isFocusable(this)) {\n        this.getKeyEventTarget().focus();\n      }\n    }\n  }\n\n  // Cancel the default action unless the control allows text selection.\n  if (!this.isAllowTextSelection() && e.isMouseActionButton()) {\n    e.preventDefault();\n  }\n};\n\n\n/**\n * Handles mouseup events.  If the component is enabled, highlights it.  If\n * the component has previously been activated, performs its associated action\n * by calling {@link performActionInternal}, then deactivates it.  Considered\n * protected; should only be used within this package and by subclasses.\n * @param {goog.events.Event} e Mouse event to handle.\n */\ngoog.ui.Control.prototype.handleMouseUp = function(e) {\n  if (this.isEnabled()) {\n    if (this.isAutoState(goog.ui.Component.State.HOVER)) {\n      this.setHighlighted(true);\n    }\n    if (this.isActive() && this.performActionInternal(e) &&\n        this.isAutoState(goog.ui.Component.State.ACTIVE)) {\n      this.setActive(false);\n    }\n  }\n};\n\n\n/**\n * Handles dblclick events.  Should only be registered if the user agent is\n * IE.  If the component is enabled, performs its associated action by calling\n * {@link performActionInternal}.  This is used to allow more performant\n * buttons in IE.  In IE, no mousedown event is fired when that mousedown will\n * trigger a dblclick event.  Because of this, a user clicking quickly will\n * only cause ACTION events to fire on every other click.  This is a workaround\n * to generate ACTION events for every click.  Unfortunately, this workaround\n * won't ever trigger the ACTIVE state.  This is roughly the same behaviour as\n * if this were a 'button' element with a listener on mouseup.  Considered\n * protected; should only be used within this package and by subclasses.\n * @param {goog.events.Event} e Mouse event to handle.\n */\ngoog.ui.Control.prototype.handleDblClick = function(e) {\n  if (this.isEnabled()) {\n    this.performActionInternal(e);\n  }\n};\n\n\n/**\n * Performs the appropriate action when the control is activated by the user.\n * The default implementation first updates the checked and selected state of\n * controls that support them, then dispatches an ACTION event.  Considered\n * protected; should only be used within this package and by subclasses.\n * @param {goog.events.Event} e Event that triggered the action.\n * @return {boolean} Whether the action is allowed to proceed.\n * @protected\n */\ngoog.ui.Control.prototype.performActionInternal = function(e) {\n  if (this.isAutoState(goog.ui.Component.State.CHECKED)) {\n    this.setChecked(!this.isChecked());\n  }\n  if (this.isAutoState(goog.ui.Component.State.SELECTED)) {\n    this.setSelected(true);\n  }\n  if (this.isAutoState(goog.ui.Component.State.OPENED)) {\n    this.setOpen(!this.isOpen());\n  }\n\n  var actionEvent =\n      new goog.events.Event(goog.ui.Component.EventType.ACTION, this);\n  if (e) {\n    actionEvent.altKey = e.altKey;\n    actionEvent.ctrlKey = e.ctrlKey;\n    actionEvent.metaKey = e.metaKey;\n    actionEvent.shiftKey = e.shiftKey;\n    actionEvent.platformModifierKey = e.platformModifierKey;\n  }\n  return this.dispatchEvent(actionEvent);\n};\n\n\n/**\n * Handles focus events on the component's key event target element.  If the\n * component is focusable, updates its state and styling to indicate that it\n * now has keyboard focus.  Considered protected; should only be used within\n * this package and by subclasses.  <b>Warning:</b> IE dispatches focus and\n * blur events asynchronously!\n * @param {goog.events.Event} e Focus event to handle.\n */\ngoog.ui.Control.prototype.handleFocus = function(e) {\n  if (this.isAutoState(goog.ui.Component.State.FOCUSED)) {\n    this.setFocused(true);\n  }\n};\n\n\n/**\n * Handles blur events on the component's key event target element.  Always\n * deactivates the component.  In addition, if the component is focusable,\n * updates its state and styling to indicate that it no longer has keyboard\n * focus.  Considered protected; should only be used within this package and\n * by subclasses.  <b>Warning:</b> IE dispatches focus and blur events\n * asynchronously!\n * @param {goog.events.Event} e Blur event to handle.\n */\ngoog.ui.Control.prototype.handleBlur = function(e) {\n  if (this.isAutoState(goog.ui.Component.State.ACTIVE)) {\n    this.setActive(false);\n  }\n  if (this.isAutoState(goog.ui.Component.State.FOCUSED)) {\n    this.setFocused(false);\n  }\n};\n\n\n/**\n * Attempts to handle a keyboard event, if the component is enabled and visible,\n * by calling {@link handleKeyEventInternal}.  Considered protected; should only\n * be used within this package and by subclasses.\n * @param {goog.events.KeyEvent} e Key event to handle.\n * @return {boolean} Whether the key event was handled.\n */\ngoog.ui.Control.prototype.handleKeyEvent = function(e) {\n  if (this.isVisible() && this.isEnabled() && this.handleKeyEventInternal(e)) {\n    e.preventDefault();\n    e.stopPropagation();\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Attempts to handle a keyboard event; returns true if the event was handled,\n * false otherwise.  Considered protected; should only be used within this\n * package and by subclasses.\n * @param {goog.events.KeyEvent} e Key event to handle.\n * @return {boolean} Whether the key event was handled.\n * @protected\n */\ngoog.ui.Control.prototype.handleKeyEventInternal = function(e) {\n  return e.keyCode == goog.events.KeyCodes.ENTER &&\n      this.performActionInternal(e);\n};\n\n\n// Register the default renderer for goog.ui.Controls.\ngoog.ui.registry.setDefaultRenderer(goog.ui.Control, goog.ui.ControlRenderer);\n\n\n// Register a decorator factory function for goog.ui.Controls.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.ControlRenderer.CSS_CLASS,\n    function() { return new goog.ui.Control(null); });\n\n\n\n/**\n * A singleton that helps goog.ui.Control instances play well with screen\n * readers.  It necessitated by shortcomings in IE, and need not be\n * instantiated in any other browser.\n *\n * In most cases, a click on a goog.ui.Control results in a sequence of events:\n * MOUSEDOWN, MOUSEUP and CLICK.  UI controls rely on this sequence since most\n * behavior is trigged by MOUSEDOWN and MOUSEUP.  But when IE is used with some\n * traditional screen readers (JAWS, NVDA and perhaps others), IE only sends\n * the CLICK event, resulting in the control being unresponsive.  This class\n * monitors the sequence of these events, and if it detects a CLICK event not\n * not preceded by a MOUSEUP event, directly calls the control's event handlers\n * for MOUSEDOWN, then MOUSEUP.  While the resulting sequence is different from\n * the norm (the CLICK comes first instead of last), testing thus far shows\n * the resulting behavior to be correct.\n *\n * See http://goo.gl/qvQR4C for more details.\n *\n * @param {!goog.ui.Control} control\n * @constructor\n * @extends {goog.Disposable}\n * @private\n */\ngoog.ui.Control.IeMouseEventSequenceSimulator_ = function(control) {\n  goog.ui.Control.IeMouseEventSequenceSimulator_.base(this, 'constructor');\n\n  /** @private {goog.ui.Control}*/\n  this.control_ = control;\n\n  /** @private {boolean} */\n  this.clickExpected_ = false;\n\n  /** @private @const {!goog.events.EventHandler<\n   *                       !goog.ui.Control.IeMouseEventSequenceSimulator_>}\n   */\n  this.handler_ = new goog.events.EventHandler(this);\n  this.registerDisposable(this.handler_);\n\n  var element = this.control_.getElementStrict();\n  var MouseEventType = goog.ui.ComponentUtil.getMouseEventType(control);\n\n  this.handler_.listen(element, MouseEventType.MOUSEDOWN, this.handleMouseDown_)\n      .listen(element, MouseEventType.MOUSEUP, this.handleMouseUp_)\n      .listen(element, goog.events.EventType.CLICK, this.handleClick_);\n};\ngoog.inherits(goog.ui.Control.IeMouseEventSequenceSimulator_, goog.Disposable);\n\n\n/**\n * Whether this browser supports synthetic MouseEvents.\n *\n * See https://msdn.microsoft.com/library/dn905219(v=vs.85).aspx for details.\n *\n * @private {boolean}\n * @const\n */\ngoog.ui.Control.IeMouseEventSequenceSimulator_.SYNTHETIC_EVENTS_ =\n    !goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9);\n\n\n/** @private */\ngoog.ui.Control.IeMouseEventSequenceSimulator_.prototype.handleMouseDown_ =\n    function() {\n  this.clickExpected_ = false;\n};\n\n\n/** @private */\ngoog.ui.Control.IeMouseEventSequenceSimulator_.prototype.handleMouseUp_ =\n    function() {\n  this.clickExpected_ = true;\n};\n\n\n/**\n * @param {!MouseEvent} e\n * @param {goog.events.EventType} typeArg\n * @return {!MouseEvent}\n * @private\n */\ngoog.ui.Control.IeMouseEventSequenceSimulator_.makeLeftMouseEvent_ = function(\n    e, typeArg) {\n  'use strict';\n\n  if (!goog.ui.Control.IeMouseEventSequenceSimulator_.SYNTHETIC_EVENTS_) {\n    // IE < 9 does not support synthetic mouse events. Therefore, reuse the\n    // existing MouseEvent by overwriting the read only button and type\n    // properties. As IE < 9 does not support ES5 strict mode this will not\n    // generate an exception even when the script specifies \"use strict\".\n    e.button = goog.events.BrowserEvent.MouseButton.LEFT;\n    e.type = typeArg;\n    return e;\n  }\n\n  var event = /** @type {!MouseEvent} */ (document.createEvent('MouseEvents'));\n  event.initMouseEvent(\n      typeArg, e.bubbles, e.cancelable,\n      e.view || null,  // IE9 errors if view is undefined\n      e.detail, e.screenX, e.screenY, e.clientX, e.clientY, e.ctrlKey, e.altKey,\n      e.shiftKey, e.metaKey, goog.events.BrowserEvent.MouseButton.LEFT,\n      e.relatedTarget || null);  // IE9 errors if relatedTarget is undefined\n  return event;\n};\n\n\n/**\n * @param {!goog.events.Event} e\n * @private\n */\ngoog.ui.Control.IeMouseEventSequenceSimulator_.prototype.handleClick_ =\n    function(e) {\n  if (this.clickExpected_) {\n    // This is the end of a normal click sequence: mouse-down, mouse-up, click.\n    // Assume appropriate actions have already been performed.\n    this.clickExpected_ = false;\n    return;\n  }\n\n  // For click events not part of a normal sequence, similate the mouse-down and\n  // mouse-up events by creating synthetic events for each and directly invoke\n  // the corresponding event listeners in order.\n\n  var browserEvent = /** @type {goog.events.BrowserEvent} */ (e);\n\n  var event = /** @type {!MouseEvent} */ (browserEvent.getBrowserEvent());\n  var origEventButton = event.button;\n  var origEventType = event.type;\n\n  var down = goog.ui.Control.IeMouseEventSequenceSimulator_.makeLeftMouseEvent_(\n      event, goog.events.EventType.MOUSEDOWN);\n  this.control_.handleMouseDown(\n      new goog.events.BrowserEvent(down, browserEvent.currentTarget));\n\n  var up = goog.ui.Control.IeMouseEventSequenceSimulator_.makeLeftMouseEvent_(\n      event, goog.events.EventType.MOUSEUP);\n  this.control_.handleMouseUp(\n      new goog.events.BrowserEvent(up, browserEvent.currentTarget));\n\n  if (goog.ui.Control.IeMouseEventSequenceSimulator_.SYNTHETIC_EVENTS_) {\n    // This browser supports synthetic events. Avoid resetting the read only\n    // properties (type, button) as they were not overwritten and writing them\n    // results in an exception when running in ES5 strict mode.\n    return;\n  }\n\n  // Restore original values for click handlers that have not yet been invoked.\n  event.button = origEventButton;\n  event.type = origEventType;\n};\n\n\n/** @override */\ngoog.ui.Control.IeMouseEventSequenceSimulator_.prototype.disposeInternal =\n    function() {\n  this.control_ = null;\n  goog.ui.Control.IeMouseEventSequenceSimulator_.base(this, 'disposeInternal');\n};\n","^;",1579837703000,"^<",["^=",["^1>","^1T","^2L","^1P","~$goog.ui.ComponentUtil","^2G","^?","^3F","^[","^1C","~$goog.ui.ControlContent","~$goog.ui.ControlRenderer","^1:","^2Y","^4Y","^3H","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/control.js"],"^O",["^=",["^1W"]],"^W",true,"^X",["^?","^1:","^2O","^1>","^4Y","^2Y","^1T","^1C","^3H","^2G","^2L","^1P","^5@","^5A","^5B","^3F","^["]],["^ ","^3",[1579837703000],"^4","goog.crypt.sha256.js","^5",["^6","goog/crypt/sha256.js"],"^7","goog/crypt/sha256.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview SHA-256 cryptographic hash.\n *\n * Usage:\n *   var sha256 = new goog.crypt.Sha256();\n *   sha256.update(bytes);\n *   var hash = sha256.digest();\n *\n */\n\ngoog.provide('goog.crypt.Sha256');\n\ngoog.require('goog.crypt.Sha2');\n\n\n\n/**\n * SHA-256 cryptographic hash constructor.\n *\n * @constructor\n * @extends {goog.crypt.Sha2}\n * @final\n * @struct\n */\ngoog.crypt.Sha256 = function() {\n  goog.crypt.Sha256.base(\n      this, 'constructor', 8, goog.crypt.Sha256.INIT_HASH_BLOCK_);\n};\ngoog.inherits(goog.crypt.Sha256, goog.crypt.Sha2);\n\n\n/** @private {!Array<number>} */\ngoog.crypt.Sha256.INIT_HASH_BLOCK_ = [\n  0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c,\n  0x1f83d9ab, 0x5be0cd19\n];\n","^;",1579837703000,"^<",["^=",["~$goog.crypt.Sha2","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/sha256.js"],"^O",["^=",["~$goog.crypt.Sha256"]],"^W",true,"^X",["^?","^5C"]],["^ ","^3",[1579837703000],"^4","goog.ui.keyboardeventdata.js","^5",["^6","goog/ui/keyboardeventdata.js"],"^7","goog/ui/keyboardeventdata.js","^8","^9","^:","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.ui.KeyboardEventData');\n\ngoog.require('goog.asserts');\ngoog.require('goog.events.BrowserEvent');\n\n\n\n/**\n * Data object that contains all the necessary information from a keyboard event\n * that is required to process it in `KeyboardShortcutHandler`.\n *\n * Prefer using `goog.ui.KeyboardEventData.Builder` over using this constructor.\n * @param {number} keyCode\n * @param {string} key\n * @param {boolean} shiftKey\n * @param {boolean} altKey\n * @param {boolean} ctrlKey\n * @param {boolean} metaKey\n * @param {!Node} target\n * @param {!EventTarget} rootTarget\n * @param {function(): void} preventDefaultFn\n * @param {function(): void} stopPropagationFn\n * @constructor @struct @final\n * @package\n */\ngoog.ui.KeyboardEventData = function(\n    keyCode, key, shiftKey, altKey, ctrlKey, metaKey, target, rootTarget,\n    preventDefaultFn, stopPropagationFn) {\n  /** @private @const {number} */\n  this.keyCode_ = keyCode;\n\n  /** @private @const {string} */\n  this.key_ = key;\n\n  /** @private @const {boolean} */\n  this.shiftKey_ = shiftKey;\n\n  /** @private @const {boolean} */\n  this.altKey_ = altKey;\n\n  /** @private @const {boolean} */\n  this.ctrlKey_ = ctrlKey;\n\n  /** @private @const {boolean} */\n  this.metaKey_ = metaKey;\n\n  /** @private @const {!Node} */\n  this.target_ = target;\n\n  /**\n   * For events fired from inside `open` Shadow DOM elements, the root event\n   * target (i.e. the first `EventTarget` in the composed path). For all other\n   * events, the original target.\n   * @private @const {!EventTarget}\n   */\n  this.rootTarget_ = rootTarget;\n\n  /** @private @const {function(): void} */\n  this.preventDefaultFn_ = preventDefaultFn;\n\n  /** @private @const {function(): void} */\n  this.stopPropagationFn_ = stopPropagationFn;\n};\n\n\n/** @return {number} The keyCode of the event. */\ngoog.ui.KeyboardEventData.prototype.getKeyCode = function() {\n  return this.keyCode_;\n};\n\n\n/** @return {string} The key of the event, or `''` if not one. */\ngoog.ui.KeyboardEventData.prototype.getKey = function() {\n  return this.key_;\n};\n\n\n/** @return {boolean} If the shift key was pressed. */\ngoog.ui.KeyboardEventData.prototype.getShiftKey = function() {\n  return this.shiftKey_;\n};\n\n\n/** @return {boolean} If the alt key was pressed. */\ngoog.ui.KeyboardEventData.prototype.getAltKey = function() {\n  return this.altKey_;\n};\n\n\n/** @return {boolean} If the ctrl key was pressed. */\ngoog.ui.KeyboardEventData.prototype.getCtrlKey = function() {\n  return this.ctrlKey_;\n};\n\n\n/** @return {boolean} If the meta key was pressed. */\ngoog.ui.KeyboardEventData.prototype.getMetaKey = function() {\n  return this.metaKey_;\n};\n\n\n/** @return {!Node} The target of the event. */\ngoog.ui.KeyboardEventData.prototype.getTarget = function() {\n  return this.target_;\n};\n\n\n/** @return {!EventTarget} The rootTarget of the event. */\ngoog.ui.KeyboardEventData.prototype.getRootTarget = function() {\n  return this.rootTarget_;\n};\n\n\n/** @return {function(): void} Callback to prevent default. */\ngoog.ui.KeyboardEventData.prototype.getPreventDefaultFn = function() {\n  return this.preventDefaultFn_;\n};\n\n\n/** @return {function(): void} Callback to stop propagation. */\ngoog.ui.KeyboardEventData.prototype.getStopPropagationFn = function() {\n  return this.stopPropagationFn_;\n};\n\n\n/**\n * @param {!goog.events.BrowserEvent} event\n * @return {!goog.ui.KeyboardEventData}\n */\ngoog.ui.KeyboardEventData.fromBrowserEvent = function(event) {\n  var e = event.getBrowserEvent();\n  // Check existence to prevent classic FF reference error in strict mode.\n  var hasComposed = e && 'composed' in e;\n  var hasComposedPath = e && 'composedPath' in e;\n  // EventTarget is updated, when browser supports shadow dom and event is\n  // triggered inside `open` shadow root.\n  var path = hasComposed && hasComposedPath && e.composed && e.composedPath();\n  var rootTarget = (path && path.length > 0) ? path[0] : event.target;\n\n  return new goog.ui.KeyboardEventData.Builder()\n      .keyCode(event.keyCode || 0)\n      .key(event.key || '')\n      .shiftKey(!!event.shiftKey)\n      .altKey(!!event.altKey)\n      .ctrlKey(!!event.ctrlKey)\n      .metaKey(!!event.metaKey)\n      .target(event.target)\n      .rootTarget(rootTarget)\n      .preventDefaultFn(() => event.preventDefault())\n      .stopPropagationFn(() => event.stopPropagation())\n      .build();\n};\n\n\n\n/**\n * Builder for `KeyboardEventData`. All fields are required except `key`, which\n * defaults to `''`.\n * @constructor @struct @final\n */\ngoog.ui.KeyboardEventData.Builder = function() {\n  /** @private {?number} */\n  this.keyCode_ = null;\n\n  /** @private {string} */\n  this.key_ = '';\n\n  /** @private {?boolean} */\n  this.shiftKey_ = null;\n\n  /** @private {?boolean} */\n  this.altKey_ = null;\n\n  /** @private {?boolean} */\n  this.ctrlKey_ = null;\n\n  /** @private {?boolean} */\n  this.metaKey_ = null;\n\n  /** @private {?Node} */\n  this.target_ = null;\n\n  /** @private {?EventTarget} */\n  this.rootTarget_ = null;\n\n  /** @private {?function(): void} */\n  this.preventDefaultFn_ = null;\n\n  /** @private {?function(): void} */\n  this.stopPropagationFn_ = null;\n};\n\n\n/**\n * @param {number} keyCode\n * @return {!goog.ui.KeyboardEventData.Builder}\n */\ngoog.ui.KeyboardEventData.Builder.prototype.keyCode = function(keyCode) {\n  this.keyCode_ = keyCode;\n  return this;\n};\n\n\n/**\n * @param {string} key\n * @return {!goog.ui.KeyboardEventData.Builder}\n */\ngoog.ui.KeyboardEventData.Builder.prototype.key = function(key) {\n  this.key_ = key;\n  return this;\n};\n\n\n/**\n * @param {boolean} shiftKey\n * @return {!goog.ui.KeyboardEventData.Builder}\n */\ngoog.ui.KeyboardEventData.Builder.prototype.shiftKey = function(shiftKey) {\n  this.shiftKey_ = shiftKey;\n  return this;\n};\n\n\n/**\n * @param {boolean} altKey\n * @return {!goog.ui.KeyboardEventData.Builder}\n */\ngoog.ui.KeyboardEventData.Builder.prototype.altKey = function(altKey) {\n  this.altKey_ = altKey;\n  return this;\n};\n\n\n/**\n * @param {boolean} ctrlKey\n * @return {!goog.ui.KeyboardEventData.Builder}\n */\ngoog.ui.KeyboardEventData.Builder.prototype.ctrlKey = function(ctrlKey) {\n  this.ctrlKey_ = ctrlKey;\n  return this;\n};\n\n\n/**\n * @param {boolean} metaKey\n * @return {!goog.ui.KeyboardEventData.Builder}\n */\ngoog.ui.KeyboardEventData.Builder.prototype.metaKey = function(metaKey) {\n  this.metaKey_ = metaKey;\n  return this;\n};\n\n\n/**\n * @param {?Node} target\n * @return {!goog.ui.KeyboardEventData.Builder}\n */\ngoog.ui.KeyboardEventData.Builder.prototype.target = function(target) {\n  this.target_ = target;\n  return this;\n};\n\n\n/**\n * @param {?EventTarget} rootTarget\n * @return {!goog.ui.KeyboardEventData.Builder}\n */\ngoog.ui.KeyboardEventData.Builder.prototype.rootTarget = function(rootTarget) {\n  this.rootTarget_ = rootTarget;\n  return this;\n};\n\n\n/**\n * @param {function(): void} preventDefaultFn\n * @return {!goog.ui.KeyboardEventData.Builder}\n */\ngoog.ui.KeyboardEventData.Builder.prototype.preventDefaultFn = function(\n    preventDefaultFn) {\n  this.preventDefaultFn_ = preventDefaultFn;\n  return this;\n};\n\n\n/**\n * @param {function(): void} stopPropagationFn\n * @return {!goog.ui.KeyboardEventData.Builder}\n */\ngoog.ui.KeyboardEventData.Builder.prototype.stopPropagationFn = function(\n    stopPropagationFn) {\n  this.stopPropagationFn_ = stopPropagationFn;\n  return this;\n};\n\n\n/** @return {!goog.ui.KeyboardEventData} */\ngoog.ui.KeyboardEventData.Builder.prototype.build = function() {\n  return new goog.ui.KeyboardEventData(\n      goog.asserts.assertNumber(this.keyCode_), this.key_,\n      goog.asserts.assertBoolean(this.shiftKey_),\n      goog.asserts.assertBoolean(this.altKey_),\n      goog.asserts.assertBoolean(this.ctrlKey_),\n      goog.asserts.assertBoolean(this.metaKey_),\n      goog.asserts.assert(this.target_), goog.asserts.assert(this.rootTarget_),\n      goog.asserts.assertFunction(this.preventDefaultFn_),\n      goog.asserts.assertFunction(this.stopPropagationFn_));\n};\n","^;",1579837703000,"^<",["^=",["^1L","^?","^4Y"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/keyboardeventdata.js"],"^O",["^=",["~$goog.ui.KeyboardEventData"]],"^W",true,"^X",["^?","^1L","^4Y"]],["^ ","^3",[1579837703000],"^4","goog.dom.asserts.js","^5",["^6","goog/dom/asserts.js"],"^7","goog/dom/asserts.js","^8","^9","^:","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.dom.asserts');\n\ngoog.require('goog.asserts');\n\n/**\n * @fileoverview Custom assertions to ensure that an element has the appropriate\n * type.\n *\n * Using a goog.dom.safe wrapper on an object on the incorrect type (via an\n * incorrect static type cast) can result in security bugs: For instance,\n * g.d.s.setAnchorHref ensures that the URL assigned to the .href attribute\n * satisfies the SafeUrl contract, i.e., is safe to dereference as a hyperlink.\n * However, the value assigned to a HTMLLinkElement's .href property requires\n * the stronger TrustedResourceUrl contract, since it can refer to a stylesheet.\n * Thus, using g.d.s.setAnchorHref on an (incorrectly statically typed) object\n * of type HTMLLinkElement can result in a security vulnerability.\n * Assertions of the correct run-time type help prevent such incorrect use.\n *\n * In some cases, code using the DOM API is tested using mock objects (e.g., a\n * plain object such as {'href': url} instead of an actual Location object).\n * To allow such mocking, the assertions permit objects of types that are not\n * relevant DOM API objects at all (for instance, not Element or Location).\n *\n * Note that instanceof checks don't work straightforwardly in older versions of\n * IE, or across frames (see,\n * http://stackoverflow.com/questions/384286/javascript-isdom-how-do-you-check-if-a-javascript-object-is-a-dom-object,\n * http://stackoverflow.com/questions/26248599/instanceof-htmlelement-in-iframe-is-not-element-or-object).\n *\n * Hence, these assertions may pass vacuously in such scenarios. The resulting\n * risk of security bugs is limited by the following factors:\n *  - A bug can only arise in scenarios involving incorrect static typing (the\n *    wrapper methods are statically typed to demand objects of the appropriate,\n *    precise type).\n *  - Typically, code is tested and exercised in multiple browsers.\n */\n\n/**\n * Asserts that a given object is a Location.\n *\n * To permit this assertion to pass in the context of tests where DOM APIs might\n * be mocked, also accepts any other type except for subtypes of {!Element}.\n * This is to ensure that, for instance, HTMLLinkElement is not being used in\n * place of a Location, since this could result in security bugs due to stronger\n * contracts required for assignments to the href property of the latter.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!Location}\n */\ngoog.dom.asserts.assertIsLocation = function(o) {\n  if (goog.asserts.ENABLE_ASSERTS) {\n    var win = goog.dom.asserts.getWindow_(o);\n    if (win) {\n      if (!o || (!(o instanceof win.Location) && o instanceof win.Element)) {\n        goog.asserts.fail(\n            'Argument is not a Location (or a non-Element mock); got: %s',\n            goog.dom.asserts.debugStringForType_(o));\n      }\n    }\n  }\n  return /** @type {!Location} */ (o);\n};\n\n\n/**\n * Asserts that a given object is either the given subtype of Element\n * or a non-Element, non-Location Mock.\n *\n * To permit this assertion to pass in the context of tests where DOM\n * APIs might be mocked, also accepts any other type except for\n * subtypes of {!Element}.  This is to ensure that, for instance,\n * HTMLScriptElement is not being used in place of a HTMLImageElement,\n * since this could result in security bugs due to stronger contracts\n * required for assignments to the src property of the latter.\n *\n * The DOM type is looked up in the window the object belongs to.  In\n * some contexts, this might not be possible (e.g. when running tests\n * outside a browser, cross-domain lookup). In this case, the\n * assertions are skipped.\n *\n * @param {?Object} o The object whose type to assert.\n * @param {string} typename The name of the DOM type.\n * @return {!Element} The object.\n * @private\n */\n// TODO(bangert): Make an analog of goog.dom.TagName to correctly handle casts?\ngoog.dom.asserts.assertIsElementType_ = function(o, typename) {\n  if (goog.asserts.ENABLE_ASSERTS) {\n    var win = goog.dom.asserts.getWindow_(o);\n    if (win && typeof win[typename] != 'undefined') {\n      if (!o ||\n          (!(o instanceof win[typename]) &&\n           (o instanceof win.Location || o instanceof win.Element))) {\n        goog.asserts.fail(\n            'Argument is not a %s (or a non-Element, non-Location mock); ' +\n                'got: %s',\n            typename, goog.dom.asserts.debugStringForType_(o));\n      }\n    }\n  }\n  return /** @type {!Element} */ (o);\n};\n\n/**\n * Asserts that a given object is a HTMLAnchorElement.\n *\n * To permit this assertion to pass in the context of tests where elements might\n * be mocked, also accepts objects that are not of type Location nor a subtype\n * of Element.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!HTMLAnchorElement}\n */\ngoog.dom.asserts.assertIsHTMLAnchorElement = function(o) {\n  return /** @type {!HTMLAnchorElement} */ (\n      goog.dom.asserts.assertIsElementType_(o, 'HTMLAnchorElement'));\n};\n\n/**\n * Asserts that a given object is a HTMLButtonElement.\n *\n * To permit this assertion to pass in the context of tests where elements might\n * be mocked, also accepts objects that are not a subtype of Element.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!HTMLButtonElement}\n */\ngoog.dom.asserts.assertIsHTMLButtonElement = function(o) {\n  return /** @type {!HTMLButtonElement} */ (\n      goog.dom.asserts.assertIsElementType_(o, 'HTMLButtonElement'));\n};\n\n/**\n * Asserts that a given object is a HTMLLinkElement.\n *\n * To permit this assertion to pass in the context of tests where elements might\n * be mocked, also accepts objects that are not a subtype of Element.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!HTMLLinkElement}\n */\ngoog.dom.asserts.assertIsHTMLLinkElement = function(o) {\n  return /** @type {!HTMLLinkElement} */ (\n      goog.dom.asserts.assertIsElementType_(o, 'HTMLLinkElement'));\n};\n\n/**\n * Asserts that a given object is a HTMLImageElement.\n *\n * To permit this assertion to pass in the context of tests where elements might\n * be mocked, also accepts objects that are not a subtype of Element.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!HTMLImageElement}\n */\ngoog.dom.asserts.assertIsHTMLImageElement = function(o) {\n  return /** @type {!HTMLImageElement} */ (\n      goog.dom.asserts.assertIsElementType_(o, 'HTMLImageElement'));\n};\n\n/**\n * Asserts that a given object is a HTMLAudioElement.\n *\n * To permit this assertion to pass in the context of tests where elements might\n * be mocked, also accepts objects that are not a subtype of Element.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!HTMLAudioElement}\n */\ngoog.dom.asserts.assertIsHTMLAudioElement = function(o) {\n  return /** @type {!HTMLAudioElement} */ (\n      goog.dom.asserts.assertIsElementType_(o, 'HTMLAudioElement'));\n};\n\n/**\n * Asserts that a given object is a HTMLVideoElement.\n *\n * To permit this assertion to pass in the context of tests where elements might\n * be mocked, also accepts objects that are not a subtype of Element.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!HTMLVideoElement}\n */\ngoog.dom.asserts.assertIsHTMLVideoElement = function(o) {\n  return /** @type {!HTMLVideoElement} */ (\n      goog.dom.asserts.assertIsElementType_(o, 'HTMLVideoElement'));\n};\n\n/**\n * Asserts that a given object is a HTMLInputElement.\n *\n * To permit this assertion to pass in the context of tests where elements might\n * be mocked, also accepts objects that are not a subtype of Element.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!HTMLInputElement}\n */\ngoog.dom.asserts.assertIsHTMLInputElement = function(o) {\n  return /** @type {!HTMLInputElement} */ (\n      goog.dom.asserts.assertIsElementType_(o, 'HTMLInputElement'));\n};\n\n/**\n * Asserts that a given object is a HTMLTextAreaElement.\n *\n * To permit this assertion to pass in the context of tests where elements might\n * be mocked, also accepts objects that are not a subtype of Element.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!HTMLTextAreaElement}\n */\ngoog.dom.asserts.assertIsHTMLTextAreaElement = function(o) {\n  return /** @type {!HTMLTextAreaElement} */ (\n      goog.dom.asserts.assertIsElementType_(o, 'HTMLTextAreaElement'));\n};\n\n/**\n * Asserts that a given object is a HTMLCanvasElement.\n *\n * To permit this assertion to pass in the context of tests where elements might\n * be mocked, also accepts objects that are not a subtype of Element.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!HTMLCanvasElement}\n */\ngoog.dom.asserts.assertIsHTMLCanvasElement = function(o) {\n  return /** @type {!HTMLCanvasElement} */ (\n      goog.dom.asserts.assertIsElementType_(o, 'HTMLCanvasElement'));\n};\n\n/**\n * Asserts that a given object is a HTMLEmbedElement.\n *\n * To permit this assertion to pass in the context of tests where elements might\n * be mocked, also accepts objects that are not a subtype of Element.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!HTMLEmbedElement}\n */\ngoog.dom.asserts.assertIsHTMLEmbedElement = function(o) {\n  return /** @type {!HTMLEmbedElement} */ (\n      goog.dom.asserts.assertIsElementType_(o, 'HTMLEmbedElement'));\n};\n\n/**\n * Asserts that a given object is a HTMLFormElement.\n *\n * To permit this assertion to pass in the context of tests where elements might\n * be mocked, also accepts objects that are not a subtype of Element.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!HTMLFormElement}\n */\ngoog.dom.asserts.assertIsHTMLFormElement = function(o) {\n  return /** @type {!HTMLFormElement} */ (\n      goog.dom.asserts.assertIsElementType_(o, 'HTMLFormElement'));\n};\n\n/**\n * Asserts that a given object is a HTMLFrameElement.\n *\n * To permit this assertion to pass in the context of tests where elements might\n * be mocked, also accepts objects that are not a subtype of Element.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!HTMLFrameElement}\n */\ngoog.dom.asserts.assertIsHTMLFrameElement = function(o) {\n  return /** @type {!HTMLFrameElement} */ (\n      goog.dom.asserts.assertIsElementType_(o, 'HTMLFrameElement'));\n};\n\n/**\n * Asserts that a given object is a HTMLIFrameElement.\n *\n * To permit this assertion to pass in the context of tests where elements might\n * be mocked, also accepts objects that are not a subtype of Element.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!HTMLIFrameElement}\n */\ngoog.dom.asserts.assertIsHTMLIFrameElement = function(o) {\n  return /** @type {!HTMLIFrameElement} */ (\n      goog.dom.asserts.assertIsElementType_(o, 'HTMLIFrameElement'));\n};\n\n/**\n * Asserts that a given object is a HTMLObjectElement.\n *\n * To permit this assertion to pass in the context of tests where elements might\n * be mocked, also accepts objects that are not a subtype of Element.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!HTMLObjectElement}\n */\ngoog.dom.asserts.assertIsHTMLObjectElement = function(o) {\n  return /** @type {!HTMLObjectElement} */ (\n      goog.dom.asserts.assertIsElementType_(o, 'HTMLObjectElement'));\n};\n\n/**\n * Asserts that a given object is a HTMLScriptElement.\n *\n * To permit this assertion to pass in the context of tests where elements might\n * be mocked, also accepts objects that are not a subtype of Element.\n *\n * @param {?Object} o The object whose type to assert.\n * @return {!HTMLScriptElement}\n */\ngoog.dom.asserts.assertIsHTMLScriptElement = function(o) {\n  return /** @type {!HTMLScriptElement} */ (\n      goog.dom.asserts.assertIsElementType_(o, 'HTMLScriptElement'));\n};\n\n/**\n * Returns a string representation of a value's type.\n *\n * @param {*} value An object, or primitive.\n * @return {string} The best display name for the value.\n * @private\n */\ngoog.dom.asserts.debugStringForType_ = function(value) {\n  if (goog.isObject(value)) {\n    try {\n      return value.constructor.displayName || value.constructor.name ||\n          Object.prototype.toString.call(value);\n    } catch (e) {\n      return '<object could not be stringified>';\n    }\n  } else {\n    return value === undefined ? 'undefined' :\n                                 value === null ? 'null' : typeof value;\n  }\n};\n\n/**\n * Gets window of element.\n * @param {?Object} o\n * @return {?Window}\n * @private\n * @suppress {strictMissingProperties} ownerDocument not defined on Object\n */\ngoog.dom.asserts.getWindow_ = function(o) {\n  try {\n    var doc = o && o.ownerDocument;\n    // This can throw “Blocked a frame with origin \"chrome-extension://...\" from\n    // accessing a cross-origin frame” in Chrome extension.\n    var win =\n        doc && /** @type {?Window} */ (doc.defaultView || doc.parentWindow);\n    win = win || /** @type {!Window} */ (goog.global);\n    // This can throw “Permission denied to access property \"Element\" on\n    // cross-origin object”.\n    if (win.Element && win.Location) {\n      return win;\n    }\n  } catch (ex) {\n  }\n  return null;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/asserts.js"],"^O",["^=",["^4K"]],"^W",true,"^X",["^?","^1L"]],["^ ","^3",[1579837703000],"^4","goog.dom.pattern.endtag.js","^5",["^6","goog/dom/pattern/endtag.js"],"^7","goog/dom/pattern/endtag.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview DOM pattern to match the end of a tag.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.pattern.EndTag');\n\ngoog.require('goog.dom.TagWalkType');\ngoog.require('goog.dom.pattern.Tag');\n\n\n\n/**\n * Pattern object that matches a closing tag.\n *\n * @param {string|RegExp} tag Name of the tag.  Also will accept a regular\n *     expression to match against the tag name.\n * @param {Object=} opt_attrs Optional map of attribute names to desired values.\n *     This pattern will only match when all attributes are present and match\n *     the string or regular expression value provided here.\n * @param {Object=} opt_styles Optional map of CSS style names to desired\n *     values. This pattern will only match when all styles are present and\n *     match the string or regular expression value provided here.\n * @param {Function=} opt_test Optional function that takes the element as a\n *     parameter and returns true if this pattern should match it.\n * @constructor\n * @extends {goog.dom.pattern.Tag}\n * @final\n */\ngoog.dom.pattern.EndTag = function(tag, opt_attrs, opt_styles, opt_test) {\n  goog.dom.pattern.Tag.call(\n      this, tag, goog.dom.TagWalkType.END_TAG, opt_attrs, opt_styles, opt_test);\n};\ngoog.inherits(goog.dom.pattern.EndTag, goog.dom.pattern.Tag);\n","^;",1579837703000,"^<",["^=",["~$goog.dom.TagWalkType","^?","~$goog.dom.pattern.Tag"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/endtag.js"],"^O",["^=",["~$goog.dom.pattern.EndTag"]],"^W",true,"^X",["^?","^5F","^5G"]],["^ ","^3",[1579837703000],"^4","goog.net.xhrlike.js","^5",["^6","goog/net/xhrlike.js"],"^7","goog/net/xhrlike.js","^8","^9","^:","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.net.XhrLike');\n\n\n\n/**\n * Interface for the common parts of XMLHttpRequest.\n *\n * Mostly copied from externs/w3c_xml.js.\n *\n * @interface\n * @see http://www.w3.org/TR/XMLHttpRequest/\n */\ngoog.net.XhrLike = function() {};\n\n\n/**\n * Typedef that refers to either native or custom-implemented XHR objects.\n * @typedef {!goog.net.XhrLike|!XMLHttpRequest}\n */\ngoog.net.XhrLike.OrNative;\n\n\n/**\n * @type {function()|null|undefined}\n * @see http://www.w3.org/TR/XMLHttpRequest/#handler-xhr-onreadystatechange\n */\ngoog.net.XhrLike.prototype.onreadystatechange;\n\n\n/**\n * @type {?ArrayBuffer|?Blob|?Document|?Object|?string}\n * @see https://xhr.spec.whatwg.org/#response-object\n */\ngoog.net.XhrLike.prototype.response;\n\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-responsetext-attribute\n */\ngoog.net.XhrLike.prototype.responseText;\n\n\n/**\n * @type {string}\n * @see https://xhr.spec.whatwg.org/#the-responsetype-attribute\n */\ngoog.net.XhrLike.prototype.responseType;\n\n\n/**\n * @type {Document}\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-responsexml-attribute\n */\ngoog.net.XhrLike.prototype.responseXML;\n\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/XMLHttpRequest/#readystate\n */\ngoog.net.XhrLike.prototype.readyState;\n\n\n/**\n * @type {number}\n * @see http://www.w3.org/TR/XMLHttpRequest/#status\n */\ngoog.net.XhrLike.prototype.status;\n\n\n/**\n * @type {string}\n * @see http://www.w3.org/TR/XMLHttpRequest/#statustext\n */\ngoog.net.XhrLike.prototype.statusText;\n\n\n/**\n * @param {string} method\n * @param {string} url\n * @param {?boolean=} opt_async\n * @param {?string=} opt_user\n * @param {?string=} opt_password\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-open()-method\n */\ngoog.net.XhrLike.prototype.open = function(\n    method, url, opt_async, opt_user, opt_password) {};\n\n\n/**\n * @param {ArrayBuffer|ArrayBufferView|Blob|Document|FormData|string=} opt_data\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-send()-method\n */\ngoog.net.XhrLike.prototype.send = function(opt_data) {};\n\n\n/**\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-abort()-method\n */\ngoog.net.XhrLike.prototype.abort = function() {};\n\n\n/**\n * @param {string} header\n * @param {string} value\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader()-method\n */\ngoog.net.XhrLike.prototype.setRequestHeader = function(header, value) {};\n\n\n/**\n * @param {string} header\n * @return {string}\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-getresponseheader()-method\n */\ngoog.net.XhrLike.prototype.getResponseHeader = function(header) {};\n\n\n/**\n * @return {string}\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-getallresponseheaders()-method\n */\ngoog.net.XhrLike.prototype.getAllResponseHeaders = function() {};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/xhrlike.js"],"^O",["^=",["~$goog.net.XhrLike"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.string.path.js","^5",["^6","goog/string/path.js"],"^7","goog/string/path.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for dealing with POSIX path strings. Based on\n * Python's os.path and posixpath.\n * @author nnaze@google.com (Nathan Naze)\n */\n\ngoog.provide('goog.string.path');\n\ngoog.require('goog.array');\ngoog.require('goog.string');\n\n\n/**\n * Returns the final component of a pathname.\n * See http://docs.python.org/library/os.path.html#os.path.basename\n * @param {string} path A pathname.\n * @return {string} path The final component of a pathname, i.e. everything\n *     after the final slash.\n */\ngoog.string.path.baseName = function(path) {\n  var i = path.lastIndexOf('/') + 1;\n  return path.slice(i);\n};\n\n\n/**\n * Alias to goog.string.path.baseName.\n * @param {string} path A pathname.\n * @return {string} path The final component of a pathname.\n * @deprecated Use goog.string.path.baseName.\n */\ngoog.string.path.basename = goog.string.path.baseName;\n\n\n/**\n * Returns the directory component of a pathname.\n * See http://docs.python.org/library/os.path.html#os.path.dirname\n * @param {string} path A pathname.\n * @return {string} The directory component of a pathname, i.e. everything\n *     leading up to the final slash.\n */\ngoog.string.path.dirname = function(path) {\n  var i = path.lastIndexOf('/') + 1;\n  var head = path.slice(0, i);\n  // If the path isn't all forward slashes, trim the trailing slashes.\n  if (!/^\\/+$/.test(head)) {\n    head = head.replace(/\\/+$/, '');\n  }\n  return head;\n};\n\n\n/**\n * Extracts the extension part of a pathname.\n * @param {string} path The path name to process.\n * @return {string} The extension if any, otherwise the empty string.\n */\ngoog.string.path.extension = function(path) {\n  var separator = '.';\n  // Combining all adjacent periods in the basename to a single period.\n  var baseName = goog.string.path.baseName(path).replace(/\\.+/g, separator);\n  var separatorIndex = baseName.lastIndexOf(separator);\n  return separatorIndex <= 0 ? '' : baseName.substr(separatorIndex + 1);\n};\n\n\n// TODO(johnlenz): goog.string.path.join should not accept undefined\n/**\n * Joins one or more path components (e.g. 'foo/' and 'bar' make 'foo/bar').\n * An absolute component will discard all previous component.\n * See http://docs.python.org/library/os.path.html#os.path.join\n * @param {...(string|undefined)} var_args One of more path components.\n * @return {string} The path components joined.\n */\ngoog.string.path.join = function(var_args) {\n  var path = arguments[0];\n\n  for (var i = 1; i < arguments.length; i++) {\n    var arg = arguments[i];\n    if (goog.string.startsWith(arg, '/')) {\n      path = arg;\n    } else if (path == '' || goog.string.endsWith(path, '/')) {\n      path += arg;\n    } else {\n      path += '/' + arg;\n    }\n  }\n\n  return path;\n};\n\n\n/**\n * Normalizes a pathname by collapsing duplicate separators, parent directory\n * references ('..'), and current directory references ('.').\n * See http://docs.python.org/library/os.path.html#os.path.normpath\n * @param {string} path One or more path components.\n * @return {string} The path after normalization.\n */\ngoog.string.path.normalizePath = function(path) {\n  if (path == '') {\n    return '.';\n  }\n\n  var initialSlashes = '';\n  // POSIX will keep two slashes, but three or more will be collapsed to one.\n  if (goog.string.startsWith(path, '/')) {\n    initialSlashes = '/';\n    if (goog.string.startsWith(path, '//') &&\n        !goog.string.startsWith(path, '///')) {\n      initialSlashes = '//';\n    }\n  }\n\n  var parts = path.split('/');\n  var newParts = [];\n\n  for (var i = 0; i < parts.length; i++) {\n    var part = parts[i];\n\n    // '' and '.' don't change the directory, ignore.\n    if (part == '' || part == '.') {\n      continue;\n    }\n\n    // A '..' should pop a directory unless this is not an absolute path and\n    // we're at the root, or we've travelled upwards relatively in the last\n    // iteration.\n    if (part != '..' || (!initialSlashes && !newParts.length) ||\n        goog.array.peek(newParts) == '..') {\n      newParts.push(part);\n    } else {\n      newParts.pop();\n    }\n  }\n\n  var returnPath = initialSlashes + newParts.join('/');\n  return returnPath || '.';\n};\n\n\n/**\n * Splits a pathname into \"dirname\" and \"baseName\" components, where \"baseName\"\n * is everything after the final slash. Either part may return an empty string.\n * See http://docs.python.org/library/os.path.html#os.path.split\n * @param {string} path A pathname.\n * @return {!Array<string>} An array of [dirname, basename].\n */\ngoog.string.path.split = function(path) {\n  var head = goog.string.path.dirname(path);\n  var tail = goog.string.path.baseName(path);\n  return [head, tail];\n};\n\n// TODO(nnaze): Implement other useful functions from os.path\n","^;",1579837703000,"^<",["^=",["^2L","^?","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/string/path.js"],"^O",["^=",["~$goog.string.path"]],"^W",true,"^X",["^?","^2O","^2L"]],["^ ","^3",[1579837703000],"^4","goog.events.wheelevent.js","^5",["^6","goog/events/wheelevent.js"],"^7","goog/events/wheelevent.js","^8","^9","^:","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This class aims to smooth out inconsistencies between browser\n * handling of wheel events by providing an event that is similar to that\n * defined in the standard, but also easier to consume.\n *\n * It is based upon the WheelEvent, which allows for up to 3 dimensional\n * scrolling events that come in units of either pixels, lines or pages.\n * http://www.w3.org/TR/2014/WD-DOM-Level-3-Events-20140925/#interface-WheelEvent\n *\n * The significant difference here is that it also provides reasonable pixel\n * deltas for clients that do not want to treat line and page scrolling events\n * specially.\n *\n * Clients of this code should be aware that some input devices only fire a few\n * discrete events (such as a mouse wheel without acceleration) whereas some can\n * generate a large number of events for a single interaction (such as a\n * touchpad with acceleration). There is no signal in the events to reliably\n * distinguish between these.\n *\n * @see ../demos/wheelhandler.html\n */\n\ngoog.provide('goog.events.WheelEvent');\n\ngoog.require('goog.asserts');\ngoog.require('goog.events.BrowserEvent');\n\n\n\n/**\n * A common class for wheel events. This is used with the WheelHandler.\n *\n * @param {Event} browserEvent Browser event object.\n * @param {goog.events.WheelEvent.DeltaMode} deltaMode The delta mode units of\n *     the wheel event.\n * @param {number} deltaX The number of delta units the user in the X axis.\n * @param {number} deltaY The number of delta units the user in the Y axis.\n * @param {number} deltaZ The number of delta units the user in the Z axis.\n * @constructor\n * @extends {goog.events.BrowserEvent}\n * @final\n */\ngoog.events.WheelEvent = function(\n    browserEvent, deltaMode, deltaX, deltaY, deltaZ) {\n  goog.events.WheelEvent.base(this, 'constructor', browserEvent);\n  goog.asserts.assert(browserEvent, 'Expecting a non-null browserEvent');\n\n  /** @type {goog.events.WheelEvent.EventType} */\n  this.type = goog.events.WheelEvent.EventType.WHEEL;\n\n  /**\n   * An enum corresponding to the units of this event.\n   * @type {goog.events.WheelEvent.DeltaMode}\n   */\n  this.deltaMode = deltaMode;\n\n  /**\n   * The number of delta units in the X axis.\n   * @type {number}\n   */\n  this.deltaX = deltaX;\n\n  /**\n   * The number of delta units in the Y axis.\n   * @type {number}\n   */\n  this.deltaY = deltaY;\n\n  /**\n   * The number of delta units in the Z axis.\n   * @type {number}\n   */\n  this.deltaZ = deltaZ;\n\n  // Ratio between delta and pixel values.\n  var pixelRatio = 1;  // Value for DeltaMode.PIXEL\n  switch (deltaMode) {\n    case goog.events.WheelEvent.DeltaMode.PAGE:\n      pixelRatio *= goog.events.WheelEvent.PIXELS_PER_PAGE_;\n      break;\n    case goog.events.WheelEvent.DeltaMode.LINE:\n      pixelRatio *= goog.events.WheelEvent.PIXELS_PER_LINE_;\n      break;\n  }\n\n  /**\n   * The number of delta pixels in the X axis. Code that doesn't want to handle\n   * different deltaMode units can just look here.\n   * @type {number}\n   */\n  this.pixelDeltaX = this.deltaX * pixelRatio;\n\n  /**\n   * The number of pixels in the Y axis. Code that doesn't want to\n   * handle different deltaMode units can just look here.\n   * @type {number}\n   */\n  this.pixelDeltaY = this.deltaY * pixelRatio;\n\n  /**\n   * The number of pixels scrolled in the Z axis. Code that doesn't want to\n   * handle different deltaMode units can just look here.\n   * @type {number}\n   */\n  this.pixelDeltaZ = this.deltaZ * pixelRatio;\n};\ngoog.inherits(goog.events.WheelEvent, goog.events.BrowserEvent);\n\n\n/**\n * Enum type for the events fired by the wheel handler.\n * @enum {string}\n */\ngoog.events.WheelEvent.EventType = {\n  /** The user has provided wheel-based input. */\n  WHEEL: 'wheel'\n};\n\n\n/**\n * Units for the deltas in a WheelEvent.\n * @enum {number}\n */\ngoog.events.WheelEvent.DeltaMode = {\n  /** The units are in pixels. From DOM_DELTA_PIXEL. */\n  PIXEL: 0,\n  /** The units are in lines. From DOM_DELTA_LINE. */\n  LINE: 1,\n  /** The units are in pages. From DOM_DELTA_PAGE. */\n  PAGE: 2\n};\n\n\n/**\n * A conversion number between line scroll units and pixel scroll units. The\n * actual value per line can vary a lot between devices and font sizes. This\n * number can not be perfect, but it should be reasonable for converting lines\n * scroll events into pixels.\n * @const {number}\n * @private\n */\ngoog.events.WheelEvent.PIXELS_PER_LINE_ = 15;\n\n\n/**\n * A conversion number between page scroll units and pixel scroll units. The\n * actual value per page can vary a lot as many different devices have different\n * screen sizes, and the window might not be taking up the full screen. This\n * number can not be perfect, but it should be reasonable for converting page\n * scroll events into pixels.\n * @const {number}\n * @private\n */\ngoog.events.WheelEvent.PIXELS_PER_PAGE_ =\n    30 * goog.events.WheelEvent.PIXELS_PER_LINE_;\n","^;",1579837703000,"^<",["^=",["^1L","^?","^4Y"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/wheelevent.js"],"^O",["^=",["~$goog.events.WheelEvent"]],"^W",true,"^X",["^?","^1L","^4Y"]],["^ ","^3",[1579837703000],"^4","goog.ui.toolbarseparatorrenderer.js","^5",["^6","goog/ui/toolbarseparatorrenderer.js"],"^7","goog/ui/toolbarseparatorrenderer.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for toolbar separators.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ToolbarSeparatorRenderer');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.ui.INLINE_BLOCK_CLASSNAME');\ngoog.require('goog.ui.MenuSeparatorRenderer');\n\n\n\n/**\n * Renderer for toolbar separators.\n * @constructor\n * @extends {goog.ui.MenuSeparatorRenderer}\n */\ngoog.ui.ToolbarSeparatorRenderer = function() {\n  goog.ui.MenuSeparatorRenderer.call(this);\n};\ngoog.inherits(goog.ui.ToolbarSeparatorRenderer, goog.ui.MenuSeparatorRenderer);\ngoog.addSingletonGetter(goog.ui.ToolbarSeparatorRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.ToolbarSeparatorRenderer.CSS_CLASS =\n    goog.getCssName('goog-toolbar-separator');\n\n\n/**\n * Returns a styled toolbar separator implemented by the following DOM:\n *\n *    <div class=\"goog-toolbar-separator goog-inline-block\">&nbsp;</div>\n *\n * Overrides {@link goog.ui.MenuSeparatorRenderer#createDom}.\n * @param {goog.ui.Control} separator goog.ui.Separator to render.\n * @return {!Element} Root element for the separator.\n * @override\n */\ngoog.ui.ToolbarSeparatorRenderer.prototype.createDom = function(separator) {\n  // 00A0 is &nbsp;\n  return separator.getDomHelper().createDom(\n      goog.dom.TagName.DIV, this.getClassNames(separator).join(' ') + ' ' +\n          goog.ui.INLINE_BLOCK_CLASSNAME,\n      '\\u00A0');\n};\n\n\n/**\n * Takes an existing element, and decorates it with the separator.  Overrides\n * {@link goog.ui.MenuSeparatorRenderer#decorate}.\n * @param {goog.ui.Control} separator goog.ui.Separator to decorate the element.\n * @param {Element} element Element to decorate.\n * @return {!Element} Decorated element.\n * @override\n */\ngoog.ui.ToolbarSeparatorRenderer.prototype.decorate = function(\n    separator, element) {\n  element = goog.ui.ToolbarSeparatorRenderer.superClass_.decorate.call(\n      this, separator, element);\n  goog.asserts.assert(element);\n  goog.dom.classlist.add(element, goog.ui.INLINE_BLOCK_CLASSNAME);\n  return element;\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.ToolbarSeparatorRenderer.prototype.getCssClass = function() {\n  return goog.ui.ToolbarSeparatorRenderer.CSS_CLASS;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^1M","^?","~$goog.ui.MenuSeparatorRenderer","^20","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/toolbarseparatorrenderer.js"],"^O",["^=",["~$goog.ui.ToolbarSeparatorRenderer"]],"^W",true,"^X",["^?","^1L","^12","^1M","^20","^5L"]],["^ ","^3",[1579837703000],"^4","goog.fx.anim.anim.js","^5",["^6","goog/fx/anim/anim.js"],"^7","goog/fx/anim/anim.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Basic animation controls.\n *\n * @author arv@google.com (Erik Arvidsson)\n */\ngoog.provide('goog.fx.anim');\ngoog.provide('goog.fx.anim.Animated');\n\ngoog.require('goog.async.AnimationDelay');\ngoog.require('goog.async.Delay');\ngoog.require('goog.object');\n\n\n\n/**\n * An interface for programatically animated objects. I.e. rendered in\n * javascript frame by frame.\n *\n * @interface\n */\ngoog.fx.anim.Animated = function() {};\n\n\n/**\n * Function called when a frame is requested for the animation.\n *\n * @param {number} now Current time in milliseconds.\n */\ngoog.fx.anim.Animated.prototype.onAnimationFrame;\n\n\n/**\n * Default wait timeout for animations (in milliseconds).  Only used for timed\n * animation, which uses a timer (setTimeout) to schedule animation.\n *\n * @type {number}\n * @const\n */\ngoog.fx.anim.TIMEOUT = goog.async.AnimationDelay.TIMEOUT;\n\n\n/**\n * A map of animations which should be cycled on the global timer.\n *\n * @type {!Object<number, goog.fx.anim.Animated>}\n * @private\n */\ngoog.fx.anim.activeAnimations_ = {};\n\n\n/**\n * An optional animation window.\n * @type {?Window}\n * @private\n */\ngoog.fx.anim.animationWindow_ = null;\n\n\n/**\n * An interval ID for the global timer or event handler uid.\n * @type {?goog.async.Delay|?goog.async.AnimationDelay}\n * @private\n */\ngoog.fx.anim.animationDelay_ = null;\n\n\n/**\n * Registers an animation to be cycled on the global timer.\n * @param {goog.fx.anim.Animated} animation The animation to register.\n */\ngoog.fx.anim.registerAnimation = function(animation) {\n  var uid = goog.getUid(animation);\n  if (!(uid in goog.fx.anim.activeAnimations_)) {\n    goog.fx.anim.activeAnimations_[uid] = animation;\n  }\n\n  // If the timer is not already started, start it now.\n  goog.fx.anim.requestAnimationFrame_();\n};\n\n\n/**\n * Removes an animation from the list of animations which are cycled on the\n * global timer.\n * @param {goog.fx.anim.Animated} animation The animation to unregister.\n */\ngoog.fx.anim.unregisterAnimation = function(animation) {\n  var uid = goog.getUid(animation);\n  delete goog.fx.anim.activeAnimations_[uid];\n\n  // If a timer is running and we no longer have any active timers we stop the\n  // timers.\n  if (goog.object.isEmpty(goog.fx.anim.activeAnimations_)) {\n    goog.fx.anim.cancelAnimationFrame_();\n  }\n};\n\n\n/**\n * Tears down this module. Useful for testing.\n */\n// TODO(nicksantos): Wow, this api is pretty broken. This should be fixed.\ngoog.fx.anim.tearDown = function() {\n  goog.fx.anim.animationWindow_ = null;\n  goog.dispose(goog.fx.anim.animationDelay_);\n  goog.fx.anim.animationDelay_ = null;\n  goog.fx.anim.activeAnimations_ = {};\n};\n\n\n/**\n * Registers an animation window. This allows usage of the timing control API\n * for animations. Note that this window must be visible, as non-visible\n * windows can potentially stop animating. This window does not necessarily\n * need to be the window inside which animation occurs, but must remain visible.\n * See: https://developer.mozilla.org/en/DOM/window.mozRequestAnimationFrame.\n *\n * @param {Window} animationWindow The window in which to animate elements.\n */\ngoog.fx.anim.setAnimationWindow = function(animationWindow) {\n  // If a timer is currently running, reset it and restart with new functions\n  // after a timeout. This is to avoid mismatching timer UIDs if we change the\n  // animation window during a running animation.\n  //\n  // In practice this cannot happen before some animation window and timer\n  // control functions has already been set.\n  var hasTimer =\n      goog.fx.anim.animationDelay_ && goog.fx.anim.animationDelay_.isActive();\n\n  goog.dispose(goog.fx.anim.animationDelay_);\n  goog.fx.anim.animationDelay_ = null;\n  goog.fx.anim.animationWindow_ = animationWindow;\n\n  // If the timer was running, start it again.\n  if (hasTimer) {\n    goog.fx.anim.requestAnimationFrame_();\n  }\n};\n\n\n/**\n * Requests an animation frame based on the requestAnimationFrame and\n * cancelRequestAnimationFrame function pair.\n * @private\n */\ngoog.fx.anim.requestAnimationFrame_ = function() {\n  if (!goog.fx.anim.animationDelay_) {\n    // We cannot guarantee that the global window will be one that fires\n    // requestAnimationFrame events (consider off-screen chrome extension\n    // windows). Default to use goog.async.Delay, unless\n    // the client has explicitly set an animation window.\n    if (goog.fx.anim.animationWindow_) {\n      // requestAnimationFrame will call cycleAnimations_ with the current\n      // time in ms, as returned from goog.now().\n      goog.fx.anim.animationDelay_ =\n          new goog.async.AnimationDelay(function(now) {\n            goog.fx.anim.cycleAnimations_(now);\n          }, goog.fx.anim.animationWindow_);\n    } else {\n      goog.fx.anim.animationDelay_ = new goog.async.Delay(function() {\n        goog.fx.anim.cycleAnimations_(goog.now());\n      }, goog.fx.anim.TIMEOUT);\n    }\n  }\n\n  var delay = goog.fx.anim.animationDelay_;\n  if (!delay.isActive()) {\n    delay.start();\n  }\n};\n\n\n/**\n * Cancels an animation frame created by requestAnimationFrame_().\n * @private\n */\ngoog.fx.anim.cancelAnimationFrame_ = function() {\n  if (goog.fx.anim.animationDelay_) {\n    goog.fx.anim.animationDelay_.stop();\n  }\n};\n\n\n/**\n * Cycles through all registered animations.\n * @param {number} now Current time in milliseconds.\n * @private\n */\ngoog.fx.anim.cycleAnimations_ = function(now) {\n  goog.object.forEach(goog.fx.anim.activeAnimations_, function(anim) {\n    anim.onAnimationFrame(now);\n  });\n\n  if (!goog.object.isEmpty(goog.fx.anim.activeAnimations_)) {\n    goog.fx.anim.requestAnimationFrame_();\n  }\n};\n","^;",1579837703000,"^<",["^=",["~$goog.async.AnimationDelay","^?","^42","^5>"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/anim/anim.js"],"^O",["^=",["~$goog.fx.anim.Animated","~$goog.fx.anim"]],"^W",true,"^X",["^?","^5N","^5>","^42"]],["^ ","^3",[1579837703000],"^4","goog.structs.linkedmap.js","^5",["^6","goog/structs/linkedmap.js"],"^7","goog/structs/linkedmap.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A LinkedMap data structure that is accessed using key/value\n * pairs like an ordinary Map, but which guarantees a consistent iteration\n * order over its entries. The iteration order is either insertion order (the\n * default) or ordered from most recent to least recent use. By setting a fixed\n * size, the LRU version of the LinkedMap makes an effective object cache. This\n * data structure is similar to Java's LinkedHashMap.\n *\n * @author brenneman@google.com (Shawn Brenneman)\n */\n\n\ngoog.provide('goog.structs.LinkedMap');\n\ngoog.require('goog.structs.Map');\n\n\n\n/**\n * Class for a LinkedMap datastructure, which combines O(1) map access for\n * key/value pairs with a linked list for a consistent iteration order. Sample\n * usage:\n *\n * <pre>\n * var m = new LinkedMap();\n * m.set('param1', 'A');\n * m.set('param2', 'B');\n * m.set('param3', 'C');\n * alert(m.getKeys()); // param1, param2, param3\n *\n * var c = new LinkedMap(5, true);\n * for (var i = 0; i < 10; i++) {\n *   c.set('entry' + i, false);\n * }\n * alert(c.getKeys()); // entry9, entry8, entry7, entry6, entry5\n *\n * c.set('entry5', true);\n * c.set('entry1', false);\n * alert(c.getKeys()); // entry1, entry5, entry9, entry8, entry7\n * </pre>\n *\n * @param {number=} opt_maxCount The maximum number of objects to store in the\n *     LinkedMap. If unspecified or 0, there is no maximum.\n * @param {boolean=} opt_cache When set, the LinkedMap stores items in order\n *     from most recently used to least recently used, instead of insertion\n *     order.\n * @param {function(string, VALUE)=} opt_evictionCallback Called with the\n *     removed stringified key as the first argument and value as the second\n *     argument after the key was evicted from the LRU because the max count\n *     was reached.\n * @constructor\n * @template KEY, VALUE\n */\ngoog.structs.LinkedMap = function(\n    opt_maxCount, opt_cache, opt_evictionCallback) {\n  /**\n   * The maximum number of entries to allow, or null if there is no limit.\n   * @private {?number}\n   */\n  this.maxCount_ = opt_maxCount || null;\n\n  /** @private @const {boolean} */\n  this.cache_ = !!opt_cache;\n\n  /** @private {function(string, VALUE)|undefined} */\n  this.evictionCallback_ = opt_evictionCallback;\n\n  /**\n   * @private @const {!goog.structs.Map<string,\n   *     goog.structs.LinkedMap.Node_<string, VALUE>>}\n   */\n  this.map_ = new goog.structs.Map();\n\n  this.head_ = new goog.structs.LinkedMap.Node_('', undefined);\n  this.head_.next = this.head_.prev = this.head_;\n};\n\n\n/**\n * Finds a node and updates it to be the most recently used.\n * @param {string} key The key of the node.\n * @return {goog.structs.LinkedMap.Node_<string, VALUE>} The node or null if not\n *     found.\n * @private\n */\ngoog.structs.LinkedMap.prototype.findAndMoveToTop_ = function(key) {\n  var node = this.map_.get(key);\n  if (node) {\n    if (this.cache_) {\n      node.remove();\n      this.insert_(node);\n    }\n  }\n  return node;\n};\n\n\n/**\n * Retrieves the value for a given key. If this is a caching LinkedMap, the\n * entry will become the most recently used.\n * @param {string} key The key to retrieve the value for.\n * @param {VALUE=} opt_val A default value that will be returned if the key is\n *     not found, defaults to undefined.\n * @return {VALUE} The retrieved value.\n */\ngoog.structs.LinkedMap.prototype.get = function(key, opt_val) {\n  var node = this.findAndMoveToTop_(key);\n  return node ? node.value : opt_val;\n};\n\n\n/**\n * Retrieves the value for a given key without updating the entry to be the\n * most recently used.\n * @param {string} key The key to retrieve the value for.\n * @param {VALUE=} opt_val A default value that will be returned if the key is\n *     not found.\n * @return {VALUE} The retrieved value.\n */\ngoog.structs.LinkedMap.prototype.peekValue = function(key, opt_val) {\n  var node = this.map_.get(key);\n  return node ? node.value : opt_val;\n};\n\n\n/**\n * Sets a value for a given key. If this is a caching LinkedMap, this entry\n * will become the most recently used.\n * @param {string} key Key with which the specified value is to be associated.\n * @param {VALUE} value Value to be associated with the specified key.\n */\ngoog.structs.LinkedMap.prototype.set = function(key, value) {\n  var node = this.findAndMoveToTop_(key);\n  if (node) {\n    node.value = value;\n  } else {\n    node = new goog.structs.LinkedMap.Node_(key, value);\n    this.map_.set(key, node);\n    this.insert_(node);\n  }\n};\n\n\n/**\n * Returns the value of the first node without making any modifications.\n * @return {VALUE} The value of the first node or undefined if the map is empty.\n */\ngoog.structs.LinkedMap.prototype.peek = function() {\n  return this.head_.next.value;\n};\n\n\n/**\n * Returns the value of the last node without making any modifications.\n * @return {VALUE} The value of the last node or undefined if the map is empty.\n */\ngoog.structs.LinkedMap.prototype.peekLast = function() {\n  return this.head_.prev.value;\n};\n\n\n/**\n * Removes the first node from the list and returns its value.\n * @return {VALUE} The value of the popped node, or undefined if the map was\n *     empty.\n */\ngoog.structs.LinkedMap.prototype.shift = function() {\n  return this.popNode_(this.head_.next);\n};\n\n\n/**\n * Removes the last node from the list and returns its value.\n * @return {VALUE} The value of the popped node, or undefined if the map was\n *     empty.\n */\ngoog.structs.LinkedMap.prototype.pop = function() {\n  return this.popNode_(this.head_.prev);\n};\n\n\n/**\n * Removes a value from the LinkedMap based on its key.\n * @param {string} key The key to remove.\n * @return {boolean} True if the entry was removed, false if the key was not\n *     found.\n */\ngoog.structs.LinkedMap.prototype.remove = function(key) {\n  var node = this.map_.get(key);\n  if (node) {\n    this.removeNode(node);\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Removes a node from the `LinkedMap`. It can be overridden to do\n * further cleanup such as disposing of the node value.\n * @param {!goog.structs.LinkedMap.Node_<string, VALUE>} node The node to\n *     remove.\n * @protected\n */\ngoog.structs.LinkedMap.prototype.removeNode = function(node) {\n  node.remove();\n  this.map_.remove(node.key);\n};\n\n\n/**\n * @return {number} The number of items currently in the LinkedMap. Sub classes\n *     may override this to change how items are counted (e.g. to introduce\n *     per item weight). Truncation will always proceed as long as the count\n *     returned from this method is higher than the max count for this map.\n */\ngoog.structs.LinkedMap.prototype.getCount = function() {\n  return this.map_.getCount();\n};\n\n\n/**\n * @return {boolean} True if the cache is empty, false if it contains any items.\n */\ngoog.structs.LinkedMap.prototype.isEmpty = function() {\n  return this.map_.isEmpty();\n};\n\n\n/**\n * Sets a callback that fires when an entry is evicted because max entry\n * count is reached. The callback is called with the removed stringified key\n * as the first argument and value as the second argument after the key was\n * evicted from the LRU because the max count was reached.\n * @param {function(string, VALUE)} evictionCallback\n */\ngoog.structs.LinkedMap.prototype.setEvictionCallback = function(\n    evictionCallback) {\n  this.evictionCallback_ = evictionCallback;\n};\n\n\n/**\n * Sets the maximum number of entries allowed in this object, truncating any\n * excess objects if necessary.\n * @param {number} maxCount The new maximum number of entries to allow.\n */\ngoog.structs.LinkedMap.prototype.setMaxCount = function(maxCount) {\n  this.maxCount_ = maxCount || null;\n  if (this.maxCount_ != null) {\n    this.truncate_(this.maxCount_);\n  }\n};\n\n\n/**\n * @return {!Array<string>} The list of the keys in the appropriate order for\n *     this LinkedMap.\n */\ngoog.structs.LinkedMap.prototype.getKeys = function() {\n  return this.map(function(val, key) { return key; });\n};\n\n\n/**\n * @return {!Array<VALUE>} The list of the values in the appropriate order for\n *     this LinkedMap.\n */\ngoog.structs.LinkedMap.prototype.getValues = function() {\n  return this.map(function(val, key) { return val; });\n};\n\n\n/**\n * Tests whether a provided value is currently in the LinkedMap. This does not\n * affect item ordering in cache-style LinkedMaps.\n * @param {VALUE} value The value to check for.\n * @return {boolean} Whether the value is in the LinkedMap.\n */\ngoog.structs.LinkedMap.prototype.contains = function(value) {\n  return this.some(function(el) { return el == value; });\n};\n\n\n/**\n * Tests whether a provided key is currently in the LinkedMap. This does not\n * affect item ordering in cache-style LinkedMaps.\n * @param {string} key The key to check for.\n * @return {boolean} Whether the key is in the LinkedMap.\n */\ngoog.structs.LinkedMap.prototype.containsKey = function(key) {\n  return this.map_.containsKey(key);\n};\n\n\n/**\n * Removes all entries in this object.\n */\ngoog.structs.LinkedMap.prototype.clear = function() {\n  this.truncate_(0);\n};\n\n\n/**\n * Calls a function on each item in the LinkedMap.\n *\n * @see goog.structs.forEach\n * @param {function(this:T, VALUE, KEY, goog.structs.LinkedMap<KEY, VALUE>)} f\n * @param {T=} opt_obj The value of \"this\" inside f.\n * @template T\n */\ngoog.structs.LinkedMap.prototype.forEach = function(f, opt_obj) {\n  for (var n = this.head_.next; n != this.head_; n = n.next) {\n    f.call(opt_obj, n.value, n.key, this);\n  }\n};\n\n\n/**\n * Calls a function on each item in the LinkedMap and returns the results of\n * those calls in an array.\n *\n * @see goog.structs.map\n * @param {function(this:T, VALUE, KEY,\n *         goog.structs.LinkedMap<KEY, VALUE>): RESULT} f\n *     The function to call for each item. The function takes\n *     three arguments: the value, the key, and the LinkedMap.\n * @param {T=} opt_obj The object context to use as \"this\" for the\n *     function.\n * @return {!Array<RESULT>} The results of the function calls for each item in\n *     the LinkedMap.\n * @template T,RESULT\n */\ngoog.structs.LinkedMap.prototype.map = function(f, opt_obj) {\n  var rv = [];\n  for (var n = this.head_.next; n != this.head_; n = n.next) {\n    rv.push(f.call(opt_obj, n.value, n.key, this));\n  }\n  return rv;\n};\n\n\n/**\n * Calls a function on each item in the LinkedMap and returns true if any of\n * those function calls returns a true-like value.\n *\n * @see goog.structs.some\n * @param {function(this:T, VALUE, KEY,\n *         goog.structs.LinkedMap<KEY, VALUE>):boolean} f\n *     The function to call for each item. The function takes\n *     three arguments: the value, the key, and the LinkedMap, and returns a\n *     boolean.\n * @param {T=} opt_obj The object context to use as \"this\" for the\n *     function.\n * @return {boolean} Whether f evaluates to true for at least one item in the\n *     LinkedMap.\n * @template T\n */\ngoog.structs.LinkedMap.prototype.some = function(f, opt_obj) {\n  for (var n = this.head_.next; n != this.head_; n = n.next) {\n    if (f.call(opt_obj, n.value, n.key, this)) {\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Calls a function on each item in the LinkedMap and returns true only if every\n * function call returns a true-like value.\n *\n * @see goog.structs.some\n * @param {function(this:T, VALUE, KEY,\n *         goog.structs.LinkedMap<KEY, VALUE>):boolean} f\n *     The function to call for each item. The function takes\n *     three arguments: the value, the key, and the Cache, and returns a\n *     boolean.\n * @param {T=} opt_obj The object context to use as \"this\" for the\n *     function.\n * @return {boolean} Whether f evaluates to true for every item in the Cache.\n * @template T\n */\ngoog.structs.LinkedMap.prototype.every = function(f, opt_obj) {\n  for (var n = this.head_.next; n != this.head_; n = n.next) {\n    if (!f.call(opt_obj, n.value, n.key, this)) {\n      return false;\n    }\n  }\n  return true;\n};\n\n\n/**\n * Appends a node to the list. LinkedMap in cache mode adds new nodes to\n * the head of the list, otherwise they are appended to the tail. If there is a\n * maximum size, the list will be truncated if necessary.\n *\n * @param {goog.structs.LinkedMap.Node_<string, VALUE>} node The item to insert.\n * @private\n */\ngoog.structs.LinkedMap.prototype.insert_ = function(node) {\n  if (this.cache_) {\n    node.next = this.head_.next;\n    node.prev = this.head_;\n\n    this.head_.next = node;\n    node.next.prev = node;\n  } else {\n    node.prev = this.head_.prev;\n    node.next = this.head_;\n\n    this.head_.prev = node;\n    node.prev.next = node;\n  }\n\n  if (this.maxCount_ != null) {\n    this.truncate_(this.maxCount_);\n  }\n};\n\n\n/**\n * Removes elements from the LinkedMap if the given count has been exceeded.\n * In cache mode removes nodes from the tail of the list. Otherwise removes\n * nodes from the head.\n * @param {number} count Number of elements to keep.\n * @private\n */\ngoog.structs.LinkedMap.prototype.truncate_ = function(count) {\n  while (this.getCount() > count) {\n    var toRemove = this.cache_ ? this.head_.prev : this.head_.next;\n    this.removeNode(toRemove);\n    if (this.evictionCallback_) {\n      this.evictionCallback_(toRemove.key, toRemove.value);\n    }\n  }\n};\n\n\n/**\n * Removes the node from the LinkedMap if it is not the head, and returns\n * the node's value.\n * @param {!goog.structs.LinkedMap.Node_<string, VALUE>} node The item to\n *     remove.\n * @return {VALUE} The value of the popped node.\n * @private\n */\ngoog.structs.LinkedMap.prototype.popNode_ = function(node) {\n  if (this.head_ != node) {\n    this.removeNode(node);\n  }\n  return node.value;\n};\n\n\n\n/**\n * Internal class for a doubly-linked list node containing a key/value pair.\n * @param {KEY} key The key.\n * @param {VALUE} value The value.\n * @constructor\n * @template KEY, VALUE\n * @private\n */\ngoog.structs.LinkedMap.Node_ = function(key, value) {\n  /** @type {KEY} */\n  this.key = key;\n\n  /** @type {VALUE} */\n  this.value = value;\n};\n\n\n/**\n * The next node in the list.\n * @type {!goog.structs.LinkedMap.Node_<KEY, VALUE>}\n */\ngoog.structs.LinkedMap.Node_.prototype.next;\n\n\n/**\n * The previous node in the list.\n * @type {!goog.structs.LinkedMap.Node_<KEY, VALUE>}\n */\ngoog.structs.LinkedMap.Node_.prototype.prev;\n\n\n/**\n * Causes this node to remove itself from the list.\n */\ngoog.structs.LinkedMap.Node_.prototype.remove = function() {\n  this.prev.next = this.next;\n  this.next.prev = this.prev;\n\n  delete this.prev;\n  delete this.next;\n};\n","^;",1579837703000,"^<",["^=",["~$goog.structs.Map","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/linkedmap.js"],"^O",["^=",["~$goog.structs.LinkedMap"]],"^W",true,"^X",["^?","^5Q"]],["^ ","^3",[1579837703000],"^4","goog.messaging.messaging.js","^5",["^6","goog/messaging/messaging.js"],"^7","goog/messaging/messaging.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions for manipulating message channels.\n *\n */\n\ngoog.provide('goog.messaging');\n\ngoog.forwardDeclare('goog.messaging.MessageChannel');\n\n\n/**\n * Creates a bidirectional pipe between two message channels.\n *\n * @param {goog.messaging.MessageChannel} channel1 The first channel.\n * @param {goog.messaging.MessageChannel} channel2 The second channel.\n */\ngoog.messaging.pipe = function(channel1, channel2) {\n  channel1.registerDefaultService(goog.bind(channel2.send, channel2));\n  channel2.registerDefaultService(goog.bind(channel1.send, channel1));\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/messaging.js"],"^O",["^=",["~$goog.messaging"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^3?",true,"^4","goog.labs.useragent.test_agents.js","^5",["^6","goog/labs/useragent/test_agents.js"],"^7","goog/labs/useragent/test_agents.js","^8","^9","^:","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the 'License');\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an 'AS-IS' BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Various User-Agent strings.\n * See http://go/useragentexamples and http://www.useragentstring.com/ for\n * examples.\n *\n * @author martone@google.com (Andy Martone)\n */\n\ngoog.module('goog.labs.userAgent.testAgents');\ngoog.setTestOnly();\n\nconst testAgents = {};\n\n\n/** @const {string} */\ntestAgents.ANDROID_BROWSER_235 =\n    'Mozilla/5.0 (Linux; U; Android 2.3.5; en-us; ' +\n    'HTC Vision Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) ' +\n    'Version/4.0 Mobile Safari/533.1';\n\n\n/** @const {string} */\ntestAgents.ANDROID_BROWSER_221 =\n    'Mozilla/5.0 (Linux; U; Android 2.2.1; en-ca; LG-P505R Build/FRG83)' +\n    ' AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1';\n\n\n/** @const {string} */\ntestAgents.ANDROID_BROWSER_233 =\n    'Mozilla/5.0 (Linux; U; Android 2.3.3; en-us; HTC_DesireS_S510e' +\n    ' Build/GRI40) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0' +\n    ' Mobile Safari/533.1';\n\n\n/** @const {string} */\ntestAgents.ANDROID_BROWSER_403 =\n    'Mozilla/5.0 (Linux; U; Android 4.0.3; de-ch; HTC Sensation Build/IML74K)' +\n    ' AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30';\n\n\n/** @const {string} */\n// User agent retrieved from dremel queries for cases matching b/13222688\ntestAgents.ANDROID_BROWSER_403_ALT =\n    'Mozilla/5.0 (Linux; U; Android 4.0.3; ko-kr; LG-L160L Build/IML74K)' +\n    ' AppleWebkit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30';\n\n\n// Chromium for Android. Found in Android 4.4+ devices based on AOSP, but never\n// in the 'Google' devices (where only Google Chrome is shipped).\n// UA string matches Chromium based WebView exactly, see ANDROID_WEB_VIEW_4_4.\n/** @const {string} */\ntestAgents.ANDROID_BROWSER_4_4 =\n    'Mozilla/5.0 (Linux; Android 4.4.2; S8 Build/KOT49H) ' +\n    'AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 ' +\n    'Chrome/30.0.0.0 Mobile Safari/537.36';\n\n\n// See https://developer.chrome.com/multidevice/user-agent\n/** @const {string} */\ntestAgents.ANDROID_WEB_VIEW_4_1_1 =\n    'Mozilla/5.0 (Linux; U; Android 4.1.1; en-gb; Build/KLP) ' +\n    'AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Safari/534.30';\n\n\n// See https://developer.chrome.com/multidevice/user-agent\n/** @const {string} */\ntestAgents.ANDROID_WEB_VIEW_4_4 =\n    'Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/_BuildID_) ' +\n    'AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 ' +\n    'Chrome/30.0.0.0 Mobile Safari/537.36';\n\n\n/** @const {string} */\ntestAgents.IE_6 = 'Mozilla/5.0 (Windows; U; MSIE 6.0; Windows NT 5.1; SV1;' +\n    '.NET CLR 2.0.50727)';\n\n\n/** @const {string} */\ntestAgents.IE_7 = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)';\n\n\n/** @const {string} */\ntestAgents.IE_8 =\n    'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)';\n\n\n/** @const {string} */\ntestAgents.IE_8_COMPATIBILITY =\n    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/4.0)';\n\n\n/** @const {string} */\ntestAgents.IE_9 =\n    'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)';\n\n\n/** @const {string} */\ntestAgents.IE_9_COMPATIBILITY =\n    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0)';\n\n\n/** @const {string} */\ntestAgents.IE_10 =\n    'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)';\n\n\n/** @const {string} */\ntestAgents.IE_10_COMPATIBILITY =\n    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/6.0)';\n\n\n/**\n * http://blogs.windows.com/windows_phone/b/wpdev/archive/2012/10/17/getting-websites-ready-for-internet-explorer-10-on-windows-phone-8.aspx\n * @const {string}\n */\ntestAgents.IE_10_MOBILE =\n    'Mozilla/5.0 (compatible; MSIE 10.0; Windows Phone 8.0; Trident/6.0; ' +\n    'IEMobile/10.0; ARM; Touch; NOKIA; Lumia 820)';\n\n\n/** @const {string} */\ntestAgents.IE_11 =\n    'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko';\n\n\n/** @const {string} */\ntestAgents.IE_11_COMPATIBILITY_MSIE_7 =\n    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; Trident/7.0; ' +\n    '.NET4.0E; .NET4.0C)';\n\n\n/** @const {string} */\ntestAgents.IE_11_COMPATIBILITY_MSIE_9 =\n    'Mozilla/5.0 (MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; ' +\n    'rv:11.0) like Gecko';\n\n\n/**\n * https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396#edge\n * @const {string}\n */\ntestAgents.EDGE_12_0 =\n    'Mozilla/5.0 (Windows NT 6.4; WOW64) AppleWebKit/537.36 ' +\n    '(KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36 Edge/12.0';\n\n\n/** @const {string} */\ntestAgents.EDGE_12_9600 =\n    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' +\n    '(KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.9600';\n\n/** @const {string} */\ntestAgents.EDGE_CHROMIUM =\n    'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 ' +\n    '(KHTML, like Gecko) Chrome/74.0.3729.48 Safari/537.36 Edg/74.1.96.24';\n\n/** @const {string} */\ntestAgents.FIREFOX_19 =\n    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:19.0) ' +\n    'Gecko/20100101 Firefox/19.0';\n\n\n/** @const {string} */\ntestAgents.FIREFOX_LINUX =\n    'Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:15.0) Gecko/20100101' +\n    ' Firefox/15.0.1';\n\n\n/** @const {string} */\ntestAgents.FIREFOX_MAC =\n    'Mozilla/6.0 (Macintosh; I; Intel Mac OS X 11_7_9; de-LI; rv:1.9b4)' +\n    ' Gecko/2012010317 Firefox/10.0a4';\n\n\n/** @const {string} */\ntestAgents.FIREFOX_WINDOWS =\n    'Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20120403211507' +\n    ' Firefox/14.0.1';\n\n/** @const {string} */\ntestAgents.FIREFOX_IPHONE =\n    'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X; en-us) ' +\n    'AppleWebKit/600.1.4 (KHTML, like Gecko)' +\n    'FxiOS/1.0 Mobile/12F69 Safari/600.1.4';\n\n/** @const {string} */\ntestAgents.SAFARI_6 = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_1) ' +\n    'AppleWebKit/536.25 (KHTML, like Gecko) ' +\n    'Version/6.0 Safari/536.25';\n\n\n/** @const {string} */\ntestAgents.SAFARI_IPHONE_32 =\n    'Mozilla/5.0(iPhone; U; CPU iPhone OS 3_2 like Mac OS X; en-us)' +\n    ' AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B314' +\n    ' Safari/531.21.10';\n\n\n/** @const {string} */\ntestAgents.SAFARI_IPHONE_421 =\n    'Mozilla/5.0 (iPhone; U; ru; CPU iPhone OS 4_2_1 like Mac OS X; ru)' +\n    ' AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8C148a' +\n    ' Safari/6533.18.5';\n\n\n/** @const {string} */\ntestAgents.SAFARI_IPHONE_431 =\n    'Mozilla/5.0 (iPhone; U; CPU iPhone OS 4_3_1 like Mac OS X; zh-tw)' +\n    ' AppleWebKit/533.17.9 (KHTML, like Gecko) Version/5.0.2 Mobile/8G4' +\n    ' Safari/6533.18.5';\n\n\n/** @const {string} */\ntestAgents.SAFARI_IPHONE_6 =\n    'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X)' +\n    ' AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e' +\n    ' Safari/8536.25';\n\n\n/** @const {string} */\ntestAgents.SAFARI_IPOD =\n    'Mozila/5.0 (iPod; U; CPU like Mac OS X; en) AppleWebKit/420.1' +\n    ' (KHTML, like Gecko) Version/3.0 Mobile/3A101a Safari/419.3';\n\n\n/** @const {string} */\ntestAgents.SAFARI_MAC =\n    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_6_8) AppleWebKit/537.13+' +\n    ' (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2';\n\n\n/** @const {string} */\ntestAgents.SAFARI_WINDOWS =\n    'Mozilla/5.0 (Windows; U; Windows NT 6.1; tr-TR) AppleWebKit/533.20.25' +\n    ' (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27';\n\n/**\n * The user-agent for desktop Safari and iPadOS Safari are identical and require\n * runtime examination.\n * @const {string}\n */\ntestAgents.SAFARI_13 =\n    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15) AppleWebKit/605.1.15' +\n    ' (KHTML, like Gecko) Version/13.0 Safari/605.1.15';\n\n/** @const {string} */\ntestAgents.COAST =\n    'Mozilla/5.0 (iPad; CPU OS 7_0_2 like Mac OS X) AppleWebKit/537.51.1' +\n    ' (KHTML like Gecko) Coast/1.1.2.64598 Mobile/11B511 Safari/7534.48.3';\n\n\n/** @const {string} */\ntestAgents.WEBVIEW_IPHONE =\n    'Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26' +\n    ' (KHTML, like Gecko) Mobile/10A403';\n\n\n/** @const {string} */\ntestAgents.WEBVIEW_IPAD =\n    'Mozilla/5.0 (iPad; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26' +\n    ' (KHTML, like Gecko) Mobile/10A403';\n\n\n/** @const {string} */\ntestAgents.OPERA_MINI =\n    'Opera/9.80 (Android; Opera Mini/7.6.35766/35.5706; U; en)' +\n    ' Presto/2.8.119 Version/11.10';\n\n\n/** @const {string} */\ntestAgents.OPERA_10 = 'Opera/9.80 (S60; SymbOS; Opera Mobi/447; U; en) ' +\n    'Presto/2.4.18 Version/10.00';\n\n\n/** @const {string} */\ntestAgents.OPERA_LINUX =\n    'Opera/9.80 (X11; Linux x86_64; U; fr) Presto/2.9.168 Version/11.50';\n\n\n/** @const {string} */\ntestAgents.OPERA_MAC =\n    'Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; fr) Presto/2.9.168' +\n    ' Version/11.52';\n\n\n/** @const {string} */\ntestAgents.OPERA_15 =\n    'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 ' +\n    '(KHTML, like Gecko) Chrome/28.0.1500.52 Safari/537.36 OPR/15.0.1147.100';\n\n\n/** @const {string} */\ntestAgents.IPAD_4 = 'Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us)' +\n    ' AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b' +\n    ' Safari/531.21.10';\n\n\n/** @const {string} */\ntestAgents.IPAD_5 =\n    'Mozilla/5.0 (iPad; CPU OS 5_1 like Mac OS X; en-us) AppleWebKit/534.46' +\n    ' (KHTML, like Gecko) Version/5.1 Mobile/9B176 Safari/7534.48.3';\n\n\n/** @const {string} */\ntestAgents.IPAD_6 = 'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) ' +\n    'AppleWebKit/536.26 (KHTML, like Gecko) ' +\n    'Version/6.0 Mobile/10A403 Safari/8536.25';\n\n\n/** @const {string} */\ntestAgents.CHROME_25 = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) ' +\n    'AppleWebKit/535.8 (KHTML, like Gecko) ' +\n    'Chrome/25.0.1000.10 Safari/535.8';\n\n\n/** @const {string} */\ntestAgents.CHROME_ANDROID =\n    'Mozilla/5.0 (Linux; U; Android 4.0.2; en-us; Galaxy Nexus Build/ICL53F) ' +\n    'AppleWebKit/535.7 (KHTML, like Gecko) Chrome/18.0.1025.133 Mobile ' +\n    'Safari/535.7';\n\n\n/** @const {string} */\ntestAgents.CHROME_ANDROID_PHONE_4_4 =\n    'Mozilla/5.0 (Linux; Android 4.4.2; S8 Build/KOT49H) ' +\n    'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Mobile ' +\n    'Safari/537.36';\n\n\n/** @const {string} */\ntestAgents.CHROME_ANDROID_TABLET =\n    'Mozilla/5.0 (Linux; Android 4.0.4; Galaxy Nexus Build/IMM76B) ' +\n    'AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.133 Safari/535.19';\n\n\n/** @const {string} */\ntestAgents.CHROME_ANDROID_TABLET_4_4 =\n    'Mozilla/5.0 (Linux; Android 4.4.4; Nexus 7 Build/KTU84P) ' +\n    'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.93 Safari/537.36';\n\n\n/** @const {string} */\ntestAgents.CHROME_IPHONE =\n    'Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X; en-us) ' +\n    'AppleWebKit/534.46.0 (KHTML, like Gecko) CriOS/22.0.1194.0 Mobile/11E53 ' +\n    'Safari/7534.48.3';\n\n\n/** @const {string} */\ntestAgents.CHROME_IPAD = 'Mozilla/5.0 (iPad; CPU OS 7_0_4 like Mac OS X) ' +\n    'AppleWebKit/537.51.1 (KHTML, like Gecko) CriOS/32.0.1700.20 ' +\n    'Mobile/11B554a Safari/9537.53';\n\n\n/** @const {string} */\ntestAgents.CHROME_LINUX =\n    'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko)' +\n    ' Chrome/26.0.1410.33 Safari/537.31';\n\n\n/**\n * We traditionally use Appversion to detect X11\n * @const {string}\n */\ntestAgents.CHROME_LINUX_APPVERVERSION =\n    '5.0 (X11; Linux x86_64) AppleWebKit/537.31 (KHTML, like Gecko)' +\n    ' Chrome/26.0.1410.33 Safari/537.31';\n\n\n/** @const {string} */\ntestAgents.CHROME_MAC =\n    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17' +\n    ' (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17';\n\n\n/** @const {string} */\ntestAgents.CHROME_OS =\n    'Mozilla/5.0 (X11; CrOS x86_64 3701.62.0) AppleWebKit/537.31 ' +\n    '(KHTML, like Gecko) Chrome/26.0.1410.40 Safari/537.31';\n\n\n/** @const {string} */\ntestAgents.CHROME_OS_910 =\n    'Mozilla/5.0 (X11; U; CrOS i686 9.10.0; en-US) AppleWebKit/532.5' +\n    ' (KHTML, like Gecko) Chrome/4.0.253.0 Safari/532.5';\n\n/** @const {string} */\ntestAgents.CHROMECAST =\n    'Mozilla/5.0 (CrKey armv7l 1.5.16041) AppleWebKit/537.36' +\n    ' (KHTML, like Gecko) Chrome/31.0.1650.0 Safari/537.36';\n\n/** @const {string} */\ntestAgents.KINDLE_FIRE =\n    'Mozilla/5.0 (Linux; U; Android 4.0.3; en-us; KFTT Build/IML74K)' +\n    ' AppleWebKit/535.19 (KHTML, like Gecko) Silk/2.1 Mobile Safari/535.19' +\n    ' Silk-Accelerated=true';\n\n\n/** @const {string} */\ntestAgents.FIREFOX_ANDROID_TABLET =\n    'Mozilla/5.0 (Android; Tablet; rv:28.0) Gecko/28.0 Firefox/28.0';\n\n/** @const {string} */\ntestAgents.KAIOS =\n    'Mozilla/5.0 (Mobile; LYF/F90M/LYF_F90M_000-03-19-240319; Android; ' +\n    'rv:48.0) Gecko/48.0 Firefox/48.0 KAIOS/2.5';\n\n/** @const {string} */\ntestAgents.GO2PHONE =\n    'Mozilla/5.0 (Linux; Android 8.1.0; GAFP sp9820e_1h10_go_native)' +\n    ' AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3605.0 Mobile' +\n    ' Safari/537.36';\n\nexports = testAgents;\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/useragent/test_agents.js"],"^O",["^=",["~$goog.labs.userAgent.testAgents"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.ui.keyboardshortcuthandler.js","^5",["^6","goog/ui/keyboardshortcuthandler.js"],"^7","goog/ui/keyboardshortcuthandler.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Generic keyboard shortcut handler.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/keyboardshortcuts.html\n */\n\ngoog.provide('goog.ui.KeyboardShortcutEvent');\ngoog.provide('goog.ui.KeyboardShortcutHandler');\ngoog.provide('goog.ui.KeyboardShortcutHandler.EventType');\ngoog.provide('goog.ui.KeyboardShortcutHandler.Modifiers');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.events.KeyNames');\ngoog.require('goog.events.Keys');\ngoog.require('goog.object');\ngoog.require('goog.ui.KeyboardEventData');\ngoog.require('goog.ui.SyntheticKeyboardEvent');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Component for handling keyboard shortcuts. A shortcut is registered and bound\n * to a specific identifier. Once the shortcut is triggered an event is fired\n * with the identifier for the shortcut. This allows keyboard shortcuts to be\n * customized without modifying the code that listens for them.\n *\n * Supports keyboard shortcuts triggered by a single key, a stroke stroke (key\n * plus at least one modifier) and a sequence of keys or strokes.\n *\n * @param {goog.events.EventTarget|EventTarget} keyTarget Event target that the\n *     key event listener is attached to, typically the applications root\n *     container.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.ui.KeyboardShortcutHandler = function(keyTarget) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * Registered keyboard shortcuts tree. Stored as a map with the keyCode and\n   * modifier(s) as the key and either a list of further strokes or the shortcut\n   * task identifier as the value.\n   * @type {!goog.ui.KeyboardShortcutHandler.SequenceTree_}\n   * @see #makeStroke_\n   * @private\n   */\n  this.shortcuts_ = {};\n\n  /**\n   * The currently active shortcut sequence tree, which represents the position\n   * in the complete shortcuts_ tree reached by recent key strokes.\n   * @type {!goog.ui.KeyboardShortcutHandler.SequenceTree_}\n   * @private\n   */\n  this.currentTree_ = this.shortcuts_;\n\n  /**\n   * The time (in ms, epoch time) of the last keystroke which made progress in\n   * the shortcut sequence tree (i.e. the time that currentTree_ was last set).\n   * Used for timing out stroke sequences.\n   * @type {number}\n   * @private\n   */\n  this.lastStrokeTime_ = 0;\n\n  /**\n   * List of numeric key codes for keys that are safe to always regarded as\n   * shortcuts, even if entered in a textarea or input field.\n   * @type {Object}\n   * @private\n   */\n  this.globalKeys_ = goog.object.createSet(\n      goog.ui.KeyboardShortcutHandler.DEFAULT_GLOBAL_KEYS_);\n\n  /**\n   * List of input types that should only accept ENTER as a shortcut.\n   * @type {Object}\n   * @private\n   */\n  this.textInputs_ = goog.object.createSet(\n      goog.ui.KeyboardShortcutHandler.DEFAULT_TEXT_INPUTS_);\n\n  /**\n   * Whether to always prevent the default action if a shortcut event is fired.\n   * @type {boolean}\n   * @private\n   */\n  this.alwaysPreventDefault_ = true;\n\n  /**\n   * Whether to always stop propagation if a shortcut event is fired.\n   * @type {boolean}\n   * @private\n   */\n  this.alwaysStopPropagation_ = false;\n\n  /**\n   * Whether to treat all shortcuts as if they had been passed\n   * to setGlobalKeys().\n   * @type {boolean}\n   * @private\n   */\n  this.allShortcutsAreGlobal_ = false;\n\n  /**\n   * Whether to treat shortcuts with modifiers as if they had been passed\n   * to setGlobalKeys().  Ignored if allShortcutsAreGlobal_ is true.  Applies\n   * only to form elements (not content-editable).\n   * @type {boolean}\n   * @private\n   */\n  this.modifierShortcutsAreGlobal_ = true;\n\n  /**\n   * Whether to treat space key as a shortcut when the focused element is a\n   * checkbox, radiobutton or button.\n   * @type {boolean}\n   * @private\n   */\n  this.allowSpaceKeyOnButtons_ = false;\n\n  /**\n   * Tracks the currently pressed shortcut key, for Firefox.\n   * @type {?number}\n   * @private\n   */\n  this.activeShortcutKeyForGecko_ = null;\n\n  this.initializeKeyListener(keyTarget);\n};\ngoog.inherits(goog.ui.KeyboardShortcutHandler, goog.events.EventTarget);\ngoog.tagUnsealableClass(goog.ui.KeyboardShortcutHandler);\n\n\n\n/**\n * A node in a keyboard shortcut sequence tree. A node is either:\n * 1. A terminal node with a non-nullable shortcut string which is the\n *    identifier for the shortcut triggered by traversing the tree to that node.\n * 2. An internal node with a null shortcut string and a\n *    `goog.ui.KeyboardShortcutHandler.SequenceTree_` representing the\n *    continued stroke sequences from this node.\n * For clarity, the static factory methods for creating internal and terminal\n * nodes below should be used rather than using this constructor directly.\n * @param {string=} opt_shortcut The shortcut identifier, for terminal nodes.\n * @constructor\n * @struct\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.SequenceNode_ = function(opt_shortcut) {\n  /** @const {?string} The shorcut action identifier, for terminal nodes. */\n  this.shortcut = opt_shortcut || null;\n\n  /** @const {goog.ui.KeyboardShortcutHandler.SequenceTree_} */\n  this.next = opt_shortcut ? null : {};\n};\n\n\n/**\n * Creates a terminal shortcut sequence node for the given shortcut identifier.\n * @param {string} shortcut The shortcut identifier.\n * @return {!goog.ui.KeyboardShortcutHandler.SequenceNode_}\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.createTerminalNode_ = function(shortcut) {\n  return new goog.ui.KeyboardShortcutHandler.SequenceNode_(shortcut);\n};\n\n\n/**\n * Creates an internal shortcut sequence node - a non-terminal part of a\n * keyboard sequence.\n * @return {!goog.ui.KeyboardShortcutHandler.SequenceNode_}\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.createInternalNode_ = function() {\n  return new goog.ui.KeyboardShortcutHandler.SequenceNode_();\n};\n\n\n/**\n * A map of strokes (represented as strings) to the nodes reached by those\n * strokes.\n * @typedef {Object<string, goog.ui.KeyboardShortcutHandler.SequenceNode_>}\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.SequenceTree_;\n\n\n/**\n * Maximum allowed delay, in milliseconds, allowed between the first and second\n * key in a key sequence.\n * @type {number}\n */\ngoog.ui.KeyboardShortcutHandler.MAX_KEY_SEQUENCE_DELAY = 1500;  // 1.5 sec\n\n\n/**\n * Bit values for modifier keys.\n * @enum {number}\n */\ngoog.ui.KeyboardShortcutHandler.Modifiers = {\n  NONE: 0,\n  SHIFT: 1,\n  CTRL: 2,\n  ALT: 4,\n  META: 8\n};\n\n\n/**\n * Keys marked as global by default.\n * @type {Array<goog.events.KeyCodes>}\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.DEFAULT_GLOBAL_KEYS_ = [\n  goog.events.KeyCodes.ESC, goog.events.KeyCodes.F1, goog.events.KeyCodes.F2,\n  goog.events.KeyCodes.F3, goog.events.KeyCodes.F4, goog.events.KeyCodes.F5,\n  goog.events.KeyCodes.F6, goog.events.KeyCodes.F7, goog.events.KeyCodes.F8,\n  goog.events.KeyCodes.F9, goog.events.KeyCodes.F10, goog.events.KeyCodes.F11,\n  goog.events.KeyCodes.F12, goog.events.KeyCodes.PAUSE\n];\n\n\n/**\n * Text input types to allow only ENTER shortcuts.\n * Web Forms 2.0 for HTML5: Section 4.10.7 from 29 May 2012.\n * @type {Array<string>}\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.DEFAULT_TEXT_INPUTS_ = [\n  'color', 'date', 'datetime', 'datetime-local', 'email', 'month', 'number',\n  'password', 'search', 'tel', 'text', 'time', 'url', 'week'\n];\n\n\n/**\n * Events.\n * @enum {string}\n */\ngoog.ui.KeyboardShortcutHandler.EventType = {\n  SHORTCUT_TRIGGERED: 'shortcut',\n  SHORTCUT_PREFIX: 'shortcut_'\n};\n\n\n/**\n * Cache for name to key code lookup.\n * @type {Object<number>}\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.nameToKeyCodeCache_;\n\n\n/**\n * Target on which to listen for key events.\n * @type {goog.events.EventTarget|EventTarget}\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.keyTarget_;\n\n\n/**\n * Whether a key event is a printable-key event. Windows uses ctrl+alt\n * (alt-graph) keys to type characters on European keyboards. For such keys, we\n * cannot identify whether these keys are used for typing characters when\n * receiving keydown events. Therefore, we set this flag when we receive their\n * respective keypress events and fire shortcut events only when we do not\n * receive them.\n * @type {boolean}\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.isPrintableKey_;\n\n\n/**\n * Static method for getting the key code for a given key.\n * @param {string} name Name of key.\n * @return {number} The key code.\n */\ngoog.ui.KeyboardShortcutHandler.getKeyCode = function(name) {\n  // Build reverse lookup object the first time this method is called.\n  if (!goog.ui.KeyboardShortcutHandler.nameToKeyCodeCache_) {\n    var map = {};\n    for (var key in goog.events.KeyNames) {\n      // Explicitly convert the stringified map keys to numbers and normalize.\n      map[goog.events.KeyNames[key]] =\n          goog.events.KeyCodes.normalizeKeyCode(parseInt(key, 10));\n    }\n    goog.ui.KeyboardShortcutHandler.nameToKeyCodeCache_ = map;\n  }\n\n  // Check if key is in cache.\n  return goog.ui.KeyboardShortcutHandler.nameToKeyCodeCache_[name];\n};\n\n\n/**\n * Sets whether to always prevent the default action when a shortcut event is\n * fired. If false, the default action is prevented only if preventDefault is\n * called on either of the corresponding SHORTCUT_TRIGGERED or SHORTCUT_PREFIX\n * events. If true, the default action is prevented whenever a shortcut event\n * is fired. The default value is true.\n * @param {boolean} alwaysPreventDefault Whether to always call preventDefault.\n */\ngoog.ui.KeyboardShortcutHandler.prototype.setAlwaysPreventDefault = function(\n    alwaysPreventDefault) {\n  this.alwaysPreventDefault_ = alwaysPreventDefault;\n};\n\n\n/**\n * Returns whether the default action will always be prevented when a shortcut\n * event is fired. The default value is true.\n * @see #setAlwaysPreventDefault\n * @return {boolean} Whether preventDefault will always be called.\n */\ngoog.ui.KeyboardShortcutHandler.prototype.getAlwaysPreventDefault = function() {\n  return this.alwaysPreventDefault_;\n};\n\n\n/**\n * Sets whether to always stop propagation for the event when fired. If false,\n * the propagation is stopped only if stopPropagation is called on either of the\n * corresponding SHORT_CUT_TRIGGERED or SHORTCUT_PREFIX events. If true, the\n * event is prevented from propagating beyond its target whenever it is fired.\n * The default value is false.\n * @param {boolean} alwaysStopPropagation Whether to always call\n *     stopPropagation.\n */\ngoog.ui.KeyboardShortcutHandler.prototype.setAlwaysStopPropagation = function(\n    alwaysStopPropagation) {\n  this.alwaysStopPropagation_ = alwaysStopPropagation;\n};\n\n\n/**\n * Returns whether the event will always be stopped from propagating beyond its\n * target when a shortcut event is fired. The default value is false.\n * @see #setAlwaysStopPropagation\n * @return {boolean} Whether stopPropagation will always be called.\n */\ngoog.ui.KeyboardShortcutHandler.prototype.getAlwaysStopPropagation =\n    function() {\n  return this.alwaysStopPropagation_;\n};\n\n\n/**\n * Sets whether to treat all shortcuts (including modifier shortcuts) as if the\n * keys had been passed to the setGlobalKeys function.\n * @param {boolean} allShortcutsGlobal Whether to treat all shortcuts as global.\n */\ngoog.ui.KeyboardShortcutHandler.prototype.setAllShortcutsAreGlobal = function(\n    allShortcutsGlobal) {\n  this.allShortcutsAreGlobal_ = allShortcutsGlobal;\n};\n\n\n/**\n * Returns whether all shortcuts (including modifier shortcuts) are treated as\n * if the keys had been passed to the setGlobalKeys function.\n * @see #setAllShortcutsAreGlobal\n * @return {boolean} Whether all shortcuts are treated as globals.\n */\ngoog.ui.KeyboardShortcutHandler.prototype.getAllShortcutsAreGlobal =\n    function() {\n  return this.allShortcutsAreGlobal_;\n};\n\n\n/**\n * Sets whether to treat shortcuts with modifiers as if the keys had been\n * passed to the setGlobalKeys function.  Ignored if you have called\n * setAllShortcutsAreGlobal(true).  Applies only to form elements (not\n * content-editable).\n * @param {boolean} modifierShortcutsGlobal Whether to treat shortcuts with\n *     modifiers as global.\n */\ngoog.ui.KeyboardShortcutHandler.prototype.setModifierShortcutsAreGlobal =\n    function(modifierShortcutsGlobal) {\n  this.modifierShortcutsAreGlobal_ = modifierShortcutsGlobal;\n};\n\n\n/**\n * Returns whether shortcuts with modifiers are treated as if the keys had been\n * passed to the setGlobalKeys function.  Ignored if you have called\n * setAllShortcutsAreGlobal(true).  Applies only to form elements (not\n * content-editable).\n * @see #setModifierShortcutsAreGlobal\n * @return {boolean} Whether shortcuts with modifiers are treated as globals.\n */\ngoog.ui.KeyboardShortcutHandler.prototype.getModifierShortcutsAreGlobal =\n    function() {\n  return this.modifierShortcutsAreGlobal_;\n};\n\n\n/**\n * Sets whether to treat space key as a shortcut when the focused element is a\n * checkbox, radiobutton or button.\n * @param {boolean} allowSpaceKeyOnButtons Whether to treat space key as a\n *     shortcut when the focused element is a checkbox, radiobutton or button.\n */\ngoog.ui.KeyboardShortcutHandler.prototype.setAllowSpaceKeyOnButtons = function(\n    allowSpaceKeyOnButtons) {\n  this.allowSpaceKeyOnButtons_ = allowSpaceKeyOnButtons;\n};\n\n\n/**\n * Registers a keyboard shortcut.\n * @param {string} identifier Identifier for the task performed by the keyboard\n *                 combination. Multiple shortcuts can be provided for the same\n *                 task by specifying the same identifier.\n * @param {...(number|string|Array<number>)} var_args See below.\n *\n * param {number} keyCode Numeric code for key\n * param {number=} opt_modifiers Bitmap indicating required modifier keys.\n *                goog.ui.KeyboardShortcutHandler.Modifiers.SHIFT, CTRL, ALT,\n *                or META.\n *\n * The last two parameters can be repeated any number of times to create a\n * shortcut using a sequence of strokes. Instead of varargs the second parameter\n * could also be an array where each element would be regarded as a parameter.\n *\n * A string representation of the shortcut can be supplied instead of the last\n * two parameters. In that case the method only takes two arguments, the\n * identifier and the string.\n *\n * Examples:\n *   g               registerShortcut(str, G_KEYCODE)\n *   Ctrl+g          registerShortcut(str, G_KEYCODE, CTRL)\n *   Ctrl+Shift+g    registerShortcut(str, G_KEYCODE, CTRL | SHIFT)\n *   Ctrl+g a        registerShortcut(str, G_KEYCODE, CTRL, A_KEYCODE)\n *   Ctrl+g Shift+a  registerShortcut(str, G_KEYCODE, CTRL, A_KEYCODE, SHIFT)\n *   g a             registerShortcut(str, G_KEYCODE, NONE, A_KEYCODE)\n *\n * Examples using string representation for shortcuts:\n *   g               registerShortcut(str, 'g')\n *   Ctrl+g          registerShortcut(str, 'ctrl+g')\n *   Ctrl+Shift+g    registerShortcut(str, 'ctrl+shift+g')\n *   Ctrl+g a        registerShortcut(str, 'ctrl+g a')\n *   Ctrl+g Shift+a  registerShortcut(str, 'ctrl+g shift+a')\n *   g a             registerShortcut(str, 'g a').\n */\ngoog.ui.KeyboardShortcutHandler.prototype.registerShortcut = function(\n    identifier, var_args) {\n\n  // Add shortcut to shortcuts_ tree\n  goog.ui.KeyboardShortcutHandler.setShortcut_(\n      this.shortcuts_, this.interpretStrokes_(1, arguments), identifier);\n};\n\n\n/**\n * Unregisters a keyboard shortcut by keyCode and modifiers or string\n * representation of sequence.\n *\n * param {number} keyCode Numeric code for key\n * param {number=} opt_modifiers Bitmap indicating required modifier keys.\n *                 goog.ui.KeyboardShortcutHandler.Modifiers.SHIFT, CTRL, ALT,\n *                 or META.\n *\n * The two parameters can be repeated any number of times to create a shortcut\n * using a sequence of strokes.\n *\n * A string representation of the shortcut can be supplied instead see\n * {@link #registerShortcut} for syntax. In that case the method only takes one\n * argument.\n *\n * @param {...(number|string|Array<number>)} var_args String representation, or\n *     array or list of alternating key codes and modifiers.\n */\ngoog.ui.KeyboardShortcutHandler.prototype.unregisterShortcut = function(\n    var_args) {\n  // Remove shortcut from tree.\n  goog.ui.KeyboardShortcutHandler.unsetShortcut_(\n      this.shortcuts_, this.interpretStrokes_(0, arguments));\n};\n\n\n/**\n * Verifies if a particular keyboard shortcut is registered already. It has\n * the same interface as the unregistering of shortcuts.\n *\n * param {number} keyCode Numeric code for key\n * param {number=} opt_modifiers Bitmap indicating required modifier keys.\n *                 goog.ui.KeyboardShortcutHandler.Modifiers.SHIFT, CTRL, ALT,\n *                 or META.\n *\n * The two parameters can be repeated any number of times to create a shortcut\n * using a sequence of strokes.\n *\n * A string representation of the shortcut can be supplied instead see\n * {@link #registerShortcut} for syntax. In that case the method only takes one\n * argument.\n *\n * @param {...(number|string|Array<number>)} var_args String representation, or\n *     array or list of alternating key codes and modifiers.\n * @return {boolean} Whether the specified keyboard shortcut is registered.\n */\ngoog.ui.KeyboardShortcutHandler.prototype.isShortcutRegistered = function(\n    var_args) {\n  return this.checkShortcut_(\n      this.shortcuts_, this.interpretStrokes_(0, arguments));\n};\n\n\n/**\n * Parses the variable arguments for registerShortcut and unregisterShortcut.\n * @param {number} initialIndex The first index of \"args\" to treat as\n *     variable arguments.\n * @param {Object} args The \"arguments\" array passed\n *     to registerShortcut or unregisterShortcut.  Please see the comments in\n *     registerShortcut for list of allowed forms.\n * @return {!Array<Array<string>>} The sequence of strokes,\n *     represented as arrays of strings.\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.interpretStrokes_ = function(\n    initialIndex, args) {\n  var strokes;\n\n  // Build strokes array from string.\n  if (typeof (args[initialIndex]) === 'string') {\n    strokes = goog.array.map(\n        goog.ui.KeyboardShortcutHandler.parseStringShortcut(args[initialIndex]),\n        function(stroke) {\n          goog.asserts.assertNumber(\n              stroke.keyCode, 'A non-modifier key is needed in each stroke.');\n          return goog.ui.KeyboardShortcutHandler.makeStroke_(\n              stroke.key || '', stroke.keyCode, stroke.modifiers);\n        });\n\n    // Build strokes array from arguments list or from array.\n  } else {\n    var strokesArgs = args, i = initialIndex;\n    if (goog.isArray(args[initialIndex])) {\n      strokesArgs = args[initialIndex];\n      i = 0;\n    }\n\n    strokes = [];\n    for (; i < strokesArgs.length; i += 2) {\n      // keyName == '' because this branch is only run on numbers\n      // (corresponding to keyCodes).\n      strokes.push(goog.ui.KeyboardShortcutHandler.makeStroke_(\n          '', strokesArgs[i], strokesArgs[i + 1]));\n    }\n  }\n\n  return strokes;\n};\n\n\n/**\n * Unregisters all keyboard shortcuts.\n */\ngoog.ui.KeyboardShortcutHandler.prototype.unregisterAll = function() {\n  this.shortcuts_ = {};\n};\n\n\n/**\n * Sets the global keys; keys that are safe to always regarded as shortcuts,\n * even if entered in a textarea or input field.\n * @param {Array<number>} keys List of keys.\n */\ngoog.ui.KeyboardShortcutHandler.prototype.setGlobalKeys = function(keys) {\n  this.globalKeys_ = goog.object.createSet(keys);\n};\n\n\n/**\n * @return {!Array<string>} The global keys, i.e. keys that are safe to always\n *     regard as shortcuts, even if entered in a textarea or input field.\n */\ngoog.ui.KeyboardShortcutHandler.prototype.getGlobalKeys = function() {\n  return goog.object.getKeys(this.globalKeys_);\n};\n\n\n/** @override */\ngoog.ui.KeyboardShortcutHandler.prototype.disposeInternal = function() {\n  goog.ui.KeyboardShortcutHandler.superClass_.disposeInternal.call(this);\n  this.unregisterAll();\n  this.clearKeyListener();\n};\n\n\n/**\n * Returns event type for a specific shortcut.\n * @param {string} identifier Identifier for the shortcut task.\n * @return {string} The event type.\n */\ngoog.ui.KeyboardShortcutHandler.prototype.getEventType = function(identifier) {\n\n  return goog.ui.KeyboardShortcutHandler.EventType.SHORTCUT_PREFIX + identifier;\n};\n\n\n/**\n * Builds stroke array from string representation of shortcut.\n * @param {string} s String representation of shortcut.\n * @return {!Array<{key: ?string, keyCode: ?number, modifiers: number}>} The\n *     stroke array.  A null keyCode means no non-modifier key was part of the\n *     stroke.\n */\ngoog.ui.KeyboardShortcutHandler.parseStringShortcut = function(s) {\n  // Normalize whitespace and force to lower case.\n  s = s.replace(/[ +]*\\+[ +]*/g, '+').replace(/[ ]+/g, ' ').toLowerCase();\n\n  // Build strokes array from string, space separates strokes, plus separates\n  // individual keys.\n  var groups = s.split(' ');\n  var strokes = [];\n  for (var group, i = 0; group = groups[i]; i++) {\n    var keys = group.split('+');\n    // Explicitly re-initialize key data (JS does not have block scoping).\n    var keyName = null;\n    var keyCode = null;\n    var modifiers = goog.ui.KeyboardShortcutHandler.Modifiers.NONE;\n    for (var key, j = 0; key = keys[j]; j++) {\n      switch (key) {\n        case 'shift':\n          modifiers |= goog.ui.KeyboardShortcutHandler.Modifiers.SHIFT;\n          continue;\n        case 'ctrl':\n          modifiers |= goog.ui.KeyboardShortcutHandler.Modifiers.CTRL;\n          continue;\n        case 'alt':\n          modifiers |= goog.ui.KeyboardShortcutHandler.Modifiers.ALT;\n          continue;\n        case 'meta':\n          modifiers |= goog.ui.KeyboardShortcutHandler.Modifiers.META;\n          continue;\n      }\n      if (keyCode !== null) {\n        goog.asserts.fail('At most one non-modifier key can be in a stroke.');\n      }\n      keyCode = goog.ui.KeyboardShortcutHandler.getKeyCode(key);\n      goog.asserts.assertNumber(\n          keyCode, 'Key name not found in goog.events.KeyNames: ' + key);\n      keyName = key;\n      break;\n    }\n    strokes.push({key: keyName, keyCode: keyCode, modifiers: modifiers});\n  }\n\n  return strokes;\n};\n\n\n/**\n * Adds a key event listener that triggers {@link #handleKeyDown_} when keys\n * are pressed.\n * @param {goog.events.EventTarget|EventTarget} keyTarget Event target that the\n *     event listener should be attached to.\n * @protected\n */\ngoog.ui.KeyboardShortcutHandler.prototype.initializeKeyListener = function(\n    keyTarget) {\n  this.keyTarget_ = keyTarget;\n\n  goog.events.listen(\n      this.keyTarget_, goog.events.EventType.KEYDOWN,\n      this.handleBrowserKeyDown_, undefined /* opt_capture */, this);\n  goog.events.listen(\n      this.keyTarget_, goog.ui.SyntheticKeyboardEvent.Type.KEYDOWN,\n      this.handleSyntheticKeyDown_, undefined /* opt_capture */, this);\n\n  // Windows uses ctrl+alt keys (a.k.a. alt-graph keys) for typing characters\n  // on European keyboards (e.g. ctrl+alt+e for an an euro sign.) Unfortunately,\n  // Windows browsers do not have any methods except listening to keypress and\n  // keyup events to identify if ctrl+alt keys are really used for inputting\n  // characters. Therefore, we listen to these events and prevent firing\n  // shortcut-key events if ctrl+alt keys are used for typing characters.\n  if (goog.userAgent.WINDOWS) {\n    goog.events.listen(\n        this.keyTarget_, goog.events.EventType.KEYPRESS,\n        this.handleWindowsBrowserKeyPress_, undefined /* opt_capture */, this);\n    goog.events.listen(\n        this.keyTarget_, goog.ui.SyntheticKeyboardEvent.Type.KEYPRESS,\n        this.handleWindowsSyntheticKeyPress_, undefined /* opt_capture */,\n        this);\n  }\n\n  goog.events.listen(\n      this.keyTarget_, goog.events.EventType.KEYUP, this.handleBrowserKeyUp_,\n      undefined /* opt_capture */, this);\n  goog.events.listen(\n      this.keyTarget_, goog.ui.SyntheticKeyboardEvent.Type.KEYUP,\n      this.handleSyntheticKeyUp_, undefined /* opt_capture */, this);\n};\n\n\n/**\n * Keyup handler for events initiated from the browser.\n * @param {!goog.events.BrowserEvent} e The key event.\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.handleBrowserKeyUp_ = function(e) {\n  this.handleKeyUp_(goog.ui.KeyboardEventData.fromBrowserEvent(e));\n};\n\n\n/**\n * Keyup handler for synthetic events.\n * @param {!goog.ui.SyntheticKeyboardEvent} e\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.handleSyntheticKeyUp_ = function(e) {\n  this.handleKeyUp_(e.getData());\n};\n\n\n/**\n * Handler for when a keyup event is fired. Currently only handled on Windows\n * (all browsers) or Gecko (all platforms).\n * @param {!goog.ui.KeyboardEventData} data\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.handleKeyUp_ = function(data) {\n  if (goog.userAgent.GECKO) {\n    this.handleGeckoKeyUp_(data);\n  }\n\n  if (goog.userAgent.WINDOWS) {\n    this.handleWindowsKeyUp_(data);\n  }\n};\n\n\n/**\n * Handler for when a keyup event is fired in Firefox (Gecko).\n * @param {!goog.ui.KeyboardEventData} data\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.handleGeckoKeyUp_ = function(data) {\n  // Firefox triggers buttons on space keyUp instead of keyDown.  So if space\n  // keyDown activated a shortcut, do NOT also trigger the focused button.\n  if (goog.events.KeyCodes.SPACE == this.activeShortcutKeyForGecko_ &&\n      goog.events.KeyCodes.SPACE == data.getKeyCode()) {\n    data.getPreventDefaultFn()();\n  }\n  this.activeShortcutKeyForGecko_ = null;\n};\n\n\n/**\n * Returns whether this event is possibly used for typing a printable character.\n * Windows uses ctrl+alt (a.k.a. alt-graph) keys for typing characters on\n * European keyboards. Since only Firefox provides a method that can identify\n * whether ctrl+alt keys are used for typing characters, we need to check\n * whether Windows sends a keypress event to prevent firing shortcut event if\n * this event is used for typing characters.\n * @param {!goog.ui.KeyboardEventData} data\n * @return {boolean} Whether this event is a possible printable-key event.\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.isPossiblePrintableKey_ = function(\n    data) {\n  return goog.userAgent.WINDOWS && data.getCtrlKey() && data.getAltKey();\n};\n\n\n/**\n * Handler for when a keypress event is fired on Windows.\n * @param {!goog.events.BrowserEvent} e The key event.\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.handleWindowsBrowserKeyPress_ =\n    function(e) {\n  this.handleWindowsKeyPress_(goog.ui.KeyboardEventData.fromBrowserEvent(e));\n};\n\n\n/**\n * Handler for when a synthetic keypress event is fired on Windows.\n * @param {!goog.ui.SyntheticKeyboardEvent} e\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.handleWindowsSyntheticKeyPress_ =\n    function(e) {\n  this.handleWindowsKeyPress_(e.getData());\n};\n\n\n/**\n * Handler for when a keypress event is fired on Windows.\n * @param {!goog.ui.KeyboardEventData} data\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.handleWindowsKeyPress_ = function(\n    data) {\n  // When this keypress event consists of a printable character, set the flag to\n  // prevent firing shortcut key events when we receive the succeeding keyup\n  // event. We accept all Unicode characters except control ones since this\n  // keyCode may be a non-ASCII character.\n  if (data.getKeyCode() > 0x20 && this.isPossiblePrintableKey_(data)) {\n    this.isPrintableKey_ = true;\n  }\n};\n\n\n/**\n * Handler for when a keyup event is fired on Windows.\n * @param {!goog.ui.KeyboardEventData} data\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.handleWindowsKeyUp_ = function(data) {\n  // For possible printable-key events, try firing a shortcut-key event only\n  // when this event is not used for typing a character.\n  if (!this.isPrintableKey_ && this.isPossiblePrintableKey_(data)) {\n    // handleKeyDown should handle possible printable keys since we initially\n    // don't handle them in key down for windows, and instead wait until\n    // key up.\n    this.handleKeyDown_(data, true /* opt_handlePossiblePrintableKeys */);\n  }\n};\n\n\n/**\n * Removes the listener that was added by link {@link #initializeKeyListener}.\n * @protected\n */\ngoog.ui.KeyboardShortcutHandler.prototype.clearKeyListener = function() {\n  goog.events.unlisten(\n      this.keyTarget_, goog.events.EventType.KEYDOWN,\n      this.handleBrowserKeyDown_, false, this);\n  goog.events.unlisten(\n      this.keyTarget_, goog.ui.SyntheticKeyboardEvent.Type.KEYDOWN,\n      this.handleSyntheticKeyDown_, false, this);\n  if (goog.userAgent.WINDOWS) {\n    goog.events.unlisten(\n        this.keyTarget_, goog.events.EventType.KEYPRESS,\n        this.handleWindowsBrowserKeyPress_, false, this);\n    goog.events.unlisten(\n        this.keyTarget_, goog.ui.SyntheticKeyboardEvent.Type.KEYPRESS,\n        this.handleWindowsSyntheticKeyPress_, false, this);\n  }\n  goog.events.unlisten(\n      this.keyTarget_, goog.events.EventType.KEYUP, this.handleBrowserKeyUp_,\n      false, this);\n  goog.events.unlisten(\n      this.keyTarget_, goog.ui.SyntheticKeyboardEvent.Type.KEYUP,\n      this.handleSyntheticKeyUp_, false, this);\n  this.keyTarget_ = null;\n};\n\n\n/**\n * Adds a shortcut stroke sequence to the given sequence tree. Recursive.\n * @param {!goog.ui.KeyboardShortcutHandler.SequenceTree_} tree The stroke\n *     sequence tree to add to.\n * @param {Array<Array<string>>} strokes Array of strokes for shortcut.\n * @param {string} identifier Identifier for the task performed by shortcut.\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.setShortcut_ = function(\n    tree, strokes, identifier) {\n  var stroke = strokes.shift();\n  goog.array.forEach(stroke, function(s) {\n    var node = tree[s];\n    if (node && (strokes.length == 0 || node.shortcut)) {\n      // This new shortcut would override an existing shortcut or shortcut\n      // prefix (since the new strokes end at an existing node), or an existing\n      // shortcut would be triggered by the prefix to this new shortcut (since\n      // there is already a terminal node on the path we are trying to create).\n      throw new Error('Keyboard shortcut conflicts with existing shortcut');\n    }\n  });\n\n  if (strokes.length) {\n    goog.array.forEach(stroke, function(s) {\n      var node = goog.object.setIfUndefined(\n          tree, s.toString(),\n          goog.ui.KeyboardShortcutHandler.createInternalNode_());\n      // setShortcut_ modifies strokes\n      var strokesCopy = strokes.slice(0);\n      goog.ui.KeyboardShortcutHandler.setShortcut_(\n          goog.asserts.assert(\n              node.next, 'An internal node must have a next map'),\n          strokesCopy, identifier);\n    });\n  } else {\n    goog.array.forEach(stroke, function(s) {\n      // Add a terminal node.\n      tree[s] = goog.ui.KeyboardShortcutHandler.createTerminalNode_(identifier);\n    });\n  }\n};\n\n\n/**\n * Removes a shortcut stroke sequence from the given sequence tree, pruning any\n * dead branches of the tree. Recursive.\n * @param {!goog.ui.KeyboardShortcutHandler.SequenceTree_} tree The stroke\n *     sequence tree to remove from.\n * @param {Array<Array<string>>} strokes Array of strokes for shortcut to\n *     remove.\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.unsetShortcut_ = function(tree, strokes) {\n  var stroke = strokes.shift();\n  goog.array.forEach(stroke, function(s) {\n    var node = tree[s];\n\n    if (!node) {\n      // The given stroke sequence is not in the tree.\n      return;\n    }\n    if (strokes.length == 0) {\n      // Base case - the end of the stroke sequence.\n      if (!node.shortcut) {\n        // The given stroke sequence does not end at a terminal node.\n        return;\n      }\n      delete tree[s];\n    } else {\n      if (!node.next) {\n        // The given stroke sequence is not in the tree.\n        return;\n      }\n      // Recursively remove the rest of the shortcut sequence from the node.next\n      // subtree.\n      // unsetShortcut_ modifies strokes\n      var strokesCopy = strokes.slice(0);\n      goog.ui.KeyboardShortcutHandler.unsetShortcut_(node.next, strokesCopy);\n      if (goog.object.isEmpty(node.next)) {\n        // The node.next subtree is now empty (the last stroke in it was just\n        // removed), so prune this dead branch of the tree.\n        delete tree[s];\n      }\n    }\n  });\n};\n\n\n/**\n * Checks tree for a node matching one of stroke.\n * @param {!goog.ui.KeyboardShortcutHandler.SequenceTree_} tree The\n *     stroke sequence tree to find the node in.\n * @param {Array<string>} stroke Stroke to find.\n * @return {goog.ui.KeyboardShortcutHandler.SequenceNode_|undefined} Node matching stroke.\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.getNode_ = function(tree, stroke) {\n  for (var i = 0; i < stroke.length; i++) {\n    var node = tree[stroke[i]];\n    if (!node) {\n      continue;\n    }\n    return node;\n  }\n  return undefined;\n};\n\n/**\n * Checks if a particular keyboard shortcut is registered.\n * @param {goog.ui.KeyboardShortcutHandler.SequenceTree_|null} tree The\n *     stroke sequence tree to find the keyboard shortcut in.\n * @param {Array<Array<string>>} strokes Strokes array.\n * @return {boolean} True iff the keyboard shortcut is registred.\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.checkShortcut_ = function(\n    tree, strokes) {\n  while (strokes.length > 0 && tree) {\n    var stroke = strokes.shift();\n    var node = this.getNode_(tree, stroke);\n    if (!node) {\n      continue;\n    }\n    if (strokes.length == 0 && node.shortcut) {\n      return true;\n    }\n    // checkShortcut_ modifies strokes\n    var strokesCopy = strokes.slice(0);\n    if (this.checkShortcut_(node.next, strokesCopy)) {\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Constructs key identification string from key name, key code and modifiers.\n *\n * @param {string} keyName Key name.\n * @param {number} keyCode Numeric key code.\n * @param {number} modifiers Required modifiers.\n * @return {Array<string>} An array of strings identifying the key/modifier\n *     combinations.\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.makeStroke_ = function(\n    keyName, keyCode, modifiers) {\n  var mods = modifiers || 0;\n  // entries must be usable as key in a map\n  var strokes = ['c_' + keyCode + '_' + mods];\n\n  if (keyName != '') {\n    strokes.push('n_' + keyName + '_' + mods);\n  }\n\n  return strokes;\n};\n\n\n/**\n * Keydown handler for events initiated from the browser.\n * @param {!goog.events.BrowserEvent} event Keypress event.\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.handleBrowserKeyDown_ = function(\n    event) {\n  this.handleKeyDown_(goog.ui.KeyboardEventData.fromBrowserEvent(event));\n};\n\n\n/**\n * Keydown handler for synthetic events.\n * @param {!goog.ui.SyntheticKeyboardEvent} event\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.handleSyntheticKeyDown_ = function(\n    event) {\n  this.handleKeyDown_(event.getData());\n};\n\n\n/**\n * Keydown handler.\n * @param {!goog.ui.KeyboardEventData} data\n * @param {boolean=} opt_handlePossiblePrintableKeys Whether possible printable\n *     keys should be handled. By default, they are ignored, but when the data\n *     comes from keyup they should be handled.\n * @private\n * @suppress {strictPrimitiveOperators} Part of the go/strict_warnings_migration\n */\ngoog.ui.KeyboardShortcutHandler.prototype.handleKeyDown_ = function(\n    data, opt_handlePossiblePrintableKeys) {\n  if (!this.isValidShortcut_(data)) {\n    return;\n  }\n  // For possible printable-key events, we cannot identify whether the events\n  // are used for typing characters until we receive respective keyup events.\n  // Therefore, we handle this event when we receive a succeeding keyup event\n  // to verify this event is not used for typing characters. preventDefault is\n  // not called on the event to avoid disrupting a character input.\n  if (!opt_handlePossiblePrintableKeys && this.isPossiblePrintableKey_(data)) {\n    this.isPrintableKey_ = false;\n    return;\n  }\n\n  var keyCode = goog.events.KeyCodes.normalizeKeyCode(data.getKeyCode());\n  var keyName = data.getKey();\n\n  var modifiers =\n      (data.getShiftKey() ? goog.ui.KeyboardShortcutHandler.Modifiers.SHIFT :\n                            0) |\n      (data.getCtrlKey() ? goog.ui.KeyboardShortcutHandler.Modifiers.CTRL : 0) |\n      (data.getAltKey() ? goog.ui.KeyboardShortcutHandler.Modifiers.ALT : 0) |\n      (data.getMetaKey() ? goog.ui.KeyboardShortcutHandler.Modifiers.META : 0);\n  var stroke =\n      goog.ui.KeyboardShortcutHandler.makeStroke_(keyName, keyCode, modifiers);\n  var node = this.getNode_(this.currentTree_, stroke);\n\n  if (!node || this.hasSequenceTimedOut_()) {\n    // Either this stroke does not continue any active sequence, or the\n    // currently active sequence has timed out. Reset shortcut tree progress.\n    this.setCurrentTree_(this.shortcuts_);\n  }\n\n  node = this.getNode_(this.currentTree_, stroke);\n\n  if (node && node.next) {\n    // This stroke does not trigger a shortcut, but entered stroke(s) are a part\n    // of a sequence. Progress in the sequence tree and record time to allow the\n    // following stroke(s) to trigger the shortcut.\n    this.setCurrentTree_(node.next);\n  }\n\n  if (!node) {\n    // This stroke does not correspond to a shortcut or continued sequence.\n    return;\n  } else if (node.next) {\n    // Prevent default action so that the rest of the stroke sequence can be\n    // completed.\n    data.getPreventDefaultFn()();\n    return;\n  }\n\n  // This stroke triggers a shortcut. Any active sequence has been completed, so\n  // reset the sequence tree.\n  this.setCurrentTree_(this.shortcuts_);\n\n  // Dispatch the triggered keyboard shortcut event. In addition to the generic\n  // keyboard shortcut event a more specific fine grained one, specific for the\n  // shortcut identifier, is fired.\n  if (this.alwaysPreventDefault_) {\n    data.getPreventDefaultFn()();\n  }\n\n  if (this.alwaysStopPropagation_) {\n    data.getStopPropagationFn()();\n  }\n\n  var shortcut = goog.asserts.assertString(\n      node.shortcut, 'A terminal node must have a string shortcut identifier.');\n  // Dispatch SHORTCUT_TRIGGERED event\n  var triggerEvent = new goog.ui.KeyboardShortcutEvent(\n      goog.ui.KeyboardShortcutHandler.EventType.SHORTCUT_TRIGGERED, shortcut,\n      data.getTarget());\n  var retVal = this.dispatchEvent(triggerEvent);\n\n  // Dispatch SHORTCUT_PREFIX_<identifier> event\n  var prefixEvent = new goog.ui.KeyboardShortcutEvent(\n      goog.ui.KeyboardShortcutHandler.EventType.SHORTCUT_PREFIX + shortcut,\n      shortcut, data.getTarget());\n  retVal &= this.dispatchEvent(prefixEvent);\n\n  // The default action is prevented if 'preventDefault' was\n  // called on either event, or if a listener returned false.\n  if (!retVal) {\n    data.getPreventDefaultFn()();\n  }\n\n  // For Firefox, track which shortcut key was pushed.\n  if (goog.userAgent.GECKO) {\n    this.activeShortcutKeyForGecko_ = keyCode;\n  }\n};\n\n\n/**\n * Checks if a given keypress event may be treated as a shortcut.\n * @param {!goog.ui.KeyboardEventData} data\n * @return {boolean} Whether to attempt to process the event as a shortcut.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.KeyboardShortcutHandler.prototype.isValidShortcut_ = function(data) {\n  // Ignore Ctrl, Shift and ALT\n  var keyCode = data.getKeyCode();\n  if (data.getKey() != '') {\n    var keyName = data.getKey();\n    if (keyName == goog.events.Keys.CTRL || keyName == goog.events.Keys.SHIFT ||\n        keyName == goog.events.Keys.ALT ||\n        keyName == goog.events.Keys.ALTGRAPH) {\n      return false;\n    }\n  } else {\n    if (keyCode == goog.events.KeyCodes.SHIFT ||\n        keyCode == goog.events.KeyCodes.CTRL ||\n        keyCode == goog.events.KeyCodes.ALT) {\n      return false;\n    }\n  }\n\n  // RootTarget is used specifically to handle the case of shadow dom.\n  // Note, the type of shadow dom root is limited, and could never be\n  // INPUT, TEXTAREA, BUTTON, SELECT, etc.\n  var el = /** @type {!Element} */ (data.getRootTarget());\n  var isFormElement = el.tagName == goog.dom.TagName.TEXTAREA ||\n      el.tagName == goog.dom.TagName.INPUT ||\n      el.tagName == goog.dom.TagName.BUTTON ||\n      el.tagName == goog.dom.TagName.SELECT;\n\n  var isContentEditable = !isFormElement &&\n      (el.isContentEditable ||\n       (el.ownerDocument && el.ownerDocument.designMode == 'on'));\n\n  if (!isFormElement && !isContentEditable) {\n    return true;\n  }\n  // Always allow keys registered as global to be used (typically Esc, the\n  // F-keys and other keys that are not typically used to manipulate text).\n  if (this.globalKeys_[keyCode] || this.allShortcutsAreGlobal_) {\n    return true;\n  }\n  if (isContentEditable) {\n    // For events originating from an element in editing mode we only let\n    // global key codes through.\n    return false;\n  }\n  // Event target is one of (TEXTAREA, INPUT, BUTTON, SELECT).\n  // Allow modifier shortcuts, unless we shouldn't.\n  if (this.modifierShortcutsAreGlobal_ &&\n      (data.getAltKey() || data.getCtrlKey() || data.getMetaKey())) {\n    return true;\n  }\n  // Allow ENTER to be used as shortcut for text inputs.\n  if (el.tagName == goog.dom.TagName.INPUT && this.textInputs_[el.type]) {\n    return keyCode == goog.events.KeyCodes.ENTER;\n  }\n  // Checkboxes, radiobuttons and buttons. Allow all but SPACE as shortcut.\n  if (el.tagName == goog.dom.TagName.INPUT ||\n      el.tagName == goog.dom.TagName.BUTTON) {\n    // TODO(gboyer): If more flexibility is needed, create protected helper\n    // methods for each case (e.g. button, input, etc).\n    if (this.allowSpaceKeyOnButtons_) {\n      return true;\n    } else {\n      return keyCode != goog.events.KeyCodes.SPACE;\n    }\n  }\n  // Don't allow any additional shortcut keys for textareas or selects.\n  return false;\n};\n\n\n/**\n * @return {boolean} True iff the current stroke sequence has timed out.\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.hasSequenceTimedOut_ = function() {\n  return goog.now() - this.lastStrokeTime_ >=\n      goog.ui.KeyboardShortcutHandler.MAX_KEY_SEQUENCE_DELAY;\n};\n\n\n/**\n * Sets the current keyboard shortcut sequence tree and updates the last stroke\n * time.\n * @param {!goog.ui.KeyboardShortcutHandler.SequenceTree_} tree\n * @private\n */\ngoog.ui.KeyboardShortcutHandler.prototype.setCurrentTree_ = function(tree) {\n  this.currentTree_ = tree;\n  this.lastStrokeTime_ = goog.now();\n};\n\n\n\n/**\n * Object representing a keyboard shortcut event.\n * @param {string} type Event type.\n * @param {string} identifier Task identifier for the triggered shortcut.\n * @param {Node|goog.events.EventTarget} target Target the original key press\n *     event originated from.\n * @extends {goog.events.Event}\n * @constructor\n * @final\n */\ngoog.ui.KeyboardShortcutEvent = function(type, identifier, target) {\n  goog.events.Event.call(this, type, target);\n\n  /**\n   * Task identifier for the triggered shortcut\n   * @type {string}\n   */\n  this.identifier = identifier;\n};\ngoog.inherits(goog.ui.KeyboardShortcutEvent, goog.events.Event);\n","^;",1579837703000,"^<",["^=",["^1L","^5E","^?","^42","^3W","^[","^1C","^1Z","~$goog.ui.SyntheticKeyboardEvent","^2Y","~$goog.events.Keys","^3H","^2O","^1<","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/keyboardshortcuthandler.js"],"^O",["^=",["~$goog.ui.KeyboardShortcutHandler","~$goog.ui.KeyboardShortcutHandler.Modifiers","~$goog.ui.KeyboardShortcutEvent","~$goog.ui.KeyboardShortcutHandler.EventType"]],"^W",true,"^X",["^?","^2O","^1L","^12","^1<","^2Y","^3W","^1C","^3H","^1Z","^5V","^42","^5E","^5U","^["]],["^ ","^3",[1579837703000],"^4","goog.storage.mechanism.mechanismseparationtester.js","^5",["^6","goog/storage/mechanism/mechanismseparationtester.js"],"^7","goog/storage/mechanism/mechanismseparationtester.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Unit tests for storage mechanism separation.\n *\n * These tests should be included by tests of any mechanism which natively\n * implements namespaces. There is no need to include those tests for mechanisms\n * extending goog.storage.mechanism.PrefixedMechanism. Make sure a different\n * namespace is used for each object.\n *\n */\n\ngoog.provide('goog.storage.mechanism.mechanismSeparationTester');\n\ngoog.require('goog.iter.StopIteration');\n/** @suppress {extraRequire} */\ngoog.require('goog.storage.mechanism.mechanismTestDefinition');\ngoog.require('goog.testing.asserts');\n\ngoog.setTestOnly('goog.storage.mechanism.mechanismSeparationTester');\n\n\nfunction testSeparateSet() {\n  if (!mechanism || !mechanism_separate) {\n    return;\n  }\n  mechanism.set('first', 'one');\n  assertNull(mechanism_separate.get('first'));\n  assertEquals(0, mechanism_separate.getCount());\n  assertEquals(\n      goog.iter.StopIteration,\n      assertThrows(mechanism_separate.__iterator__().next));\n}\n\n\nfunction testSeparateSetInverse() {\n  if (!mechanism || !mechanism_separate) {\n    return;\n  }\n  mechanism.set('first', 'one');\n  mechanism_separate.set('first', 'two');\n  assertEquals('one', mechanism.get('first'));\n  assertEquals(1, mechanism.getCount());\n  var iterator = mechanism.__iterator__();\n  assertEquals('one', iterator.next());\n  assertEquals(goog.iter.StopIteration, assertThrows(iterator.next));\n}\n\n\nfunction testSeparateRemove() {\n  if (!mechanism || !mechanism_separate) {\n    return;\n  }\n  mechanism.set('first', 'one');\n  mechanism_separate.remove('first');\n  assertEquals('one', mechanism.get('first'));\n  assertEquals(1, mechanism.getCount());\n  var iterator = mechanism.__iterator__();\n  assertEquals('one', iterator.next());\n  assertEquals(goog.iter.StopIteration, assertThrows(iterator.next));\n}\n\n\nfunction testSeparateClean() {\n  if (!mechanism || !mechanism_separate) {\n    return;\n  }\n  mechanism_separate.set('first', 'two');\n  mechanism.clear();\n  assertEquals('two', mechanism_separate.get('first'));\n  assertEquals(1, mechanism_separate.getCount());\n  var iterator = mechanism_separate.__iterator__();\n  assertEquals('two', iterator.next());\n  assertEquals(goog.iter.StopIteration, assertThrows(iterator.next));\n}\n","^;",1579837703000,"^<",["^=",["~$goog.testing.asserts","^?","~$goog.storage.mechanism.mechanismTestDefinition","~$goog.iter.StopIteration"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/mechanism/mechanismseparationtester.js"],"^O",["^=",["~$goog.storage.mechanism.mechanismSeparationTester"]],"^W",true,"^X",["^?","^61","^60","^5["]],["^ ","^3",[1579837703000],"^4","goog.events.inputhandler.js","^5",["^6","goog/events/inputhandler.js"],"^7","goog/events/inputhandler.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An object that encapsulates text changed events for textareas\n * and input element of type text and password. The event occurs after the value\n * has been changed. The event does not occur if value was changed\n * programmatically.<br>\n * <br>\n * Note: this does not guarantee the correctness of `keyCode` or\n * `charCode`, or attempt to unify them across browsers. See\n * `goog.events.KeyHandler` for that functionality<br>\n * <br>\n * Known issues:\n * <ul>\n * <li>IE doesn't have native support for input event. WebKit before version 531\n *     doesn't have support for textareas. For those browsers an emulation mode\n *     based on key, clipboard and drop events is used. Thus this event won't\n *     trigger in emulation mode if text was modified by context menu commands\n *     such as 'Undo' and 'Delete'.\n * </ul>\n * @author arv@google.com (Erik Arvidsson)\n * @see ../demos/inputhandler.html\n */\n\ngoog.provide('goog.events.InputHandler');\ngoog.provide('goog.events.InputHandler.EventType');\n\ngoog.require('goog.Timer');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events.BrowserEvent');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * This event handler will dispatch events when the user types into a text\n * input, password input or a textarea\n * @param {Element} element  The element that you want to listen for input\n *     events on.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.events.InputHandler = function(element) {\n  goog.events.InputHandler.base(this, 'constructor');\n\n  /**\n   * Id of a timer used to postpone firing input event in emulation mode.\n   * @type {?number}\n   * @private\n   */\n  this.timer_ = null;\n\n  /**\n   * The element that you want to listen for input events on.\n   * @type {Element}\n   * @private\n   */\n  this.element_ = element;\n\n  // Determine whether input event should be emulated.\n  // IE8 doesn't support input events. We could use property change events but\n  // they are broken in many ways:\n  // - Fire even if value was changed programmatically.\n  // - Aren't always delivered. For example, if you change value or even width\n  //   of input programmatically, next value change made by user won't fire an\n  //   event.\n  // IE9 supports input events when characters are inserted, but not deleted.\n  // WebKit before version 531 did not support input events for textareas.\n  var emulateInputEvents = goog.userAgent.IE || goog.userAgent.EDGE ||\n      (goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher('531') &&\n       element.tagName == goog.dom.TagName.TEXTAREA);\n\n  /**\n   * @type {goog.events.EventHandler<!goog.events.InputHandler>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  // Even if input event emulation is enabled, still listen for input events\n  // since they may be partially supported by the browser (such as IE9).\n  // If the input event does fire, we will be able to dispatch synchronously.\n  // (InputHandler events being asynchronous for IE is a common issue for\n  // cases like auto-grow textareas where they result in a quick flash of\n  // scrollbars between the textarea content growing and it being resized to\n  // fit.)\n  this.eventHandler_.listen(\n      this.element_,\n      emulateInputEvents ? ['keydown', 'paste', 'cut', 'drop', 'input'] :\n                           'input',\n      this);\n};\ngoog.inherits(goog.events.InputHandler, goog.events.EventTarget);\n\n\n/**\n * Enum type for the events fired by the input handler\n * @enum {string}\n */\ngoog.events.InputHandler.EventType = {\n  INPUT: 'input'\n};\n\n\n/**\n * This handles the underlying events and dispatches a new event as needed.\n * @param {goog.events.BrowserEvent} e The underlying browser event.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.events.InputHandler.prototype.handleEvent = function(e) {\n  if (e.type == 'input') {\n    // http://stackoverflow.com/questions/18389732/changing-placeholder-triggers-input-event-in-ie-10\n    // IE 10+ fires an input event when there are inputs with placeholders.\n    // It fires the event with keycode 0, so if we detect it we don't\n    // propagate the input event.\n    if (goog.userAgent.IE && goog.userAgent.isVersionOrHigher(10) &&\n        e.keyCode == 0 && e.charCode == 0) {\n      return;\n    }\n    // This event happens after all the other events we listen to, so cancel\n    // an asynchronous event dispatch if we have it queued up.  Otherwise, we\n    // will end up firing an extra event.\n    this.cancelTimerIfSet_();\n\n    this.dispatchEvent(this.createInputEvent_(e));\n  } else {\n    // Filter out key events that don't modify text.\n    if (e.type == 'keydown' &&\n        !goog.events.KeyCodes.isTextModifyingKeyEvent(e)) {\n      return;\n    }\n\n    // It is still possible that pressed key won't modify the value of an\n    // element. Storing old value will help us to detect modification but is\n    // also a little bit dangerous. If value is changed programmatically in\n    // another key down handler, we will detect it as user-initiated change.\n    var valueBeforeKey = e.type == 'keydown' ? this.element_.value : null;\n\n    // In IE on XP, IME the element's value has already changed when we get\n    // keydown events when the user is using an IME. In this case, we can't\n    // check the current value normally, so we assume that it's a modifying key\n    // event. This means that ENTER when used to commit will fire a spurious\n    // input event, but it's better to have a false positive than let some input\n    // slip through the cracks.\n    if (goog.userAgent.IE && e.keyCode == goog.events.KeyCodes.WIN_IME) {\n      valueBeforeKey = null;\n    }\n\n    // Create an input event now, because when we fire it on timer, the\n    // underlying event will already be disposed.\n    var inputEvent = this.createInputEvent_(e);\n\n    // Since key down, paste, cut and drop events are fired before actual value\n    // of the element has changed, we need to postpone dispatching input event\n    // until value is updated.\n    this.cancelTimerIfSet_();\n    this.timer_ = goog.Timer.callOnce(/** @suppress {strictMissingProperties} Part of the go/strict_warnings_migration */\n                                      function() {\n      this.timer_ = null;\n      if (this.element_.value != valueBeforeKey) {\n        this.dispatchEvent(inputEvent);\n      }\n    }, 0, this);\n  }\n};\n\n\n/**\n * Cancels timer if it is set, does nothing otherwise.\n * @private\n */\ngoog.events.InputHandler.prototype.cancelTimerIfSet_ = function() {\n  if (this.timer_ != null) {\n    goog.Timer.clear(this.timer_);\n    this.timer_ = null;\n  }\n};\n\n\n/**\n * Creates an input event from the browser event.\n * @param {goog.events.BrowserEvent} be A browser event.\n * @return {!goog.events.BrowserEvent} An input event.\n * @private\n */\ngoog.events.InputHandler.prototype.createInputEvent_ = function(be) {\n  var e = new goog.events.BrowserEvent(be.getBrowserEvent());\n  e.type = goog.events.InputHandler.EventType.INPUT;\n  return e;\n};\n\n\n/** @override */\ngoog.events.InputHandler.prototype.disposeInternal = function() {\n  goog.events.InputHandler.base(this, 'disposeInternal');\n  this.eventHandler_.dispose();\n  this.cancelTimerIfSet_();\n  delete this.element_;\n};\n","^;",1579837703000,"^<",["^=",["^1T","^3O","^?","^3W","^[","^4Y","^3H","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/inputhandler.js"],"^O",["^=",["~$goog.events.InputHandler.EventType","~$goog.events.InputHandler"]],"^W",true,"^X",["^?","^3O","^12","^4Y","^1T","^3W","^3H","^["]],["^ ","^3",[1579837703000],"^4","goog.ui.editor.linkdialog.js","^5",["^6","goog/ui/editor/linkdialog.js"],"^7","goog/ui/editor/linkdialog.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A dialog for editing/creating a link.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.ui.editor.LinkDialog');\ngoog.provide('goog.ui.editor.LinkDialog.BeforeTestLinkEvent');\ngoog.provide('goog.ui.editor.LinkDialog.EventType');\ngoog.provide('goog.ui.editor.LinkDialog.OkEvent');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.dom');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.editor.BrowserFeature');\ngoog.require('goog.editor.Link');\ngoog.require('goog.editor.focus');\ngoog.require('goog.editor.node');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.InputHandler');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.SafeHtmlFormatter');\ngoog.require('goog.string');\ngoog.require('goog.string.Unicode');\ngoog.require('goog.style');\ngoog.require('goog.ui.Button');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.LinkButtonRenderer');\ngoog.require('goog.ui.editor.AbstractDialog');\ngoog.require('goog.ui.editor.TabPane');\ngoog.require('goog.ui.editor.messages');\ngoog.require('goog.userAgent');\ngoog.require('goog.window');\n\n\n\n/**\n * A type of goog.ui.editor.AbstractDialog for editing/creating a link.\n * @param {goog.dom.DomHelper} domHelper DomHelper to be used to create the\n *     dialog's dom structure.\n * @param {goog.editor.Link} link The target link.\n * @constructor\n * @extends {goog.ui.editor.AbstractDialog}\n * @final\n */\ngoog.ui.editor.LinkDialog = function(domHelper, link) {\n  goog.ui.editor.LinkDialog.base(this, 'constructor', domHelper);\n\n  /**\n   * The link being modified by this dialog.\n   * @type {goog.editor.Link}\n   * @private\n   */\n  this.targetLink_ = link;\n\n  /**\n   * The event handler for this dialog.\n   * @type {goog.events.EventHandler<!goog.ui.editor.LinkDialog>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n  this.registerDisposable(this.eventHandler_);\n\n  /**\n   * Optional warning to show about email addresses.\n   * @type {?goog.html.SafeHtml}\n   * @private\n   */\n  this.emailWarning_ = null;\n\n  /**\n   * Whether to show a checkbox where the user can choose to have the link open\n   * in a new window.\n   * @type {boolean}\n   * @private\n   */\n  this.showOpenLinkInNewWindow_ = false;\n\n  /**\n   * Whether to focus the text to display input instead of the url input if the\n   * text to display input is empty when the dialog opens.\n   * @type {boolean}\n   * @private\n   */\n  this.focusTextToDisplayOnOpenIfEmpty_ = false;\n\n  /**\n   * Whether the \"open link in new window\" checkbox should be checked when the\n   * dialog is shown, and also whether it was checked last time the dialog was\n   * closed.\n   * @type {boolean}\n   * @private\n   */\n  this.isOpenLinkInNewWindowChecked_ = false;\n\n  /**\n   * Whether to show a checkbox where the user can choose to have 'rel=nofollow'\n   * attribute added to the link.\n   * @type {boolean}\n   * @private\n   */\n  this.showRelNoFollow_ = false;\n\n  /**\n   * InputHandler object to listen for changes in the url input field.\n   * @type {?goog.events.InputHandler}\n   * @private\n   */\n  this.urlInputHandler_ = null;\n\n  /**\n   * InputHandler object to listen for changes in the email input field.\n   * @type {?goog.events.InputHandler}\n   * @private\n   */\n  this.emailInputHandler_ = null;\n\n  /**\n   * InputHandler object to listen for changes in the text to display input\n   * field.\n   * @type {?goog.events.InputHandler}\n   * @private\n   */\n  this.textInputHandler_ = null;\n\n  /**\n   * The tab bar where the url and email tabs are.\n   * @type {?goog.ui.editor.TabPane}\n   * @private\n   */\n  this.tabPane_ = null;\n\n  /**\n   * The div element holding the link's display text input.\n   * @type {?HTMLDivElement}\n   * @private\n   */\n  this.textToDisplayDiv_ = null;\n\n  /**\n   * The input element holding the link's display text.\n   * @type {?HTMLInputElement}\n   * @private\n   */\n  this.textToDisplayInput_ = null;\n\n  /**\n   * Whether or not the feature of automatically generating the display text is\n   * enabled.\n   * @type {boolean}\n   * @private\n   */\n  this.autogenFeatureEnabled_ = true;\n\n  /**\n   * Whether or not we should automatically generate the display text.\n   * @type {boolean}\n   * @private\n   */\n  this.autogenerateTextToDisplay_ = false;\n\n  /**\n   * Whether or not automatic generation of the display text is disabled.\n   * @type {boolean}\n   * @private\n   */\n  this.disableAutogen_ = false;\n\n  /**\n   * The input element (checkbox) to indicate that the link should open in a new\n   * window.\n   * @type {?HTMLInputElement}\n   * @private\n   */\n  this.openInNewWindowCheckbox_ = null;\n\n  /**\n   * The input element (checkbox) to indicate that the link should have\n   * 'rel=nofollow' attribute.\n   * @type {?HTMLInputElement}\n   * @private\n   */\n  this.relNoFollowCheckbox_ = null;\n\n  /**\n   * Whether to stop leaking the page's url via the referrer header when the\n   * \"test this link\" link is clicked.\n   * @private {boolean}\n   */\n  this.stopReferrerLeaks_ = false;\n\n  /**\n   * Whether to remove access to the current window object in the newly created\n   * window when the \"test this link\" is clicked, since it can be used to launch\n   * a reverse tabnabbing attack.\n   * @private {boolean}\n   */\n  this.stopTabNabbing_ = false;\n};\ngoog.inherits(goog.ui.editor.LinkDialog, goog.ui.editor.AbstractDialog);\n\n\n/**\n * Events specific to the link dialog.\n * @enum {string}\n */\ngoog.ui.editor.LinkDialog.EventType = {\n  BEFORE_TEST_LINK: 'beforetestlink'\n};\n\n\n\n/**\n * OK event object for the link dialog.\n * @param {string} linkText Text the user chose to display for the link.\n * @param {string} linkUrl Url the user chose for the link to point to.\n * @param {boolean} openInNewWindow Whether the link should open in a new window\n *     when clicked.\n * @param {boolean} noFollow Whether the link should have 'rel=nofollow'\n *     attribute.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.ui.editor.LinkDialog.OkEvent = function(\n    linkText, linkUrl, openInNewWindow, noFollow) {\n  goog.ui.editor.LinkDialog.OkEvent.base(\n      this, 'constructor', goog.ui.editor.AbstractDialog.EventType.OK);\n\n  /**\n   * The text of the link edited in the dialog.\n   * @type {string}\n   */\n  this.linkText = linkText;\n\n  /**\n   * The url of the link edited in the dialog.\n   * @type {string}\n   */\n  this.linkUrl = linkUrl;\n\n  /**\n   * Whether the link should open in a new window when clicked.\n   * @type {boolean}\n   */\n  this.openInNewWindow = openInNewWindow;\n\n  /**\n   * Whether the link should have 'rel=nofollow' attribute.\n   * @type {boolean}\n   */\n  this.noFollow = noFollow;\n};\ngoog.inherits(goog.ui.editor.LinkDialog.OkEvent, goog.events.Event);\n\n\n\n/**\n * Event fired before testing a link by opening it in another window.\n * Calling preventDefault will stop the link from being opened.\n * @param {string} url Url of the link being tested.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.ui.editor.LinkDialog.BeforeTestLinkEvent = function(url) {\n  goog.ui.editor.LinkDialog.BeforeTestLinkEvent.base(\n      this, 'constructor',\n      goog.ui.editor.LinkDialog.EventType.BEFORE_TEST_LINK);\n\n  /**\n   * The url of the link being tested.\n   * @type {string}\n   */\n  this.url = url;\n};\ngoog.inherits(goog.ui.editor.LinkDialog.BeforeTestLinkEvent, goog.events.Event);\n\n\n/**\n * Sets the warning message to show to users about including email addresses on\n * public web pages.\n * @param {!goog.html.SafeHtml} emailWarning Warning message to show users about\n *     including email addresses on the web.\n */\ngoog.ui.editor.LinkDialog.prototype.setEmailWarning = function(emailWarning) {\n  this.emailWarning_ = emailWarning;\n};\n\n\n/**\n * Tells the dialog to show a checkbox where the user can choose to have the\n * link open in a new window.\n * @param {boolean} startChecked Whether to check the checkbox the first\n *     time the dialog is shown. Subesquent times the checkbox will remember its\n *     previous state.\n */\ngoog.ui.editor.LinkDialog.prototype.showOpenLinkInNewWindow = function(\n    startChecked) {\n  this.showOpenLinkInNewWindow_ = true;\n  this.isOpenLinkInNewWindowChecked_ = startChecked;\n};\n\n\n/**\n * Tells the dialog to focus the text to display input instead of the url field\n * if the text to display input is empty when the dialog is opened.\n */\ngoog.ui.editor.LinkDialog.prototype.focusTextToDisplayOnOpenIfEmpty =\n    function() {\n  this.focusTextToDisplayOnOpenIfEmpty_ = true;\n};\n\n\n/**\n * Tells the dialog to show a checkbox where the user can choose to add\n * 'rel=nofollow' attribute to the link.\n */\ngoog.ui.editor.LinkDialog.prototype.showRelNoFollow = function() {\n  this.showRelNoFollow_ = true;\n};\n\n\n/** @override */\ngoog.ui.editor.LinkDialog.prototype.show = function() {\n  goog.ui.editor.LinkDialog.base(this, 'show');\n\n\n  this.selectAppropriateTab_(\n      this.textToDisplayInput_.value, this.getTargetUrl_());\n\n  if (this.focusTextToDisplayOnOpenIfEmpty_ &&\n      !this.targetLink_.getCurrentText()) {\n    goog.editor.focus.focusInputField(this.textToDisplayInput_);\n  }\n\n  this.syncOkButton_();\n\n  if (this.showOpenLinkInNewWindow_) {\n    if (!this.targetLink_.isNew()) {\n      // If link is not new, checkbox should reflect current target.\n      this.isOpenLinkInNewWindowChecked_ =\n          this.targetLink_.getAnchor().target == '_blank';\n    }\n    this.openInNewWindowCheckbox_.checked = this.isOpenLinkInNewWindowChecked_;\n  }\n\n  if (this.showRelNoFollow_) {\n    this.relNoFollowCheckbox_.checked =\n        goog.ui.editor.LinkDialog.hasNoFollow(this.targetLink_.getAnchor().rel);\n  }\n};\n\n\n/** @override */\ngoog.ui.editor.LinkDialog.prototype.hide = function() {\n  this.disableAutogenFlag_(false);\n  goog.ui.editor.LinkDialog.base(this, 'hide');\n};\n\n\n/**\n * Tells the dialog whether to show the 'text to display' div.\n * When the target element of the dialog is an image, there is no link text\n * to modify. This function can be used for this kind of situations.\n * @param {boolean} visible Whether to make 'text to display' div visible.\n */\ngoog.ui.editor.LinkDialog.prototype.setTextToDisplayVisible = function(\n    visible) {\n  if (this.textToDisplayDiv_) {\n    goog.style.setStyle(\n        this.textToDisplayDiv_, 'display', visible ? 'block' : 'none');\n  }\n};\n\n\n/**\n * Tells the plugin whether to stop leaking the page's url via the referrer\n * header when the \"test this link\" link is clicked.\n * @param {boolean} stop Whether to stop leaking the referrer.\n */\ngoog.ui.editor.LinkDialog.prototype.setStopReferrerLeaks = function(stop) {\n  this.stopReferrerLeaks_ = stop;\n};\n\n\n/**\n * Tells the plugin whether to remove access to the current window object in the\n * newly created window when the \"test this link\" is clicked, since it can be\n * used to launch a reverse tabnabbing attack.\n * @param {boolean} stop Whether to remove the reference to the current window\n *     in the new window.\n */\ngoog.ui.editor.LinkDialog.prototype.setStopTabNabbing = function(stop) {\n  this.stopTabNabbing_ = stop;\n};\n\n\n/**\n * Tells the dialog whether the autogeneration of text to display is to be\n * enabled.\n * @param {boolean} enable Whether to enable the feature.\n */\ngoog.ui.editor.LinkDialog.prototype.setAutogenFeatureEnabled = function(\n    enable) {\n  this.autogenFeatureEnabled_ = enable;\n};\n\n\n/**\n * Checks if `str` contains {@code \"nofollow\"} as a separate word.\n * @param {string} str String to be tested.  This is usually `rel`\n *     attribute of an `HTMLAnchorElement` object.\n * @return {boolean} `true` if `str` contains `nofollow`.\n */\ngoog.ui.editor.LinkDialog.hasNoFollow = function(str) {\n  return goog.ui.editor.LinkDialog.NO_FOLLOW_REGEX_.test(str);\n};\n\n\n/**\n * Removes {@code \"nofollow\"} from `rel` if it's present as a separate\n * word.\n * @param {string} rel Input string.  This is usually `rel` attribute of\n *     an `HTMLAnchorElement` object.\n * @return {string} `rel` with any {@code \"nofollow\"} removed.\n */\ngoog.ui.editor.LinkDialog.removeNoFollow = function(rel) {\n  return rel.replace(goog.ui.editor.LinkDialog.NO_FOLLOW_REGEX_, '');\n};\n\n\n// *** Protected interface ************************************************** //\n\n\n/** @override */\ngoog.ui.editor.LinkDialog.prototype.createDialogControl = function() {\n  var builder = new goog.ui.editor.AbstractDialog.Builder(this);\n  builder.setTitle(goog.ui.editor.messages.MSG_EDIT_LINK)\n      .setContent(this.createDialogContent_());\n  return builder.build();\n};\n\n\n/**\n * Creates and returns the event object to be used when dispatching the OK\n * event to listeners based on which tab is currently selected and the contents\n * of the input fields of that tab.\n * @return {!goog.ui.editor.LinkDialog.OkEvent} The event object to be used when\n *     dispatching the OK event to listeners.\n * @protected\n * @override\n */\ngoog.ui.editor.LinkDialog.prototype.createOkEvent = function() {\n  if (this.tabPane_.getCurrentTabId() ==\n      goog.ui.editor.LinkDialog.Id_.EMAIL_ADDRESS_TAB) {\n    return this.createOkEventFromEmailTab_();\n  } else {\n    return this.createOkEventFromWebTab_();\n  }\n};\n\n\n// *** Private implementation *********************************************** //\n\n\n/**\n * Regular expression that matches `nofollow` value in an\n * {@code * HTMLAnchorElement}'s `rel` element.\n * @type {RegExp}\n * @private\n */\ngoog.ui.editor.LinkDialog.NO_FOLLOW_REGEX_ = /\\bnofollow\\b/i;\n\n\n/**\n * Creates contents of this dialog.\n * @return {!Element} Contents of the dialog as a DOM element.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.createDialogContent_ = function() {\n  this.textToDisplayDiv_ =\n      /** @type {!HTMLDivElement} */ (this.buildTextToDisplayDiv_());\n  var content =\n      this.dom.createDom(goog.dom.TagName.DIV, null, this.textToDisplayDiv_);\n\n  this.tabPane_ =\n      new goog.ui.editor.TabPane(this.dom, goog.ui.editor.messages.MSG_LINK_TO);\n  this.registerDisposable(this.tabPane_);\n  this.tabPane_.addTab(\n      goog.ui.editor.LinkDialog.Id_.ON_WEB_TAB,\n      goog.ui.editor.messages.MSG_ON_THE_WEB,\n      goog.ui.editor.messages.MSG_ON_THE_WEB_TIP,\n      goog.ui.editor.LinkDialog.BUTTON_GROUP_, this.buildTabOnTheWeb_());\n  this.tabPane_.addTab(\n      goog.ui.editor.LinkDialog.Id_.EMAIL_ADDRESS_TAB,\n      goog.ui.editor.messages.MSG_EMAIL_ADDRESS,\n      goog.ui.editor.messages.MSG_EMAIL_ADDRESS_TIP,\n      goog.ui.editor.LinkDialog.BUTTON_GROUP_, this.buildTabEmailAddress_());\n  this.tabPane_.render(content);\n\n  this.eventHandler_.listen(\n      this.tabPane_, goog.ui.Component.EventType.SELECT, this.onChangeTab_);\n\n  if (this.showOpenLinkInNewWindow_) {\n    content.appendChild(this.buildOpenInNewWindowDiv_());\n  }\n  if (this.showRelNoFollow_) {\n    content.appendChild(this.buildRelNoFollowDiv_());\n  }\n\n  return content;\n};\n\n\n/**\n * Builds and returns the text to display section of the edit link dialog.\n * @return {!Element} A div element to be appended into the dialog div.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.editor.LinkDialog.prototype.buildTextToDisplayDiv_ = function() {\n  var table = this.dom.createTable(1, 2);\n  table.cellSpacing = '0';\n  table.cellPadding = '0';\n  table.style.fontSize = '10pt';\n  // Build the text to display input.\n  var textToDisplayDiv = this.dom.createDom(goog.dom.TagName.DIV);\n  var html = goog.html.SafeHtml.create(\n      'span', {\n        'style': {\n          'position': 'relative',\n          'bottom': '2px',\n          'padding-right': '1px',\n          'white-space': 'nowrap'\n        },\n        id: goog.ui.editor.LinkDialog.Id_.TEXT_TO_DISPLAY_LABEL\n      },\n      [goog.ui.editor.messages.MSG_TEXT_TO_DISPLAY, goog.string.Unicode.NBSP]);\n  goog.dom.safe.setInnerHtml(table.rows[0].cells[0], html);\n  this.textToDisplayInput_ = this.dom.createDom(\n      goog.dom.TagName.INPUT,\n      {id: goog.ui.editor.LinkDialog.Id_.TEXT_TO_DISPLAY});\n  var textInput = this.textToDisplayInput_;\n  // 98% prevents scroll bars in standards mode.\n  // TODO(robbyw): Is this necessary for quirks mode?\n  goog.style.setStyle(textInput, 'width', '98%');\n  goog.style.setStyle(table.rows[0].cells[1], 'width', '100%');\n  goog.dom.appendChild(table.rows[0].cells[1], textInput);\n\n  goog.a11y.aria.setState(\n      /** @type {!Element} */ (textInput), goog.a11y.aria.State.LABELLEDBY,\n      goog.ui.editor.LinkDialog.Id_.TEXT_TO_DISPLAY_LABEL);\n  textInput.value = this.targetLink_.getCurrentText();\n\n  this.textInputHandler_ = new goog.events.InputHandler(textInput);\n  this.registerDisposable(this.textInputHandler_);\n  this.eventHandler_.listen(\n      this.textInputHandler_, goog.events.InputHandler.EventType.INPUT,\n      this.onTextToDisplayEdit_);\n\n  goog.dom.appendChild(textToDisplayDiv, table);\n  return textToDisplayDiv;\n};\n\n\n/**\n * Builds and returns the \"checkbox to open the link in a new window\" section of\n * the edit link dialog.\n * @return {!Element} A div element to be appended into the dialog div.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.buildOpenInNewWindowDiv_ = function() {\n  this.openInNewWindowCheckbox_ = this.dom.createDom(\n      goog.dom.TagName.INPUT, {'type': goog.dom.InputType.CHECKBOX});\n  return this.dom.createDom(\n      goog.dom.TagName.DIV, null,\n      this.dom.createDom(\n          goog.dom.TagName.LABEL, null, this.openInNewWindowCheckbox_,\n          goog.ui.editor.messages.MSG_OPEN_IN_NEW_WINDOW));\n};\n\n\n/**\n * Creates a DIV with a checkbox for {@code rel=nofollow} option.\n * @return {!Element} Newly created DIV element.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.buildRelNoFollowDiv_ = function() {\n  var formatter = new goog.html.SafeHtmlFormatter();\n  /** @desc Checkbox text for adding 'rel=nofollow' attribute to a link. */\n  var MSG_ADD_REL_NOFOLLOW_ATTR = goog.getMsg(\n      \"Add '{$relNoFollow}' attribute ({$linkStart}Learn more{$linkEnd})\", {\n        'relNoFollow': 'rel=nofollow',\n        'linkStart': formatter.startTag('a', {\n          'href': 'http://support.google.com/webmasters/bin/' +\n              'answer.py?hl=en&answer=96569',\n          'target': '_blank'\n        }),\n        'linkEnd': formatter.endTag('a')\n      });\n\n  this.relNoFollowCheckbox_ = this.dom.createDom(\n      goog.dom.TagName.INPUT, {'type': goog.dom.InputType.CHECKBOX});\n  return this.dom.createDom(\n      goog.dom.TagName.DIV, null,\n      this.dom.createDom(\n          goog.dom.TagName.LABEL, null, this.relNoFollowCheckbox_,\n          goog.dom.safeHtmlToNode(\n              formatter.format(MSG_ADD_REL_NOFOLLOW_ATTR))));\n};\n\n\n/**\n* Builds and returns the div containing the tab \"On the web\".\n* @return {!Element} The div element containing the tab.\n* @private\n*/\ngoog.ui.editor.LinkDialog.prototype.buildTabOnTheWeb_ = function() {\n  var onTheWebDiv = this.dom.createElement(goog.dom.TagName.DIV);\n\n  var headingDiv = this.dom.createDom(\n      goog.dom.TagName.DIV, {},\n      this.dom.createDom(\n          goog.dom.TagName.B, {}, goog.ui.editor.messages.MSG_WHAT_URL));\n  var urlInput = this.dom.createDom(goog.dom.TagName.INPUT, {\n    id: goog.ui.editor.LinkDialog.Id_.ON_WEB_INPUT,\n    className: goog.ui.editor.LinkDialog.TARGET_INPUT_CLASSNAME_\n  });\n  goog.a11y.aria.setState(\n      urlInput, goog.a11y.aria.State.LABELLEDBY,\n      goog.ui.editor.LinkDialog.Id_.ON_WEB_TAB);\n  // IE throws on unknown values for type, but IE10+ supports type=url\n  if (!goog.userAgent.IE || goog.userAgent.isVersionOrHigher('10')) {\n    // On browsers that support Web Forms 2.0, allow autocompletion of URLs.\n    urlInput.type = goog.dom.InputType.URL;\n  }\n\n  if (goog.editor.BrowserFeature.NEEDS_99_WIDTH_IN_STANDARDS_MODE &&\n      goog.editor.node.isStandardsMode(urlInput)) {\n    urlInput.style.width = '99%';\n  }\n\n  var inputDiv = this.dom.createDom(goog.dom.TagName.DIV, null, urlInput);\n\n  this.urlInputHandler_ = new goog.events.InputHandler(urlInput);\n  this.registerDisposable(this.urlInputHandler_);\n  this.eventHandler_.listen(\n      this.urlInputHandler_, goog.events.InputHandler.EventType.INPUT,\n      this.onUrlOrEmailInputChange_);\n\n  var testLink = new goog.ui.Button(\n      goog.ui.editor.messages.MSG_TEST_THIS_LINK,\n      goog.ui.LinkButtonRenderer.getInstance(), this.dom);\n  testLink.render(inputDiv);\n  testLink.getElement().style.marginTop = '1em';\n  this.eventHandler_.listen(\n      testLink, goog.ui.Component.EventType.ACTION, this.onWebTestLink_);\n\n  // Build the \"On the web\" explanation text div.\n  var explanationDiv = this.dom.createDom(\n      goog.dom.TagName.DIV,\n      goog.ui.editor.LinkDialog.EXPLANATION_TEXT_CLASSNAME_);\n  goog.dom.safe.setInnerHtml(\n      explanationDiv, goog.ui.editor.messages.getTrLinkExplanationSafeHtml());\n  onTheWebDiv.appendChild(headingDiv);\n  onTheWebDiv.appendChild(inputDiv);\n  onTheWebDiv.appendChild(explanationDiv);\n\n  return onTheWebDiv;\n};\n\n\n/**\n * Builds and returns the div containing the tab \"Email address\".\n * @return {!Element} the div element containing the tab.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.buildTabEmailAddress_ = function() {\n  var emailTab = this.dom.createDom(goog.dom.TagName.DIV);\n\n  var headingDiv = this.dom.createDom(\n      goog.dom.TagName.DIV, {},\n      this.dom.createDom(\n          goog.dom.TagName.B, {}, goog.ui.editor.messages.MSG_WHAT_EMAIL));\n  goog.dom.appendChild(emailTab, headingDiv);\n  var emailInput = this.dom.createDom(goog.dom.TagName.INPUT, {\n    id: goog.ui.editor.LinkDialog.Id_.EMAIL_ADDRESS_INPUT,\n    className: goog.ui.editor.LinkDialog.TARGET_INPUT_CLASSNAME_\n  });\n  goog.a11y.aria.setState(\n      emailInput, goog.a11y.aria.State.LABELLEDBY,\n      goog.ui.editor.LinkDialog.Id_.EMAIL_ADDRESS_TAB);\n\n  if (goog.editor.BrowserFeature.NEEDS_99_WIDTH_IN_STANDARDS_MODE &&\n      goog.editor.node.isStandardsMode(emailInput)) {\n    // Standards mode sizes this too large.\n    emailInput.style.width = '99%';\n  }\n\n  goog.dom.appendChild(emailTab, emailInput);\n\n  this.emailInputHandler_ = new goog.events.InputHandler(emailInput);\n  this.registerDisposable(this.emailInputHandler_);\n  this.eventHandler_.listen(\n      this.emailInputHandler_, goog.events.InputHandler.EventType.INPUT,\n      this.onUrlOrEmailInputChange_);\n\n  goog.dom.appendChild(\n      emailTab,\n      this.dom.createDom(\n          goog.dom.TagName.DIV, {\n            id: goog.ui.editor.LinkDialog.Id_.EMAIL_WARNING,\n            className: goog.ui.editor.LinkDialog.EMAIL_WARNING_CLASSNAME_,\n            style: 'visibility:hidden'\n          },\n          goog.ui.editor.messages.MSG_INVALID_EMAIL));\n\n  if (this.emailWarning_) {\n    var explanationDiv = this.dom.createDom(\n        goog.dom.TagName.DIV,\n        goog.ui.editor.LinkDialog.EXPLANATION_TEXT_CLASSNAME_);\n    goog.dom.safe.setInnerHtml(explanationDiv, this.emailWarning_);\n    goog.dom.appendChild(emailTab, explanationDiv);\n  }\n  return emailTab;\n};\n\n\n/**\n * Returns the url that the target points to.\n * @return {string} The url that the target points to.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.getTargetUrl_ = function() {\n  // Get the href-attribute through getAttribute() rather than the href property\n  // because Google-Toolbar on Firefox with \"Send with Gmail\" turned on\n  // modifies the href-property of 'mailto:' links but leaves the attribute\n  // untouched.\n  return this.targetLink_.getAnchor().getAttribute('href') || '';\n};\n\n\n/**\n * Selects the correct tab based on the URL, and fills in its inputs.\n * For new links, it suggests a url based on the link text.\n * @param {string} text The inner text of the link.\n * @param {string} url The href for the link.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.editor.LinkDialog.prototype.selectAppropriateTab_ = function(\n    text, url) {\n  if (this.isNewLink_()) {\n    // Newly created non-empty link: try to infer URL from the link text.\n    this.guessUrlAndSelectTab_(text);\n  } else if (goog.editor.Link.isMailto(url)) {\n    // The link is for an email.\n    this.tabPane_.setSelectedTabId(\n        goog.ui.editor.LinkDialog.Id_.EMAIL_ADDRESS_TAB);\n    this.dom.getElement(goog.ui.editor.LinkDialog.Id_.EMAIL_ADDRESS_INPUT)\n        .value = url.substring(url.indexOf(':') + 1);\n    this.setAutogenFlagFromCurInput_();\n  } else {\n    // No specific tab was appropriate, default to on the web tab.\n    this.tabPane_.setSelectedTabId(goog.ui.editor.LinkDialog.Id_.ON_WEB_TAB);\n    this.dom.getElement(goog.ui.editor.LinkDialog.Id_.ON_WEB_INPUT).value =\n        this.isNewLink_() ? 'http://' : url;\n    this.setAutogenFlagFromCurInput_();\n  }\n};\n\n\n/**\n * Select a url/tab based on the link's text. This function is simply\n * the isNewLink_() == true case of selectAppropriateTab_().\n * @param {string} text The inner text of the link.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.editor.LinkDialog.prototype.guessUrlAndSelectTab_ = function(text) {\n  if (goog.editor.Link.isLikelyEmailAddress(text)) {\n    // The text is for an email address.\n    this.tabPane_.setSelectedTabId(\n        goog.ui.editor.LinkDialog.Id_.EMAIL_ADDRESS_TAB);\n    this.dom.getElement(goog.ui.editor.LinkDialog.Id_.EMAIL_ADDRESS_INPUT)\n        .value = text;\n    this.setAutogenFlag_(true);\n    // TODO(user): Why disable right after enabling? What bug are we\n    // working around?\n    this.disableAutogenFlag_(true);\n  } else if (goog.editor.Link.isLikelyUrl(text)) {\n    // The text is for a web URL.\n    this.tabPane_.setSelectedTabId(goog.ui.editor.LinkDialog.Id_.ON_WEB_TAB);\n    this.dom.getElement(goog.ui.editor.LinkDialog.Id_.ON_WEB_INPUT).value =\n        text;\n    this.setAutogenFlag_(true);\n    this.disableAutogenFlag_(true);\n  } else {\n    // No meaning could be deduced from text, choose a default tab.\n    if (!this.targetLink_.getCurrentText()) {\n      this.setAutogenFlag_(true);\n    }\n    this.tabPane_.setSelectedTabId(goog.ui.editor.LinkDialog.Id_.ON_WEB_TAB);\n  }\n};\n\n\n/**\n * Called on a change to the url or email input. If either one of those tabs\n * is active, sets the OK button to enabled/disabled accordingly.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.editor.LinkDialog.prototype.syncOkButton_ = function() {\n  var inputValue;\n  if (this.tabPane_.getCurrentTabId() ==\n      goog.ui.editor.LinkDialog.Id_.EMAIL_ADDRESS_TAB) {\n    inputValue =\n        this.dom.getElement(goog.ui.editor.LinkDialog.Id_.EMAIL_ADDRESS_INPUT)\n            .value;\n    this.toggleInvalidEmailWarning_(\n        inputValue != '' && !goog.editor.Link.isLikelyEmailAddress(inputValue));\n  } else if (\n      this.tabPane_.getCurrentTabId() ==\n      goog.ui.editor.LinkDialog.Id_.ON_WEB_TAB) {\n    inputValue =\n        this.dom.getElement(goog.ui.editor.LinkDialog.Id_.ON_WEB_INPUT).value;\n  } else {\n    return;\n  }\n  this.getOkButtonElement().disabled =\n      goog.string.isEmptyOrWhitespace(inputValue);\n};\n\n\n/**\n * Show/hide the Invalid Email Address warning.\n * @param {boolean} on Whether to show the warning.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.toggleInvalidEmailWarning_ = function(on) {\n  this.dom.getElement(goog.ui.editor.LinkDialog.Id_.EMAIL_WARNING)\n      .style.visibility = (on ? 'visible' : 'hidden');\n};\n\n\n/**\n * Changes the autogenerateTextToDisplay flag so that text to\n * display stops autogenerating.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.onTextToDisplayEdit_ = function() {\n  var inputEmpty = this.textToDisplayInput_.value == '';\n  if (inputEmpty) {\n    this.setAutogenFlag_(true);\n  } else {\n    this.setAutogenFlagFromCurInput_();\n  }\n};\n\n\n/**\n * The function called when hitting OK with the \"On the web\" tab current.\n * @return {!goog.ui.editor.LinkDialog.OkEvent} The event object to be used when\n *     dispatching the OK event to listeners.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.createOkEventFromWebTab_ = function() {\n  var input = /** @type {HTMLInputElement} */ (\n      this.dom.getElement(goog.ui.editor.LinkDialog.Id_.ON_WEB_INPUT));\n  var linkURL = input.value;\n  if (goog.editor.Link.isLikelyEmailAddress(linkURL)) {\n    // Make sure that if user types in an e-mail address, it becomes \"mailto:\".\n    return this.createOkEventFromEmailTab_(\n        goog.ui.editor.LinkDialog.Id_.ON_WEB_INPUT);\n  } else {\n    if (linkURL.search(/:/) < 0) {\n      linkURL = 'http://' + goog.string.trimLeft(linkURL);\n    }\n    return this.createOkEventFromUrl_(linkURL);\n  }\n};\n\n\n/**\n * The function called when hitting OK with the \"email address\" tab current.\n * @param {string=} opt_inputId Id of an alternate input to check.\n * @return {!goog.ui.editor.LinkDialog.OkEvent} The event object to be used when\n *     dispatching the OK event to listeners.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.editor.LinkDialog.prototype.createOkEventFromEmailTab_ = function(\n    opt_inputId) {\n  var linkURL =\n      this.dom\n          .getElement(\n              opt_inputId || goog.ui.editor.LinkDialog.Id_.EMAIL_ADDRESS_INPUT)\n          .value;\n  linkURL = 'mailto:' + linkURL;\n  return this.createOkEventFromUrl_(linkURL);\n};\n\n\n/**\n * Function to test a link from the on the web tab.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.onWebTestLink_ = function() {\n  var input = /** @type {HTMLInputElement} */ (\n      this.dom.getElement(goog.ui.editor.LinkDialog.Id_.ON_WEB_INPUT));\n  var url = input.value;\n  if (url.search(/:/) < 0) {\n    url = 'http://' + goog.string.trimLeft(url);\n  }\n  if (this.dispatchEvent(\n          new goog.ui.editor.LinkDialog.BeforeTestLinkEvent(url))) {\n    var win = this.dom.getWindow();\n    var size = goog.dom.getViewportSize(win);\n    var openOptions = {\n      target: '_blank',\n      width: Math.max(size.width - 50, 50),\n      height: Math.max(size.height - 50, 50),\n      toolbar: true,\n      scrollbars: true,\n      location: true,\n      statusbar: false,\n      menubar: true,\n      resizable: true,\n      noreferrer: this.stopReferrerLeaks_,\n      noopener: this.stopTabNabbing_\n    };\n    goog.window.open(url, openOptions, win);\n  }\n};\n\n\n/**\n * Called whenever the url or email input is edited. If the text to display\n * matches the text to display, turn on auto. Otherwise if auto is on, update\n * the text to display based on the url.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.onUrlOrEmailInputChange_ = function() {\n  if (this.autogenerateTextToDisplay_) {\n    this.setTextToDisplayFromAuto_();\n  } else if (this.textToDisplayInput_.value == '') {\n    this.setAutogenFlagFromCurInput_();\n  }\n  this.syncOkButton_();\n};\n\n\n/**\n * Called when the currently selected tab changes.\n * @param {goog.events.Event} e The tab change event.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.onChangeTab_ = function(e) {\n  var tab = /** @type {goog.ui.Tab} */ (e.target);\n\n  // Focus on the input field in the selected tab.\n  var input = /** @type {!HTMLElement} */ (\n      this.dom.getElement(\n          tab.getId() + goog.ui.editor.LinkDialog.Id_.TAB_INPUT_SUFFIX));\n  goog.editor.focus.focusInputField(input);\n\n  // For some reason, IE does not fire onpropertychange events when the width\n  // is specified as a percentage, which breaks the InputHandlers.\n  input.style.width = '';\n  input.style.width = input.offsetWidth + 'px';\n\n  this.syncOkButton_();\n  this.setTextToDisplayFromAuto_();\n};\n\n\n/**\n * If autogen is turned on, set the value of text to display based on the\n * current selection or url.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.setTextToDisplayFromAuto_ = function() {\n  if (this.autogenFeatureEnabled_ && this.autogenerateTextToDisplay_) {\n    var inputId = this.tabPane_.getCurrentTabId() +\n        goog.ui.editor.LinkDialog.Id_.TAB_INPUT_SUFFIX;\n    this.textToDisplayInput_.value =\n        /** @type {HTMLInputElement} */ (this.dom.getElement(inputId)).value;\n  }\n};\n\n\n/**\n * Turn on the autogenerate text to display flag, and set some sort of indicator\n * that autogen is on.\n * @param {boolean} val Boolean value to set autogenerate to.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.setAutogenFlag_ = function(val) {\n  // TODO(user): This whole autogen thing is very confusing. It needs\n  // to be refactored and/or explained.\n  this.autogenerateTextToDisplay_ = val;\n};\n\n\n/**\n * Disables autogen so that onUrlOrEmailInputChange_ doesn't act in cases\n * that are undesirable.\n * @param {boolean} autogen Boolean value to set disableAutogen to.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.disableAutogenFlag_ = function(autogen) {\n  this.setAutogenFlag_(!autogen);\n  this.disableAutogen_ = autogen;\n};\n\n\n/**\n * Creates an OK event from the text to display input and the specified link.\n * If text to display input is empty, then generate the auto value for it.\n * @return {!goog.ui.editor.LinkDialog.OkEvent} The event object to be used when\n *     dispatching the OK event to listeners.\n * @param {string} url Url the target element should point to.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.createOkEventFromUrl_ = function(url) {\n  // Fill in the text to display input in case it is empty.\n  this.setTextToDisplayFromAuto_();\n  if (this.showOpenLinkInNewWindow_) {\n    // Save checkbox state for next time.\n    this.isOpenLinkInNewWindowChecked_ = this.openInNewWindowCheckbox_.checked;\n  }\n  return new goog.ui.editor.LinkDialog.OkEvent(\n      this.textToDisplayInput_.value, url,\n      this.showOpenLinkInNewWindow_ && this.isOpenLinkInNewWindowChecked_,\n      this.showRelNoFollow_ && this.relNoFollowCheckbox_.checked);\n};\n\n\n/**\n * If an email or url is being edited, set autogenerate to on if the text to\n * display matches the url.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.editor.LinkDialog.prototype.setAutogenFlagFromCurInput_ = function() {\n  var autogen = false;\n  if (!this.disableAutogen_) {\n    var tabInput = this.dom.getElement(\n        this.tabPane_.getCurrentTabId() +\n        goog.ui.editor.LinkDialog.Id_.TAB_INPUT_SUFFIX);\n    autogen = (tabInput.value == this.textToDisplayInput_.value);\n  }\n  this.setAutogenFlag_(autogen);\n};\n\n\n/**\n * @return {boolean} Whether the link is new.\n * @private\n */\ngoog.ui.editor.LinkDialog.prototype.isNewLink_ = function() {\n  return this.targetLink_.isNew();\n};\n\n\n/**\n * IDs for relevant DOM elements.\n * @enum {string}\n * @private\n */\ngoog.ui.editor.LinkDialog.Id_ = {\n  TEXT_TO_DISPLAY: 'linkdialog-text',\n  TEXT_TO_DISPLAY_LABEL: 'linkdialog-text-label',\n  ON_WEB_TAB: 'linkdialog-onweb',\n  ON_WEB_INPUT: 'linkdialog-onweb-tab-input',\n  EMAIL_ADDRESS_TAB: 'linkdialog-email',\n  EMAIL_ADDRESS_INPUT: 'linkdialog-email-tab-input',\n  EMAIL_WARNING: 'linkdialog-email-warning',\n  TAB_INPUT_SUFFIX: '-tab-input'\n};\n\n\n/**\n * Base name for the radio buttons group.\n * @type {string}\n * @private\n */\ngoog.ui.editor.LinkDialog.BUTTON_GROUP_ = 'linkdialog-buttons';\n\n\n/**\n * Class name for the url and email input elements.\n * @type {string}\n * @private\n */\ngoog.ui.editor.LinkDialog.TARGET_INPUT_CLASSNAME_ =\n    goog.getCssName('tr-link-dialog-target-input');\n\n\n/**\n * Class name for the email address warning element.\n * @type {string}\n * @private\n */\ngoog.ui.editor.LinkDialog.EMAIL_WARNING_CLASSNAME_ =\n    goog.getCssName('tr-link-dialog-email-warning');\n\n\n/**\n * Class name for the explanation text elements.\n * @type {string}\n * @private\n */\ngoog.ui.editor.LinkDialog.EXPLANATION_TEXT_CLASSNAME_ =\n    goog.getCssName('tr-link-dialog-explanation-text');\n","^;",1579837703000,"^<",["^=",["^1>","^1T","~$goog.html.SafeHtmlFormatter","^1O","~$goog.editor.focus","^2L","^1P","^1U","^1@","^?","^[","~$goog.ui.editor.messages","~$goog.window","~$goog.editor.Link","^64","^1E","~$goog.ui.editor.AbstractDialog","^3G","^1F","^1G","^2Y","~$goog.string.Unicode","~$goog.ui.Button","^1Y","^1I","^12","~$goog.ui.LinkButtonRenderer"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/editor/linkdialog.js"],"^O",["^=",["~$goog.ui.editor.LinkDialog","~$goog.ui.editor.LinkDialog.OkEvent","~$goog.ui.editor.LinkDialog.BeforeTestLinkEvent","~$goog.ui.editor.LinkDialog.EventType"]],"^W",true,"^X",["^?","^1O","^3G","^1>","^1U","^12","^1E","^1@","^69","^66","^1G","^2Y","^1T","^64","^1I","^65","^2L","^6;","^1F","^6<","^1P","^6=","^6:","^1Y","^67","^[","^68"]],["^ ","^3",[1579837703000],"^4","goog.testing.proto2.proto2.js","^5",["^6","goog/testing/proto2/proto2.js"],"^7","goog/testing/proto2/proto2.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Test helpers to compare goog.proto2.Messages.\n *\n */\n\ngoog.setTestOnly('goog.testing.proto2');\ngoog.provide('goog.testing.proto2');\n\ngoog.require('goog.proto2.Message');\ngoog.require('goog.proto2.ObjectSerializer');\ngoog.require('goog.testing.asserts');\n\n\n/**\n * Compares two goog.proto2.Message instances of the same type.\n * @param {!goog.proto2.Message} expected First message.\n * @param {!goog.proto2.Message} actual Second message.\n * @param {string} path Path to the messages.\n * @return {string} A string describing where they differ. Empty string if they\n *     are equal.\n * @private\n */\ngoog.testing.proto2.findDifferences_ = function(expected, actual, path) {\n  var fields = expected.getDescriptor().getFields();\n  for (var i = 0; i < fields.length; i++) {\n    var field = fields[i];\n    var newPath = (path ? path + '/' : '') + field.getName();\n\n    if (expected.has(field) && !actual.has(field)) {\n      return newPath + ' should be present';\n    }\n    if (!expected.has(field) && actual.has(field)) {\n      return newPath + ' should not be present';\n    }\n\n    if (expected.has(field)) {\n      var isComposite = field.isCompositeType();\n\n      if (field.isRepeated()) {\n        var expectedCount = expected.countOf(field);\n        var actualCount = actual.countOf(field);\n        if (expectedCount != actualCount) {\n          return newPath + ' should have ' + expectedCount + ' items, ' +\n              'but has ' + actualCount;\n        }\n\n        for (var j = 0; j < expectedCount; j++) {\n          var expectedItem = expected.get(field, j);\n          var actualItem = actual.get(field, j);\n          if (isComposite) {\n            var itemDiff = goog.testing.proto2.findDifferences_(\n                /** @type {!goog.proto2.Message} */ (expectedItem),\n                /** @type {!goog.proto2.Message} */ (actualItem),\n                newPath + '[' + j + ']');\n            if (itemDiff) {\n              return itemDiff;\n            }\n          } else {\n            if (expectedItem != actualItem) {\n              return newPath + '[' + j + '] should be ' + expectedItem +\n                  ', but was ' + actualItem;\n            }\n          }\n        }\n      } else {\n        var expectedValue = expected.get(field);\n        var actualValue = actual.get(field);\n        if (isComposite) {\n          var diff = goog.testing.proto2.findDifferences_(\n              /** @type {!goog.proto2.Message} */ (expectedValue),\n              /** @type {!goog.proto2.Message} */ (actualValue), newPath);\n          if (diff) {\n            return diff;\n          }\n        } else {\n          if (expectedValue != actualValue) {\n            return newPath + ' should be ' + expectedValue + ', but was ' +\n                actualValue;\n          }\n        }\n      }\n    }\n  }\n\n  return '';\n};\n\n\n/**\n * Compares two goog.proto2.Message objects. Gives more readable output than\n * assertObjectEquals on mismatch.\n * @param {!goog.proto2.Message} expected Expected proto2 message.\n * @param {!goog.proto2.Message} actual Actual proto2 message.\n * @param {string=} opt_failureMessage Failure message when the values don't\n *     match.\n */\ngoog.testing.proto2.assertEquals = function(\n    expected, actual, opt_failureMessage) {\n  var failureSummary = opt_failureMessage || '';\n  if (!(expected instanceof goog.proto2.Message) ||\n      !(actual instanceof goog.proto2.Message)) {\n    goog.testing.asserts.raiseException(\n        failureSummary,\n        'Bad arguments were passed to goog.testing.proto2.assertEquals');\n  }\n  if (expected.constructor != actual.constructor) {\n    goog.testing.asserts.raiseException(\n        failureSummary, 'Message type mismatch: ' +\n            expected.getDescriptor().getFullName() + ' != ' +\n            actual.getDescriptor().getFullName());\n  }\n  var diff = goog.testing.proto2.findDifferences_(expected, actual, '');\n  if (diff) {\n    goog.testing.asserts.raiseException(failureSummary, diff);\n  }\n};\n\n\n/**\n * Helper function to quickly build protocol buffer messages from JSON objects.\n * @param {function(new:MessageType)} messageCtor A constructor that\n *     creates a `goog.proto2.Message` subclass instance.\n * @param {!Object} json JSON object which uses field names as keys.\n * @return {MessageType} The deserialized protocol buffer.\n * @template MessageType\n */\ngoog.testing.proto2.fromObject = function(messageCtor, json) {\n  var serializer = new goog.proto2.ObjectSerializer(\n      goog.proto2.ObjectSerializer.KeyOption.NAME);\n  var message = new messageCtor;\n  serializer.deserializeTo(message, json);\n  return message;\n};\n","^;",1579837703000,"^<",["^=",["^5[","^?","~$goog.proto2.ObjectSerializer","~$goog.proto2.Message"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/proto2/proto2.js"],"^O",["^=",["~$goog.testing.proto2"]],"^W",true,"^X",["^?","^6C","^6B","^5["]],["^ ","^3",[1579837703000],"^4","goog.math.exponentialbackoff.js","^5",["^6","goog/math/exponentialbackoff.js"],"^7","goog/math/exponentialbackoff.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Utility class to manage the mathematics behind computing an\n * exponential backoff model.  Given an initial backoff value and a maximum\n * backoff value, every call to backoff() will double the value until maximum\n * backoff value is reached.\n *\n */\n\n\ngoog.provide('goog.math.ExponentialBackoff');\n\ngoog.require('goog.asserts');\n\n\n\n/**\n * @struct\n * @constructor\n *\n * @param {number} initialValue The initial backoff value.\n * @param {number} maxValue The maximum backoff value.\n * @param {number=} opt_randomFactor When set, adds randomness to the backoff\n *     and decay to avoid a thundering herd problem. Should be a number between\n *     0 and 1, where 0 means no randomness and 1 means a factor of 0x to 2x.\n * @param {number=} opt_backoffFactor The factor to backoff by. Defaults to 2.\n *     Should be a number greater than 1.\n * @param {number=} opt_decayFactor The factor to decay by. Defaults to 2.\n *     Should be a number greater than one.\n */\ngoog.math.ExponentialBackoff = function(\n    initialValue, maxValue, opt_randomFactor, opt_backoffFactor,\n    opt_decayFactor) {\n  goog.asserts.assert(\n      initialValue > 0, 'Initial value must be greater than zero.');\n  goog.asserts.assert(\n      maxValue >= initialValue,\n      'Max value should be at least as large as initial value.');\n\n  if (opt_randomFactor !== undefined) {\n    goog.asserts.assert(\n        opt_randomFactor >= 0 && opt_randomFactor <= 1,\n        'Randomness factor should be between 0 and 1.');\n  }\n\n  if (opt_backoffFactor !== undefined) {\n    goog.asserts.assert(\n        opt_backoffFactor > 1, 'Backoff factor should be greater than 1');\n  }\n\n  if (opt_decayFactor !== undefined) {\n    goog.asserts.assert(\n        opt_decayFactor >= 1, 'Decay factor should be greater than 1');\n  }\n\n  /**\n   * @type {number}\n   * @private\n   */\n  this.initialValue_ = initialValue;\n\n  /**\n   * @type {number}\n   * @private\n   */\n  this.maxValue_ = maxValue;\n\n  /**\n   * The current backoff value.\n   * @type {number}\n   * @private\n   */\n  this.currValue_ = initialValue;\n\n  /**\n   * The current backoff value minus the random wait (if there is any).\n   * @type {number}\n   * @private\n   */\n  this.currBaseValue_ = initialValue;\n\n  /**\n   * The random factor to apply to the backoff value to avoid a thundering herd\n   * problem. Should be a number between 0 and 1, where 0 means no randomness\n   * and 1 means a factor of 0x to 2x.\n   * @type {number}\n   * @private\n   */\n  this.randomFactor_ = opt_randomFactor || 0;\n\n  /**\n   * Factor to backoff by.\n   * @type {number}\n   * @private\n   */\n  this.backoffFactor_ = opt_backoffFactor || 2;\n\n  /**\n   * Factor to decay by.\n   * @type {number}\n   * @private\n   */\n  this.decayFactor_ = opt_decayFactor || 2;\n};\n\n\n/**\n * The number of backoffs that have happened.\n * @type {number}\n * @private\n */\ngoog.math.ExponentialBackoff.prototype.currBackoffCount_ = 0;\n\n\n/**\n * The number of decays that have happened.\n * @type {number}\n * @private\n */\ngoog.math.ExponentialBackoff.prototype.currDecayCount_ = 0;\n\n\n/**\n * Resets the backoff value to its initial value.\n */\ngoog.math.ExponentialBackoff.prototype.reset = function() {\n  this.currValue_ = this.initialValue_;\n  this.currBaseValue_ = this.initialValue_;\n  this.currBackoffCount_ = 0;\n  this.currDecayCount_ = 0;\n};\n\n\n/**\n * @return {number} The current backoff value.\n */\ngoog.math.ExponentialBackoff.prototype.getValue = function() {\n  return this.currValue_;\n};\n\n\n/**\n * @return {number} The number of times this class has backed off.\n */\ngoog.math.ExponentialBackoff.prototype.getBackoffCount = function() {\n  return this.currBackoffCount_;\n};\n\n\n/**\n * @return {number} The number of times this class has decayed.\n */\ngoog.math.ExponentialBackoff.prototype.getDecayCount = function() {\n  return this.currDecayCount_;\n};\n\n\n/**\n * Initiates a backoff.\n */\ngoog.math.ExponentialBackoff.prototype.backoff = function() {\n  // If we haven't hit the maximum value yet, keep increasing the base value.\n  this.currBaseValue_ =\n      Math.min(this.maxValue_, this.currBaseValue_ * this.backoffFactor_);\n\n  var randomWait = this.randomFactor_ ?\n      Math.round(\n          this.randomFactor_ * (Math.random() - 0.5) * 2 *\n          this.currBaseValue_) :\n      0;\n  this.currValue_ = Math.min(this.maxValue_, this.currBaseValue_ + randomWait);\n  this.currBackoffCount_++;\n};\n\n\n/**\n * Initiates a decay.\n */\ngoog.math.ExponentialBackoff.prototype.decay = function() {\n  // If we haven't hit the initial value yet, keep decreasing the base value.\n  this.currBaseValue_ =\n      Math.max(this.initialValue_, this.currBaseValue_ / this.decayFactor_);\n\n  var randomWait = this.randomFactor_ ?\n      Math.round(\n          this.randomFactor_ * (Math.random() - 0.5) * 2 *\n          this.currBaseValue_) :\n      0;\n  this.currValue_ =\n      Math.max(this.initialValue_, this.currBaseValue_ + randomWait);\n  this.currDecayCount_++;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/exponentialbackoff.js"],"^O",["^=",["~$goog.math.ExponentialBackoff"]],"^W",true,"^X",["^?","^1L"]],["^ ","^3",[1579837703000],"^4","goog.i18n.bidiformatter.js","^5",["^6","goog/i18n/bidiformatter.js"],"^7","goog/i18n/bidiformatter.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility for formatting text for display in a potentially\n * opposite-directionality context without garbling.\n * Mostly a port of http://go/formatter.cc.\n */\n\n\ngoog.provide('goog.i18n.BidiFormatter');\n\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.i18n.bidi');\ngoog.require('goog.i18n.bidi.Dir');\ngoog.require('goog.i18n.bidi.Format');\n\n\n\n/**\n * Utility class for formatting text for display in a potentially\n * opposite-directionality context without garbling. Provides the following\n * functionality:\n *\n * 1. BiDi Wrapping\n * When text in one language is mixed into a document in another, opposite-\n * directionality language, e.g. when an English business name is embedded in a\n * Hebrew web page, both the inserted string and the text following it may be\n * displayed incorrectly unless the inserted string is explicitly separated\n * from the surrounding text in a \"wrapper\" that declares its directionality at\n * the start and then resets it back at the end. This wrapping can be done in\n * HTML mark-up (e.g. a 'span dir=\"rtl\"' tag) or - only in contexts where\n * mark-up can not be used - in Unicode BiDi formatting codes (LRE|RLE and PDF).\n * Providing such wrapping services is the basic purpose of the BiDi formatter.\n *\n * 2. Directionality estimation\n * How does one know whether a string about to be inserted into surrounding\n * text has the same directionality? Well, in many cases, one knows that this\n * must be the case when writing the code doing the insertion, e.g. when a\n * localized message is inserted into a localized page. In such cases there is\n * no need to involve the BiDi formatter at all. In the remaining cases, e.g.\n * when the string is user-entered or comes from a database, the language of\n * the string (and thus its directionality) is not known a priori, and must be\n * estimated at run-time. The BiDi formatter does this automatically.\n *\n * 3. Escaping\n * When wrapping plain text - i.e. text that is not already HTML or HTML-\n * escaped - in HTML mark-up, the text must first be HTML-escaped to prevent XSS\n * attacks and other nasty business. This of course is always true, but the\n * escaping can not be done after the string has already been wrapped in\n * mark-up, so the BiDi formatter also serves as a last chance and includes\n * escaping services.\n *\n * Thus, in a single call, the formatter will escape the input string as\n * specified, determine its directionality, and wrap it as necessary. It is\n * then up to the caller to insert the return value in the output.\n *\n * See http://wiki/Main/TemplatesAndBiDi for more information.\n *\n * @param {goog.i18n.bidi.Dir|number|boolean|null} contextDir The context\n *     directionality, in one of the following formats:\n *     1. A goog.i18n.bidi.Dir constant. NEUTRAL is treated the same as null,\n *        i.e. unknown, for backward compatibility with legacy calls.\n *     2. A number (positive = LTR, negative = RTL, 0 = unknown).\n *     3. A boolean (true = RTL, false = LTR).\n *     4. A null for unknown directionality.\n * @param {boolean=} opt_alwaysSpan Whether {@link #spanWrap} should always\n *     use a 'span' tag, even when the input directionality is neutral or\n *     matches the context, so that the DOM structure of the output does not\n *     depend on the combination of directionalities. Default: false.\n * @constructor\n * @final\n */\ngoog.i18n.BidiFormatter = function(contextDir, opt_alwaysSpan) {\n  /**\n   * The overall directionality of the context in which the formatter is being\n   * used.\n   * @type {?goog.i18n.bidi.Dir}\n   * @private\n   */\n  this.contextDir_ = goog.i18n.bidi.toDir(contextDir, true /* opt_noNeutral */);\n\n  /**\n   * Whether {@link #spanWrap} and similar methods should always use the same\n   * span structure, regardless of the combination of directionalities, for a\n   * stable DOM structure.\n   * @type {boolean}\n   * @private\n   */\n  this.alwaysSpan_ = !!opt_alwaysSpan;\n};\n\n\n/**\n * @return {?goog.i18n.bidi.Dir} The context directionality.\n */\ngoog.i18n.BidiFormatter.prototype.getContextDir = function() {\n  return this.contextDir_;\n};\n\n\n/**\n * @return {boolean} Whether alwaysSpan is set.\n */\ngoog.i18n.BidiFormatter.prototype.getAlwaysSpan = function() {\n  return this.alwaysSpan_;\n};\n\n\n/**\n * @param {goog.i18n.bidi.Dir|number|boolean|null} contextDir The context\n *     directionality, in one of the following formats:\n *     1. A goog.i18n.bidi.Dir constant. NEUTRAL is treated the same as null,\n *        i.e. unknown.\n *     2. A number (positive = LTR, negative = RTL, 0 = unknown).\n *     3. A boolean (true = RTL, false = LTR).\n *     4. A null for unknown directionality.\n */\ngoog.i18n.BidiFormatter.prototype.setContextDir = function(contextDir) {\n  this.contextDir_ = goog.i18n.bidi.toDir(contextDir, true /* opt_noNeutral */);\n};\n\n\n/**\n * @param {boolean} alwaysSpan Whether {@link #spanWrap} should always use a\n *     'span' tag, even when the input directionality is neutral or matches the\n *     context, so that the DOM structure of the output does not depend on the\n *     combination of directionalities.\n */\ngoog.i18n.BidiFormatter.prototype.setAlwaysSpan = function(alwaysSpan) {\n  this.alwaysSpan_ = alwaysSpan;\n};\n\n\n/**\n * Returns the directionality of input argument `str`.\n * Identical to {@link goog.i18n.bidi.estimateDirection}.\n *\n * @param {string} str The input text.\n * @param {boolean=} opt_isHtml Whether `str` is HTML / HTML-escaped.\n *     Default: false.\n * @return {goog.i18n.bidi.Dir} Estimated overall directionality of `str`.\n */\ngoog.i18n.BidiFormatter.prototype.estimateDirection =\n    goog.i18n.bidi.estimateDirection;\n\n\n/**\n * Returns true if two given directionalities are opposite.\n * Note: the implementation is based on the numeric values of the Dir enum.\n *\n * @param {?goog.i18n.bidi.Dir} dir1 1st directionality.\n * @param {?goog.i18n.bidi.Dir} dir2 2nd directionality.\n * @return {boolean} Whether the directionalities are opposite.\n * @private\n */\ngoog.i18n.BidiFormatter.prototype.areDirectionalitiesOpposite_ = function(\n    dir1, dir2) {\n  return Number(dir1) * Number(dir2) < 0;\n};\n\n\n/**\n * Returns a unicode BiDi mark matching the context directionality (LRM or\n * RLM) if `opt_dirReset`, and if either the directionality or the exit\n * directionality of `str` is opposite to the context directionality.\n * Otherwise returns the empty string.\n *\n * @param {string} str The input text.\n * @param {goog.i18n.bidi.Dir} dir `str`'s overall directionality.\n * @param {boolean=} opt_isHtml Whether `str` is HTML / HTML-escaped.\n *     Default: false.\n * @param {boolean=} opt_dirReset Whether to perform the reset. Default: false.\n * @return {string} A unicode BiDi mark or the empty string.\n * @private\n */\ngoog.i18n.BidiFormatter.prototype.dirResetIfNeeded_ = function(\n    str, dir, opt_isHtml, opt_dirReset) {\n  // endsWithRtl and endsWithLtr are called only if needed (short-circuit).\n  if (opt_dirReset &&\n      (this.areDirectionalitiesOpposite_(dir, this.contextDir_) ||\n       (this.contextDir_ == goog.i18n.bidi.Dir.LTR &&\n        goog.i18n.bidi.endsWithRtl(str, opt_isHtml)) ||\n       (this.contextDir_ == goog.i18n.bidi.Dir.RTL &&\n        goog.i18n.bidi.endsWithLtr(str, opt_isHtml)))) {\n    return this.contextDir_ == goog.i18n.bidi.Dir.LTR ?\n        goog.i18n.bidi.Format.LRM :\n        goog.i18n.bidi.Format.RLM;\n  } else {\n    return '';\n  }\n};\n\n\n/**\n * Returns \"rtl\" if `str`'s estimated directionality is RTL, and \"ltr\" if\n * it is LTR. In case it's NEUTRAL, returns \"rtl\" if the context directionality\n * is RTL, and \"ltr\" otherwise.\n * Needed for GXP, which can't handle dirAttr.\n * Example use case:\n * &lt;td expr:dir='bidiFormatter.dirAttrValue(foo)'&gt;\n *   &lt;gxp:eval expr='foo'&gt;\n * &lt;/td&gt;\n *\n * @param {string} str Text whose directionality is to be estimated.\n * @param {boolean=} opt_isHtml Whether `str` is HTML / HTML-escaped.\n *     Default: false.\n * @return {string} \"rtl\" or \"ltr\", according to the logic described above.\n */\ngoog.i18n.BidiFormatter.prototype.dirAttrValue = function(str, opt_isHtml) {\n  return this.knownDirAttrValue(this.estimateDirection(str, opt_isHtml));\n};\n\n\n/**\n * Returns \"rtl\" if the given directionality is RTL, and \"ltr\" if it is LTR. In\n * case it's NEUTRAL, returns \"rtl\" if the context directionality is RTL, and\n * \"ltr\" otherwise.\n *\n * @param {goog.i18n.bidi.Dir} dir A directionality.\n * @return {string} \"rtl\" or \"ltr\", according to the logic described above.\n */\ngoog.i18n.BidiFormatter.prototype.knownDirAttrValue = function(dir) {\n  var resolvedDir = dir == goog.i18n.bidi.Dir.NEUTRAL ? this.contextDir_ : dir;\n  return resolvedDir == goog.i18n.bidi.Dir.RTL ? 'rtl' : 'ltr';\n};\n\n\n/**\n * Returns 'dir=\"ltr\"' or 'dir=\"rtl\"', depending on `str`'s estimated\n * directionality, if it is not the same as the context directionality.\n * Otherwise, returns the empty string.\n *\n * @param {string} str Text whose directionality is to be estimated.\n * @param {boolean=} opt_isHtml Whether `str` is HTML / HTML-escaped.\n *     Default: false.\n * @return {string} 'dir=\"rtl\"' for RTL text in non-RTL context; 'dir=\"ltr\"' for\n *     LTR text in non-LTR context; else, the empty string.\n */\ngoog.i18n.BidiFormatter.prototype.dirAttr = function(str, opt_isHtml) {\n  return this.knownDirAttr(this.estimateDirection(str, opt_isHtml));\n};\n\n\n/**\n * Returns 'dir=\"ltr\"' or 'dir=\"rtl\"', depending on the given directionality, if\n * it is not the same as the context directionality. Otherwise, returns the\n * empty string.\n *\n * @param {goog.i18n.bidi.Dir} dir A directionality.\n * @return {string} 'dir=\"rtl\"' for RTL text in non-RTL context; 'dir=\"ltr\"' for\n *     LTR text in non-LTR context; else, the empty string.\n */\ngoog.i18n.BidiFormatter.prototype.knownDirAttr = function(dir) {\n  if (dir != this.contextDir_) {\n    return dir == goog.i18n.bidi.Dir.RTL ?\n        'dir=\"rtl\"' :\n        dir == goog.i18n.bidi.Dir.LTR ? 'dir=\"ltr\"' : '';\n  }\n  return '';\n};\n\n\n/**\n * Formats a string of unknown directionality for use in HTML output of the\n * context directionality, so an opposite-directionality string is neither\n * garbled nor garbles what follows it.\n * The algorithm: estimates the directionality of input argument `html`.\n * In case its directionality doesn't match the context directionality, wraps it\n * with a 'span' tag and adds a \"dir\" attribute (either 'dir=\"rtl\"' or\n * 'dir=\"ltr\"'). If setAlwaysSpan(true) was used, the input is always wrapped\n * with 'span', skipping just the dir attribute when it's not needed.\n *\n * If `opt_dirReset`, and if the overall directionality or the exit\n * directionality of `str` are opposite to the context directionality, a\n * trailing unicode BiDi mark matching the context directionality is appened\n * (LRM or RLM).\n *\n * @param {!goog.html.SafeHtml} html The input HTML.\n * @param {boolean=} opt_dirReset Whether to append a trailing unicode bidi mark\n *     matching the context directionality, when needed, to prevent the possible\n *     garbling of whatever may follow `html`. Default: true.\n * @return {!goog.html.SafeHtml} Input text after applying the processing.\n */\ngoog.i18n.BidiFormatter.prototype.spanWrapSafeHtml = function(\n    html, opt_dirReset) {\n  return this.spanWrapSafeHtmlWithKnownDir(null, html, opt_dirReset);\n};\n\n\n/**\n * Formats a string of given directionality for use in HTML output of the\n * context directionality, so an opposite-directionality string is neither\n * garbled nor garbles what follows it.\n * The algorithm: If `dir` doesn't match the context directionality, wraps\n * `html` with a 'span' tag and adds a \"dir\" attribute (either 'dir=\"rtl\"'\n * or 'dir=\"ltr\"'). If setAlwaysSpan(true) was used, the input is always wrapped\n * with 'span', skipping just the dir attribute when it's not needed.\n *\n * If `opt_dirReset`, and if `dir` or the exit directionality of\n * `html` are opposite to the context directionality, a trailing unicode\n * BiDi mark matching the context directionality is appened (LRM or RLM).\n *\n * @param {?goog.i18n.bidi.Dir} dir `html`'s overall directionality, or\n *     null if unknown and needs to be estimated.\n * @param {!goog.html.SafeHtml} html The input HTML.\n * @param {boolean=} opt_dirReset Whether to append a trailing unicode bidi mark\n *     matching the context directionality, when needed, to prevent the possible\n *     garbling of whatever may follow `html`. Default: true.\n * @return {!goog.html.SafeHtml} Input text after applying the processing.\n */\ngoog.i18n.BidiFormatter.prototype.spanWrapSafeHtmlWithKnownDir = function(\n    dir, html, opt_dirReset) {\n  if (dir == null) {\n    dir = this.estimateDirection(goog.html.SafeHtml.unwrap(html), true);\n  }\n  return this.spanWrapWithKnownDir_(dir, html, opt_dirReset);\n};\n\n\n/**\n * The internal implementation of spanWrapSafeHtmlWithKnownDir for non-null dir,\n * to help the compiler optimize.\n *\n * @param {goog.i18n.bidi.Dir} dir `str`'s overall directionality.\n * @param {!goog.html.SafeHtml} html The input HTML.\n * @param {boolean=} opt_dirReset Whether to append a trailing unicode bidi mark\n *     matching the context directionality, when needed, to prevent the possible\n *     garbling of whatever may follow `str`. Default: true.\n * @return {!goog.html.SafeHtml} Input text after applying the above processing.\n * @private\n */\ngoog.i18n.BidiFormatter.prototype.spanWrapWithKnownDir_ = function(\n    dir, html, opt_dirReset) {\n  opt_dirReset = opt_dirReset || (opt_dirReset == undefined);\n\n  var result;\n  // Whether to add the \"dir\" attribute.\n  var dirCondition =\n      dir != goog.i18n.bidi.Dir.NEUTRAL && dir != this.contextDir_;\n  if (this.alwaysSpan_ || dirCondition) {  // Wrap is needed\n    var dirAttribute;\n    if (dirCondition) {\n      dirAttribute = dir == goog.i18n.bidi.Dir.RTL ? 'rtl' : 'ltr';\n    }\n    result = goog.html.SafeHtml.create('span', {'dir': dirAttribute}, html);\n  } else {\n    result = html;\n  }\n  var str = goog.html.SafeHtml.unwrap(html);\n  result = goog.html.SafeHtml.concatWithDir(\n      goog.i18n.bidi.Dir.NEUTRAL, result,\n      this.dirResetIfNeeded_(str, dir, true, opt_dirReset));\n  return result;\n};\n\n\n/**\n * Formats a string of unknown directionality for use in plain-text output of\n * the context directionality, so an opposite-directionality string is neither\n * garbled nor garbles what follows it.\n * As opposed to {@link #spanWrap}, this makes use of unicode BiDi formatting\n * characters. In HTML, its *only* valid use is inside of elements that do not\n * allow mark-up, e.g. an 'option' tag.\n * The algorithm: estimates the directionality of input argument `str`.\n * In case it doesn't match  the context directionality, wraps it with Unicode\n * BiDi formatting characters: RLE`str`PDF for RTL text, and\n * LRE`str`PDF for LTR text.\n *\n * If `opt_dirReset`, and if the overall directionality or the exit\n * directionality of `str` are opposite to the context directionality, a\n * trailing unicode BiDi mark matching the context directionality is appended\n * (LRM or RLM).\n *\n * Does *not* do HTML-escaping regardless of the value of `opt_isHtml`.\n * The return value can be HTML-escaped as necessary.\n *\n * @param {string} str The input text.\n * @param {boolean=} opt_isHtml Whether `str` is HTML / HTML-escaped.\n *     Default: false.\n * @param {boolean=} opt_dirReset Whether to append a trailing unicode bidi mark\n *     matching the context directionality, when needed, to prevent the possible\n *     garbling of whatever may follow `str`. Default: true.\n * @return {string} Input text after applying the above processing.\n */\ngoog.i18n.BidiFormatter.prototype.unicodeWrap = function(\n    str, opt_isHtml, opt_dirReset) {\n  return this.unicodeWrapWithKnownDir(null, str, opt_isHtml, opt_dirReset);\n};\n\n\n/**\n * Formats a string of given directionality for use in plain-text output of the\n * context directionality, so an opposite-directionality string is neither\n * garbled nor garbles what follows it.\n * As opposed to {@link #spanWrapWithKnownDir}, makes use of unicode BiDi\n * formatting characters. In HTML, its *only* valid use is inside of elements\n * that do not allow mark-up, e.g. an 'option' tag.\n * The algorithm: If `dir` doesn't match the context directionality, wraps\n * `str` with Unicode BiDi formatting characters: RLE`str`PDF for\n * RTL text, and LRE`str`PDF for LTR text.\n *\n * If `opt_dirReset`, and if the overall directionality or the exit\n * directionality of `str` are opposite to the context directionality, a\n * trailing unicode BiDi mark matching the context directionality is appended\n * (LRM or RLM).\n *\n * Does *not* do HTML-escaping regardless of the value of `opt_isHtml`.\n * The return value can be HTML-escaped as necessary.\n *\n * @param {?goog.i18n.bidi.Dir} dir `str`'s overall directionality, or\n *     null if unknown and needs to be estimated.\n * @param {string} str The input text.\n * @param {boolean=} opt_isHtml Whether `str` is HTML / HTML-escaped.\n *     Default: false.\n * @param {boolean=} opt_dirReset Whether to append a trailing unicode bidi mark\n *     matching the context directionality, when needed, to prevent the possible\n *     garbling of whatever may follow `str`. Default: true.\n * @return {string} Input text after applying the above processing.\n */\ngoog.i18n.BidiFormatter.prototype.unicodeWrapWithKnownDir = function(\n    dir, str, opt_isHtml, opt_dirReset) {\n  if (dir == null) {\n    dir = this.estimateDirection(str, opt_isHtml);\n  }\n  return this.unicodeWrapWithKnownDir_(dir, str, opt_isHtml, opt_dirReset);\n};\n\n\n/**\n * The internal implementation of unicodeWrapWithKnownDir for non-null dir, to\n * help the compiler optimize.\n *\n * @param {goog.i18n.bidi.Dir} dir `str`'s overall directionality.\n * @param {string} str The input text.\n * @param {boolean=} opt_isHtml Whether `str` is HTML / HTML-escaped.\n *     Default: false.\n * @param {boolean=} opt_dirReset Whether to append a trailing unicode bidi mark\n *     matching the context directionality, when needed, to prevent the possible\n *     garbling of whatever may follow `str`. Default: true.\n * @return {string} Input text after applying the above processing.\n * @private\n */\ngoog.i18n.BidiFormatter.prototype.unicodeWrapWithKnownDir_ = function(\n    dir, str, opt_isHtml, opt_dirReset) {\n  opt_dirReset = opt_dirReset || (opt_dirReset == undefined);\n  var result = [];\n  if (dir != goog.i18n.bidi.Dir.NEUTRAL && dir != this.contextDir_) {\n    result.push(\n        dir == goog.i18n.bidi.Dir.RTL ? goog.i18n.bidi.Format.RLE :\n                                        goog.i18n.bidi.Format.LRE);\n    result.push(str);\n    result.push(goog.i18n.bidi.Format.PDF);\n  } else {\n    result.push(str);\n  }\n\n  result.push(this.dirResetIfNeeded_(str, dir, opt_isHtml, opt_dirReset));\n  return result.join('');\n};\n\n\n/**\n * Returns a Unicode BiDi mark matching the context directionality (LRM or RLM)\n * if the directionality or the exit directionality of `str` are opposite\n * to the context directionality. Otherwise returns the empty string.\n *\n * @param {string} str The input text.\n * @param {boolean=} opt_isHtml Whether `str` is HTML / HTML-escaped.\n *     Default: false.\n * @return {string} A Unicode bidi mark matching the global directionality or\n *     the empty string.\n */\ngoog.i18n.BidiFormatter.prototype.markAfter = function(str, opt_isHtml) {\n  return this.markAfterKnownDir(null, str, opt_isHtml);\n};\n\n\n/**\n * Returns a Unicode BiDi mark matching the context directionality (LRM or RLM)\n * if the given directionality or the exit directionality of `str` are\n * opposite to the context directionality. Otherwise returns the empty string.\n *\n * @param {?goog.i18n.bidi.Dir} dir `str`'s overall directionality, or\n *     null if unknown and needs to be estimated.\n * @param {string} str The input text.\n * @param {boolean=} opt_isHtml Whether `str` is HTML / HTML-escaped.\n *     Default: false.\n * @return {string} A Unicode bidi mark matching the global directionality or\n *     the empty string.\n */\ngoog.i18n.BidiFormatter.prototype.markAfterKnownDir = function(\n    dir, str, opt_isHtml) {\n  if (dir == null) {\n    dir = this.estimateDirection(str, opt_isHtml);\n  }\n  return this.dirResetIfNeeded_(str, dir, opt_isHtml, true);\n};\n\n\n/**\n * Returns the Unicode BiDi mark matching the context directionality (LRM for\n * LTR context directionality, RLM for RTL context directionality), or the\n * empty string for neutral / unknown context directionality.\n *\n * @return {string} LRM for LTR context directionality and RLM for RTL context\n *     directionality.\n */\ngoog.i18n.BidiFormatter.prototype.mark = function() {\n  switch (this.contextDir_) {\n    case (goog.i18n.bidi.Dir.LTR):\n      return goog.i18n.bidi.Format.LRM;\n    case (goog.i18n.bidi.Dir.RTL):\n      return goog.i18n.bidi.Format.RLM;\n    default:\n      return '';\n  }\n};\n\n\n/**\n * Returns 'right' for RTL context directionality. Otherwise (LTR or neutral /\n * unknown context directionality) returns 'left'.\n *\n * @return {string} 'right' for RTL context directionality and 'left' for other\n *     context directionality.\n */\ngoog.i18n.BidiFormatter.prototype.startEdge = function() {\n  return this.contextDir_ == goog.i18n.bidi.Dir.RTL ? goog.i18n.bidi.RIGHT :\n                                                      goog.i18n.bidi.LEFT;\n};\n\n\n/**\n * Returns 'left' for RTL context directionality. Otherwise (LTR or neutral /\n * unknown context directionality) returns 'right'.\n *\n * @return {string} 'left' for RTL context directionality and 'right' for other\n *     context directionality.\n */\ngoog.i18n.BidiFormatter.prototype.endEdge = function() {\n  return this.contextDir_ == goog.i18n.bidi.Dir.RTL ? goog.i18n.bidi.LEFT :\n                                                      goog.i18n.bidi.RIGHT;\n};\n","^;",1579837703000,"^<",["^=",["~$goog.i18n.bidi.Format","^?","~$goog.i18n.bidi.Dir","~$goog.i18n.bidi","^1I"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/bidiformatter.js"],"^O",["^=",["~$goog.i18n.BidiFormatter"]],"^W",true,"^X",["^?","^1I","^6H","^6G","^6F"]],["^ ","^3",[1579837703000],"^4","goog.fs.filewriter.js","^5",["^6","goog/fs/filewriter.js"],"^7","goog/fs/filewriter.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A wrapper for the HTML5 FileWriter object.\n *\n * When adding or modifying functionality in this namespace, be sure to update\n * the mock counterparts in goog.testing.fs.\n *\n */\n\ngoog.provide('goog.fs.FileWriter');\n\ngoog.require('goog.fs.Error');\ngoog.require('goog.fs.FileSaver');\n\n\n\n/**\n * An object for monitoring the saving of files, as well as other fine-grained\n * writing operations.\n *\n * This should not be instantiated directly. Instead, it should be accessed via\n * {@link goog.fs.FileEntry#createWriter}.\n *\n * @param {!FileWriter} writer The underlying FileWriter object.\n * @constructor\n * @extends {goog.fs.FileSaver}\n * @final\n */\ngoog.fs.FileWriter = function(writer) {\n  goog.fs.FileWriter.base(this, 'constructor', writer);\n\n  /**\n   * The underlying FileWriter object.\n   *\n   * @type {!FileWriter}\n   * @private\n   */\n  this.writer_ = writer;\n};\ngoog.inherits(goog.fs.FileWriter, goog.fs.FileSaver);\n\n\n/**\n * @return {number} The byte offset at which the next write will occur.\n */\ngoog.fs.FileWriter.prototype.getPosition = function() {\n  return this.writer_.position;\n};\n\n\n/**\n * @return {number} The length of the file.\n */\ngoog.fs.FileWriter.prototype.getLength = function() {\n  return this.writer_.length;\n};\n\n\n/**\n * Write data to the file.\n *\n * @param {!Blob} blob The data to write.\n */\ngoog.fs.FileWriter.prototype.write = function(blob) {\n  try {\n    this.writer_.write(blob);\n  } catch (e) {\n    throw new goog.fs.Error(e, 'writing file');\n  }\n};\n\n\n/**\n * Set the file position at which the next write will occur.\n *\n * @param {number} offset An absolute byte offset into the file.\n */\ngoog.fs.FileWriter.prototype.seek = function(offset) {\n  try {\n    this.writer_.seek(offset);\n  } catch (e) {\n    throw new goog.fs.Error(e, 'seeking in file');\n  }\n};\n\n\n/**\n * Changes the length of the file to that specified.\n *\n * @param {number} size The new size of the file, in bytes.\n */\ngoog.fs.FileWriter.prototype.truncate = function(size) {\n  try {\n    this.writer_.truncate(size);\n  } catch (e) {\n    throw new goog.fs.Error(e, 'truncating file');\n  }\n};\n","^;",1579837703000,"^<",["^=",["~$goog.fs.FileSaver","~$goog.fs.Error","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fs/filewriter.js"],"^O",["^=",["~$goog.fs.FileWriter"]],"^W",true,"^X",["^?","^6K","^6J"]],["^ ","^3",[1579837703000],"^4","goog.ui.tabbarrenderer.js","^5",["^6","goog/ui/tabbarrenderer.js"],"^7","goog/ui/tabbarrenderer.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Default renderer for {@link goog.ui.TabBar}s.  Based on the\n * original `TabPane` code.\n *\n * @author attila@google.com (Attila Bodis)\n * @author eae@google.com (Emil A. Eklund)\n */\n\ngoog.provide('goog.ui.TabBarRenderer');\n\ngoog.forwardDeclare('goog.ui.Container');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.object');\ngoog.require('goog.ui.ContainerRenderer');\n\n\n\n/**\n * Default renderer for {@link goog.ui.TabBar}s, based on the `TabPane`\n * code.  The tab bar's DOM structure is determined by its orientation and\n * location relative to tab contents.  For example, a horizontal tab bar\n * located above tab contents looks like this:\n *\n *    <div class=\"goog-tab-bar goog-tab-bar-horizontal goog-tab-bar-top\">\n *      ...(tabs here)...\n *    </div>\n *\n * @constructor\n * @extends {goog.ui.ContainerRenderer}\n */\ngoog.ui.TabBarRenderer = function() {\n  goog.ui.ContainerRenderer.call(this, goog.a11y.aria.Role.TAB_LIST);\n};\ngoog.inherits(goog.ui.TabBarRenderer, goog.ui.ContainerRenderer);\ngoog.addSingletonGetter(goog.ui.TabBarRenderer);\ngoog.tagUnsealableClass(goog.ui.TabBarRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.TabBarRenderer.CSS_CLASS = goog.getCssName('goog-tab-bar');\n\n\n/**\n * Returns the CSS class name to be applied to the root element of all tab bars\n * rendered or decorated using this renderer.\n * @return {string} Renderer-specific CSS class name.\n * @override\n */\ngoog.ui.TabBarRenderer.prototype.getCssClass = function() {\n  return goog.ui.TabBarRenderer.CSS_CLASS;\n};\n\n\n/**\n * Sets the tab bar's state based on the given CSS class name, encountered\n * during decoration.  Overrides the superclass implementation by recognizing\n * class names representing tab bar orientation and location.\n * @param {goog.ui.Container} tabBar Tab bar to configure.\n * @param {string} className CSS class name.\n * @param {string} baseClass Base class name used as the root of state-specific\n *     class names (typically the renderer's own class name).\n * @protected\n * @override\n */\ngoog.ui.TabBarRenderer.prototype.setStateFromClassName = function(\n    tabBar, className, baseClass) {\n  // Create the class-to-location lookup table on first access.\n  if (!this.locationByClass_) {\n    this.createLocationByClassMap_();\n  }\n\n  // If the class name corresponds to a location, update the tab bar's location;\n  // otherwise let the superclass handle it.\n  var location = this.locationByClass_[className];\n  if (location) {\n    tabBar.setLocation(location);\n  } else {\n    goog.ui.TabBarRenderer.superClass_.setStateFromClassName.call(\n        this, tabBar, className, baseClass);\n  }\n};\n\n\n/**\n * Returns all CSS class names applicable to the tab bar, based on its state.\n * Overrides the superclass implementation by appending the location-specific\n * class name to the list.\n * @param {goog.ui.Container} tabBar Tab bar whose CSS classes are to be\n *     returned.\n * @return {!Array<string>} Array of CSS class names applicable to the tab bar.\n * @override\n */\ngoog.ui.TabBarRenderer.prototype.getClassNames = function(tabBar) {\n  var classNames =\n      goog.ui.TabBarRenderer.superClass_.getClassNames.call(this, tabBar);\n\n  // Create the location-to-class lookup table on first access.\n  if (!this.classByLocation_) {\n    this.createClassByLocationMap_();\n  }\n\n  // Apped the class name corresponding to the tab bar's location to the list.\n  classNames.push(this.classByLocation_[tabBar.getLocation()]);\n  return classNames;\n};\n\n\n/**\n * Creates the location-to-class lookup table.\n * @private\n */\ngoog.ui.TabBarRenderer.prototype.createClassByLocationMap_ = function() {\n  var baseClass = this.getCssClass();\n\n  /**\n   * Map of locations to location-specific structural class names,\n   * precomputed and cached on first use to minimize object allocations\n   * and string concatenation.\n   * @type {Object}\n   * @private\n   * @suppress {missingRequire} goog.ui.TabBar\n   */\n  this.classByLocation_ = goog.object.create(\n      goog.ui.TabBar.Location.TOP, goog.getCssName(baseClass, 'top'),\n      goog.ui.TabBar.Location.BOTTOM, goog.getCssName(baseClass, 'bottom'),\n      goog.ui.TabBar.Location.START, goog.getCssName(baseClass, 'start'),\n      goog.ui.TabBar.Location.END, goog.getCssName(baseClass, 'end'));\n};\n\n\n/**\n * Creates the class-to-location lookup table, used during decoration.\n * @private\n */\ngoog.ui.TabBarRenderer.prototype.createLocationByClassMap_ = function() {\n  // We need the classByLocation_ map so we can transpose it.\n  if (!this.classByLocation_) {\n    this.createClassByLocationMap_();\n  }\n\n  /**\n   * Map of location-specific structural class names to locations, used during\n   * element decoration.  Precomputed and cached on first use to minimize object\n   * allocations and string concatenation.\n   * @type {Object}\n   * @private\n   */\n  this.locationByClass_ = goog.object.transpose(this.classByLocation_);\n};\n","^;",1579837703000,"^<",["^=",["~$goog.ui.ContainerRenderer","~$goog.a11y.aria.Role","^?","^42"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/tabbarrenderer.js"],"^O",["^=",["~$goog.ui.TabBarRenderer"]],"^W",true,"^X",["^?","^6N","^42","^6M"]],["^ ","^3",[1579837703000],"^4","goog.graphics.groupelement.js","^5",["^6","goog/graphics/groupelement.js"],"^7","goog/graphics/groupelement.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A thin wrapper around the DOM element for graphics groups.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.graphics.GroupElement');\n\ngoog.require('goog.graphics.Element');\n\n\n\n/**\n * Interface for a graphics group element.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.AbstractGraphics} graphics The graphics creating\n *     this element.\n * @constructor\n * @extends {goog.graphics.Element}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n */\ngoog.graphics.GroupElement = function(element, graphics) {\n  goog.graphics.Element.call(this, element, graphics);\n};\ngoog.inherits(goog.graphics.GroupElement, goog.graphics.Element);\n\n\n/**\n * Remove all drawing elements from the group.\n */\ngoog.graphics.GroupElement.prototype.clear = goog.abstractMethod;\n\n\n/**\n * Set the size of the group element.\n * @param {number|string} width The width of the group element.\n * @param {number|string} height The height of the group element.\n */\ngoog.graphics.GroupElement.prototype.setSize = goog.abstractMethod;\n","^;",1579837703000,"^<",["^=",["^?","~$goog.graphics.Element"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/groupelement.js"],"^O",["^=",["^23"]],"^W",true,"^X",["^?","^6P"]],["^ ","^3",[1579837703000],"^4","goog.fx.dragdropgroup.js","^5",["^6","goog/fx/dragdropgroup.js"],"^7","goog/fx/dragdropgroup.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Multiple Element Drag and Drop.\n *\n * Drag and drop implementation for sources/targets consisting of multiple\n * elements.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/dragdrop.html\n */\n\ngoog.provide('goog.fx.DragDropGroup');\n\ngoog.require('goog.dom');\ngoog.require('goog.fx.AbstractDragDrop');\ngoog.require('goog.fx.DragDropItem');\n\n\n\n/**\n * Drag/drop implementation for creating drag sources/drop targets consisting of\n * multiple HTML Elements (items). All items share the same drop target(s) but\n * can be dragged individually.\n *\n * @extends {goog.fx.AbstractDragDrop}\n * @constructor\n * @struct\n */\ngoog.fx.DragDropGroup = function() {\n  goog.fx.AbstractDragDrop.call(this);\n};\ngoog.inherits(goog.fx.DragDropGroup, goog.fx.AbstractDragDrop);\n\n\n/**\n * Add item to drag object.\n *\n * @param {Element|string} element Dom Node, or string representation of node\n *     id, to be used as drag source/drop target.\n * @param {Object=} opt_data Data associated with the source/target.\n * @throws Error If no element argument is provided or if the type is\n *     invalid\n * @override\n */\ngoog.fx.DragDropGroup.prototype.addItem = function(element, opt_data) {\n  var item = new goog.fx.DragDropItem(element, opt_data);\n  this.addDragDropItem(item);\n};\n\n\n/**\n * Add DragDropItem to drag object.\n *\n * @param {goog.fx.DragDropItem} item DragDropItem being added to the\n *     drag object.\n * @throws Error If no element argument is provided or if the type is\n *     invalid\n */\ngoog.fx.DragDropGroup.prototype.addDragDropItem = function(item) {\n  item.setParent(this);\n  this.items_.push(item);\n  if (this.isInitialized()) {\n    this.initItem(item);\n  }\n};\n\n\n/**\n * Remove item from drag object.\n *\n * @param {Element|string} element Dom Node, or string representation of node\n *     id, that was previously added with addItem().\n */\ngoog.fx.DragDropGroup.prototype.removeItem = function(element) {\n  element = goog.dom.getElement(element);\n  for (var item, i = 0; item = this.items_[i]; i++) {\n    if (item.element == element) {\n      this.items_.splice(i, 1);\n      this.disposeItem(item);\n      break;\n    }\n  }\n};\n\n\n/**\n * Marks the supplied list of items as selected. A drag operation for any of the\n * selected items will affect all of them.\n *\n * @param {Array<goog.fx.DragDropItem>} list List of items to select or null to\n *     clear selection.\n *\n * TODO(eae): Not yet implemented.\n */\ngoog.fx.DragDropGroup.prototype.setSelection = function(list) {\n\n};\n","^;",1579837703000,"^<",["^=",["^1>","^?","~$goog.fx.AbstractDragDrop","~$goog.fx.DragDropItem"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/dragdropgroup.js"],"^O",["^=",["~$goog.fx.DragDropGroup"]],"^W",true,"^X",["^?","^1>","^6Q","^6R"]],["^ ","^3",[1579837703000],"^4","goog.messaging.portcaller.js","^5",["^6","goog/messaging/portcaller.js"],"^7","goog/messaging/portcaller.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The leaf node of a {@link goog.messaging.PortNetwork}. Callers\n * connect to the operator, and request connections with other contexts from it.\n *\n */\n\ngoog.provide('goog.messaging.PortCaller');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.async.Deferred');\ngoog.require('goog.messaging.DeferredChannel');\ngoog.require('goog.messaging.PortChannel');\ngoog.require('goog.messaging.PortNetwork');  // interface\ngoog.require('goog.object');\n\n\n\n/**\n * The leaf node of a network.\n *\n * @param {!goog.messaging.MessageChannel} operatorPort The channel for\n *     communicating with the operator. The other side of this channel should be\n *     passed to {@link goog.messaging.PortOperator#addPort}. Must be either a\n *     {@link goog.messaging.PortChannel} or a decorator wrapping a PortChannel;\n *     in particular, it must be able to send and receive {@link MessagePort}s.\n * @constructor\n * @extends {goog.Disposable}\n * @implements {goog.messaging.PortNetwork}\n * @final\n */\ngoog.messaging.PortCaller = function(operatorPort) {\n  goog.messaging.PortCaller.base(this, 'constructor');\n\n  /**\n   * The channel to the {@link goog.messaging.PortOperator} for this network.\n   *\n   * @type {!goog.messaging.MessageChannel}\n   * @private\n   */\n  this.operatorPort_ = operatorPort;\n\n  /**\n   * The collection of channels for communicating with other contexts in the\n   * network. Each value can contain a {@link goog.aync.Deferred} and/or a\n   * {@link goog.messaging.MessageChannel}.\n   *\n   * If the value contains a Deferred, then the channel is a\n   * {@link goog.messaging.DeferredChannel} wrapping that Deferred. The Deferred\n   * will be resolved with a {@link goog.messaging.PortChannel} once we receive\n   * the appropriate port from the operator. This is the situation when this\n   * caller requests a connection to another context; the DeferredChannel is\n   * used to queue up messages until we receive the port from the operator.\n   *\n   * If the value does not contain a Deferred, then the channel is simply a\n   * {@link goog.messaging.PortChannel} communicating with the given context.\n   * This is the situation when this context received a port for the other\n   * context before it was requested.\n   *\n   * If a value exists for a given key, it must contain a channel, but it\n   * doesn't necessarily contain a Deferred.\n   *\n   * @type {!Object<{deferred: goog.async.Deferred,\n   *                  channel: !goog.messaging.MessageChannel}>}\n   * @private\n   */\n  this.connections_ = {};\n\n  this.operatorPort_.registerService(\n      goog.messaging.PortNetwork.GRANT_CONNECTION_SERVICE,\n      goog.bind(this.connectionGranted_, this), true /* opt_json */);\n};\ngoog.inherits(goog.messaging.PortCaller, goog.Disposable);\n\n\n/** @override */\ngoog.messaging.PortCaller.prototype.dial = function(name) {\n  if (name in this.connections_) {\n    return this.connections_[name].channel;\n  }\n\n  this.operatorPort_.send(\n      goog.messaging.PortNetwork.REQUEST_CONNECTION_SERVICE, name);\n  var deferred = new goog.async.Deferred();\n  var channel = new goog.messaging.DeferredChannel(deferred);\n  this.connections_[name] = {deferred: deferred, channel: channel};\n  return channel;\n};\n\n\n/**\n * Registers a connection to another context in the network. This is called when\n * the operator sends us one end of a {@link MessageChannel}, either because\n * this caller requested a connection with another context, or because that\n * context requested a connection with this caller.\n *\n * It's possible that the remote context and this one request each other roughly\n * concurrently. The operator doesn't keep track of which contexts have been\n * connected, so it will create two separate {@link MessageChannel}s in this\n * case. However, the first channel created will reach both contexts first, so\n * we simply ignore all connections with a given context after the first.\n *\n * @param {!Object|string} message The name of the context\n *     being connected and the port connecting the context.\n * @private\n */\ngoog.messaging.PortCaller.prototype.connectionGranted_ = function(message) {\n  var args = /** @type {{name: string, port: MessagePort}} */ (message);\n  var port = args['port'];\n  var entry = this.connections_[args['name']];\n  if (entry && (!entry.deferred || entry.deferred.hasFired())) {\n    // If two PortCallers request one another at the same time, the operator may\n    // send out a channel for connecting them multiple times. Since both callers\n    // will receive the first channel's ports first, we can safely ignore and\n    // close any future ports.\n    port.close();\n  } else if (!args['success']) {\n    throw new Error(args['message']);\n  } else {\n    port.start();\n    var channel = new goog.messaging.PortChannel(port);\n    if (entry) {\n      entry.deferred.callback(channel);\n    } else {\n      this.connections_[args['name']] = {channel: channel, deferred: null};\n    }\n  }\n};\n\n\n/** @override */\ngoog.messaging.PortCaller.prototype.disposeInternal = function() {\n  goog.dispose(this.operatorPort_);\n  goog.object.forEach(this.connections_, goog.dispose);\n  delete this.operatorPort_;\n  delete this.connections_;\n  goog.messaging.PortCaller.base(this, 'disposeInternal');\n};\n","^;",1579837703000,"^<",["^=",["~$goog.messaging.PortNetwork","~$goog.messaging.PortChannel","~$goog.messaging.DeferredChannel","^?","^42","^1:","^5<"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/portcaller.js"],"^O",["^=",["~$goog.messaging.PortCaller"]],"^W",true,"^X",["^?","^1:","^5<","^6V","^6U","^6T","^42"]],["^ ","^3",[1579837703000],"^4","goog.string.internal.js","^5",["^6","goog/string/internal.js"],"^7","goog/string/internal.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview String functions called from Closure packages that couldn't\n * depend on each other. Outside Closure, use goog.string function which\n * delegate to these.\n */\n\n\ngoog.provide('goog.string.internal');\n\n\n/**\n * Fast prefix-checker.\n * @param {string} str The string to check.\n * @param {string} prefix A string to look for at the start of `str`.\n * @return {boolean} True if `str` begins with `prefix`.\n * @see goog.string.startsWith\n */\ngoog.string.internal.startsWith = function(str, prefix) {\n  return str.lastIndexOf(prefix, 0) == 0;\n};\n\n\n/**\n * Fast suffix-checker.\n * @param {string} str The string to check.\n * @param {string} suffix A string to look for at the end of `str`.\n * @return {boolean} True if `str` ends with `suffix`.\n * @see goog.string.endsWith\n */\ngoog.string.internal.endsWith = function(str, suffix) {\n  const l = str.length - suffix.length;\n  return l >= 0 && str.indexOf(suffix, l) == l;\n};\n\n\n/**\n * Case-insensitive prefix-checker.\n * @param {string} str The string to check.\n * @param {string} prefix  A string to look for at the end of `str`.\n * @return {boolean} True if `str` begins with `prefix` (ignoring\n *     case).\n * @see goog.string.caseInsensitiveStartsWith\n */\ngoog.string.internal.caseInsensitiveStartsWith = function(str, prefix) {\n  return goog.string.internal.caseInsensitiveCompare(\n             prefix, str.substr(0, prefix.length)) == 0;\n};\n\n\n/**\n * Case-insensitive suffix-checker.\n * @param {string} str The string to check.\n * @param {string} suffix A string to look for at the end of `str`.\n * @return {boolean} True if `str` ends with `suffix` (ignoring\n *     case).\n * @see goog.string.caseInsensitiveEndsWith\n */\ngoog.string.internal.caseInsensitiveEndsWith = function(str, suffix) {\n  return (\n      goog.string.internal.caseInsensitiveCompare(\n          suffix, str.substr(str.length - suffix.length, suffix.length)) == 0);\n};\n\n\n/**\n * Case-insensitive equality checker.\n * @param {string} str1 First string to check.\n * @param {string} str2 Second string to check.\n * @return {boolean} True if `str1` and `str2` are the same string,\n *     ignoring case.\n * @see goog.string.caseInsensitiveEquals\n */\ngoog.string.internal.caseInsensitiveEquals = function(str1, str2) {\n  return str1.toLowerCase() == str2.toLowerCase();\n};\n\n\n/**\n * Checks if a string is empty or contains only whitespaces.\n * @param {string} str The string to check.\n * @return {boolean} Whether `str` is empty or whitespace only.\n * @see goog.string.isEmptyOrWhitespace\n */\ngoog.string.internal.isEmptyOrWhitespace = function(str) {\n  // testing length == 0 first is actually slower in all browsers (about the\n  // same in Opera).\n  // Since IE doesn't include non-breaking-space (0xa0) in their \\s character\n  // class (as required by section 7.2 of the ECMAScript spec), we explicitly\n  // include it in the regexp to enforce consistent cross-browser behavior.\n  return /^[\\s\\xa0]*$/.test(str);\n};\n\n\n/**\n * Trims white spaces to the left and right of a string.\n * @param {string} str The string to trim.\n * @return {string} A trimmed copy of `str`.\n */\ngoog.string.internal.trim =\n    (goog.TRUSTED_SITE && String.prototype.trim) ? function(str) {\n      return str.trim();\n    } : function(str) {\n      // Since IE doesn't include non-breaking-space (0xa0) in their \\s\n      // character class (as required by section 7.2 of the ECMAScript spec),\n      // we explicitly include it in the regexp to enforce consistent\n      // cross-browser behavior.\n      // NOTE: We don't use String#replace because it might have side effects\n      // causing this function to not compile to 0 bytes.\n      return /^[\\s\\xa0]*([\\s\\S]*?)[\\s\\xa0]*$/.exec(str)[1];\n    };\n\n\n/**\n * A string comparator that ignores case.\n * -1 = str1 less than str2\n *  0 = str1 equals str2\n *  1 = str1 greater than str2\n *\n * @param {string} str1 The string to compare.\n * @param {string} str2 The string to compare `str1` to.\n * @return {number} The comparator result, as described above.\n * @see goog.string.caseInsensitiveCompare\n */\ngoog.string.internal.caseInsensitiveCompare = function(str1, str2) {\n  const test1 = String(str1).toLowerCase();\n  const test2 = String(str2).toLowerCase();\n\n  if (test1 < test2) {\n    return -1;\n  } else if (test1 == test2) {\n    return 0;\n  } else {\n    return 1;\n  }\n};\n\n\n/**\n * Converts \\n to <br>s or <br />s.\n * @param {string} str The string in which to convert newlines.\n * @param {boolean=} opt_xml Whether to use XML compatible tags.\n * @return {string} A copy of `str` with converted newlines.\n * @see goog.string.newLineToBr\n */\ngoog.string.internal.newLineToBr = function(str, opt_xml) {\n  return str.replace(/(\\r\\n|\\r|\\n)/g, opt_xml ? '<br />' : '<br>');\n};\n\n\n/**\n * Escapes double quote '\"' and single quote '\\'' characters in addition to\n * '&', '<', and '>' so that a string can be included in an HTML tag attribute\n * value within double or single quotes.\n * @param {string} str string to be escaped.\n * @param {boolean=} opt_isLikelyToContainHtmlChars\n * @return {string} An escaped copy of `str`.\n * @see goog.string.htmlEscape\n */\ngoog.string.internal.htmlEscape = function(\n    str, opt_isLikelyToContainHtmlChars) {\n  if (opt_isLikelyToContainHtmlChars) {\n    str = str.replace(goog.string.internal.AMP_RE_, '&amp;')\n              .replace(goog.string.internal.LT_RE_, '&lt;')\n              .replace(goog.string.internal.GT_RE_, '&gt;')\n              .replace(goog.string.internal.QUOT_RE_, '&quot;')\n              .replace(goog.string.internal.SINGLE_QUOTE_RE_, '&#39;')\n              .replace(goog.string.internal.NULL_RE_, '&#0;');\n    return str;\n\n  } else {\n    // quick test helps in the case when there are no chars to replace, in\n    // worst case this makes barely a difference to the time taken\n    if (!goog.string.internal.ALL_RE_.test(str)) return str;\n\n    // str.indexOf is faster than regex.test in this case\n    if (str.indexOf('&') != -1) {\n      str = str.replace(goog.string.internal.AMP_RE_, '&amp;');\n    }\n    if (str.indexOf('<') != -1) {\n      str = str.replace(goog.string.internal.LT_RE_, '&lt;');\n    }\n    if (str.indexOf('>') != -1) {\n      str = str.replace(goog.string.internal.GT_RE_, '&gt;');\n    }\n    if (str.indexOf('\"') != -1) {\n      str = str.replace(goog.string.internal.QUOT_RE_, '&quot;');\n    }\n    if (str.indexOf('\\'') != -1) {\n      str = str.replace(goog.string.internal.SINGLE_QUOTE_RE_, '&#39;');\n    }\n    if (str.indexOf('\\x00') != -1) {\n      str = str.replace(goog.string.internal.NULL_RE_, '&#0;');\n    }\n    return str;\n  }\n};\n\n\n/**\n * Regular expression that matches an ampersand, for use in escaping.\n * @const {!RegExp}\n * @private\n */\ngoog.string.internal.AMP_RE_ = /&/g;\n\n\n/**\n * Regular expression that matches a less than sign, for use in escaping.\n * @const {!RegExp}\n * @private\n */\ngoog.string.internal.LT_RE_ = /</g;\n\n\n/**\n * Regular expression that matches a greater than sign, for use in escaping.\n * @const {!RegExp}\n * @private\n */\ngoog.string.internal.GT_RE_ = />/g;\n\n\n/**\n * Regular expression that matches a double quote, for use in escaping.\n * @const {!RegExp}\n * @private\n */\ngoog.string.internal.QUOT_RE_ = /\"/g;\n\n\n/**\n * Regular expression that matches a single quote, for use in escaping.\n * @const {!RegExp}\n * @private\n */\ngoog.string.internal.SINGLE_QUOTE_RE_ = /'/g;\n\n\n/**\n * Regular expression that matches null character, for use in escaping.\n * @const {!RegExp}\n * @private\n */\ngoog.string.internal.NULL_RE_ = /\\x00/g;\n\n\n/**\n * Regular expression that matches any character that needs to be escaped.\n * @const {!RegExp}\n * @private\n */\ngoog.string.internal.ALL_RE_ = /[\\x00&<>\"']/;\n\n\n/**\n * Do escaping of whitespace to preserve spatial formatting. We use character\n * entity #160 to make it safer for xml.\n * @param {string} str The string in which to escape whitespace.\n * @param {boolean=} opt_xml Whether to use XML compatible tags.\n * @return {string} An escaped copy of `str`.\n * @see goog.string.whitespaceEscape\n */\ngoog.string.internal.whitespaceEscape = function(str, opt_xml) {\n  // This doesn't use goog.string.preserveSpaces for backwards compatibility.\n  return goog.string.internal.newLineToBr(\n      str.replace(/  /g, ' &#160;'), opt_xml);\n};\n\n\n/**\n * Determines whether a string contains a substring.\n * @param {string} str The string to search.\n * @param {string} subString The substring to search for.\n * @return {boolean} Whether `str` contains `subString`.\n * @see goog.string.contains\n */\ngoog.string.internal.contains = function(str, subString) {\n  return str.indexOf(subString) != -1;\n};\n\n\n/**\n * Determines whether a string contains a substring, ignoring case.\n * @param {string} str The string to search.\n * @param {string} subString The substring to search for.\n * @return {boolean} Whether `str` contains `subString`.\n * @see goog.string.caseInsensitiveContains\n */\ngoog.string.internal.caseInsensitiveContains = function(str, subString) {\n  return goog.string.internal.contains(\n      str.toLowerCase(), subString.toLowerCase());\n};\n\n\n/**\n * Compares two version numbers.\n *\n * @param {string|number} version1 Version of first item.\n * @param {string|number} version2 Version of second item.\n *\n * @return {number}  1 if `version1` is higher.\n *                   0 if arguments are equal.\n *                  -1 if `version2` is higher.\n * @see goog.string.compareVersions\n */\ngoog.string.internal.compareVersions = function(version1, version2) {\n  let order = 0;\n  // Trim leading and trailing whitespace and split the versions into\n  // subversions.\n  const v1Subs = goog.string.internal.trim(String(version1)).split('.');\n  const v2Subs = goog.string.internal.trim(String(version2)).split('.');\n  const subCount = Math.max(v1Subs.length, v2Subs.length);\n\n  // Iterate over the subversions, as long as they appear to be equivalent.\n  for (let subIdx = 0; order == 0 && subIdx < subCount; subIdx++) {\n    let v1Sub = v1Subs[subIdx] || '';\n    let v2Sub = v2Subs[subIdx] || '';\n\n    do {\n      // Split the subversions into pairs of numbers and qualifiers (like 'b').\n      // Two different RegExp objects are use to make it clear the code\n      // is side-effect free\n      const v1Comp = /(\\d*)(\\D*)(.*)/.exec(v1Sub) || ['', '', '', ''];\n      const v2Comp = /(\\d*)(\\D*)(.*)/.exec(v2Sub) || ['', '', '', ''];\n      // Break if there are no more matches.\n      if (v1Comp[0].length == 0 && v2Comp[0].length == 0) {\n        break;\n      }\n\n      // Parse the numeric part of the subversion. A missing number is\n      // equivalent to 0.\n      const v1CompNum = v1Comp[1].length == 0 ? 0 : parseInt(v1Comp[1], 10);\n      const v2CompNum = v2Comp[1].length == 0 ? 0 : parseInt(v2Comp[1], 10);\n\n      // Compare the subversion components. The number has the highest\n      // precedence. Next, if the numbers are equal, a subversion without any\n      // qualifier is always higher than a subversion with any qualifier. Next,\n      // the qualifiers are compared as strings.\n      order = goog.string.internal.compareElements_(v1CompNum, v2CompNum) ||\n          goog.string.internal.compareElements_(\n              v1Comp[2].length == 0, v2Comp[2].length == 0) ||\n          goog.string.internal.compareElements_(v1Comp[2], v2Comp[2]);\n      // Stop as soon as an inequality is discovered.\n\n      v1Sub = v1Comp[3];\n      v2Sub = v2Comp[3];\n    } while (order == 0);\n  }\n\n  return order;\n};\n\n\n/**\n * Compares elements of a version number.\n *\n * @param {string|number|boolean} left An element from a version number.\n * @param {string|number|boolean} right An element from a version number.\n *\n * @return {number}  1 if `left` is higher.\n *                   0 if arguments are equal.\n *                  -1 if `right` is higher.\n * @private\n */\ngoog.string.internal.compareElements_ = function(left, right) {\n  if (left < right) {\n    return -1;\n  } else if (left > right) {\n    return 1;\n  }\n  return 0;\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/string/internal.js"],"^O",["^=",["^4G"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.events.event.js","^5",["^6","goog/events/event.js"],"^7","goog/events/event.js","^8","^9","^:","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A base class for event objects.\n *\n */\n\n\ngoog.provide('goog.events.Event');\ngoog.provide('goog.events.EventLike');\n\n/**\n * goog.events.Event no longer depends on goog.Disposable. Keep requiring\n * goog.Disposable here to not break projects which assume this dependency.\n * @suppress {extraRequire}\n */\ngoog.require('goog.Disposable');\ngoog.require('goog.events.EventId');\n\n\n/**\n * A typedef for event like objects that are dispatchable via the\n * goog.events.dispatchEvent function. strings are treated as the type for a\n * goog.events.Event. Objects are treated as an extension of a new\n * goog.events.Event with the type property of the object being used as the type\n * of the Event.\n * @typedef {string|Object|goog.events.Event|goog.events.EventId}\n */\ngoog.events.EventLike;\n\n\n\n/**\n * A base class for event objects, so that they can support preventDefault and\n * stopPropagation.\n *\n * @suppress {underscore} Several properties on this class are technically\n *     public, but referencing these properties outside this package is strongly\n *     discouraged.\n *\n * @param {string|!goog.events.EventId} type Event Type.\n * @param {Object=} opt_target Reference to the object that is the target of\n *     this event. It has to implement the `EventTarget` interface\n *     declared at {@link http://developer.mozilla.org/en/DOM/EventTarget}.\n * @constructor\n */\ngoog.events.Event = function(type, opt_target) {\n  /**\n   * Event type.\n   * @type {string}\n   */\n  this.type = type instanceof goog.events.EventId ? String(type) : type;\n\n  /**\n   * TODO(tbreisacher): The type should probably be\n   * EventTarget|goog.events.EventTarget.\n   *\n   * Target of the event.\n   * @type {Object|undefined}\n   */\n  this.target = opt_target;\n\n  /**\n   * Object that had the listener attached.\n   * @type {Object|undefined}\n   */\n  this.currentTarget = this.target;\n\n  /**\n   * Whether to cancel the event in internal capture/bubble processing for IE.\n   * @type {boolean}\n   * @public\n   */\n  this.propagationStopped_ = false;\n\n  /**\n   * Whether the default action has been prevented.\n   * This is a property to match the W3C specification at\n   * {@link http://www.w3.org/TR/DOM-Level-3-Events/\n   * #events-event-type-defaultPrevented}.\n   * Must be treated as read-only outside the class.\n   * @type {boolean}\n   */\n  this.defaultPrevented = false;\n\n  /**\n   * Return value for in internal capture/bubble processing for IE.\n   * @type {boolean}\n   * @public\n   */\n  this.returnValue_ = true;\n};\n\n\n/**\n * Stops event propagation.\n */\ngoog.events.Event.prototype.stopPropagation = function() {\n  this.propagationStopped_ = true;\n};\n\n\n/**\n * Prevents the default action, for example a link redirecting to a url.\n */\ngoog.events.Event.prototype.preventDefault = function() {\n  this.defaultPrevented = true;\n  this.returnValue_ = false;\n};\n\n\n/**\n * Stops the propagation of the event. It is equivalent to\n * `e.stopPropagation()`, but can be used as the callback argument of\n * {@link goog.events.listen} without declaring another function.\n * @param {!goog.events.Event} e An event.\n */\ngoog.events.Event.stopPropagation = function(e) {\n  e.stopPropagation();\n};\n\n\n/**\n * Prevents the default action. It is equivalent to\n * `e.preventDefault()`, but can be used as the callback argument of\n * {@link goog.events.listen} without declaring another function.\n * @param {!goog.events.Event} e An event.\n */\ngoog.events.Event.preventDefault = function(e) {\n  e.preventDefault();\n};\n","^;",1579837703000,"^<",["^=",["~$goog.events.EventId","^?","^1:"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/event.js"],"^O",["^=",["^2Y","~$goog.events.EventLike"]],"^W",true,"^X",["^?","^1:","^6X"]],["^ ","^3",[1579837703000],"^4","goog.ui.editor.toolbarcontroller.js","^5",["^6","goog/ui/editor/toolbarcontroller.js"],"^7","goog/ui/editor/toolbarcontroller.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A class for managing the editor toolbar.\n *\n * @author attila@google.com (Attila Bodis)\n * @see ../../demos/editor/editor.html\n */\n\ngoog.provide('goog.ui.editor.ToolbarController');\n\ngoog.require('goog.editor.Field');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.ui.Component');\n\n\n\n/**\n * A class for managing the editor toolbar.  Acts as a bridge between\n * a {@link goog.editor.Field} and a {@link goog.ui.Toolbar}.\n *\n * The `toolbar` argument must be an instance of {@link goog.ui.Toolbar}\n * or a subclass.  This class doesn't care how the toolbar was created.  As\n * long as one or more controls hosted  in the toolbar have IDs that match\n * built-in {@link goog.editor.Command}s, they will function as expected.  It is\n * the caller's responsibility to ensure that the toolbar is already rendered\n * or that it decorates an existing element.\n *\n *\n * @param {!goog.editor.Field} field Editable field to be controlled by the\n *     toolbar.\n * @param {!goog.ui.Toolbar} toolbar Toolbar to control the editable field.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.ui.editor.ToolbarController = function(field, toolbar) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * Event handler to listen for field events and user actions.\n   * @type {!goog.events.EventHandler<!goog.ui.editor.ToolbarController>}\n   * @private\n   */\n  this.handler_ = new goog.events.EventHandler(this);\n\n  /**\n   * The field instance controlled by the toolbar.\n   * @type {!goog.editor.Field}\n   * @private\n   */\n  this.field_ = field;\n\n  /**\n   * The toolbar that controls the field.\n   * @type {!goog.ui.Toolbar}\n   * @private\n   */\n  this.toolbar_ = toolbar;\n\n  /**\n   * Editing commands whose state is to be queried when updating the toolbar.\n   * @type {!Array<string>}\n   * @private\n   */\n  this.queryCommands_ = [];\n\n  // Iterate over all buttons, and find those which correspond to\n  // queryable commands. Add them to the list of commands to query on\n  // each COMMAND_VALUE_CHANGE event.\n  this.toolbar_.forEachChild(function(button) {\n    if (button.queryable) {\n      this.queryCommands_.push(this.getComponentId(button.getId()));\n    }\n  }, this);\n\n  // Make sure the toolbar doesn't steal keyboard focus.\n  this.toolbar_.setFocusable(false);\n\n  // Hook up handlers that update the toolbar in response to field events,\n  // and to execute editor commands in response to toolbar events.\n  this.handler_\n      .listen(\n          this.field_, goog.editor.Field.EventType.COMMAND_VALUE_CHANGE,\n          this.updateToolbar)\n      .listen(\n          this.toolbar_, goog.ui.Component.EventType.ACTION, this.handleAction);\n};\ngoog.inherits(goog.ui.editor.ToolbarController, goog.events.EventTarget);\n\n\n/**\n * Returns the Closure component ID of the control that corresponds to the\n * given {@link goog.editor.Command} constant.\n * Subclasses may override this method if they want to use a custom mapping\n * scheme from commands to controls.\n * @param {string} command Editor command.\n * @return {string} Closure component ID of the corresponding toolbar\n *     control, if any.\n * @protected\n */\ngoog.ui.editor.ToolbarController.prototype.getComponentId = function(command) {\n  // The default implementation assumes that the component ID is the same as\n  // the command constant.\n  return command;\n};\n\n\n/**\n * Returns the {@link goog.editor.Command} constant\n * that corresponds to the given Closure component ID.  Subclasses may override\n * this method if they want to use a custom mapping scheme from controls to\n * commands.\n * @param {string} id Closure component ID of a toolbar control.\n * @return {string} Editor command or dialog constant corresponding to the\n *     toolbar control, if any.\n * @protected\n */\ngoog.ui.editor.ToolbarController.prototype.getCommand = function(id) {\n  // The default implementation assumes that the component ID is the same as\n  // the command constant.\n  return id;\n};\n\n\n/**\n * Returns the event handler object for the editor toolbar.  Useful for classes\n * that extend `goog.ui.editor.ToolbarController`.\n * @return {!goog.events.EventHandler<T>} The event handler object.\n * @protected\n * @this {T}\n * @template T\n */\ngoog.ui.editor.ToolbarController.prototype.getHandler = function() {\n  return this.handler_;\n};\n\n\n/**\n * Returns the field instance managed by the toolbar.  Useful for\n * classes that extend `goog.ui.editor.ToolbarController`.\n * @return {!goog.editor.Field} The field managed by the toolbar.\n * @protected\n */\ngoog.ui.editor.ToolbarController.prototype.getField = function() {\n  return this.field_;\n};\n\n\n/**\n * Returns the toolbar UI component that manages the editor.  Useful for\n * classes that extend `goog.ui.editor.ToolbarController`.\n * @return {!goog.ui.Toolbar} The toolbar UI component.\n */\ngoog.ui.editor.ToolbarController.prototype.getToolbar = function() {\n  return this.toolbar_;\n};\n\n\n/**\n * @return {boolean} Whether the toolbar is visible.\n */\ngoog.ui.editor.ToolbarController.prototype.isVisible = function() {\n  return this.toolbar_.isVisible();\n};\n\n\n/**\n * Shows or hides the toolbar.\n * @param {boolean} visible Whether to show or hide the toolbar.\n */\ngoog.ui.editor.ToolbarController.prototype.setVisible = function(visible) {\n  this.toolbar_.setVisible(visible);\n};\n\n\n/**\n * @return {boolean} Whether the toolbar is enabled.\n */\ngoog.ui.editor.ToolbarController.prototype.isEnabled = function() {\n  return this.toolbar_.isEnabled();\n};\n\n\n/**\n * Enables or disables the toolbar.\n * @param {boolean} enabled Whether to enable or disable the toolbar.\n */\ngoog.ui.editor.ToolbarController.prototype.setEnabled = function(enabled) {\n  this.toolbar_.setEnabled(enabled);\n};\n\n\n/**\n * Programmatically blurs the editor toolbar, un-highlighting the currently\n * highlighted item, and closing the currently open menu (if any).\n */\ngoog.ui.editor.ToolbarController.prototype.blur = function() {\n  // We can't just call this.toolbar_.getElement().blur(), because the toolbar\n  // element itself isn't focusable, so goog.ui.Container#handleBlur isn't\n  // registered to handle blur events.\n  this.toolbar_.handleBlur(null);\n};\n\n\n/** @override */\ngoog.ui.editor.ToolbarController.prototype.disposeInternal = function() {\n  goog.ui.editor.ToolbarController.superClass_.disposeInternal.call(this);\n  if (this.handler_) {\n    this.handler_.dispose();\n    delete this.handler_;\n  }\n  if (this.toolbar_) {\n    this.toolbar_.dispose();\n    delete this.toolbar_;\n  }\n  delete this.field_;\n  delete this.queryCommands_;\n};\n\n\n/**\n * Updates the toolbar in response to editor events.  Specifically, updates\n * button states based on `COMMAND_VALUE_CHANGE` events, reflecting the\n * effective formatting of the selection.\n * @param {goog.events.Event} e Editor event to handle.\n * @protected\n */\ngoog.ui.editor.ToolbarController.prototype.updateToolbar = function(e) {\n  if (!this.toolbar_.isEnabled() || !this.field_.isSelectionEditable() ||\n      !this.dispatchEvent(goog.ui.Component.EventType.CHANGE)) {\n    return;\n  }\n\n  var state;\n\n\n  try {\n    /** @type {Array<string>} */\n    e.commands;  // Added by dispatchEvent.\n\n    // If the COMMAND_VALUE_CHANGE event specifies which commands changed\n    // state, then we only need to update those ones, otherwise update all\n    // commands.\n    state = /** @type {Object} */ (\n        this.field_.queryCommandValue(e.commands || this.queryCommands_));\n  } catch (ex) {\n    // TODO(attila): Find out when/why this happens.\n    state = {};\n  }\n\n  this.updateToolbarFromState(state);\n};\n\n\n/**\n * Updates the toolbar to reflect a given state.\n * @param {Object} state Object mapping editor commands to values.\n */\ngoog.ui.editor.ToolbarController.prototype.updateToolbarFromState = function(\n    state) {\n  for (var command in state) {\n    var button = this.toolbar_.getChild(this.getComponentId(command));\n    if (button) {\n      var value = state[command];\n      if (button.updateFromValue) {\n        button.updateFromValue(value);\n      } else {\n        button.setChecked(!!value);\n      }\n    }\n  }\n};\n\n\n/**\n * Handles `ACTION` events dispatched by toolbar buttons in response to\n * user actions by executing the corresponding field command.\n * @param {goog.events.Event} e Action event to handle.\n * @protected\n */\ngoog.ui.editor.ToolbarController.prototype.handleAction = function(e) {\n  var command = this.getCommand(e.target.getId());\n  this.field_.execCommand(command, e.target.getValue());\n};\n","^;",1579837703000,"^<",["^=",["^1T","^1P","^?","^1A","^3W"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/editor/toolbarcontroller.js"],"^O",["^=",["~$goog.ui.editor.ToolbarController"]],"^W",true,"^X",["^?","^1A","^1T","^3W","^1P"]],["^ ","^3",[1579837703000],"^4","goog.fx.transition.js","^5",["^6","goog/fx/transition.js"],"^7","goog/fx/transition.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An interface for transition animation. This is a simple\n * interface that allows for playing and stopping a transition. It adds\n * a simple event model with BEGIN and END event.\n *\n * @author chrishenry@google.com (Chris Henry)\n */\n\ngoog.provide('goog.fx.Transition');\ngoog.provide('goog.fx.Transition.EventType');\n\n\n\n/**\n * An interface for programmatic transition. Must extend\n * `goog.events.EventTarget`.\n * @interface\n */\ngoog.fx.Transition = function() {};\n\n\n/**\n * Transition event types.\n * @enum {string}\n */\ngoog.fx.Transition.EventType = {\n  /** Dispatched when played for the first time OR when it is resumed. */\n  PLAY: 'play',\n\n  /** Dispatched only when the animation starts from the beginning. */\n  BEGIN: 'begin',\n\n  /** Dispatched only when animation is restarted after a pause. */\n  RESUME: 'resume',\n\n  /**\n   * Dispatched when animation comes to the end of its duration OR stop\n   * is called.\n   */\n  END: 'end',\n\n  /** Dispatched only when stop is called. */\n  STOP: 'stop',\n\n  /** Dispatched only when animation comes to its end naturally. */\n  FINISH: 'finish',\n\n  /** Dispatched when an animation is paused. */\n  PAUSE: 'pause'\n};\n\n\n/**\n * @type {function()}\n * Plays the transition.\n */\ngoog.fx.Transition.prototype.play;\n\n\n/**\n * @type {function()}\n * Stops the transition.\n */\ngoog.fx.Transition.prototype.stop;\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/transition.js"],"^O",["^=",["~$goog.fx.Transition.EventType","~$goog.fx.Transition"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.i18n.ucharnames.js","^5",["^6","goog/i18n/ucharnames.js"],"^7","goog/i18n/ucharnames.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility functions for Unicode character names.\n *\n */\n\ngoog.provide('goog.i18n.uCharNames');\n\ngoog.require('goog.i18n.uChar');\n\n\n/**\n * Map used for looking up the char data.  Will be created lazily.\n * @type {?Object}\n * @private\n */\ngoog.i18n.uCharNames.charData_ = null;\n\n\n/**\n * Gets the name of a character, if available, returns null otherwise.\n * @param {string} ch The character.\n * @return {?string} The name of the character.\n */\ngoog.i18n.uCharNames.toName = function(ch) {\n  if (!goog.i18n.uCharNames.charData_) {\n    goog.i18n.uCharNames.createCharData();\n  }\n\n  var names = goog.i18n.uCharNames.charData_;\n  var chCode = goog.i18n.uChar.toCharCode(ch);\n  var chCodeStr = chCode + '';\n\n  if (ch in names) {\n    return names[ch];\n  } else if (chCodeStr in names) {\n    return names[chCode];\n  } else if (\n      0xFE00 <= chCode && chCode <= 0xFE0F ||\n      0xE0100 <= chCode && chCode <= 0xE01EF) {\n    var seqnum;\n    if (0xFE00 <= chCode && chCode <= 0xFE0F) {\n      // Variation selectors from 1 to 16.\n      seqnum = chCode - 0xFDFF;\n    } else {\n      // Variation selectors from 17 to 256.\n      seqnum = chCode - 0xE00EF;\n    }\n\n    /** @desc Variation selector with the sequence number. */\n    var MSG_VARIATION_SELECTOR_SEQNUM = goog.getMsg(\n        'Variation Selector - {$seqnum}', {'seqnum': String(seqnum)});\n    return MSG_VARIATION_SELECTOR_SEQNUM;\n  }\n  return null;\n};\n\n\n/**\n * Following lines are programatically created.\n * Details: https://sites/cibu/character-picker.\n **/\n\n\n/**\n * Sets up the character map, lazily.  Some characters are indexed by their\n * decimal value.\n * @protected\n */\ngoog.i18n.uCharNames.createCharData = function() {\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_ARABIC_SIGN_SANAH = goog.getMsg('Arabic Sign Sanah');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_CANADIAN_SYLLABICS_HYPHEN =\n      goog.getMsg('Canadian Syllabics Hyphen');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_ARABIC_SIGN_SAFHA = goog.getMsg('Arabic Sign Safha');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_ARABIC_FOOTNOTE_MARKER = goog.getMsg('Arabic Footnote Marker');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_FOUR_PER_EM_SPACE = goog.getMsg('Four-per-em Space');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_THREE_PER_EM_SPACE = goog.getMsg('Three-per-em Space');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_FIGURE_SPACE = goog.getMsg('Figure Space');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_MONGOLIAN_SOFT_HYPHEN = goog.getMsg('Mongolian Soft Hyphen');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_THIN_SPACE = goog.getMsg('Thin Space');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_SOFT_HYPHEN = goog.getMsg('Soft Hyphen');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_ZERO_WIDTH_SPACE = goog.getMsg('Zero Width Space');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_ARMENIAN_HYPHEN = goog.getMsg('Armenian Hyphen');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_ZERO_WIDTH_JOINER = goog.getMsg('Zero Width Joiner');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_EM_SPACE = goog.getMsg('Em Space');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_SYRIAC_ABBREVIATION_MARK = goog.getMsg('Syriac Abbreviation Mark');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_MONGOLIAN_VOWEL_SEPARATOR =\n      goog.getMsg('Mongolian Vowel Separator');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_NON_BREAKING_HYPHEN = goog.getMsg('Non-breaking Hyphen');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_HYPHEN = goog.getMsg('Hyphen');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_EM_QUAD = goog.getMsg('Em Quad');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_EN_SPACE = goog.getMsg('En Space');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_HORIZONTAL_BAR = goog.getMsg('Horizontal Bar');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_EM_DASH = goog.getMsg('Em Dash');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_DOUBLE_OBLIQUE_HYPHEN = goog.getMsg('Double Oblique Hyphen');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_MUSICAL_SYMBOL_END_PHRASE =\n      goog.getMsg('Musical Symbol End Phrase');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_MEDIUM_MATHEMATICAL_SPACE =\n      goog.getMsg('Medium Mathematical Space');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_WAVE_DASH = goog.getMsg('Wave Dash');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_SPACE = goog.getMsg('Space');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_HYPHEN_WITH_DIAERESIS = goog.getMsg('Hyphen With Diaeresis');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_EN_QUAD = goog.getMsg('En Quad');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_RIGHT_TO_LEFT_EMBEDDING = goog.getMsg('Right-to-left Embedding');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_SIX_PER_EM_SPACE = goog.getMsg('Six-per-em Space');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_HYPHEN_MINUS = goog.getMsg('Hyphen-minus');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_POP_DIRECTIONAL_FORMATTING =\n      goog.getMsg('Pop Directional Formatting');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_NARROW_NO_BREAK_SPACE = goog.getMsg('Narrow No-break Space');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_RIGHT_TO_LEFT_OVERRIDE = goog.getMsg('Right-to-left Override');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_PRESENTATION_FORM_FOR_VERTICAL_EM_DASH =\n      goog.getMsg('Presentation Form For Vertical Em Dash');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_WAVY_DASH = goog.getMsg('Wavy Dash');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_PRESENTATION_FORM_FOR_VERTICAL_EN_DASH =\n      goog.getMsg('Presentation Form For Vertical En Dash');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_KHMER_VOWEL_INHERENT_AA = goog.getMsg('Khmer Vowel Inherent Aa');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_KHMER_VOWEL_INHERENT_AQ = goog.getMsg('Khmer Vowel Inherent Aq');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_PUNCTUATION_SPACE = goog.getMsg('Punctuation Space');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_HALFWIDTH_HANGUL_FILLER = goog.getMsg('Halfwidth Hangul Filler');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_KAITHI_NUMBER_SIGN = goog.getMsg('Kaithi Number Sign');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_LEFT_TO_RIGHT_EMBEDDING = goog.getMsg('Left-to-right Embedding');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_HEBREW_PUNCTUATION_MAQAF = goog.getMsg('Hebrew Punctuation Maqaf');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_IDEOGRAPHIC_SPACE = goog.getMsg('Ideographic Space');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_HAIR_SPACE = goog.getMsg('Hair Space');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_NO_BREAK_SPACE = goog.getMsg('No-break Space');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_FULLWIDTH_HYPHEN_MINUS = goog.getMsg('Fullwidth Hyphen-minus');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_PARAGRAPH_SEPARATOR = goog.getMsg('Paragraph Separator');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_LEFT_TO_RIGHT_OVERRIDE = goog.getMsg('Left-to-right Override');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_SMALL_HYPHEN_MINUS = goog.getMsg('Small Hyphen-minus');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_COMBINING_GRAPHEME_JOINER =\n      goog.getMsg('Combining Grapheme Joiner');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_ZERO_WIDTH_NON_JOINER = goog.getMsg('Zero Width Non-joiner');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_MUSICAL_SYMBOL_BEGIN_PHRASE =\n      goog.getMsg('Musical Symbol Begin Phrase');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_ARABIC_NUMBER_SIGN = goog.getMsg('Arabic Number Sign');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_RIGHT_TO_LEFT_MARK = goog.getMsg('Right-to-left Mark');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_OGHAM_SPACE_MARK = goog.getMsg('Ogham Space Mark');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_SMALL_EM_DASH = goog.getMsg('Small Em Dash');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_LEFT_TO_RIGHT_MARK = goog.getMsg('Left-to-right Mark');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_ARABIC_END_OF_AYAH = goog.getMsg('Arabic End Of Ayah');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_HANGUL_CHOSEONG_FILLER = goog.getMsg('Hangul Choseong Filler');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_HANGUL_FILLER = goog.getMsg('Hangul Filler');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_FUNCTION_APPLICATION = goog.getMsg('Function Application');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_HANGUL_JUNGSEONG_FILLER = goog.getMsg('Hangul Jungseong Filler');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_INVISIBLE_SEPARATOR = goog.getMsg('Invisible Separator');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_INVISIBLE_TIMES = goog.getMsg('Invisible Times');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_INVISIBLE_PLUS = goog.getMsg('Invisible Plus');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_WORD_JOINER = goog.getMsg('Word Joiner');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_LINE_SEPARATOR = goog.getMsg('Line Separator');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_KATAKANA_HIRAGANA_DOUBLE_HYPHEN =\n      goog.getMsg('Katakana-hiragana Double Hyphen');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_EN_DASH = goog.getMsg('En Dash');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_MUSICAL_SYMBOL_BEGIN_BEAM =\n      goog.getMsg('Musical Symbol Begin Beam');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_FIGURE_DASH = goog.getMsg('Figure Dash');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_MUSICAL_SYMBOL_BEGIN_TIE = goog.getMsg('Musical Symbol Begin Tie');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_MUSICAL_SYMBOL_END_BEAM = goog.getMsg('Musical Symbol End Beam');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_MUSICAL_SYMBOL_BEGIN_SLUR =\n      goog.getMsg('Musical Symbol Begin Slur');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_MUSICAL_SYMBOL_END_TIE = goog.getMsg('Musical Symbol End Tie');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_INTERLINEAR_ANNOTATION_ANCHOR =\n      goog.getMsg('Interlinear Annotation Anchor');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_MUSICAL_SYMBOL_END_SLUR = goog.getMsg('Musical Symbol End Slur');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_INTERLINEAR_ANNOTATION_TERMINATOR =\n      goog.getMsg('Interlinear Annotation Terminator');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_INTERLINEAR_ANNOTATION_SEPARATOR =\n      goog.getMsg('Interlinear Annotation Separator');\n\n\n  /**\n   * @desc Name for a symbol, character or a letter. Used in a pop-up balloon,\n   *   shown to a document editing user trying to insert a special character.\n   *   The balloon help would appear while the user hovers over the character\n   *   displayed. Newlines are not allowed; translation should be a noun and\n   *   as consise as possible. More details:\n   *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n   */\n  var MSG_CP_ZERO_WIDTH_NO_BREAK_SPACE =\n      goog.getMsg('Zero Width No-break Space');\n\n  goog.i18n.uCharNames.charData_ = {\n    '\\u0601': MSG_CP_ARABIC_SIGN_SANAH,\n    '\\u1400': MSG_CP_CANADIAN_SYLLABICS_HYPHEN,\n    '\\u0603': MSG_CP_ARABIC_SIGN_SAFHA,\n    '\\u0602': MSG_CP_ARABIC_FOOTNOTE_MARKER,\n    '\\u2005': MSG_CP_FOUR_PER_EM_SPACE,\n    '\\u2004': MSG_CP_THREE_PER_EM_SPACE,\n    '\\u2007': MSG_CP_FIGURE_SPACE,\n    '\\u1806': MSG_CP_MONGOLIAN_SOFT_HYPHEN,\n    '\\u2009': MSG_CP_THIN_SPACE,\n    '\\u00AD': MSG_CP_SOFT_HYPHEN,\n    '\\u200B': MSG_CP_ZERO_WIDTH_SPACE,\n    '\\u058A': MSG_CP_ARMENIAN_HYPHEN,\n    '\\u200D': MSG_CP_ZERO_WIDTH_JOINER,\n    '\\u2003': MSG_CP_EM_SPACE,\n    '\\u070F': MSG_CP_SYRIAC_ABBREVIATION_MARK,\n    '\\u180E': MSG_CP_MONGOLIAN_VOWEL_SEPARATOR,\n    '\\u2011': MSG_CP_NON_BREAKING_HYPHEN,\n    '\\u2010': MSG_CP_HYPHEN,\n    '\\u2001': MSG_CP_EM_QUAD,\n    '\\u2002': MSG_CP_EN_SPACE,\n    '\\u2015': MSG_CP_HORIZONTAL_BAR,\n    '\\u2014': MSG_CP_EM_DASH,\n    '\\u2E17': MSG_CP_DOUBLE_OBLIQUE_HYPHEN,\n    '\\u1D17A': MSG_CP_MUSICAL_SYMBOL_END_PHRASE,\n    '\\u205F': MSG_CP_MEDIUM_MATHEMATICAL_SPACE,\n    '\\u301C': MSG_CP_WAVE_DASH,\n    ' ': MSG_CP_SPACE,\n    '\\u2E1A': MSG_CP_HYPHEN_WITH_DIAERESIS,\n    '\\u2000': MSG_CP_EN_QUAD,\n    '\\u202B': MSG_CP_RIGHT_TO_LEFT_EMBEDDING,\n    '\\u2006': MSG_CP_SIX_PER_EM_SPACE,\n    '-': MSG_CP_HYPHEN_MINUS,\n    '\\u202C': MSG_CP_POP_DIRECTIONAL_FORMATTING,\n    '\\u202F': MSG_CP_NARROW_NO_BREAK_SPACE,\n    '\\u202E': MSG_CP_RIGHT_TO_LEFT_OVERRIDE,\n    '\\uFE31': MSG_CP_PRESENTATION_FORM_FOR_VERTICAL_EM_DASH,\n    '\\u3030': MSG_CP_WAVY_DASH,\n    '\\uFE32': MSG_CP_PRESENTATION_FORM_FOR_VERTICAL_EN_DASH,\n    '\\u17B5': MSG_CP_KHMER_VOWEL_INHERENT_AA,\n    '\\u17B4': MSG_CP_KHMER_VOWEL_INHERENT_AQ,\n    '\\u2008': MSG_CP_PUNCTUATION_SPACE,\n    '\\uFFA0': MSG_CP_HALFWIDTH_HANGUL_FILLER,\n    '\\u110BD': MSG_CP_KAITHI_NUMBER_SIGN,\n    '\\u202A': MSG_CP_LEFT_TO_RIGHT_EMBEDDING,\n    '\\u05BE': MSG_CP_HEBREW_PUNCTUATION_MAQAF,\n    '\\u3000': MSG_CP_IDEOGRAPHIC_SPACE,\n    '\\u200A': MSG_CP_HAIR_SPACE,\n    '\\u00A0': MSG_CP_NO_BREAK_SPACE,\n    '\\uFF0D': MSG_CP_FULLWIDTH_HYPHEN_MINUS,\n    '8233': MSG_CP_PARAGRAPH_SEPARATOR,\n    '\\u202D': MSG_CP_LEFT_TO_RIGHT_OVERRIDE,\n    '\\uFE63': MSG_CP_SMALL_HYPHEN_MINUS,\n    '\\u034F': MSG_CP_COMBINING_GRAPHEME_JOINER,\n    '\\u200C': MSG_CP_ZERO_WIDTH_NON_JOINER,\n    '\\u1D179': MSG_CP_MUSICAL_SYMBOL_BEGIN_PHRASE,\n    '\\u0600': MSG_CP_ARABIC_NUMBER_SIGN,\n    '\\u200F': MSG_CP_RIGHT_TO_LEFT_MARK,\n    '\\u1680': MSG_CP_OGHAM_SPACE_MARK,\n    '\\uFE58': MSG_CP_SMALL_EM_DASH,\n    '\\u200E': MSG_CP_LEFT_TO_RIGHT_MARK,\n    '\\u06DD': MSG_CP_ARABIC_END_OF_AYAH,\n    '\\u115F': MSG_CP_HANGUL_CHOSEONG_FILLER,\n    '\\u3164': MSG_CP_HANGUL_FILLER,\n    '\\u2061': MSG_CP_FUNCTION_APPLICATION,\n    '\\u1160': MSG_CP_HANGUL_JUNGSEONG_FILLER,\n    '\\u2063': MSG_CP_INVISIBLE_SEPARATOR,\n    '\\u2062': MSG_CP_INVISIBLE_TIMES,\n    '\\u2064': MSG_CP_INVISIBLE_PLUS,\n    '\\u2060': MSG_CP_WORD_JOINER,\n    '8232': MSG_CP_LINE_SEPARATOR,\n    '\\u30A0': MSG_CP_KATAKANA_HIRAGANA_DOUBLE_HYPHEN,\n    '\\u2013': MSG_CP_EN_DASH,\n    '\\u1D173': MSG_CP_MUSICAL_SYMBOL_BEGIN_BEAM,\n    '\\u2012': MSG_CP_FIGURE_DASH,\n    '\\u1D175': MSG_CP_MUSICAL_SYMBOL_BEGIN_TIE,\n    '\\u1D174': MSG_CP_MUSICAL_SYMBOL_END_BEAM,\n    '\\u1D177': MSG_CP_MUSICAL_SYMBOL_BEGIN_SLUR,\n    '\\u1D176': MSG_CP_MUSICAL_SYMBOL_END_TIE,\n    '\\uFFF9': MSG_CP_INTERLINEAR_ANNOTATION_ANCHOR,\n    '\\u1D178': MSG_CP_MUSICAL_SYMBOL_END_SLUR,\n    '\\uFFFB': MSG_CP_INTERLINEAR_ANNOTATION_TERMINATOR,\n    '\\uFFFA': MSG_CP_INTERLINEAR_ANNOTATION_SEPARATOR,\n    '\\uFEFF': MSG_CP_ZERO_WIDTH_NO_BREAK_SPACE\n  };\n};\n","^;",1579837703000,"^<",["^=",["^?","^17"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/ucharnames.js"],"^O",["^=",["~$goog.i18n.uCharNames"]],"^W",true,"^X",["^?","^17"]],["^ ","^3",[1579837703000],"^4","goog.async.nexttick.js","^5",["^6","goog/async/nexttick.js"],"^7","goog/async/nexttick.js","^8","^9","^:","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a function to schedule running a function as soon\n * as possible after the current JS execution stops and yields to the event\n * loop.\n *\n */\n\ngoog.provide('goog.async.nextTick');\ngoog.provide('goog.async.throwException');\n\ngoog.require('goog.debug.entryPointRegistry');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.functions');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.labs.userAgent.browser');\ngoog.require('goog.labs.userAgent.engine');\ngoog.require('goog.string.Const');\n\n\n/**\n * Throw an item without interrupting the current execution context.  For\n * example, if processing a group of items in a loop, sometimes it is useful\n * to report an error while still allowing the rest of the batch to be\n * processed.\n * @param {*} exception\n */\ngoog.async.throwException = function(exception) {\n  // Each throw needs to be in its own context.\n  goog.global.setTimeout(function() { throw exception; }, 0);\n};\n\n\n/**\n * Fires the provided callbacks as soon as possible after the current JS\n * execution context. setTimeout(…, 0) takes at least 4ms when called from\n * within another setTimeout(…, 0) for legacy reasons.\n *\n * This will not schedule the callback as a microtask (i.e. a task that can\n * preempt user input or networking callbacks). It is meant to emulate what\n * setTimeout(_, 0) would do if it were not throttled. If you desire microtask\n * behavior, use {@see goog.Promise} instead.\n *\n * @param {function(this:SCOPE)} callback Callback function to fire as soon as\n *     possible.\n * @param {SCOPE=} opt_context Object in whose scope to call the listener.\n * @param {boolean=} opt_useSetImmediate Avoid the IE workaround that\n *     ensures correctness at the cost of speed. See comments for details.\n * @template SCOPE\n */\ngoog.async.nextTick = function(callback, opt_context, opt_useSetImmediate) {\n  var cb = callback;\n  if (opt_context) {\n    cb = goog.bind(callback, opt_context);\n  }\n  cb = goog.async.nextTick.wrapCallback_(cb);\n  // Note we do allow callers to also request setImmediate if they are willing\n  // to accept the possible tradeoffs of incorrectness in exchange for speed.\n  // The IE fallback of readystate change is much slower. See useSetImmediate_\n  // for details.\n  if (goog.isFunction(goog.global.setImmediate) &&\n      (opt_useSetImmediate || goog.async.nextTick.useSetImmediate_())) {\n    goog.global.setImmediate(cb);\n    return;\n  }\n\n  // Look for and cache the custom fallback version of setImmediate.\n  if (!goog.async.nextTick.setImmediate_) {\n    goog.async.nextTick.setImmediate_ =\n        goog.async.nextTick.getSetImmediateEmulator_();\n  }\n  goog.async.nextTick.setImmediate_(cb);\n};\n\n\n/**\n * Returns whether should use setImmediate implementation currently on window.\n *\n * window.setImmediate was introduced and currently only supported by IE10+,\n * but due to a bug in the implementation it is not guaranteed that\n * setImmediate is faster than setTimeout nor that setImmediate N is before\n * setImmediate N+1. That is why we do not use the native version if\n * available. We do, however, call setImmediate if it is a non-native function\n * because that indicates that it has been replaced by goog.testing.MockClock\n * which we do want to support.\n * See\n * http://connect.microsoft.com/IE/feedback/details/801823/setimmediate-and-messagechannel-are-broken-in-ie10\n *\n * @return {boolean} Whether to use the implementation of setImmediate defined\n *     on Window.\n * @private\n * @suppress {missingProperties} For \"Window.prototype.setImmediate\"\n */\ngoog.async.nextTick.useSetImmediate_ = function() {\n  // Not a browser environment.\n  if (!goog.global.Window || !goog.global.Window.prototype) {\n    return true;\n  }\n\n  // MS Edge has window.setImmediate natively, but it's not on Window.prototype.\n  // Also, there's no clean way to detect if the goog.global.setImmediate has\n  // been replaced by mockClock as its replacement also shows up as \"[native\n  // code]\" when using toString. Therefore, just always use\n  // goog.global.setImmediate for Edge. It's unclear if it suffers the same\n  // issues as IE10/11, but based on\n  // https://dev.modern.ie/testdrive/demos/setimmediatesorting/\n  // it seems they've been working to ensure it's WAI.\n  if (goog.labs.userAgent.browser.isEdge() ||\n      goog.global.Window.prototype.setImmediate != goog.global.setImmediate) {\n    // Something redefined setImmediate in which case we decide to use it (This\n    // is so that we use the mockClock setImmediate).\n    return true;\n  }\n\n  return false;\n};\n\n\n/**\n * Cache for the setImmediate implementation.\n * @type {function(function())}\n * @private\n */\ngoog.async.nextTick.setImmediate_;\n\n\n/**\n * Determines the best possible implementation to run a function as soon as\n * the JS event loop is idle.\n * @return {function(function())} The \"setImmediate\" implementation.\n * @private\n */\ngoog.async.nextTick.getSetImmediateEmulator_ = function() {\n  // Create a private message channel and use it to postMessage empty messages\n  // to ourselves.\n  /** @type {!Function|undefined} */\n  var Channel = goog.global['MessageChannel'];\n  // If MessageChannel is not available and we are in a browser, implement\n  // an iframe based polyfill in browsers that have postMessage and\n  // document.addEventListener. The latter excludes IE8 because it has a\n  // synchronous postMessage implementation.\n  if (typeof Channel === 'undefined' && typeof window !== 'undefined' &&\n      window.postMessage && window.addEventListener &&\n      // Presto (The old pre-blink Opera engine) has problems with iframes\n      // and contentWindow.\n      !goog.labs.userAgent.engine.isPresto()) {\n    /** @constructor */\n    Channel = function() {\n      // Make an empty, invisible iframe.\n      var iframe = goog.dom.createElement(goog.dom.TagName.IFRAME);\n      iframe.style.display = 'none';\n      goog.dom.safe.setIframeSrc(\n          iframe,\n          goog.html.TrustedResourceUrl.fromConstant(goog.string.Const.EMPTY));\n      document.documentElement.appendChild(iframe);\n      var win = iframe.contentWindow;\n      var doc = win.document;\n      doc.open();\n      goog.dom.safe.documentWrite(doc, goog.html.SafeHtml.EMPTY);\n      doc.close();\n      // Do not post anything sensitive over this channel, as the workaround for\n      // pages with file: origin could allow that information to be modified or\n      // intercepted.\n      var message = 'callImmediate' + Math.random();\n      // The same origin policy rejects attempts to postMessage from file: urls\n      // unless the origin is '*'.\n      var origin = win.location.protocol == 'file:' ?\n          '*' :\n          win.location.protocol + '//' + win.location.host;\n      var onmessage = goog.bind(function(e) {\n        // Validate origin and message to make sure that this message was\n        // intended for us. If the origin is set to '*' (see above) only the\n        // message needs to match since, for example, '*' != 'file://'. Allowing\n        // the wildcard is ok, as we are not concerned with security here.\n        if ((origin != '*' && e.origin != origin) || e.data != message) {\n          return;\n        }\n        this['port1'].onmessage();\n      }, this);\n      win.addEventListener('message', onmessage, false);\n      this['port1'] = {};\n      this['port2'] = {\n        postMessage: function() { win.postMessage(message, origin); }\n      };\n    };\n  }\n  if (typeof Channel !== 'undefined' && !goog.labs.userAgent.browser.isIE()) {\n    // Exclude all of IE due to\n    // http://codeforhire.com/2013/09/21/setimmediate-and-messagechannel-broken-on-internet-explorer-10/\n    // which allows starving postMessage with a busy setTimeout loop.\n    // This currently affects IE10 and IE11 which would otherwise be able\n    // to use the postMessage based fallbacks.\n    var channel = new Channel();\n    // Use a fifo linked list to call callbacks in the right order.\n    var head = {};\n    var tail = head;\n    channel['port1'].onmessage = function() {\n      if (head.next !== undefined) {\n        head = head.next;\n        var cb = head.cb;\n        head.cb = null;\n        cb();\n      }\n    };\n    return function(cb) {\n      tail.next = {cb: cb};\n      tail = tail.next;\n      channel['port2'].postMessage(0);\n    };\n  }\n  // Implementation for IE6 to IE10: Script elements fire an asynchronous\n  // onreadystatechange event when inserted into the DOM.\n  if (typeof document !== 'undefined' &&\n      'onreadystatechange' in goog.dom.createElement(goog.dom.TagName.SCRIPT)) {\n    return function(cb) {\n      var script = goog.dom.createElement(goog.dom.TagName.SCRIPT);\n      script.onreadystatechange = function() {\n        // Clean up and call the callback.\n        script.onreadystatechange = null;\n        script.parentNode.removeChild(script);\n        script = null;\n        cb();\n        cb = null;\n      };\n      document.documentElement.appendChild(script);\n    };\n  }\n  // Fall back to setTimeout with 0. In browsers this creates a delay of 5ms\n  // or more.\n  // NOTE(user): This fallback is used for IE11.\n  return function(cb) {\n    goog.global.setTimeout(/** @type {function()} */ (cb), 0);\n  };\n};\n\n\n/**\n * Helper function that is overrided to protect callbacks with entry point\n * monitor if the application monitors entry points.\n * @param {function()} callback Callback function to fire as soon as possible.\n * @return {function()} The wrapped callback.\n * @private\n */\ngoog.async.nextTick.wrapCallback_ = goog.functions.identity;\n\n\n// Register the callback function as an entry point, so that it can be\n// monitored for exception handling, etc. This has to be done in this file\n// since it requires special code to handle all browsers.\ngoog.debug.entryPointRegistry.register(\n    /**\n     * @param {function(!Function): !Function} transformer The transforming\n     *     function.\n     */\n    function(transformer) { goog.async.nextTick.wrapCallback_ = transformer; });\n","^;",1579837703000,"^<",["^=",["^1>","^4C","^Y","^?","^3Q","~$goog.labs.userAgent.engine","^4V","^1E","~$goog.labs.userAgent.browser","^1I","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/async/nexttick.js"],"^O",["^=",["~$goog.async.throwException","~$goog.async.nextTick"]],"^W",true,"^X",["^?","^4V","^1>","^12","^1E","^Y","^1I","^4C","^73","^72","^3Q"]],["^ ","^3",[1579837703000],"^4","goog.events.imehandler.js","^5",["^6","goog/events/imehandler.js"],"^7","goog/events/imehandler.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Input Method Editors (IMEs) are OS-level widgets that make\n * it easier to type non-ascii characters on ascii keyboards (in particular,\n * characters that require more than one keystroke).\n *\n * When the user wants to type such a character, a modal menu pops up and\n * suggests possible \"next\" characters in the IME character sequence. After\n * typing N characters, the user hits \"enter\" to commit the IME to the field.\n * N differs from language to language.\n *\n * This class offers high-level events for how the user is interacting with the\n * IME in editable regions.\n *\n * Known Issues:\n *\n * Firefox always fires an extra pair of compositionstart/compositionend events.\n * We do not normalize for this.\n *\n * Opera does not fire any IME events.\n *\n * Spurious UPDATE events are common on all browsers.\n *\n * We currently do a bad job detecting when the IME closes on IE, and\n * make a \"best effort\" guess on when we know it's closed.\n *\n * @author nicksantos@google.com (Nick Santos) (Ported to Closure)\n */\n\ngoog.provide('goog.events.ImeHandler');\ngoog.provide('goog.events.ImeHandler.Event');\ngoog.provide('goog.events.ImeHandler.EventType');\n\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Dispatches high-level events for IMEs.\n * @param {Element} el The element to listen on.\n * @extends {goog.events.EventTarget}\n * @constructor\n * @final\n */\ngoog.events.ImeHandler = function(el) {\n  goog.events.ImeHandler.base(this, 'constructor');\n\n  /**\n   * The element to listen on.\n   * @type {Element}\n   * @private\n   */\n  this.el_ = el;\n\n  /**\n   * Tracks the keyup event only, because it has a different life-cycle from\n   * other events.\n   * @type {goog.events.EventHandler<!goog.events.ImeHandler>}\n   * @private\n   */\n  this.keyUpHandler_ = new goog.events.EventHandler(this);\n\n  /**\n   * Tracks all the browser events.\n   * @type {goog.events.EventHandler<!goog.events.ImeHandler>}\n   * @private\n   */\n  this.handler_ = new goog.events.EventHandler(this);\n\n  if (goog.events.ImeHandler.USES_COMPOSITION_EVENTS) {\n    this.handler_\n        .listen(\n            el, goog.events.EventType.COMPOSITIONSTART,\n            this.handleCompositionStart_)\n        .listen(\n            el, goog.events.EventType.COMPOSITIONEND,\n            this.handleCompositionEnd_)\n        .listen(\n            el, goog.events.EventType.COMPOSITIONUPDATE,\n            this.handleTextModifyingInput_);\n  }\n\n  this.handler_\n      .listen(el, goog.events.EventType.TEXTINPUT, this.handleTextInput_)\n      .listen(el, goog.events.EventType.TEXT, this.handleTextModifyingInput_)\n      .listen(el, goog.events.EventType.KEYDOWN, this.handleKeyDown_);\n};\ngoog.inherits(goog.events.ImeHandler, goog.events.EventTarget);\n\n\n/**\n * Event types fired by ImeHandler. These events do not make any guarantees\n * about whether they were fired before or after the event in question.\n * @enum {string}\n */\ngoog.events.ImeHandler.EventType = {\n  // After the IME opens.\n  START: 'startIme',\n\n  // An update to the state of the IME. An 'update' does not necessarily mean\n  // that the text contents of the field were modified in any way.\n  UPDATE: 'updateIme',\n\n  // After the IME closes.\n  END: 'endIme'\n};\n\n\n\n/**\n * An event fired by ImeHandler.\n * @param {goog.events.ImeHandler.EventType} type The type.\n * @param {goog.events.BrowserEvent} reason The trigger for this event.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.events.ImeHandler.Event = function(type, reason) {\n  goog.events.ImeHandler.Event.base(this, 'constructor', type);\n\n  /**\n   * The event that triggered this.\n   * @type {goog.events.BrowserEvent}\n   */\n  this.reason = reason;\n};\ngoog.inherits(goog.events.ImeHandler.Event, goog.events.Event);\n\n\n/**\n * Whether to use the composition events.\n * @type {boolean}\n */\ngoog.events.ImeHandler.USES_COMPOSITION_EVENTS = goog.userAgent.GECKO ||\n    (goog.userAgent.WEBKIT && goog.userAgent.isVersionOrHigher(532));\n\n\n/**\n * Stores whether IME mode is active.\n * @type {boolean}\n * @private\n */\ngoog.events.ImeHandler.prototype.imeMode_ = false;\n\n\n/**\n * The keyCode value of the last keyDown event. This value is used for\n * identiying whether or not a textInput event is sent by an IME.\n * @type {number}\n * @private\n */\ngoog.events.ImeHandler.prototype.lastKeyCode_ = 0;\n\n\n/**\n * @return {boolean} Whether an IME is active.\n */\ngoog.events.ImeHandler.prototype.isImeMode = function() {\n  return this.imeMode_;\n};\n\n\n/**\n * Handles the compositionstart event.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.events.ImeHandler.prototype.handleCompositionStart_ = function(e) {\n  this.handleImeActivate_(e);\n};\n\n\n/**\n * Handles the compositionend event.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.events.ImeHandler.prototype.handleCompositionEnd_ = function(e) {\n  this.handleImeDeactivate_(e);\n};\n\n\n/**\n * Handles the compositionupdate and text events.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.events.ImeHandler.prototype.handleTextModifyingInput_ = function(e) {\n  if (this.isImeMode()) {\n    this.processImeComposition_(e);\n  }\n};\n\n\n/**\n * Handles IME activation.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.events.ImeHandler.prototype.handleImeActivate_ = function(e) {\n  if (this.imeMode_) {\n    return;\n  }\n\n  // Listens for keyup events to handle unexpected IME keydown events on older\n  // versions of webkit.\n  //\n  // In those versions, we currently use textInput events deactivate IME\n  // (see handleTextInput_() for the reason). However,\n  // Safari fires a keydown event (as a result of pressing keys to commit IME\n  // text) with keyCode == WIN_IME after textInput event. This activates IME\n  // mode again unnecessarily. To prevent this problem, listens keyup events\n  // which can use to determine whether IME text has been committed.\n  if (goog.userAgent.WEBKIT &&\n      !goog.events.ImeHandler.USES_COMPOSITION_EVENTS) {\n    this.keyUpHandler_.listen(\n        this.el_, goog.events.EventType.KEYUP, this.handleKeyUpSafari4_);\n  }\n\n  this.imeMode_ = true;\n  this.dispatchEvent(\n      new goog.events.ImeHandler.Event(\n          goog.events.ImeHandler.EventType.START, e));\n};\n\n\n/**\n * Handles the IME compose changes.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.events.ImeHandler.prototype.processImeComposition_ = function(e) {\n  this.dispatchEvent(\n      new goog.events.ImeHandler.Event(\n          goog.events.ImeHandler.EventType.UPDATE, e));\n};\n\n\n/**\n * Handles IME deactivation.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.events.ImeHandler.prototype.handleImeDeactivate_ = function(e) {\n  this.imeMode_ = false;\n  this.keyUpHandler_.removeAll();\n  this.dispatchEvent(\n      new goog.events.ImeHandler.Event(\n          goog.events.ImeHandler.EventType.END, e));\n};\n\n\n/**\n * Handles a key down event.\n * @param {!goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.events.ImeHandler.prototype.handleKeyDown_ = function(e) {\n  // Firefox and Chrome have a separate event for IME composition ('text'\n  // and 'compositionupdate', respectively), other browsers do not.\n  if (!goog.events.ImeHandler.USES_COMPOSITION_EVENTS) {\n    var imeMode = this.isImeMode();\n    // If we're in IE and we detect an IME input on keyDown then activate\n    // the IME, otherwise if the imeMode was previously active, deactivate.\n    if (!imeMode && e.keyCode == goog.events.KeyCodes.WIN_IME) {\n      this.handleImeActivate_(e);\n    } else if (imeMode && e.keyCode != goog.events.KeyCodes.WIN_IME) {\n      if (goog.events.ImeHandler.isImeDeactivateKeyEvent_(e)) {\n        this.handleImeDeactivate_(e);\n      }\n    } else if (imeMode) {\n      this.processImeComposition_(e);\n    }\n  }\n\n  // Safari on Mac doesn't send IME events in the right order so that we must\n  // ignore some modifier key events to insert IME text correctly.\n  if (goog.events.ImeHandler.isImeDeactivateKeyEvent_(e)) {\n    this.lastKeyCode_ = e.keyCode;\n  }\n};\n\n\n/**\n * Handles a textInput event.\n * @param {!goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.events.ImeHandler.prototype.handleTextInput_ = function(e) {\n  // Some WebKit-based browsers including Safari 4 don't send composition\n  // events. So, we turn down IME mode when it's still there.\n  if (!goog.events.ImeHandler.USES_COMPOSITION_EVENTS &&\n      goog.userAgent.WEBKIT &&\n      this.lastKeyCode_ == goog.events.KeyCodes.WIN_IME && this.isImeMode()) {\n    this.handleImeDeactivate_(e);\n  }\n};\n\n\n/**\n * Handles the key up event for any IME activity. This handler is just used to\n * prevent activating IME unnecessary in Safari at this time.\n * @param {!goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.events.ImeHandler.prototype.handleKeyUpSafari4_ = function(e) {\n  if (this.isImeMode()) {\n    switch (e.keyCode) {\n      // These keyup events indicates that IME text has been committed or\n      // cancelled. We should turn off IME mode when these keyup events\n      // received.\n      case goog.events.KeyCodes.ENTER:\n      case goog.events.KeyCodes.TAB:\n      case goog.events.KeyCodes.ESC:\n        this.handleImeDeactivate_(e);\n        break;\n    }\n  }\n};\n\n\n/**\n * Returns whether the given event should be treated as an IME\n * deactivation trigger.\n * @param {!goog.events.Event} e The event.\n * @return {boolean} Whether the given event is an IME deactivate trigger.\n * @private\n */\ngoog.events.ImeHandler.isImeDeactivateKeyEvent_ = function(e) {\n  // Which key events involve IME deactivation depends on the user's\n  // environment (i.e. browsers, platforms, and IMEs). Usually Shift key\n  // and Ctrl key does not involve IME deactivation, so we currently assume\n  // that these keys are not IME deactivation trigger.\n  switch (e.keyCode) {\n    case goog.events.KeyCodes.SHIFT:\n    case goog.events.KeyCodes.CTRL:\n      return false;\n    default:\n      return true;\n  }\n};\n\n\n/** @override */\ngoog.events.ImeHandler.prototype.disposeInternal = function() {\n  this.handler_.dispose();\n  this.keyUpHandler_.dispose();\n  this.el_ = null;\n  goog.events.ImeHandler.base(this, 'disposeInternal');\n};\n","^;",1579837703000,"^<",["^=",["^1T","^?","^3W","^[","^1C","^2Y","^3H"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/imehandler.js"],"^O",["^=",["~$goog.events.ImeHandler.EventType","~$goog.events.ImeHandler.Event","~$goog.events.ImeHandler"]],"^W",true,"^X",["^?","^2Y","^1T","^3W","^1C","^3H","^["]],["^ ","^3",[1579837703000],"^4","goog.graphics.ext.shape.js","^5",["^6","goog/graphics/ext/shape.js"],"^7","goog/graphics/ext/shape.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A thick wrapper around shapes with custom paths.\n * @author robbyw@google.com (Robby Walker)\n */\n\n\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.graphics.ext.Shape');\n\ngoog.forwardDeclare('goog.graphics.Path');\ngoog.forwardDeclare('goog.graphics.ext.Group');\ngoog.forwardDeclare('goog.graphics.ext.Path');\ngoog.forwardDeclare('goog.math.Rect');\ngoog.require('goog.graphics.ext.StrokeAndFillElement');\n\n\n\n/**\n * Wrapper for a graphics shape element.\n * @param {goog.graphics.ext.Group} group Parent for this element.\n * @param {!goog.graphics.ext.Path} path  The path to draw.\n * @param {boolean=} opt_autoSize Optional flag to specify the path should\n *     automatically resize to fit the element.  Defaults to false.\n * @constructor\n * @extends {goog.graphics.ext.StrokeAndFillElement}\n * @final\n */\ngoog.graphics.ext.Shape = function(group, path, opt_autoSize) {\n  this.autoSize_ = !!opt_autoSize;\n\n  var graphics = group.getGraphicsImplementation();\n  var wrapper = graphics.drawPath(path, null, null, group.getWrapper());\n  goog.graphics.ext.StrokeAndFillElement.call(this, group, wrapper);\n  this.setPath(path);\n};\ngoog.inherits(goog.graphics.ext.Shape, goog.graphics.ext.StrokeAndFillElement);\n\n\n/**\n * Whether or not to automatically resize the shape's path when the element\n * itself is resized.\n * @type {boolean}\n * @private\n */\ngoog.graphics.ext.Shape.prototype.autoSize_ = false;\n\n\n/**\n * The original path, specified by the caller.\n * @type {goog.graphics.Path}\n * @private\n */\ngoog.graphics.ext.Shape.prototype.path_;\n\n\n/**\n * The bounding box of the original path.\n * @type {goog.math.Rect?}\n * @private\n */\ngoog.graphics.ext.Shape.prototype.boundingBox_ = null;\n\n\n/**\n * The scaled path.\n * @type {goog.graphics.Path}\n * @private\n */\ngoog.graphics.ext.Shape.prototype.scaledPath_;\n\n\n/**\n * Get the path drawn by this shape.\n * @return {goog.graphics.Path?} The path drawn by this shape.\n */\ngoog.graphics.ext.Shape.prototype.getPath = function() {\n  return this.path_;\n};\n\n\n/**\n * Set the path to draw.\n * @param {goog.graphics.ext.Path} path The path to draw.\n */\ngoog.graphics.ext.Shape.prototype.setPath = function(path) {\n  this.path_ = path;\n\n  if (this.autoSize_) {\n    this.boundingBox_ = path.getBoundingBox();\n  }\n\n  this.scaleAndSetPath_();\n};\n\n\n/**\n * Scale the internal path to fit.\n * @private\n */\ngoog.graphics.ext.Shape.prototype.scaleAndSetPath_ = function() {\n  this.scaledPath_ = this.boundingBox_ ?\n      this.path_.clone().modifyBounds(\n          -this.boundingBox_.left, -this.boundingBox_.top,\n          this.getWidth() / (this.boundingBox_.width || 1),\n          this.getHeight() / (this.boundingBox_.height || 1)) :\n      this.path_;\n\n  var wrapper = this.getWrapper();\n  if (wrapper) {\n    wrapper.setPath(this.scaledPath_);\n  }\n};\n\n\n/**\n * Redraw the ellipse.  Called when the coordinate system is changed.\n * @protected\n * @override\n */\ngoog.graphics.ext.Shape.prototype.redraw = function() {\n  goog.graphics.ext.Shape.superClass_.redraw.call(this);\n  if (this.autoSize_) {\n    this.scaleAndSetPath_();\n  }\n};\n\n\n/**\n * @return {boolean} Whether the shape is parent dependent.\n * @protected\n * @override\n */\ngoog.graphics.ext.Shape.prototype.checkParentDependent = function() {\n  return this.autoSize_ ||\n      goog.graphics.ext.Shape.superClass_.checkParentDependent.call(this);\n};\n","^;",1579837703000,"^<",["^=",["^?","~$goog.graphics.ext.StrokeAndFillElement"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/ext/shape.js"],"^O",["^=",["~$goog.graphics.ext.Shape"]],"^W",true,"^X",["^?","^79"]],["^ ","^3",[1579837703000],"^4","goog.testing.ui.rendererharness.js","^5",["^6","goog/testing/ui/rendererharness.js"],"^7","goog/testing/ui/rendererharness.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved\n\n/**\n * @fileoverview A driver for testing renderers.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.setTestOnly('goog.testing.ui.RendererHarness');\ngoog.provide('goog.testing.ui.RendererHarness');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.testing.asserts');\ngoog.require('goog.testing.dom');\ngoog.require('goog.ui.Control');\ngoog.require('goog.ui.ControlRenderer');\n\n\n\n/**\n * A driver for testing renderers.\n *\n * @param {goog.ui.ControlRenderer} renderer A renderer to test.\n * @param {Element} renderParent The parent of the element where controls will\n *     be rendered.\n * @param {Element} decorateParent The parent of the element where controls will\n *     be decorated.\n * @constructor\n * @extends {goog.Disposable}\n * @final\n */\ngoog.testing.ui.RendererHarness = function(\n    renderer, renderParent, decorateParent) {\n  goog.Disposable.call(this);\n\n  /**\n   * The renderer under test.\n   * @type {goog.ui.ControlRenderer}\n   * @private\n   */\n  this.renderer_ = renderer;\n\n  /**\n   * The parent of the element where controls will be rendered.\n   * @type {Element}\n   * @private\n   */\n  this.renderParent_ = renderParent;\n\n  /**\n   * The original HTML of the render element.\n   * @type {string}\n   * @private\n   */\n  this.renderHtml_ = renderParent.innerHTML;\n\n  /**\n   * The parent of the element where controls will be decorated.\n   * @type {Element}\n   * @private\n   */\n  this.decorateParent_ = decorateParent;\n\n  /**\n   * The original HTML of the decorated element.\n   * @type {string}\n   * @private\n   */\n  this.decorateHtml_ = decorateParent.innerHTML;\n};\ngoog.inherits(goog.testing.ui.RendererHarness, goog.Disposable);\n\n\n/**\n * A control to create by decoration.\n * @type {goog.ui.Control}\n * @private\n */\ngoog.testing.ui.RendererHarness.prototype.decorateControl_;\n\n\n/**\n * A control to create by rendering.\n * @type {goog.ui.Control}\n * @private\n */\ngoog.testing.ui.RendererHarness.prototype.renderControl_;\n\n\n/**\n * Whether all the necessary assert methods have been called.\n * @type {boolean}\n * @private\n */\ngoog.testing.ui.RendererHarness.prototype.verified_ = false;\n\n\n/**\n * Attach a control and render its DOM.\n * @param {goog.ui.Control} control A control.\n * @return {Element} The element created.\n */\ngoog.testing.ui.RendererHarness.prototype.attachControlAndRender = function(\n    control) {\n  this.renderControl_ = control;\n\n  control.setRenderer(this.renderer_);\n  control.render(this.renderParent_);\n  return control.getElement();\n};\n\n\n/**\n * Attach a control and decorate the element given in the constructor.\n * @param {goog.ui.Control} control A control.\n * @return {Element} The element created.\n */\ngoog.testing.ui.RendererHarness.prototype.attachControlAndDecorate = function(\n    control) {\n  this.decorateControl_ = control;\n\n  control.setRenderer(this.renderer_);\n\n  var child = this.decorateParent_.firstChild;\n  assertEquals(\n      'The decorated node must be an element', goog.dom.NodeType.ELEMENT,\n      child.nodeType);\n  control.decorate(/** @type {!Element} */ (child));\n  return control.getElement();\n};\n\n\n/**\n * Assert that the rendered element and the decorated element match.\n */\ngoog.testing.ui.RendererHarness.prototype.assertDomMatches = function() {\n  assert(\n      'Both elements were not generated',\n      !!(this.renderControl_ && this.decorateControl_));\n  goog.testing.dom.assertHtmlMatches(\n      this.renderControl_.getElement().innerHTML,\n      this.decorateControl_.getElement().innerHTML);\n  this.verified_ = true;\n};\n\n\n/**\n * Destroy the harness, verifying that all assertions had been checked.\n * @override\n * @protected\n */\ngoog.testing.ui.RendererHarness.prototype.disposeInternal = function() {\n  // If the harness was not verified appropriately, throw an exception.\n  assert(\n      'Expected assertDomMatches to be called',\n      this.verified_ || !this.renderControl_ || !this.decorateControl_);\n\n  if (this.decorateControl_) {\n    this.decorateControl_.dispose();\n  }\n  if (this.renderControl_) {\n    this.renderControl_.dispose();\n  }\n\n  this.renderParent_.innerHTML = this.renderHtml_;\n  this.decorateParent_.innerHTML = this.decorateHtml_;\n\n  goog.testing.ui.RendererHarness.superClass_.disposeInternal.call(this);\n};\n","^;",1579837703000,"^<",["^=",["^2K","^5[","^?","~$goog.testing.dom","^5B","^1W","^1:"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/ui/rendererharness.js"],"^O",["^=",["~$goog.testing.ui.RendererHarness"]],"^W",true,"^X",["^?","^1:","^2K","^5[","^7;","^1W","^5B"]],["^ ","^3",[1579837703000],"^4","goog.string.newlines.js","^5",["^6","goog/string/newlines.js"],"^7","goog/string/newlines.js","^8","^9","^:","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for string newlines.\n * @author nnaze@google.com (Nathan Naze)\n */\n\n\n/**\n * Namespace for string utilities\n */\ngoog.provide('goog.string.newlines');\ngoog.provide('goog.string.newlines.Line');\n\ngoog.require('goog.array');\n\n\n/**\n * Splits a string into lines, properly handling universal newlines.\n * @param {string} str String to split.\n * @param {boolean=} opt_keepNewlines Whether to keep the newlines in the\n *     resulting strings. Defaults to false.\n * @return {!Array<string>} String split into lines.\n */\ngoog.string.newlines.splitLines = function(str, opt_keepNewlines) {\n  var lines = goog.string.newlines.getLines(str);\n  return goog.array.map(lines, function(line) {\n    return opt_keepNewlines ? line.getFullLine() : line.getContent();\n  });\n};\n\n\n\n/**\n * Line metadata class that records the start/end indicies of lines\n * in a string.  Can be used to implement common newline use cases such as\n * splitLines() or determining line/column of an index in a string.\n * Also implements methods to get line contents.\n *\n * Indexes are expressed as string indicies into string.substring(), inclusive\n * at the start, exclusive at the end.\n *\n * Create an array of these with goog.string.newlines.getLines().\n * @param {string} string The original string.\n * @param {number} startLineIndex The index of the start of the line.\n * @param {number} endContentIndex The index of the end of the line, excluding\n *     newlines.\n * @param {number} endLineIndex The index of the end of the line, index\n *     newlines.\n * @constructor\n * @struct\n * @final\n */\ngoog.string.newlines.Line = function(\n    string, startLineIndex, endContentIndex, endLineIndex) {\n  /**\n   * The original string.\n   * @type {string}\n   */\n  this.string = string;\n\n  /**\n   * Index of the start of the line.\n   * @type {number}\n   */\n  this.startLineIndex = startLineIndex;\n\n  /**\n   * Index of the end of the line, excluding any newline characters.\n   * Index is the first character after the line, suitable for\n   * String.substring().\n   * @type {number}\n   */\n  this.endContentIndex = endContentIndex;\n\n  /**\n   * Index of the end of the line, excluding any newline characters.\n   * Index is the first character after the line, suitable for\n   * String.substring().\n   * @type {number}\n   */\n\n  this.endLineIndex = endLineIndex;\n};\n\n\n/**\n * @return {string} The content of the line, excluding any newline characters.\n */\ngoog.string.newlines.Line.prototype.getContent = function() {\n  return this.string.substring(this.startLineIndex, this.endContentIndex);\n};\n\n\n/**\n * @return {string} The full line, including any newline characters.\n */\ngoog.string.newlines.Line.prototype.getFullLine = function() {\n  return this.string.substring(this.startLineIndex, this.endLineIndex);\n};\n\n\n/**\n * @return {string} The newline characters, if any ('\\n', \\r', '\\r\\n', '', etc).\n */\ngoog.string.newlines.Line.prototype.getNewline = function() {\n  return this.string.substring(this.endContentIndex, this.endLineIndex);\n};\n\n\n/**\n * Splits a string into an array of line metadata.\n * @param {string} str String to split.\n * @return {!Array<!goog.string.newlines.Line>} Array of line metadata.\n */\ngoog.string.newlines.getLines = function(str) {\n  // We use the constructor because literals are evaluated only once in\n  // < ES 3.1.\n  // See http://www.mail-archive.com/es-discuss@mozilla.org/msg01796.html\n  var re = RegExp('\\r\\n|\\r|\\n', 'g');\n  var sliceIndex = 0;\n  var result;\n  var lines = [];\n\n  while (result = re.exec(str)) {\n    var line = new goog.string.newlines.Line(\n        str, sliceIndex, result.index, result.index + result[0].length);\n    lines.push(line);\n\n    // remember where to start the slice from\n    sliceIndex = re.lastIndex;\n  }\n\n  // If the string does not end with a newline, add the last line.\n  if (sliceIndex < str.length) {\n    var line =\n        new goog.string.newlines.Line(str, sliceIndex, str.length, str.length);\n    lines.push(line);\n  }\n\n  return lines;\n};\n","^;",1579837703000,"^<",["^=",["^?","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/string/newlines.js"],"^O",["^=",["~$goog.string.newlines","~$goog.string.newlines.Line"]],"^W",true,"^X",["^?","^2O"]],["^ ","^3",[1579837703000],"^4","goog.math.interpolator.interpolator1.js","^5",["^6","goog/math/interpolator/interpolator1.js"],"^7","goog/math/interpolator/interpolator1.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The base interface for one-dimensional data interpolation.\n *\n */\n\ngoog.provide('goog.math.interpolator.Interpolator1');\n\n\n\n/**\n * An interface for one dimensional data interpolation.\n * @interface\n */\ngoog.math.interpolator.Interpolator1 = function() {};\n\n\n/**\n * Sets the data to be interpolated. Note that the data points are expected\n * to be sorted according to their abscissa values and not have duplicate\n * values. E.g. calling setData([0, 0, 1], [1, 1, 3]) may give undefined\n * results, the correct call should be setData([0, 1], [1, 3]).\n * Calling setData multiple times does not merge the data samples. The last\n * call to setData is the one used when computing the interpolation.\n * @param {!Array<number>} x The abscissa of the data points.\n * @param {!Array<number>} y The ordinate of the data points.\n */\ngoog.math.interpolator.Interpolator1.prototype.setData;\n\n\n/**\n * Computes the interpolated value at abscissa x. If x is outside the range\n * of the data points passed in setData, the value is extrapolated.\n * @param {number} x The abscissa to sample at.\n * @return {number} The interpolated value at abscissa x.\n */\ngoog.math.interpolator.Interpolator1.prototype.interpolate;\n\n\n/**\n * Computes the inverse interpolator. That is, it returns invInterp s.t.\n * this.interpolate(invInterp.interpolate(t))) = t. Note that the inverse\n * interpolator is only well defined if the data being interpolated is\n * 'invertible', i.e. it represents a bijective function.\n * In addition, the returned interpolator is only guaranteed to give the exact\n * inverse at the input data passed in getData.\n * If 'this' has no data, the returned Interpolator will be empty as well.\n * @return {!goog.math.interpolator.Interpolator1} The inverse interpolator.\n */\ngoog.math.interpolator.Interpolator1.prototype.getInverse;\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/interpolator/interpolator1.js"],"^O",["^=",["~$goog.math.interpolator.Interpolator1"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.color.names.js","^5",["^6","goog/color/names.js"],"^7","goog/color/names.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Names of standard colors with their associated hex values.\n */\n\ngoog.provide('goog.color.names');\n\n\n/**\n * A map that contains a lot of colors that are recognised by various browsers.\n * This list is way larger than the minimal one dictated by W3C.\n * The keys of this map are the lowercase \"readable\" names of the colors, while\n * the values are the \"hex\" values.\n *\n * @type {!Object<string, string>}\n */\ngoog.color.names = {\n  'aliceblue': '#f0f8ff',\n  'antiquewhite': '#faebd7',\n  'aqua': '#00ffff',\n  'aquamarine': '#7fffd4',\n  'azure': '#f0ffff',\n  'beige': '#f5f5dc',\n  'bisque': '#ffe4c4',\n  'black': '#000000',\n  'blanchedalmond': '#ffebcd',\n  'blue': '#0000ff',\n  'blueviolet': '#8a2be2',\n  'brown': '#a52a2a',\n  'burlywood': '#deb887',\n  'cadetblue': '#5f9ea0',\n  'chartreuse': '#7fff00',\n  'chocolate': '#d2691e',\n  'coral': '#ff7f50',\n  'cornflowerblue': '#6495ed',\n  'cornsilk': '#fff8dc',\n  'crimson': '#dc143c',\n  'cyan': '#00ffff',\n  'darkblue': '#00008b',\n  'darkcyan': '#008b8b',\n  'darkgoldenrod': '#b8860b',\n  'darkgray': '#a9a9a9',\n  'darkgreen': '#006400',\n  'darkgrey': '#a9a9a9',\n  'darkkhaki': '#bdb76b',\n  'darkmagenta': '#8b008b',\n  'darkolivegreen': '#556b2f',\n  'darkorange': '#ff8c00',\n  'darkorchid': '#9932cc',\n  'darkred': '#8b0000',\n  'darksalmon': '#e9967a',\n  'darkseagreen': '#8fbc8f',\n  'darkslateblue': '#483d8b',\n  'darkslategray': '#2f4f4f',\n  'darkslategrey': '#2f4f4f',\n  'darkturquoise': '#00ced1',\n  'darkviolet': '#9400d3',\n  'deeppink': '#ff1493',\n  'deepskyblue': '#00bfff',\n  'dimgray': '#696969',\n  'dimgrey': '#696969',\n  'dodgerblue': '#1e90ff',\n  'firebrick': '#b22222',\n  'floralwhite': '#fffaf0',\n  'forestgreen': '#228b22',\n  'fuchsia': '#ff00ff',\n  'gainsboro': '#dcdcdc',\n  'ghostwhite': '#f8f8ff',\n  'gold': '#ffd700',\n  'goldenrod': '#daa520',\n  'gray': '#808080',\n  'green': '#008000',\n  'greenyellow': '#adff2f',\n  'grey': '#808080',\n  'honeydew': '#f0fff0',\n  'hotpink': '#ff69b4',\n  'indianred': '#cd5c5c',\n  'indigo': '#4b0082',\n  'ivory': '#fffff0',\n  'khaki': '#f0e68c',\n  'lavender': '#e6e6fa',\n  'lavenderblush': '#fff0f5',\n  'lawngreen': '#7cfc00',\n  'lemonchiffon': '#fffacd',\n  'lightblue': '#add8e6',\n  'lightcoral': '#f08080',\n  'lightcyan': '#e0ffff',\n  'lightgoldenrodyellow': '#fafad2',\n  'lightgray': '#d3d3d3',\n  'lightgreen': '#90ee90',\n  'lightgrey': '#d3d3d3',\n  'lightpink': '#ffb6c1',\n  'lightsalmon': '#ffa07a',\n  'lightseagreen': '#20b2aa',\n  'lightskyblue': '#87cefa',\n  'lightslategray': '#778899',\n  'lightslategrey': '#778899',\n  'lightsteelblue': '#b0c4de',\n  'lightyellow': '#ffffe0',\n  'lime': '#00ff00',\n  'limegreen': '#32cd32',\n  'linen': '#faf0e6',\n  'magenta': '#ff00ff',\n  'maroon': '#800000',\n  'mediumaquamarine': '#66cdaa',\n  'mediumblue': '#0000cd',\n  'mediumorchid': '#ba55d3',\n  'mediumpurple': '#9370db',\n  'mediumseagreen': '#3cb371',\n  'mediumslateblue': '#7b68ee',\n  'mediumspringgreen': '#00fa9a',\n  'mediumturquoise': '#48d1cc',\n  'mediumvioletred': '#c71585',\n  'midnightblue': '#191970',\n  'mintcream': '#f5fffa',\n  'mistyrose': '#ffe4e1',\n  'moccasin': '#ffe4b5',\n  'navajowhite': '#ffdead',\n  'navy': '#000080',\n  'oldlace': '#fdf5e6',\n  'olive': '#808000',\n  'olivedrab': '#6b8e23',\n  'orange': '#ffa500',\n  'orangered': '#ff4500',\n  'orchid': '#da70d6',\n  'palegoldenrod': '#eee8aa',\n  'palegreen': '#98fb98',\n  'paleturquoise': '#afeeee',\n  'palevioletred': '#db7093',\n  'papayawhip': '#ffefd5',\n  'peachpuff': '#ffdab9',\n  'peru': '#cd853f',\n  'pink': '#ffc0cb',\n  'plum': '#dda0dd',\n  'powderblue': '#b0e0e6',\n  'purple': '#800080',\n  'red': '#ff0000',\n  'rosybrown': '#bc8f8f',\n  'royalblue': '#4169e1',\n  'saddlebrown': '#8b4513',\n  'salmon': '#fa8072',\n  'sandybrown': '#f4a460',\n  'seagreen': '#2e8b57',\n  'seashell': '#fff5ee',\n  'sienna': '#a0522d',\n  'silver': '#c0c0c0',\n  'skyblue': '#87ceeb',\n  'slateblue': '#6a5acd',\n  'slategray': '#708090',\n  'slategrey': '#708090',\n  'snow': '#fffafa',\n  'springgreen': '#00ff7f',\n  'steelblue': '#4682b4',\n  'tan': '#d2b48c',\n  'teal': '#008080',\n  'thistle': '#d8bfd8',\n  'tomato': '#ff6347',\n  'turquoise': '#40e0d0',\n  'violet': '#ee82ee',\n  'wheat': '#f5deb3',\n  'white': '#ffffff',\n  'whitesmoke': '#f5f5f5',\n  'yellow': '#ffff00',\n  'yellowgreen': '#9acd32'\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/color/names.js"],"^O",["^=",["~$goog.color.names"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.math.interpolator.spline1.js","^5",["^6","goog/math/interpolator/spline1.js"],"^7","goog/math/interpolator/spline1.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A one dimensional cubic spline interpolator with not-a-knot\n * boundary conditions.\n *\n * See http://en.wikipedia.org/wiki/Spline_interpolation.\n *\n */\n\ngoog.provide('goog.math.interpolator.Spline1');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.math');\ngoog.require('goog.math.interpolator.Interpolator1');\ngoog.require('goog.math.tdma');\n\n\n\n/**\n * A one dimensional cubic spline interpolator with natural boundary conditions.\n * @implements {goog.math.interpolator.Interpolator1}\n * @constructor\n */\ngoog.math.interpolator.Spline1 = function() {\n  /**\n   * The abscissa of the data points.\n   * @type {!Array<number>}\n   * @private\n   */\n  this.x_ = [];\n\n  /**\n   * The spline interval coefficients.\n   * Note that, in general, the length of coeffs and x is not the same.\n   * @type {!Array<!Array<number>>}\n   * @private\n   */\n  this.coeffs_ = [[0, 0, 0, Number.NaN]];\n};\n\n\n/** @override */\ngoog.math.interpolator.Spline1.prototype.setData = function(x, y) {\n  goog.asserts.assert(\n      x.length == y.length,\n      'input arrays to setData should have the same length');\n  if (x.length > 0) {\n    this.coeffs_ = this.computeSplineCoeffs_(x, y);\n    this.x_ = x.slice();\n  } else {\n    this.coeffs_ = [[0, 0, 0, Number.NaN]];\n    this.x_ = [];\n  }\n};\n\n\n/** @override */\ngoog.math.interpolator.Spline1.prototype.interpolate = function(x) {\n  var pos = goog.array.binarySearch(this.x_, x);\n  if (pos < 0) {\n    pos = -pos - 2;\n  }\n  pos = goog.math.clamp(pos, 0, this.coeffs_.length - 1);\n\n  var d = x - this.x_[pos];\n  var d2 = d * d;\n  var d3 = d2 * d;\n  var coeffs = this.coeffs_[pos];\n  return coeffs[0] * d3 + coeffs[1] * d2 + coeffs[2] * d + coeffs[3];\n};\n\n\n/**\n * Solve for the spline coefficients such that the spline precisely interpolates\n * the data points.\n * @param {Array<number>} x The abscissa of the spline data points.\n * @param {Array<number>} y The ordinate of the spline data points.\n * @return {!Array<!Array<number>>} The spline interval coefficients.\n * @private\n */\ngoog.math.interpolator.Spline1.prototype.computeSplineCoeffs_ = function(x, y) {\n  var nIntervals = x.length - 1;\n  var dx = new Array(nIntervals);\n  var delta = new Array(nIntervals);\n  for (var i = 0; i < nIntervals; ++i) {\n    dx[i] = x[i + 1] - x[i];\n    delta[i] = (y[i + 1] - y[i]) / dx[i];\n  }\n\n  // Compute the spline coefficients from the 1st order derivatives.\n  var coeffs = [];\n  if (nIntervals == 0) {\n    // Nearest neighbor interpolation.\n    coeffs[0] = [0, 0, 0, y[0]];\n  } else if (nIntervals == 1) {\n    // Straight line interpolation.\n    coeffs[0] = [0, 0, delta[0], y[0]];\n  } else if (nIntervals == 2) {\n    // Parabola interpolation.\n    var c3 = 0;\n    var c2 = (delta[1] - delta[0]) / (dx[0] + dx[1]);\n    var c1 = delta[0] - c2 * dx[0];\n    var c0 = y[0];\n    coeffs[0] = [c3, c2, c1, c0];\n  } else {\n    // General Spline interpolation. Compute the 1st order derivatives from\n    // the Spline equations.\n    var deriv = this.computeDerivatives(dx, delta);\n    for (var i = 0; i < nIntervals; ++i) {\n      var c3 = (deriv[i] - 2 * delta[i] + deriv[i + 1]) / (dx[i] * dx[i]);\n      var c2 = (3 * delta[i] - 2 * deriv[i] - deriv[i + 1]) / dx[i];\n      var c1 = deriv[i];\n      var c0 = y[i];\n      coeffs[i] = [c3, c2, c1, c0];\n    }\n  }\n  return coeffs;\n};\n\n\n/**\n * Computes the derivative at each point of the spline such that\n * the curve is C2. It uses not-a-knot boundary conditions.\n * @param {Array<number>} dx The spacing between consecutive data points.\n * @param {Array<number>} slope The slopes between consecutive data points.\n * @return {!Array<number>} The Spline derivative at each data point.\n * @protected\n */\ngoog.math.interpolator.Spline1.prototype.computeDerivatives = function(\n    dx, slope) {\n  var nIntervals = dx.length;\n\n  // Compute the main diagonal of the system of equations.\n  var mainDiag = new Array(nIntervals + 1);\n  mainDiag[0] = dx[1];\n  for (var i = 1; i < nIntervals; ++i) {\n    mainDiag[i] = 2 * (dx[i] + dx[i - 1]);\n  }\n  mainDiag[nIntervals] = dx[nIntervals - 2];\n\n  // Compute the sub diagonal of the system of equations.\n  var subDiag = new Array(nIntervals);\n  for (var i = 0; i < nIntervals; ++i) {\n    subDiag[i] = dx[i + 1];\n  }\n  subDiag[nIntervals - 1] = dx[nIntervals - 2] + dx[nIntervals - 1];\n\n  // Compute the super diagonal of the system of equations.\n  var supDiag = new Array(nIntervals);\n  supDiag[0] = dx[0] + dx[1];\n  for (var i = 1; i < nIntervals; ++i) {\n    supDiag[i] = dx[i - 1];\n  }\n\n  // Compute the right vector of the system of equations.\n  var vecRight = new Array(nIntervals + 1);\n  vecRight[0] =\n      ((dx[0] + 2 * supDiag[0]) * dx[1] * slope[0] + dx[0] * dx[0] * slope[1]) /\n      supDiag[0];\n  for (var i = 1; i < nIntervals; ++i) {\n    vecRight[i] = 3 * (dx[i] * slope[i - 1] + dx[i - 1] * slope[i]);\n  }\n  vecRight[nIntervals] =\n      (dx[nIntervals - 1] * dx[nIntervals - 1] * slope[nIntervals - 2] +\n       (2 * subDiag[nIntervals - 1] + dx[nIntervals - 1]) * dx[nIntervals - 2] *\n           slope[nIntervals - 1]) /\n      subDiag[nIntervals - 1];\n\n  // Solve the system of equations.\n  var deriv = goog.math.tdma.solve(subDiag, mainDiag, supDiag, vecRight);\n\n  return deriv;\n};\n\n\n/**\n * Note that the inverse of a cubic spline is not a cubic spline in general.\n * As a result the inverse implementation is only approximate. In\n * particular, it only guarantees the exact inverse at the original input data\n * points passed to setData.\n * @override\n */\ngoog.math.interpolator.Spline1.prototype.getInverse = function() {\n  var interpolator = new goog.math.interpolator.Spline1();\n  var y = [];\n  for (var i = 0; i < this.x_.length; i++) {\n    y[i] = this.interpolate(this.x_[i]);\n  }\n  interpolator.setData(y, this.x_);\n  return interpolator;\n};\n","^;",1579837703000,"^<",["^=",["^1L","~$goog.math.tdma","^7?","^?","^4Q","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/interpolator/spline1.js"],"^O",["^=",["~$goog.math.interpolator.Spline1"]],"^W",true,"^X",["^?","^2O","^1L","^4Q","^7?","^7A"]],["^ ","^3",[1579837703000],"^4","goog.tweak.tweakui.js","^5",["^6","goog/tweak/tweakui.js"],"^7","goog/tweak/tweakui.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A UI for editing tweak settings / clicking tweak actions.\n *\n * @author agrieve@google.com (Andrew Grieve)\n */\n\ngoog.provide('goog.tweak.EntriesPanel');\ngoog.provide('goog.tweak.TweakUi');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.SafeStyleSheet');\ngoog.require('goog.object');\ngoog.require('goog.string.Const');\ngoog.require('goog.style');\ngoog.require('goog.tweak');\ngoog.require('goog.tweak.BaseEntry');\ngoog.require('goog.tweak.BooleanGroup');\ngoog.require('goog.tweak.BooleanInGroupSetting');\ngoog.require('goog.tweak.BooleanSetting');\ngoog.require('goog.tweak.ButtonAction');\ngoog.require('goog.tweak.NumericSetting');\ngoog.require('goog.tweak.StringSetting');\ngoog.require('goog.ui.Zippy');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A UI for editing tweak settings / clicking tweak actions.\n * @param {!goog.tweak.Registry} registry The registry to render.\n * @param {goog.dom.DomHelper=} opt_domHelper The DomHelper to render with.\n * @constructor\n * @final\n */\ngoog.tweak.TweakUi = function(registry, opt_domHelper) {\n  /**\n   * The registry to create a UI from.\n   * @type {!goog.tweak.Registry}\n   * @private\n   */\n  this.registry_ = registry;\n\n  /**\n   * The element to display when the UI is visible.\n   * @type {goog.tweak.EntriesPanel|undefined}\n   * @private\n   */\n  this.entriesPanel_;\n\n  /**\n   * The DomHelper to render with.\n   * @type {!goog.dom.DomHelper}\n   * @private\n   */\n  this.domHelper_ = opt_domHelper || goog.dom.getDomHelper();\n\n  // Listen for newly registered entries (happens with lazy-loaded modules).\n  registry.addOnRegisterListener(goog.bind(this.onNewRegisteredEntry_, this));\n};\n\n\n/**\n * The CSS class name unique to the root tweak panel div.\n * @type {string}\n * @private\n */\ngoog.tweak.TweakUi.ROOT_PANEL_CLASS_ = goog.getCssName('goog-tweak-root');\n\n\n/**\n * The CSS class name unique to the tweak entry div.\n * @type {string}\n * @private\n */\ngoog.tweak.TweakUi.ENTRY_CSS_CLASS_ = goog.getCssName('goog-tweak-entry');\n\n\n/**\n * The CSS classes for each tweak entry div.\n * @type {string}\n * @private\n */\ngoog.tweak.TweakUi.ENTRY_CSS_CLASSES_ = goog.tweak.TweakUi.ENTRY_CSS_CLASS_ +\n    ' ' + goog.getCssName('goog-inline-block');\n\n\n/**\n * The CSS classes for each namespace tweak entry div.\n * @type {string}\n * @private\n */\ngoog.tweak.TweakUi.ENTRY_GROUP_CSS_CLASSES_ =\n    goog.tweak.TweakUi.ENTRY_CSS_CLASS_;\n\n\n/**\n * Marker that the style sheet has already been installed.\n * @type {string}\n * @private\n */\ngoog.tweak.TweakUi.STYLE_SHEET_INSTALLED_MARKER_ = '__closure_tweak_installed_';\n\n\n/**\n * CSS used by TweakUI.\n * @type {!goog.html.SafeStyleSheet}\n * @private\n */\ngoog.tweak.TweakUi.CSS_STYLES_ = (function() {\n  var MOBILE = goog.userAgent.MOBILE;\n  var IE = goog.userAgent.IE;\n  var ROOT_PANEL_CLASS = '.' + goog.tweak.TweakUi.ROOT_PANEL_CLASS_;\n  var GOOG_INLINE_BLOCK_CLASS = '.' + goog.getCssName('goog-inline-block');\n  var ret = [goog.html.SafeStyleSheet.createRule(\n      ROOT_PANEL_CLASS, {'background': '#ffc', 'padding': '0 4px'})];\n  // Make this work even if the user hasn't included common.css.\n  if (!IE) {\n    ret.push(goog.html.SafeStyleSheet.createRule(\n        GOOG_INLINE_BLOCK_CLASS, {'display': 'inline-block'}));\n  }\n  // Space things out vertically for touch UIs.\n  if (MOBILE) {\n    ret.push(goog.html.SafeStyleSheet.createRule(\n        ROOT_PANEL_CLASS + ',' + ROOT_PANEL_CLASS + ' fieldset',\n        {'line-height': '2em'}));\n  }\n  return goog.html.SafeStyleSheet.concat(ret);\n})();\n\n\n/**\n * Creates a TweakUi if tweaks are enabled.\n * @param {goog.dom.DomHelper=} opt_domHelper The DomHelper to render with.\n * @return {!Element|undefined} The root UI element or undefined if tweaks are\n *     not enabled.\n */\ngoog.tweak.TweakUi.create = function(opt_domHelper) {\n  var registry = goog.tweak.getRegistry();\n  if (registry) {\n    var ui = new goog.tweak.TweakUi(registry, opt_domHelper);\n    ui.render();\n    return ui.getRootElement();\n  }\n};\n\n\n/**\n * Creates a TweakUi inside of a show/hide link.\n * @param {goog.dom.DomHelper=} opt_domHelper The DomHelper to render with.\n * @return {!Element|undefined} The root UI element or undefined if tweaks are\n *     not enabled.\n */\ngoog.tweak.TweakUi.createCollapsible = function(opt_domHelper) {\n  var registry = goog.tweak.getRegistry();\n  if (registry) {\n    var dh = opt_domHelper || goog.dom.getDomHelper();\n\n    // The following strings are for internal debugging only.  No translation\n    // necessary.  Do NOT wrap goog.getMsg() around these strings.\n    var showLink =\n        dh.createDom(goog.dom.TagName.A, {href: 'javascript:;'}, 'Show Tweaks');\n    var hideLink =\n        dh.createDom(goog.dom.TagName.A, {href: 'javascript:;'}, 'Hide Tweaks');\n    var ret = dh.createDom(goog.dom.TagName.DIV, null, showLink);\n\n    var lazyCreate = function() {\n      // Lazily render the UI.\n      var ui = new goog.tweak.TweakUi(\n          /** @type {!goog.tweak.Registry} */ (registry), dh);\n      ui.render();\n      // Put the hide link on the same line as the \"Show Descriptions\" link.\n      // Set the style lazily because we can.\n      hideLink.style.marginRight = '10px';\n      var tweakElem = ui.getRootElement();\n      tweakElem.insertBefore(hideLink, tweakElem.firstChild);\n      ret.appendChild(tweakElem);\n      return tweakElem;\n    };\n    new goog.ui.Zippy(showLink, lazyCreate, false /* expanded */, hideLink);\n    return ret;\n  }\n};\n\n\n/**\n * Compares the given entries. Orders alphabetically and groups buttons and\n * expandable groups.\n * @param {!goog.tweak.BaseEntry} a The first entry to compare.\n * @param {!goog.tweak.BaseEntry} b The second entry to compare.\n * @return {number} Refer to goog.array.defaultCompare.\n * @private\n */\ngoog.tweak.TweakUi.entryCompare_ = function(a, b) {\n  return (\n      goog.array.defaultCompare(\n          a instanceof goog.tweak.NamespaceEntry_,\n          b instanceof goog.tweak.NamespaceEntry_) ||\n      goog.array.defaultCompare(\n          a instanceof goog.tweak.BooleanGroup,\n          b instanceof goog.tweak.BooleanGroup) ||\n      goog.array.defaultCompare(\n          a instanceof goog.tweak.ButtonAction,\n          b instanceof goog.tweak.ButtonAction) ||\n      goog.array.defaultCompare(a.label, b.label) ||\n      goog.array.defaultCompare(a.getId(), b.getId()));\n};\n\n\n/**\n * @param {!goog.tweak.BaseEntry} entry The entry.\n * @return {boolean} Returns whether the given entry contains sub-entries.\n * @private\n */\ngoog.tweak.TweakUi.isGroupEntry_ = function(entry) {\n  return entry instanceof goog.tweak.NamespaceEntry_ ||\n      entry instanceof goog.tweak.BooleanGroup;\n};\n\n\n/**\n * Returns the list of entries from the given boolean group.\n * @param {!goog.tweak.BooleanGroup} group The group to get the entries from.\n * @return {!Array<!goog.tweak.BaseEntry>} The sorted entries.\n * @private\n */\ngoog.tweak.TweakUi.extractBooleanGroupEntries_ = function(group) {\n  var ret = goog.object.getValues(group.getChildEntries());\n  ret.sort(goog.tweak.TweakUi.entryCompare_);\n  return ret;\n};\n\n\n/**\n * @param {!goog.tweak.BaseEntry} entry The entry.\n * @return {string} Returns the namespace for the entry, or '' if it is not\n *     namespaced.\n * @private\n */\ngoog.tweak.TweakUi.extractNamespace_ = function(entry) {\n  var namespaceMatch = /.+(?=\\.)/.exec(entry.getId());\n  return namespaceMatch ? namespaceMatch[0] : '';\n};\n\n\n/**\n * @param {!goog.tweak.BaseEntry} entry The entry.\n * @return {string} Returns the part of the label after the last period, unless\n *     the label has been explicly set (it is different from the ID).\n * @private\n */\ngoog.tweak.TweakUi.getNamespacedLabel_ = function(entry) {\n  var label = entry.label;\n  if (label == entry.getId()) {\n    label = label.substr(label.lastIndexOf('.') + 1);\n  }\n  return label;\n};\n\n\n/**\n * @return {!Element} The root element. Must not be called before render().\n */\ngoog.tweak.TweakUi.prototype.getRootElement = function() {\n  goog.asserts.assert(\n      this.entriesPanel_, 'TweakUi.getRootElement called before render().');\n  return this.entriesPanel_.getRootElement();\n};\n\n\n/**\n * Reloads the page with query parameters set by the UI.\n * @private\n */\ngoog.tweak.TweakUi.prototype.restartWithAppliedTweaks_ = function() {\n  var queryString = this.registry_.makeUrlQuery();\n  var wnd = this.domHelper_.getWindow();\n  if (queryString != wnd.location.search) {\n    wnd.location.search = queryString;\n  } else {\n    wnd.location.reload();\n  }\n};\n\n\n/**\n * Installs the required CSS styles.\n * @private\n */\ngoog.tweak.TweakUi.prototype.installStyles_ = function() {\n  // Use an marker to install the styles only once per document.\n  // Styles are injected via JS instead of in a separate style sheet so that\n  // they are automatically excluded when tweaks are stripped out.\n  var doc = this.domHelper_.getDocument();\n  if (!(goog.tweak.TweakUi.STYLE_SHEET_INSTALLED_MARKER_ in doc)) {\n    goog.style.installSafeStyleSheet(goog.tweak.TweakUi.CSS_STYLES_, doc);\n    doc[goog.tweak.TweakUi.STYLE_SHEET_INSTALLED_MARKER_] = true;\n  }\n};\n\n\n/**\n * Creates the element to display when the UI is visible.\n * @return {!Element} The root element.\n */\ngoog.tweak.TweakUi.prototype.render = function() {\n  this.installStyles_();\n  var dh = this.domHelper_;\n  // The submit button\n  var submitButton = dh.createDom(\n      goog.dom.TagName.BUTTON, {style: 'font-weight:bold'}, 'Apply Tweaks');\n  submitButton.onclick = goog.bind(this.restartWithAppliedTweaks_, this);\n\n  var rootPanel = new goog.tweak.EntriesPanel([], dh);\n  var rootPanelDiv = rootPanel.render(submitButton);\n  rootPanelDiv.className += ' ' + goog.tweak.TweakUi.ROOT_PANEL_CLASS_;\n  this.entriesPanel_ = rootPanel;\n\n  var entries = this.registry_.extractEntries(\n      true /* excludeChildEntries */, false /* excludeNonSettings */);\n  for (var i = 0, entry; entry = entries[i]; i++) {\n    this.insertEntry_(entry);\n  }\n\n  return rootPanelDiv;\n};\n\n\n/**\n * Updates the UI with the given entry.\n * @param {!goog.tweak.BaseEntry} entry The newly registered entry.\n * @private\n */\ngoog.tweak.TweakUi.prototype.onNewRegisteredEntry_ = function(entry) {\n  if (this.entriesPanel_) {\n    this.insertEntry_(entry);\n  }\n};\n\n\n/**\n * Updates the UI with the given entry.\n * @param {!goog.tweak.BaseEntry} entry The newly registered entry.\n * @private\n */\ngoog.tweak.TweakUi.prototype.insertEntry_ = function(entry) {\n  var panel = this.entriesPanel_;\n  var namespace = goog.tweak.TweakUi.extractNamespace_(entry);\n\n  if (namespace) {\n    // Find the NamespaceEntry that the entry belongs to.\n    var namespaceEntryId = goog.tweak.NamespaceEntry_.ID_PREFIX + namespace;\n    var nsPanel = panel.childPanels[namespaceEntryId];\n    if (nsPanel) {\n      panel = nsPanel;\n    } else {\n      entry = new goog.tweak.NamespaceEntry_(namespace, [entry]);\n    }\n  }\n  if (entry instanceof goog.tweak.BooleanInGroupSetting) {\n    var group = entry.getGroup();\n    // BooleanGroup entries are always registered before their\n    // BooleanInGroupSettings.\n    panel = panel.childPanels[group.getId()];\n  }\n  goog.asserts.assert(panel, 'Missing panel for entry %s', entry.getId());\n  panel.insertEntry(entry);\n};\n\n\n\n/**\n * The body of the tweaks UI and also used for BooleanGroup.\n * @param {!Array<!goog.tweak.BaseEntry>} entries The entries to show in the\n *     panel.\n * @param {goog.dom.DomHelper=} opt_domHelper The DomHelper to render with.\n * @constructor\n * @final\n */\ngoog.tweak.EntriesPanel = function(entries, opt_domHelper) {\n  /**\n   * The entries to show in the panel.\n   * @type {!Array<!goog.tweak.BaseEntry>} entries\n   * @private\n   */\n  this.entries_ = entries;\n\n  var self = this;\n  /**\n   * The bound onclick handler for the help question marks.\n   * @this {Element}\n   * @private\n   */\n  this.boundHelpOnClickHandler_ = function() {\n    self.onHelpClick_(this.parentNode);\n  };\n\n  /**\n   * The element that contains the UI.\n   * @type {Element}\n   * @private\n   */\n  this.rootElem_;\n\n  /**\n   * The element that contains all of the settings and the endElement.\n   * @type {Element}\n   * @private\n   */\n  this.mainPanel_;\n\n  /**\n   * Flips between true/false each time the \"Toggle Descriptions\" link is\n   * clicked.\n   * @type {boolean}\n   * @private\n   */\n  this.showAllDescriptionsState_;\n\n  /**\n   * The DomHelper to render with.\n   * @type {!goog.dom.DomHelper}\n   * @private\n   */\n  this.domHelper_ = opt_domHelper || goog.dom.getDomHelper();\n\n  /**\n   * Map of tweak ID -> EntriesPanel for child panels (BooleanGroups).\n   * @type {!Object<!goog.tweak.EntriesPanel>}\n   */\n  this.childPanels = {};\n};\n\n\n/**\n * @return {!Element} Returns the expanded element. Must not be called before\n *     render().\n */\ngoog.tweak.EntriesPanel.prototype.getRootElement = function() {\n  goog.asserts.assert(\n      this.rootElem_, 'EntriesPanel.getRootElement called before render().');\n  return /** @type {!Element} */ (this.rootElem_);\n};\n\n\n/**\n * Creates and returns the expanded element.\n * The markup looks like:\n *\n *    <div>\n *      <a>Show Descriptions</a>\n *      <div>\n *         ...\n *         {endElement}\n *      </div>\n *    </div>\n *\n * @param {Element|DocumentFragment=} opt_endElement Element to insert after all\n *     tweak entries.\n * @return {!Element} The root element for the panel.\n */\ngoog.tweak.EntriesPanel.prototype.render = function(opt_endElement) {\n  var dh = this.domHelper_;\n  var entries = this.entries_;\n  var ret = dh.createDom(goog.dom.TagName.DIV);\n\n  var showAllDescriptionsLink = dh.createDom(\n      goog.dom.TagName.A, {\n        href: 'javascript:;',\n        onclick: goog.bind(this.toggleAllDescriptions, this)\n      },\n      'Toggle all Descriptions');\n  ret.appendChild(showAllDescriptionsLink);\n\n  // Add all of the entries.\n  var mainPanel = dh.createElement(goog.dom.TagName.DIV);\n  this.mainPanel_ = mainPanel;\n  for (var i = 0, entry; entry = entries[i]; i++) {\n    mainPanel.appendChild(this.createEntryElem_(entry));\n  }\n\n  if (opt_endElement) {\n    mainPanel.appendChild(opt_endElement);\n  }\n  ret.appendChild(mainPanel);\n  this.rootElem_ = ret;\n  return /** @type {!Element} */ (ret);\n};\n\n\n/**\n * Inserts the given entry into the panel.\n * @param {!goog.tweak.BaseEntry} entry The entry to insert.\n */\ngoog.tweak.EntriesPanel.prototype.insertEntry = function(entry) {\n  var insertIndex =\n      -goog.array.binarySearch(\n          this.entries_, entry, goog.tweak.TweakUi.entryCompare_) -\n      1;\n  goog.asserts.assert(\n      insertIndex >= 0, 'insertEntry failed for %s', entry.getId());\n  goog.array.insertAt(this.entries_, entry, insertIndex);\n  this.mainPanel_.insertBefore(\n      this.createEntryElem_(entry),\n      // IE doesn't like 'undefined' here.\n      this.mainPanel_.childNodes[insertIndex] || null);\n};\n\n\n/**\n * Creates and returns a form element for the given entry.\n * @param {!goog.tweak.BaseEntry} entry The entry.\n * @return {!Element} The root DOM element for the entry.\n * @private\n */\ngoog.tweak.EntriesPanel.prototype.createEntryElem_ = function(entry) {\n  var dh = this.domHelper_;\n  var isGroupEntry = goog.tweak.TweakUi.isGroupEntry_(entry);\n  var classes = isGroupEntry ? goog.tweak.TweakUi.ENTRY_GROUP_CSS_CLASSES_ :\n                               goog.tweak.TweakUi.ENTRY_CSS_CLASSES_;\n  // Containers should not use label tags or else all descendent inputs will be\n  // connected on desktop browsers.\n  var containerNodeName =\n      isGroupEntry ? goog.dom.TagName.SPAN : goog.dom.TagName.LABEL;\n  var ret = dh.createDom(\n      goog.dom.TagName.DIV, classes,\n      dh.createDom(\n          containerNodeName, {\n            // Make the hover text the description.\n            title: entry.description,\n            style: 'color:' + (entry.isRestartRequired() ? '' : 'blue')\n          },\n          this.createTweakEntryDom_(entry)),\n      // Add the expandable help question mark.\n      this.createHelpElem_(entry));\n  return ret;\n};\n\n\n/**\n * Click handler for the help link.\n * @param {Node} entryDiv The div that contains the tweak.\n * @private\n */\ngoog.tweak.EntriesPanel.prototype.onHelpClick_ = function(entryDiv) {\n  this.showDescription_(entryDiv, !entryDiv.style.display);\n};\n\n\n/**\n * Twiddle the DOM so that the entry within the given span is shown/hidden.\n * @param {Node} entryDiv The div that contains the tweak.\n * @param {boolean} show True to show, false to hide.\n * @private\n */\ngoog.tweak.EntriesPanel.prototype.showDescription_ = function(entryDiv, show) {\n  var descriptionElem = entryDiv.lastChild.lastChild;\n  goog.style.setElementShown(/** @type {Element} */ (descriptionElem), show);\n  entryDiv.style.display = show ? 'block' : '';\n};\n\n\n/**\n * Creates and returns a help element for the given entry.\n * @param {goog.tweak.BaseEntry} entry The entry.\n * @return {!Element} The root element of the created DOM.\n * @private\n */\ngoog.tweak.EntriesPanel.prototype.createHelpElem_ = function(entry) {\n  // The markup looks like:\n  // <span onclick=...><b>?</b><span>{description}</span></span>\n  var ret = this.domHelper_.createElement(goog.dom.TagName.SPAN);\n  goog.dom.safe.setInnerHtml(\n      ret,\n      goog.html.SafeHtml.concat(\n          goog.html.SafeHtml.create(\n              'b', {'style': goog.string.Const.from('padding:0 1em 0 .5em')},\n              '?'),\n          goog.html.SafeHtml.create(\n              'span',\n              {'style': goog.string.Const.from('display:none;color:#666')})));\n  ret.onclick = this.boundHelpOnClickHandler_;\n  // IE<9 doesn't support lastElementChild.\n  var descriptionElem = /** @type {!Element} */ (ret.lastChild);\n  if (entry.isRestartRequired()) {\n    goog.dom.setTextContent(descriptionElem, entry.description);\n  } else {\n    goog.dom.safe.setInnerHtml(\n        descriptionElem,\n        goog.html.SafeHtml.concat(\n            goog.html.SafeHtml.htmlEscape(entry.description),\n            goog.html.SafeHtml.create(\n                'span', {'style': goog.string.Const.from('color: blue')},\n                '(no restart required)')));\n  }\n  return ret;\n};\n\n\n/**\n * Show all entry descriptions (has the same effect as clicking on all ?'s).\n */\ngoog.tweak.EntriesPanel.prototype.toggleAllDescriptions = function() {\n  var show = !this.showAllDescriptionsState_;\n  this.showAllDescriptionsState_ = show;\n  var entryDivs = this.domHelper_.getElementsByTagNameAndClass(\n      goog.dom.TagName.DIV, goog.tweak.TweakUi.ENTRY_CSS_CLASS_,\n      this.rootElem_);\n  for (var i = 0, div; div = entryDivs[i]; i++) {\n    this.showDescription_(div, show);\n  }\n};\n\n\n/**\n * Creates the DOM element to control the given enum setting.\n * @param {!goog.tweak.StringSetting|!goog.tweak.NumericSetting} tweak The\n *     setting.\n * @param {string} label The label for the entry.\n * @param {!Function} onchangeFunc onchange event handler.\n * @return {!DocumentFragment} The DOM element.\n * @private\n */\ngoog.tweak.EntriesPanel.prototype.createComboBoxDom_ = function(\n    tweak, label, onchangeFunc) {\n  // The markup looks like:\n  // Label: <select><option></option></select>\n  var dh = this.domHelper_;\n  var ret = dh.getDocument().createDocumentFragment();\n  ret.appendChild(dh.createTextNode(label + ': '));\n  var selectElem = dh.createElement(goog.dom.TagName.SELECT);\n  var values = tweak.getValidValues();\n  for (var i = 0, il = values.length; i < il; ++i) {\n    var optionElem = dh.createElement(goog.dom.TagName.OPTION);\n    optionElem.text = String(values[i]);\n    // Setting the option tag's value is required for selectElem.value to work\n    // properly.\n    optionElem.value = String(values[i]);\n    selectElem.appendChild(optionElem);\n  }\n  ret.appendChild(selectElem);\n\n  // Set the value and add a callback.\n  selectElem.value = String(tweak.getNewValue());\n  selectElem.onchange = onchangeFunc;\n  tweak.addCallback(function() {\n    selectElem.value = String(tweak.getNewValue());\n  });\n  return ret;\n};\n\n\n/**\n * Creates the DOM element to control the given boolean setting.\n * @param {!goog.tweak.BooleanSetting} tweak The setting.\n * @param {string} label The label for the entry.\n * @return {!DocumentFragment} The DOM elements.\n * @private\n */\ngoog.tweak.EntriesPanel.prototype.createBooleanSettingDom_ = function(\n    tweak, label) {\n  var dh = this.domHelper_;\n  var ret = dh.getDocument().createDocumentFragment();\n  var checkbox = dh.createDom(goog.dom.TagName.INPUT, {type: 'checkbox'});\n  ret.appendChild(checkbox);\n  ret.appendChild(dh.createTextNode(label));\n\n  // Needed on IE6 to ensure the textbox doesn't get cleared\n  // when added to the DOM.\n  checkbox.defaultChecked = tweak.getNewValue();\n\n  checkbox.checked = tweak.getNewValue();\n  checkbox.onchange = function() { tweak.setValue(checkbox.checked); };\n  tweak.addCallback(function() { checkbox.checked = tweak.getNewValue(); });\n  return ret;\n};\n\n\n/**\n * Creates the DOM for a BooleanGroup or NamespaceEntry.\n * @param {!goog.tweak.BooleanGroup|!goog.tweak.NamespaceEntry_} entry The\n *     entry.\n * @param {string} label The label for the entry.\n * @param {!Array<goog.tweak.BaseEntry>} childEntries The child entries.\n * @return {!DocumentFragment} The DOM element.\n * @private\n */\ngoog.tweak.EntriesPanel.prototype.createSubPanelDom_ = function(\n    entry, label, childEntries) {\n  var dh = this.domHelper_;\n  var toggleLink =\n      dh.createDom(goog.dom.TagName.A, {href: 'javascript:;'}, label + ' \\xBB');\n  var toggleLink2 =\n      dh.createDom(goog.dom.TagName.A, {href: 'javascript:;'}, '\\xAB ' + label);\n  toggleLink2.style.marginRight = '10px';\n\n  var innerUi = new goog.tweak.EntriesPanel(childEntries, dh);\n  this.childPanels[entry.getId()] = innerUi;\n\n  var elem = innerUi.render();\n  // Move the toggle descriptions link into the legend.\n  var descriptionsLink = elem.firstChild;\n  var childrenElem = dh.createDom(\n      goog.dom.TagName.FIELDSET, goog.getCssName('goog-inline-block'),\n      dh.createDom(\n          goog.dom.TagName.LEGEND, null, toggleLink2, descriptionsLink),\n      elem);\n\n  new goog.ui.Zippy(\n      toggleLink, childrenElem, false /* expanded */, toggleLink2);\n\n  var ret = dh.getDocument().createDocumentFragment();\n  ret.appendChild(toggleLink);\n  ret.appendChild(childrenElem);\n  return ret;\n};\n\n\n/**\n * Creates the DOM element to control the given string setting.\n * @param {!goog.tweak.StringSetting|!goog.tweak.NumericSetting} tweak The\n *     setting.\n * @param {string} label The label for the entry.\n * @param {!Function} onchangeFunc onchange event handler.\n * @return {!DocumentFragment} The DOM element.\n * @private\n */\ngoog.tweak.EntriesPanel.prototype.createTextBoxDom_ = function(\n    tweak, label, onchangeFunc) {\n  var dh = this.domHelper_;\n  var ret = dh.getDocument().createDocumentFragment();\n  ret.appendChild(dh.createTextNode(label + ': '));\n  var textBox = dh.createDom(goog.dom.TagName.INPUT, {\n    value: String(tweak.getNewValue()),\n    // TODO(agrieve): Make size configurable or autogrow.\n    size: 5,\n    onblur: onchangeFunc\n  });\n  ret.appendChild(textBox);\n  tweak.addCallback(function() {\n    textBox.value = String(tweak.getNewValue());\n  });\n  return ret;\n};\n\n\n/**\n * Creates the DOM element to control the given button action.\n * @param {!goog.tweak.ButtonAction} tweak The action.\n * @param {string} label The label for the entry.\n * @return {!Element} The DOM element.\n * @private\n */\ngoog.tweak.EntriesPanel.prototype.createButtonActionDom_ = function(\n    tweak, label) {\n  return this.domHelper_.createDom(\n      goog.dom.TagName.BUTTON, {onclick: goog.bind(tweak.fireCallbacks, tweak)},\n      label);\n};\n\n\n/**\n * Creates the DOM element to control the given entry.\n * @param {!goog.tweak.BaseEntry} entry The entry.\n * @return {!Element|!DocumentFragment} The DOM element.\n * @private\n */\ngoog.tweak.EntriesPanel.prototype.createTweakEntryDom_ = function(entry) {\n  var label = goog.tweak.TweakUi.getNamespacedLabel_(entry);\n  if (entry instanceof goog.tweak.BooleanSetting) {\n    return this.createBooleanSettingDom_(entry, label);\n  } else if (entry instanceof goog.tweak.BooleanGroup) {\n    var childEntries = goog.tweak.TweakUi.extractBooleanGroupEntries_(entry);\n    return this.createSubPanelDom_(entry, label, childEntries);\n  } else if (entry instanceof goog.tweak.StringSetting) {\n    /** @this {Element} */\n    var setValueFunc = function() { entry.setValue(this.value); };\n    return entry.getValidValues() ?\n        this.createComboBoxDom_(entry, label, setValueFunc) :\n        this.createTextBoxDom_(entry, label, setValueFunc);\n  } else if (entry instanceof goog.tweak.NumericSetting) {\n    /** @this {Element} */\n    setValueFunc = function() {\n      // Reset the value if it's not a number.\n      if (isNaN(this.value)) {\n        this.value = entry.getNewValue();\n      } else {\n        entry.setValue(+this.value);\n      }\n    };\n    return entry.getValidValues() ?\n        this.createComboBoxDom_(entry, label, setValueFunc) :\n        this.createTextBoxDom_(entry, label, setValueFunc);\n  } else if (entry instanceof goog.tweak.NamespaceEntry_) {\n    return this.createSubPanelDom_(entry, entry.label, entry.entries);\n  }\n  goog.asserts.assertInstanceof(\n      entry, goog.tweak.ButtonAction, 'invalid entry: %s', entry);\n  return this.createButtonActionDom_(\n      /** @type {!goog.tweak.ButtonAction} */ (entry), label);\n};\n\n\n\n/**\n * Entries used to represent the collapsible namespace links. These entries are\n * never registered with the TweakRegistry, but are contained within the\n * collection of entries within TweakPanels.\n * @param {string} namespace The namespace for the entry.\n * @param {!Array<!goog.tweak.BaseEntry>} entries Entries within the namespace.\n * @constructor\n * @extends {goog.tweak.BaseEntry}\n * @private\n */\ngoog.tweak.NamespaceEntry_ = function(namespace, entries) {\n  goog.tweak.BaseEntry.call(\n      this, goog.tweak.NamespaceEntry_.ID_PREFIX + namespace,\n      'Tweaks within the ' + namespace + ' namespace.');\n\n  /**\n   * Entries within this namespace.\n   * @type {!Array<!goog.tweak.BaseEntry>}\n   */\n  this.entries = entries;\n\n  this.label = namespace;\n};\ngoog.inherits(goog.tweak.NamespaceEntry_, goog.tweak.BaseEntry);\n\n\n/**\n * Prefix for the IDs of namespace entries used to ensure that they do not\n * conflict with regular entries.\n * @type {string}\n */\ngoog.tweak.NamespaceEntry_.ID_PREFIX = '!';\n","^;",1579837703000,"^<",["^=",["^1L","~$goog.tweak","^1>","~$goog.tweak.StringSetting","^?","~$goog.tweak.NumericSetting","^42","^[","^3Q","~$goog.tweak.BooleanInGroupSetting","~$goog.tweak.BooleanSetting","^1E","~$goog.tweak.BooleanGroup","~$goog.ui.Zippy","~$goog.tweak.BaseEntry","^1F","^4F","~$goog.tweak.ButtonAction","^2O","^1I","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/tweak/tweakui.js"],"^O",["^=",["~$goog.tweak.TweakUi","~$goog.tweak.EntriesPanel"]],"^W",true,"^X",["^?","^2O","^1L","^1>","^12","^1E","^1I","^4F","^42","^3Q","^1F","^7C","^7J","^7H","^7F","^7G","^7K","^7E","^7D","^7I","^["]],["^ ","^3",[1579837703000],"^4","goog.net.jsloader.js","^5",["^6","goog/net/jsloader.js"],"^7","goog/net/jsloader.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A utility to load JavaScript files via DOM script tags.\n * Refactored from goog.net.Jsonp. Works cross-domain.\n *\n */\n\ngoog.provide('goog.net.jsloader');\ngoog.provide('goog.net.jsloader.Error');\ngoog.provide('goog.net.jsloader.ErrorCode');\ngoog.provide('goog.net.jsloader.Options');\n\ngoog.require('goog.array');\ngoog.require('goog.async.Deferred');\ngoog.require('goog.debug.Error');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.object');\n\n\n/**\n * The name of the property of goog.global under which the JavaScript\n * verification object is stored by the loaded script.\n * @private {string}\n */\ngoog.net.jsloader.GLOBAL_VERIFY_OBJS_ = 'closure_verification';\n\n\n/**\n * The default length of time, in milliseconds, we are prepared to wait for a\n * load request to complete.\n * @type {number}\n */\ngoog.net.jsloader.DEFAULT_TIMEOUT = 5000;\n\n\n/**\n * Optional parameters for goog.net.jsloader.send.\n * timeout: The length of time, in milliseconds, we are prepared to wait\n *     for a load request to complete, or 0 or negative for no timeout. Default\n *     is 5 seconds.\n * document: The HTML document under which to load the JavaScript. Default is\n *     the current document.\n * cleanupWhenDone: If true clean up the script tag after script completes to\n *     load. This is important if you just want to read data from the JavaScript\n *     and then throw it away. Default is false.\n * attributes: Additional attributes to set on the script tag.\n *\n * @typedef {{\n *   timeout: (number|undefined),\n *   document: (HTMLDocument|undefined),\n *   cleanupWhenDone: (boolean|undefined),\n *   attributes: (!Object<string, string>|undefined)\n * }}\n */\ngoog.net.jsloader.Options;\n\n\n/**\n * Scripts (URIs) waiting to be loaded.\n * @private {!Array<!goog.html.TrustedResourceUrl>}\n */\ngoog.net.jsloader.scriptsToLoad_ = [];\n\n\n/**\n * The deferred result of loading the URIs in scriptsToLoad_.\n * We need to return this to a caller that wants to load URIs while\n * a deferred is already working on them.\n * @private {!goog.async.Deferred<null>}\n */\ngoog.net.jsloader.scriptLoadingDeferred_;\n\n\n\n/**\n * Loads and evaluates the JavaScript files at the specified URIs, guaranteeing\n * the order of script loads.\n *\n * Because we have to load the scripts in serial (load script 1, exec script 1,\n * load script 2, exec script 2, and so on), this will be slower than doing\n * the network fetches in parallel.\n *\n * If you need to load a large number of scripts but dependency order doesn't\n * matter, you should just call goog.net.jsloader.safeLoad N times.\n *\n * If you need to load a large number of scripts on the same domain,\n * you may want to use goog.module.ModuleLoader.\n *\n * @param {Array<!goog.html.TrustedResourceUrl>} trustedUris The URIs to load.\n * @param {goog.net.jsloader.Options=} opt_options Optional parameters. See\n *     goog.net.jsloader.options documentation for details.\n * @return {!goog.async.Deferred} The deferred result, that may be used to add\n *     callbacks\n */\ngoog.net.jsloader.safeLoadMany = function(trustedUris, opt_options) {\n  // Loading the scripts in serial introduces asynchronosity into the flow.\n  // Therefore, there are race conditions where client A can kick off the load\n  // sequence for client B, even though client A's scripts haven't all been\n  // loaded yet.\n  //\n  // To work around this issue, all module loads share a queue.\n  if (!trustedUris.length) {\n    return goog.async.Deferred.succeed(null);\n  }\n\n  var isAnotherModuleLoading = goog.net.jsloader.scriptsToLoad_.length;\n  goog.array.extend(goog.net.jsloader.scriptsToLoad_, trustedUris);\n  if (isAnotherModuleLoading) {\n    // jsloader is still loading some other scripts.\n    // In order to prevent the race condition noted above, we just add\n    // these URIs to the end of the scripts' queue and return the deferred\n    // result of the ongoing script load, so the caller knows when they\n    // finish loading.\n    return goog.net.jsloader.scriptLoadingDeferred_;\n  }\n\n  trustedUris = goog.net.jsloader.scriptsToLoad_;\n  var popAndLoadNextScript = function() {\n    var trustedUri = trustedUris.shift();\n    var deferred = goog.net.jsloader.safeLoad(trustedUri, opt_options);\n    if (trustedUris.length) {\n      deferred.addBoth(popAndLoadNextScript);\n    }\n    return deferred;\n  };\n  goog.net.jsloader.scriptLoadingDeferred_ = popAndLoadNextScript();\n  return goog.net.jsloader.scriptLoadingDeferred_;\n};\n\n\n/**\n * Loads and evaluates a JavaScript file.\n * When the script loads, a user callback is called.\n * It is the client's responsibility to verify that the script ran successfully.\n *\n * @param {!goog.html.TrustedResourceUrl} trustedUri The URI of the JavaScript.\n * @param {goog.net.jsloader.Options=} opt_options Optional parameters. See\n *     goog.net.jsloader.Options documentation for details.\n * @return {!goog.async.Deferred} The deferred result, that may be used to add\n *     callbacks and/or cancel the transmission.\n *     The error callback will be called with a single goog.net.jsloader.Error\n *     parameter.\n */\ngoog.net.jsloader.safeLoad = function(trustedUri, opt_options) {\n  var options = opt_options || {};\n  var doc = options.document || document;\n  var uri = goog.html.TrustedResourceUrl.unwrap(trustedUri);\n\n  var script = goog.dom.createElement(goog.dom.TagName.SCRIPT);\n  var request = {script_: script, timeout_: undefined};\n  var deferred = new goog.async.Deferred(goog.net.jsloader.cancel_, request);\n\n  // Set a timeout.\n  var timeout = null;\n  var timeoutDuration = (options.timeout != null) ?\n      options.timeout :\n      goog.net.jsloader.DEFAULT_TIMEOUT;\n  if (timeoutDuration > 0) {\n    timeout = window.setTimeout(function() {\n      goog.net.jsloader.cleanup_(script, true);\n      deferred.errback(\n          new goog.net.jsloader.Error(\n              goog.net.jsloader.ErrorCode.TIMEOUT,\n              'Timeout reached for loading script ' + uri));\n    }, timeoutDuration);\n    request.timeout_ = timeout;\n  }\n\n  // Hang the user callback to be called when the script completes to load.\n  // NOTE(user): This callback will be called in IE even upon error. In any\n  // case it is the client's responsibility to verify that the script ran\n  // successfully.\n  script.onload = script.onreadystatechange = function() {\n    if (!script.readyState || script.readyState == 'loaded' ||\n        script.readyState == 'complete') {\n      var removeScriptNode = options.cleanupWhenDone || false;\n      goog.net.jsloader.cleanup_(script, removeScriptNode, timeout);\n      deferred.callback(null);\n    }\n  };\n\n  // Add an error callback.\n  // NOTE(user): Not supported in IE.\n  script.onerror = function() {\n    goog.net.jsloader.cleanup_(script, true, timeout);\n    deferred.errback(\n        new goog.net.jsloader.Error(\n            goog.net.jsloader.ErrorCode.LOAD_ERROR,\n            'Error while loading script ' + uri));\n  };\n\n  var properties = options.attributes || {};\n  goog.object.extend(\n      properties, {'type': 'text/javascript', 'charset': 'UTF-8'});\n  goog.dom.setProperties(script, properties);\n  // NOTE(user): Safari never loads the script if we don't set the src\n  // attribute before appending.\n  goog.dom.safe.setScriptSrc(script, trustedUri);\n  var scriptParent = goog.net.jsloader.getScriptParentElement_(doc);\n  scriptParent.appendChild(script);\n\n  return deferred;\n};\n\n\n/**\n * Loads a JavaScript file and verifies it was evaluated successfully, using a\n * verification object.\n * The verification object is set by the loaded JavaScript at the end of the\n * script.\n * We verify this object was set and return its value in the success callback.\n * If the object is not defined we trigger an error callback.\n *\n * @param {!goog.html.TrustedResourceUrl} trustedUri The URI of the JavaScript.\n * @param {string} verificationObjName The name of the verification object that\n *     the loaded script should set.\n * @param {goog.net.jsloader.Options} options Optional parameters. See\n *     goog.net.jsloader.Options documentation for details.\n * @return {!goog.async.Deferred} The deferred result, that may be used to add\n *     callbacks and/or cancel the transmission.\n *     The success callback will be called with a single parameter containing\n *     the value of the verification object.\n *     The error callback will be called with a single goog.net.jsloader.Error\n *     parameter.\n */\ngoog.net.jsloader.safeLoadAndVerify = function(\n    trustedUri, verificationObjName, options) {\n  // Define the global objects variable.\n  if (!goog.global[goog.net.jsloader.GLOBAL_VERIFY_OBJS_]) {\n    goog.global[goog.net.jsloader.GLOBAL_VERIFY_OBJS_] = {};\n  }\n  var verifyObjs = goog.global[goog.net.jsloader.GLOBAL_VERIFY_OBJS_];\n  var uri = goog.html.TrustedResourceUrl.unwrap(trustedUri);\n\n  // Verify that the expected object does not exist yet.\n  if (verifyObjs[verificationObjName] !== undefined) {\n    // TODO(user): Error or reset variable?\n    return goog.async.Deferred.fail(\n        new goog.net.jsloader.Error(\n            goog.net.jsloader.ErrorCode.VERIFY_OBJECT_ALREADY_EXISTS,\n            'Verification object ' + verificationObjName +\n                ' already defined.'));\n  }\n\n  // Send request to load the JavaScript.\n  var sendDeferred = goog.net.jsloader.safeLoad(trustedUri, options);\n\n  // Create a deferred object wrapping the send result.\n  var deferred =\n      new goog.async.Deferred(goog.bind(sendDeferred.cancel, sendDeferred));\n\n  // Call user back with object that was set by the script.\n  sendDeferred.addCallback(function() {\n    var result = verifyObjs[verificationObjName];\n    if (result !== undefined) {\n      deferred.callback(result);\n      delete verifyObjs[verificationObjName];\n    } else {\n      // Error: script was not loaded properly.\n      deferred.errback(\n          new goog.net.jsloader.Error(\n              goog.net.jsloader.ErrorCode.VERIFY_ERROR, 'Script ' + uri +\n                  ' loaded, but verification object ' + verificationObjName +\n                  ' was not defined.'));\n    }\n  });\n\n  // Pass error to new deferred object.\n  sendDeferred.addErrback(function(error) {\n    if (verifyObjs[verificationObjName] !== undefined) {\n      delete verifyObjs[verificationObjName];\n    }\n    deferred.errback(error);\n  });\n\n  return deferred;\n};\n\n\n/**\n * Gets the DOM element under which we should add new script elements.\n * How? Take the first head element, and if not found take doc.documentElement,\n * which always exists.\n *\n * @param {!HTMLDocument} doc The relevant document.\n * @return {!Element} The script parent element.\n * @private\n */\ngoog.net.jsloader.getScriptParentElement_ = function(doc) {\n  var headElements = goog.dom.getElementsByTagName(goog.dom.TagName.HEAD, doc);\n  if (!headElements || goog.array.isEmpty(headElements)) {\n    return doc.documentElement;\n  } else {\n    return headElements[0];\n  }\n};\n\n\n/**\n * Cancels a given request.\n * @this {{script_: Element, timeout_: number}} The request context.\n * @private\n */\ngoog.net.jsloader.cancel_ = function() {\n  var request = this;\n  if (request && request.script_) {\n    var scriptNode = request.script_;\n    if (scriptNode && scriptNode.tagName == goog.dom.TagName.SCRIPT) {\n      goog.net.jsloader.cleanup_(scriptNode, true, request.timeout_);\n    }\n  }\n};\n\n\n/**\n * Removes the script node and the timeout.\n * @param {Node} scriptNode The node to be cleaned up.\n * @param {boolean} removeScriptNode If true completely remove the script node.\n * @param {?number=} opt_timeout The timeout handler to cleanup.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.net.jsloader.cleanup_ = function(\n    scriptNode, removeScriptNode, opt_timeout) {\n  if (opt_timeout != null) {\n    goog.global.clearTimeout(opt_timeout);\n  }\n\n  scriptNode.onload = goog.nullFunction;\n  scriptNode.onerror = goog.nullFunction;\n  scriptNode.onreadystatechange = goog.nullFunction;\n\n  // Do this after a delay (removing the script node of a running script can\n  // confuse older IEs).\n  if (removeScriptNode) {\n    window.setTimeout(function() { goog.dom.removeNode(scriptNode); }, 0);\n  }\n};\n\n\n/**\n * Possible error codes for jsloader.\n * @enum {number}\n */\ngoog.net.jsloader.ErrorCode = {\n  LOAD_ERROR: 0,\n  TIMEOUT: 1,\n  VERIFY_ERROR: 2,\n  VERIFY_OBJECT_ALREADY_EXISTS: 3\n};\n\n\n\n/**\n * A jsloader error.\n *\n * @param {goog.net.jsloader.ErrorCode} code The error code.\n * @param {string=} opt_message Additional message.\n * @constructor\n * @extends {goog.debug.Error}\n * @final\n */\ngoog.net.jsloader.Error = function(code, opt_message) {\n  var msg = 'Jsloader error (code #' + code + ')';\n  if (opt_message) {\n    msg += ': ' + opt_message;\n  }\n  goog.net.jsloader.Error.base(this, 'constructor', msg);\n\n  /**\n   * The code for this error.\n   *\n   * @type {goog.net.jsloader.ErrorCode}\n   */\n  this.code = code;\n};\ngoog.inherits(goog.net.jsloader.Error, goog.debug.Error);\n","^;",1579837703000,"^<",["^=",["^1>","^4C","^?","^42","~$goog.debug.Error","^1E","^5<","^2O","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/jsloader.js"],"^O",["^=",["~$goog.net.jsloader","~$goog.net.jsloader.Error","~$goog.net.jsloader.Options","~$goog.net.jsloader.ErrorCode"]],"^W",true,"^X",["^?","^2O","^5<","^7N","^1>","^12","^1E","^4C","^42"]],["^ ","^3",[1579837703000],"^4","goog.testing.testcase.js","^5",["^6","goog/testing/testcase.js"],"^7","goog/testing/testcase.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A class representing a set of test functions to be run.\n *\n * Testing code should not have dependencies outside of goog.testing so as to\n * reduce the chance of masking missing dependencies.\n *\n * This file does not compile correctly with --collapse_properties. Use\n * --property_renaming=ALL_UNQUOTED instead.\n *\n */\n\ngoog.setTestOnly('goog.testing.TestCase');\ngoog.provide('goog.testing.TestCase');\ngoog.provide('goog.testing.TestCase.Error');\ngoog.provide('goog.testing.TestCase.Order');\ngoog.provide('goog.testing.TestCase.Result');\ngoog.provide('goog.testing.TestCase.Test');\n\n\ngoog.require('goog.Promise');\ngoog.require('goog.Thenable');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.object');\ngoog.require('goog.testing.JsUnitException');\ngoog.require('goog.testing.asserts');\n\n\n\n/**\n * A class representing a JsUnit test case. A TestCase is made up of a number\n * of test functions which can be run. Individual test cases can override the\n * following functions to set up their test environment:\n *   - runTests - completely override the test's runner\n *   - setUpPage - called before any of the test functions are run\n *   - tearDownPage - called after all tests are finished\n *   - setUp - called before each of the test functions\n *   - tearDown - called after each of the test functions\n *   - shouldRunTests - called before a test run, all tests are skipped if it\n *                      returns false. Can be used to disable tests on browsers\n *                      where they aren't expected to pass.\n * <p>\n * TestCase objects are usually constructed by inspecting the global environment\n * to discover functions that begin with the prefix <code>test</code>.\n * (See {@link #autoDiscoverLifecycle} and {@link #autoDiscoverTests}.)\n * </p>\n *\n * <h2>Testing asychronous code with promises</h2>\n *\n * <p>\n * In the simplest cases, the behavior that the developer wants to test\n * is synchronous, and the test functions exercising the behavior execute\n * synchronously. But TestCase can also be used to exercise asynchronous code\n * through the use of <a\n * href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\">\n * promises</a>. If a test function returns an object that has a\n * <code>then</code> method defined on it, the test framework switches to an\n * asynchronous execution strategy: the next test function will not begin\n * execution until the returned promise is resolved or rejected. Instead of\n * writing test assertions at the top level inside a test function, the test\n * author chains them on the end of the returned promise. For example:\n * </p>\n * <pre>\n *   function testPromiseBasedAPI() {\n *     return promiseBasedAPI().then(function(value) {\n *       // Will run when the promise resolves, and before the next\n *       // test function begins execution.\n *       assertEquals('foo', value.bar);\n *     });\n *   }\n * </pre>\n * <p>\n * Synchronous and asynchronous tests can be mixed in the same TestCase.\n * Test functions that return an object with a <code>then</code> method are\n * executed asynchronously, and all other test functions are executed\n * synchronously. While this is convenient for test authors (since it doesn't\n * require any explicit configuration for asynchronous tests), it can lead to\n * confusion if the test author forgets to return the promise from the test\n * function. For example:\n * </p>\n * <pre>\n *   function testPromiseBasedAPI() {\n *     // This test should never succeed.\n *     promiseBasedAPI().then(fail, fail);\n *     // Oops! The promise isn't returned to the framework,\n *     // so this test actually does succeed.\n *   }\n * </pre>\n * <p>\n * Since the test framework knows nothing about the promise created\n * in the test function, it will run the function synchronously, record\n * a success, and proceed immediately to the next test function.\n * </p>\n * <p>\n * Promises returned from test functions can time out. If a returned promise\n * is not resolved or rejected within {@link promiseTimeout} milliseconds,\n * the test framework rejects the promise without a timeout error message.\n * Test cases can configure the value of `promiseTimeout` by setting\n * <pre>\n *   goog.testing.TestCase.getActiveTestCase().promiseTimeout = ...\n * </pre>\n * in their `setUpPage` methods.\n * </p>\n *\n * @param {string=} opt_name The name of the test case, defaults to\n *     'Untitled Test Case'.\n * @constructor\n */\ngoog.testing.TestCase = function(opt_name) {\n  /**\n   * A name for the test case.\n   * @type {string}\n   * @private\n   */\n  this.name_ = opt_name || 'Untitled Test Case';\n\n  /**\n   * If the test should be auto discovered via {@link #autoDiscoverTests} when\n   * test case is initialized.\n   * @type {boolean}\n   * @private\n   */\n  this.shouldAutoDiscoverTests_ = true;\n\n  /**\n   * Array of test functions that can be executed.\n   * @type {!Array<!goog.testing.TestCase.Test>}\n   * @private\n   */\n  this.tests_ = [];\n\n  /**\n   * Set of test names and/or indices to execute, or null if all tests should\n   * be executed.\n   *\n   * Indices are included to allow automation tools to run a subset of the\n   * tests without knowing the exact contents of the test file.\n   *\n   * Indices should only be used with SORTED ordering.\n   *\n   * Example valid values:\n   * <ul>\n   * <li>[testName]\n   * <li>[testName1, testName2]\n   * <li>[2] - will run the 3rd test in the order specified\n   * <li>[1,3,5]\n   * <li>[testName1, testName2, 3, 5] - will work\n   * <ul>\n   * @type {?Object}\n   * @private\n   */\n  this.testsToRun_ = null;\n\n  /**\n   * A call back for each test.\n   * @private {?function(?goog.testing.TestCase.Test, !Array<string>)}\n   */\n  this.testDone_ = null;\n\n  /**\n   * The order to run the auto-discovered tests in.\n   * @type {string}\n   */\n  this.order = goog.testing.TestCase.Order.SORTED;\n\n  /** @private {function(!goog.testing.TestCase.Result)} */\n  this.runNextTestCallback_ = goog.nullFunction;\n\n  /**\n   * The currently executing test case or null.\n   * @private {?goog.testing.TestCase.Test}\n   */\n  this.curTest_ = null;\n\n  /**\n   * Object used to encapsulate the test results.\n   * @type {!goog.testing.TestCase.Result}\n   * @protected\n   * @suppress {underscore|visibility}\n   */\n  this.result_ = new goog.testing.TestCase.Result(this);\n\n  /**\n   * An array of exceptions generated by `assert` statements.\n   * @private {!Array<!goog.testing.JsUnitException>}\n   */\n  this.thrownAssertionExceptions_ = [];\n\n  /**\n   * The maximum time in milliseconds a promise returned from a test function\n   * may remain pending before the test fails due to timeout.\n   * @type {number}\n   */\n  this.promiseTimeout = 1000;  // 1s\n\n  /**\n   * Callbacks that will be executed when the test has finalized.\n   * @private {!Array<function()>}\n   */\n  this.onCompletedCallbacks_ = [];\n\n  /** @type {number|undefined} */\n  this.endTime_;\n\n  /** @private {number} */\n  this.testsRanSoFar_ = 0;\n};\n\n\n/**\n * The order to run the auto-discovered tests.\n * @enum {string}\n */\ngoog.testing.TestCase.Order = {\n  /**\n   * This is browser dependent and known to be different in FF and Safari\n   * compared to others.\n   */\n  NATURAL: 'natural',\n\n  /** Random order. */\n  RANDOM: 'random',\n\n  /** Sorted based on the name. */\n  SORTED: 'sorted'\n};\n\n\n/**\n * @return {string} The name of the test.\n */\ngoog.testing.TestCase.prototype.getName = function() {\n  return this.name_;\n};\n\n/**\n * Returns the current test or null.\n * @return {?goog.testing.TestCase.Test}\n * @protected\n */\ngoog.testing.TestCase.prototype.getCurrentTest = function() {\n  return this.curTest_;\n};\n\n/**\n * The maximum amount of time in milliseconds that the test case can take\n * before it is forced to yield and reschedule. This prevents the test runner\n * from blocking the browser and potentially hurting the test harness.\n * @type {number}\n */\ngoog.testing.TestCase.maxRunTime = 200;\n\n\n/**\n * Save a reference to `window.setTimeout`, so any code that overrides the\n * default behavior (the MockClock, for example) doesn't affect our runner.\n * @type {function((Function|string), number=, *=): number}\n * @private\n */\ngoog.testing.TestCase.protectedSetTimeout_ = goog.global.setTimeout;\n\n\n/**\n * Save a reference to `window.clearTimeout`, so any code that overrides\n * the default behavior (e.g. MockClock) doesn't affect our runner.\n * @type {function((null|number|undefined)): void}\n * @private\n */\ngoog.testing.TestCase.protectedClearTimeout_ = goog.global.clearTimeout;\n\n\n/**\n * Save a reference to `window.Date`, so any code that overrides\n * the default behavior doesn't affect our runner.\n * @type {function(new: Date)}\n * @private\n */\ngoog.testing.TestCase.protectedDate_ = Date;\n\n/**\n * Save a reference to `window.performance`, so any code that overrides\n * the default behavior doesn't affect our runner.\n * @type {?Performance}\n * @private\n */\ngoog.testing.TestCase.protectedPerformance_ = typeof window !== 'undefined' &&\n        window.performance && window.performance.now ?\n    performance :\n    null;\n\n\n/**\n * Name of the current test that is running, or null if none is running.\n * @type {?string}\n */\ngoog.testing.TestCase.currentTestName = null;\n\n\n/**\n * Avoid a dependency on goog.userAgent and keep our own reference of whether\n * the browser is IE.\n * @type {boolean}\n */\ngoog.testing.TestCase.IS_IE = typeof opera == 'undefined' &&\n    !!goog.global.navigator &&\n    goog.global.navigator.userAgent.indexOf('MSIE') != -1;\n\n\n/**\n * Exception object that was detected before a test runs.\n * @type {*}\n * @protected\n */\ngoog.testing.TestCase.prototype.exceptionBeforeTest;\n\n\n/**\n * Whether the test case has ever tried to execute.\n * @type {boolean}\n */\ngoog.testing.TestCase.prototype.started = false;\n\n\n/**\n * Whether the test case is running.\n * @type {boolean}\n */\ngoog.testing.TestCase.prototype.running = false;\n\n\n/**\n * Timestamp for when the test was started.\n * @type {number}\n * @private\n */\ngoog.testing.TestCase.prototype.startTime_ = 0;\n\n\n/**\n * Time since the last batch of tests was started, if batchTime exceeds\n * {@link #maxRunTime} a timeout will be used to stop the tests blocking the\n * browser and a new batch will be started.\n * @type {number}\n * @private\n */\ngoog.testing.TestCase.prototype.batchTime_ = 0;\n\n\n/**\n * Pointer to the current test.\n * @type {number}\n * @private\n */\ngoog.testing.TestCase.prototype.currentTestPointer_ = 0;\n\n\n/**\n * Adds a new test to the test case.\n * @param {!goog.testing.TestCase.Test} test The test to add.\n */\ngoog.testing.TestCase.prototype.add = function(test) {\n  goog.asserts.assert(test);\n  if (this.started) {\n    throw new Error(\n        'Tests cannot be added after execute() has been called. ' +\n        'Test: ' + test.name);\n  }\n\n  this.tests_.push(test);\n};\n\n\n/**\n * Creates and adds a new test.\n *\n * Convenience function to make syntax less awkward when not using automatic\n * test discovery.\n *\n * @param {string} name The test name.\n * @param {function()} ref Reference to the test function.\n * @param {!Object=} scope Optional scope that the test function should be\n *     called in.\n * @param {!Array<!Object>=} objChain An array of Objects that may have\n *     additional set up/tear down logic for a particular test.\n */\ngoog.testing.TestCase.prototype.addNewTest = function(\n    name, ref, scope, objChain) {\n  this.add(this.createTest(name, ref, scope || this, objChain));\n};\n\n\n/**\n * Sets the tests.\n * @param {!Array<goog.testing.TestCase.Test>} tests A new test array.\n * @protected\n */\ngoog.testing.TestCase.prototype.setTests = function(tests) {\n  this.tests_ = tests;\n};\n\n\n/**\n * Gets the tests.\n * @return {!Array<goog.testing.TestCase.Test>} The test array.\n */\ngoog.testing.TestCase.prototype.getTests = function() {\n  return this.tests_;\n};\n\n\n/**\n * Returns the number of tests contained in the test case.\n * @return {number} The number of tests.\n */\ngoog.testing.TestCase.prototype.getCount = function() {\n  return this.tests_.length;\n};\n\n\n/**\n * Returns the number of tests actually run in the test case, i.e. subtracting\n * any which are skipped.\n * @return {number} The number of un-ignored tests.\n */\ngoog.testing.TestCase.prototype.getActuallyRunCount = function() {\n  return this.testsToRun_ ? goog.object.getCount(this.testsToRun_) : 0;\n};\n\n\n/**\n * Returns the current test and increments the pointer.\n * @return {goog.testing.TestCase.Test} The current test case.\n */\ngoog.testing.TestCase.prototype.next = function() {\n  var test;\n  while ((test = this.tests_[this.currentTestPointer_++])) {\n    if (!this.testsToRun_ || this.testsToRun_[test.name] ||\n        this.testsToRun_[this.currentTestPointer_ - 1]) {\n      return test;\n    }\n  }\n  return null;\n};\n\n\n/**\n * Resets the test case pointer, so that next returns the first test.\n */\ngoog.testing.TestCase.prototype.reset = function() {\n  this.currentTestPointer_ = 0;\n  this.result_ = new goog.testing.TestCase.Result(this);\n};\n\n\n/**\n * Adds a callback function that should be executed when the tests have\n * completed.\n * @param {function()} fn The callback function.\n */\ngoog.testing.TestCase.prototype.addCompletedCallback = function(fn) {\n  this.onCompletedCallbacks_.push(fn);\n};\n\n\n/**\n * @param {goog.testing.TestCase.Order} order The sort order for running tests.\n */\ngoog.testing.TestCase.prototype.setOrder = function(order) {\n  this.order = order;\n};\n\n\n/**\n * @param {Object<string, boolean>} testsToRun Set of tests to run. Entries in\n *     the set may be test names, like \"testFoo\", or numeric indices. Only\n *     tests identified by name or by index will be executed.\n */\ngoog.testing.TestCase.prototype.setTestsToRun = function(testsToRun) {\n  this.testsToRun_ = testsToRun;\n};\n\n\n/**\n * Can be overridden in test classes to indicate whether the tests in a case\n * should be run in that particular situation.  For example, this could be used\n * to stop tests running in a particular browser, where browser support for\n * the class under test was absent.\n * @return {boolean} Whether any of the tests in the case should be run.\n */\ngoog.testing.TestCase.prototype.shouldRunTests = function() {\n  return true;\n};\n\n\n/**\n * Executes the tests, yielding asynchronously if execution time exceeds\n * {@link maxRunTime}. There is no guarantee that the test case has finished\n * once this method has returned. To be notified when the test case\n * has finished, use {@link #addCompletedCallback} or\n * {@link #runTestsReturningPromise}.\n */\ngoog.testing.TestCase.prototype.execute = function() {\n  if (!this.prepareForRun_()) {\n    return;\n  }\n  this.groupLogsStart();\n  this.log('Starting tests: ' + this.name_);\n  this.cycleTests();\n};\n\n\n/**\n * Sets up the internal state of the test case for a run.\n * @return {boolean} If false, preparation failed because the test case\n *     is not supposed to run in the present environment.\n * @private\n */\ngoog.testing.TestCase.prototype.prepareForRun_ = function() {\n  this.started = true;\n  this.reset();\n  this.startTime_ = this.now();\n  this.running = true;\n  this.result_.totalCount = this.getCount();\n  if (!this.shouldRunTests()) {\n    this.log('shouldRunTests() returned false, skipping these tests.');\n    this.result_.testSuppressed = true;\n    this.finalize();\n    return false;\n  }\n  return true;\n};\n\n\n/**\n * Finalizes the test case, called when the tests have finished executing.\n */\ngoog.testing.TestCase.prototype.finalize = function() {\n  this.saveMessage('Done');\n\n  try {\n    this.tearDownPage();\n  } catch (e) {\n    // Report the error and continue with tests.\n    window['onerror'](e.toString(), document.location.href, 0, 0, e);\n  }\n\n  this.endTime_ = this.now();\n  this.running = false;\n  this.result_.runTime = this.endTime_ - this.startTime_;\n  this.result_.numFilesLoaded = this.countNumFilesLoaded_();\n  this.result_.complete = true;\n  this.testsRanSoFar_++;\n\n  this.log(this.result_.getSummary());\n  if (this.result_.isSuccess()) {\n    this.log('Tests complete');\n  } else {\n    this.log('Tests Failed');\n  }\n  goog.array.forEach(this.onCompletedCallbacks_, function(cb) {\n    cb();\n  });\n  this.onCompletedCallbacks_ = [];\n  this.groupLogsEnd();\n};\n\n\n/**\n * Saves a message to the result set.\n * @param {string} message The message to save.\n */\ngoog.testing.TestCase.prototype.saveMessage = function(message) {\n  this.result_.messages.push(this.getTimeStamp_() + '  ' + message);\n};\n\n\n/**\n * @return {boolean} Whether the test case is running inside the multi test\n *     runner.\n */\ngoog.testing.TestCase.prototype.isInsideMultiTestRunner = function() {\n  var top = goog.global['top'];\n  return top && typeof top['_allTests'] != 'undefined';\n};\n\n/**\n * @return {boolean} Whether the test-progress should be logged to the console.\n */\ngoog.testing.TestCase.prototype.shouldLogTestProgress = function() {\n  return !goog.global['skipClosureTestProgress'] &&\n      !this.isInsideMultiTestRunner();\n};\n\n/**\n * Logs an object to the console, if available.\n * @param {*} val The value to log. Will be ToString'd.\n */\ngoog.testing.TestCase.prototype.log = function(val) {\n  if (this.shouldLogTestProgress() && goog.global.console) {\n    if (typeof val == 'string') {\n      val = this.getTimeStamp_() + ' : ' + val;\n    }\n    if (val instanceof Error && val.stack) {\n      goog.global.console.log(val.stack);\n    } else {\n      goog.global.console.log(val);\n    }\n  }\n};\n\n\n/**\n * Groups the upcoming logs in the same log group\n */\ngoog.testing.TestCase.prototype.groupLogsStart = function() {\n  if (!this.isInsideMultiTestRunner() && goog.global.console &&\n      goog.global.console.group) {\n    goog.global.console.group(\n        'Test #' + (this.testsRanSoFar_ + 1) + ': ' + this.name_);\n  }\n};\n\n\n/**\n * Closes the group of the upcoming logs\n */\ngoog.testing.TestCase.prototype.groupLogsEnd = function() {\n  if (!this.isInsideMultiTestRunner() && goog.global.console &&\n      goog.global.console.groupEnd) {\n    goog.global.console.groupEnd();\n  }\n};\n\n\n/**\n * @return {boolean} Whether the test was a success.\n */\ngoog.testing.TestCase.prototype.isSuccess = function() {\n  return !!this.result_ && this.result_.isSuccess();\n};\n\n\n/**\n * Returns a string detailing the results from the test.\n * @param {boolean=} opt_verbose If true results will include data about all\n *     tests, not just what failed.\n * @return {string} The results from the test.\n */\ngoog.testing.TestCase.prototype.getReport = function(opt_verbose) {\n  var rv = [];\n\n  if (this.running) {\n    rv.push(this.name_ + ' [RUNNING]');\n  } else if (this.result_.runCount == 0) {\n    rv.push(this.name_ + ' [NO TESTS RUN]');\n  } else {\n    var label = this.result_.isSuccess() ? 'PASSED' : 'FAILED';\n    rv.push(this.name_ + ' [' + label + ']');\n  }\n\n  if (goog.global.location) {\n    rv.push(this.trimPath_(goog.global.location.href));\n  }\n\n  rv.push(this.result_.getSummary());\n\n  if (opt_verbose) {\n    rv.push('.', this.result_.messages.join('\\n'));\n  } else if (!this.result_.isSuccess()) {\n    rv.push(this.result_.errors.join('\\n'));\n  }\n\n  rv.push(' ');\n\n  return rv.join('\\n');\n};\n\n\n/**\n * Returns the test results.\n * @return {!goog.testing.TestCase.Result}\n * @package\n */\ngoog.testing.TestCase.prototype.getResult = function() {\n  return this.result_;\n};\n\n\n/**\n * Returns the amount of time it took for the test to run.\n * @return {number} The run time, in milliseconds.\n */\ngoog.testing.TestCase.prototype.getRunTime = function() {\n  return this.result_.runTime;\n};\n\n\n/**\n * Returns the number of script files that were loaded in order to run the test.\n * @return {number} The number of script files.\n */\ngoog.testing.TestCase.prototype.getNumFilesLoaded = function() {\n  return this.result_.numFilesLoaded;\n};\n\n\n/**\n * Represents a test result.\n * @typedef {{\n *     'source': string,\n *     'message': string,\n *     'stacktrace': string\n * }}\n */\ngoog.testing.TestCase.IResult;\n\n/**\n * Returns the test results object: a map from test names to a list of test\n * failures (if any exist).\n * @return {!Object<string, !Array<goog.testing.TestCase.IResult>>} Test\n *     results object.\n */\ngoog.testing.TestCase.prototype.getTestResults = function() {\n  var map = {};\n  goog.object.forEach(this.result_.resultsByName, function(resultArray, key) {\n    // Make sure we only use properties on the actual map\n    if (!Object.prototype.hasOwnProperty.call(\n            this.result_.resultsByName, key)) {\n      return;\n    }\n    map[key] = [];\n    for (var j = 0; j < resultArray.length; j++) {\n      map[key].push(resultArray[j].toObject_());\n    }\n  }, this);\n  return map;\n};\n\n/**\n * Executes each of the tests, yielding asynchronously if execution time\n * exceeds {@link #maxRunTime}. There is no guarantee that the test case\n * has finished execution once this method has returned.\n * To be notified when the test case has finished execution, use\n * {@link #addCompletedCallback} or {@link #runTestsReturningPromise}.\n *\n * Overridable by the individual test case.  This allows test cases to defer\n * when the test is actually started.  If overridden, finalize must be\n * called by the test to indicate it has finished.\n */\ngoog.testing.TestCase.prototype.runTests = function() {\n  goog.testing.Continuation_.run(this.runSetUpPage_(this.execute));\n};\n\n\n/**\n * Executes each of the tests, returning a promise that resolves with the\n * test results once they are done running.\n * @return {!IThenable<!goog.testing.TestCase.Result>}\n * @final\n * @package\n */\ngoog.testing.TestCase.prototype.runTestsReturningPromise = function() {\n  return new goog.Promise(function(resolve) {\n    goog.testing.Continuation_.run(this.runSetUpPage_(function() {\n      if (!this.prepareForRun_()) {\n        resolve(this.result_);\n        return;\n      }\n      this.groupLogsStart();\n      this.log('Starting tests: ' + this.name_);\n      this.saveMessage('Start');\n      this.batchTime_ = this.now();\n      this.runNextTestCallback_ = resolve;\n      goog.testing.Continuation_.run(this.runNextTest_());\n    }));\n  }, this);\n};\n\n\n/**\n * Runs the setUpPage methods.\n * @param {function(this:goog.testing.TestCase)} runTestsFn Callback to invoke\n *     after setUpPage has completed.\n * @return {?goog.testing.Continuation_}\n * @private\n */\ngoog.testing.TestCase.prototype.runSetUpPage_ = function(runTestsFn) {\n  return this.invokeFunction_(this.setUpPage, runTestsFn, function(e) {\n    this.exceptionBeforeTest = e;\n    runTestsFn.call(this);\n  }, 'setUpPage');\n};\n\n\n/**\n * Executes the next test method synchronously or with promises, depending on\n * the test method's return value.\n *\n * If the test method returns a promise, the next test method will run once\n * the promise is resolved or rejected. If the test method does not\n * return a promise, it is assumed to be synchronous, and execution proceeds\n * immediately to the next test method. This means that test cases can run\n * partially synchronously and partially asynchronously, depending on\n * the return values of their test methods. In particular, a test case\n * executes synchronously until the first promise is returned from a\n * test method (or until a resource limit is reached; see\n * {@link finishTestInvocation_}).\n * @return {?goog.testing.Continuation_}\n * @private\n */\ngoog.testing.TestCase.prototype.runNextTest_ = function() {\n  this.curTest_ = this.next();\n  if (!this.curTest_ || !this.running) {\n    this.finalize();\n    return new goog.testing.Continuation_(\n        goog.bind(this.runNextTestCallback_, this, this.result_));\n  }\n\n  var shouldRunTest = true;\n  try {\n    shouldRunTest = this.shouldRunTestsHelper_();\n  } catch (error) {\n    this.curTest_.name = 'shouldRunTests for ' + this.curTest_.name;\n    return new goog.testing.Continuation_(\n        goog.bind(this.finishTestInvocation_, this, error));\n  }\n\n  if (!shouldRunTest) {\n    return new goog.testing.Continuation_(\n        goog.bind(this.finishTestInvocation_, this));\n  }\n\n  this.curTest_.started();\n  this.result_.runCount++;\n  this.log('Running test: ' + this.curTest_.name);\n  if (this.maybeFailTestEarly(this.curTest_)) {\n    return new goog.testing.Continuation_(\n        goog.bind(this.finishTestInvocation_, this));\n  }\n  goog.testing.TestCase.currentTestName = this.curTest_.name;\n  return this.safeSetUp_();\n};\n\n\n/**\n * @return {boolean}\n * @private\n */\ngoog.testing.TestCase.prototype.shouldRunTestsHelper_ = function() {\n  var objChain =\n      this.curTest_.objChain.length ? this.curTest_.objChain : [this];\n\n  for (var i = 0; i < objChain.length; i++) {\n    var obj = objChain[i];\n\n    if (!goog.isFunction(obj.shouldRunTests)) {\n      return true;\n    }\n\n    if (goog.isFunction(obj.shouldRunTests['$cachedResult'])) {\n      if (!obj.shouldRunTests['$cachedResult']()) {\n        return false;\n      }\n    }\n\n    var result;\n    (function() {\n      // Cache the result by storing a function. This way we only call\n      // shouldRunTests once per object in the chain. This enforces that people\n      // do not attempt to suppress some tests and not others with the same\n      // shouldRunTests function.\n      try {\n        var cached = result = obj.shouldRunTests.call(obj);\n        obj.shouldRunTests['$cachedResult'] = function() {\n          return cached;\n        };\n      } catch (error) {\n        obj.shouldRunTests['$cachedResult'] = function() {\n          throw error;\n        };\n        throw error;\n      }\n    })();\n\n    if (!result) {\n      this.result_.suppressedTests.push(this.curTest_.name);\n      return false;\n    }\n  }\n\n  return true;\n};\n\n/**\n * Runs all the setups associated with a test.\n * @return {?goog.testing.Continuation_}\n * @private\n */\ngoog.testing.TestCase.prototype.safeSetUp_ = function() {\n  var setUps =\n      this.curTest_.setUps.length ? this.curTest_.setUps.slice() : [this.setUp];\n  return this.safeSetUpHelper_(setUps).call(this);\n};\n\n/**\n * Recursively invokes setUp functions.\n * @param {!Array<function()>} setUps\n * @return {function(): ?goog.testing.Continuation_}\n * @private\n */\ngoog.testing.TestCase.prototype.safeSetUpHelper_ = function(setUps) {\n  if (!setUps.length) {\n    return this.safeRunTest_;\n  }\n  return goog.bind(\n      this.invokeFunction_, this, setUps.shift(), this.safeSetUpHelper_(setUps),\n      this.safeTearDown_, 'setUp');\n};\n\n/**\n * Calls the given test function, handling errors appropriately.\n * @return {?goog.testing.Continuation_}\n * @private\n */\ngoog.testing.TestCase.prototype.safeRunTest_ = function() {\n  return this.invokeFunction_(\n      goog.bind(this.curTest_.ref, this.curTest_.scope), this.safeTearDown_,\n      this.safeTearDown_, this.curTest_.name);\n};\n\n\n/**\n * Calls {@link tearDown}, handling errors appropriately.\n * @param {*=} opt_error Error associated with the test, if any.\n * @return {?goog.testing.Continuation_}\n * @private\n */\ngoog.testing.TestCase.prototype.safeTearDown_ = function(opt_error) {\n  // If the test itself failed, report that before running any tearDown()s.\n  if (arguments.length == 1) {\n    this.recordError(this.curTest_.name, opt_error);\n  }\n  var tearDowns = this.curTest_.tearDowns.length ?\n      this.curTest_.tearDowns.slice() :\n      [this.tearDown];\n  return this.safeTearDownHelper_(tearDowns).call(this);\n};\n\n/**\n * Recursively invokes tearDown functions.\n * @param {!Array<function()>} tearDowns\n * @return {function(): ?goog.testing.Continuation_}\n * @private\n */\ngoog.testing.TestCase.prototype.safeTearDownHelper_ = function(tearDowns) {\n  if (!tearDowns.length) {\n    return this.finishTestInvocation_;\n  }\n  return goog.bind(\n      this.invokeFunction_, this, tearDowns.shift(),\n      this.safeTearDownHelper_(tearDowns), this.finishTestInvocation_,\n      'tearDown');\n};\n\n\n/**\n * Calls the given `fn`, then calls either `onSuccess` or\n * `onFailure`, either synchronously or using promises, depending on\n * `fn`'s return value.\n *\n * If `fn` throws an exception, `onFailure` is called immediately\n * with the exception.\n *\n * If `fn` returns a promise, and the promise is eventually resolved,\n * `onSuccess` is called with no arguments. If the promise is eventually\n * rejected, `onFailure` is called with the rejection reason.\n *\n * Otherwise, if `fn` neither returns a promise nor throws an exception,\n * `onSuccess` is called immediately with no arguments.\n *\n * `fn`, `onSuccess`, and `onFailure` are all called with\n * the TestCase instance as the method receiver.\n *\n * @param {function()} fn The function to call.\n * @param {function(this:goog.testing.TestCase): (?goog.testing.Continuation_|undefined)} onSuccess\n * @param {function(this:goog.testing.TestCase, *): (?goog.testing.Continuation_|undefined)} onFailure\n * @param {string} fnName Name of the function being invoked e.g. 'setUp'.\n * @return {?goog.testing.Continuation_}\n * @private\n */\ngoog.testing.TestCase.prototype.invokeFunction_ = function(\n    fn, onSuccess, onFailure, fnName) {\n  var self = this;\n  this.thrownAssertionExceptions_ = [];\n  try {\n    var retval = fn.call(this);\n    if (goog.Thenable.isImplementedBy(retval) ||\n        goog.isFunction(retval && retval['then'])) {\n      // Resolve Thenable into a proper Promise to avoid hard to debug\n      // problems.\n      var promise = goog.Promise.resolve(retval);\n      promise = this.rejectIfPromiseTimesOut_(\n          promise, self.promiseTimeout,\n          'Timed out while waiting for a promise returned from ' + fnName +\n              ' to resolve. Set goog.testing.TestCase.getActiveTestCase()' +\n              '.promiseTimeout to adjust the timeout.');\n      promise.then(\n          function() {\n            self.resetBatchTimeAfterPromise_();\n            if (self.thrownAssertionExceptions_.length == 0) {\n              goog.testing.Continuation_.run(onSuccess.call(self));\n            } else {\n              goog.testing.Continuation_.run(onFailure.call(\n                  self, self.reportUnpropagatedAssertionExceptions_(fnName)));\n            }\n          },\n          function(e) {\n            self.reportUnpropagatedAssertionExceptions_(fnName, e);\n            self.resetBatchTimeAfterPromise_();\n            goog.testing.Continuation_.run(onFailure.call(self, e));\n          });\n      return null;\n    } else {\n      if (this.thrownAssertionExceptions_.length == 0) {\n        return new goog.testing.Continuation_(goog.bind(onSuccess, this));\n      } else {\n        return new goog.testing.Continuation_(goog.bind(\n            onFailure, this,\n            this.reportUnpropagatedAssertionExceptions_(fnName)));\n      }\n    }\n  } catch (e) {\n    this.reportUnpropagatedAssertionExceptions_(fnName, e);\n    return new goog.testing.Continuation_(goog.bind(onFailure, this, e));\n  }\n};\n\n\n/**\n * Logs all of the exceptions generated from failing assertions, and returns a\n * generic exception informing the user that one or more exceptions were not\n * propagated, causing the test to erroneously pass.\n *\n * This is also called when a test fails so that the user sees swallowed errors.\n * (This can make it much easier to debug failures in callbacks in catch blocks)\n * If the actually-thrown error (that made the test fail) is also a JSUnit error\n * (which will therefore be in this array), it will be silently deduped when the\n * regular failure handler tries to record it again.\n * @param {string} testName The test function's name.\n * @param {*=} actualError The thrown error the made the test fail, if any\n * @return {!goog.testing.JsUnitException}\n * @private\n */\ngoog.testing.TestCase.prototype.reportUnpropagatedAssertionExceptions_ =\n    function(testName, actualError) {\n  var extraExceptions = this.thrownAssertionExceptions_.slice();\n  // If the actual error isn't a JSUnit exception, it won't be in this array.\n  goog.array.remove(extraExceptions, actualError);\n  var numExceptions = extraExceptions.length;\n  if (numExceptions && actualError) {\n    // Don't log this message if the only exception is the actual failure.\n    var message =\n        numExceptions + ' additional exceptions were swallowed by the test:';\n    this.log(message);\n    this.saveMessage(message);\n  }\n\n\n  for (var i = 0; i < numExceptions; i++) {\n    this.recordError(testName, extraExceptions[i]);\n  }\n\n  // Mark the test as failed.\n  return new goog.testing.JsUnitException(\n      'One or more assertions were raised but not caught by the testing ' +\n      'framework. These assertions may have been unintentionally captured ' +\n      'by a catch block or a thenCatch resolution of a Promise.');\n};\n\n\n/**\n * Resets the batch run timer. This should only be called after resolving a\n * promise since Promise.then() has an implicit yield.\n * @private\n */\ngoog.testing.TestCase.prototype.resetBatchTimeAfterPromise_ = function() {\n  this.batchTime_ = this.now();\n};\n\n\n/**\n * Finishes up bookkeeping for the current test function, and schedules\n * the next test function to run, either immediately or asychronously.\n * @param {*=} opt_error Optional error resulting from the test invocation.\n * @return {?goog.testing.Continuation_}\n * @private\n */\ngoog.testing.TestCase.prototype.finishTestInvocation_ = function(opt_error) {\n  if (arguments.length == 1) {\n    this.recordError(this.curTest_.name, opt_error);\n  }\n\n  // If no errors have been recorded for the test, it is a success.\n  if (!(this.curTest_.name in this.result_.resultsByName) ||\n      !this.result_.resultsByName[this.curTest_.name].length) {\n    if (goog.array.indexOf(this.result_.suppressedTests, this.curTest_.name) >=\n        0) {\n      this.doSkipped(this.curTest_);\n    } else {\n      this.doSuccess(this.curTest_);\n    }\n  } else {\n    this.doError(this.curTest_);\n  }\n\n  goog.testing.TestCase.currentTestName = null;\n\n  // If the test case has consumed too much time or stack space,\n  // yield to avoid blocking the browser. Otherwise, proceed to the next test.\n  if (this.now() - this.batchTime_ > goog.testing.TestCase.maxRunTime) {\n    this.saveMessage('Breaking async');\n    this.timeout(goog.bind(this.startNextBatch_, this), 0);\n    return null;\n  } else {\n    return new goog.testing.Continuation_(goog.bind(this.runNextTest_, this));\n  }\n};\n\n\n/**\n * Start a new batch to tests after yielding, resetting batchTime and depth.\n * @private\n */\ngoog.testing.TestCase.prototype.startNextBatch_ = function() {\n  this.batchTime_ = this.now();\n  goog.testing.Continuation_.run(this.runNextTest_());\n};\n\n\n/**\n * Reorders the tests depending on the `order` field.\n * @private\n */\ngoog.testing.TestCase.prototype.orderTests_ = function() {\n  switch (this.order) {\n    case goog.testing.TestCase.Order.RANDOM:\n      // Fisher-Yates shuffle\n      var i = this.tests_.length;\n      while (i > 1) {\n        // goog.math.randomInt is inlined to reduce dependencies.\n        var j = Math.floor(Math.random() * i);  // exclusive\n        i--;\n        var tmp = this.tests_[i];\n        this.tests_[i] = this.tests_[j];\n        this.tests_[j] = tmp;\n      }\n      break;\n\n    case goog.testing.TestCase.Order.SORTED:\n      this.tests_.sort(function(t1, t2) {\n        if (t1.name == t2.name) {\n          return 0;\n        }\n        return t1.name < t2.name ? -1 : 1;\n      });\n      break;\n\n      // Do nothing for NATURAL.\n  }\n};\n\n\n/**\n * Gets list of objects that potentially contain test cases. For IE 8 and\n * below, this is the global \"this\" (for properties set directly on the global\n * this or window) and the RuntimeObject (for global variables and functions).\n * For all other browsers, the array simply contains the global this.\n *\n * @param {string=} opt_prefix An optional prefix. If specified, only get things\n *     under this prefix. Note that the prefix is only honored in IE, since it\n *     supports the RuntimeObject:\n *     http://msdn.microsoft.com/en-us/library/ff521039%28VS.85%29.aspx\n *     TODO: Remove this option.\n * @return {!Array<!Object>} A list of objects that should be inspected.\n */\ngoog.testing.TestCase.prototype.getGlobals = function(opt_prefix) {\n  return goog.testing.TestCase.getGlobals(opt_prefix);\n};\n\n\n/**\n * Gets list of objects that potentially contain test cases. For IE 8 and\n * below, this is the global \"this\" (for properties set directly on the global\n * this or window) and the RuntimeObject (for global variables and functions).\n * For all other browsers, the array simply contains the global this.\n *\n * @param {string=} opt_prefix An optional prefix. If specified, only get things\n *     under this prefix. Note that the prefix is only honored in IE, since it\n *     supports the RuntimeObject:\n *     http://msdn.microsoft.com/en-us/library/ff521039%28VS.85%29.aspx\n *     TODO: Remove this option.\n * @return {!Array<!Object>} A list of objects that should be inspected.\n */\ngoog.testing.TestCase.getGlobals = function(opt_prefix) {\n  // Look in the global scope for most browsers, on IE we use the little known\n  // RuntimeObject which holds references to all globals. We reference this\n  // via goog.global so that there isn't an aliasing that throws an exception\n  // in Firefox.\n  return typeof goog.global['RuntimeObject'] != 'undefined' ?\n      [goog.global['RuntimeObject']((opt_prefix || '') + '*'), goog.global] :\n      [goog.global];\n};\n\n\n/**\n * @private {?goog.testing.TestCase}\n */\ngoog.testing.TestCase.activeTestCase_ = null;\n\n\n/**\n * @return {?goog.testing.TestCase} currently active test case or null if not\n *     test is currently running. Tries the G_testRunner first then the stored\n *     value (when run outside of G_testRunner.\n */\ngoog.testing.TestCase.getActiveTestCase = function() {\n  var gTestRunner = goog.global['G_testRunner'];\n  if (gTestRunner && gTestRunner.testCase) {\n    return gTestRunner.testCase;\n  } else {\n    return goog.testing.TestCase.activeTestCase_;\n  }\n};\n\n\n/**\n * Calls {@link goog.testing.TestCase.prototype.invalidateAssertionException}\n * on the active test case if it is installed, and logs an error otherwise.\n * @param {!goog.testing.JsUnitException} e The exception object to invalidate.\n * @package\n */\ngoog.testing.TestCase.invalidateAssertionException = function(e) {\n  var testCase = goog.testing.TestCase.getActiveTestCase();\n  if (testCase) {\n    testCase.invalidateAssertionException(e);\n  } else {\n    goog.global.console.error(\n        'Failed to remove expected exception: no test case is installed.');\n  }\n};\n\n\n/**\n * Gets called before any tests are executed.  Can be overridden to set up the\n * environment for the whole test case.\n * @return {!Thenable|undefined}\n */\ngoog.testing.TestCase.prototype.setUpPage = function() {};\n\n\n/**\n * Gets called after all tests have been executed.  Can be overridden to tear\n * down the entire test case.\n */\ngoog.testing.TestCase.prototype.tearDownPage = function() {};\n\n\n/**\n * Gets called before every goog.testing.TestCase.Test is been executed. Can\n * be overridden to add set up functionality to each test.\n * @return {!Thenable|undefined}\n */\ngoog.testing.TestCase.prototype.setUp = function() {};\n\n\n/**\n * Gets called after every goog.testing.TestCase.Test has been executed. Can\n * be overridden to add tear down functionality to each test.\n * @return {!Thenable|undefined}\n */\ngoog.testing.TestCase.prototype.tearDown = function() {};\n\n\n/**\n * @return {string} The function name prefix used to auto-discover tests.\n */\ngoog.testing.TestCase.prototype.getAutoDiscoveryPrefix = function() {\n  return 'test';\n};\n\n\n/**\n * @return {number} Time since the last batch of tests was started.\n * @protected\n */\ngoog.testing.TestCase.prototype.getBatchTime = function() {\n  return this.batchTime_;\n};\n\n\n/**\n * @param {number} batchTime Time since the last batch of tests was started.\n * @protected\n */\ngoog.testing.TestCase.prototype.setBatchTime = function(batchTime) {\n  this.batchTime_ = batchTime;\n};\n\n\n/**\n * Creates a `goog.testing.TestCase.Test` from an auto-discovered\n *     function.\n * @param {string} name The name of the function.\n * @param {function()} ref The auto-discovered function.\n * @param {!Object=} scope The scope to attach to the test.\n * @param {!Array<!Object>=} objChain\n * @return {!goog.testing.TestCase.Test} The newly created test.\n * @protected\n */\ngoog.testing.TestCase.prototype.createTest = function(\n    name, ref, scope, objChain) {\n  return new goog.testing.TestCase.Test(name, ref, scope, objChain);\n};\n\n\n/**\n * Adds any functions defined on the global object\n * that correspond to lifecycle events for the test case. Overrides\n * setUp, tearDown, setUpPage, tearDownPage, runTests, and shouldRunTests\n * if they are defined on global object.\n */\ngoog.testing.TestCase.prototype.autoDiscoverLifecycle = function() {\n  this.setLifecycleObj(goog.global);\n};\n\n\n// TODO(johnlenz): make this package private\n/**\n * Extracts any functions defined on 'obj' that correspond to page lifecycle\n * events (setUpPage, tearDownPage, runTests, shouldRunTests) and add them to\n * on this test case.\n * @param {!Object} obj\n */\ngoog.testing.TestCase.prototype.setLifecycleObj = function(obj) {\n  if (obj['setUp']) {\n    this.setUp = goog.bind(obj['setUp'], obj);\n  }\n  if (obj['tearDown']) {\n    this.tearDown = goog.bind(obj['tearDown'], obj);\n  }\n  if (obj['setUpPage']) {\n    this.setUpPage = goog.bind(obj['setUpPage'], obj);\n  }\n  if (obj['tearDownPage']) {\n    this.tearDownPage = goog.bind(obj['tearDownPage'], obj);\n  }\n  if (obj['runTests']) {\n    this.runTests = goog.bind(obj['runTests'], obj);\n  }\n  if (obj['shouldRunTests']) {\n    this.shouldRunTests = goog.bind(obj['shouldRunTests'], obj);\n  }\n};\n\n\n// TODO(johnlenz): make this package private\n/**\n * @param {!Object} obj  An object from which to extract test and lifecycle\n * methods.\n */\ngoog.testing.TestCase.prototype.setTestObj = function(obj) {\n  // Check any previously added (likely auto-discovered) tests, only one source\n  // of discovered test and life-cycle methods is allowed.\n  if (this.tests_.length > 0) {\n    fail(\n        'Test methods have already been configured.\\n' +\n        'Tests previously found:\\n' +\n        this.tests_\n            .map(function(test) {\n              return test.name;\n            })\n            .join('\\n') +\n        '\\nNew tests found:\\n' +\n        Object.keys(obj)\n            .filter(function(name) {\n              return name.startsWith('test');\n            })\n            .join('\\n'));\n  }\n  this.shouldAutoDiscoverTests_ = false;\n  if (obj['getTestName']) {\n    this.name_ = obj['getTestName']();\n  }\n  this.setLifecycleObj(obj);\n  this.addTestObj_(obj, '', [this]);\n};\n\n/**\n * @param {!Object} obj  An object from which to extract test and lifecycle\n *     methods.\n * @param {string} name\n * @param {!Array<!Object>} objChain List of objects that have methods used\n *     to create tests such as setUp, tearDown.\n * @private\n */\ngoog.testing.TestCase.prototype.addTestObj_ = function(obj, name, objChain) {\n  var regex = new RegExp('^' + this.getAutoDiscoveryPrefix());\n  var properties = goog.object.getAllPropertyNames(obj);\n  for (var i = 0; i < properties.length; i++) {\n    var testName = properties[i];\n    if (regex.test(testName)) {\n      var testProperty;\n      try {\n        testProperty = obj[testName];\n      } catch (ex) {\n        // NOTE(brenneman): When running tests from a file:// URL on Firefox\n        // 3.5 for Windows, any reference to goog.global.sessionStorage raises\n        // an \"Operation is not supported\" exception. Ignore any exceptions\n        // raised by simply accessing global properties.\n        testProperty = null;\n      }\n      if (name) {\n        testName = testName.slice(this.getAutoDiscoveryPrefix().length);\n      }\n      var fullTestName = name + (testName && name ? '_' : '') + testName;\n      if (goog.isFunction(testProperty)) {\n        this.addNewTest(fullTestName, testProperty, obj, objChain);\n      } else if (goog.isObject(testProperty)) {\n        // To prevent infinite loops.\n        if (!goog.array.contains(objChain, testProperty)) {\n          goog.asserts.assertObject(testProperty);\n          var newObjChain = objChain.slice();\n          newObjChain.push(testProperty);\n          this.addTestObj_(testProperty, fullTestName, newObjChain);\n        }\n      }\n    }\n  }\n};\n\n\n/**\n * Adds any functions defined in the global scope that are prefixed with\n * \"test\" to the test case.\n */\ngoog.testing.TestCase.prototype.autoDiscoverTests = function() {\n  this.autoDiscoverLifecycle();\n  var prefix = this.getAutoDiscoveryPrefix();\n  var testSources = this.getGlobals(prefix);\n\n  for (var i = 0; i < testSources.length; i++) {\n    var testSource = testSources[i];\n    this.addTestObj_(testSource, '', [this]);\n  }\n\n  this.orderTests_();\n};\n\n\n/**\n * Checks to see if the test should be marked as failed before it is run.\n *\n * If there was an error in setUpPage, we treat that as a failure for all\n * tests and mark them all as having failed.\n *\n * @param {goog.testing.TestCase.Test} testCase The current test case.\n * @return {boolean} Whether the test was marked as failed.\n * @protected\n */\ngoog.testing.TestCase.prototype.maybeFailTestEarly = function(testCase) {\n  if (this.exceptionBeforeTest) {\n    // We just use the first error to report an error on a failed test.\n    testCase.name = 'setUpPage for ' + testCase.name;\n    this.recordError(testCase.name, this.exceptionBeforeTest);\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Cycles through the tests, yielding asynchronously if the execution time\n * exceeds {@link #maxRunTime}. In particular, there is no guarantee that\n * the test case has finished execution once this method has returned.\n * To be notified when the test case has finished execution, use\n * {@link #addCompletedCallback} or {@link #runTestsReturningPromise}.\n */\ngoog.testing.TestCase.prototype.cycleTests = function() {\n  this.saveMessage('Start');\n  this.batchTime_ = this.now();\n  if (this.running) {\n    this.runNextTestCallback_ = goog.nullFunction;\n    // Kick off the tests. runNextTest_ will schedule all of the tests,\n    // using a mixture of synchronous and asynchronous strategies.\n    goog.testing.Continuation_.run(this.runNextTest_());\n  }\n};\n\n\n/**\n * Counts the number of files that were loaded for dependencies that are\n * required to run the test.\n * @return {number} The number of files loaded.\n * @private\n */\ngoog.testing.TestCase.prototype.countNumFilesLoaded_ = function() {\n  var scripts = goog.dom.getElementsByTagName(goog.dom.TagName.SCRIPT);\n  var count = 0;\n  for (var i = 0, n = scripts.length; i < n; i++) {\n    if (scripts[i].src) {\n      count++;\n    }\n  }\n  return count;\n};\n\n\n/**\n * Calls a function after a delay, using the protected timeout.\n * @param {Function} fn The function to call.\n * @param {number} time Delay in milliseconds.\n * @return {number} The timeout id.\n * @protected\n */\ngoog.testing.TestCase.prototype.timeout = function(fn, time) {\n  // NOTE: invoking protectedSetTimeout_ as a member of goog.testing.TestCase\n  // would result in an Illegal Invocation error. The method must be executed\n  // with the global context.\n  var protectedSetTimeout = goog.testing.TestCase.protectedSetTimeout_;\n  return protectedSetTimeout(fn, time);\n};\n\n\n/**\n * Clears a timeout created by `this.timeout()`.\n * @param {number} id A timeout id.\n * @protected\n */\ngoog.testing.TestCase.prototype.clearTimeout = function(id) {\n  // NOTE: see execution note for protectedSetTimeout above.\n  var protectedClearTimeout = goog.testing.TestCase.protectedClearTimeout_;\n  protectedClearTimeout(id);\n};\n\n\n/**\n * @return {number} The current time in milliseconds.\n * @protected\n */\ngoog.testing.TestCase.prototype.now = function() {\n  return goog.testing.TestCase.now();\n};\n\n\n/**\n * @return {number} The current time in milliseconds.\n * @protected\n */\ngoog.testing.TestCase.now = function() {\n  // don't use goog.now as some tests override it.\n  if (goog.testing.TestCase.protectedPerformance_) {\n    return goog.testing.TestCase.protectedPerformance_.now();\n  }\n  // Fallback for IE8\n  // Cannot use \"new goog.testing.TestCase.protectedDate_()\" due to b/8323223.\n  var protectedDate = goog.testing.TestCase.protectedDate_;\n  return new protectedDate().getTime();\n};\n\n\n/**\n * Returns the current time.\n * @return {string} HH:MM:SS.\n * @private\n */\ngoog.testing.TestCase.prototype.getTimeStamp_ = function() {\n  // Cannot use \"new goog.testing.TestCase.protectedDate_()\" due to b/8323223.\n  var protectedDate = goog.testing.TestCase.protectedDate_;\n  var d = new protectedDate();\n\n  // Ensure millis are always 3-digits\n  var millis = '00' + d.getMilliseconds();\n  millis = millis.substr(millis.length - 3);\n\n  return this.pad_(d.getHours()) + ':' + this.pad_(d.getMinutes()) + ':' +\n      this.pad_(d.getSeconds()) + '.' + millis;\n};\n\n\n/**\n * Pads a number to make it have a leading zero if it's less than 10.\n * @param {number} number The number to pad.\n * @return {string} The resulting string.\n * @private\n */\ngoog.testing.TestCase.prototype.pad_ = function(number) {\n  return number < 10 ? '0' + number : String(number);\n};\n\n\n/**\n * Trims a path to be only that after google3.\n * @param {string} path The path to trim.\n * @return {string} The resulting string.\n * @private\n */\ngoog.testing.TestCase.prototype.trimPath_ = function(path) {\n  return path.substring(path.indexOf('google3') + 8);\n};\n\n\n/**\n * Handles a test that passed.\n * @param {goog.testing.TestCase.Test} test The test that passed.\n * @protected\n */\ngoog.testing.TestCase.prototype.doSuccess = function(test) {\n  this.result_.successCount++;\n  // An empty list of error messages indicates that the test passed.\n  // If we already have a failure for this test, do not set to empty list.\n  if (!(test.name in this.result_.resultsByName)) {\n    this.result_.resultsByName[test.name] = [];\n  }\n  var message = test.name + ' : PASSED';\n  this.saveMessage(message);\n  this.log(message);\n  if (this.testDone_) {\n    this.doTestDone_(test, []);\n  }\n};\n\n\n/**\n * Handles a test that was skipped.\n * @param {!goog.testing.TestCase.Test} test The test that was skipped.\n * @protected\n */\ngoog.testing.TestCase.prototype.doSkipped = function(test) {\n  this.result_.skipCount++;\n  // An empty list of error messages indicates that the test passed.\n  // If we already have a failure for this test, do not set to empty list.\n  if (!(test.name in this.result_.resultsByName)) {\n    this.result_.resultsByName[test.name] = [];\n  }\n  var message = test.name + ' : SKIPPED';\n  this.saveMessage(message);\n  this.log(message);\n  if (this.testDone_) {\n    this.doTestDone_(test, []);\n  }\n};\n\n\n/**\n * Records an error that fails the current test, without throwing it.\n *\n * Use this function to implement expect()-style assertion libraries that fail a\n * test without breaking execution (so you can see further failures). Do not use\n * this from normal test code.\n *\n * Please contact js-core-libraries-team@ before using this method.  If it grows\n * popular, we may add an expect() API to Closure.\n *\n * NOTE: If there is no active TestCase, you must throw an error.\n * @param {!Error} error The error to log.  If it is a JsUnitException which has\n *     already been logged, nothing will happen.\n */\ngoog.testing.TestCase.prototype.recordTestError = function(error) {\n  this.recordError(\n      this.curTest_ ? this.curTest_.name : '<No active test>', error);\n};\n\n\n\n/**\n * Records and logs an error from or related to a test.\n * @param {string} testName The name of the test that failed.\n * @param {*} error The exception object associated with the\n *     failure or a string.\n * @protected\n */\ngoog.testing.TestCase.prototype.recordError = function(testName, error) {\n  if (error && error['isJsUnitException'] && error['loggedJsUnitException']) {\n    // We already logged this error; don't record it again. This is particularly\n    // important for errors from mocks, which are rethrown by $verify, called by\n    // tearDown().\n    return;\n  }\n\n  var err = this.logError(testName, error);\n  this.result_.errors.push(err);\n  if (testName in this.result_.resultsByName) {\n    this.result_.resultsByName[testName].push(err);\n  } else {\n    this.result_.resultsByName[testName] = [err];\n  }\n\n  if (error && error['isJsUnitException']) {\n    error['loggedJsUnitException'] = true;\n  }\n};\n\n\n/**\n * Handles a test that failed.\n * @param {goog.testing.TestCase.Test} test The test that failed.\n * @protected\n */\ngoog.testing.TestCase.prototype.doError = function(test) {\n  var message = test.name + ' : FAILED';\n  this.log(message);\n  this.saveMessage(message);\n\n  if (this.testDone_) {\n    var results = this.result_.resultsByName[test.name];\n    var errMsgs = [];\n    for (var i = 0; i < results.length; i++) {\n      errMsgs.push(results[i].toString());\n    }\n    this.doTestDone_(test, errMsgs);\n  }\n};\n\n\n/**\n * Makes note of an exception arising from an assertion, and then throws it.\n * If the test otherwise passes (i.e., because something else caught the\n * exception on its way to the test framework), it will be forced to fail.\n * @param {!goog.testing.JsUnitException} e The exception object being thrown.\n * @throws {goog.testing.JsUnitException}\n * @package\n */\ngoog.testing.TestCase.prototype.raiseAssertionException = function(e) {\n  this.thrownAssertionExceptions_.push(e);\n  throw e;\n};\n\n\n/**\n * Removes the specified exception from being tracked. This only needs to be\n * called for internal functions that intentionally catch an exception, such\n * as\n * `#assertThrowsJsUnitException`.\n * @param {!goog.testing.JsUnitException} e The exception object to invalidate.\n * @package\n */\ngoog.testing.TestCase.prototype.invalidateAssertionException = function(e) {\n  goog.array.remove(this.thrownAssertionExceptions_, e);\n};\n\n\n/**\n * @param {string} name Failed test name.\n * @param {*} error The exception object associated with the\n *     failure or a string.\n * @return {!goog.testing.TestCase.Error} Error object.\n * @suppress {missingProperties} message and stack properties\n */\ngoog.testing.TestCase.prototype.logError = function(name, error) {\n  var errMsg = null;\n  var stack = null;\n  if (error) {\n    this.log(error);\n    if (typeof error === 'string') {\n      errMsg = error;\n    } else {\n      errMsg = error.message || error.description || error.toString();\n      stack = error.stack ? error.stack : error['stackTrace'];\n    }\n  } else {\n    errMsg = 'An unknown error occurred';\n  }\n\n  if (stack) {\n    // The Error class includes the message in the stack. Don't duplicate it.\n    stack = stack.replace('Error: ' + errMsg + '\\n', 'Error\\n');\n\n    // Remove extra goog.testing.TestCase frames from the end.\n    stack = stack.replace(\n        /\\n\\s*(\\bat\\b)?\\s*(goog\\.labs\\.testing\\.EnvironmentTestCase_\\.)?goog\\.testing\\.(Continuation_\\.(prototype\\.)?run|TestCase\\.(prototype\\.)?(execute|cycleTests|startNextBatch_|safeRunTest_|invokeFunction_?))[^\\0]*/m,\n        '');\n  }\n  var err = new goog.testing.TestCase.Error(name, errMsg, stack);\n\n  this.saveMessage(err.toString());\n\n  return err;\n};\n\n/**\n * A class representing a single test function.\n * @param {string} name The test name.\n * @param {?function()} ref Reference to the test function or test object.\n * @param {?Object=} scope Optional scope that the test function should be\n *     called in.\n * @param {!Array<?>=} objChain A chain of objects used to populate setUps\n *     and tearDowns.\n * @constructor\n */\ngoog.testing.TestCase.Test = function(name, ref, scope, objChain) {\n  /**\n   * The name of the test.\n   * @type {string}\n   */\n  this.name = name;\n\n  /**\n   * TODO(user): Rename this to something more clear.\n   * Reference to the test function.\n   * @type {function()}\n   */\n  this.ref = ref || function() {};\n\n  /**\n   * Scope that the test function should be called in.\n   * @type {?Object}\n   */\n  this.scope = scope || null;\n\n  /**\n   * @type {!Array<function()>}\n   */\n  this.setUps = [];\n\n  /**\n   * @type {!Array<function()>}\n   */\n  this.tearDowns = [];\n\n  /**\n   * @type {!Array<?>}\n   */\n  this.objChain = objChain || [];\n\n  if (objChain) {\n    for (var i = 0; i < objChain.length; i++) {\n      if (goog.isFunction(objChain[i].setUp)) {\n        this.setUps.push(goog.bind(objChain[i].setUp, objChain[i]));\n      }\n      if (goog.isFunction(objChain[i].tearDown)) {\n        this.tearDowns.push(goog.bind(objChain[i].tearDown, objChain[i]));\n      }\n    }\n    this.tearDowns.reverse();\n  }\n\n  /**\n   * Timestamp just before the test begins execution.\n   * @type {number}\n   * @private\n   */\n  this.startTime_;\n\n  /**\n   * Timestamp just after the test ends execution.\n   * @type {number}\n   * @private\n   */\n  this.stoppedTime_;\n\n  /** @package {boolean|undefined} */\n  this.waiting;\n};\n\n/**\n * Executes the test function.\n * @package\n */\ngoog.testing.TestCase.Test.prototype.execute = function() {\n  this.ref.call(this.scope);\n};\n\n/**\n * Sets the start time\n */\ngoog.testing.TestCase.Test.prototype.started = function() {\n  this.startTime_ = goog.testing.TestCase.now();\n};\n\n/**\n * Sets the stop time\n */\ngoog.testing.TestCase.Test.prototype.stopped = function() {\n  this.stoppedTime_ = goog.testing.TestCase.now();\n};\n\n/**\n * Returns the runtime for this test function\n * @return {number} milliseconds takenn by the test.\n */\ngoog.testing.TestCase.Test.prototype.getElapsedTime = function() {\n  return this.stoppedTime_ - this.startTime_;\n};\n\n/**\n * A class for representing test results.  A bag of public properties.\n * @param {goog.testing.TestCase} testCase The test case that owns this result.\n * @constructor\n * @final\n */\ngoog.testing.TestCase.Result = function(testCase) {\n  /**\n   * The test case that owns this result.\n   * @type {goog.testing.TestCase}\n   * @private\n   */\n  this.testCase_ = testCase;\n\n  /**\n   * Total number of tests that should have been run.\n   * @type {number}\n   */\n  this.totalCount = 0;\n\n  /**\n   * Total number of tests that were actually run.\n   * @type {number}\n   */\n  this.runCount = 0;\n\n  /**\n   * Number of successful tests.\n   * @type {number}\n   */\n  this.successCount = 0;\n\n  /**\n   * Number of tests skipped due to nested shouldRunTests.\n   * @type {number}\n   */\n  this.skipCount = 0;\n\n  /**\n   * The amount of time the tests took to run.\n   * @type {number}\n   */\n  this.runTime = 0;\n\n  /**\n   * The number of files loaded to run this test.\n   * @type {number}\n   */\n  this.numFilesLoaded = 0;\n\n  /**\n   * Whether all tests were suppressed from a top-level shouldRunTests().\n   * @type {boolean}\n   */\n  this.testSuppressed = false;\n\n  /**\n   * Which tests were suppressed by shouldRunTests() returning false.\n   * @type {!Array<string>}\n   */\n  this.suppressedTests = [];\n\n  /**\n   * Test results for each test that was run. The test name is always added\n   * as the key in the map, and the array of strings is an optional list\n   * of failure messages. If the array is empty, the test passed. Otherwise,\n   * the test failed.\n   * @type {!Object<string, !Array<goog.testing.TestCase.Error>>}\n   */\n  this.resultsByName = {};\n\n  /**\n   * Errors encountered while running the test.\n   * @type {!Array<goog.testing.TestCase.Error>}\n   */\n  this.errors = [];\n\n  /**\n   * Messages to show the user after running the test.\n   * @type {!Array<string>}\n   */\n  this.messages = [];\n\n  /**\n   * Whether the tests have completed.\n   * @type {boolean}\n   */\n  this.complete = false;\n};\n\n\n/**\n * @return {boolean} Whether the test was successful.\n */\ngoog.testing.TestCase.Result.prototype.isSuccess = function() {\n  return this.complete && this.errors.length == 0;\n};\n\n\n/**\n * @return {string} A summary of the tests, including total number of tests that\n *     passed, failed, and the time taken.\n */\ngoog.testing.TestCase.Result.prototype.getSummary = function() {\n  var summary = this.runCount + ' of ' + this.totalCount + ' tests run in ' +\n      this.runTime + 'ms.\\n';\n  if (this.testSuppressed) {\n    summary += 'Tests not run because shouldRunTests() returned false.';\n  } else {\n    var failures = this.totalCount - this.successCount - this.skipCount;\n    var suppressionMessage = '';\n\n    if (this.skipCount) {\n      suppressionMessage +=\n          ', ' + this.skipCount + ' skipped by shouldRunTests()';\n    }\n\n    var countOfRunTests = this.testCase_.getActuallyRunCount();\n    if (countOfRunTests) {\n      failures = countOfRunTests - this.successCount - this.skipCount;\n      suppressionMessage += ', ' + (this.totalCount - countOfRunTests) +\n          ' suppressed by querystring';\n    }\n    summary += this.successCount + ' passed, ' + failures + ' failed' +\n        suppressionMessage + '.\\n' + Math.round(this.runTime / this.runCount) +\n        ' ms/test. ' + this.numFilesLoaded + ' files loaded.';\n  }\n\n  return summary;\n};\n\n\n/**\n * @param {function(goog.testing.TestCase.Test, !Array<string>)} testDone\n */\ngoog.testing.TestCase.prototype.setTestDoneCallback = function(testDone) {\n  this.testDone_ = testDone;\n};\n\n\n/**\n * @param {goog.testing.TestCase.Test} test\n * @param {!Array<string>} errMsgs\n * @private\n */\ngoog.testing.TestCase.prototype.doTestDone_ = function(test, errMsgs) {\n  test.stopped();\n  this.testDone_(test, errMsgs);\n};\n\n/**\n * Initializes the TestCase.\n * @param {goog.testing.TestCase} testCase The test case to install.\n * @param {function(goog.testing.TestCase.Test, Array<string>)=} opt_testDone\n *     Called when each test completes.\n */\ngoog.testing.TestCase.initializeTestCase = function(testCase, opt_testDone) {\n  if (opt_testDone) {\n    testCase.setTestDoneCallback(opt_testDone);\n  }\n\n  if (testCase.shouldAutoDiscoverTests_) {\n    testCase.autoDiscoverTests();\n  } else {\n    // Make sure the tests are still ordered based on provided order.\n    testCase.orderTests_();\n  }\n\n  if (goog.global.location) {\n    var search = goog.global.location.search;\n    testCase.setTestsToRun(goog.testing.TestCase.parseRunTests_(search));\n  }\n  goog.testing.TestCase.activeTestCase_ = testCase;\n};\n\n\n/**\n * Initializes the given test case with the global test runner 'G_testRunner'.\n * @param {goog.testing.TestCase} testCase The test case to install.\n * @param {function(goog.testing.TestCase.Test, Array<string>)=} opt_testDone\n *     Called when each test completes.\n */\ngoog.testing.TestCase.initializeTestRunner = function(testCase, opt_testDone) {\n  goog.testing.TestCase.initializeTestCase(testCase, opt_testDone);\n\n  var gTestRunner = goog.global['G_testRunner'];\n  if (gTestRunner) {\n    gTestRunner['initialize'](testCase);\n  } else {\n    throw new Error(\n        'G_testRunner is undefined. Please ensure goog.testing.jsunit' +\n        ' is included.');\n  }\n};\n\n\n/**\n * Parses URL query parameters for the 'runTests' parameter.\n * @param {string} search The URL query string.\n * @return {Object<string, boolean>} A set of test names or test indices to be\n *     run by the test runner.\n * @private\n */\ngoog.testing.TestCase.parseRunTests_ = function(search) {\n  var testsToRun = null;\n  var runTestsMatch = search.match(/(?:\\?|&)runTests=([^?&]+)/i);\n  if (runTestsMatch) {\n    testsToRun = {};\n    var arr = runTestsMatch[1].split(',');\n    for (var i = 0, len = arr.length; i < len; i++) {\n      testsToRun[arr[i]] = true;\n    }\n  }\n  return testsToRun;\n};\n\n\n/**\n * Wraps provided promise and returns a new promise which will be rejected\n * if the original promise does not settle within the given timeout.\n * @param {!goog.Promise<T>} promise\n * @param {number} timeoutInMs Number of milliseconds to wait for the promise to\n *     settle before failing it with a timeout error.\n * @param {string} errorMsg Error message to use if the promise times out.\n * @return {!goog.Promise<T>} A promise that will settle with the original\n       promise unless the timeout is exceeded.\n *     error.\n * @template T\n * @private\n */\ngoog.testing.TestCase.prototype.rejectIfPromiseTimesOut_ = function(\n    promise, timeoutInMs, errorMsg) {\n  var self = this;\n  var start = this.now();\n  return new goog.Promise(function(resolve, reject) {\n    var timeoutId = self.timeout(function() {\n      var elapsed = self.now() - start;\n      reject(new Error(errorMsg + '\\nElapsed time: ' + elapsed + 'ms.'));\n    }, timeoutInMs);\n    promise.then(resolve, reject);\n    var clearTimeout = goog.bind(self.clearTimeout, self, timeoutId);\n    promise.then(clearTimeout, clearTimeout);\n  });\n};\n\n\n\n/**\n * A class representing an error thrown by the test\n * @param {string} source The name of the test which threw the error.\n * @param {string} message The error message.\n * @param {string=} opt_stack A string showing the execution stack.\n * @constructor\n * @final\n */\ngoog.testing.TestCase.Error = function(source, message, opt_stack) {\n  /**\n   * The name of the test which threw the error.\n   * @type {string}\n   */\n  this.source = source;\n\n  /**\n   * Reference to the test function.\n   * @type {string}\n   */\n  this.message = message;\n\n  /**\n   * The stack.\n   * @type {?string}\n   */\n  this.stack = null;\n\n  if (opt_stack) {\n    this.stack = opt_stack;\n  } else {\n    // Attempt to capture a stack trace.\n    if (Error.captureStackTrace) {\n      // See https://code.google.com/p/v8-wiki/wiki/JavaScriptStackTraceApi\n      Error.captureStackTrace(this, goog.testing.TestCase.Error);\n    } else {\n      var stack = new Error().stack;\n      if (stack) {\n        this.stack = stack;\n      }\n    }\n  }\n};\n\n\n/**\n * Returns a string representing the error object.\n * @return {string} A string representation of the error.\n * @override\n */\ngoog.testing.TestCase.Error.prototype.toString = function() {\n  return 'ERROR in ' + this.source + '\\n' + this.message +\n      (this.stack ? '\\n' + this.stack : '');\n};\n\n/**\n * Returns an object representing the error suitable for JSON serialization.\n * @return {!goog.testing.TestCase.IResult} An object\n *     representation of the error.\n * @private\n */\ngoog.testing.TestCase.Error.prototype.toObject_ = function() {\n  return {\n    'source': this.source,\n    'message': this.message,\n    'stacktrace': this.stack || ''\n  };\n};\n\n\n\n/**\n * @constructor\n * @param {function(): (?goog.testing.Continuation_|undefined)} fn\n * @private\n */\ngoog.testing.Continuation_ = function(fn) {\n  /** @private @const */\n  this.fn_ = fn;\n};\n\n\n/** @param {?goog.testing.Continuation_|undefined} continuation */\ngoog.testing.Continuation_.run = function(continuation) {\n  var fn = continuation && continuation.fn_;\n  while (fn) {\n    continuation = fn();\n    fn = continuation && continuation.fn_;\n  }\n};\n","^;",1579837703000,"^<",["^=",["^1L","^1>","^5[","^4J","^?","^42","~$goog.Promise","^2O","^12","~$goog.Thenable"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/testcase.js"],"^O",["^=",["~$goog.testing.TestCase.Test","~$goog.testing.TestCase.Error","~$goog.testing.TestCase.Order","^30","~$goog.testing.TestCase.Result"]],"^W",true,"^X",["^?","^7S","^7T","^2O","^1L","^1>","^12","^42","^4J","^5["]],["^ ","^3",[1579837703000],"^3?",true,"^4","goog.i18n.relativedatetimeformat.js","^5",["^6","goog/i18n/relativedatetimeformat.js"],"^7","goog/i18n/relativedatetimeformat.js","^8","^9","^:","// Copyright 2018 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview RelativeDateTimeFormat provides methods to format simple\n * relative dates and times into a string in a user friendly way and a locale\n * sensitive manner. Numeric quantities are supported with negative values\n * indicating the past, zero meaning now, and positive for the future. Specific\n * named times such as \"tomorrow\" are returned and correctly pluralized results\n * are given for relative times without specific names such as \"in 5 days\" or \"3\n * weeks ago\". The result is localized according to current locale value.\n *\n * Similar to the ICU4J class com/ibm/icu/text/RelativeDateTimeFormatter:\n * http://icu-project.org/apiref/icu4j/com/ibm/icu/text/RelativeDateTimeFormatter.html\n */\n\ngoog.module('goog.i18n.RelativeDateTimeFormat');\n\n// For referencing goog.i18n.USE_ECMASCRIPT_I18N_RDTF to determine compile-time\n// choice of ECMAScript vs. JavaScript implementation and data.\nvar LocaleFeature = goog.require('goog.i18n.LocaleFeature');\n\nvar MessageFormat = goog.require('goog.i18n.MessageFormat');\nvar asserts = goog.require('goog.asserts');\nvar relativeDateTimeSymbols = goog.require('goog.i18n.relativeDateTimeSymbols');\n\n/**\n * @constructor\n * @param {!RelativeDateTimeFormat.NumericOption=} opt_numeric\n *     This optional string determines if formatted output is always\n *     the numeric formatting rather than available relative strings.\n *     ALWAYS (default) forces numeric results in all uses of this instance.\n *     AUTO mode uses available relative strings such as \"tomorrow\", falling\n * back to numeric.\n * @param {!RelativeDateTimeFormat.Style=} opt_style\n *     This optional value determines the style of the relative time output.\n *     Values include LONG, SHORT, NARROW. Default is LONG.\n *     as part of the resulting formatted string\n * @param {!relativeDateTimeSymbols.RelativeDateTimeSymbols=}\n *     opt_relativeDateTimeSymbols This optional value can be used to set the\n *     data for to use for this instance rather than obtaining from\n *     relativedatetimesymbols.\n * @final\n */\nvar RelativeDateTimeFormat = function(\n    opt_numeric, opt_style, opt_relativeDateTimeSymbols) {\n  /**\n   * Records if the implementation is ECMAScript\n   * @private @type {boolean}\n   */\n  this.nativeMode_ = false;\n\n  if (!LocaleFeature.USE_ECMASCRIPT_I18N_RDTF) {\n    asserts.assert(\n        opt_relativeDateTimeSymbols ||\n            relativeDateTimeSymbols.getRelativeDateTimeSymbols(),\n        'goog.i18n.RelativeDateTimeSymbols requires symbols ECMAScript mode');\n    /**\n     * RelativeDateTimeSymbols object for locale data required by the formatter.\n     * @private @const {?relativeDateTimeSymbols.RelativeDateTimeSymbols}\n     */\n    this.rdtfSymbols_ = !LocaleFeature.USE_ECMASCRIPT_I18N_RDTF ?\n        (opt_relativeDateTimeSymbols ||\n         relativeDateTimeSymbols.getRelativeDateTimeSymbols()) :\n        null;\n  }\n  if (!this.rdtfSymbols_) {\n    this.nativeMode_ = true;\n  }\n\n  /**\n   * Flag to force numeric mode in all cases. Normally true.\n   * @private @type {boolean}\n   */\n  this.alwaysNumeric_ = true;\n  if (opt_numeric) {\n    asserts.assert(\n        opt_numeric == RelativeDateTimeFormat.NumericOption.ALWAYS ||\n            opt_numeric == RelativeDateTimeFormat.NumericOption.AUTO,\n        'Invalid opt_numeric value');\n    if (opt_numeric == RelativeDateTimeFormat.NumericOption.ALWAYS) {\n      this.alwaysNumeric_ = true;\n    } else if (opt_numeric == RelativeDateTimeFormat.NumericOption.AUTO) {\n      this.alwaysNumeric_ = false;\n    }\n  }\n\n  /** @private @type {!RelativeDateTimeFormat.Style} */\n  this.style_ = RelativeDateTimeFormat.Style.LONG;\n  if (opt_style) {\n    asserts.assert(\n        opt_style >= RelativeDateTimeFormat.Style.LONG &&\n            opt_style <= RelativeDateTimeFormat.Style.NARROW,\n        'Style must be LONG, SHORT, or NARROW');\n    this.style_ = opt_style;\n  }\n};\n\n/**\n * Values for setting the numeric mode in the constructor.\n * @enum {string}\n */\nRelativeDateTimeFormat.NumericOption = {\n  ALWAYS: 'always',\n  AUTO: 'auto',\n};\n\n/**\n * Collection of public style symbols.\n * @enum {number}\n */\nRelativeDateTimeFormat.Style = {\n  LONG: 0,\n  SHORT: 1,\n  NARROW: 2\n};\n\n/**\n * Relative unit constants for public use.\n * @enum {number}\n */\nRelativeDateTimeFormat.Unit = {\n  YEAR: 0,\n  QUARTER: 1,\n  MONTH: 2,\n  WEEK: 3,\n  DAY: 4,\n  HOUR: 5,\n  MINUTE: 6,\n  SECOND: 7\n};\n\n/**\n * Formats a string with the amount and relative unit. If data for the quantity\n * is not available in the requested style, then it falls back to next style. If\n * not available in any style, then it reverts to formatNumeric for the same\n * unit.\n * @param {number} quantity  A desired offset from current time, negative\n *     for past, 0 for now, positive for future.\n * @param {!RelativeDateTimeFormat.Unit} relativeUnit  Type such as HOUR, YEAR,\n *     QUARTER.\n * @return {string} The formatted result. May be empty string for an\n *   unsupported locale.\n */\nRelativeDateTimeFormat.prototype.format = function(quantity, relativeUnit) {\n  asserts.assertNumber(quantity, 'Quantity must be a number');\n  asserts.assert(\n      relativeUnit >= RelativeDateTimeFormat.Unit.YEAR &&\n          relativeUnit <= RelativeDateTimeFormat.Unit.SECOND,\n      'Unit must be one of the supported values');\n\n  /**\n   * Special cases to force numeric units, in order\n   * to match ICU4J as described in\n   * http://unicode.org/cldr/trac/ticket/9165\n   * http://bugs.icu-project.org/trac/ticket/12171\n   */\n\n  /**\n   * TODO(icu/12171): re-examine this if/when ICU4J and CLDR data are\n   *  updated with correct correct relative strings.\n   */\n  var useNumeric = this.alwaysNumeric_;\n  if ((relativeUnit == RelativeDateTimeFormat.Unit.MINUTE) ||\n      (relativeUnit == RelativeDateTimeFormat.Unit.HOUR)) {\n    useNumeric = true;\n  }\n\n  if (LocaleFeature.USE_ECMASCRIPT_I18N_RDTF) {\n    return this.formatNative_(quantity, relativeUnit, useNumeric);\n  } else {\n    return this.formatPolyfill_(quantity, relativeUnit, useNumeric);\n  }\n};\n\n/**\n * Format using pure JavaScript\n * @param {number} quantity Desired offset from current date/time.\n * @param {!RelativeDateTimeFormat.Unit} relativeUnit  Type such as HOUR, YEAR,\n *     QUARTER.\n * @param {boolean} useNumeric True if numeric output is forced.\n * @return {string} The formatted result. May be empty string for an\n *   unsupported locale.\n * @private\n */\nRelativeDateTimeFormat.prototype.formatPolyfill_ = function(\n    quantity, relativeUnit, useNumeric) {\n  /**\n   * Find the right data based on Unit, quantity, and plural.\n   */\n  var rdtfUnitPattern = this.getUnitStylePattern_(relativeUnit);\n  var dirString = quantity.toString();\n\n  if ((relativeUnit == RelativeDateTimeFormat.Unit.MINUTE) ||\n      (relativeUnit == RelativeDateTimeFormat.Unit.HOUR)) {\n    useNumeric = true;\n  }\n  // Formats using Closure Javascript. Check for forcing numeric and having\n  // relative value with the given quantity.\n  if (!useNumeric && rdtfUnitPattern && rdtfUnitPattern.R &&\n      rdtfUnitPattern.R[dirString]) {\n    return rdtfUnitPattern.R[dirString];\n  } else {\n    // Direction data doesn't exist. Fallback to format numeric.\n    return this.formatNumericInternal_(quantity, rdtfUnitPattern);\n  }\n};\n\n/**\n * Format using ECMAScript Intl class RelativeTimeFormat\n * @param {number} quantity Desired offset from current date/time.\n * @param {!RelativeDateTimeFormat.Unit} relativeUnit  Type such as HOUR, YEAR,\n *     QUARTER.\n * @param {boolean} useNumeric True if numeric output is forced.\n * @return {string} The formatted result. May be empty string for an\n *   unsupported locale.\n * @private\n */\nRelativeDateTimeFormat.prototype.formatNative_ = function(\n    quantity, relativeUnit, useNumeric) {\n  // Use built-in ECMAScript Intl object.\n  var options = {\n    'numeric': useNumeric ? 'always' : 'auto',\n  };\n  switch (this.style_) {\n    case RelativeDateTimeFormat.Style.NARROW:\n      options['style'] = 'narrow';\n      break;\n    case RelativeDateTimeFormat.Style.SHORT:\n      options['style'] = 'short';\n      break;\n    case RelativeDateTimeFormat.Style.LONG:\n      options['style'] = 'long';\n    default:\n      break;\n  }\n\n  // Use built-in ECMAScript Intl object.\n  var intl = goog.global.Intl;\n  try {\n    // Fix \"_\" to \"-\" to correspond to BCP-47.\n    var intlFormatter =\n        new intl.RelativeTimeFormat(goog.LOCALE.replace(/_/g, '-'), options);\n  } catch (err) {\n    // An empty string is returned for an unsupported LOCALE.\n    return '';\n  }\n\n  var unit = 'year';\n  switch (relativeUnit) {\n    case RelativeDateTimeFormat.Unit.YEAR:\n      unit = 'year';\n      break;\n    case RelativeDateTimeFormat.Unit.QUARTER:\n      unit = 'quarter';\n      break;\n    case RelativeDateTimeFormat.Unit.MONTH:\n      unit = 'month';\n      break;\n    case RelativeDateTimeFormat.Unit.WEEK:\n      unit = 'week';\n      break;\n    case RelativeDateTimeFormat.Unit.DAY:\n      unit = 'day';\n      break;\n    case RelativeDateTimeFormat.Unit.HOUR:\n      unit = 'hour';\n      break;\n    case RelativeDateTimeFormat.Unit.MINUTE:\n      unit = 'minute';\n      break;\n    case RelativeDateTimeFormat.Unit.SECOND:\n      unit = 'second';\n      break;\n  }\n  return intlFormatter.format(quantity, unit);\n};\n\n/**\n * Format with forced numeric value and relative unit.\n * @param {number} quantity  The number of units.\n *     Negative zero will use PAST, while unsiged or positive indicates FUTURE.\n * @param {!relativeDateTimeSymbols.StyleElement|undefined} unitStylePattern Has\n *     PAST and FUTURE fields.\n * @return {string}  The formatted result.\n * @private\n */\nRelativeDateTimeFormat.prototype.formatNumericInternal_ = function(\n    quantity, unitStylePattern) {\n  if (!unitStylePattern) return '';\n\n  /**\n   * Stores the plural formatting string.\n   * @type {string}\n   */\n  var relTimeString;\n  var absQuantity = Math.abs(quantity);\n\n  // Apply MessageFormat to the unit with FUTURE or PAST quantity, with test for\n  // signed zero value.\n  if (quantity > 0 || (quantity == 0 && (1 / quantity) == Infinity)) {\n    relTimeString = unitStylePattern.F;\n  } else {\n    // Negative zero is interpreted as the past.\n    relTimeString = unitStylePattern.P;\n  }\n\n  /**\n   * Formatter for the messages requiring units. Plural formatting needed.\n   * @type {?MessageFormat}\n   */\n  // Take basic message and wrap with plural message type.\n  var msgFormatter = new MessageFormat('{N,plural,' + relTimeString + '}');\n  return msgFormatter.format({'N': absQuantity});\n};\n\n\n/**\n * From the data, return the information for the given unit and style.\n * @param {number} relativeUnit\n * @return {!relativeDateTimeSymbols.StyleElement|undefined}  RelativeUnitStyle\n * @private\n */\nRelativeDateTimeFormat.prototype.getUnitStylePattern_ = function(relativeUnit) {\n  var unitInfo = this.getUnitPattern_(relativeUnit);\n  asserts.assertObject(unitInfo);\n  return this.getStylePattern_(unitInfo);\n};\n\n\n/**\n * Use public unit symbol to retrieve data for that unit, given the style.\n * @param{!relativeDateTimeSymbols.RelativeDateTimeFormatStyles} unit\n * @return {!relativeDateTimeSymbols.StyleElement|undefined}\n * @private\n */\nRelativeDateTimeFormat.prototype.getStylePattern_ = function(unit) {\n  // Fall back from NARROW to SHORT to LONG as needed.\n  switch (this.style_) {\n    case RelativeDateTimeFormat.Style.NARROW:\n      if (unit.NARROW != undefined) {\n        return unit.NARROW;\n      }\n    case RelativeDateTimeFormat.Style.SHORT:\n      if (unit.SHORT != undefined) {\n        return unit.SHORT;\n      }\n    case RelativeDateTimeFormat.Style.LONG:\n    default:\n      return unit.LONG;\n  }\n};\n\n/**\n * Returns the style set for this formatter.\n * @return {number}  One of LONG, SHORT, NARROW,\n */\nRelativeDateTimeFormat.prototype.getFormatStyle = function() {\n  return this.style_;\n};\n\n/**\n * Returns the status of the alwaysNumeric field.\n * @return {!RelativeDateTimeFormat.NumericOption}\n */\nRelativeDateTimeFormat.prototype.getNumericMode = function() {\n  if (this.alwaysNumeric_) {\n    return RelativeDateTimeFormat.NumericOption.ALWAYS;\n  } else {\n    return RelativeDateTimeFormat.NumericOption.AUTO;\n  }\n};\n\n/**\n * Use public unit symbol to retrieve data for that unit.\n * @param {number|!relativeDateTimeSymbols.RelativeDateTimeFormatStyles} unit\n * @return {!relativeDateTimeSymbols.RelativeDateTimeFormatStyles}\n * @private\n */\nRelativeDateTimeFormat.prototype.getUnitPattern_ = function(unit) {\n  switch (unit) {\n    default:\n    case RelativeDateTimeFormat.Unit.YEAR:\n      return this.rdtfSymbols_.YEAR;\n    case RelativeDateTimeFormat.Unit.QUARTER:\n      return this.rdtfSymbols_.QUARTER;\n    case RelativeDateTimeFormat.Unit.MONTH:\n      return this.rdtfSymbols_.MONTH;\n    case RelativeDateTimeFormat.Unit.WEEK:\n      return this.rdtfSymbols_.WEEK;\n    case RelativeDateTimeFormat.Unit.DAY:\n      return this.rdtfSymbols_.DAY;\n    case RelativeDateTimeFormat.Unit.HOUR:\n      return this.rdtfSymbols_.HOUR;\n    case RelativeDateTimeFormat.Unit.MINUTE:\n      return this.rdtfSymbols_.MINUTE;\n    case RelativeDateTimeFormat.Unit.SECOND:\n      return this.rdtfSymbols_.SECOND;\n  }\n};\n\n/**\n * Returns relative field for an offset of a given value unit\n * if it is defined for the current style.\n * If the value does not exist, return undefined.\n * For example, is there a -2 offset for DAY in the current locale and style.\n * Note: This data is not available in an ECMAScript implementation.\n * @param{!RelativeDateTimeFormat.Unit} unit\n * @param{string|number} offset\n * @return{string|undefined}\n * @deprecated\n */\nRelativeDateTimeFormat.prototype.isOffsetDefinedForUnit = function(\n    unit, offset) {\n  if (this.rdtfSymbols_ == undefined) {\n    return undefined;\n  }\n\n  var rdtfUnitPattern = this.getUnitStylePattern_(unit);\n  // Check for force numeric and requested unit and offset.\n  if (typeof (offset) == 'number') {\n    offset = offset.toString();\n  }\n  if (rdtfUnitPattern && rdtfUnitPattern.R && rdtfUnitPattern.R[offset]) {\n    return rdtfUnitPattern.R[offset];\n  } else {\n    return undefined;\n  }\n};\n\n/**\n * Returns the implementation used for this formatter.\n * @return {boolean}  True iff native mode. False if polyfill.\n * @package\n */\nRelativeDateTimeFormat.prototype.isNativeMode = function() {\n  return this.nativeMode_;\n};\n\n/**\n * Returns true if a ECMAScript formatter is available in the browser.\n * @return {boolean} Whether the ECMAScript implementation available.\n * @package\n */\nRelativeDateTimeFormat.prototype.hasNativeRdtf = function() {\n  var intl = goog.global.Intl;\n  return (Boolean(intl && intl.RelativeTimeFormat));\n};\n\nexports = RelativeDateTimeFormat;\n","^;",1579837703000,"^<",["^=",["^1L","~$goog.i18n.relativeDateTimeSymbols","~$goog.i18n.LocaleFeature","^?","~$goog.i18n.MessageFormat"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/relativedatetimeformat.js"],"^O",["^=",["~$goog.i18n.RelativeDateTimeFormat"]],"^W",true,"^X",["^?","^7Z","^7[","^1L","^7Y"]],["^ ","^3",[1579837703000],"^4","goog.ui.submenu.js","^5",["^6","goog/ui/submenu.js"],"^7","goog/ui/submenu.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A class representing menu items that open a submenu.\n * @see goog.ui.Menu\n *\n * @see ../demos/submenus.html\n * @see ../demos/submenus2.html\n */\n\ngoog.provide('goog.ui.SubMenu');\n\ngoog.require('goog.Timer');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.positioning.AnchoredViewportPosition');\ngoog.require('goog.positioning.Corner');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Menu');\ngoog.require('goog.ui.MenuItem');\ngoog.require('goog.ui.SubMenuRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Class representing a submenu that can be added as an item to other menus.\n *\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to\n *     display as the content of the submenu (use to add icons or styling to\n *     menus).\n * @param {*=} opt_model Data/model associated with the menu item.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional dom helper used for dom\n *     interactions.\n * @param {goog.ui.MenuItemRenderer=} opt_renderer Renderer used to render or\n *     decorate the component; defaults to {@link goog.ui.SubMenuRenderer}.\n * @constructor\n * @extends {goog.ui.MenuItem}\n */\ngoog.ui.SubMenu = function(content, opt_model, opt_domHelper, opt_renderer) {\n  goog.ui.MenuItem.call(\n      this, content, opt_model, opt_domHelper,\n      opt_renderer || goog.ui.SubMenuRenderer.getInstance());\n};\ngoog.inherits(goog.ui.SubMenu, goog.ui.MenuItem);\ngoog.tagUnsealableClass(goog.ui.SubMenu);\n\n\n/**\n * The delay before opening the sub menu in milliseconds.\n * @type {number}\n */\ngoog.ui.SubMenu.MENU_DELAY_MS = 218;\n\n\n/**\n * Timer used to dismiss the submenu when the item becomes unhighlighted.\n * @type {?number}\n * @private\n */\ngoog.ui.SubMenu.prototype.dismissTimer_ = null;\n\n\n/**\n * Timer used to show the submenu on mouseover.\n * @type {?number}\n * @private\n */\ngoog.ui.SubMenu.prototype.showTimer_ = null;\n\n\n/**\n * Whether the submenu believes the menu is visible.\n * @type {boolean}\n * @private\n */\ngoog.ui.SubMenu.prototype.menuIsVisible_ = false;\n\n\n/**\n * The lazily created sub menu.\n * @type {goog.ui.Menu?}\n * @private\n */\ngoog.ui.SubMenu.prototype.subMenu_ = null;\n\n\n/**\n * Whether or not the sub-menu was set explicitly.\n * @type {boolean}\n * @private\n */\ngoog.ui.SubMenu.prototype.externalSubMenu_ = false;\n\n\n/**\n * Whether or not to align the submenu at the end of the parent menu.\n * If true, the menu expands to the right in LTR languages and to the left\n * in RTL langauges.\n * @type {boolean}\n * @private\n */\ngoog.ui.SubMenu.prototype.alignToEnd_ = true;\n\n\n/**\n * Whether the position of this submenu may be adjusted to fit\n * the visible area, as in {@link goog.ui.Popup.positionAtCoordinate}.\n * @type {boolean}\n * @private\n */\ngoog.ui.SubMenu.prototype.isPositionAdjustable_ = false;\n\n\n/** @override */\ngoog.ui.SubMenu.prototype.enterDocument = function() {\n  goog.ui.SubMenu.superClass_.enterDocument.call(this);\n\n  this.getHandler().listen(\n      this.getParent(), goog.ui.Component.EventType.HIDE, this.onParentHidden_);\n\n  if (this.subMenu_) {\n    this.setMenuListenersEnabled_(this.subMenu_, true);\n  }\n};\n\n\n/** @override */\ngoog.ui.SubMenu.prototype.exitDocument = function() {\n  this.getHandler().unlisten(\n      this.getParent(), goog.ui.Component.EventType.HIDE, this.onParentHidden_);\n\n  if (this.subMenu_) {\n    this.setMenuListenersEnabled_(this.subMenu_, false);\n    if (!this.externalSubMenu_) {\n      this.subMenu_.exitDocument();\n      goog.dom.removeNode(this.subMenu_.getElement());\n    }\n  }\n\n  goog.ui.SubMenu.superClass_.exitDocument.call(this);\n};\n\n\n/** @override */\ngoog.ui.SubMenu.prototype.disposeInternal = function() {\n  if (this.subMenu_ && !this.externalSubMenu_) {\n    this.subMenu_.dispose();\n  }\n  this.subMenu_ = null;\n  goog.ui.SubMenu.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * @override\n * Dismisses the submenu on a delay, with the result that the user needs less\n * accuracy when moving to submenus.  Alternate implementations could use\n * geometry instead of a timer.\n * @param {boolean} highlight Whether item should be highlighted.\n * @param {boolean=} opt_btnPressed Whether the mouse button is held down.\n */\ngoog.ui.SubMenu.prototype.setHighlighted = function(highlight, opt_btnPressed) {\n  goog.ui.SubMenu.superClass_.setHighlighted.call(this, highlight);\n\n  if (opt_btnPressed) {\n    this.getMenu().setMouseButtonPressed(true);\n  }\n\n  if (!highlight) {\n    if (this.dismissTimer_) {\n      goog.Timer.clear(this.dismissTimer_);\n    }\n    this.dismissTimer_ =\n        goog.Timer.callOnce(this.dismissSubMenu, this.getMenuDelay(), this);\n  }\n};\n\n\n/**\n * Show the submenu and ensure that all siblings are hidden.\n */\ngoog.ui.SubMenu.prototype.showSubMenu = function() {\n  // Only show the menu if this item is still selected. This is called on a\n  // timeout, so make sure our parent still exists.\n  var parent = this.getParent();\n  if (parent && parent.getHighlighted() == this) {\n    this.setSubMenuVisible_(true);\n    this.dismissSiblings_();\n  }\n};\n\n\n/**\n * Dismisses the menu and all further submenus.\n */\ngoog.ui.SubMenu.prototype.dismissSubMenu = function() {\n  // Because setHighlighted calls this function on a timeout, we need to make\n  // sure that the sub menu hasn't been disposed when we come back.\n  var subMenu = this.subMenu_;\n  if (subMenu && subMenu.getParent() == this) {\n    this.setSubMenuVisible_(false);\n    subMenu.forEachChild(function(child) {\n      if (typeof child.dismissSubMenu == 'function') {\n        child.dismissSubMenu();\n      }\n    });\n  }\n};\n\n\n/**\n * Clears the show and hide timers for the sub menu.\n */\ngoog.ui.SubMenu.prototype.clearTimers = function() {\n  if (this.dismissTimer_) {\n    goog.Timer.clear(this.dismissTimer_);\n  }\n  if (this.showTimer_) {\n    goog.Timer.clear(this.showTimer_);\n  }\n};\n\n\n/**\n * Sets the menu item to be visible or invisible.\n * @param {boolean} visible Whether to show or hide the component.\n * @param {boolean=} opt_force If true, doesn't check whether the component\n *     already has the requested visibility, and doesn't dispatch any events.\n * @return {boolean} Whether the visibility was changed.\n * @override\n */\ngoog.ui.SubMenu.prototype.setVisible = function(visible, opt_force) {\n  var visibilityChanged =\n      goog.ui.SubMenu.superClass_.setVisible.call(this, visible, opt_force);\n  // For menus that allow menu items to be hidden (i.e. ComboBox) ensure that\n  // the submenu is hidden.\n  if (visibilityChanged && !this.isVisible()) {\n    this.dismissSubMenu();\n  }\n  return visibilityChanged;\n};\n\n\n/**\n * Dismiss all the sub menus of sibling menu items.\n * @private\n */\ngoog.ui.SubMenu.prototype.dismissSiblings_ = function() {\n  this.getParent().forEachChild(function(child) {\n    if (child != this && typeof child.dismissSubMenu == 'function') {\n      child.dismissSubMenu();\n      child.clearTimers();\n    }\n  }, this);\n};\n\n\n/**\n * Handles a key event that is passed to the menu item from its parent because\n * it is highlighted.  If the arrow keys or enter key is pressed the sub menu\n * takes control and delegates further key events to its menu until it is\n * dismissed.\n * @param {goog.events.KeyEvent} e A key event.\n * @return {boolean} Whether the event was handled.\n * @override\n */\ngoog.ui.SubMenu.prototype.handleKeyEvent = function(e) {\n  var keyCode = e.keyCode;\n  var arrowOpenKeyCode = this.isRightToLeft() ? goog.events.KeyCodes.LEFT :\n                                                goog.events.KeyCodes.RIGHT;\n  var closeKeyCode = this.isRightToLeft() ? goog.events.KeyCodes.RIGHT :\n                                            goog.events.KeyCodes.LEFT;\n\n  if (!this.menuIsVisible_) {\n    // Menu item doesn't have keyboard control and the correct key was pressed.\n    // So open take keyboard control and open the sub menu.\n    if (this.isEnabled() &&\n        (keyCode == arrowOpenKeyCode || keyCode == goog.events.KeyCodes.ENTER ||\n         keyCode == this.getMnemonic())) {\n      this.showSubMenu();\n      this.getMenu().highlightFirst();\n      this.clearTimers();\n\n      // The menu item doesn't currently care about the key events so let the\n      // parent menu handle them accordingly .\n    } else {\n      return false;\n    }\n\n    // Menu item has control, so let its menu try to handle the keys (this may\n    // in turn be handled by sub-sub menus).\n  } else if (this.getMenu().handleKeyEvent(e)) {\n    // Nothing to do\n\n    // The menu has control and the key hasn't yet been handled, on left arrow\n    // we turn off key control.\n  } else if (keyCode == closeKeyCode) {\n    this.dismissSubMenu();\n\n  } else {\n    // Submenu didn't handle the key so let the parent decide what to do.\n    return false;\n  }\n\n  e.preventDefault();\n  return true;\n};\n\n\n/**\n * Listens to the sub menus items and ensures that this menu item is selected\n * while dismissing the others.  This handles the case when the user mouses\n * over other items on their way to the sub menu.\n * @param {goog.events.Event} e Enter event to handle.\n * @private\n */\ngoog.ui.SubMenu.prototype.onChildEnter_ = function(e) {\n  if (this.subMenu_.getParent() == this) {\n    this.clearTimers();\n    this.getParentEventTarget().setHighlighted(this);\n    this.dismissSiblings_();\n  }\n};\n\n\n/**\n * Listens to the parent menu's hide event and ensures that all submenus are\n * hidden at the same time.\n * @param {goog.events.Event} e The event.\n * @private\n */\ngoog.ui.SubMenu.prototype.onParentHidden_ = function(e) {\n  // Ignore propagated events\n  if (e.target == this.getParentEventTarget()) {\n    // TODO(user): Using an event for this is expensive.  Consider having a\n    // generalized interface that the parent menu calls on its children when\n    // it is hidden.\n    this.dismissSubMenu();\n    this.clearTimers();\n  }\n};\n\n\n/**\n * @override\n * Sets a timer to show the submenu and then dispatches an ENTER event to the\n * parent menu.\n * @param {goog.events.BrowserEvent} e Mouse event to handle.\n */\ngoog.ui.SubMenu.prototype.handleMouseOver = function(e) {\n  if (this.isEnabled()) {\n    this.clearTimers();\n    this.showTimer_ =\n        goog.Timer.callOnce(this.showSubMenu, this.getMenuDelay(), this);\n  }\n  goog.ui.SubMenu.superClass_.handleMouseOver.call(this, e);\n};\n\n\n/**\n * Returns the delay before opening or closing the menu in milliseconds.\n * @return {number}\n * @protected\n */\ngoog.ui.SubMenu.prototype.getMenuDelay = function() {\n  return goog.ui.SubMenu.MENU_DELAY_MS;\n};\n\n\n/**\n * Overrides the default mouseup event handler, so that the ACTION isn't\n * dispatched for the submenu itself, instead the submenu is shown instantly.\n * @param {goog.events.Event} e The browser event.\n * @return {boolean} True if the action was allowed to proceed, false otherwise.\n * @override\n */\ngoog.ui.SubMenu.prototype.performActionInternal = function(e) {\n  this.clearTimers();\n  var shouldHandleClick =\n      this.isSupportedState(goog.ui.Component.State.SELECTED) ||\n      this.isSupportedState(goog.ui.Component.State.CHECKED);\n  if (shouldHandleClick) {\n    return goog.ui.SubMenu.superClass_.performActionInternal.call(this, e);\n  } else {\n    this.showSubMenu();\n    return true;\n  }\n};\n\n\n/**\n * Sets the visiblility of the sub menu.\n * @param {boolean} visible Whether to show menu.\n * @private\n */\ngoog.ui.SubMenu.prototype.setSubMenuVisible_ = function(visible) {\n  // Unhighlighting the menuitems if closing the menu so the event handlers can\n  // determine the correct state.\n  if (!visible && this.getMenu()) {\n    this.getMenu().setHighlightedIndex(-1);\n  }\n\n  // Dispatch OPEN event before calling getMenu(), so we can create the menu\n  // lazily on first access.\n  this.dispatchEvent(\n      goog.ui.Component.getStateTransitionEvent(\n          goog.ui.Component.State.OPENED, visible));\n  var subMenu = this.getMenu();\n  if (visible != this.menuIsVisible_) {\n    goog.dom.classlist.enable(\n        goog.asserts.assert(this.getElement()),\n        goog.getCssName('goog-submenu-open'), visible);\n  }\n  if (visible != subMenu.isVisible()) {\n    if (visible) {\n      // Lazy-render menu when first shown, if needed.\n      if (!subMenu.isInDocument()) {\n        subMenu.render();\n      }\n      subMenu.setHighlightedIndex(-1);\n    }\n    subMenu.setVisible(visible);\n    // We must position after the menu is visible, otherwise positioning logic\n    // breaks in RTL.\n    if (visible) {\n      this.positionSubMenu();\n    }\n  }\n  this.menuIsVisible_ = visible;\n};\n\n\n/**\n * Attaches or detaches menu event listeners to/from the given menu.  Called\n * each time a menu is attached to or detached from the submenu.\n * @param {goog.ui.Menu} menu Menu on which to listen for events.\n * @param {boolean} attach Whether to attach or detach event listeners.\n * @private\n */\ngoog.ui.SubMenu.prototype.setMenuListenersEnabled_ = function(menu, attach) {\n  var handler = this.getHandler();\n  var method = attach ? handler.listen : handler.unlisten;\n  method.call(\n      handler, menu, goog.ui.Component.EventType.ENTER, this.onChildEnter_);\n};\n\n\n/**\n * Sets whether the submenu is aligned at the end of the parent menu.\n * @param {boolean} alignToEnd True to align to end, false to align to start.\n */\ngoog.ui.SubMenu.prototype.setAlignToEnd = function(alignToEnd) {\n  if (alignToEnd != this.alignToEnd_) {\n    this.alignToEnd_ = alignToEnd;\n    if (this.isInDocument()) {\n      // Completely re-render the widget.\n      var oldElement = this.getElement();\n      this.exitDocument();\n\n      if (oldElement.nextSibling) {\n        this.renderBefore(/** @type {!Element} */ (oldElement.nextSibling));\n      } else {\n        this.render(/** @type {Element} */ (oldElement.parentNode));\n      }\n    }\n  }\n};\n\n\n/**\n * Determines whether the submenu is aligned at the end of the parent menu.\n * @return {boolean} True if aligned to the end (the default), false if\n *     aligned to the start.\n */\ngoog.ui.SubMenu.prototype.isAlignedToEnd = function() {\n  return this.alignToEnd_;\n};\n\n\n/**\n * Positions the submenu. This method should be called if the sub menu is\n * opened and the menu element's size changes (e.g., when adding/removing items\n * to an opened sub menu).\n */\ngoog.ui.SubMenu.prototype.positionSubMenu = function() {\n  var position = new goog.positioning.AnchoredViewportPosition(\n      this.getElement(),\n      this.isAlignedToEnd() ? goog.positioning.Corner.TOP_END :\n                              goog.positioning.Corner.TOP_START,\n      this.isPositionAdjustable_);\n\n  // TODO(user): Clean up popup code and have this be a one line call\n  var subMenu = this.getMenu();\n  var el = subMenu.getElement();\n  if (!subMenu.isVisible()) {\n    el.style.visibility = 'hidden';\n    goog.style.setElementShown(el, true);\n  }\n\n  position.reposition(\n      el, this.isAlignedToEnd() ? goog.positioning.Corner.TOP_START :\n                                  goog.positioning.Corner.TOP_END);\n\n  if (!subMenu.isVisible()) {\n    goog.style.setElementShown(el, false);\n    el.style.visibility = 'visible';\n  }\n};\n\n\n// Methods delegated to sub-menu but accessible here for convinience\n\n\n/**\n * Adds a new menu item at the end of the menu.\n * @param {goog.ui.MenuHeader|goog.ui.MenuItem|goog.ui.MenuSeparator} item Menu\n *     item to add to the menu.\n */\ngoog.ui.SubMenu.prototype.addItem = function(item) {\n  this.getMenu().addChild(item, true);\n};\n\n\n/**\n * Adds a new menu item at a specific index in the menu.\n * @param {goog.ui.MenuHeader|goog.ui.MenuItem|goog.ui.MenuSeparator} item Menu\n *     item to add to the menu.\n * @param {number} n Index at which to insert the menu item.\n */\ngoog.ui.SubMenu.prototype.addItemAt = function(item, n) {\n  this.getMenu().addChildAt(item, n, true);\n};\n\n\n/**\n * Removes an item from the menu and disposes it.\n * @param {goog.ui.MenuItem} item The menu item to remove.\n */\ngoog.ui.SubMenu.prototype.removeItem = function(item) {\n  var child = this.getMenu().removeChild(item, true);\n  if (child) {\n    child.dispose();\n  }\n};\n\n\n/**\n * Removes a menu item at a given index in the menu and disposes it.\n * @param {number} n Index of item.\n */\ngoog.ui.SubMenu.prototype.removeItemAt = function(n) {\n  var child = this.getMenu().removeChildAt(n, true);\n  if (child) {\n    child.dispose();\n  }\n};\n\n\n/**\n * Returns a reference to the menu item at a given index.\n * @param {number} n Index of menu item.\n * @return {goog.ui.Component} Reference to the menu item.\n */\ngoog.ui.SubMenu.prototype.getItemAt = function(n) {\n  return this.getMenu().getChildAt(n);\n};\n\n\n/**\n * Returns the number of items in the sub menu (including separators).\n * @return {number} The number of items in the menu.\n */\ngoog.ui.SubMenu.prototype.getItemCount = function() {\n  return this.getMenu().getChildCount();\n};\n\n\n/**\n * Returns the menu items contained in the sub menu.\n * @return {!Array<!goog.ui.MenuItem>} An array of menu items.\n * @deprecated Use getItemAt/getItemCount instead.\n */\ngoog.ui.SubMenu.prototype.getItems = function() {\n  return this.getMenu().getItems();\n};\n\n\n/**\n * Gets a reference to the submenu's actual menu.\n * @return {!goog.ui.Menu} Reference to the object representing the sub menu.\n */\ngoog.ui.SubMenu.prototype.getMenu = function() {\n  if (!this.subMenu_) {\n    this.setMenu(\n        new goog.ui.Menu(this.getDomHelper()), /* opt_internal */ true);\n  } else if (this.externalSubMenu_ && this.subMenu_.getParent() != this) {\n    // Since it is possible for the same popup menu to be attached to multiple\n    // submenus, we need to ensure that it has the correct parent event target.\n    this.subMenu_.setParent(this);\n  }\n  // Always create the menu DOM, for backward compatibility.\n  if (!this.subMenu_.getElement()) {\n    this.subMenu_.createDom();\n  }\n  return this.subMenu_;\n};\n\n\n/**\n * Sets the submenu to a specific menu.\n * @param {goog.ui.Menu} menu The menu to show when this item is selected.\n * @param {boolean=} opt_internal Whether this menu is an \"internal\" menu, and\n *     should be disposed of when this object is disposed of.\n */\ngoog.ui.SubMenu.prototype.setMenu = function(menu, opt_internal) {\n  var oldMenu = this.subMenu_;\n  if (menu != oldMenu) {\n    if (oldMenu) {\n      this.dismissSubMenu();\n      if (this.isInDocument()) {\n        this.setMenuListenersEnabled_(oldMenu, false);\n      }\n    }\n\n    this.subMenu_ = menu;\n    this.externalSubMenu_ = !opt_internal;\n\n    if (menu) {\n      menu.setParent(this);\n      // There's no need to dispatch a HIDE event during submenu construction.\n      menu.setVisible(false, /* opt_force */ true);\n      menu.setAllowAutoFocus(false);\n      menu.setFocusable(false);\n      if (this.isInDocument()) {\n        this.setMenuListenersEnabled_(menu, true);\n      }\n    }\n  }\n};\n\n\n/**\n * Returns true if the provided element is to be considered inside the menu for\n * purposes such as dismissing the menu on an event.  This is so submenus can\n * make use of elements outside their own DOM.\n * @param {Element} element The element to test for.\n * @return {boolean} Whether or not the provided element is contained.\n */\ngoog.ui.SubMenu.prototype.containsElement = function(element) {\n  return this.getMenu().containsElement(element);\n};\n\n\n/**\n * @param {boolean} isAdjustable Whether this submenu is adjustable.\n */\ngoog.ui.SubMenu.prototype.setPositionAdjustable = function(isAdjustable) {\n  this.isPositionAdjustable_ = !!isAdjustable;\n};\n\n\n/**\n * @return {boolean} Whether this submenu is adjustable.\n */\ngoog.ui.SubMenu.prototype.isPositionAdjustable = function() {\n  return this.isPositionAdjustable_;\n};\n\n\n// Register a decorator factory function for goog.ui.SubMenus.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.getCssName('goog-submenu'),\n    function() { return new goog.ui.SubMenu(null); });\n","^;",1579837703000,"^<",["^=",["^1L","^1>","^3L","^3O","^1M","~$goog.positioning.AnchoredViewportPosition","^1P","^?","^3F","~$goog.ui.Menu","~$goog.ui.MenuItem","^1F","~$goog.ui.SubMenuRenderer","^3H"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/submenu.js"],"^O",["^=",["~$goog.ui.SubMenu"]],"^W",true,"^X",["^?","^3O","^1L","^1>","^1M","^3H","^81","^3L","^1F","^1P","^82","^83","^84","^3F"]],["^ ","^3",[1579837703000],"^4","goog.net.streams.base64streamdecoder.js","^5",["^6","goog/net/streams/base64streamdecoder.js"],"^7","goog/net/streams/base64streamdecoder.js","^8","^9","^:","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A base64 stream decoder.\n *\n * Base64 encoding bytes in the buffer will be decoded and delivered in a batch.\n * - Decodes input string in 4-character groups.\n * - Accepts both normal and websafe characters (see {@link goog.crypt.base64}).\n * - Whitespaces are skipped.\n * - Further input after padding characters are decoded normally. Padding\n *   characters are simply treated as 6 input bits (like other characters),\n *   and has no more semantics meaning to the decoder.\n *\n */\n\ngoog.provide('goog.net.streams.Base64StreamDecoder');\n\ngoog.require('goog.asserts');\ngoog.require('goog.crypt.base64');\n\ngoog.scope(function() {\n\n\n/**\n * Base64 stream decoder.\n *\n * @constructor\n * @struct\n * @final\n * @package\n */\ngoog.net.streams.Base64StreamDecoder = function() {\n  /**\n   * If the input stream is still valid.\n   * @private {boolean}\n   */\n  this.isInputValid_ = true;\n\n  /**\n   * The current position in the streamed data that has been processed, i.e.\n   * the position right before `leftoverInput_`.\n   * @private {number}\n   */\n  this.streamPos_ = 0;\n\n  /**\n   * The leftover characters when grouping input characters into four.\n   * @private {string}\n   */\n  this.leftoverInput_ = '';\n};\n\n\nvar Decoder = goog.net.streams.Base64StreamDecoder;\n\n\n/**\n * Checks if the decoder has aborted due to invalid input.\n *\n * @return {boolean} true if the input is still valid.\n */\nDecoder.prototype.isInputValid = function() {\n  return this.isInputValid_;\n};\n\n\n/**\n * @param {string} input The current input string to be processed\n * @param {string} errorMsg Additional error message\n * @throws {!Error} Throws an error indicating where the stream is broken\n * @private\n */\nDecoder.prototype.error_ = function(input, errorMsg) {\n  this.isInputValid_ = false;\n  throw new Error(\n      'The stream is broken @' + this.streamPos_ + '. Error: ' + errorMsg +\n      '. With input:\\n' + input);\n};\n\n\n/**\n * Decodes the input stream.\n *\n * @param {string} input The next part of input stream\n * @return {?Array<number>} decoded bytes in an array, or null if needs more\n *     input data to decode any new bytes\n * @throws {!Error} Throws an error message if the input is invalid\n */\nDecoder.prototype.decode = function(input) {\n  goog.asserts.assertString(input);\n\n  if (!this.isInputValid_) {\n    this.error_(input, 'stream already broken');\n  }\n\n  this.leftoverInput_ += input;\n\n  var groups = Math.floor(this.leftoverInput_.length / 4);\n  if (groups == 0) {\n    return null;\n  }\n\n  try {\n    var result = goog.crypt.base64.decodeStringToByteArray(\n        this.leftoverInput_.substr(0, groups * 4));\n  } catch (e) {\n    this.error_(this.leftoverInput_, e.message);\n  }\n\n  this.streamPos_ += groups * 4;\n  this.leftoverInput_ = this.leftoverInput_.substr(groups * 4);\n  return result;\n};\n\n\n});  // goog.scope\n","^;",1579837703000,"^<",["^=",["^1L","~$goog.crypt.base64","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/streams/base64streamdecoder.js"],"^O",["^=",["~$goog.net.streams.Base64StreamDecoder"]],"^W",true,"^X",["^?","^1L","^86"]],["^ ","^3",[1579837703000],"^4","goog.dom.textrangeiterator.js","^5",["^6","goog/dom/textrangeiterator.js"],"^7","goog/dom/textrangeiterator.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Iterator between two DOM text range positions.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.dom.TextRangeIterator');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.RangeIterator');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.iter.StopIteration');\n\n\n\n/**\n * Subclass of goog.dom.TagIterator that iterates over a DOM range.  It\n * adds functions to determine the portion of each text node that is selected.\n *\n * @param {Node} startNode The starting node position.\n * @param {number} startOffset The offset in to startNode.  If startNode is\n *     an element, indicates an offset in to childNodes.  If startNode is a\n *     text node, indicates an offset in to nodeValue.\n * @param {Node} endNode The ending node position.\n * @param {number} endOffset The offset in to endNode.  If endNode is\n *     an element, indicates an offset in to childNodes.  If endNode is a\n *     text node, indicates an offset in to nodeValue.\n * @param {boolean=} opt_reverse Whether to traverse nodes in reverse.\n * @constructor\n * @extends {goog.dom.RangeIterator}\n * @final\n */\ngoog.dom.TextRangeIterator = function(\n    startNode, startOffset, endNode, endOffset, opt_reverse) {\n  /**\n   * The first node in the selection.\n   * @private {?Node}\n   */\n  this.startNode_ = null;\n\n  /**\n   * The last node in the selection.\n   * @private {?Node}\n   */\n  this.endNode_ = null;\n\n  /**\n   * The offset within the first node in the selection.\n   * @private {number}\n   */\n  this.startOffset_ = 0;\n\n  /**\n   * The offset within the last node in the selection.\n   * @private {number}\n   */\n  this.endOffset_ = 0;\n\n  /**\n   * Whether the node iterator is moving in reverse.\n   * @private {boolean}\n   */\n  this.isReversed_ = !!opt_reverse;\n\n  var goNext;\n\n  if (startNode) {\n    this.startNode_ = startNode;\n    this.startOffset_ = startOffset;\n    this.endNode_ = endNode;\n    this.endOffset_ = endOffset;\n\n    // Skip to the offset nodes - being careful to special case BRs since these\n    // have no children but still can appear as the startContainer of a range.\n    if (startNode.nodeType == goog.dom.NodeType.ELEMENT &&\n        /** @type {!Element} */ (startNode).tagName != goog.dom.TagName.BR) {\n      var startChildren = startNode.childNodes;\n      var candidate = startChildren[startOffset];\n      if (candidate) {\n        this.startNode_ = candidate;\n        this.startOffset_ = 0;\n      } else {\n        if (startChildren.length) {\n          this.startNode_ =\n              /** @type {Node} */ (goog.array.peek(startChildren));\n        }\n        goNext = true;\n      }\n    }\n\n    if (endNode.nodeType == goog.dom.NodeType.ELEMENT) {\n      this.endNode_ = endNode.childNodes[endOffset];\n      if (this.endNode_) {\n        this.endOffset_ = 0;\n      } else {\n        // The offset was past the last element.\n        this.endNode_ = endNode;\n      }\n    }\n  }\n\n  goog.dom.TextRangeIterator.base(\n      this, 'constructor', this.isReversed_ ? this.endNode_ : this.startNode_,\n      this.isReversed_);\n\n  if (goNext) {\n    try {\n      this.next();\n    } catch (e) {\n      if (e != goog.iter.StopIteration) {\n        throw e;\n      }\n    }\n  }\n};\ngoog.inherits(goog.dom.TextRangeIterator, goog.dom.RangeIterator);\n\n\n/** @override */\ngoog.dom.TextRangeIterator.prototype.getStartTextOffset = function() {\n  // Offsets only apply to text nodes.  If our current node is the start node,\n  // return the saved offset.  Otherwise, return 0.\n  return this.node.nodeType != goog.dom.NodeType.TEXT ?\n      -1 :\n      this.node == this.startNode_ ? this.startOffset_ : 0;\n};\n\n\n/** @override */\ngoog.dom.TextRangeIterator.prototype.getEndTextOffset = function() {\n  // Offsets only apply to text nodes.  If our current node is the end node,\n  // return the saved offset.  Otherwise, return the length of the node.\n  return this.node.nodeType != goog.dom.NodeType.TEXT ?\n      -1 :\n      this.node == this.endNode_ ? this.endOffset_ : this.node.nodeValue.length;\n};\n\n\n/** @override */\ngoog.dom.TextRangeIterator.prototype.getStartNode = function() {\n  return this.startNode_;\n};\n\n\n/**\n * Change the start node of the iterator.\n * @param {Node} node The new start node.\n */\ngoog.dom.TextRangeIterator.prototype.setStartNode = function(node) {\n  if (!this.isStarted()) {\n    this.setPosition(node);\n  }\n\n  this.startNode_ = node;\n  this.startOffset_ = 0;\n};\n\n\n/** @override */\ngoog.dom.TextRangeIterator.prototype.getEndNode = function() {\n  return this.endNode_;\n};\n\n\n/**\n * Change the end node of the iterator.\n * @param {Node} node The new end node.\n */\ngoog.dom.TextRangeIterator.prototype.setEndNode = function(node) {\n  this.endNode_ = node;\n  this.endOffset_ = 0;\n};\n\n/** @override */\ngoog.dom.TextRangeIterator.prototype.isLast = function() {\n  return this.isStarted() && this.isLastTag_();\n};\n\n/**\n * Returns true if the iterator is on the last step before StopIteration is\n * thrown, otherwise false.\n * @return {boolean}\n * @private\n */\ngoog.dom.TextRangeIterator.prototype.isLastTag_ = function() {\n  if (this.node != this.lastNode_()) {\n    return false;\n  }\n  // For a reverse iterator, this function will return true if the end offset is\n  // > 0 and the iterator is not currently on an end tag OR the end offset = 0\n  // and the iterator is currently on a start tag.\n  if (this.isReversed_) {\n    return this.startOffset_ ? !this.isEndTag() : this.isStartTag();\n  }\n  // For a forward-iterating iterator, this function will return true if the end\n  // offset is 0 or the iterator is not currently on a start tag.\n  return !this.endOffset_ || !this.isStartTag();\n};\n\n/**\n * Move to the next position in the selection.\n * Throws `goog.iter.StopIteration` when it passes the end of the range.\n * @return {Node} The node at the next position.\n * @override\n */\ngoog.dom.TextRangeIterator.prototype.next = function() {\n  if (this.isLast()) {\n    throw goog.iter.StopIteration;\n  }\n\n  // Call the super function.\n  return goog.dom.TextRangeIterator.superClass_.next.call(this);\n};\n\n/**\n * Get the last node the iterator will hit.\n * @return {?Node} The last node the iterator will hit.\n * @private\n */\ngoog.dom.TextRangeIterator.prototype.lastNode_ = function() {\n  return this.isReversed_ ? this.startNode_ : this.endNode_;\n};\n\n/** @override */\ngoog.dom.TextRangeIterator.prototype.skipTag = function() {\n  goog.dom.TextRangeIterator.superClass_.skipTag.apply(this);\n\n  // If the node we are skipping contains the end node, we just skipped past\n  // the end, so we stop the iteration.\n  if (goog.dom.contains(this.node, this.lastNode_())) {\n    throw goog.iter.StopIteration;\n  }\n};\n\n\n/**\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.dom.TextRangeIterator.prototype.copyFrom = function(other) {\n  this.startNode_ = other.startNode_;\n  this.endNode_ = other.endNode_;\n  this.startOffset_ = other.startOffset_;\n  this.endOffset_ = other.endOffset_;\n  this.isReversed_ = other.isReversed_;\n\n  goog.dom.TextRangeIterator.superClass_.copyFrom.call(this, other);\n};\n\n\n/**\n * @return {!goog.dom.TextRangeIterator} An identical iterator.\n * @override\n */\ngoog.dom.TextRangeIterator.prototype.clone = function() {\n  var copy = new goog.dom.TextRangeIterator(\n      this.startNode_, this.startOffset_, this.endNode_, this.endOffset_,\n      this.isReversed_);\n  copy.copyFrom(this);\n  return copy;\n};\n","^;",1579837703000,"^<",["^=",["^1>","^2K","^?","^61","^2O","~$goog.dom.RangeIterator","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/textrangeiterator.js"],"^O",["^=",["~$goog.dom.TextRangeIterator"]],"^W",true,"^X",["^?","^2O","^1>","^2K","^88","^12","^61"]],["^ ","^3",[1579837703000],"^4","goog.net.iframeio.js","^5",["^6","goog/net/iframeio.js"],"^7","goog/net/iframeio.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class for managing requests via iFrames.  Supports a number of\n * methods of transfer.\n *\n * Gets and Posts can be performed and the resultant page read in as text,\n * JSON, or from the HTML DOM.\n *\n * Using an iframe causes the throbber to spin, this is good for providing\n * feedback to the user that an action has occurred.\n *\n * Requests do not affect the history stack, see goog.History if you require\n * this behavior.\n *\n * The responseText and responseJson methods assume the response is plain,\n * text.  You can access the Iframe's DOM through responseXml if you need\n * access to the raw HTML.\n *\n * Tested:\n *    + FF2.0 (Win Linux)\n *    + IE6, IE7\n *    + Opera 9.1,\n *    + Chrome\n *    - Opera 8.5 fails because of no textContent and buggy innerText support\n *\n * NOTE: Safari doesn't fire the onload handler when loading plain text files\n *\n * This has been tested with Drip in IE to ensure memory usage is as constant\n * as possible. When making making thousands of requests, memory usage stays\n * constant for a while but then starts increasing (<500k for 2000\n * requests) -- this hasn't yet been tracked down yet, though it is cleared up\n * after a refresh.\n *\n *\n * BACKGROUND FILE UPLOAD:\n * By posting an arbitrary form through an IframeIo object, it is possible to\n * implement background file uploads.  Here's how to do it:\n *\n * - Create a form:\n *   <pre>\n *   &lt;form id=\"form\" enctype=\"multipart/form-data\" method=\"POST\"&gt;\n *      &lt;input name=\"userfile\" type=\"file\" /&gt;\n *   &lt;/form&gt;\n *   </pre>\n *\n * - Have the user click the file input\n * - Create an IframeIo instance\n *   <pre>\n *   var io = new goog.net.IframeIo;\n *   goog.events.listen(io, goog.net.EventType.COMPLETE,\n *       function() { alert('Sent'); });\n *   io.sendFromForm(document.getElementById('form'));\n *   </pre>\n *\n *\n * INCREMENTAL LOADING:\n * Gmail sends down multiple script blocks which get executed as they are\n * received by the client. This allows incremental rendering of the thread\n * list and conversations.\n *\n * This requires collaboration with the server that is sending the requested\n * page back.  To set incremental loading up, you should:\n *\n * A) In the application code there should be an externed reference to\n * <code>handleIncrementalData()</code>.  e.g.\n * goog.exportSymbol('GG_iframeFn', goog.net.IframeIo.handleIncrementalData);\n *\n * B) The response page should them call this method directly, an example\n * response would look something like this:\n * <pre>\n *   &lt;html&gt;\n *   &lt;head&gt;\n *     &lt;meta content=\"text/html;charset=UTF-8\" http-equiv=\"content-type\"&gt;\n *   &lt;/head&gt;\n *   &lt;body&gt;\n *     &lt;script&gt;\n *       D = top.P ? function(d) { top.GG_iframeFn(window, d) } : function() {};\n *     &lt;/script&gt;\n *\n *     &lt;script&gt;D([1, 2, 3, 4, 5]);&lt;/script&gt;\n *     &lt;script&gt;D([6, 7, 8, 9, 10]);&lt;/script&gt;\n *     &lt;script&gt;D([11, 12, 13, 14, 15]);&lt;/script&gt;\n *   &lt;/body&gt;\n *   &lt;/html&gt;\n * </pre>\n *\n * Your application should then listen, on the IframeIo instance, to the event\n * goog.net.EventType.INCREMENTAL_DATA.  The event object contains a\n * 'data' member which is the content from the D() calls above.\n *\n * NOTE: There can be problems if you save a reference to the data object in IE.\n * If you save an array, and the iframe is dispose, then the array looses its\n * prototype and thus array methods like .join().  You can get around this by\n * creating arrays using the parent window's Array constructor, or you can\n * clone the array.\n *\n *\n * EVENT MODEL:\n * The various send methods work asynchronously. You can be notified about\n * the current status of the request (completed, success or error) by\n * listening for events on the IframeIo object itself. The following events\n * will be sent:\n * - goog.net.EventType.COMPLETE: when the request is completed\n *   (either successfully or unsuccessfully). You can find out about the result\n *   using the isSuccess() and getLastError\n *   methods.\n * - goog.net.EventType.SUCCESS</code>: when the request was completed\n *   successfully\n * - goog.net.EventType.ERROR: when the request failed\n * - goog.net.EventType.ABORT: when the request has been aborted\n *\n * Example:\n * <pre>\n * var io = new goog.net.IframeIo();\n * goog.events.listen(io, goog.net.EventType.COMPLETE,\n *   function() { alert('request complete'); });\n * io.sendFromForm(...);\n * </pre>\n *\n */\n\ngoog.provide('goog.net.IframeIo');\ngoog.provide('goog.net.IframeIo.IncrementalDataEvent');\n\ngoog.require('goog.Timer');\ngoog.require('goog.Uri');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.debug.HtmlFormatter');\ngoog.require('goog.dom');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.html.SafeUrl');\ngoog.require('goog.html.legacyconversions');\ngoog.require('goog.html.uncheckedconversions');\ngoog.require('goog.json');\ngoog.require('goog.log');\ngoog.require('goog.log.Level');\ngoog.require('goog.net.ErrorCode');\ngoog.require('goog.net.EventType');\ngoog.require('goog.reflect');\ngoog.require('goog.string');\ngoog.require('goog.string.Const');\ngoog.require('goog.structs');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Class for managing requests via iFrames.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.net.IframeIo = function() {\n  goog.net.IframeIo.base(this, 'constructor');\n\n  /**\n   * Name for this IframeIo and frame\n   * @type {string}\n   * @private\n   */\n  this.name_ = goog.net.IframeIo.getNextName_();\n\n  /**\n   * An array of iframes that have been finished with.  We need them to be\n   * disposed async, so we don't confuse the browser (see below).\n   * @type {Array<Element>}\n   * @private\n   */\n  this.iframesForDisposal_ = [];\n\n  // Create a lookup from names to instances of IframeIo.  This is a helper\n  // function to be used in conjunction with goog.net.IframeIo.getInstanceByName\n  // to find the IframeIo object associated with a particular iframe.  Used in\n  // incremental scripts etc.\n  goog.net.IframeIo.instances_[this.name_] = this;\n\n};\ngoog.inherits(goog.net.IframeIo, goog.events.EventTarget);\n\n\n/**\n * Object used as a map to lookup instances of IframeIo objects by name.\n * @type {Object}\n * @private\n */\ngoog.net.IframeIo.instances_ = {};\n\n\n/**\n * Prefix for frame names\n * @type {string}\n */\ngoog.net.IframeIo.FRAME_NAME_PREFIX = 'closure_frame';\n\n\n/**\n * Suffix that is added to inner frames used for sending requests in non-IE\n * browsers\n * @type {string}\n */\ngoog.net.IframeIo.INNER_FRAME_SUFFIX = '_inner';\n\n\n/**\n * The number of milliseconds after a request is completed to dispose the\n * iframes.  This can be done lazily so we wait long enough for any processing\n * that occurred as a result of the response to finish.\n * @type {number}\n */\ngoog.net.IframeIo.IFRAME_DISPOSE_DELAY_MS = 2000;\n\n\n/**\n * Counter used when creating iframes\n * @type {number}\n * @private\n */\ngoog.net.IframeIo.counter_ = 0;\n\n\n/**\n * Form element to post to.\n * @type {HTMLFormElement}\n * @private\n */\ngoog.net.IframeIo.form_;\n\n\n/**\n * Static send that creates a short lived instance of IframeIo to send the\n * request.\n * @param {goog.Uri|string} uri Uri of the request, it is up the caller to\n *     manage query string params.\n * @param {Function=} opt_callback Event handler for when request is completed.\n * @param {string=} opt_method Default is GET, POST uses a form to submit the\n *     request.\n * @param {boolean=} opt_noCache Append a timestamp to the request to avoid\n *     caching.\n * @param {Object|goog.structs.Map=} opt_data Map of key-value pairs that\n *     will be posted to the server via the iframe's form.\n */\ngoog.net.IframeIo.send = function(\n    uri, opt_callback, opt_method, opt_noCache, opt_data) {\n\n  var io = new goog.net.IframeIo();\n  goog.events.listen(io, goog.net.EventType.READY, io.dispose, false, io);\n  if (opt_callback) {\n    goog.events.listen(io, goog.net.EventType.COMPLETE, opt_callback);\n  }\n  io.send(uri, opt_method, opt_noCache, opt_data);\n};\n\n\n/**\n * Find an iframe by name (assumes the context is goog.global since that is\n * where IframeIo's iframes are kept).\n * @param {string} fname The name to find.\n * @return {HTMLIFrameElement} The iframe element with that name.\n */\ngoog.net.IframeIo.getIframeByName = function(fname) {\n  return window.frames[fname];\n};\n\n\n/**\n * Find an instance of the IframeIo object by name.\n * @param {string} fname The name to find.\n * @return {goog.net.IframeIo} The instance of IframeIo.\n */\ngoog.net.IframeIo.getInstanceByName = function(fname) {\n  return goog.net.IframeIo.instances_[fname];\n};\n\n\n/**\n * Handles incremental data and routes it to the correct iframeIo instance.\n * The HTML page requested by the IframeIo instance should contain script blocks\n * that call an externed reference to this method.\n * @param {Window} win The window object.\n * @param {Object} data The data object.\n */\ngoog.net.IframeIo.handleIncrementalData = function(win, data) {\n  // If this is the inner-frame, then we need to use the parent instead.\n  var iframeName =\n      goog.string.endsWith(win.name, goog.net.IframeIo.INNER_FRAME_SUFFIX) ?\n      win.parent.name :\n      win.name;\n\n  var iframeIoName = iframeName.substring(0, iframeName.lastIndexOf('_'));\n  var iframeIo = goog.net.IframeIo.getInstanceByName(iframeIoName);\n  if (iframeIo && iframeName == iframeIo.iframeName_) {\n    iframeIo.handleIncrementalData_(data);\n  } else {\n    var logger = goog.log.getLogger('goog.net.IframeIo');\n    goog.log.info(logger, 'Incremental iframe data routed for unknown iframe');\n  }\n};\n\n\n/**\n * @return {string} The next iframe name.\n * @private\n */\ngoog.net.IframeIo.getNextName_ = function() {\n  return goog.net.IframeIo.FRAME_NAME_PREFIX + goog.net.IframeIo.counter_++;\n};\n\n\n/**\n * Gets a static form, one for all instances of IframeIo since IE6 leaks form\n * nodes that are created/removed from the document.\n * @return {!HTMLFormElement} The static form.\n * @private\n */\ngoog.net.IframeIo.getForm_ = function() {\n  if (!goog.net.IframeIo.form_) {\n    goog.net.IframeIo.form_ = goog.dom.createDom(goog.dom.TagName.FORM);\n    goog.net.IframeIo.form_.acceptCharset = 'utf-8';\n\n    // Hide the form and move it off screen\n    var s = goog.net.IframeIo.form_.style;\n    s.position = 'absolute';\n    s.visibility = 'hidden';\n    s.top = s.left = '-10px';\n    s.width = s.height = '10px';\n    s.overflow = 'hidden';\n\n    goog.dom.getDocument().body.appendChild(goog.net.IframeIo.form_);\n  }\n  return goog.net.IframeIo.form_;\n};\n\n\n/**\n * Adds the key value pairs from a map like data structure to a form\n * @param {HTMLFormElement} form The form to add to.\n * @param {Object|goog.structs.Map|goog.Uri.QueryData} data The data to add.\n * @private\n */\ngoog.net.IframeIo.addFormInputs_ = function(form, data) {\n  var helper = goog.dom.getDomHelper(form);\n  goog.structs.forEach(data, function(value, key) {\n    if (!goog.isArray(value)) {\n      value = [value];\n    }\n    goog.array.forEach(value, function(value) {\n      var inp = helper.createDom(\n          goog.dom.TagName.INPUT,\n          {'type': goog.dom.InputType.HIDDEN, 'name': key, 'value': value});\n      form.appendChild(inp);\n    });\n  });\n};\n\n\n/**\n * @return {boolean} Whether we can use readyState to monitor iframe loading.\n * @private\n */\ngoog.net.IframeIo.useIeReadyStateCodePath_ = function() {\n  // ReadyState is only available on iframes up to IE10.\n  return goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('11');\n};\n\n\n/**\n * Reference to a logger for the IframeIo objects\n * @type {goog.log.Logger}\n * @private\n */\ngoog.net.IframeIo.prototype.logger_ = goog.log.getLogger('goog.net.IframeIo');\n\n\n/**\n * Reference to form element that gets reused for requests to the iframe.\n * @type {?HTMLFormElement}\n * @private\n */\ngoog.net.IframeIo.prototype.form_ = null;\n\n\n/**\n * Reference to the iframe being used for the current request, or null if no\n * request is currently active.\n * @type {?HTMLIFrameElement}\n * @private\n */\ngoog.net.IframeIo.prototype.iframe_ = null;\n\n\n/**\n * Name of the iframe being used for the current request, or null if no\n * request is currently active.\n * @type {?string}\n * @private\n */\ngoog.net.IframeIo.prototype.iframeName_ = null;\n\n\n/**\n * Next id so that iframe names are unique.\n * @type {number}\n * @private\n */\ngoog.net.IframeIo.prototype.nextIframeId_ = 0;\n\n\n/**\n * Whether the object is currently active with a request.\n * @type {boolean}\n * @private\n */\ngoog.net.IframeIo.prototype.active_ = false;\n\n\n/**\n * Whether the last request is complete.\n * @type {boolean}\n * @private\n */\ngoog.net.IframeIo.prototype.complete_ = false;\n\n\n/**\n * Whether the last request was a success.\n * @type {boolean}\n * @private\n */\ngoog.net.IframeIo.prototype.success_ = false;\n\n\n/**\n * The URI for the last request.\n * @type {?goog.Uri}\n * @private\n */\ngoog.net.IframeIo.prototype.lastUri_ = null;\n\n\n/**\n * The text content of the last request.\n * @type {?string}\n * @private\n */\ngoog.net.IframeIo.prototype.lastContent_ = null;\n\n\n/**\n * Last error code\n * @type {goog.net.ErrorCode}\n * @private\n */\ngoog.net.IframeIo.prototype.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR;\n\n\n/**\n * Window timeout ID used to detect when firefox silently fails.\n * @type {?number}\n * @private\n */\ngoog.net.IframeIo.prototype.firefoxSilentErrorTimeout_ = null;\n\n\n/**\n * Window timeout ID used by the timer that disposes the iframes.\n * @type {?number}\n * @private\n */\ngoog.net.IframeIo.prototype.iframeDisposalTimer_ = null;\n\n\n/**\n * This is used to ensure that we don't handle errors twice for the same error.\n * We can reach the {@link #handleError_} method twice in IE if the form is\n * submitted while IE is offline and the URL is not available.\n * @type {boolean}\n * @private\n */\ngoog.net.IframeIo.prototype.errorHandled_;\n\n\n/**\n * Whether to suppress the listeners that determine when the iframe loads.\n * @type {boolean}\n * @private\n */\ngoog.net.IframeIo.prototype.ignoreResponse_ = false;\n\n\n/** @private {Function} */\ngoog.net.IframeIo.prototype.errorChecker_;\n\n\n/** @private {Object} */\ngoog.net.IframeIo.prototype.lastCustomError_;\n\n\n/** @private {?string} */\ngoog.net.IframeIo.prototype.lastContentHtml_;\n\n\n/**\n * Sends a request via an iframe.\n *\n * A HTML form is used and submitted to the iframe, this simplifies the\n * difference between GET and POST requests. The iframe needs to be created and\n * destroyed for each request otherwise the request will contribute to the\n * history stack.\n *\n * sendFromForm does some clever trickery (thanks jlim) in non-IE browsers to\n * stop a history entry being added for POST requests.\n *\n * @param {goog.Uri|string} uri Uri of the request.\n * @param {string=} opt_method Default is GET, POST uses a form to submit the\n *     request.\n * @param {boolean=} opt_noCache Append a timestamp to the request to avoid\n *     caching.\n * @param {Object|goog.structs.Map=} opt_data Map of key-value pairs.\n */\ngoog.net.IframeIo.prototype.send = function(\n    uri, opt_method, opt_noCache, opt_data) {\n\n  if (this.active_) {\n    throw new Error('[goog.net.IframeIo] Unable to send, already active.');\n  }\n\n  var uriObj = new goog.Uri(uri);\n  this.lastUri_ = uriObj;\n  var method = opt_method ? opt_method.toUpperCase() : 'GET';\n\n  if (opt_noCache) {\n    uriObj.makeUnique();\n  }\n\n  goog.log.info(\n      this.logger_, 'Sending iframe request: ' + uriObj + ' [' + method + ']');\n\n  // Build a form for this request\n  this.form_ = goog.net.IframeIo.getForm_();\n\n  if (method == 'GET') {\n    // For GET requests, we assume that the caller didn't want the queryparams\n    // already specified in the URI to be clobbered by the form, so we add the\n    // params here.\n    goog.net.IframeIo.addFormInputs_(this.form_, uriObj.getQueryData());\n  }\n\n  if (opt_data) {\n    // Create form fields for each of the data values\n    goog.net.IframeIo.addFormInputs_(this.form_, opt_data);\n  }\n\n  // Set the URI that the form will be posted\n  goog.dom.safe.setFormElementAction(\n      this.form_,\n      goog.html.legacyconversions.safeUrlFromString(uriObj.toString()));\n  this.form_.method = method;\n\n  this.sendFormInternal_();\n  this.clearForm_();\n};\n\n\n/**\n * Sends the data stored in an existing form to the server. The HTTP method\n * should be specified on the form, the action can also be specified but can\n * be overridden by the optional URI param.\n *\n * This can be used in conjunction will a file-upload input to upload a file in\n * the background without affecting history.\n *\n * Example form:\n * <pre>\n *   &lt;form action=\"/server/\" enctype=\"multipart/form-data\" method=\"POST\"&gt;\n *     &lt;input name=\"userfile\" type=\"file\"&gt;\n *   &lt;/form&gt;\n * </pre>\n *\n * @param {HTMLFormElement} form Form element used to send the request to the\n *     server.\n * @param {string=} opt_uri Uri to set for the destination of the request, by\n *     default the uri will come from the form.\n * @param {boolean=} opt_noCache Append a timestamp to the request to avoid\n *     caching.\n */\ngoog.net.IframeIo.prototype.sendFromForm = function(\n    form, opt_uri, opt_noCache) {\n  if (this.active_) {\n    throw new Error('[goog.net.IframeIo] Unable to send, already active.');\n  }\n\n  var uri = new goog.Uri(opt_uri || form.action);\n  if (opt_noCache) {\n    uri.makeUnique();\n  }\n\n  goog.log.info(this.logger_, 'Sending iframe request from form: ' + uri);\n\n  this.lastUri_ = uri;\n  this.form_ = form;\n  goog.dom.safe.setFormElementAction(\n      goog.asserts.assert(this.form_), uri.toString());\n  this.sendFormInternal_();\n};\n\n\n/**\n * Abort the current Iframe request\n * @param {goog.net.ErrorCode=} opt_failureCode Optional error code to use -\n *     defaults to ABORT.\n */\ngoog.net.IframeIo.prototype.abort = function(opt_failureCode) {\n  if (this.active_) {\n    goog.log.info(this.logger_, 'Request aborted');\n    var requestIframe = this.getRequestIframe();\n    goog.asserts.assert(requestIframe);\n    goog.events.removeAll(requestIframe);\n    this.complete_ = false;\n    this.active_ = false;\n    this.success_ = false;\n    this.lastErrorCode_ = opt_failureCode || goog.net.ErrorCode.ABORT;\n\n    this.dispatchEvent(goog.net.EventType.ABORT);\n\n    this.makeReady_();\n  }\n};\n\n\n/** @override */\ngoog.net.IframeIo.prototype.disposeInternal = function() {\n  goog.log.fine(this.logger_, 'Disposing iframeIo instance');\n\n  // If there is an active request, abort it\n  if (this.active_) {\n    goog.log.fine(this.logger_, 'Aborting active request');\n    this.abort();\n  }\n\n  // Call super-classes implementation (remove listeners)\n  goog.net.IframeIo.superClass_.disposeInternal.call(this);\n\n  // Add the current iframe to the list of iframes for disposal.\n  if (this.iframe_) {\n    this.scheduleIframeDisposal_();\n  }\n\n  // Disposes of the form\n  this.disposeForm_();\n\n  // Nullify anything that might cause problems and clear state\n  delete this.errorChecker_;\n  this.form_ = null;\n  this.lastCustomError_ = this.lastContent_ = this.lastContentHtml_ = null;\n  this.lastUri_ = null;\n  this.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR;\n\n  delete goog.net.IframeIo.instances_[this.name_];\n};\n\n\n/**\n * @return {boolean} True if transfer is complete.\n */\ngoog.net.IframeIo.prototype.isComplete = function() {\n  return this.complete_;\n};\n\n\n/**\n * @return {boolean} True if transfer was successful.\n */\ngoog.net.IframeIo.prototype.isSuccess = function() {\n  return this.success_;\n};\n\n\n/**\n * @return {boolean} True if a transfer is in progress.\n */\ngoog.net.IframeIo.prototype.isActive = function() {\n  return this.active_;\n};\n\n\n/**\n * Returns the last response text (i.e. the text content of the iframe).\n * Assumes plain text!\n * @return {?string} Result from the server.\n */\ngoog.net.IframeIo.prototype.getResponseText = function() {\n  return this.lastContent_;\n};\n\n\n/**\n * Returns the last response html (i.e. the innerHtml of the iframe).\n * @return {?string} Result from the server.\n */\ngoog.net.IframeIo.prototype.getResponseHtml = function() {\n  return this.lastContentHtml_;\n};\n\n\n/**\n * Parses the content as JSON. This is a legacy method for browsers without\n * JSON.parse or for responses that are not valid JSON (e.g. containing NaN).\n * Use JSON.parse(this.getResponseText()) in the other cases.\n * @return {Object} The parsed content.\n */\ngoog.net.IframeIo.prototype.getResponseJson = function() {\n  return goog.json.parse(this.lastContent_);\n};\n\n\n/**\n * Returns the document object from the last request.  Not truly XML, but\n * used to mirror the XhrIo interface.\n * @return {HTMLDocument} The document object from the last request.\n */\ngoog.net.IframeIo.prototype.getResponseXml = function() {\n  if (!this.iframe_) return null;\n\n  return this.getContentDocument_();\n};\n\n\n/**\n * Get the uri of the last request.\n * @return {goog.Uri} Uri of last request.\n */\ngoog.net.IframeIo.prototype.getLastUri = function() {\n  return this.lastUri_;\n};\n\n\n/**\n * Gets the last error code.\n * @return {goog.net.ErrorCode} Last error code.\n */\ngoog.net.IframeIo.prototype.getLastErrorCode = function() {\n  return this.lastErrorCode_;\n};\n\n\n/**\n * Gets the last error message.\n * @return {string} Last error message.\n */\ngoog.net.IframeIo.prototype.getLastError = function() {\n  return goog.net.ErrorCode.getDebugMessage(this.lastErrorCode_);\n};\n\n\n/**\n * Gets the last custom error.\n * @return {Object} Last custom error.\n */\ngoog.net.IframeIo.prototype.getLastCustomError = function() {\n  return this.lastCustomError_;\n};\n\n\n/**\n * Sets the callback function used to check if a loaded IFrame is in an error\n * state.\n * @param {Function} fn Callback that expects a document object as it's single\n *     argument.\n */\ngoog.net.IframeIo.prototype.setErrorChecker = function(fn) {\n  this.errorChecker_ = fn;\n};\n\n\n/**\n * Gets the callback function used to check if a loaded IFrame is in an error\n * state.\n * @return {Function} A callback that expects a document object as it's single\n *     argument.\n */\ngoog.net.IframeIo.prototype.getErrorChecker = function() {\n  return this.errorChecker_;\n};\n\n\n/**\n * @return {boolean} Whether the server response is being ignored.\n */\ngoog.net.IframeIo.prototype.isIgnoringResponse = function() {\n  return this.ignoreResponse_;\n};\n\n\n/**\n * Sets whether to ignore the response from the server by not adding any event\n * handlers to fire when the iframe loads. This is necessary when using IframeIo\n * to submit to a server on another domain, to avoid same-origin violations when\n * trying to access the response. If this is set to true, the IframeIo instance\n * will be a single-use instance that is only usable for one request.  It will\n * only clean up its resources (iframes and forms) when it is disposed.\n * @param {boolean} ignore Whether to ignore the server response.\n */\ngoog.net.IframeIo.prototype.setIgnoreResponse = function(ignore) {\n  this.ignoreResponse_ = ignore;\n};\n\n\n/**\n * Submits the internal form to the iframe.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.net.IframeIo.prototype.sendFormInternal_ = function() {\n  this.active_ = true;\n  this.complete_ = false;\n  this.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR;\n\n  // Make Iframe\n  this.createIframe_();\n\n  if (goog.net.IframeIo.useIeReadyStateCodePath_()) {\n    // In IE<11 we simply create the frame, wait until it is ready, then post\n    // the form to the iframe and wait for the readystate to change to\n    // 'complete'\n\n    // Set the target to the iframe's name\n    this.form_.target = this.iframeName_ || '';\n    this.appendIframe_();\n    if (!this.ignoreResponse_) {\n      goog.events.listen(\n          this.iframe_, goog.events.EventType.READYSTATECHANGE,\n          this.onIeReadyStateChange_, false, this);\n    }\n\n\n    try {\n      this.errorHandled_ = false;\n      this.form_.submit();\n    } catch (e) {\n      // If submit threw an exception then it probably means the page that the\n      // code is running on the local file system and the form's action was\n      // pointing to a file that doesn't exist, causing the browser to fire an\n      // exception.  IE also throws an exception when it is working offline and\n      // the URL is not available.\n\n      if (!this.ignoreResponse_) {\n        goog.events.unlisten(\n            this.iframe_, goog.events.EventType.READYSTATECHANGE,\n            this.onIeReadyStateChange_, false, this);\n      }\n\n      this.handleError_(goog.net.ErrorCode.ACCESS_DENIED);\n    }\n\n  } else {\n    // For all other browsers we do some trickery to ensure that there is no\n    // entry on the history stack. Thanks go to jlim for the prototype for this\n\n    goog.log.fine(this.logger_, 'Setting up iframes and cloning form');\n\n    this.appendIframe_();\n\n    var innerFrameName =\n        this.iframeName_ + goog.net.IframeIo.INNER_FRAME_SUFFIX;\n\n    // Open and document.write another iframe into the iframe\n    var doc = goog.dom.getFrameContentDocument(this.iframe_);\n    var html;\n    if (document.baseURI) {\n      // On Safari 4 and 5 the new iframe doesn't inherit the current baseURI.\n      html = goog.net.IframeIo.createIframeHtmlWithBaseUri_(innerFrameName);\n    } else {\n      html = goog.net.IframeIo.createIframeHtml_(innerFrameName);\n    }\n    if (goog.userAgent.OPERA && !goog.userAgent.WEBKIT) {\n      // Presto based Opera adds a history entry when document.write is used.\n      // Change the innerHTML of the page instead.\n      goog.dom.safe.setInnerHtml(doc.documentElement, html);\n    } else {\n      goog.dom.safe.documentWrite(doc, html);\n    }\n\n    // Listen for the iframe's load\n    if (!this.ignoreResponse_) {\n      goog.events.listen(\n          doc.getElementById(innerFrameName), goog.events.EventType.LOAD,\n          this.onIframeLoaded_, false, this);\n    }\n\n    // Fix text areas, since importNode won't clone changes to the value\n    var textareas = goog.dom.getElementsByTagName(\n        goog.dom.TagName.TEXTAREA, goog.asserts.assert(this.form_));\n    for (var i = 0, n = textareas.length; i < n; i++) {\n      // The childnodes represent the initial child nodes for the text area\n      // appending a text node essentially resets the initial value ready for\n      // it to be clones - while maintaining HTML escaping.\n      var value = textareas[i].value;\n      if (goog.dom.getRawTextContent(textareas[i]) != value) {\n        goog.dom.setTextContent(textareas[i], value);\n        textareas[i].value = value;\n      }\n    }\n\n    // Append a cloned form to the iframe\n    var clone = doc.importNode(goog.asserts.assert(this.form_), true);\n    clone.target = innerFrameName;\n    // Work around crbug.com/66987\n    clone.action = this.form_.action;\n    doc.body.appendChild(clone);\n\n    // Fix select boxes, importNode won't override the default value\n    var selects = goog.dom.getElementsByTagName(\n        goog.dom.TagName.SELECT, goog.asserts.assert(this.form_));\n    var clones = goog.dom.getElementsByTagName(\n        goog.dom.TagName.SELECT, /** @type {!Element} */ (clone));\n    for (var i = 0, n = selects.length; i < n; i++) {\n      var selectsOptions =\n          goog.dom.getElementsByTagName(goog.dom.TagName.OPTION, selects[i]);\n      var clonesOptions =\n          goog.dom.getElementsByTagName(goog.dom.TagName.OPTION, clones[i]);\n      for (var j = 0, m = selectsOptions.length; j < m; j++) {\n        clonesOptions[j].selected = selectsOptions[j].selected;\n      }\n    }\n\n    // IE and some versions of Firefox (1.5 - 1.5.07?) fail to clone the value\n    // attribute for <input type=\"file\"> nodes, which results in an empty\n    // upload if the clone is submitted.  Check, and if the clone failed, submit\n    // using the original form instead.\n    var inputs = goog.dom.getElementsByTagName(\n        goog.dom.TagName.INPUT, goog.asserts.assert(this.form_));\n    var inputClones = goog.dom.getElementsByTagName(\n        goog.dom.TagName.INPUT, /** @type {!Element} */ (clone));\n    for (var i = 0, n = inputs.length; i < n; i++) {\n      if (inputs[i].type == goog.dom.InputType.FILE) {\n        if (inputs[i].value != inputClones[i].value) {\n          goog.log.fine(\n              this.logger_, 'File input value not cloned properly.  Will ' +\n                  'submit using original form.');\n          this.form_.target = innerFrameName;\n          clone = this.form_;\n          break;\n        }\n      }\n    }\n\n    goog.log.fine(this.logger_, 'Submitting form');\n\n\n    try {\n      this.errorHandled_ = false;\n      clone.submit();\n      doc.close();\n\n      if (goog.userAgent.GECKO) {\n        // This tests if firefox silently fails, this can happen, for example,\n        // when the server resets the connection because of a large file upload\n        this.firefoxSilentErrorTimeout_ =\n            goog.Timer.callOnce(this.testForFirefoxSilentError_, 250, this);\n      }\n\n    } catch (e) {\n      // If submit threw an exception then it probably means the page that the\n      // code is running on the local file system and the form's action was\n      // pointing to a file that doesn't exist, causing the browser to fire an\n      // exception.\n\n      goog.log.error(\n          this.logger_,\n          'Error when submitting form: ' +\n              goog.debug.HtmlFormatter.exposeException(e));\n\n      if (!this.ignoreResponse_) {\n        goog.events.unlisten(\n            doc.getElementById(innerFrameName), goog.events.EventType.LOAD,\n            this.onIframeLoaded_, false, this);\n      }\n\n      doc.close();\n\n      this.handleError_(goog.net.ErrorCode.FILE_NOT_FOUND);\n    }\n  }\n};\n\n\n/**\n * @param {string} innerFrameName\n * @return {!goog.html.SafeHtml}\n * @private\n */\ngoog.net.IframeIo.createIframeHtml_ = function(innerFrameName) {\n  var innerFrameNameEscaped = goog.string.htmlEscape(innerFrameName);\n  return goog.html.uncheckedconversions\n      .safeHtmlFromStringKnownToSatisfyTypeContract(\n          goog.string.Const.from(\n              'Short HTML snippet, input escaped, for performance'),\n          '<body><iframe id=\"' + innerFrameNameEscaped + '\" name=\"' +\n              innerFrameNameEscaped + '\"></iframe>');\n};\n\n\n/**\n * @param {string} innerFrameName\n * @return {!goog.html.SafeHtml}\n * @private\n */\ngoog.net.IframeIo.createIframeHtmlWithBaseUri_ = function(innerFrameName) {\n  var innerFrameNameEscaped = goog.string.htmlEscape(innerFrameName);\n  return goog.html.uncheckedconversions\n      .safeHtmlFromStringKnownToSatisfyTypeContract(\n          goog.string.Const.from(\n              'Short HTML snippet, input escaped, safe URL, for performance'),\n          '<head><base href=\"' +\n              goog.string.htmlEscape(/** @type {string} */ (document.baseURI)) +\n              '\"></head>' +\n              '<body><iframe id=\"' + innerFrameNameEscaped + '\" name=\"' +\n              innerFrameNameEscaped + '\"></iframe>');\n};\n\n\n/**\n * Handles the load event of the iframe for IE, determines if the request was\n * successful or not, handles clean up and dispatching of appropriate events.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.net.IframeIo.prototype.onIeReadyStateChange_ = function(e) {\n  if (this.iframe_.readyState == 'complete') {\n    goog.events.unlisten(\n        this.iframe_, goog.events.EventType.READYSTATECHANGE,\n        this.onIeReadyStateChange_, false, this);\n    var doc;\n\n    try {\n      doc = goog.dom.getFrameContentDocument(this.iframe_);\n\n      // IE serves about:blank when it cannot load the resource while offline.\n      if (goog.userAgent.IE && doc.location == 'about:blank' &&\n          !navigator.onLine) {\n        this.handleError_(goog.net.ErrorCode.OFFLINE);\n        return;\n      }\n    } catch (ex) {\n      this.handleError_(goog.net.ErrorCode.ACCESS_DENIED);\n      return;\n    }\n    this.handleLoad_(/** @type {!HTMLDocument} */ (doc));\n  }\n};\n\n\n/**\n * Handles the load event of the iframe for non-IE browsers.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.net.IframeIo.prototype.onIframeLoaded_ = function(e) {\n  // In Presto based Opera, the default \"about:blank\" page of iframes fires an\n  // onload event that we'd like to ignore.\n  if (goog.userAgent.OPERA && !goog.userAgent.WEBKIT &&\n      this.getContentDocument_().location == 'about:blank') {\n    return;\n  }\n  goog.events.unlisten(\n      this.getRequestIframe(), goog.events.EventType.LOAD, this.onIframeLoaded_,\n      false, this);\n  try {\n    this.handleLoad_(this.getContentDocument_());\n  } catch (ex) {\n    this.handleError_(goog.net.ErrorCode.ACCESS_DENIED);\n  }\n};\n\n\n/**\n * Handles generic post-load\n * @param {HTMLDocument} contentDocument The frame's document.\n * @private\n */\ngoog.net.IframeIo.prototype.handleLoad_ = function(contentDocument) {\n  goog.log.fine(this.logger_, 'Iframe loaded');\n\n  this.complete_ = true;\n  this.active_ = false;\n\n  var errorCode;\n\n  // Try to get the innerHTML.  If this fails then it can be an access denied\n  // error or the document may just not have a body, typical case is if there\n  // is an IE's default 404.\n\n  try {\n    var body = contentDocument.body;\n    this.lastContent_ = body.textContent || body.innerText;\n    this.lastContentHtml_ = body.innerHTML;\n  } catch (ex) {\n    errorCode = goog.net.ErrorCode.ACCESS_DENIED;\n  }\n\n  // Use a callback function, defined by the application, to analyse the\n  // contentDocument and determine if it is an error page.  Applications\n  // may send down markers in the document, define JS vars, or some other test.\n  var customError;\n  if (!errorCode && typeof this.errorChecker_ == 'function') {\n    customError = this.errorChecker_(contentDocument);\n    if (customError) {\n      errorCode = goog.net.ErrorCode.CUSTOM_ERROR;\n    }\n  }\n\n  goog.log.log(\n      this.logger_, goog.log.Level.FINER, 'Last content: ' + this.lastContent_);\n  goog.log.log(\n      this.logger_, goog.log.Level.FINER, 'Last uri: ' + this.lastUri_);\n\n  if (errorCode) {\n    goog.log.fine(this.logger_, 'Load event occurred but failed');\n    this.handleError_(errorCode, customError);\n\n  } else {\n    goog.log.fine(this.logger_, 'Load succeeded');\n    this.success_ = true;\n    this.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR;\n    this.dispatchEvent(goog.net.EventType.COMPLETE);\n    this.dispatchEvent(goog.net.EventType.SUCCESS);\n\n    this.makeReady_();\n  }\n};\n\n\n/**\n * Handles errors.\n * @param {goog.net.ErrorCode} errorCode Error code.\n * @param {Object=} opt_customError If error is CUSTOM_ERROR, this is the\n *     client-provided custom error.\n * @private\n */\ngoog.net.IframeIo.prototype.handleError_ = function(\n    errorCode, opt_customError) {\n  if (!this.errorHandled_) {\n    this.success_ = false;\n    this.active_ = false;\n    this.complete_ = true;\n    this.lastErrorCode_ = errorCode;\n    if (errorCode == goog.net.ErrorCode.CUSTOM_ERROR) {\n      goog.asserts.assert(opt_customError !== undefined);\n      this.lastCustomError_ = opt_customError;\n    }\n    this.dispatchEvent(goog.net.EventType.COMPLETE);\n    this.dispatchEvent(goog.net.EventType.ERROR);\n\n    this.makeReady_();\n\n    this.errorHandled_ = true;\n  }\n};\n\n\n/**\n * Dispatches an event indicating that the IframeIo instance has received a data\n * packet via incremental loading.  The event object has a 'data' member.\n * @param {Object} data Data.\n * @private\n */\ngoog.net.IframeIo.prototype.handleIncrementalData_ = function(data) {\n  this.dispatchEvent(new goog.net.IframeIo.IncrementalDataEvent(data));\n};\n\n\n/**\n * Finalizes the request, schedules the iframe for disposal, and maybe disposes\n * the form.\n * @private\n */\ngoog.net.IframeIo.prototype.makeReady_ = function() {\n  goog.log.info(this.logger_, 'Ready for new requests');\n  this.scheduleIframeDisposal_();\n  this.disposeForm_();\n  this.dispatchEvent(goog.net.EventType.READY);\n};\n\n\n/**\n * Creates an iframe to be used with a request.  We use a new iframe for each\n * request so that requests don't create history entries.\n * @private\n */\ngoog.net.IframeIo.prototype.createIframe_ = function() {\n  goog.log.fine(this.logger_, 'Creating iframe');\n\n  this.iframeName_ = this.name_ + '_' + (this.nextIframeId_++).toString(36);\n\n  var dom = goog.dom.getDomHelper(this.form_);\n  this.iframe_ = dom.createDom(\n      goog.dom.TagName.IFRAME,\n      {'name': this.iframeName_, 'id': this.iframeName_});\n\n  // Setting the source to javascript:\"\" is a fix to remove IE6 mixed content\n  // warnings when being used in an https page.\n  if (goog.userAgent.IE && Number(goog.userAgent.VERSION) < 7) {\n    goog.dom.safe.setFormElementAction(\n        this.iframe_,\n        goog.html.SafeUrl.fromConstant(\n            goog.string.Const.from('javascript:\"\"')));\n  }\n\n  var s = this.iframe_.style;\n  s.visibility = 'hidden';\n  s.width = s.height = '10px';\n  // Chrome sometimes shows scrollbars when visibility is hidden, but not when\n  // display is none.\n  s.display = 'none';\n\n  // There are reports that safari 2.0.3 has a bug where absolutely positioned\n  // iframes can't have their src set.\n  if (!goog.userAgent.WEBKIT) {\n    s.position = 'absolute';\n    s.top = s.left = '-10px';\n  } else {\n    s.marginTop = s.marginLeft = '-10px';\n  }\n};\n\n\n/**\n * Appends the Iframe to the document body.\n * @private\n */\ngoog.net.IframeIo.prototype.appendIframe_ = function() {\n  goog.dom.getDomHelper(this.form_)\n      .getDocument()\n      .body.appendChild(this.iframe_);\n};\n\n\n/**\n * Schedules an iframe for disposal, async.  We can't remove the iframes in the\n * same execution context as the response, otherwise some versions of Firefox\n * will not detect that the response has correctly finished and the loading bar\n * will stay active forever.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.net.IframeIo.prototype.scheduleIframeDisposal_ = function() {\n  var iframe = this.iframe_;\n\n  // There shouldn't be a case where the iframe is null and we get to this\n  // stage, but the error reports in http://b/909448 indicate it is possible.\n  if (iframe) {\n    // NOTE(user): Stops Internet Explorer leaking the iframe object. This\n    // shouldn't be needed, since the events have all been removed, which\n    // should in theory clean up references.  Oh well...\n    iframe.onreadystatechange = null;\n    iframe.onload = null;\n    iframe.onerror = null;\n\n    this.iframesForDisposal_.push(iframe);\n  }\n\n  if (this.iframeDisposalTimer_) {\n    goog.Timer.clear(this.iframeDisposalTimer_);\n    this.iframeDisposalTimer_ = null;\n  }\n\n  if (goog.userAgent.GECKO ||\n      (goog.userAgent.OPERA && !goog.userAgent.WEBKIT)) {\n    // For FF and Presto Opera, we must dispose the iframe async,\n    // but it doesn't need to be done as soon as possible.\n    // We therefore schedule it for 2s out, so as not to\n    // affect any other actions that may have been triggered by the request.\n    this.iframeDisposalTimer_ = goog.Timer.callOnce(\n        this.disposeIframes_, goog.net.IframeIo.IFRAME_DISPOSE_DELAY_MS, this);\n\n  } else {\n    // For non-Gecko browsers we dispose straight away.\n    this.disposeIframes_();\n  }\n\n  // Nullify reference\n  this.iframe_ = null;\n  this.iframeName_ = null;\n};\n\n\n/**\n * Disposes any iframes.\n * @private\n */\ngoog.net.IframeIo.prototype.disposeIframes_ = function() {\n  if (this.iframeDisposalTimer_) {\n    // Clear the timer\n    goog.Timer.clear(this.iframeDisposalTimer_);\n    this.iframeDisposalTimer_ = null;\n  }\n\n  while (this.iframesForDisposal_.length != 0) {\n    var iframe = this.iframesForDisposal_.pop();\n    goog.log.info(this.logger_, 'Disposing iframe');\n    goog.dom.removeNode(iframe);\n  }\n};\n\n\n/**\n * Removes all the child nodes from the static form so it can be reused again.\n * This should happen right after sending a request. Otherwise, there can be\n * issues when another iframe uses this form right after the first iframe.\n * @private\n */\ngoog.net.IframeIo.prototype.clearForm_ = function() {\n  if (this.form_ && this.form_ == goog.net.IframeIo.form_) {\n    goog.dom.removeChildren(this.form_);\n  }\n};\n\n\n/**\n * Disposes of the Form.  Since IE6 leaks form nodes, this just cleans up the\n * DOM and nullifies the instances reference so the form can be used for another\n * request.\n * @private\n */\ngoog.net.IframeIo.prototype.disposeForm_ = function() {\n  this.clearForm_();\n  this.form_ = null;\n};\n\n\n/**\n * @return {HTMLDocument} The appropriate content document.\n * @private\n */\ngoog.net.IframeIo.prototype.getContentDocument_ = function() {\n  if (this.iframe_) {\n    return /** @type {!HTMLDocument} */ (\n        goog.dom.getFrameContentDocument(this.getRequestIframe()));\n  }\n  return null;\n};\n\n\n/**\n * @return {HTMLIFrameElement} The appropriate iframe to use for requests\n *     (created in sendForm_).\n */\ngoog.net.IframeIo.prototype.getRequestIframe = function() {\n  if (this.iframe_) {\n    return /** @type {HTMLIFrameElement} */ (\n        goog.net.IframeIo.useIeReadyStateCodePath_() ?\n            this.iframe_ :\n            goog.dom.getFrameContentDocument(this.iframe_)\n                .getElementById(\n                    this.iframeName_ + goog.net.IframeIo.INNER_FRAME_SUFFIX));\n  }\n  return null;\n};\n\n\n/**\n * Tests for a silent failure by firefox that can occur when the connection is\n * reset by the server or is made to an illegal URL.\n * @private\n */\ngoog.net.IframeIo.prototype.testForFirefoxSilentError_ = function() {\n  if (this.active_) {\n    var doc = this.getContentDocument_();\n\n    // This is a hack to test of the document has loaded with a page that\n    // we can't access, such as a network error, that won't report onload\n    // or onerror events.\n    if (doc && !goog.reflect.canAccessProperty(doc, 'documentUri')) {\n      if (!this.ignoreResponse_) {\n        goog.events.unlisten(\n            this.getRequestIframe(), goog.events.EventType.LOAD,\n            this.onIframeLoaded_, false, this);\n      }\n\n      if (navigator.onLine) {\n        goog.log.warning(this.logger_, 'Silent Firefox error detected');\n        this.handleError_(goog.net.ErrorCode.FF_SILENT_ERROR);\n      } else {\n        goog.log.warning(\n            this.logger_, 'Firefox is offline so report offline error ' +\n                'instead of silent error');\n        this.handleError_(goog.net.ErrorCode.OFFLINE);\n      }\n      return;\n    }\n    this.firefoxSilentErrorTimeout_ =\n        goog.Timer.callOnce(this.testForFirefoxSilentError_, 250, this);\n  }\n};\n\n\n\n/**\n * Class for representing incremental data events.\n * @param {Object} data The data associated with the event.\n * @extends {goog.events.Event}\n * @constructor\n * @final\n */\ngoog.net.IframeIo.IncrementalDataEvent = function(data) {\n  goog.events.Event.call(this, goog.net.EventType.INCREMENTAL_DATA);\n\n  /**\n   * The data associated with the event.\n   * @type {Object}\n   */\n  this.data = data;\n};\ngoog.inherits(goog.net.IframeIo.IncrementalDataEvent, goog.events.Event);\n","^;",1579837703000,"^<",["^=",["^1L","^1>","^3O","~$goog.debug.HtmlFormatter","^4D","~$goog.reflect","^4O","^2L","^1U","^16","^2B","^?","^4H","^3W","^[","^18","^3Q","^19","^5:","^1C","~$goog.structs","^1E","^2Y","^2O","^1<","~$goog.net.ErrorCode","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/iframeio.js"],"^O",["^=",["~$goog.net.IframeIo","~$goog.net.IframeIo.IncrementalDataEvent"]],"^W",true,"^X",["^?","^3O","^16","^2O","^1L","^8:","^1>","^1U","^12","^1E","^1<","^2Y","^3W","^1C","^4D","^5:","^4H","^4O","^18","^2B","^8=","^19","^8;","^2L","^3Q","^8<","^["]],["^ ","^3",[1579837703000],"^4","goog.ui.prompt.js","^5",["^6","goog/ui/prompt.js"],"^7","goog/ui/prompt.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview DHTML prompt to replace javascript's prompt().\n *\n * @see ../demos/prompt.html\n */\n\n\ngoog.provide('goog.ui.Prompt');\n\ngoog.require('goog.Timer');\ngoog.require('goog.dom');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.functions');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Dialog');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Creates an object that represents a prompt (used in place of javascript's\n * prompt). The html structure of the prompt is the same as the layout for\n * dialog.js except for the addition of a text box which is placed inside the\n * \"Content area\" and has the default class-name 'modal-dialog-userInput'\n *\n * @param {string} promptTitle The title of the prompt.\n * @param {string|!goog.html.SafeHtml} promptBody The body of the prompt.\n *     String is treated as plain text and it will be HTML-escaped.\n * @param {Function} callback The function to call when the user selects Ok or\n *     Cancel. The function should expect a single argument which represents\n *     what the user entered into the prompt. If the user presses cancel, the\n *     value of the argument will be null.\n * @param {string=} opt_defaultValue Optional default value that should be in\n *     the text box when the prompt appears.\n * @param {string=} opt_class Optional prefix for the classes.\n * @param {boolean=} opt_useIframeForIE For IE, workaround windowed controls\n *     z-index issue by using a an iframe instead of a div for bg element.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper; see {@link\n *    goog.ui.Component} for semantics.\n * @constructor\n * @extends {goog.ui.Dialog}\n */\ngoog.ui.Prompt = function(\n    promptTitle, promptBody, callback, opt_defaultValue, opt_class,\n    opt_useIframeForIE, opt_domHelper) {\n  goog.ui.Prompt.base(\n      this, 'constructor', opt_class, opt_useIframeForIE, opt_domHelper);\n\n  /**\n   * The id of the input element.\n   * @type {string}\n   * @private\n   */\n  this.inputElementId_ = this.makeId('ie');\n\n  this.setTitle(promptTitle);\n\n  var label = goog.html.SafeHtml.create(\n      'label', {'for': this.inputElementId_},\n      goog.html.SafeHtml.htmlEscapePreservingNewlines(promptBody));\n  var br = goog.html.SafeHtml.BR;\n  this.setSafeHtmlContent(goog.html.SafeHtml.concat(label, br, br));\n\n  this.callback_ = callback;\n  this.defaultValue_ = (opt_defaultValue !== undefined) ? opt_defaultValue : '';\n\n  /** @desc label for a dialog button. */\n  var MSG_PROMPT_OK = goog.getMsg('OK');\n  /** @desc label for a dialog button. */\n  var MSG_PROMPT_CANCEL = goog.getMsg('Cancel');\n  var buttonSet = new goog.ui.Dialog.ButtonSet(opt_domHelper);\n  buttonSet.set(goog.ui.Dialog.DefaultButtonKeys.OK, MSG_PROMPT_OK, true);\n  buttonSet.set(\n      goog.ui.Dialog.DefaultButtonKeys.CANCEL, MSG_PROMPT_CANCEL, false, true);\n  this.setButtonSet(buttonSet);\n};\ngoog.inherits(goog.ui.Prompt, goog.ui.Dialog);\ngoog.tagUnsealableClass(goog.ui.Prompt);\n\n\n/**\n * Callback function which is invoked with the response to the prompt\n * @type {Function}\n * @private\n */\ngoog.ui.Prompt.prototype.callback_ = goog.nullFunction;\n\n\n/**\n * Default value to display in prompt window\n * @type {string}\n * @private\n */\ngoog.ui.Prompt.prototype.defaultValue_ = '';\n\n\n/**\n * Element in which user enters response (HTML <input> text box)\n * @type {?HTMLInputElement|?HTMLTextAreaElement}\n * @private\n */\ngoog.ui.Prompt.prototype.userInputEl_ = null;\n\n\n/**\n * Tracks whether the prompt is in the process of closing to prevent multiple\n * calls to the callback when the user presses enter.\n * @type {boolean}\n * @private\n */\ngoog.ui.Prompt.prototype.isClosing_ = false;\n\n\n/**\n * Number of rows in the user input element.\n * The default is 1 which means use an <input> element.\n * @type {number}\n * @private\n */\ngoog.ui.Prompt.prototype.rows_ = 1;\n\n\n/**\n * Number of cols in the user input element.\n * The default is 0 which means use browser default.\n * @type {number}\n * @private\n */\ngoog.ui.Prompt.prototype.cols_ = 0;\n\n\n/**\n * The input decorator function.\n * @type {?function(?Element)}\n * @private\n */\ngoog.ui.Prompt.prototype.inputDecoratorFn_ = null;\n\n\n/**\n * A validation function that takes a string and returns true if the string is\n * accepted, false otherwise.\n * @type {function(string):boolean}\n * @private\n */\ngoog.ui.Prompt.prototype.validationFn_ = goog.functions.TRUE;\n\n\n/**\n * Sets the validation function that takes a string and returns true if the\n * string is accepted, false otherwise.\n * @param {function(string): boolean} fn The validation function to use on user\n *     input.\n */\ngoog.ui.Prompt.prototype.setValidationFunction = function(fn) {\n  this.validationFn_ = fn;\n};\n\n\n/** @override */\ngoog.ui.Prompt.prototype.enterDocument = function() {\n  if (this.inputDecoratorFn_) {\n    this.inputDecoratorFn_(this.userInputEl_);\n  }\n  goog.ui.Prompt.superClass_.enterDocument.call(this);\n  this.getHandler().listen(\n      this, goog.ui.Dialog.EventType.SELECT, this.onPromptExit_);\n\n  this.getHandler().listen(\n      this.userInputEl_,\n      [goog.events.EventType.KEYUP, goog.events.EventType.CHANGE],\n      this.handleInputChanged_);\n};\n\n\n/**\n * @return {?HTMLInputElement|?HTMLTextAreaElement} The user input element. May\n *     be null if the Prompt has not been rendered.\n */\ngoog.ui.Prompt.prototype.getInputElement = function() {\n  return this.userInputEl_;\n};\n\n\n/**\n * Sets an input decorator function.  This function will be called in\n * #enterDocument and will be passed the input element.  This is useful for\n * attaching handlers to the input element for specific change events,\n * for example.\n * @param {function(Element)} inputDecoratorFn A function to call on the input\n *     element on #enterDocument.\n */\ngoog.ui.Prompt.prototype.setInputDecoratorFn = function(inputDecoratorFn) {\n  this.inputDecoratorFn_ = inputDecoratorFn;\n};\n\n\n/**\n * Set the number of rows in the user input element.\n * A values of 1 means use an `<input>` element.  If the prompt is already\n * rendered then you cannot change from `<input>` to `<textarea>` or vice versa.\n * @param {number} rows Number of rows for user input element.\n * @throws {goog.ui.Component.Error.ALREADY_RENDERED} If the component is\n *    already rendered and an attempt to change between `<input>` and\n *    `<textarea>` is made.\n */\ngoog.ui.Prompt.prototype.setRows = function(rows) {\n  if (this.isInDocument()) {\n    if (this.userInputEl_.tagName == goog.dom.TagName.INPUT) {\n      if (rows > 1) {\n        throw new Error(goog.ui.Component.Error.ALREADY_RENDERED);\n      }\n    } else {\n      if (rows <= 1) {\n        throw new Error(goog.ui.Component.Error.ALREADY_RENDERED);\n      }\n      this.userInputEl_.rows = rows;\n    }\n  }\n  this.rows_ = rows;\n};\n\n\n/**\n * @return {number} The number of rows in the user input element.\n */\ngoog.ui.Prompt.prototype.getRows = function() {\n  return this.rows_;\n};\n\n\n/**\n * Set the number of cols in the user input element.\n * @param {number} cols Number of cols for user input element.\n */\ngoog.ui.Prompt.prototype.setCols = function(cols) {\n  this.cols_ = cols;\n  if (this.userInputEl_) {\n    if (this.userInputEl_.tagName == goog.dom.TagName.INPUT) {\n      this.userInputEl_.size = cols;\n    } else {\n      this.userInputEl_.cols = cols;\n    }\n  }\n};\n\n\n/**\n * @return {number} The number of cols in the user input element.\n */\ngoog.ui.Prompt.prototype.getCols = function() {\n  return this.cols_;\n};\n\n\n/**\n * Create the initial DOM representation for the prompt.\n * @override\n */\ngoog.ui.Prompt.prototype.createDom = function() {\n  goog.ui.Prompt.superClass_.createDom.call(this);\n\n  var cls = this.getClass();\n\n  // add input box to the content\n  if (this.rows_ == 1) {\n    // If rows == 1 then use an input element.\n    this.userInputEl_ = this.getDomHelper().createDom(goog.dom.TagName.INPUT, {\n      'className': goog.getCssName(cls, 'userInput'),\n      'value': this.defaultValue_\n    });\n    this.userInputEl_.type = goog.dom.InputType.TEXT;\n    if (this.cols_) {\n      this.userInputEl_.size = this.cols_;\n    }\n  } else {\n    // If rows > 1 then use a textarea.\n    this.userInputEl_ =\n        this.getDomHelper().createDom(goog.dom.TagName.TEXTAREA, {\n          'className': goog.getCssName(cls, 'userInput'),\n          'value': this.defaultValue_\n        });\n    this.userInputEl_.rows = this.rows_;\n    if (this.cols_) {\n      this.userInputEl_.cols = this.cols_;\n    }\n  }\n\n  this.userInputEl_.id = this.inputElementId_;\n  var contentEl = this.getContentElement();\n  contentEl.appendChild(\n      this.getDomHelper().createDom(\n          goog.dom.TagName.DIV, {'style': 'overflow: auto'},\n          this.userInputEl_));\n};\n\n\n/**\n * Handles input change events on the input field.  Disables the OK button if\n * validation fails on the new input value.\n * @private\n */\ngoog.ui.Prompt.prototype.handleInputChanged_ = function() {\n  this.updateOkButtonState_();\n};\n\n\n/**\n * Set OK button enabled/disabled state based on input.\n * @private\n */\ngoog.ui.Prompt.prototype.updateOkButtonState_ = function() {\n  var enableOkButton = this.validationFn_(this.userInputEl_.value);\n  var buttonSet = this.getButtonSet();\n  buttonSet.setButtonEnabled(\n      goog.ui.Dialog.DefaultButtonKeys.OK, enableOkButton);\n};\n\n\n/**\n * Causes the prompt to appear, centered on the screen, gives focus\n * to the text box, and selects the text\n * @param {boolean} visible Whether the dialog should be visible.\n * @override\n */\ngoog.ui.Prompt.prototype.setVisible = function(visible) {\n  goog.ui.Prompt.base(this, 'setVisible', visible);\n\n  if (visible) {\n    this.isClosing_ = false;\n    this.userInputEl_.value = this.defaultValue_;\n    this.focus();\n    this.updateOkButtonState_();\n  }\n};\n\n\n/**\n * Overrides setFocus to put focus on the input element.\n * @override\n */\ngoog.ui.Prompt.prototype.focus = function() {\n  goog.ui.Prompt.base(this, 'focus');\n\n  if (goog.userAgent.OPERA) {\n    // select() doesn't focus <input> elements in Opera.\n    this.userInputEl_.focus();\n  }\n  this.userInputEl_.select();\n};\n\n\n/**\n * Sets the default value of the prompt when it is displayed.\n * @param {string} defaultValue The default value to display.\n */\ngoog.ui.Prompt.prototype.setDefaultValue = function(defaultValue) {\n  this.defaultValue_ = defaultValue;\n};\n\n\n/**\n * Handles the closing of the prompt, invoking the callback function that was\n * registered to handle the value returned by the prompt.\n * @param {goog.ui.Dialog.Event} e The dialog's selection event.\n * @private\n */\ngoog.ui.Prompt.prototype.onPromptExit_ = function(e) {\n  /*\n   * The timeouts below are required for one edge case. If after the dialog\n   * hides, suppose validation of the input fails which displays an alert. If\n   * the user pressed the Enter key to dismiss the alert that was displayed it\n   * can trigger the event handler a second time. This timeout ensures that the\n   * alert is displayed only after the prompt is able to clean itself up.\n   */\n  if (!this.isClosing_) {\n    this.isClosing_ = true;\n    if (e.key == 'ok') {\n      goog.Timer.callOnce(\n          goog.bind(this.callback_, this, this.userInputEl_.value), 1);\n    } else {\n      goog.Timer.callOnce(goog.bind(this.callback_, this, null), 1);\n    }\n  }\n};\n\n\n/** @override */\ngoog.ui.Prompt.prototype.disposeInternal = function() {\n  goog.dom.removeNode(this.userInputEl_);\n\n  goog.events.unlisten(\n      this, goog.ui.Dialog.EventType.SELECT, this.onPromptExit_, true, this);\n\n  goog.ui.Prompt.superClass_.disposeInternal.call(this);\n\n  this.userInputEl_ = null;\n};\n","^;",1579837703000,"^<",["^=",["^1>","^3O","^Y","^1P","^1U","^?","^[","^1C","~$goog.ui.Dialog","^1<","^1I","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/prompt.js"],"^O",["^=",["~$goog.ui.Prompt"]],"^W",true,"^X",["^?","^3O","^1>","^1U","^12","^1<","^1C","^Y","^1I","^1P","^8@","^["]],["^ ","^3",[1579837703000],"^4","goog.result.resultutil.js","^5",["^6","goog/result/resultutil.js"],"^7","goog/result/resultutil.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This file provides primitives and tools (wait, transform,\n *     chain, combine) that make it easier to work with Results. This section\n *     gives an overview of their functionality along with some examples and the\n *     actual definitions have detailed descriptions next to them.\n *\n *\n * NOTE: goog.result is soft deprecated - we expect to replace this and\n * goog.async.Deferred with a wrapper around W3C Promises:\n * http://dom.spec.whatwg.org/#promises.\n */\n\ngoog.provide('goog.result');\n\ngoog.require('goog.array');\ngoog.require('goog.result.DependentResult');\ngoog.require('goog.result.Result');\ngoog.require('goog.result.SimpleResult');\n\n\n/**\n * Returns a successful result containing the provided value.\n *\n * Example:\n * <pre>\n *\n * var value = 'some-value';\n * var result = goog.result.immediateResult(value);\n * assertEquals(goog.result.Result.State.SUCCESS, result.getState());\n * assertEquals(value, result.getValue());\n *\n * </pre>\n *\n * @param {*} value The value of the result.\n * @return {!goog.result.Result} A Result object that has already been resolved\n *     to the supplied value.\n */\ngoog.result.successfulResult = function(value) {\n  var result = new goog.result.SimpleResult();\n  result.setValue(value);\n  return result;\n};\n\n\n/**\n * Returns a failed result with the optional error slug set.\n *\n * Example:\n * <pre>\n *\n * var error = new Error('something-failed');\n * var result = goog.result.failedResult(error);\n * assertEquals(goog.result.Result.State.ERROR, result.getState());\n * assertEquals(error, result.getError());\n *\n * </pre>\n *\n * @param {*=} opt_error The error to which the result should resolve.\n * @return {!goog.result.Result} A Result object that has already been resolved\n *     to the supplied Error.\n */\ngoog.result.failedResult = function(opt_error) {\n  var result = new goog.result.SimpleResult();\n  result.setError(opt_error);\n  return result;\n};\n\n\n/**\n * Returns a canceled result.\n * The result will be resolved to an error of type CancelError.\n *\n * Example:\n * <pre>\n *\n * var result = goog.result.canceledResult();\n * assertEquals(goog.result.Result.State.ERROR, result.getState());\n * var error = result.getError();\n * assertTrue(error instanceof goog.result.Result.CancelError);\n *\n * </pre>\n *\n * @return {!goog.result.Result} A canceled Result.\n */\ngoog.result.canceledResult = function() {\n  var result = new goog.result.SimpleResult();\n  result.cancel();\n  return result;\n};\n\n\n/**\n * Calls the handler on resolution of the result (success or failure).\n * The handler is passed the result object as the only parameter. The call will\n * be immediate if the result is no longer pending.\n *\n * Example:\n * <pre>\n *\n * var result = xhr.get('testdata/xhr_test_text.data');\n *\n * // Wait for the result to be resolved and alert it's state.\n * goog.result.wait(result, function(result) {\n *   alert('State: ' + result.getState());\n * });\n * </pre>\n *\n * @param {!goog.result.Result} result The result to install the handlers.\n * @param {function(this:T, !goog.result.Result)} handler The handler to be\n *     called. The handler is passed the result object as the only parameter.\n * @param {T=} opt_scope Optional scope for the handler.\n * @template T\n */\ngoog.result.wait = function(result, handler, opt_scope) {\n  result.wait(handler, opt_scope);\n};\n\n\n/**\n * Calls the handler if the result succeeds. The result object is the only\n * parameter passed to the handler. The call will be immediate if the result\n * has already succeeded.\n *\n * Example:\n * <pre>\n *\n * var result = xhr.get('testdata/xhr_test_text.data');\n *\n * // attach a success handler.\n * goog.result.waitOnSuccess(result, function(resultValue, result) {\n *   var datavalue = result.getvalue();\n *   alert('value: ' + datavalue + ' == ' + resultValue);\n * });\n * </pre>\n *\n * @param {!goog.result.Result} result The result to install the handlers.\n * @param {function(this:T, ?, !goog.result.Result)} handler The handler to be\n *     called. The handler is passed the result value and the result as\n *     parameters.\n * @param {T=} opt_scope Optional scope for the handler.\n * @template T\n */\ngoog.result.waitOnSuccess = function(result, handler, opt_scope) {\n  goog.result.wait(result, function(res) {\n    if (res.getState() == goog.result.Result.State.SUCCESS) {\n      // 'this' refers to opt_scope\n      handler.call(this, res.getValue(), res);\n    }\n  }, opt_scope);\n};\n\n\n/**\n * Calls the handler if the result action errors. The result object is passed as\n * the only parameter to the handler. The call will be immediate if the result\n * object has already resolved to an error.\n *\n * Example:\n *\n * <pre>\n *\n * var result = xhr.get('testdata/xhr_test_text.data');\n *\n * // Attach a failure handler.\n * goog.result.waitOnError(result, function(error) {\n *  // Failed asynchronous call!\n * });\n * </pre>\n *\n * @param {!goog.result.Result} result The result to install the handlers.\n * @param {function(this:T, ?, !goog.result.Result)} handler The handler to be\n *     called. The handler is passed the error and the result object as\n *     parameters.\n * @param {T=} opt_scope Optional scope for the handler.\n * @template T\n */\ngoog.result.waitOnError = function(result, handler, opt_scope) {\n  goog.result.wait(result, function(res) {\n    if (res.getState() == goog.result.Result.State.ERROR) {\n      // 'this' refers to opt_scope\n      handler.call(this, res.getError(), res);\n    }\n  }, opt_scope);\n};\n\n\n/**\n * Given a result and a transform function, returns a new result whose value,\n * on success, will be the value of the given result after having been passed\n * through the transform function.\n *\n * If the given result is an error, the returned result is also an error and the\n * transform will not be called.\n *\n * Example:\n * <pre>\n *\n * var result = xhr.getJson('testdata/xhr_test_json.data');\n *\n * // Transform contents of returned data using 'processJson' and create a\n * // transformed result to use returned JSON.\n * var transformedResult = goog.result.transform(result, processJson);\n *\n * // Attach success and failure handlers to the transformed result.\n * goog.result.waitOnSuccess(transformedResult, function(resultValue, result) {\n *   var jsonData = resultValue;\n *   assertEquals('ok', jsonData['stat']);\n * });\n *\n * goog.result.waitOnError(transformedResult, function(error) {\n *   // Failed getJson call\n * });\n * </pre>\n *\n * @param {!goog.result.Result} result The result whose value will be\n *     transformed.\n * @param {function(?):?} transformer The transformer\n *     function. The return value of this function will become the value of the\n *     returned result.\n *\n * @return {!goog.result.DependentResult} A new Result whose eventual value will\n *     be the returned value of the transformer function.\n */\ngoog.result.transform = function(result, transformer) {\n  var returnedResult = new goog.result.DependentResultImpl_([result]);\n\n  goog.result.wait(result, function(res) {\n    if (res.getState() == goog.result.Result.State.SUCCESS) {\n      returnedResult.setValue(transformer(res.getValue()));\n    } else {\n      returnedResult.setError(res.getError());\n    }\n  });\n\n  return returnedResult;\n};\n\n\n/**\n * The chain function aids in chaining of asynchronous Results. This provides a\n * convenience for use cases where asynchronous operations must happen serially\n * i.e. subsequent asynchronous operations are dependent on data returned by\n * prior asynchronous operations.\n *\n * It accepts a result and an action callback as arguments and returns a\n * result. The action callback is called when the first result succeeds and is\n * supposed to return a second result. The returned result is resolved when one\n * of both of the results resolve (depending on their success or failure.) The\n * state and value of the returned result in the various cases is documented\n * below:\n * <pre>\n *\n * First Result State:    Second Result State:    Returned Result State:\n * SUCCESS                SUCCESS                 SUCCESS\n * SUCCESS                ERROR                   ERROR\n * ERROR                  Not created             ERROR\n * </pre>\n *\n * The value of the returned result, in the case both results succeed, is the\n * value of the second result (the result returned by the action callback.)\n *\n * Example:\n * <pre>\n *\n * var testDataResult = xhr.get('testdata/xhr_test_text.data');\n *\n * // Chain this result to perform another asynchronous operation when this\n * // Result is resolved.\n * var chainedResult = goog.result.chain(testDataResult,\n *     function(testDataResult) {\n *\n *       // The result value of testDataResult is the URL for JSON data.\n *       var jsonDataUrl = testDataResult.getValue();\n *\n *       // Create a new Result object when the original result is resolved.\n *       var jsonResult = xhr.getJson(jsonDataUrl);\n *\n *       // Return the newly created Result.\n *       return jsonResult;\n *     });\n *\n * // The chained result resolves to success when both results resolve to\n * // success.\n * goog.result.waitOnSuccess(chainedResult, function(resultValue, result) {\n *\n *   // At this point, both results have succeeded and we can use the JSON\n *   // data returned by the second asynchronous call.\n *   var jsonData = resultValue;\n *   assertEquals('ok', jsonData['stat']);\n * });\n *\n * // Attach the error handler to be called when either Result fails.\n * goog.result.waitOnError(chainedResult, function(result) {\n *   alert('chained result failed!');\n * });\n * </pre>\n *\n * @param {!goog.result.Result} result The result to chain.\n * @param {function(this:T, !goog.result.Result):!goog.result.Result}\n *     actionCallback The callback called when the result is resolved. This\n *     callback must return a Result.\n * @param {T=} opt_scope Optional scope for the action callback.\n * @return {!goog.result.DependentResult} A result that is resolved when both\n *     the given Result and the Result returned by the actionCallback have\n *     resolved.\n * @template T\n */\ngoog.result.chain = function(result, actionCallback, opt_scope) {\n  var dependentResult = new goog.result.DependentResultImpl_([result]);\n\n  // Wait for the first action.\n  goog.result.wait(result, function(result) {\n    if (result.getState() == goog.result.Result.State.SUCCESS) {\n      // The first action succeeded. Chain the contingent action.\n      var contingentResult = actionCallback.call(opt_scope, result);\n      dependentResult.addParentResult(contingentResult);\n      goog.result.wait(contingentResult, function(contingentResult) {\n\n        // The contingent action completed. Set the dependent result based on\n        // the contingent action's outcome.\n        if (contingentResult.getState() == goog.result.Result.State.SUCCESS) {\n          dependentResult.setValue(contingentResult.getValue());\n        } else {\n          dependentResult.setError(contingentResult.getError());\n        }\n      });\n    } else {\n      // First action failed, the dependent result should also fail.\n      dependentResult.setError(result.getError());\n    }\n  });\n\n  return dependentResult;\n};\n\n\n/**\n * Returns a result that waits on all given results to resolve. Once all have\n * resolved, the returned result will succeed (and never error).\n *\n * Example:\n * <pre>\n *\n * var result1 = xhr.get('testdata/xhr_test_text.data');\n *\n * // Get a second independent Result.\n * var result2 = xhr.getJson('testdata/xhr_test_json.data');\n *\n * // Create a Result that resolves when both prior results resolve.\n * var combinedResult = goog.result.combine(result1, result2);\n *\n * // Process data after resolution of both results.\n * goog.result.waitOnSuccess(combinedResult, function(results) {\n *   goog.array.forEach(results, function(result) {\n *       alert(result.getState());\n *   });\n * });\n * </pre>\n *\n * @param {...!goog.result.Result} var_args The results to wait on.\n *\n * @return {!goog.result.DependentResult} A new Result whose eventual value will\n *     be the resolved given Result objects.\n */\ngoog.result.combine = function(var_args) {\n  /** @type {!Array<!goog.result.Result>} */\n  var results = goog.array.clone(arguments);\n  var combinedResult = new goog.result.DependentResultImpl_(results);\n\n  var isResolved = function(res) {\n    return res.getState() != goog.result.Result.State.PENDING;\n  };\n\n  var checkResults = function() {\n    if (combinedResult.getState() == goog.result.Result.State.PENDING &&\n        goog.array.every(results, isResolved)) {\n      combinedResult.setValue(results);\n    }\n  };\n\n  goog.array.forEach(\n      results, function(result) { goog.result.wait(result, checkResults); });\n\n  return combinedResult;\n};\n\n\n/**\n * Returns a result that waits on all given results to resolve. Once all have\n * resolved, the returned result will succeed if and only if all given results\n * succeeded. Otherwise it will error.\n *\n * Example:\n * <pre>\n *\n * var result1 = xhr.get('testdata/xhr_test_text.data');\n *\n * // Get a second independent Result.\n * var result2 = xhr.getJson('testdata/xhr_test_json.data');\n *\n * // Create a Result that resolves when both prior results resolve.\n * var combinedResult = goog.result.combineOnSuccess(result1, result2);\n *\n * // Process data after successful resolution of both results.\n * goog.result.waitOnSuccess(combinedResult, function(results) {\n *   var textData = results[0].getValue();\n *   var jsonData = results[1].getValue();\n *   assertEquals('Just some data.', textData);\n *   assertEquals('ok', jsonData['stat']);\n * });\n *\n * // Handle errors when either or both results failed.\n * goog.result.waitOnError(combinedResult, function(combined) {\n *   var results = combined.getError();\n *\n *   if (results[0].getState() == goog.result.Result.State.ERROR) {\n *     alert('result1 failed');\n *   }\n *\n *   if (results[1].getState() == goog.result.Result.State.ERROR) {\n *     alert('result2 failed');\n *   }\n * });\n * </pre>\n *\n * @param {...!goog.result.Result} var_args The results to wait on.\n *\n * @return {!goog.result.DependentResult} A new Result whose eventual value will\n *     be an array of values of the given Result objects.\n */\ngoog.result.combineOnSuccess = function(var_args) {\n  var results = goog.array.clone(arguments);\n  var combinedResult = new goog.result.DependentResultImpl_(results);\n\n  var resolvedSuccessfully = function(res) {\n    return res.getState() == goog.result.Result.State.SUCCESS;\n  };\n\n  goog.result.wait(\n      goog.result.combine.apply(goog.result.combine, results),\n      // The combined result never ERRORs\n      function(res) {\n        var results =\n            /** @type {Array<!goog.result.Result>} */ (res.getValue());\n        if (goog.array.every(results, resolvedSuccessfully)) {\n          combinedResult.setValue(results);\n        } else {\n          combinedResult.setError(results);\n        }\n      });\n\n  return combinedResult;\n};\n\n\n/**\n * Given a DependentResult, cancels the Results it depends on (that is, the\n * results returned by getParentResults). This function does not recurse,\n * so e.g. parents of parents are not canceled; only the immediate parents of\n * the given Result are canceled.\n *\n * Example using @see goog.result.combine:\n * <pre>\n * var result1 = xhr.get('testdata/xhr_test_text.data');\n *\n * // Get a second independent Result.\n * var result2 = xhr.getJson('testdata/xhr_test_json.data');\n *\n * // Create a Result that resolves when both prior results resolve.\n * var combinedResult = goog.result.combineOnSuccess(result1, result2);\n *\n * combinedResult.wait(function() {\n *   if (combinedResult.isCanceled()) {\n *     goog.result.cancelParentResults(combinedResult);\n *   }\n * });\n *\n * // Now, canceling combinedResult will cancel both result1 and result2.\n * combinedResult.cancel();\n * </pre>\n * @param {!goog.result.DependentResult} dependentResult A Result that is\n *     dependent on the values of other Results (for example the Result of a\n *     goog.result.combine, goog.result.chain, or goog.result.transform call).\n * @return {boolean} True if any results were successfully canceled; otherwise\n *     false.\n * TODO(user): Implement a recursive version of this that cancels all\n * ancestor results.\n */\ngoog.result.cancelParentResults = function(dependentResult) {\n  var anyCanceled = false;\n  var results = dependentResult.getParentResults();\n  for (var n = 0; n < results.length; n++) {\n    anyCanceled |= results[n].cancel();\n  }\n  return !!anyCanceled;\n};\n\n\n\n/**\n * A DependentResult represents a Result whose eventual value depends on the\n * value of one or more other Results. For example, the Result returned by\n * @see goog.result.chain or @see goog.result.combine is dependent on the\n * Results given as arguments.\n *\n * @param {!Array<!goog.result.Result>} parentResults A list of Results that\n *     will affect the eventual value of this Result.\n * @constructor\n * @implements {goog.result.DependentResult}\n * @extends {goog.result.SimpleResult}\n * @private\n */\ngoog.result.DependentResultImpl_ = function(parentResults) {\n  goog.result.DependentResultImpl_.base(this, 'constructor');\n  /**\n   * A list of Results that will affect the eventual value of this Result.\n   * @type {!Array<!goog.result.Result>}\n   * @private\n   */\n  this.parentResults_ = parentResults;\n};\ngoog.inherits(goog.result.DependentResultImpl_, goog.result.SimpleResult);\n\n\n/**\n * Adds a Result to the list of Results that affect this one.\n * @param {!goog.result.Result} parentResult A result whose value affects the\n *     value of this Result.\n */\ngoog.result.DependentResultImpl_.prototype.addParentResult = function(\n    parentResult) {\n  this.parentResults_.push(parentResult);\n};\n\n\n/** @override */\ngoog.result.DependentResultImpl_.prototype.getParentResults = function() {\n  return this.parentResults_;\n};\n","^;",1579837703000,"^<",["^=",["^?","~$goog.result.Result","^2O","~$goog.result.DependentResult","~$goog.result.SimpleResult"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/result/resultutil.js"],"^O",["^=",["~$goog.result"]],"^W",true,"^X",["^?","^2O","^8C","^8B","^8D"]],["^ ","^3",[1579837703000],"^4","goog.ui.controlcontent.js","^5",["^6","goog/ui/controlcontent.js"],"^7","goog/ui/controlcontent.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Type declaration for control content.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\ngoog.provide('goog.ui.ControlContent');\n\n\n/**\n * Type declaration for text caption or DOM structure to be used as the content\n * of {@link goog.ui.Control}s.\n * @typedef {string|Node|Array<!Node>|NodeList<!Node>}\n */\ngoog.ui.ControlContent;\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/controlcontent.js"],"^O",["^=",["^5A"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.ui.ac.richremote.js","^5",["^6","goog/ui/ac/richremote.js"],"^7","goog/ui/ac/richremote.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Factory class to create a rich autocomplete that will match\n * from an array of data provided via ajax.  The server returns a complex data\n * structure that is used with client-side javascript functions to render the\n * results.\n *\n * The server sends a list of the form:\n *   [[\"type1\", {...}, {...}, ...], [\"type2\", {...}, {...}, ...], ...]\n * The first element of each sublist is a string designating the type of the\n * hashes in the sublist, each of which represents one match.  The type string\n * must be the name of a function(item) which converts the hash into a rich\n * row that contains both a render(node, token) and a select(target) method.\n * The render method is called by the renderer when rendering the rich row,\n * and the select method is called by the RichInputHandler when the rich row is\n * selected.\n *\n * @see ../../demos/autocompleterichremote.html\n */\n\ngoog.provide('goog.ui.ac.RichRemote');\n\ngoog.require('goog.ui.ac.AutoComplete');\ngoog.require('goog.ui.ac.Remote');\ngoog.require('goog.ui.ac.Renderer');\ngoog.require('goog.ui.ac.RichInputHandler');\ngoog.require('goog.ui.ac.RichRemoteArrayMatcher');\n\n\n\n/**\n * Factory class to create a rich autocomplete widget that autocompletes an\n * inputbox or textarea from data provided via ajax.  The server returns a\n * complex data structure that is used with client-side javascript functions to\n * render the results.\n *\n * @param {string} url The Uri which generates the auto complete matches.\n * @param {Element} input Input element or text area.\n * @param {boolean=} opt_multi Whether to allow multiple entries; defaults\n *     to false.\n * @param {boolean=} opt_useSimilar Whether to use similar matches; e.g.\n *     \"gost\" => \"ghost\".\n * @constructor\n * @extends {goog.ui.ac.Remote}\n */\ngoog.ui.ac.RichRemote = function(url, input, opt_multi, opt_useSimilar) {\n  // Create a custom renderer that renders rich rows.  The renderer calls\n  // row.render(node, token) for each row.\n  var customRenderer = {};\n  customRenderer.renderRow = function(row, token, node) {\n    return row.data.render(node, token);\n  };\n\n  /**\n   * A standard renderer that uses a custom row renderer to display the\n   * rich rows generated by this autocomplete widget.\n   * @type {goog.ui.ac.Renderer}\n   * @private\n   */\n  var renderer = new goog.ui.ac.Renderer(null, customRenderer);\n\n  /**\n   * A remote matcher that parses rich results returned by the server.\n   * @type {goog.ui.ac.RichRemoteArrayMatcher}\n   * @private\n   */\n  var matcher = new goog.ui.ac.RichRemoteArrayMatcher(url, !opt_useSimilar);\n\n  /**\n   * An input handler that calls select on a row when it is selected.\n   * @type {goog.ui.ac.RichInputHandler}\n   * @private\n   */\n  var inputhandler =\n      new goog.ui.ac.RichInputHandler(null, null, !!opt_multi, 300);\n\n  // Create the widget and connect it to the input handler.\n  goog.ui.ac.AutoComplete.call(this, matcher, renderer, inputhandler);\n  inputhandler.attachAutoComplete(this);\n  inputhandler.attachInputs(input);\n};\ngoog.inherits(goog.ui.ac.RichRemote, goog.ui.ac.Remote);\n\n\n/**\n * Set the filter that is called before the array matches are returned.\n * @param {Function} rowFilter A function(rows) that returns an array of rows as\n *     a subset of the rows input array.\n */\ngoog.ui.ac.RichRemote.prototype.setRowFilter = function(rowFilter) {\n  this.matcher_.setRowFilter(rowFilter);\n};\n\n\n/**\n * Sets the function building the rows.\n * @param {goog.ui.ac.RichRemoteArrayMatcher.RowBuilder} rowBuilder\n *     A function(type, response) converting the type and the server response to\n *     an object with two methods: render(node, token) and select(target).\n */\ngoog.ui.ac.RichRemote.prototype.setRowBuilder = function(rowBuilder) {\n  this.matcher_.setRowBuilder(rowBuilder);\n};\n","^;",1579837703000,"^<",["^=",["^2=","^2>","~$goog.ui.ac.RichInputHandler","~$goog.ui.ac.RichRemoteArrayMatcher","^?","~$goog.ui.ac.Remote"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/ac/richremote.js"],"^O",["^=",["~$goog.ui.ac.RichRemote"]],"^W",true,"^X",["^?","^2=","^8H","^2>","^8F","^8G"]],["^ ","^3",[1579837703000],"^4","goog.i18n.mime.js","^5",["^6","goog/i18n/mime.js"],"^7","goog/i18n/mime.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions for encoding strings according to MIME\n * standards, especially RFC 1522.\n */\ngoog.provide('goog.i18n.mime');\ngoog.provide('goog.i18n.mime.encode');\n\ngoog.require('goog.array');\ngoog.require('goog.i18n.uChar');\n\n\n/**\n * Regular expression for matching those characters that are outside the\n * range that can be used in the quoted-printable encoding of RFC 1522:\n * anything outside the 7-bit ASCII encoding, plus ?, =, _ or space.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.mime.NONASCII_ = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[^!-<>@-^`-~]/g;\n\n/**\n * Like goog.i18n.NONASCII_ but also omits double-quotes.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.mime.NONASCII_NOQUOTE_ =\n    /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]|[^!#-<>@-^`-~]/g;\n\n/**\n * Encodes a string for inclusion in a MIME header. The string is encoded\n * in UTF-8 according to RFC 1522, using quoted-printable form.\n * @param {string} str The string to encode.\n * @param {boolean=} opt_noquote Whether double-quote characters should also\n *     be escaped (should be true if the result will be placed inside a\n *     quoted string for a parameter value in a MIME header).\n * @return {string} The encoded string.\n */\ngoog.i18n.mime.encode = function(str, opt_noquote) {\n  var nonascii =\n      opt_noquote ? goog.i18n.mime.NONASCII_NOQUOTE_ : goog.i18n.mime.NONASCII_;\n\n  if (str.search(nonascii) >= 0) {\n    str = '=?UTF-8?Q?' +\n        str.replace(\n            nonascii,\n            /**\n             * @param {string} c The matched char.\n             * @return {string} The quoted-printable form of utf-8 encoding.\n             */\n            function(c) {\n              var i = c.charCodeAt(0);\n              if (i == 32) {\n                // Special case for space, which can be encoded as _ not =20\n                return '_';\n              }\n              var a = goog.array.concat('', goog.i18n.mime.getHexCharArray(c));\n              return a.join('=');\n            }) +\n        '?=';\n  }\n  return str;\n};\n\n\n/**\n * Get an array of UTF-8 hex codes for a given character.\n * @param {string} c The matched character.\n * @return {!Array<string>} A hex array representing the character.\n */\ngoog.i18n.mime.getHexCharArray = function(c) {\n  var i = goog.i18n.uChar.toCharCode(c);\n  var a = [];\n  // First convert the UCS-2 character into its UTF-8 bytes\n  if (i < 128) {\n    a.push(i);\n  } else if (i <= 0x7ff) {\n    a.push(0xc0 + ((i >> 6) & 0x3f), 0x80 + (i & 0x3f));\n  } else if (i <= 0xffff) {\n    a.push(\n        0xe0 + ((i >> 12) & 0x3f), 0x80 + ((i >> 6) & 0x3f), 0x80 + (i & 0x3f));\n  } else {\n    // Handle code points that take more than 16 bits.\n    a.push(\n        0xf0 + ((i >> 18) & 0x3f), 0x80 + ((i >> 12) & 0x3f),\n        0x80 + ((i >> 6) & 0x3f), 0x80 + (i & 0x3f));\n  }\n  // Now convert those bytes into hex strings (don't do anything with\n  // a[0] as that's got the empty string that lets us use join())\n  for (i = a.length - 1; i >= 0; --i) {\n    a[i] = a[i].toString(16);\n  }\n  return a;\n};\n","^;",1579837703000,"^<",["^=",["^?","^17","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/mime.js"],"^O",["^=",["~$goog.i18n.mime","~$goog.i18n.mime.encode"]],"^W",true,"^X",["^?","^2O","^17"]],["^ ","^3",[1579837703000],"^4","goog.ui.menubardecorator.js","^5",["^6","goog/ui/menubardecorator.js"],"^7","goog/ui/menubardecorator.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of MenuBarRenderer decorator, a static call into\n * the goog.ui.registry.\n *\n * @see ../demos/menubar.html\n */\n\ngoog.provide('goog.ui.menuBarDecorator');\n\ngoog.require('goog.ui.MenuBarRenderer');\ngoog.require('goog.ui.menuBar');\ngoog.require('goog.ui.registry');\n\n\n/**\n * Register a decorator factory function. 'goog-menubar' defaults to\n * goog.ui.MenuBarRenderer.\n */\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.MenuBarRenderer.CSS_CLASS, goog.ui.menuBar.create);\n","^;",1579837703000,"^<",["^=",["~$goog.ui.menuBar","^?","^3F","~$goog.ui.MenuBarRenderer"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/menubardecorator.js"],"^O",["^=",["~$goog.ui.menuBarDecorator"]],"^W",true,"^X",["^?","^8M","^8L","^3F"]],["^ ","^3",[1579837703000],"^4","goog.dom.pattern.matcher.js","^5",["^6","goog/dom/pattern/matcher.js"],"^7","goog/dom/pattern/matcher.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview DOM pattern matcher.  Allows for simple searching of DOM\n * using patterns descended from {@link goog.dom.pattern.AbstractPattern}.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.pattern.Matcher');\n\ngoog.require('goog.dom.TagIterator');\ngoog.require('goog.dom.pattern.MatchType');\ngoog.require('goog.iter');\n\n\n// TODO(robbyw): Allow for backtracks of size > 1.\n\n\n\n/**\n * Given a set of patterns and a root node, this class tests the patterns in\n * parallel.\n *\n * It is not (yet) a smart matcher - it doesn't do any advanced backtracking.\n * Given the pattern <code>DIV, SPAN</code> the matcher will not match\n * <code>DIV, DIV, SPAN</code> because it starts matching at the first\n * <code>DIV</code>, fails to match <code>SPAN</code> at the second, and never\n * backtracks to try again.\n *\n * It is also possible to have a set of complex patterns that when matched in\n * parallel will miss some possible matches.  Running multiple times will catch\n * all matches eventually.\n *\n * @constructor\n * @final\n */\ngoog.dom.pattern.Matcher = function() {\n  /**\n   * Array of patterns to attempt to match in parallel.\n   *\n   * @private {Array<goog.dom.pattern.AbstractPattern>}\n   */\n  this.patterns_ = [];\n\n  /**\n   * Array of callbacks to call when a pattern is matched.  The indexing is the\n   * same as the {@link #patterns_} array.\n   *\n   * @private {Array<Function>}\n   */\n  this.callbacks_ = [];\n};\n\n\n/**\n * Adds a pattern to be matched.  The callback can return an object whose keys\n * are processing instructions.\n *\n * @param {goog.dom.pattern.AbstractPattern} pattern The pattern to add.\n * @param {Function} callback Function to call when a match is found.  Uses\n *     the above semantics.\n */\ngoog.dom.pattern.Matcher.prototype.addPattern = function(pattern, callback) {\n  this.patterns_.push(pattern);\n  this.callbacks_.push(callback);\n};\n\n\n/**\n * Resets all the patterns.\n *\n * @private\n */\ngoog.dom.pattern.Matcher.prototype.reset_ = function() {\n  for (var i = 0, len = this.patterns_.length; i < len; i++) {\n    this.patterns_[i].reset();\n  }\n};\n\n\n/**\n * Test the given node against all patterns.\n *\n * @param {goog.dom.TagIterator} position A position in a node walk that is\n *     located at the token to process.\n * @return {boolean} Whether a pattern modified the position or tree\n *     and its callback resulted in DOM structure or position modification.\n * @private\n */\ngoog.dom.pattern.Matcher.prototype.matchToken_ = function(position) {\n  for (var i = 0, len = this.patterns_.length; i < len; i++) {\n    var pattern = this.patterns_[i];\n    switch (pattern.matchToken(position.node, position.tagType)) {\n      case goog.dom.pattern.MatchType.MATCH:\n      case goog.dom.pattern.MatchType.BACKTRACK_MATCH:\n        var callback = this.callbacks_[i];\n\n        // Callbacks are allowed to modify the current position, but must\n        // return true if the do.\n        if (callback(pattern.matchedNode, position, pattern)) {\n          return true;\n        }\n\n      default:\n        // Do nothing.\n        break;\n    }\n  }\n\n  return false;\n};\n\n\n/**\n * Match the set of patterns against a match tree.\n *\n * @param {Node} node The root node of the tree to match.\n */\ngoog.dom.pattern.Matcher.prototype.match = function(node) {\n  var position = new goog.dom.TagIterator(node);\n\n  this.reset_();\n\n  goog.iter.forEach(position, function() {\n    while (this.matchToken_(position)) {\n      // Since we've moved, our old pattern statuses don't make sense any more.\n      // Reset them.\n      this.reset_();\n    }\n  }, this);\n};\n","^;",1579837703000,"^<",["^=",["~$goog.iter","~$goog.dom.TagIterator","^?","~$goog.dom.pattern.MatchType"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/matcher.js"],"^O",["^=",["~$goog.dom.pattern.Matcher"]],"^W",true,"^X",["^?","^8P","^8Q","^8O"]],["^ ","^3",[1579837703000],"^4","goog.string.linkify.js","^5",["^6","goog/string/linkify.js"],"^7","goog/string/linkify.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility function for linkifying text.\n * @author bolinfest@google.com (Michael Bolin)\n */\n\ngoog.provide('goog.string.linkify');\n\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.string');\n\n\n/**\n * Takes a string of plain text and linkifies URLs and email addresses. For a\n * URL (unless opt_attributes is specified), the target of the link will be\n * _blank and it will have a rel=nofollow attribute applied to it so that links\n * created by linkify will not be of interest to search engines.\n * @param {string} text Plain text.\n * @param {!Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n *     Attributes to add to all links created. Default are rel=nofollow and\n *     target=_blank. To clear those default attributes set rel='' and\n *     target=''.\n * @param {boolean=} opt_preserveNewlines Whether to preserve newlines with\n *     &lt;br&gt;.\n * @return {!goog.html.SafeHtml} Linkified HTML. Any text that is not part of a\n *      link will be HTML-escaped.\n */\ngoog.string.linkify.linkifyPlainTextAsHtml = function(\n    text, opt_attributes, opt_preserveNewlines) {\n  // This shortcut makes linkifyPlainText ~10x faster if text doesn't contain\n  // URLs or email addresses and adds insignificant performance penalty if it\n  // does.\n  if (text.indexOf('@') == -1 && text.indexOf('://') == -1 &&\n      text.indexOf('www.') == -1 && text.indexOf('Www.') == -1 &&\n      text.indexOf('WWW.') == -1) {\n    return opt_preserveNewlines ?\n        goog.html.SafeHtml.htmlEscapePreservingNewlines(text) :\n        goog.html.SafeHtml.htmlEscape(text);\n  }\n\n  var attributesMap = {};\n  for (var key in opt_attributes) {\n    if (!opt_attributes[key]) {\n      // Our API allows '' to omit the attribute, SafeHtml requires null.\n      attributesMap[key] = null;\n    } else {\n      attributesMap[key] = opt_attributes[key];\n    }\n  }\n  // Set default options if they haven't been explicitly set.\n  if (!('rel' in attributesMap)) {\n    attributesMap['rel'] = 'nofollow';\n  }\n  if (!('target' in attributesMap)) {\n    attributesMap['target'] = '_blank';\n  }\n\n  var output = [];\n  // Return value is ignored.\n  text.replace(\n      goog.string.linkify.FIND_LINKS_RE_,\n      function(part, before, original, email, protocol) {\n        output.push(\n            opt_preserveNewlines ?\n                goog.html.SafeHtml.htmlEscapePreservingNewlines(before) :\n                before);\n        if (!original) {\n          return '';\n        }\n        var href = '';\n        /** @type {string} */\n        var linkText;\n        /** @type {string} */\n        var afterLink;\n        if (email) {\n          href = 'mailto:';\n          linkText = email;\n          afterLink = '';\n        } else {\n          // This is a full url link.\n          if (!protocol) {\n            href = 'http://';\n          }\n          var splitEndingPunctuation =\n              original.match(goog.string.linkify.ENDS_WITH_PUNCTUATION_RE_);\n          // An open paren in the link will often be matched with a close paren\n          // at the end, so skip cutting off ending punctuation if there's an\n          // open paren. For example:\n          // http://en.wikipedia.org/wiki/Titanic_(1997_film)\n          if (splitEndingPunctuation && !goog.string.contains(original, '(')) {\n            linkText = splitEndingPunctuation[1];\n            afterLink = splitEndingPunctuation[2];\n          } else {\n            linkText = original;\n            afterLink = '';\n          }\n        }\n        attributesMap['href'] = href + linkText;\n        output.push(goog.html.SafeHtml.create('a', attributesMap, linkText));\n        output.push(\n            opt_preserveNewlines ?\n                goog.html.SafeHtml.htmlEscapePreservingNewlines(afterLink) :\n                afterLink);\n        return '';\n      });\n  return goog.html.SafeHtml.concat(output);\n};\n\n\n/**\n * Gets the first URI in text.\n * @param {string} text Plain text.\n * @return {string} The first URL, or an empty string if not found.\n */\ngoog.string.linkify.findFirstUrl = function(text) {\n  var link = text.match(goog.string.linkify.URL_RE_);\n  return link != null ? link[0] : '';\n};\n\n\n/**\n * Gets the first email address in text.\n * @param {string} text Plain text.\n * @return {string} The first email address, or an empty string if not found.\n */\ngoog.string.linkify.findFirstEmail = function(text) {\n  var email = text.match(goog.string.linkify.EMAIL_RE_);\n  return email != null ? email[0] : '';\n};\n\n\n/**\n * If a series of these characters is at the end of a url, it will be considered\n * punctuation and not part of the url.\n * @type {string}\n * @const\n * @private\n */\ngoog.string.linkify.ENDING_PUNCTUATION_CHARS_ = '\\':;,\\\\.?}\\\\]\\\\)!';\n\n\n/**\n * @type {!RegExp}\n * @const\n * @private\n */\ngoog.string.linkify.ENDS_WITH_PUNCTUATION_RE_ = new RegExp(\n    '^(.*?)([' + goog.string.linkify.ENDING_PUNCTUATION_CHARS_ + ']+)$');\n\n\n/**\n * Set of characters to be put into a regex character set (\"[...]\"), used to\n * match against a url hostname and everything after it. It includes, in order,\n * \\w which represents [a-zA-Z0-9_], \"#-;\" which represents the characters\n * \"#$%&'()*+,-./0123456789:;\" and the characters \"!=?@[\\]`{|}~\".\n * @type {string}\n * @const\n * @private\n */\ngoog.string.linkify.ACCEPTABLE_URL_CHARS_ = '\\\\w#-;!=?@\\\\[\\\\\\\\\\\\]_`{|}~';\n\n\n/**\n * List of all protocols patterns recognized in urls (mailto is handled in email\n * matching).\n * @type {!Array<string>}\n * @const\n * @private\n */\ngoog.string.linkify.RECOGNIZED_PROTOCOLS_ = ['https?', 'ftp'];\n\n\n/**\n * Regular expression pattern that matches the beginning of an url.\n * Contains a catching group to capture the scheme.\n * @type {string}\n * @const\n * @private\n */\ngoog.string.linkify.PROTOCOL_START_ =\n    '(' + goog.string.linkify.RECOGNIZED_PROTOCOLS_.join('|') + ')://';\n\n\n/**\n * Regular expression pattern that matches the beginning of a typical\n * http url without the http:// scheme.\n * @type {string}\n * @const\n * @private\n */\ngoog.string.linkify.WWW_START_ = 'www\\\\.';\n\n\n/**\n * Regular expression pattern that matches an url.\n * @type {string}\n * @const\n * @private\n */\ngoog.string.linkify.URL_RE_STRING_ = '(?:' +\n    goog.string.linkify.PROTOCOL_START_ + '|' + goog.string.linkify.WWW_START_ +\n    ')[' + goog.string.linkify.ACCEPTABLE_URL_CHARS_ + ']+';\n\n\n/**\n * Regular expression that matches an url. Case-insensitive.\n * @type {!RegExp}\n * @const\n * @private\n */\ngoog.string.linkify.URL_RE_ =\n    new RegExp(goog.string.linkify.URL_RE_STRING_, 'i');\n\n\n/**\n * Regular expression pattern that matches a top level domain.\n * @type {string}\n * @const\n * @private\n */\ngoog.string.linkify.TOP_LEVEL_DOMAIN_ = '(?:com|org|net|edu|gov' +\n    // from http://www.iana.org/gtld/gtld.htm\n    '|aero|biz|cat|coop|info|int|jobs|mobi|museum|name|pro|travel' +\n    '|arpa|asia|xxx' +\n    // a two letter country code\n    '|[a-z][a-z])\\\\b';\n\n\n/**\n * Regular expression pattern that matches an email.\n * Contains a catching group to capture the email without the optional \"mailto:\"\n * prefix.\n * @type {string}\n * @const\n * @private\n */\ngoog.string.linkify.EMAIL_RE_STRING_ =\n    '(?:mailto:)?([\\\\w.!#$%&\\'*+-/=?^_`{|}~]+@[A-Za-z0-9.-]+\\\\.' +\n    goog.string.linkify.TOP_LEVEL_DOMAIN_ + ')';\n\n\n/**\n * Regular expression that matches an email. Case-insensitive.\n * @type {!RegExp}\n * @const\n * @private\n */\ngoog.string.linkify.EMAIL_RE_ =\n    new RegExp(goog.string.linkify.EMAIL_RE_STRING_, 'i');\n\n\n/**\n * Regular expression to match all the links (url or email) in a string.\n * First match is text before first link, might be empty string.\n * Second match is the original text that should be replaced by a link.\n * Third match is the email address in the case of an email.\n * Fourth match is the scheme of the url if specified.\n * @type {!RegExp}\n * @const\n * @private\n */\ngoog.string.linkify.FIND_LINKS_RE_ = new RegExp(\n    // Match everything including newlines.\n    '([\\\\S\\\\s]*?)(' +\n        // Match email after a word break.\n        '\\\\b' + goog.string.linkify.EMAIL_RE_STRING_ + '|' +\n        // Match url after a word break.\n        '\\\\b' + goog.string.linkify.URL_RE_STRING_ + '|$)',\n    'gi');\n","^;",1579837703000,"^<",["^=",["^2L","^?","^1I"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/string/linkify.js"],"^O",["^=",["~$goog.string.linkify"]],"^W",true,"^X",["^?","^1I","^2L"]],["^ ","^3",[1579837703000],"^4","goog.math.irect.js","^5",["^6","goog/math/irect.js"],"^7","goog/math/irect.js","^8","^9","^:","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A record declaration to allow ClientRect and other rectangle\n * like objects to be used with goog.math.Rect.\n */\n\ngoog.provide('goog.math.IRect');\n\n\n/**\n * Record for representing rectangular regions, allows compatibility between\n * things like ClientRect and goog.math.Rect.\n *\n * @record\n */\ngoog.math.IRect = function() {};\n\n\n/** @type {number} */\ngoog.math.IRect.prototype.left;\n\n\n/** @type {number} */\ngoog.math.IRect.prototype.top;\n\n\n/** @type {number} */\ngoog.math.IRect.prototype.width;\n\n\n/** @type {number} */\ngoog.math.IRect.prototype.height;\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/irect.js"],"^O",["^=",["~$goog.math.IRect"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.json.json.js","^5",["^6","goog/json/json.js"],"^7","goog/json/json.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview JSON utility functions.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.json');\ngoog.provide('goog.json.Replacer');\ngoog.provide('goog.json.Reviver');\ngoog.provide('goog.json.Serializer');\n\n\n/**\n * @define {boolean} If true, use the native JSON parsing API.\n * NOTE: The default `goog.json.parse` implementation is able to handle\n * invalid JSON. JSPB used to produce invalid JSON which is not the case\n * anymore so this is safe to enable for parsing JSPB. Using native JSON is\n * faster and safer than the default implementation using `eval`.\n */\ngoog.json.USE_NATIVE_JSON = goog.define('goog.json.USE_NATIVE_JSON', false);\n\n/**\n * @define {boolean} If true, try the native JSON parsing API first. If it\n * fails, log an error and use `eval` instead. This is useful when\n * transitioning to `goog.json.USE_NATIVE_JSON`. The error logger needs to\n * be set by `goog.json.setErrorLogger`. If it is not set then the error\n * is ignored.\n */\ngoog.json.TRY_NATIVE_JSON = goog.define('goog.json.TRY_NATIVE_JSON', false);\n\n\n/**\n * Tests if a string is an invalid JSON string. This only ensures that we are\n * not using any invalid characters\n * @param {string} s The string to test.\n * @return {boolean} True if the input is a valid JSON string.\n */\ngoog.json.isValid = function(s) {\n  // All empty whitespace is not valid.\n  if (/^\\s*$/.test(s)) {\n    return false;\n  }\n\n  // This is taken from http://www.json.org/json2.js which is released to the\n  // public domain.\n  // Changes: We dissallow \\u2028 Line separator and \\u2029 Paragraph separator\n  // inside strings.  We also treat \\u2028 and \\u2029 as whitespace which they\n  // are in the RFC but IE and Safari does not match \\s to these so we need to\n  // include them in the reg exps in all places where whitespace is allowed.\n  // We allowed \\x7f inside strings because some tools don't escape it,\n  // e.g. http://www.json.org/java/org/json/JSONObject.java\n\n  // Parsing happens in three stages. In the first stage, we run the text\n  // against regular expressions that look for non-JSON patterns. We are\n  // especially concerned with '()' and 'new' because they can cause invocation,\n  // and '=' because it can cause mutation. But just to be safe, we want to\n  // reject all unexpected forms.\n\n  // We split the first stage into 4 regexp operations in order to work around\n  // crippling inefficiencies in IE's and Safari's regexp engines. First we\n  // replace all backslash pairs with '@' (a non-JSON character). Second, we\n  // replace all simple value tokens with ']' characters, but only when followed\n  // by a colon, comma, closing bracket or end of string. Third, we delete all\n  // open brackets that follow a colon or comma or that begin the text. Finally,\n  // we look to see that the remaining characters are only whitespace or ']' or\n  // ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.\n\n  // Don't make these static since they have the global flag.\n  const backslashesRe = /\\\\[\"\\\\\\/bfnrtu]/g;\n  const simpleValuesRe =\n      /(?:\"[^\"\\\\\\n\\r\\u2028\\u2029\\x00-\\x08\\x0a-\\x1f]*\"|true|false|null|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)[\\s\\u2028\\u2029]*(?=:|,|]|}|$)/g;\n  const openBracketsRe = /(?:^|:|,)(?:[\\s\\u2028\\u2029]*\\[)+/g;\n  const remainderRe = /^[\\],:{}\\s\\u2028\\u2029]*$/;\n\n  return remainderRe.test(\n      s.replace(backslashesRe, '@')\n          .replace(simpleValuesRe, ']')\n          .replace(openBracketsRe, ''));\n};\n\n/**\n * Logs a parsing error in `JSON.parse` solvable by using `eval`\n * if `goog.json.TRY_NATIVE_JSON` is enabled.\n * @private {function(string, !Error)} The first parameter is the error message,\n *     the second is the exception thrown by `JSON.parse`.\n */\ngoog.json.errorLogger_ = goog.nullFunction;\n\n\n/**\n * Sets an error logger to use if there's a recoverable parsing error and\n * `goog.json.TRY_NATIVE_JSON` is enabled.\n * @param {function(string, !Error)} errorLogger The first parameter is the\n *     error message, the second is the exception thrown by `JSON.parse`.\n */\ngoog.json.setErrorLogger = function(errorLogger) {\n  goog.json.errorLogger_ = errorLogger;\n};\n\n\n/**\n * Parses a JSON string and returns the result. This throws an exception if\n * the string is an invalid JSON string.\n *\n * Note that this is very slow on large strings. Use JSON.parse if possible.\n *\n * @param {*} s The JSON string to parse.\n * @throws Error if s is invalid JSON.\n * @return {Object} The object generated from the JSON string, or null.\n * @deprecated Use JSON.parse.\n */\ngoog.json.parse = goog.json.USE_NATIVE_JSON ?\n    /** @type {function(*):Object} */ (goog.global['JSON']['parse']) :\n    function(s) {\n      let error;\n      if (goog.json.TRY_NATIVE_JSON) {\n        try {\n          return goog.global['JSON']['parse'](s);\n        } catch (ex) {\n          error = ex;\n        }\n      }\n      const o = String(s);\n      if (goog.json.isValid(o)) {\n\n        try {\n          const result = /** @type {?Object} */ (eval('(' + o + ')'));\n          if (error) {\n            goog.json.errorLogger_('Invalid JSON: ' + o, error);\n          }\n          return result;\n        } catch (ex) {\n        }\n      }\n      throw new Error('Invalid JSON string: ' + o);\n    };\n\n\n/**\n * JSON replacer, as defined in Section 15.12.3 of the ES5 spec.\n * @see http://ecma-international.org/ecma-262/5.1/#sec-15.12.3\n *\n * TODO(nicksantos): Array should also be a valid replacer.\n *\n * @typedef {function(this:Object, string, *): *}\n */\ngoog.json.Replacer;\n\n\n/**\n * JSON reviver, as defined in Section 15.12.2 of the ES5 spec.\n * @see http://ecma-international.org/ecma-262/5.1/#sec-15.12.3\n *\n * @typedef {function(this:Object, string, *): *}\n */\ngoog.json.Reviver;\n\n\n/**\n * Serializes an object or a value to a JSON string.\n *\n * @param {*} object The object to serialize.\n * @param {?goog.json.Replacer=} opt_replacer A replacer function\n *     called for each (key, value) pair that determines how the value\n *     should be serialized. By defult, this just returns the value\n *     and allows default serialization to kick in.\n * @throws Error if there are loops in the object graph.\n * @return {string} A JSON string representation of the input.\n */\ngoog.json.serialize = goog.json.USE_NATIVE_JSON ?\n    /** @type {function(*, ?goog.json.Replacer=):string} */\n    (goog.global['JSON']['stringify']) :\n    function(object, opt_replacer) {\n      // NOTE(nicksantos): Currently, we never use JSON.stringify.\n      //\n      // The last time I evaluated this, JSON.stringify had subtle bugs and\n      // behavior differences on all browsers, and the performance win was not\n      // large enough to justify all the issues. This may change in the future\n      // as browser implementations get better.\n      //\n      // assertSerialize in json_test contains if branches for the cases\n      // that fail.\n      return new goog.json.Serializer(opt_replacer).serialize(object);\n    };\n\n\n\n/**\n * Class that is used to serialize JSON objects to a string.\n * @param {?goog.json.Replacer=} opt_replacer Replacer.\n * @constructor\n */\ngoog.json.Serializer = function(opt_replacer) {\n  /**\n   * @type {goog.json.Replacer|null|undefined}\n   * @private\n   */\n  this.replacer_ = opt_replacer;\n};\n\n\n/**\n * Serializes an object or a value to a JSON string.\n *\n * @param {*} object The object to serialize.\n * @throws Error if there are loops in the object graph.\n * @return {string} A JSON string representation of the input.\n */\ngoog.json.Serializer.prototype.serialize = function(object) {\n  const sb = [];\n  this.serializeInternal(object, sb);\n  return sb.join('');\n};\n\n\n/**\n * Serializes a generic value to a JSON string\n * @protected\n * @param {*} object The object to serialize.\n * @param {Array<string>} sb Array used as a string builder.\n * @throws Error if there are loops in the object graph.\n */\ngoog.json.Serializer.prototype.serializeInternal = function(object, sb) {\n  if (object == null) {\n    // undefined == null so this branch covers undefined as well as null\n    sb.push('null');\n    return;\n  }\n\n  if (typeof object == 'object') {\n    if (goog.isArray(object)) {\n      this.serializeArray(object, sb);\n      return;\n    } else if (\n        object instanceof String || object instanceof Number ||\n        object instanceof Boolean) {\n      object = object.valueOf();\n      // Fall through to switch below.\n    } else {\n      this.serializeObject_(/** @type {!Object} */ (object), sb);\n      return;\n    }\n  }\n\n  switch (typeof object) {\n    case 'string':\n      this.serializeString_(object, sb);\n      break;\n    case 'number':\n      this.serializeNumber_(object, sb);\n      break;\n    case 'boolean':\n      sb.push(String(object));\n      break;\n    case 'function':\n      sb.push('null');\n      break;\n    default:\n      throw new Error('Unknown type: ' + typeof object);\n  }\n};\n\n\n/**\n * Character mappings used internally for goog.string.quote\n * @private\n * @type {!Object}\n */\ngoog.json.Serializer.charToJsonCharCache_ = {\n  '\\\"': '\\\\\"',\n  '\\\\': '\\\\\\\\',\n  '/': '\\\\/',\n  '\\b': '\\\\b',\n  '\\f': '\\\\f',\n  '\\n': '\\\\n',\n  '\\r': '\\\\r',\n  '\\t': '\\\\t',\n\n  '\\x0B': '\\\\u000b'  // '\\v' is not supported in JScript\n};\n\n\n/**\n * Regular expression used to match characters that need to be replaced.\n * The S60 browser has a bug where unicode characters are not matched by\n * regular expressions. The condition below detects such behaviour and\n * adjusts the regular expression accordingly.\n * @private\n * @type {!RegExp}\n */\ngoog.json.Serializer.charsToReplace_ = /\\uffff/.test('\\uffff') ?\n    /[\\\\\\\"\\x00-\\x1f\\x7f-\\uffff]/g :\n    /[\\\\\\\"\\x00-\\x1f\\x7f-\\xff]/g;\n\n\n/**\n * Serializes a string to a JSON string\n * @private\n * @param {string} s The string to serialize.\n * @param {Array<string>} sb Array used as a string builder.\n */\ngoog.json.Serializer.prototype.serializeString_ = function(s, sb) {\n  // The official JSON implementation does not work with international\n  // characters.\n  sb.push('\"', s.replace(goog.json.Serializer.charsToReplace_, function(c) {\n    // caching the result improves performance by a factor 2-3\n    let rv = goog.json.Serializer.charToJsonCharCache_[c];\n    if (!rv) {\n      rv = '\\\\u' + (c.charCodeAt(0) | 0x10000).toString(16).substr(1);\n      goog.json.Serializer.charToJsonCharCache_[c] = rv;\n    }\n    return rv;\n  }), '\"');\n};\n\n\n/**\n * Serializes a number to a JSON string\n * @private\n * @param {number} n The number to serialize.\n * @param {Array<string>} sb Array used as a string builder.\n */\ngoog.json.Serializer.prototype.serializeNumber_ = function(n, sb) {\n  sb.push(isFinite(n) && !isNaN(n) ? String(n) : 'null');\n};\n\n\n/**\n * Serializes an array to a JSON string\n * @param {Array<string>} arr The array to serialize.\n * @param {Array<string>} sb Array used as a string builder.\n * @protected\n */\ngoog.json.Serializer.prototype.serializeArray = function(arr, sb) {\n  const l = arr.length;\n  sb.push('[');\n  let sep = '';\n  for (let i = 0; i < l; i++) {\n    sb.push(sep);\n\n    const value = arr[i];\n    this.serializeInternal(\n        this.replacer_ ? this.replacer_.call(arr, String(i), value) : value,\n        sb);\n\n    sep = ',';\n  }\n  sb.push(']');\n};\n\n\n/**\n * Serializes an object to a JSON string\n * @private\n * @param {!Object} obj The object to serialize.\n * @param {Array<string>} sb Array used as a string builder.\n */\ngoog.json.Serializer.prototype.serializeObject_ = function(obj, sb) {\n  sb.push('{');\n  let sep = '';\n  for (const key in obj) {\n    if (Object.prototype.hasOwnProperty.call(obj, key)) {\n      const value = obj[key];\n      // Skip functions.\n      if (typeof value != 'function') {\n        sb.push(sep);\n        this.serializeString_(key, sb);\n        sb.push(':');\n\n        this.serializeInternal(\n            this.replacer_ ? this.replacer_.call(obj, key, value) : value, sb);\n\n        sep = ',';\n      }\n    }\n  }\n  sb.push('}');\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/json/json.js"],"^O",["^=",["~$goog.json.Replacer","^4O","~$goog.json.Serializer","~$goog.json.Reviver"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.ui.toolbarmenubutton.js","^5",["^6","goog/ui/toolbarmenubutton.js"],"^7","goog/ui/toolbarmenubutton.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A toolbar menu button control.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ToolbarMenuButton');\n\ngoog.require('goog.ui.MenuButton');\ngoog.require('goog.ui.ToolbarMenuButtonRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * A menu button control for a toolbar.\n *\n * @param {goog.ui.ControlContent} content Text caption or existing DOM\n *     structure to display as the button's caption.\n * @param {goog.ui.Menu=} opt_menu Menu to render under the button when clicked.\n * @param {goog.ui.ButtonRenderer=} opt_renderer Optional renderer used to\n *     render or decorate the button; defaults to\n *     {@link goog.ui.ToolbarMenuButtonRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.MenuButton}\n */\ngoog.ui.ToolbarMenuButton = function(\n    content, opt_menu, opt_renderer, opt_domHelper) {\n  goog.ui.MenuButton.call(\n      this, content, opt_menu,\n      opt_renderer || goog.ui.ToolbarMenuButtonRenderer.getInstance(),\n      opt_domHelper);\n};\ngoog.inherits(goog.ui.ToolbarMenuButton, goog.ui.MenuButton);\n\n\n// Registers a decorator factory function for toolbar menu buttons.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.ToolbarMenuButtonRenderer.CSS_CLASS,\n    function() { return new goog.ui.ToolbarMenuButton(null); });\n","^;",1579837703000,"^<",["^=",["~$goog.ui.MenuButton","^?","^3F","~$goog.ui.ToolbarMenuButtonRenderer"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/toolbarmenubutton.js"],"^O",["^=",["~$goog.ui.ToolbarMenuButton"]],"^W",true,"^X",["^?","^8X","^8Y","^3F"]],["^ ","^3",[1579837703000],"^4","goog.db.cursor.js","^5",["^6","goog/db/cursor.js"],"^7","goog/db/cursor.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Wrapper for a IndexedDB cursor.\n *\n */\n\n\ngoog.provide('goog.db.Cursor');\n\ngoog.require('goog.async.Deferred');\ngoog.require('goog.db.Error');\ngoog.require('goog.db.KeyRange');\ngoog.require('goog.debug');\ngoog.require('goog.events.EventTarget');\n\n\n\n/**\n * Creates a new IDBCursor wrapper object. Should not be created directly,\n * access cursor through object store.\n * @see goog.db.ObjectStore#openCursor\n *\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.db.Cursor = function() {\n  goog.db.Cursor.base(this, 'constructor');\n};\ngoog.inherits(goog.db.Cursor, goog.events.EventTarget);\n\n\n/**\n * Underlying IndexedDB cursor object.\n *\n * @type {?IDBCursor}\n * @private\n */\ngoog.db.Cursor.prototype.cursor_ = null;\n\n\n/**\n * Advances the cursor to the next position along its direction. When new data\n * is available, the NEW_DATA event will be fired. If the cursor has reached the\n * end of the range it will fire the COMPLETE event. If opt_key is specified it\n * will advance to the key it matches in its direction.\n *\n * This wraps the native #continue method on the underlying object.\n *\n * @param {IDBKeyType=} opt_key The optional key to advance to.\n */\ngoog.db.Cursor.prototype.next = function(opt_key) {\n  if (opt_key) {\n    this.cursor_['continue'](opt_key);\n  } else {\n    this.cursor_['continue']();\n  }\n};\n\n\n/**\n * Updates the value at the current position of the cursor in the object store.\n * If the cursor points to a value that has just been deleted, a new value is\n * created.\n *\n * @param {*} value The value to be stored.\n * @return {!goog.async.Deferred} The resulting deferred request.\n */\ngoog.db.Cursor.prototype.update = function(value) {\n  var msg = 'updating via cursor with value ';\n  var d = new goog.async.Deferred();\n  var request;\n\n  try {\n    request = this.cursor_.update(value);\n  } catch (err) {\n    msg += goog.debug.deepExpose(value);\n    d.errback(goog.db.Error.fromException(err, msg));\n    return d;\n  }\n  request.onsuccess = function(ev) { d.callback(); };\n  request.onerror = function(ev) {\n    msg += goog.debug.deepExpose(value);\n    d.errback(goog.db.Error.fromRequest(ev.target, msg));\n  };\n  return d;\n};\n\n\n/**\n * Deletes the value at the cursor's position, without changing the cursor's\n * position. Once the value is deleted, the cursor's value is set to null.\n *\n * @return {!goog.async.Deferred} The resulting deferred request.\n */\ngoog.db.Cursor.prototype.remove = function() {\n  var msg = 'deleting via cursor';\n  var d = new goog.async.Deferred();\n  var request;\n\n  try {\n    request = this.cursor_['delete']();\n  } catch (err) {\n    d.errback(goog.db.Error.fromException(err, msg));\n    return d;\n  }\n  request.onsuccess = function(ev) { d.callback(); };\n  request.onerror = function(ev) {\n    d.errback(goog.db.Error.fromRequest(ev.target, msg));\n  };\n  return d;\n};\n\n\n/**\n * @return {*} The value for the value at the cursor's position. Undefined\n *     if no current value, or null if value has just been deleted.\n */\ngoog.db.Cursor.prototype.getValue = function() {\n  return this.cursor_['value'];\n};\n\n\n/**\n * @return {IDBKeyType} The key for the value at the cursor's position. If\n *     the cursor is outside its range, this is undefined.\n */\ngoog.db.Cursor.prototype.getKey = function() {\n  return this.cursor_.key;\n};\n\n\n/**\n * Opens a value cursor from IDBObjectStore or IDBIndex over the specified key\n * range. Returns a cursor object which is able to iterate over the given range.\n * @param {!(IDBObjectStore|IDBIndex)} source Data source to open cursor.\n * @param {!goog.db.KeyRange=} opt_range The key range. If undefined iterates\n *     over the whole data source.\n * @param {!goog.db.Cursor.Direction=} opt_direction The direction. If undefined\n *     moves in a forward direction with duplicates.\n * @return {!goog.db.Cursor} The cursor.\n * @throws {goog.db.Error} If there was a problem opening the cursor.\n */\ngoog.db.Cursor.openCursor = function(source, opt_range, opt_direction) {\n  var cursor = new goog.db.Cursor();\n  var request;\n\n  try {\n    var range = opt_range ? opt_range.range() : null;\n    if (opt_direction) {\n      request = source.openCursor(range, opt_direction);\n    } else {\n      request = source.openCursor(range);\n    }\n  } catch (ex) {\n    cursor.dispose();\n    throw goog.db.Error.fromException(ex, source.name);\n  }\n  request.onsuccess = function(e) {\n    cursor.cursor_ = e.target.result || null;\n    if (cursor.cursor_) {\n      cursor.dispatchEvent(goog.db.Cursor.EventType.NEW_DATA);\n    } else {\n      cursor.dispatchEvent(goog.db.Cursor.EventType.COMPLETE);\n    }\n  };\n  request.onerror = function(e) {\n    cursor.dispatchEvent(goog.db.Cursor.EventType.ERROR);\n  };\n  return cursor;\n};\n\n\n/**\n * Possible cursor directions.\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBCursor\n *\n * @enum {string}\n */\ngoog.db.Cursor.Direction = {\n  NEXT: 'next',\n  NEXT_NO_DUPLICATE: 'nextunique',\n  PREV: 'prev',\n  PREV_NO_DUPLICATE: 'prevunique'\n};\n\n\n/**\n * Event types that the cursor can dispatch. COMPLETE events are dispatched when\n * a cursor is depleted of values, a NEW_DATA event if there is new data\n * available, and ERROR if an error occurred.\n *\n * @enum {string}\n */\ngoog.db.Cursor.EventType = {\n  COMPLETE: 'c',\n  ERROR: 'e',\n  NEW_DATA: 'n'\n};\n","^;",1579837703000,"^<",["^=",["~$goog.db.Error","^?","^3W","~$goog.debug","~$goog.db.KeyRange","^5<"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/db/cursor.js"],"^O",["^=",["~$goog.db.Cursor"]],"^W",true,"^X",["^?","^5<","^8[","^91","^90","^3W"]],["^ ","^3",[1579837703000],"^4","goog.graphics.paths.js","^5",["^6","goog/graphics/paths.js"],"^7","goog/graphics/paths.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Factories for common path types.\n * @author nicksantos@google.com (Nick Santos)\n */\n\n\ngoog.provide('goog.graphics.paths');\n\ngoog.require('goog.graphics.Path');\ngoog.require('goog.math.Coordinate');\n\n\n/**\n * Defines a regular n-gon by specifing the center, a vertex, and the total\n * number of vertices.\n * @param {goog.math.Coordinate} center The center point.\n * @param {goog.math.Coordinate} vertex The vertex, which implicitly defines\n *     a radius as well.\n * @param {number} n The number of vertices.\n * @return {!goog.graphics.Path} The path.\n */\ngoog.graphics.paths.createRegularNGon = function(center, vertex, n) {\n  var path = new goog.graphics.Path();\n  path.moveTo(vertex.x, vertex.y);\n\n  var startAngle = Math.atan2(vertex.y - center.y, vertex.x - center.x);\n  var radius = goog.math.Coordinate.distance(center, vertex);\n  for (var i = 1; i < n; i++) {\n    var angle = startAngle + 2 * Math.PI * (i / n);\n    path.lineTo(\n        center.x + radius * Math.cos(angle),\n        center.y + radius * Math.sin(angle));\n  }\n  path.close();\n  return path;\n};\n\n\n/**\n * Defines an arrow.\n * @param {goog.math.Coordinate} a Point A.\n * @param {goog.math.Coordinate} b Point B.\n * @param {?number} aHead The size of the arrow head at point A.\n *     0 omits the head.\n * @param {?number} bHead The size of the arrow head at point B.\n *     0 omits the head.\n * @return {!goog.graphics.Path} The path.\n */\ngoog.graphics.paths.createArrow = function(a, b, aHead, bHead) {\n  var path = new goog.graphics.Path();\n  path.moveTo(a.x, a.y);\n  path.lineTo(b.x, b.y);\n\n  var angle = Math.atan2(b.y - a.y, b.x - a.x);\n  if (aHead) {\n    path.appendPath(\n        goog.graphics.paths.createRegularNGon(\n            new goog.math.Coordinate(\n                a.x + aHead * Math.cos(angle), a.y + aHead * Math.sin(angle)),\n            a, 3));\n  }\n  if (bHead) {\n    path.appendPath(\n        goog.graphics.paths.createRegularNGon(\n            new goog.math.Coordinate(\n                b.x + bHead * Math.cos(angle + Math.PI),\n                b.y + bHead * Math.sin(angle + Math.PI)),\n            b, 3));\n  }\n  return path;\n};\n","^;",1579837703000,"^<",["^=",["^?","~$goog.graphics.Path","^3="]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/paths.js"],"^O",["^=",["~$goog.graphics.paths"]],"^W",true,"^X",["^?","^93","^3="]],["^ ","^3",[1579837703000],"^4","goog.graphics.ext.ext.js","^5",["^6","goog/graphics/ext/ext.js"],"^7","goog/graphics/ext/ext.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Extended graphics namespace.\n * @suppress {extraRequire} All the requires in this file are \"extra\"\n * because this file is not actually using them.\n */\n\n\ngoog.provide('goog.graphics.ext');\n\ngoog.require('goog.graphics.ext.Ellipse');\ngoog.require('goog.graphics.ext.Graphics');\ngoog.require('goog.graphics.ext.Group');\ngoog.require('goog.graphics.ext.Image');\ngoog.require('goog.graphics.ext.Rectangle');\ngoog.require('goog.graphics.ext.Shape');\ngoog.require('goog.graphics.ext.coordinates');\n","^;",1579837703000,"^<",["^=",["^7:","^?","~$goog.graphics.ext.Ellipse","~$goog.graphics.ext.Group","~$goog.graphics.ext.Rectangle","~$goog.graphics.ext.Graphics","~$goog.graphics.ext.coordinates","~$goog.graphics.ext.Image"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/ext/ext.js"],"^O",["^=",["~$goog.graphics.ext"]],"^W",true,"^X",["^?","^95","^98","^96","^9:","^97","^7:","^99"]],["^ ","^3",[1579837703000],"^4","goog.loader.abstractmodulemanager.js","^5",["^6","goog/loader/abstractmodulemanager.js"],"^7","goog/loader/abstractmodulemanager.js","^8","^9","^:","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The interface for module managers. The default implementation\n * is goog.module.ModuleManager.\n */\n\ngoog.provide('goog.loader.AbstractModuleManager');\ngoog.provide('goog.loader.AbstractModuleManager.CallbackType');\ngoog.provide('goog.loader.AbstractModuleManager.FailureType');\n\ngoog.require('goog.module.AbstractModuleLoader');\ngoog.require('goog.module.ModuleInfo');\ngoog.require('goog.module.ModuleLoadCallback');\n\n\n\n/**\n * The ModuleManager keeps track of all modules in the environment.\n * Since modules may not have their code loaded, we must keep track of them.\n * @abstract\n * @constructor\n * @struct\n */\ngoog.loader.AbstractModuleManager = function() {\n  /**\n   * The module context needed for module initialization.\n   * @private {?Object}\n   */\n  this.moduleContext_ = null;\n\n  /**\n   * A loader for the modules that implements loadModules(ids, moduleInfoMap,\n   * opt_successFn, opt_errorFn, opt_timeoutFn, opt_forceReload) method.\n   * @private {?goog.module.AbstractModuleLoader}\n   */\n  this.loader_ = null;\n};\n\n\n/**\n * The type of callbacks that can be registered with the module manager,.\n * @enum {string}\n */\ngoog.loader.AbstractModuleManager.CallbackType = {\n  /**\n   * Fired when an error has occurred.\n   */\n  ERROR: 'error',\n\n  /**\n   * Fired when it becomes idle and has no more module loads to process.\n   */\n  IDLE: 'idle',\n\n  /**\n   * Fired when it becomes active and has module loads to process.\n   */\n  ACTIVE: 'active',\n\n  /**\n   * Fired when it becomes idle and has no more user-initiated module loads to\n   * process.\n   */\n  USER_IDLE: 'userIdle',\n\n  /**\n   * Fired when it becomes active and has user-initiated module loads to\n   * process.\n   */\n  USER_ACTIVE: 'userActive'\n};\n\n\n/**\n * The possible reasons for a module load failure callback being fired.\n * @enum {number}\n */\ngoog.loader.AbstractModuleManager.FailureType = {\n  /** 401 Status. */\n  UNAUTHORIZED: 0,\n\n  /** Error status (not 401) returned multiple times. */\n  CONSECUTIVE_FAILURES: 1,\n\n  /** Request timeout. */\n  TIMEOUT: 2,\n\n  /** 410 status, old code gone. */\n  OLD_CODE_GONE: 3,\n\n  /** The onLoad callbacks failed. */\n  INIT_ERROR: 4\n};\n\n\n/**\n * A non-HTTP status code indicating a corruption in loaded module.\n * This should be used by a ModuleLoader as a replacement for the HTTP code\n * given to the error handler function to indicated that the module was\n * corrupted.\n * This will set the forceReload flag on the loadModules method when retrying\n * module loading.\n * @type {number}\n */\ngoog.loader.AbstractModuleManager.CORRUPT_RESPONSE_STATUS_CODE = 8001;\n\n\n/**\n * Sets the batch mode as enabled or disabled for the module manager.\n * @param {boolean} enabled Whether the batch mode is to be enabled or not.\n */\ngoog.loader.AbstractModuleManager.prototype.setBatchModeEnabled = function(\n    enabled) {};\n\n\n/**\n * Sets the concurrent loading mode as enabled or disabled for the module\n * manager. Requires a moduleloader implementation that supports concurrent\n * loads. The default {@see goog.module.ModuleLoader} does not.\n * @param {boolean} enabled\n */\ngoog.loader.AbstractModuleManager.prototype.setConcurrentLoadingEnabled =\n    function(enabled) {};\n\n\n/**\n * Sets the module info for all modules. Should only be called once.\n *\n * @param {!Object<!Array<string>>} infoMap An object that contains a mapping\n *    from module id (String) to list of required module ids (Array).\n */\ngoog.loader.AbstractModuleManager.prototype.setAllModuleInfo = function(\n    infoMap) {};\n\n\n/**\n * Sets the module info for all modules. Should only be called once. Also\n * marks modules that are currently being loaded.\n *\n * @param {string=} opt_info A string representation of the module dependency\n *      graph, in the form: module1:dep1,dep2/module2:dep1,dep2 etc.\n *     Where depX is the base-36 encoded position of the dep in the module list.\n * @param {!Array<string>=} opt_loadingModuleIds A list of moduleIds that\n *     are currently being loaded.\n */\ngoog.loader.AbstractModuleManager.prototype.setAllModuleInfoString = function(\n    opt_info, opt_loadingModuleIds) {};\n\n\n/**\n * Gets a module info object by id.\n * @param {string} id A module identifier.\n * @return {!goog.module.ModuleInfo} The module info.\n * @abstract\n */\ngoog.loader.AbstractModuleManager.prototype.getModuleInfo = function(id) {};\n\n\n/**\n * Sets the module uris.\n * @param {!Object<string, !Array<!goog.html.TrustedResourceUrl>>} moduleUriMap\n *     The map of id/uris pairs for each module.\n */\ngoog.loader.AbstractModuleManager.prototype.setModuleTrustedUris = function(\n    moduleUriMap) {};\n\n\n/**\n * Gets the application-specific module loader.\n * @return {?goog.module.AbstractModuleLoader} An object that has a\n *     loadModules(ids, moduleInfoMap, opt_successFn, opt_errFn,\n *         opt_timeoutFn, opt_forceReload) method.\n */\ngoog.loader.AbstractModuleManager.prototype.getLoader = function() {\n  return this.loader_;\n};\n\n\n/**\n * Sets the application-specific module loader.\n * @param {!goog.module.AbstractModuleLoader} loader An object that has a\n *     loadModules(ids, moduleInfoMap, opt_successFn, opt_errFn,\n *         opt_timeoutFn, opt_forceReload) method.\n */\ngoog.loader.AbstractModuleManager.prototype.setLoader = function(loader) {\n  this.loader_ = loader;\n};\n\n\n/**\n * Gets the module context to use to initialize the module.\n * @return {?Object} The context.\n */\ngoog.loader.AbstractModuleManager.prototype.getModuleContext = function() {\n  return this.moduleContext_;\n};\n\n\n/**\n * Sets the module context to use to initialize the module.\n * @param {!Object} context The context.\n */\ngoog.loader.AbstractModuleManager.prototype.setModuleContext = function(\n    context) {\n  this.moduleContext_ = context;\n};\n\n\n/**\n * Determines if the ModuleManager is active\n * @return {boolean} TRUE iff the ModuleManager is active (i.e., not idle).\n */\ngoog.loader.AbstractModuleManager.prototype.isActive = function() {\n  return false;\n};\n\n\n/**\n * Determines if the ModuleManager is user active\n * @return {boolean} TRUE iff the ModuleManager is user active (i.e., not idle).\n */\ngoog.loader.AbstractModuleManager.prototype.isUserActive = function() {\n  return false;\n};\n\n\n/**\n * Preloads a module after a short delay.\n *\n * @param {string} id The id of the module to preload.\n * @param {number=} opt_timeout The number of ms to wait before adding the\n *     module id to the loading queue (defaults to 0 ms). Note that the module\n *     will be loaded asynchronously regardless of the value of this parameter.\n * @return {!IThenable}\n * @abstract\n */\ngoog.loader.AbstractModuleManager.prototype.preloadModule = function(\n    id, opt_timeout) {};\n\n\n/**\n * Prefetches a JavaScript module and its dependencies, which means that the\n * module will be downloaded, but not evaluated. To complete the module load,\n * the caller should also call load or execOnLoad after prefetching the module.\n *\n * @param {string} id The id of the module to prefetch.\n */\ngoog.loader.AbstractModuleManager.prototype.prefetchModule = function(id) {\n  throw new Error('prefetchModule is not implemented.');\n};\n\n\n/**\n * Records that the currently loading module was loaded. Also initiates loading\n * the next module if any module requests are queued. This method is called by\n * code that is generated and appended to each dynamic module's code at\n * compilation time.\n *\n * @abstract\n */\ngoog.loader.AbstractModuleManager.prototype.setLoaded = function() {};\n\n\n/**\n * Gets whether a module is currently loading or in the queue, waiting to be\n * loaded.\n * @param {string} id A module id.\n * @return {boolean} TRUE iff the module is loading.\n * @abstract\n */\ngoog.loader.AbstractModuleManager.prototype.isModuleLoading = function(id) {};\n\n\n/**\n * Requests that a function be called once a particular module is loaded.\n * Client code can use this method to safely call into modules that may not yet\n * be loaded. For consistency, this method always calls the function\n * asynchronously -- even if the module is already loaded. Initiates loading of\n * the module if necessary, unless opt_noLoad is true.\n *\n * @param {string} moduleId A module id.\n * @param {!Function} fn Function to execute when the module has loaded.\n * @param {!Object=} opt_handler Optional handler under whose scope to execute\n *     the callback.\n * @param {boolean=} opt_noLoad TRUE iff not to initiate loading of the module.\n * @param {boolean=} opt_userInitiated TRUE iff the loading of the module was\n *     user initiated.\n * @param {boolean=} opt_preferSynchronous TRUE iff the function should be\n *     executed synchronously if the module has already been loaded.\n * @return {!goog.module.ModuleLoadCallback} A callback wrapper that exposes\n *     an abort and execute method.\n * @abstract\n */\ngoog.loader.AbstractModuleManager.prototype.execOnLoad = function(\n    moduleId, fn, opt_handler, opt_noLoad, opt_userInitiated,\n    opt_preferSynchronous) {};\n\n\n/**\n * Loads a module, returning an IThenable for keeping track of the result.\n *\n * @param {string} moduleId A module id.\n * @param {boolean=} opt_userInitiated If the load is a result of a user action.\n * @return {!IThenable} A deferred object.\n * @abstract\n */\ngoog.loader.AbstractModuleManager.prototype.load = function(\n    moduleId, opt_userInitiated) {};\n\n\n/**\n * Loads a list of modules, returning a map of IThenables for keeping track of\n * the results.\n *\n * @param {!Array<string>} moduleIds A list of module ids.\n * @param {boolean=} opt_userInitiated If the load is a result of a user action.\n * @return {!Object<string, !IThenable>} A mapping from id (String)\n *     to deferred objects that will callback or errback when the load for that\n *     id is finished.\n * @abstract\n */\ngoog.loader.AbstractModuleManager.prototype.loadMultiple = function(\n    moduleIds, opt_userInitiated) {};\n\n\n/**\n * Method called just before module code is loaded.\n * @param {string} id Identifier of the module.\n * @abstract\n */\ngoog.loader.AbstractModuleManager.prototype.beforeLoadModuleCode = function(\n    id) {};\n\n\n/**\n * Register an initialization callback for the currently loading module. This\n * should only be called by script that is executed during the evaluation of\n * a module's javascript. This is almost equivalent to calling the function\n * inline, but ensures that all the code from the currently loading module\n * has been loaded. This makes it cleaner and more robust than calling the\n * function inline.\n *\n * If this function is called from the base module (the one that contains\n * the module manager code), the callback is held until #setAllModuleInfo\n * is called, or until #setModuleContext is called, whichever happens first.\n *\n * @param {!Function} fn A callback function that takes a single argument\n *    which is the module context.\n * @param {!Object=} opt_handler Optional handler under whose scope to execute\n *     the callback.\n */\ngoog.loader.AbstractModuleManager.prototype.registerInitializationCallback =\n    function(fn, opt_handler) {};\n\n\n/**\n * Register a late initialization callback for the currently loading module.\n * Callbacks registered via this function are executed similar to\n * {@see registerInitializationCallback}, but they are fired after all\n * initialization callbacks are called.\n *\n * @param {!Function} fn A callback function that takes a single argument\n *    which is the module context.\n * @param {!Object=} opt_handler Optional handler under whose scope to execute\n *     the callback.\n */\ngoog.loader.AbstractModuleManager.prototype.registerLateInitializationCallback =\n    function(fn, opt_handler) {};\n\n\n/**\n * Sets the constructor to use for the module object for the currently\n * loading module. The constructor should derive from\n * {@see goog.module.BaseModule}.\n * @param {!Function} fn The constructor function.\n */\ngoog.loader.AbstractModuleManager.prototype.setModuleConstructor = function(\n    fn) {};\n\n\n/**\n * The function to call if the module manager is in error.\n * @param {!goog.loader.AbstractModuleManager.CallbackType|!Array<\n *     !goog.loader.AbstractModuleManager.CallbackType>} types The callback\n *         type.\n * @param {!Function} fn The function to register as a callback.\n */\ngoog.loader.AbstractModuleManager.prototype.registerCallback = function(\n    types, fn) {};\n","^;",1579837703000,"^<",["^=",["~$goog.module.AbstractModuleLoader","~$goog.module.ModuleLoadCallback","~$goog.module.ModuleInfo","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/loader/abstractmodulemanager.js"],"^O",["^=",["~$goog.loader.AbstractModuleManager","~$goog.loader.AbstractModuleManager.CallbackType","~$goog.loader.AbstractModuleManager.FailureType"]],"^W",true,"^X",["^?","^9<","^9>","^9="]],["^ ","^3",[1579837703000],"^4","goog.i18n.currencycodemap.js","^5",["^6","goog/i18n/currencycodemap.js"],"^7","goog/i18n/currencycodemap.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Currency code map.\n */\n\n\n/**\n * Namespace for locale number format functions\n */\ngoog.provide('goog.i18n.currencyCodeMap');\ngoog.provide('goog.i18n.currencyCodeMapTier2');\n\n\n/**\n * Deprecated, this data is not being updated. Please use\n * {@link goog.i18n.currency}.\n *\n * The mapping of currency symbol through intl currency code.\n * The source of information is mostly from wikipedia and CLDR. Since there is\n * no authoritative source, items are judged by personal perception.\n\n * If an application need currency support that available in tier2, it\n * should extend currencyCodeMap to include tier2 data by doing this:\n *     goog.object.extend(goog.i18n.currencyCodeMap,\n *                        goog.i18n.currencyCodeMapTier2);\n *\n * @deprecated Use {@link goog.i18n.currency.getLocalCurrencyPattern} instead.\n * @const {!Object<string, string>}\n */\ngoog.i18n.currencyCodeMap = {\n  'AED': '\\u062F\\u002e\\u0625',\n  'ARS': '$',\n  'AUD': '$',\n  'BDT': '\\u09F3',\n  'BRL': 'R$',\n  'CAD': '$',\n  'CHF': 'Fr.',\n  'CLP': '$',\n  'CNY': '\\u00a5',\n  'COP': '$',\n  'CRC': '\\u20a1',\n  'CUP': '$',\n  'CZK': 'K\\u010d',\n  'DKK': 'kr.',\n  'DOP': 'RD$',\n  'EGP': '\\u00a3',\n  'EUR': '\\u20ac',\n  'GBP': '\\u00a3',\n  'HKD': '$',\n  'HRK': 'kn',\n  'HUF': 'Ft',\n  'IDR': 'Rp',\n  'ILS': '\\u20AA',\n  'INR': 'Rs',\n  'IQD': '\\u0639\\u062F',\n  'ISK': 'kr',\n  'JMD': '$',\n  'JPY': '\\u00a5',\n  'KRW': '\\u20A9',\n  'KWD': '\\u062F\\u002e\\u0643',\n  'LKR': 'Rs',\n  'LVL': 'Ls',\n  'MNT': '\\u20AE',\n  'MXN': '$',\n  'MYR': 'RM',\n  'NOK': 'kr',\n  'NZD': '$',\n  'PAB': 'B/.',\n  'PEN': 'S/.',\n  'PHP': 'P',\n  'PKR': 'Rs.',\n  'PLN': 'z\\u0142',\n  'RON': 'L',\n  'RUB': '\\u20bd',\n  'SAR': '\\u0633\\u002E\\u0631',\n  'SEK': 'kr',\n  'SGD': '$',\n  'SYP': 'SYP',\n  'THB': '\\u0e3f',\n  'TRY': 'TL',\n  'TWD': 'NT$',\n  'USD': '$',\n  'UYU': '$',\n  'VEF': 'Bs.F',\n  'VND': '\\u20AB',\n  'XAF': 'FCFA',\n  'XCD': '$',\n  'YER': 'YER',\n  'ZAR': 'R'\n};\n\n\n/**\n * Deprecated, this data is not being updated. Please use\n * {@link goog.i18n.currency}.\n *\n * This group of currency data is unlikely to be used. In case they are,\n * program need to merge it into goog.locale.CurrencyCodeMap.\n *\n * @deprecated Call {@link goog.i18n.currency.addTier2Support} and then use\n *     {@link goog.i18n.currency.getLocalCurrencyPattern}.\n * @const {!Object<string, string>}\n */\ngoog.i18n.currencyCodeMapTier2 = {\n  'AFN': '\\u060b',\n  'ALL': 'Lek',\n  'AMD': '\\u0564\\u0580\\u002e',\n  'ANG': 'ANf.',\n  'AOA': 'Kz',\n  'AWG': '\\u0192',\n  'AZN': '\\u20bc',\n  'BAM': '\\u041a\\u041c',\n  'BBD': '$',\n  'BGN': '\\u043b\\u0432',\n  'BHD': '\\u0628\\u002e\\u062f\\u002e',\n  'BIF': 'FBu',\n  'BMD': '$',\n  'BND': '$',\n  'BOB': 'B$',\n  'BSD': '$',\n  'BTN': 'Nu.',\n  'BWP': 'P',\n  'BYR': 'p.',\n  'BZD': '$',\n  'CDF': 'F',\n  'CUC': 'CUC$',\n  'CVE': '$',\n  'DJF': 'Fdj',\n  'DZD': '\\u062f\\u062C',\n  'ERN': 'Nfk',\n  'ETB': 'Br',\n  'FJD': '$',\n  'FKP': '\\u00a3',\n  'GEL': 'GEL',\n  'GHS': '\\u20B5',\n  'GIP': '\\u00a3',\n  'GMD': 'D',\n  'GNF': 'FG',\n  'GTQ': 'Q',\n  'GYD': '$',\n  'HNL': 'L',\n  'HTG': 'G',\n  'IRR': '\\ufdfc',\n  'JOD': 'JOD',\n  'KES': 'KSh',\n  'KGS': 'som',\n  'KHR': '\\u17DB',\n  'KMF': 'KMF',\n  'KPW': '\\u20A9',\n  'KYD': '$',\n  'KZT': 'KZT',\n  'LAK': '\\u20AD',\n  'LBP': '\\u0644\\u002e\\u0644',\n  'LRD': '$',\n  'LSL': 'L',\n  'LTL': 'Lt',\n  'LYD': '\\u0644\\u002e\\u062F',\n  'MAD': '\\u0645\\u002E\\u062F\\u002E',\n  'MDL': 'MDL',\n  'MGA': 'MGA',\n  'MKD': 'MKD',\n  'MMK': 'K',\n  'MOP': 'MOP$',\n  'MRO': 'UM',\n  'MUR': 'Rs',\n  'MVR': 'Rf',\n  'MWK': 'MK',\n  'MZN': 'MTn',\n  'NAD': '$',\n  'NGN': '\\u20A6',\n  'NIO': 'C$',\n  'NPR': 'Rs',\n  'OMR': '\\u0639\\u002E\\u062F\\u002E',\n  'PGK': 'K',\n  'PYG': 'Gs.',\n  'QAR': '\\u0642\\u002E\\u0631',\n  'RSD': '\\u0420\\u0421\\u0414',\n  'RWF': 'RF',\n  'SBD': '$',\n  'SCR': 'SR',\n  'SDG': 'SDG',\n  'SHP': '\\u00a3',\n  'SLL': 'Le',\n  'SOS': 'So. Sh.',\n  'SRD': '$',\n  'SSP': '£',\n  'STD': 'Db',\n  'SZL': 'L',\n  'TJS': 'TJS',\n  'TND': '\\u062F\\u002e\\u062A ',\n  'TOP': 'T$',\n  'TTD': '$',\n  'TZS': 'TZS',\n  'UAH': 'грн.',\n  'UGX': 'USh',\n  'UZS': 'UZS',\n  'VUV': 'Vt',\n  'WST': 'WS$',\n  'XOF': 'CFA',\n  'XPF': 'F',\n  'ZMW': 'ZMW',\n  'ZWD': '$'\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/currencycodemap.js"],"^O",["^=",["~$goog.i18n.currencyCodeMap","~$goog.i18n.currencyCodeMapTier2"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.messaging.testdata.portchannel_worker.js","^5",["^6","goog/messaging/testdata/portchannel_worker.js"],"^7","goog/messaging/testdata/portchannel_worker.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n\n// Use of this source code is governed by the Apache License, Version 2.0.\n// See the COPYING file for details.\n\n/**\n * @fileoverview A web worker for integration testing the PortChannel class.\n *\n * @nocompile\n */\n\nself.CLOSURE_BASE_PATH = '../../';\nimportScripts('../../bootstrap/webworkers.js');\nimportScripts('../../base.js');\n\n// The provide is necessary to stop the jscompiler from thinking this is an\n// entry point and adding it into the manifest incorrectly.\ngoog.provide('goog.messaging.testdata.portchannel_worker');\ngoog.require('goog.messaging.PortChannel');\n\nfunction registerPing(channel) {\n  channel.registerService(\n      'ping', function(msg) { channel.send('pong', msg); }, true);\n}\n\nfunction startListening() {\n  var channel = new goog.messaging.PortChannel(self);\n  registerPing(channel);\n\n  channel.registerService('addPort', function(port) {\n    port.start();\n    registerPing(new goog.messaging.PortChannel(port));\n  }, true);\n}\n\nstartListening();\n// Signal to portchannel_test that the worker is ready.\npostMessage('loaded');\n","^;",1579837703000,"^<",["^=",["^6U","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/testdata/portchannel_worker.js"],"^O",["^=",["~$goog.messaging.testdata.portchannel-worker","~$goog.messaging.testdata.portchannel_worker"]],"^W",true,"^X",["^?","^6U"]],["^ ","^3",[1579837703000],"^4","goog.structs.heap.js","^5",["^6","goog/structs/heap.js"],"^7","goog/structs/heap.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Datastructure: Heap.\n *\n *\n * This file provides the implementation of a Heap datastructure. Smaller keys\n * rise to the top.\n *\n * The big-O notation for all operations are below:\n * <pre>\n *  Method          big-O\n * ----------------------------------------------------------------------------\n * - insert         O(logn)\n * - remove         O(logn)\n * - peek           O(1)\n * - contains       O(n)\n * </pre>\n */\n// TODO(user): Should this rely on natural ordering via some Comparable\n//     interface?\n\n\ngoog.provide('goog.structs.Heap');\n\ngoog.require('goog.array');\ngoog.require('goog.object');\ngoog.require('goog.structs.Node');\n\n\n\n/**\n * Class for a Heap datastructure.\n *\n * @param {goog.structs.Heap|Object=} opt_heap Optional goog.structs.Heap or\n *     Object to initialize heap with.\n * @constructor\n * @template K, V\n */\ngoog.structs.Heap = function(opt_heap) {\n  /**\n   * The nodes of the heap.\n   * @private\n   * @type {Array<goog.structs.Node>}\n   */\n  this.nodes_ = [];\n\n  if (opt_heap) {\n    this.insertAll(opt_heap);\n  }\n};\n\n\n/**\n * Insert the given value into the heap with the given key.\n * @param {K} key The key.\n * @param {V} value The value.\n */\ngoog.structs.Heap.prototype.insert = function(key, value) {\n  var node = new goog.structs.Node(key, value);\n  var nodes = this.nodes_;\n  nodes.push(node);\n  this.moveUp_(nodes.length - 1);\n};\n\n\n/**\n * Adds multiple key-value pairs from another goog.structs.Heap or Object\n * @param {goog.structs.Heap|Object} heap Object containing the data to add.\n */\ngoog.structs.Heap.prototype.insertAll = function(heap) {\n  var keys, values;\n  if (heap instanceof goog.structs.Heap) {\n    keys = heap.getKeys();\n    values = heap.getValues();\n\n    // If it is a heap and the current heap is empty, I can rely on the fact\n    // that the keys/values are in the correct order to put in the underlying\n    // structure.\n    if (this.getCount() <= 0) {\n      var nodes = this.nodes_;\n      for (var i = 0; i < keys.length; i++) {\n        nodes.push(new goog.structs.Node(keys[i], values[i]));\n      }\n      return;\n    }\n  } else {\n    keys = goog.object.getKeys(heap);\n    values = goog.object.getValues(heap);\n  }\n\n  for (var i = 0; i < keys.length; i++) {\n    this.insert(keys[i], values[i]);\n  }\n};\n\n\n/**\n * Retrieves and removes the root value of this heap.\n * @return {V} The value removed from the root of the heap.  Returns\n *     undefined if the heap is empty.\n */\ngoog.structs.Heap.prototype.remove = function() {\n  var nodes = this.nodes_;\n  var count = nodes.length;\n  var rootNode = nodes[0];\n  if (count <= 0) {\n    return undefined;\n  } else if (count == 1) {\n    goog.array.clear(nodes);\n  } else {\n    nodes[0] = nodes.pop();\n    this.moveDown_(0);\n  }\n  return rootNode.getValue();\n};\n\n\n/**\n * Retrieves but does not remove the root value of this heap.\n * @return {V} The value at the root of the heap. Returns\n *     undefined if the heap is empty.\n */\ngoog.structs.Heap.prototype.peek = function() {\n  var nodes = this.nodes_;\n  if (nodes.length == 0) {\n    return undefined;\n  }\n  return nodes[0].getValue();\n};\n\n\n/**\n * Retrieves but does not remove the key of the root node of this heap.\n * @return {K} The key at the root of the heap. Returns undefined if the\n *     heap is empty.\n */\ngoog.structs.Heap.prototype.peekKey = function() {\n  return this.nodes_[0] && this.nodes_[0].getKey();\n};\n\n\n/**\n * Moves the node at the given index down to its proper place in the heap.\n * @param {number} index The index of the node to move down.\n * @private\n */\ngoog.structs.Heap.prototype.moveDown_ = function(index) {\n  var nodes = this.nodes_;\n  var count = nodes.length;\n\n  // Save the node being moved down.\n  var node = nodes[index];\n  // While the current node has a child.\n  while (index < (count >> 1)) {\n    var leftChildIndex = this.getLeftChildIndex_(index);\n    var rightChildIndex = this.getRightChildIndex_(index);\n\n    // Determine the index of the smaller child.\n    var smallerChildIndex = rightChildIndex < count &&\n            nodes[rightChildIndex].getKey() < nodes[leftChildIndex].getKey() ?\n        rightChildIndex :\n        leftChildIndex;\n\n    // If the node being moved down is smaller than its children, the node\n    // has found the correct index it should be at.\n    if (nodes[smallerChildIndex].getKey() > node.getKey()) {\n      break;\n    }\n\n    // If not, then take the smaller child as the current node.\n    nodes[index] = nodes[smallerChildIndex];\n    index = smallerChildIndex;\n  }\n  nodes[index] = node;\n};\n\n\n/**\n * Moves the node at the given index up to its proper place in the heap.\n * @param {number} index The index of the node to move up.\n * @private\n */\ngoog.structs.Heap.prototype.moveUp_ = function(index) {\n  var nodes = this.nodes_;\n  var node = nodes[index];\n\n  // While the node being moved up is not at the root.\n  while (index > 0) {\n    // If the parent is less than the node being moved up, move the parent down.\n    var parentIndex = this.getParentIndex_(index);\n    if (nodes[parentIndex].getKey() > node.getKey()) {\n      nodes[index] = nodes[parentIndex];\n      index = parentIndex;\n    } else {\n      break;\n    }\n  }\n  nodes[index] = node;\n};\n\n\n/**\n * Gets the index of the left child of the node at the given index.\n * @param {number} index The index of the node to get the left child for.\n * @return {number} The index of the left child.\n * @private\n */\ngoog.structs.Heap.prototype.getLeftChildIndex_ = function(index) {\n  return index * 2 + 1;\n};\n\n\n/**\n * Gets the index of the right child of the node at the given index.\n * @param {number} index The index of the node to get the right child for.\n * @return {number} The index of the right child.\n * @private\n */\ngoog.structs.Heap.prototype.getRightChildIndex_ = function(index) {\n  return index * 2 + 2;\n};\n\n\n/**\n * Gets the index of the parent of the node at the given index.\n * @param {number} index The index of the node to get the parent for.\n * @return {number} The index of the parent.\n * @private\n */\ngoog.structs.Heap.prototype.getParentIndex_ = function(index) {\n  return (index - 1) >> 1;\n};\n\n\n/**\n * Gets the values of the heap.\n * @return {!Array<V>} The values in the heap.\n */\ngoog.structs.Heap.prototype.getValues = function() {\n  var nodes = this.nodes_;\n  var rv = [];\n  var l = nodes.length;\n  for (var i = 0; i < l; i++) {\n    rv.push(nodes[i].getValue());\n  }\n  return rv;\n};\n\n\n/**\n * Gets the keys of the heap.\n * @return {!Array<K>} The keys in the heap.\n */\ngoog.structs.Heap.prototype.getKeys = function() {\n  var nodes = this.nodes_;\n  var rv = [];\n  var l = nodes.length;\n  for (var i = 0; i < l; i++) {\n    rv.push(nodes[i].getKey());\n  }\n  return rv;\n};\n\n\n/**\n * Whether the heap contains the given value.\n * @param {V} val The value to check for.\n * @return {boolean} Whether the heap contains the value.\n */\ngoog.structs.Heap.prototype.containsValue = function(val) {\n  return goog.array.some(\n      this.nodes_, function(node) { return node.getValue() == val; });\n};\n\n\n/**\n * Whether the heap contains the given key.\n * @param {K} key The key to check for.\n * @return {boolean} Whether the heap contains the key.\n */\ngoog.structs.Heap.prototype.containsKey = function(key) {\n  return goog.array.some(\n      this.nodes_, function(node) { return node.getKey() == key; });\n};\n\n\n/**\n * Clones a heap and returns a new heap\n * @return {!goog.structs.Heap} A new goog.structs.Heap with the same key-value\n *     pairs.\n */\ngoog.structs.Heap.prototype.clone = function() {\n  return new goog.structs.Heap(this);\n};\n\n\n/**\n * The number of key-value pairs in the map\n * @return {number} The number of pairs.\n */\ngoog.structs.Heap.prototype.getCount = function() {\n  return this.nodes_.length;\n};\n\n\n/**\n * Returns true if this heap contains no elements.\n * @return {boolean} Whether this heap contains no elements.\n */\ngoog.structs.Heap.prototype.isEmpty = function() {\n  return goog.array.isEmpty(this.nodes_);\n};\n\n\n/**\n * Removes all elements from the heap.\n */\ngoog.structs.Heap.prototype.clear = function() {\n  goog.array.clear(this.nodes_);\n};\n","^;",1579837703000,"^<",["^=",["^?","^42","^2O","~$goog.structs.Node"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/heap.js"],"^O",["^=",["~$goog.structs.Heap"]],"^W",true,"^X",["^?","^2O","^42","^9F"]],["^ ","^3",[1579837703000],"^4","goog.dom.annotate.js","^5",["^6","goog/dom/annotate.js"],"^7","goog/dom/annotate.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Methods for annotating occurrences of query terms in text or\n *   in a DOM tree. Adapted from Gmail code.\n *\n */\n\ngoog.provide('goog.dom.annotate');\ngoog.provide('goog.dom.annotate.AnnotateFn');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.object');\n\n\n/**\n * A function that takes:\n *   (1) the number of the term that is \"hit\",\n *   (2) the HTML (search term) to be annotated,\n * and returns the annotated term as an HTML.\n * @typedef {function(number, !goog.html.SafeHtml): !goog.html.SafeHtml}\n */\ngoog.dom.annotate.AnnotateFn;\n\n\n/**\n * Calls `annotateFn` for each occurrence of a search term in text nodes\n * under `node`. Returns the number of hits.\n *\n * @param {Node} node  A DOM node.\n * @param {Array<!Array<string|boolean>>} terms\n *   An array of [searchTerm, matchWholeWordOnly] tuples.\n *   The matchWholeWordOnly value is a per-term attribute because some terms\n *   may be CJK, while others are not. (For correctness, matchWholeWordOnly\n *   should always be false for CJK terms.).\n * @param {goog.dom.annotate.AnnotateFn} annotateFn\n * @param {*=} opt_ignoreCase  Whether to ignore the case of the query\n *   terms when looking for matches.\n * @param {Array<string>=} opt_classesToSkip  Nodes with one of these CSS class\n *   names (and its descendants) will be skipped.\n * @param {number=} opt_maxMs  Number of milliseconds after which this function,\n *   if still annotating, should stop and return.\n *\n * @return {boolean} Whether any terms were annotated.\n */\ngoog.dom.annotate.annotateTerms = function(\n    node, terms, annotateFn, opt_ignoreCase, opt_classesToSkip, opt_maxMs) {\n  if (opt_ignoreCase) {\n    terms = goog.dom.annotate.lowercaseTerms_(terms);\n  }\n  var stopTime = +opt_maxMs > 0 ? goog.now() + opt_maxMs : 0;\n\n  return goog.dom.annotate.annotateTermsInNode_(\n      node, terms, annotateFn, opt_ignoreCase, opt_classesToSkip || [],\n      stopTime, 0);\n};\n\n\n/**\n * The maximum recursion depth allowed. Any DOM nodes deeper than this are\n * ignored.\n * @type {number}\n * @private\n */\ngoog.dom.annotate.MAX_RECURSION_ = 200;\n\n\n/**\n * The node types whose descendants should not be affected by annotation.\n * @private {!Object<string, boolean>}\n */\ngoog.dom.annotate.NODES_TO_SKIP_ = goog.object.createSet(\n    goog.dom.TagName.SCRIPT, goog.dom.TagName.STYLE, goog.dom.TagName.TEXTAREA);\n\n\n/**\n * Recursive helper function.\n *\n * @param {Node} node  A DOM node.\n * @param {Array<!Array<string|boolean>>} terms\n *     An array of [searchTerm, matchWholeWordOnly] tuples.\n *     The matchWholeWordOnly value is a per-term attribute because some terms\n *     may be CJK, while others are not. (For correctness, matchWholeWordOnly\n *     should always be false for CJK terms.).\n * @param {goog.dom.annotate.AnnotateFn} annotateFn\n * @param {*} ignoreCase  Whether to ignore the case of the query terms\n *     when looking for matches.\n * @param {Array<string>} classesToSkip  Nodes with one of these CSS class\n *     names will be skipped (as will their descendants).\n * @param {number} stopTime  Deadline for annotation operation (ignored if 0).\n * @param {number} recursionLevel  How deep this recursive call is; pass the\n *     value 0 in the initial call.\n * @return {boolean} Whether any terms were annotated.\n * @private\n */\ngoog.dom.annotate.annotateTermsInNode_ = function(\n    node, terms, annotateFn, ignoreCase, classesToSkip, stopTime,\n    recursionLevel) {\n  if ((stopTime > 0 && goog.now() >= stopTime) ||\n      recursionLevel > goog.dom.annotate.MAX_RECURSION_) {\n    return false;\n  }\n\n  var annotated = false;\n\n  if (node.nodeType == goog.dom.NodeType.TEXT) {\n    var html = goog.dom.annotate.helpAnnotateText_(\n        node.nodeValue, terms, annotateFn, ignoreCase);\n    if (html != null) {\n      // Replace the text with the annotated html. First we put the html into\n      // a temporary node, to get its DOM structure. To avoid adding a wrapper\n      // element as a side effect, we'll only actually use the temporary node's\n      // children.\n      var tempNode =\n          goog.dom.getDomHelper(node).createElement(goog.dom.TagName.SPAN);\n      goog.dom.safe.setInnerHtml(tempNode, html);\n\n      var parentNode = node.parentNode;\n      var nodeToInsert;\n      while ((nodeToInsert = tempNode.firstChild) != null) {\n        // Each parentNode.insertBefore call removes the inserted node from\n        // tempNode's list of children.\n        parentNode.insertBefore(nodeToInsert, node);\n      }\n\n      parentNode.removeChild(node);\n      annotated = true;\n    }\n  } else if (\n      node.hasChildNodes() &&\n      !goog.dom.annotate\n           .NODES_TO_SKIP_[/** @type {!Element} */ (node).tagName]) {\n    var classes = /** @type {!Element} */ (node).className.split(/\\s+/);\n    var skip = goog.array.some(classes, function(className) {\n      return goog.array.contains(classesToSkip, className);\n    });\n\n    if (!skip) {\n      ++recursionLevel;\n      var curNode = node.firstChild;\n      while (curNode) {\n        var nextNode = curNode.nextSibling;\n        var curNodeAnnotated = goog.dom.annotate.annotateTermsInNode_(\n            curNode, terms, annotateFn, ignoreCase, classesToSkip, stopTime,\n            recursionLevel);\n        annotated = annotated || curNodeAnnotated;\n        curNode = nextNode;\n      }\n    }\n  }\n\n  return annotated;\n};\n\n\n/**\n * Regular expression that matches non-word characters.\n *\n * Performance note: Testing a one-character string using this regex is as fast\n * as the equivalent string test (\"a-zA-Z0-9_\".indexOf(c) < 0), give or take a\n * few percent. (The regex is about 5% faster in IE 6 and about 4% slower in\n * Firefox 1.5.) If performance becomes critical, it may be better to convert\n * the character to a numerical char code and check whether it falls in the\n * word character ranges. A quick test suggests that could be 33% faster.\n *\n * @type {RegExp}\n * @private\n */\ngoog.dom.annotate.NONWORD_RE_ = /\\W/;\n\n\n/**\n * Annotates occurrences of query terms in plain text. This process consists of\n * identifying all occurrences of all query terms, calling a provided function\n * to get the appropriate replacement HTML for each occurrence, and\n * HTML-escaping all the text.\n *\n * @param {string} text  The plain text to be searched.\n * @param {Array<Array<?>>} terms  An array of\n *   [{string} searchTerm, {boolean} matchWholeWordOnly] tuples.\n *   The matchWholeWordOnly value is a per-term attribute because some terms\n *   may be CJK, while others are not. (For correctness, matchWholeWordOnly\n *   should always be false for CJK terms.).\n * @param {goog.dom.annotate.AnnotateFn} annotateFn\n * @param {*=} opt_ignoreCase  Whether to ignore the case of the query\n *   terms when looking for matches.\n * @return {goog.html.SafeHtml} The HTML equivalent of `text` with terms\n *   annotated, or null if the text did not contain any of the terms.\n */\ngoog.dom.annotate.annotateText = function(\n    text, terms, annotateFn, opt_ignoreCase) {\n  if (opt_ignoreCase) {\n    terms = goog.dom.annotate.lowercaseTerms_(terms);\n  }\n  return goog.dom.annotate.helpAnnotateText_(\n      text, terms, annotateFn, opt_ignoreCase);\n};\n\n\n/**\n * Annotates occurrences of query terms in plain text. This process consists of\n * identifying all occurrences of all query terms, calling a provided function\n * to get the appropriate replacement HTML for each occurrence, and\n * HTML-escaping all the text.\n *\n * @param {string} text  The plain text to be searched.\n * @param {Array<Array<?>>} terms  An array of\n *   [{string} searchTerm, {boolean} matchWholeWordOnly] tuples.\n *   If `ignoreCase` is true, each search term must already be lowercase.\n *   The matchWholeWordOnly value is a per-term attribute because some terms\n *   may be CJK, while others are not. (For correctness, matchWholeWordOnly\n *   should always be false for CJK terms.).\n * @param {goog.dom.annotate.AnnotateFn} annotateFn\n * @param {*} ignoreCase  Whether to ignore the case of the query terms\n *   when looking for matches.\n * @return {goog.html.SafeHtml} The HTML equivalent of `text` with terms\n *   annotated, or null if the text did not contain any of the terms.\n * @private\n */\ngoog.dom.annotate.helpAnnotateText_ = function(\n    text, terms, annotateFn, ignoreCase) {\n  var hit = false;\n  var textToSearch = ignoreCase ? text.toLowerCase() : text;\n  var textLen = textToSearch.length;\n  var numTerms = terms.length;\n\n  // Each element will be an array of hit positions for the term.\n  var termHits = new Array(numTerms);\n\n  // First collect all the hits into allHits.\n  for (var i = 0; i < numTerms; i++) {\n    var term = terms[i];\n    var hits = [];\n    var termText = term[0];\n    if (termText != '') {\n      var matchWholeWordOnly = term[1];\n      var termLen = termText.length;\n      var pos = 0;\n      // Find each hit for term t and append to termHits.\n      while (pos < textLen) {\n        var hitPos = textToSearch.indexOf(termText, pos);\n        if (hitPos == -1) {\n          break;\n        } else {\n          var prevCharPos = hitPos - 1;\n          var nextCharPos = hitPos + termLen;\n          if (!matchWholeWordOnly ||\n              ((prevCharPos < 0 ||\n                goog.dom.annotate.NONWORD_RE_.test(\n                    textToSearch.charAt(prevCharPos))) &&\n               (nextCharPos >= textLen ||\n                goog.dom.annotate.NONWORD_RE_.test(\n                    textToSearch.charAt(nextCharPos))))) {\n            hits.push(hitPos);\n            hit = true;\n          }\n          pos = hitPos + termLen;\n        }\n      }\n    }\n    termHits[i] = hits;\n  }\n\n  if (hit) {\n    var html = [];\n    var pos = 0;\n\n    while (true) {\n      // First determine which of the n terms is the next hit.\n      var termIndexOfNextHit;\n      var posOfNextHit = -1;\n\n      for (var i = 0; i < numTerms; i++) {\n        var hits = termHits[i];\n        // pull off the position of the next hit of term t\n        // (it's always the first in the array because we're shifting\n        // hits off the front of the array as we process them)\n        // this is the next candidate to consider for the next overall hit\n        if (!goog.array.isEmpty(hits)) {\n          var hitPos = hits[0];\n\n          // Discard any hits embedded in the previous hit.\n          while (hitPos >= 0 && hitPos < pos) {\n            hits.shift();\n            hitPos = goog.array.isEmpty(hits) ? -1 : hits[0];\n          }\n\n          if (hitPos >= 0 && (posOfNextHit < 0 || hitPos < posOfNextHit)) {\n            termIndexOfNextHit = i;\n            posOfNextHit = hitPos;\n          }\n        }\n      }\n\n      // Quit if there are no more hits.\n      if (posOfNextHit < 0) break;\n      goog.asserts.assertNumber(termIndexOfNextHit);\n\n      // Remove the next hit from our hit list.\n      termHits[termIndexOfNextHit].shift();\n\n      // Append everything from the end of the last hit up to this one.\n      html.push(text.substr(pos, posOfNextHit - pos));\n\n      // Append the annotated term.\n      var termLen = terms[termIndexOfNextHit][0].length;\n      var termHtml =\n          goog.html.SafeHtml.htmlEscape(text.substr(posOfNextHit, termLen));\n      html.push(\n          annotateFn(goog.asserts.assertNumber(termIndexOfNextHit), termHtml));\n\n      pos = posOfNextHit + termLen;\n    }\n\n    // Append everything after the last hit.\n    html.push(text.substr(pos));\n    return goog.html.SafeHtml.concat(html);\n  } else {\n    return null;\n  }\n};\n\n\n/**\n * Converts terms to lowercase.\n *\n * @param {Array<Array<?>>} terms  An array of\n *   [{string} searchTerm, {boolean} matchWholeWordOnly] tuples.\n * @return {!Array<Array<?>>}  An array of\n *   [{string} searchTerm, {boolean} matchWholeWordOnly] tuples.\n * @private\n */\ngoog.dom.annotate.lowercaseTerms_ = function(terms) {\n  var lowercaseTerms = [];\n  for (var i = 0; i < terms.length; ++i) {\n    var term = terms[i];\n    lowercaseTerms[i] = [term[0].toLowerCase(), term[1]];\n  }\n  return lowercaseTerms;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^1>","^2K","^?","^42","^1E","^2O","^1I","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/annotate.js"],"^O",["^=",["~$goog.dom.annotate","~$goog.dom.annotate.AnnotateFn"]],"^W",true,"^X",["^?","^2O","^1L","^1>","^2K","^12","^1E","^1I","^42"]],["^ ","^3",[1579837703000],"^4","goog.graphics.affinetransform.js","^5",["^6","goog/graphics/affinetransform.js"],"^7","goog/graphics/affinetransform.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Provides an object representation of an AffineTransform and\n * methods for working with it.\n */\n\n\ngoog.provide('goog.graphics.AffineTransform');\n\n\n\n/**\n * Creates a 2D affine transform. An affine transform performs a linear\n * mapping from 2D coordinates to other 2D coordinates that preserves the\n * \"straightness\" and \"parallelness\" of lines.\n *\n * Such a coordinate transformation can be represented by a 3 row by 3 column\n * matrix with an implied last row of [ 0 0 1 ]. This matrix transforms source\n * coordinates (x,y) into destination coordinates (x',y') by considering them\n * to be a column vector and multiplying the coordinate vector by the matrix\n * according to the following process:\n * <pre>\n *      [ x']   [  m00  m01  m02  ] [ x ]   [ m00x + m01y + m02 ]\n *      [ y'] = [  m10  m11  m12  ] [ y ] = [ m10x + m11y + m12 ]\n *      [ 1 ]   [   0    0    1   ] [ 1 ]   [         1         ]\n * </pre>\n *\n * This class is optimized for speed and minimizes calculations based on its\n * knowledge of the underlying matrix (as opposed to say simply performing\n * matrix multiplication).\n *\n * @param {number=} opt_m00 The m00 coordinate of the transform.\n * @param {number=} opt_m10 The m10 coordinate of the transform.\n * @param {number=} opt_m01 The m01 coordinate of the transform.\n * @param {number=} opt_m11 The m11 coordinate of the transform.\n * @param {number=} opt_m02 The m02 coordinate of the transform.\n * @param {number=} opt_m12 The m12 coordinate of the transform.\n * @constructor\n * @final\n */\ngoog.graphics.AffineTransform = function(\n    opt_m00, opt_m10, opt_m01, opt_m11, opt_m02, opt_m12) {\n  if (arguments.length == 6) {\n    this.setTransform(\n        /** @type {number} */ (opt_m00),\n        /** @type {number} */ (opt_m10),\n        /** @type {number} */ (opt_m01),\n        /** @type {number} */ (opt_m11),\n        /** @type {number} */ (opt_m02),\n        /** @type {number} */ (opt_m12));\n  } else if (arguments.length != 0) {\n    throw new Error('Insufficient matrix parameters');\n  } else {\n    this.m00_ = this.m11_ = 1;\n    this.m10_ = this.m01_ = this.m02_ = this.m12_ = 0;\n  }\n};\n\n\n/**\n * @return {boolean} Whether this transform is the identity transform.\n */\ngoog.graphics.AffineTransform.prototype.isIdentity = function() {\n  return this.m00_ == 1 && this.m10_ == 0 && this.m01_ == 0 && this.m11_ == 1 &&\n      this.m02_ == 0 && this.m12_ == 0;\n};\n\n\n/**\n * @return {!goog.graphics.AffineTransform} A copy of this transform.\n */\ngoog.graphics.AffineTransform.prototype.clone = function() {\n  return new goog.graphics.AffineTransform(\n      this.m00_, this.m10_, this.m01_, this.m11_, this.m02_, this.m12_);\n};\n\n\n/**\n * Sets this transform to the matrix specified by the 6 values.\n *\n * @param {number} m00 The m00 coordinate of the transform.\n * @param {number} m10 The m10 coordinate of the transform.\n * @param {number} m01 The m01 coordinate of the transform.\n * @param {number} m11 The m11 coordinate of the transform.\n * @param {number} m02 The m02 coordinate of the transform.\n * @param {number} m12 The m12 coordinate of the transform.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.setTransform = function(\n    m00, m10, m01, m11, m02, m12) {\n  if (typeof m00 !== 'number' || typeof m10 !== 'number' ||\n      typeof m01 !== 'number' || typeof m11 !== 'number' ||\n      typeof m02 !== 'number' || typeof m12 !== 'number') {\n    throw new Error('Invalid transform parameters');\n  }\n  this.m00_ = m00;\n  this.m10_ = m10;\n  this.m01_ = m01;\n  this.m11_ = m11;\n  this.m02_ = m02;\n  this.m12_ = m12;\n  return this;\n};\n\n\n/**\n * Sets this transform to be identical to the given transform.\n *\n * @param {!goog.graphics.AffineTransform} tx The transform to copy.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.copyFrom = function(tx) {\n  this.m00_ = tx.m00_;\n  this.m10_ = tx.m10_;\n  this.m01_ = tx.m01_;\n  this.m11_ = tx.m11_;\n  this.m02_ = tx.m02_;\n  this.m12_ = tx.m12_;\n  return this;\n};\n\n\n/**\n * Concatenates this transform with a scaling transformation.\n *\n * @param {number} sx The x-axis scaling factor.\n * @param {number} sy The y-axis scaling factor.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.scale = function(sx, sy) {\n  this.m00_ *= sx;\n  this.m10_ *= sx;\n  this.m01_ *= sy;\n  this.m11_ *= sy;\n  return this;\n};\n\n\n/**\n * Pre-concatenates this transform with a scaling transformation,\n * i.e. calculates the following matrix product:\n *\n * <pre>\n * [sx  0 0] [m00 m01 m02]\n * [ 0 sy 0] [m10 m11 m12]\n * [ 0  0 1] [  0   0   1]\n * </pre>\n *\n * @param {number} sx The x-axis scaling factor.\n * @param {number} sy The y-axis scaling factor.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.preScale = function(sx, sy) {\n  this.m00_ *= sx;\n  this.m01_ *= sx;\n  this.m02_ *= sx;\n  this.m10_ *= sy;\n  this.m11_ *= sy;\n  this.m12_ *= sy;\n  return this;\n};\n\n\n/**\n * Concatenates this transform with a translate transformation.\n *\n * @param {number} dx The distance to translate in the x direction.\n * @param {number} dy The distance to translate in the y direction.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.translate = function(dx, dy) {\n  this.m02_ += dx * this.m00_ + dy * this.m01_;\n  this.m12_ += dx * this.m10_ + dy * this.m11_;\n  return this;\n};\n\n\n/**\n * Pre-concatenates this transform with a translate transformation,\n * i.e. calculates the following matrix product:\n *\n * <pre>\n * [1 0 dx] [m00 m01 m02]\n * [0 1 dy] [m10 m11 m12]\n * [0 0  1] [  0   0   1]\n * </pre>\n *\n * @param {number} dx The distance to translate in the x direction.\n * @param {number} dy The distance to translate in the y direction.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.preTranslate = function(dx, dy) {\n  this.m02_ += dx;\n  this.m12_ += dy;\n  return this;\n};\n\n\n/**\n * Concatenates this transform with a rotation transformation around an anchor\n * point.\n *\n * @param {number} theta The angle of rotation measured in radians.\n * @param {number} x The x coordinate of the anchor point.\n * @param {number} y The y coordinate of the anchor point.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.rotate = function(theta, x, y) {\n  return this.concatenate(\n      goog.graphics.AffineTransform.getRotateInstance(theta, x, y));\n};\n\n\n/**\n * Pre-concatenates this transform with a rotation transformation around an\n * anchor point.\n *\n * @param {number} theta The angle of rotation measured in radians.\n * @param {number} x The x coordinate of the anchor point.\n * @param {number} y The y coordinate of the anchor point.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.preRotate = function(theta, x, y) {\n  return this.preConcatenate(\n      goog.graphics.AffineTransform.getRotateInstance(theta, x, y));\n};\n\n\n/**\n * Concatenates this transform with a shear transformation.\n *\n * @param {number} shx The x shear factor.\n * @param {number} shy The y shear factor.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.shear = function(shx, shy) {\n  const m00 = this.m00_;\n  const m10 = this.m10_;\n  this.m00_ += shy * this.m01_;\n  this.m10_ += shy * this.m11_;\n  this.m01_ += shx * m00;\n  this.m11_ += shx * m10;\n  return this;\n};\n\n\n/**\n * Pre-concatenates this transform with a shear transformation.\n * i.e. calculates the following matrix product:\n *\n * <pre>\n * [  1 shx 0] [m00 m01 m02]\n * [shy   1 0] [m10 m11 m12]\n * [  0   0 1] [  0   0   1]\n * </pre>\n *\n * @param {number} shx The x shear factor.\n * @param {number} shy The y shear factor.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.preShear = function(shx, shy) {\n  const m00 = this.m00_;\n  const m01 = this.m01_;\n  const m02 = this.m02_;\n  this.m00_ += shx * this.m10_;\n  this.m01_ += shx * this.m11_;\n  this.m02_ += shx * this.m12_;\n  this.m10_ += shy * m00;\n  this.m11_ += shy * m01;\n  this.m12_ += shy * m02;\n  return this;\n};\n\n\n/**\n * @return {string} A string representation of this transform. The format of\n *     of the string is compatible with SVG matrix notation, i.e.\n *     \"matrix(a,b,c,d,e,f)\".\n * @override\n */\ngoog.graphics.AffineTransform.prototype.toString = function() {\n  return 'matrix(' +\n      [this.m00_, this.m10_, this.m01_, this.m11_, this.m02_, this.m12_].join(\n          ',') +\n      ')';\n};\n\n\n/**\n * @return {number} The scaling factor in the x-direction (m00).\n */\ngoog.graphics.AffineTransform.prototype.getScaleX = function() {\n  return this.m00_;\n};\n\n\n/**\n * @return {number} The scaling factor in the y-direction (m11).\n */\ngoog.graphics.AffineTransform.prototype.getScaleY = function() {\n  return this.m11_;\n};\n\n\n/**\n * @return {number} The translation in the x-direction (m02).\n */\ngoog.graphics.AffineTransform.prototype.getTranslateX = function() {\n  return this.m02_;\n};\n\n\n/**\n * @return {number} The translation in the y-direction (m12).\n */\ngoog.graphics.AffineTransform.prototype.getTranslateY = function() {\n  return this.m12_;\n};\n\n\n/**\n * @return {number} The shear factor in the x-direction (m01).\n */\ngoog.graphics.AffineTransform.prototype.getShearX = function() {\n  return this.m01_;\n};\n\n\n/**\n * @return {number} The shear factor in the y-direction (m10).\n */\ngoog.graphics.AffineTransform.prototype.getShearY = function() {\n  return this.m10_;\n};\n\n\n/**\n * Concatenates an affine transform to this transform.\n *\n * @param {!goog.graphics.AffineTransform} tx The transform to concatenate.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.concatenate = function(tx) {\n  let m0 = this.m00_;\n  let m1 = this.m01_;\n  this.m00_ = tx.m00_ * m0 + tx.m10_ * m1;\n  this.m01_ = tx.m01_ * m0 + tx.m11_ * m1;\n  this.m02_ += tx.m02_ * m0 + tx.m12_ * m1;\n\n  m0 = this.m10_;\n  m1 = this.m11_;\n  this.m10_ = tx.m00_ * m0 + tx.m10_ * m1;\n  this.m11_ = tx.m01_ * m0 + tx.m11_ * m1;\n  this.m12_ += tx.m02_ * m0 + tx.m12_ * m1;\n  return this;\n};\n\n\n/**\n * Pre-concatenates an affine transform to this transform.\n *\n * @param {!goog.graphics.AffineTransform} tx The transform to preconcatenate.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.preConcatenate = function(tx) {\n  let m0 = this.m00_;\n  let m1 = this.m10_;\n  this.m00_ = tx.m00_ * m0 + tx.m01_ * m1;\n  this.m10_ = tx.m10_ * m0 + tx.m11_ * m1;\n\n  m0 = this.m01_;\n  m1 = this.m11_;\n  this.m01_ = tx.m00_ * m0 + tx.m01_ * m1;\n  this.m11_ = tx.m10_ * m0 + tx.m11_ * m1;\n\n  m0 = this.m02_;\n  m1 = this.m12_;\n  this.m02_ = tx.m00_ * m0 + tx.m01_ * m1 + tx.m02_;\n  this.m12_ = tx.m10_ * m0 + tx.m11_ * m1 + tx.m12_;\n  return this;\n};\n\n\n/**\n * Transforms an array of coordinates by this transform and stores the result\n * into a destination array.\n *\n * @param {!Array<number>} src The array containing the source points\n *     as x, y value pairs.\n * @param {number} srcOff The offset to the first point to be transformed.\n * @param {!Array<number>} dst The array into which to store the transformed\n *     point pairs.\n * @param {number} dstOff The offset of the location of the first transformed\n *     point in the destination array.\n * @param {number} numPts The number of points to transform.\n */\ngoog.graphics.AffineTransform.prototype.transform = function(\n    src, srcOff, dst, dstOff, numPts) {\n  let i = srcOff;\n  let j = dstOff;\n  const srcEnd = srcOff + 2 * numPts;\n  while (i < srcEnd) {\n    const x = src[i++];\n    const y = src[i++];\n    dst[j++] = x * this.m00_ + y * this.m01_ + this.m02_;\n    dst[j++] = x * this.m10_ + y * this.m11_ + this.m12_;\n  }\n};\n\n\n/**\n * @return {number} The determinant of this transform.\n */\ngoog.graphics.AffineTransform.prototype.getDeterminant = function() {\n  return this.m00_ * this.m11_ - this.m01_ * this.m10_;\n};\n\n\n/**\n * Returns whether the transform is invertible. A transform is not invertible\n * if the determinant is 0 or any value is non-finite or NaN.\n *\n * @return {boolean} Whether the transform is invertible.\n */\ngoog.graphics.AffineTransform.prototype.isInvertible = function() {\n  const det = this.getDeterminant();\n  return isFinite(det) && isFinite(this.m02_) && isFinite(this.m12_) &&\n      det != 0;\n};\n\n\n/**\n * @return {!goog.graphics.AffineTransform} An AffineTransform object\n *     representing the inverse transformation.\n */\ngoog.graphics.AffineTransform.prototype.createInverse = function() {\n  const det = this.getDeterminant();\n  return new goog.graphics.AffineTransform(\n      this.m11_ / det, -this.m10_ / det, -this.m01_ / det, this.m00_ / det,\n      (this.m01_ * this.m12_ - this.m11_ * this.m02_) / det,\n      (this.m10_ * this.m02_ - this.m00_ * this.m12_) / det);\n};\n\n\n/**\n * Creates a transform representing a scaling transformation.\n *\n * @param {number} sx The x-axis scaling factor.\n * @param {number} sy The y-axis scaling factor.\n * @return {!goog.graphics.AffineTransform} A transform representing a scaling\n *     transformation.\n */\ngoog.graphics.AffineTransform.getScaleInstance = function(sx, sy) {\n  return new goog.graphics.AffineTransform().setToScale(sx, sy);\n};\n\n\n/**\n * Creates a transform representing a translation transformation.\n *\n * @param {number} dx The distance to translate in the x direction.\n * @param {number} dy The distance to translate in the y direction.\n * @return {!goog.graphics.AffineTransform} A transform representing a\n *     translation transformation.\n */\ngoog.graphics.AffineTransform.getTranslateInstance = function(dx, dy) {\n  return new goog.graphics.AffineTransform().setToTranslation(dx, dy);\n};\n\n\n/**\n * Creates a transform representing a shearing transformation.\n *\n * @param {number} shx The x-axis shear factor.\n * @param {number} shy The y-axis shear factor.\n * @return {!goog.graphics.AffineTransform} A transform representing a shearing\n *     transformation.\n */\ngoog.graphics.AffineTransform.getShearInstance = function(shx, shy) {\n  return new goog.graphics.AffineTransform().setToShear(shx, shy);\n};\n\n\n/**\n * Creates a transform representing a rotation transformation.\n *\n * @param {number} theta The angle of rotation measured in radians.\n * @param {number} x The x coordinate of the anchor point.\n * @param {number} y The y coordinate of the anchor point.\n * @return {!goog.graphics.AffineTransform} A transform representing a rotation\n *     transformation.\n */\ngoog.graphics.AffineTransform.getRotateInstance = function(theta, x, y) {\n  return new goog.graphics.AffineTransform().setToRotation(theta, x, y);\n};\n\n\n/**\n * Sets this transform to a scaling transformation.\n *\n * @param {number} sx The x-axis scaling factor.\n * @param {number} sy The y-axis scaling factor.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.setToScale = function(sx, sy) {\n  return this.setTransform(sx, 0, 0, sy, 0, 0);\n};\n\n\n/**\n * Sets this transform to a translation transformation.\n *\n * @param {number} dx The distance to translate in the x direction.\n * @param {number} dy The distance to translate in the y direction.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.setToTranslation = function(dx, dy) {\n  return this.setTransform(1, 0, 0, 1, dx, dy);\n};\n\n\n/**\n * Sets this transform to a shearing transformation.\n *\n * @param {number} shx The x-axis shear factor.\n * @param {number} shy The y-axis shear factor.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.setToShear = function(shx, shy) {\n  return this.setTransform(1, shy, shx, 1, 0, 0);\n};\n\n\n/**\n * Sets this transform to a rotation transformation.\n *\n * @param {number} theta The angle of rotation measured in radians.\n * @param {number} x The x coordinate of the anchor point.\n * @param {number} y The y coordinate of the anchor point.\n * @return {!goog.graphics.AffineTransform} This affine transform.\n */\ngoog.graphics.AffineTransform.prototype.setToRotation = function(theta, x, y) {\n  const cos = Math.cos(theta);\n  const sin = Math.sin(theta);\n  return this.setTransform(\n      cos, sin, -sin, cos, x - x * cos + y * sin, y - x * sin - y * cos);\n};\n\n\n/**\n * Compares two affine transforms for equality.\n *\n * @param {goog.graphics.AffineTransform} tx The other affine transform.\n * @return {boolean} whether the two transforms are equal.\n */\ngoog.graphics.AffineTransform.prototype.equals = function(tx) {\n  if (this == tx) {\n    return true;\n  }\n  if (!tx) {\n    return false;\n  }\n  return this.m00_ == tx.m00_ && this.m01_ == tx.m01_ && this.m02_ == tx.m02_ &&\n      this.m10_ == tx.m10_ && this.m11_ == tx.m11_ && this.m12_ == tx.m12_;\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/affinetransform.js"],"^O",["^=",["~$goog.graphics.AffineTransform"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.crypt.hash32.js","^5",["^6","goog/crypt/hash32.js"],"^7","goog/crypt/hash32.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implementation of 32-bit hashing functions.\n *\n * This is a direct port from the Google Java Hash class\n *\n */\n\ngoog.provide('goog.crypt.hash32');\n\ngoog.require('goog.crypt');\n\n\n/**\n * Default seed used during hashing, digits of pie.\n * See SEED32 in http://go/base.hash.java\n * @type {number}\n */\ngoog.crypt.hash32.SEED32 = 314159265;\n\n\n/**\n * Arbitrary constant used during hashing.\n * See CONSTANT32 in http://go/base.hash.java\n * @type {number}\n */\ngoog.crypt.hash32.CONSTANT32 = -1640531527;\n\n\n/**\n * Hashes a string to a 32-bit value.\n * @param {string} str String to hash.\n * @return {number} 32-bit hash.\n */\ngoog.crypt.hash32.encodeString = function(str) {\n  return goog.crypt.hash32.encodeByteArray(goog.crypt.stringToByteArray(str));\n};\n\n\n/**\n * Hashes a string to a 32-bit value, converting the string to UTF-8 before\n * doing the encoding.\n * @param {string} str String to hash.\n * @return {number} 32-bit hash.\n */\ngoog.crypt.hash32.encodeStringUtf8 = function(str) {\n  return goog.crypt.hash32.encodeByteArray(\n      goog.crypt.stringToUtf8ByteArray(str));\n};\n\n\n/**\n * Hashes an integer to a 32-bit value.\n * @param {number} value Number to hash.\n * @return {number} 32-bit hash.\n */\ngoog.crypt.hash32.encodeInteger = function(value) {\n  // TODO(user): Does this make sense in JavaScript with doubles?  Should we\n  // force the value to be in the correct range?\n  return goog.crypt.hash32.mix32_(\n      {a: value, b: goog.crypt.hash32.CONSTANT32, c: goog.crypt.hash32.SEED32});\n};\n\n\n/**\n * Hashes a \"byte\" array to a 32-bit value using the supplied seed.\n * @param {Array<number>} bytes Array of bytes.\n * @param {number=} opt_offset The starting position to use for hash\n * computation.\n * @param {number=} opt_length Number of bytes that are used for hashing.\n * @param {number=} opt_seed The seed.\n * @return {number} 32-bit hash.\n */\ngoog.crypt.hash32.encodeByteArray = function(\n    bytes, opt_offset, opt_length, opt_seed) {\n  var offset = opt_offset || 0;\n  var length = opt_length || bytes.length;\n  var seed = opt_seed || goog.crypt.hash32.SEED32;\n\n  var mix = {\n    a: goog.crypt.hash32.CONSTANT32,\n    b: goog.crypt.hash32.CONSTANT32,\n    c: seed\n  };\n\n  var keylen;\n  for (keylen = length; keylen >= 12; keylen -= 12, offset += 12) {\n    mix.a += goog.crypt.hash32.wordAt_(bytes, offset);\n    mix.b += goog.crypt.hash32.wordAt_(bytes, offset + 4);\n    mix.c += goog.crypt.hash32.wordAt_(bytes, offset + 8);\n    goog.crypt.hash32.mix32_(mix);\n  }\n  // Hash any remaining bytes\n  mix.c += length;\n  switch (keylen) {  // deal with rest.  Some cases fall through\n    case 11:\n      mix.c += (bytes[offset + 10]) << 24;\n    case 10:\n      mix.c += (bytes[offset + 9] & 0xff) << 16;\n    case 9:\n      mix.c += (bytes[offset + 8] & 0xff) << 8;\n    // the first byte of c is reserved for the length\n    case 8:\n      mix.b += goog.crypt.hash32.wordAt_(bytes, offset + 4);\n      mix.a += goog.crypt.hash32.wordAt_(bytes, offset);\n      break;\n    case 7:\n      mix.b += (bytes[offset + 6] & 0xff) << 16;\n    case 6:\n      mix.b += (bytes[offset + 5] & 0xff) << 8;\n    case 5:\n      mix.b += (bytes[offset + 4] & 0xff);\n    case 4:\n      mix.a += goog.crypt.hash32.wordAt_(bytes, offset);\n      break;\n    case 3:\n      mix.a += (bytes[offset + 2] & 0xff) << 16;\n    case 2:\n      mix.a += (bytes[offset + 1] & 0xff) << 8;\n    case 1:\n      mix.a += (bytes[offset + 0] & 0xff);\n      // case 0 : nothing left to add\n  }\n  return goog.crypt.hash32.mix32_(mix);\n};\n\n\n/**\n * Performs an inplace mix of an object with the integer properties (a, b, c)\n * and returns the final value of c.\n * @param {{a:number, b:number, c:number}} mix Object with properties, a, b, and c.\n * @return {number} The end c-value for the mixing.\n * @private\n */\ngoog.crypt.hash32.mix32_ = function(mix) {\n  var a = mix.a, b = mix.b, c = mix.c;\n  a -= b;\n  a -= c;\n  a ^= c >>> 13;\n  b -= c;\n  b -= a;\n  b ^= a << 8;\n  c -= a;\n  c -= b;\n  c ^= b >>> 13;\n  a -= b;\n  a -= c;\n  a ^= c >>> 12;\n  b -= c;\n  b -= a;\n  b ^= a << 16;\n  c -= a;\n  c -= b;\n  c ^= b >>> 5;\n  a -= b;\n  a -= c;\n  a ^= c >>> 3;\n  b -= c;\n  b -= a;\n  b ^= a << 10;\n  c -= a;\n  c -= b;\n  c ^= b >>> 15;\n  mix.a = a;\n  mix.b = b;\n  mix.c = c;\n  return c;\n};\n\n\n/**\n * Returns the word at a given offset.  Treating an array of bytes a word at a\n * time is far more efficient than byte-by-byte.\n * @param {Array<number>} bytes Array of bytes.\n * @param {number} offset Offset in the byte array.\n * @return {number} Integer value for the word.\n * @private\n */\ngoog.crypt.hash32.wordAt_ = function(bytes, offset) {\n  var a = goog.crypt.hash32.toSigned_(bytes[offset + 0]);\n  var b = goog.crypt.hash32.toSigned_(bytes[offset + 1]);\n  var c = goog.crypt.hash32.toSigned_(bytes[offset + 2]);\n  var d = goog.crypt.hash32.toSigned_(bytes[offset + 3]);\n  return a + (b << 8) + (c << 16) + (d << 24);\n};\n\n\n/**\n * Converts an unsigned \"byte\" to signed, that is, convert a value in the range\n * (0, 2^8-1) to (-2^7, 2^7-1) in order to be compatible with Java's byte type.\n * @param {number} n Unsigned \"byte\" value.\n * @return {number} Signed \"byte\" value.\n * @private\n */\ngoog.crypt.hash32.toSigned_ = function(n) {\n  return n > 127 ? n - 256 : n;\n};\n","^;",1579837703000,"^<",["^=",["~$goog.crypt","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/hash32.js"],"^O",["^=",["~$goog.crypt.hash32"]],"^W",true,"^X",["^?","^9K"]],["^ ","^3",[1579837703000],"^4","goog.editor.plugins.linkshortcutplugin.js","^5",["^6","goog/editor/plugins/linkshortcutplugin.js"],"^7","goog/editor/plugins/linkshortcutplugin.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Adds a keyboard shortcut for the link command.\n *\n */\n\ngoog.provide('goog.editor.plugins.LinkShortcutPlugin');\n\ngoog.forwardDeclare('goog.editor.Link');\ngoog.require('goog.editor.Command');\ngoog.require('goog.editor.Plugin');\n\n\n\n/**\n * Plugin to add a keyboard shortcut for the link command\n * @constructor\n * @extends {goog.editor.Plugin}\n * @final\n */\ngoog.editor.plugins.LinkShortcutPlugin = function() {\n  goog.editor.plugins.LinkShortcutPlugin.base(this, 'constructor');\n};\ngoog.inherits(goog.editor.plugins.LinkShortcutPlugin, goog.editor.Plugin);\n\n\n/** @override */\ngoog.editor.plugins.LinkShortcutPlugin.prototype.getTrogClassId = function() {\n  return 'LinkShortcutPlugin';\n};\n\n\n/**\n * @override\n */\ngoog.editor.plugins.LinkShortcutPlugin.prototype.handleKeyboardShortcut =\n    function(e, key, isModifierPressed) {\n  if (isModifierPressed && key == 'k' && !e.shiftKey) {\n    var link = /** @type {goog.editor.Link?} */ (\n        this.getFieldObject().execCommand(goog.editor.Command.LINK));\n    if (link) {\n      link.finishLinkCreation(this.getFieldObject());\n    }\n    return true;\n  }\n\n  return false;\n};\n","^;",1579837703000,"^<",["^=",["^33","^?","^11"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/linkshortcutplugin.js"],"^O",["^=",["~$goog.editor.plugins.LinkShortcutPlugin"]],"^W",true,"^X",["^?","^33","^11"]],["^ ","^3",[1579837703000],"^4","goog.ui.colorpalette.js","^5",["^6","goog/ui/colorpalette.js"],"^7","goog/ui/colorpalette.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A control for representing a palette of colors, that the user\n * can highlight or select via the keyboard or the mouse.\n *\n */\n\ngoog.provide('goog.ui.ColorPalette');\n\ngoog.require('goog.array');\ngoog.require('goog.color');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.style');\ngoog.require('goog.ui.Palette');\ngoog.require('goog.ui.PaletteRenderer');\n\n\n\n/**\n * A color palette is a grid of color swatches that the user can highlight or\n * select via the keyboard or the mouse.  The selection state of the palette is\n * controlled by a selection model.  When the user makes a selection, the\n * component fires an ACTION event.  Event listeners may retrieve the selected\n * color using the {@link #getSelectedColor} method.\n *\n * @param {Array<string>=} opt_colors Array of colors in any valid CSS color\n *     format.\n * @param {goog.ui.PaletteRenderer=} opt_renderer Renderer used to render or\n *     decorate the palette; defaults to {@link goog.ui.PaletteRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.Palette}\n */\ngoog.ui.ColorPalette = function(opt_colors, opt_renderer, opt_domHelper) {\n  /**\n   * Array of colors to show in the palette.\n   * @type {Array<string>}\n   * @private\n   */\n  this.colors_ = opt_colors || [];\n\n  goog.ui.Palette.call(\n      this, null, opt_renderer || goog.ui.PaletteRenderer.getInstance(),\n      opt_domHelper);\n\n  // Set the colors separately from the super call since we need the correct\n  // DomHelper to be initialized for this class.\n  this.setColors(this.colors_);\n};\ngoog.inherits(goog.ui.ColorPalette, goog.ui.Palette);\ngoog.tagUnsealableClass(goog.ui.ColorPalette);\n\n\n/**\n * Array of normalized colors. Initialized lazily as often never needed.\n * @type {?Array<string>}\n * @private\n */\ngoog.ui.ColorPalette.prototype.normalizedColors_ = null;\n\n\n/**\n * Array of labels for the colors. Will be used for the tooltips and\n * accessibility.\n * @type {?Array<string>}\n * @private\n */\ngoog.ui.ColorPalette.prototype.labels_ = null;\n\n\n/**\n * Returns the array of colors represented in the color palette.\n * @return {Array<string>} Array of colors.\n */\ngoog.ui.ColorPalette.prototype.getColors = function() {\n  return this.colors_;\n};\n\n\n/**\n * Sets the colors that are contained in the palette.\n * @param {Array<string>} colors Array of colors in any valid CSS color format.\n * @param {Array<string>=} opt_labels The array of labels to be used as\n *        tooltips. When not provided, the color value will be used.\n */\ngoog.ui.ColorPalette.prototype.setColors = function(colors, opt_labels) {\n  this.colors_ = colors;\n  this.labels_ = opt_labels || null;\n  this.normalizedColors_ = null;\n  this.setContent(this.createColorNodes());\n};\n\n\n/**\n * @return {?string} The current selected color in hex, or null.\n */\ngoog.ui.ColorPalette.prototype.getSelectedColor = function() {\n  var selectedItem = /** @type {Element} */ (this.getSelectedItem());\n  if (selectedItem) {\n    var color = goog.style.getStyle(selectedItem, 'background-color');\n    return goog.ui.ColorPalette.parseColor_(color);\n  } else {\n    return null;\n  }\n};\n\n\n/**\n * Sets the selected color.  Clears the selection if the argument is null or\n * can't be parsed as a color.\n * @param {?string} color The color to set as selected; null clears the\n *     selection.\n */\ngoog.ui.ColorPalette.prototype.setSelectedColor = function(color) {\n  var hexColor = goog.ui.ColorPalette.parseColor_(color);\n  if (!this.normalizedColors_) {\n    this.normalizedColors_ = goog.array.map(this.colors_, function(color) {\n      return goog.ui.ColorPalette.parseColor_(color);\n    });\n  }\n  this.setSelectedIndex(\n      hexColor ? goog.array.indexOf(this.normalizedColors_, hexColor) : -1);\n};\n\n\n/**\n * @return {!Array<!Node>} An array of DOM nodes for each color.\n * @protected\n */\ngoog.ui.ColorPalette.prototype.createColorNodes = function() {\n  return goog.array.map(this.colors_, function(color, index) {\n    var swatch = this.getDomHelper().createDom(goog.dom.TagName.DIV, {\n      'class': goog.getCssName(this.getRenderer().getCssClass(), 'colorswatch'),\n      'style': 'background-color:' + color\n    });\n    if (this.labels_ && this.labels_[index]) {\n      swatch.title = this.labels_[index];\n    } else {\n      swatch.title = color.charAt(0) == '#' ?\n          'RGB (' + goog.color.hexToRgb(color).join(', ') + ')' :\n          color;\n    }\n    return swatch;\n  }, this);\n};\n\n\n/**\n * Takes a string, attempts to parse it as a color spec, and returns a\n * normalized hex color spec if successful (null otherwise).\n * @param {?string} color String possibly containing a color spec; may be null.\n * @return {?string} Normalized hex color spec, or null if the argument can't\n *     be parsed as a color.\n * @private\n */\ngoog.ui.ColorPalette.parseColor_ = function(color) {\n  if (color) {\n\n    try {\n      return goog.color.parse(color).hex;\n    } catch (ex) {\n      // Fall through.\n    }\n  }\n  return null;\n};\n","^;",1579837703000,"^<",["^=",["~$goog.color","^?","~$goog.ui.PaletteRenderer","~$goog.ui.Palette","^1F","^2O","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/colorpalette.js"],"^O",["^=",["~$goog.ui.ColorPalette"]],"^W",true,"^X",["^?","^2O","^9N","^12","^1F","^9P","^9O"]],["^ ","^3",[1579837703000],"^4","goog.ui.media.vimeo.js","^5",["^6","goog/ui/media/vimeo.js"],"^7","goog/ui/media/vimeo.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview provides a reusable Vimeo video UI component given a public\n * Vimeo video URL.\n *\n * goog.ui.media.Vimeo is actually a {@link goog.ui.ControlRenderer}, a\n * stateless class - that could/should be used as a Singleton with the static\n * method `goog.ui.media.Vimeo.getInstance` -, that knows how to render\n * video videos. It is designed to be used with a {@link goog.ui.Control},\n * which will actually control the media renderer and provide the\n * {@link goog.ui.Component} base. This design guarantees that all different\n * types of medias will behave alike but will look different.\n *\n * goog.ui.media.Vimeo expects vimeo video IDs on\n * `goog.ui.Control.getModel` as data models, and renders a flash object\n * that will show the contents of that video.\n *\n * Example of usage:\n *\n * <pre>\n * var video = goog.ui.media.VimeoModel.newInstance('https://vimeo.com/30012');\n * goog.ui.media.Vimeo.newControl(video).render();\n * </pre>\n *\n * Vimeo medias currently support the following states:\n *\n * <ul>\n *   <li> {@link goog.ui.Component.State.DISABLED}: shows 'flash not available'\n *   <li> {@link goog.ui.Component.State.HOVER}: mouse cursor is over the video\n *   <li> {@link goog.ui.Component.State.SELECTED}: flash video is shown\n * </ul>\n *\n * Which can be accessed by\n * <pre>\n *   video.setEnabled(true);\n *   video.setHighlighted(true);\n *   video.setSelected(true);\n * </pre>\n *\n * Requires flash to actually work.\n */\n\ngoog.provide('goog.ui.media.Vimeo');\ngoog.provide('goog.ui.media.VimeoModel');\n\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.string');\ngoog.require('goog.string.Const');\ngoog.require('goog.ui.media.FlashObject');\ngoog.require('goog.ui.media.Media');\ngoog.require('goog.ui.media.MediaModel');\ngoog.require('goog.ui.media.MediaRenderer');\n\n\n\n/**\n * Subclasses a goog.ui.media.MediaRenderer to provide a Vimeo specific media\n * renderer.\n *\n * This class knows how to parse Vimeo URLs, and render the DOM structure\n * of vimeo video players. This class is meant to be used as a singleton static\n * stateless class, that takes `goog.ui.media.Media` instances and renders\n * it. It expects `goog.ui.media.Media.getModel` to return a well formed,\n * previously constructed, vimeoId {@see goog.ui.media.Vimeo.parseUrl}, which is\n * the data model this renderer will use to construct the DOM structure.\n * {@see goog.ui.media.Vimeo.newControl} for a example of constructing a control\n * with this renderer.\n *\n * This design is patterned after http://go/closure_control_subclassing\n *\n * It uses {@link goog.ui.media.FlashObject} to embed the flash object.\n *\n * @constructor\n * @extends {goog.ui.media.MediaRenderer}\n * @final\n */\ngoog.ui.media.Vimeo = function() {\n  goog.ui.media.MediaRenderer.call(this);\n};\ngoog.inherits(goog.ui.media.Vimeo, goog.ui.media.MediaRenderer);\ngoog.addSingletonGetter(goog.ui.media.Vimeo);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n *\n * @type {string}\n */\ngoog.ui.media.Vimeo.CSS_CLASS = goog.getCssName('goog-ui-media-vimeo');\n\n\n/**\n * A static convenient method to construct a goog.ui.media.Media control out of\n * a Vimeo URL. It extracts the videoId information on the URL, sets it\n * as the data model goog.ui.media.Vimeo renderer uses, sets the states\n * supported by the renderer, and returns a Control that binds everything\n * together. This is what you should be using for constructing Vimeo videos,\n * except if you need more fine control over the configuration.\n *\n * @param {goog.ui.media.VimeoModel} dataModel A vimeo video URL.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @return {!goog.ui.media.Media} A Control binded to the Vimeo renderer.\n */\ngoog.ui.media.Vimeo.newControl = function(dataModel, opt_domHelper) {\n  var control = new goog.ui.media.Media(\n      dataModel, goog.ui.media.Vimeo.getInstance(), opt_domHelper);\n  // vimeo videos don't have any thumbnail for now, so we show the\n  // \"selected\" version of the UI at the start, which is the\n  // flash player.\n  control.setSelected(true);\n  return control;\n};\n\n\n/**\n * Creates the initial DOM structure of the vimeo video, which is basically a\n * the flash object pointing to a vimeo video player.\n *\n * @param {goog.ui.Control} c The media control.\n * @return {!Element} The DOM structure that represents this control.\n * @override\n */\ngoog.ui.media.Vimeo.prototype.createDom = function(c) {\n  var control = /** @type {goog.ui.media.Media} */ (c);\n  var div = goog.ui.media.Vimeo.superClass_.createDom.call(this, control);\n\n  var dataModel =\n      /** @type {goog.ui.media.VimeoModel} */ (control.getDataModel());\n\n  var flash = new goog.ui.media.FlashObject(\n      dataModel.getPlayer().getTrustedResourceUrl(), control.getDomHelper());\n  flash.render(div);\n\n  return div;\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.media.Vimeo.prototype.getCssClass = function() {\n  return goog.ui.media.Vimeo.CSS_CLASS;\n};\n\n\n\n/**\n * The `goog.ui.media.Vimeo` media data model. It stores a required\n * `videoId` field, sets the vimeo URL, and allows a few optional\n * parameters.\n *\n * @param {string} videoId The vimeo video id.\n * @param {string=} opt_caption An optional caption of the vimeo video.\n * @param {string=} opt_description An optional description of the vimeo video.\n * @param {boolean=} opt_autoplay Whether to autoplay video.\n * @constructor\n * @extends {goog.ui.media.MediaModel}\n * @final\n */\ngoog.ui.media.VimeoModel = function(\n    videoId, opt_caption, opt_description, opt_autoplay) {\n  goog.ui.media.MediaModel.call(\n      this, goog.ui.media.VimeoModel.buildUrl(videoId), opt_caption,\n      opt_description, goog.ui.media.MediaModel.MimeType.FLASH);\n\n  /**\n   * The Vimeo video id.\n   * @type {string}\n   * @private\n   */\n  this.videoId_ = videoId;\n\n  this.setPlayer(\n      new goog.ui.media.MediaModel.Player(\n          goog.ui.media.VimeoModel.buildFlashUrl(videoId, opt_autoplay)));\n};\ngoog.inherits(goog.ui.media.VimeoModel, goog.ui.media.MediaModel);\n\n\n/**\n * Regular expression used to extract the vimeo video id out of vimeo URLs.\n *\n * Copied from http://go/markdownlite.js\n *\n * TODO(user): add support to https.\n *\n * @type {RegExp}\n * @private\n * @const\n */\ngoog.ui.media.VimeoModel.MATCHER_ =\n    /https?:\\/\\/(?:www\\.)?vimeo\\.com\\/(?:hd#)?([0-9]+)/i;\n\n\n/**\n * Takes a `vimeoUrl` and extracts the video id.\n *\n * @param {string} vimeoUrl A vimeo video URL.\n * @param {string=} opt_caption An optional caption of the vimeo video.\n * @param {string=} opt_description An optional description of the vimeo video.\n * @param {boolean=} opt_autoplay Whether to autoplay video.\n * @return {!goog.ui.media.VimeoModel} The vimeo data model that represents this\n *     URL.\n * @throws exception in case the parsing fails\n */\ngoog.ui.media.VimeoModel.newInstance = function(\n    vimeoUrl, opt_caption, opt_description, opt_autoplay) {\n  if (goog.ui.media.VimeoModel.MATCHER_.test(vimeoUrl)) {\n    var data = goog.ui.media.VimeoModel.MATCHER_.exec(vimeoUrl);\n    return new goog.ui.media.VimeoModel(\n        data[1], opt_caption, opt_description, opt_autoplay);\n  }\n  throw new Error('failed to parse vimeo url: ' + vimeoUrl);\n};\n\n\n/**\n * The opposite of `goog.ui.media.Vimeo.parseUrl`: it takes a videoId\n * and returns a vimeo URL.\n *\n * @param {string} videoId The vimeo video ID.\n * @return {string} The vimeo URL.\n */\ngoog.ui.media.VimeoModel.buildUrl = function(videoId) {\n  return 'https://vimeo.com/' + goog.string.urlEncode(videoId);\n};\n\n\n/**\n * Builds a flash url from the vimeo `videoId`.\n *\n * @param {string} videoId The vimeo video ID.\n * @param {boolean=} opt_autoplay Whether the flash movie should start playing\n *     as soon as it is shown, or if it should show a 'play' button.\n * @return {!goog.html.TrustedResourceUrl} The vimeo flash URL.\n */\ngoog.ui.media.VimeoModel.buildFlashUrl = function(videoId, opt_autoplay) {\n  return goog.html.TrustedResourceUrl.format(\n      goog.string.Const.from(\n          'https://vimeo.com/moogaloop.swf?clip_id=%{clip_id}' +\n          '&server=vimeo.com&show_title=1&show_byline=1&' +\n          'show_portrait=0color=&fullscreen=1%{autoplay}'),\n      {\n        'clip_id': videoId,\n        'autoplay': opt_autoplay ? goog.string.Const.from('&autoplay=1') : ''\n      });\n};\n\n\n/**\n * Gets the Vimeo video id.\n * @return {string} The Vimeo video id.\n */\ngoog.ui.media.VimeoModel.prototype.getVideoId = function() {\n  return this.videoId_;\n};\n","^;",1579837703000,"^<",["^=",["^4C","^2L","~$goog.ui.media.MediaModel","~$goog.ui.media.Media","~$goog.ui.media.MediaRenderer","^?","^3Q","~$goog.ui.media.FlashObject"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/media/vimeo.js"],"^O",["^=",["~$goog.ui.media.VimeoModel","~$goog.ui.media.Vimeo"]],"^W",true,"^X",["^?","^4C","^2L","^3Q","^9U","^9S","^9R","^9T"]],["^ ","^3",[1579837703000],"^4","goog.ui.menuseparatorrenderer.js","^5",["^6","goog/ui/menuseparatorrenderer.js"],"^7","goog/ui/menuseparatorrenderer.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for {@link goog.ui.MenuSeparator}s.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.MenuSeparatorRenderer');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.ui.ControlRenderer');\n\n\n\n/**\n * Renderer for menu separators.\n * @constructor\n * @extends {goog.ui.ControlRenderer}\n */\ngoog.ui.MenuSeparatorRenderer = function() {\n  goog.ui.ControlRenderer.call(this);\n};\ngoog.inherits(goog.ui.MenuSeparatorRenderer, goog.ui.ControlRenderer);\ngoog.addSingletonGetter(goog.ui.MenuSeparatorRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.MenuSeparatorRenderer.CSS_CLASS = goog.getCssName('goog-menuseparator');\n\n\n/**\n * Returns an empty, styled menu separator DIV.  Overrides {@link\n * goog.ui.ControlRenderer#createDom}.\n * @param {goog.ui.Control} separator goog.ui.Separator to render.\n * @return {!Element} Root element for the separator.\n * @override\n */\ngoog.ui.MenuSeparatorRenderer.prototype.createDom = function(separator) {\n  return separator.getDomHelper().createDom(\n      goog.dom.TagName.DIV, this.getCssClass());\n};\n\n\n/**\n * Takes an existing element, and decorates it with the separator.  Overrides\n * {@link goog.ui.ControlRenderer#decorate}.\n * @param {goog.ui.Control} separator goog.ui.MenuSeparator to decorate the\n *     element.\n * @param {Element} element Element to decorate.\n * @return {!Element} Decorated element.\n * @override\n */\ngoog.ui.MenuSeparatorRenderer.prototype.decorate = function(\n    separator, element) {\n  // Normally handled in the superclass. But we don't call the superclass.\n  if (element.id) {\n    separator.setId(element.id);\n  }\n\n  if (element.tagName == goog.dom.TagName.HR) {\n    // Replace HR with separator.\n    var hr = element;\n    element = this.createDom(separator);\n    goog.dom.insertSiblingBefore(element, hr);\n    goog.dom.removeNode(hr);\n  } else {\n    goog.dom.classlist.add(element, this.getCssClass());\n  }\n  return element;\n};\n\n\n/**\n * Overrides {@link goog.ui.ControlRenderer#setContent} to do nothing, since\n * separators are empty.\n * @param {Element} separator The separator's root element.\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to be\n *    set as the separators's content (ignored).\n * @override\n */\ngoog.ui.MenuSeparatorRenderer.prototype.setContent = function(\n    separator, content) {\n  // Do nothing.  Separators are empty.\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.MenuSeparatorRenderer.prototype.getCssClass = function() {\n  return goog.ui.MenuSeparatorRenderer.CSS_CLASS;\n};\n","^;",1579837703000,"^<",["^=",["^1>","^1M","^?","^5B","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/menuseparatorrenderer.js"],"^O",["^=",["^5L"]],"^W",true,"^X",["^?","^1>","^12","^1M","^5B"]],["^ ","^3",[1579837703000],"^4","goog.math.interpolator.linear1.js","^5",["^6","goog/math/interpolator/linear1.js"],"^7","goog/math/interpolator/linear1.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A one dimensional linear interpolator.\n *\n */\n\ngoog.provide('goog.math.interpolator.Linear1');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.math');\ngoog.require('goog.math.interpolator.Interpolator1');\n\n\n\n/**\n * A one dimensional linear interpolator.\n * @implements {goog.math.interpolator.Interpolator1}\n * @constructor\n * @final\n */\ngoog.math.interpolator.Linear1 = function() {\n  /**\n   * The abscissa of the data points.\n   * @type {!Array<number>}\n   * @private\n   */\n  this.x_ = [];\n\n  /**\n   * The ordinate of the data points.\n   * @type {!Array<number>}\n   * @private\n   */\n  this.y_ = [];\n};\n\n\n/** @override */\ngoog.math.interpolator.Linear1.prototype.setData = function(x, y) {\n  goog.asserts.assert(\n      x.length == y.length,\n      'input arrays to setData should have the same length');\n  if (x.length == 1) {\n    this.x_ = [x[0], x[0] + 1];\n    this.y_ = [y[0], y[0]];\n  } else {\n    this.x_ = x.slice();\n    this.y_ = y.slice();\n  }\n};\n\n\n/** @override */\ngoog.math.interpolator.Linear1.prototype.interpolate = function(x) {\n  var pos = goog.array.binarySearch(this.x_, x);\n  if (pos < 0) {\n    pos = -pos - 2;\n  }\n  pos = goog.math.clamp(pos, 0, this.x_.length - 2);\n\n  var progress = (x - this.x_[pos]) / (this.x_[pos + 1] - this.x_[pos]);\n  return goog.math.lerp(this.y_[pos], this.y_[pos + 1], progress);\n};\n\n\n/** @override */\ngoog.math.interpolator.Linear1.prototype.getInverse = function() {\n  var interpolator = new goog.math.interpolator.Linear1();\n  interpolator.setData(this.y_, this.x_);\n  return interpolator;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^7?","^?","^4Q","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/interpolator/linear1.js"],"^O",["^=",["~$goog.math.interpolator.Linear1"]],"^W",true,"^X",["^?","^2O","^1L","^4Q","^7?"]],["^ ","^3",[1579837703000],"^4","goog.array.array.js","^5",["^6","goog/array/array.js"],"^7","goog/array/array.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for manipulating arrays.\n *\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.array');\n\ngoog.require('goog.asserts');\n\n\n/**\n * @define {boolean} NATIVE_ARRAY_PROTOTYPES indicates whether the code should\n * rely on Array.prototype functions, if available.\n *\n * The Array.prototype functions can be defined by external libraries like\n * Prototype and setting this flag to false forces closure to use its own\n * goog.array implementation.\n *\n * If your javascript can be loaded by a third party site and you are wary about\n * relying on the prototype functions, specify\n * \"--define goog.NATIVE_ARRAY_PROTOTYPES=false\" to the JSCompiler.\n *\n * Setting goog.TRUSTED_SITE to false will automatically set\n * NATIVE_ARRAY_PROTOTYPES to false.\n */\ngoog.NATIVE_ARRAY_PROTOTYPES =\n    goog.define('goog.NATIVE_ARRAY_PROTOTYPES', goog.TRUSTED_SITE);\n\n\n/**\n * @define {boolean} If true, JSCompiler will use the native implementation of\n * array functions where appropriate (e.g., `Array#filter`) and remove the\n * unused pure JS implementation.\n */\ngoog.array.ASSUME_NATIVE_FUNCTIONS = goog.define(\n    'goog.array.ASSUME_NATIVE_FUNCTIONS', goog.FEATURESET_YEAR > 2012);\n\n\n/**\n * Returns the last element in an array without removing it.\n * Same as goog.array.last.\n * @param {IArrayLike<T>|string} array The array.\n * @return {T} Last item in array.\n * @template T\n */\ngoog.array.peek = function(array) {\n  return array[array.length - 1];\n};\n\n\n/**\n * Returns the last element in an array without removing it.\n * Same as goog.array.peek.\n * @param {IArrayLike<T>|string} array The array.\n * @return {T} Last item in array.\n * @template T\n */\ngoog.array.last = goog.array.peek;\n\n// NOTE(arv): Since most of the array functions are generic it allows you to\n// pass an array-like object. Strings have a length and are considered array-\n// like. However, the 'in' operator does not work on strings so we cannot just\n// use the array path even if the browser supports indexing into strings. We\n// therefore end up splitting the string.\n\n\n/**\n * Returns the index of the first element of an array with a specified value, or\n * -1 if the element is not present in the array.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-indexof}\n *\n * @param {IArrayLike<T>|string} arr The array to be searched.\n * @param {T} obj The object for which we are searching.\n * @param {number=} opt_fromIndex The index at which to start the search. If\n *     omitted the search starts at index 0.\n * @return {number} The index of the first matching array element.\n * @template T\n */\ngoog.array.indexOf = goog.NATIVE_ARRAY_PROTOTYPES &&\n        (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.indexOf) ?\n    function(arr, obj, opt_fromIndex) {\n      goog.asserts.assert(arr.length != null);\n\n      return Array.prototype.indexOf.call(arr, obj, opt_fromIndex);\n    } :\n    function(arr, obj, opt_fromIndex) {\n      var fromIndex = opt_fromIndex == null ?\n          0 :\n          (opt_fromIndex < 0 ? Math.max(0, arr.length + opt_fromIndex) :\n                               opt_fromIndex);\n\n      if (typeof arr === 'string') {\n        // Array.prototype.indexOf uses === so only strings should be found.\n        if (typeof obj !== 'string' || obj.length != 1) {\n          return -1;\n        }\n        return arr.indexOf(obj, fromIndex);\n      }\n\n      for (var i = fromIndex; i < arr.length; i++) {\n        if (i in arr && arr[i] === obj) return i;\n      }\n      return -1;\n    };\n\n\n/**\n * Returns the index of the last element of an array with a specified value, or\n * -1 if the element is not present in the array.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-lastindexof}\n *\n * @param {!IArrayLike<T>|string} arr The array to be searched.\n * @param {T} obj The object for which we are searching.\n * @param {?number=} opt_fromIndex The index at which to start the search. If\n *     omitted the search starts at the end of the array.\n * @return {number} The index of the last matching array element.\n * @template T\n */\ngoog.array.lastIndexOf = goog.NATIVE_ARRAY_PROTOTYPES &&\n        (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.lastIndexOf) ?\n    function(arr, obj, opt_fromIndex) {\n      goog.asserts.assert(arr.length != null);\n\n      // Firefox treats undefined and null as 0 in the fromIndex argument which\n      // leads it to always return -1\n      var fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex;\n      return Array.prototype.lastIndexOf.call(arr, obj, fromIndex);\n    } :\n    function(arr, obj, opt_fromIndex) {\n      var fromIndex = opt_fromIndex == null ? arr.length - 1 : opt_fromIndex;\n\n      if (fromIndex < 0) {\n        fromIndex = Math.max(0, arr.length + fromIndex);\n      }\n\n      if (typeof arr === 'string') {\n        // Array.prototype.lastIndexOf uses === so only strings should be found.\n        if (typeof obj !== 'string' || obj.length != 1) {\n          return -1;\n        }\n        return arr.lastIndexOf(obj, fromIndex);\n      }\n\n      for (var i = fromIndex; i >= 0; i--) {\n        if (i in arr && arr[i] === obj) return i;\n      }\n      return -1;\n    };\n\n\n/**\n * Calls a function for each element in an array. Skips holes in the array.\n * See {@link http://tinyurl.com/developer-mozilla-org-array-foreach}\n *\n * @param {IArrayLike<T>|string} arr Array or array like object over\n *     which to iterate.\n * @param {?function(this: S, T, number, ?): ?} f The function to call for every\n *     element. This function takes 3 arguments (the element, the index and the\n *     array). The return value is ignored.\n * @param {S=} opt_obj The object to be used as the value of 'this' within f.\n * @template T,S\n */\ngoog.array.forEach = goog.NATIVE_ARRAY_PROTOTYPES &&\n        (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.forEach) ?\n    function(arr, f, opt_obj) {\n      goog.asserts.assert(arr.length != null);\n\n      Array.prototype.forEach.call(arr, f, opt_obj);\n    } :\n    function(arr, f, opt_obj) {\n      var l = arr.length;  // must be fixed during loop... see docs\n      var arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n      for (var i = 0; i < l; i++) {\n        if (i in arr2) {\n          f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr);\n        }\n      }\n    };\n\n\n/**\n * Calls a function for each element in an array, starting from the last\n * element rather than the first.\n *\n * @param {IArrayLike<T>|string} arr Array or array\n *     like object over which to iterate.\n * @param {?function(this: S, T, number, ?): ?} f The function to call for every\n *     element. This function\n *     takes 3 arguments (the element, the index and the array). The return\n *     value is ignored.\n * @param {S=} opt_obj The object to be used as the value of 'this'\n *     within f.\n * @template T,S\n */\ngoog.array.forEachRight = function(arr, f, opt_obj) {\n  var l = arr.length;  // must be fixed during loop... see docs\n  var arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n  for (var i = l - 1; i >= 0; --i) {\n    if (i in arr2) {\n      f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr);\n    }\n  }\n};\n\n\n/**\n * Calls a function for each element in an array, and if the function returns\n * true adds the element to a new array.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-filter}\n *\n * @param {IArrayLike<T>|string} arr Array or array\n *     like object over which to iterate.\n * @param {?function(this:S, T, number, ?):boolean} f The function to call for\n *     every element. This function\n *     takes 3 arguments (the element, the index and the array) and must\n *     return a Boolean. If the return value is true the element is added to the\n *     result array. If it is false the element is not included.\n * @param {S=} opt_obj The object to be used as the value of 'this'\n *     within f.\n * @return {!Array<T>} a new array in which only elements that passed the test\n *     are present.\n * @template T,S\n */\ngoog.array.filter = goog.NATIVE_ARRAY_PROTOTYPES &&\n        (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.filter) ?\n    function(arr, f, opt_obj) {\n      goog.asserts.assert(arr.length != null);\n\n      return Array.prototype.filter.call(arr, f, opt_obj);\n    } :\n    function(arr, f, opt_obj) {\n      var l = arr.length;  // must be fixed during loop... see docs\n      var res = [];\n      var resLength = 0;\n      var arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n      for (var i = 0; i < l; i++) {\n        if (i in arr2) {\n          var val = arr2[i];  // in case f mutates arr2\n          if (f.call(/** @type {?} */ (opt_obj), val, i, arr)) {\n            res[resLength++] = val;\n          }\n        }\n      }\n      return res;\n    };\n\n\n/**\n * Calls a function for each element in an array and inserts the result into a\n * new array.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-map}\n *\n * @param {IArrayLike<VALUE>|string} arr Array or array like object\n *     over which to iterate.\n * @param {function(this:THIS, VALUE, number, ?): RESULT} f The function to call\n *     for every element. This function takes 3 arguments (the element,\n *     the index and the array) and should return something. The result will be\n *     inserted into a new array.\n * @param {THIS=} opt_obj The object to be used as the value of 'this' within f.\n * @return {!Array<RESULT>} a new array with the results from f.\n * @template THIS, VALUE, RESULT\n */\ngoog.array.map = goog.NATIVE_ARRAY_PROTOTYPES &&\n        (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.map) ?\n    function(arr, f, opt_obj) {\n      goog.asserts.assert(arr.length != null);\n\n      return Array.prototype.map.call(arr, f, opt_obj);\n    } :\n    function(arr, f, opt_obj) {\n      var l = arr.length;  // must be fixed during loop... see docs\n      var res = new Array(l);\n      var arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n      for (var i = 0; i < l; i++) {\n        if (i in arr2) {\n          res[i] = f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr);\n        }\n      }\n      return res;\n    };\n\n\n/**\n * Passes every element of an array into a function and accumulates the result.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-reduce}\n *\n * For example:\n * var a = [1, 2, 3, 4];\n * goog.array.reduce(a, function(r, v, i, arr) {return r + v;}, 0);\n * returns 10\n *\n * @param {IArrayLike<T>|string} arr Array or array\n *     like object over which to iterate.\n * @param {function(this:S, R, T, number, ?) : R} f The function to call for\n *     every element. This function\n *     takes 4 arguments (the function's previous result or the initial value,\n *     the value of the current array element, the current array index, and the\n *     array itself)\n *     function(previousValue, currentValue, index, array).\n * @param {?} val The initial value to pass into the function on the first call.\n * @param {S=} opt_obj  The object to be used as the value of 'this'\n *     within f.\n * @return {R} Result of evaluating f repeatedly across the values of the array.\n * @template T,S,R\n */\ngoog.array.reduce = goog.NATIVE_ARRAY_PROTOTYPES &&\n        (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.reduce) ?\n    function(arr, f, val, opt_obj) {\n      goog.asserts.assert(arr.length != null);\n      if (opt_obj) {\n        f = goog.bind(f, opt_obj);\n      }\n      return Array.prototype.reduce.call(arr, f, val);\n    } :\n    function(arr, f, val, opt_obj) {\n      var rval = val;\n      goog.array.forEach(arr, function(val, index) {\n        rval = f.call(/** @type {?} */ (opt_obj), rval, val, index, arr);\n      });\n      return rval;\n    };\n\n\n/**\n * Passes every element of an array into a function and accumulates the result,\n * starting from the last element and working towards the first.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-reduceright}\n *\n * For example:\n * var a = ['a', 'b', 'c'];\n * goog.array.reduceRight(a, function(r, v, i, arr) {return r + v;}, '');\n * returns 'cba'\n *\n * @param {IArrayLike<T>|string} arr Array or array\n *     like object over which to iterate.\n * @param {?function(this:S, R, T, number, ?) : R} f The function to call for\n *     every element. This function\n *     takes 4 arguments (the function's previous result or the initial value,\n *     the value of the current array element, the current array index, and the\n *     array itself)\n *     function(previousValue, currentValue, index, array).\n * @param {?} val The initial value to pass into the function on the first call.\n * @param {S=} opt_obj The object to be used as the value of 'this'\n *     within f.\n * @return {R} Object returned as a result of evaluating f repeatedly across the\n *     values of the array.\n * @template T,S,R\n */\ngoog.array.reduceRight = goog.NATIVE_ARRAY_PROTOTYPES &&\n        (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.reduceRight) ?\n    function(arr, f, val, opt_obj) {\n      goog.asserts.assert(arr.length != null);\n      goog.asserts.assert(f != null);\n      if (opt_obj) {\n        f = goog.bind(f, opt_obj);\n      }\n      return Array.prototype.reduceRight.call(arr, f, val);\n    } :\n    function(arr, f, val, opt_obj) {\n      var rval = val;\n      goog.array.forEachRight(arr, function(val, index) {\n        rval = f.call(/** @type {?} */ (opt_obj), rval, val, index, arr);\n      });\n      return rval;\n    };\n\n\n/**\n * Calls f for each element of an array. If any call returns true, some()\n * returns true (without checking the remaining elements). If all calls\n * return false, some() returns false.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-some}\n *\n * @param {IArrayLike<T>|string} arr Array or array\n *     like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call for\n *     for every element. This function takes 3 arguments (the element, the\n *     index and the array) and should return a boolean.\n * @param {S=} opt_obj  The object to be used as the value of 'this'\n *     within f.\n * @return {boolean} true if any element passes the test.\n * @template T,S\n */\ngoog.array.some = goog.NATIVE_ARRAY_PROTOTYPES &&\n        (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.some) ?\n    function(arr, f, opt_obj) {\n      goog.asserts.assert(arr.length != null);\n\n      return Array.prototype.some.call(arr, f, opt_obj);\n    } :\n    function(arr, f, opt_obj) {\n      var l = arr.length;  // must be fixed during loop... see docs\n      var arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n      for (var i = 0; i < l; i++) {\n        if (i in arr2 && f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {\n          return true;\n        }\n      }\n      return false;\n    };\n\n\n/**\n * Call f for each element of an array. If all calls return true, every()\n * returns true. If any call returns false, every() returns false and\n * does not continue to check the remaining elements.\n *\n * See {@link http://tinyurl.com/developer-mozilla-org-array-every}\n *\n * @param {IArrayLike<T>|string} arr Array or array\n *     like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call for\n *     for every element. This function takes 3 arguments (the element, the\n *     index and the array) and should return a boolean.\n * @param {S=} opt_obj The object to be used as the value of 'this'\n *     within f.\n * @return {boolean} false if any element fails the test.\n * @template T,S\n */\ngoog.array.every = goog.NATIVE_ARRAY_PROTOTYPES &&\n        (goog.array.ASSUME_NATIVE_FUNCTIONS || Array.prototype.every) ?\n    function(arr, f, opt_obj) {\n      goog.asserts.assert(arr.length != null);\n\n      return Array.prototype.every.call(arr, f, opt_obj);\n    } :\n    function(arr, f, opt_obj) {\n      var l = arr.length;  // must be fixed during loop... see docs\n      var arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n      for (var i = 0; i < l; i++) {\n        if (i in arr2 && !f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {\n          return false;\n        }\n      }\n      return true;\n    };\n\n\n/**\n * Counts the array elements that fulfill the predicate, i.e. for which the\n * callback function returns true. Skips holes in the array.\n *\n * @param {!IArrayLike<T>|string} arr Array or array like object\n *     over which to iterate.\n * @param {function(this: S, T, number, ?): boolean} f The function to call for\n *     every element. Takes 3 arguments (the element, the index and the array).\n * @param {S=} opt_obj The object to be used as the value of 'this' within f.\n * @return {number} The number of the matching elements.\n * @template T,S\n */\ngoog.array.count = function(arr, f, opt_obj) {\n  var count = 0;\n  goog.array.forEach(arr, function(element, index, arr) {\n    if (f.call(/** @type {?} */ (opt_obj), element, index, arr)) {\n      ++count;\n    }\n  }, opt_obj);\n  return count;\n};\n\n\n/**\n * Search an array for the first element that satisfies a given condition and\n * return that element.\n * @param {IArrayLike<T>|string} arr Array or array\n *     like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call\n *     for every element. This function takes 3 arguments (the element, the\n *     index and the array) and should return a boolean.\n * @param {S=} opt_obj An optional \"this\" context for the function.\n * @return {T|null} The first array element that passes the test, or null if no\n *     element is found.\n * @template T,S\n */\ngoog.array.find = function(arr, f, opt_obj) {\n  var i = goog.array.findIndex(arr, f, opt_obj);\n  return i < 0 ? null : typeof arr === 'string' ? arr.charAt(i) : arr[i];\n};\n\n\n/**\n * Search an array for the first element that satisfies a given condition and\n * return its index.\n * @param {IArrayLike<T>|string} arr Array or array\n *     like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call for\n *     every element. This function\n *     takes 3 arguments (the element, the index and the array) and should\n *     return a boolean.\n * @param {S=} opt_obj An optional \"this\" context for the function.\n * @return {number} The index of the first array element that passes the test,\n *     or -1 if no element is found.\n * @template T,S\n */\ngoog.array.findIndex = function(arr, f, opt_obj) {\n  var l = arr.length;  // must be fixed during loop... see docs\n  var arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n  for (var i = 0; i < l; i++) {\n    if (i in arr2 && f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {\n      return i;\n    }\n  }\n  return -1;\n};\n\n\n/**\n * Search an array (in reverse order) for the last element that satisfies a\n * given condition and return that element.\n * @param {IArrayLike<T>|string} arr Array or array\n *     like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call\n *     for every element. This function\n *     takes 3 arguments (the element, the index and the array) and should\n *     return a boolean.\n * @param {S=} opt_obj An optional \"this\" context for the function.\n * @return {T|null} The last array element that passes the test, or null if no\n *     element is found.\n * @template T,S\n */\ngoog.array.findRight = function(arr, f, opt_obj) {\n  var i = goog.array.findIndexRight(arr, f, opt_obj);\n  return i < 0 ? null : typeof arr === 'string' ? arr.charAt(i) : arr[i];\n};\n\n\n/**\n * Search an array (in reverse order) for the last element that satisfies a\n * given condition and return its index.\n * @param {IArrayLike<T>|string} arr Array or array\n *     like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call\n *     for every element. This function\n *     takes 3 arguments (the element, the index and the array) and should\n *     return a boolean.\n * @param {S=} opt_obj An optional \"this\" context for the function.\n * @return {number} The index of the last array element that passes the test,\n *     or -1 if no element is found.\n * @template T,S\n */\ngoog.array.findIndexRight = function(arr, f, opt_obj) {\n  var l = arr.length;  // must be fixed during loop... see docs\n  var arr2 = (typeof arr === 'string') ? arr.split('') : arr;\n  for (var i = l - 1; i >= 0; i--) {\n    if (i in arr2 && f.call(/** @type {?} */ (opt_obj), arr2[i], i, arr)) {\n      return i;\n    }\n  }\n  return -1;\n};\n\n\n/**\n * Whether the array contains the given object.\n * @param {IArrayLike<?>|string} arr The array to test for the presence of the\n *     element.\n * @param {*} obj The object for which to test.\n * @return {boolean} true if obj is present.\n */\ngoog.array.contains = function(arr, obj) {\n  return goog.array.indexOf(arr, obj) >= 0;\n};\n\n\n/**\n * Whether the array is empty.\n * @param {IArrayLike<?>|string} arr The array to test.\n * @return {boolean} true if empty.\n */\ngoog.array.isEmpty = function(arr) {\n  return arr.length == 0;\n};\n\n\n/**\n * Clears the array.\n * @param {IArrayLike<?>} arr Array or array like object to clear.\n */\ngoog.array.clear = function(arr) {\n  // For non real arrays we don't have the magic length so we delete the\n  // indices.\n  if (!goog.isArray(arr)) {\n    for (var i = arr.length - 1; i >= 0; i--) {\n      delete arr[i];\n    }\n  }\n  arr.length = 0;\n};\n\n\n/**\n * Pushes an item into an array, if it's not already in the array.\n * @param {Array<T>} arr Array into which to insert the item.\n * @param {T} obj Value to add.\n * @template T\n */\ngoog.array.insert = function(arr, obj) {\n  if (!goog.array.contains(arr, obj)) {\n    arr.push(obj);\n  }\n};\n\n\n/**\n * Inserts an object at the given index of the array.\n * @param {IArrayLike<?>} arr The array to modify.\n * @param {*} obj The object to insert.\n * @param {number=} opt_i The index at which to insert the object. If omitted,\n *      treated as 0. A negative index is counted from the end of the array.\n */\ngoog.array.insertAt = function(arr, obj, opt_i) {\n  goog.array.splice(arr, opt_i, 0, obj);\n};\n\n\n/**\n * Inserts at the given index of the array, all elements of another array.\n * @param {IArrayLike<?>} arr The array to modify.\n * @param {IArrayLike<?>} elementsToAdd The array of elements to add.\n * @param {number=} opt_i The index at which to insert the object. If omitted,\n *      treated as 0. A negative index is counted from the end of the array.\n */\ngoog.array.insertArrayAt = function(arr, elementsToAdd, opt_i) {\n  goog.partial(goog.array.splice, arr, opt_i, 0).apply(null, elementsToAdd);\n};\n\n\n/**\n * Inserts an object into an array before a specified object.\n * @param {Array<T>} arr The array to modify.\n * @param {T} obj The object to insert.\n * @param {T=} opt_obj2 The object before which obj should be inserted. If obj2\n *     is omitted or not found, obj is inserted at the end of the array.\n * @template T\n */\ngoog.array.insertBefore = function(arr, obj, opt_obj2) {\n  var i;\n  if (arguments.length == 2 || (i = goog.array.indexOf(arr, opt_obj2)) < 0) {\n    arr.push(obj);\n  } else {\n    goog.array.insertAt(arr, obj, i);\n  }\n};\n\n\n/**\n * Removes the first occurrence of a particular value from an array.\n * @param {IArrayLike<T>} arr Array from which to remove\n *     value.\n * @param {T} obj Object to remove.\n * @return {boolean} True if an element was removed.\n * @template T\n */\ngoog.array.remove = function(arr, obj) {\n  var i = goog.array.indexOf(arr, obj);\n  var rv;\n  if ((rv = i >= 0)) {\n    goog.array.removeAt(arr, i);\n  }\n  return rv;\n};\n\n\n/**\n * Removes the last occurrence of a particular value from an array.\n * @param {!IArrayLike<T>} arr Array from which to remove value.\n * @param {T} obj Object to remove.\n * @return {boolean} True if an element was removed.\n * @template T\n */\ngoog.array.removeLast = function(arr, obj) {\n  var i = goog.array.lastIndexOf(arr, obj);\n  if (i >= 0) {\n    goog.array.removeAt(arr, i);\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Removes from an array the element at index i\n * @param {IArrayLike<?>} arr Array or array like object from which to\n *     remove value.\n * @param {number} i The index to remove.\n * @return {boolean} True if an element was removed.\n */\ngoog.array.removeAt = function(arr, i) {\n  goog.asserts.assert(arr.length != null);\n\n  // use generic form of splice\n  // splice returns the removed items and if successful the length of that\n  // will be 1\n  return Array.prototype.splice.call(arr, i, 1).length == 1;\n};\n\n\n/**\n * Removes the first value that satisfies the given condition.\n * @param {IArrayLike<T>} arr Array or array\n *     like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call\n *     for every element. This function\n *     takes 3 arguments (the element, the index and the array) and should\n *     return a boolean.\n * @param {S=} opt_obj An optional \"this\" context for the function.\n * @return {boolean} True if an element was removed.\n * @template T,S\n */\ngoog.array.removeIf = function(arr, f, opt_obj) {\n  var i = goog.array.findIndex(arr, f, opt_obj);\n  if (i >= 0) {\n    goog.array.removeAt(arr, i);\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Removes all values that satisfy the given condition.\n * @param {IArrayLike<T>} arr Array or array\n *     like object over which to iterate.\n * @param {?function(this:S, T, number, ?) : boolean} f The function to call\n *     for every element. This function\n *     takes 3 arguments (the element, the index and the array) and should\n *     return a boolean.\n * @param {S=} opt_obj An optional \"this\" context for the function.\n * @return {number} The number of items removed\n * @template T,S\n */\ngoog.array.removeAllIf = function(arr, f, opt_obj) {\n  var removedCount = 0;\n  goog.array.forEachRight(arr, function(val, index) {\n    if (f.call(/** @type {?} */ (opt_obj), val, index, arr)) {\n      if (goog.array.removeAt(arr, index)) {\n        removedCount++;\n      }\n    }\n  });\n  return removedCount;\n};\n\n\n/**\n * Returns a new array that is the result of joining the arguments.  If arrays\n * are passed then their items are added, however, if non-arrays are passed they\n * will be added to the return array as is.\n *\n * Note that ArrayLike objects will be added as is, rather than having their\n * items added.\n *\n * goog.array.concat([1, 2], [3, 4]) -> [1, 2, 3, 4]\n * goog.array.concat(0, [1, 2]) -> [0, 1, 2]\n * goog.array.concat([1, 2], null) -> [1, 2, null]\n *\n * There is bug in all current versions of IE (6, 7 and 8) where arrays created\n * in an iframe become corrupted soon (not immediately) after the iframe is\n * destroyed. This is common if loading data via goog.net.IframeIo, for example.\n * This corruption only affects the concat method which will start throwing\n * Catastrophic Errors (#-2147418113).\n *\n * See http://endoflow.com/scratch/corrupted-arrays.html for a test case.\n *\n * Internally goog.array should use this, so that all methods will continue to\n * work on these broken array objects.\n *\n * @param {...*} var_args Items to concatenate.  Arrays will have each item\n *     added, while primitives and objects will be added as is.\n * @return {!Array<?>} The new resultant array.\n */\ngoog.array.concat = function(var_args) {\n  return Array.prototype.concat.apply([], arguments);\n};\n\n\n/**\n * Returns a new array that contains the contents of all the arrays passed.\n * @param {...!Array<T>} var_args\n * @return {!Array<T>}\n * @template T\n */\ngoog.array.join = function(var_args) {\n  return Array.prototype.concat.apply([], arguments);\n};\n\n\n/**\n * Converts an object to an array.\n * @param {IArrayLike<T>|string} object  The object to convert to an\n *     array.\n * @return {!Array<T>} The object converted into an array. If object has a\n *     length property, every property indexed with a non-negative number\n *     less than length will be included in the result. If object does not\n *     have a length property, an empty array will be returned.\n * @template T\n */\ngoog.array.toArray = function(object) {\n  var length = object.length;\n\n  // If length is not a number the following is false. This case is kept for\n  // backwards compatibility since there are callers that pass objects that are\n  // not array like.\n  if (length > 0) {\n    var rv = new Array(length);\n    for (var i = 0; i < length; i++) {\n      rv[i] = object[i];\n    }\n    return rv;\n  }\n  return [];\n};\n\n\n/**\n * Does a shallow copy of an array.\n * @param {IArrayLike<T>|string} arr  Array or array-like object to\n *     clone.\n * @return {!Array<T>} Clone of the input array.\n * @template T\n */\ngoog.array.clone = goog.array.toArray;\n\n\n/**\n * Extends an array with another array, element, or \"array like\" object.\n * This function operates 'in-place', it does not create a new Array.\n *\n * Example:\n * var a = [];\n * goog.array.extend(a, [0, 1]);\n * a; // [0, 1]\n * goog.array.extend(a, 2);\n * a; // [0, 1, 2]\n *\n * @param {Array<VALUE>} arr1  The array to modify.\n * @param {...(IArrayLike<VALUE>|VALUE)} var_args The elements or arrays of\n *     elements to add to arr1.\n * @template VALUE\n */\ngoog.array.extend = function(arr1, var_args) {\n  for (var i = 1; i < arguments.length; i++) {\n    var arr2 = arguments[i];\n    if (goog.isArrayLike(arr2)) {\n      var len1 = arr1.length || 0;\n      var len2 = arr2.length || 0;\n      arr1.length = len1 + len2;\n      for (var j = 0; j < len2; j++) {\n        arr1[len1 + j] = arr2[j];\n      }\n    } else {\n      arr1.push(arr2);\n    }\n  }\n};\n\n\n/**\n * Adds or removes elements from an array. This is a generic version of Array\n * splice. This means that it might work on other objects similar to arrays,\n * such as the arguments object.\n *\n * @param {IArrayLike<T>} arr The array to modify.\n * @param {number|undefined} index The index at which to start changing the\n *     array. If not defined, treated as 0.\n * @param {number} howMany How many elements to remove (0 means no removal. A\n *     value below 0 is treated as zero and so is any other non number. Numbers\n *     are floored).\n * @param {...T} var_args Optional, additional elements to insert into the\n *     array.\n * @return {!Array<T>} the removed elements.\n * @template T\n */\ngoog.array.splice = function(arr, index, howMany, var_args) {\n  goog.asserts.assert(arr.length != null);\n\n  return Array.prototype.splice.apply(arr, goog.array.slice(arguments, 1));\n};\n\n\n/**\n * Returns a new array from a segment of an array. This is a generic version of\n * Array slice. This means that it might work on other objects similar to\n * arrays, such as the arguments object.\n *\n * @param {IArrayLike<T>|string} arr The array from\n * which to copy a segment.\n * @param {number} start The index of the first element to copy.\n * @param {number=} opt_end The index after the last element to copy.\n * @return {!Array<T>} A new array containing the specified segment of the\n *     original array.\n * @template T\n */\ngoog.array.slice = function(arr, start, opt_end) {\n  goog.asserts.assert(arr.length != null);\n\n  // passing 1 arg to slice is not the same as passing 2 where the second is\n  // null or undefined (in that case the second argument is treated as 0).\n  // we could use slice on the arguments object and then use apply instead of\n  // testing the length\n  if (arguments.length <= 2) {\n    return Array.prototype.slice.call(arr, start);\n  } else {\n    return Array.prototype.slice.call(arr, start, opt_end);\n  }\n};\n\n\n/**\n * Removes all duplicates from an array (retaining only the first\n * occurrence of each array element).  This function modifies the\n * array in place and doesn't change the order of the non-duplicate items.\n *\n * For objects, duplicates are identified as having the same unique ID as\n * defined by {@link goog.getUid}.\n *\n * Alternatively you can specify a custom hash function that returns a unique\n * value for each item in the array it should consider unique.\n *\n * Runtime: N,\n * Worstcase space: 2N (no dupes)\n *\n * @param {IArrayLike<T>} arr The array from which to remove\n *     duplicates.\n * @param {Array=} opt_rv An optional array in which to return the results,\n *     instead of performing the removal inplace.  If specified, the original\n *     array will remain unchanged.\n * @param {function(T):string=} opt_hashFn An optional function to use to\n *     apply to every item in the array. This function should return a unique\n *     value for each item in the array it should consider unique.\n * @template T\n */\ngoog.array.removeDuplicates = function(arr, opt_rv, opt_hashFn) {\n  var returnArray = opt_rv || arr;\n  var defaultHashFn = function(item) {\n    // Prefix each type with a single character representing the type to\n    // prevent conflicting keys (e.g. true and 'true').\n    return goog.isObject(item) ? 'o' + goog.getUid(item) :\n                                 (typeof item).charAt(0) + item;\n  };\n  var hashFn = opt_hashFn || defaultHashFn;\n\n  var seen = {}, cursorInsert = 0, cursorRead = 0;\n  while (cursorRead < arr.length) {\n    var current = arr[cursorRead++];\n    var key = hashFn(current);\n    if (!Object.prototype.hasOwnProperty.call(seen, key)) {\n      seen[key] = true;\n      returnArray[cursorInsert++] = current;\n    }\n  }\n  returnArray.length = cursorInsert;\n};\n\n\n/**\n * Searches the specified array for the specified target using the binary\n * search algorithm.  If no opt_compareFn is specified, elements are compared\n * using <code>goog.array.defaultCompare</code>, which compares the elements\n * using the built in < and > operators.  This will produce the expected\n * behavior for homogeneous arrays of String(s) and Number(s). The array\n * specified <b>must</b> be sorted in ascending order (as defined by the\n * comparison function).  If the array is not sorted, results are undefined.\n * If the array contains multiple instances of the specified target value, the\n * left-most instance will be found.\n *\n * Runtime: O(log n)\n *\n * @param {IArrayLike<VALUE>} arr The array to be searched.\n * @param {TARGET} target The sought value.\n * @param {function(TARGET, VALUE): number=} opt_compareFn Optional comparison\n *     function by which the array is ordered. Should take 2 arguments to\n *     compare, the target value and an element from your array, and return a\n *     negative number, zero, or a positive number depending on whether the\n *     first argument is less than, equal to, or greater than the second.\n * @return {number} Lowest index of the target value if found, otherwise\n *     (-(insertion point) - 1). The insertion point is where the value should\n *     be inserted into arr to preserve the sorted property.  Return value >= 0\n *     iff target is found.\n * @template TARGET, VALUE\n */\ngoog.array.binarySearch = function(arr, target, opt_compareFn) {\n  return goog.array.binarySearch_(\n      arr, opt_compareFn || goog.array.defaultCompare, false /* isEvaluator */,\n      target);\n};\n\n\n/**\n * Selects an index in the specified array using the binary search algorithm.\n * The evaluator receives an element and determines whether the desired index\n * is before, at, or after it.  The evaluator must be consistent (formally,\n * goog.array.map(goog.array.map(arr, evaluator, opt_obj), goog.math.sign)\n * must be monotonically non-increasing).\n *\n * Runtime: O(log n)\n *\n * @param {IArrayLike<VALUE>} arr The array to be searched.\n * @param {function(this:THIS, VALUE, number, ?): number} evaluator\n *     Evaluator function that receives 3 arguments (the element, the index and\n *     the array). Should return a negative number, zero, or a positive number\n *     depending on whether the desired index is before, at, or after the\n *     element passed to it.\n * @param {THIS=} opt_obj The object to be used as the value of 'this'\n *     within evaluator.\n * @return {number} Index of the leftmost element matched by the evaluator, if\n *     such exists; otherwise (-(insertion point) - 1). The insertion point is\n *     the index of the first element for which the evaluator returns negative,\n *     or arr.length if no such element exists. The return value is non-negative\n *     iff a match is found.\n * @template THIS, VALUE\n */\ngoog.array.binarySelect = function(arr, evaluator, opt_obj) {\n  return goog.array.binarySearch_(\n      arr, evaluator, true /* isEvaluator */, undefined /* opt_target */,\n      opt_obj);\n};\n\n\n/**\n * Implementation of a binary search algorithm which knows how to use both\n * comparison functions and evaluators. If an evaluator is provided, will call\n * the evaluator with the given optional data object, conforming to the\n * interface defined in binarySelect. Otherwise, if a comparison function is\n * provided, will call the comparison function against the given data object.\n *\n * This implementation purposefully does not use goog.bind or goog.partial for\n * performance reasons.\n *\n * Runtime: O(log n)\n *\n * @param {IArrayLike<?>} arr The array to be searched.\n * @param {function(?, ?, ?): number | function(?, ?): number} compareFn\n *     Either an evaluator or a comparison function, as defined by binarySearch\n *     and binarySelect above.\n * @param {boolean} isEvaluator Whether the function is an evaluator or a\n *     comparison function.\n * @param {?=} opt_target If the function is a comparison function, then\n *     this is the target to binary search for.\n * @param {Object=} opt_selfObj If the function is an evaluator, this is an\n *     optional this object for the evaluator.\n * @return {number} Lowest index of the target value if found, otherwise\n *     (-(insertion point) - 1). The insertion point is where the value should\n *     be inserted into arr to preserve the sorted property.  Return value >= 0\n *     iff target is found.\n * @private\n */\ngoog.array.binarySearch_ = function(\n    arr, compareFn, isEvaluator, opt_target, opt_selfObj) {\n  var left = 0;            // inclusive\n  var right = arr.length;  // exclusive\n  var found;\n  while (left < right) {\n    var middle = left + ((right - left) >>> 1);\n    var compareResult;\n    if (isEvaluator) {\n      compareResult = compareFn.call(opt_selfObj, arr[middle], middle, arr);\n    } else {\n      // NOTE(dimvar): To avoid this cast, we'd have to use function overloading\n      // for the type of binarySearch_, which the type system can't express yet.\n      compareResult = /** @type {function(?, ?): number} */ (compareFn)(\n          opt_target, arr[middle]);\n    }\n    if (compareResult > 0) {\n      left = middle + 1;\n    } else {\n      right = middle;\n      // We are looking for the lowest index so we can't return immediately.\n      found = !compareResult;\n    }\n  }\n  // left is the index if found, or the insertion point otherwise.\n  // Avoiding bitwise not operator, as that causes a loss in precision for array\n  // indexes outside the bounds of a 32-bit signed integer.  Array indexes have\n  // a maximum value of 2^32-2 https://tc39.es/ecma262/#array-index\n  return found ? left : -left - 1;\n};\n\n\n/**\n * Sorts the specified array into ascending order.  If no opt_compareFn is\n * specified, elements are compared using\n * <code>goog.array.defaultCompare</code>, which compares the elements using\n * the built in < and > operators.  This will produce the expected behavior\n * for homogeneous arrays of String(s) and Number(s), unlike the native sort,\n * but will give unpredictable results for heterogeneous lists of strings and\n * numbers with different numbers of digits.\n *\n * This sort is not guaranteed to be stable.\n *\n * Runtime: Same as <code>Array.prototype.sort</code>\n *\n * @param {Array<T>} arr The array to be sorted.\n * @param {?function(T,T):number=} opt_compareFn Optional comparison\n *     function by which the\n *     array is to be ordered. Should take 2 arguments to compare, and return a\n *     negative number, zero, or a positive number depending on whether the\n *     first argument is less than, equal to, or greater than the second.\n * @template T\n */\ngoog.array.sort = function(arr, opt_compareFn) {\n  // TODO(arv): Update type annotation since null is not accepted.\n  arr.sort(opt_compareFn || goog.array.defaultCompare);\n};\n\n\n/**\n * Sorts the specified array into ascending order in a stable way.  If no\n * opt_compareFn is specified, elements are compared using\n * <code>goog.array.defaultCompare</code>, which compares the elements using\n * the built in < and > operators.  This will produce the expected behavior\n * for homogeneous arrays of String(s) and Number(s).\n *\n * Runtime: Same as <code>Array.prototype.sort</code>, plus an additional\n * O(n) overhead of copying the array twice.\n *\n * @param {Array<T>} arr The array to be sorted.\n * @param {?function(T, T): number=} opt_compareFn Optional comparison function\n *     by which the array is to be ordered. Should take 2 arguments to compare,\n *     and return a negative number, zero, or a positive number depending on\n *     whether the first argument is less than, equal to, or greater than the\n *     second.\n * @template T\n */\ngoog.array.stableSort = function(arr, opt_compareFn) {\n  var compArr = new Array(arr.length);\n  for (var i = 0; i < arr.length; i++) {\n    compArr[i] = {index: i, value: arr[i]};\n  }\n  var valueCompareFn = opt_compareFn || goog.array.defaultCompare;\n  function stableCompareFn(obj1, obj2) {\n    return valueCompareFn(obj1.value, obj2.value) || obj1.index - obj2.index;\n  }\n  goog.array.sort(compArr, stableCompareFn);\n  for (var i = 0; i < arr.length; i++) {\n    arr[i] = compArr[i].value;\n  }\n};\n\n\n/**\n * Sort the specified array into ascending order based on item keys\n * returned by the specified key function.\n * If no opt_compareFn is specified, the keys are compared in ascending order\n * using <code>goog.array.defaultCompare</code>.\n *\n * Runtime: O(S(f(n)), where S is runtime of <code>goog.array.sort</code>\n * and f(n) is runtime of the key function.\n *\n * @param {Array<T>} arr The array to be sorted.\n * @param {function(T): K} keyFn Function taking array element and returning\n *     a key used for sorting this element.\n * @param {?function(K, K): number=} opt_compareFn Optional comparison function\n *     by which the keys are to be ordered. Should take 2 arguments to compare,\n *     and return a negative number, zero, or a positive number depending on\n *     whether the first argument is less than, equal to, or greater than the\n *     second.\n * @template T,K\n */\ngoog.array.sortByKey = function(arr, keyFn, opt_compareFn) {\n  var keyCompareFn = opt_compareFn || goog.array.defaultCompare;\n  goog.array.sort(\n      arr, function(a, b) { return keyCompareFn(keyFn(a), keyFn(b)); });\n};\n\n\n/**\n * Sorts an array of objects by the specified object key and compare\n * function. If no compare function is provided, the key values are\n * compared in ascending order using <code>goog.array.defaultCompare</code>.\n * This won't work for keys that get renamed by the compiler. So use\n * {'foo': 1, 'bar': 2} rather than {foo: 1, bar: 2}.\n * @param {Array<Object>} arr An array of objects to sort.\n * @param {string} key The object key to sort by.\n * @param {Function=} opt_compareFn The function to use to compare key\n *     values.\n */\ngoog.array.sortObjectsByKey = function(arr, key, opt_compareFn) {\n  goog.array.sortByKey(arr, function(obj) { return obj[key]; }, opt_compareFn);\n};\n\n\n/**\n * Tells if the array is sorted.\n * @param {!IArrayLike<T>} arr The array.\n * @param {?function(T,T):number=} opt_compareFn Function to compare the\n *     array elements.\n *     Should take 2 arguments to compare, and return a negative number, zero,\n *     or a positive number depending on whether the first argument is less\n *     than, equal to, or greater than the second.\n * @param {boolean=} opt_strict If true no equal elements are allowed.\n * @return {boolean} Whether the array is sorted.\n * @template T\n */\ngoog.array.isSorted = function(arr, opt_compareFn, opt_strict) {\n  var compare = opt_compareFn || goog.array.defaultCompare;\n  for (var i = 1; i < arr.length; i++) {\n    var compareResult = compare(arr[i - 1], arr[i]);\n    if (compareResult > 0 || compareResult == 0 && opt_strict) {\n      return false;\n    }\n  }\n  return true;\n};\n\n\n/**\n * Compares two arrays for equality. Two arrays are considered equal if they\n * have the same length and their corresponding elements are equal according to\n * the comparison function.\n *\n * @param {IArrayLike<?>} arr1 The first array to compare.\n * @param {IArrayLike<?>} arr2 The second array to compare.\n * @param {Function=} opt_equalsFn Optional comparison function.\n *     Should take 2 arguments to compare, and return true if the arguments\n *     are equal. Defaults to {@link goog.array.defaultCompareEquality} which\n *     compares the elements using the built-in '===' operator.\n * @return {boolean} Whether the two arrays are equal.\n */\ngoog.array.equals = function(arr1, arr2, opt_equalsFn) {\n  if (!goog.isArrayLike(arr1) || !goog.isArrayLike(arr2) ||\n      arr1.length != arr2.length) {\n    return false;\n  }\n  var l = arr1.length;\n  var equalsFn = opt_equalsFn || goog.array.defaultCompareEquality;\n  for (var i = 0; i < l; i++) {\n    if (!equalsFn(arr1[i], arr2[i])) {\n      return false;\n    }\n  }\n  return true;\n};\n\n\n/**\n * 3-way array compare function.\n * @param {!IArrayLike<VALUE>} arr1 The first array to\n *     compare.\n * @param {!IArrayLike<VALUE>} arr2 The second array to\n *     compare.\n * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison\n *     function by which the array is to be ordered. Should take 2 arguments to\n *     compare, and return a negative number, zero, or a positive number\n *     depending on whether the first argument is less than, equal to, or\n *     greater than the second.\n * @return {number} Negative number, zero, or a positive number depending on\n *     whether the first argument is less than, equal to, or greater than the\n *     second.\n * @template VALUE\n */\ngoog.array.compare3 = function(arr1, arr2, opt_compareFn) {\n  var compare = opt_compareFn || goog.array.defaultCompare;\n  var l = Math.min(arr1.length, arr2.length);\n  for (var i = 0; i < l; i++) {\n    var result = compare(arr1[i], arr2[i]);\n    if (result != 0) {\n      return result;\n    }\n  }\n  return goog.array.defaultCompare(arr1.length, arr2.length);\n};\n\n\n/**\n * Compares its two arguments for order, using the built in < and >\n * operators.\n * @param {VALUE} a The first object to be compared.\n * @param {VALUE} b The second object to be compared.\n * @return {number} A negative number, zero, or a positive number as the first\n *     argument is less than, equal to, or greater than the second,\n *     respectively.\n * @template VALUE\n */\ngoog.array.defaultCompare = function(a, b) {\n  return a > b ? 1 : a < b ? -1 : 0;\n};\n\n\n/**\n * Compares its two arguments for inverse order, using the built in < and >\n * operators.\n * @param {VALUE} a The first object to be compared.\n * @param {VALUE} b The second object to be compared.\n * @return {number} A negative number, zero, or a positive number as the first\n *     argument is greater than, equal to, or less than the second,\n *     respectively.\n * @template VALUE\n */\ngoog.array.inverseDefaultCompare = function(a, b) {\n  return -goog.array.defaultCompare(a, b);\n};\n\n\n/**\n * Compares its two arguments for equality, using the built in === operator.\n * @param {*} a The first object to compare.\n * @param {*} b The second object to compare.\n * @return {boolean} True if the two arguments are equal, false otherwise.\n */\ngoog.array.defaultCompareEquality = function(a, b) {\n  return a === b;\n};\n\n\n/**\n * Inserts a value into a sorted array. The array is not modified if the\n * value is already present.\n * @param {IArrayLike<VALUE>} array The array to modify.\n * @param {VALUE} value The object to insert.\n * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison\n *     function by which the array is ordered. Should take 2 arguments to\n *     compare, and return a negative number, zero, or a positive number\n *     depending on whether the first argument is less than, equal to, or\n *     greater than the second.\n * @return {boolean} True if an element was inserted.\n * @template VALUE\n */\ngoog.array.binaryInsert = function(array, value, opt_compareFn) {\n  var index = goog.array.binarySearch(array, value, opt_compareFn);\n  if (index < 0) {\n    goog.array.insertAt(array, value, -(index + 1));\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Removes a value from a sorted array.\n * @param {!IArrayLike<VALUE>} array The array to modify.\n * @param {VALUE} value The object to remove.\n * @param {function(VALUE, VALUE): number=} opt_compareFn Optional comparison\n *     function by which the array is ordered. Should take 2 arguments to\n *     compare, and return a negative number, zero, or a positive number\n *     depending on whether the first argument is less than, equal to, or\n *     greater than the second.\n * @return {boolean} True if an element was removed.\n * @template VALUE\n */\ngoog.array.binaryRemove = function(array, value, opt_compareFn) {\n  var index = goog.array.binarySearch(array, value, opt_compareFn);\n  return (index >= 0) ? goog.array.removeAt(array, index) : false;\n};\n\n\n/**\n * Splits an array into disjoint buckets according to a splitting function.\n * @param {IArrayLike<T>} array The array.\n * @param {function(this:S, T, number, !IArrayLike<T>):?} sorter Function to\n *     call for every element.  This takes 3 arguments (the element, the index\n *     and the array) and must return a valid object key (a string, number,\n *     etc), or undefined, if that object should not be placed in a bucket.\n * @param {S=} opt_obj The object to be used as the value of 'this' within\n *     sorter.\n * @return {!Object<!Array<T>>} An object, with keys being all of the unique\n *     return values of sorter, and values being arrays containing the items for\n *     which the splitter returned that key.\n * @template T,S\n */\ngoog.array.bucket = function(array, sorter, opt_obj) {\n  var buckets = {};\n\n  for (var i = 0; i < array.length; i++) {\n    var value = array[i];\n    var key = sorter.call(/** @type {?} */ (opt_obj), value, i, array);\n    if (key !== undefined) {\n      // Push the value to the right bucket, creating it if necessary.\n      var bucket = buckets[key] || (buckets[key] = []);\n      bucket.push(value);\n    }\n  }\n\n  return buckets;\n};\n\n\n/**\n * Creates a new object built from the provided array and the key-generation\n * function.\n * @param {IArrayLike<T>} arr Array or array like object over\n *     which to iterate whose elements will be the values in the new object.\n * @param {?function(this:S, T, number, ?) : string} keyFunc The function to\n *     call for every element. This function takes 3 arguments (the element, the\n *     index and the array) and should return a string that will be used as the\n *     key for the element in the new object. If the function returns the same\n *     key for more than one element, the value for that key is\n *     implementation-defined.\n * @param {S=} opt_obj The object to be used as the value of 'this'\n *     within keyFunc.\n * @return {!Object<T>} The new object.\n * @template T,S\n */\ngoog.array.toObject = function(arr, keyFunc, opt_obj) {\n  var ret = {};\n  goog.array.forEach(arr, function(element, index) {\n    ret[keyFunc.call(/** @type {?} */ (opt_obj), element, index, arr)] =\n        element;\n  });\n  return ret;\n};\n\n\n/**\n * Creates a range of numbers in an arithmetic progression.\n *\n * Range takes 1, 2, or 3 arguments:\n * <pre>\n * range(5) is the same as range(0, 5, 1) and produces [0, 1, 2, 3, 4]\n * range(2, 5) is the same as range(2, 5, 1) and produces [2, 3, 4]\n * range(-2, -5, -1) produces [-2, -3, -4]\n * range(-2, -5, 1) produces [], since stepping by 1 wouldn't ever reach -5.\n * </pre>\n *\n * @param {number} startOrEnd The starting value of the range if an end argument\n *     is provided. Otherwise, the start value is 0, and this is the end value.\n * @param {number=} opt_end The optional end value of the range.\n * @param {number=} opt_step The step size between range values. Defaults to 1\n *     if opt_step is undefined or 0.\n * @return {!Array<number>} An array of numbers for the requested range. May be\n *     an empty array if adding the step would not converge toward the end\n *     value.\n */\ngoog.array.range = function(startOrEnd, opt_end, opt_step) {\n  var array = [];\n  var start = 0;\n  var end = startOrEnd;\n  var step = opt_step || 1;\n  if (opt_end !== undefined) {\n    start = startOrEnd;\n    end = opt_end;\n  }\n\n  if (step * (end - start) < 0) {\n    // Sign mismatch: start + step will never reach the end value.\n    return [];\n  }\n\n  if (step > 0) {\n    for (var i = start; i < end; i += step) {\n      array.push(i);\n    }\n  } else {\n    for (var i = start; i > end; i += step) {\n      array.push(i);\n    }\n  }\n  return array;\n};\n\n\n/**\n * Returns an array consisting of the given value repeated N times.\n *\n * @param {VALUE} value The value to repeat.\n * @param {number} n The repeat count.\n * @return {!Array<VALUE>} An array with the repeated value.\n * @template VALUE\n */\ngoog.array.repeat = function(value, n) {\n  var array = [];\n  for (var i = 0; i < n; i++) {\n    array[i] = value;\n  }\n  return array;\n};\n\n\n/**\n * Returns an array consisting of every argument with all arrays\n * expanded in-place recursively.\n *\n * @param {...*} var_args The values to flatten.\n * @return {!Array<?>} An array containing the flattened values.\n */\ngoog.array.flatten = function(var_args) {\n  var CHUNK_SIZE = 8192;\n\n  var result = [];\n  for (var i = 0; i < arguments.length; i++) {\n    var element = arguments[i];\n    if (goog.isArray(element)) {\n      for (var c = 0; c < element.length; c += CHUNK_SIZE) {\n        var chunk = goog.array.slice(element, c, c + CHUNK_SIZE);\n        var recurseResult = goog.array.flatten.apply(null, chunk);\n        for (var r = 0; r < recurseResult.length; r++) {\n          result.push(recurseResult[r]);\n        }\n      }\n    } else {\n      result.push(element);\n    }\n  }\n  return result;\n};\n\n\n/**\n * Rotates an array in-place. After calling this method, the element at\n * index i will be the element previously at index (i - n) %\n * array.length, for all values of i between 0 and array.length - 1,\n * inclusive.\n *\n * For example, suppose list comprises [t, a, n, k, s]. After invoking\n * rotate(array, 1) (or rotate(array, -4)), array will comprise [s, t, a, n, k].\n *\n * @param {!Array<T>} array The array to rotate.\n * @param {number} n The amount to rotate.\n * @return {!Array<T>} The array.\n * @template T\n */\ngoog.array.rotate = function(array, n) {\n  goog.asserts.assert(array.length != null);\n\n  if (array.length) {\n    n %= array.length;\n    if (n > 0) {\n      Array.prototype.unshift.apply(array, array.splice(-n, n));\n    } else if (n < 0) {\n      Array.prototype.push.apply(array, array.splice(0, -n));\n    }\n  }\n  return array;\n};\n\n\n/**\n * Moves one item of an array to a new position keeping the order of the rest\n * of the items. Example use case: keeping a list of JavaScript objects\n * synchronized with the corresponding list of DOM elements after one of the\n * elements has been dragged to a new position.\n * @param {!IArrayLike<?>} arr The array to modify.\n * @param {number} fromIndex Index of the item to move between 0 and\n *     {@code arr.length - 1}.\n * @param {number} toIndex Target index between 0 and {@code arr.length - 1}.\n */\ngoog.array.moveItem = function(arr, fromIndex, toIndex) {\n  goog.asserts.assert(fromIndex >= 0 && fromIndex < arr.length);\n  goog.asserts.assert(toIndex >= 0 && toIndex < arr.length);\n  // Remove 1 item at fromIndex.\n  var removedItems = Array.prototype.splice.call(arr, fromIndex, 1);\n  // Insert the removed item at toIndex.\n  Array.prototype.splice.call(arr, toIndex, 0, removedItems[0]);\n  // We don't use goog.array.insertAt and goog.array.removeAt, because they're\n  // significantly slower than splice.\n};\n\n\n/**\n * Creates a new array for which the element at position i is an array of the\n * ith element of the provided arrays.  The returned array will only be as long\n * as the shortest array provided; additional values are ignored.  For example,\n * the result of zipping [1, 2] and [3, 4, 5] is [[1,3], [2, 4]].\n *\n * This is similar to the zip() function in Python.  See {@link\n * http://docs.python.org/library/functions.html#zip}\n *\n * @param {...!IArrayLike<?>} var_args Arrays to be combined.\n * @return {!Array<!Array<?>>} A new array of arrays created from\n *     provided arrays.\n */\ngoog.array.zip = function(var_args) {\n  if (!arguments.length) {\n    return [];\n  }\n  var result = [];\n  var minLen = arguments[0].length;\n  for (var i = 1; i < arguments.length; i++) {\n    if (arguments[i].length < minLen) {\n      minLen = arguments[i].length;\n    }\n  }\n  for (var i = 0; i < minLen; i++) {\n    var value = [];\n    for (var j = 0; j < arguments.length; j++) {\n      value.push(arguments[j][i]);\n    }\n    result.push(value);\n  }\n  return result;\n};\n\n\n/**\n * Shuffles the values in the specified array using the Fisher-Yates in-place\n * shuffle (also known as the Knuth Shuffle). By default, calls Math.random()\n * and so resets the state of that random number generator. Similarly, may reset\n * the state of any other specified random number generator.\n *\n * Runtime: O(n)\n *\n * @param {!Array<?>} arr The array to be shuffled.\n * @param {function():number=} opt_randFn Optional random function to use for\n *     shuffling.\n *     Takes no arguments, and returns a random number on the interval [0, 1).\n *     Defaults to Math.random() using JavaScript's built-in Math library.\n */\ngoog.array.shuffle = function(arr, opt_randFn) {\n  var randFn = opt_randFn || Math.random;\n\n  for (var i = arr.length - 1; i > 0; i--) {\n    // Choose a random array index in [0, i] (inclusive with i).\n    var j = Math.floor(randFn() * (i + 1));\n\n    var tmp = arr[i];\n    arr[i] = arr[j];\n    arr[j] = tmp;\n  }\n};\n\n\n/**\n * Returns a new array of elements from arr, based on the indexes of elements\n * provided by index_arr. For example, the result of index copying\n * ['a', 'b', 'c'] with index_arr [1,0,0,2] is ['b', 'a', 'a', 'c'].\n *\n * @param {!IArrayLike<T>} arr The array to get a indexed copy from.\n * @param {!IArrayLike<number>} index_arr An array of indexes to get from arr.\n * @return {!Array<T>} A new array of elements from arr in index_arr order.\n * @template T\n */\ngoog.array.copyByIndex = function(arr, index_arr) {\n  var result = [];\n  goog.array.forEach(index_arr, function(index) { result.push(arr[index]); });\n  return result;\n};\n\n\n/**\n * Maps each element of the input array into zero or more elements of the output\n * array.\n *\n * @param {!IArrayLike<VALUE>|string} arr Array or array like object\n *     over which to iterate.\n * @param {function(this:THIS, VALUE, number, ?): !Array<RESULT>} f The function\n *     to call for every element. This function takes 3 arguments (the element,\n *     the index and the array) and should return an array. The result will be\n *     used to extend a new array.\n * @param {THIS=} opt_obj The object to be used as the value of 'this' within f.\n * @return {!Array<RESULT>} a new array with the concatenation of all arrays\n *     returned from f.\n * @template THIS, VALUE, RESULT\n */\ngoog.array.concatMap = function(arr, f, opt_obj) {\n  return goog.array.concat.apply([], goog.array.map(arr, f, opt_obj));\n};\n","^;",1579837703000,"^<",["^=",["^1L","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/array/array.js"],"^O",["^=",["^2O"]],"^W",true,"^X",["^?","^1L"]],["^ ","^3",[1579837703000],"^4","goog.editor.clicktoeditwrapper.js","^5",["^6","goog/editor/clicktoeditwrapper.js"],"^7","goog/editor/clicktoeditwrapper.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A wrapper around a goog.editor.Field\n * that listens to mouse events on the specified un-editable field, and makes\n * the field editable if the user clicks on it. Clients are still responsible\n * for determining when to make the field un-editable again.\n *\n * Clients can still determine when the field has loaded by listening to\n * field's load event.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.provide('goog.editor.ClickToEditWrapper');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.dom');\ngoog.require('goog.dom.Range');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.editor.BrowserFeature');\ngoog.require('goog.editor.Command');\ngoog.require('goog.editor.Field');\ngoog.require('goog.editor.range');\ngoog.require('goog.events.BrowserEvent');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\n\n\n\n/**\n * Initialize the wrapper, and begin listening to mouse events immediately.\n * @param {goog.editor.Field} fieldObj The editable field being wrapped.\n * @constructor\n * @extends {goog.Disposable}\n */\ngoog.editor.ClickToEditWrapper = function(fieldObj) {\n  goog.Disposable.call(this);\n\n  /**\n   * The field this wrapper interacts with.\n   * @type {goog.editor.Field}\n   * @private\n   */\n  this.fieldObj_ = fieldObj;\n\n  /**\n   * DOM helper for the field's original element.\n   * @type {goog.dom.DomHelper}\n   * @private\n   */\n  this.originalDomHelper_ =\n      goog.dom.getDomHelper(fieldObj.getOriginalElement());\n\n  /**\n   * @type {?goog.dom.SavedCaretRange}\n   * @private\n   */\n  this.savedCaretRange_ = null;\n\n  /**\n   * Event handler for field related events.\n   * @type {!goog.events.EventHandler<!goog.editor.ClickToEditWrapper>}\n   * @private\n   */\n  this.fieldEventHandler_ = new goog.events.EventHandler(this);\n\n  /**\n   * Bound version of the finishMouseUp method.\n   * @type {Function}\n   * @private\n   */\n  this.finishMouseUpBound_ = goog.bind(this.finishMouseUp_, this);\n\n  /**\n   * Event handler for mouse events.\n   * @type {!goog.events.EventHandler<!goog.editor.ClickToEditWrapper>}\n   * @private\n   */\n  this.mouseEventHandler_ = new goog.events.EventHandler(this);\n\n  // Start listening to mouse events immediately if necessary.\n  if (!this.fieldObj_.isLoaded()) {\n    this.enterDocument();\n  }\n\n  this.fieldEventHandler_\n      .\n      // Whenever the field is made editable, we need to check if there\n      // are any carets in it, and if so, use them to render the selection.\n      listen(\n          this.fieldObj_, goog.editor.Field.EventType.LOAD,\n          this.renderSelection_)\n      .\n      // Whenever the field is made uneditable, we need to set up\n      // the click-to-edit listeners.\n      listen(\n          this.fieldObj_, goog.editor.Field.EventType.UNLOAD,\n          this.enterDocument);\n};\ngoog.inherits(goog.editor.ClickToEditWrapper, goog.Disposable);\n\n\n\n/** @return {goog.editor.Field} The field. */\ngoog.editor.ClickToEditWrapper.prototype.getFieldObject = function() {\n  return this.fieldObj_;\n};\n\n\n/** @return {goog.dom.DomHelper} The dom helper of the uneditable element. */\ngoog.editor.ClickToEditWrapper.prototype.getOriginalDomHelper = function() {\n  return this.originalDomHelper_;\n};\n\n\n/** @override */\ngoog.editor.ClickToEditWrapper.prototype.disposeInternal = function() {\n  goog.editor.ClickToEditWrapper.base(this, 'disposeInternal');\n  this.exitDocument();\n\n  if (this.savedCaretRange_) {\n    this.savedCaretRange_.dispose();\n  }\n\n  this.fieldEventHandler_.dispose();\n  this.mouseEventHandler_.dispose();\n  this.savedCaretRange_ = null;\n  delete this.fieldEventHandler_;\n  delete this.mouseEventHandler_;\n};\n\n\n/**\n * Initialize listeners when the uneditable field is added to the document.\n * Also sets up lorem ipsum text.\n */\ngoog.editor.ClickToEditWrapper.prototype.enterDocument = function() {\n  if (this.isInDocument_) {\n    return;\n  }\n\n  this.isInDocument_ = true;\n\n  this.mouseEventTriggeredLoad_ = false;\n  var field = this.fieldObj_.getOriginalElement();\n\n  // To do artificial selection preservation, we have to listen to mouseup,\n  // get the current selection, and re-select the same text in the iframe.\n  //\n  // NOTE(nicksantos): Artificial selection preservation is needed in all cases\n  // where we set the field contents by setting innerHTML. There are a few\n  // rare cases where we don't need it. But these cases are highly\n  // implementation-specific, and computationally hard to detect (bidi\n  // and ig modules both set innerHTML), so we just do it in all cases.\n  this.savedAnchorClicked_ = null;\n  this.mouseEventHandler_\n      .listen(field, goog.events.EventType.MOUSEUP, this.handleMouseUp_)\n      .listen(field, goog.events.EventType.CLICK, this.handleClick_);\n\n  // manage lorem ipsum text, if necessary\n  this.fieldObj_.execCommand(goog.editor.Command.UPDATE_LOREM);\n};\n\n\n/**\n * Destroy listeners when the field is removed from the document.\n */\ngoog.editor.ClickToEditWrapper.prototype.exitDocument = function() {\n  this.mouseEventHandler_.removeAll();\n  this.isInDocument_ = false;\n};\n\n\n/**\n * Returns the uneditable field element if the field is not yet editable\n * (equivalent to EditableField.getOriginalElement()), and the editable DOM\n * element if the field is currently editable (equivalent to\n * EditableField.getElement()).\n * @return {Element} The element containing the editable field contents.\n */\ngoog.editor.ClickToEditWrapper.prototype.getElement = function() {\n  return this.fieldObj_.isLoaded() ? this.fieldObj_.getElement() :\n                                     this.fieldObj_.getOriginalElement();\n};\n\n\n/**\n * True if a mouse event should be handled, false if it should be ignored.\n * @param {goog.events.BrowserEvent} e The mouse event.\n * @return {boolean} Wether or not this mouse event should be handled.\n * @private\n */\ngoog.editor.ClickToEditWrapper.prototype.shouldHandleMouseEvent_ = function(e) {\n  return e.isButton(goog.events.BrowserEvent.MouseButton.LEFT) &&\n      !(e.shiftKey || e.ctrlKey || e.altKey || e.metaKey);\n};\n\n\n/**\n * Handle mouse click events on the field.\n * @param {goog.events.BrowserEvent} e The click event.\n * @private\n */\ngoog.editor.ClickToEditWrapper.prototype.handleClick_ = function(e) {\n  // If the user clicked on a link in an uneditable field,\n  // we want to cancel the click.\n  var anchorAncestor = goog.dom.getAncestorByTagNameAndClass(\n      /** @type {Node} */ (e.target), goog.dom.TagName.A);\n  if (anchorAncestor) {\n    e.preventDefault();\n\n    if (!goog.editor.BrowserFeature.HAS_ACTIVE_ELEMENT) {\n      this.savedAnchorClicked_ = anchorAncestor;\n    }\n  }\n};\n\n\n/**\n * Handle a mouse up event on the field.\n * @param {goog.events.BrowserEvent} e The mouseup event.\n * @private\n */\ngoog.editor.ClickToEditWrapper.prototype.handleMouseUp_ = function(e) {\n  // Only respond to the left mouse button.\n  if (this.shouldHandleMouseEvent_(e)) {\n    // We need to get the selection when the user mouses up, but the\n    // selection doesn't actually change until after the mouseup event has\n    // propagated. So we need to do this asynchronously.\n    this.originalDomHelper_.getWindow().setTimeout(this.finishMouseUpBound_, 0);\n  }\n};\n\n\n/**\n * A helper function for handleMouseUp_ -- does the actual work\n * when the event is finished propagating.\n * @private\n */\ngoog.editor.ClickToEditWrapper.prototype.finishMouseUp_ = function() {\n  // Make sure that the field is still not editable.\n  if (!this.fieldObj_.isLoaded()) {\n    if (this.savedCaretRange_) {\n      this.savedCaretRange_.dispose();\n      this.savedCaretRange_ = null;\n    }\n\n    if (!this.fieldObj_.queryCommandValue(goog.editor.Command.USING_LOREM)) {\n      // We need carets (blank span nodes) to maintain the selection when\n      // the html is copied into an iframe. However, because our code\n      // clears the selection to make the behavior consistent, we need to do\n      // this even when we're not using an iframe.\n      this.insertCarets_();\n    }\n\n    this.ensureFieldEditable_();\n  }\n\n  this.exitDocument();\n  this.savedAnchorClicked_ = null;\n};\n\n\n/**\n * Ensure that the field is editable. If the field is not editable,\n * make it so, and record the fact that it was done by a user mouse event.\n * @private\n */\ngoog.editor.ClickToEditWrapper.prototype.ensureFieldEditable_ = function() {\n  if (!this.fieldObj_.isLoaded()) {\n    this.mouseEventTriggeredLoad_ = true;\n    this.makeFieldEditable(this.fieldObj_);\n  }\n};\n\n\n/**\n * Once the field has loaded in an iframe, re-create the selection\n * as marked by the carets.\n * @private\n */\ngoog.editor.ClickToEditWrapper.prototype.renderSelection_ = function() {\n  if (this.savedCaretRange_) {\n    // Make sure that the restoration document is inside the iframe\n    // if we're using one.\n    this.savedCaretRange_.setRestorationDocument(\n        this.fieldObj_.getEditableDomHelper().getDocument());\n\n    var startCaret = this.savedCaretRange_.getCaret(true);\n    var endCaret = this.savedCaretRange_.getCaret(false);\n    var hasCarets = startCaret && endCaret;\n  }\n\n  // There are two reasons why we might want to focus the field:\n  // 1) makeFieldEditable was triggered by the click-to-edit wrapper.\n  //    In this case, the mouse event should have triggered a focus, but\n  //    the editor might have taken the focus away to create lorem ipsum\n  //    text or create an iframe for the field. So we make sure the focus\n  //    is restored.\n  // 2) somebody placed carets, and we need to select those carets. The field\n  //    needs focus to ensure that the selection appears.\n  if (this.mouseEventTriggeredLoad_ || hasCarets) {\n    this.focusOnFieldObj(this.fieldObj_);\n  }\n\n  if (hasCarets) {\n    this.savedCaretRange_.restore();\n    this.fieldObj_.dispatchSelectionChangeEvent();\n\n    // NOTE(nicksantos): Bubbles aren't actually enabled until the end\n    // if the load sequence, so if the user clicked on a link, the bubble\n    // will not pop up.\n  }\n\n  if (this.savedCaretRange_) {\n    this.savedCaretRange_.dispose();\n    this.savedCaretRange_ = null;\n  }\n\n  this.mouseEventTriggeredLoad_ = false;\n};\n\n\n/**\n * Focus on the field object.\n * @param {goog.editor.Field} field The field to focus.\n * @protected\n */\ngoog.editor.ClickToEditWrapper.prototype.focusOnFieldObj = function(field) {\n  field.focusAndPlaceCursorAtStart();\n};\n\n\n/**\n * Make the field object editable.\n * @param {goog.editor.Field} field The field to make editable.\n * @protected\n */\ngoog.editor.ClickToEditWrapper.prototype.makeFieldEditable = function(field) {\n  field.makeEditable();\n};\n\n\n//================================================================\n// Caret-handling methods\n\n\n/**\n * Gets a saved caret range for the given range.\n * @param {goog.dom.AbstractRange} range A range wrapper.\n * @return {goog.dom.SavedCaretRange} The range, saved with carets, or null\n *    if the range wrapper was null.\n * @private\n */\ngoog.editor.ClickToEditWrapper.createCaretRange_ = function(range) {\n  return range && goog.editor.range.saveUsingNormalizedCarets(range);\n};\n\n\n/**\n * Inserts the carets, given the current selection.\n *\n * Note that for all practical purposes, a cursor position is just\n * a selection with the start and end at the same point.\n * @private\n */\ngoog.editor.ClickToEditWrapper.prototype.insertCarets_ = function() {\n  var fieldElement = this.fieldObj_.getOriginalElement();\n\n  this.savedCaretRange_ = null;\n  var originalWindow = this.originalDomHelper_.getWindow();\n  if (goog.dom.Range.hasSelection(originalWindow)) {\n    var range = goog.dom.Range.createFromWindow(originalWindow);\n    range = range && goog.editor.range.narrow(range, fieldElement);\n    this.savedCaretRange_ =\n        goog.editor.ClickToEditWrapper.createCaretRange_(range);\n  }\n\n  if (!this.savedCaretRange_) {\n    // We couldn't figure out where to put the carets.\n    // But in FF2/IE6+, this could mean that the user clicked on a\n    // 'special' node, (e.g., a link or an unselectable item). So the\n    // selection appears to be null or the full page, even though the user did\n    // click on something. In IE, we can determine the real selection via\n    // document.activeElement. In FF, we have to be more hacky.\n    var specialNodeClicked;\n    if (goog.editor.BrowserFeature.HAS_ACTIVE_ELEMENT) {\n      specialNodeClicked =\n          goog.dom.getActiveElement(this.originalDomHelper_.getDocument());\n    } else {\n      specialNodeClicked = this.savedAnchorClicked_;\n    }\n\n    var isFieldElement = function(node) { return node == fieldElement; };\n    if (specialNodeClicked &&\n        goog.dom.getAncestor(specialNodeClicked, isFieldElement, true)) {\n      // Insert the cursor at the beginning of the active element to be\n      // consistent with the behavior in FF1.5, where clicking on a\n      // link makes the current selection equal to the cursor position\n      // directly before that link.\n      //\n      // TODO(nicksantos): Is there a way to more accurately place the cursor?\n      this.savedCaretRange_ = goog.editor.ClickToEditWrapper.createCaretRange_(\n          goog.dom.Range.createFromNodes(\n              specialNodeClicked, 0, specialNodeClicked, 0));\n    }\n  }\n};\n","^;",1579837703000,"^<",["^=",["^1>","^1T","^33","^Z","^1@","^?","^1A","^1C","^1:","^4Y","^1H","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/clicktoeditwrapper.js"],"^O",["^=",["~$goog.editor.ClickToEditWrapper"]],"^W",true,"^X",["^?","^1:","^1>","^1H","^12","^1@","^33","^1A","^Z","^4Y","^1T","^1C"]],["^ ","^3",[1579837703000],"^4","goog.promise.testsuiteadapter.js","^5",["^6","goog/promise/testsuiteadapter.js"],"^7","goog/promise/testsuiteadapter.js","^8","^9","^:","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Test adapter for testing Closure Promises against the\n * Promises/A+ Compliance Test Suite, which is implemented as a Node.js module.\n *\n * This test suite adapter may not be run in Node.js directly, but must first be\n * compiled with the Closure Compiler to pull in the required dependencies.\n *\n * @see https://npmjs.org/package/promises-aplus-tests\n */\n\ngoog.provide('goog.promise.testSuiteAdapter');\n\ngoog.require('goog.Promise');\n\ngoog.setTestOnly('goog.promise.testSuiteAdapter');\n\n\nvar promisesAplusTests = /** @type {function(!Object, function(*))} */ (\n    require('promises-aplus-tests'));\n\n\n/**\n * Adapter for specifying Promise-creating functions to the Promises test suite.\n * @const\n */\ngoog.promise.testSuiteAdapter = {\n  /** @type {function(*): !goog.Promise} */\n  'resolved': goog.Promise.resolve,\n\n  /** @type {function(*): !goog.Promise} */\n  'rejected': goog.Promise.reject,\n\n  /** @return {!Object} */\n  'deferred': function() {\n    var promiseObj = {};\n    promiseObj['promise'] = new goog.Promise(function(resolve, reject) {\n      promiseObj['resolve'] = resolve;\n      promiseObj['reject'] = reject;\n    });\n    return promiseObj;\n  }\n};\n\n\n// Node.js defines setTimeout globally, but Closure relies on finding it\n// defined on goog.global.\ngoog.exportSymbol('setTimeout', setTimeout);\n\n\n// Rethrowing an error to the global scope kills Node immediately. Suppress\n// error rethrowing for running this test suite.\ngoog.Promise.setUnhandledRejectionHandler(goog.nullFunction);\n\n\n// Run the tests, exiting with a failure code if any of the tests fail.\npromisesAplusTests(goog.promise.testSuiteAdapter, function(err) {\n  if (err) {\n    process.exit(1);\n  }\n});\n","^;",1579837703000,"^<",["^=",["^?","^7S"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/promise/testsuiteadapter.js"],"^O",["^=",["~$goog.promise.testSuiteAdapter"]],"^W",true,"^X",["^?","^7S"]],["^ ","^3",[1579837703000],"^4","goog.ui.combobox.js","^5",["^6","goog/ui/combobox.js"],"^7","goog/ui/combobox.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A combo box control that allows user input with\n * auto-suggestion from a limited set of options.\n *\n * @see ../demos/combobox.html\n */\n\ngoog.provide('goog.ui.ComboBox');\ngoog.provide('goog.ui.ComboBoxItem');\n\ngoog.require('goog.Timer');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.InputHandler');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.events.KeyHandler');\ngoog.require('goog.log');\ngoog.require('goog.positioning.Corner');\ngoog.require('goog.positioning.MenuAnchoredPosition');\ngoog.require('goog.string');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.ItemEvent');\ngoog.require('goog.ui.LabelInput');\ngoog.require('goog.ui.Menu');\ngoog.require('goog.ui.MenuItem');\ngoog.require('goog.ui.MenuSeparator');\ngoog.require('goog.ui.registry');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A ComboBox control.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @param {goog.ui.Menu=} opt_menu Optional menu component.\n *     This menu is disposed of by this control.\n * @param {goog.ui.LabelInput=} opt_labelInput Optional label input.\n *     This label input is disposed of by this control.\n * @extends {goog.ui.Component}\n * @constructor\n */\ngoog.ui.ComboBox = function(opt_domHelper, opt_menu, opt_labelInput) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  this.labelInput_ = opt_labelInput || new goog.ui.LabelInput();\n  this.enabled_ = true;\n\n  // TODO(user): Allow lazy creation of menus/menu items\n  this.menu_ = opt_menu || new goog.ui.Menu(this.getDomHelper());\n  this.setupMenu_();\n};\ngoog.inherits(goog.ui.ComboBox, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.ComboBox);\n\n\n/**\n * Number of milliseconds to wait before dismissing combobox after blur.\n * @type {number}\n */\ngoog.ui.ComboBox.BLUR_DISMISS_TIMER_MS = 250;\n\n\n/**\n * A logger to help debugging of combo box behavior.\n * @type {goog.log.Logger}\n * @private\n */\ngoog.ui.ComboBox.prototype.logger_ = goog.log.getLogger('goog.ui.ComboBox');\n\n\n/**\n * Whether the combo box is enabled.\n * @type {boolean}\n * @private\n */\ngoog.ui.ComboBox.prototype.enabled_;\n\n\n/**\n * Keyboard event handler to manage key events dispatched by the input element.\n * @type {goog.events.KeyHandler}\n * @private\n */\ngoog.ui.ComboBox.prototype.keyHandler_;\n\n\n/**\n * Input handler to take care of firing events when the user inputs text in\n * the input.\n * @type {goog.events.InputHandler?}\n * @private\n */\ngoog.ui.ComboBox.prototype.inputHandler_ = null;\n\n\n/**\n * The last input token.\n * @type {?string}\n * @private\n */\ngoog.ui.ComboBox.prototype.lastToken_ = null;\n\n\n/**\n * A LabelInput control that manages the focus/blur state of the input box.\n * @type {goog.ui.LabelInput?}\n * @private\n */\ngoog.ui.ComboBox.prototype.labelInput_ = null;\n\n\n/**\n * Drop down menu for the combo box.  Will be created at construction time.\n * @type {goog.ui.Menu?}\n * @private\n */\ngoog.ui.ComboBox.prototype.menu_ = null;\n\n\n/**\n * The cached visible count.\n * @type {number}\n * @private\n */\ngoog.ui.ComboBox.prototype.visibleCount_ = -1;\n\n\n/**\n * The input element.\n * @type {?Element}\n * @private\n */\ngoog.ui.ComboBox.prototype.input_ = null;\n\n\n/**\n * The match function.  The first argument for the match function will be\n * a MenuItem's caption and the second will be the token to evaluate.\n * @type {Function}\n * @private\n */\ngoog.ui.ComboBox.prototype.matchFunction_ = goog.string.startsWith;\n\n\n/**\n * Element used as the combo boxes button.\n * @type {?Element}\n * @private\n */\ngoog.ui.ComboBox.prototype.button_ = null;\n\n\n/**\n * Default text content for the input box when it is unchanged and unfocussed.\n * @type {string}\n * @private\n */\ngoog.ui.ComboBox.prototype.defaultText_ = '';\n\n\n/**\n * Name for the input box created\n * @type {string}\n * @private\n */\ngoog.ui.ComboBox.prototype.fieldName_ = '';\n\n\n/**\n * Timer identifier for delaying the dismissal of the combo menu.\n * @type {?number}\n * @private\n */\ngoog.ui.ComboBox.prototype.dismissTimer_ = null;\n\n\n/**\n * True if the unicode inverted triangle should be displayed in the dropdown\n * button. Defaults to false.\n * @type {boolean} useDropdownArrow\n * @private\n */\ngoog.ui.ComboBox.prototype.useDropdownArrow_ = false;\n\n\n/**\n * Create the DOM objects needed for the combo box.  A span and text input.\n * @override\n */\ngoog.ui.ComboBox.prototype.createDom = function() {\n  this.input_ = this.getDomHelper().createDom(goog.dom.TagName.INPUT, {\n    name: this.fieldName_,\n    type: goog.dom.InputType.TEXT,\n    autocomplete: 'off'\n  });\n  this.button_ = this.getDomHelper().createDom(\n      goog.dom.TagName.SPAN, goog.getCssName('goog-combobox-button'));\n  this.setElementInternal(\n      this.getDomHelper().createDom(\n          goog.dom.TagName.SPAN, goog.getCssName('goog-combobox'), this.input_,\n          this.button_));\n  if (this.useDropdownArrow_) {\n    goog.dom.setTextContent(this.button_, '\\u25BC');\n    goog.style.setUnselectable(this.button_, true /* unselectable */);\n  }\n  this.input_.setAttribute('label', this.defaultText_);\n  this.labelInput_.decorate(this.input_);\n  this.menu_.setFocusable(false);\n  if (!this.menu_.isInDocument()) {\n    this.addChild(this.menu_, true);\n  }\n};\n\n\n/**\n * Enables/Disables the combo box.\n * @param {boolean} enabled Whether to enable (true) or disable (false) the\n *     combo box.\n */\ngoog.ui.ComboBox.prototype.setEnabled = function(enabled) {\n  this.enabled_ = enabled;\n  this.labelInput_.setEnabled(enabled);\n  goog.dom.classlist.enable(\n      goog.asserts.assert(this.getElement()),\n      goog.getCssName('goog-combobox-disabled'), !enabled);\n};\n\n\n/**\n * @return {boolean} Whether the menu item is enabled.\n */\ngoog.ui.ComboBox.prototype.isEnabled = function() {\n  return this.enabled_;\n};\n\n\n/** @override */\ngoog.ui.ComboBox.prototype.enterDocument = function() {\n  goog.ui.ComboBox.superClass_.enterDocument.call(this);\n\n  var handler = this.getHandler();\n  handler.listen(\n      this.getElement(), goog.events.EventType.MOUSEDOWN,\n      this.onComboMouseDown_);\n  handler.listen(\n      this.getDomHelper().getDocument(), goog.events.EventType.MOUSEDOWN,\n      this.onDocClicked_);\n\n  handler.listen(this.input_, goog.events.EventType.BLUR, this.onInputBlur_);\n\n  this.keyHandler_ = new goog.events.KeyHandler(this.input_);\n  handler.listen(\n      this.keyHandler_, goog.events.KeyHandler.EventType.KEY,\n      this.handleKeyEvent);\n\n  this.inputHandler_ = new goog.events.InputHandler(this.input_);\n  handler.listen(\n      this.inputHandler_, goog.events.InputHandler.EventType.INPUT,\n      this.onInputEvent_);\n\n  handler.listen(\n      this.menu_, goog.ui.Component.EventType.ACTION, this.onMenuSelected_);\n};\n\n\n/** @override */\ngoog.ui.ComboBox.prototype.exitDocument = function() {\n  this.keyHandler_.dispose();\n  delete this.keyHandler_;\n  this.inputHandler_.dispose();\n  this.inputHandler_ = null;\n  goog.ui.ComboBox.superClass_.exitDocument.call(this);\n};\n\n\n/**\n * Combo box currently can't decorate elements.\n * @return {boolean} The value false.\n * @override\n */\ngoog.ui.ComboBox.prototype.canDecorate = function() {\n  return false;\n};\n\n\n/** @override */\ngoog.ui.ComboBox.prototype.disposeInternal = function() {\n  goog.ui.ComboBox.superClass_.disposeInternal.call(this);\n\n  this.clearDismissTimer_();\n\n  this.labelInput_.dispose();\n  this.menu_.dispose();\n\n  this.labelInput_ = null;\n  this.menu_ = null;\n  this.input_ = null;\n  this.button_ = null;\n};\n\n\n/**\n * Dismisses the menu and resets the value of the edit field.\n */\ngoog.ui.ComboBox.prototype.dismiss = function() {\n  this.clearDismissTimer_();\n  this.hideMenu_();\n  this.menu_.setHighlightedIndex(-1);\n};\n\n\n/**\n * Adds a new menu item at the end of the menu.\n * @param {goog.ui.MenuItem} item Menu item to add to the menu.\n */\ngoog.ui.ComboBox.prototype.addItem = function(item) {\n  this.menu_.addChild(item, true);\n  this.visibleCount_ = -1;\n};\n\n\n/**\n * Adds a new menu item at a specific index in the menu.\n * @param {goog.ui.MenuItem} item Menu item to add to the menu.\n * @param {number} n Index at which to insert the menu item.\n */\ngoog.ui.ComboBox.prototype.addItemAt = function(item, n) {\n  this.menu_.addChildAt(item, n, true);\n  this.visibleCount_ = -1;\n};\n\n\n/**\n * Removes an item from the menu and disposes it.\n * @param {goog.ui.MenuItem} item The menu item to remove.\n */\ngoog.ui.ComboBox.prototype.removeItem = function(item) {\n  var child = this.menu_.removeChild(item, true);\n  if (child) {\n    child.dispose();\n    this.visibleCount_ = -1;\n  }\n};\n\n\n/**\n * Remove all of the items from the ComboBox menu\n */\ngoog.ui.ComboBox.prototype.removeAllItems = function() {\n  for (var i = this.getItemCount() - 1; i >= 0; --i) {\n    this.removeItem(this.getItemAt(i));\n  }\n};\n\n\n/**\n * Removes a menu item at a given index in the menu.\n * @param {number} n Index of item.\n */\ngoog.ui.ComboBox.prototype.removeItemAt = function(n) {\n  var child = this.menu_.removeChildAt(n, true);\n  if (child) {\n    child.dispose();\n    this.visibleCount_ = -1;\n  }\n};\n\n\n/**\n * Returns a reference to the menu item at a given index.\n * @param {number} n Index of menu item.\n * @return {goog.ui.MenuItem?} Reference to the menu item.\n */\ngoog.ui.ComboBox.prototype.getItemAt = function(n) {\n  return /** @type {goog.ui.MenuItem?} */ (this.menu_.getChildAt(n));\n};\n\n\n/**\n * Returns the number of items in the list, including non-visible items,\n * such as separators.\n * @return {number} Number of items in the menu for this combobox.\n */\ngoog.ui.ComboBox.prototype.getItemCount = function() {\n  return this.menu_.getChildCount();\n};\n\n\n/**\n * @return {goog.ui.Menu} The menu that pops up.\n */\ngoog.ui.ComboBox.prototype.getMenu = function() {\n  return this.menu_;\n};\n\n\n/**\n * @return {Element} The input element.\n */\ngoog.ui.ComboBox.prototype.getInputElement = function() {\n  return this.input_;\n};\n\n\n/**\n * @return {goog.ui.LabelInput} A LabelInput control that manages the\n *     focus/blur state of the input box.\n */\ngoog.ui.ComboBox.prototype.getLabelInput = function() {\n  return this.labelInput_;\n};\n\n\n/**\n * @return {number} The number of visible items in the menu.\n * @private\n */\ngoog.ui.ComboBox.prototype.getNumberOfVisibleItems_ = function() {\n  if (this.visibleCount_ == -1) {\n    var count = 0;\n    for (var i = 0, n = this.menu_.getChildCount(); i < n; i++) {\n      var item = this.menu_.getChildAt(i);\n      if (!(item instanceof goog.ui.MenuSeparator) && item.isVisible()) {\n        count++;\n      }\n    }\n    this.visibleCount_ = count;\n  }\n\n  return this.visibleCount_;\n};\n\n\n/**\n * Sets the match function to be used when filtering the combo box menu.\n * @param {Function} matchFunction The match function to be used when filtering\n *     the combo box menu.\n */\ngoog.ui.ComboBox.prototype.setMatchFunction = function(matchFunction) {\n  this.matchFunction_ = matchFunction;\n};\n\n\n/**\n * @return {Function} The match function for the combox box.\n */\ngoog.ui.ComboBox.prototype.getMatchFunction = function() {\n  return this.matchFunction_;\n};\n\n\n/**\n * Sets the default text for the combo box.\n * @param {string} text The default text for the combo box.\n */\ngoog.ui.ComboBox.prototype.setDefaultText = function(text) {\n  this.defaultText_ = text;\n  if (this.labelInput_) {\n    this.labelInput_.setLabel(this.defaultText_);\n  }\n};\n\n\n/**\n * @return {string} text The default text for the combox box.\n */\ngoog.ui.ComboBox.prototype.getDefaultText = function() {\n  return this.defaultText_;\n};\n\n\n/**\n * Sets the field name for the combo box.\n * @param {string} fieldName The field name for the combo box.\n */\ngoog.ui.ComboBox.prototype.setFieldName = function(fieldName) {\n  this.fieldName_ = fieldName;\n};\n\n\n/**\n * @return {string} The field name for the combo box.\n */\ngoog.ui.ComboBox.prototype.getFieldName = function() {\n  return this.fieldName_;\n};\n\n\n/**\n * Set to true if a unicode inverted triangle should be displayed in the\n * dropdown button.\n * This option defaults to false for backwards compatibility.\n * @param {boolean} useDropdownArrow True to use the dropdown arrow.\n */\ngoog.ui.ComboBox.prototype.setUseDropdownArrow = function(useDropdownArrow) {\n  this.useDropdownArrow_ = !!useDropdownArrow;\n};\n\n\n/**\n * Sets the current value of the combo box.\n * @param {string} value The new value.\n */\ngoog.ui.ComboBox.prototype.setValue = function(value) {\n  if (this.labelInput_.getValue() != value) {\n    this.labelInput_.setValue(value);\n    this.handleInputChange_();\n  }\n};\n\n\n/**\n * @return {string} The current value of the combo box.\n */\ngoog.ui.ComboBox.prototype.getValue = function() {\n  return this.labelInput_.getValue();\n};\n\n\n/**\n * @return {string} HTML escaped token.\n */\ngoog.ui.ComboBox.prototype.getToken = function() {\n  // TODO(user): Remove HTML escaping and fix the existing calls.\n  return goog.string.htmlEscape(this.getTokenText_());\n};\n\n\n/**\n * @return {string} The token for the current cursor position in the\n *     input box, when multi-input is disabled it will be the full input value.\n * @private\n */\ngoog.ui.ComboBox.prototype.getTokenText_ = function() {\n  // TODO(user): Implement multi-input such that getToken returns a substring\n  // of the whole input delimited by commas.\n  return goog.string.trim(this.labelInput_.getValue().toLowerCase());\n};\n\n\n/**\n * @private\n */\ngoog.ui.ComboBox.prototype.setupMenu_ = function() {\n  var sm = this.menu_;\n  sm.setVisible(false);\n  sm.setAllowAutoFocus(false);\n  sm.setAllowHighlightDisabled(true);\n};\n\n\n/**\n * Shows the menu if it isn't already showing.  Also positions the menu\n * correctly, resets the menu item visibilities and highlights the relevant\n * item.\n * @param {boolean} showAll Whether to show all items, with the first matching\n *     item highlighted.\n * @private\n */\ngoog.ui.ComboBox.prototype.maybeShowMenu_ = function(showAll) {\n  var isVisible = this.menu_.isVisible();\n  var numVisibleItems = this.getNumberOfVisibleItems_();\n\n  if (isVisible && numVisibleItems == 0) {\n    goog.log.fine(this.logger_, 'no matching items, hiding');\n    this.hideMenu_();\n\n  } else if (!isVisible && numVisibleItems > 0) {\n    if (showAll) {\n      goog.log.fine(this.logger_, 'showing menu');\n      this.setItemVisibilityFromToken_('');\n      this.setItemHighlightFromToken_(this.getTokenText_());\n    }\n    // In Safari 2.0, when clicking on the combox box, the blur event is\n    // received after the click event that invokes this function. Since we want\n    // to cancel the dismissal after the blur event is processed, we have to\n    // wait for all event processing to happen.\n    goog.Timer.callOnce(this.clearDismissTimer_, 1, this);\n\n    this.showMenu_();\n  }\n\n  this.positionMenu();\n};\n\n\n/**\n * Positions the menu.\n * @protected\n */\ngoog.ui.ComboBox.prototype.positionMenu = function() {\n  if (this.menu_ && this.menu_.isVisible()) {\n    var position = new goog.positioning.MenuAnchoredPosition(\n        this.getElement(), goog.positioning.Corner.BOTTOM_START, true);\n    position.reposition(\n        this.menu_.getElement(), goog.positioning.Corner.TOP_START);\n  }\n};\n\n\n/**\n * Show the menu and add an active class to the combo box's element.\n * @private\n */\ngoog.ui.ComboBox.prototype.showMenu_ = function() {\n  this.menu_.setVisible(true);\n  goog.dom.classlist.add(\n      goog.asserts.assert(this.getElement()),\n      goog.getCssName('goog-combobox-active'));\n};\n\n\n/**\n * Hide the menu and remove the active class from the combo box's element.\n * @private\n */\ngoog.ui.ComboBox.prototype.hideMenu_ = function() {\n  this.menu_.setVisible(false);\n  goog.dom.classlist.remove(\n      goog.asserts.assert(this.getElement()),\n      goog.getCssName('goog-combobox-active'));\n};\n\n\n/**\n * Clears the dismiss timer if it's active.\n * @private\n */\ngoog.ui.ComboBox.prototype.clearDismissTimer_ = function() {\n  if (this.dismissTimer_) {\n    goog.Timer.clear(this.dismissTimer_);\n    this.dismissTimer_ = null;\n  }\n};\n\n\n/**\n * Event handler for when the combo box area has been clicked.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.ui.ComboBox.prototype.onComboMouseDown_ = function(e) {\n  // We only want this event on the element itself or the input or the button.\n  if (this.enabled_ &&\n      (e.target == this.getElement() || e.target == this.input_ ||\n       goog.dom.contains(this.button_, /** @type {Node} */ (e.target)))) {\n    if (this.menu_.isVisible()) {\n      goog.log.fine(this.logger_, 'Menu is visible, dismissing');\n      this.dismiss();\n    } else {\n      goog.log.fine(this.logger_, 'Opening dropdown');\n      this.maybeShowMenu_(true);\n      if (goog.userAgent.OPERA) {\n        // select() doesn't focus <input> elements in Opera.\n        this.input_.focus();\n      }\n      this.input_.select();\n      this.menu_.setMouseButtonPressed(true);\n      // Stop the click event from stealing focus\n      e.preventDefault();\n    }\n  }\n  // Stop the event from propagating outside of the combo box\n  e.stopPropagation();\n};\n\n\n/**\n * Event handler for when the document is clicked.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.ui.ComboBox.prototype.onDocClicked_ = function(e) {\n  if (!goog.dom.contains(\n          this.menu_.getElement(), /** @type {Node} */ (e.target))) {\n    this.dismiss();\n  }\n};\n\n\n/**\n * Handle the menu's select event.\n * @param {goog.events.Event} e The event.\n * @private\n */\ngoog.ui.ComboBox.prototype.onMenuSelected_ = function(e) {\n  var item = /** @type {!goog.ui.MenuItem} */ (e.target);\n  // Stop propagation of the original event and redispatch to allow the menu\n  // select to be cancelled at this level. i.e. if a menu item should cause\n  // some behavior such as a user prompt instead of assigning the caption as\n  // the value.\n  if (this.dispatchEvent(\n          new goog.ui.ItemEvent(\n              goog.ui.Component.EventType.ACTION, this, item))) {\n    var caption = item.getCaption();\n    goog.log.fine(\n        this.logger_, 'Menu selection: ' + caption + '. Dismissing menu');\n    if (this.labelInput_.getValue() != caption) {\n      this.labelInput_.setValue(caption);\n      this.dispatchEvent(goog.ui.Component.EventType.CHANGE);\n    }\n    this.dismiss();\n  }\n  e.stopPropagation();\n};\n\n\n/**\n * Event handler for when the input box looses focus -- hide the menu\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.ui.ComboBox.prototype.onInputBlur_ = function(e) {\n  this.clearDismissTimer_();\n  this.dismissTimer_ = goog.Timer.callOnce(\n      this.dismiss, goog.ui.ComboBox.BLUR_DISMISS_TIMER_MS, this);\n};\n\n\n/**\n * Handles keyboard events from the input box.  Returns true if the combo box\n * was able to handle the event, false otherwise.\n * @param {goog.events.KeyEvent} e Key event to handle.\n * @return {boolean} Whether the event was handled by the combo box.\n * @protected\n * @suppress {visibility} performActionInternal\n */\ngoog.ui.ComboBox.prototype.handleKeyEvent = function(e) {\n  var isMenuVisible = this.menu_.isVisible();\n\n  // Give the menu a chance to handle the event.\n  if (isMenuVisible && this.menu_.handleKeyEvent(e)) {\n    return true;\n  }\n\n  // The menu is either hidden or didn't handle the event.\n  var handled = false;\n  switch (e.keyCode) {\n    case goog.events.KeyCodes.ESC:\n      // If the menu is visible and the user hit Esc, dismiss the menu.\n      if (isMenuVisible) {\n        goog.log.fine(\n            this.logger_, 'Dismiss on Esc: ' + this.labelInput_.getValue());\n        this.dismiss();\n        handled = true;\n      }\n      break;\n    case goog.events.KeyCodes.TAB:\n      // If the menu is open and an option is highlighted, activate it.\n      if (isMenuVisible) {\n        var highlighted = this.menu_.getHighlighted();\n        if (highlighted) {\n          goog.log.fine(\n              this.logger_, 'Select on Tab: ' + this.labelInput_.getValue());\n          highlighted.performActionInternal(e);\n          handled = true;\n        }\n      }\n      break;\n    case goog.events.KeyCodes.UP:\n    case goog.events.KeyCodes.DOWN:\n      // If the menu is hidden and the user hit the up/down arrow, show it.\n      if (!isMenuVisible) {\n        goog.log.fine(this.logger_, 'Up/Down - maybe show menu');\n        this.maybeShowMenu_(true);\n        handled = true;\n      }\n      break;\n  }\n\n  if (handled) {\n    e.preventDefault();\n  }\n\n  return handled;\n};\n\n\n/**\n * Handles the content of the input box changing.\n * @param {goog.events.Event} e The INPUT event to handle.\n * @private\n */\ngoog.ui.ComboBox.prototype.onInputEvent_ = function(e) {\n  // If the key event is text-modifying, update the menu.\n  goog.log.fine(\n      this.logger_, 'Key is modifying: ' + this.labelInput_.getValue());\n  this.handleInputChange_();\n};\n\n\n/**\n * Handles the content of the input box changing, either because of user\n * interaction or programmatic changes.\n * @private\n */\ngoog.ui.ComboBox.prototype.handleInputChange_ = function() {\n  var token = this.getTokenText_();\n  this.setItemVisibilityFromToken_(token);\n  if (goog.dom.getActiveElement(this.getDomHelper().getDocument()) ==\n      this.input_) {\n    // Do not alter menu visibility unless the user focus is currently on the\n    // combobox (otherwise programmatic changes may cause the menu to become\n    // visible).\n    this.maybeShowMenu_(false);\n  }\n  var highlighted = this.menu_.getHighlighted();\n  if (token == '' || !highlighted || !highlighted.isVisible()) {\n    this.setItemHighlightFromToken_(token);\n  }\n  this.lastToken_ = token;\n  this.dispatchEvent(goog.ui.Component.EventType.CHANGE);\n};\n\n\n/**\n * Loops through all menu items setting their visibility according to a token.\n * @param {string} token The token.\n * @private\n */\ngoog.ui.ComboBox.prototype.setItemVisibilityFromToken_ = function(token) {\n  var isVisibleItem = false;\n  var count = 0;\n  var recheckHidden = !this.matchFunction_(token, this.lastToken_);\n\n  for (var i = 0, n = this.menu_.getChildCount(); i < n; i++) {\n    var item = this.menu_.getChildAt(i);\n    if (item instanceof goog.ui.MenuSeparator) {\n      // Ensure that separators are only shown if there is at least one visible\n      // item before them.\n      item.setVisible(isVisibleItem);\n      isVisibleItem = false;\n    } else if (item instanceof goog.ui.MenuItem) {\n      if (!item.isVisible() && !recheckHidden) continue;\n\n      var caption = item.getCaption();\n      var visible = this.isItemSticky_(item) ||\n          caption && this.matchFunction_(caption.toLowerCase(), token);\n      if (typeof item.setFormatFromToken == 'function') {\n        item.setFormatFromToken(token);\n      }\n      item.setVisible(!!visible);\n      isVisibleItem = visible || isVisibleItem;\n\n    } else {\n      // Assume all other items are correctly using their visibility.\n      isVisibleItem = item.isVisible() || isVisibleItem;\n    }\n\n    if (!(item instanceof goog.ui.MenuSeparator) && item.isVisible()) {\n      count++;\n    }\n  }\n\n  this.visibleCount_ = count;\n};\n\n\n/**\n * Highlights the first token that matches the given token.\n * @param {string} token The token.\n * @private\n */\ngoog.ui.ComboBox.prototype.setItemHighlightFromToken_ = function(token) {\n  if (token == '') {\n    this.menu_.setHighlightedIndex(-1);\n    return;\n  }\n\n  for (var i = 0, n = this.menu_.getChildCount(); i < n; i++) {\n    var item = this.menu_.getChildAt(i);\n    var caption = item.getCaption();\n    if (caption && this.matchFunction_(caption.toLowerCase(), token)) {\n      this.menu_.setHighlightedIndex(i);\n      if (item.setFormatFromToken) {\n        item.setFormatFromToken(token);\n      }\n      return;\n    }\n  }\n  this.menu_.setHighlightedIndex(-1);\n};\n\n\n/**\n * Returns true if the item has an isSticky method and the method returns true.\n * @param {goog.ui.MenuItem} item The item.\n * @return {boolean} Whether the item has an isSticky method and the method\n *     returns true.\n * @private\n */\ngoog.ui.ComboBox.prototype.isItemSticky_ = function(item) {\n  return typeof item.isSticky == 'function' && item.isSticky();\n};\n\n\n\n/**\n * Class for combo box items.\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to\n *     display as the content of the item (use to add icons or styling to\n *     menus).\n * @param {*=} opt_data Identifying data for the menu item.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional dom helper used for dom\n *     interactions.\n * @param {goog.ui.MenuItemRenderer=} opt_renderer Optional renderer.\n * @constructor\n * @extends {goog.ui.MenuItem}\n */\ngoog.ui.ComboBoxItem = function(\n    content, opt_data, opt_domHelper, opt_renderer) {\n  goog.ui.ComboBoxItem.base(\n      this, 'constructor', content, opt_data, opt_domHelper, opt_renderer);\n};\ngoog.inherits(goog.ui.ComboBoxItem, goog.ui.MenuItem);\ngoog.tagUnsealableClass(goog.ui.ComboBoxItem);\n\n\n// Register a decorator factory function for goog.ui.ComboBoxItems.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.getCssName('goog-combobox-item'), function() {\n      // ComboBoxItem defaults to using MenuItemRenderer.\n      return new goog.ui.ComboBoxItem(null);\n    });\n\n\n/**\n * Whether the menu item is sticky, non-sticky items will be hidden as the\n * user types.\n * @type {boolean}\n * @private\n */\ngoog.ui.ComboBoxItem.prototype.isSticky_ = false;\n\n\n/**\n * Sets the menu item to be sticky or not sticky.\n * @param {boolean} sticky Whether the menu item should be sticky.\n */\ngoog.ui.ComboBoxItem.prototype.setSticky = function(sticky) {\n  this.isSticky_ = sticky;\n};\n\n\n/**\n * @return {boolean} Whether the menu item is sticky.\n */\ngoog.ui.ComboBoxItem.prototype.isSticky = function() {\n  return this.isSticky_;\n};\n\n\n/**\n * Sets the format for a menu item based on a token, bolding the token.\n * @param {string} token The token.\n */\ngoog.ui.ComboBoxItem.prototype.setFormatFromToken = function(token) {\n  if (this.isEnabled()) {\n    var caption = this.getCaption();\n    var index = caption.toLowerCase().indexOf(token);\n    if (index >= 0) {\n      var domHelper = this.getDomHelper();\n      this.setContent([\n        domHelper.createTextNode(caption.substr(0, index)),\n        domHelper.createDom(\n            goog.dom.TagName.B, null, caption.substr(index, token.length)),\n        domHelper.createTextNode(caption.substr(index + token.length))\n      ]);\n    }\n  }\n};\n","^;",1579837703000,"^<",["^=",["^1L","^1>","^3L","^3O","~$goog.ui.MenuSeparator","^1M","^2L","^1P","^1U","^2G","^?","^3F","^[","^18","^1C","^82","^64","^83","^1F","~$goog.ui.ItemEvent","~$goog.positioning.MenuAnchoredPosition","^2W","^3H","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/combobox.js"],"^O",["^=",["~$goog.ui.ComboBoxItem","~$goog.ui.ComboBox"]],"^W",true,"^X",["^?","^3O","^1L","^1>","^1U","^12","^1M","^1C","^64","^3H","^2G","^18","^3L","^:1","^2L","^1F","^1P","^:0","^2W","^82","^83","^9[","^3F","^["]],["^ ","^3",[1579837703000],"^4","goog.net.xpc.nativemessagingtransport.js","^5",["^6","goog/net/xpc/nativemessagingtransport.js"],"^7","goog/net/xpc/nativemessagingtransport.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Contains the class which uses native messaging\n * facilities for cross domain communication.\n *\n */\n\n\ngoog.provide('goog.net.xpc.NativeMessagingTransport');\n\ngoog.require('goog.Timer');\ngoog.require('goog.asserts');\ngoog.require('goog.async.Deferred');\ngoog.require('goog.events');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.log');\ngoog.require('goog.net.xpc');\ngoog.require('goog.net.xpc.CrossPageChannelRole');\ngoog.require('goog.net.xpc.Transport');\ngoog.require('goog.net.xpc.TransportTypes');\n\n\n\n/**\n * The native messaging transport\n *\n * Uses document.postMessage() to send messages to other documents.\n * Receiving is done by listening on 'message'-events on the document.\n *\n * @param {goog.net.xpc.CrossPageChannel} channel The channel this\n *     transport belongs to.\n * @param {string} peerHostname The hostname (protocol, domain, and port) of the\n *     peer.\n * @param {goog.dom.DomHelper=} opt_domHelper The dom helper to use for\n *     finding the correct window/document.\n * @param {boolean=} opt_oneSidedHandshake If this is true, only the outer\n *     transport sends a SETUP message and expects a SETUP_ACK.  The inner\n *     transport goes connected when it receives the SETUP.\n * @param {number=} opt_protocolVersion Which version of its setup protocol the\n *     transport should use.  The default is '2'.\n * @constructor\n * @extends {goog.net.xpc.Transport}\n * @final\n */\ngoog.net.xpc.NativeMessagingTransport = function(\n    channel, peerHostname, opt_domHelper, opt_oneSidedHandshake,\n    opt_protocolVersion) {\n  goog.net.xpc.NativeMessagingTransport.base(\n      this, 'constructor', opt_domHelper);\n\n  /**\n   * The channel this transport belongs to.\n   * @type {goog.net.xpc.CrossPageChannel}\n   * @private\n   */\n  this.channel_ = channel;\n\n  /**\n   * Which version of the transport's protocol should be used.\n   * @type {number}\n   * @private\n   */\n  this.protocolVersion_ = opt_protocolVersion || 2;\n  goog.asserts.assert(this.protocolVersion_ >= 1);\n  goog.asserts.assert(this.protocolVersion_ <= 2);\n\n  /**\n   * The hostname of the peer. This parameterizes all calls to postMessage, and\n   * should contain the precise protocol, domain, and port of the peer window.\n   * @type {string}\n   * @private\n   */\n  this.peerHostname_ = peerHostname || '*';\n\n  /**\n   * The event handler.\n   * @type {!goog.events.EventHandler<!goog.net.xpc.NativeMessagingTransport>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  /**\n   * Timer for connection reattempts.\n   * @type {!goog.Timer}\n   * @private\n   */\n  this.maybeAttemptToConnectTimer_ = new goog.Timer(100, this.getWindow());\n\n  /**\n   * Whether one-sided handshakes are enabled.\n   * @type {boolean}\n   * @private\n   */\n  this.oneSidedHandshake_ = !!opt_oneSidedHandshake;\n\n  /**\n   * Fires once we've received our SETUP_ACK message.\n   * @type {!goog.async.Deferred}\n   * @private\n   */\n  this.setupAckReceived_ = new goog.async.Deferred();\n\n  /**\n   * Fires once we've sent our SETUP_ACK message.\n   * @type {!goog.async.Deferred}\n   * @private\n   */\n  this.setupAckSent_ = new goog.async.Deferred();\n\n  /**\n   * Fires once we're marked connected.\n   * @type {!goog.async.Deferred}\n   * @private\n   */\n  this.connected_ = new goog.async.Deferred();\n\n  /**\n   * The unique ID of this side of the connection. Used to determine when a peer\n   * is reloaded.\n   * @type {string}\n   * @private\n   */\n  this.endpointId_ = goog.net.xpc.getRandomString(10);\n\n  /**\n   * The unique ID of the peer. If we get a message from a peer with an ID we\n   * don't expect, we reset the connection.\n   * @type {?string}\n   * @private\n   */\n  this.peerEndpointId_ = null;\n\n  // We don't want to mark ourselves connected until we have sent whatever\n  // message will cause our counterpart in the other frame to also declare\n  // itself connected, if there is such a message.  Otherwise we risk a user\n  // message being sent in advance of that message, and it being discarded.\n  if (this.oneSidedHandshake_) {\n    if (this.channel_.getRole() == goog.net.xpc.CrossPageChannelRole.INNER) {\n      // One sided handshake, inner frame:\n      // SETUP_ACK must be received.\n      this.connected_.awaitDeferred(this.setupAckReceived_);\n    } else {\n      // One sided handshake, outer frame:\n      // SETUP_ACK must be sent.\n      this.connected_.awaitDeferred(this.setupAckSent_);\n    }\n  } else {\n    // Two sided handshake:\n    // SETUP_ACK has to have been received, and sent.\n    this.connected_.awaitDeferred(this.setupAckReceived_);\n    if (this.protocolVersion_ == 2) {\n      this.connected_.awaitDeferred(this.setupAckSent_);\n    }\n  }\n  this.connected_.addCallback(this.notifyConnected_, this);\n  this.connected_.callback(true);\n\n  this.eventHandler_.listen(\n      this.maybeAttemptToConnectTimer_, goog.Timer.TICK,\n      this.maybeAttemptToConnect_);\n\n  goog.log.info(\n      goog.net.xpc.logger, 'NativeMessagingTransport created.  ' +\n          'protocolVersion=' + this.protocolVersion_ + ', oneSidedHandshake=' +\n          this.oneSidedHandshake_ + ', role=' + this.channel_.getRole());\n};\ngoog.inherits(goog.net.xpc.NativeMessagingTransport, goog.net.xpc.Transport);\n\n\n/**\n * Length of the delay in milliseconds between the channel being connected and\n * the connection callback being called, in cases where coverage of timing flaws\n * is required.\n * @type {number}\n * @private\n */\ngoog.net.xpc.NativeMessagingTransport.CONNECTION_DELAY_MS_ = 200;\n\n\n/**\n * Current determination of peer's protocol version, or null for unknown.\n * @type {?number}\n * @private\n */\ngoog.net.xpc.NativeMessagingTransport.prototype.peerProtocolVersion_ = null;\n\n\n/**\n * Flag indicating if this instance of the transport has been initialized.\n * @type {boolean}\n * @private\n */\ngoog.net.xpc.NativeMessagingTransport.prototype.initialized_ = false;\n\n\n/**\n * The transport type.\n * @type {number}\n * @override\n */\ngoog.net.xpc.NativeMessagingTransport.prototype.transportType =\n    goog.net.xpc.TransportTypes.NATIVE_MESSAGING;\n\n\n/**\n * The delimiter used for transport service messages.\n * @type {string}\n * @private\n */\ngoog.net.xpc.NativeMessagingTransport.MESSAGE_DELIMITER_ = ',';\n\n\n/**\n * Tracks the number of NativeMessagingTransport channels that have been\n * initialized but not disposed yet in a map keyed by the UID of the window\n * object.  This allows for multiple windows to be initiallized and listening\n * for messages.\n * @type {Object<number>}\n * @private\n */\ngoog.net.xpc.NativeMessagingTransport.activeCount_ = {};\n\n\n/**\n * Id of a timer user during postMessage sends.\n * @type {number}\n * @private\n */\ngoog.net.xpc.NativeMessagingTransport.prototype.sendTimerId_ = 0;\n\n\n/**\n * Checks whether the peer transport protocol version could be as indicated.\n * @param {number} version The version to check for.\n * @return {boolean} Whether the peer transport protocol version is as\n *     indicated, or null.\n * @private\n */\ngoog.net.xpc.NativeMessagingTransport.prototype.couldPeerVersionBe_ = function(\n    version) {\n  return this.peerProtocolVersion_ == null ||\n      this.peerProtocolVersion_ == version;\n};\n\n\n/**\n * Initializes this transport. Registers a listener for 'message'-events\n * on the document.\n * @param {Window} listenWindow The window to listen to events on.\n * @private\n */\ngoog.net.xpc.NativeMessagingTransport.initialize_ = function(listenWindow) {\n  var uid = goog.getUid(listenWindow);\n  var value = goog.net.xpc.NativeMessagingTransport.activeCount_[uid];\n  if (typeof value !== 'number') {\n    value = 0;\n  }\n  if (value == 0) {\n    // Listen for message-events. These are fired on window in FF3 and on\n    // document in Opera.\n    goog.events.listen(\n        listenWindow.postMessage ? listenWindow : listenWindow.document,\n        'message', goog.net.xpc.NativeMessagingTransport.messageReceived_,\n        false, goog.net.xpc.NativeMessagingTransport);\n  }\n  goog.net.xpc.NativeMessagingTransport.activeCount_[uid] = value + 1;\n};\n\n\n/**\n * Processes an incoming message-event.\n * @param {goog.events.BrowserEvent} msgEvt The message event.\n * @return {boolean} True if message was successfully delivered to a channel.\n * @private\n */\ngoog.net.xpc.NativeMessagingTransport.messageReceived_ = function(msgEvt) {\n  var data = msgEvt.getBrowserEvent().data;\n\n  if (typeof data !== 'string') {\n    return false;\n  }\n\n  var headDelim = data.indexOf('|');\n  var serviceDelim = data.indexOf(':');\n\n  // make sure we got something reasonable\n  if (headDelim == -1 || serviceDelim == -1) {\n    return false;\n  }\n\n  var channelName = data.substring(0, headDelim);\n  var service = data.substring(headDelim + 1, serviceDelim);\n  var payload = data.substring(serviceDelim + 1);\n\n  goog.log.fine(\n      goog.net.xpc.logger, 'messageReceived: channel=' + channelName +\n          ', service=' + service + ', payload=' + payload);\n\n  // Attempt to deliver message to the channel. Keep in mind that it may not\n  // exist for several reasons, including but not limited to:\n  //  - a malformed message\n  //  - the channel simply has not been created\n  //  - channel was created in a different namespace\n  //  - message was sent to the wrong window\n  //  - channel has become stale (e.g. caching iframes and back clicks)\n  var channel = goog.net.xpc.channels[channelName];\n  if (channel) {\n    channel.xpcDeliver(\n        service, payload,\n        /** @type {!MessageEvent} */ (msgEvt.getBrowserEvent()).origin);\n    return true;\n  }\n\n  var transportMessageType =\n      goog.net.xpc.NativeMessagingTransport.parseTransportPayload_(payload)[0];\n\n  // Check if there are any stale channel names that can be updated.\n  for (var staleChannelName in goog.net.xpc.channels) {\n    var staleChannel = goog.net.xpc.channels[staleChannelName];\n    if (staleChannel.getRole() == goog.net.xpc.CrossPageChannelRole.INNER &&\n        !staleChannel.isConnected() &&\n        service == goog.net.xpc.TRANSPORT_SERVICE_ &&\n        (transportMessageType == goog.net.xpc.SETUP ||\n         transportMessageType == goog.net.xpc.SETUP_NTPV2) &&\n        staleChannel.isMessageOriginAcceptable(\n            msgEvt.getBrowserEvent().origin)) {\n      // Inner peer received SETUP message but channel names did not match.\n      // Start using the channel name sent from outer peer. The channel name\n      // of the inner peer can easily become out of date, as iframe's and their\n      // JS state get cached in many browsers upon page reload or history\n      // navigation (particularly Firefox 1.5+). We can trust the outer peer,\n      // since we only accept postMessage messages from the same hostname that\n      // originally setup the channel.\n      staleChannel.updateChannelNameAndCatalog(channelName);\n      staleChannel.xpcDeliver(service, payload);\n      return true;\n    }\n  }\n\n  // Failed to find a channel to deliver this message to, so simply ignore it.\n  goog.log.info(goog.net.xpc.logger, 'channel name mismatch; message ignored\"');\n  return false;\n};\n\n\n/**\n * Handles transport service messages.\n * @param {string} payload The message content.\n * @override\n */\ngoog.net.xpc.NativeMessagingTransport.prototype.transportServiceHandler =\n    function(payload) {\n  var transportParts =\n      goog.net.xpc.NativeMessagingTransport.parseTransportPayload_(payload);\n  var transportMessageType = transportParts[0];\n  var peerEndpointId = transportParts[1];\n  switch (transportMessageType) {\n    case goog.net.xpc.SETUP_ACK_:\n      this.setPeerProtocolVersion_(1);\n      if (!this.setupAckReceived_.hasFired()) {\n        this.setupAckReceived_.callback(true);\n      }\n      break;\n    case goog.net.xpc.SETUP_ACK_NTPV2:\n      if (this.protocolVersion_ == 2) {\n        this.setPeerProtocolVersion_(2);\n        if (!this.setupAckReceived_.hasFired()) {\n          this.setupAckReceived_.callback(true);\n        }\n      }\n      break;\n    case goog.net.xpc.SETUP:\n      this.setPeerProtocolVersion_(1);\n      this.sendSetupAckMessage_(1);\n      break;\n    case goog.net.xpc.SETUP_NTPV2:\n      if (this.protocolVersion_ == 2) {\n        var prevPeerProtocolVersion = this.peerProtocolVersion_;\n        this.setPeerProtocolVersion_(2);\n        this.sendSetupAckMessage_(2);\n        if ((prevPeerProtocolVersion == 1 || this.peerEndpointId_ != null) &&\n            this.peerEndpointId_ != peerEndpointId) {\n          // Send a new SETUP message since the peer has been replaced.\n          goog.log.info(\n              goog.net.xpc.logger,\n              'Sending SETUP and changing peer ID to: ' + peerEndpointId);\n          this.sendSetupMessage_();\n        }\n        this.peerEndpointId_ = peerEndpointId;\n      }\n      break;\n  }\n};\n\n\n/**\n * Sends a SETUP transport service message of the correct protocol number for\n * our current situation.\n * @private\n */\ngoog.net.xpc.NativeMessagingTransport.prototype.sendSetupMessage_ = function() {\n  // 'real' (legacy) v1 transports don't know about there being v2 ones out\n  // there, and we shouldn't either.\n  goog.asserts.assert(\n      !(this.protocolVersion_ == 1 && this.peerProtocolVersion_ == 2));\n\n  if (this.protocolVersion_ == 2 && this.couldPeerVersionBe_(2)) {\n    var payload = goog.net.xpc.SETUP_NTPV2;\n    payload += goog.net.xpc.NativeMessagingTransport.MESSAGE_DELIMITER_;\n    payload += this.endpointId_;\n    this.send(goog.net.xpc.TRANSPORT_SERVICE_, payload);\n  }\n\n  // For backward compatibility reasons, the V1 SETUP message can be sent by\n  // both V1 and V2 transports.  Once a V2 transport has 'heard' another V2\n  // transport it starts ignoring V1 messages, so the V2 message must be sent\n  // first.\n  if (this.couldPeerVersionBe_(1)) {\n    this.send(goog.net.xpc.TRANSPORT_SERVICE_, goog.net.xpc.SETUP);\n  }\n};\n\n\n/**\n * Sends a SETUP_ACK transport service message of the correct protocol number\n * for our current situation.\n * @param {number} protocolVersion The protocol version of the SETUP message\n *     which gave rise to this ack message.\n * @private\n */\ngoog.net.xpc.NativeMessagingTransport.prototype.sendSetupAckMessage_ = function(\n    protocolVersion) {\n  goog.asserts.assert(\n      this.protocolVersion_ != 1 || protocolVersion != 2,\n      'Shouldn\\'t try to send a v2 setup ack in v1 mode.');\n  if (this.protocolVersion_ == 2 && this.couldPeerVersionBe_(2) &&\n      protocolVersion == 2) {\n    this.send(goog.net.xpc.TRANSPORT_SERVICE_, goog.net.xpc.SETUP_ACK_NTPV2);\n  } else if (this.couldPeerVersionBe_(1) && protocolVersion == 1) {\n    this.send(goog.net.xpc.TRANSPORT_SERVICE_, goog.net.xpc.SETUP_ACK_);\n  } else {\n    return;\n  }\n\n  if (!this.setupAckSent_.hasFired()) {\n    this.setupAckSent_.callback(true);\n  }\n};\n\n\n/**\n * Attempts to set the peer protocol number.  Downgrades from 2 to 1 are not\n * permitted.\n * @param {number} version The new protocol number.\n * @private\n */\ngoog.net.xpc.NativeMessagingTransport.prototype.setPeerProtocolVersion_ =\n    function(version) {\n  if (version > this.peerProtocolVersion_) {\n    this.peerProtocolVersion_ = version;\n  }\n  if (this.peerProtocolVersion_ == 1) {\n    if (!this.setupAckSent_.hasFired() && !this.oneSidedHandshake_) {\n      this.setupAckSent_.callback(true);\n    }\n    this.peerEndpointId_ = null;\n  }\n};\n\n\n/**\n * Connects this transport.\n * @override\n */\ngoog.net.xpc.NativeMessagingTransport.prototype.connect = function() {\n  goog.net.xpc.NativeMessagingTransport.initialize_(this.getWindow());\n  this.initialized_ = true;\n  this.maybeAttemptToConnect_();\n};\n\n\n/**\n * Connects to other peer. In the case of the outer peer, the setup messages are\n * likely sent before the inner peer is ready to receive them. Therefore, this\n * function will continue trying to send the SETUP message until the inner peer\n * responds. In the case of the inner peer, it will occasionally have its\n * channel name fall out of sync with the outer peer, particularly during\n * soft-reloads and history navigations.\n * @private\n */\ngoog.net.xpc.NativeMessagingTransport.prototype.maybeAttemptToConnect_ =\n    function() {\n  // In a one-sided handshake, the outer frame does not send a SETUP message,\n  // but the inner frame does.\n  var outerFrame =\n      this.channel_.getRole() == goog.net.xpc.CrossPageChannelRole.OUTER;\n  if ((this.oneSidedHandshake_ && outerFrame) || this.channel_.isConnected() ||\n      this.isDisposed()) {\n    this.maybeAttemptToConnectTimer_.stop();\n    return;\n  }\n  this.maybeAttemptToConnectTimer_.start();\n  this.sendSetupMessage_();\n};\n\n\n/**\n * Sends a message.\n * @param {string} service The name off the service the message is to be\n * delivered to.\n * @param {string} payload The message content.\n * @override\n */\ngoog.net.xpc.NativeMessagingTransport.prototype.send = function(\n    service, payload) {\n  var win = this.channel_.getPeerWindowObject();\n  if (!win) {\n    goog.log.fine(goog.net.xpc.logger, 'send(): window not ready');\n    return;\n  }\n\n  this.send = function(service, payload) {\n    // In IE8 (and perhaps elsewhere), it seems like postMessage is sometimes\n    // implemented as a synchronous call.  That is, calling it synchronously\n    // calls whatever listeners it has, and control is not returned to the\n    // calling thread until those listeners are run.  This produces different\n    // ordering to all other browsers, and breaks this protocol.  This timer\n    // callback is introduced to produce standard behavior across all browsers.\n    var transport = this;\n    var channelName = this.channel_.name;\n    var sendFunctor = function() {\n      transport.sendTimerId_ = 0;\n\n      try {\n        // postMessage is a method of the window object, except in some\n        // versions of Opera, where it is a method of the document object.  It\n        // also seems that the appearance of postMessage on the peer window\n        // object can sometimes be delayed.\n        var obj = win.postMessage ? win : win.document;\n        if (!obj.postMessage) {\n          goog.log.warning(\n              goog.net.xpc.logger, 'Peer window had no postMessage function.');\n          return;\n        }\n\n        obj.postMessage(\n            channelName + '|' + service + ':' + payload,\n            transport.peerHostname_);\n        goog.log.fine(\n            goog.net.xpc.logger, 'send(): service=' + service + ' payload=' +\n                payload + ' to hostname=' + transport.peerHostname_);\n      } catch (error) {\n        // There is some evidence (not totally convincing) that postMessage can\n        // be missing or throw errors during a narrow timing window during\n        // startup.  This protects against that.\n        goog.log.warning(\n            goog.net.xpc.logger, 'Error performing postMessage, ignoring.',\n            error);\n      }\n    };\n    this.sendTimerId_ = goog.Timer.callOnce(sendFunctor, 0);\n  };\n  this.send(service, payload);\n};\n\n\n/**\n * Notify the channel that this transport is connected.  If either transport is\n * protocol v1, a short delay is required to paper over timing vulnerabilities\n * in that protocol version.\n * @private\n */\ngoog.net.xpc.NativeMessagingTransport.prototype.notifyConnected_ = function() {\n  var delay = (this.protocolVersion_ == 1 || this.peerProtocolVersion_ == 1) ?\n      goog.net.xpc.NativeMessagingTransport.CONNECTION_DELAY_MS_ :\n      undefined;\n  this.channel_.notifyConnected(delay);\n};\n\n\n/** @override */\ngoog.net.xpc.NativeMessagingTransport.prototype.disposeInternal = function() {\n  if (this.initialized_) {\n    var listenWindow = this.getWindow();\n    var uid = goog.getUid(listenWindow);\n    var value = goog.net.xpc.NativeMessagingTransport.activeCount_[uid];\n    goog.net.xpc.NativeMessagingTransport.activeCount_[uid] = value - 1;\n    if (value == 1) {\n      goog.events.unlisten(\n          listenWindow.postMessage ? listenWindow : listenWindow.document,\n          'message', goog.net.xpc.NativeMessagingTransport.messageReceived_,\n          false, goog.net.xpc.NativeMessagingTransport);\n    }\n  }\n\n  if (this.sendTimerId_) {\n    goog.Timer.clear(this.sendTimerId_);\n    this.sendTimerId_ = 0;\n  }\n\n  goog.dispose(this.eventHandler_);\n  delete this.eventHandler_;\n\n  goog.dispose(this.maybeAttemptToConnectTimer_);\n  delete this.maybeAttemptToConnectTimer_;\n\n  this.setupAckReceived_.cancel();\n  delete this.setupAckReceived_;\n  this.setupAckSent_.cancel();\n  delete this.setupAckSent_;\n  this.connected_.cancel();\n  delete this.connected_;\n\n  // Cleaning up this.send as it is an instance method, created in\n  // goog.net.xpc.NativeMessagingTransport.prototype.send and has a closure over\n  // this.channel_.peerWindowObject_.\n  delete this.send;\n\n  goog.net.xpc.NativeMessagingTransport.base(this, 'disposeInternal');\n};\n\n\n/**\n * Parse a transport service payload message.  For v1, it is simply expected to\n * be 'SETUP' or 'SETUP_ACK'.  For v2, an example setup message is\n * 'SETUP_NTPV2,abc123', where the second part is the endpoint id.  The v2 setup\n * ack message is simply 'SETUP_ACK_NTPV2'.\n * @param {string} payload The payload.\n * @return {!Array<?string>} An array with the message type as the first member\n *     and the endpoint id as the second, if one was sent, or null otherwise.\n * @private\n */\ngoog.net.xpc.NativeMessagingTransport.parseTransportPayload_ = function(\n    payload) {\n  var transportParts = /** @type {!Array<?string>} */ (\n      payload.split(goog.net.xpc.NativeMessagingTransport.MESSAGE_DELIMITER_));\n  transportParts[1] = transportParts[1] || null;\n  return transportParts;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^53","^54","^1T","^3O","^57","^?","^18","^4N","^5<","^1<"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/xpc/nativemessagingtransport.js"],"^O",["^=",["^55"]],"^W",true,"^X",["^?","^3O","^1L","^5<","^1<","^1T","^18","^53","^54","^4N","^57"]],["^ ","^3",[1579837703000],"^4","goog.ui.modalariavisibilityhelper.js","^5",["^6","goog/ui/modalariavisibilityhelper.js"],"^7","goog/ui/modalariavisibilityhelper.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Helper object used by modal elements to control aria\n * visibility of the rest of the page.\n */\n\ngoog.provide('goog.ui.ModalAriaVisibilityHelper');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.State');\n\n\n\n/**\n * Helper object to control aria visibility of the rest of the page (background)\n * for a given element. Example usage is to restrict screenreader focus to\n * a modal popup while it is visible.\n *\n * WARNING: This will work only if the element is rendered directly in the\n * 'body' element.\n *\n * @param {!Element} element The given element.\n * @param {!goog.dom.DomHelper} domHelper DomHelper for the page.\n * @constructor\n */\ngoog.ui.ModalAriaVisibilityHelper = function(element, domHelper) {\n  /**\n   * @private {!Element}\n   */\n  this.element_ = element;\n\n  /**\n   * @private {!goog.dom.DomHelper}\n   */\n  this.dom_ = domHelper;\n};\n\n\n/**\n * The elements set to aria-hidden when the popup was made visible.\n * @type {Array<!Element>}\n * @private\n */\ngoog.ui.ModalAriaVisibilityHelper.prototype.hiddenElements_;\n\n\n/**\n * Sets aria-hidden on the rest of the page to restrict screen reader focus.\n * Top-level elements with an explicit aria-hidden state are not altered.\n * @param {boolean} hide Whether to hide or show the rest of the page.\n */\ngoog.ui.ModalAriaVisibilityHelper.prototype.setBackgroundVisibility = function(\n    hide) {\n  if (hide) {\n    if (!this.hiddenElements_) {\n      this.hiddenElements_ = [];\n    }\n    var topLevelChildren = this.dom_.getChildren(this.dom_.getDocument().body);\n    for (var i = 0; i < topLevelChildren.length; i++) {\n      var child = topLevelChildren[i];\n      if (child != this.element_ &&\n          !goog.a11y.aria.getState(child, goog.a11y.aria.State.HIDDEN)) {\n        goog.a11y.aria.setState(child, goog.a11y.aria.State.HIDDEN, true);\n        this.hiddenElements_.push(child);\n      }\n    }\n  } else if (this.hiddenElements_) {\n    for (var i = 0; i < this.hiddenElements_.length; i++) {\n      goog.a11y.aria.removeState(\n          this.hiddenElements_[i], goog.a11y.aria.State.HIDDEN);\n    }\n    this.hiddenElements_ = null;\n  }\n};\n","^;",1579837703000,"^<",["^=",["^1O","^?","^3G"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/modalariavisibilityhelper.js"],"^O",["^=",["~$goog.ui.ModalAriaVisibilityHelper"]],"^W",true,"^X",["^?","^1O","^3G"]],["^ ","^3",[1579837703000],"^4","goog.proto2.test.pb.js","^5",["^6","goog/proto2/test.pb.js"],"^7","goog/proto2/test.pb.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All other code copyright its respective owners(s).\n\n/**\n * @fileoverview Generated Protocol Buffer code for file\n * closure/goog/proto2/test.proto.\n */\n\ngoog.provide('proto2.TestAllTypes');\ngoog.provide('proto2.TestAllTypes.NestedEnum');\ngoog.provide('proto2.TestAllTypes.NestedMessage');\ngoog.provide('proto2.TestAllTypes.OptionalGroup');\ngoog.provide('proto2.TestAllTypes.RepeatedGroup');\ngoog.provide('proto2.TestDefaultChild');\ngoog.provide('proto2.TestDefaultParent');\ngoog.setTestOnly('proto2.TestAllTypes');\n\ngoog.require('goog.proto2.Message');\n\n\n\n/**\n * Message TestAllTypes.\n * @constructor\n * @extends {goog.proto2.Message}\n * @final\n */\nproto2.TestAllTypes = function() {\n  goog.proto2.Message.call(this);\n};\ngoog.inherits(proto2.TestAllTypes, goog.proto2.Message);\n\n\n/**\n * Descriptor for this message, deserialized lazily in getDescriptor().\n * @private {?goog.proto2.Descriptor}\n */\nproto2.TestAllTypes.descriptor_ = null;\n\n\n/**\n * Overrides {@link goog.proto2.Message#clone} to specify its exact return type.\n * @return {!proto2.TestAllTypes} The cloned message.\n * @override\n */\nproto2.TestAllTypes.prototype.clone;\n\n\n/**\n * Gets the value of the optional_int32 field.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalInt32 = function() {\n  return /** @type {?number} */ (this.get$Value(1));\n};\n\n\n/**\n * Gets the value of the optional_int32 field or the default value if not set.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalInt32OrDefault = function() {\n  return /** @type {number} */ (this.get$ValueOrDefault(1));\n};\n\n\n/**\n * Sets the value of the optional_int32 field.\n * @param {number} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalInt32 = function(value) {\n  this.set$Value(1, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_int32 field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalInt32 = function() {\n  return this.has$Value(1);\n};\n\n\n/**\n * @return {number} The number of values in the optional_int32 field.\n */\nproto2.TestAllTypes.prototype.optionalInt32Count = function() {\n  return this.count$Values(1);\n};\n\n\n/**\n * Clears the values in the optional_int32 field.\n */\nproto2.TestAllTypes.prototype.clearOptionalInt32 = function() {\n  this.clear$Field(1);\n};\n\n\n/**\n * Gets the value of the optional_int64 field.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalInt64 = function() {\n  return /** @type {?string} */ (this.get$Value(2));\n};\n\n\n/**\n * Gets the value of the optional_int64 field or the default value if not set.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalInt64OrDefault = function() {\n  return /** @type {string} */ (this.get$ValueOrDefault(2));\n};\n\n\n/**\n * Sets the value of the optional_int64 field.\n * @param {string} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalInt64 = function(value) {\n  this.set$Value(2, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_int64 field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalInt64 = function() {\n  return this.has$Value(2);\n};\n\n\n/**\n * @return {number} The number of values in the optional_int64 field.\n */\nproto2.TestAllTypes.prototype.optionalInt64Count = function() {\n  return this.count$Values(2);\n};\n\n\n/**\n * Clears the values in the optional_int64 field.\n */\nproto2.TestAllTypes.prototype.clearOptionalInt64 = function() {\n  this.clear$Field(2);\n};\n\n\n/**\n * Gets the value of the optional_uint32 field.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalUint32 = function() {\n  return /** @type {?number} */ (this.get$Value(3));\n};\n\n\n/**\n * Gets the value of the optional_uint32 field or the default value if not set.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalUint32OrDefault = function() {\n  return /** @type {number} */ (this.get$ValueOrDefault(3));\n};\n\n\n/**\n * Sets the value of the optional_uint32 field.\n * @param {number} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalUint32 = function(value) {\n  this.set$Value(3, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_uint32 field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalUint32 = function() {\n  return this.has$Value(3);\n};\n\n\n/**\n * @return {number} The number of values in the optional_uint32 field.\n */\nproto2.TestAllTypes.prototype.optionalUint32Count = function() {\n  return this.count$Values(3);\n};\n\n\n/**\n * Clears the values in the optional_uint32 field.\n */\nproto2.TestAllTypes.prototype.clearOptionalUint32 = function() {\n  this.clear$Field(3);\n};\n\n\n/**\n * Gets the value of the optional_uint64 field.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalUint64 = function() {\n  return /** @type {?string} */ (this.get$Value(4));\n};\n\n\n/**\n * Gets the value of the optional_uint64 field or the default value if not set.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalUint64OrDefault = function() {\n  return /** @type {string} */ (this.get$ValueOrDefault(4));\n};\n\n\n/**\n * Sets the value of the optional_uint64 field.\n * @param {string} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalUint64 = function(value) {\n  this.set$Value(4, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_uint64 field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalUint64 = function() {\n  return this.has$Value(4);\n};\n\n\n/**\n * @return {number} The number of values in the optional_uint64 field.\n */\nproto2.TestAllTypes.prototype.optionalUint64Count = function() {\n  return this.count$Values(4);\n};\n\n\n/**\n * Clears the values in the optional_uint64 field.\n */\nproto2.TestAllTypes.prototype.clearOptionalUint64 = function() {\n  this.clear$Field(4);\n};\n\n\n/**\n * Gets the value of the optional_sint32 field.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalSint32 = function() {\n  return /** @type {?number} */ (this.get$Value(5));\n};\n\n\n/**\n * Gets the value of the optional_sint32 field or the default value if not set.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalSint32OrDefault = function() {\n  return /** @type {number} */ (this.get$ValueOrDefault(5));\n};\n\n\n/**\n * Sets the value of the optional_sint32 field.\n * @param {number} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalSint32 = function(value) {\n  this.set$Value(5, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_sint32 field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalSint32 = function() {\n  return this.has$Value(5);\n};\n\n\n/**\n * @return {number} The number of values in the optional_sint32 field.\n */\nproto2.TestAllTypes.prototype.optionalSint32Count = function() {\n  return this.count$Values(5);\n};\n\n\n/**\n * Clears the values in the optional_sint32 field.\n */\nproto2.TestAllTypes.prototype.clearOptionalSint32 = function() {\n  this.clear$Field(5);\n};\n\n\n/**\n * Gets the value of the optional_sint64 field.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalSint64 = function() {\n  return /** @type {?string} */ (this.get$Value(6));\n};\n\n\n/**\n * Gets the value of the optional_sint64 field or the default value if not set.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalSint64OrDefault = function() {\n  return /** @type {string} */ (this.get$ValueOrDefault(6));\n};\n\n\n/**\n * Sets the value of the optional_sint64 field.\n * @param {string} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalSint64 = function(value) {\n  this.set$Value(6, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_sint64 field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalSint64 = function() {\n  return this.has$Value(6);\n};\n\n\n/**\n * @return {number} The number of values in the optional_sint64 field.\n */\nproto2.TestAllTypes.prototype.optionalSint64Count = function() {\n  return this.count$Values(6);\n};\n\n\n/**\n * Clears the values in the optional_sint64 field.\n */\nproto2.TestAllTypes.prototype.clearOptionalSint64 = function() {\n  this.clear$Field(6);\n};\n\n\n/**\n * Gets the value of the optional_fixed32 field.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalFixed32 = function() {\n  return /** @type {?number} */ (this.get$Value(7));\n};\n\n\n/**\n * Gets the value of the optional_fixed32 field or the default value if not set.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalFixed32OrDefault = function() {\n  return /** @type {number} */ (this.get$ValueOrDefault(7));\n};\n\n\n/**\n * Sets the value of the optional_fixed32 field.\n * @param {number} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalFixed32 = function(value) {\n  this.set$Value(7, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_fixed32 field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalFixed32 = function() {\n  return this.has$Value(7);\n};\n\n\n/**\n * @return {number} The number of values in the optional_fixed32 field.\n */\nproto2.TestAllTypes.prototype.optionalFixed32Count = function() {\n  return this.count$Values(7);\n};\n\n\n/**\n * Clears the values in the optional_fixed32 field.\n */\nproto2.TestAllTypes.prototype.clearOptionalFixed32 = function() {\n  this.clear$Field(7);\n};\n\n\n/**\n * Gets the value of the optional_fixed64 field.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalFixed64 = function() {\n  return /** @type {?string} */ (this.get$Value(8));\n};\n\n\n/**\n * Gets the value of the optional_fixed64 field or the default value if not set.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalFixed64OrDefault = function() {\n  return /** @type {string} */ (this.get$ValueOrDefault(8));\n};\n\n\n/**\n * Sets the value of the optional_fixed64 field.\n * @param {string} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalFixed64 = function(value) {\n  this.set$Value(8, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_fixed64 field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalFixed64 = function() {\n  return this.has$Value(8);\n};\n\n\n/**\n * @return {number} The number of values in the optional_fixed64 field.\n */\nproto2.TestAllTypes.prototype.optionalFixed64Count = function() {\n  return this.count$Values(8);\n};\n\n\n/**\n * Clears the values in the optional_fixed64 field.\n */\nproto2.TestAllTypes.prototype.clearOptionalFixed64 = function() {\n  this.clear$Field(8);\n};\n\n\n/**\n * Gets the value of the optional_sfixed32 field.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalSfixed32 = function() {\n  return /** @type {?number} */ (this.get$Value(9));\n};\n\n\n/**\n * Gets the value of the optional_sfixed32 field or the default value if not set.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalSfixed32OrDefault = function() {\n  return /** @type {number} */ (this.get$ValueOrDefault(9));\n};\n\n\n/**\n * Sets the value of the optional_sfixed32 field.\n * @param {number} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalSfixed32 = function(value) {\n  this.set$Value(9, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_sfixed32 field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalSfixed32 = function() {\n  return this.has$Value(9);\n};\n\n\n/**\n * @return {number} The number of values in the optional_sfixed32 field.\n */\nproto2.TestAllTypes.prototype.optionalSfixed32Count = function() {\n  return this.count$Values(9);\n};\n\n\n/**\n * Clears the values in the optional_sfixed32 field.\n */\nproto2.TestAllTypes.prototype.clearOptionalSfixed32 = function() {\n  this.clear$Field(9);\n};\n\n\n/**\n * Gets the value of the optional_sfixed64 field.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalSfixed64 = function() {\n  return /** @type {?string} */ (this.get$Value(10));\n};\n\n\n/**\n * Gets the value of the optional_sfixed64 field or the default value if not set.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalSfixed64OrDefault = function() {\n  return /** @type {string} */ (this.get$ValueOrDefault(10));\n};\n\n\n/**\n * Sets the value of the optional_sfixed64 field.\n * @param {string} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalSfixed64 = function(value) {\n  this.set$Value(10, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_sfixed64 field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalSfixed64 = function() {\n  return this.has$Value(10);\n};\n\n\n/**\n * @return {number} The number of values in the optional_sfixed64 field.\n */\nproto2.TestAllTypes.prototype.optionalSfixed64Count = function() {\n  return this.count$Values(10);\n};\n\n\n/**\n * Clears the values in the optional_sfixed64 field.\n */\nproto2.TestAllTypes.prototype.clearOptionalSfixed64 = function() {\n  this.clear$Field(10);\n};\n\n\n/**\n * Gets the value of the optional_float field.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalFloat = function() {\n  return /** @type {?number} */ (this.get$Value(11));\n};\n\n\n/**\n * Gets the value of the optional_float field or the default value if not set.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalFloatOrDefault = function() {\n  return /** @type {number} */ (this.get$ValueOrDefault(11));\n};\n\n\n/**\n * Sets the value of the optional_float field.\n * @param {number} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalFloat = function(value) {\n  this.set$Value(11, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_float field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalFloat = function() {\n  return this.has$Value(11);\n};\n\n\n/**\n * @return {number} The number of values in the optional_float field.\n */\nproto2.TestAllTypes.prototype.optionalFloatCount = function() {\n  return this.count$Values(11);\n};\n\n\n/**\n * Clears the values in the optional_float field.\n */\nproto2.TestAllTypes.prototype.clearOptionalFloat = function() {\n  this.clear$Field(11);\n};\n\n\n/**\n * Gets the value of the optional_double field.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalDouble = function() {\n  return /** @type {?number} */ (this.get$Value(12));\n};\n\n\n/**\n * Gets the value of the optional_double field or the default value if not set.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalDoubleOrDefault = function() {\n  return /** @type {number} */ (this.get$ValueOrDefault(12));\n};\n\n\n/**\n * Sets the value of the optional_double field.\n * @param {number} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalDouble = function(value) {\n  this.set$Value(12, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_double field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalDouble = function() {\n  return this.has$Value(12);\n};\n\n\n/**\n * @return {number} The number of values in the optional_double field.\n */\nproto2.TestAllTypes.prototype.optionalDoubleCount = function() {\n  return this.count$Values(12);\n};\n\n\n/**\n * Clears the values in the optional_double field.\n */\nproto2.TestAllTypes.prototype.clearOptionalDouble = function() {\n  this.clear$Field(12);\n};\n\n\n/**\n * Gets the value of the optional_bool field.\n * @return {?boolean} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalBool = function() {\n  return /** @type {?boolean} */ (this.get$Value(13));\n};\n\n\n/**\n * Gets the value of the optional_bool field or the default value if not set.\n * @return {boolean} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalBoolOrDefault = function() {\n  return /** @type {boolean} */ (this.get$ValueOrDefault(13));\n};\n\n\n/**\n * Sets the value of the optional_bool field.\n * @param {boolean} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalBool = function(value) {\n  this.set$Value(13, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_bool field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalBool = function() {\n  return this.has$Value(13);\n};\n\n\n/**\n * @return {number} The number of values in the optional_bool field.\n */\nproto2.TestAllTypes.prototype.optionalBoolCount = function() {\n  return this.count$Values(13);\n};\n\n\n/**\n * Clears the values in the optional_bool field.\n */\nproto2.TestAllTypes.prototype.clearOptionalBool = function() {\n  this.clear$Field(13);\n};\n\n\n/**\n * Gets the value of the optional_string field.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalString = function() {\n  return /** @type {?string} */ (this.get$Value(14));\n};\n\n\n/**\n * Gets the value of the optional_string field or the default value if not set.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalStringOrDefault = function() {\n  return /** @type {string} */ (this.get$ValueOrDefault(14));\n};\n\n\n/**\n * Sets the value of the optional_string field.\n * @param {string} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalString = function(value) {\n  this.set$Value(14, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_string field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalString = function() {\n  return this.has$Value(14);\n};\n\n\n/**\n * @return {number} The number of values in the optional_string field.\n */\nproto2.TestAllTypes.prototype.optionalStringCount = function() {\n  return this.count$Values(14);\n};\n\n\n/**\n * Clears the values in the optional_string field.\n */\nproto2.TestAllTypes.prototype.clearOptionalString = function() {\n  this.clear$Field(14);\n};\n\n\n/**\n * Gets the value of the optional_bytes field.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalBytes = function() {\n  return /** @type {?string} */ (this.get$Value(15));\n};\n\n\n/**\n * Gets the value of the optional_bytes field or the default value if not set.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalBytesOrDefault = function() {\n  return /** @type {string} */ (this.get$ValueOrDefault(15));\n};\n\n\n/**\n * Sets the value of the optional_bytes field.\n * @param {string} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalBytes = function(value) {\n  this.set$Value(15, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_bytes field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalBytes = function() {\n  return this.has$Value(15);\n};\n\n\n/**\n * @return {number} The number of values in the optional_bytes field.\n */\nproto2.TestAllTypes.prototype.optionalBytesCount = function() {\n  return this.count$Values(15);\n};\n\n\n/**\n * Clears the values in the optional_bytes field.\n */\nproto2.TestAllTypes.prototype.clearOptionalBytes = function() {\n  this.clear$Field(15);\n};\n\n\n/**\n * Gets the value of the optionalgroup field.\n * @return {?proto2.TestAllTypes.OptionalGroup} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalgroup = function() {\n  return /** @type {?proto2.TestAllTypes.OptionalGroup} */ (this.get$Value(16));\n};\n\n\n/**\n * Gets the value of the optionalgroup field or the default value if not set.\n * @return {!proto2.TestAllTypes.OptionalGroup} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalgroupOrDefault = function() {\n  return /** @type {!proto2.TestAllTypes.OptionalGroup} */ (this.get$ValueOrDefault(16));\n};\n\n\n/**\n * Sets the value of the optionalgroup field.\n * @param {!proto2.TestAllTypes.OptionalGroup} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalgroup = function(value) {\n  this.set$Value(16, value);\n};\n\n\n/**\n * @return {boolean} Whether the optionalgroup field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalgroup = function() {\n  return this.has$Value(16);\n};\n\n\n/**\n * @return {number} The number of values in the optionalgroup field.\n */\nproto2.TestAllTypes.prototype.optionalgroupCount = function() {\n  return this.count$Values(16);\n};\n\n\n/**\n * Clears the values in the optionalgroup field.\n */\nproto2.TestAllTypes.prototype.clearOptionalgroup = function() {\n  this.clear$Field(16);\n};\n\n\n/**\n * Gets the value of the optional_nested_message field.\n * @return {?proto2.TestAllTypes.NestedMessage} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalNestedMessage = function() {\n  return /** @type {?proto2.TestAllTypes.NestedMessage} */ (this.get$Value(18));\n};\n\n\n/**\n * Gets the value of the optional_nested_message field or the default value if not set.\n * @return {!proto2.TestAllTypes.NestedMessage} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalNestedMessageOrDefault = function() {\n  return /** @type {!proto2.TestAllTypes.NestedMessage} */ (this.get$ValueOrDefault(18));\n};\n\n\n/**\n * Sets the value of the optional_nested_message field.\n * @param {!proto2.TestAllTypes.NestedMessage} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalNestedMessage = function(value) {\n  this.set$Value(18, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_nested_message field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalNestedMessage = function() {\n  return this.has$Value(18);\n};\n\n\n/**\n * @return {number} The number of values in the optional_nested_message field.\n */\nproto2.TestAllTypes.prototype.optionalNestedMessageCount = function() {\n  return this.count$Values(18);\n};\n\n\n/**\n * Clears the values in the optional_nested_message field.\n */\nproto2.TestAllTypes.prototype.clearOptionalNestedMessage = function() {\n  this.clear$Field(18);\n};\n\n\n/**\n * Gets the value of the optional_nested_enum field.\n * @return {?proto2.TestAllTypes.NestedEnum} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalNestedEnum = function() {\n  return /** @type {?proto2.TestAllTypes.NestedEnum} */ (this.get$Value(21));\n};\n\n\n/**\n * Gets the value of the optional_nested_enum field or the default value if not set.\n * @return {!proto2.TestAllTypes.NestedEnum} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalNestedEnumOrDefault = function() {\n  return /** @type {!proto2.TestAllTypes.NestedEnum} */ (this.get$ValueOrDefault(21));\n};\n\n\n/**\n * Sets the value of the optional_nested_enum field.\n * @param {!proto2.TestAllTypes.NestedEnum} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalNestedEnum = function(value) {\n  this.set$Value(21, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_nested_enum field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalNestedEnum = function() {\n  return this.has$Value(21);\n};\n\n\n/**\n * @return {number} The number of values in the optional_nested_enum field.\n */\nproto2.TestAllTypes.prototype.optionalNestedEnumCount = function() {\n  return this.count$Values(21);\n};\n\n\n/**\n * Clears the values in the optional_nested_enum field.\n */\nproto2.TestAllTypes.prototype.clearOptionalNestedEnum = function() {\n  this.clear$Field(21);\n};\n\n\n/**\n * Gets the value of the optional_int64_number field.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalInt64Number = function() {\n  return /** @type {?number} */ (this.get$Value(50));\n};\n\n\n/**\n * Gets the value of the optional_int64_number field or the default value if not set.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalInt64NumberOrDefault = function() {\n  return /** @type {number} */ (this.get$ValueOrDefault(50));\n};\n\n\n/**\n * Sets the value of the optional_int64_number field.\n * @param {number} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalInt64Number = function(value) {\n  this.set$Value(50, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_int64_number field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalInt64Number = function() {\n  return this.has$Value(50);\n};\n\n\n/**\n * @return {number} The number of values in the optional_int64_number field.\n */\nproto2.TestAllTypes.prototype.optionalInt64NumberCount = function() {\n  return this.count$Values(50);\n};\n\n\n/**\n * Clears the values in the optional_int64_number field.\n */\nproto2.TestAllTypes.prototype.clearOptionalInt64Number = function() {\n  this.clear$Field(50);\n};\n\n\n/**\n * Gets the value of the optional_int64_string field.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalInt64String = function() {\n  return /** @type {?string} */ (this.get$Value(51));\n};\n\n\n/**\n * Gets the value of the optional_int64_string field or the default value if not set.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getOptionalInt64StringOrDefault = function() {\n  return /** @type {string} */ (this.get$ValueOrDefault(51));\n};\n\n\n/**\n * Sets the value of the optional_int64_string field.\n * @param {string} value The value.\n */\nproto2.TestAllTypes.prototype.setOptionalInt64String = function(value) {\n  this.set$Value(51, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_int64_string field has a value.\n */\nproto2.TestAllTypes.prototype.hasOptionalInt64String = function() {\n  return this.has$Value(51);\n};\n\n\n/**\n * @return {number} The number of values in the optional_int64_string field.\n */\nproto2.TestAllTypes.prototype.optionalInt64StringCount = function() {\n  return this.count$Values(51);\n};\n\n\n/**\n * Clears the values in the optional_int64_string field.\n */\nproto2.TestAllTypes.prototype.clearOptionalInt64String = function() {\n  this.clear$Field(51);\n};\n\n\n/**\n * Gets the value of the repeated_int32 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedInt32 = function(index) {\n  return /** @type {?number} */ (this.get$Value(31, index));\n};\n\n\n/**\n * Gets the value of the repeated_int32 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedInt32OrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(31, index));\n};\n\n\n/**\n * Adds a value to the repeated_int32 field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedInt32 = function(value) {\n  this.add$Value(31, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_int32 field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedInt32Array = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(31));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_int32 field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedInt32 = function() {\n  return this.has$Value(31);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_int32 field.\n */\nproto2.TestAllTypes.prototype.repeatedInt32Count = function() {\n  return this.count$Values(31);\n};\n\n\n/**\n * Clears the values in the repeated_int32 field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedInt32 = function() {\n  this.clear$Field(31);\n};\n\n\n/**\n * Gets the value of the repeated_int64 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedInt64 = function(index) {\n  return /** @type {?string} */ (this.get$Value(32, index));\n};\n\n\n/**\n * Gets the value of the repeated_int64 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedInt64OrDefault = function(index) {\n  return /** @type {string} */ (this.get$ValueOrDefault(32, index));\n};\n\n\n/**\n * Adds a value to the repeated_int64 field.\n * @param {string} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedInt64 = function(value) {\n  this.add$Value(32, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_int64 field.\n * @return {!Array<string>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedInt64Array = function() {\n  return /** @type {!Array<string>} */ (this.array$Values(32));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_int64 field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedInt64 = function() {\n  return this.has$Value(32);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_int64 field.\n */\nproto2.TestAllTypes.prototype.repeatedInt64Count = function() {\n  return this.count$Values(32);\n};\n\n\n/**\n * Clears the values in the repeated_int64 field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedInt64 = function() {\n  this.clear$Field(32);\n};\n\n\n/**\n * Gets the value of the repeated_uint32 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedUint32 = function(index) {\n  return /** @type {?number} */ (this.get$Value(33, index));\n};\n\n\n/**\n * Gets the value of the repeated_uint32 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedUint32OrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(33, index));\n};\n\n\n/**\n * Adds a value to the repeated_uint32 field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedUint32 = function(value) {\n  this.add$Value(33, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_uint32 field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedUint32Array = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(33));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_uint32 field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedUint32 = function() {\n  return this.has$Value(33);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_uint32 field.\n */\nproto2.TestAllTypes.prototype.repeatedUint32Count = function() {\n  return this.count$Values(33);\n};\n\n\n/**\n * Clears the values in the repeated_uint32 field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedUint32 = function() {\n  this.clear$Field(33);\n};\n\n\n/**\n * Gets the value of the repeated_uint64 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedUint64 = function(index) {\n  return /** @type {?string} */ (this.get$Value(34, index));\n};\n\n\n/**\n * Gets the value of the repeated_uint64 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedUint64OrDefault = function(index) {\n  return /** @type {string} */ (this.get$ValueOrDefault(34, index));\n};\n\n\n/**\n * Adds a value to the repeated_uint64 field.\n * @param {string} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedUint64 = function(value) {\n  this.add$Value(34, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_uint64 field.\n * @return {!Array<string>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedUint64Array = function() {\n  return /** @type {!Array<string>} */ (this.array$Values(34));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_uint64 field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedUint64 = function() {\n  return this.has$Value(34);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_uint64 field.\n */\nproto2.TestAllTypes.prototype.repeatedUint64Count = function() {\n  return this.count$Values(34);\n};\n\n\n/**\n * Clears the values in the repeated_uint64 field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedUint64 = function() {\n  this.clear$Field(34);\n};\n\n\n/**\n * Gets the value of the repeated_sint32 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedSint32 = function(index) {\n  return /** @type {?number} */ (this.get$Value(35, index));\n};\n\n\n/**\n * Gets the value of the repeated_sint32 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedSint32OrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(35, index));\n};\n\n\n/**\n * Adds a value to the repeated_sint32 field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedSint32 = function(value) {\n  this.add$Value(35, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_sint32 field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedSint32Array = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(35));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_sint32 field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedSint32 = function() {\n  return this.has$Value(35);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_sint32 field.\n */\nproto2.TestAllTypes.prototype.repeatedSint32Count = function() {\n  return this.count$Values(35);\n};\n\n\n/**\n * Clears the values in the repeated_sint32 field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedSint32 = function() {\n  this.clear$Field(35);\n};\n\n\n/**\n * Gets the value of the repeated_sint64 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedSint64 = function(index) {\n  return /** @type {?string} */ (this.get$Value(36, index));\n};\n\n\n/**\n * Gets the value of the repeated_sint64 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedSint64OrDefault = function(index) {\n  return /** @type {string} */ (this.get$ValueOrDefault(36, index));\n};\n\n\n/**\n * Adds a value to the repeated_sint64 field.\n * @param {string} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedSint64 = function(value) {\n  this.add$Value(36, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_sint64 field.\n * @return {!Array<string>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedSint64Array = function() {\n  return /** @type {!Array<string>} */ (this.array$Values(36));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_sint64 field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedSint64 = function() {\n  return this.has$Value(36);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_sint64 field.\n */\nproto2.TestAllTypes.prototype.repeatedSint64Count = function() {\n  return this.count$Values(36);\n};\n\n\n/**\n * Clears the values in the repeated_sint64 field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedSint64 = function() {\n  this.clear$Field(36);\n};\n\n\n/**\n * Gets the value of the repeated_fixed32 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedFixed32 = function(index) {\n  return /** @type {?number} */ (this.get$Value(37, index));\n};\n\n\n/**\n * Gets the value of the repeated_fixed32 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedFixed32OrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(37, index));\n};\n\n\n/**\n * Adds a value to the repeated_fixed32 field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedFixed32 = function(value) {\n  this.add$Value(37, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_fixed32 field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedFixed32Array = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(37));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_fixed32 field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedFixed32 = function() {\n  return this.has$Value(37);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_fixed32 field.\n */\nproto2.TestAllTypes.prototype.repeatedFixed32Count = function() {\n  return this.count$Values(37);\n};\n\n\n/**\n * Clears the values in the repeated_fixed32 field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedFixed32 = function() {\n  this.clear$Field(37);\n};\n\n\n/**\n * Gets the value of the repeated_fixed64 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedFixed64 = function(index) {\n  return /** @type {?string} */ (this.get$Value(38, index));\n};\n\n\n/**\n * Gets the value of the repeated_fixed64 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedFixed64OrDefault = function(index) {\n  return /** @type {string} */ (this.get$ValueOrDefault(38, index));\n};\n\n\n/**\n * Adds a value to the repeated_fixed64 field.\n * @param {string} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedFixed64 = function(value) {\n  this.add$Value(38, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_fixed64 field.\n * @return {!Array<string>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedFixed64Array = function() {\n  return /** @type {!Array<string>} */ (this.array$Values(38));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_fixed64 field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedFixed64 = function() {\n  return this.has$Value(38);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_fixed64 field.\n */\nproto2.TestAllTypes.prototype.repeatedFixed64Count = function() {\n  return this.count$Values(38);\n};\n\n\n/**\n * Clears the values in the repeated_fixed64 field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedFixed64 = function() {\n  this.clear$Field(38);\n};\n\n\n/**\n * Gets the value of the repeated_sfixed32 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedSfixed32 = function(index) {\n  return /** @type {?number} */ (this.get$Value(39, index));\n};\n\n\n/**\n * Gets the value of the repeated_sfixed32 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedSfixed32OrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(39, index));\n};\n\n\n/**\n * Adds a value to the repeated_sfixed32 field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedSfixed32 = function(value) {\n  this.add$Value(39, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_sfixed32 field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedSfixed32Array = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(39));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_sfixed32 field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedSfixed32 = function() {\n  return this.has$Value(39);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_sfixed32 field.\n */\nproto2.TestAllTypes.prototype.repeatedSfixed32Count = function() {\n  return this.count$Values(39);\n};\n\n\n/**\n * Clears the values in the repeated_sfixed32 field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedSfixed32 = function() {\n  this.clear$Field(39);\n};\n\n\n/**\n * Gets the value of the repeated_sfixed64 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedSfixed64 = function(index) {\n  return /** @type {?string} */ (this.get$Value(40, index));\n};\n\n\n/**\n * Gets the value of the repeated_sfixed64 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedSfixed64OrDefault = function(index) {\n  return /** @type {string} */ (this.get$ValueOrDefault(40, index));\n};\n\n\n/**\n * Adds a value to the repeated_sfixed64 field.\n * @param {string} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedSfixed64 = function(value) {\n  this.add$Value(40, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_sfixed64 field.\n * @return {!Array<string>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedSfixed64Array = function() {\n  return /** @type {!Array<string>} */ (this.array$Values(40));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_sfixed64 field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedSfixed64 = function() {\n  return this.has$Value(40);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_sfixed64 field.\n */\nproto2.TestAllTypes.prototype.repeatedSfixed64Count = function() {\n  return this.count$Values(40);\n};\n\n\n/**\n * Clears the values in the repeated_sfixed64 field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedSfixed64 = function() {\n  this.clear$Field(40);\n};\n\n\n/**\n * Gets the value of the repeated_float field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedFloat = function(index) {\n  return /** @type {?number} */ (this.get$Value(41, index));\n};\n\n\n/**\n * Gets the value of the repeated_float field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedFloatOrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(41, index));\n};\n\n\n/**\n * Adds a value to the repeated_float field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedFloat = function(value) {\n  this.add$Value(41, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_float field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedFloatArray = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(41));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_float field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedFloat = function() {\n  return this.has$Value(41);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_float field.\n */\nproto2.TestAllTypes.prototype.repeatedFloatCount = function() {\n  return this.count$Values(41);\n};\n\n\n/**\n * Clears the values in the repeated_float field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedFloat = function() {\n  this.clear$Field(41);\n};\n\n\n/**\n * Gets the value of the repeated_double field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedDouble = function(index) {\n  return /** @type {?number} */ (this.get$Value(42, index));\n};\n\n\n/**\n * Gets the value of the repeated_double field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedDoubleOrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(42, index));\n};\n\n\n/**\n * Adds a value to the repeated_double field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedDouble = function(value) {\n  this.add$Value(42, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_double field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedDoubleArray = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(42));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_double field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedDouble = function() {\n  return this.has$Value(42);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_double field.\n */\nproto2.TestAllTypes.prototype.repeatedDoubleCount = function() {\n  return this.count$Values(42);\n};\n\n\n/**\n * Clears the values in the repeated_double field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedDouble = function() {\n  this.clear$Field(42);\n};\n\n\n/**\n * Gets the value of the repeated_bool field at the index given.\n * @param {number} index The index to lookup.\n * @return {?boolean} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedBool = function(index) {\n  return /** @type {?boolean} */ (this.get$Value(43, index));\n};\n\n\n/**\n * Gets the value of the repeated_bool field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {boolean} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedBoolOrDefault = function(index) {\n  return /** @type {boolean} */ (this.get$ValueOrDefault(43, index));\n};\n\n\n/**\n * Adds a value to the repeated_bool field.\n * @param {boolean} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedBool = function(value) {\n  this.add$Value(43, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_bool field.\n * @return {!Array<boolean>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedBoolArray = function() {\n  return /** @type {!Array<boolean>} */ (this.array$Values(43));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_bool field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedBool = function() {\n  return this.has$Value(43);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_bool field.\n */\nproto2.TestAllTypes.prototype.repeatedBoolCount = function() {\n  return this.count$Values(43);\n};\n\n\n/**\n * Clears the values in the repeated_bool field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedBool = function() {\n  this.clear$Field(43);\n};\n\n\n/**\n * Gets the value of the repeated_string field at the index given.\n * @param {number} index The index to lookup.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedString = function(index) {\n  return /** @type {?string} */ (this.get$Value(44, index));\n};\n\n\n/**\n * Gets the value of the repeated_string field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedStringOrDefault = function(index) {\n  return /** @type {string} */ (this.get$ValueOrDefault(44, index));\n};\n\n\n/**\n * Adds a value to the repeated_string field.\n * @param {string} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedString = function(value) {\n  this.add$Value(44, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_string field.\n * @return {!Array<string>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedStringArray = function() {\n  return /** @type {!Array<string>} */ (this.array$Values(44));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_string field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedString = function() {\n  return this.has$Value(44);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_string field.\n */\nproto2.TestAllTypes.prototype.repeatedStringCount = function() {\n  return this.count$Values(44);\n};\n\n\n/**\n * Clears the values in the repeated_string field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedString = function() {\n  this.clear$Field(44);\n};\n\n\n/**\n * Gets the value of the repeated_bytes field at the index given.\n * @param {number} index The index to lookup.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedBytes = function(index) {\n  return /** @type {?string} */ (this.get$Value(45, index));\n};\n\n\n/**\n * Gets the value of the repeated_bytes field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedBytesOrDefault = function(index) {\n  return /** @type {string} */ (this.get$ValueOrDefault(45, index));\n};\n\n\n/**\n * Adds a value to the repeated_bytes field.\n * @param {string} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedBytes = function(value) {\n  this.add$Value(45, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_bytes field.\n * @return {!Array<string>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedBytesArray = function() {\n  return /** @type {!Array<string>} */ (this.array$Values(45));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_bytes field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedBytes = function() {\n  return this.has$Value(45);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_bytes field.\n */\nproto2.TestAllTypes.prototype.repeatedBytesCount = function() {\n  return this.count$Values(45);\n};\n\n\n/**\n * Clears the values in the repeated_bytes field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedBytes = function() {\n  this.clear$Field(45);\n};\n\n\n/**\n * Gets the value of the repeatedgroup field at the index given.\n * @param {number} index The index to lookup.\n * @return {?proto2.TestAllTypes.RepeatedGroup} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedgroup = function(index) {\n  return /** @type {?proto2.TestAllTypes.RepeatedGroup} */ (this.get$Value(46, index));\n};\n\n\n/**\n * Gets the value of the repeatedgroup field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {!proto2.TestAllTypes.RepeatedGroup} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedgroupOrDefault = function(index) {\n  return /** @type {!proto2.TestAllTypes.RepeatedGroup} */ (this.get$ValueOrDefault(46, index));\n};\n\n\n/**\n * Adds a value to the repeatedgroup field.\n * @param {!proto2.TestAllTypes.RepeatedGroup} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedgroup = function(value) {\n  this.add$Value(46, value);\n};\n\n\n/**\n * Returns the array of values in the repeatedgroup field.\n * @return {!Array<!proto2.TestAllTypes.RepeatedGroup>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedgroupArray = function() {\n  return /** @type {!Array<!proto2.TestAllTypes.RepeatedGroup>} */ (this.array$Values(46));\n};\n\n\n/**\n * @return {boolean} Whether the repeatedgroup field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedgroup = function() {\n  return this.has$Value(46);\n};\n\n\n/**\n * @return {number} The number of values in the repeatedgroup field.\n */\nproto2.TestAllTypes.prototype.repeatedgroupCount = function() {\n  return this.count$Values(46);\n};\n\n\n/**\n * Clears the values in the repeatedgroup field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedgroup = function() {\n  this.clear$Field(46);\n};\n\n\n/**\n * Gets the value of the repeated_nested_message field at the index given.\n * @param {number} index The index to lookup.\n * @return {?proto2.TestAllTypes.NestedMessage} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedNestedMessage = function(index) {\n  return /** @type {?proto2.TestAllTypes.NestedMessage} */ (this.get$Value(48, index));\n};\n\n\n/**\n * Gets the value of the repeated_nested_message field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {!proto2.TestAllTypes.NestedMessage} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedNestedMessageOrDefault = function(index) {\n  return /** @type {!proto2.TestAllTypes.NestedMessage} */ (this.get$ValueOrDefault(48, index));\n};\n\n\n/**\n * Adds a value to the repeated_nested_message field.\n * @param {!proto2.TestAllTypes.NestedMessage} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedNestedMessage = function(value) {\n  this.add$Value(48, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_nested_message field.\n * @return {!Array<!proto2.TestAllTypes.NestedMessage>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedNestedMessageArray = function() {\n  return /** @type {!Array<!proto2.TestAllTypes.NestedMessage>} */ (this.array$Values(48));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_nested_message field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedNestedMessage = function() {\n  return this.has$Value(48);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_nested_message field.\n */\nproto2.TestAllTypes.prototype.repeatedNestedMessageCount = function() {\n  return this.count$Values(48);\n};\n\n\n/**\n * Clears the values in the repeated_nested_message field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedNestedMessage = function() {\n  this.clear$Field(48);\n};\n\n\n/**\n * Gets the value of the repeated_nested_enum field at the index given.\n * @param {number} index The index to lookup.\n * @return {?proto2.TestAllTypes.NestedEnum} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedNestedEnum = function(index) {\n  return /** @type {?proto2.TestAllTypes.NestedEnum} */ (this.get$Value(49, index));\n};\n\n\n/**\n * Gets the value of the repeated_nested_enum field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {!proto2.TestAllTypes.NestedEnum} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedNestedEnumOrDefault = function(index) {\n  return /** @type {!proto2.TestAllTypes.NestedEnum} */ (this.get$ValueOrDefault(49, index));\n};\n\n\n/**\n * Adds a value to the repeated_nested_enum field.\n * @param {!proto2.TestAllTypes.NestedEnum} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedNestedEnum = function(value) {\n  this.add$Value(49, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_nested_enum field.\n * @return {!Array<!proto2.TestAllTypes.NestedEnum>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedNestedEnumArray = function() {\n  return /** @type {!Array<!proto2.TestAllTypes.NestedEnum>} */ (this.array$Values(49));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_nested_enum field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedNestedEnum = function() {\n  return this.has$Value(49);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_nested_enum field.\n */\nproto2.TestAllTypes.prototype.repeatedNestedEnumCount = function() {\n  return this.count$Values(49);\n};\n\n\n/**\n * Clears the values in the repeated_nested_enum field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedNestedEnum = function() {\n  this.clear$Field(49);\n};\n\n\n/**\n * Gets the value of the repeated_int64_number field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedInt64Number = function(index) {\n  return /** @type {?number} */ (this.get$Value(52, index));\n};\n\n\n/**\n * Gets the value of the repeated_int64_number field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedInt64NumberOrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(52, index));\n};\n\n\n/**\n * Adds a value to the repeated_int64_number field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedInt64Number = function(value) {\n  this.add$Value(52, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_int64_number field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedInt64NumberArray = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(52));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_int64_number field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedInt64Number = function() {\n  return this.has$Value(52);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_int64_number field.\n */\nproto2.TestAllTypes.prototype.repeatedInt64NumberCount = function() {\n  return this.count$Values(52);\n};\n\n\n/**\n * Clears the values in the repeated_int64_number field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedInt64Number = function() {\n  this.clear$Field(52);\n};\n\n\n/**\n * Gets the value of the repeated_int64_string field at the index given.\n * @param {number} index The index to lookup.\n * @return {?string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedInt64String = function(index) {\n  return /** @type {?string} */ (this.get$Value(53, index));\n};\n\n\n/**\n * Gets the value of the repeated_int64_string field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {string} The value.\n */\nproto2.TestAllTypes.prototype.getRepeatedInt64StringOrDefault = function(index) {\n  return /** @type {string} */ (this.get$ValueOrDefault(53, index));\n};\n\n\n/**\n * Adds a value to the repeated_int64_string field.\n * @param {string} value The value to add.\n */\nproto2.TestAllTypes.prototype.addRepeatedInt64String = function(value) {\n  this.add$Value(53, value);\n};\n\n\n/**\n * Returns the array of values in the repeated_int64_string field.\n * @return {!Array<string>} The values in the field.\n */\nproto2.TestAllTypes.prototype.repeatedInt64StringArray = function() {\n  return /** @type {!Array<string>} */ (this.array$Values(53));\n};\n\n\n/**\n * @return {boolean} Whether the repeated_int64_string field has a value.\n */\nproto2.TestAllTypes.prototype.hasRepeatedInt64String = function() {\n  return this.has$Value(53);\n};\n\n\n/**\n * @return {number} The number of values in the repeated_int64_string field.\n */\nproto2.TestAllTypes.prototype.repeatedInt64StringCount = function() {\n  return this.count$Values(53);\n};\n\n\n/**\n * Clears the values in the repeated_int64_string field.\n */\nproto2.TestAllTypes.prototype.clearRepeatedInt64String = function() {\n  this.clear$Field(53);\n};\n\n\n/**\n * Gets the value of the packed_int32 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedInt32 = function(index) {\n  return /** @type {?number} */ (this.get$Value(54, index));\n};\n\n\n/**\n * Gets the value of the packed_int32 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedInt32OrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(54, index));\n};\n\n\n/**\n * Adds a value to the packed_int32 field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addPackedInt32 = function(value) {\n  this.add$Value(54, value);\n};\n\n\n/**\n * Returns the array of values in the packed_int32 field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.packedInt32Array = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(54));\n};\n\n\n/**\n * @return {boolean} Whether the packed_int32 field has a value.\n */\nproto2.TestAllTypes.prototype.hasPackedInt32 = function() {\n  return this.has$Value(54);\n};\n\n\n/**\n * @return {number} The number of values in the packed_int32 field.\n */\nproto2.TestAllTypes.prototype.packedInt32Count = function() {\n  return this.count$Values(54);\n};\n\n\n/**\n * Clears the values in the packed_int32 field.\n */\nproto2.TestAllTypes.prototype.clearPackedInt32 = function() {\n  this.clear$Field(54);\n};\n\n\n/**\n * Gets the value of the packed_int64 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedInt64 = function(index) {\n  return /** @type {?number} */ (this.get$Value(55, index));\n};\n\n\n/**\n * Gets the value of the packed_int64 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedInt64OrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(55, index));\n};\n\n\n/**\n * Adds a value to the packed_int64 field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addPackedInt64 = function(value) {\n  this.add$Value(55, value);\n};\n\n\n/**\n * Returns the array of values in the packed_int64 field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.packedInt64Array = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(55));\n};\n\n\n/**\n * @return {boolean} Whether the packed_int64 field has a value.\n */\nproto2.TestAllTypes.prototype.hasPackedInt64 = function() {\n  return this.has$Value(55);\n};\n\n\n/**\n * @return {number} The number of values in the packed_int64 field.\n */\nproto2.TestAllTypes.prototype.packedInt64Count = function() {\n  return this.count$Values(55);\n};\n\n\n/**\n * Clears the values in the packed_int64 field.\n */\nproto2.TestAllTypes.prototype.clearPackedInt64 = function() {\n  this.clear$Field(55);\n};\n\n\n/**\n * Gets the value of the packed_uint32 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedUint32 = function(index) {\n  return /** @type {?number} */ (this.get$Value(56, index));\n};\n\n\n/**\n * Gets the value of the packed_uint32 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedUint32OrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(56, index));\n};\n\n\n/**\n * Adds a value to the packed_uint32 field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addPackedUint32 = function(value) {\n  this.add$Value(56, value);\n};\n\n\n/**\n * Returns the array of values in the packed_uint32 field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.packedUint32Array = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(56));\n};\n\n\n/**\n * @return {boolean} Whether the packed_uint32 field has a value.\n */\nproto2.TestAllTypes.prototype.hasPackedUint32 = function() {\n  return this.has$Value(56);\n};\n\n\n/**\n * @return {number} The number of values in the packed_uint32 field.\n */\nproto2.TestAllTypes.prototype.packedUint32Count = function() {\n  return this.count$Values(56);\n};\n\n\n/**\n * Clears the values in the packed_uint32 field.\n */\nproto2.TestAllTypes.prototype.clearPackedUint32 = function() {\n  this.clear$Field(56);\n};\n\n\n/**\n * Gets the value of the packed_uint64 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedUint64 = function(index) {\n  return /** @type {?number} */ (this.get$Value(57, index));\n};\n\n\n/**\n * Gets the value of the packed_uint64 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedUint64OrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(57, index));\n};\n\n\n/**\n * Adds a value to the packed_uint64 field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addPackedUint64 = function(value) {\n  this.add$Value(57, value);\n};\n\n\n/**\n * Returns the array of values in the packed_uint64 field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.packedUint64Array = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(57));\n};\n\n\n/**\n * @return {boolean} Whether the packed_uint64 field has a value.\n */\nproto2.TestAllTypes.prototype.hasPackedUint64 = function() {\n  return this.has$Value(57);\n};\n\n\n/**\n * @return {number} The number of values in the packed_uint64 field.\n */\nproto2.TestAllTypes.prototype.packedUint64Count = function() {\n  return this.count$Values(57);\n};\n\n\n/**\n * Clears the values in the packed_uint64 field.\n */\nproto2.TestAllTypes.prototype.clearPackedUint64 = function() {\n  this.clear$Field(57);\n};\n\n\n/**\n * Gets the value of the packed_sint32 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedSint32 = function(index) {\n  return /** @type {?number} */ (this.get$Value(58, index));\n};\n\n\n/**\n * Gets the value of the packed_sint32 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedSint32OrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(58, index));\n};\n\n\n/**\n * Adds a value to the packed_sint32 field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addPackedSint32 = function(value) {\n  this.add$Value(58, value);\n};\n\n\n/**\n * Returns the array of values in the packed_sint32 field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.packedSint32Array = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(58));\n};\n\n\n/**\n * @return {boolean} Whether the packed_sint32 field has a value.\n */\nproto2.TestAllTypes.prototype.hasPackedSint32 = function() {\n  return this.has$Value(58);\n};\n\n\n/**\n * @return {number} The number of values in the packed_sint32 field.\n */\nproto2.TestAllTypes.prototype.packedSint32Count = function() {\n  return this.count$Values(58);\n};\n\n\n/**\n * Clears the values in the packed_sint32 field.\n */\nproto2.TestAllTypes.prototype.clearPackedSint32 = function() {\n  this.clear$Field(58);\n};\n\n\n/**\n * Gets the value of the packed_sint64 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedSint64 = function(index) {\n  return /** @type {?number} */ (this.get$Value(59, index));\n};\n\n\n/**\n * Gets the value of the packed_sint64 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedSint64OrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(59, index));\n};\n\n\n/**\n * Adds a value to the packed_sint64 field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addPackedSint64 = function(value) {\n  this.add$Value(59, value);\n};\n\n\n/**\n * Returns the array of values in the packed_sint64 field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.packedSint64Array = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(59));\n};\n\n\n/**\n * @return {boolean} Whether the packed_sint64 field has a value.\n */\nproto2.TestAllTypes.prototype.hasPackedSint64 = function() {\n  return this.has$Value(59);\n};\n\n\n/**\n * @return {number} The number of values in the packed_sint64 field.\n */\nproto2.TestAllTypes.prototype.packedSint64Count = function() {\n  return this.count$Values(59);\n};\n\n\n/**\n * Clears the values in the packed_sint64 field.\n */\nproto2.TestAllTypes.prototype.clearPackedSint64 = function() {\n  this.clear$Field(59);\n};\n\n\n/**\n * Gets the value of the packed_fixed32 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedFixed32 = function(index) {\n  return /** @type {?number} */ (this.get$Value(60, index));\n};\n\n\n/**\n * Gets the value of the packed_fixed32 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedFixed32OrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(60, index));\n};\n\n\n/**\n * Adds a value to the packed_fixed32 field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addPackedFixed32 = function(value) {\n  this.add$Value(60, value);\n};\n\n\n/**\n * Returns the array of values in the packed_fixed32 field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.packedFixed32Array = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(60));\n};\n\n\n/**\n * @return {boolean} Whether the packed_fixed32 field has a value.\n */\nproto2.TestAllTypes.prototype.hasPackedFixed32 = function() {\n  return this.has$Value(60);\n};\n\n\n/**\n * @return {number} The number of values in the packed_fixed32 field.\n */\nproto2.TestAllTypes.prototype.packedFixed32Count = function() {\n  return this.count$Values(60);\n};\n\n\n/**\n * Clears the values in the packed_fixed32 field.\n */\nproto2.TestAllTypes.prototype.clearPackedFixed32 = function() {\n  this.clear$Field(60);\n};\n\n\n/**\n * Gets the value of the packed_fixed64 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedFixed64 = function(index) {\n  return /** @type {?number} */ (this.get$Value(61, index));\n};\n\n\n/**\n * Gets the value of the packed_fixed64 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedFixed64OrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(61, index));\n};\n\n\n/**\n * Adds a value to the packed_fixed64 field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addPackedFixed64 = function(value) {\n  this.add$Value(61, value);\n};\n\n\n/**\n * Returns the array of values in the packed_fixed64 field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.packedFixed64Array = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(61));\n};\n\n\n/**\n * @return {boolean} Whether the packed_fixed64 field has a value.\n */\nproto2.TestAllTypes.prototype.hasPackedFixed64 = function() {\n  return this.has$Value(61);\n};\n\n\n/**\n * @return {number} The number of values in the packed_fixed64 field.\n */\nproto2.TestAllTypes.prototype.packedFixed64Count = function() {\n  return this.count$Values(61);\n};\n\n\n/**\n * Clears the values in the packed_fixed64 field.\n */\nproto2.TestAllTypes.prototype.clearPackedFixed64 = function() {\n  this.clear$Field(61);\n};\n\n\n/**\n * Gets the value of the packed_sfixed32 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedSfixed32 = function(index) {\n  return /** @type {?number} */ (this.get$Value(62, index));\n};\n\n\n/**\n * Gets the value of the packed_sfixed32 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedSfixed32OrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(62, index));\n};\n\n\n/**\n * Adds a value to the packed_sfixed32 field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addPackedSfixed32 = function(value) {\n  this.add$Value(62, value);\n};\n\n\n/**\n * Returns the array of values in the packed_sfixed32 field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.packedSfixed32Array = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(62));\n};\n\n\n/**\n * @return {boolean} Whether the packed_sfixed32 field has a value.\n */\nproto2.TestAllTypes.prototype.hasPackedSfixed32 = function() {\n  return this.has$Value(62);\n};\n\n\n/**\n * @return {number} The number of values in the packed_sfixed32 field.\n */\nproto2.TestAllTypes.prototype.packedSfixed32Count = function() {\n  return this.count$Values(62);\n};\n\n\n/**\n * Clears the values in the packed_sfixed32 field.\n */\nproto2.TestAllTypes.prototype.clearPackedSfixed32 = function() {\n  this.clear$Field(62);\n};\n\n\n/**\n * Gets the value of the packed_sfixed64 field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedSfixed64 = function(index) {\n  return /** @type {?number} */ (this.get$Value(63, index));\n};\n\n\n/**\n * Gets the value of the packed_sfixed64 field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedSfixed64OrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(63, index));\n};\n\n\n/**\n * Adds a value to the packed_sfixed64 field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addPackedSfixed64 = function(value) {\n  this.add$Value(63, value);\n};\n\n\n/**\n * Returns the array of values in the packed_sfixed64 field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.packedSfixed64Array = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(63));\n};\n\n\n/**\n * @return {boolean} Whether the packed_sfixed64 field has a value.\n */\nproto2.TestAllTypes.prototype.hasPackedSfixed64 = function() {\n  return this.has$Value(63);\n};\n\n\n/**\n * @return {number} The number of values in the packed_sfixed64 field.\n */\nproto2.TestAllTypes.prototype.packedSfixed64Count = function() {\n  return this.count$Values(63);\n};\n\n\n/**\n * Clears the values in the packed_sfixed64 field.\n */\nproto2.TestAllTypes.prototype.clearPackedSfixed64 = function() {\n  this.clear$Field(63);\n};\n\n\n/**\n * Gets the value of the packed_float field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedFloat = function(index) {\n  return /** @type {?number} */ (this.get$Value(64, index));\n};\n\n\n/**\n * Gets the value of the packed_float field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedFloatOrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(64, index));\n};\n\n\n/**\n * Adds a value to the packed_float field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addPackedFloat = function(value) {\n  this.add$Value(64, value);\n};\n\n\n/**\n * Returns the array of values in the packed_float field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.packedFloatArray = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(64));\n};\n\n\n/**\n * @return {boolean} Whether the packed_float field has a value.\n */\nproto2.TestAllTypes.prototype.hasPackedFloat = function() {\n  return this.has$Value(64);\n};\n\n\n/**\n * @return {number} The number of values in the packed_float field.\n */\nproto2.TestAllTypes.prototype.packedFloatCount = function() {\n  return this.count$Values(64);\n};\n\n\n/**\n * Clears the values in the packed_float field.\n */\nproto2.TestAllTypes.prototype.clearPackedFloat = function() {\n  this.clear$Field(64);\n};\n\n\n/**\n * Gets the value of the packed_double field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedDouble = function(index) {\n  return /** @type {?number} */ (this.get$Value(65, index));\n};\n\n\n/**\n * Gets the value of the packed_double field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.prototype.getPackedDoubleOrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(65, index));\n};\n\n\n/**\n * Adds a value to the packed_double field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.prototype.addPackedDouble = function(value) {\n  this.add$Value(65, value);\n};\n\n\n/**\n * Returns the array of values in the packed_double field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.prototype.packedDoubleArray = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(65));\n};\n\n\n/**\n * @return {boolean} Whether the packed_double field has a value.\n */\nproto2.TestAllTypes.prototype.hasPackedDouble = function() {\n  return this.has$Value(65);\n};\n\n\n/**\n * @return {number} The number of values in the packed_double field.\n */\nproto2.TestAllTypes.prototype.packedDoubleCount = function() {\n  return this.count$Values(65);\n};\n\n\n/**\n * Clears the values in the packed_double field.\n */\nproto2.TestAllTypes.prototype.clearPackedDouble = function() {\n  this.clear$Field(65);\n};\n\n\n/**\n * Gets the value of the packed_bool field at the index given.\n * @param {number} index The index to lookup.\n * @return {?boolean} The value.\n */\nproto2.TestAllTypes.prototype.getPackedBool = function(index) {\n  return /** @type {?boolean} */ (this.get$Value(66, index));\n};\n\n\n/**\n * Gets the value of the packed_bool field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {boolean} The value.\n */\nproto2.TestAllTypes.prototype.getPackedBoolOrDefault = function(index) {\n  return /** @type {boolean} */ (this.get$ValueOrDefault(66, index));\n};\n\n\n/**\n * Adds a value to the packed_bool field.\n * @param {boolean} value The value to add.\n */\nproto2.TestAllTypes.prototype.addPackedBool = function(value) {\n  this.add$Value(66, value);\n};\n\n\n/**\n * Returns the array of values in the packed_bool field.\n * @return {!Array<boolean>} The values in the field.\n */\nproto2.TestAllTypes.prototype.packedBoolArray = function() {\n  return /** @type {!Array<boolean>} */ (this.array$Values(66));\n};\n\n\n/**\n * @return {boolean} Whether the packed_bool field has a value.\n */\nproto2.TestAllTypes.prototype.hasPackedBool = function() {\n  return this.has$Value(66);\n};\n\n\n/**\n * @return {number} The number of values in the packed_bool field.\n */\nproto2.TestAllTypes.prototype.packedBoolCount = function() {\n  return this.count$Values(66);\n};\n\n\n/**\n * Clears the values in the packed_bool field.\n */\nproto2.TestAllTypes.prototype.clearPackedBool = function() {\n  this.clear$Field(66);\n};\n\n\n/**\n * Enumeration NestedEnum.\n * @enum {number}\n */\nproto2.TestAllTypes.NestedEnum = {\n  FOO: 0,\n  OOF: 1,\n  BAR: 2,\n  BAZ: 3\n};\n\n\n\n/**\n * Message NestedMessage.\n * @constructor\n * @extends {goog.proto2.Message}\n * @final\n */\nproto2.TestAllTypes.NestedMessage = function() {\n  goog.proto2.Message.call(this);\n};\ngoog.inherits(proto2.TestAllTypes.NestedMessage, goog.proto2.Message);\n\n\n/**\n * Descriptor for this message, deserialized lazily in getDescriptor().\n * @private {?goog.proto2.Descriptor}\n */\nproto2.TestAllTypes.NestedMessage.descriptor_ = null;\n\n\n/**\n * Overrides {@link goog.proto2.Message#clone} to specify its exact return type.\n * @return {!proto2.TestAllTypes.NestedMessage} The cloned message.\n * @override\n */\nproto2.TestAllTypes.NestedMessage.prototype.clone;\n\n\n/**\n * Gets the value of the b field.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.NestedMessage.prototype.getB = function() {\n  return /** @type {?number} */ (this.get$Value(1));\n};\n\n\n/**\n * Gets the value of the b field or the default value if not set.\n * @return {number} The value.\n */\nproto2.TestAllTypes.NestedMessage.prototype.getBOrDefault = function() {\n  return /** @type {number} */ (this.get$ValueOrDefault(1));\n};\n\n\n/**\n * Sets the value of the b field.\n * @param {number} value The value.\n */\nproto2.TestAllTypes.NestedMessage.prototype.setB = function(value) {\n  this.set$Value(1, value);\n};\n\n\n/**\n * @return {boolean} Whether the b field has a value.\n */\nproto2.TestAllTypes.NestedMessage.prototype.hasB = function() {\n  return this.has$Value(1);\n};\n\n\n/**\n * @return {number} The number of values in the b field.\n */\nproto2.TestAllTypes.NestedMessage.prototype.bCount = function() {\n  return this.count$Values(1);\n};\n\n\n/**\n * Clears the values in the b field.\n */\nproto2.TestAllTypes.NestedMessage.prototype.clearB = function() {\n  this.clear$Field(1);\n};\n\n\n/**\n * Gets the value of the c field.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.NestedMessage.prototype.getC = function() {\n  return /** @type {?number} */ (this.get$Value(2));\n};\n\n\n/**\n * Gets the value of the c field or the default value if not set.\n * @return {number} The value.\n */\nproto2.TestAllTypes.NestedMessage.prototype.getCOrDefault = function() {\n  return /** @type {number} */ (this.get$ValueOrDefault(2));\n};\n\n\n/**\n * Sets the value of the c field.\n * @param {number} value The value.\n */\nproto2.TestAllTypes.NestedMessage.prototype.setC = function(value) {\n  this.set$Value(2, value);\n};\n\n\n/**\n * @return {boolean} Whether the c field has a value.\n */\nproto2.TestAllTypes.NestedMessage.prototype.hasC = function() {\n  return this.has$Value(2);\n};\n\n\n/**\n * @return {number} The number of values in the c field.\n */\nproto2.TestAllTypes.NestedMessage.prototype.cCount = function() {\n  return this.count$Values(2);\n};\n\n\n/**\n * Clears the values in the c field.\n */\nproto2.TestAllTypes.NestedMessage.prototype.clearC = function() {\n  this.clear$Field(2);\n};\n\n\n\n/**\n * Message OptionalGroup.\n * @constructor\n * @extends {goog.proto2.Message}\n * @final\n */\nproto2.TestAllTypes.OptionalGroup = function() {\n  goog.proto2.Message.call(this);\n};\ngoog.inherits(proto2.TestAllTypes.OptionalGroup, goog.proto2.Message);\n\n\n/**\n * Descriptor for this message, deserialized lazily in getDescriptor().\n * @private {?goog.proto2.Descriptor}\n */\nproto2.TestAllTypes.OptionalGroup.descriptor_ = null;\n\n\n/**\n * Overrides {@link goog.proto2.Message#clone} to specify its exact return type.\n * @return {!proto2.TestAllTypes.OptionalGroup} The cloned message.\n * @override\n */\nproto2.TestAllTypes.OptionalGroup.prototype.clone;\n\n\n/**\n * Gets the value of the a field.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.OptionalGroup.prototype.getA = function() {\n  return /** @type {?number} */ (this.get$Value(17));\n};\n\n\n/**\n * Gets the value of the a field or the default value if not set.\n * @return {number} The value.\n */\nproto2.TestAllTypes.OptionalGroup.prototype.getAOrDefault = function() {\n  return /** @type {number} */ (this.get$ValueOrDefault(17));\n};\n\n\n/**\n * Sets the value of the a field.\n * @param {number} value The value.\n */\nproto2.TestAllTypes.OptionalGroup.prototype.setA = function(value) {\n  this.set$Value(17, value);\n};\n\n\n/**\n * @return {boolean} Whether the a field has a value.\n */\nproto2.TestAllTypes.OptionalGroup.prototype.hasA = function() {\n  return this.has$Value(17);\n};\n\n\n/**\n * @return {number} The number of values in the a field.\n */\nproto2.TestAllTypes.OptionalGroup.prototype.aCount = function() {\n  return this.count$Values(17);\n};\n\n\n/**\n * Clears the values in the a field.\n */\nproto2.TestAllTypes.OptionalGroup.prototype.clearA = function() {\n  this.clear$Field(17);\n};\n\n\n\n/**\n * Message RepeatedGroup.\n * @constructor\n * @extends {goog.proto2.Message}\n * @final\n */\nproto2.TestAllTypes.RepeatedGroup = function() {\n  goog.proto2.Message.call(this);\n};\ngoog.inherits(proto2.TestAllTypes.RepeatedGroup, goog.proto2.Message);\n\n\n/**\n * Descriptor for this message, deserialized lazily in getDescriptor().\n * @private {?goog.proto2.Descriptor}\n */\nproto2.TestAllTypes.RepeatedGroup.descriptor_ = null;\n\n\n/**\n * Overrides {@link goog.proto2.Message#clone} to specify its exact return type.\n * @return {!proto2.TestAllTypes.RepeatedGroup} The cloned message.\n * @override\n */\nproto2.TestAllTypes.RepeatedGroup.prototype.clone;\n\n\n/**\n * Gets the value of the a field at the index given.\n * @param {number} index The index to lookup.\n * @return {?number} The value.\n */\nproto2.TestAllTypes.RepeatedGroup.prototype.getA = function(index) {\n  return /** @type {?number} */ (this.get$Value(47, index));\n};\n\n\n/**\n * Gets the value of the a field at the index given or the default value if not set.\n * @param {number} index The index to lookup.\n * @return {number} The value.\n */\nproto2.TestAllTypes.RepeatedGroup.prototype.getAOrDefault = function(index) {\n  return /** @type {number} */ (this.get$ValueOrDefault(47, index));\n};\n\n\n/**\n * Adds a value to the a field.\n * @param {number} value The value to add.\n */\nproto2.TestAllTypes.RepeatedGroup.prototype.addA = function(value) {\n  this.add$Value(47, value);\n};\n\n\n/**\n * Returns the array of values in the a field.\n * @return {!Array<number>} The values in the field.\n */\nproto2.TestAllTypes.RepeatedGroup.prototype.aArray = function() {\n  return /** @type {!Array<number>} */ (this.array$Values(47));\n};\n\n\n/**\n * @return {boolean} Whether the a field has a value.\n */\nproto2.TestAllTypes.RepeatedGroup.prototype.hasA = function() {\n  return this.has$Value(47);\n};\n\n\n/**\n * @return {number} The number of values in the a field.\n */\nproto2.TestAllTypes.RepeatedGroup.prototype.aCount = function() {\n  return this.count$Values(47);\n};\n\n\n/**\n * Clears the values in the a field.\n */\nproto2.TestAllTypes.RepeatedGroup.prototype.clearA = function() {\n  this.clear$Field(47);\n};\n\n\n\n/**\n * Message TestDefaultParent.\n * @constructor\n * @extends {goog.proto2.Message}\n * @final\n */\nproto2.TestDefaultParent = function() {\n  goog.proto2.Message.call(this);\n};\ngoog.inherits(proto2.TestDefaultParent, goog.proto2.Message);\n\n\n/**\n * Descriptor for this message, deserialized lazily in getDescriptor().\n * @private {?goog.proto2.Descriptor}\n */\nproto2.TestDefaultParent.descriptor_ = null;\n\n\n/**\n * Overrides {@link goog.proto2.Message#clone} to specify its exact return type.\n * @return {!proto2.TestDefaultParent} The cloned message.\n * @override\n */\nproto2.TestDefaultParent.prototype.clone;\n\n\n/**\n * Gets the value of the child field.\n * @return {?proto2.TestDefaultChild} The value.\n */\nproto2.TestDefaultParent.prototype.getChild = function() {\n  return /** @type {?proto2.TestDefaultChild} */ (this.get$Value(1));\n};\n\n\n/**\n * Gets the value of the child field or the default value if not set.\n * @return {!proto2.TestDefaultChild} The value.\n */\nproto2.TestDefaultParent.prototype.getChildOrDefault = function() {\n  return /** @type {!proto2.TestDefaultChild} */ (this.get$ValueOrDefault(1));\n};\n\n\n/**\n * Sets the value of the child field.\n * @param {!proto2.TestDefaultChild} value The value.\n */\nproto2.TestDefaultParent.prototype.setChild = function(value) {\n  this.set$Value(1, value);\n};\n\n\n/**\n * @return {boolean} Whether the child field has a value.\n */\nproto2.TestDefaultParent.prototype.hasChild = function() {\n  return this.has$Value(1);\n};\n\n\n/**\n * @return {number} The number of values in the child field.\n */\nproto2.TestDefaultParent.prototype.childCount = function() {\n  return this.count$Values(1);\n};\n\n\n/**\n * Clears the values in the child field.\n */\nproto2.TestDefaultParent.prototype.clearChild = function() {\n  this.clear$Field(1);\n};\n\n\n\n/**\n * Message TestDefaultChild.\n * @constructor\n * @extends {goog.proto2.Message}\n * @final\n */\nproto2.TestDefaultChild = function() {\n  goog.proto2.Message.call(this);\n};\ngoog.inherits(proto2.TestDefaultChild, goog.proto2.Message);\n\n\n/**\n * Descriptor for this message, deserialized lazily in getDescriptor().\n * @private {?goog.proto2.Descriptor}\n */\nproto2.TestDefaultChild.descriptor_ = null;\n\n\n/**\n * Overrides {@link goog.proto2.Message#clone} to specify its exact return type.\n * @return {!proto2.TestDefaultChild} The cloned message.\n * @override\n */\nproto2.TestDefaultChild.prototype.clone;\n\n\n/**\n * Gets the value of the foo field.\n * @return {?boolean} The value.\n */\nproto2.TestDefaultChild.prototype.getFoo = function() {\n  return /** @type {?boolean} */ (this.get$Value(1));\n};\n\n\n/**\n * Gets the value of the foo field or the default value if not set.\n * @return {boolean} The value.\n */\nproto2.TestDefaultChild.prototype.getFooOrDefault = function() {\n  return /** @type {boolean} */ (this.get$ValueOrDefault(1));\n};\n\n\n/**\n * Sets the value of the foo field.\n * @param {boolean} value The value.\n */\nproto2.TestDefaultChild.prototype.setFoo = function(value) {\n  this.set$Value(1, value);\n};\n\n\n/**\n * @return {boolean} Whether the foo field has a value.\n */\nproto2.TestDefaultChild.prototype.hasFoo = function() {\n  return this.has$Value(1);\n};\n\n\n/**\n * @return {number} The number of values in the foo field.\n */\nproto2.TestDefaultChild.prototype.fooCount = function() {\n  return this.count$Values(1);\n};\n\n\n/**\n * Clears the values in the foo field.\n */\nproto2.TestDefaultChild.prototype.clearFoo = function() {\n  this.clear$Field(1);\n};\n\n\n/** @override */\nproto2.TestAllTypes.prototype.getDescriptor = function() {\n  var descriptor = proto2.TestAllTypes.descriptor_;\n  if (!descriptor) {\n    // The descriptor is created lazily when we instantiate a new instance.\n    var descriptorObj = {\n      0: {\n        name: 'TestAllTypes',\n        fullName: 'TestAllTypes'\n      },\n      1: {\n        name: 'optional_int32',\n        fieldType: goog.proto2.Message.FieldType.INT32,\n        type: Number\n      },\n      2: {\n        name: 'optional_int64',\n        fieldType: goog.proto2.Message.FieldType.INT64,\n        defaultValue: '1',\n        type: String\n      },\n      3: {\n        name: 'optional_uint32',\n        fieldType: goog.proto2.Message.FieldType.UINT32,\n        type: Number\n      },\n      4: {\n        name: 'optional_uint64',\n        fieldType: goog.proto2.Message.FieldType.UINT64,\n        type: String\n      },\n      5: {\n        name: 'optional_sint32',\n        fieldType: goog.proto2.Message.FieldType.SINT32,\n        type: Number\n      },\n      6: {\n        name: 'optional_sint64',\n        fieldType: goog.proto2.Message.FieldType.SINT64,\n        type: String\n      },\n      7: {\n        name: 'optional_fixed32',\n        fieldType: goog.proto2.Message.FieldType.FIXED32,\n        type: Number\n      },\n      8: {\n        name: 'optional_fixed64',\n        fieldType: goog.proto2.Message.FieldType.FIXED64,\n        type: String\n      },\n      9: {\n        name: 'optional_sfixed32',\n        fieldType: goog.proto2.Message.FieldType.SFIXED32,\n        type: Number\n      },\n      10: {\n        name: 'optional_sfixed64',\n        fieldType: goog.proto2.Message.FieldType.SFIXED64,\n        type: String\n      },\n      11: {\n        name: 'optional_float',\n        fieldType: goog.proto2.Message.FieldType.FLOAT,\n        defaultValue: 1.5,\n        type: Number\n      },\n      12: {\n        name: 'optional_double',\n        fieldType: goog.proto2.Message.FieldType.DOUBLE,\n        type: Number\n      },\n      13: {\n        name: 'optional_bool',\n        fieldType: goog.proto2.Message.FieldType.BOOL,\n        type: Boolean\n      },\n      14: {\n        name: 'optional_string',\n        fieldType: goog.proto2.Message.FieldType.STRING,\n        type: String\n      },\n      15: {\n        name: 'optional_bytes',\n        fieldType: goog.proto2.Message.FieldType.BYTES,\n        defaultValue: 'moo',\n        type: String\n      },\n      16: {\n        name: 'optionalgroup',\n        fieldType: goog.proto2.Message.FieldType.GROUP,\n        type: proto2.TestAllTypes.OptionalGroup\n      },\n      18: {\n        name: 'optional_nested_message',\n        fieldType: goog.proto2.Message.FieldType.MESSAGE,\n        type: proto2.TestAllTypes.NestedMessage\n      },\n      21: {\n        name: 'optional_nested_enum',\n        fieldType: goog.proto2.Message.FieldType.ENUM,\n        defaultValue: proto2.TestAllTypes.NestedEnum.FOO,\n        type: proto2.TestAllTypes.NestedEnum\n      },\n      50: {\n        name: 'optional_int64_number',\n        fieldType: goog.proto2.Message.FieldType.INT64,\n        defaultValue: 1000000000000000001,\n        type: Number\n      },\n      51: {\n        name: 'optional_int64_string',\n        fieldType: goog.proto2.Message.FieldType.INT64,\n        defaultValue: '1000000000000000001',\n        type: String\n      },\n      31: {\n        name: 'repeated_int32',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.INT32,\n        type: Number\n      },\n      32: {\n        name: 'repeated_int64',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.INT64,\n        type: String\n      },\n      33: {\n        name: 'repeated_uint32',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.UINT32,\n        type: Number\n      },\n      34: {\n        name: 'repeated_uint64',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.UINT64,\n        type: String\n      },\n      35: {\n        name: 'repeated_sint32',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.SINT32,\n        type: Number\n      },\n      36: {\n        name: 'repeated_sint64',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.SINT64,\n        type: String\n      },\n      37: {\n        name: 'repeated_fixed32',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.FIXED32,\n        type: Number\n      },\n      38: {\n        name: 'repeated_fixed64',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.FIXED64,\n        type: String\n      },\n      39: {\n        name: 'repeated_sfixed32',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.SFIXED32,\n        type: Number\n      },\n      40: {\n        name: 'repeated_sfixed64',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.SFIXED64,\n        type: String\n      },\n      41: {\n        name: 'repeated_float',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.FLOAT,\n        type: Number\n      },\n      42: {\n        name: 'repeated_double',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.DOUBLE,\n        type: Number\n      },\n      43: {\n        name: 'repeated_bool',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.BOOL,\n        type: Boolean\n      },\n      44: {\n        name: 'repeated_string',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.STRING,\n        type: String\n      },\n      45: {\n        name: 'repeated_bytes',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.BYTES,\n        type: String\n      },\n      46: {\n        name: 'repeatedgroup',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.GROUP,\n        type: proto2.TestAllTypes.RepeatedGroup\n      },\n      48: {\n        name: 'repeated_nested_message',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.MESSAGE,\n        type: proto2.TestAllTypes.NestedMessage\n      },\n      49: {\n        name: 'repeated_nested_enum',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.ENUM,\n        defaultValue: proto2.TestAllTypes.NestedEnum.FOO,\n        type: proto2.TestAllTypes.NestedEnum\n      },\n      52: {\n        name: 'repeated_int64_number',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.INT64,\n        type: Number\n      },\n      53: {\n        name: 'repeated_int64_string',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.INT64,\n        type: String\n      },\n      54: {\n        name: 'packed_int32',\n        repeated: true,\n        packed: true,\n        fieldType: goog.proto2.Message.FieldType.INT32,\n        type: Number\n      },\n      55: {\n        name: 'packed_int64',\n        repeated: true,\n        packed: true,\n        fieldType: goog.proto2.Message.FieldType.INT64,\n        type: Number\n      },\n      56: {\n        name: 'packed_uint32',\n        repeated: true,\n        packed: true,\n        fieldType: goog.proto2.Message.FieldType.UINT32,\n        type: Number\n      },\n      57: {\n        name: 'packed_uint64',\n        repeated: true,\n        packed: true,\n        fieldType: goog.proto2.Message.FieldType.UINT64,\n        type: Number\n      },\n      58: {\n        name: 'packed_sint32',\n        repeated: true,\n        packed: true,\n        fieldType: goog.proto2.Message.FieldType.SINT32,\n        type: Number\n      },\n      59: {\n        name: 'packed_sint64',\n        repeated: true,\n        packed: true,\n        fieldType: goog.proto2.Message.FieldType.SINT64,\n        type: Number\n      },\n      60: {\n        name: 'packed_fixed32',\n        repeated: true,\n        packed: true,\n        fieldType: goog.proto2.Message.FieldType.FIXED32,\n        type: Number\n      },\n      61: {\n        name: 'packed_fixed64',\n        repeated: true,\n        packed: true,\n        fieldType: goog.proto2.Message.FieldType.FIXED64,\n        type: Number\n      },\n      62: {\n        name: 'packed_sfixed32',\n        repeated: true,\n        packed: true,\n        fieldType: goog.proto2.Message.FieldType.SFIXED32,\n        type: Number\n      },\n      63: {\n        name: 'packed_sfixed64',\n        repeated: true,\n        packed: true,\n        fieldType: goog.proto2.Message.FieldType.SFIXED64,\n        type: Number\n      },\n      64: {\n        name: 'packed_float',\n        repeated: true,\n        packed: true,\n        fieldType: goog.proto2.Message.FieldType.FLOAT,\n        type: Number\n      },\n      65: {\n        name: 'packed_double',\n        repeated: true,\n        packed: true,\n        fieldType: goog.proto2.Message.FieldType.DOUBLE,\n        type: Number\n      },\n      66: {\n        name: 'packed_bool',\n        repeated: true,\n        packed: true,\n        fieldType: goog.proto2.Message.FieldType.BOOL,\n        type: Boolean\n      }\n    };\n    proto2.TestAllTypes.descriptor_ = descriptor =\n        goog.proto2.Message.createDescriptor(\n             proto2.TestAllTypes, descriptorObj);\n  }\n  return descriptor;\n};\n\n\n/** @nocollapse */\nproto2.TestAllTypes.getDescriptor =\n    proto2.TestAllTypes.prototype.getDescriptor;\n\n\n/** @override */\nproto2.TestAllTypes.NestedMessage.prototype.getDescriptor = function() {\n  var descriptor = proto2.TestAllTypes.NestedMessage.descriptor_;\n  if (!descriptor) {\n    // The descriptor is created lazily when we instantiate a new instance.\n    var descriptorObj = {\n      0: {\n        name: 'NestedMessage',\n        containingType: proto2.TestAllTypes,\n        fullName: 'TestAllTypes.NestedMessage'\n      },\n      1: {\n        name: 'b',\n        fieldType: goog.proto2.Message.FieldType.INT32,\n        type: Number\n      },\n      2: {\n        name: 'c',\n        fieldType: goog.proto2.Message.FieldType.INT32,\n        type: Number\n      }\n    };\n    proto2.TestAllTypes.NestedMessage.descriptor_ = descriptor =\n        goog.proto2.Message.createDescriptor(\n             proto2.TestAllTypes.NestedMessage, descriptorObj);\n  }\n  return descriptor;\n};\n\n\n/** @nocollapse */\nproto2.TestAllTypes.NestedMessage.getDescriptor =\n    proto2.TestAllTypes.NestedMessage.prototype.getDescriptor;\n\n\n/** @override */\nproto2.TestAllTypes.OptionalGroup.prototype.getDescriptor = function() {\n  var descriptor = proto2.TestAllTypes.OptionalGroup.descriptor_;\n  if (!descriptor) {\n    // The descriptor is created lazily when we instantiate a new instance.\n    var descriptorObj = {\n      0: {\n        name: 'OptionalGroup',\n        containingType: proto2.TestAllTypes,\n        fullName: 'TestAllTypes.OptionalGroup'\n      },\n      17: {\n        name: 'a',\n        fieldType: goog.proto2.Message.FieldType.INT32,\n        type: Number\n      }\n    };\n    proto2.TestAllTypes.OptionalGroup.descriptor_ = descriptor =\n        goog.proto2.Message.createDescriptor(\n             proto2.TestAllTypes.OptionalGroup, descriptorObj);\n  }\n  return descriptor;\n};\n\n\n/** @nocollapse */\nproto2.TestAllTypes.OptionalGroup.getDescriptor =\n    proto2.TestAllTypes.OptionalGroup.prototype.getDescriptor;\n\n\n/** @override */\nproto2.TestAllTypes.RepeatedGroup.prototype.getDescriptor = function() {\n  var descriptor = proto2.TestAllTypes.RepeatedGroup.descriptor_;\n  if (!descriptor) {\n    // The descriptor is created lazily when we instantiate a new instance.\n    var descriptorObj = {\n      0: {\n        name: 'RepeatedGroup',\n        containingType: proto2.TestAllTypes,\n        fullName: 'TestAllTypes.RepeatedGroup'\n      },\n      47: {\n        name: 'a',\n        repeated: true,\n        fieldType: goog.proto2.Message.FieldType.INT32,\n        type: Number\n      }\n    };\n    proto2.TestAllTypes.RepeatedGroup.descriptor_ = descriptor =\n        goog.proto2.Message.createDescriptor(\n             proto2.TestAllTypes.RepeatedGroup, descriptorObj);\n  }\n  return descriptor;\n};\n\n\n/** @nocollapse */\nproto2.TestAllTypes.RepeatedGroup.getDescriptor =\n    proto2.TestAllTypes.RepeatedGroup.prototype.getDescriptor;\n\n\n/** @override */\nproto2.TestDefaultParent.prototype.getDescriptor = function() {\n  var descriptor = proto2.TestDefaultParent.descriptor_;\n  if (!descriptor) {\n    // The descriptor is created lazily when we instantiate a new instance.\n    var descriptorObj = {\n      0: {\n        name: 'TestDefaultParent',\n        fullName: 'TestDefaultParent'\n      },\n      1: {\n        name: 'child',\n        fieldType: goog.proto2.Message.FieldType.MESSAGE,\n        type: proto2.TestDefaultChild\n      }\n    };\n    proto2.TestDefaultParent.descriptor_ = descriptor =\n        goog.proto2.Message.createDescriptor(\n             proto2.TestDefaultParent, descriptorObj);\n  }\n  return descriptor;\n};\n\n\n/** @nocollapse */\nproto2.TestDefaultParent.getDescriptor =\n    proto2.TestDefaultParent.prototype.getDescriptor;\n\n\n/** @override */\nproto2.TestDefaultChild.prototype.getDescriptor = function() {\n  var descriptor = proto2.TestDefaultChild.descriptor_;\n  if (!descriptor) {\n    // The descriptor is created lazily when we instantiate a new instance.\n    var descriptorObj = {\n      0: {\n        name: 'TestDefaultChild',\n        fullName: 'TestDefaultChild'\n      },\n      1: {\n        name: 'foo',\n        fieldType: goog.proto2.Message.FieldType.BOOL,\n        defaultValue: true,\n        type: Boolean\n      }\n    };\n    proto2.TestDefaultChild.descriptor_ = descriptor =\n        goog.proto2.Message.createDescriptor(\n             proto2.TestDefaultChild, descriptorObj);\n  }\n  return descriptor;\n};\n\n\n/** @nocollapse */\nproto2.TestDefaultChild.getDescriptor =\n    proto2.TestDefaultChild.prototype.getDescriptor;\n","^;",1579837703000,"^<",["^=",["^?","^6C"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/proto2/test.pb.js"],"^O",["^=",["~$proto2.TestAllTypes.NestedMessage","~$proto2.TestAllTypes.NestedEnum","~$proto2.TestAllTypes.RepeatedGroup","~$proto2.TestDefaultParent","~$proto2.TestDefaultChild","~$proto2.TestAllTypes.OptionalGroup","~$proto2.TestAllTypes"]],"^W",true,"^X",["^?","^6C"]],["^ ","^3",[1579837703000],"^4","goog.debug.tracer.js","^5",["^6","goog/debug/tracer.js"],"^7","goog/debug/tracer.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the Tracer class and associated classes.\n *\n * @see ../demos/tracer.html\n * @suppress {strictMissingProperties}\n */\n\ngoog.provide('goog.debug.StopTraceDetail');\ngoog.provide('goog.debug.Trace');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.debug.Logger');\ngoog.require('goog.iter');\ngoog.require('goog.log');\ngoog.require('goog.structs.Map');\ngoog.require('goog.structs.SimplePool');\n\n\n\n/**\n * Class used for singleton goog.debug.Trace.  Used for timing slow points in\n * the code. Based on the java Tracer class but optimized for javascript.\n * See com.google.common.tracing.Tracer.\n * It is also possible to bridge from this class to other tracer classes via\n * adding listeners.\n * @constructor\n * @private\n */\ngoog.debug.Trace_ = function() {\n\n  /**\n   * Events in order.\n   * @private {!Array<!goog.debug.Trace_.Event_>}\n   */\n  this.events_ = [];\n\n  /**\n   * Outstanding events that have started but haven't yet ended. The keys are\n   * numeric ids and the values are goog.debug.Trace_.Event_ objects.\n   * @private {!goog.structs.Map<number, !goog.debug.Trace_.Event_>}\n   */\n  this.outstandingEvents_ = new goog.structs.Map();\n\n  /**\n   * Start time of the event trace\n   * @private {number}\n   */\n  this.startTime_ = 0;\n\n  /**\n   * Cummulative overhead of calls to startTracer\n   * @private {number}\n   */\n  this.tracerOverheadStart_ = 0;\n\n  /**\n   * Cummulative overhead of calls to endTracer\n   * @private {number}\n   */\n  this.tracerOverheadEnd_ = 0;\n\n  /**\n   * Cummulative overhead of calls to addComment\n   * @private {number}\n   */\n  this.tracerOverheadComment_ = 0;\n\n  /**\n   * Keeps stats on different types of tracers. The keys are strings and the\n   * values are goog.debug.Stat\n   * @private {!goog.structs.Map}\n   */\n  this.stats_ = new goog.structs.Map();\n\n  /**\n   * Total number of traces created in the trace.\n   * @private {number}\n   */\n  this.tracerCount_ = 0;\n\n  /**\n   * Total number of comments created in the trace.\n   * @private {number}\n   */\n  this.commentCount_ = 0;\n\n  /**\n   * Next id to use for the trace.\n   * @private {number}\n   */\n  this.nextId_ = 1;\n\n  /**\n   * A pool for goog.debug.Trace_.Event_ objects so we don't keep creating and\n   * garbage collecting these (which is very expensive in IE6).\n   * @private {!goog.structs.SimplePool}\n   */\n  this.eventPool_ = new goog.structs.SimplePool(0, 4000);\n  this.eventPool_.createObject = function() {\n    return new goog.debug.Trace_.Event_();\n  };\n\n\n  /**\n   * A pool for goog.debug.Trace_.Stat_ objects so we don't keep creating and\n   * garbage collecting these (which is very expensive in IE6).\n   * @private {!goog.structs.SimplePool}\n   */\n  this.statPool_ = new goog.structs.SimplePool(0, 50);\n  this.statPool_.createObject = function() {\n    return new goog.debug.Trace_.Stat_();\n  };\n\n  var self = this;\n\n  /** @private {!goog.structs.SimplePool<number>} */\n  this.idPool_ = new goog.structs.SimplePool(0, 2000);\n  this.idPool_.setCreateObjectFn(function() {\n    return self.nextId_++;\n  });\n\n  /**\n   * Default threshold below which a tracer shouldn't be reported\n   * @private {number}\n   */\n  this.defaultThreshold_ = 3;\n\n  /**\n   * An object containing three callback functions to be called when starting or\n   * stopping a trace, or creating a comment trace.\n   * @private {!goog.debug.Trace_.TracerCallbacks}\n   */\n  this.traceCallbacks_ = {};\n};\n\n\n/**\n * Logger for the tracer\n * @private @const {?goog.log.Logger}\n */\ngoog.debug.Trace_.prototype.logger_ = goog.log.getLogger('goog.debug.Trace');\n\n\n/**\n * Maximum size of the trace before we discard events\n * @type {number}\n */\ngoog.debug.Trace_.prototype.MAX_TRACE_SIZE = 1000;\n\n\n/**\n * Event type supported by tracer\n * @enum {number}\n */\ngoog.debug.Trace_.EventType = {\n  /**\n   * Start event type\n   */\n  START: 0,\n\n  /**\n   * Stop event type\n   */\n  STOP: 1,\n\n  /**\n   * Comment event type\n   */\n  COMMENT: 2\n};\n\n\n\n/**\n * Class to keep track of a stat of a single tracer type. Stores the count\n * and cumulative time.\n * @constructor\n * @private\n */\ngoog.debug.Trace_.Stat_ = function() {\n  /**\n   * Number of tracers\n   * @type {number}\n   */\n  this.count = 0;\n\n  /**\n   * Cumulative time of traces\n   * @type {number}\n   */\n  this.time = 0;\n\n  /**\n   * Total number of allocations for this tracer type\n   * @type {number}\n   */\n  this.varAlloc = 0;\n};\n\n\n/**\n * @type {string|null|undefined}\n */\ngoog.debug.Trace_.Stat_.prototype.type;\n\n\n/**\n * @return {string} A string describing the tracer stat.\n * @override\n */\ngoog.debug.Trace_.Stat_.prototype.toString = function() {\n  var sb = [];\n  sb.push(\n      this.type, ' ', this.count, ' (', Math.round(this.time * 10) / 10,\n      ' ms)');\n  if (this.varAlloc) {\n    sb.push(' [VarAlloc = ', this.varAlloc, ']');\n  }\n  return sb.join('');\n};\n\n\n\n/**\n * Private class used to encapsulate a single event, either the start or stop\n * of a tracer.\n * @constructor\n * @private\n */\ngoog.debug.Trace_.Event_ = function() {\n  // the fields are different for different events - see usage in code\n};\n\n\n/**\n * @type {string|null|undefined}\n */\ngoog.debug.Trace_.Event_.prototype.type;\n\n\n/**\n * @type {goog.debug.Trace_.EventType|undefined}\n */\ngoog.debug.Trace_.Event_.prototype.eventType;\n\n\n/**\n * @type {number|undefined}\n */\ngoog.debug.Trace_.Event_.prototype.id;\n\n\n/**\n * @type {string|undefined}\n */\ngoog.debug.Trace_.Event_.prototype.comment;\n\n\n/**\n * Returns a formatted string for the event.\n * @param {number} startTime The start time of the trace to generate relative\n * times.\n * @param {number} prevTime The completion time of the previous event or -1.\n * @param {string} indent Extra indent for the message\n *     if there was no previous event.\n * @return {string} The formatted tracer string.\n */\ngoog.debug.Trace_.Event_.prototype.toTraceString = function(\n    startTime, prevTime, indent) {\n  var sb = [];\n\n  if (prevTime == -1) {\n    sb.push('    ');\n  } else {\n    sb.push(goog.debug.Trace_.longToPaddedString_(this.eventTime - prevTime));\n  }\n\n  sb.push(' ', goog.debug.Trace_.formatTime_(this.eventTime - startTime));\n  if (this.eventType == goog.debug.Trace_.EventType.START) {\n    sb.push(' Start        ');\n  } else if (this.eventType == goog.debug.Trace_.EventType.STOP) {\n    sb.push(' Done ');\n    var delta = this.stopTime - this.startTime;\n    sb.push(goog.debug.Trace_.longToPaddedString_(delta), ' ms ');\n  } else {\n    sb.push(' Comment      ');\n  }\n\n  sb.push(indent, this);\n  if (this.totalVarAlloc > 0) {\n    sb.push('[VarAlloc ', this.totalVarAlloc, '] ');\n  }\n  return sb.join('');\n};\n\n\n/**\n * @return {string} A string describing the tracer event.\n * @override\n */\ngoog.debug.Trace_.Event_.prototype.toString = function() {\n  if (this.type == null) {\n    return goog.asserts.assert(this.comment);\n  } else {\n    return '[' + this.type + '] ' + this.comment;\n  }\n};\n\n\n/**\n * A class to specify the types of the callback functions used by\n * `addTraceCallbacks`.\n * @record\n */\ngoog.debug.Trace_.TracerCallbacks = function() {\n  /**\n   * A callback function to be called at `startTrace` with two parameters:\n   * a number as the started trace id and a string as the comment on the trace.\n   * @type {function(number, string)|undefined}\n   */\n  this.start;\n  /**\n   * A callback function to be called when a trace should be stopped either at\n   * `startTrace` or `clearOutstandingEvents_` with two parameters:\n   * a number as the id of the trace being stopped and an object containing\n   * extra information about stopping the trace (e.g. if it is cancelled).\n   * @type {function(number, !goog.debug.StopTraceDetail)|undefined}\n   */\n  this.stop;\n  /**\n   * A callback function to be called at `addComment` with two parameters:\n   * a string as the comment on the trace and an optional time stamp number (in\n   * milliseconds since epoch) when the comment should be added as a trace.\n   * @type {function(string, number=)|undefined}\n   */\n  this.comment;\n};\n\n\n/** @private @const {!goog.debug.StopTraceDetail} */\ngoog.debug.Trace_.TRACE_CANCELLED_ = {\n  wasCancelled: true\n};\n\n\n/** @private @const {!goog.debug.StopTraceDetail} */\ngoog.debug.Trace_.NORMAL_STOP_ = {};\n\n\n/**\n * A function that combines two function with the same parameters in a sequence.\n * @param {!Function|undefined} fn1 The first function to be combined.\n * @param {!Function|undefined} fn2 The second function to be combined.\n * @return {!Function|undefined} A function that calls the inputs in sequence.\n * @private\n */\ngoog.debug.Trace_.TracerCallbacks.sequence_ = function(fn1, fn2) {\n  return !fn1 ? fn2 : !fn2 ? fn1 : function() {\n    fn1.apply(undefined, arguments);\n    fn2.apply(undefined, arguments);\n  };\n};\n\n\n/**\n * Removes all registered callback functions. Mainly used for testing.\n */\ngoog.debug.Trace_.prototype.removeAllListeners = function() {\n  this.traceCallbacks_ = {};\n};\n\n\n/**\n * Adds up to three callback functions which are called on `startTracer`,\n * `stopTracer`, `clearOutstandingEvents_` and `addComment` in\n * order to bridge from the Closure tracer singleton object to any tracer class.\n * @param {!goog.debug.Trace_.TracerCallbacks} callbacks An object literal\n *   containing the callback functions.\n */\ngoog.debug.Trace_.prototype.addTraceCallbacks = function(callbacks) {\n  this.traceCallbacks_.start = goog.debug.Trace_.TracerCallbacks.sequence_(\n      this.traceCallbacks_.start, callbacks.start);\n  this.traceCallbacks_.stop = goog.debug.Trace_.TracerCallbacks.sequence_(\n      this.traceCallbacks_.stop, callbacks.stop);\n  this.traceCallbacks_.comment = goog.debug.Trace_.TracerCallbacks.sequence_(\n      this.traceCallbacks_.comment, callbacks.comment);\n};\n\n\n/**\n * Add the ability to explicitly set the start time. This is useful for example\n * for measuring initial load time where you can set a variable as soon as the\n * main page of the app is loaded and then later call this function when the\n * Tracer code has been loaded.\n * @param {number} startTime The start time to set.\n */\ngoog.debug.Trace_.prototype.setStartTime = function(startTime) {\n  this.startTime_ = startTime;\n};\n\n\n/**\n * Initializes and resets the current trace\n * @param {number} defaultThreshold The default threshold below which the\n * tracer output will be suppressed. Can be overridden on a per-Tracer basis.\n */\ngoog.debug.Trace_.prototype.initCurrentTrace = function(defaultThreshold) {\n  this.reset(defaultThreshold);\n};\n\n\n/**\n * Clears the current trace\n */\ngoog.debug.Trace_.prototype.clearCurrentTrace = function() {\n  this.reset(0);\n};\n\n\n/**\n * Clears the open traces and calls stop callback for them.\n * @private\n */\ngoog.debug.Trace_.prototype.clearOutstandingEvents_ = function() {\n  if (this.traceCallbacks_.stop) {\n    goog.iter.forEach(this.outstandingEvents_, function(startEvent) {\n      this.traceCallbacks_.stop(\n          startEvent.id, goog.debug.Trace_.TRACE_CANCELLED_);\n    }, this);\n  }\n  this.outstandingEvents_.clear();\n};\n\n\n/**\n * Resets the trace.\n * @param {number} defaultThreshold The default threshold below which the\n * tracer output will be suppressed. Can be overridden on a per-Tracer basis.\n */\ngoog.debug.Trace_.prototype.reset = function(defaultThreshold) {\n  this.defaultThreshold_ = defaultThreshold;\n\n  this.clearOutstandingEvents_();\n  this.releaseEvents_();\n  this.startTime_ = goog.debug.Trace_.now();\n  this.tracerOverheadStart_ = 0;\n  this.tracerOverheadEnd_ = 0;\n  this.tracerOverheadComment_ = 0;\n  this.tracerCount_ = 0;\n  this.commentCount_ = 0;\n\n  var keys = this.stats_.getKeys();\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    var stat = this.stats_.get(key);\n    stat.count = 0;\n    stat.time = 0;\n    stat.varAlloc = 0;\n    this.statPool_.releaseObject(/** @type {Object} */ (stat));\n  }\n  this.stats_.clear();\n};\n\n\n/**\n * @private\n */\ngoog.debug.Trace_.prototype.releaseEvents_ = function() {\n  for (var i = 0; i < this.events_.length; i++) {\n    var event = this.events_[i];\n    if (event.id) {  // Only start events have id.\n      // Only release the start event and its id if it is already stopped - this\n      // is to avoid having multiple traces with the same id.\n      if (!this.outstandingEvents_.containsKey(event.id)) {\n        this.idPool_.releaseObject(event.id);\n        this.eventPool_.releaseObject(event);\n      }\n    } else {  // Release stop and comment events.\n      this.eventPool_.releaseObject(event);\n    }\n  }\n  this.events_.length = 0;\n};\n\n\n/**\n * Starts a tracer\n * @param {string} comment A comment used to identify the tracer. Does not\n *     need to be unique.\n * @param {string=} opt_type Type used to identify the tracer. If a Trace is\n *     given a type (the first argument to the constructor) and multiple Traces\n *     are done on that type then a \"TOTAL line will be produced showing the\n *     total number of traces and the sum of the time\n *     (\"TOTAL Database 2 (37 ms)\" in our example). These traces should be\n *     mutually exclusive or else the sum won't make sense (the time will\n *     be double counted if the second starts before the first ends).\n * @return {number} The identifier for the tracer that should be passed to the\n *     the stopTracer method.\n */\ngoog.debug.Trace_.prototype.startTracer = function(comment, opt_type) {\n  var tracerStartTime = goog.debug.Trace_.now();\n  var varAlloc = this.getTotalVarAlloc();\n  var outstandingEventCount = this.outstandingEvents_.getCount();\n  if (this.events_.length + outstandingEventCount > this.MAX_TRACE_SIZE) {\n    // This is less likely and probably indicates that a lot of traces\n    // aren't being closed. We want to avoid unnecessarily clearing\n    // this though in case the events do eventually finish.\n    if (outstandingEventCount > this.MAX_TRACE_SIZE / 2) {\n      goog.log.warning(\n          this.logger_, 'Giant thread trace. Clearing outstanding events.');\n      this.clearOutstandingEvents_();\n    }\n    // This is the more likely case. This usually means that we\n    // either forgot to clear the trace or else we are performing a\n    // very large number of events\n    if (this.events_.length > this.MAX_TRACE_SIZE / 2) {\n      goog.log.warning(\n          this.logger_, 'Giant thread trace. Clearing to avoid memory leak.');\n      this.releaseEvents_();\n    }\n  }\n\n  goog.debug.Logger.logToProfilers('Start : ' + comment);\n\n  /** @const */\n  var event =\n      /** @type {!goog.debug.Trace_.Event_} */ (this.eventPool_.getObject());\n  event.stopTime = undefined;\n  event.totalVarAlloc = varAlloc;\n  event.eventType = goog.debug.Trace_.EventType.START;\n  event.id = this.idPool_.getObject();\n  event.comment = comment;\n  event.type = opt_type;\n  this.events_.push(event);\n  this.outstandingEvents_.set(String(event.id), event);\n  this.tracerCount_++;\n  var now = goog.debug.Trace_.now();\n  event.startTime = event.eventTime = now;\n  this.tracerOverheadStart_ += now - tracerStartTime;\n  if (this.traceCallbacks_.start) {\n    this.traceCallbacks_.start(event.id, event.toString());\n  }\n  return event.id;\n};\n\n\n/**\n * Stops a tracer\n * @param {number|undefined|null} id The id of the tracer that is ending.\n * @param {number=} opt_silenceThreshold Threshold below which the tracer is\n *    silenced.\n * @return {?number} The elapsed time for the tracer or null if the tracer\n *    identitifer was not recognized.\n */\ngoog.debug.Trace_.prototype.stopTracer = function(id, opt_silenceThreshold) {\n  // this used to call goog.isDef(opt_silenceThreshold) but that causes an\n  // object allocation in IE for some reason (doh!). The following code doesn't\n  // cause an allocation\n  var now = goog.debug.Trace_.now();\n  var silenceThreshold;\n  if (opt_silenceThreshold === 0) {\n    silenceThreshold = 0;\n  } else if (opt_silenceThreshold) {\n    silenceThreshold = opt_silenceThreshold;\n  } else {\n    silenceThreshold = this.defaultThreshold_;\n  }\n\n  var startEvent = this.outstandingEvents_.get(String(id));\n  if (startEvent == null) {\n    return null;\n  }\n  goog.asserts.assertNumber(id);\n  if (this.traceCallbacks_.stop) {\n    this.traceCallbacks_.stop(Number(id), goog.debug.Trace_.NORMAL_STOP_);\n  }\n\n  this.outstandingEvents_.remove(String(id));\n\n  var stopEvent;\n  var elapsed = now - startEvent.startTime;\n  if (elapsed < silenceThreshold) {\n    var count = this.events_.length;\n    for (var i = count - 1; i >= 0; i--) {\n      var nextEvent = this.events_[i];\n      if (nextEvent == startEvent) {\n        this.events_.splice(i, 1);\n        this.idPool_.releaseObject(startEvent.id);\n        this.eventPool_.releaseObject(/** @type {Object} */ (startEvent));\n        break;\n      }\n    }\n  } else {\n    stopEvent =\n        /** @type {goog.debug.Trace_.Event_} */ (this.eventPool_.getObject());\n    stopEvent.id = undefined;\n    stopEvent.eventType = goog.debug.Trace_.EventType.STOP;\n    stopEvent.startTime = startEvent.startTime;\n    stopEvent.comment = startEvent.comment;\n    stopEvent.type = startEvent.type;\n    stopEvent.stopTime = stopEvent.eventTime = now;\n\n    this.events_.push(stopEvent);\n  }\n\n  var type = startEvent.type;\n  var stat = null;\n  if (type) {\n    stat = this.getStat_(type);\n    stat.count++;\n    stat.time += elapsed;\n  }\n  if (stopEvent) {\n    goog.debug.Logger.logToProfilers('Stop : ' + stopEvent.comment);\n\n    stopEvent.totalVarAlloc = this.getTotalVarAlloc();\n\n    if (stat) {\n      stat.varAlloc += (stopEvent.totalVarAlloc - startEvent.totalVarAlloc);\n    }\n  }\n  var tracerFinishTime = goog.debug.Trace_.now();\n  this.tracerOverheadEnd_ += tracerFinishTime - now;\n  return elapsed;\n};\n\n\n/**\n * Sets the ActiveX object that can be used to get GC tracing in IE6.\n * @param {Object} gcTracer GCTracer ActiveX object.\n */\ngoog.debug.Trace_.prototype.setGcTracer = function(gcTracer) {\n  this.gcTracer_ = gcTracer;\n};\n\n\n/**\n * Returns the total number of allocations since the GC stats were reset. Only\n * works in IE.\n * @return {number} The number of allocaitons or -1 if not supported.\n */\ngoog.debug.Trace_.prototype.getTotalVarAlloc = function() {\n  var gcTracer = this.gcTracer_;\n  // isTracing is defined on the ActiveX object.\n  if (gcTracer && gcTracer['isTracing']()) {\n    return gcTracer['totalVarAlloc'];\n  }\n  return -1;\n};\n\n\n/**\n * Adds a comment to the trace. Makes it possible to see when a specific event\n * happened in relation to the traces.\n * @param {string} comment A comment that is inserted into the trace.\n * @param {?string=} opt_type Type used to identify the tracer. If a comment is\n *     given a type and multiple comments are done on that type then a \"TOTAL\n *     line will be produced showing the total number of comments of that type.\n * @param {?number=} opt_timeStamp The timestamp to insert the comment. If not\n *    specified, the current time wil be used.\n */\ngoog.debug.Trace_.prototype.addComment = function(\n    comment, opt_type, opt_timeStamp) {\n  var now = goog.debug.Trace_.now();\n  var timeStamp = opt_timeStamp ? opt_timeStamp : now;\n\n  var eventComment =\n      /** @type {goog.debug.Trace_.Event_} */ (this.eventPool_.getObject());\n  eventComment.startTime = undefined;\n  eventComment.stopTime = undefined;\n  eventComment.id = undefined;\n  eventComment.eventType = goog.debug.Trace_.EventType.COMMENT;\n  eventComment.eventTime = timeStamp;\n  eventComment.type = opt_type;\n  eventComment.comment = comment;\n  eventComment.totalVarAlloc = this.getTotalVarAlloc();\n  this.commentCount_++;\n\n  if (opt_timeStamp) {\n    if (this.traceCallbacks_.comment) {\n      this.traceCallbacks_.comment(eventComment.toString(), opt_timeStamp);\n    }\n    var numEvents = this.events_.length;\n    for (var i = 0; i < numEvents; i++) {\n      var event = this.events_[i];\n      var eventTime = event.eventTime;\n\n      if (eventTime > timeStamp) {\n        goog.array.insertAt(this.events_, eventComment, i);\n        break;\n      }\n    }\n    if (i == numEvents) {\n      this.events_.push(eventComment);\n    }\n  } else {  // No time_stamp\n    if (this.traceCallbacks_.comment) {\n      this.traceCallbacks_.comment(eventComment.toString());\n    }\n    this.events_.push(eventComment);\n  }\n\n  var type = eventComment.type;\n  if (type) {\n    var stat = this.getStat_(type);\n    stat.count++;\n  }\n\n  this.tracerOverheadComment_ += goog.debug.Trace_.now() - now;\n};\n\n\n/**\n * Gets a stat object for a particular type. The stat object is created if it\n * hasn't yet been.\n * @param {string} type The type of stat.\n * @return {goog.debug.Trace_.Stat_} The stat object.\n * @private\n */\ngoog.debug.Trace_.prototype.getStat_ = function(type) {\n  var stat = this.stats_.get(type);\n  if (!stat) {\n    stat = /** @type {goog.debug.Trace_.Event_} */ (this.statPool_.getObject());\n    stat.type = type;\n    this.stats_.set(type, stat);\n  }\n  return /** @type {goog.debug.Trace_.Stat_} */ (stat);\n};\n\n\n/**\n * Returns a formatted string for the current trace\n * @return {string} A formatted string that shows the timings of the current\n *     trace.\n */\ngoog.debug.Trace_.prototype.getFormattedTrace = function() {\n  return this.toString();\n};\n\n\n/**\n * Returns a formatted string that describes the thread trace.\n * @return {string} A formatted string.\n * @override\n */\ngoog.debug.Trace_.prototype.toString = function() {\n  var sb = [];\n  var etime = -1;\n  var indent = [];\n  for (var i = 0; i < this.events_.length; i++) {\n    var e = this.events_[i];\n    if (e.eventType == goog.debug.Trace_.EventType.STOP) {\n      indent.pop();\n    }\n    sb.push(' ', e.toTraceString(this.startTime_, etime, indent.join('')));\n    etime = e.eventTime;\n    sb.push('\\n');\n    if (e.eventType == goog.debug.Trace_.EventType.START) {\n      indent.push('|  ');\n    }\n  }\n\n  if (this.outstandingEvents_.getCount() != 0) {\n    var now = goog.debug.Trace_.now();\n\n    sb.push(' Unstopped timers:\\n');\n    goog.iter.forEach(this.outstandingEvents_, function(startEvent) {\n      sb.push(\n          '  ', startEvent, ' (', now - startEvent.startTime,\n          ' ms, started at ',\n          goog.debug.Trace_.formatTime_(startEvent.startTime), ')\\n');\n    });\n  }\n\n  var statKeys = this.stats_.getKeys();\n  for (var i = 0; i < statKeys.length; i++) {\n    var stat = this.stats_.get(statKeys[i]);\n    if (stat.count > 1) {\n      sb.push(' TOTAL ', stat, '\\n');\n    }\n  }\n\n  sb.push(\n      'Total tracers created ', this.tracerCount_, '\\n',\n      'Total comments created ', this.commentCount_, '\\n', 'Overhead start: ',\n      this.tracerOverheadStart_, ' ms\\n', 'Overhead end: ',\n      this.tracerOverheadEnd_, ' ms\\n', 'Overhead comment: ',\n      this.tracerOverheadComment_, ' ms\\n');\n\n  return sb.join('');\n};\n\n\n/**\n * Converts 'v' to a string and pads it with up to 3 spaces for\n * improved alignment. TODO there must be a better way\n * @param {number} v A number.\n * @return {string} A padded string.\n * @private\n */\ngoog.debug.Trace_.longToPaddedString_ = function(v) {\n  v = Math.round(v);\n  // todo (pupius) - there should be a generic string in goog.string for this\n  var space = '';\n  if (v < 1000) space = ' ';\n  if (v < 100) space = '  ';\n  if (v < 10) space = '   ';\n  return space + v;\n};\n\n\n/**\n * Return the sec.ms part of time (if time = \"20:06:11.566\",  \"11.566\n * @param {number} time The time in MS.\n * @return {string} A formatted string as sec.ms'.\n * @private\n */\ngoog.debug.Trace_.formatTime_ = function(time) {\n  time = Math.round(time);\n  var sec = (time / 1000) % 60;\n  var ms = time % 1000;\n\n  // TODO their must be a nicer way to get zero padded integers\n  return String(100 + sec).substring(1, 3) + '.' +\n      String(1000 + ms).substring(1, 4);\n};\n\n\n/**\n * Returns the current time. Done through a wrapper function so it can be\n * overridden by application code. Gmail has an ActiveX extension that provides\n * higher precision timing info.\n * @return {number} The current time in milliseconds.\n */\ngoog.debug.Trace_.now = function() {\n  return goog.now();\n};\n\n\n/**\n * Singleton trace object\n * @type {goog.debug.Trace_}\n */\ngoog.debug.Trace = new goog.debug.Trace_();\n\n\n/**\n * The detail of calling the stop callback for a trace.\n * @record\n */\ngoog.debug.StopTraceDetail = function() {\n  /**\n   * The trace should be stopped since it has been cancelled. Note that this\n   * field is optional so, not-specifying it is like setting it to false.\n   * @type {boolean|undefined}\n   */\n  this.wasCancelled;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^8O","^5Q","^?","~$goog.debug.Logger","^18","~$goog.structs.SimplePool","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/tracer.js"],"^O",["^=",["~$goog.debug.StopTraceDetail","~$goog.debug.Trace"]],"^W",true,"^X",["^?","^2O","^1L","^:<","^8O","^18","^5Q","^:="]],["^ ","^3",[1579837703000],"^4","goog.net.multiiframeloadmonitor.js","^5",["^6","goog/net/multiiframeloadmonitor.js"],"^7","goog/net/multiiframeloadmonitor.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class that can be used to determine when multiple iframes have\n * been loaded. Refactored from static APIs in IframeLoadMonitor.\n */\ngoog.provide('goog.net.MultiIframeLoadMonitor');\n\ngoog.require('goog.events');\ngoog.require('goog.net.IframeLoadMonitor');\n\n\n\n/**\n * Provides a wrapper around IframeLoadMonitor, to allow the caller to wait for\n * multiple iframes to load.\n *\n * @param {Array<HTMLIFrameElement>} iframes Array of iframe elements to\n *     wait until they are loaded.\n * @param {function():void} callback The callback to invoke once the frames have\n *     loaded.\n * @param {boolean=} opt_hasContent true if the monitor should wait until the\n *     iframes have content (body.firstChild != null).\n * @constructor\n * @final\n */\ngoog.net.MultiIframeLoadMonitor = function(iframes, callback, opt_hasContent) {\n  /**\n   * Array of IframeLoadMonitors we use to track the loaded status of any\n   * currently unloaded iframes.\n   * @type {Array<goog.net.IframeLoadMonitor>}\n   * @private\n   */\n  this.pendingIframeLoadMonitors_ = [];\n\n  /**\n   * Callback which is invoked when all of the iframes are loaded.\n   * @type {function():void}\n   * @private\n   */\n  this.callback_ = callback;\n\n  for (var i = 0; i < iframes.length; i++) {\n    var iframeLoadMonitor =\n        new goog.net.IframeLoadMonitor(iframes[i], opt_hasContent);\n    if (iframeLoadMonitor.isLoaded()) {\n      // Already loaded - don't need to wait\n      iframeLoadMonitor.dispose();\n    } else {\n      // Iframe isn't loaded yet - register to be notified when it is\n      // loaded, and track this monitor so we can dispose later as\n      // required.\n      this.pendingIframeLoadMonitors_.push(iframeLoadMonitor);\n      goog.events.listen(\n          iframeLoadMonitor, goog.net.IframeLoadMonitor.LOAD_EVENT, this);\n    }\n  }\n  if (!this.pendingIframeLoadMonitors_.length) {\n    // All frames were already loaded\n    this.callback_();\n  }\n};\n\n\n/**\n * Handles a pending iframe load monitor load event.\n * @param {goog.events.Event} e The goog.net.IframeLoadMonitor.LOAD_EVENT event.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.net.MultiIframeLoadMonitor.prototype.handleEvent = function(e) {\n  var iframeLoadMonitor = e.target;\n  // iframeLoadMonitor is now loaded, remove it from the array of\n  // pending iframe load monitors.\n  for (var i = 0; i < this.pendingIframeLoadMonitors_.length; i++) {\n    if (this.pendingIframeLoadMonitors_[i] == iframeLoadMonitor) {\n      this.pendingIframeLoadMonitors_.splice(i, 1);\n      break;\n    }\n  }\n\n  // Disposes of the iframe load monitor.  We created this iframe load monitor\n  // and installed the single listener on it, so it is safe to dispose it\n  // in the middle of this event handler.\n  iframeLoadMonitor.dispose();\n\n  // If there are no more pending iframe load monitors, all the iframes\n  // have loaded, and so we invoke the callback.\n  if (!this.pendingIframeLoadMonitors_.length) {\n    this.callback_();\n  }\n};\n\n\n/**\n * Stops monitoring the iframes, cleaning up any associated resources. In\n * general, the object cleans up its own resources before invoking the\n * callback, so this API should only be used if the caller wants to stop the\n * monitoring before the iframes are loaded (for example, if the caller is\n * implementing a timeout).\n */\ngoog.net.MultiIframeLoadMonitor.prototype.stopMonitoring = function() {\n  for (var i = 0; i < this.pendingIframeLoadMonitors_.length; i++) {\n    this.pendingIframeLoadMonitors_[i].dispose();\n  }\n  this.pendingIframeLoadMonitors_.length = 0;\n};\n","^;",1579837703000,"^<",["^=",["^?","~$goog.net.IframeLoadMonitor","^1<"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/multiiframeloadmonitor.js"],"^O",["^=",["~$goog.net.MultiIframeLoadMonitor"]],"^W",true,"^X",["^?","^1<","^:@"]],["^ ","^3",[1579837703000],"^4","goog.dom.bufferedviewportsizemonitor.js","^5",["^6","goog/dom/bufferedviewportsizemonitor.js"],"^7","goog/dom/bufferedviewportsizemonitor.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A viewport size monitor that buffers RESIZE events until the\n * window size has stopped changing, within a specified period of time.  For\n * every RESIZE event dispatched, this will dispatch up to two *additional*\n * events:\n * - {@link #EventType.RESIZE_WIDTH} if the viewport's width has changed since\n *   the last buffered dispatch.\n * - {@link #EventType.RESIZE_HEIGHT} if the viewport's height has changed since\n *   the last buffered dispatch.\n * You likely only need to listen to one of the three events.  But if you need\n * more, just be cautious of duplicating effort.\n *\n */\n\ngoog.provide('goog.dom.BufferedViewportSizeMonitor');\n\ngoog.require('goog.asserts');\ngoog.require('goog.async.Delay');\ngoog.require('goog.events');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\n\n\n\n/**\n * Creates a new BufferedViewportSizeMonitor.\n * @param {!goog.dom.ViewportSizeMonitor} viewportSizeMonitor The\n *     underlying viewport size monitor.\n * @param {number=} opt_bufferMs The buffer time, in ms. If not specified, this\n *     value defaults to {@link #RESIZE_EVENT_DELAY_MS_}.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.dom.BufferedViewportSizeMonitor = function(\n    viewportSizeMonitor, opt_bufferMs) {\n  goog.dom.BufferedViewportSizeMonitor.base(this, 'constructor');\n\n  /**\n   * Delay for the resize event.\n   * @private {goog.async.Delay}\n   */\n  this.resizeDelay_;\n\n  /**\n   * The underlying viewport size monitor.\n   * @type {goog.dom.ViewportSizeMonitor}\n   * @private\n   */\n  this.viewportSizeMonitor_ = viewportSizeMonitor;\n\n  /**\n   * The current size of the viewport.\n   * @type {goog.math.Size}\n   * @private\n   */\n  this.currentSize_ = this.viewportSizeMonitor_.getSize();\n\n  /**\n   * The resize buffer time in ms.\n   * @type {number}\n   * @private\n   */\n  this.resizeBufferMs_ = opt_bufferMs ||\n      goog.dom.BufferedViewportSizeMonitor.RESIZE_EVENT_DELAY_MS_;\n\n  /**\n   * Listener key for the viewport size monitor.\n   * @type {goog.events.Key}\n   * @private\n   */\n  this.listenerKey_ = goog.events.listen(\n      viewportSizeMonitor, goog.events.EventType.RESIZE, this.handleResize_,\n      false, this);\n};\ngoog.inherits(goog.dom.BufferedViewportSizeMonitor, goog.events.EventTarget);\n\n\n/**\n * Additional events to dispatch.\n * @enum {string}\n */\ngoog.dom.BufferedViewportSizeMonitor.EventType = {\n  RESIZE_HEIGHT: goog.events.getUniqueId('resizeheight'),\n  RESIZE_WIDTH: goog.events.getUniqueId('resizewidth')\n};\n\n\n/**\n * Default number of milliseconds to wait after a resize event to relayout the\n * page.\n * @type {number}\n * @const\n * @private\n */\ngoog.dom.BufferedViewportSizeMonitor.RESIZE_EVENT_DELAY_MS_ = 100;\n\n\n/** @override */\ngoog.dom.BufferedViewportSizeMonitor.prototype.disposeInternal = function() {\n  goog.events.unlistenByKey(this.listenerKey_);\n  goog.dom.BufferedViewportSizeMonitor.base(this, 'disposeInternal');\n};\n\n\n/**\n * Handles resize events on the underlying ViewportMonitor.\n * @private\n */\ngoog.dom.BufferedViewportSizeMonitor.prototype.handleResize_ = function() {\n  // Lazily create when needed.\n  if (!this.resizeDelay_) {\n    this.resizeDelay_ =\n        new goog.async.Delay(this.onWindowResize_, this.resizeBufferMs_, this);\n    this.registerDisposable(this.resizeDelay_);\n  }\n  this.resizeDelay_.start();\n};\n\n\n/**\n * Window resize callback that determines whether to reflow the view contents.\n * @private\n */\ngoog.dom.BufferedViewportSizeMonitor.prototype.onWindowResize_ = function() {\n  if (this.viewportSizeMonitor_.isDisposed()) {\n    return;\n  }\n\n  var previousSize = this.currentSize_;\n  var currentSize = this.viewportSizeMonitor_.getSize();\n\n  goog.asserts.assert(currentSize, 'Viewport size should be set at this point');\n\n  this.currentSize_ = currentSize;\n\n  if (previousSize) {\n    var resized = false;\n\n    // Width has changed\n    if (previousSize.width != currentSize.width) {\n      this.dispatchEvent(\n          goog.dom.BufferedViewportSizeMonitor.EventType.RESIZE_WIDTH);\n      resized = true;\n    }\n\n    // Height has changed\n    if (previousSize.height != currentSize.height) {\n      this.dispatchEvent(\n          goog.dom.BufferedViewportSizeMonitor.EventType.RESIZE_HEIGHT);\n      resized = true;\n    }\n\n    // If either has changed, this is a resize event.\n    if (resized) {\n      this.dispatchEvent(goog.events.EventType.RESIZE);\n    }\n\n  } else {\n    // If we didn't have a previous size, we consider all events to have\n    // changed.\n    this.dispatchEvent(\n        goog.dom.BufferedViewportSizeMonitor.EventType.RESIZE_HEIGHT);\n    this.dispatchEvent(\n        goog.dom.BufferedViewportSizeMonitor.EventType.RESIZE_WIDTH);\n    this.dispatchEvent(goog.events.EventType.RESIZE);\n  }\n};\n\n\n/**\n * Returns the current size of the viewport.\n * @return {goog.math.Size?} The current viewport size.\n */\ngoog.dom.BufferedViewportSizeMonitor.prototype.getSize = function() {\n  return this.currentSize_ ? this.currentSize_.clone() : null;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^?","^3W","^1C","^1<","^5>"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/bufferedviewportsizemonitor.js"],"^O",["^=",["~$goog.dom.BufferedViewportSizeMonitor"]],"^W",true,"^X",["^?","^1L","^5>","^1<","^3W","^1C"]],["^ ","^3",[1579837703000],"^4","goog.async.debouncer.js","^5",["^6","goog/async/debouncer.js"],"^7","goog/async/debouncer.js","^8","^9","^:","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the goog.async.Debouncer class.\n *\n * @see ../demos/timers.html\n */\n\ngoog.provide('goog.async.Debouncer');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.Timer');\n\n\n\n/**\n * Debouncer will perform a specified action exactly once for any sequence of\n * signals fired repeatedly so long as they are fired less than a specified\n * interval apart (in milliseconds). Whether it receives one signal or multiple,\n * it will always wait until a full interval has elapsed since the last signal\n * before performing the action.\n * @param {function(this: T, ...?)} listener Function to callback when the\n *     action is triggered.\n * @param {number} interval Interval over which to debounce. The listener will\n *     only be called after the full interval has elapsed since the last signal.\n * @param {T=} opt_handler Object in whose scope to call the listener.\n * @constructor\n * @struct\n * @extends {goog.Disposable}\n * @final\n * @template T\n */\ngoog.async.Debouncer = function(listener, interval, opt_handler) {\n  goog.async.Debouncer.base(this, 'constructor');\n\n  /**\n   * Function to callback\n   * @const @private {function(this: T, ...?)}\n   */\n  this.listener_ =\n      opt_handler != null ? goog.bind(listener, opt_handler) : listener;\n\n  /**\n   * Interval for the debounce time\n   * @const @private {number}\n   */\n  this.interval_ = interval;\n\n  /**\n   * Cached callback function invoked after the debounce timeout completes\n   * @const @private {!Function}\n   */\n  this.callback_ = goog.bind(this.onTimer_, this);\n\n  /**\n   * Indicates that the action is pending and needs to be fired.\n   * @private {boolean}\n   */\n  this.shouldFire_ = false;\n\n  /**\n   * Indicates the count of nested pauses currently in effect on the debouncer.\n   * When this count is not zero, fired actions will be postponed until the\n   * debouncer is resumed enough times to drop the pause count to zero.\n   * @private {number}\n   */\n  this.pauseCount_ = 0;\n\n  /**\n   * Timer for scheduling the next callback\n   * @private {?number}\n   */\n  this.timer_ = null;\n\n  /**\n   * When set this is a timestamp. On the onfire we want to reschedule the\n   * callback so it ends up at this time.\n   * @private {?number}\n   */\n  this.refireAt_ = null;\n\n  /**\n   * The last arguments passed into `fire`.\n   * @private {!IArrayLike}\n   */\n  this.args_ = [];\n};\ngoog.inherits(goog.async.Debouncer, goog.Disposable);\n\n\n/**\n * Notifies the debouncer that the action has happened. It will debounce the\n * call so that the callback is only called after the last action in a sequence\n * of actions separated by periods less the interval parameter passed to the\n * constructor, passing the arguments from the last call of this function into\n * the debounced function.\n * @param {...?} var_args Arguments to pass on to the debounced function.\n */\ngoog.async.Debouncer.prototype.fire = function(var_args) {\n  this.args_ = arguments;\n  // When this method is called, we need to prevent fire() calls from within the\n  // previous interval from calling the callback. The simplest way of doing this\n  // is to call this.stop() which calls clearTimeout, and then reschedule the\n  // timeout. However clearTimeout and setTimeout are expensive, so we just\n  // leave them untouched and when they do happen we potentially reschedule.\n  this.shouldFire_ = false;\n  if (this.timer_) {\n    this.refireAt_ = goog.now() + this.interval_;\n    return;\n  }\n  this.timer_ = goog.Timer.callOnce(this.callback_, this.interval_);\n};\n\n\n/**\n * Cancels any pending action callback. The debouncer can be restarted by\n * calling {@link #fire}.\n */\ngoog.async.Debouncer.prototype.stop = function() {\n  if (this.timer_) {\n    goog.Timer.clear(this.timer_);\n    this.timer_ = null;\n  }\n  this.refireAt_ = null;\n  this.shouldFire_ = false;\n  this.args_ = [];\n};\n\n\n/**\n * Pauses the debouncer. All pending and future action callbacks will be delayed\n * until the debouncer is resumed. Pauses can be nested.\n */\ngoog.async.Debouncer.prototype.pause = function() {\n  ++this.pauseCount_;\n};\n\n\n/**\n * Resumes the debouncer. If doing so drops the pausing count to zero, pending\n * action callbacks will be executed as soon as possible, but still no sooner\n * than an interval's delay after the previous call. Future action callbacks\n * will be executed as normal.\n */\ngoog.async.Debouncer.prototype.resume = function() {\n  if (!this.pauseCount_) {\n    return;\n  }\n\n  --this.pauseCount_;\n  if (!this.pauseCount_ && this.shouldFire_) {\n    this.doAction_();\n  }\n};\n\n\n/** @override */\ngoog.async.Debouncer.prototype.disposeInternal = function() {\n  this.stop();\n  goog.async.Debouncer.base(this, 'disposeInternal');\n};\n\n\n/**\n * Handler for the timer to fire the debouncer.\n * @private\n */\ngoog.async.Debouncer.prototype.onTimer_ = function() {\n  // There is a newer call to fire() within the debounce interval.\n  // Reschedule the callback and return.\n  if (this.refireAt_) {\n    this.timer_ =\n        goog.Timer.callOnce(this.callback_, this.refireAt_ - goog.now());\n    this.refireAt_ = null;\n    return;\n  }\n  this.timer_ = null;\n\n  if (!this.pauseCount_) {\n    this.doAction_();\n  } else {\n    this.shouldFire_ = true;\n  }\n};\n\n\n/**\n * Calls the callback.\n * @private\n */\ngoog.async.Debouncer.prototype.doAction_ = function() {\n  this.shouldFire_ = false;\n  this.listener_.apply(null, this.args_);\n};\n","^;",1579837703000,"^<",["^=",["^3O","^?","^1:"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/async/debouncer.js"],"^O",["^=",["~$goog.async.Debouncer"]],"^W",true,"^X",["^?","^1:","^3O"]],["^ ","^3",[1579837703000],"^4","goog.module.modulemanager.js","^5",["^6","goog/module/modulemanager.js"],"^7","goog/module/modulemanager.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A default implementation for managing JavaScript code modules.\n * @enhanceable\n *\n */\n\ngoog.provide('goog.module.ModuleManager');\ngoog.provide('goog.module.ModuleManager.CallbackType');\ngoog.provide('goog.module.ModuleManager.FailureType');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.async.Deferred');\ngoog.require('goog.debug.Trace');\ngoog.require('goog.disposable.IDisposable');\ngoog.require('goog.disposeAll');\ngoog.require('goog.loader.AbstractModuleManager');\ngoog.require('goog.loader.activeModuleManager');\ngoog.require('goog.log');\n/** @suppress {extraRequire} */\ngoog.require('goog.module');\ngoog.require('goog.module.ModuleInfo');\ngoog.require('goog.module.ModuleLoadCallback');\ngoog.require('goog.object');\n\n\n/**\n * The ModuleManager keeps track of all modules in the environment.\n * Since modules may not have their code loaded, we must keep track of them.\n * @constructor\n * @extends {goog.loader.AbstractModuleManager}\n * @implements {goog.disposable.IDisposable}\n * @struct\n */\ngoog.module.ModuleManager = function() {\n  goog.module.ModuleManager.base(this, 'constructor');\n\n  /**\n   * A mapping from module id to ModuleInfo object.\n   * @protected {!Object<string, !goog.module.ModuleInfo>}\n   */\n  this.moduleInfoMap = {};\n\n  // TODO (malteubl): Switch this to a reentrant design.\n  /**\n   * The ids of the currently loading modules. If batch mode is disabled, then\n   * this array will never contain more than one element at a time.\n   * @type {!Array<string>}\n   * @private\n   */\n  this.loadingModuleIds_ = [];\n\n  /**\n   * The requested ids of the currently loading modules. This does not include\n   * module dependencies that may also be loading.\n   * @type {!Array<string>}\n   * @private\n   */\n  this.requestedLoadingModuleIds_ = [];\n\n  // TODO(user): Make these and other arrays that are used as sets be\n  // actual sets.\n  /**\n   * All module ids that have ever been requested. In concurrent loading these\n   * are the ones to subtract from future requests.\n   * @type {!Array<string>}\n   * @private\n   */\n  this.requestedModuleIds_ = [];\n\n  /**\n   * A queue of the ids of requested but not-yet-loaded modules. The zero\n   * position is the front of the queue. This is a 2-D array to group modules\n   * together with other modules that should be batch loaded with them, if\n   * batch loading is enabled.\n   * @type {!Array<!Array<string>>}\n   * @private\n   */\n  this.requestedModuleIdsQueue_ = [];\n\n  /**\n   * The ids of the currently loading modules which have been initiated by user\n   * actions.\n   * @type {!Array<string>}\n   * @private\n   */\n  this.userInitiatedLoadingModuleIds_ = [];\n\n  /**\n   * A map of callback types to the functions to call for the specified\n   * callback type.\n   * @type {!Object<!goog.loader.AbstractModuleManager.CallbackType,\n   *     !Array<!Function>>}\n   * @private\n   */\n  this.callbackMap_ = {};\n\n  /**\n   * Module info for the base module (the one that contains the module\n   * manager code), which we set as the loading module so one can\n   * register initialization callbacks in the base module.\n   *\n   * The base module is considered loaded when #setAllModuleInfo is called or\n   * #setModuleContext is called, whichever comes first.\n   *\n   * @type {!goog.module.ModuleInfo}\n   * @private\n   */\n  this.baseModuleInfo_ = new goog.module.ModuleInfo([], '');\n\n  /**\n   * The module that is currently loading, or null if not loading anything.\n   * @type {?goog.module.ModuleInfo}\n   * @private\n   */\n  this.currentlyLoadingModule_ = this.baseModuleInfo_;\n\n  /**\n   * The id of the last requested initial module. When it loaded\n   * the deferred in `this.initialModulesLoaded_` resolves.\n   * @private {?string}\n   */\n  this.lastInitialModuleId_ = null;\n\n  /**\n   * Deferred for when all initial modules have loaded. We currently block\n   * sending additional module requests until this deferred resolves. In a\n   * future optimization it may be possible to use the initial modules as\n   * seeds for the module loader \"requested module ids\" and start making new\n   * requests even sooner.\n   * @private {!goog.async.Deferred}\n   */\n  this.initialModulesLoaded_ = new goog.async.Deferred();\n\n  /**\n   * A logger.\n   * @private {?goog.log.Logger}\n   */\n  this.logger_ = goog.log.getLogger('goog.module.ModuleManager');\n\n  /**\n   * Whether the batch mode (i.e. the loading of multiple modules with just one\n   * request) has been enabled.\n   * @private {boolean}\n   */\n  this.batchModeEnabled_ = false;\n\n  /**\n   * Whether the module requests may be sent out of order.\n   * @private {boolean}\n   */\n  this.concurrentLoadingEnabled_ = false;\n\n  // TODO(user): Remove tracer.\n  /**\n   * Tracer that measures how long it takes to load a module.\n   * @private {?number}\n   */\n  this.loadTracer_ = null;\n\n  /**\n   * The number of consecutive failures that have happened upon module load\n   * requests.\n   * @private {number}\n   */\n  this.consecutiveFailures_ = 0;\n\n  /**\n   * Determines if the module manager was just active before the processing of\n   * the last data.\n   * @private {boolean}\n   */\n  this.lastActive_ = false;\n\n  /**\n   * Determines if the module manager was just user active before the processing\n   * of the last data. The module manager is user active if any of the\n   * user-initiated modules are loading or queued up to load.\n   * @private {boolean}\n   */\n  this.userLastActive_ = false;\n\n  /**\n   * @private {boolean}\n   */\n  this.isDisposed_ = false;\n};\ngoog.inherits(goog.module.ModuleManager, goog.loader.AbstractModuleManager);\n\n\n/**\n * The type of callbacks that can be registered with the module manager,.\n * @enum {string}\n */\ngoog.module.ModuleManager.CallbackType =\n    goog.loader.AbstractModuleManager.CallbackType;\n\n\n/**\n * The possible reasons for a module load failure callback being fired.\n * @enum {number}\n */\ngoog.module.ModuleManager.FailureType =\n    goog.loader.AbstractModuleManager.FailureType;\n\n\n/**\n * A non-HTTP status code indicating a corruption in loaded module.\n * This should be used by a ModuleLoader as a replacement for the HTTP code\n * given to the error handler function to indicated that the module was\n * corrupted.\n * This will set the forceReload flag on the loadModules method when retrying\n * module loading.\n * @type {number}\n */\ngoog.module.ModuleManager.CORRUPT_RESPONSE_STATUS_CODE =\n    goog.loader.AbstractModuleManager.CORRUPT_RESPONSE_STATUS_CODE;\n\n\n/** @return {!goog.loader.AbstractModuleManager} */\ngoog.module.ModuleManager.getInstance = function() {\n  return goog.loader.activeModuleManager.get();\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.setBatchModeEnabled = function(enabled) {\n  this.batchModeEnabled_ = enabled;\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.setConcurrentLoadingEnabled = function(\n    enabled) {\n  this.concurrentLoadingEnabled_ = enabled;\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.setAllModuleInfo = function(infoMap) {\n  for (var id in infoMap) {\n    this.moduleInfoMap[id] = new goog.module.ModuleInfo(infoMap[id], id);\n  }\n  if (!this.initialModulesLoaded_.hasFired()) {\n    this.initialModulesLoaded_.callback();\n  }\n  this.maybeFinishBaseLoad_();\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.setAllModuleInfoString = function(\n    opt_info, opt_loadingModuleIds) {\n  // Check for legacy direct-from-prototype usage.\n  if (!(this instanceof goog.module.ModuleManager)) {\n    this.setAllModuleInfoString(opt_info, opt_loadingModuleIds);\n    return;\n  }\n  if (typeof (opt_info) !== 'string') {\n    // The call to this method is generated in two steps, the argument is added\n    // after some of the compilation passes.  This means that the initial code\n    // doesn't have any arguments and causes compiler errors.  We make it\n    // optional to satisfy this constraint.\n    return;\n  }\n\n  var modules = opt_info.split('/');\n  var moduleIds = [];\n\n  // Split the string into the infoMap of id->deps\n  for (var i = 0; i < modules.length; i++) {\n    var parts = modules[i].split(':');\n    var id = parts[0];\n    var deps;\n    if (parts[1]) {\n      deps = parts[1].split(',');\n      for (var j = 0; j < deps.length; j++) {\n        var index = parseInt(deps[j], 36);\n        goog.asserts.assert(\n            moduleIds[index], 'No module @ %s, dep of %s @ %s', index, id, i);\n        deps[j] = moduleIds[index];\n      }\n    } else {\n      deps = [];\n    }\n    moduleIds.push(id);\n    this.moduleInfoMap[id] = new goog.module.ModuleInfo(deps, id);\n  }\n  if (opt_loadingModuleIds && opt_loadingModuleIds.length) {\n    goog.array.extend(this.loadingModuleIds_, opt_loadingModuleIds);\n    // The last module in the list of initial modules. When it has loaded all\n    // initial modules have loaded.\n    this.lastInitialModuleId_ =\n        /** @type {?string}  */ (goog.array.peek(opt_loadingModuleIds));\n  } else {\n    if (!this.initialModulesLoaded_.hasFired()) {\n      this.initialModulesLoaded_.callback();\n    }\n  }\n  this.maybeFinishBaseLoad_();\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.getModuleInfo = function(id) {\n  return this.moduleInfoMap[id];\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.setModuleTrustedUris = function(\n    moduleUriMap) {\n  for (var id in moduleUriMap) {\n    this.moduleInfoMap[id].setTrustedUris(moduleUriMap[id]);\n  }\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.setModuleContext = function(context) {\n  goog.module.ModuleManager.base(this, 'setModuleContext', context);\n  this.maybeFinishBaseLoad_();\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.isActive = function() {\n  return this.loadingModuleIds_.length > 0;\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.isUserActive = function() {\n  return this.userInitiatedLoadingModuleIds_.length > 0;\n};\n\n\n/**\n * Dispatches an ACTIVE or IDLE event if necessary.\n * @private\n */\ngoog.module.ModuleManager.prototype.dispatchActiveIdleChangeIfNeeded_ =\n    function() {\n  var lastActive = this.lastActive_;\n  var active = this.isActive();\n  if (active != lastActive) {\n    this.executeCallbacks_(\n        active ? goog.loader.AbstractModuleManager.CallbackType.ACTIVE :\n                 goog.loader.AbstractModuleManager.CallbackType.IDLE);\n\n    // Flip the last active value.\n    this.lastActive_ = active;\n  }\n\n  // Check if the module manager is user active i.e., there are user initiated\n  // modules being loaded or queued up to be loaded.\n  var userLastActive = this.userLastActive_;\n  var userActive = this.isUserActive();\n  if (userActive != userLastActive) {\n    this.executeCallbacks_(\n        userActive ?\n            goog.loader.AbstractModuleManager.CallbackType.USER_ACTIVE :\n            goog.loader.AbstractModuleManager.CallbackType.USER_IDLE);\n\n    // Flip the last user active value.\n    this.userLastActive_ = userActive;\n  }\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.preloadModule = function(id, opt_timeout) {\n  var d = new goog.async.Deferred();\n  window.setTimeout(\n      goog.bind(this.addLoadModule_, this, id, d), opt_timeout || 0);\n  return d;\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.prefetchModule = function(id) {\n  var moduleInfo = this.getModuleInfo(id);\n  if (moduleInfo.isLoaded() || this.isModuleLoading(id)) {\n    throw new Error('Module load already requested: ' + id);\n  } else if (this.batchModeEnabled_) {\n    throw new Error('Modules prefetching is not supported in batch mode');\n  } else {\n    var idWithDeps = this.getNotYetLoadedTransitiveDepIds_(id);\n    for (var i = 0; i < idWithDeps.length; i++) {\n      this.getLoader().prefetchModule(\n          idWithDeps[i], this.moduleInfoMap[idWithDeps[i]]);\n    }\n  }\n};\n\n\n/**\n * Loads a single module for use with a given deferred.\n *\n * @param {string} id The id of the module to load.\n * @param {!goog.async.Deferred} d A deferred object.\n * @private\n */\ngoog.module.ModuleManager.prototype.addLoadModule_ = function(id, d) {\n  var moduleInfo = this.getModuleInfo(id);\n  if (moduleInfo.isLoaded()) {\n    d.callback(this.getModuleContext());\n    return;\n  }\n\n  this.registerModuleLoadCallbacks_(id, moduleInfo, false, d);\n  if (!this.isModuleLoading(id)) {\n    this.loadModulesOrEnqueue_([id]);\n  }\n};\n\n\n/**\n * Loads a list of modules or, if some other module is currently being loaded,\n * appends the ids to the queue of requested module ids. Registers callbacks a\n * module that is currently loading and returns a fired deferred for a module\n * that is already loaded.\n *\n * @param {!Array<string>} ids The id of the module to load.\n * @param {boolean=} opt_userInitiated If the load is a result of a user action.\n * @return {!Object<string, !goog.async.Deferred>} A mapping from id (String)\n *     to deferred objects that will callback or errback when the load for that\n *     id is finished.\n * @private\n */\ngoog.module.ModuleManager.prototype.loadModulesOrEnqueueIfNotLoadedOrLoading_ =\n    function(ids, opt_userInitiated) {\n  var uniqueIds = [];\n  goog.array.removeDuplicates(ids, uniqueIds);\n  var idsToLoad = [];\n  var deferredMap = {};\n  for (var i = 0; i < uniqueIds.length; i++) {\n    var id = uniqueIds[i];\n    var moduleInfo = this.getModuleInfo(id);\n    if (!moduleInfo) {\n      throw new Error('Unknown module: ' + id);\n    }\n    var d = new goog.async.Deferred();\n    deferredMap[id] = d;\n    if (moduleInfo.isLoaded()) {\n      d.callback(this.getModuleContext());\n    } else {\n      this.registerModuleLoadCallbacks_(id, moduleInfo, !!opt_userInitiated, d);\n      if (!this.isModuleLoading(id)) {\n        idsToLoad.push(id);\n      }\n    }\n  }\n\n  // If there are ids to load, load them, otherwise, they are all loading or\n  // loaded.\n  if (idsToLoad.length > 0) {\n    this.loadModulesOrEnqueue_(idsToLoad);\n  }\n  return deferredMap;\n};\n\n\n/**\n * Registers the callbacks and handles logic if it is a user initiated module\n * load.\n *\n * @param {string} id The id of the module to possibly load.\n * @param {!goog.module.ModuleInfo} moduleInfo The module identifier for the\n *     given id.\n * @param {boolean} userInitiated If the load was user initiated.\n * @param {!goog.async.Deferred} d A deferred object.\n * @private\n */\ngoog.module.ModuleManager.prototype.registerModuleLoadCallbacks_ = function(\n    id, moduleInfo, userInitiated, d) {\n  moduleInfo.registerCallback(d.callback, d);\n  moduleInfo.registerErrback(function(err) {\n    d.errback(Error(err));\n  });\n  // If it's already loading, we don't have to do anything besides handle\n  // if it was user initiated\n  if (this.isModuleLoading(id)) {\n    if (userInitiated) {\n      goog.log.fine(\n          this.logger_, 'User initiated module already loading: ' + id);\n      this.addUserInitiatedLoadingModule_(id);\n      this.dispatchActiveIdleChangeIfNeeded_();\n    }\n  } else {\n    if (userInitiated) {\n      goog.log.fine(this.logger_, 'User initiated module load: ' + id);\n      this.addUserInitiatedLoadingModule_(id);\n    } else {\n      goog.log.fine(this.logger_, 'Initiating module load: ' + id);\n    }\n  }\n};\n\n\n/**\n * Initiates loading of a list of modules or, if a module is currently being\n * loaded, appends the modules to the queue of requested module ids.\n *\n * The caller should verify that the requested modules are not already loaded or\n * loading. {@link #loadModulesOrEnqueueIfNotLoadedOrLoading_} is a more lenient\n * alternative to this method.\n *\n * @param {!Array<string>} ids The ids of the modules to load.\n * @private\n */\ngoog.module.ModuleManager.prototype.loadModulesOrEnqueue_ = function(ids) {\n  // With concurrent loading we always just send off the request.\n  if (this.concurrentLoadingEnabled_) {\n    // For now we wait for initial modules to have downloaded as this puts the\n    // loader in a good state for calculating the needed deps of additional\n    // loads.\n    // TODO(user): Make this wait unnecessary.\n    this.initialModulesLoaded_.addCallback(\n        goog.bind(this.loadModules_, this, ids));\n  } else {\n    if (goog.array.isEmpty(this.loadingModuleIds_)) {\n      this.loadModules_(ids);\n    } else {\n      this.requestedModuleIdsQueue_.push(ids);\n      this.dispatchActiveIdleChangeIfNeeded_();\n    }\n  }\n};\n\n\n/**\n * Gets the amount of delay to wait before sending a request for more modules.\n * If a certain module request fails, we backoff a little bit and try again.\n * @return {number} Delay, in ms.\n * @private\n */\ngoog.module.ModuleManager.prototype.getBackOff_ = function() {\n  // 5 seconds after one error, 20 seconds after 2.\n  return Math.pow(this.consecutiveFailures_, 2) * 5000;\n};\n\n\n/**\n * Loads a list of modules and any of their not-yet-loaded prerequisites.\n * If batch mode is enabled, the prerequisites will be loaded together with the\n * requested modules and all requested modules will be loaded at the same time.\n *\n * The caller should verify that the requested modules are not already loaded\n * and that no modules are currently loading before calling this method.\n *\n * @param {!Array<string>} ids The ids of the modules to load.\n * @param {boolean=} opt_isRetry If the load is a retry of a previous load\n *     attempt.\n * @param {boolean=} opt_forceReload Whether to bypass cache while loading the\n *     module.\n * @private\n */\ngoog.module.ModuleManager.prototype.loadModules_ = function(\n    ids, opt_isRetry, opt_forceReload) {\n  if (!opt_isRetry) {\n    this.consecutiveFailures_ = 0;\n  }\n\n  // Not all modules may be loaded immediately if batch mode is not enabled.\n  var idsToLoadImmediately = this.processModulesForLoad_(ids);\n\n  goog.log.fine(this.logger_, 'Loading module(s): ' + idsToLoadImmediately);\n\n  if (this.concurrentLoadingEnabled_) {\n    goog.array.extend(this.loadingModuleIds_, idsToLoadImmediately);\n  } else {\n    this.loadingModuleIds_ = idsToLoadImmediately;\n  }\n\n  if (this.batchModeEnabled_) {\n    this.requestedLoadingModuleIds_ = ids;\n  } else {\n    // If batch mode is disabled, we treat each dependency load as a separate\n    // load.\n    this.requestedLoadingModuleIds_ = goog.array.clone(idsToLoadImmediately);\n  }\n\n  // Dispatch an active/idle change if needed.\n  this.dispatchActiveIdleChangeIfNeeded_();\n\n  if (goog.array.isEmpty(idsToLoadImmediately)) {\n    // All requested modules and deps have been either loaded already or have\n    // already been requested.\n    return;\n  }\n\n  this.requestedModuleIds_.push.apply(\n      this.requestedModuleIds_, idsToLoadImmediately);\n\n  var loadFn = goog.bind(\n      this.getLoader().loadModules, goog.asserts.assert(this.getLoader()),\n      goog.array.clone(idsToLoadImmediately),\n      goog.asserts.assert(this.moduleInfoMap), null,\n      goog.bind(\n          this.handleLoadError_, this, this.requestedLoadingModuleIds_,\n          idsToLoadImmediately),\n      goog.bind(this.handleLoadTimeout_, this), !!opt_forceReload);\n\n  var delay = this.getBackOff_();\n  if (delay) {\n    window.setTimeout(loadFn, delay);\n  } else {\n    loadFn();\n  }\n};\n\n\n/**\n * Processes a list of module ids for loading. Checks if any of the modules are\n * already loaded and then gets transitive deps. Queues any necessary modules\n * if batch mode is not enabled. Returns the list of ids that should be loaded.\n *\n * @param {!Array<string>} ids The ids that need to be loaded.\n * @return {!Array<string>} The ids to load, including dependencies.\n * @throws {!Error} If the module is already loaded.\n * @private\n */\ngoog.module.ModuleManager.prototype.processModulesForLoad_ = function(ids) {\n  ids = goog.array.filter(ids, (id) => {\n    let moduleInfo = this.moduleInfoMap[id];\n    if (moduleInfo.isLoaded()) {\n      goog.global.setTimeout(\n          () => new Error('Module already loaded: ' + id), 0);\n      return false;\n    }\n    return true;\n  });\n\n  // Build a list of the ids of this module and any of its not-yet-loaded\n  // prerequisite modules in dependency order.\n  var idsWithDeps = [];\n  for (var i = 0; i < ids.length; i++) {\n    idsWithDeps =\n        idsWithDeps.concat(this.getNotYetLoadedTransitiveDepIds_(ids[i]));\n  }\n  goog.array.removeDuplicates(idsWithDeps);\n\n  if (!this.batchModeEnabled_ && idsWithDeps.length > 1) {\n    var idToLoad = idsWithDeps.shift();\n    goog.log.fine(\n        this.logger_, 'Must load ' + idToLoad + ' module before ' + ids);\n\n    // Insert the requested module id and any other not-yet-loaded prereqs\n    // that it has at the front of the queue.\n    var queuedModules = goog.array.map(idsWithDeps, function(id) {\n      return [id];\n    });\n    this.requestedModuleIdsQueue_ =\n        queuedModules.concat(this.requestedModuleIdsQueue_);\n    return [idToLoad];\n  } else {\n    return idsWithDeps;\n  }\n};\n\n\n/**\n * Builds a list of the ids of the not-yet-loaded modules that a particular\n * module transitively depends on, including itself.\n *\n * @param {string} id The id of a not-yet-loaded module.\n * @return {!Array<string>} An array of module ids in dependency order that's\n *     guaranteed to end with the provided module id.\n * @private\n */\ngoog.module.ModuleManager.prototype.getNotYetLoadedTransitiveDepIds_ = function(\n    id) {\n  var requestedModuleSet = goog.object.createSet(this.requestedModuleIds_);\n  // NOTE(user): We want the earliest occurrence of a module, not the first\n  // dependency we find. Therefore we strip duplicates at the end rather than\n  // during.  See the tests for concrete examples.\n  var ids = [];\n  if (!requestedModuleSet[id]) {\n    ids.push(id);\n  }\n  var depIdLookupList = [id];\n  // BFS by iterating through dependencies and enqueuing their respective\n  // dependencies into the lookup list.\n  for (var i = 0; i < depIdLookupList.length; i++) {\n    var depIds = this.getModuleInfo(depIdLookupList[i]).getDependencies();\n    for (var j = depIds.length - 1; j >= 0; j--) {\n      var depId = depIds[j];\n      if (!this.getModuleInfo(depId).isLoaded() && !requestedModuleSet[depId]) {\n        ids.push(depId);\n        depIdLookupList.push(depId);\n      }\n    }\n  }\n\n  // Leaf dependencies should come before others. Please refer to test cases for\n  // exact order.\n  ids.reverse();\n  goog.array.removeDuplicates(ids);\n  return ids;\n};\n\n\n/**\n * If we are still loading the base module, consider the load complete.\n * @private\n */\ngoog.module.ModuleManager.prototype.maybeFinishBaseLoad_ = function() {\n  if (this.currentlyLoadingModule_ == this.baseModuleInfo_) {\n    this.currentlyLoadingModule_ = null;\n    var error =\n        this.baseModuleInfo_.onLoad(goog.bind(this.getModuleContext, this));\n    if (error) {\n      this.dispatchModuleLoadFailed_(\n          goog.loader.AbstractModuleManager.FailureType.INIT_ERROR);\n    }\n\n    this.dispatchActiveIdleChangeIfNeeded_();\n  }\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.setLoaded = function() {\n  if (!this.currentlyLoadingModule_) {\n    goog.log.error(\n        this.logger_, 'setLoaded called while no module is actively loading');\n    return;\n  }\n\n  var id = this.currentlyLoadingModule_.getId();\n\n  if (this.isDisposed()) {\n    goog.log.warning(\n        this.logger_, 'Module loaded after module manager was disposed: ' + id);\n    return;\n  }\n\n  goog.log.fine(this.logger_, 'Module loaded: ' + id);\n\n  var error =\n      this.moduleInfoMap[id].onLoad(goog.bind(this.getModuleContext, this));\n  if (error) {\n    this.dispatchModuleLoadFailed_(\n        goog.loader.AbstractModuleManager.FailureType.INIT_ERROR);\n  }\n\n  // Remove the module id from the user initiated set if it existed there.\n  goog.array.remove(this.userInitiatedLoadingModuleIds_, id);\n\n  // Remove the module id from the loading modules if it exists there.\n  goog.array.remove(this.loadingModuleIds_, id);\n\n  if (goog.array.isEmpty(this.loadingModuleIds_)) {\n    // No more modules are currently being loaded (e.g. arriving later in the\n    // same HTTP response), so proceed to load the next module in the queue.\n    this.loadNextModules_();\n  }\n\n  if (this.lastInitialModuleId_ && id == this.lastInitialModuleId_) {\n    if (!this.initialModulesLoaded_.hasFired()) {\n      this.initialModulesLoaded_.callback();\n    }\n  }\n\n  // Dispatch an active/idle change if needed.\n  this.dispatchActiveIdleChangeIfNeeded_();\n\n  this.currentlyLoadingModule_ = null;\n  goog.debug.Trace.stopTracer(this.loadTracer_);\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.isModuleLoading = function(id) {\n  if (goog.array.contains(this.loadingModuleIds_, id)) {\n    return true;\n  }\n  for (var i = 0; i < this.requestedModuleIdsQueue_.length; i++) {\n    if (goog.array.contains(this.requestedModuleIdsQueue_[i], id)) {\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.execOnLoad = function(\n    moduleId, fn, opt_handler, opt_noLoad, opt_userInitiated,\n    opt_preferSynchronous) {\n  var moduleInfo = this.moduleInfoMap[moduleId];\n  var callbackWrapper;\n\n  if (moduleInfo.isLoaded()) {\n    goog.log.fine(this.logger_, moduleId + ' module already loaded');\n    // Call async so that code paths don't change between loaded and unloaded\n    // cases.\n    callbackWrapper = new goog.module.ModuleLoadCallback(fn, opt_handler);\n    if (opt_preferSynchronous) {\n      callbackWrapper.execute(this.getModuleContext());\n    } else {\n      window.setTimeout(goog.bind(callbackWrapper.execute, callbackWrapper), 0);\n    }\n  } else if (this.isModuleLoading(moduleId)) {\n    goog.log.fine(this.logger_, moduleId + ' module already loading');\n    callbackWrapper = moduleInfo.registerCallback(fn, opt_handler);\n    if (opt_userInitiated) {\n      goog.log.fine(\n          this.logger_, 'User initiated module already loading: ' + moduleId);\n      this.addUserInitiatedLoadingModule_(moduleId);\n      this.dispatchActiveIdleChangeIfNeeded_();\n    }\n  } else {\n    goog.log.fine(this.logger_, 'Registering callback for module: ' + moduleId);\n    callbackWrapper = moduleInfo.registerCallback(fn, opt_handler);\n    if (!opt_noLoad) {\n      if (opt_userInitiated) {\n        goog.log.fine(this.logger_, 'User initiated module load: ' + moduleId);\n        this.addUserInitiatedLoadingModule_(moduleId);\n      }\n      goog.log.fine(this.logger_, 'Initiating module load: ' + moduleId);\n      this.loadModulesOrEnqueue_([moduleId]);\n    }\n  }\n  return callbackWrapper;\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.load = function(\n    moduleId, opt_userInitiated) {\n  return this.loadModulesOrEnqueueIfNotLoadedOrLoading_(\n      [moduleId], opt_userInitiated)[moduleId];\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.loadMultiple = function(\n    moduleIds, opt_userInitiated) {\n  return this.loadModulesOrEnqueueIfNotLoadedOrLoading_(\n      moduleIds, opt_userInitiated);\n};\n\n\n/**\n * Ensures that the module with the given id is listed as a user-initiated\n * module that is being loaded. This method guarantees that a module will never\n * get listed more than once.\n * @param {string} id Identifier of the module.\n * @private\n */\ngoog.module.ModuleManager.prototype.addUserInitiatedLoadingModule_ = function(\n    id) {\n  if (!goog.array.contains(this.userInitiatedLoadingModuleIds_, id)) {\n    this.userInitiatedLoadingModuleIds_.push(id);\n  }\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.beforeLoadModuleCode = function(id) {\n  this.loadTracer_ =\n      goog.debug.Trace.startTracer('Module Load: ' + id, 'Module Load');\n  if (this.currentlyLoadingModule_) {\n    goog.log.error(\n        this.logger_,\n        'beforeLoadModuleCode called with module \"' + id + '\" while module \"' +\n            this.currentlyLoadingModule_.getId() + '\" is loading');\n  }\n  this.currentlyLoadingModule_ = this.getModuleInfo(id);\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.registerInitializationCallback = function(\n    fn, opt_handler) {\n  if (!this.currentlyLoadingModule_) {\n    goog.log.error(this.logger_, 'No module is currently loading');\n  } else {\n    this.currentlyLoadingModule_.registerEarlyCallback(fn, opt_handler);\n  }\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.registerLateInitializationCallback =\n    function(fn, opt_handler) {\n  if (!this.currentlyLoadingModule_) {\n    goog.log.error(this.logger_, 'No module is currently loading');\n  } else {\n    this.currentlyLoadingModule_.registerCallback(fn, opt_handler);\n  }\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.setModuleConstructor = function(fn) {\n  if (!this.currentlyLoadingModule_) {\n    goog.log.error(this.logger_, 'No module is currently loading');\n    return;\n  }\n  this.currentlyLoadingModule_.setModuleConstructor(fn);\n};\n\n\n/**\n * Handles a module load failure.\n *\n * @param {!Array<string>} requestedLoadingModuleIds Modules ids that were\n *     requested in failed request. Does not included calculated dependencies.\n * @param {!Array<string>} requestedModuleIdsWithDeps All module ids requested\n *     in the failed request including all dependencies.\n * @param {?number} status The error status.\n * @private\n */\ngoog.module.ModuleManager.prototype.handleLoadError_ = function(\n    requestedLoadingModuleIds, requestedModuleIdsWithDeps, status) {\n  this.consecutiveFailures_++;\n  // Module manager was not designed to be reentrant. Reinstate the instance\n  // var with actual value when request failed (Other requests may have\n  // started already.)\n  this.requestedLoadingModuleIds_ = requestedLoadingModuleIds;\n  // Pretend we never requested the failed modules.\n  goog.array.forEach(\n      requestedModuleIdsWithDeps,\n      goog.partial(goog.array.remove, this.requestedModuleIds_), this);\n\n  if (status == 401) {\n    // The user is not logged in. They've cleared their cookies or logged out\n    // from another window.\n    goog.log.info(this.logger_, 'Module loading unauthorized');\n    this.dispatchModuleLoadFailed_(\n        goog.loader.AbstractModuleManager.FailureType.UNAUTHORIZED);\n    // Drop any additional module requests.\n    this.requestedModuleIdsQueue_.length = 0;\n  } else if (status == 410) {\n    // The requested module js is old and not available.\n    this.requeueBatchOrDispatchFailure_(\n        goog.loader.AbstractModuleManager.FailureType.OLD_CODE_GONE);\n    this.loadNextModules_();\n  } else if (this.consecutiveFailures_ >= 3) {\n    goog.log.info(\n        this.logger_,\n        'Aborting after failure to load: ' + this.loadingModuleIds_);\n    this.requeueBatchOrDispatchFailure_(\n        goog.loader.AbstractModuleManager.FailureType.CONSECUTIVE_FAILURES);\n    this.loadNextModules_();\n  } else {\n    goog.log.info(\n        this.logger_,\n        'Retrying after failure to load: ' + this.loadingModuleIds_);\n    var forceReload = status ==\n        goog.loader.AbstractModuleManager.CORRUPT_RESPONSE_STATUS_CODE;\n    this.loadModules_(this.requestedLoadingModuleIds_, true, forceReload);\n  }\n};\n\n\n/**\n * Handles a module load timeout.\n * @private\n */\ngoog.module.ModuleManager.prototype.handleLoadTimeout_ = function() {\n  goog.log.info(\n      this.logger_, 'Aborting after timeout: ' + this.loadingModuleIds_);\n  this.requeueBatchOrDispatchFailure_(\n      goog.loader.AbstractModuleManager.FailureType.TIMEOUT);\n  this.loadNextModules_();\n};\n\n\n/**\n * Requeues batch loads that had more than one requested module\n * (i.e. modules that were not included as dependencies) as separate loads or\n * if there was only one requested module, fails that module with the received\n * cause.\n * @param {!goog.loader.AbstractModuleManager.FailureType} cause The reason for\n *     the failure.\n * @private\n */\ngoog.module.ModuleManager.prototype.requeueBatchOrDispatchFailure_ = function(\n    cause) {\n  // The load failed, so if there are more than one requested modules, then we\n  // need to retry each one as a separate load. Otherwise, if there is only one\n  // requested module, remove it and its dependencies from the queue.\n  if (this.requestedLoadingModuleIds_.length > 1) {\n    var queuedModules =\n        goog.array.map(this.requestedLoadingModuleIds_, function(id) {\n          return [id];\n        });\n    this.requestedModuleIdsQueue_ =\n        queuedModules.concat(this.requestedModuleIdsQueue_);\n  } else {\n    this.dispatchModuleLoadFailed_(cause);\n  }\n};\n\n\n/**\n * Handles when a module load failed.\n * @param {!goog.loader.AbstractModuleManager.FailureType} cause The reason for\n *     the failure.\n * @private\n */\ngoog.module.ModuleManager.prototype.dispatchModuleLoadFailed_ = function(\n    cause) {\n  var failedIds = this.requestedLoadingModuleIds_;\n  this.loadingModuleIds_.length = 0;\n  // If any pending modules depend on the id that failed,\n  // they need to be removed from the queue.\n  var idsToCancel = [];\n  for (var i = 0; i < this.requestedModuleIdsQueue_.length; i++) {\n    var dependentModules = goog.array.filter(\n        this.requestedModuleIdsQueue_[i],\n        /**\n         * Returns true if the requestedId has dependencies on the modules that\n         * just failed to load.\n         * @param {string} requestedId The module to check for dependencies.\n         * @return {boolean} True if the module depends on failed modules.\n         */\n        function(requestedId) {\n          var requestedDeps =\n              this.getNotYetLoadedTransitiveDepIds_(requestedId);\n          return goog.array.some(failedIds, function(id) {\n            return goog.array.contains(requestedDeps, id);\n          });\n        },\n        this);\n    goog.array.extend(idsToCancel, dependentModules);\n  }\n\n  // Also insert the ids that failed to load as ids to cancel.\n  for (var i = 0; i < failedIds.length; i++) {\n    goog.array.insert(idsToCancel, failedIds[i]);\n  }\n\n  // Remove ids to cancel from the queues.\n  for (var i = 0; i < idsToCancel.length; i++) {\n    for (var j = 0; j < this.requestedModuleIdsQueue_.length; j++) {\n      goog.array.remove(this.requestedModuleIdsQueue_[j], idsToCancel[i]);\n    }\n    goog.array.remove(this.userInitiatedLoadingModuleIds_, idsToCancel[i]);\n  }\n\n  // Call the functions for error notification.\n  var errorCallbacks =\n      this.callbackMap_[goog.loader.AbstractModuleManager.CallbackType.ERROR];\n  if (errorCallbacks) {\n    for (var i = 0; i < errorCallbacks.length; i++) {\n      var callback = errorCallbacks[i];\n      for (var j = 0; j < idsToCancel.length; j++) {\n        callback(\n            goog.loader.AbstractModuleManager.CallbackType.ERROR,\n            idsToCancel[j], cause);\n      }\n    }\n  }\n\n  // Call the errbacks on the module info.\n  for (var i = 0; i < failedIds.length; i++) {\n    if (this.moduleInfoMap[failedIds[i]]) {\n      this.moduleInfoMap[failedIds[i]].onError(cause);\n    }\n  }\n\n  // Clear the requested loading module ids.\n  this.requestedLoadingModuleIds_.length = 0;\n\n  this.dispatchActiveIdleChangeIfNeeded_();\n};\n\n\n/**\n * Loads the next modules on the queue.\n * @private\n */\ngoog.module.ModuleManager.prototype.loadNextModules_ = function() {\n  while (this.requestedModuleIdsQueue_.length) {\n    // Remove modules that are already loaded.\n    var nextIds =\n        goog.array.filter(this.requestedModuleIdsQueue_.shift(), function(id) {\n          return !this.getModuleInfo(id).isLoaded();\n        }, this);\n    if (nextIds.length > 0) {\n      this.loadModules_(nextIds);\n      return;\n    }\n  }\n\n  // Dispatch an active/idle change if needed.\n  this.dispatchActiveIdleChangeIfNeeded_();\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.registerCallback = function(types, fn) {\n  if (!goog.isArray(types)) {\n    types = [types];\n  }\n\n  for (var i = 0; i < types.length; i++) {\n    this.registerCallback_(types[i], fn);\n  }\n};\n\n\n/**\n * Register a callback for the specified callback type.\n * @param {!goog.loader.AbstractModuleManager.CallbackType} type The callback\n *     type.\n * @param {!Function} fn The callback function.\n * @private\n */\ngoog.module.ModuleManager.prototype.registerCallback_ = function(type, fn) {\n  var callbackMap = this.callbackMap_;\n  if (!callbackMap[type]) {\n    callbackMap[type] = [];\n  }\n  callbackMap[type].push(fn);\n};\n\n\n/**\n * Call the callback functions of the specified type.\n * @param {!goog.loader.AbstractModuleManager.CallbackType} type The callback\n *     type.\n * @private\n */\ngoog.module.ModuleManager.prototype.executeCallbacks_ = function(type) {\n  var callbacks = this.callbackMap_[type];\n  for (var i = 0; callbacks && i < callbacks.length; i++) {\n    callbacks[i](type);\n  }\n};\n\n\n/** @override */\ngoog.module.ModuleManager.prototype.dispose = function() {\n  // Dispose of each ModuleInfo object.\n  goog.disposeAll(\n      goog.object.getValues(this.moduleInfoMap), this.baseModuleInfo_);\n  this.moduleInfoMap = {};\n  this.loadingModuleIds_ = [];\n  this.requestedLoadingModuleIds_ = [];\n  this.userInitiatedLoadingModuleIds_ = [];\n  this.requestedModuleIdsQueue_ = [];\n  this.callbackMap_ = {};\n  this.isDisposed_ = true;\n};\n\n/** @override */\ngoog.module.ModuleManager.prototype.isDisposed = function() {\n  return this.isDisposed_;\n};\n\ngoog.loader.activeModuleManager.setDefault(function() {\n  return new goog.module.ModuleManager();\n});\n","^;",1579837703000,"^<",["^=",["^1L","^14","^9=","^9>","^9?","^?","^42","~$goog.disposeAll","^18","~$goog.loader.activeModuleManager","~$goog.disposable.IDisposable","^5<","^2O","^:?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/module/modulemanager.js"],"^O",["^=",["~$goog.module.ModuleManager.CallbackType","~$goog.module.ModuleManager","~$goog.module.ModuleManager.FailureType"]],"^W",true,"^X",["^?","^2O","^1L","^5<","^:?","^:F","^:D","^9?","^:E","^18","^14","^9>","^9=","^42"]],["^ ","^3",[1579837703000],"^4","goog.editor.icontent.js","^5",["^6","goog/editor/icontent.js"],"^7","goog/editor/icontent.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved.\n\n/**\n * @fileoverview Static functions for writing the contents of an iframe-based\n * editable field. These vary significantly from browser to browser. Uses\n * strings and document.write instead of DOM manipulation, because\n * iframe-loading is a performance bottleneck.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.provide('goog.editor.icontent');\ngoog.provide('goog.editor.icontent.FieldFormatInfo');\ngoog.provide('goog.editor.icontent.FieldStyleInfo');\n\ngoog.require('goog.dom');\ngoog.require('goog.editor.BrowserFeature');\ngoog.require('goog.style');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A data structure for storing simple rendering info about a field.\n *\n * @param {string} fieldId The id of the field.\n * @param {boolean} standards Whether the field should be rendered in\n *     standards mode.\n * @param {boolean} blended Whether the field is in blended mode.\n * @param {boolean} fixedHeight Whether the field is in fixedHeight mode.\n * @param {Object=} opt_extraStyles Other style attributes for the field,\n *     represented as a map of strings.\n * @constructor\n * @final\n */\ngoog.editor.icontent.FieldFormatInfo = function(\n    fieldId, standards, blended, fixedHeight, opt_extraStyles) {\n  this.fieldId_ = fieldId;\n  this.standards_ = standards;\n  this.blended_ = blended;\n  this.fixedHeight_ = fixedHeight;\n  this.extraStyles_ = opt_extraStyles || {};\n};\n\n\n\n/**\n * A data structure for storing simple info about the styles of a field.\n * Only needed in Firefox/Blended mode.\n * @param {Element} wrapper The wrapper div around a field.\n * @param {string} css The css for a field.\n * @constructor\n * @final\n */\ngoog.editor.icontent.FieldStyleInfo = function(wrapper, css) {\n  this.wrapper_ = wrapper;\n  this.css_ = css;\n};\n\n\n/**\n * Whether to always use standards-mode iframes.\n * @type {boolean}\n * @private\n */\ngoog.editor.icontent.useStandardsModeIframes_ = false;\n\n\n/**\n * Sets up goog.editor.icontent to always use standards-mode iframes.\n */\ngoog.editor.icontent.forceStandardsModeIframes = function() {\n  goog.editor.icontent.useStandardsModeIframes_ = true;\n};\n\n\n/**\n * Generate the initial iframe content.\n * @param {goog.editor.icontent.FieldFormatInfo} info Formatting info about\n *     the field.\n * @param {string} bodyHtml The HTML to insert as the iframe body.\n * @param {goog.editor.icontent.FieldStyleInfo?} style Style info about\n *     the field, if needed.\n * @return {string} The initial IFRAME content HTML.\n * @private\n */\ngoog.editor.icontent.getInitialIframeContent_ = function(\n    info, bodyHtml, style) {\n  var html = [];\n\n  if (info.blended_ && info.standards_ ||\n      goog.editor.icontent.useStandardsModeIframes_) {\n    html.push('<!DOCTYPE HTML>');\n  }\n\n  // <HTML>\n  // NOTE(user): Override min-widths that may be set for all\n  // HTML/BODY nodes. A similar workaround is below for the <body> tag. This\n  // can happen if the host page includes a rule like this in its CSS:\n  //\n  // html, body {min-width: 500px}\n  //\n  // In this case, the iframe's <html> and/or <body> may be affected. This was\n  // part of the problem observed in http://b/5674613. (The other part of that\n  // problem had to do with the presence of a spurious horizontal scrollbar,\n  // which caused the editor height to be computed incorrectly.)\n  html.push('<html style=\"background:none transparent;min-width:0;');\n\n  // Make sure that the HTML element's height has the\n  // correct value as the body element's percentage height is made relative\n  // to the HTML element's height.\n  // For fixed-height it should be 100% since we want the body to fill the\n  // whole height. For growing fields it should be auto since we want the\n  // body to size to its content.\n  if (info.blended_) {\n    html.push('height:', info.fixedHeight_ ? '100%' : 'auto');\n  }\n  html.push('\">');\n\n  // <HEAD><STYLE>\n\n  // IE/Safari whitebox need styles set only iff the client specifically\n  // requested them.\n  html.push('<head><style>');\n  if (style && style.css_) {\n    html.push(style.css_);\n  }\n\n  // Firefox blended needs to inherit all the css from the original page.\n  // Firefox standards mode needs to set extra style for images.\n  if (goog.userAgent.GECKO && info.standards_) {\n    // Standards mode will collapse broken images.  This means that they\n    // can never be removed from the field.  This style forces the images\n    // to render as a broken image icon, sized based on the width and height\n    // of the image.\n    // TODO(user): Make sure we move this into a contentEditable code\n    // path if there ever is one for FF.\n    html.push(' img {-moz-force-broken-image-icon: 1;}');\n  }\n\n  html.push('</style></head>');\n\n  // <BODY>\n  // Hidefocus is needed to ensure that IE7 doesn't show the dotted, focus\n  // border when you tab into the field.\n  html.push('<body g_editable=\"true\" hidefocus=\"true\" ');\n  if (goog.editor.BrowserFeature.HAS_CONTENT_EDITABLE) {\n    html.push('contentEditable ');\n  }\n\n  html.push('class=\"editable ');\n\n  // TODO: put the field's original ID on the body and stop using ID as a\n  // way of getting the pointer to the field in the iframe now that it's\n  // always the body.\n  html.push('\" id=\"', info.fieldId_, '\" style=\"min-width:0;');\n\n  if (goog.userAgent.GECKO && info.blended_) {\n    // IMPORTANT: Apply the css from the body then all of the clearing\n    // CSS to make sure the clearing CSS overrides (e.g. if the body\n    // has a 3px margin, we want to make sure to override it with 0px.\n    html.push(\n\n        // margin should not be applied to blended mode because the margin is\n        // outside the iframe\n        // In whitebox mode, we want to leave the margin to the default so\n        // there is a nice margin around the text.\n        ';width:100%;border:0;margin:0;background:none transparent;',\n\n        // In standards-mode, height 100% makes the body size to its\n        // parent html element, but in quirks mode, we want auto because\n        // 100% makes it size to the containing window even if the html\n        // element is smaller.\n        // TODO: Fixed height, standards mode, CSS_WRITING, with margins on the\n        // paragraphs has a scrollbar when it doesn't need it.  Putting the\n        // height to auto seems to fix it.  Figure out if we should always\n        // just use auto?\n        ';height:', info.standards_ ? '100%' : 'auto');\n\n    // Only do this for mozilla. IE6 standards mode has a rendering bug when\n    // there are scrollbars and the body's overflow property is auto\n    if (info.fixedHeight_) {\n      html.push(';overflow:auto');\n    } else {\n      html.push(';overflow-y:hidden;overflow-x:auto');\n    }\n  }\n\n  // Hide the native focus rect in Opera.\n  if (goog.userAgent.OPERA) {\n    html.push(';outline:hidden');\n  }\n\n  for (var key in info.extraStyles_) {\n    html.push(';' + key + ':' + info.extraStyles_[key]);\n  }\n\n  html.push('\">', bodyHtml, '</body></html>');\n\n  return html.join('');\n};\n\n\n/**\n * Write the initial iframe content in normal mode.\n * @param {goog.editor.icontent.FieldFormatInfo} info Formatting info about\n *     the field.\n * @param {string} bodyHtml The HTML to insert as the iframe body.\n * @param {goog.editor.icontent.FieldStyleInfo?} style Style info about\n *     the field, if needed.\n * @param {HTMLIFrameElement} iframe The iframe.\n */\ngoog.editor.icontent.writeNormalInitialBlendedIframe = function(\n    info, bodyHtml, style, iframe) {\n  // Firefox blended needs to inherit all the css from the original page.\n  // Firefox standards mode needs to set extra style for images.\n  if (info.blended_) {\n    var field = style.wrapper_;\n    // If there is padding on the original field, then the iFrame will be\n    // positioned inside the padding by default.  We don't want this, as it\n    // causes the contents to appear to shift, and also causes the\n    // scrollbars to appear inside the padding.\n    //\n    // To compensate, we set the iframe margins to offset the padding.\n    var paddingBox = goog.style.getPaddingBox(field);\n    if (paddingBox.top || paddingBox.left || paddingBox.right ||\n        paddingBox.bottom) {\n      goog.style.setStyle(\n          iframe, 'margin', (-paddingBox.top) + 'px ' + (-paddingBox.right) +\n              'px ' + (-paddingBox.bottom) + 'px ' + (-paddingBox.left) + 'px');\n    }\n  }\n\n  goog.editor.icontent.writeNormalInitialIframe(info, bodyHtml, style, iframe);\n};\n\n\n/**\n * Write the initial iframe content in normal mode.\n * @param {goog.editor.icontent.FieldFormatInfo} info Formatting info about\n *     the field.\n * @param {string} bodyHtml The HTML to insert as the iframe body.\n * @param {goog.editor.icontent.FieldStyleInfo?} style Style info about\n *     the field, if needed.\n * @param {HTMLIFrameElement} iframe The iframe.\n */\ngoog.editor.icontent.writeNormalInitialIframe = function(\n    info, bodyHtml, style, iframe) {\n\n  var html =\n      goog.editor.icontent.getInitialIframeContent_(info, bodyHtml, style);\n\n  var doc = goog.dom.getFrameContentDocument(iframe);\n  doc.open();\n  doc.write(html);\n  doc.close();\n};\n\n\n/**\n * Write the initial iframe content in IE/HTTPS mode.\n * @param {goog.editor.icontent.FieldFormatInfo} info Formatting info about\n *     the field.\n * @param {Document} doc The iframe document.\n * @param {string} bodyHtml The HTML to insert as the iframe body.\n */\ngoog.editor.icontent.writeHttpsInitialIframe = function(info, doc, bodyHtml) {\n  var body = doc.body;\n\n  // For HTTPS we already have a document with a doc type and a body element\n  // and don't want to create a new history entry which can cause data loss if\n  // the user clicks the back button.\n  if (goog.editor.BrowserFeature.HAS_CONTENT_EDITABLE) {\n    body.contentEditable = true;\n  }\n  body.className = 'editable';\n  body.setAttribute('g_editable', true);\n  body.hideFocus = true;\n  body.id = info.fieldId_;\n\n  goog.style.setStyle(body, info.extraStyles_);\n  body.innerHTML = bodyHtml;\n};\n","^;",1579837703000,"^<",["^=",["^1>","^1@","^?","^[","^1F"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/icontent.js"],"^O",["^=",["^1?","^1B","^1J"]],"^W",true,"^X",["^?","^1>","^1@","^1F","^["]],["^ ","^3",[1579837703000],"^4","goog.debug.errorhandler.js","^5",["^6","goog/debug/errorhandler.js"],"^7","goog/debug/errorhandler.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Error handling utilities.\n *\n */\n\ngoog.provide('goog.debug.ErrorHandler');\ngoog.provide('goog.debug.ErrorHandler.ProtectedFunctionError');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.asserts');\ngoog.require('goog.debug');\ngoog.require('goog.debug.EntryPointMonitor');\ngoog.require('goog.debug.Error');\ngoog.require('goog.debug.Trace');\n\n\n\n/**\n * The ErrorHandler can be used to to wrap functions with a try/catch\n * statement. If an exception is thrown, the given error handler function will\n * be called.\n *\n * When this object is disposed, it will stop handling exceptions and tracing.\n * It will also try to restore window.setTimeout and window.setInterval\n * if it wrapped them. Notice that in the general case, it is not technically\n * possible to remove the wrapper, because functions have no knowledge of\n * what they have been assigned to. So the app is responsible for other\n * forms of unwrapping.\n *\n * @param {Function} handler Handler for exceptions.\n * @constructor\n * @extends {goog.Disposable}\n * @implements {goog.debug.EntryPointMonitor}\n */\ngoog.debug.ErrorHandler = function(handler) {\n  goog.debug.ErrorHandler.base(this, 'constructor');\n\n  /**\n   * Handler for exceptions, which can do logging, reporting, etc.\n   * @type {Function}\n   * @private\n   */\n  this.errorHandlerFn_ = handler;\n\n  /**\n   * Whether errors should be wrapped in\n   * goog.debug.ErrorHandler.ProtectedFunctionError before rethrowing.\n   * @type {boolean}\n   * @private\n   */\n  this.wrapErrors_ = true;  // TODO(user) Change default.\n\n  /**\n   * Whether to add a prefix to all error messages. The prefix is\n   * goog.debug.ErrorHandler.ProtectedFunctionError.MESSAGE_PREFIX. This option\n   * only has an effect if this.wrapErrors_  is set to false.\n   * @type {boolean}\n   * @private\n   */\n  this.prefixErrorMessages_ = false;\n};\ngoog.inherits(goog.debug.ErrorHandler, goog.Disposable);\n\n\n/**\n * Whether to add tracers when instrumenting entry points.\n * @type {boolean}\n * @private\n */\ngoog.debug.ErrorHandler.prototype.addTracersToProtectedFunctions_ = false;\n\n\n/**\n * Enable tracers when instrumenting entry points.\n * @param {boolean} newVal See above.\n */\ngoog.debug.ErrorHandler.prototype.setAddTracersToProtectedFunctions = function(\n    newVal) {\n  this.addTracersToProtectedFunctions_ = newVal;\n};\n\n\n/** @override */\ngoog.debug.ErrorHandler.prototype.wrap = function(fn) {\n  return this.protectEntryPoint(goog.asserts.assertFunction(fn));\n};\n\n\n/** @override */\ngoog.debug.ErrorHandler.prototype.unwrap = function(fn) {\n  goog.asserts.assertFunction(fn);\n  return fn[this.getFunctionIndex_(false)] || fn;\n};\n\n\n/**\n * Private helper function to return a span that can be clicked on to display\n * an alert with the current stack trace. Newlines are replaced with a\n * placeholder so that they will not be html-escaped.\n * @param {string} stackTrace The stack trace to create a span for.\n * @return {string} A span which can be clicked on to show the stack trace.\n * @private\n */\ngoog.debug.ErrorHandler.prototype.getStackTraceHolder_ = function(stackTrace) {\n  var buffer = [];\n  buffer.push('##PE_STACK_START##');\n  buffer.push(stackTrace.replace(/(\\r\\n|\\r|\\n)/g, '##STACK_BR##'));\n  buffer.push('##PE_STACK_END##');\n  return buffer.join('');\n};\n\n\n/**\n * Get the index for a function. Used for internal indexing.\n * @param {boolean} wrapper True for the wrapper; false for the wrapped.\n * @return {string} The index where we should store the function in its\n *     wrapper/wrapped function.\n * @private\n */\ngoog.debug.ErrorHandler.prototype.getFunctionIndex_ = function(wrapper) {\n  return (wrapper ? '__wrapper_' : '__protected_') + goog.getUid(this) + '__';\n};\n\n\n/**\n * Installs exception protection for an entry point function. When an exception\n * is thrown from a protected function, a handler will be invoked to handle it.\n *\n * @param {Function} fn An entry point function to be protected.\n * @return {!Function} A protected wrapper function that calls the entry point\n *     function.\n */\ngoog.debug.ErrorHandler.prototype.protectEntryPoint = function(fn) {\n  var protectedFnName = this.getFunctionIndex_(true);\n  if (!fn[protectedFnName]) {\n    var wrapper = fn[protectedFnName] = this.getProtectedFunction(fn);\n    wrapper[this.getFunctionIndex_(false)] = fn;\n  }\n  return fn[protectedFnName];\n};\n\n\n/**\n * Helps {@link #protectEntryPoint} by actually creating the protected\n * wrapper function, after {@link #protectEntryPoint} determines that one does\n * not already exist for the given function.  Can be overridden by subclasses\n * that may want to implement different error handling, or add additional\n * entry point hooks.\n * @param {!Function} fn An entry point function to be protected.\n * @return {!Function} protected wrapper function.\n * @protected\n */\ngoog.debug.ErrorHandler.prototype.getProtectedFunction = function(fn) {\n  var that = this;\n  var tracers = this.addTracersToProtectedFunctions_;\n  if (tracers) {\n    var stackTrace = goog.debug.getStacktraceSimple(15);\n  }\n  var googDebugErrorHandlerProtectedFunction = function() {\n    var self = /** @type {?} */ (this);\n    if (that.isDisposed()) {\n      return fn.apply(self, arguments);\n    }\n\n    if (tracers) {\n      var tracer = goog.debug.Trace.startTracer(\n          'protectedEntryPoint: ' + that.getStackTraceHolder_(stackTrace));\n    }\n    try {\n      return fn.apply(self, arguments);\n    } catch (e) {\n      that.handleError_(e);\n    } finally {\n      if (tracers) {\n        goog.debug.Trace.stopTracer(tracer);\n      }\n    }\n  };\n  googDebugErrorHandlerProtectedFunction[this.getFunctionIndex_(false)] = fn;\n  return googDebugErrorHandlerProtectedFunction;\n};\n\n\n/**\n * Internal error handler.\n * @param {?} e The error string or an Error-like object.\n * @private\n */\ngoog.debug.ErrorHandler.prototype.handleError_ = function(e) {\n  // Don't re-report errors that have already been handled by this code.\n  var MESSAGE_PREFIX =\n      goog.debug.ErrorHandler.ProtectedFunctionError.MESSAGE_PREFIX;\n  if ((e && typeof e === 'object' && typeof e.message === 'string' &&\n       e.message.indexOf(MESSAGE_PREFIX) == 0) ||\n      (typeof e === 'string' && e.indexOf(MESSAGE_PREFIX) == 0)) {\n    return;\n  }\n  this.errorHandlerFn_(e);\n  if (!this.wrapErrors_) {\n    // Add the prefix to the existing message.\n    if (this.prefixErrorMessages_) {\n      if (typeof e === 'object' && e && typeof e.message === 'string') {\n        /** @type {{message}} */ (e).message = MESSAGE_PREFIX + e.message;\n      } else {\n        e = MESSAGE_PREFIX + e;\n      }\n    }\n    if (goog.DEBUG) {\n      // Work around for https://code.google.com/p/v8/issues/detail?id=2625\n      // and https://code.google.com/p/chromium/issues/detail?id=237059\n      // Custom errors and errors with custom stack traces show the wrong\n      // stack trace\n      // If it has a stack and Error.captureStackTrace is supported (only\n      // supported in V8 as of May 2013) log the stack to the console.\n      if (e && typeof e.stack === 'string' && Error.captureStackTrace &&\n          goog.global['console']) {\n        goog.global['console']['error'](e.message, e.stack);\n      }\n    }\n    // Re-throw original error. This is great for debugging as it makes\n    // browser JS dev consoles show the correct error and stack trace.\n    throw e;\n  }\n  // Re-throw it since this may be expected by the caller.\n  throw new goog.debug.ErrorHandler.ProtectedFunctionError(e);\n};\n\n\n// TODO(mknichel): Allow these functions to take in the window to protect.\n/**\n * Installs exception protection for window.setTimeout to handle exceptions.\n */\ngoog.debug.ErrorHandler.prototype.protectWindowSetTimeout = function() {\n  this.protectWindowFunctionsHelper_('setTimeout');\n};\n\n\n/**\n * Install exception protection for window.setInterval to handle exceptions.\n */\ngoog.debug.ErrorHandler.prototype.protectWindowSetInterval = function() {\n  this.protectWindowFunctionsHelper_('setInterval');\n};\n\n\n/**\n * Install an unhandledrejection event listener that reports rejected promises.\n * Note: this will only work with Chrome 49+ and friends, but so far is the only\n * way to report uncaught errors in aysnc/await functions.\n */\ngoog.debug.ErrorHandler.prototype.catchUnhandledRejections = function() {\n  if ('onunhandledrejection' in goog.global) {\n    goog.global.onunhandledrejection = (event) => {\n      // event.reason contains the rejection reason. When an Error is\n      // thrown, this is the Error object. If it is undefined, create a new\n      // error object.\n      const e =\n          event && event.reason ? event.reason : new Error('uncaught error');\n      this.handleError_(e);\n    };\n  }\n};\n\n\n/**\n * Install exception protection for window.requestAnimationFrame to handle\n * exceptions.\n */\ngoog.debug.ErrorHandler.prototype.protectWindowRequestAnimationFrame =\n    function() {\n  var win = goog.getObjectByName('window');\n  var fnNames = [\n    'requestAnimationFrame', 'mozRequestAnimationFrame', 'webkitAnimationFrame',\n    'msRequestAnimationFrame'\n  ];\n  for (var i = 0; i < fnNames.length; i++) {\n    var fnName = fnNames[i];\n    if (fnNames[i] in win) {\n      this.protectWindowFunctionsHelper_(fnName);\n    }\n  }\n};\n\n\n/**\n * Helper function for protecting a function that causes a function to be\n * asynchronously called, for example setTimeout or requestAnimationFrame.\n * @param {string} fnName The name of the function to protect.\n * @private\n */\ngoog.debug.ErrorHandler.prototype.protectWindowFunctionsHelper_ = function(\n    fnName) {\n  var win = goog.getObjectByName('window');\n  var originalFn = win[fnName];\n  var that = this;\n  win[fnName] = function(fn, time) {\n    // Don't try to protect strings. In theory, we could try to globalEval\n    // the string, but this seems to lead to permission errors on IE6.\n    if (typeof fn === 'string') {\n      fn = goog.partial(goog.globalEval, fn);\n    }\n    arguments[0] = fn = that.protectEntryPoint(fn);\n\n    // IE doesn't support .call for setInterval/setTimeout, but it\n    // also doesn't care what \"this\" is, so we can just call the\n    // original function directly\n    if (originalFn.apply) {\n      return originalFn.apply(/** @type {?} */ (this), arguments);\n    } else {\n      var callback = fn;\n      if (arguments.length > 2) {\n        var args = Array.prototype.slice.call(arguments, 2);\n        callback = function() {\n          fn.apply(/** @type {?} */ (this), args);\n        };\n      }\n      return originalFn(callback, time);\n    }\n  };\n  win[fnName][this.getFunctionIndex_(false)] = originalFn;\n};\n\n\n/**\n * Set whether to wrap errors that occur in protected functions in a\n * goog.debug.ErrorHandler.ProtectedFunctionError.\n * @param {boolean} wrapErrors Whether to wrap errors.\n */\ngoog.debug.ErrorHandler.prototype.setWrapErrors = function(wrapErrors) {\n  this.wrapErrors_ = wrapErrors;\n};\n\n\n/**\n * Set whether to add a prefix to all error messages that occur in protected\n * functions.\n * @param {boolean} prefixErrorMessages Whether to add a prefix to error\n *     messages.\n */\ngoog.debug.ErrorHandler.prototype.setPrefixErrorMessages = function(\n    prefixErrorMessages) {\n  this.prefixErrorMessages_ = prefixErrorMessages;\n};\n\n\n/** @override */\ngoog.debug.ErrorHandler.prototype.disposeInternal = function() {\n  // Try to unwrap window.setTimeout and window.setInterval.\n  var win = goog.getObjectByName('window');\n  win.setTimeout = this.unwrap(win.setTimeout);\n  win.setInterval = this.unwrap(win.setInterval);\n\n  goog.debug.ErrorHandler.base(this, 'disposeInternal');\n};\n\n\n\n/**\n * Error thrown to the caller of a protected entry point if the entry point\n * throws an error.\n * @param {*} cause The error thrown by the entry point.\n * @constructor\n * @extends {goog.debug.Error}\n * @final\n */\ngoog.debug.ErrorHandler.ProtectedFunctionError = function(cause) {\n  /** @suppress {missingProperties} message may not be defined. */\n  var message = goog.debug.ErrorHandler.ProtectedFunctionError.MESSAGE_PREFIX +\n      (cause && cause.message ? String(cause.message) : String(cause));\n  goog.debug.ErrorHandler.ProtectedFunctionError.base(\n      this, 'constructor', message);\n\n  /**\n   * The error thrown by the entry point.\n   * @type {*}\n   */\n  this.cause = cause;\n\n  /** @suppress {missingProperties} stack may not be defined. */\n  var stack = cause && cause.stack;\n  if (stack && typeof stack === 'string') {\n    this.stack = /** @type {string} */ (stack);\n  }\n};\ngoog.inherits(goog.debug.ErrorHandler.ProtectedFunctionError, goog.debug.Error);\n\n\n/**\n * Text to prefix the message with.\n * @type {string}\n */\ngoog.debug.ErrorHandler.ProtectedFunctionError.MESSAGE_PREFIX =\n    'Error in protected function: ';\n","^;",1579837703000,"^<",["^=",["^1L","^?","^7N","^90","^1:","~$goog.debug.EntryPointMonitor","^:?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/errorhandler.js"],"^O",["^=",["~$goog.debug.ErrorHandler.ProtectedFunctionError","~$goog.debug.ErrorHandler"]],"^W",true,"^X",["^?","^1:","^1L","^90","^:J","^7N","^:?"]],["^ ","^3",[1579837703000],"^4","goog.cssom.iframe.style.js","^5",["^6","goog/cssom/iframe/style.js"],"^7","goog/cssom/iframe/style.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved.\n\n/**\n * @fileoverview Provides utility routines for copying modified\n * `CSSRule` objects from the parent document into iframes so that any\n * content in the iframe will be styled as if it was inline in the parent\n * document.\n *\n * <p>\n * For example, you might have this CSS rule:\n *\n * #content .highlighted { background-color: yellow; }\n *\n * And this DOM structure:\n *\n * <div id=\"content\">\n *   <iframe />\n * </div>\n *\n * Then inside the iframe you have:\n *\n * <body>\n * <div class=\"highlighted\">\n * </body>\n *\n * If you copied the CSS rule directly into the iframe, it wouldn't match the\n * .highlighted div. So we rewrite the original stylesheets based on the\n * context where the iframe is going to be inserted. In this case the CSS\n * selector would be rewritten to:\n *\n * body .highlighted { background-color: yellow; }\n * </p>\n *\n */\n\n\ngoog.provide('goog.cssom.iframe.style');\n\ngoog.require('goog.asserts');\ngoog.require('goog.cssom');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.string');\ngoog.require('goog.style');\ngoog.require('goog.userAgent');\n\n\n/**\n * Regexp that matches \"a\", \"a:link\", \"a:visited\", etc.\n * @type {RegExp}\n * @private\n */\ngoog.cssom.iframe.style.selectorPartAnchorRegex_ =\n    /a(:(link|visited|active|hover))?/;\n\n\n/**\n * Delimiter between selectors (h1, h2)\n * @type {string}\n * @private\n */\ngoog.cssom.iframe.style.SELECTOR_DELIMITER_ = ',';\n\n\n/**\n * Delimiter between selector parts (.main h1)\n * @type {string}\n * @private\n */\ngoog.cssom.iframe.style.SELECTOR_PART_DELIMITER_ = ' ';\n\n\n/**\n * Delimiter marking the start of a css rules section ( h1 { )\n * @type {string}\n * @private\n */\ngoog.cssom.iframe.style.DECLARATION_START_DELIMITER_ = '{';\n\n\n/**\n * Delimiter marking the end of a css rules section ( } )\n * @type {string}\n * @private\n */\ngoog.cssom.iframe.style.DECLARATION_END_DELIMITER_ = '}\\n';\n\n\n\n/**\n * Class representing a CSS rule set. A rule set is something like this:\n * h1, h2 { font-family: Arial; color: red; }\n * @constructor\n * @private\n */\ngoog.cssom.iframe.style.CssRuleSet_ = function() {\n  /**\n   * Text of the declarations inside the rule set.\n   * For example: 'font-family: Arial; color: red;'\n   * @type {string}\n   */\n  this.declarationText = '';\n\n  /**\n   * Array of CssSelector objects, one for each selector.\n   * Example: [h1, h2]\n   * @type {Array<goog.cssom.iframe.style.CssSelector_>}\n   */\n  this.selectors = [];\n};\n\n\n/**\n * Initializes the rule set from a `CSSRule`.\n *\n * @param {CSSRule} cssRule The `CSSRule` to initialize from.\n * @return {boolean} True if initialization succeeded. We only support\n *     `CSSStyleRule` and `CSSFontFaceRule` objects.\n */\ngoog.cssom.iframe.style.CssRuleSet_.prototype.initializeFromCssRule = function(\n    cssRule) {\n  var ruleStyle = cssRule.style;  // Cache object for performance.\n  if (!ruleStyle) {\n    return false;\n  }\n  var selector;\n  var declarations = '';\n  if (ruleStyle && (selector = cssRule.selectorText) &&\n      (declarations = ruleStyle.cssText)) {\n    // IE get confused about cssText context if a stylesheet uses the\n    // mid-pass hack, and it ends up with an open comment (/*) but no\n    // closing comment. This will effectively comment out large parts\n    // of generated stylesheets later. This errs on the safe side by\n    // always tacking on an empty comment to force comments to be closed\n    // We used to check for a troublesome open comment using a regular\n    // expression, but it's faster not to check and always do this.\n    if (goog.userAgent.IE) {\n      declarations += '/* */';\n    }\n  } else if (cssRule.cssText) {\n    var cssSelectorMatch = /([^\\{]+)\\{/;\n    var endTagMatch = /\\}[^\\}]*$/g;\n    // cssRule.cssText contains both selector and declarations:\n    // parse them out.\n    selector = cssSelectorMatch.exec(cssRule.cssText)[1];\n    // Remove selector, {, and trailing }.\n    declarations =\n        cssRule.cssText.replace(cssSelectorMatch, '').replace(endTagMatch, '');\n  }\n  if (selector) {\n    this.setSelectorsFromString(selector);\n    this.declarationText = declarations;\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Parses a selectors string (which may contain multiple comma-delimited\n * selectors) and loads the results into this.selectors.\n * @param {string} selectorsString String containing selectors.\n */\ngoog.cssom.iframe.style.CssRuleSet_.prototype.setSelectorsFromString = function(\n    selectorsString) {\n  this.selectors = [];\n  var selectors = selectorsString.split(/,\\s*/gm);\n  for (var i = 0; i < selectors.length; i++) {\n    var selector = selectors[i];\n    if (selector.length > 0) {\n      this.selectors.push(new goog.cssom.iframe.style.CssSelector_(selector));\n    }\n  }\n};\n\n\n/**\n * Make a copy of this ruleset.\n * @return {!goog.cssom.iframe.style.CssRuleSet_} A new CssRuleSet containing\n *     the same data as this one.\n */\ngoog.cssom.iframe.style.CssRuleSet_.prototype.clone = function() {\n  var newRuleSet = new goog.cssom.iframe.style.CssRuleSet_();\n  newRuleSet.selectors = this.selectors.concat();\n  newRuleSet.declarationText = this.declarationText;\n  return newRuleSet;\n};\n\n\n/**\n * Set the declaration text with properties from a given object.\n * @param {Object} sourceObject Object whose properties and values should\n *     be used to generate the declaration text.\n * @param {boolean=} opt_important Whether !important should be added to each\n *     declaration.\n */\ngoog.cssom.iframe.style.CssRuleSet_.prototype.setDeclarationTextFromObject =\n    function(sourceObject, opt_important) {\n  var stringParts = [];\n  // TODO(user): for ... in is costly in IE6 (extra garbage collection).\n  for (var prop in sourceObject) {\n    var value = sourceObject[prop];\n    if (value) {\n      stringParts.push(\n          prop, ':', value, (opt_important ? ' !important' : ''), ';');\n    }\n  }\n  this.declarationText = stringParts.join('');\n};\n\n\n/**\n * Serializes this CssRuleSet_ into an array as a series of strings.\n * The array can then be join()-ed to get a string representation\n * of this ruleset.\n * @param {Array<string>} array The array to which to append strings.\n */\ngoog.cssom.iframe.style.CssRuleSet_.prototype.writeToArray = function(array) {\n  var selectorCount = this.selectors.length;\n  var matchesAnchorTag = false;\n  for (var i = 0; i < selectorCount; i++) {\n    var selectorParts = this.selectors[i].parts;\n    var partCount = selectorParts.length;\n    for (var j = 0; j < partCount; j++) {\n      array.push(\n          selectorParts[j].inputString_,\n          goog.cssom.iframe.style.SELECTOR_PART_DELIMITER_);\n    }\n    if (i < (selectorCount - 1)) {\n      array.push(goog.cssom.iframe.style.SELECTOR_DELIMITER_);\n    }\n    if (goog.userAgent.GECKO && !goog.userAgent.isVersionOrHigher('1.9a')) {\n      // In Gecko pre-1.9 (Firefox 2 and lower) we need to add !important\n      // to rulesets that match \"A\" tags, otherwise Gecko's built-in\n      // stylesheet will take precedence when designMode is on.\n      matchesAnchorTag = matchesAnchorTag ||\n          goog.cssom.iframe.style.selectorPartAnchorRegex_.test(\n              selectorParts[partCount - 1].inputString_);\n    }\n  }\n  var declarationText = this.declarationText;\n  if (matchesAnchorTag) {\n    declarationText =\n        goog.cssom.iframe.style.makeColorRuleImportant_(declarationText);\n  }\n  array.push(\n      goog.cssom.iframe.style.DECLARATION_START_DELIMITER_, declarationText,\n      goog.cssom.iframe.style.DECLARATION_END_DELIMITER_);\n};\n\n\n/**\n * Regexp that matches \"color: value;\".\n * @type {RegExp}\n * @private\n */\ngoog.cssom.iframe.style.colorImportantReplaceRegex_ =\n    /(^|;|{)\\s*color:([^;]+);/g;\n\n\n/**\n * Adds !important to a css color: rule\n * @param {string} cssText Text of the CSS rule(s) to modify.\n * @return {string} Text with !important added to the color: rule if found.\n * @private\n */\ngoog.cssom.iframe.style.makeColorRuleImportant_ = function(cssText) {\n  // Replace to insert a \"! important\" string.\n  return cssText.replace(\n      goog.cssom.iframe.style.colorImportantReplaceRegex_,\n      '$1 color: $2 ! important; ');\n};\n\n\n\n/**\n * Represents a single CSS selector, as described in\n * http://www.w3.org/TR/REC-CSS2/selector.html\n * Currently UNSUPPORTED are the following selector features:\n * <ul>\n *   <li>pseudo-classes (:hover)\n *   <li>child selectors (div > h1)\n *   <li>adjacent sibling selectors (div + h1)\n *   <li>attribute selectors (input[type=submit])\n * </ul>\n * @param {string=} opt_selectorString String containing selectors to parse.\n * @constructor\n * @private\n */\ngoog.cssom.iframe.style.CssSelector_ = function(opt_selectorString) {\n  /** @type {!Array<!goog.cssom.iframe.style.CssSelectorPart_>|undefined} */\n  this.parts;\n\n  /**\n   * Object to track ancestry matches to speed up repeatedly testing this\n   * CssSelector against the same NodeAncestry object.\n   * @type {Object}\n   * @private\n   */\n  this.ancestryMatchCache_ = {};\n  if (opt_selectorString) {\n    this.setPartsFromString_(opt_selectorString);\n  }\n};\n\n\n/**\n * Parses a selector string into individual parts.\n * @param {string} selectorString A string containing a CSS selector.\n * @private\n */\ngoog.cssom.iframe.style.CssSelector_.prototype.setPartsFromString_ = function(\n    selectorString) {\n  var parts = [];\n  var selectorPartStrings = selectorString.split(/\\s+/gm);\n  for (var i = 0; i < selectorPartStrings.length; i++) {\n    if (!selectorPartStrings[i]) {\n      continue;  // Skip empty strings.\n    }\n    var part =\n        new goog.cssom.iframe.style.CssSelectorPart_(selectorPartStrings[i]);\n    parts.push(part);\n  }\n  this.parts = parts;\n};\n\n\n/**\n * Tests to see what part of a DOM element hierarchy would be matched by\n * this selector, and returns the indexes of the matching element and matching\n * selector part.\n * <p>\n * For example, given this hierarchy:\n *   document > html > body > div.content > div.sidebar > p\n * and this CSS selector:\n *   body div.sidebar h1\n * This would return {elementIndex: 4, selectorPartIndex: 1},\n * indicating that the element at index 4 matched\n * the css selector at index 1.\n * </p>\n * @param {goog.cssom.iframe.style.NodeAncestry_} elementAncestry Object\n *     representing an element and its ancestors.\n * @return {Object} Object with the properties elementIndex and\n *     selectorPartIndex, or null if there was no match.\n */\ngoog.cssom.iframe.style.CssSelector_.prototype.matchElementAncestry = function(\n    elementAncestry) {\n\n  var ancestryUid = elementAncestry.uid;\n  if (this.ancestryMatchCache_[ancestryUid]) {\n    return this.ancestryMatchCache_[ancestryUid];\n  }\n\n  // Walk through the selector parts and see how far down the element hierarchy\n  // we can go while matching the selector parts.\n  var elementIndex = 0;\n  var match = null;\n  var selectorPart = null;\n  var lastSelectorPart = null;\n  var ancestorNodes = elementAncestry.nodes;\n  var ancestorNodeCount = ancestorNodes.length;\n\n  for (var i = 0; i <= this.parts.length; i++) {\n    selectorPart = this.parts[i];\n    while (elementIndex < ancestorNodeCount) {\n      var currentElementInfo = ancestorNodes[elementIndex];\n      if (selectorPart && selectorPart.testElement(currentElementInfo)) {\n        match = {elementIndex: elementIndex, selectorPartIndex: i};\n        elementIndex++;\n        break;\n      } else if (\n          lastSelectorPart &&\n          lastSelectorPart.testElement(currentElementInfo)) {\n        match = {elementIndex: elementIndex, selectorPartIndex: i - 1};\n      }\n      elementIndex++;\n    }\n    lastSelectorPart = selectorPart;\n  }\n  this.ancestryMatchCache_[ancestryUid] = match;\n  return match;\n};\n\n\n\n/**\n * Represents one part of a CSS Selector. For example in the selector\n * 'body #foo .bar', body, #foo, and .bar would be considered selector parts.\n * In the official CSS spec these are called \"simple selectors\".\n * @param {string} selectorPartString A string containing the selector part\n *     in css format.\n * @constructor\n * @private\n */\ngoog.cssom.iframe.style.CssSelectorPart_ = function(selectorPartString) {\n  // Only one CssSelectorPart instance should exist for a given string.\n  var cacheEntry =\n      goog.cssom.iframe.style.CssSelectorPart_.instances_[selectorPartString];\n  if (cacheEntry) {\n    return cacheEntry;\n  }\n\n  // Optimization to avoid the more-expensive lookahead.\n  var identifiers;\n  if (selectorPartString.match(/[#\\.]/)) {\n    // Lookahead regexp, won't work on IE 5.0.\n    identifiers = selectorPartString.split(/(?=[#\\.])/);\n  } else {\n    identifiers = [selectorPartString];\n  }\n  var properties = {};\n  for (var i = 0; i < identifiers.length; i++) {\n    var identifier = identifiers[i];\n    if (identifier.charAt(0) == '.') {\n      properties.className = identifier.substring(1, identifier.length);\n    } else if (identifier.charAt(0) == '#') {\n      properties.id = identifier.substring(1, identifier.length);\n    } else {\n      properties.tagName = identifier.toUpperCase();\n    }\n  }\n  this.inputString_ = selectorPartString;\n  this.matchProperties_ = properties;\n  this.testedElements_ = {};\n  goog.cssom.iframe.style.CssSelectorPart_.instances_[selectorPartString] =\n      this;\n};\n\n\n/**\n * Cache of existing CssSelectorPart_ instances.\n * @type {Object}\n * @private\n */\ngoog.cssom.iframe.style.CssSelectorPart_.instances_ = {};\n\n\n/**\n * Test whether an element matches this selector part, considered in isolation.\n * @param {Object} elementInfo Element properties to test.\n * @return {boolean} Whether the element matched.\n */\ngoog.cssom.iframe.style.CssSelectorPart_.prototype.testElement = function(\n    elementInfo) {\n\n  var elementUid = elementInfo.uid;\n  var cachedMatch = this.testedElements_[elementUid];\n  if (typeof cachedMatch != 'undefined') {\n    return cachedMatch;\n  }\n\n  var matchProperties = this.matchProperties_;\n  var testTag = matchProperties.tagName;\n  var testClass = matchProperties.className;\n  var testId = matchProperties.id;\n\n  var matched = true;\n  if (testTag && testTag != '*' && testTag != elementInfo.nodeName) {\n    matched = false;\n  } else if (testId && testId != elementInfo.id) {\n    matched = false;\n  } else if (testClass && !elementInfo.classNames[testClass]) {\n    matched = false;\n  }\n\n  this.testedElements_[elementUid] = matched;\n  return matched;\n};\n\n\n\n/**\n * Represents an element and all its parent/ancestor nodes.\n * This class exists as an optimization so we run tests on an element\n * hierarchy multiple times without walking the dom each time.\n * @param {Element} el The DOM element whose ancestry should be stored.\n * @constructor\n * @private\n */\ngoog.cssom.iframe.style.NodeAncestry_ = function(el) {\n  var node = el;\n  var nodeUid = goog.getUid(node);\n\n  // Return an existing object from the cache if one exits for this node.\n  var ancestry = goog.cssom.iframe.style.NodeAncestry_.instances_[nodeUid];\n  if (ancestry) {\n    return ancestry;\n  }\n\n  var nodes = [];\n  do {\n    var nodeInfo = {id: node.id, nodeName: node.nodeName};\n    nodeInfo.uid = goog.getUid(nodeInfo);\n    var className = node.className;\n    var classNamesLookup = {};\n    if (className) {\n      var classNames = goog.dom.classlist.get(goog.asserts.assertElement(node));\n      for (var i = 0; i < classNames.length; i++) {\n        classNamesLookup[classNames[i]] = 1;\n      }\n    }\n    nodeInfo.classNames = classNamesLookup;\n    nodes.unshift(nodeInfo);\n  } while (node = node.parentNode);\n\n  /**\n   * Array of nodes in order of hierarchy from the top of the document\n   * to the node passed to the constructor\n   * @type {Array<Node>}\n   */\n  this.nodes = nodes;\n\n  this.uid = goog.getUid(this);\n  goog.cssom.iframe.style.NodeAncestry_.instances_[nodeUid] = this;\n};\n\n\n/**\n * Object for caching existing NodeAncestry instances.\n * @private\n */\ngoog.cssom.iframe.style.NodeAncestry_.instances_ = {};\n\n\n/**\n * Throw away all cached dom information. Call this if you've modified\n * the structure or class/id attributes of your document and you want\n * to recalculate the currently applied CSS rules.\n */\ngoog.cssom.iframe.style.resetDomCache = function() {\n  goog.cssom.iframe.style.NodeAncestry_.instances_ = {};\n};\n\n\n/**\n * Inspects a document and returns all active rule sets\n * @param {Document} doc The document from which to read CSS rules.\n * @return {!Array<goog.cssom.iframe.style.CssRuleSet_>} An array of CssRuleSet\n *     objects representing all the active rule sets in the document.\n * @private\n */\ngoog.cssom.iframe.style.getRuleSetsFromDocument_ = function(doc) {\n  var ruleSets = [];\n  var styleSheets = goog.cssom.getAllCssStyleSheets(doc.styleSheets);\n  for (var i = 0, styleSheet; styleSheet = styleSheets[i]; i++) {\n    var domRuleSets = goog.cssom.getCssRulesFromStyleSheet(styleSheet);\n    if (domRuleSets && domRuleSets.length) {\n      for (var j = 0, n = domRuleSets.length; j < n; j++) {\n        var ruleSet = new goog.cssom.iframe.style.CssRuleSet_();\n        if (ruleSet.initializeFromCssRule(domRuleSets[j])) {\n          ruleSets.push(ruleSet);\n        }\n      }\n    }\n  }\n  return ruleSets;\n};\n\n\n/**\n * Static object to cache rulesets read from documents. Inspecting all\n * active css rules is an expensive operation, so its best to only do\n * it once and then cache the results.\n * @const\n * @private\n */\ngoog.cssom.iframe.style.ruleSetCache_ = {};\n\n\n/**\n * Cache of ruleset objects keyed by document unique ID.\n * @const {!Object<number,!Array<!goog.cssom.iframe.style.CssRuleSet_>>}\n * @private\n */\ngoog.cssom.iframe.style.ruleSetCache_.cache_ = {};\n\n\n/**\n * Loads ruleset definitions from a document. If the cache already\n * has rulesets for this document the cached version will be replaced.\n * @param {Document} doc The document from which to load rulesets.\n */\ngoog.cssom.iframe.style.ruleSetCache_.loadRuleSetsForDocument = function(doc) {\n  var docUid = goog.getUid(doc);\n  goog.cssom.iframe.style.ruleSetCache_.cache_[docUid] =\n      goog.cssom.iframe.style.getRuleSetsFromDocument_(doc);\n};\n\n\n/**\n * Retrieves the array of css rulesets for this document. A cached\n * version will be used when possible.\n * @param {Document} doc The document for which to get rulesets.\n * @return {!Array<goog.cssom.iframe.style.CssRuleSet_>} An array of CssRuleSet\n *     objects representing the css rule sets in the supplied document.\n */\ngoog.cssom.iframe.style.ruleSetCache_.getRuleSetsForDocument = function(doc) {\n  var docUid = goog.getUid(doc);\n  var cache = goog.cssom.iframe.style.ruleSetCache_.cache_;\n  if (!cache[docUid]) {\n    goog.cssom.iframe.style.ruleSetCache_.loadRuleSetsForDocument(doc);\n  }\n  // Build a cloned copy of rulesets array, so if object in the returned array\n  // get modified future calls will still return the original unmodified\n  // versions.\n  var ruleSets = cache[docUid];\n  var ruleSetsCopy = [];\n  for (var i = 0; i < ruleSets.length; i++) {\n    ruleSetsCopy.push(ruleSets[i].clone());\n  }\n  return ruleSetsCopy;\n};\n\n/**\n * Array of CSS properties that are inherited by child nodes, according to\n * the CSS 2.1 spec. Properties that may be set to relative values, such\n * as font-size, and line-height, are omitted.\n * @type {Array<string>}\n * @private\n */\ngoog.cssom.iframe.style.inheritedProperties_ = [\n  'color',\n  'visibility',\n  'quotes',\n  'list-style-type',\n  'list-style-image',\n  'list-style-position',\n  'list-style',\n  'page-break-inside',\n  'orphans',\n  'widows',\n  'font-family',\n  'font-style',\n  'font-variant',\n  'font-weight',\n  'text-indent',\n  'text-align',\n  'text-transform',\n  'white-space',\n  'caption-side',\n  'border-collapse',\n  'border-spacing',\n  'empty-cells',\n  'cursor'\n];\n\n\n/**\n * Array of CSS 2.1 properties that directly effect text nodes.\n * @type {Array<string>}\n * @private\n */\ngoog.cssom.iframe.style.textProperties_ = [\n  'font-family', 'font-size', 'font-weight', 'font-variant', 'font-style',\n  'color', 'text-align', 'text-decoration', 'text-indent', 'text-transform',\n  'letter-spacing', 'white-space', 'word-spacing'\n];\n\n\n/**\n * Reads the current css rules from element's document, and returns them\n * rewriting selectors so that any rules that formerly applied to element will\n * be applied to doc.body. This makes it possible to replace a block in a page\n * with an iframe and preserve the css styling of the contents.\n *\n * @param {Element} element The element for which context should be calculated.\n * @param {boolean=} opt_forceRuleSetCacheUpdate Flag to force the internal\n *     cache of rulesets to refresh itself before we read the same.\n * @param {boolean=} opt_copyBackgroundContext Flag indicating that if the\n *     `element` has a transparent background, background rules\n *     from the nearest ancestor element(s) that have background-color\n *     and/or background-image set should be copied.\n * @return {string} String containing all CSS rules present in the original\n *     document, with modified selectors.\n * @see goog.cssom.iframe.style.getBackgroundContext.\n */\ngoog.cssom.iframe.style.getElementContext = function(\n    element, opt_forceRuleSetCacheUpdate, opt_copyBackgroundContext) {\n  var sourceDocument = element.ownerDocument;\n  if (opt_forceRuleSetCacheUpdate) {\n    goog.cssom.iframe.style.ruleSetCache_.loadRuleSetsForDocument(\n        sourceDocument);\n  }\n  var ruleSets = goog.cssom.iframe.style.ruleSetCache_.getRuleSetsForDocument(\n      sourceDocument);\n\n  var elementAncestry = new goog.cssom.iframe.style.NodeAncestry_(element);\n  var bodySelectorPart = new goog.cssom.iframe.style.CssSelectorPart_('body');\n\n  for (var i = 0; i < ruleSets.length; i++) {\n    var ruleSet = ruleSets[i];\n    var selectors = ruleSet.selectors;\n    // Cache selectors.length since we may be adding rules in the loop.\n    var ruleCount = selectors.length;\n    for (var j = 0; j < ruleCount; j++) {\n      var selector = selectors[j];\n      // Test whether all or part of this selector would match\n      // this element or one of its ancestors\n      var match = selector.matchElementAncestry(elementAncestry);\n      if (match) {\n        var ruleIndex = match.selectorPartIndex;\n        var selectorParts = selector.parts;\n        var lastSelectorPartIndex = selectorParts.length - 1;\n        var selectorCopy;\n        if (match.elementIndex == elementAncestry.nodes.length - 1 ||\n            ruleIndex < lastSelectorPartIndex) {\n          // Either the first part(s) of the selector matched this element,\n          // or the first part(s) of the selector matched a parent element\n          // and there are more parts of the selector that could target\n          // children of this element.\n          // So we inject a new selector, replacing the part that matched this\n          // element with 'body' so it will continue to match.\n          var selectorPartsCopy = selectorParts.concat();\n          selectorPartsCopy.splice(0, ruleIndex + 1, bodySelectorPart);\n          selectorCopy = new goog.cssom.iframe.style.CssSelector_();\n          selectorCopy.parts = selectorPartsCopy;\n          selectors.push(selectorCopy);\n        } else if (ruleIndex > 0 && ruleIndex == lastSelectorPartIndex) {\n          // The rule didn't match this element, but the entire rule did\n          // match an ancestor element. In this case we want to copy\n          // just the last part of the rule, to give it a chance to be applied\n          // to additional matching elements inside this element.\n          // Example DOM structure: body > div.funky > ul > li#editme\n          // Example CSS selector: .funky ul\n          // New CSS selector: body ul\n          selectorCopy = new goog.cssom.iframe.style.CssSelector_();\n          selectorCopy.parts =\n              [bodySelectorPart, selectorParts[lastSelectorPartIndex]];\n          selectors.push(selectorCopy);\n        }\n      }\n    }\n  }\n\n  // Insert a new ruleset, setting the current inheritable styles of this\n  // element as the defaults for everything under in the frame.\n  var defaultPropertiesRuleSet = new goog.cssom.iframe.style.CssRuleSet_();\n  var computedStyle = goog.cssom.iframe.style.getComputedStyleObject_(element);\n\n  // Copy inheritable styles so they are applied to everything under HTML.\n  var htmlSelector = new goog.cssom.iframe.style.CssSelector_();\n  htmlSelector.parts = [new goog.cssom.iframe.style.CssSelectorPart_('html')];\n  defaultPropertiesRuleSet.selectors = [htmlSelector];\n  var defaultProperties = {};\n  for (var i = 0, prop; prop = goog.cssom.iframe.style.inheritedProperties_[i];\n       i++) {\n    defaultProperties[prop] = computedStyle[goog.string.toCamelCase(prop)];\n  }\n  defaultPropertiesRuleSet.setDeclarationTextFromObject(defaultProperties);\n  ruleSets.push(defaultPropertiesRuleSet);\n\n  var bodyRuleSet = new goog.cssom.iframe.style.CssRuleSet_();\n  var bodySelector = new goog.cssom.iframe.style.CssSelector_();\n  bodySelector.parts = [new goog.cssom.iframe.style.CssSelectorPart_('body')];\n  // Core set of sane property values for BODY, to prevent copied\n  // styles from completely breaking the display.\n  var bodyProperties = {\n    position: 'relative',\n    top: '0',\n    left: '0',\n    right: 'auto',  // Override any existing right value so 'left' works.\n    display: 'block',\n    visibility: 'visible'\n  };\n  // Text formatting property values, to keep text nodes directly under BODY\n  // looking right.\n  for (i = 0; prop = goog.cssom.iframe.style.textProperties_[i]; i++) {\n    bodyProperties[prop] = computedStyle[goog.string.toCamelCase(prop)];\n  }\n  if (opt_copyBackgroundContext &&\n      goog.cssom.iframe.style.isTransparentValue_(\n          computedStyle['backgroundColor'])) {\n    // opt_useAncestorBackgroundRules means that, if the original element\n    // has a transparent background, background properties rules should be\n    // added to explicitly make the body have the same background appearance\n    // as in the original element, even if its positioned somewhere else\n    // in the DOM.\n    var bgProperties = goog.cssom.iframe.style.getBackgroundContext(element);\n    bodyProperties['background-color'] = bgProperties['backgroundColor'];\n    var elementBgImage = computedStyle['backgroundImage'];\n    if (!elementBgImage || elementBgImage == 'none') {\n      bodyProperties['background-image'] = bgProperties['backgroundImage'];\n      bodyProperties['background-repeat'] = bgProperties['backgroundRepeat'];\n      bodyProperties['background-position'] =\n          bgProperties['backgroundPosition'];\n    }\n  }\n\n  bodyRuleSet.setDeclarationTextFromObject(bodyProperties, true);\n  bodyRuleSet.selectors = [bodySelector];\n  ruleSets.push(bodyRuleSet);\n\n  // Write outputTextParts to doc.\n  var ruleSetStrings = [];\n  ruleCount = ruleSets.length;\n  for (i = 0; i < ruleCount; i++) {\n    ruleSets[i].writeToArray(ruleSetStrings);\n  }\n  return ruleSetStrings.join('');\n};\n\n\n/**\n * Tests whether a value is equivalent to 'transparent'.\n * @param {string} colorValue The value to test.\n * @return {boolean} Whether the value is transparent.\n * @private\n */\ngoog.cssom.iframe.style.isTransparentValue_ = function(colorValue) {\n  return colorValue == 'transparent' || colorValue == 'rgba(0, 0, 0, 0)';\n};\n\n\n/**\n * Returns an object containing the set of computedStyle/currentStyle\n * values for the given element. Note that this should be used with\n * caution as it ignores the fact that currentStyle and computedStyle\n * are not the same for certain properties.\n *\n * @param {Element} element The element whose computed style to return.\n * @return {Object} Object containing style properties and values.\n * @private\n */\ngoog.cssom.iframe.style.getComputedStyleObject_ = function(element) {\n  // Return an object containing the element's computedStyle/currentStyle.\n  // The resulting object can be re-used to read multiple properties, which\n  // is faster than calling goog.style.getComputedStyle every time.\n  return element.currentStyle ||\n      goog.dom.getOwnerDocument(element).defaultView.getComputedStyle(\n          element, '') ||\n      {};\n};\n\n\n/**\n * RegExp that splits a value like \"10px\" or \"-1em\" into parts.\n * @private\n * @type {RegExp}\n */\ngoog.cssom.iframe.style.valueWithUnitsRegEx_ = /^(-?)([0-9]+)([a-z]*|%)/;\n\n\n/**\n * Given an object containing a set of styles, returns a two-element array\n * containing the values of background-position-x and background-position-y.\n * @param {Object} styleObject Object from which to read style properties.\n * @return {Array<string>} The background-position values in the order [x, y].\n * @private\n */\ngoog.cssom.iframe.style.getBackgroundXYValues_ = function(styleObject) {\n  // Gecko only has backgroundPosition, containing both values.\n  // IE has only backgroundPositionX/backgroundPositionY.\n  // WebKit has both.\n  if (styleObject['backgroundPositionY']) {\n    return [\n      styleObject['backgroundPositionX'], styleObject['backgroundPositionY']\n    ];\n  } else {\n    return (styleObject['backgroundPosition'] || '0 0').split(' ');\n  }\n};\n\n\n/**\n * Generates a set of CSS properties that can be used to make another\n * element's background look like the background of a given element.\n * This is useful when you want to copy the CSS context of an element,\n * but the element's background is transparent. In the original context\n * you would see the ancestor's backround color/image showing through,\n * but in the new context there might be a something different underneath.\n * Note that this assumes the element you're copying context from has a\n * fairly standard positioning/layout - it assumes that when the element\n * has a transparent background what you're going to see through it is its\n * ancestors.\n * @param {Element} element The element from which to copy background styles.\n * @return {!Object} Object containing background* properties.\n */\ngoog.cssom.iframe.style.getBackgroundContext = function(element) {\n  var propertyValues = {'backgroundImage': 'none'};\n  var ancestor = element;\n  /** @type {!Window|undefined} */\n  var currentIframeWindow;\n  // Walk up the DOM tree to find the ancestor nodes whose backgrounds\n  // may be visible underneath this element. Background-image and\n  // background-color don't have to come from the same node, but as soon\n  // an element with background-color is found there's no need to continue\n  // because backgrounds farther up the chain won't be visible.\n  // (This implementation is not sophisticated enough to handle opacity,\n  // or multple layered partially-transparent background images.)\n  while ((ancestor = /** @type {!Element} */ (ancestor.parentNode)) &&\n         ancestor.nodeType == goog.dom.NodeType.ELEMENT) {\n    var computedStyle =\n        goog.cssom.iframe.style.getComputedStyleObject_(ancestor);\n    // Copy background color if a non-transparent value is found.\n    var backgroundColorValue = computedStyle['backgroundColor'];\n    if (!goog.cssom.iframe.style.isTransparentValue_(backgroundColorValue)) {\n      propertyValues['backgroundColor'] = backgroundColorValue;\n    }\n    // If a background image value is found, copy background-image,\n    // background-repeat, and background-position.\n    if (computedStyle['backgroundImage'] &&\n        computedStyle['backgroundImage'] != 'none') {\n      propertyValues['backgroundImage'] = computedStyle['backgroundImage'];\n      propertyValues['backgroundRepeat'] = computedStyle['backgroundRepeat'];\n      // Calculate the offset between the original element and the element\n      // providing the background image, so the background position can be\n      // adjusted.\n      var relativePosition;\n      if (currentIframeWindow) {\n        relativePosition =\n            goog.style.getFramedPageOffset(element, currentIframeWindow);\n        var frameElement = currentIframeWindow.frameElement;\n        var iframeRelativePosition = goog.style.getRelativePosition(\n            /** @type {!Element} */ (frameElement), ancestor);\n        var iframeBorders = goog.style.getBorderBox(frameElement);\n        relativePosition.x += iframeRelativePosition.x + iframeBorders.left;\n        relativePosition.y += iframeRelativePosition.y + iframeBorders.top;\n      } else {\n        relativePosition = goog.style.getRelativePosition(element, ancestor);\n      }\n      var backgroundXYValues =\n          goog.cssom.iframe.style.getBackgroundXYValues_(computedStyle);\n      // Parse background-repeat-* values in the form \"10px\", and adjust them.\n      for (var i = 0; i < 2; i++) {\n        var positionValue = backgroundXYValues[i];\n        var coordinate = i == 0 ? 'X' : 'Y';\n        var positionProperty = 'backgroundPosition' + coordinate;\n        // relative position to its ancestor.\n        var positionValueParts =\n            goog.cssom.iframe.style.valueWithUnitsRegEx_.exec(positionValue);\n        if (positionValueParts) {\n          var value =\n              parseInt(positionValueParts[1] + positionValueParts[2], 10);\n          var units = positionValueParts[3];\n          // This only attempts to handle pixel values for now (plus\n          // '0anything', which is equivalent to 0px).\n          // TODO(user) Convert non-pixel values to pixels when possible.\n          if (value == 0 || units == 'px') {\n            value -=\n                (coordinate == 'X' ? relativePosition.x : relativePosition.y);\n          }\n          positionValue = value + units;\n        }\n        propertyValues[positionProperty] = positionValue;\n      }\n      propertyValues['backgroundPosition'] =\n          propertyValues['backgroundPositionX'] + ' ' +\n          propertyValues['backgroundPositionY'];\n    }\n    if (propertyValues['backgroundColor']) {\n      break;\n    }\n    if (ancestor.tagName == goog.dom.TagName.HTML) {\n      try {\n        currentIframeWindow = goog.dom.getWindow(\n            /** @type {Document} */ (ancestor.parentNode));\n        // This could theoretically throw a security exception if the parent\n        // iframe is in a different domain.\n        ancestor = currentIframeWindow.frameElement;\n        if (!ancestor) {\n          // Loop has reached the top level window.\n          break;\n        }\n      } catch (e) {\n        // We don't have permission to go up to the parent window, stop here.\n        break;\n      }\n    }\n  }\n  return propertyValues;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^1>","^1M","^2K","^2L","^?","^[","~$goog.cssom","^1F","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/cssom/iframe/style.js"],"^O",["^=",["^1D"]],"^W",true,"^X",["^?","^1L","^:M","^1>","^2K","^12","^1M","^2L","^1F","^["]],["^ ","^3",[1579837703000],"^4","goog.asserts.asserts.js","^5",["^6","goog/asserts/asserts.js"],"^7","goog/asserts/asserts.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities to check the preconditions, postconditions and\n * invariants runtime.\n *\n * Methods in this package are given special treatment by the compiler\n * for type-inference. For example, <code>goog.asserts.assert(foo)</code>\n * will make the compiler treat <code>foo</code> as non-nullable. Similarly,\n * <code>goog.asserts.assertNumber(foo)</code> informs the compiler about the\n * type of <code>foo</code>. Where applicable, such assertions are preferable to\n * casts by jsdoc with <code>@type</code>.\n *\n * The compiler has an option to disable asserts. So code like:\n * <code>\n * var x = goog.asserts.assert(foo());\n * goog.asserts.assert(bar());\n * </code>\n * will be transformed into:\n * <code>\n * var x = foo();\n * </code>\n * The compiler will leave in foo() (because its return value is used),\n * but it will remove bar() because it assumes it does not have side-effects.\n *\n * Additionally, note the compiler will consider the type to be \"tightened\" for\n * all statements <em>after</em> the assertion. For example:\n * <code>\n * const /** ?Object &#ast;/ value = foo();\n * goog.asserts.assert(value);\n * // \"value\" is of type {!Object} at this point.\n * </code>\n *\n * @author agrieve@google.com (Andrew Grieve)\n */\n\ngoog.provide('goog.asserts');\ngoog.provide('goog.asserts.AssertionError');\n\ngoog.require('goog.debug.Error');\ngoog.require('goog.dom.NodeType');\n\n\n/**\n * @define {boolean} Whether to strip out asserts or to leave them in.\n */\ngoog.asserts.ENABLE_ASSERTS =\n    goog.define('goog.asserts.ENABLE_ASSERTS', goog.DEBUG);\n\n\n\n/**\n * Error object for failed assertions.\n * @param {string} messagePattern The pattern that was used to form message.\n * @param {!Array<*>} messageArgs The items to substitute into the pattern.\n * @constructor\n * @extends {goog.debug.Error}\n * @final\n */\ngoog.asserts.AssertionError = function(messagePattern, messageArgs) {\n  goog.debug.Error.call(this, goog.asserts.subs_(messagePattern, messageArgs));\n\n  /**\n   * The message pattern used to format the error message. Error handlers can\n   * use this to uniquely identify the assertion.\n   * @type {string}\n   */\n  this.messagePattern = messagePattern;\n};\ngoog.inherits(goog.asserts.AssertionError, goog.debug.Error);\n\n\n/** @override */\ngoog.asserts.AssertionError.prototype.name = 'AssertionError';\n\n\n/**\n * The default error handler.\n * @param {!goog.asserts.AssertionError} e The exception to be handled.\n */\ngoog.asserts.DEFAULT_ERROR_HANDLER = function(e) {\n  throw e;\n};\n\n\n/**\n * The handler responsible for throwing or logging assertion errors.\n * @private {function(!goog.asserts.AssertionError)}\n */\ngoog.asserts.errorHandler_ = goog.asserts.DEFAULT_ERROR_HANDLER;\n\n\n/**\n * Does simple python-style string substitution.\n * subs(\"foo%s hot%s\", \"bar\", \"dog\") becomes \"foobar hotdog\".\n * @param {string} pattern The string containing the pattern.\n * @param {!Array<*>} subs The items to substitute into the pattern.\n * @return {string} A copy of `str` in which each occurrence of\n *     {@code %s} has been replaced an argument from `var_args`.\n * @private\n */\ngoog.asserts.subs_ = function(pattern, subs) {\n  var splitParts = pattern.split('%s');\n  var returnString = '';\n\n  // Replace up to the last split part. We are inserting in the\n  // positions between split parts.\n  var subLast = splitParts.length - 1;\n  for (var i = 0; i < subLast; i++) {\n    // keep unsupplied as '%s'\n    var sub = (i < subs.length) ? subs[i] : '%s';\n    returnString += splitParts[i] + sub;\n  }\n  return returnString + splitParts[subLast];\n};\n\n\n/**\n * Throws an exception with the given message and \"Assertion failed\" prefixed\n * onto it.\n * @param {string} defaultMessage The message to use if givenMessage is empty.\n * @param {Array<*>} defaultArgs The substitution arguments for defaultMessage.\n * @param {string|undefined} givenMessage Message supplied by the caller.\n * @param {Array<*>} givenArgs The substitution arguments for givenMessage.\n * @throws {goog.asserts.AssertionError} When the value is not a number.\n * @private\n */\ngoog.asserts.doAssertFailure_ = function(\n    defaultMessage, defaultArgs, givenMessage, givenArgs) {\n  var message = 'Assertion failed';\n  if (givenMessage) {\n    message += ': ' + givenMessage;\n    var args = givenArgs;\n  } else if (defaultMessage) {\n    message += ': ' + defaultMessage;\n    args = defaultArgs;\n  }\n  // The '' + works around an Opera 10 bug in the unit tests. Without it,\n  // a stack trace is added to var message above. With this, a stack trace is\n  // not added until this line (it causes the extra garbage to be added after\n  // the assertion message instead of in the middle of it).\n  var e = new goog.asserts.AssertionError('' + message, args || []);\n  goog.asserts.errorHandler_(e);\n};\n\n\n/**\n * Sets a custom error handler that can be used to customize the behavior of\n * assertion failures, for example by turning all assertion failures into log\n * messages.\n * @param {function(!goog.asserts.AssertionError)} errorHandler\n */\ngoog.asserts.setErrorHandler = function(errorHandler) {\n  if (goog.asserts.ENABLE_ASSERTS) {\n    goog.asserts.errorHandler_ = errorHandler;\n  }\n};\n\n\n/**\n * Checks if the condition evaluates to true if goog.asserts.ENABLE_ASSERTS is\n * true.\n * @template T\n * @param {T} condition The condition to check.\n * @param {string=} opt_message Error message in case of failure.\n * @param {...*} var_args The items to substitute into the failure message.\n * @return {T} The value of the condition.\n * @throws {goog.asserts.AssertionError} When the condition evaluates to false.\n * @closurePrimitive {asserts.truthy}\n */\ngoog.asserts.assert = function(condition, opt_message, var_args) {\n  if (goog.asserts.ENABLE_ASSERTS && !condition) {\n    goog.asserts.doAssertFailure_(\n        '', null, opt_message, Array.prototype.slice.call(arguments, 2));\n  }\n  return condition;\n};\n\n\n/**\n * Checks if `value` is `null` or `undefined` if goog.asserts.ENABLE_ASSERTS is\n * true.\n *\n * @param {T} value The value to check.\n * @param {string=} opt_message Error message in case of failure.\n * @param {...*} var_args The items to substitute into the failure message.\n * @return {R} `value` with its type narrowed to exclude `null` and `undefined`.\n *\n * @template T\n * @template R :=\n *     mapunion(T, (V) =>\n *         cond(eq(V, 'null'),\n *             none(),\n *             cond(eq(V, 'undefined'),\n *                 none(),\n *                 V)))\n *  =:\n *\n * @throws {!goog.asserts.AssertionError} When `value` is `null` or `undefined`.\n * @closurePrimitive {asserts.matchesReturn}\n */\ngoog.asserts.assertExists = function(value, opt_message, var_args) {\n  if (goog.asserts.ENABLE_ASSERTS && value == null) {\n    goog.asserts.doAssertFailure_(\n        'Expected to exist: %s.', [value], opt_message,\n        Array.prototype.slice.call(arguments, 2));\n  }\n  return value;\n};\n\n\n/**\n * Fails if goog.asserts.ENABLE_ASSERTS is true. This function is useful in case\n * when we want to add a check in the unreachable area like switch-case\n * statement:\n *\n * <pre>\n *  switch(type) {\n *    case FOO: doSomething(); break;\n *    case BAR: doSomethingElse(); break;\n *    default: goog.asserts.fail('Unrecognized type: ' + type);\n *      // We have only 2 types - \"default:\" section is unreachable code.\n *  }\n * </pre>\n *\n * @param {string=} opt_message Error message in case of failure.\n * @param {...*} var_args The items to substitute into the failure message.\n * @throws {goog.asserts.AssertionError} Failure.\n * @closurePrimitive {asserts.fail}\n */\ngoog.asserts.fail = function(opt_message, var_args) {\n  if (goog.asserts.ENABLE_ASSERTS) {\n    goog.asserts.errorHandler_(\n        new goog.asserts.AssertionError(\n            'Failure' + (opt_message ? ': ' + opt_message : ''),\n            Array.prototype.slice.call(arguments, 1)));\n  }\n};\n\n\n/**\n * Checks if the value is a number if goog.asserts.ENABLE_ASSERTS is true.\n * @param {*} value The value to check.\n * @param {string=} opt_message Error message in case of failure.\n * @param {...*} var_args The items to substitute into the failure message.\n * @return {number} The value, guaranteed to be a number when asserts enabled.\n * @throws {goog.asserts.AssertionError} When the value is not a number.\n * @closurePrimitive {asserts.matchesReturn}\n */\ngoog.asserts.assertNumber = function(value, opt_message, var_args) {\n  if (goog.asserts.ENABLE_ASSERTS && typeof value !== 'number') {\n    goog.asserts.doAssertFailure_(\n        'Expected number but got %s: %s.', [goog.typeOf(value), value],\n        opt_message, Array.prototype.slice.call(arguments, 2));\n  }\n  return /** @type {number} */ (value);\n};\n\n\n/**\n * Checks if the value is a string if goog.asserts.ENABLE_ASSERTS is true.\n * @param {*} value The value to check.\n * @param {string=} opt_message Error message in case of failure.\n * @param {...*} var_args The items to substitute into the failure message.\n * @return {string} The value, guaranteed to be a string when asserts enabled.\n * @throws {goog.asserts.AssertionError} When the value is not a string.\n * @closurePrimitive {asserts.matchesReturn}\n */\ngoog.asserts.assertString = function(value, opt_message, var_args) {\n  if (goog.asserts.ENABLE_ASSERTS && typeof value !== 'string') {\n    goog.asserts.doAssertFailure_(\n        'Expected string but got %s: %s.', [goog.typeOf(value), value],\n        opt_message, Array.prototype.slice.call(arguments, 2));\n  }\n  return /** @type {string} */ (value);\n};\n\n\n/**\n * Checks if the value is a function if goog.asserts.ENABLE_ASSERTS is true.\n * @param {*} value The value to check.\n * @param {string=} opt_message Error message in case of failure.\n * @param {...*} var_args The items to substitute into the failure message.\n * @return {!Function} The value, guaranteed to be a function when asserts\n *     enabled.\n * @throws {goog.asserts.AssertionError} When the value is not a function.\n * @closurePrimitive {asserts.matchesReturn}\n */\ngoog.asserts.assertFunction = function(value, opt_message, var_args) {\n  if (goog.asserts.ENABLE_ASSERTS && !goog.isFunction(value)) {\n    goog.asserts.doAssertFailure_(\n        'Expected function but got %s: %s.', [goog.typeOf(value), value],\n        opt_message, Array.prototype.slice.call(arguments, 2));\n  }\n  return /** @type {!Function} */ (value);\n};\n\n\n/**\n * Checks if the value is an Object if goog.asserts.ENABLE_ASSERTS is true.\n * @param {*} value The value to check.\n * @param {string=} opt_message Error message in case of failure.\n * @param {...*} var_args The items to substitute into the failure message.\n * @return {!Object} The value, guaranteed to be a non-null object.\n * @throws {goog.asserts.AssertionError} When the value is not an object.\n * @closurePrimitive {asserts.matchesReturn}\n */\ngoog.asserts.assertObject = function(value, opt_message, var_args) {\n  if (goog.asserts.ENABLE_ASSERTS && !goog.isObject(value)) {\n    goog.asserts.doAssertFailure_(\n        'Expected object but got %s: %s.', [goog.typeOf(value), value],\n        opt_message, Array.prototype.slice.call(arguments, 2));\n  }\n  return /** @type {!Object} */ (value);\n};\n\n\n/**\n * Checks if the value is an Array if goog.asserts.ENABLE_ASSERTS is true.\n * @param {*} value The value to check.\n * @param {string=} opt_message Error message in case of failure.\n * @param {...*} var_args The items to substitute into the failure message.\n * @return {!Array<?>} The value, guaranteed to be a non-null array.\n * @throws {goog.asserts.AssertionError} When the value is not an array.\n * @closurePrimitive {asserts.matchesReturn}\n */\ngoog.asserts.assertArray = function(value, opt_message, var_args) {\n  if (goog.asserts.ENABLE_ASSERTS && !goog.isArray(value)) {\n    goog.asserts.doAssertFailure_(\n        'Expected array but got %s: %s.', [goog.typeOf(value), value],\n        opt_message, Array.prototype.slice.call(arguments, 2));\n  }\n  return /** @type {!Array<?>} */ (value);\n};\n\n\n/**\n * Checks if the value is a boolean if goog.asserts.ENABLE_ASSERTS is true.\n * @param {*} value The value to check.\n * @param {string=} opt_message Error message in case of failure.\n * @param {...*} var_args The items to substitute into the failure message.\n * @return {boolean} The value, guaranteed to be a boolean when asserts are\n *     enabled.\n * @throws {goog.asserts.AssertionError} When the value is not a boolean.\n * @closurePrimitive {asserts.matchesReturn}\n */\ngoog.asserts.assertBoolean = function(value, opt_message, var_args) {\n  if (goog.asserts.ENABLE_ASSERTS && typeof value !== 'boolean') {\n    goog.asserts.doAssertFailure_(\n        'Expected boolean but got %s: %s.', [goog.typeOf(value), value],\n        opt_message, Array.prototype.slice.call(arguments, 2));\n  }\n  return /** @type {boolean} */ (value);\n};\n\n\n/**\n * Checks if the value is a DOM Element if goog.asserts.ENABLE_ASSERTS is true.\n * @param {*} value The value to check.\n * @param {string=} opt_message Error message in case of failure.\n * @param {...*} var_args The items to substitute into the failure message.\n * @return {!Element} The value, likely to be a DOM Element when asserts are\n *     enabled.\n * @throws {goog.asserts.AssertionError} When the value is not an Element.\n * @closurePrimitive {asserts.matchesReturn}\n */\ngoog.asserts.assertElement = function(value, opt_message, var_args) {\n  if (goog.asserts.ENABLE_ASSERTS &&\n      (!goog.isObject(value) || value.nodeType != goog.dom.NodeType.ELEMENT)) {\n    goog.asserts.doAssertFailure_(\n        'Expected Element but got %s: %s.', [goog.typeOf(value), value],\n        opt_message, Array.prototype.slice.call(arguments, 2));\n  }\n  return /** @type {!Element} */ (value);\n};\n\n\n/**\n * Checks if the value is an instance of the user-defined type if\n * goog.asserts.ENABLE_ASSERTS is true.\n *\n * The compiler may tighten the type returned by this function.\n *\n * @param {?} value The value to check.\n * @param {function(new: T, ...)} type A user-defined constructor.\n * @param {string=} opt_message Error message in case of failure.\n * @param {...*} var_args The items to substitute into the failure message.\n * @throws {goog.asserts.AssertionError} When the value is not an instance of\n *     type.\n * @return {T}\n * @template T\n * @closurePrimitive {asserts.matchesReturn}\n */\ngoog.asserts.assertInstanceof = function(value, type, opt_message, var_args) {\n  if (goog.asserts.ENABLE_ASSERTS && !(value instanceof type)) {\n    goog.asserts.doAssertFailure_(\n        'Expected instanceof %s but got %s.',\n        [goog.asserts.getType_(type), goog.asserts.getType_(value)],\n        opt_message, Array.prototype.slice.call(arguments, 3));\n  }\n  return value;\n};\n\n\n/**\n * Checks whether the value is a finite number, if goog.asserts.ENABLE_ASSERTS\n * is true.\n *\n * @param {*} value The value to check.\n * @param {string=} opt_message Error message in case of failure.\n * @param {...*} var_args The items to substitute into the failure message.\n * @throws {goog.asserts.AssertionError} When the value is not a number, or is\n *     a non-finite number such as NaN, Infinity or -Infinity.\n * @return {number} The value initially passed in.\n */\ngoog.asserts.assertFinite = function(value, opt_message, var_args) {\n  if (goog.asserts.ENABLE_ASSERTS &&\n      (typeof value != 'number' || !isFinite(value))) {\n    goog.asserts.doAssertFailure_(\n        'Expected %s to be a finite number but it is not.', [value],\n        opt_message, Array.prototype.slice.call(arguments, 2));\n  }\n  return /** @type {number} */ (value);\n};\n\n/**\n * Checks that no enumerable keys are present in Object.prototype. Such keys\n * would break most code that use {@code for (var ... in ...)} loops.\n */\ngoog.asserts.assertObjectPrototypeIsIntact = function() {\n  for (var key in Object.prototype) {\n    goog.asserts.fail(key + ' should not be enumerable in Object.prototype.');\n  }\n};\n\n\n/**\n * Returns the type of a value. If a constructor is passed, and a suitable\n * string cannot be found, 'unknown type name' will be returned.\n * @param {*} value A constructor, object, or primitive.\n * @return {string} The best display name for the value, or 'unknown type name'.\n * @private\n */\ngoog.asserts.getType_ = function(value) {\n  if (value instanceof Function) {\n    return value.displayName || value.name || 'unknown type name';\n  } else if (value instanceof Object) {\n    return /** @type {string} */ (value.constructor.displayName) ||\n        value.constructor.name || Object.prototype.toString.call(value);\n  } else {\n    return value === null ? 'null' : typeof value;\n  }\n};\n","^;",1579837703000,"^<",["^=",["^2K","^?","^7N"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/asserts/asserts.js"],"^O",["^=",["^1L","~$goog.asserts.AssertionError"]],"^W",true,"^X",["^?","^7N","^2K"]],["^ ","^3",[1579837703000],"^4","goog.crypt.hashtester.js","^5",["^6","goog/crypt/hashtester.js"],"^7","goog/crypt/hashtester.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Unit tests for the abstract cryptographic hash interface.\n *\n */\n\ngoog.provide('goog.crypt.hashTester');\n\ngoog.require('goog.array');\ngoog.require('goog.crypt');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.reflect');\ngoog.require('goog.testing.PerformanceTable');\ngoog.require('goog.testing.PseudoRandom');\ngoog.require('goog.testing.asserts');\ngoog.setTestOnly('hashTester');\n\n\n/**\n * Runs basic tests.\n *\n * @param {!goog.crypt.Hash} hash A hash instance.\n */\ngoog.crypt.hashTester.runBasicTests = function(hash) {\n  // Compute first hash.\n  hash.update([97, 158]);\n  var golden1 = hash.digest();\n\n  // Compute second hash.\n  hash.reset();\n  hash.update('aB');\n  var golden2 = hash.digest();\n  assertTrue(\n      'Two different inputs resulted in a hash collision',\n      !!goog.testing.asserts.findDifferences(golden1, golden2));\n\n  // Empty hash.\n  hash.reset();\n  var empty = hash.digest();\n  assertTrue(\n      'Empty hash collided with a non-trivial one',\n      !!goog.testing.asserts.findDifferences(golden1, empty) &&\n          !!goog.testing.asserts.findDifferences(golden2, empty));\n\n  // Zero-length array update.\n  hash.reset();\n  hash.update([]);\n  assertArrayEquals(\n      'Updating with an empty array did not give an empty hash', empty,\n      hash.digest());\n\n  // Zero-length string update.\n  hash.reset();\n  hash.update('');\n  assertArrayEquals(\n      'Updating with an empty string did not give an empty hash', empty,\n      hash.digest());\n\n  // Recompute the first hash.\n  hash.reset();\n  hash.update([97, 158]);\n  assertArrayEquals(\n      'The reset did not produce the initial state', golden1, hash.digest());\n\n  // Check for a trivial collision.\n  hash.reset();\n  hash.update([158, 97]);\n  assertTrue(\n      'Swapping bytes resulted in a hash collision',\n      !!goog.testing.asserts.findDifferences(golden1, hash.digest()));\n\n  // Compare array and string input.\n  hash.reset();\n  hash.update([97, 66]);\n  assertArrayEquals(\n      'String and array inputs should give the same result', golden2,\n      hash.digest());\n\n  // Compute in parts.\n  hash.reset();\n  hash.update('a');\n  hash.update([158]);\n  assertArrayEquals(\n      'Partial updates resulted in a different hash', golden1, hash.digest());\n\n  // Test update with specified length.\n  hash.reset();\n  hash.update('aB', 0);\n  hash.update([97, 158, 32], 2);\n  assertArrayEquals(\n      'Updating with an explicit buffer length did not work', golden1,\n      hash.digest());\n};\n\n\n/**\n * Runs block tests.\n *\n * @param {!goog.crypt.Hash} hash A hash instance.\n * @param {number} blockBytes Size of the hash block.\n */\ngoog.crypt.hashTester.runBlockTests = function(hash, blockBytes) {\n  // Compute a message which is 1 byte shorter than hash block size.\n  var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n  var message = '';\n  for (var i = 0; i < blockBytes - 1; i++) {\n    message += chars.charAt(i % chars.length);\n  }\n\n  // Compute golden hash for 1 block + 2 bytes.\n  hash.update(message + '123');\n  var golden1 = hash.digest();\n\n  // Compute golden hash for 2 blocks + 1 byte.\n  hash.reset();\n  hash.update(message + message + '123');\n  var golden2 = hash.digest();\n\n  // Almost fill a block, then overflow.\n  hash.reset();\n  hash.update(message);\n  hash.update('123');\n  assertArrayEquals(golden1, hash.digest());\n\n  // Fill a block.\n  hash.reset();\n  hash.update(message + '1');\n  hash.update('23');\n  assertArrayEquals(golden1, hash.digest());\n\n  // Overflow a block.\n  hash.reset();\n  hash.update(message + '12');\n  hash.update('3');\n  assertArrayEquals(golden1, hash.digest());\n\n  // Test single overflow with an array.\n  hash.reset();\n  hash.update(goog.crypt.stringToByteArray(message + '123'));\n  assertArrayEquals(golden1, hash.digest());\n\n  // Almost fill a block, then overflow this and the next block.\n  hash.reset();\n  hash.update(message);\n  hash.update(message + '123');\n  assertArrayEquals(golden2, hash.digest());\n\n  // Fill two blocks.\n  hash.reset();\n  hash.update(message + message + '12');\n  hash.update('3');\n  assertArrayEquals(golden2, hash.digest());\n\n  // Test double overflow with an array.\n  hash.reset();\n  hash.update(goog.crypt.stringToByteArray(message));\n  hash.update(goog.crypt.stringToByteArray(message + '123'));\n  assertArrayEquals(golden2, hash.digest());\n};\n\n\n/**\n * Runs performance tests.\n *\n * @param {function():!goog.crypt.Hash} hashFactory A hash factory.\n * @param {string} hashName Name of the hashing function.\n */\ngoog.crypt.hashTester.runPerfTests = function(hashFactory, hashName) {\n  var body = goog.dom.getDocument().body;\n  var perfTable = goog.dom.createElement(goog.dom.TagName.DIV);\n  goog.dom.appendChild(body, perfTable);\n\n  var table = new goog.testing.PerformanceTable(perfTable);\n\n  function runPerfTest(byteLength, updateCount) {\n    var label =\n        (hashName + ': ' + updateCount + ' update(s) of ' + byteLength +\n         ' bytes');\n\n    function run(data, dataType) {\n      table.run(function() {\n        var hash = hashFactory();\n        for (var i = 0; i < updateCount; i++) {\n          hash.update(data, byteLength);\n        }\n        // Prevent JsCompiler optimizations from invalidating the benchmark.\n        goog.reflect.sinkValue(hash.digest());\n      }, label + ' (' + dataType + ')');\n    }\n\n    var byteArray = goog.crypt.hashTester.createRandomByteArray_(byteLength);\n    var byteString = goog.crypt.hashTester.createByteString_(byteArray);\n\n    run(byteArray, 'byte array');\n    run(byteString, 'byte string');\n  }\n\n  var MESSAGE_LENGTH_LONG = 10000000;  // 10 Mbytes\n  var MESSAGE_LENGTH_SHORT = 10;       // 10 bytes\n  var MESSAGE_COUNT_SHORT = MESSAGE_LENGTH_LONG / MESSAGE_LENGTH_SHORT;\n\n  runPerfTest(MESSAGE_LENGTH_LONG, 1);\n  runPerfTest(MESSAGE_LENGTH_SHORT, MESSAGE_COUNT_SHORT);\n};\n\n\n/**\n * Creates and returns a random byte array.\n *\n * @param {number} length Length of the byte array.\n * @return {!Array<number>} An array of bytes.\n * @private\n */\ngoog.crypt.hashTester.createRandomByteArray_ = function(length) {\n  var random = new goog.testing.PseudoRandom(0);\n  var bytes = [];\n\n  for (var i = 0; i < length; ++i) {\n    // Generates an integer from 0 to 255.\n    var b = Math.floor(random.random() * 0x100);\n    bytes.push(b);\n  }\n\n  return bytes;\n};\n\n\n/**\n * Creates a string from an array of bytes.\n *\n * @param {!Array<number>} bytes An array of bytes.\n * @return {string} The string encoded by the bytes.\n * @private\n */\ngoog.crypt.hashTester.createByteString_ = function(bytes) {\n  var str = '';\n  goog.array.forEach(bytes, function(b) { str += String.fromCharCode(b); });\n  return str;\n};\n","^;",1579837703000,"^<",["^=",["^9K","^1>","^8;","~$goog.testing.PseudoRandom","^5[","^?","^2[","^2O","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/hashtester.js"],"^O",["^=",["~$goog.crypt.hashTester"]],"^W",true,"^X",["^?","^2O","^9K","^1>","^12","^8;","^2[","^:O","^5["]],["^ ","^3",[1579837703000],"^4","goog.string.parser.js","^5",["^6","goog/string/parser.js"],"^7","goog/string/parser.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Defines an interface for parsing strings into objects.\n */\n\ngoog.provide('goog.string.Parser');\n\n\n\n/**\n * An interface for parsing strings into objects.\n * @interface\n */\ngoog.string.Parser = function() {};\n\n\n/**\n * Parses a string into an object and returns the result.\n * Agnostic to the format of string and object.\n *\n * @param {string} s The string to parse.\n * @return {*} The object generated from the string.\n */\ngoog.string.Parser.prototype.parse;\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/string/parser.js"],"^O",["^=",["~$goog.string.Parser"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.ui.media.mp3.js","^5",["^6","goog/ui/media/mp3.js"],"^7","goog/ui/media/mp3.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview provides a reusable mp3 UI component given a mp3 URL.\n *\n * goog.ui.media.Mp3 is actually a {@link goog.ui.ControlRenderer}, a stateless\n * class - that could/should be used as a Singleton with the static method\n * `goog.ui.media.Mp3.getInstance` -, that knows how to render Mp3s. It is\n * designed to be used with a {@link goog.ui.Control}, which will actually\n * control the media renderer and provide the {@link goog.ui.Component} base.\n * This design guarantees that all different types of medias will behave alike\n * but will look different.\n *\n * goog.ui.media.Mp3 expects mp3 urls on `goog.ui.Control.getModel` as\n * data models, and render a flash object that will play that URL.\n *\n * Example of usage:\n *\n * <pre>\n *   goog.ui.media.Mp3.newControl('http://hostname/file.mp3').render();\n * </pre>\n *\n * Mp3 medias currently support the following states:\n *\n * <ul>\n *   <li> {@link goog.ui.Component.State.DISABLED}: shows 'flash not available'\n *   <li> {@link goog.ui.Component.State.HOVER}: mouse cursor is over the mp3\n *   <li> {@link goog.ui.Component.State.SELECTED}: mp3 is playing\n * </ul>\n *\n * Which can be accessed by\n *\n * <pre>\n *   mp3.setEnabled(true);\n *   mp3.setHighlighted(true);\n *   mp3.setSelected(true);\n * </pre>\n *\n * Requires flash to actually work.\n *\n */\n\ngoog.provide('goog.ui.media.Mp3');\n\ngoog.forwardDeclare('goog.ui.media.MediaModel');\ngoog.require('goog.string');\ngoog.require('goog.ui.media.FlashObject');\ngoog.require('goog.ui.media.Media');\ngoog.require('goog.ui.media.MediaRenderer');\n\n\n\n/**\n * Subclasses a goog.ui.media.MediaRenderer to provide a Mp3 specific media\n * renderer.\n *\n * This class knows how to parse mp3 URLs, and render the DOM structure\n * of mp3 flash players. This class is meant to be used as a singleton static\n * stateless class, that takes `goog.ui.media.Media` instances and renders\n * it. It expects `goog.ui.media.Media.getModel` to return a well formed,\n * previously checked, mp3 URL {@see goog.ui.media.PicasaAlbum.parseUrl},\n * which is the data model this renderer will use to construct the DOM\n * structure. {@see goog.ui.media.PicasaAlbum.newControl} for an example of\n * constructing a control with this renderer.\n *\n * This design is patterned after http://go/closure_control_subclassing\n *\n * It uses {@link goog.ui.media.FlashObject} to embed the flash object.\n *\n * @constructor\n * @extends {goog.ui.media.MediaRenderer}\n * @final\n */\ngoog.ui.media.Mp3 = function() {\n  goog.ui.media.MediaRenderer.call(this);\n};\ngoog.inherits(goog.ui.media.Mp3, goog.ui.media.MediaRenderer);\ngoog.addSingletonGetter(goog.ui.media.Mp3);\n\n\n/**\n * Flash player arguments. We expect that `flashUrl_` will contain a flash\n * movie that takes an audioUrl parameter on its URL, containing the URL of the\n * mp3 to be played.\n *\n * @type {string}\n * @private\n */\ngoog.ui.media.Mp3.PLAYER_ARGUMENTS_ = 'audioUrl=%s';\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n *\n * @type {string}\n */\ngoog.ui.media.Mp3.CSS_CLASS = goog.getCssName('goog-ui-media-mp3');\n\n\n/**\n * Flash player URL. Uses Google Reader's mp3 flash player by default.\n *\n * @type {string}\n * @private\n */\ngoog.ui.media.Mp3.flashUrl_ =\n    'http://www.google.com/reader/ui/3523697345-audio-player.swf';\n\n\n/**\n * Regular expression to check if a given URL is a valid mp3 URL.\n *\n * Copied from http://go/markdownlite.js.\n\n *\n * NOTE(user): although it would be easier to use goog.string.endsWith('.mp3'),\n * in the future, we want to provide media inlining, which is basically getting\n * a text and replacing all mp3 references with an mp3 player, so it makes sense\n * to share the same regular expression to match everything.\n *\n * @type {RegExp}\n */\ngoog.ui.media.Mp3.MATCHER =\n    /(https?:\\/\\/[\\w-%&\\/.=:#\\+~\\(\\)]+\\.(mp3)+(\\?[\\w-%&\\/.=:#\\+~\\(\\)]+)?)/i;\n\n\n/**\n * A static convenient method to construct a goog.ui.media.Media control out of\n * a mp3 URL. It checks the mp3 URL, sets it as the data model\n * goog.ui.media.Mp3 renderer uses, sets the states supported by the renderer,\n * and returns a Control that binds everything together. This is what you\n * should be using for constructing Mp3 videos, except if you need more fine\n * control over the configuration.\n *\n * @param {goog.ui.media.MediaModel} dataModel A media model that must contain\n *     an mp3 url on `dataModel.getUrl`.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @return {!goog.ui.media.Media} A goog.ui.Control subclass with the mp3\n *     renderer.\n */\ngoog.ui.media.Mp3.newControl = function(dataModel, opt_domHelper) {\n  var control = new goog.ui.media.Media(\n      dataModel, goog.ui.media.Mp3.getInstance(), opt_domHelper);\n  // mp3 ui doesn't have a non selected view: it shows the mp3 player by\n  // default.\n  control.setSelected(true);\n  return control;\n};\n\n\n/**\n * A static method that sets which flash URL this class should use. Use this if\n * you want to host your own flash mp3 player.\n *\n * @param {string} flashUrl The URL of the flash mp3 player.\n */\ngoog.ui.media.Mp3.setFlashUrl = function(flashUrl) {\n  goog.ui.media.Mp3.flashUrl_ = flashUrl;\n};\n\n\n/**\n * A static method that builds a URL that will contain the flash player that\n * will play the `mp3Url`.\n *\n * @param {string} mp3Url The URL of the mp3 music.\n * @return {string} An URL of a flash player that will know how to play the\n *     given `mp3Url`.\n */\ngoog.ui.media.Mp3.buildFlashUrl = function(mp3Url) {\n  var flashUrl = goog.ui.media.Mp3.flashUrl_ + '?' +\n      goog.string.subs(\n          goog.ui.media.Mp3.PLAYER_ARGUMENTS_, goog.string.urlEncode(mp3Url));\n  return flashUrl;\n};\n\n\n/**\n * Creates the initial DOM structure of a mp3 video, which is basically a\n * the flash object pointing to a flash mp3 player.\n *\n * @param {goog.ui.Control} c The media control.\n * @return {!Element} A DOM structure that represents the control.\n * @override\n */\ngoog.ui.media.Mp3.prototype.createDom = function(c) {\n  var control = /** @type {goog.ui.media.Media} */ (c);\n  var div = goog.ui.media.Mp3.superClass_.createDom.call(this, control);\n\n  var dataModel =\n      /** @type {goog.ui.media.MediaModel} */ (control.getDataModel());\n  var flash = new goog.ui.media.FlashObject(\n      dataModel.getPlayer().getTrustedResourceUrl(), control.getDomHelper());\n  flash.setFlashVar('playerMode', 'embedded');\n  flash.render(div);\n\n  return div;\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.media.Mp3.prototype.getCssClass = function() {\n  return goog.ui.media.Mp3.CSS_CLASS;\n};\n","^;",1579837703000,"^<",["^=",["^2L","^9S","^9T","^?","^9U"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/media/mp3.js"],"^O",["^=",["~$goog.ui.media.Mp3"]],"^W",true,"^X",["^?","^2L","^9U","^9S","^9T"]],["^ ","^3",[1579837703000],"^4","goog.net.streams.streamfactory.js","^5",["^6","goog/net/streams/streamfactory.js"],"^7","goog/net/streams/streamfactory.js","^8","^9","^:","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview the factory for creating stream objects.\n *\n */\n\ngoog.provide('goog.net.streams.createXhrNodeReadableStream');\n\ngoog.require('goog.asserts');\ngoog.require('goog.net.streams.XhrNodeReadableStream');\ngoog.require('goog.net.streams.XhrStreamReader');\n\n\n/**\n * Creates a new NodeReadableStream object using goog.net.xhrio as the\n * underlying HTTP request.\n *\n * The XhrIo object should not have been sent to the network via its send()\n * method. NodeReadableStream callbacks are expected to be registered before\n * XhrIo.send() is invoked. The behavior of the stream is undefined if\n * otherwise. After send() is called, the lifecycle events are expected to\n * be handled directly via the stream API.\n *\n * If a binary response (e.g. protobuf) is expected, the caller should configure\n * the xhrIo by setResponseType(goog.net.XhrIo.ResponseType.ARRAY_BUFFER)\n * before xhrIo.send() is invoked.\n *\n * States specific to the xhr may be accessed before or after send() is called\n * as long as those operations are safe, e.g. configuring headers and options.\n *\n * Timeout (deadlines), cancellation (abort) should be applied to\n * XhrIo directly and the stream object will respect any life cycle events\n * trigger by those actions.\n *\n * Note for the release pkg:\n *   \"--define goog.net.XmlHttpDefines.ASSUME_NATIVE_XHR=true\"\n *   disable asserts\n *\n * @param {!goog.net.XhrIo} xhr The XhrIo object with its response body to\n * be handled by NodeReadableStream.\n * @return {goog.net.streams.NodeReadableStream} the newly created stream or\n * null if streaming response is not supported by the current User Agent.\n */\ngoog.net.streams.createXhrNodeReadableStream = function(xhr) {\n  goog.asserts.assert(!xhr.isActive(), 'XHR is already sent.');\n\n  if (!goog.net.streams.XhrStreamReader.isStreamingSupported()) {\n    return null;\n  }\n\n  var reader = new goog.net.streams.XhrStreamReader(xhr);\n  return new goog.net.streams.XhrNodeReadableStream(reader);\n};\n","^;",1579837703000,"^<",["^=",["^1L","^?","~$goog.net.streams.XhrNodeReadableStream","~$goog.net.streams.XhrStreamReader"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/streams/streamfactory.js"],"^O",["^=",["~$goog.net.streams.createXhrNodeReadableStream"]],"^W",true,"^X",["^?","^1L","^:S","^:T"]],["^ ","^3",[1579837703000],"^4","goog.labs.testing.logicmatcher.js","^5",["^6","goog/labs/testing/logicmatcher.js"],"^7","goog/labs/testing/logicmatcher.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides the built-in logic matchers: anyOf, allOf, and isNot.\n *\n */\n\n\ngoog.provide('goog.labs.testing.AllOfMatcher');\ngoog.provide('goog.labs.testing.AnyOfMatcher');\ngoog.provide('goog.labs.testing.IsNotMatcher');\ngoog.provide('goog.labs.testing.logicMatchers');\n\n\ngoog.require('goog.array');\ngoog.require('goog.labs.testing.Matcher');\n\n\n\n/**\n * The AllOf matcher.\n *\n * @param {!Array<!goog.labs.testing.Matcher>} matchers Input matchers.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.AllOfMatcher = function(matchers) {\n  /**\n   * @type {!Array<!goog.labs.testing.Matcher>}\n   * @private\n   */\n  this.matchers_ = matchers;\n};\n\n\n/**\n * Determines if all of the matchers match the input value.\n *\n * @override\n */\ngoog.labs.testing.AllOfMatcher.prototype.matches = function(actualValue) {\n  return goog.array.every(this.matchers_, function(matcher) {\n    return matcher.matches(actualValue);\n  });\n};\n\n\n/**\n * Describes why the matcher failed. The returned string is a concatenation of\n * all the failed matchers' error strings.\n *\n * @override\n */\ngoog.labs.testing.AllOfMatcher.prototype.describe = function(actualValue) {\n  // TODO(user) : Optimize this to remove duplication with matches ?\n  var errorString = '';\n  goog.array.forEach(this.matchers_, function(matcher) {\n    if (!matcher.matches(actualValue)) {\n      errorString += matcher.describe(actualValue) + '\\n';\n    }\n  });\n  return errorString;\n};\n\n\n\n/**\n * The AnyOf matcher.\n *\n * @param {!Array<!goog.labs.testing.Matcher>} matchers Input matchers.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.AnyOfMatcher = function(matchers) {\n  /**\n   * @type {!Array<!goog.labs.testing.Matcher>}\n   * @private\n   */\n  this.matchers_ = matchers;\n};\n\n\n/**\n * Determines if any of the matchers matches the input value.\n *\n * @override\n */\ngoog.labs.testing.AnyOfMatcher.prototype.matches = function(actualValue) {\n  return goog.array.some(this.matchers_, function(matcher) {\n    return matcher.matches(actualValue);\n  });\n};\n\n\n/**\n * Describes why the matcher failed.\n *\n * @override\n */\ngoog.labs.testing.AnyOfMatcher.prototype.describe = function(actualValue) {\n  // TODO(user) : Optimize this to remove duplication with matches ?\n  var errorString = '';\n  goog.array.forEach(this.matchers_, function(matcher) {\n    if (!matcher.matches(actualValue)) {\n      errorString += matcher.describe(actualValue) + '\\n';\n    }\n  });\n  return errorString;\n};\n\n\n\n/**\n * The IsNot matcher.\n *\n * @param {!goog.labs.testing.Matcher} matcher The matcher to negate.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.IsNotMatcher = function(matcher) {\n  /**\n   * @type {!goog.labs.testing.Matcher}\n   * @private\n   */\n  this.matcher_ = matcher;\n};\n\n\n/**\n * Determines if the input value doesn't satisfy a matcher.\n *\n * @override\n */\ngoog.labs.testing.IsNotMatcher.prototype.matches = function(actualValue) {\n  return !this.matcher_.matches(actualValue);\n};\n\n\n/**\n * Describes why the matcher failed.\n *\n * @override\n */\ngoog.labs.testing.IsNotMatcher.prototype.describe = function(actualValue) {\n  return 'The following is false: ' + this.matcher_.describe(actualValue);\n};\n\n\n/**\n * Creates a matcher that will succeed only if all of the given matchers\n * succeed.\n *\n * @param {...goog.labs.testing.Matcher} var_args The matchers to test\n *     against.\n *\n * @return {!goog.labs.testing.AllOfMatcher} The AllOf matcher.\n */\nvar allOf = goog.labs.testing.AllOfMatcher.allOf = function(var_args) {\n  var matchers = goog.array.toArray(arguments);\n  return new goog.labs.testing.AllOfMatcher(matchers);\n};\n\n\n/**\n * Accepts a set of matchers and returns a matcher which matches\n * values which satisfy the constraints of any of the given matchers.\n *\n * @param {...goog.labs.testing.Matcher} var_args The matchers to test\n *     against.\n *\n * @return {!goog.labs.testing.AnyOfMatcher} The AnyOf matcher.\n */\nvar anyOf = goog.labs.testing.AnyOfMatcher.anyOf = function(var_args) {\n  var matchers = goog.array.toArray(arguments);\n  return new goog.labs.testing.AnyOfMatcher(matchers);\n};\n\n\n/**\n * Returns a matcher that negates the input matcher. The returned\n * matcher matches the values not matched by the input matcher and vice-versa.\n *\n * @param {!goog.labs.testing.Matcher} matcher The matcher to test against.\n *\n * @return {!goog.labs.testing.IsNotMatcher} The IsNot matcher.\n */\nvar isNot = goog.labs.testing.IsNotMatcher.isNot = function(matcher) {\n  return new goog.labs.testing.IsNotMatcher(matcher);\n};\n\n// Export functions via namespace for use by tests written with goog.module.\ngoog.labs.testing.logicMatchers.allOf = allOf;\ngoog.labs.testing.logicMatchers.anyOf = anyOf;\ngoog.labs.testing.logicMatchers.isNot = isNot;\n","^;",1579837703000,"^<",["^=",["^>","^?","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/testing/logicmatcher.js"],"^O",["^=",["~$goog.labs.testing.AnyOfMatcher","~$goog.labs.testing.AllOfMatcher","~$goog.labs.testing.logicMatchers","~$goog.labs.testing.IsNotMatcher"]],"^W",true,"^X",["^?","^2O","^>"]],["^ ","^3",[1579837703000],"^4","goog.events.filedrophandler.js","^5",["^6","goog/events/filedrophandler.js"],"^7","goog/events/filedrophandler.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a files drag and drop event detector. It works on\n * HTML5 browsers.\n *\n * @see ../demos/filedrophandler.html\n */\n\ngoog.provide('goog.events.FileDropHandler');\ngoog.provide('goog.events.FileDropHandler.EventType');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.events.BrowserEvent');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.log');\ngoog.require('goog.log.Level');\n\n\n\n/**\n * A files drag and drop event detector. Gets an `element` as parameter\n * and fires `goog.events.FileDropHandler.EventType.DROP` event when files\n * are dropped in the `element`.\n *\n * @param {Element|Document} element The element or document to listen on.\n * @param {boolean=} opt_preventDropOutside Whether to prevent a drop on the\n *     area outside the `element`. Default false.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.events.FileDropHandler = function(element, opt_preventDropOutside) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * Handler for drag/drop events.\n   * @type {!goog.events.EventHandler<!goog.events.FileDropHandler>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  var doc = element;\n  if (opt_preventDropOutside) {\n    doc = goog.dom.getOwnerDocument(element);\n  }\n\n  // Add dragenter listener to the owner document of the element.\n  this.eventHandler_.listen(\n      doc, goog.events.EventType.DRAGENTER, this.onDocDragEnter_);\n\n  // Add dragover listener to the owner document of the element only if the\n  // document is not the element itself.\n  if (doc != element) {\n    this.eventHandler_.listen(\n        doc, goog.events.EventType.DRAGOVER, this.onDocDragOver_);\n  }\n\n  // Add dragover and drop listeners to the element.\n  this.eventHandler_.listen(\n      element, goog.events.EventType.DRAGOVER, this.onElemDragOver_);\n  this.eventHandler_.listen(\n      element, goog.events.EventType.DROP, this.onElemDrop_);\n};\ngoog.inherits(goog.events.FileDropHandler, goog.events.EventTarget);\n\n\n/**\n * Whether the drag event contains files. It is initialized only in the\n * dragenter event. It is used in all the drag events to prevent default actions\n * only if the drag contains files. Preventing default actions is necessary to\n * go from dragenter to dragover and from dragover to drop. However we do not\n * always want to prevent default actions, e.g. when the user drags text or\n * links on a text area we should not prevent the browser default action that\n * inserts the text in the text area. It is also necessary to stop propagation\n * when handling drag events on the element to prevent them from propagating\n * to the document.\n * @private\n * @type {boolean}\n */\ngoog.events.FileDropHandler.prototype.dndContainsFiles_ = false;\n\n\n/**\n * A logger, used to help us debug the algorithm.\n * @type {goog.log.Logger}\n * @private\n */\ngoog.events.FileDropHandler.prototype.logger_ =\n    goog.log.getLogger('goog.events.FileDropHandler');\n\n\n/**\n * The types of events fired by this class.\n * @enum {string}\n */\ngoog.events.FileDropHandler.EventType = {\n  DROP: goog.events.EventType.DROP\n};\n\n\n/** @override */\ngoog.events.FileDropHandler.prototype.disposeInternal = function() {\n  goog.events.FileDropHandler.superClass_.disposeInternal.call(this);\n  this.eventHandler_.dispose();\n};\n\n\n/**\n * Dispatches the DROP event.\n * @param {goog.events.BrowserEvent} e The underlying browser event.\n * @private\n */\ngoog.events.FileDropHandler.prototype.dispatch_ = function(e) {\n  goog.log.fine(this.logger_, 'Firing DROP event...');\n  var event = new goog.events.BrowserEvent(e.getBrowserEvent());\n  event.type = goog.events.FileDropHandler.EventType.DROP;\n  this.dispatchEvent(event);\n};\n\n\n/**\n * Handles dragenter on the document.\n * @param {goog.events.BrowserEvent} e The dragenter event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.events.FileDropHandler.prototype.onDocDragEnter_ = function(e) {\n  goog.log.log(\n      this.logger_, goog.log.Level.FINER,\n      '\"' + e.target.id + '\" (' + e.target + ') dispatched: ' + e.type);\n  var dt = e.getBrowserEvent().dataTransfer;\n  // Check whether the drag event contains files.\n  this.dndContainsFiles_ = !!(\n      dt && ((dt.types && (goog.array.contains(dt.types, 'Files') ||\n                           goog.array.contains(dt.types, 'public.file-url'))) ||\n             (dt.files && dt.files.length > 0)));\n  // If it does\n  if (this.dndContainsFiles_) {\n    // Prevent default actions.\n    e.preventDefault();\n  }\n  goog.log.log(\n      this.logger_, goog.log.Level.FINER,\n      'dndContainsFiles_: ' + this.dndContainsFiles_);\n};\n\n\n/**\n * Handles dragging something over the document.\n * @param {goog.events.BrowserEvent} e The dragover event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.events.FileDropHandler.prototype.onDocDragOver_ = function(e) {\n  goog.log.log(\n      this.logger_, goog.log.Level.FINEST,\n      '\"' + e.target.id + '\" (' + e.target + ') dispatched: ' + e.type);\n  if (this.dndContainsFiles_) {\n    // Prevent default actions.\n    e.preventDefault();\n    // Disable the drop on the document outside the drop zone.\n    var dt = e.getBrowserEvent().dataTransfer;\n    dt.dropEffect = 'none';\n  }\n};\n\n\n/**\n * Handles dragging something over the element (drop zone).\n * @param {goog.events.BrowserEvent} e The dragover event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.events.FileDropHandler.prototype.onElemDragOver_ = function(e) {\n  goog.log.log(\n      this.logger_, goog.log.Level.FINEST,\n      '\"' + e.target.id + '\" (' + e.target + ') dispatched: ' + e.type);\n  if (this.dndContainsFiles_) {\n    // Prevent default actions and stop the event from propagating further to\n    // the document. Both lines are needed! (See comment above).\n    e.preventDefault();\n    e.stopPropagation();\n    // Allow the drop on the drop zone.\n    var dt = e.getBrowserEvent().dataTransfer;\n\n    // IE bug #811625 (https://goo.gl/UWuxX0) will throw error SCRIPT65535\n    // when attempting to set property effectAllowed on IE10+.\n    // See more: https://github.com/google/closure-library/issues/485.\n    try {\n      dt.effectAllowed = 'all';\n    } catch (err) {\n    }\n    dt.dropEffect = 'copy';\n  }\n};\n\n\n/**\n * Handles dropping something onto the element (drop zone).\n * @param {goog.events.BrowserEvent} e The drop event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.events.FileDropHandler.prototype.onElemDrop_ = function(e) {\n  goog.log.log(\n      this.logger_, goog.log.Level.FINER,\n      '\"' + e.target.id + '\" (' + e.target + ') dispatched: ' + e.type);\n  // If the drag and drop event contains files.\n  if (this.dndContainsFiles_) {\n    // Prevent default actions and stop the event from propagating further to\n    // the document. Both lines are needed! (See comment above).\n    e.preventDefault();\n    e.stopPropagation();\n    // Dispatch DROP event.\n    this.dispatch_(e);\n  }\n};\n","^;",1579837703000,"^<",["^=",["^1>","^1T","^2B","^?","^3W","^18","^1C","^4Y","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/filedrophandler.js"],"^O",["^=",["~$goog.events.FileDropHandler","~$goog.events.FileDropHandler.EventType"]],"^W",true,"^X",["^?","^2O","^1>","^4Y","^1T","^3W","^1C","^18","^2B"]],["^ ","^3",[1579837703000],"^4","goog.net.imageloader.js","^5",["^6","goog/net/imageloader.js"],"^7","goog/net/imageloader.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Image loader utility class.  Useful when an application needs\n * to preload multiple images, for example so they can be sized.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.net.ImageLoader');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.net.EventType');\ngoog.require('goog.object');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Image loader utility class.  Raises a {@link goog.events.EventType.LOAD}\n * event for each image loaded, with an {@link Image} object as the target of\n * the event, normalized to have `naturalHeight` and `naturalWidth`\n * attributes.\n *\n * To use this class, run:\n *\n * <pre>\n *   var imageLoader = new goog.net.ImageLoader();\n *   goog.events.listen(imageLoader, goog.net.EventType.COMPLETE,\n *       function(e) { ... });\n *   imageLoader.addImage(\"image_id\", \"http://path/to/image.gif\");\n *   imageLoader.start();\n * </pre>\n *\n * The start() method must be called to start image loading.  Images can be\n * added and removed after loading has started, but only those images added\n * before start() was called will be loaded until start() is called again.\n * A goog.net.EventType.COMPLETE event will be dispatched only once all\n * outstanding images have completed uploading.\n *\n * @param {Element=} opt_parent An optional parent element whose document object\n *     should be used to load images.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.net.ImageLoader = function(opt_parent) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * Map of image IDs to their request including their image src, used to keep\n   * track of the images to load.  Once images have started loading, they're\n   * removed from this map.\n   * @type {!Object<!goog.net.ImageLoader.ImageRequest_>}\n   * @private\n   */\n  this.imageIdToRequestMap_ = {};\n\n  /**\n   * Map of image IDs to their image element, used only for images that are in\n   * the process of loading.  Used to clean-up event listeners and to know\n   * when we've completed loading images.\n   * @type {!Object<string, !Element>}\n   * @private\n   */\n  this.imageIdToImageMap_ = {};\n\n  /**\n   * Event handler object, used to keep track of onload and onreadystatechange\n   * listeners.\n   * @type {!goog.events.EventHandler<!goog.net.ImageLoader>}\n   * @private\n   */\n  this.handler_ = new goog.events.EventHandler(this);\n\n  /**\n   * The parent element whose document object will be used to load images.\n   * Useful if you want to load the images from a window other than the current\n   * window in order to control the Referer header sent when the image is\n   * loaded.\n   * @type {Element|undefined}\n   * @private\n   */\n  this.parent_ = opt_parent;\n};\ngoog.inherits(goog.net.ImageLoader, goog.events.EventTarget);\n\n\n/**\n * The type of image request to dispatch, if this is a CORS-enabled image\n * request. CORS-enabled images can be reused in canvas elements without them\n * being tainted. The server hosting the image should include the appropriate\n * CORS header.\n * @see https://developer.mozilla.org/en-US/docs/HTML/CORS_Enabled_Image\n * @enum {string}\n */\ngoog.net.ImageLoader.CorsRequestType = {\n  ANONYMOUS: 'anonymous',\n  USE_CREDENTIALS: 'use-credentials'\n};\n\n\n/**\n * Describes a request for an image. This includes its URL and its CORS-request\n * type, if any.\n * @typedef {{\n *   src: string,\n *   corsRequestType: ?goog.net.ImageLoader.CorsRequestType\n * }}\n * @private\n */\ngoog.net.ImageLoader.ImageRequest_;\n\n\n/**\n * An array of event types to listen to on images.  This is browser dependent.\n *\n * For IE 10 and below, Internet Explorer doesn't reliably raise LOAD events\n * on images, so we must use READY_STATE_CHANGE.  Since the image is cached\n * locally, IE won't fire the LOAD event while the onreadystate event is fired\n * always. On the other hand, the ERROR event is always fired whenever the image\n * is not loaded successfully no matter whether it's cached or not.\n *\n * In IE 11, onreadystatechange is removed and replaced with onload:\n *\n * http://msdn.microsoft.com/en-us/library/ie/ms536957(v=vs.85).aspx\n * http://msdn.microsoft.com/en-us/library/ie/bg182625(v=vs.85).aspx\n *\n * @type {!Array<string>}\n * @private\n */\ngoog.net.ImageLoader.IMAGE_LOAD_EVENTS_ = [\n  goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('11') ?\n      goog.net.EventType.READY_STATE_CHANGE :\n      goog.events.EventType.LOAD,\n  goog.net.EventType.ABORT, goog.net.EventType.ERROR\n];\n\n\n/**\n * Adds an image to the image loader, and associates it with the given ID\n * string.  If an image with that ID already exists, it is silently replaced.\n * When the image in question is loaded, the target of the LOAD event will be\n * an `Image` object with `id` and `src` attributes based on\n * these arguments.\n * @param {string} id The ID of the image to load.\n * @param {string|Image} image Either the source URL of the image or the HTML\n *     image element itself (or any object with a `src` property, really).\n * @param {!goog.net.ImageLoader.CorsRequestType=} opt_corsRequestType The type\n *     of CORS request to use, if any.\n */\ngoog.net.ImageLoader.prototype.addImage = function(\n    id, image, opt_corsRequestType) {\n  var src = (typeof image === 'string') ? image : image.src;\n  if (src) {\n    // For now, we just store the source URL for the image.\n    this.imageIdToRequestMap_[id] = {\n      src: src,\n      corsRequestType: opt_corsRequestType !== undefined ? opt_corsRequestType :\n                                                           null\n    };\n  }\n};\n\n\n/**\n * Removes the image associated with the given ID string from the image loader.\n * If the image was previously loading, removes any listeners for its events\n * and dispatches a COMPLETE event if all remaining images have now completed.\n * @param {string} id The ID of the image to remove.\n */\ngoog.net.ImageLoader.prototype.removeImage = function(id) {\n  delete this.imageIdToRequestMap_[id];\n\n  var image = this.imageIdToImageMap_[id];\n  if (image) {\n    delete this.imageIdToImageMap_[id];\n\n    // Stop listening for events on the image.\n    this.handler_.unlisten(\n        image, goog.net.ImageLoader.IMAGE_LOAD_EVENTS_, this.onNetworkEvent_);\n\n    // If this was the last image, raise a COMPLETE event.\n    if (goog.object.isEmpty(this.imageIdToImageMap_) &&\n        goog.object.isEmpty(this.imageIdToRequestMap_)) {\n      this.dispatchEvent(goog.net.EventType.COMPLETE);\n    }\n  }\n};\n\n\n/**\n * Starts loading all images in the image loader in parallel.  Raises a LOAD\n * event each time an image finishes loading, and a COMPLETE event after all\n * images have finished loading.\n */\ngoog.net.ImageLoader.prototype.start = function() {\n  // Iterate over the keys, rather than the full object, to essentially clone\n  // the initial queued images in case any event handlers decide to add more\n  // images before this loop has finished executing.\n  var imageIdToRequestMap = this.imageIdToRequestMap_;\n  goog.array.forEach(goog.object.getKeys(imageIdToRequestMap), function(id) {\n    var imageRequest = imageIdToRequestMap[id];\n    if (imageRequest) {\n      delete imageIdToRequestMap[id];\n      this.loadImage_(imageRequest, id);\n    }\n  }, this);\n};\n\n\n/**\n * Creates an `Image` object with the specified ID and source URL, and\n * listens for network events raised as the image is loaded.\n * @param {!goog.net.ImageLoader.ImageRequest_} imageRequest The request data.\n * @param {string} id The unique ID of the image to load.\n * @private\n */\ngoog.net.ImageLoader.prototype.loadImage_ = function(imageRequest, id) {\n  if (this.isDisposed()) {\n    // When loading an image in IE7 (and maybe IE8), the error handler\n    // may fire before we yield JS control. If the error handler\n    // dispose the ImageLoader, this method will throw exception.\n    return;\n  }\n\n  /** @type {!HTMLImageElement} */\n  var image;\n  if (this.parent_) {\n    var dom = goog.dom.getDomHelper(this.parent_);\n    image = dom.createDom(goog.dom.TagName.IMG);\n  } else {\n    image = new Image();\n  }\n\n  if (imageRequest.corsRequestType) {\n    image.crossOrigin = imageRequest.corsRequestType;\n  }\n\n  this.handler_.listen(\n      image, goog.net.ImageLoader.IMAGE_LOAD_EVENTS_, this.onNetworkEvent_);\n  this.imageIdToImageMap_[id] = image;\n\n  image.id = id;\n  image.src = imageRequest.src;\n};\n\n\n/**\n * Handles net events (READY_STATE_CHANGE, LOAD, ABORT, and ERROR).\n * @param {goog.events.Event} evt The network event to handle.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.net.ImageLoader.prototype.onNetworkEvent_ = function(evt) {\n  var image = /** @type {Element} */ (evt.currentTarget);\n\n  if (!image) {\n    return;\n  }\n\n  if (evt.type == goog.net.EventType.READY_STATE_CHANGE) {\n    // This implies that the user agent is IE; see loadImage_().\n    // Noe that this block is used to check whether the image is ready to\n    // dispatch the COMPLETE event.\n    if (image.readyState == goog.net.EventType.COMPLETE) {\n      // This is the IE equivalent of a LOAD event.\n      evt.type = goog.events.EventType.LOAD;\n    } else {\n      // This may imply that the load failed.\n      // Note that the image has only the following states:\n      //   * uninitialized\n      //   * loading\n      //   * complete\n      // When the ERROR or the ABORT event is fired, the readyState\n      // will be either uninitialized or loading and we'd ignore those states\n      // since they will be handled separately (eg: evt.type = 'ERROR').\n\n      // Notes from MSDN : The states through which an object passes are\n      // determined by that object. An object can skip certain states\n      // (for example, interactive) if the state does not apply to that object.\n      // see http://msdn.microsoft.com/en-us/library/ms534359(VS.85).aspx\n\n      // The image is not loaded, ignore.\n      return;\n    }\n  }\n\n  // Add natural width/height properties for non-Gecko browsers.\n  if (typeof image.naturalWidth == 'undefined') {\n    if (evt.type == goog.events.EventType.LOAD) {\n      image.naturalWidth = image.width;\n      image.naturalHeight = image.height;\n    } else {\n      // This implies that the image fails to be loaded.\n      image.naturalWidth = 0;\n      image.naturalHeight = 0;\n    }\n  }\n\n  // Redispatch the event on behalf of the image. Note that the external\n  // listener may dispose this instance.\n  this.dispatchEvent({type: evt.type, target: image});\n\n  if (this.isDisposed()) {\n    // If instance was disposed by listener, exit this function.\n    return;\n  }\n\n  this.removeImage(image.id);\n};\n\n\n/** @override */\ngoog.net.ImageLoader.prototype.disposeInternal = function() {\n  delete this.imageIdToRequestMap_;\n  delete this.imageIdToImageMap_;\n  goog.dispose(this.handler_);\n\n  goog.net.ImageLoader.superClass_.disposeInternal.call(this);\n};\n","^;",1579837703000,"^<",["^=",["^1>","^1T","^?","^42","^3W","^[","^19","^1C","^2O","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/imageloader.js"],"^O",["^=",["~$goog.net.ImageLoader"]],"^W",true,"^X",["^?","^2O","^1>","^12","^1T","^3W","^1C","^19","^42","^["]],["^ ","^3",[1579837703000],"^4","goog.module.testdata.modA_1.js","^5",["^6","goog/module/testdata/modA_1.js"],"^7","goog/module/testdata/modA_1.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved\n\n/**\n * @fileoverview File #1 of module A.\n */\n\ngoog.provide('goog.module.testdata.modA_1');\n\n\ngoog.setTestOnly('goog.module.testdata.modA_1');\n\nif (window.modA1Loaded) throw new Error('modA_1 loaded twice');\nwindow.modA1Loaded = true;\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/module/testdata/modA_1.js"],"^O",["^=",["~$goog.module.testdata.modA-1","~$goog.module.testdata.modA_1"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.testing.editor.fieldmock.js","^5",["^6","goog/testing/editor/fieldmock.js"],"^7","goog/testing/editor/fieldmock.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Mock of goog.editor.field.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.setTestOnly('goog.testing.editor.FieldMock');\ngoog.provide('goog.testing.editor.FieldMock');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.Range');\ngoog.require('goog.editor.Field');\ngoog.require('goog.testing.LooseMock');\ngoog.require('goog.testing.mockmatchers');\n\n\n\n/**\n * Mock of goog.editor.Field.\n * @param {Window=} opt_window Window the field would edit.  Defaults to\n *     `window`.\n * @param {Window=} opt_appWindow \"AppWindow\" of the field, which can be\n *     different from `opt_window` when mocking a field that uses an\n *     iframe. Defaults to `opt_window`.\n * @param {goog.dom.AbstractRange=} opt_range An object (mock or real) to be\n *     returned by getRange(). If omitted, a new goog.dom.Range is created\n *     from the window every time getRange() is called.\n * @constructor\n * @extends {goog.testing.LooseMock}\n * @suppress {missingProperties} Mocks do not fit in the type system well.\n * @final\n */\ngoog.testing.editor.FieldMock = function(opt_window, opt_appWindow, opt_range) {\n  goog.testing.LooseMock.call(this, goog.editor.Field);\n  opt_window = opt_window || window;\n  opt_appWindow = opt_appWindow || opt_window;\n\n  // We want to pretend this is a Field even though it can't actaully be a\n  // subclass.\n  var thisField = /** @type {!goog.editor.Field} */ (/** @type {*} */ (this));\n\n  thisField.getAppWindow();\n  this.$anyTimes();\n  this.$returns(opt_appWindow);\n\n  thisField.getRange();\n  this.$anyTimes();\n  this.$does(function() {\n    return opt_range || goog.dom.Range.createFromWindow(opt_window);\n  });\n\n  thisField.getEditableDomHelper();\n  this.$anyTimes();\n  this.$returns(goog.dom.getDomHelper(opt_window.document));\n\n  thisField.usesIframe();\n  this.$anyTimes();\n\n  thisField.getBaseZindex();\n  this.$anyTimes();\n  this.$returns(0);\n\n  thisField.restoreSavedRange(\n      /** @type {?} */ (goog.testing.mockmatchers.ignoreArgument));\n  this.$anyTimes();\n  this.$does(function(range) {\n    if (range) {\n      range.restore();\n    }\n    thisField.focus();\n  });\n\n  // These methods cannot be set on the prototype, because the prototype\n  // gets stepped on by the mock framework.\n  var inModalMode = false;\n\n  /**\n   * @return {boolean} Whether we're in modal interaction mode.\n   */\n  this.inModalMode = function() { return inModalMode; };\n\n  /**\n   * @param {boolean} mode Sets whether we're in modal interaction mode.\n   */\n  this.setModalMode = function(mode) { inModalMode = mode; };\n\n  var uneditable = false;\n\n  /**\n   * @return {boolean} Whether the field is uneditable.\n   */\n  this.isUneditable = function() { return uneditable; };\n\n  /**\n   * @param {boolean} isUneditable Whether the field is uneditable.\n   */\n  this.setUneditable = function(isUneditable) { uneditable = isUneditable; };\n};\ngoog.inherits(goog.testing.editor.FieldMock, goog.testing.LooseMock);\n","^;",1579837703000,"^<",["^=",["^1>","^?","^1A","~$goog.testing.mockmatchers","~$goog.testing.LooseMock","^1H"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/editor/fieldmock.js"],"^O",["^=",["~$goog.testing.editor.FieldMock"]],"^W",true,"^X",["^?","^1>","^1H","^1A","^;4","^;3"]],["^ ","^3",[1579837703000],"^4","goog.editor.plugins.undoredo.js","^5",["^6","goog/editor/plugins/undoredo.js"],"^7","goog/editor/plugins/undoredo.js","^8","^9","^:","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Code for handling edit history (undo/redo).\n *\n */\n\n\ngoog.provide('goog.editor.plugins.UndoRedo');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeOffset');\ngoog.require('goog.dom.Range');\ngoog.require('goog.editor.BrowserFeature');\ngoog.require('goog.editor.Command');\ngoog.require('goog.editor.Field');\ngoog.require('goog.editor.Plugin');\ngoog.require('goog.editor.node');\ngoog.require('goog.editor.plugins.UndoRedoManager');\ngoog.require('goog.editor.plugins.UndoRedoState');\ngoog.require('goog.events');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.log');\ngoog.require('goog.object');\n\n\n\n/**\n * Encapsulates undo/redo logic using a custom undo stack (i.e. not browser\n * built-in). Browser built-in undo stacks are too flaky (e.g. IE's gets\n * clobbered on DOM modifications). Also, this allows interleaving non-editing\n * commands into the undo stack via the UndoRedoManager.\n *\n * @param {goog.editor.plugins.UndoRedoManager=} opt_manager An undo redo\n *    manager to be used by this plugin. If none is provided one is created.\n * @constructor\n * @extends {goog.editor.Plugin}\n */\ngoog.editor.plugins.UndoRedo = function(opt_manager) {\n  goog.editor.Plugin.call(this);\n\n  this.setUndoRedoManager(\n      opt_manager || new goog.editor.plugins.UndoRedoManager());\n\n  // Map of goog.editor.Field hashcode to goog.events.EventHandler\n  this.eventHandlers_ = {};\n\n  this.currentStates_ = {};\n\n  /**\n   * @type {?string}\n   * @private\n   */\n  this.initialFieldChange_ = null;\n\n  /**\n   * A copy of `goog.editor.plugins.UndoRedo.restoreState` bound to this,\n   * used by undo-redo state objects to restore the state of an editable field.\n   * @type {Function}\n   * @see goog.editor.plugins.UndoRedo#restoreState\n   * @private\n   */\n  this.boundRestoreState_ = goog.bind(this.restoreState, this);\n};\ngoog.inherits(goog.editor.plugins.UndoRedo, goog.editor.Plugin);\n\n\n/**\n * The logger for this class.\n * @type {goog.log.Logger}\n * @protected\n * @override\n */\ngoog.editor.plugins.UndoRedo.prototype.logger =\n    goog.log.getLogger('goog.editor.plugins.UndoRedo');\n\n\n/**\n * The `UndoState_` whose change is in progress, null if an undo or redo\n * is not in progress.\n *\n * @type {goog.editor.plugins.UndoRedo.UndoState_?}\n * @private\n */\ngoog.editor.plugins.UndoRedo.prototype.inProgressUndo_ = null;\n\n\n/**\n * The undo-redo stack manager used by this plugin.\n * @type {goog.editor.plugins.UndoRedoManager}\n * @private\n */\ngoog.editor.plugins.UndoRedo.prototype.undoManager_;\n\n\n/**\n * The key for the event listener handling state change events from the\n * undo-redo manager.\n * @type {goog.events.Key}\n * @private\n */\ngoog.editor.plugins.UndoRedo.prototype.managerStateChangeKey_;\n\n\n/**\n * Commands implemented by this plugin.\n * @enum {string}\n */\ngoog.editor.plugins.UndoRedo.COMMAND = {\n  UNDO: '+undo',\n  REDO: '+redo'\n};\n\n\n/**\n * Inverse map of execCommand strings to\n * {@link goog.editor.plugins.UndoRedo.COMMAND} constants. Used to determine\n * whether a string corresponds to a command this plugin handles in O(1) time.\n * @type {Object}\n * @private\n */\ngoog.editor.plugins.UndoRedo.SUPPORTED_COMMANDS_ =\n    goog.object.transpose(goog.editor.plugins.UndoRedo.COMMAND);\n\n\n/**\n * Set the max undo stack depth (not the real memory usage).\n * @param {number} depth Depth of the stack.\n */\ngoog.editor.plugins.UndoRedo.prototype.setMaxUndoDepth = function(depth) {\n  this.undoManager_.setMaxUndoDepth(depth);\n};\n\n\n/**\n * Set the undo-redo manager used by this plugin. Any state on a previous\n * undo-redo manager is lost.\n * @param {goog.editor.plugins.UndoRedoManager} manager The undo-redo manager.\n */\ngoog.editor.plugins.UndoRedo.prototype.setUndoRedoManager = function(manager) {\n  if (this.managerStateChangeKey_) {\n    goog.events.unlistenByKey(this.managerStateChangeKey_);\n  }\n\n  this.undoManager_ = manager;\n  this.managerStateChangeKey_ = goog.events.listen(\n      this.undoManager_,\n      goog.editor.plugins.UndoRedoManager.EventType.STATE_CHANGE,\n      this.dispatchCommandValueChange_, false, this);\n};\n\n\n/**\n * Whether the string corresponds to a command this plugin handles.\n * @param {string} command Command string to check.\n * @return {boolean} Whether the string corresponds to a command\n *     this plugin handles.\n * @override\n */\ngoog.editor.plugins.UndoRedo.prototype.isSupportedCommand = function(command) {\n  return command in goog.editor.plugins.UndoRedo.SUPPORTED_COMMANDS_;\n};\n\n\n/**\n * Unregisters and disables the fieldObject with this plugin. Thie does *not*\n * clobber the undo stack for the fieldObject though.\n * TODO(user): For the multifield version, we really should add a way to\n * ignore undo actions on field's that have been made uneditable.\n * This is probably as simple as skipping over entries in the undo stack\n * that have a hashcode of an uneditable field.\n * @param {goog.editor.Field} fieldObject The field to register with the plugin.\n * @override\n */\ngoog.editor.plugins.UndoRedo.prototype.unregisterFieldObject = function(\n    fieldObject) {\n  this.disable(fieldObject);\n  this.setFieldObject(null);\n};\n\n\n/**\n * This is so subclasses can deal with multifield undo-redo.\n * @return {goog.editor.Field} The active field object for this field. This is\n *     the one registered field object for the single-plugin case and the\n *     focused field for the multi-field plugin case.\n */\ngoog.editor.plugins.UndoRedo.prototype.getCurrentFieldObject = function() {\n  return this.getFieldObject();\n};\n\n\n/**\n * This is so subclasses can deal with multifield undo-redo.\n * @param {string} fieldHashCode The Field's hashcode.\n * @return {goog.editor.Field} The field object with the hashcode.\n */\ngoog.editor.plugins.UndoRedo.prototype.getFieldObjectForHash = function(\n    fieldHashCode) {\n  // With single field undoredo, there's only one Field involved.\n  return this.getFieldObject();\n};\n\n\n/**\n * This is so subclasses can deal with multifield undo-redo.\n * @return {goog.editor.Field} Target for COMMAND_VALUE_CHANGE events.\n */\ngoog.editor.plugins.UndoRedo.prototype.getCurrentEventTarget = function() {\n  return this.getFieldObject();\n};\n\n\n/** @override */\ngoog.editor.plugins.UndoRedo.prototype.enable = function(fieldObject) {\n  if (this.isEnabled(fieldObject)) {\n    return;\n  }\n\n  // Don't want pending delayed changes from when undo-redo was disabled\n  // firing after undo-redo is enabled since they might cause undo-redo stack\n  // updates.\n  fieldObject.clearDelayedChange();\n\n  var eventHandler = new goog.events.EventHandler(this);\n\n  // TODO(user): From ojan during a code review:\n  // The beforechange handler is meant to be there so you can grab the cursor\n  // position *before* the change is made as that's where you want the cursor to\n  // be after an undo.\n  //\n  // It kinda looks like updateCurrentState_ doesn't do that correctly right\n  // now, but it really should be fixed to do so. The cursor position stored in\n  // the state should be the cursor position before any changes are made, not\n  // the cursor position when the change finishes.\n  //\n  // It also seems like the if check below is just a bad one. We should do this\n  // for browsers that use mutation events as well even though the beforechange\n  // happens too late...maybe not. I don't know about this.\n  if (!goog.editor.BrowserFeature.USE_MUTATION_EVENTS) {\n    // We don't listen to beforechange in mutation-event browsers because\n    // there we fire beforechange, then syncronously file change. The point\n    // of before change is to capture before the user has changed anything.\n    eventHandler.listen(\n        fieldObject, goog.editor.Field.EventType.BEFORECHANGE,\n        this.handleBeforeChange_);\n  }\n  eventHandler.listen(\n      fieldObject, goog.editor.Field.EventType.DELAYEDCHANGE,\n      this.handleDelayedChange_);\n  eventHandler.listen(\n      fieldObject, goog.editor.Field.EventType.BLUR, this.handleBlur_);\n\n  this.eventHandlers_[fieldObject.getHashCode()] = eventHandler;\n\n  // We want to capture the initial state of a Trogedit field before any\n  // editing has happened. This is necessary so that we can undo the first\n  // change to a field, even if we don't handle beforeChange.\n  this.updateCurrentState_(fieldObject);\n};\n\n\n/** @override */\ngoog.editor.plugins.UndoRedo.prototype.disable = function(fieldObject) {\n  // Process any pending changes so we don't lose any undo-redo states that we\n  // want prior to disabling undo-redo.\n  fieldObject.clearDelayedChange();\n\n  var eventHandler = this.eventHandlers_[fieldObject.getHashCode()];\n  if (eventHandler) {\n    eventHandler.dispose();\n    delete this.eventHandlers_[fieldObject.getHashCode()];\n  }\n\n  // We delete the current state of the field on disable. When we re-enable\n  // the state will be re-fetched. In most cases the content will be the same,\n  // but this allows us to pick up changes while not editable. That way, when\n  // undoing after starting an editable session, you can always undo to the\n  // state you started in. Given this sequence of events:\n  // Make editable\n  // Type 'anakin'\n  // Make not editable\n  // Set HTML to be 'padme'\n  // Make editable\n  // Type 'dark side'\n  // Undo\n  // Without re-snapshoting current state on enable, the undo would go from\n  // 'dark-side' -> 'anakin', rather than 'dark-side' -> 'padme'. You couldn't\n  // undo the field to the state that existed immediately after it was made\n  // editable for the second time.\n  if (this.currentStates_[fieldObject.getHashCode()]) {\n    delete this.currentStates_[fieldObject.getHashCode()];\n  }\n};\n\n\n/** @override */\ngoog.editor.plugins.UndoRedo.prototype.isEnabled = function(fieldObject) {\n  // All enabled plugins have a eventHandler so reuse that map rather than\n  // storing additional enabled state.\n  return !!this.eventHandlers_[fieldObject.getHashCode()];\n};\n\n\n/** @override */\ngoog.editor.plugins.UndoRedo.prototype.disposeInternal = function() {\n  goog.editor.plugins.UndoRedo.superClass_.disposeInternal.call(this);\n\n  for (var hashcode in this.eventHandlers_) {\n    this.eventHandlers_[hashcode].dispose();\n    delete this.eventHandlers_[hashcode];\n  }\n  this.setFieldObject(null);\n\n  if (this.undoManager_) {\n    this.undoManager_.dispose();\n    delete this.undoManager_;\n  }\n};\n\n\n/** @override */\ngoog.editor.plugins.UndoRedo.prototype.getTrogClassId = function() {\n  return 'UndoRedo';\n};\n\n\n/** @override */\ngoog.editor.plugins.UndoRedo.prototype.execCommand = function(\n    command, var_args) {\n  if (command == goog.editor.plugins.UndoRedo.COMMAND.UNDO) {\n    this.undoManager_.undo();\n  } else if (command == goog.editor.plugins.UndoRedo.COMMAND.REDO) {\n    this.undoManager_.redo();\n  }\n};\n\n\n/** @override */\ngoog.editor.plugins.UndoRedo.prototype.queryCommandValue = function(command) {\n  var state = null;\n  if (command == goog.editor.plugins.UndoRedo.COMMAND.UNDO) {\n    state = this.undoManager_.hasUndoState();\n  } else if (command == goog.editor.plugins.UndoRedo.COMMAND.REDO) {\n    state = this.undoManager_.hasRedoState();\n  }\n  return state;\n};\n\n\n/**\n * Dispatches the COMMAND_VALUE_CHANGE event on the editable field or the field\n * manager, as appropriate.\n * Note: Really, people using multi field mode should be listening directly\n * to the undo-redo manager for events.\n * @private\n */\ngoog.editor.plugins.UndoRedo.prototype.dispatchCommandValueChange_ =\n    function() {\n  var eventTarget = this.getCurrentEventTarget();\n  eventTarget.dispatchEvent({\n    type: goog.editor.Field.EventType.COMMAND_VALUE_CHANGE,\n    commands: [\n      goog.editor.plugins.UndoRedo.COMMAND.REDO,\n      goog.editor.plugins.UndoRedo.COMMAND.UNDO\n    ]\n  });\n};\n\n\n/**\n * Restores the state of the editable field.\n * @param {goog.editor.plugins.UndoRedo.UndoState_} state The state initiating\n *    the restore.\n * @param {string} content The content to restore.\n * @param {goog.editor.plugins.UndoRedo.CursorPosition_?} cursorPosition\n *     The cursor position within the content.\n */\ngoog.editor.plugins.UndoRedo.prototype.restoreState = function(\n    state, content, cursorPosition) {\n  // Fire any pending changes to get the current field state up to date and\n  // then stop listening to changes while doing the undo/redo.\n  var fieldObj = this.getFieldObjectForHash(state.fieldHashCode);\n  if (!fieldObj) {\n    return;\n  }\n\n  // Fires any pending changes, and stops the change events. Still want to\n  // dispatch before change, as a change is being made and the change event\n  // will be manually dispatched below after the new content has been restored\n  // (also restarting change events).\n  fieldObj.stopChangeEvents(true, true);\n\n  // To prevent the situation where we stop change events and then an exception\n  // happens before we can restart change events, the following code must be in\n  // a try-finally block.\n  try {\n    fieldObj.dispatchBeforeChange();\n\n    // Restore the state\n    fieldObj.execCommand(goog.editor.Command.CLEAR_LOREM, true);\n\n    // We specifically set the raw innerHTML of the field here as that's what\n    // we get from the field when we save an undo/redo state. There's\n    // no need to clean/unclean the contents in either direction.\n    goog.editor.node.replaceInnerHtml(fieldObj.getElement(), content);\n\n    if (cursorPosition) {\n      cursorPosition.select();\n    }\n\n    var previousFieldObject = this.getCurrentFieldObject();\n    fieldObj.focus();\n\n    // Apps that integrate their undo-redo with Trogedit may be\n    // in a state where there is no previous field object (no field focused at\n    // the time of undo), so check for existence first.\n    if (previousFieldObject &&\n        previousFieldObject.getHashCode() != state.fieldHashCode) {\n      previousFieldObject.execCommand(goog.editor.Command.UPDATE_LOREM);\n    }\n\n    // We need to update currentState_ to reflect the change.\n    this.currentStates_[state.fieldHashCode].setUndoState(\n        content, cursorPosition);\n  } catch (e) {\n    goog.log.error(this.logger, 'Error while restoring undo state', e);\n  } finally {\n    // Clear the delayed change event, set flag so we know not to act on it.\n    this.inProgressUndo_ = state;\n    // Notify the editor that we've changed (fire autosave).\n    // Note that this starts up change events again, so we don't have to\n    // manually do so even though we stopped change events above.\n    fieldObj.dispatchChange();\n    fieldObj.dispatchSelectionChangeEvent();\n  }\n};\n\n\n/**\n * @override\n */\ngoog.editor.plugins.UndoRedo.prototype.handleKeyboardShortcut = function(\n    e, key, isModifierPressed) {\n  if (isModifierPressed) {\n    var command;\n    if (key == 'z') {\n      command = e.shiftKey ? goog.editor.plugins.UndoRedo.COMMAND.REDO :\n                             goog.editor.plugins.UndoRedo.COMMAND.UNDO;\n    } else if (key == 'y') {\n      command = goog.editor.plugins.UndoRedo.COMMAND.REDO;\n    }\n\n    if (command) {\n      // In the case where Trogedit shares its undo redo stack with another\n      // application it's possible that an undo or redo will not be for an\n      // goog.editor.Field. In this case we don't want to go through the\n      // goog.editor.Field execCommand flow which stops and restarts events on\n      // the current field. Only Trogedit UndoState's have a fieldHashCode so\n      // use that to distinguish between Trogedit and other states.\n      var state = command == goog.editor.plugins.UndoRedo.COMMAND.UNDO ?\n          this.undoManager_.undoPeek() :\n          this.undoManager_.redoPeek();\n      if (state && state.fieldHashCode) {\n        this.getCurrentFieldObject().execCommand(command);\n      } else {\n        this.execCommand(command);\n      }\n\n      return true;\n    }\n  }\n\n  return false;\n};\n\n\n/**\n * Clear the undo/redo stack.\n */\ngoog.editor.plugins.UndoRedo.prototype.clearHistory = function() {\n  // Fire all pending change events, so that they don't come back\n  // asynchronously to fill the queue.\n  this.getFieldObject().stopChangeEvents(true, true);\n  this.undoManager_.clearHistory();\n  this.getFieldObject().startChangeEvents();\n};\n\n\n/**\n * Refreshes the current state of the editable field as maintained by undo-redo,\n * without adding any undo-redo states to the stack.\n * @param {goog.editor.Field} fieldObject The editable field.\n */\ngoog.editor.plugins.UndoRedo.prototype.refreshCurrentState = function(\n    fieldObject) {\n  if (this.isEnabled(fieldObject)) {\n    if (this.currentStates_[fieldObject.getHashCode()]) {\n      delete this.currentStates_[fieldObject.getHashCode()];\n    }\n    this.updateCurrentState_(fieldObject);\n  }\n};\n\n\n/**\n * Before the field changes, we want to save the state.\n * @param {goog.events.Event} e The event.\n * @private\n */\ngoog.editor.plugins.UndoRedo.prototype.handleBeforeChange_ = function(e) {\n  if (this.inProgressUndo_) {\n    // We are in between a previous undo and its delayed change event.\n    // Continuing here clobbers the redo stack.\n    // This does mean that if you are trying to undo/redo really quickly, it\n    // will be gated by the speed of delayed change events.\n    return;\n  }\n\n  var fieldObj = /** @type {goog.editor.Field} */ (e.target);\n  var fieldHashCode = fieldObj.getHashCode();\n\n  if (this.initialFieldChange_ != fieldHashCode) {\n    this.initialFieldChange_ = fieldHashCode;\n    this.updateCurrentState_(fieldObj);\n  }\n};\n\n\n/**\n * After some idle time, we want to save the state.\n * @param {goog.events.Event} e The event.\n * @private\n */\ngoog.editor.plugins.UndoRedo.prototype.handleDelayedChange_ = function(e) {\n  // This was undo making a change, don't add it BACK into the history\n  if (this.inProgressUndo_) {\n    // Must clear this.inProgressUndo_ before dispatching event because the\n    // dispatch can cause another, queued undo that should be allowed to go\n    // through.\n    var state = this.inProgressUndo_;\n    this.inProgressUndo_ = null;\n    state.dispatchEvent(goog.editor.plugins.UndoRedoState.ACTION_COMPLETED);\n    return;\n  }\n\n  this.updateCurrentState_(/** @type {goog.editor.Field} */ (e.target));\n};\n\n\n/**\n * When the user blurs away, we need to save the state on that field.\n * @param {goog.events.Event} e The event.\n * @private\n */\ngoog.editor.plugins.UndoRedo.prototype.handleBlur_ = function(e) {\n  var fieldObj = /** @type {goog.editor.Field} */ (e.target);\n  if (fieldObj) {\n    fieldObj.clearDelayedChange();\n  }\n};\n\n\n/**\n * Returns the goog.editor.plugins.UndoRedo.CursorPosition_ for the current\n * selection in the given Field.\n * @param {goog.editor.Field} fieldObj The field object.\n * @return {goog.editor.plugins.UndoRedo.CursorPosition_} The CursorPosition_ or\n *    null if there is no valid selection.\n * @private\n */\ngoog.editor.plugins.UndoRedo.prototype.getCursorPosition_ = function(fieldObj) {\n  var cursorPos = new goog.editor.plugins.UndoRedo.CursorPosition_(fieldObj);\n  if (!cursorPos.isValid()) {\n    return null;\n  }\n  return cursorPos;\n};\n\n\n/**\n * Helper method for saving state.\n * @param {goog.editor.Field} fieldObj The field object.\n * @private\n */\ngoog.editor.plugins.UndoRedo.prototype.updateCurrentState_ = function(\n    fieldObj) {\n  var fieldHashCode = fieldObj.getHashCode();\n  // We specifically grab the raw innerHTML of the field here as that's what\n  // we would set on the field in the case of an undo/redo operation. There's\n  // no need to clean/unclean the contents in either direction. In the case of\n  // lorem ipsum being used, we want to capture the effective state (empty, no\n  // cursor position) rather than capturing the lorem html.\n  var content, cursorPos;\n  if (fieldObj.queryCommandValue(goog.editor.Command.USING_LOREM)) {\n    content = '';\n    cursorPos = null;\n  } else {\n    content = fieldObj.getElement().innerHTML;\n    cursorPos = this.getCursorPosition_(fieldObj);\n  }\n\n  var currentState = this.currentStates_[fieldHashCode];\n  if (currentState) {\n    // Don't create states if the content hasn't changed (spurious\n    // delayed change). This can happen when lorem is cleared, for example.\n    if (currentState.undoContent_ == content) {\n      return;\n    } else if (content == '' || currentState.undoContent_ == '') {\n      // If lorem ipsum is on we say the contents are the empty string. However,\n      // for an empty text shape with focus, the empty contents might not be\n      // the same, depending on plugins. We want these two empty states to be\n      // considered identical because to the user they are indistinguishable,\n      // so we use fieldObj.getInjectableContents to map between them.\n      // We cannot use getInjectableContents when first creating the undo\n      // content for a field with lorem, because on enable when this is first\n      // called we can't guarantee plugin registration order, so the\n      // injectableContents at that time might not match the final\n      // injectableContents.\n      var emptyContents = fieldObj.getInjectableContents('', {});\n      if (content == emptyContents && currentState.undoContent_ == '' ||\n          currentState.undoContent_ == emptyContents && content == '') {\n        return;\n      }\n    }\n\n    currentState.setRedoState(content, cursorPos);\n    this.undoManager_.addState(currentState);\n  }\n\n  this.currentStates_[fieldHashCode] =\n      new goog.editor.plugins.UndoRedo.UndoState_(\n          fieldHashCode, content, cursorPos, this.boundRestoreState_);\n};\n\n\n\n/**\n * This object encapsulates the state of an editable field.\n *\n * @param {string} fieldHashCode String the id of the field we're saving the\n *     content of.\n * @param {string} content String the actual text we're saving.\n * @param {goog.editor.plugins.UndoRedo.CursorPosition_?} cursorPosition\n *     CursorPosLite object for the cursor position in the field.\n * @param {Function} restore The function used to restore editable field state.\n * @private\n * @constructor\n * @extends {goog.editor.plugins.UndoRedoState}\n */\ngoog.editor.plugins.UndoRedo.UndoState_ = function(\n    fieldHashCode, content, cursorPosition, restore) {\n  goog.editor.plugins.UndoRedoState.call(this, true);\n\n  /**\n   * The hash code for the field whose content is being saved.\n   * @type {string}\n   */\n  this.fieldHashCode = fieldHashCode;\n\n  /**\n   * The bound copy of `goog.editor.plugins.UndoRedo.restoreState` used by\n   * this state.\n   * @type {Function}\n   * @private\n   */\n  this.restore_ = restore;\n\n  this.setUndoState(content, cursorPosition);\n};\ngoog.inherits(\n    goog.editor.plugins.UndoRedo.UndoState_, goog.editor.plugins.UndoRedoState);\n\n\n/**\n * The content to restore on undo.\n * @type {string}\n * @private\n */\ngoog.editor.plugins.UndoRedo.UndoState_.prototype.undoContent_;\n\n\n/**\n * The cursor position to restore on undo.\n * @type {goog.editor.plugins.UndoRedo.CursorPosition_?}\n * @private\n */\ngoog.editor.plugins.UndoRedo.UndoState_.prototype.undoCursorPosition_;\n\n\n/**\n * The content to restore on redo, undefined until the state is pushed onto the\n * undo stack.\n * @type {string|undefined}\n * @private\n */\ngoog.editor.plugins.UndoRedo.UndoState_.prototype.redoContent_;\n\n\n/**\n * The cursor position to restore on redo, undefined until the state is pushed\n * onto the undo stack.\n * @type {goog.editor.plugins.UndoRedo.CursorPosition_|null|undefined}\n * @private\n */\ngoog.editor.plugins.UndoRedo.UndoState_.prototype.redoCursorPosition_;\n\n\n/**\n * Get the content to restore on undo.\n * @return {string}\n */\ngoog.editor.plugins.UndoRedo.UndoState_.prototype.getUndoContent = function() {\n  return this.undoContent_;\n};\n\n\n/**\n * Get the content to restore on redo.\n * @return {string|undefined}\n */\ngoog.editor.plugins.UndoRedo.UndoState_.prototype.getRedoContent = function() {\n  return this.redoContent_;\n};\n\n\n/**\n * Performs the undo operation represented by this state.\n * @override\n */\ngoog.editor.plugins.UndoRedo.UndoState_.prototype.undo = function() {\n  this.restore_(this, this.undoContent_, this.undoCursorPosition_);\n};\n\n\n/**\n * Performs the redo operation represented by this state.\n * @override\n */\ngoog.editor.plugins.UndoRedo.UndoState_.prototype.redo = function() {\n  this.restore_(this, this.redoContent_, this.redoCursorPosition_);\n};\n\n\n/**\n * Updates the undo portion of this state. Should only be used to update the\n * current state of an editable field, which is not yet on the undo stack after\n * an undo or redo operation. You should never be modifying states on the stack!\n * @param {string} content The current content.\n * @param {goog.editor.plugins.UndoRedo.CursorPosition_?} cursorPosition\n *     The current cursor position.\n */\ngoog.editor.plugins.UndoRedo.UndoState_.prototype.setUndoState = function(\n    content, cursorPosition) {\n  this.undoContent_ = content;\n  this.undoCursorPosition_ = cursorPosition;\n};\n\n\n/**\n * Adds redo information to this state. This method should be called before the\n * state is added onto the undo stack.\n *\n * @param {string} content The content to restore on a redo.\n * @param {goog.editor.plugins.UndoRedo.CursorPosition_?} cursorPosition\n *     The cursor position to restore on a redo.\n */\ngoog.editor.plugins.UndoRedo.UndoState_.prototype.setRedoState = function(\n    content, cursorPosition) {\n  this.redoContent_ = content;\n  this.redoCursorPosition_ = cursorPosition;\n};\n\n\n/**\n * Checks if the *contents* of two\n * `goog.editor.plugins.UndoRedo.UndoState_`s are the same.  We don't\n * bother checking the cursor position (that's not something we'd want to save\n * anyway).\n * @param {goog.editor.plugins.UndoRedoState} rhs The state to compare.\n * @return {boolean} Whether the contents are the same.\n * @override\n */\ngoog.editor.plugins.UndoRedo.UndoState_.prototype.equals = function(rhs) {\n  return this.fieldHashCode == rhs.fieldHashCode &&\n      this.undoContent_ == rhs.undoContent_ &&\n      this.redoContent_ == rhs.redoContent_;\n};\n\n\n\n/**\n * Stores the state of the selection in a way the survives DOM modifications\n * that don't modify the user-interactable content (e.g. making something bold\n * vs. typing a character).\n *\n * TODO(user): Completely get rid of this and use goog.dom.SavedCaretRange.\n *\n * @param {goog.editor.Field} field The field the selection is in.\n * @private\n * @constructor\n */\ngoog.editor.plugins.UndoRedo.CursorPosition_ = function(field) {\n  this.field_ = field;\n\n  var win = field.getEditableDomHelper().getWindow();\n  var range = field.getRange();\n  var isValidRange =\n      !!range && range.isRangeInDocument() && range.getWindow() == win;\n  range = isValidRange ? range : null;\n\n  if (goog.editor.BrowserFeature.HAS_W3C_RANGES) {\n    this.initW3C_(range);\n  } else if (goog.editor.BrowserFeature.HAS_IE_RANGES) {\n    this.initIE_(range);\n  }\n};\n\n\n/**\n * The standards compliant version keeps a list of childNode offsets.\n * @param {goog.dom.AbstractRange?} range The range to save.\n * @private\n */\ngoog.editor.plugins.UndoRedo.CursorPosition_.prototype.initW3C_ = function(\n    range) {\n  this.isValid_ = false;\n\n  // TODO: Check if the range is in the field before trying to save it\n  // for FF 3 contentEditable.\n  if (!range) {\n    return;\n  }\n\n  var anchorNode = range.getAnchorNode();\n  var focusNode = range.getFocusNode();\n  if (!anchorNode || !focusNode) {\n    return;\n  }\n\n  var anchorOffset = range.getAnchorOffset();\n  var anchor = new goog.dom.NodeOffset(anchorNode, this.field_.getElement());\n\n  var focusOffset = range.getFocusOffset();\n  var focus = new goog.dom.NodeOffset(focusNode, this.field_.getElement());\n\n  // Test range direction.\n  if (range.isReversed()) {\n    this.startOffset_ = focus;\n    this.startChildOffset_ = focusOffset;\n    this.endOffset_ = anchor;\n    this.endChildOffset_ = anchorOffset;\n  } else {\n    this.startOffset_ = anchor;\n    this.startChildOffset_ = anchorOffset;\n    this.endOffset_ = focus;\n    this.endChildOffset_ = focusOffset;\n  }\n\n  this.isValid_ = true;\n};\n\n\n/**\n * In IE, we just keep track of the text offset (number of characters).\n * @param {goog.dom.AbstractRange?} range The range to save.\n * @private\n */\ngoog.editor.plugins.UndoRedo.CursorPosition_.prototype.initIE_ = function(\n    range) {\n  this.isValid_ = false;\n\n  if (!range) {\n    return;\n  }\n\n  var ieRange = range.getTextRange(0).getBrowserRangeObject();\n\n  if (!goog.dom.contains(this.field_.getElement(), ieRange.parentElement())) {\n    return;\n  }\n\n  // Create a range that encompasses the contentEditable region to serve\n  // as a reference to form ranges below.\n  var contentEditableRange =\n      this.field_.getEditableDomHelper().getDocument().body.createTextRange();\n  contentEditableRange.moveToElementText(this.field_.getElement());\n\n  // startMarker is a range from the start of the contentEditable node to the\n  // start of the current selection.\n  var startMarker = ieRange.duplicate();\n  startMarker.collapse(true);\n  startMarker.setEndPoint('StartToStart', contentEditableRange);\n  this.startOffset_ =\n      goog.editor.plugins.UndoRedo.CursorPosition_.computeEndOffsetIE_(\n          startMarker);\n\n  // endMarker is a range from the start of the contentEditable node to the\n  // end of the current selection.\n  var endMarker = ieRange.duplicate();\n  endMarker.setEndPoint('StartToStart', contentEditableRange);\n  this.endOffset_ =\n      goog.editor.plugins.UndoRedo.CursorPosition_.computeEndOffsetIE_(\n          endMarker);\n\n  this.isValid_ = true;\n};\n\n\n/**\n * @return {boolean} Whether this object is valid.\n */\ngoog.editor.plugins.UndoRedo.CursorPosition_.prototype.isValid = function() {\n  return this.isValid_;\n};\n\n\n/**\n * @return {string} A string representation of this object.\n * @override\n */\ngoog.editor.plugins.UndoRedo.CursorPosition_.prototype.toString = function() {\n  if (goog.editor.BrowserFeature.HAS_W3C_RANGES) {\n    return 'W3C:' + this.startOffset_.toString() + '\\n' +\n        this.startChildOffset_ + ':' + this.endOffset_.toString() + '\\n' +\n        this.endChildOffset_;\n  }\n  return 'IE:' + this.startOffset_ + ',' + this.endOffset_;\n};\n\n\n/**\n * Makes the browser's selection match the cursor position.\n */\ngoog.editor.plugins.UndoRedo.CursorPosition_.prototype.select = function() {\n  var range = this.getRange_(this.field_.getElement());\n  if (range) {\n    if (goog.editor.BrowserFeature.HAS_IE_RANGES) {\n      this.field_.getElement().focus();\n    }\n    goog.dom.Range.createFromBrowserRange(range).select();\n  }\n};\n\n\n/**\n * Get the range that encompases the the cursor position relative to a given\n * base node.\n * @param {Element} baseNode The node to get the cursor position relative to.\n * @return {Range|TextRange|null} The browser range for this position.\n * @private\n */\ngoog.editor.plugins.UndoRedo.CursorPosition_.prototype.getRange_ = function(\n    baseNode) {\n  if (goog.editor.BrowserFeature.HAS_W3C_RANGES) {\n    var startNode = this.startOffset_.findTargetNode(baseNode);\n    var endNode = this.endOffset_.findTargetNode(baseNode);\n    if (!startNode || !endNode) {\n      return null;\n    }\n\n    // Create range.\n    return /** @type {Range} */ (\n        goog.dom.Range\n            .createFromNodes(\n                startNode, this.startChildOffset_, endNode,\n                this.endChildOffset_)\n            .getBrowserRangeObject());\n  }\n\n  // Create a collapsed selection at the start of the contentEditable region,\n  // which the offsets were calculated relative to before.  Note that we force\n  // a text range here so we can use moveToElementText.\n  var sel = baseNode.ownerDocument.body.createTextRange();\n  sel.moveToElementText(baseNode);\n  sel.collapse(true);\n  sel.moveEnd('character', this.endOffset_);\n  sel.moveStart('character', this.startOffset_);\n  return sel;\n};\n\n\n/**\n * Compute the number of characters to the end of the range in IE.\n * @param {TextRange} range The range to compute an offset for.\n * @return {number} The number of characters to the end of the range.\n * @private\n */\ngoog.editor.plugins.UndoRedo.CursorPosition_.computeEndOffsetIE_ = function(\n    range) {\n  var testRange = range.duplicate();\n\n  // The number of offset characters is a little off depending on\n  // what type of block elements happen to be between the start of the\n  // textedit and the cursor position.  We fudge the offset until the\n  // two ranges match.\n  var text = range.text;\n  var guess = text.length;\n\n  testRange.collapse(true);\n  testRange.moveEnd('character', guess);\n\n  // Adjust the range until the end points match.  This doesn't quite\n  // work if we're at the end of the field so we give up after a few\n  // iterations.\n  var diff;\n  var numTries = 10;\n  while (diff = testRange.compareEndPoints('EndToEnd', range)) {\n    guess -= diff;\n    testRange.moveEnd('character', -diff);\n    --numTries;\n    if (0 == numTries) {\n      break;\n    }\n  }\n  // When we set innerHTML, blank lines become a single space, causing\n  // the cursor position to be off by one.  So we accommodate for blank\n  // lines.\n  var offset = 0;\n  var pos = text.indexOf('\\n\\r');\n  while (pos != -1) {\n    ++offset;\n    pos = text.indexOf('\\n\\r', pos + 1);\n  }\n  return guess + offset;\n};\n","^;",1579837703000,"^<",["^=",["^1>","^1T","^33","^1@","^?","^1A","^42","^18","~$goog.dom.NodeOffset","~$goog.editor.plugins.UndoRedoManager","~$goog.editor.plugins.UndoRedoState","^11","^1G","^1H","^1<"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/undoredo.js"],"^O",["^=",["~$goog.editor.plugins.UndoRedo"]],"^W",true,"^X",["^?","^1>","^;6","^1H","^1@","^33","^1A","^11","^1G","^;7","^;8","^1<","^1T","^18","^42"]],["^ ","^3",[1579837703000],"^4","goog.async.animationdelay.js","^5",["^6","goog/async/animationdelay.js"],"^7","goog/async/animationdelay.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A delayed callback that pegs to the next animation frame\n * instead of a user-configurable timeout.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.provide('goog.async.AnimationDelay');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.events');\ngoog.require('goog.functions');\n\n\n\n// TODO(nicksantos): Should we factor out the common code between this and\n// goog.async.Delay? I'm not sure if there's enough code for this to really\n// make sense. Subclassing seems like the wrong approach for a variety of\n// reasons. Maybe there should be a common interface?\n\n\n\n/**\n * A delayed callback that pegs to the next animation frame\n * instead of a user configurable timeout. By design, this should have\n * the same interface as goog.async.Delay.\n *\n * Uses requestAnimationFrame and friends when available, but falls\n * back to a timeout of goog.async.AnimationDelay.TIMEOUT.\n *\n * For more on requestAnimationFrame and how you can use it to create smoother\n * animations, see:\n * @see http://paulirish.com/2011/requestanimationframe-for-smart-animating/\n *\n * @param {function(this:THIS, number)} listener Function to call\n *     when the delay completes. Will be passed the timestamp when it's called,\n *     in unix ms.\n * @param {Window=} opt_window The window object to execute the delay in.\n *     Defaults to the global object.\n * @param {THIS=} opt_handler The object scope to invoke the function in.\n * @template THIS\n * @constructor\n * @struct\n * @extends {goog.Disposable}\n * @final\n */\ngoog.async.AnimationDelay = function(listener, opt_window, opt_handler) {\n  goog.async.AnimationDelay.base(this, 'constructor');\n\n  /**\n   * Identifier of the active delay timeout, or event listener,\n   * or null when inactive.\n   * @private {?goog.events.Key|number}\n   */\n  this.id_ = null;\n\n  /**\n   * If we're using dom listeners.\n   * @private {?boolean}\n   */\n  this.usingListeners_ = false;\n\n  /**\n   * The function that will be invoked after a delay.\n   * @const\n   * @private\n   */\n  this.listener_ = listener;\n\n  /**\n   * The object context to invoke the callback in.\n   * @const\n   * @private {(THIS|undefined)}\n   */\n  this.handler_ = opt_handler;\n\n  /**\n   * @private {Window}\n   */\n  this.win_ = opt_window || window;\n\n  /**\n   * Cached callback function invoked when the delay finishes.\n   * @private {function()}\n   */\n  this.callback_ = goog.bind(this.doAction_, this);\n};\ngoog.inherits(goog.async.AnimationDelay, goog.Disposable);\n\n\n/**\n * Default wait timeout for animations (in milliseconds).  Only used for timed\n * animation, which uses a timer (setTimeout) to schedule animation.\n *\n * @type {number}\n * @const\n */\ngoog.async.AnimationDelay.TIMEOUT = 20;\n\n\n/**\n * Name of event received from the requestAnimationFrame in Firefox.\n *\n * @type {string}\n * @const\n * @private\n */\ngoog.async.AnimationDelay.MOZ_BEFORE_PAINT_EVENT_ = 'MozBeforePaint';\n\n\n/**\n * Starts the delay timer. The provided listener function will be called\n * before the next animation frame.\n */\ngoog.async.AnimationDelay.prototype.start = function() {\n  this.stop();\n  this.usingListeners_ = false;\n\n  var raf = this.getRaf_();\n  var cancelRaf = this.getCancelRaf_();\n  if (raf && !cancelRaf && this.win_.mozRequestAnimationFrame) {\n    // Because Firefox (Gecko) runs animation in separate threads, it also saves\n    // time by running the requestAnimationFrame callbacks in that same thread.\n    // Sadly this breaks the assumption of implicit thread-safety in JS, and can\n    // thus create thread-based inconsistencies on counters etc.\n    //\n    // Calling cycleAnimations_ using the MozBeforePaint event instead of as\n    // callback fixes this.\n    //\n    // Trigger this condition only if the mozRequestAnimationFrame is available,\n    // but not the W3C requestAnimationFrame function (as in draft) or the\n    // equivalent cancel functions.\n    this.id_ = goog.events.listen(\n        this.win_, goog.async.AnimationDelay.MOZ_BEFORE_PAINT_EVENT_,\n        this.callback_);\n    this.win_.mozRequestAnimationFrame(null);\n    this.usingListeners_ = true;\n  } else if (raf && cancelRaf) {\n    this.id_ = raf.call(this.win_, this.callback_);\n  } else {\n    this.id_ = this.win_.setTimeout(\n        // Prior to Firefox 13, Gecko passed a non-standard parameter\n        // to the callback that we want to ignore.\n        goog.functions.lock(this.callback_), goog.async.AnimationDelay.TIMEOUT);\n  }\n};\n\n\n/**\n * Starts the delay timer if it's not already active.\n */\ngoog.async.AnimationDelay.prototype.startIfNotActive = function() {\n  if (!this.isActive()) {\n    this.start();\n  }\n};\n\n\n/**\n * Stops the delay timer if it is active. No action is taken if the timer is not\n * in use.\n */\ngoog.async.AnimationDelay.prototype.stop = function() {\n  if (this.isActive()) {\n    var raf = this.getRaf_();\n    var cancelRaf = this.getCancelRaf_();\n    if (raf && !cancelRaf && this.win_.mozRequestAnimationFrame) {\n      goog.events.unlistenByKey(this.id_);\n    } else if (raf && cancelRaf) {\n      cancelRaf.call(this.win_, /** @type {number} */ (this.id_));\n    } else {\n      this.win_.clearTimeout(/** @type {number} */ (this.id_));\n    }\n  }\n  this.id_ = null;\n};\n\n\n/**\n * Fires delay's action even if timer has already gone off or has not been\n * started yet; guarantees action firing. Stops the delay timer.\n */\ngoog.async.AnimationDelay.prototype.fire = function() {\n  this.stop();\n  this.doAction_();\n};\n\n\n/**\n * Fires delay's action only if timer is currently active. Stops the delay\n * timer.\n */\ngoog.async.AnimationDelay.prototype.fireIfActive = function() {\n  if (this.isActive()) {\n    this.fire();\n  }\n};\n\n\n/**\n * @return {boolean} True if the delay is currently active, false otherwise.\n */\ngoog.async.AnimationDelay.prototype.isActive = function() {\n  return this.id_ != null;\n};\n\n\n/**\n * Invokes the callback function after the delay successfully completes.\n * @private\n */\ngoog.async.AnimationDelay.prototype.doAction_ = function() {\n  if (this.usingListeners_ && this.id_) {\n    goog.events.unlistenByKey(this.id_);\n  }\n  this.id_ = null;\n\n  // We are not using the timestamp returned by requestAnimationFrame\n  // because it may be either a Date.now-style time or a\n  // high-resolution time (depending on browser implementation). Using\n  // goog.now() will ensure that the timestamp used is consistent and\n  // compatible with goog.fx.Animation.\n  this.listener_.call(this.handler_, goog.now());\n};\n\n\n/** @override */\ngoog.async.AnimationDelay.prototype.disposeInternal = function() {\n  this.stop();\n  goog.async.AnimationDelay.base(this, 'disposeInternal');\n};\n\n\n/**\n * @return {?function(function(number)): number} The requestAnimationFrame\n *     function, or null if not available on this browser.\n * @private\n */\ngoog.async.AnimationDelay.prototype.getRaf_ = function() {\n  var win = this.win_;\n  return win.requestAnimationFrame || win.webkitRequestAnimationFrame ||\n      win.mozRequestAnimationFrame || win.oRequestAnimationFrame ||\n      win.msRequestAnimationFrame || null;\n};\n\n\n/**\n * @return {?function(number): undefined} The cancelAnimationFrame function,\n *     or null if not available on this browser.\n * @private\n */\ngoog.async.AnimationDelay.prototype.getCancelRaf_ = function() {\n  var win = this.win_;\n  return win.cancelAnimationFrame || win.cancelRequestAnimationFrame ||\n      win.webkitCancelRequestAnimationFrame ||\n      win.mozCancelRequestAnimationFrame || win.oCancelRequestAnimationFrame ||\n      win.msCancelRequestAnimationFrame || null;\n};\n","^;",1579837703000,"^<",["^=",["^Y","^?","^1:","^1<"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/async/animationdelay.js"],"^O",["^=",["^5N"]],"^W",true,"^X",["^?","^1:","^1<","^Y"]],["^ ","^3",[1579837703000],"^4","goog.debug.devcss.devcssrunner.js","^5",["^6","goog/debug/devcss/devcssrunner.js"],"^7","goog/debug/devcss/devcssrunner.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Development CSS Compiler runtime execution.\n */\n\ngoog.provide('goog.debug.devCssRunner');\n\ngoog.require('goog.debug.DevCss');\n\n(function() {\n  var devCssInstance = new goog.debug.DevCss();\n  devCssInstance.activateBrowserSpecificCssRules();\n})();\n","^;",1579837703000,"^<",["^=",["^?","~$goog.debug.DevCss"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/devcss/devcssrunner.js"],"^O",["^=",["~$goog.debug.devCssRunner"]],"^W",true,"^X",["^?","^;:"]],["^ ","^3",[1579837703000],"^4","goog.i18n.datetimepatterns.js","^5",["^6","goog/i18n/datetimepatterns.js"],"^7","goog/i18n/datetimepatterns.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Extended date/time patterns.\n *\n * File generated from CLDR ver. 35\n *\n * To reduce the file size (which may cause issues in some JS\n * developing environments), this file will only contain locales\n * that are frequently used by web applications. This is defined as\n * proto/closure_locales_data.txt and will change (most likely addition)\n * over time.  Rest of the data can be found in another file named\n * \"datetimepatternsext.js\", which will be generated at\n * the same time together with this file.\n *\n * @suppress {const}\n */\n\n// clang-format off\n\n/**\n * Only locales that can be enumerated in ICU are supported. For the rest\n * of the locales, it will fallback to 'en'.\n * The code is designed to work with Closure compiler using\n * ADVANCED_OPTIMIZATIONS. We will continue to add popular date/time\n * patterns over time. There is no intention to cover all possible\n * usages. If simple pattern works fine, it won't be covered here either.\n * For example, pattern 'MMM' will work well to get short month name for\n * almost all locales thus won't be included here.\n */\n\n\ngoog.provide('goog.i18n.DateTimePatterns');\ngoog.provide('goog.i18n.DateTimePatterns_af');\ngoog.provide('goog.i18n.DateTimePatterns_am');\ngoog.provide('goog.i18n.DateTimePatterns_ar');\ngoog.provide('goog.i18n.DateTimePatterns_ar_DZ');\ngoog.provide('goog.i18n.DateTimePatterns_ar_EG');\ngoog.provide('goog.i18n.DateTimePatterns_az');\ngoog.provide('goog.i18n.DateTimePatterns_be');\ngoog.provide('goog.i18n.DateTimePatterns_bg');\ngoog.provide('goog.i18n.DateTimePatterns_bn');\ngoog.provide('goog.i18n.DateTimePatterns_br');\ngoog.provide('goog.i18n.DateTimePatterns_bs');\ngoog.provide('goog.i18n.DateTimePatterns_ca');\ngoog.provide('goog.i18n.DateTimePatterns_chr');\ngoog.provide('goog.i18n.DateTimePatterns_cs');\ngoog.provide('goog.i18n.DateTimePatterns_cy');\ngoog.provide('goog.i18n.DateTimePatterns_da');\ngoog.provide('goog.i18n.DateTimePatterns_de');\ngoog.provide('goog.i18n.DateTimePatterns_de_AT');\ngoog.provide('goog.i18n.DateTimePatterns_de_CH');\ngoog.provide('goog.i18n.DateTimePatterns_el');\ngoog.provide('goog.i18n.DateTimePatterns_en');\ngoog.provide('goog.i18n.DateTimePatterns_en_AU');\ngoog.provide('goog.i18n.DateTimePatterns_en_CA');\ngoog.provide('goog.i18n.DateTimePatterns_en_GB');\ngoog.provide('goog.i18n.DateTimePatterns_en_IE');\ngoog.provide('goog.i18n.DateTimePatterns_en_IN');\ngoog.provide('goog.i18n.DateTimePatterns_en_SG');\ngoog.provide('goog.i18n.DateTimePatterns_en_US');\ngoog.provide('goog.i18n.DateTimePatterns_en_ZA');\ngoog.provide('goog.i18n.DateTimePatterns_es');\ngoog.provide('goog.i18n.DateTimePatterns_es_419');\ngoog.provide('goog.i18n.DateTimePatterns_es_ES');\ngoog.provide('goog.i18n.DateTimePatterns_es_MX');\ngoog.provide('goog.i18n.DateTimePatterns_es_US');\ngoog.provide('goog.i18n.DateTimePatterns_et');\ngoog.provide('goog.i18n.DateTimePatterns_eu');\ngoog.provide('goog.i18n.DateTimePatterns_fa');\ngoog.provide('goog.i18n.DateTimePatterns_fi');\ngoog.provide('goog.i18n.DateTimePatterns_fil');\ngoog.provide('goog.i18n.DateTimePatterns_fr');\ngoog.provide('goog.i18n.DateTimePatterns_fr_CA');\ngoog.provide('goog.i18n.DateTimePatterns_ga');\ngoog.provide('goog.i18n.DateTimePatterns_gl');\ngoog.provide('goog.i18n.DateTimePatterns_gsw');\ngoog.provide('goog.i18n.DateTimePatterns_gu');\ngoog.provide('goog.i18n.DateTimePatterns_haw');\ngoog.provide('goog.i18n.DateTimePatterns_he');\ngoog.provide('goog.i18n.DateTimePatterns_hi');\ngoog.provide('goog.i18n.DateTimePatterns_hr');\ngoog.provide('goog.i18n.DateTimePatterns_hu');\ngoog.provide('goog.i18n.DateTimePatterns_hy');\ngoog.provide('goog.i18n.DateTimePatterns_id');\ngoog.provide('goog.i18n.DateTimePatterns_in');\ngoog.provide('goog.i18n.DateTimePatterns_is');\ngoog.provide('goog.i18n.DateTimePatterns_it');\ngoog.provide('goog.i18n.DateTimePatterns_iw');\ngoog.provide('goog.i18n.DateTimePatterns_ja');\ngoog.provide('goog.i18n.DateTimePatterns_ka');\ngoog.provide('goog.i18n.DateTimePatterns_kk');\ngoog.provide('goog.i18n.DateTimePatterns_km');\ngoog.provide('goog.i18n.DateTimePatterns_kn');\ngoog.provide('goog.i18n.DateTimePatterns_ko');\ngoog.provide('goog.i18n.DateTimePatterns_ky');\ngoog.provide('goog.i18n.DateTimePatterns_ln');\ngoog.provide('goog.i18n.DateTimePatterns_lo');\ngoog.provide('goog.i18n.DateTimePatterns_lt');\ngoog.provide('goog.i18n.DateTimePatterns_lv');\ngoog.provide('goog.i18n.DateTimePatterns_mk');\ngoog.provide('goog.i18n.DateTimePatterns_ml');\ngoog.provide('goog.i18n.DateTimePatterns_mn');\ngoog.provide('goog.i18n.DateTimePatterns_mo');\ngoog.provide('goog.i18n.DateTimePatterns_mr');\ngoog.provide('goog.i18n.DateTimePatterns_ms');\ngoog.provide('goog.i18n.DateTimePatterns_mt');\ngoog.provide('goog.i18n.DateTimePatterns_my');\ngoog.provide('goog.i18n.DateTimePatterns_nb');\ngoog.provide('goog.i18n.DateTimePatterns_ne');\ngoog.provide('goog.i18n.DateTimePatterns_nl');\ngoog.provide('goog.i18n.DateTimePatterns_no');\ngoog.provide('goog.i18n.DateTimePatterns_no_NO');\ngoog.provide('goog.i18n.DateTimePatterns_or');\ngoog.provide('goog.i18n.DateTimePatterns_pa');\ngoog.provide('goog.i18n.DateTimePatterns_pl');\ngoog.provide('goog.i18n.DateTimePatterns_pt');\ngoog.provide('goog.i18n.DateTimePatterns_pt_BR');\ngoog.provide('goog.i18n.DateTimePatterns_pt_PT');\ngoog.provide('goog.i18n.DateTimePatterns_ro');\ngoog.provide('goog.i18n.DateTimePatterns_ru');\ngoog.provide('goog.i18n.DateTimePatterns_sh');\ngoog.provide('goog.i18n.DateTimePatterns_si');\ngoog.provide('goog.i18n.DateTimePatterns_sk');\ngoog.provide('goog.i18n.DateTimePatterns_sl');\ngoog.provide('goog.i18n.DateTimePatterns_sq');\ngoog.provide('goog.i18n.DateTimePatterns_sr');\ngoog.provide('goog.i18n.DateTimePatterns_sr_Latn');\ngoog.provide('goog.i18n.DateTimePatterns_sv');\ngoog.provide('goog.i18n.DateTimePatterns_sw');\ngoog.provide('goog.i18n.DateTimePatterns_ta');\ngoog.provide('goog.i18n.DateTimePatterns_te');\ngoog.provide('goog.i18n.DateTimePatterns_th');\ngoog.provide('goog.i18n.DateTimePatterns_tl');\ngoog.provide('goog.i18n.DateTimePatterns_tr');\ngoog.provide('goog.i18n.DateTimePatterns_uk');\ngoog.provide('goog.i18n.DateTimePatterns_ur');\ngoog.provide('goog.i18n.DateTimePatterns_uz');\ngoog.provide('goog.i18n.DateTimePatterns_vi');\ngoog.provide('goog.i18n.DateTimePatterns_zh');\ngoog.provide('goog.i18n.DateTimePatterns_zh_CN');\ngoog.provide('goog.i18n.DateTimePatterns_zh_HK');\ngoog.provide('goog.i18n.DateTimePatterns_zh_TW');\ngoog.provide('goog.i18n.DateTimePatterns_zu');\n\n\n/**\n * Extended set of localized date/time patterns for locale af.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_af = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd-MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale am.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_am = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE፣ MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE፣ MMM d y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ar.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ar = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM‏/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/‏M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE، d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE، d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_DZ.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ar_DZ = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_EG.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ar_EG = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale az.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_az = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd.MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'd MMM, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'd MMM y, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale be.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_be = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y \\'г\\'. G',\n  YEAR_MONTH_ABBR: 'LLL y',\n  YEAR_MONTH_FULL: 'LLLL y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd.M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale bg.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_bg = {\n  YEAR_FULL: 'y \\'г\\'.',\n  YEAR_FULL_WITH_ERA: 'y \\'г\\'. G',\n  YEAR_MONTH_ABBR: 'MM.y \\'г\\'.',\n  YEAR_MONTH_FULL: 'MMMM y \\'г\\'.',\n  YEAR_MONTH_SHORT: 'MM.y \\'г\\'.',\n  MONTH_DAY_ABBR: 'd.MM',\n  MONTH_DAY_FULL: 'd MMMM',\n  MONTH_DAY_SHORT: 'd.MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd.MM.y \\'г\\'.',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d.MM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d.MM.y \\'г\\'.',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd.MM, HH:mm \\'ч\\'. zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale bn.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_bn = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale br.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_br = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale bs.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_bs = {\n  YEAR_FULL: 'y.',\n  YEAR_FULL_WITH_ERA: 'y. G',\n  YEAR_MONTH_ABBR: 'MMM y.',\n  YEAR_MONTH_FULL: 'LLLL y.',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd.M.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y.',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d. MMM y.',\n  DAY_ABBR: 'd.',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM HH:mm (zzzz)'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ca.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ca = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'LLL \\'de\\' y',\n  YEAR_MONTH_FULL: 'LLLL \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale chr.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_chr = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale cs.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_cs = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'LLLL y',\n  YEAR_MONTH_FULL: 'LLLL y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd. M.',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd. M.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. M. y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d. M.',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d. M. y',\n  DAY_ABBR: 'd.',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. M. H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale cy.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_cy = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale da.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_da = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd.M',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d. MMM y',\n  DAY_ABBR: 'd.',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM HH.mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale de.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_de = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd.M.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d. MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale de_AT.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_de_AT = goog.i18n.DateTimePatterns_de;\n\n\n/**\n * Extended set of localized date/time patterns for locale de_CH.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_de_CH = goog.i18n.DateTimePatterns_de;\n\n\n/**\n * Extended set of localized date/time patterns for locale el.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_el = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'LLLL y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_en = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_AU.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_en_AU = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_CA.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_en_CA = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_GB.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_en_GB = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_IE.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_en_IE = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_IN.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_en_IN = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_SG.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_en_SG = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_US.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_en_US = goog.i18n.DateTimePatterns_en;\n\n\n/**\n * Extended set of localized date/time patterns for locale en_ZA.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_en_ZA = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'dd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'MM/dd',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'dd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, dd MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, dd MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'dd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_es = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_419.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_es_419 = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_ES.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_es_ES = goog.i18n.DateTimePatterns_es;\n\n\n/**\n * Extended set of localized date/time patterns for locale es_MX.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_es_MX = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d \\'de\\' MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_US.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_es_US = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d \\'de\\' MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale et.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_et = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd.M',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d. MMMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale eu.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_eu = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y(\\'e\\')\\'ko\\' MMMM',\n  YEAR_MONTH_SHORT: 'y/MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fa.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_fa = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'y/MM',\n  MONTH_DAY_ABBR: 'd LLL',\n  MONTH_DAY_FULL: 'dd LLLL',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'd LLLL',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d LLL',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd LLL،‏ HH:mm (zzzz)'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fi.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_fi = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'LLL y',\n  YEAR_MONTH_FULL: 'LLLL y',\n  YEAR_MONTH_SHORT: 'M.y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd.M.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'ccc d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d. MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM \\'klo\\' H.mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fil.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_fil = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fr.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_fr = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM \\'à\\' HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_CA.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_fr_CA = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'M-d',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH \\'h\\' mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ga.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ga = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale gl.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_gl = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd \\'de\\' MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd/MM/y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d \\'de\\' MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d/MM/y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'HH:mm zzzz, d \\'de\\' MMM'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale gsw.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_gsw = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd.M.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d. MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale gu.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_gu = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale haw.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_haw = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale he.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_he = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'M.y',\n  MONTH_DAY_ABBR: 'd בMMM',\n  MONTH_DAY_FULL: 'dd בMMMM',\n  MONTH_DAY_SHORT: 'd.M',\n  MONTH_DAY_MEDIUM: 'd בMMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd בMMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d בMMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d בMMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd בMMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale hi.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_hi = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale hr.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_hr = {\n  YEAR_FULL: 'y.',\n  YEAR_FULL_WITH_ERA: 'y. G',\n  YEAR_MONTH_ABBR: 'LLL y.',\n  YEAR_MONTH_FULL: 'LLLL y.',\n  YEAR_MONTH_SHORT: 'MM. y.',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'dd. MM.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y.',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d. MMM y.',\n  DAY_ABBR: 'd.',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale hu.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_hu = {\n  YEAR_FULL: 'y.',\n  YEAR_FULL_WITH_ERA: 'G y.',\n  YEAR_MONTH_ABBR: 'y. MMM',\n  YEAR_MONTH_FULL: 'y. MMMM',\n  YEAR_MONTH_SHORT: 'y. MM.',\n  MONTH_DAY_ABBR: 'MMM d.',\n  MONTH_DAY_FULL: 'MMMM dd.',\n  MONTH_DAY_SHORT: 'M. d.',\n  MONTH_DAY_MEDIUM: 'MMMM d.',\n  MONTH_DAY_YEAR_MEDIUM: 'y. MMM d.',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d., EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y. MMM d., EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d. HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale hy.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_hy = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y թ.',\n  YEAR_MONTH_ABBR: 'y թ. LLL',\n  YEAR_MONTH_FULL: 'y թ․ LLLL',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'dd.MM',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y թ.',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'd MMM, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y թ. MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale id.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_id = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH.mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale in.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_in = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH.mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale is.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_is = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM. y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd.M.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d. MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM, zzzz – HH:mm'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale it.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_it = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale iw.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_iw = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'M.y',\n  MONTH_DAY_ABBR: 'd בMMM',\n  MONTH_DAY_FULL: 'dd בMMMM',\n  MONTH_DAY_SHORT: 'd.M',\n  MONTH_DAY_MEDIUM: 'd בMMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd בMMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d בMMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d בMMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd בMMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ja.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ja = {\n  YEAR_FULL: 'y年',\n  YEAR_FULL_WITH_ERA: 'Gy年',\n  YEAR_MONTH_ABBR: 'y年M月',\n  YEAR_MONTH_FULL: 'y年M月',\n  YEAR_MONTH_SHORT: 'y/MM',\n  MONTH_DAY_ABBR: 'M月d日',\n  MONTH_DAY_FULL: 'M月dd日',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'M月d日',\n  MONTH_DAY_YEAR_MEDIUM: 'y年M月d日',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'M月d日(EEE)',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y年M月d日(EEE)',\n  DAY_ABBR: 'd日',\n  MONTH_DAY_TIME_ZONE_SHORT: 'M月d日 H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ka.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ka = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM. y',\n  YEAR_MONTH_FULL: 'MMMM, y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd.M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM. y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM. y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale kk.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_kk = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y \\'ж\\'.',\n  YEAR_MONTH_ABBR: 'y \\'ж\\'. MMM',\n  YEAR_MONTH_FULL: 'y \\'ж\\'. MMMM',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd.MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'y \\'ж\\'. d MMM',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'd MMM, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y \\'ж\\'. d MMM, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale km.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_km = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale kn.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_kn = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d,y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ko.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ko = {\n  YEAR_FULL: 'y년',\n  YEAR_FULL_WITH_ERA: 'G y년',\n  YEAR_MONTH_ABBR: 'y년 MMM',\n  YEAR_MONTH_FULL: 'y년 MMMM',\n  YEAR_MONTH_SHORT: 'y. M.',\n  MONTH_DAY_ABBR: 'MMM d일',\n  MONTH_DAY_FULL: 'MMMM dd일',\n  MONTH_DAY_SHORT: 'M. d.',\n  MONTH_DAY_MEDIUM: 'MMMM d일',\n  MONTH_DAY_YEAR_MEDIUM: 'y년 MMM d일',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d일 (EEE)',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y년 MMM d일 (EEE)',\n  DAY_ABBR: 'd일',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d일 a h:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ky.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ky = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y-\\'ж\\'.',\n  YEAR_MONTH_ABBR: 'y-\\'ж\\'. MMM',\n  YEAR_MONTH_FULL: 'y-\\'ж\\'., MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'd-MMM',\n  MONTH_DAY_FULL: 'dd-MMMM',\n  MONTH_DAY_SHORT: 'dd-MM',\n  MONTH_DAY_MEDIUM: 'd-MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'y-\\'ж\\'. d-MMM',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'd-MMM, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y-\\'ж\\'. d-MMM, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd-MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ln.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ln = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale lo.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_lo = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale lt.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_lt = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y \\'m\\'. G',\n  YEAR_MONTH_ABBR: 'y-MM',\n  YEAR_MONTH_FULL: 'y \\'m\\'. LLLL',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MM-dd',\n  MONTH_DAY_FULL: 'MMMM dd \\'d\\'.',\n  MONTH_DAY_SHORT: 'MM-d',\n  MONTH_DAY_MEDIUM: 'MMMM d \\'d\\'.',\n  MONTH_DAY_YEAR_MEDIUM: 'y-MM-dd',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MM-dd, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y-MM-dd, EEE',\n  DAY_ABBR: 'dd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MM-dd HH:mm; zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale lv.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_lv = {\n  YEAR_FULL: 'y. \\'g\\'.',\n  YEAR_FULL_WITH_ERA: 'G y. \\'g\\'.',\n  YEAR_MONTH_ABBR: 'y. \\'g\\'. MMM',\n  YEAR_MONTH_FULL: 'y. \\'g\\'. MMMM',\n  YEAR_MONTH_SHORT: 'MM.y.',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'dd.MM.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'y. \\'g\\'. d. MMM',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, y. \\'g\\'. d. MMM',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale mk.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_mk = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y \\'г\\'.',\n  YEAR_MONTH_FULL: 'MMMM y \\'г\\'.',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd.M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y \\'г\\'.',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y \\'г\\'.',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ml.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ml = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale mn.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_mn = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y \\'оны\\' MMM',\n  YEAR_MONTH_FULL: 'y \\'оны\\' MMMM',\n  YEAR_MONTH_SHORT: 'y MMMMM',\n  MONTH_DAY_ABBR: 'MMM\\'ын\\' d',\n  MONTH_DAY_FULL: 'MMMM\\'ын\\' dd',\n  MONTH_DAY_SHORT: 'MMMMM/dd',\n  MONTH_DAY_MEDIUM: 'MMMM\\'ын\\' d',\n  MONTH_DAY_YEAR_MEDIUM: 'y \\'оны\\' MMM\\'ын\\' d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM\\'ын\\' d. EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y \\'оны\\' MMM\\'ын\\' d. EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM\\'ын\\' d HH:mm (zzzz)'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale mo.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_mo = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd.MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale mr.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_mr = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d, MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ms.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ms = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd-M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale mt.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_mt = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'dd \\'ta\\'’ MMMM',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'd \\'ta\\'’ MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'ta\\'’ MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d \\'ta\\'’ MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'ta\\'’ MMM, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale my.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_my = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y၊ MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d၊ EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y၊ MMM d၊ EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM zzzz HH:mm'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale nb.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_nb = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd.M.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d. MMM y',\n  DAY_ABBR: 'd.',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ne.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ne = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale nl.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_nl = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd-M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale no.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_no = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd.M.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d. MMM y',\n  DAY_ABBR: 'd.',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale no_NO.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_no_NO = goog.i18n.DateTimePatterns_no;\n\n\n/**\n * Extended set of localized date/time patterns for locale or.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_or = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pa.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_pa = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pl.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_pl = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'LLL y',\n  YEAR_MONTH_FULL: 'LLLL y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd.MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pt.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_pt = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd \\'de\\' MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d \\'de\\' MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd \\'de\\' MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pt_BR.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_pt_BR = goog.i18n.DateTimePatterns_pt;\n\n\n/**\n * Extended set of localized date/time patterns for locale pt_PT.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_pt_PT = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MM/y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd/MM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd/MM/y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d/MM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d/MM/y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd/MM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ro.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ro = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd.MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ru.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ru = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y \\'г\\'. G',\n  YEAR_MONTH_ABBR: 'LLL y \\'г\\'.',\n  YEAR_MONTH_FULL: 'LLLL y \\'г\\'.',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd.MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y \\'г\\'.',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'ccc, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y \\'г\\'.',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale sh.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_sh = {\n  YEAR_FULL: 'y.',\n  YEAR_FULL_WITH_ERA: 'y. G',\n  YEAR_MONTH_ABBR: 'MMM y.',\n  YEAR_MONTH_FULL: 'MMMM y.',\n  YEAR_MONTH_SHORT: 'MM.y.',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd.M.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y.',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d. MMM y.',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale si.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_si = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M-d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH.mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale sk.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_sk = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'M/y',\n  YEAR_MONTH_FULL: 'LLLL y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd. M.',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd. M.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. M. y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d. M.',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d. M. y',\n  DAY_ABBR: 'd.',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. M., H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale sl.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_sl = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd. M.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d. MMM y',\n  DAY_ABBR: 'd.',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale sq.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_sq = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd.M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a, zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale sr.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_sr = {\n  YEAR_FULL: 'y.',\n  YEAR_FULL_WITH_ERA: 'y. G',\n  YEAR_MONTH_ABBR: 'MMM y.',\n  YEAR_MONTH_FULL: 'MMMM y.',\n  YEAR_MONTH_SHORT: 'MM.y.',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd.M.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y.',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d. MMM y.',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale sr_Latn.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_sr_Latn = goog.i18n.DateTimePatterns_sr;\n\n\n/**\n * Extended set of localized date/time patterns for locale sv.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_sv = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale sw.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_sw = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ta.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ta = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d, a h:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale te.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_te = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd, MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'd MMM, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'd MMM, y, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale th.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_th = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM G y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale tl.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_tl = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale tr.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_tr = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'd MMMM EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'd MMM y EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale uk.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_uk = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'LLL y',\n  YEAR_MONTH_FULL: 'LLLL y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd.MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ur.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_ur = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM، y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE، d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE، d MMM، y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale uz.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_uz = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM, y',\n  YEAR_MONTH_FULL: 'MMMM, y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd-MMM',\n  MONTH_DAY_FULL: 'dd-MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd-MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd-MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d-MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d-MMM, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd-MMM, HH:mm (zzzz)'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale vi.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_vi = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM \\'năm\\' y',\n  YEAR_MONTH_SHORT: '\\'tháng\\' MM, y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'HH:mm zzzz, d MMM'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale zh.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_zh = {\n  YEAR_FULL: 'y年',\n  YEAR_FULL_WITH_ERA: 'Gy年',\n  YEAR_MONTH_ABBR: 'y年M月',\n  YEAR_MONTH_FULL: 'y年M月',\n  YEAR_MONTH_SHORT: 'y年M月',\n  MONTH_DAY_ABBR: 'M月d日',\n  MONTH_DAY_FULL: 'M月dd日',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'M月d日',\n  MONTH_DAY_YEAR_MEDIUM: 'y年M月d日',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'M月d日EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y年M月d日EEE',\n  DAY_ABBR: 'd日',\n  MONTH_DAY_TIME_ZONE_SHORT: 'M月d日 zzzz ah:mm'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale zh_CN.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_zh_CN = goog.i18n.DateTimePatterns_zh;\n\n\n/**\n * Extended set of localized date/time patterns for locale zh_HK.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_zh_HK = {\n  YEAR_FULL: 'y年',\n  YEAR_FULL_WITH_ERA: 'Gy年',\n  YEAR_MONTH_ABBR: 'y年M月',\n  YEAR_MONTH_FULL: 'y年M月',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'M月d日',\n  MONTH_DAY_FULL: 'M月dd日',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'M月d日',\n  MONTH_DAY_YEAR_MEDIUM: 'y年M月d日',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'M月d日EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y年M月d日EEE',\n  DAY_ABBR: 'd日',\n  MONTH_DAY_TIME_ZONE_SHORT: 'M月d日 ah:mm [zzzz]'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale zh_TW.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_zh_TW = {\n  YEAR_FULL: 'y年',\n  YEAR_FULL_WITH_ERA: 'Gy年',\n  YEAR_MONTH_ABBR: 'y年M月',\n  YEAR_MONTH_FULL: 'y年M月',\n  YEAR_MONTH_SHORT: 'y/MM',\n  MONTH_DAY_ABBR: 'M月d日',\n  MONTH_DAY_FULL: 'M月dd日',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'M月d日',\n  MONTH_DAY_YEAR_MEDIUM: 'y年M月d日',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'M月d日 EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y年M月d日 EEE',\n  DAY_ABBR: 'd日',\n  MONTH_DAY_TIME_ZONE_SHORT: 'M月d日 ah:mm [zzzz]'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale zu.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns_zu = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * @record\n * @struct\n */\ngoog.i18n.DateTimePatternsType = function() {};\n\n/** @type {string} */\ngoog.i18n.DateTimePatternsType.prototype.YEAR_FULL;\n\n/** @type {string} */\ngoog.i18n.DateTimePatternsType.prototype.YEAR_FULL_WITH_ERA;\n\n/** @type {string} */\ngoog.i18n.DateTimePatternsType.prototype.YEAR_MONTH_ABBR;\n\n/** @type {string} */\ngoog.i18n.DateTimePatternsType.prototype.YEAR_MONTH_FULL;\n\n/** @type {string} */\ngoog.i18n.DateTimePatternsType.prototype.YEAR_MONTH_SHORT;\n\n/** @type {string} */\ngoog.i18n.DateTimePatternsType.prototype.MONTH_DAY_ABBR;\n\n/** @type {string} */\ngoog.i18n.DateTimePatternsType.prototype.MONTH_DAY_FULL;\n\n/** @type {string} */\ngoog.i18n.DateTimePatternsType.prototype.MONTH_DAY_SHORT;\n\n/** @type {string} */\ngoog.i18n.DateTimePatternsType.prototype.MONTH_DAY_MEDIUM;\n\n/** @type {string} */\ngoog.i18n.DateTimePatternsType.prototype.MONTH_DAY_YEAR_MEDIUM;\n\n/** @type {string} */\ngoog.i18n.DateTimePatternsType.prototype.WEEKDAY_MONTH_DAY_MEDIUM;\n\n/** @type {string} */\ngoog.i18n.DateTimePatternsType.prototype.WEEKDAY_MONTH_DAY_YEAR_MEDIUM;\n\n/** @type {string} */\ngoog.i18n.DateTimePatternsType.prototype.DAY_ABBR;\n\n/** @type {string} */\ngoog.i18n.DateTimePatternsType.prototype.MONTH_DAY_TIME_ZONE_SHORT;\n\n\n/**\n * Select date/time pattern by locale.\n * @type {!goog.i18n.DateTimePatternsType}\n */\ngoog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en;\n\nswitch (goog.LOCALE) {\n  case 'af':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_af;\n    break;\n  case 'am':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_am;\n    break;\n  case 'ar':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar;\n    break;\n  case 'ar_DZ':\n  case 'ar-DZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_DZ;\n    break;\n  case 'ar_EG':\n  case 'ar-EG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_EG;\n    break;\n  case 'az':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_az;\n    break;\n  case 'be':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_be;\n    break;\n  case 'bg':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bg;\n    break;\n  case 'bn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bn;\n    break;\n  case 'br':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_br;\n    break;\n  case 'bs':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bs;\n    break;\n  case 'ca':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ca;\n    break;\n  case 'chr':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_chr;\n    break;\n  case 'cs':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_cs;\n    break;\n  case 'cy':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_cy;\n    break;\n  case 'da':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_da;\n    break;\n  case 'de':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_de;\n    break;\n  case 'de_AT':\n  case 'de-AT':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_de_AT;\n    break;\n  case 'de_CH':\n  case 'de-CH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_de_CH;\n    break;\n  case 'el':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_el;\n    break;\n  case 'en':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en;\n    break;\n  case 'en_AU':\n  case 'en-AU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_AU;\n    break;\n  case 'en_CA':\n  case 'en-CA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_CA;\n    break;\n  case 'en_GB':\n  case 'en-GB':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_GB;\n    break;\n  case 'en_IE':\n  case 'en-IE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_IE;\n    break;\n  case 'en_IN':\n  case 'en-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_IN;\n    break;\n  case 'en_SG':\n  case 'en-SG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_SG;\n    break;\n  case 'en_US':\n  case 'en-US':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_US;\n    break;\n  case 'en_ZA':\n  case 'en-ZA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_ZA;\n    break;\n  case 'es':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es;\n    break;\n  case 'es_419':\n  case 'es-419':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_419;\n    break;\n  case 'es_ES':\n  case 'es-ES':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_ES;\n    break;\n  case 'es_MX':\n  case 'es-MX':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_MX;\n    break;\n  case 'es_US':\n  case 'es-US':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_US;\n    break;\n  case 'et':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_et;\n    break;\n  case 'eu':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_eu;\n    break;\n  case 'fa':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fa;\n    break;\n  case 'fi':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fi;\n    break;\n  case 'fil':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fil;\n    break;\n  case 'fr':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr;\n    break;\n  case 'fr_CA':\n  case 'fr-CA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_CA;\n    break;\n  case 'ga':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ga;\n    break;\n  case 'gl':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_gl;\n    break;\n  case 'gsw':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_gsw;\n    break;\n  case 'gu':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_gu;\n    break;\n  case 'haw':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_haw;\n    break;\n  case 'he':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_he;\n    break;\n  case 'hi':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_hi;\n    break;\n  case 'hr':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_hr;\n    break;\n  case 'hu':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_hu;\n    break;\n  case 'hy':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_hy;\n    break;\n  case 'id':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_id;\n    break;\n  case 'in':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_in;\n    break;\n  case 'is':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_is;\n    break;\n  case 'it':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_it;\n    break;\n  case 'iw':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_iw;\n    break;\n  case 'ja':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ja;\n    break;\n  case 'ka':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ka;\n    break;\n  case 'kk':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kk;\n    break;\n  case 'km':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_km;\n    break;\n  case 'kn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kn;\n    break;\n  case 'ko':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ko;\n    break;\n  case 'ky':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ky;\n    break;\n  case 'ln':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ln;\n    break;\n  case 'lo':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lo;\n    break;\n  case 'lt':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lt;\n    break;\n  case 'lv':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lv;\n    break;\n  case 'mk':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mk;\n    break;\n  case 'ml':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ml;\n    break;\n  case 'mn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mn;\n    break;\n  case 'mo':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mo;\n    break;\n  case 'mr':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mr;\n    break;\n  case 'ms':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ms;\n    break;\n  case 'mt':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mt;\n    break;\n  case 'my':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_my;\n    break;\n  case 'nb':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nb;\n    break;\n  case 'ne':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ne;\n    break;\n  case 'nl':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nl;\n    break;\n  case 'no':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_no;\n    break;\n  case 'no_NO':\n  case 'no-NO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_no_NO;\n    break;\n  case 'or':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_or;\n    break;\n  case 'pa':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pa;\n    break;\n  case 'pl':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pl;\n    break;\n  case 'pt':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pt;\n    break;\n  case 'pt_BR':\n  case 'pt-BR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pt_BR;\n    break;\n  case 'pt_PT':\n  case 'pt-PT':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pt_PT;\n    break;\n  case 'ro':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ro;\n    break;\n  case 'ru':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ru;\n    break;\n  case 'sh':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sh;\n    break;\n  case 'si':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_si;\n    break;\n  case 'sk':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sk;\n    break;\n  case 'sl':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sl;\n    break;\n  case 'sq':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sq;\n    break;\n  case 'sr':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sr;\n    break;\n  case 'sr_Latn':\n  case 'sr-Latn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sr_Latn;\n    break;\n  case 'sv':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sv;\n    break;\n  case 'sw':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sw;\n    break;\n  case 'ta':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ta;\n    break;\n  case 'te':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_te;\n    break;\n  case 'th':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_th;\n    break;\n  case 'tl':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_tl;\n    break;\n  case 'tr':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_tr;\n    break;\n  case 'uk':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_uk;\n    break;\n  case 'ur':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ur;\n    break;\n  case 'uz':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_uz;\n    break;\n  case 'vi':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_vi;\n    break;\n  case 'zh':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zh;\n    break;\n  case 'zh_CN':\n  case 'zh-CN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zh_CN;\n    break;\n  case 'zh_HK':\n  case 'zh-HK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zh_HK;\n    break;\n  case 'zh_TW':\n  case 'zh-TW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zh_TW;\n    break;\n  case 'zu':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zu;\n    break;\n}\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/datetimepatterns.js"],"^O",["^=",["~$goog.i18n.DateTimePatterns_am","~$goog.i18n.DateTimePatterns_es_ES","~$goog.i18n.DateTimePatterns_ca","~$goog.i18n.DateTimePatterns_en_IN","~$goog.i18n.DateTimePatterns_chr","~$goog.i18n.DateTimePatterns_en_GB","~$goog.i18n.DateTimePatterns_lt","~$goog.i18n.DateTimePatterns_vi","~$goog.i18n.DateTimePatterns-si","~$goog.i18n.DateTimePatterns-br","~$goog.i18n.DateTimePatterns_es_US","~$goog.i18n.DateTimePatterns-bg","~$goog.i18n.DateTimePatterns-sl","~$goog.i18n.DateTimePatterns_tr","~$goog.i18n.DateTimePatterns-mk","~$goog.i18n.DateTimePatterns_ne","~$goog.i18n.DateTimePatterns-tr","~$goog.i18n.DateTimePatterns-fr-CA","~$goog.i18n.DateTimePatterns_en","~$goog.i18n.DateTimePatterns-cy","~$goog.i18n.DateTimePatterns_az","~$goog.i18n.DateTimePatterns_ro","~$goog.i18n.DateTimePatterns-en","~$goog.i18n.DateTimePatterns_id","~$goog.i18n.DateTimePatterns_mo","~$goog.i18n.DateTimePatterns-tl","~$goog.i18n.DateTimePatterns_hy","~$goog.i18n.DateTimePatterns_ln","~$goog.i18n.DateTimePatterns-ln","~$goog.i18n.DateTimePatterns-en-SG","~$goog.i18n.DateTimePatterns_uz","~$goog.i18n.DateTimePatterns_af","~$goog.i18n.DateTimePatterns_fr_CA","~$goog.i18n.DateTimePatterns-de-CH","~$goog.i18n.DateTimePatterns_sw","~$goog.i18n.DateTimePatterns-sw","~$goog.i18n.DateTimePatterns_zh","~$goog.i18n.DateTimePatterns_en_ZA","~$goog.i18n.DateTimePatterns-gsw","~$goog.i18n.DateTimePatterns_iw","~$goog.i18n.DateTimePatterns_ky","~$goog.i18n.DateTimePatterns_ko","~$goog.i18n.DateTimePatterns_sv","~$goog.i18n.DateTimePatterns-ka","~$goog.i18n.DateTimePatterns-is","~$goog.i18n.DateTimePatterns-ta","~$goog.i18n.DateTimePatterns_zu","~$goog.i18n.DateTimePatterns_de","~$goog.i18n.DateTimePatterns-el","~$goog.i18n.DateTimePatterns-pt","~$goog.i18n.DateTimePatterns-de","~$goog.i18n.DateTimePatterns_gl","~$goog.i18n.DateTimePatterns_es","~$goog.i18n.DateTimePatterns_ar","~$goog.i18n.DateTimePatterns_kk","~$goog.i18n.DateTimePatterns_bs","~$goog.i18n.DateTimePatterns_en_CA","~$goog.i18n.DateTimePatterns-bs","~$goog.i18n.DateTimePatterns-sh","~$goog.i18n.DateTimePatterns-es","~$goog.i18n.DateTimePatterns_kn","~$goog.i18n.DateTimePatterns_pt_BR","~$goog.i18n.DateTimePatterns-cs","~$goog.i18n.DateTimePatterns-es-419","~$goog.i18n.DateTimePatterns_ml","~$goog.i18n.DateTimePatterns_sk","~$goog.i18n.DateTimePatterns_zh_HK","~$goog.i18n.DateTimePatterns_ta","~$goog.i18n.DateTimePatterns-fr","~$goog.i18n.DateTimePatterns-haw","~$goog.i18n.DateTimePatterns-chr","~$goog.i18n.DateTimePatterns_gsw","~$goog.i18n.DateTimePatterns_br","~$goog.i18n.DateTimePatterns_in","~$goog.i18n.DateTimePatterns-fa","~$goog.i18n.DateTimePatterns-sr","~$goog.i18n.DateTimePatterns-hu","~$goog.i18n.DateTimePatterns-mt","~$goog.i18n.DateTimePatterns-kk","~$goog.i18n.DateTimePatterns-en-US","~$goog.i18n.DateTimePatterns-de-AT","~$goog.i18n.DateTimePatterns-no","~$goog.i18n.DateTimePatterns_de_CH","~$goog.i18n.DateTimePatterns-hy","~$goog.i18n.DateTimePatterns_eu","~$goog.i18n.DateTimePatterns_pt","~$goog.i18n.DateTimePatterns-iw","~$goog.i18n.DateTimePatterns-my","~$goog.i18n.DateTimePatterns_pa","~$goog.i18n.DateTimePatterns_fi","~$goog.i18n.DateTimePatterns-zh-CN","~$goog.i18n.DateTimePatterns_nb","~$goog.i18n.DateTimePatterns-ne","~$goog.i18n.DateTimePatterns_haw","~$goog.i18n.DateTimePatterns-sk","~$goog.i18n.DateTimePatterns_mk","~$goog.i18n.DateTimePatterns_my","~$goog.i18n.DateTimePatterns_km","~$goog.i18n.DateTimePatterns-en-IN","~$goog.i18n.DateTimePatterns_sl","~$goog.i18n.DateTimePatterns_sr","~$goog.i18n.DateTimePatterns-ar-DZ","~$goog.i18n.DateTimePatterns_it","~$goog.i18n.DateTimePatterns-lv","~$goog.i18n.DateTimePatterns-ko","~$goog.i18n.DateTimePatterns-en-IE","~$goog.i18n.DateTimePatterns-be","~$goog.i18n.DateTimePatterns-en-CA","~$goog.i18n.DateTimePatterns-es-US","~$goog.i18n.DateTimePatterns_fa","~$goog.i18n.DateTimePatterns_da","~$goog.i18n.DateTimePatterns-zu","~$goog.i18n.DateTimePatterns_et","~$goog.i18n.DateTimePatterns_he","~$goog.i18n.DateTimePatterns_lo","~$goog.i18n.DateTimePatterns_en_AU","~$goog.i18n.DateTimePatterns-en-ZA","~$goog.i18n.DateTimePatterns","~$goog.i18n.DateTimePatterns-ar","~$goog.i18n.DateTimePatterns_ka","~$goog.i18n.DateTimePatterns-mr","~$goog.i18n.DateTimePatterns-en-GB","~$goog.i18n.DateTimePatterns-hi","~$goog.i18n.DateTimePatterns-mn","~$goog.i18n.DateTimePatterns-km","~$goog.i18n.DateTimePatterns-or","~$goog.i18n.DateTimePatterns_bn","~$goog.i18n.DateTimePatterns_es_MX","~$goog.i18n.DateTimePatterns-az","~$goog.i18n.DateTimePatterns-pt-PT","~$goog.i18n.DateTimePatterns-sv","~$goog.i18n.DateTimePatterns-mo","~$goog.i18n.DateTimePatterns-pl","~$goog.i18n.DateTimePatterns-vi","~$goog.i18n.DateTimePatterns_zh_TW","~$goog.i18n.DateTimePatterns-te","~$goog.i18n.DateTimePatterns-gl","~$goog.i18n.DateTimePatterns-zh-HK","~$goog.i18n.DateTimePatterns_or","~$goog.i18n.DateTimePatterns_cy","~$goog.i18n.DateTimePatterns-ga","~$goog.i18n.DateTimePatterns_zh_CN","~$goog.i18n.DateTimePatterns_bg","~$goog.i18n.DateTimePatterns_no","~$goog.i18n.DateTimePatterns_mn","~$goog.i18n.DateTimePatterns-gu","~$goog.i18n.DateTimePatterns-no-NO","~$goog.i18n.DateTimePatterns-ru","~$goog.i18n.DateTimePatterns_ja","~$goog.i18n.DateTimePatterns-bn","~$goog.i18n.DateTimePatterns-sr-Latn","~$goog.i18n.DateTimePatterns_sh","~$goog.i18n.DateTimePatterns-kn","~$goog.i18n.DateTimePatterns_tl","~$goog.i18n.DateTimePatterns-zh","~$goog.i18n.DateTimePatterns_be","~$goog.i18n.DateTimePatterns_mr","~$goog.i18n.DateTimePatterns_ar_EG","~$goog.i18n.DateTimePatterns_en_IE","~$goog.i18n.DateTimePatterns-ro","~$goog.i18n.DateTimePatterns-ur","~$goog.i18n.DateTimePatterns_nl","~$goog.i18n.DateTimePatterns-ar-EG","~$goog.i18n.DateTimePatterns_de_AT","~$goog.i18n.DateTimePatterns-it","~$goog.i18n.DateTimePatterns_fr","~$goog.i18n.DateTimePatterns-fi","~$goog.i18n.DateTimePatterns_te","~$goog.i18n.DateTimePatterns_en_SG","~$goog.i18n.DateTimePatterns-es-MX","~$goog.i18n.DateTimePatterns_ga","~$goog.i18n.DateTimePatterns-zh-TW","~$goog.i18n.DateTimePatterns-es-ES","~$goog.i18n.DateTimePatterns_cs","~$goog.i18n.DateTimePatterns_es_419","~$goog.i18n.DateTimePatterns_no_NO","~$goog.i18n.DateTimePatterns-ja","~$goog.i18n.DateTimePatterns-ml","~$goog.i18n.DateTimePatterns-en-AU","~$goog.i18n.DateTimePatterns-ky","~$goog.i18n.DateTimePatterns_pt_PT","~$goog.i18n.DateTimePatterns_ru","~$goog.i18n.DateTimePatterns_en_US","~$goog.i18n.DateTimePatterns-uk","~$goog.i18n.DateTimePatterns_lv","~$goog.i18n.DateTimePatterns-nb","~$goog.i18n.DateTimePatterns-id","~$goog.i18n.DateTimePatterns-et","~$goog.i18n.DateTimePatterns-hr","~$goog.i18n.DateTimePatterns_el","~$goog.i18n.DateTimePatterns-fil","~$goog.i18n.DateTimePatterns-ca","~$goog.i18n.DateTimePatterns-af","~$goog.i18n.DateTimePatterns_sr_Latn","~$goog.i18n.DateTimePatterns-am","~$goog.i18n.DateTimePatterns_hr","~$goog.i18n.DateTimePatterns_is","~$goog.i18n.DateTimePatterns-he","~$goog.i18n.DateTimePatterns-da","~$goog.i18n.DateTimePatterns_si","~$goog.i18n.DateTimePatterns_gu","~$goog.i18n.DateTimePatterns-nl","~$goog.i18n.DateTimePatterns_pl","~$goog.i18n.DateTimePatterns_sq","~$goog.i18n.DateTimePatterns_th","~$goog.i18n.DateTimePatterns-lo","~$goog.i18n.DateTimePatterns-uz","~$goog.i18n.DateTimePatterns_fil","~$goog.i18n.DateTimePatterns-sq","~$goog.i18n.DateTimePatterns-pa","~$goog.i18n.DateTimePatterns_ar_DZ","~$goog.i18n.DateTimePatterns_mt","~$goog.i18n.DateTimePatterns_uk","~$goog.i18n.DateTimePatterns_hi","~$goog.i18n.DateTimePatterns-in","~$goog.i18n.DateTimePatterns_ur","~$goog.i18n.DateTimePatterns-ms","~$goog.i18n.DateTimePatterns-pt-BR","~$goog.i18n.DateTimePatterns-eu","~$goog.i18n.DateTimePatterns-lt","~$goog.i18n.DateTimePatterns_hu","~$goog.i18n.DateTimePatterns_ms","~$goog.i18n.DateTimePatterns-th"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.ui.menuheaderrenderer.js","^5",["^6","goog/ui/menuheaderrenderer.js"],"^7","goog/ui/menuheaderrenderer.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for {@link goog.ui.MenuHeader}s.\n *\n */\n\ngoog.provide('goog.ui.MenuHeaderRenderer');\n\ngoog.require('goog.ui.ControlRenderer');\n\n\n\n/**\n * Renderer for menu headers.\n * @constructor\n * @extends {goog.ui.ControlRenderer}\n */\ngoog.ui.MenuHeaderRenderer = function() {\n  goog.ui.ControlRenderer.call(this);\n};\ngoog.inherits(goog.ui.MenuHeaderRenderer, goog.ui.ControlRenderer);\ngoog.addSingletonGetter(goog.ui.MenuHeaderRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.MenuHeaderRenderer.CSS_CLASS = goog.getCssName('goog-menuheader');\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.MenuHeaderRenderer.prototype.getCssClass = function() {\n  return goog.ui.MenuHeaderRenderer.CSS_CLASS;\n};\n","^;",1579837703000,"^<",["^=",["^?","^5B"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/menuheaderrenderer.js"],"^O",["^=",["~$goog.ui.MenuHeaderRenderer"]],"^W",true,"^X",["^?","^5B"]],["^ ","^3",[1579837703000],"^4","goog.math.rect.js","^5",["^6","goog/math/rect.js"],"^7","goog/math/rect.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A utility class for representing rectangles. Some of these\n * functions should be migrated over to non-nullable params.\n */\n\ngoog.provide('goog.math.Rect');\n\ngoog.require('goog.asserts');\ngoog.require('goog.math.Box');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.math.IRect');\ngoog.require('goog.math.Size');\n\n\n\n/**\n * Class for representing rectangular regions.\n * @param {number} x Left.\n * @param {number} y Top.\n * @param {number} w Width.\n * @param {number} h Height.\n * @struct\n * @constructor\n * @implements {goog.math.IRect}\n */\ngoog.math.Rect = function(x, y, w, h) {\n  /** @type {number} */\n  this.left = x;\n\n  /** @type {number} */\n  this.top = y;\n\n  /** @type {number} */\n  this.width = w;\n\n  /** @type {number} */\n  this.height = h;\n};\n\n\n/**\n * @return {!goog.math.Rect} A new copy of this Rectangle.\n */\ngoog.math.Rect.prototype.clone = function() {\n  return new goog.math.Rect(this.left, this.top, this.width, this.height);\n};\n\n\n/**\n * Returns a new Box object with the same position and dimensions as this\n * rectangle.\n * @return {!goog.math.Box} A new Box representation of this Rectangle.\n */\ngoog.math.Rect.prototype.toBox = function() {\n  var right = this.left + this.width;\n  var bottom = this.top + this.height;\n  return new goog.math.Box(this.top, right, bottom, this.left);\n};\n\n\n/**\n * Creates a new Rect object with the position and size given.\n * @param {!goog.math.Coordinate} position The top-left coordinate of the Rect\n * @param {!goog.math.Size} size The size of the Rect\n * @return {!goog.math.Rect} A new Rect initialized with the given position and\n *     size.\n */\ngoog.math.Rect.createFromPositionAndSize = function(position, size) {\n  return new goog.math.Rect(position.x, position.y, size.width, size.height);\n};\n\n\n/**\n * Creates a new Rect object with the same position and dimensions as a given\n * Box.  Note that this is only the inverse of toBox if left/top are defined.\n * @param {goog.math.Box} box A box.\n * @return {!goog.math.Rect} A new Rect initialized with the box's position\n *     and size.\n */\ngoog.math.Rect.createFromBox = function(box) {\n  return new goog.math.Rect(\n      box.left, box.top, box.right - box.left, box.bottom - box.top);\n};\n\n\nif (goog.DEBUG) {\n  /**\n   * Returns a nice string representing size and dimensions of rectangle.\n   * @return {string} In the form (50, 73 - 75w x 25h).\n   * @override\n   */\n  goog.math.Rect.prototype.toString = function() {\n    return '(' + this.left + ', ' + this.top + ' - ' + this.width + 'w x ' +\n        this.height + 'h)';\n  };\n}\n\n\n/**\n * Compares rectangles for equality.\n * @param {goog.math.IRect} a A Rectangle.\n * @param {goog.math.IRect} b A Rectangle.\n * @return {boolean} True iff the rectangles have the same left, top, width,\n *     and height, or if both are null.\n */\ngoog.math.Rect.equals = function(a, b) {\n  if (a == b) {\n    return true;\n  }\n  if (!a || !b) {\n    return false;\n  }\n  return a.left == b.left && a.width == b.width && a.top == b.top &&\n      a.height == b.height;\n};\n\n\n/**\n * Computes the intersection of this rectangle and the rectangle parameter.  If\n * there is no intersection, returns false and leaves this rectangle as is.\n * @param {goog.math.IRect} rect A Rectangle.\n * @return {boolean} True iff this rectangle intersects with the parameter.\n */\ngoog.math.Rect.prototype.intersection = function(rect) {\n  var x0 = Math.max(this.left, rect.left);\n  var x1 = Math.min(this.left + this.width, rect.left + rect.width);\n\n  if (x0 <= x1) {\n    var y0 = Math.max(this.top, rect.top);\n    var y1 = Math.min(this.top + this.height, rect.top + rect.height);\n\n    if (y0 <= y1) {\n      this.left = x0;\n      this.top = y0;\n      this.width = x1 - x0;\n      this.height = y1 - y0;\n\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Returns the intersection of two rectangles. Two rectangles intersect if they\n * touch at all, for example, two zero width and height rectangles would\n * intersect if they had the same top and left.\n * @param {goog.math.IRect} a A Rectangle.\n * @param {goog.math.IRect} b A Rectangle.\n * @return {goog.math.Rect} A new intersection rect (even if width and height\n *     are 0), or null if there is no intersection.\n */\ngoog.math.Rect.intersection = function(a, b) {\n  // There is no nice way to do intersection via a clone, because any such\n  // clone might be unnecessary if this function returns null.  So, we duplicate\n  // code from above.\n\n  var x0 = Math.max(a.left, b.left);\n  var x1 = Math.min(a.left + a.width, b.left + b.width);\n\n  if (x0 <= x1) {\n    var y0 = Math.max(a.top, b.top);\n    var y1 = Math.min(a.top + a.height, b.top + b.height);\n\n    if (y0 <= y1) {\n      return new goog.math.Rect(x0, y0, x1 - x0, y1 - y0);\n    }\n  }\n  return null;\n};\n\n\n/**\n * Returns whether two rectangles intersect. Two rectangles intersect if they\n * touch at all, for example, two zero width and height rectangles would\n * intersect if they had the same top and left.\n * @param {goog.math.IRect} a A Rectangle.\n * @param {goog.math.IRect} b A Rectangle.\n * @return {boolean} Whether a and b intersect.\n */\ngoog.math.Rect.intersects = function(a, b) {\n  return (\n      a.left <= b.left + b.width && b.left <= a.left + a.width &&\n      a.top <= b.top + b.height && b.top <= a.top + a.height);\n};\n\n\n/**\n * Returns whether a rectangle intersects this rectangle.\n * @param {goog.math.IRect} rect A rectangle.\n * @return {boolean} Whether rect intersects this rectangle.\n */\ngoog.math.Rect.prototype.intersects = function(rect) {\n  return goog.math.Rect.intersects(this, rect);\n};\n\n\n/**\n * Computes the difference regions between two rectangles. The return value is\n * an array of 0 to 4 rectangles defining the remaining regions of the first\n * rectangle after the second has been subtracted.\n * @param {goog.math.Rect} a A Rectangle.\n * @param {goog.math.IRect} b A Rectangle.\n * @return {!Array<!goog.math.Rect>} An array with 0 to 4 rectangles which\n *     together define the difference area of rectangle a minus rectangle b.\n */\ngoog.math.Rect.difference = function(a, b) {\n  var intersection = goog.math.Rect.intersection(a, b);\n  if (!intersection || !intersection.height || !intersection.width) {\n    return [a.clone()];\n  }\n\n  var result = [];\n\n  var top = a.top;\n  var height = a.height;\n\n  var ar = a.left + a.width;\n  var ab = a.top + a.height;\n\n  var br = b.left + b.width;\n  var bb = b.top + b.height;\n\n  // Subtract off any area on top where A extends past B\n  if (b.top > a.top) {\n    result.push(new goog.math.Rect(a.left, a.top, a.width, b.top - a.top));\n    top = b.top;\n    // If we're moving the top down, we also need to subtract the height diff.\n    height -= b.top - a.top;\n  }\n  // Subtract off any area on bottom where A extends past B\n  if (bb < ab) {\n    result.push(new goog.math.Rect(a.left, bb, a.width, ab - bb));\n    height = bb - top;\n  }\n  // Subtract any area on left where A extends past B\n  if (b.left > a.left) {\n    result.push(new goog.math.Rect(a.left, top, b.left - a.left, height));\n  }\n  // Subtract any area on right where A extends past B\n  if (br < ar) {\n    result.push(new goog.math.Rect(br, top, ar - br, height));\n  }\n\n  return result;\n};\n\n\n/**\n * Computes the difference regions between this rectangle and `rect`. The\n * return value is an array of 0 to 4 rectangles defining the remaining regions\n * of this rectangle after the other has been subtracted.\n * @param {goog.math.IRect} rect A Rectangle.\n * @return {!Array<!goog.math.Rect>} An array with 0 to 4 rectangles which\n *     together define the difference area of rectangle a minus rectangle b.\n */\ngoog.math.Rect.prototype.difference = function(rect) {\n  return goog.math.Rect.difference(this, rect);\n};\n\n\n/**\n * Expand this rectangle to also include the area of the given rectangle.\n * @param {goog.math.IRect} rect The other rectangle.\n */\ngoog.math.Rect.prototype.boundingRect = function(rect) {\n  // We compute right and bottom before we change left and top below.\n  var right = Math.max(this.left + this.width, rect.left + rect.width);\n  var bottom = Math.max(this.top + this.height, rect.top + rect.height);\n\n  this.left = Math.min(this.left, rect.left);\n  this.top = Math.min(this.top, rect.top);\n\n  this.width = right - this.left;\n  this.height = bottom - this.top;\n};\n\n\n/**\n * Returns a new rectangle which completely contains both input rectangles.\n * @param {goog.math.IRect} a A rectangle.\n * @param {goog.math.IRect} b A rectangle.\n * @return {goog.math.Rect} A new bounding rect, or null if either rect is\n *     null.\n */\ngoog.math.Rect.boundingRect = function(a, b) {\n  if (!a || !b) {\n    return null;\n  }\n\n  var newRect = new goog.math.Rect(a.left, a.top, a.width, a.height);\n  newRect.boundingRect(b);\n\n  return newRect;\n};\n\n\n/**\n * Tests whether this rectangle entirely contains another rectangle or\n * coordinate.\n *\n * @param {goog.math.IRect|goog.math.Coordinate} another The rectangle or\n *     coordinate to test for containment.\n * @return {boolean} Whether this rectangle contains given rectangle or\n *     coordinate.\n */\ngoog.math.Rect.prototype.contains = function(another) {\n  if (another instanceof goog.math.Coordinate) {\n    return another.x >= this.left && another.x <= this.left + this.width &&\n        another.y >= this.top && another.y <= this.top + this.height;\n  } else {  // (another instanceof goog.math.IRect)\n    return this.left <= another.left &&\n        this.left + this.width >= another.left + another.width &&\n        this.top <= another.top &&\n        this.top + this.height >= another.top + another.height;\n  }\n};\n\n\n/**\n * @param {!goog.math.Coordinate} point A coordinate.\n * @return {number} The squared distance between the point and the closest\n *     point inside the rectangle. Returns 0 if the point is inside the\n *     rectangle.\n */\ngoog.math.Rect.prototype.squaredDistance = function(point) {\n  var dx = point.x < this.left ?\n      this.left - point.x :\n      Math.max(point.x - (this.left + this.width), 0);\n  var dy = point.y < this.top ? this.top - point.y :\n                                Math.max(point.y - (this.top + this.height), 0);\n  return dx * dx + dy * dy;\n};\n\n\n/**\n * @param {!goog.math.Coordinate} point A coordinate.\n * @return {number} The distance between the point and the closest point\n *     inside the rectangle. Returns 0 if the point is inside the rectangle.\n */\ngoog.math.Rect.prototype.distance = function(point) {\n  return Math.sqrt(this.squaredDistance(point));\n};\n\n\n/**\n * @return {!goog.math.Size} The size of this rectangle.\n */\ngoog.math.Rect.prototype.getSize = function() {\n  return new goog.math.Size(this.width, this.height);\n};\n\n\n/**\n * @return {!goog.math.Coordinate} A new coordinate for the top-left corner of\n *     the rectangle.\n */\ngoog.math.Rect.prototype.getTopLeft = function() {\n  return new goog.math.Coordinate(this.left, this.top);\n};\n\n\n/**\n * @return {!goog.math.Coordinate} A new coordinate for the center of the\n *     rectangle.\n */\ngoog.math.Rect.prototype.getCenter = function() {\n  return new goog.math.Coordinate(\n      this.left + this.width / 2, this.top + this.height / 2);\n};\n\n\n/**\n * @return {!goog.math.Coordinate} A new coordinate for the bottom-right corner\n *     of the rectangle.\n */\ngoog.math.Rect.prototype.getBottomRight = function() {\n  return new goog.math.Coordinate(\n      this.left + this.width, this.top + this.height);\n};\n\n\n/**\n * Rounds the fields to the next larger integer values.\n * @return {!goog.math.Rect} This rectangle with ceil'd fields.\n */\ngoog.math.Rect.prototype.ceil = function() {\n  this.left = Math.ceil(this.left);\n  this.top = Math.ceil(this.top);\n  this.width = Math.ceil(this.width);\n  this.height = Math.ceil(this.height);\n  return this;\n};\n\n\n/**\n * Rounds the fields to the next smaller integer values.\n * @return {!goog.math.Rect} This rectangle with floored fields.\n */\ngoog.math.Rect.prototype.floor = function() {\n  this.left = Math.floor(this.left);\n  this.top = Math.floor(this.top);\n  this.width = Math.floor(this.width);\n  this.height = Math.floor(this.height);\n  return this;\n};\n\n\n/**\n * Rounds the fields to nearest integer values.\n * @return {!goog.math.Rect} This rectangle with rounded fields.\n */\ngoog.math.Rect.prototype.round = function() {\n  this.left = Math.round(this.left);\n  this.top = Math.round(this.top);\n  this.width = Math.round(this.width);\n  this.height = Math.round(this.height);\n  return this;\n};\n\n\n/**\n * Translates this rectangle by the given offsets. If a\n * `goog.math.Coordinate` is given, then the left and top values are\n * translated by the coordinate's x and y values. Otherwise, left and top are\n * translated by `tx` and `opt_ty` respectively.\n * @param {number|goog.math.Coordinate} tx The value to translate left by or the\n *     the coordinate to translate this rect by.\n * @param {number=} opt_ty The value to translate top by.\n * @return {!goog.math.Rect} This rectangle after translating.\n */\ngoog.math.Rect.prototype.translate = function(tx, opt_ty) {\n  if (tx instanceof goog.math.Coordinate) {\n    this.left += tx.x;\n    this.top += tx.y;\n  } else {\n    this.left += goog.asserts.assertNumber(tx);\n    if (typeof opt_ty === 'number') {\n      this.top += opt_ty;\n    }\n  }\n  return this;\n};\n\n\n/**\n * Scales this rectangle by the given scale factors. The left and width values\n * are scaled by `sx` and the top and height values are scaled by\n * `opt_sy`.  If `opt_sy` is not given, then all fields are scaled\n * by `sx`.\n * @param {number} sx The scale factor to use for the x dimension.\n * @param {number=} opt_sy The scale factor to use for the y dimension.\n * @return {!goog.math.Rect} This rectangle after scaling.\n */\ngoog.math.Rect.prototype.scale = function(sx, opt_sy) {\n  var sy = (typeof opt_sy === 'number') ? opt_sy : sx;\n  this.left *= sx;\n  this.width *= sx;\n  this.top *= sy;\n  this.height *= sy;\n  return this;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^8T","~$goog.math.Size","^?","^3<","^3="]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/rect.js"],"^O",["^=",["~$goog.math.Rect"]],"^W",true,"^X",["^?","^1L","^3<","^3=","^8T","^@@"]],["^ ","^3",[1579837703000],"^4","goog.testing.fs.fs.js","^5",["^6","goog/testing/fs/fs.js"],"^7","goog/testing/fs/fs.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Mock implementations of the Closure HTML5 FileSystem wrapper\n * classes. These implementations are designed to be usable in any browser, so\n * they use none of the native FileSystem-related objects.\n *\n */\n\ngoog.setTestOnly('goog.testing.fs');\ngoog.provide('goog.testing.fs');\n\ngoog.require('goog.Timer');\ngoog.require('goog.array');\ngoog.require('goog.async.Deferred');\n/** @suppress {extraRequire} */\ngoog.require('goog.fs');\ngoog.require('goog.testing.PropertyReplacer');\ngoog.require('goog.testing.fs.Blob');\ngoog.require('goog.testing.fs.FileSystem');\n\n\n/**\n * Get a filesystem object. Since these are mocks, there's no difference between\n * temporary and persistent filesystems.\n *\n * @param {number} size Ignored.\n * @return {!goog.async.Deferred} The deferred\n *     {@link goog.testing.fs.FileSystem}.\n */\ngoog.testing.fs.getTemporary = function(size) {\n  var d = new goog.async.Deferred();\n  goog.Timer.callOnce(\n      goog.bind(d.callback, d, new goog.testing.fs.FileSystem()));\n  return d;\n};\n\n\n/**\n * Get a filesystem object. Since these are mocks, there's no difference between\n * temporary and persistent filesystems.\n *\n * @param {number} size Ignored.\n * @return {!goog.async.Deferred} The deferred\n *     {@link goog.testing.fs.FileSystem}.\n */\ngoog.testing.fs.getPersistent = function(size) {\n  return goog.testing.fs.getTemporary(size);\n};\n\n\n/**\n * Which object URLs have been granted for fake blobs.\n * @type {!Object<boolean>}\n * @private\n */\ngoog.testing.fs.objectUrls_ = {};\n\n\n/**\n * Create a fake object URL for a given fake blob. This can be used as a real\n * URL, and it can be created and revoked normally.\n *\n * @param {!goog.testing.fs.Blob} blob The blob for which to create the URL.\n * @return {string} The URL.\n */\ngoog.testing.fs.createObjectUrl = function(blob) {\n  var url = blob.toDataUrl();\n  goog.testing.fs.objectUrls_[url] = true;\n  return url;\n};\n\n\n/**\n * Remove a URL that was created for a fake blob.\n *\n * @param {string} url The URL to revoke.\n */\ngoog.testing.fs.revokeObjectUrl = function(url) {\n  delete goog.testing.fs.objectUrls_[url];\n};\n\n\n/**\n * Return whether or not a URL has been granted for the given blob.\n *\n * @param {!goog.testing.fs.Blob} blob The blob to check.\n * @return {boolean} Whether a URL has been granted.\n */\ngoog.testing.fs.isObjectUrlGranted = function(blob) {\n  return (blob.toDataUrl()) in goog.testing.fs.objectUrls_;\n};\n\n\n/**\n * Concatenates one or more values together and converts them to a fake blob.\n *\n * @param {...(string|!goog.testing.fs.Blob)} var_args The values that will make\n *     up the resulting blob.\n * @return {!goog.testing.fs.Blob} The blob.\n */\ngoog.testing.fs.getBlob = function(var_args) {\n  return new goog.testing.fs.Blob(goog.array.map(arguments, String).join(''));\n};\n\n\n/**\n * Creates a blob with the given properties.\n * See https://developer.mozilla.org/en-US/docs/Web/API/Blob for more details.\n *\n * @param {Array<string|!goog.testing.fs.Blob>} parts\n *     The values that will make up the resulting blob.\n * @param {string=} opt_type The MIME type of the Blob.\n * @param {string=} opt_endings Specifies how strings containing newlines are to\n *     be written out.\n * @return {!goog.testing.fs.Blob} The blob.\n */\ngoog.testing.fs.getBlobWithProperties = function(parts, opt_type, opt_endings) {\n  return new goog.testing.fs.Blob(\n      goog.array.map(parts, String).join(''), opt_type);\n};\n\n\n/**\n * Returns the string value of a fake blob.\n *\n * @param {!goog.testing.fs.Blob} blob The blob to convert to a string.\n * @param {string=} opt_encoding Ignored.\n * @return {!goog.async.Deferred} The deferred string value of the blob.\n */\ngoog.testing.fs.blobToString = function(blob, opt_encoding) {\n  var d = new goog.async.Deferred();\n  goog.Timer.callOnce(goog.bind(d.callback, d, blob.toString()));\n  return d;\n};\n\n\n/**\n * Slices the blob. The returned blob contains data from the start byte\n * (inclusive) till the end byte (exclusive). Negative indices can be used\n * to count bytes from the end of the blob (-1 == blob.size - 1). Indices\n * are always clamped to blob range. If end is omitted, all the data till\n * the end of the blob is taken.\n *\n * @param {!goog.testing.fs.Blob} testBlob The blob to slice.\n * @param {number} start Index of the starting byte.\n * @param {number=} opt_end Index of the ending byte.\n * @return {goog.testing.fs.Blob} The new blob or null if not supported.\n */\ngoog.testing.fs.sliceBlob = function(testBlob, start, opt_end) {\n  return testBlob.slice(start, opt_end);\n};\n\n\n/**\n * Installs goog.testing.fs in place of the standard goog.fs. After calling\n * this, code that uses goog.fs should work without issue using goog.testing.fs.\n *\n * @param {!goog.testing.PropertyReplacer} stubs The property replacer for\n *     stubbing out the original goog.fs functions.\n */\ngoog.testing.fs.install = function(stubs) {\n  // Prevent warnings that goog.fs may get optimized away. It's true this is\n  // unsafe in compiled code, but it's only meant for tests.\n  var fs = goog.getObjectByName('goog.fs');\n  stubs.replace(fs, 'getTemporary', goog.testing.fs.getTemporary);\n  stubs.replace(fs, 'getPersistent', goog.testing.fs.getPersistent);\n  stubs.replace(fs, 'createObjectUrl', goog.testing.fs.createObjectUrl);\n  stubs.replace(fs, 'revokeObjectUrl', goog.testing.fs.revokeObjectUrl);\n  stubs.replace(fs, 'getBlob', goog.testing.fs.getBlob);\n  stubs.replace(\n      fs, 'getBlobWithProperties', goog.testing.fs.getBlobWithProperties);\n  stubs.replace(fs, 'blobToString', goog.testing.fs.blobToString);\n  stubs.replace(fs, 'browserSupportsObjectUrls', function() { return true; });\n};\n","^;",1579837703000,"^<",["^=",["^3O","^?","~$goog.testing.PropertyReplacer","~$goog.fs","~$goog.testing.fs.FileSystem","^5<","^2O","~$goog.testing.fs.Blob"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/fs/fs.js"],"^O",["^=",["~$goog.testing.fs"]],"^W",true,"^X",["^?","^3O","^2O","^5<","^@C","^@B","^@E","^@D"]],["^ ","^3",[1579837703000],"^4","goog.net.jsonp.js","^5",["^6","goog/net/jsonp.js"],"^7","goog/net/jsonp.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// The original file lives here: http://go/cross_domain_channel.js\n\n/**\n * @fileoverview Implements a cross-domain communication channel. A\n * typical web page is prevented by browser security from sending\n * request, such as a XMLHttpRequest, to other servers than the ones\n * from which it came. The Jsonp class provides a workaround by\n * using dynamically generated script tags. Typical usage:.\n *\n * var trustedUri = goog.html.TrustedResourceUrl.fromConstant(\n *     goog.string.Const.from('https://example.com/servlet'));\n * var jsonp = new goog.net.Jsonp(trustedUri);\n * var payload = {'foo': 1, 'bar': true};\n * jsonp.send(payload, function(reply) { alert(reply) });\n *\n * This script works in all browsers that are currently supported by\n * the Google Maps API, which is IE 6.0+, Firefox 0.8+, Safari 1.2.4+,\n * Netscape 7.1+, Mozilla 1.4+, Opera 8.02+.\n *\n */\n\ngoog.provide('goog.net.Jsonp');\n\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.net.jsloader');\ngoog.require('goog.object');\n\n// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING\n//\n// This class allows us (Google) to send data from non-Google and thus\n// UNTRUSTED pages to our servers. Under NO CIRCUMSTANCES return\n// anything sensitive, such as session or cookie specific data. Return\n// only data that you want parties external to Google to have. Also\n// NEVER use this method to send data from web pages to untrusted\n// servers, or redirects to unknown servers (www.google.com/cache,\n// /q=xx&btnl, /url, www.googlepages.com, etc.)\n//\n// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING\n\n\n\n/**\n * Creates a new cross domain channel that sends data to the specified\n * host URL. By default, if no reply arrives within 5s, the channel\n * assumes the call failed to complete successfully.\n *\n * @param {!goog.html.TrustedResourceUrl} uri The Uri of the server side code\n *     that receives data posted through this channel (e.g.,\n *     \"http://maps.google.com/maps/geo\").\n *\n * @param {string=} opt_callbackParamName The parameter name that is used to\n *     specify the callback. Defaults to \"callback\".\n *\n * @constructor\n * @final\n */\ngoog.net.Jsonp = function(uri, opt_callbackParamName) {\n  /**\n   * The uri_ object will be used to encode the payload that is sent to the\n   * server.\n   * @type {!goog.html.TrustedResourceUrl}\n   * @private\n   */\n  this.uri_ = uri;\n\n  /**\n   * This is the callback parameter name that is added to the uri.\n   * @type {string}\n   * @private\n   */\n  this.callbackParamName_ =\n      opt_callbackParamName ? opt_callbackParamName : 'callback';\n\n  /**\n   * The length of time, in milliseconds, this channel is prepared\n   * to wait for for a request to complete. The default value is 5 seconds.\n   * @type {number}\n   * @private\n   */\n  this.timeout_ = 5000;\n\n  /**\n   * The nonce to use in the dynamically generated script tags. This is used for\n   * allowing the script callbacks to execute when the page has an enforced\n   * Content Security Policy.\n   * @type {string}\n   * @private\n   */\n  this.nonce_ = '';\n};\n\n\n/**\n * The prefix for the callback name which will be stored on goog.global.\n */\ngoog.net.Jsonp.CALLBACKS = '_callbacks_';\n\n\n/**\n * Used to generate unique callback IDs. The counter must be global because\n * all channels share a common callback object.\n * @private\n */\ngoog.net.Jsonp.scriptCounter_ = 0;\n\n\n/**\n * Static private method which returns the global unique callback id.\n *\n * @param {string} id The id of the script node.\n * @return {string} A global unique id used to store callback on goog.global\n *     object.\n * @private\n */\ngoog.net.Jsonp.getCallbackId_ = function(id) {\n  return goog.net.Jsonp.CALLBACKS + '__' + id;\n};\n\n\n/**\n * Sets the length of time, in milliseconds, this channel is prepared\n * to wait for for a request to complete. If the call is not competed\n * within the set time span, it is assumed to have failed. To wait\n * indefinitely for a request to complete set the timout to a negative\n * number.\n *\n * @param {number} timeout The length of time before calls are\n * interrupted.\n */\ngoog.net.Jsonp.prototype.setRequestTimeout = function(timeout) {\n  this.timeout_ = timeout;\n};\n\n\n/**\n * Returns the current timeout value, in milliseconds.\n *\n * @return {number} The timeout value.\n */\ngoog.net.Jsonp.prototype.getRequestTimeout = function() {\n  return this.timeout_;\n};\n\n\n/**\n * Sets the nonce value for CSP. This nonce value will be added to any created\n * script elements and must match the nonce provided in the\n * Content-Security-Policy header sent by the server for the callback to pass\n * CSP enforcement.\n *\n * @param {string} nonce The CSP nonce value.\n */\ngoog.net.Jsonp.prototype.setNonce = function(nonce) {\n  this.nonce_ = nonce;\n};\n\n\n/**\n * Sends the given payload to the URL specified at the construction\n * time. The reply is delivered to the given replyCallback. If the\n * errorCallback is specified and the reply does not arrive within the\n * timeout period set on this channel, the errorCallback is invoked\n * with the original payload.\n *\n * If no reply callback is specified, then the response is expected to\n * consist of calls to globally registered functions. No &callback=\n * URL parameter will be sent in the request, and the script element\n * will be cleaned up after the timeout.\n *\n * @param {Object=} opt_payload Name-value pairs.  If given, these will be\n *     added as parameters to the supplied URI as GET parameters to the\n *     given server URI.\n *\n * @param {Function=} opt_replyCallback A function expecting one\n *     argument, called when the reply arrives, with the response data.\n *\n * @param {Function=} opt_errorCallback A function expecting one\n *     argument, called on timeout, with the payload (if given), otherwise\n *     null.\n *\n * @param {string=} opt_callbackParamValue Value to be used as the\n *     parameter value for the callback parameter (callbackParamName).\n *     To be used when the value needs to be fixed by the client for a\n *     particular request, to make use of the cached responses for the request.\n *     NOTE: If multiple requests are made with the same\n *     opt_callbackParamValue, only the last call will work whenever the\n *     response comes back.\n *\n * @return {!Object} A request descriptor that may be used to cancel this\n *     transmission, or null, if the message may not be cancelled.\n */\ngoog.net.Jsonp.prototype.send = function(\n    opt_payload, opt_replyCallback, opt_errorCallback, opt_callbackParamValue) {\n\n  var payload = opt_payload ? goog.object.clone(opt_payload) : {};\n\n  var id = opt_callbackParamValue ||\n      '_' + (goog.net.Jsonp.scriptCounter_++).toString(36) +\n          goog.now().toString(36);\n  var callbackId = goog.net.Jsonp.getCallbackId_(id);\n\n  if (opt_replyCallback) {\n    var reply = goog.net.Jsonp.newReplyHandler_(id, opt_replyCallback);\n    // Register the callback on goog.global to make it discoverable\n    // by jsonp response.\n    goog.global[callbackId] = reply;\n    payload[this.callbackParamName_] = callbackId;\n  }\n\n  var options = {timeout: this.timeout_, cleanupWhenDone: true};\n  if (this.nonce_) {\n    options.attributes = {'nonce': this.nonce_};\n  }\n\n  var uri = this.uri_.cloneWithParams(payload);\n\n  var deferred = goog.net.jsloader.safeLoad(uri, options);\n  var error = goog.net.Jsonp.newErrorHandler_(id, payload, opt_errorCallback);\n  deferred.addErrback(error);\n\n  return {id_: id, deferred_: deferred};\n};\n\n\n/**\n * Cancels a given request. The request must be exactly the object returned by\n * the send method.\n * @param {Object} request The request object returned by the send method.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.net.Jsonp.prototype.cancel = function(request) {\n  if (request) {\n    if (request.deferred_) {\n      request.deferred_.cancel();\n    }\n    if (request.id_) {\n      goog.net.Jsonp.cleanup_(request.id_, false);\n    }\n  }\n};\n\n\n/**\n * Creates a timeout callback that calls the given timeoutCallback with the\n * original payload.\n *\n * @param {string} id The id of the script node.\n * @param {Object} payload The payload that was sent to the server.\n * @param {Function=} opt_errorCallback The function called on timeout.\n * @return {!Function} A zero argument function that handles callback duties.\n * @private\n */\ngoog.net.Jsonp.newErrorHandler_ = function(id, payload, opt_errorCallback) {\n  /**\n   * When we call across domains with a request, this function is the\n   * timeout handler. Once it's done executing the user-specified\n   * error-handler, it removes the script node and original function.\n   */\n  return function() {\n    goog.net.Jsonp.cleanup_(id, false);\n    if (opt_errorCallback) {\n      opt_errorCallback(payload);\n    }\n  };\n};\n\n\n/**\n * Creates a reply callback that calls the given replyCallback with data\n * returned by the server.\n *\n * @param {string} id The id of the script node.\n * @param {Function} replyCallback The function called on reply.\n * @return {!Function} A reply callback function.\n * @private\n */\ngoog.net.Jsonp.newReplyHandler_ = function(id, replyCallback) {\n  /**\n   * This function is the handler for the all-is-well response. It\n   * clears the error timeout handler, calls the user's handler, then\n   * removes the script node and itself.\n   *\n   * @param {...Object} var_args The response data sent from the server.\n   */\n  var handler = function(var_args) {\n    goog.net.Jsonp.cleanup_(id, true);\n    replyCallback.apply(undefined, arguments);\n  };\n  return handler;\n};\n\n\n/**\n * Removes the reply handler registered on goog.global object.\n *\n * @param {string} id The id of the script node to be removed.\n * @param {boolean} deleteReplyHandler If true, delete the reply handler\n *     instead of setting it to nullFunction (if we know the callback could\n *     never be called again).\n * @private\n */\ngoog.net.Jsonp.cleanup_ = function(id, deleteReplyHandler) {\n  var callbackId = goog.net.Jsonp.getCallbackId_(id);\n  if (goog.global[callbackId]) {\n    if (deleteReplyHandler) {\n      try {\n        delete goog.global[callbackId];\n      } catch (e) {\n        // NOTE: Workaround to delete property on 'window' in IE <= 8, see:\n        // http://stackoverflow.com/questions/1073414/deleting-a-window-property-in-ie\n        goog.global[callbackId] = undefined;\n      }\n    } else {\n      // Removing the script tag doesn't necessarily prevent the script\n      // from firing, so we make the callback a noop.\n      goog.global[callbackId] = goog.nullFunction;\n    }\n  }\n};\n\n\n// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING\n//\n// This class allows us (Google) to send data from non-Google and thus\n// UNTRUSTED pages to our servers. Under NO CIRCUMSTANCES return\n// anything sensitive, such as session or cookie specific data. Return\n// only data that you want parties external to Google to have. Also\n// NEVER use this method to send data from web pages to untrusted\n// servers, or redirects to unknown servers (www.google.com/cache,\n// /q=xx&btnl, /url, www.googlepages.com, etc.)\n//\n// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING\n","^;",1579837703000,"^<",["^=",["^4C","^7O","^?","^42"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/jsonp.js"],"^O",["^=",["~$goog.net.Jsonp"]],"^W",true,"^X",["^?","^4C","^7O","^42"]],["^ ","^3",[1579837703000],"^4","goog.events.listenable.js","^5",["^6","goog/events/listenable.js"],"^7","goog/events/listenable.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An interface for a listenable JavaScript object.\n * @author chrishenry@google.com (Chris Henry)\n */\n\ngoog.provide('goog.events.Listenable');\ngoog.provide('goog.events.ListenableKey');\n\ngoog.forwardDeclare('goog.events.EventLike');\ngoog.forwardDeclare('goog.events.EventTarget');\n/** @suppress {extraRequire} */\ngoog.require('goog.events.EventId');\n\n\n\n/**\n * A listenable interface. A listenable is an object with the ability\n * to dispatch/broadcast events to \"event listeners\" registered via\n * listen/listenOnce.\n *\n * The interface allows for an event propagation mechanism similar\n * to one offered by native browser event targets, such as\n * capture/bubble mechanism, stopping propagation, and preventing\n * default actions. Capture/bubble mechanism depends on the ancestor\n * tree constructed via `#getParentEventTarget`; this tree\n * must be directed acyclic graph. The meaning of default action(s)\n * in preventDefault is specific to a particular use case.\n *\n * Implementations that do not support capture/bubble or can not have\n * a parent listenable can simply not implement any ability to set the\n * parent listenable (and have `#getParentEventTarget` return\n * null).\n *\n * Implementation of this class can be used with or independently from\n * goog.events.\n *\n * Implementation must call `#addImplementation(implClass)`.\n *\n * @interface\n * @see goog.events\n * @see http://www.w3.org/TR/DOM-Level-2-Events/events.html\n */\ngoog.events.Listenable = function() {};\n\n\n/**\n * An expando property to indicate that an object implements\n * goog.events.Listenable.\n *\n * See addImplementation/isImplementedBy.\n *\n * @type {string}\n * @const\n */\ngoog.events.Listenable.IMPLEMENTED_BY_PROP =\n    'closure_listenable_' + ((Math.random() * 1e6) | 0);\n\n\n/**\n * Marks a given class (constructor) as an implementation of\n * Listenable, so that we can query that fact at runtime. The class\n * must have already implemented the interface.\n * @param {function(new:goog.events.Listenable,...)} cls The class constructor.\n *     The corresponding class must have already implemented the interface.\n */\ngoog.events.Listenable.addImplementation = function(cls) {\n  cls.prototype[goog.events.Listenable.IMPLEMENTED_BY_PROP] = true;\n};\n\n\n/**\n * @param {Object} obj The object to check.\n * @return {boolean} Whether a given instance implements Listenable. The\n *     class/superclass of the instance must call addImplementation.\n */\ngoog.events.Listenable.isImplementedBy = function(obj) {\n  return !!(obj && obj[goog.events.Listenable.IMPLEMENTED_BY_PROP]);\n};\n\n\n/**\n * Adds an event listener. A listener can only be added once to an\n * object and if it is added again the key for the listener is\n * returned. Note that if the existing listener is a one-off listener\n * (registered via listenOnce), it will no longer be a one-off\n * listener after a call to listen().\n *\n * @param {string|!goog.events.EventId<EVENTOBJ>} type The event type id.\n * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback\n *     method.\n * @param {boolean=} opt_useCapture Whether to fire in capture phase\n *     (defaults to false).\n * @param {SCOPE=} opt_listenerScope Object in whose scope to call the\n *     listener.\n * @return {!goog.events.ListenableKey} Unique key for the listener.\n * @template SCOPE,EVENTOBJ\n */\ngoog.events.Listenable.prototype.listen;\n\n\n/**\n * Adds an event listener that is removed automatically after the\n * listener fired once.\n *\n * If an existing listener already exists, listenOnce will do\n * nothing. In particular, if the listener was previously registered\n * via listen(), listenOnce() will not turn the listener into a\n * one-off listener. Similarly, if there is already an existing\n * one-off listener, listenOnce does not modify the listeners (it is\n * still a once listener).\n *\n * @param {string|!goog.events.EventId<EVENTOBJ>} type The event type id.\n * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback\n *     method.\n * @param {boolean=} opt_useCapture Whether to fire in capture phase\n *     (defaults to false).\n * @param {SCOPE=} opt_listenerScope Object in whose scope to call the\n *     listener.\n * @return {!goog.events.ListenableKey} Unique key for the listener.\n * @template SCOPE,EVENTOBJ\n */\ngoog.events.Listenable.prototype.listenOnce;\n\n\n/**\n * Removes an event listener which was added with listen() or listenOnce().\n *\n * @param {string|!goog.events.EventId<EVENTOBJ>} type The event type id.\n * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener Callback\n *     method.\n * @param {boolean=} opt_useCapture Whether to fire in capture phase\n *     (defaults to false).\n * @param {SCOPE=} opt_listenerScope Object in whose scope to call\n *     the listener.\n * @return {boolean} Whether any listener was removed.\n * @template SCOPE,EVENTOBJ\n */\ngoog.events.Listenable.prototype.unlisten;\n\n\n/**\n * Removes an event listener which was added with listen() by the key\n * returned by listen().\n *\n * @param {!goog.events.ListenableKey} key The key returned by\n *     listen() or listenOnce().\n * @return {boolean} Whether any listener was removed.\n */\ngoog.events.Listenable.prototype.unlistenByKey;\n\n\n/**\n * Dispatches an event (or event like object) and calls all listeners\n * listening for events of this type. The type of the event is decided by the\n * type property on the event object.\n *\n * If any of the listeners returns false OR calls preventDefault then this\n * function will return false.  If one of the capture listeners calls\n * stopPropagation, then the bubble listeners won't fire.\n *\n * @param {goog.events.EventLike} e Event object.\n * @return {boolean} If anyone called preventDefault on the event object (or\n *     if any of the listeners returns false) this will also return false.\n */\ngoog.events.Listenable.prototype.dispatchEvent;\n\n\n/**\n * Removes all listeners from this listenable. If type is specified,\n * it will only remove listeners of the particular type. otherwise all\n * registered listeners will be removed.\n *\n * @param {string=} opt_type Type of event to remove, default is to\n *     remove all types.\n * @return {number} Number of listeners removed.\n */\ngoog.events.Listenable.prototype.removeAllListeners;\n\n\n/**\n * Returns the parent of this event target to use for capture/bubble\n * mechanism.\n *\n * NOTE(chrishenry): The name reflects the original implementation of\n * custom event target (`goog.events.EventTarget`). We decided\n * that changing the name is not worth it.\n *\n * @return {goog.events.Listenable} The parent EventTarget or null if\n *     there is no parent.\n */\ngoog.events.Listenable.prototype.getParentEventTarget;\n\n\n/**\n * Fires all registered listeners in this listenable for the given\n * type and capture mode, passing them the given eventObject. This\n * does not perform actual capture/bubble. Only implementors of the\n * interface should be using this.\n *\n * @param {string|!goog.events.EventId<EVENTOBJ>} type The type of the\n *     listeners to fire.\n * @param {boolean} capture The capture mode of the listeners to fire.\n * @param {EVENTOBJ} eventObject The event object to fire.\n * @return {boolean} Whether all listeners succeeded without\n *     attempting to prevent default behavior. If any listener returns\n *     false or called goog.events.Event#preventDefault, this returns\n *     false.\n * @template EVENTOBJ\n */\ngoog.events.Listenable.prototype.fireListeners;\n\n\n/**\n * Gets all listeners in this listenable for the given type and\n * capture mode.\n *\n * @param {string|!goog.events.EventId} type The type of the listeners to fire.\n * @param {boolean} capture The capture mode of the listeners to fire.\n * @return {!Array<!goog.events.ListenableKey>} An array of registered\n *     listeners.\n * @template EVENTOBJ\n */\ngoog.events.Listenable.prototype.getListeners;\n\n\n/**\n * Gets the goog.events.ListenableKey for the event or null if no such\n * listener is in use.\n *\n * @param {string|!goog.events.EventId<EVENTOBJ>} type The name of the event\n *     without the 'on' prefix.\n * @param {function(this:SCOPE, EVENTOBJ):(boolean|undefined)} listener The\n *     listener function to get.\n * @param {boolean} capture Whether the listener is a capturing listener.\n * @param {SCOPE=} opt_listenerScope Object in whose scope to call the\n *     listener.\n * @return {goog.events.ListenableKey} the found listener or null if not found.\n * @template SCOPE,EVENTOBJ\n */\ngoog.events.Listenable.prototype.getListener;\n\n\n/**\n * Whether there is any active listeners matching the specified\n * signature. If either the type or capture parameters are\n * unspecified, the function will match on the remaining criteria.\n *\n * @param {string|!goog.events.EventId<EVENTOBJ>=} opt_type Event type.\n * @param {boolean=} opt_capture Whether to check for capture or bubble\n *     listeners.\n * @return {boolean} Whether there is any active listeners matching\n *     the requested type and/or capture phase.\n * @template EVENTOBJ\n */\ngoog.events.Listenable.prototype.hasListener;\n\n\n\n/**\n * An interface that describes a single registered listener.\n * @interface\n */\ngoog.events.ListenableKey = function() {};\n\n\n/**\n * Counter used to create a unique key\n * @type {number}\n * @private\n */\ngoog.events.ListenableKey.counter_ = 0;\n\n\n/**\n * Reserves a key to be used for ListenableKey#key field.\n * @return {number} A number to be used to fill ListenableKey#key\n *     field.\n */\ngoog.events.ListenableKey.reserveKey = function() {\n  return ++goog.events.ListenableKey.counter_;\n};\n\n\n/**\n * The source event target.\n * @type {Object|goog.events.Listenable|goog.events.EventTarget}\n */\ngoog.events.ListenableKey.prototype.src;\n\n\n/**\n * The event type the listener is listening to.\n * @type {string}\n */\ngoog.events.ListenableKey.prototype.type;\n\n\n/**\n * The listener function.\n * @type {function(?):?|{handleEvent:function(?):?}|null}\n */\ngoog.events.ListenableKey.prototype.listener;\n\n\n/**\n * Whether the listener works on capture phase.\n * @type {boolean}\n */\ngoog.events.ListenableKey.prototype.capture;\n\n\n/**\n * The 'this' object for the listener function's scope.\n * @type {Object|undefined}\n */\ngoog.events.ListenableKey.prototype.handler;\n\n\n/**\n * A globally unique number to identify the key.\n * @type {number}\n */\ngoog.events.ListenableKey.prototype.key;\n","^;",1579837703000,"^<",["^=",["^6X","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/listenable.js"],"^O",["^=",["^4U","~$goog.events.ListenableKey"]],"^W",true,"^X",["^?","^6X"]],["^ ","^3",[1579837703000],"^4","goog.storage.encryptedstorage.js","^5",["^6","goog/storage/encryptedstorage.js"],"^7","goog/storage/encryptedstorage.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a convenient API for data persistence with key and\n * object encryption. Without a valid secret, the existence of a particular\n * key can't be verified and values can't be decrypted. The value encryption\n * is salted, so subsequent writes of the same cleartext result in different\n * ciphertext. The ciphertext is *not* authenticated, so there is no protection\n * against data manipulation.\n *\n * The metadata is *not* encrypted, so expired keys can be cleaned up without\n * decrypting them. If sensitive metadata is added in subclasses, it is up\n * to the subclass to protect this information, perhaps by embedding it in\n * the object.\n *\n */\n\ngoog.provide('goog.storage.EncryptedStorage');\n\ngoog.forwardDeclare('goog.storage.mechanism.IterableMechanism');\ngoog.require('goog.crypt');\ngoog.require('goog.crypt.Arc4');\ngoog.require('goog.crypt.Sha1');\ngoog.require('goog.crypt.base64');\ngoog.require('goog.json');\ngoog.require('goog.json.Serializer');\ngoog.require('goog.storage.CollectableStorage');\ngoog.require('goog.storage.ErrorCode');\ngoog.require('goog.storage.RichStorage');\n\n\n\n/**\n * Provides an encrypted storage. The keys are hashed with a secret, so\n * their existence cannot be verified without the knowledge of the secret.\n * The values are encrypted using the key, a salt, and the secret, so\n * stream cipher initialization varies for each stored value.\n *\n * @param {!goog.storage.mechanism.IterableMechanism} mechanism The underlying\n *     storage mechanism.\n * @param {string} secret The secret key used to encrypt the storage.\n * @constructor\n * @struct\n * @extends {goog.storage.CollectableStorage}\n * @final\n */\ngoog.storage.EncryptedStorage = function(mechanism, secret) {\n  goog.storage.EncryptedStorage.base(this, 'constructor', mechanism);\n  /**\n   * The secret used to encrypt the storage.\n   *\n   * @private {!Array<number>}\n   */\n  this.secret_ = goog.crypt.stringToByteArray(secret);\n\n  /**\n   * The JSON serializer used to serialize values before encryption. This can\n   * be potentially different from serializing for the storage mechanism (see\n   * goog.storage.Storage), so a separate serializer is kept here.\n   *\n   * @private {!goog.json.Serializer}\n   */\n  this.cleartextSerializer_ = new goog.json.Serializer();\n};\ngoog.inherits(goog.storage.EncryptedStorage, goog.storage.CollectableStorage);\n\n\n/**\n * Metadata key under which the salt is stored.\n *\n * @type {string}\n * @protected\n */\ngoog.storage.EncryptedStorage.SALT_KEY = 'salt';\n\n\n/**\n * Hashes a key using the secret.\n *\n * @param {string} key The key.\n * @return {string} The hash.\n * @private\n */\ngoog.storage.EncryptedStorage.prototype.hashKeyWithSecret_ = function(key) {\n  var sha1 = new goog.crypt.Sha1();\n  sha1.update(goog.crypt.stringToByteArray(key));\n  sha1.update(this.secret_);\n  return goog.crypt.base64.encodeByteArray(\n      sha1.digest(), goog.crypt.base64.Alphabet.WEBSAFE_DOT_PADDING);\n};\n\n\n/**\n * Encrypts a value using a key, a salt, and the secret.\n *\n * @param {!Array<number>} salt The salt.\n * @param {string} key The key.\n * @param {string} value The cleartext value.\n * @return {string} The encrypted value.\n * @private\n */\ngoog.storage.EncryptedStorage.prototype.encryptValue_ = function(\n    salt, key, value) {\n  if (!(salt.length > 0)) {\n    throw new Error('Non-empty salt must be provided');\n  }\n  var sha1 = new goog.crypt.Sha1();\n  sha1.update(goog.crypt.stringToByteArray(key));\n  sha1.update(salt);\n  sha1.update(this.secret_);\n  var arc4 = new goog.crypt.Arc4();\n  arc4.setKey(sha1.digest());\n  // Warm up the streamcypher state, see goog.crypt.Arc4 for details.\n  arc4.discard(1536);\n  var bytes = goog.crypt.stringToByteArray(value);\n  arc4.crypt(bytes);\n  return goog.crypt.byteArrayToString(bytes);\n};\n\n\n/**\n * Decrypts a value using a key, a salt, and the secret.\n *\n * @param {!Array<number>} salt The salt.\n * @param {string} key The key.\n * @param {string} value The encrypted value.\n * @return {string} The decrypted value.\n * @private\n */\ngoog.storage.EncryptedStorage.prototype.decryptValue_ = function(\n    salt, key, value) {\n  // ARC4 is symmetric.\n  return this.encryptValue_(salt, key, value);\n};\n\n\n/** @override */\ngoog.storage.EncryptedStorage.prototype.set = function(\n    key, value, opt_expiration) {\n  if (value === undefined) {\n    goog.storage.EncryptedStorage.prototype.remove.call(this, key);\n    return;\n  }\n  var salt = [];\n  // 64-bit random salt.\n  for (var i = 0; i < 8; ++i) {\n    salt[i] = Math.floor(Math.random() * 0x100);\n  }\n  var wrapper = new goog.storage.RichStorage.Wrapper(\n      this.encryptValue_(\n          salt, key, this.cleartextSerializer_.serialize(value)));\n  wrapper[goog.storage.EncryptedStorage.SALT_KEY] = salt;\n  goog.storage.EncryptedStorage.base(\n      this, 'set', this.hashKeyWithSecret_(key), wrapper, opt_expiration);\n};\n\n\n/** @override */\ngoog.storage.EncryptedStorage.prototype.getWrapper = function(\n    key, opt_expired) {\n  var wrapper = goog.storage.EncryptedStorage.base(\n      this, 'getWrapper', this.hashKeyWithSecret_(key), opt_expired);\n  if (!wrapper) {\n    return undefined;\n  }\n  var value = goog.storage.RichStorage.Wrapper.unwrap(wrapper);\n  var salt = wrapper[goog.storage.EncryptedStorage.SALT_KEY];\n  if (typeof value !== 'string' || !goog.isArray(salt) || !salt.length) {\n    throw goog.storage.ErrorCode.INVALID_VALUE;\n  }\n  var json = this.decryptValue_(salt, key, value);\n\n  try {\n    wrapper[goog.storage.RichStorage.DATA_KEY] = JSON.parse(json);\n  } catch (e) {\n    throw goog.storage.ErrorCode.DECRYPTION_ERROR;\n  }\n  return wrapper;\n};\n\n\n/** @override */\ngoog.storage.EncryptedStorage.prototype.remove = function(key) {\n  goog.storage.EncryptedStorage.base(\n      this, 'remove', this.hashKeyWithSecret_(key));\n};\n","^;",1579837703000,"^<",["^=",["^9K","~$goog.storage.RichStorage","^3K","^4O","~$goog.crypt.Sha1","^86","^?","~$goog.storage.CollectableStorage","^8V","~$goog.crypt.Arc4"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/encryptedstorage.js"],"^O",["^=",["~$goog.storage.EncryptedStorage"]],"^W",true,"^X",["^?","^9K","^@L","^@J","^86","^4O","^8V","^@K","^3K","^@I"]],["^ ","^3",[1579837703000],"^4","goog.labs.events.touch.js","^5",["^6","goog/labs/events/touch.js"],"^7","goog/labs/events/touch.js","^8","^9","^:","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities to abstract mouse and touch events.\n */\n\n\ngoog.provide('goog.labs.events.touch');\ngoog.provide('goog.labs.events.touch.TouchData');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.events.EventType');\ngoog.require('goog.string');\n\n\n/**\n * Description the geometry and target of an event.\n *\n * @typedef {{\n *   clientX: number,\n *   clientY: number,\n *   screenX: number,\n *   screenY: number,\n *   target: EventTarget\n * }}\n */\ngoog.labs.events.touch.TouchData;\n\n\n/**\n * Takes a mouse or touch event and returns the relevant geometry and target\n * data.\n * @param {!Event} e A mouse or touch event.\n * @return {!goog.labs.events.touch.TouchData}\n */\ngoog.labs.events.touch.getTouchData = function(e) {\n\n  var source = e;\n  goog.asserts.assert(\n      goog.string.startsWith(e.type, 'touch') ||\n          goog.string.startsWith(e.type, 'mouse'),\n      'Event must be mouse or touch event.');\n\n  if (goog.string.startsWith(e.type, 'touch')) {\n    goog.asserts.assert(\n        goog.array.contains(\n            [\n              goog.events.EventType.TOUCHCANCEL, goog.events.EventType.TOUCHEND,\n              goog.events.EventType.TOUCHMOVE, goog.events.EventType.TOUCHSTART\n            ],\n            e.type),\n        'Touch event not of valid type.');\n\n    // If the event is end or cancel, take the first changed touch,\n    // otherwise the first target touch.\n    source = (e.type == goog.events.EventType.TOUCHEND ||\n              e.type == goog.events.EventType.TOUCHCANCEL) ?\n        e.changedTouches[0] :\n        e.targetTouches[0];\n  }\n\n  return {\n    clientX: source['clientX'],\n    clientY: source['clientY'],\n    screenX: source['screenX'],\n    screenY: source['screenY'],\n    target: source['target']\n  };\n};\n","^;",1579837703000,"^<",["^=",["^1L","^2L","^?","^1C","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/events/touch.js"],"^O",["^=",["~$goog.labs.events.touch.TouchData","~$goog.labs.events.touch"]],"^W",true,"^X",["^?","^2O","^1L","^1C","^2L"]],["^ ","^3",[1579837703000],"^4","goog.html.silverlight.js","^5",["^6","goog/html/silverlight.js"],"^7","goog/html/silverlight.js","^8","^9","^:","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview SafeHtml factory methods for creating object tags for\n * loading Silverlight files.\n */\n\ngoog.provide('goog.html.silverlight');\n\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.html.flash');\ngoog.require('goog.string.Const');\n\n\n/**\n * Attributes and param tag name attributes not allowed to be overriden\n * when calling createObjectForSilverlight().\n *\n * While values that should be specified as params are probably not\n * recognized as attributes, we block them anyway just to be sure.\n * @const {!Array<string>}\n * @private\n */\ngoog.html.silverlight.FORBIDDEN_ATTRS_AND_PARAMS_ON_SILVERLIGHT_ = [\n  'data',          // Always set to a fixed value.\n  'source',        // Specifies the URL for the Silverlight file.\n  'type',          // Always set to a fixed value.\n  'typemustmatch'  // Always set to a fixed value.\n];\n\n\n/**\n * Creates a SafeHtml representing an object tag, for loading Silverlight files.\n *\n * The following attributes are set to these fixed values:\n * - data: data:application/x-silverlight-2,\n * - type: application/x-silverlight-2\n * - typemustmatch: \"\" (the empty string, meaning true for a boolean attribute)\n *\n * @param {!goog.html.TrustedResourceUrl} source The value of the source param.\n * @param {?Object<string, string>=} opt_params Mapping used to generate child\n *     param tags. Each tag has a name and value attribute, as defined in\n *     mapping. Only names consisting of [a-zA-Z0-9-] are allowed. Value of\n *     null or undefined causes the param tag to be omitted.\n * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n *     Mapping from other attribute names to their values. Only attribute names\n *     consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes\n *     the attribute to be omitted.\n * @return {!goog.html.SafeHtml} The SafeHtml content with the object tag.\n * @throws {Error} If invalid attribute or param name, or attribute or param\n *     value is provided. Also if opt_attributes or opt_params contains any of\n *     the attributes set to fixed values, documented above, or contains source.\n *\n */\ngoog.html.silverlight.createObject = function(\n    source, opt_params, opt_attributes) {\n  goog.html.flash.verifyKeysNotInMaps(\n      goog.html.silverlight.FORBIDDEN_ATTRS_AND_PARAMS_ON_SILVERLIGHT_,\n      opt_attributes, opt_params);\n\n  // We don't set default for Silverlight's EnableHtmlAccess and\n  // AllowHtmlPopupwindow because their default changes depending on whether\n  // a file loaded from the same domain.\n  var paramTags = goog.html.flash.combineParams({'source': source}, opt_params);\n  var fixedAttributes = {\n    'data': goog.html.TrustedResourceUrl.fromConstant(\n        goog.string.Const.from('data:application/x-silverlight-2,')),\n    'type': 'application/x-silverlight-2',\n    'typemustmatch': ''\n  };\n  var attributes =\n      goog.html.SafeHtml.combineAttributes(fixedAttributes, {}, opt_attributes);\n\n  return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(\n      'object', attributes, paramTags);\n};\n","^;",1579837703000,"^<",["^=",["^4C","^?","^3Q","~$goog.html.flash","^1I"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/silverlight.js"],"^O",["^=",["~$goog.html.silverlight"]],"^W",true,"^X",["^?","^1I","^4C","^@P","^3Q"]],["^ ","^3",[1579837703000],"^4","goog.ui.toolbarselect.js","^5",["^6","goog/ui/toolbarselect.js"],"^7","goog/ui/toolbarselect.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A toolbar select control.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ToolbarSelect');\n\ngoog.require('goog.ui.Select');\ngoog.require('goog.ui.ToolbarMenuButtonRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * A select control for a toolbar.\n *\n * @param {goog.ui.ControlContent} caption Default caption or existing DOM\n *     structure to display as the button's caption when nothing is selected.\n * @param {goog.ui.Menu=} opt_menu Menu containing selection options.\n * @param {goog.ui.MenuButtonRenderer=} opt_renderer Renderer used to\n *     render or decorate the control; defaults to\n *     {@link goog.ui.ToolbarMenuButtonRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.Select}\n */\ngoog.ui.ToolbarSelect = function(\n    caption, opt_menu, opt_renderer, opt_domHelper) {\n  goog.ui.Select.call(\n      this, caption, opt_menu,\n      opt_renderer || goog.ui.ToolbarMenuButtonRenderer.getInstance(),\n      opt_domHelper);\n};\ngoog.inherits(goog.ui.ToolbarSelect, goog.ui.Select);\n\n\n// Registers a decorator factory function for select controls used in toolbars.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.getCssName('goog-toolbar-select'),\n    function() { return new goog.ui.ToolbarSelect(null); });\n","^;",1579837703000,"^<",["^=",["^?","^3F","~$goog.ui.Select","^8Y"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/toolbarselect.js"],"^O",["^=",["~$goog.ui.ToolbarSelect"]],"^W",true,"^X",["^?","^@R","^8Y","^3F"]],["^ ","^3",[1579837703000],"^4","goog.html.safehtmlformatter.js","^5",["^6","goog/html/safehtmlformatter.js"],"^7","goog/html/safehtmlformatter.js","^8","^9","^:","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\ngoog.provide('goog.html.SafeHtmlFormatter');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom.tags');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.string');\n\n\n\n/**\n * Formatter producing SafeHtml from a plain text format and HTML fragments.\n *\n * Example usage:\n *\n * var formatter = new goog.html.SafeHtmlFormatter();\n * var safeHtml = formatter.format(\n *     formatter.startTag('b') +\n *     'User input:' +\n *     formatter.endTag('b') +\n *     ' ' +\n *     formatter.text(userInput));\n *\n * The most common usage is with goog.getMsg:\n *\n * var MSG_USER_INPUT = goog.getMsg(\n *     '{$startLink}Learn more{$endLink} about {$userInput}', {\n *       'startLink': formatter.startTag('a', {'href': url}),\n *       'endLink': formatter.endTag('a'),\n *       'userInput': formatter.text(userInput)\n *     });\n * var safeHtml = formatter.format(MSG_USER_INPUT);\n *\n * The formatting string should be constant with all variables processed by\n * formatter.text().\n *\n * @constructor\n * @struct\n * @final\n */\ngoog.html.SafeHtmlFormatter = function() {\n  /**\n   * Mapping from a marker to a replacement.\n   * @private {!Object<string, !goog.html.SafeHtmlFormatter.Replacement>}\n   */\n  this.replacements_ = {};\n\n  /** @private {number} Number of stored replacements. */\n  this.replacementsCount_ = 0;\n};\n\n\n/**\n * @typedef {?{\n *   startTag: (string|undefined),\n *   attributes: (string|undefined),\n *   endTag: (string|undefined),\n *   html: (string|undefined)\n * }}\n */\ngoog.html.SafeHtmlFormatter.Replacement;\n\n\n/**\n * Formats a plain text string with markers holding HTML fragments to SafeHtml.\n * @param {string} format Plain text format, will be HTML-escaped.\n * @return {!goog.html.SafeHtml}\n */\ngoog.html.SafeHtmlFormatter.prototype.format = function(format) {\n  var openedTags = [];\n  var marker = goog.string.htmlEscape(goog.html.SafeHtmlFormatter.MARKER_);\n  var html = goog.string.htmlEscape(format).replace(\n      new RegExp('\\\\{' + marker + '[\\\\w&#;]+\\\\}', 'g'),\n      goog.bind(this.replaceFormattingString_, this, openedTags));\n  goog.asserts.assert(openedTags.length == 0,\n      'Expected no unclosed tags, got <' + openedTags.join('>, <') + '>.');\n  return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(\n      html, null);\n};\n\n\n/**\n * Replaces found formatting strings with saved tags.\n * @param {!Array<string>} openedTags The tags opened so far, modified by this\n *     function.\n * @param {string} match\n * @return {string}\n * @private\n */\ngoog.html.SafeHtmlFormatter.prototype.replaceFormattingString_ =\n    function(openedTags, match) {\n  var replacement = this.replacements_[match];\n  if (!replacement) {\n    // Someone included a string looking like our internal marker in the format.\n    return match;\n  }\n  var result = '';\n  if (replacement.startTag) {\n    result += '<' + replacement.startTag + replacement.attributes + '>';\n    if (goog.asserts.ENABLE_ASSERTS) {\n      if (!goog.dom.tags.isVoidTag(replacement.startTag.toLowerCase())) {\n        openedTags.push(replacement.startTag.toLowerCase());\n      }\n    }\n  }\n  if (replacement.html) {\n    result += replacement.html;\n  }\n  if (replacement.endTag) {\n    result += '</' + replacement.endTag + '>';\n    if (goog.asserts.ENABLE_ASSERTS) {\n      var lastTag = openedTags.pop();\n      goog.asserts.assert(lastTag == replacement.endTag.toLowerCase(),\n          'Expected </' + lastTag + '>, got </' + replacement.endTag + '>.');\n    }\n  }\n  return result;\n};\n\n\n/**\n * Saves a start tag and returns its marker.\n * @param {string} tagName\n * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n *     Mapping from attribute names to their values. Only attribute names\n *     consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes\n *     the attribute to be omitted.\n * @return {string} Marker.\n * @throws {Error} If invalid tag name, attribute name, or attribute value is\n *     provided. This function accepts the same tags and attributes as\n *     {@link goog.html.SafeHtml.create}.\n */\ngoog.html.SafeHtmlFormatter.prototype.startTag = function(\n    tagName, opt_attributes) {\n  goog.html.SafeHtml.verifyTagName(tagName);\n  return this.storeReplacement_({\n    startTag: tagName,\n    attributes: goog.html.SafeHtml.stringifyAttributes(tagName, opt_attributes)\n  });\n};\n\n\n/**\n * Saves an end tag and returns its marker.\n * @param {string} tagName\n * @return {string} Marker.\n * @throws {Error} If invalid tag name, attribute name, or attribute value is\n *     provided. This function accepts the same tags and attributes as\n *     {@link goog.html.SafeHtml.create}.\n */\ngoog.html.SafeHtmlFormatter.prototype.endTag = function(tagName) {\n  goog.html.SafeHtml.verifyTagName(tagName);\n  return this.storeReplacement_({endTag: tagName});\n};\n\n\n/**\n * Escapes a text, saves it and returns its marker.\n *\n * Wrapping any user input to .text() prevents the attacker with access to\n * the random number generator to duplicate tags used elsewhere in the format.\n *\n * @param {string} text\n * @return {string} Marker.\n */\ngoog.html.SafeHtmlFormatter.prototype.text = function(text) {\n  return this.storeReplacement_({html: goog.string.htmlEscape(text)});\n};\n\n\n/**\n * Saves SafeHtml and returns its marker.\n * @param {!goog.html.SafeHtml} safeHtml\n * @return {string} Marker.\n */\ngoog.html.SafeHtmlFormatter.prototype.safeHtml = function(safeHtml) {\n  return this.storeReplacement_({\n    html: goog.html.SafeHtml.unwrap(safeHtml)\n  });\n};\n\n\n/** @private @const {string} Marker used for replacements. */\ngoog.html.SafeHtmlFormatter.MARKER_ = 'SafeHtmlFormatter:';\n\n\n/**\n * Stores a replacement and returns its marker.\n * @param {!goog.html.SafeHtmlFormatter.Replacement} replacement\n * @return {string} Marker.\n * @private\n */\ngoog.html.SafeHtmlFormatter.prototype.storeReplacement_ = function(\n    replacement) {\n  this.replacementsCount_++;\n  var marker = '{' + goog.html.SafeHtmlFormatter.MARKER_ +\n      this.replacementsCount_ + '_' + goog.string.getRandomString() + '}';\n  this.replacements_[goog.string.htmlEscape(marker)] = replacement;\n  return marker;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^2L","^?","~$goog.dom.tags","^1I"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/safehtmlformatter.js"],"^O",["^=",["^65"]],"^W",true,"^X",["^?","^1L","^@T","^1I","^2L"]],["^ ","^3",[1579837703000],"^4","goog.fx.abstractdragdrop.js","^5",["^6","goog/fx/abstractdragdrop.js"],"^7","goog/fx/abstractdragdrop.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Abstract Base Class for Drag and Drop.\n *\n * Provides functionality for implementing drag and drop classes. Also provides\n * support classes and events.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.fx.AbstractDragDrop');\ngoog.provide('goog.fx.AbstractDragDrop.EventType');\ngoog.provide('goog.fx.DragDropEvent');\ngoog.provide('goog.fx.DragDropItem');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.fx.Dragger');\ngoog.require('goog.math.Box');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.style');\n\n\n\n/**\n * Abstract class that provides reusable functionality for implementing drag\n * and drop functionality.\n *\n * This class also allows clients to define their own subtargeting function\n * so that drop areas can have finer granularity than a single element. This is\n * accomplished by using a client provided function to map from element and\n * coordinates to a subregion id.\n *\n * This class can also be made aware of scrollable containers that contain\n * drop targets by calling addScrollableContainer. This will cause dnd to\n * take changing scroll positions into account while a drag is occurring.\n *\n * @extends {goog.events.EventTarget}\n * @constructor\n * @struct\n */\ngoog.fx.AbstractDragDrop = function() {\n  goog.fx.AbstractDragDrop.base(this, 'constructor');\n\n  /**\n   * List of items that makes up the drag source or drop target.\n   * @protected {Array<goog.fx.DragDropItem>}\n   * @suppress {underscore|visibility}\n   */\n  this.items_ = [];\n\n  /**\n   * List of associated drop targets.\n   * @private {Array<goog.fx.AbstractDragDrop>}\n   */\n  this.targets_ = [];\n\n  /**\n   * Scrollable containers to account for during drag\n   * @private {Array<goog.fx.ScrollableContainer_>}\n   */\n  this.scrollableContainers_ = [];\n\n  /**\n   * Flag indicating if it's a drag source, set by addTarget.\n   * @private {boolean}\n   */\n  this.isSource_ = false;\n\n  /**\n   * Flag indicating if it's a drop target, set when added as target to another\n   * DragDrop object.\n   * @private {boolean}\n   */\n  this.isTarget_ = false;\n\n  /**\n   * Subtargeting function accepting args:\n   * (goog.fx.DragDropItem, goog.math.Box, number, number)\n   * @private {?Function}\n   */\n  this.subtargetFunction_;\n\n  /**\n   * Last active subtarget.\n   * @private {?Object}\n   */\n  this.activeSubtarget_;\n\n  /**\n   * Class name to add to source elements being dragged. Set by setDragClass.\n   * @private {?string}\n   */\n  this.dragClass_;\n\n  /**\n   * Class name to add to source elements. Set by setSourceClass.\n   * @private {?string}\n   */\n  this.sourceClass_;\n\n  /**\n   * Class name to add to target elements. Set by setTargetClass.\n   * @private {?string}\n   */\n  this.targetClass_;\n\n  /**\n   * The SCROLL event target used to make drag element follow scrolling.\n   * @private {?EventTarget}\n   */\n  this.scrollTarget_;\n\n  /**\n   * Dummy target, {@see maybeCreateDummyTargetForPosition_}.\n   * @private {?goog.fx.ActiveDropTarget_}\n   */\n  this.dummyTarget_;\n\n  /**\n   * Whether the object has been initialized.\n   * @private {boolean}\n   */\n  this.initialized_ = false;\n\n  /** @private {?Element} */\n  this.dragEl_;\n\n  /** @private {?Array<!goog.fx.ActiveDropTarget_>} */\n  this.targetList_;\n\n  /** @private {?goog.math.Box} */\n  this.targetBox_;\n\n  /** @private {?goog.fx.ActiveDropTarget_} */\n  this.activeTarget_;\n\n  /** @private {?goog.fx.DragDropItem} */\n  this.dragItem_;\n\n  /** @private {?goog.fx.Dragger} */\n  this.dragger_;\n};\ngoog.inherits(goog.fx.AbstractDragDrop, goog.events.EventTarget);\n\n\n/**\n * Minimum size (in pixels) for a dummy target. If the box for the target is\n * less than the specified size it's not created.\n * @type {number}\n * @private\n */\ngoog.fx.AbstractDragDrop.DUMMY_TARGET_MIN_SIZE_ = 10;\n\n\n/**\n * Constants for event names\n * @const\n */\ngoog.fx.AbstractDragDrop.EventType = {\n  DRAGOVER: 'dragover',\n  DRAGOUT: 'dragout',\n  DRAG: 'drag',\n  DROP: 'drop',\n  DRAGSTART: 'dragstart',\n  DRAGEND: 'dragend'\n};\n\n\n/**\n * Constant for distance threshold, in pixels, an element has to be moved to\n * initiate a drag operation.\n * @type {number}\n */\ngoog.fx.AbstractDragDrop.initDragDistanceThreshold = 5;\n\n\n/**\n * Set class to add to source elements being dragged.\n *\n * @param {string} className Class to be added.  Must be a single, valid\n *     classname.\n */\ngoog.fx.AbstractDragDrop.prototype.setDragClass = function(className) {\n  this.dragClass_ = className;\n};\n\n\n/**\n * Set class to add to source elements.\n *\n * @param {string} className Class to be added.  Must be a single, valid\n *     classname.\n */\ngoog.fx.AbstractDragDrop.prototype.setSourceClass = function(className) {\n  this.sourceClass_ = className;\n};\n\n\n/**\n * Set class to add to target elements.\n *\n * @param {string} className Class to be added.  Must be a single, valid\n *     classname.\n */\ngoog.fx.AbstractDragDrop.prototype.setTargetClass = function(className) {\n  this.targetClass_ = className;\n};\n\n\n/**\n * Whether the control has been initialized.\n *\n * @return {boolean} True if it's been initialized.\n */\ngoog.fx.AbstractDragDrop.prototype.isInitialized = function() {\n  return this.initialized_;\n};\n\n\n/**\n * Add item to drag object.\n *\n * @param {Element|string} element Dom Node, or string representation of node\n *     id, to be used as drag source/drop target.\n * @throws Error Thrown if called on instance of abstract class\n */\ngoog.fx.AbstractDragDrop.prototype.addItem = goog.abstractMethod;\n\n\n/**\n * Associate drop target with drag element.\n *\n * @param {goog.fx.AbstractDragDrop} target Target to add.\n */\ngoog.fx.AbstractDragDrop.prototype.addTarget = function(target) {\n  this.targets_.push(target);\n  target.isTarget_ = true;\n  this.isSource_ = true;\n};\n\n\n/**\n * Removes the specified target from the list of drop targets.\n *\n * @param {!goog.fx.AbstractDragDrop} target Target to remove.\n */\ngoog.fx.AbstractDragDrop.prototype.removeTarget = function(target) {\n  goog.array.remove(this.targets_, target);\n  if (this.activeTarget_ && this.activeTarget_.target_ == target) {\n    this.activeTarget_ = null;\n  }\n  this.recalculateDragTargets();\n};\n\n\n/**\n * Sets the SCROLL event target to make drag element follow scrolling.\n *\n * @param {EventTarget} scrollTarget The element that dispatches SCROLL events.\n */\ngoog.fx.AbstractDragDrop.prototype.setScrollTarget = function(scrollTarget) {\n  this.scrollTarget_ = scrollTarget;\n};\n\n\n/**\n * Initialize drag and drop functionality for sources/targets already added.\n * Sources/targets added after init has been called will initialize themselves\n * one by one.\n */\ngoog.fx.AbstractDragDrop.prototype.init = function() {\n  if (this.initialized_) {\n    return;\n  }\n  for (var item, i = 0; item = this.items_[i]; i++) {\n    this.initItem(item);\n  }\n\n  this.initialized_ = true;\n};\n\n\n/**\n * Initializes a single item.\n *\n * @param {goog.fx.DragDropItem} item Item to initialize.\n * @protected\n */\ngoog.fx.AbstractDragDrop.prototype.initItem = function(item) {\n  if (this.isSource_) {\n    goog.events.listen(\n        item.element, goog.events.EventType.MOUSEDOWN, item.mouseDown_, false,\n        item);\n    if (this.sourceClass_) {\n      goog.dom.classlist.add(\n          goog.asserts.assert(item.element), this.sourceClass_);\n    }\n  }\n\n  if (this.isTarget_ && this.targetClass_) {\n    goog.dom.classlist.add(\n        goog.asserts.assert(item.element), this.targetClass_);\n  }\n};\n\n\n/**\n * Called when removing an item. Removes event listeners and classes.\n *\n * @param {goog.fx.DragDropItem} item Item to dispose.\n * @protected\n */\ngoog.fx.AbstractDragDrop.prototype.disposeItem = function(item) {\n  if (this.isSource_) {\n    goog.events.unlisten(\n        item.element, goog.events.EventType.MOUSEDOWN, item.mouseDown_, false,\n        item);\n    if (this.sourceClass_) {\n      goog.dom.classlist.remove(\n          goog.asserts.assert(item.element), this.sourceClass_);\n    }\n  }\n  if (this.isTarget_ && this.targetClass_) {\n    goog.dom.classlist.remove(\n        goog.asserts.assert(item.element), this.targetClass_);\n  }\n  item.dispose();\n};\n\n\n/**\n * Removes all items.\n */\ngoog.fx.AbstractDragDrop.prototype.removeItems = function() {\n  for (var item, i = 0; item = this.items_[i]; i++) {\n    this.disposeItem(item);\n  }\n  this.items_.length = 0;\n};\n\n\n/**\n * Starts a drag event for an item if the mouse button stays pressed and the\n * cursor moves a few pixels. Allows dragging of items without first having to\n * register them with addItem.\n *\n * @param {goog.events.BrowserEvent} event Mouse down event.\n * @param {goog.fx.DragDropItem} item Item that's being dragged.\n */\ngoog.fx.AbstractDragDrop.prototype.maybeStartDrag = function(event, item) {\n  item.maybeStartDrag_(event, item.element);\n};\n\n\n/**\n * Event handler that's used to start drag.\n *\n * @param {goog.events.BrowserEvent} event Mouse move event.\n * @param {goog.fx.DragDropItem} item Item that's being dragged.\n */\ngoog.fx.AbstractDragDrop.prototype.startDrag = function(event, item) {\n\n  // Prevent a new drag operation from being started if another one is already\n  // in progress (could happen if the mouse was released outside of the\n  // document).\n  if (this.dragItem_) {\n    return;\n  }\n\n  this.dragItem_ = item;\n\n  // Dispatch DRAGSTART event\n  var dragStartEvent = new goog.fx.DragDropEvent(\n      goog.fx.AbstractDragDrop.EventType.DRAGSTART, this, this.dragItem_,\n      undefined,  // opt_target\n      undefined,  // opt_targetItem\n      undefined,  // opt_targetElement\n      undefined,  // opt_clientX\n      undefined,  // opt_clientY\n      undefined,  // opt_x\n      undefined,  // opt_y\n      undefined,  // opt_subtarget\n      event);\n  if (this.dispatchEvent(dragStartEvent) == false) {\n    this.dragItem_ = null;\n    return;\n  }\n\n  // Get the source element and create a drag element for it.\n  var el = item.getCurrentDragElement();\n  this.dragEl_ = this.createDragElement(el);\n  var doc = goog.dom.getOwnerDocument(el);\n  doc.body.appendChild(this.dragEl_);\n\n  this.dragger_ = this.createDraggerFor(el, this.dragEl_, event);\n  this.dragger_.setScrollTarget(this.scrollTarget_);\n\n  goog.events.listen(\n      this.dragger_, goog.fx.Dragger.EventType.DRAG, this.moveDrag_, false,\n      this);\n\n  goog.events.listen(\n      this.dragger_, goog.fx.Dragger.EventType.END, this.endDrag, false, this);\n\n  // IE may issue a 'selectstart' event when dragging over an iframe even when\n  // default mousemove behavior is suppressed. If the default selectstart\n  // behavior is not suppressed, elements dragged over will show as selected.\n  goog.events.listen(\n      doc.body, goog.events.EventType.SELECTSTART, this.suppressSelect_);\n\n  this.recalculateDragTargets();\n  this.recalculateScrollableContainers();\n  this.activeTarget_ = null;\n  this.initScrollableContainerListeners_();\n  this.dragger_.startDrag(event);\n\n  event.preventDefault();\n};\n\n\n/**\n * Recalculates the geometry of this source's drag targets.  Call this\n * if the position or visibility of a drag target has changed during\n * a drag, or if targets are added or removed.\n *\n * TODO(user): this is an expensive operation;  more efficient APIs\n * may be necessary.\n */\ngoog.fx.AbstractDragDrop.prototype.recalculateDragTargets = function() {\n  this.targetList_ = [];\n  for (var target, i = 0; target = this.targets_[i]; i++) {\n    for (var itm, j = 0; itm = target.items_[j]; j++) {\n      this.addDragTarget_(target, itm);\n    }\n  }\n  if (!this.targetBox_) {\n    this.targetBox_ = new goog.math.Box(0, 0, 0, 0);\n  }\n};\n\n\n/**\n * Recalculates the current scroll positions of scrollable containers and\n * allocates targets. Call this if the position of a container changed or if\n * targets are added or removed.\n */\ngoog.fx.AbstractDragDrop.prototype.recalculateScrollableContainers =\n    function() {\n  var container, i, j, target;\n  for (i = 0; container = this.scrollableContainers_[i]; i++) {\n    container.containedTargets_ = [];\n    container.savedScrollLeft_ = container.element_.scrollLeft;\n    container.savedScrollTop_ = container.element_.scrollTop;\n    var pos = goog.style.getPageOffset(container.element_);\n    var size = goog.style.getSize(container.element_);\n    container.box_ = new goog.math.Box(\n        pos.y, pos.x + size.width, pos.y + size.height, pos.x);\n  }\n\n  for (i = 0; target = this.targetList_[i]; i++) {\n    for (j = 0; container = this.scrollableContainers_[j]; j++) {\n      if (goog.dom.contains(container.element_, target.element_)) {\n        container.containedTargets_.push(target);\n        target.scrollableContainer_ = container;\n      }\n    }\n  }\n};\n\n\n/**\n * Creates the Dragger for the drag element.\n * @param {Element} sourceEl Drag source element.\n * @param {Element} el the element created by createDragElement().\n * @param {goog.events.BrowserEvent} event Mouse down event for start of drag.\n * @return {!goog.fx.Dragger} The new Dragger.\n * @protected\n */\ngoog.fx.AbstractDragDrop.prototype.createDraggerFor = function(\n    sourceEl, el, event) {\n  // Position the drag element.\n  var pos = this.getDragElementPosition(sourceEl, el, event);\n  el.style.position = 'absolute';\n  el.style.left = pos.x + 'px';\n  el.style.top = pos.y + 'px';\n  return new goog.fx.Dragger(el);\n};\n\n\n/**\n * Event handler that's used to stop drag. Fires a drop event if over a valid\n * target.\n *\n * @param {goog.fx.DragEvent} event Drag event.\n */\ngoog.fx.AbstractDragDrop.prototype.endDrag = function(event) {\n  var activeTarget = event.dragCanceled ? null : this.activeTarget_;\n  if (activeTarget && activeTarget.target_) {\n    var clientX = event.clientX;\n    var clientY = event.clientY;\n    var scroll = this.getScrollPos();\n    var x = clientX + scroll.x;\n    var y = clientY + scroll.y;\n\n    var subtarget;\n    // If a subtargeting function is enabled get the current subtarget\n    if (this.subtargetFunction_) {\n      subtarget =\n          this.subtargetFunction_(activeTarget.item_, activeTarget.box_, x, y);\n    }\n\n    var dragEvent = new goog.fx.DragDropEvent(\n        goog.fx.AbstractDragDrop.EventType.DRAG, this, this.dragItem_,\n        activeTarget.target_, activeTarget.item_, activeTarget.element_,\n        clientX, clientY, x, y);\n    this.dispatchEvent(dragEvent);\n\n    var dropEvent = new goog.fx.DragDropEvent(\n        goog.fx.AbstractDragDrop.EventType.DROP, this, this.dragItem_,\n        activeTarget.target_, activeTarget.item_, activeTarget.element_,\n        clientX, clientY, x, y, subtarget, event.browserEvent);\n    activeTarget.target_.dispatchEvent(dropEvent);\n  }\n\n  var dragEndEvent = new goog.fx.DragDropEvent(\n      goog.fx.AbstractDragDrop.EventType.DRAGEND, this, this.dragItem_,\n      activeTarget ? activeTarget.target_ : undefined,\n      activeTarget ? activeTarget.item_ : undefined,\n      activeTarget ? activeTarget.element_ : undefined);\n  this.dispatchEvent(dragEndEvent);\n\n  goog.events.unlisten(\n      this.dragger_, goog.fx.Dragger.EventType.DRAG, this.moveDrag_, false,\n      this);\n  goog.events.unlisten(\n      this.dragger_, goog.fx.Dragger.EventType.END, this.endDrag, false, this);\n  var doc = goog.dom.getOwnerDocument(this.dragItem_.getCurrentDragElement());\n  goog.events.unlisten(\n      doc.body, goog.events.EventType.SELECTSTART, this.suppressSelect_);\n\n\n  this.afterEndDrag(this.activeTarget_ ? this.activeTarget_.item_ : null);\n};\n\n\n/**\n * Called after a drag operation has finished.\n *\n * @param {goog.fx.DragDropItem=} opt_dropTarget Target for successful drop.\n * @protected\n */\ngoog.fx.AbstractDragDrop.prototype.afterEndDrag = function(opt_dropTarget) {\n  this.disposeDrag();\n};\n\n\n/**\n * Called once a drag operation has finished. Removes event listeners and\n * elements.\n *\n * @protected\n */\ngoog.fx.AbstractDragDrop.prototype.disposeDrag = function() {\n  this.disposeScrollableContainerListeners_();\n  this.dragger_.dispose();\n\n  goog.dom.removeNode(this.dragEl_);\n  delete this.dragItem_;\n  delete this.dragEl_;\n  delete this.dragger_;\n  delete this.targetList_;\n  delete this.activeTarget_;\n};\n\n\n/**\n * Event handler for drag events. Determines the active drop target, if any, and\n * fires dragover and dragout events appropriately.\n *\n * @param {goog.fx.DragEvent} event Drag event.\n * @private\n */\ngoog.fx.AbstractDragDrop.prototype.moveDrag_ = function(event) {\n  var position = this.getEventPosition(event);\n  var x = position.x;\n  var y = position.y;\n\n  var activeTarget = this.activeTarget_;\n\n  this.dispatchEvent(\n      new goog.fx.DragDropEvent(\n          goog.fx.AbstractDragDrop.EventType.DRAG, this, this.dragItem_,\n          activeTarget ? activeTarget.target_ : undefined,\n          activeTarget ? activeTarget.item_ : undefined,\n          activeTarget ? activeTarget.element_ : undefined, event.clientX,\n          event.clientY, x, y));\n\n  // Check if we're still inside the bounds of the active target, if not fire\n  // a dragout event and proceed to find a new target.\n  var subtarget;\n  if (activeTarget) {\n    // If a subtargeting function is enabled get the current subtarget\n    if (this.subtargetFunction_ && activeTarget.target_) {\n      subtarget =\n          this.subtargetFunction_(activeTarget.item_, activeTarget.box_, x, y);\n    }\n\n    if (activeTarget.box_.contains(position) &&\n        subtarget == this.activeSubtarget_) {\n      return;\n    }\n\n    if (activeTarget.target_) {\n      var sourceDragOutEvent = new goog.fx.DragDropEvent(\n          goog.fx.AbstractDragDrop.EventType.DRAGOUT, this, this.dragItem_,\n          activeTarget.target_, activeTarget.item_, activeTarget.element_);\n      this.dispatchEvent(sourceDragOutEvent);\n\n      // The event should be dispatched the by target DragDrop so that the\n      // target DragDrop can manage these events without having to know what\n      // sources this is a target for.\n      var targetDragOutEvent = new goog.fx.DragDropEvent(\n          goog.fx.AbstractDragDrop.EventType.DRAGOUT, this, this.dragItem_,\n          activeTarget.target_, activeTarget.item_, activeTarget.element_,\n          undefined, undefined, undefined, undefined, this.activeSubtarget_);\n      activeTarget.target_.dispatchEvent(targetDragOutEvent);\n    }\n    this.activeSubtarget_ = subtarget;\n    this.activeTarget_ = null;\n  }\n\n  // Check if inside target box\n  if (this.targetBox_.contains(position)) {\n    // Search for target and fire a dragover event if found\n    activeTarget = this.activeTarget_ = this.getTargetFromPosition_(position);\n    if (activeTarget && activeTarget.target_) {\n      // If a subtargeting function is enabled get the current subtarget\n      if (this.subtargetFunction_) {\n        subtarget = this.subtargetFunction_(\n            activeTarget.item_, activeTarget.box_, x, y);\n      }\n      var sourceDragOverEvent = new goog.fx.DragDropEvent(\n          goog.fx.AbstractDragDrop.EventType.DRAGOVER, this, this.dragItem_,\n          activeTarget.target_, activeTarget.item_, activeTarget.element_);\n      sourceDragOverEvent.subtarget = subtarget;\n      this.dispatchEvent(sourceDragOverEvent);\n\n      // The event should be dispatched by the target DragDrop so that the\n      // target DragDrop can manage these events without having to know what\n      // sources this is a target for.\n      var targetDragOverEvent = new goog.fx.DragDropEvent(\n          goog.fx.AbstractDragDrop.EventType.DRAGOVER, this, this.dragItem_,\n          activeTarget.target_, activeTarget.item_, activeTarget.element_,\n          event.clientX, event.clientY, undefined, undefined, subtarget);\n      activeTarget.target_.dispatchEvent(targetDragOverEvent);\n\n    } else if (!activeTarget) {\n      // If no target was found create a dummy one so we won't have to iterate\n      // over all possible targets for every move event.\n      this.activeTarget_ = this.maybeCreateDummyTargetForPosition_(x, y);\n    }\n  }\n};\n\n\n/**\n * Event handler for suppressing selectstart events. Selecting should be\n * disabled while dragging.\n *\n * @param {goog.events.Event} event The selectstart event to suppress.\n * @return {boolean} Whether to perform default behavior.\n * @private\n */\ngoog.fx.AbstractDragDrop.prototype.suppressSelect_ = function(event) {\n  return false;\n};\n\n\n/**\n * Sets up listeners for the scrollable containers that keep track of their\n * scroll positions.\n * @private\n */\ngoog.fx.AbstractDragDrop.prototype.initScrollableContainerListeners_ =\n    function() {\n  var container, i;\n  for (i = 0; container = this.scrollableContainers_[i]; i++) {\n    goog.events.listen(\n        container.element_, goog.events.EventType.SCROLL,\n        this.containerScrollHandler_, false, this);\n  }\n};\n\n\n/**\n * Cleans up the scrollable container listeners.\n * @private\n */\ngoog.fx.AbstractDragDrop.prototype.disposeScrollableContainerListeners_ =\n    function() {\n  for (var i = 0, container; container = this.scrollableContainers_[i]; i++) {\n    goog.events.unlisten(\n        container.element_, 'scroll', this.containerScrollHandler_, false,\n        this);\n    container.containedTargets_ = [];\n  }\n};\n\n\n/**\n * Makes drag and drop aware of a target container that could scroll mid drag.\n * @param {Element} element The scroll container.\n */\ngoog.fx.AbstractDragDrop.prototype.addScrollableContainer = function(element) {\n  this.scrollableContainers_.push(new goog.fx.ScrollableContainer_(element));\n};\n\n\n/**\n * Removes all scrollable containers.\n */\ngoog.fx.AbstractDragDrop.prototype.removeAllScrollableContainers = function() {\n  this.disposeScrollableContainerListeners_();\n  this.scrollableContainers_ = [];\n};\n\n\n/**\n * Event handler for containers scrolling.\n * @param {goog.events.BrowserEvent} e The event.\n * @suppress {visibility} TODO(martone): update dependent projects.\n * @private\n */\ngoog.fx.AbstractDragDrop.prototype.containerScrollHandler_ = function(e) {\n  for (var i = 0, container; container = this.scrollableContainers_[i]; i++) {\n    if (e.target == container.element_) {\n      var deltaTop = container.savedScrollTop_ - container.element_.scrollTop;\n      var deltaLeft =\n          container.savedScrollLeft_ - container.element_.scrollLeft;\n      container.savedScrollTop_ = container.element_.scrollTop;\n      container.savedScrollLeft_ = container.element_.scrollLeft;\n\n      // When the container scrolls, it's possible that one of the targets will\n      // move to the region contained by the dummy target. Since we don't know\n      // which sides (if any) of the dummy target are defined by targets\n      // contained by this container, we are conservative and just shrink it.\n      if (this.dummyTarget_ && this.activeTarget_ == this.dummyTarget_) {\n        if (deltaTop > 0) {\n          this.dummyTarget_.box_.top += deltaTop;\n        } else {\n          this.dummyTarget_.box_.bottom += deltaTop;\n        }\n        if (deltaLeft > 0) {\n          this.dummyTarget_.box_.left += deltaLeft;\n        } else {\n          this.dummyTarget_.box_.right += deltaLeft;\n        }\n      }\n      for (var j = 0, target; target = container.containedTargets_[j]; j++) {\n        var box = target.box_;\n        box.top += deltaTop;\n        box.left += deltaLeft;\n        box.bottom += deltaTop;\n        box.right += deltaLeft;\n\n        this.calculateTargetBox_(box);\n      }\n    }\n  }\n  this.dragger_.onScroll_(e);\n};\n\n\n/**\n * Set a function that provides subtargets. A subtargeting function\n * returns an arbitrary identifier for each subtarget of an element.\n * DnD code will generate additional drag over / out events when\n * switching from subtarget to subtarget. This is useful for instance\n * if you are interested if you are on the top half or the bottom half\n * of the element.\n * The provided function will be given the DragDropItem, box, x, y\n * box is the current window coordinates occupied by element\n * x, y is the mouse position in window coordinates\n *\n * @param {Function} f The new subtarget function.\n */\ngoog.fx.AbstractDragDrop.prototype.setSubtargetFunction = function(f) {\n  this.subtargetFunction_ = f;\n};\n\n\n/**\n * Creates an element for the item being dragged.\n *\n * @param {Element} sourceEl Drag source element.\n * @return {Element} The new drag element.\n */\ngoog.fx.AbstractDragDrop.prototype.createDragElement = function(sourceEl) {\n  var dragEl = this.createDragElementInternal(sourceEl);\n  goog.asserts.assert(dragEl);\n  if (this.dragClass_) {\n    goog.dom.classlist.add(dragEl, this.dragClass_);\n  }\n\n  return dragEl;\n};\n\n\n/**\n * Returns the position for the drag element.\n *\n * @param {Element} el Drag source element.\n * @param {Element} dragEl The dragged element created by createDragElement().\n * @param {goog.events.BrowserEvent} event Mouse down event for start of drag.\n * @return {!goog.math.Coordinate} The position for the drag element.\n */\ngoog.fx.AbstractDragDrop.prototype.getDragElementPosition = function(\n    el, dragEl, event) {\n  var pos = goog.style.getPageOffset(el);\n\n  // Subtract margin from drag element position twice, once to adjust the\n  // position given by the original node and once for the drag node.\n  var marginBox = goog.style.getMarginBox(el);\n  pos.x -= (marginBox.left || 0) * 2;\n  pos.y -= (marginBox.top || 0) * 2;\n\n  return pos;\n};\n\n\n/**\n * Returns the dragger object.\n *\n * @return {goog.fx.Dragger} The dragger object used by this drag and drop\n *     instance.\n */\ngoog.fx.AbstractDragDrop.prototype.getDragger = function() {\n  return this.dragger_;\n};\n\n\n/**\n * Creates copy of node being dragged.\n *\n * @param {Element} sourceEl Element to copy.\n * @return {!Element} The clone of `sourceEl`.\n * @deprecated Use goog.fx.Dragger.cloneNode().\n * @private\n */\ngoog.fx.AbstractDragDrop.prototype.cloneNode_ = function(sourceEl) {\n  return goog.fx.Dragger.cloneNode(sourceEl);\n};\n\n\n/**\n * Generates an element to follow the cursor during dragging, given a drag\n * source element.  The default behavior is simply to clone the source element,\n * but this may be overridden in subclasses.  This method is called by\n * `createDragElement()` before the drag class is added.\n *\n * @param {Element} sourceEl Drag source element.\n * @return {!Element} The new drag element.\n * @protected\n * @suppress {deprecated}\n */\ngoog.fx.AbstractDragDrop.prototype.createDragElementInternal = function(\n    sourceEl) {\n  return this.cloneNode_(sourceEl);\n};\n\n\n/**\n * Add possible drop target for current drag operation.\n *\n * @param {goog.fx.AbstractDragDrop} target Drag handler.\n * @param {goog.fx.DragDropItem} item Item that's being dragged.\n * @private\n */\ngoog.fx.AbstractDragDrop.prototype.addDragTarget_ = function(target, item) {\n\n  // Get all the draggable elements and add each one.\n  var draggableElements = item.getDraggableElements();\n  for (var i = 0; i < draggableElements.length; i++) {\n    var draggableElement = draggableElements[i];\n\n    // Determine target position and dimension\n    var box = this.getElementBox(item, draggableElement);\n\n    this.targetList_.push(\n        new goog.fx.ActiveDropTarget_(box, target, item, draggableElement));\n\n    this.calculateTargetBox_(box);\n  }\n};\n\n\n/**\n * Calculates the position and dimension of a draggable element.\n *\n * @param {goog.fx.DragDropItem} item Item that's being dragged.\n * @param {Element} element The element to calculate the box.\n *\n * @return {!goog.math.Box} Box describing the position and dimension\n *     of element.\n * @protected\n */\ngoog.fx.AbstractDragDrop.prototype.getElementBox = function(item, element) {\n  var pos = goog.style.getPageOffset(element);\n  var size = goog.style.getSize(element);\n  return new goog.math.Box(\n      pos.y, pos.x + size.width, pos.y + size.height, pos.x);\n};\n\n\n/**\n * Calculate the outer bounds (the region all targets are inside).\n *\n * @param {goog.math.Box} box Box describing the position and dimension\n *     of a drag target.\n * @private\n */\ngoog.fx.AbstractDragDrop.prototype.calculateTargetBox_ = function(box) {\n  if (this.targetList_.length == 1) {\n    this.targetBox_ =\n        new goog.math.Box(box.top, box.right, box.bottom, box.left);\n  } else {\n    var tb = this.targetBox_;\n    tb.left = Math.min(box.left, tb.left);\n    tb.right = Math.max(box.right, tb.right);\n    tb.top = Math.min(box.top, tb.top);\n    tb.bottom = Math.max(box.bottom, tb.bottom);\n  }\n};\n\n\n/**\n * Creates a dummy target for the given cursor position. The assumption is to\n * create as big dummy target box as possible, the only constraints are:\n * - The dummy target box cannot overlap any of real target boxes.\n * - The dummy target has to contain a point with current mouse coordinates.\n *\n * NOTE: For performance reasons the box construction algorithm is kept simple\n * and it is not optimal (see example below). Currently it is O(n) in regard to\n * the number of real drop target boxes, but its result depends on the order\n * of those boxes being processed (the order in which they're added to the\n * targetList_ collection).\n *\n * The algorithm.\n * a) Assumptions\n * - Mouse pointer is in the bounding box of real target boxes.\n * - None of the boxes have negative coordinate values.\n * - Mouse pointer is not contained by any of \"real target\" boxes.\n * - For targets inside a scrollable container, the box used is the\n *   intersection of the scrollable container's box and the target's box.\n *   This is because the part of the target that extends outside the scrollable\n *   container should not be used in the clipping calculations.\n *\n * b) Outline\n * - Initialize the fake target to the bounding box of real targets.\n * - For each real target box - clip the fake target box so it does not contain\n *   that target box, but does contain the mouse pointer.\n *   -- Project the real target box, mouse pointer and fake target box onto\n *      both axes and calculate the clipping coordinates.\n *   -- Only one coordinate is used to clip the fake target box to keep the\n *      fake target as big as possible.\n *   -- If the projection of the real target box contains the mouse pointer,\n *      clipping for a given axis is not possible.\n *   -- If both clippings are possible, the clipping more distant from the\n *      mouse pointer is selected to keep bigger fake target area.\n * - Save the created fake target only if it has a big enough area.\n *\n *\n * c) Example\n * <pre>\n *        Input:           Algorithm created box:        Maximum box:\n * +---------------------+ +---------------------+ +---------------------+\n * | B1      |        B2 | | B1               B2 | | B1               B2 |\n * |         |           | |   +-------------+   | |+-------------------+|\n * |---------x-----------| |   |             |   | ||                   ||\n * |         |           | |   |             |   | ||                   ||\n * |         |           | |   |             |   | ||                   ||\n * |         |           | |   |             |   | ||                   ||\n * |         |           | |   |             |   | ||                   ||\n * |         |           | |   +-------------+   | |+-------------------+|\n * | B4      |        B3 | | B4               B3 | | B4               B3 |\n * +---------------------+ +---------------------+ +---------------------+\n * </pre>\n *\n * @param {number} x Cursor position on the x-axis.\n * @param {number} y Cursor position on the y-axis.\n * @return {goog.fx.ActiveDropTarget_} Dummy drop target.\n * @private\n */\ngoog.fx.AbstractDragDrop.prototype.maybeCreateDummyTargetForPosition_ =\n    function(x, y) {\n  if (!this.dummyTarget_) {\n    this.dummyTarget_ = new goog.fx.ActiveDropTarget_(this.targetBox_.clone());\n  }\n  var fakeTargetBox = this.dummyTarget_.box_;\n\n  // Initialize the fake target box to the bounding box of DnD targets.\n  fakeTargetBox.top = this.targetBox_.top;\n  fakeTargetBox.right = this.targetBox_.right;\n  fakeTargetBox.bottom = this.targetBox_.bottom;\n  fakeTargetBox.left = this.targetBox_.left;\n\n  // Clip the fake target based on mouse position and DnD target boxes.\n  for (var i = 0, target; target = this.targetList_[i]; i++) {\n    var box = target.box_;\n\n    if (target.scrollableContainer_) {\n      // If the target has a scrollable container, use the intersection of that\n      // container's box and the target's box.\n      var scrollBox = target.scrollableContainer_.box_;\n\n      box = new goog.math.Box(\n          Math.max(box.top, scrollBox.top),\n          Math.min(box.right, scrollBox.right),\n          Math.min(box.bottom, scrollBox.bottom),\n          Math.max(box.left, scrollBox.left));\n    }\n\n    // Calculate clipping coordinates for horizontal and vertical axis.\n    // The clipping coordinate is calculated by projecting fake target box,\n    // the mouse pointer and DnD target box onto an axis and checking how\n    // box projections overlap and if the projected DnD target box contains\n    // mouse pointer. The clipping coordinate cannot be computed and is set to\n    // a negative value if the projected DnD target contains the mouse pointer.\n\n    var horizontalClip = null;  // Assume mouse is above or below the DnD box.\n    if (x >= box.right) {       // Mouse is to the right of the DnD box.\n      // Clip the fake box only if the DnD box overlaps it.\n      horizontalClip =\n          box.right > fakeTargetBox.left ? box.right : fakeTargetBox.left;\n    } else if (x < box.left) {  // Mouse is to the left of the DnD box.\n      // Clip the fake box only if the DnD box overlaps it.\n      horizontalClip =\n          box.left < fakeTargetBox.right ? box.left : fakeTargetBox.right;\n    }\n    var verticalClip = null;\n    if (y >= box.bottom) {\n      verticalClip =\n          box.bottom > fakeTargetBox.top ? box.bottom : fakeTargetBox.top;\n    } else if (y < box.top) {\n      verticalClip =\n          box.top < fakeTargetBox.bottom ? box.top : fakeTargetBox.bottom;\n    }\n\n    // If both clippings are possible, choose one that gives us larger distance\n    // to mouse pointer (mark the shorter clipping as impossible, by setting it\n    // to null).\n    if (horizontalClip !== null && verticalClip !== null) {\n      if (Math.abs(horizontalClip - x) > Math.abs(verticalClip - y)) {\n        verticalClip = null;\n      } else {\n        horizontalClip = null;\n      }\n    }\n\n    // Clip none or one of fake target box sides (at most one clipping\n    // coordinate can be active).\n    if (horizontalClip !== null) {\n      if (horizontalClip <= x) {\n        fakeTargetBox.left = horizontalClip;\n      } else {\n        fakeTargetBox.right = horizontalClip;\n      }\n    } else if (verticalClip !== null) {\n      if (verticalClip <= y) {\n        fakeTargetBox.top = verticalClip;\n      } else {\n        fakeTargetBox.bottom = verticalClip;\n      }\n    }\n  }\n\n  // Only return the new fake target if it is big enough.\n  return (fakeTargetBox.right - fakeTargetBox.left) *\n              (fakeTargetBox.bottom - fakeTargetBox.top) >=\n          goog.fx.AbstractDragDrop.DUMMY_TARGET_MIN_SIZE_ ?\n      this.dummyTarget_ :\n      null;\n};\n\n\n/**\n * Returns the target for a given cursor position.\n *\n * @param {goog.math.Coordinate} position Cursor position.\n * @return {goog.fx.ActiveDropTarget_} Target for position or null if no target\n *     was defined for the given position.\n * @private\n */\ngoog.fx.AbstractDragDrop.prototype.getTargetFromPosition_ = function(position) {\n  for (var target, i = 0; target = this.targetList_[i]; i++) {\n    if (target.box_.contains(position)) {\n      if (target.scrollableContainer_) {\n        // If we have a scrollable container we will need to make sure\n        // we account for clipping of the scroll area\n        var box = target.scrollableContainer_.box_;\n        if (box.contains(position)) {\n          return target;\n        }\n      } else {\n        return target;\n      }\n    }\n  }\n\n  return null;\n};\n\n\n/**\n * Checks whatever a given point is inside a given box.\n *\n * @param {number} x Cursor position on the x-axis.\n * @param {number} y Cursor position on the y-axis.\n * @param {goog.math.Box} box Box to check position against.\n * @return {boolean} Whether the given point is inside `box`.\n * @protected\n * @deprecated Use goog.math.Box.contains.\n */\ngoog.fx.AbstractDragDrop.prototype.isInside = function(x, y, box) {\n  return x >= box.left && x < box.right && y >= box.top && y < box.bottom;\n};\n\n\n/**\n * Gets the scroll distance as a coordinate object, using\n * the window of the current drag element's dom.\n * @return {!goog.math.Coordinate} Object with scroll offsets 'x' and 'y'.\n * @protected\n */\ngoog.fx.AbstractDragDrop.prototype.getScrollPos = function() {\n  return goog.dom.getDomHelper(this.dragEl_).getDocumentScroll();\n};\n\n\n/**\n * Get the position of a drag event.\n * @param {goog.fx.DragEvent} event Drag event.\n * @return {!goog.math.Coordinate} Position of the event.\n * @protected\n */\ngoog.fx.AbstractDragDrop.prototype.getEventPosition = function(event) {\n  var scroll = this.getScrollPos();\n  return new goog.math.Coordinate(\n      event.clientX + scroll.x, event.clientY + scroll.y);\n};\n\n\n/**\n * @override\n * @protected\n */\ngoog.fx.AbstractDragDrop.prototype.disposeInternal = function() {\n  goog.fx.AbstractDragDrop.base(this, 'disposeInternal');\n  this.removeItems();\n};\n\n\n\n/**\n * Object representing a drag and drop event.\n *\n * @param {string} type Event type.\n * @param {goog.fx.AbstractDragDrop} source Source drag drop object.\n * @param {goog.fx.DragDropItem} sourceItem Source item.\n * @param {goog.fx.AbstractDragDrop=} opt_target Target drag drop object.\n * @param {goog.fx.DragDropItem=} opt_targetItem Target item.\n * @param {Element=} opt_targetElement Target element.\n * @param {number=} opt_clientX X-Position relative to the screen.\n * @param {number=} opt_clientY Y-Position relative to the screen.\n * @param {number=} opt_x X-Position relative to the viewport.\n * @param {number=} opt_y Y-Position relative to the viewport.\n * @param {Object=} opt_subtarget The currently active subtarget.\n * @param {goog.events.BrowserEvent=} opt_browserEvent The browser event\n *     that caused this dragdrop event.\n * @extends {goog.events.Event}\n * @constructor\n * @struct\n */\ngoog.fx.DragDropEvent = function(\n    type, source, sourceItem, opt_target, opt_targetItem, opt_targetElement,\n    opt_clientX, opt_clientY, opt_x, opt_y, opt_subtarget, opt_browserEvent) {\n  // TODO(eae): Get rid of all the optional parameters and have the caller set\n  // the fields directly instead.\n  goog.fx.DragDropEvent.base(this, 'constructor', type);\n\n  /**\n   * Reference to the source goog.fx.AbstractDragDrop object.\n   * @type {goog.fx.AbstractDragDrop}\n   */\n  this.dragSource = source;\n\n  /**\n   * Reference to the source goog.fx.DragDropItem object.\n   * @type {goog.fx.DragDropItem}\n   */\n  this.dragSourceItem = sourceItem;\n\n  /**\n   * Reference to the target goog.fx.AbstractDragDrop object.\n   * @type {goog.fx.AbstractDragDrop|undefined}\n   */\n  this.dropTarget = opt_target;\n\n  /**\n   * Reference to the target goog.fx.DragDropItem object.\n   * @type {goog.fx.DragDropItem|undefined}\n   */\n  this.dropTargetItem = opt_targetItem;\n\n  /**\n   * The actual element of the drop target that is the target for this event.\n   * @type {Element|undefined}\n   */\n  this.dropTargetElement = opt_targetElement;\n\n  /**\n   * X-Position relative to the screen.\n   * @type {number|undefined}\n   */\n  this.clientX = opt_clientX;\n\n  /**\n   * Y-Position relative to the screen.\n   * @type {number|undefined}\n   */\n  this.clientY = opt_clientY;\n\n  /**\n   * X-Position relative to the viewport.\n   * @type {number|undefined}\n   */\n  this.viewportX = opt_x;\n\n  /**\n   * Y-Position relative to the viewport.\n   * @type {number|undefined}\n   */\n  this.viewportY = opt_y;\n\n  /**\n   * The subtarget that is currently active if a subtargeting function\n   * is supplied.\n   * @type {Object|undefined}\n   */\n  this.subtarget = opt_subtarget;\n\n  /**\n   * The browser event that caused this dragdrop event.\n   * @const\n   */\n  this.browserEvent = opt_browserEvent;\n};\ngoog.inherits(goog.fx.DragDropEvent, goog.events.Event);\n\n\n\n/**\n * Class representing a source or target element for drag and drop operations.\n *\n * @param {Element|string} element Dom Node, or string representation of node\n *     id, to be used as drag source/drop target.\n * @param {Object=} opt_data Data associated with the source/target.\n * @throws Error If no element argument is provided or if the type is invalid\n * @extends {goog.events.EventTarget}\n * @constructor\n * @struct\n */\ngoog.fx.DragDropItem = function(element, opt_data) {\n  goog.fx.DragDropItem.base(this, 'constructor');\n\n  /**\n   * Reference to drag source/target element\n   * @type {Element}\n   */\n  this.element = goog.dom.getElement(element);\n\n  /**\n   * Data associated with element.\n   * @type {Object|undefined}\n   */\n  this.data = opt_data;\n\n  /**\n   * Drag object the item belongs to.\n   * @type {goog.fx.AbstractDragDrop?}\n   * @private\n   */\n  this.parent_ = null;\n\n  /**\n   * Event handler for listeners on events that can initiate a drag.\n   * @type {!goog.events.EventHandler<!goog.fx.DragDropItem>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n  this.registerDisposable(this.eventHandler_);\n\n  /**\n   * The current element being dragged. This is needed because a DragDropItem\n   * can have multiple elements that can be dragged.\n   * @private {?Element}\n   */\n  this.currentDragElement_ = null;\n\n  /** @private {?goog.math.Coordinate} */\n  this.startPosition_;\n\n  if (!this.element) {\n    throw new Error('Invalid argument');\n  }\n};\ngoog.inherits(goog.fx.DragDropItem, goog.events.EventTarget);\n\n\n/**\n * Get the data associated with the source/target.\n * @return {Object|null|undefined} Data associated with the source/target.\n */\ngoog.fx.DragDropItem.prototype.getData = function() {\n  return this.data;\n};\n\n\n/**\n * Gets the element that is actually draggable given that the given target was\n * attempted to be dragged. This should be overridden when the element that was\n * given actually contains many items that can be dragged. From the target, you\n * can determine what element should actually be dragged.\n *\n * @param {Element} target The target that was attempted to be dragged.\n * @return {Element} The element that is draggable given the target. If\n *     none are draggable, this will return null.\n */\ngoog.fx.DragDropItem.prototype.getDraggableElement = function(target) {\n  return target;\n};\n\n\n/**\n * Gets the element that is currently being dragged.\n *\n * @return {Element} The element that is currently being dragged.\n */\ngoog.fx.DragDropItem.prototype.getCurrentDragElement = function() {\n  return this.currentDragElement_;\n};\n\n\n/**\n * Gets all the elements of this item that are potentially draggable/\n *\n * @return {!Array<Element>} The draggable elements.\n */\ngoog.fx.DragDropItem.prototype.getDraggableElements = function() {\n  return [this.element];\n};\n\n\n/**\n * Event handler for mouse down.\n *\n * @param {goog.events.BrowserEvent} event Mouse down event.\n * @private\n */\ngoog.fx.DragDropItem.prototype.mouseDown_ = function(event) {\n  if (!event.isMouseActionButton()) {\n    return;\n  }\n\n  // Get the draggable element for the target.\n  var element = this.getDraggableElement(/** @type {Element} */ (event.target));\n  if (element) {\n    this.maybeStartDrag_(event, element);\n  }\n};\n\n\n/**\n * Sets the dragdrop to which this item belongs.\n * @param {goog.fx.AbstractDragDrop} parent The parent dragdrop.\n */\ngoog.fx.DragDropItem.prototype.setParent = function(parent) {\n  this.parent_ = parent;\n};\n\n\n/**\n * Adds mouse move, mouse out and mouse up handlers.\n *\n * @param {goog.events.BrowserEvent} event Mouse down event.\n * @param {Element} element Element.\n * @private\n */\ngoog.fx.DragDropItem.prototype.maybeStartDrag_ = function(event, element) {\n  var eventType = goog.events.EventType;\n  this.eventHandler_\n      .listen(element, eventType.MOUSEMOVE, this.mouseMove_, false)\n      .listen(element, eventType.MOUSEOUT, this.mouseMove_, false);\n\n  // Capture the MOUSEUP on the document to ensure that we cancel the start\n  // drag handlers even if the mouse up occurs on some other element. This can\n  // happen for instance when the mouse down changes the geometry of the element\n  // clicked on (e.g. through changes in activation styling) such that the mouse\n  // up occurs outside the original element.\n  var doc = goog.dom.getOwnerDocument(element);\n  this.eventHandler_.listen(doc, eventType.MOUSEUP, this.mouseUp_, true);\n\n  this.currentDragElement_ = element;\n\n  this.startPosition_ = new goog.math.Coordinate(event.clientX, event.clientY);\n};\n\n\n/**\n * Event handler for mouse move. Starts drag operation if moved more than the\n * threshold value.\n *\n * @param {goog.events.BrowserEvent} event Mouse move or mouse out event.\n * @private\n */\ngoog.fx.DragDropItem.prototype.mouseMove_ = function(event) {\n  var distance = Math.abs(event.clientX - this.startPosition_.x) +\n      Math.abs(event.clientY - this.startPosition_.y);\n  // Fire dragStart event if the drag distance exceeds the threshold or if the\n  // mouse leave the dragged element.\n  // TODO(user): Consider using the goog.fx.Dragger to track the distance\n  // even after the mouse leaves the dragged element.\n  var currentDragElement = this.currentDragElement_;\n  var distanceAboveThreshold =\n      distance > goog.fx.AbstractDragDrop.initDragDistanceThreshold;\n  var mouseOutOnDragElement = event.type == goog.events.EventType.MOUSEOUT &&\n      event.target == currentDragElement;\n  if (distanceAboveThreshold || mouseOutOnDragElement) {\n    this.eventHandler_.removeAll();\n    this.parent_.startDrag(event, this);\n  }\n\n  // Prevent text selection while dragging an element.\n  event.preventDefault();\n};\n\n\n/**\n * Event handler for mouse up. Removes mouse move, mouse out and mouse up event\n * handlers.\n *\n * @param {goog.events.BrowserEvent} event Mouse up event.\n * @private\n */\ngoog.fx.DragDropItem.prototype.mouseUp_ = function(event) {\n  this.eventHandler_.removeAll();\n  delete this.startPosition_;\n  this.currentDragElement_ = null;\n};\n\n\n\n/**\n * Class representing an active drop target\n *\n * @param {goog.math.Box} box Box describing the position and dimension of the\n *     target item.\n * @param {goog.fx.AbstractDragDrop=} opt_target Target that contains the item\n       associated with position.\n * @param {goog.fx.DragDropItem=} opt_item Item associated with position.\n * @param {Element=} opt_element Element of item associated with position.\n * @constructor\n * @struct\n * @private\n */\ngoog.fx.ActiveDropTarget_ = function(box, opt_target, opt_item, opt_element) {\n\n  /**\n   * Box describing the position and dimension of the target item\n   * @type {goog.math.Box}\n   * @private\n   */\n  this.box_ = box;\n\n  /**\n   * Target that contains the item associated with position\n   * @type {goog.fx.AbstractDragDrop|undefined}\n   * @private\n   */\n  this.target_ = opt_target;\n\n  /**\n   * Item associated with position\n   * @type {goog.fx.DragDropItem|undefined}\n   * @private\n   */\n  this.item_ = opt_item;\n\n  /**\n   * The draggable element of the item associated with position.\n   * @type {Element}\n   * @private\n   */\n  this.element_ = opt_element || null;\n\n  /**\n   * If this target is in a scrollable container this is it.\n   * @private {?goog.fx.ScrollableContainer_}\n   */\n  this.scrollableContainer_ = null;\n};\n\n\n\n/**\n * Class for representing a scrollable container\n * @param {Element} element the scrollable element.\n * @constructor\n * @private\n */\ngoog.fx.ScrollableContainer_ = function(element) {\n\n  /**\n   * The targets that lie within this container.\n   * @type {Array<goog.fx.ActiveDropTarget_>}\n   * @private\n   */\n  this.containedTargets_ = [];\n\n  /**\n   * The element that is this container\n   * @type {Element}\n   * @private\n   */\n  this.element_ = element;\n\n  /**\n   * The saved scroll left location for calculating deltas.\n   * @type {number}\n   * @private\n   */\n  this.savedScrollLeft_ = 0;\n\n  /**\n   * The saved scroll top location for calculating deltas.\n   * @type {number}\n   * @private\n   */\n  this.savedScrollTop_ = 0;\n\n  /**\n   * The space occupied by the container.\n   * @type {?goog.math.Box}\n   * @private\n   */\n  this.box_ = null;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^1>","^1T","^1M","^?","^3W","~$goog.fx.Dragger","^3<","^1C","^3=","^1F","^2Y","^2O","^1<"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/abstractdragdrop.js"],"^O",["^=",["~$goog.fx.DragDropEvent","^6Q","^6R","~$goog.fx.AbstractDragDrop.EventType"]],"^W",true,"^X",["^?","^2O","^1L","^1>","^1M","^1<","^2Y","^1T","^3W","^1C","^@U","^3<","^3=","^1F"]],["^ ","^3",[1579837703000],"^4","goog.testing.mockmatchers.js","^5",["^6","goog/testing/mockmatchers.js"],"^7","goog/testing/mockmatchers.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Matchers to be used with the mock utilities.  They allow for\n * flexible matching by type.  Custom matchers can be created by passing a\n * matcher function into an ArgumentMatcher instance.\n *\n * For examples, please see the unit test.\n *\n */\n\n\ngoog.setTestOnly('goog.testing.mockmatchers');\ngoog.provide('goog.testing.mockmatchers');\ngoog.provide('goog.testing.mockmatchers.ArgumentMatcher');\ngoog.provide('goog.testing.mockmatchers.IgnoreArgument');\ngoog.provide('goog.testing.mockmatchers.InstanceOf');\ngoog.provide('goog.testing.mockmatchers.ObjectEquals');\ngoog.provide('goog.testing.mockmatchers.RegexpMatch');\ngoog.provide('goog.testing.mockmatchers.SaveArgument');\ngoog.provide('goog.testing.mockmatchers.TypeOf');\n\ngoog.forwardDeclare('goog.testing.MockExpectation');\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.testing.asserts');  // circular\n\n\n\n/**\n * A simple interface for executing argument matching.  A match in this case is\n * testing to see if a supplied object fits a given criteria.  True is returned\n * if the given criteria is met.\n * @param {Function=} opt_matchFn A function that evaluates a given argument\n *     and returns true if it meets a given criteria.\n * @param {?string=} opt_matchName The name expressing intent as part of\n *      an error message for when a match fails.\n * @constructor\n */\ngoog.testing.mockmatchers.ArgumentMatcher = function(\n    opt_matchFn, opt_matchName) {\n  /**\n   * A function that evaluates a given argument and returns true if it meets a\n   * given criteria.\n   * @type {Function}\n   * @private\n   */\n  this.matchFn_ = opt_matchFn || null;\n\n  /**\n   * A string indicating the match intent (e.g. isBoolean or isString).\n   * @type {?string}\n   * @private\n   */\n  this.matchName_ = opt_matchName || null;\n};\n\n\n/**\n * A function that takes a match argument and an optional MockExpectation\n * which (if provided) will get error information and returns whether or\n * not it matches.\n * @param {*} toVerify The argument that should be verified.\n * @param {?goog.testing.MockExpectation=} opt_expectation The expectation\n *     for this match.\n * @return {boolean} Whether or not a given argument passes verification.\n */\ngoog.testing.mockmatchers.ArgumentMatcher.prototype.matches = function(\n    toVerify, opt_expectation) {\n  if (this.matchFn_) {\n    var isamatch = this.matchFn_(toVerify);\n    if (!isamatch && opt_expectation) {\n      if (this.matchName_) {\n        opt_expectation.addErrorMessage(\n            'Expected: ' + this.matchName_ + ' but was: ' +\n            _displayStringForValue(toVerify));\n      } else {\n        opt_expectation.addErrorMessage(\n            'Expected: missing mockmatcher' +\n            ' description but was: ' + _displayStringForValue(toVerify));\n      }\n    }\n    return isamatch;\n  } else {\n    throw new Error('No match function defined for this mock matcher');\n  }\n};\n\n\n\n/**\n * A matcher that verifies that an argument is an instance of a given class.\n * @param {Function} ctor The class that will be used for verification.\n * @constructor\n * @extends {goog.testing.mockmatchers.ArgumentMatcher}\n * @final\n */\ngoog.testing.mockmatchers.InstanceOf = function(ctor) {\n  goog.testing.mockmatchers.ArgumentMatcher.call(this, function(obj) {\n    return obj instanceof ctor;\n    // NOTE: Browser differences on ctor.toString() output\n    // make using that here problematic. So for now, just let\n    // people know the instanceOf() failed without providing\n    // browser specific details...\n  }, 'instanceOf()');\n};\ngoog.inherits(\n    goog.testing.mockmatchers.InstanceOf,\n    goog.testing.mockmatchers.ArgumentMatcher);\n\n\n\n/**\n * A matcher that verifies that an argument is of a given type (e.g. \"object\").\n * @param {string} type The type that a given argument must have.\n * @constructor\n * @extends {goog.testing.mockmatchers.ArgumentMatcher}\n * @final\n */\ngoog.testing.mockmatchers.TypeOf = function(type) {\n  goog.testing.mockmatchers.ArgumentMatcher.call(this, function(obj) {\n    return goog.typeOf(obj) == type;\n  }, 'typeOf(' + type + ')');\n};\ngoog.inherits(\n    goog.testing.mockmatchers.TypeOf,\n    goog.testing.mockmatchers.ArgumentMatcher);\n\n\n\n/**\n * A matcher that verifies that an argument matches a given RegExp.\n * @param {RegExp} regexp The regular expression that the argument must match.\n * @constructor\n * @extends {goog.testing.mockmatchers.ArgumentMatcher}\n * @final\n */\ngoog.testing.mockmatchers.RegexpMatch = function(regexp) {\n  goog.testing.mockmatchers.ArgumentMatcher.call(this, function(str) {\n    return regexp.test(str);\n  }, 'match(' + regexp + ')');\n};\ngoog.inherits(\n    goog.testing.mockmatchers.RegexpMatch,\n    goog.testing.mockmatchers.ArgumentMatcher);\n\n\n\n/**\n * A matcher that always returns true. It is useful when the user does not care\n * for some arguments.\n * For example: mockFunction('username', 'password', new IgnoreArgument());\n * @constructor\n * @extends {goog.testing.mockmatchers.ArgumentMatcher}\n * @final\n */\ngoog.testing.mockmatchers.IgnoreArgument = function() {\n  goog.testing.mockmatchers.ArgumentMatcher.call(\n      this, function() { return true; }, 'true');\n};\ngoog.inherits(\n    goog.testing.mockmatchers.IgnoreArgument,\n    goog.testing.mockmatchers.ArgumentMatcher);\n\n\n\n/**\n * A matcher that verifies that the argument is an object that equals the given\n * expected object, using a deep comparison.\n * @param {Object} expectedObject An object to match against when\n *     verifying the argument.\n * @constructor\n * @extends {goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.testing.mockmatchers.ObjectEquals = function(expectedObject) {\n  /** @private */\n  this.expectedObject_ = expectedObject;\n};\ngoog.inherits(\n    goog.testing.mockmatchers.ObjectEquals,\n    goog.testing.mockmatchers.ArgumentMatcher);\n\n\n/** @override */\ngoog.testing.mockmatchers.ObjectEquals.prototype.matches = function(\n    toVerify, opt_expectation) {\n  // Override the default matches implementation to provide a custom error\n  // message to opt_expectation if it exists.\n  var differences =\n      goog.testing.asserts.findDifferences(this.expectedObject_, toVerify);\n  if (differences) {\n    if (opt_expectation) {\n      opt_expectation.addErrorMessage('Expected equal objects\\n' + differences);\n    }\n    return false;\n  }\n  return true;\n};\n\n\n\n/**\n * A matcher that saves the argument that it is verifying so that your unit test\n * can perform extra tests with this argument later.  For example, if the\n * argument is a callback method, the unit test can then later call this\n * callback to test the asynchronous portion of the call.\n * @param {goog.testing.mockmatchers.ArgumentMatcher|Function=} opt_matcher\n *     Argument matcher or matching function that will be used to validate the\n *     argument.  By default, argument will always be valid.\n * @param {?string=} opt_matchName The name expressing intent as part of\n *      an error message for when a match fails.\n * @constructor\n * @extends {goog.testing.mockmatchers.ArgumentMatcher}\n * @final\n */\ngoog.testing.mockmatchers.SaveArgument = function(opt_matcher, opt_matchName) {\n  goog.testing.mockmatchers.ArgumentMatcher.call(\n      this, /** @type {Function} */ (opt_matcher), opt_matchName);\n\n  /**\n   * All saved arguments that were verified.\n   * @const {!Array<*>}\n   */\n  this.allArgs = [];\n\n  if (opt_matcher instanceof goog.testing.mockmatchers.ArgumentMatcher) {\n    /**\n     * Delegate match requests to this matcher.\n     * @type {goog.testing.mockmatchers.ArgumentMatcher}\n     * @private\n     */\n    this.delegateMatcher_ = opt_matcher;\n  } else if (!opt_matcher) {\n    this.delegateMatcher_ = goog.testing.mockmatchers.ignoreArgument;\n  }\n};\ngoog.inherits(\n    goog.testing.mockmatchers.SaveArgument,\n    goog.testing.mockmatchers.ArgumentMatcher);\n\n\n/** @override */\ngoog.testing.mockmatchers.SaveArgument.prototype.matches = function(\n    toVerify, opt_expectation) {\n  this.arg = toVerify;\n  this.allArgs.push(toVerify);\n  if (this.delegateMatcher_) {\n    return this.delegateMatcher_.matches(toVerify, opt_expectation);\n  }\n  return goog.testing.mockmatchers.SaveArgument.superClass_.matches.call(\n      this, toVerify, opt_expectation);\n};\n\n\n/**\n * The last (or only) saved argument that was verified.\n * @type {*}\n */\ngoog.testing.mockmatchers.SaveArgument.prototype.arg;\n\n\n/**\n * An instance of the IgnoreArgument matcher. Returns true for all matches.\n * @type {!goog.testing.mockmatchers.IgnoreArgument}\n */\ngoog.testing.mockmatchers.ignoreArgument =\n    new goog.testing.mockmatchers.IgnoreArgument();\n\n\n/**\n * A matcher that verifies that an argument is an array.\n * @type {!goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.testing.mockmatchers.isArray =\n    new goog.testing.mockmatchers.ArgumentMatcher(goog.isArray, 'isArray');\n\n\n/**\n * A matcher that verifies that an argument is a array-like.  A NodeList is an\n * example of a collection that is very close to an array.\n * @type {!goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.testing.mockmatchers.isArrayLike =\n    new goog.testing.mockmatchers.ArgumentMatcher(\n        goog.isArrayLike, 'isArrayLike');\n\n\n/**\n * A matcher that verifies that an argument is a date-like.\n * @type {!goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.testing.mockmatchers.isDateLike =\n    new goog.testing.mockmatchers.ArgumentMatcher(\n        goog.isDateLike, 'isDateLike');\n\n\n/**\n * A matcher that verifies that an argument is a string.\n * @type {!goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.testing.mockmatchers.isString =\n    new goog.testing.mockmatchers.ArgumentMatcher(goog.isString, 'isString');\n\n\n/**\n * A matcher that verifies that an argument is a boolean.\n * @type {!goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.testing.mockmatchers.isBoolean =\n    new goog.testing.mockmatchers.ArgumentMatcher(goog.isBoolean, 'isBoolean');\n\n\n/**\n * A matcher that verifies that an argument is a number.\n * @type {!goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.testing.mockmatchers.isNumber =\n    new goog.testing.mockmatchers.ArgumentMatcher(goog.isNumber, 'isNumber');\n\n\n/**\n * A matcher that verifies that an argument is a function.\n * @type {!goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.testing.mockmatchers.isFunction =\n    new goog.testing.mockmatchers.ArgumentMatcher(\n        goog.isFunction, 'isFunction');\n\n\n/**\n * A matcher that verifies that an argument is an object.\n * @type {!goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.testing.mockmatchers.isObject =\n    new goog.testing.mockmatchers.ArgumentMatcher(goog.isObject, 'isObject');\n\n\n/**\n * A matcher that verifies that an argument is like a DOM node.\n * @type {!goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.testing.mockmatchers.isNodeLike =\n    new goog.testing.mockmatchers.ArgumentMatcher(\n        goog.dom.isNodeLike, 'isNodeLike');\n\n\n/**\n * A function that checks to see if an array matches a given set of\n * expectations.  The expectations array can be a mix of ArgumentMatcher\n * implementations and values.  True will be returned if values are identical or\n * if a matcher returns a positive result.\n * @param {Array<?>} expectedArr An array of expectations which can be either\n *     values to check for equality or ArgumentMatchers.\n * @param {Array<?>} arr The array to match.\n * @param {goog.testing.MockExpectation?=} opt_expectation The expectation\n *     for this match.\n * @return {boolean} Whether or not the given array matches the expectations.\n */\ngoog.testing.mockmatchers.flexibleArrayMatcher = function(\n    expectedArr, arr, opt_expectation) {\n  return goog.array.equals(expectedArr, arr, function(a, b) {\n    var errCount = 0;\n    if (opt_expectation) {\n      errCount = opt_expectation.getErrorMessageCount();\n    }\n    var isamatch = a === b ||\n        a instanceof goog.testing.mockmatchers.ArgumentMatcher &&\n            a.matches(b, opt_expectation);\n    var failureMessage = null;\n    if (!isamatch) {\n      failureMessage = goog.testing.asserts.findDifferences(a, b);\n      isamatch = !failureMessage;\n    }\n    if (!isamatch && opt_expectation) {\n      // If the error count changed, the match sent out an error\n      // message. If the error count has not changed, then\n      // we need to send out an error message...\n      if (errCount == opt_expectation.getErrorMessageCount()) {\n        // Use the _displayStringForValue() from assert.js\n        // for consistency...\n        if (!failureMessage) {\n          failureMessage = 'Expected: ' + _displayStringForValue(a) +\n              ' but was: ' + _displayStringForValue(b);\n        }\n        opt_expectation.addErrorMessage(failureMessage);\n      }\n    }\n    return isamatch;\n  });\n};\n","^;",1579837703000,"^<",["^=",["^1>","^5[","^?","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/mockmatchers.js"],"^O",["^=",["~$goog.testing.mockmatchers.ObjectEquals","~$goog.testing.mockmatchers.ArgumentMatcher","~$goog.testing.mockmatchers.InstanceOf","~$goog.testing.mockmatchers.IgnoreArgument","~$goog.testing.mockmatchers.TypeOf","~$goog.testing.mockmatchers.SaveArgument","~$goog.testing.mockmatchers.RegexpMatch","^;3"]],"^W",true,"^X",["^?","^2O","^1>","^5["]],["^ ","^3",[1579837703000],"^4","goog.net.networkstatusmonitor.js","^5",["^6","goog/net/networkstatusmonitor.js"],"^7","goog/net/networkstatusmonitor.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Base class for objects monitoring and exposing runtime\n * network status information.\n */\n\ngoog.provide('goog.net.NetworkStatusMonitor');\n\ngoog.require('goog.events.Listenable');\n\n\n\n/**\n * Base class for network status information providers.\n * @interface\n * @extends {goog.events.Listenable}\n */\ngoog.net.NetworkStatusMonitor = function() {};\n\n\n/**\n * Enum for the events dispatched by the OnlineHandler.\n * @enum {string}\n */\ngoog.net.NetworkStatusMonitor.EventType = {\n  ONLINE: 'online',\n  OFFLINE: 'offline'\n};\n\n\n/**\n * @return {boolean} Whether the system is online or otherwise.\n */\ngoog.net.NetworkStatusMonitor.prototype.isOnline;\n","^;",1579837703000,"^<",["^=",["^4U","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/networkstatusmonitor.js"],"^O",["^=",["~$goog.net.NetworkStatusMonitor"]],"^W",true,"^X",["^?","^4U"]],["^ ","^3",[1579837703000],"^4","goog.i18n.uchar.localnamefetcher.js","^5",["^6","goog/i18n/uchar/localnamefetcher.js"],"^7","goog/i18n/uchar/localnamefetcher.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Object which fetches Unicode codepoint names that are locally\n * stored in a bundled database. Currently, only invisible characters are\n * covered by this database. See the goog.i18n.uChar.RemoteNameFetcher class for\n * a remote database option.\n */\n\ngoog.provide('goog.i18n.uChar.LocalNameFetcher');\n\ngoog.require('goog.i18n.uChar.NameFetcher');\ngoog.require('goog.i18n.uCharNames');\ngoog.require('goog.log');\n\n\n\n/**\n * Builds the NameFetcherLocal object. This is a simple object which retrieves\n * character names from a local bundled database. This database only covers\n * invisible characters. See the goog.i18n.uChar class for more details.\n *\n * @constructor\n * @implements {goog.i18n.uChar.NameFetcher}\n * @final\n */\ngoog.i18n.uChar.LocalNameFetcher = function() {};\n\n\n/**\n * A reference to the LocalNameFetcher logger.\n *\n * @type {goog.log.Logger}\n * @private\n */\ngoog.i18n.uChar.LocalNameFetcher.logger_ =\n    goog.log.getLogger('goog.i18n.uChar.LocalNameFetcher');\n\n\n/** @override */\ngoog.i18n.uChar.LocalNameFetcher.prototype.prefetch = function(character) {};\n\n\n/** @override */\ngoog.i18n.uChar.LocalNameFetcher.prototype.getName = function(\n    character, callback) {\n  var localName = goog.i18n.uCharNames.toName(character);\n  if (!localName) {\n    goog.i18n.uChar.LocalNameFetcher.logger_.warning(\n        'No local name defined for character ' + character);\n  }\n  callback(localName);\n};\n\n\n/** @override */\ngoog.i18n.uChar.LocalNameFetcher.prototype.isNameAvailable = function(\n    character) {\n  return !!goog.i18n.uCharNames.toName(character);\n};\n","^;",1579837703000,"^<",["^=",["^?","^18","^71","^1;"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/uchar/localnamefetcher.js"],"^O",["^=",["~$goog.i18n.uChar.LocalNameFetcher"]],"^W",true,"^X",["^?","^1;","^71","^18"]],["^ ","^3",[1579837703000],"^4","goog.labs.testing.json_fuzzing.js","^5",["^6","goog/labs/testing/json_fuzzing.js"],"^7","goog/labs/testing/json_fuzzing.js","^8","^9","^:","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview a fuzzing JSON generator.\n *\n * This class generates a random JSON-compatible array object under the\n * following rules, (n) n being the relative weight of enum/discrete values\n * of a stochastic variable:\n * 1. Total number of elements for the generated JSON array: [1, 10)\n * 2. Each element: with message (1), array (1)\n * 3. Each message: number of fields: [0, 5); field type: with\n *    message (5), string (1), number (1), boolean (1), array (1), null (1)\n * 4. Message may be nested, and will be terminated randomly with\n *    a max depth equal to 5\n * 5. Each array: length [0, 5), and may be nested too\n */\n\ngoog.provide('goog.labs.testing.JsonFuzzing');\n\ngoog.require('goog.string');\ngoog.require('goog.testing.PseudoRandom');\n\n\n\n/**\n * The JSON fuzzing generator.\n *\n * @param {!goog.labs.testing.JsonFuzzing.Options=} opt_options Configuration\n *     for the fuzzing json generator.\n * @param {number=} opt_seed The seed for the random generator.\n * @constructor\n * @struct\n */\ngoog.labs.testing.JsonFuzzing = function(opt_options, opt_seed) {\n  /**\n   * The config options.\n   * @private {!goog.labs.testing.JsonFuzzing.Options}\n   */\n  this.options_ =\n      opt_options || {jsonSize: 10, numFields: 5, arraySize: 5, maxDepth: 5};\n\n  /**\n   * The random generator\n   * @private {!goog.testing.PseudoRandom}\n   */\n  this.random_ = new goog.testing.PseudoRandom(opt_seed);\n\n  /**\n   * The depth limit, which defaults to 5.\n   * @private {number}\n   */\n  this.maxDepth_ = this.options_.maxDepth;\n};\n\n\n/**\n * Configuration spec.\n *\n * jsonSize: default to [1, 10) for the entire JSON object (array)\n * numFields: default to [0, 5)\n * arraySize: default to [0, 5) for the length of nested arrays\n * maxDepth: default to 5\n *\n * @typedef {{\n *   jsonSize: number,\n *   numFields: number,\n *   arraySize: number,\n *   maxDepth: number\n * }}\n */\ngoog.labs.testing.JsonFuzzing.Options;\n\n\n/**\n * Gets a fuzzily-generated JSON object (an array).\n *\n * TODO(user): whitespaces\n *\n * @return {!Array} A new JSON compliant array object.\n */\ngoog.labs.testing.JsonFuzzing.prototype.newArray = function() {\n  var result = [];\n  var depth = 0;\n\n  var maxSize = this.options_.jsonSize;\n\n  var size = this.nextInt(1, maxSize);\n  for (var i = 0; i < size; i++) {\n    result.push(this.nextElm_(depth));\n  }\n\n  return result;\n};\n\n\n/**\n * Gets a new integer.\n *\n * @param {number} min Inclusive\n * @param {number} max Exclusive\n * @return {number} A random integer\n */\ngoog.labs.testing.JsonFuzzing.prototype.nextInt = function(min, max) {\n  var random = this.random_.random();\n\n  return Math.floor(random * (max - min)) + min;\n};\n\n\n/**\n * Gets a new element type, randomly.\n *\n * @return {number} 0 for message and 1 for array.\n * @private\n */\ngoog.labs.testing.JsonFuzzing.prototype.nextElmType_ = function() {\n  var random = this.random_.random();\n\n  if (random < 0.5) {\n    return 0;\n  } else {\n    return 1;\n  }\n};\n\n\n/**\n * Enum type for the field type (of a message).\n * @enum {number}\n * @private\n */\ngoog.labs.testing.JsonFuzzing.FieldType_ = {\n  /**\n   * Message field.\n   */\n  MESSAGE: 0,\n\n  /**\n   * Array field.\n   */\n  ARRAY: 1,\n\n  /**\n   * String field.\n   */\n  STRING: 2,\n\n  /**\n   * Numeric field.\n   */\n  NUMBER: 3,\n\n  /**\n   * Boolean field.\n   */\n  BOOLEAN: 4,\n\n  /**\n   * Null field.\n   */\n  NULL: 5\n};\n\n\n/**\n * Get a new field type, randomly.\n *\n * @return {!goog.labs.testing.JsonFuzzing.FieldType_} the field type.\n * @private\n */\ngoog.labs.testing.JsonFuzzing.prototype.nextFieldType_ = function() {\n  var FieldType = goog.labs.testing.JsonFuzzing.FieldType_;\n\n  var random = this.random_.random();\n\n  if (random < 0.5) {\n    return FieldType.MESSAGE;\n  } else if (random < 0.6) {\n    return FieldType.ARRAY;\n  } else if (random < 0.7) {\n    return FieldType.STRING;\n  } else if (random < 0.8) {\n    return FieldType.NUMBER;\n  } else if (random < 0.9) {\n    return FieldType.BOOLEAN;\n  } else {\n    return FieldType.NULL;\n  }\n};\n\n\n/**\n * Gets a new element.\n *\n * @param {number} depth The depth\n * @return {!Object} a random element, msg or array\n * @private\n */\ngoog.labs.testing.JsonFuzzing.prototype.nextElm_ = function(depth) {\n  switch (this.nextElmType_()) {\n    case 0:\n      return this.nextMessage_(depth);\n    case 1:\n      return this.nextArray_(depth);\n    default:\n      throw new Error('invalid elm type encounted.');\n  }\n};\n\n\n/**\n * Gets a new message.\n *\n * @param {number} depth The depth\n * @return {!Object} a random message.\n * @private\n */\ngoog.labs.testing.JsonFuzzing.prototype.nextMessage_ = function(depth) {\n  if (depth > this.maxDepth_) {\n    return {};\n  }\n\n  var numFields = this.options_.numFields;\n\n  var random_num = this.nextInt(0, numFields);\n  var result = {};\n\n  // TODO(user): unicode and random keys\n  for (var i = 0; i < random_num; i++) {\n    switch (this.nextFieldType_()) {\n      case 0:\n        result['f' + i] = this.nextMessage_(depth++);\n        continue;\n      case 1:\n        result['f' + i] = this.nextArray_(depth++);\n        continue;\n      case 2:\n        result['f' + i] = goog.string.getRandomString();\n        continue;\n      case 3:\n        result['f' + i] = this.nextNumber_();\n        continue;\n      case 4:\n        result['f' + i] = this.nextBoolean_();\n        continue;\n      case 5:\n        result['f' + i] = null;\n        continue;\n      default:\n        throw new Error('invalid field type encounted.');\n    }\n  }\n\n  return result;\n};\n\n\n/**\n * Gets a new array.\n *\n * @param {number} depth The depth\n * @return {!Array} a random array.\n * @private\n */\ngoog.labs.testing.JsonFuzzing.prototype.nextArray_ = function(depth) {\n  if (depth > this.maxDepth_) {\n    return [];\n  }\n\n  var size = this.options_.arraySize;\n\n  var random_size = this.nextInt(0, size);\n  var result = [];\n\n  // mixed content\n  for (var i = 0; i < random_size; i++) {\n    switch (this.nextFieldType_()) {\n      case 0:\n        result.push(this.nextMessage_(depth++));\n        continue;\n      case 1:\n        result.push(this.nextArray_(depth++));\n        continue;\n      case 2:\n        result.push(goog.string.getRandomString());\n        continue;\n      case 3:\n        result.push(this.nextNumber_());\n        continue;\n      case 4:\n        result.push(this.nextBoolean_());\n        continue;\n      case 5:\n        result.push(null);\n        continue;\n      default:\n        throw new Error('invalid field type encounted.');\n    }\n  }\n\n  return result;\n};\n\n\n/**\n * Gets a new boolean.\n *\n * @return {boolean} a random boolean.\n * @private\n */\ngoog.labs.testing.JsonFuzzing.prototype.nextBoolean_ = function() {\n  var random = this.random_.random();\n\n  return random < 0.5;\n};\n\n\n/**\n * Gets a new number.\n *\n * @return {number} a random number..\n * @private\n */\ngoog.labs.testing.JsonFuzzing.prototype.nextNumber_ = function() {\n  var result = this.random_.random();\n\n  var random = this.random_.random();\n  if (random < 0.5) {\n    result *= 1000;\n  }\n\n  random = this.random_.random();\n  if (random < 0.5) {\n    result = Math.floor(result);\n  }\n\n  random = this.random_.random();\n  if (random < 0.5) {\n    result *= -1;\n  }\n\n  // TODO(user); more random numbers\n\n  return result;\n};\n","^;",1579837703000,"^<",["^=",["^:O","^2L","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/testing/json_fuzzing.js"],"^O",["^=",["~$goog.labs.testing.JsonFuzzing"]],"^W",true,"^X",["^?","^2L","^:O"]],["^ ","^3",[1579837703000],"^4","goog.html.flash.js","^5",["^6","goog/html/flash.js"],"^7","goog/html/flash.js","^8","^9","^:","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview SafeHtml factory methods for creating object and embed tags\n * for loading Flash files.\n */\n\ngoog.provide('goog.html.flash');\n\ngoog.require('goog.asserts');\ngoog.require('goog.html.SafeHtml');\n\n\n/**\n * Attributes and param tag name attributes not allowed to be overriden\n * when calling createObject() and createObjectForOldIe().\n *\n * While values that should be specified as params are probably not\n * recognized as attributes, we block them anyway just to be sure.\n * @const {!Array<string>}\n * @private\n */\ngoog.html.flash.FORBIDDEN_ATTRS_AND_PARAMS_ON_FLASH_ = [\n  'classid',       // Used on old IE.\n  'data',          // Used in <object> to specify a URL.\n  'movie',         // Used on old IE.\n  'type',          // Used in <object> on for non-IE/modern IE.\n  'typemustmatch'  // Always set to a fixed value.\n];\n\n\n/**\n * Creates a SafeHtml representing an embed tag, for loading Flash files.\n *\n *\n * The following attributes are set to these fixed values:\n * - type: application/x-shockwave-flash\n * - pluginspage: https://www.macromedia.com/go/getflashplayer\n *\n * The following attributes are set to these default values (which are the most\n * restrictive possible but can be overriden):\n * - allowNetworking: none\n * - allowScriptAccess: never\n *\n * @param {!goog.html.TrustedResourceUrl} src The value of the src attribute.\n * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n *     Mapping from other attribute names to their values. Only attribute names\n *     consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes\n *     the attribute to be omitted.\n * @return {!goog.html.SafeHtml} The SafeHtml content with the embed tag.\n * @throws {Error} If invalid attribute name or attribute value is\n *     provided. Also if opt_attributes contains any of the attributes set\n *     to fixed values, documented above, or contains src.\n */\ngoog.html.flash.createEmbed = function(src, opt_attributes) {\n  var fixedAttributes = {\n    'src': src,\n    'type': 'application/x-shockwave-flash',\n    'pluginspage': 'https://www.macromedia.com/go/getflashplayer'\n  };\n  var defaultAttributes = {\n    'allownetworking': 'none',\n    'allowscriptaccess': 'never'\n  };\n  var attributes = goog.html.SafeHtml.combineAttributes(\n      fixedAttributes, defaultAttributes, opt_attributes);\n  return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(\n      'embed', attributes);\n};\n\n\n/**\n * Creates a SafeHtml representing an object tag, for loading Flash files.\n *\n *\n * The following attributes are set to these fixed values:\n * - type: application/x-shockwave-flash\n * - typemustmatch: \"\" (the empty string, meaning true for a boolean attribute)\n *\n * The following default name-value pairs (which are the most restrictive\n * possible but can be changed) are used in child param tags:\n * - allowNetworking: none\n * - allowScriptAccess: never\n *\n * @param {!goog.html.TrustedResourceUrl} data The value of the data param.\n * @param {?Object<string, string>=} opt_params Mapping used to generate child\n *     param tags. Each tag has a name and value attribute, as defined in\n *     mapping. Only names consisting of [a-zA-Z0-9-] are allowed. Value of\n *     null or undefined causes the param tag to be omitted.\n * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n *     Mapping from other attribute names to their values. Only attribute names\n *     consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes\n *     the attribute to be omitted.\n * @return {!goog.html.SafeHtml} The SafeHtml content with the object tag.\n * @throws {Error} If invalid attribute or param name, or attribute or param\n *     value is provided. Also if opt_attributes or opt_params contains any of\n *     the attributes or params set to fixed values, documented above, or\n *     contains classid, data or movie.\n */\ngoog.html.flash.createObject = function(data, opt_params, opt_attributes) {\n  goog.html.flash.verifyKeysNotInMaps(\n      goog.html.flash.FORBIDDEN_ATTRS_AND_PARAMS_ON_FLASH_, opt_attributes,\n      opt_params);\n\n  var paramTags = goog.html.flash.combineParams(\n      {'allownetworking': 'none', 'allowscriptaccess': 'never'}, opt_params);\n  var fixedAttributes = {\n    'data': data,\n    'type': 'application/x-shockwave-flash',\n    'typemustmatch': ''\n  };\n  var attributes =\n      goog.html.SafeHtml.combineAttributes(fixedAttributes, {}, opt_attributes);\n\n  return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(\n      'object', attributes, paramTags);\n};\n\n\n/**\n * Creates a SafeHtml representing an object tag, for loading Flash files in\n * older IE (<11).\n *\n\n * The classid attribute is set to a fixed value of\n * \"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\". The following default\n * name-value pairs (which are the most restrictive possible but can be\n * changed) are used in child param tags:\n * - allowNetworking: none\n * - allowScriptAccess: never\n *\n * @param {!goog.html.TrustedResourceUrl} movie The value of the movie param.\n * @param {?Object<string, string>=} opt_params Mapping used to generate child\n *     param tags. Each tag has a name and value attribute, as defined in\n *     mapping. Only names consisting of [a-zA-Z0-9-] are allowed. Value of\n *     null or undefined causes the param tag to be omitted.\n * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n *     Mapping from other attribute names to their values. Only attribute names\n *     consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes\n *     the attribute to be omitted.\n * @return {!goog.html.SafeHtml} The SafeHtml content with the object tag.\n * @throws {Error} If invalid attribute or param name, or attribute or param\n *     value is provided. Also if opt_attributes or opt_params contains any of\n *     the attributes or params set to fixed values, documented above, or\n *     contains data, movie, type or typemustmatch.\n */\ngoog.html.flash.createObjectForOldIe = function(\n    movie, opt_params, opt_attributes) {\n  goog.html.flash.verifyKeysNotInMaps(\n      goog.html.flash.FORBIDDEN_ATTRS_AND_PARAMS_ON_FLASH_, opt_attributes,\n      opt_params);\n\n  var paramTags = goog.html.flash.combineParams(\n      {'allownetworking': 'none', 'allowscriptaccess': 'never', 'movie': movie},\n      opt_params);\n  var fixedAttributes = {\n    'classid': 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000'\n  };\n  var attributes =\n      goog.html.SafeHtml.combineAttributes(fixedAttributes, {}, opt_attributes);\n\n  return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(\n      'object', attributes, paramTags);\n};\n\n\n/**\n * @param {!Object<string, string|!goog.string.TypedString>} defaultParams\n * @param {?Object<string, string>=} opt_params Optional params passed to\n *     create*().\n * @return {!Array<!goog.html.SafeHtml>} Combined params.\n * @throws {Error} If opt_attributes contains an attribute with the same name\n *     as an attribute in fixedAttributes.\n * @package\n */\ngoog.html.flash.combineParams = function(defaultParams, opt_params) {\n  var combinedParams = {};\n  var name;\n\n  for (name in defaultParams) {\n    goog.asserts.assert(name.toLowerCase() == name, 'Must be lower case');\n    combinedParams[name] = defaultParams[name];\n  }\n  for (name in opt_params) {\n    var nameLower = name.toLowerCase();\n    if (nameLower in defaultParams) {\n      delete combinedParams[nameLower];\n    }\n    combinedParams[name] = opt_params[name];\n  }\n\n  var paramTags = [];\n  for (name in combinedParams) {\n    paramTags.push(\n        goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(\n            'param', {'name': name, 'value': combinedParams[name]}));\n  }\n  return paramTags;\n};\n\n\n/**\n * Checks that keys are not present as keys in maps.\n * @param {!Array<string>} keys Keys that must not be present, lower-case.\n * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n *     Optional attributes passed to create*().\n * @param {?Object<string, string>=}  opt_params Optional params passed to\n *     createObject*().\n * @throws {Error} If any of keys exist as a key, ignoring case, in\n *     opt_attributes or opt_params.\n * @package\n */\ngoog.html.flash.verifyKeysNotInMaps = function(\n    keys, opt_attributes, opt_params) {\n  var verifyNotInMap = function(keys, map, type) {\n    for (var keyMap in map) {\n      var keyMapLower = keyMap.toLowerCase();\n      for (var i = 0; i < keys.length; i++) {\n        var keyToCheck = keys[i];\n        goog.asserts.assert(keyToCheck.toLowerCase() == keyToCheck);\n        if (keyMapLower == keyToCheck) {\n          throw new Error(\n              'Cannot override \"' + keyToCheck + '\" ' + type + ', got \"' +\n              keyMap + '\" with value \"' + map[keyMap] + '\"');\n        }\n      }\n    }\n  };\n\n  verifyNotInMap(keys, opt_attributes, 'attribute');\n  verifyNotInMap(keys, opt_params, 'param');\n};\n","^;",1579837703000,"^<",["^=",["^1L","^?","^1I"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/flash.js"],"^O",["^=",["^@P"]],"^W",true,"^X",["^?","^1L","^1I"]],["^ ","^3",[1579837703000],"^4","goog.net.networktester.js","^5",["^6","goog/net/networktester.js"],"^7","goog/net/networktester.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of goog.net.NetworkTester.\n */\n\ngoog.provide('goog.net.NetworkTester');\ngoog.require('goog.Timer');\ngoog.require('goog.Uri');\ngoog.require('goog.dom.safe');\ngoog.require('goog.log');\n\n\n\n/**\n * Creates an instance of goog.net.NetworkTester which can be used to test\n * for internet connectivity by seeing if an image can be loaded from\n * google.com. It can also be tested with other URLs.\n * @param {Function} callback Callback that is called when the test completes.\n *     The callback takes a single boolean parameter. True indicates the URL\n *     was reachable, false indicates it wasn't.\n * @param {Object=} opt_handler Handler object for the callback.\n * @param {goog.Uri=} opt_uri URI to use for testing.\n * @constructor @struct\n * @final\n */\ngoog.net.NetworkTester = function(callback, opt_handler, opt_uri) {\n  /**\n   * Callback that is called when the test completes.\n   * The callback takes a single boolean parameter. True indicates the URL was\n   * reachable, false indicates it wasn't.\n   * @type {Function}\n   * @private\n   */\n  this.callback_ = callback;\n\n  /**\n   * Handler object for the callback.\n   * @type {Object|undefined}\n   * @private\n   */\n  this.handler_ = opt_handler;\n\n  if (!opt_uri) {\n    // set the default URI to be based on the cleardot image at google.com\n    // We need to add a 'rand' to make sure the response is not fulfilled\n    // by browser cache. Use protocol-relative URLs to avoid insecure content\n    // warnings in IE.\n    opt_uri = new goog.Uri('//www.google.com/images/cleardot.gif');\n    opt_uri.makeUnique();\n  }\n\n  /**\n   * Uri to use for test. Defaults to using an image off of google.com\n   * @type {goog.Uri}\n   * @private\n   */\n  this.uri_ = opt_uri;\n};\n\n\n/**\n * Default timeout\n * @type {number}\n */\ngoog.net.NetworkTester.DEFAULT_TIMEOUT_MS = 10000;\n\n\n/**\n * Logger object\n * @type {goog.log.Logger}\n * @private\n */\ngoog.net.NetworkTester.prototype.logger_ =\n    goog.log.getLogger('goog.net.NetworkTester');\n\n\n/**\n * Timeout for test\n * @type {number}\n * @private\n */\ngoog.net.NetworkTester.prototype.timeoutMs_ =\n    goog.net.NetworkTester.DEFAULT_TIMEOUT_MS;\n\n\n/**\n * Whether we've already started running.\n * @type {boolean}\n * @private\n */\ngoog.net.NetworkTester.prototype.running_ = false;\n\n\n/**\n * Number of retries to attempt\n * @type {number}\n * @private\n */\ngoog.net.NetworkTester.prototype.retries_ = 0;\n\n\n/**\n * Attempt number we're on\n * @type {number}\n * @private\n */\ngoog.net.NetworkTester.prototype.attempt_ = 0;\n\n\n/**\n * Pause between retries in milliseconds.\n * @type {number}\n * @private\n */\ngoog.net.NetworkTester.prototype.pauseBetweenRetriesMs_ = 0;\n\n\n/**\n * Timer for timeouts.\n * @type {?number}\n * @private\n */\ngoog.net.NetworkTester.prototype.timeoutTimer_ = null;\n\n\n/**\n * Timer for pauses between retries.\n * @type {?number}\n * @private\n */\ngoog.net.NetworkTester.prototype.pauseTimer_ = null;\n\n\n/** @private {?Image} */\ngoog.net.NetworkTester.prototype.image_;\n\n\n/**\n * Returns the timeout in milliseconds.\n * @return {number} Timeout in milliseconds.\n */\ngoog.net.NetworkTester.prototype.getTimeout = function() {\n  return this.timeoutMs_;\n};\n\n\n/**\n * Sets the timeout in milliseconds.\n * @param {number} timeoutMs Timeout in milliseconds.\n */\ngoog.net.NetworkTester.prototype.setTimeout = function(timeoutMs) {\n  this.timeoutMs_ = timeoutMs;\n};\n\n\n/**\n * Returns the numer of retries to attempt.\n * @return {number} Number of retries to attempt.\n */\ngoog.net.NetworkTester.prototype.getNumRetries = function() {\n  return this.retries_;\n};\n\n\n/**\n * Sets the timeout in milliseconds.\n * @param {number} retries Number of retries to attempt.\n */\ngoog.net.NetworkTester.prototype.setNumRetries = function(retries) {\n  this.retries_ = retries;\n};\n\n\n/**\n * Returns the pause between retries in milliseconds.\n * @return {number} Pause between retries in milliseconds.\n */\ngoog.net.NetworkTester.prototype.getPauseBetweenRetries = function() {\n  return this.pauseBetweenRetriesMs_;\n};\n\n\n/**\n * Sets the pause between retries in milliseconds.\n * @param {number} pauseMs Pause between retries in milliseconds.\n */\ngoog.net.NetworkTester.prototype.setPauseBetweenRetries = function(pauseMs) {\n  this.pauseBetweenRetriesMs_ = pauseMs;\n};\n\n\n/**\n * Returns the uri to use for the test.\n * @return {goog.Uri} The uri for the test.\n */\ngoog.net.NetworkTester.prototype.getUri = function() {\n  return this.uri_;\n};\n\n\n/**\n * Returns the current attempt count.\n * @return {number} The attempt count.\n */\ngoog.net.NetworkTester.prototype.getAttemptCount = function() {\n  return this.attempt_;\n};\n\n\n/**\n * Sets the uri to use for the test.\n * @param {goog.Uri} uri The uri for the test.\n */\ngoog.net.NetworkTester.prototype.setUri = function(uri) {\n  this.uri_ = uri;\n};\n\n\n/**\n * Returns whether the tester is currently running.\n * @return {boolean} True if it's running, false if it's not running.\n */\ngoog.net.NetworkTester.prototype.isRunning = function() {\n  return this.running_;\n};\n\n\n/**\n * Starts the process of testing the network.\n */\ngoog.net.NetworkTester.prototype.start = function() {\n  if (this.running_) {\n    throw new Error('NetworkTester.start called when already running');\n  }\n  this.running_ = true;\n\n  goog.log.info(this.logger_, 'Starting');\n  this.attempt_ = 0;\n  this.startNextAttempt_();\n};\n\n\n/**\n * Stops the testing of the network. This is a noop if not running.\n */\ngoog.net.NetworkTester.prototype.stop = function() {\n  this.cleanupCallbacks_();\n  this.running_ = false;\n};\n\n\n/**\n * Starts the next attempt to load an image.\n * @private\n */\ngoog.net.NetworkTester.prototype.startNextAttempt_ = function() {\n  this.attempt_++;\n\n  if (goog.net.NetworkTester.getNavigatorOffline_()) {\n    goog.log.info(this.logger_, 'Browser is set to work offline.');\n    // Call in a timeout to make async like the rest.\n    goog.Timer.callOnce(goog.bind(this.onResult, this, false), 0);\n  } else {\n    goog.log.info(\n        this.logger_,\n        'Loading image (attempt ' + this.attempt_ + ') at ' + this.uri_);\n    this.image_ = new Image();\n    this.image_.onload = goog.bind(this.onImageLoad_, this);\n    this.image_.onerror = goog.bind(this.onImageError_, this);\n    this.image_.onabort = goog.bind(this.onImageAbort_, this);\n\n    this.timeoutTimer_ =\n        goog.Timer.callOnce(this.onImageTimeout_, this.timeoutMs_, this);\n    goog.dom.safe.setImageSrc(this.image_, String(this.uri_));\n  }\n};\n\n\n/**\n * @return {boolean} Whether navigator.onLine returns false.\n * @private\n */\ngoog.net.NetworkTester.getNavigatorOffline_ = function() {\n  return navigator !== null && 'onLine' in navigator && !navigator.onLine;\n};\n\n\n/**\n * Callback for the image successfully loading.\n * @private\n */\ngoog.net.NetworkTester.prototype.onImageLoad_ = function() {\n  goog.log.info(this.logger_, 'Image loaded');\n  this.onResult(true);\n};\n\n\n/**\n * Callback for the image failing to load.\n * @private\n */\ngoog.net.NetworkTester.prototype.onImageError_ = function() {\n  goog.log.info(this.logger_, 'Image load error');\n  this.onResult(false);\n};\n\n\n/**\n * Callback for the image load being aborted.\n * @private\n */\ngoog.net.NetworkTester.prototype.onImageAbort_ = function() {\n  goog.log.info(this.logger_, 'Image load aborted');\n  this.onResult(false);\n};\n\n\n/**\n * Callback for the image load timing out.\n * @private\n */\ngoog.net.NetworkTester.prototype.onImageTimeout_ = function() {\n  goog.log.info(this.logger_, 'Image load timed out');\n  this.onResult(false);\n};\n\n\n/**\n * Handles a successful or failed result.\n * @param {boolean} succeeded Whether the image load succeeded.\n */\ngoog.net.NetworkTester.prototype.onResult = function(succeeded) {\n  this.cleanupCallbacks_();\n\n  if (succeeded) {\n    this.running_ = false;\n    this.callback_.call(this.handler_, true);\n  } else {\n    if (this.attempt_ <= this.retries_) {\n      if (this.pauseBetweenRetriesMs_) {\n        this.pauseTimer_ = goog.Timer.callOnce(\n            this.onPauseFinished_, this.pauseBetweenRetriesMs_, this);\n      } else {\n        this.startNextAttempt_();\n      }\n    } else {\n      this.running_ = false;\n      this.callback_.call(this.handler_, false);\n    }\n  }\n};\n\n\n/**\n * Callback for the pause between retry timer.\n * @private\n */\ngoog.net.NetworkTester.prototype.onPauseFinished_ = function() {\n  this.pauseTimer_ = null;\n  this.startNextAttempt_();\n};\n\n\n/**\n * Cleans up the handlers and timer associated with the image.\n * @private\n */\ngoog.net.NetworkTester.prototype.cleanupCallbacks_ = function() {\n  // clear handlers to avoid memory leaks\n  // NOTE(user): Nullified individually to avoid compiler warnings\n  // (BUG 658126)\n  if (this.image_) {\n    this.image_.onload = null;\n    this.image_.onerror = null;\n    this.image_.onabort = null;\n    this.image_ = null;\n  }\n  if (this.timeoutTimer_) {\n    goog.Timer.clear(this.timeoutTimer_);\n    this.timeoutTimer_ = null;\n  }\n  if (this.pauseTimer_) {\n    goog.Timer.clear(this.pauseTimer_);\n    this.pauseTimer_ = null;\n  }\n};\n","^;",1579837703000,"^<",["^=",["^3O","^16","^?","^18","^1E"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/networktester.js"],"^O",["^=",["~$goog.net.NetworkTester"]],"^W",true,"^X",["^?","^3O","^16","^1E","^18"]],["^ ","^3",[1579837703000],"^4","goog.module.testdata.modB_1.js","^5",["^6","goog/module/testdata/modB_1.js"],"^7","goog/module/testdata/modB_1.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved\n\n/**\n * @fileoverview File #1 of module B.\n */\n\ngoog.provide('goog.module.testdata.modB_1');\n\ngoog.setTestOnly('goog.module.testdata.modB_1');\n\ngoog.require('goog.module.ModuleManager');\n\ngoog.module.ModuleManager.getInstance().beforeLoadModuleCode('modB');\n\nfunction throwErrorInModuleB() {\n  throw new Error();\n}\n\nif (window.modB1Loaded) throw new Error('modB_1 loaded twice');\nwindow.modB1Loaded = true;\n\ngoog.module.ModuleManager.getInstance().setLoaded();\n","^;",1579837703000,"^<",["^=",["^:H","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/module/testdata/modB_1.js"],"^O",["^=",["~$goog.module.testdata.modB_1","~$goog.module.testdata.modB-1"]],"^W",true,"^X",["^?","^:H"]],["^ ","^3",[1579837703000],"^4","goog.ui.ac.richinputhandler.js","^5",["^6","goog/ui/ac/richinputhandler.js"],"^7","goog/ui/ac/richinputhandler.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class for managing the interactions between a rich autocomplete\n * object and a text-input or textarea.\n *\n */\n\ngoog.provide('goog.ui.ac.RichInputHandler');\n\ngoog.require('goog.ui.ac.InputHandler');\n\n\n\n/**\n * Class for managing the interaction between an autocomplete object and a\n * text-input or textarea.\n * @param {?string=} opt_separators Seperators to split multiple entries.\n * @param {?string=} opt_literals Characters used to delimit text literals.\n * @param {?boolean=} opt_multi Whether to allow multiple entries\n *     (Default: true).\n * @param {?number=} opt_throttleTime Number of milliseconds to throttle\n *     keyevents with (Default: 150).\n * @constructor\n * @extends {goog.ui.ac.InputHandler}\n */\ngoog.ui.ac.RichInputHandler = function(\n    opt_separators, opt_literals, opt_multi, opt_throttleTime) {\n  goog.ui.ac.InputHandler.call(\n      this, opt_separators, opt_literals, opt_multi, opt_throttleTime);\n};\ngoog.inherits(goog.ui.ac.RichInputHandler, goog.ui.ac.InputHandler);\n\n\n/**\n * Selects the given rich row.  The row's select(target) method is called.\n * @param {Object} row The row to select.\n * @return {boolean} Whether to suppress the update event.\n * @override\n */\ngoog.ui.ac.RichInputHandler.prototype.selectRow = function(row) {\n  var suppressUpdate =\n      goog.ui.ac.RichInputHandler.superClass_.selectRow.call(this, row);\n  row.select(this.ac_.getTarget());\n  return suppressUpdate;\n};\n","^;",1579837703000,"^<",["^=",["^?","^2@"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/ac/richinputhandler.js"],"^O",["^=",["^8F"]],"^W",true,"^X",["^?","^2@"]],["^ ","^3",[1579837703000],"^4","goog.testing.deferredtestcase.js","^5",["^6","goog/testing/deferredtestcase.js"],"^7","goog/testing/deferredtestcase.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines DeferredTestCase class. By calling waitForDeferred(),\n * tests in DeferredTestCase can wait for a Deferred object to complete its\n * callbacks before continuing to the next test.\n *\n * Example Usage:\n *\n *   var deferredTestCase = goog.testing.DeferredTestCase.createAndInstall();\n *   // Optionally, set a longer-than-usual step timeout.\n *   deferredTestCase.stepTimeout = 15 * 1000; // 15 seconds\n *\n *   function testDeferredCallbacks() {\n *     var callbackTime = goog.now();\n *     var callbacks = new goog.async.Deferred();\n *     deferredTestCase.addWaitForAsync('Waiting for 1st callback', callbacks);\n *     callbacks.addCallback(\n *         function() {\n *           assertTrue(\n *               'We\\'re going back in time!', goog.now() >= callbackTime);\n *           callbackTime = goog.now();\n *         });\n *     deferredTestCase.addWaitForAsync('Waiting for 2nd callback', callbacks);\n *     callbacks.addCallback(\n *         function() {\n *           assertTrue(\n *               'We\\'re going back in time!', goog.now() >= callbackTime);\n *           callbackTime = goog.now();\n *         });\n *     deferredTestCase.addWaitForAsync('Waiting for last callback', callbacks);\n *     callbacks.addCallback(\n *         function() {\n *           assertTrue(\n *               'We\\'re going back in time!', goog.now() >= callbackTime);\n *           callbackTime = goog.now();\n *         });\n *\n *     deferredTestCase.waitForDeferred(callbacks);\n *   }\n *\n * Note that DeferredTestCase still preserves the functionality of\n * AsyncTestCase.\n *\n * @see.goog.async.Deferred\n * @see goog.testing.AsyncTestCase\n */\n\ngoog.setTestOnly('goog.testing.DeferredTestCase');\ngoog.provide('goog.testing.DeferredTestCase');\n\ngoog.require('goog.async.Deferred');\ngoog.require('goog.testing.AsyncTestCase');\ngoog.require('goog.testing.TestCase');\n\n\n\n/**\n * A test case that can asynchronously wait on a Deferred object.\n * @param {string=} opt_name A descriptive name for the test case.\n * @constructor\n * @extends {goog.testing.AsyncTestCase}\n * @deprecated Use goog.testing.TestCase instead. goog.testing.TestCase now\n *    supports async testing using promises.\n */\ngoog.testing.DeferredTestCase = function(opt_name) {\n  goog.testing.AsyncTestCase.call(this, opt_name);\n};\ngoog.inherits(goog.testing.DeferredTestCase, goog.testing.AsyncTestCase);\n\n\n/**\n * Preferred way of creating a DeferredTestCase. Creates one and initializes it\n * with the G_testRunner.\n * @param {string=} opt_name A descriptive name for the test case.\n * @return {!goog.testing.DeferredTestCase} The created DeferredTestCase.\n */\ngoog.testing.DeferredTestCase.createAndInstall = function(opt_name) {\n  var deferredTestCase = new goog.testing.DeferredTestCase(opt_name);\n  goog.testing.TestCase.initializeTestRunner(deferredTestCase);\n  return deferredTestCase;\n};\n\n\n/**\n * Handler for when the test produces an error.\n * @param {Error|string} err The error object.\n * @protected\n * @throws Always throws a ControlBreakingException.\n */\ngoog.testing.DeferredTestCase.prototype.onError = function(err) {\n  this.doAsyncError(err);\n};\n\n\n/**\n * Handler for when the test succeeds.\n * @protected\n */\ngoog.testing.DeferredTestCase.prototype.onSuccess = function() {\n  this.continueTesting();\n};\n\n\n/**\n * Adds a callback to update the wait message of this async test case. Using\n * this method generously also helps to document the test flow.\n * @param {string} msg The update wait status message.\n * @param {goog.async.Deferred} d The deferred object to add the waitForAsync\n *     callback to.\n * @see goog.testing.AsyncTestCase#waitForAsync\n */\ngoog.testing.DeferredTestCase.prototype.addWaitForAsync = function(msg, d) {\n  d.addCallback(goog.bind(this.waitForAsync, this, msg));\n};\n\n\n/**\n * Wires up given Deferred object to the test case, then starts the\n * goog.async.Deferred object's callback.\n * @param {string|!goog.async.Deferred} a The wait status message or the\n *     deferred object to wait for.\n * @param {goog.async.Deferred=} opt_b The deferred object to wait for.\n */\ngoog.testing.DeferredTestCase.prototype.waitForDeferred = function(a, opt_b) {\n  var waitMsg;\n  var deferred;\n  switch (arguments.length) {\n    case 1:\n      deferred = a;\n      waitMsg = null;\n      break;\n    case 2:\n      deferred = opt_b;\n      waitMsg = a;\n      break;\n    default:  // Shouldn't be here in compiled mode\n      throw new Error('Invalid number of arguments');\n  }\n  deferred.addCallbacks(this.onSuccess, this.onError, this);\n  if (!waitMsg) {\n    waitMsg = 'Waiting for deferred in ' + this.getCurrentStepName();\n  }\n  this.waitForAsync(/** @type {string} */ (waitMsg));\n  deferred.callback(true);\n};\n","^;",1579837703000,"^<",["^=",["~$goog.testing.AsyncTestCase","^?","^30","^5<"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/deferredtestcase.js"],"^O",["^=",["~$goog.testing.DeferredTestCase"]],"^W",true,"^X",["^?","^5<","^A9","^30"]],["^ ","^3",[1579837703000],"^4","goog.testing.objectpropertystring.js","^5",["^6","goog/testing/objectpropertystring.js"],"^7","goog/testing/objectpropertystring.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Helper for passing property names as string literals in\n * compiled test code.\n *\n */\n\ngoog.setTestOnly('goog.testing.ObjectPropertyString');\ngoog.provide('goog.testing.ObjectPropertyString');\n\n\n\n/**\n * Object to pass a property name as a string literal and its containing object\n * when the JSCompiler is rewriting these names. This should only be used in\n * test code.\n *\n * @param {Object} object The containing object.\n * @param {Object|string} propertyString Property name as a string literal.\n * @constructor\n * @final\n * @deprecated Use goog.reflect.objectProperty instead.\n */\ngoog.testing.ObjectPropertyString = function(object, propertyString) {\n  this.object_ = object;\n  this.propertyString_ = /** @type {string} */ (propertyString);\n};\n\n\n/**\n * @type {Object}\n * @private\n */\ngoog.testing.ObjectPropertyString.prototype.object_;\n\n\n/**\n * @type {string}\n * @private\n */\ngoog.testing.ObjectPropertyString.prototype.propertyString_;\n\n\n/**\n * @return {Object} The object.\n */\ngoog.testing.ObjectPropertyString.prototype.getObject = function() {\n  return this.object_;\n};\n\n\n/**\n * @return {string} The property string.\n */\ngoog.testing.ObjectPropertyString.prototype.getPropertyString = function() {\n  return this.propertyString_;\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/objectpropertystring.js"],"^O",["^=",["~$goog.testing.ObjectPropertyString"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.ui.tabbar.js","^5",["^6","goog/ui/tabbar.js"],"^7","goog/ui/tabbar.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Tab bar UI component.\n *\n * @author attila@google.com (Attila Bodis)\n * @see ../demos/tabbar.html\n */\n\ngoog.provide('goog.ui.TabBar');\ngoog.provide('goog.ui.TabBar.Location');\n\ngoog.require('goog.ui.Component.EventType');\ngoog.require('goog.ui.Container');\ngoog.require('goog.ui.Container.Orientation');\n// We need to include following dependency because of the magic with\n// goog.ui.registry.setDecoratorByClassName\ngoog.require('goog.ui.Tab');\ngoog.require('goog.ui.TabBarRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Tab bar UI component.  A tab bar contains tabs, rendered above, below,\n * before, or after tab contents.  Tabs in tab bars dispatch the following\n * events:\n * <ul>\n *   <li>{@link goog.ui.Component.EventType.ACTION} when activated via the\n *       keyboard or the mouse,\n *   <li>{@link goog.ui.Component.EventType.SELECT} when selected, and\n *   <li>{@link goog.ui.Component.EventType.UNSELECT} when deselected.\n * </ul>\n * Clients may listen for all of the above events on the tab bar itself, and\n * refer to the event target to identify the tab that dispatched the event.\n * When an unselected tab is clicked for the first time, it dispatches both a\n * `SELECT` event and an `ACTION` event; subsequent clicks on an\n * already selected tab only result in `ACTION` events.\n *\n * @param {goog.ui.TabBar.Location=} opt_location Tab bar location; defaults to\n *     {@link goog.ui.TabBar.Location.TOP}.\n * @param {goog.ui.TabBarRenderer=} opt_renderer Renderer used to render or\n *     decorate the container; defaults to {@link goog.ui.TabBarRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for document\n *     interaction.\n * @constructor\n * @extends {goog.ui.Container}\n */\ngoog.ui.TabBar = function(opt_location, opt_renderer, opt_domHelper) {\n  this.setLocation(opt_location || goog.ui.TabBar.Location.TOP);\n\n  goog.ui.Container.call(\n      this, this.getOrientation(),\n      opt_renderer || goog.ui.TabBarRenderer.getInstance(), opt_domHelper);\n\n  this.listenToTabEvents_();\n};\ngoog.inherits(goog.ui.TabBar, goog.ui.Container);\ngoog.tagUnsealableClass(goog.ui.TabBar);\n\n\n/**\n * Tab bar location relative to tab contents.\n * @enum {string}\n */\ngoog.ui.TabBar.Location = {\n  // Above tab contents.\n  TOP: 'top',\n  // Below tab contents.\n  BOTTOM: 'bottom',\n  // To the left of tab contents (to the right if the page is right-to-left).\n  START: 'start',\n  // To the right of tab contents (to the left if the page is right-to-left).\n  END: 'end'\n};\n\n\n/**\n * Tab bar location; defaults to {@link goog.ui.TabBar.Location.TOP}.\n * @type {goog.ui.TabBar.Location}\n * @private\n */\ngoog.ui.TabBar.prototype.location_;\n\n\n/**\n * Whether keyboard navigation should change the selected tab, or just move\n * the highlight.  Defaults to true.\n * @type {boolean}\n * @private\n */\ngoog.ui.TabBar.prototype.autoSelectTabs_ = true;\n\n\n/**\n * The currently selected tab (null if none).\n * @type {goog.ui.Control?}\n * @private\n */\ngoog.ui.TabBar.prototype.selectedTab_ = null;\n\n\n/**\n * @override\n */\ngoog.ui.TabBar.prototype.enterDocument = function() {\n  goog.ui.TabBar.superClass_.enterDocument.call(this);\n\n  this.listenToTabEvents_();\n};\n\n\n/** @override */\ngoog.ui.TabBar.prototype.disposeInternal = function() {\n  goog.ui.TabBar.superClass_.disposeInternal.call(this);\n  this.selectedTab_ = null;\n};\n\n\n/**\n * Removes the tab from the tab bar.  Overrides the superclass implementation\n * by deselecting the tab being removed.  Since {@link #removeChildAt} uses\n * {@link #removeChild} internally, we only need to override this method.\n * @param {string|goog.ui.Component} tab Tab to remove.\n * @param {boolean=} opt_unrender Whether to call `exitDocument` on the\n *     removed tab, and detach its DOM from the document (defaults to false).\n * @return {goog.ui.Control} The removed tab, if any.\n * @override\n */\ngoog.ui.TabBar.prototype.removeChild = function(tab, opt_unrender) {\n  // This actually only accepts goog.ui.Controls. There's a TODO\n  // on the superclass method to fix this.\n  this.deselectIfSelected(/** @type {goog.ui.Control} */ (tab));\n  return goog.ui.TabBar.superClass_.removeChild.call(this, tab, opt_unrender);\n};\n\n\n/**\n * @return {goog.ui.TabBar.Location} Tab bar location relative to tab contents.\n */\ngoog.ui.TabBar.prototype.getLocation = function() {\n  return this.location_;\n};\n\n\n/**\n * Sets the location of the tab bar relative to tab contents.\n * @param {goog.ui.TabBar.Location} location Tab bar location relative to tab\n *     contents.\n * @throws {Error} If the tab bar has already been rendered.\n */\ngoog.ui.TabBar.prototype.setLocation = function(location) {\n  // setOrientation() will take care of throwing an error if already rendered.\n  this.setOrientation(goog.ui.TabBar.getOrientationFromLocation(location));\n  this.location_ = location;\n};\n\n\n/**\n * @return {boolean} Whether keyboard navigation should change the selected tab,\n *     or just move the highlight.\n */\ngoog.ui.TabBar.prototype.isAutoSelectTabs = function() {\n  return this.autoSelectTabs_;\n};\n\n\n/**\n * Enables or disables auto-selecting tabs using the keyboard.  If auto-select\n * is enabled, keyboard navigation switches tabs immediately, otherwise it just\n * moves the highlight.\n * @param {boolean} enable Whether keyboard navigation should change the\n *     selected tab, or just move the highlight.\n */\ngoog.ui.TabBar.prototype.setAutoSelectTabs = function(enable) {\n  this.autoSelectTabs_ = enable;\n};\n\n\n/**\n * Highlights the tab at the given index in response to a keyboard event.\n * Overrides the superclass implementation by also selecting the tab if\n * {@link #isAutoSelectTabs} returns true.\n * @param {number} index Index of tab to highlight.\n * @protected\n * @override\n */\ngoog.ui.TabBar.prototype.setHighlightedIndexFromKeyEvent = function(index) {\n  goog.ui.TabBar.superClass_.setHighlightedIndexFromKeyEvent.call(this, index);\n  if (this.autoSelectTabs_) {\n    // Immediately select the tab.\n    this.setSelectedTabIndex(index);\n  }\n};\n\n\n/**\n * @return {goog.ui.Control?} The currently selected tab (null if none).\n */\ngoog.ui.TabBar.prototype.getSelectedTab = function() {\n  return this.selectedTab_;\n};\n\n\n/**\n * Selects the given tab.\n * @param {goog.ui.Control?} tab Tab to select (null to select none).\n */\ngoog.ui.TabBar.prototype.setSelectedTab = function(tab) {\n  if (tab) {\n    // Select the tab and have it dispatch a SELECT event, to be handled in\n    // handleTabSelect() below.\n    tab.setSelected(true);\n  } else if (this.getSelectedTab()) {\n    // De-select the currently selected tab and have it dispatch an UNSELECT\n    // event, to be handled in handleTabUnselect() below.\n    this.getSelectedTab().setSelected(false);\n  }\n};\n\n\n/**\n * @return {number} Index of the currently selected tab (-1 if none).\n */\ngoog.ui.TabBar.prototype.getSelectedTabIndex = function() {\n  return this.indexOfChild(this.getSelectedTab());\n};\n\n\n/**\n * Selects the tab at the given index.\n * @param {number} index Index of the tab to select (-1 to select none).\n */\ngoog.ui.TabBar.prototype.setSelectedTabIndex = function(index) {\n  this.setSelectedTab(/** @type {goog.ui.Tab} */ (this.getChildAt(index)));\n};\n\n\n/**\n * If the specified tab is the currently selected tab, deselects it, and\n * selects the closest selectable tab in the tab bar (first looking before,\n * then after the deselected tab).  Does nothing if the argument is not the\n * currently selected tab.  Called internally when a tab is removed, hidden,\n * or disabled, to ensure that another tab is selected instead.\n * @param {goog.ui.Control?} tab Tab to deselect (if any).\n * @protected\n */\ngoog.ui.TabBar.prototype.deselectIfSelected = function(tab) {\n  if (tab && tab == this.getSelectedTab()) {\n    var index = this.indexOfChild(tab);\n    // First look for the closest selectable tab before this one.\n    for (var i = index - 1;\n         tab = /** @type {goog.ui.Tab} */ (this.getChildAt(i)); i--) {\n      if (this.isSelectableTab(tab)) {\n        this.setSelectedTab(tab);\n        return;\n      }\n    }\n    // Next, look for the closest selectable tab after this one.\n    for (var j = index + 1;\n         tab = /** @type {goog.ui.Tab} */ (this.getChildAt(j)); j++) {\n      if (this.isSelectableTab(tab)) {\n        this.setSelectedTab(tab);\n        return;\n      }\n    }\n    // If all else fails, just set the selection to null.\n    this.setSelectedTab(null);\n  }\n};\n\n\n/**\n * Returns true if the tab is selectable, false otherwise.  Only visible and\n * enabled tabs are selectable.\n * @param {goog.ui.Control} tab Tab to check.\n * @return {boolean} Whether the tab is selectable.\n * @protected\n */\ngoog.ui.TabBar.prototype.isSelectableTab = function(tab) {\n  return tab.isVisible() && tab.isEnabled();\n};\n\n\n/**\n * Handles `SELECT` events dispatched by tabs as they become selected.\n * @param {goog.events.Event} e Select event to handle.\n * @protected\n */\ngoog.ui.TabBar.prototype.handleTabSelect = function(e) {\n  if (this.selectedTab_ && this.selectedTab_ != e.target) {\n    // Deselect currently selected tab.\n    this.selectedTab_.setSelected(false);\n  }\n  this.selectedTab_ = /** @type {goog.ui.Tab} */ (e.target);\n};\n\n\n/**\n * Handles `UNSELECT` events dispatched by tabs as they become deselected.\n * @param {goog.events.Event} e Unselect event to handle.\n * @protected\n */\ngoog.ui.TabBar.prototype.handleTabUnselect = function(e) {\n  if (e.target == this.selectedTab_) {\n    this.selectedTab_ = null;\n  }\n};\n\n\n/**\n * Handles `DISABLE` events displayed by tabs.\n * @param {goog.events.Event} e Disable event to handle.\n * @protected\n */\ngoog.ui.TabBar.prototype.handleTabDisable = function(e) {\n  this.deselectIfSelected(/** @type {goog.ui.Tab} */ (e.target));\n};\n\n\n/**\n * Handles `HIDE` events displayed by tabs.\n * @param {goog.events.Event} e Hide event to handle.\n * @protected\n */\ngoog.ui.TabBar.prototype.handleTabHide = function(e) {\n  this.deselectIfSelected(/** @type {goog.ui.Tab} */ (e.target));\n};\n\n\n/**\n * Handles focus events dispatched by the tab bar's key event target.  If no tab\n * is currently highlighted, highlights the selected tab or the first tab if no\n * tab is selected either.\n * @param {goog.events.Event} e Focus event to handle.\n * @protected\n * @override\n */\ngoog.ui.TabBar.prototype.handleFocus = function(e) {\n  if (!this.getHighlighted()) {\n    this.setHighlighted(\n        this.getSelectedTab() ||\n        /** @type {goog.ui.Tab} */ (this.getChildAt(0)));\n  }\n};\n\n\n/**\n * Subscribes to events dispatched by tabs.\n * @private\n */\ngoog.ui.TabBar.prototype.listenToTabEvents_ = function() {\n  // Listen for SELECT, UNSELECT, DISABLE, and HIDE events dispatched by tabs.\n  this.getHandler()\n      .listen(this, goog.ui.Component.EventType.SELECT, this.handleTabSelect)\n      .listen(\n          this, goog.ui.Component.EventType.UNSELECT, this.handleTabUnselect)\n      .listen(this, goog.ui.Component.EventType.DISABLE, this.handleTabDisable)\n      .listen(this, goog.ui.Component.EventType.HIDE, this.handleTabHide);\n};\n\n\n/**\n * Returns the {@link goog.ui.Container.Orientation} that is implied by the\n * given {@link goog.ui.TabBar.Location}.\n * @param {goog.ui.TabBar.Location} location Tab bar location.\n * @return {goog.ui.Container.Orientation} Corresponding orientation.\n */\ngoog.ui.TabBar.getOrientationFromLocation = function(location) {\n  return location == goog.ui.TabBar.Location.START ||\n          location == goog.ui.TabBar.Location.END ?\n      goog.ui.Container.Orientation.VERTICAL :\n      goog.ui.Container.Orientation.HORIZONTAL;\n};\n\n\n// Register a decorator factory function for goog.ui.TabBars.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.TabBarRenderer.CSS_CLASS,\n    function() { return new goog.ui.TabBar(); });\n","^;",1579837703000,"^<",["^=",["~$goog.ui.Component.EventType","^?","^3F","~$goog.ui.Container","~$goog.ui.Container.Orientation","^6O","^1X"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/tabbar.js"],"^O",["^=",["~$goog.ui.TabBar.Location","^1V"]],"^W",true,"^X",["^?","^A<","^A=","^A>","^1X","^6O","^3F"]],["^ ","^3",[1579837703000],"^3?",true,"^4","goog.labs.useragent.extra.js","^5",["^6","goog/labs/useragent/extra.js"],"^7","goog/labs/useragent/extra.js","^8","^9","^:","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides extra checks for user agent that are not reflected in\n * the standard user agent checks. This includes runtime heuristics to determine\n * the true environment on browsers that present a different user agent to\n * appear to be running in a different environment.\n */\n\ngoog.module('goog.labs.userAgent.extra');\n\nconst browser = goog.require('goog.labs.userAgent.browser');\nconst platform = goog.require('goog.labs.userAgent.platform');\n\n/**\n * Checks whether the browser appears to be Safari desktop running on a mobile\n * device. Starting with iPadOS 13 this is the default for non-mini iPads\n * running at >=2/3 of the screen. The user agent is otherwise indistinguishable\n * from Mac Safari. The user can also force desktop on other devices.\n *\n * @return {boolean} Whether the runtime heuristics thinks this is Desktop\n * Safari on a non-desktop device.\n */\nfunction isSafariDesktopOnMobile() {\n  return browser.isSafari() && platform.isMacintosh() &&\n      goog.global.navigator.maxTouchPoints > 0;\n}\n\nexports = {isSafariDesktopOnMobile};\n","^;",1579837703000,"^<",["^=",["^?","^4S","^73"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/useragent/extra.js"],"^O",["^=",["~$goog.labs.userAgent.extra"]],"^W",true,"^X",["^?","^73","^4S"]],["^ ","^3",[1579837703000],"^4","goog.testing.functionmock.js","^5",["^6","goog/testing/functionmock.js"],"^7","goog/testing/functionmock.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Enable mocking of functions not attached to objects\n * whether they be global / top-level or anonymous methods / closures.\n *\n * See the unit tests for usage.\n *\n */\n\ngoog.setTestOnly('goog.testing');\ngoog.provide('goog.testing');\ngoog.provide('goog.testing.FunctionMock');\ngoog.provide('goog.testing.GlobalFunctionMock');\ngoog.provide('goog.testing.MethodMock');\n\ngoog.require('goog.object');\ngoog.require('goog.testing.LooseMock');\ngoog.require('goog.testing.Mock');\ngoog.require('goog.testing.PropertyReplacer');\ngoog.require('goog.testing.StrictMock');\n\n\n/**\n * Class used to mock a function. Useful for mocking closures and anonymous\n * callbacks etc. Creates a function object that extends goog.testing.Mock.\n * @param {string=} opt_functionName The optional name of the function to mock.\n *     Set to '[anonymous mocked function]' if not passed in.\n * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or\n *     goog.testing.Mock.STRICT. The default is STRICT.\n * @return {!goog.testing.MockInterface} The mocked function.\n * @suppress {missingProperties} Mocks do not fit in the type system well.\n */\ngoog.testing.FunctionMock = function(opt_functionName, opt_strictness) {\n  var fn = function() {\n    var args = Array.prototype.slice.call(arguments);\n    args.splice(0, 0, opt_functionName || '[anonymous mocked function]');\n    return fn.$mockMethod.apply(fn, args);\n  };\n  var base = opt_strictness === goog.testing.Mock.LOOSE ?\n      goog.testing.LooseMock :\n      goog.testing.StrictMock;\n  goog.object.extend(fn, new base({}));\n\n  return /** @type {!goog.testing.MockInterface} */ (fn);\n};\n\n\n/**\n * Mocks an existing function. Creates a goog.testing.FunctionMock\n * and registers it in the given scope with the name specified by functionName.\n * @param {Object} scope The scope of the method to be mocked out.\n * @param {string} functionName The name of the function we're going to mock.\n * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or\n *     goog.testing.Mock.STRICT. The default is STRICT.\n * @return {!goog.testing.MockInterface} The mocked method.\n * @suppress {strictMissingProperties} $propertyReplacer_ and $tearDown are\n *     not defined on goog.testing.MockInterface\n */\ngoog.testing.MethodMock = function(scope, functionName, opt_strictness) {\n  if (!(functionName in scope)) {\n    throw new Error(functionName + ' is not a property of the given scope.');\n  }\n\n  var fn = goog.testing.FunctionMock(functionName, opt_strictness);\n\n  fn.$propertyReplacer_ = new goog.testing.PropertyReplacer();\n  fn.$propertyReplacer_.set(scope, functionName, fn);\n  fn.$tearDown = goog.testing.MethodMock.$tearDown;\n\n  return fn;\n};\n\n\n/**\n * @private\n * @record @extends {goog.testing.MockInterface}\n */\ngoog.testing.MethodMock.MockInternalInterface_ = function() {};\n\n/** @const {!goog.testing.PropertyReplacer} */\ngoog.testing.MethodMock.MockInternalInterface_.prototype.$propertyReplacer_;\n\n\n/**\n * Resets the global function that we mocked back to its original state.\n * @this {goog.testing.MockInterface}\n */\ngoog.testing.MethodMock.$tearDown = function() {\n  /** @type {!goog.testing.MethodMock.MockInternalInterface_} */ (this)\n      .$propertyReplacer_.reset();\n};\n\n\n/**\n * Mocks a global / top-level function. Creates a goog.testing.MethodMock\n * in the global scope with the name specified by functionName.\n * @param {string} functionName The name of the function we're going to mock.\n * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or\n *     goog.testing.Mock.STRICT. The default is STRICT.\n * @return {!goog.testing.MockInterface} The mocked global function.\n */\ngoog.testing.GlobalFunctionMock = function(functionName, opt_strictness) {\n  return goog.testing.MethodMock(goog.global, functionName, opt_strictness);\n};\n\n\n/**\n * Convenience method for creating a mock for a function.\n * @param {string=} opt_functionName The optional name of the function to mock\n *     set to '[anonymous mocked function]' if not passed in.\n * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or\n *     goog.testing.Mock.STRICT. The default is STRICT.\n * @return {!goog.testing.MockInterface} The mocked function.\n */\ngoog.testing.createFunctionMock = function(opt_functionName, opt_strictness) {\n  return goog.testing.FunctionMock(opt_functionName, opt_strictness);\n};\n\n\n/**\n * Convenience method for creating a mock for a method.\n * @param {Object} scope The scope of the method to be mocked out.\n * @param {string} functionName The name of the function we're going to mock.\n * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or\n *     goog.testing.Mock.STRICT. The default is STRICT.\n * @return {!goog.testing.MockInterface} The mocked global function.\n */\ngoog.testing.createMethodMock = function(scope, functionName, opt_strictness) {\n  return goog.testing.MethodMock(scope, functionName, opt_strictness);\n};\n\n\n/**\n * Convenience method for creating a mock for a constructor. Copies class\n * members to the mock.\n *\n * <p>When mocking a constructor to return a mocked instance, remember to create\n * the instance mock before mocking the constructor. If you mock the constructor\n * first, then the mock framework will be unable to examine the prototype chain\n * when creating the mock instance.\n * @param {Object} scope The scope of the constructor to be mocked out.\n * @param {string} constructorName The name of the constructor we're going to\n *     mock.\n * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or\n *     goog.testing.Mock.STRICT. The default is STRICT.\n * @return {!goog.testing.MockInterface} The mocked constructor.\n */\ngoog.testing.createConstructorMock = function(\n    scope, constructorName, opt_strictness) {\n  var realConstructor = scope[constructorName];\n  var constructorMock =\n      goog.testing.MethodMock(scope, constructorName, opt_strictness);\n\n  // Copy class members from the real constructor to the mock. Do not copy\n  // the closure superClass_ property (see goog.inherits), the built-in\n  // prototype property, or properties added to Function.prototype\n  // TODO(nickreid): Should this work for non-enumerable properties, like are\n  // created by ES6 classes.\n  for (var property in realConstructor) {\n    if (property != 'superClass_' && property != 'prototype' &&\n        realConstructor.hasOwnProperty(property)) {\n      constructorMock[property] = realConstructor[property];\n    }\n  }\n  return constructorMock;\n};\n\n\n/**\n * Convenience method for creating a mocks for a global / top-level function.\n * @param {string} functionName The name of the function we're going to mock.\n * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or\n *     goog.testing.Mock.STRICT. The default is STRICT.\n * @return {!goog.testing.MockInterface} The mocked global function.\n */\ngoog.testing.createGlobalFunctionMock = function(functionName, opt_strictness) {\n  return goog.testing.GlobalFunctionMock(functionName, opt_strictness);\n};\n","^;",1579837703000,"^<",["^=",["^?","^42","^@B","~$goog.testing.Mock","^;4","~$goog.testing.StrictMock"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/functionmock.js"],"^O",["^=",["~$goog.testing.GlobalFunctionMock","~$goog.testing","~$goog.testing.MethodMock","~$goog.testing.FunctionMock"]],"^W",true,"^X",["^?","^42","^;4","^AA","^@B","^AB"]],["^ ","^3",[1579837703000],"^4","goog.math.tdma.js","^5",["^6","goog/math/tdma.js"],"^7","goog/math/tdma.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The Tridiagonal matrix algorithm solver solves a special\n * version of a sparse linear system Ax = b where A is tridiagonal.\n *\n * See http://en.wikipedia.org/wiki/Tridiagonal_matrix_algorithm\n *\n */\n\ngoog.provide('goog.math.tdma');\n\n\n/**\n * Solves a linear system where the matrix is square tri-diagonal. That is,\n * given a system of equations:\n *\n * A * result = vecRight,\n *\n * this class computes result = inv(A) * vecRight, where A has the special form\n * of a tri-diagonal matrix:\n *\n *    |dia(0) sup(0)   0    0     ...   0|\n *    |sub(0) dia(1) sup(1) 0     ...   0|\n * A =|                ...               |\n *    |0 ... 0 sub(n-2) dia(n-1) sup(n-1)|\n *    |0 ... 0    0     sub(n-1)   dia(n)|\n *\n * @param {!Array<number>} subDiag The sub diagonal of the matrix.\n * @param {!Array<number>} mainDiag The main diagonal of the matrix.\n * @param {!Array<number>} supDiag The super diagonal of the matrix.\n * @param {!Array<number>} vecRight The right vector of the system\n *     of equations.\n * @param {Array<number>=} opt_result The optional array to store the result.\n * @return {!Array<number>} The vector that is the solution to the system.\n */\ngoog.math.tdma.solve = function(\n    subDiag, mainDiag, supDiag, vecRight, opt_result) {\n  // Make a local copy of the main diagonal and the right vector.\n  mainDiag = mainDiag.slice();\n  vecRight = vecRight.slice();\n\n  // The dimension of the matrix.\n  const nDim = mainDiag.length;\n\n  // Construct a modified linear system of equations with the same solution\n  // as the input one.\n  let i;\n  for (i = 1; i < nDim; ++i) {\n    const m = subDiag[i - 1] / mainDiag[i - 1];\n    mainDiag[i] = mainDiag[i] - m * supDiag[i - 1];\n    vecRight[i] = vecRight[i] - m * vecRight[i - 1];\n  }\n\n  // Solve the new system of equations by simple back-substitution.\n  const result = opt_result || new Array(vecRight.length);\n  result[nDim - 1] = vecRight[nDim - 1] / mainDiag[nDim - 1];\n  for (i = nDim - 2; i >= 0; --i) {\n    result[i] = (vecRight[i] - supDiag[i] * result[i + 1]) / mainDiag[i];\n  }\n  return result;\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/tdma.js"],"^O",["^=",["^7A"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.testing.messaging.mockportnetwork.js","^5",["^6","goog/testing/messaging/mockportnetwork.js"],"^7","goog/testing/messaging/mockportnetwork.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A fake PortNetwork implementation that simply produces\n * MockMessageChannels for all ports.\n *\n */\n\ngoog.setTestOnly('goog.testing.messaging.MockPortNetwork');\ngoog.provide('goog.testing.messaging.MockPortNetwork');\n\ngoog.forwardDeclare('goog.testing.MockControl');\ngoog.require('goog.messaging.PortNetwork');\n// interface\ngoog.require('goog.testing.messaging.MockMessageChannel');\n\n\n\n/**\n * The fake PortNetwork.\n *\n * @param {!goog.testing.MockControl} mockControl The mock control for creating\n *     the mock message channels.\n * @constructor\n * @implements {goog.messaging.PortNetwork}\n * @final\n */\ngoog.testing.messaging.MockPortNetwork = function(mockControl) {\n  /**\n   * The mock control for creating mock message channels.\n   * @type {!goog.testing.MockControl}\n   * @private\n   */\n  this.mockControl_ = mockControl;\n\n  /**\n   * The mock ports that have been created.\n   * @type {!Object<!goog.testing.messaging.MockMessageChannel>}\n   * @private\n   */\n  this.ports_ = {};\n};\n\n\n/**\n * Get the mock port with the given name.\n * @param {string} name The name of the port to get.\n * @return {!goog.testing.messaging.MockMessageChannel} The mock port.\n * @override\n */\ngoog.testing.messaging.MockPortNetwork.prototype.dial = function(name) {\n  if (!(name in this.ports_)) {\n    this.ports_[name] =\n        new goog.testing.messaging.MockMessageChannel(this.mockControl_);\n  }\n  return this.ports_[name];\n};\n","^;",1579837703000,"^<",["^=",["^6T","^?","~$goog.testing.messaging.MockMessageChannel"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/messaging/mockportnetwork.js"],"^O",["^=",["~$goog.testing.messaging.MockPortNetwork"]],"^W",true,"^X",["^?","^6T","^AG"]],["^ ","^3",[1579837703000],"^4","goog.positioning.absoluteposition.js","^5",["^6","goog/positioning/absoluteposition.js"],"^7","goog/positioning/absoluteposition.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Client viewport positioning class.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.positioning.AbsolutePosition');\n\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.positioning');\ngoog.require('goog.positioning.AbstractPosition');\n\n\n\n/**\n * Encapsulates a popup position where the popup absolutely positioned by\n * setting the left/top style elements directly to the specified values.\n * The position is generally relative to the element's offsetParent. Normally,\n * this is the document body, but can be another element if the popup element\n * is scoped by an element with relative position.\n *\n * @param {number|!goog.math.Coordinate} arg1 Left position or coordinate.\n * @param {number=} opt_arg2 Top position.\n * @constructor\n * @extends {goog.positioning.AbstractPosition}\n */\ngoog.positioning.AbsolutePosition = function(arg1, opt_arg2) {\n  /**\n   * Coordinate to position popup at.\n   * @type {goog.math.Coordinate}\n   */\n  this.coordinate = arg1 instanceof goog.math.Coordinate ?\n      arg1 :\n      new goog.math.Coordinate(/** @type {number} */ (arg1), opt_arg2);\n};\ngoog.inherits(\n    goog.positioning.AbsolutePosition, goog.positioning.AbstractPosition);\n\n\n/**\n * Repositions the popup according to the current state.\n *\n * @param {Element} movableElement The DOM element to position.\n * @param {goog.positioning.Corner} movableCorner The corner of the movable\n *     element that should be positioned at the specified position.\n * @param {goog.math.Box=} opt_margin A margin specified in pixels.\n * @param {goog.math.Size=} opt_preferredSize Preferred size of the\n *     movableElement.\n * @override\n */\ngoog.positioning.AbsolutePosition.prototype.reposition = function(\n    movableElement, movableCorner, opt_margin, opt_preferredSize) {\n  goog.positioning.positionAtCoordinate(\n      this.coordinate, movableElement, movableCorner, opt_margin, null, null,\n      opt_preferredSize);\n};\n","^;",1579837703000,"^<",["^=",["^3P","^?","~$goog.positioning.AbstractPosition","^3="]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/positioning/absoluteposition.js"],"^O",["^=",["^3N"]],"^W",true,"^X",["^?","^3=","^3P","^AI"]],["^ ","^3",[1579837703000],"^4","goog.testing.dom.js","^5",["^6","goog/testing/dom.js"],"^7","goog/testing/dom.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Testing utilities for DOM related tests.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.setTestOnly('goog.testing.dom');\ngoog.provide('goog.testing.dom');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.AbstractRange');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.NodeIterator');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagIterator');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.iter');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.style');\ngoog.require('goog.testing.asserts');\ngoog.require('goog.userAgent');\n\n\n/**\n * @return {!Node} A DIV node with a unique ID identifying the\n *     `END_TAG_MARKER_`.\n * @private\n */\ngoog.testing.dom.createEndTagMarker_ = function() {\n  var marker = goog.dom.createElement(goog.dom.TagName.DIV);\n  marker.id = goog.getUid(marker);\n  return marker;\n};\n\n\n/**\n * A unique object to use as an end tag marker.\n * @private {!Node}\n * @const\n */\ngoog.testing.dom.END_TAG_MARKER_ = goog.testing.dom.createEndTagMarker_();\n\n\n/**\n * Tests if the given iterator over nodes matches the given Array of node\n * descriptors.  Throws an error if any match fails.\n * @param {goog.iter.Iterator} it  An iterator over nodes.\n * @param {Array<Node|number|string>} array Array of node descriptors to match\n *     against.  Node descriptors can be any of the following:\n *         Node: Test if the two nodes are equal.\n *         number: Test node.nodeType == number.\n *         string starting with '#': Match the node's id with the text\n *             after \"#\".\n *         other string: Match the text node's contents.\n */\ngoog.testing.dom.assertNodesMatch = function(it, array) {\n  var i = 0;\n  goog.iter.forEach(it, function(node) {\n    if (array.length <= i) {\n      fail(\n          'Got more nodes than expected: ' +\n          goog.testing.dom.describeNode_(node));\n    }\n    var expected = array[i];\n\n    if (goog.dom.isNodeLike(expected)) {\n      assertEquals('Nodes should match at position ' + i, expected, node);\n    } else if (typeof expected === 'number') {\n      assertEquals(\n          'Node types should match at position ' + i, expected, node.nodeType);\n    } else if (expected.charAt(0) == '#') {\n      assertEquals(\n          'Expected element at position ' + i, goog.dom.NodeType.ELEMENT,\n          node.nodeType);\n      var expectedId = expected.substr(1);\n      assertEquals('IDs should match at position ' + i, expectedId, node.id);\n\n    } else {\n      assertEquals(\n          'Expected text node at position ' + i, goog.dom.NodeType.TEXT,\n          node.nodeType);\n      assertEquals(\n          'Node contents should match at position ' + i, expected,\n          node.nodeValue);\n    }\n\n    i++;\n  });\n\n  assertEquals('Used entire match array', array.length, i);\n};\n\n\n/**\n * Exposes a node as a string.\n * @param {Node} node A node.\n * @return {string} A string representation of the node.\n */\ngoog.testing.dom.exposeNode = function(node) {\n  node = /** @type {!Element} */ (node);\n  var result = node.nodeName || node.nodeValue;\n  if (node.id) {\n    result += '#' + node.id;\n  }\n  result += ':\"' + (node.innerHTML || '') + '\"';\n  return result;\n};\n\n\n/**\n * Exposes the nodes of a range wrapper as a string.\n * @param {goog.dom.AbstractRange} range A range.\n * @return {string} A string representation of the range.\n */\ngoog.testing.dom.exposeRange = function(range) {\n  // This is deliberately not implemented as\n  // goog.dom.AbstractRange.prototype.toString, because it is non-authoritative.\n  // Two equivalent ranges may have very different exposeRange values, and\n  // two different ranges may have equal exposeRange values.\n  // (The mapping of ranges to DOM nodes/offsets is a many-to-many mapping).\n  if (!range) {\n    return 'null';\n  }\n  return goog.testing.dom.exposeNode(range.getStartNode()) + ':' +\n      range.getStartOffset() + ' to ' +\n      goog.testing.dom.exposeNode(range.getEndNode()) + ':' +\n      range.getEndOffset();\n};\n\n\n/**\n * Determines if the current user agent matches the specified string.  Returns\n * false if the string does specify at least one user agent but does not match\n * the running agent.\n * @param {string} userAgents Space delimited string of user agents.\n * @return {boolean} Whether the user agent was matched.  Also true if no user\n *     agent was listed in the expectation string.\n * @private\n */\ngoog.testing.dom.checkUserAgents_ = function(userAgents) {\n  if (goog.string.startsWith(userAgents, '!')) {\n    if (goog.string.contains(userAgents, ' ')) {\n      throw new Error('Only a single negative user agent may be specified');\n    }\n    return !goog.userAgent[userAgents.substr(1)];\n  }\n\n  var agents = userAgents.split(' ');\n  var hasUserAgent = false;\n  for (var i = 0, len = agents.length; i < len; i++) {\n    var cls = agents[i];\n    if (cls in goog.userAgent) {\n      hasUserAgent = true;\n      if (goog.userAgent[cls]) {\n        return true;\n      }\n    }\n  }\n  // If we got here, there was a user agent listed but we didn't match it.\n  return !hasUserAgent;\n};\n\n\n/**\n * Map function that converts end tags to a specific object.\n * @param {Node} node The node to map.\n * @param {undefined} ignore Always undefined.\n * @param {!goog.iter.Iterator<Node>} iterator The iterator.\n * @return {Node} The resulting iteration item.\n * @private\n */\ngoog.testing.dom.endTagMap_ = function(node, ignore, iterator) {\n  goog.asserts.assertInstanceof(iterator, goog.dom.TagIterator);\n  return iterator.isEndTag() ? goog.testing.dom.END_TAG_MARKER_ : node;\n};\n\n\n/**\n * Check if the given node is important.\n *\n * A node is important if it is\n *   - a non-empty text node; or,\n *   - or an element annotated to match on this user agent; or,\n *   - a non-annotated element\n *\n * @param {Node} node The node to test.\n * @return {boolean} Whether this node should be included for iteration.\n * @private\n */\ngoog.testing.dom.nodeFilter_ = function(node) {\n  if (node.nodeType == goog.dom.NodeType.TEXT) {\n    // If a node is part of a string of text nodes and it has spaces in it,\n    // we allow it since it's going to affect the merging of nodes done below.\n    if (goog.string.isBreakingWhitespace(node.nodeValue) &&\n        (!node.previousSibling ||\n         node.previousSibling.nodeType != goog.dom.NodeType.TEXT) &&\n        (!node.nextSibling ||\n         node.nextSibling.nodeType != goog.dom.NodeType.TEXT)) {\n      return false;\n    }\n    // Allow optional text to be specified as [[BROWSER1 BROWSER2]]Text\n    var match = node.nodeValue.match(/^\\[\\[(.+)\\]\\]/);\n    if (match) {\n      return goog.testing.dom.checkUserAgents_(match[1]);\n    }\n\n    return true;\n  }\n\n  // This cast exists to preserve existing behaviour. It's risky, but fine as\n  // long as we only access direct properties of `node`.\n  var maybeElement = /** @type {!Element} */ (node);\n  if (maybeElement.className && typeof maybeElement.className === 'string') {\n    return goog.testing.dom.checkUserAgents_(maybeElement.className);\n  }\n\n  return true;\n};\n\n\n/**\n * Determines the text to match from the given node, removing browser\n * specification strings.\n * @param {Node} node The node expected to match.\n * @return {string} The text, stripped of browser specification strings.\n * @private\n */\ngoog.testing.dom.getExpectedText_ = function(node) {\n  // Strip off the browser specifications.\n  return node.nodeValue.match(/^(\\[\\[.+\\]\\])?([\\s\\S]*)/)[2];\n};\n\n\n/**\n * Describes the given node.\n * @param {Node} node The node to describe.\n * @return {string} A description of the node.\n * @private\n */\ngoog.testing.dom.describeNode_ = function(node) {\n  if (node.nodeType == goog.dom.NodeType.TEXT) {\n    return '[Text: ' + node.nodeValue + ']';\n  } else {\n    // We can't actually be sure this is an Element, but other code depends on\n    // us pretending it is.\n    node = /** @type {!Element} */ (node);\n    return '<' + node.tagName + (node.id ? ' #' + node.id : '') + ' .../>';\n  }\n};\n\n\n/**\n * Assert that the html in `actual` is substantially similar to\n * htmlPattern.  This method tests for the same set of styles, for the same\n * order of nodes, and the presence of attributes.  Breaking whitespace nodes\n * are ignored.  Elements can be\n * annotated with classnames corresponding to keys in goog.userAgent and will be\n * expected to show up in that user agent and expected not to show up in\n * others.\n * @param {string} htmlPattern The pattern to match.\n * @param {!Element} actual The element to check: its contents are matched\n *     against the HTML pattern.\n * @param {boolean=} opt_strictAttributes If false, attributes that appear in\n *     htmlPattern must be in actual, but actual can have attributes not\n *     present in htmlPattern.  If true, htmlPattern and actual must have the\n *     same set of attributes.  Default is false.\n */\ngoog.testing.dom.assertHtmlContentsMatch = function(\n    htmlPattern, actual, opt_strictAttributes) {\n  var div = goog.dom.createDom(goog.dom.TagName.DIV);\n  div.innerHTML = htmlPattern;\n\n  var errorSuffix =\n      '\\nExpected\\n' + div.innerHTML + '\\nActual\\n' + actual.innerHTML;\n\n  var actualIt = goog.iter.filter(\n      goog.iter.map(\n          new goog.dom.TagIterator(actual), goog.testing.dom.endTagMap_),\n      goog.testing.dom.nodeFilter_);\n\n  var expectedIt = goog.iter.filter(\n      new goog.dom.NodeIterator(div), goog.testing.dom.nodeFilter_);\n\n  var actualNode;\n  var preIterated = false;\n  var advanceActualNode = function() {\n    // If the iterator has already been advanced, don't advance it again.\n    if (!preIterated) {\n      actualNode = goog.iter.nextOrValue(actualIt, null);\n    }\n    preIterated = false;\n\n    // Advance the iterator so long as it is return end tags.\n    while (actualNode == goog.testing.dom.END_TAG_MARKER_) {\n      actualNode = goog.iter.nextOrValue(actualIt, null);\n    }\n  };\n\n  // HACK(brenneman): IE has unique ideas about whitespace handling when setting\n  // innerHTML. This results in elision of leading whitespace in the expected\n  // nodes where doing so doesn't affect visible rendering. As a workaround, we\n  // remove the leading whitespace in the actual nodes where necessary.\n  //\n  // The collapsible variable tracks whether we should collapse the whitespace\n  // in the next Text node we encounter.\n  var IE_TEXT_COLLAPSE =\n      goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9');\n\n  var collapsible = true;\n\n  var number = 0;\n  goog.iter.forEach(expectedIt, function(expectedNode) {\n    advanceActualNode();\n    assertNotNull(\n        'Finished actual HTML before finishing expected HTML at ' +\n            'node number ' + number + ': ' +\n            goog.testing.dom.describeNode_(expectedNode) + errorSuffix,\n        actualNode);\n\n    // Do no processing for expectedNode == div.\n    if (expectedNode == div) {\n      return;\n    }\n\n    assertEquals(\n        'Should have the same node type, got ' +\n            goog.testing.dom.describeNode_(actualNode) + ' but expected ' +\n            goog.testing.dom.describeNode_(expectedNode) + '.' + errorSuffix,\n        expectedNode.nodeType, actualNode.nodeType);\n\n    if (expectedNode.nodeType == goog.dom.NodeType.ELEMENT) {\n      var expectedElem = goog.asserts.assertElement(expectedNode);\n      var actualElem = goog.asserts.assertElement(actualNode);\n\n      assertEquals(\n          'Tag names should match' + errorSuffix, expectedElem.tagName,\n          actualElem.tagName);\n      assertEquals(\n          'Namespaces should match' + errorSuffix, expectedElem.namespaceURI,\n          actualElem.namespaceURI);\n      assertObjectEquals(\n          'Should have same styles' + errorSuffix,\n          goog.style.parseStyleAttribute(expectedElem.style.cssText),\n          goog.style.parseStyleAttribute(actualElem.style.cssText));\n      goog.testing.dom.assertAttributesEqual_(\n          errorSuffix, expectedElem, actualElem, !!opt_strictAttributes);\n\n      if (IE_TEXT_COLLAPSE &&\n          goog.style.getCascadedStyle(actualElem, 'display') != 'inline') {\n        // Text may be collapsed after any non-inline element.\n        collapsible = true;\n      }\n\n      // Contents of template tags belong to a separate document and are not\n      // iterated on by the current iterator, unless the browser is too old to\n      // treat template tags differently. We recursively assert equality of the\n      // two template document fragments.\n      if (actualElem.tagName == goog.dom.TagName.TEMPLATE) {\n        // IE throws if HTMLTemplateElement is referenced at runtime.\n        actualElem = /** @type {HTMLTemplateElement} */ (actualElem);\n        if (actualElem.content) {\n          goog.testing.dom.assertHtmlMatches(\n              expectedElem.innerHTML, actualElem.innerHTML,\n              opt_strictAttributes);\n        }\n      }\n    } else {\n      // Concatenate text nodes until we reach a non text node.\n      var actualText = actualNode.nodeValue;\n      preIterated = true;\n      while ((actualNode = goog.iter.nextOrValue(actualIt, null)) &&\n             actualNode.nodeType == goog.dom.NodeType.TEXT) {\n        actualText += actualNode.nodeValue;\n      }\n\n      if (IE_TEXT_COLLAPSE) {\n        // Collapse the leading whitespace, unless the string consists entirely\n        // of whitespace.\n        if (collapsible && !goog.string.isEmptyOrWhitespace(actualText)) {\n          actualText = goog.string.trimLeft(actualText);\n        }\n        // Prepare to collapse whitespace in the next Text node if this one does\n        // not end in a whitespace character.\n        collapsible = /\\s$/.test(actualText);\n      }\n\n      var expectedText = goog.testing.dom.getExpectedText_(expectedNode);\n      if ((actualText && !goog.string.isBreakingWhitespace(actualText)) ||\n          (expectedText && !goog.string.isBreakingWhitespace(expectedText))) {\n        var normalizedActual = actualText.replace(/\\s+/g, ' ');\n        var normalizedExpected = expectedText.replace(/\\s+/g, ' ');\n\n        assertEquals(\n            'Text should match' + errorSuffix, normalizedExpected,\n            normalizedActual);\n      }\n    }\n\n    number++;\n  });\n\n  advanceActualNode();\n  assertNull(\n      'Finished expected HTML before finishing actual HTML' + errorSuffix,\n      goog.iter.nextOrValue(actualIt, null));\n};\n\n\n/**\n * Assert that the html in `actual` is substantially similar to\n * htmlPattern.  This method tests for the same set of styles, and for the same\n * order of nodes.  Breaking whitespace nodes are ignored.  Elements can be\n * annotated with classnames corresponding to keys in goog.userAgent and will be\n * expected to show up in that user agent and expected not to show up in\n * others.\n * @param {string} htmlPattern The pattern to match.\n * @param {string} actual The html to check.\n * @param {boolean=} opt_strictAttributes If false, attributes that appear in\n *     htmlPattern must be in actual, but actual can have attributes not\n *     present in htmlPattern. If true, htmlPattern and actual must have the\n *     same set of attributes. Default is false.\n */\ngoog.testing.dom.assertHtmlMatches = function(\n    htmlPattern, actual, opt_strictAttributes) {\n  var div = goog.dom.createDom(goog.dom.TagName.DIV);\n  div.innerHTML = actual;\n\n  goog.testing.dom.assertHtmlContentsMatch(\n      htmlPattern, div, opt_strictAttributes);\n};\n\n\n/**\n * Finds the first text node descendant of root with the given content.  Note\n * that this operates on a text node level, so if text nodes get split this\n * may not match the user visible text.  Using normalize() may help here.\n * @param {string|RegExp} textOrRegexp The text to find, or a regular\n *     expression to find a match of.\n * @param {Element} root The element to search in.\n * @return {?Node} The first text node that matches, or null if none is found.\n */\ngoog.testing.dom.findTextNode = function(textOrRegexp, root) {\n  var it = new goog.dom.NodeIterator(root);\n  var ret = goog.iter.nextOrValue(goog.iter.filter(it, function(node) {\n    if (node.nodeType == goog.dom.NodeType.TEXT) {\n      if (typeof textOrRegexp === 'string') {\n        return node.nodeValue == textOrRegexp;\n      } else {\n        return !!node.nodeValue.match(textOrRegexp);\n      }\n    } else {\n      return false;\n    }\n  }), null);\n  return ret;\n};\n\n\n/**\n * Assert the end points of a range.\n *\n * Notice that \"Are two ranges visually identical?\" and \"Do two ranges have\n * the same endpoint?\" are independent questions. Two visually identical ranges\n * may have different endpoints. And two ranges with the same endpoints may\n * be visually different.\n *\n * @param {Node} start The expected start node.\n * @param {number} startOffset The expected start offset.\n * @param {Node} end The expected end node.\n * @param {number} endOffset The expected end offset.\n * @param {goog.dom.AbstractRange} range The actual range.\n */\ngoog.testing.dom.assertRangeEquals = function(\n    start, startOffset, end, endOffset, range) {\n  assertEquals('Unexpected start node', start, range.getStartNode());\n  assertEquals('Unexpected end node', end, range.getEndNode());\n  assertEquals('Unexpected start offset', startOffset, range.getStartOffset());\n  assertEquals('Unexpected end offset', endOffset, range.getEndOffset());\n};\n\n\n/**\n * Gets the value of a DOM attribute in deterministic way.\n * @param {!Element} node A node.\n * @param {string} name Attribute name.\n * @return {*} Attribute value.\n * @private\n */\ngoog.testing.dom.getAttributeValue_ = function(node, name) {\n  // These hacks avoid nondetermistic results in the following cases:\n  // WebKit: Two radio buttons with the same name can't be checked at the same\n  //      time, even if only one of them is in the document.\n  if (goog.userAgent.WEBKIT && node.tagName == goog.dom.TagName.INPUT &&\n      node['type'] == goog.dom.InputType.RADIO && name == 'checked') {\n    return false;\n  }\n\n  // IE/Edge: cannot use node['src'] when the attribute contains HTTP\n  // credentials. getAttribute works though.\n  if ((goog.userAgent.IE || goog.userAgent.EDGE) && name == 'src') {\n    return node.getAttribute(name);\n  }\n\n  // All browsers: some attributes return different values for getAttribute even\n  // if the values are semantically equivalent. E.g. <div disabled=\"\"> and\n  // <div disabled=\"disabled\"> should register as equal. We use node[name]\n  // if it's available.\n  return node[name] !== undefined &&\n          typeof node.getAttribute(name) != typeof node[name] ?\n      node[name] :\n      node.getAttribute(name);\n};\n\n\n/**\n * Assert that the attributes of two Nodes are the same (ignoring any\n * instances of the style attribute).\n * @param {string} errorSuffix String to add to end of error messages.\n * @param {!Element} expectedElem The element whose attributes we are expecting.\n * @param {!Element} actualElem The element with the actual attributes.\n * @param {boolean} strictAttributes If false, attributes that appear in\n *     expectedNode must also be in actualNode, but actualNode can have\n *     attributes not present in expectedNode.  If true, expectedNode and\n *     actualNode must have the same set of attributes.\n * @private\n */\ngoog.testing.dom.assertAttributesEqual_ = function(\n    errorSuffix, expectedElem, actualElem, strictAttributes) {\n  if (strictAttributes) {\n    goog.testing.dom.compareClassAttribute_(expectedElem, actualElem);\n  }\n\n  var expectedAttributes = expectedElem.attributes;\n  var actualAttributes = actualElem.attributes;\n\n  for (var i = 0, len = expectedAttributes.length; i < len; i++) {\n    var expectedName = expectedAttributes[i].name;\n    var expectedValue =\n        goog.testing.dom.getAttributeValue_(expectedElem, expectedName);\n\n    var actualAttribute = actualAttributes[expectedName];\n    var actualValue =\n        goog.testing.dom.getAttributeValue_(actualElem, expectedName);\n\n    // IE enumerates attribute names in the expected node that are not present,\n    // causing an undefined actualAttribute.\n    if (!expectedValue && !actualValue) {\n      continue;\n    }\n\n    if (expectedName == 'id' && goog.userAgent.IE) {\n      goog.testing.dom.compareIdAttributeForIe_(\n          /** @type {string} */ (expectedValue), actualAttribute,\n          strictAttributes, errorSuffix);\n      continue;\n    }\n\n    if (goog.testing.dom.ignoreAttribute_(expectedName)) {\n      continue;\n    }\n\n    assertNotUndefined(\n        'Expected to find attribute with name ' + expectedName +\n            ', in element ' + goog.testing.dom.describeNode_(actualElem) +\n            errorSuffix,\n        actualAttribute);\n    assertEquals(\n        'Expected attribute ' + expectedName + ' has a different value ' +\n            errorSuffix,\n        String(expectedValue), String(\n                                   goog.testing.dom.getAttributeValue_(\n                                       actualElem, actualAttribute.name)));\n  }\n\n  if (strictAttributes) {\n    for (i = 0; i < actualAttributes.length; i++) {\n      var actualName = actualAttributes[i].name;\n      var actualAttribute = actualAttributes.getNamedItem(actualName);\n\n      if (!actualAttribute || goog.testing.dom.ignoreAttribute_(actualName)) {\n        continue;\n      }\n\n      assertNotUndefined(\n          'Unexpected attribute with name ' + actualName + ' in element ' +\n              goog.testing.dom.describeNode_(actualElem) + errorSuffix,\n          expectedAttributes[actualName]);\n    }\n  }\n};\n\n\n/**\n * Assert the class attribute of actualElem is the same as the one in\n * expectedElem, ignoring classes that are useragents.\n * @param {!Element} expectedElem The DOM element whose class we expect.\n * @param {!Element} actualElem The DOM element with the actual class.\n * @private\n */\ngoog.testing.dom.compareClassAttribute_ = function(expectedElem, actualElem) {\n  var classes = goog.dom.classlist.get(expectedElem);\n\n  var expectedClasses = [];\n  for (var i = 0, len = classes.length; i < len; i++) {\n    if (!(classes[i] in goog.userAgent)) {\n      expectedClasses.push(classes[i]);\n    }\n  }\n  expectedClasses.sort();\n\n  var actualClasses = goog.array.toArray(goog.dom.classlist.get(actualElem));\n  actualClasses.sort();\n\n  assertArrayEquals(\n      'Expected class was: ' + expectedClasses.join(' ') +\n          ', but actual class was: ' + actualElem.className + ' in node ' +\n          goog.testing.dom.describeNode_(actualElem),\n      expectedClasses, actualClasses);\n};\n\n\n/**\n * Set of attributes IE adds to elements randomly.\n * @type {Object}\n * @private\n */\ngoog.testing.dom.BAD_IE_ATTRIBUTES_ = goog.object.createSet(\n    'methods', 'CHECKED', 'dataFld', 'dataFormatAs', 'dataSrc');\n\n\n/**\n * Whether to ignore the attribute.\n * @param {string} name Name of the attribute.\n * @return {boolean} True if the attribute should be ignored.\n * @private\n */\ngoog.testing.dom.ignoreAttribute_ = function(name) {\n  if (name == 'style' || name == 'class' || name == 'xmlns') {\n    return true;\n  }\n  return goog.userAgent.IE && goog.testing.dom.BAD_IE_ATTRIBUTES_[name];\n};\n\n\n/**\n * Compare id attributes for IE.  In IE, if an element lacks an id attribute\n * in the original HTML, the element object will still have such an attribute,\n * but its value will be the empty string.\n * @param {string} expectedValue The expected value of the id attribute.\n * @param {Attr} actualAttribute The actual id attribute.\n * @param {boolean} strictAttributes Whether strict attribute checking should be\n *     done.\n * @param {string} errorSuffix String to append to error messages.\n * @private\n */\ngoog.testing.dom.compareIdAttributeForIe_ = function(\n    expectedValue, actualAttribute, strictAttributes, errorSuffix) {\n  if (expectedValue === '') {\n    if (strictAttributes) {\n      assertTrue(\n          'Unexpected attribute with name id in element ' + errorSuffix,\n          actualAttribute.value == '');\n    }\n  } else {\n    assertNotUndefined(\n        'Expected to find attribute with name id, in element ' + errorSuffix,\n        actualAttribute);\n    assertNotEquals(\n        'Expected to find attribute with name id, in element ' + errorSuffix,\n        '', actualAttribute.value);\n    assertEquals(\n        'Expected attribute has a different value ' + errorSuffix,\n        expectedValue, actualAttribute.value);\n  }\n};\n","^;",1579837703000,"^<",["^=",["^1L","^8O","^1>","~$goog.dom.AbstractRange","^1M","^8P","^2K","^5[","^2L","~$goog.dom.NodeIterator","^1U","^?","^42","^[","^1F","^2O","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/dom.js"],"^O",["^=",["^7;"]],"^W",true,"^X",["^?","^2O","^1L","^1>","^AJ","^1U","^AK","^2K","^8P","^12","^1M","^8O","^42","^2L","^1F","^5[","^["]],["^ ","^3",[1579837703000],"^4","goog.soy.data.js","^5",["^6","goog/soy/data.js"],"^7","goog/soy/data.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Soy data primitives.\n *\n * The goal is to encompass data types used by Soy, especially to mark content\n * as known to be \"safe\".\n *\n * @author gboyer@google.com (Garrett Boyer)\n */\n\ngoog.provide('goog.soy.data.SanitizedContent');\ngoog.provide('goog.soy.data.SanitizedContentKind');\ngoog.provide('goog.soy.data.SanitizedCss');\ngoog.provide('goog.soy.data.SanitizedHtml');\ngoog.provide('goog.soy.data.SanitizedHtmlAttribute');\ngoog.provide('goog.soy.data.SanitizedJs');\ngoog.provide('goog.soy.data.SanitizedTrustedResourceUri');\ngoog.provide('goog.soy.data.SanitizedUri');\n\ngoog.require('goog.Uri');\ngoog.require('goog.asserts');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.SafeScript');\ngoog.require('goog.html.SafeStyle');\ngoog.require('goog.html.SafeStyleSheet');\ngoog.require('goog.html.SafeUrl');\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.html.uncheckedconversions');\ngoog.require('goog.i18n.bidi.Dir');\ngoog.require('goog.string.Const');\n\n\n/**\n * A type of textual content.\n *\n * This is an enum of type Object so that these values are unforgeable.\n *\n * @enum {!Object}\n */\ngoog.soy.data.SanitizedContentKind = {\n\n  /**\n   * A snippet of HTML that does not start or end inside a tag, comment, entity,\n   * or DOCTYPE; and that does not contain any executable code\n   * (JS, {@code <object>}s, etc.) from a different trust domain.\n   */\n  HTML: goog.DEBUG ? {sanitizedContentKindHtml: true} : {},\n\n  /**\n   * Executable JavaScript code or expression, safe for insertion in a\n   * script-tag or event handler context, known to be free of any\n   * attacker-controlled scripts. This can either be side-effect-free\n   * JavaScript (such as JSON) or JavaScript that's entirely under Google's\n   * control.\n   */\n  JS: goog.DEBUG ? {sanitizedContentJsChars: true} : {},\n\n  /** A properly encoded portion of a URI. */\n  URI: goog.DEBUG ? {sanitizedContentUri: true} : {},\n\n  /** A resource URI not under attacker control. */\n  TRUSTED_RESOURCE_URI:\n      goog.DEBUG ? {sanitizedContentTrustedResourceUri: true} : {},\n\n  /**\n   * Repeated attribute names and values. For example,\n   * {@code dir=\"ltr\" foo=\"bar\" onclick=\"trustedFunction()\" checked}.\n   */\n  ATTRIBUTES: goog.DEBUG ? {sanitizedContentHtmlAttribute: true} : {},\n\n  // TODO: Consider separating rules, declarations, and values into\n  // separate types, but for simplicity, we'll treat explicitly blessed\n  // SanitizedContent as allowed in all of these contexts.\n  /**\n   * A CSS3 declaration, property, value or group of semicolon separated\n   * declarations.\n   */\n  STYLE: goog.DEBUG ? {sanitizedContentStyle: true} : {},\n\n  /** A CSS3 style sheet (list of rules). */\n  CSS: goog.DEBUG ? {sanitizedContentCss: true} : {}\n\n  // TEXT doesn't produce SanitizedContent anymore, use renderText.\n};\n\n\n\n/**\n * A string-like object that carries a content-type and a content direction.\n *\n * IMPORTANT! Do not create these directly, nor instantiate the subclasses.\n * Instead, use a trusted, centrally reviewed library as endorsed by your team\n * to generate these objects. Otherwise, you risk accidentally creating\n * SanitizedContent that is attacker-controlled and gets evaluated unescaped in\n * templates.\n *\n * @constructor\n */\ngoog.soy.data.SanitizedContent = function() {\n  throw new Error('Do not instantiate directly');\n};\n\n\n/**\n * The context in which this content is safe from XSS attacks.\n * @type {goog.soy.data.SanitizedContentKind}\n */\ngoog.soy.data.SanitizedContent.prototype.contentKind;\n\n\n/**\n * The content's direction; null if unknown and thus to be estimated when\n * necessary.\n * @type {?goog.i18n.bidi.Dir}\n */\ngoog.soy.data.SanitizedContent.prototype.contentDir = null;\n\n\n/**\n * The already-safe content.\n * @protected {string}\n */\ngoog.soy.data.SanitizedContent.prototype.content;\n\n\n/**\n * Gets the already-safe content.\n * @return {string}\n */\ngoog.soy.data.SanitizedContent.prototype.getContent = function() {\n  return this.content;\n};\n\n\n/** @override */\ngoog.soy.data.SanitizedContent.prototype.toString = function() {\n  return this.content;\n};\n\n\n/**\n * Converts sanitized content of kind HTML into SafeHtml\n * @return {!goog.html.SafeHtml}\n * @throws {!Error} when the content kind is not HTML.\n */\ngoog.soy.data.SanitizedContent.prototype.toSafeHtml = function() {\n  if (this.contentKind !== goog.soy.data.SanitizedContentKind.HTML) {\n    throw new Error('Sanitized content was not of kind HTML.');\n  }\n  return goog.html.uncheckedconversions\n      .safeHtmlFromStringKnownToSatisfyTypeContract(\n          goog.string.Const.from(\n              'Soy SanitizedContent of kind HTML produces ' +\n              'SafeHtml-contract-compliant value.'),\n          this.toString(), this.contentDir);\n};\n\n\n/**\n * Converts sanitized content of kind URI into SafeUrl without modification.\n * @return {!goog.html.SafeUrl}\n * @throws {Error} when the content kind is not URI.\n */\ngoog.soy.data.SanitizedContent.prototype.toSafeUrl = function() {\n  if (this.contentKind !== goog.soy.data.SanitizedContentKind.URI) {\n    throw new Error('Sanitized content was not of kind URI.');\n  }\n  return goog.html.uncheckedconversions\n      .safeUrlFromStringKnownToSatisfyTypeContract(\n          goog.string.Const.from(\n              'Soy SanitizedContent of kind URI produces ' +\n              'SafeHtml-contract-compliant value.'),\n          this.toString());\n};\n\n\n/**\n * Content of type {@link goog.soy.data.SanitizedContentKind.HTML}.\n *\n * The content is a string of HTML that can safely be embedded in a PCDATA\n * context in your app.  If you would be surprised to find that an HTML\n * sanitizer produced `s` (e.g.  it runs code or fetches bad URLs) and\n * you wouldn't write a template that produces `s` on security or privacy\n * grounds, then don't pass `s` here. The default content direction is\n * unknown, i.e. to be estimated when necessary.\n *\n * @extends {goog.soy.data.SanitizedContent}\n * @constructor\n */\ngoog.soy.data.SanitizedHtml = function() {\n  goog.soy.data.SanitizedHtml.base(this, 'constructor');\n};\ngoog.inherits(goog.soy.data.SanitizedHtml, goog.soy.data.SanitizedContent);\n\n\n/** @override */\ngoog.soy.data.SanitizedHtml.prototype.contentKind =\n    goog.soy.data.SanitizedContentKind.HTML;\n\n\n/**\n * Checks if the value could be used as the Soy type {html}.\n * @param {*} value\n * @return {boolean}\n */\ngoog.soy.data.SanitizedHtml.isCompatibleWith = function(value) {\n  return typeof value === 'string' ||\n      value instanceof goog.soy.data.SanitizedHtml ||\n      value instanceof goog.html.SafeHtml;\n};\n\n\n/**\n * Checks if the value could be used as the Soy type {html}.\n * Strict: disallows strings.\n * @param {*} value\n * @return {boolean}\n */\ngoog.soy.data.SanitizedHtml.isCompatibleWithStrict = function(value) {\n  return value instanceof goog.soy.data.SanitizedHtml ||\n      value instanceof goog.html.SafeHtml;\n};\n\n\n/**\n * Content of type {@link goog.soy.data.SanitizedContentKind.JS}.\n *\n * The content is JavaScript source that when evaluated does not execute any\n * attacker-controlled scripts. The content direction is LTR.\n *\n * @extends {goog.soy.data.SanitizedContent}\n * @constructor\n */\ngoog.soy.data.SanitizedJs = function() {\n  goog.soy.data.SanitizedJs.base(this, 'constructor');\n};\ngoog.inherits(goog.soy.data.SanitizedJs, goog.soy.data.SanitizedContent);\n\n\n/** @override */\ngoog.soy.data.SanitizedJs.prototype.contentKind =\n    goog.soy.data.SanitizedContentKind.JS;\n\n\n/** @override */\ngoog.soy.data.SanitizedJs.prototype.contentDir = goog.i18n.bidi.Dir.LTR;\n\n\n/**\n * Checks if the value could be used as the Soy type {js}.\n * @param {*} value\n * @return {boolean}\n */\ngoog.soy.data.SanitizedJs.isCompatibleWith = function(value) {\n  return typeof value === 'string' ||\n      value instanceof goog.soy.data.SanitizedJs ||\n      value instanceof goog.html.SafeScript;\n};\n\n/**\n * Checks if the value could be used as the Soy type {js}.\n * Strict: disallows strings.\n * @param {*} value\n * @return {boolean}\n */\ngoog.soy.data.SanitizedJs.isCompatibleWithStrict = function(value) {\n  return value instanceof goog.soy.data.SanitizedJs ||\n      value instanceof goog.html.SafeHtml;\n};\n\n\n/**\n * Content of type {@link goog.soy.data.SanitizedContentKind.URI}.\n *\n * The content is a URI chunk that the caller knows is safe to emit in a\n * template. The content direction is LTR.\n *\n * @extends {goog.soy.data.SanitizedContent}\n * @constructor\n */\ngoog.soy.data.SanitizedUri = function() {\n  goog.soy.data.SanitizedUri.base(this, 'constructor');\n};\ngoog.inherits(goog.soy.data.SanitizedUri, goog.soy.data.SanitizedContent);\n\n/** @override */\ngoog.soy.data.SanitizedUri.prototype.contentKind =\n    goog.soy.data.SanitizedContentKind.URI;\n\n\n/** @override */\ngoog.soy.data.SanitizedUri.prototype.contentDir = goog.i18n.bidi.Dir.LTR;\n\n\n/**\n * Checks if the value could be used as the Soy type {uri}.\n * @param {*} value\n * @return {boolean}\n */\ngoog.soy.data.SanitizedUri.isCompatibleWith = function(value) {\n  return typeof value === 'string' ||\n      value instanceof goog.soy.data.SanitizedUri ||\n      value instanceof goog.html.SafeUrl ||\n      value instanceof goog.html.TrustedResourceUrl ||\n      value instanceof goog.Uri;\n};\n\n\n/**\n * Checks if the value could be used as the Soy type {uri}.\n * Strict: disallows strings.\n * @param {*} value\n * @return {boolean}\n */\ngoog.soy.data.SanitizedUri.isCompatibleWithStrict = function(value) {\n  return value instanceof goog.soy.data.SanitizedUri ||\n      value instanceof goog.html.SafeUrl ||\n      value instanceof goog.html.TrustedResourceUrl ||\n      value instanceof goog.Uri;\n};\n\n\n\n/**\n * Content of type\n * {@link goog.soy.data.SanitizedContentKind.TRUSTED_RESOURCE_URI}.\n *\n * The content is a TrustedResourceUri chunk that is not under attacker control.\n * The content direction is LTR.\n *\n * @extends {goog.soy.data.SanitizedContent}\n * @constructor\n */\ngoog.soy.data.SanitizedTrustedResourceUri = function() {\n  goog.soy.data.SanitizedTrustedResourceUri.base(this, 'constructor');\n};\ngoog.inherits(\n    goog.soy.data.SanitizedTrustedResourceUri, goog.soy.data.SanitizedContent);\n\n\n/** @override */\ngoog.soy.data.SanitizedTrustedResourceUri.prototype.contentKind =\n    goog.soy.data.SanitizedContentKind.TRUSTED_RESOURCE_URI;\n\n\n/** @override */\ngoog.soy.data.SanitizedTrustedResourceUri.prototype.contentDir =\n    goog.i18n.bidi.Dir.LTR;\n\n\n/**\n * Converts sanitized content into TrustedResourceUrl without modification.\n * @return {!goog.html.TrustedResourceUrl}\n */\ngoog.soy.data.SanitizedTrustedResourceUri.prototype.toTrustedResourceUrl =\n    function() {\n  return goog.html.uncheckedconversions\n      .trustedResourceUrlFromStringKnownToSatisfyTypeContract(\n          goog.string.Const.from(\n              'Soy SanitizedContent of kind TRUSTED_RESOURCE_URI produces ' +\n              'TrustedResourceUrl-contract-compliant value.'),\n          this.toString());\n};\n\n\n/**\n * Checks if the value could be used as the Soy type {trusted_resource_uri}.\n * @param {*} value\n * @return {boolean}\n */\ngoog.soy.data.SanitizedTrustedResourceUri.isCompatibleWith = function(value) {\n  return typeof value === 'string' ||\n      value instanceof goog.soy.data.SanitizedTrustedResourceUri ||\n      value instanceof goog.html.TrustedResourceUrl;\n};\n\n\n/**\n * Checks if the value could be used as the Soy type {trusted_resource_uri}.\n * Strict: disallows strings.\n * @param {*} value\n * @return {boolean}\n */\ngoog.soy.data.SanitizedTrustedResourceUri.isCompatibleWithStrict = function(\n    value) {\n  return value instanceof goog.soy.data.SanitizedTrustedResourceUri ||\n      value instanceof goog.html.TrustedResourceUrl;\n};\n\n\n\n/**\n * Content of type {@link goog.soy.data.SanitizedContentKind.ATTRIBUTES}.\n *\n * The content should be safely embeddable within an open tag, such as a\n * key=\"value\" pair. The content direction is LTR.\n *\n * @extends {goog.soy.data.SanitizedContent}\n * @constructor\n */\ngoog.soy.data.SanitizedHtmlAttribute = function() {\n  goog.soy.data.SanitizedHtmlAttribute.base(this, 'constructor');\n};\ngoog.inherits(\n    goog.soy.data.SanitizedHtmlAttribute, goog.soy.data.SanitizedContent);\n\n\n/** @override */\ngoog.soy.data.SanitizedHtmlAttribute.prototype.contentKind =\n    goog.soy.data.SanitizedContentKind.ATTRIBUTES;\n\n\n/** @override */\ngoog.soy.data.SanitizedHtmlAttribute.prototype.contentDir =\n    goog.i18n.bidi.Dir.LTR;\n\n\n/**\n * Checks if the value could be used as the Soy type {attribute}.\n * @param {*} value\n * @return {boolean}\n */\ngoog.soy.data.SanitizedHtmlAttribute.isCompatibleWith = function(value) {\n  return typeof value === 'string' ||\n      value instanceof goog.soy.data.SanitizedHtmlAttribute;\n};\n\n\n/**\n * Checks if the value could be used as the Soy type {attribute}.\n * Strict: disallows strings.\n * @param {*} value\n * @return {boolean}\n */\ngoog.soy.data.SanitizedHtmlAttribute.isCompatibleWithStrict = function(value) {\n  return value instanceof goog.soy.data.SanitizedHtmlAttribute;\n};\n\n\n\n/**\n * Content of type {@link goog.soy.data.SanitizedContentKind.CSS}.\n *\n * The content is non-attacker-exploitable CSS, such as {@code @import url(x)}.\n * The content direction is LTR.\n *\n * @extends {goog.soy.data.SanitizedContent}\n * @constructor\n */\ngoog.soy.data.SanitizedCss = function() {\n  goog.soy.data.SanitizedCss.base(this, 'constructor');\n};\ngoog.inherits(goog.soy.data.SanitizedCss, goog.soy.data.SanitizedContent);\n\n\n/** @override */\ngoog.soy.data.SanitizedCss.prototype.contentKind =\n    goog.soy.data.SanitizedContentKind.CSS;\n\n\n/** @override */\ngoog.soy.data.SanitizedCss.prototype.contentDir = goog.i18n.bidi.Dir.LTR;\n\n\n/**\n * Checks if the value could be used as the Soy type {css}.\n * @param {*} value\n * @return {boolean}\n */\ngoog.soy.data.SanitizedCss.isCompatibleWith = function(value) {\n  return typeof value === 'string' ||\n      value instanceof goog.soy.data.SanitizedCss ||\n      value instanceof goog.html.SafeStyle ||\n      value instanceof goog.html.SafeStyleSheet;\n};\n\n\n/**\n * Checks if the value could be used as the Soy type {css}.\n * Strict: disallows strings.\n * @param {*} value\n * @return {boolean}\n */\ngoog.soy.data.SanitizedCss.isCompatibleWithStrict = function(value) {\n  return value instanceof goog.soy.data.SanitizedCss ||\n      value instanceof goog.html.SafeStyle ||\n      value instanceof goog.html.SafeStyleSheet;\n};\n\n\n/**\n * Converts SanitizedCss into SafeStyleSheet.\n * Note: SanitizedCss in Soy represents both SafeStyle and SafeStyleSheet in\n * Closure. It's about to be split so that SanitizedCss represents only\n * SafeStyleSheet.\n * @return {!goog.html.SafeStyleSheet}\n */\ngoog.soy.data.SanitizedCss.prototype.toSafeStyleSheet = function() {\n  var value = this.toString();\n  goog.asserts.assert(\n      /[@{]|^\\s*$/.test(value),\n      'value doesn\\'t look like style sheet: ' + value);\n  return goog.html.uncheckedconversions\n      .safeStyleSheetFromStringKnownToSatisfyTypeContract(\n          goog.string.Const.from(\n              'Soy SanitizedCss produces SafeStyleSheet-contract-compliant ' +\n              'value.'),\n          value);\n};\n","^;",1579837703000,"^<",["^=",["^1L","^4B","^4C","^4D","^16","^?","^4H","^3Q","^4E","^6G","^4F","^1I"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/soy/data.js"],"^O",["^=",["~$goog.soy.data.SanitizedTrustedResourceUri","~$goog.soy.data.SanitizedHtml","~$goog.soy.data.SanitizedContentKind","~$goog.soy.data.SanitizedCss","~$goog.soy.data.SanitizedHtmlAttribute","~$goog.soy.data.SanitizedUri","~$goog.soy.data.SanitizedContent","~$goog.soy.data.SanitizedJs"]],"^W",true,"^X",["^?","^16","^1L","^1I","^4B","^4E","^4F","^4D","^4C","^4H","^6G","^3Q"]],["^ ","^3",[1579837703000],"^4","goog.testing.pseudorandom.js","^5",["^6","goog/testing/pseudorandom.js"],"^7","goog/testing/pseudorandom.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview PseudoRandom provides a mechanism for generating deterministic\n * pseudo random numbers based on a seed. Based on the Park-Miller algorithm.\n * See https://doi.org/10.1145%2F63039.63042 for details.\n *\n */\n\ngoog.setTestOnly('goog.testing.PseudoRandom');\ngoog.provide('goog.testing.PseudoRandom');\n\ngoog.require('goog.Disposable');\n\n\n\n/**\n * Class for unit testing code that uses Math.random. Generates deterministic\n * random numbers.\n *\n * @param {number=} opt_seed The seed to use.\n * @param {boolean=} opt_install Whether to install the PseudoRandom at\n *     construction time.\n * @extends {goog.Disposable}\n * @constructor\n * @final\n */\ngoog.testing.PseudoRandom = function(opt_seed, opt_install) {\n  goog.Disposable.call(this);\n\n  if (opt_seed === undefined) {\n    opt_seed = goog.testing.PseudoRandom.seedUniquifier_++ + goog.now();\n  }\n  this.seed(opt_seed);\n\n  if (opt_install) {\n    this.install();\n  }\n};\ngoog.inherits(goog.testing.PseudoRandom, goog.Disposable);\n\n\n/**\n * Helps create a unique seed.\n * @type {number}\n * @private\n */\ngoog.testing.PseudoRandom.seedUniquifier_ = 0;\n\n\n/**\n * Constant used as part of the algorithm.\n * @type {number}\n */\ngoog.testing.PseudoRandom.A = 48271;\n\n\n/**\n * Constant used as part of the algorithm. 2^31 - 1.\n * @type {number}\n */\ngoog.testing.PseudoRandom.M = 2147483647;\n\n\n/**\n * Constant used as part of the algorithm. It is equal to M / A.\n * @type {number}\n */\ngoog.testing.PseudoRandom.Q = 44488;\n\n\n/**\n * Constant used as part of the algorithm. It is equal to M % A.\n * @type {number}\n */\ngoog.testing.PseudoRandom.R = 3399;\n\n\n/**\n * Constant used as part of the algorithm to get values from range [0, 1).\n * @type {number}\n */\ngoog.testing.PseudoRandom.ONE_OVER_M_MINUS_ONE =\n    1.0 / (goog.testing.PseudoRandom.M - 1);\n\n\n/**\n * The seed of the random sequence and also the next returned value (before\n * normalization). Must be between 1 and M - 1 (inclusive).\n * @type {number}\n * @private\n */\ngoog.testing.PseudoRandom.prototype.seed_ = 1;\n\n\n/**\n * Whether this PseudoRandom has been installed.\n * @type {boolean}\n * @private\n */\ngoog.testing.PseudoRandom.prototype.installed_;\n\n\n/**\n * The original Math.random function.\n * @type {function(): number}\n * @private\n */\ngoog.testing.PseudoRandom.prototype.mathRandom_;\n\n\n/**\n * Installs this PseudoRandom as the system number generator.\n */\ngoog.testing.PseudoRandom.prototype.install = function() {\n  if (!this.installed_) {\n    this.mathRandom_ = Math.random;\n    Math.random = goog.bind(this.random, this);\n    this.installed_ = true;\n  }\n};\n\n\n/** @override */\ngoog.testing.PseudoRandom.prototype.disposeInternal = function() {\n  goog.testing.PseudoRandom.superClass_.disposeInternal.call(this);\n  this.uninstall();\n};\n\n\n/**\n * Uninstalls the PseudoRandom.\n */\ngoog.testing.PseudoRandom.prototype.uninstall = function() {\n  if (this.installed_) {\n    Math.random = this.mathRandom_;\n    this.installed_ = false;\n  }\n};\n\n\n/**\n * Seed the generator.\n *\n * @param {number=} opt_seed The seed to use.\n */\ngoog.testing.PseudoRandom.prototype.seed = function(opt_seed) {\n  this.seed_ = (opt_seed || 0) % (goog.testing.PseudoRandom.M - 1);\n  if (this.seed_ <= 0) {\n    this.seed_ += goog.testing.PseudoRandom.M - 1;\n  }\n};\n\n\n/**\n * @return {number} The next number in the sequence.\n */\ngoog.testing.PseudoRandom.prototype.random = function() {\n  var hi = Math.floor(this.seed_ / goog.testing.PseudoRandom.Q);\n  var lo = this.seed_ % goog.testing.PseudoRandom.Q;\n  var test =\n      goog.testing.PseudoRandom.A * lo - goog.testing.PseudoRandom.R * hi;\n  if (test > 0) {\n    this.seed_ = test;\n  } else {\n    this.seed_ = test + goog.testing.PseudoRandom.M;\n  }\n  return (this.seed_ - 1) * goog.testing.PseudoRandom.ONE_OVER_M_MINUS_ONE;\n};\n","^;",1579837703000,"^<",["^=",["^?","^1:"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/pseudorandom.js"],"^O",["^=",["^:O"]],"^W",true,"^X",["^?","^1:"]],["^ ","^3",[1579837703000],"^4","goog.result.result_interface.js","^5",["^6","goog/result/result_interface.js"],"^7","goog/result/result_interface.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines an interface that represents a Result.\n *\n * NOTE: goog.result is soft deprecated - we expect to replace this and\n * {@link goog.async.Deferred} with {@link goog.Promise}.\n */\n\ngoog.provide('goog.result.Result');\n\ngoog.require('goog.Thenable');\n\n\n\n/**\n * A Result object represents a value returned by an asynchronous\n * operation at some point in the future (e.g. a network fetch). This is akin\n * to a 'Promise' or a 'Future' in other languages and frameworks.\n *\n * @interface\n * @extends {goog.Thenable}\n * @deprecated Use {@link goog.Promise} instead - http://go/promisemigration\n */\ngoog.result.Result = function() {};\n\n\n/**\n * Attaches handlers to be called when the value of this Result is available.\n * Handlers are called in the order they were added by wait.\n *\n * @param {function(this:T, !goog.result.Result)} handler The function called\n *     when the value is available. The function is passed the Result object as\n *     the only argument.\n * @param {T=} opt_scope Optional scope for the handler.\n * @template T\n */\ngoog.result.Result.prototype.wait = function(handler, opt_scope) {};\n\n\n/**\n * The States this object can be in.\n *\n * @enum {string}\n * @deprecated Use {@link goog.Promise} instead - http://go/promisemigration\n */\ngoog.result.Result.State = {\n  /** The operation was a success and the value is available. */\n  SUCCESS: 'success',\n\n  /** The operation resulted in an error. */\n  ERROR: 'error',\n\n  /** The operation is incomplete and the value is not yet available. */\n  PENDING: 'pending'\n};\n\n\n/**\n * @return {!goog.result.Result.State} The state of this Result.\n */\ngoog.result.Result.prototype.getState = function() {};\n\n\n/**\n * @return {*} The value of this Result. Will return undefined if the Result is\n *     pending or was an error.\n */\ngoog.result.Result.prototype.getValue = function() {};\n\n\n/**\n * @return {*} The error slug for this Result. Will return undefined if the\n *     Result was a success, the error slug was not set, or if the Result is\n *     pending.\n */\ngoog.result.Result.prototype.getError = function() {};\n\n\n/**\n * Cancels the current Result, invoking the canceler function, if set.\n *\n * @return {boolean} Whether the Result was canceled.\n */\ngoog.result.Result.prototype.cancel = function() {};\n\n\n/**\n * @return {boolean} Whether this Result was canceled.\n */\ngoog.result.Result.prototype.isCanceled = function() {};\n\n\n\n/**\n * The value to be passed to the error handlers invoked upon cancellation.\n * @constructor\n * @extends {Error}\n * @final\n * @deprecated Use {@link goog.Promise} instead - http://go/promisemigration\n */\ngoog.result.Result.CancelError = function() {\n  // Note that this does not derive from goog.debug.Error in order to prevent\n  // stack trace capture and reduce the amount of garbage generated during a\n  // cancel() operation.\n};\ngoog.inherits(goog.result.Result.CancelError, Error);\n","^;",1579837703000,"^<",["^=",["^?","^7T"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/result/result_interface.js"],"^O",["^=",["^8B"]],"^W",true,"^X",["^?","^7T"]],["^ ","^3",[1579837703000],"^3?",true,"^4","goog.delegate.delegateregistry.js","^5",["^6","goog/delegate/delegateregistry.js"],"^7","goog/delegate/delegateregistry.js","^8","^9","^:","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.module('goog.delegate.DelegateRegistry');\n\nconst {ENABLE_ASSERTS, assert} = goog.require('goog.asserts');\nconst {binarySelect} = goog.require('goog.array');\nconst {freeze} = goog.require('goog.debug');\n\n\n/**\n * @record\n * @template T\n */\nclass Registration {\n  constructor() {\n    /**\n     * The registered delegate instance.  Exactly one of `instance` or\n     * `ctor` must be provided.\n     * @type {T|undefined}\n     */\n    this.instance;\n    /**\n     * The registered delegate constructor.  Exactly one of `instance` or\n     * `ctor` must be provided.\n     * @type {function(new: T, ...?)|undefined}\n     */\n    this.ctor;\n    /**\n     * An optional numeric priority (higher = first).\n     * @type {number|undefined}\n     */\n    this.priority;\n  }\n}\n\n\n/**\n * Base class for delegate registries.  Does not specify a policy for handling\n * multiple delegates.\n * @template T\n */\nclass DelegateRegistryBase {\n  constructor() {\n    /** @private @const {!Array<!Registration<T>>} */\n    this.registered_ = [];\n    /** @private {boolean} */\n    this.allowLateRegistration_ = false;\n    /** @private {boolean} */\n    this.cacheInstantiation_ = false;\n    /** @private {boolean} */\n    this.delegatesConstructed_ = false;\n  }\n\n  /**\n   * Configures this registry to allow late registration.  Normally it is an\n   * error to register a delegate after calling `delegate()` or `delegates()`.\n   * If late registration is allowed, then this is no longer an error.  This\n   * check only ever happens in debug mode.  Returns this.\n   * @return {THIS}\n   * @this {THIS}\n   * @template THIS\n   */\n  allowLateRegistration() {\n    if (ENABLE_ASSERTS) {\n      /** @type {!DelegateRegistryBase} */ (this).allowLateRegistration_ = true;\n    }\n    return /** @type {?} */ (this);\n  }\n\n  /**\n   * Configures this registry to automatically cache instantiated instances,\n   * rather than calling the constructor every time `delegates()` is called.\n   * Returns this.\n   * @return {THIS}\n   * @this {THIS}\n   * @template THIS\n   */\n  cacheInstantiation() {\n    /** @type {!DelegateRegistryBase} */ (this).cacheInstantiation_ = true;\n    return /** @type {?} */ (this);\n  }\n\n  /**\n   * Returns the first (highest priority) registered delegate, or undefined\n   * if none was registered.\n   * @param {(function(function(new: T, ...?)): T)=} instantiate A function to\n   *     instantiate constructors registered with `registerClass`.  By default,\n   *     this just calls the constructor with no arguments.\n   * @return {T|undefined}\n   */\n  delegate(instantiate = undefined) {\n    if (ENABLE_ASSERTS) {\n      this.delegatesConstructed_ = true;\n    }\n    return this.registered_.length ?\n        this.instantiate_(this.registered_[0], instantiate) :\n        undefined;\n  }\n\n  /**\n   * Returns an array of all registered delegates, creating a fresh instance\n   * of any registered classes.  The `instantiate` argument can be passed to\n   * override how constructors are called.  The array will be frozen in debug\n   * mode.\n   * @param {(function(function(new: T, ...?)): T)=} instantiate A function to\n   *     instantiate constructors registered with `registerClass`.  By default,\n   *     this just calls the constructor with no arguments.\n   * @return {!Array<T>}\n   */\n  delegates(instantiate = undefined) {\n    if (ENABLE_ASSERTS) {\n      this.delegatesConstructed_ = true;\n    }\n    return freeze(this.registered_.map(r => this.instantiate_(r, instantiate)));\n  }\n\n  /**\n   * @param {!Registration<T>} registration\n   * @param {(function(function(new: T, ...?)): T)=} instantiate\n   * @return {T}\n   * @private\n   */\n  instantiate_(registration, instantiate = (ctor) => new ctor()) {\n    if (!registration.ctor) return registration.instance;\n    const instance = instantiate(registration.ctor);\n    if (this.cacheInstantiation_) {\n      delete registration.ctor;\n      registration.instance = instance;\n    }\n    return instance;\n  }\n\n  /**\n   * Checks whether a new registration may be added.\n   * @private\n   */\n  checkRegistration_() {\n    assert(\n        this.allowLateRegistration_ || !this.delegatesConstructed_,\n        'Cannot register new delegates after instantiation.');\n  }\n}\n\n\n/**\n * Delegates provide a system for hygienic modification of a delegating class's\n * behavior.  The basic idea is that, rather than monkey-patching prototype\n * methods, a class can instead provide extension points by calling out to\n * delegates.  Later code can then register delegates, and when the delegating\n * class is instantiated, any registered delegates will be instantiated and\n * returned.\n *\n * The usage has four parts:\n *  - A *delegate interface* is defined to provide specific overridable hooks.\n *    This can be a simple function `@typedef`, or an entire `@interface` or\n *    `@record`.\n *  - A *delegate registry* for this interface is instantiated, often as a\n *    static field on the interface.\n *  - One or more *delegates* are defined that implement this interface.\n *    Delegates are registered with the registry.  Different registry classes\n *    support different policies for registering more than one delegate.\n *  - After delegates are registered, the delegating class asks the registry for\n *    the *list of delegates*, which are then instantiated if necessary.\n *\n * In some circumstances (particularly if a delegate method will be called from\n * multiple places) it may make sense to provide an additional wrapper between\n * the delegate list and the delegating (sometimes called \"modded\") class, to\n * ensure that the delegates are used correctly.\n *\n * ## Example usage\n *\n * For example, consider a class `Foo` that wants to provide a few extension\n * points for the behaviors `zorch` and `snarf`.  We can set up the delegation\n * as follows:\n *\n * <code class=\"highlight highlight-source-js\"><pre>\n * const DelegateRegistry = goog.require('goog.delegate.DelegateRegistry');\n * const delegates = goog.require('goog.delegate.delegates');\n * class Foo {\n *   constructor() {\n *     /** @private @const {!Array<!Foo.Delegate>} &ast;/\n *     this.delegates_ = Foo.registry.delegates();\n *   }\n *   frobnicate(x, y, z) {\n *     const w = delegates.callFirst(this.delegates_, d => d.zorch(x, y));\n *     return this.delegates_.map(d => d.snarf(z, w));\n *   }\n * }\n * /** @interface &ast;/\n * Foo.Delegate = class {\n *   zorch(a, b) {}\n *   snarf(a, b) {}\n * }\n * /** @const {!DelegateRegistry<!Foo.Delegate>} &ast;/\n * Foo.registry = new DelegateRegistry();\n * </pre></code>\n *\n * A file inserted later in the bundle can define a delegate and register itself\n * with the registry:\n *\n * <code class=\"highlight highlight-source-js\"><pre>\n * /** @implements {Foo.Delegate} &ast;/\n * class WibblyFooDelegate {\n *   zorch(a, b) { return a + b; }\n *   snarf(a, b) { return a - b; }\n * }\n * Foo.registry.registerClass(WibbyFooDelegate);\n * </pre></code>\n *\n * In many cases, the delegates need to be initialized with an instance of the\n * modded class.  To support this, a function may be passed to the `delegates()`\n * method to override how the constructor is called.\n *\n *\n * ## Multiple Delegates\n *\n * Two different registry classes are defined, each with a different policy for\n * how to handle multiple delegates.  The simpler one, `DelegateRegistry`,\n * allows multiple delegates to be registered and returns them in the order they\n * were registered.  If only one delegate is expected,\n * `DelegateRegistry.prototype.expectAtMostOneDelegate()` performs assertions\n * (in debug mode) that at most one delegate is added, though in production\n * mode it will still register them all - The use of `delegate()` or\n * `goog.delegate.delegates.callFirst()` is recommended in this case to ensure\n * reasonable behavior.\n *\n * The more sophisticated one, `DelegateRegistry.Prioritized`, requires passing\n * a unique priority to each delegate registration (collisions are asserted in\n * debug mode, but will fall back to registration order in production).\n *\n *\n * ## Wrapped Delegator\n *\n * In some cases it makes sense to wrap the delegate list in a dedicated\n * delegator object, rather than having the modded class use it directly:\n *\n * <code class=\"highlight highlight-source-js\"><pre>\n * /** @record &ast;/\n * class MyDelegateInterface {\n *   /** @param {number} arg &ast;/\n *   foo(arg) {}\n *   /** @return {number|undefined} &ast;/\n *   bar() {}\n *   /** @return {string} &ast;/\n *   baz() {}\n * }\n * class MyDelegator {\n *   /** @param {!Array<!MyDelegateInterface>} delegates &ast;/\n *   constructor(delegates) { this.delegates_ = delegates; }\n *   /** @param {number} &ast;/\n *   foo(arg) { this.delegates_.forEach(d => d.foo(arg)); }\n *   /** @return {number} &ast;/\n *   bar() {\n *     const result =\n *         delegates.callUntilNotNullOrUndefined(this.delegates_, d => d.bar());\n *     return result != null ? result : 42;\n *   }\n *   /** @return {!Array<string>} &ast;/\n *   baz() { return this.delegates_.map(d => d.baz()); }\n * }\n * </pre></code>\n *\n * In this example, the modded class will call into the delegates via the\n * wrapper class, ensuring that the correct calling convention is always used.\n *\n * @extends {DelegateRegistryBase<T>}\n * @template T\n */\nclass DelegateRegistry extends DelegateRegistryBase {\n  constructor() {\n    super();\n    /** @private {boolean} */\n    this.expectAtMostOneDelegate_ = false;\n  }\n\n  /**\n   * Configures this registry to accept at most one delegate.\n   * This only affects debug mode.\n   * @return {!DelegateRegistry<T>}\n   */\n  expectAtMostOneDelegate() {\n    if (ENABLE_ASSERTS) {\n      this.expectAtMostOneDelegate_ = true;\n    }\n    return this;\n  }\n\n  /**\n   * @param {function(new: T, ...?)} ctor\n   */\n  registerClass(ctor) {\n    this.checkRegistration_();\n    this.registered_.push({ctor});\n  }\n\n  /**\n   * @param {T} instance\n   */\n  registerInstance(instance) {\n    this.checkRegistration_();\n    this.registered_.push({instance});\n  }\n\n  /** @override @private */\n  checkRegistration_() {\n    super.checkRegistration_();\n    if (ENABLE_ASSERTS && this.expectAtMostOneDelegate_ &&\n        this.registered_.length) {\n      assert(\n          false, 'delegate already registered: %s',\n          this.registered_[0].ctor || this.registered_[0].instance);\n    }\n  }\n}\n\n\n/**\n * A delegate registry that allows multiple delegates, each of which must have a\n * numeric priority specified when it is registered.  Iteration will start with\n * the highest number and proceed to the lowest number.  If two delegates are\n * added with the same priority, an error will be given in debug mode.\n * @see DelegateRegistry\n *\n * @extends {DelegateRegistryBase<T>}\n * @template T\n */\nDelegateRegistry.Prioritized = class extends DelegateRegistryBase {\n  /**\n   * @param {function(new: T)} ctor\n   * @param {number} priority\n   */\n  registerClass(ctor, priority) {\n    this.add_({ctor, priority});\n  }\n\n  /**\n   * @param {T} instance\n   * @param {number} priority\n   */\n  registerInstance(instance, priority) {\n    this.add_({instance, priority});\n  }\n\n  /**\n   * @param {!Registration<T>} registration\n   * @private\n   */\n  add_(registration) {\n    this.checkRegistration_();\n    const priority = registration.priority;\n    // Note: index will always be negative since the evaluator never returns 0.\n    // This ensures that ties will be broken to the right.  Sort highest-first.\n    const index =\n        ~binarySelect(this.registered_, (r) => r.priority < priority ? -1 : 1);\n    const previous = index > 0 ? this.registered_[index - 1] : null;\n    if (ENABLE_ASSERTS && previous && previous.priority <= priority) {\n      assert(\n          false, 'two delegates registered with same priority (%s): %s and %s',\n          priority, previous.ctor || previous.instance,\n          registration.ctor || registration.instance);\n    }\n    this.registered_.splice(index, 0, registration);\n  }\n};\n\n\nexports = DelegateRegistry;\n","^;",1579837703000,"^<",["^=",["^1L","^?","^90","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/delegate/delegateregistry.js"],"^O",["^=",["~$goog.delegate.DelegateRegistry"]],"^W",true,"^X",["^?","^1L","^2O","^90"]],["^ ","^3",[1579837703000],"^4","goog.tweak.tweak.js","^5",["^6","goog/tweak/tweak.js"],"^7","goog/tweak/tweak.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides facilities for creating and querying tweaks.\n * @see http://code.google.com/p/closure-library/wiki/UsingTweaks\n *\n * @author agrieve@google.com (Andrew Grieve)\n */\n\ngoog.provide('goog.tweak');\ngoog.provide('goog.tweak.ConfigParams');\n\ngoog.require('goog.asserts');\ngoog.require('goog.tweak.BaseSetting');\ngoog.require('goog.tweak.BooleanGroup');\ngoog.require('goog.tweak.BooleanInGroupSetting');\ngoog.require('goog.tweak.BooleanSetting');\ngoog.require('goog.tweak.ButtonAction');\ngoog.require('goog.tweak.NumericSetting');\ngoog.require('goog.tweak.Registry');\ngoog.require('goog.tweak.StringSetting');\n\n\n/**\n * Calls to this function are overridden by the compiler by the processTweaks\n * pass. It returns the overrides to default values for tweaks set by compiler\n * options.\n * @return {!Object<number|string|boolean>} A map of tweakId -> defaultValue.\n * @private\n */\ngoog.tweak.getCompilerOverrides_ = function() {\n  return {};\n};\n\n\n/**\n * The global reference to the registry, if it exists.\n * @type {?goog.tweak.Registry}\n * @private\n */\ngoog.tweak.registry_ = null;\n\n\n/**\n * The boolean group set by beginBooleanGroup and cleared by endBooleanGroup.\n * @type {?goog.tweak.BooleanGroup}\n * @private\n */\ngoog.tweak.activeBooleanGroup_ = null;\n\n\n/**\n * Returns/creates the registry singleton.\n * @return {!goog.tweak.Registry} The tweak registry.\n */\ngoog.tweak.getRegistry = function() {\n  if (!goog.tweak.registry_) {\n    var queryString = window.location.search;\n    var overrides = goog.tweak.getCompilerOverrides_();\n    goog.tweak.registry_ = new goog.tweak.Registry(queryString, overrides);\n  }\n  return goog.tweak.registry_;\n};\n\n\n/**\n * Type for configParams.\n * TODO(agrieve): Remove |Object when optional fields in struct types are\n *     implemented.\n * @typedef {{\n *     label:(string|undefined),\n *     validValues:(!Array<string>|!Array<number>|undefined),\n *     paramName:(string|undefined),\n *     restartRequired:(boolean|undefined),\n *     callback:(Function|undefined),\n *     token:(string|undefined)\n *     }|!Object}\n */\ngoog.tweak.ConfigParams;\n\n\n/**\n * Applies all extra configuration parameters in configParams.\n * @param {!goog.tweak.BaseEntry} entry The entry to apply them to.\n * @param {!goog.tweak.ConfigParams} configParams Extra configuration\n *     parameters.\n * @private\n */\ngoog.tweak.applyConfigParams_ = function(entry, configParams) {\n  if (configParams.label) {\n    entry.label = configParams.label;\n    delete configParams.label;\n  }\n  if (configParams.validValues) {\n    goog.asserts.assert(\n        entry instanceof goog.tweak.StringSetting ||\n            entry instanceof goog.tweak.NumericSetting,\n        'Cannot set validValues on tweak: %s', entry.getId());\n    if (entry instanceof goog.tweak.StringSetting) {\n      entry.setValidValues(configParams.validValues);\n    } else if (entry instanceof goog.tweak.NumericSetting) {\n      entry.setValidValues(configParams.validValues);\n    }\n    delete configParams.validValues;\n  }\n  if (configParams.paramName !== undefined) {\n    goog.asserts.assertInstanceof(\n        entry, goog.tweak.BaseSetting, 'Cannot set paramName on tweak: %s',\n        entry.getId());\n    entry.setParamName(configParams.paramName);\n    delete configParams.paramName;\n  }\n  if (configParams.restartRequired !== undefined) {\n    entry.setRestartRequired(configParams.restartRequired);\n    delete configParams.restartRequired;\n  }\n  if (configParams.callback) {\n    entry.addCallback(configParams.callback);\n    delete configParams.callback;\n    goog.asserts.assert(\n        !entry.isRestartRequired() || (configParams.restartRequired == false),\n        'Tweak %s should set restartRequired: false, when adding a callback.',\n        entry.getId());\n  }\n  if (configParams.token) {\n    goog.asserts.assertInstanceof(\n        entry, goog.tweak.BooleanInGroupSetting,\n        'Cannot set token on tweak: %s', entry.getId());\n    entry.setToken(configParams.token);\n    delete configParams.token;\n  }\n  for (var key in configParams) {\n    goog.asserts.fail(\n        'Unknown config options (' + key + '=' + configParams[key] +\n        ') for tweak ' + entry.getId());\n  }\n};\n\n\n/**\n * Registers a tweak using the given factoryFunc.\n * @param {!goog.tweak.BaseEntry} entry The entry to register.\n * @param {boolean|string|number=} opt_defaultValue Default value.\n * @param {goog.tweak.ConfigParams=} opt_configParams Extra\n *     configuration parameters.\n * @private\n */\ngoog.tweak.doRegister_ = function(entry, opt_defaultValue, opt_configParams) {\n  if (opt_configParams) {\n    goog.tweak.applyConfigParams_(entry, opt_configParams);\n  }\n  if (opt_defaultValue != undefined) {\n    entry.setDefaultValue(opt_defaultValue);\n  }\n  if (goog.tweak.activeBooleanGroup_) {\n    goog.asserts.assertInstanceof(\n        entry, goog.tweak.BooleanInGroupSetting,\n        'Forgot to end Boolean Group: %s',\n        goog.tweak.activeBooleanGroup_.getId());\n    goog.tweak.activeBooleanGroup_.addChild(\n        /** @type {!goog.tweak.BooleanInGroupSetting} */ (entry));\n  }\n  goog.tweak.getRegistry().register(entry);\n};\n\n\n/**\n * Creates and registers a group of BooleanSettings that are all set by a\n * single query parameter. A call to goog.tweak.endBooleanGroup() must be used\n * to close this group. Only goog.tweak.registerBoolean() calls are allowed with\n * the beginBooleanGroup()/endBooleanGroup().\n * @param {string} id The unique ID for the setting.\n * @param {string} description A description of what the setting does.\n * @param {goog.tweak.ConfigParams=} opt_configParams Extra configuration\n *     parameters.\n */\ngoog.tweak.beginBooleanGroup = function(id, description, opt_configParams) {\n  var entry = new goog.tweak.BooleanGroup(id, description);\n  goog.tweak.doRegister_(entry, undefined, opt_configParams);\n  goog.tweak.activeBooleanGroup_ = entry;\n};\n\n\n/**\n * Stops adding boolean entries to the active boolean group.\n */\ngoog.tweak.endBooleanGroup = function() {\n  goog.tweak.activeBooleanGroup_ = null;\n};\n\n\n/**\n * Creates and registers a BooleanSetting.\n * @param {string} id The unique ID for the setting.\n * @param {string} description A description of what the setting does.\n * @param {boolean=} opt_defaultValue The default value for the setting.\n * @param {goog.tweak.ConfigParams=} opt_configParams Extra configuration\n *     parameters.\n */\ngoog.tweak.registerBoolean = function(\n    id, description, opt_defaultValue, opt_configParams) {\n  // TODO(agrieve): There is a bug in the compiler that causes these calls not\n  //     to be stripped without this outer if. Might be Issue #90.\n  if (goog.tweak.activeBooleanGroup_) {\n    var entry = new goog.tweak.BooleanInGroupSetting(\n        id, description, goog.tweak.activeBooleanGroup_);\n  } else {\n    entry = new goog.tweak.BooleanSetting(id, description);\n  }\n  goog.tweak.doRegister_(entry, opt_defaultValue, opt_configParams);\n};\n\n\n/**\n * Creates and registers a StringSetting.\n * @param {string} id The unique ID for the setting.\n * @param {string} description A description of what the setting does.\n * @param {string=} opt_defaultValue The default value for the setting.\n * @param {goog.tweak.ConfigParams=} opt_configParams Extra configuration\n *     parameters.\n */\ngoog.tweak.registerString = function(\n    id, description, opt_defaultValue, opt_configParams) {\n  goog.tweak.doRegister_(\n      new goog.tweak.StringSetting(id, description), opt_defaultValue,\n      opt_configParams);\n};\n\n\n/**\n * Creates and registers a NumericSetting.\n * @param {string} id The unique ID for the setting.\n * @param {string} description A description of what the setting does.\n * @param {number=} opt_defaultValue The default value for the setting.\n * @param {goog.tweak.ConfigParams=} opt_configParams Extra configuration\n *     parameters.\n */\ngoog.tweak.registerNumber = function(\n    id, description, opt_defaultValue, opt_configParams) {\n  goog.tweak.doRegister_(\n      new goog.tweak.NumericSetting(id, description), opt_defaultValue,\n      opt_configParams);\n};\n\n\n/**\n * Creates and registers a ButtonAction.\n * @param {string} id The unique ID for the setting.\n * @param {string} description A description of what the action does.\n * @param {!Function} callback Function to call when the button is clicked.\n * @param {string=} opt_label The button text (instead of the ID).\n */\ngoog.tweak.registerButton = function(id, description, callback, opt_label) {\n  var tweak = new goog.tweak.ButtonAction(id, description, callback);\n  tweak.label = opt_label || tweak.label;\n  goog.tweak.doRegister_(tweak);\n};\n\n\n/**\n * Sets a default value to use for the given tweak instead of the one passed\n * to the register* function. This function must be called before the tweak is\n * registered.\n * @param {string} id The unique string that identifies the entry.\n * @param {string|number|boolean} value The new default value for the tweak.\n */\ngoog.tweak.overrideDefaultValue = function(id, value) {\n  goog.tweak.getRegistry().overrideDefaultValue(id, value);\n};\n\n\n/**\n * Returns the value of the boolean setting with the given ID.\n * @param {string} id The unique string that identifies this entry.\n * @return {boolean} The value of the tweak.\n */\ngoog.tweak.getBoolean = function(id) {\n  return goog.tweak.getRegistry().getBooleanSetting(id).getValue();\n};\n\n\n/**\n * Returns the value of the string setting with the given ID,\n * @param {string} id The unique string that identifies this entry.\n * @return {string} The value of the tweak.\n */\ngoog.tweak.getString = function(id) {\n  return goog.tweak.getRegistry().getStringSetting(id).getValue();\n};\n\n\n/**\n * Returns the value of the numeric setting with the given ID.\n * @param {string} id The unique string that identifies this entry.\n * @return {number} The value of the tweak.\n */\ngoog.tweak.getNumber = function(id) {\n  return goog.tweak.getRegistry().getNumericSetting(id).getValue();\n};\n","^;",1579837703000,"^<",["^=",["^1L","~$goog.tweak.BaseSetting","^7D","^?","^7E","^7F","^7G","^7H","^7K","~$goog.tweak.Registry"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/tweak/tweak.js"],"^O",["^=",["^7C","~$goog.tweak.ConfigParams"]],"^W",true,"^X",["^?","^1L","^AU","^7H","^7F","^7G","^7K","^7E","^AV","^7D"]],["^ ","^3",[1579837703000],"^4","goog.date.daterange.js","^5",["^6","goog/date/daterange.js"],"^7","goog/date/daterange.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Date range data structure. Based loosely on\n * com.google.common.util.DateRange.\n *\n * @author dpb@google.com (David P. Baker)\n */\n\ngoog.provide('goog.date.DateRange');\ngoog.provide('goog.date.DateRange.Iterator');\ngoog.provide('goog.date.DateRange.StandardDateRangeKeys');\n\ngoog.require('goog.date.Date');\ngoog.require('goog.date.Interval');\ngoog.require('goog.iter.Iterator');\ngoog.require('goog.iter.StopIteration');\n\n\n\n/**\n * Constructs a date range.\n * @constructor\n * @struct\n * @param {goog.date.Date} startDate The first date in the range.\n * @param {goog.date.Date} endDate The last date in the range.\n * @final\n */\ngoog.date.DateRange = function(startDate, endDate) {\n  /**\n   * The first date in the range.\n   * @type {goog.date.Date}\n   * @private\n   */\n  this.startDate_ = startDate;\n\n  /**\n   * The last date in the range.\n   * @type {goog.date.Date}\n   * @private\n   */\n  this.endDate_ = endDate;\n};\n\n\n/**\n * The first possible day, as far as this class is concerned.\n * @type {goog.date.Date}\n */\ngoog.date.DateRange.MINIMUM_DATE = new goog.date.Date(0, 0, 1);\n\n\n/**\n * The last possible day, as far as this class is concerned.\n * @type {goog.date.Date}\n */\ngoog.date.DateRange.MAXIMUM_DATE = new goog.date.Date(9999, 11, 31);\n\n\n/**\n * @return {goog.date.Date} The first date in the range.\n */\ngoog.date.DateRange.prototype.getStartDate = function() {\n  return this.startDate_;\n};\n\n\n/**\n * @return {goog.date.Date} The last date in the range.\n */\ngoog.date.DateRange.prototype.getEndDate = function() {\n  return this.endDate_;\n};\n\n\n/**\n * Tests if a date falls within this range.\n *\n * @param {goog.date.Date} date The date to test.\n * @return {boolean} Whether the date is in the range.\n */\ngoog.date.DateRange.prototype.contains = function(date) {\n  return date.valueOf() >= this.startDate_.valueOf() &&\n      date.valueOf() <= this.endDate_.valueOf();\n};\n\n\n/**\n * @return {!goog.date.DateRange.Iterator} An iterator over the date range.\n */\ngoog.date.DateRange.prototype.iterator = function() {\n  return new goog.date.DateRange.Iterator(this);\n};\n\n\n/**\n * Tests two {@link goog.date.DateRange} objects for equality.\n * @param {goog.date.DateRange} a A date range.\n * @param {goog.date.DateRange} b A date range.\n * @return {boolean} Whether |a| is the same range as |b|.\n */\ngoog.date.DateRange.equals = function(a, b) {\n  // Test for same object reference; type conversion is irrelevant.\n  if (a === b) {\n    return true;\n  }\n\n  if (a == null || b == null) {\n    return false;\n  }\n\n  return a.startDate_.equals(b.startDate_) && a.endDate_.equals(b.endDate_);\n};\n\n\n/**\n * Calculates a date that is a number of days after a date. Does not modify its\n * input.\n * @param {goog.date.Date} date The input date.\n * @param {number} offset Number of days.\n * @return {!goog.date.Date} The date that is |offset| days after |date|.\n * @private\n */\ngoog.date.DateRange.offsetInDays_ = function(date, offset) {\n  var newDate = date.clone();\n  newDate.add(new goog.date.Interval(goog.date.Interval.DAYS, offset));\n  return newDate;\n};\n\n\n/**\n * Calculates a date that is a number of months after the first day in the\n * month that contains its input. Does not modify its input.\n * @param {goog.date.Date} date The input date.\n * @param {number} offset Number of months.\n * @return {!goog.date.Date} The date that is |offset| months after the first\n *     day in the month that contains |date|.\n * @private\n */\ngoog.date.DateRange.offsetInMonths_ = function(date, offset) {\n  var newDate = date.clone();\n  newDate.setDate(1);\n  newDate.add(new goog.date.Interval(goog.date.Interval.MONTHS, offset));\n  return newDate;\n};\n\n\n/**\n * Returns the range from yesterday to yesterday.\n * @param {goog.date.Date=} opt_today The date to consider today.\n *     Defaults to today.\n * @return {!goog.date.DateRange} The range that includes only yesterday.\n */\ngoog.date.DateRange.yesterday = function(opt_today) {\n  var today = goog.date.DateRange.cloneOrCreate_(opt_today);\n  var yesterday = goog.date.DateRange.offsetInDays_(today, -1);\n  return new goog.date.DateRange(yesterday, yesterday.clone());\n};\n\n\n/**\n * Returns the range from today to today.\n * @param {goog.date.Date=} opt_today The date to consider today.\n *     Defaults to today.\n * @return {!goog.date.DateRange} The range that includes only today.\n */\ngoog.date.DateRange.today = function(opt_today) {\n  var today = goog.date.DateRange.cloneOrCreate_(opt_today);\n  return new goog.date.DateRange(today, today.clone());\n};\n\n\n/**\n * Returns the range that includes the seven days that end yesterday.\n * @param {goog.date.Date=} opt_today The date to consider today.\n *     Defaults to today.\n * @return {!goog.date.DateRange} The range that includes the seven days that\n *     end yesterday.\n */\ngoog.date.DateRange.last7Days = function(opt_today) {\n  var today = goog.date.DateRange.cloneOrCreate_(opt_today);\n  var yesterday = goog.date.DateRange.offsetInDays_(today, -1);\n  return new goog.date.DateRange(\n      goog.date.DateRange.offsetInDays_(today, -7), yesterday);\n};\n\n\n/**\n * Returns the range that starts the first of this month and ends the last day\n * of this month.\n * @param {goog.date.Date=} opt_today The date to consider today.\n *     Defaults to today.\n * @return {!goog.date.DateRange} The range that starts the first of this month\n *     and ends the last day of this month.\n */\ngoog.date.DateRange.thisMonth = function(opt_today) {\n  var today = goog.date.DateRange.cloneOrCreate_(opt_today);\n  return new goog.date.DateRange(\n      goog.date.DateRange.offsetInMonths_(today, 0),\n      goog.date.DateRange.offsetInDays_(\n          goog.date.DateRange.offsetInMonths_(today, 1), -1));\n};\n\n\n/**\n * Returns the range that starts the first of last month and ends the last day\n * of last month.\n * @param {goog.date.Date=} opt_today The date to consider today.\n *     Defaults to today.\n * @return {!goog.date.DateRange} The range that starts the first of last month\n *     and ends the last day of last month.\n */\ngoog.date.DateRange.lastMonth = function(opt_today) {\n  var today = goog.date.DateRange.cloneOrCreate_(opt_today);\n  return new goog.date.DateRange(\n      goog.date.DateRange.offsetInMonths_(today, -1),\n      goog.date.DateRange.offsetInDays_(\n          goog.date.DateRange.offsetInMonths_(today, 0), -1));\n};\n\n\n/**\n * Returns the seven-day range that starts on the first day of the week\n * (see {@link goog.i18n.DateTimeSymbols.FIRSTDAYOFWEEK}) on or before today.\n * @param {goog.date.Date=} opt_today The date to consider today.\n *     Defaults to today.\n * @return {!goog.date.DateRange} The range that starts the Monday on or before\n *     today and ends the Sunday on or after today.\n */\ngoog.date.DateRange.thisWeek = function(opt_today) {\n  var today = goog.date.DateRange.cloneOrCreate_(opt_today);\n  var iso = today.getIsoWeekday();\n  var firstDay = today.getFirstDayOfWeek();\n  var i18nFirstDay = (iso >= firstDay) ? iso - firstDay : iso + (7 - firstDay);\n  var start = goog.date.DateRange.offsetInDays_(today, -i18nFirstDay);\n  var end = goog.date.DateRange.offsetInDays_(start, 6);\n  return new goog.date.DateRange(start, end);\n};\n\n\n/**\n * Returns the seven-day range that ends the day before the first day of\n * the week (see {@link goog.i18n.DateTimeSymbols.FIRSTDAYOFWEEK}) that\n * contains today.\n * @param {goog.date.Date=} opt_today The date to consider today.\n *     Defaults to today.\n * @return {!goog.date.DateRange} The range that starts seven days before the\n *     Monday on or before today and ends the Sunday on or before yesterday.\n */\ngoog.date.DateRange.lastWeek = function(opt_today) {\n  var thisWeek = goog.date.DateRange.thisWeek(opt_today);\n  var start = goog.date.DateRange.offsetInDays_(thisWeek.getStartDate(), -7);\n  var end = goog.date.DateRange.offsetInDays_(thisWeek.getEndDate(), -7);\n  return new goog.date.DateRange(start, end);\n};\n\n\n/**\n * Returns the range that starts seven days before the Monday on or before\n * today and ends the Friday before today.\n * @param {goog.date.Date=} opt_today The date to consider today.\n *     Defaults to today.\n * @return {!goog.date.DateRange} The range that starts seven days before the\n *     Monday on or before today and ends the Friday before today.\n */\ngoog.date.DateRange.lastBusinessWeek = function(opt_today) {\n  // TODO(user): should be i18nized.\n  var today = goog.date.DateRange.cloneOrCreate_(opt_today);\n  var start =\n      goog.date.DateRange.offsetInDays_(today, -7 - today.getIsoWeekday());\n  var end = goog.date.DateRange.offsetInDays_(start, 4);\n  return new goog.date.DateRange(start, end);\n};\n\n\n/**\n * Returns the range that includes all days between January 1, 1900 and\n * December 31, 9999.\n * @param {goog.date.Date=} opt_today The date to consider today.\n *     Defaults to today.\n * @return {!goog.date.DateRange} The range that includes all days between\n *     January 1, 1900 and December 31, 9999.\n */\ngoog.date.DateRange.allTime = function(opt_today) {\n  return new goog.date.DateRange(\n      goog.date.DateRange.MINIMUM_DATE, goog.date.DateRange.MAXIMUM_DATE);\n};\n\n\n/**\n * Standard date range keys. Equivalent to the enum IDs in\n * DateRange.java http://go/datarange.java\n *\n * @enum {string}\n */\ngoog.date.DateRange.StandardDateRangeKeys = {\n  YESTERDAY: 'yesterday',\n  TODAY: 'today',\n  LAST_7_DAYS: 'last7days',\n  THIS_MONTH: 'thismonth',\n  LAST_MONTH: 'lastmonth',\n  THIS_WEEK: 'thisweek',\n  LAST_WEEK: 'lastweek',\n  LAST_BUSINESS_WEEK: 'lastbusinessweek',\n  ALL_TIME: 'alltime'\n};\n\n\n/**\n * @param {string} dateRangeKey A standard date range key.\n * @param {goog.date.Date=} opt_today The date to consider today.\n *     Defaults to today.\n * @return {!goog.date.DateRange} The date range that corresponds to that key.\n * @throws {Error} If no standard date range with that key exists.\n */\ngoog.date.DateRange.standardDateRange = function(dateRangeKey, opt_today) {\n  switch (dateRangeKey) {\n    case goog.date.DateRange.StandardDateRangeKeys.YESTERDAY:\n      return goog.date.DateRange.yesterday(opt_today);\n\n    case goog.date.DateRange.StandardDateRangeKeys.TODAY:\n      return goog.date.DateRange.today(opt_today);\n\n    case goog.date.DateRange.StandardDateRangeKeys.LAST_7_DAYS:\n      return goog.date.DateRange.last7Days(opt_today);\n\n    case goog.date.DateRange.StandardDateRangeKeys.THIS_MONTH:\n      return goog.date.DateRange.thisMonth(opt_today);\n\n    case goog.date.DateRange.StandardDateRangeKeys.LAST_MONTH:\n      return goog.date.DateRange.lastMonth(opt_today);\n\n    case goog.date.DateRange.StandardDateRangeKeys.THIS_WEEK:\n      return goog.date.DateRange.thisWeek(opt_today);\n\n    case goog.date.DateRange.StandardDateRangeKeys.LAST_WEEK:\n      return goog.date.DateRange.lastWeek(opt_today);\n\n    case goog.date.DateRange.StandardDateRangeKeys.LAST_BUSINESS_WEEK:\n      return goog.date.DateRange.lastBusinessWeek(opt_today);\n\n    case goog.date.DateRange.StandardDateRangeKeys.ALL_TIME:\n      return goog.date.DateRange.allTime(opt_today);\n\n    default:\n      throw new Error('no such date range key: ' + dateRangeKey);\n  }\n};\n\n\n/**\n * Clones or creates new.\n * @param {goog.date.Date=} opt_today The date to consider today.\n *     Defaults to today.\n * @return {!goog.date.Date} cloned or new.\n * @private\n */\ngoog.date.DateRange.cloneOrCreate_ = function(opt_today) {\n  return opt_today ? opt_today.clone() : new goog.date.Date();\n};\n\n\n\n/**\n * Creates an iterator over the dates in a {@link goog.date.DateRange}.\n * @constructor\n * @struct\n * @extends {goog.iter.Iterator<goog.date.Date>}\n * @param {goog.date.DateRange} dateRange The date range to iterate.\n * @final\n */\ngoog.date.DateRange.Iterator = function(dateRange) {\n  /**\n   * The next date.\n   * @type {goog.date.Date}\n   * @private\n   */\n  this.nextDate_ = dateRange.getStartDate().clone();\n\n  /**\n   * The end date, expressed as an integer: YYYYMMDD.\n   * @type {number}\n   * @private\n   */\n  this.endDate_ = Number(dateRange.getEndDate().toIsoString());\n};\ngoog.inherits(goog.date.DateRange.Iterator, goog.iter.Iterator);\n\n\n/** @override */\ngoog.date.DateRange.Iterator.prototype.next = function() {\n  if (Number(this.nextDate_.toIsoString()) > this.endDate_) {\n    throw goog.iter.StopIteration;\n  }\n\n  var rv = this.nextDate_.clone();\n  this.nextDate_.add(new goog.date.Interval(goog.date.Interval.DAYS, 1));\n  return rv;\n};\n","^;",1579837703000,"^<",["^=",["^?","~$goog.date.Interval","^61","~$goog.iter.Iterator","~$goog.date.Date"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/date/daterange.js"],"^O",["^=",["~$goog.date.DateRange","~$goog.date.DateRange.StandardDateRangeKeys","~$goog.date.DateRange.Iterator"]],"^W",true,"^X",["^?","^AZ","^AX","^AY","^61"]],["^ ","^3",[1579837703000],"^4","goog.string.stringifier.js","^5",["^6","goog/string/stringifier.js"],"^7","goog/string/stringifier.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Defines an interface for serializing objects into strings.\n */\n\ngoog.provide('goog.string.Stringifier');\n\n\n\n/**\n * An interface for serializing objects into strings.\n * @interface\n */\ngoog.string.Stringifier = function() {};\n\n\n/**\n * Serializes an object or a value to a string.\n * Agnostic to the particular format of object and string.\n *\n * @param {*} object The object to stringify.\n * @return {string} A string representation of the input.\n */\ngoog.string.Stringifier.prototype.stringify;\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/string/stringifier.js"],"^O",["^=",["~$goog.string.Stringifier"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.ui.splitpane.js","^5",["^6","goog/ui/splitpane.js"],"^7","goog/ui/splitpane.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview  Class for splitting two areas with draggable control for\n * changing size.\n *\n * The DOM that is created (or that can be decorated) looks like this:\n * <div class='goog-splitpane'>\n *   <div class='goog-splitpane-first-container'></div>\n *   <div class='goog-splitpane-second-container'></div>\n *   <div class='goog-splitpane-handle'></div>\n * </div>\n *\n * The content to be split goes in the first and second DIVs, the third one\n * is for managing (and styling) the splitter handle.\n *\n * @see ../demos/splitpane.html\n */\n\n\ngoog.provide('goog.ui.SplitPane');\ngoog.provide('goog.ui.SplitPane.Orientation');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.EventType');\ngoog.require('goog.fx.Dragger');\ngoog.require('goog.math.Rect');\ngoog.require('goog.math.Size');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A left/right up/down Container SplitPane.\n * Create SplitPane with two goog.ui.Component opjects to split.\n * TODO(user): Support minimum splitpane size.\n * TODO(user): Allow component change/orientation after init.\n * TODO(user): Support hiding either side of handle (plus handle).\n * TODO(user): Look at setBorderBoxSize fixes and revist borderwidth code.\n *\n * @param {goog.ui.Component} firstComponent Left or Top component.\n * @param {goog.ui.Component} secondComponent Right or Bottom component.\n * @param {goog.ui.SplitPane.Orientation} orientation SplitPane orientation.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @extends {goog.ui.Component}\n * @constructor\n */\ngoog.ui.SplitPane = function(\n    firstComponent, secondComponent, orientation, opt_domHelper) {\n  goog.ui.SplitPane.base(this, 'constructor', opt_domHelper);\n\n  /**\n   * The orientation of the containers.\n   * @type {goog.ui.SplitPane.Orientation}\n   * @private\n   */\n  this.orientation_ = orientation;\n\n  /**\n   * The left/top component.\n   * @type {goog.ui.Component}\n   * @private\n   */\n  this.firstComponent_ = firstComponent;\n  this.addChild(firstComponent);\n\n  /**\n   * The right/bottom component.\n   * @type {goog.ui.Component}\n   * @private\n   */\n  this.secondComponent_ = secondComponent;\n  this.addChild(secondComponent);\n\n  /** @private {?Element} */\n  this.splitpaneHandle_ = null;\n};\ngoog.inherits(goog.ui.SplitPane, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.SplitPane);\n\n\n/**\n * Events.\n * @enum {string}\n */\ngoog.ui.SplitPane.EventType = {\n\n  /**\n   * Dispatched after handle drag.\n   */\n  HANDLE_DRAG: 'handle_drag',\n\n  /**\n   * Dispatched after handle drag end.\n   */\n  HANDLE_DRAG_END: 'handle_drag_end',\n\n  /**\n   * Dispatched after handle snap (double-click splitter).\n   */\n  HANDLE_SNAP: 'handle_snap'\n};\n\n\n/**\n * CSS class names for splitpane outer container.\n * @type {string}\n * @private\n */\ngoog.ui.SplitPane.CLASS_NAME_ = goog.getCssName('goog-splitpane');\n\n\n/**\n * CSS class name for first splitpane container.\n * @type {string}\n * @private\n */\ngoog.ui.SplitPane.FIRST_CONTAINER_CLASS_NAME_ =\n    goog.getCssName('goog-splitpane-first-container');\n\n\n/**\n * CSS class name for second splitpane container.\n * @type {string}\n * @private\n */\ngoog.ui.SplitPane.SECOND_CONTAINER_CLASS_NAME_ =\n    goog.getCssName('goog-splitpane-second-container');\n\n\n/**\n * CSS class name for the splitpane handle.\n * @type {string}\n * @private\n */\ngoog.ui.SplitPane.HANDLE_CLASS_NAME_ = goog.getCssName('goog-splitpane-handle');\n\n\n/**\n * CSS class name for the splitpane handle in horizontal orientation.\n * @type {string}\n * @private\n */\ngoog.ui.SplitPane.HANDLE_CLASS_NAME_HORIZONTAL_ =\n    goog.getCssName('goog-splitpane-handle-horizontal');\n\n\n/**\n * CSS class name for the splitpane handle in horizontal orientation.\n * @type {string}\n * @private\n */\ngoog.ui.SplitPane.HANDLE_CLASS_NAME_VERTICAL_ =\n    goog.getCssName('goog-splitpane-handle-vertical');\n\n\n/**\n  * The dragger to move the drag handle.\n  * @type {goog.fx.Dragger?}\n  * @private\n  */\ngoog.ui.SplitPane.prototype.splitDragger_ = null;\n\n\n/**\n * The left/top component dom container.\n * @type {?Element}\n * @private\n */\ngoog.ui.SplitPane.prototype.firstComponentContainer_ = null;\n\n\n/**\n * The right/bottom component dom container.\n * @type {?Element}\n * @private\n */\ngoog.ui.SplitPane.prototype.secondComponentContainer_ = null;\n\n\n/**\n * The size (width or height) of the splitpane handle, default = 5.\n * @type {number}\n * @private\n */\ngoog.ui.SplitPane.prototype.handleSize_ = 5;\n\n\n/**\n * The initial size (width or height) of the left or top component.\n * @type {?number}\n * @private\n */\ngoog.ui.SplitPane.prototype.initialSize_ = null;\n\n\n/**\n * The saved size (width or height) of the left or top component on a\n * double-click (snap).\n * This needs to be saved so it can be restored after another double-click.\n * @type {?number}\n * @private\n */\ngoog.ui.SplitPane.prototype.savedSnapSize_ = null;\n\n\n/**\n * The first component size, so we don't change it on a window resize.\n * @type {?number}\n * @private\n */\ngoog.ui.SplitPane.prototype.firstComponentSize_ = null;\n\n\n/**\n * If we resize as they user moves the handle (default = true).\n * @type {boolean}\n * @private\n */\ngoog.ui.SplitPane.prototype.continuousResize_ = true;\n\n\n/**\n * Iframe overlay to prevent iframes from grabbing events.\n * @type {?Element}\n * @private\n */\ngoog.ui.SplitPane.prototype.iframeOverlay_ = null;\n\n\n/**\n * Z indices for iframe overlay and splitter handle.\n * @enum {number}\n * @private\n */\ngoog.ui.SplitPane.IframeOverlayIndex_ = {\n  HIDDEN: -1,\n  OVERLAY: 1,\n  SPLITTER_HANDLE: 2\n};\n\n\n/**\n* Orientation values for the splitpane.\n* @enum {string}\n*/\ngoog.ui.SplitPane.Orientation = {\n\n  /**\n   * Horizontal orientation means splitter moves right-left.\n   */\n  HORIZONTAL: 'horizontal',\n\n  /**\n   * Vertical orientation means splitter moves up-down.\n   */\n  VERTICAL: 'vertical'\n};\n\n\n/**\n * Create the DOM node & text node needed for the splitpane.\n * @override\n */\ngoog.ui.SplitPane.prototype.createDom = function() {\n  var dom = this.getDomHelper();\n\n  // Create the components.\n  var firstContainer = dom.createDom(\n      goog.dom.TagName.DIV, goog.ui.SplitPane.FIRST_CONTAINER_CLASS_NAME_);\n  var secondContainer = dom.createDom(\n      goog.dom.TagName.DIV, goog.ui.SplitPane.SECOND_CONTAINER_CLASS_NAME_);\n  var splitterHandle =\n      dom.createDom(goog.dom.TagName.DIV, goog.ui.SplitPane.HANDLE_CLASS_NAME_);\n\n  // Create the primary element, a DIV that holds the two containers and handle.\n  this.setElementInternal(\n      dom.createDom(\n          goog.dom.TagName.DIV, goog.ui.SplitPane.CLASS_NAME_, firstContainer,\n          secondContainer, splitterHandle));\n\n  this.firstComponentContainer_ = firstContainer;\n  this.secondComponentContainer_ = secondContainer;\n  this.splitpaneHandle_ = splitterHandle;\n  this.setUpHandle_();\n\n  this.finishSetup_();\n};\n\n\n/**\n * Determines if a given element can be decorated by this type of component.\n * @param {Element} element Element to decorate.\n * @return {boolean} True if the element can be decorated, false otherwise.\n * @override\n */\ngoog.ui.SplitPane.prototype.canDecorate = function(element) {\n  var className = goog.ui.SplitPane.FIRST_CONTAINER_CLASS_NAME_;\n  var firstContainer = this.getElementToDecorate_(element, className);\n  if (!firstContainer) {\n    return false;\n  }\n  // Since we have this component, save it so we don't have to get it\n  // again in decorateInternal.  Same w/other components.\n  this.firstComponentContainer_ = firstContainer;\n\n  className = goog.ui.SplitPane.SECOND_CONTAINER_CLASS_NAME_;\n  var secondContainer = this.getElementToDecorate_(element, className);\n\n  if (!secondContainer) {\n    return false;\n  }\n  this.secondComponentContainer_ = secondContainer;\n\n  className = goog.ui.SplitPane.HANDLE_CLASS_NAME_;\n  var splitpaneHandle = this.getElementToDecorate_(element, className);\n  if (!splitpaneHandle) {\n    return false;\n  }\n  this.splitpaneHandle_ = splitpaneHandle;\n\n  // We found all the components we're looking for, so return true.\n  return true;\n};\n\n\n/**\n * Obtains the element to be decorated by class name. If multiple such elements\n * are found, preference is given to those directly attached to the specified\n * root element.\n * @param {Element} rootElement The root element from which to retrieve the\n *     element to be decorated.\n * @param {string} className The target class name.\n * @return {Element} The element to decorate.\n * @private\n */\ngoog.ui.SplitPane.prototype.getElementToDecorate_ = function(\n    rootElement, className) {\n\n  // Decorate the root element's children, if available.\n  var childElements = goog.dom.getChildren(rootElement);\n  for (var i = 0; i < childElements.length; i++) {\n    var childElement = goog.asserts.assertElement(childElements[i]);\n    if (goog.dom.classlist.contains(childElement, className)) {\n      return childElement;\n    }\n  }\n\n  // Default to the first descendant element with the correct class.\n  return goog.dom.getElementsByTagNameAndClass(null, className, rootElement)[0];\n};\n\n\n/**\n * Decorates the given HTML element as a SplitPane.  Overrides {@link\n * goog.ui.Component#decorateInternal}.  Considered protected.\n * @param {Element} element Element (SplitPane div) to decorate.\n * @protected\n * @override\n */\ngoog.ui.SplitPane.prototype.decorateInternal = function(element) {\n  goog.ui.SplitPane.base(this, 'decorateInternal', element);\n\n  this.setUpHandle_();\n\n  var elSize = goog.style.getBorderBoxSize(element);\n  this.setSize(new goog.math.Size(elSize.width, elSize.height));\n\n  this.finishSetup_();\n};\n\n\n/**\n * Parent the passed in components to the split containers.  Call their\n * createDom methods if necessary.\n * @private\n */\ngoog.ui.SplitPane.prototype.finishSetup_ = function() {\n  var dom = this.getDomHelper();\n\n  if (!this.firstComponent_.getElement()) {\n    this.firstComponent_.createDom();\n  }\n\n  dom.appendChild(\n      this.firstComponentContainer_, this.firstComponent_.getElement());\n\n  if (!this.secondComponent_.getElement()) {\n    this.secondComponent_.createDom();\n  }\n\n  dom.appendChild(\n      this.secondComponentContainer_, this.secondComponent_.getElement());\n\n  this.splitDragger_ =\n      new goog.fx.Dragger(this.splitpaneHandle_, this.splitpaneHandle_);\n\n  this.firstComponentContainer_.style.position = 'absolute';\n  this.secondComponentContainer_.style.position = 'absolute';\n  var handleStyle = this.splitpaneHandle_.style;\n  handleStyle.position = 'absolute';\n  handleStyle.overflow = 'hidden';\n  handleStyle.zIndex = goog.ui.SplitPane.IframeOverlayIndex_.SPLITTER_HANDLE;\n};\n\n\n/**\n * Setup all events and do an initial resize.\n * @override\n */\ngoog.ui.SplitPane.prototype.enterDocument = function() {\n  goog.ui.SplitPane.base(this, 'enterDocument');\n\n  // If position is not set in the inline style of the element, it is not\n  // possible to get the element's real CSS position until the element is in\n  // the document.\n  // When position:relative is set in the CSS and the element is not in the\n  // document, Safari, Chrome, and Opera always return the empty string; while\n  // IE always return \"static\".\n  // Do the final check to see if element's position is set as \"relative\",\n  // \"absolute\" or \"fixed\".\n  var element = this.getElement();\n  if (goog.style.getComputedPosition(element) == 'static') {\n    element.style.position = 'relative';\n  }\n\n  this.getHandler()\n      .listen(\n          this.splitpaneHandle_, goog.events.EventType.DBLCLICK,\n          this.handleDoubleClick_)\n      .listen(\n          this.splitDragger_, goog.fx.Dragger.EventType.START,\n          this.handleDragStart_)\n      .listen(\n          this.splitDragger_, goog.fx.Dragger.EventType.DRAG, this.handleDrag_)\n      .listen(\n          this.splitDragger_, goog.fx.Dragger.EventType.END,\n          this.handleDragEnd_);\n\n  this.setFirstComponentSize(this.initialSize_);\n};\n\n\n/**\n * Sets the initial size of the left or top component.\n * @param {number} size The size in Pixels of the container.\n */\ngoog.ui.SplitPane.prototype.setInitialSize = function(size) {\n  this.initialSize_ = size;\n};\n\n\n/**\n * Sets the SplitPane handle size.\n * TODO(user): Make sure this works after initialization.\n * @param {number} size The size of the handle in pixels.\n */\ngoog.ui.SplitPane.prototype.setHandleSize = function(size) {\n  this.handleSize_ = size;\n};\n\n\n/**\n * Sets whether we resize on handle drag.\n * @param {boolean} continuous The continuous resize value.\n */\ngoog.ui.SplitPane.prototype.setContinuousResize = function(continuous) {\n  this.continuousResize_ = continuous;\n};\n\n\n/**\n * Returns whether the orientation for the split pane is vertical\n * or not.\n * @return {boolean} True if the orientation is vertical, false otherwise.\n */\ngoog.ui.SplitPane.prototype.isVertical = function() {\n  return this.orientation_ == goog.ui.SplitPane.Orientation.VERTICAL;\n};\n\n\n/**\n * Initializes the handle by assigning the correct height/width and adding\n * the correct class as per the orientation.\n * @private\n */\ngoog.ui.SplitPane.prototype.setUpHandle_ = function() {\n  if (this.isVertical()) {\n    this.splitpaneHandle_.style.height = this.handleSize_ + 'px';\n    goog.dom.classlist.add(\n        this.splitpaneHandle_, goog.ui.SplitPane.HANDLE_CLASS_NAME_VERTICAL_);\n  } else {\n    this.splitpaneHandle_.style.width = this.handleSize_ + 'px';\n    goog.dom.classlist.add(\n        this.splitpaneHandle_, goog.ui.SplitPane.HANDLE_CLASS_NAME_HORIZONTAL_);\n  }\n};\n\n\n/**\n * Sets the orientation class for the split pane handle.\n * @protected\n */\ngoog.ui.SplitPane.prototype.setOrientationClassForHandle = function() {\n  goog.asserts.assert(this.splitpaneHandle_);\n  if (this.isVertical()) {\n    goog.dom.classlist.swap(\n        this.splitpaneHandle_, goog.ui.SplitPane.HANDLE_CLASS_NAME_HORIZONTAL_,\n        goog.ui.SplitPane.HANDLE_CLASS_NAME_VERTICAL_);\n  } else {\n    goog.dom.classlist.swap(\n        this.splitpaneHandle_, goog.ui.SplitPane.HANDLE_CLASS_NAME_VERTICAL_,\n        goog.ui.SplitPane.HANDLE_CLASS_NAME_HORIZONTAL_);\n  }\n};\n\n\n/**\n * Sets the orientation of the split pane.\n * @param {goog.ui.SplitPane.Orientation} orientation SplitPane orientation.\n */\ngoog.ui.SplitPane.prototype.setOrientation = function(orientation) {\n  if (this.orientation_ != orientation) {\n    this.orientation_ = orientation;\n    var isVertical = this.isVertical();\n\n    // If the split pane is already in document, then the positions and sizes\n    // need to be adjusted.\n    if (this.isInDocument()) {\n      this.setOrientationClassForHandle();\n      // TODO(user): Should handleSize_ and initialSize_ also be adjusted ?\n      if (typeof this.firstComponentSize_ === 'number') {\n        var splitpaneSize = goog.style.getBorderBoxSize(this.getElement());\n        var ratio = isVertical ? splitpaneSize.height / splitpaneSize.width :\n                                 splitpaneSize.width / splitpaneSize.height;\n        // TODO(user): Fix the behaviour for the case when the handle is\n        // placed on either of  the edges of the split pane. Also, similar\n        // behaviour is present in {@link #setSize}. Probably need to modify\n        // {@link #setFirstComponentSize}.\n        this.setFirstComponentSize(this.firstComponentSize_ * ratio);\n      } else {\n        this.setFirstComponentSize();\n      }\n    }\n  }\n};\n\n\n/**\n * Gets the orientation of the split pane.\n * @return {goog.ui.SplitPane.Orientation} The orientation.\n */\ngoog.ui.SplitPane.prototype.getOrientation = function() {\n  return this.orientation_;\n};\n\n\n/**\n * Move and resize a container.  The sizing changes the BorderBoxSize.\n * @param {Element} element The element to move and size.\n * @param {goog.math.Rect} rect The top, left, width and height to change to.\n * @private\n */\ngoog.ui.SplitPane.prototype.moveAndSize_ = function(element, rect) {\n  goog.style.setPosition(element, rect.left, rect.top);\n  // TODO(user): Add a goog.math.Size.max call for below.\n  goog.style.setBorderBoxSize(\n      element,\n      new goog.math.Size(Math.max(rect.width, 0), Math.max(rect.height, 0)));\n};\n\n\n/**\n * @return {?number} The size of the left/top component.\n */\ngoog.ui.SplitPane.prototype.getFirstComponentSize = function() {\n  return this.firstComponentSize_;\n};\n\n\n/**\n * Set the size of the left/top component, and resize the other component based\n * on that size and handle size.\n * @param {?number=} opt_size The size of the top or left, in pixels. If\n *     unspecified, leaves the size of the first component unchanged but adjusts\n *     the size of the second component to fit the split pane size.\n */\ngoog.ui.SplitPane.prototype.setFirstComponentSize = function(opt_size) {\n  this.setFirstComponentSize_(\n      goog.style.getBorderBoxSize(this.getElement()), opt_size);\n};\n\n\n/**\n * Set the size of the left/top component, and resize the other component based\n * on that size and handle size. Unlike the public method, this takes the\n * current pane size which avoids the expensive getBorderBoxSize() call\n * when we have the size available.\n *\n * @param {!goog.math.Size} splitpaneSize The current size of the splitpane.\n * @param {?number=} opt_size The size of the top or left, in pixels.\n * @private\n */\ngoog.ui.SplitPane.prototype.setFirstComponentSize_ = function(\n    splitpaneSize, opt_size) {\n  var top = 0, left = 0;\n\n  var isVertical = this.isVertical();\n  // Figure out first component size; it's either passed in, taken from the\n  // saved size, or is half of the total size.\n  var firstComponentSize = (typeof opt_size === 'number') ?\n      opt_size :\n      typeof this.firstComponentSize_ === 'number' ?\n      this.firstComponentSize_ :\n      Math.floor((isVertical ? splitpaneSize.height : splitpaneSize.width) / 2);\n  this.firstComponentSize_ = firstComponentSize;\n\n  var firstComponentWidth;\n  var firstComponentHeight;\n  var secondComponentWidth;\n  var secondComponentHeight;\n  var handleWidth;\n  var handleHeight;\n  var secondComponentLeft;\n  var secondComponentTop;\n  var handleLeft;\n  var handleTop;\n\n  if (isVertical) {\n    // Width for the handle and the first and second components will be the\n    // width of the split pane. The height for the first component will be\n    // the calculated first component size. The height for the second component\n    // will be the  total height minus the heights of the first component and\n    // the handle.\n    firstComponentHeight = firstComponentSize;\n    firstComponentWidth = splitpaneSize.width;\n    handleWidth = splitpaneSize.width;\n    handleHeight = this.handleSize_;\n    secondComponentHeight =\n        splitpaneSize.height - firstComponentHeight - handleHeight;\n    secondComponentWidth = splitpaneSize.width;\n    handleTop = top + firstComponentHeight;\n    handleLeft = left;\n    secondComponentTop = handleTop + handleHeight;\n    secondComponentLeft = left;\n  } else {\n    // Height for the handle and the first and second components will be the\n    // height of the split pane. The width for the first component will be\n    // the calculated first component size. The width for the second component\n    // will be the  total width minus the widths of the first component and\n    // the handle.\n    firstComponentWidth = firstComponentSize;\n    firstComponentHeight = splitpaneSize.height;\n    handleWidth = this.handleSize_;\n    handleHeight = splitpaneSize.height;\n    secondComponentWidth =\n        splitpaneSize.width - firstComponentWidth - handleWidth;\n    secondComponentHeight = splitpaneSize.height;\n    handleLeft = left + firstComponentWidth;\n    handleTop = top;\n    secondComponentLeft = handleLeft + handleWidth;\n    secondComponentTop = top;\n  }\n\n  // Now move and size the containers.\n  this.moveAndSize_(\n      this.firstComponentContainer_,\n      new goog.math.Rect(left, top, firstComponentWidth, firstComponentHeight));\n\n  if (typeof this.firstComponent_.resize == 'function') {\n    this.firstComponent_.resize(\n        new goog.math.Size(firstComponentWidth, firstComponentHeight));\n  }\n\n  this.moveAndSize_(\n      this.splitpaneHandle_,\n      new goog.math.Rect(handleLeft, handleTop, handleWidth, handleHeight));\n\n  this.moveAndSize_(\n      this.secondComponentContainer_,\n      new goog.math.Rect(\n          secondComponentLeft, secondComponentTop, secondComponentWidth,\n          secondComponentHeight));\n\n  if (typeof this.secondComponent_.resize == 'function') {\n    this.secondComponent_.resize(\n        new goog.math.Size(secondComponentWidth, secondComponentHeight));\n  }\n  // Fire a CHANGE event.\n  this.dispatchEvent(goog.ui.Component.EventType.CHANGE);\n};\n\n\n/**\n * Set the size of the splitpane.  This is usually called by the controlling\n * application.  This will set the SplitPane BorderBoxSize.\n * @param {!goog.math.Size} size The size to set the splitpane.\n * @param {?number=} opt_firstComponentSize The size of the top or left\n *     component, in pixels.\n */\ngoog.ui.SplitPane.prototype.setSize = function(size, opt_firstComponentSize) {\n  goog.style.setBorderBoxSize(this.getElement(), size);\n  if (this.iframeOverlay_) {\n    goog.style.setBorderBoxSize(this.iframeOverlay_, size);\n  }\n  this.setFirstComponentSize_(size, opt_firstComponentSize);\n};\n\n\n/**\n * Snap the container to the left or top on a Double-click.\n * @private\n */\ngoog.ui.SplitPane.prototype.snapIt_ = function() {\n  var handlePos = goog.style.getRelativePosition(\n      this.splitpaneHandle_, this.firstComponentContainer_);\n  var firstBorderBoxSize =\n      goog.style.getBorderBoxSize(this.firstComponentContainer_);\n  var firstContentBoxSize =\n      goog.style.getContentBoxSize(this.firstComponentContainer_);\n\n  var isVertical = this.isVertical();\n\n  // Where do we snap the handle (what size to make the component) and what\n  // is the current handle position.\n  var snapSize;\n  var handlePosition;\n  if (isVertical) {\n    snapSize = firstBorderBoxSize.height - firstContentBoxSize.height;\n    handlePosition = handlePos.y;\n  } else {\n    snapSize = firstBorderBoxSize.width - firstContentBoxSize.width;\n    handlePosition = handlePos.x;\n  }\n\n  if (snapSize == handlePosition) {\n    // This means we're 'unsnapping', set it back to where it was.\n    this.setFirstComponentSize(this.savedSnapSize_);\n  } else {\n    // This means we're 'snapping', set the size to snapSize, and hide the\n    // first component.\n    if (isVertical) {\n      this.savedSnapSize_ =\n          goog.style.getBorderBoxSize(this.firstComponentContainer_).height;\n    } else {\n      this.savedSnapSize_ =\n          goog.style.getBorderBoxSize(this.firstComponentContainer_).width;\n    }\n    this.setFirstComponentSize(snapSize);\n  }\n\n  // Fire a SNAP event.\n  this.dispatchEvent(goog.ui.SplitPane.EventType.HANDLE_SNAP);\n};\n\n\n/**\n * Handle the start drag event - set up the dragger.\n * @param {goog.events.Event} e The event.\n * @private\n */\ngoog.ui.SplitPane.prototype.handleDragStart_ = function(e) {\n\n  // Setup iframe overlay to prevent iframes from grabbing events.\n  if (!this.iframeOverlay_) {\n    // Create the overlay.\n    var cssStyles = 'position: relative';\n\n    if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('10')) {\n      // IE doesn't look at this div unless it has a background, so we'll\n      // put one on, but make it opaque.\n      cssStyles += ';background-color: #000;filter: Alpha(Opacity=0)';\n    }\n    this.iframeOverlay_ = this.getDomHelper().createDom(\n        goog.dom.TagName.DIV, {'style': cssStyles});\n\n    this.getDomHelper().appendChild(this.getElement(), this.iframeOverlay_);\n  }\n  this.iframeOverlay_.style.zIndex =\n      goog.ui.SplitPane.IframeOverlayIndex_.OVERLAY;\n\n  goog.style.setBorderBoxSize(\n      this.iframeOverlay_, goog.style.getBorderBoxSize(this.getElement()));\n\n  var pos = goog.style.getPosition(this.firstComponentContainer_);\n\n  // For the size of the limiting box, we add the container content box sizes\n  // so that if the handle is placed all the way to the end or the start, the\n  // border doesn't exceed the total size. For position, we add the difference\n  // between the border box and content box sizes of the first container to the\n  // position of the first container. The start position should be such that\n  // there is no overlap of borders.\n  var limitWidth = 0;\n  var limitHeight = 0;\n  var limitx = pos.x;\n  var limity = pos.y;\n  var firstBorderBoxSize =\n      goog.style.getBorderBoxSize(this.firstComponentContainer_);\n  var firstContentBoxSize =\n      goog.style.getContentBoxSize(this.firstComponentContainer_);\n  var secondContentBoxSize =\n      goog.style.getContentBoxSize(this.secondComponentContainer_);\n  if (this.isVertical()) {\n    limitHeight = firstContentBoxSize.height + secondContentBoxSize.height;\n    limity += firstBorderBoxSize.height - firstContentBoxSize.height;\n  } else {\n    limitWidth = firstContentBoxSize.width + secondContentBoxSize.width;\n    limitx += firstBorderBoxSize.width - firstContentBoxSize.width;\n  }\n  var limits = new goog.math.Rect(limitx, limity, limitWidth, limitHeight);\n  this.splitDragger_.setLimits(limits);\n};\n\n\n/**\n * Find the location relative to the splitpane.\n * @param {number} left The x location relative to the window.\n * @return {number} The relative x location.\n * @private\n */\ngoog.ui.SplitPane.prototype.getRelativeLeft_ = function(left) {\n  return left - goog.style.getPosition(this.firstComponentContainer_).x;\n};\n\n\n/**\n * Find the location relative to the splitpane.\n * @param {number} top The y location relative to the window.\n * @return {number} The relative y location.\n * @private\n */\ngoog.ui.SplitPane.prototype.getRelativeTop_ = function(top) {\n  return top - goog.style.getPosition(this.firstComponentContainer_).y;\n};\n\n\n/**\n * Handle the drag event. Move the containers.\n * @param {!goog.fx.DragEvent} e The event.\n * @private\n */\ngoog.ui.SplitPane.prototype.handleDrag_ = function(e) {\n  if (this.continuousResize_) {\n    if (this.isVertical()) {\n      var top = this.getRelativeTop_(e.top);\n      this.setFirstComponentSize(top);\n    } else {\n      var left = this.getRelativeLeft_(e.left);\n      this.setFirstComponentSize(left);\n    }\n    this.dispatchEvent(goog.ui.SplitPane.EventType.HANDLE_DRAG);\n  }\n};\n\n\n/**\n * Handle the drag end event. If we're not doing continuous resize,\n * resize the component.  If we're doing continuous resize, the component\n * is already the correct size.\n * @param {!goog.fx.DragEvent} e The event.\n * @private\n */\ngoog.ui.SplitPane.prototype.handleDragEnd_ = function(e) {\n  // Push iframe overlay down.\n  this.iframeOverlay_.style.zIndex =\n      goog.ui.SplitPane.IframeOverlayIndex_.HIDDEN;\n  if (!this.continuousResize_) {\n    if (this.isVertical()) {\n      var top = this.getRelativeTop_(e.top);\n      this.setFirstComponentSize(top);\n    } else {\n      var left = this.getRelativeLeft_(e.left);\n      this.setFirstComponentSize(left);\n    }\n  }\n\n  this.dispatchEvent(goog.ui.SplitPane.EventType.HANDLE_DRAG_END);\n};\n\n\n/**\n * Handle the Double-click. Call the snapIt method which snaps the container\n * to the top or left.\n * @param {goog.events.Event} e The event.\n * @private\n */\ngoog.ui.SplitPane.prototype.handleDoubleClick_ = function(e) {\n  this.snapIt_();\n};\n\n\n/** @override */\ngoog.ui.SplitPane.prototype.disposeInternal = function() {\n  goog.dispose(this.splitDragger_);\n  this.splitDragger_ = null;\n\n  goog.dom.removeNode(this.iframeOverlay_);\n  this.iframeOverlay_ = null;\n\n  goog.ui.SplitPane.base(this, 'disposeInternal');\n};\n","^;",1579837703000,"^<",["^=",["^1L","^1>","^1M","^1P","^@@","^?","^[","^@U","^1C","^@A","^1F","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/splitpane.js"],"^O",["^=",["~$goog.ui.SplitPane.Orientation","~$goog.ui.SplitPane"]],"^W",true,"^X",["^?","^1L","^1>","^12","^1M","^1C","^@U","^@A","^@@","^1F","^1P","^["]],["^ ","^3",[1579837703000],"^4","goog.graphics.ext.ellipse.js","^5",["^6","goog/graphics/ext/ellipse.js"],"^7","goog/graphics/ext/ellipse.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A thick wrapper around ellipses.\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.graphics.ext.Ellipse');\n\ngoog.forwardDeclare('goog.graphics.ext.Group');\ngoog.require('goog.graphics.ext.StrokeAndFillElement');\n\n\n\n/**\n * Wrapper for a graphics ellipse element.\n * @param {goog.graphics.ext.Group} group Parent for this element.\n * @constructor\n * @extends {goog.graphics.ext.StrokeAndFillElement}\n * @final\n */\ngoog.graphics.ext.Ellipse = function(group) {\n  // Initialize with some stock values.\n  var wrapper = group.getGraphicsImplementation().drawEllipse(\n      1, 1, 2, 2, null, null, group.getWrapper());\n  goog.graphics.ext.StrokeAndFillElement.call(this, group, wrapper);\n};\ngoog.inherits(\n    goog.graphics.ext.Ellipse, goog.graphics.ext.StrokeAndFillElement);\n\n\n/**\n * Redraw the ellipse.  Called when the coordinate system is changed.\n * @protected\n * @override\n */\ngoog.graphics.ext.Ellipse.prototype.redraw = function() {\n  goog.graphics.ext.Ellipse.superClass_.redraw.call(this);\n\n  // Our position is already transformed in transform_, but because this is an\n  // ellipse we need to position the center.\n  var xRadius = this.getWidth() / 2;\n  var yRadius = this.getHeight() / 2;\n  var wrapper = this.getWrapper();\n  wrapper.setCenter(xRadius, yRadius);\n  wrapper.setRadius(xRadius, yRadius);\n};\n","^;",1579837703000,"^<",["^=",["^?","^79"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/ext/ellipse.js"],"^O",["^=",["^95"]],"^W",true,"^X",["^?","^79"]],["^ ","^3",[1579837703000],"^4","goog.labs.testing.assertthat.js","^5",["^6","goog/labs/testing/assertthat.js"],"^7","goog/labs/testing/assertthat.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides main functionality of assertThat. assertThat calls the\n * matcher's matches method to test if a matcher matches assertThat's arguments.\n */\n\n\ngoog.provide('goog.labs.testing.MatcherError');\ngoog.provide('goog.labs.testing.assertThat');\n\ngoog.forwardDeclare('goog.labs.testing.Matcher');\ngoog.require('goog.debug.Error');\n\n\n/**\n * Asserts that the actual value evaluated by the matcher is true.\n *\n * @param {*} actual The object to assert by the matcher.\n * @param {!goog.labs.testing.Matcher} matcher A matcher to verify values.\n * @param {string=} opt_reason Description of what is asserted.\n *\n */\ngoog.labs.testing.assertThat = function(actual, matcher, opt_reason) {\n  if (!matcher.matches(actual)) {\n    // Prefix the error description with a reason from the assert ?\n    var prefix = opt_reason ? opt_reason + ': ' : '';\n    var desc = prefix + matcher.describe(actual);\n\n    // some sort of failure here\n    throw new goog.labs.testing.MatcherError(desc);\n  }\n};\n\n\n\n/**\n * Error thrown when a Matcher fails to match the input value.\n * @param {string=} opt_message The error message.\n * @constructor\n * @extends {goog.debug.Error}\n * @final\n */\ngoog.labs.testing.MatcherError = function(opt_message) {\n  goog.labs.testing.MatcherError.base(this, 'constructor', opt_message);\n};\ngoog.inherits(goog.labs.testing.MatcherError, goog.debug.Error);\n","^;",1579837703000,"^<",["^=",["^?","^7N"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/testing/assertthat.js"],"^O",["^=",["~$goog.labs.testing.assertThat","~$goog.labs.testing.MatcherError"]],"^W",true,"^X",["^?","^7N"]],["^ ","^3",[1579837703000],"^4","goog.string.typedstring.js","^5",["^6","goog/string/typedstring.js"],"^7","goog/string/typedstring.js","^8","^9","^:","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.string.TypedString');\n\n\n\n/**\n * Wrapper for strings that conform to a data type or language.\n *\n * Implementations of this interface are wrappers for strings, and typically\n * associate a type contract with the wrapped string.  Concrete implementations\n * of this interface may choose to implement additional run-time type checking,\n * see for example `goog.html.SafeHtml`. If available, client code that\n * needs to ensure type membership of an object should use the type's function\n * to assert type membership, such as `goog.html.SafeHtml.unwrap`.\n * @interface\n */\ngoog.string.TypedString = function() {};\n\n\n/**\n * Interface marker of the TypedString interface.\n *\n * This property can be used to determine at runtime whether or not an object\n * implements this interface.  All implementations of this interface set this\n * property to `true`.\n * @type {boolean}\n */\ngoog.string.TypedString.prototype.implementsGoogStringTypedString;\n\n\n/**\n * Retrieves this wrapped string's value.\n * @return {string} The wrapped string's value.\n */\ngoog.string.TypedString.prototype.getTypedStringValue;\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/string/typedstring.js"],"^O",["^=",["~$goog.string.TypedString"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.dom.fullscreen.js","^5",["^6","goog/dom/fullscreen.js"],"^7","goog/dom/fullscreen.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions for managing full screen status of the DOM.\n *\n */\n\ngoog.provide('goog.dom.fullscreen');\ngoog.provide('goog.dom.fullscreen.EventType');\n\ngoog.require('goog.dom');\n\n/**\n * Event types for full screen.\n * @enum {string}\n */\ngoog.dom.fullscreen.EventType = {\n  /** Dispatched by the Document when the fullscreen status changes. */\n  CHANGE: (function() {\n    var el = goog.dom.getDomHelper().getDocument().documentElement;\n    if (el.requestFullscreen) {\n      return 'fullscreenchange';\n    }\n    if (el.webkitRequestFullscreen) {\n      return 'webkitfullscreenchange';\n    }\n    if (el.mozRequestFullScreen) {\n      return 'mozfullscreenchange';\n    }\n    if (el.msRequestFullscreen) {\n      return 'MSFullscreenChange';\n    }\n    // Opera 12-14, and W3C standard (Draft):\n    // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html\n    return 'fullscreenchange';\n  })()\n};\n\n\n/**\n * Options for fullscreen navigation UI:\n * https://fullscreen.spec.whatwg.org/#dictdef-fullscreenoptions\n * @enum {string}\n */\ngoog.dom.fullscreen.FullscreenNavigationUI = {\n  AUTO: 'auto',\n  HIDE: 'hide',\n  SHOW: 'show'\n};\n\n/**\n * @record\n * @extends {FullscreenOptions}\n */\ngoog.dom.fullscreen.FullscreenOptions = function() {};\n\n/** @type {!goog.dom.fullscreen.FullscreenNavigationUI} */\ngoog.dom.fullscreen.FullscreenOptions.prototype.navigationUI;\n\n\n/**\n * Determines if full screen is supported.\n * @param {!goog.dom.DomHelper=} opt_domHelper The DomHelper for the DOM being\n *     queried. If not provided, use the current DOM.\n * @return {boolean} True iff full screen is supported.\n */\ngoog.dom.fullscreen.isSupported = function(opt_domHelper) {\n  var doc = goog.dom.fullscreen.getDocument_(opt_domHelper);\n  var body = doc.body;\n  return !!(\n      body.webkitRequestFullscreen ||\n      (body.mozRequestFullScreen && doc.mozFullScreenEnabled) ||\n      (body.msRequestFullscreen && doc.msFullscreenEnabled) ||\n      (body.requestFullscreen && doc.fullscreenEnabled));\n};\n\n\n/**\n * Requests putting the element in full screen.\n * @param {!Element} element The element to put full screen.\n * @param {!goog.dom.fullscreen.FullscreenOptions=} opt_options Options for full\n *     screen. This field will be ignored on older browsers.\n */\ngoog.dom.fullscreen.requestFullScreen = function(element, opt_options) {\n  if (element.requestFullscreen) {\n    element.requestFullscreen(opt_options);\n  } else if (element.webkitRequestFullscreen) {\n    element.webkitRequestFullscreen();\n  } else if (element.mozRequestFullScreen) {\n    element.mozRequestFullScreen();\n  } else if (element.msRequestFullscreen) {\n    element.msRequestFullscreen();\n  }\n};\n\n\n/**\n * Requests putting the element in full screen with full keyboard access.\n * @param {!Element} element The element to put full screen.\n */\ngoog.dom.fullscreen.requestFullScreenWithKeys = function(element) {\n  if (element.mozRequestFullScreenWithKeys) {\n    element.mozRequestFullScreenWithKeys();\n  } else {\n    goog.dom.fullscreen.requestFullScreen(element);\n  }\n};\n\n\n/**\n * Exits full screen.\n * @param {!goog.dom.DomHelper=} opt_domHelper The DomHelper for the DOM being\n *     queried. If not provided, use the current DOM.\n */\ngoog.dom.fullscreen.exitFullScreen = function(opt_domHelper) {\n  var doc = goog.dom.fullscreen.getDocument_(opt_domHelper);\n  if (doc.exitFullscreen) {\n    doc.exitFullscreen();\n  } else if (doc.webkitCancelFullScreen) {\n    doc.webkitCancelFullScreen();\n  } else if (doc.mozCancelFullScreen) {\n    doc.mozCancelFullScreen();\n  } else if (doc.msExitFullscreen) {\n    doc.msExitFullscreen();\n  }\n};\n\n\n/**\n * Determines if the document is full screen.\n * @param {!goog.dom.DomHelper=} opt_domHelper The DomHelper for the DOM being\n *     queried. If not provided, use the current DOM.\n * @return {boolean} Whether the document is full screen.\n */\ngoog.dom.fullscreen.isFullScreen = function(opt_domHelper) {\n  var doc = goog.dom.fullscreen.getDocument_(opt_domHelper);\n  // IE 11 doesn't have similar boolean property, so check whether\n  // document.msFullscreenElement is null instead.\n  return !!(\n      doc.webkitIsFullScreen || doc.mozFullScreen || doc.msFullscreenElement ||\n      doc.fullscreenElement);\n};\n\n\n/**\n * Get the root element in full screen mode.\n * @param {!goog.dom.DomHelper=} opt_domHelper The DomHelper for the DOM being\n *     queried. If not provided, use the current DOM.\n * @return {?Element} The root element in full screen mode.\n */\ngoog.dom.fullscreen.getFullScreenElement = function(opt_domHelper) {\n  var doc = goog.dom.fullscreen.getDocument_(opt_domHelper);\n  var element_list = [\n    doc.fullscreenElement, doc.webkitFullscreenElement,\n    doc.mozFullScreenElement, doc.msFullscreenElement\n  ];\n  for (var i = 0; i < element_list.length; i++) {\n    if (element_list[i] != null) {\n      return element_list[i];\n    }\n  }\n  return null;\n};\n\n\n/**\n * Gets the document object of the dom.\n * @param {!goog.dom.DomHelper=} opt_domHelper The DomHelper for the DOM being\n *     queried. If not provided, use the current DOM.\n * @return {!Document} The dom document.\n * @private\n */\ngoog.dom.fullscreen.getDocument_ = function(opt_domHelper) {\n  return opt_domHelper ? opt_domHelper.getDocument() :\n                         goog.dom.getDomHelper().getDocument();\n};\n","^;",1579837703000,"^<",["^=",["^1>","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/fullscreen.js"],"^O",["^=",["~$goog.dom.fullscreen","~$goog.dom.fullscreen.EventType"]],"^W",true,"^X",["^?","^1>"]],["^ ","^3",[1579837703000],"^4","goog.net.wrapperxmlhttpfactory.js","^5",["^6","goog/net/wrapperxmlhttpfactory.js"],"^7","goog/net/wrapperxmlhttpfactory.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implementation of XmlHttpFactory which allows construction from\n * simple factory methods.\n * @author dbk@google.com (David Barrett-Kahn)\n */\n\ngoog.provide('goog.net.WrapperXmlHttpFactory');\n\n/** @suppress {extraRequire} Typedef. */\ngoog.require('goog.net.XhrLike');\ngoog.require('goog.net.XmlHttpFactory');\n\n\n\n/**\n * An xhr factory subclass which can be constructed using two factory methods.\n * This exists partly to allow the preservation of goog.net.XmlHttp.setFactory()\n * with an unchanged signature.\n * @param {function():!goog.net.XhrLike.OrNative} xhrFactory\n *     A function which returns a new XHR object.\n * @param {function():!Object} optionsFactory A function which returns the\n *     options associated with xhr objects from this factory.\n * @extends {goog.net.XmlHttpFactory}\n * @constructor\n * @final\n */\ngoog.net.WrapperXmlHttpFactory = function(xhrFactory, optionsFactory) {\n  goog.net.XmlHttpFactory.call(this);\n\n  /**\n   * XHR factory method.\n   * @type {function() : !goog.net.XhrLike.OrNative}\n   * @private\n   */\n  this.xhrFactory_ = xhrFactory;\n\n  /**\n   * Options factory method.\n   * @type {function() : !Object}\n   * @private\n   */\n  this.optionsFactory_ = optionsFactory;\n};\ngoog.inherits(goog.net.WrapperXmlHttpFactory, goog.net.XmlHttpFactory);\n\n\n/** @override */\ngoog.net.WrapperXmlHttpFactory.prototype.createInstance = function() {\n  return this.xhrFactory_();\n};\n\n\n/** @override */\ngoog.net.WrapperXmlHttpFactory.prototype.getOptions = function() {\n  return this.optionsFactory_();\n};\n","^;",1579837703000,"^<",["^=",["^?","^5I","~$goog.net.XmlHttpFactory"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/wrapperxmlhttpfactory.js"],"^O",["^=",["~$goog.net.WrapperXmlHttpFactory"]],"^W",true,"^X",["^?","^5I","^B:"]],["^ ","^3",[1579837703000],"^4","goog.fs.entry.js","^5",["^6","goog/fs/entry.js"],"^7","goog/fs/entry.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Wrappers for HTML5 Entry objects. These are all in the same\n * file to avoid circular dependency issues.\n *\n * When adding or modifying functionality in this namespace, be sure to update\n * the mock counterparts in goog.testing.fs.\n *\n */\ngoog.provide('goog.fs.DirectoryEntry');\ngoog.provide('goog.fs.DirectoryEntry.Behavior');\ngoog.provide('goog.fs.Entry');\ngoog.provide('goog.fs.FileEntry');\n\ngoog.forwardDeclare('goog.async.Deferred');\ngoog.forwardDeclare('goog.fs.FileSystem');\ngoog.forwardDeclare('goog.fs.FileWriter');\n\n\n\n/**\n * The interface for entries in the filesystem.\n * @interface\n */\ngoog.fs.Entry = function() {};\n\n\n/**\n * @return {boolean} Whether or not this entry is a file.\n */\ngoog.fs.Entry.prototype.isFile = function() {};\n\n\n/**\n * @return {boolean} Whether or not this entry is a directory.\n */\ngoog.fs.Entry.prototype.isDirectory = function() {};\n\n\n/**\n * @return {string} The name of this entry.\n */\ngoog.fs.Entry.prototype.getName = function() {};\n\n\n/**\n * @return {string} The full path to this entry.\n */\ngoog.fs.Entry.prototype.getFullPath = function() {};\n\n\n/**\n * @return {!goog.fs.FileSystem} The filesystem backing this entry.\n */\ngoog.fs.Entry.prototype.getFileSystem = function() {};\n\n\n/**\n * Retrieves the last modified date for this entry.\n *\n * @return {!goog.async.Deferred} The deferred Date for this entry. If an error\n *     occurs, the errback is called with a {@link goog.fs.Error}.\n */\ngoog.fs.Entry.prototype.getLastModified = function() {};\n\n\n/**\n * Retrieves the metadata for this entry.\n *\n * @return {!goog.async.Deferred} The deferred Metadata for this entry. If an\n *     error occurs, the errback is called with a {@link goog.fs.Error}.\n */\ngoog.fs.Entry.prototype.getMetadata = function() {};\n\n\n/**\n * Move this entry to a new location.\n *\n * @param {!goog.fs.DirectoryEntry} parent The new parent directory.\n * @param {string=} opt_newName The new name of the entry. If omitted, the entry\n *     retains its original name.\n * @return {!goog.async.Deferred} The deferred {@link goog.fs.FileEntry} or\n *     {@link goog.fs.DirectoryEntry} for the new entry. If an error occurs, the\n *     errback is called with a {@link goog.fs.Error}.\n */\ngoog.fs.Entry.prototype.moveTo = function(parent, opt_newName) {};\n\n\n/**\n * Copy this entry to a new location.\n *\n * @param {!goog.fs.DirectoryEntry} parent The new parent directory.\n * @param {string=} opt_newName The name of the new entry. If omitted, the new\n *     entry has the same name as the original.\n * @return {!goog.async.Deferred} The deferred {@link goog.fs.FileEntry} or\n *     {@link goog.fs.DirectoryEntry} for the new entry. If an error occurs, the\n *     errback is called with a {@link goog.fs.Error}.\n */\ngoog.fs.Entry.prototype.copyTo = function(parent, opt_newName) {};\n\n\n/**\n * Wrap an HTML5 entry object in an appropriate subclass instance.\n *\n * @param {!Entry} entry The underlying Entry object.\n * @return {!goog.fs.Entry} The appropriate subclass wrapper.\n * @protected\n */\ngoog.fs.Entry.prototype.wrapEntry = function(entry) {};\n\n\n/**\n * Get the URL for this file.\n *\n * @param {string=} opt_mimeType The MIME type that will be served for the URL.\n * @return {string} The URL.\n */\ngoog.fs.Entry.prototype.toUrl = function(opt_mimeType) {};\n\n\n/**\n * Get the URI for this file.\n *\n * @deprecated Use {@link #toUrl} instead.\n * @param {string=} opt_mimeType The MIME type that will be served for the URI.\n * @return {string} The URI.\n */\ngoog.fs.Entry.prototype.toUri = function(opt_mimeType) {};\n\n\n/**\n * Remove this entry.\n *\n * @return {!goog.async.Deferred} A deferred object. If the removal succeeds,\n *     the callback is called with true. If an error occurs, the errback is\n *     called a {@link goog.fs.Error}.\n */\ngoog.fs.Entry.prototype.remove = function() {};\n\n\n/**\n * Gets the parent directory.\n *\n * @return {!goog.async.Deferred} The deferred {@link goog.fs.DirectoryEntry}.\n *     If an error occurs, the errback is called with a {@link goog.fs.Error}.\n */\ngoog.fs.Entry.prototype.getParent = function() {};\n\n\n\n/**\n * A directory in a local FileSystem.\n *\n * @interface\n * @extends {goog.fs.Entry}\n */\ngoog.fs.DirectoryEntry = function() {};\n\n\n/**\n * Behaviors for getting files and directories.\n * @enum {number}\n */\ngoog.fs.DirectoryEntry.Behavior = {\n  /**\n   * Get the file if it exists, error out if it doesn't.\n   */\n  DEFAULT: 1,\n  /**\n   * Get the file if it exists, create it if it doesn't.\n   */\n  CREATE: 2,\n  /**\n   * Error out if the file exists, create it if it doesn't.\n   */\n  CREATE_EXCLUSIVE: 3\n};\n\n\n/**\n * Get a file in the directory.\n *\n * @param {string} path The path to the file, relative to this directory.\n * @param {goog.fs.DirectoryEntry.Behavior=} opt_behavior The behavior for\n *     handling an existing file, or the lack thereof.\n * @return {!goog.async.Deferred} The deferred {@link goog.fs.FileEntry}. If an\n *     error occurs, the errback is called with a {@link goog.fs.Error}.\n */\ngoog.fs.DirectoryEntry.prototype.getFile = function(path, opt_behavior) {};\n\n\n/**\n * Get a directory within this directory.\n *\n * @param {string} path The path to the directory, relative to this directory.\n * @param {goog.fs.DirectoryEntry.Behavior=} opt_behavior The behavior for\n *     handling an existing directory, or the lack thereof.\n * @return {!goog.async.Deferred} The deferred {@link goog.fs.DirectoryEntry}.\n *     If an error occurs, the errback is called a {@link goog.fs.Error}.\n */\ngoog.fs.DirectoryEntry.prototype.getDirectory = function(path, opt_behavior) {};\n\n\n/**\n * Opens the directory for the specified path, creating the directory and any\n * intermediate directories as necessary.\n *\n * @param {string} path The directory path to create. May be absolute or\n *     relative to the current directory. The parent directory \"..\" and current\n *     directory \".\" are supported.\n * @return {!goog.async.Deferred} A deferred {@link goog.fs.DirectoryEntry} for\n *     the requested path. If an error occurs, the errback is called with a\n *     {@link goog.fs.Error}.\n */\ngoog.fs.DirectoryEntry.prototype.createPath = function(path) {};\n\n\n/**\n * Gets a list of all entries in this directory.\n *\n * @return {!goog.async.Deferred} The deferred list of {@link goog.fs.Entry}\n *     results. If an error occurs, the errback is called with a\n *     {@link goog.fs.Error}.\n */\ngoog.fs.DirectoryEntry.prototype.listDirectory = function() {};\n\n\n/**\n * Removes this directory and all its contents.\n *\n * @return {!goog.async.Deferred} A deferred object. If the removal succeeds,\n *     the callback is called with true. If an error occurs, the errback is\n *     called a {@link goog.fs.Error}.\n */\ngoog.fs.DirectoryEntry.prototype.removeRecursively = function() {};\n\n\n\n/**\n * A file in a local filesystem.\n *\n * @interface\n * @extends {goog.fs.Entry}\n */\ngoog.fs.FileEntry = function() {};\n\n\n/**\n * Create a writer for writing to the file.\n *\n * @return {!goog.async.Deferred<!goog.fs.FileWriter>} If an error occurs, the\n *     errback is called with a {@link goog.fs.Error}.\n */\ngoog.fs.FileEntry.prototype.createWriter = function() {};\n\n\n/**\n * Get the file contents as a File blob.\n *\n * @return {!goog.async.Deferred<!File>} If an error occurs, the errback is\n *     called with a {@link goog.fs.Error}.\n */\ngoog.fs.FileEntry.prototype.file = function() {};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fs/entry.js"],"^O",["^=",["~$goog.fs.DirectoryEntry.Behavior","~$goog.fs.FileEntry","~$goog.fs.Entry","~$goog.fs.DirectoryEntry"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.html.safeurl.js","^5",["^6","goog/html/safeurl.js"],"^7","goog/html/safeurl.js","^8","^9","^:","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The SafeUrl type and its builders.\n *\n * TODO(xtof): Link to document stating type contract.\n */\n\ngoog.provide('goog.html.SafeUrl');\n\ngoog.require('goog.asserts');\ngoog.require('goog.fs.url');\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.i18n.bidi.Dir');\ngoog.require('goog.i18n.bidi.DirectionalString');\ngoog.require('goog.string.Const');\ngoog.require('goog.string.TypedString');\ngoog.require('goog.string.internal');\n\n\n\n/**\n * A string that is safe to use in URL context in DOM APIs and HTML documents.\n *\n * A SafeUrl is a string-like object that carries the security type contract\n * that its value as a string will not cause untrusted script execution\n * when evaluated as a hyperlink URL in a browser.\n *\n * Values of this type are guaranteed to be safe to use in URL/hyperlink\n * contexts, such as assignment to URL-valued DOM properties, in the sense that\n * the use will not result in a Cross-Site-Scripting vulnerability. Similarly,\n * SafeUrls can be interpolated into the URL context of an HTML template (e.g.,\n * inside a href attribute). However, appropriate HTML-escaping must still be\n * applied.\n *\n * Note that, as documented in `goog.html.SafeUrl.unwrap`, this type's\n * contract does not guarantee that instances are safe to interpolate into HTML\n * without appropriate escaping.\n *\n * Note also that this type's contract does not imply any guarantees regarding\n * the resource the URL refers to.  In particular, SafeUrls are <b>not</b>\n * safe to use in a context where the referred-to resource is interpreted as\n * trusted code, e.g., as the src of a script tag.\n *\n * Instances of this type must be created via the factory methods\n * (`goog.html.SafeUrl.fromConstant`, `goog.html.SafeUrl.sanitize`),\n * etc and not by invoking its constructor. The constructor is organized in a\n * way that only methods from that file can call it and initialize with\n * non-empty values. Anyone else calling constructor will get default instance\n * with empty value.\n *\n * @see goog.html.SafeUrl#fromConstant\n * @see goog.html.SafeUrl#from\n * @see goog.html.SafeUrl#sanitize\n * @constructor\n * @final\n * @struct\n * @implements {goog.i18n.bidi.DirectionalString}\n * @implements {goog.string.TypedString}\n * @param {!Object=} opt_token package-internal implementation detail.\n * @param {string=} opt_content package-internal implementation detail.\n */\ngoog.html.SafeUrl = function(opt_token, opt_content) {\n  /**\n   * The contained value of this SafeUrl.  The field has a purposely ugly\n   * name to make (non-compiled) code that attempts to directly access this\n   * field stand out.\n   * @private {string}\n   */\n  this.privateDoNotAccessOrElseSafeUrlWrappedValue_ =\n      ((opt_token === goog.html.SafeUrl.CONSTRUCTOR_TOKEN_PRIVATE_) &&\n       opt_content) ||\n      '';\n\n  /**\n   * A type marker used to implement additional run-time type checking.\n   * @see goog.html.SafeUrl#unwrap\n   * @const {!Object}\n   * @private\n   */\n  this.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =\n      goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;\n};\n\n\n/**\n * The innocuous string generated by goog.html.SafeUrl.sanitize when passed\n * an unsafe URL.\n *\n * about:invalid is registered in\n * http://www.w3.org/TR/css3-values/#about-invalid.\n * http://tools.ietf.org/html/rfc6694#section-2.2.1 permits about URLs to\n * contain a fragment, which is not to be considered when determining if an\n * about URL is well-known.\n *\n * Using about:invalid seems preferable to using a fixed data URL, since\n * browsers might choose to not report CSP violations on it, as legitimate\n * CSS function calls to attr() can result in this URL being produced. It is\n * also a standard URL which matches exactly the semantics we need:\n * \"The about:invalid URI references a non-existent document with a generic\n * error condition. It can be used when a URI is necessary, but the default\n * value shouldn't be resolveable as any type of document\".\n *\n * @const {string}\n */\ngoog.html.SafeUrl.INNOCUOUS_STRING = 'about:invalid#zClosurez';\n\n\n/**\n * @override\n * @const\n */\ngoog.html.SafeUrl.prototype.implementsGoogStringTypedString = true;\n\n\n/**\n * Returns this SafeUrl's value a string.\n *\n * IMPORTANT: In code where it is security relevant that an object's type is\n * indeed `SafeUrl`, use `goog.html.SafeUrl.unwrap` instead of this\n * method. If in doubt, assume that it's security relevant. In particular, note\n * that goog.html functions which return a goog.html type do not guarantee that\n * the returned instance is of the right type.\n *\n * IMPORTANT: The guarantees of the SafeUrl type contract only extend to the\n * behavior of browsers when interpreting URLs. Values of SafeUrl objects MUST\n * be appropriately escaped before embedding in a HTML document. Note that the\n * required escaping is context-sensitive (e.g. a different escaping is\n * required for embedding a URL in a style property within a style\n * attribute, as opposed to embedding in a href attribute).\n *\n * @see goog.html.SafeUrl#unwrap\n * @override\n */\ngoog.html.SafeUrl.prototype.getTypedStringValue = function() {\n  return this.privateDoNotAccessOrElseSafeUrlWrappedValue_.toString();\n};\n\n\n/**\n * @override\n * @const\n */\ngoog.html.SafeUrl.prototype.implementsGoogI18nBidiDirectionalString = true;\n\n\n/**\n * Returns this URLs directionality, which is always `LTR`.\n * @override\n */\ngoog.html.SafeUrl.prototype.getDirection = function() {\n  return goog.i18n.bidi.Dir.LTR;\n};\n\n\nif (goog.DEBUG) {\n  /**\n   * Returns a debug string-representation of this value.\n   *\n   * To obtain the actual string value wrapped in a SafeUrl, use\n   * `goog.html.SafeUrl.unwrap`.\n   *\n   * @see goog.html.SafeUrl#unwrap\n   * @override\n   */\n  goog.html.SafeUrl.prototype.toString = function() {\n    return 'SafeUrl{' + this.privateDoNotAccessOrElseSafeUrlWrappedValue_ + '}';\n  };\n}\n\n\n/**\n * Performs a runtime check that the provided object is indeed a SafeUrl\n * object, and returns its value.\n *\n * IMPORTANT: The guarantees of the SafeUrl type contract only extend to the\n * behavior of  browsers when interpreting URLs. Values of SafeUrl objects MUST\n * be appropriately escaped before embedding in a HTML document. Note that the\n * required escaping is context-sensitive (e.g. a different escaping is\n * required for embedding a URL in a style property within a style\n * attribute, as opposed to embedding in a href attribute).\n *\n * @param {!goog.html.SafeUrl} safeUrl The object to extract from.\n * @return {string} The SafeUrl object's contained string, unless the run-time\n *     type check fails. In that case, `unwrap` returns an innocuous\n *     string, or, if assertions are enabled, throws\n *     `goog.asserts.AssertionError`.\n */\ngoog.html.SafeUrl.unwrap = function(safeUrl) {\n  // Perform additional Run-time type-checking to ensure that safeUrl is indeed\n  // an instance of the expected type.  This provides some additional protection\n  // against security bugs due to application code that disables type checks.\n  // Specifically, the following checks are performed:\n  // 1. The object is an instance of the expected type.\n  // 2. The object is not an instance of a subclass.\n  // 3. The object carries a type marker for the expected type. \"Faking\" an\n  // object requires a reference to the type marker, which has names intended\n  // to stand out in code reviews.\n  if (safeUrl instanceof goog.html.SafeUrl &&\n      safeUrl.constructor === goog.html.SafeUrl &&\n      safeUrl.SAFE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===\n          goog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {\n    return safeUrl.privateDoNotAccessOrElseSafeUrlWrappedValue_;\n  } else {\n    goog.asserts.fail('expected object of type SafeUrl, got \\'' +\n        safeUrl + '\\' of type ' + goog.typeOf(safeUrl));\n    return 'type_error:SafeUrl';\n  }\n};\n\n\n/**\n * Creates a SafeUrl object from a compile-time constant string.\n *\n * Compile-time constant strings are inherently program-controlled and hence\n * trusted.\n *\n * @param {!goog.string.Const} url A compile-time-constant string from which to\n *         create a SafeUrl.\n * @return {!goog.html.SafeUrl} A SafeUrl object initialized to `url`.\n */\ngoog.html.SafeUrl.fromConstant = function(url) {\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(\n      goog.string.Const.unwrap(url));\n};\n\n\n/**\n * A pattern that matches Blob or data types that can have SafeUrls created\n * from URL.createObjectURL(blob) or via a data: URI.\n *\n * This has some parameter support (most notably, we haven't implemented the\n * more complex parts like %-encoded characters or non-alphanumerical ones for\n * simplicity's sake). The specs are fairly complex, and they don't\n * always match Chrome's behavior: we settled on a subset where we're confident\n * all parties involved agree.\n *\n * The spec is available at https://mimesniff.spec.whatwg.org/ (and see\n * https://tools.ietf.org/html/rfc2397 for data: urls, which override some of\n * it).\n * @const\n * @private\n */\ngoog.html.SAFE_MIME_TYPE_PATTERN_ = new RegExp(\n    // Note: Due to content-sniffing concerns, only add MIME types for\n    // media formats.\n    '^(?:audio/(?:3gpp2|3gpp|aac|L16|midi|mp3|mp4|mpeg|oga|ogg|opus|x-m4a|x-wav|wav|webm)|' +\n        'image/(?:bmp|gif|jpeg|jpg|png|tiff|webp|x-icon)|' +\n        // TODO(b/68188949): Due to content-sniffing concerns, text/csv should\n        // be removed from the whitelist.\n        'text/csv|' +\n        'video/(?:mpeg|mp4|ogg|webm|quicktime))' +\n        '(?:;\\\\w+=(?:\\\\w+|\"[\\\\w;=]+\"))*$',  // MIME type parameters\n    'i');\n\n\n/**\n * @param {string} mimeType The MIME type to check if safe.\n * @return {boolean} True if the MIME type is safe and creating a Blob via\n *   `SafeUrl.fromBlob()` with that type will not fail due to the type. False\n *   otherwise.\n */\ngoog.html.SafeUrl.isSafeMimeType = function(mimeType) {\n  return goog.html.SAFE_MIME_TYPE_PATTERN_.test(mimeType);\n};\n\n\n/**\n * Creates a SafeUrl wrapping a blob URL for the given `blob`.\n *\n * The blob URL is created with `URL.createObjectURL`. If the MIME type\n * for `blob` is not of a known safe audio, image or video MIME type,\n * then the SafeUrl will wrap {@link #INNOCUOUS_STRING}.\n *\n * @see http://www.w3.org/TR/FileAPI/#url\n * @param {!Blob} blob\n * @return {!goog.html.SafeUrl} The blob URL, or an innocuous string wrapped\n *   as a SafeUrl.\n */\ngoog.html.SafeUrl.fromBlob = function(blob) {\n  var url = goog.html.SAFE_MIME_TYPE_PATTERN_.test(blob.type) ?\n      goog.fs.url.createObjectUrl(blob) :\n      goog.html.SafeUrl.INNOCUOUS_STRING;\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);\n};\n\n\n/**\n * Matches a base-64 data URL, with the first match group being the MIME type.\n * @const\n * @private\n */\ngoog.html.DATA_URL_PATTERN_ = /^data:([^,]*);base64,[a-z0-9+\\/]+=*$/i;\n\n\n/**\n * Creates a SafeUrl wrapping a data: URL, after validating it matches a\n * known-safe audio, image or video MIME type.\n *\n * @param {string} dataUrl A valid base64 data URL with one of the whitelisted\n *     audio, image or video MIME types.\n * @return {!goog.html.SafeUrl} A matching safe URL, or {@link INNOCUOUS_STRING}\n *     wrapped as a SafeUrl if it does not pass.\n */\ngoog.html.SafeUrl.fromDataUrl = function(dataUrl) {\n  // RFC4648 suggest to ignore CRLF in base64 encoding.\n  // See https://tools.ietf.org/html/rfc4648.\n  // Remove the CR (%0D) and LF (%0A) from the dataUrl.\n  var filteredDataUrl = dataUrl.replace(/(%0A|%0D)/g, '');\n  // There's a slight risk here that a browser sniffs the content type if it\n  // doesn't know the MIME type and executes HTML within the data: URL. For this\n  // to cause XSS it would also have to execute the HTML in the same origin\n  // of the page with the link. It seems unlikely that both of these will\n  // happen, particularly in not really old IEs.\n  var match = filteredDataUrl.match(goog.html.DATA_URL_PATTERN_);\n  var valid = match && goog.html.SAFE_MIME_TYPE_PATTERN_.test(match[1]);\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(\n      valid ? filteredDataUrl : goog.html.SafeUrl.INNOCUOUS_STRING);\n};\n\n\n/**\n * Creates a SafeUrl wrapping a tel: URL.\n *\n * @param {string} telUrl A tel URL.\n * @return {!goog.html.SafeUrl} A matching safe URL, or {@link INNOCUOUS_STRING}\n *     wrapped as a SafeUrl if it does not pass.\n */\ngoog.html.SafeUrl.fromTelUrl = function(telUrl) {\n  // There's a risk that a tel: URL could immediately place a call once\n  // clicked, without requiring user confirmation. For that reason it is\n  // handled in this separate function.\n  if (!goog.string.internal.caseInsensitiveStartsWith(telUrl, 'tel:')) {\n    telUrl = goog.html.SafeUrl.INNOCUOUS_STRING;\n  }\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(\n      telUrl);\n};\n\n\n/**\n * Matches a sip/sips URL. We only allow urls that consist of an email address.\n * The characters '?' and '#' are not allowed in the local part of the email\n * address.\n * @const\n * @private\n */\ngoog.html.SIP_URL_PATTERN_ = new RegExp(\n    '^sip[s]?:[+a-z0-9_.!$%&\\'*\\\\/=^`{|}~-]+@([a-z0-9-]+\\\\.)+[a-z0-9]{2,63}$',\n    'i');\n\n\n/**\n * Creates a SafeUrl wrapping a sip: URL. We only allow urls that consist of an\n * email address. The characters '?' and '#' are not allowed in the local part\n * of the email address.\n *\n * @param {string} sipUrl A sip URL.\n * @return {!goog.html.SafeUrl} A matching safe URL, or {@link INNOCUOUS_STRING}\n *     wrapped as a SafeUrl if it does not pass.\n */\ngoog.html.SafeUrl.fromSipUrl = function(sipUrl) {\n  if (!goog.html.SIP_URL_PATTERN_.test(decodeURIComponent(sipUrl))) {\n    sipUrl = goog.html.SafeUrl.INNOCUOUS_STRING;\n  }\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(\n      sipUrl);\n};\n\n\n/**\n * Creates a SafeUrl wrapping a fb-messenger://share URL.\n *\n * @param {string} facebookMessengerUrl A facebook messenger URL.\n * @return {!goog.html.SafeUrl} A matching safe URL, or {@link INNOCUOUS_STRING}\n *     wrapped as a SafeUrl if it does not pass.\n */\ngoog.html.SafeUrl.fromFacebookMessengerUrl = function(facebookMessengerUrl) {\n  if (!goog.string.internal.caseInsensitiveStartsWith(\n          facebookMessengerUrl, 'fb-messenger://share')) {\n    facebookMessengerUrl = goog.html.SafeUrl.INNOCUOUS_STRING;\n  }\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(\n      facebookMessengerUrl);\n};\n\n/**\n * Creates a SafeUrl wrapping a whatsapp://send URL.\n *\n * @param {string} whatsAppUrl A WhatsApp URL.\n * @return {!goog.html.SafeUrl} A matching safe URL, or {@link INNOCUOUS_STRING}\n *     wrapped as a SafeUrl if it does not pass.\n */\ngoog.html.SafeUrl.fromWhatsAppUrl = function(whatsAppUrl) {\n  if (!goog.string.internal.caseInsensitiveStartsWith(\n          whatsAppUrl, 'whatsapp://send')) {\n    whatsAppUrl = goog.html.SafeUrl.INNOCUOUS_STRING;\n  }\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(\n      whatsAppUrl);\n};\n\n/**\n * Creates a SafeUrl wrapping a sms: URL.\n *\n * @param {string} smsUrl A sms URL.\n * @return {!goog.html.SafeUrl} A matching safe URL, or {@link INNOCUOUS_STRING}\n *     wrapped as a SafeUrl if it does not pass.\n */\ngoog.html.SafeUrl.fromSmsUrl = function(smsUrl) {\n  if (!goog.string.internal.caseInsensitiveStartsWith(smsUrl, 'sms:') ||\n      !goog.html.SafeUrl.isSmsUrlBodyValid_(smsUrl)) {\n    smsUrl = goog.html.SafeUrl.INNOCUOUS_STRING;\n  }\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(\n      smsUrl);\n};\n\n\n/**\n * Validates SMS URL `body` parameter, which is optional and should appear at\n * most once and should be percent-encoded if present. Rejects many malformed\n * bodies, but may spuriously reject some URLs and does not reject all malformed\n * sms: URLs.\n *\n * @param {string} smsUrl A sms URL.\n * @return {boolean} Whether SMS URL has a valid `body` parameter if it exists.\n * @private\n */\ngoog.html.SafeUrl.isSmsUrlBodyValid_ = function(smsUrl) {\n  var hash = smsUrl.indexOf('#');\n  if (hash > 0) {\n    smsUrl = smsUrl.substring(0, hash);\n  }\n  var bodyParams = smsUrl.match(/[?&]body=/gi);\n  // \"body\" param is optional\n  if (!bodyParams) {\n    return true;\n  }\n  // \"body\" MUST only appear once\n  if (bodyParams.length > 1) {\n    return false;\n  }\n  // Get the encoded `body` parameter value.\n  var bodyValue = smsUrl.match(/[?&]body=([^&]*)/)[1];\n  if (!bodyValue) {\n    return true;\n  }\n  try {\n    decodeURIComponent(bodyValue);\n  } catch (error) {\n    return false;\n  }\n  return /^(?:[a-z0-9\\-_.~]|%[0-9a-f]{2})+$/i.test(bodyValue);\n};\n\n\n/**\n * Creates a SafeUrl wrapping a ssh: URL.\n *\n * @param {string} sshUrl A ssh URL.\n * @return {!goog.html.SafeUrl} A matching safe URL, or {@link INNOCUOUS_STRING}\n *     wrapped as a SafeUrl if it does not pass.\n */\ngoog.html.SafeUrl.fromSshUrl = function(sshUrl) {\n  if (!goog.string.internal.caseInsensitiveStartsWith(sshUrl, 'ssh://')) {\n    sshUrl = goog.html.SafeUrl.INNOCUOUS_STRING;\n  }\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(\n      sshUrl);\n};\n\n/**\n * Sanitizes a Chrome extension URL to SafeUrl, given a compile-time-constant\n * extension identifier. Can also be restricted to chrome extensions.\n *\n * @param {string} url The url to sanitize. Should start with the extension\n *     scheme and the extension identifier.\n * @param {!goog.string.Const|!Array<!goog.string.Const>} extensionId The\n *     extension id to accept, as a compile-time constant or an array of those.\n *\n * @return {!goog.html.SafeUrl} Either `url` if it's deemed safe, or\n *     `INNOCUOUS_STRING` if it's not.\n */\ngoog.html.SafeUrl.sanitizeChromeExtensionUrl = function(url, extensionId) {\n  return goog.html.SafeUrl.sanitizeExtensionUrl_(\n      /^chrome-extension:\\/\\/([^\\/]+)\\//, url, extensionId);\n};\n\n/**\n * Sanitizes a Firefox extension URL to SafeUrl, given a compile-time-constant\n * extension identifier. Can also be restricted to chrome extensions.\n *\n * @param {string} url The url to sanitize. Should start with the extension\n *     scheme and the extension identifier.\n * @param {!goog.string.Const|!Array<!goog.string.Const>} extensionId The\n *     extension id to accept, as a compile-time constant or an array of those.\n *\n * @return {!goog.html.SafeUrl} Either `url` if it's deemed safe, or\n *     `INNOCUOUS_STRING` if it's not.\n */\ngoog.html.SafeUrl.sanitizeFirefoxExtensionUrl = function(url, extensionId) {\n  return goog.html.SafeUrl.sanitizeExtensionUrl_(\n      /^moz-extension:\\/\\/([^\\/]+)\\//, url, extensionId);\n};\n\n/**\n * Sanitizes a Edge extension URL to SafeUrl, given a compile-time-constant\n * extension identifier. Can also be restricted to chrome extensions.\n *\n * @param {string} url The url to sanitize. Should start with the extension\n *     scheme and the extension identifier.\n * @param {!goog.string.Const|!Array<!goog.string.Const>} extensionId The\n *     extension id to accept, as a compile-time constant or an array of those.\n *\n * @return {!goog.html.SafeUrl} Either `url` if it's deemed safe, or\n *     `INNOCUOUS_STRING` if it's not.\n */\ngoog.html.SafeUrl.sanitizeEdgeExtensionUrl = function(url, extensionId) {\n  return goog.html.SafeUrl.sanitizeExtensionUrl_(\n      /^ms-browser-extension:\\/\\/([^\\/]+)\\//, url, extensionId);\n};\n\n/**\n * Private helper for converting extension URLs to SafeUrl, given the scheme for\n * that particular extension type. Use the sanitizeFirefoxExtensionUrl,\n * sanitizeChromeExtensionUrl or sanitizeEdgeExtensionUrl unless you're building\n * new helpers.\n *\n * @private\n * @param {!RegExp} scheme The scheme to accept as a RegExp extracting the\n *     extension identifier.\n * @param {string} url The url to sanitize. Should start with the extension\n *     scheme and the extension identifier.\n * @param {!goog.string.Const|!Array<!goog.string.Const>} extensionId The\n *     extension id to accept, as a compile-time constant or an array of those.\n *\n * @return {!goog.html.SafeUrl} Either `url` if it's deemed safe, or\n *     `INNOCUOUS_STRING` if it's not.\n */\ngoog.html.SafeUrl.sanitizeExtensionUrl_ = function(scheme, url, extensionId) {\n  var matches = scheme.exec(url);\n  if (!matches) {\n    url = goog.html.SafeUrl.INNOCUOUS_STRING;\n  } else {\n    var extractedExtensionId = matches[1];\n    var acceptedExtensionIds;\n    if (extensionId instanceof goog.string.Const) {\n      acceptedExtensionIds = [goog.string.Const.unwrap(extensionId)];\n    } else {\n      acceptedExtensionIds = extensionId.map(function unwrap(x) {\n        return goog.string.Const.unwrap(x);\n      });\n    }\n    if (acceptedExtensionIds.indexOf(extractedExtensionId) == -1) {\n      url = goog.html.SafeUrl.INNOCUOUS_STRING;\n    }\n  }\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);\n};\n\n\n/**\n * Creates a SafeUrl from TrustedResourceUrl. This is safe because\n * TrustedResourceUrl is more tightly restricted than SafeUrl.\n *\n * @param {!goog.html.TrustedResourceUrl} trustedResourceUrl\n * @return {!goog.html.SafeUrl}\n */\ngoog.html.SafeUrl.fromTrustedResourceUrl = function(trustedResourceUrl) {\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(\n      goog.html.TrustedResourceUrl.unwrap(trustedResourceUrl));\n};\n\n\n/**\n * A pattern that recognizes a commonly useful subset of URLs that satisfy\n * the SafeUrl contract.\n *\n * This regular expression matches a subset of URLs that will not cause script\n * execution if used in URL context within a HTML document. Specifically, this\n * regular expression matches if (comment from here on and regex copied from\n * Soy's EscapingConventions):\n * (1) Either a protocol in a whitelist (http, https, mailto or ftp).\n * (2) or no protocol.  A protocol must be followed by a colon. The below\n *     allows that by allowing colons only after one of the characters [/?#].\n *     A colon after a hash (#) must be in the fragment.\n *     Otherwise, a colon after a (?) must be in a query.\n *     Otherwise, a colon after a single solidus (/) must be in a path.\n *     Otherwise, a colon after a double solidus (//) must be in the authority\n *     (before port).\n *\n * @private\n * @const {!RegExp}\n */\ngoog.html.SAFE_URL_PATTERN_ =\n    /^(?:(?:https?|mailto|ftp):|[^:/?#]*(?:[/?#]|$))/i;\n\n/**\n * Public version of goog.html.SAFE_URL_PATTERN_. Updating\n * goog.html.SAFE_URL_PATTERN_ doesn't seem to be backward compatible.\n * Namespace is also changed to goog.html.SafeUrl so it can be imported using\n * goog.require('goog.dom.SafeUrl').\n *\n * TODO(bangert): Remove SAFE_URL_PATTERN_\n * @const {!RegExp}\n */\ngoog.html.SafeUrl.SAFE_URL_PATTERN = goog.html.SAFE_URL_PATTERN_;\n\n\n/**\n * Creates a SafeUrl object from `url`. If `url` is a\n * goog.html.SafeUrl then it is simply returned. Otherwise the input string is\n * validated to match a pattern of commonly used safe URLs.\n *\n * `url` may be a URL with the http, https, mailto or ftp scheme,\n * or a relative URL (i.e., a URL without a scheme; specifically, a\n * scheme-relative, absolute-path-relative, or path-relative URL).\n *\n * @see http://url.spec.whatwg.org/#concept-relative-url\n * @param {string|!goog.string.TypedString} url The URL to validate.\n * @return {!goog.html.SafeUrl} The validated URL, wrapped as a SafeUrl.\n */\ngoog.html.SafeUrl.sanitize = function(url) {\n  if (url instanceof goog.html.SafeUrl) {\n    return url;\n  } else if (typeof url == 'object' && url.implementsGoogStringTypedString) {\n    url = /** @type {!goog.string.TypedString} */ (url).getTypedStringValue();\n  } else {\n    url = String(url);\n  }\n  if (!goog.html.SAFE_URL_PATTERN_.test(url)) {\n    url = goog.html.SafeUrl.INNOCUOUS_STRING;\n  }\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);\n};\n\n/**\n * Creates a SafeUrl object from `url`. If `url` is a\n * goog.html.SafeUrl then it is simply returned. Otherwise the input string is\n * validated to match a pattern of commonly used safe URLs.\n *\n * `url` may be a URL with the http, https, mailto or ftp scheme,\n * or a relative URL (i.e., a URL without a scheme; specifically, a\n * scheme-relative, absolute-path-relative, or path-relative URL).\n *\n * This function asserts (using goog.asserts) that the URL matches this pattern.\n * If it does not, in addition to failing the assert, an innocous URL will be\n * returned.\n *\n * @see http://url.spec.whatwg.org/#concept-relative-url\n * @param {string|!goog.string.TypedString} url The URL to validate.\n * @param {boolean=} opt_allowDataUrl Whether to allow valid data: URLs.\n * @return {!goog.html.SafeUrl} The validated URL, wrapped as a SafeUrl.\n */\ngoog.html.SafeUrl.sanitizeAssertUnchanged = function(url, opt_allowDataUrl) {\n  if (url instanceof goog.html.SafeUrl) {\n    return url;\n  } else if (typeof url == 'object' && url.implementsGoogStringTypedString) {\n    url = /** @type {!goog.string.TypedString} */ (url).getTypedStringValue();\n  } else {\n    url = String(url);\n  }\n  if (opt_allowDataUrl && /^data:/i.test(url)) {\n    var safeUrl = goog.html.SafeUrl.fromDataUrl(url);\n    if (safeUrl.getTypedStringValue() == url) {\n      return safeUrl;\n    }\n  }\n  if (!goog.asserts.assert(\n          goog.html.SAFE_URL_PATTERN_.test(url),\n          '%s does not match the safe URL pattern', url)) {\n    url = goog.html.SafeUrl.INNOCUOUS_STRING;\n  }\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);\n};\n\n\n\n/**\n * Type marker for the SafeUrl type, used to implement additional run-time\n * type checking.\n * @const {!Object}\n * @private\n */\ngoog.html.SafeUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};\n\n\n/**\n * Package-internal utility method to create SafeUrl instances.\n *\n * @param {string} url The string to initialize the SafeUrl object with.\n * @return {!goog.html.SafeUrl} The initialized SafeUrl object.\n * @package\n */\ngoog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse = function(\n    url) {\n  return new goog.html.SafeUrl(\n      goog.html.SafeUrl.CONSTRUCTOR_TOKEN_PRIVATE_, url);\n};\n\n\n/**\n * A SafeUrl corresponding to the special about:blank url.\n * @const {!goog.html.SafeUrl}\n */\ngoog.html.SafeUrl.ABOUT_BLANK =\n    goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(\n        'about:blank');\n\n/**\n * Token used to ensure that object is created only from this file. No code\n * outside of this file can access this token.\n * @private {!Object}\n * @const\n */\ngoog.html.SafeUrl.CONSTRUCTOR_TOKEN_PRIVATE_ = {};\n","^;",1579837703000,"^<",["^=",["^1L","^4C","^B7","^?","^3Q","^6G","~$goog.fs.url","^4G","~$goog.i18n.bidi.DirectionalString"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/safeurl.js"],"^O",["^=",["^4D"]],"^W",true,"^X",["^?","^1L","^B@","^4C","^6G","^BA","^3Q","^B7","^4G"]],["^ ","^3",[1579837703000],"^4","goog.storage.mechanism.mechanism.js","^5",["^6","goog/storage/mechanism/mechanism.js"],"^7","goog/storage/mechanism/mechanism.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Abstract interface for storing and retrieving data using\n * some persistence mechanism.\n *\n */\n\ngoog.provide('goog.storage.mechanism.Mechanism');\n\n\n\n/**\n * Basic interface for all storage mechanisms.\n *\n * @constructor\n * @struct\n */\ngoog.storage.mechanism.Mechanism = function() {};\n\n\n/**\n * Set a value for a key.\n *\n * @param {string} key The key to set.\n * @param {string} value The string to save.\n */\ngoog.storage.mechanism.Mechanism.prototype.set = goog.abstractMethod;\n\n\n/**\n * Get the value stored under a key.\n *\n * @param {string} key The key to get.\n * @return {?string} The corresponding value, null if not found.\n */\ngoog.storage.mechanism.Mechanism.prototype.get = goog.abstractMethod;\n\n\n/**\n * Remove a key and its value.\n *\n * @param {string} key The key to remove.\n */\ngoog.storage.mechanism.Mechanism.prototype.remove = goog.abstractMethod;\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/mechanism/mechanism.js"],"^O",["^=",["~$goog.storage.mechanism.Mechanism"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.editor.plugin_impl.js","^5",["^6","goog/editor/plugin_impl.js"],"^7","goog/editor/plugin_impl.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved.\n\n/**\n * @fileoverview Abstract API for TrogEdit plugins.\n *\n * @see ../demos/editor/editor.html\n */\n\ngoog.provide('goog.editor.PluginImpl');\n\ngoog.forwardDeclare('goog.editor.Field');\n// TODO(user): Remove the dependency on goog.editor.Command asap. Currently only\n// needed for execCommand issues with links.\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.functions');\ngoog.require('goog.log');\ngoog.require('goog.object');\ngoog.require('goog.reflect');\ngoog.require('goog.userAgent');\n\n/**\n * Abstract API for trogedit plugins.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @package\n */\ngoog.editor.PluginImpl = function() {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * Whether this plugin is enabled for the registered field object.\n   * @type {boolean}\n   * @private\n   */\n  this.enabled_ = this.activeOnUneditableFields();\n\n  /**\n   * The field object this plugin is attached to.\n   * @type {?goog.editor.Field}\n   * @protected\n   * @deprecated Use goog.editor.PluginImpl.getFieldObject and\n   *     goog.editor.PluginImpl.setFieldObject.\n   */\n  this.fieldObject = null;\n\n  /**\n   * Indicates if this plugin should be automatically disposed when the\n   * registered field is disposed. This should be changed to false for\n   * plugins used as multi-field plugins.\n   * @type {boolean}\n   * @private\n   */\n  this.autoDispose_ = true;\n\n  /**\n   * The logger for this plugin.\n   * @type {?goog.log.Logger}\n   * @protected\n   */\n  this.logger = goog.log.getLogger('goog.editor.Plugin');\n};\ngoog.inherits(goog.editor.PluginImpl, goog.events.EventTarget);\n\n\n/**\n * @return {goog.dom.DomHelper?} The dom helper object associated with the\n *     currently active field.\n */\ngoog.editor.PluginImpl.prototype.getFieldDomHelper = function() {\n  return this.getFieldObject() && this.getFieldObject().getEditableDomHelper();\n};\n\n\n/**\n * Sets the field object for use with this plugin.\n * @return {goog.editor.Field} The editable field object.\n * @protected\n * @suppress {deprecated} Until fieldObject can be made private.\n */\ngoog.editor.PluginImpl.prototype.getFieldObject = function() {\n  return this.fieldObject;\n};\n\n\n/**\n * Sets the field object for use with this plugin.\n * @param {goog.editor.Field} fieldObject The editable field object.\n * @protected\n * @suppress {deprecated} Until fieldObject can be made private.\n */\ngoog.editor.PluginImpl.prototype.setFieldObject = function(fieldObject) {\n  this.fieldObject = fieldObject;\n};\n\n\n/**\n * Registers the field object for use with this plugin.\n * @param {goog.editor.Field} fieldObject The editable field object.\n */\ngoog.editor.PluginImpl.prototype.registerFieldObject = function(fieldObject) {\n  this.setFieldObject(fieldObject);\n};\n\n\n/**\n * Unregisters and disables this plugin for the current field object.\n * @param {goog.editor.Field} fieldObj The field object. For single-field\n *     plugins, this parameter is ignored.\n */\ngoog.editor.PluginImpl.prototype.unregisterFieldObject = function(fieldObj) {\n  if (this.getFieldObject()) {\n    this.disable(this.getFieldObject());\n    this.setFieldObject(null);\n  }\n};\n\n\n/**\n * Enables this plugin for the specified, registered field object. A field\n * object should only be enabled when it is loaded.\n * @param {goog.editor.Field} fieldObject The field object.\n */\ngoog.editor.PluginImpl.prototype.enable = function(fieldObject) {\n  if (this.getFieldObject() == fieldObject) {\n    this.enabled_ = true;\n  } else {\n    goog.log.error(\n        this.logger, 'Trying to enable an unregistered field with ' +\n            'this plugin.');\n  }\n};\n\n\n/**\n * Disables this plugin for the specified, registered field object.\n * @param {goog.editor.Field} fieldObject The field object.\n */\ngoog.editor.PluginImpl.prototype.disable = function(fieldObject) {\n  if (this.getFieldObject() == fieldObject) {\n    this.enabled_ = false;\n  } else {\n    goog.log.error(\n        this.logger, 'Trying to disable an unregistered field ' +\n            'with this plugin.');\n  }\n};\n\n\n/**\n * Returns whether this plugin is enabled for the field object.\n *\n * @param {goog.editor.Field} fieldObject The field object.\n * @return {boolean} Whether this plugin is enabled for the field object.\n */\ngoog.editor.PluginImpl.prototype.isEnabled = function(fieldObject) {\n  return this.getFieldObject() == fieldObject ? this.enabled_ : false;\n};\n\n\n/**\n * Set if this plugin should automatically be disposed when the registered\n * field is disposed.\n * @param {boolean} autoDispose Whether to autoDispose.\n */\ngoog.editor.PluginImpl.prototype.setAutoDispose = function(autoDispose) {\n  this.autoDispose_ = autoDispose;\n};\n\n\n/**\n * @return {boolean} Whether or not this plugin should automatically be disposed\n *     when it's registered field is disposed.\n */\ngoog.editor.PluginImpl.prototype.isAutoDispose = function() {\n  return this.autoDispose_;\n};\n\n\n/**\n * @return {boolean} If true, field will not disable the command\n *     when the field becomes uneditable.\n */\ngoog.editor.PluginImpl.prototype.activeOnUneditableFields =\n    goog.functions.FALSE;\n\n\n/**\n * @param {string} command The command to check.\n * @return {boolean} If true, field will not dispatch change events\n *     for commands of this type. This is useful for \"seamless\" plugins like\n *     dialogs and lorem ipsum.\n */\ngoog.editor.PluginImpl.prototype.isSilentCommand = goog.functions.FALSE;\n\n\n/** @override */\ngoog.editor.PluginImpl.prototype.disposeInternal = function() {\n  if (this.getFieldObject()) {\n    this.unregisterFieldObject(this.getFieldObject());\n  }\n\n  goog.editor.PluginImpl.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * @return {string} The ID unique to this plugin class. Note that different\n *     instances off the plugin share the same classId.\n */\ngoog.editor.PluginImpl.prototype.getTrogClassId;\n\n\n/**\n * An enum of operations that plugins may support.\n * @enum {number}\n */\ngoog.editor.PluginImpl.Op = {\n  KEYDOWN: 1,\n  KEYPRESS: 2,\n  KEYUP: 3,\n  SELECTION: 4,\n  SHORTCUT: 5,\n  EXEC_COMMAND: 6,\n  QUERY_COMMAND: 7,\n  PREPARE_CONTENTS_HTML: 8,\n  CLEAN_CONTENTS_HTML: 10,\n  CLEAN_CONTENTS_DOM: 11\n};\n\n\n/**\n * A map from plugin operations to the names of the methods that\n * invoke those operations.\n */\ngoog.editor.PluginImpl.OPCODE =\n    goog.object.transpose(goog.reflect.object(goog.editor.PluginImpl, {\n      handleKeyDown: goog.editor.PluginImpl.Op.KEYDOWN,\n      handleKeyPress: goog.editor.PluginImpl.Op.KEYPRESS,\n      handleKeyUp: goog.editor.PluginImpl.Op.KEYUP,\n      handleSelectionChange: goog.editor.PluginImpl.Op.SELECTION,\n      handleKeyboardShortcut: goog.editor.PluginImpl.Op.SHORTCUT,\n      execCommand: goog.editor.PluginImpl.Op.EXEC_COMMAND,\n      queryCommandValue: goog.editor.PluginImpl.Op.QUERY_COMMAND,\n      prepareContentsHtml: goog.editor.PluginImpl.Op.PREPARE_CONTENTS_HTML,\n      cleanContentsHtml: goog.editor.PluginImpl.Op.CLEAN_CONTENTS_HTML,\n      cleanContentsDom: goog.editor.PluginImpl.Op.CLEAN_CONTENTS_DOM\n    }));\n\n\n/**\n * A set of op codes that run even on disabled plugins.\n */\ngoog.editor.PluginImpl.IRREPRESSIBLE_OPS = goog.object.createSet(\n    goog.editor.PluginImpl.Op.PREPARE_CONTENTS_HTML,\n    goog.editor.PluginImpl.Op.CLEAN_CONTENTS_HTML,\n    goog.editor.PluginImpl.Op.CLEAN_CONTENTS_DOM);\n\n\n/**\n * Handles keydown. It is run before handleKeyboardShortcut and if it returns\n * true handleKeyboardShortcut will not be called.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @return {boolean} Whether the event was handled and thus should *not* be\n *     propagated to other plugins or handleKeyboardShortcut.\n */\ngoog.editor.PluginImpl.prototype.handleKeyDown;\n\n\n/**\n * Handles keypress. It is run before handleKeyboardShortcut and if it returns\n * true handleKeyboardShortcut will not be called.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @return {boolean} Whether the event was handled and thus should *not* be\n *     propagated to other plugins or handleKeyboardShortcut.\n */\ngoog.editor.PluginImpl.prototype.handleKeyPress;\n\n\n/**\n * Handles keyup.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @return {boolean} Whether the event was handled and thus should *not* be\n *     propagated to other plugins.\n */\ngoog.editor.PluginImpl.prototype.handleKeyUp;\n\n\n/**\n * Handles selection change.\n * @param {!goog.events.BrowserEvent=} opt_e The browser event.\n * @param {!Node=} opt_target The node the selection changed to.\n * @return {boolean} Whether the event was handled and thus should *not* be\n *     propagated to other plugins.\n */\ngoog.editor.PluginImpl.prototype.handleSelectionChange;\n\n\n/**\n * Handles keyboard shortcuts.  Preferred to using handleKey* as it will use\n * the proper event based on browser and will be more performant. If\n * handleKeyPress/handleKeyDown returns true, this will not be called. If the\n * plugin handles the shortcut, it is responsible for dispatching appropriate\n * events (change, selection change at the time of this comment). If the plugin\n * calls execCommand on the editable field, then execCommand already takes care\n * of dispatching events.\n * NOTE: For performance reasons this is only called when any key is pressed\n * in conjunction with ctrl/meta keys OR when a small subset of keys (defined\n * in goog.editor.Field.POTENTIAL_SHORTCUT_KEYCODES_) are pressed without\n * ctrl/meta keys. We specifically don't invoke it when altKey is pressed since\n * alt key is used in many i18n UIs to enter certain characters.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @param {string} key The key pressed.\n * @param {boolean} isModifierPressed Whether the ctrl/meta key was pressed or\n *     not.\n * @return {boolean} Whether the event was handled and thus should *not* be\n *     propagated to other plugins. We also call preventDefault on the event if\n *     the return value is true.\n */\ngoog.editor.PluginImpl.prototype.handleKeyboardShortcut;\n\n\n/**\n * Handles execCommand. This default implementation handles dispatching\n * BEFORECHANGE, CHANGE, and SELECTIONCHANGE events, and calls\n * execCommandInternal to perform the actual command. Plugins that want to\n * do their own event dispatching should override execCommand, otherwise\n * it is preferred to only override execCommandInternal.\n *\n * This version of execCommand will only work for single field plugins.\n * Multi-field plugins must override execCommand.\n *\n * @param {string} command The command to execute.\n * @param {...?} var_args Any additional parameters needed to\n *     execute the command.\n * @return {*} The result of the execCommand, if any.\n */\ngoog.editor.PluginImpl.prototype.execCommand = function(command, var_args) {\n  // TODO(user): Replace all uses of isSilentCommand with plugins that just\n  // override this base execCommand method.\n  var silent = this.isSilentCommand(command);\n  if (!silent) {\n    // Stop listening to mutation events in Firefox while text formatting\n    // is happening.  This prevents us from trying to size the field in the\n    // middle of an execCommand, catching the field in a strange intermediary\n    // state where both replacement nodes and original nodes are appended to\n    // the dom.  Note that change events get turned back on by\n    // fieldObj.dispatchChange.\n    if (goog.userAgent.GECKO) {\n      this.getFieldObject().stopChangeEvents(true, true);\n    }\n\n    this.getFieldObject().dispatchBeforeChange();\n  }\n\n  try {\n    var result = this.execCommandInternal.apply(this, arguments);\n  } finally {\n    // If the above execCommandInternal call throws an exception, we still need\n    // to turn change events back on (see http://b/issue?id=1471355).\n    // NOTE: If if you add to or change the methods called in this finally\n    // block, please add them as expected calls to the unit test function\n    // testExecCommandException().\n    if (!silent) {\n      // dispatchChange includes a call to startChangeEvents, which unwinds the\n      // call to stopChangeEvents made before the try block.\n      this.getFieldObject().dispatchChange();\n      this.getFieldObject().dispatchSelectionChangeEvent();\n    }\n  }\n\n  return result;\n};\n\n\n/**\n * Handles execCommand. This default implementation does nothing, and is\n * called by execCommand, which handles event dispatching. This method should\n * be overriden by plugins that don't need to do their own event dispatching.\n * If custom event dispatching is needed, execCommand shoul be overriden\n * instead.\n *\n * TODO(b/111035839): This pattern makes accurate typing impossible.\n *\n * @param {?} command `extends string` The command to execute.\n * @param {...?} var_args Any additional parameters needed to\n *     execute the command.\n * @return {*} The result of the execCommand, if any.\n * @protected\n */\ngoog.editor.PluginImpl.prototype.execCommandInternal;\n\n\n/**\n * Gets the state of this command if this plugin serves that command.\n * @param {string} command The command to check.\n * @return {*} The value of the command.\n */\ngoog.editor.PluginImpl.prototype.queryCommandValue;\n\n\n/**\n * Prepares the given HTML for editing. Strips out content that should not\n * appear in an editor, and normalizes content as appropriate. The inverse\n * of cleanContentsHtml.\n *\n * This op is invoked even on disabled plugins.\n *\n * @param {string} originalHtml The original HTML.\n * @param {Object} styles A map of strings. If the plugin wants to add\n *     any styles to the field element, it should add them as key-value\n *     pairs to this object.\n * @return {string} New HTML that's ok for editing.\n */\ngoog.editor.PluginImpl.prototype.prepareContentsHtml;\n\n\n/**\n * Cleans the contents of the node passed to it. The node contents are modified\n * directly, and the modifications will subsequently be used, for operations\n * such as saving the innerHTML of the editor etc. Since the plugins act on\n * the DOM directly, this method can be very expensive.\n *\n * This op is invoked even on disabled plugins.\n *\n * @param {!Element} fieldCopy The copy of the editable field which\n *     needs to be cleaned up.\n */\ngoog.editor.PluginImpl.prototype.cleanContentsDom;\n\n\n/**\n * Cleans the html contents of Trogedit. Both cleanContentsDom and\n * and cleanContentsHtml will be called on contents extracted from Trogedit.\n * The inverse of prepareContentsHtml.\n *\n * This op is invoked even on disabled plugins.\n *\n * @param {string} originalHtml The trogedit HTML.\n * @return {string} Cleaned-up HTML.\n */\ngoog.editor.PluginImpl.prototype.cleanContentsHtml;\n\n\n/**\n * Whether the string corresponds to a command this plugin handles.\n * @param {string} command Command string to check.\n * @return {boolean} Whether the plugin handles this type of command.\n */\ngoog.editor.PluginImpl.prototype.isSupportedCommand = function(command) {\n  return false;\n};\n\n\n/**\n * Saves the field's scroll position.  See b/7279077 for context.\n * Currently only does anything in Edge, since all other browsers\n * already seem to work correctly.\n * @return {function()} A function to restore the current scroll position.\n * @protected\n */\ngoog.editor.PluginImpl.prototype.saveScrollPosition = function() {\n  if (this.getFieldObject() && goog.userAgent.EDGE) {\n    var win = this.getFieldObject().getEditableDomHelper().getWindow();\n    return win.scrollTo.bind(win, win.scrollX, win.scrollY);\n  }\n  return function() {};\n};\n","^;",1579837703000,"^<",["^=",["^Y","^8;","^?","^42","^3W","^[","^18"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugin_impl.js"],"^O",["^=",["~$goog.editor.PluginImpl"]],"^W",true,"^X",["^?","^3W","^Y","^18","^42","^8;","^["]],["^ ","^3",[1579837703000],"^4","goog.i18n.currency.js","^5",["^6","goog/i18n/currency.js"],"^7","goog/i18n/currency.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A utility to get better currency format pattern.\n *\n * This module implements a new currency format representation model. It\n * provides 3 currency representation forms: global, portable and local. Local\n * format is the most popular format people use to represent currency in its\n * circulating country without worrying about how it should be distinguished\n * from other currencies.  Global format is a formal representation in context\n * of multiple currencies in same page, it is ISO 4217 currency code. Portable\n * format is a compromise between global and local. It looks similar to how\n * people would like to see how their currency is being represented in other\n * media. While at the same time, it should be distinguishable to world's\n * popular currencies (like USD, EUR) and currencies somewhat relevant in the\n * area (like CNY in HK, though native currency is HKD). There is no guarantee\n * of uniqueness.\n *\n */\n\n\ngoog.provide('goog.i18n.currency');\ngoog.provide('goog.i18n.currency.CurrencyInfo');\ngoog.provide('goog.i18n.currency.CurrencyInfoTier2');\n\n\n/**\n * The mask of precision field.\n * @private\n */\ngoog.i18n.currency.PRECISION_MASK_ = 0x07;\n\n\n/**\n * Whether the currency sign should be positioned after the number.\n * @private\n */\ngoog.i18n.currency.POSITION_FLAG_ = 0x10;\n\n\n/**\n * Whether a space should be inserted between the number and currency sign.\n * @private\n */\ngoog.i18n.currency.SPACE_FLAG_ = 0x20;\n\n\n/**\n * Whether tier2 was enabled already by calling addTier2Support().\n * @private\n */\ngoog.i18n.currency.tier2Enabled_ = false;\n\n\n/**\n * Tests if currency is available.\n *\n * Note: If the currency is not available it might be in the tier2 currency set:\n * {@link goog.i18n.currency.CurrencyInfoTier2}. If that is the case call\n * {@link goog.i18n.currency.addTier2Support} before calling any other function\n * in this namespace.\n *\n * @param {string} currencyCode Currency code to tested.\n * @return {boolean} If the currency is available.\n */\ngoog.i18n.currency.isAvailable = function(currencyCode) {\n  return currencyCode in goog.i18n.currency.CurrencyInfo;\n};\n\n/**\n * This function will add tier2 currency support. Be default, only tier1\n * (most popular currencies) are supported. If an application really needs\n * to support some of the rarely used currencies, it should call this function\n * before any other functions in this namespace.\n */\ngoog.i18n.currency.addTier2Support = function() {\n  // Protection from executing this these again and again.\n  if (!goog.i18n.currency.tier2Enabled_) {\n    for (const key in goog.i18n.currency.CurrencyInfoTier2) {\n      goog.i18n.currency.CurrencyInfo[key] =\n          goog.i18n.currency.CurrencyInfoTier2[key];\n    }\n    goog.i18n.currency.tier2Enabled_ = true;\n  }\n};\n\n\n/**\n * Deprecated.\n * Global currency pattern always uses ISO-4217 currency code as prefix. Local\n * currency sign is added if it is different from currency code. Each currency\n * is unique in this form. The negative side is that ISO code looks weird in\n * some countries as people normally do not use it. Local currency sign\n * alleviates the problem, but also makes it a little verbose.\n *\n * @param {string} currencyCode ISO-4217 3-letter currency code.\n * @return {string} Global currency pattern string for given currency.\n * @deprecated Format numbers using {@link goog.i18n.NumberFormat} with\n *   {@link goog.i18n.NumberFormat.Format.CURRENCY} and\n *   {@link goog.i18n.NumberFormat.CurrencyStyle.GLOBAL}\n */\ngoog.i18n.currency.getGlobalCurrencyPattern = function(currencyCode) {\n  const info = goog.i18n.currency.CurrencyInfo[currencyCode];\n  const patternNum = info[0];\n  if (currencyCode == info[1]) {\n    return goog.i18n.currency.getCurrencyPattern_(patternNum, info[1]);\n  }\n  return currencyCode + ' ' +\n      goog.i18n.currency.getCurrencyPattern_(patternNum, info[1]);\n};\n\n\n/**\n * Return global currency sign string for those applications\n * that want to handle currency sign themselves.\n *\n * @param {string} currencyCode ISO-4217 3-letter currency code.\n * @return {string} Global currency sign for given currency.\n */\ngoog.i18n.currency.getGlobalCurrencySign = function(currencyCode) {\n  const info = goog.i18n.currency.CurrencyInfo[currencyCode];\n  return (currencyCode == info[1]) ? currencyCode :\n                                     currencyCode + ' ' + info[1];\n};\n\n\n/**\n * Return global currency sign string for those applications\n * that want to handle currency sign themselves.\n *\n * This function does not throw an exception if there is no data for the\n * currency. Instead, it falls back to the ISO code.\n *\n * @param {string} currencyCode ISO-4217 3-letter currency code.\n * @return {string} Global currency sign for given currency.\n */\ngoog.i18n.currency.getGlobalCurrencySignWithFallback = function(currencyCode) {\n  var info = goog.i18n.currency.CurrencyInfo[currencyCode];\n  if (!info) {\n    return currencyCode;\n  }\n  return (currencyCode == info[1]) ? currencyCode :\n                                     currencyCode + ' ' + info[1];\n};\n\n\n/**\n * Deprecated.\n * Local currency pattern is the most frequently used pattern in currency's\n * native region. It does not care about how it is distinguished from other\n * currencies.\n *\n * @param {string} currencyCode ISO-4217 3-letter currency code.\n * @return {string} Local currency pattern string for given currency.\n * @deprecated Format numbers using {@link goog.i18n.NumberFormat} with\n *   {@link goog.i18n.NumberFormat.Format.CURRENCY} and\n *   {@link goog.i18n.NumberFormat.CurrencyStyle.LOCAL}\n */\ngoog.i18n.currency.getLocalCurrencyPattern = function(currencyCode) {\n  const info = goog.i18n.currency.CurrencyInfo[currencyCode];\n  return goog.i18n.currency.getCurrencyPattern_(info[0], info[1]);\n};\n\n\n/**\n * Returns local currency sign string for those applications that need to\n * handle currency sign separately.\n *\n * @param {string} currencyCode ISO-4217 3-letter currency code.\n * @return {string} Local currency sign for given currency.\n */\ngoog.i18n.currency.getLocalCurrencySign = function(currencyCode) {\n  return goog.i18n.currency.CurrencyInfo[currencyCode][1];\n};\n\n\n/**\n * Returns local currency sign string for those applications that need to\n * handle currency sign separately.\n *\n * This function does not throw an exception if there is no data for the\n * currency. Instead, it falls back to the ISO code.\n *\n * @param {string} currencyCode ISO-4217 3-letter currency code.\n * @return {string} Local currency sign for given currency.\n */\ngoog.i18n.currency.getLocalCurrencySignWithFallback = function(currencyCode) {\n  if (currencyCode in goog.i18n.currency.CurrencyInfo) {\n    return goog.i18n.currency.CurrencyInfo[currencyCode][1];\n  } else {\n    return currencyCode;\n  }\n};\n\n\n/**\n * Deprecated.\n * Portable currency pattern is a compromise between local and global. It is\n * not a mere blend or mid-way between the two. Currency sign is chosen so that\n * it looks familiar to native users. It also has enough information to\n * distinguish itself from other popular currencies in its native region.\n * In this pattern, currency sign symbols that has availability problem in\n * popular fonts are also avoided.\n *\n * @param {string} currencyCode ISO-4217 3-letter currency code.\n * @return {string} Portable currency pattern string for given currency.\n * @deprecated Format numbers using {@link goog.i18n.NumberFormat} with\n *   {@link goog.i18n.NumberFormat.Format.CURRENCY} and\n *   {@link goog.i18n.NumberFormat.CurrencyStyle.PORTABLE}\n */\ngoog.i18n.currency.getPortableCurrencyPattern = function(currencyCode) {\n  const info = goog.i18n.currency.CurrencyInfo[currencyCode];\n  return goog.i18n.currency.getCurrencyPattern_(info[0], info[2]);\n};\n\n\n/**\n * Return portable currency sign string for those applications that need to\n * handle currency sign themselves.\n *\n * @param {string} currencyCode ISO-4217 3-letter currency code.\n * @return {string} Portable currency sign for given currency.\n */\ngoog.i18n.currency.getPortableCurrencySign = function(currencyCode) {\n  return goog.i18n.currency.CurrencyInfo[currencyCode][2];\n};\n\n\n/**\n * Returns whether the string represents a valid ISO-4217 currency code.\n *\n * @param {string} currencyCode String to check.\n * @return {boolean} Whether currencyCode is a 3-letter currency code.\n */\ngoog.i18n.currency.isValid = function(currencyCode) {\n  if (!currencyCode || currencyCode.length !== 3) {\n    return false;\n  }\n  for (let i = 0; i < 3; i++) {\n    const c = currencyCode[i];\n    if (c < 'A' || (c > 'Z' && c < 'a') || c > 'z') {\n      return false;\n    }\n  }\n  return true;\n};\n\n\n/**\n * Return portable currency sign string for those applications that need to\n * handle currency sign themselves.\n *\n * This function does not throw an exception if there is no data for the\n * currency. Instead, it falls back to the ISO code.\n *\n * @param {string} currencyCode ISO-4217 3-letter currency code.\n * @return {string} Portable currency sign for given currency.\n */\ngoog.i18n.currency.getPortableCurrencySignWithFallback = function(\n    currencyCode) {\n  if (currencyCode in goog.i18n.currency.CurrencyInfo) {\n    return goog.i18n.currency.CurrencyInfo[currencyCode][2];\n  } else {\n    return currencyCode;\n  }\n};\n\n\n/**\n * This function returns the default currency sign's position. Some applications\n * may want to handle currency sign and currency amount separately. This\n * function can be used in such situations to correctly position the currency\n * sign relative to the amount.\n *\n * Use {@link goog.i18n.NumberFormat#isCurrencyCodeBeforeValue} for a locale\n * aware version of this API (recommended). isPrefixSignPosition() returns the\n * default currency sign's position in the currency's default locale (e.g. 'en'\n * for 'USD'), but most commonly the position is needed for the locale in which\n * the number is going to be displayed. For example, in 'fr' 10.10 USD would be\n * displayed as '10,10 $'.\n *\n * @param {string} currencyCode ISO-4217 3-letter currency code.\n * @return {boolean} true if currency should be positioned before amount field.\n */\ngoog.i18n.currency.isPrefixSignPosition = function(currencyCode) {\n  return (goog.i18n.currency.CurrencyInfo[currencyCode][0] &\n          goog.i18n.currency.POSITION_FLAG_) == 0;\n};\n\n\n/**\n * This function constructs the currency pattern. Currency sign is provided. The\n * pattern information is encoded in patternNum.\n *\n * @param {number} patternNum Encoded pattern number that has\n *     currency pattern information.\n * @param {string} sign The currency sign that will be used in pattern.\n * @return {string} currency pattern string.\n * @private\n */\ngoog.i18n.currency.getCurrencyPattern_ = function(patternNum, sign) {\n  const strParts = ['#,##0'];\n  const precision = patternNum & goog.i18n.currency.PRECISION_MASK_;\n  if (precision > 0) {\n    strParts.push('.');\n    for (let i = 0; i < precision; i++) {\n      strParts.push('0');\n    }\n  }\n  if ((patternNum & goog.i18n.currency.POSITION_FLAG_) == 0) {\n    strParts.unshift(\n        (patternNum & goog.i18n.currency.SPACE_FLAG_) ? \"' \" : \"'\");\n    strParts.unshift(sign);\n    strParts.unshift(\"'\");\n  } else {\n    strParts.push(\n        (patternNum & goog.i18n.currency.SPACE_FLAG_) ? \" '\" : \"'\", sign, \"'\");\n  }\n  return strParts.join('');\n};\n\n\n/**\n * Modify currency pattern string by adjusting precision for given currency.\n * Standard currency pattern will have 2 digit after decimal point.\n * Examples:\n *   $#,##0.00 ->  $#,##0    (precision == 0)\n *   $#,##0.00 ->  $#,##0.0  (precision == 1)\n *   $#,##0.00 ->  $#,##0.000  (precision == 3)\n *\n * @param {string} pattern currency pattern string.\n * @param {string} currencyCode 3-letter currency code.\n * @return {string} modified currency pattern string.\n */\ngoog.i18n.currency.adjustPrecision = function(pattern, currencyCode) {\n  const strParts = ['0'];\n  const info = goog.i18n.currency.CurrencyInfo[currencyCode];\n  if (!info) {\n    // If the currency code is unknown, do not modify the pattern.\n    return pattern;\n  }\n  const precision = info[0] & goog.i18n.currency.PRECISION_MASK_;\n  if (precision > 0) {\n    strParts.push('.');\n    for (let i = 0; i < precision; i++) {\n      strParts.push('0');\n    }\n  }\n  return pattern.replace(/0.00/g, strParts.join(''));\n};\n\n\n/**\n * Tier 1 currency information.\n *\n * Format of the info array:\n *     0. {number} the sum of \"decimal precision\", the \"space\" bit, and the\n *        \"currency sign last\" bit.\n *     1. {string} The global currency sign. See `getGlobalCurrencySign`.\n *     2. {string} The portable currency sign. See `getPortableCurrencySign`.\n *\n * \"Decimal precision\" is an integer [0..7]; the count of digits to display past\n * the decimal point.\n *\n * \"Space\" bit mask = 32; whether a space should be inserted between the\n * currency sign and number.\n *\n * \"Currency sign last\" bit mask = 16; whether the currency sign should be\n * positioned after the number.\n *\n * Examples for info[0]:\n *     0: no precision (0), currency sign first (0), no space (0)\n *     2: two decimals precision (2), currency sign first (0), no space (0)\n *     18: two decimals precision (2), currency sign last (16), no space (0)\n *     50: two decimals precision (2), currency sign last (16), space (32)\n *\n * It's not recommended to read this data directly. Format numbers using\n * {@link goog.i18n.NumberFormat} with\n * {@link goog.i18n.NumberFormat.Format.CURRENCY} instead.\n *\n * @const {!Object<!Array<?>>}\n */\ngoog.i18n.currency.CurrencyInfo = {\n  'AED': [2, 'dh', '\\u062f.\\u0625.'],\n  'ALL': [0, 'Lek', 'Lek'],\n  'AUD': [2, '$', 'AU$'],\n  'BDT': [2, '\\u09F3', 'Tk'],\n  'BGN': [2, 'lev', 'lev'],\n  'BRL': [2, 'R$', 'R$'],\n  'CAD': [2, '$', 'C$'],\n  'CDF': [2, 'FrCD', 'CDF'],\n  'CHF': [2, 'CHF', 'CHF'],\n  'CLP': [0, '$', 'CL$'],\n  'CNY': [2, '¥', 'RMB¥'],\n  'COP': [32, '$', 'COL$'],\n  'CRC': [0, '\\u20a1', 'CR\\u20a1'],\n  'CZK': [50, 'K\\u010d', 'K\\u010d'],\n  'DKK': [50, 'kr.', 'kr.'],\n  'DOP': [2, 'RD$', 'RD$'],\n  'EGP': [2, '£', 'LE'],\n  'ETB': [2, 'Birr', 'Birr'],\n  'EUR': [2, '€', '€'],\n  'GBP': [2, '£', 'GB£'],\n  'HKD': [2, '$', 'HK$'],\n  'HRK': [2, 'kn', 'kn'],\n  'HUF': [34, 'Ft', 'Ft'],\n  'IDR': [0, 'Rp', 'Rp'],\n  'ILS': [34, '\\u20AA', 'IL\\u20AA'],\n  'INR': [2, '\\u20B9', 'Rs'],\n  'IRR': [0, 'Rial', 'IRR'],\n  'ISK': [0, 'kr', 'kr'],\n  'JMD': [2, '$', 'JA$'],\n  'JPY': [0, '¥', 'JP¥'],\n  'KRW': [0, '\\u20A9', 'KR₩'],\n  'LKR': [2, 'Rs', 'SLRs'],\n  'LTL': [2, 'Lt', 'Lt'],\n  'MNT': [0, '\\u20AE', 'MN₮'],\n  'MVR': [2, 'Rf', 'MVR'],\n  'MXN': [2, '$', 'Mex$'],\n  'MYR': [2, 'RM', 'RM'],\n  'NOK': [50, 'kr', 'NOkr'],\n  'PAB': [2, 'B/.', 'B/.'],\n  'PEN': [2, 'S/.', 'S/.'],\n  'PHP': [2, '\\u20B1', 'PHP'],\n  'PKR': [0, 'Rs', 'PKRs.'],\n  'PLN': [50, 'z\\u0142', 'z\\u0142'],\n  'RON': [2, 'RON', 'RON'],\n  'RSD': [0, 'din', 'RSD'],\n  'RUB': [50, '\\u20bd', 'RUB'],\n  'SAR': [2, 'Rial', 'Rial'],\n  'SEK': [50, 'kr', 'kr'],\n  'SGD': [2, '$', 'S$'],\n  'THB': [2, '\\u0e3f', 'THB'],\n  'TRY': [2, '₺', 'TRY'],\n  'TWD': [2, 'NT$', 'NT$'],\n  'TZS': [0, 'TSh', 'TSh'],\n  'UAH': [2, 'грн.', 'UAH'],\n  'USD': [2, '$', 'US$'],\n  'UYU': [2, '$', '$U'],\n  'VND': [48, '\\u20AB', 'VN\\u20AB'],\n  'YER': [0, 'Rial', 'Rial'],\n  'ZAR': [2, 'R', 'ZAR']\n};\n\n\n/**\n * Tier 2 currency information.\n *\n * It's not recommended to read this data directly. Format numbers using\n * {@link goog.i18n.NumberFormat} with\n * {@link goog.i18n.NumberFormat.Format.CURRENCY} instead.\n *\n * @const {!Object<!Array<?>>}\n */\ngoog.i18n.currency.CurrencyInfoTier2 = {\n  'AFN': [48, 'Af.', 'AFN'],\n  'AMD': [32, 'Dram', 'dram'],\n  'ANG': [2, 'NAf.', 'ANG'],\n  'AOA': [2, 'Kz', 'Kz'],\n  'ARS': [34, '$', 'AR$'],\n  'AWG': [2, 'Afl.', 'Afl.'],\n  'AZN': [34, '\\u20bc', 'AZN'],\n  'BAM': [2, 'KM', 'KM'],\n  'BBD': [2, '$', 'Bds$'],\n  'BHD': [3, 'din', 'din'],\n  'BIF': [0, 'FBu', 'FBu'],\n  'BMD': [2, '$', 'BD$'],\n  'BND': [2, '$', 'B$'],\n  'BOB': [2, 'Bs', 'Bs'],\n  'BSD': [2, '$', 'BS$'],\n  'BTN': [2, 'Nu.', 'Nu.'],\n  'BWP': [2, 'P', 'pula'],\n  'BYN': [50, '\\u0440.', 'BYN'],\n  'BYR': [48, '\\u0440.', 'BYR'],\n  'BZD': [2, '$', 'BZ$'],\n  'CNH': [2, '¥', 'RMB¥'],\n  'CUC': [1, '$', 'CUC$'],\n  'CUP': [2, '$', 'CU$'],\n  'CVE': [2, 'CVE', 'Esc'],\n  'DJF': [0, 'Fdj', 'Fdj'],\n  'DZD': [2, 'din', 'din'],\n  'ERN': [2, 'Nfk', 'Nfk'],\n  'FJD': [2, '$', 'FJ$'],\n  'FKP': [2, '£', 'FK£'],\n  'GEL': [2, 'GEL', 'GEL'],\n  'GHS': [2, 'GHS', 'GHS'],\n  'GIP': [2, '£', 'GI£'],\n  'GMD': [2, 'GMD', 'GMD'],\n  'GNF': [0, 'FG', 'FG'],\n  'GTQ': [2, 'Q', 'GTQ'],\n  'GYD': [0, '$', 'GY$'],\n  'HNL': [2, 'L', 'HNL'],\n  'HTG': [2, 'HTG', 'HTG'],\n  'IQD': [0, 'din', 'IQD'],\n  'JOD': [3, 'din', 'JOD'],\n  'KES': [2, 'Ksh', 'Ksh'],\n  'KGS': [2, 'KGS', 'KGS'],\n  'KHR': [2, 'Riel', 'KHR'],\n  'KMF': [0, 'CF', 'KMF'],\n  'KPW': [0, '\\u20A9KP', 'KPW'],\n  'KWD': [3, 'din', 'KWD'],\n  'KYD': [2, '$', 'KY$'],\n  'KZT': [2, '\\u20B8', 'KZT'],\n  'LAK': [0, '\\u20AD', '\\u20AD'],\n  'LBP': [0, 'L£', 'LBP'],\n  'LRD': [2, '$', 'L$'],\n  'LSL': [2, 'LSL', 'LSL'],\n  'LYD': [3, 'din', 'LD'],\n  'MAD': [2, 'dh', 'MAD'],\n  'MDL': [2, 'MDL', 'MDL'],\n  'MGA': [0, 'Ar', 'MGA'],\n  'MKD': [2, 'din', 'MKD'],\n  'MMK': [0, 'K', 'MMK'],\n  'MOP': [2, 'MOP', 'MOP$'],\n  'MRO': [0, 'MRO', 'MRO'],\n  'MUR': [0, 'MURs', 'MURs'],\n  'MWK': [2, 'MWK', 'MWK'],\n  'MZN': [2, 'MTn', 'MTn'],\n  'NAD': [2, '$', 'N$'],\n  'NGN': [2, '\\u20A6', 'NG\\u20A6'],\n  'NIO': [2, 'C$', 'C$'],\n  'NPR': [2, 'Rs', 'NPRs'],\n  'NZD': [2, '$', 'NZ$'],\n  'OMR': [3, 'Rial', 'OMR'],\n  'PGK': [2, 'PGK', 'PGK'],\n  'PYG': [16, 'Gs.', 'PYG'],\n  'QAR': [2, 'Rial', 'QR'],\n  'RWF': [0, 'RF', 'RF'],\n  'SBD': [2, '$', 'SI$'],\n  'SCR': [2, 'SCR', 'SCR'],\n  'SDG': [2, 'SDG', 'SDG'],\n  'SHP': [2, '£', 'SH£'],\n  'SLL': [0, 'SLL', 'SLL'],\n  'SOS': [0, 'SOS', 'SOS'],\n  'SRD': [2, '$', 'SR$'],\n  'SSP': [2, '£', 'SSP'],\n  'STD': [0, 'Db', 'Db'],\n  'SYP': [0, '£', 'SY£'],\n  'SZL': [2, 'SZL', 'SZL'],\n  'TJS': [2, 'Som', 'TJS'],\n  'TMT': [50, 'm', 'TMT'],\n  'TND': [3, 'din', 'DT'],\n  'TOP': [2, 'T$', 'T$'],\n  'TTD': [2, '$', 'TT$'],\n  'UGX': [0, 'UGX', 'UGX'],\n  'UZS': [0, 'so\\u02bcm', 'UZS'],\n  'VEF': [2, 'Bs', 'Bs'],\n  'VES': [2, 'Bs', 'Bs'],\n  'VUV': [0, 'VUV', 'VUV'],\n  'WST': [2, 'WST', 'WST'],\n  'XAF': [0, 'FCFA', 'FCFA'],\n  'XCD': [2, '$', 'EC$'],\n  'XOF': [0, 'CFA', 'CFA'],\n  'XPF': [48, 'FCFP', 'FCFP'],\n  'ZMW': [0, 'ZMW', 'ZMW'],\n  'ZWD': [0, '$', 'Z$']\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/currency.js"],"^O",["^=",["~$goog.i18n.currency","~$goog.i18n.currency.CurrencyInfo","~$goog.i18n.currency.CurrencyInfoTier2"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.debug.console.js","^5",["^6","goog/debug/console.js"],"^7","goog/debug/console.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Simple logger that logs to the window console if available.\n *\n * Has an autoInstall option which can be put into initialization code, which\n * will start logging if \"Debug=true\" is in document.location.href\n *\n */\n\ngoog.provide('goog.debug.Console');\n\ngoog.require('goog.debug.LogManager');\ngoog.require('goog.debug.Logger');\ngoog.require('goog.debug.TextFormatter');\n\n\n\n/**\n * Create and install a log handler that logs to window.console if available\n * @constructor\n */\ngoog.debug.Console = function() {\n  this.publishHandler_ = goog.bind(this.addLogRecord, this);\n\n  /**\n   * Formatter for formatted output.\n   * @type {!goog.debug.TextFormatter}\n   * @private\n   */\n  this.formatter_ = new goog.debug.TextFormatter();\n  this.formatter_.showAbsoluteTime = false;\n  this.formatter_.showExceptionText = false;\n  // The console logging methods automatically append a newline.\n  this.formatter_.appendNewline = false;\n\n  this.isCapturing_ = false;\n  this.logBuffer_ = '';\n\n  /**\n   * Loggers that we shouldn't output.\n   * @type {!Object<boolean>}\n   * @private\n   */\n  this.filteredLoggers_ = {};\n};\n\n\n/**\n * Returns the text formatter used by this console\n * @return {!goog.debug.TextFormatter} The text formatter.\n */\ngoog.debug.Console.prototype.getFormatter = function() {\n  return this.formatter_;\n};\n\n\n/**\n * Sets whether we are currently capturing logger output.\n * @param {boolean} capturing Whether to capture logger output.\n */\ngoog.debug.Console.prototype.setCapturing = function(capturing) {\n  if (capturing == this.isCapturing_) {\n    return;\n  }\n\n  // attach or detach handler from the root logger\n  var rootLogger = goog.debug.LogManager.getRoot();\n  if (capturing) {\n    rootLogger.addHandler(this.publishHandler_);\n  } else {\n    rootLogger.removeHandler(this.publishHandler_);\n  }\n  this.isCapturing_ = capturing;\n};\n\n\n/**\n * Adds a log record.\n * @param {?goog.debug.LogRecord} logRecord The log entry.\n */\ngoog.debug.Console.prototype.addLogRecord = function(logRecord) {\n  // Check to see if the log record is filtered or not.\n  if (this.filteredLoggers_[logRecord.getLoggerName()]) {\n    return;\n  }\n\n  /**\n   * @param {?goog.debug.Logger.Level} level\n   * @return {string}\n   */\n  function getConsoleMethodName_(level) {\n    if (level) {\n      if (level.value >= goog.debug.Logger.Level.SEVERE.value) {\n        // SEVERE == 1000, SHOUT == 1200\n        return 'error';\n      }\n      if (level.value >= goog.debug.Logger.Level.WARNING.value) {\n        return 'warn';\n      }\n      // NOTE(martone): there's a goog.debug.Logger.Level.INFO - that we should\n      // presumably map to console.info. However, the current mapping is INFO ->\n      // console.log. Let's keep the status quo for now, but we should\n      // reevaluate if we tweak the goog.log API.\n      if (level.value >= goog.debug.Logger.Level.CONFIG.value) {\n        return 'log';\n      }\n    }\n    return 'debug';\n  }\n\n  var record = this.formatter_.formatRecord(logRecord);\n  var console = goog.debug.Console.console_;\n  if (console) {\n    // TODO(b/117415985): Make getLevel() non-null and update\n    // getConsoleMethodName_ parameters.\n    var logMethod = getConsoleMethodName_(logRecord.getLevel());\n    goog.debug.Console.logToConsole_(\n        console, logMethod, record, logRecord.getException());\n  } else {\n    this.logBuffer_ += record;\n  }\n};\n\n\n/**\n * Adds a logger name to be filtered.\n * @param {string} loggerName the logger name to add.\n */\ngoog.debug.Console.prototype.addFilter = function(loggerName) {\n  this.filteredLoggers_[loggerName] = true;\n};\n\n\n/**\n * Removes a logger name to be filtered.\n * @param {string} loggerName the logger name to remove.\n */\ngoog.debug.Console.prototype.removeFilter = function(loggerName) {\n  delete this.filteredLoggers_[loggerName];\n};\n\n\n/**\n * Global console logger instance\n * @type {?goog.debug.Console}\n */\ngoog.debug.Console.instance = null;\n\n\n/**\n * The console to which to log.  This is a property so it can be mocked out in\n * this unit test for goog.debug.Console. Using goog.global, as console might be\n * used in window-less contexts.\n * @type {{log:!Function}}\n * @private\n */\ngoog.debug.Console.console_ = goog.global['console'];\n\n\n/**\n * Sets the console to which to log.\n * @param {!Object} console The console to which to log.\n */\ngoog.debug.Console.setConsole = function(console) {\n  goog.debug.Console.console_ = /** @type {{log:!Function}} */ (console);\n};\n\n\n/**\n * Install the console and start capturing if \"Debug=true\" is in the page URL\n */\ngoog.debug.Console.autoInstall = function() {\n  if (!goog.debug.Console.instance) {\n    goog.debug.Console.instance = new goog.debug.Console();\n  }\n\n  if (goog.global.location &&\n      goog.global.location.href.indexOf('Debug=true') != -1) {\n    goog.debug.Console.instance.setCapturing(true);\n  }\n};\n\n\n/**\n * Show an alert with all of the captured debug information.\n * Information is only captured if console is not available\n */\ngoog.debug.Console.show = function() {\n  alert(goog.debug.Console.instance.logBuffer_);\n};\n\n\n/**\n * Logs the record to the console using the given function.  If the function is\n * not available on the console object, the log function is used instead.\n * @param {{log:!Function}} console The console object.\n * @param {string} fnName The name of the function to use.\n * @param {string} record The record to log.\n * @param {?Object} exception An additional Error to log.\n * @private\n */\ngoog.debug.Console.logToConsole_ = function(\n    console, fnName, record, exception) {\n  if (console[fnName]) {\n    console[fnName](record, exception || '');\n  } else {\n    console.log(record, exception || '');\n  }\n};\n","^;",1579837703000,"^<",["^=",["~$goog.debug.TextFormatter","~$goog.debug.LogManager","^?","^:<"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/console.js"],"^O",["^=",["~$goog.debug.Console"]],"^W",true,"^X",["^?","^BH","^:<","^BG"]],["^ ","^3",[1579837703000],"^4","goog.dom.forms.js","^5",["^6","goog/dom/forms.js"],"^7","goog/dom/forms.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for manipulating a form and elements.\n *\n * @author arv@google.com (Erik Arvidsson)\n * @suppress {strictMissingProperties}\n */\n\ngoog.provide('goog.dom.forms');\n\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.structs.Map');\ngoog.require('goog.window');\n\n\n/**\n * Submits form data via a new window. This hides references to the parent\n * window and should be used when submitting forms to untrusted 3rd party urls.\n * By default, this uses the action and method of the specified form\n * element. It is possible to override the default action and method if an\n * optional submit element with formaction and/or formmethod attributes is\n * provided.\n * @param {!HTMLFormElement} form The form.\n * @param {!HTMLElement=} opt_submitElement The `<button>` or `<input>` element\n *     used to submit the form. The element should have a submit type.\n * @return {boolean} true If the form was submitted succesfully.\n * @throws {!Error} If opt_submitElement is not a valid form submit element.\n */\ngoog.dom.forms.submitFormInNewWindow = function(form, opt_submitElement) {\n  var formData = goog.dom.forms.getFormDataMap(form);\n  var action = form.action;\n  var method = form.method;\n\n  if (opt_submitElement) {\n    if (goog.dom.InputType.SUBMIT != opt_submitElement.type.toLowerCase()) {\n      throw new Error('opt_submitElement does not have a valid type.');\n    }\n\n\n    var submitValue =\n        /** @type {?string} */ (goog.dom.forms.getValue(opt_submitElement));\n    if (submitValue != null) {\n      goog.dom.forms.addFormDataToMap_(\n          formData, opt_submitElement.name, submitValue);\n    }\n\n    if (opt_submitElement.getAttribute('formaction')) {\n      action = opt_submitElement.getAttribute('formaction');\n    }\n\n    if (opt_submitElement.getAttribute('formmethod')) {\n      method = opt_submitElement.getAttribute('formmethod');\n    }\n  }\n\n  return goog.dom.forms.submitFormDataInNewWindow(action, method, formData);\n};\n\n/**\n * Submits form data via a new window. This hides references to the parent\n * window and should be used when submitting forms to untrusted 3rd party urls.\n * @param {string} actionUri uri to submit form content to.\n * @param {string} method HTTP method used to submit the form.\n * @param {!goog.structs.Map<string, !Array<string>>} formData A map of the form\n *     data as field name to arrays of values.\n * @return {boolean} true If the form was submitted succesfully.\n */\ngoog.dom.forms.submitFormDataInNewWindow = function(\n    actionUri, method, formData) {\n  var newWin = goog.window.openBlank('', {noreferrer: true});\n\n  // This could be null if a new window could not be opened. e.g. if it was\n  // stopped by a popup blocker.\n  if (!newWin) {\n    return false;\n  }\n\n  var newDocument = newWin.document;\n\n  var newForm =\n      /** @type {!HTMLFormElement} */ (newDocument.createElement('form'));\n  newForm.method = method;\n  goog.dom.safe.setFormElementAction(newForm, actionUri);\n\n  // After this point, do not directly reference the form object's functions as\n  // field names can shadow the form's properties.\n\n  formData.forEach(function(fieldValues, fieldName) {\n    for (var i = 0; i < fieldValues.length; i++) {\n      var fieldValue = fieldValues[i];\n      var newInput = newDocument.createElement('input');\n      newInput.name = fieldName;\n      newInput.value = fieldValue;\n      newInput.type = 'hidden';\n      HTMLFormElement.prototype.appendChild.call(newForm, newInput);\n    }\n  });\n\n  HTMLFormElement.prototype.submit.call(newForm);\n  return true;\n};\n\n\n/**\n * Returns form data as a map of name to value arrays. This doesn't\n * support file inputs.\n * @param {HTMLFormElement} form The form.\n * @return {!goog.structs.Map<string, !Array<string>>} A map of the form data\n *     as field name to arrays of values.\n */\ngoog.dom.forms.getFormDataMap = function(form) {\n  var map = new goog.structs.Map();\n  goog.dom.forms.getFormDataHelper_(\n      form, map, goog.dom.forms.addFormDataToMap_);\n  return map;\n};\n\n\n/**\n * Returns the form data as an application/x-www-url-encoded string. This\n * doesn't support file inputs.\n * @param {HTMLFormElement} form The form.\n * @return {string} An application/x-www-url-encoded string.\n */\ngoog.dom.forms.getFormDataString = function(form) {\n  var sb = [];\n  goog.dom.forms.getFormDataHelper_(\n      form, sb, goog.dom.forms.addFormDataToStringBuffer_);\n  return sb.join('&');\n};\n\n\n/**\n * Returns the form data as a map or an application/x-www-url-encoded\n * string. This doesn't support file inputs.\n * @param {HTMLFormElement} form The form.\n * @param {Object} result The object form data is being put in.\n * @param {Function} fnAppend Function that takes `result`, an element\n *     name, and an element value, and adds the name/value pair to the result\n *     object.\n * @private\n */\ngoog.dom.forms.getFormDataHelper_ = function(form, result, fnAppend) {\n  var els = form.elements;\n  for (var el, i = 0; el = els.item(i); i++) {\n    if (  // Make sure we don't include elements that are not part of the form.\n        // Some browsers include non-form elements. Check for 'form' property.\n        // See http://code.google.com/p/closure-library/issues/detail?id=227\n        // and\n        // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-input-element.html#the-input-element\n        (el.form != form) || el.disabled ||\n        // HTMLFieldSetElement has a form property but no value.\n        el.tagName == goog.dom.TagName.FIELDSET) {\n      continue;\n    }\n\n    var name = el.name;\n    switch (el.type.toLowerCase()) {\n      case goog.dom.InputType.FILE:\n      // file inputs are not supported\n      case goog.dom.InputType.SUBMIT:\n      case goog.dom.InputType.RESET:\n      case goog.dom.InputType.BUTTON:\n        // don't submit these\n        break;\n      case goog.dom.InputType.SELECT_MULTIPLE:\n        var values = goog.dom.forms.getValue(el);\n        if (values != null) {\n          for (var value, j = 0; value = values[j]; j++) {\n            fnAppend(result, name, value);\n          }\n        }\n        break;\n      default:\n        var value = goog.dom.forms.getValue(el);\n        if (value != null) {\n          fnAppend(result, name, value);\n        }\n    }\n  }\n\n  // input[type=image] are not included in the elements collection\n  var inputs = form.getElementsByTagName(String(goog.dom.TagName.INPUT));\n  for (var input, i = 0; input = inputs[i]; i++) {\n    if (input.form == form &&\n        input.type.toLowerCase() == goog.dom.InputType.IMAGE) {\n      name = input.name;\n      fnAppend(result, name, input.value);\n      fnAppend(result, name + '.x', '0');\n      fnAppend(result, name + '.y', '0');\n    }\n  }\n};\n\n\n/**\n * Adds the name/value pair to the map.\n * @param {!goog.structs.Map<string, !Array<string>>} map The map to add to.\n * @param {string} name The name.\n * @param {string} value The value.\n * @private\n */\ngoog.dom.forms.addFormDataToMap_ = function(map, name, value) {\n  var array = map.get(name);\n  if (!array) {\n    array = [];\n    map.set(name, array);\n  }\n  array.push(value);\n};\n\n\n/**\n * Adds a name/value pair to an string buffer array in the form 'name=value'.\n * @param {Array<string>} sb The string buffer array for storing data.\n * @param {string} name The name.\n * @param {string} value The value.\n * @private\n */\ngoog.dom.forms.addFormDataToStringBuffer_ = function(sb, name, value) {\n  sb.push(encodeURIComponent(name) + '=' + encodeURIComponent(value));\n};\n\n\n/**\n * Whether the form has a file input.\n * @param {HTMLFormElement} form The form.\n * @return {boolean} Whether the form has a file input.\n */\ngoog.dom.forms.hasFileInput = function(form) {\n  var els = form.elements;\n  for (var el, i = 0; el = els[i]; i++) {\n    if (!el.disabled && el.type &&\n        el.type.toLowerCase() == goog.dom.InputType.FILE) {\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Enables or disables either all elements in a form or a single form element.\n * @param {Element} el The element, either a form or an element within a form.\n * @param {boolean} disabled Whether the element should be disabled.\n */\ngoog.dom.forms.setDisabled = function(el, disabled) {\n  // disable all elements in a form\n  if (el.tagName == goog.dom.TagName.FORM) {\n    var els = /** @type {!HTMLFormElement} */ (el).elements;\n    for (var i = 0; el = els.item(i); i++) {\n      goog.dom.forms.setDisabled(el, disabled);\n    }\n  } else {\n    // makes sure to blur buttons, multi-selects, and any elements which\n    // maintain keyboard/accessibility focus when disabled\n    if (disabled == true) {\n      el.blur();\n    }\n    el.disabled = disabled;\n  }\n};\n\n\n/**\n * Focuses, and optionally selects the content of, a form element.\n * @param {Element} el The form element.\n */\ngoog.dom.forms.focusAndSelect = function(el) {\n  el.focus();\n  if (el.select) {\n    el.select();\n  }\n};\n\n\n/**\n * Whether a form element has a value.\n * @param {Element} el The element.\n * @return {boolean} Whether the form has a value.\n */\ngoog.dom.forms.hasValue = function(el) {\n  var value = goog.dom.forms.getValue(el);\n  return !!value;\n};\n\n\n/**\n * Whether a named form field has a value.\n * @param {HTMLFormElement} form The form element.\n * @param {string} name Name of an input to the form.\n * @return {boolean} Whether the form has a value.\n */\ngoog.dom.forms.hasValueByName = function(form, name) {\n  var value = goog.dom.forms.getValueByName(form, name);\n  return !!value;\n};\n\n\n/**\n * Gets the current value of any element with a type.\n * @param {null|!Element|!RadioNodeList<?>} input The element.\n * @return {string|Array<string>|null} The current value of the element\n *     (or null).\n */\ngoog.dom.forms.getValue = function(input) {\n  // Elements with a type may need more specialized logic.\n  var type = /** {{type: (string|undefined)}} */ (input).type;\n\n  if (typeof type === 'string') {\n    var el = /** @type {!Element} */ (input);\n\n    switch (type.toLowerCase()) {\n      case goog.dom.InputType.CHECKBOX:\n      case goog.dom.InputType.RADIO:\n        return goog.dom.forms.getInputChecked_(el);\n      case goog.dom.InputType.SELECT_ONE:\n        return goog.dom.forms.getSelectSingle_(el);\n      case goog.dom.InputType.SELECT_MULTIPLE:\n        return goog.dom.forms.getSelectMultiple_(el);\n      default:\n        // Not every element with a value has a type (e.g. meter and progress).\n    }\n  }\n\n  // Coerce `undefined` to `null`.\n  return input.value != null ? input.value : null;\n};\n\n\n/**\n * Returns the value of the named form field. In the case of radio buttons,\n * returns the value of the checked button with the given name.\n *\n * @param {HTMLFormElement} form The form element.\n * @param {string} name Name of an input to the form.\n *\n * @return {Array<string>|string|null} The value of the form element, or\n *     null if the form element does not exist or has no value.\n */\ngoog.dom.forms.getValueByName = function(form, name) {\n  var els = form.elements[name];\n\n  if (!els) {\n    return null;\n  } else if (els.type) {\n    return goog.dom.forms.getValue(/** @type {!Element} */ (els));\n  } else {\n    for (var i = 0; i < els.length; i++) {\n      var val = goog.dom.forms.getValue(els[i]);\n      if (val) {\n        return val;\n      }\n    }\n    return null;\n  }\n};\n\n\n/**\n * Gets the current value of a checkable input element.\n * @param {Element} el The element.\n * @return {?string} The value of the form element (or null).\n * @private\n */\ngoog.dom.forms.getInputChecked_ = function(el) {\n  return el.checked ? /** @type {?} */ (el).value : null;\n};\n\n\n/**\n * Gets the current value of a select-one element.\n * @param {Element} el The element.\n * @return {?string} The value of the form element (or null).\n * @private\n */\ngoog.dom.forms.getSelectSingle_ = function(el) {\n  var selectedIndex = /** @type {!HTMLSelectElement} */ (el).selectedIndex;\n  return selectedIndex >= 0 ?\n      /** @type {!HTMLSelectElement} */ (el).options[selectedIndex].value :\n      null;\n};\n\n\n/**\n * Gets the current value of a select-multiple element.\n * @param {Element} el The element.\n * @return {Array<string>?} The value of the form element (or null).\n * @private\n */\ngoog.dom.forms.getSelectMultiple_ = function(el) {\n  var values = [];\n  for (var option, i = 0;\n       option = /** @type {!HTMLSelectElement} */ (el).options[i]; i++) {\n    if (option.selected) {\n      values.push(option.value);\n    }\n  }\n  return values.length ? values : null;\n};\n\n\n/**\n * Sets the current value of any element with a type.\n * @param {Element} el The element.\n * @param {*=} opt_value The value to give to the element, which will be coerced\n *     by the browser in the default case using toString. This value should be\n *     an array for setting the value of select multiple elements.\n */\ngoog.dom.forms.setValue = function(el, opt_value) {\n  // Elements with a type may need more specialized logic.\n  var type = /** @type {!HTMLInputElement} */ (el).type;\n  switch (typeof type === 'string' && type.toLowerCase()) {\n    case goog.dom.InputType.CHECKBOX:\n    case goog.dom.InputType.RADIO:\n      goog.dom.forms.setInputChecked_(\n          el,\n          /** @type {string} */ (opt_value));\n      return;\n    case goog.dom.InputType.SELECT_ONE:\n      goog.dom.forms.setSelectSingle_(\n          el,\n          /** @type {string} */ (opt_value));\n      return;\n    case goog.dom.InputType.SELECT_MULTIPLE:\n      goog.dom.forms.setSelectMultiple_(\n          el,\n          /** @type {!Array<string>} */ (opt_value));\n      return;\n    default:\n      // Not every element with a value has a type (e.g. meter and progress).\n      el.value = opt_value != null ? opt_value : '';\n  }\n};\n\n\n/**\n * Sets a checkable input element's checked property.\n * #TODO(user): This seems potentially unintuitive since it doesn't set\n * the value property but my hunch is that the primary use case is to check a\n * checkbox, not to reset its value property.\n * @param {Element} el The element.\n * @param {string|boolean=} opt_value The value, sets the element checked if\n *     val is set.\n * @private\n */\ngoog.dom.forms.setInputChecked_ = function(el, opt_value) {\n  el.checked = opt_value;\n};\n\n\n/**\n * Sets the value of a select-one element.\n * @param {Element} el The element.\n * @param {string=} opt_value The value of the selected option element.\n * @private\n */\ngoog.dom.forms.setSelectSingle_ = function(el, opt_value) {\n  // unset any prior selections\n  el.selectedIndex = -1;\n  if (typeof opt_value === 'string') {\n    for (var option, i = 0;\n         option = /** @type {!HTMLSelectElement} */ (el).options[i]; i++) {\n      if (option.value == opt_value) {\n        option.selected = true;\n        break;\n      }\n    }\n  }\n};\n\n\n/**\n * Sets the value of a select-multiple element.\n * @param {Element} el The element.\n * @param {Array<string>|string=} opt_value The value of the selected option\n *     element(s).\n * @private\n */\ngoog.dom.forms.setSelectMultiple_ = function(el, opt_value) {\n  // reset string opt_values as an array\n  if (typeof opt_value === 'string') {\n    opt_value = [opt_value];\n  }\n  for (var option, i = 0;\n       option = /** @type {!HTMLSelectElement} */ (el).options[i]; i++) {\n    // we have to reset the other options to false for select-multiple\n    option.selected = false;\n    if (opt_value) {\n      for (var value, j = 0; value = opt_value[j]; j++) {\n        if (option.value == value) {\n          option.selected = true;\n        }\n      }\n    }\n  }\n};\n","^;",1579837703000,"^<",["^=",["^5Q","^1U","^?","^68","^1E","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/forms.js"],"^O",["^=",["~$goog.dom.forms"]],"^W",true,"^X",["^?","^1U","^12","^1E","^5Q","^68"]],["^ ","^3",[1579837703000],"^4","goog.ui.labelinput.js","^5",["^6","goog/ui/labelinput.js"],"^7","goog/ui/labelinput.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This behavior is applied to a text input and it shows a text\n * message inside the element if the user hasn't entered any text.\n *\n * This uses the HTML5 placeholder attribute where it is supported.\n *\n * This is ported from http://go/labelinput.js\n *\n * Known issue: Safari does not allow you get to the window object from a\n * document. We need that to listen to the onload event. For now we hard code\n * the window to the current window.\n *\n * Known issue: We need to listen to the form submit event but we attach the\n * event only once (when created or when it is changed) so if you move the DOM\n * node to another form it will not be cleared correctly before submitting.\n *\n * @author arv@google.com (Erik Arvidsson)\n * @see ../demos/labelinput.html\n */\n\ngoog.provide('goog.ui.LabelInput');\n\ngoog.require('goog.Timer');\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.ui.Component');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * This creates the label input object.\n * @param {string=} opt_label The text to show as the label.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @extends {goog.ui.Component}\n * @constructor\n */\ngoog.ui.LabelInput = function(opt_label, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * The text to show as the label.\n   * @type {string}\n   * @private\n   */\n  this.label_ = opt_label || '';\n};\ngoog.inherits(goog.ui.LabelInput, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.LabelInput);\n\n\n/**\n * Variable used to store the element value on keydown and restore it on\n * keypress.  See {@link #handleEscapeKeys_}\n * @type {?string}\n * @private\n */\ngoog.ui.LabelInput.prototype.ffKeyRestoreValue_ = null;\n\n\n/**\n * The label restore delay after leaving the input.\n * @type {number} Delay for restoring the label.\n * @protected\n */\ngoog.ui.LabelInput.prototype.labelRestoreDelayMs = 10;\n\n\n/** @private {boolean} */\ngoog.ui.LabelInput.prototype.inFocusAndSelect_;\n\n\n/** @private {boolean} */\ngoog.ui.LabelInput.prototype.formAttached_;\n\n\n/**\n * Indicates whether the browser supports the placeholder attribute, new in\n * HTML5.\n * @type {?boolean}\n * @private\n */\ngoog.ui.LabelInput.supportsPlaceholder_;\n\n\n/**\n * Checks browser support for placeholder attribute.\n * @return {boolean} Whether placeholder attribute is supported.\n * @private\n */\ngoog.ui.LabelInput.isPlaceholderSupported_ = function() {\n  if (goog.ui.LabelInput.supportsPlaceholder_ == null) {\n    goog.ui.LabelInput.supportsPlaceholder_ =\n        ('placeholder' in goog.dom.createElement(goog.dom.TagName.INPUT));\n  }\n  return goog.ui.LabelInput.supportsPlaceholder_;\n};\n\n\n/**\n * @type {goog.events.EventHandler}\n * @private\n */\ngoog.ui.LabelInput.prototype.eventHandler_;\n\n\n/**\n * @type {boolean}\n * @private\n */\ngoog.ui.LabelInput.prototype.hasFocus_ = false;\n\n\n/**\n * Creates the DOM nodes needed for the label input.\n * @override\n */\ngoog.ui.LabelInput.prototype.createDom = function() {\n  this.setElementInternal(\n      this.getDomHelper().createDom(\n          goog.dom.TagName.INPUT, {'type': goog.dom.InputType.TEXT}));\n};\n\n\n/**\n * Decorates an existing HTML input element as a label input. If the element\n * has a \"label\" attribute then that will be used as the label property for the\n * label input object.\n * @param {Element} element The HTML input element to decorate.\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.decorateInternal = function(element) {\n  goog.ui.LabelInput.superClass_.decorateInternal.call(this, element);\n  if (!this.label_) {\n    this.label_ = element.getAttribute('label') || '';\n  }\n\n  // Check if we're attaching to an element that already has focus.\n  if (goog.dom.getActiveElement(goog.dom.getOwnerDocument(element)) ==\n      element) {\n    this.hasFocus_ = true;\n    var el = this.getElement();\n    goog.asserts.assert(el);\n    goog.dom.classlist.remove(el, this.labelCssClassName);\n  }\n\n  if (goog.ui.LabelInput.isPlaceholderSupported_()) {\n    this.getElement().placeholder = this.label_;\n  }\n  var labelInputElement = this.getElement();\n  goog.asserts.assert(\n      labelInputElement, 'The label input element cannot be null.');\n  goog.a11y.aria.setState(\n      labelInputElement, goog.a11y.aria.State.LABEL, this.label_);\n};\n\n\n/**\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.enterDocument = function() {\n  goog.ui.LabelInput.superClass_.enterDocument.call(this);\n  this.attachEvents_();\n  this.check_();\n\n  // Make it easy for other closure widgets to play nicely with inputs using\n  // LabelInput:\n  this.getElement().labelInput_ = this;\n};\n\n\n/**\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.exitDocument = function() {\n  goog.ui.LabelInput.superClass_.exitDocument.call(this);\n  this.detachEvents_();\n\n  this.getElement().labelInput_ = null;\n};\n\n\n/**\n * Attaches the events we need to listen to.\n * @private\n */\ngoog.ui.LabelInput.prototype.attachEvents_ = function() {\n  var eh = new goog.events.EventHandler(this);\n  eh.listen(this.getElement(), goog.events.EventType.FOCUS, this.handleFocus_);\n  eh.listen(this.getElement(), goog.events.EventType.BLUR, this.handleBlur_);\n\n  if (goog.ui.LabelInput.isPlaceholderSupported_()) {\n    this.eventHandler_ = eh;\n    return;\n  }\n\n  if (goog.userAgent.GECKO) {\n    eh.listen(\n        this.getElement(),\n        [\n          goog.events.EventType.KEYPRESS, goog.events.EventType.KEYDOWN,\n          goog.events.EventType.KEYUP\n        ],\n        this.handleEscapeKeys_);\n  }\n\n  // IE sets defaultValue upon load so we need to test that as well.\n  var d = goog.dom.getOwnerDocument(this.getElement());\n  var w = goog.dom.getWindow(d);\n  eh.listen(w, goog.events.EventType.LOAD, this.handleWindowLoad_);\n\n  this.eventHandler_ = eh;\n  this.attachEventsToForm_();\n};\n\n\n/**\n * Adds a listener to the form so that we can clear the input before it is\n * submitted.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.attachEventsToForm_ = function() {\n  // in case we have are in a form we need to make sure the label is not\n  // submitted\n  if (!this.formAttached_ && this.eventHandler_ && this.getElement().form) {\n    this.eventHandler_.listen(\n        this.getElement().form, goog.events.EventType.SUBMIT,\n        this.handleFormSubmit_);\n    this.formAttached_ = true;\n  }\n};\n\n\n/**\n * Stops listening to the events.\n * @private\n */\ngoog.ui.LabelInput.prototype.detachEvents_ = function() {\n  if (this.eventHandler_) {\n    this.eventHandler_.dispose();\n    this.eventHandler_ = null;\n  }\n};\n\n\n/** @override */\ngoog.ui.LabelInput.prototype.disposeInternal = function() {\n  goog.ui.LabelInput.superClass_.disposeInternal.call(this);\n  this.detachEvents_();\n};\n\n\n/**\n * The CSS class name to add to the input when the user has not entered a\n * value.\n */\ngoog.ui.LabelInput.prototype.labelCssClassName =\n    goog.getCssName('label-input-label');\n\n\n/**\n * Handler for the focus event.\n * @param {goog.events.Event} e The event object passed in to the event handler.\n * @private\n */\ngoog.ui.LabelInput.prototype.handleFocus_ = function(e) {\n  this.hasFocus_ = true;\n  var el = this.getElement();\n  goog.asserts.assert(el);\n  goog.dom.classlist.remove(el, this.labelCssClassName);\n  if (goog.ui.LabelInput.isPlaceholderSupported_()) {\n    return;\n  }\n  if (!this.hasChanged() && !this.inFocusAndSelect_) {\n    var me = this;\n    /** @suppress {strictMissingProperties} Part of the go/strict_warnings_migration */\n    var clearValue = function() {\n      // Component could be disposed by the time this is called.\n      if (me.getElement()) {\n        me.getElement().value = '';\n      }\n    };\n    if (goog.userAgent.IE) {\n      goog.Timer.callOnce(clearValue, 10);\n    } else {\n      clearValue();\n    }\n  }\n};\n\n\n/**\n * Handler for the blur event.\n * @param {goog.events.Event} e The event object passed in to the event handler.\n * @private\n */\ngoog.ui.LabelInput.prototype.handleBlur_ = function(e) {\n  // We listen to the click event when we enter focusAndSelect mode so we can\n  // fake an artificial focus when the user clicks on the input box. However,\n  // if the user clicks on something else (and we lose focus), there is no\n  // need for an artificial focus event.\n  if (!goog.ui.LabelInput.isPlaceholderSupported_()) {\n    this.eventHandler_.unlisten(\n        this.getElement(), goog.events.EventType.CLICK, this.handleFocus_);\n    this.ffKeyRestoreValue_ = null;\n  }\n  this.hasFocus_ = false;\n  this.check_();\n};\n\n\n/**\n * Handler for key events in Firefox.\n *\n * If the escape key is pressed when a text input has not been changed manually\n * since being focused, the text input will revert to its previous value.\n * Firefox does not honor preventDefault for the escape key. The revert happens\n * after the keydown event and before every keypress. We therefore store the\n * element's value on keydown and restore it on keypress. The restore value is\n * nullified on keyup so that {@link #getValue} returns the correct value.\n *\n * IE and Chrome don't have this problem, Opera blurs in the input box\n * completely in a way that preventDefault on the escape key has no effect.\n * @param {goog.events.BrowserEvent} e The event object passed in to\n *     the event handler.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.handleEscapeKeys_ = function(e) {\n  if (e.keyCode == 27) {\n    if (e.type == goog.events.EventType.KEYDOWN) {\n      this.ffKeyRestoreValue_ = this.getElement().value;\n    } else if (e.type == goog.events.EventType.KEYPRESS) {\n      this.getElement().value = /** @type {string} */ (this.ffKeyRestoreValue_);\n    } else if (e.type == goog.events.EventType.KEYUP) {\n      this.ffKeyRestoreValue_ = null;\n    }\n    e.preventDefault();\n  }\n};\n\n\n/**\n * Handler for the submit event of the form element.\n * @param {goog.events.Event} e The event object passed in to the event handler.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.handleFormSubmit_ = function(e) {\n  if (!this.hasChanged()) {\n    this.getElement().value = '';\n    // allow form to be sent before restoring value\n    goog.Timer.callOnce(this.handleAfterSubmit_, 10, this);\n  }\n};\n\n\n/**\n * Restore value after submit\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.handleAfterSubmit_ = function() {\n  if (!this.hasChanged()) {\n    this.getElement().value = this.label_;\n  }\n};\n\n\n/**\n * Handler for the load event the window. This is needed because\n * IE sets defaultValue upon load.\n * @param {Event} e The event object passed in to the event handler.\n * @private\n */\ngoog.ui.LabelInput.prototype.handleWindowLoad_ = function(e) {\n  this.check_();\n};\n\n\n/**\n * @return {boolean} Whether the control is currently focused on.\n */\ngoog.ui.LabelInput.prototype.hasFocus = function() {\n  return this.hasFocus_;\n};\n\n\n/**\n * @return {boolean} Whether the value has been changed by the user.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.hasChanged = function() {\n  return !!this.getElement() && this.getElement().value != '' &&\n      this.getElement().value != this.label_;\n};\n\n\n/**\n * Clears the value of the input element without resetting the default text.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.clear = function() {\n  this.getElement().value = '';\n\n  // Reset ffKeyRestoreValue_ when non-null\n  if (this.ffKeyRestoreValue_ != null) {\n    this.ffKeyRestoreValue_ = '';\n  }\n};\n\n\n/**\n * Clears the value of the input element and resets the default text.\n */\ngoog.ui.LabelInput.prototype.reset = function() {\n  if (this.hasChanged()) {\n    this.clear();\n    this.check_();\n  }\n};\n\n\n/**\n * Use this to set the value through script to ensure that the label state is\n * up to date\n * @param {string} s The new value for the input.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.setValue = function(s) {\n  if (this.ffKeyRestoreValue_ != null) {\n    this.ffKeyRestoreValue_ = s;\n  }\n  this.getElement().value = s;\n  this.check_();\n};\n\n\n/**\n * Returns the current value of the text box, returning an empty string if the\n * search box is the default value\n * @return {string} The value of the input box.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.getValue = function() {\n  if (this.ffKeyRestoreValue_ != null) {\n    // Fix the Firefox from incorrectly reporting the value to calling code\n    // that attached the listener to keypress before the labelinput\n    return this.ffKeyRestoreValue_;\n  }\n  return this.hasChanged() ? /** @type {string} */ (this.getElement().value) :\n                                                   '';\n};\n\n\n/**\n * Sets the label text as aria-label, and placeholder when supported.\n * @param {string} label The text to show as the label.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.setLabel = function(label) {\n  var labelInputElement = this.getElement();\n\n  if (goog.ui.LabelInput.isPlaceholderSupported_()) {\n    if (labelInputElement) {\n      labelInputElement.placeholder = label;\n    }\n    this.label_ = label;\n  } else if (!this.hasChanged()) {\n    // The this.hasChanged() call relies on non-placeholder behavior checking\n    // prior to setting this.label_ - it also needs to happen prior to the\n    // this.restoreLabel_() call.\n    if (labelInputElement) {\n      labelInputElement.value = '';\n    }\n    this.label_ = label;\n    this.restoreLabel_();\n  }\n  // Check if this has been called before DOM structure building\n  if (labelInputElement) {\n    goog.a11y.aria.setState(\n        labelInputElement, goog.a11y.aria.State.LABEL, this.label_);\n  }\n};\n\n\n/**\n * @return {string} The text to show as the label.\n */\ngoog.ui.LabelInput.prototype.getLabel = function() {\n  return this.label_;\n};\n\n\n/**\n * Checks the state of the input element\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.check_ = function() {\n  var labelInputElement = this.getElement();\n  goog.asserts.assert(\n      labelInputElement, 'The label input element cannot be null.');\n  if (!goog.ui.LabelInput.isPlaceholderSupported_()) {\n    // if we haven't got a form yet try now\n    this.attachEventsToForm_();\n  } else if (this.getElement().placeholder != this.label_) {\n    this.getElement().placeholder = this.label_;\n  }\n  goog.a11y.aria.setState(\n      labelInputElement, goog.a11y.aria.State.LABEL, this.label_);\n\n  if (!this.hasChanged()) {\n    if (!this.inFocusAndSelect_ && !this.hasFocus_) {\n      var el = this.getElement();\n      goog.asserts.assert(el);\n      goog.dom.classlist.add(el, this.labelCssClassName);\n    }\n\n    // Allow browser to catchup with CSS changes before restoring the label.\n    if (!goog.ui.LabelInput.isPlaceholderSupported_()) {\n      goog.Timer.callOnce(this.restoreLabel_, this.labelRestoreDelayMs, this);\n    }\n  } else {\n    var el = this.getElement();\n    goog.asserts.assert(el);\n    goog.dom.classlist.remove(el, this.labelCssClassName);\n  }\n};\n\n\n/**\n * This method focuses the input and selects all the text. If the value hasn't\n * changed it will set the value to the label so that the label text is\n * selected.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.focusAndSelect = function() {\n  // We need to check whether the input has changed before focusing\n  var hc = this.hasChanged();\n  this.inFocusAndSelect_ = true;\n  this.getElement().focus();\n  if (!hc && !goog.ui.LabelInput.isPlaceholderSupported_()) {\n    this.getElement().value = this.label_;\n  }\n  this.getElement().select();\n\n  // Since the object now has focus, we won't get a focus event when they\n  // click in the input element. The expected behavior when you click on\n  // the default text is that it goes away and allows you to type...so we\n  // have to fire an artificial focus event when we're in focusAndSelect mode.\n  if (goog.ui.LabelInput.isPlaceholderSupported_()) {\n    return;\n  }\n  if (this.eventHandler_) {\n    this.eventHandler_.listenOnce(\n        this.getElement(), goog.events.EventType.CLICK, this.handleFocus_);\n  }\n\n  // set to false in timer to let IE trigger the focus event\n  goog.Timer.callOnce(this.focusAndSelect_, 10, this);\n};\n\n\n/**\n * Enables/Disables the label input.\n * @param {boolean} enabled Whether to enable (true) or disable (false) the\n *     label input.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.setEnabled = function(enabled) {\n  this.getElement().disabled = !enabled;\n  var el = this.getElement();\n  goog.asserts.assert(el);\n  goog.dom.classlist.enable(\n      el, goog.getCssName(this.labelCssClassName, 'disabled'), !enabled);\n};\n\n\n/**\n * @return {boolean} True if the label input is enabled, false otherwise.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.isEnabled = function() {\n  return !this.getElement().disabled;\n};\n\n\n/**\n * @private\n */\ngoog.ui.LabelInput.prototype.focusAndSelect_ = function() {\n  this.inFocusAndSelect_ = false;\n};\n\n\n/**\n * Sets the value of the input element to label.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.LabelInput.prototype.restoreLabel_ = function() {\n  // Check again in case something changed since this was scheduled.\n  // We check that the element is still there since this is called by a timer\n  // and the dispose method may have been called prior to this.\n  if (this.getElement() && !this.hasChanged() && !this.hasFocus_) {\n    this.getElement().value = this.label_;\n  }\n};\n","^;",1579837703000,"^<",["^=",["^1L","^1>","^1T","^3O","^1M","^1O","^1P","^1U","^?","^[","^1C","^3G","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/labelinput.js"],"^O",["^=",["^2W"]],"^W",true,"^X",["^?","^3O","^1O","^3G","^1L","^1>","^1U","^12","^1M","^1T","^1C","^1P","^["]],["^ ","^3",[1579837703000],"^4","goog.json.nativejsonprocessor.js","^5",["^6","goog/json/nativejsonprocessor.js"],"^7","goog/json/nativejsonprocessor.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Defines a class for parsing JSON using the browser's built in\n * JSON library.\n */\n\ngoog.provide('goog.json.NativeJsonProcessor');\n\ngoog.require('goog.asserts');\ngoog.require('goog.json.Processor');\n\n\n\n/**\n * A class that parses and stringifies JSON using the browser's built-in JSON\n * library, if it is available.\n *\n * Note that the native JSON api has subtle differences across browsers, so\n * use this implementation with care.  See json_test#assertSerialize\n * for details on the differences from goog.json.\n *\n * This implementation is signficantly faster than goog.json, at least on\n * Chrome.  See json_perf.html for a perf test showing the difference.\n *\n * @param {?goog.json.Replacer=} opt_replacer An optional replacer to use during\n *     serialization.\n * @param {?goog.json.Reviver=} opt_reviver An optional reviver to use during\n *     parsing.\n * @constructor\n * @implements {goog.json.Processor}\n * @final\n */\ngoog.json.NativeJsonProcessor = function(opt_replacer, opt_reviver) {\n  goog.asserts.assert(goog.global['JSON'] !== undefined, 'JSON not defined');\n\n  /**\n   * @type {goog.json.Replacer|null|undefined}\n   * @private\n   */\n  this.replacer_ = opt_replacer;\n\n  /**\n   * @type {goog.json.Reviver|null|undefined}\n   * @private\n   */\n  this.reviver_ = opt_reviver;\n};\n\n\n/** @override */\ngoog.json.NativeJsonProcessor.prototype.stringify = function(object) {\n  return goog.global['JSON'].stringify(object, this.replacer_);\n};\n\n\n/** @override */\ngoog.json.NativeJsonProcessor.prototype.parse = function(s) {\n  return goog.global['JSON'].parse(s, this.reviver_);\n};\n","^;",1579837703000,"^<",["^=",["^1L","^?","~$goog.json.Processor"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/json/nativejsonprocessor.js"],"^O",["^=",["~$goog.json.NativeJsonProcessor"]],"^W",true,"^X",["^?","^1L","^BK"]],["^ ","^3",[1579837703000],"^4","goog.ui.colormenubuttonrenderer.js","^5",["^6","goog/ui/colormenubuttonrenderer.js"],"^7","goog/ui/colormenubuttonrenderer.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for {@link goog.ui.ColorMenuButton}s.\n *\n * @author robbyw@google.com (Robby Walker)\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ColorMenuButtonRenderer');\n\ngoog.require('goog.asserts');\ngoog.require('goog.color');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.ui.MenuButtonRenderer');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Renderer for {@link goog.ui.ColorMenuButton}s.\n * @constructor\n * @extends {goog.ui.MenuButtonRenderer}\n */\ngoog.ui.ColorMenuButtonRenderer = function() {\n  goog.ui.MenuButtonRenderer.call(this);\n};\ngoog.inherits(goog.ui.ColorMenuButtonRenderer, goog.ui.MenuButtonRenderer);\ngoog.addSingletonGetter(goog.ui.ColorMenuButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.ColorMenuButtonRenderer.CSS_CLASS =\n    goog.getCssName('goog-color-menu-button');\n\n\n/**\n * Overrides the superclass implementation by wrapping the caption text or DOM\n * structure in a color indicator element.  Creates the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-menu-button-caption\">\n *      <div class=\"goog-color-menu-button-indicator\">\n *        Contents...\n *      </div>\n *    </div>\n *\n * The 'goog-color-menu-button-indicator' style should be defined to have a\n * bottom border of nonzero width and a default color that blends into its\n * background.\n * @param {goog.ui.ControlContent} content Text caption or DOM structure.\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {Element} Caption element.\n * @override\n */\ngoog.ui.ColorMenuButtonRenderer.prototype.createCaption = function(\n    content, dom) {\n  return goog.ui.ColorMenuButtonRenderer.superClass_.createCaption.call(\n      this, goog.ui.ColorMenuButtonRenderer.wrapCaption(content, dom), dom);\n};\n\n\n/**\n * Wrap a caption in a div with the color-menu-button-indicator CSS class.\n * @param {goog.ui.ControlContent} content Text caption or DOM structure.\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {!Element} Caption element.\n */\ngoog.ui.ColorMenuButtonRenderer.wrapCaption = function(content, dom) {\n  return dom.createDom(\n      goog.dom.TagName.DIV,\n      goog.getCssName(goog.ui.ColorMenuButtonRenderer.CSS_CLASS, 'indicator'),\n      content);\n};\n\n\n/**\n * Takes a color menu button control's root element and a value object\n * (which is assumed to be a color), and updates the button's DOM to reflect\n * the new color.  Overrides {@link goog.ui.ButtonRenderer#setValue}.\n * @param {Element} element The button control's root element (if rendered).\n * @param {*} value New value; assumed to be a color spec string.\n * @override\n */\ngoog.ui.ColorMenuButtonRenderer.prototype.setValue = function(element, value) {\n  if (element) {\n    goog.ui.ColorMenuButtonRenderer.setCaptionValue(\n        this.getContentElement(element), value);\n  }\n};\n\n\n/**\n * Takes a control's content element and a value object (which is assumed\n * to be a color), and updates its DOM to reflect the new color.\n * @param {Element} caption A content element of a control.\n * @param {*} value New value; assumed to be a color spec string.\n */\ngoog.ui.ColorMenuButtonRenderer.setCaptionValue = function(caption, value) {\n  // Assume that the caption's first child is the indicator.\n  if (caption && caption.firstChild) {\n    // Normalize the value to a hex color spec or null (otherwise setting\n    // borderBottomColor will cause a JS error on IE).\n    var hexColor;\n\n    var strValue = /** @type {string} */ (value);\n    hexColor = strValue && goog.color.isValidColor(strValue) ?\n        goog.color.parse(strValue).hex :\n        null;\n\n    // Stupid IE6/7 doesn't do transparent borders.\n    // TODO(attila): Add user-agent version check when IE8 comes out...\n    caption.firstChild.style.borderBottomColor =\n        hexColor || (goog.userAgent.IE ? '' : 'transparent');\n  }\n};\n\n\n/**\n * Initializes the button's DOM when it enters the document.  Overrides the\n * superclass implementation by making sure the button's color indicator is\n * initialized.\n * @param {goog.ui.Control} button goog.ui.ColorMenuButton whose DOM is to be\n *     initialized as it enters the document.\n * @override\n */\ngoog.ui.ColorMenuButtonRenderer.prototype.initializeDom = function(button) {\n  var buttonElement = button.getElement();\n  goog.asserts.assert(buttonElement);\n  this.setValue(buttonElement, button.getValue());\n  goog.dom.classlist.add(\n      buttonElement, goog.ui.ColorMenuButtonRenderer.CSS_CLASS);\n  goog.ui.ColorMenuButtonRenderer.superClass_.initializeDom.call(this, button);\n};\n","^;",1579837703000,"^<",["^=",["^1L","^1M","^9N","^?","~$goog.ui.MenuButtonRenderer","^[","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/colormenubuttonrenderer.js"],"^O",["^=",["~$goog.ui.ColorMenuButtonRenderer"]],"^W",true,"^X",["^?","^1L","^9N","^12","^1M","^BM","^["]],["^ ","^3",[1579837703000],"^4","goog.dom.abstractrange.js","^5",["^6","goog/dom/abstractrange.js"],"^7","goog/dom/abstractrange.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Interface definitions for working with ranges\n * in HTML documents.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.dom.AbstractRange');\ngoog.provide('goog.dom.RangeIterator');\ngoog.provide('goog.dom.RangeType');\n\ngoog.forwardDeclare('goog.dom.TextRange');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.SavedCaretRange');\ngoog.require('goog.dom.TagIterator');\ngoog.require('goog.userAgent');\n\n\n/**\n * Types of ranges.\n * @enum {string}\n */\ngoog.dom.RangeType = {\n  TEXT: 'text',\n  CONTROL: 'control',\n  MULTI: 'mutli'\n};\n\n\n\n/**\n * Creates a new selection with no properties.  Do not use this constructor -\n * use one of the goog.dom.Range.from* methods instead.\n * @constructor\n */\ngoog.dom.AbstractRange = function() {};\n\n\n/**\n * Gets the browser native selection object from the given window.\n * @param {Window} win The window to get the selection object from.\n * @return {Object} The browser native selection object, or null if it could\n *     not be retrieved.\n */\ngoog.dom.AbstractRange.getBrowserSelectionForWindow = function(win) {\n  if (win.getSelection) {\n    // W3C\n    return win.getSelection();\n  } else {\n    // IE\n    var doc = win.document;\n    var sel = doc.selection;\n    if (sel) {\n      // IE has a bug where it sometimes returns a selection from the wrong\n      // document. Catching these cases now helps us avoid problems later.\n      try {\n        var range = sel.createRange();\n        // Only TextRanges have a parentElement method.\n        if (range.parentElement) {\n          if (range.parentElement().document != doc) {\n            return null;\n          }\n        } else if (\n            !range.length ||\n            /** @type {ControlRange} */ (range).item(0).document != doc) {\n          // For ControlRanges, check that the range has items, and that\n          // the first item in the range is in the correct document.\n          return null;\n        }\n      } catch (e) {\n        // If the selection is in the wrong document, and the wrong document is\n        // in a different domain, IE will throw an exception.\n        return null;\n      }\n      // TODO(user|robbyw) Sometimes IE 6 returns a selection instance\n      // when there is no selection.  This object has a 'type' property equals\n      // to 'None' and a typeDetail property bound to undefined. Ideally this\n      // function should not return this instance.\n      return sel;\n    }\n    return null;\n  }\n};\n\n\n/**\n * Tests if the given Object is a controlRange.\n * @param {Object} range The range object to test.\n * @return {boolean} Whether the given Object is a controlRange.\n */\ngoog.dom.AbstractRange.isNativeControlRange = function(range) {\n  // For now, tests for presence of a control range function.\n  return !!range && !!range.addElement;\n};\n\n\n/**\n * @return {!goog.dom.AbstractRange} A clone of this range.\n */\ngoog.dom.AbstractRange.prototype.clone = goog.abstractMethod;\n\n\n/**\n * @return {goog.dom.RangeType} The type of range represented by this object.\n */\ngoog.dom.AbstractRange.prototype.getType = goog.abstractMethod;\n\n\n/**\n * @return {Range|TextRange} The native browser range object.\n */\ngoog.dom.AbstractRange.prototype.getBrowserRangeObject = goog.abstractMethod;\n\n\n/**\n * Sets the native browser range object, overwriting any state this range was\n * storing.\n * @param {Range|TextRange} nativeRange The native browser range object.\n * @return {boolean} Whether the given range was accepted.  If not, the caller\n *     will need to call goog.dom.Range.createFromBrowserRange to create a new\n *     range object.\n */\ngoog.dom.AbstractRange.prototype.setBrowserRangeObject = function(nativeRange) {\n  return false;\n};\n\n\n/**\n * @return {number} The number of text ranges in this range.\n */\ngoog.dom.AbstractRange.prototype.getTextRangeCount = goog.abstractMethod;\n\n\n/**\n * Get the i-th text range in this range.  The behavior is undefined if\n * i >= getTextRangeCount or i < 0.\n * @param {number} i The range number to retrieve.\n * @return {goog.dom.TextRange} The i-th text range.\n */\ngoog.dom.AbstractRange.prototype.getTextRange = goog.abstractMethod;\n\n\n/**\n * Gets an array of all text ranges this range is comprised of.  For non-multi\n * ranges, returns a single element array containing this.\n * @return {!Array<goog.dom.TextRange>} Array of text ranges.\n */\ngoog.dom.AbstractRange.prototype.getTextRanges = function() {\n  var output = [];\n  for (var i = 0, len = this.getTextRangeCount(); i < len; i++) {\n    output.push(this.getTextRange(i));\n  }\n  return output;\n};\n\n\n/**\n * @return {Node} The deepest node that contains the entire range.\n */\ngoog.dom.AbstractRange.prototype.getContainer = goog.abstractMethod;\n\n\n/**\n * Returns the deepest element in the tree that contains the entire range.\n * @return {Element} The deepest element that contains the entire range.\n */\ngoog.dom.AbstractRange.prototype.getContainerElement = function() {\n  var node = this.getContainer();\n  return /** @type {Element} */ (\n      node.nodeType == goog.dom.NodeType.ELEMENT ? node : node.parentNode);\n};\n\n\n/**\n * @return {Node} The element or text node the range starts in.  For text\n *     ranges, the range comprises all text between the start and end position.\n *     For other types of range, start and end give bounds of the range but\n *     do not imply all nodes in those bounds are selected.\n */\ngoog.dom.AbstractRange.prototype.getStartNode = goog.abstractMethod;\n\n\n/**\n * @return {number} The offset into the node the range starts in.  For text\n *     nodes, this is an offset into the node value.  For elements, this is\n *     an offset into the childNodes array.\n */\ngoog.dom.AbstractRange.prototype.getStartOffset = goog.abstractMethod;\n\n\n/**\n * @return {goog.math.Coordinate} The coordinate of the selection start node\n *     and offset.\n */\ngoog.dom.AbstractRange.prototype.getStartPosition = goog.abstractMethod;\n\n\n/**\n * @return {Node} The element or text node the range ends in.\n */\ngoog.dom.AbstractRange.prototype.getEndNode = goog.abstractMethod;\n\n\n/**\n * @return {number} The offset into the node the range ends in.  For text\n *     nodes, this is an offset into the node value.  For elements, this is\n *     an offset into the childNodes array.\n */\ngoog.dom.AbstractRange.prototype.getEndOffset = goog.abstractMethod;\n\n\n/**\n * @return {goog.math.Coordinate} The coordinate of the selection end\n *     node and offset.\n */\ngoog.dom.AbstractRange.prototype.getEndPosition = goog.abstractMethod;\n\n\n/**\n * @return {Node} The element or text node the range is anchored at.\n */\ngoog.dom.AbstractRange.prototype.getAnchorNode = function() {\n  return this.isReversed() ? this.getEndNode() : this.getStartNode();\n};\n\n\n/**\n * @return {number} The offset into the node the range is anchored at.  For\n *     text nodes, this is an offset into the node value.  For elements, this\n *     is an offset into the childNodes array.\n */\ngoog.dom.AbstractRange.prototype.getAnchorOffset = function() {\n  return this.isReversed() ? this.getEndOffset() : this.getStartOffset();\n};\n\n\n/**\n * @return {Node} The element or text node the range is focused at - i.e. where\n *     the cursor is.\n */\ngoog.dom.AbstractRange.prototype.getFocusNode = function() {\n  return this.isReversed() ? this.getStartNode() : this.getEndNode();\n};\n\n\n/**\n * @return {number} The offset into the node the range is focused at - i.e.\n *     where the cursor is.  For text nodes, this is an offset into the node\n *     value.  For elements, this is an offset into the childNodes array.\n */\ngoog.dom.AbstractRange.prototype.getFocusOffset = function() {\n  return this.isReversed() ? this.getStartOffset() : this.getEndOffset();\n};\n\n\n/**\n * @return {boolean} Whether the selection is reversed.\n */\ngoog.dom.AbstractRange.prototype.isReversed = function() {\n  return false;\n};\n\n\n/**\n * @return {!Document} The document this selection is a part of.\n */\ngoog.dom.AbstractRange.prototype.getDocument = function() {\n  // Using start node in IE was crashing the browser in some cases so use\n  // getContainer for that browser. It's also faster for IE, but still slower\n  // than start node for other browsers so we continue to use getStartNode when\n  // it is not problematic. See bug 1687309.\n  return goog.dom.getOwnerDocument(\n      goog.userAgent.IE ? this.getContainer() : this.getStartNode());\n};\n\n\n/**\n * @return {!Window} The window this selection is a part of.\n */\ngoog.dom.AbstractRange.prototype.getWindow = function() {\n  return goog.dom.getWindow(this.getDocument());\n};\n\n\n/**\n * Tests if this range contains the given range.\n * @param {goog.dom.AbstractRange} range The range to test.\n * @param {boolean=} opt_allowPartial If true, the range can be partially\n *     contained in the selection, otherwise the range must be entirely\n *     contained.\n * @return {boolean} Whether this range contains the given range.\n */\ngoog.dom.AbstractRange.prototype.containsRange = goog.abstractMethod;\n\n\n/**\n * Tests if this range contains the given node.\n * @param {Node} node The node to test for.\n * @param {boolean=} opt_allowPartial If not set or false, the node must be\n *     entirely contained in the selection for this function to return true.\n * @return {boolean} Whether this range contains the given node.\n */\ngoog.dom.AbstractRange.prototype.containsNode = goog.abstractMethod;\n\n\n\n/**\n * Tests whether this range is valid (i.e. whether its endpoints are still in\n * the document).  A range becomes invalid when, after this object was created,\n * either one or both of its endpoints are removed from the document.  Use of\n * an invalid range can lead to runtime errors, particularly in IE.\n * @return {boolean} Whether the range is valid.\n */\ngoog.dom.AbstractRange.prototype.isRangeInDocument = goog.abstractMethod;\n\n\n/**\n * @return {boolean} Whether the range is collapsed.\n */\ngoog.dom.AbstractRange.prototype.isCollapsed = goog.abstractMethod;\n\n\n/**\n * @return {string} The text content of the range.\n */\ngoog.dom.AbstractRange.prototype.getText = goog.abstractMethod;\n\n\n/**\n * Returns the HTML fragment this range selects.  This is slow on all browsers.\n * The HTML fragment may not be valid HTML, for instance if the user selects\n * from a to b inclusively in the following html:\n *\n * &lt;div&gt;a&lt;/div&gt;b\n *\n * This method will return\n *\n * a&lt;/div&gt;b\n *\n * If you need valid HTML, use {@link #getValidHtml} instead.\n *\n * @return {string} HTML fragment of the range, does not include context\n *     containing elements.\n */\ngoog.dom.AbstractRange.prototype.getHtmlFragment = goog.abstractMethod;\n\n\n/**\n * Returns valid HTML for this range.  This is fast on IE, and semi-fast on\n * other browsers.\n * @return {string} Valid HTML of the range, including context containing\n *     elements.\n */\ngoog.dom.AbstractRange.prototype.getValidHtml = goog.abstractMethod;\n\n\n/**\n * Returns pastable HTML for this range.  This guarantees that any child items\n * that must have specific ancestors will have them, for instance all TDs will\n * be contained in a TR in a TBODY in a TABLE and all LIs will be contained in\n * a UL or OL as appropriate.  This is semi-fast on all browsers.\n * @return {string} Pastable HTML of the range, including context containing\n *     elements.\n */\ngoog.dom.AbstractRange.prototype.getPastableHtml = goog.abstractMethod;\n\n\n/**\n * Returns a RangeIterator over the contents of the range.  Regardless of the\n * direction of the range, the iterator will move in document order.\n * @param {boolean=} opt_keys Unused for this iterator.\n * @return {!goog.dom.RangeIterator} An iterator over tags in the range.\n */\ngoog.dom.AbstractRange.prototype.__iterator__ = goog.abstractMethod;\n\n\n// RANGE ACTIONS\n\n\n/**\n * Sets this range as the selection in its window.\n */\ngoog.dom.AbstractRange.prototype.select = goog.abstractMethod;\n\n\n/**\n * Removes the contents of the range from the document.\n */\ngoog.dom.AbstractRange.prototype.removeContents = goog.abstractMethod;\n\n\n/**\n * Inserts a node before (or after) the range.  The range may be disrupted\n * beyond recovery because of the way this splits nodes.\n * @param {Node} node The node to insert.\n * @param {boolean} before True to insert before, false to insert after.\n * @return {Node} The node added to the document.  This may be different\n *     than the node parameter because on IE we have to clone it.\n */\ngoog.dom.AbstractRange.prototype.insertNode = goog.abstractMethod;\n\n\n/**\n * Replaces the range contents with (possibly a copy of) the given node.  The\n * range may be disrupted beyond recovery because of the way this splits nodes.\n * @param {Node} node The node to insert.\n * @return {Node} The node added to the document.  This may be different\n *     than the node parameter because on IE we have to clone it.\n */\ngoog.dom.AbstractRange.prototype.replaceContentsWithNode = function(node) {\n  if (!this.isCollapsed()) {\n    this.removeContents();\n  }\n\n  return this.insertNode(node, true);\n};\n\n\n/**\n * Surrounds this range with the two given nodes.  The range may be disrupted\n * beyond recovery because of the way this splits nodes.\n * @param {Element} startNode The node to insert at the start.\n * @param {Element} endNode The node to insert at the end.\n */\ngoog.dom.AbstractRange.prototype.surroundWithNodes = goog.abstractMethod;\n\n\n// SAVE/RESTORE\n\n\n/**\n * Saves the range so that if the start and end nodes are left alone, it can\n * be restored.\n * @return {!goog.dom.SavedRange} A range representation that can be restored\n *     as long as the endpoint nodes of the selection are not modified.\n */\ngoog.dom.AbstractRange.prototype.saveUsingDom = goog.abstractMethod;\n\n\n/**\n * Saves the range using HTML carets. As long as the carets remained in the\n * HTML, the range can be restored...even when the HTML is copied across\n * documents.\n * @return {goog.dom.SavedCaretRange?} A range representation that can be\n *     restored as long as carets are not removed. Returns null if carets\n *     could not be created.\n */\ngoog.dom.AbstractRange.prototype.saveUsingCarets = function() {\n  return (this.getStartNode() && this.getEndNode()) ?\n      new goog.dom.SavedCaretRange(this) :\n      null;\n};\n\n\n// RANGE MODIFICATION\n\n\n/**\n * Collapses the range to one of its boundary points.\n * @param {boolean} toAnchor Whether to collapse to the anchor of the range.\n */\ngoog.dom.AbstractRange.prototype.collapse = goog.abstractMethod;\n\n// RANGE ITERATION\n\n\n\n/**\n * Subclass of goog.dom.TagIterator that iterates over a DOM range.  It\n * adds functions to determine the portion of each text node that is selected.\n * @param {Node} node The node to start traversal at.  When null, creates an\n *     empty iterator.\n * @param {boolean=} opt_reverse Whether to traverse nodes in reverse.\n * @constructor\n * @extends {goog.dom.TagIterator}\n */\ngoog.dom.RangeIterator = function(node, opt_reverse) {\n  goog.dom.TagIterator.call(this, node, opt_reverse, true);\n};\ngoog.inherits(goog.dom.RangeIterator, goog.dom.TagIterator);\n\n\n/**\n * @return {number} The offset into the current node, or -1 if the current node\n *     is not a text node.\n */\ngoog.dom.RangeIterator.prototype.getStartTextOffset = goog.abstractMethod;\n\n\n/**\n * @return {number} The end offset into the current node, or -1 if the current\n *     node is not a text node.\n */\ngoog.dom.RangeIterator.prototype.getEndTextOffset = goog.abstractMethod;\n\n\n/**\n * @return {Node} node The iterator's start node.\n */\ngoog.dom.RangeIterator.prototype.getStartNode = goog.abstractMethod;\n\n\n/**\n * @return {Node} The iterator's end node.\n */\ngoog.dom.RangeIterator.prototype.getEndNode = goog.abstractMethod;\n\n\n/**\n * @return {boolean} Whether a call to next will fail.\n */\ngoog.dom.RangeIterator.prototype.isLast = goog.abstractMethod;\n","^;",1579837703000,"^<",["^=",["^1>","^8P","^2K","~$goog.dom.SavedCaretRange","^?","^["]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/abstractrange.js"],"^O",["^=",["^AJ","~$goog.dom.RangeType","^88"]],"^W",true,"^X",["^?","^1>","^2K","^BO","^8P","^["]],["^ ","^3",[1579837703000],"^4","goog.html.safestylesheet.js","^5",["^6","goog/html/safestylesheet.js"],"^7","goog/html/safestylesheet.js","^8","^9","^:","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The SafeStyleSheet type and its builders.\n *\n * TODO(xtof): Link to document stating type contract.\n */\n\ngoog.provide('goog.html.SafeStyleSheet');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.html.SafeStyle');\ngoog.require('goog.object');\ngoog.require('goog.string.Const');\ngoog.require('goog.string.TypedString');\ngoog.require('goog.string.internal');\n\n\n\n/**\n * A string-like object which represents a CSS style sheet and that carries the\n * security type contract that its value, as a string, will not cause untrusted\n * script execution (XSS) when evaluated as CSS in a browser.\n *\n * Instances of this type must be created via the factory method\n * `goog.html.SafeStyleSheet.fromConstant` and not by invoking its\n * constructor. The constructor intentionally takes no parameters and the type\n * is immutable; hence only a default instance corresponding to the empty string\n * can be obtained via constructor invocation.\n *\n * A SafeStyleSheet's string representation can safely be interpolated as the\n * content of a style element within HTML. The SafeStyleSheet string should\n * not be escaped before interpolation.\n *\n * Values of this type must be composable, i.e. for any two values\n * `styleSheet1` and `styleSheet2` of this type,\n * {@code goog.html.SafeStyleSheet.unwrap(styleSheet1) +\n * goog.html.SafeStyleSheet.unwrap(styleSheet2)} must itself be a value that\n * satisfies the SafeStyleSheet type constraint. This requirement implies that\n * for any value `styleSheet` of this type,\n * `goog.html.SafeStyleSheet.unwrap(styleSheet1)` must end in\n * \"beginning of rule\" context.\n\n * A SafeStyleSheet can be constructed via security-reviewed unchecked\n * conversions. In this case producers of SafeStyleSheet must ensure themselves\n * that the SafeStyleSheet does not contain unsafe script. Note in particular\n * that {@code &lt;} is dangerous, even when inside CSS strings, and so should\n * always be forbidden or CSS-escaped in user controlled input. For example, if\n * {@code &lt;/style&gt;&lt;script&gt;evil&lt;/script&gt;\"} were interpolated\n * inside a CSS string, it would break out of the context of the original\n * style element and `evil` would execute. Also note that within an HTML\n * style (raw text) element, HTML character references, such as\n * {@code &amp;lt;}, are not allowed. See\n *\n http://www.w3.org/TR/html5/scripting-1.html#restrictions-for-contents-of-script-elements\n * (similar considerations apply to the style element).\n *\n * @see goog.html.SafeStyleSheet#fromConstant\n * @constructor\n * @final\n * @struct\n * @implements {goog.string.TypedString}\n */\ngoog.html.SafeStyleSheet = function() {\n  /**\n   * The contained value of this SafeStyleSheet.  The field has a purposely\n   * ugly name to make (non-compiled) code that attempts to directly access this\n   * field stand out.\n   * @private {string}\n   */\n  this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_ = '';\n\n  /**\n   * A type marker used to implement additional run-time type checking.\n   * @see goog.html.SafeStyleSheet#unwrap\n   * @const {!Object}\n   * @private\n   */\n  this.SAFE_STYLE_SHEET_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =\n      goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;\n};\n\n\n/**\n * @override\n * @const\n */\ngoog.html.SafeStyleSheet.prototype.implementsGoogStringTypedString = true;\n\n\n/**\n * Type marker for the SafeStyleSheet type, used to implement additional\n * run-time type checking.\n * @const {!Object}\n * @private\n */\ngoog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};\n\n\n/**\n * Creates a style sheet consisting of one selector and one style definition.\n * Use {@link goog.html.SafeStyleSheet.concat} to create longer style sheets.\n * This function doesn't support @import, @media and similar constructs.\n * @param {string} selector CSS selector, e.g. '#id' or 'tag .class, #id'. We\n *     support CSS3 selectors: https://w3.org/TR/css3-selectors/#selectors.\n * @param {!goog.html.SafeStyle.PropertyMap|!goog.html.SafeStyle} style Style\n *     definition associated with the selector.\n * @return {!goog.html.SafeStyleSheet}\n * @throws {Error} If invalid selector is provided.\n */\ngoog.html.SafeStyleSheet.createRule = function(selector, style) {\n  if (goog.string.internal.contains(selector, '<')) {\n    throw new Error('Selector does not allow \\'<\\', got: ' + selector);\n  }\n\n  // Remove strings.\n  var selectorToCheck =\n      selector.replace(/('|\")((?!\\1)[^\\r\\n\\f\\\\]|\\\\[\\s\\S])*\\1/g, '');\n\n  // Check characters allowed in CSS3 selectors.\n  if (!/^[-_a-zA-Z0-9#.:* ,>+~[\\]()=^$|]+$/.test(selectorToCheck)) {\n    throw new Error(\n        'Selector allows only [-_a-zA-Z0-9#.:* ,>+~[\\\\]()=^$|] and ' +\n        'strings, got: ' + selector);\n  }\n\n  // Check balanced () and [].\n  if (!goog.html.SafeStyleSheet.hasBalancedBrackets_(selectorToCheck)) {\n    throw new Error('() and [] in selector must be balanced, got: ' + selector);\n  }\n\n  if (!(style instanceof goog.html.SafeStyle)) {\n    style = goog.html.SafeStyle.create(style);\n  }\n  var styleSheet = selector + '{' +\n      goog.html.SafeStyle.unwrap(style).replace(/</g, '\\\\3C ') + '}';\n  return goog.html.SafeStyleSheet\n      .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(styleSheet);\n};\n\n\n/**\n * Checks if a string has balanced () and [] brackets.\n * @param {string} s String to check.\n * @return {boolean}\n * @private\n */\ngoog.html.SafeStyleSheet.hasBalancedBrackets_ = function(s) {\n  var brackets = {'(': ')', '[': ']'};\n  var expectedBrackets = [];\n  for (var i = 0; i < s.length; i++) {\n    var ch = s[i];\n    if (brackets[ch]) {\n      expectedBrackets.push(brackets[ch]);\n    } else if (goog.object.contains(brackets, ch)) {\n      if (expectedBrackets.pop() != ch) {\n        return false;\n      }\n    }\n  }\n  return expectedBrackets.length == 0;\n};\n\n\n/**\n * Creates a new SafeStyleSheet object by concatenating values.\n * @param {...(!goog.html.SafeStyleSheet|!Array<!goog.html.SafeStyleSheet>)}\n *     var_args Values to concatenate.\n * @return {!goog.html.SafeStyleSheet}\n */\ngoog.html.SafeStyleSheet.concat = function(var_args) {\n  var result = '';\n\n  /**\n   * @param {!goog.html.SafeStyleSheet|!Array<!goog.html.SafeStyleSheet>}\n   *     argument\n   */\n  var addArgument = function(argument) {\n    if (goog.isArray(argument)) {\n      goog.array.forEach(argument, addArgument);\n    } else {\n      result += goog.html.SafeStyleSheet.unwrap(argument);\n    }\n  };\n\n  goog.array.forEach(arguments, addArgument);\n  return goog.html.SafeStyleSheet\n      .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(result);\n};\n\n\n/**\n * Creates a SafeStyleSheet object from a compile-time constant string.\n *\n * `styleSheet` must not have any &lt; characters in it, so that\n * the syntactic structure of the surrounding HTML is not affected.\n *\n * @param {!goog.string.Const} styleSheet A compile-time-constant string from\n *     which to create a SafeStyleSheet.\n * @return {!goog.html.SafeStyleSheet} A SafeStyleSheet object initialized to\n *     `styleSheet`.\n */\ngoog.html.SafeStyleSheet.fromConstant = function(styleSheet) {\n  var styleSheetString = goog.string.Const.unwrap(styleSheet);\n  if (styleSheetString.length === 0) {\n    return goog.html.SafeStyleSheet.EMPTY;\n  }\n  // > is a valid character in CSS selectors and there's no strict need to\n  // block it if we already block <.\n  goog.asserts.assert(\n      !goog.string.internal.contains(styleSheetString, '<'),\n      'Forbidden \\'<\\' character in style sheet string: ' + styleSheetString);\n  return goog.html.SafeStyleSheet\n      .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(styleSheetString);\n};\n\n\n/**\n * Returns this SafeStyleSheet's value as a string.\n *\n * IMPORTANT: In code where it is security relevant that an object's type is\n * indeed `SafeStyleSheet`, use `goog.html.SafeStyleSheet.unwrap`\n * instead of this method. If in doubt, assume that it's security relevant. In\n * particular, note that goog.html functions which return a goog.html type do\n * not guarantee the returned instance is of the right type. For example:\n *\n * <pre>\n * var fakeSafeHtml = new String('fake');\n * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;\n * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);\n * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by\n * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml\n * // instanceof goog.html.SafeHtml.\n * </pre>\n *\n * @see goog.html.SafeStyleSheet#unwrap\n * @override\n */\ngoog.html.SafeStyleSheet.prototype.getTypedStringValue = function() {\n  return this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_;\n};\n\n\nif (goog.DEBUG) {\n  /**\n   * Returns a debug string-representation of this value.\n   *\n   * To obtain the actual string value wrapped in a SafeStyleSheet, use\n   * `goog.html.SafeStyleSheet.unwrap`.\n   *\n   * @see goog.html.SafeStyleSheet#unwrap\n   * @override\n   */\n  goog.html.SafeStyleSheet.prototype.toString = function() {\n    return 'SafeStyleSheet{' +\n        this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_ + '}';\n  };\n}\n\n\n/**\n * Performs a runtime check that the provided object is indeed a\n * SafeStyleSheet object, and returns its value.\n *\n * @param {!goog.html.SafeStyleSheet} safeStyleSheet The object to extract from.\n * @return {string} The safeStyleSheet object's contained string, unless\n *     the run-time type check fails. In that case, `unwrap` returns an\n *     innocuous string, or, if assertions are enabled, throws\n *     `goog.asserts.AssertionError`.\n */\ngoog.html.SafeStyleSheet.unwrap = function(safeStyleSheet) {\n  // Perform additional Run-time type-checking to ensure that\n  // safeStyleSheet is indeed an instance of the expected type.  This\n  // provides some additional protection against security bugs due to\n  // application code that disables type checks.\n  // Specifically, the following checks are performed:\n  // 1. The object is an instance of the expected type.\n  // 2. The object is not an instance of a subclass.\n  // 3. The object carries a type marker for the expected type. \"Faking\" an\n  // object requires a reference to the type marker, which has names intended\n  // to stand out in code reviews.\n  if (safeStyleSheet instanceof goog.html.SafeStyleSheet &&\n      safeStyleSheet.constructor === goog.html.SafeStyleSheet &&\n      safeStyleSheet\n              .SAFE_STYLE_SHEET_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===\n          goog.html.SafeStyleSheet.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {\n    return safeStyleSheet.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_;\n  } else {\n    goog.asserts.fail('expected object of type SafeStyleSheet, got \\'' +\n        safeStyleSheet + '\\' of type ' + goog.typeOf(safeStyleSheet));\n    return 'type_error:SafeStyleSheet';\n  }\n};\n\n\n/**\n * Package-internal utility method to create SafeStyleSheet instances.\n *\n * @param {string} styleSheet The string to initialize the SafeStyleSheet\n *     object with.\n * @return {!goog.html.SafeStyleSheet} The initialized SafeStyleSheet object.\n * @package\n */\ngoog.html.SafeStyleSheet.createSafeStyleSheetSecurityPrivateDoNotAccessOrElse =\n    function(styleSheet) {\n  return new goog.html.SafeStyleSheet().initSecurityPrivateDoNotAccessOrElse_(\n      styleSheet);\n};\n\n\n/**\n * Called from createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(). This\n * method exists only so that the compiler can dead code eliminate static\n * fields (like EMPTY) when they're not accessed.\n * @param {string} styleSheet\n * @return {!goog.html.SafeStyleSheet}\n * @private\n */\ngoog.html.SafeStyleSheet.prototype.initSecurityPrivateDoNotAccessOrElse_ =\n    function(styleSheet) {\n  this.privateDoNotAccessOrElseSafeStyleSheetWrappedValue_ = styleSheet;\n  return this;\n};\n\n\n/**\n * A SafeStyleSheet instance corresponding to the empty string.\n * @const {!goog.html.SafeStyleSheet}\n */\ngoog.html.SafeStyleSheet.EMPTY =\n    goog.html.SafeStyleSheet\n        .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse('');\n","^;",1579837703000,"^<",["^=",["^1L","^B7","^?","^42","^3Q","^4E","^4G","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/safestylesheet.js"],"^O",["^=",["^4F"]],"^W",true,"^X",["^?","^2O","^1L","^4E","^42","^3Q","^B7","^4G"]],["^ ","^3",[1579837703000],"^4","goog.storage.collectablestorage.js","^5",["^6","goog/storage/collectablestorage.js"],"^7","goog/storage/collectablestorage.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a convenient API for data persistence with data\n * expiration and user-initiated expired key collection.\n *\n */\n\ngoog.provide('goog.storage.CollectableStorage');\n\ngoog.forwardDeclare('goog.storage.mechanism.IterableMechanism');\ngoog.require('goog.array');\ngoog.require('goog.iter');\ngoog.require('goog.storage.ErrorCode');\ngoog.require('goog.storage.ExpiringStorage');\ngoog.require('goog.storage.RichStorage');\n\n\n\n/**\n * Provides a storage with expiring keys and a collection method.\n *\n * @param {!goog.storage.mechanism.IterableMechanism} mechanism The underlying\n *     storage mechanism.\n * @constructor\n * @struct\n * @extends {goog.storage.ExpiringStorage}\n */\ngoog.storage.CollectableStorage = function(mechanism) {\n  goog.storage.CollectableStorage.base(this, 'constructor', mechanism);\n};\ngoog.inherits(goog.storage.CollectableStorage, goog.storage.ExpiringStorage);\n\n\n/**\n * Iterate over keys and returns those that expired.\n *\n * @param {goog.iter.Iterable} keys keys to iterate over.\n * @param {boolean=} opt_strict Also return invalid keys.\n * @return {!Array<string>} Keys of values that expired.\n * @private\n */\ngoog.storage.CollectableStorage.prototype.getExpiredKeys_ = function(\n    keys, opt_strict) {\n  var keysToRemove = [];\n  goog.iter.forEach(keys, function(key) {\n    // Get the wrapper.\n    var wrapper;\n\n    try {\n      wrapper = goog.storage.CollectableStorage.prototype.getWrapper.call(\n          this, key, true);\n    } catch (ex) {\n      if (ex == goog.storage.ErrorCode.INVALID_VALUE) {\n        // Bad wrappers are removed in strict mode.\n        if (opt_strict) {\n          keysToRemove.push(key);\n        }\n        // Skip over bad wrappers and continue.\n        return;\n      }\n      // Unknown error, escalate.\n      throw ex;\n    }\n    if (wrapper === undefined) {\n      // A value for a given key is no longer available. Clean it up.\n      keysToRemove.push(key);\n      return;\n    }\n    // Remove expired objects.\n    if (goog.storage.ExpiringStorage.isExpired(wrapper)) {\n      keysToRemove.push(key);\n      // Continue with the next key.\n      return;\n    }\n    // Objects which can't be decoded are removed in strict mode.\n    if (opt_strict) {\n\n      try {\n        goog.storage.RichStorage.Wrapper.unwrap(wrapper);\n      } catch (ex) {\n        if (ex == goog.storage.ErrorCode.INVALID_VALUE) {\n          keysToRemove.push(key);\n          // Skip over bad wrappers and continue.\n          return;\n        }\n        // Unknown error, escalate.\n        throw ex;\n      }\n    }\n  }, this);\n  return keysToRemove;\n};\n\n\n/**\n * Cleans up the storage by removing expired keys.\n *\n * @param {goog.iter.Iterable} keys List of all keys.\n * @param {boolean=} opt_strict Also remove invalid keys.\n * @return {!Array<string>} a list of expired keys.\n * @protected\n */\ngoog.storage.CollectableStorage.prototype.collectInternal = function(\n    keys, opt_strict) {\n  var keysToRemove = this.getExpiredKeys_(keys, opt_strict);\n  goog.array.forEach(keysToRemove, function(key) {\n    goog.storage.CollectableStorage.prototype.remove.call(this, key);\n  }, this);\n  return keysToRemove;\n};\n\n\n/**\n * Cleans up the storage by removing expired keys.\n *\n * @param {boolean=} opt_strict Also remove invalid keys.\n */\ngoog.storage.CollectableStorage.prototype.collect = function(opt_strict) {\n  this.collectInternal(\n      /** @type {goog.storage.mechanism.IterableMechanism} */ (this.mechanism)\n          .__iterator__(true),\n      opt_strict);\n};\n","^;",1579837703000,"^<",["^=",["^8O","^@I","^3K","^?","^2O","~$goog.storage.ExpiringStorage"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/collectablestorage.js"],"^O",["^=",["^@K"]],"^W",true,"^X",["^?","^2O","^8O","^3K","^BQ","^@I"]],["^ ","^3",[1579837703000],"^4","goog.db.db.js","^5",["^6","goog/db/db.js"],"^7","goog/db/db.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Wrappers for the HTML5 IndexedDB. The wrappers export nearly\n * the same interface as the standard API, but return goog.async.Deferred\n * objects instead of request objects and use Closure events. The wrapper works\n * and has been tested on Chrome version 22+. It may work on older Chrome\n * versions, but they aren't explicitly supported.\n *\n * Example usage:\n *\n *  <code>\n *  goog.db.openDatabase('mydb', 1, function(ev, db, tx) {\n *    db.createObjectStore('mystore');\n *  }).addCallback(function(db) {\n *    var putTx = db.createTransaction(\n *        [],\n *        goog.db.Transaction.TransactionMode.READ_WRITE);\n *    var store = putTx.objectStore('mystore');\n *    store.put('value', 'key');\n *    goog.listen(putTx, goog.db.Transaction.EventTypes.COMPLETE, function() {\n *      var getTx = db.createTransaction([]);\n *      var request = getTx.objectStore('mystore').get('key');\n *      request.addCallback(function(result) {\n *        ...\n *      });\n *  });\n *  </code>\n *\n */\n\n\ngoog.provide('goog.db');\ngoog.provide('goog.db.BlockedCallback');\ngoog.provide('goog.db.UpgradeNeededCallback');\n\ngoog.require('goog.asserts');\ngoog.require('goog.async.Deferred');\ngoog.require('goog.db.Error');\ngoog.require('goog.db.IndexedDb');\ngoog.require('goog.db.Transaction');\n\n\n/**\n * The IndexedDB factory object.\n *\n * @type {!IDBFactory|undefined}\n * @private\n */\ngoog.db.indexedDb_ = goog.global.indexedDB || goog.global.mozIndexedDB ||\n    goog.global.webkitIndexedDB || goog.global.moz_indexedDB;\n\n\n/**\n * A callback that's called if a blocked event is received. When a database is\n * supposed to be deleted or upgraded (i.e. versionchange), and there are open\n * connections to this database, a block event will be fired to prevent the\n * operations from going through until all such open connections are closed.\n * This callback can be used to notify users that they should close other tabs\n * that have open connections, or to close the connections manually. Databases\n * can also listen for the {@link goog.db.IndexedDb.EventType.VERSION_CHANGE}\n * event to automatically close themselves when they're blocking such\n * operations.\n *\n * This is passed a VersionChangeEvent that has the version of the database\n * before it was deleted, and \"null\" as the new version.\n *\n * @typedef {function(!goog.db.IndexedDb.VersionChangeEvent)}\n */\ngoog.db.BlockedCallback;\n\n\n/**\n * A callback that's called when opening a database whose internal version is\n * lower than the version passed to {@link goog.db.openDatabase}.\n *\n * This callback is passed three arguments: a VersionChangeEvent with both the\n * old version and the new version of the database; the database that's being\n * opened, for which you can create and delete object stores; and the version\n * change transaction, with which you can abort the version change.\n *\n * Note that the transaction is not active, which means that it can't be used to\n * make changes to the database. However, since there is a transaction running,\n * you can't create another one via {@link goog.db.IndexedDb.createTransaction}.\n * This means that it's not possible to manipulate the database other than\n * creating or removing object stores in this callback.\n *\n * @typedef {function(!goog.db.IndexedDb.VersionChangeEvent,\n *                    !goog.db.IndexedDb,\n *                    !goog.db.Transaction)}\n */\ngoog.db.UpgradeNeededCallback;\n\n\n/**\n * Opens a database connection and wraps it.\n *\n * @param {string} name The name of the database to open.\n * @param {number=} opt_version The expected version of the database. If this is\n *     larger than the actual version, opt_onUpgradeNeeded will be called\n *     (possibly after opt_onBlocked; see {@link goog.db.BlockedCallback}). If\n *     this is passed, opt_onUpgradeNeeded must be passed as well.\n * @param {goog.db.UpgradeNeededCallback=} opt_onUpgradeNeeded Called if\n *     opt_version is greater than the old version of the database. If\n *     opt_version is passed, this must be passed as well.\n * @param {goog.db.BlockedCallback=} opt_onBlocked Called if there are active\n *     connections to the database.\n * @return {!goog.async.Deferred} The deferred database object.\n */\ngoog.db.openDatabase = function(\n    name, opt_version, opt_onUpgradeNeeded, opt_onBlocked) {\n  goog.asserts.assert(\n      (opt_version !== undefined) == (opt_onUpgradeNeeded !== undefined),\n      'opt_version must be passed to goog.db.openDatabase if and only if ' +\n          'opt_onUpgradeNeeded is also passed');\n\n  var d = new goog.async.Deferred();\n  var openRequest = opt_version ? goog.db.indexedDb_.open(name, opt_version) :\n                                  goog.db.indexedDb_.open(name);\n  openRequest.onsuccess = function(ev) {\n    var db = new goog.db.IndexedDb(ev.target.result);\n    d.callback(db);\n  };\n  openRequest.onerror = function(ev) {\n    var msg = 'opening database ' + name;\n    d.errback(goog.db.Error.fromRequest(ev.target, msg));\n  };\n  openRequest.onupgradeneeded = function(ev) {\n    if (!opt_onUpgradeNeeded) return;\n    var db = new goog.db.IndexedDb(ev.target.result);\n    opt_onUpgradeNeeded(\n        new goog.db.IndexedDb.VersionChangeEvent(ev.oldVersion, ev.newVersion),\n        db, new goog.db.Transaction(ev.target.transaction, db));\n  };\n  openRequest.onblocked = function(ev) {\n    if (opt_onBlocked) {\n      opt_onBlocked(\n          new goog.db.IndexedDb.VersionChangeEvent(\n              ev.oldVersion, ev.newVersion));\n    }\n  };\n  return d;\n};\n\n\n/**\n * Deletes a database once all open connections have been closed.\n *\n * @param {string} name The name of the database to delete.\n * @param {goog.db.BlockedCallback=} opt_onBlocked Called if there are active\n *     connections to the database.\n * @return {!goog.async.Deferred} A deferred object that will fire once the\n *     database is deleted.\n */\ngoog.db.deleteDatabase = function(name, opt_onBlocked) {\n  var d = new goog.async.Deferred();\n  var deleteRequest = goog.db.indexedDb_.deleteDatabase(name);\n  deleteRequest.onsuccess = function(ev) { d.callback(); };\n  deleteRequest.onerror = function(ev) {\n    var msg = 'deleting database ' + name;\n    d.errback(goog.db.Error.fromRequest(ev.target, msg));\n  };\n  deleteRequest.onblocked = function(ev) {\n    if (opt_onBlocked) {\n      opt_onBlocked(\n          new goog.db.IndexedDb.VersionChangeEvent(\n              ev.oldVersion, ev.newVersion));\n    }\n  };\n  return d;\n};\n","^;",1579837703000,"^<",["^=",["^1L","~$goog.db.Transaction","~$goog.db.IndexedDb","^8[","^?","^5<"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/db/db.js"],"^O",["^=",["~$goog.db","~$goog.db.UpgradeNeededCallback","~$goog.db.BlockedCallback"]],"^W",true,"^X",["^?","^1L","^5<","^8[","^BS","^BR"]],["^ ","^3",[1579837703000],"^4","goog.crypt.sha1.js","^5",["^6","goog/crypt/sha1.js"],"^7","goog/crypt/sha1.js","^8","^9","^:","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview SHA-1 cryptographic hash.\n * Variable names follow the notation in FIPS PUB 180-3:\n * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf.\n *\n * Usage:\n *   var sha1 = new goog.crypt.sha1();\n *   sha1.update(bytes);\n *   var hash = sha1.digest();\n *\n * Performance:\n *   Chrome 23:   ~400 Mbit/s\n *   Firefox 16:  ~250 Mbit/s\n *\n */\n\ngoog.provide('goog.crypt.Sha1');\n\ngoog.require('goog.crypt.Hash');\n\n\n\n/**\n * SHA-1 cryptographic hash constructor.\n *\n * The properties declared here are discussed in the above algorithm document.\n * @constructor\n * @extends {goog.crypt.Hash}\n * @final\n * @struct\n */\ngoog.crypt.Sha1 = function() {\n  goog.crypt.Sha1.base(this, 'constructor');\n\n  this.blockSize = 512 / 8;\n\n  /**\n   * Holds the previous values of accumulated variables a-e in the compress_\n   * function.\n   * @type {!Array<number>}\n   * @private\n   */\n  this.chain_ = [];\n\n  /**\n   * A buffer holding the partially computed hash result.\n   * @type {!Array<number>}\n   * @private\n   */\n  this.buf_ = [];\n\n  /**\n   * An array of 80 bytes, each a part of the message to be hashed.  Referred to\n   * as the message schedule in the docs.\n   * @type {!Array<number>}\n   * @private\n   */\n  this.W_ = [];\n\n  /**\n   * Contains data needed to pad messages less than 64 bytes.\n   * @type {!Array<number>}\n   * @private\n   */\n  this.pad_ = [];\n\n  this.pad_[0] = 128;\n  for (var i = 1; i < this.blockSize; ++i) {\n    this.pad_[i] = 0;\n  }\n\n  /**\n   * @private {number}\n   */\n  this.inbuf_ = 0;\n\n  /**\n   * @private {number}\n   */\n  this.total_ = 0;\n\n  this.reset();\n};\ngoog.inherits(goog.crypt.Sha1, goog.crypt.Hash);\n\n\n/** @override */\ngoog.crypt.Sha1.prototype.reset = function() {\n  this.chain_[0] = 0x67452301;\n  this.chain_[1] = 0xefcdab89;\n  this.chain_[2] = 0x98badcfe;\n  this.chain_[3] = 0x10325476;\n  this.chain_[4] = 0xc3d2e1f0;\n\n  this.inbuf_ = 0;\n  this.total_ = 0;\n};\n\n\n/**\n * Internal compress helper function.\n * @param {!Array<number>|!Uint8Array|string} buf Block to compress.\n * @param {number=} opt_offset Offset of the block in the buffer.\n * @private\n */\ngoog.crypt.Sha1.prototype.compress_ = function(buf, opt_offset) {\n  if (!opt_offset) {\n    opt_offset = 0;\n  }\n\n  var W = this.W_;\n\n  // get 16 big endian words\n  if (typeof buf === 'string') {\n    for (var i = 0; i < 16; i++) {\n      // TODO(user): [bug 8140122] Recent versions of Safari for Mac OS and iOS\n      // have a bug that turns the post-increment ++ operator into pre-increment\n      // during JIT compilation.  We have code that depends heavily on SHA-1 for\n      // correctness and which is affected by this bug, so I've removed all uses\n      // of post-increment ++ in which the result value is used.  We can revert\n      // this change once the Safari bug\n      // (https://bugs.webkit.org/show_bug.cgi?id=109036) has been fixed and\n      // most clients have been updated.\n      W[i] = (buf.charCodeAt(opt_offset) << 24) |\n          (buf.charCodeAt(opt_offset + 1) << 16) |\n          (buf.charCodeAt(opt_offset + 2) << 8) |\n          (buf.charCodeAt(opt_offset + 3));\n      opt_offset += 4;\n    }\n  } else {\n    for (var i = 0; i < 16; i++) {\n      W[i] = (buf[opt_offset] << 24) | (buf[opt_offset + 1] << 16) |\n          (buf[opt_offset + 2] << 8) | (buf[opt_offset + 3]);\n      opt_offset += 4;\n    }\n  }\n\n  // expand to 80 words\n  for (var i = 16; i < 80; i++) {\n    var t = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n    W[i] = ((t << 1) | (t >>> 31)) & 0xffffffff;\n  }\n\n  var a = this.chain_[0];\n  var b = this.chain_[1];\n  var c = this.chain_[2];\n  var d = this.chain_[3];\n  var e = this.chain_[4];\n  var f, k;\n\n  // TODO(user): Try to unroll this loop to speed up the computation.\n  for (var i = 0; i < 80; i++) {\n    if (i < 40) {\n      if (i < 20) {\n        f = d ^ (b & (c ^ d));\n        k = 0x5a827999;\n      } else {\n        f = b ^ c ^ d;\n        k = 0x6ed9eba1;\n      }\n    } else {\n      if (i < 60) {\n        f = (b & c) | (d & (b | c));\n        k = 0x8f1bbcdc;\n      } else {\n        f = b ^ c ^ d;\n        k = 0xca62c1d6;\n      }\n    }\n\n    var t = (((a << 5) | (a >>> 27)) + f + e + k + W[i]) & 0xffffffff;\n    e = d;\n    d = c;\n    c = ((b << 30) | (b >>> 2)) & 0xffffffff;\n    b = a;\n    a = t;\n  }\n\n  this.chain_[0] = (this.chain_[0] + a) & 0xffffffff;\n  this.chain_[1] = (this.chain_[1] + b) & 0xffffffff;\n  this.chain_[2] = (this.chain_[2] + c) & 0xffffffff;\n  this.chain_[3] = (this.chain_[3] + d) & 0xffffffff;\n  this.chain_[4] = (this.chain_[4] + e) & 0xffffffff;\n};\n\n\n/** @override */\ngoog.crypt.Sha1.prototype.update = function(bytes, opt_length) {\n  // TODO(johnlenz): tighten the function signature and remove this check\n  if (bytes == null) {\n    return;\n  }\n\n  if (opt_length === undefined) {\n    opt_length = bytes.length;\n  }\n\n  var lengthMinusBlock = opt_length - this.blockSize;\n  var n = 0;\n  // Using local instead of member variables gives ~5% speedup on Firefox 16.\n  var buf = this.buf_;\n  var inbuf = this.inbuf_;\n\n  // The outer while loop should execute at most twice.\n  while (n < opt_length) {\n    // When we have no data in the block to top up, we can directly process the\n    // input buffer (assuming it contains sufficient data). This gives ~25%\n    // speedup on Chrome 23 and ~15% speedup on Firefox 16, but requires that\n    // the data is provided in large chunks (or in multiples of 64 bytes).\n    if (inbuf == 0) {\n      while (n <= lengthMinusBlock) {\n        this.compress_(bytes, n);\n        n += this.blockSize;\n      }\n    }\n\n    if (typeof bytes === 'string') {\n      while (n < opt_length) {\n        buf[inbuf] = bytes.charCodeAt(n);\n        ++inbuf;\n        ++n;\n        if (inbuf == this.blockSize) {\n          this.compress_(buf);\n          inbuf = 0;\n          // Jump to the outer loop so we use the full-block optimization.\n          break;\n        }\n      }\n    } else {\n      while (n < opt_length) {\n        buf[inbuf] = bytes[n];\n        ++inbuf;\n        ++n;\n        if (inbuf == this.blockSize) {\n          this.compress_(buf);\n          inbuf = 0;\n          // Jump to the outer loop so we use the full-block optimization.\n          break;\n        }\n      }\n    }\n  }\n\n  this.inbuf_ = inbuf;\n  this.total_ += opt_length;\n};\n\n\n/** @override */\ngoog.crypt.Sha1.prototype.digest = function() {\n  var digest = [];\n  var totalBits = this.total_ * 8;\n\n  // Add pad 0x80 0x00*.\n  if (this.inbuf_ < 56) {\n    this.update(this.pad_, 56 - this.inbuf_);\n  } else {\n    this.update(this.pad_, this.blockSize - (this.inbuf_ - 56));\n  }\n\n  // Add # bits.\n  for (var i = this.blockSize - 1; i >= 56; i--) {\n    this.buf_[i] = totalBits & 255;\n    totalBits /= 256;  // Don't use bit-shifting here!\n  }\n\n  this.compress_(this.buf_);\n\n  var n = 0;\n  for (var i = 0; i < 5; i++) {\n    for (var j = 24; j >= 0; j -= 8) {\n      digest[n] = (this.chain_[i] >> j) & 255;\n      ++n;\n    }\n  }\n\n  return digest;\n};\n","^;",1579837703000,"^<",["^=",["^?","^3U"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/sha1.js"],"^O",["^=",["^@J"]],"^W",true,"^X",["^?","^3U"]],["^ ","^3",[1579837703000],"^4","goog.date.duration.js","^5",["^6","goog/date/duration.js"],"^7","goog/date/duration.js","^8","^9","^:","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions for formatting duration values.  Such as \"3 days\"\n * \"3 hours\", \"14 minutes\", \"2 hours 45 minutes\".\n *\n */\n\ngoog.provide('goog.date.duration');\n\ngoog.require('goog.i18n.DateTimeFormat');\ngoog.require('goog.i18n.MessageFormat');\n\n\n/**\n * Number of milliseconds in a minute.\n * @type {number}\n * @private\n */\ngoog.date.duration.MINUTE_MS_ = 60000;\n\n\n/**\n * Number of milliseconds in an hour.\n * @type {number}\n * @private\n */\ngoog.date.duration.HOUR_MS_ = 3600000;\n\n\n/**\n * Number of milliseconds in a day.\n * @type {number}\n * @private\n */\ngoog.date.duration.DAY_MS_ = 86400000;\n\n\n/**\n * Accepts a duration in milliseconds and outputs an absolute duration time in\n * form of \"1 day\", \"2 hours\", \"20 minutes\", \"2 days 1 hour 15 minutes\" etc.\n * @param {number} durationMs Duration in milliseconds.\n * @return {string} The formatted duration.\n */\ngoog.date.duration.format = function(durationMs) {\n  var ms = Math.abs(durationMs);\n\n  // Handle durations shorter than 1 minute.\n  if (ms < goog.date.duration.MINUTE_MS_) {\n    /**\n     * @desc Duration time of zero minutes.\n     */\n    var MSG_ZERO_MINUTES = goog.getMsg('0 minutes');\n    return MSG_ZERO_MINUTES;\n  }\n\n  var days = Math.floor(ms / goog.date.duration.DAY_MS_);\n  ms %= goog.date.duration.DAY_MS_;\n\n  var hours = Math.floor(ms / goog.date.duration.HOUR_MS_);\n  ms %= goog.date.duration.HOUR_MS_;\n\n  var minutes = Math.floor(ms / goog.date.duration.MINUTE_MS_);\n\n  // Localized number representations.\n  var daysText = goog.i18n.DateTimeFormat.localizeNumbers(days);\n  var hoursText = goog.i18n.DateTimeFormat.localizeNumbers(hours);\n  var minutesText = goog.i18n.DateTimeFormat.localizeNumbers(minutes);\n\n  // We need a space after the days if there are hours or minutes to come.\n  var daysSeparator = days * (hours + minutes) ? ' ' : '';\n  // We need a space after the hours if there are minutes to come.\n  var hoursSeparator = hours * minutes ? ' ' : '';\n\n  /**\n   * @desc The days part of the duration message: 1 day, 5 days.\n   */\n  var MSG_DURATION_DAYS = goog.getMsg(\n      '{COUNT, plural, ' +\n      '=0 {}' +\n      '=1 {{TEXT} day}' +\n      'other {{TEXT} days}}');\n  /**\n   * @desc The hours part of the duration message: 1 hour, 5 hours.\n   */\n  var MSG_DURATION_HOURS = goog.getMsg(\n      '{COUNT, plural, ' +\n      '=0 {}' +\n      '=1 {{TEXT} hour}' +\n      'other {{TEXT} hours}}');\n  /**\n   * @desc The minutes part of the duration message: 1 minute, 5 minutes.\n   */\n  var MSG_DURATION_MINUTES = goog.getMsg(\n      '{COUNT, plural, ' +\n      '=0 {}' +\n      '=1 {{TEXT} minute}' +\n      'other {{TEXT} minutes}}');\n\n  var daysPart = goog.date.duration.getDurationMessagePart_(\n      MSG_DURATION_DAYS, days, daysText);\n  var hoursPart = goog.date.duration.getDurationMessagePart_(\n      MSG_DURATION_HOURS, hours, hoursText);\n  var minutesPart = goog.date.duration.getDurationMessagePart_(\n      MSG_DURATION_MINUTES, minutes, minutesText);\n\n  /**\n   * @desc Duration time text concatenated from the individual time unit message\n   * parts. The separator will be a space (e.g. '1 day 2 hours 24 minutes') or\n   * nothing in case one/two of the duration parts is empty (\n   * e.g. '1 hour 30 minutes', '3 days 15 minutes', '2 hours').\n   */\n  var MSG_CONCATENATED_DURATION_TEXT = goog.getMsg(\n      '{$daysPart}{$daysSeparator}{$hoursPart}{$hoursSeparator}{$minutesPart}',\n      {\n        'daysPart': daysPart,\n        'daysSeparator': daysSeparator,\n        'hoursPart': hoursPart,\n        'hoursSeparator': hoursSeparator,\n        'minutesPart': minutesPart\n      });\n\n  return MSG_CONCATENATED_DURATION_TEXT;\n};\n\n\n/**\n * Gets a duration message part for a time unit.\n * @param {string} pattern The pattern to apply.\n * @param {number} count The number of units.\n * @param {string} text The string to use for amount of units in the message.\n * @return {string} The formatted message part.\n * @private\n */\ngoog.date.duration.getDurationMessagePart_ = function(pattern, count, text) {\n  var formatter = new goog.i18n.MessageFormat(pattern);\n  return formatter.format({'COUNT': count, 'TEXT': text});\n};\n","^;",1579837703000,"^<",["^=",["~$goog.i18n.DateTimeFormat","^?","^7["]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/date/duration.js"],"^O",["^=",["~$goog.date.duration"]],"^W",true,"^X",["^?","^BW","^7["]],["^ ","^3",[1579837703000],"^4","goog.json.hybrid.js","^5",["^6","goog/json/hybrid.js"],"^7","goog/json/hybrid.js","^8","^9","^:","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Utility to attempt native JSON processing, falling back to\n *     goog.json if not available.\n *\n *     This is intended as a drop-in for current users of goog.json who want\n *     to take advantage of native JSON if present.\n *\n * @author nnaze@google.com (Nathan Naze)\n */\n\ngoog.provide('goog.json.hybrid');\n\ngoog.require('goog.asserts');\ngoog.require('goog.json');\n\n\n/**\n * Attempts to serialize the JSON string natively, falling back to\n * `goog.json.serialize` if unsuccessful.\n * @param {!Object} obj JavaScript object to serialize to JSON.\n * @return {string} Resulting JSON string.\n */\ngoog.json.hybrid.stringify =\n    goog.json.USE_NATIVE_JSON ? goog.global['JSON']['stringify'] : function(\n                                                                       obj) {\n      if (goog.global.JSON) {\n        try {\n          return goog.global.JSON.stringify(obj);\n        } catch (e) {\n          // Native serialization failed.  Fall through to retry with\n          // goog.json.serialize.\n        }\n      }\n\n      return goog.json.serialize(obj);\n    };\n\n\n/**\n * Attempts to parse the JSON string natively, falling back to\n * the supplied `fallbackParser` if unsuccessful.\n * @param {string} jsonString JSON string to parse.\n * @param {function(string):Object} fallbackParser Fallback JSON parser used\n *     if native\n * @return {?Object} Resulting JSON object.\n * @private\n */\ngoog.json.hybrid.parse_ = function(jsonString, fallbackParser) {\n  if (goog.global.JSON) {\n    try {\n      var obj = goog.global.JSON.parse(jsonString);\n      goog.asserts.assert(typeof obj == 'object');\n      return /** @type {?Object} */ (obj);\n    } catch (e) {\n      // Native parse failed.  Fall through to retry with goog.json.parse.\n    }\n  }\n\n  return fallbackParser(jsonString);\n};\n\n\n/**\n * Attempts to parse the JSON string natively, falling back to\n * `goog.json.parse` if unsuccessful.\n * @param {string} jsonString JSON string to parse.\n * @return {?Object} Resulting JSON object.\n */\ngoog.json.hybrid.parse =\n    goog.json.USE_NATIVE_JSON ? goog.global['JSON']['parse'] : function(\n                                                                   jsonString) {\n      return goog.json.hybrid.parse_(jsonString, goog.json.parse);\n    };\n","^;",1579837703000,"^<",["^=",["^1L","^4O","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/json/hybrid.js"],"^O",["^=",["~$goog.json.hybrid"]],"^W",true,"^X",["^?","^1L","^4O"]],["^ ","^3",[1579837703000],"^4","goog.vec.vec.js","^5",["^6","goog/vec/vec.js"],"^7","goog/vec/vec.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Supplies global data types and constants for the vector math\n *     library.\n */\ngoog.provide('goog.vec');\ngoog.provide('goog.vec.AnyType');\ngoog.provide('goog.vec.ArrayType');\ngoog.provide('goog.vec.Float32');\ngoog.provide('goog.vec.Float64');\ngoog.provide('goog.vec.Number');\n\n\n/**\n * On platforms that don't have native Float32Array or Float64Array support we\n * use a javascript implementation so that this math library can be used on all\n * platforms.\n * @suppress {extraRequire}\n */\ngoog.require('goog.vec.Float32Array');\n/** @suppress {extraRequire} */\ngoog.require('goog.vec.Float64Array');\n\n// All vector and matrix operations are based upon arrays of numbers using\n// either Float32Array, Float64Array, or a standard JavaScript Array of\n// Numbers.\n\n\n/** @typedef {!Float32Array} */\ngoog.vec.Float32;\n\n\n/** @typedef {!Float64Array} */\ngoog.vec.Float64;\n\n\n/** @typedef {!Array<number>} */\ngoog.vec.Number;\n\n\n/** @typedef {!goog.vec.Float32|!goog.vec.Float64|!goog.vec.Number} */\ngoog.vec.AnyType;\n\n\n/**\n * @deprecated Use AnyType.\n * @typedef {!Float32Array|!Array<number>}\n */\ngoog.vec.ArrayType;\n\n\n/**\n * For graphics work, 6 decimal places of accuracy are typically all that is\n * required.\n *\n * @type {number}\n * @const\n */\ngoog.vec.EPSILON = 1e-6;\n","^;",1579837703000,"^<",["^=",["~$goog.vec.Float64Array","^?","^39"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/vec.js"],"^O",["^=",["~$goog.vec.Number","~$goog.vec","~$goog.vec.AnyType","~$goog.vec.Float32","~$goog.vec.Float64","~$goog.vec.ArrayType"]],"^W",true,"^X",["^?","^39","^BZ"]],["^ ","^3",[1579837703000],"^4","goog.dom.pattern.callback.callback.js","^5",["^6","goog/dom/pattern/callback/callback.js"],"^7","goog/dom/pattern/callback/callback.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Useful callback functions for the DOM matcher.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.pattern.callback');\n\ngoog.forwardDeclare('goog.dom.TagIterator');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagWalkType');\ngoog.require('goog.iter');\n\n\n/**\n * Callback function for use in {@link goog.dom.pattern.Matcher.addPattern}\n * that removes the matched node from the tree.  Should be used in conjunciton\n * with a {@link goog.dom.pattern.StartTag} pattern.\n *\n * @param {Node} node The node matched by the pattern.\n * @param {goog.dom.TagIterator} position The position where the match\n *     finished.\n * @return {boolean} Returns true to indicate tree changes were made.\n */\ngoog.dom.pattern.callback.removeNode = function(node, position) {\n  // Find out which position would be next.\n  position.setPosition(node, goog.dom.TagWalkType.END_TAG);\n\n  goog.iter.nextOrValue(position, null);\n\n  // Remove the node.\n  goog.dom.removeNode(node);\n\n  // Correct for the depth change.\n  position.depth -= 1;\n\n  // Indicate that we made position/tree changes.\n  return true;\n};\n\n\n/**\n * Callback function for use in {@link goog.dom.pattern.Matcher.addPattern}\n * that removes the matched node from the tree and replaces it with its\n * children.  Should be used in conjunction with a\n * {@link goog.dom.pattern.StartTag} pattern.\n *\n * @param {Element} node The node matched by the pattern.\n * @param {goog.dom.TagIterator} position The position where the match\n *     finished.\n * @return {boolean} Returns true to indicate tree changes were made.\n */\ngoog.dom.pattern.callback.flattenElement = function(node, position) {\n  // Find out which position would be next.\n  position.setPosition(\n      node, node.firstChild ? goog.dom.TagWalkType.START_TAG :\n                              goog.dom.TagWalkType.END_TAG);\n\n  goog.iter.nextOrValue(position, null);\n\n  // Flatten the node.\n  goog.dom.flattenElement(node);\n\n  // Correct for the depth change.\n  position.depth -= 1;\n\n  // Indicate that we made position/tree changes.\n  return true;\n};\n","^;",1579837703000,"^<",["^=",["^8O","^1>","^5F","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/callback/callback.js"],"^O",["^=",["~$goog.dom.pattern.callback"]],"^W",true,"^X",["^?","^1>","^5F","^8O"]],["^ ","^3",[1579837703000],"^4","goog.graphics.svggraphics.js","^5",["^6","goog/graphics/svggraphics.js"],"^7","goog/graphics/svggraphics.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview SvgGraphics sub class that uses SVG to draw the graphics.\n * @author arv@google.com (Erik Arvidsson)\n */\n\ngoog.provide('goog.graphics.SvgGraphics');\n\ngoog.require('goog.Timer');\ngoog.require('goog.dom');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.graphics.AbstractGraphics');\ngoog.require('goog.graphics.Font');\ngoog.require('goog.graphics.LinearGradient');\ngoog.require('goog.graphics.Path');\ngoog.require('goog.graphics.SolidFill');\ngoog.require('goog.graphics.Stroke');\ngoog.require('goog.graphics.SvgEllipseElement');\ngoog.require('goog.graphics.SvgGroupElement');\ngoog.require('goog.graphics.SvgImageElement');\ngoog.require('goog.graphics.SvgPathElement');\ngoog.require('goog.graphics.SvgRectElement');\ngoog.require('goog.graphics.SvgTextElement');\ngoog.require('goog.math');\ngoog.require('goog.math.Size');\ngoog.require('goog.style');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A Graphics implementation for drawing using SVG.\n * @param {string|number} width The width in pixels.  Strings\n *     expressing percentages of parent with (e.g. '80%') are also accepted.\n * @param {string|number} height The height in pixels.  Strings\n *     expressing percentages of parent with (e.g. '80%') are also accepted.\n * @param {?number=} opt_coordWidth The coordinate width - if\n *     omitted or null, defaults to same as width.\n * @param {?number=} opt_coordHeight The coordinate height - if\n *     omitted or null, defaults to same as height.\n * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper object for the\n *     document we want to render in.\n * @constructor\n * @extends {goog.graphics.AbstractGraphics}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n * @final\n */\ngoog.graphics.SvgGraphics = function(\n    width, height, opt_coordWidth, opt_coordHeight, opt_domHelper) {\n  goog.graphics.AbstractGraphics.call(\n      this, width, height, opt_coordWidth, opt_coordHeight, opt_domHelper);\n\n  /**\n   * Map from def key to id of def root element.\n   * Defs are global \"defines\" of svg that are used to share common attributes,\n   * for example gradients.\n   * @type {Object}\n   * @private\n   */\n  this.defs_ = {};\n\n  /**\n   * Whether to manually implement viewBox by using a coordinate transform.\n   * As of 1/11/08 this is necessary for Safari 3 but not for the nightly\n   * WebKit build. Apply to webkit versions < 526. 525 is the\n   * last version used by Safari 3.1.\n   * @type {boolean}\n   * @private\n   */\n  this.useManualViewbox_ =\n      goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher(526);\n\n  /**\n   * Event handler.\n   * @type {goog.events.EventHandler<!goog.graphics.SvgGraphics>}\n   * @private\n   */\n  this.handler_ = new goog.events.EventHandler(this);\n};\ngoog.inherits(goog.graphics.SvgGraphics, goog.graphics.AbstractGraphics);\n\n\n/**\n * The SVG namespace URN\n * @private\n * @type {string}\n */\ngoog.graphics.SvgGraphics.SVG_NS_ = 'http://www.w3.org/2000/svg';\n\n\n/**\n * The name prefix for def entries\n * @private\n * @type {string}\n */\ngoog.graphics.SvgGraphics.DEF_ID_PREFIX_ = '_svgdef_';\n\n\n/**\n * The next available unique identifier for a def entry.\n * This is a static variable, so that when multiple graphics are used in one\n * document, the same def id can not be re-defined by another SvgGraphics.\n * @type {number}\n * @private\n */\ngoog.graphics.SvgGraphics.nextDefId_ = 0;\n\n\n/**\n * Svg element for definitions for other elements, e.g. linear gradients.\n * @type {Element}\n * @private\n */\ngoog.graphics.SvgGraphics.prototype.defsElement_;\n\n\n/**\n * Creates an SVG element. Used internally and by different SVG classes.\n * @param {string} tagName The type of element to create.\n * @param {Object=} opt_attributes Map of name-value pairs for attributes.\n * @return {!Element} The created element.\n * @private\n */\ngoog.graphics.SvgGraphics.prototype.createSvgElement_ = function(\n    tagName, opt_attributes) {\n  var element = this.dom_.getDocument().createElementNS(\n      goog.graphics.SvgGraphics.SVG_NS_, tagName);\n\n  if (opt_attributes) {\n    this.setElementAttributes(element, opt_attributes);\n  }\n\n  return element;\n};\n\n\n/**\n * Sets properties to an SVG element. Used internally and by different\n * SVG elements.\n * @param {Element} element The svg element.\n * @param {Object} attributes Map of name-value pairs for attributes.\n */\ngoog.graphics.SvgGraphics.prototype.setElementAttributes = function(\n    element, attributes) {\n  for (var key in attributes) {\n    element.setAttribute(key, attributes[key]);\n  }\n};\n\n\n/**\n * Appends an element.\n *\n * @param {goog.graphics.Element} element The element wrapper.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element\n *     to append to. If not specified, appends to the main canvas.\n * @private\n */\ngoog.graphics.SvgGraphics.prototype.append_ = function(element, opt_group) {\n  var parent = opt_group || this.canvasElement;\n  parent.getElement().appendChild(element.getElement());\n};\n\n\n/**\n * Sets the fill of the given element.\n * @param {goog.graphics.StrokeAndFillElement} element The element wrapper.\n * @param {goog.graphics.Fill?} fill The fill object.\n * @override\n */\ngoog.graphics.SvgGraphics.prototype.setElementFill = function(element, fill) {\n  var svgElement = element.getElement();\n  if (fill instanceof goog.graphics.SolidFill) {\n    svgElement.setAttribute('fill', fill.getColor());\n    svgElement.setAttribute('fill-opacity', fill.getOpacity());\n  } else if (fill instanceof goog.graphics.LinearGradient) {\n    // create a def key which is just a concat of all the relevant fields\n    var defKey = 'lg-' + fill.getX1() + '-' + fill.getY1() + '-' +\n        fill.getX2() + '-' + fill.getY2() + '-' + fill.getColor1() + '-' +\n        fill.getColor2();\n    // It seems that the SVG version accepts opacity where the VML does not\n\n    var id = this.getDef(defKey);\n\n    if (!id) {  // No def for this yet, create it\n      // Create the gradient def entry (only linear gradient are supported)\n      var gradient = this.createSvgElement_('linearGradient', {\n        'x1': fill.getX1(),\n        'y1': fill.getY1(),\n        'x2': fill.getX2(),\n        'y2': fill.getY2(),\n        'gradientUnits': 'userSpaceOnUse'\n      });\n\n      var gstyle = 'stop-color:' + fill.getColor1();\n      if (typeof fill.getOpacity1() === 'number') {\n        gstyle += ';stop-opacity:' + fill.getOpacity1();\n      }\n      var stop1 =\n          this.createSvgElement_('stop', {'offset': '0%', 'style': gstyle});\n      gradient.appendChild(stop1);\n\n      // LinearGradients don't have opacity in VML so implement that before\n      // enabling the following code.\n      // if (fill.getOpacity() != null) {\n      //   gstyles += 'opacity:' + fill.getOpacity() + ';'\n      // }\n      gstyle = 'stop-color:' + fill.getColor2();\n      if (typeof fill.getOpacity2() === 'number') {\n        gstyle += ';stop-opacity:' + fill.getOpacity2();\n      }\n      var stop2 =\n          this.createSvgElement_('stop', {'offset': '100%', 'style': gstyle});\n      gradient.appendChild(stop2);\n\n      // LinearGradients don't have opacity in VML so implement that before\n      // enabling the following code.\n      // if (fill.getOpacity() != null) {\n      //   gstyles += 'opacity:' + fill.getOpacity() + ';'\n      // }\n\n      id = this.addDef(defKey, gradient);\n    }\n\n    // Link element to linearGradient definition\n    svgElement.setAttribute('fill', 'url(#' + id + ')');\n  } else {\n    svgElement.setAttribute('fill', 'none');\n  }\n};\n\n\n/**\n * Sets the stroke of the given element.\n * @param {goog.graphics.StrokeAndFillElement} element The element wrapper.\n * @param {goog.graphics.Stroke?} stroke The stroke object.\n * @override\n */\ngoog.graphics.SvgGraphics.prototype.setElementStroke = function(\n    element, stroke) {\n  var svgElement = element.getElement();\n  if (stroke) {\n    svgElement.setAttribute('stroke', stroke.getColor());\n    svgElement.setAttribute('stroke-opacity', stroke.getOpacity());\n\n    var width = stroke.getWidth();\n    if (typeof width === 'string' && width.indexOf('px') != -1) {\n      svgElement.setAttribute(\n          'stroke-width', parseFloat(width) / this.getPixelScaleX());\n    } else {\n      svgElement.setAttribute('stroke-width', width);\n    }\n  } else {\n    svgElement.setAttribute('stroke', 'none');\n  }\n};\n\n\n/**\n * Set the translation and rotation of an element.\n *\n * If a more general affine transform is needed than this provides\n * (e.g. skew and scale) then use setElementAffineTransform.\n * @param {goog.graphics.Element} element The element wrapper.\n * @param {number} x The x coordinate of the translation transform.\n * @param {number} y The y coordinate of the translation transform.\n * @param {number} angle The angle of the rotation transform.\n * @param {number} centerX The horizontal center of the rotation transform.\n * @param {number} centerY The vertical center of the rotation transform.\n * @override\n */\ngoog.graphics.SvgGraphics.prototype.setElementTransform = function(\n    element, x, y, angle, centerX, centerY) {\n  element.getElement().setAttribute(\n      'transform', 'translate(' + x + ',' + y + ') rotate(' + angle + ' ' +\n          centerX + ' ' + centerY + ')');\n};\n\n\n/**\n * Set the transformation of an element.\n * @param {goog.graphics.Element} element The element wrapper.\n * @param {!goog.graphics.AffineTransform} affineTransform The\n *     transformation applied to this element.\n * @override\n */\ngoog.graphics.SvgGraphics.prototype.setElementAffineTransform = function(\n    element, affineTransform) {\n  var t = affineTransform;\n  var substr = [\n    t.getScaleX(), t.getShearY(), t.getShearX(), t.getScaleY(),\n    t.getTranslateX(), t.getTranslateY()\n  ].join(',');\n  element.getElement().setAttribute('transform', 'matrix(' + substr + ')');\n};\n\n\n/**\n * Creates the DOM representation of the graphics area.\n * @override\n */\ngoog.graphics.SvgGraphics.prototype.createDom = function() {\n  // Set up the standard attributes.\n  var attributes =\n      {'width': this.width, 'height': this.height, 'overflow': 'hidden'};\n\n  var svgElement = this.createSvgElement_('svg', attributes);\n\n  var groupElement = this.createSvgElement_('g');\n\n  this.defsElement_ = this.createSvgElement_('defs');\n  this.canvasElement = new goog.graphics.SvgGroupElement(groupElement, this);\n\n  svgElement.appendChild(this.defsElement_);\n  svgElement.appendChild(groupElement);\n\n  // Use the svgElement as the root element.\n  this.setElementInternal(svgElement);\n\n  // Set up the coordinate system.\n  this.setViewBox_();\n};\n\n\n/**\n * Changes the coordinate system position.\n * @param {number} left The coordinate system left bound.\n * @param {number} top The coordinate system top bound.\n * @override\n */\ngoog.graphics.SvgGraphics.prototype.setCoordOrigin = function(left, top) {\n  this.coordLeft = left;\n  this.coordTop = top;\n\n  this.setViewBox_();\n};\n\n\n/**\n * Changes the coordinate size.\n * @param {number} coordWidth The coordinate width.\n * @param {number} coordHeight The coordinate height.\n * @override\n */\ngoog.graphics.SvgGraphics.prototype.setCoordSize = function(\n    coordWidth, coordHeight) {\n  goog.graphics.SvgGraphics.superClass_.setCoordSize.apply(this, arguments);\n  this.setViewBox_();\n};\n\n\n/**\n * @return {string} The view box string.\n * @private\n */\ngoog.graphics.SvgGraphics.prototype.getViewBox_ = function() {\n  return this.coordLeft + ' ' + this.coordTop + ' ' +\n      (this.coordWidth ? this.coordWidth + ' ' + this.coordHeight : '');\n};\n\n\n/**\n * Sets up the view box.\n * @private\n */\ngoog.graphics.SvgGraphics.prototype.setViewBox_ = function() {\n  if (this.coordWidth || this.coordLeft || this.coordTop) {\n    this.getElement().setAttribute('preserveAspectRatio', 'none');\n    if (this.useManualViewbox_) {\n      this.updateManualViewBox_();\n    } else {\n      this.getElement().setAttribute('viewBox', this.getViewBox_());\n    }\n  }\n};\n\n\n/**\n * Updates the transform of the root element to fake a viewBox.  Should only\n * be called when useManualViewbox_ is set.\n * @private\n * @suppress {strictPrimitiveOperators} Part of the go/strict_warnings_migration\n */\ngoog.graphics.SvgGraphics.prototype.updateManualViewBox_ = function() {\n  if (!this.isInDocument() ||\n      !(this.coordWidth || this.coordLeft || !this.coordTop)) {\n    return;\n  }\n\n  var size = this.getPixelSize();\n  if (size.width == 0) {\n    // In Safari, invisible SVG is sometimes shown.  Explicitly hide it.\n    this.getElement().style.visibility = 'hidden';\n    return;\n  }\n\n  this.getElement().style.visibility = '';\n\n  var offsetX = -this.coordLeft;\n  var offsetY = -this.coordTop;\n  var scaleX = size.width / this.coordWidth;\n  var scaleY = size.height / this.coordHeight;\n\n  this.canvasElement.getElement().setAttribute(\n      'transform', 'scale(' + scaleX + ' ' + scaleY + ') ' +\n          'translate(' + offsetX + ' ' + offsetY + ')');\n};\n\n\n/**\n * Change the size of the canvas.\n * @param {number} pixelWidth The width in pixels.\n * @param {number} pixelHeight The height in pixels.\n * @override\n */\ngoog.graphics.SvgGraphics.prototype.setSize = function(\n    pixelWidth, pixelHeight) {\n  goog.style.setSize(this.getElement(), pixelWidth, pixelHeight);\n};\n\n\n/** @override */\ngoog.graphics.SvgGraphics.prototype.getPixelSize = function() {\n  if (!goog.userAgent.GECKO) {\n    return this.isInDocument() ?\n        goog.style.getSize(this.getElement()) :\n        goog.graphics.SvgGraphics.base(this, 'getPixelSize');\n  }\n\n  // In Gecko, goog.style.getSize does not work for SVG elements.  We have to\n  // compute the size manually if it is percentage based.\n  var width = this.width;\n  var height = this.height;\n  var computeWidth = (typeof width === 'string') && width.indexOf('%') != -1;\n  var computeHeight = (typeof height === 'string') && height.indexOf('%') != -1;\n\n  if (!this.isInDocument() && (computeWidth || computeHeight)) {\n    return null;\n  }\n\n  var parent;\n  var parentSize;\n\n  if (computeWidth) {\n    parent = /** @type {Element} */ (this.getElement().parentNode);\n    parentSize = goog.style.getSize(parent);\n    width = parseFloat(/** @type {string} */ (width)) * parentSize.width / 100;\n  }\n\n  if (computeHeight) {\n    parent = parent || /** @type {Element} */ (this.getElement().parentNode);\n    parentSize = parentSize || goog.style.getSize(parent);\n    height =\n        parseFloat(/** @type {string} */ (height)) * parentSize.height / 100;\n  }\n\n  return new goog.math.Size(\n      /** @type {number} */ (width),\n      /** @type {number} */ (height));\n};\n\n\n/**\n * Remove all drawing elements from the graphics.\n * @override\n */\ngoog.graphics.SvgGraphics.prototype.clear = function() {\n  this.canvasElement.clear();\n  goog.dom.removeChildren(this.defsElement_);\n  this.defs_ = {};\n};\n\n\n/**\n * Draw an ellipse.\n *\n * @param {number} cx Center X coordinate.\n * @param {number} cy Center Y coordinate.\n * @param {number} rx Radius length for the x-axis.\n * @param {number} ry Radius length for the y-axis.\n * @param {goog.graphics.Stroke?} stroke Stroke object describing the\n *    stroke.\n * @param {goog.graphics.Fill?} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element\n *     to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.EllipseElement} The newly created element.\n * @override\n */\ngoog.graphics.SvgGraphics.prototype.drawEllipse = function(\n    cx, cy, rx, ry, stroke, fill, opt_group) {\n  var element = this.createSvgElement_(\n      'ellipse', {'cx': cx, 'cy': cy, 'rx': rx, 'ry': ry});\n  var wrapper =\n      new goog.graphics.SvgEllipseElement(element, this, stroke, fill);\n  this.append_(wrapper, opt_group);\n  return wrapper;\n};\n\n\n/**\n * Draw a rectangle.\n *\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @param {number} width Width of rectangle.\n * @param {number} height Height of rectangle.\n * @param {goog.graphics.Stroke?} stroke Stroke object describing the\n *    stroke.\n * @param {goog.graphics.Fill?} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element\n *     to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.RectElement} The newly created element.\n * @override\n */\ngoog.graphics.SvgGraphics.prototype.drawRect = function(\n    x, y, width, height, stroke, fill, opt_group) {\n  var element = this.createSvgElement_(\n      'rect', {'x': x, 'y': y, 'width': width, 'height': height});\n  var wrapper = new goog.graphics.SvgRectElement(element, this, stroke, fill);\n  this.append_(wrapper, opt_group);\n  return wrapper;\n};\n\n\n/**\n * Draw an image.\n *\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @param {number} width Width of the image.\n * @param {number} height Height of the image.\n * @param {string} src The source fo the image.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element\n *     to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.ImageElement} The newly created image wrapped in a\n *     rectangle element.\n */\ngoog.graphics.SvgGraphics.prototype.drawImage = function(\n    x, y, width, height, src, opt_group) {\n  var element = this.createSvgElement_('image', {\n    'x': x,\n    'y': y,\n    'width': width,\n    'height': height,\n    'image-rendering': 'optimizeQuality',\n    'preserveAspectRatio': 'none'\n  });\n  element.setAttributeNS('http://www.w3.org/1999/xlink', 'href', src);\n  var wrapper = new goog.graphics.SvgImageElement(element, this);\n  this.append_(wrapper, opt_group);\n  return wrapper;\n};\n\n\n/**\n * Draw a text string vertically centered on a given line.\n *\n * @param {string} text The text to draw.\n * @param {number} x1 X coordinate of start of line.\n * @param {number} y1 Y coordinate of start of line.\n * @param {number} x2 X coordinate of end of line.\n * @param {number} y2 Y coordinate of end of line.\n * @param {string} align Horizontal alignment: left (default), center, right.\n * @param {goog.graphics.Font} font Font describing the font properties.\n * @param {goog.graphics.Stroke?} stroke Stroke object describing the\n *    stroke.\n * @param {goog.graphics.Fill?} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element\n *     to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.TextElement} The newly created element.\n * @override\n */\ngoog.graphics.SvgGraphics.prototype.drawTextOnLine = function(\n    text, x1, y1, x2, y2, align, font, stroke, fill, opt_group) {\n  var angle = Math.round(goog.math.angle(x1, y1, x2, y2));\n  var dx = x2 - x1;\n  var dy = y2 - y1;\n  var lineLength = Math.round(Math.sqrt(dx * dx + dy * dy));  // Length of line\n\n  // SVG baseline is on the glyph's base line. We estimate it as 85% of the\n  // font height. This is just a rough estimate, but do not have a better way.\n  var fontSize = font.size;\n  var attributes = {'font-family': font.family, 'font-size': fontSize};\n  var baseline = Math.round(fontSize * 0.85);\n  var textY = Math.round(y1 - (fontSize / 2) + baseline);\n  var textX = x1;\n  if (align == 'center') {\n    textX += Math.round(lineLength / 2);\n    attributes['text-anchor'] = 'middle';\n  } else if (align == 'right') {\n    textX += lineLength;\n    attributes['text-anchor'] = 'end';\n  }\n  attributes['x'] = textX;\n  attributes['y'] = textY;\n  if (font.bold) {\n    attributes['font-weight'] = 'bold';\n  }\n  if (font.italic) {\n    attributes['font-style'] = 'italic';\n  }\n  if (angle != 0) {\n    attributes['transform'] = 'rotate(' + angle + ' ' + x1 + ' ' + y1 + ')';\n  }\n\n  var element = this.createSvgElement_('text', attributes);\n  element.appendChild(this.dom_.getDocument().createTextNode(text));\n\n  // Bypass a Firefox-Mac bug where text fill is ignored. If text has no stroke,\n  // set a stroke, otherwise the text will not be visible.\n  if (stroke == null && goog.userAgent.GECKO && goog.userAgent.MAC) {\n    var color = 'black';\n    // For solid fills, use the fill color\n    if (fill instanceof goog.graphics.SolidFill) {\n      color = fill.getColor();\n    }\n    stroke = new goog.graphics.Stroke(1, color);\n  }\n\n  var wrapper = new goog.graphics.SvgTextElement(element, this, stroke, fill);\n  this.append_(wrapper, opt_group);\n  return wrapper;\n};\n\n\n/**\n * Draw a path.\n *\n * @param {!goog.graphics.Path} path The path object to draw.\n * @param {goog.graphics.Stroke?} stroke Stroke object describing the\n *    stroke.\n * @param {goog.graphics.Fill?} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element\n *     to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.PathElement} The newly created element.\n * @override\n */\ngoog.graphics.SvgGraphics.prototype.drawPath = function(\n    path, stroke, fill, opt_group) {\n\n  var element = this.createSvgElement_(\n      'path', {'d': goog.graphics.SvgGraphics.getSvgPath(path)});\n  var wrapper = new goog.graphics.SvgPathElement(element, this, stroke, fill);\n  this.append_(wrapper, opt_group);\n  return wrapper;\n};\n\n\n/**\n * Returns a string representation of a logical path suitable for use in\n * an SVG element.\n *\n * @param {goog.graphics.Path} path The logical path.\n * @return {string} The SVG path representation.\n * @suppress {deprecated} goog.graphics is deprecated.\n */\ngoog.graphics.SvgGraphics.getSvgPath = function(path) {\n  var list = [];\n  path.forEachSegment(function(segment, args) {\n    switch (segment) {\n      case goog.graphics.Path.Segment.MOVETO:\n        list.push('M');\n        Array.prototype.push.apply(list, args);\n        break;\n      case goog.graphics.Path.Segment.LINETO:\n        list.push('L');\n        Array.prototype.push.apply(list, args);\n        break;\n      case goog.graphics.Path.Segment.CURVETO:\n        list.push('C');\n        Array.prototype.push.apply(list, args);\n        break;\n      case goog.graphics.Path.Segment.ARCTO:\n        var extent = args[3];\n        list.push(\n            'A', args[0], args[1], 0, Math.abs(extent) > 180 ? 1 : 0,\n            extent > 0 ? 1 : 0, args[4], args[5]);\n        break;\n      case goog.graphics.Path.Segment.CLOSE:\n        list.push('Z');\n        break;\n    }\n  });\n  return list.join(' ');\n};\n\n\n/**\n * Create an empty group of drawing elements.\n *\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element\n *     to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.GroupElement} The newly created group.\n * @override\n */\ngoog.graphics.SvgGraphics.prototype.createGroup = function(opt_group) {\n  var element = this.createSvgElement_('g');\n  var parent = opt_group || this.canvasElement;\n  parent.getElement().appendChild(element);\n  return new goog.graphics.SvgGroupElement(element, this);\n};\n\n\n/**\n * Measure and return the width (in pixels) of a given text string.\n * Text measurement is needed to make sure a text can fit in the allocated area.\n * The way text length is measured is by writing it into a div that is after\n * the visible area, measure the div width, and immediately erase the written\n * value.\n *\n * @override\n */\ngoog.graphics.SvgGraphics.prototype.getTextWidth = function(text, font) {\n  // TODO(user) Implement\n  throw new Error(\"unimplemented method\");\n};\n\n\n/**\n * Adds a definition of an element to the global definitions.\n * @param {string} defKey This is a key that should be unique in a way that\n *     if two definitions are equal the should have the same key.\n * @param {Element} defElement DOM element to add as a definition. It must\n *     have an id attribute set.\n * @return {string} The assigned id of the defElement.\n */\ngoog.graphics.SvgGraphics.prototype.addDef = function(defKey, defElement) {\n  if (defKey in this.defs_) {\n    return this.defs_[defKey];\n  }\n  var id = goog.graphics.SvgGraphics.DEF_ID_PREFIX_ +\n      goog.graphics.SvgGraphics.nextDefId_++;\n  defElement.setAttribute('id', id);\n  this.defs_[defKey] = id;\n\n  // Add the def defElement of the defs list.\n  var defs = this.defsElement_;\n  defs.appendChild(defElement);\n  return id;\n};\n\n\n/**\n * Returns the id of a definition element.\n * @param {string} defKey This is a key that should be unique in a way that\n *     if two definitions are equal the should have the same key.\n * @return {?string} The id of the found definition element or null if\n *     not found.\n */\ngoog.graphics.SvgGraphics.prototype.getDef = function(defKey) {\n  return defKey in this.defs_ ? this.defs_[defKey] : null;\n};\n\n\n/**\n * Removes a definition of an elemnt from the global definitions.\n * @param {string} defKey This is a key that should be unique in a way that\n *     if two definitions are equal they should have the same key.\n */\ngoog.graphics.SvgGraphics.prototype.removeDef = function(defKey) {\n  var id = this.getDef(defKey);\n  if (id) {\n    var element = this.dom_.getElement(id);\n    this.defsElement_.removeChild(element);\n    delete this.defs_[defKey];\n  }\n};\n\n\n/** @override */\ngoog.graphics.SvgGraphics.prototype.enterDocument = function() {\n  var oldPixelSize = this.getPixelSize();\n  goog.graphics.SvgGraphics.superClass_.enterDocument.call(this);\n\n  // Dispatch a resize if this is the first time the size value is accurate.\n  if (!oldPixelSize) {\n    this.dispatchEvent(goog.events.EventType.RESIZE);\n  }\n\n\n  // For percentage based heights, listen for changes to size.\n  if (this.useManualViewbox_) {\n    var width = this.width;\n    var height = this.height;\n\n    if (typeof width == 'string' && width.indexOf('%') != -1 &&\n        typeof height == 'string' && height.indexOf('%') != -1) {\n      // SVG elements don't behave well with respect to size events, so we\n      // resort to polling.\n      this.handler_.listen(\n          goog.graphics.SvgGraphics.getResizeCheckTimer_(), goog.Timer.TICK,\n          this.updateManualViewBox_);\n    }\n\n    this.updateManualViewBox_();\n  }\n};\n\n\n/** @override */\ngoog.graphics.SvgGraphics.prototype.exitDocument = function() {\n  goog.graphics.SvgGraphics.superClass_.exitDocument.call(this);\n\n  // Stop polling.\n  if (this.useManualViewbox_) {\n    this.handler_.unlisten(\n        goog.graphics.SvgGraphics.getResizeCheckTimer_(), goog.Timer.TICK,\n        this.updateManualViewBox_);\n  }\n};\n\n\n/**\n * Disposes of the component by removing event handlers, detacing DOM nodes from\n * the document body, and removing references to them.\n * @override\n * @protected\n */\ngoog.graphics.SvgGraphics.prototype.disposeInternal = function() {\n  delete this.defs_;\n  delete this.defsElement_;\n  delete this.canvasElement;\n  this.handler_.dispose();\n  delete this.handler_;\n  goog.graphics.SvgGraphics.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * The centralized resize checking timer.\n * @type {goog.Timer|undefined}\n * @private\n */\ngoog.graphics.SvgGraphics.resizeCheckTimer_;\n\n\n/**\n * @return {goog.Timer} The centralized timer object used for interval timing.\n * @private\n */\ngoog.graphics.SvgGraphics.getResizeCheckTimer_ = function() {\n  if (!goog.graphics.SvgGraphics.resizeCheckTimer_) {\n    goog.graphics.SvgGraphics.resizeCheckTimer_ = new goog.Timer(400);\n    goog.graphics.SvgGraphics.resizeCheckTimer_.start();\n  }\n\n  return /** @type {goog.Timer} */ (\n      goog.graphics.SvgGraphics.resizeCheckTimer_);\n};\n\n\n/** @override */\ngoog.graphics.SvgGraphics.prototype.isDomClonable = function() {\n  return true;\n};\n","^;",1579837703000,"^<",["^=",["~$goog.graphics.Font","^1>","^1T","^3O","~$goog.graphics.AbstractGraphics","~$goog.graphics.SvgPathElement","~$goog.graphics.SvgTextElement","^@@","^?","~$goog.graphics.SvgImageElement","^[","^93","^1C","~$goog.graphics.SvgGroupElement","^4Q","^1F","~$goog.graphics.LinearGradient","~$goog.graphics.Stroke","~$goog.graphics.SvgRectElement","~$goog.graphics.SvgEllipseElement","~$goog.graphics.SolidFill"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/svggraphics.js"],"^O",["^=",["~$goog.graphics.SvgGraphics"]],"^W",true,"^X",["^?","^3O","^1>","^1T","^1C","^C7","^C6","^C<","^93","^C@","^C=","^C?","^C;","^C:","^C8","^C>","^C9","^4Q","^@@","^1F","^["]],["^ ","^3",[1579837703000],"^4","goog.ui.css3buttonrenderer.js","^5",["^6","goog/ui/css3buttonrenderer.js"],"^7","goog/ui/css3buttonrenderer.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An alternative imageless button renderer that uses CSS3 rather\n * than voodoo to render custom buttons with rounded corners and dimensionality\n * (via a subtle flat shadow on the bottom half of the button) without the use\n * of images.\n *\n * Based on the Custom Buttons 3.1 visual specification, see\n * http://go/custombuttons\n *\n * Tested and verified to work in Gecko 1.9.2+ and WebKit 528+.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/css3button.html\n */\n\ngoog.provide('goog.ui.Css3ButtonRenderer');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.ui.Button');\ngoog.require('goog.ui.ButtonRenderer');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.INLINE_BLOCK_CLASSNAME');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Custom renderer for {@link goog.ui.Button}s. Css3 buttons can contain\n * almost arbitrary HTML content, will flow like inline elements, but can be\n * styled like block-level elements.\n *\n * @constructor\n * @extends {goog.ui.ButtonRenderer}\n * @final\n */\ngoog.ui.Css3ButtonRenderer = function() {\n  goog.ui.ButtonRenderer.call(this);\n};\ngoog.inherits(goog.ui.Css3ButtonRenderer, goog.ui.ButtonRenderer);\ngoog.addSingletonGetter(goog.ui.Css3ButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.Css3ButtonRenderer.CSS_CLASS = goog.getCssName('goog-css3-button');\n\n\n/** @override */\ngoog.ui.Css3ButtonRenderer.prototype.getContentElement = function(element) {\n  return /** @type {Element} */ (element);\n};\n\n\n/**\n * Returns the button's contents wrapped in the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-css3-button\">\n *      Contents...\n *    </div>\n *\n * Overrides {@link goog.ui.ButtonRenderer#createDom}.\n * @param {goog.ui.Control} control goog.ui.Button to render.\n * @return {!Element} Root element for the button.\n * @override\n */\ngoog.ui.Css3ButtonRenderer.prototype.createDom = function(control) {\n  var button = /** @type {goog.ui.Button} */ (control);\n  var classNames = this.getClassNames(button);\n  return button.getDomHelper().createDom(\n      goog.dom.TagName.DIV, {\n        'class': goog.ui.INLINE_BLOCK_CLASSNAME + ' ' + classNames.join(' '),\n        'title': button.getTooltip() || ''\n      },\n      button.getContent());\n};\n\n\n/**\n * Returns true if this renderer can decorate the element.  Overrides\n * {@link goog.ui.ButtonRenderer#canDecorate} by returning true if the\n * element is a DIV, false otherwise.\n * @param {Element} element Element to decorate.\n * @return {boolean} Whether the renderer can decorate the element.\n * @override\n */\ngoog.ui.Css3ButtonRenderer.prototype.canDecorate = function(element) {\n  return element.tagName == goog.dom.TagName.DIV;\n};\n\n\n/** @override */\ngoog.ui.Css3ButtonRenderer.prototype.decorate = function(button, element) {\n  goog.asserts.assert(element);\n  goog.dom.classlist.addAll(\n      element, [goog.ui.INLINE_BLOCK_CLASSNAME, this.getCssClass()]);\n  return goog.ui.Css3ButtonRenderer.superClass_.decorate.call(\n      this, button, element);\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.Css3ButtonRenderer.prototype.getCssClass = function() {\n  return goog.ui.Css3ButtonRenderer.CSS_CLASS;\n};\n\n\n// Register a decorator factory function for goog.ui.Css3ButtonRenderer.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.Css3ButtonRenderer.CSS_CLASS, function() {\n      return new goog.ui.Button(null, goog.ui.Css3ButtonRenderer.getInstance());\n    });\n\n\n// Register a decorator factory function for toggle buttons using the\n// goog.ui.Css3ButtonRenderer.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.getCssName('goog-css3-toggle-button'), function() {\n      var button =\n          new goog.ui.Button(null, goog.ui.Css3ButtonRenderer.getInstance());\n      button.setSupportedState(goog.ui.Component.State.CHECKED, true);\n      return button;\n    });\n","^;",1579837703000,"^<",["^=",["^1L","^1M","^1P","^?","^3F","~$goog.ui.ButtonRenderer","^6<","^20","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/css3buttonrenderer.js"],"^O",["^=",["~$goog.ui.Css3ButtonRenderer"]],"^W",true,"^X",["^?","^1L","^12","^1M","^6<","^CB","^1P","^20","^3F"]],["^ ","^3",[1579837703000],"^4","goog.dom.pattern.nodetype.js","^5",["^6","goog/dom/pattern/nodetype.js"],"^7","goog/dom/pattern/nodetype.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview DOM pattern to match a node of the given type.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.pattern.NodeType');\n\ngoog.require('goog.dom.pattern.AbstractPattern');\ngoog.require('goog.dom.pattern.MatchType');\n\n\n\n/**\n * Pattern object that matches any node of the given type.\n * @param {goog.dom.NodeType} nodeType The node type to match.\n * @constructor\n * @extends {goog.dom.pattern.AbstractPattern}\n * @final\n */\ngoog.dom.pattern.NodeType = function(nodeType) {\n  /**\n   * The node type to match.\n   * @type {goog.dom.NodeType}\n   * @private\n   */\n  this.nodeType_ = nodeType;\n};\ngoog.inherits(goog.dom.pattern.NodeType, goog.dom.pattern.AbstractPattern);\n\n\n/**\n * Test whether the given token is a text token which matches the string or\n * regular expression provided in the constructor.\n * @param {Node} token Token to match against.\n * @param {goog.dom.TagWalkType} type The type of token.\n * @return {goog.dom.pattern.MatchType} <code>MATCH</code> if the pattern\n *     matches, <code>NO_MATCH</code> otherwise.\n * @override\n */\ngoog.dom.pattern.NodeType.prototype.matchToken = function(token, type) {\n  return token.nodeType == this.nodeType_ ? goog.dom.pattern.MatchType.MATCH :\n                                            goog.dom.pattern.MatchType.NO_MATCH;\n};\n","^;",1579837703000,"^<",["^=",["~$goog.dom.pattern.AbstractPattern","^?","^8Q"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/nodetype.js"],"^O",["^=",["~$goog.dom.pattern.NodeType"]],"^W",true,"^X",["^?","^CD","^8Q"]],["^ ","^3",[1579837703000],"^4","goog.result.dependentresult.js","^5",["^6","goog/result/dependentresult.js"],"^7","goog/result/dependentresult.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An interface for Results whose eventual value depends on the\n *     value of one or more other Results.\n */\n\ngoog.provide('goog.result.DependentResult');\n\ngoog.require('goog.result.Result');\n\n\n\n/**\n * A DependentResult represents a Result whose eventual value depends on the\n * value of one or more other Results. For example, the Result returned by\n * @see goog.result.chain or @see goog.result.combine is dependent on the\n * Results given as arguments.\n * @interface\n * @extends {goog.result.Result}\n * @deprecated Use {@link goog.Promise} instead - http://go/promisemigration\n */\ngoog.result.DependentResult = function() {};\n\n\n/**\n *\n * @return {!Array<!goog.result.Result>} A list of Results which will affect\n *     the eventual value of this Result. The returned Results may themselves\n *     have parent results, which would be grandparents of this Result;\n *     grandparents (and any other ancestors) are not included in this list.\n */\ngoog.result.DependentResult.prototype.getParentResults = function() {};\n","^;",1579837703000,"^<",["^=",["^?","^8B"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/result/dependentresult.js"],"^O",["^=",["^8C"]],"^W",true,"^X",["^?","^8B"]],["^ ","^3",[1579837703000],"^4","goog.crypt.aes.js","^5",["^6","goog/crypt/aes.js"],"^7","goog/crypt/aes.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implementation of AES in JavaScript.\n * @see http://en.wikipedia.org/wiki/Advanced_Encryption_Standard\n *\n * @author nnaze@google.com (Nathan Naze) - port to Closure\n */\n\ngoog.provide('goog.crypt.Aes');\n\ngoog.require('goog.asserts');\ngoog.require('goog.crypt.BlockCipher');\n\n\n\n/**\n * Implementation of AES in JavaScript.\n * See http://en.wikipedia.org/wiki/Advanced_Encryption_Standard\n *\n * WARNING: This is ECB mode only. If you are encrypting something\n * longer than 16 bytes, or encrypting more than one value with the same key\n * (so basically, always) you need to use this with a block cipher mode of\n * operation.  See goog.crypt.Cbc.\n *\n * See http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation for more\n * information.\n *\n * @constructor\n * @implements {goog.crypt.BlockCipher}\n * @param {!Array<number>} key The key as an array of integers in {0, 255}.\n *     The key must have lengths of 16, 24, or 32 integers for 128-,\n *     192-, or 256-bit encryption, respectively.\n * @final\n * @struct\n */\ngoog.crypt.Aes = function(key) {\n  goog.crypt.Aes.assertKeyArray_(key);\n\n  /**\n   * The AES key.\n   * @type {!Array<number>}\n   * @private\n   */\n  this.key_ = key;\n\n  /**\n   * Key length, in words.\n   * @type {number}\n   * @private\n   */\n  this.keyLengthInWords_ = this.key_.length / 4;\n\n  /**\n   * Number of rounds.  Based on key length per AES spec.\n   * @type {number}\n   * @private\n   */\n  this.numberOfRounds_ = this.keyLengthInWords_ + 6;\n\n  /**\n   * 4x4 byte array containing the current state.\n   * @type {!Array<!Array<number>>}\n   * @private\n   */\n  this.state_ = [[], [], [], []];\n\n  /**\n   * Scratch temporary array for calculation.\n   * @type {!Array<!Array<number>>}\n   * @private\n   */\n  this.temp_ = [[], [], [], []];\n\n  /**\n   * The key schedule.\n   * @type {!Array<!Array<number>>}\n   * @private\n   */\n  this.keySchedule_;\n\n  this.keyExpansion_();\n};\n\n\n/**\n * Block size, in bytes.  Fixed at 16 per AES spec.\n * @override\n * @type {number}\n * @const\n * @public\n */\ngoog.crypt.Aes.prototype.BLOCK_SIZE = 16;\n\n/**\n * Number of words in a block.\n * @type {number}\n * @const\n * @private\n */\ngoog.crypt.Aes.BLOCK_SIZE_IN_WORDS_ = goog.crypt.Aes.prototype.BLOCK_SIZE / 4;\n\n\n/**\n * @define {boolean} Whether to call test method stubs.  This can be enabled\n *     for unit testing.\n */\ngoog.crypt.Aes.ENABLE_TEST_MODE =\n    goog.define('goog.crypt.Aes.ENABLE_TEST_MODE', false);\n\n\n/**\n * @override\n */\ngoog.crypt.Aes.prototype.encrypt = function(input) {\n\n  if (goog.crypt.Aes.ENABLE_TEST_MODE) {\n    this.testKeySchedule_(0, this.keySchedule_, 0);\n  }\n\n  this.copyInput_(input);\n  this.addRoundKey_(0);\n\n  for (var round = 1; round < this.numberOfRounds_; ++round) {\n    if (goog.crypt.Aes.ENABLE_TEST_MODE) {\n      this.testKeySchedule_(round, this.keySchedule_, round);\n      this.testStartRound_(round, this.state_);\n    }\n\n    this.subBytes_(goog.crypt.Aes.SBOX_);\n    if (goog.crypt.Aes.ENABLE_TEST_MODE) {\n      this.testAfterSubBytes_(round, this.state_);\n    }\n\n    this.shiftRows_();\n    if (goog.crypt.Aes.ENABLE_TEST_MODE) {\n      this.testAfterShiftRows_(round, this.state_);\n    }\n\n    this.mixColumns_();\n    if (goog.crypt.Aes.ENABLE_TEST_MODE) {\n      this.testAfterMixColumns_(round, this.state_);\n    }\n\n    this.addRoundKey_(round);\n  }\n\n  this.subBytes_(goog.crypt.Aes.SBOX_);\n  if (goog.crypt.Aes.ENABLE_TEST_MODE) {\n    this.testAfterSubBytes_(round, this.state_);\n  }\n\n  this.shiftRows_();\n  if (goog.crypt.Aes.ENABLE_TEST_MODE) {\n    this.testAfterShiftRows_(round, this.state_);\n  }\n\n  this.addRoundKey_(this.numberOfRounds_);\n\n  return this.generateOutput_();\n};\n\n\n/**\n * @override\n */\ngoog.crypt.Aes.prototype.decrypt = function(input) {\n\n  if (goog.crypt.Aes.ENABLE_TEST_MODE) {\n    this.testKeySchedule_(0, this.keySchedule_, this.numberOfRounds_);\n  }\n\n  this.copyInput_(input);\n  this.addRoundKey_(this.numberOfRounds_);\n\n  for (var round = 1; round < this.numberOfRounds_; ++round) {\n    if (goog.crypt.Aes.ENABLE_TEST_MODE) {\n      this.testKeySchedule_(\n          round, this.keySchedule_, this.numberOfRounds_ - round);\n      this.testStartRound_(round, this.state_);\n    }\n\n    this.invShiftRows_();\n    if (goog.crypt.Aes.ENABLE_TEST_MODE) {\n      this.testAfterShiftRows_(round, this.state_);\n    }\n\n    this.subBytes_(goog.crypt.Aes.INV_SBOX_);\n    if (goog.crypt.Aes.ENABLE_TEST_MODE) {\n      this.testAfterSubBytes_(round, this.state_);\n    }\n\n    this.addRoundKey_(this.numberOfRounds_ - round);\n    if (goog.crypt.Aes.ENABLE_TEST_MODE) {\n      this.testAfterAddRoundKey_(round, this.state_);\n    }\n\n    this.invMixColumns_();\n  }\n\n  this.invShiftRows_();\n  if (goog.crypt.Aes.ENABLE_TEST_MODE) {\n    this.testAfterShiftRows_(round, this.state_);\n  }\n\n  this.subBytes_(goog.crypt.Aes.INV_SBOX_);\n  if (goog.crypt.Aes.ENABLE_TEST_MODE) {\n    this.testAfterSubBytes_(this.numberOfRounds_, this.state_);\n  }\n\n  if (goog.crypt.Aes.ENABLE_TEST_MODE) {\n    this.testKeySchedule_(this.numberOfRounds_, this.keySchedule_, 0);\n  }\n\n  this.addRoundKey_(0);\n\n  return this.generateOutput_();\n};\n\n\n/**\n * Asserts that the key's array of integers is in the correct format.\n * @param {!Array<number>} arr AES key as array of integers.\n * @private\n */\ngoog.crypt.Aes.assertKeyArray_ = function(arr) {\n  if (goog.asserts.ENABLE_ASSERTS) {\n    goog.asserts.assert(\n        arr.length == 16 || arr.length == 24 || arr.length == 32,\n        'Key must have length 16, 24, or 32.');\n    for (var i = 0; i < arr.length; i++) {\n      goog.asserts.assertNumber(arr[i]);\n      goog.asserts.assert(arr[i] >= 0 && arr[i] <= 255);\n    }\n  }\n};\n\n\n/**\n * Tests can populate this with a callback, and that callback will get called\n * at the start of each round *in both functions encrypt() and decrypt()*.\n * @param {number} roundNum Round number.\n * @param {!Array<Array<number>>} Current state.\n * @private\n */\ngoog.crypt.Aes.prototype.testStartRound_ = goog.nullFunction;\n\n\n/**\n * Tests can populate this with a callback, and that callback will get called\n * each round right after the SubBytes step gets executed *in both functions\n * encrypt() and decrypt()*.\n * @param {number} roundNum Round number.\n * @param {!Array<Array<number>>} Current state.\n * @private\n */\ngoog.crypt.Aes.prototype.testAfterSubBytes_ = goog.nullFunction;\n\n\n/**\n * Tests can populate this with a callback, and that callback will get called\n * each round right after the ShiftRows step gets executed *in both functions\n * encrypt() and decrypt()*.\n * @param {number} roundNum Round number.\n * @param {!Array<Array<number>>} Current state.\n * @private\n */\ngoog.crypt.Aes.prototype.testAfterShiftRows_ = goog.nullFunction;\n\n\n/**\n * Tests can populate this with a callback, and that callback will get called\n * each round right after the MixColumns step gets executed *but only in the\n * decrypt() function*.\n * @param {number} roundNum Round number.\n * @param {!Array<Array<number>>} Current state.\n * @private\n */\ngoog.crypt.Aes.prototype.testAfterMixColumns_ = goog.nullFunction;\n\n\n/**\n * Tests can populate this with a callback, and that callback will get called\n * each round right after the AddRoundKey step gets executed  encrypt().\n * @param {number} roundNum Round number.\n * @param {!Array<Array<number>>} Current state.\n * @private\n */\ngoog.crypt.Aes.prototype.testAfterAddRoundKey_ = goog.nullFunction;\n\n\n/**\n * Tests can populate this with a callback, and that callback will get called\n * before each round on the round key.  *Gets called in both the encrypt() and\n * decrypt() functions.*\n * @param {number} roundNum Round number.\n * @param {Array<!Array<number>>} Computed key schedule.\n * @param {number} index The index into the key schedule to test. This is not\n *     necessarily roundNum because the key schedule is used in reverse\n *     in the case of decryption.\n * @private\n */\ngoog.crypt.Aes.prototype.testKeySchedule_ = goog.nullFunction;\n\n\n/**\n * Helper to copy input into the AES state matrix.\n * @param {!Array<number>|!Uint8Array} input Byte array to copy into the state\n *     matrix.\n * @private\n */\ngoog.crypt.Aes.prototype.copyInput_ = function(input) {\n  var v, p;\n\n  goog.asserts.assert(\n      input.length == this.BLOCK_SIZE, 'Expecting input of block size.');\n\n  for (var r = 0; r < goog.crypt.Aes.BLOCK_SIZE_IN_WORDS_; r++) {\n    for (var c = 0; c < 4; c++) {\n      p = c * 4 + r;\n      v = input[p];\n\n      goog.asserts.assert(\n          v <= 255 && v >= 0,\n          'Invalid input. Value %s at position %s is not a byte.', v, p);\n\n      this.state_[r][c] = v;\n    }\n  }\n};\n\n\n/**\n * Helper to copy the state matrix into an output array.\n * @return {!Array<number>} Output byte array.\n * @private\n */\ngoog.crypt.Aes.prototype.generateOutput_ = function() {\n  var output = [];\n  for (var r = 0; r < goog.crypt.Aes.BLOCK_SIZE_IN_WORDS_; r++) {\n    for (var c = 0; c < 4; c++) {\n      output[c * 4 + r] = this.state_[r][c];\n    }\n  }\n  return output;\n};\n\n\n/**\n * AES's AddRoundKey procedure. Add the current round key to the state.\n * @param {number} round The current round.\n * @private\n */\ngoog.crypt.Aes.prototype.addRoundKey_ = function(round) {\n  for (var r = 0; r < 4; r++) {\n    for (var c = 0; c < 4; c++) {\n      this.state_[r][c] ^= this.keySchedule_[round * 4 + c][r];\n    }\n  }\n};\n\n\n/**\n * AES's SubBytes procedure. Substitute bytes from the precomputed SBox lookup\n * into the state.\n * @param {!Array<number>} box The SBox or invSBox.\n * @private\n */\ngoog.crypt.Aes.prototype.subBytes_ = function(box) {\n  for (var r = 0; r < 4; r++) {\n    for (var c = 0; c < 4; c++) {\n      this.state_[r][c] = box[this.state_[r][c]];\n    }\n  }\n};\n\n\n/**\n * AES's ShiftRows procedure. Shift the values in each row to the right. Each\n * row is shifted one more slot than the one above it.\n * @private\n */\ngoog.crypt.Aes.prototype.shiftRows_ = function() {\n  for (var r = 1; r < 4; r++) {\n    for (var c = 0; c < 4; c++) {\n      this.temp_[r][c] = this.state_[r][c];\n    }\n  }\n\n  for (var r = 1; r < 4; r++) {\n    for (var c = 0; c < 4; c++) {\n      this.state_[r][c] =\n          this.temp_[r][(c + r) % goog.crypt.Aes.BLOCK_SIZE_IN_WORDS_];\n    }\n  }\n};\n\n\n/**\n * AES's InvShiftRows procedure. Shift the values in each row to the right.\n * @private\n */\ngoog.crypt.Aes.prototype.invShiftRows_ = function() {\n  for (var r = 1; r < 4; r++) {\n    for (var c = 0; c < 4; c++) {\n      this.temp_[r][(c + r) % goog.crypt.Aes.BLOCK_SIZE_IN_WORDS_] =\n          this.state_[r][c];\n    }\n  }\n\n  for (var r = 1; r < 4; r++) {\n    for (var c = 0; c < 4; c++) {\n      this.state_[r][c] = this.temp_[r][c];\n    }\n  }\n};\n\n\n/**\n * AES's MixColumns procedure. Mix the columns of the state using magic.\n * @private\n */\ngoog.crypt.Aes.prototype.mixColumns_ = function() {\n  var s = this.state_;\n  var t = this.temp_[0];\n\n  for (var c = 0; c < 4; c++) {\n    t[0] = s[0][c];\n    t[1] = s[1][c];\n    t[2] = s[2][c];\n    t[3] = s[3][c];\n\n    s[0][c] =\n        (goog.crypt.Aes.MULT_2_[t[0]] ^ goog.crypt.Aes.MULT_3_[t[1]] ^ t[2] ^\n         t[3]);\n    s[1][c] =\n        (t[0] ^ goog.crypt.Aes.MULT_2_[t[1]] ^ goog.crypt.Aes.MULT_3_[t[2]] ^\n         t[3]);\n    s[2][c] =\n        (t[0] ^ t[1] ^ goog.crypt.Aes.MULT_2_[t[2]] ^\n         goog.crypt.Aes.MULT_3_[t[3]]);\n    s[3][c] =\n        (goog.crypt.Aes.MULT_3_[t[0]] ^ t[1] ^ t[2] ^\n         goog.crypt.Aes.MULT_2_[t[3]]);\n  }\n};\n\n\n/**\n * AES's InvMixColumns procedure.\n * @private\n */\ngoog.crypt.Aes.prototype.invMixColumns_ = function() {\n  var s = this.state_;\n  var t = this.temp_[0];\n\n  for (var c = 0; c < 4; c++) {\n    t[0] = s[0][c];\n    t[1] = s[1][c];\n    t[2] = s[2][c];\n    t[3] = s[3][c];\n\n    s[0][c] =\n        (goog.crypt.Aes.MULT_E_[t[0]] ^ goog.crypt.Aes.MULT_B_[t[1]] ^\n         goog.crypt.Aes.MULT_D_[t[2]] ^ goog.crypt.Aes.MULT_9_[t[3]]);\n\n    s[1][c] =\n        (goog.crypt.Aes.MULT_9_[t[0]] ^ goog.crypt.Aes.MULT_E_[t[1]] ^\n         goog.crypt.Aes.MULT_B_[t[2]] ^ goog.crypt.Aes.MULT_D_[t[3]]);\n\n    s[2][c] =\n        (goog.crypt.Aes.MULT_D_[t[0]] ^ goog.crypt.Aes.MULT_9_[t[1]] ^\n         goog.crypt.Aes.MULT_E_[t[2]] ^ goog.crypt.Aes.MULT_B_[t[3]]);\n\n    s[3][c] =\n        (goog.crypt.Aes.MULT_B_[t[0]] ^ goog.crypt.Aes.MULT_D_[t[1]] ^\n         goog.crypt.Aes.MULT_9_[t[2]] ^ goog.crypt.Aes.MULT_E_[t[3]]);\n  }\n};\n\n\n/**\n * AES's KeyExpansion procedure. Create the key schedule from the initial key.\n * @private\n */\ngoog.crypt.Aes.prototype.keyExpansion_ = function() {\n  this.keySchedule_ = new Array(\n      goog.crypt.Aes.BLOCK_SIZE_IN_WORDS_ * (this.numberOfRounds_ + 1));\n\n  for (var rowNum = 0; rowNum < this.keyLengthInWords_; rowNum++) {\n    this.keySchedule_[rowNum] = [\n      this.key_[4 * rowNum], this.key_[4 * rowNum + 1],\n      this.key_[4 * rowNum + 2], this.key_[4 * rowNum + 3]\n    ];\n  }\n\n  var temp = new Array(4);\n\n  for (var rowNum = this.keyLengthInWords_; rowNum <\n       (goog.crypt.Aes.BLOCK_SIZE_IN_WORDS_ * (this.numberOfRounds_ + 1));\n       rowNum++) {\n    temp[0] = this.keySchedule_[rowNum - 1][0];\n    temp[1] = this.keySchedule_[rowNum - 1][1];\n    temp[2] = this.keySchedule_[rowNum - 1][2];\n    temp[3] = this.keySchedule_[rowNum - 1][3];\n\n    if (rowNum % this.keyLengthInWords_ == 0) {\n      this.rotWord_(temp);\n      this.subWord_(temp);\n\n      temp[0] ^= goog.crypt.Aes.RCON_[rowNum / this.keyLengthInWords_][0];\n      temp[1] ^= goog.crypt.Aes.RCON_[rowNum / this.keyLengthInWords_][1];\n      temp[2] ^= goog.crypt.Aes.RCON_[rowNum / this.keyLengthInWords_][2];\n      temp[3] ^= goog.crypt.Aes.RCON_[rowNum / this.keyLengthInWords_][3];\n    } else if (\n        this.keyLengthInWords_ > 6 && rowNum % this.keyLengthInWords_ == 4) {\n      this.subWord_(temp);\n    }\n\n    this.keySchedule_[rowNum] = new Array(4);\n    this.keySchedule_[rowNum][0] =\n        this.keySchedule_[rowNum - this.keyLengthInWords_][0] ^ temp[0];\n    this.keySchedule_[rowNum][1] =\n        this.keySchedule_[rowNum - this.keyLengthInWords_][1] ^ temp[1];\n    this.keySchedule_[rowNum][2] =\n        this.keySchedule_[rowNum - this.keyLengthInWords_][2] ^ temp[2];\n    this.keySchedule_[rowNum][3] =\n        this.keySchedule_[rowNum - this.keyLengthInWords_][3] ^ temp[3];\n  }\n};\n\n\n/**\n * AES's SubWord procedure.\n * @param {!Array<number>} w Bytes to find the SBox substitution for.\n * @return {!Array<number>} The substituted bytes.\n * @private\n */\ngoog.crypt.Aes.prototype.subWord_ = function(w) {\n  w[0] = goog.crypt.Aes.SBOX_[w[0]];\n  w[1] = goog.crypt.Aes.SBOX_[w[1]];\n  w[2] = goog.crypt.Aes.SBOX_[w[2]];\n  w[3] = goog.crypt.Aes.SBOX_[w[3]];\n\n  return w;\n};\n\n\n/**\n * AES's RotWord procedure.\n * @param {!Array<number>} w Array of bytes to rotate.\n * @return {!Array<number>} The rotated bytes.\n * @private\n */\ngoog.crypt.Aes.prototype.rotWord_ = function(w) {\n  var temp = w[0];\n\n  w[0] = w[1];\n  w[1] = w[2];\n  w[2] = w[3];\n  w[3] = temp;\n\n  return w;\n};\n\n// clang-format off\n/**\n * Precomputed SBox lookup.\n * @type {!Array<number>}\n * @private\n */\ngoog.crypt.Aes.SBOX_ = [\n  0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe,\n  0xd7, 0xab, 0x76,\n\n  0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c,\n  0xa4, 0x72, 0xc0,\n\n  0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71,\n  0xd8, 0x31, 0x15,\n\n  0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb,\n  0x27, 0xb2, 0x75,\n\n  0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29,\n  0xe3, 0x2f, 0x84,\n\n  0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a,\n  0x4c, 0x58, 0xcf,\n\n  0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50,\n  0x3c, 0x9f, 0xa8,\n\n  0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10,\n  0xff, 0xf3, 0xd2,\n\n  0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64,\n  0x5d, 0x19, 0x73,\n\n  0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde,\n  0x5e, 0x0b, 0xdb,\n\n  0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91,\n  0x95, 0xe4, 0x79,\n\n  0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65,\n  0x7a, 0xae, 0x08,\n\n  0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b,\n  0xbd, 0x8b, 0x8a,\n\n  0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86,\n  0xc1, 0x1d, 0x9e,\n\n  0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce,\n  0x55, 0x28, 0xdf,\n\n  0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0,\n  0x54, 0xbb, 0x16\n];\n\n\n/**\n * Precomputed InvSBox lookup.\n * @type {!Array<number>}\n * @private\n */\ngoog.crypt.Aes.INV_SBOX_ = [\n  0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81,\n  0xf3, 0xd7, 0xfb,\n\n  0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4,\n  0xde, 0xe9, 0xcb,\n\n  0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42,\n  0xfa, 0xc3, 0x4e,\n\n  0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d,\n  0x8b, 0xd1, 0x25,\n\n  0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d,\n  0x65, 0xb6, 0x92,\n\n  0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7,\n  0x8d, 0x9d, 0x84,\n\n  0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8,\n  0xb3, 0x45, 0x06,\n\n  0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01,\n  0x13, 0x8a, 0x6b,\n\n  0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0,\n  0xb4, 0xe6, 0x73,\n\n  0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c,\n  0x75, 0xdf, 0x6e,\n\n  0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa,\n  0x18, 0xbe, 0x1b,\n\n  0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78,\n  0xcd, 0x5a, 0xf4,\n\n  0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27,\n  0x80, 0xec, 0x5f,\n\n  0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93,\n  0xc9, 0x9c, 0xef,\n\n  0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83,\n  0x53, 0x99, 0x61,\n\n  0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55,\n  0x21, 0x0c, 0x7d\n];\n\n\n/**\n * Precomputed RCon lookup.\n * @type {!Array<!Array<number>>}\n * @private\n */\ngoog.crypt.Aes.RCON_ = [\n  [0x00, 0x00, 0x00, 0x00],\n  [0x01, 0x00, 0x00, 0x00],\n  [0x02, 0x00, 0x00, 0x00],\n  [0x04, 0x00, 0x00, 0x00],\n  [0x08, 0x00, 0x00, 0x00],\n  [0x10, 0x00, 0x00, 0x00],\n  [0x20, 0x00, 0x00, 0x00],\n  [0x40, 0x00, 0x00, 0x00],\n  [0x80, 0x00, 0x00, 0x00],\n  [0x1b, 0x00, 0x00, 0x00],\n  [0x36, 0x00, 0x00, 0x00]\n];\n\n\n/**\n * Precomputed lookup of multiplication by 2 in GF(2^8)\n * @type {!Array<number>}\n * @private\n */\ngoog.crypt.Aes.MULT_2_ = [\n  0x00, 0x02, 0x04, 0x06, 0x08, 0x0A, 0x0C, 0x0E, 0x10, 0x12, 0x14, 0x16,\n  0x18, 0x1A, 0x1C, 0x1E,\n\n  0x20, 0x22, 0x24, 0x26, 0x28, 0x2A, 0x2C, 0x2E, 0x30, 0x32, 0x34, 0x36,\n  0x38, 0x3A, 0x3C, 0x3E,\n\n  0x40, 0x42, 0x44, 0x46, 0x48, 0x4A, 0x4C, 0x4E, 0x50, 0x52, 0x54, 0x56,\n  0x58, 0x5A, 0x5C, 0x5E,\n\n  0x60, 0x62, 0x64, 0x66, 0x68, 0x6A, 0x6C, 0x6E, 0x70, 0x72, 0x74, 0x76,\n  0x78, 0x7A, 0x7C, 0x7E,\n\n  0x80, 0x82, 0x84, 0x86, 0x88, 0x8A, 0x8C, 0x8E, 0x90, 0x92, 0x94, 0x96,\n  0x98, 0x9A, 0x9C, 0x9E,\n\n  0xA0, 0xA2, 0xA4, 0xA6, 0xA8, 0xAA, 0xAC, 0xAE, 0xB0, 0xB2, 0xB4, 0xB6,\n  0xB8, 0xBA, 0xBC, 0xBE,\n\n  0xC0, 0xC2, 0xC4, 0xC6, 0xC8, 0xCA, 0xCC, 0xCE, 0xD0, 0xD2, 0xD4, 0xD6,\n  0xD8, 0xDA, 0xDC, 0xDE,\n\n  0xE0, 0xE2, 0xE4, 0xE6, 0xE8, 0xEA, 0xEC, 0xEE, 0xF0, 0xF2, 0xF4, 0xF6,\n  0xF8, 0xFA, 0xFC, 0xFE,\n\n  0x1B, 0x19, 0x1F, 0x1D, 0x13, 0x11, 0x17, 0x15, 0x0B, 0x09, 0x0F, 0x0D,\n  0x03, 0x01, 0x07, 0x05,\n\n  0x3B, 0x39, 0x3F, 0x3D, 0x33, 0x31, 0x37, 0x35, 0x2B, 0x29, 0x2F, 0x2D,\n  0x23, 0x21, 0x27, 0x25,\n\n  0x5B, 0x59, 0x5F, 0x5D, 0x53, 0x51, 0x57, 0x55, 0x4B, 0x49, 0x4F, 0x4D,\n  0x43, 0x41, 0x47, 0x45,\n\n  0x7B, 0x79, 0x7F, 0x7D, 0x73, 0x71, 0x77, 0x75, 0x6B, 0x69, 0x6F, 0x6D,\n  0x63, 0x61, 0x67, 0x65,\n\n  0x9B, 0x99, 0x9F, 0x9D, 0x93, 0x91, 0x97, 0x95, 0x8B, 0x89, 0x8F, 0x8D,\n  0x83, 0x81, 0x87, 0x85,\n\n  0xBB, 0xB9, 0xBF, 0xBD, 0xB3, 0xB1, 0xB7, 0xB5, 0xAB, 0xA9, 0xAF, 0xAD,\n  0xA3, 0xA1, 0xA7, 0xA5,\n\n  0xDB, 0xD9, 0xDF, 0xDD, 0xD3, 0xD1, 0xD7, 0xD5, 0xCB, 0xC9, 0xCF, 0xCD,\n  0xC3, 0xC1, 0xC7, 0xC5,\n\n  0xFB, 0xF9, 0xFF, 0xFD, 0xF3, 0xF1, 0xF7, 0xF5, 0xEB, 0xE9, 0xEF, 0xED,\n  0xE3, 0xE1, 0xE7, 0xE5\n];\n\n\n/**\n * Precomputed lookup of multiplication by 3 in GF(2^8)\n * @type {!Array<number>}\n * @private\n */\ngoog.crypt.Aes.MULT_3_ = [\n  0x00, 0x03, 0x06, 0x05, 0x0C, 0x0F, 0x0A, 0x09, 0x18, 0x1B, 0x1E, 0x1D,\n  0x14, 0x17, 0x12, 0x11,\n\n  0x30, 0x33, 0x36, 0x35, 0x3C, 0x3F, 0x3A, 0x39, 0x28, 0x2B, 0x2E, 0x2D,\n  0x24, 0x27, 0x22, 0x21,\n\n  0x60, 0x63, 0x66, 0x65, 0x6C, 0x6F, 0x6A, 0x69, 0x78, 0x7B, 0x7E, 0x7D,\n  0x74, 0x77, 0x72, 0x71,\n\n  0x50, 0x53, 0x56, 0x55, 0x5C, 0x5F, 0x5A, 0x59, 0x48, 0x4B, 0x4E, 0x4D,\n  0x44, 0x47, 0x42, 0x41,\n\n  0xC0, 0xC3, 0xC6, 0xC5, 0xCC, 0xCF, 0xCA, 0xC9, 0xD8, 0xDB, 0xDE, 0xDD,\n  0xD4, 0xD7, 0xD2, 0xD1,\n\n  0xF0, 0xF3, 0xF6, 0xF5, 0xFC, 0xFF, 0xFA, 0xF9, 0xE8, 0xEB, 0xEE, 0xED,\n  0xE4, 0xE7, 0xE2, 0xE1,\n\n  0xA0, 0xA3, 0xA6, 0xA5, 0xAC, 0xAF, 0xAA, 0xA9, 0xB8, 0xBB, 0xBE, 0xBD,\n  0xB4, 0xB7, 0xB2, 0xB1,\n\n  0x90, 0x93, 0x96, 0x95, 0x9C, 0x9F, 0x9A, 0x99, 0x88, 0x8B, 0x8E, 0x8D,\n  0x84, 0x87, 0x82, 0x81,\n\n  0x9B, 0x98, 0x9D, 0x9E, 0x97, 0x94, 0x91, 0x92, 0x83, 0x80, 0x85, 0x86,\n  0x8F, 0x8C, 0x89, 0x8A,\n\n  0xAB, 0xA8, 0xAD, 0xAE, 0xA7, 0xA4, 0xA1, 0xA2, 0xB3, 0xB0, 0xB5, 0xB6,\n  0xBF, 0xBC, 0xB9, 0xBA,\n\n  0xFB, 0xF8, 0xFD, 0xFE, 0xF7, 0xF4, 0xF1, 0xF2, 0xE3, 0xE0, 0xE5, 0xE6,\n  0xEF, 0xEC, 0xE9, 0xEA,\n\n  0xCB, 0xC8, 0xCD, 0xCE, 0xC7, 0xC4, 0xC1, 0xC2, 0xD3, 0xD0, 0xD5, 0xD6,\n  0xDF, 0xDC, 0xD9, 0xDA,\n\n  0x5B, 0x58, 0x5D, 0x5E, 0x57, 0x54, 0x51, 0x52, 0x43, 0x40, 0x45, 0x46,\n  0x4F, 0x4C, 0x49, 0x4A,\n\n  0x6B, 0x68, 0x6D, 0x6E, 0x67, 0x64, 0x61, 0x62, 0x73, 0x70, 0x75, 0x76,\n  0x7F, 0x7C, 0x79, 0x7A,\n\n  0x3B, 0x38, 0x3D, 0x3E, 0x37, 0x34, 0x31, 0x32, 0x23, 0x20, 0x25, 0x26,\n  0x2F, 0x2C, 0x29, 0x2A,\n\n  0x0B, 0x08, 0x0D, 0x0E, 0x07, 0x04, 0x01, 0x02, 0x13, 0x10, 0x15, 0x16,\n  0x1F, 0x1C, 0x19, 0x1A\n];\n\n\n/**\n * Precomputed lookup of multiplication by 9 in GF(2^8)\n * @type {!Array<number>}\n * @private\n */\ngoog.crypt.Aes.MULT_9_ = [\n  0x00, 0x09, 0x12, 0x1B, 0x24, 0x2D, 0x36, 0x3F, 0x48, 0x41, 0x5A, 0x53,\n  0x6C, 0x65, 0x7E, 0x77,\n\n  0x90, 0x99, 0x82, 0x8B, 0xB4, 0xBD, 0xA6, 0xAF, 0xD8, 0xD1, 0xCA, 0xC3,\n  0xFC, 0xF5, 0xEE, 0xE7,\n\n  0x3B, 0x32, 0x29, 0x20, 0x1F, 0x16, 0x0D, 0x04, 0x73, 0x7A, 0x61, 0x68,\n  0x57, 0x5E, 0x45, 0x4C,\n\n  0xAB, 0xA2, 0xB9, 0xB0, 0x8F, 0x86, 0x9D, 0x94, 0xE3, 0xEA, 0xF1, 0xF8,\n  0xC7, 0xCE, 0xD5, 0xDC,\n\n  0x76, 0x7F, 0x64, 0x6D, 0x52, 0x5B, 0x40, 0x49, 0x3E, 0x37, 0x2C, 0x25,\n  0x1A, 0x13, 0x08, 0x01,\n\n  0xE6, 0xEF, 0xF4, 0xFD, 0xC2, 0xCB, 0xD0, 0xD9, 0xAE, 0xA7, 0xBC, 0xB5,\n  0x8A, 0x83, 0x98, 0x91,\n\n  0x4D, 0x44, 0x5F, 0x56, 0x69, 0x60, 0x7B, 0x72, 0x05, 0x0C, 0x17, 0x1E,\n  0x21, 0x28, 0x33, 0x3A,\n\n  0xDD, 0xD4, 0xCF, 0xC6, 0xF9, 0xF0, 0xEB, 0xE2, 0x95, 0x9C, 0x87, 0x8E,\n  0xB1, 0xB8, 0xA3, 0xAA,\n\n  0xEC, 0xE5, 0xFE, 0xF7, 0xC8, 0xC1, 0xDA, 0xD3, 0xA4, 0xAD, 0xB6, 0xBF,\n  0x80, 0x89, 0x92, 0x9B,\n\n  0x7C, 0x75, 0x6E, 0x67, 0x58, 0x51, 0x4A, 0x43, 0x34, 0x3D, 0x26, 0x2F,\n  0x10, 0x19, 0x02, 0x0B,\n\n  0xD7, 0xDE, 0xC5, 0xCC, 0xF3, 0xFA, 0xE1, 0xE8, 0x9F, 0x96, 0x8D, 0x84,\n  0xBB, 0xB2, 0xA9, 0xA0,\n\n  0x47, 0x4E, 0x55, 0x5C, 0x63, 0x6A, 0x71, 0x78, 0x0F, 0x06, 0x1D, 0x14,\n  0x2B, 0x22, 0x39, 0x30,\n\n  0x9A, 0x93, 0x88, 0x81, 0xBE, 0xB7, 0xAC, 0xA5, 0xD2, 0xDB, 0xC0, 0xC9,\n  0xF6, 0xFF, 0xE4, 0xED,\n\n  0x0A, 0x03, 0x18, 0x11, 0x2E, 0x27, 0x3C, 0x35, 0x42, 0x4B, 0x50, 0x59,\n  0x66, 0x6F, 0x74, 0x7D,\n\n  0xA1, 0xA8, 0xB3, 0xBA, 0x85, 0x8C, 0x97, 0x9E, 0xE9, 0xE0, 0xFB, 0xF2,\n  0xCD, 0xC4, 0xDF, 0xD6,\n\n  0x31, 0x38, 0x23, 0x2A, 0x15, 0x1C, 0x07, 0x0E, 0x79, 0x70, 0x6B, 0x62,\n  0x5D, 0x54, 0x4F, 0x46\n];\n\n\n/**\n * Precomputed lookup of multiplication by 11 in GF(2^8)\n * @type {!Array<number>}\n * @private\n */\ngoog.crypt.Aes.MULT_B_ = [\n  0x00, 0x0B, 0x16, 0x1D, 0x2C, 0x27, 0x3A, 0x31, 0x58, 0x53, 0x4E, 0x45,\n  0x74, 0x7F, 0x62, 0x69,\n\n  0xB0, 0xBB, 0xA6, 0xAD, 0x9C, 0x97, 0x8A, 0x81, 0xE8, 0xE3, 0xFE, 0xF5,\n  0xC4, 0xCF, 0xD2, 0xD9,\n\n  0x7B, 0x70, 0x6D, 0x66, 0x57, 0x5C, 0x41, 0x4A, 0x23, 0x28, 0x35, 0x3E,\n  0x0F, 0x04, 0x19, 0x12,\n\n  0xCB, 0xC0, 0xDD, 0xD6, 0xE7, 0xEC, 0xF1, 0xFA, 0x93, 0x98, 0x85, 0x8E,\n  0xBF, 0xB4, 0xA9, 0xA2,\n\n  0xF6, 0xFD, 0xE0, 0xEB, 0xDA, 0xD1, 0xCC, 0xC7, 0xAE, 0xA5, 0xB8, 0xB3,\n  0x82, 0x89, 0x94, 0x9F,\n\n  0x46, 0x4D, 0x50, 0x5B, 0x6A, 0x61, 0x7C, 0x77, 0x1E, 0x15, 0x08, 0x03,\n  0x32, 0x39, 0x24, 0x2F,\n\n  0x8D, 0x86, 0x9B, 0x90, 0xA1, 0xAA, 0xB7, 0xBC, 0xD5, 0xDE, 0xC3, 0xC8,\n  0xF9, 0xF2, 0xEF, 0xE4,\n\n  0x3D, 0x36, 0x2B, 0x20, 0x11, 0x1A, 0x07, 0x0C, 0x65, 0x6E, 0x73, 0x78,\n  0x49, 0x42, 0x5F, 0x54,\n\n  0xF7, 0xFC, 0xE1, 0xEA, 0xDB, 0xD0, 0xCD, 0xC6, 0xAF, 0xA4, 0xB9, 0xB2,\n  0x83, 0x88, 0x95, 0x9E,\n\n  0x47, 0x4C, 0x51, 0x5A, 0x6B, 0x60, 0x7D, 0x76, 0x1F, 0x14, 0x09, 0x02,\n  0x33, 0x38, 0x25, 0x2E,\n\n  0x8C, 0x87, 0x9A, 0x91, 0xA0, 0xAB, 0xB6, 0xBD, 0xD4, 0xDF, 0xC2, 0xC9,\n  0xF8, 0xF3, 0xEE, 0xE5,\n\n  0x3C, 0x37, 0x2A, 0x21, 0x10, 0x1B, 0x06, 0x0D, 0x64, 0x6F, 0x72, 0x79,\n  0x48, 0x43, 0x5E, 0x55,\n\n  0x01, 0x0A, 0x17, 0x1C, 0x2D, 0x26, 0x3B, 0x30, 0x59, 0x52, 0x4F, 0x44,\n  0x75, 0x7E, 0x63, 0x68,\n\n  0xB1, 0xBA, 0xA7, 0xAC, 0x9D, 0x96, 0x8B, 0x80, 0xE9, 0xE2, 0xFF, 0xF4,\n  0xC5, 0xCE, 0xD3, 0xD8,\n\n  0x7A, 0x71, 0x6C, 0x67, 0x56, 0x5D, 0x40, 0x4B, 0x22, 0x29, 0x34, 0x3F,\n  0x0E, 0x05, 0x18, 0x13,\n\n  0xCA, 0xC1, 0xDC, 0xD7, 0xE6, 0xED, 0xF0, 0xFB, 0x92, 0x99, 0x84, 0x8F,\n  0xBE, 0xB5, 0xA8, 0xA3\n];\n\n\n/**\n * Precomputed lookup of multiplication by 13 in GF(2^8)\n * @type {!Array<number>}\n * @private\n */\ngoog.crypt.Aes.MULT_D_ = [\n  0x00, 0x0D, 0x1A, 0x17, 0x34, 0x39, 0x2E, 0x23, 0x68, 0x65, 0x72, 0x7F,\n  0x5C, 0x51, 0x46, 0x4B,\n\n  0xD0, 0xDD, 0xCA, 0xC7, 0xE4, 0xE9, 0xFE, 0xF3, 0xB8, 0xB5, 0xA2, 0xAF,\n  0x8C, 0x81, 0x96, 0x9B,\n\n  0xBB, 0xB6, 0xA1, 0xAC, 0x8F, 0x82, 0x95, 0x98, 0xD3, 0xDE, 0xC9, 0xC4,\n  0xE7, 0xEA, 0xFD, 0xF0,\n\n  0x6B, 0x66, 0x71, 0x7C, 0x5F, 0x52, 0x45, 0x48, 0x03, 0x0E, 0x19, 0x14,\n  0x37, 0x3A, 0x2D, 0x20,\n\n  0x6D, 0x60, 0x77, 0x7A, 0x59, 0x54, 0x43, 0x4E, 0x05, 0x08, 0x1F, 0x12,\n  0x31, 0x3C, 0x2B, 0x26,\n\n  0xBD, 0xB0, 0xA7, 0xAA, 0x89, 0x84, 0x93, 0x9E, 0xD5, 0xD8, 0xCF, 0xC2,\n  0xE1, 0xEC, 0xFB, 0xF6,\n\n  0xD6, 0xDB, 0xCC, 0xC1, 0xE2, 0xEF, 0xF8, 0xF5, 0xBE, 0xB3, 0xA4, 0xA9,\n  0x8A, 0x87, 0x90, 0x9D,\n\n  0x06, 0x0B, 0x1C, 0x11, 0x32, 0x3F, 0x28, 0x25, 0x6E, 0x63, 0x74, 0x79,\n  0x5A, 0x57, 0x40, 0x4D,\n\n  0xDA, 0xD7, 0xC0, 0xCD, 0xEE, 0xE3, 0xF4, 0xF9, 0xB2, 0xBF, 0xA8, 0xA5,\n  0x86, 0x8B, 0x9C, 0x91,\n\n  0x0A, 0x07, 0x10, 0x1D, 0x3E, 0x33, 0x24, 0x29, 0x62, 0x6F, 0x78, 0x75,\n  0x56, 0x5B, 0x4C, 0x41,\n\n  0x61, 0x6C, 0x7B, 0x76, 0x55, 0x58, 0x4F, 0x42, 0x09, 0x04, 0x13, 0x1E,\n  0x3D, 0x30, 0x27, 0x2A,\n\n  0xB1, 0xBC, 0xAB, 0xA6, 0x85, 0x88, 0x9F, 0x92, 0xD9, 0xD4, 0xC3, 0xCE,\n  0xED, 0xE0, 0xF7, 0xFA,\n\n  0xB7, 0xBA, 0xAD, 0xA0, 0x83, 0x8E, 0x99, 0x94, 0xDF, 0xD2, 0xC5, 0xC8,\n  0xEB, 0xE6, 0xF1, 0xFC,\n\n  0x67, 0x6A, 0x7D, 0x70, 0x53, 0x5E, 0x49, 0x44, 0x0F, 0x02, 0x15, 0x18,\n  0x3B, 0x36, 0x21, 0x2C,\n\n  0x0C, 0x01, 0x16, 0x1B, 0x38, 0x35, 0x22, 0x2F, 0x64, 0x69, 0x7E, 0x73,\n  0x50, 0x5D, 0x4A, 0x47,\n\n  0xDC, 0xD1, 0xC6, 0xCB, 0xE8, 0xE5, 0xF2, 0xFF, 0xB4, 0xB9, 0xAE, 0xA3,\n  0x80, 0x8D, 0x9A, 0x97\n];\n\n\n/**\n * Precomputed lookup of multiplication by 14 in GF(2^8)\n * @type {!Array<number>}\n * @private\n */\ngoog.crypt.Aes.MULT_E_ = [\n  0x00, 0x0E, 0x1C, 0x12, 0x38, 0x36, 0x24, 0x2A, 0x70, 0x7E, 0x6C, 0x62,\n  0x48, 0x46, 0x54, 0x5A,\n\n  0xE0, 0xEE, 0xFC, 0xF2, 0xD8, 0xD6, 0xC4, 0xCA, 0x90, 0x9E, 0x8C, 0x82,\n  0xA8, 0xA6, 0xB4, 0xBA,\n\n  0xDB, 0xD5, 0xC7, 0xC9, 0xE3, 0xED, 0xFF, 0xF1, 0xAB, 0xA5, 0xB7, 0xB9,\n  0x93, 0x9D, 0x8F, 0x81,\n\n  0x3B, 0x35, 0x27, 0x29, 0x03, 0x0D, 0x1F, 0x11, 0x4B, 0x45, 0x57, 0x59,\n  0x73, 0x7D, 0x6F, 0x61,\n\n  0xAD, 0xA3, 0xB1, 0xBF, 0x95, 0x9B, 0x89, 0x87, 0xDD, 0xD3, 0xC1, 0xCF,\n  0xE5, 0xEB, 0xF9, 0xF7,\n\n  0x4D, 0x43, 0x51, 0x5F, 0x75, 0x7B, 0x69, 0x67, 0x3D, 0x33, 0x21, 0x2F,\n  0x05, 0x0B, 0x19, 0x17,\n\n  0x76, 0x78, 0x6A, 0x64, 0x4E, 0x40, 0x52, 0x5C, 0x06, 0x08, 0x1A, 0x14,\n  0x3E, 0x30, 0x22, 0x2C,\n\n  0x96, 0x98, 0x8A, 0x84, 0xAE, 0xA0, 0xB2, 0xBC, 0xE6, 0xE8, 0xFA, 0xF4,\n  0xDE, 0xD0, 0xC2, 0xCC,\n\n  0x41, 0x4F, 0x5D, 0x53, 0x79, 0x77, 0x65, 0x6B, 0x31, 0x3F, 0x2D, 0x23,\n  0x09, 0x07, 0x15, 0x1B,\n\n  0xA1, 0xAF, 0xBD, 0xB3, 0x99, 0x97, 0x85, 0x8B, 0xD1, 0xDF, 0xCD, 0xC3,\n  0xE9, 0xE7, 0xF5, 0xFB,\n\n  0x9A, 0x94, 0x86, 0x88, 0xA2, 0xAC, 0xBE, 0xB0, 0xEA, 0xE4, 0xF6, 0xF8,\n  0xD2, 0xDC, 0xCE, 0xC0,\n\n  0x7A, 0x74, 0x66, 0x68, 0x42, 0x4C, 0x5E, 0x50, 0x0A, 0x04, 0x16, 0x18,\n  0x32, 0x3C, 0x2E, 0x20,\n\n  0xEC, 0xE2, 0xF0, 0xFE, 0xD4, 0xDA, 0xC8, 0xC6, 0x9C, 0x92, 0x80, 0x8E,\n  0xA4, 0xAA, 0xB8, 0xB6,\n\n  0x0C, 0x02, 0x10, 0x1E, 0x34, 0x3A, 0x28, 0x26, 0x7C, 0x72, 0x60, 0x6E,\n  0x44, 0x4A, 0x58, 0x56,\n\n  0x37, 0x39, 0x2B, 0x25, 0x0F, 0x01, 0x13, 0x1D, 0x47, 0x49, 0x5B, 0x55,\n  0x7F, 0x71, 0x63, 0x6D,\n\n  0xD7, 0xD9, 0xCB, 0xC5, 0xEF, 0xE1, 0xF3, 0xFD, 0xA7, 0xA9, 0xBB, 0xB5,\n  0x9F, 0x91, 0x83, 0x8D\n];\n// clang-format on\n","^;",1579837703000,"^<",["^=",["^1L","~$goog.crypt.BlockCipher","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/aes.js"],"^O",["^=",["~$goog.crypt.Aes"]],"^W",true,"^X",["^?","^1L","^CF"]],["^ ","^3",[1579837703000],"^4","goog.labs.net.webchannel.connectionstate.js","^5",["^6","goog/labs/net/webchannel/connectionstate.js"],"^7","goog/labs/net/webchannel/connectionstate.js","^8","^9","^:","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This class manages the network connectivity state.\n */\n\n\ngoog.provide('goog.labs.net.webChannel.ConnectionState');\n\n\n\n/**\n * The connectivity state of the channel.\n *\n * @constructor\n * @struct\n */\ngoog.labs.net.webChannel.ConnectionState = function() {\n  /**\n   * Handshake result.\n   * @type {?Array<string>}\n   */\n  this.handshakeResult = null;\n\n  /**\n   * The result of checking if there is a buffering proxy in the network.\n   * True means the connection is buffered, False means unbuffered,\n   * null means that the result is not available.\n   * @type {?boolean}\n   */\n  this.bufferingProxyResult = null;\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchannel/connectionstate.js"],"^O",["^=",["~$goog.labs.net.webChannel.ConnectionState"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.ui.abstractspellchecker.js","^5",["^6","goog/ui/abstractspellchecker.js"],"^7","goog/ui/abstractspellchecker.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Abstract base class for spell checker implementations.\n *\n * The spell checker supports two modes - synchronous and asynchronous.\n *\n * In synchronous mode subclass calls processText_ which processes all the text\n * given to it before it returns. If the text string is very long, it could\n * cause warnings from the browser that considers the script to be\n * busy-looping.\n *\n * Asynchronous mode allows breaking processing large text segments without\n * encountering stop script warnings by rescheduling remaining parts of the\n * text processing to another stack.\n *\n * In asynchronous mode abstract spell checker keeps track of a number of text\n * chunks that have been processed after the very beginning, and returns every\n * so often so that the calling function could reschedule its execution on a\n * different stack (for example by calling setInterval(0)).\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.ui.AbstractSpellChecker');\ngoog.provide('goog.ui.AbstractSpellChecker.AsyncResult');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.dom.selection');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventType');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.spell.SpellCheck');\ngoog.require('goog.structs.Set');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.MenuItem');\ngoog.require('goog.ui.MenuSeparator');\ngoog.require('goog.ui.PopupMenu');\n\n\n\n/**\n * Abstract base class for spell checker editor implementations. Provides basic\n * functionality such as word lookup and caching.\n *\n * @param {goog.spell.SpellCheck} spellCheck Instance of the SpellCheck\n *     support object to use. A single instance can be shared by multiple editor\n *     components.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.Component}\n */\ngoog.ui.AbstractSpellChecker = function(spellCheck, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * Handler to use for caching and lookups.\n   * @type {goog.spell.SpellCheck}\n   * @protected\n   */\n  this.spellCheck = spellCheck;\n\n  /**\n   * Word to element references. Used by replace/ignore.\n   * @type {Object}\n   * @private\n   */\n  this.wordElements_ = {};\n\n  /**\n   * List of all 'edit word' input elements.\n   * @type {Array<Element>}\n   * @private\n   */\n  this.inputElements_ = [];\n\n  /**\n   * Global regular expression for splitting a string into individual words and\n   * blocks of separators. Matches zero or one word followed by zero or more\n   * separators.\n   * @type {RegExp}\n   * @private\n   */\n  this.splitRegex_ = new RegExp(\n      '([^' + goog.spell.SpellCheck.WORD_BOUNDARY_CHARS + ']*)' +\n          '([' + goog.spell.SpellCheck.WORD_BOUNDARY_CHARS + ']*)',\n      'g');\n\n  goog.events.listen(\n      this.spellCheck, goog.spell.SpellCheck.EventType.WORD_CHANGED,\n      this.onWordChanged_, false, this);\n};\ngoog.inherits(goog.ui.AbstractSpellChecker, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.AbstractSpellChecker);\n\n\n/**\n * The prefix to mark keys with.\n * @type {string}\n * @private\n */\ngoog.ui.AbstractSpellChecker.KEY_PREFIX_ = ':';\n\n\n/**\n * The attribute name for original element contents (to offer subsequent\n * correction menu).\n * @type {string}\n * @private\n */\ngoog.ui.AbstractSpellChecker.ORIGINAL_ = 'g-spell-original';\n\n\n/**\n * Suggestions menu.\n *\n * @type {goog.ui.PopupMenu|undefined}\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.menu_;\n\n\n/**\n * Separator between suggestions and ignore in suggestions menu.\n *\n * @type {goog.ui.MenuSeparator|undefined}\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.menuSeparator_;\n\n\n/**\n * Menu item for ignore option.\n *\n * @type {goog.ui.MenuItem|undefined}\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.menuIgnore_;\n\n\n/**\n * Menu item for edit word option.\n *\n * @type {goog.ui.MenuItem|undefined}\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.menuEdit_;\n\n\n/**\n * Whether the correction UI is visible.\n *\n * @type {boolean}\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.isVisible_ = false;\n\n\n/**\n * Cache for corrected words. All corrected words are reverted to their original\n * status on resume. Therefore that status is never written to the cache and is\n * instead indicated by this set.\n *\n * @type {goog.structs.Set|undefined}\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.correctedWords_;\n\n\n/**\n * Class name for suggestions menu.\n *\n * @type {string}\n */\ngoog.ui.AbstractSpellChecker.prototype.suggestionsMenuClassName =\n    goog.getCssName('goog-menu');\n\n\n/**\n * Whether corrected words should be highlighted.\n *\n * @type {boolean}\n */\ngoog.ui.AbstractSpellChecker.prototype.markCorrected = false;\n\n\n/**\n * Word the correction menu is displayed for.\n *\n * @type {string|undefined}\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.activeWord_;\n\n\n/**\n * Element the correction menu is displayed for.\n *\n * @type {Element|undefined}\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.activeElement_;\n\n\n/**\n * Indicator that the spell checker is running in the asynchronous mode.\n *\n * @type {boolean}\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.asyncMode_ = false;\n\n\n/**\n * Maximum number of words to process on a single stack in asynchronous mode.\n *\n * @type {number}\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.asyncWordsPerBatch_ = 1000;\n\n\n/**\n * Current text to process when running in the asynchronous mode.\n *\n * @type {string|undefined}\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.asyncText_;\n\n\n/**\n * Current start index of the range that spell-checked correctly.\n *\n * @type {number|undefined}\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.asyncRangeStart_;\n\n\n/**\n * Current node with which the asynchronous text is associated.\n *\n * @type {Node|undefined}\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.asyncNode_;\n\n\n/**\n * Number of elements processed in the asyncronous mode since last yield.\n *\n * @type {number}\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.processedElementsCount_ = 0;\n\n\n/**\n * Markers for the text that does not need to be included in the processing.\n *\n * For rich text editor this is a list of strings formatted as\n * tagName.className or className. If both are specified, the element will be\n * excluded if BOTH are matched. If only a className is specified, then we will\n * exclude regions with the className. If only one marker is needed, it may be\n * passed as a string.\n * For plain text editor this is a RegExp that matches the excluded text.\n *\n * Used exclusively by the derived classes\n *\n * @type {Array<string>|string|RegExp|undefined}\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.excludeMarker;\n\n\n/**\n * Numeric Id of the element that has focus. 0 when not set.\n *\n * @private {number}\n */\ngoog.ui.AbstractSpellChecker.prototype.focusedElementIndex_ = 0;\n\n\n/**\n * Index for the most recently added misspelled word.\n *\n * @private {number}\n */\ngoog.ui.AbstractSpellChecker.prototype.lastIndex_ = 0;\n\n\n/**\n * @return {goog.spell.SpellCheck} The handler used for caching and lookups.\n */\ngoog.ui.AbstractSpellChecker.prototype.getSpellCheck = function() {\n  return this.spellCheck;\n};\n\n/**\n * Sets the spell checker used for caching and lookups.\n * @param {goog.spell.SpellCheck} spellCheck The handler used for caching and\n *     lookups.\n */\ngoog.ui.AbstractSpellChecker.prototype.setSpellCheck = function(spellCheck) {\n  this.spellCheck = spellCheck;\n};\n\n\n/**\n * Sets the handler used for caching and lookups.\n * @param {goog.spell.SpellCheck} handler The handler used for caching and\n *     lookups.\n * @deprecated Use #setSpellCheck instead.\n */\ngoog.ui.AbstractSpellChecker.prototype.setHandler = function(handler) {\n  this.setSpellCheck(handler);\n};\n\n\n/**\n * @return {goog.ui.PopupMenu|undefined} The suggestions menu.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.getMenu = function() {\n  return this.menu_;\n};\n\n\n/**\n * @return {goog.ui.MenuItem|undefined} The menu item for edit word option.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.getMenuEdit = function() {\n  return this.menuEdit_;\n};\n\n\n/**\n * @return {number} The index of the latest misspelled word to be added.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.getLastIndex = function() {\n  return this.lastIndex_;\n};\n\n\n/**\n * @return {number} Increments and returns the index for the next misspelled\n *     word to be added.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.getNextIndex = function() {\n  return ++this.lastIndex_;\n};\n\n\n/**\n * Sets the marker for the excluded text.\n *\n * {@see goog.ui.AbstractSpellChecker.prototype.excludeMarker}\n *\n * @param {Array<string>|string|RegExp|null} marker A RegExp for plain text\n *        or class names for the rich text spell checker for the elements to\n *        exclude from checking.\n */\ngoog.ui.AbstractSpellChecker.prototype.setExcludeMarker = function(marker) {\n  this.excludeMarker = marker || undefined;\n};\n\n\n/**\n * Checks spelling for all text.\n * Should be overridden by implementation.\n */\ngoog.ui.AbstractSpellChecker.prototype.check = function() {\n  this.isVisible_ = true;\n  if (this.markCorrected) {\n    this.correctedWords_ = new goog.structs.Set();\n  }\n};\n\n\n/**\n * Hides correction UI.\n * Should be overridden by implementation.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.AbstractSpellChecker.prototype.resume = function() {\n  this.isVisible_ = false;\n  this.clearWordElements();\n  this.lastIndex_ = 0;\n  this.setFocusedElementIndex(0);\n\n  var input;\n  while (input = this.inputElements_.pop()) {\n    input.parentNode.replaceChild(\n        this.getDomHelper().createTextNode(input.value), input);\n  }\n\n  if (this.correctedWords_) {\n    this.correctedWords_.clear();\n  }\n};\n\n\n/**\n * @return {boolean} Whether the correction ui is visible.\n */\ngoog.ui.AbstractSpellChecker.prototype.isVisible = function() {\n  return this.isVisible_;\n};\n\n\n/**\n * Clears the word to element references map used by replace/ignore.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.clearWordElements = function() {\n  this.wordElements_ = {};\n};\n\n\n/**\n * Ignores spelling of word.\n *\n * @param {string} word Word to add.\n */\ngoog.ui.AbstractSpellChecker.prototype.ignoreWord = function(word) {\n  this.spellCheck.setWordStatus(word, goog.spell.SpellCheck.WordStatus.IGNORED);\n};\n\n\n/**\n * Edits a word.\n *\n * @param {Element} el An element wrapping the word that should be edited.\n * @param {string} old Word to edit.\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.editWord_ = function(el, old) {\n  var input = this.getDomHelper().createDom(\n      goog.dom.TagName.INPUT, {'type': goog.dom.InputType.TEXT, 'value': old});\n  var w = goog.style.getSize(el).width;\n\n  // Minimum width to ensure there's always enough room to type.\n  if (w < 50) {\n    w = 50;\n  }\n  input.style.width = w + 'px';\n  el.parentNode.replaceChild(input, el);\n  try {\n    input.focus();\n    goog.dom.selection.setCursorPosition(input, old.length);\n  } catch (o) {\n  }\n\n  this.inputElements_.push(input);\n};\n\n\n/**\n * Replaces word.\n *\n * @param {Element} el An element wrapping the word that should be replaced.\n * @param {string} old Word that was replaced.\n * @param {string} word Word to replace with.\n */\ngoog.ui.AbstractSpellChecker.prototype.replaceWord = function(el, old, word) {\n  if (old != word) {\n    if (!el.getAttribute(goog.ui.AbstractSpellChecker.ORIGINAL_)) {\n      el.setAttribute(goog.ui.AbstractSpellChecker.ORIGINAL_, old);\n    }\n    goog.dom.setTextContent(el, word);\n\n    var status = this.spellCheck.checkWord(word);\n\n    // Indicate that the word is corrected unless the status is 'INVALID'.\n    // (if markCorrected is enabled).\n    if (this.markCorrected && this.correctedWords_ &&\n        status != goog.spell.SpellCheck.WordStatus.INVALID) {\n      this.correctedWords_.add(word);\n      status = goog.spell.SpellCheck.WordStatus.CORRECTED;\n    }\n\n    // Avoid potential collision with the built-in object namespace. For\n    // example, 'watch' is a reserved name in FireFox.\n    var oldIndex = goog.ui.AbstractSpellChecker.toInternalKey_(old);\n    var newIndex = goog.ui.AbstractSpellChecker.toInternalKey_(word);\n\n    // Remove reference between old word and element\n    var elements = this.wordElements_[oldIndex];\n    goog.array.remove(elements, el);\n\n    if (status != goog.spell.SpellCheck.WordStatus.VALID) {\n      // Create reference between new word and element\n      if (this.wordElements_[newIndex]) {\n        this.wordElements_[newIndex].push(el);\n      } else {\n        this.wordElements_[newIndex] = [el];\n      }\n    }\n\n    // Update element based on status.\n    this.updateElement(el, word, status);\n\n    this.dispatchEvent(goog.events.EventType.CHANGE);\n  }\n};\n\n\n/**\n * Retrieves the array of suggested spelling choices.\n *\n * @return {Array<string>} Suggested spelling choices.\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.getSuggestions_ = function() {\n  // Add new suggestion entries.\n  var suggestions = this.spellCheck.getSuggestions(\n      /** @type {string} */ (this.activeWord_));\n  if (!suggestions[0]) {\n    var originalWord = this.activeElement_.getAttribute(\n        goog.ui.AbstractSpellChecker.ORIGINAL_);\n    if (originalWord && originalWord != this.activeWord_) {\n      suggestions = this.spellCheck.getSuggestions(originalWord);\n    }\n  }\n  return suggestions;\n};\n\n\n/**\n * Displays suggestions menu.\n * @param {Element} el Element to display menu for.\n * @param {goog.events.BrowserEvent|goog.math.Coordinate=} opt_pos Position to\n *     display menu at relative to the viewport (in client coordinates), or a\n *     mouse event.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.AbstractSpellChecker.prototype.showSuggestionsMenu = function(\n    el, opt_pos) {\n  this.activeWord_ = goog.dom.getTextContent(el);\n  this.activeElement_ = el;\n\n  // Remove suggestion entries from menu, if any.\n  while (this.menu_.getChildAt(0) != this.menuSeparator_) {\n    this.menu_.removeChildAt(0, true).dispose();\n  }\n\n  // Add new suggestion entries.\n  var suggestions = this.getSuggestions_();\n  for (var suggestion, i = 0; suggestion = suggestions[i]; i++) {\n    this.menu_.addChildAt(\n        new goog.ui.MenuItem(suggestion, suggestion, this.getDomHelper()), i,\n        true);\n  }\n\n  if (!suggestions[0]) {\n    /** @desc Item shown in menu when no suggestions are available. */\n    var MSG_SPELL_NO_SUGGESTIONS = goog.getMsg('No Suggestions');\n    var item =\n        new goog.ui.MenuItem(MSG_SPELL_NO_SUGGESTIONS, '', this.getDomHelper());\n    item.setEnabled(false);\n    this.menu_.addChildAt(item, 0, true);\n  }\n\n  // Show 'Edit word' option if {@link markCorrected} is enabled and don't show\n  // 'Ignore' option for corrected words.\n  if (this.markCorrected) {\n    var corrected =\n        this.correctedWords_ && this.correctedWords_.contains(this.activeWord_);\n    this.menuIgnore_.setVisible(!corrected);\n    this.menuEdit_.setVisible(true);\n  } else {\n    this.menuIgnore_.setVisible(true);\n    this.menuEdit_.setVisible(false);\n  }\n\n  if (opt_pos) {\n    if (!(opt_pos instanceof goog.math.Coordinate)) {  // it's an event\n      var posX = opt_pos.clientX;\n      var posY = opt_pos.clientY;\n      // Certain implementations which derive from AbstractSpellChecker\n      // use an iframe in which case the coordinates are relative to\n      // that iframe's view port.\n      if (this.getElement().contentDocument ||\n          this.getElement().contentWindow) {\n        var offset = goog.style.getClientPosition(this.getElement());\n        posX += offset.x;\n        posY += offset.y;\n      }\n      opt_pos = new goog.math.Coordinate(posX, posY);\n    }\n    this.menu_.showAt(opt_pos.x, opt_pos.y);\n  } else {\n    this.menu_.setVisible(true);\n  }\n};\n\n\n/**\n * Initializes suggestions menu. Populates menu with separator and ignore option\n * that are always valid. Suggestions are later added above the separator.\n *\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.initSuggestionsMenu = function() {\n  this.menu_ = new goog.ui.PopupMenu(this.getDomHelper());\n  this.menuSeparator_ = new goog.ui.MenuSeparator(this.getDomHelper());\n\n  // Leave alone setAllowAutoFocus at default (true). This allows menu to get\n  // keyboard focus and thus allowing non-mouse users to get to the menu.\n\n  /** @desc Ignore entry in suggestions menu. */\n  var MSG_SPELL_IGNORE = goog.getMsg('Ignore');\n\n  /** @desc Edit word entry in suggestions menu. */\n  var MSG_SPELL_EDIT_WORD = goog.getMsg('Edit Word');\n\n  this.menu_.addChild(this.menuSeparator_, true);\n  this.menuIgnore_ =\n      new goog.ui.MenuItem(MSG_SPELL_IGNORE, '', this.getDomHelper());\n  this.menu_.addChild(this.menuIgnore_, true);\n  this.menuEdit_ =\n      new goog.ui.MenuItem(MSG_SPELL_EDIT_WORD, '', this.getDomHelper());\n  this.menuEdit_.setVisible(false);\n  this.menu_.addChild(this.menuEdit_, true);\n  this.menu_.setParent(this);\n  this.menu_.render();\n\n  var menuElement = this.menu_.getElement();\n  goog.asserts.assert(menuElement);\n  goog.dom.classlist.add(menuElement, this.suggestionsMenuClassName);\n\n  goog.events.listen(\n      this.menu_, goog.ui.Component.EventType.ACTION, this.onCorrectionAction,\n      false, this);\n};\n\n\n/**\n * Handles correction menu actions.\n * @param {goog.events.Event} event Action event.\n * @protected\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.AbstractSpellChecker.prototype.onCorrectionAction = function(event) {\n  var word = /** @type {string} */ (this.activeWord_);\n  var el = /** @type {Element} */ (this.activeElement_);\n  if (event.target == this.menuIgnore_) {\n    this.ignoreWord(word);\n  } else if (event.target == this.menuEdit_) {\n    this.editWord_(el, word);\n  } else {\n    this.replaceWord(el, word, event.target.getModel());\n    this.dispatchEvent(goog.ui.Component.EventType.CHANGE);\n  }\n\n  delete this.activeWord_;\n  delete this.activeElement_;\n};\n\n\n/**\n * Removes spell-checker markup and restore the node to text.\n *\n * @param {Element} el Word element. MUST have a text node child.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.removeMarkup = function(el) {\n  var firstChild = el.firstChild;\n  var text = firstChild.nodeValue;\n\n  if (el.nextSibling && el.nextSibling.nodeType == goog.dom.NodeType.TEXT) {\n    if (el.previousSibling &&\n        el.previousSibling.nodeType == goog.dom.NodeType.TEXT) {\n      el.previousSibling.nodeValue =\n          el.previousSibling.nodeValue + text + el.nextSibling.nodeValue;\n      this.getDomHelper().removeNode(el.nextSibling);\n    } else {\n      el.nextSibling.nodeValue = text + el.nextSibling.nodeValue;\n    }\n  } else if (\n      el.previousSibling &&\n      el.previousSibling.nodeType == goog.dom.NodeType.TEXT) {\n    el.previousSibling.nodeValue += text;\n  } else {\n    el.parentNode.insertBefore(firstChild, el);\n  }\n\n  this.getDomHelper().removeNode(el);\n};\n\n\n/**\n * Updates element based on word status. Either converts it to a text node, or\n * merges it with the previous or next text node if the status of the world is\n * VALID, in which case the element itself is eliminated.\n *\n * @param {Element} el Word element.\n * @param {string} word Word to update status for.\n * @param {goog.spell.SpellCheck.WordStatus} status Status of word.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.updateElement = function(\n    el, word, status) {\n  if (this.markCorrected && this.correctedWords_ &&\n      this.correctedWords_.contains(word)) {\n    status = goog.spell.SpellCheck.WordStatus.CORRECTED;\n  }\n  if (status == goog.spell.SpellCheck.WordStatus.VALID) {\n    this.removeMarkup(el);\n  } else {\n    goog.dom.setProperties(el, this.getElementProperties(status));\n  }\n};\n\n\n/**\n * Generates unique Ids for spell checker elements.\n * @param {number=} opt_id Id to suffix with.\n * @return {string} Unique element id.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.makeElementId = function(opt_id) {\n  return this.getId() + '.' + (opt_id ? opt_id : this.getNextIndex());\n};\n\n\n/**\n * Returns the span element that matches the given number index.\n * @param {number} index Number index that is used in the element id.\n * @return {Element} The matching span element or null if no span matches.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.getElementByIndex = function(index) {\n  return this.getDomHelper().getElement(this.makeElementId(index));\n};\n\n\n/**\n * Creates an element for a specified word and stores a reference to it.\n *\n * @param {string} word Word to create element for.\n * @param {goog.spell.SpellCheck.WordStatus} status Status of word.\n * @return {!HTMLSpanElement} The created element.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.createWordElement = function(\n    word, status) {\n  var parameters = this.getElementProperties(status);\n\n  // Add id & tabindex as necessary.\n  if (!parameters['id']) {\n    parameters['id'] = this.makeElementId();\n  }\n  if (!parameters['tabIndex']) {\n    parameters['tabIndex'] = -1;\n  }\n\n  var el =\n      this.getDomHelper().createDom(goog.dom.TagName.SPAN, parameters, word);\n  goog.a11y.aria.setRole(el, 'menuitem');\n  goog.a11y.aria.setState(el, 'haspopup', true);\n  this.registerWordElement(word, el);\n\n  return el;\n};\n\n\n/**\n * Stores a reference to word element.\n *\n * @param {string} word The word to store.\n * @param {HTMLSpanElement} el The element associated with it.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.registerWordElement = function(\n    word, el) {\n  // Avoid potential collision with the built-in object namespace. For\n  // example, 'watch' is a reserved name in FireFox.\n  var index = goog.ui.AbstractSpellChecker.toInternalKey_(word);\n  if (this.wordElements_[index]) {\n    this.wordElements_[index].push(el);\n  } else {\n    this.wordElements_[index] = [el];\n  }\n};\n\n\n/**\n * Returns desired element properties for the specified status.\n * Should be overridden by implementation.\n *\n * @param {goog.spell.SpellCheck.WordStatus} status Status of word.\n * @return {Object} Properties to apply to the element.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.getElementProperties =\n    goog.abstractMethod;\n\n\n/**\n * Handles word change events and updates the word elements accordingly.\n *\n * @param {goog.spell.SpellCheck.WordChangedEvent} event The event object.\n * @private\n */\ngoog.ui.AbstractSpellChecker.prototype.onWordChanged_ = function(event) {\n  // Avoid potential collision with the built-in object namespace. For\n  // example, 'watch' is a reserved name in FireFox.\n  var index = goog.ui.AbstractSpellChecker.toInternalKey_(event.word);\n  var elements = this.wordElements_[index];\n  if (elements) {\n    for (var el, i = 0; el = elements[i]; i++) {\n      this.updateElement(el, event.word, event.status);\n    }\n  }\n};\n\n\n/** @override */\ngoog.ui.AbstractSpellChecker.prototype.disposeInternal = function() {\n  if (this.isVisible_) {\n    // Clears wordElements_\n    this.resume();\n  }\n\n  goog.events.unlisten(\n      this.spellCheck, goog.spell.SpellCheck.EventType.WORD_CHANGED,\n      this.onWordChanged_, false, this);\n\n  if (this.menu_) {\n    this.menu_.dispose();\n    delete this.menu_;\n    delete this.menuIgnore_;\n    delete this.menuSeparator_;\n  }\n  delete this.spellCheck;\n  delete this.wordElements_;\n\n  goog.ui.AbstractSpellChecker.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * Precharges local dictionary cache. This is optional, but greatly reduces\n * amount of subsequent churn in the DOM tree because most of the words become\n * known from the very beginning.\n *\n * @param {string} text Text to process.\n * @param {number} words Max number of words to scan.\n * @return {number} number of words actually scanned.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.populateDictionary = function(\n    text, words) {\n  this.splitRegex_.lastIndex = 0;\n  var result;\n  var numScanned = 0;\n  while (result = this.splitRegex_.exec(text)) {\n    if (result[0].length == 0) {\n      break;\n    }\n    var word = result[1];\n    if (word) {\n      this.spellCheck.checkWord(word);\n      ++numScanned;\n      if (numScanned >= words) {\n        break;\n      }\n    }\n  }\n  this.spellCheck.processPending();\n  return numScanned;\n};\n\n\n/**\n * Processes word.\n * Should be overridden by implementation.\n *\n * @param {Node} node Node containing word.\n * @param {string} text Word to process.\n * @param {goog.spell.SpellCheck.WordStatus} status Status of the word.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.processWord = function(\n    node, text, status) {\n  throw new Error('Need to override processWord_ in derivative class');\n};\n\n\n/**\n * Processes range of text that checks out (contains no unrecognized words).\n * Should be overridden by implementation. May contain words and separators.\n *\n * @param {Node} node Node containing text range.\n * @param {string} text text to process.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.processRange = function(node, text) {\n  throw new Error('Need to override processRange_ in derivative class');\n};\n\n\n/**\n * Starts asynchronous processing mode.\n *\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.initializeAsyncMode = function() {\n  if (this.asyncMode_ || this.processedElementsCount_ ||\n      this.asyncText_ != null || this.asyncNode_) {\n    throw new Error('Async mode already in progress.');\n  }\n  this.asyncMode_ = true;\n  this.processedElementsCount_ = 0;\n  delete this.asyncText_;\n  this.asyncRangeStart_ = 0;\n  delete this.asyncNode_;\n\n  this.blockReadyEvents();\n};\n\n\n/**\n * Finalizes asynchronous processing mode. Should be called after there is no\n * more text to process and processTextAsync and/or continueAsyncProcessing\n * returned FINISHED.\n *\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.finishAsyncProcessing = function() {\n  if (!this.asyncMode_ || this.asyncText_ != null || this.asyncNode_) {\n    throw new Error(\n        'Async mode not started or there is still text to process.');\n  }\n  this.asyncMode_ = false;\n  this.processedElementsCount_ = 0;\n\n  this.unblockReadyEvents();\n  this.spellCheck.processPending();\n};\n\n\n/**\n * Blocks processing of spell checker READY events. This is used in dictionary\n * recharge and async mode so that completion is not signaled prematurely.\n *\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.blockReadyEvents = function() {\n  goog.events.listen(\n      this.spellCheck, goog.spell.SpellCheck.EventType.READY,\n      goog.events.Event.stopPropagation, true);\n};\n\n\n/**\n * Unblocks processing of spell checker READY events. This is used in\n * dictionary recharge and async mode so that completion is not signaled\n * prematurely.\n *\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.unblockReadyEvents = function() {\n  goog.events.unlisten(\n      this.spellCheck, goog.spell.SpellCheck.EventType.READY,\n      goog.events.Event.stopPropagation, true);\n};\n\n\n/**\n * Splits text into individual words and blocks of separators. Calls virtual\n * processWord_ and processRange_ methods.\n *\n * @param {Node} node Node containing text.\n * @param {string} text Text to process.\n * @return {goog.ui.AbstractSpellChecker.AsyncResult} operation result.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.processTextAsync = function(node, text) {\n  if (!this.asyncMode_ || this.asyncText_ != null || this.asyncNode_) {\n    throw new Error(\n        'Not in async mode or previous text has not been processed.');\n  }\n\n  this.splitRegex_.lastIndex = 0;\n  var stringSegmentStart = 0;\n\n  var result;\n  while (result = this.splitRegex_.exec(text)) {\n    if (result[0].length == 0) {\n      break;\n    }\n    var word = result[1];\n    if (word) {\n      var status = this.spellCheck.checkWord(word);\n      if (status != goog.spell.SpellCheck.WordStatus.VALID) {\n        var precedingText =\n            text.substr(stringSegmentStart, result.index - stringSegmentStart);\n        if (precedingText) {\n          this.processRange(node, precedingText);\n        }\n        stringSegmentStart = result.index + word.length;\n        this.processWord(node, word, status);\n      }\n    }\n    this.processedElementsCount_++;\n    if (this.processedElementsCount_ > this.asyncWordsPerBatch_) {\n      this.asyncText_ = text;\n      this.asyncRangeStart_ = stringSegmentStart;\n      this.asyncNode_ = node;\n      this.processedElementsCount_ = 0;\n      return goog.ui.AbstractSpellChecker.AsyncResult.PENDING;\n    }\n  }\n\n  var leftoverText = text.substr(stringSegmentStart);\n  if (leftoverText) {\n    this.processRange(node, leftoverText);\n  }\n\n  return goog.ui.AbstractSpellChecker.AsyncResult.DONE;\n};\n\n\n/**\n * Continues processing started by processTextAsync. Calls virtual\n * processWord_ and processRange_ methods.\n *\n * @return {goog.ui.AbstractSpellChecker.AsyncResult} operation result.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.continueAsyncProcessing = function() {\n  if (!this.asyncMode_ || this.asyncText_ == null || !this.asyncNode_) {\n    throw new Error('Not in async mode or processing not started.');\n  }\n  var node = /** @type {Node} */ (this.asyncNode_);\n  var stringSegmentStart = this.asyncRangeStart_;\n  goog.asserts.assertNumber(stringSegmentStart);\n  var text = this.asyncText_;\n\n  var result;\n  while (result = this.splitRegex_.exec(text)) {\n    if (result[0].length == 0) {\n      break;\n    }\n    var word = result[1];\n    if (word) {\n      var status = this.spellCheck.checkWord(word);\n      if (status != goog.spell.SpellCheck.WordStatus.VALID) {\n        var precedingText =\n            text.substr(stringSegmentStart, result.index - stringSegmentStart);\n        if (precedingText) {\n          this.processRange(node, precedingText);\n        }\n        stringSegmentStart = result.index + word.length;\n        this.processWord(node, word, status);\n      }\n    }\n    this.processedElementsCount_++;\n    if (this.processedElementsCount_ > this.asyncWordsPerBatch_) {\n      this.processedElementsCount_ = 0;\n      this.asyncRangeStart_ = stringSegmentStart;\n      return goog.ui.AbstractSpellChecker.AsyncResult.PENDING;\n    }\n  }\n  delete this.asyncText_;\n  this.asyncRangeStart_ = 0;\n  delete this.asyncNode_;\n\n  var leftoverText = text.substr(stringSegmentStart);\n  if (leftoverText) {\n    this.processRange(node, leftoverText);\n  }\n\n  return goog.ui.AbstractSpellChecker.AsyncResult.DONE;\n};\n\n\n/**\n * Converts a word to an internal key representation. This is necessary to\n * avoid collisions with object's internal namespace. Only words that are\n * reserved need to be escaped.\n *\n * @param {string} word The word to map.\n * @return {string} The index.\n * @private\n */\ngoog.ui.AbstractSpellChecker.toInternalKey_ = function(word) {\n  if (word in Object.prototype) {\n    return goog.ui.AbstractSpellChecker.KEY_PREFIX_ + word;\n  }\n  return word;\n};\n\n\n/**\n * Navigate keyboard focus in the given direction.\n *\n * @param {goog.ui.AbstractSpellChecker.Direction} direction The direction to\n *     navigate in.\n * @return {boolean} Whether the action is handled here.  If not handled\n *     here, the initiating event may be propagated.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.navigate = function(direction) {\n  var handled = false;\n  var isMovingToNextWord =\n      direction == goog.ui.AbstractSpellChecker.Direction.NEXT;\n  var focusedIndex = this.getFocusedElementIndex();\n\n  var el;\n  do {\n    // Determine new index based on given direction.\n    focusedIndex += isMovingToNextWord ? 1 : -1;\n\n    if (focusedIndex < 1 || focusedIndex > this.getLastIndex()) {\n      // Exit the loop, because this focusedIndex cannot have an element.\n      handled = true;\n      break;\n    }\n\n    // Word elements are removed during the correction action. If no element is\n    // found for the new focusedIndex, then try again with the next value.\n  } while (!(el = this.getElementByIndex(focusedIndex)));\n\n  if (el) {\n    this.setFocusedElementIndex(focusedIndex);\n    this.focusOnElement(el);\n    handled = true;\n  }\n\n  return handled;\n};\n\n\n/**\n * Returns the index of the currently focussed invalid word element. This index\n * starts at one instead of zero.\n *\n * @return {number} the index of the currently focussed element\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.getFocusedElementIndex = function() {\n  return this.focusedElementIndex_;\n};\n\n\n/**\n * Sets the index of the currently focussed invalid word element. This index\n * should start at one instead of zero.\n *\n * @param {number} focusElementIndex the index of the currently focussed element\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.setFocusedElementIndex = function(\n    focusElementIndex) {\n  this.focusedElementIndex_ = focusElementIndex;\n};\n\n\n/**\n * Sets the focus on the provided word element.\n *\n * @param {Element} element The word element that should receive focus.\n * @protected\n */\ngoog.ui.AbstractSpellChecker.prototype.focusOnElement = function(element) {\n  element.focus();\n};\n\n\n/**\n * Constants for representing the direction while navigating.\n *\n * @enum {number}\n */\ngoog.ui.AbstractSpellChecker.Direction = {\n  PREVIOUS: 0,\n  NEXT: 1\n};\n\n\n/**\n * Constants for the result of asynchronous processing.\n * @enum {number}\n */\ngoog.ui.AbstractSpellChecker.AsyncResult = {\n  /**\n   * Caller must reschedule operation and call continueAsyncProcessing on the\n   * new stack frame.\n   */\n  PENDING: 1,\n  /**\n   * Current element has been fully processed. Caller can call\n   * processTextAsync or finishAsyncProcessing.\n   */\n  DONE: 2\n};\n","^;",1579837703000,"^<",["^=",["^1L","^1>","^9[","^1M","~$goog.spell.SpellCheck","^2K","^1O","^1P","^1U","^?","^1C","^3=","~$goog.ui.PopupMenu","^83","^1F","^2Y","~$goog.dom.selection","^2O","^1<","^12","^4>"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/abstractspellchecker.js"],"^O",["^=",["~$goog.ui.AbstractSpellChecker","~$goog.ui.AbstractSpellChecker.AsyncResult"]],"^W",true,"^X",["^?","^1O","^2O","^1L","^1>","^1U","^2K","^12","^1M","^CK","^1<","^2Y","^1C","^3=","^CI","^4>","^1F","^1P","^83","^9[","^CJ"]],["^ ","^3",[1579837703000],"^4","goog.graphics.font.js","^5",["^6","goog/graphics/font.js"],"^7","goog/graphics/font.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Represents a font to be used with a Renderer.\n * @author arv@google.com (Erik Arvidsson)\n * @see ../demos/graphics/basicelements.html\n */\n\n\ngoog.provide('goog.graphics.Font');\n\n\n\n/**\n * This class represents a font to be used with a renderer.\n * @param {number} size  The font size.\n * @param {string} family  The font family.\n * @constructor\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n * @final\n */\ngoog.graphics.Font = function(size, family) {\n  /**\n   * Font size.\n   * @type {number}\n   */\n  this.size = size;\n  // TODO(arv): Is this in pixels or drawing units based on the coord size?\n\n  /**\n   * The name of the font family to use, can be a comma separated string.\n   * @type {string}\n   */\n  this.family = family;\n};\n\n\n/**\n * Indication if text should be bolded\n * @type {boolean}\n */\ngoog.graphics.Font.prototype.bold = false;\n\n\n/**\n * Indication if text should be in italics\n * @type {boolean}\n */\ngoog.graphics.Font.prototype.italic = false;\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/font.js"],"^O",["^=",["^C6"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.ui.tree.typeahead.js","^5",["^6","goog/ui/tree/typeahead.js"],"^7","goog/ui/tree/typeahead.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides the typeahead functionality for the tree class.\n *\n */\n\ngoog.provide('goog.ui.tree.TypeAhead');\ngoog.provide('goog.ui.tree.TypeAhead.Offset');\n\ngoog.forwardDeclare('goog.ui.tree.BaseNode');\ngoog.require('goog.array');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.string');\ngoog.require('goog.structs.Trie');\n\n\n\n/**\n * Constructs a TypeAhead object.\n * @constructor\n * @final\n */\ngoog.ui.tree.TypeAhead = function() {\n  /**\n   * Map of tree nodes to allow for quick access by characters in the label\n   * text.\n   * @private {goog.structs.Trie<Array<goog.ui.tree.BaseNode>>}\n   */\n  this.nodeMap_ = new goog.structs.Trie();\n\n  /**\n   * Buffer for storing typeahead characters.\n   * @private {string}\n   */\n  this.buffer_ = '';\n\n  /**\n   * Matching labels from the latest typeahead search.\n   * @private {?Array<string>}\n   */\n  this.matchingLabels_ = null;\n\n  /**\n   * Matching nodes from the latest typeahead search. Used when more than\n   * one node is present with the same label text.\n   * @private {?Array<?goog.ui.tree.BaseNode>}\n   */\n  this.matchingNodes_ = null;\n\n  /**\n   * Specifies the current index of the label from the latest typeahead search.\n   * @private {number}\n   */\n  this.matchingLabelIndex_ = 0;\n\n  /**\n   * Specifies the index into matching nodes when more than one node is found\n   * with the same label.\n   * @private {number}\n   */\n  this.matchingNodeIndex_ = 0;\n};\n\n\n/**\n * Enum for offset values that are used for ctrl-key navigation among the\n * multiple matches of a given typeahead buffer.\n *\n * @enum {number}\n */\ngoog.ui.tree.TypeAhead.Offset = {\n  DOWN: 1,\n  UP: -1\n};\n\n\n/**\n * Handles navigation keys.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @return {boolean} The handled value.\n */\ngoog.ui.tree.TypeAhead.prototype.handleNavigation = function(e) {\n  var handled = false;\n\n  switch (e.keyCode) {\n    // Handle ctrl+down, ctrl+up to navigate within typeahead results.\n    case goog.events.KeyCodes.DOWN:\n    case goog.events.KeyCodes.UP:\n      if (e.ctrlKey) {\n        this.jumpTo_(\n            e.keyCode == goog.events.KeyCodes.DOWN ?\n                goog.ui.tree.TypeAhead.Offset.DOWN :\n                goog.ui.tree.TypeAhead.Offset.UP);\n        handled = true;\n      }\n      break;\n\n    // Remove the last typeahead char.\n    case goog.events.KeyCodes.BACKSPACE:\n      var length = this.buffer_.length - 1;\n      handled = true;\n      if (length > 0) {\n        this.buffer_ = this.buffer_.substring(0, length);\n        this.jumpToLabel_(this.buffer_);\n      } else if (length == 0) {\n        // Clear the last character in typeahead.\n        this.buffer_ = '';\n      } else {\n        handled = false;\n      }\n      break;\n\n    // Clear typeahead buffer.\n    case goog.events.KeyCodes.ESC:\n      this.buffer_ = '';\n      handled = true;\n      break;\n  }\n\n  return handled;\n};\n\n\n/**\n * Handles the character presses.\n * @param {goog.events.BrowserEvent} e The browser event.\n *    Expected event type is goog.events.KeyHandler.EventType.KEY.\n * @return {boolean} The handled value.\n */\ngoog.ui.tree.TypeAhead.prototype.handleTypeAheadChar = function(e) {\n  var handled = false;\n\n  if (!e.ctrlKey && !e.altKey) {\n    // Since goog.structs.Trie.getKeys compares characters during\n    // lookup, we should use charCode instead of keyCode where possible.\n    // Convert to lowercase, typeahead is case insensitive.\n    var ch = String.fromCharCode(e.charCode || e.keyCode).toLowerCase();\n    if (goog.string.isUnicodeChar(ch) && (ch != ' ' || this.buffer_)) {\n      this.buffer_ += ch;\n      handled = this.jumpToLabel_(this.buffer_);\n    }\n  }\n\n  return handled;\n};\n\n\n/**\n * Adds or updates the given node in the nodemap. The label text is used as a\n * key and the node id is used as a value. In the case that the key already\n * exists, such as when more than one node exists with the same label, then this\n * function creates an array to hold the multiple nodes.\n * @param {goog.ui.tree.BaseNode} node Node to be added or updated.\n */\ngoog.ui.tree.TypeAhead.prototype.setNodeInMap = function(node) {\n  var labelText = node.getText();\n  if (labelText &&\n      !goog.string.isEmptyOrWhitespace(goog.string.makeSafe(labelText))) {\n    // Typeahead is case insensitive, convert to lowercase.\n    labelText = labelText.toLowerCase();\n\n    var previousValue = this.nodeMap_.get(labelText);\n    if (previousValue) {\n      // Found a previously created array, add the given node.\n      previousValue.push(node);\n    } else {\n      // Create a new array and set the array as value.\n      var nodeList = [node];\n      this.nodeMap_.set(labelText, nodeList);\n    }\n  }\n};\n\n\n/**\n * Removes the given node from the nodemap.\n * @param {goog.ui.tree.BaseNode} node Node to be removed.\n */\ngoog.ui.tree.TypeAhead.prototype.removeNodeFromMap = function(node) {\n  var labelText = node.getText();\n  if (labelText &&\n      !goog.string.isEmptyOrWhitespace(goog.string.makeSafe(labelText))) {\n    labelText = labelText.toLowerCase();\n\n    var nodeList = this.nodeMap_.get(labelText);\n    if (nodeList) {\n      // Remove the node's descendants from the nodemap.\n      var count = node.getChildCount();\n      for (var i = 0; i < count; i++) {\n        this.removeNodeFromMap(node.getChildAt(i));\n      }\n      // Remove the node from the array.\n      goog.array.remove(nodeList, node);\n      if (!nodeList.length) {\n        this.nodeMap_.remove(labelText);\n      }\n    }\n  }\n};\n\n\n/**\n * Select the first matching node for the given typeahead.\n * @param {string} typeAhead Typeahead characters to match.\n * @return {boolean} True iff a node is found.\n * @private\n */\ngoog.ui.tree.TypeAhead.prototype.jumpToLabel_ = function(typeAhead) {\n  var handled = false;\n  var labels = this.nodeMap_.getKeys(typeAhead);\n\n  // Make sure we have at least one matching label.\n  if (labels && labels.length) {\n    this.matchingNodeIndex_ = 0;\n    this.matchingLabelIndex_ = 0;\n\n    var nodes = this.nodeMap_.get(labels[0]);\n    if ((handled = this.selectMatchingNode_(nodes))) {\n      this.matchingLabels_ = labels;\n    }\n  }\n\n  // TODO(user): beep when no node is found\n  return handled;\n};\n\n\n/**\n * Select the next or previous node based on the offset.\n * @param {goog.ui.tree.TypeAhead.Offset} offset DOWN or UP.\n * @return {boolean} Whether a node is found.\n * @private\n */\ngoog.ui.tree.TypeAhead.prototype.jumpTo_ = function(offset) {\n  var handled = false;\n  var labels = this.matchingLabels_;\n\n  if (labels) {\n    var nodes = null;\n    var nodeIndexOutOfRange = false;\n\n    // Navigate within the nodes array.\n    if (this.matchingNodes_) {\n      var newNodeIndex = this.matchingNodeIndex_ + offset;\n      if (newNodeIndex >= 0 && newNodeIndex < this.matchingNodes_.length) {\n        this.matchingNodeIndex_ = newNodeIndex;\n        nodes = this.matchingNodes_;\n      } else {\n        nodeIndexOutOfRange = true;\n      }\n    }\n\n    // Navigate to the next or previous label.\n    if (!nodes) {\n      var newLabelIndex = this.matchingLabelIndex_ + offset;\n      if (newLabelIndex >= 0 && newLabelIndex < labels.length) {\n        this.matchingLabelIndex_ = newLabelIndex;\n      }\n\n      if (labels.length > this.matchingLabelIndex_) {\n        nodes = this.nodeMap_.get(labels[this.matchingLabelIndex_]);\n      }\n\n      // Handle the case where we are moving beyond the available nodes,\n      // while going UP select the last item of multiple nodes with same label\n      // and while going DOWN select the first item of next set of nodes\n      if (nodes && nodes.length && nodeIndexOutOfRange) {\n        this.matchingNodeIndex_ =\n            (offset == goog.ui.tree.TypeAhead.Offset.UP) ? nodes.length - 1 : 0;\n      }\n    }\n\n    if ((handled = this.selectMatchingNode_(nodes))) {\n      this.matchingLabels_ = labels;\n    }\n  }\n\n  // TODO(user): beep when no node is found\n  return handled;\n};\n\n\n/**\n * Given a nodes array reveals and selects the node while using node index.\n * @param {Array<goog.ui.tree.BaseNode>|undefined} nodes Nodes array to select\n *     the node from.\n * @return {boolean} Whether a matching node was found.\n * @private\n */\ngoog.ui.tree.TypeAhead.prototype.selectMatchingNode_ = function(nodes) {\n  var node;\n\n  if (nodes) {\n    // Find the matching node.\n    if (this.matchingNodeIndex_ < nodes.length) {\n      node = nodes[this.matchingNodeIndex_];\n      this.matchingNodes_ = nodes;\n    }\n\n    if (node) {\n      node.reveal();\n      node.select();\n    }\n  }\n\n  return !!node;\n};\n\n\n/**\n * Clears the typeahead buffer.\n */\ngoog.ui.tree.TypeAhead.prototype.clear = function() {\n  this.buffer_ = '';\n};\n","^;",1579837703000,"^<",["^=",["^2L","^?","~$goog.structs.Trie","^3H","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/tree/typeahead.js"],"^O",["^=",["~$goog.ui.tree.TypeAhead.Offset","^2I"]],"^W",true,"^X",["^?","^2O","^3H","^2L","^CN"]],["^ ","^3",[1579837703000],"^4","goog.proto2.util.js","^5",["^6","goog/proto2/util.js"],"^7","goog/proto2/util.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility methods for Protocol Buffer 2 implementation.\n */\n\ngoog.provide('goog.proto2.Util');\n\ngoog.require('goog.asserts');\n\n\n/**\n * @define {boolean} Defines a PBCHECK constant that can be turned off by\n * clients of PB2. This for is clients that do not want assertion/checking\n * running even in non-COMPILED builds.\n */\ngoog.proto2.Util.PBCHECK = goog.define('goog.proto2.Util.PBCHECK', !COMPILED);\n\n\n/**\n * Asserts that the given condition is true, if and only if the PBCHECK\n * flag is on.\n *\n * @param {*} condition The condition to check.\n * @param {string=} opt_message Error message in case of failure.\n * @throws {Error} Assertion failed, the condition evaluates to false.\n */\ngoog.proto2.Util.assert = function(condition, opt_message) {\n  if (goog.proto2.Util.PBCHECK) {\n    goog.asserts.assert(condition, opt_message);\n  }\n};\n\n\n/**\n * Returns true if debug assertions (checks) are on.\n *\n * @return {boolean} The value of the PBCHECK constant.\n */\ngoog.proto2.Util.conductChecks = function() {\n  return goog.proto2.Util.PBCHECK;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/proto2/util.js"],"^O",["^=",["~$goog.proto2.Util"]],"^W",true,"^X",["^?","^1L"]],["^ ","^3",[1579837703000],"^4","goog.i18n.uchar.namefetcher.js","^5",["^6","goog/i18n/uchar/namefetcher.js"],"^7","goog/i18n/uchar/namefetcher.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the goog.i18n.CharNameFetcher interface. This\n * interface is used to retrieve individual character names.\n */\n\ngoog.provide('goog.i18n.uChar.NameFetcher');\n\n\n\n/**\n * NameFetcher interface. Implementations of this interface are used to retrieve\n * Unicode character names.\n *\n * @interface\n */\ngoog.i18n.uChar.NameFetcher = function() {};\n\n\n/**\n * Retrieves the names of a given set of characters and stores them in a cache\n * for fast retrieval. Offline implementations can simply provide an empty\n * implementation.\n *\n * @param {string} characters The list of characters in base 88 to fetch. These\n *     lists are stored by category and subcategory in the\n *     goog.i18n.charpickerdata class.\n */\ngoog.i18n.uChar.NameFetcher.prototype.prefetch = function(characters) {};\n\n\n/**\n * Retrieves the name of a particular character.\n *\n * @param {string} character The character to retrieve.\n * @param {function(?string)} callback The callback function called when the\n *     name retrieval is complete, contains a single string parameter with the\n *     codepoint name, this parameter will be null if the character name is not\n *     defined.\n */\ngoog.i18n.uChar.NameFetcher.prototype.getName = function(character, callback) {\n};\n\n\n/**\n * Tests whether the name of a given character is available to be retrieved by\n * the getName() function.\n *\n * @param {string} character The character to test.\n * @return {boolean} True if the fetcher can retrieve or has a name available\n *     for the given character.\n */\ngoog.i18n.uChar.NameFetcher.prototype.isNameAvailable = function(character) {};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/uchar/namefetcher.js"],"^O",["^=",["^1;"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.debug.debugwindow.js","^5",["^6","goog/debug/debugwindow.js"],"^7","goog/debug/debugwindow.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the DebugWindow class. Please minimize\n * dependencies this file has on other closure classes as any dependency it\n * takes won't be able to use the logging infrastructure.\n *\n */\n\ngoog.provide('goog.debug.DebugWindow');\n\ngoog.require('goog.debug.HtmlFormatter');\ngoog.require('goog.debug.LogManager');\ngoog.require('goog.debug.Logger');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.SafeStyleSheet');\ngoog.require('goog.string.Const');\ngoog.require('goog.structs.CircularBuffer');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Provides a debug DebugWindow that is bound to the goog.debug.Logger.\n * It handles log messages and writes them to the DebugWindow. This doesn't\n * provide a lot of functionality that the old Gmail logging infrastructure\n * provided like saving debug logs for exporting to the server. Now that we\n * have an event-based logging infrastructure, we can encapsulate that\n * functionality in a separate class.\n *\n * @constructor\n * @param {string=} opt_identifier Identifier for this logging class.\n * @param {string=} opt_prefix Prefix prepended to messages.\n */\ngoog.debug.DebugWindow = function(opt_identifier, opt_prefix) {\n  /**\n   * Identifier for this logging class\n   * @protected {string}\n   */\n  this.identifier = opt_identifier || '';\n\n  /**\n   * Array used to buffer log output\n   * @protected {!Array<!goog.html.SafeHtml>}\n   */\n  this.outputBuffer = [];\n\n  /**\n   * Optional prefix to be prepended to error strings\n   * @private {string}\n   */\n  this.prefix_ = opt_prefix || '';\n\n  /**\n   * Buffer for saving the last 1000 messages\n   * @private {!goog.structs.CircularBuffer}\n   */\n  this.savedMessages_ =\n      new goog.structs.CircularBuffer(goog.debug.DebugWindow.MAX_SAVED);\n\n  /**\n   * Save the publish handler so it can be removed\n   * @private {!Function}\n   */\n  this.publishHandler_ = goog.bind(this.addLogRecord, this);\n\n  /**\n   * Formatter for formatted output\n   * @private {goog.debug.Formatter}\n   */\n  this.formatter_ = new goog.debug.HtmlFormatter(this.prefix_);\n\n  /**\n   * Loggers that we shouldn't output\n   * @private {!Object}\n   */\n  this.filteredLoggers_ = {};\n\n  // enable by default\n  this.setCapturing(true);\n\n  /**\n   * Whether we are currently enabled. When the DebugWindow is enabled, it tries\n   * to keep its window open. When it's disabled, it can still be capturing log\n   * output if, but it won't try to write them to the DebugWindow window until\n   * it's enabled.\n   * @private {boolean}\n   */\n  this.enabled_ = goog.debug.DebugWindow.isEnabled(this.identifier);\n\n  // timer to save the DebugWindow's window position in a cookie\n  goog.global.setInterval(goog.bind(this.saveWindowPositionSize_, this), 7500);\n};\n\n\n/**\n * Max number of messages to be saved\n * @type {number}\n */\ngoog.debug.DebugWindow.MAX_SAVED = 500;\n\n\n/**\n * How long to keep the cookies for in milliseconds\n * @type {number}\n */\ngoog.debug.DebugWindow.COOKIE_TIME = 30 * 24 * 60 * 60 * 1000;  // 30-days\n\n\n/**\n * HTML string printed when the debug window opens\n * @type {string}\n * @protected\n */\ngoog.debug.DebugWindow.prototype.welcomeMessage = 'LOGGING';\n\n\n/**\n * Whether to force enable the window on a severe log.\n * @type {boolean}\n * @private\n */\ngoog.debug.DebugWindow.prototype.enableOnSevere_ = false;\n\n\n/**\n * Reference to debug window\n * @type {?Window}\n * @protected\n */\ngoog.debug.DebugWindow.prototype.win = null;\n\n\n/**\n * In the process of opening the window\n * @type {boolean}\n * @private\n */\ngoog.debug.DebugWindow.prototype.winOpening_ = false;\n\n\n/**\n * Whether we are currently capturing logger output.\n *\n * @type {boolean}\n * @private\n */\ngoog.debug.DebugWindow.prototype.isCapturing_ = false;\n\n\n/**\n * Whether we already showed an alert that the DebugWindow was blocked.\n * @type {boolean}\n * @private\n */\ngoog.debug.DebugWindow.showedBlockedAlert_ = false;\n\n\n/**\n * Reference to timeout used to buffer the output stream.\n * @type {?number}\n * @private\n */\ngoog.debug.DebugWindow.prototype.bufferTimeout_ = null;\n\n\n/**\n * Timestamp for the last time the log was written to.\n * @protected {number}\n */\ngoog.debug.DebugWindow.prototype.lastCall = goog.now();\n\n\n/**\n * Sets the welcome message shown when the window is first opened or reset.\n *\n * @param {string} msg An HTML string.\n */\ngoog.debug.DebugWindow.prototype.setWelcomeMessage = function(msg) {\n  this.welcomeMessage = msg;\n};\n\n\n/**\n * Initializes the debug window.\n */\ngoog.debug.DebugWindow.prototype.init = function() {\n  if (this.enabled_) {\n    this.openWindow_();\n  }\n};\n\n\n/**\n * Whether the DebugWindow is enabled. When the DebugWindow is enabled, it\n * tries to keep its window open and logs all messages to the window.  When the\n * DebugWindow is disabled, it stops logging messages to its window.\n *\n * @return {boolean} Whether the DebugWindow is enabled.\n */\ngoog.debug.DebugWindow.prototype.isEnabled = function() {\n  return this.enabled_;\n};\n\n\n/**\n * Sets whether the DebugWindow is enabled. When the DebugWindow is enabled, it\n * tries to keep its window open and log all messages to the window. When the\n * DebugWindow is disabled, it stops logging messages to its window. The\n * DebugWindow also saves this state to a cookie so that it's persisted across\n * application refreshes.\n * @param {boolean} enable Whether the DebugWindow is enabled.\n */\ngoog.debug.DebugWindow.prototype.setEnabled = function(enable) {\n  this.enabled_ = enable;\n\n  if (this.enabled_) {\n    this.openWindow_();\n  }\n\n  this.setCookie_('enabled', enable ? '1' : '0');\n};\n\n\n/**\n * Sets whether the debug window should be force enabled when a severe log is\n * encountered.\n * @param {boolean} enableOnSevere Whether to enable on severe logs..\n */\ngoog.debug.DebugWindow.prototype.setForceEnableOnSevere = function(\n    enableOnSevere) {\n  this.enableOnSevere_ = enableOnSevere;\n};\n\n\n/**\n * Whether we are currently capturing logger output.\n * @return {boolean} whether we are currently capturing logger output.\n */\ngoog.debug.DebugWindow.prototype.isCapturing = function() {\n  return this.isCapturing_;\n};\n\n\n/**\n * Sets whether we are currently capturing logger output.\n * @param {boolean} capturing Whether to capture logger output.\n */\ngoog.debug.DebugWindow.prototype.setCapturing = function(capturing) {\n  if (capturing == this.isCapturing_) {\n    return;\n  }\n  this.isCapturing_ = capturing;\n\n  // attach or detach handler from the root logger\n  var rootLogger = goog.debug.LogManager.getRoot();\n  if (capturing) {\n    rootLogger.addHandler(this.publishHandler_);\n  } else {\n    rootLogger.removeHandler(this.publishHandler_);\n  }\n};\n\n\n/**\n * Gets the formatter for outputting to the debug window. The default formatter\n * is an instance of goog.debug.HtmlFormatter\n * @return {goog.debug.Formatter} The formatter in use.\n */\ngoog.debug.DebugWindow.prototype.getFormatter = function() {\n  return this.formatter_;\n};\n\n\n/**\n * Sets the formatter for outputting to the debug window.\n * @param {goog.debug.Formatter} formatter The formatter to use.\n */\ngoog.debug.DebugWindow.prototype.setFormatter = function(formatter) {\n  this.formatter_ = formatter;\n};\n\n\n/**\n * Adds a separator to the debug window.\n */\ngoog.debug.DebugWindow.prototype.addSeparator = function() {\n  this.write_(goog.html.SafeHtml.create('hr'));\n};\n\n\n/**\n * @return {boolean} Whether there is an active window.\n */\ngoog.debug.DebugWindow.prototype.hasActiveWindow = function() {\n  return !!this.win && !this.win.closed;\n};\n\n\n/**\n * Clears the contents of the debug window\n * @protected\n */\ngoog.debug.DebugWindow.prototype.clear = function() {\n  this.savedMessages_.clear();\n  if (this.hasActiveWindow()) {\n    this.writeInitialDocument();\n  }\n};\n\n\n/**\n * Adds a log record.\n * @param {goog.debug.LogRecord} logRecord the LogRecord.\n */\ngoog.debug.DebugWindow.prototype.addLogRecord = function(logRecord) {\n  if (this.filteredLoggers_[logRecord.getLoggerName()]) {\n    return;\n  }\n  var html = this.formatter_.formatRecordAsHtml(logRecord);\n  this.write_(html);\n  if (this.enableOnSevere_ &&\n      logRecord.getLevel().value >= goog.debug.Logger.Level.SEVERE.value) {\n    this.setEnabled(true);\n  }\n};\n\n\n/**\n * Writes a message to the log, possibly opening up the window if it's enabled,\n * or saving it if it's disabled.\n * @param {!goog.html.SafeHtml} html The HTML to write.\n * @private\n */\ngoog.debug.DebugWindow.prototype.write_ = function(html) {\n  // If the logger is enabled, open window and write html message to log\n  // otherwise save it\n  if (this.enabled_) {\n    this.openWindow_();\n    this.savedMessages_.add(html);\n    this.writeToLog_(html);\n  } else {\n    this.savedMessages_.add(html);\n  }\n};\n\n\n/**\n * Write to the buffer.  If a message hasn't been sent for more than 750ms just\n * write, otherwise delay for a minimum of 250ms.\n * @param {!goog.html.SafeHtml} html HTML to post to the log.\n * @private\n */\ngoog.debug.DebugWindow.prototype.writeToLog_ = function(html) {\n  this.outputBuffer.push(html);\n  goog.global.clearTimeout(this.bufferTimeout_);\n\n  if (goog.now() - this.lastCall > 750) {\n    this.writeBufferToLog();\n  } else {\n    this.bufferTimeout_ =\n        goog.global.setTimeout(goog.bind(this.writeBufferToLog, this), 250);\n  }\n};\n\n\n/**\n * Write to the log and maybe scroll into view.\n * @protected\n */\ngoog.debug.DebugWindow.prototype.writeBufferToLog = function() {\n  this.lastCall = goog.now();\n  if (this.hasActiveWindow()) {\n    var body = this.win.document.body;\n    var scroll =\n        body && body.scrollHeight - (body.scrollTop + body.clientHeight) <= 100;\n\n    goog.dom.safe.documentWrite(\n        this.win.document, goog.html.SafeHtml.concat(this.outputBuffer));\n    this.outputBuffer.length = 0;\n\n    if (scroll) {\n      this.win.scrollTo(0, 1000000);\n    }\n  }\n};\n\n\n/**\n * Writes all saved messages to the DebugWindow.\n * @protected\n */\ngoog.debug.DebugWindow.prototype.writeSavedMessages = function() {\n  var messages = this.savedMessages_.getValues();\n  for (var i = 0; i < messages.length; i++) {\n    this.writeToLog_(messages[i]);\n  }\n};\n\n\n/**\n * Opens the debug window if it is not already referenced\n * @private\n */\ngoog.debug.DebugWindow.prototype.openWindow_ = function() {\n  if (this.hasActiveWindow() || this.winOpening_) {\n    return;\n  }\n\n  var winpos = this.getCookie_('dbg', '0,0,800,500').split(',');\n  var x = Number(winpos[0]);\n  var y = Number(winpos[1]);\n  var w = Number(winpos[2]);\n  var h = Number(winpos[3]);\n\n  this.winOpening_ = true;\n  this.win = window.open(\n      '', this.getWindowName_(), 'width=' + w + ',height=' + h +\n          ',toolbar=no,resizable=yes,' +\n          'scrollbars=yes,left=' + x + ',top=' + y + ',status=no,screenx=' + x +\n          ',screeny=' + y);\n\n  if (!this.win) {\n    if (!goog.debug.DebugWindow.showedBlockedAlert_) {\n      // only show this once\n      alert('Logger popup was blocked');\n      goog.debug.DebugWindow.showedBlockedAlert_ = true;\n    }\n  }\n\n  this.winOpening_ = false;\n\n  if (this.win) {\n    this.writeInitialDocument();\n  }\n};\n\n\n/**\n * Gets a valid window name for the debug window. Replaces invalid characters in\n * IE.\n * @return {string} Valid window name.\n * @private\n */\ngoog.debug.DebugWindow.prototype.getWindowName_ = function() {\n  return goog.userAgent.IE ? this.identifier.replace(/[\\s\\-\\.\\,]/g, '_') :\n                             this.identifier;\n};\n\n\n/**\n * @return {!goog.html.SafeStyleSheet} The stylesheet, for inclusion in the\n *     initial HTML.\n */\ngoog.debug.DebugWindow.prototype.getStyleRules = function() {\n  return goog.html.SafeStyleSheet.fromConstant(\n      goog.string.Const.from(\n          '*{font:normal 14px monospace;}' +\n          '.dbg-sev{color:#F00}' +\n          '.dbg-w{color:#E92}' +\n          '.dbg-sh{background-color:#fd4;font-weight:bold;color:#000}' +\n          '.dbg-i{color:#666}' +\n          '.dbg-f{color:#999}' +\n          '.dbg-ev{color:#0A0}' +\n          '.dbg-m{color:#990}'));\n};\n\n\n/**\n * Writes the initial HTML of the debug window.\n * @protected\n */\ngoog.debug.DebugWindow.prototype.writeInitialDocument = function() {\n  if (!this.hasActiveWindow()) {\n    return;\n  }\n\n  this.win.document.open();\n\n  var div = goog.html.SafeHtml.create(\n      'div', {\n        'class': 'dbg-ev',\n        'style': goog.string.Const.from('text-align:center;')\n      },\n      goog.html.SafeHtml.concat(\n          this.welcomeMessage, goog.html.SafeHtml.BR,\n          goog.html.SafeHtml.create(\n              'small', {}, 'Logger: ' + this.identifier)));\n  var html = goog.html.SafeHtml.concat(\n      goog.html.SafeHtml.createStyle(this.getStyleRules()),\n      goog.html.SafeHtml.create('hr'), div, goog.html.SafeHtml.create('hr'));\n\n  this.writeToLog_(html);\n  this.writeSavedMessages();\n};\n\n\n/**\n * Save persistent data (using cookies) for 1 month (cookie specific to this\n * logger object).\n * @param {string} key Data name.\n * @param {string} value Data value.\n * @private\n */\ngoog.debug.DebugWindow.prototype.setCookie_ = function(key, value) {\n  var fullKey = goog.debug.DebugWindow.getCookieKey_(this.identifier, key);\n  document.cookie = fullKey + '=' + encodeURIComponent(value) +\n      ';path=/;expires=' +\n      (new Date(goog.now() + goog.debug.DebugWindow.COOKIE_TIME)).toUTCString();\n};\n\n\n/**\n * Retrieve data (using cookies).\n * @param {string} key Data name.\n * @param {string=} opt_default Optional default value if cookie doesn't exist.\n * @return {string} Cookie value.\n * @private\n */\ngoog.debug.DebugWindow.prototype.getCookie_ = function(key, opt_default) {\n  return goog.debug.DebugWindow.getCookieValue_(\n      this.identifier, key, opt_default);\n};\n\n\n/**\n * Creates a valid cookie key name which is scoped to the given identifier.\n * Substitutes all occurrences of invalid cookie name characters (whitespace,\n * ';', and '=') with '_', which is a valid and readable alternative.\n * @see goog.net.Cookies#isValidName\n * @see <a href=\"http://tools.ietf.org/html/rfc2109\">RFC 2109</a>\n * @param {string} identifier Identifier for logging class.\n * @param {string} key Data name.\n * @return {string} Cookie key name.\n * @private\n */\ngoog.debug.DebugWindow.getCookieKey_ = function(identifier, key) {\n  var fullKey = key + identifier;\n  return fullKey.replace(/[;=\\s]/g, '_');\n};\n\n\n/**\n * Retrieve data (using cookies).\n * @param {string} identifier Identifier for logging class.\n * @param {string} key Data name.\n * @param {string=} opt_default Optional default value if cookie doesn't exist.\n * @return {string} Cookie value.\n * @private\n */\ngoog.debug.DebugWindow.getCookieValue_ = function(\n    identifier, key, opt_default) {\n  var fullKey = goog.debug.DebugWindow.getCookieKey_(identifier, key);\n  var cookie = String(document.cookie);\n  var start = cookie.indexOf(fullKey + '=');\n  if (start != -1) {\n    var end = cookie.indexOf(';', start);\n    return decodeURIComponent(\n        cookie.substring(\n            start + fullKey.length + 1, end == -1 ? cookie.length : end));\n  } else {\n    return opt_default || '';\n  }\n};\n\n\n/**\n * @param {string} identifier Identifier for logging class.\n * @return {boolean} Whether the DebugWindow is enabled.\n */\ngoog.debug.DebugWindow.isEnabled = function(identifier) {\n  return goog.debug.DebugWindow.getCookieValue_(identifier, 'enabled') == '1';\n};\n\n\n/**\n * Saves the window position size to a cookie\n * @private\n */\ngoog.debug.DebugWindow.prototype.saveWindowPositionSize_ = function() {\n  if (!this.hasActiveWindow()) {\n    return;\n  }\n  var x = this.win.screenX || this.win.screenLeft || 0;\n  var y = this.win.screenY || this.win.screenTop || 0;\n  var w = this.win.outerWidth || 800;\n  var h = this.win.outerHeight || 500;\n  this.setCookie_('dbg', x + ',' + y + ',' + w + ',' + h);\n};\n\n\n/**\n * Adds a logger name to be filtered.\n * @param {string} loggerName the logger name to add.\n */\ngoog.debug.DebugWindow.prototype.addFilter = function(loggerName) {\n  this.filteredLoggers_[loggerName] = 1;\n};\n\n\n/**\n * Removes a logger name to be filtered.\n * @param {string} loggerName the logger name to remove.\n */\ngoog.debug.DebugWindow.prototype.removeFilter = function(loggerName) {\n  delete this.filteredLoggers_[loggerName];\n};\n\n\n/**\n * Modify the size of the circular buffer. Allows the log to retain more\n * information while the window is closed.\n * @param {number} size New size of the circular buffer.\n */\ngoog.debug.DebugWindow.prototype.resetBufferWithNewSize = function(size) {\n  if (size > 0 && size < 50000) {\n    this.clear();\n    this.savedMessages_ = new goog.structs.CircularBuffer(size);\n  }\n};\n","^;",1579837703000,"^<",["^=",["^8:","~$goog.structs.CircularBuffer","^BH","^?","^:<","^[","^3Q","^1E","^4F","^1I"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/debugwindow.js"],"^O",["^=",["~$goog.debug.DebugWindow"]],"^W",true,"^X",["^?","^8:","^BH","^:<","^1E","^1I","^4F","^3Q","^CQ","^["]],["^ ","^3",[1579837703000],"^4","goog.webgl.webgl.js","^5",["^6","goog/webgl/webgl.js"],"^7","goog/webgl/webgl.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Constants used by the WebGL rendering, including all of the\n * constants used from the WebGL context.  For example, instead of using\n * context.ARRAY_BUFFER, your code can use\n * goog.webgl.ARRAY_BUFFER. The benefits for doing this include allowing\n * the compiler to optimize your code so that the compiled code does not have to\n * contain large strings to reference these properties, and reducing runtime\n * property access.\n *\n * Values are taken from the WebGL Spec:\n * https://www.khronos.org/registry/webgl/specs/1.0/#WEBGLRENDERINGCONTEXT\n */\n\ngoog.provide('goog.webgl');\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DEPTH_BUFFER_BIT = 0x00000100;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_BUFFER_BIT = 0x00000400;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.COLOR_BUFFER_BIT = 0x00004000;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.POINTS = 0x0000;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.LINES = 0x0001;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.LINE_LOOP = 0x0002;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.LINE_STRIP = 0x0003;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TRIANGLES = 0x0004;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TRIANGLE_STRIP = 0x0005;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TRIANGLE_FAN = 0x0006;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ZERO = 0;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ONE = 1;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SRC_COLOR = 0x0300;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ONE_MINUS_SRC_COLOR = 0x0301;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SRC_ALPHA = 0x0302;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ONE_MINUS_SRC_ALPHA = 0x0303;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DST_ALPHA = 0x0304;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ONE_MINUS_DST_ALPHA = 0x0305;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DST_COLOR = 0x0306;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ONE_MINUS_DST_COLOR = 0x0307;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SRC_ALPHA_SATURATE = 0x0308;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FUNC_ADD = 0x8006;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BLEND_EQUATION = 0x8009;\n\n\n/**\n * Same as BLEND_EQUATION\n * @const\n * @type {number}\n */\ngoog.webgl.BLEND_EQUATION_RGB = 0x8009;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BLEND_EQUATION_ALPHA = 0x883D;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FUNC_SUBTRACT = 0x800A;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FUNC_REVERSE_SUBTRACT = 0x800B;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BLEND_DST_RGB = 0x80C8;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BLEND_SRC_RGB = 0x80C9;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BLEND_DST_ALPHA = 0x80CA;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BLEND_SRC_ALPHA = 0x80CB;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.CONSTANT_COLOR = 0x8001;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ONE_MINUS_CONSTANT_COLOR = 0x8002;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.CONSTANT_ALPHA = 0x8003;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ONE_MINUS_CONSTANT_ALPHA = 0x8004;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BLEND_COLOR = 0x8005;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ARRAY_BUFFER = 0x8892;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ELEMENT_ARRAY_BUFFER = 0x8893;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ARRAY_BUFFER_BINDING = 0x8894;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ELEMENT_ARRAY_BUFFER_BINDING = 0x8895;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STREAM_DRAW = 0x88E0;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STATIC_DRAW = 0x88E4;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DYNAMIC_DRAW = 0x88E8;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BUFFER_SIZE = 0x8764;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BUFFER_USAGE = 0x8765;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.CURRENT_VERTEX_ATTRIB = 0x8626;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FRONT = 0x0404;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BACK = 0x0405;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FRONT_AND_BACK = 0x0408;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.CULL_FACE = 0x0B44;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BLEND = 0x0BE2;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DITHER = 0x0BD0;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_TEST = 0x0B90;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DEPTH_TEST = 0x0B71;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SCISSOR_TEST = 0x0C11;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.POLYGON_OFFSET_FILL = 0x8037;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SAMPLE_ALPHA_TO_COVERAGE = 0x809E;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SAMPLE_COVERAGE = 0x80A0;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.NO_ERROR = 0;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.INVALID_ENUM = 0x0500;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.INVALID_VALUE = 0x0501;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.INVALID_OPERATION = 0x0502;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.OUT_OF_MEMORY = 0x0505;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.CW = 0x0900;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.CCW = 0x0901;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.LINE_WIDTH = 0x0B21;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ALIASED_POINT_SIZE_RANGE = 0x846D;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ALIASED_LINE_WIDTH_RANGE = 0x846E;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.CULL_FACE_MODE = 0x0B45;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FRONT_FACE = 0x0B46;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DEPTH_RANGE = 0x0B70;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DEPTH_WRITEMASK = 0x0B72;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DEPTH_CLEAR_VALUE = 0x0B73;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DEPTH_FUNC = 0x0B74;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_CLEAR_VALUE = 0x0B91;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_FUNC = 0x0B92;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_FAIL = 0x0B94;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_PASS_DEPTH_FAIL = 0x0B95;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_PASS_DEPTH_PASS = 0x0B96;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_REF = 0x0B97;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_VALUE_MASK = 0x0B93;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_WRITEMASK = 0x0B98;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_BACK_FUNC = 0x8800;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_BACK_FAIL = 0x8801;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_BACK_PASS_DEPTH_FAIL = 0x8802;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_BACK_PASS_DEPTH_PASS = 0x8803;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_BACK_REF = 0x8CA3;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_BACK_VALUE_MASK = 0x8CA4;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_BACK_WRITEMASK = 0x8CA5;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.VIEWPORT = 0x0BA2;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SCISSOR_BOX = 0x0C10;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.COLOR_CLEAR_VALUE = 0x0C22;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.COLOR_WRITEMASK = 0x0C23;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.UNPACK_ALIGNMENT = 0x0CF5;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.PACK_ALIGNMENT = 0x0D05;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.MAX_TEXTURE_SIZE = 0x0D33;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.MAX_VIEWPORT_DIMS = 0x0D3A;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SUBPIXEL_BITS = 0x0D50;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RED_BITS = 0x0D52;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.GREEN_BITS = 0x0D53;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BLUE_BITS = 0x0D54;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ALPHA_BITS = 0x0D55;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DEPTH_BITS = 0x0D56;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_BITS = 0x0D57;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.POLYGON_OFFSET_UNITS = 0x2A00;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.POLYGON_OFFSET_FACTOR = 0x8038;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE_BINDING_2D = 0x8069;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SAMPLE_BUFFERS = 0x80A8;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SAMPLES = 0x80A9;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SAMPLE_COVERAGE_VALUE = 0x80AA;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SAMPLE_COVERAGE_INVERT = 0x80AB;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.COMPRESSED_TEXTURE_FORMATS = 0x86A3;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DONT_CARE = 0x1100;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FASTEST = 0x1101;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.NICEST = 0x1102;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.GENERATE_MIPMAP_HINT = 0x8192;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BYTE = 0x1400;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.UNSIGNED_BYTE = 0x1401;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SHORT = 0x1402;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.UNSIGNED_SHORT = 0x1403;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.INT = 0x1404;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.UNSIGNED_INT = 0x1405;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FLOAT = 0x1406;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DEPTH_COMPONENT = 0x1902;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ALPHA = 0x1906;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RGB = 0x1907;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RGBA = 0x1908;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.LUMINANCE = 0x1909;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.LUMINANCE_ALPHA = 0x190A;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.UNSIGNED_SHORT_4_4_4_4 = 0x8033;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.UNSIGNED_SHORT_5_5_5_1 = 0x8034;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.UNSIGNED_SHORT_5_6_5 = 0x8363;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FRAGMENT_SHADER = 0x8B30;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.VERTEX_SHADER = 0x8B31;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.MAX_VERTEX_ATTRIBS = 0x8869;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.MAX_VERTEX_UNIFORM_VECTORS = 0x8DFB;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.MAX_VARYING_VECTORS = 0x8DFC;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.MAX_COMBINED_TEXTURE_IMAGE_UNITS = 0x8B4D;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.MAX_VERTEX_TEXTURE_IMAGE_UNITS = 0x8B4C;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.MAX_TEXTURE_IMAGE_UNITS = 0x8872;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.MAX_FRAGMENT_UNIFORM_VECTORS = 0x8DFD;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SHADER_TYPE = 0x8B4F;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DELETE_STATUS = 0x8B80;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.LINK_STATUS = 0x8B82;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.VALIDATE_STATUS = 0x8B83;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ATTACHED_SHADERS = 0x8B85;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ACTIVE_UNIFORMS = 0x8B86;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ACTIVE_ATTRIBUTES = 0x8B89;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SHADING_LANGUAGE_VERSION = 0x8B8C;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.CURRENT_PROGRAM = 0x8B8D;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.NEVER = 0x0200;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.LESS = 0x0201;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.EQUAL = 0x0202;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.LEQUAL = 0x0203;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.GREATER = 0x0204;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.NOTEQUAL = 0x0205;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.GEQUAL = 0x0206;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ALWAYS = 0x0207;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.KEEP = 0x1E00;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.REPLACE = 0x1E01;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.INCR = 0x1E02;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DECR = 0x1E03;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.INVERT = 0x150A;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.INCR_WRAP = 0x8507;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DECR_WRAP = 0x8508;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.VENDOR = 0x1F00;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RENDERER = 0x1F01;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.VERSION = 0x1F02;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.NEAREST = 0x2600;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.LINEAR = 0x2601;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.NEAREST_MIPMAP_NEAREST = 0x2700;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.LINEAR_MIPMAP_NEAREST = 0x2701;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.NEAREST_MIPMAP_LINEAR = 0x2702;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.LINEAR_MIPMAP_LINEAR = 0x2703;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE_MAG_FILTER = 0x2800;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE_MIN_FILTER = 0x2801;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE_WRAP_S = 0x2802;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE_WRAP_T = 0x2803;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE_2D = 0x0DE1;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE = 0x1702;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE_CUBE_MAP = 0x8513;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE_BINDING_CUBE_MAP = 0x8514;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE_CUBE_MAP_POSITIVE_X = 0x8515;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE_CUBE_MAP_NEGATIVE_X = 0x8516;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE_CUBE_MAP_POSITIVE_Y = 0x8517;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE_CUBE_MAP_NEGATIVE_Y = 0x8518;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE_CUBE_MAP_POSITIVE_Z = 0x8519;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE_CUBE_MAP_NEGATIVE_Z = 0x851A;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.MAX_CUBE_MAP_TEXTURE_SIZE = 0x851C;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE0 = 0x84C0;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE1 = 0x84C1;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE2 = 0x84C2;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE3 = 0x84C3;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE4 = 0x84C4;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE5 = 0x84C5;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE6 = 0x84C6;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE7 = 0x84C7;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE8 = 0x84C8;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE9 = 0x84C9;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE10 = 0x84CA;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE11 = 0x84CB;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE12 = 0x84CC;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE13 = 0x84CD;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE14 = 0x84CE;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE15 = 0x84CF;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE16 = 0x84D0;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE17 = 0x84D1;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE18 = 0x84D2;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE19 = 0x84D3;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE20 = 0x84D4;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE21 = 0x84D5;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE22 = 0x84D6;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE23 = 0x84D7;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE24 = 0x84D8;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE25 = 0x84D9;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE26 = 0x84DA;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE27 = 0x84DB;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE28 = 0x84DC;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE29 = 0x84DD;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE30 = 0x84DE;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE31 = 0x84DF;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.ACTIVE_TEXTURE = 0x84E0;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.REPEAT = 0x2901;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.CLAMP_TO_EDGE = 0x812F;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.MIRRORED_REPEAT = 0x8370;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FLOAT_VEC2 = 0x8B50;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FLOAT_VEC3 = 0x8B51;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FLOAT_VEC4 = 0x8B52;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.INT_VEC2 = 0x8B53;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.INT_VEC3 = 0x8B54;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.INT_VEC4 = 0x8B55;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BOOL = 0x8B56;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BOOL_VEC2 = 0x8B57;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BOOL_VEC3 = 0x8B58;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BOOL_VEC4 = 0x8B59;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FLOAT_MAT2 = 0x8B5A;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FLOAT_MAT3 = 0x8B5B;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FLOAT_MAT4 = 0x8B5C;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SAMPLER_2D = 0x8B5E;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.SAMPLER_CUBE = 0x8B60;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.VERTEX_ATTRIB_ARRAY_ENABLED = 0x8622;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.VERTEX_ATTRIB_ARRAY_SIZE = 0x8623;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.VERTEX_ATTRIB_ARRAY_STRIDE = 0x8624;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.VERTEX_ATTRIB_ARRAY_TYPE = 0x8625;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.VERTEX_ATTRIB_ARRAY_NORMALIZED = 0x886A;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.VERTEX_ATTRIB_ARRAY_POINTER = 0x8645;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = 0x889F;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.COMPILE_STATUS = 0x8B81;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.LOW_FLOAT = 0x8DF0;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.MEDIUM_FLOAT = 0x8DF1;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.HIGH_FLOAT = 0x8DF2;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.LOW_INT = 0x8DF3;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.MEDIUM_INT = 0x8DF4;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.HIGH_INT = 0x8DF5;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FRAMEBUFFER = 0x8D40;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RENDERBUFFER = 0x8D41;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RGBA4 = 0x8056;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RGB5_A1 = 0x8057;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RGB565 = 0x8D62;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DEPTH_COMPONENT16 = 0x81A5;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_INDEX = 0x1901;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_INDEX8 = 0x8D48;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DEPTH_STENCIL = 0x84F9;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RENDERBUFFER_WIDTH = 0x8D42;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RENDERBUFFER_HEIGHT = 0x8D43;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RENDERBUFFER_INTERNAL_FORMAT = 0x8D44;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RENDERBUFFER_RED_SIZE = 0x8D50;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RENDERBUFFER_GREEN_SIZE = 0x8D51;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RENDERBUFFER_BLUE_SIZE = 0x8D52;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RENDERBUFFER_ALPHA_SIZE = 0x8D53;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RENDERBUFFER_DEPTH_SIZE = 0x8D54;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RENDERBUFFER_STENCIL_SIZE = 0x8D55;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE = 0x8CD0;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FRAMEBUFFER_ATTACHMENT_OBJECT_NAME = 0x8CD1;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL = 0x8CD2;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE = 0x8CD3;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.COLOR_ATTACHMENT0 = 0x8CE0;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DEPTH_ATTACHMENT = 0x8D00;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.STENCIL_ATTACHMENT = 0x8D20;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.DEPTH_STENCIL_ATTACHMENT = 0x821A;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.NONE = 0;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FRAMEBUFFER_COMPLETE = 0x8CD5;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT = 0x8CD6;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT = 0x8CD7;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS = 0x8CD9;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FRAMEBUFFER_UNSUPPORTED = 0x8CDD;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.FRAMEBUFFER_BINDING = 0x8CA6;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.RENDERBUFFER_BINDING = 0x8CA7;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.MAX_RENDERBUFFER_SIZE = 0x84E8;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.INVALID_FRAMEBUFFER_OPERATION = 0x0506;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.UNPACK_FLIP_Y_WEBGL = 0x9240;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.UNPACK_PREMULTIPLY_ALPHA_WEBGL = 0x9241;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.CONTEXT_LOST_WEBGL = 0x9242;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.UNPACK_COLORSPACE_CONVERSION_WEBGL = 0x9243;\n\n\n/**\n * @const\n * @type {number}\n */\ngoog.webgl.BROWSER_DEFAULT_WEBGL = 0x9244;\n\n\n/**\n * From the OES_texture_half_float extension.\n * http://www.khronos.org/registry/webgl/extensions/OES_texture_half_float/\n * @const\n * @type {number}\n */\ngoog.webgl.HALF_FLOAT_OES = 0x8D61;\n\n\n/**\n * From the OES_standard_derivatives extension.\n * http://www.khronos.org/registry/webgl/extensions/OES_standard_derivatives/\n * @const\n * @type {number}\n */\ngoog.webgl.FRAGMENT_SHADER_DERIVATIVE_HINT_OES = 0x8B8B;\n\n\n/**\n * From the OES_vertex_array_object extension.\n * http://www.khronos.org/registry/webgl/extensions/OES_vertex_array_object/\n * @const\n * @type {number}\n */\ngoog.webgl.VERTEX_ARRAY_BINDING_OES = 0x85B5;\n\n\n/**\n * From the WEBGL_debug_renderer_info extension.\n * http://www.khronos.org/registry/webgl/extensions/WEBGL_debug_renderer_info/\n * @const\n * @type {number}\n */\ngoog.webgl.UNMASKED_VENDOR_WEBGL = 0x9245;\n\n\n/**\n * From the WEBGL_debug_renderer_info extension.\n * http://www.khronos.org/registry/webgl/extensions/WEBGL_debug_renderer_info/\n * @const\n * @type {number}\n */\ngoog.webgl.UNMASKED_RENDERER_WEBGL = 0x9246;\n\n\n/**\n * From the WEBGL_compressed_texture_s3tc extension.\n * http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/\n * @const\n * @type {number}\n */\ngoog.webgl.COMPRESSED_RGB_S3TC_DXT1_EXT = 0x83F0;\n\n\n/**\n * From the WEBGL_compressed_texture_s3tc extension.\n * http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/\n * @const\n * @type {number}\n */\ngoog.webgl.COMPRESSED_RGBA_S3TC_DXT1_EXT = 0x83F1;\n\n\n/**\n * From the WEBGL_compressed_texture_s3tc extension.\n * http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/\n * @const\n * @type {number}\n */\ngoog.webgl.COMPRESSED_RGBA_S3TC_DXT3_EXT = 0x83F2;\n\n\n/**\n * From the WEBGL_compressed_texture_s3tc extension.\n * http://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/\n * @const\n * @type {number}\n */\ngoog.webgl.COMPRESSED_RGBA_S3TC_DXT5_EXT = 0x83F3;\n\n\n/**\n * From the EXT_texture_filter_anisotropic extension.\n * http://www.khronos.org/registry/webgl/extensions/EXT_texture_filter_anisotropic/\n * @const\n * @type {number}\n */\ngoog.webgl.TEXTURE_MAX_ANISOTROPY_EXT = 0x84FE;\n\n\n/**\n * From the EXT_texture_filter_anisotropic extension.\n * http://www.khronos.org/registry/webgl/extensions/EXT_texture_filter_anisotropic/\n * @const\n * @type {number}\n */\ngoog.webgl.MAX_TEXTURE_MAX_ANISOTROPY_EXT = 0x84FF;\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/webgl/webgl.js"],"^O",["^=",["~$goog.webgl"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^3?",true,"^4","goog.i18n.relativedatetimesymbolsext.js","^5",["^6","goog/i18n/relativedatetimesymbolsext.js"],"^7","goog/i18n/relativedatetimesymbolsext.js","^8","^9","^:","// Copyright 2018 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Relative date time formatting symbols.\n *\n * File generated from CLDR ver. 35.1\n *\n * This file covers those locales that are not covered in\n * \"relativedatetimesymbols.js\".\n */\n\n// clang-format off\n\ngoog.module('goog.i18n.relativeDateTimeSymbolsExt');\n\nvar relativeDateTimeSymbols = goog.require('goog.i18n.relativeDateTimeSymbols');\n/** @type {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nvar defaultSymbols;\n\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_af_NA = relativeDateTimeSymbols.RelativeDateTimeSymbols_af;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_af_ZA = relativeDateTimeSymbols.RelativeDateTimeSymbols_af;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_agq =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ā zūɛɛ','0':'nɛ','1':'tsʉtsʉ'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_agq_CM = exports.RelativeDateTimeSymbols_agq;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ak =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ndeda','0':'Ndɛ','1':'Ɔkyena'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ak_GH = exports.RelativeDateTimeSymbols_ak;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_am_ET = relativeDateTimeSymbols.RelativeDateTimeSymbols_am;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_001 = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_AE =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'أمس','-2':'أول أمس','0':'اليوم','1':'غدًا','2':'بعد الغد'},\n      P:'few{قبل # أيام}many{قبل # يومًا}one{قبل يوم واحد}other{قبل # يوم}two{قبل يومين}zero{قبل # يوم}',\n      F:'few{خلال # أيام}many{خلال # يومًا}one{خلال يوم واحد}other{خلال # يوم}two{خلال يومين}zero{خلال # يوم}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'الساعة الحالية'},\n      P:'few{قبل # ساعات}many{قبل # ساعة}one{قبل ساعة واحدة}other{قبل # ساعة}two{قبل ساعتين}zero{قبل # ساعة}',\n      F:'few{خلال # ساعات}many{خلال # ساعة}one{خلال ساعة واحدة}other{خلال # ساعة}two{خلال ساعتين}zero{خلال # ساعة}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'هذه الدقيقة'},\n      P:'few{قبل # دقائق}many{قبل # دقيقة}one{قبل دقيقة واحدة}other{قبل # دقيقة}two{قبل دقيقتين}zero{قبل # دقيقة}',\n      F:'few{خلال # دقائق}many{خلال # دقيقة}one{خلال دقيقة واحدة}other{خلال # دقيقة}two{خلال دقيقتين}zero{خلال # دقيقة}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'الشهر الماضي','0':'هذا الشهر','1':'الشهر القادم'},\n      P:'few{قبل # أشهر}many{قبل # شهرًا}one{قبل شهر واحد}other{قبل # شهر}two{قبل شهرين}zero{قبل # شهر}',\n      F:'few{خلال # أشهر}many{خلال # شهرًا}one{خلال شهر واحد}other{خلال # شهر}two{خلال شهرين}zero{خلال # شهر}',\n    },\n    SHORT:{\n      R:{'-1':'الشهر الماضي','0':'هذا الشهر','1':'الشهر القادم'},\n      P:'few{خلال # أشهر}many{قبل # شهرًا}one{قبل شهر واحد}other{قبل # شهر}two{قبل شهرين}zero{قبل # شهر}',\n      F:'few{خلال # أشهر}many{خلال # شهرًا}one{خلال شهر واحد}other{خلال # شهر}two{خلال شهرين}zero{خلال # شهر}',\n    },\n    NARROW:{\n      R:{'-1':'الشهر الماضي','0':'هذا الشهر','1':'الشهر القادم'},\n      P:'few{قبل # أشهر}many{قبل # شهرًا}one{قبل شهر واحد}other{قبل # شهر}two{قبل شهرين}zero{قبل # شهر}',\n      F:'few{خلال # أشهر}many{خلال # شهرًا}one{خلال شهر واحد}other{خلال # شهر}two{خلال شهرين}zero{خلال # شهر}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'الربع الأخير','0':'هذا الربع','1':'الربع القادم'},\n      P:'few{قبل # أرباع سنة}many{قبل # ربع سنة}one{قبل ربع سنة واحد}other{قبل # ربع سنة}two{قبل ربعي سنة}zero{قبل # ربع سنة}',\n      F:'few{خلال # أرباع سنة}many{خلال # ربع سنة}one{خلال ربع سنة واحد}other{خلال # ربع سنة}two{خلال ربعي سنة}zero{خلال # ربع سنة}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'الآن'},\n      P:'few{قبل # ثوانِ}many{قبل # ثانية}one{قبل ثانية واحدة}other{قبل # ثانية}two{قبل ثانيتين}zero{قبل # ثانية}',\n      F:'few{خلال # ثوانٍ}many{خلال # ثانية}one{خلال ثانية واحدة}other{خلال # ثانية}two{خلال ثانيتين}zero{خلال # ثانية}',\n    },\n    SHORT:{\n      R:{'0':'الآن'},\n      P:'few{قبل # ثوانٍ}many{قبل # ثانية}one{قبل ثانية واحدة}other{قبل # ثانية}two{قبل ثانيتين}zero{قبل # ثانية}',\n      F:'few{خلال # ثوانٍ}many{خلال # ثانية}one{خلال ثانية واحدة}other{خلال # ثانية}two{خلال ثانيتين}zero{خلال # ثانية}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'الأسبوع الماضي','0':'هذا الأسبوع','1':'الأسبوع القادم'},\n      P:'few{قبل # أسابيع}many{قبل # أسبوعًا}one{قبل أسبوع واحد}other{قبل # أسبوع}two{قبل أسبوعين}zero{قبل # أسبوع}',\n      F:'few{خلال # أسابيع}many{خلال # أسبوعًا}one{خلال أسبوع واحد}other{خلال # أسبوع}two{خلال أسبوعين}zero{خلال # أسبوع}',\n    },\n    SHORT:{\n      R:{'-1':'الأسبوع الماضي','0':'هذا الأسبوع','1':'الأسبوع القادم'},\n      P:'few{قبل # أسابيع}many{قبل # أسبوعًا}one{قبل أسبوع واحد}other{قبل # أسبوع}two{قبل أسبوعين}zero{قبل # أسبوع}',\n      F:'few{خلال # أسابيع}many{خلال # أسبوعًا}one{خلال أسبوع واحد}other{خلال # أسبوع}two{خلال # أسبوعين}zero{خلال # أسبوع}',\n    },\n    NARROW:{\n      R:{'-1':'الأسبوع الماضي','0':'هذا الأسبوع','1':'الأسبوع القادم'},\n      P:'few{قبل # أسابيع}many{قبل # أسبوعًا}one{قبل أسبوع واحد}other{قبل # أسبوع}two{قبل أسبوعين}zero{قبل # أسبوع}',\n      F:'few{خلال # أسابيع}many{خلال # أسبوعًا}one{خلال أسبوع واحد}other{خلال # أسبوع}two{خلال أسبوعين}zero{خلال # أسبوع}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'السنة الماضية','0':'هذه السنة','1':'السنة التالية'},\n      P:'few{قبل # سنوات}many{قبل # سنة}one{قبل سنة واحدة}other{قبل # سنة}two{قبل سنتين}zero{قبل # سنة}',\n      F:'few{خلال # سنوات}many{خلال # سنة}one{خلال سنة واحدة}other{خلال # سنة}two{خلال سنتين}zero{خلال # سنة}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_BH = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_DJ = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_EH = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_ER = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_IL = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_IQ = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_JO = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_KM = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_KW = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_LB = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_LY = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_MA = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_MR = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_OM = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_PS = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_QA = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_SA = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_SD = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_SO = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_SS = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_SY = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_TD = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_TN = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_XB =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'؜‮yesterday‬؜','0':'؜‮today‬؜','1':'؜‮tomorrow‬؜'},\n      P:'one{# ؜‮day‬؜ ؜‮ago‬؜}other{# ؜‮days‬؜ ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮day‬؜}other{؜‮in‬؜ # ؜‮days‬؜}',\n    },\n    SHORT:{\n      R:{'-1':'أمس','-2':'أول أمس','0':'اليوم','1':'غدًا','2':'بعد الغد'},\n      P:'one{# ؜‮day‬؜ ؜‮ago‬؜}other{# ؜‮days‬؜ ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮day‬؜}other{؜‮in‬؜ # ؜‮days‬؜}',\n    },\n    NARROW:{\n      R:{'-1':'أمس','-2':'أول أمس','0':'اليوم','1':'غدًا','2':'بعد الغد'},\n      P:'few{قبل # أيام}many{قبل # يومًا}one{قبل يوم واحد}other{قبل # يوم}two{قبل يومين}zero{قبل # يوم}',\n      F:'few{خلال # أيام}many{خلال # يومًا}one{خلال يوم واحد}other{خلال # يوم}two{خلال يومين}zero{خلال # يوم}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'؜‮this‬؜ ؜‮hour‬؜'},\n      P:'one{# ؜‮hour‬؜ ؜‮ago‬؜}other{# ؜‮hours‬؜ ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮hour‬؜}other{؜‮in‬؜ # ؜‮hours‬؜}',\n    },\n    SHORT:{\n      R:{'0':'؜‮this‬؜ ؜‮hour‬؜'},\n      P:'one{# ؜‮hr‬؜. ؜‮ago‬؜}other{# ؜‮hr‬؜. ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮hr‬؜.}other{؜‮in‬؜ # ؜‮hr‬؜.}',\n    },\n    NARROW:{\n      R:{'0':'؜‮this‬؜ ؜‮hour‬؜'},\n      P:'few{قبل # ساعات}many{قبل # ساعة}one{قبل ساعة واحدة}other{قبل # ساعة}two{قبل ساعتين}zero{قبل # ساعة}',\n      F:'few{خلال # ساعات}many{خلال # ساعة}one{خلال ساعة واحدة}other{خلال # ساعة}two{خلال ساعتين}zero{خلال # ساعة}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'؜‮this‬؜ ؜‮minute‬؜'},\n      P:'one{# ؜‮minute‬؜ ؜‮ago‬؜}other{# ؜‮minutes‬؜ ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮minute‬؜}other{؜‮in‬؜ # ؜‮minutes‬؜}',\n    },\n    SHORT:{\n      R:{'0':'؜‮this‬؜ ؜‮minute‬؜'},\n      P:'one{# ؜‮min‬؜. ؜‮ago‬؜}other{# ؜‮min‬؜. ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮min‬؜.}other{؜‮in‬؜ # ؜‮min‬؜.}',\n    },\n    NARROW:{\n      R:{'0':'؜‮this‬؜ ؜‮minute‬؜'},\n      P:'few{قبل # دقائق}many{قبل # دقيقة}one{قبل دقيقة واحدة}other{قبل # دقيقة}two{قبل دقيقتين}zero{قبل # دقيقة}',\n      F:'few{خلال # دقائق}many{خلال # دقيقة}one{خلال دقيقة واحدة}other{خلال # دقيقة}two{خلال دقيقتين}zero{خلال # دقيقة}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'؜‮last‬؜ ؜‮month‬؜','0':'؜‮this‬؜ ؜‮month‬؜','1':'؜‮next‬؜ ؜‮month‬؜'},\n      P:'one{# ؜‮month‬؜ ؜‮ago‬؜}other{# ؜‮months‬؜ ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮month‬؜}other{؜‮in‬؜ # ؜‮months‬؜}',\n    },\n    SHORT:{\n      R:{'-1':'؜‮last‬؜ ؜‮mo‬؜.','0':'؜‮this‬؜ ؜‮mo‬؜.','1':'؜‮next‬؜ ؜‮mo‬؜.'},\n      P:'one{# ؜‮mo‬؜. ؜‮ago‬؜}other{# ؜‮mo‬؜. ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮mo‬؜.}other{؜‮in‬؜ # ؜‮mo‬؜.}',\n    },\n    NARROW:{\n      R:{'-1':'؜‮last‬؜ ؜‮mo‬؜.','0':'؜‮this‬؜ ؜‮mo‬؜.','1':'؜‮next‬؜ ؜‮mo‬؜.'},\n      P:'few{قبل # أشهر}many{قبل # شهرًا}one{قبل شهر واحد}other{قبل # شهر}two{قبل شهرين}zero{قبل # شهر}',\n      F:'few{خلال # أشهر}many{خلال # شهرًا}one{خلال شهر واحد}other{خلال # شهر}two{خلال شهرين}zero{خلال # شهر}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'؜‮last‬؜ ؜‮quarter‬؜','0':'؜‮this‬؜ ؜‮quarter‬؜','1':'؜‮next‬؜ ؜‮quarter‬؜'},\n      P:'one{# ؜‮quarter‬؜ ؜‮ago‬؜}other{# ؜‮quarters‬؜ ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮quarter‬؜}other{؜‮in‬؜ # ؜‮quarters‬؜}',\n    },\n    SHORT:{\n      R:{'-1':'؜‮last‬؜ ؜‮qtr‬؜.','0':'؜‮this‬؜ ؜‮qtr‬؜.','1':'؜‮next‬؜ ؜‮qtr‬؜.'},\n      P:'one{# ؜‮qtr‬؜. ؜‮ago‬؜}other{# ؜‮qtrs‬؜. ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮qtr‬؜.}other{؜‮in‬؜ # ؜‮qtrs‬؜.}',\n    },\n    NARROW:{\n      R:{'-1':'الربع الأخير','0':'هذا الربع','1':'الربع القادم'},\n      P:'few{قبل # أرباع سنة}many{قبل # ربع سنة}one{قبل ربع سنة واحد}other{قبل # ربع سنة}two{قبل ربعي سنة}zero{قبل # ربع سنة}',\n      F:'few{خلال # أرباع سنة}many{خلال # ربع سنة}one{خلال ربع سنة واحد}other{خلال # ربع سنة}two{خلال ربعي سنة}zero{خلال # ربع سنة}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'؜‮now‬؜'},\n      P:'one{# ؜‮second‬؜ ؜‮ago‬؜}other{# ؜‮seconds‬؜ ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮second‬؜}other{؜‮in‬؜ # ؜‮seconds‬؜}',\n    },\n    SHORT:{\n      R:{'0':'؜‮now‬؜'},\n      P:'one{# ؜‮sec‬؜. ؜‮ago‬؜}other{# ؜‮sec‬؜. ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮sec‬؜.}other{؜‮in‬؜ # ؜‮sec‬؜.}',\n    },\n    NARROW:{\n      R:{'0':'؜‮now‬؜'},\n      P:'few{قبل # ثوانٍ}many{قبل # ثانية}one{قبل ثانية واحدة}other{قبل # ثانية}two{قبل ثانيتين}zero{قبل # ثانية}',\n      F:'few{خلال # ثوانٍ}many{خلال # ثانية}one{خلال ثانية واحدة}other{خلال # ثانية}two{خلال ثانيتين}zero{خلال # ثانية}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'؜‮last‬؜ ؜‮week‬؜','0':'؜‮this‬؜ ؜‮week‬؜','1':'؜‮next‬؜ ؜‮week‬؜'},\n      P:'one{# ؜‮week‬؜ ؜‮ago‬؜}other{# ؜‮weeks‬؜ ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮week‬؜}other{؜‮in‬؜ # ؜‮weeks‬؜}',\n    },\n    SHORT:{\n      R:{'-1':'؜‮last‬؜ ؜‮wk‬؜.','0':'؜‮this‬؜ ؜‮wk‬؜.','1':'؜‮next‬؜ ؜‮wk‬؜.'},\n      P:'one{# ؜‮wk‬؜. ؜‮ago‬؜}other{# ؜‮wk‬؜. ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮wk‬؜.}other{؜‮in‬؜ # ؜‮wk‬؜.}',\n    },\n    NARROW:{\n      R:{'-1':'؜‮last‬؜ ؜‮wk‬؜.','0':'؜‮this‬؜ ؜‮wk‬؜.','1':'؜‮next‬؜ ؜‮wk‬؜.'},\n      P:'few{قبل # أسابيع}many{قبل # أسبوعًا}one{قبل أسبوع واحد}other{قبل # أسبوع}two{قبل أسبوعين}zero{قبل # أسبوع}',\n      F:'few{خلال # أسابيع}many{خلال # أسبوعًا}one{خلال أسبوع واحد}other{خلال # أسبوع}two{خلال أسبوعين}zero{خلال # أسبوع}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'؜‮last‬؜ ؜‮year‬؜','0':'؜‮this‬؜ ؜‮year‬؜','1':'؜‮next‬؜ ؜‮year‬؜'},\n      P:'one{# ؜‮year‬؜ ؜‮ago‬؜}other{# ؜‮years‬؜ ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮year‬؜}other{؜‮in‬؜ # ؜‮years‬؜}',\n    },\n    SHORT:{\n      R:{'-1':'؜‮last‬؜ ؜‮yr‬؜.','0':'؜‮this‬؜ ؜‮yr‬؜.','1':'؜‮next‬؜ ؜‮yr‬؜.'},\n      P:'one{# ؜‮yr‬؜. ؜‮ago‬؜}other{# ؜‮yr‬؜. ؜‮ago‬؜}',\n      F:'one{؜‮in‬؜ # ؜‮yr‬؜.}other{؜‮in‬؜ # ؜‮yr‬؜.}',\n    },\n    NARROW:{\n      R:{'-1':'؜‮last‬؜ ؜‮yr‬؜.','0':'؜‮this‬؜ ؜‮yr‬؜.','1':'؜‮next‬؜ ؜‮yr‬؜.'},\n      P:'few{قبل # سنوات}many{قبل # سنة}one{قبل سنة واحدة}other{قبل # سنة}two{قبل سنتين}zero{قبل # سنة}',\n      F:'few{خلال # سنوات}many{خلال # سنة}one{خلال سنة واحدة}other{خلال # سنة}two{خلال سنتين}zero{خلال # سنة}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_YE = relativeDateTimeSymbols.RelativeDateTimeSymbols_ar;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_as =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'কালি','-2':'পৰহি','0':'আজি','1':'কাইলৈ','2':'পৰহিলৈ'},\n      P:'one{# দিন পূৰ্বে}other{# দিন পূৰ্বে}',\n      F:'one{# দিনত}other{# দিনত}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'এইটো ঘণ্টাত'},\n      P:'one{# ঘণ্টা পূৰ্বে}other{# ঘণ্টা পূৰ্বে}',\n      F:'one{# ঘণ্টাত}other{# ঘণ্টাত}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'এইটো মিনিটত'},\n      P:'one{# মিনিট পূৰ্বে}other{# মিনিট পূৰ্বে}',\n      F:'one{# মিনিটত}other{# মিনিটত}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'যোৱা মাহ','0':'এই মাহ','1':'অহা মাহ'},\n      P:'one{# মাহ পূৰ্বে}other{# মাহ পূৰ্বে}',\n      F:'one{# মাহত}other{# মাহত}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'যোৱা তিনি মাহ','0':'এই তিনি মাহ','1':'অহা তিনি মাহ'},\n      P:'one{# তিনি মাহ পূৰ্বে}other{# তিনি মাহ পূৰ্বে}',\n      F:'one{# তিনি মাহত}other{# তিনি মাহত}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'এতিয়া'},\n      P:'one{# ছেকেণ্ড পূৰ্বে}other{# ছেকেণ্ড পূৰ্বে}',\n      F:'one{# ছেকেণ্ডত}other{# ছেকেণ্ডত}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'যোৱা সপ্তাহ','0':'এই সপ্তাহ','1':'অহা সপ্তাহ'},\n      P:'one{# সপ্তাহ পূৰ্বে}other{# সপ্তাহ পূৰ্বে}',\n      F:'one{# সপ্তাহত}other{# সপ্তাহত}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'যোৱা বছৰ','0':'এই বছৰ','1':'অহা বছৰ'},\n      P:'one{# বছৰৰ পূৰ্বে}other{# বছৰৰ পূৰ্বে}',\n      F:'one{# বছৰত}other{# বছৰত}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_as_IN = exports.RelativeDateTimeSymbols_as;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_asa =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ighuo','0':'Iyoo','1':'Yavo'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_asa_TZ = exports.RelativeDateTimeSymbols_asa;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ast =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayeri','-2':'antayeri','0':'güei','1':'mañana','2':'pasao mañana'},\n      P:'one{hai # día}other{hai # díes}',\n      F:'one{en # día}other{en # díes}',\n    },\n    NARROW:{\n      R:{'-1':'ayeri','-2':'antay.','0':'güei','1':'mañ.','2':'p. mañ.'},\n      P:'one{hai # d.}other{hai # d.}',\n      F:'one{en # d.}other{en # d.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hai # hora}other{hai # hores}',\n      F:'one{en # hora}other{en # hores}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hai # h.}other{hai # h.}',\n      F:'one{en # h.}other{en # h.}',\n    },\n    NARROW:{\n      R:{'0':'esta h.'},\n      P:'one{hai # h.}other{hai # h.}',\n      F:'one{en # h.}other{en # h.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'esti minutu'},\n      P:'one{hai # minutu}other{hai # minutos}',\n      F:'one{en # minutu}other{en # minutos}',\n    },\n    SHORT:{\n      R:{'0':'esti min.'},\n      P:'one{hai # min.}other{hai # min.}',\n      F:'one{en # min.}other{en # min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasáu','0':'esti mes','1':'el mes viniente'},\n      P:'one{hai # mes}other{hai # meses}',\n      F:'one{en # mes}other{en # meses}',\n    },\n    SHORT:{\n      R:{'-1':'mes pas.','0':'esti mes','1':'mes vin.'},\n      P:'one{hai # mes}other{hai # meses}',\n      F:'one{en # mes}other{en # meses}',\n    },\n    NARROW:{\n      R:{'-1':'mes pas.','0':'esti mes','1':'mes vin.'},\n      P:'one{hai # m.}other{hai # m.}',\n      F:'one{en # m.}other{en # m.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'trimestre anterior','0':'esti trimestre','1':'trimestre viniente'},\n      P:'one{hai # trimestre}other{hai # trimestres}',\n      F:'one{en # trimestre}other{en # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'trim. ant.','0':'esti trim.','1':'trim. vin.'},\n      P:'one{hai # trim.}other{hai # trim.}',\n      F:'one{en # trim.}other{en # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. ant.','0':'esti trim.','1':'trim. vin.'},\n      P:'one{hai # tr.}other{hai # tr.}',\n      F:'one{en # tr.}other{en # tr.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'agora'},\n      P:'one{hai # segundu}other{hai # segundos}',\n      F:'one{en # segundu}other{en # segundos}',\n    },\n    SHORT:{\n      R:{'0':'agora'},\n      P:'one{hai # seg.}other{hai # seg.}',\n      F:'one{en # seg.}other{en # seg.}',\n    },\n    NARROW:{\n      R:{'0':'agora'},\n      P:'one{hai # s.}other{hai # s.}',\n      F:'one{en # s.}other{en # s.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la selmana pasada','0':'esta selmana','1':'la selmana viniente'},\n      P:'one{hai # selmana}other{hai # selmanes}',\n      F:'one{en # selmana}other{en # selmanes}',\n    },\n    SHORT:{\n      R:{'-1':'selm. pasada','0':'esta selm.','1':'selm. viniente'},\n      P:'one{hai # selm.}other{hai # selm.}',\n      F:'one{en # selm.}other{en # selm.}',\n    },\n    NARROW:{\n      R:{'-1':'selm. pas.','0':'esta selm.','1':'selm. vin.'},\n      P:'one{hai # se.}other{hai # se.}',\n      F:'one{en # se.}other{en # se.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'l’añu pasáu','0':'esti añu','1':'l’añu viniente'},\n      P:'one{hai # añu}other{hai # años}',\n      F:'one{en # añu}other{en # años}',\n    },\n    SHORT:{\n      R:{'-1':'l’añu pas.','0':'esti añu','1':'l’añu vin.'},\n      P:'one{hai # añu}other{hai # años}',\n      F:'one{en # añu}other{en # años}',\n    },\n    NARROW:{\n      R:{'-1':'añu pas.','0':'esti añu','1':'añu vin.'},\n      P:'one{hai # a.}other{hai # a.}',\n      F:'one{en # a.}other{en # a.}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ast_ES = exports.RelativeDateTimeSymbols_ast;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_az_Cyrl =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_az_Cyrl_AZ =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_az_Latn = relativeDateTimeSymbols.RelativeDateTimeSymbols_az;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_az_Latn_AZ = relativeDateTimeSymbols.RelativeDateTimeSymbols_az;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bas =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yààni','0':'lɛ̀n','1':'yàni'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bas_CM = exports.RelativeDateTimeSymbols_bas;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_be_BY = relativeDateTimeSymbols.RelativeDateTimeSymbols_be;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bem =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'Lelo','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bem_ZM = exports.RelativeDateTimeSymbols_bem;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bez =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Igolo','0':'Neng’u ni','1':'Hilawu'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bez_TZ = exports.RelativeDateTimeSymbols_bez;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bg_BG = relativeDateTimeSymbols.RelativeDateTimeSymbols_bg;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bm =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'kunu','0':'bi','1':'sini'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bm_ML = exports.RelativeDateTimeSymbols_bm;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bn_BD = relativeDateTimeSymbols.RelativeDateTimeSymbols_bn;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bn_IN = relativeDateTimeSymbols.RelativeDateTimeSymbols_bn;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bo =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ཁས་ས་','-2':'ཁས་ཉིན་','0':'དེ་རིང་','1':'སང་ཉིན་','2':'གནངས་ཉིན་'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bo_CN = exports.RelativeDateTimeSymbols_bo;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bo_IN = exports.RelativeDateTimeSymbols_bo;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_br_FR = relativeDateTimeSymbols.RelativeDateTimeSymbols_br;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_brx =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'मैया','0':'दिनै','1':'गाबोन'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_brx_IN = exports.RelativeDateTimeSymbols_brx;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bs_Cyrl =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'јуче','-2':'прекјуче','0':'данас','1':'сутра','2':'прекосутра'},\n      P:'few{пре # дана}one{пре # дан}other{пре # дана}',\n      F:'few{за # дана}one{за # дан}other{за # дана}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'few{пре # сата}one{пре # сат}other{пре # сати}',\n      F:'few{за # сата}one{за # сат}other{за # сати}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'few{пре # минута}one{пре # минут}other{пре # минута}',\n      F:'few{за # минута}one{за # минут}other{за # минута}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'Прошлог месеца','0':'Овог месеца','1':'Следећег месеца'},\n      P:'few{пре # месеца}one{пре # месец}other{пре # месеци}',\n      F:'few{за # месеца}one{за # месец}other{за # месеци}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'few{пре # секунде}one{пре # секунд}other{пре # секунди}',\n      F:'few{за # секунде}one{за # секунд}other{за # секунди}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'Прошле недеље','0':'Ове недеље','1':'Следеће недеље'},\n      P:'few{пре # недеље}one{пре # недељу}other{пре # недеља}',\n      F:'few{за # недеље}one{за # недељу}other{за # недеља}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'Прошле године','0':'Ове године','1':'Следеће године'},\n      P:'few{пре # године}one{пре # годину}other{пре # година}',\n      F:'few{за # године}one{за # годину}other{за # година}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bs_Cyrl_BA =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'јуче','-2':'прекјуче','0':'данас','1':'сутра','2':'прекосутра'},\n      P:'few{пре # дана}one{пре # дан}other{пре # дана}',\n      F:'few{за # дана}one{за # дан}other{за # дана}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'few{пре # сата}one{пре # сат}other{пре # сати}',\n      F:'few{за # сата}one{за # сат}other{за # сати}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'few{пре # минута}one{пре # минут}other{пре # минута}',\n      F:'few{за # минута}one{за # минут}other{за # минута}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'Прошлог месеца','0':'Овог месеца','1':'Следећег месеца'},\n      P:'few{пре # месеца}one{пре # месец}other{пре # месеци}',\n      F:'few{за # месеца}one{за # месец}other{за # месеци}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'few{пре # секунде}one{пре # секунд}other{пре # секунди}',\n      F:'few{за # секунде}one{за # секунд}other{за # секунди}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'Прошле недеље','0':'Ове недеље','1':'Следеће недеље'},\n      P:'few{пре # недеље}one{пре # недељу}other{пре # недеља}',\n      F:'few{за # недеље}one{за # недељу}other{за # недеља}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'Прошле године','0':'Ове године','1':'Следеће године'},\n      P:'few{пре # године}one{пре # годину}other{пре # година}',\n      F:'few{за # године}one{за # годину}other{за # година}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bs_Latn = relativeDateTimeSymbols.RelativeDateTimeSymbols_bs;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bs_Latn_BA = relativeDateTimeSymbols.RelativeDateTimeSymbols_bs;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ca_AD = relativeDateTimeSymbols.RelativeDateTimeSymbols_ca;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ca_ES = relativeDateTimeSymbols.RelativeDateTimeSymbols_ca;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ca_FR = relativeDateTimeSymbols.RelativeDateTimeSymbols_ca;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ca_IT = relativeDateTimeSymbols.RelativeDateTimeSymbols_ca;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ccp =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'\uD804\uDD09\uD804\uDD2C\uD804\uDD23\uD804\uDD34\uD804\uDD23\uD804\uDD33\uD804\uDD20\uD804\uDD07\uD804\uDD2C\uD804\uDD23\uD804\uDD33\uD804\uDD20\uD804\uDD2C','-2':'\uD804\uDD09\uD804\uDD2C\uD804\uDD23\uD804\uDD27\uD804\uDD18\uD804\uDD2C \uD804\uDD1B\uD804\uDD27\uD804\uDD22\uD804\uDD34\uD804\uDD25\uD804\uDD2A','0':'\uD804\uDD03\uD804\uDD2C\uD804\uDD0C\uD804\uDD34\uD804\uDD25\uD804\uDD33\uD804\uDD20','1':'\uD804\uDD03\uD804\uDD2C\uD804\uDD0E\uD804\uDD2C\uD804\uDD16\uD804\uDD34\uD804\uDD16\uD804\uDD33\uD804\uDD20\uD804\uDD07\uD804\uDD2C\uD804\uDD23\uD804\uDD33\uD804\uDD20\uD804\uDD2C','2':'\uD804\uDD03\uD804\uDD2C\uD804\uDD0E\uD804\uDD2C\uD804\uDD16\uD804\uDD34\uD804\uDD16\uD804\uDD33\uD804\uDD20\uD804\uDD2C \uD804\uDD1B\uD804\uDD27\uD804\uDD22\uD804\uDD34\uD804\uDD25\uD804\uDD2A'},\n      P:'one{# \uD804\uDD18\uD804\uDD28\uD804\uDD1A\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{# \uD804\uDD18\uD804\uDD28\uD804\uDD1A\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}',\n      F:'one{# \uD804\uDD18\uD804\uDD28\uD804\uDD1A\uD804\uDD2E \uD804\uDD1F\uD804\uDD27\uD804\uDD16\uD804\uDD34\uD804\uDD19\uD804\uDD33\uD804\uDD20}other{# \uD804\uDD18\uD804\uDD28\uD804\uDD1A\uD804\uDD2E \uD804\uDD1F\uD804\uDD27\uD804\uDD16\uD804\uDD34\uD804\uDD19\uD804\uDD33\uD804\uDD20}',\n    },\n    SHORT:{\n      R:{'-1':'\uD804\uDD09\uD804\uDD2C\uD804\uDD23\uD804\uDD34\uD804\uDD23\uD804\uDD33\uD804\uDD20\uD804\uDD07\uD804\uDD2C\uD804\uDD23\uD804\uDD34\uD804\uDD23\uD804\uDD33\uD804\uDD20\uD804\uDD2C','-2':'\uD804\uDD09\uD804\uDD2C\uD804\uDD23\uD804\uDD27\uD804\uDD18\uD804\uDD2C \uD804\uDD1B\uD804\uDD27\uD804\uDD22\uD804\uDD34\uD804\uDD25\uD804\uDD2A','0':'\uD804\uDD03\uD804\uDD2C\uD804\uDD0C\uD804\uDD34\uD804\uDD25\uD804\uDD33\uD804\uDD20\uD804\uDD2C','1':'\uD804\uDD03\uD804\uDD2C\uD804\uDD0E\uD804\uDD2C\uD804\uDD16\uD804\uDD34\uD804\uDD16\uD804\uDD33\uD804\uDD20\uD804\uDD07\uD804\uDD2C\uD804\uDD23\uD804\uDD34\uD804\uDD23\uD804\uDD33\uD804\uDD20\uD804\uDD2C','2':'\uD804\uDD03\uD804\uDD2C\uD804\uDD0E\uD804\uDD2C\uD804\uDD16\uD804\uDD34\uD804\uDD16\uD804\uDD33\uD804\uDD20\uD804\uDD07\uD804\uDD2C\uD804\uDD23\uD804\uDD34\uD804\uDD23\uD804\uDD33\uD804\uDD20\uD804\uDD2C \uD804\uDD1B\uD804\uDD27\uD804\uDD22\uD804\uDD34\uD804\uDD25\uD804\uDD2A'},\n      P:'one{# \uD804\uDD18\uD804\uDD28\uD804\uDD1A\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{# \uD804\uDD18\uD804\uDD28\uD804\uDD1A\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}',\n      F:'one{# \uD804\uDD18\uD804\uDD28\uD804\uDD1A\uD804\uDD2E \uD804\uDD1F\uD804\uDD27\uD804\uDD16\uD804\uDD34\uD804\uDD19\uD804\uDD33\uD804\uDD20}other{# \uD804\uDD18\uD804\uDD28\uD804\uDD1A\uD804\uDD2E \uD804\uDD1F\uD804\uDD27\uD804\uDD16\uD804\uDD34\uD804\uDD19\uD804\uDD33\uD804\uDD20}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'\uD804\uDD03\uD804\uDD33\uD804\uDD06\uD804\uDD2C \uD804\uDD0A\uD804\uDD2E\uD804\uDD1A\uD804\uDD34\uD804\uDD13\uD804\uDD20\uD804\uDD34'},\n      P:'one{# \uD804\uDD0A\uD804\uDD2E\uD804\uDD1A\uD804\uDD34\uD804\uDD13 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{# \uD804\uDD0A\uD804\uDD2E\uD804\uDD1A\uD804\uDD34\uD804\uDD13 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}',\n      F:'one{# \uD804\uDD0A\uD804\uDD2E\uD804\uDD1A\uD804\uDD34\uD804\uDD13\uD804\uDD20\uD804\uDD34}other{# \uD804\uDD0A\uD804\uDD2E\uD804\uDD1A\uD804\uDD34\uD804\uDD13\uD804\uDD20\uD804\uDD34}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'\uD804\uDD03\uD804\uDD33\uD804\uDD06\uD804\uDD2C \uD804\uDD1F\uD804\uDD28\uD804\uDD1A\uD804\uDD28\uD804\uDD16\uD804\uDD34'},\n      P:'one{# \uD804\uDD1F\uD804\uDD28\uD804\uDD1A\uD804\uDD28\uD804\uDD16\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{# \uD804\uDD1F\uD804\uDD28\uD804\uDD1A\uD804\uDD28\uD804\uDD16\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}',\n      F:'one{# \uD804\uDD1F\uD804\uDD28\uD804\uDD1A\uD804\uDD28\uD804\uDD18\uD804\uDD2C}other{# \uD804\uDD1F\uD804\uDD28\uD804\uDD1A\uD804\uDD28\uD804\uDD18\uD804\uDD2C}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'\uD804\uDD09\uD804\uDD2C\uD804\uDD23\uD804\uDD27\uD804\uDD18\uD804\uDD2C \uD804\uDD1F\uD804\uDD0F\uD804\uDD34','0':'\uD804\uDD03\uD804\uDD33\uD804\uDD06\uD804\uDD2C \uD804\uDD1F\uD804\uDD0F\uD804\uDD34','1':'\uD804\uDD1B\uD804\uDD27\uD804\uDD22\uD804\uDD2C \uD804\uDD1F\uD804\uDD0F\uD804\uDD34'},\n      P:'one{# \uD804\uDD1F\uD804\uDD0F\uD804\uDD27 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{# \uD804\uDD1F\uD804\uDD0F\uD804\uDD27 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}',\n      F:'one{# \uD804\uDD1F\uD804\uDD0F\uD804\uDD2C}other{# \uD804\uDD1F\uD804\uDD0F\uD804\uDD2C}',\n    },\n    SHORT:{\n      R:{'-1':'\uD804\uDD09\uD804\uDD2C\uD804\uDD23\uD804\uDD27\uD804\uDD09\uD804\uDD2C \uD804\uDD1F\uD804\uDD0F\uD804\uDD34','0':'\uD804\uDD03\uD804\uDD33\uD804\uDD06\uD804\uDD2C \uD804\uDD1F\uD804\uDD0F\uD804\uDD34','1':'\uD804\uDD1B\uD804\uDD27\uD804\uDD22\uD804\uDD2C \uD804\uDD1F\uD804\uDD0F\uD804\uDD34'},\n      P:'one{# \uD804\uDD07\uD804\uDD0F\uD804\uDD27 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{# \uD804\uDD1F\uD804\uDD0F\uD804\uDD27 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}',\n      F:'one{# \uD804\uDD1F\uD804\uDD0F\uD804\uDD2C}other{# \uD804\uDD1F\uD804\uDD0F\uD804\uDD2C}',\n    },\n    NARROW:{\n      R:{'-1':'\uD804\uDD09\uD804\uDD2C\uD804\uDD23\uD804\uDD27\uD804\uDD18\uD804\uDD2C \uD804\uDD1F\uD804\uDD0F\uD804\uDD34','0':'\uD804\uDD03\uD804\uDD33\uD804\uDD06\uD804\uDD2C \uD804\uDD1F\uD804\uDD0F\uD804\uDD34','1':'\uD804\uDD1B\uD804\uDD27\uD804\uDD22\uD804\uDD2C \uD804\uDD1F\uD804\uDD0F\uD804\uDD34'},\n      P:'one{# \uD804\uDD1F\uD804\uDD0F\uD804\uDD27 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{# \uD804\uDD1F\uD804\uDD0F\uD804\uDD27 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}',\n      F:'one{# \uD804\uDD1F\uD804\uDD0F\uD804\uDD2C}other{# \uD804\uDD1F\uD804\uDD0F\uD804\uDD2C}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'\uD804\uDD09\uD804\uDD2C\uD804\uDD23\uD804\uDD33\uD804\uDD20\uD804\uDD2C \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34','0':'\uD804\uDD03\uD804\uDD33\uD804\uDD06\uD804\uDD2C \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34','1':'\uD804\uDD1B\uD804\uDD27\uD804\uDD22\uD804\uDD2C \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34'},\n      P:'one{# \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{# \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}',\n      F:'one{# \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD2C}other{# \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD1F\uD804\uDD0F\uD804\uDD2C}',\n    },\n    SHORT:{\n      R:{'-1':'\uD804\uDD09\uD804\uDD2C\uD804\uDD23\uD804\uDD33\uD804\uDD20\uD804\uDD2C \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34','0':'\uD804\uDD03\uD804\uDD33\uD804\uDD06\uD804\uDD2C \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34','1':'\uD804\uDD1B\uD804\uDD27\uD804\uDD22\uD804\uDD2C \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34'},\n      P:'one{# \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{#\uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}',\n      F:'one{# \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD2C}other{# \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD2C}',\n    },\n    NARROW:{\n      R:{'-1':'\uD804\uDD09\uD804\uDD2C\uD804\uDD23\uD804\uDD33\uD804\uDD20\uD804\uDD2C \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34','0':'\uD804\uDD03\uD804\uDD33\uD804\uDD06\uD804\uDD2C \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34','1':'\uD804\uDD1B\uD804\uDD27\uD804\uDD22\uD804\uDD2C \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34'},\n      P:'one{# \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{# \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34 \uD804\uDD03\uD804\uDD2C\uD804\uDD09}',\n      F:'one{# \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD2C}other{# \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0F\uD804\uDD2C}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'\uD804\uDD03\uD804\uDD28\uD804\uDD07\uD804\uDD34\uD804\uDD05\uD804\uDD1A\uD804\uDD2A'},\n      P:'one{# \uD804\uDD25\uD804\uDD2C\uD804\uDD09\uD804\uDD2C\uD804\uDD1A\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{# \uD804\uDD25\uD804\uDD2C\uD804\uDD09\uD804\uDD2C\uD804\uDD1A\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}',\n      F:'one{# \uD804\uDD25\uD804\uDD2C\uD804\uDD09\uD804\uDD2C\uD804\uDD1A\uD804\uDD34\uD804\uDD18\uD804\uDD2C}other{# \uD804\uDD25\uD804\uDD2C\uD804\uDD09\uD804\uDD2C\uD804\uDD1A\uD804\uDD34\uD804\uDD18\uD804\uDD2C}',\n    },\n    NARROW:{\n      R:{'0':'\uD804\uDD03\uD804\uDD28\uD804\uDD07\uD804\uDD34\uD804\uDD05\uD804\uDD1A\uD804\uDD2A'},\n      P:'one{# \uD804\uDD25\uD804\uDD2C\uD804\uDD09\uD804\uDD2C\uD804\uDD1A\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{# \uD804\uDD25\uD804\uDD2C\uD804\uDD09\uD804\uDD2C\uD804\uDD1A\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}',\n      F:'one{# \uD804\uDD25\uD804\uDD2C\uD804\uDD09\uD804\uDD2C\uD804\uDD1A\uD804\uDD34}other{# \uD804\uDD25\uD804\uDD2C\uD804\uDD09\uD804\uDD2C\uD804\uDD1A\uD804\uDD34\uD804\uDD18\uD804\uDD2C}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'\uD804\uDD09\uD804\uDD2C\uD804\uDD23\uD804\uDD27\uD804\uDD18\uD804\uDD2C \uD804\uDD25\uD804\uDD1B\uD804\uDD34\uD804\uDD16','0':'\uD804\uDD03\uD804\uDD33\uD804\uDD06\uD804\uDD2C \uD804\uDD25\uD804\uDD1B\uD804\uDD34\uD804\uDD16','1':'\uD804\uDD1B\uD804\uDD27\uD804\uDD22\uD804\uDD2C \uD804\uDD25\uD804\uDD1B\uD804\uDD34\uD804\uDD16'},\n      P:'one{# \uD804\uDD25\uD804\uDD1B\uD804\uDD34\uD804\uDD16 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{# \uD804\uDD25\uD804\uDD1B\uD804\uDD34\uD804\uDD16 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}',\n      F:'one{# \uD804\uDD25\uD804\uDD1B\uD804\uDD34\uD804\uDD16\uD804\uDD20\uD804\uDD34}other{# \uD804\uDD25\uD804\uDD1B\uD804\uDD34\uD804\uDD16\uD804\uDD20\uD804\uDD34}',\n    },\n    NARROW:{\n      R:{'-1':'\uD804\uDD09\uD804\uDD2C\uD804\uDD23\uD804\uDD27\uD804\uDD18\uD804\uDD2C \uD804\uDD25\uD804\uDD1B\uD804\uDD34\uD804\uDD16','0':'\uD804\uDD03\uD804\uDD33\uD804\uDD06\uD804\uDD2C \uD804\uDD25\uD804\uDD1B\uD804\uDD34\uD804\uDD16','1':'\uD804\uDD1B\uD804\uDD27\uD804\uDD22\uD804\uDD2C \uD804\uDD25\uD804\uDD1B\uD804\uDD34\uD804\uDD16'},\n      P:'one{# \uD804\uDD25\uD804\uDD1B\uD804\uDD34\uD804\uDD16\uD804\uDD22\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{# \uD804\uDD25\uD804\uDD1B\uD804\uDD34\uD804\uDD16\uD804\uDD22\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}',\n      F:'one{# \uD804\uDD25\uD804\uDD1B\uD804\uDD34\uD804\uDD16\uD804\uDD20\uD804\uDD34}other{# \uD804\uDD25\uD804\uDD1B\uD804\uDD34\uD804\uDD16\uD804\uDD20\uD804\uDD34}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'\uD804\uDD09\uD804\uDD2C\uD804\uDD23\uD804\uDD33\uD804\uDD20\uD804\uDD2C \uD804\uDD1D\uD804\uDD27\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34','0':'\uD804\uDD03\uD804\uDD2C \uD804\uDD1D\uD804\uDD27\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34','1':'\uD804\uDD0E\uD804\uDD2C\uD804\uDD22\uD804\uDD27 \uD804\uDD1D\uD804\uDD27\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34'},\n      P:'one{# \uD804\uDD1D\uD804\uDD27\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{# \uD804\uDD1D\uD804\uDD27\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}',\n      F:'one{# \uD804\uDD1D\uD804\uDD27\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD2C}other{# \uD804\uDD1D\uD804\uDD27\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD2C}',\n    },\n    SHORT:{\n      R:{'-1':'\uD804\uDD09\uD804\uDD2C\uD804\uDD23\uD804\uDD33\uD804\uDD20\uD804\uDD2C \uD804\uDD1D\uD804\uDD27\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34','0':'\uD804\uDD03\uD804\uDD33\uD804\uDD06\uD804\uDD2C \uD804\uDD1D\uD804\uDD27\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34','1':'\uD804\uDD1B\uD804\uDD27\uD804\uDD22\uD804\uDD2C \uD804\uDD1D\uD804\uDD27\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34'},\n      P:'one{# \uD804\uDD1D\uD804\uDD27\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}other{# \uD804\uDD1D\uD804\uDD27\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD34 \uD804\uDD03\uD804\uDD09\uD804\uDD2C}',\n      F:'one{# \uD804\uDD1D\uD804\uDD27\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD2C}other{# \uD804\uDD1D\uD804\uDD27\uD804\uDD0F\uD804\uDD27\uD804\uDD22\uD804\uDD2C}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ccp_BD = exports.RelativeDateTimeSymbols_ccp;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ccp_IN = exports.RelativeDateTimeSymbols_ccp;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ce =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'селхана','0':'тахана','1':'кхана'},\n      P:'one{# де хьалха}other{# де хьалха}',\n      F:'one{# де даьлча}other{# де даьлча}',\n    },\n    SHORT:{\n      R:{'-1':'селхана','0':'тахана','1':'кхана'},\n      P:'one{# д. хьалха}other{# де хьалха}',\n      F:'one{# д. даьлча}other{# д. даьлча}',\n    },\n    NARROW:{\n      R:{'-1':'селхана','0':'тахана','1':'кхана'},\n      P:'one{де хьалха}other{# де хьалха}',\n      F:'one{# д. даьлча}other{# д. даьлча}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'хӀокху сахьтехь'},\n      P:'one{# сахьт хьалха}other{# сахьт хьалха}',\n      F:'one{# сахьт даьлча}other{# сахьт даьлча}',\n    },\n    SHORT:{\n      R:{'0':'хӀокху сахьтехь'},\n      P:'one{# сахь. хьалха}other{# сахь. хьалха}',\n      F:'one{# сахь. даьлча}other{# сахь. даьлча}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'хӀокху минотехь'},\n      P:'one{# минот хьалха}other{# минот хьалха}',\n      F:'one{# минот яьлча}other{# минот яьлча}',\n    },\n    SHORT:{\n      R:{'0':'хӀокху минотехь'},\n      P:'one{# мин. хьалха}other{# мин. хьалха}',\n      F:'one{# мин. яьлча}other{# мин. яьлча}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'баханчу баттахь','0':'карарчу баттахь','1':'рогӀерчу баттахь'},\n      P:'one{# бутт хьалха}other{# бутт хьалха}',\n      F:'one{# бутт баьлча}other{# бутт баьлча}',\n    },\n    SHORT:{\n      R:{'-1':'баханчу баттахь','0':'карарчу баттахь','1':'рогӀерчу баттахь'},\n      P:'one{# б. хьалха}other{# б. хьалха}',\n      F:'one{# б. баьлча}other{# б. баьлча}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# квартал хьалха}other{# квартал хьалха}',\n      F:'one{# квартал яьлча}other{# квартал яьлча}',\n    },\n    SHORT:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# кв. хьалха}other{# кв. хьалха}',\n      F:'one{# кв. яьлча}other{# кв. яьлча}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'хӀинца'},\n      P:'one{# секунд хьалха}other{# секунд хьалха}',\n      F:'one{# секунд яьлча}other{# секунд яьлча}',\n    },\n    SHORT:{\n      R:{'0':'хӀинца'},\n      P:'one{# сек. хьалха}other{# сек. хьалха}',\n      F:'one{# сек. яьлча}other{# сек. яьлча}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'даханчу кӀирнахь','0':'карарчу кӀирнахь','1':'рогӀерчу кӀирнахь'},\n      P:'one{# кӀира хьалха}other{# кӀира хьалха}',\n      F:'one{# кӀира даьлча}other{# кӀира даьлча}',\n    },\n    SHORT:{\n      R:{'-1':'даханчу кӀирнахь','0':'карарчу кӀирнахь','1':'рогӀерчу кӀирнахь'},\n      P:'one{# кӀир. хьалха}other{# кӀир. хьалха}',\n      F:'one{# кӀир. даьлча}other{# кӀир. даьлча}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'даханчу шарахь','0':'карарчу шарахь','1':'рогӀерчу шарахь'},\n      P:'one{# шо хьалха}other{# шо хьалха}',\n      F:'one{# шо даьлча}other{# шо даьлча}',\n    },\n    SHORT:{\n      R:{'-1':'даханчу шарахь','0':'карарчу шарахь','1':'рогӀерчу шарахь'},\n      P:'one{# ш. хьалха}other{# ш. хьалха}',\n      F:'one{# ш. даьлча}other{# ш. даьлча}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ce_RU = exports.RelativeDateTimeSymbols_ce;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ceb =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Kagahapon','0':'Karon nga Adlaw','1':'Ugma'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ceb_PH = exports.RelativeDateTimeSymbols_ceb;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_cgg =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Nyomwabazyo','0':'Erizooba','1':'Nyenkyakare'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_cgg_UG = exports.RelativeDateTimeSymbols_cgg;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_chr_US = relativeDateTimeSymbols.RelativeDateTimeSymbols_chr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ckb =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ckb_IQ = exports.RelativeDateTimeSymbols_ckb;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ckb_IR = exports.RelativeDateTimeSymbols_ckb;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_cs_CZ = relativeDateTimeSymbols.RelativeDateTimeSymbols_cs;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_cy_GB = relativeDateTimeSymbols.RelativeDateTimeSymbols_cy;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_da_DK = relativeDateTimeSymbols.RelativeDateTimeSymbols_da;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_da_GL = relativeDateTimeSymbols.RelativeDateTimeSymbols_da;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_dav =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Iguo','0':'Idime','1':'Kesho'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_dav_KE = exports.RelativeDateTimeSymbols_dav;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_de_BE = relativeDateTimeSymbols.RelativeDateTimeSymbols_de;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_de_DE = relativeDateTimeSymbols.RelativeDateTimeSymbols_de;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_de_IT = relativeDateTimeSymbols.RelativeDateTimeSymbols_de;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_de_LI = relativeDateTimeSymbols.RelativeDateTimeSymbols_de;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_de_LU = relativeDateTimeSymbols.RelativeDateTimeSymbols_de;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_dje =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Bi','0':'Hõo','1':'Suba'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_dje_NE = exports.RelativeDateTimeSymbols_dje;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_dsb =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'cora','0':'źinsa','1':'witśe'},\n      P:'few{pśed # dnjami}one{pśed # dnjom}other{pśed # dnjami}two{pśed # dnjoma}',\n      F:'few{za # dny}one{za # źeń}other{za # dnjow}two{za # dnja}',\n    },\n    SHORT:{\n      R:{'-1':'cora','0':'źinsa','1':'witśe'},\n      P:'few{pśed # dnj.}one{pśed # dnj.}other{pśed # dnj.}two{pśed # dnj.}',\n      F:'few{za # dny}one{za # źeń}other{za # dnj.}two{za # dnj.}',\n    },\n    NARROW:{\n      R:{'-1':'cora','0':'źinsa','1':'witśe'},\n      P:'few{pśed # d}one{pśed # d}other{pśed # d}two{pśed # d}',\n      F:'few{za # ź}one{za # ź}other{za # ź}two{za # ź}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'few{pśed # góźinami}one{pśed # góźinu}other{pśed # góźinami}two{pśed # góźinoma}',\n      F:'few{za # góźiny}one{za # góźinu}other{za # góźin}two{za # góźinje}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'few{pśed # góź.}one{pśed # góź.}other{pśed # góź.}two{pśed # góź.}',\n      F:'few{za # góź.}one{za # góź.}other{za # góź.}two{za # góź.}',\n    },\n    NARROW:{\n      R:{'0':'this hour'},\n      P:'few{pśed # g}one{pśed # g}other{pśed # g}two{pśed # g}',\n      F:'few{za # g}one{za # g}other{za # g}two{za # g}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'few{pśed # minutami}one{pśed # minutu}other{pśed # minutami}two{pśed # minutoma}',\n      F:'few{za # minuty}one{za # minutu}other{za # minutow}two{za # minuśe}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'few{pśed # min.}one{pśed # min.}other{pśed # min.}two{pśed # min.}',\n      F:'few{za # min.}one{za # min.}other{za # min.}two{za # min.}',\n    },\n    NARROW:{\n      R:{'0':'this minute'},\n      P:'few{pśed # m}one{pśed # m}other{pśed # m}two{pśed # m}',\n      F:'few{za # m}one{za # m}other{za # m}two{za # m}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'slědny mjasec','0':'ten mjasec','1':'pśiducy mjasec'},\n      P:'few{pśed # mjasecami}one{pśed # mjasecom}other{pśed # mjasecami}two{pśed # mjasecoma}',\n      F:'few{za # mjasecy}one{za # mjasec}other{za # mjasecow}two{za # mjaseca}',\n    },\n    SHORT:{\n      R:{'-1':'slědny mjasec','0':'ten mjasec','1':'pśiducy mjasec'},\n      P:'few{pśed # mjas.}one{pśed # mjas.}other{pśed # mjas.}two{pśed # mjas.}',\n      F:'few{za # mjas.}one{za # mjas.}other{za # mjas.}two{za # mjas.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'few{pśed # kwartalami}one{pśed # kwartalom}other{pśed # kwartalami}two{pśed # kwartaloma}',\n      F:'few{za # kwartale}one{za # kwartal}other{za # kwartalow}two{za # kwartala}',\n    },\n    SHORT:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'few{pśed # kwart.}one{pśed # kwart.}other{pśed # kwart.}two{pśed # kwart.}',\n      F:'few{za # kwart.}one{za # kwart.}other{za # kwart.}two{za # kwart.}',\n    },\n    NARROW:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'few{pśed # kw.}one{pśed # kw.}other{pśed # kw.}two{pśed # kw.}',\n      F:'few{za # kw.}one{za # kw.}other{za # kw.}two{za # kw.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'few{pśed # sekundami}one{pśed # sekundu}other{pśed # sekundami}two{pśed # sekundoma}',\n      F:'few{za # sekundy}one{za # sekundu}other{za # sekundow}two{za # sekunźe}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'few{pśed # sek.}one{pśed # sek.}other{pśed # sek.}two{pśed # sek.}',\n      F:'few{za # sek.}one{za # sek.}other{za # sek.}two{za # sek.}',\n    },\n    NARROW:{\n      R:{'0':'now'},\n      P:'few{pśed # s}one{pśed # s}other{pśed # s}two{pśed # s}',\n      F:'few{za # s}one{za # s}other{za # s}two{za # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'slědny tyźeń','0':'ten tyźeń','1':'pśiducy tyźeń'},\n      P:'few{pśed # tyźenjami}one{pśed # tyźenjom}other{pśed # tyźenjami}two{pśed # tyźenjoma}',\n      F:'few{za # tyźenje}one{za # tyźeń}other{za # tyźenjow}two{za # tyźenja}',\n    },\n    SHORT:{\n      R:{'-1':'slědny tyźeń','0':'ten tyźeń','1':'pśiducy tyźeń'},\n      P:'few{pśed # tyź.}one{pśed # tyź.}other{pśed # tyź.}two{pśed # tyź.}',\n      F:'few{za # tyź.}one{za # tyź.}other{za # tyź.}two{za # tyź.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'łoni','0':'lětosa','1':'znowa'},\n      P:'few{pśed # lětami}one{pśed # lětom}other{pśed # lětami}two{pśed # lětoma}',\n      F:'few{za # lěta}one{za # lěto}other{za # lět}two{za # lěśe}',\n    },\n    SHORT:{\n      R:{'-1':'łoni','0':'lětosa','1':'znowa'},\n      P:'few{pśed # l.}one{pśed # l.}other{pśed # l.}two{pśed # l.}',\n      F:'few{za # l.}one{za # l.}other{za # l.}two{za # l.}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_dsb_DE = exports.RelativeDateTimeSymbols_dsb;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_dua =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'kíɛlɛ nítómb́í','0':'wɛ́ŋgɛ̄','1':'kíɛlɛ'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_dua_CM = exports.RelativeDateTimeSymbols_dua;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_dyo =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Fucen','0':'Jaat','1':'Kajom'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_dyo_SN = exports.RelativeDateTimeSymbols_dyo;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_dz =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ཁ་ཙ་','-2':'ཁ་ཉིམ','0':'ད་རིས་','1':'ནངས་པ་','2':'གནངས་ཚེ'},\n      P:'other{ཉིནམ་ # ཧེ་མ་}',\n      F:'other{ཉིནམ་ # ནང་}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{ཆུ་ཚོད་ # ཧེ་མ་}',\n      F:'other{ཆུ་ཚོད་ # ནང་}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{སྐར་མ་ # ཧེ་མ་}',\n      F:'other{སྐར་མ་ # ནང་}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{ཟླཝ་ # ཧེ་མ་}',\n      F:'other{ཟླཝ་ # ནང་}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{སྐར་ཆ་ # ཧེ་མ་}',\n      F:'other{སྐར་ཆ་ # ནང་}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{བངུན་ཕྲག་ # ཧེ་མ་}',\n      F:'other{བངུན་ཕྲག་ # ནང་}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{ལོ་འཁོར་ # ཧེ་མ་}',\n      F:'other{ལོ་འཁོར་ # ནང་}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_dz_BT = exports.RelativeDateTimeSymbols_dz;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ebu =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ĩgoro','0':'Ũmũnthĩ','1':'Rũciũ'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ebu_KE = exports.RelativeDateTimeSymbols_ebu;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ee =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'etsɔ si va yi','-2':'nyitsɔ si va yi','0':'egbe','1':'etsɔ si gbɔna','2':'nyitsɔ si gbɔna'},\n      P:'one{ŋkeke # si va yi}other{ŋkeke # si wo va yi}',\n      F:'one{le ŋkeke # me}other{le ŋkeke # wo me}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{gaƒoƒo # si va yi}other{gaƒoƒo # si wo va yi}',\n      F:'one{le gaƒoƒo # me}other{le gaƒoƒo # wo me}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{aɖabaƒoƒo # si va yi}other{aɖabaƒoƒo # si wo va yi}',\n      F:'one{le aɖabaƒoƒo # me}other{le aɖabaƒoƒo # wo me}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ɣleti si va yi','0':'ɣleti sia','1':'ɣleti si gbɔ na'},\n      P:'one{ɣleti # si va yi}other{ɣleti # si wo va yi}',\n      F:'one{le ɣleti # me}other{le ɣleti # wo me}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{kɔta # si va yi me}other{kɔta # si va yi me}',\n      F:'one{le kɔta # si gbɔ na me}other{le kɔta # si gbɔ na me}',\n    },\n    NARROW:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{kɔta # si va yi me}other{kɔta # si va yi me}',\n      F:'one{le kɔta # si gbɔna me}other{le kɔta # si gbɔ na me}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'fifi'},\n      P:'one{sekend # si va yi}other{sekend # si wo va yi}',\n      F:'one{le sekend # me}other{le sekend # wo me}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'kɔsiɖa si va yi','0':'kɔsiɖa sia','1':'kɔsiɖa si gbɔ na'},\n      P:'one{kɔsiɖa # si va yi}other{kɔsiɖa # si wo va yi}',\n      F:'one{le kɔsiɖa # me}other{le kɔsiɖa # wo me}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ƒe si va yi','0':'ƒe sia','1':'ƒe si gbɔ na'},\n      P:'one{ƒe # si va yi}other{ƒe # si wo va yi}',\n      F:'one{le ƒe # me}other{le ƒe # me}',\n    },\n    SHORT:{\n      R:{'-1':'ƒe si va yi','0':'ƒe sia','1':'ƒe si gbɔ na'},\n      P:'one{le ƒe # si va yi me}other{le ƒe # si va yi me}',\n      F:'one{le ƒe # me}other{le ƒe # me}',\n    },\n    NARROW:{\n      R:{'-1':'ƒe si va yi','0':'ƒe sia','1':'ƒe si gbɔ na'},\n      P:'one{ƒe # si va yi me}other{ƒe # si va yi me}',\n      F:'one{le ƒe # si gbɔna me}other{le ƒe # si gbɔna me}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ee_GH = exports.RelativeDateTimeSymbols_ee;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ee_TG = exports.RelativeDateTimeSymbols_ee;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_el_CY = relativeDateTimeSymbols.RelativeDateTimeSymbols_el;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_el_GR = relativeDateTimeSymbols.RelativeDateTimeSymbols_el;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_001 =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_150 =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_AE = relativeDateTimeSymbols.RelativeDateTimeSymbols_en;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_AG =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_AI =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_AS = relativeDateTimeSymbols.RelativeDateTimeSymbols_en;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_AT =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_BB =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_BE =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_BI = relativeDateTimeSymbols.RelativeDateTimeSymbols_en;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_BM =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_BS =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_BW =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_BZ =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_CC =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_CH =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_CK =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_CM =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_CX =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_CY =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_DE =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_DG =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_DK =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_DM =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_ER =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_FI =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_FJ =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_FK =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_FM =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_GD =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_GG =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_GH =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_GI =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_GM =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_GU = relativeDateTimeSymbols.RelativeDateTimeSymbols_en;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_GY =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_HK =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_IL =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_IM =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_IO =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_JE =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_JM =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_KE =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_KI =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_KN =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_KY =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_LC =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_LR =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_LS =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_MG =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_MH = relativeDateTimeSymbols.RelativeDateTimeSymbols_en;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_MO =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_MP = relativeDateTimeSymbols.RelativeDateTimeSymbols_en;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_MS =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_MT =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_MU =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_MW =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_MY =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_NA =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_NF =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_NG =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_NL =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_NR =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_NU =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_NZ =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_PG =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_PH =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_PK =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_PN =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_PR = relativeDateTimeSymbols.RelativeDateTimeSymbols_en;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_PW =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_RW =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_SB =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_SC =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_SD =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_SE =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_SH =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_SI =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_SL =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_SS =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_SX =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_SZ =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_TC =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_TK =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_TO =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_TT =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_TV =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_TZ =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_UG =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_UM = relativeDateTimeSymbols.RelativeDateTimeSymbols_en;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_US_POSIX = relativeDateTimeSymbols.RelativeDateTimeSymbols_en;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_VC =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_VG =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_VI = relativeDateTimeSymbols.RelativeDateTimeSymbols_en;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_VU =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_WS =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_XA =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'[ýéšţéŕðåý one two]','0':'[ţöðåý one]','1':'[ţöɱöŕŕöŵ one]'},\n      P:'one{[# ðåý åĝö one]}other{[# ðåýš åĝö one two]}',\n      F:'one{[îñ # ðåý one]}other{[îñ # ðåýš one]}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'[ţĥîš ĥöûŕ one two]'},\n      P:'one{[# ĥöûŕ åĝö one two]}other{[# ĥöûŕš åĝö one two]}',\n      F:'one{[îñ # ĥöûŕ one]}other{[îñ # ĥöûŕš one two]}',\n    },\n    SHORT:{\n      R:{'0':'[ţĥîš ĥöûŕ one two]'},\n      P:'one{[# ĥŕ· åĝö one]}other{[# ĥŕ· åĝö one]}',\n      F:'one{[îñ # ĥŕ· one]}other{[îñ # ĥŕ· one]}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'[ţĥîš ɱîñûţé one two]'},\n      P:'one{[# ɱîñûţé åĝö one two]}other{[# ɱîñûţéš åĝö one two]}',\n      F:'one{[îñ # ɱîñûţé one two]}other{[îñ # ɱîñûţéš one two]}',\n    },\n    SHORT:{\n      R:{'0':'[ţĥîš ɱîñûţé one two]'},\n      P:'one{[# ɱîñ· åĝö one two]}other{[# ɱîñ· åĝö one two]}',\n      F:'one{[îñ # ɱîñ· one]}other{[îñ # ɱîñ· one]}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'[ļåšţ ɱöñţĥ one two]','0':'[ţĥîš ɱöñţĥ one two]','1':'[ñéẋţ ɱöñţĥ one two]'},\n      P:'one{[# ɱöñţĥ åĝö one two]}other{[# ɱöñţĥš åĝö one two]}',\n      F:'one{[îñ # ɱöñţĥ one two]}other{[îñ # ɱöñţĥš one two]}',\n    },\n    SHORT:{\n      R:{'-1':'[ļåšţ ɱö· one]','0':'[ţĥîš ɱö· one]','1':'[ñéẋţ ɱö· one]'},\n      P:'one{[# ɱö· åĝö one]}other{[# ɱö· åĝö one]}',\n      F:'one{[îñ # ɱö· one]}other{[îñ # ɱö· one]}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'[ļåšţ ǫûåŕţéŕ one two]','0':'[ţĥîš ǫûåŕţéŕ one two]','1':'[ñéẋţ ǫûåŕţéŕ one two]'},\n      P:'one{[# ǫûåŕţéŕ åĝö one two]}other{[# ǫûåŕţéŕš åĝö one two]}',\n      F:'one{[îñ # ǫûåŕţéŕ one two]}other{[îñ # ǫûåŕţéŕš one two]}',\n    },\n    SHORT:{\n      R:{'-1':'[ļåšţ ǫţŕ· one two]','0':'[ţĥîš ǫţŕ· one two]','1':'[ñéẋţ ǫţŕ· one two]'},\n      P:'one{[# ǫţŕ· åĝö one two]}other{[# ǫţŕš· åĝö one two]}',\n      F:'one{[îñ # ǫţŕ· one]}other{[îñ # ǫţŕš· one two]}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'[ñöŵ one]'},\n      P:'one{[# šéçöñð åĝö one two]}other{[# šéçöñðš åĝö one two]}',\n      F:'one{[îñ # šéçöñð one two]}other{[îñ # šéçöñðš one two]}',\n    },\n    SHORT:{\n      R:{'0':'[ñöŵ one]'},\n      P:'one{[# šéç· åĝö one two]}other{[# šéç· åĝö one two]}',\n      F:'one{[îñ # šéç· one]}other{[îñ # šéç· one]}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'[ļåšţ ŵééķ one two]','0':'[ţĥîš ŵééķ one two]','1':'[ñéẋţ ŵééķ one two]'},\n      P:'one{[# ŵééķ åĝö one two]}other{[# ŵééķš åĝö one two]}',\n      F:'one{[îñ # ŵééķ one]}other{[îñ # ŵééķš one two]}',\n    },\n    SHORT:{\n      R:{'-1':'[ļåšţ ŵķ· one]','0':'[ţĥîš ŵķ· one]','1':'[ñéẋţ ŵķ· one]'},\n      P:'one{[# ŵķ· åĝö one]}other{[# ŵķ· åĝö one]}',\n      F:'one{[îñ # ŵķ· one]}other{[îñ # ŵķ· one]}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'[ļåšţ ýéåŕ one two]','0':'[ţĥîš ýéåŕ one two]','1':'[ñéẋţ ýéåŕ one two]'},\n      P:'one{[# ýéåŕ åĝö one two]}other{[# ýéåŕš åĝö one two]}',\n      F:'one{[îñ # ýéåŕ one]}other{[îñ # ýéåŕš one two]}',\n    },\n    SHORT:{\n      R:{'-1':'[ļåšţ ýŕ· one]','0':'[ţĥîš ýŕ· one]','1':'[ñéẋţ ýŕ· one]'},\n      P:'one{[# ýŕ· åĝö one]}other{[# ýŕ· åĝö one]}',\n      F:'one{[îñ # ýŕ· one]}other{[îñ # ýŕ· one]}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_ZM =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_ZW =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_eo =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_eo_001 = exports.RelativeDateTimeSymbols_eo;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_AR =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # días}other{hace # días}',\n      F:'one{dentro de # días}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # seg.}other{hace # seg.}',\n      F:'one{dentro de # seg.}other{dentro de # seg.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_BO =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_BR =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_BZ =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_CL =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_CO =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_CR =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_CU =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_DO =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_EA = relativeDateTimeSymbols.RelativeDateTimeSymbols_es;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_EC =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_GQ = relativeDateTimeSymbols.RelativeDateTimeSymbols_es;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_GT =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_HN =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_IC = relativeDateTimeSymbols.RelativeDateTimeSymbols_es;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_NI =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_PA =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_PE =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_PH = relativeDateTimeSymbols.RelativeDateTimeSymbols_es;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_PR =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_PY =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # seg.}other{hace # seg.}',\n      F:'one{dentro de # seg.}other{dentro de # seg.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_SV =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','-2':'antier','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_UY =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_VE =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_et_EE = relativeDateTimeSymbols.RelativeDateTimeSymbols_et;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_eu_ES = relativeDateTimeSymbols.RelativeDateTimeSymbols_eu;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ewo =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Angogé','0':'Aná','1':'Okírí'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ewo_CM = exports.RelativeDateTimeSymbols_ewo;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fa_AF = relativeDateTimeSymbols.RelativeDateTimeSymbols_fa;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fa_IR = relativeDateTimeSymbols.RelativeDateTimeSymbols_fa;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ff =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Haŋki','0':'Hannde','1':'Jaŋngo'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ff_Latn = exports.RelativeDateTimeSymbols_ff;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ff_Latn_BF = exports.RelativeDateTimeSymbols_ff;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ff_Latn_CM = exports.RelativeDateTimeSymbols_ff;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ff_Latn_GH = exports.RelativeDateTimeSymbols_ff;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ff_Latn_GM = exports.RelativeDateTimeSymbols_ff;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ff_Latn_GN = exports.RelativeDateTimeSymbols_ff;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ff_Latn_GW = exports.RelativeDateTimeSymbols_ff;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ff_Latn_LR = exports.RelativeDateTimeSymbols_ff;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ff_Latn_MR = exports.RelativeDateTimeSymbols_ff;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ff_Latn_NE = exports.RelativeDateTimeSymbols_ff;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ff_Latn_NG = exports.RelativeDateTimeSymbols_ff;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ff_Latn_SL = exports.RelativeDateTimeSymbols_ff;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ff_Latn_SN = exports.RelativeDateTimeSymbols_ff;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fi_FI = relativeDateTimeSymbols.RelativeDateTimeSymbols_fi;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fil_PH = relativeDateTimeSymbols.RelativeDateTimeSymbols_fil;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fo =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'í gjár','-2':'fyrradagin','0':'í dag','1':'í morgin','2':'í ovurmorgin'},\n      P:'one{# dagur síðan}other{# dagar síðan}',\n      F:'one{um # dag}other{um # dagar}',\n    },\n    SHORT:{\n      R:{'-1':'í gjár','-2':'fyrradagin','0':'í dag','1':'í morgin','2':'í ovurmorgin'},\n      P:'one{# da. síðan}other{# da. síðan}',\n      F:'one{um # da.}other{um # da.}',\n    },\n    NARROW:{\n      R:{'-1':'í gjár','-2':'fyrradagin','0':'í dag','1':'í morgin','2':'í ovurmorgin'},\n      P:'one{# d. síðan}other{# d. síðan}',\n      F:'one{um # d.}other{um # d.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'hendan tíman'},\n      P:'one{# tími síðan}other{# tímar síðan}',\n      F:'one{um # tíma}other{um # tímar}',\n    },\n    SHORT:{\n      R:{'0':'hendan tíman'},\n      P:'one{# t. síðan}other{# t. síðan}',\n      F:'one{um # t.}other{um # t.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'hendan minuttin'},\n      P:'one{# minutt síðan}other{# minuttir síðan}',\n      F:'one{um # minutt}other{um # minuttir}',\n    },\n    SHORT:{\n      R:{'0':'hendan minuttin'},\n      P:'one{# min. síðan}other{# min. síðan}',\n      F:'one{um # min.}other{um # min.}',\n    },\n    NARROW:{\n      R:{'0':'hendan minuttin'},\n      P:'one{# m. síðan}other{# m. síðan}',\n      F:'one{um # m.}other{um # m.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'seinasta mánað','0':'henda mánaðin','1':'næsta mánað'},\n      P:'one{# mánað síðan}other{# mánaðir síðan}',\n      F:'one{um # mánað}other{um # mánaðir}',\n    },\n    SHORT:{\n      R:{'-1':'seinasta mánað','0':'henda mánaðin','1':'næsta mánað'},\n      P:'one{# mnð. síðan}other{# mnð. síðan}',\n      F:'one{um # mnð.}other{um # mnð.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'seinasta ársfjórðing','0':'hendan ársfjórðingin','1':'næsta ársfjórðing'},\n      P:'one{# ársfjórðing síðan}other{# ársfjórðingar síðan}',\n      F:'one{um # ársfjórðing}other{um # ársfjórðingar}',\n    },\n    SHORT:{\n      R:{'-1':'seinasta ársfjórðing','0':'hendan ársfjórðingin','1':'næsta ársfjórðing'},\n      P:'one{# ársfj. síðan}other{# ársfj. síðan}',\n      F:'one{um # ársfj.}other{um # ársfj.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'nú'},\n      P:'one{# sekund síðan}other{# sekund síðan}',\n      F:'one{um # sekund}other{um # sekund}',\n    },\n    SHORT:{\n      R:{'0':'nú'},\n      P:'one{# sek. síðan}other{# sek. síðan}',\n      F:'one{um # sek.}other{um # sek.}',\n    },\n    NARROW:{\n      R:{'0':'nú'},\n      P:'one{# s. síðan}other{# s. síðan}',\n      F:'one{um # s.}other{um # s.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'seinastu viku','0':'hesu viku','1':'næstu viku'},\n      P:'one{# vika síðan}other{# vikur síðan}',\n      F:'one{um # viku}other{um # vikur}',\n    },\n    SHORT:{\n      R:{'-1':'seinastu viku','0':'hesu viku','1':'næstu viku'},\n      P:'one{# vi. síðan}other{# vi. síðan}',\n      F:'one{um # vi.}other{um # vi.}',\n    },\n    NARROW:{\n      R:{'-1':'seinastu viku','0':'hesu viku','1':'næstu viku'},\n      P:'one{# v. síðan}other{# v. síðan}',\n      F:'one{um # v.}other{um # v.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'í fjør','0':'í ár','1':'næsta ár'},\n      P:'one{# ár síðan}other{# ár síðan}',\n      F:'one{um # ár}other{um # ár}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fo_DK = exports.RelativeDateTimeSymbols_fo;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fo_FO = exports.RelativeDateTimeSymbols_fo;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_BE = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_BF = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_BI = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_BJ = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_BL = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_CD = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_CF = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_CG = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_CH = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_CI = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_CM = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_DJ = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_DZ = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_FR = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_GA = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_GF = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_GN = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_GP = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_GQ = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_HT = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_KM = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_LU = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_MA = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_MC = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_MF = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_MG = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_ML = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_MQ = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_MR = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_MU = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_NC = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_NE = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_PF = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_PM = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_RE = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_RW = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_SC = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_SN = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_SY = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_TD = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_TG = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_TN = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_VU = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_WF = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_YT = relativeDateTimeSymbols.RelativeDateTimeSymbols_fr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fur =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'îr','-2':'îr l’altri','0':'vuê','1':'doman','2':'passantdoman'},\n      P:'one{# zornade indaûr}other{# zornadis indaûr}',\n      F:'one{ca di # zornade}other{ca di # zornadis}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# ore indaûr}other{# oris indaûr}',\n      F:'one{ca di # ore}other{ca di # oris}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minût indaûr}other{# minûts indaûr}',\n      F:'one{ca di # minût}other{ca di # minûts}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# mês indaûr}other{# mês indaûr}',\n      F:'one{ca di # mês}other{ca di # mês}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# secont indaûr}other{# seconts indaûr}',\n      F:'one{ca di # secont}other{ca di # seconts}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# setemane indaûr}other{# setemanis indaûr}',\n      F:'one{ca di # setemane}other{ca di # setemanis}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# an indaûr}other{# agns indaûr}',\n      F:'one{ca di # an}other{ca di # agns}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fur_IT = exports.RelativeDateTimeSymbols_fur;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fy =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'gisteren','-2':'eergisteren','0':'vandaag','1':'morgen','2':'Oermorgen'},\n      P:'one{# dei lyn}other{# deien lyn}',\n      F:'one{Oer # dei}other{Oer # deien}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# oere lyn}other{# oere lyn}',\n      F:'one{Oer # oere}other{Oer # oere}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minút lyn}other{# minuten lyn}',\n      F:'one{Oer # minút}other{Oer # minuten}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'foarige moanne','0':'dizze moanne','1':'folgjende moanne'},\n      P:'one{# moanne lyn}other{# moannen lyn}',\n      F:'one{Oer # moanne}other{Oer # moannen}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'nu'},\n      P:'one{# sekonde lyn}other{# sekonden lyn}',\n      F:'one{Oer # sekonde}other{Oer # sekonden}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'foarige wike','0':'dizze wike','1':'folgjende wike'},\n      P:'one{# wike lyn}other{# wiken lyn}',\n      F:'one{Oer # wike}other{Oer # wiken}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'foarich jier','0':'dit jier','1':'folgjend jier'},\n      P:'one{# jier lyn}other{# jier lyn}',\n      F:'one{Oer # jier}other{Oer # jier}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fy_NL = exports.RelativeDateTimeSymbols_fy;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ga_IE = relativeDateTimeSymbols.RelativeDateTimeSymbols_ga;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_gd =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'an-dè','-2':'a-bhòin-dè','0':'an-diugh','1':'a-màireach','2':'an-earar','3':'an-eararais'},\n      P:'few{# làithean air ais}one{# latha air ais}other{# latha air ais}two{# latha air ais}',\n      F:'few{an ceann # làithean}one{an ceann # latha}other{an ceann # latha}two{an ceann # latha}',\n    },\n    SHORT:{\n      R:{'-1':'an-dè','-2':'a-bhòin-dè','0':'an-diugh','1':'a-màireach','2':'an-earar','3':'an-eararais'},\n      P:'few{o # là.}one{o # là}other{o # là}two{o # là}',\n      F:'few{an # là.}one{an # là}other{an # là}two{an # là}',\n    },\n    NARROW:{\n      R:{'-1':'an-dè','-2':'a-bhòin-dè','0':'an-diugh','1':'a-màireach','2':'an-earar','3':'an-eararais'},\n      P:'few{-# là}one{-# là}other{-# là}two{-# là}',\n      F:'few{+# là}one{+# là}other{+# là}two{+# là}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'am broinn uair a thìde'},\n      P:'few{# uairean a thìde air ais}one{# uair a thìde air ais}other{# uair a thìde air ais}two{# uair a thìde air ais}',\n      F:'few{an ceann # uairean a thìde}one{an ceann # uair a thìde}other{an ceann # uair a thìde}two{an ceann # uair a thìde}',\n    },\n    SHORT:{\n      R:{'0':'am broinn uair'},\n      P:'few{o # uair.}one{o # uair}other{o # uair}two{o # uair}',\n      F:'few{an # uair.}one{an # uair}other{an # uair}two{an # uair}',\n    },\n    NARROW:{\n      R:{'0':'san uair'},\n      P:'few{-# u.}one{-# u.}other{-# u.}two{-# u.}',\n      F:'few{+# u.}one{+# u.}other{+# u.}two{+# u.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'am broinn mionaid'},\n      P:'few{# mionaidean air ais}one{# mhionaid air ais}other{# mionaid air ais}two{# mhionaid air ais}',\n      F:'few{an ceann # mionaidean}one{an ceann # mhionaid}other{an ceann # mionaid}two{an ceann # mhionaid}',\n    },\n    SHORT:{\n      R:{'0':'am broinn mion.'},\n      P:'few{o # mion.}one{o # mhion.}other{o # mion.}two{o # mhion.}',\n      F:'few{an # mion.}one{an # mhion.}other{an # mion.}two{an # mhion.}',\n    },\n    NARROW:{\n      R:{'0':'sa mhion.'},\n      P:'few{-# m}one{-# m}other{-# m}two{-# m}',\n      F:'few{+# m}one{+# m}other{+# m}two{+# m}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'am mìos seo chaidh','0':'am mìos seo','1':'an ath-mhìos'},\n      P:'few{# mìosan air ais}one{# mhìos air ais}other{# mìos air ais}two{# mhìos air ais}',\n      F:'few{an ceann # mìosan}one{an ceann # mhìosa}other{an ceann # mìosa}two{an ceann # mhìosa}',\n    },\n    SHORT:{\n      R:{'-1':'am mìos sa chaidh','0':'am mìos seo','1':'an ath-mhìos'},\n      P:'few{o # mìos.}one{o # mhìos.}other{o # mìos.}two{o # mhìos.}',\n      F:'few{an # mìos.}one{an # mhìos.}other{an # mìos.}two{an # mhìos.}',\n    },\n    NARROW:{\n      R:{'-1':'mì. ch.','0':'am mì. seo','1':'ath-mhì.'},\n      P:'few{-# mì.}one{-# mhì.}other{-# mì.}two{-# mhì.}',\n      F:'few{+# mì.}one{+# mhì.}other{+# mì.}two{+# mhì.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'an cairteal seo chaidh','0':'an cairteal seo','1':'an ath-chairteal'},\n      P:'few{o chionn # cairtealan}one{o chionn # chairteil}other{o chionn # cairteil}two{o chionn # chairteil}',\n      F:'few{an ceann # cairtealan}one{an ceann # chairteil}other{an ceann # cairteil}two{an ceann # chairteil}',\n    },\n    SHORT:{\n      R:{'-1':'an cairt. sa chaidh','0':'an cairt. seo','1':'an ath-chairt.'},\n      P:'few{o # cairt.}one{o # chairt.}other{o # cairt.}two{o # chairt.}',\n      F:'few{an # cairt.}one{an # chairt.}other{an # cairt.}two{an # chairt.}',\n    },\n    NARROW:{\n      R:{'-1':'c. ch.','0':'an c. seo','1':'ath-ch.'},\n      P:'few{-# c.}one{-# c.}other{-# c.}two{-# c.}',\n      F:'few{+# c.}one{+# c.}other{+# c.}two{+# c.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'an-dràsta'},\n      P:'few{# diogan air ais}one{# diog air ais}other{# diog air ais}two{# dhiog air ais}',\n      F:'few{an ceann # diogan}one{an ceann # diog}other{an ceann # diog}two{an ceann # dhiog}',\n    },\n    SHORT:{\n      R:{'0':'an-dràsta'},\n      P:'few{o # diog.}one{o # diog}other{o # diog}two{o # dhiog}',\n      F:'few{an # diog.}one{an # diog}other{an # diog}two{an # dhiog}',\n    },\n    NARROW:{\n      R:{'0':'an-dràsta'},\n      P:'few{-# d}one{-# d}other{-# d}two{-# d}',\n      F:'few{+# d}one{+# d}other{+# d}two{+# d}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'an t-seachdain seo chaidh','0':'an t-seachdain seo','1':'an ath-sheachdain'},\n      P:'few{# seachdainean air ais}one{# seachdain air ais}other{# seachdain air ais}two{# sheachdain air ais}',\n      F:'few{an ceann # seachdainean}one{an ceann # seachdain}other{an ceann # seachdain}two{an ceann # sheachdain}',\n    },\n    SHORT:{\n      R:{'-1':'seachd. sa chaidh','0':'an t-seachd. seo','1':'an ath-sheachd.'},\n      P:'few{o # seachd.}one{o # sheachd.}other{o # seachd.}two{o # sheachd.}',\n      F:'few{an # seachd.}one{an # sheachd.}other{an # seachd.}two{an # sheachd.}',\n    },\n    NARROW:{\n      R:{'-1':'sn. ch.','0':'an t-sn. seo','1':'ath-shn.'},\n      P:'few{-# sn.}one{-# sn.}other{-# sn.}two{-# sn.}',\n      F:'few{+# sn.}one{+# sn.}other{+# sn.}two{+# sn.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'an-uiridh','-2':'a-bhòn-uiridh','0':'am bliadhna','1':'an ath-bhliadhna'},\n      P:'few{# bhliadhnaichean air ais}one{# bhliadhna air ais}other{# bliadhna air ais}two{# bhliadhna air ais}',\n      F:'few{an ceann # bliadhnaichean}one{an ceann # bhliadhna}other{an ceann # bliadhna}two{an ceann # bhliadhna}',\n    },\n    SHORT:{\n      R:{'-1':'an-uiridh','-2':'a-bhòn-uiridh','0':'am bliadhna','1':'an ath-bhliadhna'},\n      P:'few{o # blia.}one{o # bhlia.}other{o # blia.}two{o # bhlia.}',\n      F:'few{an # blia.}one{an # bhlia.}other{an # blia.}two{an # bhlia.}',\n    },\n    NARROW:{\n      R:{'-1':'an-uir.','-2':'a-bh-uir.','0':'am bl.','1':'an ath-bhl.'},\n      P:'few{-# bl.}one{-# bhl.}other{-# bl.}two{-# bhl.}',\n      F:'few{+# bl.}one{+# bhl.}other{+# bl.}two{+# bhl.}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_gd_GB = exports.RelativeDateTimeSymbols_gd;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_gl_ES = relativeDateTimeSymbols.RelativeDateTimeSymbols_gl;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_gsw_CH = relativeDateTimeSymbols.RelativeDateTimeSymbols_gsw;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_gsw_FR = relativeDateTimeSymbols.RelativeDateTimeSymbols_gsw;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_gsw_LI = relativeDateTimeSymbols.RelativeDateTimeSymbols_gsw;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_gu_IN = relativeDateTimeSymbols.RelativeDateTimeSymbols_gu;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_guz =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Igoro','0':'Rero','1':'Mambia'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_guz_KE = exports.RelativeDateTimeSymbols_guz;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_gv =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_gv_IM = exports.RelativeDateTimeSymbols_gv;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ha =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Jiya','0':'Yau','1':'Gobe'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ha_GH = exports.RelativeDateTimeSymbols_ha;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ha_NE = exports.RelativeDateTimeSymbols_ha;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ha_NG = exports.RelativeDateTimeSymbols_ha;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_haw_US = relativeDateTimeSymbols.RelativeDateTimeSymbols_haw;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_he_IL = relativeDateTimeSymbols.RelativeDateTimeSymbols_he;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_hi_IN = relativeDateTimeSymbols.RelativeDateTimeSymbols_hi;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_hr_BA = relativeDateTimeSymbols.RelativeDateTimeSymbols_hr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_hr_HR = relativeDateTimeSymbols.RelativeDateTimeSymbols_hr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_hsb =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'wčera','0':'dźensa','1':'jutře'},\n      P:'few{před # dnjemi}one{před # dnjom}other{před # dnjemi}two{před # dnjomaj}',\n      F:'few{za # dny}one{za # dźeń}other{za # dnjow}two{za # dnjej}',\n    },\n    SHORT:{\n      R:{'-1':'wčera','0':'dźensa','1':'jutře'},\n      P:'few{před # dnj.}one{před # dnj.}other{před # dnj.}two{před # dnj.}',\n      F:'few{za # dny}one{za # dźeń}other{za # dnj.}two{za # dnj.}',\n    },\n    NARROW:{\n      R:{'-1':'wčera','0':'dźensa','1':'jutře'},\n      P:'few{před # d}one{před # d}other{před # d}two{před # d}',\n      F:'few{za # d}one{za # d}other{za # d}two{za # d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'few{před # hodźinami}one{před # hodźinu}other{před # hodźinami}two{před # hodźinomaj}',\n      F:'few{za # hodźiny}one{za # hodźinu}other{za # hodźin}two{za # hodźinje}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'few{před # hodź.}one{před # hodź.}other{před # hodź.}two{před # hodź.}',\n      F:'few{za # hodź.}one{za # hodź.}other{za # hodź.}two{za # hodź.}',\n    },\n    NARROW:{\n      R:{'0':'this hour'},\n      P:'few{před # h}one{před # h}other{před # h}two{před # h}',\n      F:'few{za # h}one{za # h}other{za # h}two{za # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'few{před # minutami}one{před # minutu}other{před # minutami}two{před # minutomaj}',\n      F:'few{za # minuty}one{za # minutu}other{za # minutow}two{za # minuće}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'few{před # min.}one{před # min.}other{před # min.}two{před # min.}',\n      F:'few{za # min.}one{za # min.}other{za # min.}two{za # min.}',\n    },\n    NARROW:{\n      R:{'0':'this minute'},\n      P:'few{před # m}one{před # m}other{před # m}two{před # m}',\n      F:'few{za # m}one{za # m}other{za # m}two{za # m}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'zašły měsac','0':'tutón měsac','1':'přichodny měsac'},\n      P:'few{před # měsacami}one{před # měsacom}other{před # měsacami}two{před # měsacomaj}',\n      F:'few{za # měsacy}one{za # měsac}other{za # měsacow}two{za # měsacaj}',\n    },\n    SHORT:{\n      R:{'-1':'zašły měsac','0':'tutón měsac','1':'přichodny měsac'},\n      P:'few{před # měs.}one{před # měs.}other{před # měs.}two{před # měs.}',\n      F:'few{za # měs.}one{za # měs.}other{za # měs.}two{za # měs.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'few{před # kwartalemi}one{před # kwartalom}other{před # kwartalemi}two{před # kwartalomaj}',\n      F:'few{za # kwartale}one{za # kwartal}other{za # kwartalow}two{za # kwartalej}',\n    },\n    SHORT:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'few{před # kwart.}one{před # kwart.}other{před # kwart.}two{před # kwart.}',\n      F:'few{za # kwart.}one{za # kwart.}other{za # kwart.}two{za # kwart.}',\n    },\n    NARROW:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'few{před # kw.}one{před # kw.}other{před # kw.}two{před # kw.}',\n      F:'few{za # kw.}one{za # kw.}other{za # kw.}two{za # kw.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'few{před # sekundami}one{před # sekundu}other{před # sekundami}two{před # sekundomaj}',\n      F:'few{za # sekundy}one{za # sekundu}other{za # sekundow}two{za # sekundźe}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'few{před # sek.}one{před # sek.}other{před # sek.}two{před # sek.}',\n      F:'few{za # sek.}one{za # sek.}other{za # sek.}two{za # sek.}',\n    },\n    NARROW:{\n      R:{'0':'now'},\n      P:'few{před # s}one{před # s}other{před # s}two{před # s}',\n      F:'few{za # s}one{za # s}other{za # s}two{za # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'zašły tydźeń','0':'tutón tydźeń','1':'přichodny tydźeń'},\n      P:'few{před # tydźenjemi}one{před # tydźenjom}other{před # tydźenjemi}two{před # tydźenjomaj}',\n      F:'few{za # tydźenje}one{za # tydźeń}other{za # tydźenjow}two{za # tydźenjej}',\n    },\n    SHORT:{\n      R:{'-1':'zašły tydźeń','0':'tutón tydźeń','1':'přichodny tydźeń'},\n      P:'few{před # tydź.}one{před # tydź.}other{před # tydź.}two{před # tydź.}',\n      F:'few{za # tydź.}one{za # tydź.}other{za # tydź.}two{za # tydź.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'loni','0':'lětsa','1':'klětu'},\n      P:'few{před # lětami}one{před # lětom}other{před # lětami}two{před # lětomaj}',\n      F:'few{za # lěta}one{za # lěto}other{za # lět}two{za # lěće}',\n    },\n    SHORT:{\n      R:{'-1':'loni','0':'lětsa','1':'klětu'},\n      P:'few{před # l.}one{před # l.}other{před # l.}two{před # l.}',\n      F:'few{za # l.}one{za # l.}other{za # l.}two{za # l.}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_hsb_DE = exports.RelativeDateTimeSymbols_hsb;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_hu_HU = relativeDateTimeSymbols.RelativeDateTimeSymbols_hu;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_hy_AM = relativeDateTimeSymbols.RelativeDateTimeSymbols_hy;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ia =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'heri','0':'hodie','1':'deman'},\n      P:'one{# dies retro}other{# dies retro}',\n      F:'one{in # dies}other{in # dies}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'iste hora'},\n      P:'one{# horas retro}other{# horas retro}',\n      F:'one{in # horas}other{in # horas}',\n    },\n    SHORT:{\n      R:{'0':'iste hora'},\n      P:'one{# horas retro}other{# hr. retro}',\n      F:'one{in # horas}other{in # hr.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'iste minuta'},\n      P:'one{# minutas retro}other{# minutas retro}',\n      F:'one{in # minutas}other{in # minutas}',\n    },\n    SHORT:{\n      R:{'0':'iste minuta'},\n      P:'one{# minutas retro}other{# min. retro}',\n      F:'one{in # minutas}other{in # min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'le mense passate','0':'iste mense','1':'le mense proxime'},\n      P:'one{# menses retro}other{# menses retro}',\n      F:'one{in # menses}other{in # menses}',\n    },\n    SHORT:{\n      R:{'-1':'le mense passate','0':'iste mense','1':'le mense proxime'},\n      P:'one{# menses retro}other{# mns. retro}',\n      F:'one{in # menses}other{in # mns.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'le trimestre passate','0':'iste trimestre','1':'le trimestre proxime'},\n      P:'one{in # trimestres}other{in # trimestres}',\n      F:'one{in # trimestres}other{in # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'le trimestre passate','0':'iste trimestre','1':'le trimestre proxime'},\n      P:'one{in # trimestres}other{# trim. retro}',\n      F:'one{in # trimestres}other{in # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ora'},\n      P:'one{# secundas retro}other{# secundas retro}',\n      F:'one{in # secundas}other{in # secundas}',\n    },\n    SHORT:{\n      R:{'0':'ora'},\n      P:'one{# secundas retro}other{# sec. retro}',\n      F:'one{in # secundas}other{in # sec.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'le septimana passate','0':'iste septimana','1':'le septimana proxime'},\n      P:'one{# septimanas retro}other{# septimanas retro}',\n      F:'one{in # septimanas}other{in # septimanas}',\n    },\n    SHORT:{\n      R:{'-1':'le septimana passate','0':'iste septimana','1':'le septimana proxime'},\n      P:'one{# septimanas retro}other{# sept. retro}',\n      F:'one{in # septimanas}other{in # sept.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'le anno passate','0':'iste anno','1':'le anno proxime'},\n      P:'one{# annos retro}other{# annos retro}',\n      F:'one{in # annos}other{in # annos}',\n    },\n    SHORT:{\n      R:{'-1':'le anno passate','0':'iste anno','1':'le anno proxime'},\n      P:'one{# annos retro}other{# an. retro}',\n      F:'one{in # annos}other{in # an.}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ia_001 = exports.RelativeDateTimeSymbols_ia;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_id_ID = relativeDateTimeSymbols.RelativeDateTimeSymbols_id;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ig =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ụnyaahụ','0':'Taa','1':'Echi'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n    SHORT:{\n      R:{'-1':'Nnyaafụ','0':'Taata','1':'Echi'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ig_NG = exports.RelativeDateTimeSymbols_ig;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ii =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ꀋꅔꉈ','-2':'ꎴꂿꋍꑍ','0':'ꀃꑍ','1':'ꃆꏂꑍ','2':'ꌕꀿꑍ'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ii_CN = exports.RelativeDateTimeSymbols_ii;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_is_IS = relativeDateTimeSymbols.RelativeDateTimeSymbols_is;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_it_CH = relativeDateTimeSymbols.RelativeDateTimeSymbols_it;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_it_IT = relativeDateTimeSymbols.RelativeDateTimeSymbols_it;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_it_SM = relativeDateTimeSymbols.RelativeDateTimeSymbols_it;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_it_VA = relativeDateTimeSymbols.RelativeDateTimeSymbols_it;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ja_JP = relativeDateTimeSymbols.RelativeDateTimeSymbols_ja;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_jgo =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'lɔꞋɔ','1':'tomorrow'},\n      P:'one{Ɛ́ gɛ́ mɔ́ lɛ́Ꞌ #}other{Ɛ́ gɛ́ mɔ́ lɛ́Ꞌ #}',\n      F:'one{Nǔu lɛ́Ꞌ #}other{Nǔu lɛ́Ꞌ #}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{ɛ́ gɛ mɔ́ # háwa}other{ɛ́ gɛ mɔ́ # háwa}',\n      F:'one{nǔu háwa #}other{nǔu háwa #}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{ɛ́ gɛ́ mɔ́ minút #}other{ɛ́ gɛ́ mɔ́ minút #}',\n      F:'one{nǔu # minút}other{nǔu # minút}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{ɛ́ gɛ́ mɔ́ pɛsaŋ #}other{ɛ́ gɛ́ mɔ́ pɛsaŋ #}',\n      F:'one{Nǔu # saŋ}other{Nǔu # saŋ}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{Ɛ́ gɛ́ mɔ # ŋgap-mbi}other{Ɛ́ gɛ́ mɔ # ŋgap-mbi}',\n      F:'one{Nǔu ŋgap-mbi #}other{Nǔu ŋgap-mbi #}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{Ɛ́gɛ́ mɔ́ ŋguꞋ #}other{Ɛ́gɛ́ mɔ́ ŋguꞋ #}',\n      F:'one{Nǔu ŋguꞋ #}other{Nǔu ŋguꞋ #}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_jgo_CM = exports.RelativeDateTimeSymbols_jgo;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_jmc =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ukou','0':'Inu','1':'Ngama'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_jmc_TZ = exports.RelativeDateTimeSymbols_jmc;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_jv =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'wingi','0':'saiki','1':'sesuk'},\n      P:'other{# dina kepungkur}',\n      F:'other{ing # dina}',\n    },\n    SHORT:{\n      R:{'-1':'wingi','0':'saiki','1':'sesuk'},\n      P:'other{-# d}',\n      F:'other{ing # dina}',\n    },\n    NARROW:{\n      R:{'-1':'wingi','0':'saiki','1':'sesuk'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'jam iki'},\n      P:'other{# jam kepungkur}',\n      F:'other{ing # jam}',\n    },\n    SHORT:{\n      R:{'0':'jam iki'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'menit iki'},\n      P:'other{# men. kepungkur}',\n      F:'other{ing # mnt}',\n    },\n    SHORT:{\n      R:{'0':'menit iki'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'sasi wingi','0':'sasi iki','1':'sasi ngarep'},\n      P:'other{# sasi kepungkur}',\n      F:'other{ing # sasi}',\n    },\n    SHORT:{\n      R:{'-1':'sasi wingi','0':'sasi iki','1':'sasi ngarep'},\n      P:'other{# s. kepungkur}',\n      F:'other{ing # s.}',\n    },\n    NARROW:{\n      R:{'-1':'sasi wingi','0':'sasi iki','1':'sasi ngarep'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'kwartal wingi','0':'kwartal iki','1':'kwartal ngarep'},\n      P:'other{# kwartal kepungkur}',\n      F:'other{ing # kwartal}',\n    },\n    SHORT:{\n      R:{'-1':'kwartal wingi','0':'kwartal iki','1':'kwartal ngarep'},\n      P:'other{# kwrt. kepungkur}',\n      F:'other{ing # kwrt.}',\n    },\n    NARROW:{\n      R:{'-1':'kwartal wingi','0':'kwartal iki','1':'kwartal ngarep'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{# detik kepungkur}',\n      F:'other{ing # detik}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'other{# det. kepungkur}',\n      F:'other{ing # dtk}',\n    },\n    NARROW:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'pekan wingi','0':'pekan iki','1':'pekan ngarep'},\n      P:'other{# minggu kepungkur}',\n      F:'other{ing # minggu}',\n    },\n    SHORT:{\n      R:{'-1':'pekan wingi','0':'pekan iki','1':'pekan ngarep'},\n      P:'other{# mgg. kepungkur}',\n      F:'other{ing # mgg.}',\n    },\n    NARROW:{\n      R:{'-1':'pekan wingi','0':'pekan iki','1':'pekan ngarep'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'taun wingi','0':'taun iki','1':'taun ngarep'},\n      P:'other{# taun kepungkur}',\n      F:'other{ing # taun}',\n    },\n    SHORT:{\n      R:{'-1':'taun wingi','0':'taun iki','1':'taun ngarep'},\n      P:'other{# tn kepungkur}',\n      F:'other{ing # tn}',\n    },\n    NARROW:{\n      R:{'-1':'taun wingi','0':'taun iki','1':'taun ngarep'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_jv_ID = exports.RelativeDateTimeSymbols_jv;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ka_GE = relativeDateTimeSymbols.RelativeDateTimeSymbols_ka;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kab =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Iḍelli','0':'Ass-a','1':'Azekka'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kab_DZ = exports.RelativeDateTimeSymbols_kab;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kam =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ĩyoo','0':'Ũmũnthĩ','1':'Ũnĩ'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kam_KE = exports.RelativeDateTimeSymbols_kam;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kde =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Lido','0':'Nelo','1':'Nundu'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kde_TZ = exports.RelativeDateTimeSymbols_kde;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kea =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'onti','0':'oji','1':'manha'},\n      P:'other{a ten # dia}',\n      F:'other{di li # dia}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{a ten # ora}',\n      F:'other{di li # ora}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{a ten # minutu}',\n      F:'other{di li # minutu}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'other{a ten # min}',\n      F:'other{di li # min}',\n    },\n    NARROW:{\n      R:{'0':'this minute'},\n      P:'other{a ten # m}',\n      F:'other{di li # m}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mes pasadu','0':'es mes li','1':'prósimu mes'},\n      P:'other{a ten # mes}',\n      F:'other{di li # mes}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{a ten # trimestri}',\n      F:'other{di li # trimestri}',\n    },\n    SHORT:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{a ten # trim.}',\n      F:'other{di li # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{a ten # sigundu}',\n      F:'other{di li # sigundu}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'other{a ten # sig}',\n      F:'other{di li # sig}',\n    },\n    NARROW:{\n      R:{'0':'now'},\n      P:'other{a ten # s}',\n      F:'other{di li # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'simana pasadu','0':'es simana li','1':'prósimu simana'},\n      P:'other{a ten # simana}',\n      F:'other{di li # simana}',\n    },\n    SHORT:{\n      R:{'-1':'simana pasadu','0':'es simana li','1':'prósimu simana'},\n      P:'other{a ten # sim.}',\n      F:'other{di li # sim.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'anu pasadu','0':'es anu li','1':'prósimu anu'},\n      P:'other{a ten # anu}',\n      F:'other{di li # anu}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kea_CV = exports.RelativeDateTimeSymbols_kea;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_khq =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Bi','0':'Hõo','1':'Suba'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_khq_ML = exports.RelativeDateTimeSymbols_khq;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ki =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ira','0':'Ũmũthĩ','1':'Rũciũ'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ki_KE = exports.RelativeDateTimeSymbols_ki;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kk_KZ = relativeDateTimeSymbols.RelativeDateTimeSymbols_kk;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kkj =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'kwey','0':'muka','1':'nɛmɛnɔ'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kkj_CM = exports.RelativeDateTimeSymbols_kkj;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kl =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{for # ulloq unnuarlu siden}other{for # ulloq unnuarlu siden}',\n      F:'one{om # ulloq unnuarlu}other{om # ulloq unnuarlu}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{for # nalunaaquttap-akunnera siden}other{for # nalunaaquttap-akunnera siden}',\n      F:'one{om # nalunaaquttap-akunnera}other{om # nalunaaquttap-akunnera}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{for # minutsi siden}other{for # minutsi siden}',\n      F:'one{om # minutsi}other{om # minutsi}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{for # qaammat siden}other{for # qaammat siden}',\n      F:'one{om # qaammat}other{om # qaammat}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{for # sekundi siden}other{for # sekundi siden}',\n      F:'one{om # sekundi}other{om # sekundi}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{for # sapaatip-akunnera siden}other{for # sapaatip-akunnera siden}',\n      F:'one{om # sapaatip-akunnera}other{om # sapaatip-akunnera}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{for # ukioq siden}other{for # ukioq siden}',\n      F:'one{om # ukioq}other{om # ukioq}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kl_GL = exports.RelativeDateTimeSymbols_kl;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kln =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Amut','0':'Raini','1':'Mutai'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kln_KE = exports.RelativeDateTimeSymbols_kln;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_km_KH = relativeDateTimeSymbols.RelativeDateTimeSymbols_km;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kn_IN = relativeDateTimeSymbols.RelativeDateTimeSymbols_kn;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ko_KP = relativeDateTimeSymbols.RelativeDateTimeSymbols_ko;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ko_KR = relativeDateTimeSymbols.RelativeDateTimeSymbols_ko;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kok =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'काल','0':'आयज','1':'फाल्यां'},\n      P:'other{# दीस आदीं}',\n      F:'other{# दिसानीं}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'हें वर'},\n      P:'other{# वरा आदीं}',\n      F:'other{# वरांनीं}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'हें मिनीट'},\n      P:'other{# मिन्टां आदीं}',\n      F:'other{# मिन्टां}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'फाटलो म्हयनो','0':'हो म्हयनो','1':'फुडलो म्हयनो'},\n      P:'other{# म्हयन्यां आदीं}',\n      F:'other{# म्हयन्यानीं}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'फाटलो त्रैमासीक','0':'हो त्रैमासीक','1':'फुडलो त्रैमासीक'},\n      P:'other{# त्रैमासीकां आदीं}',\n      F:'other{# त्रैमासीकांत}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'आतां'},\n      P:'other{# सेकंद आदीं}',\n      F:'other{# सेकंदानीं}',\n    },\n    SHORT:{\n      R:{'0':'आतां'},\n      P:'other{# से. आदीं}',\n      F:'other{# सेकंदानीं}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'निमाणो सप्तक','0':'हो सप्तक','1':'फुडलो सप्तक'},\n      P:'other{# सप्तकां आदीं}',\n      F:'other{# सप्तकांनीं}',\n    },\n    SHORT:{\n      R:{'-1':'निमाणो सप्तक','0':'हो सप्तक','1':'फुडलो सप्तक'},\n      P:'other{# सप्तकां आदीं}',\n      F:'other{# सप्त.}',\n    },\n    NARROW:{\n      R:{'-1':'निमाणो सप्तक','0':'हो सप्तक','1':'फुडलो सप्तक'},\n      P:'other{# सप्त. आदीं}',\n      F:'other{# सप्तकांनीं}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'फाटलें वर्स','0':'हें वर्स','1':'फुडलें वर्स'},\n      P:'other{# वर्सां आदीं}',\n      F:'other{# वर्सांनीं}',\n    },\n    SHORT:{\n      R:{'-1':'फाटलें वर्स','0':'हें वर्स','1':'फुडलें वर्स'},\n      P:'other{# वर्स आदीं}',\n      F:'other{# वर्सांनीं}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kok_IN = exports.RelativeDateTimeSymbols_kok;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ks =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'راتھ','0':'اَز','1':'پگاہ'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ks_IN = exports.RelativeDateTimeSymbols_ks;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ksb =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ghuo','0':'Evi eo','1':'Keloi'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ksb_TZ = exports.RelativeDateTimeSymbols_ksb;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ksf =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Rinkɔɔ́','0':'Gɛ́ɛnǝ','1':'Ridúrǝ́'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ksf_CM = exports.RelativeDateTimeSymbols_ksf;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ksh =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'jestere','-2':'vörjestere','0':'hück','1':'morje','2':'övvermorje'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'lätzde Mohnd','0':'diese Mohnd','1':'nächste Mohnd'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'läz Woch','0':'di Woch','1':'nächste Woche'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'läz Johr','0':'diß Johr','1':'näx Johr'},\n      P:'one{vör # Johr}other{vör # Johre}zero{vör keijnem Johr}',\n      F:'one{en # Johr}other{en # Johre}zero{en keinem Johr}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ksh_DE = exports.RelativeDateTimeSymbols_ksh;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ku =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'duh','0':'îro','1':'sibe'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'par','0':'îsal','1':'sala piştî'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ku_TR = exports.RelativeDateTimeSymbols_ku;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kw =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kw_GB = exports.RelativeDateTimeSymbols_kw;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ky_KG = relativeDateTimeSymbols.RelativeDateTimeSymbols_ky;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lag =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Niijo','0':'Isikʉ','1':'Lamʉtoondo'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lag_TZ = exports.RelativeDateTimeSymbols_lag;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lb =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'gëschter','0':'haut','1':'muer'},\n      P:'one{virun # Dag}other{viru(n) # Deeg}',\n      F:'one{an # Dag}other{a(n) # Deeg}',\n    },\n    SHORT:{\n      R:{'-1':'gëschter','0':'haut','1':'muer'},\n      P:'one{virun # D.}other{viru(n) # D.}',\n      F:'one{an # D.}other{a(n) # D.}',\n    },\n    NARROW:{\n      R:{'-1':'gëschter','0':'haut','1':'muer'},\n      P:'one{-# D.}other{-# D.}',\n      F:'one{+# D.}other{+# D.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{virun # Stonn}other{viru(n) # Stonnen}',\n      F:'one{an # Stonn}other{a(n) # Stonnen}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{virun # St.}other{viru(n) # St.}',\n      F:'one{an # St.}other{a(n) # St.}',\n    },\n    NARROW:{\n      R:{'0':'this hour'},\n      P:'one{-# St.}other{-# St.}',\n      F:'one{+# St.}other{+# St.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{virun # Minutt}other{viru(n) # Minutten}',\n      F:'one{an # Minutt}other{a(n) # Minutten}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{virun # Min.}other{viru(n) # Min.}',\n      F:'one{an # Min.}other{a(n) # Min.}',\n    },\n    NARROW:{\n      R:{'0':'this minute'},\n      P:'one{-# Min.}other{-# Min.}',\n      F:'one{+# Min.}other{+# Min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'leschte Mount','0':'dëse Mount','1':'nächste Mount'},\n      P:'one{virun # Mount}other{viru(n) # Méint}',\n      F:'one{an # Mount}other{a(n) # Méint}',\n    },\n    SHORT:{\n      R:{'-1':'leschte Mount','0':'dëse Mount','1':'nächste Mount'},\n      P:'one{virun # M.}other{viru(n) # M.}',\n      F:'one{an # M.}other{a(n) # M.}',\n    },\n    NARROW:{\n      R:{'-1':'leschte Mount','0':'dëse Mount','1':'nächste Mount'},\n      P:'one{-# M.}other{-# M.}',\n      F:'one{+# M.}other{+# M.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{virun # Quartal}other{viru(n) # Quartaler}',\n      F:'one{an # Quartal}other{a(n) # Quartaler}',\n    },\n    SHORT:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{virun # Q.}other{viru(n) # Q.}',\n      F:'one{an # Q.}other{a(n) # Q.}',\n    },\n    NARROW:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{-# Q.}other{-# Q.}',\n      F:'one{+# Q.}other{+# Q.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{virun # Sekonn}other{viru(n) # Sekonnen}',\n      F:'one{an # Sekonn}other{a(n) # Sekonnen}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{virun # Sek.}other{viru(n) # Sek.}',\n      F:'one{an # Sek.}other{a(n) # Sek.}',\n    },\n    NARROW:{\n      R:{'0':'now'},\n      P:'one{-# Sek.}other{-# Sek.}',\n      F:'one{+# Sek.}other{+# Sek.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'lescht Woch','0':'dës Woch','1':'nächst Woch'},\n      P:'one{virun # Woch}other{viru(n) # Wochen}',\n      F:'one{an # Woch}other{a(n) # Wochen}',\n    },\n    SHORT:{\n      R:{'-1':'lescht Woch','0':'dës Woch','1':'nächst Woch'},\n      P:'one{virun # W.}other{viru(n) # W.}',\n      F:'one{an # W.}other{a(n) # W.}',\n    },\n    NARROW:{\n      R:{'-1':'lescht Woch','0':'dës Woch','1':'nächst Woch'},\n      P:'one{-# W.}other{-# W.}',\n      F:'one{+# W.}other{+# W.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'lescht Joer','0':'dëst Joer','1':'nächst Joer'},\n      P:'one{virun # Joer}other{viru(n) # Joer}',\n      F:'one{an # Joer}other{a(n) # Joer}',\n    },\n    SHORT:{\n      R:{'-1':'lescht Joer','0':'dëst Joer','1':'nächst Joer'},\n      P:'one{virun # J.}other{viru(n) # J.}',\n      F:'one{an # J.}other{a(n) # J.}',\n    },\n    NARROW:{\n      R:{'-1':'lescht Joer','0':'dëst Joer','1':'nächst Joer'},\n      P:'one{-# J.}other{-# J.}',\n      F:'one{+# J.}other{+# J.}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lb_LU = exports.RelativeDateTimeSymbols_lb;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lg =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ggulo','0':'Lwaleero','1':'Nkya'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lg_UG = exports.RelativeDateTimeSymbols_lg;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lkt =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ȟtálehaŋ','0':'Lé aŋpétu kiŋ','1':'Híŋhaŋni kiŋháŋ'},\n      P:'other{Hékta #-čháŋ k’uŋ héhaŋ}',\n      F:'other{Letáŋhaŋ #-čháŋ kiŋháŋ}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{Hékta owápȟe # kʼuŋ héhaŋ}',\n      F:'other{Letáŋhaŋ owápȟe # kiŋháŋ}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{Hékta oȟ’áŋkȟo # k’uŋ héhaŋ}',\n      F:'other{Letáŋhaŋ oȟ’áŋkȟo # kiŋháŋ}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'Wí kʼuŋ héhaŋ','0':'Lé wí kiŋ','1':'Tȟokáta wí kiŋháŋ'},\n      P:'other{Hékta wíyawapi # kʼuŋ héhaŋ}',\n      F:'other{Letáŋhaŋ wíyawapi # kiŋháŋ}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{Hékta okpí # k’uŋ héhaŋ}',\n      F:'other{Letáŋhaŋ okpí # kiŋháŋ}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'Okó kʼuŋ héhaŋ','0':'Lé okó kiŋ','1':'Tȟokáta okó kiŋháŋ'},\n      P:'other{Hékta okó # kʼuŋ héhaŋ}',\n      F:'other{Letáŋhaŋ okó # kiŋháŋ}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'Ómakȟa kʼuŋ héhaŋ','0':'Lé ómakȟa kiŋ','1':'Tȟokáta ómakȟa kiŋháŋ'},\n      P:'other{Hékta ómakȟa # kʼuŋ héhaŋ}',\n      F:'other{Letáŋhaŋ ómakȟa # kiŋháŋ}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lkt_US = exports.RelativeDateTimeSymbols_lkt;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ln_AO = relativeDateTimeSymbols.RelativeDateTimeSymbols_ln;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ln_CD = relativeDateTimeSymbols.RelativeDateTimeSymbols_ln;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ln_CF = relativeDateTimeSymbols.RelativeDateTimeSymbols_ln;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ln_CG = relativeDateTimeSymbols.RelativeDateTimeSymbols_ln;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lo_LA = relativeDateTimeSymbols.RelativeDateTimeSymbols_lo;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lrc =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'دیروٙز','0':'أمروٙ','1':'شوٙصوٙ'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lrc_IQ = exports.RelativeDateTimeSymbols_lrc;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lrc_IR = exports.RelativeDateTimeSymbols_lrc;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lt_LT = relativeDateTimeSymbols.RelativeDateTimeSymbols_lt;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lu =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Makelela','0':'Lelu','1':'Malaba'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lu_CD = exports.RelativeDateTimeSymbols_lu;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_luo =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'nyoro','0':'kawuono','1':'kiny'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_luo_KE = exports.RelativeDateTimeSymbols_luo;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_luy =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Mgorova','0':'Lero','1':'Mgamba'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_luy_KE = exports.RelativeDateTimeSymbols_luy;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lv_LV = relativeDateTimeSymbols.RelativeDateTimeSymbols_lv;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mas =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ŋolé','0':'Táatá','1':'Tááisérè'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mas_KE = exports.RelativeDateTimeSymbols_mas;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mas_TZ = exports.RelativeDateTimeSymbols_mas;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mer =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ĩgoro','0':'Narua','1':'Rũjũ'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mer_KE = exports.RelativeDateTimeSymbols_mer;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mfe =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Yer','0':'Zordi','1':'Demin'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mfe_MU = exports.RelativeDateTimeSymbols_mfe;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mg =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Omaly','0':'Anio','1':'Rahampitso'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mg_MG = exports.RelativeDateTimeSymbols_mg;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mgh =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'n’chana','0':'lel’lo','1':'me’llo'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mgh_MZ = exports.RelativeDateTimeSymbols_mgh;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mgo =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ikwiri','0':'tèchɔ̀ŋ','1':'isu','2':'isu ywi'},\n      P:'one{-# d}other{-# d}',\n      F:'one{+# d}other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{-# h}other{-# h}',\n      F:'one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{-# m}other{-# m}',\n      F:'one{+# m}other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mgo_CM = exports.RelativeDateTimeSymbols_mgo;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mi =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'inanahi','0':'āianei','1':'āpōpō'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mi_NZ = exports.RelativeDateTimeSymbols_mi;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mk_MK = relativeDateTimeSymbols.RelativeDateTimeSymbols_mk;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ml_IN = relativeDateTimeSymbols.RelativeDateTimeSymbols_ml;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mn_MN = relativeDateTimeSymbols.RelativeDateTimeSymbols_mn;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mr_IN = relativeDateTimeSymbols.RelativeDateTimeSymbols_mr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ms_BN = relativeDateTimeSymbols.RelativeDateTimeSymbols_ms;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ms_MY = relativeDateTimeSymbols.RelativeDateTimeSymbols_ms;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ms_SG = relativeDateTimeSymbols.RelativeDateTimeSymbols_ms;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mt_MT = relativeDateTimeSymbols.RelativeDateTimeSymbols_mt;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mua =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Tǝsoo','0':'Tǝ’nahko','1':'Tǝ’nane'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mua_CM = exports.RelativeDateTimeSymbols_mua;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_my_MM = relativeDateTimeSymbols.RelativeDateTimeSymbols_my;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mzn =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'دیروز','0':'اَمروز','1':'فِردا'},\n      P:'other{# روز پیش}',\n      F:'other{# روز دله}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{# ساعِت پیش}',\n      F:'other{# ساعِت دله}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'other{# ساعت پیش}',\n      F:'other{# ساعت دله}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{# دَقه پیش}',\n      F:'other{# دقیقه دله}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'other{# دَقه پیش}',\n      F:'other{# دَقه دله}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ماه قبل','0':'این ماه','1':'ماه ِبعد'},\n      P:'other{# ماه پیش}',\n      F:'other{# ماه دله}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{# ربع پیش}',\n      F:'other{# ربع دله}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{# ثانیه پیش}',\n      F:'other{# ثانیه دله}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'قبلی هفته','0':'این هفته','1':'بعدی هفته'},\n      P:'other{# هفته پیش}',\n      F:'other{# هفته دله}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'پارسال','0':'امسال','1':'سال دیگه'},\n      P:'other{# سال پیش}',\n      F:'other{# سال دله}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mzn_IR = exports.RelativeDateTimeSymbols_mzn;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_naq =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'Neetsee','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_naq_NA = exports.RelativeDateTimeSymbols_naq;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nb_NO = relativeDateTimeSymbols.RelativeDateTimeSymbols_nb;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nb_SJ = relativeDateTimeSymbols.RelativeDateTimeSymbols_nb;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nd =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Izolo','0':'Lamuhla','1':'Kusasa'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nd_ZW = exports.RelativeDateTimeSymbols_nd;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nds =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nds_DE = exports.RelativeDateTimeSymbols_nds;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nds_NL = exports.RelativeDateTimeSymbols_nds;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ne_IN = relativeDateTimeSymbols.RelativeDateTimeSymbols_ne;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ne_NP = relativeDateTimeSymbols.RelativeDateTimeSymbols_ne;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nl_AW = relativeDateTimeSymbols.RelativeDateTimeSymbols_nl;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nl_BE = relativeDateTimeSymbols.RelativeDateTimeSymbols_nl;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nl_BQ = relativeDateTimeSymbols.RelativeDateTimeSymbols_nl;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nl_CW = relativeDateTimeSymbols.RelativeDateTimeSymbols_nl;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nl_NL = relativeDateTimeSymbols.RelativeDateTimeSymbols_nl;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nl_SR = relativeDateTimeSymbols.RelativeDateTimeSymbols_nl;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nl_SX = relativeDateTimeSymbols.RelativeDateTimeSymbols_nl;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nmg =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Nakugú','0':'Dɔl','1':'Namáná'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nmg_CM = exports.RelativeDateTimeSymbols_nmg;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nn =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'i går','-2':'i førgår','0':'i dag','1':'i morgon','2':'i overmorgon'},\n      P:'one{for # døgn sidan}other{for # døgn sidan}',\n      F:'one{om # døgn}other{om # døgn}',\n    },\n    SHORT:{\n      R:{'-1':'i går','-2':'i førgår','0':'i dag','1':'i morgon','2':'i overmorgon'},\n      P:'one{for # d. sidan}other{for # d. sidan}',\n      F:'one{om # d.}other{om # d.}',\n    },\n    NARROW:{\n      R:{'-1':'i går','-2':'i førgår','0':'i dag','1':'i morgon','2':'i overmorgon'},\n      P:'one{–# d.}other{–# d.}',\n      F:'one{+# d.}other{+# d.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'denne timen'},\n      P:'one{for # time sidan}other{for # timar sidan}',\n      F:'one{om # time}other{om # timar}',\n    },\n    SHORT:{\n      R:{'0':'denne timen'},\n      P:'one{for # t sidan}other{for # t sidan}',\n      F:'one{om # t}other{om # t}',\n    },\n    NARROW:{\n      R:{'0':'denne timen'},\n      P:'one{–# t}other{–# t}',\n      F:'one{+# t}other{+# t}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'dette minuttet'},\n      P:'one{for # minutt sidan}other{for # minutt sidan}',\n      F:'one{om # minutt}other{om # minutt}',\n    },\n    SHORT:{\n      R:{'0':'dette minuttet'},\n      P:'one{for # min sidan}other{for # min sidan}',\n      F:'one{om # min}other{om # min}',\n    },\n    NARROW:{\n      R:{'0':'dette minuttet'},\n      P:'one{–# min}other{–# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'førre månad','0':'denne månaden','1':'neste månad'},\n      P:'one{for # månad sidan}other{for # månadar sidan}',\n      F:'one{om # månad}other{om # månadar}',\n    },\n    SHORT:{\n      R:{'-1':'førre månad','0':'denne månaden','1':'neste månad'},\n      P:'one{for # md. sidan}other{for # md. sidan}',\n      F:'one{om # md.}other{om # md.}',\n    },\n    NARROW:{\n      R:{'-1':'førre månad','0':'denne månaden','1':'neste månad'},\n      P:'one{–# md.}other{–# md.}',\n      F:'one{+# md.}other{+# md.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'førre kvartal','0':'dette kvartalet','1':'neste kvartal'},\n      P:'one{for # kvartal sidan}other{for # kvartal sidan}',\n      F:'one{om # kvartal}other{om # kvartal}',\n    },\n    SHORT:{\n      R:{'-1':'førre kvartal','0':'dette kvartalet','1':'neste kvartal'},\n      P:'one{for # kv. sidan}other{for # kv. sidan}',\n      F:'one{om # kv.}other{om # kv.}',\n    },\n    NARROW:{\n      R:{'-1':'førre kvartal','0':'dette kvartalet','1':'neste kvartal'},\n      P:'one{–# kv.}other{–# kv.}',\n      F:'one{+# kv.}other{+# kv.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'no'},\n      P:'one{for # sekund sidan}other{for # sekund sidan}',\n      F:'one{om # sekund}other{om # sekund}',\n    },\n    SHORT:{\n      R:{'0':'no'},\n      P:'one{for # sek sidan}other{for # sek sidan}',\n      F:'one{om # sek}other{om # sek}',\n    },\n    NARROW:{\n      R:{'0':'no'},\n      P:'one{–# s}other{–# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'førre veke','0':'denne veka','1':'neste veke'},\n      P:'one{for # veke sidan}other{for # veker sidan}',\n      F:'one{om # veke}other{om # veker}',\n    },\n    SHORT:{\n      R:{'-1':'førre veke','0':'denne veka','1':'neste veke'},\n      P:'one{for # v. sidan}other{for # v. sidan}',\n      F:'one{om # v.}other{om # v.}',\n    },\n    NARROW:{\n      R:{'-1':'førre veke','0':'denne veka','1':'neste veke'},\n      P:'one{–# v.}other{–# v.}',\n      F:'one{+# v.}other{+# v.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'i fjor','0':'i år','1':'neste år'},\n      P:'one{for # år sidan}other{for # år sidan}',\n      F:'one{om # år}other{om # år}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nn_NO = exports.RelativeDateTimeSymbols_nn;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nnh =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'jǔɔ gẅie à ka tɔ̌g','0':'lyɛ̌ʼɔɔn','1':'jǔɔ gẅie à ne ntóo'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nnh_CM = exports.RelativeDateTimeSymbols_nnh;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nus =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Pan','0':'Walɛ','1':'Ruun'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nus_SS = exports.RelativeDateTimeSymbols_nus;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nyn =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Nyomwabazyo','0':'Erizooba','1':'Nyenkyakare'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nyn_UG = exports.RelativeDateTimeSymbols_nyn;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_om =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_om_ET = exports.RelativeDateTimeSymbols_om;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_om_KE = exports.RelativeDateTimeSymbols_om;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_or_IN = relativeDateTimeSymbols.RelativeDateTimeSymbols_or;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_os =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Знон','-2':'Ӕндӕрӕбон','0':'Абон','1':'Сом','2':'Иннӕбон'},\n      P:'one{# бон раздӕр}other{# боны размӕ}',\n      F:'one{# боны фӕстӕ}other{# боны фӕстӕ}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# сахаты размӕ}other{# сахаты размӕ}',\n      F:'one{# сахаты фӕстӕ}other{# сахаты фӕстӕ}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_os_GE = exports.RelativeDateTimeSymbols_os;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_os_RU = exports.RelativeDateTimeSymbols_os;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pa_Arab =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pa_Arab_PK =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pa_Guru = relativeDateTimeSymbols.RelativeDateTimeSymbols_pa;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pa_Guru_IN = relativeDateTimeSymbols.RelativeDateTimeSymbols_pa;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pl_PL = relativeDateTimeSymbols.RelativeDateTimeSymbols_pl;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ps =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'پروسږکال','0':'سږکال','1':'بل کال'},\n      P:'one{# کال مخکې}other{# کاله مخکې}',\n      F:'one{په # کال کې}other{په # کالونو کې}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ps_AF = exports.RelativeDateTimeSymbols_ps;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ps_PK =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'پروسږکال','0':'سږکال','1':'بل کال'},\n      P:'one{# کال مخکے}other{# کاله مخکے}',\n      F:'one{په # کال کے}other{په # کالونو کے}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pt_AO =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ontem','-2':'anteontem','0':'hoje','1':'amanhã','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    SHORT:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    NARROW:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dias}other{há # dias}',\n      F:'one{+# dia}other{+# dias}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{há # hora}other{há # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{há # h}other{há # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n    NARROW:{\n      R:{'0':'esta hora'},\n      P:'one{-# h}other{-# h}',\n      F:'one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{há # minuto}other{há # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{há # min}other{há # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n    NARROW:{\n      R:{'0':'este minuto'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{há # mês}other{há # meses}',\n      F:'one{dentro de # mês}other{dentro de # meses}',\n    },\n    NARROW:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{-# mês}other{-# meses}',\n      F:'one{+# mês}other{+# meses}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'trimestre passado','0':'este trimestre','1':'próximo trimestre'},\n      P:'one{há # trimestre}other{há # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{há # trim.}other{há # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{-# trim.}other{-# trim.}',\n      F:'one{+# trim.}other{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'agora'},\n      P:'one{há # segundo}other{há # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'agora'},\n      P:'one{há # s}other{há # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n    NARROW:{\n      R:{'0':'agora'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # semana}other{há # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # sem.}other{há # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{-# sem.}other{-# sem.}',\n      F:'one{+# sem.}other{+# sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{há # ano}other{há # anos}',\n      F:'one{dentro de # ano}other{dentro de # anos}',\n    },\n    NARROW:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{-# ano}other{-# anos}',\n      F:'one{+# ano}other{+# anos}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pt_CH =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ontem','-2':'anteontem','0':'hoje','1':'amanhã','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    SHORT:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    NARROW:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dias}other{há # dias}',\n      F:'one{+# dia}other{+# dias}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{há # hora}other{há # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{há # h}other{há # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n    NARROW:{\n      R:{'0':'esta hora'},\n      P:'one{-# h}other{-# h}',\n      F:'one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{há # minuto}other{há # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{há # min}other{há # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n    NARROW:{\n      R:{'0':'este minuto'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{há # mês}other{há # meses}',\n      F:'one{dentro de # mês}other{dentro de # meses}',\n    },\n    NARROW:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{-# mês}other{-# meses}',\n      F:'one{+# mês}other{+# meses}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'trimestre passado','0':'este trimestre','1':'próximo trimestre'},\n      P:'one{há # trimestre}other{há # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{há # trim.}other{há # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{-# trim.}other{-# trim.}',\n      F:'one{+# trim.}other{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'agora'},\n      P:'one{há # segundo}other{há # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'agora'},\n      P:'one{há # s}other{há # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n    NARROW:{\n      R:{'0':'agora'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # semana}other{há # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # sem.}other{há # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{-# sem.}other{-# sem.}',\n      F:'one{+# sem.}other{+# sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{há # ano}other{há # anos}',\n      F:'one{dentro de # ano}other{dentro de # anos}',\n    },\n    NARROW:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{-# ano}other{-# anos}',\n      F:'one{+# ano}other{+# anos}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pt_CV =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ontem','-2':'anteontem','0':'hoje','1':'amanhã','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    SHORT:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    NARROW:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dias}other{há # dias}',\n      F:'one{+# dia}other{+# dias}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{há # hora}other{há # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{há # h}other{há # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n    NARROW:{\n      R:{'0':'esta hora'},\n      P:'one{-# h}other{-# h}',\n      F:'one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{há # minuto}other{há # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{há # min}other{há # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n    NARROW:{\n      R:{'0':'este minuto'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{há # mês}other{há # meses}',\n      F:'one{dentro de # mês}other{dentro de # meses}',\n    },\n    NARROW:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{-# mês}other{-# meses}',\n      F:'one{+# mês}other{+# meses}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'trimestre passado','0':'este trimestre','1':'próximo trimestre'},\n      P:'one{há # trimestre}other{há # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{há # trim.}other{há # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{-# trim.}other{-# trim.}',\n      F:'one{+# trim.}other{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'agora'},\n      P:'one{há # segundo}other{há # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'agora'},\n      P:'one{há # s}other{há # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n    NARROW:{\n      R:{'0':'agora'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # semana}other{há # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # sem.}other{há # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{-# sem.}other{-# sem.}',\n      F:'one{+# sem.}other{+# sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{há # ano}other{há # anos}',\n      F:'one{dentro de # ano}other{dentro de # anos}',\n    },\n    NARROW:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{-# ano}other{-# anos}',\n      F:'one{+# ano}other{+# anos}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pt_GQ =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ontem','-2':'anteontem','0':'hoje','1':'amanhã','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    SHORT:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    NARROW:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dias}other{há # dias}',\n      F:'one{+# dia}other{+# dias}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{há # hora}other{há # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{há # h}other{há # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n    NARROW:{\n      R:{'0':'esta hora'},\n      P:'one{-# h}other{-# h}',\n      F:'one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{há # minuto}other{há # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{há # min}other{há # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n    NARROW:{\n      R:{'0':'este minuto'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{há # mês}other{há # meses}',\n      F:'one{dentro de # mês}other{dentro de # meses}',\n    },\n    NARROW:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{-# mês}other{-# meses}',\n      F:'one{+# mês}other{+# meses}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'trimestre passado','0':'este trimestre','1':'próximo trimestre'},\n      P:'one{há # trimestre}other{há # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{há # trim.}other{há # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{-# trim.}other{-# trim.}',\n      F:'one{+# trim.}other{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'agora'},\n      P:'one{há # segundo}other{há # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'agora'},\n      P:'one{há # s}other{há # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n    NARROW:{\n      R:{'0':'agora'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # semana}other{há # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # sem.}other{há # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{-# sem.}other{-# sem.}',\n      F:'one{+# sem.}other{+# sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{há # ano}other{há # anos}',\n      F:'one{dentro de # ano}other{dentro de # anos}',\n    },\n    NARROW:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{-# ano}other{-# anos}',\n      F:'one{+# ano}other{+# anos}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pt_GW =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ontem','-2':'anteontem','0':'hoje','1':'amanhã','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    SHORT:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    NARROW:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dias}other{há # dias}',\n      F:'one{+# dia}other{+# dias}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{há # hora}other{há # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{há # h}other{há # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n    NARROW:{\n      R:{'0':'esta hora'},\n      P:'one{-# h}other{-# h}',\n      F:'one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{há # minuto}other{há # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{há # min}other{há # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n    NARROW:{\n      R:{'0':'este minuto'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{há # mês}other{há # meses}',\n      F:'one{dentro de # mês}other{dentro de # meses}',\n    },\n    NARROW:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{-# mês}other{-# meses}',\n      F:'one{+# mês}other{+# meses}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'trimestre passado','0':'este trimestre','1':'próximo trimestre'},\n      P:'one{há # trimestre}other{há # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{há # trim.}other{há # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{-# trim.}other{-# trim.}',\n      F:'one{+# trim.}other{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'agora'},\n      P:'one{há # segundo}other{há # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'agora'},\n      P:'one{há # s}other{há # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n    NARROW:{\n      R:{'0':'agora'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # semana}other{há # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # sem.}other{há # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{-# sem.}other{-# sem.}',\n      F:'one{+# sem.}other{+# sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{há # ano}other{há # anos}',\n      F:'one{dentro de # ano}other{dentro de # anos}',\n    },\n    NARROW:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{-# ano}other{-# anos}',\n      F:'one{+# ano}other{+# anos}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pt_LU =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ontem','-2':'anteontem','0':'hoje','1':'amanhã','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    SHORT:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    NARROW:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dias}other{há # dias}',\n      F:'one{+# dia}other{+# dias}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{há # hora}other{há # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{há # h}other{há # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n    NARROW:{\n      R:{'0':'esta hora'},\n      P:'one{-# h}other{-# h}',\n      F:'one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{há # minuto}other{há # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{há # min}other{há # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n    NARROW:{\n      R:{'0':'este minuto'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{há # mês}other{há # meses}',\n      F:'one{dentro de # mês}other{dentro de # meses}',\n    },\n    NARROW:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{-# mês}other{-# meses}',\n      F:'one{+# mês}other{+# meses}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'trimestre passado','0':'este trimestre','1':'próximo trimestre'},\n      P:'one{há # trimestre}other{há # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{há # trim.}other{há # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{-# trim.}other{-# trim.}',\n      F:'one{+# trim.}other{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'agora'},\n      P:'one{há # segundo}other{há # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'agora'},\n      P:'one{há # s}other{há # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n    NARROW:{\n      R:{'0':'agora'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # semana}other{há # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # sem.}other{há # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{-# sem.}other{-# sem.}',\n      F:'one{+# sem.}other{+# sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{há # ano}other{há # anos}',\n      F:'one{dentro de # ano}other{dentro de # anos}',\n    },\n    NARROW:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{-# ano}other{-# anos}',\n      F:'one{+# ano}other{+# anos}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pt_MO =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ontem','-2':'anteontem','0':'hoje','1':'amanhã','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    SHORT:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    NARROW:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dias}other{há # dias}',\n      F:'one{+# dia}other{+# dias}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{há # hora}other{há # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{há # h}other{há # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n    NARROW:{\n      R:{'0':'esta hora'},\n      P:'one{-# h}other{-# h}',\n      F:'one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{há # minuto}other{há # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{há # min}other{há # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n    NARROW:{\n      R:{'0':'este minuto'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{há # mês}other{há # meses}',\n      F:'one{dentro de # mês}other{dentro de # meses}',\n    },\n    NARROW:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{-# mês}other{-# meses}',\n      F:'one{+# mês}other{+# meses}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'trimestre passado','0':'este trimestre','1':'próximo trimestre'},\n      P:'one{há # trimestre}other{há # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{há # trim.}other{há # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{-# trim.}other{-# trim.}',\n      F:'one{+# trim.}other{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'agora'},\n      P:'one{há # segundo}other{há # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'agora'},\n      P:'one{há # s}other{há # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n    NARROW:{\n      R:{'0':'agora'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # semana}other{há # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # sem.}other{há # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{-# sem.}other{-# sem.}',\n      F:'one{+# sem.}other{+# sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{há # ano}other{há # anos}',\n      F:'one{dentro de # ano}other{dentro de # anos}',\n    },\n    NARROW:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{-# ano}other{-# anos}',\n      F:'one{+# ano}other{+# anos}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pt_MZ =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ontem','-2':'anteontem','0':'hoje','1':'amanhã','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    SHORT:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    NARROW:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dias}other{há # dias}',\n      F:'one{+# dia}other{+# dias}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{há # hora}other{há # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{há # h}other{há # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n    NARROW:{\n      R:{'0':'esta hora'},\n      P:'one{-# h}other{-# h}',\n      F:'one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{há # minuto}other{há # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{há # min}other{há # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n    NARROW:{\n      R:{'0':'este minuto'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{há # mês}other{há # meses}',\n      F:'one{dentro de # mês}other{dentro de # meses}',\n    },\n    NARROW:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{-# mês}other{-# meses}',\n      F:'one{+# mês}other{+# meses}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'trimestre passado','0':'este trimestre','1':'próximo trimestre'},\n      P:'one{há # trimestre}other{há # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{há # trim.}other{há # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{-# trim.}other{-# trim.}',\n      F:'one{+# trim.}other{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'agora'},\n      P:'one{há # segundo}other{há # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'agora'},\n      P:'one{há # s}other{há # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n    NARROW:{\n      R:{'0':'agora'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # semana}other{há # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # sem.}other{há # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{-# sem.}other{-# sem.}',\n      F:'one{+# sem.}other{+# sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{há # ano}other{há # anos}',\n      F:'one{dentro de # ano}other{dentro de # anos}',\n    },\n    NARROW:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{-# ano}other{-# anos}',\n      F:'one{+# ano}other{+# anos}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pt_ST =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ontem','-2':'anteontem','0':'hoje','1':'amanhã','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    SHORT:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    NARROW:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dias}other{há # dias}',\n      F:'one{+# dia}other{+# dias}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{há # hora}other{há # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{há # h}other{há # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n    NARROW:{\n      R:{'0':'esta hora'},\n      P:'one{-# h}other{-# h}',\n      F:'one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{há # minuto}other{há # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{há # min}other{há # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n    NARROW:{\n      R:{'0':'este minuto'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{há # mês}other{há # meses}',\n      F:'one{dentro de # mês}other{dentro de # meses}',\n    },\n    NARROW:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{-# mês}other{-# meses}',\n      F:'one{+# mês}other{+# meses}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'trimestre passado','0':'este trimestre','1':'próximo trimestre'},\n      P:'one{há # trimestre}other{há # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{há # trim.}other{há # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{-# trim.}other{-# trim.}',\n      F:'one{+# trim.}other{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'agora'},\n      P:'one{há # segundo}other{há # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'agora'},\n      P:'one{há # s}other{há # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n    NARROW:{\n      R:{'0':'agora'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # semana}other{há # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # sem.}other{há # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{-# sem.}other{-# sem.}',\n      F:'one{+# sem.}other{+# sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{há # ano}other{há # anos}',\n      F:'one{dentro de # ano}other{dentro de # anos}',\n    },\n    NARROW:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{-# ano}other{-# anos}',\n      F:'one{+# ano}other{+# anos}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pt_TL =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ontem','-2':'anteontem','0':'hoje','1':'amanhã','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    SHORT:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    NARROW:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dias}other{há # dias}',\n      F:'one{+# dia}other{+# dias}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{há # hora}other{há # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{há # h}other{há # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n    NARROW:{\n      R:{'0':'esta hora'},\n      P:'one{-# h}other{-# h}',\n      F:'one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{há # minuto}other{há # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{há # min}other{há # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n    NARROW:{\n      R:{'0':'este minuto'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{há # mês}other{há # meses}',\n      F:'one{dentro de # mês}other{dentro de # meses}',\n    },\n    NARROW:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{-# mês}other{-# meses}',\n      F:'one{+# mês}other{+# meses}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'trimestre passado','0':'este trimestre','1':'próximo trimestre'},\n      P:'one{há # trimestre}other{há # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{há # trim.}other{há # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{-# trim.}other{-# trim.}',\n      F:'one{+# trim.}other{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'agora'},\n      P:'one{há # segundo}other{há # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'agora'},\n      P:'one{há # s}other{há # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n    NARROW:{\n      R:{'0':'agora'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # semana}other{há # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # sem.}other{há # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{-# sem.}other{-# sem.}',\n      F:'one{+# sem.}other{+# sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{há # ano}other{há # anos}',\n      F:'one{dentro de # ano}other{dentro de # anos}',\n    },\n    NARROW:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{-# ano}other{-# anos}',\n      F:'one{+# ano}other{+# anos}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_qu =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'qayna punchaw','0':'kunan punchaw','1':'paqarin'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'kay hora'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'kay minuto'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'qayna killa','0':'kunan killa','1':'hamuq killa'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'qayna kimsa killa','0':'kunan kimsa killa','1':'hamuq kimsa killa'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'qayna semana','0':'kunan semana','1':'hamuq semana'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'qayna wata','0':'kunan wata','1':'hamuq wata'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_qu_BO = exports.RelativeDateTimeSymbols_qu;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_qu_EC = exports.RelativeDateTimeSymbols_qu;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_qu_PE = exports.RelativeDateTimeSymbols_qu;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_rm =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ier','-2':'stersas','0':'oz','1':'damaun','2':'puschmaun'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_rm_CH = exports.RelativeDateTimeSymbols_rm;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_rn =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ejo (haheze)','0':'Uyu musi','1':'Ejo (hazoza)'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_rn_BI = exports.RelativeDateTimeSymbols_rn;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ro_MD = relativeDateTimeSymbols.RelativeDateTimeSymbols_ro;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ro_RO = relativeDateTimeSymbols.RelativeDateTimeSymbols_ro;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_rof =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Hiyo','0':'Linu','1':'Ng’ama'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_rof_TZ = exports.RelativeDateTimeSymbols_rof;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ru_BY = relativeDateTimeSymbols.RelativeDateTimeSymbols_ru;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ru_KG = relativeDateTimeSymbols.RelativeDateTimeSymbols_ru;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ru_KZ = relativeDateTimeSymbols.RelativeDateTimeSymbols_ru;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ru_MD = relativeDateTimeSymbols.RelativeDateTimeSymbols_ru;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ru_RU = relativeDateTimeSymbols.RelativeDateTimeSymbols_ru;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ru_UA = relativeDateTimeSymbols.RelativeDateTimeSymbols_ru;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_rw =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_rw_RW = exports.RelativeDateTimeSymbols_rw;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_rwk =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ukou','0':'Inu','1':'Ngama'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_rwk_TZ = exports.RelativeDateTimeSymbols_rwk;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sah =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Бэҕэһээ','-2':'Иллэрээ күн','0':'Бүгүн','1':'Сарсын','2':'Өйүүн'},\n      P:'other{# күн ынараа өттүгэр}',\n      F:'other{# күнүнэн}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{# чаас ынараа өттүгэр}',\n      F:'other{# чааһынан}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{# мүнүүтэ ынараа өттүгэр}',\n      F:'other{# мүнүүтэннэн}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ааспыт ый','0':'бу ый','1':'аныгыскы ый'},\n      P:'other{# ый ынараа өттүгэр}',\n      F:'other{# ыйынан}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'ааспыт кыбаартал','0':'бу кыбаартал','1':'кэлэр кыбаартал'},\n      P:'other{# кыбаартал анараа өттүгэр}',\n      F:'other{# кыбаарталынан}',\n    },\n    SHORT:{\n      R:{'-1':'ааспыт кыбаартал','0':'бу кыбаартал','1':'кэлэр кыбаартал'},\n      P:'other{# кыб. анараа өттүгэр}',\n      F:'other{# кыбаарталынан}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'билигин'},\n      P:'other{# сөкүүндэ ынараа өттүгэр}',\n      F:'other{# сөкүүндэннэн}',\n    },\n    SHORT:{\n      R:{'0':'билигин'},\n      P:'other{# сөк. анараа өттүгэр}',\n      F:'other{# сөкүүндэннэн}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ааспыт нэдиэлэ','0':'бу нэдиэлэ','1':'кэлэр нэдиэлэ'},\n      P:'other{# нэдиэлэ анараа өттүгэр}',\n      F:'other{# нэдиэлэннэн}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'Былырыын','0':'быйыл','1':'эһиил'},\n      P:'other{# сыл ынараа өттүгэр}',\n      F:'other{# сылынан}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sah_RU = exports.RelativeDateTimeSymbols_sah;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_saq =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ng’ole','0':'Duo','1':'Taisere'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_saq_KE = exports.RelativeDateTimeSymbols_saq;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sbp =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Imehe','0':'Ineng’uni','1':'Pamulaawu'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sbp_TZ = exports.RelativeDateTimeSymbols_sbp;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sd =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ڪل','0':'اڄ','1':'سڀاڻي'},\n      P:'one{# ڏينهن پهرين}other{# ڏينهن پهرين}',\n      F:'one{# ڏينهن ۾}other{# ڏينهن ۾}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'هن ڪلڪ'},\n      P:'one{# ڪلاڪ پهرين}other{# ڪلاڪ پهرين}',\n      F:'one{# ڪلاڪ ۾}other{# ڪلاڪ ۾}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'هن منٽ'},\n      P:'one{# منٽ پهرين}other{# منٽ پهرين}',\n      F:'one{# منٽن ۾}other{+# min}',\n    },\n    SHORT:{\n      R:{'0':'هن منٽ'},\n      P:'one{# منٽ پهرين}other{# منٽ پهرين}',\n      F:'one{# منٽن ۾}other{# منٽن ۾}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'پوئين مهيني','0':'هن مهيني','1':'اڳين مهيني'},\n      P:'one{# مهينا پهرين}other{# مهينا پهرين}',\n      F:'one{# مهينن ۾}other{# مهينن ۾}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'پوئين ٽي ماهي','0':'هن ٽي ماهي','1':'اڳين ٽي ماهي'},\n      P:'one{# ٽي ماهي پهرين}other{# ٽي ماهي پهرين}',\n      F:'one{# ٽي ماهي ۾}other{# ٽي ماهي ۾}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'هاڻي'},\n      P:'one{# سيڪنڊ پهرين}other{# سيڪنڊ پهرين}',\n      F:'one{# سيڪنڊن ۾}other{# سيڪنڊن ۾}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'پوئين هفتي','0':'هن هفتي','1':'اڳين هفتي'},\n      P:'one{# هفتا پهرين}other{# هفتا پهرين}',\n      F:'one{# هفتن ۾}other{# هفتن ۾}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'پويون سال','0':'پويون سال','1':'پويون سال'},\n      P:'one{# سال پهرين}other{# سال پهرين}',\n      F:'one{# سالن ۾}other{# سالن ۾}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sd_PK = exports.RelativeDateTimeSymbols_sd;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_se =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ikte','-2':'oovdebpeivvi','0':'odne','1':'ihttin','2':'paijeelittáá'},\n      P:'one{# jándor árat}other{# jándora árat}two{# jándora árat}',\n      F:'one{# jándor maŋŋilit}other{# jándora maŋŋilit}two{# jándor amaŋŋilit}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# diibmu árat}other{# diibmur árat}two{# diibmur árat}',\n      F:'one{# diibmu maŋŋilit}other{# diibmur maŋŋilit}two{# diibmur maŋŋilit}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minuhta árat}other{# minuhtta árat}two{# minuhtta árat}',\n      F:'one{# minuhta maŋŋilit}other{# minuhtta maŋŋilit}two{# minuhtta maŋŋilit}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# mánotbadji árat}other{# mánotbadji árat}two{# mánotbadji árat}',\n      F:'one{# mánotbadji maŋŋilit}other{# mánotbadji maŋŋilit}two{# mánotbadji maŋŋilit}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# sekunda árat}other{# sekundda árat}two{# sekundda árat}',\n      F:'one{# sekunda maŋŋilit}other{# sekundda maŋŋilit}two{# sekundda maŋŋilit}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# vahku árat}other{# vahkku árat}two{# vahkku árat}',\n      F:'one{# vahku maŋŋilit}other{# vahkku maŋŋilit}two{# vahkku maŋŋilit}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# jahki árat}other{# jahkki árat}two{# jahkki árat}',\n      F:'one{# jahki maŋŋilit}other{# jahkki maŋŋilit}two{# jahkki maŋŋilit}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_se_FI =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ikte','-2':'ovddet beaivvi','0':'odne','1':'ihttin','2':'don beaivve'},\n      P:'one{ikte}other{# beaivve dás ovdal}two{ovddet beaivve}',\n      F:'one{# beaivve siste}other{# beaivve siste}two{# beaivve siste}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'dán diimmu'},\n      P:'one{# diibmu áigi}other{# diimmu áigi}two{# diimmu áigi}',\n      F:'one{# diimmu siste}other{# diimmu siste}two{# diimmu siste}',\n    },\n    SHORT:{\n      R:{'0':'dán diimmu'},\n      P:'one{# dmu áigi}other{# dmu áigi}two{# diimmu áigi}',\n      F:'one{# dmu siste}other{# dmu siste}two{# diimmu siste}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'dán minuhta'},\n      P:'one{# minuhtta áigi}other{# minuhta áigi}two{# minuhta áigi}',\n      F:'one{# minuhta siste}other{# minuhta siste}two{# minuhta siste}',\n    },\n    SHORT:{\n      R:{'0':'dán minuhta'},\n      P:'one{# min. áigi}other{# min. áigi}two{# minuhta áigi}',\n      F:'one{# min. siste}other{# min. siste}two{# minuhta siste}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mannan mánu','0':'dán mánu','1':'boahtte mánu'},\n      P:'one{# mánnu dás ovdal}other{# mánu dás ovdal}two{# mánu dás ovdal}',\n      F:'one{# mánu siste}other{# mánu siste}two{# mánu siste}',\n    },\n    NARROW:{\n      R:{'-1':'mannan mánu','0':'dán mánu','1':'boahtte mánu'},\n      P:'one{# mánnu dás ovdal}other{# mánu dás ovdal}two{# mánu dás ovdal}',\n      F:'one{# mánu geahčen}other{# mánu geahčen}two{# mánu geahčen}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'mannan njealjádasjagi','0':'dán njealjádasjagi','1':'boahtte njealjádasjagi'},\n      P:'one{-# njealjádasjagi dás ovdal}other{-# njealjádasjagi dás ovdal}two{-# njealjádasjagi dás ovdal}',\n      F:'one{čuovvovaš # njealjádasjagi}other{čuovvovaš # njealjádasjagi}two{čuovvovaš # njealjádasjagi}',\n    },\n    SHORT:{\n      R:{'-1':'mannan njealjádasjagi','0':'dán njealjádasjagi','1':'boahtte njealjádasjagi'},\n      P:'one{# njealj.j. dás ovdal}other{# njealj.j. dás ovdal}two{# njealjádasjagi dás ovdal}',\n      F:'one{boahtte # njealj.j.}other{boahtte # njealj.j.}two{boahtte # njealjádasjagi}',\n    },\n    NARROW:{\n      R:{'-1':'mannan njealjádasjagi','0':'dán njealjádasjagi','1':'boahtte njealjádasjagi'},\n      P:'one{# njealj.j. dás ovdal}other{# njealj.j. dás ovdal}two{-# njealjádasjagi dás ovdal}',\n      F:'one{boahtte # njealj.j.}other{boahtte # njealj.j.}two{boahtte # njealjádasjagi}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'dál'},\n      P:'one{# sekunda áigi}other{# sekundda áigi}two{# sekundda áigi}',\n      F:'one{# sekundda siste}other{# sekundda siste}two{# sekundda siste}',\n    },\n    SHORT:{\n      R:{'0':'dál'},\n      P:'one{# sek. áigi}other{# sek. áigi}two{# sekundda áigi}',\n      F:'one{# sek. siste}other{# sek. siste}two{# sekundda siste}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'mannan vahku','0':'dán vahku','1':'boahtte vahku'},\n      P:'one{# vahkku dás ovdal}other{# vahku dás ovdal}two{# vahku dás ovdal}',\n      F:'one{# vahku geahčen}other{# vahku geahčen}two{# vahku geahčen}',\n    },\n    SHORT:{\n      R:{'-1':'mannan vahku','0':'dán vahku','1':'boahtte vahku'},\n      P:'one{# v(k) dás ovdal}other{# v(k) dás ovdal}two{# vahku dás ovdal}',\n      F:'one{# v(k) siste}other{# v(k) siste}two{# vahku siste}',\n    },\n    NARROW:{\n      R:{'-1':'mannan vahku','0':'dán vahku','1':'boahtte vahku'},\n      P:'one{# vahkku dás ovdal}other{# v(k) dás ovdal}two{# vahku dás ovdal}',\n      F:'one{# v(k) geahčen}other{# v(k) geahčen}two{# v(k) geahčen}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'diibmá','0':'dán jagi','1':'boahtte jagi'},\n      P:'one{diibmá}other{# jagi dás ovdal}two{ovddet jagi}',\n      F:'one{# jagi siste}other{# jagi siste}two{# jagi siste}',\n    },\n    SHORT:{\n      R:{'0':'dán jagi','1':'boahtte jagi'},\n      P:'one{diibmá}other{# j. dás ovdal}two{ovddet jagi}',\n      F:'one{# j. siste}other{# j. siste}two{# jagi siste}',\n    },\n    NARROW:{\n      R:{'0':'dán jagi','1':'boahtte jagi'},\n      P:'one{# j. dás ovdal}other{# j. dás ovdal}two{# jagi dás ovdal}',\n      F:'one{# jagi siste}other{# jagi siste}two{# jagi siste}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_se_NO = exports.RelativeDateTimeSymbols_se;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_se_SE = exports.RelativeDateTimeSymbols_se;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_seh =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Zuro','0':'Lero','1':'Manguana'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_seh_MZ = exports.RelativeDateTimeSymbols_seh;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ses =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Bi','0':'Hõo','1':'Suba'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ses_ML = exports.RelativeDateTimeSymbols_ses;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sg =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Bîrï','0':'Lâsô','1':'Kêkerêke'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sg_CF = exports.RelativeDateTimeSymbols_sg;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_shi =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ⵉⴹⵍⵍⵉ','0':'ⴰⵙⵙⴰ','1':'ⴰⵙⴽⴽⴰ'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_shi_Latn =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'iḍlli','0':'assa','1':'askka'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_shi_Latn_MA =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'iḍlli','0':'assa','1':'askka'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_shi_Tfng = exports.RelativeDateTimeSymbols_shi;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_shi_Tfng_MA = exports.RelativeDateTimeSymbols_shi;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_si_LK = relativeDateTimeSymbols.RelativeDateTimeSymbols_si;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sk_SK = relativeDateTimeSymbols.RelativeDateTimeSymbols_sk;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sl_SI = relativeDateTimeSymbols.RelativeDateTimeSymbols_sl;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_smn =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_smn_FI = exports.RelativeDateTimeSymbols_smn;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sn =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Nezuro','0':'Nhasi','1':'Mangwana'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sn_ZW = exports.RelativeDateTimeSymbols_sn;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_so =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Shalay','0':'Maanta','1':'Berri'},\n      P:'one{# maalin kahor}other{# maalmood kahor}',\n      F:'one{# maalin}other{# maalmood}',\n    },\n    SHORT:{\n      R:{'-1':'Shalay','0':'Maanta','1':'Berri'},\n      P:'one{# mln khr}other{# mlmd khr}',\n      F:'one{# mln}other{# mlmd}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'Saacadan'},\n      P:'one{# saacad kahor}other{# saacadood kahor}',\n      F:'one{# saacad}other{# saacadood}',\n    },\n    SHORT:{\n      R:{'0':'Saacadan'},\n      P:'one{# scd khr}other{# scd khr}',\n      F:'one{# scd}other{# scd}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'Daqiiqadan'},\n      P:'one{# daqiiqad kahor}other{# daqiiqadood kahor}',\n      F:'one{# daqiiqad}other{# daqiidadood}',\n    },\n    SHORT:{\n      R:{'0':'Daqiiqadan'},\n      P:'one{# dqqd khr}other{# dqqd khr}',\n      F:'one{# dqqd}other{# dqqd}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'Bishii hore','0':'Bishan','1':'Bisha danbe'},\n      P:'one{# bil kahor}other{# bilood kahor}',\n      F:'one{# bil}other{# bilood}',\n    },\n    SHORT:{\n      R:{'-1':'Bishii hore','0':'Bishan','1':'Bisha danbe'},\n      P:'one{# bil khr}other{# bil khr}',\n      F:'one{# bil}other{# bil}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'Rubucii hore','0':'Rubucan','1':'Rubuca danbe'},\n      P:'one{# rubuc kahor}other{# rubuc kahor}',\n      F:'one{# rubuc}other{# rubuc}',\n    },\n    SHORT:{\n      R:{'-1':'Rubucii hore','0':'Rubucan','1':'Rubuca danbe'},\n      P:'one{# rbc khr}other{# rbc khr}',\n      F:'one{# rbc}other{# rbc}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'Imika'},\n      P:'one{# ilbiriqsi kahor}other{# ilbiriqsi kahor}',\n      F:'one{# ilbiriqsi}other{# ilbiriqsi}',\n    },\n    SHORT:{\n      R:{'0':'Imika'},\n      P:'one{# ilbrqsi khr}other{# ilbrqsi khr}',\n      F:'one{# ilbrqsi}other{# ilbrqsi}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'Toddobaadkii hore','0':'Usbuucan','1':'Toddobaadka danbe'},\n      P:'one{# toddobaad kahor}other{# toddobaad kahor}',\n      F:'one{# toddobaad}other{# toddobaad}',\n    },\n    SHORT:{\n      R:{'-1':'Toddobaadkii hore','0':'Usbuucan','1':'Toddobaadka danbe'},\n      P:'one{# tdbd khr}other{# tdbd khr}',\n      F:'one{# tdbd}other{# tdbd}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'Sannadkii hore','0':'Sannadkan','1':'Sannadka danbe'},\n      P:'one{# sannad kahor}other{# sannadood kahor}',\n      F:'one{# sannad}other{# sannadood}',\n    },\n    SHORT:{\n      R:{'-1':'Sannadkii hore','0':'Sannadkan','1':'Sannadka danbe'},\n      P:'one{# snd khr}other{# Snd khr}',\n      F:'one{# snd}other{# snd}',\n    },\n    NARROW:{\n      R:{'-1':'Sannadkii la soo dhaafay','0':'Sannadkan','1':'Sannadka xiga'},\n      P:'one{# snd khr}other{# Snd khr}',\n      F:'one{# snd}other{# snd}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_so_DJ = exports.RelativeDateTimeSymbols_so;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_so_ET = exports.RelativeDateTimeSymbols_so;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_so_KE = exports.RelativeDateTimeSymbols_so;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_so_SO = exports.RelativeDateTimeSymbols_so;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sq_AL = relativeDateTimeSymbols.RelativeDateTimeSymbols_sq;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sq_MK = relativeDateTimeSymbols.RelativeDateTimeSymbols_sq;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sq_XK = relativeDateTimeSymbols.RelativeDateTimeSymbols_sq;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sr_Cyrl = relativeDateTimeSymbols.RelativeDateTimeSymbols_sr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sr_Cyrl_BA =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'јуче','-2':'прекјуче','0':'данас','1':'сутра','2':'прекосутра'},\n      P:'few{пре # дана}one{пре # дана}other{пре # дана}',\n      F:'few{за # дана}one{за # дан}other{за # дана}',\n    },\n    SHORT:{\n      R:{'-1':'јуче','-2':'прекјуче','0':'данас','1':'сутра','2':'прекосутра'},\n      P:'few{пре # д.}one{пре # д.}other{пре # д.}',\n      F:'few{за # д.}one{за # д.}other{за # д.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'овог сата'},\n      P:'few{пре # сата}one{пре # сата}other{пре # сати}',\n      F:'few{за # сата}one{за # сат}other{за # сати}',\n    },\n    SHORT:{\n      R:{'0':'овог сата'},\n      P:'few{пре # ч.}one{пре # ч.}other{пре # ч.}',\n      F:'few{за # ч.}one{за # ч.}other{за # ч.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'овог минута'},\n      P:'few{пре # минута}one{пре # минута}other{пре # минута}',\n      F:'few{за # минута}one{за # минут}other{за # минута}',\n    },\n    SHORT:{\n      R:{'0':'овог минута'},\n      P:'few{пре # мин.}one{пре # мин.}other{пре # мин.}',\n      F:'few{за # мин.}one{за # мин.}other{за # мин.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'прошлог месеца','0':'овог месеца','1':'следећег месеца'},\n      P:'few{пре # месеца}one{пре # месеца}other{пре # месеци}',\n      F:'few{за # месеца}one{за # месец}other{за # месеци}',\n    },\n    SHORT:{\n      R:{'-1':'прошлог мес.','0':'овог мес.','1':'следећег мес.'},\n      P:'few{пре # мес.}one{пре # мес.}other{пре # мес.}',\n      F:'few{за # мес.}one{за # мес.}other{за # мес.}',\n    },\n    NARROW:{\n      R:{'-1':'прошлог м.','0':'овог м.','1':'следећег м.'},\n      P:'few{пре # м.}one{пре # м.}other{пре # м.}',\n      F:'few{за # м.}one{за # м.}other{за # м.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'прошлог квартала','0':'овог квартала','1':'следећег квартала'},\n      P:'few{пре # квартала}one{пре # квартала}other{пре # квартала}',\n      F:'few{за # квартала}one{за # квартал}other{за # квартала}',\n    },\n    SHORT:{\n      R:{'-1':'прошлог квартала','0':'овог квартала','1':'следећег квартала'},\n      P:'few{пре # кв.}one{пре # кв.}other{пре # кв.}',\n      F:'few{за # кв.}one{за # кв.}other{за # кв.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'сада'},\n      P:'few{пре # секунде}one{пре # секунде}other{пре # секунди}',\n      F:'few{за # секунде}one{за # секунду}other{за # секунди}',\n    },\n    SHORT:{\n      R:{'0':'сада'},\n      P:'few{пре # сек.}one{пре # сек.}other{пре # сек.}',\n      F:'few{за # сек.}one{за # сек.}other{за # сек.}',\n    },\n    NARROW:{\n      R:{'0':'сада'},\n      P:'few{пре # с.}one{пре # с.}other{пре # с.}',\n      F:'few{за # с.}one{за # с.}other{за # с.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'претходне недеље','1':'наредне недеље'},\n      P:'few{пре # недеље}one{пре # недеље}other{пре # недеља}',\n      F:'few{за # недеље}one{за # недељу}other{за # недеља}',\n    },\n    SHORT:{\n      R:{'-1':'прошле нед.','0':'ове нед.','1':'следеће нед.'},\n      P:'few{пре # нед.}one{пре # нед.}other{пре # нед.}',\n      F:'few{за # нед.}one{за # нед.}other{за # нед.}',\n    },\n    NARROW:{\n      R:{'-1':'прошле н.','0':'ове н.','1':'следеће н.'},\n      P:'few{пре # н.}one{пре # н.}other{пре # н.}',\n      F:'few{за # н.}one{за # н.}other{за # н.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'прошле године','0':'ове године','1':'следеће године'},\n      P:'few{пре # године}one{пре # године}other{пре # година}',\n      F:'few{за # године}one{за # годину}other{за # година}',\n    },\n    SHORT:{\n      R:{'-1':'прошле год.','0':'ове год.','1':'следеће год.'},\n      P:'few{пре # год.}one{пре # год.}other{пре # год.}',\n      F:'few{за # год.}one{за # год.}other{за # год.}',\n    },\n    NARROW:{\n      R:{'-1':'прошле г.','0':'ове г.','1':'следеће г.'},\n      P:'few{пре # г.}one{пре # г.}other{пре # г.}',\n      F:'few{за # г.}one{за # г.}other{за # г.}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sr_Cyrl_ME = relativeDateTimeSymbols.RelativeDateTimeSymbols_sr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sr_Cyrl_RS = relativeDateTimeSymbols.RelativeDateTimeSymbols_sr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sr_Cyrl_XK = relativeDateTimeSymbols.RelativeDateTimeSymbols_sr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sr_Latn_BA =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'juče','-2':'prekjuče','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{pre # dana}one{pre # dana}other{pre # dana}',\n      F:'few{za # dana}one{za # dan}other{za # dana}',\n    },\n    SHORT:{\n      R:{'-1':'juče','-2':'prekjuče','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{pre # d.}one{pre # d.}other{pre # d.}',\n      F:'few{za # d.}one{za # d.}other{za # d.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ovog sata'},\n      P:'few{pre # sata}one{pre # sata}other{pre # sati}',\n      F:'few{za # sata}one{za # sat}other{za # sati}',\n    },\n    SHORT:{\n      R:{'0':'ovog sata'},\n      P:'few{pre # č.}one{pre # č.}other{pre # č.}',\n      F:'few{za # č.}one{za # č.}other{za # č.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ovog minuta'},\n      P:'few{pre # minuta}one{pre # minuta}other{pre # minuta}',\n      F:'few{za # minuta}one{za # minut}other{za # minuta}',\n    },\n    SHORT:{\n      R:{'0':'ovog minuta'},\n      P:'few{pre # min.}one{pre # min.}other{pre # min.}',\n      F:'few{za # min.}one{za # min.}other{za # min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'prošlog meseca','0':'ovog meseca','1':'sledećeg meseca'},\n      P:'few{pre # meseca}one{pre # meseca}other{pre # meseci}',\n      F:'few{za # meseca}one{za # mesec}other{za # meseci}',\n    },\n    SHORT:{\n      R:{'-1':'prošlog mes.','0':'ovog mes.','1':'sledećeg mes.'},\n      P:'few{pre # mes.}one{pre # mes.}other{pre # mes.}',\n      F:'few{za # mes.}one{za # mes.}other{za # mes.}',\n    },\n    NARROW:{\n      R:{'-1':'prošlog m.','0':'ovog m.','1':'sledećeg m.'},\n      P:'few{pre # m.}one{pre # m.}other{pre # m.}',\n      F:'few{za # m.}one{za # m.}other{za # m.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'prošlog kvartala','0':'ovog kvartala','1':'sledećeg kvartala'},\n      P:'few{pre # kvartala}one{pre # kvartala}other{pre # kvartala}',\n      F:'few{za # kvartala}one{za # kvartal}other{za # kvartala}',\n    },\n    SHORT:{\n      R:{'-1':'prošlog kvartala','0':'ovog kvartala','1':'sledećeg kvartala'},\n      P:'few{pre # kv.}one{pre # kv.}other{pre # kv.}',\n      F:'few{za # kv.}one{za # kv.}other{za # kv.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'sada'},\n      P:'few{pre # sekunde}one{pre # sekunde}other{pre # sekundi}',\n      F:'few{za # sekunde}one{za # sekundu}other{za # sekundi}',\n    },\n    SHORT:{\n      R:{'0':'sada'},\n      P:'few{pre # sek.}one{pre # sek.}other{pre # sek.}',\n      F:'few{za # sek.}one{za # sek.}other{za # sek.}',\n    },\n    NARROW:{\n      R:{'0':'sada'},\n      P:'few{pre # s.}one{pre # s.}other{pre # s.}',\n      F:'few{za # s.}one{za # s.}other{za # s.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'prethodne nedelje','1':'naredne nedelje'},\n      P:'few{pre # nedelje}one{pre # nedelje}other{pre # nedelja}',\n      F:'few{za # nedelje}one{za # nedelju}other{za # nedelja}',\n    },\n    SHORT:{\n      R:{'-1':'prošle ned.','0':'ove ned.','1':'sledeće ned.'},\n      P:'few{pre # ned.}one{pre # ned.}other{pre # ned.}',\n      F:'few{za # ned.}one{za # ned.}other{za # ned.}',\n    },\n    NARROW:{\n      R:{'-1':'prošle n.','0':'ove n.','1':'sledeće n.'},\n      P:'few{pre # n.}one{pre # n.}other{pre # n.}',\n      F:'few{za # n.}one{za # n.}other{za # n.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'prošle godine','0':'ove godine','1':'sledeće godine'},\n      P:'few{pre # godine}one{pre # godine}other{pre # godina}',\n      F:'few{za # godine}one{za # godinu}other{za # godina}',\n    },\n    SHORT:{\n      R:{'-1':'prošle god.','0':'ove god.','1':'sledeće god.'},\n      P:'few{pre # god.}one{pre # god.}other{pre # god.}',\n      F:'few{za # god.}one{za # god.}other{za # god.}',\n    },\n    NARROW:{\n      R:{'-1':'prošle g.','0':'ove g.','1':'sledeće g.'},\n      P:'few{pre # g.}one{pre # g.}other{pre # g.}',\n      F:'few{za # g.}one{za # g.}other{za # g.}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sr_Latn_ME =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'juče','-2':'prekjuče','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{pre # dana}one{pre # dana}other{pre # dana}',\n      F:'few{za # dana}one{za # dan}other{za # dana}',\n    },\n    SHORT:{\n      R:{'-1':'juče','-2':'prekjuče','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{pre # d.}one{pre # d.}other{pre # d.}',\n      F:'few{za # d.}one{za # d.}other{za # d.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ovog sata'},\n      P:'few{pre # sata}one{pre # sata}other{pre # sati}',\n      F:'few{za # sata}one{za # sat}other{za # sati}',\n    },\n    SHORT:{\n      R:{'0':'ovog sata'},\n      P:'few{pre # č.}one{pre # č.}other{pre # č.}',\n      F:'few{za # č.}one{za # č.}other{za # č.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ovog minuta'},\n      P:'few{pre # minuta}one{pre # minuta}other{pre # minuta}',\n      F:'few{za # minuta}one{za # minut}other{za # minuta}',\n    },\n    SHORT:{\n      R:{'0':'ovog minuta'},\n      P:'few{pre # min.}one{pre # min.}other{pre # min.}',\n      F:'few{za # min.}one{za # min.}other{za # min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'prošlog meseca','0':'ovog meseca','1':'sledećeg meseca'},\n      P:'few{pre # meseca}one{pre # meseca}other{pre # meseci}',\n      F:'few{za # meseca}one{za # mesec}other{za # meseci}',\n    },\n    SHORT:{\n      R:{'-1':'prošlog mes.','0':'ovog mes.','1':'sledećeg mes.'},\n      P:'few{pre # mes.}one{pre # mes.}other{pre # mes.}',\n      F:'few{za # mes.}one{za # mes.}other{za # mes.}',\n    },\n    NARROW:{\n      R:{'-1':'prošlog m.','0':'ovog m.','1':'sledećeg m.'},\n      P:'few{pre # m.}one{pre # m.}other{pre # m.}',\n      F:'few{za # m.}one{za # m.}other{za # m.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'prošlog kvartala','0':'ovog kvartala','1':'sledećeg kvartala'},\n      P:'few{pre # kvartala}one{pre # kvartala}other{pre # kvartala}',\n      F:'few{za # kvartala}one{za # kvartal}other{za # kvartala}',\n    },\n    SHORT:{\n      R:{'-1':'prošlog kvartala','0':'ovog kvartala','1':'sledećeg kvartala'},\n      P:'few{pre # kv.}one{pre # kv.}other{pre # kv.}',\n      F:'few{za # kv.}one{za # kv.}other{za # kv.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'sada'},\n      P:'few{pre # sekunde}one{pre # sekunde}other{pre # sekundi}',\n      F:'few{za # sekunde}one{za # sekundu}other{za # sekundi}',\n    },\n    SHORT:{\n      R:{'0':'sada'},\n      P:'few{pre # sek.}one{pre # sek.}other{pre # sek.}',\n      F:'few{za # sek.}one{za # sek.}other{za # sek.}',\n    },\n    NARROW:{\n      R:{'0':'sada'},\n      P:'few{pre # s.}one{pre # s.}other{pre # s.}',\n      F:'few{za # s.}one{za # s.}other{za # s.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'prošle nedelje','0':'ove nedelje','1':'sledeće nedelje'},\n      P:'few{pre # nedelje}one{pre # nedelje}other{pre # nedelja}',\n      F:'few{za # nedelje}one{za # nedelju}other{za # nedelja}',\n    },\n    SHORT:{\n      R:{'-1':'prošle ned.','0':'ove ned.','1':'sledeće ned.'},\n      P:'few{pre # ned.}one{pre # ned.}other{pre # ned.}',\n      F:'few{za # ned.}one{za # ned.}other{za # ned.}',\n    },\n    NARROW:{\n      R:{'-1':'prošle n.','0':'ove n.','1':'sledeće n.'},\n      P:'few{pre # n.}one{pre # n.}other{pre # n.}',\n      F:'few{za # n.}one{za # n.}other{za # n.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'prošle godine','0':'ove godine','1':'sledeće godine'},\n      P:'few{pre # godine}one{pre # godine}other{pre # godina}',\n      F:'few{za # godine}one{za # godinu}other{za # godina}',\n    },\n    SHORT:{\n      R:{'-1':'prošle god.','0':'ove god.','1':'sledeće god.'},\n      P:'few{pre # god.}one{pre # god.}other{pre # god.}',\n      F:'few{za # god.}one{za # god.}other{za # god.}',\n    },\n    NARROW:{\n      R:{'-1':'prošle g.','0':'ove g.','1':'sledeće g.'},\n      P:'few{pre # g.}one{pre # g.}other{pre # g.}',\n      F:'few{za # g.}one{za # g.}other{za # g.}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sr_Latn_RS =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'juče','-2':'prekjuče','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{pre # dana}one{pre # dana}other{pre # dana}',\n      F:'few{za # dana}one{za # dan}other{za # dana}',\n    },\n    SHORT:{\n      R:{'-1':'juče','-2':'prekjuče','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{pre # d.}one{pre # d.}other{pre # d.}',\n      F:'few{za # d.}one{za # d.}other{za # d.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ovog sata'},\n      P:'few{pre # sata}one{pre # sata}other{pre # sati}',\n      F:'few{za # sata}one{za # sat}other{za # sati}',\n    },\n    SHORT:{\n      R:{'0':'ovog sata'},\n      P:'few{pre # č.}one{pre # č.}other{pre # č.}',\n      F:'few{za # č.}one{za # č.}other{za # č.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ovog minuta'},\n      P:'few{pre # minuta}one{pre # minuta}other{pre # minuta}',\n      F:'few{za # minuta}one{za # minut}other{za # minuta}',\n    },\n    SHORT:{\n      R:{'0':'ovog minuta'},\n      P:'few{pre # min.}one{pre # min.}other{pre # min.}',\n      F:'few{za # min.}one{za # min.}other{za # min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'prošlog meseca','0':'ovog meseca','1':'sledećeg meseca'},\n      P:'few{pre # meseca}one{pre # meseca}other{pre # meseci}',\n      F:'few{za # meseca}one{za # mesec}other{za # meseci}',\n    },\n    SHORT:{\n      R:{'-1':'prošlog mes.','0':'ovog mes.','1':'sledećeg mes.'},\n      P:'few{pre # mes.}one{pre # mes.}other{pre # mes.}',\n      F:'few{za # mes.}one{za # mes.}other{za # mes.}',\n    },\n    NARROW:{\n      R:{'-1':'prošlog m.','0':'ovog m.','1':'sledećeg m.'},\n      P:'few{pre # m.}one{pre # m.}other{pre # m.}',\n      F:'few{za # m.}one{za # m.}other{za # m.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'prošlog kvartala','0':'ovog kvartala','1':'sledećeg kvartala'},\n      P:'few{pre # kvartala}one{pre # kvartala}other{pre # kvartala}',\n      F:'few{za # kvartala}one{za # kvartal}other{za # kvartala}',\n    },\n    SHORT:{\n      R:{'-1':'prošlog kvartala','0':'ovog kvartala','1':'sledećeg kvartala'},\n      P:'few{pre # kv.}one{pre # kv.}other{pre # kv.}',\n      F:'few{za # kv.}one{za # kv.}other{za # kv.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'sada'},\n      P:'few{pre # sekunde}one{pre # sekunde}other{pre # sekundi}',\n      F:'few{za # sekunde}one{za # sekundu}other{za # sekundi}',\n    },\n    SHORT:{\n      R:{'0':'sada'},\n      P:'few{pre # sek.}one{pre # sek.}other{pre # sek.}',\n      F:'few{za # sek.}one{za # sek.}other{za # sek.}',\n    },\n    NARROW:{\n      R:{'0':'sada'},\n      P:'few{pre # s.}one{pre # s.}other{pre # s.}',\n      F:'few{za # s.}one{za # s.}other{za # s.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'prošle nedelje','0':'ove nedelje','1':'sledeće nedelje'},\n      P:'few{pre # nedelje}one{pre # nedelje}other{pre # nedelja}',\n      F:'few{za # nedelje}one{za # nedelju}other{za # nedelja}',\n    },\n    SHORT:{\n      R:{'-1':'prošle ned.','0':'ove ned.','1':'sledeće ned.'},\n      P:'few{pre # ned.}one{pre # ned.}other{pre # ned.}',\n      F:'few{za # ned.}one{za # ned.}other{za # ned.}',\n    },\n    NARROW:{\n      R:{'-1':'prošle n.','0':'ove n.','1':'sledeće n.'},\n      P:'few{pre # n.}one{pre # n.}other{pre # n.}',\n      F:'few{za # n.}one{za # n.}other{za # n.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'prošle godine','0':'ove godine','1':'sledeće godine'},\n      P:'few{pre # godine}one{pre # godine}other{pre # godina}',\n      F:'few{za # godine}one{za # godinu}other{za # godina}',\n    },\n    SHORT:{\n      R:{'-1':'prošle god.','0':'ove god.','1':'sledeće god.'},\n      P:'few{pre # god.}one{pre # god.}other{pre # god.}',\n      F:'few{za # god.}one{za # god.}other{za # god.}',\n    },\n    NARROW:{\n      R:{'-1':'prošle g.','0':'ove g.','1':'sledeće g.'},\n      P:'few{pre # g.}one{pre # g.}other{pre # g.}',\n      F:'few{za # g.}one{za # g.}other{za # g.}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sr_Latn_XK =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'juče','-2':'prekjuče','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{pre # dana}one{pre # dana}other{pre # dana}',\n      F:'few{za # dana}one{za # dan}other{za # dana}',\n    },\n    SHORT:{\n      R:{'-1':'juče','-2':'prekjuče','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{pre # d.}one{pre # d.}other{pre # d.}',\n      F:'few{za # d.}one{za # d.}other{za # d.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ovog sata'},\n      P:'few{pre # sata}one{pre # sata}other{pre # sati}',\n      F:'few{za # sata}one{za # sat}other{za # sati}',\n    },\n    SHORT:{\n      R:{'0':'ovog sata'},\n      P:'few{pre # č.}one{pre # č.}other{pre # č.}',\n      F:'few{za # č.}one{za # č.}other{za # č.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ovog minuta'},\n      P:'few{pre # minuta}one{pre # minuta}other{pre # minuta}',\n      F:'few{za # minuta}one{za # minut}other{za # minuta}',\n    },\n    SHORT:{\n      R:{'0':'ovog minuta'},\n      P:'few{pre # min.}one{pre # min.}other{pre # min.}',\n      F:'few{za # min.}one{za # min.}other{za # min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'prošlog meseca','0':'ovog meseca','1':'sledećeg meseca'},\n      P:'few{pre # meseca}one{pre # meseca}other{pre # meseci}',\n      F:'few{za # meseca}one{za # mesec}other{za # meseci}',\n    },\n    SHORT:{\n      R:{'-1':'prošlog mes.','0':'ovog mes.','1':'sledećeg mes.'},\n      P:'few{pre # mes.}one{pre # mes.}other{pre # mes.}',\n      F:'few{za # mes.}one{za # mes.}other{za # mes.}',\n    },\n    NARROW:{\n      R:{'-1':'prošlog m.','0':'ovog m.','1':'sledećeg m.'},\n      P:'few{pre # m.}one{pre # m.}other{pre # m.}',\n      F:'few{za # m.}one{za # m.}other{za # m.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'prošlog kvartala','0':'ovog kvartala','1':'sledećeg kvartala'},\n      P:'few{pre # kvartala}one{pre # kvartala}other{pre # kvartala}',\n      F:'few{za # kvartala}one{za # kvartal}other{za # kvartala}',\n    },\n    SHORT:{\n      R:{'-1':'prošlog kvartala','0':'ovog kvartala','1':'sledećeg kvartala'},\n      P:'few{pre # kv.}one{pre # kv.}other{pre # kv.}',\n      F:'few{za # kv.}one{za # kv.}other{za # kv.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'sada'},\n      P:'few{pre # sekunde}one{pre # sekunde}other{pre # sekundi}',\n      F:'few{za # sekunde}one{za # sekundu}other{za # sekundi}',\n    },\n    SHORT:{\n      R:{'0':'sada'},\n      P:'few{pre # sek.}one{pre # sek.}other{pre # sek.}',\n      F:'few{za # sek.}one{za # sek.}other{za # sek.}',\n    },\n    NARROW:{\n      R:{'0':'sada'},\n      P:'few{pre # s.}one{pre # s.}other{pre # s.}',\n      F:'few{za # s.}one{za # s.}other{za # s.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'prošle nedelje','0':'ove nedelje','1':'sledeće nedelje'},\n      P:'few{pre # nedelje}one{pre # nedelje}other{pre # nedelja}',\n      F:'few{za # nedelje}one{za # nedelju}other{za # nedelja}',\n    },\n    SHORT:{\n      R:{'-1':'prošle ned.','0':'ove ned.','1':'sledeće ned.'},\n      P:'few{pre # ned.}one{pre # ned.}other{pre # ned.}',\n      F:'few{za # ned.}one{za # ned.}other{za # ned.}',\n    },\n    NARROW:{\n      R:{'-1':'prošle n.','0':'ove n.','1':'sledeće n.'},\n      P:'few{pre # n.}one{pre # n.}other{pre # n.}',\n      F:'few{za # n.}one{za # n.}other{za # n.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'prošle godine','0':'ove godine','1':'sledeće godine'},\n      P:'few{pre # godine}one{pre # godine}other{pre # godina}',\n      F:'few{za # godine}one{za # godinu}other{za # godina}',\n    },\n    SHORT:{\n      R:{'-1':'prošle god.','0':'ove god.','1':'sledeće god.'},\n      P:'few{pre # god.}one{pre # god.}other{pre # god.}',\n      F:'few{za # god.}one{za # god.}other{za # god.}',\n    },\n    NARROW:{\n      R:{'-1':'prošle g.','0':'ove g.','1':'sledeće g.'},\n      P:'few{pre # g.}one{pre # g.}other{pre # g.}',\n      F:'few{za # g.}one{za # g.}other{za # g.}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sv_AX = relativeDateTimeSymbols.RelativeDateTimeSymbols_sv;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sv_FI = relativeDateTimeSymbols.RelativeDateTimeSymbols_sv;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sv_SE = relativeDateTimeSymbols.RelativeDateTimeSymbols_sv;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sw_CD = relativeDateTimeSymbols.RelativeDateTimeSymbols_sw;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sw_KE = relativeDateTimeSymbols.RelativeDateTimeSymbols_sw;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sw_TZ = relativeDateTimeSymbols.RelativeDateTimeSymbols_sw;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sw_UG = relativeDateTimeSymbols.RelativeDateTimeSymbols_sw;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ta_IN = relativeDateTimeSymbols.RelativeDateTimeSymbols_ta;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ta_LK = relativeDateTimeSymbols.RelativeDateTimeSymbols_ta;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ta_MY = relativeDateTimeSymbols.RelativeDateTimeSymbols_ta;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ta_SG = relativeDateTimeSymbols.RelativeDateTimeSymbols_ta;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_te_IN = relativeDateTimeSymbols.RelativeDateTimeSymbols_te;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_teo =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Jaan','0':'Lolo','1':'Moi'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_teo_KE = exports.RelativeDateTimeSymbols_teo;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_teo_UG = exports.RelativeDateTimeSymbols_teo;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_tg =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'дирӯз','0':'имрӯз','1':'фардо'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_tg_TJ = exports.RelativeDateTimeSymbols_tg;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_th_TH = relativeDateTimeSymbols.RelativeDateTimeSymbols_th;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ti =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ትማሊ','0':'ሎሚ','1':'ጽባሕ'},\n      P:'one{ቅድሚ # መዓልቲ}other{ኣብ # መዓልቲ}',\n      F:'one{ኣብ # መዓልቲ}other{ኣብ # መዓልቲ}',\n    },\n    SHORT:{\n      R:{'-1':'ትማሊ','0':'ሎሚ','1':'ጽባሕ'},\n      P:'one{ቅድሚ # መዓልቲ}other{ቅድሚ # መዓልቲ}',\n      F:'one{ኣብ # መዓልቲ}other{ኣብ # መዓልቲ}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ኣብዚ ሰዓት'},\n      P:'one{ቅድሚ # ሰዓት}other{ቅድሚ # ሰዓት}',\n      F:'one{ኣብ # ሰዓት}other{ኣብ # ሰዓት}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ኣብዚ ደቒቕ'},\n      P:'one{ቅድሚ # ደቒቕ}other{ቅድሚ # ደቒቕ}',\n      F:'one{ኣብ # ደቒቕ}other{ኣብ # ደቒቕ}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'ህሉው ወርሒ','1':'ዝመጽእ ወርሒ'},\n      P:'one{ቅድሚ # ወርሒ}other{ቅድሚ # ወርሒ}',\n      F:'one{ኣብ # ወርሒ}other{ኣብ # ወርሒ}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'ዝሓለፈ ርብዒ','0':'ህሉው ርብዒ','1':'ዝመጽእ ርብዒ'},\n      P:'one{ቅድሚ # ርብዒ}other{ቅድሚ # ርብዒ}',\n      F:'one{ኣብ # ርብዒ}other{ኣብ # ርብዒ}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ሕጂ'},\n      P:'one{ቅድሚ # ካልኢት}other{ቅድሚ # ካልኢት}',\n      F:'one{ኣብ # ካልኢት}other{ኣብ # ካልኢት}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ዝሓለፈ ሰሙን','0':'ህሉው ሰሙን','1':'ዝመጽእ ሰሙን'},\n      P:'one{ቅድሚ # ሰሙን}other{ቅድሚ # ሰሙን}',\n      F:'one{ኣብ # ሰሙን}other{ኣብ # ሰሙን}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ዓሚ','0':'ሎሚ ዓመት','1':'ንዓመታ'},\n      P:'one{ቅድሚ # ዓ}other{ቅድሚ # ዓ}',\n      F:'one{ኣብ # ዓ}other{ኣብ # ዓ}',\n    },\n    SHORT:{\n      R:{'-1':'ዓሚ','0':'ሎሚ ዓመት','1':'ንዓመታ'},\n      P:'one{ቅድሚ -# ዓ}other{ቅድሚ # ዓ}',\n      F:'one{ኣብ # ዓ}other{ኣብ # ዓ}',\n    },\n    NARROW:{\n      R:{'-1':'ዓሚ','0':'ሎሚ ዓመት','1':'ንዓመታ'},\n      P:'one{ቅድሚ # ዓ}other{ቅድሚ # ዓ}',\n      F:'one{ኣብ # ዓ}other{ኣብ # ዓ}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ti_ER = exports.RelativeDateTimeSymbols_ti;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ti_ET = exports.RelativeDateTimeSymbols_ti;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_tk =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'düýn','0':'şu gün','1':'ertir'},\n      P:'one{# gün öň}other{# gün öň}',\n      F:'one{# günden}other{# günden}',\n    },\n    SHORT:{\n      R:{'-1':'düýn','0':'şu gün','1':'ertir'},\n      P:'one{# g. öň}other{# g. öň}',\n      F:'one{# g-den}other{# g-den}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'şu sagat'},\n      P:'one{# sagat öň}other{# sagat öň}',\n      F:'one{# sagatdan}other{# sagatdan}',\n    },\n    SHORT:{\n      R:{'0':'şu sagat'},\n      P:'one{# sag. öň}other{# sag. öň}',\n      F:'one{# sag-dan}other{# sag-dan}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'şu minut'},\n      P:'one{# minut öň}other{# minut öň}',\n      F:'one{# minutdan}other{# minutdan}',\n    },\n    SHORT:{\n      R:{'0':'şu minut'},\n      P:'one{# min. öň}other{# min. öň}',\n      F:'one{# min-dan}other{# min-dan}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'geçen aý','0':'şu aý','1':'indiki aý'},\n      P:'one{# aý öň}other{# aý öň}',\n      F:'one{# aýdan}other{# aýdan}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'geçen çärýek','0':'şu çärýek','1':'indiki çärýek'},\n      P:'one{# çärýek öň}other{# çärýek öň}',\n      F:'one{# çärýekden}other{# çärýekden}',\n    },\n    SHORT:{\n      R:{'-1':'geçen çärýek','0':'şu çärýek','1':'indiki çärýek'},\n      P:'one{# çär. öň}other{# çär. öň}',\n      F:'one{# çär-den}other{# çär-den}',\n    },\n    NARROW:{\n      R:{'-1':'geçen çärýek','0':'şu çärýek','1':'indiki çärýek'},\n      P:'one{# ç. öň}other{# ç. öň}',\n      F:'one{# ç-den}other{# ç-den}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'häzir'},\n      P:'one{# sekunt öň}other{# sekunt öň}',\n      F:'one{# sekuntdan}other{# sekuntdan}',\n    },\n    SHORT:{\n      R:{'0':'häzir'},\n      P:'one{# sek. öň}other{# sek. öň}',\n      F:'one{# sek-dan}other{# sek-dan}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'geçen hepde','0':'şu hepde','1':'indiki hepde'},\n      P:'one{# hepde öň}other{# hepde öň}',\n      F:'one{# hepdeden}other{# hepdeden}',\n    },\n    SHORT:{\n      R:{'-1':'geçen hepde','0':'şu hepde','1':'indiki hepde'},\n      P:'one{# hep. öň}other{# hep. öň}',\n      F:'one{# hep-den}other{# hep-den}',\n    },\n    NARROW:{\n      R:{'-1':'geçen hepde','0':'şu hepde','1':'indiki hepde'},\n      P:'one{# h. öň}other{# h. öň}',\n      F:'one{# h-den}other{# h-den}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'geçen ýyl','0':'şu ýyl','1':'indiki ýyl'},\n      P:'one{# ýyl öň}other{# ýyl öň}',\n      F:'one{# ýyldan}other{# ýyldan}',\n    },\n    SHORT:{\n      R:{'-1':'geçen ýyl','0':'şu ýyl','1':'indiki ýyl'},\n      P:'one{# ý. öň}other{# ý. öň}',\n      F:'one{# ý-dan}other{# ý-dan}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_tk_TM = exports.RelativeDateTimeSymbols_tk;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_to =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ʻaneafi','-2':'ʻaneheafi','0':'ʻahó ni','1':'ʻapongipongi','2':'ʻahepongipongi'},\n      P:'other{ʻaho ʻe # kuoʻosi}',\n      F:'other{ʻi he ʻaho ʻe #}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{houa ʻe # kuoʻosi}',\n      F:'other{ʻi he houa ʻe #}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{miniti ʻe # kuoʻosi}',\n      F:'other{ʻi he miniti ʻe #}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'māhina kuoʻosi','0':'māhiná ni','1':'māhina kahaʻu'},\n      P:'other{māhina ʻe # kuoʻosi}',\n      F:'other{ʻi he māhina ʻe #}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'kuata kuoʻosi','0':'kuata koʻeni','1':'kuata hoko'},\n      P:'other{kuata ʻe # kuoʻosi}',\n      F:'other{ʻi he kuata ʻe #}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'taimí ni'},\n      P:'other{sekoni ʻe # kuoʻosi}',\n      F:'other{ʻi he sekoni ʻe #}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'uike kuoʻosi','0':'uiké ni','1':'uike kahaʻu'},\n      P:'other{uike ʻe # kuoʻosi}',\n      F:'other{ʻi he uike ʻe #}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'taʻu kuoʻosi','0':'taʻú ni','1':'taʻu kahaʻu'},\n      P:'other{taʻu ʻe # kuoʻosi}',\n      F:'other{ʻi he taʻu ʻe #}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_to_TO = exports.RelativeDateTimeSymbols_to;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_tr_CY = relativeDateTimeSymbols.RelativeDateTimeSymbols_tr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_tr_TR = relativeDateTimeSymbols.RelativeDateTimeSymbols_tr;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_tt =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'кичә','0':'бүген','1':'иртәгә'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_tt_RU = exports.RelativeDateTimeSymbols_tt;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_twq =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Bi','0':'Hõo','1':'Suba'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_twq_NE = exports.RelativeDateTimeSymbols_twq;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_tzm =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Assenaṭ','0':'Assa','1':'Asekka'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_tzm_MA = exports.RelativeDateTimeSymbols_tzm;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ug =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'تۈنۈگۈن','0':'بۈگۈن','1':'ئەتە'},\n      P:'one{# كۈن ئىلگىرى}other{# كۈن ئىلگىرى}',\n      F:'one{# كۈندىن كېيىن}other{# كۈندىن كېيىن}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# سائەت ئىلگىرى}other{# سائەت ئىلگىرى}',\n      F:'one{# سائەتتىن كېيىن}other{# سائەتتىن كېيىن}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# مىنۇت ئىلگىرى}other{# مىنۇت ئىلگىرى}',\n      F:'one{# مىنۇتتىن كېيىن}other{# مىنۇتتىن كېيىن}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ئۆتكەن ئاي','0':'بۇ ئاي','1':'كېلەر ئاي'},\n      P:'one{# ئاي ئىلگىرى}other{# ئاي ئىلگىرى}',\n      F:'one{# ئايدىن كېيىن}other{# ئايدىن كېيىن}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# سېكۇنت ئىلگىرى}other{# سېكۇنت ئىلگىرى}',\n      F:'one{# سېكۇنتتىن كېيىن}other{# سېكۇنتتىن كېيىن}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ئۆتكەن ھەپتە','0':'بۇ ھەپتە','1':'كېلەر ھەپتە'},\n      P:'one{# ھەپتە ئىلگىرى}other{# ھەپتە ئىلگىرى}',\n      F:'one{# ھەپتىدىن كېيىن}other{# ھەپتىدىن كېيىن}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ئۆتكەن يىل','0':'بۇ يىل','1':'كېلەر يىل'},\n      P:'one{# يىل ئىلگىرى}other{# يىل ئىلگىرى}',\n      F:'one{# يىلدىن كېيىن}other{# يىلدىن كېيىن}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ug_CN = exports.RelativeDateTimeSymbols_ug;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_uk_UA = relativeDateTimeSymbols.RelativeDateTimeSymbols_uk;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ur_IN =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'گزشتہ کل','-2':'گزشتہ پرسوں','0':'آج','1':'آئندہ کل','2':'آنے والا پرسوں'},\n      P:'one{# دن پہلے}other{# دنوں پہلے}',\n      F:'one{# دن میں}other{# دنوں میں}',\n    },\n    SHORT:{\n      R:{'-1':'گزشتہ کل','-2':'گزشتہ پرسوں','0':'آج','1':'آئندہ کل','2':'آنے والا پرسوں'},\n      P:'one{# دن پہلے}other{# دنوں پہلے}',\n      F:'one{# دنوں میں}other{# دنوں میں}',\n    },\n    NARROW:{\n      R:{'-1':'گزشتہ کل','-2':'گزشتہ پرسوں','0':'آج','1':'آئندہ کل','2':'آنے والا پرسوں'},\n      P:'one{# دن قبل}other{# دن قبل}',\n      F:'one{# دن میں}other{# دنوں میں}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'اس گھنٹے'},\n      P:'one{# گھنٹہ پہلے}other{# گھنٹے پہلے}',\n      F:'one{# گھنٹے میں}other{# گھنٹے میں}',\n    },\n    SHORT:{\n      R:{'0':'اس گھنٹے'},\n      P:'one{# گھنٹے قبل}other{# گھنٹے قبل}',\n      F:'one{# گھنٹے میں}other{# گھنٹے میں}',\n    },\n    NARROW:{\n      R:{'0':'اس گھنٹے'},\n      P:'one{# گھنٹہ قبل}other{# گھنٹے قبل}',\n      F:'one{# گھنٹے میں}other{# گھنٹوں میں}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'اس منٹ'},\n      P:'one{# منٹ قبل}other{# منٹ قبل}',\n      F:'one{# منٹ میں}other{# منٹ میں}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'گزشتہ ماہ','0':'اس ماہ','1':'اگلے ماہ'},\n      P:'one{# ماہ قبل}other{# ماہ قبل}',\n      F:'one{# ماہ میں}other{# ماہ میں}',\n    },\n    SHORT:{\n      R:{'-1':'پچھلے مہینہ','0':'اس مہینہ','1':'اگلے مہینہ'},\n      P:'one{# ماہ قبل}other{# ماہ قبل}',\n      F:'one{# ماہ میں}other{# ماہ میں}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'گزشتہ سہ ماہی','0':'اس سہ ماہی','1':'اگلے سہ ماہی'},\n      P:'one{# سہ ماہی پہلے}other{# سہ ماہی پہلے}',\n      F:'one{# سہ ماہی میں}other{# سہ ماہی میں}',\n    },\n    SHORT:{\n      R:{'-1':'گزشتہ سہ ماہی','0':'اس سہ ماہی','1':'اگلے سہ ماہی'},\n      P:'one{# سہ ماہی قبل}other{# سہ ماہی قبل}',\n      F:'one{# سہ ماہی میں}other{# سہ ماہی میں}',\n    },\n    NARROW:{\n      R:{'-1':'گزشتہ سہ ماہی','0':'اس سہ ماہی','1':'اگلے سہ ماہی'},\n      P:'one{# سہ ماہی پہلے}other{# سہ ماہی پہلے}',\n      F:'one{# سہ ماہی میں}other{# سہ ماہی میں}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'اب'},\n      P:'one{# سیکنڈ قبل}other{# سیکنڈ قبل}',\n      F:'one{# سیکنڈ میں}other{# سیکنڈ میں}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'گزشتہ ہفتہ','0':'اس ہفتہ','1':'اگلے ہفتہ'},\n      P:'one{# ہفتہ قبل}other{# ہفتے قبل}',\n      F:'one{# ہفتہ میں}other{# ہفتوں میں}',\n    },\n    SHORT:{\n      R:{'-1':'پچھلے ہفتہ','0':'اس ہفتہ','1':'اگلے ہفتہ'},\n      P:'one{# ہفتے قبل}other{# ہفتے قبل}',\n      F:'one{# ہفتے میں}other{# ہفتے میں}',\n    },\n    NARROW:{\n      R:{'-1':'پچھلے ہفتہ','0':'اس ہفتہ','1':'اگلے ہفتہ'},\n      P:'one{# ہفتہ قبل}other{# ہفتے قبل}',\n      F:'one{# ہفتہ میں}other{# ہفتے میں}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'گزشتہ سال','0':'اس سال','1':'اگلے سال'},\n      P:'one{# سال پہلے}other{# سال پہلے}',\n      F:'one{# سال میں}other{# سالوں میں}',\n    },\n    SHORT:{\n      R:{'-1':'گزشتہ سال','0':'اس سال','1':'اگلے سال'},\n      P:'one{# سال پہلے}other{# سالوں پہلے}',\n      F:'one{# سال میں}other{# سالوں میں}',\n    },\n    NARROW:{\n      R:{'-1':'گزشتہ سال','0':'اس سال','1':'اگلے سال'},\n      P:'one{# سال پہلے}other{# سال پہلے}',\n      F:'one{# سال میں}other{# سال میں}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ur_PK = relativeDateTimeSymbols.RelativeDateTimeSymbols_ur;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_uz_Arab =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_uz_Arab_AF =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_uz_Cyrl =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'кеча','0':'бугун','1':'эртага'},\n      P:'one{# кун олдин}other{# кун олдин}',\n      F:'one{# кундан сўнг}other{# кундан сўнг}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# соат олдин}other{# соат олдин}',\n      F:'one{# соатдан сўнг}other{# соатдан сўнг}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# дақиқа олдин}other{# дақиқа олдин}',\n      F:'one{# дақиқадан сўнг}other{# дақиқадан сўнг}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ўтган ой','0':'бу ой','1':'кейинги ой'},\n      P:'one{# ой аввал}other{# ой аввал}',\n      F:'one{# ойдан сўнг}other{# ойдан сўнг}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ҳозир'},\n      P:'one{# сония олдин}other{# сония олдин}',\n      F:'one{# сониядан сўнг}other{# сониядан сўнг}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ўтган ҳафта','0':'бу ҳафта','1':'кейинги ҳафта'},\n      P:'one{# ҳафта олдин}other{# ҳафта олдин}',\n      F:'one{# ҳафтадан сўнг}other{# ҳафтадан сўнг}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ўтган йил','0':'бу йил','1':'кейинги йил'},\n      P:'one{# йил аввал}other{# йил аввал}',\n      F:'one{# йилдан сўнг}other{# йилдан сўнг}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_uz_Cyrl_UZ =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'кеча','0':'бугун','1':'эртага'},\n      P:'one{# кун олдин}other{# кун олдин}',\n      F:'one{# кундан сўнг}other{# кундан сўнг}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# соат олдин}other{# соат олдин}',\n      F:'one{# соатдан сўнг}other{# соатдан сўнг}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# дақиқа олдин}other{# дақиқа олдин}',\n      F:'one{# дақиқадан сўнг}other{# дақиқадан сўнг}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ўтган ой','0':'бу ой','1':'кейинги ой'},\n      P:'one{# ой аввал}other{# ой аввал}',\n      F:'one{# ойдан сўнг}other{# ойдан сўнг}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ҳозир'},\n      P:'one{# сония олдин}other{# сония олдин}',\n      F:'one{# сониядан сўнг}other{# сониядан сўнг}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ўтган ҳафта','0':'бу ҳафта','1':'кейинги ҳафта'},\n      P:'one{# ҳафта олдин}other{# ҳафта олдин}',\n      F:'one{# ҳафтадан сўнг}other{# ҳафтадан сўнг}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ўтган йил','0':'бу йил','1':'кейинги йил'},\n      P:'one{# йил аввал}other{# йил аввал}',\n      F:'one{# йилдан сўнг}other{# йилдан сўнг}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_uz_Latn = relativeDateTimeSymbols.RelativeDateTimeSymbols_uz;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_uz_Latn_UZ = relativeDateTimeSymbols.RelativeDateTimeSymbols_uz;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_vai =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ꖴꖸ','0':'ꗦꗷ','1':'ꔻꕯ'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_vai_Latn =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'kunu','0':'wɛlɛ','1':'sina'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_vai_Latn_LR =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'kunu','0':'wɛlɛ','1':'sina'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_vai_Vaii = exports.RelativeDateTimeSymbols_vai;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_vai_Vaii_LR = exports.RelativeDateTimeSymbols_vai;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_vi_VN = relativeDateTimeSymbols.RelativeDateTimeSymbols_vi;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_vun =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Ukou','0':'Inu','1':'Ngama'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_vun_TZ = exports.RelativeDateTimeSymbols_vun;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_wae =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Gešter','-2':'Vorgešter','0':'Hitte','1':'Móre','2':'Ubermóre'},\n      P:'one{vor # tag}other{vor # täg}',\n      F:'one{i # tag}other{i # täg}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{vor # stund}other{vor # stunde}',\n      F:'one{i # stund}other{i # stunde}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{vor # minüta}other{vor # minüte}',\n      F:'one{i # minüta}other{i # minüte}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{vor # mánet}other{vor # mánet}',\n      F:'one{I # mánet}other{I # mánet}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{vor # sekund}other{vor # sekunde}',\n      F:'one{i # sekund}other{i # sekunde}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{vor # wuča}other{cor # wučä}',\n      F:'one{i # wuča}other{i # wučä}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{vor # jár}other{cor # jár}',\n      F:'one{I # jár}other{I # jár}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_wae_CH = exports.RelativeDateTimeSymbols_wae;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_wo =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'démb','0':'tay','1':'suba'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_wo_SN = exports.RelativeDateTimeSymbols_wo;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_xh =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_xh_ZA = exports.RelativeDateTimeSymbols_xh;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_xog =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Edho','0':'Olwaleelo (leelo)','1':'Enkyo'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_xog_UG = exports.RelativeDateTimeSymbols_xog;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_yav =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'púyoó','0':'ínaan','1':'nakinyám'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_yav_CM = exports.RelativeDateTimeSymbols_yav;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_yi =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'נעכטן','0':'היינט','1':'מארגן'},\n      P:'other{-# d}',\n      F:'one{אין # טאָג אַרום}other{אין # טעג אַרום}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'פֿאַרגאנגענעם חודש','0':'דעם חודש','1':'קומענדיקן חודש'},\n      P:'one{פֿאַר # חודש}other{פֿאַר # חדשים}',\n      F:'one{איבער # חודש}other{איבער # חדשים}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'איבער אַכט טאָג'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'פֿאַראַיאָר','0':'הײַ יאָר','1':'איבער א יאָר'},\n      P:'one{פֿאַר # יאָר}other{פֿאַר # יאָר}',\n      F:'one{איבער # יאָר}other{איבער # יאָר}',\n    },\n    SHORT:{\n      R:{'-1':'פֿאַראַיאָר','0':'הײַ יאָר','1':'איבער א יאָר'},\n      P:'one{פֿאַר # יאָר}other{פֿאַר # יאָר}',\n      F:'one{איבער א יאָר}other{איבער # יאָר}',\n    },\n    NARROW:{\n      R:{'-1':'פֿאַראַיאָר','0':'הײַ יאָר','1':'איבער א יאָר'},\n      P:'one{פֿאַר # יאָר}other{פֿאַר # יאָר}',\n      F:'one{איבער # יאָר}other{איבער # יאָר}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_yi_001 = exports.RelativeDateTimeSymbols_yi;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_yo =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Àná','-2':'íjẹta','0':'Òní','1':'Ọ̀la','2':'òtúùnla'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n    SHORT:{\n      R:{'-1':'Àná','0':'Òní','1':'Ọ̀la'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'óṣù tó kọjá','0':'oṣù yìí','1':'óṣù tó ń bọ̀,'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ọ̀sẹ̀ tó kọjá','0':'ọ̀sẹ̀ yìí','1':'ọ́sẹ̀ tó ń bọ̀'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ọ́dún tó kọjá','0':'ọ́dún yìí','1':'ọ́dún tó ń bọ̀'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_yo_BJ =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Àná','-2':'íjɛta','0':'Òní','1':'Ɔ̀la','2':'òtúùnla'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n    SHORT:{\n      R:{'-1':'Àná','0':'Òní','1':'Ɔ̀la'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'óshù tó kɔjá','0':'oshù yìí','1':'óshù tó ń bɔ̀,'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ɔ̀sɛ̀ tó kɔjá','0':'ɔ̀sɛ̀ yìí','1':'ɔ́sɛ̀ tó ń bɔ̀'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ɔ́dún tó kɔjá','0':'ɔ́dún yìí','1':'ɔ́dún tó ń bɔ̀'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_yo_NG = exports.RelativeDateTimeSymbols_yo;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_yue =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'尋日','-2':'前天','0':'今日','1':'聽日','2':'後天'},\n      P:'other{# 日前}',\n      F:'other{# 日後}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'呢個小時'},\n      P:'other{# 小時前}',\n      F:'other{# 小時後}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'呢分鐘'},\n      P:'other{# 分鐘前}',\n      F:'other{# 分鐘後}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'上個月','0':'今個月','1':'下個月'},\n      P:'other{# 個月前}',\n      F:'other{# 個月後}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'上一季','0':'今季','1':'下一季'},\n      P:'other{# 季前}',\n      F:'other{# 季後}',\n    },\n    SHORT:{\n      R:{'-1':'上季','0':'今季','1':'下季'},\n      P:'other{# 季前}',\n      F:'other{# 季後}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'宜家'},\n      P:'other{# 秒前}',\n      F:'other{# 秒後}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'上星期','0':'今個星期','1':'下星期'},\n      P:'other{# 個星期前}',\n      F:'other{# 個星期後}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'舊年','0':'今年','1':'下年'},\n      P:'other{# 年前}',\n      F:'other{# 年後}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_yue_Hans =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'寻日','-2':'前天','0':'今日','1':'听日','2':'后天'},\n      P:'other{# 日前}',\n      F:'other{# 日后}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'呢个小时'},\n      P:'other{# 小时前}',\n      F:'other{# 小时后}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'呢分钟'},\n      P:'other{# 分钟前}',\n      F:'other{# 分钟后}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'上个月','0':'今个月','1':'下个月'},\n      P:'other{# 个月前}',\n      F:'other{# 个月后}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'上一季','0':'今季','1':'下一季'},\n      P:'other{# 季前}',\n      F:'other{# 季后}',\n    },\n    SHORT:{\n      R:{'-1':'上季','0':'今季','1':'下季'},\n      P:'other{# 季前}',\n      F:'other{# 季后}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'宜家'},\n      P:'other{# 秒前}',\n      F:'other{# 秒后}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'上星期','0':'今个星期','1':'下星期'},\n      P:'other{# 个星期前}',\n      F:'other{# 个星期后}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'旧年','0':'今年','1':'下年'},\n      P:'other{# 年前}',\n      F:'other{# 年后}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_yue_Hans_CN =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'寻日','-2':'前天','0':'今日','1':'听日','2':'后天'},\n      P:'other{# 日前}',\n      F:'other{# 日后}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'呢个小时'},\n      P:'other{# 小时前}',\n      F:'other{# 小时后}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'呢分钟'},\n      P:'other{# 分钟前}',\n      F:'other{# 分钟后}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'上个月','0':'今个月','1':'下个月'},\n      P:'other{# 个月前}',\n      F:'other{# 个月后}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'上一季','0':'今季','1':'下一季'},\n      P:'other{# 季前}',\n      F:'other{# 季后}',\n    },\n    SHORT:{\n      R:{'-1':'上季','0':'今季','1':'下季'},\n      P:'other{# 季前}',\n      F:'other{# 季后}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'宜家'},\n      P:'other{# 秒前}',\n      F:'other{# 秒后}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'上星期','0':'今个星期','1':'下星期'},\n      P:'other{# 个星期前}',\n      F:'other{# 个星期后}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'旧年','0':'今年','1':'下年'},\n      P:'other{# 年前}',\n      F:'other{# 年后}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_yue_Hant = exports.RelativeDateTimeSymbols_yue;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_yue_Hant_HK = exports.RelativeDateTimeSymbols_yue;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zgh =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ⵉⴹⵍⵍⵉ','0':'ⴰⵙⵙⴰ','1':'ⴰⵙⴽⴽⴰ'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zgh_MA = exports.RelativeDateTimeSymbols_zgh;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zh_Hans = relativeDateTimeSymbols.RelativeDateTimeSymbols_zh;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zh_Hans_CN = relativeDateTimeSymbols.RelativeDateTimeSymbols_zh;\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zh_Hans_HK =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'昨天','-2':'前天','0':'今天','1':'明天','2':'后天'},\n      P:'other{#天前}',\n      F:'other{#天后}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'这一时间 / 此时'},\n      P:'other{#小时前}',\n      F:'other{#小时后}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'此刻'},\n      P:'other{#分钟前}',\n      F:'other{#分钟后}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'上个月','0':'本月','1':'下个月'},\n      P:'other{#个月前}',\n      F:'other{#个月后}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'上季度','0':'本季度','1':'下季度'},\n      P:'other{#个季度前}',\n      F:'other{#个季度后}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'现在'},\n      P:'other{#秒前}',\n      F:'other{#秒后}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'上周','0':'本周','1':'下周'},\n      P:'other{#周前}',\n      F:'other{#周后}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'去年','0':'今年','1':'明年'},\n      P:'other{#年前}',\n      F:'other{#年后}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zh_Hans_MO =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'昨天','-2':'前天','0':'今天','1':'明天','2':'后天'},\n      P:'other{#天前}',\n      F:'other{#天后}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'这一时间 / 此时'},\n      P:'other{#小时前}',\n      F:'other{#小时后}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'此刻'},\n      P:'other{#分钟前}',\n      F:'other{#分钟后}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'上个月','0':'本月','1':'下个月'},\n      P:'other{#个月前}',\n      F:'other{#个月后}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'上季度','0':'本季度','1':'下季度'},\n      P:'other{#个季度前}',\n      F:'other{#个季度后}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'现在'},\n      P:'other{#秒前}',\n      F:'other{#秒后}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'上周','0':'本周','1':'下周'},\n      P:'other{#周前}',\n      F:'other{#周后}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'去年','0':'今年','1':'明年'},\n      P:'other{#年前}',\n      F:'other{#年后}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zh_Hans_SG =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'昨天','-2':'前天','0':'今天','1':'明天','2':'后天'},\n      P:'other{#天前}',\n      F:'other{#天后}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'这一时间 / 此时'},\n      P:'other{#小时前}',\n      F:'other{#小时后}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'此刻'},\n      P:'other{#分钟前}',\n      F:'other{#分钟后}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'上个月','0':'本月','1':'下个月'},\n      P:'other{#个月前}',\n      F:'other{#个月后}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'上季度','0':'本季度','1':'下季度'},\n      P:'other{#个季度前}',\n      F:'other{#个季度后}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'现在'},\n      P:'other{#秒前}',\n      F:'other{#秒后}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'上周','0':'本周','1':'下周'},\n      P:'other{#周前}',\n      F:'other{#周后}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'去年','0':'今年','1':'明年'},\n      P:'other{#年前}',\n      F:'other{#年后}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zh_Hant =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'昨天','-2':'前天','0':'今天','1':'明天','2':'後天'},\n      P:'other{# 天前}',\n      F:'other{# 天後}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'這一小時'},\n      P:'other{# 小時前}',\n      F:'other{# 小時後}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'這一分鐘'},\n      P:'other{# 分鐘前}',\n      F:'other{# 分鐘後}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'上個月','0':'本月','1':'下個月'},\n      P:'other{# 個月前}',\n      F:'other{# 個月後}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'上一季','0':'這一季','1':'下一季'},\n      P:'other{# 季前}',\n      F:'other{# 季後}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'現在'},\n      P:'other{# 秒前}',\n      F:'other{# 秒後}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'上週','0':'本週','1':'下週'},\n      P:'other{# 週前}',\n      F:'other{# 週後}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'去年','0':'今年','1':'明年'},\n      P:'other{# 年前}',\n      F:'other{# 年後}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zh_Hant_HK =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'昨日','-2':'前日','0':'今日','1':'明日','2':'後日'},\n      P:'other{# 日前}',\n      F:'other{# 日後}',\n    },\n    NARROW:{\n      R:{'-1':'昨日','-2':'前日','0':'今日','1':'明日','2':'後日'},\n      P:'other{#日前}',\n      F:'other{#日後}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'這個小時'},\n      P:'other{# 小時前}',\n      F:'other{# 小時後}',\n    },\n    NARROW:{\n      R:{'0':'這個小時'},\n      P:'other{#小時前}',\n      F:'other{#小時後}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'這分鐘'},\n      P:'other{# 分鐘前}',\n      F:'other{# 分鐘後}',\n    },\n    NARROW:{\n      R:{'0':'這分鐘'},\n      P:'other{#分前}',\n      F:'other{#分後}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'上個月','0':'本月','1':'下個月'},\n      P:'other{# 個月前}',\n      F:'other{# 個月後}',\n    },\n    NARROW:{\n      R:{'-1':'上個月','0':'本月','1':'下個月'},\n      P:'other{#個月前}',\n      F:'other{#個月後}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'上一季','0':'今季','1':'下一季'},\n      P:'other{# 季前}',\n      F:'other{# 季後}',\n    },\n    SHORT:{\n      R:{'-1':'上季','0':'今季','1':'下季'},\n      P:'other{# 季前}',\n      F:'other{# 季後}',\n    },\n    NARROW:{\n      R:{'-1':'上季','0':'今季','1':'下季'},\n      P:'other{-#Q}',\n      F:'other{+#Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'現在'},\n      P:'other{# 秒前}',\n      F:'other{# 秒後}',\n    },\n    NARROW:{\n      R:{'0':'現在'},\n      P:'other{#秒前}',\n      F:'other{#秒後}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'上星期','0':'本星期','1':'下星期'},\n      P:'other{# 星期前}',\n      F:'other{# 星期後}',\n    },\n    NARROW:{\n      R:{'-1':'上星期','0':'本星期','1':'下星期'},\n      P:'other{#星期前}',\n      F:'other{#星期後}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'上年','0':'今年','1':'下年'},\n      P:'other{# 年前}',\n      F:'other{# 年後}',\n    },\n    NARROW:{\n      R:{'-1':'上年','0':'今年','1':'下年'},\n      P:'other{#年前}',\n      F:'other{#年後}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zh_Hant_MO =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'昨日','-2':'前日','0':'今日','1':'明日','2':'後日'},\n      P:'other{# 日前}',\n      F:'other{# 日後}',\n    },\n    NARROW:{\n      R:{'-1':'昨日','-2':'前日','0':'今日','1':'明日','2':'後日'},\n      P:'other{#日前}',\n      F:'other{#日後}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'這個小時'},\n      P:'other{# 小時前}',\n      F:'other{# 小時後}',\n    },\n    NARROW:{\n      R:{'0':'這個小時'},\n      P:'other{#小時前}',\n      F:'other{#小時後}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'這分鐘'},\n      P:'other{# 分鐘前}',\n      F:'other{# 分鐘後}',\n    },\n    NARROW:{\n      R:{'0':'這分鐘'},\n      P:'other{#分前}',\n      F:'other{#分後}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'上個月','0':'本月','1':'下個月'},\n      P:'other{# 個月前}',\n      F:'other{# 個月後}',\n    },\n    NARROW:{\n      R:{'-1':'上個月','0':'本月','1':'下個月'},\n      P:'other{#個月前}',\n      F:'other{#個月後}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'上一季','0':'今季','1':'下一季'},\n      P:'other{# 季前}',\n      F:'other{# 季後}',\n    },\n    SHORT:{\n      R:{'-1':'上季','0':'今季','1':'下季'},\n      P:'other{# 季前}',\n      F:'other{# 季後}',\n    },\n    NARROW:{\n      R:{'-1':'上季','0':'今季','1':'下季'},\n      P:'other{-#Q}',\n      F:'other{+#Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'現在'},\n      P:'other{# 秒前}',\n      F:'other{# 秒後}',\n    },\n    NARROW:{\n      R:{'0':'現在'},\n      P:'other{#秒前}',\n      F:'other{#秒後}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'上星期','0':'本星期','1':'下星期'},\n      P:'other{# 星期前}',\n      F:'other{# 星期後}',\n    },\n    NARROW:{\n      R:{'-1':'上星期','0':'本星期','1':'下星期'},\n      P:'other{#星期前}',\n      F:'other{#星期後}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'上年','0':'今年','1':'下年'},\n      P:'other{# 年前}',\n      F:'other{# 年後}',\n    },\n    NARROW:{\n      R:{'-1':'上年','0':'今年','1':'下年'},\n      P:'other{#年前}',\n      F:'other{#年後}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zh_Hant_TW =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'昨天','-2':'前天','0':'今天','1':'明天','2':'後天'},\n      P:'other{# 天前}',\n      F:'other{# 天後}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'這一小時'},\n      P:'other{# 小時前}',\n      F:'other{# 小時後}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'這一分鐘'},\n      P:'other{# 分鐘前}',\n      F:'other{# 分鐘後}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'上個月','0':'本月','1':'下個月'},\n      P:'other{# 個月前}',\n      F:'other{# 個月後}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'上一季','0':'這一季','1':'下一季'},\n      P:'other{# 季前}',\n      F:'other{# 季後}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'現在'},\n      P:'other{# 秒前}',\n      F:'other{# 秒後}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'上週','0':'本週','1':'下週'},\n      P:'other{# 週前}',\n      F:'other{# 週後}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'去年','0':'今年','1':'明年'},\n      P:'other{# 年前}',\n      F:'other{# 年後}',\n    },\n  },\n};\n\n/** @const {!relativeDateTimeSymbols.RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zu_ZA = relativeDateTimeSymbols.RelativeDateTimeSymbols_zu;\n\nswitch (goog.LOCALE) {\n  case 'af_NA':\n  case 'af-NA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_af_NA;\n    break;\n  case 'af_ZA':\n  case 'af-ZA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_af_ZA;\n    break;\n  case 'agq':\n    defaultSymbols = exports.RelativeDateTimeSymbols_agq;\n    break;\n  case 'agq_CM':\n  case 'agq-CM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_agq_CM;\n    break;\n  case 'ak':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ak;\n    break;\n  case 'ak_GH':\n  case 'ak-GH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ak_GH;\n    break;\n  case 'am_ET':\n  case 'am-ET':\n    defaultSymbols = exports.RelativeDateTimeSymbols_am_ET;\n    break;\n  case 'ar_001':\n  case 'ar-001':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_001;\n    break;\n  case 'ar_AE':\n  case 'ar-AE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_AE;\n    break;\n  case 'ar_BH':\n  case 'ar-BH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_BH;\n    break;\n  case 'ar_DJ':\n  case 'ar-DJ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_DJ;\n    break;\n  case 'ar_EH':\n  case 'ar-EH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_EH;\n    break;\n  case 'ar_ER':\n  case 'ar-ER':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_ER;\n    break;\n  case 'ar_IL':\n  case 'ar-IL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_IL;\n    break;\n  case 'ar_IQ':\n  case 'ar-IQ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_IQ;\n    break;\n  case 'ar_JO':\n  case 'ar-JO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_JO;\n    break;\n  case 'ar_KM':\n  case 'ar-KM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_KM;\n    break;\n  case 'ar_KW':\n  case 'ar-KW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_KW;\n    break;\n  case 'ar_LB':\n  case 'ar-LB':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_LB;\n    break;\n  case 'ar_LY':\n  case 'ar-LY':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_LY;\n    break;\n  case 'ar_MA':\n  case 'ar-MA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_MA;\n    break;\n  case 'ar_MR':\n  case 'ar-MR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_MR;\n    break;\n  case 'ar_OM':\n  case 'ar-OM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_OM;\n    break;\n  case 'ar_PS':\n  case 'ar-PS':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_PS;\n    break;\n  case 'ar_QA':\n  case 'ar-QA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_QA;\n    break;\n  case 'ar_SA':\n  case 'ar-SA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_SA;\n    break;\n  case 'ar_SD':\n  case 'ar-SD':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_SD;\n    break;\n  case 'ar_SO':\n  case 'ar-SO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_SO;\n    break;\n  case 'ar_SS':\n  case 'ar-SS':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_SS;\n    break;\n  case 'ar_SY':\n  case 'ar-SY':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_SY;\n    break;\n  case 'ar_TD':\n  case 'ar-TD':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_TD;\n    break;\n  case 'ar_TN':\n  case 'ar-TN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_TN;\n    break;\n  case 'ar_XB':\n  case 'ar-XB':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_XB;\n    break;\n  case 'ar_YE':\n  case 'ar-YE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_YE;\n    break;\n  case 'as':\n    defaultSymbols = exports.RelativeDateTimeSymbols_as;\n    break;\n  case 'as_IN':\n  case 'as-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_as_IN;\n    break;\n  case 'asa':\n    defaultSymbols = exports.RelativeDateTimeSymbols_asa;\n    break;\n  case 'asa_TZ':\n  case 'asa-TZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_asa_TZ;\n    break;\n  case 'ast':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ast;\n    break;\n  case 'ast_ES':\n  case 'ast-ES':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ast_ES;\n    break;\n  case 'az_Cyrl':\n  case 'az-Cyrl':\n    defaultSymbols = exports.RelativeDateTimeSymbols_az_Cyrl;\n    break;\n  case 'az_Cyrl_AZ':\n  case 'az-Cyrl-AZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_az_Cyrl_AZ;\n    break;\n  case 'az_Latn':\n  case 'az-Latn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_az_Latn;\n    break;\n  case 'az_Latn_AZ':\n  case 'az-Latn-AZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_az_Latn_AZ;\n    break;\n  case 'bas':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bas;\n    break;\n  case 'bas_CM':\n  case 'bas-CM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bas_CM;\n    break;\n  case 'be_BY':\n  case 'be-BY':\n    defaultSymbols = exports.RelativeDateTimeSymbols_be_BY;\n    break;\n  case 'bem':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bem;\n    break;\n  case 'bem_ZM':\n  case 'bem-ZM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bem_ZM;\n    break;\n  case 'bez':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bez;\n    break;\n  case 'bez_TZ':\n  case 'bez-TZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bez_TZ;\n    break;\n  case 'bg_BG':\n  case 'bg-BG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bg_BG;\n    break;\n  case 'bm':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bm;\n    break;\n  case 'bm_ML':\n  case 'bm-ML':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bm_ML;\n    break;\n  case 'bn_BD':\n  case 'bn-BD':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bn_BD;\n    break;\n  case 'bn_IN':\n  case 'bn-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bn_IN;\n    break;\n  case 'bo':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bo;\n    break;\n  case 'bo_CN':\n  case 'bo-CN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bo_CN;\n    break;\n  case 'bo_IN':\n  case 'bo-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bo_IN;\n    break;\n  case 'br_FR':\n  case 'br-FR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_br_FR;\n    break;\n  case 'brx':\n    defaultSymbols = exports.RelativeDateTimeSymbols_brx;\n    break;\n  case 'brx_IN':\n  case 'brx-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_brx_IN;\n    break;\n  case 'bs_Cyrl':\n  case 'bs-Cyrl':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bs_Cyrl;\n    break;\n  case 'bs_Cyrl_BA':\n  case 'bs-Cyrl-BA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bs_Cyrl_BA;\n    break;\n  case 'bs_Latn':\n  case 'bs-Latn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bs_Latn;\n    break;\n  case 'bs_Latn_BA':\n  case 'bs-Latn-BA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bs_Latn_BA;\n    break;\n  case 'ca_AD':\n  case 'ca-AD':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ca_AD;\n    break;\n  case 'ca_ES':\n  case 'ca-ES':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ca_ES;\n    break;\n  case 'ca_FR':\n  case 'ca-FR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ca_FR;\n    break;\n  case 'ca_IT':\n  case 'ca-IT':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ca_IT;\n    break;\n  case 'ccp':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ccp;\n    break;\n  case 'ccp_BD':\n  case 'ccp-BD':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ccp_BD;\n    break;\n  case 'ccp_IN':\n  case 'ccp-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ccp_IN;\n    break;\n  case 'ce':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ce;\n    break;\n  case 'ce_RU':\n  case 'ce-RU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ce_RU;\n    break;\n  case 'ceb':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ceb;\n    break;\n  case 'ceb_PH':\n  case 'ceb-PH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ceb_PH;\n    break;\n  case 'cgg':\n    defaultSymbols = exports.RelativeDateTimeSymbols_cgg;\n    break;\n  case 'cgg_UG':\n  case 'cgg-UG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_cgg_UG;\n    break;\n  case 'chr_US':\n  case 'chr-US':\n    defaultSymbols = exports.RelativeDateTimeSymbols_chr_US;\n    break;\n  case 'ckb':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ckb;\n    break;\n  case 'ckb_IQ':\n  case 'ckb-IQ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ckb_IQ;\n    break;\n  case 'ckb_IR':\n  case 'ckb-IR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ckb_IR;\n    break;\n  case 'cs_CZ':\n  case 'cs-CZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_cs_CZ;\n    break;\n  case 'cy_GB':\n  case 'cy-GB':\n    defaultSymbols = exports.RelativeDateTimeSymbols_cy_GB;\n    break;\n  case 'da_DK':\n  case 'da-DK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_da_DK;\n    break;\n  case 'da_GL':\n  case 'da-GL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_da_GL;\n    break;\n  case 'dav':\n    defaultSymbols = exports.RelativeDateTimeSymbols_dav;\n    break;\n  case 'dav_KE':\n  case 'dav-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_dav_KE;\n    break;\n  case 'de_BE':\n  case 'de-BE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_de_BE;\n    break;\n  case 'de_DE':\n  case 'de-DE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_de_DE;\n    break;\n  case 'de_IT':\n  case 'de-IT':\n    defaultSymbols = exports.RelativeDateTimeSymbols_de_IT;\n    break;\n  case 'de_LI':\n  case 'de-LI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_de_LI;\n    break;\n  case 'de_LU':\n  case 'de-LU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_de_LU;\n    break;\n  case 'dje':\n    defaultSymbols = exports.RelativeDateTimeSymbols_dje;\n    break;\n  case 'dje_NE':\n  case 'dje-NE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_dje_NE;\n    break;\n  case 'dsb':\n    defaultSymbols = exports.RelativeDateTimeSymbols_dsb;\n    break;\n  case 'dsb_DE':\n  case 'dsb-DE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_dsb_DE;\n    break;\n  case 'dua':\n    defaultSymbols = exports.RelativeDateTimeSymbols_dua;\n    break;\n  case 'dua_CM':\n  case 'dua-CM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_dua_CM;\n    break;\n  case 'dyo':\n    defaultSymbols = exports.RelativeDateTimeSymbols_dyo;\n    break;\n  case 'dyo_SN':\n  case 'dyo-SN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_dyo_SN;\n    break;\n  case 'dz':\n    defaultSymbols = exports.RelativeDateTimeSymbols_dz;\n    break;\n  case 'dz_BT':\n  case 'dz-BT':\n    defaultSymbols = exports.RelativeDateTimeSymbols_dz_BT;\n    break;\n  case 'ebu':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ebu;\n    break;\n  case 'ebu_KE':\n  case 'ebu-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ebu_KE;\n    break;\n  case 'ee':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ee;\n    break;\n  case 'ee_GH':\n  case 'ee-GH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ee_GH;\n    break;\n  case 'ee_TG':\n  case 'ee-TG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ee_TG;\n    break;\n  case 'el_CY':\n  case 'el-CY':\n    defaultSymbols = exports.RelativeDateTimeSymbols_el_CY;\n    break;\n  case 'el_GR':\n  case 'el-GR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_el_GR;\n    break;\n  case 'en_001':\n  case 'en-001':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_001;\n    break;\n  case 'en_150':\n  case 'en-150':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_150;\n    break;\n  case 'en_AE':\n  case 'en-AE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_AE;\n    break;\n  case 'en_AG':\n  case 'en-AG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_AG;\n    break;\n  case 'en_AI':\n  case 'en-AI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_AI;\n    break;\n  case 'en_AS':\n  case 'en-AS':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_AS;\n    break;\n  case 'en_AT':\n  case 'en-AT':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_AT;\n    break;\n  case 'en_BB':\n  case 'en-BB':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_BB;\n    break;\n  case 'en_BE':\n  case 'en-BE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_BE;\n    break;\n  case 'en_BI':\n  case 'en-BI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_BI;\n    break;\n  case 'en_BM':\n  case 'en-BM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_BM;\n    break;\n  case 'en_BS':\n  case 'en-BS':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_BS;\n    break;\n  case 'en_BW':\n  case 'en-BW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_BW;\n    break;\n  case 'en_BZ':\n  case 'en-BZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_BZ;\n    break;\n  case 'en_CC':\n  case 'en-CC':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_CC;\n    break;\n  case 'en_CH':\n  case 'en-CH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_CH;\n    break;\n  case 'en_CK':\n  case 'en-CK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_CK;\n    break;\n  case 'en_CM':\n  case 'en-CM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_CM;\n    break;\n  case 'en_CX':\n  case 'en-CX':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_CX;\n    break;\n  case 'en_CY':\n  case 'en-CY':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_CY;\n    break;\n  case 'en_DE':\n  case 'en-DE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_DE;\n    break;\n  case 'en_DG':\n  case 'en-DG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_DG;\n    break;\n  case 'en_DK':\n  case 'en-DK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_DK;\n    break;\n  case 'en_DM':\n  case 'en-DM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_DM;\n    break;\n  case 'en_ER':\n  case 'en-ER':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_ER;\n    break;\n  case 'en_FI':\n  case 'en-FI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_FI;\n    break;\n  case 'en_FJ':\n  case 'en-FJ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_FJ;\n    break;\n  case 'en_FK':\n  case 'en-FK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_FK;\n    break;\n  case 'en_FM':\n  case 'en-FM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_FM;\n    break;\n  case 'en_GD':\n  case 'en-GD':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_GD;\n    break;\n  case 'en_GG':\n  case 'en-GG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_GG;\n    break;\n  case 'en_GH':\n  case 'en-GH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_GH;\n    break;\n  case 'en_GI':\n  case 'en-GI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_GI;\n    break;\n  case 'en_GM':\n  case 'en-GM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_GM;\n    break;\n  case 'en_GU':\n  case 'en-GU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_GU;\n    break;\n  case 'en_GY':\n  case 'en-GY':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_GY;\n    break;\n  case 'en_HK':\n  case 'en-HK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_HK;\n    break;\n  case 'en_IL':\n  case 'en-IL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_IL;\n    break;\n  case 'en_IM':\n  case 'en-IM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_IM;\n    break;\n  case 'en_IO':\n  case 'en-IO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_IO;\n    break;\n  case 'en_JE':\n  case 'en-JE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_JE;\n    break;\n  case 'en_JM':\n  case 'en-JM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_JM;\n    break;\n  case 'en_KE':\n  case 'en-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_KE;\n    break;\n  case 'en_KI':\n  case 'en-KI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_KI;\n    break;\n  case 'en_KN':\n  case 'en-KN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_KN;\n    break;\n  case 'en_KY':\n  case 'en-KY':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_KY;\n    break;\n  case 'en_LC':\n  case 'en-LC':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_LC;\n    break;\n  case 'en_LR':\n  case 'en-LR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_LR;\n    break;\n  case 'en_LS':\n  case 'en-LS':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_LS;\n    break;\n  case 'en_MG':\n  case 'en-MG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_MG;\n    break;\n  case 'en_MH':\n  case 'en-MH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_MH;\n    break;\n  case 'en_MO':\n  case 'en-MO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_MO;\n    break;\n  case 'en_MP':\n  case 'en-MP':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_MP;\n    break;\n  case 'en_MS':\n  case 'en-MS':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_MS;\n    break;\n  case 'en_MT':\n  case 'en-MT':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_MT;\n    break;\n  case 'en_MU':\n  case 'en-MU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_MU;\n    break;\n  case 'en_MW':\n  case 'en-MW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_MW;\n    break;\n  case 'en_MY':\n  case 'en-MY':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_MY;\n    break;\n  case 'en_NA':\n  case 'en-NA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_NA;\n    break;\n  case 'en_NF':\n  case 'en-NF':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_NF;\n    break;\n  case 'en_NG':\n  case 'en-NG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_NG;\n    break;\n  case 'en_NL':\n  case 'en-NL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_NL;\n    break;\n  case 'en_NR':\n  case 'en-NR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_NR;\n    break;\n  case 'en_NU':\n  case 'en-NU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_NU;\n    break;\n  case 'en_NZ':\n  case 'en-NZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_NZ;\n    break;\n  case 'en_PG':\n  case 'en-PG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_PG;\n    break;\n  case 'en_PH':\n  case 'en-PH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_PH;\n    break;\n  case 'en_PK':\n  case 'en-PK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_PK;\n    break;\n  case 'en_PN':\n  case 'en-PN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_PN;\n    break;\n  case 'en_PR':\n  case 'en-PR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_PR;\n    break;\n  case 'en_PW':\n  case 'en-PW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_PW;\n    break;\n  case 'en_RW':\n  case 'en-RW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_RW;\n    break;\n  case 'en_SB':\n  case 'en-SB':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_SB;\n    break;\n  case 'en_SC':\n  case 'en-SC':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_SC;\n    break;\n  case 'en_SD':\n  case 'en-SD':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_SD;\n    break;\n  case 'en_SE':\n  case 'en-SE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_SE;\n    break;\n  case 'en_SH':\n  case 'en-SH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_SH;\n    break;\n  case 'en_SI':\n  case 'en-SI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_SI;\n    break;\n  case 'en_SL':\n  case 'en-SL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_SL;\n    break;\n  case 'en_SS':\n  case 'en-SS':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_SS;\n    break;\n  case 'en_SX':\n  case 'en-SX':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_SX;\n    break;\n  case 'en_SZ':\n  case 'en-SZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_SZ;\n    break;\n  case 'en_TC':\n  case 'en-TC':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_TC;\n    break;\n  case 'en_TK':\n  case 'en-TK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_TK;\n    break;\n  case 'en_TO':\n  case 'en-TO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_TO;\n    break;\n  case 'en_TT':\n  case 'en-TT':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_TT;\n    break;\n  case 'en_TV':\n  case 'en-TV':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_TV;\n    break;\n  case 'en_TZ':\n  case 'en-TZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_TZ;\n    break;\n  case 'en_UG':\n  case 'en-UG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_UG;\n    break;\n  case 'en_UM':\n  case 'en-UM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_UM;\n    break;\n  case 'en_US_POSIX':\n  case 'en-US-POSIX':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_US_POSIX;\n    break;\n  case 'en_VC':\n  case 'en-VC':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_VC;\n    break;\n  case 'en_VG':\n  case 'en-VG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_VG;\n    break;\n  case 'en_VI':\n  case 'en-VI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_VI;\n    break;\n  case 'en_VU':\n  case 'en-VU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_VU;\n    break;\n  case 'en_WS':\n  case 'en-WS':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_WS;\n    break;\n  case 'en_XA':\n  case 'en-XA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_XA;\n    break;\n  case 'en_ZM':\n  case 'en-ZM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_ZM;\n    break;\n  case 'en_ZW':\n  case 'en-ZW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_ZW;\n    break;\n  case 'eo':\n    defaultSymbols = exports.RelativeDateTimeSymbols_eo;\n    break;\n  case 'eo_001':\n  case 'eo-001':\n    defaultSymbols = exports.RelativeDateTimeSymbols_eo_001;\n    break;\n  case 'es_AR':\n  case 'es-AR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_AR;\n    break;\n  case 'es_BO':\n  case 'es-BO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_BO;\n    break;\n  case 'es_BR':\n  case 'es-BR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_BR;\n    break;\n  case 'es_BZ':\n  case 'es-BZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_BZ;\n    break;\n  case 'es_CL':\n  case 'es-CL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_CL;\n    break;\n  case 'es_CO':\n  case 'es-CO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_CO;\n    break;\n  case 'es_CR':\n  case 'es-CR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_CR;\n    break;\n  case 'es_CU':\n  case 'es-CU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_CU;\n    break;\n  case 'es_DO':\n  case 'es-DO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_DO;\n    break;\n  case 'es_EA':\n  case 'es-EA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_EA;\n    break;\n  case 'es_EC':\n  case 'es-EC':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_EC;\n    break;\n  case 'es_GQ':\n  case 'es-GQ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_GQ;\n    break;\n  case 'es_GT':\n  case 'es-GT':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_GT;\n    break;\n  case 'es_HN':\n  case 'es-HN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_HN;\n    break;\n  case 'es_IC':\n  case 'es-IC':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_IC;\n    break;\n  case 'es_NI':\n  case 'es-NI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_NI;\n    break;\n  case 'es_PA':\n  case 'es-PA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_PA;\n    break;\n  case 'es_PE':\n  case 'es-PE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_PE;\n    break;\n  case 'es_PH':\n  case 'es-PH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_PH;\n    break;\n  case 'es_PR':\n  case 'es-PR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_PR;\n    break;\n  case 'es_PY':\n  case 'es-PY':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_PY;\n    break;\n  case 'es_SV':\n  case 'es-SV':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_SV;\n    break;\n  case 'es_UY':\n  case 'es-UY':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_UY;\n    break;\n  case 'es_VE':\n  case 'es-VE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_VE;\n    break;\n  case 'et_EE':\n  case 'et-EE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_et_EE;\n    break;\n  case 'eu_ES':\n  case 'eu-ES':\n    defaultSymbols = exports.RelativeDateTimeSymbols_eu_ES;\n    break;\n  case 'ewo':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ewo;\n    break;\n  case 'ewo_CM':\n  case 'ewo-CM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ewo_CM;\n    break;\n  case 'fa_AF':\n  case 'fa-AF':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fa_AF;\n    break;\n  case 'fa_IR':\n  case 'fa-IR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fa_IR;\n    break;\n  case 'ff':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ff;\n    break;\n  case 'ff_Latn':\n  case 'ff-Latn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ff_Latn;\n    break;\n  case 'ff_Latn_BF':\n  case 'ff-Latn-BF':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ff_Latn_BF;\n    break;\n  case 'ff_Latn_CM':\n  case 'ff-Latn-CM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ff_Latn_CM;\n    break;\n  case 'ff_Latn_GH':\n  case 'ff-Latn-GH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ff_Latn_GH;\n    break;\n  case 'ff_Latn_GM':\n  case 'ff-Latn-GM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ff_Latn_GM;\n    break;\n  case 'ff_Latn_GN':\n  case 'ff-Latn-GN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ff_Latn_GN;\n    break;\n  case 'ff_Latn_GW':\n  case 'ff-Latn-GW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ff_Latn_GW;\n    break;\n  case 'ff_Latn_LR':\n  case 'ff-Latn-LR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ff_Latn_LR;\n    break;\n  case 'ff_Latn_MR':\n  case 'ff-Latn-MR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ff_Latn_MR;\n    break;\n  case 'ff_Latn_NE':\n  case 'ff-Latn-NE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ff_Latn_NE;\n    break;\n  case 'ff_Latn_NG':\n  case 'ff-Latn-NG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ff_Latn_NG;\n    break;\n  case 'ff_Latn_SL':\n  case 'ff-Latn-SL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ff_Latn_SL;\n    break;\n  case 'ff_Latn_SN':\n  case 'ff-Latn-SN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ff_Latn_SN;\n    break;\n  case 'fi_FI':\n  case 'fi-FI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fi_FI;\n    break;\n  case 'fil_PH':\n  case 'fil-PH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fil_PH;\n    break;\n  case 'fo':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fo;\n    break;\n  case 'fo_DK':\n  case 'fo-DK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fo_DK;\n    break;\n  case 'fo_FO':\n  case 'fo-FO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fo_FO;\n    break;\n  case 'fr_BE':\n  case 'fr-BE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_BE;\n    break;\n  case 'fr_BF':\n  case 'fr-BF':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_BF;\n    break;\n  case 'fr_BI':\n  case 'fr-BI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_BI;\n    break;\n  case 'fr_BJ':\n  case 'fr-BJ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_BJ;\n    break;\n  case 'fr_BL':\n  case 'fr-BL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_BL;\n    break;\n  case 'fr_CD':\n  case 'fr-CD':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_CD;\n    break;\n  case 'fr_CF':\n  case 'fr-CF':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_CF;\n    break;\n  case 'fr_CG':\n  case 'fr-CG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_CG;\n    break;\n  case 'fr_CH':\n  case 'fr-CH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_CH;\n    break;\n  case 'fr_CI':\n  case 'fr-CI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_CI;\n    break;\n  case 'fr_CM':\n  case 'fr-CM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_CM;\n    break;\n  case 'fr_DJ':\n  case 'fr-DJ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_DJ;\n    break;\n  case 'fr_DZ':\n  case 'fr-DZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_DZ;\n    break;\n  case 'fr_FR':\n  case 'fr-FR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_FR;\n    break;\n  case 'fr_GA':\n  case 'fr-GA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_GA;\n    break;\n  case 'fr_GF':\n  case 'fr-GF':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_GF;\n    break;\n  case 'fr_GN':\n  case 'fr-GN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_GN;\n    break;\n  case 'fr_GP':\n  case 'fr-GP':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_GP;\n    break;\n  case 'fr_GQ':\n  case 'fr-GQ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_GQ;\n    break;\n  case 'fr_HT':\n  case 'fr-HT':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_HT;\n    break;\n  case 'fr_KM':\n  case 'fr-KM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_KM;\n    break;\n  case 'fr_LU':\n  case 'fr-LU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_LU;\n    break;\n  case 'fr_MA':\n  case 'fr-MA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_MA;\n    break;\n  case 'fr_MC':\n  case 'fr-MC':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_MC;\n    break;\n  case 'fr_MF':\n  case 'fr-MF':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_MF;\n    break;\n  case 'fr_MG':\n  case 'fr-MG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_MG;\n    break;\n  case 'fr_ML':\n  case 'fr-ML':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_ML;\n    break;\n  case 'fr_MQ':\n  case 'fr-MQ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_MQ;\n    break;\n  case 'fr_MR':\n  case 'fr-MR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_MR;\n    break;\n  case 'fr_MU':\n  case 'fr-MU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_MU;\n    break;\n  case 'fr_NC':\n  case 'fr-NC':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_NC;\n    break;\n  case 'fr_NE':\n  case 'fr-NE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_NE;\n    break;\n  case 'fr_PF':\n  case 'fr-PF':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_PF;\n    break;\n  case 'fr_PM':\n  case 'fr-PM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_PM;\n    break;\n  case 'fr_RE':\n  case 'fr-RE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_RE;\n    break;\n  case 'fr_RW':\n  case 'fr-RW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_RW;\n    break;\n  case 'fr_SC':\n  case 'fr-SC':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_SC;\n    break;\n  case 'fr_SN':\n  case 'fr-SN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_SN;\n    break;\n  case 'fr_SY':\n  case 'fr-SY':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_SY;\n    break;\n  case 'fr_TD':\n  case 'fr-TD':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_TD;\n    break;\n  case 'fr_TG':\n  case 'fr-TG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_TG;\n    break;\n  case 'fr_TN':\n  case 'fr-TN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_TN;\n    break;\n  case 'fr_VU':\n  case 'fr-VU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_VU;\n    break;\n  case 'fr_WF':\n  case 'fr-WF':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_WF;\n    break;\n  case 'fr_YT':\n  case 'fr-YT':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_YT;\n    break;\n  case 'fur':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fur;\n    break;\n  case 'fur_IT':\n  case 'fur-IT':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fur_IT;\n    break;\n  case 'fy':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fy;\n    break;\n  case 'fy_NL':\n  case 'fy-NL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fy_NL;\n    break;\n  case 'ga_IE':\n  case 'ga-IE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ga_IE;\n    break;\n  case 'gd':\n    defaultSymbols = exports.RelativeDateTimeSymbols_gd;\n    break;\n  case 'gd_GB':\n  case 'gd-GB':\n    defaultSymbols = exports.RelativeDateTimeSymbols_gd_GB;\n    break;\n  case 'gl_ES':\n  case 'gl-ES':\n    defaultSymbols = exports.RelativeDateTimeSymbols_gl_ES;\n    break;\n  case 'gsw_CH':\n  case 'gsw-CH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_gsw_CH;\n    break;\n  case 'gsw_FR':\n  case 'gsw-FR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_gsw_FR;\n    break;\n  case 'gsw_LI':\n  case 'gsw-LI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_gsw_LI;\n    break;\n  case 'gu_IN':\n  case 'gu-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_gu_IN;\n    break;\n  case 'guz':\n    defaultSymbols = exports.RelativeDateTimeSymbols_guz;\n    break;\n  case 'guz_KE':\n  case 'guz-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_guz_KE;\n    break;\n  case 'gv':\n    defaultSymbols = exports.RelativeDateTimeSymbols_gv;\n    break;\n  case 'gv_IM':\n  case 'gv-IM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_gv_IM;\n    break;\n  case 'ha':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ha;\n    break;\n  case 'ha_GH':\n  case 'ha-GH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ha_GH;\n    break;\n  case 'ha_NE':\n  case 'ha-NE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ha_NE;\n    break;\n  case 'ha_NG':\n  case 'ha-NG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ha_NG;\n    break;\n  case 'haw_US':\n  case 'haw-US':\n    defaultSymbols = exports.RelativeDateTimeSymbols_haw_US;\n    break;\n  case 'he_IL':\n  case 'he-IL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_he_IL;\n    break;\n  case 'hi_IN':\n  case 'hi-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_hi_IN;\n    break;\n  case 'hr_BA':\n  case 'hr-BA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_hr_BA;\n    break;\n  case 'hr_HR':\n  case 'hr-HR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_hr_HR;\n    break;\n  case 'hsb':\n    defaultSymbols = exports.RelativeDateTimeSymbols_hsb;\n    break;\n  case 'hsb_DE':\n  case 'hsb-DE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_hsb_DE;\n    break;\n  case 'hu_HU':\n  case 'hu-HU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_hu_HU;\n    break;\n  case 'hy_AM':\n  case 'hy-AM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_hy_AM;\n    break;\n  case 'ia':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ia;\n    break;\n  case 'ia_001':\n  case 'ia-001':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ia_001;\n    break;\n  case 'id_ID':\n  case 'id-ID':\n    defaultSymbols = exports.RelativeDateTimeSymbols_id_ID;\n    break;\n  case 'ig':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ig;\n    break;\n  case 'ig_NG':\n  case 'ig-NG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ig_NG;\n    break;\n  case 'ii':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ii;\n    break;\n  case 'ii_CN':\n  case 'ii-CN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ii_CN;\n    break;\n  case 'is_IS':\n  case 'is-IS':\n    defaultSymbols = exports.RelativeDateTimeSymbols_is_IS;\n    break;\n  case 'it_CH':\n  case 'it-CH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_it_CH;\n    break;\n  case 'it_IT':\n  case 'it-IT':\n    defaultSymbols = exports.RelativeDateTimeSymbols_it_IT;\n    break;\n  case 'it_SM':\n  case 'it-SM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_it_SM;\n    break;\n  case 'it_VA':\n  case 'it-VA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_it_VA;\n    break;\n  case 'ja_JP':\n  case 'ja-JP':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ja_JP;\n    break;\n  case 'jgo':\n    defaultSymbols = exports.RelativeDateTimeSymbols_jgo;\n    break;\n  case 'jgo_CM':\n  case 'jgo-CM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_jgo_CM;\n    break;\n  case 'jmc':\n    defaultSymbols = exports.RelativeDateTimeSymbols_jmc;\n    break;\n  case 'jmc_TZ':\n  case 'jmc-TZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_jmc_TZ;\n    break;\n  case 'jv':\n    defaultSymbols = exports.RelativeDateTimeSymbols_jv;\n    break;\n  case 'jv_ID':\n  case 'jv-ID':\n    defaultSymbols = exports.RelativeDateTimeSymbols_jv_ID;\n    break;\n  case 'ka_GE':\n  case 'ka-GE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ka_GE;\n    break;\n  case 'kab':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kab;\n    break;\n  case 'kab_DZ':\n  case 'kab-DZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kab_DZ;\n    break;\n  case 'kam':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kam;\n    break;\n  case 'kam_KE':\n  case 'kam-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kam_KE;\n    break;\n  case 'kde':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kde;\n    break;\n  case 'kde_TZ':\n  case 'kde-TZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kde_TZ;\n    break;\n  case 'kea':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kea;\n    break;\n  case 'kea_CV':\n  case 'kea-CV':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kea_CV;\n    break;\n  case 'khq':\n    defaultSymbols = exports.RelativeDateTimeSymbols_khq;\n    break;\n  case 'khq_ML':\n  case 'khq-ML':\n    defaultSymbols = exports.RelativeDateTimeSymbols_khq_ML;\n    break;\n  case 'ki':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ki;\n    break;\n  case 'ki_KE':\n  case 'ki-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ki_KE;\n    break;\n  case 'kk_KZ':\n  case 'kk-KZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kk_KZ;\n    break;\n  case 'kkj':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kkj;\n    break;\n  case 'kkj_CM':\n  case 'kkj-CM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kkj_CM;\n    break;\n  case 'kl':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kl;\n    break;\n  case 'kl_GL':\n  case 'kl-GL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kl_GL;\n    break;\n  case 'kln':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kln;\n    break;\n  case 'kln_KE':\n  case 'kln-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kln_KE;\n    break;\n  case 'km_KH':\n  case 'km-KH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_km_KH;\n    break;\n  case 'kn_IN':\n  case 'kn-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kn_IN;\n    break;\n  case 'ko_KP':\n  case 'ko-KP':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ko_KP;\n    break;\n  case 'ko_KR':\n  case 'ko-KR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ko_KR;\n    break;\n  case 'kok':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kok;\n    break;\n  case 'kok_IN':\n  case 'kok-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kok_IN;\n    break;\n  case 'ks':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ks;\n    break;\n  case 'ks_IN':\n  case 'ks-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ks_IN;\n    break;\n  case 'ksb':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ksb;\n    break;\n  case 'ksb_TZ':\n  case 'ksb-TZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ksb_TZ;\n    break;\n  case 'ksf':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ksf;\n    break;\n  case 'ksf_CM':\n  case 'ksf-CM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ksf_CM;\n    break;\n  case 'ksh':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ksh;\n    break;\n  case 'ksh_DE':\n  case 'ksh-DE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ksh_DE;\n    break;\n  case 'ku':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ku;\n    break;\n  case 'ku_TR':\n  case 'ku-TR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ku_TR;\n    break;\n  case 'kw':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kw;\n    break;\n  case 'kw_GB':\n  case 'kw-GB':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kw_GB;\n    break;\n  case 'ky_KG':\n  case 'ky-KG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ky_KG;\n    break;\n  case 'lag':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lag;\n    break;\n  case 'lag_TZ':\n  case 'lag-TZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lag_TZ;\n    break;\n  case 'lb':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lb;\n    break;\n  case 'lb_LU':\n  case 'lb-LU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lb_LU;\n    break;\n  case 'lg':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lg;\n    break;\n  case 'lg_UG':\n  case 'lg-UG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lg_UG;\n    break;\n  case 'lkt':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lkt;\n    break;\n  case 'lkt_US':\n  case 'lkt-US':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lkt_US;\n    break;\n  case 'ln_AO':\n  case 'ln-AO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ln_AO;\n    break;\n  case 'ln_CD':\n  case 'ln-CD':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ln_CD;\n    break;\n  case 'ln_CF':\n  case 'ln-CF':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ln_CF;\n    break;\n  case 'ln_CG':\n  case 'ln-CG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ln_CG;\n    break;\n  case 'lo_LA':\n  case 'lo-LA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lo_LA;\n    break;\n  case 'lrc':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lrc;\n    break;\n  case 'lrc_IQ':\n  case 'lrc-IQ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lrc_IQ;\n    break;\n  case 'lrc_IR':\n  case 'lrc-IR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lrc_IR;\n    break;\n  case 'lt_LT':\n  case 'lt-LT':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lt_LT;\n    break;\n  case 'lu':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lu;\n    break;\n  case 'lu_CD':\n  case 'lu-CD':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lu_CD;\n    break;\n  case 'luo':\n    defaultSymbols = exports.RelativeDateTimeSymbols_luo;\n    break;\n  case 'luo_KE':\n  case 'luo-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_luo_KE;\n    break;\n  case 'luy':\n    defaultSymbols = exports.RelativeDateTimeSymbols_luy;\n    break;\n  case 'luy_KE':\n  case 'luy-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_luy_KE;\n    break;\n  case 'lv_LV':\n  case 'lv-LV':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lv_LV;\n    break;\n  case 'mas':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mas;\n    break;\n  case 'mas_KE':\n  case 'mas-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mas_KE;\n    break;\n  case 'mas_TZ':\n  case 'mas-TZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mas_TZ;\n    break;\n  case 'mer':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mer;\n    break;\n  case 'mer_KE':\n  case 'mer-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mer_KE;\n    break;\n  case 'mfe':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mfe;\n    break;\n  case 'mfe_MU':\n  case 'mfe-MU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mfe_MU;\n    break;\n  case 'mg':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mg;\n    break;\n  case 'mg_MG':\n  case 'mg-MG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mg_MG;\n    break;\n  case 'mgh':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mgh;\n    break;\n  case 'mgh_MZ':\n  case 'mgh-MZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mgh_MZ;\n    break;\n  case 'mgo':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mgo;\n    break;\n  case 'mgo_CM':\n  case 'mgo-CM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mgo_CM;\n    break;\n  case 'mi':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mi;\n    break;\n  case 'mi_NZ':\n  case 'mi-NZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mi_NZ;\n    break;\n  case 'mk_MK':\n  case 'mk-MK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mk_MK;\n    break;\n  case 'ml_IN':\n  case 'ml-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ml_IN;\n    break;\n  case 'mn_MN':\n  case 'mn-MN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mn_MN;\n    break;\n  case 'mr_IN':\n  case 'mr-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mr_IN;\n    break;\n  case 'ms_BN':\n  case 'ms-BN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ms_BN;\n    break;\n  case 'ms_MY':\n  case 'ms-MY':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ms_MY;\n    break;\n  case 'ms_SG':\n  case 'ms-SG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ms_SG;\n    break;\n  case 'mt_MT':\n  case 'mt-MT':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mt_MT;\n    break;\n  case 'mua':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mua;\n    break;\n  case 'mua_CM':\n  case 'mua-CM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mua_CM;\n    break;\n  case 'my_MM':\n  case 'my-MM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_my_MM;\n    break;\n  case 'mzn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mzn;\n    break;\n  case 'mzn_IR':\n  case 'mzn-IR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mzn_IR;\n    break;\n  case 'naq':\n    defaultSymbols = exports.RelativeDateTimeSymbols_naq;\n    break;\n  case 'naq_NA':\n  case 'naq-NA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_naq_NA;\n    break;\n  case 'nb_NO':\n  case 'nb-NO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nb_NO;\n    break;\n  case 'nb_SJ':\n  case 'nb-SJ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nb_SJ;\n    break;\n  case 'nd':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nd;\n    break;\n  case 'nd_ZW':\n  case 'nd-ZW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nd_ZW;\n    break;\n  case 'nds':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nds;\n    break;\n  case 'nds_DE':\n  case 'nds-DE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nds_DE;\n    break;\n  case 'nds_NL':\n  case 'nds-NL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nds_NL;\n    break;\n  case 'ne_IN':\n  case 'ne-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ne_IN;\n    break;\n  case 'ne_NP':\n  case 'ne-NP':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ne_NP;\n    break;\n  case 'nl_AW':\n  case 'nl-AW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nl_AW;\n    break;\n  case 'nl_BE':\n  case 'nl-BE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nl_BE;\n    break;\n  case 'nl_BQ':\n  case 'nl-BQ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nl_BQ;\n    break;\n  case 'nl_CW':\n  case 'nl-CW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nl_CW;\n    break;\n  case 'nl_NL':\n  case 'nl-NL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nl_NL;\n    break;\n  case 'nl_SR':\n  case 'nl-SR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nl_SR;\n    break;\n  case 'nl_SX':\n  case 'nl-SX':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nl_SX;\n    break;\n  case 'nmg':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nmg;\n    break;\n  case 'nmg_CM':\n  case 'nmg-CM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nmg_CM;\n    break;\n  case 'nn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nn;\n    break;\n  case 'nn_NO':\n  case 'nn-NO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nn_NO;\n    break;\n  case 'nnh':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nnh;\n    break;\n  case 'nnh_CM':\n  case 'nnh-CM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nnh_CM;\n    break;\n  case 'nus':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nus;\n    break;\n  case 'nus_SS':\n  case 'nus-SS':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nus_SS;\n    break;\n  case 'nyn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nyn;\n    break;\n  case 'nyn_UG':\n  case 'nyn-UG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nyn_UG;\n    break;\n  case 'om':\n    defaultSymbols = exports.RelativeDateTimeSymbols_om;\n    break;\n  case 'om_ET':\n  case 'om-ET':\n    defaultSymbols = exports.RelativeDateTimeSymbols_om_ET;\n    break;\n  case 'om_KE':\n  case 'om-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_om_KE;\n    break;\n  case 'or_IN':\n  case 'or-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_or_IN;\n    break;\n  case 'os':\n    defaultSymbols = exports.RelativeDateTimeSymbols_os;\n    break;\n  case 'os_GE':\n  case 'os-GE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_os_GE;\n    break;\n  case 'os_RU':\n  case 'os-RU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_os_RU;\n    break;\n  case 'pa_Arab':\n  case 'pa-Arab':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pa_Arab;\n    break;\n  case 'pa_Arab_PK':\n  case 'pa-Arab-PK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pa_Arab_PK;\n    break;\n  case 'pa_Guru':\n  case 'pa-Guru':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pa_Guru;\n    break;\n  case 'pa_Guru_IN':\n  case 'pa-Guru-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pa_Guru_IN;\n    break;\n  case 'pl_PL':\n  case 'pl-PL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pl_PL;\n    break;\n  case 'ps':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ps;\n    break;\n  case 'ps_AF':\n  case 'ps-AF':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ps_AF;\n    break;\n  case 'ps_PK':\n  case 'ps-PK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ps_PK;\n    break;\n  case 'pt_AO':\n  case 'pt-AO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pt_AO;\n    break;\n  case 'pt_CH':\n  case 'pt-CH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pt_CH;\n    break;\n  case 'pt_CV':\n  case 'pt-CV':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pt_CV;\n    break;\n  case 'pt_GQ':\n  case 'pt-GQ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pt_GQ;\n    break;\n  case 'pt_GW':\n  case 'pt-GW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pt_GW;\n    break;\n  case 'pt_LU':\n  case 'pt-LU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pt_LU;\n    break;\n  case 'pt_MO':\n  case 'pt-MO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pt_MO;\n    break;\n  case 'pt_MZ':\n  case 'pt-MZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pt_MZ;\n    break;\n  case 'pt_ST':\n  case 'pt-ST':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pt_ST;\n    break;\n  case 'pt_TL':\n  case 'pt-TL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pt_TL;\n    break;\n  case 'qu':\n    defaultSymbols = exports.RelativeDateTimeSymbols_qu;\n    break;\n  case 'qu_BO':\n  case 'qu-BO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_qu_BO;\n    break;\n  case 'qu_EC':\n  case 'qu-EC':\n    defaultSymbols = exports.RelativeDateTimeSymbols_qu_EC;\n    break;\n  case 'qu_PE':\n  case 'qu-PE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_qu_PE;\n    break;\n  case 'rm':\n    defaultSymbols = exports.RelativeDateTimeSymbols_rm;\n    break;\n  case 'rm_CH':\n  case 'rm-CH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_rm_CH;\n    break;\n  case 'rn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_rn;\n    break;\n  case 'rn_BI':\n  case 'rn-BI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_rn_BI;\n    break;\n  case 'ro_MD':\n  case 'ro-MD':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ro_MD;\n    break;\n  case 'ro_RO':\n  case 'ro-RO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ro_RO;\n    break;\n  case 'rof':\n    defaultSymbols = exports.RelativeDateTimeSymbols_rof;\n    break;\n  case 'rof_TZ':\n  case 'rof-TZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_rof_TZ;\n    break;\n  case 'ru_BY':\n  case 'ru-BY':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ru_BY;\n    break;\n  case 'ru_KG':\n  case 'ru-KG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ru_KG;\n    break;\n  case 'ru_KZ':\n  case 'ru-KZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ru_KZ;\n    break;\n  case 'ru_MD':\n  case 'ru-MD':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ru_MD;\n    break;\n  case 'ru_RU':\n  case 'ru-RU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ru_RU;\n    break;\n  case 'ru_UA':\n  case 'ru-UA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ru_UA;\n    break;\n  case 'rw':\n    defaultSymbols = exports.RelativeDateTimeSymbols_rw;\n    break;\n  case 'rw_RW':\n  case 'rw-RW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_rw_RW;\n    break;\n  case 'rwk':\n    defaultSymbols = exports.RelativeDateTimeSymbols_rwk;\n    break;\n  case 'rwk_TZ':\n  case 'rwk-TZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_rwk_TZ;\n    break;\n  case 'sah':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sah;\n    break;\n  case 'sah_RU':\n  case 'sah-RU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sah_RU;\n    break;\n  case 'saq':\n    defaultSymbols = exports.RelativeDateTimeSymbols_saq;\n    break;\n  case 'saq_KE':\n  case 'saq-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_saq_KE;\n    break;\n  case 'sbp':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sbp;\n    break;\n  case 'sbp_TZ':\n  case 'sbp-TZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sbp_TZ;\n    break;\n  case 'sd':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sd;\n    break;\n  case 'sd_PK':\n  case 'sd-PK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sd_PK;\n    break;\n  case 'se':\n    defaultSymbols = exports.RelativeDateTimeSymbols_se;\n    break;\n  case 'se_FI':\n  case 'se-FI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_se_FI;\n    break;\n  case 'se_NO':\n  case 'se-NO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_se_NO;\n    break;\n  case 'se_SE':\n  case 'se-SE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_se_SE;\n    break;\n  case 'seh':\n    defaultSymbols = exports.RelativeDateTimeSymbols_seh;\n    break;\n  case 'seh_MZ':\n  case 'seh-MZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_seh_MZ;\n    break;\n  case 'ses':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ses;\n    break;\n  case 'ses_ML':\n  case 'ses-ML':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ses_ML;\n    break;\n  case 'sg':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sg;\n    break;\n  case 'sg_CF':\n  case 'sg-CF':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sg_CF;\n    break;\n  case 'shi':\n    defaultSymbols = exports.RelativeDateTimeSymbols_shi;\n    break;\n  case 'shi_Latn':\n  case 'shi-Latn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_shi_Latn;\n    break;\n  case 'shi_Latn_MA':\n  case 'shi-Latn-MA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_shi_Latn_MA;\n    break;\n  case 'shi_Tfng':\n  case 'shi-Tfng':\n    defaultSymbols = exports.RelativeDateTimeSymbols_shi_Tfng;\n    break;\n  case 'shi_Tfng_MA':\n  case 'shi-Tfng-MA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_shi_Tfng_MA;\n    break;\n  case 'si_LK':\n  case 'si-LK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_si_LK;\n    break;\n  case 'sk_SK':\n  case 'sk-SK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sk_SK;\n    break;\n  case 'sl_SI':\n  case 'sl-SI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sl_SI;\n    break;\n  case 'smn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_smn;\n    break;\n  case 'smn_FI':\n  case 'smn-FI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_smn_FI;\n    break;\n  case 'sn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sn;\n    break;\n  case 'sn_ZW':\n  case 'sn-ZW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sn_ZW;\n    break;\n  case 'so':\n    defaultSymbols = exports.RelativeDateTimeSymbols_so;\n    break;\n  case 'so_DJ':\n  case 'so-DJ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_so_DJ;\n    break;\n  case 'so_ET':\n  case 'so-ET':\n    defaultSymbols = exports.RelativeDateTimeSymbols_so_ET;\n    break;\n  case 'so_KE':\n  case 'so-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_so_KE;\n    break;\n  case 'so_SO':\n  case 'so-SO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_so_SO;\n    break;\n  case 'sq_AL':\n  case 'sq-AL':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sq_AL;\n    break;\n  case 'sq_MK':\n  case 'sq-MK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sq_MK;\n    break;\n  case 'sq_XK':\n  case 'sq-XK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sq_XK;\n    break;\n  case 'sr_Cyrl':\n  case 'sr-Cyrl':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sr_Cyrl;\n    break;\n  case 'sr_Cyrl_BA':\n  case 'sr-Cyrl-BA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sr_Cyrl_BA;\n    break;\n  case 'sr_Cyrl_ME':\n  case 'sr-Cyrl-ME':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sr_Cyrl_ME;\n    break;\n  case 'sr_Cyrl_RS':\n  case 'sr-Cyrl-RS':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sr_Cyrl_RS;\n    break;\n  case 'sr_Cyrl_XK':\n  case 'sr-Cyrl-XK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sr_Cyrl_XK;\n    break;\n  case 'sr_Latn_BA':\n  case 'sr-Latn-BA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sr_Latn_BA;\n    break;\n  case 'sr_Latn_ME':\n  case 'sr-Latn-ME':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sr_Latn_ME;\n    break;\n  case 'sr_Latn_RS':\n  case 'sr-Latn-RS':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sr_Latn_RS;\n    break;\n  case 'sr_Latn_XK':\n  case 'sr-Latn-XK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sr_Latn_XK;\n    break;\n  case 'sv_AX':\n  case 'sv-AX':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sv_AX;\n    break;\n  case 'sv_FI':\n  case 'sv-FI':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sv_FI;\n    break;\n  case 'sv_SE':\n  case 'sv-SE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sv_SE;\n    break;\n  case 'sw_CD':\n  case 'sw-CD':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sw_CD;\n    break;\n  case 'sw_KE':\n  case 'sw-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sw_KE;\n    break;\n  case 'sw_TZ':\n  case 'sw-TZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sw_TZ;\n    break;\n  case 'sw_UG':\n  case 'sw-UG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sw_UG;\n    break;\n  case 'ta_IN':\n  case 'ta-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ta_IN;\n    break;\n  case 'ta_LK':\n  case 'ta-LK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ta_LK;\n    break;\n  case 'ta_MY':\n  case 'ta-MY':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ta_MY;\n    break;\n  case 'ta_SG':\n  case 'ta-SG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ta_SG;\n    break;\n  case 'te_IN':\n  case 'te-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_te_IN;\n    break;\n  case 'teo':\n    defaultSymbols = exports.RelativeDateTimeSymbols_teo;\n    break;\n  case 'teo_KE':\n  case 'teo-KE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_teo_KE;\n    break;\n  case 'teo_UG':\n  case 'teo-UG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_teo_UG;\n    break;\n  case 'tg':\n    defaultSymbols = exports.RelativeDateTimeSymbols_tg;\n    break;\n  case 'tg_TJ':\n  case 'tg-TJ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_tg_TJ;\n    break;\n  case 'th_TH':\n  case 'th-TH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_th_TH;\n    break;\n  case 'ti':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ti;\n    break;\n  case 'ti_ER':\n  case 'ti-ER':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ti_ER;\n    break;\n  case 'ti_ET':\n  case 'ti-ET':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ti_ET;\n    break;\n  case 'tk':\n    defaultSymbols = exports.RelativeDateTimeSymbols_tk;\n    break;\n  case 'tk_TM':\n  case 'tk-TM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_tk_TM;\n    break;\n  case 'to':\n    defaultSymbols = exports.RelativeDateTimeSymbols_to;\n    break;\n  case 'to_TO':\n  case 'to-TO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_to_TO;\n    break;\n  case 'tr_CY':\n  case 'tr-CY':\n    defaultSymbols = exports.RelativeDateTimeSymbols_tr_CY;\n    break;\n  case 'tr_TR':\n  case 'tr-TR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_tr_TR;\n    break;\n  case 'tt':\n    defaultSymbols = exports.RelativeDateTimeSymbols_tt;\n    break;\n  case 'tt_RU':\n  case 'tt-RU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_tt_RU;\n    break;\n  case 'twq':\n    defaultSymbols = exports.RelativeDateTimeSymbols_twq;\n    break;\n  case 'twq_NE':\n  case 'twq-NE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_twq_NE;\n    break;\n  case 'tzm':\n    defaultSymbols = exports.RelativeDateTimeSymbols_tzm;\n    break;\n  case 'tzm_MA':\n  case 'tzm-MA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_tzm_MA;\n    break;\n  case 'ug':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ug;\n    break;\n  case 'ug_CN':\n  case 'ug-CN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ug_CN;\n    break;\n  case 'uk_UA':\n  case 'uk-UA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_uk_UA;\n    break;\n  case 'ur_IN':\n  case 'ur-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ur_IN;\n    break;\n  case 'ur_PK':\n  case 'ur-PK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ur_PK;\n    break;\n  case 'uz_Arab':\n  case 'uz-Arab':\n    defaultSymbols = exports.RelativeDateTimeSymbols_uz_Arab;\n    break;\n  case 'uz_Arab_AF':\n  case 'uz-Arab-AF':\n    defaultSymbols = exports.RelativeDateTimeSymbols_uz_Arab_AF;\n    break;\n  case 'uz_Cyrl':\n  case 'uz-Cyrl':\n    defaultSymbols = exports.RelativeDateTimeSymbols_uz_Cyrl;\n    break;\n  case 'uz_Cyrl_UZ':\n  case 'uz-Cyrl-UZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_uz_Cyrl_UZ;\n    break;\n  case 'uz_Latn':\n  case 'uz-Latn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_uz_Latn;\n    break;\n  case 'uz_Latn_UZ':\n  case 'uz-Latn-UZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_uz_Latn_UZ;\n    break;\n  case 'vai':\n    defaultSymbols = exports.RelativeDateTimeSymbols_vai;\n    break;\n  case 'vai_Latn':\n  case 'vai-Latn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_vai_Latn;\n    break;\n  case 'vai_Latn_LR':\n  case 'vai-Latn-LR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_vai_Latn_LR;\n    break;\n  case 'vai_Vaii':\n  case 'vai-Vaii':\n    defaultSymbols = exports.RelativeDateTimeSymbols_vai_Vaii;\n    break;\n  case 'vai_Vaii_LR':\n  case 'vai-Vaii-LR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_vai_Vaii_LR;\n    break;\n  case 'vi_VN':\n  case 'vi-VN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_vi_VN;\n    break;\n  case 'vun':\n    defaultSymbols = exports.RelativeDateTimeSymbols_vun;\n    break;\n  case 'vun_TZ':\n  case 'vun-TZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_vun_TZ;\n    break;\n  case 'wae':\n    defaultSymbols = exports.RelativeDateTimeSymbols_wae;\n    break;\n  case 'wae_CH':\n  case 'wae-CH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_wae_CH;\n    break;\n  case 'wo':\n    defaultSymbols = exports.RelativeDateTimeSymbols_wo;\n    break;\n  case 'wo_SN':\n  case 'wo-SN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_wo_SN;\n    break;\n  case 'xh':\n    defaultSymbols = exports.RelativeDateTimeSymbols_xh;\n    break;\n  case 'xh_ZA':\n  case 'xh-ZA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_xh_ZA;\n    break;\n  case 'xog':\n    defaultSymbols = exports.RelativeDateTimeSymbols_xog;\n    break;\n  case 'xog_UG':\n  case 'xog-UG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_xog_UG;\n    break;\n  case 'yav':\n    defaultSymbols = exports.RelativeDateTimeSymbols_yav;\n    break;\n  case 'yav_CM':\n  case 'yav-CM':\n    defaultSymbols = exports.RelativeDateTimeSymbols_yav_CM;\n    break;\n  case 'yi':\n    defaultSymbols = exports.RelativeDateTimeSymbols_yi;\n    break;\n  case 'yi_001':\n  case 'yi-001':\n    defaultSymbols = exports.RelativeDateTimeSymbols_yi_001;\n    break;\n  case 'yo':\n    defaultSymbols = exports.RelativeDateTimeSymbols_yo;\n    break;\n  case 'yo_BJ':\n  case 'yo-BJ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_yo_BJ;\n    break;\n  case 'yo_NG':\n  case 'yo-NG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_yo_NG;\n    break;\n  case 'yue':\n    defaultSymbols = exports.RelativeDateTimeSymbols_yue;\n    break;\n  case 'yue_Hans':\n  case 'yue-Hans':\n    defaultSymbols = exports.RelativeDateTimeSymbols_yue_Hans;\n    break;\n  case 'yue_Hans_CN':\n  case 'yue-Hans-CN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_yue_Hans_CN;\n    break;\n  case 'yue_Hant':\n  case 'yue-Hant':\n    defaultSymbols = exports.RelativeDateTimeSymbols_yue_Hant;\n    break;\n  case 'yue_Hant_HK':\n  case 'yue-Hant-HK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_yue_Hant_HK;\n    break;\n  case 'zgh':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zgh;\n    break;\n  case 'zgh_MA':\n  case 'zgh-MA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zgh_MA;\n    break;\n  case 'zh_Hans':\n  case 'zh-Hans':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zh_Hans;\n    break;\n  case 'zh_Hans_CN':\n  case 'zh-Hans-CN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zh_Hans_CN;\n    break;\n  case 'zh_Hans_HK':\n  case 'zh-Hans-HK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zh_Hans_HK;\n    break;\n  case 'zh_Hans_MO':\n  case 'zh-Hans-MO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zh_Hans_MO;\n    break;\n  case 'zh_Hans_SG':\n  case 'zh-Hans-SG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zh_Hans_SG;\n    break;\n  case 'zh_Hant':\n  case 'zh-Hant':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zh_Hant;\n    break;\n  case 'zh_Hant_HK':\n  case 'zh-Hant-HK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zh_Hant_HK;\n    break;\n  case 'zh_Hant_MO':\n  case 'zh-Hant-MO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zh_Hant_MO;\n    break;\n  case 'zh_Hant_TW':\n  case 'zh-Hant-TW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zh_Hant_TW;\n    break;\n  case 'zu_ZA':\n  case 'zu-ZA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zu_ZA;\n    break;\n}\n\nif (defaultSymbols != null) {\n  relativeDateTimeSymbols.setRelativeDateTimeSymbols(defaultSymbols);\n}\n","^;",1579837703000,"^<",["^=",["^7Y","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/relativedatetimesymbolsext.js"],"^O",["^=",["~$goog.i18n.relativeDateTimeSymbolsExt"]],"^W",true,"^X",["^?","^7Y"]],["^ ","^3",[1579837703000],"^4","goog.ui.hsvapalette.js","^5",["^6","goog/ui/hsvapalette.js"],"^7","goog/ui/hsvapalette.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An HSVA (hue/saturation/value/alpha) color palette/picker\n * implementation.\n * Without the styles from the demo css file, only a hex color label and input\n * field show up.\n *\n * @author chrisn@google.com (Chris Nokleberg)\n * @see ../demos/hsvapalette.html\n */\n\ngoog.provide('goog.ui.HsvaPalette');\n\ngoog.require('goog.array');\ngoog.require('goog.color.alpha');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.HsvPalette');\n\n\n\n/**\n * Creates an HSVA palette. Allows a user to select the hue, saturation,\n * value/brightness and alpha/opacity.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @param {string=} opt_color Optional initial color, without alpha (default is\n *     red).\n * @param {number=} opt_alpha Optional initial alpha (default is 1).\n * @param {string=} opt_class Optional base for creating classnames (default is\n *     'goog-hsva-palette').\n * @extends {goog.ui.HsvPalette}\n * @constructor\n * @final\n */\ngoog.ui.HsvaPalette = function(opt_domHelper, opt_color, opt_alpha, opt_class) {\n  goog.ui.HsvaPalette.base(\n      this, 'constructor', opt_domHelper, opt_color, opt_class);\n\n  /**\n   * Alpha transparency of the currently selected color, in [0, 1]. When\n   * undefined, the palette will behave as a non-transparent HSV palette,\n   * assuming full opacity.\n   * @type {number}\n   * @private\n   */\n  this.alpha_ = (opt_alpha !== undefined) ? opt_alpha : 1;\n\n  /**\n   * @override\n   */\n  this.className = opt_class || goog.getCssName('goog-hsva-palette');\n};\ngoog.inherits(goog.ui.HsvaPalette, goog.ui.HsvPalette);\n\n\n/**\n * DOM element representing the alpha background image.\n * @type {HTMLElement}\n * @private\n */\ngoog.ui.HsvaPalette.prototype.aImageEl_;\n\n\n/**\n * DOM element representing the alpha handle.\n * @type {HTMLElement}\n * @private\n */\ngoog.ui.HsvaPalette.prototype.aHandleEl_;\n\n\n/**\n * DOM element representing the swatch backdrop image.\n * @type {Element}\n * @private\n */\ngoog.ui.HsvaPalette.prototype.swatchBackdropEl_;\n\n\n/** @override */\ngoog.ui.HsvaPalette.prototype.getAlpha = function() {\n  return this.alpha_;\n};\n\n\n/**\n * Sets which color is selected and update the UI. The passed color should be\n * in #rrggbb format. The alpha value will be set to 1.\n * @param {number} alpha The selected alpha value, in [0, 1].\n */\ngoog.ui.HsvaPalette.prototype.setAlpha = function(alpha) {\n  this.setColorAlphaHelper_(this.color, alpha);\n};\n\n\n/**\n * Sets which color is selected and update the UI. The passed color should be\n * in #rrggbb format. The alpha value will be set to 1.\n * @param {string} color The selected color.\n * @override\n */\ngoog.ui.HsvaPalette.prototype.setColor = function(color) {\n  this.setColorAlphaHelper_(color, 1);\n};\n\n\n/**\n * Gets the color that is currently selected in this color picker, in #rrggbbaa\n * format.\n * @return {string} The string of the selected color with alpha.\n */\ngoog.ui.HsvaPalette.prototype.getColorRgbaHex = function() {\n  var alphaHex = Math.floor(this.alpha_ * 255).toString(16);\n  return this.color + (alphaHex.length == 1 ? '0' + alphaHex : alphaHex);\n};\n\n\n/**\n * Sets which color is selected and update the UI. The passed color should be\n * in #rrggbbaa format. The alpha value will be set to 1.\n * @param {string} color The selected color with alpha.\n */\ngoog.ui.HsvaPalette.prototype.setColorRgbaHex = function(color) {\n  var parsed = goog.ui.HsvaPalette.parseColorRgbaHex_(color);\n  this.setColorAlphaHelper_(parsed[0], parsed[1]);\n};\n\n\n/**\n * Sets which color and alpha value are selected and update the UI. The passed\n * color should be in #rrggbb format.\n * @param {string} color The selected color in #rrggbb format.\n * @param {number} alpha The selected alpha value, in [0, 1].\n * @private\n */\ngoog.ui.HsvaPalette.prototype.setColorAlphaHelper_ = function(color, alpha) {\n  var colorChange = this.color != color;\n  var alphaChange = this.alpha_ != alpha;\n  this.alpha_ = alpha;\n  this.color = color;\n  if (colorChange) {\n    // This is to prevent multiple event dispatches.\n    this.setColorInternal(color);\n  }\n  if (colorChange || alphaChange) {\n    this.updateUi();\n    this.dispatchEvent(goog.ui.Component.EventType.ACTION);\n  }\n};\n\n\n/** @override */\ngoog.ui.HsvaPalette.prototype.createDom = function() {\n  goog.ui.HsvaPalette.base(this, 'createDom');\n\n  var dom = this.getDomHelper();\n  this.aImageEl_ = /** @type {!HTMLElement} */ (\n      dom.createDom(\n          goog.dom.TagName.DIV, goog.getCssName(this.className, 'a-image')));\n  this.aHandleEl_ = /** @type {!HTMLElement} */ (\n      dom.createDom(\n          goog.dom.TagName.DIV, goog.getCssName(this.className, 'a-handle')));\n  this.swatchBackdropEl_ = dom.createDom(\n      goog.dom.TagName.DIV, goog.getCssName(this.className, 'swatch-backdrop'));\n  var element = this.getElement();\n  dom.appendChild(element, this.aImageEl_);\n  dom.appendChild(element, this.aHandleEl_);\n  dom.appendChild(element, this.swatchBackdropEl_);\n};\n\n\n/** @override */\ngoog.ui.HsvaPalette.prototype.disposeInternal = function() {\n  goog.ui.HsvaPalette.base(this, 'disposeInternal');\n\n  delete this.aImageEl_;\n  delete this.aHandleEl_;\n  delete this.swatchBackdropEl_;\n};\n\n\n/** @override */\ngoog.ui.HsvaPalette.prototype.updateUi = function() {\n  goog.ui.HsvaPalette.base(this, 'updateUi');\n  if (this.isInDocument()) {\n    var a = this.alpha_ * 255;\n    var top = this.aImageEl_.offsetTop -\n        Math.floor(this.aHandleEl_.offsetHeight / 2) +\n        this.aImageEl_.offsetHeight * ((255 - a) / 255);\n    this.aHandleEl_.style.top = top + 'px';\n    this.aImageEl_.style.backgroundColor = this.color;\n    goog.style.setOpacity(this.swatchElement, a / 255);\n  }\n};\n\n\n/** @override */\ngoog.ui.HsvaPalette.prototype.updateInput = function() {\n  if (!goog.array.equals(\n          [this.color, this.alpha_],\n          goog.ui.HsvaPalette.parseUserInput_(this.inputElement.value))) {\n    this.inputElement.value = this.getColorRgbaHex();\n  }\n};\n\n\n/** @override */\ngoog.ui.HsvaPalette.prototype.handleMouseDown = function(e) {\n  goog.ui.HsvaPalette.base(this, 'handleMouseDown', e);\n  if (e.target == this.aImageEl_ || e.target == this.aHandleEl_) {\n    // Setup value change listeners\n    var b = goog.style.getBounds(this.valueBackgroundImageElement);\n    this.handleMouseMoveA_(b, e);\n    this.mouseMoveListener = goog.events.listen(\n        this.getDomHelper().getDocument(), goog.events.EventType.MOUSEMOVE,\n        goog.bind(this.handleMouseMoveA_, this, b));\n    this.mouseUpListener = goog.events.listen(\n        this.getDomHelper().getDocument(), goog.events.EventType.MOUSEUP,\n        this.handleMouseUp, false, this);\n  }\n};\n\n\n/**\n * Handles mousemove events on the document once a drag operation on the alpha\n * slider has started.\n * @param {goog.math.Rect} b Boundaries of the value slider object at the start\n *     of the drag operation.\n * @param {goog.events.Event} e Event object.\n * @private\n */\ngoog.ui.HsvaPalette.prototype.handleMouseMoveA_ = function(b, e) {\n  e.preventDefault();\n  var vportPos = this.getDomHelper().getDocumentScroll();\n  var newA =\n      (b.top + b.height -\n       Math.min(Math.max(vportPos.y + e.clientY, b.top), b.top + b.height)) /\n      b.height;\n  this.setAlpha(newA);\n};\n\n\n/** @override */\ngoog.ui.HsvaPalette.prototype.handleInput = function(e) {\n  var parsed = goog.ui.HsvaPalette.parseUserInput_(this.inputElement.value);\n  if (parsed) {\n    this.setColorAlphaHelper_(parsed[0], parsed[1]);\n  }\n};\n\n\n/**\n * Parses an #rrggbb or #rrggbbaa color string.\n * @param {string} value User-entered color value.\n * @return {Array<?>} A two element array [color, alpha], where color is\n *     #rrggbb and alpha is in [0, 1]. Null if the argument was invalid.\n * @private\n */\ngoog.ui.HsvaPalette.parseUserInput_ = function(value) {\n  if (/^#?[0-9a-f]{8}$/i.test(value)) {\n    return goog.ui.HsvaPalette.parseColorRgbaHex_(value);\n  } else if (/^#?[0-9a-f]{6}$/i.test(value)) {\n    return [value, 1];\n  }\n  return null;\n};\n\n\n/**\n * Parses a #rrggbbaa color string.\n * @param {string} color The color and alpha in #rrggbbaa format.\n * @return {!Array<?>} A two element array [color, alpha], where color is\n *     #rrggbb and alpha is in [0, 1].\n * @private\n */\ngoog.ui.HsvaPalette.parseColorRgbaHex_ = function(color) {\n  var hex = goog.color.alpha.parse(color).hex;\n  return [\n    goog.color.alpha.extractHexColor(hex),\n    parseInt(goog.color.alpha.extractAlpha(hex), 16) / 255\n  ];\n};\n","^;",1579837703000,"^<",["^=",["~$goog.ui.HsvPalette","~$goog.color.alpha","^1P","^?","^1C","^1F","^2O","^1<","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/hsvapalette.js"],"^O",["^=",["~$goog.ui.HsvaPalette"]],"^W",true,"^X",["^?","^2O","^CV","^12","^1<","^1C","^1F","^1P","^CU"]],["^ ","^3",[1579837703000],"^4","goog.events.keycodes.js","^5",["^6","goog/events/keycodes.js"],"^7","goog/events/keycodes.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Constant declarations for common key codes.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/keyhandler.html\n */\n\ngoog.provide('goog.events.KeyCodes');\n\ngoog.forwardDeclare('goog.events.BrowserEvent');\ngoog.require('goog.userAgent');\n\n\n/**\n * Key codes for common characters.\n *\n * This list is not localized and therefore some of the key codes are not\n * correct for non US keyboard layouts. See comments below.\n *\n * @enum {number}\n */\ngoog.events.KeyCodes = {\n  WIN_KEY_FF_LINUX: 0,\n  MAC_ENTER: 3,\n  BACKSPACE: 8,\n  TAB: 9,\n  NUM_CENTER: 12,  // NUMLOCK on FF/Safari Mac\n  ENTER: 13,\n  SHIFT: 16,\n  CTRL: 17,\n  ALT: 18,\n  PAUSE: 19,\n  CAPS_LOCK: 20,\n  ESC: 27,\n  SPACE: 32,\n  PAGE_UP: 33,    // also NUM_NORTH_EAST\n  PAGE_DOWN: 34,  // also NUM_SOUTH_EAST\n  END: 35,        // also NUM_SOUTH_WEST\n  HOME: 36,       // also NUM_NORTH_WEST\n  LEFT: 37,       // also NUM_WEST\n  UP: 38,         // also NUM_NORTH\n  RIGHT: 39,      // also NUM_EAST\n  DOWN: 40,       // also NUM_SOUTH\n  PLUS_SIGN: 43,  // NOT numpad plus\n  PRINT_SCREEN: 44,\n  INSERT: 45,  // also NUM_INSERT\n  DELETE: 46,  // also NUM_DELETE\n  ZERO: 48,\n  ONE: 49,\n  TWO: 50,\n  THREE: 51,\n  FOUR: 52,\n  FIVE: 53,\n  SIX: 54,\n  SEVEN: 55,\n  EIGHT: 56,\n  NINE: 57,\n  FF_SEMICOLON: 59,  // Firefox (Gecko) fires this for semicolon instead of 186\n  FF_EQUALS: 61,     // Firefox (Gecko) fires this for equals instead of 187\n  FF_DASH: 173,      // Firefox (Gecko) fires this for dash instead of 189\n  // Firefox (Gecko) fires this for # on UK keyboards, rather than\n  // Shift+SINGLE_QUOTE.\n  FF_HASH: 163,\n  QUESTION_MARK: 63,  // needs localization\n  AT_SIGN: 64,\n  A: 65,\n  B: 66,\n  C: 67,\n  D: 68,\n  E: 69,\n  F: 70,\n  G: 71,\n  H: 72,\n  I: 73,\n  J: 74,\n  K: 75,\n  L: 76,\n  M: 77,\n  N: 78,\n  O: 79,\n  P: 80,\n  Q: 81,\n  R: 82,\n  S: 83,\n  T: 84,\n  U: 85,\n  V: 86,\n  W: 87,\n  X: 88,\n  Y: 89,\n  Z: 90,\n  META: 91,  // WIN_KEY_LEFT\n  WIN_KEY_RIGHT: 92,\n  CONTEXT_MENU: 93,\n  NUM_ZERO: 96,\n  NUM_ONE: 97,\n  NUM_TWO: 98,\n  NUM_THREE: 99,\n  NUM_FOUR: 100,\n  NUM_FIVE: 101,\n  NUM_SIX: 102,\n  NUM_SEVEN: 103,\n  NUM_EIGHT: 104,\n  NUM_NINE: 105,\n  NUM_MULTIPLY: 106,\n  NUM_PLUS: 107,\n  NUM_MINUS: 109,\n  NUM_PERIOD: 110,\n  NUM_DIVISION: 111,\n  F1: 112,\n  F2: 113,\n  F3: 114,\n  F4: 115,\n  F5: 116,\n  F6: 117,\n  F7: 118,\n  F8: 119,\n  F9: 120,\n  F10: 121,\n  F11: 122,\n  F12: 123,\n  NUMLOCK: 144,\n  SCROLL_LOCK: 145,\n\n  // OS-specific media keys like volume controls and browser controls.\n  FIRST_MEDIA_KEY: 166,\n  LAST_MEDIA_KEY: 183,\n\n  SEMICOLON: 186,             // needs localization\n  DASH: 189,                  // needs localization\n  EQUALS: 187,                // needs localization\n  COMMA: 188,                 // needs localization\n  PERIOD: 190,                // needs localization\n  SLASH: 191,                 // needs localization\n  APOSTROPHE: 192,            // needs localization\n  TILDE: 192,                 // needs localization\n  SINGLE_QUOTE: 222,          // needs localization\n  OPEN_SQUARE_BRACKET: 219,   // needs localization\n  BACKSLASH: 220,             // needs localization\n  CLOSE_SQUARE_BRACKET: 221,  // needs localization\n  WIN_KEY: 224,\n  MAC_FF_META:\n      224,  // Firefox (Gecko) fires this for the meta key instead of 91\n  MAC_WK_CMD_LEFT: 91,   // WebKit Left Command key fired, same as META\n  MAC_WK_CMD_RIGHT: 93,  // WebKit Right Command key fired, different from META\n  WIN_IME: 229,\n\n  // \"Reserved for future use\". Some programs (e.g. the SlingPlayer 2.4 ActiveX\n  // control) fire this as a hacky way to disable screensavers.\n  VK_NONAME: 252,\n\n  // We've seen users whose machines fire this keycode at regular one\n  // second intervals. The common thread among these users is that\n  // they're all using Dell Inspiron laptops, so we suspect that this\n  // indicates a hardware/bios problem.\n  // http://en.community.dell.com/support-forums/laptop/f/3518/p/19285957/19523128.aspx\n  PHANTOM: 255\n};\n\n\n/**\n * Returns false if the event does not contain a text modifying key.\n *\n * When it returns true, the event might be text modifying. It is infeasible to\n * say for sure because of the many different keyboard layouts, so this method\n * errs on the side of assuming a key event is text-modifiable if we cannot be\n * certain it is not. As an example, it will return true for ctrl+a, though in\n * many standard keyboard layouts that key combination would mean \"select all\",\n * and not actually modify the text.\n *\n * @param {goog.events.BrowserEvent} e A key event.\n * @return {boolean} Whether it's a text modifying key.\n */\ngoog.events.KeyCodes.isTextModifyingKeyEvent = function(e) {\n  if (e.altKey && !e.ctrlKey || e.metaKey ||\n      // Function keys don't generate text\n      e.keyCode >= goog.events.KeyCodes.F1 &&\n          e.keyCode <= goog.events.KeyCodes.F12) {\n    return false;\n  }\n\n  if (goog.events.KeyCodes.isCharacterKey(e.keyCode)) {\n    return true;\n  }\n\n  switch (e.keyCode) {\n    // The following keys are quite harmless, even in combination with\n    // CTRL, ALT or SHIFT.\n    case goog.events.KeyCodes.ALT:\n    case goog.events.KeyCodes.CAPS_LOCK:\n    case goog.events.KeyCodes.CONTEXT_MENU:\n    case goog.events.KeyCodes.CTRL:\n    case goog.events.KeyCodes.DOWN:\n    case goog.events.KeyCodes.END:\n    case goog.events.KeyCodes.ESC:\n    case goog.events.KeyCodes.HOME:\n    case goog.events.KeyCodes.INSERT:\n    case goog.events.KeyCodes.LEFT:\n    case goog.events.KeyCodes.MAC_FF_META:\n    case goog.events.KeyCodes.META:\n    case goog.events.KeyCodes.NUMLOCK:\n    case goog.events.KeyCodes.NUM_CENTER:\n    case goog.events.KeyCodes.PAGE_DOWN:\n    case goog.events.KeyCodes.PAGE_UP:\n    case goog.events.KeyCodes.PAUSE:\n    case goog.events.KeyCodes.PHANTOM:\n    case goog.events.KeyCodes.PRINT_SCREEN:\n    case goog.events.KeyCodes.RIGHT:\n    case goog.events.KeyCodes.SCROLL_LOCK:\n    case goog.events.KeyCodes.SHIFT:\n    case goog.events.KeyCodes.UP:\n    case goog.events.KeyCodes.VK_NONAME:\n    case goog.events.KeyCodes.WIN_KEY:\n    case goog.events.KeyCodes.WIN_KEY_RIGHT:\n      return false;\n    case goog.events.KeyCodes.WIN_KEY_FF_LINUX:\n      return !goog.userAgent.GECKO;\n    default:\n      return e.keyCode < goog.events.KeyCodes.FIRST_MEDIA_KEY ||\n          e.keyCode > goog.events.KeyCodes.LAST_MEDIA_KEY;\n  }\n};\n\n\n/**\n * Returns true if the key fires a keypress event in the current browser.\n *\n * Accoridng to MSDN [1] IE only fires keypress events for the following keys:\n * - Letters: A - Z (uppercase and lowercase)\n * - Numerals: 0 - 9\n * - Symbols: ! @ # $ % ^ & * ( ) _ - + = < [ ] { } , . / ? \\ | ' ` \" ~\n * - System: ESC, SPACEBAR, ENTER\n *\n * That's not entirely correct though, for instance there's no distinction\n * between upper and lower case letters.\n *\n * [1] http://msdn2.microsoft.com/en-us/library/ms536939(VS.85).aspx)\n *\n * Safari is similar to IE, but does not fire keypress for ESC.\n *\n * Additionally, IE6 does not fire keydown or keypress events for letters when\n * the control or alt keys are held down and the shift key is not. IE7 does\n * fire keydown in these cases, though, but not keypress.\n *\n * @param {number} keyCode A key code.\n * @param {number=} opt_heldKeyCode Key code of a currently-held key.\n * @param {boolean=} opt_shiftKey Whether the shift key is held down.\n * @param {boolean=} opt_ctrlKey Whether the control key is held down.\n * @param {boolean=} opt_altKey Whether the alt key is held down.\n * @param {boolean=} opt_metaKey Whether the meta key is held down.\n * @return {boolean} Whether it's a key that fires a keypress event.\n */\ngoog.events.KeyCodes.firesKeyPressEvent = function(\n    keyCode, opt_heldKeyCode, opt_shiftKey, opt_ctrlKey, opt_altKey,\n    opt_metaKey) {\n  if (goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher('525')) {\n    return true;\n  }\n\n  if (goog.userAgent.MAC && opt_altKey) {\n    return goog.events.KeyCodes.isCharacterKey(keyCode);\n  }\n\n  // Alt but not AltGr which is represented as Alt+Ctrl.\n  if (opt_altKey && !opt_ctrlKey) {\n    return false;\n  }\n\n  // Saves Ctrl or Alt + key for IE and WebKit 525+, which won't fire keypress.\n  // WebKit prior to 525 won't get this far so no need to check the user agent.\n  // Gecko doesn't need to use the held key for modifiers, it just checks the\n  // ctrl/meta/alt/shiftKey fields.\n  if (!goog.userAgent.GECKO) {\n    if (typeof opt_heldKeyCode === 'number') {\n      opt_heldKeyCode = goog.events.KeyCodes.normalizeKeyCode(opt_heldKeyCode);\n    }\n    var heldKeyIsModifier = opt_heldKeyCode == goog.events.KeyCodes.CTRL ||\n        opt_heldKeyCode == goog.events.KeyCodes.ALT ||\n        goog.userAgent.MAC && opt_heldKeyCode == goog.events.KeyCodes.META;\n    // The Shift key blocks keypresses on Mac iff accompanied by another\n    // modifier.\n    var modifiedShiftKey = opt_heldKeyCode == goog.events.KeyCodes.SHIFT &&\n        (opt_ctrlKey || opt_metaKey);\n    if ((!opt_shiftKey || goog.userAgent.MAC) && heldKeyIsModifier ||\n        goog.userAgent.MAC && modifiedShiftKey) {\n      return false;\n    }\n  }\n\n  // Some keys with Ctrl/Shift do not issue keypress in WEBKIT.\n  if ((goog.userAgent.WEBKIT || goog.userAgent.EDGE) && opt_ctrlKey &&\n      opt_shiftKey) {\n    switch (keyCode) {\n      case goog.events.KeyCodes.BACKSLASH:\n      case goog.events.KeyCodes.OPEN_SQUARE_BRACKET:\n      case goog.events.KeyCodes.CLOSE_SQUARE_BRACKET:\n      case goog.events.KeyCodes.TILDE:\n      case goog.events.KeyCodes.SEMICOLON:\n      case goog.events.KeyCodes.DASH:\n      case goog.events.KeyCodes.EQUALS:\n      case goog.events.KeyCodes.COMMA:\n      case goog.events.KeyCodes.PERIOD:\n      case goog.events.KeyCodes.SLASH:\n      case goog.events.KeyCodes.APOSTROPHE:\n      case goog.events.KeyCodes.SINGLE_QUOTE:\n        return false;\n    }\n  }\n\n  // When Ctrl+<somekey> is held in IE, it only fires a keypress once, but it\n  // continues to fire keydown events as the event repeats.\n  if (goog.userAgent.IE && opt_ctrlKey && opt_heldKeyCode == keyCode) {\n    return false;\n  }\n\n  switch (keyCode) {\n    case goog.events.KeyCodes.ENTER:\n      if (goog.userAgent.GECKO) {\n        // Only Enter, Shift + Enter, Ctrl + Enter causes keypress event on\n        // Firefox.\n        if (opt_metaKey || opt_altKey) {\n          return false;\n        }\n        return !(opt_shiftKey && opt_ctrlKey);\n      } else {\n        return true;\n      }\n    case goog.events.KeyCodes.ESC:\n      return !(\n          goog.userAgent.WEBKIT || goog.userAgent.EDGE || goog.userAgent.GECKO);\n  }\n\n  // Gecko won't fire a keypress event even when the key is a character key if\n  // ctrl, meta or alt are pressed. In all other cases, a keypress event is\n  // only fired when the key is a character.\n  if (goog.userAgent.GECKO && (opt_ctrlKey || opt_altKey || opt_metaKey)) {\n    return false;\n  } else {\n    return goog.events.KeyCodes.isCharacterKey(keyCode);\n  }\n};\n\n\n/**\n * Returns true if the key produces a character.\n * This does not cover characters on non-US keyboards (Russian, Hebrew, etc.).\n *\n * @param {number} keyCode A key code.\n * @return {boolean} Whether it's a character key.\n */\ngoog.events.KeyCodes.isCharacterKey = function(keyCode) {\n  if (keyCode >= goog.events.KeyCodes.ZERO &&\n      keyCode <= goog.events.KeyCodes.NINE) {\n    return true;\n  }\n\n  if (keyCode >= goog.events.KeyCodes.NUM_ZERO &&\n      keyCode <= goog.events.KeyCodes.NUM_MULTIPLY) {\n    return true;\n  }\n\n  if (keyCode >= goog.events.KeyCodes.A && keyCode <= goog.events.KeyCodes.Z) {\n    return true;\n  }\n\n  // Safari sends zero key code for non-latin characters.\n  if ((goog.userAgent.WEBKIT || goog.userAgent.EDGE) && keyCode == 0) {\n    return true;\n  }\n\n  switch (keyCode) {\n    case goog.events.KeyCodes.SPACE:\n    case goog.events.KeyCodes.PLUS_SIGN:\n    case goog.events.KeyCodes.QUESTION_MARK:\n    case goog.events.KeyCodes.AT_SIGN:\n    case goog.events.KeyCodes.NUM_PLUS:\n    case goog.events.KeyCodes.NUM_MINUS:\n    case goog.events.KeyCodes.NUM_PERIOD:\n    case goog.events.KeyCodes.NUM_DIVISION:\n    case goog.events.KeyCodes.SEMICOLON:\n    case goog.events.KeyCodes.FF_SEMICOLON:\n    case goog.events.KeyCodes.DASH:\n    case goog.events.KeyCodes.EQUALS:\n    case goog.events.KeyCodes.FF_EQUALS:\n    case goog.events.KeyCodes.COMMA:\n    case goog.events.KeyCodes.PERIOD:\n    case goog.events.KeyCodes.SLASH:\n    case goog.events.KeyCodes.APOSTROPHE:\n    case goog.events.KeyCodes.SINGLE_QUOTE:\n    case goog.events.KeyCodes.OPEN_SQUARE_BRACKET:\n    case goog.events.KeyCodes.BACKSLASH:\n    case goog.events.KeyCodes.CLOSE_SQUARE_BRACKET:\n    case goog.events.KeyCodes.FF_HASH:\n      return true;\n    case goog.events.KeyCodes.FF_DASH:\n      return goog.userAgent.GECKO;\n    default:\n      return false;\n  }\n};\n\n\n/**\n * Normalizes key codes from OS/Browser-specific value to the general one.\n * @param {number} keyCode The native key code.\n * @return {number} The normalized key code.\n */\ngoog.events.KeyCodes.normalizeKeyCode = function(keyCode) {\n  if (goog.userAgent.GECKO) {\n    return goog.events.KeyCodes.normalizeGeckoKeyCode(keyCode);\n  } else if (goog.userAgent.MAC && goog.userAgent.WEBKIT) {\n    return goog.events.KeyCodes.normalizeMacWebKitKeyCode(keyCode);\n  } else {\n    return keyCode;\n  }\n};\n\n\n/**\n * Normalizes key codes from their Gecko-specific value to the general one.\n * @param {number} keyCode The native key code.\n * @return {number} The normalized key code.\n */\ngoog.events.KeyCodes.normalizeGeckoKeyCode = function(keyCode) {\n  switch (keyCode) {\n    case goog.events.KeyCodes.FF_EQUALS:\n      return goog.events.KeyCodes.EQUALS;\n    case goog.events.KeyCodes.FF_SEMICOLON:\n      return goog.events.KeyCodes.SEMICOLON;\n    case goog.events.KeyCodes.FF_DASH:\n      return goog.events.KeyCodes.DASH;\n    case goog.events.KeyCodes.MAC_FF_META:\n      return goog.events.KeyCodes.META;\n    case goog.events.KeyCodes.WIN_KEY_FF_LINUX:\n      return goog.events.KeyCodes.WIN_KEY;\n    default:\n      return keyCode;\n  }\n};\n\n\n/**\n * Normalizes key codes from their Mac WebKit-specific value to the general one.\n * @param {number} keyCode The native key code.\n * @return {number} The normalized key code.\n */\ngoog.events.KeyCodes.normalizeMacWebKitKeyCode = function(keyCode) {\n  switch (keyCode) {\n    case goog.events.KeyCodes.MAC_WK_CMD_RIGHT:  // 93\n      return goog.events.KeyCodes.META;          // 91\n    default:\n      return keyCode;\n  }\n};\n","^;",1579837703000,"^<",["^=",["^?","^["]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/keycodes.js"],"^O",["^=",["^3H"]],"^W",true,"^X",["^?","^["]],["^ ","^3",[1579837703000],"^4","goog.crypt.blockcipher.js","^5",["^6","goog/crypt/blockcipher.js"],"^7","goog/crypt/blockcipher.js","^8","^9","^:","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Interface definition of a block cipher. A block cipher is a\n * pair of algorithms that implement encryption and decryption of input bytes.\n *\n * @see http://en.wikipedia.org/wiki/Block_cipher\n *\n * @author nnaze@google.com (Nathan Naze)\n */\n\ngoog.provide('goog.crypt.BlockCipher');\n\n\n\n/**\n * Interface definition for a block cipher.\n * @interface\n */\ngoog.crypt.BlockCipher = function() {};\n\n/**\n * Block size, in bytes.\n * @type {number}\n * @const\n * @public\n */\ngoog.crypt.BlockCipher.prototype.BLOCK_SIZE;\n\n/**\n * Encrypt a plaintext block.  The implementation may expect (and assert)\n * a particular block length.\n * @param {!Array<number>|!Uint8Array} input Plaintext array of input bytes.\n * @return {!Array<number>} Encrypted ciphertext array of bytes.  Should be the\n *     same length as input.\n */\ngoog.crypt.BlockCipher.prototype.encrypt;\n\n\n/**\n * Decrypt a plaintext block.  The implementation may expect (and assert)\n * a particular block length.\n * @param {!Array<number>|!Uint8Array} input Ciphertext. Array of input bytes.\n * @return {!Array<number>} Decrypted plaintext array of bytes.  Should be the\n *     same length as input.\n */\ngoog.crypt.BlockCipher.prototype.decrypt;\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/blockcipher.js"],"^O",["^=",["^CF"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.dom.browserrange.geckorange.js","^5",["^6","goog/dom/browserrange/geckorange.js"],"^7","goog/dom/browserrange/geckorange.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the Gecko specific range wrapper.  Inherits most\n * functionality from W3CRange, but adds exceptions as necessary.\n *\n * DO NOT USE THIS FILE DIRECTLY.  Use goog.dom.Range instead.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.dom.browserrange.GeckoRange');\n\ngoog.require('goog.dom.browserrange.W3cRange');\n\n\n\n/**\n * The constructor for Gecko specific browser ranges.\n * @param {Range} range The range object.\n * @constructor\n * @extends {goog.dom.browserrange.W3cRange}\n * @final\n */\ngoog.dom.browserrange.GeckoRange = function(range) {\n  goog.dom.browserrange.W3cRange.call(this, range);\n};\ngoog.inherits(goog.dom.browserrange.GeckoRange, goog.dom.browserrange.W3cRange);\n\n\n/**\n * Creates a range object that selects the given node's text.\n * @param {Node} node The node to select.\n * @return {!goog.dom.browserrange.GeckoRange} A Gecko range wrapper object.\n */\ngoog.dom.browserrange.GeckoRange.createFromNodeContents = function(node) {\n  return new goog.dom.browserrange.GeckoRange(\n      goog.dom.browserrange.W3cRange.getBrowserRangeForNode(node));\n};\n\n\n/**\n * Creates a range object that selects between the given nodes.\n * @param {Node} startNode The node to start with.\n * @param {number} startOffset The offset within the node to start.\n * @param {Node} endNode The node to end with.\n * @param {number} endOffset The offset within the node to end.\n * @return {!goog.dom.browserrange.GeckoRange} A wrapper object.\n */\ngoog.dom.browserrange.GeckoRange.createFromNodes = function(\n    startNode, startOffset, endNode, endOffset) {\n  return new goog.dom.browserrange.GeckoRange(\n      goog.dom.browserrange.W3cRange.getBrowserRangeForNodes(\n          startNode, startOffset, endNode, endOffset));\n};\n\n\n/** @override */\ngoog.dom.browserrange.GeckoRange.prototype.selectInternal = function(\n    selection, reversed) {\n  if (!reversed || this.isCollapsed()) {\n    // The base implementation for select() is more robust, and works fine for\n    // collapsed and forward ranges.  This works around\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=773137, and is tested by\n    // range_test.html's testFocusedElementDisappears.\n    goog.dom.browserrange.GeckoRange.base(\n        this, 'selectInternal', selection, reversed);\n  } else {\n    // Reversed selection -- start with a caret on the end node, and extend it\n    // back to the start.  Unfortunately, collapse() fails when focus is\n    // invalid.\n    selection.collapse(this.getEndNode(), this.getEndOffset());\n    selection.extend(this.getStartNode(), this.getStartOffset());\n  }\n};\n","^;",1579837703000,"^<",["^=",["^2P","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/browserrange/geckorange.js"],"^O",["^=",["~$goog.dom.browserrange.GeckoRange"]],"^W",true,"^X",["^?","^2P"]],["^ ","^3",[1579837703000],"^4","goog.net.xmlhttpfactory.js","^5",["^6","goog/net/xmlhttpfactory.js"],"^7","goog/net/xmlhttpfactory.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Interface for a factory for creating XMLHttpRequest objects\n * and metadata about them.\n * @author dbk@google.com (David Barrett-Kahn)\n */\n\ngoog.provide('goog.net.XmlHttpFactory');\n\n/** @suppress {extraRequire} Typedef. */\ngoog.require('goog.net.XhrLike');\n\n\n\n/**\n * Abstract base class for an XmlHttpRequest factory.\n * @constructor\n */\ngoog.net.XmlHttpFactory = function() {};\n\n\n/**\n * Cache of options - we only actually call internalGetOptions once.\n * @type {?Object}\n * @private\n */\ngoog.net.XmlHttpFactory.prototype.cachedOptions_ = null;\n\n\n/**\n * @return {!goog.net.XhrLike.OrNative} A new XhrLike instance.\n */\ngoog.net.XmlHttpFactory.prototype.createInstance = goog.abstractMethod;\n\n\n/**\n * @return {Object} Options describing how xhr objects obtained from this\n *     factory should be used.\n */\ngoog.net.XmlHttpFactory.prototype.getOptions = function() {\n  return this.cachedOptions_ ||\n      (this.cachedOptions_ = this.internalGetOptions());\n};\n\n\n/**\n * Override this method in subclasses to preserve the caching offered by\n * getOptions().\n * @return {Object} Options describing how xhr objects obtained from this\n *     factory should be used.\n * @protected\n */\ngoog.net.XmlHttpFactory.prototype.internalGetOptions = goog.abstractMethod;\n","^;",1579837703000,"^<",["^=",["^?","^5I"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/xmlhttpfactory.js"],"^O",["^=",["^B:"]],"^W",true,"^X",["^?","^5I"]],["^ ","^3",[1579837703000],"^4","goog.html.safeurl_test_vectors.js","^5",["^6","goog/html/safeurl_test_vectors.js"],"^7","goog/html/safeurl_test_vectors.js","^8","^9","^:","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// AUTOGENERATED. DO NOT EDIT.\n// clang-format off\n\ngoog.provide('goog.html.safeUrlTestVectors');\ngoog.setTestOnly('goog.html.safeUrlTestVectors');\n\ngoog.html.safeUrlTestVectors.BASE_VECTORS = [\n      {input: '', expected: '', safe: true},\n      {input: 'http://example.com/', expected: 'http://example.com/', safe: true},\n      {input: 'https://example.com', expected: 'https://example.com', safe: true},\n      {input: 'mailto:foo@example.com', expected: 'mailto:foo@example.com', safe: true},\n      {input: 'ftp://example.com', expected: 'ftp://example.com', safe: true},\n      {input: 'ftp://username@example.com', expected: 'ftp://username@example.com', safe: true},\n      {input: 'ftp://username:password@example.com', expected: 'ftp://username:password@example.com', safe: true},\n      {input: 'HTtp://example.com/', expected: 'HTtp://example.com/', safe: true},\n      {input: 'https://example.com/path?foo=bar#baz', expected: 'https://example.com/path?foo=bar#baz', safe: true},\n      {input: 'https://example.com:123/path?foo=bar&abc=def#baz', expected: 'https://example.com:123/path?foo=bar&abc=def#baz', safe: true},\n      {input: '//example.com/path', expected: '//example.com/path', safe: true},\n      {input: '/path', expected: '/path', safe: true},\n      {input: '/path?foo=bar#baz', expected: '/path?foo=bar#baz', safe: true},\n      {input: 'path', expected: 'path', safe: true},\n      {input: 'path?foo=bar#baz', expected: 'path?foo=bar#baz', safe: true},\n      {input: 'p//ath', expected: 'p//ath', safe: true},\n      {input: 'p//ath?foo=bar#baz', expected: 'p//ath?foo=bar#baz', safe: true},\n      {input: '#baz', expected: '#baz', safe: true},\n      {input: '?:', expected: '?:', safe: true},\n      {input: 'javascript:evil();', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'javascript:evil();//\\u000Ahttp://good.com/', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:blah', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'not-data:image/png;base64,z=', expected: 'about:invalid#zClosurez', safe: false},\n      {input: ' data:image/png;base64,z=', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:image/png;base64,z= ', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:image/;base64,z=', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:ximage/png', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:ximage/png;base64,z=', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:image/pngx;base64,z=', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:audio/whatever;base64,z=', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:audio/;base64,z=', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:video/whatever;base64,z=', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:video/;base64,z=', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:image/png;base64,', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:image/png;base64,abc=!', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:image/png;base64,$$', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:image/png;base64,\\u0000', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:video/mp4;baze64,z=', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:video/mp4;,z=', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:text/html,sdfsdfsdfsfsdfs;base64,anything', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:image/svg+xml;base64,abc', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'tel:+1234567890', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'sms:+1234567890', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'callto:+1234567890', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'wtai://wp/mc;+1234567890', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'rtsp://example.org/', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'market://details?id=app', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'geo:37.7,42.0', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'skype:chat?jid=foo', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'whatsapp://send?text=Hello', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'ssh://cloud.google.com', expected: 'about:invalid#zClosurez', safe: false},\n      {input: ':', expected: 'about:invalid#zClosurez', safe: false},\n      {input: '\\\\:', expected: 'about:invalid#zClosurez', safe: false},\n      {input: ':/:', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'path\\u000A:', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'java\\u0000script:evil();', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'http://www.f\\u0000\\u0000.com', expected: 'http://www.f\\u0000\\u0000.com', safe: true},\n      {input: 'data:image/png;base64,abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=', expected: 'data:image/png;base64,abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=', safe: true},\n      {input: 'dATa:iMage/pNg;bASe64,abc===', expected: 'dATa:iMage/pNg;bASe64,abc===', safe: true},\n      {input: 'data:image/webp;base64,abc===', expected: 'data:image/webp;base64,abc===', safe: true},\n      {input: 'data:audio/ogg;base64,abc', expected: 'data:audio/ogg;base64,abc', safe: true},\n      {input: 'data:audio/L16;base64,abc', expected: 'data:audio/L16;base64,abc', safe: true},\n      {input: 'data:video/mpeg;base64,abc', expected: 'data:video/mpeg;base64,abc', safe: true},\n      {input: 'data:video/ogg;base64,z=', expected: 'data:video/ogg;base64,z=', safe: true},\n      {input: 'data:video/mp4;base64,z=', expected: 'data:video/mp4;base64,z=', safe: true},\n      {input: 'data:video/webm;base64,z=', expected: 'data:video/webm;base64,z=', safe: true},\n      {input: 'data:video/webm;base64   ,z=', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:video/webm;foo=bar;base64,z=', expected: 'data:video/webm;foo=bar;base64,z=', safe: true},\n      {input: 'data:video/webm;foo=\\\"bar\\\";base64,z=', expected: 'data:video/webm;foo=\\\"bar\\\";base64,z=', safe: true},\n      {input: 'data:video/webm;base64;with_subtype=foo,z=', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:video/webm;foo=base64;with_subtype=foo,z=', expected: 'about:invalid#zClosurez', safe: false},\n      {input: 'data:video/webm;base64=something;with_subtype=foo,z=', expected: 'about:invalid#zClosurez', safe: false}\n];\n\ngoog.html.safeUrlTestVectors.TEL_VECTORS = [\n    {input: 'tEl:+1(23)129-29192A.ABC#;eXt=29', expected: 'tEl:+1(23)129-29192A.ABC#;eXt=29', safe: true},\n    {input: 'tEL:123;randmomparam=123', expected: 'tEL:123;randmomparam=123', safe: true},\n    {input: ':', expected: 'about:invalid#zClosurez', safe: false},\n    {input: 'tell:', expected: 'about:invalid#zClosurez', safe: false},\n    {input: 'not-tel:+1', expected: 'about:invalid#zClosurez', safe: false},\n    {input: ' tel:+1', expected: 'about:invalid#zClosurez', safe: false},\n    {input: 'javascript:evil()', expected: 'about:invalid#zClosurez', safe: false},\n    {input: 'tel:+1234567890', expected: 'tel:+1234567890', safe: true}\n];\n\ngoog.html.safeUrlTestVectors.SMS_VECTORS = [\n    {input: 'sms:+1234567890', expected: 'sms:+1234567890', safe: true},\n    {input: 'sms:?body=message', expected: 'sms:?body=message', safe: true},\n    {input: 'sms:?body=Hello, World!', expected: 'about:invalid#zClosurez', safe: false},\n    {input: 'sms:?body=a&body=b', expected: 'about:invalid#zClosurez', safe: false}\n];\n\ngoog.html.safeUrlTestVectors.SSH_VECTORS = [\n    {input: 'ssh://cloud.google.com', expected: 'ssh://cloud.google.com', safe: true},\n    {input: '', expected: 'about:invalid#zClosurez', safe: false},\n    {input: ':', expected: 'about:invalid#zClosurez', safe: false},\n    {input: 'ssh:cloud.google.com', expected: 'about:invalid#zClosurez', safe: false},\n    {input: ' ssh://cloud.google.com', expected: 'about:invalid#zClosurez', safe: false},\n    {input: 'javascript:evil()', expected: 'about:invalid#zClosurez', safe: false}\n];\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/safeurl_test_vectors.js"],"^O",["^=",["~$goog.html.safeUrlTestVectors"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.crypt.sha384.js","^5",["^6","goog/crypt/sha384.js"],"^7","goog/crypt/sha384.js","^8","^9","^:","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview SHA-384  cryptographic hash.\n *\n * Usage:\n *   var sha384 = new goog.crypt.Sha384();\n *   sha384.update(bytes);\n *   var hash = sha384.digest();\n *\n * @author fy@google.com (Frank Yellin)\n */\n\ngoog.provide('goog.crypt.Sha384');\n\ngoog.require('goog.crypt.Sha2_64bit');\n\n\n\n/**\n * Constructs a SHA-384 cryptographic hash.\n *\n * @constructor\n * @extends {goog.crypt.Sha2_64bit}\n * @final\n * @struct\n */\ngoog.crypt.Sha384 = function() {\n  goog.crypt.Sha384.base(\n      this, 'constructor', 6 /* numHashBlocks */,\n      goog.crypt.Sha384.INIT_HASH_BLOCK_);\n};\ngoog.inherits(goog.crypt.Sha384, goog.crypt.Sha2_64bit);\n\n\n/** @private {!Array<number>} */\ngoog.crypt.Sha384.INIT_HASH_BLOCK_ = [\n  // Section 5.3.4 of\n  // csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf\n  0xcbbb9d5d, 0xc1059ed8,  // H0\n  0x629a292a, 0x367cd507,  // H1\n  0x9159015a, 0x3070dd17,  // H2\n  0x152fecd8, 0xf70e5939,  // H3\n  0x67332667, 0xffc00b31,  // H4\n  0x8eb44a87, 0x68581511,  // H5\n  0xdb0c2e0d, 0x64f98fa7,  // H6\n  0x47b5481d, 0xbefa4fa4   // H7\n];\n","^;",1579837703000,"^<",["^=",["~$goog.crypt.Sha2-64bit","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/sha384.js"],"^O",["^=",["~$goog.crypt.Sha384"]],"^W",true,"^X",["^?","^CZ"]],["^ ","^3",[1579837703000],"^4","goog.net.iframeloadmonitor.js","^5",["^6","goog/net/iframeloadmonitor.js"],"^7","goog/net/iframeloadmonitor.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class that can be used to determine when an iframe is loaded.\n */\n\ngoog.provide('goog.net.IframeLoadMonitor');\n\ngoog.require('goog.dom');\ngoog.require('goog.events');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * The correct way to determine whether a same-domain iframe has completed\n * loading is different in IE and Firefox.  This class abstracts above these\n * differences, providing a consistent interface for:\n * <ol>\n * <li> Determing if an iframe is currently loaded\n * <li> Listening for an iframe that is not currently loaded, to finish loading\n * </ol>\n *\n * @param {HTMLIFrameElement} iframe An iframe.\n * @param {boolean=} opt_hasContent Whether to wait for the loaded iframe to\n *     have content in its document body.\n * @extends {goog.events.EventTarget}\n * @constructor\n * @final\n */\ngoog.net.IframeLoadMonitor = function(iframe, opt_hasContent) {\n  goog.net.IframeLoadMonitor.base(this, 'constructor');\n\n  /**\n   * Iframe whose load state is monitored by this IframeLoadMonitor\n   * @type {HTMLIFrameElement}\n   * @private\n   */\n  this.iframe_ = iframe;\n\n  /**\n   * Whether to wait for the loaded iframe to have content in its document body.\n   * @type {boolean}\n   * @private\n   */\n  this.hasContent_ = !!opt_hasContent;\n\n  /**\n   * Whether or not the iframe is loaded.\n   * @type {boolean}\n   * @private\n   */\n  this.isLoaded_ = this.isLoadedHelper_();\n\n  if (!this.isLoaded_) {\n    // IE 6 (and lower?) does not reliably fire load events, so listen to\n    // readystatechange.\n    // IE 7 does not reliably fire readystatechange events but listening on load\n    // seems to work just fine.\n    var isIe6OrLess =\n        goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('7');\n    var loadEvtType = isIe6OrLess ? goog.events.EventType.READYSTATECHANGE :\n                                    goog.events.EventType.LOAD;\n    this.onloadListenerKey_ = goog.events.listen(\n        this.iframe_, loadEvtType, this.handleLoad_, false, this);\n\n    // Sometimes we still don't get the event callback, so we'll poll just to\n    // be safe.\n    this.intervalId_ = window.setInterval(\n        goog.bind(this.handleLoad_, this),\n        goog.net.IframeLoadMonitor.POLL_INTERVAL_MS_);\n  }\n};\ngoog.inherits(goog.net.IframeLoadMonitor, goog.events.EventTarget);\n\n\n/**\n * Event type dispatched by a goog.net.IframeLoadMonitor when it internal iframe\n * finishes loading for the first time after construction of the\n * goog.net.IframeLoadMonitor\n * @type {string}\n */\ngoog.net.IframeLoadMonitor.LOAD_EVENT = 'ifload';\n\n\n/**\n * Poll interval for polling iframe load states in milliseconds.\n * @type {number}\n * @private\n */\ngoog.net.IframeLoadMonitor.POLL_INTERVAL_MS_ = 100;\n\n\n/**\n * Key for iframe load listener, or null if not currently listening on the\n * iframe for a load event.\n * @type {?goog.events.Key}\n * @private\n */\ngoog.net.IframeLoadMonitor.prototype.onloadListenerKey_ = null;\n\n\n/**\n * Returns whether or not the iframe is loaded.\n * @return {boolean} whether or not the iframe is loaded.\n */\ngoog.net.IframeLoadMonitor.prototype.isLoaded = function() {\n  return this.isLoaded_;\n};\n\n\n/**\n * Stops the poll timer if this IframeLoadMonitor is currently polling.\n * @private\n */\ngoog.net.IframeLoadMonitor.prototype.maybeStopTimer_ = function() {\n  if (this.intervalId_) {\n    window.clearInterval(this.intervalId_);\n    this.intervalId_ = null;\n  }\n};\n\n\n/**\n * Returns the iframe whose load state this IframeLoader monitors.\n * @return {HTMLIFrameElement} the iframe whose load state this IframeLoader\n *     monitors.\n */\ngoog.net.IframeLoadMonitor.prototype.getIframe = function() {\n  return this.iframe_;\n};\n\n\n/** @override */\ngoog.net.IframeLoadMonitor.prototype.disposeInternal = function() {\n  delete this.iframe_;\n  this.maybeStopTimer_();\n  goog.events.unlistenByKey(this.onloadListenerKey_);\n  goog.net.IframeLoadMonitor.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * Returns whether or not the iframe is loaded.  Determines this by inspecting\n * browser dependent properties of the iframe.\n * @return {boolean} whether or not the iframe is loaded.\n * @private\n */\ngoog.net.IframeLoadMonitor.prototype.isLoadedHelper_ = function() {\n  var isLoaded = false;\n\n  try {\n    if (!this.hasContent_ && goog.userAgent.IE &&\n        !goog.userAgent.isVersionOrHigher('11')) {\n      // IE versions before IE11 will reliably have readyState set to complete\n      // if the iframe is loaded.\n      isLoaded = this.iframe_.readyState == 'complete';\n    } else {\n      // For other browsers, check whether the document body exists to determine\n      // whether the iframe has loaded. Older versions of Firefox may fire the\n      // LOAD event early for an empty frame and then, a few hundred\n      // milliseconds later, replace the contentDocument. If the hasContent\n      // check is requested, the iframe is considered loaded only once there is\n      // content in the body.\n      var body = goog.dom.getFrameContentDocument(this.iframe_).body;\n      isLoaded = this.hasContent_ ? !!body && !!body.firstChild : !!body;\n    }\n  } catch (e) {\n    // Ignore these errors. This just means that the iframe is not loaded\n    // IE will throw error reading readyState if the iframe is not appended\n    // to the dom yet.\n    // Firefox will throw error getting the iframe body if the iframe is not\n    // fully loaded.\n  }\n  return isLoaded;\n};\n\n\n/**\n * Handles an event indicating that the loading status of the iframe has\n * changed.  In Firefox this is a goog.events.EventType.LOAD event, in IE\n * this is a goog.events.EventType.READYSTATECHANGED\n * @private\n */\ngoog.net.IframeLoadMonitor.prototype.handleLoad_ = function() {\n  // Only do the handler if the iframe is loaded.\n  if (this.isLoadedHelper_()) {\n    this.maybeStopTimer_();\n    goog.events.unlistenByKey(this.onloadListenerKey_);\n    this.onloadListenerKey_ = null;\n    this.isLoaded_ = true;\n    this.dispatchEvent(goog.net.IframeLoadMonitor.LOAD_EVENT);\n  }\n};\n","^;",1579837703000,"^<",["^=",["^1>","^?","^3W","^[","^1C","^1<"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/iframeloadmonitor.js"],"^O",["^=",["^:@"]],"^W",true,"^X",["^?","^1>","^1<","^3W","^1C","^["]],["^ ","^3",[1579837703000],"^4","goog.ui.slider.js","^5",["^6","goog/ui/slider.js"],"^7","goog/ui/slider.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A slider implementation that allows to select a value within a\n * range by dragging a thumb. The selected value is exposed through getValue().\n *\n * To decorate, the slider should be bound to an element with the class name\n * 'goog-slider' containing a child with the class name 'goog-slider-thumb',\n * whose position is set to relative.\n * Note that you won't be able to see these elements unless they are styled.\n *\n * Slider orientation is horizontal by default.\n * Use setOrientation(goog.ui.Slider.Orientation.VERTICAL) for a vertical\n * slider.\n *\n * Decorate Example:\n * <div id=\"slider\" class=\"goog-slider\">\n *   <div class=\"goog-slider-thumb\"></div>\n * </div>\n *\n * JavaScript code:\n * <code>\n *   var slider = new goog.ui.Slider;\n *   slider.decorate(document.getElementById('slider'));\n * </code>\n *\n * @author arv@google.com (Erik Arvidsson)\n * @see ../demos/slider.html\n */\n\n// Implementation note: We implement slider by inheriting from baseslider,\n// which allows to select sub-ranges within a range using two thumbs. All we do\n// is we co-locate the two thumbs into one.\n\ngoog.provide('goog.ui.Slider');\ngoog.provide('goog.ui.Slider.Orientation');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.ui.SliderBase');\n\n\n\n/**\n * This creates a slider object.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @param {(function(number):?string)=} opt_labelFn An optional function mapping\n *     slider values to a description of the value.\n * @constructor\n * @extends {goog.ui.SliderBase}\n */\ngoog.ui.Slider = function(opt_domHelper, opt_labelFn) {\n  goog.ui.SliderBase.call(this, opt_domHelper, opt_labelFn);\n  this.rangeModel.setExtent(0);\n};\ngoog.inherits(goog.ui.Slider, goog.ui.SliderBase);\ngoog.tagUnsealableClass(goog.ui.Slider);\n\n\n/**\n * Expose Enum of superclass (representing the orientation of the slider) within\n * Slider namespace.\n *\n * @enum {string}\n */\ngoog.ui.Slider.Orientation = goog.ui.SliderBase.Orientation;\n\n\n/**\n * The prefix we use for the CSS class names for the slider and its elements.\n * @type {string}\n */\ngoog.ui.Slider.CSS_CLASS_PREFIX = goog.getCssName('goog-slider');\n\n\n/**\n * CSS class name for the single thumb element.\n * @type {string}\n */\ngoog.ui.Slider.THUMB_CSS_CLASS =\n    goog.getCssName(goog.ui.Slider.CSS_CLASS_PREFIX, 'thumb');\n\n\n/**\n * Returns CSS class applied to the slider element.\n * @param {goog.ui.SliderBase.Orientation} orient Orientation of the slider.\n * @return {string} The CSS class applied to the slider element.\n * @protected\n * @override\n */\ngoog.ui.Slider.prototype.getCssClass = function(orient) {\n  return orient == goog.ui.SliderBase.Orientation.VERTICAL ?\n      goog.getCssName(goog.ui.Slider.CSS_CLASS_PREFIX, 'vertical') :\n      goog.getCssName(goog.ui.Slider.CSS_CLASS_PREFIX, 'horizontal');\n};\n\n\n/**\n * Returns CSS class applied to the slider's thumb element.\n * @return {string} The CSS class applied to the slider's thumb element.\n * @protected\n */\ngoog.ui.Slider.prototype.getThumbCssClass = function() {\n  return goog.ui.Slider.THUMB_CSS_CLASS;\n};\n\n\n/** @override */\ngoog.ui.Slider.prototype.createThumbs = function() {\n  // find thumb\n  var element = this.getElement();\n  var thumb = goog.dom.getElementsByTagNameAndClass(\n      null, this.getThumbCssClass(), element)[0];\n  if (!thumb) {\n    thumb = this.createThumb_();\n    element.appendChild(thumb);\n  }\n  this.valueThumb = this.extentThumb = /** @type {!HTMLDivElement} */ (thumb);\n};\n\n\n/**\n * Creates the thumb element.\n * @return {!HTMLDivElement} The created thumb element.\n * @private\n */\ngoog.ui.Slider.prototype.createThumb_ = function() {\n  var thumb = this.getDomHelper().createDom(\n      goog.dom.TagName.DIV, this.getThumbCssClass());\n  goog.a11y.aria.setRole(thumb, goog.a11y.aria.Role.BUTTON);\n  return /** @type {!HTMLDivElement} */ (thumb);\n};\n","^;",1579837703000,"^<",["^=",["^1>","^1O","^6N","^?","~$goog.ui.SliderBase","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/slider.js"],"^O",["^=",["~$goog.ui.Slider.Orientation","~$goog.ui.Slider"]],"^W",true,"^X",["^?","^1O","^6N","^1>","^12","^D0"]],["^ ","^3",[1579837703000],"^4","goog.dom.browserfeature.js","^5",["^6","goog/dom/browserfeature.js"],"^7","goog/dom/browserfeature.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Browser capability checks for the dom package.\n *\n */\n\n\ngoog.provide('goog.dom.BrowserFeature');\n\ngoog.require('goog.userAgent');\n\n\n/**\n * @define {boolean} Whether we know at compile time that the browser doesn't\n * support OffscreenCanvas.\n */\ngoog.dom.BrowserFeature.ASSUME_NO_OFFSCREEN_CANVAS =\n    goog.define('goog.dom.ASSUME_NO_OFFSCREEN_CANVAS', false);\n\n/**\n * @define {boolean} Whether we know at compile time that the browser supports\n * all OffscreenCanvas contexts.\n */\n// TODO(user): Eventually this should default to \"FEATURESET_YEAR >= 202X\".\ngoog.dom.BrowserFeature.ASSUME_OFFSCREEN_CANVAS =\n    goog.define('goog.dom.ASSUME_OFFSCREEN_CANVAS', false);\n\n/**\n * Detects if a particular OffscreenCanvas context is supported.\n * @param {string} contextName name of the context to test.\n * @return {boolean} Whether the browser supports this OffscreenCanvas context.\n * @private\n */\ngoog.dom.BrowserFeature.detectOffscreenCanvas_ = function(contextName) {\n  // This code only gets removed because we forced @nosideeffects on\n  // the functions. See: b/138802376\n  try {\n    return Boolean(new self.OffscreenCanvas(0, 0).getContext(contextName));\n  } catch (ex) {\n  }\n  return false;\n};\n\n/**\n * Whether the browser supports OffscreenCanvas 2D context.\n * @const {boolean}\n */\ngoog.dom.BrowserFeature.OFFSCREEN_CANVAS_2D =\n    !goog.dom.BrowserFeature.ASSUME_NO_OFFSCREEN_CANVAS &&\n    (goog.dom.BrowserFeature.ASSUME_OFFSCREEN_CANVAS ||\n     goog.dom.BrowserFeature.detectOffscreenCanvas_('2d'));\n\n/**\n * Whether attributes 'name' and 'type' can be added to an element after it's\n * created. False in Internet Explorer prior to version 9.\n * @const {boolean}\n */\ngoog.dom.BrowserFeature.CAN_ADD_NAME_OR_TYPE_ATTRIBUTES =\n    !goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9);\n\n/**\n * Whether we can use element.children to access an element's Element\n * children. Available since Gecko 1.9.1, IE 9. (IE<9 also includes comment\n * nodes in the collection.)\n * @const {boolean}\n */\ngoog.dom.BrowserFeature.CAN_USE_CHILDREN_ATTRIBUTE =\n    !goog.userAgent.GECKO && !goog.userAgent.IE ||\n    goog.userAgent.IE && goog.userAgent.isDocumentModeOrHigher(9) ||\n    goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9.1');\n\n/**\n * Opera, Safari 3, and Internet Explorer 9 all support innerText but they\n * include text nodes in script and style tags. Not document-mode-dependent.\n * @const {boolean}\n */\ngoog.dom.BrowserFeature.CAN_USE_INNER_TEXT =\n    (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9'));\n\n/**\n * MSIE, Opera, and Safari>=4 support element.parentElement to access an\n * element's parent if it is an Element.\n * @const {boolean}\n */\ngoog.dom.BrowserFeature.CAN_USE_PARENT_ELEMENT_PROPERTY =\n    goog.userAgent.IE || goog.userAgent.OPERA || goog.userAgent.WEBKIT;\n\n/**\n * Whether NoScope elements need a scoped element written before them in\n * innerHTML.\n * MSDN: http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx#1\n * @const {boolean}\n */\ngoog.dom.BrowserFeature.INNER_HTML_NEEDS_SCOPED_ELEMENT = goog.userAgent.IE;\n\n/**\n * Whether we use legacy IE range API.\n * @const {boolean}\n */\ngoog.dom.BrowserFeature.LEGACY_IE_RANGES =\n    goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9);\n","^;",1579837703000,"^<",["^=",["^?","^["]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/browserfeature.js"],"^O",["^=",["~$goog.dom.BrowserFeature"]],"^W",true,"^X",["^?","^["]],["^ ","^3",[1579837703000],"^4","goog.events.pastehandler.js","^5",["^6","goog/events/pastehandler.js"],"^7","goog/events/pastehandler.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a 'paste' event detector that works consistently\n * across different browsers.\n *\n * IE5, IE6, IE7, Safari3.0 and FF3.0 all fire 'paste' events on textareas.\n * FF2 doesn't. This class uses 'paste' events when they are available\n * and uses heuristics to detect the 'paste' event when they are not available.\n *\n * Known issue: will not detect paste events in FF2 if you pasted exactly the\n * same existing text.\n * Known issue: Opera + Mac doesn't work properly because of the meta key. We\n * can probably fix that. TODO(user): {@link KeyboardShortcutHandler} does not\n * work either very well with opera + mac. fix that.\n *\n * @see ../demos/pastehandler.html\n */\n\ngoog.provide('goog.events.PasteHandler');\ngoog.provide('goog.events.PasteHandler.EventType');\ngoog.provide('goog.events.PasteHandler.State');\n\ngoog.require('goog.Timer');\ngoog.require('goog.async.ConditionalDelay');\ngoog.require('goog.events.BrowserEvent');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.log');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A paste event detector. Gets an `element` as parameter and fires\n * `goog.events.PasteHandler.EventType.PASTE` events when text is\n * pasted in the `element`. Uses heuristics to detect paste events in FF2.\n * See more details of the heuristic on {@link #handleEvent_}.\n *\n * @param {Element} element The textarea element we are listening on.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.events.PasteHandler = function(element) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * The element that you want to listen for paste events on.\n   * @type {Element}\n   * @private\n   */\n  this.element_ = element;\n\n  /**\n   * The last known value of the element. Kept to check if things changed. See\n   * more details on {@link #handleEvent_}.\n   * @type {string}\n   * @private\n   */\n  this.oldValue_ = this.element_.value;\n\n  /**\n   * Handler for events.\n   * @type {goog.events.EventHandler<!goog.events.PasteHandler>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  /**\n   * The last time an event occurred on the element. Kept to check whether the\n   * last event was generated by two input events or by multiple fast key events\n   * that got swallowed. See more details on {@link #handleEvent_}.\n   * @type {number}\n   * @private\n   */\n  this.lastTime_ = goog.now();\n\n  if (goog.events.PasteHandler.SUPPORTS_NATIVE_PASTE_EVENT) {\n    // Most modern browsers support the paste event.\n    this.eventHandler_.listen(\n        element, goog.events.EventType.PASTE, this.dispatch_);\n  } else {\n    // But FF2 and Opera doesn't. we listen for a series of events to try to\n    // find out if a paste occurred. We enumerate and cover all known ways to\n    // paste text on textareas.  See more details on {@link #handleEvent_}.\n    var events = [\n      goog.events.EventType.KEYDOWN, goog.events.EventType.BLUR,\n      goog.events.EventType.FOCUS, goog.events.EventType.MOUSEOVER, 'input'\n    ];\n    this.eventHandler_.listen(element, events, this.handleEvent_);\n  }\n\n  /**\n   * ConditionalDelay used to poll for changes in the text element once users\n   * paste text. Browsers fire paste events BEFORE the text is actually present\n   * in the element.value property.\n   * @type {goog.async.ConditionalDelay}\n   * @private\n   */\n  this.delay_ =\n      new goog.async.ConditionalDelay(goog.bind(this.checkUpdatedText_, this));\n\n};\ngoog.inherits(goog.events.PasteHandler, goog.events.EventTarget);\n\n\n/**\n * The types of events fired by this class.\n * @enum {string}\n */\ngoog.events.PasteHandler.EventType = {\n  /**\n   * Dispatched as soon as the paste event is detected, but before the pasted\n   * text has been added to the text element we're listening to.\n   */\n  PASTE: 'paste',\n\n  /**\n   * Dispatched after detecting a change to the value of text element\n   * (within 200msec of receiving the PASTE event).\n   */\n  AFTER_PASTE: 'after_paste'\n};\n\n\n/**\n * The mandatory delay we expect between two `input` events, used to\n * differentiated between non key paste events and key events.\n * @type {number}\n */\ngoog.events.PasteHandler.MANDATORY_MS_BETWEEN_INPUT_EVENTS_TIE_BREAKER = 400;\n\n\n/**\n * Whether current UA supoprts the native \"paste\" event type.\n * @const {boolean}\n */\ngoog.events.PasteHandler.SUPPORTS_NATIVE_PASTE_EVENT = goog.userAgent.WEBKIT ||\n    goog.userAgent.IE || goog.userAgent.EDGE ||\n    (goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9'));\n\n\n/**\n * The period between each time we check whether the pasted text appears in the\n * text element or not.\n * @type {number}\n * @private\n */\ngoog.events.PasteHandler.PASTE_POLLING_PERIOD_MS_ = 50;\n\n\n/**\n * The maximum amount of time we want to poll for changes.\n * @type {number}\n * @private\n */\ngoog.events.PasteHandler.PASTE_POLLING_TIMEOUT_MS_ = 200;\n\n\n/**\n * The states that this class can be found, on the paste detection algorithm.\n * @enum {string}\n */\ngoog.events.PasteHandler.State = {\n  INIT: 'init',\n  FOCUSED: 'focused',\n  TYPING: 'typing'\n};\n\n\n/**\n * The initial state of the paste detection algorithm.\n * @type {goog.events.PasteHandler.State}\n * @private\n */\ngoog.events.PasteHandler.prototype.state_ = goog.events.PasteHandler.State.INIT;\n\n\n/**\n * The previous event that caused us to be on the current state.\n * @type {?string}\n * @private\n */\ngoog.events.PasteHandler.prototype.previousEvent_;\n\n\n/**\n * A logger, used to help us debug the algorithm.\n * @type {goog.log.Logger}\n * @private\n */\ngoog.events.PasteHandler.prototype.logger_ =\n    goog.log.getLogger('goog.events.PasteHandler');\n\n\n/** @override */\ngoog.events.PasteHandler.prototype.disposeInternal = function() {\n  goog.events.PasteHandler.superClass_.disposeInternal.call(this);\n  this.eventHandler_.dispose();\n  this.eventHandler_ = null;\n  this.delay_.dispose();\n  this.delay_ = null;\n};\n\n\n/**\n * Returns the current state of the paste detection algorithm. Used mostly for\n * testing.\n * @return {goog.events.PasteHandler.State} The current state of the class.\n */\ngoog.events.PasteHandler.prototype.getState = function() {\n  return this.state_;\n};\n\n\n/**\n * Returns the event handler.\n * @return {goog.events.EventHandler<T>} The event handler.\n * @protected\n * @this {T}\n * @template T\n */\ngoog.events.PasteHandler.prototype.getEventHandler = function() {\n  return this.eventHandler_;\n};\n\n\n/**\n * Checks whether the element.value property was updated, and if so, dispatches\n * the event that let clients know that the text is available.\n * @return {boolean} Whether the polling should stop or not, based on whether\n *     we found a text change or not.\n * @private\n */\ngoog.events.PasteHandler.prototype.checkUpdatedText_ = function() {\n  if (this.oldValue_ == this.element_.value) {\n    return false;\n  }\n  goog.log.info(this.logger_, 'detected textchange after paste');\n  this.dispatchEvent(goog.events.PasteHandler.EventType.AFTER_PASTE);\n  return true;\n};\n\n\n/**\n * Dispatches the paste event.\n * @param {goog.events.BrowserEvent} e The underlying browser event.\n * @private\n */\ngoog.events.PasteHandler.prototype.dispatch_ = function(e) {\n  var event = new goog.events.BrowserEvent(e.getBrowserEvent());\n  event.type = goog.events.PasteHandler.EventType.PASTE;\n  this.dispatchEvent(event);\n\n  // Starts polling for updates in the element.value property so we can tell\n  // when do dispatch the AFTER_PASTE event. (We do an initial check after an\n  // async delay of 0 msec since some browsers update the text right away and\n  // our poller will always wait one period before checking).\n  goog.Timer.callOnce(function() {\n    if (!this.checkUpdatedText_()) {\n      this.delay_.start(\n          goog.events.PasteHandler.PASTE_POLLING_PERIOD_MS_,\n          goog.events.PasteHandler.PASTE_POLLING_TIMEOUT_MS_);\n    }\n  }, 0, this);\n};\n\n\n/**\n * The main event handler which implements a state machine.\n *\n * To handle FF2, we enumerate and cover all the known ways a user can paste:\n *\n * 1) ctrl+v, shift+insert, cmd+v\n * 2) right click -> paste\n * 3) edit menu -> paste\n * 4) drag and drop\n * 5) middle click\n *\n * (1) is easy and can be detected by listening for key events and finding out\n * which keys are pressed. (2), (3), (4) and (5) do not generate a key event,\n * so we need to listen for more than that. (2-5) all generate 'input' events,\n * but so does key events. So we need to have some sort of 'how did the input\n * event was generated' history algorithm.\n *\n * (2) is an interesting case in Opera on a Mac: since Macs does not have two\n * buttons, right clicking involves pressing the CTRL key. Even more interesting\n * is the fact that opera does NOT set the e.ctrlKey bit. Instead, it sets\n * e.keyCode = 0.\n * {@link http://www.quirksmode.org/js/keys.html}\n *\n * (1) is also an interesting case in Opera on a Mac: Opera is the only browser\n * covered by this class that can detect the cmd key (FF2 can't apparently). And\n * it fires e.keyCode = 17, which is the CTRL key code.\n * {@link http://www.quirksmode.org/js/keys.html}\n *\n * NOTE(user, pbarry): There is an interesting thing about (5): on Linux, (5)\n * pastes the last thing that you highlighted, not the last thing that you\n * ctrl+c'ed. This code will still generate a `PASTE` event though.\n *\n * We enumerate all the possible steps a user can take to paste text and we\n * implemented the transition between the steps in a state machine. The\n * following is the design of the state machine:\n *\n * matching paths:\n *\n * (1) happens on INIT -> FOCUSED -> TYPING -> [e.ctrlKey & e.keyCode = 'v']\n * (2-3) happens on INIT -> FOCUSED -> [input event happened]\n * (4) happens on INIT -> [mouseover && text changed]\n *\n * non matching paths:\n *\n * user is typing normally\n * INIT -> FOCUS -> TYPING -> INPUT -> INIT\n *\n * @param {goog.events.BrowserEvent} e The underlying browser event.\n * @private\n */\ngoog.events.PasteHandler.prototype.handleEvent_ = function(e) {\n  // transition between states happen at each browser event, and depend on the\n  // current state, the event that led to this state, and the event input.\n  switch (this.state_) {\n    case goog.events.PasteHandler.State.INIT: {\n      this.handleUnderInit_(e);\n      break;\n    }\n    case goog.events.PasteHandler.State.FOCUSED: {\n      this.handleUnderFocused_(e);\n      break;\n    }\n    case goog.events.PasteHandler.State.TYPING: {\n      this.handleUnderTyping_(e);\n      break;\n    }\n    default: {\n      goog.log.error(this.logger_, 'invalid ' + this.state_ + ' state');\n    }\n  }\n  this.lastTime_ = goog.now();\n  this.oldValue_ = this.element_.value;\n  goog.log.info(this.logger_, e.type + ' -> ' + this.state_);\n  this.previousEvent_ = e.type;\n};\n\n\n/**\n * `goog.events.PasteHandler.EventType.INIT` is the first initial state\n * the textarea is found. You can only leave this state by setting focus on the\n * textarea, which is how users will input text. You can also paste things using\n * drag and drop, which will not generate a `goog.events.EventType.FOCUS`\n * event, but will generate a `goog.events.EventType.MOUSEOVER`.\n *\n * For browsers that support the 'paste' event, we match it and stay on the same\n * state.\n *\n * @param {goog.events.BrowserEvent} e The underlying browser event.\n * @private\n */\ngoog.events.PasteHandler.prototype.handleUnderInit_ = function(e) {\n  switch (e.type) {\n    case goog.events.EventType.BLUR: {\n      this.state_ = goog.events.PasteHandler.State.INIT;\n      break;\n    }\n    case goog.events.EventType.FOCUS: {\n      this.state_ = goog.events.PasteHandler.State.FOCUSED;\n      break;\n    }\n    case goog.events.EventType.MOUSEOVER: {\n      this.state_ = goog.events.PasteHandler.State.INIT;\n      if (this.element_.value != this.oldValue_) {\n        goog.log.info(this.logger_, 'paste by dragdrop while on init!');\n        this.dispatch_(e);\n      }\n      break;\n    }\n    default: {\n      goog.log.error(\n          this.logger_, 'unexpected event ' + e.type + 'during init');\n    }\n  }\n};\n\n\n/**\n * `goog.events.PasteHandler.EventType.FOCUSED` is typically the second\n * state the textarea will be, which is followed by the `INIT` state. On\n * this state, users can paste in three different ways: edit -> paste,\n * right click -> paste and drag and drop.\n *\n * The latter will generate a `goog.events.EventType.MOUSEOVER` event,\n * which we match by making sure the textarea text changed. The first two will\n * generate an 'input', which we match by making sure it was NOT generated by a\n * key event (which also generates an 'input' event).\n *\n * Unfortunately, in Firefox, if you type fast, some KEYDOWN events are\n * swallowed but an INPUT event may still happen. That means we need to\n * differentiate between two consecutive INPUT events being generated either by\n * swallowed key events OR by a valid edit -> paste -> edit -> paste action. We\n * do this by checking a minimum time between the two events. This heuristic\n * seems to work well, but it is obviously a heuristic :).\n *\n * @param {goog.events.BrowserEvent} e The underlying browser event.\n * @private\n */\ngoog.events.PasteHandler.prototype.handleUnderFocused_ = function(e) {\n  switch (e.type) {\n    case 'input': {\n      // there are two different events that happen in practice that involves\n      // consecutive 'input' events. we use a heuristic to differentiate\n      // between the one that generates a valid paste action and the one that\n      // doesn't.\n      // @see testTypingReallyFastDispatchesTwoInputEventsBeforeTheKEYDOWNEvent\n      // and\n      // @see testRightClickRightClickAlsoDispatchesTwoConsecutiveInputEvents\n      // Notice that an 'input' event may be also triggered by a 'middle click'\n      // paste event, which is described in\n      // @see testMiddleClickWithoutFocusTriggersPasteEvent\n      var minimumMilisecondsBetweenInputEvents = this.lastTime_ +\n          goog.events.PasteHandler\n              .MANDATORY_MS_BETWEEN_INPUT_EVENTS_TIE_BREAKER;\n      if (goog.now() > minimumMilisecondsBetweenInputEvents ||\n          this.previousEvent_ == goog.events.EventType.FOCUS) {\n        goog.log.info(this.logger_, 'paste by textchange while focused!');\n        this.dispatch_(e);\n      }\n      break;\n    }\n    case goog.events.EventType.BLUR: {\n      this.state_ = goog.events.PasteHandler.State.INIT;\n      break;\n    }\n    case goog.events.EventType.KEYDOWN: {\n      goog.log.info(this.logger_, 'key down ... looking for ctrl+v');\n      // Opera + MAC does not set e.ctrlKey. Instead, it gives me e.keyCode = 0.\n      // http://www.quirksmode.org/js/keys.html\n      if (goog.userAgent.MAC && goog.userAgent.OPERA && e.keyCode == 0 ||\n          goog.userAgent.MAC && goog.userAgent.OPERA && e.keyCode == 17) {\n        break;\n      }\n      this.state_ = goog.events.PasteHandler.State.TYPING;\n      break;\n    }\n    case goog.events.EventType.MOUSEOVER: {\n      if (this.element_.value != this.oldValue_) {\n        goog.log.info(this.logger_, 'paste by dragdrop while focused!');\n        this.dispatch_(e);\n      }\n      break;\n    }\n    default: {\n      goog.log.error(\n          this.logger_, 'unexpected event ' + e.type + ' during focused');\n    }\n  }\n};\n\n\n/**\n * `goog.events.PasteHandler.EventType.TYPING` is the third state\n * this class can be. It exists because each KEYPRESS event will ALSO generate\n * an INPUT event (because the textarea value changes), and we need to\n * differentiate between an INPUT event generated by a key event and an INPUT\n * event generated by edit -> paste actions.\n *\n * This is the state that we match the ctrl+v pattern.\n *\n * @param {goog.events.BrowserEvent} e The underlying browser event.\n * @private\n */\ngoog.events.PasteHandler.prototype.handleUnderTyping_ = function(e) {\n  switch (e.type) {\n    case 'input': {\n      this.state_ = goog.events.PasteHandler.State.FOCUSED;\n      break;\n    }\n    case goog.events.EventType.BLUR: {\n      this.state_ = goog.events.PasteHandler.State.INIT;\n      break;\n    }\n    case goog.events.EventType.KEYDOWN: {\n      if (e.ctrlKey && e.keyCode == goog.events.KeyCodes.V ||\n          e.shiftKey && e.keyCode == goog.events.KeyCodes.INSERT ||\n          e.metaKey && e.keyCode == goog.events.KeyCodes.V) {\n        goog.log.info(this.logger_, 'paste by ctrl+v while keypressed!');\n        this.dispatch_(e);\n      }\n      break;\n    }\n    case goog.events.EventType.MOUSEOVER: {\n      if (this.element_.value != this.oldValue_) {\n        goog.log.info(this.logger_, 'paste by dragdrop while keypressed!');\n        this.dispatch_(e);\n      }\n      break;\n    }\n    default: {\n      goog.log.error(\n          this.logger_, 'unexpected event ' + e.type + ' during keypressed');\n    }\n  }\n};\n","^;",1579837703000,"^<",["^=",["^1T","^3O","^?","^3W","^[","^18","^1C","~$goog.async.ConditionalDelay","^4Y","^3H"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/pastehandler.js"],"^O",["^=",["~$goog.events.PasteHandler.State","~$goog.events.PasteHandler.EventType","~$goog.events.PasteHandler"]],"^W",true,"^X",["^?","^3O","^D4","^4Y","^1T","^3W","^1C","^3H","^18","^["]],["^ ","^3",[1579837703000],"^4","goog.datasource.fastdatanode.js","^5",["^6","goog/datasource/fastdatanode.js"],"^7","goog/datasource/fastdatanode.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview\n * Efficient implementation of DataNode API.\n *\n * The implementation consists of three concrete classes for modelling\n * DataNodes with different characteristics: FastDataNode,\n * FastPrimitiveDataNode and FastListNode.\n *\n * FastDataNode is for bean-like or map-like objects that consists of\n * key/value mappings and where the primary access pattern is by key.\n *\n * FastPrimitiveDataNode wraps primitives like strings, boolean, and numbers.\n *\n * FastListNode is for array-like data nodes. It also supports key-based\n * lookups if the data nodes have an \"id\" property or if child nodes are\n * explicitly added by name. It is most efficient if these features are not\n * used.\n *\n * FastDataNodes can be constructed from JSON-like objects via the function\n * goog.ds.FastDataNode.fromJs.\n\n */\n\ngoog.provide('goog.ds.AbstractFastDataNode');\ngoog.provide('goog.ds.FastDataNode');\ngoog.provide('goog.ds.FastListNode');\ngoog.provide('goog.ds.PrimitiveFastDataNode');\n\ngoog.require('goog.ds.DataManager');\ngoog.require('goog.ds.DataNodeList');\ngoog.require('goog.ds.EmptyNodeList');\ngoog.require('goog.string');\n\n/*\n * Implementation note: In order to reduce the number of objects,\n * FastDataNode stores its key/value mappings directly in the FastDataNode\n * object iself (instead of a separate map). To make this work we have to\n * sure that there are no name clashes with other attribute names used by\n * FastDataNode (like dataName and parent). This is especially difficult in\n * the light of automatic renaming by the JavaScript compiler. For this reason,\n * all internal attributes start with \"__\" so that they are not renamed\n * by the compiler.\n */\n\n/**\n * Creates a new abstract data node.\n * @param {string} dataName Name of the datanode.\n * @param {goog.ds.DataNode=} opt_parent Parent of this data node.\n * @constructor\n * @extends {goog.ds.DataNodeList}\n */\n// TODO(arv): Use interfaces when available.\ngoog.ds.AbstractFastDataNode = function(dataName, opt_parent) {\n  if (!dataName) {\n    throw new Error('Cannot create a fast data node without a data name');\n  }\n  this['__dataName'] = dataName;\n  this['__parent'] = opt_parent;\n};\n\n\n/**\n * Return the name of this data node.\n * @return {string} Name of this data noden.\n * @override\n */\ngoog.ds.AbstractFastDataNode.prototype.getDataName = function() {\n  return this['__dataName'];\n};\n\n\n/**\n * Set the name of this data node.\n * @param {string} value Name.\n * @override\n */\ngoog.ds.AbstractFastDataNode.prototype.setDataName = function(value) {\n  this['__dataName'] = value;\n};\n\n\n/**\n * Get the path leading to this data node.\n * @return {string} Data path.\n * @override\n */\ngoog.ds.AbstractFastDataNode.prototype.getDataPath = function() {\n  var parentPath;\n  if (this['__parent']) {\n    parentPath = this['__parent'].getDataPath() + goog.ds.STR_PATH_SEPARATOR;\n  } else {\n    parentPath = '';\n  }\n  return parentPath + this.getDataName();\n};\n\n\n\n/**\n * Creates a new fast data node, using the properties of root.\n * @param {Object} root JSON-like object to initialize data node from.\n * @param {string} dataName Name of this data node.\n * @param {goog.ds.DataNode=} opt_parent Parent of this data node.\n * @extends {goog.ds.AbstractFastDataNode}\n * @constructor\n */\ngoog.ds.FastDataNode = function(root, dataName, opt_parent) {\n  goog.ds.AbstractFastDataNode.call(this, dataName, opt_parent);\n  this.extendWith(root);\n};\ngoog.inherits(goog.ds.FastDataNode, goog.ds.AbstractFastDataNode);\n\n\n/**\n * Add all attributes of object to this data node.\n * @param {Object} object Object to add attributes from.\n * @protected\n */\ngoog.ds.FastDataNode.prototype.extendWith = function(object) {\n  for (var key in object) {\n    this[key] = object[key];\n  }\n};\n\n\n/**\n * Creates a new FastDataNode structure initialized from object. This will\n * return an instance of the most suitable sub-class of FastDataNode.\n *\n * You should not modify object after creating a fast data node from it\n * or assume that changing object changes the data node. Doing so results\n * in undefined behaviour.\n *\n * @param {Object|number|boolean|string} object Object to initialize data\n *     node from.\n * @param {string} dataName Name of data node.\n * @param {goog.ds.DataNode=} opt_parent Parent of data node.\n * @return {!goog.ds.AbstractFastDataNode} Data node representing object.\n */\ngoog.ds.FastDataNode.fromJs = function(object, dataName, opt_parent) {\n  if (goog.isArray(object)) {\n    return new goog.ds.FastListNode(object, dataName, opt_parent);\n  } else if (goog.isObject(object)) {\n    return new goog.ds.FastDataNode(object, dataName, opt_parent);\n  } else {\n    return new goog.ds.PrimitiveFastDataNode(\n        object || !!object, dataName, opt_parent);\n  }\n};\n\n\n/**\n * Static instance of an empty list.\n * @type {!goog.ds.EmptyNodeList}\n * @private\n */\ngoog.ds.FastDataNode.emptyList_ = new goog.ds.EmptyNodeList();\n\n\n/**\n * Not supported for normal FastDataNodes.\n * @param {*} value Value to set data node to.\n * @override\n */\ngoog.ds.FastDataNode.prototype.set = function(value) {\n  throw new Error('Not implemented yet');\n};\n\n\n/** @override */\ngoog.ds.FastDataNode.prototype.getChildNodes = function(opt_selector) {\n  if (!opt_selector || opt_selector == goog.ds.STR_ALL_CHILDREN_SELECTOR) {\n    return this;\n  } else if (opt_selector.indexOf(goog.ds.STR_WILDCARD) == -1) {\n    var child = this.getChildNode(opt_selector);\n    return child ? new goog.ds.FastListNode([child], '') :\n                   new goog.ds.EmptyNodeList();\n  } else {\n    throw new Error('Unsupported selector: ' + opt_selector);\n  }\n};\n\n\n/**\n * Makes sure that a named child is wrapped in a data node structure.\n * @param {string} name Name of child to wrap.\n * @private\n */\ngoog.ds.FastDataNode.prototype.wrapChild_ = function(name) {\n  var child = this[name];\n  if (child != null && !child.getDataName) {\n    this[name] = goog.ds.FastDataNode.fromJs(this[name], name, this);\n  }\n};\n\n\n/**\n * Get a child node by name.\n * @param {string} name Name of child node.\n * @param {boolean=} opt_create Whether to create the child if it does not\n * exist.\n * @return {goog.ds.DataNode} Child node.\n * @override\n */\ngoog.ds.FastDataNode.prototype.getChildNode = function(name, opt_create) {\n  this.wrapChild_(name);\n  // this[name] always is a data node object, so using \"||\" is fine.\n  var child = this[name] || null;\n  if (child == null && opt_create) {\n    child = new goog.ds.FastDataNode({}, name, this);\n    this[name] = child;\n  }\n  return child;\n};\n\n\n/**\n * Sets a child node. Creates the child if it does not exist.\n *\n * Calling  this function makes any child nodes previously obtained for name\n * invalid. You should not use these child nodes but instead obtain a new\n * instance by calling getChildNode.\n *\n * @override\n */\ngoog.ds.FastDataNode.prototype.setChildNode = function(name, value) {\n  if (value != null) {\n    this[name] = value;\n  } else {\n    delete this[name];\n  }\n  goog.ds.DataManager.getInstance().fireDataChange(\n      this.getDataPath() + goog.ds.STR_PATH_SEPARATOR + name);\n  return null;\n};\n\n\n/**\n * Returns the value of a child node. By using this method you can avoid\n * the need to create PrimitiveFastData nodes.\n * @param {string} name Name of child node.\n * @return {Object} Value of child node.\n * @override\n */\ngoog.ds.FastDataNode.prototype.getChildNodeValue = function(name) {\n  var child = this[name];\n  if (child != null) {\n    return (child.getDataName ? child.get() : child);\n  } else {\n    return null;\n  }\n};\n\n\n/**\n * Returns whether this data node is a list. Always returns false for\n * instances of FastDataNode but may return true for subclasses.\n * @return {boolean} Whether this data node is array-like.\n * @override\n */\ngoog.ds.FastDataNode.prototype.isList = function() {\n  return false;\n};\n\n\n/**\n * Returns a javascript object representation of this data node. You should\n * not modify the object returned by this function.\n * @return {!Object} JavaScript object representation of this data node.\n */\ngoog.ds.FastDataNode.prototype.getJsObject = function() {\n  var result = {};\n  for (var key in this) {\n    if (!goog.string.startsWith(key, '__') && !goog.isFunction(this[key])) {\n      result[key] =\n          (this[key]['__dataName'] ? this[key].getJsObject() : this[key]);\n    }\n  }\n  return result;\n};\n\n\n/**\n * Creates a deep copy of this data node.\n * @return {goog.ds.FastDataNode} Clone of this data node.\n */\ngoog.ds.FastDataNode.prototype.clone = function() {\n  return /** @type {!goog.ds.FastDataNode} */ (\n      goog.ds.FastDataNode.fromJs(this.getJsObject(), this.getDataName()));\n};\n\n\n/*\n * Implementation of goog.ds.DataNodeList for FastDataNode.\n */\n\n\n/**\n * Adds a child to this data node.\n * @param {goog.ds.DataNode} value Child node to add.\n * @override\n */\ngoog.ds.FastDataNode.prototype.add = function(value) {\n  this.setChildNode(value.getDataName(), value);\n};\n\n\n/**\n * Gets the value of this data node (if called without opt_key) or\n * gets a child node (if called with opt_key).\n * @param {string=} opt_key Name of child node.\n * @return {*} This data node or a child node.\n * @override\n */\ngoog.ds.FastDataNode.prototype.get = function(opt_key) {\n  if (opt_key === undefined) {\n    // if there is no key, DataNode#get was called\n    return this;\n  } else {\n    return this.getChildNode(opt_key);\n  }\n};\n\n\n/**\n * Gets a child node by index. This method has a complexity of O(n) where\n * n is the number of children. If you need a faster implementation of this\n * method, you should use goog.ds.FastListNode.\n * @param {number} index Index of child node (starting from 0).\n * @return {goog.ds.DataNode} Child node at specified index.\n * @override\n */\ngoog.ds.FastDataNode.prototype.getByIndex = function(index) {\n  var i = 0;\n  for (var key in this) {\n    if (!goog.string.startsWith(key, '__') && !goog.isFunction(this[key])) {\n      if (i == index) {\n        this.wrapChild_(key);\n        return this[key];\n      }\n      ++i;\n    }\n  }\n  return null;\n};\n\n\n/**\n * Gets the number of child nodes. This method has a complexity of O(n) where\n * n is the number of children. If you need a faster implementation of this\n * method, you should use goog.ds.FastListNode.\n * @return {number} Number of child nodes.\n * @override\n */\ngoog.ds.FastDataNode.prototype.getCount = function() {\n  var count = 0;\n  for (var key in this) {\n    if (!goog.string.startsWith(key, '__') && !goog.isFunction(this[key])) {\n      ++count;\n    }\n  }\n  // maybe cache this?\n  return count;\n};\n\n\n/**\n * Sets a child node.\n * @param {string} name Name of child node.\n * @param {Object} value Value of child node.\n * @override\n */\ngoog.ds.FastDataNode.prototype.setNode = function(name, value) {\n  this.setChildNode(name, value);\n};\n\n\n/**\n * Removes a child node.\n * @override\n */\ngoog.ds.FastDataNode.prototype.removeNode = function(name) {\n  delete this[name];\n  return false;\n};\n\n\n\n/**\n * Creates a new data node wrapping a primitive value.\n * @param {number|boolean|string} value Value the value to wrap.\n * @param {string} dataName name Name of this data node.\n * @param {goog.ds.DataNode=} opt_parent Parent of this data node.\n * @extends {goog.ds.AbstractFastDataNode}\n * @constructor\n * @final\n */\ngoog.ds.PrimitiveFastDataNode = function(value, dataName, opt_parent) {\n  this.value_ = value;\n  goog.ds.AbstractFastDataNode.call(this, dataName, opt_parent);\n};\ngoog.inherits(goog.ds.PrimitiveFastDataNode, goog.ds.AbstractFastDataNode);\n\n\n/**\n * Returns the value of this data node.\n * @return {(boolean|number|string)} Value of this data node.\n * @override\n */\ngoog.ds.PrimitiveFastDataNode.prototype.get = function() {\n  return this.value_;\n};\n\n\n/**\n * Sets this data node to a new value.\n * @param {*} value Value to set data node to.\n * @override\n */\ngoog.ds.PrimitiveFastDataNode.prototype.set = function(value) {\n  if (goog.isArray(value) || goog.isObject(value)) {\n    throw new Error('can only set PrimitiveFastDataNode to primitive values');\n  }\n  this.value_ = value;\n  goog.ds.DataManager.getInstance().fireDataChange(this.getDataPath());\n};\n\n\n/**\n * Returns child nodes of this data node. Always returns an unmodifiable,\n * empty list.\n * @return {!goog.ds.DataNodeList} (Empty) list of child nodes.\n * @override\n */\ngoog.ds.PrimitiveFastDataNode.prototype.getChildNodes = function() {\n  return goog.ds.FastDataNode.emptyList_;\n};\n\n\n/**\n * Get a child node by name. Always returns null.\n * @param {string} name Name of child node.\n * @return {goog.ds.DataNode} Child node.\n * @override\n */\ngoog.ds.PrimitiveFastDataNode.prototype.getChildNode = function(name) {\n  return null;\n};\n\n\n/**\n * Returns the value of a child node. Always returns null.\n * @param {string} name Name of child node.\n * @return {Object} Value of child node.\n * @override\n */\ngoog.ds.PrimitiveFastDataNode.prototype.getChildNodeValue = function(name) {\n  return null;\n};\n\n\n/**\n * Not supported by primitive data nodes.\n * @param {string} name Name of child node.\n * @param {Object} value Value of child node.\n * @override\n */\ngoog.ds.PrimitiveFastDataNode.prototype.setChildNode = function(name, value) {\n  throw new Error('Cannot set a child node for a PrimitiveFastDataNode');\n};\n\n\n/**\n * Returns whether this data node is a list. Always returns false for\n * instances of PrimitiveFastDataNode.\n * @return {boolean} Whether this data node is array-like.\n * @override\n */\ngoog.ds.PrimitiveFastDataNode.prototype.isList = function() {\n  return false;\n};\n\n\n/**\n * Returns a javascript object representation of this data node. You should\n * not modify the object returned by this function.\n * @return {*} JavaScript object representation of this data node.\n */\ngoog.ds.PrimitiveFastDataNode.prototype.getJsObject = function() {\n  return this.value_;\n};\n\n\n/**\n * Creates a new list node from an array.\n * @param {Array<?>} values values hold by this list node.\n * @param {string} dataName name of this node.\n * @param {goog.ds.DataNode=} opt_parent parent of this node.\n * @extends {goog.ds.AbstractFastDataNode}\n * @constructor\n * @final\n */\n// TODO(arv): Use interfaces when available.  This implements DataNodeList\n// as well.\ngoog.ds.FastListNode = function(values, dataName, opt_parent) {\n  this.values_ = [];\n  for (var i = 0; i < values.length; ++i) {\n    var name = values[i].id || ('[' + i + ']');\n    this.values_.push(goog.ds.FastDataNode.fromJs(values[i], name, this));\n    if (values[i].id) {\n      if (!this.map_) {\n        this.map_ = {};\n      }\n      this.map_[values[i].id] = i;\n    }\n  }\n  goog.ds.AbstractFastDataNode.call(this, dataName, opt_parent);\n};\ngoog.inherits(goog.ds.FastListNode, goog.ds.AbstractFastDataNode);\n\n\n/**\n * Not supported for FastListNodes.\n * @param {*} value Value to set data node to.\n * @override\n */\ngoog.ds.FastListNode.prototype.set = function(value) {\n  throw new Error('Cannot set a FastListNode to a new value');\n};\n\n\n/**\n * Returns child nodes of this data node. Currently, only supports\n * returning all children.\n * @return {!goog.ds.DataNodeList} List of child nodes.\n * @override\n */\ngoog.ds.FastListNode.prototype.getChildNodes = function() {\n  return this;\n};\n\n\n/**\n * Get a child node by name.\n * @param {string} key Name of child node.\n * @param {boolean=} opt_create Whether to create the child if it does not\n * exist.\n * @return {goog.ds.DataNode} Child node.\n * @override\n */\ngoog.ds.FastListNode.prototype.getChildNode = function(key, opt_create) {\n  var index = this.getKeyAsNumber_(key);\n  if (index == null && this.map_) {\n    index = this.map_[key];\n  }\n  if (index != null && this.values_[index]) {\n    return this.values_[index];\n  } else if (opt_create) {\n    this.setChildNode(key, {});\n    return this.getChildNode(key);\n  } else {\n    return null;\n  }\n};\n\n\n/**\n * Returns the value of a child node.\n * @param {string} key Name of child node.\n * @return {*} Value of child node.\n * @override\n */\ngoog.ds.FastListNode.prototype.getChildNodeValue = function(key) {\n  var child = this.getChildNode(key);\n  return (child ? child.get() : null);\n};\n\n\n/**\n * Tries to interpret key as a numeric index enclosed by square brakcets.\n * @param {string} key Key that should be interpreted as a number.\n * @return {?number} Numeric index or null if key is not of the form\n *  described above.\n * @private\n */\ngoog.ds.FastListNode.prototype.getKeyAsNumber_ = function(key) {\n  if (key.charAt(0) == '[' && key.charAt(key.length - 1) == ']') {\n    return Number(key.substring(1, key.length - 1));\n  } else {\n    return null;\n  }\n};\n\n\n/**\n * Sets a child node. Creates the child if it does not exist. To set\n * children at a certain index, use a key of the form '[index]'. Note, that\n * you can only set values at existing numeric indices. To add a new node\n * to this list, you have to use the add method.\n *\n * Calling  this function makes any child nodes previously obtained for name\n * invalid. You should not use these child nodes but instead obtain a new\n * instance by calling getChildNode.\n *\n * @override\n */\ngoog.ds.FastListNode.prototype.setChildNode = function(key, value) {\n  var count = this.values_.length;\n  if (value != null) {\n    if (!value.getDataName) {\n      value = goog.ds.FastDataNode.fromJs(value, key, this);\n    }\n    var index = this.getKeyAsNumber_(key);\n    if (index != null) {\n      if (index < 0 || index >= this.values_.length) {\n        throw new Error('List index out of bounds: ' + index);\n      }\n      // NOTE: This code here appears to want to use \"index\" rather than\n      // \"key\" here (which would be better for an array. However, changing\n      // that would require knowing that there wasn't a mix of non-number\n      // keys, as using index that would risk overwriting those values if\n      // they were set first.  Instead we loosen the type so we can use\n      // strings as indexes.\n\n      /** @type {!Object} */\n      var values = this.values_;\n\n      values[key] = value;\n    } else {\n      if (!this.map_) {\n        this.map_ = {};\n      }\n      this.values_.push(value);\n      this.map_[key] = this.values_.length - 1;\n    }\n  } else {\n    this.removeNode(key);\n  }\n  var dm = goog.ds.DataManager.getInstance();\n  dm.fireDataChange(this.getDataPath() + goog.ds.STR_PATH_SEPARATOR + key);\n  if (this.values_.length != count) {\n    this.listSizeChanged_();\n  }\n  return null;\n};\n\n\n/**\n * Fire data changes that are appropriate when the size of this list changes.\n * Should be called whenever the list size has changed.\n * @private\n */\ngoog.ds.FastListNode.prototype.listSizeChanged_ = function() {\n  var dm = goog.ds.DataManager.getInstance();\n  dm.fireDataChange(this.getDataPath());\n  dm.fireDataChange(\n      this.getDataPath() + goog.ds.STR_PATH_SEPARATOR + 'count()');\n};\n\n\n/**\n * Returns whether this data node is a list. Always returns true.\n * @return {boolean} Whether this data node is array-like.\n * @override\n */\ngoog.ds.FastListNode.prototype.isList = function() {\n  return true;\n};\n\n\n/**\n * Returns a javascript object representation of this data node. You should\n * not modify the object returned by this function.\n * @return {!Object} JavaScript object representation of this data node.\n */\ngoog.ds.FastListNode.prototype.getJsObject = function() {\n  var result = [];\n  for (var i = 0; i < this.values_.length; ++i) {\n    result.push(this.values_[i].getJsObject());\n  }\n  return result;\n};\n\n\n/*\n * Implementation of goog.ds.DataNodeList for FastListNode.\n */\n\n\n/**\n * Adds a child to this data node\n * @param {goog.ds.DataNode} value Child node to add.\n * @override\n */\ngoog.ds.FastListNode.prototype.add = function(value) {\n  if (!value.getDataName) {\n    value = goog.ds.FastDataNode.fromJs(\n        value, String('[' + (this.values_.length) + ']'), this);\n  }\n  this.values_.push(value);\n  var dm = goog.ds.DataManager.getInstance();\n  dm.fireDataChange(\n      this.getDataPath() + goog.ds.STR_PATH_SEPARATOR + '[' +\n      (this.values_.length - 1) + ']');\n  this.listSizeChanged_();\n};\n\n\n/**\n * Gets the value of this data node (if called without opt_key) or\n * gets a child node (if called with opt_key).\n * @param {string=} opt_key Name of child node.\n * @return {Array|goog.ds.DataNode} Array of child nodes (if called without\n *     opt_key), or a named child node otherwise.\n * @override\n */\ngoog.ds.FastListNode.prototype.get = function(opt_key) {\n  // if there are no arguments, DataNode.get was called\n  if (opt_key === undefined) {\n    return this.values_;\n  } else {\n    return this.getChildNode(opt_key);\n  }\n};\n\n\n/**\n * Gets a child node by (numeric) index.\n * @param {number} index Index of child node (starting from 0).\n * @return {goog.ds.DataNode} Child node at specified index.\n * @override\n */\ngoog.ds.FastListNode.prototype.getByIndex = function(index) {\n  var child = this.values_[index];\n  return (child != null ? child : null);  // never return undefined\n};\n\n\n/**\n * Gets the number of child nodes.\n * @return {number} Number of child nodes.\n * @override\n */\ngoog.ds.FastListNode.prototype.getCount = function() {\n  return this.values_.length;\n};\n\n\n/**\n * Sets a child node.\n * @param {string} name Name of child node.\n * @param {Object} value Value of child node.\n * @override\n */\ngoog.ds.FastListNode.prototype.setNode = function(name, value) {\n  throw new Error(\n      'Setting child nodes of a FastListNode is not implemented, yet');\n};\n\n\n/**\n * Removes a child node.\n * @override\n */\ngoog.ds.FastListNode.prototype.removeNode = function(name) {\n  var index = this.getKeyAsNumber_(name);\n  if (index == null && this.map_) {\n    index = this.map_[name];\n  }\n  if (index != null) {\n    this.values_.splice(index, 1);\n    if (this.map_) {\n      var keyToDelete = null;\n      for (var key in this.map_) {\n        if (this.map_[key] == index) {\n          keyToDelete = key;\n        } else if (this.map_[key] > index) {\n          --this.map_[key];\n        }\n      }\n      if (keyToDelete) {\n        delete this.map_[keyToDelete];\n      }\n    }\n    var dm = goog.ds.DataManager.getInstance();\n    dm.fireDataChange(\n        this.getDataPath() + goog.ds.STR_PATH_SEPARATOR + '[' + index + ']');\n    this.listSizeChanged_();\n  }\n  return false;\n};\n\n\n/**\n * Returns the index of a named child nodes. This method only works if\n * this list uses mixed name/indexed lookup, i.e. if its child node have\n * an 'id' attribute.\n * @param {string} name Name of child node to determine index of.\n * @return {number} Index of child node named name.\n */\ngoog.ds.FastListNode.prototype.indexOf = function(name) {\n  var index = this.getKeyAsNumber_(name);\n  if (index == null && this.map_) {\n    index = this.map_[name];\n  }\n  if (index == null) {\n    throw new Error('Cannot determine index for: ' + name);\n  }\n  return /** @type {number} */ (index);\n};\n","^;",1579837703000,"^<",["^=",["~$goog.ds.EmptyNodeList","^2L","^?","~$goog.ds.DataNodeList","~$goog.ds.DataManager"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/datasource/fastdatanode.js"],"^O",["^=",["~$goog.ds.AbstractFastDataNode","~$goog.ds.PrimitiveFastDataNode","~$goog.ds.FastListNode","~$goog.ds.FastDataNode"]],"^W",true,"^X",["^?","^D:","^D9","^D8","^2L"]],["^ ","^3",[1579837703000],"^4","goog.testing.style.style.js","^5",["^6","goog/testing/style/style.js"],"^7","goog/testing/style/style.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for inspecting page layout. This is a port of\n *     http://go/layoutbot.java\n *     See {@link http://go/layouttesting}.\n */\n\ngoog.setTestOnly('goog.testing.style');\ngoog.provide('goog.testing.style');\n\ngoog.require('goog.dom');\ngoog.require('goog.math.Rect');\ngoog.require('goog.style');\n\n\n/**\n * Determines whether the bounding rectangles of the given elements intersect.\n * @param {Element} element The first element.\n * @param {Element} otherElement The second element.\n * @return {boolean} Whether the bounding rectangles of the given elements\n *     intersect.\n */\ngoog.testing.style.intersects = function(element, otherElement) {\n  var elementRect = goog.style.getBounds(element);\n  var otherElementRect = goog.style.getBounds(otherElement);\n  return goog.math.Rect.intersects(elementRect, otherElementRect);\n};\n\n\n/**\n * Determines whether the element has visible dimensions, i.e. x > 0 && y > 0.\n * @param {Element} element The element to check.\n * @return {boolean} Whether the element has visible dimensions.\n */\ngoog.testing.style.hasVisibleDimensions = function(element) {\n  var elSize = goog.style.getSize(element);\n  var shortest = elSize.getShortest();\n  if (shortest <= 0) {\n    return false;\n  }\n\n  return true;\n};\n\n\n/**\n * Determines whether the CSS style of the element renders it visible.\n * Elements detached from the document are considered invisible.\n * @param {!Element} element The element to check.\n * @return {boolean} Whether the CSS style of the element renders it visible.\n */\ngoog.testing.style.isVisible = function(element) {\n  if (!goog.dom.isInDocument(element)) {\n    return false;\n  }\n  var style = getComputedStyle(element);\n  return style.visibility != 'hidden' && style.display != 'none';\n};\n\n\n/**\n * Test whether the given element is on screen.\n * @param {!Element} el The element to test.\n * @return {boolean} Whether the element is on the screen.\n */\ngoog.testing.style.isOnScreen = function(el) {\n  var doc = goog.dom.getDomHelper(el).getDocument();\n  var viewport = goog.style.getVisibleRectForElement(doc.body);\n  var viewportRect = goog.math.Rect.createFromBox(viewport);\n  return goog.dom.contains(doc, el) &&\n      goog.style.getBounds(el).intersects(viewportRect);\n};\n","^;",1579837703000,"^<",["^=",["^1>","^?","^@A","^1F"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/style/style.js"],"^O",["^=",["~$goog.testing.style"]],"^W",true,"^X",["^?","^1>","^@A","^1F"]],["^ ","^3",[1579837703000],"^4","goog.proto2.objectserializer.js","^5",["^6","goog/proto2/objectserializer.js"],"^7","goog/proto2/objectserializer.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Protocol Buffer 2 Serializer which serializes messages\n *  into anonymous, simplified JSON objects.\n *\n */\n\ngoog.provide('goog.proto2.ObjectSerializer');\n\ngoog.require('goog.asserts');\ngoog.require('goog.proto2.FieldDescriptor');\ngoog.require('goog.proto2.Serializer');\ngoog.require('goog.string');\n\n\n\n/**\n * ObjectSerializer, a serializer which turns Messages into simplified\n * ECMAScript objects.\n *\n * @param {goog.proto2.ObjectSerializer.KeyOption=} opt_keyOption If specified,\n *     which key option to use when serializing/deserializing.\n * @param {boolean=} opt_serializeBooleanAsNumber If specified and true, the\n *     serializer will convert boolean values to 0/1 representation.\n * @param {boolean=} opt_ignoreUnknownFields If specified and true, the\n *     serializer will ignore unknown fields in the JSON payload instead of\n *     returning an error.\n * @constructor\n * @extends {goog.proto2.Serializer}\n */\ngoog.proto2.ObjectSerializer = function(\n    opt_keyOption, opt_serializeBooleanAsNumber, opt_ignoreUnknownFields) {\n  this.keyOption_ = opt_keyOption;\n  this.serializeBooleanAsNumber_ = opt_serializeBooleanAsNumber;\n  this.ignoreUnknownFields_ = opt_ignoreUnknownFields;\n};\ngoog.inherits(goog.proto2.ObjectSerializer, goog.proto2.Serializer);\n\n\n/**\n * An enumeration of the options for how to emit the keys in\n * the generated simplified object.\n *\n * For serialization, the option specifies the keys to use in the serialized\n * object.\n *\n * For deserialization, the option specifies which keys are allowed; an object\n * serialized by TAG may be deserialized by TAG or by NAME or by\n * CAMEL_CASE_NAME, but an object serialized by NAME cannot be deserialized by\n * TAG.  An object serialized with any option can be deserialized by\n * CAMEL_CASE_NAME.\n *\n * @enum {number}\n */\ngoog.proto2.ObjectSerializer.KeyOption = {\n  /**\n   * Use the tag of the field as the key (default)\n   */\n  TAG: 0,\n\n  /**\n   * Use the name of the field as the key. Unknown fields\n   * will still use their tags as keys.\n   */\n  NAME: 1,\n\n  /**\n   * Use the camel cased name of the field as the key.\n   * Unknown fields will still use their tags as keys.\n   */\n  CAMEL_CASE_NAME: 2\n};\n\n\n/**\n * Serializes a message to an object.\n *\n * @param {goog.proto2.Message} message The message to be serialized.\n * @return {!Object} The serialized form of the message.\n * @override\n */\ngoog.proto2.ObjectSerializer.prototype.serialize = function(message) {\n  var descriptor = message.getDescriptor();\n  var fields = descriptor.getFields();\n\n  var objectValue = {};\n\n  // Add the defined fields, recursively.\n  for (var i = 0; i < fields.length; i++) {\n    var field = fields[i];\n\n    var key = field.getTag();\n    switch (this.keyOption_) {\n      case goog.proto2.ObjectSerializer.KeyOption.TAG:\n        // no action necessary, key already has the correct value.\n        break;\n      case goog.proto2.ObjectSerializer.KeyOption.NAME:\n        key = field.getName();\n        break;\n      case goog.proto2.ObjectSerializer.KeyOption.CAMEL_CASE_NAME:\n        key = goog.string.toCamelCase(\n            field\n                .getName()\n                // goog.string.toCamelCase expects a hyphen delimited string but\n                // proto fields are usually underscore delimited\n                // (go/proto-style-guide); the following regex converts from\n                // underscore delimited form to hyphen delimited form.\n                .replace(/_/g, '-'));\n        break;\n      default:\n        // Default should never be reached unless keyOption is outside the valid\n        // domain.\n        goog.asserts.assert(\n            this.keyOption_ !== goog.proto2.ObjectSerializer.KeyOption.TAG &&\n                this.keyOption_ !==\n                    goog.proto2.ObjectSerializer.KeyOption.NAME &&\n                this.keyOption_ !==\n                    goog.proto2.ObjectSerializer.KeyOption.CAMEL_CASE_NAME,\n            'keyOption should be one of TAG, NAME, or CAMEL_CASE_NAME');\n    }\n\n    if (message.has(field)) {\n      if (field.isRepeated()) {\n        var array = [];\n        objectValue[key] = array;\n\n        for (var j = 0; j < message.countOf(field); j++) {\n          array.push(this.getSerializedValue(field, message.get(field, j)));\n        }\n\n      } else {\n        objectValue[key] = this.getSerializedValue(field, message.get(field));\n      }\n    }\n  }\n\n  // Add the unknown fields, if any.\n  message.forEachUnknown(function(tag, value) { objectValue[tag] = value; });\n\n  return objectValue;\n};\n\n\n/** @override */\ngoog.proto2.ObjectSerializer.prototype.getSerializedValue = function(\n    field, value) {\n\n  // Handle the case where a boolean should be serialized as 0/1.\n  // Some deserialization libraries, such as GWT, can use this notation.\n  if (this.serializeBooleanAsNumber_ &&\n      field.getFieldType() == goog.proto2.FieldDescriptor.FieldType.BOOL &&\n      typeof value === 'boolean') {\n    return value ? 1 : 0;\n  }\n\n  return goog.proto2.ObjectSerializer.base(\n      this, 'getSerializedValue', field, value);\n};\n\n\n/** @override */\ngoog.proto2.ObjectSerializer.prototype.getDeserializedValue = function(\n    field, value) {\n\n  // Gracefully handle the case where a boolean is represented by 0/1.\n  // Some serialization libraries, such as GWT, can use this notation.\n  if (field.getFieldType() == goog.proto2.FieldDescriptor.FieldType.BOOL &&\n      typeof value === 'number') {\n    return Boolean(value);\n  }\n\n  return goog.proto2.ObjectSerializer.base(\n      this, 'getDeserializedValue', field, value);\n};\n\n\n/**\n * Deserializes a message from an object and places the\n * data in the message.\n *\n * @param {goog.proto2.Message} message The message in which to\n *     place the information.\n * @param {*} data The data of the message.\n * @override\n */\ngoog.proto2.ObjectSerializer.prototype.deserializeTo = function(message, data) {\n  var descriptor = message.getDescriptor();\n\n  for (var key in data) {\n    var field;\n    var value = data[key];\n\n    var isNumeric = goog.string.isNumeric(key);\n\n    if (isNumeric) {\n      field = descriptor.findFieldByTag(key);\n    } else {\n      // We must not be in Key == TAG mode to lookup by name.\n      goog.asserts.assert(\n          this.keyOption_ == goog.proto2.ObjectSerializer.KeyOption.NAME ||\n              this.keyOption_ ==\n                  goog.proto2.ObjectSerializer.KeyOption.CAMEL_CASE_NAME,\n          'Key mode ' + this.keyOption_ + 'for key ' + key + ' is not ' +\n              goog.proto2.ObjectSerializer.KeyOption.NAME + ' nor ' +\n              goog.proto2.ObjectSerializer.KeyOption.CAMEL_CASE_NAME);\n\n      if (this.keyOption_ ==\n          goog.proto2.ObjectSerializer.KeyOption.CAMEL_CASE_NAME) {\n        key = goog.string\n                  .toSelectorCase(key)\n                  // goog.string.toSelectorCase returns a hyphen delimited form\n                  // of the name but protos usually use an underscore delimited\n                  // form (go/proto-style-guide); the following regex converts\n                  // from hyphens to underscores.\n                  .replace(/\\-/g, '_');\n      }\n      field = descriptor.findFieldByName(key);\n    }\n\n    if (field) {\n      if (field.isRepeated()) {\n        goog.asserts.assert(\n            goog.isArray(value),\n            'Value for repeated field ' + field + ' must be an array.');\n\n        for (var j = 0; j < value.length; j++) {\n          message.add(field, this.getDeserializedValue(field, value[j]));\n        }\n      } else {\n        goog.asserts.assert(\n            !goog.isArray(value),\n            'Value for non-repeated field ' + field + ' must not be an array.');\n        message.set(field, this.getDeserializedValue(field, value));\n      }\n    } else {\n      if (isNumeric) {\n        // We have an unknown field (with a numeric tag).\n        message.setUnknown(Number(key), value);\n      } else {\n        // Handle unknown non-numeric tag.\n        if (!this.ignoreUnknownFields_) {\n          // Named fields must be present.\n          goog.asserts.fail('Failed to find field: ' + key);\n        }\n      }\n    }\n  }\n};\n","^;",1579837703000,"^<",["^=",["^1L","~$goog.proto2.Serializer","^2L","^?","~$goog.proto2.FieldDescriptor"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/proto2/objectserializer.js"],"^O",["^=",["^6B"]],"^W",true,"^X",["^?","^1L","^DA","^D@","^2L"]],["^ ","^3",[1579837703000],"^4","goog.format.jsonprettyprinter.js","^5",["^6","goog/format/jsonprettyprinter.js"],"^7","goog/format/jsonprettyprinter.js","^8","^9","^:","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Creates a string of a JSON object, properly indented for\n * display.\n *\n */\n\ngoog.provide('goog.format.JsonPrettyPrinter');\ngoog.provide('goog.format.JsonPrettyPrinter.SafeHtmlDelimiters');\ngoog.provide('goog.format.JsonPrettyPrinter.TextDelimiters');\n\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.json');\ngoog.require('goog.json.Serializer');\ngoog.require('goog.string');\ngoog.require('goog.string.format');\n\n\n\n/**\n * Formats a JSON object as a string, properly indented for display.  Supports\n * displaying the string as text or html.  Users can also specify their own\n * set of delimiters for different environments.  For example, the JSON object:\n *\n * <code>{\"a\": 1, \"b\": {\"c\": null, \"d\": true, \"e\": [1, 2]}}</code>\n *\n * Will be displayed like this:\n *\n * <code>{\n *   \"a\": 1,\n *   \"b\": {\n *     \"c\": null,\n *     \"d\": true,\n *     \"e\": [\n *       1,\n *       2\n *     ]\n *   }\n * }</code>\n * @param {?goog.format.JsonPrettyPrinter.TextDelimiters=} opt_delimiters\n *     Container for the various strings to use to delimit objects, arrays,\n *     newlines, and other pieces of the output.\n * @constructor\n */\ngoog.format.JsonPrettyPrinter = function(opt_delimiters) {\n\n  /**\n   * The set of characters to use as delimiters.\n   * @private @const {!goog.format.JsonPrettyPrinter.TextDelimiters}\n   */\n  this.delimiters_ =\n      opt_delimiters || new goog.format.JsonPrettyPrinter.TextDelimiters();\n\n  /**\n   * Used to serialize property names and values.\n   * @private @const {!goog.json.Serializer}\n   */\n  this.jsonSerializer_ = new goog.json.Serializer();\n};\n\n\n/**\n * Formats a JSON object as a string, properly indented for display.\n * @param {*} json The object to pretty print. It could be a JSON object, a\n *     string representing a JSON object, or any other type.\n * @return {string} Returns a string of the JSON object, properly indented for\n *     display.\n */\ngoog.format.JsonPrettyPrinter.prototype.format = function(json) {\n  var buffer = this.format_(json);\n  var output = '';\n  for (var i = 0; i < buffer.length; i++) {\n    var item = buffer[i];\n    output += item instanceof goog.html.SafeHtml ?\n        goog.html.SafeHtml.unwrap(item) :\n        item;\n  }\n  return output;\n};\n\n\n/**\n * Formats a JSON object as a SafeHtml, properly indented for display.\n * @param {*} json The object to pretty print. It could be a JSON object, a\n *     string representing a JSON object, or any other type.\n * @return {!goog.html.SafeHtml} A HTML code of the JSON object.\n */\ngoog.format.JsonPrettyPrinter.prototype.formatSafeHtml = function(json) {\n  return goog.html.SafeHtml.concat(this.format_(json));\n};\n\n\n/**\n * Formats a JSON object and returns an output buffer.\n * @param {*} json The object to pretty print.\n * @return {!Array<string|!goog.html.SafeHtml>}\n * @private\n */\ngoog.format.JsonPrettyPrinter.prototype.format_ = function(json) {\n  // If input is undefined, null, or empty, return an empty string.\n  if (json == null) {\n    return [];\n  }\n  if (typeof json === 'string') {\n    if (goog.string.isEmptyOrWhitespace(json)) {\n      return [];\n    }\n    // Try to coerce a string into a JSON object.\n    json = JSON.parse(json);\n  }\n  var outputBuffer = [];\n  this.printObject_(json, outputBuffer, 0);\n  return outputBuffer;\n};\n\n\n/**\n * Formats a property value based on the type of the propery.\n * @param {*} val The object to format.\n * @param {!Array<string|!goog.html.SafeHtml>} outputBuffer The buffer to write\n *     the response to.\n * @param {number} indent The number of spaces to indent each line of the\n *     output.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.format.JsonPrettyPrinter.prototype.printObject_ = function(\n    val, outputBuffer, indent) {\n  var typeOf = goog.typeOf(val);\n  switch (typeOf) {\n    case 'null':\n    case 'boolean':\n    case 'number':\n    case 'string':\n      // \"null\", \"boolean\", \"number\" and \"string\" properties are printed\n      // directly to the output.\n      this.printValue_(\n          /** @type {null|string|boolean|number} */ (val), typeOf,\n          outputBuffer);\n      break;\n    case 'array':\n      // Example of how an array looks when formatted\n      // (using the default delimiters):\n      // [\n      //   1,\n      //   2,\n      //   3\n      // ]\n      outputBuffer.push(this.delimiters_.arrayStart);\n      var i = 0;\n      // Iterate through the array and format each element.\n      for (i = 0; i < val.length; i++) {\n        if (i > 0) {\n          // There are multiple elements, add a comma to separate them.\n          outputBuffer.push(this.delimiters_.propertySeparator);\n        }\n        outputBuffer.push(this.delimiters_.lineBreak);\n        this.printSpaces_(indent + this.delimiters_.indent, outputBuffer);\n        this.printObject_(\n            val[i], outputBuffer, indent + this.delimiters_.indent);\n      }\n      // If there are no properties in this object, don't put a line break\n      // between the beginning \"[\" and ending \"]\", so the output of an empty\n      // array looks like <code>[]</code>.\n      if (i > 0) {\n        outputBuffer.push(this.delimiters_.lineBreak);\n        this.printSpaces_(indent, outputBuffer);\n      }\n      outputBuffer.push(this.delimiters_.arrayEnd);\n      break;\n    case 'object':\n      // Example of how an object looks when formatted\n      // (using the default delimiters):\n      // {\n      //   \"a\": 1,\n      //   \"b\": 2,\n      //   \"c\": \"3\"\n      // }\n      outputBuffer.push(this.delimiters_.objectStart);\n      var propertyCount = 0;\n      // Iterate through the object and display each property.\n      for (var name in val) {\n        if (!val.hasOwnProperty(name)) {\n          continue;\n        }\n        if (propertyCount > 0) {\n          // There are multiple properties, add a comma to separate them.\n          outputBuffer.push(this.delimiters_.propertySeparator);\n        }\n        outputBuffer.push(this.delimiters_.lineBreak);\n        this.printSpaces_(indent + this.delimiters_.indent, outputBuffer);\n        this.printName_(name, outputBuffer);\n        outputBuffer.push(\n            this.delimiters_.nameValueSeparator, this.delimiters_.space);\n        this.printObject_(\n            val[name], outputBuffer, indent + this.delimiters_.indent);\n        propertyCount++;\n      }\n      // If there are no properties in this object, don't put a line break\n      // between the beginning \"{\" and ending \"}\", so the output of an empty\n      // object looks like <code>{}</code>.\n      if (propertyCount > 0) {\n        outputBuffer.push(this.delimiters_.lineBreak);\n        this.printSpaces_(indent, outputBuffer);\n      }\n      outputBuffer.push(this.delimiters_.objectEnd);\n      break;\n    // Other types, such as \"function\", aren't expected in JSON, and their\n    // behavior is undefined.  In these cases, just print an empty string to the\n    // output buffer.  This allows the pretty printer to continue while still\n    // outputing well-formed JSON.\n    default:\n      this.printValue_('', 'unknown', outputBuffer);\n  }\n};\n\n\n/**\n * Prints a property name to the output.\n * @param {string} name The property name.\n * @param {!Array<string|!goog.html.SafeHtml>} outputBuffer The buffer to write\n *     the response to.\n * @private\n */\ngoog.format.JsonPrettyPrinter.prototype.printName_ = function(\n    name, outputBuffer) {\n  outputBuffer.push(\n      this.delimiters_.formatName(this.jsonSerializer_.serialize(name)));\n};\n\n\n/**\n * Prints a property name to the output.\n * @param {string|boolean|number|null} val The property value.\n * @param {string} typeOf The type of the value.  Used to customize\n *     value-specific css in the display.  This allows clients to distinguish\n *     between different types in css.  For example, the client may define two\n *     classes: \"goog-jsonprettyprinter-propertyvalue-string\" and\n *     \"goog-jsonprettyprinter-propertyvalue-number\" to assign a different color\n *     to string and number values.\n * @param {!Array<string|!goog.html.SafeHtml>} outputBuffer The buffer to write\n *     the response to.\n * @private\n */\ngoog.format.JsonPrettyPrinter.prototype.printValue_ = function(\n    val, typeOf, outputBuffer) {\n  var value = this.jsonSerializer_.serialize(val);\n  outputBuffer.push(this.delimiters_.formatValue(value, typeOf));\n};\n\n\n/**\n * Print a number of space characters to the output.\n * @param {number} indent The number of spaces to indent the line.\n * @param {!Array<string|!goog.html.SafeHtml>} outputBuffer The buffer to write\n *     the response to.\n * @private\n */\ngoog.format.JsonPrettyPrinter.prototype.printSpaces_ = function(\n    indent, outputBuffer) {\n  outputBuffer.push(goog.string.repeat(this.delimiters_.space, indent));\n};\n\n\n\n/**\n * A container for the delimiting characters used to display the JSON string\n * to a text display.  Each delimiter is a publicly accessible property of\n * the object, which makes it easy to tweak delimiters to specific environments.\n * @constructor\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters = function() {};\n\n\n/**\n * Represents a space character in the output.  Used to indent properties a\n * certain number of spaces, and to separate property names from property\n * values.\n * @type {string}\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters.prototype.space = ' ';\n\n\n/**\n * Represents a newline character in the output.  Used to begin a new line.\n * @type {string|!goog.html.SafeHtml}\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters.prototype.lineBreak = '\\n';\n\n\n/**\n * Represents the start of an object in the output.\n * @type {string}\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters.prototype.objectStart = '{';\n\n\n/**\n * Represents the end of an object in the output.\n * @type {string}\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters.prototype.objectEnd = '}';\n\n\n/**\n * Represents the start of an array in the output.\n * @type {string}\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters.prototype.arrayStart = '[';\n\n\n/**\n * Represents the end of an array in the output.\n * @type {string}\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters.prototype.arrayEnd = ']';\n\n\n/**\n * Represents the string used to separate properties in the output.\n * @type {string}\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters.prototype.propertySeparator = ',';\n\n\n/**\n * Represents the string used to separate property names from property values in\n * the output.\n * @type {string|!goog.html.SafeHtml}\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters.prototype.nameValueSeparator = ':';\n\n\n/**\n * A string that's placed before a property name in the output.  Useful for\n * wrapping a property name in an html tag.\n * @type {string}\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters.prototype.preName = '';\n\n\n/**\n * A string that's placed after a property name in the output.  Useful for\n * wrapping a property name in an html tag.\n * @type {string}\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters.prototype.postName = '';\n\n\n/**\n * Formats a property name before adding it to the output.\n * @param {string} name The property name.\n * @return {string|!goog.html.SafeHtml}\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters.prototype.formatName = function(\n    name) {\n  return this.preName + name + this.postName;\n};\n\n\n/**\n * A string that's placed before a property value in the output.  Useful for\n * wrapping a property value in an html tag.\n * @type {string}\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters.prototype.preValue = '';\n\n\n/**\n * A string that's placed after a property value in the output.  Useful for\n * wrapping a property value in an html tag.\n * @type {string}\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters.prototype.postValue = '';\n\n\n/**\n * Formats a value before adding it to the output.\n * @param {string} value The value.\n * @param {string} typeOf The type of the value obtained by goog.typeOf.\n * @return {string|!goog.html.SafeHtml}\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters.prototype.formatValue = function(\n    value, typeOf) {\n  return goog.string.format(this.preValue, typeOf) + value + this.postValue;\n};\n\n\n/**\n * Represents the number of spaces to indent each sub-property of the JSON.\n * @type {number}\n */\ngoog.format.JsonPrettyPrinter.TextDelimiters.prototype.indent = 2;\n\n\n\n/**\n * A container for the delimiting characters used to display the JSON string\n * to an HTML <code>&lt;pre&gt;</code> or <code>&lt;code&gt;</code> element.\n * It escapes the names and values before they are added to the output.\n * Use this class together with goog.format.JsonPrettyPrinter#formatSafeHtml.\n * @constructor\n * @extends {goog.format.JsonPrettyPrinter.TextDelimiters}\n */\ngoog.format.JsonPrettyPrinter.SafeHtmlDelimiters = function() {\n  goog.format.JsonPrettyPrinter.TextDelimiters.call(this);\n};\ngoog.inherits(\n    goog.format.JsonPrettyPrinter.SafeHtmlDelimiters,\n    goog.format.JsonPrettyPrinter.TextDelimiters);\n\n\n/** @override */\ngoog.format.JsonPrettyPrinter.SafeHtmlDelimiters.prototype.formatName =\n    function(name) {\n  var classes = goog.getCssName('goog-jsonprettyprinter-propertyname');\n  return goog.html.SafeHtml.create('span', {'class': classes}, name);\n};\n\n\n/** @override */\ngoog.format.JsonPrettyPrinter.SafeHtmlDelimiters.prototype.formatValue =\n    function(value, typeOf) {\n  var classes = this.getValueCssName(typeOf);\n  return goog.html.SafeHtml.create('span', {'class': classes}, value);\n};\n\n\n/**\n * Return a class name for the given type.\n * @param {string} typeOf The type of the value.\n * @return {string}\n * @protected\n */\ngoog.format.JsonPrettyPrinter.SafeHtmlDelimiters.prototype.getValueCssName =\n    function(typeOf) {\n  // This switch is needed because goog.getCssName requires a constant string.\n  switch (typeOf) {\n    case 'null':\n      return goog.getCssName('goog-jsonprettyprinter-propertyvalue-null');\n    case 'boolean':\n      return goog.getCssName('goog-jsonprettyprinter-propertyvalue-boolean');\n    case 'number':\n      return goog.getCssName('goog-jsonprettyprinter-propertyvalue-number');\n    case 'string':\n      return goog.getCssName('goog-jsonprettyprinter-propertyvalue-string');\n    case 'array':\n      return goog.getCssName('goog-jsonprettyprinter-propertyvalue-array');\n    case 'object':\n      return goog.getCssName('goog-jsonprettyprinter-propertyvalue-object');\n    default:\n      return goog.getCssName('goog-jsonprettyprinter-propertyvalue-unknown');\n  }\n};\n","^;",1579837703000,"^<",["^=",["^4O","^2L","^?","~$goog.string.format","^8V","^1I"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/format/jsonprettyprinter.js"],"^O",["^=",["~$goog.format.JsonPrettyPrinter","~$goog.format.JsonPrettyPrinter.SafeHtmlDelimiters","~$goog.format.JsonPrettyPrinter.TextDelimiters"]],"^W",true,"^X",["^?","^1I","^4O","^8V","^2L","^DB"]],["^ ","^3",[1579837703000],"^4","goog.a11y.aria.aria.js","^5",["^6","goog/a11y/aria/aria.js"],"^7","goog/a11y/aria/aria.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Utilities for adding, removing and setting ARIA roles and\n * states as defined by W3C ARIA standard: http://www.w3.org/TR/wai-aria/\n * All modern browsers have some form of ARIA support, so no browser checks are\n * performed when adding ARIA to components.\n *\n */\n\ngoog.provide('goog.a11y.aria');\n\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.a11y.aria.datatables');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.object');\ngoog.require('goog.string');\n\n\n/**\n * ARIA states/properties prefix.\n * @private\n */\ngoog.a11y.aria.ARIA_PREFIX_ = 'aria-';\n\n\n/**\n * ARIA role attribute.\n * @private\n */\ngoog.a11y.aria.ROLE_ATTRIBUTE_ = 'role';\n\n\n/**\n * A list of tag names for which we don't need to set ARIA role and states\n * because they have well supported semantics for screen readers or because\n * they don't contain content to be made accessible.\n * @private\n */\ngoog.a11y.aria.TAGS_WITH_ASSUMED_ROLES_ = goog.object.createSet([\n  goog.dom.TagName.A, goog.dom.TagName.AREA, goog.dom.TagName.BUTTON,\n  goog.dom.TagName.HEAD, goog.dom.TagName.INPUT, goog.dom.TagName.LINK,\n  goog.dom.TagName.MENU, goog.dom.TagName.META, goog.dom.TagName.OPTGROUP,\n  goog.dom.TagName.OPTION, goog.dom.TagName.PROGRESS, goog.dom.TagName.STYLE,\n  goog.dom.TagName.SELECT, goog.dom.TagName.SOURCE, goog.dom.TagName.TEXTAREA,\n  goog.dom.TagName.TITLE, goog.dom.TagName.TRACK\n]);\n\n\n/**\n * A list of roles which are considered container roles.\n * Container roles are ARIA roles which use the aria-activedescendant property\n * to manage their active descendants or children. See\n * {@link http://www.w3.org/TR/wai-aria/states_and_properties\n * #aria-activedescendant} for more information.\n * @private @const {!Array<goog.a11y.aria.Role>}\n */\ngoog.a11y.aria.CONTAINER_ROLES_ = [\n  goog.a11y.aria.Role.COMBOBOX, goog.a11y.aria.Role.GRID,\n  goog.a11y.aria.Role.GROUP, goog.a11y.aria.Role.LISTBOX,\n  goog.a11y.aria.Role.MENU, goog.a11y.aria.Role.MENUBAR,\n  goog.a11y.aria.Role.RADIOGROUP, goog.a11y.aria.Role.ROW,\n  goog.a11y.aria.Role.ROWGROUP, goog.a11y.aria.Role.TAB_LIST,\n  goog.a11y.aria.Role.TEXTBOX, goog.a11y.aria.Role.TOOLBAR,\n  goog.a11y.aria.Role.TREE, goog.a11y.aria.Role.TREEGRID\n];\n\n\n/**\n * Sets the role of an element. If the roleName is\n * empty string or null, the role for the element is removed.\n * We encourage clients to call the goog.a11y.aria.removeRole\n * method instead of setting null and empty string values.\n * Special handling for this case is added to ensure\n * backword compatibility with existing code.\n *\n * @param {!Element} element DOM node to set role of.\n * @param {!goog.a11y.aria.Role|string} roleName role name(s).\n */\ngoog.a11y.aria.setRole = function(element, roleName) {\n  if (!roleName) {\n    // Setting the ARIA role to empty string is not allowed\n    // by the ARIA standard.\n    goog.a11y.aria.removeRole(element);\n  } else {\n    if (goog.asserts.ENABLE_ASSERTS) {\n      goog.asserts.assert(\n          goog.object.containsValue(goog.a11y.aria.Role, roleName),\n          'No such ARIA role ' + roleName);\n    }\n    element.setAttribute(goog.a11y.aria.ROLE_ATTRIBUTE_, roleName);\n  }\n};\n\n\n/**\n * Gets role of an element.\n * @param {!Element} element DOM element to get role of.\n * @return {?goog.a11y.aria.Role} ARIA Role name.\n */\ngoog.a11y.aria.getRole = function(element) {\n  var role = element.getAttribute(goog.a11y.aria.ROLE_ATTRIBUTE_);\n  return /** @type {goog.a11y.aria.Role} */ (role) || null;\n};\n\n\n/**\n * Removes role of an element.\n * @param {!Element} element DOM element to remove the role from.\n */\ngoog.a11y.aria.removeRole = function(element) {\n  element.removeAttribute(goog.a11y.aria.ROLE_ATTRIBUTE_);\n};\n\n\n/**\n * Sets the state or property of an element.\n * @param {!Element} element DOM node where we set state.\n * @param {!(goog.a11y.aria.State|string)} stateName State attribute being set.\n *     Automatically adds prefix 'aria-' to the state name if the attribute is\n *     not an extra attribute.\n * @param {string|boolean|number|!Array<string>} value Value\n * for the state attribute.\n */\ngoog.a11y.aria.setState = function(element, stateName, value) {\n  if (goog.isArray(value)) {\n    value = value.join(' ');\n  }\n  var attrStateName = goog.a11y.aria.getAriaAttributeName_(stateName);\n  if (value === '' || value == undefined) {\n    var defaultValueMap = goog.a11y.aria.datatables.getDefaultValuesMap();\n    // Work around for browsers that don't properly support ARIA.\n    // According to the ARIA W3C standard, user agents should allow\n    // setting empty value which results in setting the default value\n    // for the ARIA state if such exists. The exact text from the ARIA W3C\n    // standard (http://www.w3.org/TR/wai-aria/states_and_properties):\n    // \"When a value is indicated as the default, the user agent\n    // MUST follow the behavior prescribed by this value when the state or\n    // property is empty or undefined.\"\n    // The defaultValueMap contains the default values for the ARIA states\n    // and has as a key the goog.a11y.aria.State constant for the state.\n    if (stateName in defaultValueMap) {\n      element.setAttribute(attrStateName, defaultValueMap[stateName]);\n    } else {\n      element.removeAttribute(attrStateName);\n    }\n  } else {\n    element.setAttribute(attrStateName, value);\n  }\n};\n\n\n/**\n * Toggles the ARIA attribute of an element.\n * Meant for attributes with a true/false value, but works with any attribute.\n * If the attribute does not have a true/false value, the following rules apply:\n * A not empty attribute will be removed.\n * An empty attribute will be set to true.\n * @param {!Element} el DOM node for which to set attribute.\n * @param {!(goog.a11y.aria.State|string)} attr ARIA attribute being set.\n *     Automatically adds prefix 'aria-' to the attribute name if the attribute\n *     is not an extra attribute.\n */\ngoog.a11y.aria.toggleState = function(el, attr) {\n  var val = goog.a11y.aria.getState(el, attr);\n  if (!goog.string.isEmptyOrWhitespace(goog.string.makeSafe(val)) &&\n      !(val == 'true' || val == 'false')) {\n    goog.a11y.aria.removeState(el, /** @type {!goog.a11y.aria.State} */ (attr));\n    return;\n  }\n  goog.a11y.aria.setState(el, attr, val == 'true' ? 'false' : 'true');\n};\n\n\n/**\n * Remove the state or property for the element.\n * @param {!Element} element DOM node where we set state.\n * @param {!goog.a11y.aria.State} stateName State name.\n */\ngoog.a11y.aria.removeState = function(element, stateName) {\n  element.removeAttribute(goog.a11y.aria.getAriaAttributeName_(stateName));\n};\n\n\n/**\n * Gets value of specified state or property.\n * @param {!Element} element DOM node to get state from.\n * @param {!goog.a11y.aria.State|string} stateName State name.\n * @return {string} Value of the state attribute.\n */\ngoog.a11y.aria.getState = function(element, stateName) {\n  // TODO(user): return properly typed value result --\n  // boolean, number, string, null. We should be able to chain\n  // getState(...) and setState(...) methods.\n\n  var attr =\n      /** @type {string|number|boolean} */ (\n          element.getAttribute(\n              goog.a11y.aria.getAriaAttributeName_(stateName)));\n  var isNullOrUndefined = attr == null || attr == undefined;\n  return isNullOrUndefined ? '' : String(attr);\n};\n\n\n/**\n * Returns the activedescendant element for the input element by\n * using the activedescendant ARIA property of the given element.\n * @param {!Element} element DOM node to get activedescendant\n *     element for.\n * @return {?Element} DOM node of the activedescendant, if found.\n */\ngoog.a11y.aria.getActiveDescendant = function(element) {\n  var id =\n      goog.a11y.aria.getState(element, goog.a11y.aria.State.ACTIVEDESCENDANT);\n  return goog.dom.getOwnerDocument(element).getElementById(id);\n};\n\n\n/**\n * Sets the activedescendant ARIA property value for an element.\n * If the activeElement is not null, it should have an id set.\n * @param {!Element} element DOM node to set activedescendant ARIA property to.\n * @param {?Element} activeElement DOM node being set as activedescendant.\n */\ngoog.a11y.aria.setActiveDescendant = function(element, activeElement) {\n  var id = '';\n  if (activeElement) {\n    id = activeElement.id;\n    goog.asserts.assert(id, 'The active element should have an id.');\n  }\n\n  goog.a11y.aria.setState(element, goog.a11y.aria.State.ACTIVEDESCENDANT, id);\n};\n\n\n/**\n * Gets the label of the given element.\n * @param {!Element} element DOM node to get label from.\n * @return {string} label The label.\n */\ngoog.a11y.aria.getLabel = function(element) {\n  return goog.a11y.aria.getState(element, goog.a11y.aria.State.LABEL);\n};\n\n\n/**\n * Sets the label of the given element.\n * @param {!Element} element DOM node to set label to.\n * @param {string} label The label to set.\n */\ngoog.a11y.aria.setLabel = function(element, label) {\n  goog.a11y.aria.setState(element, goog.a11y.aria.State.LABEL, label);\n};\n\n\n/**\n * Asserts that the element has a role set if it's not an HTML element whose\n * semantics is well supported by most screen readers.\n * Only to be used internally by the ARIA library in goog.a11y.aria.*.\n * @param {!Element} element The element to assert an ARIA role set.\n * @param {!IArrayLike<string>} allowedRoles The child roles of\n * the roles.\n */\ngoog.a11y.aria.assertRoleIsSetInternalUtil = function(element, allowedRoles) {\n  if (goog.a11y.aria.TAGS_WITH_ASSUMED_ROLES_[element.tagName]) {\n    return;\n  }\n  var elementRole = /** @type {string}*/ (goog.a11y.aria.getRole(element));\n  goog.asserts.assert(\n      elementRole != null, 'The element ARIA role cannot be null.');\n\n  goog.asserts.assert(\n      goog.array.contains(allowedRoles, elementRole),\n      'Non existing or incorrect role set for element.' +\n          'The role set is \"' + elementRole + '\". The role should be any of \"' +\n          allowedRoles + '\". Check the ARIA specification for more details ' +\n          'http://www.w3.org/TR/wai-aria/roles.');\n};\n\n\n/**\n * Gets the boolean value of an ARIA state/property.\n * @param {!Element} element The element to get the ARIA state for.\n * @param {!goog.a11y.aria.State|string} stateName the ARIA state name.\n * @return {?boolean} Boolean value for the ARIA state value or null if\n *     the state value is not 'true', not 'false', or not set.\n */\ngoog.a11y.aria.getStateBoolean = function(element, stateName) {\n  var attr =\n      /** @type {string|boolean|null} */ (element.getAttribute(\n          goog.a11y.aria.getAriaAttributeName_(stateName)));\n  goog.asserts.assert(\n      typeof attr === 'boolean' || attr == null || attr == 'true' ||\n      attr == 'false');\n  if (attr == null) {\n    return attr;\n  }\n  return typeof attr === 'boolean' ? attr : attr == 'true';\n};\n\n\n/**\n * Gets the number value of an ARIA state/property.\n * @param {!Element} element The element to get the ARIA state for.\n * @param {!goog.a11y.aria.State|string} stateName the ARIA state name.\n * @return {?number} Number value for the ARIA state value or null if\n *     the state value is not a number or not set.\n */\ngoog.a11y.aria.getStateNumber = function(element, stateName) {\n  var attr =\n      /** @type {string|number} */ (\n          element.getAttribute(\n              goog.a11y.aria.getAriaAttributeName_(stateName)));\n  goog.asserts.assert(\n      (attr == null || !isNaN(Number(attr))) && typeof attr !== 'boolean');\n  return attr == null ? null : Number(attr);\n};\n\n\n/**\n * Gets the string value of an ARIA state/property.\n * @param {!Element} element The element to get the ARIA state for.\n * @param {!goog.a11y.aria.State|string} stateName the ARIA state name.\n * @return {?string} String value for the ARIA state value or null if\n *     the state value is empty string or not set.\n */\ngoog.a11y.aria.getStateString = function(element, stateName) {\n  var attr =\n      element.getAttribute(goog.a11y.aria.getAriaAttributeName_(stateName));\n  goog.asserts.assert(\n      (attr == null || typeof attr === 'string') &&\n      (attr == '' || isNaN(Number(attr))) && attr != 'true' && attr != 'false');\n  return (attr == null || attr == '') ? null : attr;\n};\n\n\n/**\n * Gets array of strings value of the specified state or\n * property for the element.\n * Only to be used internally by the ARIA library in goog.a11y.aria.*.\n * @param {!Element} element DOM node to get state from.\n * @param {!goog.a11y.aria.State} stateName State name.\n * @return {!IArrayLike<string>} string Array\n *     value of the state attribute.\n */\ngoog.a11y.aria.getStringArrayStateInternalUtil = function(element, stateName) {\n  var attrValue =\n      element.getAttribute(goog.a11y.aria.getAriaAttributeName_(stateName));\n  return goog.a11y.aria.splitStringOnWhitespace_(attrValue);\n};\n\n\n/**\n * Returns true if element has an ARIA state/property, false otherwise.\n * @param {!Element} element The element to get the ARIA state for.\n * @param {!goog.a11y.aria.State|string} stateName the ARIA state name.\n * @return {boolean}\n */\ngoog.a11y.aria.hasState = function(element, stateName) {\n  return element.hasAttribute(goog.a11y.aria.getAriaAttributeName_(stateName));\n};\n\n\n/**\n * Returns whether the element has a container ARIA role.\n * Container roles are ARIA roles that use the aria-activedescendant property\n * to manage their active descendants or children. See\n * {@link http://www.w3.org/TR/wai-aria/states_and_properties\n * #aria-activedescendant} for more information.\n * @param {!Element} element\n * @return {boolean}\n */\ngoog.a11y.aria.isContainerRole = function(element) {\n  var role = goog.a11y.aria.getRole(element);\n  return goog.array.contains(goog.a11y.aria.CONTAINER_ROLES_, role);\n};\n\n\n/**\n * Splits the input stringValue on whitespace.\n * @param {string} stringValue The value of the string to split.\n * @return {!IArrayLike<string>} string Array\n *     value as result of the split.\n * @private\n */\ngoog.a11y.aria.splitStringOnWhitespace_ = function(stringValue) {\n  return stringValue ? stringValue.split(/\\s+/) : [];\n};\n\n\n/**\n * Adds the 'aria-' prefix to ariaName.\n * @param {string} ariaName ARIA state/property name.\n * @private\n * @return {string} The ARIA attribute name with added 'aria-' prefix.\n * @throws {Error} If no such attribute exists.\n */\ngoog.a11y.aria.getAriaAttributeName_ = function(ariaName) {\n  if (goog.asserts.ENABLE_ASSERTS) {\n    goog.asserts.assert(ariaName, 'ARIA attribute cannot be empty.');\n    goog.asserts.assert(\n        goog.object.containsValue(goog.a11y.aria.State, ariaName),\n        'No such ARIA attribute ' + ariaName);\n  }\n  return goog.a11y.aria.ARIA_PREFIX_ + ariaName;\n};\n","^;",1579837703000,"^<",["^=",["^1L","^1>","^2L","^6N","^?","^42","~$goog.a11y.aria.datatables","^3G","^2O","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/a11y/aria/aria.js"],"^O",["^=",["^1O"]],"^W",true,"^X",["^?","^6N","^3G","^DF","^2O","^1L","^1>","^12","^42","^2L"]],["^ ","^3",[1579837703000],"^4","goog.crypt.sha512.js","^5",["^6","goog/crypt/sha512.js"],"^7","goog/crypt/sha512.js","^8","^9","^:","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview SHA-512 cryptographic hash.\n *\n * Usage:\n *   var sha512 = new goog.crypt.Sha512();\n *   sha512.update(bytes);\n *   var hash = sha512.digest();\n *\n * @author fy@google.com (Frank Yellin)\n */\n\ngoog.provide('goog.crypt.Sha512');\n\ngoog.require('goog.crypt.Sha2_64bit');\n\n\n\n/**\n * Constructs a SHA-512 cryptographic hash.\n *\n * @constructor\n * @extends {goog.crypt.Sha2_64bit}\n * @final\n * @struct\n */\ngoog.crypt.Sha512 = function() {\n  goog.crypt.Sha512.base(\n      this, 'constructor', 8 /* numHashBlocks */,\n      goog.crypt.Sha512.INIT_HASH_BLOCK_);\n};\ngoog.inherits(goog.crypt.Sha512, goog.crypt.Sha2_64bit);\n\n\n/** @private {!Array<number>} */\ngoog.crypt.Sha512.INIT_HASH_BLOCK_ = [\n  // Section 5.3.5 of\n  // csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf\n  0x6a09e667, 0xf3bcc908,  // H0\n  0xbb67ae85, 0x84caa73b,  // H1\n  0x3c6ef372, 0xfe94f82b,  // H2\n  0xa54ff53a, 0x5f1d36f1,  // H3\n  0x510e527f, 0xade682d1,  // H4\n  0x9b05688c, 0x2b3e6c1f,  // H5\n  0x1f83d9ab, 0xfb41bd6b,  // H6\n  0x5be0cd19, 0x137e2179   // H7\n];\n","^;",1579837703000,"^<",["^=",["^CZ","^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/sha512.js"],"^O",["^=",["~$goog.crypt.Sha512"]],"^W",true,"^X",["^?","^CZ"]],["^ ","^3",[1579837703000],"^4","goog.storage.mechanism.prefixedmechanism.js","^5",["^6","goog/storage/mechanism/prefixedmechanism.js"],"^7","goog/storage/mechanism/prefixedmechanism.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Wraps an iterable storage mechanism and creates artificial\n * namespaces using a prefix in the global namespace.\n *\n */\n\ngoog.provide('goog.storage.mechanism.PrefixedMechanism');\n\ngoog.require('goog.iter.Iterator');\ngoog.require('goog.storage.mechanism.IterableMechanism');\n\n\n\n/**\n * Wraps an iterable storage mechanism and creates artificial namespaces.\n *\n * @param {!goog.storage.mechanism.IterableMechanism} mechanism Underlying\n *     iterable storage mechanism.\n * @param {string} prefix Prefix for creating an artificial namespace.\n * @constructor\n * @struct\n * @extends {goog.storage.mechanism.IterableMechanism}\n * @final\n */\ngoog.storage.mechanism.PrefixedMechanism = function(mechanism, prefix) {\n  goog.storage.mechanism.PrefixedMechanism.base(this, 'constructor');\n  /**\n   * The mechanism to be prefixed.\n   *\n   * @private {goog.storage.mechanism.IterableMechanism}\n   */\n  this.mechanism_ = mechanism;\n\n  /**\n   * The prefix for creating artificial namespaces.\n   *\n   * @private {string}\n   */\n  this.prefix_ = prefix + '::';\n};\ngoog.inherits(\n    goog.storage.mechanism.PrefixedMechanism,\n    goog.storage.mechanism.IterableMechanism);\n\n\n/** @override */\ngoog.storage.mechanism.PrefixedMechanism.prototype.set = function(key, value) {\n  this.mechanism_.set(this.prefix_ + key, value);\n};\n\n\n/** @override */\ngoog.storage.mechanism.PrefixedMechanism.prototype.get = function(key) {\n  return this.mechanism_.get(this.prefix_ + key);\n};\n\n\n/** @override */\ngoog.storage.mechanism.PrefixedMechanism.prototype.remove = function(key) {\n  this.mechanism_.remove(this.prefix_ + key);\n};\n\n\n/** @override */\ngoog.storage.mechanism.PrefixedMechanism.prototype.__iterator__ = function(\n    opt_keys) {\n  var subIter = this.mechanism_.__iterator__(true);\n  var selfObj = this;\n  var newIter = new goog.iter.Iterator();\n  newIter.next = function() {\n    var key = /** @type {string} */ (subIter.next());\n    while (key.substr(0, selfObj.prefix_.length) != selfObj.prefix_) {\n      key = /** @type {string} */ (subIter.next());\n    }\n    return opt_keys ? key.substr(selfObj.prefix_.length) :\n                      selfObj.mechanism_.get(key);\n  };\n  return newIter;\n};\n","^;",1579837703000,"^<",["^=",["~$goog.storage.mechanism.IterableMechanism","^?","^AY"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/mechanism/prefixedmechanism.js"],"^O",["^=",["~$goog.storage.mechanism.PrefixedMechanism"]],"^W",true,"^X",["^?","^AY","^DH"]],["^ ","^3",[1579837703000],"^4","goog.html.textextractor.js","^5",["^6","goog/html/textextractor.js"],"^7","goog/html/textextractor.js","^8","^9","^:","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Contains utility methods to extract text content from HTML.\n * @supported IE 10+, Chrome 26+, Firefox 22+, Safari 7.1+, Opera 15+\n */\n\ngoog.provide('goog.html.textExtractor');\n\ngoog.require('goog.array');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.html.sanitizer.HtmlSanitizer');\ngoog.require('goog.object');\ngoog.require('goog.userAgent');\n\n\n/**\n * Safely extracts text from an untrusted HTML string using the HtmlSanitizer.\n * Compared to goog.html.utils.stripHtmlTags, it tries to be smarter about\n * printing newlines between blocks and leave out textual content that would not\n * be displayed to the user (such as SCRIPT and STYLE tags).\n * @param {string} html The untrusted HTML string.\n * @return {string}\n */\n// TODO(pelizzi): consider an optional bool parameter to also extract the text\n// content of alt attributes and such.\ngoog.html.textExtractor.extractTextContent = function(html) {\n  if (!goog.html.textExtractor.isSupported()) {\n    return '';\n  }\n  // Disable all attributes except style to protect against DOM clobbering.\n  var sanitizer = new goog.html.sanitizer.HtmlSanitizer.Builder()\n                      .onlyAllowAttributes(['style'])\n                      .allowCssStyles()\n                      .build();\n  // The default policy of the sanitizer strips the content of tags such as\n  // SCRIPT and STYLE, whose non-textual content would otherwise end up in the\n  // extracted text.\n  var sanitizedNodes = sanitizer.sanitizeToDomNode(html);\n  // textContent and innerText do not handle spacing between block elements\n  // properly. We need to reimplement a similar algorithm ourselves and account\n  // for spacing between block elements.\n  return goog.html.textExtractor.extractTextContentFromNode_(sanitizedNodes)\n      .trim();\n};\n\n\n/**\n * Recursively extract text from the supplied DOM node and its descendants.\n * @param {!Node} node\n * @return {string}\n * @private\n */\ngoog.html.textExtractor.extractTextContentFromNode_ = function(node) {\n  switch (node.nodeType) {\n    case Node.ELEMENT_NODE:\n      var element = /** @type {!Element} */ (node);\n      if (element.tagName == goog.dom.TagName.BR) {\n        return '\\n';\n      }\n      var result = goog.array\n                       .map(\n                           node.childNodes,\n                           goog.html.textExtractor.extractTextContentFromNode_)\n                       .join('');\n      if (goog.html.textExtractor.isBlockElement_(element)) {\n        result = '\\n' + result + '\\n';\n      }\n      return result;\n    case Node.TEXT_NODE:\n      return node.nodeValue.replace(/\\s+/g, ' ').trim();\n    default:\n      return '';\n  }\n};\n\n\n/**\n * A set of block elements.\n * @private @const {!Object<!goog.dom.TagName, boolean>}\n */\ngoog.html.textExtractor.BLOCK_ELEMENTS_ = goog.object.createSet(\n    goog.dom.TagName.ADDRESS, goog.dom.TagName.BLOCKQUOTE,\n    goog.dom.TagName.CENTER, goog.dom.TagName.DIV, goog.dom.TagName.DL,\n    goog.dom.TagName.FIELDSET, goog.dom.TagName.FORM, goog.dom.TagName.H1,\n    goog.dom.TagName.H2, goog.dom.TagName.H3, goog.dom.TagName.H4,\n    goog.dom.TagName.H5, goog.dom.TagName.H6, goog.dom.TagName.HR,\n    goog.dom.TagName.OL, goog.dom.TagName.P, goog.dom.TagName.PRE,\n    goog.dom.TagName.TABLE, goog.dom.TagName.UL);\n\n\n/**\n * Returns true whether this is a block element, i.e. the browser would visually\n * separate the text content from the text content of the previous node.\n * @param {!Element} element\n * @return {boolean}\n * @private\n */\ngoog.html.textExtractor.isBlockElement_ = function(element) {\n  return element.style.display == 'block' ||\n      goog.html.textExtractor.BLOCK_ELEMENTS_.hasOwnProperty(element.tagName);\n};\n\n\n/**\n * Whether the browser supports the text extractor. The extractor depends on the\n * HTML Sanitizer, which only supports IE starting from version 10.\n * Visible for testing.\n * @return {boolean}\n * @package\n */\ngoog.html.textExtractor.isSupported = function() {\n  return !goog.userAgent.IE || goog.userAgent.isVersionOrHigher(10);\n};\n","^;",1579837703000,"^<",["^=",["^?","^42","^[","~$goog.html.sanitizer.HtmlSanitizer","^2O","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/textextractor.js"],"^O",["^=",["~$goog.html.textExtractor"]],"^W",true,"^X",["^?","^2O","^12","^DJ","^42","^["]],["^ ","^3",[1579837703000],"^4","goog.testing.mockclassfactory.js","^5",["^6","goog/testing/mockclassfactory.js"],"^7","goog/testing/mockclassfactory.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This file defines a factory that can be used to mock and\n * replace an entire class.  This allows for mocks to be used effectively with\n * \"new\" instead of having to inject all instances.  Essentially, a given class\n * is replaced with a proxy to either a loose or strict mock.  Proxies locate\n * the appropriate mock based on constructor arguments.\n *\n * The usage is:\n * <ul>\n *   <li>Create a mock with one of the provided methods with a specifc set of\n *       constructor arguments\n *   <li>Set expectations by calling methods on the mock object\n *   <li>Call $replay() on the mock object\n *   <li>Instantiate the object as normal\n *   <li>Call $verify() to make sure that expectations were met\n *   <li>Call reset on the factory to revert all classes back to their original\n *       state\n * </ul>\n *\n * For examples, please see the unit test.\n *\n */\n\n\ngoog.setTestOnly('goog.testing.MockClassFactory');\ngoog.provide('goog.testing.MockClassFactory');\ngoog.provide('goog.testing.MockClassRecord');\n\ngoog.require('goog.array');\ngoog.require('goog.object');\ngoog.require('goog.testing.LooseMock');\ngoog.require('goog.testing.StrictMock');\ngoog.require('goog.testing.TestCase');\ngoog.require('goog.testing.mockmatchers');\n\n\n\n/**\n * A record that represents all the data associated with a mock replacement of\n * a given class.\n * @param {Object} namespace The namespace in which the mocked class resides.\n * @param {string} className The name of the class within the namespace.\n * @param {Function} originalClass The original class implementation before it\n *     was replaced by a proxy.\n * @param {Function} proxy The proxy that replaced the original class.\n * @constructor\n * @final\n */\ngoog.testing.MockClassRecord = function(\n    namespace, className, originalClass, proxy) {\n  /**\n   * A standard closure namespace (e.g. goog.foo.bar) that contains the mock\n   * class referenced by this MockClassRecord.\n   * @type {Object}\n   * @private\n   */\n  this.namespace_ = namespace;\n\n  /**\n   * The name of the class within the provided namespace.\n   * @type {string}\n   * @private\n   */\n  this.className_ = className;\n\n  /**\n   * The original class implementation.\n   * @type {Function}\n   * @private\n   */\n  this.originalClass_ = originalClass;\n\n  /**\n   * The proxy being used as a replacement for the original class.\n   * @type {Function}\n   * @private\n   */\n  this.proxy_ = proxy;\n\n  /**\n   * A mocks that will be constructed by their argument list.  The entries are\n   * objects with the format {'args': args, 'mock': mock}.\n   * @type {!Array<{'args', 'mock'}>}\n   * @private\n   */\n  this.instancesByArgs_ = [];\n};\n\n\n/**\n * A mock associated with the static functions for a given class.\n * @type {?goog.testing.StrictMock|?goog.testing.LooseMock|null}\n * @private\n */\ngoog.testing.MockClassRecord.prototype.staticMock_ = null;\n\n\n/**\n * A getter for this record's namespace.\n * @return {Object} The namespace.\n */\ngoog.testing.MockClassRecord.prototype.getNamespace = function() {\n  return this.namespace_;\n};\n\n\n/**\n * A getter for this record's class name.\n * @return {string} The name of the class referenced by this record.\n */\ngoog.testing.MockClassRecord.prototype.getClassName = function() {\n  return this.className_;\n};\n\n\n/**\n * A getter for the original class.\n * @return {Function} The original class implementation before mocking.\n */\ngoog.testing.MockClassRecord.prototype.getOriginalClass = function() {\n  return this.originalClass_;\n};\n\n\n/**\n * A getter for the proxy being used as a replacement for the original class.\n * @return {Function} The proxy.\n */\ngoog.testing.MockClassRecord.prototype.getProxy = function() {\n  return this.proxy_;\n};\n\n\n/**\n * A getter for the static mock.\n * @return {goog.testing.StrictMock|goog.testing.LooseMock|null} The static\n *     mock associated with this record.\n */\ngoog.testing.MockClassRecord.prototype.getStaticMock = function() {\n  return this.staticMock_;\n};\n\n\n/**\n * A setter for the static mock.\n * @param {goog.testing.StrictMock|goog.testing.LooseMock} staticMock A mock to\n *     associate with the static functions for the referenced class.\n */\ngoog.testing.MockClassRecord.prototype.setStaticMock = function(staticMock) {\n  this.staticMock_ = staticMock;\n};\n\n\n/**\n * Adds a new mock instance mapping.  The mapping connects a set of function\n * arguments to a specific mock instance.\n * @param {Array<?>} args An array of function arguments.\n * @param {goog.testing.StrictMock|goog.testing.LooseMock} mock A mock\n *     associated with the supplied arguments.\n */\ngoog.testing.MockClassRecord.prototype.addMockInstance = function(args, mock) {\n  this.instancesByArgs_.push({args: args, mock: mock});\n};\n\n\n/**\n * Finds the mock corresponding to a given argument set.  Throws an error if\n * there is no appropriate match found.\n * @param {Array<?>} args An array of function arguments.\n * @return {goog.testing.StrictMock|goog.testing.LooseMock|null} The mock\n *     corresponding to a given argument set.\n */\ngoog.testing.MockClassRecord.prototype.findMockInstance = function(args) {\n  for (var i = 0; i < this.instancesByArgs_.length; i++) {\n    var instanceArgs = this.instancesByArgs_[i].args;\n    if (goog.testing.mockmatchers.flexibleArrayMatcher(instanceArgs, args)) {\n      return this.instancesByArgs_[i].mock;\n    }\n  }\n\n  return null;\n};\n\n\n/**\n * Resets this record by reverting all the mocked classes back to the original\n * implementation and clearing out the mock instance list.\n */\ngoog.testing.MockClassRecord.prototype.reset = function() {\n  this.namespace_[this.className_] = this.originalClass_;\n  this.instancesByArgs_ = [];\n};\n\n\n\n/**\n * A factory used to create new mock class instances.  It is able to generate\n * both static and loose mocks.  The MockClassFactory is a singleton since it\n * tracks the classes that have been mocked internally.\n * @constructor\n * @final\n */\ngoog.testing.MockClassFactory = function() {\n  if (goog.testing.MockClassFactory.instance_) {\n    return goog.testing.MockClassFactory.instance_;\n  }\n\n  /**\n   * A map from class name -> goog.testing.MockClassRecord.\n   * @type {Object}\n   * @private\n   */\n  this.mockClassRecords_ = {};\n\n  goog.testing.MockClassFactory.instance_ = this;\n};\n\n\n/**\n * A singleton instance of the MockClassFactory.\n * @type {goog.testing.MockClassFactory?}\n * @private\n */\ngoog.testing.MockClassFactory.instance_ = null;\n\n\n/**\n * The names of the fields that are defined on Object.prototype.\n * @type {Array<string>}\n * @private\n */\ngoog.testing.MockClassFactory.PROTOTYPE_FIELDS_ = [\n  'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',\n  'toLocaleString', 'toString', 'valueOf'\n];\n\n\n/**\n * Iterates through a namespace to find the name of a given class.  This is done\n * solely to support compilation since string identifiers would break down.\n * Tests usually aren't compiled, but the functionality is supported.\n * @param {Object} namespace A javascript namespace (e.g. goog.testing).\n * @param {Function} classToMock The class whose name should be returned.\n * @return {string} The name of the class.\n * @private\n */\ngoog.testing.MockClassFactory.prototype.getClassName_ = function(\n    namespace, classToMock) {\n  var namespaces;\n  if (namespace === goog.global) {\n    namespaces = goog.testing.TestCase.getGlobals();\n  } else {\n    namespaces = [namespace];\n  }\n  for (var i = 0; i < namespaces.length; i++) {\n    for (var prop in namespaces[i]) {\n      if (namespaces[i][prop] === classToMock) {\n        return prop;\n      }\n    }\n  }\n\n  throw new Error('Class is not a part of the given namespace');\n};\n\n\n/**\n * Returns whether or not a given class has been mocked.\n * @param {string} className The name of the class.\n * @return {boolean} Whether or not the given class name has a MockClassRecord.\n * @private\n */\ngoog.testing.MockClassFactory.prototype.classHasMock_ = function(className) {\n  return !!this.mockClassRecords_[className];\n};\n\n\n/**\n * Returns a proxy constructor closure.  Since this is a constructor, \"this\"\n * refers to the local scope of the constructed object thus bind cannot be\n * used.\n * @param {string} className The name of the class.\n * @param {Function} mockFinder A bound function that returns the mock\n *     associated with a class given the constructor's argument list.\n * @return {function(new:?)} A proxy constructor.\n * @private\n */\ngoog.testing.MockClassFactory.prototype.getProxyCtor_ = function(\n    className, mockFinder) {\n  return /** @type {function(new:?)} */ (function() {\n    var self = /** @type {?} */ (this);  // unknown this is expected.\n    self.$mock_ = mockFinder(className, arguments);\n    if (!self.$mock_) {\n      // The \"arguments\" variable is not a proper Array so it must be converted.\n      var args = Array.prototype.slice.call(arguments, 0);\n      throw new Error(\n          'No mock found for ' + className + ' with arguments ' +\n          args.join(', '));\n    }\n  });\n};\n\n\n/**\n * Returns a proxy function for a mock class instance.  This function cannot\n * be used with bind since \"this\" must refer to the scope of the proxy\n * constructor.\n * @param {string} fnName The name of the function that should be proxied.\n * @return {!Function} A proxy function.\n * @private\n */\ngoog.testing.MockClassFactory.prototype.getProxyFunction_ = function(fnName) {\n  return /** @type {function(this:?,...?):?} */ (function() {\n    var self = /** @type {?} */ (this);  // unknown this is expected.\n    return self.$mock_[fnName].apply(self.$mock_, arguments);\n  });\n};\n\n\n/**\n * Find a mock instance for a given class name and argument list.\n * @param {string} className The name of the class.\n * @param {Array<?>} args The argument list to match.\n * @return {goog.testing.StrictMock|goog.testing.LooseMock} The mock found for\n *     the given argument list.\n * @private\n */\ngoog.testing.MockClassFactory.prototype.findMockInstance_ = function(\n    className, args) {\n  return this.mockClassRecords_[className].findMockInstance(args);\n};\n\n\n/**\n * Create a proxy class.  A proxy will pass functions to the mock for a class.\n * The proxy class only covers prototype methods.  A static mock is not build\n * simultaneously since it might be strict or loose.  The proxy class inherits\n * from the target class in order to preserve instanceof checks.\n * @param {Object} namespace A javascript namespace (e.g. goog.testing).\n * @param {Function} classToMock The class that will be proxied.\n * @param {string} className The name of the class.\n * @return {!Function} The proxy for provided class.\n * @private\n * @suppress {missingProperties} Function does not defined base.\n */\ngoog.testing.MockClassFactory.prototype.createProxy_ = function(\n    namespace, classToMock, className) {\n  var proxy =\n      this.getProxyCtor_(className, goog.bind(this.findMockInstance_, this));\n  var protoToProxy = classToMock.prototype;\n  // Preserve base() call in mocked class\n  var classToMockBase = classToMock.base;\n  goog.inherits(proxy, classToMock);\n  proxy.base = classToMockBase;\n\n  for (var prop in protoToProxy) {\n    if (goog.isFunction(protoToProxy[prop])) {\n      proxy.prototype[prop] = this.getProxyFunction_(prop);\n    }\n  }\n\n  // For IE the for-in-loop does not contain any properties that are not\n  // enumerable on the prototype object (for example isPrototypeOf from\n  // Object.prototype) and it will also not include 'replace' on objects that\n  // extend String and change 'replace' (not that it is common for anyone to\n  // extend anything except Object).\n  // TODO (arv): Implement goog.object.getIterator and replace this loop.\n\n  goog.array.forEach(\n      goog.testing.MockClassFactory.PROTOTYPE_FIELDS_, function(field) {\n        if (Object.prototype.hasOwnProperty.call(protoToProxy, field)) {\n          proxy.prototype[field] = this.getProxyFunction_(field);\n        }\n      }, this);\n\n  this.mockClassRecords_[className] = new goog.testing.MockClassRecord(\n      namespace, className, classToMock, proxy);\n  namespace[className] = proxy;\n  return proxy;\n};\n\n\n/**\n * Gets either a loose or strict mock for a given class based on a set of\n * arguments.\n * @param {Object} namespace A javascript namespace (e.g. goog.testing).\n * @param {Function} classToMock The class that will be mocked.\n * @param {boolean} isStrict Whether or not the mock should be strict.\n * @param {IArrayLike<?>} ctorArgs The arguments associated with this\n *     instance's constructor.\n * @return {!goog.testing.StrictMock|!goog.testing.LooseMock} The mock created\n *     for the provided class.\n * @private\n */\ngoog.testing.MockClassFactory.prototype.getMockClass_ = function(\n    namespace, classToMock, isStrict, ctorArgs) {\n  var className = this.getClassName_(namespace, classToMock);\n\n  // The namespace and classToMock variables should be removed from the\n  // passed in argument stack.\n  ctorArgs = goog.array.slice(ctorArgs, 2);\n\n  if (goog.isFunction(classToMock)) {\n    var mock = isStrict ? new goog.testing.StrictMock(classToMock) :\n                          new goog.testing.LooseMock(classToMock);\n\n    if (!this.classHasMock_(className)) {\n      this.createProxy_(namespace, classToMock, className);\n    } else {\n      var instance = this.findMockInstance_(className, ctorArgs);\n      if (instance) {\n        throw new Error(\n            'Mock instance already created for ' + className +\n            ' with arguments ' + ctorArgs.join(', '));\n      }\n    }\n    this.mockClassRecords_[className].addMockInstance(ctorArgs, mock);\n\n    return mock;\n  } else {\n    throw new Error(\n        'Cannot create a mock class for ' + className + ' of type ' +\n        typeof classToMock);\n  }\n};\n\n\n/**\n * Gets a strict mock for a given class.\n * @param {Object} namespace A javascript namespace (e.g. goog.testing).\n * @param {Function} classToMock The class that will be mocked.\n * @param {...*} var_args The arguments associated with this instance's\n *     constructor.\n * @return {!goog.testing.StrictMock} The mock created for the provided class.\n */\ngoog.testing.MockClassFactory.prototype.getStrictMockClass = function(\n    namespace, classToMock, var_args) {\n  return /** @type {!goog.testing.StrictMock} */ (\n      this.getMockClass_(namespace, classToMock, true, arguments));\n};\n\n\n/**\n * Gets a loose mock for a given class.\n * @param {Object} namespace A javascript namespace (e.g. goog.testing).\n * @param {Function} classToMock The class that will be mocked.\n * @param {...*} var_args The arguments associated with this instance's\n *     constructor.\n * @return {goog.testing.LooseMock} The mock created for the provided class.\n */\ngoog.testing.MockClassFactory.prototype.getLooseMockClass = function(\n    namespace, classToMock, var_args) {\n  return /** @type {goog.testing.LooseMock} */ (\n      this.getMockClass_(namespace, classToMock, false, arguments));\n};\n\n\n/**\n * Creates either a loose or strict mock for the static functions of a given\n * class.\n * @param {Function} classToMock The class whose static functions will be\n *     mocked.  This should be the original class and not the proxy.\n * @param {string} className The name of the class.\n * @param {Function} proxy The proxy that will replace the original class.\n * @param {boolean} isStrict Whether or not the mock should be strict.\n * @return {!goog.testing.StrictMock|!goog.testing.LooseMock} The mock created\n *     for the static functions of the provided class.\n * @private\n */\ngoog.testing.MockClassFactory.prototype.createStaticMock_ = function(\n    classToMock, className, proxy, isStrict) {\n  var mock = isStrict ? new goog.testing.StrictMock(classToMock, true) :\n                        new goog.testing.LooseMock(classToMock, false, true);\n\n  for (var prop in classToMock) {\n    if (goog.isFunction(classToMock[prop])) {\n      proxy[prop] = goog.bind(mock.$mockMethod, mock, prop);\n    } else if (classToMock[prop] !== classToMock.prototype) {\n      proxy[prop] = classToMock[prop];\n    }\n  }\n\n  this.mockClassRecords_[className].setStaticMock(mock);\n  return mock;\n};\n\n\n/**\n * Gets either a loose or strict mock for the static functions of a given class.\n * @param {Object} namespace A javascript namespace (e.g. goog.testing).\n * @param {Function} classToMock The class whose static functions will be\n *     mocked.  This should be the original class and not the proxy.\n * @param {boolean} isStrict Whether or not the mock should be strict.\n * @return {goog.testing.StrictMock|goog.testing.LooseMock} The mock created\n *     for the static functions of the provided class.\n * @private\n */\ngoog.testing.MockClassFactory.prototype.getStaticMock_ = function(\n    namespace, classToMock, isStrict) {\n  var className = this.getClassName_(namespace, classToMock);\n\n  if (goog.isFunction(classToMock)) {\n    if (!this.classHasMock_(className)) {\n      var proxy = this.createProxy_(namespace, classToMock, className);\n      var mock =\n          this.createStaticMock_(classToMock, className, proxy, isStrict);\n      return mock;\n    }\n\n    if (!this.mockClassRecords_[className].getStaticMock()) {\n      var proxy = this.mockClassRecords_[className].getProxy();\n      var originalClass = this.mockClassRecords_[className].getOriginalClass();\n      var mock =\n          this.createStaticMock_(originalClass, className, proxy, isStrict);\n      return mock;\n    } else {\n      var mock = this.mockClassRecords_[className].getStaticMock();\n      var mockIsStrict = mock instanceof goog.testing.StrictMock;\n\n      if (mockIsStrict != isStrict) {\n        var mockType =\n            mock instanceof goog.testing.StrictMock ? 'strict' : 'loose';\n        var requestedType = isStrict ? 'strict' : 'loose';\n        throw new Error(\n            'Requested a ' + requestedType + ' static mock, but a ' + mockType +\n            ' mock already exists.');\n      }\n\n      return mock;\n    }\n  } else {\n    throw new Error(\n        'Cannot create a mock for the static functions of ' + className +\n        ' of type ' + typeof classToMock);\n  }\n};\n\n\n/**\n * Gets a strict mock for the static functions of a given class.\n * @param {Object} namespace A javascript namespace (e.g. goog.testing).\n * @param {Function} classToMock The class whose static functions will be\n *     mocked.  This should be the original class and not the proxy.\n * @return {goog.testing.StrictMock} The mock created for the static functions\n *     of the provided class.\n */\ngoog.testing.MockClassFactory.prototype.getStrictStaticMock = function(\n    namespace, classToMock) {\n  return /** @type {goog.testing.StrictMock} */ (\n      this.getStaticMock_(namespace, classToMock, true));\n};\n\n\n/**\n * Gets a loose mock for the static functions of a given class.\n * @param {Object} namespace A javascript namespace (e.g. goog.testing).\n * @param {Function} classToMock The class whose static functions will be\n *     mocked.  This should be the original class and not the proxy.\n * @return {goog.testing.LooseMock} The mock created for the static functions\n *     of the provided class.\n */\ngoog.testing.MockClassFactory.prototype.getLooseStaticMock = function(\n    namespace, classToMock) {\n  return /** @type {goog.testing.LooseMock} */ (\n      this.getStaticMock_(namespace, classToMock, false));\n};\n\n\n/**\n * Resests the factory by reverting all mocked classes to their original\n * implementations and removing all MockClassRecords.\n */\ngoog.testing.MockClassFactory.prototype.reset = function() {\n  goog.object.forEach(\n      this.mockClassRecords_, function(record) { record.reset(); });\n  this.mockClassRecords_ = {};\n};\n","^;",1579837703000,"^<",["^=",["^?","^42","^;3","^30","^;4","^AB","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/mockclassfactory.js"],"^O",["^=",["~$goog.testing.MockClassRecord","~$goog.testing.MockClassFactory"]],"^W",true,"^X",["^?","^2O","^42","^;4","^AB","^30","^;3"]],["^ ","^3",[1579837703000],"^4","goog.fx.transitionbase.js","^5",["^6","goog/fx/transitionbase.js"],"^7","goog/fx/transitionbase.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An abstract base class for transitions. This is a simple\n * interface that allows for playing, pausing and stopping an animation. It adds\n * a simple event model, and animation status.\n */\ngoog.provide('goog.fx.TransitionBase');\ngoog.provide('goog.fx.TransitionBase.State');\n\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.fx.Transition');  // Unreferenced: interface\n\n\n\n/**\n * Constructor for a transition object.\n *\n * @constructor\n * @struct\n * @implements {goog.fx.Transition}\n * @extends {goog.events.EventTarget}\n */\ngoog.fx.TransitionBase = function() {\n  goog.fx.TransitionBase.base(this, 'constructor');\n\n  /**\n   * The internal state of the animation.\n   * @type {goog.fx.TransitionBase.State}\n   * @private\n   */\n  this.state_ = goog.fx.TransitionBase.State.STOPPED;\n\n  /**\n   * Timestamp for when the animation was started.\n   * @type {?number}\n   * @protected\n   */\n  this.startTime = null;\n\n  /**\n   * Timestamp for when the animation finished or was stopped.\n   * @type {?number}\n   * @protected\n   */\n  this.endTime = null;\n};\ngoog.inherits(goog.fx.TransitionBase, goog.events.EventTarget);\n\n\n/**\n * Enum for the possible states of an animation.\n * @enum {number}\n */\ngoog.fx.TransitionBase.State = {\n  STOPPED: 0,\n  PAUSED: -1,\n  PLAYING: 1\n};\n\n\n/**\n * Plays the animation.\n *\n * @param {boolean=} opt_restart Optional parameter to restart the animation.\n * @return {boolean} True iff the animation was started.\n * @override\n */\ngoog.fx.TransitionBase.prototype.play = goog.abstractMethod;\n\n\n/**\n * Stops the animation.\n *\n * @param {boolean=} opt_gotoEnd Optional boolean parameter to go the the end of\n *     the animation.\n * @override\n */\ngoog.fx.TransitionBase.prototype.stop = goog.abstractMethod;\n\n\n/**\n * Pauses the animation.\n */\ngoog.fx.TransitionBase.prototype.pause = goog.abstractMethod;\n\n\n/**\n * Returns the current state of the animation.\n * @return {goog.fx.TransitionBase.State} State of the animation.\n */\ngoog.fx.TransitionBase.prototype.getStateInternal = function() {\n  return this.state_;\n};\n\n\n/**\n * Sets the current state of the animation to playing.\n * @protected\n */\ngoog.fx.TransitionBase.prototype.setStatePlaying = function() {\n  this.state_ = goog.fx.TransitionBase.State.PLAYING;\n};\n\n\n/**\n * Sets the current state of the animation to paused.\n * @protected\n */\ngoog.fx.TransitionBase.prototype.setStatePaused = function() {\n  this.state_ = goog.fx.TransitionBase.State.PAUSED;\n};\n\n\n/**\n * Sets the current state of the animation to stopped.\n * @protected\n */\ngoog.fx.TransitionBase.prototype.setStateStopped = function() {\n  this.state_ = goog.fx.TransitionBase.State.STOPPED;\n};\n\n\n/**\n * @return {boolean} True iff the current state of the animation is playing.\n */\ngoog.fx.TransitionBase.prototype.isPlaying = function() {\n  return this.state_ == goog.fx.TransitionBase.State.PLAYING;\n};\n\n\n/**\n * @return {boolean} True iff the current state of the animation is paused.\n */\ngoog.fx.TransitionBase.prototype.isPaused = function() {\n  return this.state_ == goog.fx.TransitionBase.State.PAUSED;\n};\n\n\n/**\n * @return {boolean} True iff the current state of the animation is stopped.\n */\ngoog.fx.TransitionBase.prototype.isStopped = function() {\n  return this.state_ == goog.fx.TransitionBase.State.STOPPED;\n};\n\n\n/**\n * Dispatches the BEGIN event. Sub classes should override this instead\n * of listening to the event, and call this instead of dispatching the event.\n * @protected\n */\ngoog.fx.TransitionBase.prototype.onBegin = function() {\n  this.dispatchAnimationEvent(goog.fx.Transition.EventType.BEGIN);\n};\n\n\n/**\n * Dispatches the END event. Sub classes should override this instead\n * of listening to the event, and call this instead of dispatching the event.\n * @protected\n */\ngoog.fx.TransitionBase.prototype.onEnd = function() {\n  this.dispatchAnimationEvent(goog.fx.Transition.EventType.END);\n};\n\n\n/**\n * Dispatches the FINISH event. Sub classes should override this instead\n * of listening to the event, and call this instead of dispatching the event.\n * @protected\n */\ngoog.fx.TransitionBase.prototype.onFinish = function() {\n  this.dispatchAnimationEvent(goog.fx.Transition.EventType.FINISH);\n};\n\n\n/**\n * Dispatches the PAUSE event. Sub classes should override this instead\n * of listening to the event, and call this instead of dispatching the event.\n * @protected\n */\ngoog.fx.TransitionBase.prototype.onPause = function() {\n  this.dispatchAnimationEvent(goog.fx.Transition.EventType.PAUSE);\n};\n\n\n/**\n * Dispatches the PLAY event. Sub classes should override this instead\n * of listening to the event, and call this instead of dispatching the event.\n * @protected\n */\ngoog.fx.TransitionBase.prototype.onPlay = function() {\n  this.dispatchAnimationEvent(goog.fx.Transition.EventType.PLAY);\n};\n\n\n/**\n * Dispatches the RESUME event. Sub classes should override this instead\n * of listening to the event, and call this instead of dispatching the event.\n * @protected\n */\ngoog.fx.TransitionBase.prototype.onResume = function() {\n  this.dispatchAnimationEvent(goog.fx.Transition.EventType.RESUME);\n};\n\n\n/**\n * Dispatches the STOP event. Sub classes should override this instead\n * of listening to the event, and call this instead of dispatching the event.\n * @protected\n */\ngoog.fx.TransitionBase.prototype.onStop = function() {\n  this.dispatchAnimationEvent(goog.fx.Transition.EventType.STOP);\n};\n\n\n/**\n * Dispatches an event object for the current animation.\n * @param {string} type Event type that will be dispatched.\n * @protected\n */\ngoog.fx.TransitionBase.prototype.dispatchAnimationEvent = function(type) {\n  this.dispatchEvent(type);\n};\n","^;",1579837703000,"^<",["^=",["^?","^3W","^70"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/transitionbase.js"],"^O",["^=",["~$goog.fx.TransitionBase","~$goog.fx.TransitionBase.State"]],"^W",true,"^X",["^?","^3W","^70"]],["^ ","^3",[1579837703000],"^4","goog.testing.mockrandom.js","^5",["^6","goog/testing/mockrandom.js"],"^7","goog/testing/mockrandom.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview MockRandom provides a mechanism for specifying a stream of\n * numbers to expect from calls to Math.random().\n *\n */\n\ngoog.setTestOnly('goog.testing.MockRandom');\ngoog.provide('goog.testing.MockRandom');\n\ngoog.require('goog.Disposable');\n\n\n\n/**\n * Class for unit testing code that uses Math.random.\n *\n * @param {Array<number>} sequence The sequence of numbers to return. This\n *     object will modify this array.\n * @param {boolean=} opt_install Whether to install the MockRandom at\n *     construction time.\n * @extends {goog.Disposable}\n * @constructor\n * @final\n */\ngoog.testing.MockRandom = function(sequence, opt_install) {\n  goog.Disposable.call(this);\n\n  /**\n   * The sequence of numbers to be returned by calls to random()\n   * @type {!Array<number>}\n   * @private\n   */\n  this.sequence_ = sequence || [];\n\n  /**\n   * The original Math.random function.\n   * @type {function(): number}\n   * @private\n   */\n  this.mathRandom_ = Math.random;\n\n  /**\n   * Whether to throw an exception when Math.random() is called when there is\n   * nothing left in the sequence.\n   * @type {boolean}\n   * @private\n   */\n  this.strictlyFromSequence_ = false;\n\n  if (opt_install) {\n    this.install();\n  }\n};\ngoog.inherits(goog.testing.MockRandom, goog.Disposable);\n\n\n/**\n * Whether this MockRandom has been installed.\n * @type {boolean}\n * @private\n */\ngoog.testing.MockRandom.prototype.installed_;\n\n\n/**\n * Installs this MockRandom as the system number generator.\n */\ngoog.testing.MockRandom.prototype.install = function() {\n  if (!this.installed_) {\n    Math.random = goog.bind(this.random, this);\n    this.installed_ = true;\n  }\n};\n\n\n/**\n * @return {number} The next number in the sequence. If there are no more values\n *     left, this will return a random number, unless\n *     `this.strictlyFromSequence_` is true, in which case an error will\n *     be thrown.\n */\ngoog.testing.MockRandom.prototype.random = function() {\n  if (this.hasMoreValues()) {\n    return this.sequence_.shift();\n  }\n  if (this.strictlyFromSequence_) {\n    throw new Error('No numbers left in sequence.');\n  }\n  return this.mathRandom_();\n};\n\n\n/**\n * @return {boolean} Whether there are more numbers left in the sequence.\n */\ngoog.testing.MockRandom.prototype.hasMoreValues = function() {\n  return this.sequence_.length > 0;\n};\n\n\n/**\n * Injects new numbers into the beginning of the sequence.\n * @param {!Array<number>|number} values Number or array of numbers to inject.\n */\ngoog.testing.MockRandom.prototype.inject = function(values) {\n  if (goog.isArray(values)) {\n    this.sequence_ = values.concat(this.sequence_);\n  } else {\n    this.sequence_.splice(0, 0, values);\n  }\n};\n\n\n/**\n * Uninstalls the MockRandom.\n */\ngoog.testing.MockRandom.prototype.uninstall = function() {\n  if (this.installed_) {\n    Math.random = this.mathRandom_;\n    this.installed_ = false;\n  }\n};\n\n\n/** @override */\ngoog.testing.MockRandom.prototype.disposeInternal = function() {\n  this.uninstall();\n  delete this.sequence_;\n  delete this.mathRandom_;\n  goog.testing.MockRandom.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * @param {boolean} strictlyFromSequence Whether to throw an exception when\n *     Math.random() is called when there is nothing left in the sequence.\n */\ngoog.testing.MockRandom.prototype.setStrictlyFromSequence = function(\n    strictlyFromSequence) {\n  this.strictlyFromSequence_ = strictlyFromSequence;\n};\n","^;",1579837703000,"^<",["^=",["^?","^1:"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/mockrandom.js"],"^O",["^=",["~$goog.testing.MockRandom"]],"^W",true,"^X",["^?","^1:"]],["^ ","^3",[1579837703000],"^4","goog.math.rangeset.js","^5",["^6","goog/math/rangeset.js"],"^7","goog/math/rangeset.js","^8","^9","^:","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A RangeSet is a structure that manages a list of ranges.\n * Numeric ranges may be added and removed from the RangeSet, and the set may\n * be queried for the presence or absence of individual values or ranges of\n * values.\n *\n * This may be used, for example, to track the availability of sparse elements\n * in an array without iterating over the entire array.\n *\n * @author brenneman@google.com (Shawn Brenneman)\n */\n\ngoog.provide('goog.math.RangeSet');\n\ngoog.require('goog.array');\ngoog.require('goog.iter.Iterator');\ngoog.require('goog.iter.StopIteration');\ngoog.require('goog.math.Range');\n\n\n\n/**\n * Constructs a new RangeSet, which can store numeric ranges.\n *\n * Ranges are treated as half-closed: that is, they are exclusive of their end\n * value [start, end).\n *\n * New ranges added to the set which overlap the values in one or more existing\n * ranges will be merged.\n *\n * @struct\n * @constructor\n * @final\n */\ngoog.math.RangeSet = function() {\n  /**\n   * A sorted list of ranges that represent the values in the set.\n   * @type {!Array<!goog.math.Range>}\n   * @private\n   */\n  this.ranges_ = [];\n};\n\n\nif (goog.DEBUG) {\n  /**\n   * @return {string} A debug string in the form [[1, 5], [8, 9], [15, 30]].\n   * @override\n   */\n  goog.math.RangeSet.prototype.toString = function() {\n    return '[' + this.ranges_.join(', ') + ']';\n  };\n}\n\n\n/**\n * Compares two sets for equality.\n *\n * @param {goog.math.RangeSet} a A range set.\n * @param {goog.math.RangeSet} b A range set.\n * @return {boolean} Whether both sets contain the same values.\n */\ngoog.math.RangeSet.equals = function(a, b) {\n  // Fast check for object equality. Also succeeds if a and b are both null.\n  return a == b ||\n      !!(a && b &&\n         goog.array.equals(a.ranges_, b.ranges_, goog.math.Range.equals));\n};\n\n\n/**\n * @return {!goog.math.RangeSet} A new RangeSet containing the same values as\n *      this one.\n */\ngoog.math.RangeSet.prototype.clone = function() {\n  var set = new goog.math.RangeSet();\n\n  for (var i = this.ranges_.length; i--;) {\n    set.ranges_[i] = this.ranges_[i].clone();\n  }\n\n  return set;\n};\n\n\n/**\n * Adds a range to the set. If the new range overlaps existing values, those\n * ranges will be merged.\n *\n * @param {goog.math.Range} a The range to add.\n */\ngoog.math.RangeSet.prototype.add = function(a) {\n  if (a.end <= a.start) {\n    // Empty ranges are ignored.\n    return;\n  }\n\n  a = a.clone();\n\n  // Find the insertion point.\n  for (var i = 0, b; b = this.ranges_[i]; i++) {\n    if (a.start <= b.end) {\n      a.start = Math.min(a.start, b.start);\n      break;\n    }\n  }\n\n  var insertionPoint = i;\n\n  for (; b = this.ranges_[i]; i++) {\n    if (a.end < b.start) {\n      break;\n    }\n    a.end = Math.max(a.end, b.end);\n  }\n\n  this.ranges_.splice(insertionPoint, i - insertionPoint, a);\n};\n\n\n/**\n * Removes a range of values from the set.\n *\n * @param {goog.math.Range} a The range to remove.\n */\ngoog.math.RangeSet.prototype.remove = function(a) {\n  if (a.end <= a.start) {\n    // Empty ranges are ignored.\n    return;\n  }\n\n  // Find the insertion point.\n  for (var i = 0, b; b = this.ranges_[i]; i++) {\n    if (a.start < b.end) {\n      break;\n    }\n  }\n\n  if (!b || a.end < b.start) {\n    // The range being removed doesn't overlap any existing range. Exit early.\n    return;\n  }\n\n  var insertionPoint = i;\n\n  if (a.start > b.start) {\n    // There is an overlap with the nearest range. Modify it accordingly.\n    insertionPoint++;\n\n    if (a.end < b.end) {\n      goog.array.insertAt(\n          this.ranges_, new goog.math.Range(a.end, b.end), insertionPoint);\n    }\n    b.end = a.start;\n  }\n\n  for (i = insertionPoint; b = this.ranges_[i]; i++) {\n    b.start = Math.max(a.end, b.start);\n    if (a.end < b.end) {\n      break;\n    }\n  }\n\n  this.ranges_.splice(insertionPoint, i - insertionPoint);\n};\n\n\n/**\n * Determines whether a given range is in the set. Only succeeds if the entire\n * range is available.\n *\n * @param {goog.math.Range} a The query range.\n * @return {boolean} Whether the entire requested range is set.\n */\ngoog.math.RangeSet.prototype.contains = function(a) {\n  if (a.end <= a.start) {\n    return false;\n  }\n\n  for (var i = 0, b; b = this.ranges_[i]; i++) {\n    if (a.start < b.end) {\n      if (a.end >= b.start) {\n        return goog.math.Range.contains(b, a);\n      }\n      break;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Determines whether a given value is set in the RangeSet.\n *\n * @param {number} value The value to test.\n * @return {boolean} Whether the given value is in the set.\n */\ngoog.math.RangeSet.prototype.containsValue = function(value) {\n  for (var i = 0, b; b = this.ranges_[i]; i++) {\n    if (value < b.end) {\n      if (value >= b.start) {\n        return true;\n      }\n      break;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Returns the union of this RangeSet with another.\n *\n * @param {goog.math.RangeSet} set Another RangeSet.\n * @return {!goog.math.RangeSet} A new RangeSet containing all values from\n *     either set.\n */\ngoog.math.RangeSet.prototype.union = function(set) {\n  // TODO(brenneman): A linear-time merge would be preferable if it is ever a\n  // bottleneck.\n  set = set.clone();\n\n  for (var i = 0, a; a = this.ranges_[i]; i++) {\n    set.add(a);\n  }\n\n  return set;\n};\n\n\n/**\n * Subtracts the ranges of another set from this one, returning the result\n * as a new RangeSet.\n *\n * @param {!goog.math.RangeSet} set The RangeSet to subtract.\n * @return {!goog.math.RangeSet} A new RangeSet containing all values in this\n *     set minus the values of the input set.\n */\ngoog.math.RangeSet.prototype.difference = function(set) {\n  var ret = this.clone();\n\n  for (var i = 0, a; a = set.ranges_[i]; i++) {\n    ret.remove(a);\n  }\n\n  return ret;\n};\n\n\n/**\n * Intersects this RangeSet with another.\n *\n * @param {goog.math.RangeSet} set The RangeSet to intersect with.\n * @return {!goog.math.RangeSet} A new RangeSet containing all values set in\n *     both this and the input set.\n */\ngoog.math.RangeSet.prototype.intersection = function(set) {\n  if (this.isEmpty() || set.isEmpty()) {\n    return new goog.math.RangeSet();\n  }\n\n  return this.difference(set.inverse(this.getBounds()));\n};\n\n\n/**\n * Creates a subset of this set over the input range.\n *\n * @param {goog.math.Range} range The range to copy into the slice.\n * @return {!goog.math.RangeSet} A new RangeSet with a copy of the values in the\n *     input range.\n */\ngoog.math.RangeSet.prototype.slice = function(range) {\n  var set = new goog.math.RangeSet();\n  if (range.start >= range.end) {\n    return set;\n  }\n\n  for (var i = 0, b; b = this.ranges_[i]; i++) {\n    if (b.end <= range.start) {\n      continue;\n    }\n    if (b.start > range.end) {\n      break;\n    }\n\n    set.add(\n        new goog.math.Range(\n            Math.max(range.start, b.start), Math.min(range.end, b.end)));\n  }\n\n  return set;\n};\n\n\n/**\n * Creates an inverted slice of this set over the input range.\n *\n * @param {goog.math.Range} range The range to copy into the slice.\n * @return {!goog.math.RangeSet} A new RangeSet containing inverted values from\n *     the original over the input range.\n */\ngoog.math.RangeSet.prototype.inverse = function(range) {\n  var set = new goog.math.RangeSet();\n\n  set.add(range);\n  for (var i = 0, b; b = this.ranges_[i]; i++) {\n    if (range.start >= b.end) {\n      continue;\n    }\n    if (range.end < b.start) {\n      break;\n    }\n\n    set.remove(b);\n  }\n\n  return set;\n};\n\n\n/**\n * @return {number} The sum of the lengths of ranges covered in the set.\n */\ngoog.math.RangeSet.prototype.coveredLength = function() {\n  return /** @type {number} */ (\n      goog.array.reduce(this.ranges_, function(res, range) {\n        return res + range.end - range.start;\n      }, 0));\n};\n\n\n/**\n * @return {goog.math.Range} The total range this set covers, ignoring any\n *     gaps between ranges.\n */\ngoog.math.RangeSet.prototype.getBounds = function() {\n  if (this.ranges_.length) {\n    return new goog.math.Range(\n        this.ranges_[0].start, goog.array.peek(this.ranges_).end);\n  }\n\n  return null;\n};\n\n\n/**\n * @return {boolean} Whether any ranges are currently in the set.\n */\ngoog.math.RangeSet.prototype.isEmpty = function() {\n  return this.ranges_.length == 0;\n};\n\n\n/**\n * Removes all values in the set.\n */\ngoog.math.RangeSet.prototype.clear = function() {\n  this.ranges_.length = 0;\n};\n\n\n/**\n * Returns an iterator that iterates over the ranges in the RangeSet.\n *\n * @param {boolean=} opt_keys Ignored for RangeSets.\n * @return {!goog.iter.Iterator} An iterator over the values in the set.\n */\ngoog.math.RangeSet.prototype.__iterator__ = function(opt_keys) {\n  var i = 0;\n  var list = this.ranges_;\n\n  var iterator = new goog.iter.Iterator();\n  iterator.next = function() {\n    if (i >= list.length) {\n      throw goog.iter.StopIteration;\n    }\n    return list[i++].clone();\n  };\n\n  return iterator;\n};\n","^;",1579837703000,"^<",["^=",["~$goog.math.Range","^?","^61","^AY","^2O"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/rangeset.js"],"^O",["^=",["~$goog.math.RangeSet"]],"^W",true,"^X",["^?","^2O","^AY","^61","^DQ"]],["^ ","^3",[1579837703000],"^4","goog.ui.nativebuttonrenderer.js","^5",["^6","goog/ui/nativebuttonrenderer.js"],"^7","goog/ui/nativebuttonrenderer.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Native browser button renderer for {@link goog.ui.Button}s.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.NativeButtonRenderer');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.EventType');\ngoog.require('goog.ui.ButtonRenderer');\ngoog.require('goog.ui.Component');\n\n\n\n/**\n * Renderer for {@link goog.ui.Button}s.  Renders and decorates native HTML\n * button elements.  Since native HTML buttons have built-in support for many\n * features, overrides many expensive (and redundant) superclass methods to\n * be no-ops.\n * @constructor\n * @extends {goog.ui.ButtonRenderer}\n */\ngoog.ui.NativeButtonRenderer = function() {\n  goog.ui.ButtonRenderer.call(this);\n};\ngoog.inherits(goog.ui.NativeButtonRenderer, goog.ui.ButtonRenderer);\ngoog.addSingletonGetter(goog.ui.NativeButtonRenderer);\n\n\n/** @override */\ngoog.ui.NativeButtonRenderer.prototype.getAriaRole = function() {\n  // Native buttons don't need ARIA roles to be recognized by screen readers.\n  return undefined;\n};\n\n\n/**\n * Returns the button's contents wrapped in a native HTML button element.  Sets\n * the button's disabled attribute as needed.\n * @param {goog.ui.Control} button Button to render.\n * @return {Element} Root element for the button (a native HTML button element).\n * @override\n */\ngoog.ui.NativeButtonRenderer.prototype.createDom = function(button) {\n  this.setUpNativeButton_(button);\n  return button.getDomHelper().createDom(\n      goog.dom.TagName.BUTTON, {\n        'class': this.getClassNames(button).join(' '),\n        'disabled': !button.isEnabled(),\n        'title': button.getTooltip() || '',\n        'value': button.getValue() || ''\n      },\n      button.getCaption() || '');\n};\n\n\n/**\n * Overrides {@link goog.ui.ButtonRenderer#canDecorate} by returning true only\n * if the element is an HTML button.\n * @param {Element} element Element to decorate.\n * @return {boolean} Whether the renderer can decorate the element.\n * @override\n */\ngoog.ui.NativeButtonRenderer.prototype.canDecorate = function(element) {\n  return element.tagName == goog.dom.TagName.BUTTON ||\n      (element.tagName == goog.dom.TagName.INPUT &&\n       (element.type == goog.dom.InputType.BUTTON ||\n        element.type == goog.dom.InputType.SUBMIT ||\n        element.type == goog.dom.InputType.RESET));\n};\n\n\n/** @override */\ngoog.ui.NativeButtonRenderer.prototype.decorate = function(button, element) {\n  this.setUpNativeButton_(button);\n  if (element.disabled) {\n    // Add the marker class for the DISABLED state before letting the superclass\n    // implementation decorate the element, so its state will be correct.\n    var disabledClassName = goog.asserts.assertString(\n        this.getClassForState(goog.ui.Component.State.DISABLED));\n    goog.dom.classlist.add(element, disabledClassName);\n  }\n  return goog.ui.NativeButtonRenderer.superClass_.decorate.call(\n      this, button, element);\n};\n\n\n/**\n * Native buttons natively support BiDi and keyboard focus.\n * @suppress {visibility} getHandler and performActionInternal\n * @override\n */\ngoog.ui.NativeButtonRenderer.prototype.initializeDom = function(button) {\n  // WARNING:  This is a hack, and it is only applicable to native buttons,\n  // which are special because they do natively what most goog.ui.Controls\n  // do programmatically.  Do not use your renderer's initializeDom method\n  // to hook up event handlers!\n  button.getHandler().listen(\n      button.getElement(), goog.events.EventType.CLICK,\n      button.performActionInternal);\n};\n\n\n/**\n * @override\n * Native buttons don't support text selection.\n */\ngoog.ui.NativeButtonRenderer.prototype.setAllowTextSelection =\n    goog.nullFunction;\n\n\n/**\n * @override\n * Native buttons natively support right-to-left rendering.\n */\ngoog.ui.NativeButtonRenderer.prototype.setRightToLeft = goog.nullFunction;\n\n\n/**\n * @override\n * Native buttons are always focusable as long as they are enabled.\n */\ngoog.ui.NativeButtonRenderer.prototype.isFocusable = function(button) {\n  return button.isEnabled();\n};\n\n\n/**\n * @override\n * Native buttons natively support keyboard focus.\n */\ngoog.ui.NativeButtonRenderer.prototype.setFocusable = goog.nullFunction;\n\n\n/**\n * @override\n * Native buttons also expose the DISABLED state in the HTML button's\n * `disabled` attribute.\n */\ngoog.ui.NativeButtonRenderer.prototype.setState = function(\n    button, state, enable) {\n  goog.ui.NativeButtonRenderer.superClass_.setState.call(\n      this, button, state, enable);\n  var element = button.getElement();\n  if (element && state == goog.ui.Component.State.DISABLED) {\n    element.disabled = enable;\n  }\n};\n\n\n/**\n * @override\n * Native buttons store their value in the HTML button's `value`\n * attribute.\n */\ngoog.ui.NativeButtonRenderer.prototype.getValue = function(element) {\n  // TODO(attila): Make this work on IE!  This never worked...\n  // See http://www.fourmilab.ch/fourmilog/archives/2007-03/000824.html\n  // for a description of the problem.\n  return element.value;\n};\n\n\n/**\n * @override\n * Native buttons also expose their value in the HTML button's `value`\n * attribute.\n */\ngoog.ui.NativeButtonRenderer.prototype.setValue = function(element, value) {\n  if (element) {\n    // TODO(attila): Make this work on IE!  This never worked...\n    // See http://www.fourmilab.ch/fourmilog/archives/2007-03/000824.html\n    // for a description of the problem.\n    element.value = value;\n  }\n};\n\n\n/**\n * @override\n * Native buttons don't need ARIA states to support accessibility, so this is\n * a no-op.\n */\ngoog.ui.NativeButtonRenderer.prototype.updateAriaState = goog.nullFunction;\n\n\n/**\n * Sets up the button control such that it doesn't waste time adding\n * functionality that is already natively supported by native browser\n * buttons.\n * @param {goog.ui.Control} button Button control to configure.\n * @private\n */\ngoog.ui.NativeButtonRenderer.prototype.setUpNativeButton_ = function(button) {\n  button.setHandleMouseEvents(false);\n  button.setAutoStates(goog.ui.Component.State.ALL, false);\n  button.setSupportedState(goog.ui.Component.State.FOCUSED, false);\n};\n","^;",1579837703000,"^<",["^=",["^1L","^1M","^1P","^1U","^?","^1C","^CB","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/nativebuttonrenderer.js"],"^O",["^=",["~$goog.ui.NativeButtonRenderer"]],"^W",true,"^X",["^?","^1L","^1U","^12","^1M","^1C","^CB","^1P"]],["^ ","^3",[1579837703000],"^4","goog.dom.pattern.callback.counter.js","^5",["^6","goog/dom/pattern/callback/counter.js"],"^7","goog/dom/pattern/callback/counter.js","^8","^9","^:","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Callback object that counts matches.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.pattern.callback.Counter');\n\n\n\n/**\n * Callback class for counting matches.\n * @constructor\n * @final\n */\ngoog.dom.pattern.callback.Counter = function() {\n  /**\n   * The count of objects matched so far.\n   *\n   * @type {number}\n   */\n  this.count = 0;\n\n  /**\n   * The callback function.  Suitable as a callback for\n   * {@link goog.dom.pattern.Matcher}.\n   * @private {?Function}\n   */\n  this.callback_ = null;\n};\n\n\n/**\n * Get a bound callback function that is suitable as a callback for\n * {@link goog.dom.pattern.Matcher}.\n *\n * @return {!Function} A callback function.\n */\ngoog.dom.pattern.callback.Counter.prototype.getCallback = function() {\n  if (!this.callback_) {\n    this.callback_ = goog.bind(function() {\n      this.count++;\n      return false;\n    }, this);\n  }\n  return this.callback_;\n};\n\n\n/**\n * Reset the counter.\n */\ngoog.dom.pattern.callback.Counter.prototype.reset = function() {\n  this.count = 0;\n};\n","^;",1579837703000,"^<",["^=",["^?"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/callback/counter.js"],"^O",["^=",["~$goog.dom.pattern.callback.Counter"]],"^W",true,"^X",["^?"]],["^ ","^3",[1579837703000],"^4","goog.fs.filereader.js","^5",["^6","goog/fs/filereader.js"],"^7","goog/fs/filereader.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A wrapper for the HTML5 FileReader object.\n *\n */\n\ngoog.provide('goog.fs.FileReader');\ngoog.provide('goog.fs.FileReader.EventType');\ngoog.provide('goog.fs.FileReader.ReadyState');\n\ngoog.require('goog.async.Deferred');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.fs.Error');\ngoog.require('goog.fs.ProgressEvent');\n\n\n\n/**\n * An object for monitoring the reading of files. This emits ProgressEvents of\n * the types listed in {@link goog.fs.FileReader.EventType}.\n *\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.fs.FileReader = function() {\n  goog.fs.FileReader.base(this, 'constructor');\n\n  /**\n   * The underlying FileReader object.\n   *\n   * @type {!FileReader}\n   * @private\n   */\n  this.reader_ = new FileReader();\n\n  this.reader_.onloadstart = goog.bind(this.dispatchProgressEvent_, this);\n  this.reader_.onprogress = goog.bind(this.dispatchProgressEvent_, this);\n  this.reader_.onload = goog.bind(this.dispatchProgressEvent_, this);\n  this.reader_.onabort = goog.bind(this.dispatchProgressEvent_, this);\n  this.reader_.onerror = goog.bind(this.dispatchProgressEvent_, this);\n  this.reader_.onloadend = goog.bind(this.dispatchProgressEvent_, this);\n};\ngoog.inherits(goog.fs.FileReader, goog.events.EventTarget);\n\n\n/**\n * Possible states for a FileReader.\n *\n * @enum {number}\n */\ngoog.fs.FileReader.ReadyState = {\n  /**\n   * The object has been constructed, but there is no pending read.\n   */\n  INIT: 0,\n  /**\n   * Data is being read.\n   */\n  LOADING: 1,\n  /**\n   * The data has been read from the file, the read was aborted, or an error\n   * occurred.\n   */\n  DONE: 2\n};\n\n\n/**\n * Events emitted by a FileReader.\n *\n * @enum {string}\n */\ngoog.fs.FileReader.EventType = {\n  /**\n   * Emitted when the reading begins. readyState will be LOADING.\n   */\n  LOAD_START: 'loadstart',\n  /**\n   * Emitted when progress has been made in reading the file. readyState will be\n   * LOADING.\n   */\n  PROGRESS: 'progress',\n  /**\n   * Emitted when the data has been successfully read. readyState will be\n   * LOADING.\n   */\n  LOAD: 'load',\n  /**\n   * Emitted when the reading has been aborted. readyState will be LOADING.\n   */\n  ABORT: 'abort',\n  /**\n   * Emitted when an error is encountered or the reading has been aborted.\n   * readyState will be LOADING.\n   */\n  ERROR: 'error',\n  /**\n   * Emitted when the reading is finished, whether successfully or not.\n   * readyState will be DONE.\n   */\n  LOAD_END: 'loadend'\n};\n\n\n/**\n * Abort the reading of the file.\n */\ngoog.fs.FileReader.prototype.abort = function() {\n  try {\n    this.reader_.abort();\n  } catch (e) {\n    throw new goog.fs.Error(e, 'aborting read');\n  }\n};\n\n\n/**\n * @return {goog.fs.FileReader.ReadyState} The current state of the FileReader.\n */\ngoog.fs.FileReader.prototype.getReadyState = function() {\n  return /** @type {goog.fs.FileReader.ReadyState} */ (this.reader_.readyState);\n};\n\n\n/**\n * @return {*} The result of the file read.\n */\ngoog.fs.FileReader.prototype.getResult = function() {\n  return this.reader_.result;\n};\n\n\n/**\n * @return {goog.fs.Error} The error encountered while reading, if any.\n */\ngoog.fs.FileReader.prototype.getError = function() {\n  return this.reader_.error &&\n      new goog.fs.Error(this.reader_.error, 'reading file');\n};\n\n\n/**\n * Wrap a progress event emitted by the underlying file reader and re-emit it.\n *\n * @param {!ProgressEvent} event The underlying event.\n * @private\n */\ngoog.fs.FileReader.prototype.dispatchProgressEvent_ = function(event) {\n  this.dispatchEvent(new goog.fs.ProgressEvent(event, this));\n};\n\n\n/** @override */\ngoog.fs.FileReader.prototype.disposeInternal = function() {\n  goog.fs.FileReader.base(this, 'disposeInternal');\n  delete this.reader_;\n};\n\n\n/**\n * Starts reading a blob as a binary string.\n * @param {!Blob} blob The blob to read.\n */\ngoog.fs.FileReader.prototype.readAsBinaryString = function(blob) {\n  this.reader_.readAsBinaryString(blob);\n};\n\n\n/**\n * Reads a blob as a binary string.\n * @param {!Blob} blob The blob to read.\n * @return {!goog.async.Deferred} The deferred Blob contents as a binary string.\n *     If an error occurs, the errback is called with a {@link goog.fs.Error}.\n */\ngoog.fs.FileReader.readAsBinaryString = function(blob) {\n  var reader = new goog.fs.FileReader();\n  var d = goog.fs.FileReader.createDeferred_(reader);\n  reader.readAsBinaryString(blob);\n  return d;\n};\n\n\n/**\n * Starts reading a blob as an array buffer.\n * @param {!Blob} blob The blob to read.\n */\ngoog.fs.FileReader.prototype.readAsArrayBuffer = function(blob) {\n  this.reader_.readAsArrayBuffer(blob);\n};\n\n\n/**\n * Reads a blob as an array buffer.\n * @param {!Blob} blob The blob to read.\n * @return {!goog.async.Deferred} The deferred Blob contents as an array buffer.\n *     If an error occurs, the errback is called with a {@link goog.fs.Error}.\n */\ngoog.fs.FileReader.readAsArrayBuffer = function(blob) {\n  var reader = new goog.fs.FileReader();\n  var d = goog.fs.FileReader.createDeferred_(reader);\n  reader.readAsArrayBuffer(blob);\n  return d;\n};\n\n\n/**\n * Starts reading a blob as text.\n * @param {!Blob} blob The blob to read.\n * @param {string=} opt_encoding The name of the encoding to use.\n */\ngoog.fs.FileReader.prototype.readAsText = function(blob, opt_encoding) {\n  this.reader_.readAsText(blob, opt_encoding);\n};\n\n\n/**\n * Reads a blob as text.\n * @param {!Blob} blob The blob to read.\n * @param {string=} opt_encoding The name of the encoding to use.\n * @return {!goog.async.Deferred} The deferred Blob contents as text.\n *     If an error occurs, the errback is called with a {@link goog.fs.Error}.\n */\ngoog.fs.FileReader.readAsText = function(blob, opt_encoding) {\n  var reader = new goog.fs.FileReader();\n  var d = goog.fs.FileReader.createDeferred_(reader);\n  reader.readAsText(blob, opt_encoding);\n  return d;\n};\n\n\n/**\n * Starts reading a blob as a data URL.\n * @param {!Blob} blob The blob to read.\n */\ngoog.fs.FileReader.prototype.readAsDataUrl = function(blob) {\n  this.reader_.readAsDataURL(blob);\n};\n\n\n/**\n * Reads a blob as a data URL.\n * @param {!Blob} blob The blob to read.\n * @return {!goog.async.Deferred} The deferred Blob contents as a data URL.\n *     If an error occurs, the errback is called with a {@link goog.fs.Error}.\n */\ngoog.fs.FileReader.readAsDataUrl = function(blob) {\n  var reader = new goog.fs.FileReader();\n  var d = goog.fs.FileReader.createDeferred_(reader);\n  reader.readAsDataUrl(blob);\n  return d;\n};\n\n\n/**\n * Creates a new deferred object for the results of a read method.\n * @param {goog.fs.FileReader} reader The reader to create a deferred for.\n * @return {!goog.async.Deferred} The deferred results.\n * @private\n */\ngoog.fs.FileReader.createDeferred_ = function(reader) {\n  var deferred = new goog.async.Deferred();\n  reader.listen(\n      goog.fs.FileReader.EventType.LOAD_END, goog.partial(function(d, r, e) {\n        var result = r.getResult();\n        var error = r.getError();\n        if (result != null && !error) {\n          d.callback(result);\n        } else {\n          d.errback(error);\n        }\n        r.dispose();\n      }, deferred, reader));\n  return deferred;\n};\n","^;",1579837703000,"^<",["^=",["^6K","^?","^3W","^5<","~$goog.fs.ProgressEvent"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fs/filereader.js"],"^O",["^=",["~$goog.fs.FileReader.EventType","~$goog.fs.FileReader.ReadyState","~$goog.fs.FileReader"]],"^W",true,"^X",["^?","^5<","^3W","^6K","^DU"]],["^ ","^3",[1579837703000],"^4","goog.proto2.serializer.js","^5",["^6","goog/proto2/serializer.js"],"^7","goog/proto2/serializer.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Base class for all Protocol Buffer 2 serializers.\n */\n\ngoog.provide('goog.proto2.Serializer');\n\ngoog.require('goog.asserts');\ngoog.require('goog.proto2.FieldDescriptor');\ngoog.require('goog.proto2.Message');\n\n\n\n/**\n * Abstract base class for PB2 serializers. A serializer is a class which\n * implements the serialization and deserialization of a Protocol Buffer Message\n * to/from a specific format.\n *\n * @constructor\n */\ngoog.proto2.Serializer = function() {};\n\n\n/**\n * @define {boolean} Whether to decode and convert symbolic enum values to\n * actual enum values or leave them as strings.\n */\ngoog.proto2.Serializer.DECODE_SYMBOLIC_ENUMS =\n    goog.define('goog.proto2.Serializer.DECODE_SYMBOLIC_ENUMS', false);\n\n\n/**\n * Serializes a message to the expected format.\n *\n * @param {goog.proto2.Message} message The message to be serialized.\n *\n * @return {*} The serialized form of the message.\n */\ngoog.proto2.Serializer.prototype.serialize = goog.abstractMethod;\n\n\n/**\n * Returns the serialized form of the given value for the given field if the\n * field is a Message or Group and returns the value unchanged otherwise, except\n * for Infinity, -Infinity and NaN numerical values which are converted to\n * string representation.\n *\n * @param {goog.proto2.FieldDescriptor} field The field from which this\n *     value came.\n *\n * @param {*} value The value of the field.\n *\n * @return {*} The value.\n * @protected\n */\ngoog.proto2.Serializer.prototype.getSerializedValue = function(field, value) {\n  if (field.isCompositeType()) {\n    return this.serialize(/** @type {goog.proto2.Message} */ (value));\n  } else if (typeof value === 'number' && !isFinite(value)) {\n    return value.toString();\n  } else {\n    return value;\n  }\n};\n\n\n/**\n * Deserializes a message from the expected format.\n *\n * @param {goog.proto2.Descriptor} descriptor The descriptor of the message\n *     to be created.\n * @param {*} data The data of the message.\n *\n * @return {!goog.proto2.Message} The message created.\n */\ngoog.proto2.Serializer.prototype.deserialize = function(descriptor, data) {\n  var message = descriptor.createMessageInstance();\n  this.deserializeTo(message, data);\n  goog.asserts.assert(message instanceof goog.proto2.Message);\n  return message;\n};\n\n\n/**\n * Deserializes a message from the expected format and places the\n * data in the message.\n *\n * @param {goog.proto2.Message} message The message in which to\n *     place the information.\n * @param {*} data The data of the message.\n */\ngoog.proto2.Serializer.prototype.deserializeTo = goog.abstractMethod;\n\n\n/**\n * Returns the deserialized form of the given value for the given field if the\n * field is a Message or Group and returns the value, converted or unchanged,\n * for primitive field types otherwise.\n *\n * @param {goog.proto2.FieldDescriptor} field The field from which this\n *     value came.\n *\n * @param {*} value The value of the field.\n *\n * @return {*} The value.\n * @protected\n */\ngoog.proto2.Serializer.prototype.getDeserializedValue = function(field, value) {\n  // Composite types are deserialized recursively.\n  if (field.isCompositeType()) {\n    if (value instanceof goog.proto2.Message) {\n      return value;\n    }\n\n    return this.deserialize(field.getFieldMessageType(), value);\n  }\n\n  // Decode enum values.\n  if (field.getFieldType() == goog.proto2.FieldDescriptor.FieldType.ENUM) {\n    // If it's a string, get enum value by name.\n    // NB: In order this feature to work, property renaming should be turned off\n    // for the respective enums.\n    if (goog.proto2.Serializer.DECODE_SYMBOLIC_ENUMS &&\n        typeof value === 'string') {\n      // enumType is a regular JavaScript enum as defined in field's metadata.\n      var enumType = field.getNativeType();\n      if (enumType.hasOwnProperty(value)) {\n        return enumType[value];\n      }\n    }\n\n    // If it's a string containing a positive integer, this looks like a viable\n    // enum int value. Return as numeric.\n    if (typeof value === 'string' &&\n        goog.proto2.Serializer.INTEGER_REGEX.test(value)) {\n      var numeric = Number(value);\n      if (numeric > 0) {\n        return numeric;\n      }\n    }\n\n    // Return unknown values as is for backward compatibility.\n    return value;\n  }\n\n  // Return the raw value if the field does not allow the JSON input to be\n  // converted.\n  if (!field.deserializationConversionPermitted()) {\n    return value;\n  }\n\n  // Convert to native type of field.  Return the converted value or fall\n  // through to return the raw value.  The JSON encoding of int64 value 123\n  // might be either the number 123 or the string \"123\".  The field native type\n  // could be either Number or String (depending on field options in the .proto\n  // file).  All four combinations should work correctly.\n  var nativeType = field.getNativeType();\n  if (nativeType === String) {\n    // JSON numbers can be converted to strings.\n    if (typeof value === 'number') {\n      return String(value);\n    }\n  } else if (nativeType === Number) {\n    // JSON strings are sometimes used for large integer numeric values, as well\n    // as Infinity, -Infinity and NaN.\n    if (typeof value === 'string') {\n      // Handle +/- Infinity and NaN values.\n      if (value === 'Infinity' || value === '-Infinity' || value === 'NaN') {\n        return Number(value);\n      }\n\n      // Validate the string.  If the string is not an integral number, we would\n      // rather have an assertion or error in the caller than a mysterious NaN\n      // value.\n      if (goog.proto2.Serializer.INTEGER_REGEX.test(value)) {\n        return Number(value);\n      }\n    }\n  }\n\n  return value;\n};\n\n\n/** @const {!RegExp} */\ngoog.proto2.Serializer.INTEGER_REGEX = /^-?[0-9]+$/;\n","^;",1579837703000,"^<",["^=",["^1L","^?","^DA","^6C"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/proto2/serializer.js"],"^O",["^=",["^D@"]],"^W",true,"^X",["^?","^1L","^DA","^6C"]],["^ ","^3",[1579837703000],"^4","goog.net.channelrequest.js","^5",["^6","goog/net/channelrequest.js"],"^7","goog/net/channelrequest.js","^8","^9","^:","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the ChannelRequest class. The ChannelRequest\n * object encapsulates the logic for making a single request, either for the\n * forward channel, back channel, or test channel, to the server. It contains\n * the logic for the three types of transports we use in the BrowserChannel:\n * XMLHTTP, Trident ActiveX (ie only), and Image request. It provides timeout\n * detection. This class is part of the BrowserChannel implementation and is not\n * for use by normal application code.\n *\n */\n\n\ngoog.provide('goog.net.ChannelRequest');\ngoog.provide('goog.net.ChannelRequest.Error');\n\ngoog.forwardDeclare('goog.Uri');\ngoog.forwardDeclare('goog.net.BrowserChannel');\ngoog.forwardDeclare('goog.net.BrowserTestChannel');\ngoog.forwardDeclare('goog.net.ChannelDebug');\ngoog.forwardDeclare('goog.net.XhrIo');\ngoog.require('goog.Timer');\ngoog.require('goog.async.Throttle');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.html.SafeUrl');\ngoog.require('goog.html.uncheckedconversions');\ngoog.require('goog.net.ErrorCode');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.XmlHttp');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.string.Const');\ngoog.require('goog.userAgent');\n\n// TODO(nnaze): This file depends on goog.net.BrowserChannel and vice versa (a\n// circular dependency).  Usages of BrowserChannel are marked as\n// \"missingRequire\" below for now.  This should be fixed through refactoring.\n\n\n\n/**\n * Creates a ChannelRequest object which encapsulates a request to the server.\n * A new ChannelRequest is created for each request to the server.\n *\n * @param {goog.net.BrowserChannel|goog.net.BrowserTestChannel} channel\n *     The BrowserChannel that owns this request.\n * @param {goog.net.ChannelDebug} channelDebug A ChannelDebug to use for\n *     logging.\n * @param {string=} opt_sessionId  The session id for the channel.\n * @param {string|number=} opt_requestId  The request id for this request.\n * @param {number=} opt_retryId  The retry id for this request.\n * @constructor\n */\ngoog.net.ChannelRequest = function(\n    channel, channelDebug, opt_sessionId, opt_requestId, opt_retryId) {\n  /**\n   * The BrowserChannel object that owns the request.\n   * @type {goog.net.BrowserChannel|goog.net.BrowserTestChannel}\n   * @private\n   */\n  this.channel_ = channel;\n\n  /**\n   * The channel debug to use for logging\n   * @type {goog.net.ChannelDebug}\n   * @private\n   */\n  this.channelDebug_ = channelDebug;\n\n  /**\n   * The Session ID for the channel.\n   * @type {string|undefined}\n   * @private\n   */\n  this.sid_ = opt_sessionId;\n\n  /**\n   * The RID (request ID) for the request.\n   * @type {string|number|undefined}\n   * @private\n   */\n  this.rid_ = opt_requestId;\n\n\n  /**\n   * The attempt number of the current request.\n   * @type {number}\n   * @private\n   */\n  this.retryId_ = opt_retryId || 1;\n\n\n  /**\n   * The timeout in ms before failing the request.\n   * @type {number}\n   * @private\n   */\n  this.timeout_ = goog.net.ChannelRequest.TIMEOUT_MS;\n\n  /**\n   * An object to keep track of the channel request event listeners.\n   * @type {!goog.events.EventHandler<!goog.net.ChannelRequest>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  /**\n   * A timer for polling responseText in browsers that don't fire\n   * onreadystatechange during incremental loading of responseText.\n   * @type {goog.Timer}\n   * @private\n   */\n  this.pollingTimer_ = new goog.Timer();\n\n  this.pollingTimer_.setInterval(goog.net.ChannelRequest.POLLING_INTERVAL_MS);\n};\n\n\n/**\n * Extra HTTP headers to add to all the requests sent to the server.\n * @type {?Object}\n * @private\n */\ngoog.net.ChannelRequest.prototype.extraHeaders_ = null;\n\n\n/**\n * Whether the request was successful. This is only set to true after the\n * request successfuly completes.\n * @type {boolean}\n * @private\n */\ngoog.net.ChannelRequest.prototype.successful_ = false;\n\n\n/**\n * The TimerID of the timer used to detect if the request has timed-out.\n * @type {?number}\n * @private\n */\ngoog.net.ChannelRequest.prototype.watchDogTimerId_ = null;\n\n\n/**\n * The time in the future when the request will timeout.\n * @type {?number}\n * @private\n */\ngoog.net.ChannelRequest.prototype.watchDogTimeoutTime_ = null;\n\n\n/**\n * The time the request started.\n * @type {?number}\n * @private\n */\ngoog.net.ChannelRequest.prototype.requestStartTime_ = null;\n\n\n/**\n * The type of request (XMLHTTP, IMG, Trident)\n * @type {?number}\n * @private\n */\ngoog.net.ChannelRequest.prototype.type_ = null;\n\n\n/**\n * The base Uri for the request. The includes all the parameters except the\n * one that indicates the retry number.\n * @type {goog.Uri?}\n * @private\n */\ngoog.net.ChannelRequest.prototype.baseUri_ = null;\n\n\n/**\n * The request Uri that was actually used for the most recent request attempt.\n * @type {goog.Uri?}\n * @private\n */\ngoog.net.ChannelRequest.prototype.requestUri_ = null;\n\n\n/**\n * The post data, if the request is a post.\n * @type {?string}\n * @private\n */\ngoog.net.ChannelRequest.prototype.postData_ = null;\n\n\n/**\n * The XhrLte request if the request is using XMLHTTP\n * @type {?goog.net.XhrIo}\n * @private\n */\ngoog.net.ChannelRequest.prototype.xmlHttp_ = null;\n\n\n/**\n * The position of where the next unprocessed chunk starts in the response\n * text.\n * @type {number}\n * @private\n */\ngoog.net.ChannelRequest.prototype.xmlHttpChunkStart_ = 0;\n\n\n/**\n * The Trident instance if the request is using Trident.\n * @type {?Object}\n * @private\n */\ngoog.net.ChannelRequest.prototype.trident_ = null;\n\n\n/**\n * The verb (Get or Post) for the request.\n * @type {?string}\n * @private\n */\ngoog.net.ChannelRequest.prototype.verb_ = null;\n\n\n/**\n * The last error if the request failed.\n * @type {?goog.net.ChannelRequest.Error}\n * @private\n */\ngoog.net.ChannelRequest.prototype.lastError_ = null;\n\n\n/**\n * The last status code received.\n * @type {number}\n * @private\n */\ngoog.net.ChannelRequest.prototype.lastStatusCode_ = -1;\n\n\n/**\n * Whether to send the Connection:close header as part of the request.\n * @type {boolean}\n * @private\n */\ngoog.net.ChannelRequest.prototype.sendClose_ = true;\n\n\n/**\n * Whether the request has been cancelled due to a call to cancel.\n * @type {boolean}\n * @private\n */\ngoog.net.ChannelRequest.prototype.cancelled_ = false;\n\n\n/**\n * A throttle time in ms for readystatechange events for the backchannel.\n * Useful for throttling when ready state is INTERACTIVE (partial data).\n * If set to zero no throttle is used.\n *\n * @see goog.net.BrowserChannel.prototype.readyStateChangeThrottleMs_\n *\n * @type {number}\n * @private\n */\ngoog.net.ChannelRequest.prototype.readyStateChangeThrottleMs_ = 0;\n\n\n/**\n * The throttle for readystatechange events for the current request, or null\n * if there is none.\n * @type {?goog.async.Throttle}\n * @private\n */\ngoog.net.ChannelRequest.prototype.readyStateChangeThrottle_ = null;\n\n\n/**\n * Default timeout in MS for a request. The server must return data within this\n * time limit for the request to not timeout.\n * @type {number}\n */\ngoog.net.ChannelRequest.TIMEOUT_MS = 45 * 1000;\n\n\n/**\n * How often to poll (in MS) for changes to responseText in browsers that don't\n * fire onreadystatechange during incremental loading of responseText.\n * @type {number}\n */\ngoog.net.ChannelRequest.POLLING_INTERVAL_MS = 250;\n\n\n/**\n * Minimum version of Safari that receives a non-null responseText in ready\n * state interactive.\n * @type {string}\n * @private\n */\ngoog.net.ChannelRequest.MIN_WEBKIT_FOR_INTERACTIVE_ = '420+';\n\n\n/**\n * Enum for channel requests type\n * @enum {number}\n * @private\n */\ngoog.net.ChannelRequest.Type_ = {\n  /**\n   * XMLHTTP requests.\n   */\n  XML_HTTP: 1,\n\n  /**\n   * IMG requests.\n   */\n  IMG: 2,\n\n  /**\n   * Requests that use the MSHTML ActiveX control.\n   */\n  TRIDENT: 3\n};\n\n\n/**\n * Enum type for identifying a ChannelRequest error.\n * @enum {number}\n */\ngoog.net.ChannelRequest.Error = {\n  /**\n   * Errors due to a non-200 status code.\n   */\n  STATUS: 0,\n\n  /**\n   * Errors due to no data being returned.\n   */\n  NO_DATA: 1,\n\n  /**\n   * Errors due to a timeout.\n   */\n  TIMEOUT: 2,\n\n  /**\n   * Errors due to the server returning an unknown.\n   */\n  UNKNOWN_SESSION_ID: 3,\n\n  /**\n   * Errors due to bad data being received.\n   */\n  BAD_DATA: 4,\n\n  /**\n   * Errors due to the handler throwing an exception.\n   */\n  HANDLER_EXCEPTION: 5,\n\n  /**\n   * The browser declared itself offline during the request.\n   */\n  BROWSER_OFFLINE: 6,\n\n  /**\n   * IE is blocking ActiveX streaming.\n   */\n  ACTIVE_X_BLOCKED: 7\n};\n\n\n/**\n * Returns a useful error string for debugging based on the specified error\n * code.\n * @param {goog.net.ChannelRequest.Error} errorCode The error code.\n * @param {number} statusCode The HTTP status code.\n * @return {string} The error string for the given code combination.\n */\ngoog.net.ChannelRequest.errorStringFromCode = function(errorCode, statusCode) {\n  switch (errorCode) {\n    case goog.net.ChannelRequest.Error.STATUS:\n      return 'Non-200 return code (' + statusCode + ')';\n    case goog.net.ChannelRequest.Error.NO_DATA:\n      return 'XMLHTTP failure (no data)';\n    case goog.net.ChannelRequest.Error.TIMEOUT:\n      return 'HttpConnection timeout';\n    default:\n      return 'Unknown error';\n  }\n};\n\n\n/**\n * Sentinel value used to indicate an invalid chunk in a multi-chunk response.\n * @type {Object}\n * @private\n */\ngoog.net.ChannelRequest.INVALID_CHUNK_ = {};\n\n\n/**\n * Sentinel value used to indicate an incomplete chunk in a multi-chunk\n * response.\n * @type {Object}\n * @private\n */\ngoog.net.ChannelRequest.INCOMPLETE_CHUNK_ = {};\n\n\n/**\n * Returns whether XHR streaming is supported on this browser.\n *\n * If XHR streaming is not supported, we will try to use an ActiveXObject\n * to create a Forever IFrame.\n *\n * @return {boolean} Whether XHR streaming is supported.\n * @see http://code.google.com/p/closure-library/issues/detail?id=346\n */\ngoog.net.ChannelRequest.supportsXhrStreaming = function() {\n  return !goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(10);\n};\n\n\n/**\n * Sets extra HTTP headers to add to all the requests sent to the server.\n *\n * @param {Object} extraHeaders The HTTP headers.\n */\ngoog.net.ChannelRequest.prototype.setExtraHeaders = function(extraHeaders) {\n  this.extraHeaders_ = extraHeaders;\n};\n\n\n/**\n * Sets the timeout for a request\n *\n * @param {number} timeout   The timeout in MS for when we fail the request.\n */\ngoog.net.ChannelRequest.prototype.setTimeout = function(timeout) {\n  this.timeout_ = timeout;\n};\n\n\n/**\n * Sets the throttle for handling onreadystatechange events for the request.\n *\n * @param {number} throttle The throttle in ms.  A value of zero indicates\n *     no throttle.\n */\ngoog.net.ChannelRequest.prototype.setReadyStateChangeThrottle = function(\n    throttle) {\n  this.readyStateChangeThrottleMs_ = throttle;\n};\n\n\n/**\n * Uses XMLHTTP to send an HTTP POST to the server.\n *\n * @param {goog.Uri} uri  The uri of the request.\n * @param {string} postData  The data for the post body.\n * @param {boolean} decodeChunks  Whether to the result is expected to be\n *     encoded for chunking and thus requires decoding.\n */\ngoog.net.ChannelRequest.prototype.xmlHttpPost = function(\n    uri, postData, decodeChunks) {\n  this.type_ = goog.net.ChannelRequest.Type_.XML_HTTP;\n  this.baseUri_ = uri.clone().makeUnique();\n  this.postData_ = postData;\n  this.decodeChunks_ = decodeChunks;\n  this.sendXmlHttp_(null /* hostPrefix */);\n};\n\n\n/**\n * Uses XMLHTTP to send an HTTP GET to the server.\n *\n * @param {goog.Uri} uri  The uri of the request.\n * @param {boolean} decodeChunks  Whether to the result is expected to be\n *     encoded for chunking and thus requires decoding.\n * @param {?string} hostPrefix  The host prefix, if we might be using a\n *     secondary domain.  Note that it should also be in the URL, adding this\n *     won't cause it to be added to the URL.\n * @param {boolean=} opt_noClose   Whether to request that the tcp/ip connection\n *     should be closed.\n */\ngoog.net.ChannelRequest.prototype.xmlHttpGet = function(\n    uri, decodeChunks, hostPrefix, opt_noClose) {\n  this.type_ = goog.net.ChannelRequest.Type_.XML_HTTP;\n  this.baseUri_ = uri.clone().makeUnique();\n  this.postData_ = null;\n  this.decodeChunks_ = decodeChunks;\n  if (opt_noClose) {\n    this.sendClose_ = false;\n  }\n  this.sendXmlHttp_(hostPrefix);\n};\n\n\n/**\n * Sends a request via XMLHTTP according to the current state of the\n * ChannelRequest object.\n *\n * @param {?string} hostPrefix The host prefix, if we might be using a secondary\n *     domain.\n * @private\n */\ngoog.net.ChannelRequest.prototype.sendXmlHttp_ = function(hostPrefix) {\n  this.requestStartTime_ = goog.now();\n  this.ensureWatchDogTimer_();\n\n  // clone the base URI to create the request URI. The request uri has the\n  // attempt number as a parameter which helps in debugging.\n  this.requestUri_ = this.baseUri_.clone();\n  this.requestUri_.setParameterValues('t', this.retryId_);\n\n  // send the request either as a POST or GET\n  this.xmlHttpChunkStart_ = 0;\n  var useSecondaryDomains = this.channel_.shouldUseSecondaryDomains();\n  this.xmlHttp_ =\n      this.channel_.createXhrIo(useSecondaryDomains ? hostPrefix : null);\n\n  if (this.readyStateChangeThrottleMs_ > 0) {\n    this.readyStateChangeThrottle_ = new goog.async.Throttle(\n        goog.bind(this.xmlHttpHandler_, this, this.xmlHttp_),\n        this.readyStateChangeThrottleMs_);\n  }\n\n  this.eventHandler_.listen(\n      this.xmlHttp_, goog.net.EventType.READY_STATE_CHANGE,\n      this.readyStateChangeHandler_);\n\n  var headers = this.extraHeaders_ ? goog.object.clone(this.extraHeaders_) : {};\n  if (this.postData_) {\n    // todo (jonp) - use POST constant when Dan defines it\n    this.verb_ = 'POST';\n    headers['Content-Type'] = 'application/x-www-form-urlencoded';\n    this.xmlHttp_.send(this.requestUri_, this.verb_, this.postData_, headers);\n  } else {\n    // todo (jonp) - use GET constant when Dan defines it\n    this.verb_ = 'GET';\n\n    // If the user agent is webkit, we cannot send the close header since it is\n    // disallowed by the browser.  If we attempt to set the \"Connection: close\"\n    // header in WEBKIT browser, it will actually causes an error message.\n    if (this.sendClose_ && !goog.userAgent.WEBKIT) {\n      headers['Connection'] = 'close';\n    }\n    this.xmlHttp_.send(this.requestUri_, this.verb_, null, headers);\n  }\n  this.channel_.notifyServerReachabilityEvent(\n      /** @suppress {missingRequire} */ (\n          goog.net.BrowserChannel.ServerReachability.REQUEST_MADE));\n  this.channelDebug_.xmlHttpChannelRequest(\n      this.verb_, this.requestUri_, this.rid_, this.retryId_, this.postData_);\n};\n\n\n/**\n * Handles a readystatechange event.\n * @param {goog.events.Event} evt The event.\n * @private\n */\ngoog.net.ChannelRequest.prototype.readyStateChangeHandler_ = function(evt) {\n  var xhr = /** @type {goog.net.XhrIo} */ (evt.target);\n  var throttle = this.readyStateChangeThrottle_;\n  if (throttle &&\n      xhr.getReadyState() == goog.net.XmlHttp.ReadyState.INTERACTIVE) {\n    // Only throttle in the partial data case.\n    this.channelDebug_.debug('Throttling readystatechange.');\n    throttle.fire();\n  } else {\n    // If we haven't throttled, just handle response directly.\n    this.xmlHttpHandler_(xhr);\n  }\n};\n\n\n/**\n * XmlHttp handler\n * @param {goog.net.XhrIo} xmlhttp The XhrIo object for the current request.\n * @private\n */\ngoog.net.ChannelRequest.prototype.xmlHttpHandler_ = function(xmlhttp) {\n  /** @suppress {missingRequire} */\n  goog.net.BrowserChannel.onStartExecution();\n\n\n  try {\n    if (xmlhttp == this.xmlHttp_) {\n      this.onXmlHttpReadyStateChanged_();\n    } else {\n      this.channelDebug_.warning(\n          'Called back with an ' +\n          'unexpected xmlhttp');\n    }\n  } catch (ex) {\n    this.channelDebug_.debug('Failed call to OnXmlHttpReadyStateChanged_');\n    if (this.xmlHttp_ && this.xmlHttp_.getResponseText()) {\n      this.channelDebug_.dumpException(\n          ex, 'ResponseText: ' + this.xmlHttp_.getResponseText());\n    } else {\n      this.channelDebug_.dumpException(ex, 'No response text');\n    }\n  } finally {\n    /** @suppress {missingRequire} */\n    goog.net.BrowserChannel.onEndExecution();\n  }\n};\n\n\n/**\n * Called by the readystate handler for XMLHTTP requests.\n *\n * @private\n */\ngoog.net.ChannelRequest.prototype.onXmlHttpReadyStateChanged_ = function() {\n  var readyState = this.xmlHttp_.getReadyState();\n  var errorCode = this.xmlHttp_.getLastErrorCode();\n  var statusCode = this.xmlHttp_.getStatus();\n  // If it is Safari less than 420+, there is a bug that causes null to be\n  // in the responseText on ready state interactive so we must wait for\n  // ready state complete.\n  if (!goog.net.ChannelRequest.supportsXhrStreaming() ||\n      (goog.userAgent.WEBKIT &&\n       !goog.userAgent.isVersionOrHigher(\n           goog.net.ChannelRequest.MIN_WEBKIT_FOR_INTERACTIVE_))) {\n    if (readyState < goog.net.XmlHttp.ReadyState.COMPLETE) {\n      // not yet ready\n      return;\n    }\n  } else {\n    // we get partial results in browsers that support ready state interactive.\n    // We also make sure that getResponseText is not null in interactive mode\n    // before we continue.  However, we don't do it in Opera because it only\n    // fire readyState == INTERACTIVE once.  We need the following code to poll\n    if (readyState < goog.net.XmlHttp.ReadyState.INTERACTIVE ||\n        readyState == goog.net.XmlHttp.ReadyState.INTERACTIVE &&\n            !goog.userAgent.OPERA && !this.xmlHttp_.getResponseText()) {\n      // not yet ready\n      return;\n    }\n  }\n\n  // Dispatch any appropriate network events.\n  if (!this.cancelled_ && readyState == goog.net.XmlHttp.ReadyState.COMPLETE &&\n      errorCode != goog.net.ErrorCode.ABORT) {\n    // Pretty conservative, these are the only known scenarios which we'd\n    // consider indicative of a truly non-functional network connection.\n    if (errorCode == goog.net.ErrorCode.TIMEOUT || statusCode <= 0) {\n      this.channel_.notifyServerReachabilityEvent(\n          /** @suppress {missingRequire} */\n          goog.net.BrowserChannel.ServerReachability.REQUEST_FAILED);\n    } else {\n      this.channel_.notifyServerReachabilityEvent(\n          /** @suppress {missingRequire} */\n          goog.net.BrowserChannel.ServerReachability.REQUEST_SUCCEEDED);\n    }\n  }\n\n  // got some data so cancel the watchdog timer\n  this.cancelWatchDogTimer_();\n\n  var status = this.xmlHttp_.getStatus();\n  this.lastStatusCode_ = status;\n  var responseText = this.xmlHttp_.getResponseText();\n  if (!responseText) {\n    this.channelDebug_.debug(\n        'No response text for uri ' + this.requestUri_ + ' status ' + status);\n  }\n  this.successful_ = (status == 200);\n\n  this.channelDebug_.xmlHttpChannelResponseMetaData(\n      /** @type {string} */ (this.verb_), this.requestUri_, this.rid_,\n      this.retryId_, readyState, status);\n\n  if (!this.successful_) {\n    if (status == 400 && responseText.indexOf('Unknown SID') > 0) {\n      // the server error string will include 'Unknown SID' which indicates the\n      // server doesn't know about the session (maybe it got restarted, maybe\n      // the user got moved to another server, etc.,). Handlers can special\n      // case this error\n      this.lastError_ = goog.net.ChannelRequest.Error.UNKNOWN_SESSION_ID;\n      /** @suppress {missingRequire} */\n      goog.net.BrowserChannel.notifyStatEvent(\n          /** @suppress {missingRequire} */\n          goog.net.BrowserChannel.Stat.REQUEST_UNKNOWN_SESSION_ID);\n      this.channelDebug_.warning('XMLHTTP Unknown SID (' + this.rid_ + ')');\n    } else {\n      this.lastError_ = goog.net.ChannelRequest.Error.STATUS;\n      /** @suppress {missingRequire} */\n      goog.net.BrowserChannel.notifyStatEvent(\n          /** @suppress {missingRequire} */\n          goog.net.BrowserChannel.Stat.REQUEST_BAD_STATUS);\n      this.channelDebug_.warning(\n          'XMLHTTP Bad status ' + status + ' (' + this.rid_ + ')');\n    }\n    this.cleanup_();\n    this.dispatchFailure_();\n    return;\n  }\n\n  if (readyState == goog.net.XmlHttp.ReadyState.COMPLETE) {\n    this.cleanup_();\n  }\n\n  if (this.decodeChunks_) {\n    this.decodeNextChunks_(readyState, responseText);\n    if (goog.userAgent.OPERA && this.successful_ &&\n        readyState == goog.net.XmlHttp.ReadyState.INTERACTIVE) {\n      this.startPolling_();\n    }\n  } else {\n    this.channelDebug_.xmlHttpChannelResponseText(\n        this.rid_, responseText, null);\n    this.safeOnRequestData_(responseText);\n  }\n\n  if (!this.successful_) {\n    return;\n  }\n\n  if (!this.cancelled_) {\n    if (readyState == goog.net.XmlHttp.ReadyState.COMPLETE) {\n      this.channel_.onRequestComplete(this);\n    } else {\n      // The default is false, the result from this callback shouldn't carry\n      // over to the next callback, otherwise the request looks successful if\n      // the watchdog timer gets called\n      this.successful_ = false;\n      this.ensureWatchDogTimer_();\n    }\n  }\n};\n\n\n/**\n * Decodes the next set of available chunks in the response.\n * @param {number} readyState The value of readyState.\n * @param {string} responseText The value of responseText.\n * @private\n */\ngoog.net.ChannelRequest.prototype.decodeNextChunks_ = function(\n    readyState, responseText) {\n  var decodeNextChunksSuccessful = true;\n  while (!this.cancelled_ && this.xmlHttpChunkStart_ < responseText.length) {\n    var chunkText = this.getNextChunk_(responseText);\n    if (chunkText == goog.net.ChannelRequest.INCOMPLETE_CHUNK_) {\n      if (readyState == goog.net.XmlHttp.ReadyState.COMPLETE) {\n        // should have consumed entire response when the request is done\n        this.lastError_ = goog.net.ChannelRequest.Error.BAD_DATA;\n        /** @suppress {missingRequire} */\n        goog.net.BrowserChannel.notifyStatEvent(\n            /** @suppress {missingRequire} */\n            goog.net.BrowserChannel.Stat.REQUEST_INCOMPLETE_DATA);\n        decodeNextChunksSuccessful = false;\n      }\n      this.channelDebug_.xmlHttpChannelResponseText(\n          this.rid_, null, '[Incomplete Response]');\n      break;\n    } else if (chunkText == goog.net.ChannelRequest.INVALID_CHUNK_) {\n      this.lastError_ = goog.net.ChannelRequest.Error.BAD_DATA;\n      /** @suppress {missingRequire} */\n      goog.net.BrowserChannel.notifyStatEvent(\n          /** @suppress {missingRequire} */\n          goog.net.BrowserChannel.Stat.REQUEST_BAD_DATA);\n      this.channelDebug_.xmlHttpChannelResponseText(\n          this.rid_, responseText, '[Invalid Chunk]');\n      decodeNextChunksSuccessful = false;\n      break;\n    } else {\n      this.channelDebug_.xmlHttpChannelResponseText(\n          this.rid_, /** @type {string} */ (chunkText), null);\n      this.safeOnRequestData_(/** @type {string} */ (chunkText));\n    }\n  }\n  if (readyState == goog.net.XmlHttp.ReadyState.COMPLETE &&\n      responseText.length == 0) {\n    // also an error if we didn't get any response\n    this.lastError_ = goog.net.ChannelRequest.Error.NO_DATA;\n    /** @suppress {missingRequire} */\n    goog.net.BrowserChannel.notifyStatEvent(\n        /** @suppress {missingRequire} */\n        goog.net.BrowserChannel.Stat.REQUEST_NO_DATA);\n    decodeNextChunksSuccessful = false;\n  }\n  this.successful_ = this.successful_ && decodeNextChunksSuccessful;\n  if (!decodeNextChunksSuccessful) {\n    // malformed response - we make this trigger retry logic\n    this.channelDebug_.xmlHttpChannelResponseText(\n        this.rid_, responseText, '[Invalid Chunked Response]');\n    this.cleanup_();\n    this.dispatchFailure_();\n  }\n};\n\n\n/**\n * Polls the response for new data.\n * @private\n */\ngoog.net.ChannelRequest.prototype.pollResponse_ = function() {\n  var readyState = this.xmlHttp_.getReadyState();\n  var responseText = this.xmlHttp_.getResponseText();\n  if (this.xmlHttpChunkStart_ < responseText.length) {\n    this.cancelWatchDogTimer_();\n    this.decodeNextChunks_(readyState, responseText);\n    if (this.successful_ &&\n        readyState != goog.net.XmlHttp.ReadyState.COMPLETE) {\n      this.ensureWatchDogTimer_();\n    }\n  }\n};\n\n\n/**\n * Starts a polling interval for changes to responseText of the\n * XMLHttpRequest, for browsers that don't fire onreadystatechange\n * as data comes in incrementally.  This timer is disabled in\n * cleanup_().\n * @private\n */\ngoog.net.ChannelRequest.prototype.startPolling_ = function() {\n  this.eventHandler_.listen(\n      this.pollingTimer_, goog.Timer.TICK, this.pollResponse_);\n  this.pollingTimer_.start();\n};\n\n\n/**\n * Returns the next chunk of a chunk-encoded response. This is not standard\n * HTTP chunked encoding because browsers don't expose the chunk boundaries to\n * the application through XMLHTTP. So we have an additional chunk encoding at\n * the application level that lets us tell where the beginning and end of\n * individual responses are so that we can only try to eval a complete JS array.\n *\n * The encoding is the size of the chunk encoded as a decimal string followed\n * by a newline followed by the data.\n *\n * @param {string} responseText The response text from the XMLHTTP response.\n * @return {string|Object} The next chunk string or a sentinel object\n *                         indicating a special condition.\n * @private\n */\ngoog.net.ChannelRequest.prototype.getNextChunk_ = function(responseText) {\n  var sizeStartIndex = this.xmlHttpChunkStart_;\n  var sizeEndIndex = responseText.indexOf('\\n', sizeStartIndex);\n  if (sizeEndIndex == -1) {\n    return goog.net.ChannelRequest.INCOMPLETE_CHUNK_;\n  }\n\n  var sizeAsString = responseText.substring(sizeStartIndex, sizeEndIndex);\n  var size = Number(sizeAsString);\n  if (isNaN(size)) {\n    return goog.net.ChannelRequest.INVALID_CHUNK_;\n  }\n\n  var chunkStartIndex = sizeEndIndex + 1;\n  if (chunkStartIndex + size > responseText.length) {\n    return goog.net.ChannelRequest.INCOMPLETE_CHUNK_;\n  }\n\n  var chunkText = responseText.substr(chunkStartIndex, size);\n  this.xmlHttpChunkStart_ = chunkStartIndex + size;\n  return chunkText;\n};\n\n\n/**\n * Uses the Trident htmlfile ActiveX control to send a GET request in IE. This\n * is the innovation discovered that lets us get intermediate results in\n * Internet Explorer.  Thanks to http://go/kev\n * @param {goog.Uri} uri The uri to request from.\n * @param {boolean} usingSecondaryDomain Whether to use a secondary domain.\n */\ngoog.net.ChannelRequest.prototype.tridentGet = function(\n    uri, usingSecondaryDomain) {\n  this.type_ = goog.net.ChannelRequest.Type_.TRIDENT;\n  this.baseUri_ = uri.clone().makeUnique();\n  this.tridentGet_(usingSecondaryDomain);\n};\n\n\n/**\n * Starts the Trident request.\n * @param {boolean} usingSecondaryDomain Whether to use a secondary domain.\n * @private\n */\ngoog.net.ChannelRequest.prototype.tridentGet_ = function(usingSecondaryDomain) {\n  this.requestStartTime_ = goog.now();\n  this.ensureWatchDogTimer_();\n\n  var hostname = usingSecondaryDomain ? window.location.hostname : '';\n  this.requestUri_ = this.baseUri_.clone();\n  this.requestUri_.setParameterValue('DOMAIN', hostname);\n  this.requestUri_.setParameterValue('t', this.retryId_);\n\n  try {\n    this.trident_ = new ActiveXObject('htmlfile');\n  } catch (e) {\n    this.channelDebug_.severe('ActiveX blocked');\n    this.cleanup_();\n\n    this.lastError_ = goog.net.ChannelRequest.Error.ACTIVE_X_BLOCKED;\n    /** @suppress {missingRequire} */\n    goog.net.BrowserChannel.notifyStatEvent(\n        /** @suppress {missingRequire} */\n        goog.net.BrowserChannel.Stat.ACTIVE_X_BLOCKED);\n    this.dispatchFailure_();\n    return;\n  }\n\n  // Using goog.html.SafeHtml.create() might be viable here but since\n  // this code is now superseded by\n  // closure/labs/net/webchannel/channelrequest.js it's not worth risking\n  // the performance regressions and bugs that might result. Instead we\n  // do an unchecked conversion. Please be extra careful if modifying\n  // the HTML construction in this code, it's brittle and so it's easy to make\n  // mistakes.\n\n  var body = '<html><body>';\n  if (usingSecondaryDomain) {\n    var escapedHostname =\n        goog.net.ChannelRequest.escapeForStringInScript_(hostname);\n    body += '<script>document.domain=\"' + escapedHostname + '\"</scr' +\n        'ipt>';\n  }\n  body += '</body></html>';\n  var bodyHtml = goog.html.uncheckedconversions\n                     .safeHtmlFromStringKnownToSatisfyTypeContract(\n                         goog.string.Const.from('b/12014412'), body);\n\n  this.trident_.open();\n  goog.dom.safe.documentWrite(\n      /** @type {!Document} */ (this.trident_), bodyHtml);\n  this.trident_.close();\n\n  this.trident_.parentWindow['m'] = goog.bind(this.onTridentRpcMessage_, this);\n  this.trident_.parentWindow['d'] = goog.bind(this.onTridentDone_, this, true);\n  this.trident_.parentWindow['rpcClose'] =\n      goog.bind(this.onTridentDone_, this, false);\n\n  var div = this.trident_.createElement(String(goog.dom.TagName.DIV));\n  this.trident_.parentWindow.document.body.appendChild(div);\n\n  var safeUrl = goog.html.SafeUrl.sanitize(this.requestUri_.toString());\n  var sanitizedEscapedUrl =\n      goog.string.htmlEscape(goog.html.SafeUrl.unwrap(safeUrl));\n  var iframeHtml =\n      goog.html.uncheckedconversions\n          .safeHtmlFromStringKnownToSatisfyTypeContract(\n              goog.string.Const.from('b/12014412'),\n              '<iframe src=\"' + sanitizedEscapedUrl + '\"></iframe>');\n  goog.dom.safe.setInnerHtml(div, iframeHtml);\n\n  this.channelDebug_.tridentChannelRequest(\n      'GET', this.requestUri_, this.rid_, this.retryId_);\n  this.channel_.notifyServerReachabilityEvent(\n      /** @suppress {missingRequire} */\n      goog.net.BrowserChannel.ServerReachability.REQUEST_MADE);\n};\n\n\n/**\n * JavaScript-escapes a string so that it can be included inside a JS string.\n * Since the JS string is expected to be inside a <script>, HTML-escaping\n * cannot be used and thus '<' and '>' are also JS-escaped.\n * @param {string} string\n * @return {string}\n * @private\n */\ngoog.net.ChannelRequest.escapeForStringInScript_ = function(string) {\n  var escaped = '';\n  for (var i = 0; i < string.length; i++) {\n    var c = string.charAt(i);\n    if (c == '<') {\n      escaped += '\\\\x3c';\n    } else if (c == '>') {\n      escaped += '\\\\x3e';\n    } else {\n      // This will escape both \" and '.\n      escaped += goog.string.escapeChar(c);\n    }\n  }\n  return escaped;\n};\n\n\n/**\n * Callback from the Trident htmlfile ActiveX control for when a new message\n * is received.\n *\n * @param {string} msg The data payload.\n * @private\n */\ngoog.net.ChannelRequest.prototype.onTridentRpcMessage_ = function(msg) {\n  // need to do async b/c this gets called off of the context of the ActiveX\n  /** @suppress {missingRequire} */\n  goog.net.BrowserChannel.setTimeout(\n      goog.bind(this.onTridentRpcMessageAsync_, this, msg), 0);\n};\n\n\n/**\n * Callback from the Trident htmlfile ActiveX control for when a new message\n * is received.\n *\n * @param {string} msg  The data payload.\n * @private\n */\ngoog.net.ChannelRequest.prototype.onTridentRpcMessageAsync_ = function(msg) {\n  if (this.cancelled_) {\n    return;\n  }\n  this.channelDebug_.tridentChannelResponseText(this.rid_, msg);\n  this.cancelWatchDogTimer_();\n  this.safeOnRequestData_(msg);\n  this.ensureWatchDogTimer_();\n};\n\n\n/**\n * Callback from the Trident htmlfile ActiveX control for when the request\n * is complete\n *\n * @param {boolean} successful Whether the request successfully completed.\n * @private\n */\ngoog.net.ChannelRequest.prototype.onTridentDone_ = function(successful) {\n  // need to do async b/c this gets called off of the context of the ActiveX\n  /** @suppress {missingRequire} */\n  goog.net.BrowserChannel.setTimeout(\n      goog.bind(this.onTridentDoneAsync_, this, successful), 0);\n};\n\n\n/**\n * Callback from the Trident htmlfile ActiveX control for when the request\n * is complete\n *\n * @param {boolean} successful Whether the request successfully completed.\n * @private\n */\ngoog.net.ChannelRequest.prototype.onTridentDoneAsync_ = function(successful) {\n  if (this.cancelled_) {\n    return;\n  }\n  this.channelDebug_.tridentChannelResponseDone(this.rid_, successful);\n  this.cleanup_();\n  this.successful_ = successful;\n  this.channel_.onRequestComplete(this);\n  this.channel_.notifyServerReachabilityEvent(\n      /** @suppress {missingRequire} */\n      goog.net.BrowserChannel.ServerReachability.BACK_CHANNEL_ACTIVITY);\n};\n\n\n/**\n * Uses an IMG tag to send an HTTP get to the server. This is only currently\n * used to terminate the connection, as an IMG tag is the most reliable way to\n * send something to the server while the page is getting torn down.\n * @param {goog.Uri} uri The uri to send a request to.\n */\ngoog.net.ChannelRequest.prototype.sendUsingImgTag = function(uri) {\n  this.type_ = goog.net.ChannelRequest.Type_.IMG;\n  this.baseUri_ = uri.clone().makeUnique();\n  this.imgTagGet_();\n};\n\n\n/**\n * Starts the IMG request.\n *\n * @private\n */\ngoog.net.ChannelRequest.prototype.imgTagGet_ = function() {\n  goog.dom.safe.setImageSrc(new Image(), this.baseUri_.toString());\n  this.requestStartTime_ = goog.now();\n  this.ensureWatchDogTimer_();\n};\n\n\n/**\n * Cancels the request no matter what the underlying transport is.\n */\ngoog.net.ChannelRequest.prototype.cancel = function() {\n  this.cancelled_ = true;\n  this.cleanup_();\n};\n\n\n/**\n * Ensures that there is watchdog timeout which is used to ensure that\n * the connection completes in time.\n *\n * @private\n */\ngoog.net.ChannelRequest.prototype.ensureWatchDogTimer_ = function() {\n  this.watchDogTimeoutTime_ = goog.now() + this.timeout_;\n  this.startWatchDogTimer_(this.timeout_);\n};\n\n\n/**\n * Starts the watchdog timer which is used to ensure that the connection\n * completes in time.\n * @param {number} time The number of milliseconds to wait.\n * @private\n * @suppress {missingRequire} goog.net.BrowserChannel\n */\ngoog.net.ChannelRequest.prototype.startWatchDogTimer_ = function(time) {\n  if (this.watchDogTimerId_ != null) {\n    // assertion\n    throw new Error('WatchDog timer not null');\n  }\n  /** @private @suppress {missingRequire} Circular dep. */\n  this.watchDogTimerId_ = goog.net.BrowserChannel.setTimeout(\n      goog.bind(this.onWatchDogTimeout_, this), time);\n};\n\n\n/**\n * Cancels the watchdog timer if it has been started.\n *\n * @private\n */\ngoog.net.ChannelRequest.prototype.cancelWatchDogTimer_ = function() {\n  if (this.watchDogTimerId_) {\n    goog.global.clearTimeout(this.watchDogTimerId_);\n    this.watchDogTimerId_ = null;\n  }\n};\n\n\n/**\n * Called when the watchdog timer is triggered. It also handles a case where it\n * is called too early which we suspect may be happening sometimes\n * (not sure why)\n *\n * @private\n */\ngoog.net.ChannelRequest.prototype.onWatchDogTimeout_ = function() {\n  this.watchDogTimerId_ = null;\n  var now = goog.now();\n  if (now - this.watchDogTimeoutTime_ >= 0) {\n    this.handleTimeout_();\n  } else {\n    // got called too early for some reason\n    this.channelDebug_.warning('WatchDog timer called too early');\n    this.startWatchDogTimer_(this.watchDogTimeoutTime_ - now);\n  }\n};\n\n\n/**\n * Called when the request has actually timed out. Will cleanup and notify the\n * channel of the failure.\n *\n * @private\n */\ngoog.net.ChannelRequest.prototype.handleTimeout_ = function() {\n  if (this.successful_) {\n    // Should never happen.\n    this.channelDebug_.severe(\n        'Received watchdog timeout even though request loaded successfully');\n  }\n\n  this.channelDebug_.timeoutResponse(this.requestUri_);\n  // IMG requests never notice if they were successful, and always 'time out'.\n  // This fact says nothing about reachability.\n  if (this.type_ != goog.net.ChannelRequest.Type_.IMG) {\n    this.channel_.notifyServerReachabilityEvent(\n        /** @suppress {missingRequire} */\n        goog.net.BrowserChannel.ServerReachability.REQUEST_FAILED);\n  }\n  this.cleanup_();\n\n  // set error and dispatch failure\n  this.lastError_ = goog.net.ChannelRequest.Error.TIMEOUT;\n  /** @suppress {missingRequire} */\n  goog.net.BrowserChannel.notifyStatEvent(\n      /** @suppress {missingRequire} */\n      goog.net.BrowserChannel.Stat.REQUEST_TIMEOUT);\n  this.dispatchFailure_();\n};\n\n\n/**\n * Notifies the channel that this request failed.\n * @private\n */\ngoog.net.ChannelRequest.prototype.dispatchFailure_ = function() {\n  if (this.channel_.isClosed() || this.cancelled_) {\n    return;\n  }\n\n  this.channel_.onRequestComplete(this);\n};\n\n\n/**\n * Cleans up the objects used to make the request. This function is\n * idempotent.\n *\n * @private\n */\ngoog.net.ChannelRequest.prototype.cleanup_ = function() {\n  this.cancelWatchDogTimer_();\n\n  goog.dispose(this.readyStateChangeThrottle_);\n  this.readyStateChangeThrottle_ = null;\n\n  // Stop the polling timer, if necessary.\n  this.pollingTimer_.stop();\n\n  // Unhook all event handlers.\n  this.eventHandler_.removeAll();\n\n  if (this.xmlHttp_) {\n    // clear out this.xmlHttp_ before aborting so we handle getting reentered\n    // inside abort\n    var xmlhttp = this.xmlHttp_;\n    this.xmlHttp_ = null;\n    xmlhttp.abort();\n    xmlhttp.dispose();\n  }\n\n  if (this.trident_) {\n    this.trident_ = null;\n  }\n};\n\n\n/**\n * Indicates whether the request was successful. Only valid after the handler\n * is called to indicate completion of the request.\n *\n * @return {boolean} True if the request succeeded.\n */\ngoog.net.ChannelRequest.prototype.getSuccess = function() {\n  return this.successful_;\n};\n\n\n/**\n * If the request was not successful, returns the reason.\n *\n * @return {?goog.net.ChannelRequest.Error}  The last error.\n */\ngoog.net.ChannelRequest.prototype.getLastError = function() {\n  return this.lastError_;\n};\n\n\n/**\n * Returns the status code of the last request.\n * @return {number} The status code of the last request.\n */\ngoog.net.ChannelRequest.prototype.getLastStatusCode = function() {\n  return this.lastStatusCode_;\n};\n\n\n/**\n * Returns the session id for this channel.\n *\n * @return {string|undefined} The session ID.\n */\ngoog.net.ChannelRequest.prototype.getSessionId = function() {\n  return this.sid_;\n};\n\n\n/**\n * Returns the request id for this request. Each request has a unique request\n * id and the request IDs are a sequential increasing count.\n *\n * @return {string|number|undefined} The request ID.\n */\ngoog.net.ChannelRequest.prototype.getRequestId = function() {\n  return this.rid_;\n};\n\n\n/**\n * Returns the data for a post, if this request is a post.\n *\n * @return {?string} The POST data provided by the request initiator.\n */\ngoog.net.ChannelRequest.prototype.getPostData = function() {\n  return this.postData_;\n};\n\n\n/**\n * Returns the time that the request started, if it has started.\n *\n * @return {?number} The time the request started, as returned by goog.now().\n */\ngoog.net.ChannelRequest.prototype.getRequestStartTime = function() {\n  return this.requestStartTime_;\n};\n\n\n/**\n * Helper to call the callback's onRequestData, which catches any\n * exception and cleans up the request.\n * @param {string} data The request data.\n * @private\n */\ngoog.net.ChannelRequest.prototype.safeOnRequestData_ = function(data) {\n\n  try {\n    this.channel_.onRequestData(this, data);\n    /** @suppress {missingRequire} goog.net.BrowserChannel */\n    this.channel_.notifyServerReachabilityEvent(\n        goog.net.BrowserChannel.ServerReachability.BACK_CHANNEL_ACTIVITY);\n  } catch (e) {\n    // Dump debug info, but keep going without closing the channel.\n    this.channelDebug_.dumpException(e, 'Error in httprequest callback');\n  }\n};\n","^;",1579837703000,"^<",["^=",["^1T","^3O","^4D","~$goog.async.Throttle","^2L","^?","^42","^4H","^[","^3Q","^19","^1E","~$goog.net.XmlHttp","^8=","^12"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/channelrequest.js"],"^O",["^=",["~$goog.net.ChannelRequest","~$goog.net.ChannelRequest.Error"]],"^W",true,"^X",["^?","^3O","^DY","^12","^1E","^1T","^4D","^4H","^8=","^19","^DZ","^42","^2L","^3Q","^["]],["^ ","^3",[1579837703000],"^4","goog.editor.plugins.abstractdialogplugin.js","^5",["^6","goog/editor/plugins/abstractdialogplugin.js"],"^7","goog/editor/plugins/abstractdialogplugin.js","^8","^9","^:","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An abstract superclass for TrogEdit dialog plugins. Each\n * Trogedit dialog has its own plugin.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.provide('goog.editor.plugins.AbstractDialogPlugin');\ngoog.provide('goog.editor.plugins.AbstractDialogPlugin.EventType');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.Range');\ngoog.require('goog.editor.Field');\ngoog.require('goog.editor.Plugin');\ngoog.require('goog.editor.range');\ngoog.require('goog.events');\ngoog.require('goog.ui.editor.AbstractDialog');\n\n\n// *** Public interface ***************************************************** //\n\n\n\n/**\n * An abstract superclass for a Trogedit plugin that creates exactly one\n * dialog. By default dialogs are not reused -- each time execCommand is called,\n * a new instance of the dialog object is created (and the old one disposed of).\n * To enable reusing of the dialog object, subclasses should call\n * setReuseDialog() after calling the superclass constructor.\n * @param {string} command The command that this plugin handles.\n * @constructor\n * @extends {goog.editor.Plugin}\n */\ngoog.editor.plugins.AbstractDialogPlugin = function(command) {\n  goog.editor.plugins.AbstractDialogPlugin.base(this, 'constructor');\n\n  /**\n   * The command that this plugin handles.\n   * @private {string}\n   */\n  this.command_ = command;\n\n  /** @private {function()} */\n  this.restoreScrollPosition_ = function() {};\n\n  /**\n   * The current dialog that was created and opened by this plugin.\n   * @private {?goog.ui.editor.AbstractDialog}\n   */\n  this.dialog_ = null;\n\n  /**\n   * Whether this plugin should reuse the same instance of the dialog each time\n   * execCommand is called or create a new one.\n   * @private {boolean}\n   */\n  this.reuseDialog_ = false;\n\n  /**\n   * Mutex to prevent recursive calls to disposeDialog_.\n   * @private {boolean}\n   */\n  this.isDisposingDialog_ = false;\n\n  /**\n   * SavedRange representing the selection before the dialog was opened.\n   * @private {?goog.dom.SavedRange}\n   */\n  this.savedRange_ = null;\n};\ngoog.inherits(goog.editor.plugins.AbstractDialogPlugin, goog.editor.Plugin);\n\n\n/** @override */\ngoog.editor.plugins.AbstractDialogPlugin.prototype.isSupportedCommand =\n    function(command) {\n  return command == this.command_;\n};\n\n\n/**\n * Handles execCommand. Dialog plugins don't make any changes when they open a\n * dialog, just when the dialog closes (because only modal dialogs are\n * supported). Hence this method does not dispatch the change events that the\n * superclass method does.\n * @param {string} command The command to execute.\n * @param {...*} var_args Any additional parameters needed to\n *     execute the command.\n * @return {*} The result of the execCommand, if any.\n * @override\n */\ngoog.editor.plugins.AbstractDialogPlugin.prototype.execCommand = function(\n    command, var_args) {\n  return this.execCommandInternal.apply(this, arguments);\n};\n\n\n// *** Events *************************************************************** //\n\n\n/**\n * Event type constants for events the dialog plugins fire.\n * @enum {string}\n */\ngoog.editor.plugins.AbstractDialogPlugin.EventType = {\n  // This event is fired when a dialog has been opened.\n  OPENED: 'dialogOpened',\n  // This event is fired when a dialog has been closed.\n  CLOSED: 'dialogClosed'\n};\n\n\n// *** Protected interface ************************************************** //\n\n\n/**\n * Creates a new instance of this plugin's dialog. Must be overridden by\n * subclasses.\n * Implementations should expect that the editor is inactive and cannot be\n * focused, nor will its caret position (or selection) be determinable until\n * after the dialogs goog.ui.PopupBase.EventType.HIDE event has been handled.\n * @param {!goog.dom.DomHelper} dialogDomHelper The dom helper to be used to\n *     create the dialog.\n * @param {*=} opt_arg The dialog specific argument. Concrete subclasses should\n *     declare a specific type.\n * @return {goog.ui.editor.AbstractDialog} The newly created dialog.\n * @protected\n */\ngoog.editor.plugins.AbstractDialogPlugin.prototype.createDialog =\n    goog.abstractMethod;\n\n\n/**\n * Returns the current dialog that was created and opened by this plugin.\n * @return {goog.ui.editor.AbstractDialog} The current dialog that was created\n *     and opened by this plugin.\n * @protected\n */\ngoog.editor.plugins.AbstractDialogPlugin.prototype.getDialog = function() {\n  return this.dialog_;\n};\n\n\n/**\n * Sets whether this plugin should reuse the same instance of the dialog each\n * time execCommand is called or create a new one. This is intended for use by\n * subclasses only, hence protected.\n * @param {boolean} reuse Whether to reuse the dialog.\n * @protected\n */\ngoog.editor.plugins.AbstractDialogPlugin.prototype.setReuseDialog = function(\n    reuse) {\n  this.reuseDialog_ = reuse;\n};\n\n\n/**\n * Handles execCommand by opening the dialog. Dispatches\n * {@link goog.editor.plugins.AbstractDialogPlugin.EventType.OPENED} after the\n * dialog is shown.\n * @param {string} command The command to execute.\n * @param {*=} opt_arg The dialog specific argument. Should be the same as\n *     {@link createDialog}.\n * @return {*} Always returns true, indicating the dialog was shown.\n * @protected\n * @override\n */\ngoog.editor.plugins.AbstractDialogPlugin.prototype.execCommandInternal =\n    function(command, opt_arg) {\n  // If this plugin should not reuse dialog instances, first dispose of the\n  // previous dialog.\n  if (!this.reuseDialog_) {\n    this.disposeDialog_();\n  }\n  // If there is no dialog yet (or we aren't reusing the previous one), create\n  // one.\n  if (!this.dialog_) {\n    this.dialog_ = this.createDialog(\n        // TODO(user): Add Field.getAppDomHelper. (Note dom helper will\n        // need to be updated if setAppWindow is called by clients.)\n        goog.dom.getDomHelper(this.getFieldObject().getAppWindow()), opt_arg);\n  }\n\n  // Since we're opening a dialog, we need to clear the selection because the\n  // focus will be going to the dialog, and if we leave an selection in the\n  // editor while another selection is active in the dialog as the user is\n  // typing, some browsers will screw up the original selection. But first we\n  // save it so we can restore it when the dialog closes.\n  // getRange may return null if there is no selection in the field.\n  var tempRange = this.getFieldObject().getRange();\n  // saveUsingDom() did not work as well as saveUsingNormalizedCarets(),\n  // not sure why.\n\n  this.restoreScrollPosition_ = this.saveScrollPosition();\n  this.savedRange_ =\n      tempRange && goog.editor.range.saveUsingNormalizedCarets(tempRange);\n  goog.dom.Range.clearSelection(\n      this.getFieldObject().getEditableDomHelper().getWindow());\n\n  // Listen for the dialog closing so we can clean up.\n  goog.events.listenOnce(\n      this.dialog_, goog.ui.editor.AbstractDialog.EventType.AFTER_HIDE,\n      this.handleAfterHide, false, this);\n\n  this.getFieldObject().setModalMode(true);\n  this.dialog_.show();\n  this.dispatchEvent(goog.editor.plugins.AbstractDialogPlugin.EventType.OPENED);\n\n  // Since the selection has left the document, dispatch a selection\n  // change event.\n  this.getFieldObject().dispatchSelectionChangeEvent();\n\n  return true;\n};\n\n\n/**\n * Cleans up after the dialog has closed, including restoring the selection to\n * what it was before the dialog was opened. If a subclass modifies the editable\n * field's content such that the original selection is no longer valid (usually\n * the case when the user clicks OK, and sometimes also on Cancel), it is that\n * subclass' responsibility to place the selection in the desired place during\n * the OK or Cancel (or other) handler. In that case, this method will leave the\n * selection in place.\n * @param {goog.events.Event} e The AFTER_HIDE event object.\n * @protected\n */\ngoog.editor.plugins.AbstractDialogPlugin.prototype.handleAfterHide = function(\n    e) {\n  this.getFieldObject().setModalMode(false);\n  this.restoreOriginalSelection();\n  this.restoreScrollPosition_();\n\n  if (!this.reuseDialog_) {\n    this.disposeDialog_();\n  }\n\n  this.dispatchEvent(goog.editor.plugins.AbstractDialogPlugin.EventType.CLOSED);\n\n  // Since the selection has returned to the document, dispatch a selection\n  // change event.\n  this.getFieldObject().dispatchSelectionChangeEvent();\n\n  // When the dialog closes due to pressing enter or escape, that happens on the\n  // keydown event. But the browser will still fire a keyup event after that,\n  // which is caught by the editable field and causes it to try to fire a\n  // selection change event. To avoid that, we \"debounce\" the selection change\n  // event, meaning the editable field will not fire that event if the keyup\n  // that caused it immediately after this dialog was hidden (\"immediately\"\n  // means a small number of milliseconds defined by the editable field).\n  this.getFieldObject().debounceEvent(\n      goog.editor.Field.EventType.SELECTIONCHANGE);\n};\n\n\n/**\n * Restores the selection in the editable field to what it was before the dialog\n * was opened. This is not guaranteed to work if the contents of the field\n * have changed.\n * @protected\n */\ngoog.editor.plugins.AbstractDialogPlugin.prototype.restoreOriginalSelection =\n    function() {\n  this.getFieldObject().restoreSavedRange(this.savedRange_);\n  this.savedRange_ = null;\n};\n\n\n/**\n * Cleans up the structure used to save the original selection before the dialog\n * was opened. Should be used by subclasses that don't restore the original\n * selection via restoreOriginalSelection.\n * @protected\n */\ngoog.editor.plugins.AbstractDialogPlugin.prototype.disposeOriginalSelection =\n    function() {\n  if (this.savedRange_) {\n    this.savedRange_.dispose();\n    this.savedRange_ = null;\n  }\n};\n\n\n/** @override */\ngoog.editor.plugins.AbstractDialogPlugin.prototype.disposeInternal =\n    function() {\n  this.disposeDialog_();\n  goog.editor.plugins.AbstractDialogPlugin.base(this, 'disposeInternal');\n};\n\n\n// *** Private implementation *********************************************** //\n\n\n/**\n * Disposes of the dialog if needed. It is this abstract class' responsibility\n * to dispose of the dialog. The \"if needed\" refers to the fact this method\n * might be called twice (nested calls, not sequential) in the dispose flow, so\n * if the dialog was already disposed once it should not be disposed again.\n * @private\n */\ngoog.editor.plugins.AbstractDialogPlugin.prototype.disposeDialog_ = function() {\n  // Wrap disposing the dialog in a mutex. Otherwise disposing it would cause it\n  // to get hidden (if it is still open) and fire AFTER_HIDE, which in\n  // turn would cause the dialog to be disposed again (closure only flags an\n  // object as disposed after the dispose call chain completes, so it doesn't\n  // prevent recursive dispose calls).\n  if (this.dialog_ && !this.isDisposingDialog_) {\n    this.isDisposingDialog_ = true;\n    this.dialog_.dispose();\n    this.dialog_ = null;\n    this.isDisposingDialog_ = false;\n  }\n};\n","^;",1579837703000,"^<",["^=",["^1>","^Z","^?","^1A","^11","^6:","^1H","^1<"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/abstractdialogplugin.js"],"^O",["^=",["~$goog.editor.plugins.AbstractDialogPlugin.EventType","~$goog.editor.plugins.AbstractDialogPlugin"]],"^W",true,"^X",["^?","^1>","^1H","^1A","^11","^Z","^1<","^6:"]],["^ ","^3",[1579837703000],"^4","goog.i18n.numberformatsymbolsext.js","^5",["^6","goog/i18n/numberformatsymbolsext.js"],"^7","goog/i18n/numberformatsymbolsext.js","^8","^9","^:","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Number formatting symbols.\n *\n * File generated from CLDR ver. 35\n *\n * This file covers those locales that are not covered in\n * \"numberformatsymbols.js\".\n *\n * @suppress {const,missingRequire} Suppress \"missing require\" warnings for\n *     names like goog.i18n.NumberFormatSymbols_af. They are included\n *     by requiring goog.i18n.NumberFormatSymbols.\n */\n\n// clang-format off\n\ngoog.provide('goog.i18n.NumberFormatSymbolsExt');\ngoog.provide('goog.i18n.NumberFormatSymbols_af_NA');\ngoog.provide('goog.i18n.NumberFormatSymbols_af_ZA');\ngoog.provide('goog.i18n.NumberFormatSymbols_agq');\ngoog.provide('goog.i18n.NumberFormatSymbols_agq_CM');\ngoog.provide('goog.i18n.NumberFormatSymbols_ak');\ngoog.provide('goog.i18n.NumberFormatSymbols_ak_GH');\ngoog.provide('goog.i18n.NumberFormatSymbols_am_ET');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_001');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_AE');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_AE_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_BH');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_BH_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_DJ');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_DJ_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_EH');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_ER');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_ER_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_IL');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_IL_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_IQ');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_IQ_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_JO');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_JO_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_KM');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_KM_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_KW');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_KW_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_LB');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_LB_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_LY');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_MA');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_MR');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_MR_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_OM');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_OM_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_PS');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_PS_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_QA');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_QA_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_SA');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_SA_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_SD');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_SD_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_SO');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_SO_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_SS');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_SS_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_SY');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_SY_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_TD');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_TD_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_TN');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_XB');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_YE');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_YE_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_as');\ngoog.provide('goog.i18n.NumberFormatSymbols_as_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_as_IN_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_as_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_asa');\ngoog.provide('goog.i18n.NumberFormatSymbols_asa_TZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_ast');\ngoog.provide('goog.i18n.NumberFormatSymbols_ast_ES');\ngoog.provide('goog.i18n.NumberFormatSymbols_az_Cyrl');\ngoog.provide('goog.i18n.NumberFormatSymbols_az_Cyrl_AZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_az_Latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_az_Latn_AZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_bas');\ngoog.provide('goog.i18n.NumberFormatSymbols_bas_CM');\ngoog.provide('goog.i18n.NumberFormatSymbols_be_BY');\ngoog.provide('goog.i18n.NumberFormatSymbols_bem');\ngoog.provide('goog.i18n.NumberFormatSymbols_bem_ZM');\ngoog.provide('goog.i18n.NumberFormatSymbols_bez');\ngoog.provide('goog.i18n.NumberFormatSymbols_bez_TZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_bg_BG');\ngoog.provide('goog.i18n.NumberFormatSymbols_bm');\ngoog.provide('goog.i18n.NumberFormatSymbols_bm_ML');\ngoog.provide('goog.i18n.NumberFormatSymbols_bn_BD');\ngoog.provide('goog.i18n.NumberFormatSymbols_bn_BD_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_bn_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_bn_IN_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_bo');\ngoog.provide('goog.i18n.NumberFormatSymbols_bo_CN');\ngoog.provide('goog.i18n.NumberFormatSymbols_bo_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_br_FR');\ngoog.provide('goog.i18n.NumberFormatSymbols_brx');\ngoog.provide('goog.i18n.NumberFormatSymbols_brx_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_bs_Cyrl');\ngoog.provide('goog.i18n.NumberFormatSymbols_bs_Cyrl_BA');\ngoog.provide('goog.i18n.NumberFormatSymbols_bs_Latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_bs_Latn_BA');\ngoog.provide('goog.i18n.NumberFormatSymbols_ca_AD');\ngoog.provide('goog.i18n.NumberFormatSymbols_ca_ES');\ngoog.provide('goog.i18n.NumberFormatSymbols_ca_FR');\ngoog.provide('goog.i18n.NumberFormatSymbols_ca_IT');\ngoog.provide('goog.i18n.NumberFormatSymbols_ccp');\ngoog.provide('goog.i18n.NumberFormatSymbols_ccp_BD');\ngoog.provide('goog.i18n.NumberFormatSymbols_ccp_BD_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ccp_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_ccp_IN_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ccp_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ce');\ngoog.provide('goog.i18n.NumberFormatSymbols_ce_RU');\ngoog.provide('goog.i18n.NumberFormatSymbols_ceb');\ngoog.provide('goog.i18n.NumberFormatSymbols_ceb_PH');\ngoog.provide('goog.i18n.NumberFormatSymbols_cgg');\ngoog.provide('goog.i18n.NumberFormatSymbols_cgg_UG');\ngoog.provide('goog.i18n.NumberFormatSymbols_chr_US');\ngoog.provide('goog.i18n.NumberFormatSymbols_ckb');\ngoog.provide('goog.i18n.NumberFormatSymbols_ckb_IQ');\ngoog.provide('goog.i18n.NumberFormatSymbols_ckb_IQ_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ckb_IR');\ngoog.provide('goog.i18n.NumberFormatSymbols_ckb_IR_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ckb_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_cs_CZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_cy_GB');\ngoog.provide('goog.i18n.NumberFormatSymbols_da_DK');\ngoog.provide('goog.i18n.NumberFormatSymbols_da_GL');\ngoog.provide('goog.i18n.NumberFormatSymbols_dav');\ngoog.provide('goog.i18n.NumberFormatSymbols_dav_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_de_BE');\ngoog.provide('goog.i18n.NumberFormatSymbols_de_DE');\ngoog.provide('goog.i18n.NumberFormatSymbols_de_IT');\ngoog.provide('goog.i18n.NumberFormatSymbols_de_LI');\ngoog.provide('goog.i18n.NumberFormatSymbols_de_LU');\ngoog.provide('goog.i18n.NumberFormatSymbols_dje');\ngoog.provide('goog.i18n.NumberFormatSymbols_dje_NE');\ngoog.provide('goog.i18n.NumberFormatSymbols_dsb');\ngoog.provide('goog.i18n.NumberFormatSymbols_dsb_DE');\ngoog.provide('goog.i18n.NumberFormatSymbols_dua');\ngoog.provide('goog.i18n.NumberFormatSymbols_dua_CM');\ngoog.provide('goog.i18n.NumberFormatSymbols_dyo');\ngoog.provide('goog.i18n.NumberFormatSymbols_dyo_SN');\ngoog.provide('goog.i18n.NumberFormatSymbols_dz');\ngoog.provide('goog.i18n.NumberFormatSymbols_dz_BT');\ngoog.provide('goog.i18n.NumberFormatSymbols_dz_BT_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_dz_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ebu');\ngoog.provide('goog.i18n.NumberFormatSymbols_ebu_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_ee');\ngoog.provide('goog.i18n.NumberFormatSymbols_ee_GH');\ngoog.provide('goog.i18n.NumberFormatSymbols_ee_TG');\ngoog.provide('goog.i18n.NumberFormatSymbols_el_CY');\ngoog.provide('goog.i18n.NumberFormatSymbols_el_GR');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_001');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_150');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_AE');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_AG');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_AI');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_AS');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_AT');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_BB');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_BE');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_BI');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_BM');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_BS');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_BW');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_BZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_CC');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_CH');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_CK');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_CM');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_CX');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_CY');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_DE');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_DG');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_DK');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_DM');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_ER');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_FI');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_FJ');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_FK');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_FM');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_GD');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_GG');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_GH');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_GI');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_GM');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_GU');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_GY');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_HK');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_IL');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_IM');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_IO');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_JE');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_JM');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_KI');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_KN');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_KY');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_LC');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_LR');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_LS');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_MG');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_MH');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_MO');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_MP');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_MS');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_MT');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_MU');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_MW');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_MY');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_NA');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_NF');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_NG');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_NL');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_NR');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_NU');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_NZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_PG');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_PH');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_PK');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_PN');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_PR');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_PW');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_RW');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_SB');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_SC');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_SD');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_SE');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_SH');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_SI');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_SL');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_SS');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_SX');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_SZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_TC');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_TK');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_TO');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_TT');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_TV');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_TZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_UG');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_UM');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_US_POSIX');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_VC');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_VG');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_VI');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_VU');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_WS');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_XA');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_ZM');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_ZW');\ngoog.provide('goog.i18n.NumberFormatSymbols_eo');\ngoog.provide('goog.i18n.NumberFormatSymbols_eo_001');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_AR');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_BO');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_BR');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_BZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_CL');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_CO');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_CR');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_CU');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_DO');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_EA');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_EC');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_GQ');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_GT');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_HN');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_IC');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_NI');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_PA');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_PE');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_PH');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_PR');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_PY');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_SV');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_UY');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_VE');\ngoog.provide('goog.i18n.NumberFormatSymbols_et_EE');\ngoog.provide('goog.i18n.NumberFormatSymbols_eu_ES');\ngoog.provide('goog.i18n.NumberFormatSymbols_ewo');\ngoog.provide('goog.i18n.NumberFormatSymbols_ewo_CM');\ngoog.provide('goog.i18n.NumberFormatSymbols_fa_AF');\ngoog.provide('goog.i18n.NumberFormatSymbols_fa_AF_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_fa_IR');\ngoog.provide('goog.i18n.NumberFormatSymbols_fa_IR_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ff');\ngoog.provide('goog.i18n.NumberFormatSymbols_ff_Latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ff_Latn_BF');\ngoog.provide('goog.i18n.NumberFormatSymbols_ff_Latn_CM');\ngoog.provide('goog.i18n.NumberFormatSymbols_ff_Latn_GH');\ngoog.provide('goog.i18n.NumberFormatSymbols_ff_Latn_GM');\ngoog.provide('goog.i18n.NumberFormatSymbols_ff_Latn_GN');\ngoog.provide('goog.i18n.NumberFormatSymbols_ff_Latn_GW');\ngoog.provide('goog.i18n.NumberFormatSymbols_ff_Latn_LR');\ngoog.provide('goog.i18n.NumberFormatSymbols_ff_Latn_MR');\ngoog.provide('goog.i18n.NumberFormatSymbols_ff_Latn_NE');\ngoog.provide('goog.i18n.NumberFormatSymbols_ff_Latn_NG');\ngoog.provide('goog.i18n.NumberFormatSymbols_ff_Latn_SL');\ngoog.provide('goog.i18n.NumberFormatSymbols_ff_Latn_SN');\ngoog.provide('goog.i18n.NumberFormatSymbols_fi_FI');\ngoog.provide('goog.i18n.NumberFormatSymbols_fil_PH');\ngoog.provide('goog.i18n.NumberFormatSymbols_fo');\ngoog.provide('goog.i18n.NumberFormatSymbols_fo_DK');\ngoog.provide('goog.i18n.NumberFormatSymbols_fo_FO');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_BE');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_BF');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_BI');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_BJ');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_BL');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_CD');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_CF');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_CG');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_CH');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_CI');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_CM');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_DJ');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_DZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_FR');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_GA');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_GF');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_GN');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_GP');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_GQ');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_HT');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_KM');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_LU');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_MA');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_MC');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_MF');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_MG');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_ML');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_MQ');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_MR');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_MU');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_NC');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_NE');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_PF');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_PM');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_RE');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_RW');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_SC');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_SN');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_SY');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_TD');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_TG');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_TN');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_VU');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_WF');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_YT');\ngoog.provide('goog.i18n.NumberFormatSymbols_fur');\ngoog.provide('goog.i18n.NumberFormatSymbols_fur_IT');\ngoog.provide('goog.i18n.NumberFormatSymbols_fy');\ngoog.provide('goog.i18n.NumberFormatSymbols_fy_NL');\ngoog.provide('goog.i18n.NumberFormatSymbols_ga_IE');\ngoog.provide('goog.i18n.NumberFormatSymbols_gd');\ngoog.provide('goog.i18n.NumberFormatSymbols_gd_GB');\ngoog.provide('goog.i18n.NumberFormatSymbols_gl_ES');\ngoog.provide('goog.i18n.NumberFormatSymbols_gsw_CH');\ngoog.provide('goog.i18n.NumberFormatSymbols_gsw_FR');\ngoog.provide('goog.i18n.NumberFormatSymbols_gsw_LI');\ngoog.provide('goog.i18n.NumberFormatSymbols_gu_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_guz');\ngoog.provide('goog.i18n.NumberFormatSymbols_guz_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_gv');\ngoog.provide('goog.i18n.NumberFormatSymbols_gv_IM');\ngoog.provide('goog.i18n.NumberFormatSymbols_ha');\ngoog.provide('goog.i18n.NumberFormatSymbols_ha_GH');\ngoog.provide('goog.i18n.NumberFormatSymbols_ha_NE');\ngoog.provide('goog.i18n.NumberFormatSymbols_ha_NG');\ngoog.provide('goog.i18n.NumberFormatSymbols_haw_US');\ngoog.provide('goog.i18n.NumberFormatSymbols_he_IL');\ngoog.provide('goog.i18n.NumberFormatSymbols_hi_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_hr_BA');\ngoog.provide('goog.i18n.NumberFormatSymbols_hr_HR');\ngoog.provide('goog.i18n.NumberFormatSymbols_hsb');\ngoog.provide('goog.i18n.NumberFormatSymbols_hsb_DE');\ngoog.provide('goog.i18n.NumberFormatSymbols_hu_HU');\ngoog.provide('goog.i18n.NumberFormatSymbols_hy_AM');\ngoog.provide('goog.i18n.NumberFormatSymbols_ia');\ngoog.provide('goog.i18n.NumberFormatSymbols_ia_001');\ngoog.provide('goog.i18n.NumberFormatSymbols_id_ID');\ngoog.provide('goog.i18n.NumberFormatSymbols_ig');\ngoog.provide('goog.i18n.NumberFormatSymbols_ig_NG');\ngoog.provide('goog.i18n.NumberFormatSymbols_ii');\ngoog.provide('goog.i18n.NumberFormatSymbols_ii_CN');\ngoog.provide('goog.i18n.NumberFormatSymbols_is_IS');\ngoog.provide('goog.i18n.NumberFormatSymbols_it_CH');\ngoog.provide('goog.i18n.NumberFormatSymbols_it_IT');\ngoog.provide('goog.i18n.NumberFormatSymbols_it_SM');\ngoog.provide('goog.i18n.NumberFormatSymbols_it_VA');\ngoog.provide('goog.i18n.NumberFormatSymbols_ja_JP');\ngoog.provide('goog.i18n.NumberFormatSymbols_jgo');\ngoog.provide('goog.i18n.NumberFormatSymbols_jgo_CM');\ngoog.provide('goog.i18n.NumberFormatSymbols_jmc');\ngoog.provide('goog.i18n.NumberFormatSymbols_jmc_TZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_jv');\ngoog.provide('goog.i18n.NumberFormatSymbols_jv_ID');\ngoog.provide('goog.i18n.NumberFormatSymbols_ka_GE');\ngoog.provide('goog.i18n.NumberFormatSymbols_kab');\ngoog.provide('goog.i18n.NumberFormatSymbols_kab_DZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_kam');\ngoog.provide('goog.i18n.NumberFormatSymbols_kam_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_kde');\ngoog.provide('goog.i18n.NumberFormatSymbols_kde_TZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_kea');\ngoog.provide('goog.i18n.NumberFormatSymbols_kea_CV');\ngoog.provide('goog.i18n.NumberFormatSymbols_khq');\ngoog.provide('goog.i18n.NumberFormatSymbols_khq_ML');\ngoog.provide('goog.i18n.NumberFormatSymbols_ki');\ngoog.provide('goog.i18n.NumberFormatSymbols_ki_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_kk_KZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_kkj');\ngoog.provide('goog.i18n.NumberFormatSymbols_kkj_CM');\ngoog.provide('goog.i18n.NumberFormatSymbols_kl');\ngoog.provide('goog.i18n.NumberFormatSymbols_kl_GL');\ngoog.provide('goog.i18n.NumberFormatSymbols_kln');\ngoog.provide('goog.i18n.NumberFormatSymbols_kln_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_km_KH');\ngoog.provide('goog.i18n.NumberFormatSymbols_kn_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_ko_KP');\ngoog.provide('goog.i18n.NumberFormatSymbols_ko_KR');\ngoog.provide('goog.i18n.NumberFormatSymbols_kok');\ngoog.provide('goog.i18n.NumberFormatSymbols_kok_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_ks');\ngoog.provide('goog.i18n.NumberFormatSymbols_ks_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_ks_IN_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ks_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ksb');\ngoog.provide('goog.i18n.NumberFormatSymbols_ksb_TZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_ksf');\ngoog.provide('goog.i18n.NumberFormatSymbols_ksf_CM');\ngoog.provide('goog.i18n.NumberFormatSymbols_ksh');\ngoog.provide('goog.i18n.NumberFormatSymbols_ksh_DE');\ngoog.provide('goog.i18n.NumberFormatSymbols_ku');\ngoog.provide('goog.i18n.NumberFormatSymbols_ku_TR');\ngoog.provide('goog.i18n.NumberFormatSymbols_kw');\ngoog.provide('goog.i18n.NumberFormatSymbols_kw_GB');\ngoog.provide('goog.i18n.NumberFormatSymbols_ky_KG');\ngoog.provide('goog.i18n.NumberFormatSymbols_lag');\ngoog.provide('goog.i18n.NumberFormatSymbols_lag_TZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_lb');\ngoog.provide('goog.i18n.NumberFormatSymbols_lb_LU');\ngoog.provide('goog.i18n.NumberFormatSymbols_lg');\ngoog.provide('goog.i18n.NumberFormatSymbols_lg_UG');\ngoog.provide('goog.i18n.NumberFormatSymbols_lkt');\ngoog.provide('goog.i18n.NumberFormatSymbols_lkt_US');\ngoog.provide('goog.i18n.NumberFormatSymbols_ln_AO');\ngoog.provide('goog.i18n.NumberFormatSymbols_ln_CD');\ngoog.provide('goog.i18n.NumberFormatSymbols_ln_CF');\ngoog.provide('goog.i18n.NumberFormatSymbols_ln_CG');\ngoog.provide('goog.i18n.NumberFormatSymbols_lo_LA');\ngoog.provide('goog.i18n.NumberFormatSymbols_lrc');\ngoog.provide('goog.i18n.NumberFormatSymbols_lrc_IQ');\ngoog.provide('goog.i18n.NumberFormatSymbols_lrc_IQ_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_lrc_IR');\ngoog.provide('goog.i18n.NumberFormatSymbols_lrc_IR_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_lrc_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_lt_LT');\ngoog.provide('goog.i18n.NumberFormatSymbols_lu');\ngoog.provide('goog.i18n.NumberFormatSymbols_lu_CD');\ngoog.provide('goog.i18n.NumberFormatSymbols_luo');\ngoog.provide('goog.i18n.NumberFormatSymbols_luo_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_luy');\ngoog.provide('goog.i18n.NumberFormatSymbols_luy_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_lv_LV');\ngoog.provide('goog.i18n.NumberFormatSymbols_mas');\ngoog.provide('goog.i18n.NumberFormatSymbols_mas_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_mas_TZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_mer');\ngoog.provide('goog.i18n.NumberFormatSymbols_mer_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_mfe');\ngoog.provide('goog.i18n.NumberFormatSymbols_mfe_MU');\ngoog.provide('goog.i18n.NumberFormatSymbols_mg');\ngoog.provide('goog.i18n.NumberFormatSymbols_mg_MG');\ngoog.provide('goog.i18n.NumberFormatSymbols_mgh');\ngoog.provide('goog.i18n.NumberFormatSymbols_mgh_MZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_mgo');\ngoog.provide('goog.i18n.NumberFormatSymbols_mgo_CM');\ngoog.provide('goog.i18n.NumberFormatSymbols_mi');\ngoog.provide('goog.i18n.NumberFormatSymbols_mi_NZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_mk_MK');\ngoog.provide('goog.i18n.NumberFormatSymbols_ml_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_mn_MN');\ngoog.provide('goog.i18n.NumberFormatSymbols_mr_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_mr_IN_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ms_BN');\ngoog.provide('goog.i18n.NumberFormatSymbols_ms_MY');\ngoog.provide('goog.i18n.NumberFormatSymbols_ms_SG');\ngoog.provide('goog.i18n.NumberFormatSymbols_mt_MT');\ngoog.provide('goog.i18n.NumberFormatSymbols_mua');\ngoog.provide('goog.i18n.NumberFormatSymbols_mua_CM');\ngoog.provide('goog.i18n.NumberFormatSymbols_my_MM');\ngoog.provide('goog.i18n.NumberFormatSymbols_my_MM_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_mzn');\ngoog.provide('goog.i18n.NumberFormatSymbols_mzn_IR');\ngoog.provide('goog.i18n.NumberFormatSymbols_mzn_IR_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_mzn_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_naq');\ngoog.provide('goog.i18n.NumberFormatSymbols_naq_NA');\ngoog.provide('goog.i18n.NumberFormatSymbols_nb_NO');\ngoog.provide('goog.i18n.NumberFormatSymbols_nb_SJ');\ngoog.provide('goog.i18n.NumberFormatSymbols_nd');\ngoog.provide('goog.i18n.NumberFormatSymbols_nd_ZW');\ngoog.provide('goog.i18n.NumberFormatSymbols_nds');\ngoog.provide('goog.i18n.NumberFormatSymbols_nds_DE');\ngoog.provide('goog.i18n.NumberFormatSymbols_nds_NL');\ngoog.provide('goog.i18n.NumberFormatSymbols_ne_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_ne_IN_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ne_NP');\ngoog.provide('goog.i18n.NumberFormatSymbols_ne_NP_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_nl_AW');\ngoog.provide('goog.i18n.NumberFormatSymbols_nl_BE');\ngoog.provide('goog.i18n.NumberFormatSymbols_nl_BQ');\ngoog.provide('goog.i18n.NumberFormatSymbols_nl_CW');\ngoog.provide('goog.i18n.NumberFormatSymbols_nl_NL');\ngoog.provide('goog.i18n.NumberFormatSymbols_nl_SR');\ngoog.provide('goog.i18n.NumberFormatSymbols_nl_SX');\ngoog.provide('goog.i18n.NumberFormatSymbols_nmg');\ngoog.provide('goog.i18n.NumberFormatSymbols_nmg_CM');\ngoog.provide('goog.i18n.NumberFormatSymbols_nn');\ngoog.provide('goog.i18n.NumberFormatSymbols_nn_NO');\ngoog.provide('goog.i18n.NumberFormatSymbols_nnh');\ngoog.provide('goog.i18n.NumberFormatSymbols_nnh_CM');\ngoog.provide('goog.i18n.NumberFormatSymbols_nus');\ngoog.provide('goog.i18n.NumberFormatSymbols_nus_SS');\ngoog.provide('goog.i18n.NumberFormatSymbols_nyn');\ngoog.provide('goog.i18n.NumberFormatSymbols_nyn_UG');\ngoog.provide('goog.i18n.NumberFormatSymbols_om');\ngoog.provide('goog.i18n.NumberFormatSymbols_om_ET');\ngoog.provide('goog.i18n.NumberFormatSymbols_om_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_or_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_os');\ngoog.provide('goog.i18n.NumberFormatSymbols_os_GE');\ngoog.provide('goog.i18n.NumberFormatSymbols_os_RU');\ngoog.provide('goog.i18n.NumberFormatSymbols_pa_Arab');\ngoog.provide('goog.i18n.NumberFormatSymbols_pa_Arab_PK');\ngoog.provide('goog.i18n.NumberFormatSymbols_pa_Arab_PK_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_pa_Arab_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_pa_Guru');\ngoog.provide('goog.i18n.NumberFormatSymbols_pa_Guru_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_pl_PL');\ngoog.provide('goog.i18n.NumberFormatSymbols_ps');\ngoog.provide('goog.i18n.NumberFormatSymbols_ps_AF');\ngoog.provide('goog.i18n.NumberFormatSymbols_ps_AF_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ps_PK');\ngoog.provide('goog.i18n.NumberFormatSymbols_ps_PK_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ps_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_pt_AO');\ngoog.provide('goog.i18n.NumberFormatSymbols_pt_CH');\ngoog.provide('goog.i18n.NumberFormatSymbols_pt_CV');\ngoog.provide('goog.i18n.NumberFormatSymbols_pt_GQ');\ngoog.provide('goog.i18n.NumberFormatSymbols_pt_GW');\ngoog.provide('goog.i18n.NumberFormatSymbols_pt_LU');\ngoog.provide('goog.i18n.NumberFormatSymbols_pt_MO');\ngoog.provide('goog.i18n.NumberFormatSymbols_pt_MZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_pt_ST');\ngoog.provide('goog.i18n.NumberFormatSymbols_pt_TL');\ngoog.provide('goog.i18n.NumberFormatSymbols_qu');\ngoog.provide('goog.i18n.NumberFormatSymbols_qu_BO');\ngoog.provide('goog.i18n.NumberFormatSymbols_qu_EC');\ngoog.provide('goog.i18n.NumberFormatSymbols_qu_PE');\ngoog.provide('goog.i18n.NumberFormatSymbols_rm');\ngoog.provide('goog.i18n.NumberFormatSymbols_rm_CH');\ngoog.provide('goog.i18n.NumberFormatSymbols_rn');\ngoog.provide('goog.i18n.NumberFormatSymbols_rn_BI');\ngoog.provide('goog.i18n.NumberFormatSymbols_ro_MD');\ngoog.provide('goog.i18n.NumberFormatSymbols_ro_RO');\ngoog.provide('goog.i18n.NumberFormatSymbols_rof');\ngoog.provide('goog.i18n.NumberFormatSymbols_rof_TZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_ru_BY');\ngoog.provide('goog.i18n.NumberFormatSymbols_ru_KG');\ngoog.provide('goog.i18n.NumberFormatSymbols_ru_KZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_ru_MD');\ngoog.provide('goog.i18n.NumberFormatSymbols_ru_RU');\ngoog.provide('goog.i18n.NumberFormatSymbols_ru_UA');\ngoog.provide('goog.i18n.NumberFormatSymbols_rw');\ngoog.provide('goog.i18n.NumberFormatSymbols_rw_RW');\ngoog.provide('goog.i18n.NumberFormatSymbols_rwk');\ngoog.provide('goog.i18n.NumberFormatSymbols_rwk_TZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_sah');\ngoog.provide('goog.i18n.NumberFormatSymbols_sah_RU');\ngoog.provide('goog.i18n.NumberFormatSymbols_saq');\ngoog.provide('goog.i18n.NumberFormatSymbols_saq_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_sbp');\ngoog.provide('goog.i18n.NumberFormatSymbols_sbp_TZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_sd');\ngoog.provide('goog.i18n.NumberFormatSymbols_sd_PK');\ngoog.provide('goog.i18n.NumberFormatSymbols_sd_PK_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_sd_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_se');\ngoog.provide('goog.i18n.NumberFormatSymbols_se_FI');\ngoog.provide('goog.i18n.NumberFormatSymbols_se_NO');\ngoog.provide('goog.i18n.NumberFormatSymbols_se_SE');\ngoog.provide('goog.i18n.NumberFormatSymbols_seh');\ngoog.provide('goog.i18n.NumberFormatSymbols_seh_MZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_ses');\ngoog.provide('goog.i18n.NumberFormatSymbols_ses_ML');\ngoog.provide('goog.i18n.NumberFormatSymbols_sg');\ngoog.provide('goog.i18n.NumberFormatSymbols_sg_CF');\ngoog.provide('goog.i18n.NumberFormatSymbols_shi');\ngoog.provide('goog.i18n.NumberFormatSymbols_shi_Latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_shi_Latn_MA');\ngoog.provide('goog.i18n.NumberFormatSymbols_shi_Tfng');\ngoog.provide('goog.i18n.NumberFormatSymbols_shi_Tfng_MA');\ngoog.provide('goog.i18n.NumberFormatSymbols_si_LK');\ngoog.provide('goog.i18n.NumberFormatSymbols_sk_SK');\ngoog.provide('goog.i18n.NumberFormatSymbols_sl_SI');\ngoog.provide('goog.i18n.NumberFormatSymbols_smn');\ngoog.provide('goog.i18n.NumberFormatSymbols_smn_FI');\ngoog.provide('goog.i18n.NumberFormatSymbols_sn');\ngoog.provide('goog.i18n.NumberFormatSymbols_sn_ZW');\ngoog.provide('goog.i18n.NumberFormatSymbols_so');\ngoog.provide('goog.i18n.NumberFormatSymbols_so_DJ');\ngoog.provide('goog.i18n.NumberFormatSymbols_so_ET');\ngoog.provide('goog.i18n.NumberFormatSymbols_so_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_so_SO');\ngoog.provide('goog.i18n.NumberFormatSymbols_sq_AL');\ngoog.provide('goog.i18n.NumberFormatSymbols_sq_MK');\ngoog.provide('goog.i18n.NumberFormatSymbols_sq_XK');\ngoog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl');\ngoog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl_BA');\ngoog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl_ME');\ngoog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl_RS');\ngoog.provide('goog.i18n.NumberFormatSymbols_sr_Cyrl_XK');\ngoog.provide('goog.i18n.NumberFormatSymbols_sr_Latn_BA');\ngoog.provide('goog.i18n.NumberFormatSymbols_sr_Latn_ME');\ngoog.provide('goog.i18n.NumberFormatSymbols_sr_Latn_RS');\ngoog.provide('goog.i18n.NumberFormatSymbols_sr_Latn_XK');\ngoog.provide('goog.i18n.NumberFormatSymbols_sv_AX');\ngoog.provide('goog.i18n.NumberFormatSymbols_sv_FI');\ngoog.provide('goog.i18n.NumberFormatSymbols_sv_SE');\ngoog.provide('goog.i18n.NumberFormatSymbols_sw_CD');\ngoog.provide('goog.i18n.NumberFormatSymbols_sw_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_sw_TZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_sw_UG');\ngoog.provide('goog.i18n.NumberFormatSymbols_ta_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_ta_LK');\ngoog.provide('goog.i18n.NumberFormatSymbols_ta_MY');\ngoog.provide('goog.i18n.NumberFormatSymbols_ta_SG');\ngoog.provide('goog.i18n.NumberFormatSymbols_te_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_teo');\ngoog.provide('goog.i18n.NumberFormatSymbols_teo_KE');\ngoog.provide('goog.i18n.NumberFormatSymbols_teo_UG');\ngoog.provide('goog.i18n.NumberFormatSymbols_tg');\ngoog.provide('goog.i18n.NumberFormatSymbols_tg_TJ');\ngoog.provide('goog.i18n.NumberFormatSymbols_th_TH');\ngoog.provide('goog.i18n.NumberFormatSymbols_ti');\ngoog.provide('goog.i18n.NumberFormatSymbols_ti_ER');\ngoog.provide('goog.i18n.NumberFormatSymbols_ti_ET');\ngoog.provide('goog.i18n.NumberFormatSymbols_tk');\ngoog.provide('goog.i18n.NumberFormatSymbols_tk_TM');\ngoog.provide('goog.i18n.NumberFormatSymbols_to');\ngoog.provide('goog.i18n.NumberFormatSymbols_to_TO');\ngoog.provide('goog.i18n.NumberFormatSymbols_tr_CY');\ngoog.provide('goog.i18n.NumberFormatSymbols_tr_TR');\ngoog.provide('goog.i18n.NumberFormatSymbols_tt');\ngoog.provide('goog.i18n.NumberFormatSymbols_tt_RU');\ngoog.provide('goog.i18n.NumberFormatSymbols_twq');\ngoog.provide('goog.i18n.NumberFormatSymbols_twq_NE');\ngoog.provide('goog.i18n.NumberFormatSymbols_tzm');\ngoog.provide('goog.i18n.NumberFormatSymbols_tzm_MA');\ngoog.provide('goog.i18n.NumberFormatSymbols_ug');\ngoog.provide('goog.i18n.NumberFormatSymbols_ug_CN');\ngoog.provide('goog.i18n.NumberFormatSymbols_uk_UA');\ngoog.provide('goog.i18n.NumberFormatSymbols_ur_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_ur_IN_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ur_PK');\ngoog.provide('goog.i18n.NumberFormatSymbols_uz_Arab');\ngoog.provide('goog.i18n.NumberFormatSymbols_uz_Arab_AF');\ngoog.provide('goog.i18n.NumberFormatSymbols_uz_Arab_AF_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_uz_Arab_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_uz_Cyrl');\ngoog.provide('goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_uz_Latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_uz_Latn_UZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_vai');\ngoog.provide('goog.i18n.NumberFormatSymbols_vai_Latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_vai_Latn_LR');\ngoog.provide('goog.i18n.NumberFormatSymbols_vai_Vaii');\ngoog.provide('goog.i18n.NumberFormatSymbols_vai_Vaii_LR');\ngoog.provide('goog.i18n.NumberFormatSymbols_vi_VN');\ngoog.provide('goog.i18n.NumberFormatSymbols_vun');\ngoog.provide('goog.i18n.NumberFormatSymbols_vun_TZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_wae');\ngoog.provide('goog.i18n.NumberFormatSymbols_wae_CH');\ngoog.provide('goog.i18n.NumberFormatSymbols_wo');\ngoog.provide('goog.i18n.NumberFormatSymbols_wo_SN');\ngoog.provide('goog.i18n.NumberFormatSymbols_xh');\ngoog.provide('goog.i18n.NumberFormatSymbols_xh_ZA');\ngoog.provide('goog.i18n.NumberFormatSymbols_xog');\ngoog.provide('goog.i18n.NumberFormatSymbols_xog_UG');\ngoog.provide('goog.i18n.NumberFormatSymbols_yav');\ngoog.provide('goog.i18n.NumberFormatSymbols_yav_CM');\ngoog.provide('goog.i18n.NumberFormatSymbols_yi');\ngoog.provide('goog.i18n.NumberFormatSymbols_yi_001');\ngoog.provide('goog.i18n.NumberFormatSymbols_yo');\ngoog.provide('goog.i18n.NumberFormatSymbols_yo_BJ');\ngoog.provide('goog.i18n.NumberFormatSymbols_yo_NG');\ngoog.provide('goog.i18n.NumberFormatSymbols_yue');\ngoog.provide('goog.i18n.NumberFormatSymbols_yue_Hans');\ngoog.provide('goog.i18n.NumberFormatSymbols_yue_Hans_CN');\ngoog.provide('goog.i18n.NumberFormatSymbols_yue_Hant');\ngoog.provide('goog.i18n.NumberFormatSymbols_yue_Hant_HK');\ngoog.provide('goog.i18n.NumberFormatSymbols_zgh');\ngoog.provide('goog.i18n.NumberFormatSymbols_zgh_MA');\ngoog.provide('goog.i18n.NumberFormatSymbols_zh_Hans');\ngoog.provide('goog.i18n.NumberFormatSymbols_zh_Hans_CN');\ngoog.provide('goog.i18n.NumberFormatSymbols_zh_Hans_HK');\ngoog.provide('goog.i18n.NumberFormatSymbols_zh_Hans_MO');\ngoog.provide('goog.i18n.NumberFormatSymbols_zh_Hans_SG');\ngoog.provide('goog.i18n.NumberFormatSymbols_zh_Hant');\ngoog.provide('goog.i18n.NumberFormatSymbols_zh_Hant_HK');\ngoog.provide('goog.i18n.NumberFormatSymbols_zh_Hant_MO');\ngoog.provide('goog.i18n.NumberFormatSymbols_zh_Hant_TW');\ngoog.provide('goog.i18n.NumberFormatSymbols_zu_ZA');\ngoog.require('goog.i18n.NumberFormatSymbols');\ngoog.require('goog.i18n.NumberFormatSymbols_u_nu_latn');\n\n\n/**\n * Number formatting symbols for locale af_NA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_af_NA = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'NAD'\n};\n\n\n/**\n * Number formatting symbols for locale af_ZA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_af_ZA = goog.i18n.NumberFormatSymbols_af;\n\n\n/**\n * Number formatting symbols for locale agq.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_agq = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale agq_CM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_agq_CM = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale ak.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ak = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'GHS'\n};\n\n\n/**\n * Number formatting symbols for locale ak_GH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ak_GH = goog.i18n.NumberFormatSymbols_ak;\n\n\n/**\n * Number formatting symbols for locale am_ET.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_am_ET = goog.i18n.NumberFormatSymbols_am;\n\n\n/**\n * Number formatting symbols for locale ar_001.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_001 = goog.i18n.NumberFormatSymbols_ar;\n\n\n/**\n * Number formatting symbols for locale ar_AE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_AE = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'AED'\n};\n\n\n/**\n * Number formatting symbols for locale ar_AE_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_AE_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'AED'\n};\n\n\n/**\n * Number formatting symbols for locale ar_BH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_BH = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.000 ¤',\n  DEF_CURRENCY_CODE: 'BHD'\n};\n\n\n/**\n * Number formatting symbols for locale ar_BH_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_BH_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.000',\n  DEF_CURRENCY_CODE: 'BHD'\n};\n\n\n/**\n * Number formatting symbols for locale ar_DJ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_DJ = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'DJF'\n};\n\n\n/**\n * Number formatting symbols for locale ar_DJ_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_DJ_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'DJF'\n};\n\n\n/**\n * Number formatting symbols for locale ar_EH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_EH = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'MAD'\n};\n\n\n/**\n * Number formatting symbols for locale ar_ER.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_ER = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'ERN'\n};\n\n\n/**\n * Number formatting symbols for locale ar_ER_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_ER_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'ERN'\n};\n\n\n/**\n * Number formatting symbols for locale ar_IL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_IL = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'ILS'\n};\n\n\n/**\n * Number formatting symbols for locale ar_IL_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_IL_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'ILS'\n};\n\n\n/**\n * Number formatting symbols for locale ar_IQ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_IQ = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'IQD'\n};\n\n\n/**\n * Number formatting symbols for locale ar_IQ_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_IQ_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'IQD'\n};\n\n\n/**\n * Number formatting symbols for locale ar_JO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_JO = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.000 ¤',\n  DEF_CURRENCY_CODE: 'JOD'\n};\n\n\n/**\n * Number formatting symbols for locale ar_JO_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_JO_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.000',\n  DEF_CURRENCY_CODE: 'JOD'\n};\n\n\n/**\n * Number formatting symbols for locale ar_KM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_KM = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'KMF'\n};\n\n\n/**\n * Number formatting symbols for locale ar_KM_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_KM_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'KMF'\n};\n\n\n/**\n * Number formatting symbols for locale ar_KW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_KW = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.000 ¤',\n  DEF_CURRENCY_CODE: 'KWD'\n};\n\n\n/**\n * Number formatting symbols for locale ar_KW_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_KW_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.000',\n  DEF_CURRENCY_CODE: 'KWD'\n};\n\n\n/**\n * Number formatting symbols for locale ar_LB.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_LB = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'LBP'\n};\n\n\n/**\n * Number formatting symbols for locale ar_LB_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_LB_u_nu_latn = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'LBP'\n};\n\n\n/**\n * Number formatting symbols for locale ar_LY.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_LY = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.000',\n  DEF_CURRENCY_CODE: 'LYD'\n};\n\n\n/**\n * Number formatting symbols for locale ar_MA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_MA = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'MAD'\n};\n\n\n/**\n * Number formatting symbols for locale ar_MR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_MR = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'MRU'\n};\n\n\n/**\n * Number formatting symbols for locale ar_MR_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_MR_u_nu_latn = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'MRU'\n};\n\n\n/**\n * Number formatting symbols for locale ar_OM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_OM = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.000 ¤',\n  DEF_CURRENCY_CODE: 'OMR'\n};\n\n\n/**\n * Number formatting symbols for locale ar_OM_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_OM_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.000',\n  DEF_CURRENCY_CODE: 'OMR'\n};\n\n\n/**\n * Number formatting symbols for locale ar_PS.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_PS = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'ILS'\n};\n\n\n/**\n * Number formatting symbols for locale ar_PS_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_PS_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'ILS'\n};\n\n\n/**\n * Number formatting symbols for locale ar_QA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_QA = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'QAR'\n};\n\n\n/**\n * Number formatting symbols for locale ar_QA_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_QA_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'QAR'\n};\n\n\n/**\n * Number formatting symbols for locale ar_SA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_SA = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'SAR'\n};\n\n\n/**\n * Number formatting symbols for locale ar_SA_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_SA_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '٪',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'SAR'\n};\n\n\n/**\n * Number formatting symbols for locale ar_SD.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_SD = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'SDG'\n};\n\n\n/**\n * Number formatting symbols for locale ar_SD_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_SD_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'SDG'\n};\n\n\n/**\n * Number formatting symbols for locale ar_SO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_SO = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'SOS'\n};\n\n\n/**\n * Number formatting symbols for locale ar_SO_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_SO_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '٪',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'SOS'\n};\n\n\n/**\n * Number formatting symbols for locale ar_SS.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_SS = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'SSP'\n};\n\n\n/**\n * Number formatting symbols for locale ar_SS_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_SS_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'SSP'\n};\n\n\n/**\n * Number formatting symbols for locale ar_SY.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_SY = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'SYP'\n};\n\n\n/**\n * Number formatting symbols for locale ar_SY_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_SY_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'SYP'\n};\n\n\n/**\n * Number formatting symbols for locale ar_TD.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_TD = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale ar_TD_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_TD_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale ar_TN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_TN = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.000',\n  DEF_CURRENCY_CODE: 'TND'\n};\n\n\n/**\n * Number formatting symbols for locale ar_XB.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_XB = goog.i18n.NumberFormatSymbols_ar;\n\n\n/**\n * Number formatting symbols for locale ar_YE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_YE = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'YER'\n};\n\n\n/**\n * Number formatting symbols for locale ar_YE_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_YE_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'YER'\n};\n\n\n/**\n * Number formatting symbols for locale as.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_as = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '০',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '¤ #,##,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale as_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_as_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '¤ #,##,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale as_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_as_IN = goog.i18n.NumberFormatSymbols_as;\n\n\n/**\n * Number formatting symbols for locale as_IN_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_as_IN_u_nu_latn = goog.i18n.NumberFormatSymbols_as_u_nu_latn;\n\n\n/**\n * Number formatting symbols for locale asa.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_asa = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'TZS'\n};\n\n\n/**\n * Number formatting symbols for locale asa_TZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_asa_TZ = goog.i18n.NumberFormatSymbols_asa;\n\n\n/**\n * Number formatting symbols for locale ast.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ast = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ND',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale ast_ES.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ast_ES = goog.i18n.NumberFormatSymbols_ast;\n\n\n/**\n * Number formatting symbols for locale az_Cyrl.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_az_Cyrl = goog.i18n.NumberFormatSymbols_az;\n\n\n/**\n * Number formatting symbols for locale az_Cyrl_AZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_az_Cyrl_AZ = goog.i18n.NumberFormatSymbols_az;\n\n\n/**\n * Number formatting symbols for locale az_Latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_az_Latn = goog.i18n.NumberFormatSymbols_az;\n\n\n/**\n * Number formatting symbols for locale az_Latn_AZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_az_Latn_AZ = goog.i18n.NumberFormatSymbols_az;\n\n\n/**\n * Number formatting symbols for locale bas.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bas = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale bas_CM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bas_CM = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale be_BY.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_be_BY = goog.i18n.NumberFormatSymbols_be;\n\n\n/**\n * Number formatting symbols for locale bem.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bem = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'ZMW'\n};\n\n\n/**\n * Number formatting symbols for locale bem_ZM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bem_ZM = goog.i18n.NumberFormatSymbols_bem;\n\n\n/**\n * Number formatting symbols for locale bez.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bez = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'TZS'\n};\n\n\n/**\n * Number formatting symbols for locale bez_TZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bez_TZ = goog.i18n.NumberFormatSymbols_bez;\n\n\n/**\n * Number formatting symbols for locale bg_BG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bg_BG = goog.i18n.NumberFormatSymbols_bg;\n\n\n/**\n * Number formatting symbols for locale bm.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bm = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale bm_ML.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bm_ML = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale bn_BD.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bn_BD = goog.i18n.NumberFormatSymbols_bn;\n\n\n/**\n * Number formatting symbols for locale bn_BD_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bn_BD_u_nu_latn = goog.i18n.NumberFormatSymbols_bn_u_nu_latn;\n\n\n/**\n * Number formatting symbols for locale bn_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bn_IN = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '০',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##,##0.00¤',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale bn_IN_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bn_IN_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '#,##,##0.00¤',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale bo.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bo = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'CNY'\n};\n\n\n/**\n * Number formatting symbols for locale bo_CN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bo_CN = goog.i18n.NumberFormatSymbols_bo;\n\n\n/**\n * Number formatting symbols for locale bo_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bo_IN = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale br_FR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_br_FR = goog.i18n.NumberFormatSymbols_br;\n\n\n/**\n * Number formatting symbols for locale brx.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_brx = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '¤ #,##,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale brx_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_brx_IN = goog.i18n.NumberFormatSymbols_brx;\n\n\n/**\n * Number formatting symbols for locale bs_Cyrl.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bs_Cyrl = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'BAM'\n};\n\n\n/**\n * Number formatting symbols for locale bs_Cyrl_BA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bs_Cyrl_BA = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'BAM'\n};\n\n\n/**\n * Number formatting symbols for locale bs_Latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bs_Latn = goog.i18n.NumberFormatSymbols_bs;\n\n\n/**\n * Number formatting symbols for locale bs_Latn_BA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bs_Latn_BA = goog.i18n.NumberFormatSymbols_bs;\n\n\n/**\n * Number formatting symbols for locale ca_AD.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ca_AD = goog.i18n.NumberFormatSymbols_ca;\n\n\n/**\n * Number formatting symbols for locale ca_ES.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ca_ES = goog.i18n.NumberFormatSymbols_ca;\n\n\n/**\n * Number formatting symbols for locale ca_FR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ca_FR = goog.i18n.NumberFormatSymbols_ca;\n\n\n/**\n * Number formatting symbols for locale ca_IT.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ca_IT = goog.i18n.NumberFormatSymbols_ca;\n\n\n/**\n * Number formatting symbols for locale ccp.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ccp = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##,##0.00¤',\n  DEF_CURRENCY_CODE: 'BDT'\n};\n\n\n/**\n * Number formatting symbols for locale ccp_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ccp_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '#,##,##0.00¤',\n  DEF_CURRENCY_CODE: 'BDT'\n};\n\n\n/**\n * Number formatting symbols for locale ccp_BD.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ccp_BD = goog.i18n.NumberFormatSymbols_ccp;\n\n\n/**\n * Number formatting symbols for locale ccp_BD_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ccp_BD_u_nu_latn = goog.i18n.NumberFormatSymbols_ccp_u_nu_latn;\n\n\n/**\n * Number formatting symbols for locale ccp_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ccp_IN = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##,##0.00¤',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale ccp_IN_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ccp_IN_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '#,##,##0.00¤',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale ce.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ce = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'Терхьаш дац',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'RUB'\n};\n\n\n/**\n * Number formatting symbols for locale ce_RU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ce_RU = goog.i18n.NumberFormatSymbols_ce;\n\n\n/**\n * Number formatting symbols for locale ceb.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ceb = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,#0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'PHP'\n};\n\n\n/**\n * Number formatting symbols for locale ceb_PH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ceb_PH = goog.i18n.NumberFormatSymbols_ceb;\n\n\n/**\n * Number formatting symbols for locale cgg.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_cgg = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'UGX'\n};\n\n\n/**\n * Number formatting symbols for locale cgg_UG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_cgg_UG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'UGX'\n};\n\n\n/**\n * Number formatting symbols for locale chr_US.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_chr_US = goog.i18n.NumberFormatSymbols_chr;\n\n\n/**\n * Number formatting symbols for locale ckb.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ckb = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '‏+',\n  MINUS_SIGN: '‏-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'IQD'\n};\n\n\n/**\n * Number formatting symbols for locale ckb_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ckb_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'IQD'\n};\n\n\n/**\n * Number formatting symbols for locale ckb_IQ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ckb_IQ = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '‏+',\n  MINUS_SIGN: '‏-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'IQD'\n};\n\n\n/**\n * Number formatting symbols for locale ckb_IQ_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ckb_IQ_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'IQD'\n};\n\n\n/**\n * Number formatting symbols for locale ckb_IR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ckb_IR = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '‏+',\n  MINUS_SIGN: '‏-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'IRR'\n};\n\n\n/**\n * Number formatting symbols for locale ckb_IR_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ckb_IR_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'IRR'\n};\n\n\n/**\n * Number formatting symbols for locale cs_CZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_cs_CZ = goog.i18n.NumberFormatSymbols_cs;\n\n\n/**\n * Number formatting symbols for locale cy_GB.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_cy_GB = goog.i18n.NumberFormatSymbols_cy;\n\n\n/**\n * Number formatting symbols for locale da_DK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_da_DK = goog.i18n.NumberFormatSymbols_da;\n\n\n/**\n * Number formatting symbols for locale da_GL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_da_GL = goog.i18n.NumberFormatSymbols_da;\n\n\n/**\n * Number formatting symbols for locale dav.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_dav = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale dav_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_dav_KE = goog.i18n.NumberFormatSymbols_dav;\n\n\n/**\n * Number formatting symbols for locale de_BE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_de_BE = goog.i18n.NumberFormatSymbols_de;\n\n\n/**\n * Number formatting symbols for locale de_DE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_de_DE = goog.i18n.NumberFormatSymbols_de;\n\n\n/**\n * Number formatting symbols for locale de_IT.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_de_IT = goog.i18n.NumberFormatSymbols_de;\n\n\n/**\n * Number formatting symbols for locale de_LI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_de_LI = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: '’',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'CHF'\n};\n\n\n/**\n * Number formatting symbols for locale de_LU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_de_LU = goog.i18n.NumberFormatSymbols_de;\n\n\n/**\n * Number formatting symbols for locale dje.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_dje = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale dje_NE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_dje_NE = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale dsb.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_dsb = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale dsb_DE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_dsb_DE = goog.i18n.NumberFormatSymbols_dsb;\n\n\n/**\n * Number formatting symbols for locale dua.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_dua = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale dua_CM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_dua_CM = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale dyo.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_dyo = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale dyo_SN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_dyo_SN = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale dz.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_dz = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '༠',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: 'གྲངས་མེད',\n  NAN: 'ཨང་མད',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##,##0 %',\n  CURRENCY_PATTERN: '¤#,##,##0.00',\n  DEF_CURRENCY_CODE: 'BTN'\n};\n\n\n/**\n * Number formatting symbols for locale dz_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_dz_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##,##0 %',\n  CURRENCY_PATTERN: '¤#,##,##0.00',\n  DEF_CURRENCY_CODE: 'BTN'\n};\n\n\n/**\n * Number formatting symbols for locale dz_BT.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_dz_BT = goog.i18n.NumberFormatSymbols_dz;\n\n\n/**\n * Number formatting symbols for locale dz_BT_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_dz_BT_u_nu_latn = goog.i18n.NumberFormatSymbols_dz_u_nu_latn;\n\n\n/**\n * Number formatting symbols for locale ebu.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ebu = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale ebu_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ebu_KE = goog.i18n.NumberFormatSymbols_ebu;\n\n\n/**\n * Number formatting symbols for locale ee.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ee = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'mnn',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'GHS'\n};\n\n\n/**\n * Number formatting symbols for locale ee_GH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ee_GH = goog.i18n.NumberFormatSymbols_ee;\n\n\n/**\n * Number formatting symbols for locale ee_TG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ee_TG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'mnn',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale el_CY.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_el_CY = goog.i18n.NumberFormatSymbols_el;\n\n\n/**\n * Number formatting symbols for locale el_GR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_el_GR = goog.i18n.NumberFormatSymbols_el;\n\n\n/**\n * Number formatting symbols for locale en_001.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_001 = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_150.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_150 = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale en_AE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_AE = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'AED'\n};\n\n\n/**\n * Number formatting symbols for locale en_AG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_AG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'XCD'\n};\n\n\n/**\n * Number formatting symbols for locale en_AI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_AI = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'XCD'\n};\n\n\n/**\n * Number formatting symbols for locale en_AS.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_AS = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_AT.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_AT = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale en_BB.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_BB = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'BBD'\n};\n\n\n/**\n * Number formatting symbols for locale en_BE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_BE = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale en_BI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_BI = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'BIF'\n};\n\n\n/**\n * Number formatting symbols for locale en_BM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_BM = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'BMD'\n};\n\n\n/**\n * Number formatting symbols for locale en_BS.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_BS = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'BSD'\n};\n\n\n/**\n * Number formatting symbols for locale en_BW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_BW = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'BWP'\n};\n\n\n/**\n * Number formatting symbols for locale en_BZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_BZ = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'BZD'\n};\n\n\n/**\n * Number formatting symbols for locale en_CC.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_CC = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'AUD'\n};\n\n\n/**\n * Number formatting symbols for locale en_CH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_CH = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: '’',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00;¤-#,##0.00',\n  DEF_CURRENCY_CODE: 'CHF'\n};\n\n\n/**\n * Number formatting symbols for locale en_CK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_CK = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'NZD'\n};\n\n\n/**\n * Number formatting symbols for locale en_CM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_CM = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale en_CX.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_CX = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'AUD'\n};\n\n\n/**\n * Number formatting symbols for locale en_CY.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_CY = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale en_DE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_DE = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale en_DG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_DG = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_DK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_DK = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'DKK'\n};\n\n\n/**\n * Number formatting symbols for locale en_DM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_DM = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'XCD'\n};\n\n\n/**\n * Number formatting symbols for locale en_ER.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_ER = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'ERN'\n};\n\n\n/**\n * Number formatting symbols for locale en_FI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_FI = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale en_FJ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_FJ = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'FJD'\n};\n\n\n/**\n * Number formatting symbols for locale en_FK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_FK = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'FKP'\n};\n\n\n/**\n * Number formatting symbols for locale en_FM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_FM = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_GD.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_GD = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'XCD'\n};\n\n\n/**\n * Number formatting symbols for locale en_GG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_GG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'GBP'\n};\n\n\n/**\n * Number formatting symbols for locale en_GH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_GH = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'GHS'\n};\n\n\n/**\n * Number formatting symbols for locale en_GI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_GI = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'GIP'\n};\n\n\n/**\n * Number formatting symbols for locale en_GM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_GM = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'GMD'\n};\n\n\n/**\n * Number formatting symbols for locale en_GU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_GU = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_GY.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_GY = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'GYD'\n};\n\n\n/**\n * Number formatting symbols for locale en_HK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_HK = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'HKD'\n};\n\n\n/**\n * Number formatting symbols for locale en_IL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_IL = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'ILS'\n};\n\n\n/**\n * Number formatting symbols for locale en_IM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_IM = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'GBP'\n};\n\n\n/**\n * Number formatting symbols for locale en_IO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_IO = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_JE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_JE = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'GBP'\n};\n\n\n/**\n * Number formatting symbols for locale en_JM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_JM = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'JMD'\n};\n\n\n/**\n * Number formatting symbols for locale en_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_KE = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale en_KI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_KI = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'AUD'\n};\n\n\n/**\n * Number formatting symbols for locale en_KN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_KN = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'XCD'\n};\n\n\n/**\n * Number formatting symbols for locale en_KY.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_KY = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'KYD'\n};\n\n\n/**\n * Number formatting symbols for locale en_LC.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_LC = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'XCD'\n};\n\n\n/**\n * Number formatting symbols for locale en_LR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_LR = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'LRD'\n};\n\n\n/**\n * Number formatting symbols for locale en_LS.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_LS = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'ZAR'\n};\n\n\n/**\n * Number formatting symbols for locale en_MG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_MG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'MGA'\n};\n\n\n/**\n * Number formatting symbols for locale en_MH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_MH = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_MO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_MO = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'MOP'\n};\n\n\n/**\n * Number formatting symbols for locale en_MP.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_MP = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_MS.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_MS = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'XCD'\n};\n\n\n/**\n * Number formatting symbols for locale en_MT.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_MT = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale en_MU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_MU = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'MUR'\n};\n\n\n/**\n * Number formatting symbols for locale en_MW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_MW = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'MWK'\n};\n\n\n/**\n * Number formatting symbols for locale en_MY.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_MY = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'MYR'\n};\n\n\n/**\n * Number formatting symbols for locale en_NA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_NA = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'NAD'\n};\n\n\n/**\n * Number formatting symbols for locale en_NF.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_NF = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'AUD'\n};\n\n\n/**\n * Number formatting symbols for locale en_NG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_NG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'NGN'\n};\n\n\n/**\n * Number formatting symbols for locale en_NL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_NL = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale en_NR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_NR = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'AUD'\n};\n\n\n/**\n * Number formatting symbols for locale en_NU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_NU = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'NZD'\n};\n\n\n/**\n * Number formatting symbols for locale en_NZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_NZ = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'NZD'\n};\n\n\n/**\n * Number formatting symbols for locale en_PG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_PG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'PGK'\n};\n\n\n/**\n * Number formatting symbols for locale en_PH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_PH = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'PHP'\n};\n\n\n/**\n * Number formatting symbols for locale en_PK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_PK = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'PKR'\n};\n\n\n/**\n * Number formatting symbols for locale en_PN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_PN = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'NZD'\n};\n\n\n/**\n * Number formatting symbols for locale en_PR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_PR = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_PW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_PW = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_RW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_RW = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'RWF'\n};\n\n\n/**\n * Number formatting symbols for locale en_SB.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_SB = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'SBD'\n};\n\n\n/**\n * Number formatting symbols for locale en_SC.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_SC = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'SCR'\n};\n\n\n/**\n * Number formatting symbols for locale en_SD.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_SD = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'SDG'\n};\n\n\n/**\n * Number formatting symbols for locale en_SE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_SE = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: '×10^',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'SEK'\n};\n\n\n/**\n * Number formatting symbols for locale en_SH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_SH = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'SHP'\n};\n\n\n/**\n * Number formatting symbols for locale en_SI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_SI = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'e',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale en_SL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_SL = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'SLL'\n};\n\n\n/**\n * Number formatting symbols for locale en_SS.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_SS = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'SSP'\n};\n\n\n/**\n * Number formatting symbols for locale en_SX.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_SX = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'ANG'\n};\n\n\n/**\n * Number formatting symbols for locale en_SZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_SZ = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'SZL'\n};\n\n\n/**\n * Number formatting symbols for locale en_TC.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_TC = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_TK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_TK = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'NZD'\n};\n\n\n/**\n * Number formatting symbols for locale en_TO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_TO = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'TOP'\n};\n\n\n/**\n * Number formatting symbols for locale en_TT.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_TT = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'TTD'\n};\n\n\n/**\n * Number formatting symbols for locale en_TV.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_TV = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'AUD'\n};\n\n\n/**\n * Number formatting symbols for locale en_TZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_TZ = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'TZS'\n};\n\n\n/**\n * Number formatting symbols for locale en_UG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_UG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'UGX'\n};\n\n\n/**\n * Number formatting symbols for locale en_UM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_UM = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_US_POSIX.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_US_POSIX = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '0/00',\n  INFINITY: 'INF',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '0.######',\n  SCIENTIFIC_PATTERN: '0.000000E+000',\n  PERCENT_PATTERN: '0%',\n  CURRENCY_PATTERN: '¤ 0.00',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale en_VC.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_VC = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'XCD'\n};\n\n\n/**\n * Number formatting symbols for locale en_VG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_VG = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_VI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_VI = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_VU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_VU = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'VUV'\n};\n\n\n/**\n * Number formatting symbols for locale en_WS.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_WS = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'WST'\n};\n\n\n/**\n * Number formatting symbols for locale en_XA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_XA = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_ZM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_ZM = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'ZMW'\n};\n\n\n/**\n * Number formatting symbols for locale en_ZW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_ZW = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale eo.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_eo = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale eo_001.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_eo_001 = goog.i18n.NumberFormatSymbols_eo;\n\n\n/**\n * Number formatting symbols for locale es_AR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_AR = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'ARS'\n};\n\n\n/**\n * Number formatting symbols for locale es_BO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_BO = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'BOB'\n};\n\n\n/**\n * Number formatting symbols for locale es_BR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_BR = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'BRL'\n};\n\n\n/**\n * Number formatting symbols for locale es_BZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_BZ = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'BZD'\n};\n\n\n/**\n * Number formatting symbols for locale es_CL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_CL = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0;¤-#,##0',\n  DEF_CURRENCY_CODE: 'CLP'\n};\n\n\n/**\n * Number formatting symbols for locale es_CO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_CO = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'COP'\n};\n\n\n/**\n * Number formatting symbols for locale es_CR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_CR = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'CRC'\n};\n\n\n/**\n * Number formatting symbols for locale es_CU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_CU = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'CUP'\n};\n\n\n/**\n * Number formatting symbols for locale es_DO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_DO = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'DOP'\n};\n\n\n/**\n * Number formatting symbols for locale es_EA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_EA = goog.i18n.NumberFormatSymbols_es;\n\n\n/**\n * Number formatting symbols for locale es_EC.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_EC = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00;¤-#,##0.00',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale es_GQ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_GQ = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale es_GT.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_GT = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'GTQ'\n};\n\n\n/**\n * Number formatting symbols for locale es_HN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_HN = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'HNL'\n};\n\n\n/**\n * Number formatting symbols for locale es_IC.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_IC = goog.i18n.NumberFormatSymbols_es;\n\n\n/**\n * Number formatting symbols for locale es_NI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_NI = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'NIO'\n};\n\n\n/**\n * Number formatting symbols for locale es_PA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_PA = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'PAB'\n};\n\n\n/**\n * Number formatting symbols for locale es_PE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_PE = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'PEN'\n};\n\n\n/**\n * Number formatting symbols for locale es_PH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_PH = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'PHP'\n};\n\n\n/**\n * Number formatting symbols for locale es_PR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_PR = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale es_PY.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_PY = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤ #,##0;¤ -#,##0',\n  DEF_CURRENCY_CODE: 'PYG'\n};\n\n\n/**\n * Number formatting symbols for locale es_SV.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_SV = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale es_UY.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_UY = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'UYU'\n};\n\n\n/**\n * Number formatting symbols for locale es_VE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_VE = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00;¤-#,##0.00',\n  DEF_CURRENCY_CODE: 'VES'\n};\n\n\n/**\n * Number formatting symbols for locale et_EE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_et_EE = goog.i18n.NumberFormatSymbols_et;\n\n\n/**\n * Number formatting symbols for locale eu_ES.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_eu_ES = goog.i18n.NumberFormatSymbols_eu;\n\n\n/**\n * Number formatting symbols for locale ewo.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ewo = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale ewo_CM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ewo_CM = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale fa_AF.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fa_AF = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎−',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ناعدد',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'AFN'\n};\n\n\n/**\n * Number formatting symbols for locale fa_AF_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fa_AF_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ناعدد',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'AFN'\n};\n\n\n/**\n * Number formatting symbols for locale fa_IR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fa_IR = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎−',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ناعدد',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '‎¤#,##0',\n  DEF_CURRENCY_CODE: 'IRR'\n};\n\n\n/**\n * Number formatting symbols for locale fa_IR_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fa_IR_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ناعدد',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '‎¤ #,##0',\n  DEF_CURRENCY_CODE: 'IRR'\n};\n\n\n/**\n * Number formatting symbols for locale ff.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ff = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale ff_Latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ff_Latn = goog.i18n.NumberFormatSymbols_ff;\n\n\n/**\n * Number formatting symbols for locale ff_Latn_BF.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ff_Latn_BF = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale ff_Latn_CM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ff_Latn_CM = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale ff_Latn_GH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ff_Latn_GH = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'GHS'\n};\n\n\n/**\n * Number formatting symbols for locale ff_Latn_GM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ff_Latn_GM = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'GMD'\n};\n\n\n/**\n * Number formatting symbols for locale ff_Latn_GN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ff_Latn_GN = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'GNF'\n};\n\n\n/**\n * Number formatting symbols for locale ff_Latn_GW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ff_Latn_GW = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale ff_Latn_LR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ff_Latn_LR = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'LRD'\n};\n\n\n/**\n * Number formatting symbols for locale ff_Latn_MR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ff_Latn_MR = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'MRU'\n};\n\n\n/**\n * Number formatting symbols for locale ff_Latn_NE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ff_Latn_NE = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale ff_Latn_NG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ff_Latn_NG = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'NGN'\n};\n\n\n/**\n * Number formatting symbols for locale ff_Latn_SL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ff_Latn_SL = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'SLL'\n};\n\n\n/**\n * Number formatting symbols for locale ff_Latn_SN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ff_Latn_SN = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale fi_FI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fi_FI = goog.i18n.NumberFormatSymbols_fi;\n\n\n/**\n * Number formatting symbols for locale fil_PH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fil_PH = goog.i18n.NumberFormatSymbols_fil;\n\n\n/**\n * Number formatting symbols for locale fo.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fo = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'DKK'\n};\n\n\n/**\n * Number formatting symbols for locale fo_DK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fo_DK = goog.i18n.NumberFormatSymbols_fo;\n\n\n/**\n * Number formatting symbols for locale fo_FO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fo_FO = goog.i18n.NumberFormatSymbols_fo;\n\n\n/**\n * Number formatting symbols for locale fr_BE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_BE = goog.i18n.NumberFormatSymbols_fr;\n\n\n/**\n * Number formatting symbols for locale fr_BF.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_BF = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_BI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_BI = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'BIF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_BJ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_BJ = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_BL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_BL = goog.i18n.NumberFormatSymbols_fr;\n\n\n/**\n * Number formatting symbols for locale fr_CD.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_CD = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'CDF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_CF.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_CF = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_CG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_CG = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_CH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_CH = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'CHF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_CI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_CI = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_CM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_CM = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_DJ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_DJ = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'DJF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_DZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_DZ = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'DZD'\n};\n\n\n/**\n * Number formatting symbols for locale fr_FR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_FR = goog.i18n.NumberFormatSymbols_fr;\n\n\n/**\n * Number formatting symbols for locale fr_GA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_GA = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_GF.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_GF = goog.i18n.NumberFormatSymbols_fr;\n\n\n/**\n * Number formatting symbols for locale fr_GN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_GN = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'GNF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_GP.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_GP = goog.i18n.NumberFormatSymbols_fr;\n\n\n/**\n * Number formatting symbols for locale fr_GQ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_GQ = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_HT.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_HT = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'HTG'\n};\n\n\n/**\n * Number formatting symbols for locale fr_KM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_KM = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'KMF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_LU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_LU = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale fr_MA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_MA = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'MAD'\n};\n\n\n/**\n * Number formatting symbols for locale fr_MC.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_MC = goog.i18n.NumberFormatSymbols_fr;\n\n\n/**\n * Number formatting symbols for locale fr_MF.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_MF = goog.i18n.NumberFormatSymbols_fr;\n\n\n/**\n * Number formatting symbols for locale fr_MG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_MG = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'MGA'\n};\n\n\n/**\n * Number formatting symbols for locale fr_ML.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_ML = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_MQ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_MQ = goog.i18n.NumberFormatSymbols_fr;\n\n\n/**\n * Number formatting symbols for locale fr_MR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_MR = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'MRU'\n};\n\n\n/**\n * Number formatting symbols for locale fr_MU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_MU = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'MUR'\n};\n\n\n/**\n * Number formatting symbols for locale fr_NC.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_NC = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XPF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_NE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_NE = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_PF.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_PF = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XPF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_PM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_PM = goog.i18n.NumberFormatSymbols_fr;\n\n\n/**\n * Number formatting symbols for locale fr_RE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_RE = goog.i18n.NumberFormatSymbols_fr;\n\n\n/**\n * Number formatting symbols for locale fr_RW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_RW = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'RWF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_SC.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_SC = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'SCR'\n};\n\n\n/**\n * Number formatting symbols for locale fr_SN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_SN = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_SY.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_SY = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'SYP'\n};\n\n\n/**\n * Number formatting symbols for locale fr_TD.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_TD = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_TG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_TG = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_TN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_TN = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.000 ¤',\n  DEF_CURRENCY_CODE: 'TND'\n};\n\n\n/**\n * Number formatting symbols for locale fr_VU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_VU = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'VUV'\n};\n\n\n/**\n * Number formatting symbols for locale fr_WF.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_WF = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XPF'\n};\n\n\n/**\n * Number formatting symbols for locale fr_YT.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_YT = goog.i18n.NumberFormatSymbols_fr;\n\n\n/**\n * Number formatting symbols for locale fur.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fur = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale fur_IT.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fur_IT = goog.i18n.NumberFormatSymbols_fur;\n\n\n/**\n * Number formatting symbols for locale fy.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fy = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00;¤ #,##0.00-',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale fy_NL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fy_NL = goog.i18n.NumberFormatSymbols_fy;\n\n\n/**\n * Number formatting symbols for locale ga_IE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ga_IE = goog.i18n.NumberFormatSymbols_ga;\n\n\n/**\n * Number formatting symbols for locale gd.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_gd = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'GBP'\n};\n\n\n/**\n * Number formatting symbols for locale gd_GB.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_gd_GB = goog.i18n.NumberFormatSymbols_gd;\n\n\n/**\n * Number formatting symbols for locale gl_ES.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_gl_ES = goog.i18n.NumberFormatSymbols_gl;\n\n\n/**\n * Number formatting symbols for locale gsw_CH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_gsw_CH = goog.i18n.NumberFormatSymbols_gsw;\n\n\n/**\n * Number formatting symbols for locale gsw_FR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_gsw_FR = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: '’',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale gsw_LI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_gsw_LI = goog.i18n.NumberFormatSymbols_gsw;\n\n\n/**\n * Number formatting symbols for locale gu_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_gu_IN = goog.i18n.NumberFormatSymbols_gu;\n\n\n/**\n * Number formatting symbols for locale guz.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_guz = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale guz_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_guz_KE = goog.i18n.NumberFormatSymbols_guz;\n\n\n/**\n * Number formatting symbols for locale gv.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_gv = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'GBP'\n};\n\n\n/**\n * Number formatting symbols for locale gv_IM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_gv_IM = goog.i18n.NumberFormatSymbols_gv;\n\n\n/**\n * Number formatting symbols for locale ha.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ha = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'NGN'\n};\n\n\n/**\n * Number formatting symbols for locale ha_GH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ha_GH = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'GHS'\n};\n\n\n/**\n * Number formatting symbols for locale ha_NE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ha_NE = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale ha_NG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ha_NG = goog.i18n.NumberFormatSymbols_ha;\n\n\n/**\n * Number formatting symbols for locale haw_US.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_haw_US = goog.i18n.NumberFormatSymbols_haw;\n\n\n/**\n * Number formatting symbols for locale he_IL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_he_IL = goog.i18n.NumberFormatSymbols_he;\n\n\n/**\n * Number formatting symbols for locale hi_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_hi_IN = goog.i18n.NumberFormatSymbols_hi;\n\n\n/**\n * Number formatting symbols for locale hr_BA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_hr_BA = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'BAM'\n};\n\n\n/**\n * Number formatting symbols for locale hr_HR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_hr_HR = goog.i18n.NumberFormatSymbols_hr;\n\n\n/**\n * Number formatting symbols for locale hsb.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_hsb = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale hsb_DE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_hsb_DE = goog.i18n.NumberFormatSymbols_hsb;\n\n\n/**\n * Number formatting symbols for locale hu_HU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_hu_HU = goog.i18n.NumberFormatSymbols_hu;\n\n\n/**\n * Number formatting symbols for locale hy_AM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_hy_AM = goog.i18n.NumberFormatSymbols_hy;\n\n\n/**\n * Number formatting symbols for locale ia.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ia = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale ia_001.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ia_001 = goog.i18n.NumberFormatSymbols_ia;\n\n\n/**\n * Number formatting symbols for locale id_ID.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_id_ID = goog.i18n.NumberFormatSymbols_id;\n\n\n/**\n * Number formatting symbols for locale ig.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ig = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'NGN'\n};\n\n\n/**\n * Number formatting symbols for locale ig_NG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ig_NG = goog.i18n.NumberFormatSymbols_ig;\n\n\n/**\n * Number formatting symbols for locale ii.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ii = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'CNY'\n};\n\n\n/**\n * Number formatting symbols for locale ii_CN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ii_CN = goog.i18n.NumberFormatSymbols_ii;\n\n\n/**\n * Number formatting symbols for locale is_IS.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_is_IS = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'ISK'\n};\n\n\n/**\n * Number formatting symbols for locale it_CH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_it_CH = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: '’',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00;¤-#,##0.00',\n  DEF_CURRENCY_CODE: 'CHF'\n};\n\n\n/**\n * Number formatting symbols for locale it_IT.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_it_IT = goog.i18n.NumberFormatSymbols_it;\n\n\n/**\n * Number formatting symbols for locale it_SM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_it_SM = goog.i18n.NumberFormatSymbols_it;\n\n\n/**\n * Number formatting symbols for locale it_VA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_it_VA = goog.i18n.NumberFormatSymbols_it;\n\n\n/**\n * Number formatting symbols for locale ja_JP.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ja_JP = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'JPY'\n};\n\n\n/**\n * Number formatting symbols for locale jgo.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_jgo = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale jgo_CM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_jgo_CM = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale jmc.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_jmc = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'TZS'\n};\n\n\n/**\n * Number formatting symbols for locale jmc_TZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_jmc_TZ = goog.i18n.NumberFormatSymbols_jmc;\n\n\n/**\n * Number formatting symbols for locale jv.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_jv = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'IDR'\n};\n\n\n/**\n * Number formatting symbols for locale jv_ID.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_jv_ID = goog.i18n.NumberFormatSymbols_jv;\n\n\n/**\n * Number formatting symbols for locale ka_GE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ka_GE = goog.i18n.NumberFormatSymbols_ka;\n\n\n/**\n * Number formatting symbols for locale kab.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kab = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'DZD'\n};\n\n\n/**\n * Number formatting symbols for locale kab_DZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kab_DZ = goog.i18n.NumberFormatSymbols_kab;\n\n\n/**\n * Number formatting symbols for locale kam.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kam = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale kam_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kam_KE = goog.i18n.NumberFormatSymbols_kam;\n\n\n/**\n * Number formatting symbols for locale kde.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kde = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'TZS'\n};\n\n\n/**\n * Number formatting symbols for locale kde_TZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kde_TZ = goog.i18n.NumberFormatSymbols_kde;\n\n\n/**\n * Number formatting symbols for locale kea.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kea = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'CVE'\n};\n\n\n/**\n * Number formatting symbols for locale kea_CV.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kea_CV = goog.i18n.NumberFormatSymbols_kea;\n\n\n/**\n * Number formatting symbols for locale khq.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_khq = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale khq_ML.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_khq_ML = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale ki.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ki = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale ki_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ki_KE = goog.i18n.NumberFormatSymbols_ki;\n\n\n/**\n * Number formatting symbols for locale kk_KZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kk_KZ = goog.i18n.NumberFormatSymbols_kk;\n\n\n/**\n * Number formatting symbols for locale kkj.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kkj = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale kkj_CM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kkj_CM = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale kl.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kl = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00;¤-#,##0.00',\n  DEF_CURRENCY_CODE: 'DKK'\n};\n\n\n/**\n * Number formatting symbols for locale kl_GL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kl_GL = goog.i18n.NumberFormatSymbols_kl;\n\n\n/**\n * Number formatting symbols for locale kln.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kln = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale kln_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kln_KE = goog.i18n.NumberFormatSymbols_kln;\n\n\n/**\n * Number formatting symbols for locale km_KH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_km_KH = goog.i18n.NumberFormatSymbols_km;\n\n\n/**\n * Number formatting symbols for locale kn_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kn_IN = goog.i18n.NumberFormatSymbols_kn;\n\n\n/**\n * Number formatting symbols for locale ko_KP.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ko_KP = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'KPW'\n};\n\n\n/**\n * Number formatting symbols for locale ko_KR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ko_KR = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'KRW'\n};\n\n\n/**\n * Number formatting symbols for locale kok.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kok = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '¤ #,##,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale kok_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kok_IN = goog.i18n.NumberFormatSymbols_kok;\n\n\n/**\n * Number formatting symbols for locale ks.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ks = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+‎',\n  MINUS_SIGN: '‎-‎',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '¤ #,##,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale ks_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ks_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '¤ #,##,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale ks_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ks_IN = goog.i18n.NumberFormatSymbols_ks;\n\n\n/**\n * Number formatting symbols for locale ks_IN_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ks_IN_u_nu_latn = goog.i18n.NumberFormatSymbols_ks_u_nu_latn;\n\n\n/**\n * Number formatting symbols for locale ksb.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ksb = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'TZS'\n};\n\n\n/**\n * Number formatting symbols for locale ksb_TZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ksb_TZ = goog.i18n.NumberFormatSymbols_ksb;\n\n\n/**\n * Number formatting symbols for locale ksf.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ksf = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale ksf_CM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ksf_CM = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale ksh.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ksh = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: '×10^',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale ksh_DE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ksh_DE = goog.i18n.NumberFormatSymbols_ksh;\n\n\n/**\n * Number formatting symbols for locale ku.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ku = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '%#,##0',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'TRY'\n};\n\n\n/**\n * Number formatting symbols for locale ku_TR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ku_TR = goog.i18n.NumberFormatSymbols_ku;\n\n\n/**\n * Number formatting symbols for locale kw.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kw = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'GBP'\n};\n\n\n/**\n * Number formatting symbols for locale kw_GB.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kw_GB = goog.i18n.NumberFormatSymbols_kw;\n\n\n/**\n * Number formatting symbols for locale ky_KG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ky_KG = goog.i18n.NumberFormatSymbols_ky;\n\n\n/**\n * Number formatting symbols for locale lag.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lag = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'TZS'\n};\n\n\n/**\n * Number formatting symbols for locale lag_TZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lag_TZ = goog.i18n.NumberFormatSymbols_lag;\n\n\n/**\n * Number formatting symbols for locale lb.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lb = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale lb_LU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lb_LU = goog.i18n.NumberFormatSymbols_lb;\n\n\n/**\n * Number formatting symbols for locale lg.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lg = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'UGX'\n};\n\n\n/**\n * Number formatting symbols for locale lg_UG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lg_UG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0¤',\n  DEF_CURRENCY_CODE: 'UGX'\n};\n\n\n/**\n * Number formatting symbols for locale lkt.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lkt = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale lkt_US.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lkt_US = goog.i18n.NumberFormatSymbols_lkt;\n\n\n/**\n * Number formatting symbols for locale ln_AO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ln_AO = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'AOA'\n};\n\n\n/**\n * Number formatting symbols for locale ln_CD.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ln_CD = goog.i18n.NumberFormatSymbols_ln;\n\n\n/**\n * Number formatting symbols for locale ln_CF.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ln_CF = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale ln_CG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ln_CG = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale lo_LA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lo_LA = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ບໍ່​ແມ່ນ​ໂຕ​ເລກ',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0;¤-#,##0',\n  DEF_CURRENCY_CODE: 'LAK'\n};\n\n\n/**\n * Number formatting symbols for locale lrc.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lrc = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+‎',\n  MINUS_SIGN: '‎-‎',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'IRR'\n};\n\n\n/**\n * Number formatting symbols for locale lrc_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lrc_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'IRR'\n};\n\n\n/**\n * Number formatting symbols for locale lrc_IQ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lrc_IQ = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+‎',\n  MINUS_SIGN: '‎-‎',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'IQD'\n};\n\n\n/**\n * Number formatting symbols for locale lrc_IQ_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lrc_IQ_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'IQD'\n};\n\n\n/**\n * Number formatting symbols for locale lrc_IR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lrc_IR = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+‎',\n  MINUS_SIGN: '‎-‎',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'IRR'\n};\n\n\n/**\n * Number formatting symbols for locale lrc_IR_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lrc_IR_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'IRR'\n};\n\n\n/**\n * Number formatting symbols for locale lt_LT.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lt_LT = goog.i18n.NumberFormatSymbols_lt;\n\n\n/**\n * Number formatting symbols for locale lu.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lu = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'CDF'\n};\n\n\n/**\n * Number formatting symbols for locale lu_CD.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lu_CD = goog.i18n.NumberFormatSymbols_lu;\n\n\n/**\n * Number formatting symbols for locale luo.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_luo = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale luo_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_luo_KE = goog.i18n.NumberFormatSymbols_luo;\n\n\n/**\n * Number formatting symbols for locale luy.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_luy = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00;¤- #,##0.00',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale luy_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_luy_KE = goog.i18n.NumberFormatSymbols_luy;\n\n\n/**\n * Number formatting symbols for locale lv_LV.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lv_LV = goog.i18n.NumberFormatSymbols_lv;\n\n\n/**\n * Number formatting symbols for locale mas.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mas = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale mas_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mas_KE = goog.i18n.NumberFormatSymbols_mas;\n\n\n/**\n * Number formatting symbols for locale mas_TZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mas_TZ = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'TZS'\n};\n\n\n/**\n * Number formatting symbols for locale mer.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mer = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale mer_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mer_KE = goog.i18n.NumberFormatSymbols_mer;\n\n\n/**\n * Number formatting symbols for locale mfe.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mfe = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'MUR'\n};\n\n\n/**\n * Number formatting symbols for locale mfe_MU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mfe_MU = goog.i18n.NumberFormatSymbols_mfe;\n\n\n/**\n * Number formatting symbols for locale mg.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mg = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'MGA'\n};\n\n\n/**\n * Number formatting symbols for locale mg_MG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mg_MG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'MGA'\n};\n\n\n/**\n * Number formatting symbols for locale mgh.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mgh = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'MZN'\n};\n\n\n/**\n * Number formatting symbols for locale mgh_MZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mgh_MZ = goog.i18n.NumberFormatSymbols_mgh;\n\n\n/**\n * Number formatting symbols for locale mgo.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mgo = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale mgo_CM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mgo_CM = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale mi.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mi = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'NZD'\n};\n\n\n/**\n * Number formatting symbols for locale mi_NZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mi_NZ = goog.i18n.NumberFormatSymbols_mi;\n\n\n/**\n * Number formatting symbols for locale mk_MK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mk_MK = goog.i18n.NumberFormatSymbols_mk;\n\n\n/**\n * Number formatting symbols for locale ml_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ml_IN = goog.i18n.NumberFormatSymbols_ml;\n\n\n/**\n * Number formatting symbols for locale mn_MN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mn_MN = goog.i18n.NumberFormatSymbols_mn;\n\n\n/**\n * Number formatting symbols for locale mr_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mr_IN = goog.i18n.NumberFormatSymbols_mr;\n\n\n/**\n * Number formatting symbols for locale mr_IN_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mr_IN_u_nu_latn = goog.i18n.NumberFormatSymbols_mr_u_nu_latn;\n\n\n/**\n * Number formatting symbols for locale ms_BN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ms_BN = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'BND'\n};\n\n\n/**\n * Number formatting symbols for locale ms_MY.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ms_MY = goog.i18n.NumberFormatSymbols_ms;\n\n\n/**\n * Number formatting symbols for locale ms_SG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ms_SG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'SGD'\n};\n\n\n/**\n * Number formatting symbols for locale mt_MT.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mt_MT = goog.i18n.NumberFormatSymbols_mt;\n\n\n/**\n * Number formatting symbols for locale mua.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mua = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale mua_CM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mua_CM = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale my_MM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_my_MM = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '၀',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ဂဏန်းမဟုတ်သော',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'MMK'\n};\n\n\n/**\n * Number formatting symbols for locale my_MM_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_my_MM_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ဂဏန်းမဟုတ်သော',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'MMK'\n};\n\n\n/**\n * Number formatting symbols for locale mzn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mzn = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+‎',\n  MINUS_SIGN: '‎-‎',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'IRR'\n};\n\n\n/**\n * Number formatting symbols for locale mzn_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mzn_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'IRR'\n};\n\n\n/**\n * Number formatting symbols for locale mzn_IR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mzn_IR = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+‎',\n  MINUS_SIGN: '‎-‎',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'IRR'\n};\n\n\n/**\n * Number formatting symbols for locale mzn_IR_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mzn_IR_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'IRR'\n};\n\n\n/**\n * Number formatting symbols for locale naq.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_naq = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'NAD'\n};\n\n\n/**\n * Number formatting symbols for locale naq_NA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_naq_NA = goog.i18n.NumberFormatSymbols_naq;\n\n\n/**\n * Number formatting symbols for locale nb_NO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nb_NO = goog.i18n.NumberFormatSymbols_nb;\n\n\n/**\n * Number formatting symbols for locale nb_SJ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nb_SJ = goog.i18n.NumberFormatSymbols_nb;\n\n\n/**\n * Number formatting symbols for locale nd.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nd = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale nd_ZW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nd_ZW = goog.i18n.NumberFormatSymbols_nd;\n\n\n/**\n * Number formatting symbols for locale nds.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nds = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale nds_DE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nds_DE = goog.i18n.NumberFormatSymbols_nds;\n\n\n/**\n * Number formatting symbols for locale nds_NL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nds_NL = goog.i18n.NumberFormatSymbols_nds;\n\n\n/**\n * Number formatting symbols for locale ne_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ne_IN = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '०',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale ne_IN_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ne_IN_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale ne_NP.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ne_NP = goog.i18n.NumberFormatSymbols_ne;\n\n\n/**\n * Number formatting symbols for locale ne_NP_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ne_NP_u_nu_latn = goog.i18n.NumberFormatSymbols_ne_u_nu_latn;\n\n\n/**\n * Number formatting symbols for locale nl_AW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nl_AW = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00;¤ -#,##0.00',\n  DEF_CURRENCY_CODE: 'AWG'\n};\n\n\n/**\n * Number formatting symbols for locale nl_BE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nl_BE = goog.i18n.NumberFormatSymbols_nl;\n\n\n/**\n * Number formatting symbols for locale nl_BQ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nl_BQ = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00;¤ -#,##0.00',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale nl_CW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nl_CW = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00;¤ -#,##0.00',\n  DEF_CURRENCY_CODE: 'ANG'\n};\n\n\n/**\n * Number formatting symbols for locale nl_NL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nl_NL = goog.i18n.NumberFormatSymbols_nl;\n\n\n/**\n * Number formatting symbols for locale nl_SR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nl_SR = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00;¤ -#,##0.00',\n  DEF_CURRENCY_CODE: 'SRD'\n};\n\n\n/**\n * Number formatting symbols for locale nl_SX.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nl_SX = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00;¤ -#,##0.00',\n  DEF_CURRENCY_CODE: 'ANG'\n};\n\n\n/**\n * Number formatting symbols for locale nmg.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nmg = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale nmg_CM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nmg_CM = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale nn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nn = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'NOK'\n};\n\n\n/**\n * Number formatting symbols for locale nn_NO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nn_NO = goog.i18n.NumberFormatSymbols_nn;\n\n\n/**\n * Number formatting symbols for locale nnh.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nnh = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale nnh_CM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nnh_CM = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale nus.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nus = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'SSP'\n};\n\n\n/**\n * Number formatting symbols for locale nus_SS.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nus_SS = goog.i18n.NumberFormatSymbols_nus;\n\n\n/**\n * Number formatting symbols for locale nyn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nyn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'UGX'\n};\n\n\n/**\n * Number formatting symbols for locale nyn_UG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nyn_UG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'UGX'\n};\n\n\n/**\n * Number formatting symbols for locale om.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_om = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'ETB'\n};\n\n\n/**\n * Number formatting symbols for locale om_ET.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_om_ET = goog.i18n.NumberFormatSymbols_om;\n\n\n/**\n * Number formatting symbols for locale om_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_om_KE = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale or_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_or_IN = goog.i18n.NumberFormatSymbols_or;\n\n\n/**\n * Number formatting symbols for locale os.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_os = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'НН',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'GEL'\n};\n\n\n/**\n * Number formatting symbols for locale os_GE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_os_GE = goog.i18n.NumberFormatSymbols_os;\n\n\n/**\n * Number formatting symbols for locale os_RU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_os_RU = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'НН',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'RUB'\n};\n\n\n/**\n * Number formatting symbols for locale pa_Arab.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pa_Arab = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+‎',\n  MINUS_SIGN: '‎-‎',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'PKR'\n};\n\n\n/**\n * Number formatting symbols for locale pa_Arab_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pa_Arab_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'PKR'\n};\n\n\n/**\n * Number formatting symbols for locale pa_Arab_PK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pa_Arab_PK = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+‎',\n  MINUS_SIGN: '‎-‎',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'PKR'\n};\n\n\n/**\n * Number formatting symbols for locale pa_Arab_PK_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pa_Arab_PK_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'PKR'\n};\n\n\n/**\n * Number formatting symbols for locale pa_Guru.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pa_Guru = goog.i18n.NumberFormatSymbols_pa;\n\n\n/**\n * Number formatting symbols for locale pa_Guru_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pa_Guru_IN = goog.i18n.NumberFormatSymbols_pa;\n\n\n/**\n * Number formatting symbols for locale pl_PL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pl_PL = goog.i18n.NumberFormatSymbols_pl;\n\n\n/**\n * Number formatting symbols for locale ps.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ps = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+‎',\n  MINUS_SIGN: '‎-‎',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'AFN'\n};\n\n\n/**\n * Number formatting symbols for locale ps_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ps_u_nu_latn = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'AFN'\n};\n\n\n/**\n * Number formatting symbols for locale ps_AF.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ps_AF = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+‎',\n  MINUS_SIGN: '‎-‎',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'AFN'\n};\n\n\n/**\n * Number formatting symbols for locale ps_AF_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ps_AF_u_nu_latn = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'AFN'\n};\n\n\n/**\n * Number formatting symbols for locale ps_PK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ps_PK = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+‎',\n  MINUS_SIGN: '‎-‎',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'PKR'\n};\n\n\n/**\n * Number formatting symbols for locale ps_PK_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ps_PK_u_nu_latn = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'PKR'\n};\n\n\n/**\n * Number formatting symbols for locale pt_AO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pt_AO = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'AOA'\n};\n\n\n/**\n * Number formatting symbols for locale pt_CH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pt_CH = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'CHF'\n};\n\n\n/**\n * Number formatting symbols for locale pt_CV.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pt_CV = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'CVE'\n};\n\n\n/**\n * Number formatting symbols for locale pt_GQ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pt_GQ = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale pt_GW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pt_GW = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale pt_LU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pt_LU = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale pt_MO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pt_MO = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'MOP'\n};\n\n\n/**\n * Number formatting symbols for locale pt_MZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pt_MZ = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'MZN'\n};\n\n\n/**\n * Number formatting symbols for locale pt_ST.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pt_ST = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'STN'\n};\n\n\n/**\n * Number formatting symbols for locale pt_TL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pt_TL = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale qu.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_qu = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'PEN'\n};\n\n\n/**\n * Number formatting symbols for locale qu_BO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_qu_BO = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'BOB'\n};\n\n\n/**\n * Number formatting symbols for locale qu_EC.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_qu_EC = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale qu_PE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_qu_PE = goog.i18n.NumberFormatSymbols_qu;\n\n\n/**\n * Number formatting symbols for locale rm.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_rm = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: '’',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'CHF'\n};\n\n\n/**\n * Number formatting symbols for locale rm_CH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_rm_CH = goog.i18n.NumberFormatSymbols_rm;\n\n\n/**\n * Number formatting symbols for locale rn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_rn = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'BIF'\n};\n\n\n/**\n * Number formatting symbols for locale rn_BI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_rn_BI = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0¤',\n  DEF_CURRENCY_CODE: 'BIF'\n};\n\n\n/**\n * Number formatting symbols for locale ro_MD.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ro_MD = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'MDL'\n};\n\n\n/**\n * Number formatting symbols for locale ro_RO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ro_RO = goog.i18n.NumberFormatSymbols_ro;\n\n\n/**\n * Number formatting symbols for locale rof.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_rof = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'TZS'\n};\n\n\n/**\n * Number formatting symbols for locale rof_TZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_rof_TZ = goog.i18n.NumberFormatSymbols_rof;\n\n\n/**\n * Number formatting symbols for locale ru_BY.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ru_BY = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'не число',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'BYN'\n};\n\n\n/**\n * Number formatting symbols for locale ru_KG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ru_KG = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'не число',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'KGS'\n};\n\n\n/**\n * Number formatting symbols for locale ru_KZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ru_KZ = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'не число',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'KZT'\n};\n\n\n/**\n * Number formatting symbols for locale ru_MD.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ru_MD = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'не число',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'MDL'\n};\n\n\n/**\n * Number formatting symbols for locale ru_RU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ru_RU = goog.i18n.NumberFormatSymbols_ru;\n\n\n/**\n * Number formatting symbols for locale ru_UA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ru_UA = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'не число',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'UAH'\n};\n\n\n/**\n * Number formatting symbols for locale rw.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_rw = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'RWF'\n};\n\n\n/**\n * Number formatting symbols for locale rw_RW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_rw_RW = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'RWF'\n};\n\n\n/**\n * Number formatting symbols for locale rwk.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_rwk = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'TZS'\n};\n\n\n/**\n * Number formatting symbols for locale rwk_TZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_rwk_TZ = goog.i18n.NumberFormatSymbols_rwk;\n\n\n/**\n * Number formatting symbols for locale sah.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sah = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'чыыһыла буотах',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'RUB'\n};\n\n\n/**\n * Number formatting symbols for locale sah_RU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sah_RU = goog.i18n.NumberFormatSymbols_sah;\n\n\n/**\n * Number formatting symbols for locale saq.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_saq = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale saq_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_saq_KE = goog.i18n.NumberFormatSymbols_saq;\n\n\n/**\n * Number formatting symbols for locale sbp.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sbp = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'TZS'\n};\n\n\n/**\n * Number formatting symbols for locale sbp_TZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sbp_TZ = goog.i18n.NumberFormatSymbols_sbp;\n\n\n/**\n * Number formatting symbols for locale sd.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sd = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'PKR'\n};\n\n\n/**\n * Number formatting symbols for locale sd_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sd_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'PKR'\n};\n\n\n/**\n * Number formatting symbols for locale sd_PK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sd_PK = goog.i18n.NumberFormatSymbols_sd;\n\n\n/**\n * Number formatting symbols for locale sd_PK_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sd_PK_u_nu_latn = goog.i18n.NumberFormatSymbols_sd_u_nu_latn;\n\n\n/**\n * Number formatting symbols for locale se.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_se = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: '·10^',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'NOK'\n};\n\n\n/**\n * Number formatting symbols for locale se_FI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_se_FI = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: '·10^',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale se_NO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_se_NO = goog.i18n.NumberFormatSymbols_se;\n\n\n/**\n * Number formatting symbols for locale se_SE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_se_SE = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: '·10^',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'SEK'\n};\n\n\n/**\n * Number formatting symbols for locale seh.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_seh = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'MZN'\n};\n\n\n/**\n * Number formatting symbols for locale seh_MZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_seh_MZ = goog.i18n.NumberFormatSymbols_seh;\n\n\n/**\n * Number formatting symbols for locale ses.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ses = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale ses_ML.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ses_ML = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale sg.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sg = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00;¤-#,##0.00',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale sg_CF.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sg_CF = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0;¤-#,##0',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale shi.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_shi = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'MAD'\n};\n\n\n/**\n * Number formatting symbols for locale shi_Latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_shi_Latn = goog.i18n.NumberFormatSymbols_shi;\n\n\n/**\n * Number formatting symbols for locale shi_Latn_MA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_shi_Latn_MA = goog.i18n.NumberFormatSymbols_shi;\n\n\n/**\n * Number formatting symbols for locale shi_Tfng.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_shi_Tfng = goog.i18n.NumberFormatSymbols_shi;\n\n\n/**\n * Number formatting symbols for locale shi_Tfng_MA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_shi_Tfng_MA = goog.i18n.NumberFormatSymbols_shi;\n\n\n/**\n * Number formatting symbols for locale si_LK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_si_LK = goog.i18n.NumberFormatSymbols_si;\n\n\n/**\n * Number formatting symbols for locale sk_SK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sk_SK = goog.i18n.NumberFormatSymbols_sk;\n\n\n/**\n * Number formatting symbols for locale sl_SI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sl_SI = goog.i18n.NumberFormatSymbols_sl;\n\n\n/**\n * Number formatting symbols for locale smn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_smn = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'epiloho',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale smn_FI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_smn_FI = goog.i18n.NumberFormatSymbols_smn;\n\n\n/**\n * Number formatting symbols for locale sn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale sn_ZW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sn_ZW = goog.i18n.NumberFormatSymbols_sn;\n\n\n/**\n * Number formatting symbols for locale so.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_so = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'MaL',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'SOS'\n};\n\n\n/**\n * Number formatting symbols for locale so_DJ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_so_DJ = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'MaL',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'DJF'\n};\n\n\n/**\n * Number formatting symbols for locale so_ET.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_so_ET = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'MaL',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'ETB'\n};\n\n\n/**\n * Number formatting symbols for locale so_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_so_KE = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'MaL',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale so_SO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_so_SO = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'MaL',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'SOS'\n};\n\n\n/**\n * Number formatting symbols for locale sq_AL.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sq_AL = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'ALL'\n};\n\n\n/**\n * Number formatting symbols for locale sq_MK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sq_MK = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'MKD'\n};\n\n\n/**\n * Number formatting symbols for locale sq_XK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sq_XK = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale sr_Cyrl.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sr_Cyrl = goog.i18n.NumberFormatSymbols_sr;\n\n\n/**\n * Number formatting symbols for locale sr_Cyrl_BA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sr_Cyrl_BA = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'BAM'\n};\n\n\n/**\n * Number formatting symbols for locale sr_Cyrl_ME.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sr_Cyrl_ME = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale sr_Cyrl_RS.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sr_Cyrl_RS = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'RSD'\n};\n\n\n/**\n * Number formatting symbols for locale sr_Cyrl_XK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sr_Cyrl_XK = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale sr_Latn_BA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sr_Latn_BA = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'BAM'\n};\n\n\n/**\n * Number formatting symbols for locale sr_Latn_ME.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sr_Latn_ME = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale sr_Latn_RS.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sr_Latn_RS = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'RSD'\n};\n\n\n/**\n * Number formatting symbols for locale sr_Latn_XK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sr_Latn_XK = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale sv_AX.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sv_AX = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: '×10^',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale sv_FI.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sv_FI = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: '×10^',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale sv_SE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sv_SE = goog.i18n.NumberFormatSymbols_sv;\n\n\n/**\n * Number formatting symbols for locale sw_CD.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sw_CD = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'CDF'\n};\n\n\n/**\n * Number formatting symbols for locale sw_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sw_KE = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale sw_TZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sw_TZ = goog.i18n.NumberFormatSymbols_sw;\n\n\n/**\n * Number formatting symbols for locale sw_UG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sw_UG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'UGX'\n};\n\n\n/**\n * Number formatting symbols for locale ta_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ta_IN = goog.i18n.NumberFormatSymbols_ta;\n\n\n/**\n * Number formatting symbols for locale ta_LK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ta_LK = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '¤ #,##,##0.00',\n  DEF_CURRENCY_CODE: 'LKR'\n};\n\n\n/**\n * Number formatting symbols for locale ta_MY.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ta_MY = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'MYR'\n};\n\n\n/**\n * Number formatting symbols for locale ta_SG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ta_SG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'SGD'\n};\n\n\n/**\n * Number formatting symbols for locale te_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_te_IN = goog.i18n.NumberFormatSymbols_te;\n\n\n/**\n * Number formatting symbols for locale teo.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_teo = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'UGX'\n};\n\n\n/**\n * Number formatting symbols for locale teo_KE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_teo_KE = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'KES'\n};\n\n\n/**\n * Number formatting symbols for locale teo_UG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_teo_UG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'UGX'\n};\n\n\n/**\n * Number formatting symbols for locale tg.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_tg = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'TJS'\n};\n\n\n/**\n * Number formatting symbols for locale tg_TJ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_tg_TJ = goog.i18n.NumberFormatSymbols_tg;\n\n\n/**\n * Number formatting symbols for locale th_TH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_th_TH = goog.i18n.NumberFormatSymbols_th;\n\n\n/**\n * Number formatting symbols for locale ti.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ti = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'ETB'\n};\n\n\n/**\n * Number formatting symbols for locale ti_ER.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ti_ER = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'ERN'\n};\n\n\n/**\n * Number formatting symbols for locale ti_ET.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ti_ET = goog.i18n.NumberFormatSymbols_ti;\n\n\n/**\n * Number formatting symbols for locale tk.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_tk = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'san däl',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'TMT'\n};\n\n\n/**\n * Number formatting symbols for locale tk_TM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_tk_TM = goog.i18n.NumberFormatSymbols_tk;\n\n\n/**\n * Number formatting symbols for locale to.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_to = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'TF',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'TOP'\n};\n\n\n/**\n * Number formatting symbols for locale to_TO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_to_TO = goog.i18n.NumberFormatSymbols_to;\n\n\n/**\n * Number formatting symbols for locale tr_CY.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_tr_CY = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '%#,##0',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale tr_TR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_tr_TR = goog.i18n.NumberFormatSymbols_tr;\n\n\n/**\n * Number formatting symbols for locale tt.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_tt = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'RUB'\n};\n\n\n/**\n * Number formatting symbols for locale tt_RU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_tt_RU = goog.i18n.NumberFormatSymbols_tt;\n\n\n/**\n * Number formatting symbols for locale twq.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_twq = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale twq_NE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_twq_NE = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0¤',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale tzm.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_tzm = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'MAD'\n};\n\n\n/**\n * Number formatting symbols for locale tzm_MA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_tzm_MA = goog.i18n.NumberFormatSymbols_tzm;\n\n\n/**\n * Number formatting symbols for locale ug.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ug = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'CNY'\n};\n\n\n/**\n * Number formatting symbols for locale ug_CN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ug_CN = goog.i18n.NumberFormatSymbols_ug;\n\n\n/**\n * Number formatting symbols for locale uk_UA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_uk_UA = goog.i18n.NumberFormatSymbols_uk;\n\n\n/**\n * Number formatting symbols for locale ur_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ur_IN = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '%',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+‎',\n  MINUS_SIGN: '‎-‎',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale ur_IN_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ur_IN_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale ur_PK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ur_PK = goog.i18n.NumberFormatSymbols_ur;\n\n\n/**\n * Number formatting symbols for locale uz_Arab.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_uz_Arab = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+‎',\n  MINUS_SIGN: '‎-‎',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'AFN'\n};\n\n\n/**\n * Number formatting symbols for locale uz_Arab_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_uz_Arab_u_nu_latn = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'AFN'\n};\n\n\n/**\n * Number formatting symbols for locale uz_Arab_AF.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_uz_Arab_AF = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+‎',\n  MINUS_SIGN: '‎-‎',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'AFN'\n};\n\n\n/**\n * Number formatting symbols for locale uz_Arab_AF_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_uz_Arab_AF_u_nu_latn = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'AFN'\n};\n\n\n/**\n * Number formatting symbols for locale uz_Cyrl.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_uz_Cyrl = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ҳақиқий сон эмас',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'UZS'\n};\n\n\n/**\n * Number formatting symbols for locale uz_Cyrl_UZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_uz_Cyrl_UZ = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ҳақиқий сон эмас',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'UZS'\n};\n\n\n/**\n * Number formatting symbols for locale uz_Latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_uz_Latn = goog.i18n.NumberFormatSymbols_uz;\n\n\n/**\n * Number formatting symbols for locale uz_Latn_UZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_uz_Latn_UZ = goog.i18n.NumberFormatSymbols_uz;\n\n\n/**\n * Number formatting symbols for locale vai.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_vai = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'LRD'\n};\n\n\n/**\n * Number formatting symbols for locale vai_Latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_vai_Latn = goog.i18n.NumberFormatSymbols_vai;\n\n\n/**\n * Number formatting symbols for locale vai_Latn_LR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_vai_Latn_LR = goog.i18n.NumberFormatSymbols_vai;\n\n\n/**\n * Number formatting symbols for locale vai_Vaii.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_vai_Vaii = goog.i18n.NumberFormatSymbols_vai;\n\n\n/**\n * Number formatting symbols for locale vai_Vaii_LR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_vai_Vaii_LR = goog.i18n.NumberFormatSymbols_vai;\n\n\n/**\n * Number formatting symbols for locale vi_VN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_vi_VN = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'VND'\n};\n\n\n/**\n * Number formatting symbols for locale vun.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_vun = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'TZS'\n};\n\n\n/**\n * Number formatting symbols for locale vun_TZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_vun_TZ = goog.i18n.NumberFormatSymbols_vun;\n\n\n/**\n * Number formatting symbols for locale wae.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_wae = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '’',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'CHF'\n};\n\n\n/**\n * Number formatting symbols for locale wae_CH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_wae_CH = goog.i18n.NumberFormatSymbols_wae;\n\n\n/**\n * Number formatting symbols for locale wo.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_wo = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale wo_SN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_wo_SN = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale xh.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_xh = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'ZAR'\n};\n\n\n/**\n * Number formatting symbols for locale xh_ZA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_xh_ZA = goog.i18n.NumberFormatSymbols_xh;\n\n\n/**\n * Number formatting symbols for locale xog.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_xog = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'UGX'\n};\n\n\n/**\n * Number formatting symbols for locale xog_UG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_xog_UG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'UGX'\n};\n\n\n/**\n * Number formatting symbols for locale yav.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_yav = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale yav_CM.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_yav_CM = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0 ¤',\n  DEF_CURRENCY_CODE: 'XAF'\n};\n\n\n/**\n * Number formatting symbols for locale yi.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_yi = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale yi_001.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_yi_001 = goog.i18n.NumberFormatSymbols_yi;\n\n\n/**\n * Number formatting symbols for locale yo.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_yo = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'NGN'\n};\n\n\n/**\n * Number formatting symbols for locale yo_BJ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_yo_BJ = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0',\n  DEF_CURRENCY_CODE: 'XOF'\n};\n\n\n/**\n * Number formatting symbols for locale yo_NG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_yo_NG = goog.i18n.NumberFormatSymbols_yo;\n\n\n/**\n * Number formatting symbols for locale yue.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_yue = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: '非數值',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'HKD'\n};\n\n\n/**\n * Number formatting symbols for locale yue_Hans.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_yue_Hans = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: '非数值',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'CNY'\n};\n\n\n/**\n * Number formatting symbols for locale yue_Hans_CN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_yue_Hans_CN = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: '非数值',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'CNY'\n};\n\n\n/**\n * Number formatting symbols for locale yue_Hant.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_yue_Hant = goog.i18n.NumberFormatSymbols_yue;\n\n\n/**\n * Number formatting symbols for locale yue_Hant_HK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_yue_Hant_HK = goog.i18n.NumberFormatSymbols_yue;\n\n\n/**\n * Number formatting symbols for locale zgh.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zgh = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'MAD'\n};\n\n\n/**\n * Number formatting symbols for locale zgh_MA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zgh_MA = goog.i18n.NumberFormatSymbols_zgh;\n\n\n/**\n * Number formatting symbols for locale zh_Hans.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zh_Hans = goog.i18n.NumberFormatSymbols_zh;\n\n\n/**\n * Number formatting symbols for locale zh_Hans_CN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zh_Hans_CN = goog.i18n.NumberFormatSymbols_zh;\n\n\n/**\n * Number formatting symbols for locale zh_Hans_HK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zh_Hans_HK = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'HKD'\n};\n\n\n/**\n * Number formatting symbols for locale zh_Hans_MO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zh_Hans_MO = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'MOP'\n};\n\n\n/**\n * Number formatting symbols for locale zh_Hans_SG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zh_Hans_SG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'SGD'\n};\n\n\n/**\n * Number formatting symbols for locale zh_Hant.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zh_Hant = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: '非數值',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'TWD'\n};\n\n\n/**\n * Number formatting symbols for locale zh_Hant_HK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zh_Hant_HK = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: '非數值',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'HKD'\n};\n\n\n/**\n * Number formatting symbols for locale zh_Hant_MO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zh_Hant_MO = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: '非數值',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'MOP'\n};\n\n\n/**\n * Number formatting symbols for locale zh_Hant_TW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zh_Hant_TW = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: '非數值',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'TWD'\n};\n\n\n/**\n * Number formatting symbols for locale zu_ZA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zu_ZA = goog.i18n.NumberFormatSymbols_zu;\n\n\n/**\n * Selected number formatting symbols by locale.\n */\nswitch (goog.LOCALE) {\n  case 'af_NA':\n  case 'af-NA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_af_NA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_af_NA;\n    break;\n  case 'af_ZA':\n  case 'af-ZA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_af_ZA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_af_ZA;\n    break;\n  case 'agq':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_agq;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_agq;\n    break;\n  case 'agq_CM':\n  case 'agq-CM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_agq_CM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_agq_CM;\n    break;\n  case 'ak':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ak;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ak;\n    break;\n  case 'ak_GH':\n  case 'ak-GH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ak_GH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ak_GH;\n    break;\n  case 'am_ET':\n  case 'am-ET':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_am_ET;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_am_ET;\n    break;\n  case 'ar_001':\n  case 'ar-001':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_001;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_001;\n    break;\n  case 'ar_AE':\n  case 'ar-AE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_AE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_AE_u_nu_latn;\n    break;\n  case 'ar_BH':\n  case 'ar-BH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_BH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_BH_u_nu_latn;\n    break;\n  case 'ar_DJ':\n  case 'ar-DJ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_DJ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_DJ_u_nu_latn;\n    break;\n  case 'ar_EH':\n  case 'ar-EH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_EH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_EH;\n    break;\n  case 'ar_ER':\n  case 'ar-ER':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_ER;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_ER_u_nu_latn;\n    break;\n  case 'ar_IL':\n  case 'ar-IL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_IL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_IL_u_nu_latn;\n    break;\n  case 'ar_IQ':\n  case 'ar-IQ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_IQ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_IQ_u_nu_latn;\n    break;\n  case 'ar_JO':\n  case 'ar-JO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_JO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_JO_u_nu_latn;\n    break;\n  case 'ar_KM':\n  case 'ar-KM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_KM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_KM_u_nu_latn;\n    break;\n  case 'ar_KW':\n  case 'ar-KW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_KW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_KW_u_nu_latn;\n    break;\n  case 'ar_LB':\n  case 'ar-LB':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_LB;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_LB_u_nu_latn;\n    break;\n  case 'ar_LY':\n  case 'ar-LY':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_LY;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_LY;\n    break;\n  case 'ar_MA':\n  case 'ar-MA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_MA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_MA;\n    break;\n  case 'ar_MR':\n  case 'ar-MR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_MR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_MR_u_nu_latn;\n    break;\n  case 'ar_OM':\n  case 'ar-OM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_OM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_OM_u_nu_latn;\n    break;\n  case 'ar_PS':\n  case 'ar-PS':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_PS;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_PS_u_nu_latn;\n    break;\n  case 'ar_QA':\n  case 'ar-QA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_QA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_QA_u_nu_latn;\n    break;\n  case 'ar_SA':\n  case 'ar-SA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_SA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_SA_u_nu_latn;\n    break;\n  case 'ar_SD':\n  case 'ar-SD':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_SD;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_SD_u_nu_latn;\n    break;\n  case 'ar_SO':\n  case 'ar-SO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_SO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_SO_u_nu_latn;\n    break;\n  case 'ar_SS':\n  case 'ar-SS':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_SS;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_SS_u_nu_latn;\n    break;\n  case 'ar_SY':\n  case 'ar-SY':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_SY;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_SY_u_nu_latn;\n    break;\n  case 'ar_TD':\n  case 'ar-TD':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_TD;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_TD_u_nu_latn;\n    break;\n  case 'ar_TN':\n  case 'ar-TN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_TN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_TN;\n    break;\n  case 'ar_XB':\n  case 'ar-XB':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_XB;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_XB;\n    break;\n  case 'ar_YE':\n  case 'ar-YE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_YE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_YE_u_nu_latn;\n    break;\n  case 'as':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_as;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_as_u_nu_latn;\n    break;\n  case 'as_IN':\n  case 'as-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_as_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_as_IN_u_nu_latn;\n    break;\n  case 'asa':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_asa;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_asa;\n    break;\n  case 'asa_TZ':\n  case 'asa-TZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_asa_TZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_asa_TZ;\n    break;\n  case 'ast':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ast;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ast;\n    break;\n  case 'ast_ES':\n  case 'ast-ES':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ast_ES;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ast_ES;\n    break;\n  case 'az_Cyrl':\n  case 'az-Cyrl':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az_Cyrl;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_az_Cyrl;\n    break;\n  case 'az_Cyrl_AZ':\n  case 'az-Cyrl-AZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az_Cyrl_AZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_az_Cyrl_AZ;\n    break;\n  case 'az_Latn':\n  case 'az-Latn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az_Latn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_az_Latn;\n    break;\n  case 'az_Latn_AZ':\n  case 'az-Latn-AZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az_Latn_AZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_az_Latn_AZ;\n    break;\n  case 'bas':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bas;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bas;\n    break;\n  case 'bas_CM':\n  case 'bas-CM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bas_CM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bas_CM;\n    break;\n  case 'be_BY':\n  case 'be-BY':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_be_BY;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_be_BY;\n    break;\n  case 'bem':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bem;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bem;\n    break;\n  case 'bem_ZM':\n  case 'bem-ZM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bem_ZM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bem_ZM;\n    break;\n  case 'bez':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bez;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bez;\n    break;\n  case 'bez_TZ':\n  case 'bez-TZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bez_TZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bez_TZ;\n    break;\n  case 'bg_BG':\n  case 'bg-BG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bg_BG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bg_BG;\n    break;\n  case 'bm':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bm;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bm;\n    break;\n  case 'bm_ML':\n  case 'bm-ML':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bm_ML;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bm_ML;\n    break;\n  case 'bn_BD':\n  case 'bn-BD':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bn_BD;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bn_BD_u_nu_latn;\n    break;\n  case 'bn_IN':\n  case 'bn-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bn_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bn_IN_u_nu_latn;\n    break;\n  case 'bo':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bo;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bo;\n    break;\n  case 'bo_CN':\n  case 'bo-CN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bo_CN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bo_CN;\n    break;\n  case 'bo_IN':\n  case 'bo-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bo_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bo_IN;\n    break;\n  case 'br_FR':\n  case 'br-FR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_br_FR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_br_FR;\n    break;\n  case 'brx':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_brx;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_brx;\n    break;\n  case 'brx_IN':\n  case 'brx-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_brx_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_brx_IN;\n    break;\n  case 'bs_Cyrl':\n  case 'bs-Cyrl':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bs_Cyrl;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bs_Cyrl;\n    break;\n  case 'bs_Cyrl_BA':\n  case 'bs-Cyrl-BA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bs_Cyrl_BA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bs_Cyrl_BA;\n    break;\n  case 'bs_Latn':\n  case 'bs-Latn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bs_Latn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bs_Latn;\n    break;\n  case 'bs_Latn_BA':\n  case 'bs-Latn-BA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bs_Latn_BA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bs_Latn_BA;\n    break;\n  case 'ca_AD':\n  case 'ca-AD':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ca_AD;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ca_AD;\n    break;\n  case 'ca_ES':\n  case 'ca-ES':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ca_ES;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ca_ES;\n    break;\n  case 'ca_FR':\n  case 'ca-FR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ca_FR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ca_FR;\n    break;\n  case 'ca_IT':\n  case 'ca-IT':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ca_IT;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ca_IT;\n    break;\n  case 'ccp':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ccp;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ccp_u_nu_latn;\n    break;\n  case 'ccp_BD':\n  case 'ccp-BD':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ccp_BD;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ccp_BD_u_nu_latn;\n    break;\n  case 'ccp_IN':\n  case 'ccp-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ccp_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ccp_IN_u_nu_latn;\n    break;\n  case 'ce':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ce;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ce;\n    break;\n  case 'ce_RU':\n  case 'ce-RU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ce_RU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ce_RU;\n    break;\n  case 'ceb':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ceb;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ceb;\n    break;\n  case 'ceb_PH':\n  case 'ceb-PH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ceb_PH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ceb_PH;\n    break;\n  case 'cgg':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cgg;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_cgg;\n    break;\n  case 'cgg_UG':\n  case 'cgg-UG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cgg_UG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_cgg_UG;\n    break;\n  case 'chr_US':\n  case 'chr-US':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_chr_US;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_chr_US;\n    break;\n  case 'ckb':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ckb;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ckb_u_nu_latn;\n    break;\n  case 'ckb_IQ':\n  case 'ckb-IQ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ckb_IQ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ckb_IQ_u_nu_latn;\n    break;\n  case 'ckb_IR':\n  case 'ckb-IR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ckb_IR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ckb_IR_u_nu_latn;\n    break;\n  case 'cs_CZ':\n  case 'cs-CZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cs_CZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_cs_CZ;\n    break;\n  case 'cy_GB':\n  case 'cy-GB':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cy_GB;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_cy_GB;\n    break;\n  case 'da_DK':\n  case 'da-DK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_da_DK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_da_DK;\n    break;\n  case 'da_GL':\n  case 'da-GL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_da_GL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_da_GL;\n    break;\n  case 'dav':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dav;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_dav;\n    break;\n  case 'dav_KE':\n  case 'dav-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dav_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_dav_KE;\n    break;\n  case 'de_BE':\n  case 'de-BE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de_BE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_de_BE;\n    break;\n  case 'de_DE':\n  case 'de-DE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de_DE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_de_DE;\n    break;\n  case 'de_IT':\n  case 'de-IT':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de_IT;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_de_IT;\n    break;\n  case 'de_LI':\n  case 'de-LI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de_LI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_de_LI;\n    break;\n  case 'de_LU':\n  case 'de-LU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de_LU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_de_LU;\n    break;\n  case 'dje':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dje;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_dje;\n    break;\n  case 'dje_NE':\n  case 'dje-NE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dje_NE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_dje_NE;\n    break;\n  case 'dsb':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dsb;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_dsb;\n    break;\n  case 'dsb_DE':\n  case 'dsb-DE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dsb_DE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_dsb_DE;\n    break;\n  case 'dua':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dua;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_dua;\n    break;\n  case 'dua_CM':\n  case 'dua-CM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dua_CM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_dua_CM;\n    break;\n  case 'dyo':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dyo;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_dyo;\n    break;\n  case 'dyo_SN':\n  case 'dyo-SN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dyo_SN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_dyo_SN;\n    break;\n  case 'dz':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dz;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_dz_u_nu_latn;\n    break;\n  case 'dz_BT':\n  case 'dz-BT':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_dz_BT;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_dz_BT_u_nu_latn;\n    break;\n  case 'ebu':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ebu;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ebu;\n    break;\n  case 'ebu_KE':\n  case 'ebu-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ebu_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ebu_KE;\n    break;\n  case 'ee':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ee;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ee;\n    break;\n  case 'ee_GH':\n  case 'ee-GH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ee_GH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ee_GH;\n    break;\n  case 'ee_TG':\n  case 'ee-TG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ee_TG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ee_TG;\n    break;\n  case 'el_CY':\n  case 'el-CY':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_el_CY;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_el_CY;\n    break;\n  case 'el_GR':\n  case 'el-GR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_el_GR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_el_GR;\n    break;\n  case 'en_001':\n  case 'en-001':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_001;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_001;\n    break;\n  case 'en_150':\n  case 'en-150':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_150;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_150;\n    break;\n  case 'en_AE':\n  case 'en-AE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_AE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_AE;\n    break;\n  case 'en_AG':\n  case 'en-AG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_AG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_AG;\n    break;\n  case 'en_AI':\n  case 'en-AI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_AI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_AI;\n    break;\n  case 'en_AS':\n  case 'en-AS':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_AS;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_AS;\n    break;\n  case 'en_AT':\n  case 'en-AT':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_AT;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_AT;\n    break;\n  case 'en_BB':\n  case 'en-BB':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_BB;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_BB;\n    break;\n  case 'en_BE':\n  case 'en-BE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_BE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_BE;\n    break;\n  case 'en_BI':\n  case 'en-BI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_BI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_BI;\n    break;\n  case 'en_BM':\n  case 'en-BM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_BM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_BM;\n    break;\n  case 'en_BS':\n  case 'en-BS':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_BS;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_BS;\n    break;\n  case 'en_BW':\n  case 'en-BW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_BW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_BW;\n    break;\n  case 'en_BZ':\n  case 'en-BZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_BZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_BZ;\n    break;\n  case 'en_CC':\n  case 'en-CC':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_CC;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_CC;\n    break;\n  case 'en_CH':\n  case 'en-CH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_CH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_CH;\n    break;\n  case 'en_CK':\n  case 'en-CK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_CK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_CK;\n    break;\n  case 'en_CM':\n  case 'en-CM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_CM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_CM;\n    break;\n  case 'en_CX':\n  case 'en-CX':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_CX;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_CX;\n    break;\n  case 'en_CY':\n  case 'en-CY':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_CY;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_CY;\n    break;\n  case 'en_DE':\n  case 'en-DE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_DE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_DE;\n    break;\n  case 'en_DG':\n  case 'en-DG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_DG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_DG;\n    break;\n  case 'en_DK':\n  case 'en-DK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_DK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_DK;\n    break;\n  case 'en_DM':\n  case 'en-DM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_DM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_DM;\n    break;\n  case 'en_ER':\n  case 'en-ER':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_ER;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_ER;\n    break;\n  case 'en_FI':\n  case 'en-FI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_FI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_FI;\n    break;\n  case 'en_FJ':\n  case 'en-FJ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_FJ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_FJ;\n    break;\n  case 'en_FK':\n  case 'en-FK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_FK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_FK;\n    break;\n  case 'en_FM':\n  case 'en-FM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_FM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_FM;\n    break;\n  case 'en_GD':\n  case 'en-GD':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_GD;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_GD;\n    break;\n  case 'en_GG':\n  case 'en-GG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_GG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_GG;\n    break;\n  case 'en_GH':\n  case 'en-GH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_GH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_GH;\n    break;\n  case 'en_GI':\n  case 'en-GI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_GI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_GI;\n    break;\n  case 'en_GM':\n  case 'en-GM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_GM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_GM;\n    break;\n  case 'en_GU':\n  case 'en-GU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_GU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_GU;\n    break;\n  case 'en_GY':\n  case 'en-GY':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_GY;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_GY;\n    break;\n  case 'en_HK':\n  case 'en-HK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_HK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_HK;\n    break;\n  case 'en_IL':\n  case 'en-IL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_IL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_IL;\n    break;\n  case 'en_IM':\n  case 'en-IM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_IM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_IM;\n    break;\n  case 'en_IO':\n  case 'en-IO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_IO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_IO;\n    break;\n  case 'en_JE':\n  case 'en-JE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_JE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_JE;\n    break;\n  case 'en_JM':\n  case 'en-JM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_JM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_JM;\n    break;\n  case 'en_KE':\n  case 'en-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_KE;\n    break;\n  case 'en_KI':\n  case 'en-KI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_KI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_KI;\n    break;\n  case 'en_KN':\n  case 'en-KN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_KN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_KN;\n    break;\n  case 'en_KY':\n  case 'en-KY':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_KY;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_KY;\n    break;\n  case 'en_LC':\n  case 'en-LC':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_LC;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_LC;\n    break;\n  case 'en_LR':\n  case 'en-LR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_LR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_LR;\n    break;\n  case 'en_LS':\n  case 'en-LS':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_LS;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_LS;\n    break;\n  case 'en_MG':\n  case 'en-MG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_MG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_MG;\n    break;\n  case 'en_MH':\n  case 'en-MH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_MH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_MH;\n    break;\n  case 'en_MO':\n  case 'en-MO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_MO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_MO;\n    break;\n  case 'en_MP':\n  case 'en-MP':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_MP;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_MP;\n    break;\n  case 'en_MS':\n  case 'en-MS':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_MS;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_MS;\n    break;\n  case 'en_MT':\n  case 'en-MT':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_MT;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_MT;\n    break;\n  case 'en_MU':\n  case 'en-MU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_MU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_MU;\n    break;\n  case 'en_MW':\n  case 'en-MW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_MW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_MW;\n    break;\n  case 'en_MY':\n  case 'en-MY':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_MY;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_MY;\n    break;\n  case 'en_NA':\n  case 'en-NA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_NA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_NA;\n    break;\n  case 'en_NF':\n  case 'en-NF':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_NF;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_NF;\n    break;\n  case 'en_NG':\n  case 'en-NG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_NG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_NG;\n    break;\n  case 'en_NL':\n  case 'en-NL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_NL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_NL;\n    break;\n  case 'en_NR':\n  case 'en-NR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_NR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_NR;\n    break;\n  case 'en_NU':\n  case 'en-NU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_NU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_NU;\n    break;\n  case 'en_NZ':\n  case 'en-NZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_NZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_NZ;\n    break;\n  case 'en_PG':\n  case 'en-PG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_PG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_PG;\n    break;\n  case 'en_PH':\n  case 'en-PH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_PH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_PH;\n    break;\n  case 'en_PK':\n  case 'en-PK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_PK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_PK;\n    break;\n  case 'en_PN':\n  case 'en-PN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_PN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_PN;\n    break;\n  case 'en_PR':\n  case 'en-PR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_PR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_PR;\n    break;\n  case 'en_PW':\n  case 'en-PW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_PW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_PW;\n    break;\n  case 'en_RW':\n  case 'en-RW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_RW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_RW;\n    break;\n  case 'en_SB':\n  case 'en-SB':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_SB;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_SB;\n    break;\n  case 'en_SC':\n  case 'en-SC':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_SC;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_SC;\n    break;\n  case 'en_SD':\n  case 'en-SD':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_SD;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_SD;\n    break;\n  case 'en_SE':\n  case 'en-SE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_SE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_SE;\n    break;\n  case 'en_SH':\n  case 'en-SH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_SH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_SH;\n    break;\n  case 'en_SI':\n  case 'en-SI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_SI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_SI;\n    break;\n  case 'en_SL':\n  case 'en-SL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_SL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_SL;\n    break;\n  case 'en_SS':\n  case 'en-SS':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_SS;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_SS;\n    break;\n  case 'en_SX':\n  case 'en-SX':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_SX;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_SX;\n    break;\n  case 'en_SZ':\n  case 'en-SZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_SZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_SZ;\n    break;\n  case 'en_TC':\n  case 'en-TC':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_TC;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_TC;\n    break;\n  case 'en_TK':\n  case 'en-TK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_TK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_TK;\n    break;\n  case 'en_TO':\n  case 'en-TO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_TO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_TO;\n    break;\n  case 'en_TT':\n  case 'en-TT':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_TT;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_TT;\n    break;\n  case 'en_TV':\n  case 'en-TV':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_TV;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_TV;\n    break;\n  case 'en_TZ':\n  case 'en-TZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_TZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_TZ;\n    break;\n  case 'en_UG':\n  case 'en-UG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_UG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_UG;\n    break;\n  case 'en_UM':\n  case 'en-UM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_UM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_UM;\n    break;\n  case 'en_US_POSIX':\n  case 'en-US-POSIX':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_US_POSIX;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_US_POSIX;\n    break;\n  case 'en_VC':\n  case 'en-VC':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_VC;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_VC;\n    break;\n  case 'en_VG':\n  case 'en-VG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_VG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_VG;\n    break;\n  case 'en_VI':\n  case 'en-VI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_VI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_VI;\n    break;\n  case 'en_VU':\n  case 'en-VU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_VU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_VU;\n    break;\n  case 'en_WS':\n  case 'en-WS':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_WS;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_WS;\n    break;\n  case 'en_XA':\n  case 'en-XA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_XA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_XA;\n    break;\n  case 'en_ZM':\n  case 'en-ZM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_ZM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_ZM;\n    break;\n  case 'en_ZW':\n  case 'en-ZW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_ZW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_ZW;\n    break;\n  case 'eo':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_eo;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_eo;\n    break;\n  case 'eo_001':\n  case 'eo-001':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_eo_001;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_eo_001;\n    break;\n  case 'es_AR':\n  case 'es-AR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_AR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_AR;\n    break;\n  case 'es_BO':\n  case 'es-BO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_BO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_BO;\n    break;\n  case 'es_BR':\n  case 'es-BR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_BR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_BR;\n    break;\n  case 'es_BZ':\n  case 'es-BZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_BZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_BZ;\n    break;\n  case 'es_CL':\n  case 'es-CL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_CL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_CL;\n    break;\n  case 'es_CO':\n  case 'es-CO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_CO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_CO;\n    break;\n  case 'es_CR':\n  case 'es-CR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_CR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_CR;\n    break;\n  case 'es_CU':\n  case 'es-CU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_CU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_CU;\n    break;\n  case 'es_DO':\n  case 'es-DO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_DO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_DO;\n    break;\n  case 'es_EA':\n  case 'es-EA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_EA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_EA;\n    break;\n  case 'es_EC':\n  case 'es-EC':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_EC;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_EC;\n    break;\n  case 'es_GQ':\n  case 'es-GQ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_GQ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_GQ;\n    break;\n  case 'es_GT':\n  case 'es-GT':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_GT;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_GT;\n    break;\n  case 'es_HN':\n  case 'es-HN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_HN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_HN;\n    break;\n  case 'es_IC':\n  case 'es-IC':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_IC;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_IC;\n    break;\n  case 'es_NI':\n  case 'es-NI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_NI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_NI;\n    break;\n  case 'es_PA':\n  case 'es-PA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_PA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_PA;\n    break;\n  case 'es_PE':\n  case 'es-PE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_PE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_PE;\n    break;\n  case 'es_PH':\n  case 'es-PH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_PH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_PH;\n    break;\n  case 'es_PR':\n  case 'es-PR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_PR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_PR;\n    break;\n  case 'es_PY':\n  case 'es-PY':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_PY;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_PY;\n    break;\n  case 'es_SV':\n  case 'es-SV':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_SV;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_SV;\n    break;\n  case 'es_UY':\n  case 'es-UY':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_UY;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_UY;\n    break;\n  case 'es_VE':\n  case 'es-VE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_VE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_VE;\n    break;\n  case 'et_EE':\n  case 'et-EE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_et_EE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_et_EE;\n    break;\n  case 'eu_ES':\n  case 'eu-ES':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_eu_ES;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_eu_ES;\n    break;\n  case 'ewo':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ewo;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ewo;\n    break;\n  case 'ewo_CM':\n  case 'ewo-CM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ewo_CM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ewo_CM;\n    break;\n  case 'fa_AF':\n  case 'fa-AF':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fa_AF;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fa_AF_u_nu_latn;\n    break;\n  case 'fa_IR':\n  case 'fa-IR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fa_IR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fa_IR_u_nu_latn;\n    break;\n  case 'ff':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ff;\n    break;\n  case 'ff_Latn':\n  case 'ff-Latn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff_Latn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ff_Latn;\n    break;\n  case 'ff_Latn_BF':\n  case 'ff-Latn-BF':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff_Latn_BF;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ff_Latn_BF;\n    break;\n  case 'ff_Latn_CM':\n  case 'ff-Latn-CM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff_Latn_CM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ff_Latn_CM;\n    break;\n  case 'ff_Latn_GH':\n  case 'ff-Latn-GH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff_Latn_GH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ff_Latn_GH;\n    break;\n  case 'ff_Latn_GM':\n  case 'ff-Latn-GM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff_Latn_GM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ff_Latn_GM;\n    break;\n  case 'ff_Latn_GN':\n  case 'ff-Latn-GN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff_Latn_GN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ff_Latn_GN;\n    break;\n  case 'ff_Latn_GW':\n  case 'ff-Latn-GW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff_Latn_GW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ff_Latn_GW;\n    break;\n  case 'ff_Latn_LR':\n  case 'ff-Latn-LR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff_Latn_LR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ff_Latn_LR;\n    break;\n  case 'ff_Latn_MR':\n  case 'ff-Latn-MR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff_Latn_MR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ff_Latn_MR;\n    break;\n  case 'ff_Latn_NE':\n  case 'ff-Latn-NE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff_Latn_NE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ff_Latn_NE;\n    break;\n  case 'ff_Latn_NG':\n  case 'ff-Latn-NG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff_Latn_NG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ff_Latn_NG;\n    break;\n  case 'ff_Latn_SL':\n  case 'ff-Latn-SL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff_Latn_SL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ff_Latn_SL;\n    break;\n  case 'ff_Latn_SN':\n  case 'ff-Latn-SN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ff_Latn_SN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ff_Latn_SN;\n    break;\n  case 'fi_FI':\n  case 'fi-FI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fi_FI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fi_FI;\n    break;\n  case 'fil_PH':\n  case 'fil-PH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fil_PH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fil_PH;\n    break;\n  case 'fo':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fo;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fo;\n    break;\n  case 'fo_DK':\n  case 'fo-DK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fo_DK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fo_DK;\n    break;\n  case 'fo_FO':\n  case 'fo-FO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fo_FO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fo_FO;\n    break;\n  case 'fr_BE':\n  case 'fr-BE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_BE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_BE;\n    break;\n  case 'fr_BF':\n  case 'fr-BF':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_BF;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_BF;\n    break;\n  case 'fr_BI':\n  case 'fr-BI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_BI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_BI;\n    break;\n  case 'fr_BJ':\n  case 'fr-BJ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_BJ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_BJ;\n    break;\n  case 'fr_BL':\n  case 'fr-BL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_BL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_BL;\n    break;\n  case 'fr_CD':\n  case 'fr-CD':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CD;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_CD;\n    break;\n  case 'fr_CF':\n  case 'fr-CF':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CF;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_CF;\n    break;\n  case 'fr_CG':\n  case 'fr-CG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_CG;\n    break;\n  case 'fr_CH':\n  case 'fr-CH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_CH;\n    break;\n  case 'fr_CI':\n  case 'fr-CI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_CI;\n    break;\n  case 'fr_CM':\n  case 'fr-CM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_CM;\n    break;\n  case 'fr_DJ':\n  case 'fr-DJ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_DJ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_DJ;\n    break;\n  case 'fr_DZ':\n  case 'fr-DZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_DZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_DZ;\n    break;\n  case 'fr_FR':\n  case 'fr-FR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_FR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_FR;\n    break;\n  case 'fr_GA':\n  case 'fr-GA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_GA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_GA;\n    break;\n  case 'fr_GF':\n  case 'fr-GF':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_GF;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_GF;\n    break;\n  case 'fr_GN':\n  case 'fr-GN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_GN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_GN;\n    break;\n  case 'fr_GP':\n  case 'fr-GP':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_GP;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_GP;\n    break;\n  case 'fr_GQ':\n  case 'fr-GQ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_GQ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_GQ;\n    break;\n  case 'fr_HT':\n  case 'fr-HT':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_HT;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_HT;\n    break;\n  case 'fr_KM':\n  case 'fr-KM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_KM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_KM;\n    break;\n  case 'fr_LU':\n  case 'fr-LU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_LU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_LU;\n    break;\n  case 'fr_MA':\n  case 'fr-MA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_MA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_MA;\n    break;\n  case 'fr_MC':\n  case 'fr-MC':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_MC;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_MC;\n    break;\n  case 'fr_MF':\n  case 'fr-MF':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_MF;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_MF;\n    break;\n  case 'fr_MG':\n  case 'fr-MG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_MG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_MG;\n    break;\n  case 'fr_ML':\n  case 'fr-ML':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_ML;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_ML;\n    break;\n  case 'fr_MQ':\n  case 'fr-MQ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_MQ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_MQ;\n    break;\n  case 'fr_MR':\n  case 'fr-MR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_MR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_MR;\n    break;\n  case 'fr_MU':\n  case 'fr-MU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_MU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_MU;\n    break;\n  case 'fr_NC':\n  case 'fr-NC':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_NC;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_NC;\n    break;\n  case 'fr_NE':\n  case 'fr-NE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_NE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_NE;\n    break;\n  case 'fr_PF':\n  case 'fr-PF':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_PF;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_PF;\n    break;\n  case 'fr_PM':\n  case 'fr-PM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_PM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_PM;\n    break;\n  case 'fr_RE':\n  case 'fr-RE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_RE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_RE;\n    break;\n  case 'fr_RW':\n  case 'fr-RW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_RW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_RW;\n    break;\n  case 'fr_SC':\n  case 'fr-SC':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_SC;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_SC;\n    break;\n  case 'fr_SN':\n  case 'fr-SN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_SN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_SN;\n    break;\n  case 'fr_SY':\n  case 'fr-SY':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_SY;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_SY;\n    break;\n  case 'fr_TD':\n  case 'fr-TD':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_TD;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_TD;\n    break;\n  case 'fr_TG':\n  case 'fr-TG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_TG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_TG;\n    break;\n  case 'fr_TN':\n  case 'fr-TN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_TN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_TN;\n    break;\n  case 'fr_VU':\n  case 'fr-VU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_VU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_VU;\n    break;\n  case 'fr_WF':\n  case 'fr-WF':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_WF;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_WF;\n    break;\n  case 'fr_YT':\n  case 'fr-YT':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_YT;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_YT;\n    break;\n  case 'fur':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fur;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fur;\n    break;\n  case 'fur_IT':\n  case 'fur-IT':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fur_IT;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fur_IT;\n    break;\n  case 'fy':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fy;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fy;\n    break;\n  case 'fy_NL':\n  case 'fy-NL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fy_NL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fy_NL;\n    break;\n  case 'ga_IE':\n  case 'ga-IE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ga_IE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ga_IE;\n    break;\n  case 'gd':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gd;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_gd;\n    break;\n  case 'gd_GB':\n  case 'gd-GB':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gd_GB;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_gd_GB;\n    break;\n  case 'gl_ES':\n  case 'gl-ES':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gl_ES;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_gl_ES;\n    break;\n  case 'gsw_CH':\n  case 'gsw-CH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gsw_CH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_gsw_CH;\n    break;\n  case 'gsw_FR':\n  case 'gsw-FR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gsw_FR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_gsw_FR;\n    break;\n  case 'gsw_LI':\n  case 'gsw-LI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gsw_LI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_gsw_LI;\n    break;\n  case 'gu_IN':\n  case 'gu-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gu_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_gu_IN;\n    break;\n  case 'guz':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_guz;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_guz;\n    break;\n  case 'guz_KE':\n  case 'guz-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_guz_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_guz_KE;\n    break;\n  case 'gv':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gv;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_gv;\n    break;\n  case 'gv_IM':\n  case 'gv-IM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gv_IM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_gv_IM;\n    break;\n  case 'ha':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ha;\n    break;\n  case 'ha_GH':\n  case 'ha-GH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_GH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ha_GH;\n    break;\n  case 'ha_NE':\n  case 'ha-NE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_NE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ha_NE;\n    break;\n  case 'ha_NG':\n  case 'ha-NG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ha_NG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ha_NG;\n    break;\n  case 'haw_US':\n  case 'haw-US':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_haw_US;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_haw_US;\n    break;\n  case 'he_IL':\n  case 'he-IL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_he_IL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_he_IL;\n    break;\n  case 'hi_IN':\n  case 'hi-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hi_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_hi_IN;\n    break;\n  case 'hr_BA':\n  case 'hr-BA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hr_BA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_hr_BA;\n    break;\n  case 'hr_HR':\n  case 'hr-HR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hr_HR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_hr_HR;\n    break;\n  case 'hsb':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hsb;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_hsb;\n    break;\n  case 'hsb_DE':\n  case 'hsb-DE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hsb_DE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_hsb_DE;\n    break;\n  case 'hu_HU':\n  case 'hu-HU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hu_HU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_hu_HU;\n    break;\n  case 'hy_AM':\n  case 'hy-AM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hy_AM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_hy_AM;\n    break;\n  case 'ia':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ia;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ia;\n    break;\n  case 'ia_001':\n  case 'ia-001':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ia_001;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ia_001;\n    break;\n  case 'id_ID':\n  case 'id-ID':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_id_ID;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_id_ID;\n    break;\n  case 'ig':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ig;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ig;\n    break;\n  case 'ig_NG':\n  case 'ig-NG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ig_NG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ig_NG;\n    break;\n  case 'ii':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ii;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ii;\n    break;\n  case 'ii_CN':\n  case 'ii-CN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ii_CN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ii_CN;\n    break;\n  case 'is_IS':\n  case 'is-IS':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_is_IS;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_is_IS;\n    break;\n  case 'it_CH':\n  case 'it-CH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_it_CH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_it_CH;\n    break;\n  case 'it_IT':\n  case 'it-IT':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_it_IT;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_it_IT;\n    break;\n  case 'it_SM':\n  case 'it-SM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_it_SM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_it_SM;\n    break;\n  case 'it_VA':\n  case 'it-VA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_it_VA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_it_VA;\n    break;\n  case 'ja_JP':\n  case 'ja-JP':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ja_JP;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ja_JP;\n    break;\n  case 'jgo':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_jgo;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_jgo;\n    break;\n  case 'jgo_CM':\n  case 'jgo-CM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_jgo_CM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_jgo_CM;\n    break;\n  case 'jmc':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_jmc;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_jmc;\n    break;\n  case 'jmc_TZ':\n  case 'jmc-TZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_jmc_TZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_jmc_TZ;\n    break;\n  case 'jv':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_jv;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_jv;\n    break;\n  case 'jv_ID':\n  case 'jv-ID':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_jv_ID;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_jv_ID;\n    break;\n  case 'ka_GE':\n  case 'ka-GE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ka_GE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ka_GE;\n    break;\n  case 'kab':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kab;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kab;\n    break;\n  case 'kab_DZ':\n  case 'kab-DZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kab_DZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kab_DZ;\n    break;\n  case 'kam':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kam;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kam;\n    break;\n  case 'kam_KE':\n  case 'kam-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kam_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kam_KE;\n    break;\n  case 'kde':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kde;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kde;\n    break;\n  case 'kde_TZ':\n  case 'kde-TZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kde_TZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kde_TZ;\n    break;\n  case 'kea':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kea;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kea;\n    break;\n  case 'kea_CV':\n  case 'kea-CV':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kea_CV;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kea_CV;\n    break;\n  case 'khq':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_khq;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_khq;\n    break;\n  case 'khq_ML':\n  case 'khq-ML':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_khq_ML;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_khq_ML;\n    break;\n  case 'ki':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ki;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ki;\n    break;\n  case 'ki_KE':\n  case 'ki-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ki_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ki_KE;\n    break;\n  case 'kk_KZ':\n  case 'kk-KZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kk_KZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kk_KZ;\n    break;\n  case 'kkj':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kkj;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kkj;\n    break;\n  case 'kkj_CM':\n  case 'kkj-CM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kkj_CM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kkj_CM;\n    break;\n  case 'kl':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kl;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kl;\n    break;\n  case 'kl_GL':\n  case 'kl-GL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kl_GL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kl_GL;\n    break;\n  case 'kln':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kln;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kln;\n    break;\n  case 'kln_KE':\n  case 'kln-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kln_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kln_KE;\n    break;\n  case 'km_KH':\n  case 'km-KH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_km_KH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_km_KH;\n    break;\n  case 'kn_IN':\n  case 'kn-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kn_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kn_IN;\n    break;\n  case 'ko_KP':\n  case 'ko-KP':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ko_KP;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ko_KP;\n    break;\n  case 'ko_KR':\n  case 'ko-KR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ko_KR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ko_KR;\n    break;\n  case 'kok':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kok;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kok;\n    break;\n  case 'kok_IN':\n  case 'kok-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kok_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kok_IN;\n    break;\n  case 'ks':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ks;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ks_u_nu_latn;\n    break;\n  case 'ks_IN':\n  case 'ks-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ks_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ks_IN_u_nu_latn;\n    break;\n  case 'ksb':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ksb;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ksb;\n    break;\n  case 'ksb_TZ':\n  case 'ksb-TZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ksb_TZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ksb_TZ;\n    break;\n  case 'ksf':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ksf;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ksf;\n    break;\n  case 'ksf_CM':\n  case 'ksf-CM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ksf_CM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ksf_CM;\n    break;\n  case 'ksh':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ksh;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ksh;\n    break;\n  case 'ksh_DE':\n  case 'ksh-DE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ksh_DE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ksh_DE;\n    break;\n  case 'ku':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ku;\n    break;\n  case 'ku_TR':\n  case 'ku-TR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ku_TR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ku_TR;\n    break;\n  case 'kw':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kw;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kw;\n    break;\n  case 'kw_GB':\n  case 'kw-GB':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kw_GB;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kw_GB;\n    break;\n  case 'ky_KG':\n  case 'ky-KG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ky_KG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ky_KG;\n    break;\n  case 'lag':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lag;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lag;\n    break;\n  case 'lag_TZ':\n  case 'lag-TZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lag_TZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lag_TZ;\n    break;\n  case 'lb':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lb;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lb;\n    break;\n  case 'lb_LU':\n  case 'lb-LU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lb_LU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lb_LU;\n    break;\n  case 'lg':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lg;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lg;\n    break;\n  case 'lg_UG':\n  case 'lg-UG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lg_UG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lg_UG;\n    break;\n  case 'lkt':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lkt;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lkt;\n    break;\n  case 'lkt_US':\n  case 'lkt-US':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lkt_US;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lkt_US;\n    break;\n  case 'ln_AO':\n  case 'ln-AO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ln_AO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ln_AO;\n    break;\n  case 'ln_CD':\n  case 'ln-CD':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ln_CD;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ln_CD;\n    break;\n  case 'ln_CF':\n  case 'ln-CF':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ln_CF;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ln_CF;\n    break;\n  case 'ln_CG':\n  case 'ln-CG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ln_CG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ln_CG;\n    break;\n  case 'lo_LA':\n  case 'lo-LA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lo_LA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lo_LA;\n    break;\n  case 'lrc':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lrc;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lrc_u_nu_latn;\n    break;\n  case 'lrc_IQ':\n  case 'lrc-IQ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lrc_IQ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lrc_IQ_u_nu_latn;\n    break;\n  case 'lrc_IR':\n  case 'lrc-IR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lrc_IR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lrc_IR_u_nu_latn;\n    break;\n  case 'lt_LT':\n  case 'lt-LT':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lt_LT;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lt_LT;\n    break;\n  case 'lu':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lu;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lu;\n    break;\n  case 'lu_CD':\n  case 'lu-CD':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lu_CD;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lu_CD;\n    break;\n  case 'luo':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_luo;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_luo;\n    break;\n  case 'luo_KE':\n  case 'luo-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_luo_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_luo_KE;\n    break;\n  case 'luy':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_luy;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_luy;\n    break;\n  case 'luy_KE':\n  case 'luy-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_luy_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_luy_KE;\n    break;\n  case 'lv_LV':\n  case 'lv-LV':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lv_LV;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lv_LV;\n    break;\n  case 'mas':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mas;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mas;\n    break;\n  case 'mas_KE':\n  case 'mas-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mas_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mas_KE;\n    break;\n  case 'mas_TZ':\n  case 'mas-TZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mas_TZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mas_TZ;\n    break;\n  case 'mer':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mer;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mer;\n    break;\n  case 'mer_KE':\n  case 'mer-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mer_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mer_KE;\n    break;\n  case 'mfe':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mfe;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mfe;\n    break;\n  case 'mfe_MU':\n  case 'mfe-MU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mfe_MU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mfe_MU;\n    break;\n  case 'mg':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mg;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mg;\n    break;\n  case 'mg_MG':\n  case 'mg-MG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mg_MG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mg_MG;\n    break;\n  case 'mgh':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mgh;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mgh;\n    break;\n  case 'mgh_MZ':\n  case 'mgh-MZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mgh_MZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mgh_MZ;\n    break;\n  case 'mgo':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mgo;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mgo;\n    break;\n  case 'mgo_CM':\n  case 'mgo-CM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mgo_CM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mgo_CM;\n    break;\n  case 'mi':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mi;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mi;\n    break;\n  case 'mi_NZ':\n  case 'mi-NZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mi_NZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mi_NZ;\n    break;\n  case 'mk_MK':\n  case 'mk-MK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mk_MK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mk_MK;\n    break;\n  case 'ml_IN':\n  case 'ml-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ml_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ml_IN;\n    break;\n  case 'mn_MN':\n  case 'mn-MN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn_MN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mn_MN;\n    break;\n  case 'mr_IN':\n  case 'mr-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mr_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mr_IN_u_nu_latn;\n    break;\n  case 'ms_BN':\n  case 'ms-BN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ms_BN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ms_BN;\n    break;\n  case 'ms_MY':\n  case 'ms-MY':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ms_MY;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ms_MY;\n    break;\n  case 'ms_SG':\n  case 'ms-SG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ms_SG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ms_SG;\n    break;\n  case 'mt_MT':\n  case 'mt-MT':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mt_MT;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mt_MT;\n    break;\n  case 'mua':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mua;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mua;\n    break;\n  case 'mua_CM':\n  case 'mua-CM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mua_CM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mua_CM;\n    break;\n  case 'my_MM':\n  case 'my-MM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_my_MM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_my_MM_u_nu_latn;\n    break;\n  case 'mzn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mzn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mzn_u_nu_latn;\n    break;\n  case 'mzn_IR':\n  case 'mzn-IR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mzn_IR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mzn_IR_u_nu_latn;\n    break;\n  case 'naq':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_naq;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_naq;\n    break;\n  case 'naq_NA':\n  case 'naq-NA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_naq_NA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_naq_NA;\n    break;\n  case 'nb_NO':\n  case 'nb-NO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nb_NO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nb_NO;\n    break;\n  case 'nb_SJ':\n  case 'nb-SJ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nb_SJ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nb_SJ;\n    break;\n  case 'nd':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nd;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nd;\n    break;\n  case 'nd_ZW':\n  case 'nd-ZW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nd_ZW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nd_ZW;\n    break;\n  case 'nds':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nds;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nds;\n    break;\n  case 'nds_DE':\n  case 'nds-DE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nds_DE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nds_DE;\n    break;\n  case 'nds_NL':\n  case 'nds-NL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nds_NL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nds_NL;\n    break;\n  case 'ne_IN':\n  case 'ne-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ne_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ne_IN_u_nu_latn;\n    break;\n  case 'ne_NP':\n  case 'ne-NP':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ne_NP;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ne_NP_u_nu_latn;\n    break;\n  case 'nl_AW':\n  case 'nl-AW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nl_AW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nl_AW;\n    break;\n  case 'nl_BE':\n  case 'nl-BE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nl_BE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nl_BE;\n    break;\n  case 'nl_BQ':\n  case 'nl-BQ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nl_BQ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nl_BQ;\n    break;\n  case 'nl_CW':\n  case 'nl-CW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nl_CW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nl_CW;\n    break;\n  case 'nl_NL':\n  case 'nl-NL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nl_NL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nl_NL;\n    break;\n  case 'nl_SR':\n  case 'nl-SR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nl_SR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nl_SR;\n    break;\n  case 'nl_SX':\n  case 'nl-SX':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nl_SX;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nl_SX;\n    break;\n  case 'nmg':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nmg;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nmg;\n    break;\n  case 'nmg_CM':\n  case 'nmg-CM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nmg_CM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nmg_CM;\n    break;\n  case 'nn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nn;\n    break;\n  case 'nn_NO':\n  case 'nn-NO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nn_NO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nn_NO;\n    break;\n  case 'nnh':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nnh;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nnh;\n    break;\n  case 'nnh_CM':\n  case 'nnh-CM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nnh_CM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nnh_CM;\n    break;\n  case 'nus':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nus;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nus;\n    break;\n  case 'nus_SS':\n  case 'nus-SS':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nus_SS;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nus_SS;\n    break;\n  case 'nyn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nyn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nyn;\n    break;\n  case 'nyn_UG':\n  case 'nyn-UG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nyn_UG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nyn_UG;\n    break;\n  case 'om':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_om;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_om;\n    break;\n  case 'om_ET':\n  case 'om-ET':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_om_ET;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_om_ET;\n    break;\n  case 'om_KE':\n  case 'om-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_om_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_om_KE;\n    break;\n  case 'or_IN':\n  case 'or-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_or_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_or_IN;\n    break;\n  case 'os':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_os;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_os;\n    break;\n  case 'os_GE':\n  case 'os-GE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_os_GE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_os_GE;\n    break;\n  case 'os_RU':\n  case 'os-RU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_os_RU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_os_RU;\n    break;\n  case 'pa_Arab':\n  case 'pa-Arab':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa_Arab;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pa_Arab_u_nu_latn;\n    break;\n  case 'pa_Arab_PK':\n  case 'pa-Arab-PK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa_Arab_PK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pa_Arab_PK_u_nu_latn;\n    break;\n  case 'pa_Guru':\n  case 'pa-Guru':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa_Guru;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pa_Guru;\n    break;\n  case 'pa_Guru_IN':\n  case 'pa-Guru-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa_Guru_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pa_Guru_IN;\n    break;\n  case 'pl_PL':\n  case 'pl-PL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pl_PL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pl_PL;\n    break;\n  case 'ps':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ps;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ps_u_nu_latn;\n    break;\n  case 'ps_AF':\n  case 'ps-AF':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ps_AF;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ps_AF_u_nu_latn;\n    break;\n  case 'ps_PK':\n  case 'ps-PK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ps_PK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ps_PK_u_nu_latn;\n    break;\n  case 'pt_AO':\n  case 'pt-AO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_AO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pt_AO;\n    break;\n  case 'pt_CH':\n  case 'pt-CH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_CH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pt_CH;\n    break;\n  case 'pt_CV':\n  case 'pt-CV':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_CV;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pt_CV;\n    break;\n  case 'pt_GQ':\n  case 'pt-GQ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_GQ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pt_GQ;\n    break;\n  case 'pt_GW':\n  case 'pt-GW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_GW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pt_GW;\n    break;\n  case 'pt_LU':\n  case 'pt-LU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_LU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pt_LU;\n    break;\n  case 'pt_MO':\n  case 'pt-MO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_MO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pt_MO;\n    break;\n  case 'pt_MZ':\n  case 'pt-MZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_MZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pt_MZ;\n    break;\n  case 'pt_ST':\n  case 'pt-ST':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_ST;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pt_ST;\n    break;\n  case 'pt_TL':\n  case 'pt-TL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_TL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pt_TL;\n    break;\n  case 'qu':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_qu;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_qu;\n    break;\n  case 'qu_BO':\n  case 'qu-BO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_qu_BO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_qu_BO;\n    break;\n  case 'qu_EC':\n  case 'qu-EC':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_qu_EC;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_qu_EC;\n    break;\n  case 'qu_PE':\n  case 'qu-PE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_qu_PE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_qu_PE;\n    break;\n  case 'rm':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rm;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_rm;\n    break;\n  case 'rm_CH':\n  case 'rm-CH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rm_CH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_rm_CH;\n    break;\n  case 'rn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_rn;\n    break;\n  case 'rn_BI':\n  case 'rn-BI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rn_BI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_rn_BI;\n    break;\n  case 'ro_MD':\n  case 'ro-MD':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ro_MD;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ro_MD;\n    break;\n  case 'ro_RO':\n  case 'ro-RO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ro_RO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ro_RO;\n    break;\n  case 'rof':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rof;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_rof;\n    break;\n  case 'rof_TZ':\n  case 'rof-TZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rof_TZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_rof_TZ;\n    break;\n  case 'ru_BY':\n  case 'ru-BY':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ru_BY;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ru_BY;\n    break;\n  case 'ru_KG':\n  case 'ru-KG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ru_KG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ru_KG;\n    break;\n  case 'ru_KZ':\n  case 'ru-KZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ru_KZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ru_KZ;\n    break;\n  case 'ru_MD':\n  case 'ru-MD':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ru_MD;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ru_MD;\n    break;\n  case 'ru_RU':\n  case 'ru-RU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ru_RU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ru_RU;\n    break;\n  case 'ru_UA':\n  case 'ru-UA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ru_UA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ru_UA;\n    break;\n  case 'rw':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rw;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_rw;\n    break;\n  case 'rw_RW':\n  case 'rw-RW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rw_RW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_rw_RW;\n    break;\n  case 'rwk':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rwk;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_rwk;\n    break;\n  case 'rwk_TZ':\n  case 'rwk-TZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_rwk_TZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_rwk_TZ;\n    break;\n  case 'sah':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sah;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sah;\n    break;\n  case 'sah_RU':\n  case 'sah-RU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sah_RU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sah_RU;\n    break;\n  case 'saq':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_saq;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_saq;\n    break;\n  case 'saq_KE':\n  case 'saq-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_saq_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_saq_KE;\n    break;\n  case 'sbp':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sbp;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sbp;\n    break;\n  case 'sbp_TZ':\n  case 'sbp-TZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sbp_TZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sbp_TZ;\n    break;\n  case 'sd':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sd;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sd_u_nu_latn;\n    break;\n  case 'sd_PK':\n  case 'sd-PK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sd_PK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sd_PK_u_nu_latn;\n    break;\n  case 'se':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_se;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_se;\n    break;\n  case 'se_FI':\n  case 'se-FI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_se_FI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_se_FI;\n    break;\n  case 'se_NO':\n  case 'se-NO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_se_NO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_se_NO;\n    break;\n  case 'se_SE':\n  case 'se-SE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_se_SE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_se_SE;\n    break;\n  case 'seh':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_seh;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_seh;\n    break;\n  case 'seh_MZ':\n  case 'seh-MZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_seh_MZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_seh_MZ;\n    break;\n  case 'ses':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ses;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ses;\n    break;\n  case 'ses_ML':\n  case 'ses-ML':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ses_ML;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ses_ML;\n    break;\n  case 'sg':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sg;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sg;\n    break;\n  case 'sg_CF':\n  case 'sg-CF':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sg_CF;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sg_CF;\n    break;\n  case 'shi':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_shi;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_shi;\n    break;\n  case 'shi_Latn':\n  case 'shi-Latn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_shi_Latn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_shi_Latn;\n    break;\n  case 'shi_Latn_MA':\n  case 'shi-Latn-MA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_shi_Latn_MA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_shi_Latn_MA;\n    break;\n  case 'shi_Tfng':\n  case 'shi-Tfng':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_shi_Tfng;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_shi_Tfng;\n    break;\n  case 'shi_Tfng_MA':\n  case 'shi-Tfng-MA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_shi_Tfng_MA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_shi_Tfng_MA;\n    break;\n  case 'si_LK':\n  case 'si-LK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_si_LK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_si_LK;\n    break;\n  case 'sk_SK':\n  case 'sk-SK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sk_SK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sk_SK;\n    break;\n  case 'sl_SI':\n  case 'sl-SI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sl_SI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sl_SI;\n    break;\n  case 'smn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_smn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_smn;\n    break;\n  case 'smn_FI':\n  case 'smn-FI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_smn_FI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_smn_FI;\n    break;\n  case 'sn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sn;\n    break;\n  case 'sn_ZW':\n  case 'sn-ZW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sn_ZW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sn_ZW;\n    break;\n  case 'so':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_so;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_so;\n    break;\n  case 'so_DJ':\n  case 'so-DJ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_so_DJ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_so_DJ;\n    break;\n  case 'so_ET':\n  case 'so-ET':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_so_ET;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_so_ET;\n    break;\n  case 'so_KE':\n  case 'so-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_so_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_so_KE;\n    break;\n  case 'so_SO':\n  case 'so-SO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_so_SO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_so_SO;\n    break;\n  case 'sq_AL':\n  case 'sq-AL':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sq_AL;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sq_AL;\n    break;\n  case 'sq_MK':\n  case 'sq-MK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sq_MK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sq_MK;\n    break;\n  case 'sq_XK':\n  case 'sq-XK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sq_XK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sq_XK;\n    break;\n  case 'sr_Cyrl':\n  case 'sr-Cyrl':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Cyrl;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sr_Cyrl;\n    break;\n  case 'sr_Cyrl_BA':\n  case 'sr-Cyrl-BA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Cyrl_BA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sr_Cyrl_BA;\n    break;\n  case 'sr_Cyrl_ME':\n  case 'sr-Cyrl-ME':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Cyrl_ME;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sr_Cyrl_ME;\n    break;\n  case 'sr_Cyrl_RS':\n  case 'sr-Cyrl-RS':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Cyrl_RS;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sr_Cyrl_RS;\n    break;\n  case 'sr_Cyrl_XK':\n  case 'sr-Cyrl-XK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Cyrl_XK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sr_Cyrl_XK;\n    break;\n  case 'sr_Latn_BA':\n  case 'sr-Latn-BA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Latn_BA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sr_Latn_BA;\n    break;\n  case 'sr_Latn_ME':\n  case 'sr-Latn-ME':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Latn_ME;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sr_Latn_ME;\n    break;\n  case 'sr_Latn_RS':\n  case 'sr-Latn-RS':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Latn_RS;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sr_Latn_RS;\n    break;\n  case 'sr_Latn_XK':\n  case 'sr-Latn-XK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Latn_XK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sr_Latn_XK;\n    break;\n  case 'sv_AX':\n  case 'sv-AX':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sv_AX;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sv_AX;\n    break;\n  case 'sv_FI':\n  case 'sv-FI':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sv_FI;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sv_FI;\n    break;\n  case 'sv_SE':\n  case 'sv-SE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sv_SE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sv_SE;\n    break;\n  case 'sw_CD':\n  case 'sw-CD':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sw_CD;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sw_CD;\n    break;\n  case 'sw_KE':\n  case 'sw-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sw_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sw_KE;\n    break;\n  case 'sw_TZ':\n  case 'sw-TZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sw_TZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sw_TZ;\n    break;\n  case 'sw_UG':\n  case 'sw-UG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sw_UG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sw_UG;\n    break;\n  case 'ta_IN':\n  case 'ta-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ta_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ta_IN;\n    break;\n  case 'ta_LK':\n  case 'ta-LK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ta_LK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ta_LK;\n    break;\n  case 'ta_MY':\n  case 'ta-MY':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ta_MY;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ta_MY;\n    break;\n  case 'ta_SG':\n  case 'ta-SG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ta_SG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ta_SG;\n    break;\n  case 'te_IN':\n  case 'te-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_te_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_te_IN;\n    break;\n  case 'teo':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_teo;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_teo;\n    break;\n  case 'teo_KE':\n  case 'teo-KE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_teo_KE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_teo_KE;\n    break;\n  case 'teo_UG':\n  case 'teo-UG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_teo_UG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_teo_UG;\n    break;\n  case 'tg':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tg;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_tg;\n    break;\n  case 'tg_TJ':\n  case 'tg-TJ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tg_TJ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_tg_TJ;\n    break;\n  case 'th_TH':\n  case 'th-TH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_th_TH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_th_TH;\n    break;\n  case 'ti':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ti;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ti;\n    break;\n  case 'ti_ER':\n  case 'ti-ER':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ti_ER;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ti_ER;\n    break;\n  case 'ti_ET':\n  case 'ti-ET':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ti_ET;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ti_ET;\n    break;\n  case 'tk':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tk;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_tk;\n    break;\n  case 'tk_TM':\n  case 'tk-TM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tk_TM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_tk_TM;\n    break;\n  case 'to':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_to;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_to;\n    break;\n  case 'to_TO':\n  case 'to-TO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_to_TO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_to_TO;\n    break;\n  case 'tr_CY':\n  case 'tr-CY':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tr_CY;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_tr_CY;\n    break;\n  case 'tr_TR':\n  case 'tr-TR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tr_TR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_tr_TR;\n    break;\n  case 'tt':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tt;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_tt;\n    break;\n  case 'tt_RU':\n  case 'tt-RU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tt_RU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_tt_RU;\n    break;\n  case 'twq':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_twq;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_twq;\n    break;\n  case 'twq_NE':\n  case 'twq-NE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_twq_NE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_twq_NE;\n    break;\n  case 'tzm':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tzm;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_tzm;\n    break;\n  case 'tzm_MA':\n  case 'tzm-MA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tzm_MA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_tzm_MA;\n    break;\n  case 'ug':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ug;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ug;\n    break;\n  case 'ug_CN':\n  case 'ug-CN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ug_CN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ug_CN;\n    break;\n  case 'uk_UA':\n  case 'uk-UA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uk_UA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_uk_UA;\n    break;\n  case 'ur_IN':\n  case 'ur-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ur_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ur_IN_u_nu_latn;\n    break;\n  case 'ur_PK':\n  case 'ur-PK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ur_PK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ur_PK;\n    break;\n  case 'uz_Arab':\n  case 'uz-Arab':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_Arab;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_uz_Arab_u_nu_latn;\n    break;\n  case 'uz_Arab_AF':\n  case 'uz-Arab-AF':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_Arab_AF;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_uz_Arab_AF_u_nu_latn;\n    break;\n  case 'uz_Cyrl':\n  case 'uz-Cyrl':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_Cyrl;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_uz_Cyrl;\n    break;\n  case 'uz_Cyrl_UZ':\n  case 'uz-Cyrl-UZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ;\n    break;\n  case 'uz_Latn':\n  case 'uz-Latn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_Latn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_uz_Latn;\n    break;\n  case 'uz_Latn_UZ':\n  case 'uz-Latn-UZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz_Latn_UZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_uz_Latn_UZ;\n    break;\n  case 'vai':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_vai;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_vai;\n    break;\n  case 'vai_Latn':\n  case 'vai-Latn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_vai_Latn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_vai_Latn;\n    break;\n  case 'vai_Latn_LR':\n  case 'vai-Latn-LR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_vai_Latn_LR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_vai_Latn_LR;\n    break;\n  case 'vai_Vaii':\n  case 'vai-Vaii':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_vai_Vaii;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_vai_Vaii;\n    break;\n  case 'vai_Vaii_LR':\n  case 'vai-Vaii-LR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_vai_Vaii_LR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_vai_Vaii_LR;\n    break;\n  case 'vi_VN':\n  case 'vi-VN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_vi_VN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_vi_VN;\n    break;\n  case 'vun':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_vun;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_vun;\n    break;\n  case 'vun_TZ':\n  case 'vun-TZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_vun_TZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_vun_TZ;\n    break;\n  case 'wae':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wae;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_wae;\n    break;\n  case 'wae_CH':\n  case 'wae-CH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wae_CH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_wae_CH;\n    break;\n  case 'wo':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wo;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_wo;\n    break;\n  case 'wo_SN':\n  case 'wo-SN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_wo_SN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_wo_SN;\n    break;\n  case 'xh':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_xh;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_xh;\n    break;\n  case 'xh_ZA':\n  case 'xh-ZA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_xh_ZA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_xh_ZA;\n    break;\n  case 'xog':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_xog;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_xog;\n    break;\n  case 'xog_UG':\n  case 'xog-UG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_xog_UG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_xog_UG;\n    break;\n  case 'yav':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yav;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_yav;\n    break;\n  case 'yav_CM':\n  case 'yav-CM':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yav_CM;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_yav_CM;\n    break;\n  case 'yi':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yi;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_yi;\n    break;\n  case 'yi_001':\n  case 'yi-001':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yi_001;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_yi_001;\n    break;\n  case 'yo':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yo;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_yo;\n    break;\n  case 'yo_BJ':\n  case 'yo-BJ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yo_BJ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_yo_BJ;\n    break;\n  case 'yo_NG':\n  case 'yo-NG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yo_NG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_yo_NG;\n    break;\n  case 'yue':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yue;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_yue;\n    break;\n  case 'yue_Hans':\n  case 'yue-Hans':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yue_Hans;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_yue_Hans;\n    break;\n  case 'yue_Hans_CN':\n  case 'yue-Hans-CN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yue_Hans_CN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_yue_Hans_CN;\n    break;\n  case 'yue_Hant':\n  case 'yue-Hant':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yue_Hant;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_yue_Hant;\n    break;\n  case 'yue_Hant_HK':\n  case 'yue-Hant-HK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_yue_Hant_HK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_yue_Hant_HK;\n    break;\n  case 'zgh':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zgh;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zgh;\n    break;\n  case 'zgh_MA':\n  case 'zgh-MA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zgh_MA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zgh_MA;\n    break;\n  case 'zh_Hans':\n  case 'zh-Hans':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hans;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zh_Hans;\n    break;\n  case 'zh_Hans_CN':\n  case 'zh-Hans-CN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hans_CN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zh_Hans_CN;\n    break;\n  case 'zh_Hans_HK':\n  case 'zh-Hans-HK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hans_HK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zh_Hans_HK;\n    break;\n  case 'zh_Hans_MO':\n  case 'zh-Hans-MO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hans_MO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zh_Hans_MO;\n    break;\n  case 'zh_Hans_SG':\n  case 'zh-Hans-SG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hans_SG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zh_Hans_SG;\n    break;\n  case 'zh_Hant':\n  case 'zh-Hant':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hant;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zh_Hant;\n    break;\n  case 'zh_Hant_HK':\n  case 'zh-Hant-HK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hant_HK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zh_Hant_HK;\n    break;\n  case 'zh_Hant_MO':\n  case 'zh-Hant-MO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hant_MO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zh_Hant_MO;\n    break;\n  case 'zh_Hant_TW':\n  case 'zh-Hant-TW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_Hant_TW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zh_Hant_TW;\n    break;\n  case 'zu_ZA':\n  case 'zu-ZA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zu_ZA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zu_ZA;\n    break;\n}\n","^;",1579837703000,"^<",["^=",["^?","~$goog.i18n.NumberFormatSymbols-u-nu-latn","~$goog.i18n.NumberFormatSymbols"]],"^@",["^ ","^A","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^B","^C","^D","^E","^F","Google Closure Library","^G","^H","^I","http://code.google.com/p/closure-library/","^J","^K","^L",["^H","0.0-20191016-6ae1f72f"],"^M","0.0-20191016-6ae1f72f"],"^I",["^N","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/numberformatsymbolsext.js"],"^O",["^=",["~$goog.i18n.NumberFormatSymbols-fr-RW","~$goog.i18n.NumberFormatSymbols_en_CC","~$goog.i18n.NumberFormatSymbols-qu-BO","~$goog.i18n.NumberFormatSymbols_ki_KE","~$goog.i18n.NumberFormatSymbols-en-CH","~$goog.i18n.NumberFormatSymbols_es_BO","~$goog.i18n.NumberFormatSymbols_mua","~$goog.i18n.NumberFormatSymbols_en_001","~$goog.i18n.NumberFormatSymbols_chr_US","~$goog.i18n.NumberFormatSymbols-en-KY","~$goog.i18n.NumberFormatSymbols-cy-GB","~$goog.i18n.NumberFormatSymbols-mk-MK","~$goog.i18n.NumberFormatSymbols-yo","~$goog.i18n.NumberFormatSymbols-jv-ID","~$goog.i18n.NumberFormatSymbols_zgh_MA","~$goog.i18n.NumberFormatSymbols_ja_JP","~$goog.i18n.NumberFormatSymbols_ta_IN","~$goog.i18n.NumberFormatSymbols_os","~$goog.i18n.NumberFormatSymbols_kok_IN","~$goog.i18n.NumberFormatSymbols-en-MO","~$goog.i18n.NumberFormatSymbols-lb-LU","~$goog.i18n.NumberFormatSymbols-kab-DZ","~$goog.i18n.NumberFormatSymbols-en-FK","~$goog.i18n.NumberFormatSymbols_fr_PF","~$goog.i18n.NumberFormatSymbols_en_TT","~$goog.i18n.NumberFormatSymbols_fr_GA","~$goog.i18n.NumberFormatSymbols_sw_KE","~$goog.i18n.NumberFormatSymbols-fr-WF","~$goog.i18n.NumberFormatSymbols-sr-Cyrl-XK","~$goog.i18n.NumberFormatSymbols-fr-BF","~$goog.i18n.NumberFormatSymbols_zh_Hans_MO","~$goog.i18n.NumberFormatSymbols-wae","~$goog.i18n.NumberFormatSymbols_en_MO","~$goog.i18n.NumberFormatSymbols_mr_IN_u_nu_latn","~$goog.i18n.NumberFormatSymbols-ii","~$goog.i18n.NumberFormatSymbols-dz-BT","~$goog.i18n.NumberFormatSymbols-rw","~$goog.i18n.NumberFormatSymbols-ar-IQ","~$goog.i18n.NumberFormatSymbols-en-MP","~$goog.i18n.NumberFormatSymbols-br-FR","~$goog.i18n.NumberFormatSymbols_en_AI","~$goog.i18n.NumberFormatSymbols_smn","~$goog.i18n.NumberFormatSymbols_sq_XK","~$goog.i18n.NumberFormatSymbols-ur-IN-u-nu-latn","~$goog.i18n.NumberFormatSymbols_fy_NL","~$goog.i18n.NumberFormatSymbols_af_ZA","~$goog.i18n.NumberFormatSymbols_or_IN","~$goog.i18n.NumberFormatSymbols-lrc-IR","~$goog.i18n.NumberFormatSymbols-en-CC","~$goog.i18n.NumberFormatSymbols_uz_Arab_u_nu_latn","~$goog.i18n.NumberFormatSymbols_ar_LY","~$goog.i18n.NumberFormatSymbols-fr-MG","~$goog.i18n.NumberFormatSymbols-uz-Arab-u-nu-latn","~$goog.i18n.NumberFormatSymbols_sg_CF","~$goog.i18n.NumberFormatSymbols-es-PE","~$goog.i18n.NumberFormatSymbols_jgo","~$goog.i18n.NumberFormatSymbols_en_BS","~$goog.i18n.NumberFormatSymbols_hr_HR","~$goog.i18n.NumberFormatSymbols-khq-ML","~$goog.i18n.NumberFormatSymbols_so_ET","~$goog.i18n.NumberFormatSymbols_pt_TL","~$goog.i18n.NumberFormatSymbols_os_RU","~$goog.i18n.NumberFormatSymbols_lrc_IQ_u_nu_latn","~$goog.i18n.NumberFormatSymbols-bo-IN","~$goog.i18n.NumberFormatSymbols_shi_Latn_MA","~$goog.i18n.NumberFormatSymbols_en_PR","~$goog.i18n.NumberFormatSymbols_en_AS","~$goog.i18n.NumberFormatSymbols-ps-AF","~$goog.i18n.NumberFormatSymbols-fr-PM","~$goog.i18n.NumberFormatSymbols-en-DK","~$goog.i18n.NumberFormatSymbols-sr-Cyrl-BA","~$goog.i18n.NumberFormatSymbols-ha","~$goog.i18n.NumberFormatSymbols-fr-NE","~$goog.i18n.NumberFormatSymbols_fa_AF_u_nu_latn","~$goog.i18n.NumberFormatSymbols-ha-NE","~$goog.i18n.NumberFormatSymbols_el_CY","~$goog.i18n.NumberFormatSymbols_en_NU","~$goog.i18n.NumberFormatSymbols_teo_KE","~$goog.i18n.NumberFormatSymbols-luo-KE","~$goog.i18n.NumberFormatSymbols_mgo_CM","~$goog.i18n.NumberFormatSymbols-ckb-IQ","~$goog.i18n.NumberFormatSymbols_de_IT","~$goog.i18n.NumberFormatSymbols-en-MU","~$goog.i18n.NumberFormatSymbols-ln-CF","~$goog.i18n.NumberFormatSymbols_jmc","~$goog.i18n.NumberFormatSymbols-pa-Arab","~$goog.i18n.NumberFormatSymbols_se_FI","~$goog.i18n.NumberFormatSymbols_fr_BF","~$goog.i18n.NumberFormatSymbols_ak","~$goog.i18n.NumberFormatSymbols_mgh","~$goog.i18n.NumberFormatSymbols-es-PR","~$goog.i18n.NumberFormatSymbols-so-SO","~$goog.i18n.NumberFormatSymbols_brx_IN","~$goog.i18n.NumberFormatSymbols_yi","~$goog.i18n.NumberFormatSymbols-en-CX","~$goog.i18n.NumberFormatSymbols-ar-BH","~$goog.i18n.NumberFormatSymbols-kde","~$goog.i18n.NumberFormatSymbols-saq","~$goog.i18n.NumberFormatSymbols_bn_BD_u_nu_latn","~$goog.i18n.NumberFormatSymbols-gv","~$goog.i18n.NumberFormatSymbols-es-GQ","~$goog.i18n.NumberFormatSymbols_sv_AX","~$goog.i18n.NumberFormatSymbols-az-Cyrl","~$goog.i18n.NumberFormatSymbols-en-001","~$goog.i18n.NumberFormatSymbols_ar_OM","~$goog.i18n.NumberFormatSymbols-hu-HU","~$goog.i18n.NumberFormatSymbols_es_IC","~$goog.i18n.NumberFormatSymbols_hy_AM","~$goog.i18n.NumberFormatSymbols-en-TZ","~$goog.i18n.NumberFormatSymbols-ar-YE","~$goog.i18n.NumberFormatSymbols-dje-NE","~$goog.i18n.NumberFormatSymbols_en_HK","~$goog.i18n.NumberFormatSymbols_es_CU","~$goog.i18n.NumberFormatSymbols_lv_LV","~$goog.i18n.NumberFormatSymbols_yav_CM","~$goog.i18n.NumberFormatSymbols-ff-Latn-BF","~$goog.i18n.NumberFormatSymbols_vun_TZ","~$goog.i18n.NumberFormatSymbols_fa_IR_u_nu_latn","~$goog.i18n.NumberFormatSymbols-km-KH","~$goog.i18n.NumberFormatSymbols-ks","~$goog.i18n.NumberFormatSymbols_dsb_DE","~$goog.i18n.NumberFormatSymbols-zh-Hant-TW","~$goog.i18n.NumberFormatSymbols_asa","~$goog.i18n.NumberFormatSymbols-lo-LA","~$goog.i18n.NumberFormatSymbols_en_ZW","~$goog.i18n.NumberFormatSymbols_ml_IN","~$goog.i18n.NumberFormatSymbols_en_KI","~$goog.i18n.NumberFormatSymbols-pt-GQ","~$goog.i18n.NumberFormatSymbols_asa_TZ","~$goog.i18n.NumberFormatSymbols-ki-KE","~$goog.i18n.NumberFormatSymbols-so","~$goog.i18n.NumberFormatSymbols_mi_NZ","~$goog.i18n.NumberFormatSymbols_bs_Latn","~$goog.i18n.NumberFormatSymbols-az-Latn","~$goog.i18n.NumberFormatSymbols_agq","~$goog.i18n.NumberFormatSymbols_sd_PK_u_nu_latn","~$goog.i18n.NumberFormatSymbols-ur-IN","~$goog.i18n.NumberFormatSymbols-en-MG","~$goog.i18n.NumberFormatSymbols-pt-AO","~$goog.i18n.NumberFormatSymbols_fr_KM","~$goog.i18n.NumberFormatSymbols-bo-CN","~$goog.i18n.NumberFormatSymbols-ff-Latn-SL","~$goog.i18n.NumberFormatSymbols_vai_Latn","~$goog.i18n.NumberFormatSymbols_ar_QA_u_nu_latn","~$goog.i18n.NumberFormatSymbols-ru-KG","~$goog.i18n.NumberFormatSymbols_zh_Hans","~$goog.i18n.NumberFormatSymbols-hr-HR","~$goog.i18n.NumberFormatSymbols-ln-CD","~$goog.i18n.NumberFormatSymbols-fr-LU","~$goog.i18n.NumberFormatSymbols_nmg","~$goog.i18n.NumberFormatSymbols_lag","~$goog.i18n.NumberFormatSymbols-ug-CN","~$goog.i18n.NumberFormatSymbols_en_MG","~$goog.i18n.NumberFormatSymbols-kok","~$goog.i18n.NumberFormatSymbols_lkt_US","~$goog.i18n.NumberFormatSymbols_ta_MY","~$goog.i18n.NumberFormatSymbols_en_CH","~$goog.i18n.NumberFormatSymbols_ckb_IR","~$goog.i18n.NumberFormatSymbols-sr-Latn-RS","~$goog.i18n.NumberFormatSymbols_ps_PK_u_nu_latn","~$goog.i18n.NumberFormatSymbols_fr_MU","~$goog.i18n.NumberFormatSymbols-ms-BN","~$goog.i18n.NumberFormatSymbols-en-TO","~$goog.i18n.NumberFormatSymbols-brx-IN","~$goog.i18n.NumberFormatSymbols-en-CM","~$goog.i18n.NumberFormatSymbols-mgh","~$goog.i18n.NumberFormatSymbols_fr_DJ","~$goog.i18n.NumberFormatSymbols_mg_MG","~$goog.i18n.NumberFormatSymbols-qu-PE","~$goog.i18n.NumberFormatSymbols-fa-AF-u-nu-latn","~$goog.i18n.NumberFormatSymbols_hi_IN","~$goog.i18n.NumberFormatSymbols-nds-DE","~$goog.i18n.NumberFormatSymbols_ar_LB","~$goog.i18n.NumberFormatSymbols_ar_SA_u_nu_latn","~$goog.i18n.NumberFormatSymbols-fr-DZ","~$goog.i18n.NumberFormatSymbols_ckb_IQ","~$goog.i18n.NumberFormatSymbols-fr-PF","~$goog.i18n.NumberFormatSymbols-en-GM","~$goog.i18n.NumberFormatSymbols-dz-BT-u-nu-latn","~$goog.i18n.NumberFormatSymbols-mt-MT","~$goog.i18n.NumberFormatSymbols_nn_NO","~$goog.i18n.NumberFormatSymbols-en-VC","~$goog.i18n.NumberFormatSymbols_xh","~$goog.i18n.NumberFormatSymbols_en_SC","~$goog.i18n.NumberFormatSymbols_rw_RW","~$goog.i18n.NumberFormatSymbols-en-NG","~$goog.i18n.NumberFormatSymbols-ar-MR","~$goog.i18n.NumberFormatSymbols_gsw_LI","~$goog.i18n.NumberFormatSymbols_zh_Hant_MO","~$goog.i18n.NumberFormatSymbols_gv_IM","~$goog.i18n.NumberFormatSymbols_nl_CW","~$goog.i18n.NumberFormatSymbols_sr_Latn_RS","~$goog.i18n.NumberFormatSymbols-yue-Hant","~$goog.i18n.NumberFormatSymbols_sbp_TZ","~$goog.i18n.NumberFormatSymbols-bn-IN","~$goog.i18n.NumberFormatSymbols_ig","~$goog.i18n.NumberFormatSymbols-ckb-IR-u-nu-latn","~$goog.i18n.NumberFormatSymbols_en_TC","~$goog.i18n.NumberFormatSymbols-ps-PK","~$goog.i18n.NumberFormatSymbols_ccp_BD_u_nu_latn","~$goog.i18n.NumberFormatSymbols-sah","~$goog.i18n.NumberFormatSymbols_en_CX","~$goog.i18n.NumberFormatSymbols_es_CO","~$goog.i18n.NumberFormatSymbols-en-BZ","~$goog.i18n.NumberFormatSymbols_en_FK","~$goog.i18n.NumberFormatSymbols_ca_FR","~$goog.i18n.NumberFormatSymbols_ff_Latn","~$goog.i18n.NumberFormatSymbols_en_PK","~$goog.i18n.NumberFormatSymbols-bem","~$goog.i18n.NumberFormatSymbols_wo_SN","~$goog.i18n.NumberFormatSymbols_ar_AE","~$goog.i18n.NumberFormatSymbols_qu_BO","~$goog.i18n.NumberFormatSymbols_ka_GE","~$goog.i18n.NumberFormatSymbols-ccp-IN","~$goog.i18n.NumberFormatSymbols_lu","~$goog.i18n.NumberFormatSymbols-en-BB","~$goog.i18n.NumberFormatSymbols_ar_KM_u_nu_latn","~$goog.i18n.NumberFormatSymbols_ff_Latn_MR","~$goog.i18n.NumberFormatSymbols_fr_LU","~$goog.i18n.NumberFormatSymbols-shi-Tfng-MA","~$goog.i18n.NumberFormatSymbols_bas","~$goog.i18n.NumberFormatSymbols-ar-AE","~$goog.i18n.NumberFormatSymbols-mua-CM","~$goog.i18n.NumberFormatSymbols-fy","~$goog.i18n.NumberFormatSymbols-es-EC","~$goog.i18n.NumberFormatSymbols-kl","~$goog.i18n.NumberFormatSymbols-en-KI","~$goog.i18n.NumberFormatSymbols-ka-GE","~$goog.i18n.NumberFormatSymbols-cgg","~$goog.i18n.NumberFormatSymbols-es-NI","~$goog.i18n.NumberFormatSymbols-rof-TZ","~$goog.i18n.NumberFormatSymbols-mgo-CM","~$goog.i18n.NumberFormatSymbols_en_BE","~$goog.i18n.NumberFormatSymbols_da_DK","~$goog.i18n.NumberFormatSymbols_ar_MR_u_nu_latn","~$goog.i18n.NumberFormatSymbols_ar_ER_u_nu_latn","~$goog.i18n.NumberFormatSymbols-is-IS","~$goog.i18n.NumberFormatSymbols_ebu","~$goog.i18n.NumberFormatSymbols_pt_CH","~$goog.i18n.NumberFormatSymbols-kea","~$goog.i18n.NumberFormatSymbols_ms_SG","~$goog.i18n.NumberFormatSymbols_it_CH","~$goog.i18n.NumberFormatSymbols_sr_Latn_BA","~$goog.i18n.NumberFormatSymbols_sw_TZ","~$goog.i18n.NumberFormatSymbols_sw_UG","~$goog.i18n.NumberFormatSymbols-en-PG","~$goog.i18n.NumberFormatSymbols_fr_CG","~$goog.i18n.NumberFormatSymbols-fa-AF","~$goog.i18n.NumberFormatSymbols_ca_ES","~$goog.i18n.NumberFormatSymbols-zu-ZA","~$goog.i18n.NumberFormatSymbols-yue-Hans-CN","~$goog.i18n.NumberFormatSymbols-xog-UG","~$goog.i18n.NumberFormatSymbols-jgo-CM","~$goog.i18n.NumberFormatSymbols-uz-Latn-UZ","~$goog.i18n.NumberFormatSymbols-saq-KE","~$goog.i18n.NumberFormatSymbols_ckb_IR_u_nu_latn","~$goog.i18n.NumberFormatSymbols_en_BM","~$goog.i18n.NumberFormatSymbols-tt-RU","~$goog.i18n.NumberFormatSymbols_bn_BD","~$goog.i18n.NumberFormatSymbols_xog","~$goog.i18n.NumberFormatSymbols-ee-TG","~$goog.i18n.NumberFormatSymbols-en-TC","~$goog.i18n.NumberFormatSymbols_en_CK","~$goog.i18n.NumberFormatSymbols-ru-BY","~$goog.i18n.NumberFormatSymbols_en_SI","~$goog.i18n.NumberFormatSymbols-en-LC","~$goog.i18n.NumberFormatSymbols_en_KN","~$goog.i18n.NumberFormatSymbols-as-u-nu-latn","~$goog.i18n.NumberFormatSymbols-zh-Hant","~$goog.i18n.NumberFormatSymbols_ff_Latn_NE","~$goog.i18n.NumberFormatSymbols-lrc-IQ","~$goog.i18n.NumberFormatSymbols-en-UM","~$goog.i18n.NumberFormatSymbols_ta_SG","~$goog.i18n.NumberFormatSymbols_lb_LU","~$goog.i18n.NumberFormatSymbols-es-EA","~$goog.i18n.NumberFormatSymbols-ar-PS-u-nu-latn","~$goog.i18n.NumberFormatSymbols_fr_FR","~$goog.i18n.NumberFormatSymbols_fy","~$goog.i18n.NumberFormatSymbols_ewo_CM","~$goog.i18n.NumberFormatSymbols_fr_RW","~$goog.i18n.NumberFormatSymbols-mgo","~$goog.i18n.NumberFormatSymbols_shi","~$goog.i18n.NumberFormatSymbols_kw","~$goog.i18n.NumberFormatSymbols-ar-001","~$goog.i18n.NumberFormatSymbols_es_SV","~$goog.i18n.NumberFormatSymbols-dsb","~$goog.i18n.NumberFormatSymbols-se-FI","~$goog.i18n.NumberFormatSymbols_uz_Latn","~$goog.i18n.NumberFormatSymbols_saq","~$goog.i18n.NumberFormatSymbols_gsw_CH","~$goog.i18n.NumberFormatSymbols_brx","~$goog.i18n.NumberFormatSymbols_ff_Latn_GW","~$goog.i18n.NumberFormatSymbols_en_ER","~$goog.i18n.NumberFormatSymbols-ee-GH","~$goog.i18n.NumberFormatSymbols-fr-MU","~$goog.i18n.NumberFormatSymbols_fr_YT","~$goog.i18n.NumberFormatSymbols-tzm-MA","~$goog.i18n.NumberFormatSymbols-en-LR","~$goog.i18n.NumberFormatSymbols-ar-MR-u-nu-latn","~$goog.i18n.NumberFormatSymbols-nd-ZW","~$goog.i18n.NumberFormatSymbols_ebu_KE","~$goog.i18n.NumberFormatSymbols_en_GH","~$goog.i18n.NumberFormatSymbols_ar_IQ","~$goog.i18n.NumberFormatSymbols_ff_Latn_SN","~$goog.i18n.NumberFormatSymbols-en-BW","~$goog.i18n.NumberFormatSymbols-xh-ZA","~$goog.i18n.NumberFormatSymbols-sn-ZW","~$goog.i18n.NumberFormatSymbols-en-TV","~$goog.i18n.NumberFormatSymbols_en_IL","~$goog.i18n.NumberFormatSymbols_rwk_TZ","~$goog.i18n.NumberFormatSymbols-or-IN","~$goog.i18n.NumberFormatSymbols_kab","~$goog.i18n.NumberFormatSymbols_ar_AE_u_nu_latn","~$goog.i18n.NumberFormatSymbols-nds-NL","~$goog.i18n.NumberFormatSymbols_dz_BT_u_nu_latn","~$goog.i18n.NumberFormatSymbols_rw","~$goog.i18n.NumberFormatSymbols_nd_ZW","~$goog.i18n.NumberFormatSymbols_en_GG","~$goog.i18n.NumberFormatSymbols_pt_MO","~$goog.i18n.NumberFormatSymbols_sk_SK","~$goog.i18n.NumberFormatSymbols_cgg","~$goog.i18n.NumberFormatSymbols_fr_PM","~$goog.i18n.NumberFormatSymbols_nmg_CM","~$goog.i18n.NumberFormatSymbols_ru_MD","~$goog.i18n.NumberFormatSymbols-ccp-BD","~$goog.i18n.NumberFormatSymbols_ti_ET","~$goog.i18n.NumberFormatSymbols_lrc_IR","~$goog.i18n.NumberFormatSymbols-sd-PK-u-nu-latn","~$goog.i18n.NumberFormatSymbols_ar_YE","~$goog.i18n.NumberFormatSymbols_en_150","~$goog.i18n.NumberFormatSymbols-ug","~$goog.i18n.NumberFormatSymbols-kln-KE","~$goog.i18n.NumberFormatSymbols_ug_CN","~$goog.i18n.NumberFormatSymbols-en-PK","~$goog.i18n.NumberFormatSymbols_en_VC","~$goog.i18n.NumberFormatSymbols-nl-AW","~$goog.i18n.NumberFormatSymbols-tt","~$goog.i18n.NumberFormatSymbols-en-IM","~$goog.i18n.NumberFormatSymbols_en_NG","~$goog.i18n.NumberFormatSymbols_fr_CH","~$goog.i18n.NumberFormatSymbols_ks","~$goog.i18n.NumberFormatSymbols-fr-TD","~$goog.i18n.NumberFormatSymbols-sr-Latn-XK","~$goog.i18n.NumberFormatSymbols_bn_IN_u_nu_latn","~$goog.i18n.NumberFormatSymbols_sd_PK","~$goog.i18n.NumberFormatSymbols_uz_Cyrl","~$goog.i18n.NumberFormatSymbols-zh-Hans","~$goog.i18n.NumberFormatSymbols-ms-SG","~$goog.i18n.NumberFormatSymbols_zgh","~$goog.i18n.NumberFormatSymbols-de-LI","~$goog.i18n.NumberFormatSymbols-ar-OM","~$goog.i18n.NumberFormatSymbols-kln","~$goog.i18n.NumberFormatSymbols_ar_QA","~$goog.i18n.NumberFormatSymbols_sr_Cyrl_XK","~$goog.i18n.NumberFormatSymbols_to_TO","~$goog.i18n.NumberFormatSymbols-mer-KE","~$goog.i18n.NumberFormatSymbols_seh_MZ","~$goog.i18n.NumberFormatSymbols_es_HN","~$goog.i18n.NumberFormatSymbols_mi","~$goog.i18n.NumberFormatSymbols-wo","~$goog.i18n.NumberFormatSymbols_ar_TN","~$goog.i18n.NumberFormatSymbols-es-PY","~$goog.i18n.NumberFormatSymbols-dua-CM","~$goog.i18n.NumberFormatSymbols-ff-Latn-MR","~$goog.i18n.NumberFormatSymbols_ccp_IN_u_nu_latn","~$goog.i18n.NumberFormatSymbols_dsb","~$goog.i18n.NumberFormatSymbols-lu-CD","~$goog.i18n.NumberFormatSymbols-bem-ZM","~$goog.i18n.NumberFormatSymbols_sbp","~$goog.i18n.NumberFormatSymbols-yi-001","~$goog.i18n.NumberFormatSymbols-en-DG","~$goog.i18n.NumberFormatSymbols-seh-MZ","~$goog.i18n.NumberFormatSymbols_ff_Latn_GM","~$goog.i18n.NumberFormatSymbols_ln_CD","~$goog.i18n.NumberFormatSymbols_mfe","~$goog.i18n.NumberFormatSymbols_om","~$goog.i18n.NumberFormatSymbols_wo","~$goog.i18n.NumberFormatSymbols-en-FI","~$goog.i18n.NumberFormatSymbols_mas","~$goog.i18n.NumberFormatSymbols_ar_DJ","~$goog.i18n.NumberFormatSymbols-en-DM","~$goog.i18n.NumberFormatSymbols_qu_PE","~$goog.i18n.NumberFormatSymbols-en-NZ","~$goog.i18n.NumberFormatSymbols-ksh-DE","~$goog.i18n.NumberFormatSymbols_kea","~$goog.i18n.NumberFormatSymbols-sd-PK","~$goog.i18n.NumberFormatSymbols-sg-CF","~$goog.i18n.NumberFormatSymbols_twq","~$goog.i18n.NumberFormatSymbols_sq_AL","~$goog.i18n.NumberFormatSymbols_es_BR","~$goog.i18n.NumberFormatSymbols_ur_IN","~$goog.i18n.NumberFormatSymbols_en_JE","~$goog.i18n.NumberFormatSymbols-mn-MN","~$goog.i18n.NumberFormatSymbols_fr_BE","~$goog.i18n.NumberFormatSymbols-jv","~$goog.i18n.NumberFormatSymbols-gd","~$goog.i18n.NumberFormatSymbols-ar-KW-u-nu-latn","~$goog.i18n.NumberFormatSymbols-luy","~$goog.i18n.NumberFormatSymbols_dua_CM","~$goog.i18n.NumberFormatSymbols_en_MT","~$goog.i18n.NumberFormatSymbols-pt-CH","~$goog.i18n.NumberFormatSymbols-pa-Arab-u-nu-latn","~$goog.i18n.NumberFormatSymbols_hu_HU","~$goog.i18n.NumberFormatSymbols_az_Cyrl_AZ","~$goog.i18n.NumberFormatSymbols_ar_IL","~$goog.i18n.NumberFormatSymbols_ii","~$goog.i18n.NumberFormatSymbols_nl_NL","~$goog.i18n.NumberFormatSymbols_bas_CM","~$goog.i18n.NumberFormatSymbols_et_EE","~$goog.i18n.NumberFormatSymbols-en-SC","~$goog.i18n.NumberFormatSymbols-bez-TZ","~$goog.i18n.NumberFormatSymbols-bn-BD-u-nu-latn","~$goog.i18n.NumberFormatSymbols_en_KY","~$goog.i18n.NumberFormatSymbols_ru_KG","~$goog.i18n.NumberFormatSymbols_de_LI","~$goog.i18n.NumberFormatSymbols_ff_Latn_LR","~$goog.i18n.NumberFormatSymbols_fr_TG","~$goog.i18n.NumberFormatSymbols-fr-MF","~$goog.i18n.NumberFormatSymbols-sv-FI","~$goog.i18n.NumberFormatSymbols-teo-KE","~$goog.i18n.NumberFormatSymbols_fr_NE","~$goog.i18n.NumberFormatSymbols-om-KE","~$goog.i18n.NumberFormatSymbols_dje","~$goog.i18n.NumberFormatSymbols_bg_BG","~$goog.i18n.NumberFormatSymbols-uk-UA","~$goog.i18n.NumberFormatSymbols_mfe_MU","~$goog.i18n.NumberFormatSymbols-es-CU","~$goog.i18n.NumberFormatSymbols-mua","~$goog.i18n.NumberFormatSymbols_tzm","~$goog.i18n.NumberFormatSymbols-en-GU","~$goog.i18n.NumberFormatSymbols-ee","~$goog.i18n.NumberFormatSymbols-se-SE","~$goog.i18n.NumberFormatSymbols-dz-u-nu-latn","~$goog.i18n.NumberFormatSymbols_uk_UA","~$goog.i18n.NumberFormatSymbols-bs-Cyrl-BA","~$goog.i18n.NumberFormatSymbols_uz_Arab_AF","~$goog.i18n.NumberFormatSymbols-en-BM","~$goog.i18n.NumberFormatSymbols_en_GM","~$goog.i18n.NumberFormatSymbols-naq-NA","~$goog.i18n.NumberFormatSymbols-en-CY","~$goog.i18n.NumberFormatSymbols_nl_BE","~$goog.i18n.NumberFormatSymbols_fa_IR","~$goog.i18n.NumberFormatSymbols_de_BE","~$goog.i18n.NumberFormatSymbols_ks_IN","~$goog.i18n.NumberFormatSymbols_ia","~$goog.i18n.NumberFormatSymbols_en_FJ","~$goog.i18n.NumberFormatSymbols-ses","~$goog.i18n.NumberFormatSymbols_rm","~$goog.i18n.NumberFormatSymbols_es_AR","~$goog.i18n.NumberFormatSymbols-nl-NL","~$goog.i18n.NumberFormatSymbols-fr-SC","~$goog.i18n.NumberFormatSymbols_ha_GH","~$goog.i18n.NumberFormatSymbols-my-MM-u-nu-latn","~$goog.i18n.NumberFormatSymbols-fr-GP","~$goog.i18n.NumberFormatSymbols_fr_BL","~$goog.i18n.NumberFormatSymbols_kok","~$goog.i18n.NumberFormatSymbols-en-AT","~$goog.i18n.NumberFormatSymbols-kw","~$goog.i18n.NumberFormatSymbols_jv_ID","~$goog.i18n.NumberFormatSymbols-en-PH","~$goog.i18n.NumberFormatSymbols_rwk","~$goog.i18n.NumberFormatSymbols_en_PG","~$goog.i18n.NumberFormatSymbols-ta-LK","~$goog.i18n.NumberFormatSymbols-lrc-u-nu-latn","~$goog.i18n.NumberFormatSymbols-es-CR","~$goog.i18n.NumberFormatSymbols_ee_GH","~$goog.i18n.NumberFormatSymbols-mr-IN-u-nu-latn","~$goog.i18n.NumberFormatSymbols-chr-US","~$goog.i18n.NumberFormatSymbols-nnh","~$goog.i18n.NumberFormatSymbols-es-BZ","~$goog.i18n.NumberFormatSymbols-rw-RW","~$goog.i18n.NumberFormatSymbols_yue_Hant","~$goog.i18n.NumberFormatSymbols-os","~$goog.i18n.NumberFormatSymbols_ps_AF","~$goog.i18n.NumberFormatSymbols-da-GL","~$goog.i18n.NumberFormatSymbols_sq_MK","~$goog.i18n.NumberFormatSymbols_yue_Hans_CN","~$goog.i18n.NumberFormatSymbols_es_BZ","~$goog.i18n.NumberFormatSymbols-yue-Hant-HK","~$goog.i18n.NumberFormatSymbols-ckb-IR","~$goog.i18n.NumberFormatSymbols-sr-Cyrl-RS","~$goog.i18n.NumberFormatSymbols-el-GR","~$goog.i18n.NumberFormatSymbols-fr-CI","~$goog.i18n.NumberFormatSymbols_so","~$goog.i18n.NumberFormatSymbols_lt_LT","~$goog.i18n.NumberFormatSymbols_ii_CN","~$goog.i18n.NumberFormatSymbols_en_LC","~$goog.i18n.NumberFormatSymbols_om_KE","~$goog.i18n.NumberFormatSymbols_en_TZ","~$goog.i18n.NumberFormatSymbols-asa","~$goog.i18n.NumberFormatSymbols-vai","~$goog.i18n.NumberFormatSymbols-ar-SA-u-nu-latn","~$goog.i18n.NumberFormatSymbols-tk","~$goog.i18n.NumberFormatSymbols-naq","~$goog.i18n.NumberFormatSymbols_ro_RO","~$goog.i18n.NumberFormatSymbols-kn-IN","~$goog.i18n.NumberFormatSymbols_mgh_MZ","~$goog.i18n.NumberFormatSymbols_ur_PK","~$goog.i18n.NumberFormatSymbols_dav","~$goog.i18n.NumberFormatSymbols-dje","~$goog.i18n.NumberFormatSymbols_ky_KG","~$goog.i18n.NumberFormatSymbols-fr-BJ","~$goog.i18n.NumberFormatSymbols-cgg-UG","~$goog.i18n.NumberFormatSymbols_en_CY","~$goog.i18n.NumberFormatSymbols-yue-Hans","~$goog.i18n.NumberFormatSymbols-kw-GB","~$goog.i18n.NumberFormatSymbols-kde-TZ","~$goog.i18n.NumberFormatSymbols_ff_Latn_NG","~$goog.i18n.NumberFormatSymbols-yav","~$goog.i18n.NumberFormatSymbols-ckb-u-nu-latn","~$goog.i18n.NumberFormatSymbols_zh_Hant_TW","~$goog.i18n.NumberFormatSymbols-ar-BH-u-nu-latn","~$goog.i18n.NumberFormatSymbols_en_KE","~$goog.i18n.NumberFormatSymbols_sn","~$goog.i18n.NumberFormatSymbols_ccp_u_nu_latn","~$goog.i18n.NumberFormatSymbols_nl_AW","~$goog.i18n.NumberFormatSymbols-yo-BJ","~$goog.i18n.NumberFormatSymbols-nl-BQ","~$goog.i18n.NumberFormatSymbols_tg_TJ","~$goog.i18n.NumberFormatSymbols-ar-MA","~$goog.i18n.NumberFormatSymbols-si-LK","~$goog.i18n.NumberFormatSymbols_pt_GQ","~$goog.i18n.NumberFormatSymbols_fr_WF","~$goog.i18n.NumberFormatSymbols_yo_NG","~$goog.i18n.NumberFormatSymbols-nmg-CM","~$goog.i18n.NumberFormatSymbols_de_DE","~$goog.i18n.NumberFormatSymbols-de-BE","~$goog.i18n.NumberFormatSymbols-ff-Latn-GN","~$goog.i18n.NumberFormatSymbols_dyo_SN","~$goog.i18n.NumberFormatSymbols_mr_IN","~$goog.i18n.NumberFormatSymbols-es-BO","~$goog.i18n.NumberFormatSymbols-ks-u-nu-latn","~$goog.i18n.NumberFormatSymbols_teo_UG","~$goog.i18n.NumberFormatSymbols_ps_u_nu_latn","~$goog.i18n.NumberFormatSymbols-sq-AL","~$goog.i18n.NumberFormatSymbols_ar_SO_u_nu_latn","~$goog.i18n.NumberFormatSymbols-en-SD","~$goog.i18n.NumberFormatSymbols-mzn-IR-u-nu-latn","~$goog.i18n.NumberFormatSymbols-ru-RU","~$goog.i18n.NumberFormatSymbols-ar-AE-u-nu-latn","~$goog.i18n.NumberFormatSymbols-lt-LT","~$goog.i18n.NumberFormatSymbols-hsb","~$goog.i18n.NumberFormatSymbols-sn","~$goog.i18n.NumberFormatSymbols-fr-MA","~$goog.i18n.NumberFormatSymbols-en-TT","~$goog.i18n.NumberFormatSymbols_so_SO","~$goog.i18n.NumberFormatSymbols-vai-Latn","~$goog.i18n.NumberFormatSymbols-tg","~$goog.i18n.NumberFormatSymbols_nds_NL","~$goog.i18n.NumberFormatSymbols_en_LS","~$goog.i18n.NumberFormatSymbols_gd","~$goog.i18n.NumberFormatSymbols_se_SE","~$goog.i18n.NumberFormatSymbols-tr-TR","~$goog.i18n.NumberFormatSymbols_ne_NP","~$goog.i18n.NumberFormatSymbols-ar-SO","~$goog.i18n.NumberFormatSymbols_ti_ER","~$goog.i18n.NumberFormatSymbols-ru-KZ","~$goog.i18n.NumberFormatSymbols-wae-CH","~$goog.i18n.NumberFormatSymbols_vun","~$goog.i18n.NumberFormatSymbols-kam","~$goog.i18n.NumberFormatSymbols_en_DM","~$goog.i18n.NumberFormatSymbols-bn-BD","~$goog.i18n.NumberFormatSymbols-en-MT","~$goog.i18n.NumberFormatSymbols_ff_Latn_BF","~$goog.i18n.NumberFormatSymbols_ar_LB_u_nu_latn","~$goog.i18n.NumberFormatSymbols_sr_Cyrl_ME","~$goog.i18n.NumberFormatSymbols-ur-PK","~$goog.i18n.NumberFormatSymbols_fr_MG","~$goog.i18n.NumberFormatSymbols-en-XA","~$goog.i18n.NumberFormatSymbols_sr_Cyrl","~$goog.i18n.NumberFormatSymbols_ar_KM","~$goog.i18n.NumberFormatSymbols_tt_RU","~$goog.i18n.NumberFormatSymbols_lrc_u_nu_latn","~$goog.i18n.NumberFormatSymbols_ccp_IN","~$goog.i18n.NumberFormatSymbols-uz-Latn","~$goog.i18n.NumberFormatSymbols-es-HN","~$goog.i18n.NumberFormatSymbols-zgh","~$goog.i18n.NumberFormatSymbols_en_MH","~$goog.i18n.NumberFormatSymbols-ps-PK-u-nu-latn","~$goog.i18n.NumberFormatSymbols_en_NZ","~$goog.i18n.NumberFormatSymbols-fil-PH","~$goog.i18n.NumberFormatSymbols-ro-RO","~$goog.i18n.NumberFormatSymbols-guz-KE","~$goog.i18n.NumberFormatSymbols-en-SL","~$goog.i18n.NumberFormatSymbols_as_IN_u_nu_latn","~$goog.i18n.NumberFormatSymbols-om","~$goog.i18n.NumberFormatSymbols_ki","~$goog.i18n.NumberFormatSymbols_en_IM","~$goog.i18n.NumberFormatSymbols-en-MS","~$goog.i18n.NumberFormatSymbols_bo_IN","~$goog.i18n.NumberFormatSymbols_en_BB","~$goog.i18n.NumberFormatSymbols_en_NL","~$goog.i18n.NumberFormatSymbols_en_MP","~$goog.i18n.NumberFormatSymbols_luy","~$goog.i18n.NumberFormatSymbols_ar_MA","~$goog.i18n.NumberFormatSymbols-ak","~$goog.i18n.NumberFormatSymbols-lag","~$goog.i18n.NumberFormatSymbols_zu_ZA","~$goog.i18n.NumberFormatSymbols-to","~$goog.i18n.NumberFormatSymbols_mas_TZ","~$goog.i18n.NumberFormatSymbols-kok-IN","~$goog.i18n.NumberFormatSymbols-ar-YE-u-nu-latn","~$goog.i18n.NumberFormatSymbols_ks_IN_u_nu_latn","~$goog.i18n.NumberFormatSymbols_en_PW","~$goog.i18n.NumberFormatSymbols-nyn-UG","~$goog.i18n.NumberFormatSymbols-en-NL","~$goog.i18n.NumberFormatSymbols-uz-Cyrl","~$goog.i18n.NumberFormatSymbols-lkt-US","~$goog.i18n.NumberFormatSymbols-en-150","~$goog.i18n.NumberFormatSymbols_ln_AO","~$goog.i18n.NumberFormatSymbols_fr_MR","~$goog.i18n.NumberFormatSymbols-sg","~$goog.i18n.NumberFormatSymbols-en-BE","~$goog.i18n.NumberFormatSymbols_gu_IN","~$goog.i18n.NumberFormatSymbols-dua","~$goog.i18n.NumberFormatSymbols-he-IL","~$goog.i18n.NumberFormatSymbols-mgh-MZ","~$goog.i18n.NumberFormatSymbols_sr_Latn_XK","~$goog.i18n.NumberFormatSymbols-sw-TZ","~$goog.i18n.NumberFormatSymbols_as_u_nu_latn","~$goog.i18n.NumberFormatSymbols-ps","~$goog.i18n.NumberFormatSymbols-lg","~$goog.i18n.NumberFormatSymbols-ksb-TZ","~$goog.i18n.NumberFormatSymbols_en_SZ","~$goog.i18n.NumberFormatSymbols_en_XA","~$goog.i18n.NumberFormatSymbols-en-AG","~$goog.i18n.NumberFormatSymbols-rwk-TZ","~$goog.i18n.NumberFormatSymbols_pt_ST","~$goog.i18n.NumberFormatSymbols_lrc_IQ","~$goog.i18n.NumberFormatSymbols_uz_Arab_AF_u_nu_latn","~$goog.i18n.NumberFormatSymbols_fr_CD","~$goog.i18n.NumberFormatSymbols-xog","~$goog.i18n.NumberFormatSymbols-os-RU","~$goog.i18n.NumberFormatSymbols_se","~$goog.i18n.NumberFormatSymbols-gsw-FR","~$goog.i18n.NumberFormatSymbols-nmg","~$goog.i18n.NumberFormatSymbols-ha-NG","~$goog.i18n.NumberFormatSymbols_pa_Arab_PK_u_nu_latn","~$goog.i18n.NumberFormatSymbols-zh-Hans-SG","~$goog.i18n.NumberFormatSymbols-ne-NP-u-nu-latn","~$goog.i18n.NumberFormatSymbols-fr-CD","~$goog.i18n.NumberFormatSymbols_guz_KE","~$goog.i18n.NumberFormatSymbols-ar-QA-u-nu-latn","~$goog.i18n.NumberFormatSymbols-fr-SN","~$goog.i18n.NumberFormatSymbols_br_FR","~$goog.i18n.NumberFormatSymbols-ca-FR","~$goog.i18n.NumberFormatSymbols-fr-MC","~$goog.i18n.NumberFormatSymbols-gsw-LI","~$goog.i18n.NumberFormatSymbols_ti","~$goog.i18n.NumberFormatSymbols-ast","~$goog.i18n.NumberFormatSymbols_my_MM","~$goog.i18n.NumberFormatSymbols-fr-HT","~$goog.i18n.NumberFormatSymbols_en_AG","~$goog.i18n.NumberFormatSymbols_en_NA","~$goog.i18n.NumberFormatSymbols_th_TH","~$goog.i18n.NumberFormatSymbols-de-IT","~$goog.i18n.NumberFormatSymbols_mzn_u_nu_latn","~$goog.i18n.NumberFormatSymbols_kam","~$goog.i18n.NumberFormatSymbols-haw-US","~$goog.i18n.NumberFormatSymbols-tg-TJ","~$goog.i18n.NumberFormatSymbols-es-PH","~$goog.i18n.NumberFormatSymbols_ha_NE","~$goog.i18n.NumberFormatSymbols-bs-Latn","~$goog.i18n.NumberFormatSymbols_bm_ML","~$goog.i18n.NumberFormatSymbols-so-DJ","~$goog.i18n.NumberFormatSymbols_ms_BN","~$goog.i18n.NumberFormatSymbols_ps","~$goog.i18n.NumberFormatSymbols_rof_TZ","~$goog.i18n.NumberFormatSymbols-fo","~$goog.i18n.NumberFormatSymbols-uz-Arab-AF-u-nu-latn","~$goog.i18n.NumberFormatSymbols-ko-KR","~$goog.i18n.NumberFormatSymbols_naq","~$goog.i18n.NumberFormatSymbols-ar-SY-u-nu-latn","~$goog.i18n.NumberFormatSymbols-nn","~$goog.i18n.NumberFormatSymbols-ff-Latn-GW","~$goog.i18n.NumberFormatSymbols_cs_CZ","~$goog.i18n.NumberFormatSymbols_hsb","~$goog.i18n.NumberFormatSymbols_ee","~$goog.i18n.NumberFormatSymbols_ce","~$goog.i18n.NumberFormatSymbols_mt_MT","~$goog.i18n.NumberFormatSymbols-sq-MK","~$goog.i18n.NumberFormatSymbols_kam_KE","~$goog.i18n.NumberFormatSymbols-ce-RU","~$goog.i18n.NumberFormatSymbols_luo_KE","~$goog.i18n.NumberFormatSymbols-lu","~$goog.i18n.NumberFormatSymbols_ar_SD_u_nu_latn","~$goog.i18n.NumberFormatSymbols-bas","~$goog.i18n.NumberFormatSymbols-os-GE","~$goog.i18n.NumberFormatSymbols_wae_CH","~$goog.i18n.NumberFormatSymbols_is_IS","~$goog.i18n.NumberFormatSymbols-twq","~$goog.i18n.NumberFormatSymbols_lb","~$goog.i18n.NumberFormatSymbols-it-IT","~$goog.i18n.NumberFormatSymbols_en_WS","~$goog.i18n.NumberFormatSymbols-en-VU","~$goog.i18n.NumberFormatSymbols-it-CH","~$goog.i18n.NumberFormatSymbols_ar_BH","~$goog.i18n.NumberFormatSymbols_ar_OM_u_nu_latn","~$goog.i18n.NumberFormatSymbols_bez","~$goog.i18n.NumberFormatSymbols_ar_XB","~$goog.i18n.NumberFormatSymbols-nb-SJ","~$goog.i18n.NumberFormatSymbols_az_Latn","~$goog.i18n.NumberFormatSymbols_en_TV","~$goog.i18n.NumberFormatSymbols-af-ZA","~$goog.i18n.NumberFormatSymbols_nn","~$goog.i18n.NumberFormatSymbols_jmc_TZ","~$goog.i18n.NumberFormatSymbols-en-CK","~$goog.i18n.NumberFormatSymbols-mzn-IR","~$goog.i18n.NumberFormatSymbols-fr-GQ","~$goog.i18n.NumberFormatSymbols_eo_001","~$goog.i18n.NumberFormatSymbols-ar-TN","~$goog.i18n.NumberFormatSymbols-sq-XK","~$goog.i18n.NumberFormatSymbols-de-DE","~$goog.i18n.NumberFormatSymbols-fr-MQ","~$goog.i18n.NumberFormatSymbols_ru_UA","~$goog.i18n.NumberFormatSymbols-ses-ML","~$goog.i18n.NumberFormatSymbols_ar_IL_u_nu_latn","~$goog.i18n.NumberFormatSymbols-yo-NG","~$goog.i18n.NumberFormatSymbols_ff_Latn_SL","~$goog.i18n.NumberFormatSymbols_en_CM","~$goog.i18n.NumberFormatSymbols-en-VI","~$goog.i18n.NumberFormatSymbols-en-PN","~$goog.i18n.NumberFormatSymbols-ar-SS-u-nu-latn","~$goog.i18n.NumberFormatSymbols-en-KE","~$goog.i18n.NumberFormatSymbols_ckb","~$goog.i18n.NumberFormatSymbols-fy-NL","~$goog.i18n.NumberFormatSymbols-en-JM","~$goog.i18n.NumberFormatSymbols_kw_GB","~$goog.i18n.NumberFormatSymbols_lrc","~$goog.i18n.NumberFormatSymbols-ewo","~$goog.i18n.NumberFormatSymbols-ta-SG","~$goog.i18n.NumberFormatSymbols_mn_MN","~$goog.i18n.NumberFormatSymbols-ksb","~$goog.i18n.NumberFormatSymbols_ksb_TZ","~$goog.i18n.NumberFormatSymbols-en-BI","~$goog.i18n.NumberFormatSymbols_bs_Cyrl","~$goog.i18n.NumberFormatSymbols-teo-UG","~$goog.i18n.NumberFormatSymbols_ga_IE","~$goog.i18n.NumberFormatSymbols-teo","~$goog.i18n.NumberFormatSymbols-nyn","~$goog.i18n.NumberFormatSymbols-mer","~$goog.i18n.NumberFormatSymbols_ar_PS_u_nu_latn","~$goog.i18n.NumberFormatSymbols_es_DO","~$goog.i18n.NumberFormatSymbols_zh_Hant","~$goog.i18n.NumberFormatSymbols_as","~$goog.i18n.NumberFormatSymbols-zh-Hans-MO","~$goog.i18n.NumberFormatSymbols-az-Latn-AZ","~$goog.i18n.NumberFormatSymbols-fr-GF","~$goog.i18n.NumberFormatSymbols_ksb","~$goog.i18n.NumberFormatSymbols_bez_TZ","~$goog.i18n.NumberFormatSymbols-ar-IL-u-nu-latn","~$goog.i18n.NumberFormatSymbols_fil_PH","~$goog.i18n.NumberFormatSymbols_ne_IN_u_nu_latn","~$goog.i18n.NumberFormatSymbols_yo_BJ","~$goog.i18n.NumberFormatSymbols-lag-TZ","~$goog.i18n.NumberFormatSymbols_cgg_UG","~$goog.i18n.NumberFormatSymbols_ha_NG","~$goog.i18n.NumberFormatSymbols-en-KN","~$goog.i18n.NumberFormatSymbols_ne_NP_u_nu_latn","~$goog.i18n.NumberFormatSymbols_ar_DJ_u_nu_latn","~$goog.i18n.NumberFormatSymbols_nyn","~$goog.i18n.NumberFormatSymbols-ln-AO","~$goog.i18n.NumberFormatSymbols-it-SM","~$goog.i18n.NumberFormatSymbols_en_UM","~$goog.i18n.NumberFormatSymbols-ar-KM","~$goog.i18n.NumberFormatSymbols_kab_DZ","~$goog.i18n.NumberFormatSymbols_ar_SS","~$goog.i18n.NumberFormatSymbols_el_GR","~$goog.i18n.NumberFormatSymbols_az_Cyrl","~$goog.i18n.NumberFormatSymbols_nl_BQ","~$goog.i18n.NumberFormatSymbols-lkt","~$goog.i18n.NumberFormatSymbols_dav_KE","~$goog.i18n.NumberFormatSymbols_fr_MF","~$goog.i18n.NumberFormatSymbols_tk_TM","~$goog.i18n.NumberFormatSymbols-ar-IQ-u-nu-latn","~$goog.i18n.NumberFormatSymbols_kkj","~$goog.i18n.NumberFormatSymbols_es_NI","~$goog.i18n.NumberFormatSymbols-se","~$goog.i18n.NumberFormatSymbols_es_CR","~$goog.i18n.NumberFormatSymbols-rm-CH","~$goog.i18n.NumberFormatSymbols_en_AE","~$goog.i18n.NumberFormatSymbols_luy_KE","~$goog.i18n.NumberFormatSymbols_xh_ZA","~$goog.i18n.NumberFormatSymbols_pa_Guru_IN","~$goog.i18n.NumberFormatSymbols_vai_Vaii_LR","~$goog.i18n.NumberFormatSymbols_ar_SY_u_nu_latn","~$goog.i18n.NumberFormatSymbols-kab","~$goog.i18n.NumberFormatSymbols_sah","~$goog.i18n.NumberFormatSymbols_en_PN","~$goog.i18n.NumberFormatSymbols-ar-JO","~$goog.i18n.NumberFormatSymbols-nus-SS","~$goog.i18n.NumberFormatSymbols-twq-NE","~$goog.i18n.NumberFormatSymbols_ceb_PH","~$goog.i18n.NumberFormatSymbols_en_TO","~$goog.i18n.NumberFormatSymbols-pa-Arab-PK-u-nu-latn","~$goog.i18n.NumberFormatSymbols-en-GG","~$goog.i18n.NumberFormatSymbols-yi","~$goog.i18n.NumberFormatSymbols-kea-CV","~$goog.i18n.NumberFormatSymbols_kkj_CM","~$goog.i18n.NumberFormatSymbols_nd","~$goog.i18n.NumberFormatSymbols_ku","~$goog.i18n.NumberFormatSymbols_ar_MR","~$goog.i18n.NumberFormatSymbols_fr_GQ","~$goog.i18n.NumberFormatSymbols_kea_CV","~$goog.i18n.NumberFormatSymbols_ko_KP","~$goog.i18n.NumberFormatSymbols_ar_KW","~$goog.i18n.NumberFormatSymbols_ar_ER","~$goog.i18n.NumberFormatSymbols_rn_BI","~$goog.i18n.NumberFormatSymbols-pl-PL","~$goog.i18n.NumberFormatSymbols-ta-MY","~$goog.i18n.NumberFormatSymbols_mzn_IR","~$goog.i18n.NumberFormatSymbols_nnh_CM","~$goog.i18n.NumberFormatSymbols-en-ER","~$goog.i18n.NumberFormatSymbols-eo-001","~$goog.i18n.NumberFormatSymbols-et-EE","~$goog.i18n.NumberFormatSymbols-it-VA","~$goog.i18n.NumberFormatSymbols_en_BW","~$goog.i18n.NumberFormatSymbols-ar-LY","~$goog.i18n.NumberFormatSymbols-ar-JO-u-nu-latn","~$goog.i18n.NumberFormatSymbols_ccp_BD","~$goog.i18n.NumberFormatSymbols_ug","~$goog.i18n.NumberFormatSymbols_mk_MK","~$goog.i18n.NumberFormatSymbols_ksh","~$goog.i18n.NumberFormatSymbols_en_BI","~$goog.i18n.NumberFormatSymbols_zh_Hant_HK","~$goog.i18n.NumberFormatSymbols-ccp-u-nu-latn","~$goog.i18n.NumberFormatSymbols-zh-Hans-CN","~$goog.i18n.NumberFormatSymbols_es_EA","~$goog.i18n.NumberFormatSymbols-fa-IR","~$goog.i18n.NumberFormatSymbols_yue_Hans","~$goog.i18n.NumberFormatSymbols-nb-NO","~$goog.i18n.NumberFormatSymbols_kln","~$goog.i18n.NumberFormatSymbols_bem","~$goog.i18n.NumberFormatSymbols_ses_ML","~$goog.i18n.NumberFormatSymbols_bo","~$goog.i18n.NumberFormatSymbols-ccp","~$goog.i18n.NumberFormatSymbols-asa-TZ","~$goog.i18n.NumberFormatSymbols-wo-SN","~$goog.i18n.NumberFormatSymbols-mas-TZ","~$goog.i18n.NumberFormatSymbols_teo","~$goog.i18n.NumberFormatSymbols_ckb_u_nu_latn","~$goog.i18n.NumberFormatSymbols-kkj-CM","~$goog.i18n.NumberFormatSymbols_pa_Arab","~$goog.i18n.NumberFormatSymbols-ia","~$goog.i18n.NumberFormatSymbols_gl_ES","~$goog.i18n.NumberFormatSymbols_cy_GB","~$goog.i18n.NumberFormatSymbols_es_UY","~$goog.i18n.NumberFormatSymbols-qu-EC","~$goog.i18n.NumberFormatSymbols_ru_BY","~$goog.i18n.NumberFormatSymbols-smn-FI","~$goog.i18n.NumberFormatSymbols_yi_001","~$goog.i18n.NumberFormatSymbols_id_ID","~$goog.i18n.NumberFormatSymbols-fr-BI","~$goog.i18n.NumberFormatSymbols-fr-NC","~$goog.i18n.NumberFormatSymbols_ak_GH","~$goog.i18n.NumberFormatSymbols-ksf-CM","~$goog.i18n.NumberFormatSymbols_rof","~$goog.i18n.NumberFormatSymbols-kk-KZ","~$goog.i18n.NumberFormatSymbols_en_JM","~$goog.i18n.NumberFormatSymbols-dyo","~$goog.i18n.NumberFormatSymbols-tzm","~$goog.i18n.NumberFormatSymbols-guz","~$goog.i18n.NumberFormatSymbols_dz_BT","~$goog.i18n.NumberFormatSymbols_en_DK","~$goog.i18n.NumberFormatSymbols-rm","~$goog.i18n.NumberFormatSymbols-en-PR","~$goog.i18n.NumberFormatSymbols_yo","~$goog.i18n.NumberFormatSymbols_en_SX","~$goog.i18n.NumberFormatSymbols_en_GY","~$goog.i18n.NumberFormatSymbols-zh-Hant-MO","~$goog.i18n.NumberFormatSymbols-ff-Latn-NE","~$goog.i18n.NumberFormatSymbols_ar_EH","~$goog.i18n.NumberFormatSymbols-ar-SD","~$goog.i18n.NumberFormatSymbols-en-JE","~$goog.i18n.NumberFormatSymbols_ksf_CM","~$goog.i18n.NumberFormatSymbols-en-LS","~$goog.i18n.NumberFormatSymbols_nus","~$goog.i18n.NumberFormatSymbols-fr-FR","~$goog.i18n.NumberFormatSymbols_ccp","~$goog.i18n.NumberFormatSymbols-ar-SY","~$goog.i18n.NumberFormatSymbols-mzn","~$goog.i18n.NumberFormatSymbols-en-SX","~$goog.i18n.NumberFormatSymbols-fr-SY","~$goog.i18n.NumberFormatSymbols_jv","~$goog.i18n.NumberFormatSymbols-gu-IN","~$goog.i18n.NumberFormatSymbols_shi_Latn","~$goog.i18n.NumberFormatSymbols-en-SB","~$goog.i18n.NumberFormatSymbols_vi_VN","~$goog.i18n.NumberFormatSymbols-es-CL","~$goog.i18n.NumberFormatSymbols-en-GY","~$goog.i18n.NumberFormatSymbols-gsw-CH","~$goog.i18n.NumberFormatSymbols_kn_IN","~$goog.i18n.NumberFormatSymbols-agq-CM","~$goog.i18n.NumberFormatSymbols-mi-NZ","~$goog.i18n.NumberFormatSymbols-zh-Hans-HK","~$goog.i18n.NumberFormatSymbols-ig-NG","~$goog.i18n.NumberFormatSymbols_ceb","~$goog.i18n.NumberFormatSymbols_dz_u_nu_latn","~$goog.i18n.NumberFormatSymbols_ksf","~$goog.i18n.NumberFormatSymbols-es-SV","~$goog.i18n.NumberFormatSymbols_xog_UG","~$goog.i18n.NumberFormatSymbols_shi_Tfng_MA","~$goog.i18n.NumberFormatSymbols-ff-Latn-LR","~$goog.i18n.NumberFormatSymbols-mi","~$goog.i18n.NumberFormatSymbols-ml-IN","~$goog.i18n.NumberFormatSymbols_kl","~$goog.i18n.NumberFormatSymbols-ne-NP","~$goog.i18n.NumberFormatSymbols_en_MW","~$goog.i18n.NumberFormatSymbols_az_Latn_AZ","~$goog.i18n.NumberFormatSymbols_es_EC","~$goog.i18n.NumberFormatSymbols_en_MY","~$goog.i18n.NumberFormatSymbols-khq","~$goog.i18n.NumberFormatSymbols_af_NA","~$goog.i18n.NumberFormatSymbols-ja-JP","~$goog.i18n.NumberFormatSymbols-gl-ES","~$goog.i18n.NumberFormatSymbols-mfe","~$goog.i18n.NumberFormatSymbols_en_PH","~$goog.i18n.NumberFormatSymbols_tk","~$goog.i18n.NumberFormatSymbols-vun-TZ","~$goog.i18n.NumberFormatSymbols-shi-Tfng","~$goog.i18n.NumberFormatSymbols-en-AE","~$goog.i18n.NumberFormatSymbols_luo","~$goog.i18n.NumberFormatSymbols-eo","~$goog.i18n.NumberFormatSymbolsExt","~$goog.i18n.NumberFormatSymbols-ksf","~$goog.i18n.NumberFormatSymbols-as","~$goog.i18n.NumberFormatSymbols_fr_MA","~$goog.i18n.NumberFormatSymbols_qu","~$goog.i18n.NumberFormatSymbols_vai_Vaii","~$goog.i18n.NumberFormatSymbols_fi_FI","~$goog.i18n.NumberFormatSymbols_ar_TD_u_nu_latn","~$goog.i18n.NumberFormatSymbols_es_PH","~$goog.i18n.NumberFormatSymbols_nl_SX","~$goog.i18n.NumberFormatSymbols-en-HK","~$goog.i18n.NumberFormatSymbols-kl-GL","~$goog.i18n.NumberFormatSymbols_en_NF","~$goog.i18n.NumberFormatSymbols-vai-Vaii-LR","~$goog.i18n.NumberFormatSymbols_lkt","~$goog.i18n.NumberFormatSymbols-ar-OM-u-nu-latn","~$goog.i18n.NumberFormatSymbols-da-DK","~$goog.i18n.NumberFormatSymbols-es-CO","~$goog.i18n.NumberFormatSymbols_nus_SS","~$goog.i18n.NumberFormatSymbols_pt_LU","~$goog.i18n.NumberFormatSymbols_eu_ES","~$goog.i18n.NumberFormatSymbols_ar_JO","~$goog.i18n.NumberFormatSymbols_tzm_MA","~$goog.i18n.NumberFormatSymbols_hr_BA","~$goog.i18n.NumberFormatSymbols_yue","~$goog.i18n.NumberFormatSymbols-shi","~$goog.i18n.NumberFormatSymbols_ses","~$goog.i18n.NumberFormatSymbols-en-NF","~$goog.i18n.NumberFormatSymbols_bo_CN","~$goog.i18n.NumberFormatSymbols_bs_Latn_BA","~$goog.i18n.NumberFormatSymbols-zgh-MA","~$goog.i18n.NumberFormatSymbols_fr_GP","~$goog.i18n.NumberFormatSymbols-mr-IN","~$goog.i18n.NumberFormatSymbols-gd-GB","~$goog.i18n.NumberFormatSymbols-ebu-KE","~$goog.i18n.NumberFormatSymbols_sv_SE","~$goog.i18n.NumberFormatSymbols_ar_SD","~$goog.i18n.NumberFormatSymbols_pa_Arab_u_nu_latn","~$goog.i18n.NumberFormatSymbols-lb","~$goog.i18n.NumberFormatSymbols_dua","~$goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ","~$goog.i18n.NumberFormatSymbols-ga-IE","~$goog.i18n.NumberFormatSymbols_pt_GW","~$goog.i18n.NumberFormatSymbols_fr_CM","~$goog.i18n.NumberFormatSymbols_da_GL","~$goog.i18n.NumberFormatSymbols_sw_CD","~$goog.i18n.NumberFormatSymbols_haw_US","~$goog.i18n.NumberFormatSymbols-ff-Latn-CM","~$goog.i18n.NumberFormatSymbols-smn","~$goog.i18n.NumberFormatSymbols_os_GE","~$goog.i18n.NumberFormatSymbols-en-SI","~$goog.i18n.NumberFormatSymbols_se_NO","~$goog.i18n.NumberFormatSymbols_to","~$goog.i18n.NumberFormatSymbols_fo_DK","~$goog.i18n.NumberFormatSymbols-ks-IN-u-nu-latn","~$goog.i18n.NumberFormatSymbols-en-WS","~$goog.i18n.NumberFormatSymbols_ig_NG","~$goog.i18n.NumberFormatSymbols-dav","~$goog.i18n.NumberFormatSymbols_agq_CM","~$goog.i18n.NumberFormatSymbols_uz_Latn_UZ","~$goog.i18n.NumberFormatSymbols_en_SB","~$goog.i18n.NumberFormatSymbols-en-ZW","~$goog.i18n.NumberFormatSymbols-so-ET","~$goog.i18n.NumberFormatSymbols-ru-UA","~$goog.i18n.NumberFormatSymbols_es_CL","~$goog.i18n.NumberFormatSymbols-fr-CM","~$goog.i18n.NumberFormatSymbols_lag_TZ","~$goog.i18n.NumberFormatSymbols-ar-EH","~$goog.i18n.NumberFormatSymbols-ar-PS","~$goog.i18n.NumberFormatSymbols_tr_TR","~$goog.i18n.NumberFormatSymbols_fr_DZ","~$goog.i18n.NumberFormatSymbols-ar-TD-u-nu-latn","~$goog.i18n.NumberFormatSymbols_fur_IT","~$goog.i18n.NumberFormatSymbols_gsw_FR","~$goog.i18n.NumberFormatSymbols-bg-BG","~$goog.i18n.NumberFormatSymbols_en_US_POSIX","~$goog.i18n.NumberFormatSymbols_ff_Latn_CM","~$goog.i18n.NumberFormatSymbols_ar_SS_u_nu_latn","~$goog.i18n.NumberFormatSymbols_nb_NO","~$goog.i18n.NumberFormatSymbols_sd","~$goog.i18n.NumberFormatSymbols-hsb-DE","~$goog.i18n.NumberFormatSymbols-lv-LV","~$goog.i18n.NumberFormatSymbols_so_KE","~$goog.i18n.NumberFormatSymbols_uz_Arab","~$goog.i18n.NumberFormatSymbols_kde_TZ","~$goog.i18n.NumberFormatSymbols_ru_KZ","~$goog.i18n.NumberFormatSymbols_en_GI","~$goog.i18n.NumberFormatSymbols-ku-TR","~$goog.i18n.NumberFormatSymbols-es-PA","~$goog.i18n.NumberFormatSymbols-ar-KW","~$goog.i18n.NumberFormatSymbols_es_GT","~$goog.i18n.NumberFormatSymbols_km_KH","~$goog.i18n.NumberFormatSymbols-ro-MD","~$goog.i18n.NumberFormatSymbols_fr_SN","~$goog.i18n.NumberFormatSymbols-id-ID","~$goog.i18n.NumberFormatSymbols-bs-Cyrl","~$goog.i18n.NumberFormatSymbols_en_FI","~$goog.i18n.NumberFormatSymbols-so-KE","~$goog.i18n.NumberFormatSymbols-ff-Latn-SN","~$goog.i18n.NumberFormatSymbols-fur-IT","~$goog.i18n.NumberFormatSymbols_twq_NE","~$goog.i18n.NumberFormatSymbols-yav-CM","~$goog.i18n.NumberFormatSymbols-es-IC","~$goog.i18n.NumberFormatSymbols_seh","~$goog.i18n.NumberFormatSymbols-ca-AD","~$goog.i18n.NumberFormatSymbols-el-CY","~$goog.i18n.NumberFormatSymbols-en-AI","~$goog.i18n.NumberFormatSymbols-fr-VU","~$goog.i18n.NumberFormatSymbols_sr_Latn_ME","~$goog.i18n.NumberFormatSymbols-ms-MY","~$goog.i18n.NumberFormatSymbols-en-SS","~$goog.i18n.NumberFormatSymbols-ff-Latn-GH","~$goog.i18n.NumberFormatSymbols_pa_Arab_PK","~$goog.i18n.NumberFormatSymbols-en-SE","~$goog.i18n.NumberFormatSymbols_ln_CF","~$goog.i18n.NumberFormatSymbols-en-NU","~$goog.i18n.NumberFormatSymbols-mg","~$goog.i18n.NumberFormatSymbols-hr-BA","~$goog.i18n.NumberFormatSymbols_ar_SY","~$goog.i18n.NumberFormatSymbols_fr_GF","~$goog.i18n.NumberFormatSymbols-es-DO","~$goog.i18n.NumberFormatSymbols_tt","~$goog.i18n.NumberFormatSymbols_yue_Hant_HK","~$goog.i18n.NumberFormatSymbols_en_SE","~$goog.i18n.NumberFormatSymbols_ce_RU","~$goog.i18n.NumberFormatSymbols-brx","~$goog.i18n.NumberFormatSymbols-ky-KG","~$goog.i18n.NumberFormatSymbols-ar-KM-u-nu-latn","~$goog.i18n.NumberFormatSymbols-sr-Cyrl","~$goog.i18n.NumberFormatSymbols-shi-Latn","~$goog.i18n.NumberFormatSymbols-en-FJ","~$goog.i18n.NumberFormatSymbols_en_AT","~$goog.i18n.NumberFormatSymbols-en-TK","~$goog.i18n.NumberFormatSymbols-en-VG","~$goog.i18n.NumberFormatSymbols_ewo","~$goog.i18n.NumberFormatSymbols_ckb_IQ_u_nu_latn","~$goog.i18n.NumberFormatSymbols-en-IL","~$goog.i18n.NumberFormatSymbols-ps-AF-u-nu-latn","~$goog.i18n.NumberFormatSymbols_en_MS","~$goog.i18n.NumberFormatSymbols-ff","~$goog.i18n.NumberFormatSymbols_ar_KW_u_nu_latn","~$goog.i18n.NumberFormatSymbols-te-IN","~$goog.i18n.NumberFormatSymbols-fr-BL","~$goog.i18n.NumberFormatSymbols_it_IT","~$goog.i18n.NumberFormatSymbols_pl_PL","~$goog.i18n.NumberFormatSymbols-sv-SE","~$goog.i18n.NumberFormatSymbols_de_LU","~$goog.i18n.NumberFormatSymbols_nds_DE","~$goog.i18n.NumberFormatSymbols_fo","~$goog.i18n.NumberFormatSymbols-es-AR","~$goog.i18n.NumberFormatSymbols_mua_CM","~$goog.i18n.NumberFormatSymbols_khq","~$goog.i18n.NumberFormatSymbols-en-BS","~$goog.i18n.NumberFormatSymbols-ti-ER","~$goog.i18n.NumberFormatSymbols-sw-KE","~$goog.i18n.NumberFormatSymbols_hsb_DE","~$goog.i18n.NumberFormatSymbols-en-NA","~$goog.i18n.NumberFormatSymbols-ii-CN","~$goog.i18n.NumberFormatSymbols-nd","~$goog.i18n.NumberFormatSymbols-kam-KE","~$goog.i18n.NumberFormatSymbols_ro_MD","~$goog.i18n.NumberFormatSymbols_en_DE","~$goog.i18n.NumberFormatSymbols-mas","~$goog.i18n.NumberFormatSymbols_dyo","~$goog.i18n.NumberFormatSymbols-nus","~$goog.i18n.NumberFormatSymbols_fo_FO","~$goog.i18n.NumberFormatSymbols-de-LU","~$goog.i18n.NumberFormatSymbols-rn","~$goog.i18n.NumberFormatSymbols-th-TH","~$goog.i18n.NumberFormatSymbols-ar-TD","~$goog.i18n.NumberFormatSymbols_ar_SO","~$goog.i18n.NumberFormatSymbols-uz-Arab","~$goog.i18n.NumberFormatSymbols_ee_TG","~$goog.i18n.NumberFormatSymbols-ln-CG","~$goog.i18n.NumberFormatSymbols-bo","~$goog.i18n.NumberFormatSymbols-fi-FI","~$goog.i18n.NumberFormatSymbols-nl-CW","~$goog.i18n.NumberFormatSymbols_en_MU","~$goog.i18n.NumberFormatSymbols-ewo-CM","~$goog.i18n.NumberFormatSymbols-pt-MO","~$goog.i18n.NumberFormatSymbols_si_LK","~$goog.i18n.NumberFormatSymbols_jgo_CM","~$goog.i18n.NumberFormatSymbols_fur","~$goog.i18n.NumberFormatSymbols_eo","~$goog.i18n.NumberFormatSymbols-se-NO","~$goog.i18n.NumberFormatSymbols_so_DJ","~$goog.i18n.NumberFormatSymbols-ccp-BD-u-nu-latn","~$goog.i18n.NumberFormatSymbols_zh_Hans_SG","~$goog.i18n.NumberFormatSymbols_sg","~$goog.i18n.NumberFormatSymbols-mg-MG","~$goog.i18n.NumberFormatSymbols-to-TO","~$goog.i18n.NumberFormatSymbols-dz","~$goog.i18n.NumberFormatSymbols_qu_EC","~$goog.i18n.NumberFormatSymbols-mas-KE","~$goog.i18n.NumberFormatSymbols-es-UY","~$goog.i18n.NumberFormatSymbols-ig","~$goog.i18n.NumberFormatSymbols-ar-SO-u-nu-latn","~$goog.i18n.NumberFormatSymbols-ps-u-nu-latn","~$goog.i18n.NumberFormatSymbols_sv_FI","~$goog.i18n.NumberFormatSymbols-fur","~$goog.i18n.NumberFormatSymbols-en-SZ","~$goog.i18n.NumberFormatSymbols-vai-Latn-LR","~$goog.i18n.NumberFormatSymbols-fr-CG","~$goog.i18n.NumberFormatSymbols_gd_GB","~$goog.i18n.NumberFormatSymbols-en-PW","~$goog.i18n.NumberFormatSymbols-ar-ER-u-nu-latn","~$goog.i18n.NumberFormatSymbols-ar-XB","~$goog.i18n.NumberFormatSymbols-jmc","~$goog.i18n.NumberFormatSymbols_en_SL","~$goog.i18n.NumberFormatSymbols-dav-KE","~$goog.i18n.NumberFormatSymbols-ccp-IN-u-nu-latn","~$goog.i18n.NumberFormatSymbols_en_IO","~$goog.i18n.NumberFormatSymbols-seh","~$goog.i18n.NumberFormatSymbols_ca_AD","~$goog.i18n.NumberFormatSymbols-qu","~$goog.i18n.NumberFormatSymbols-bez","~$goog.i18n.NumberFormatSymbols-fr-RE","~$goog.i18n.NumberFormatSymbols-pt-TL","~$goog.i18n.NumberFormatSymbols_ff_Latn_GN","~$goog.i18n.NumberFormatSymbols-mfe-MU","~$goog.i18n.NumberFormatSymbols-am-ET","~$goog.i18n.NumberFormatSymbols_ksh_DE","~$goog.i18n.NumberFormatSymbols_ur_IN_u_nu_latn","~$goog.i18n.NumberFormatSymbols-nnh-CM","~$goog.i18n.NumberFormatSymbols_ar_JO_u_nu_latn","~$goog.i18n.NumberFormatSymbols_ast","~$goog.i18n.NumberFormatSymbols-ar-DJ-u-nu-latn","~$goog.i18n.NumberFormatSymbols_nl_SR","~$goog.i18n.NumberFormatSymbols-bs-Latn-BA","~$goog.i18n.NumberFormatSymbols_fr_CF","~$goog.i18n.NumberFormatSymbols-lrc","~$goog.i18n.NumberFormatSymbols_am_ET","~$goog.i18n.NumberFormatSymbols-ca-IT","~$goog.i18n.NumberFormatSymbols-fr-GA","~$goog.i18n.NumberFormatSymbols-lrc-IQ-u-nu-latn","~$goog.i18n.NumberFormatSymbols-sw-CD","~$goog.i18n.NumberFormatSymbols_ar_TD","~$goog.i18n.NumberFormatSymbols-en-RW","~$goog.i18n.NumberFormatSymbols_lg","~$goog.i18n.NumberFormatSymbols_fr_CI","~$goog.i18n.NumberFormatSymbols-eu-ES","~$goog.i18n.NumberFormatSymbols_vai","~$goog.i18n.NumberFormatSymbols_mzn","~$goog.i18n.NumberFormatSymbols-xh","~$goog.i18n.NumberFormatSymbols_ru_RU","~$goog.i18n.NumberFormatSymbols-es-GT","~$goog.i18n.NumberFormatSymbols-rn-BI","~$goog.i18n.NumberFormatSymbols_it_VA","~$goog.i18n.NumberFormatSymbols_vai_Latn_LR","~$goog.i18n.NumberFormatSymbols-ti","~$goog.i18n.NumberFormatSymbols-nn-NO","~$goog.i18n.NumberFormatSymbols-ak-GH","~$goog.i18n.NumberFormatSymbols_gv","~$goog.i18n.NumberFormatSymbols_fr_BI","~$goog.i18n.NumberFormatSymbols_sn_ZW","~$goog.i18n.NumberFormatSymbols_en_SH","~$goog.i18n.NumberFormatSymbols-tk-TM","~$goog.i18n.NumberFormatSymbols_nb_SJ","~$goog.i18n.NumberFormatSymbols-ar-LB-u-nu-latn","~$goog.i18n.NumberFormatSymbols_fr_SC","~$goog.i18n.NumberFormatSymbols_fr_SY","~$goog.i18n.NumberFormatSymbols_ff_Latn_GH","~$goog.i18n.NumberFormatSymbols-be-BY","~$goog.i18n.NumberFormatSymbols_my_MM_u_nu_latn","~$goog.i18n.NumberFormatSymbols-pt-GW","~$goog.i18n.NumberFormatSymbols_ps_AF_u_nu_latn","~$goog.i18n.NumberFormatSymbols_shi_Tfng","~$goog.i18n.NumberFormatSymbols-shi-Latn-MA","~$goog.i18n.NumberFormatSymbols-luy-KE","~$goog.i18n.NumberFormatSymbols_es_VE","~$goog.i18n.NumberFormatSymbols-fr-BE","~$goog.i18n.NumberFormatSymbols_ha","~$goog.i18n.NumberFormatSymbols_mas_KE","~$goog.i18n.NumberFormatSymbols_naq_NA","~$goog.i18n.NumberFormatSymbols_en_VU","~$goog.i18n.NumberFormatSymbols-fa-IR-u-nu-latn","~$goog.i18n.NumberFormatSymbols-zh-Hant-HK","~$goog.i18n.NumberFormatSymbols-ne-IN-u-nu-latn","~$goog.i18n.NumberFormatSymbols-jgo","~$goog.i18n.NumberFormatSymbols-fr-DJ","~$goog.i18n.NumberFormatSymbols-en-FM","~$goog.i18n.NumberFormatSymbols_mer","~$goog.i18n.NumberFormatSymbols-en-GH","~$goog.i18n.NumberFormatSymbols-ebu","~$goog.i18n.NumberFormatSymbols-sd","~$goog.i18n.NumberFormatSymbols_nds","~$goog.i18n.NumberFormatSymbols_ar_PS","~$goog.i18n.NumberFormatSymbols_te_IN","~$goog.i18n.NumberFormatSymbols-ia-001","~$goog.i18n.NumberFormatSymbols-pt-LU","~$goog.i18n.NumberFormatSymbols_kl_GL","~$goog.i18n.NumberFormatSymbols_sr_Cyrl_BA","~$goog.i18n.NumberFormatSymbols-en-NR","~$goog.i18n.NumberFormatSymbols-ast-ES","~$goog.i18n.NumberFormatSymbols_sl_SI","~$goog.i18n.NumberFormatSymbols_zh_Hans_HK","~$goog.i18n.NumberFormatSymbols_pt_AO","~$goog.i18n.NumberFormatSymbols_zh_Hans_CN","~$goog.i18n.NumberFormatSymbols_ia_001","~$goog.i18n.NumberFormatSymbols_en_FM","~$goog.i18n.NumberFormatSymbols-en-UG","~$goog.i18n.NumberFormatSymbols_es_PR","~$goog.i18n.NumberFormatSymbols-fr-CH","~$goog.i18n.NumberFormatSymbols-sk-SK","~$goog.i18n.NumberFormatSymbols-lrc-IR-u-nu-latn","~$goog.i18n.NumberFormatSymbols_ar_001","~$goog.i18n.NumberFormatSymbols_kde","~$goog.i18n.NumberFormatSymbols_he_IL","~$goog.i18n.NumberFormatSymbols_en_SS","~$goog.i18n.NumberFormatSymbols-ko-KP","~$goog.i18n.NumberFormatSymbols_en_SD","~$goog.i18n.NumberFormatSymbols-pa-Arab-PK","~$goog.i18n.NumberFormatSymbols-pa-Guru-IN","~$goog.i18n.NumberFormatSymbols_kln_KE","~$goog.i18n.NumberFormatSymbols-fr-CF","~$goog.i18n.NumberFormatSymbols-ar-SS","~$goog.i18n.NumberFormatSymbols-kkj","~$goog.i18n.NumberFormatSymbols-fr-KM","~$goog.i18n.NumberFormatSymbols-af-NA","~$goog.i18n.NumberFormatSymbols-ar-SD-u-nu-latn","~$goog.i18n.NumberFormatSymbols_yav","~$goog.i18n.NumberFormatSymbols_fr_VU","~$goog.i18n.NumberFormatSymbols-vi-VN","~$goog.i18n.NumberFormatSymbols-fo-FO","~$goog.i18n.NumberFormatSymbols-ff-Latn","~$goog.i18n.NumberFormatSymbols-vai-Vaii","~$goog.i18n.NumberFormatSymbols-en-MW","~$goog.i18n.NumberFormatSymbols-bas-CM","~$goog.i18n.NumberFormatSymbols-sbp","~$goog.i18n.NumberFormatSymbols_fr_MQ","~$goog.i18n.NumberFormatSymbols_en_VG","~$goog.i18n.NumberFormatSymbols-en-MY","~$goog.i18n.NumberFormatSymbols-sah-RU","~$goog.i18n.NumberFormatSymbols_ast_ES","~$goog.i18n.NumberFormatSymbols-ne-IN","~$goog.i18n.NumberFormatSymbols_bm","~$goog.i18n.NumberFormatSymbols_ku_TR","~$goog.i18n.NumberFormatSymbols_ks_u_nu_latn","~$goog.i18n.NumberFormatSymbols-ku","~$goog.i18n.NumberFormatSymbols_be_BY","~$goog.i18n.NumberFormatSymbols-pt-MZ","~$goog.i18n.NumberFormatSymbols-ki","~$goog.i18n.NumberFormatSymbols-ff-Latn-GM","~$goog.i18n.NumberFormatSymbols-bm","~$goog.i18n.NumberFormatSymbols_kk_KZ","~$goog.i18n.NumberFormatSymbols_saq_KE","~$goog.i18n.NumberFormatSymbols-hi-IN","~$goog.i18n.NumberFormatSymbols_en_VI","~$goog.i18n.NumberFormatSymbols-sr-Latn-ME","~$goog.i18n.NumberFormatSymbols-hy-AM","~$goog.i18n.NumberFormatSymbols_dje_NE","~$goog.i18n.NumberFormatSymbols-sr-Cyrl-ME","~$goog.i18n.NumberFormatSymbols_fa_AF","~$goog.i18n.NumberFormatSymbols_en_UG","~$goog.i18n.NumberFormatSymbols_lo_LA","~$goog.i18n.NumberFormatSymbols_lrc_IR_u_nu_latn","~$goog.i18n.NumberFormatSymbols_bs_Cyrl_BA","~$goog.i18n.NumberFormatSymbols_mgo","~$goog.i18n.NumberFormatSymbols_en_BZ","~$goog.i18n.NumberFormatSymbols_fr_RE","~$goog.i18n.NumberFormatSymbols-ca-ES","~$goog.i18n.NumberFormatSymbols-en-DE","~$goog.i18n.NumberFormatSymbols_sd_u_nu_latn","~$goog.i18n.NumberFormatSymbols-ar-QA","~$goog.i18n.NumberFormatSymbols-sbp-TZ","~$goog.i18n.NumberFormatSymbols-en-GI","~$goog.i18n.NumberFormatSymbols_fr_GN","~$goog.i18n.NumberFormatSymbols-my-MM","~$goog.i18n.NumberFormatSymbols-ff-Latn-NG","~$goog.i18n.NumberFormatSymbols-pt-ST","~$goog.i18n.NumberFormatSymbols_bem_ZM","~$goog.i18n.NumberFormatSymbols_sah_RU","~$goog.i18n.NumberFormatSymbols_ar_IQ_u_nu_latn","~$goog.i18n.NumberFormatSymbols-tr-CY","~$goog.i18n.NumberFormatSymbols-vun","~$goog.i18n.NumberFormatSymbols-nl-SX","~$goog.i18n.NumberFormatSymbols_en_NR","~$goog.i18n.NumberFormatSymbols-ce","~$goog.i18n.NumberFormatSymbols_es_PE","~$goog.i18n.NumberFormatSymbols-fr-ML","~$goog.i18n.NumberFormatSymbols-sl-SI","~$goog.i18n.NumberFormatSymbols_lg_UG","~$goog.i18n.NumberFormatSymbols_om_ET","~$goog.i18n.NumberFormatSymbols_nnh","~$goog.i18n.NumberFormatSymbols-dyo-SN","~$goog.i18n.NumberFormatSymbols_en_TK","~$goog.i18n.NumberFormatSymbols-ta-IN","~$goog.i18n.NumberFormatSymbols_en_RW","~$goog.i18n.NumberFormatSymbols_sr_Cyrl_RS","~$goog.i18n.NumberFormatSymbols-ckb","~$goog.i18n.NumberFormatSymbols-pt-CV","~$goog.i18n.NumberFormatSymbols_en_LR","~$goog.i18n.NumberFormatSymbols-ar-SA","~$goog.i18n.NumberFormatSymbols-nl-SR","~$goog.i18n.NumberFormatSymbols_en_GU","~$goog.i18n.NumberFormatSymbols-en-IO","~$goog.i18n.NumberFormatSymbols_wae","~$goog.i18n.NumberFormatSymbols_smn_FI","~$goog.i18n.NumberFormatSymbols_tr_CY","~$goog.i18n.NumberFormatSymbols-ar-IL","~$goog.i18n.NumberFormatSymbols-cs-CZ","~$goog.i18n.NumberFormatSymbols-rwk","~$goog.i18n.NumberFormatSymbols_fr_HT","~$goog.i18n.NumberFormatSymbols-fr-TG","~$goog.i18n.NumberFormatSymbols_guz","~$goog.i18n.NumberFormatSymbols_es_PY","~$goog.i18n.NumberFormatSymbols_ln_CG","~$goog.i18n.NumberFormatSymbols_ta_LK","~$goog.i18n.NumberFormatSymbols-ckb-IQ-u-nu-latn","~$goog.i18n.NumberFormatSymbols-nl-BE","~$goog.i18n.NumberFormatSymbols_fr_MC","~$goog.i18n.NumberFormatSymbols-as-IN","~$goog.i18n.NumberFormatSymbols_en_GD","~$goog.i18n.NumberFormatSymbols_en_ZM","~$goog.i18n.NumberFormatSymbols-ar-LB","~$goog.i18n.NumberFormatSymbols-en-SH","~$goog.i18n.NumberFormatSymbols_rm_CH","~$goog.i18n.NumberFormatSymbols_dz","~$goog.i18n.NumberFormatSymbols-fr-MR","~$goog.i18n.NumberFormatSymbols-pa-Guru","~$goog.i18n.NumberFormatSymbols_nyn_UG","~$goog.i18n.NumberFormatSymbols-mzn-u-nu-latn","~$goog.i18n.NumberFormatSymbols-rof","~$goog.i18n.NumberFormatSymbols_tg","~$goog.i18n.NumberFormatSymbols_fr_BJ","~$goog.i18n.NumberFormatSymbols-en-AS","~$goog.i18n.NumberFormatSymbols_es_GQ","~$goog.i18n.NumberFormatSymbols-luo","~$goog.i18n.NumberFormatSymbols_fr_NC","~$goog.i18n.NumberFormatSymbols_ko_KR","~$goog.i18n.NumberFormatSymbols-en-MH","~$goog.i18n.NumberFormatSymbols_mer_KE","~$goog.i18n.NumberFormatSymbols-sw-UG","~$goog.i18n.NumberFormatSymbols-as-IN-u-nu-latn","~$goog.i18n.NumberFormatSymbols_pa_Guru","~$goog.i18n.NumberFormatSymbols-ksh","~$goog.i18n.NumberFormatSymbols_lu_CD","~$goog.i18n.NumberFormatSymbols_it_SM","~$goog.i18n.NumberFormatSymbols-ha-GH","~$goog.i18n.NumberFormatSymbols-fr-TN","~$goog.i18n.NumberFormatSymbols-ar-ER","~$goog.i18n.NumberFormatSymbols_rn","~$goog.i18n.NumberFormatSymbols_ff","~$goog.i18n.NumberFormatSymbols_en_DG","~$goog.i18n.NumberFormatSymbols_mzn_IR_u_nu_latn","~$goog.i18n.NumberFormatSymbols-ti-ET","~$goog.i18n.NumberFormatSymbols-en-GD","~$goog.i18n.NumberFormatSymbols_pt_CV","~$goog.i18n.NumberFormatSymbols-ceb-PH","~$goog.i18n.NumberFormatSymbols-yue","~$goog.i18n.NumberFormatSymbols-bn-IN-u-nu-latn","~$goog.i18n.NumberFormatSymbols-sv-AX","~$goog.i18n.NumberFormatSymbols_bn_IN","~$goog.i18n.NumberFormatSymbols_ca_IT","~$goog.i18n.NumberFormatSymbols_mg","~$goog.i18n.NumberFormatSymbols-dsb-DE","~$goog.i18n.NumberFormatSymbols_fr_TN","~$goog.i18n.NumberFormatSymbols-ks-IN","~$goog.i18n.NumberFormatSymbols-az-Cyrl-AZ","~$goog.i18n.NumberFormatSymbols-sr-Latn-BA","~$goog.i18n.NumberFormatSymbols-en-ZM","~$goog.i18n.NumberFormatSymbols_ms_MY","~$goog.i18n.NumberFormatSymbols-uz-Cyrl-UZ","~$goog.i18n.NumberFormatSymbols-gv-IM","~$goog.i18n.NumberFormatSymbols_ar_SA","~$goog.i18n.NumberFormatSymbols_ne_IN","~$goog.i18n.NumberFormatSymbols-bm-ML","~$goog.i18n.NumberFormatSymbols-ceb","~$goog.i18n.NumberFormatSymbols-fo-DK","~$goog.i18n.NumberFormatSymbols-fr-GN","~$goog.i18n.NumberFormatSymbols_ps_PK","~$goog.i18n.NumberFormatSymbols_pt_MZ","~$goog.i18n.NumberFormatSymbols-lg-UG","~$goog.i18n.NumberFormatSymbols_fr_ML","~$goog.i18n.NumberFormatSymbols_ar_YE_u_nu_latn","~$goog.i18n.NumberFormatSymbols_as_IN","~$goog.i18n.NumberFormatSymbols-ar-DJ","~$goog.i18n.NumberFormatSymbols-en-US-POSIX","~$goog.i18n.NumberFormatSymbols_khq_ML","~$goog.i18n.NumberFormatSymbols-jmc-TZ","~$goog.i18n.NumberFormatSymbols-fr-YT","~$goog.i18n.NumberFormatSymbols-sd-u-nu-latn","~$goog.i18n.NumberFormatSymbols-es-BR","~$goog.i18n.NumberFormatSymbols_ar_BH_u_nu_latn","~$goog.i18n.NumberFormatSymbols-agq","~$goog.i18n.NumberFormatSymbols-uz-Arab-AF","~$goog.i18n.NumberFormatSymbols-es-VE","~$goog.i18n.NumberFormatSymbols_es_PA","~$goog.i18n.NumberFormatSymbols_fr_TD","~$goog.i18n.NumberFormatSymbols-ru-MD","~$goog.i18n.NumberFormatSymbols-nds","~$goog.i18n.NumberFormatSymbols-om-ET"]],"~:from-jar",true,"~:deps",["~$goog","~$goog.i18n.NumberFormatSymbols","~$goog.i18n.NumberFormatSymbols-u-nu-latn"]],["^ ","~:cache-key",[1579837703000],"~:output-name","goog.format.internationalizedemailaddress.js","~:resource-id",["~:shadow.build.classpath/resource","goog/format/internationalizedemailaddress.js"],"~:resource-name","goog/format/internationalizedemailaddress.js","~:type","~:goog","~:source","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides functions to parse and manipulate internationalized\n * email addresses. This is useful in the context of Email Address\n * Internationalization (EAI) as defined by RFC6530.\n *\n */\n\ngoog.provide('goog.format.InternationalizedEmailAddress');\n\ngoog.require('goog.format.EmailAddress');\n\ngoog.require('goog.string');\n\n\n\n/**\n * Formats an email address string for display, and allows for extraction of\n * the individual components of the address.\n * @param {string=} opt_address The email address.\n * @param {string=} opt_name The name associated with the email address.\n * @constructor\n * @extends {goog.format.EmailAddress}\n */\ngoog.format.InternationalizedEmailAddress = function(opt_address, opt_name) {\n  goog.format.InternationalizedEmailAddress.base(\n      this, 'constructor', opt_address, opt_name);\n};\ngoog.inherits(\n    goog.format.InternationalizedEmailAddress, goog.format.EmailAddress);\n\n\n/**\n * A string representing the RegExp for the local part of an EAI email address.\n * @private\n */\ngoog.format.InternationalizedEmailAddress.EAI_LOCAL_PART_REGEXP_STR_ =\n    '((?!\\\\s)[+a-zA-Z0-9_.!#$%&\\'*\\\\/=?^`{|}~\\u0080-\\uFFFFFF-])+';\n\n\n/**\n * A string representing the RegExp for a label in the domain part of an EAI\n * email address.\n * @private\n */\ngoog.format.InternationalizedEmailAddress.EAI_LABEL_CHAR_REGEXP_STR_ =\n    '(?!\\\\s)[a-zA-Z0-9\\u0080-\\u3001\\u3003-\\uFF0D\\uFF0F-\\uFF60\\uFF62-\\uFFFFFF-]';\n\n\n/**\n * A string representing the RegExp for the domain part of an EAI email address.\n * @private\n */\ngoog.format.InternationalizedEmailAddress.EAI_DOMAIN_PART_REGEXP_STR_ =\n    // A unicode character (ASCII or Unicode excluding periods)\n    '(' + goog.format.InternationalizedEmailAddress.EAI_LABEL_CHAR_REGEXP_STR_ +\n    // Such character 1+ times, followed by a Unicode period. All 1+ times.\n    '+[\\\\.\\\\uFF0E\\\\u3002\\\\uFF61])+' +\n    // And same thing but without a period in the end\n    goog.format.InternationalizedEmailAddress.EAI_LABEL_CHAR_REGEXP_STR_ +\n    '{2,63}';\n\n\n/**\n * Match string for address separators. This list is the result of the\n * discussion in b/16241003.\n * @type {string}\n * @private\n */\ngoog.format.InternationalizedEmailAddress.ADDRESS_SEPARATORS_ =\n    ',' +       // U+002C ( , ) COMMA\n    ';' +       // U+003B ( ; ) SEMICOLON\n    '\\u055D' +  // ( ՝ ) ARMENIAN COMMA\n    '\\u060C' +  // ( ، ) ARABIC COMMA\n    '\\u1363' +  // ( ፣ ) ETHIOPIC COMMA\n    '\\u1802' +  // ( ᠂ ) MONGOLIAN COMMA\n    '\\u1808' +  // ( ᠈ ) MONGOLIAN MANCHU COMMA\n    '\\u2E41' +  // ( ⹁ ) REVERSED COMMA\n    '\\u3001' +  // ( 、 ) IDEOGRAPHIC COMMA\n    '\\uFF0C' +  // ( ， ) FULLWIDTH COMMA\n    '\\u061B' +  // ( ‎؛‎ ) ARABIC SEMICOLON\n    '\\u1364' +  // ( ፤ ) ETHIOPIC SEMICOLON\n    '\\uFF1B' +  // ( ； ) FULLWIDTH SEMICOLON\n    '\\uFF64' +  // ( ､ ) HALFWIDTH IDEOGRAPHIC COMMA\n    '\\u104A';   // ( ၊ ) MYANMAR SIGN LITTLE SECTION\n\n\n/**\n * Match string for characters that, when in a display name, require it to be\n * quoted.\n * @type {string}\n * @private\n */\ngoog.format.InternationalizedEmailAddress.CHARS_REQUIRE_QUOTES_ =\n    goog.format.EmailAddress.SPECIAL_CHARS +\n    goog.format.InternationalizedEmailAddress.ADDRESS_SEPARATORS_;\n\n\n/**\n * A RegExp to match the local part of an EAI email address.\n * @private {!RegExp}\n */\ngoog.format.InternationalizedEmailAddress.EAI_LOCAL_PART_ = new RegExp(\n    '^' + goog.format.InternationalizedEmailAddress.EAI_LOCAL_PART_REGEXP_STR_ +\n    '$');\n\n\n/**\n * A RegExp to match the domain part of an EAI email address.\n * @private {!RegExp}\n */\ngoog.format.InternationalizedEmailAddress.EAI_DOMAIN_PART_ = new RegExp(\n    '^' +\n    goog.format.InternationalizedEmailAddress.EAI_DOMAIN_PART_REGEXP_STR_ +\n    '$');\n\n\n/**\n * A RegExp to match an EAI email address.\n * @private {!RegExp}\n */\ngoog.format.InternationalizedEmailAddress.EAI_EMAIL_ADDRESS_ = new RegExp(\n    '^' + goog.format.InternationalizedEmailAddress.EAI_LOCAL_PART_REGEXP_STR_ +\n    '@' +\n    goog.format.InternationalizedEmailAddress.EAI_DOMAIN_PART_REGEXP_STR_ +\n    '$');\n\n\n/**\n * Checks if the provided string is a valid local part (part before the '@') of\n * an EAI email address.\n * @param {string} str The local part to check.\n * @return {boolean} Whether the provided string is a valid local part.\n */\ngoog.format.InternationalizedEmailAddress.isValidLocalPartSpec = function(str) {\n  if (str == null) {\n    return false;\n  }\n  return goog.format.InternationalizedEmailAddress.EAI_LOCAL_PART_.test(str);\n};\n\n\n/**\n * Checks if the provided string is a valid domain part (part after the '@') of\n * an EAI email address.\n * @param {string} str The domain part to check.\n * @return {boolean} Whether the provided string is a valid domain part.\n */\ngoog.format.InternationalizedEmailAddress.isValidDomainPartSpec = function(\n    str) {\n  if (str == null) {\n    return false;\n  }\n  return goog.format.InternationalizedEmailAddress.EAI_DOMAIN_PART_.test(str);\n};\n\n\n/** @override */\ngoog.format.InternationalizedEmailAddress.prototype.isValid = function() {\n  return goog.format.InternationalizedEmailAddress.isValidAddrSpec(\n      this.address);\n};\n\n\n/**\n * Checks if the provided string is a valid email address. Supports both\n * simple email addresses (address specs) and addresses that contain display\n * names.\n * @param {string} str The email address to check.\n * @return {boolean} Whether the provided string is a valid address.\n */\ngoog.format.InternationalizedEmailAddress.isValidAddress = function(str) {\n  if (str == null) {\n    return false;\n  }\n  return goog.format.InternationalizedEmailAddress.parse(str).isValid();\n};\n\n\n/**\n * Checks if the provided string is a valid address spec (local@domain.com).\n * @param {string} str The email address to check.\n * @return {boolean} Whether the provided string is a valid address spec.\n */\ngoog.format.InternationalizedEmailAddress.isValidAddrSpec = function(str) {\n  if (str == null) {\n    return false;\n  }\n\n  // This is a fairly naive implementation, but it covers 99% of use cases.\n  // For more details, see http://en.wikipedia.org/wiki/Email_address#Syntax\n  return goog.format.InternationalizedEmailAddress.EAI_EMAIL_ADDRESS_.test(str);\n};\n\n\n/**\n * Parses a string containing email addresses of the form\n * \"name\" &lt;address&gt; into an array of email addresses.\n * @param {string} str The address list.\n * @return {!Array<!goog.format.EmailAddress>} The parsed emails.\n */\ngoog.format.InternationalizedEmailAddress.parseList = function(str) {\n  return goog.format.EmailAddress.parseListInternal(\n      str, goog.format.InternationalizedEmailAddress.parse,\n      goog.format.InternationalizedEmailAddress.isAddressSeparator);\n};\n\n\n/**\n * Parses an email address of the form \"name\" &lt;address&gt; into\n * an email address.\n * @param {string} addr The address string.\n * @return {!goog.format.EmailAddress} The parsed address.\n */\ngoog.format.InternationalizedEmailAddress.parse = function(addr) {\n  return goog.format.EmailAddress.parseInternal(\n      addr, goog.format.InternationalizedEmailAddress);\n};\n\n\n/**\n * @param {string} ch The character to test.\n * @return {boolean} Whether the provided character is an address separator.\n */\ngoog.format.InternationalizedEmailAddress.isAddressSeparator = function(ch) {\n  return goog.string.contains(\n      goog.format.InternationalizedEmailAddress.ADDRESS_SEPARATORS_, ch);\n};\n\n\n/**\n * Return the address in a standard format:\n *  - remove extra spaces.\n *  - Surround name with quotes if it contains special characters.\n * @return {string} The cleaned address.\n * @override\n */\ngoog.format.InternationalizedEmailAddress.prototype.toString = function() {\n  return this.toStringInternal(\n      goog.format.InternationalizedEmailAddress.CHARS_REQUIRE_QUOTES_);\n};\n","~:last-modified",1579837703000,"~:requires",["~#set",["~$goog.string","^9>","~$goog.format.EmailAddress"]],"~:pom-info",["^ ","~:description","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","~:group-id","~$org.clojure","~:artifact-id","~$google-closure-library","~:name","Google Closure Library","~:id","~$org.clojure/google-closure-library","~:url","http://code.google.com/p/closure-library/","~:parent-group-id","~$org.sonatype.oss","~:coordinate",["^9V","0.0-20191016-6ae1f72f"],"~:version","0.0-20191016-6ae1f72f"],"^9W",["~#url","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/format/internationalizedemailaddress.js"],"~:provides",["^9K",["~$goog.format.InternationalizedEmailAddress"]],"^9<",true,"^9=",["^9>","^9M","^9L"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.mockclock.js","^9C",["^9D","goog/testing/mockclock.js"],"^9E","goog/testing/mockclock.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Mock Clock implementation for working with setTimeout,\n * setInterval, clearTimeout and clearInterval within unit tests.\n *\n * Derived from jsUnitMockTimeout.js, contributed to JsUnit by\n * Pivotal Computer Systems, www.pivotalsf.com\n *\n */\n\ngoog.setTestOnly('goog.testing.MockClock');\ngoog.provide('goog.testing.MockClock');\n\ngoog.require('goog.Disposable');\n/** @suppress {extraRequire} */\ngoog.require('goog.Promise');\ngoog.require('goog.Thenable');\ngoog.require('goog.async.run');\ngoog.require('goog.testing.PropertyReplacer');\ngoog.require('goog.testing.events');\ngoog.require('goog.testing.events.Event');\n\n\n\n/**\n * Class for unit testing code that uses setTimeout and clearTimeout.\n *\n * NOTE: If you are using MockClock to test code that makes use of\n *       goog.fx.Animation, then you must either:\n *\n * 1. Install and dispose of the MockClock in setUpPage() and tearDownPage()\n *    respectively (rather than setUp()/tearDown()).\n *\n * or\n *\n * 2. Ensure that every test clears the animation queue by calling\n *    mockClock.tick(x) at the end of each test function (where `x` is large\n *    enough to complete all animations).\n *\n * Otherwise, if any animation is left pending at the time that\n * MockClock.dispose() is called, that will permanently prevent any future\n * animations from playing on the page.\n *\n * @param {boolean=} opt_autoInstall Install the MockClock at construction time.\n * @constructor\n * @extends {goog.Disposable}\n * @final\n */\ngoog.testing.MockClock = function(opt_autoInstall) {\n  goog.Disposable.call(this);\n\n  /**\n   * Reverse-order queue of timers to fire.\n   *\n   * The last item of the queue is popped off.  Insertion happens from the\n   * right.  For example, the expiration times for each element of the queue\n   * might be in the order 300, 200, 200.\n   *\n   * @type {?Array<!goog.testing.MockClock.QueueObjType_>}\n   * @private\n   */\n  this.queue_ = [];\n\n  /**\n   * Set of timeouts that should be treated as cancelled.\n   *\n   * Rather than removing cancelled timers directly from the queue, this set\n   * simply marks them as deleted so that they can be ignored when their\n   * turn comes up.  The keys are the timeout keys that are cancelled, each\n   * mapping to true.\n   *\n   * @private {Object<number, boolean>}\n   */\n  this.deletedKeys_ = {};\n\n  /**\n   * Whether we should skip mocking Date.now().\n   * @private {boolean}\n   */\n  this.unmockDateNow_ = false;\n\n  if (opt_autoInstall) {\n    this.install();\n  }\n};\ngoog.inherits(goog.testing.MockClock, goog.Disposable);\n\n\n/**\n * @typedef {{\n *    timeoutKey: number, millis: number,\n *    runAtMillis: number, funcToCall: Function, recurring: boolean}}\n */\ngoog.testing.MockClock.QueueObjType_;\n\n/**\n * Default wait timeout for mocking requestAnimationFrame (in milliseconds).\n *\n * @type {number}\n * @const\n */\ngoog.testing.MockClock.REQUEST_ANIMATION_FRAME_TIMEOUT = 20;\n\n\n/**\n * ID to use for next timeout.  Timeout IDs must never be reused, even across\n * MockClock instances.\n * @public {number}\n */\ngoog.testing.MockClock.nextId = Math.round(Math.random() * 10000);\n\n\n/**\n * Count of the number of setTimeout/setInterval/etc. calls received by this\n * instance.\n * @type {number}\n * @private\n */\ngoog.testing.MockClock.prototype.timeoutsMade_ = 0;\n\n\n/**\n * Count of the number of timeout/interval/etc. callbacks triggered by this\n * instance.\n * @type {number}\n * @private\n */\ngoog.testing.MockClock.prototype.callbacksTriggered_ = 0;\n\n\n/**\n * PropertyReplacer instance which overwrites and resets setTimeout,\n * setInterval, etc. or null if the MockClock is not installed.\n * @type {?goog.testing.PropertyReplacer}\n * @private\n */\ngoog.testing.MockClock.prototype.replacer_ = null;\n\n\n/**\n * The current simulated time in milliseconds.\n * @type {number}\n * @private\n */\ngoog.testing.MockClock.prototype.nowMillis_ = 0;\n\n\n/**\n * Additional delay between the time a timeout was set to fire, and the time\n * it actually fires.  Useful for testing workarounds for this Firefox 2 bug:\n * https://bugzilla.mozilla.org/show_bug.cgi?id=291386\n * May be negative.\n * @type {number}\n * @private\n */\ngoog.testing.MockClock.prototype.timeoutDelay_ = 0;\n\n\n/**\n * The real set timeout for reference.\n * @const @private {!Function}\n */\ngoog.testing.MockClock.REAL_SETTIMEOUT_ = goog.global.setTimeout;\n\n\n/** @type {function():number} */\ngoog.testing.MockClock.prototype.oldGoogNow_;\n\n/**\n * Installs the MockClock by overriding the global object's implementation of\n * setTimeout, setInterval, clearTimeout and clearInterval.\n */\ngoog.testing.MockClock.prototype.install = function() {\n  if (!this.replacer_) {\n    if (goog.testing.MockClock.REAL_SETTIMEOUT_ !== goog.global.setTimeout) {\n      if (typeof console !== 'undefined' && console.warn) {\n        console.warn(\n            'Non default setTimeout detected. ' +\n            'Use of multiple MockClock instances or other clock mocking ' +\n            'should be avoided due to unspecified behavior and ' +\n            'the resulting fragility.');\n      }\n    }\n\n    var r = this.replacer_ = new goog.testing.PropertyReplacer();\n    r.set(goog.global, 'setTimeout', goog.bind(this.setTimeout_, this));\n    r.set(goog.global, 'setInterval', goog.bind(this.setInterval_, this));\n    r.set(goog.global, 'setImmediate', goog.bind(this.setImmediate_, this));\n    r.set(goog.global, 'clearTimeout', goog.bind(this.clearTimeout_, this));\n    r.set(goog.global, 'clearInterval', goog.bind(this.clearInterval_, this));\n    if (!this.unmockDateNow_) {\n      r.set(Date, 'now', goog.bind(this.getCurrentTime, this));\n    }\n    // goog.Promise uses goog.async.run. In order to be able to test\n    // Promise-based code, we need to make sure that goog.async.run uses\n    // nextTick instead of native browser Promises. This means that it will\n    // default to setImmediate, which is replaced above. Note that we test for\n    // the presence of goog.async.run.forceNextTick to be resilient to the case\n    // where tests replace goog.async.run directly.\n    goog.async.run.forceNextTick &&\n        goog.async.run.forceNextTick(goog.testing.MockClock.REAL_SETTIMEOUT_);\n\n    // Replace the requestAnimationFrame functions.\n    this.replaceRequestAnimationFrame_();\n\n    // PropertyReplacer#set can't be called with renameable functions.\n    this.oldGoogNow_ = goog.now;\n    goog.now = goog.bind(this.getCurrentTime, this);\n  }\n};\n\n\n/**\n * Unmocks the Date.now() function for tests that aren't expecting it to be\n * mocked. See b/141619890.\n * @deprecated\n */\ngoog.testing.MockClock.prototype.unmockDateNow = function() {\n  this.unmockDateNow_ = true;\n  if (this.replacer_) {\n    try {\n      this.replacer_.restore(Date, 'now');\n    } catch (e) {\n      // Ignore error thrown if Date.now was not already mocked.\n    }\n  }\n};\n\n\n/**\n * Installs the mocks for requestAnimationFrame and cancelRequestAnimationFrame.\n * @private\n */\ngoog.testing.MockClock.prototype.replaceRequestAnimationFrame_ = function() {\n  var r = this.replacer_;\n  var requestFuncs = [\n    'requestAnimationFrame', 'webkitRequestAnimationFrame',\n    'mozRequestAnimationFrame', 'oRequestAnimationFrame',\n    'msRequestAnimationFrame'\n  ];\n\n  var cancelFuncs = [\n    'cancelAnimationFrame', 'cancelRequestAnimationFrame',\n    'webkitCancelRequestAnimationFrame', 'mozCancelRequestAnimationFrame',\n    'oCancelRequestAnimationFrame', 'msCancelRequestAnimationFrame'\n  ];\n\n  for (var i = 0; i < requestFuncs.length; ++i) {\n    if (goog.global && goog.global[requestFuncs[i]]) {\n      r.set(\n          goog.global, requestFuncs[i],\n          goog.bind(this.requestAnimationFrame_, this));\n    }\n  }\n\n  for (var i = 0; i < cancelFuncs.length; ++i) {\n    if (goog.global && goog.global[cancelFuncs[i]]) {\n      r.set(\n          goog.global, cancelFuncs[i],\n          goog.bind(this.cancelRequestAnimationFrame_, this));\n    }\n  }\n};\n\n\n/**\n * Removes the MockClock's hooks into the global object's functions and revert\n * to their original values.\n */\ngoog.testing.MockClock.prototype.uninstall = function() {\n  if (this.replacer_) {\n    this.replacer_.reset();\n    this.replacer_ = null;\n    goog.now = this.oldGoogNow_;\n  }\n\n  this.resetAsyncQueue_();\n};\n\n\n/** @override */\ngoog.testing.MockClock.prototype.disposeInternal = function() {\n  this.uninstall();\n  this.queue_ = null;\n  this.deletedKeys_ = null;\n  goog.testing.MockClock.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * Resets the MockClock, removing all timeouts that are scheduled and resets\n * the fake timer count.\n */\ngoog.testing.MockClock.prototype.reset = function() {\n  this.queue_ = [];\n  this.deletedKeys_ = {};\n  this.nowMillis_ = 0;\n  this.timeoutsMade_ = 0;\n  this.callbacksTriggered_ = 0;\n  this.timeoutDelay_ = 0;\n\n  this.resetAsyncQueue_();\n};\n\n\n/**\n * Resets the async queue when this clock resets.\n * @private\n */\ngoog.testing.MockClock.prototype.resetAsyncQueue_ = function() {\n  goog.async.run.resetQueue();\n};\n\n\n/**\n * Sets the amount of time between when a timeout is scheduled to fire and when\n * it actually fires.\n * @param {number} delay The delay in milliseconds.  May be negative.\n */\ngoog.testing.MockClock.prototype.setTimeoutDelay = function(delay) {\n  this.timeoutDelay_ = delay;\n};\n\n\n/**\n * @return {number} delay The amount of time between when a timeout is\n *     scheduled to fire and when it actually fires, in milliseconds.  May\n *     be negative.\n */\ngoog.testing.MockClock.prototype.getTimeoutDelay = function() {\n  return this.timeoutDelay_;\n};\n\n\n/**\n * Increments the MockClock's time by a given number of milliseconds, running\n * any functions that are now overdue.\n * @param {number=} opt_millis Number of milliseconds to increment the counter.\n *     If not specified, clock ticks 1 millisecond.\n * @return {number} Current mock time in milliseconds.\n */\ngoog.testing.MockClock.prototype.tick = function(opt_millis) {\n  if (typeof opt_millis != 'number') {\n    opt_millis = 1;\n  }\n  var endTime = this.nowMillis_ + opt_millis;\n  this.runFunctionsWithinRange_(endTime);\n  this.nowMillis_ = endTime;\n  return endTime;\n};\n\n\n/**\n * Takes a promise and then ticks the mock clock. If the promise successfully\n * resolves, returns the value produced by the promise. If the promise is\n * rejected, it throws the rejection as an exception. If the promise is not\n * resolved at all, throws an exception.\n * Also ticks the general clock by the specified amount.\n * Only works with goog.Thenable, hence goog.Promise. Does NOT work with native\n * browser promises.\n *\n * @param {!goog.Thenable<T>} promise A promise that should be resolved after\n *     the mockClock is ticked for the given opt_millis.\n * @param {number=} opt_millis Number of milliseconds to increment the counter.\n *     If not specified, clock ticks 1 millisecond.\n * @return {T}\n * @template T\n *\n * @deprecated Treating Promises as synchronous values is incompatible with\n *     native promises and async functions. More generally, this code relies on\n *     promises \"pumped\" by setTimeout which is not done in production code,\n *     even for goog.Promise and results unnatural timing between resolved\n *     promises callback and setTimeout/setInterval callbacks in tests.\n */\ngoog.testing.MockClock.prototype.tickPromise = function(promise, opt_millis) {\n  var value;\n  var error;\n  var resolved = false;\n  promise.then(\n      function(v) {\n        value = v;\n        resolved = true;\n      },\n      function(e) {\n        error = e;\n        resolved = true;\n      });\n  this.tick(opt_millis);\n  if (!resolved) {\n    throw new Error(\n        'Promise was expected to be resolved after mock clock tick.');\n  }\n  if (error) {\n    throw error;\n  }\n  return value;\n};\n\n\n/**\n * @return {number} The number of timeouts or intervals that have been\n * scheduled. A setInterval call is only counted once.\n */\ngoog.testing.MockClock.prototype.getTimeoutsMade = function() {\n  return this.timeoutsMade_;\n};\n\n\n/**\n * @return {number} The number of timeout or interval callbacks that have been\n * triggered. For setInterval, each callback is counted separately.\n */\ngoog.testing.MockClock.prototype.getCallbacksTriggered = function() {\n  return this.callbacksTriggered_;\n};\n\n\n/**\n * @return {number} The MockClock's current time in milliseconds.\n */\ngoog.testing.MockClock.prototype.getCurrentTime = function() {\n  return this.nowMillis_;\n};\n\n\n/**\n * @param {number} timeoutKey The timeout key.\n * @return {boolean} Whether the timer has been set and not cleared,\n *     independent of the timeout's expiration.  In other words, the timeout\n *     could have passed or could be scheduled for the future.  Either way,\n *     this function returns true or false depending only on whether the\n *     provided timeoutKey represents a timeout that has been set and not\n *     cleared.\n */\ngoog.testing.MockClock.prototype.isTimeoutSet = function(timeoutKey) {\n  return timeoutKey < goog.testing.MockClock.nextId &&\n      timeoutKey >= goog.testing.MockClock.nextId - this.timeoutsMade_ &&\n      !this.deletedKeys_[timeoutKey];\n};\n\n\n/**\n * Runs any function that is scheduled before a certain time.  Timeouts can\n * be made to fire early or late if timeoutDelay_ is non-0.\n * @param {number} endTime The latest time in the range, in milliseconds.\n * @private\n */\ngoog.testing.MockClock.prototype.runFunctionsWithinRange_ = function(endTime) {\n  var adjustedEndTime = endTime - this.timeoutDelay_;\n\n  // Repeatedly pop off the last item since the queue is always sorted.\n  while (this.queue_ && this.queue_.length &&\n         this.queue_[this.queue_.length - 1].runAtMillis <= adjustedEndTime) {\n    var timeout = this.queue_.pop();\n\n    if (!(timeout.timeoutKey in this.deletedKeys_)) {\n      // Only move time forwards.\n      this.nowMillis_ =\n          Math.max(this.nowMillis_, timeout.runAtMillis + this.timeoutDelay_);\n      // Call timeout in global scope and pass the timeout key as the argument.\n      this.callbacksTriggered_++;\n      timeout.funcToCall.call(goog.global, timeout.timeoutKey);\n      // In case the interval was cleared in the funcToCall\n      if (timeout.recurring) {\n        this.scheduleFunction_(\n            timeout.timeoutKey, timeout.funcToCall, timeout.millis, true);\n      }\n    }\n  }\n};\n\n\n/**\n * Schedules a function to be run at a certain time.\n * @param {number} timeoutKey The timeout key.\n * @param {Function} funcToCall The function to call.\n * @param {number} millis The number of milliseconds to call it in.\n * @param {boolean} recurring Whether to function call should recur.\n * @private\n */\ngoog.testing.MockClock.prototype.scheduleFunction_ = function(\n    timeoutKey, funcToCall, millis, recurring) {\n  if (!goog.isFunction(funcToCall)) {\n    // Early error for debuggability rather than dying in the next .tick()\n    throw new TypeError(\n        'The provided callback must be a function, not a ' + typeof funcToCall);\n  }\n\n  var /** !goog.testing.MockClock.QueueObjType_ */ timeout = {\n    runAtMillis: this.nowMillis_ + millis,\n    funcToCall: funcToCall,\n    recurring: recurring,\n    timeoutKey: timeoutKey,\n    millis: millis\n  };\n\n  goog.testing.MockClock.insert_(timeout, this.queue_);\n};\n\n\n/**\n * Inserts a timer descriptor into a descending-order queue.\n *\n * Later-inserted duplicates appear at lower indices.  For example, the\n * asterisk in (5,4,*,3,2,1) would be the insertion point for 3.\n *\n * @param {goog.testing.MockClock.QueueObjType_} timeout The timeout to insert,\n *     with numerical runAtMillis property.\n * @param {Array<!goog.testing.MockClock.QueueObjType_>} queue The queue to\n *     insert into, with each element having a numerical runAtMillis property.\n * @private\n */\ngoog.testing.MockClock.insert_ = function(timeout, queue) {\n  // Although insertion of N items is quadratic, requiring goog.structs.Heap\n  // from a unit test will make tests more prone to breakage.  Since unit\n  // tests are normally small, scalability is not a primary issue.\n\n  // Find an insertion point.  Since the queue is in reverse order (so we\n  // can pop rather than unshift), and later timers with the same time stamp\n  // should be executed later, we look for the element strictly greater than\n  // the one we are inserting.\n\n  for (var i = queue.length; i != 0; i--) {\n    if (queue[i - 1].runAtMillis > timeout.runAtMillis) {\n      break;\n    }\n    queue[i] = queue[i - 1];\n  }\n\n  queue[i] = timeout;\n};\n\n\n/**\n * Maximum 32-bit signed integer.\n *\n * Timeouts over this time return immediately in many browsers, due to integer\n * overflow.  Such known browsers include Firefox, Chrome, and Safari, but not\n * IE.\n *\n * @type {number}\n * @private\n */\ngoog.testing.MockClock.MAX_INT_ = 2147483647;\n\n\n/**\n * Schedules a function to be called after `millis` milliseconds.\n * Mock implementation for setTimeout.\n * @param {Function} funcToCall The function to call.\n * @param {number=} opt_millis The number of milliseconds to call it after.\n * @return {number} The number of timeouts created.\n * @private\n */\ngoog.testing.MockClock.prototype.setTimeout_ = function(\n    funcToCall, opt_millis) {\n  var millis = opt_millis || 0;\n  if (millis > goog.testing.MockClock.MAX_INT_) {\n    throw new Error(\n        'Bad timeout value: ' + millis + '.  Timeouts over MAX_INT ' +\n        '(24.8 days) cause timeouts to be fired ' +\n        'immediately in most browsers, except for IE.');\n  }\n  this.timeoutsMade_++;\n  this.scheduleFunction_(\n      goog.testing.MockClock.nextId, funcToCall, millis, false);\n  return goog.testing.MockClock.nextId++;\n};\n\n\n/**\n * Schedules a function to be called every `millis` milliseconds.\n * Mock implementation for setInterval.\n * @param {Function} funcToCall The function to call.\n * @param {number=} opt_millis The number of milliseconds between calls.\n * @return {number} The number of timeouts created.\n * @private\n */\ngoog.testing.MockClock.prototype.setInterval_ = function(\n    funcToCall, opt_millis) {\n  var millis = opt_millis || 0;\n  this.timeoutsMade_++;\n  this.scheduleFunction_(\n      goog.testing.MockClock.nextId, funcToCall, millis, true);\n  return goog.testing.MockClock.nextId++;\n};\n\n\n/**\n * Schedules a function to be called when an animation frame is triggered.\n * Mock implementation for requestAnimationFrame.\n * @param {Function} funcToCall The function to call.\n * @return {number} The number of timeouts created.\n * @private\n */\ngoog.testing.MockClock.prototype.requestAnimationFrame_ = function(funcToCall) {\n  return this.setTimeout_(goog.bind(function() {\n    if (funcToCall) {\n      funcToCall(this.getCurrentTime());\n    } else if (goog.global.mozRequestAnimationFrame) {\n      var event = new goog.testing.events.Event('MozBeforePaint', goog.global);\n      event['timeStamp'] = this.getCurrentTime();\n      goog.testing.events.fireBrowserEvent(event);\n    }\n  }, this), goog.testing.MockClock.REQUEST_ANIMATION_FRAME_TIMEOUT);\n};\n\n\n/**\n * Schedules a function to be called immediately after the current JS\n * execution.\n * Mock implementation for setImmediate.\n * @param {Function} funcToCall The function to call.\n * @return {number} The number of timeouts created.\n * @private\n */\ngoog.testing.MockClock.prototype.setImmediate_ = function(funcToCall) {\n  return this.setTimeout_(funcToCall, 0);\n};\n\n\n/**\n * Clears a timeout.\n * Mock implementation for clearTimeout.\n * @param {number} timeoutKey The timeout key to clear.\n * @private\n */\ngoog.testing.MockClock.prototype.clearTimeout_ = function(timeoutKey) {\n  // Some common libraries register static state with timers.\n  // This is bad. It leads to all sorts of crazy test problems where\n  // 1) Test A sets up a new mock clock and a static timer.\n  // 2) Test B sets up a new mock clock, but re-uses the static timer\n  //    from Test A.\n  // 3) A timeout key from test A gets cleared, breaking a timeout in\n  //    Test B.\n  //\n  // For now, we just hackily fail silently if someone tries to clear a timeout\n  // key before we've allocated it.\n  // Ideally, we should throw an exception if we see this happening.\n  if (this.isTimeoutSet(timeoutKey)) {\n    this.deletedKeys_[timeoutKey] = true;\n  }\n};\n\n\n/**\n * Clears an interval.\n * Mock implementation for clearInterval.\n * @param {number} timeoutKey The interval key to clear.\n * @private\n */\ngoog.testing.MockClock.prototype.clearInterval_ = function(timeoutKey) {\n  this.clearTimeout_(timeoutKey);\n};\n\n\n/**\n * Clears a requestAnimationFrame.\n * Mock implementation for cancelRequestAnimationFrame.\n * @param {number} timeoutKey The requestAnimationFrame key to clear.\n * @private\n */\ngoog.testing.MockClock.prototype.cancelRequestAnimationFrame_ = function(\n    timeoutKey) {\n  this.clearTimeout_(timeoutKey);\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.async.run","^9>","~$goog.Promise","~$goog.testing.PropertyReplacer","~$goog.testing.events","~$goog.Disposable","~$goog.testing.events.Event","~$goog.Thenable"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/mockclock.js"],"^:1",["^9K",["~$goog.testing.MockClock"]],"^9<",true,"^9=",["^9>","^:7","^:4","^:9","^:3","^:5","^:6","^:8"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.tristatemenuitem.js","^9C",["^9D","goog/ui/tristatemenuitem.js"],"^9E","goog/ui/tristatemenuitem.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A menu item class that supports three state checkbox semantics.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.ui.TriStateMenuItem');\ngoog.provide('goog.ui.TriStateMenuItem.State');\n\ngoog.require('goog.dom.classlist');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.MenuItem');\ngoog.require('goog.ui.TriStateMenuItemRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Class representing a three state checkbox menu item.\n *\n * @param {goog.ui.ControlContent} content Text caption or DOM structure\n *     to display as the content of the item (use to add icons or styling to\n *     menus).\n * @param {Object=} opt_model Data/model associated with the menu item.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper used for\n *     document interactions.\n * @param {goog.ui.MenuItemRenderer=} opt_renderer Optional renderer.\n * @param {boolean=} opt_alwaysAllowPartial  If true, always allow partial\n *     state.\n * @constructor\n * @extends {goog.ui.MenuItem}\n * TODO(attila): Figure out how to better integrate this into the\n * goog.ui.Control state management framework.\n * @final\n */\ngoog.ui.TriStateMenuItem = function(\n    content, opt_model, opt_domHelper, opt_renderer, opt_alwaysAllowPartial) {\n  goog.ui.MenuItem.call(\n      this, content, opt_model, opt_domHelper,\n      opt_renderer || new goog.ui.TriStateMenuItemRenderer());\n  this.setCheckable(true);\n  this.alwaysAllowPartial_ = opt_alwaysAllowPartial || false;\n};\ngoog.inherits(goog.ui.TriStateMenuItem, goog.ui.MenuItem);\n\n\n/**\n * Checked states for component.\n * @enum {number}\n */\ngoog.ui.TriStateMenuItem.State = {\n  /**\n   * Component is not checked.\n   */\n  NOT_CHECKED: 0,\n\n  /**\n   * Component is partially checked.\n   */\n  PARTIALLY_CHECKED: 1,\n\n  /**\n   * Component is fully checked.\n   */\n  FULLY_CHECKED: 2\n};\n\n\n/**\n * Menu item's checked state.\n * @type {goog.ui.TriStateMenuItem.State}\n * @private\n */\ngoog.ui.TriStateMenuItem.prototype.checkState_ =\n    goog.ui.TriStateMenuItem.State.NOT_CHECKED;\n\n\n/**\n * Whether the partial state can be toggled.\n * @type {boolean}\n * @private\n */\ngoog.ui.TriStateMenuItem.prototype.allowPartial_ = false;\n\n\n/**\n * Used to override allowPartial_ to force the third state to always be\n * permitted.\n * @type {boolean}\n * @private\n */\ngoog.ui.TriStateMenuItem.prototype.alwaysAllowPartial_ = false;\n\n\n/**\n * @return {goog.ui.TriStateMenuItem.State} The menu item's check state.\n */\ngoog.ui.TriStateMenuItem.prototype.getCheckedState = function() {\n  return this.checkState_;\n};\n\n\n/**\n * Sets the checked state.\n * @param {goog.ui.TriStateMenuItem.State} state The checked state.\n */\ngoog.ui.TriStateMenuItem.prototype.setCheckedState = function(state) {\n  this.setCheckedState_(state);\n  this.allowPartial_ =\n      state == goog.ui.TriStateMenuItem.State.PARTIALLY_CHECKED;\n};\n\n\n/**\n * Sets the checked state and updates the CSS styling. Dispatches a\n * `CHECK` or `UNCHECK` event prior to changing the component's\n * state, which may be caught and canceled to prevent the component from\n * changing state.\n * @param {goog.ui.TriStateMenuItem.State} state The checked state.\n * @private\n */\ngoog.ui.TriStateMenuItem.prototype.setCheckedState_ = function(state) {\n  if (this.dispatchEvent(\n          state != goog.ui.TriStateMenuItem.State.NOT_CHECKED ?\n              goog.ui.Component.EventType.CHECK :\n              goog.ui.Component.EventType.UNCHECK)) {\n    this.setState(\n        goog.ui.Component.State.CHECKED,\n        state != goog.ui.TriStateMenuItem.State.NOT_CHECKED);\n    this.checkState_ = state;\n    this.updatedCheckedStateClassNames_();\n  }\n};\n\n\n/** @override */\ngoog.ui.TriStateMenuItem.prototype.performActionInternal = function(e) {\n  switch (this.getCheckedState()) {\n    case goog.ui.TriStateMenuItem.State.NOT_CHECKED:\n      this.setCheckedState_(\n          this.alwaysAllowPartial_ || this.allowPartial_ ?\n              goog.ui.TriStateMenuItem.State.PARTIALLY_CHECKED :\n              goog.ui.TriStateMenuItem.State.FULLY_CHECKED);\n      break;\n    case goog.ui.TriStateMenuItem.State.PARTIALLY_CHECKED:\n      this.setCheckedState_(goog.ui.TriStateMenuItem.State.FULLY_CHECKED);\n      break;\n    case goog.ui.TriStateMenuItem.State.FULLY_CHECKED:\n      this.setCheckedState_(goog.ui.TriStateMenuItem.State.NOT_CHECKED);\n      break;\n  }\n\n  var checkboxClass =\n      goog.getCssName(this.getRenderer().getCssClass(), 'checkbox');\n  var clickOnCheckbox = e.target &&\n      goog.dom.classlist.contains(\n          /** @type {!Element} */ (e.target), checkboxClass);\n\n  return this.dispatchEvent(\n      clickOnCheckbox || this.allowPartial_ ?\n          goog.ui.Component.EventType.CHANGE :\n          goog.ui.Component.EventType.ACTION);\n};\n\n\n/**\n * Updates the extra class names applied to the menu item element.\n * @private\n */\ngoog.ui.TriStateMenuItem.prototype.updatedCheckedStateClassNames_ = function() {\n  var renderer = this.getRenderer();\n  renderer.enableExtraClassName(\n      this, goog.getCssName(renderer.getCssClass(), 'partially-checked'),\n      this.getCheckedState() ==\n          goog.ui.TriStateMenuItem.State.PARTIALLY_CHECKED);\n  renderer.enableExtraClassName(\n      this, goog.getCssName(renderer.getCssClass(), 'fully-checked'),\n      this.getCheckedState() == goog.ui.TriStateMenuItem.State.FULLY_CHECKED);\n};\n\n\n// Register a decorator factory function for goog.ui.TriStateMenuItemRenderer.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.TriStateMenuItemRenderer.CSS_CLASS, function() {\n      // TriStateMenuItem defaults to using TriStateMenuItemRenderer.\n      return new goog.ui.TriStateMenuItem(null);\n    });\n","^9I",1579837703000,"^9J",["^9K",["~$goog.dom.classlist","~$goog.ui.TriStateMenuItemRenderer","~$goog.ui.Component","^9>","~$goog.ui.registry","~$goog.ui.MenuItem"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/tristatemenuitem.js"],"^:1",["^9K",["~$goog.ui.TriStateMenuItem","~$goog.ui.TriStateMenuItem.State"]],"^9<",true,"^9=",["^9>","^:;","^:=","^:?","^:<","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.mockrange.js","^9C",["^9D","goog/testing/mockrange.js"],"^9E","goog/testing/mockrange.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview LooseMock of goog.dom.AbstractRange.\n *\n */\n\ngoog.setTestOnly('goog.testing.MockRange');\ngoog.provide('goog.testing.MockRange');\n\ngoog.require('goog.dom.AbstractRange');\ngoog.require('goog.testing.LooseMock');\n\n\n\n/**\n * LooseMock of goog.dom.AbstractRange. Useful because the mock framework cannot\n * simply create a mock out of an abstract class, and cannot create a mock out\n * of classes that implements __iterator__ because it relies on the default\n * behavior of iterating through all of an object's properties.\n * @constructor\n * @extends {goog.testing.LooseMock}\n * @final\n */\ngoog.testing.MockRange = function() {\n  goog.testing.LooseMock.call(this, goog.testing.MockRange.ConcreteRange_);\n};\ngoog.inherits(goog.testing.MockRange, goog.testing.LooseMock);\n\n\n// *** Private helper class ************************************************* //\n\n\n\n/**\n * Concrete subclass of goog.dom.AbstractRange that simply sets the abstract\n * method __iterator__ to undefined so that javascript defaults to iterating\n * through all of the object's properties.\n * @constructor\n * @extends {goog.dom.AbstractRange}\n * @private\n */\ngoog.testing.MockRange.ConcreteRange_ = function() {\n  goog.dom.AbstractRange.call(this);\n};\ngoog.inherits(goog.testing.MockRange.ConcreteRange_, goog.dom.AbstractRange);\n\n\n/**\n * Undefine the iterator so the mock framework can loop through this class'\n * properties.\n * @override\n */\ngoog.testing.MockRange.ConcreteRange_.prototype.__iterator__ =\n    // This isn't really type-safe.\n    /** @type {?} */ (undefined);\n","^9I",1579837703000,"^9J",["^9K",["~$goog.dom.AbstractRange","^9>","~$goog.testing.LooseMock"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/mockrange.js"],"^:1",["^9K",["~$goog.testing.MockRange"]],"^9<",true,"^9=",["^9>","^:B","^:C"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.popupcolorpicker.js","^9C",["^9D","goog/ui/popupcolorpicker.js"],"^9E","goog/ui/popupcolorpicker.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Popup Color Picker implementation.  This is intended to be\n * less general than goog.ui.ColorPicker and presents a default set of colors\n * that CCC apps currently use in their color pickers.\n *\n * @see ../demos/popupcolorpicker.html\n */\n\ngoog.provide('goog.ui.PopupColorPicker');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.EventType');\ngoog.require('goog.positioning.AnchoredPosition');\ngoog.require('goog.positioning.Corner');\ngoog.require('goog.ui.ColorPicker');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Popup');\n\n\n\n/**\n * Popup color picker widget.\n *\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @param {goog.ui.ColorPicker=} opt_colorPicker Optional color picker to use\n *     for this popup.\n * @extends {goog.ui.Component}\n * @constructor\n */\ngoog.ui.PopupColorPicker = function(opt_domHelper, opt_colorPicker) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  if (opt_colorPicker) {\n    this.colorPicker_ = opt_colorPicker;\n  }\n};\ngoog.inherits(goog.ui.PopupColorPicker, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.PopupColorPicker);\n\n\n/**\n * Whether the color picker is initialized.\n * @type {boolean}\n * @private\n */\ngoog.ui.PopupColorPicker.prototype.initialized_ = false;\n\n\n/**\n * Instance of a color picker control.\n * @type {?goog.ui.ColorPicker}\n * @private\n */\ngoog.ui.PopupColorPicker.prototype.colorPicker_ = null;\n\n\n/**\n * Instance of goog.ui.Popup used to manage the behavior of the color picker.\n * @type {?goog.ui.Popup}\n * @private\n */\ngoog.ui.PopupColorPicker.prototype.popup_ = null;\n\n\n/**\n * Corner of the popup which is pinned to the attaching element.\n * @type {goog.positioning.Corner}\n * @private\n */\ngoog.ui.PopupColorPicker.prototype.pinnedCorner_ =\n    goog.positioning.Corner.TOP_START;\n\n\n/**\n * Corner of the attaching element where the popup shows.\n * @type {goog.positioning.Corner}\n * @private\n */\ngoog.ui.PopupColorPicker.prototype.popupCorner_ =\n    goog.positioning.Corner.BOTTOM_START;\n\n\n/**\n * Reference to the element that triggered the last popup.\n * @type {?Element}\n * @private\n */\ngoog.ui.PopupColorPicker.prototype.lastTarget_ = null;\n\n\n/** @private {boolean} */\ngoog.ui.PopupColorPicker.prototype.rememberSelection_;\n\n\n/**\n * Whether the color picker can move the focus to its key event target when it\n * is shown.  The default is true.  Setting to false can break keyboard\n * navigation, but this is needed for certain scenarios, for example the\n * toolbar menu in trogedit which can't have the selection changed.\n * @type {boolean}\n * @private\n */\ngoog.ui.PopupColorPicker.prototype.allowAutoFocus_ = true;\n\n\n/**\n * Whether the color picker can accept focus.\n * @type {boolean}\n * @private\n */\ngoog.ui.PopupColorPicker.prototype.focusable_ = true;\n\n\n/**\n * If true, then the colorpicker will toggle off if it is already visible.\n *\n * @type {boolean}\n * @private\n */\ngoog.ui.PopupColorPicker.prototype.toggleMode_ = true;\n\n\n/**\n * If true, the colorpicker will appear on hover.\n * @type {boolean}\n * @private\n */\ngoog.ui.PopupColorPicker.prototype.showOnHover_ = false;\n\n\n/** @override */\ngoog.ui.PopupColorPicker.prototype.createDom = function() {\n  goog.ui.PopupColorPicker.superClass_.createDom.call(this);\n  this.popup_ = new goog.ui.Popup(this.getElement());\n  this.popup_.setPinnedCorner(this.pinnedCorner_);\n  goog.dom.classlist.set(\n      goog.asserts.assert(this.getElement()),\n      goog.getCssName('goog-popupcolorpicker'));\n  this.getElement().unselectable = 'on';\n};\n\n\n/** @override */\ngoog.ui.PopupColorPicker.prototype.disposeInternal = function() {\n  goog.ui.PopupColorPicker.superClass_.disposeInternal.call(this);\n  this.colorPicker_ = null;\n  this.lastTarget_ = null;\n  this.initialized_ = false;\n  if (this.popup_) {\n    this.popup_.dispose();\n    this.popup_ = null;\n  }\n};\n\n\n/**\n * ColorPickers cannot be used to decorate pre-existing html, since the\n * structure they build is fairly complicated.\n * @param {Element} element Element to decorate.\n * @return {boolean} Returns always false.\n * @override\n */\ngoog.ui.PopupColorPicker.prototype.canDecorate = function(element) {\n  return false;\n};\n\n\n/**\n * @return {goog.ui.ColorPicker} The color picker instance.\n */\ngoog.ui.PopupColorPicker.prototype.getColorPicker = function() {\n  return this.colorPicker_;\n};\n\n\n/**\n * Returns whether the Popup dismisses itself when the user clicks outside of\n * it.\n * @return {boolean} Whether the Popup autohides on an external click.\n */\ngoog.ui.PopupColorPicker.prototype.getAutoHide = function() {\n  return !!this.popup_ && this.popup_.getAutoHide();\n};\n\n\n/**\n * Sets whether the Popup dismisses itself when the user clicks outside of it -\n * must be called after the Popup has been created (in createDom()),\n * otherwise it does nothing.\n *\n * @param {boolean} autoHide Whether to autohide on an external click.\n */\ngoog.ui.PopupColorPicker.prototype.setAutoHide = function(autoHide) {\n  if (this.popup_) {\n    this.popup_.setAutoHide(autoHide);\n  }\n};\n\n\n/**\n * Returns the region inside which the Popup dismisses itself when the user\n * clicks, or null if it was not set. Null indicates the entire document is\n * the autohide region.\n * @return {Element} The DOM element for autohide, or null if it hasn't been\n *     set.\n */\ngoog.ui.PopupColorPicker.prototype.getAutoHideRegion = function() {\n  return this.popup_ && this.popup_.getAutoHideRegion();\n};\n\n\n/**\n * Sets the region inside which the Popup dismisses itself when the user\n * clicks - must be called after the Popup has been created (in createDom()),\n * otherwise it does nothing.\n *\n * @param {Element} element The DOM element for autohide.\n */\ngoog.ui.PopupColorPicker.prototype.setAutoHideRegion = function(element) {\n  if (this.popup_) {\n    this.popup_.setAutoHideRegion(element);\n  }\n};\n\n\n/**\n * Returns the {@link goog.ui.PopupBase} from this picker. Returns null if the\n * popup has not yet been created.\n *\n * NOTE: This should *ONLY* be called from tests. If called before createDom(),\n * this should return null.\n *\n * @return {goog.ui.PopupBase?} The popup or null if it hasn't been created.\n */\ngoog.ui.PopupColorPicker.prototype.getPopup = function() {\n  return this.popup_;\n};\n\n\n/**\n * @return {Element} The last element that triggered the popup.\n */\ngoog.ui.PopupColorPicker.prototype.getLastTarget = function() {\n  return this.lastTarget_;\n};\n\n\n/**\n * Attaches the popup color picker to an element.\n * @param {Element} element The element to attach to.\n */\ngoog.ui.PopupColorPicker.prototype.attach = function(element) {\n  if (this.showOnHover_) {\n    this.getHandler().listen(\n        element, goog.events.EventType.MOUSEOVER, this.show_);\n  } else {\n    this.getHandler().listen(\n        element, goog.events.EventType.MOUSEDOWN, this.show_);\n  }\n};\n\n\n/**\n * Detatches the popup color picker from an element.\n * @param {Element} element The element to detach from.\n */\ngoog.ui.PopupColorPicker.prototype.detach = function(element) {\n  if (this.showOnHover_) {\n    this.getHandler().unlisten(\n        element, goog.events.EventType.MOUSEOVER, this.show_);\n  } else {\n    this.getHandler().unlisten(\n        element, goog.events.EventType.MOUSEOVER, this.show_);\n  }\n};\n\n\n/**\n * Gets the color that is currently selected in this color picker.\n * @return {?string} The hex string of the color selected, or null if no\n *     color is selected.\n */\ngoog.ui.PopupColorPicker.prototype.getSelectedColor = function() {\n  return this.colorPicker_.getSelectedColor();\n};\n\n\n/**\n * Sets whether the color picker can accept focus.\n * @param {boolean} focusable True iff the color picker can accept focus.\n */\ngoog.ui.PopupColorPicker.prototype.setFocusable = function(focusable) {\n  this.focusable_ = focusable;\n  if (this.colorPicker_) {\n    // TODO(user): In next revision sort the behavior of passing state to\n    // children correctly\n    this.colorPicker_.setFocusable(focusable);\n  }\n};\n\n\n/**\n * Sets whether the color picker can automatically move focus to its key event\n * target when it is set to visible.\n * @param {boolean} allow Whether to allow auto focus.\n */\ngoog.ui.PopupColorPicker.prototype.setAllowAutoFocus = function(allow) {\n  this.allowAutoFocus_ = allow;\n};\n\n\n/**\n * @return {boolean} Whether the color picker can automatically move focus to\n *     its key event target when it is set to visible.\n */\ngoog.ui.PopupColorPicker.prototype.getAllowAutoFocus = function() {\n  return this.allowAutoFocus_;\n};\n\n\n/**\n * Sets whether the color picker should toggle off if it is already open.\n * @param {boolean} toggle The new toggle mode.\n */\ngoog.ui.PopupColorPicker.prototype.setToggleMode = function(toggle) {\n  this.toggleMode_ = toggle;\n};\n\n\n/**\n * Gets whether the colorpicker is in toggle mode\n * @return {boolean} toggle.\n */\ngoog.ui.PopupColorPicker.prototype.getToggleMode = function() {\n  return this.toggleMode_;\n};\n\n\n/**\n * Sets whether the picker remembers the last selected color between popups.\n *\n * @param {boolean} remember Whether to remember the selection.\n */\ngoog.ui.PopupColorPicker.prototype.setRememberSelection = function(remember) {\n  this.rememberSelection_ = remember;\n};\n\n\n/**\n * @return {boolean} Whether the picker remembers the last selected color\n *     between popups.\n */\ngoog.ui.PopupColorPicker.prototype.getRememberSelection = function() {\n  return this.rememberSelection_;\n};\n\n\n/**\n * Add an array of colors to the colors displayed by the color picker.\n * Does not add duplicated colors.\n * @param {Array<string>} colors The array of colors to be added.\n */\ngoog.ui.PopupColorPicker.prototype.addColors = function(colors) {\n\n};\n\n\n/**\n * Clear the colors displayed by the color picker.\n */\ngoog.ui.PopupColorPicker.prototype.clearColors = function() {\n\n};\n\n\n/**\n * Set the pinned corner of the popup.\n * @param {goog.positioning.Corner} corner The corner of the popup which is\n *     pinned to the attaching element.\n */\ngoog.ui.PopupColorPicker.prototype.setPinnedCorner = function(corner) {\n  this.pinnedCorner_ = corner;\n  if (this.popup_) {\n    this.popup_.setPinnedCorner(this.pinnedCorner_);\n  }\n};\n\n\n/**\n * Sets which corner of the attaching element this popup shows up.\n * @param {goog.positioning.Corner} corner The corner of the attaching element\n *     where to show the popup.\n */\ngoog.ui.PopupColorPicker.prototype.setPopupCorner = function(corner) {\n  this.popupCorner_ = corner;\n};\n\n\n/**\n * Sets whether the popup shows up on hover. By default, appears on click.\n * @param {boolean} showOnHover True if popup should appear on hover.\n */\ngoog.ui.PopupColorPicker.prototype.setShowOnHover = function(showOnHover) {\n  this.showOnHover_ = showOnHover;\n};\n\n\n/**\n * Handles click events on the targets and shows the color picker.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.ui.PopupColorPicker.prototype.show_ = function(e) {\n  if (!this.initialized_) {\n    this.colorPicker_ = this.colorPicker_ ||\n        goog.ui.ColorPicker.createSimpleColorGrid(this.getDomHelper());\n    this.colorPicker_.setFocusable(this.focusable_);\n    this.addChild(this.colorPicker_, true);\n    this.getHandler().listen(\n        this.colorPicker_, goog.ui.ColorPicker.EventType.CHANGE,\n        this.onColorPicked_);\n    this.initialized_ = true;\n  }\n\n  if (this.popup_.isOrWasRecentlyVisible() && this.toggleMode_ &&\n      this.lastTarget_ == e.currentTarget) {\n    this.popup_.setVisible(false);\n    return;\n  }\n\n  this.lastTarget_ = /** @type {Element} */ (e.currentTarget);\n  this.popup_.setPosition(\n      new goog.positioning.AnchoredPosition(\n          this.lastTarget_, this.popupCorner_));\n  if (!this.rememberSelection_) {\n    this.colorPicker_.setSelectedIndex(-1);\n  }\n  this.popup_.setVisible(true);\n  if (this.allowAutoFocus_) {\n    this.colorPicker_.focus();\n  }\n};\n\n\n/**\n * Handles the color change event.\n * @param {goog.events.Event} e The event.\n * @private\n */\ngoog.ui.PopupColorPicker.prototype.onColorPicked_ = function(e) {\n  // When we show the color picker we reset the color, which triggers an event.\n  // Here we block that event so that it doesn't dismiss the popup\n  // TODO(user): Update the colorpicker to allow selection to be cleared\n  if (this.colorPicker_.getSelectedIndex() == -1) {\n    e.stopPropagation();\n    return;\n  }\n  this.popup_.setVisible(false);\n  if (this.allowAutoFocus_) {\n    this.lastTarget_.focus();\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.asserts","~$goog.ui.ColorPicker","~$goog.positioning.Corner","~$goog.positioning.AnchoredPosition","^:;","^:=","^9>","~$goog.events.EventType","~$goog.ui.Popup"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/popupcolorpicker.js"],"^:1",["^9K",["~$goog.ui.PopupColorPicker"]],"^9<",true,"^9=",["^9>","^:E","^:;","^:I","^:H","^:G","^:F","^:=","^:J"]],["^ ","^9A",[1579837703000],"^9B","goog.editor.plugins.undoredomanager.js","^9C",["^9D","goog/editor/plugins/undoredomanager.js"],"^9E","goog/editor/plugins/undoredomanager.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Code for managing series of undo-redo actions in the form of\n * {@link goog.editor.plugins.UndoRedoState}s.\n *\n */\n\n\ngoog.provide('goog.editor.plugins.UndoRedoManager');\ngoog.provide('goog.editor.plugins.UndoRedoManager.EventType');\n\ngoog.require('goog.editor.plugins.UndoRedoState');\ngoog.require('goog.events');\ngoog.require('goog.events.EventTarget');\n\n\n\n/**\n * Manages undo and redo operations through a series of `UndoRedoState`s\n * maintained on undo and redo stacks.\n *\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.editor.plugins.UndoRedoManager = function() {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * The maximum number of states on the undo stack at any time. Used to limit\n   * the memory footprint of the undo-redo stack.\n   * TODO(user) have a separate memory size based limit.\n   * @type {number}\n   * @private\n   */\n  this.maxUndoDepth_ = 100;\n\n  /**\n   * The undo stack.\n   * @type {Array<goog.editor.plugins.UndoRedoState>}\n   * @private\n   */\n  this.undoStack_ = [];\n\n  /**\n   * The redo stack.\n   * @type {Array<goog.editor.plugins.UndoRedoState>}\n   * @private\n   */\n  this.redoStack_ = [];\n\n  /**\n   * A queue of pending undo or redo actions. Stored as objects with two\n   * properties: func and state. The func property stores the undo or redo\n   * function to be called, the state property stores the state that method\n   * came from.\n   * @type {Array<Object>}\n   * @private\n   */\n  this.pendingActions_ = [];\n};\ngoog.inherits(goog.editor.plugins.UndoRedoManager, goog.events.EventTarget);\n\n\n/**\n * Event types for the events dispatched by undo-redo manager.\n * @enum {string}\n */\ngoog.editor.plugins.UndoRedoManager.EventType = {\n  /**\n   * Signifies that he undo or redo stack transitioned between 0 and 1 states,\n   * meaning that the ability to peform undo or redo operations has changed.\n   */\n  STATE_CHANGE: 'state_change',\n\n  /**\n   * Signifies that a state was just added to the undo stack. Events of this\n   * type will have a `state` property whose value is the state that\n   * was just added.\n   */\n  STATE_ADDED: 'state_added',\n\n  /**\n   * Signifies that the undo method of a state is about to be called.\n   * Events of this type will have a `state` property whose value is the\n   * state whose undo action is about to be performed. If the event is cancelled\n   * the action does not proceed, but the state will still transition between\n   * stacks.\n   */\n  BEFORE_UNDO: 'before_undo',\n\n  /**\n   * Signifies that the redo method of a state is about to be called.\n   * Events of this type will have a `state` property whose value is the\n   * state whose redo action is about to be performed. If the event is cancelled\n   * the action does not proceed, but the state will still transition between\n   * stacks.\n   */\n  BEFORE_REDO: 'before_redo'\n};\n\n\n/**\n * The key for the listener for the completion of the asynchronous state whose\n * undo or redo action is in progress. Null if no action is in progress.\n * @type {?goog.events.Key}\n * @private\n */\ngoog.editor.plugins.UndoRedoManager.prototype.inProgressActionKey_ = null;\n\n\n/**\n * Set the max undo stack depth (not the real memory usage).\n * @param {number} depth Depth of the stack.\n */\ngoog.editor.plugins.UndoRedoManager.prototype.setMaxUndoDepth = function(\n    depth) {\n  this.maxUndoDepth_ = depth;\n};\n\n\n/**\n * Add state to the undo stack. This clears the redo stack.\n *\n * @param {goog.editor.plugins.UndoRedoState} state The state to add to the undo\n *     stack.\n */\ngoog.editor.plugins.UndoRedoManager.prototype.addState = function(state) {\n  // TODO: is the state.equals check necessary?\n  if (this.undoStack_.length == 0 ||\n      !state.equals(this.undoStack_[this.undoStack_.length - 1])) {\n    this.undoStack_.push(state);\n    if (this.undoStack_.length > this.maxUndoDepth_) {\n      this.undoStack_.shift();\n    }\n    // Clobber the redo stack.\n    var redoLength = this.redoStack_.length;\n    this.redoStack_.length = 0;\n\n    this.dispatchEvent({\n      type: goog.editor.plugins.UndoRedoManager.EventType.STATE_ADDED,\n      state: state\n    });\n\n    // If the redo state had states on it, then clobbering the redo stack above\n    // has caused a state change.\n    if (this.undoStack_.length == 1 || redoLength) {\n      this.dispatchStateChange_();\n    }\n  }\n};\n\n\n/**\n * Dispatches a STATE_CHANGE event with this manager as the target.\n * @private\n */\ngoog.editor.plugins.UndoRedoManager.prototype.dispatchStateChange_ =\n    function() {\n  this.dispatchEvent(\n      goog.editor.plugins.UndoRedoManager.EventType.STATE_CHANGE);\n};\n\n\n/**\n * Performs the undo operation of the state at the top of the undo stack, moving\n * that state to the top of the redo stack. If the undo stack is empty, does\n * nothing.\n */\ngoog.editor.plugins.UndoRedoManager.prototype.undo = function() {\n  this.shiftState_(this.undoStack_, this.redoStack_);\n};\n\n\n/**\n * Performs the redo operation of the state at the top of the redo stack, moving\n * that state to the top of the undo stack. If redo undo stack is empty, does\n * nothing.\n */\ngoog.editor.plugins.UndoRedoManager.prototype.redo = function() {\n  this.shiftState_(this.redoStack_, this.undoStack_);\n};\n\n\n/**\n * @return {boolean} Wether the undo stack has items on it, i.e., if it is\n *     possible to perform an undo operation.\n */\ngoog.editor.plugins.UndoRedoManager.prototype.hasUndoState = function() {\n  return this.undoStack_.length > 0;\n};\n\n\n/**\n * @return {boolean} Wether the redo stack has items on it, i.e., if it is\n *     possible to perform a redo operation.\n */\ngoog.editor.plugins.UndoRedoManager.prototype.hasRedoState = function() {\n  return this.redoStack_.length > 0;\n};\n\n\n/**\n * Move a state from one stack to the other, performing the appropriate undo\n * or redo action.\n *\n * @param {Array<goog.editor.plugins.UndoRedoState>} fromStack Stack to move\n *     the state from.\n * @param {Array<goog.editor.plugins.UndoRedoState>} toStack Stack to move\n *     the state to.\n * @private\n */\ngoog.editor.plugins.UndoRedoManager.prototype.shiftState_ = function(\n    fromStack, toStack) {\n  if (fromStack.length) {\n    var state = fromStack.pop();\n\n    // Push the current state into the redo stack.\n    toStack.push(state);\n\n    this.addAction_({\n      type: fromStack == this.undoStack_ ?\n          goog.editor.plugins.UndoRedoManager.EventType.BEFORE_UNDO :\n          goog.editor.plugins.UndoRedoManager.EventType.BEFORE_REDO,\n      func: fromStack == this.undoStack_ ? state.undo : state.redo,\n      state: state\n    });\n\n    // If either stack transitioned between 0 and 1 in size then the ability\n    // to do an undo or redo has changed and we must dispatch a state change.\n    if (fromStack.length == 0 || toStack.length == 1) {\n      this.dispatchStateChange_();\n    }\n  }\n};\n\n\n/**\n * Adds an action to the queue of pending undo or redo actions. If no actions\n * are pending, immediately performs the action.\n *\n * @param {Object} action An undo or redo action. Stored as an object with two\n *     properties: func and state. The func property stores the undo or redo\n *     function to be called, the state property stores the state that method\n *     came from.\n * @private\n */\ngoog.editor.plugins.UndoRedoManager.prototype.addAction_ = function(action) {\n  this.pendingActions_.push(action);\n  if (this.pendingActions_.length == 1) {\n    this.doAction_();\n  }\n};\n\n\n/**\n * Executes the action at the front of the pending actions queue. If an action\n * is already in progress or the queue is empty, does nothing.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.editor.plugins.UndoRedoManager.prototype.doAction_ = function() {\n  if (this.inProgressActionKey_ || this.pendingActions_.length == 0) {\n    return;\n  }\n\n  var action = this.pendingActions_.shift();\n\n  var e = {type: action.type, state: action.state};\n\n  if (this.dispatchEvent(e)) {\n    if (action.state.isAsynchronous()) {\n      this.inProgressActionKey_ = goog.events.listen(\n          action.state, goog.editor.plugins.UndoRedoState.ACTION_COMPLETED,\n          this.finishAction_, false, this);\n      action.func.call(action.state);\n    } else {\n      action.func.call(action.state);\n      this.doAction_();\n    }\n  }\n};\n\n\n/**\n * Finishes processing the current in progress action, starting the next queued\n * action if one exists.\n * @private\n */\ngoog.editor.plugins.UndoRedoManager.prototype.finishAction_ = function() {\n  goog.events.unlistenByKey(/** @type {number} */ (this.inProgressActionKey_));\n  this.inProgressActionKey_ = null;\n  this.doAction_();\n};\n\n\n/**\n * Clears the undo and redo stacks.\n */\ngoog.editor.plugins.UndoRedoManager.prototype.clearHistory = function() {\n  if (this.undoStack_.length > 0 || this.redoStack_.length > 0) {\n    this.undoStack_.length = 0;\n    this.redoStack_.length = 0;\n    this.dispatchStateChange_();\n  }\n};\n\n\n/**\n * @return {goog.editor.plugins.UndoRedoState|undefined} The state at the top of\n *     the undo stack without removing it from the stack.\n */\ngoog.editor.plugins.UndoRedoManager.prototype.undoPeek = function() {\n  return this.undoStack_[this.undoStack_.length - 1];\n};\n\n\n/**\n * @return {goog.editor.plugins.UndoRedoState|undefined} The state at the top of\n *     the redo stack without removing it from the stack.\n */\ngoog.editor.plugins.UndoRedoManager.prototype.redoPeek = function() {\n  return this.redoStack_[this.redoStack_.length - 1];\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.events.EventTarget","~$goog.editor.plugins.UndoRedoState","~$goog.events"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/undoredomanager.js"],"^:1",["^9K",["~$goog.editor.plugins.UndoRedoManager.EventType","~$goog.editor.plugins.UndoRedoManager"]],"^9<",true,"^9=",["^9>","^:M","^:N","^:L"]],["^ ","^9A",[1579837703000],"^9B","goog.messaging.portnetwork.js","^9C",["^9D","goog/messaging/portnetwork.js"],"^9E","goog/messaging/portnetwork.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An interface for classes that connect a collection of HTML5\n * message-passing entities ({@link MessagePort}s, {@link Worker}s, and\n * {@link Window}s) and allow them to seamlessly communicate with one another.\n *\n * Conceptually, a PortNetwork is a collection of JS contexts, such as pages (in\n * or outside of iframes) or web workers. Each context has a unique name, and\n * each one can communicate with any of the others in the same network. This\n * communication takes place through a {@link goog.messaging.PortChannel} that\n * is retrieved via {#link goog.messaging.PortNetwork#dial}.\n *\n * One context (usually the main page) has a\n * {@link goog.messaging.PortOperator}, which is in charge of connecting each\n * context to each other context. All other contexts have\n * {@link goog.messaging.PortCaller}s which connect to the operator.\n *\n */\n\ngoog.provide('goog.messaging.PortNetwork');\n\ngoog.forwardDeclare('goog.messaging.MessageChannel');\n\n\n\n/**\n * @interface\n */\ngoog.messaging.PortNetwork = function() {};\n\n\n/**\n * Returns a message channel that communicates with the named context. If no\n * such port exists, an error will either be thrown immediately or after a round\n * trip with the operator, depending on whether this pool is the operator or a\n * caller.\n *\n * If context A calls dial('B') and context B calls dial('A'), the two\n * ports returned will be connected to one another.\n *\n * @param {string} name The name of the context to get.\n * @return {goog.messaging.MessageChannel} The channel communicating with the\n *     given context. This is either a {@link goog.messaging.PortChannel} or a\n *     decorator around a PortChannel, so it's safe to send {@link MessagePorts}\n *     across it. This will be disposed along with the PortNetwork.\n */\ngoog.messaging.PortNetwork.prototype.dial = function(name) {};\n\n\n/**\n * The name of the service exported by the operator for creating a connection\n * between two callers.\n *\n * @type {string}\n * @const\n */\ngoog.messaging.PortNetwork.REQUEST_CONNECTION_SERVICE = 'requestConnection';\n\n\n/**\n * The name of the service exported by the callers for adding a connection to\n * another context.\n *\n * @type {string}\n * @const\n */\ngoog.messaging.PortNetwork.GRANT_CONNECTION_SERVICE = 'grantConnection';\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/portnetwork.js"],"^:1",["^9K",["~$goog.messaging.PortNetwork"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.locale.timezonefingerprint.js","^9C",["^9D","goog/locale/timezonefingerprint.js"],"^9E","goog/locale/timezonefingerprint.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Data for time zone detection.\n *\n * The following code was generated by the timezone_detect.py script in:\n * http://go/i18n_tools which uses following files in this directory:\n * http://go/timezone_data\n * Files: olson2fingerprint.txt, country2olsons.txt, popular_olsons.txt\n *\n * After automatic generation, we added some manual editing. Projecting on\n * future changes, it is very unlikely that we will need to change the time\n * zone ID groups. Most of the further modifications will be about relative\n * time zone order in each time zone group. The easiest way to do that is\n * to modify this code directly, and that's what we decide to do.\n *\n */\n\n// clang-format off\n\ngoog.provide('goog.locale.TimeZoneFingerprint');\n\n\n/**\n * Time zone fingerprint mapping to time zone list.\n * @enum {!Array<string>}\n */\ngoog.locale.TimeZoneFingerprint = {\n  919994368: ['CA-America/Halifax', 'CA-America/Glace_Bay', 'GL-America/Thule',\n    'BM-Atlantic/Bermuda'],\n  6: ['AQ-Antarctica/Rothera'],\n  8: ['GY-America/Guyana'],\n  839516172: ['US-America/Denver', 'MX-America/Chihuahua', 'US-America/Boise',\n    'CA-America/Cambridge_Bay', 'CA-America/Edmonton', 'CA-America/Inuvik',\n    'MX-America/Mazatlan', 'US-America/Shiprock', 'CA-America/Yellowknife'],\n  983564836: ['UY-America/Montevideo'],\n  487587858: ['AU-Australia/Lord_Howe'],\n  20: ['KI-Pacific/Kiritimati'],\n  22: ['TO-Pacific/Tongatapu', 'KI-Pacific/Enderbury'],\n  24: ['FJ-Pacific/Fiji', 'TV-Pacific/Funafuti', 'MH-Pacific/Kwajalein',\n    'MH-Pacific/Majuro', 'NR-Pacific/Nauru', 'KI-Pacific/Tarawa',\n    'UM-Pacific/Wake', 'WF-Pacific/Wallis'],\n  25: ['NF-Pacific/Norfolk'],\n  26: ['RU-Asia/Magadan', 'VU-Pacific/Efate', 'SB-Pacific/Guadalcanal',\n    'FM-Pacific/Kosrae', 'NC-Pacific/Noumea', 'FM-Pacific/Ponape'],\n  28: ['AQ-Antarctica/DumontDUrville', 'AU-Australia/Brisbane',\n    'AU-Australia/Lindeman', 'GU-Pacific/Guam', 'PG-Pacific/Port_Moresby',\n    'MP-Pacific/Saipan', 'FM-Pacific/Truk'],\n  931091802: ['US-America/New_York', 'US-America/Detroit', 'CA-America/Iqaluit',\n    'US-America/Kentucky/Monticello', 'US-America/Louisville',\n    'CA-America/Montreal', 'BS-America/Nassau', 'CA-America/Nipigon',\n    'CA-America/Pangnirtung', 'CA-America/Thunder_Bay', 'CA-America/Toronto'],\n  30: ['JP-Asia/Tokyo', 'KR-Asia/Seoul', 'TL-Asia/Dili', 'ID-Asia/Jayapura',\n    'KP-Asia/Pyongyang', 'PW-Pacific/Palau'],\n  32: ['HK-Asia/Hong_Kong', 'CN-Asia/Shanghai', 'AU-Australia/Perth',\n    'TW-Asia/Taipei', 'SG-Asia/Singapore', 'AQ-Antarctica/Casey',\n    'BN-Asia/Brunei', 'CN-Asia/Chongqing', 'CN-Asia/Harbin',\n    'CN-Asia/Kashgar', 'MY-Asia/Kuala_Lumpur', 'MY-Asia/Kuching',\n    'MO-Asia/Macau', 'ID-Asia/Makassar', 'PH-Asia/Manila', 'CN-Asia/Urumqi'],\n  34: ['TH-Asia/Bangkok', 'AQ-Antarctica/Davis', 'ID-Asia/Jakarta',\n    'KH-Asia/Phnom_Penh', 'ID-Asia/Pontianak', 'VN-Asia/Saigon',\n    'LA-Asia/Vientiane', 'CX-Indian/Christmas'],\n  35: ['MM-Asia/Rangoon', 'CC-Indian/Cocos'],\n  941621262: ['BR-America/Sao_Paulo'],\n  37: ['IN-Asia/Calcutta'],\n  38: ['PK-Asia/Karachi', 'KZ-Asia/Aqtobe', 'TM-Asia/Ashgabat',\n    'TJ-Asia/Dushanbe', 'UZ-Asia/Samarkand', 'UZ-Asia/Tashkent',\n    'TF-Indian/Kerguelen', 'MV-Indian/Maldives'],\n  39: ['AF-Asia/Kabul'],\n  40: ['OM-Asia/Muscat', 'AE-Asia/Dubai', 'SC-Indian/Mahe',\n    'MU-Indian/Mauritius', 'RE-Indian/Reunion'],\n  626175324: ['JO-Asia/Amman'],\n  42: ['KE-Africa/Nairobi', 'SA-Asia/Riyadh', 'ET-Africa/Addis_Ababa',\n    'ER-Africa/Asmera', 'TZ-Africa/Dar_es_Salaam', 'DJ-Africa/Djibouti',\n    'UG-Africa/Kampala', 'SD-Africa/Khartoum', 'SO-Africa/Mogadishu',\n    'AQ-Antarctica/Syowa', 'YE-Asia/Aden', 'BH-Asia/Bahrain',\n    'KW-Asia/Kuwait', 'QA-Asia/Qatar', 'MG-Indian/Antananarivo',\n    'KM-Indian/Comoro', 'YT-Indian/Mayotte'],\n  44: ['ZA-Africa/Johannesburg', 'IL-Asia/Jerusalem', 'MW-Africa/Blantyre',\n    'BI-Africa/Bujumbura', 'BW-Africa/Gaborone', 'ZW-Africa/Harare',\n    'RW-Africa/Kigali', 'CD-Africa/Lubumbashi', 'ZM-Africa/Lusaka',\n    'MZ-Africa/Maputo', 'LS-Africa/Maseru', 'SZ-Africa/Mbabane',\n    'LY-Africa/Tripoli'],\n  46: ['NG-Africa/Lagos', 'DZ-Africa/Algiers', 'CF-Africa/Bangui',\n    'CG-Africa/Brazzaville', 'CM-Africa/Douala', 'CD-Africa/Kinshasa',\n    'GA-Africa/Libreville', 'AO-Africa/Luanda', 'GQ-Africa/Malabo',\n    'TD-Africa/Ndjamena', 'NE-Africa/Niamey', 'BJ-Africa/Porto-Novo'],\n  48: ['MA-Africa/Casablanca', 'CI-Africa/Abidjan', 'GH-Africa/Accra',\n    'ML-Africa/Bamako', 'GM-Africa/Banjul', 'GW-Africa/Bissau',\n    'GN-Africa/Conakry', 'SN-Africa/Dakar', 'EH-Africa/El_Aaiun',\n    'SL-Africa/Freetown', 'TG-Africa/Lome', 'LR-Africa/Monrovia',\n    'MR-Africa/Nouakchott', 'BF-Africa/Ouagadougou', 'ST-Africa/Sao_Tome',\n    'GL-America/Danmarkshavn', 'IS-Atlantic/Reykjavik',\n    'SH-Atlantic/St_Helena'],\n  570425352: ['GE-Asia/Tbilisi'],\n  50: ['CV-Atlantic/Cape_Verde'],\n  52: ['GS-Atlantic/South_Georgia', 'BR-America/Noronha'],\n  54: ['AR-America/Buenos_Aires', 'BR-America/Araguaina',\n    'AR-America/Argentina/La_Rioja', 'AR-America/Argentina/Rio_Gallegos',\n    'AR-America/Argentina/San_Juan', 'AR-America/Argentina/Tucuman',\n    'AR-America/Argentina/Ushuaia', 'BR-America/Bahia', 'BR-America/Belem',\n    'AR-America/Catamarca', 'GF-America/Cayenne', 'AR-America/Cordoba',\n    'BR-America/Fortaleza', 'AR-America/Jujuy', 'BR-America/Maceio',\n    'AR-America/Mendoza', 'SR-America/Paramaribo', 'BR-America/Recife',\n    'AQ-Antarctica/Rothera'],\n  56: ['VE-America/Caracas', 'AI-America/Anguilla', 'AG-America/Antigua',\n    'AW-America/Aruba', 'BB-America/Barbados', 'BR-America/Boa_Vista',\n    'AN-America/Curacao', 'DM-America/Dominica', 'GD-America/Grenada',\n    'GP-America/Guadeloupe', 'GY-America/Guyana', 'CU-America/Havana',\n    'BO-America/La_Paz', 'BR-America/Manaus', 'MQ-America/Martinique',\n    'MS-America/Montserrat', 'TT-America/Port_of_Spain',\n    'BR-America/Porto_Velho', 'PR-America/Puerto_Rico',\n    'DO-America/Santo_Domingo', 'KN-America/St_Kitts', 'LC-America/St_Lucia',\n    'VI-America/St_Thomas', 'VC-America/St_Vincent', 'VG-America/Tortola'],\n  58: ['US-America/Indianapolis', 'US-America/Indianapolis',\n    'CO-America/Bogota', 'KY-America/Cayman', 'CA-America/Coral_Harbour',\n    'BR-America/Eirunepe', 'EC-America/Guayaquil', 'US-America/Indiana/Knox',\n    'JM-America/Jamaica', 'PE-America/Lima', 'PA-America/Panama',\n    'BR-America/Rio_Branco'],\n  60: ['NI-America/Managua', 'CA-America/Regina', 'BZ-America/Belize',\n    'CR-America/Costa_Rica', 'SV-America/El_Salvador',\n    'CA-America/Swift_Current', 'EC-Pacific/Galapagos'],\n  62: ['US-America/Phoenix', 'CA-America/Dawson_Creek',\n    'MX-America/Hermosillo'],\n  64: ['PN-Pacific/Pitcairn'],\n  66: ['PF-Pacific/Gambier'],\n  67: ['PF-Pacific/Marquesas'],\n  68: ['US-Pacific/Honolulu', 'TK-Pacific/Fakaofo', 'UM-Pacific/Johnston',\n    'KI-Pacific/Kiritimati', 'CK-Pacific/Rarotonga', 'PF-Pacific/Tahiti'],\n  70: ['UM-Pacific/Midway', 'WS-Pacific/Apia', 'KI-Pacific/Enderbury',\n    'NU-Pacific/Niue', 'AS-Pacific/Pago_Pago'],\n  72: ['MH-Pacific/Kwajalein'],\n  49938444: ['MX-America/Chihuahua'],\n  905969678: ['CA-America/Halifax'],\n  626339164: ['EG-Africa/Cairo'],\n  939579406: ['FK-Atlantic/Stanley'],\n  487915538: ['AU-Australia/Lord_Howe'],\n  937427058: ['CL-Pacific/Easter'],\n  778043508: ['RU-Asia/Novosibirsk', 'RU-Asia/Omsk'],\n  474655352: ['RU-Asia/Anadyr', 'RU-Asia/Kamchatka'],\n  269133956: ['NZ-Pacific/Chatham'],\n  948087430: ['GL-America/Godthab'],\n  671787146: ['MN-Asia/Hovd'],\n  617261764: ['TR-Europe/Istanbul', 'RU-Europe/Kaliningrad', 'BY-Europe/Minsk'],\n  830603252: ['MX-America/Mexico_City', 'US-America/Chicago',\n    'MX-America/Cancun', 'US-America/Menominee', 'MX-America/Merida',\n    'MX-America/Monterrey', 'US-America/North_Dakota/Center',\n    'CA-America/Rainy_River', 'CA-America/Rankin_Inlet'],\n  805300897: ['LK-Asia/Colombo'],\n  805312524: ['MX-America/Mexico_City', 'HN-America/Tegucigalpa'],\n  984437412: ['GS-Atlantic/South_Georgia'],\n  850043558: ['MX-America/Chihuahua'],\n  29: ['AU-Australia/Darwin'],\n  710950176: ['MN-Asia/Ulaanbaatar'],\n  617786052: ['RO-Europe/Bucharest', 'FI-Europe/Helsinki', 'CY-Asia/Nicosia',\n    'GR-Europe/Athens', 'MD-Europe/Chisinau', 'TR-Europe/Istanbul',\n    'UA-Europe/Kiev', 'LV-Europe/Riga', 'UA-Europe/Simferopol',\n    'BG-Europe/Sofia', 'EE-Europe/Tallinn', 'UA-Europe/Uzhgorod',\n    'LT-Europe/Vilnius', 'UA-Europe/Zaporozhye'],\n  105862464: ['US-America/Juneau'],\n  581567010: ['IQ-Asia/Baghdad'],\n  1294772902: ['US-America/Los_Angeles', 'CA-America/Dawson',\n    'MX-America/Tijuana', 'CA-America/Vancouver', 'CA-America/Whitehorse'],\n  483044050: ['AU-Australia/Sydney', 'AU-Australia/Melbourne'],\n  491433170: ['AU-Australia/Hobart'],\n  36: ['NP-Asia/Katmandu', 'LK-Asia/Colombo', 'BD-Asia/Dhaka',\n    'AQ-Antarctica/Mawson', 'AQ-Antarctica/Vostok', 'KZ-Asia/Almaty',\n    'KZ-Asia/Qyzylorda', 'BT-Asia/Thimphu', 'IO-Indian/Chagos'],\n  626175196: ['IL-Asia/Jerusalem'],\n  919994592: ['CA-America/Goose_Bay'],\n  946339336: ['GB-Europe/London', 'ES-Atlantic/Canary', 'FO-Atlantic/Faeroe',\n    'PT-Atlantic/Madeira', 'IE-Europe/Dublin', 'PT-Europe/Lisbon'],\n  1037565906: ['PT-Atlantic/Azores', 'GL-America/Scoresbysund'],\n  670913918: ['TN-Africa/Tunis'],\n  41: ['IR-Asia/Tehran'],\n  572522538: ['RU-Europe/Moscow'],\n  403351686: ['MN-Asia/Choibalsan'],\n  626338524: ['PS-Asia/Gaza'],\n  411740806: ['RU-Asia/Yakutsk'],\n  635437856: ['RU-Asia/Irkutsk'],\n  617261788: ['RO-Europe/Bucharest', 'LB-Asia/Beirut'],\n  947956358: ['GL-America/Godthab', 'PM-America/Miquelon'],\n  12: ['EC-Pacific/Galapagos'],\n  626306268: ['SY-Asia/Damascus'],\n  497024903: ['AU-Australia/Adelaide', 'AU-Australia/Broken_Hill'],\n  456480044: ['RU-Asia/Vladivostok', 'RU-Asia/Sakhalin'],\n  312471854: ['NZ-Pacific/Auckland', 'AQ-Antarctica/McMurdo'],\n  626347356: ['EG-Africa/Cairo'],\n  897537370: ['CU-America/Havana'],\n  680176266: ['RU-Asia/Krasnoyarsk'],\n  1465210176: ['US-America/Anchorage'],\n  805312908: ['NI-America/Managua'],\n  492088530: ['AU-Australia/Hobart', 'AU-Australia/Currie'],\n  901076366: ['BR-America/Campo_Grande', 'BR-America/Cuiaba'],\n  943019406: ['CL-America/Santiago', 'AQ-Antarctica/Palmer'],\n  928339288: ['US-America/New_York', 'CA-America/Montreal',\n    'CA-America/Toronto', 'US-America/Detroit'],\n  939480410: ['US-America/Indiana/Marengo', 'US-America/Indiana/Vevay'],\n  626392412: ['NA-Africa/Windhoek'],\n  559943005: ['IR-Asia/Tehran'],\n  592794974: ['KZ-Asia/Aqtau', 'KZ-Asia/Oral'],\n  76502378: ['CA-America/Pangnirtung'],\n  838860812: ['US-America/Denver', 'CA-America/Edmonton'],\n  931091834: ['TC-America/Grand_Turk', 'HT-America/Port-au-Prince'],\n  662525310: ['FR-Europe/Paris', 'DE-Europe/Berlin', 'BA-Europe/Sarajevo',\n    'CS-Europe/Belgrade', 'ES-Africa/Ceuta', 'NL-Europe/Amsterdam',\n    'AD-Europe/Andorra', 'SK-Europe/Bratislava', 'BE-Europe/Brussels',\n    'HU-Europe/Budapest', 'DK-Europe/Copenhagen', 'GI-Europe/Gibraltar',\n    'SI-Europe/Ljubljana', 'LU-Europe/Luxembourg', 'ES-Europe/Madrid',\n    'MT-Europe/Malta', 'MC-Europe/Monaco', 'NO-Europe/Oslo',\n    'CZ-Europe/Prague', 'IT-Europe/Rome', 'MK-Europe/Skopje',\n    'SE-Europe/Stockholm', 'AL-Europe/Tirane', 'LI-Europe/Vaduz',\n    'AT-Europe/Vienna', 'PL-Europe/Warsaw', 'HR-Europe/Zagreb',\n    'CH-Europe/Zurich'],\n  1465865536: ['US-America/Anchorage', 'US-America/Juneau',\n    'US-America/Nome', 'US-America/Yakutat'],\n  495058823: ['AU-Australia/Adelaide', 'AU-Australia/Broken_Hill'],\n  599086472: ['GE-Asia/Tbilisi', 'AM-Asia/Yerevan', 'RU-Europe/Samara'],\n  805337484: ['GT-America/Guatemala'],\n  1001739662: ['PY-America/Asuncion'],\n  836894706: ['CA-America/Winnipeg'],\n  599086512: ['AZ-Asia/Baku'],\n  836894708: ['CA-America/Winnipeg'],\n  41025476: ['US-America/Menominee'],\n  501219282: ['RU-Asia/Magadan'],\n  970325971: ['CA-America/St_Johns'],\n  769654750: ['RU-Asia/Yekaterinburg'],\n  1286253222: ['US-America/Los_Angeles', 'CA-America/Vancouver',\n    'CA-America/Whitehorse'],\n  1373765610: ['US-America/Adak'],\n  973078513: ['CA-America/St_Johns'],\n  838860786: ['US-America/Chicago', 'CA-America/Winnipeg'],\n  970326003: ['CA-America/St_Johns'],\n  771751924: ['KG-Asia/Bishkek'],\n  952805774: ['AQ-Antarctica/Palmer'],\n  483699410: ['AU-Australia/Sydney', 'AU-Australia/Melbourne']\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/locale/timezonefingerprint.js"],"^:1",["^9K",["~$goog.locale.TimeZoneFingerprint"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.debug.devcss.devcss.js","^9C",["^9D","goog/debug/devcss/devcss.js"],"^9E","goog/debug/devcss/devcss.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Runtime development CSS Compiler emulation, via javascript.\n * This class provides an approximation to CSSCompiler's functionality by\n * hacking the live CSSOM.\n * This code is designed  to be inserted in the DOM immediately after the last\n * style block in HEAD when in development mode, i.e. you are not using a\n * running instance of a CSS Compiler to pass your CSS through.\n */\n\n\ngoog.provide('goog.debug.DevCss');\ngoog.provide('goog.debug.DevCss.UserAgent');\n\ngoog.require('goog.asserts');\ngoog.require('goog.cssom');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A class for solving development CSS issues/emulating the CSS Compiler.\n * @param {goog.debug.DevCss.UserAgent=} opt_userAgent The user agent, if not\n *     passed in, will be determined using goog.userAgent.\n * @param {number|string=} opt_userAgentVersion The user agent's version.\n *     If not passed in, will be determined using goog.userAgent.\n * @throws {Error} When userAgent detection fails.\n * @constructor\n * @final\n */\ngoog.debug.DevCss = function(opt_userAgent, opt_userAgentVersion) {\n  if (!opt_userAgent) {\n    // Walks through the known goog.userAgents.\n    if (goog.userAgent.IE) {\n      opt_userAgent = goog.debug.DevCss.UserAgent.IE;\n    } else if (goog.userAgent.GECKO) {\n      opt_userAgent = goog.debug.DevCss.UserAgent.GECKO;\n    } else if (goog.userAgent.WEBKIT) {\n      opt_userAgent = goog.debug.DevCss.UserAgent.WEBKIT;\n    } else if (goog.userAgent.MOBILE) {\n      opt_userAgent = goog.debug.DevCss.UserAgent.MOBILE;\n    } else if (goog.userAgent.OPERA) {\n      opt_userAgent = goog.debug.DevCss.UserAgent.OPERA;\n    } else if (goog.userAgent.EDGE) {\n      opt_userAgent = goog.debug.DevCss.UserAgent.EDGE;\n    }\n  }\n  switch (opt_userAgent) {\n    case goog.debug.DevCss.UserAgent.OPERA:\n    case goog.debug.DevCss.UserAgent.IE:\n    case goog.debug.DevCss.UserAgent.GECKO:\n    case goog.debug.DevCss.UserAgent.FIREFOX:\n    case goog.debug.DevCss.UserAgent.WEBKIT:\n    case goog.debug.DevCss.UserAgent.SAFARI:\n    case goog.debug.DevCss.UserAgent.MOBILE:\n    case goog.debug.DevCss.UserAgent.EDGE:\n      break;\n    default:\n      throw new Error(\n          'Could not determine the user agent from known UserAgents');\n  }\n\n  /**\n   * One of goog.debug.DevCss.UserAgent.\n   * @type {string}\n   * @private\n   */\n  this.userAgent_ = opt_userAgent;\n\n  /**\n   * @const @private\n   */\n  this.userAgentTokens_ = {};\n\n  /**\n   * @type {number|string}\n   * @private\n   */\n  this.userAgentVersion_ = opt_userAgentVersion || goog.userAgent.VERSION;\n  this.generateUserAgentTokens_();\n\n  /**\n   * @type {boolean}\n   * @private\n   */\n  this.isIe6OrLess_ = this.userAgent_ == goog.debug.DevCss.UserAgent.IE &&\n      goog.string.compareVersions('7', this.userAgentVersion_) > 0;\n\n  if (this.isIe6OrLess_) {\n    /**\n     * @type {Array<{classNames,combinedClassName,els}>}\n     * @private\n     */\n    this.ie6CombinedMatches_ = [];\n  }\n};\n\n\n/**\n * Rewrites the CSSOM as needed to activate any useragent-specific selectors.\n * @param {boolean=} opt_enableIe6ReadyHandler If true(the default), and the\n *     userAgent is ie6, we set a document \"ready\" event handler to walk the DOM\n *     and make combined selector className changes. Having this parameter also\n *     aids unit testing.\n */\ngoog.debug.DevCss.prototype.activateBrowserSpecificCssRules = function(\n    opt_enableIe6ReadyHandler) {\n  var enableIe6EventHandler = (opt_enableIe6ReadyHandler !== undefined) ?\n      opt_enableIe6ReadyHandler :\n      true;\n  var cssRules = goog.cssom.getAllCssStyleRules();\n\n  for (var i = 0, cssRule; cssRule = cssRules[i]; i++) {\n    this.replaceBrowserSpecificClassNames_(cssRule);\n  }\n\n  // Since we may have manipulated the rules above, we'll have to do a\n  // complete sweep again if we're in IE6. Luckily performance doesn't\n  // matter for this tool.\n  if (this.isIe6OrLess_) {\n    cssRules = goog.cssom.getAllCssStyleRules();\n    for (var i = 0, cssRule; cssRule = cssRules[i]; i++) {\n      this.replaceIe6CombinedSelectors_(cssRule);\n    }\n  }\n\n  // Add an event listener for document ready to rewrite any necessary\n  // combined classnames in IE6.\n  if (this.isIe6OrLess_ && enableIe6EventHandler) {\n    goog.events.listen(\n        document, goog.events.EventType.LOAD,\n        goog.bind(this.addIe6CombinedClassNames_, this));\n  }\n};\n\n\n/**\n * A list of possible user agent strings.\n * @enum {string}\n */\ngoog.debug.DevCss.UserAgent = {\n  OPERA: 'OPERA',\n  IE: 'IE',\n  GECKO: 'GECKO',\n  FIREFOX: 'GECKO',\n  WEBKIT: 'WEBKIT',\n  SAFARI: 'WEBKIT',\n  MOBILE: 'MOBILE',\n  EDGE: 'EDGE'\n};\n\n\n/**\n * A list of strings that may be used for matching in CSS files/development.\n * @enum {string}\n * @private\n */\ngoog.debug.DevCss.CssToken_ = {\n  USERAGENT: 'USERAGENT',\n  SEPARATOR: '-',\n  LESS_THAN: 'LT',\n  GREATER_THAN: 'GT',\n  LESS_THAN_OR_EQUAL: 'LTE',\n  GREATER_THAN_OR_EQUAL: 'GTE',\n  IE6_SELECTOR_TEXT: 'goog-ie6-selector',\n  IE6_COMBINED_GLUE: '_'\n};\n\n\n/**\n * Generates user agent token match strings with comparison and version bits.\n * For example:\n *   userAgentTokens_.ANY will be like 'GECKO'\n *   userAgentTokens_.LESS_THAN will be like 'GECKO-LT3' etc...\n * @private\n */\ngoog.debug.DevCss.prototype.generateUserAgentTokens_ = function() {\n  this.userAgentTokens_.ANY = goog.debug.DevCss.CssToken_.USERAGENT +\n      goog.debug.DevCss.CssToken_.SEPARATOR + this.userAgent_;\n  this.userAgentTokens_.EQUALS =\n      this.userAgentTokens_.ANY + goog.debug.DevCss.CssToken_.SEPARATOR;\n  this.userAgentTokens_.LESS_THAN = this.userAgentTokens_.ANY +\n      goog.debug.DevCss.CssToken_.SEPARATOR +\n      goog.debug.DevCss.CssToken_.LESS_THAN;\n  this.userAgentTokens_.LESS_THAN_OR_EQUAL = this.userAgentTokens_.ANY +\n      goog.debug.DevCss.CssToken_.SEPARATOR +\n      goog.debug.DevCss.CssToken_.LESS_THAN_OR_EQUAL;\n  this.userAgentTokens_.GREATER_THAN = this.userAgentTokens_.ANY +\n      goog.debug.DevCss.CssToken_.SEPARATOR +\n      goog.debug.DevCss.CssToken_.GREATER_THAN;\n  this.userAgentTokens_.GREATER_THAN_OR_EQUAL = this.userAgentTokens_.ANY +\n      goog.debug.DevCss.CssToken_.SEPARATOR +\n      goog.debug.DevCss.CssToken_.GREATER_THAN_OR_EQUAL;\n};\n\n\n/**\n * Gets the version number bit from a selector matching userAgentToken.\n * @param {string} selectorText The selector text of a CSS rule.\n * @param {string} userAgentToken Includes the LTE/GTE bit to see if it matches.\n * @return {string|undefined} The version number.\n * @private\n */\ngoog.debug.DevCss.prototype.getVersionNumberFromSelectorText_ = function(\n    selectorText, userAgentToken) {\n  var regex = new RegExp(userAgentToken + '([\\\\d\\\\.]+)');\n  var matches = regex.exec(selectorText);\n  if (matches && matches.length == 2) {\n    return matches[1];\n  }\n};\n\n\n/**\n * Extracts a rule version from the selector text, and if it finds one, calls\n * compareVersions against it and the passed in token string to provide the\n * value needed to determine if we have a match or not.\n * @param {CSSRule} cssRule The rule to test against.\n * @param {string} token The match token to test against the rule.\n * @return {!Array|undefined} A tuple with the result of the compareVersions\n *     call and the matched ruleVersion.\n * @private\n */\ngoog.debug.DevCss.prototype.getRuleVersionAndCompare_ = function(\n    cssRule, token) {\n  if (!cssRule.selectorText || !cssRule.selectorText.match(token)) {\n    return;\n  }\n  var ruleVersion =\n      this.getVersionNumberFromSelectorText_(cssRule.selectorText, token);\n  if (!ruleVersion) {\n    return;\n  }\n\n  var comparison =\n      goog.string.compareVersions(this.userAgentVersion_, ruleVersion);\n  return [comparison, ruleVersion];\n};\n\n\n/**\n * Replaces a CSS selector if we have matches based on our useragent/version.\n * Example: With a selector like \".USERAGENT-IE-LTE6 .class { prop: value }\" if\n * we are running IE6 we'll end up with \".class { prop: value }\", thereby\n * \"activating\" the selector.\n * @param {CSSRule} cssRule The cssRule to potentially replace.\n * @private\n */\ngoog.debug.DevCss.prototype.replaceBrowserSpecificClassNames_ = function(\n    cssRule) {\n\n  // If we don't match the browser token, we can stop now.\n  if (!cssRule.selectorText ||\n      !cssRule.selectorText.match(this.userAgentTokens_.ANY)) {\n    return;\n  }\n\n  // We know it will begin as a classname.\n  var additionalRegexString;\n\n  // Tests \"Less than or equals\".\n  var compared = this.getRuleVersionAndCompare_(\n      cssRule, this.userAgentTokens_.LESS_THAN_OR_EQUAL);\n  if (compared && compared.length) {\n    if (compared[0] > 0) {\n      return;\n    }\n    additionalRegexString =\n        this.userAgentTokens_.LESS_THAN_OR_EQUAL + compared[1];\n  }\n\n  // Tests \"Less than\".\n  compared =\n      this.getRuleVersionAndCompare_(cssRule, this.userAgentTokens_.LESS_THAN);\n  if (compared && compared.length) {\n    if (compared[0] > -1) {\n      return;\n    }\n    additionalRegexString = this.userAgentTokens_.LESS_THAN + compared[1];\n  }\n\n  // Tests \"Greater than or equals\".\n  compared = this.getRuleVersionAndCompare_(\n      cssRule, this.userAgentTokens_.GREATER_THAN_OR_EQUAL);\n  if (compared && compared.length) {\n    if (compared[0] < 0) {\n      return;\n    }\n    additionalRegexString =\n        this.userAgentTokens_.GREATER_THAN_OR_EQUAL + compared[1];\n  }\n\n  // Tests \"Greater than\".\n  compared = this.getRuleVersionAndCompare_(\n      cssRule, this.userAgentTokens_.GREATER_THAN);\n  if (compared && compared.length) {\n    if (compared[0] < 1) {\n      return;\n    }\n    additionalRegexString = this.userAgentTokens_.GREATER_THAN + compared[1];\n  }\n\n  // Tests \"Equals\".\n  compared =\n      this.getRuleVersionAndCompare_(cssRule, this.userAgentTokens_.EQUALS);\n  if (compared && compared.length) {\n    if (compared[0] != 0) {\n      return;\n    }\n    additionalRegexString = this.userAgentTokens_.EQUALS + compared[1];\n  }\n\n  // If we got to here without generating the additionalRegexString, then\n  // we did not match any of our comparison token strings, and we want a\n  // general browser token replacement.\n  if (!additionalRegexString) {\n    additionalRegexString = this.userAgentTokens_.ANY;\n  }\n\n  // We need to match at least a single whitespace character to know that\n  // we are matching the entire useragent string token.\n  var regexString = '\\\\.' + additionalRegexString + '\\\\s+';\n  var re = new RegExp(regexString, 'g');\n\n  var currentCssText = goog.cssom.getCssTextFromCssRule(cssRule);\n\n  // Replacing the token with '' activates the selector for this useragent.\n  var newCssText = currentCssText.replace(re, '');\n\n  if (newCssText != currentCssText) {\n    goog.cssom.replaceCssRule(cssRule, newCssText);\n  }\n};\n\n\n/**\n * Replaces IE6 combined selector rules with a workable development alternative.\n * IE6 actually parses .class1.class2 {} to simply .class2 {} which is nasty.\n * To fully support combined selectors in IE6 this function needs to be paired\n * with a call to replace the relevant DOM elements classNames as well.\n * @see {this.addIe6CombinedClassNames_}\n * @param {CSSRule} cssRule The rule to potentially fix.\n * @private\n */\ngoog.debug.DevCss.prototype.replaceIe6CombinedSelectors_ = function(cssRule) {\n  // This match only ever works in IE because other UA's won't have our\n  // IE6_SELECTOR_TEXT in the cssText property.\n  if (cssRule.style && cssRule.style.cssText &&\n      cssRule.style.cssText.match(\n          goog.debug.DevCss.CssToken_.IE6_SELECTOR_TEXT)) {\n    var cssText = goog.cssom.getCssTextFromCssRule(cssRule);\n    var combinedSelectorText = this.getIe6CombinedSelectorText_(cssText);\n    if (combinedSelectorText) {\n      var newCssText = combinedSelectorText + '{' + cssRule.style.cssText + '}';\n      goog.cssom.replaceCssRule(cssRule, newCssText);\n    }\n  }\n};\n\n\n/**\n * Gets the appropriate new combined selector text for IE6.\n * Also adds an entry onto ie6CombinedMatches_ with relevant info for the\n * likely following call to walk the DOM and rewrite the class attribute.\n * Example: With a selector like\n *     \".class2 { -goog-ie6-selector: .class1.class2; prop: value }\".\n * this function will return:\n *     \".class1_class2 { prop: value }\".\n * @param {string} cssText The CSS selector text and css rule text combined.\n * @return {?string} The rewritten css rule text.\n * @private\n */\ngoog.debug.DevCss.prototype.getIe6CombinedSelectorText_ = function(cssText) {\n  var regex = new RegExp(\n      goog.debug.DevCss.CssToken_.IE6_SELECTOR_TEXT +\n          '\\\\s*:\\\\s*\\\\\"([^\\\\\"]+)\\\\\"',\n      'gi');\n  var matches = regex.exec(cssText);\n  if (matches) {\n    var combinedSelectorText = matches[1];\n    // To aid in later fixing the DOM, we need to split up the possible\n    // selector groups by commas.\n    var groupedSelectors = combinedSelectorText.split(/\\s*\\,\\s*/);\n    for (var i = 0, selector; selector = groupedSelectors[i]; i++) {\n      // Strips off the leading \".\".\n      var combinedClassName = selector.substr(1);\n      var classNames = combinedClassName.split(\n          goog.debug.DevCss.CssToken_.IE6_COMBINED_GLUE);\n      var entry = {\n        classNames: classNames,\n        combinedClassName: combinedClassName,\n        els: []\n      };\n      this.ie6CombinedMatches_.push(entry);\n    }\n    return combinedSelectorText;\n  }\n  return null;\n};\n\n\n/**\n * Adds combined selectors with underscores to make them \"work\" in IE6.\n * @see {this.replaceIe6CombinedSelectors_}\n * @private\n */\ngoog.debug.DevCss.prototype.addIe6CombinedClassNames_ = function() {\n  if (!this.ie6CombinedMatches_.length) {\n    return;\n  }\n  var allEls = document.getElementsByTagName('*');\n  // Match nodes for all classNames.\n  for (var i = 0, classNameEntry; classNameEntry = this.ie6CombinedMatches_[i];\n       i++) {\n    for (var j = 0, el; el = allEls[j]; j++) {\n      var classNamesLength = classNameEntry.classNames.length;\n      for (var k = 0, className; className = classNameEntry.classNames[k];\n           k++) {\n        if (!goog.dom.classlist.contains(el, className)) {\n          break;\n        }\n        if (k == classNamesLength - 1) {\n          classNameEntry.els.push(el);\n        }\n      }\n    }\n    // Walks over our matching nodes and fixes them.\n    if (classNameEntry.els.length) {\n      for (var j = 0, el; el = classNameEntry.els[j]; j++) {\n        goog.asserts.assert(el);\n        if (!goog.dom.classlist.contains(\n                el, classNameEntry.combinedClassName)) {\n          goog.dom.classlist.add(el, classNameEntry.combinedClassName);\n        }\n      }\n    }\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^:;","^9L","^9>","~$goog.userAgent","^:I","~$goog.cssom","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/devcss/devcss.js"],"^:1",["^9K",["~$goog.debug.DevCss.UserAgent","~$goog.debug.DevCss"]],"^9<",true,"^9=",["^9>","^:E","^:T","^:;","^:N","^:I","^9L","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.date.utcdatetime.js","^9C",["^9D","goog/date/utcdatetime.js"],"^9E","goog/date/utcdatetime.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Locale independent date/time class.\n *\n */\n\ngoog.provide('goog.date.UtcDateTime');\n\ngoog.require('goog.date');\ngoog.require('goog.date.Date');\ngoog.require('goog.date.DateTime');\ngoog.require('goog.date.Interval');\n\n\n\n/**\n * Class representing a date/time in GMT+0 time zone, without daylight saving.\n * Defaults to current date and time if none is specified. The get... and the\n * getUTC... methods are equivalent.\n *\n * @param {number|goog.date.DateLike=} opt_year Four digit UTC year or a\n *     date-like object.  If not set, the created object will contain the\n *     date determined by goog.now().\n * @param {number=} opt_month UTC month, 0 = Jan, 11 = Dec.\n * @param {number=} opt_date UTC date of month, 1 - 31.\n * @param {number=} opt_hours UTC hours, 0 - 23.\n * @param {number=} opt_minutes UTC minutes, 0 - 59.\n * @param {number=} opt_seconds UTC seconds, 0 - 59.\n * @param {number=} opt_milliseconds UTC milliseconds, 0 - 999.\n * @constructor\n * @struct\n * @extends {goog.date.DateTime}\n */\ngoog.date.UtcDateTime = function(\n    opt_year, opt_month, opt_date, opt_hours, opt_minutes, opt_seconds,\n    opt_milliseconds) {\n  var timestamp;\n  if (typeof opt_year === 'number') {\n    timestamp = Date.UTC(\n        opt_year, opt_month || 0, opt_date || 1, opt_hours || 0,\n        opt_minutes || 0, opt_seconds || 0, opt_milliseconds || 0);\n  } else {\n    timestamp = opt_year ? opt_year.getTime() : goog.now();\n  }\n  /** @override */\n  this.date = new Date(timestamp);\n};\ngoog.inherits(goog.date.UtcDateTime, goog.date.DateTime);\n\n\n/**\n * @param {number} timestamp Number of milliseconds since Epoch.\n * @return {!goog.date.UtcDateTime}\n */\ngoog.date.UtcDateTime.fromTimestamp = function(timestamp) {\n  var date = new goog.date.UtcDateTime();\n  date.setTime(timestamp);\n  return date;\n};\n\n\n/**\n * Creates a DateTime from a UTC datetime string expressed in ISO 8601 format.\n *\n * @param {string} formatted A date or datetime expressed in ISO 8601 format.\n * @return {goog.date.UtcDateTime} Parsed date or null if parse fails.\n */\ngoog.date.UtcDateTime.fromIsoString = function(formatted) {\n  var ret = new goog.date.UtcDateTime(2000);\n  return goog.date.setIso8601DateTime(ret, formatted) ? ret : null;\n};\n\n\n/**\n * Clones the UtcDateTime object.\n *\n * @return {!goog.date.UtcDateTime} A clone of the datetime object.\n * @override\n */\ngoog.date.UtcDateTime.prototype.clone = function() {\n  var date = new goog.date.UtcDateTime(this.date);\n  date.setFirstDayOfWeek(this.getFirstDayOfWeek());\n  date.setFirstWeekCutOffDay(this.getFirstWeekCutOffDay());\n  return date;\n};\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.add = function(interval) {\n  if (interval.years || interval.months) {\n    var yearsMonths = new goog.date.Interval(interval.years, interval.months);\n    goog.date.Date.prototype.add.call(this, yearsMonths);\n  }\n  var daysAndTimeMillis = 1000 *\n      (interval.seconds +\n       60 * (interval.minutes + 60 * (interval.hours + 24 * interval.days)));\n  this.date = new Date(this.date.getTime() + daysAndTimeMillis);\n};\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.getTimezoneOffset = function() {\n  return 0;\n};\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.getFullYear =\n    goog.date.DateTime.prototype.getUTCFullYear;\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.getMonth =\n    goog.date.DateTime.prototype.getUTCMonth;\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.getDate =\n    goog.date.DateTime.prototype.getUTCDate;\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.getHours =\n    goog.date.DateTime.prototype.getUTCHours;\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.getMinutes =\n    goog.date.DateTime.prototype.getUTCMinutes;\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.getSeconds =\n    goog.date.DateTime.prototype.getUTCSeconds;\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.getMilliseconds =\n    goog.date.DateTime.prototype.getUTCMilliseconds;\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.getDay = goog.date.DateTime.prototype.getUTCDay;\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.setFullYear =\n    goog.date.DateTime.prototype.setUTCFullYear;\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.setMonth =\n    goog.date.DateTime.prototype.setUTCMonth;\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.setDate =\n    goog.date.DateTime.prototype.setUTCDate;\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.setHours =\n    goog.date.DateTime.prototype.setUTCHours;\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.setMinutes =\n    goog.date.DateTime.prototype.setUTCMinutes;\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.setSeconds =\n    goog.date.DateTime.prototype.setUTCSeconds;\n\n\n/** @override */\ngoog.date.UtcDateTime.prototype.setMilliseconds =\n    goog.date.DateTime.prototype.setUTCMilliseconds;\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.date.Interval","~$goog.date.DateTime","~$goog.date.Date","~$goog.date"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/date/utcdatetime.js"],"^:1",["^9K",["~$goog.date.UtcDateTime"]],"^9<",true,"^9=",["^9>","^:Z","^:Y","^:X","^:W"]],["^ ","^9A",[1579837703000],"^9B","goog.i18n.ordinalrules.js","^9C",["^9D","goog/i18n/ordinalrules.js"],"^9E","goog/i18n/ordinalrules.js","^9F","^9G","^9H","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Ordinal rules.\n *\n *\n * File generated from CLDR ver. 35\n *\n * Before check in, this file could have been manually edited. This is to\n * incorporate changes before we could fix CLDR. All manual modification must be\n * documented in this section, and should be removed after those changes land to\n * CLDR.\n */\n\n// clang-format off\n\ngoog.provide('goog.i18n.ordinalRules');\n/**\n * Ordinal pattern keyword\n * @enum {string}\n */\ngoog.i18n.ordinalRules.Keyword = {\n  ZERO: 'zero',\n  ONE: 'one',\n  TWO: 'two',\n  FEW: 'few',\n  MANY: 'many',\n  OTHER: 'other'\n};\n\n\n/**\n * Ordinal selection function.\n *\n * The actual implementation is locale-dependent.\n *\n * @param {number} n The count of items.\n * @param {number=} opt_precision optional, precision.\n * @return {goog.i18n.ordinalRules.Keyword}\n */\ngoog.i18n.ordinalRules.select;\n\n/**\n * Default Ordinal select rule.\n * @param {number} n The count of items.\n * @param {number=} opt_precision optional, precision.\n * @return {goog.i18n.ordinalRules.Keyword} Default value.\n * @private\n */\ngoog.i18n.ordinalRules.defaultSelect_ = function(n, opt_precision) {\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Returns the fractional part of a number (3.1416 => 1416)\n * @param {number} n The count of items.\n * @return {number} The fractional part.\n * @private\n */\ngoog.i18n.ordinalRules.decimals_ = function(n) {\n  const str = n + '';\n  const result = str.indexOf('.');\n  return (result == -1) ? 0 : str.length - result - 1;\n};\n\n/**\n * Calculates v and f as per CLDR plural rules.\n * The short names for parameters / return match the CLDR syntax and UTS #35\n *     (https://unicode.org/reports/tr35/tr35-numbers.html#Plural_rules_syntax)\n * @param {number} n The count of items.\n * @param {number=} opt_precision optional, precision.\n * @return {{v:number, f:number}} The v and f.\n * @private\n */\ngoog.i18n.ordinalRules.get_vf_ = function(n, opt_precision) {\n  const DEFAULT_DIGITS = 3;\n\n  let v;\n  if (undefined === opt_precision) {\n    v = Math.min(goog.i18n.ordinalRules.decimals_(n), DEFAULT_DIGITS);\n  } else {\n    v = opt_precision;\n  }\n\n  const base = Math.pow(10, v);\n  const f = ((n * base) | 0) % base;\n\n  return {v: v, f: f};\n};\n\n/**\n * Calculates w and t as per CLDR plural rules.\n * The short names for parameters / return match the CLDR syntax and UTS #35\n *     (https://unicode.org/reports/tr35/tr35-numbers.html#Plural_rules_syntax)\n * @param {number} v Calculated previously.\n * @param {number} f Calculated previously.\n * @return {{w:number, t:number}} The w and t.\n * @private\n */\ngoog.i18n.ordinalRules.get_wt_ = function(v, f) {\n  if (f === 0) {\n    return {w: 0, t: 0};\n  }\n\n  while ((f % 10) === 0) {\n    f /= 10;\n    v--;\n  }\n\n  return {w: v, t: f};\n};\n\n/**\n * Ordinal select rules for cy locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.cySelect_ = function(n, opt_precision) {\n  if (n == 0 || n == 7 || n == 8 || n == 9) {\n    return goog.i18n.ordinalRules.Keyword.ZERO;\n  }\n  if (n == 1) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  if (n == 2) {\n    return goog.i18n.ordinalRules.Keyword.TWO;\n  }\n  if (n == 3 || n == 4) {\n    return goog.i18n.ordinalRules.Keyword.FEW;\n  }\n  if (n == 5 || n == 6) {\n    return goog.i18n.ordinalRules.Keyword.MANY;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for en locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.enSelect_ = function(n, opt_precision) {\n  if (n % 10 == 1 && n % 100 != 11) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  if (n % 10 == 2 && n % 100 != 12) {\n    return goog.i18n.ordinalRules.Keyword.TWO;\n  }\n  if (n % 10 == 3 && n % 100 != 13) {\n    return goog.i18n.ordinalRules.Keyword.FEW;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for uk locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.ukSelect_ = function(n, opt_precision) {\n  if (n % 10 == 3 && n % 100 != 13) {\n    return goog.i18n.ordinalRules.Keyword.FEW;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for it locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.itSelect_ = function(n, opt_precision) {\n  if (n == 11 || n == 8 || n == 80 || n == 800) {\n    return goog.i18n.ordinalRules.Keyword.MANY;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for ne locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.neSelect_ = function(n, opt_precision) {\n  if (n >= 1 && n <= 4) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for or locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.orSelect_ = function(n, opt_precision) {\n  if (n == 1 || n == 5 || n >= 7 && n <= 9) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  if (n == 2 || n == 3) {\n    return goog.i18n.ordinalRules.Keyword.TWO;\n  }\n  if (n == 4) {\n    return goog.i18n.ordinalRules.Keyword.FEW;\n  }\n  if (n == 6) {\n    return goog.i18n.ordinalRules.Keyword.MANY;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for be locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.beSelect_ = function(n, opt_precision) {\n  if ((n % 10 == 2 || n % 10 == 3) && n % 100 != 12 && n % 100 != 13) {\n    return goog.i18n.ordinalRules.Keyword.FEW;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for az locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.azSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  if ((i % 10 == 1 || i % 10 == 2 || i % 10 == 5 || i % 10 == 7 || i % 10 == 8) || (i % 100 == 20 || i % 100 == 50 || i % 100 == 70 || i % 100 == 80)) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  if ((i % 10 == 3 || i % 10 == 4) || (i % 1000 == 100 || i % 1000 == 200 || i % 1000 == 300 || i % 1000 == 400 || i % 1000 == 500 || i % 1000 == 600 || i % 1000 == 700 || i % 1000 == 800 || i % 1000 == 900)) {\n    return goog.i18n.ordinalRules.Keyword.FEW;\n  }\n  if (i == 0 || i % 10 == 6 || (i % 100 == 40 || i % 100 == 60 || i % 100 == 90)) {\n    return goog.i18n.ordinalRules.Keyword.MANY;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for ka locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.kaSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  if (i == 1) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  if (i == 0 || (i % 100 >= 2 && i % 100 <= 20 || i % 100 == 40 || i % 100 == 60 || i % 100 == 80)) {\n    return goog.i18n.ordinalRules.Keyword.MANY;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for mr locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.mrSelect_ = function(n, opt_precision) {\n  if (n == 1) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  if (n == 2 || n == 3) {\n    return goog.i18n.ordinalRules.Keyword.TWO;\n  }\n  if (n == 4) {\n    return goog.i18n.ordinalRules.Keyword.FEW;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for sv locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.svSelect_ = function(n, opt_precision) {\n  if ((n % 10 == 1 || n % 10 == 2) && n % 100 != 11 && n % 100 != 12) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for kk locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.kkSelect_ = function(n, opt_precision) {\n  if (n % 10 == 6 || n % 10 == 9 || n % 10 == 0 && n != 0) {\n    return goog.i18n.ordinalRules.Keyword.MANY;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for mk locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.mkSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  if (i % 10 == 1 && i % 100 != 11) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  if (i % 10 == 2 && i % 100 != 12) {\n    return goog.i18n.ordinalRules.Keyword.TWO;\n  }\n  if ((i % 10 == 7 || i % 10 == 8) && i % 100 != 17 && i % 100 != 18) {\n    return goog.i18n.ordinalRules.Keyword.MANY;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for hu locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.huSelect_ = function(n, opt_precision) {\n  if (n == 1 || n == 5) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for fr locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.frSelect_ = function(n, opt_precision) {\n  if (n == 1) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for sq locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.sqSelect_ = function(n, opt_precision) {\n  if (n == 1) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  if (n % 10 == 4 && n % 100 != 14) {\n    return goog.i18n.ordinalRules.Keyword.MANY;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for ca locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.caSelect_ = function(n, opt_precision) {\n  if (n == 1 || n == 3) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  if (n == 2) {\n    return goog.i18n.ordinalRules.Keyword.TWO;\n  }\n  if (n == 4) {\n    return goog.i18n.ordinalRules.Keyword.FEW;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for gu locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.guSelect_ = function(n, opt_precision) {\n  if (n == 1) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  if (n == 2 || n == 3) {\n    return goog.i18n.ordinalRules.Keyword.TWO;\n  }\n  if (n == 4) {\n    return goog.i18n.ordinalRules.Keyword.FEW;\n  }\n  if (n == 6) {\n    return goog.i18n.ordinalRules.Keyword.MANY;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for tk locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.tkSelect_ = function(n, opt_precision) {\n  if ((n % 10 == 6 || n % 10 == 9) || n == 10) {\n    return goog.i18n.ordinalRules.Keyword.FEW;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for gd locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.gdSelect_ = function(n, opt_precision) {\n  if (n == 1 || n == 11) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  if (n == 2 || n == 12) {\n    return goog.i18n.ordinalRules.Keyword.TWO;\n  }\n  if (n == 3 || n == 13) {\n    return goog.i18n.ordinalRules.Keyword.FEW;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for kw locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.kwSelect_ = function(n, opt_precision) {\n  if (n >= 1 && n <= 4 || (n % 100 >= 1 && n % 100 <= 4 || n % 100 >= 21 && n % 100 <= 24 || n % 100 >= 41 && n % 100 <= 44 || n % 100 >= 61 && n % 100 <= 64 || n % 100 >= 81 && n % 100 <= 84)) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  if (n == 5 || n % 100 == 5) {\n    return goog.i18n.ordinalRules.Keyword.MANY;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Ordinal select rules for as locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.ordinalRules.Keyword} Locale-specific ordinal value.\n * @private\n */\ngoog.i18n.ordinalRules.asSelect_ = function(n, opt_precision) {\n  if (n == 1 || n == 5 || n == 7 || n == 8 || n == 9 || n == 10) {\n    return goog.i18n.ordinalRules.Keyword.ONE;\n  }\n  if (n == 2 || n == 3) {\n    return goog.i18n.ordinalRules.Keyword.TWO;\n  }\n  if (n == 4) {\n    return goog.i18n.ordinalRules.Keyword.FEW;\n  }\n  if (n == 6) {\n    return goog.i18n.ordinalRules.Keyword.MANY;\n  }\n  return goog.i18n.ordinalRules.Keyword.OTHER;\n};\n\n/**\n * Selected Ordinal rules by locale.\n */\ngoog.i18n.ordinalRules.select = goog.i18n.ordinalRules.enSelect_;\nif (goog.LOCALE == 'af') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'am') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'ar') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'ar_DZ' || goog.LOCALE == 'ar-DZ') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'ar_EG' || goog.LOCALE == 'ar-EG') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'az') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.azSelect_;\n}\nif (goog.LOCALE == 'be') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.beSelect_;\n}\nif (goog.LOCALE == 'bg') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'bn') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.asSelect_;\n}\nif (goog.LOCALE == 'br') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'bs') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'ca') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.caSelect_;\n}\nif (goog.LOCALE == 'chr') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'cs') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'cy') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.cySelect_;\n}\nif (goog.LOCALE == 'da') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'de') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'de_AT' || goog.LOCALE == 'de-AT') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'de_CH' || goog.LOCALE == 'de-CH') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'el') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'en') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.enSelect_;\n}\nif (goog.LOCALE == 'en_AU' || goog.LOCALE == 'en-AU') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.enSelect_;\n}\nif (goog.LOCALE == 'en_CA' || goog.LOCALE == 'en-CA') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.enSelect_;\n}\nif (goog.LOCALE == 'en_GB' || goog.LOCALE == 'en-GB') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.enSelect_;\n}\nif (goog.LOCALE == 'en_IE' || goog.LOCALE == 'en-IE') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.enSelect_;\n}\nif (goog.LOCALE == 'en_IN' || goog.LOCALE == 'en-IN') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.enSelect_;\n}\nif (goog.LOCALE == 'en_SG' || goog.LOCALE == 'en-SG') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.enSelect_;\n}\nif (goog.LOCALE == 'en_US' || goog.LOCALE == 'en-US') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.enSelect_;\n}\nif (goog.LOCALE == 'en_ZA' || goog.LOCALE == 'en-ZA') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.enSelect_;\n}\nif (goog.LOCALE == 'es') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'es_419' || goog.LOCALE == 'es-419') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'es_ES' || goog.LOCALE == 'es-ES') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'es_MX' || goog.LOCALE == 'es-MX') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'es_US' || goog.LOCALE == 'es-US') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'et') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'eu') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'fa') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'fi') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'fil') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.frSelect_;\n}\nif (goog.LOCALE == 'fr') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.frSelect_;\n}\nif (goog.LOCALE == 'fr_CA' || goog.LOCALE == 'fr-CA') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.frSelect_;\n}\nif (goog.LOCALE == 'ga') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.frSelect_;\n}\nif (goog.LOCALE == 'gl') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'gsw') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'gu') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.guSelect_;\n}\nif (goog.LOCALE == 'haw') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'he') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'hi') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.guSelect_;\n}\nif (goog.LOCALE == 'hr') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'hu') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.huSelect_;\n}\nif (goog.LOCALE == 'hy') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.frSelect_;\n}\nif (goog.LOCALE == 'id') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'in') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'is') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'it') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.itSelect_;\n}\nif (goog.LOCALE == 'iw') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'ja') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'ka') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.kaSelect_;\n}\nif (goog.LOCALE == 'kk') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.kkSelect_;\n}\nif (goog.LOCALE == 'km') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'kn') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'ko') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'ky') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'ln') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'lo') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.frSelect_;\n}\nif (goog.LOCALE == 'lt') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'lv') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'mk') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.mkSelect_;\n}\nif (goog.LOCALE == 'ml') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'mn') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'mo') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.frSelect_;\n}\nif (goog.LOCALE == 'mr') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.mrSelect_;\n}\nif (goog.LOCALE == 'ms') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.frSelect_;\n}\nif (goog.LOCALE == 'mt') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'my') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'nb') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'ne') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.neSelect_;\n}\nif (goog.LOCALE == 'nl') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'no') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'no_NO' || goog.LOCALE == 'no-NO') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'or') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.orSelect_;\n}\nif (goog.LOCALE == 'pa') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'pl') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'pt') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'pt_BR' || goog.LOCALE == 'pt-BR') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'pt_PT' || goog.LOCALE == 'pt-PT') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'ro') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.frSelect_;\n}\nif (goog.LOCALE == 'ru') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'sh') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'si') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'sk') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'sl') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'sq') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.sqSelect_;\n}\nif (goog.LOCALE == 'sr') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'sr_Latn' || goog.LOCALE == 'sr-Latn') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'sv') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.svSelect_;\n}\nif (goog.LOCALE == 'sw') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'ta') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'te') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'th') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'tl') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.frSelect_;\n}\nif (goog.LOCALE == 'tr') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'uk') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.ukSelect_;\n}\nif (goog.LOCALE == 'ur') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'uz') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'vi') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.frSelect_;\n}\nif (goog.LOCALE == 'zh') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'zh_CN' || goog.LOCALE == 'zh-CN') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'zh_HK' || goog.LOCALE == 'zh-HK') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'zh_TW' || goog.LOCALE == 'zh-TW') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\nif (goog.LOCALE == 'zu') {\n  goog.i18n.ordinalRules.select = goog.i18n.ordinalRules.defaultSelect_;\n}\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/ordinalrules.js"],"^:1",["^9K",["~$goog.i18n.ordinalRules"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.vec.mat3d.js","^9C",["^9D","goog/vec/mat3d.js"],"^9E","goog/vec/mat3d.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n//                                                                           //\n// Any edits to this file must be applied to mat3f.js by running:            //\n//   swap_type.sh mat3d.js > mat3f.js                                        //\n//                                                                           //\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n\n\n/**\n * @fileoverview Provides functions for operating on 3x3 double (64bit)\n * matrices.  The matrices are stored in column-major order.\n *\n * The last parameter will typically be the output object and an object\n * can be both an input and output parameter to all methods except where\n * noted.\n *\n * See the README for notes about the design and structure of the API\n * (especially related to performance).\n *\n */\ngoog.provide('goog.vec.mat3d');\ngoog.provide('goog.vec.mat3d.Type');\n\ngoog.require('goog.vec');\ngoog.require('goog.vec.vec3d.Type');\n\n\n/** @typedef {!goog.vec.Float64} */ goog.vec.mat3d.Type;\n\n\n/**\n * Creates a mat3d with all elements initialized to zero.\n *\n * @return {!goog.vec.mat3d.Type} The new mat3d.\n */\ngoog.vec.mat3d.create = function() {\n  return new Float64Array(9);\n};\n\n\n/**\n * Creates a mat3d identity matrix.\n *\n * @return {!goog.vec.mat3d.Type} The new mat3d.\n */\ngoog.vec.mat3d.createIdentity = function() {\n  var mat = goog.vec.mat3d.create();\n  mat[0] = mat[4] = mat[8] = 1;\n  return mat;\n};\n\n\n/**\n * Initializes the matrix from the set of values. Note the values supplied are\n * in column major order.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix to receive the\n *     values.\n * @param {number} v00 The values at (0, 0).\n * @param {number} v10 The values at (1, 0).\n * @param {number} v20 The values at (2, 0).\n * @param {number} v01 The values at (0, 1).\n * @param {number} v11 The values at (1, 1).\n * @param {number} v21 The values at (2, 1).\n * @param {number} v02 The values at (0, 2).\n * @param {number} v12 The values at (1, 2).\n * @param {number} v22 The values at (2, 2).\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.setFromValues = function(\n    mat, v00, v10, v20, v01, v11, v21, v02, v12, v22) {\n  mat[0] = v00;\n  mat[1] = v10;\n  mat[2] = v20;\n  mat[3] = v01;\n  mat[4] = v11;\n  mat[5] = v21;\n  mat[6] = v02;\n  mat[7] = v12;\n  mat[8] = v22;\n  return mat;\n};\n\n\n/**\n * Initializes mat3d mat from mat3d src.\n *\n * @param {!goog.vec.mat3d.Type} mat The destination matrix.\n * @param {!goog.vec.mat3d.Type} src The source matrix.\n * @return {!goog.vec.mat3d.Type} Return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.setFromMat3d = function(mat, src) {\n  mat[0] = src[0];\n  mat[1] = src[1];\n  mat[2] = src[2];\n  mat[3] = src[3];\n  mat[4] = src[4];\n  mat[5] = src[5];\n  mat[6] = src[6];\n  mat[7] = src[7];\n  mat[8] = src[8];\n  return mat;\n};\n\n\n/**\n * Initializes mat3d mat from mat3f src (typed as a Float32Array to\n * avoid circular goog.requires).\n *\n * @param {!goog.vec.mat3d.Type} mat The destination matrix.\n * @param {Float32Array} src The source matrix.\n * @return {!goog.vec.mat3d.Type} Return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.setFromMat3f = function(mat, src) {\n  mat[0] = src[0];\n  mat[1] = src[1];\n  mat[2] = src[2];\n  mat[3] = src[3];\n  mat[4] = src[4];\n  mat[5] = src[5];\n  mat[6] = src[6];\n  mat[7] = src[7];\n  mat[8] = src[8];\n  return mat;\n};\n\n\n/**\n * Initializes mat3d mat from Array src.\n *\n * @param {!goog.vec.mat3d.Type} mat The destination matrix.\n * @param {Array<number>} src The source matrix.\n * @return {!goog.vec.mat3d.Type} Return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.setFromArray = function(mat, src) {\n  mat[0] = src[0];\n  mat[1] = src[1];\n  mat[2] = src[2];\n  mat[3] = src[3];\n  mat[4] = src[4];\n  mat[5] = src[5];\n  mat[6] = src[6];\n  mat[7] = src[7];\n  mat[8] = src[8];\n  return mat;\n};\n\n\n/**\n * Retrieves the element at the requested row and column.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix containing the value to\n *     retrieve.\n * @param {number} row The row index.\n * @param {number} column The column index.\n * @return {number} The element value at the requested row, column indices.\n */\ngoog.vec.mat3d.getElement = function(mat, row, column) {\n  return mat[row + column * 3];\n};\n\n\n/**\n * Sets the element at the requested row and column.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix containing the value to\n *     retrieve.\n * @param {number} row The row index.\n * @param {number} column The column index.\n * @param {number} value The value to set at the requested row, column.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.setElement = function(mat, row, column, value) {\n  mat[row + column * 3] = value;\n  return mat;\n};\n\n\n/**\n * Sets the diagonal values of the matrix from the given values.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix to receive the values.\n * @param {number} v00 The values for (0, 0).\n * @param {number} v11 The values for (1, 1).\n * @param {number} v22 The values for (2, 2).\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.setDiagonalValues = function(mat, v00, v11, v22) {\n  mat[0] = v00;\n  mat[4] = v11;\n  mat[8] = v22;\n  return mat;\n};\n\n\n/**\n * Sets the diagonal values of the matrix from the given vector.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix to receive the values.\n * @param {!goog.vec.vec3d.Type} vec The vector containing the values.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.setDiagonal = function(mat, vec) {\n  mat[0] = vec[0];\n  mat[4] = vec[1];\n  mat[8] = vec[2];\n  return mat;\n};\n\n\n/**\n * Sets the specified column with the supplied values.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix to receive the values.\n * @param {number} column The column index to set the values on.\n * @param {number} v0 The value for row 0.\n * @param {number} v1 The value for row 1.\n * @param {number} v2 The value for row 2.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.setColumnValues = function(mat, column, v0, v1, v2) {\n  var i = column * 3;\n  mat[i] = v0;\n  mat[i + 1] = v1;\n  mat[i + 2] = v2;\n  return mat;\n};\n\n\n/**\n * Sets the specified column with the value from the supplied array.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix to receive the values.\n * @param {number} column The column index to set the values on.\n * @param {!goog.vec.vec3d.Type} vec The vector elements for the column.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.setColumn = function(mat, column, vec) {\n  var i = column * 3;\n  mat[i] = vec[0];\n  mat[i + 1] = vec[1];\n  mat[i + 2] = vec[2];\n  return mat;\n};\n\n\n/**\n * Retrieves the specified column from the matrix into the given vector\n * array.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix supplying the values.\n * @param {number} column The column to get the values from.\n * @param {!goog.vec.vec3d.Type} vec The vector elements to receive the\n *     column.\n * @return {!goog.vec.vec3d.Type} return vec so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.getColumn = function(mat, column, vec) {\n  var i = column * 3;\n  vec[0] = mat[i];\n  vec[1] = mat[i + 1];\n  vec[2] = mat[i + 2];\n  return vec;\n};\n\n\n/**\n * Sets the columns of the matrix from the set of vector elements.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix to receive the values.\n * @param {!goog.vec.vec3d.Type} vec0 The values for column 0.\n * @param {!goog.vec.vec3d.Type} vec1 The values for column 1.\n * @param {!goog.vec.vec3d.Type} vec2 The values for column 2.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.setColumns = function(mat, vec0, vec1, vec2) {\n  goog.vec.mat3d.setColumn(mat, 0, vec0);\n  goog.vec.mat3d.setColumn(mat, 1, vec1);\n  goog.vec.mat3d.setColumn(mat, 2, vec2);\n  return /** @type {!goog.vec.mat3d.Type} */ (mat);\n};\n\n\n/**\n * Retrieves the column values from the given matrix into the given vector\n * elements.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix supplying the columns.\n * @param {!goog.vec.vec3d.Type} vec0 The vector to receive column 0.\n * @param {!goog.vec.vec3d.Type} vec1 The vector to receive column 1.\n * @param {!goog.vec.vec3d.Type} vec2 The vector to receive column 2.\n */\ngoog.vec.mat3d.getColumns = function(mat, vec0, vec1, vec2) {\n  goog.vec.mat3d.getColumn(mat, 0, vec0);\n  goog.vec.mat3d.getColumn(mat, 1, vec1);\n  goog.vec.mat3d.getColumn(mat, 2, vec2);\n};\n\n\n/**\n * Sets the row values from the supplied values.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix to receive the values.\n * @param {number} row The index of the row to receive the values.\n * @param {number} v0 The value for column 0.\n * @param {number} v1 The value for column 1.\n * @param {number} v2 The value for column 2.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.setRowValues = function(mat, row, v0, v1, v2) {\n  mat[row] = v0;\n  mat[row + 3] = v1;\n  mat[row + 6] = v2;\n  return mat;\n};\n\n\n/**\n * Sets the row values from the supplied vector.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix to receive the row values.\n * @param {number} row The index of the row.\n * @param {!goog.vec.vec3d.Type} vec The vector containing the values.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.setRow = function(mat, row, vec) {\n  mat[row] = vec[0];\n  mat[row + 3] = vec[1];\n  mat[row + 6] = vec[2];\n  return mat;\n};\n\n\n/**\n * Retrieves the row values into the given vector.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix supplying the values.\n * @param {number} row The index of the row supplying the values.\n * @param {!goog.vec.vec3d.Type} vec The vector to receive the row.\n * @return {!goog.vec.vec3d.Type} return vec so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.getRow = function(mat, row, vec) {\n  vec[0] = mat[row];\n  vec[1] = mat[row + 3];\n  vec[2] = mat[row + 6];\n  return vec;\n};\n\n\n/**\n * Sets the rows of the matrix from the supplied vectors.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix to receive the values.\n * @param {!goog.vec.vec3d.Type} vec0 The values for row 0.\n * @param {!goog.vec.vec3d.Type} vec1 The values for row 1.\n * @param {!goog.vec.vec3d.Type} vec2 The values for row 2.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.setRows = function(mat, vec0, vec1, vec2) {\n  goog.vec.mat3d.setRow(mat, 0, vec0);\n  goog.vec.mat3d.setRow(mat, 1, vec1);\n  goog.vec.mat3d.setRow(mat, 2, vec2);\n  return /** @type {!goog.vec.mat3d.Type} */ (mat);\n};\n\n\n/**\n * Retrieves the rows of the matrix into the supplied vectors.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix to supplying the values.\n * @param {!goog.vec.vec3d.Type} vec0 The vector to receive row 0.\n * @param {!goog.vec.vec3d.Type} vec1 The vector to receive row 1.\n * @param {!goog.vec.vec3d.Type} vec2 The vector to receive row 2.\n */\ngoog.vec.mat3d.getRows = function(mat, vec0, vec1, vec2) {\n  goog.vec.mat3d.getRow(mat, 0, vec0);\n  goog.vec.mat3d.getRow(mat, 1, vec1);\n  goog.vec.mat3d.getRow(mat, 2, vec2);\n};\n\n\n/**\n * Makes the given 3x3 matrix the zero matrix.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix.\n * @return {!goog.vec.mat3d.Type} return mat so operations can be chained.\n */\ngoog.vec.mat3d.makeZero = function(mat) {\n  mat[0] = 0;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = 0;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix the identity matrix.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix.\n * @return {!goog.vec.mat3d.Type} return mat so operations can be chained.\n */\ngoog.vec.mat3d.makeIdentity = function(mat) {\n  mat[0] = 1;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 1;\n  mat[5] = 0;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 1;\n  return mat;\n};\n\n\n/**\n * Performs a per-component addition of the matrices mat0 and mat1, storing\n * the result into resultMat.\n *\n * @param {!goog.vec.mat3d.Type} mat0 The first addend.\n * @param {!goog.vec.mat3d.Type} mat1 The second addend.\n * @param {!goog.vec.mat3d.Type} resultMat The matrix to\n *     receive the results (may be either mat0 or mat1).\n * @return {!goog.vec.mat3d.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.addMat = function(mat0, mat1, resultMat) {\n  resultMat[0] = mat0[0] + mat1[0];\n  resultMat[1] = mat0[1] + mat1[1];\n  resultMat[2] = mat0[2] + mat1[2];\n  resultMat[3] = mat0[3] + mat1[3];\n  resultMat[4] = mat0[4] + mat1[4];\n  resultMat[5] = mat0[5] + mat1[5];\n  resultMat[6] = mat0[6] + mat1[6];\n  resultMat[7] = mat0[7] + mat1[7];\n  resultMat[8] = mat0[8] + mat1[8];\n  return resultMat;\n};\n\n\n/**\n * Performs a per-component subtraction of the matrices mat0 and mat1,\n * storing the result into resultMat.\n *\n * @param {!goog.vec.mat3d.Type} mat0 The minuend.\n * @param {!goog.vec.mat3d.Type} mat1 The subtrahend.\n * @param {!goog.vec.mat3d.Type} resultMat The matrix to receive\n *     the results (may be either mat0 or mat1).\n * @return {!goog.vec.mat3d.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.subMat = function(mat0, mat1, resultMat) {\n  resultMat[0] = mat0[0] - mat1[0];\n  resultMat[1] = mat0[1] - mat1[1];\n  resultMat[2] = mat0[2] - mat1[2];\n  resultMat[3] = mat0[3] - mat1[3];\n  resultMat[4] = mat0[4] - mat1[4];\n  resultMat[5] = mat0[5] - mat1[5];\n  resultMat[6] = mat0[6] - mat1[6];\n  resultMat[7] = mat0[7] - mat1[7];\n  resultMat[8] = mat0[8] - mat1[8];\n  return resultMat;\n};\n\n\n/**\n * Multiplies matrix mat0 with the given scalar, storing the result\n * into resultMat.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix.\n * @param {number} scalar The scalar value to multiple to each element of mat.\n * @param {!goog.vec.mat3d.Type} resultMat The matrix to receive\n *     the results (may be mat).\n * @return {!goog.vec.mat3d.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.multScalar = function(mat, scalar, resultMat) {\n  resultMat[0] = mat[0] * scalar;\n  resultMat[1] = mat[1] * scalar;\n  resultMat[2] = mat[2] * scalar;\n  resultMat[3] = mat[3] * scalar;\n  resultMat[4] = mat[4] * scalar;\n  resultMat[5] = mat[5] * scalar;\n  resultMat[6] = mat[6] * scalar;\n  resultMat[7] = mat[7] * scalar;\n  resultMat[8] = mat[8] * scalar;\n  return resultMat;\n};\n\n\n/**\n * Multiplies the two matrices mat0 and mat1 using matrix multiplication,\n * storing the result into resultMat.\n *\n * @param {!goog.vec.mat3d.Type} mat0 The first (left hand) matrix.\n * @param {!goog.vec.mat3d.Type} mat1 The second (right hand) matrix.\n * @param {!goog.vec.mat3d.Type} resultMat The matrix to receive\n *     the results (may be either mat0 or mat1).\n * @return {!goog.vec.mat3d.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.multMat = function(mat0, mat1, resultMat) {\n  var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2];\n  var a01 = mat0[3], a11 = mat0[4], a21 = mat0[5];\n  var a02 = mat0[6], a12 = mat0[7], a22 = mat0[8];\n\n  var b00 = mat1[0], b10 = mat1[1], b20 = mat1[2];\n  var b01 = mat1[3], b11 = mat1[4], b21 = mat1[5];\n  var b02 = mat1[6], b12 = mat1[7], b22 = mat1[8];\n\n  resultMat[0] = a00 * b00 + a01 * b10 + a02 * b20;\n  resultMat[1] = a10 * b00 + a11 * b10 + a12 * b20;\n  resultMat[2] = a20 * b00 + a21 * b10 + a22 * b20;\n  resultMat[3] = a00 * b01 + a01 * b11 + a02 * b21;\n  resultMat[4] = a10 * b01 + a11 * b11 + a12 * b21;\n  resultMat[5] = a20 * b01 + a21 * b11 + a22 * b21;\n  resultMat[6] = a00 * b02 + a01 * b12 + a02 * b22;\n  resultMat[7] = a10 * b02 + a11 * b12 + a12 * b22;\n  resultMat[8] = a20 * b02 + a21 * b12 + a22 * b22;\n  return resultMat;\n};\n\n\n/**\n * Transposes the given matrix mat storing the result into resultMat.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix to transpose.\n * @param {!goog.vec.mat3d.Type} resultMat The matrix to receive\n *     the results (may be mat).\n * @return {!goog.vec.mat3d.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.transpose = function(mat, resultMat) {\n  if (resultMat == mat) {\n    var a10 = mat[1], a20 = mat[2], a21 = mat[5];\n    resultMat[1] = mat[3];\n    resultMat[2] = mat[6];\n    resultMat[3] = a10;\n    resultMat[5] = mat[7];\n    resultMat[6] = a20;\n    resultMat[7] = a21;\n  } else {\n    resultMat[0] = mat[0];\n    resultMat[1] = mat[3];\n    resultMat[2] = mat[6];\n    resultMat[3] = mat[1];\n    resultMat[4] = mat[4];\n    resultMat[5] = mat[7];\n    resultMat[6] = mat[2];\n    resultMat[7] = mat[5];\n    resultMat[8] = mat[8];\n  }\n  return resultMat;\n};\n\n\n/**\n * Computes the inverse of mat0 storing the result into resultMat. If the\n * inverse is defined, this function returns true, false otherwise.\n *\n * @param {!goog.vec.mat3d.Type} mat0 The matrix to invert.\n * @param {!goog.vec.mat3d.Type} resultMat The matrix to receive\n *     the result (may be mat0).\n * @return {boolean} True if the inverse is defined. If false is returned,\n *     resultMat is not modified.\n */\ngoog.vec.mat3d.invert = function(mat0, resultMat) {\n  var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2];\n  var a01 = mat0[3], a11 = mat0[4], a21 = mat0[5];\n  var a02 = mat0[6], a12 = mat0[7], a22 = mat0[8];\n\n  var t00 = a11 * a22 - a12 * a21;\n  var t10 = a12 * a20 - a10 * a22;\n  var t20 = a10 * a21 - a11 * a20;\n  var det = a00 * t00 + a01 * t10 + a02 * t20;\n  if (det == 0) {\n    return false;\n  }\n\n  var idet = 1 / det;\n  resultMat[0] = t00 * idet;\n  resultMat[3] = (a02 * a21 - a01 * a22) * idet;\n  resultMat[6] = (a01 * a12 - a02 * a11) * idet;\n\n  resultMat[1] = t10 * idet;\n  resultMat[4] = (a00 * a22 - a02 * a20) * idet;\n  resultMat[7] = (a02 * a10 - a00 * a12) * idet;\n\n  resultMat[2] = t20 * idet;\n  resultMat[5] = (a01 * a20 - a00 * a21) * idet;\n  resultMat[8] = (a00 * a11 - a01 * a10) * idet;\n  return true;\n};\n\n\n/**\n * Returns true if the components of mat0 are equal to the components of mat1.\n *\n * @param {!goog.vec.mat3d.Type} mat0 The first matrix.\n * @param {!goog.vec.mat3d.Type} mat1 The second matrix.\n * @return {boolean} True if the the two matrices are equivalent.\n */\ngoog.vec.mat3d.equals = function(mat0, mat1) {\n  return mat0.length == mat1.length && mat0[0] == mat1[0] &&\n      mat0[1] == mat1[1] && mat0[2] == mat1[2] && mat0[3] == mat1[3] &&\n      mat0[4] == mat1[4] && mat0[5] == mat1[5] && mat0[6] == mat1[6] &&\n      mat0[7] == mat1[7] && mat0[8] == mat1[8];\n};\n\n\n/**\n * Transforms the given vector with the given matrix storing the resulting,\n * transformed matrix into resultVec.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix supplying the transformation.\n * @param {!goog.vec.vec3d.Type} vec The vector to transform.\n * @param {!goog.vec.vec3d.Type} resultVec The vector to\n *     receive the results (may be vec).\n * @return {!goog.vec.vec3d.Type} return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.multVec3 = function(mat, vec, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2];\n  resultVec[0] = x * mat[0] + y * mat[3] + z * mat[6];\n  resultVec[1] = x * mat[1] + y * mat[4] + z * mat[7];\n  resultVec[2] = x * mat[2] + y * mat[5] + z * mat[8];\n  return resultVec;\n};\n\n\n/**\n * Makes the given 3x3 matrix a translation matrix with x and y\n * translation values.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix.\n * @param {number} x The translation along the x axis.\n * @param {number} y The translation along the y axis.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3d.makeTranslate = function(mat, x, y) {\n  mat[0] = 1;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 1;\n  mat[5] = 0;\n  mat[6] = x;\n  mat[7] = y;\n  mat[8] = 1;\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix a scale matrix with x, y, and z scale factors.\n *\n * @param {!goog.vec.mat3d.Type} mat The 3x3 (9-element) matrix\n *     array to receive the new scale matrix.\n * @param {number} x The scale along the x axis.\n * @param {number} y The scale along the y axis.\n * @param {number} z The scale along the z axis.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3d.makeScale = function(mat, x, y, z) {\n  mat[0] = x;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = y;\n  mat[5] = 0;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = z;\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix a rotation matrix with the given rotation\n * angle about the axis defined by the vector (ax, ay, az).\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @param {number} ax The x component of the rotation axis.\n * @param {number} ay The y component of the rotation axis.\n * @param {number} az The z component of the rotation axis.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3d.makeRotate = function(mat, angle, ax, ay, az) {\n  var c = Math.cos(angle);\n  var d = 1 - c;\n  var s = Math.sin(angle);\n\n  mat[0] = ax * ax * d + c;\n  mat[1] = ax * ay * d + az * s;\n  mat[2] = ax * az * d - ay * s;\n  mat[3] = ax * ay * d - az * s;\n  mat[4] = ay * ay * d + c;\n  mat[5] = ay * az * d + ax * s;\n  mat[6] = ax * az * d + ay * s;\n  mat[7] = ay * az * d - ax * s;\n  mat[8] = az * az * d + c;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix a rotation matrix with the given rotation\n * angle about the X axis.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3d.makeRotateX = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = 1;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = c;\n  mat[5] = s;\n  mat[6] = 0;\n  mat[7] = -s;\n  mat[8] = c;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix a rotation matrix with the given rotation\n * angle about the Y axis.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3d.makeRotateY = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = c;\n  mat[1] = 0;\n  mat[2] = -s;\n  mat[3] = 0;\n  mat[4] = 1;\n  mat[5] = 0;\n  mat[6] = s;\n  mat[7] = 0;\n  mat[8] = c;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix a rotation matrix with the given rotation\n * angle about the Z axis.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3d.makeRotateZ = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = c;\n  mat[1] = s;\n  mat[2] = 0;\n  mat[3] = -s;\n  mat[4] = c;\n  mat[5] = 0;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 1;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the x,y,z axis.  Equivalent to:\n * goog.vec.mat3d.multMat(\n *     mat,\n *     goog.vec.mat3d.makeRotate(goog.vec.mat3d.create(), angle, x, y, z),\n *     mat);\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @param {number} x The x component of the rotation axis.\n * @param {number} y The y component of the rotation axis.\n * @param {number} z The z component of the rotation axis.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3d.rotate = function(mat, angle, x, y, z) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2];\n  var m01 = mat[3], m11 = mat[4], m21 = mat[5];\n  var m02 = mat[6], m12 = mat[7], m22 = mat[8];\n\n  var cosAngle = Math.cos(angle);\n  var sinAngle = Math.sin(angle);\n  var diffCosAngle = 1 - cosAngle;\n  var r00 = x * x * diffCosAngle + cosAngle;\n  var r10 = x * y * diffCosAngle + z * sinAngle;\n  var r20 = x * z * diffCosAngle - y * sinAngle;\n\n  var r01 = x * y * diffCosAngle - z * sinAngle;\n  var r11 = y * y * diffCosAngle + cosAngle;\n  var r21 = y * z * diffCosAngle + x * sinAngle;\n\n  var r02 = x * z * diffCosAngle + y * sinAngle;\n  var r12 = y * z * diffCosAngle - x * sinAngle;\n  var r22 = z * z * diffCosAngle + cosAngle;\n\n  mat[0] = m00 * r00 + m01 * r10 + m02 * r20;\n  mat[1] = m10 * r00 + m11 * r10 + m12 * r20;\n  mat[2] = m20 * r00 + m21 * r10 + m22 * r20;\n  mat[3] = m00 * r01 + m01 * r11 + m02 * r21;\n  mat[4] = m10 * r01 + m11 * r11 + m12 * r21;\n  mat[5] = m20 * r01 + m21 * r11 + m22 * r21;\n  mat[6] = m00 * r02 + m01 * r12 + m02 * r22;\n  mat[7] = m10 * r02 + m11 * r12 + m12 * r22;\n  mat[8] = m20 * r02 + m21 * r12 + m22 * r22;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the x axis.  Equivalent to:\n * goog.vec.mat3d.multMat(\n *     mat,\n *     goog.vec.mat3d.makeRotateX(goog.vec.mat3d.create(), angle),\n *     mat);\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3d.rotateX = function(mat, angle) {\n  var m01 = mat[3], m11 = mat[4], m21 = mat[5];\n  var m02 = mat[6], m12 = mat[7], m22 = mat[8];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[3] = m01 * c + m02 * s;\n  mat[4] = m11 * c + m12 * s;\n  mat[5] = m21 * c + m22 * s;\n  mat[6] = m01 * -s + m02 * c;\n  mat[7] = m11 * -s + m12 * c;\n  mat[8] = m21 * -s + m22 * c;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the y axis.  Equivalent to:\n * goog.vec.mat3d.multMat(\n *     mat,\n *     goog.vec.mat3d.makeRotateY(goog.vec.mat3d.create(), angle),\n *     mat);\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3d.rotateY = function(mat, angle) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2];\n  var m02 = mat[6], m12 = mat[7], m22 = mat[8];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = m00 * c + m02 * -s;\n  mat[1] = m10 * c + m12 * -s;\n  mat[2] = m20 * c + m22 * -s;\n  mat[6] = m00 * s + m02 * c;\n  mat[7] = m10 * s + m12 * c;\n  mat[8] = m20 * s + m22 * c;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the z axis.  Equivalent to:\n * goog.vec.mat3d.multMat(\n *     mat,\n *     goog.vec.mat3d.makeRotateZ(goog.vec.mat3d.create(), angle),\n *     mat);\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3d.rotateZ = function(mat, angle) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2];\n  var m01 = mat[3], m11 = mat[4], m21 = mat[5];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = m00 * c + m01 * s;\n  mat[1] = m10 * c + m11 * s;\n  mat[2] = m20 * c + m21 * s;\n  mat[3] = m00 * -s + m01 * c;\n  mat[4] = m10 * -s + m11 * c;\n  mat[5] = m20 * -s + m21 * c;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix a rotation matrix given Euler angles using\n * the ZXZ convention.\n * Given the euler angles [theta1, theta2, theta3], the rotation is defined as\n * rotation = rotation_z(theta1) * rotation_x(theta2) * rotation_z(theta3),\n * with theta1 in [0, 2 * pi], theta2 in [0, pi] and theta3 in [0, 2 * pi].\n * rotation_x(theta) means rotation around the X axis of theta radians.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix.\n * @param {number} theta1 The angle of rotation around the Z axis in radians.\n * @param {number} theta2 The angle of rotation around the X axis in radians.\n * @param {number} theta3 The angle of rotation around the Z axis in radians.\n * @return {!goog.vec.mat3d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3d.makeEulerZXZ = function(mat, theta1, theta2, theta3) {\n  var c1 = Math.cos(theta1);\n  var s1 = Math.sin(theta1);\n\n  var c2 = Math.cos(theta2);\n  var s2 = Math.sin(theta2);\n\n  var c3 = Math.cos(theta3);\n  var s3 = Math.sin(theta3);\n\n  mat[0] = c1 * c3 - c2 * s1 * s3;\n  mat[1] = c2 * c1 * s3 + c3 * s1;\n  mat[2] = s3 * s2;\n\n  mat[3] = -c1 * s3 - c3 * c2 * s1;\n  mat[4] = c1 * c2 * c3 - s1 * s3;\n  mat[5] = c3 * s2;\n\n  mat[6] = s2 * s1;\n  mat[7] = -c1 * s2;\n  mat[8] = c2;\n\n  return mat;\n};\n\n\n/**\n * Decomposes a rotation matrix into Euler angles using the ZXZ convention so\n * that rotation = rotation_z(theta1) * rotation_x(theta2) * rotation_z(theta3),\n * with theta1 in [0, 2 * pi], theta2 in [0, pi] and theta3 in [0, 2 * pi].\n * rotation_x(theta) means rotation around the X axis of theta radians.\n *\n * @param {!goog.vec.mat3d.Type} mat The matrix.\n * @param {!goog.vec.vec3d.Type} euler The ZXZ Euler angles in\n *     radians as [theta1, theta2, theta3].\n * @param {boolean=} opt_theta2IsNegative Whether theta2 is in [-pi, 0] instead\n *     of the default [0, pi].\n * @return {!goog.vec.vec3d.Type} return euler so that operations can be\n *     chained together.\n */\ngoog.vec.mat3d.toEulerZXZ = function(mat, euler, opt_theta2IsNegative) {\n  // There is an ambiguity in the sign of sinTheta2 because of the sqrt.\n  var sinTheta2 = Math.sqrt(mat[2] * mat[2] + mat[5] * mat[5]);\n\n  // By default we explicitely constrain theta2 to be in [0, pi],\n  // so sinTheta2 is always positive. We can change the behavior and specify\n  // theta2 to be negative in [-pi, 0] with opt_Theta2IsNegative.\n  var signTheta2 = opt_theta2IsNegative ? -1 : 1;\n\n  if (sinTheta2 > goog.vec.EPSILON) {\n    euler[2] = Math.atan2(mat[2] * signTheta2, mat[5] * signTheta2);\n    euler[1] = Math.atan2(sinTheta2 * signTheta2, mat[8]);\n    euler[0] = Math.atan2(mat[6] * signTheta2, -mat[7] * signTheta2);\n  } else {\n    // There is also an arbitrary choice for theta1 = 0 or theta2 = 0 here.\n    // We assume theta1 = 0 as some applications do not allow the camera to roll\n    // (i.e. have theta1 != 0).\n    euler[0] = 0;\n    euler[1] = Math.atan2(sinTheta2 * signTheta2, mat[8]);\n    euler[2] = Math.atan2(mat[1], mat[0]);\n  }\n\n  // Atan2 outputs angles in [-pi, pi] so we bring them back to [0, 2 * pi].\n  euler[0] = (euler[0] + Math.PI * 2) % (Math.PI * 2);\n  euler[2] = (euler[2] + Math.PI * 2) % (Math.PI * 2);\n  // For theta2 we want the angle to be in [0, pi] or [-pi, 0] depending on\n  // signTheta2.\n  euler[1] =\n      ((euler[1] * signTheta2 + Math.PI * 2) % (Math.PI * 2)) * signTheta2;\n\n  return euler;\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.vec.vec3d.Type","~$goog.vec","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/mat3d.js"],"^:1",["^9K",["~$goog.vec.mat3d","~$goog.vec.mat3d.Type"]],"^9<",true,"^9=",["^9>","^;2","^;1"]],["^ ","^9A",[1579837703000],"^9B","goog.graphics.stroke.js","^9C",["^9D","goog/graphics/stroke.js"],"^9E","goog/graphics/stroke.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Represents a stroke object for goog.graphics.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.graphics.Stroke');\n\n\n\n/**\n * Creates an immutable stroke object.\n *\n * @param {number|string} width The width of the stroke.\n * @param {string} color The color of the stroke.\n * @param {number=} opt_opacity The opacity of the background fill. The value\n *    must be greater than or equal to zero (transparent) and less than or\n *    equal to 1 (opaque).\n * @constructor\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n */\ngoog.graphics.Stroke = function(width, color, opt_opacity) {\n  /**\n   * The width of the stroke.\n   * @type {number|string}\n   * @private\n   */\n  this.width_ = width;\n\n\n  /**\n   * The color with which to fill.\n   * @type {string}\n   * @private\n   */\n  this.color_ = color;\n\n\n  /**\n   * The opacity of the fill.\n   * @type {number}\n   * @private\n   */\n  this.opacity_ = opt_opacity == null ? 1.0 : opt_opacity;\n};\n\n\n/**\n * @return {number|string} The width of this stroke.\n */\ngoog.graphics.Stroke.prototype.getWidth = function() {\n  return this.width_;\n};\n\n\n/**\n * @return {string} The color of this stroke.\n */\ngoog.graphics.Stroke.prototype.getColor = function() {\n  return this.color_;\n};\n\n\n/**\n * @return {number} The opacity of this fill.\n */\ngoog.graphics.Stroke.prototype.getOpacity = function() {\n  return this.opacity_;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/stroke.js"],"^:1",["^9K",["~$goog.graphics.Stroke"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.html.sanitizer.attributewhitelist.js","^9C",["^9D","goog/html/sanitizer/attributewhitelist.js"],"^9E","goog/html/sanitizer/attributewhitelist.js","^9F","^9G","^9H","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Contains the attribute whitelists for use in the Html\n * sanitizer.\n */\n\ngoog.provide('goog.html.sanitizer.AttributeSanitizedWhitelist');\ngoog.provide('goog.html.sanitizer.AttributeWhitelist');\n\n\n/**\n * A whitelist for attributes that are always safe and allowed by default.\n * The sanitizer only applies whitespace trimming to these.\n * @const @dict {boolean}\n */\ngoog.html.sanitizer.AttributeWhitelist = {\n  '* ARIA-CHECKED': true,\n  '* ARIA-COLCOUNT': true,\n  '* ARIA-COLINDEX': true,\n  '* ARIA-DESCRIBEDBY': true,\n  '* ARIA-DISABLED': true,\n  '* ARIA-GOOG-EDITABLE': true,\n  '* ARIA-LABEL': true,\n  '* ARIA-LABELLEDBY': true,\n  '* ARIA-MULTILINE': true,\n  '* ARIA-MULTISELECTABLE': true,\n  '* ARIA-ORIENTATION': true,\n  '* ARIA-PLACEHOLDER': true,\n  '* ARIA-READONLY': true,\n  '* ARIA-REQUIRED': true,\n  '* ARIA-ROLEDESCRIPTION': true,\n  '* ARIA-ROWCOUNT': true,\n  '* ARIA-ROWINDEX': true,\n  '* ARIA-SELECTED': true,\n  '* ABBR': true,\n  '* ACCEPT': true,\n  '* ACCESSKEY': true,\n  '* ALIGN': true,\n  '* ALT': true,\n  '* AUTOCOMPLETE': true,\n  '* AXIS': true,\n  '* BGCOLOR': true,\n  '* BORDER': true,\n  '* CELLPADDING': true,\n  '* CELLSPACING': true,\n  '* CHAROFF': true,\n  '* CHAR': true,\n  '* CHECKED': true,\n  '* CLEAR': true,\n  '* COLOR': true,\n  '* COLSPAN': true,\n  '* COLS': true,\n  '* COMPACT': true,\n  '* COORDS': true,\n  '* DATETIME': true,\n  '* DIR': true,\n  '* DISABLED': true,\n  '* ENCTYPE': true,\n  '* FACE': true,\n  '* FRAME': true,\n  '* HEIGHT': true,\n  '* HREFLANG': true,\n  '* HSPACE': true,\n  '* ISMAP': true,\n  '* LABEL': true,\n  '* LANG': true,\n  '* MAX': true,\n  '* MAXLENGTH': true,\n  '* METHOD': true,\n  '* MULTIPLE': true,\n  '* NOHREF': true,\n  '* NOSHADE': true,\n  '* NOWRAP': true,\n  '* OPEN': true,\n  '* READONLY': true,\n  '* REQUIRED': true,\n  '* REL': true,\n  '* REV': true,\n  '* ROLE': true,\n  '* ROWSPAN': true,\n  '* ROWS': true,\n  '* RULES': true,\n  '* SCOPE': true,\n  '* SELECTED': true,\n  '* SHAPE': true,\n  '* SIZE': true,\n  '* SPAN': true,\n  '* START': true,\n  '* SUMMARY': true,\n  '* TABINDEX': true,\n  '* TITLE': true,\n  '* TYPE': true,\n  '* VALIGN': true,\n  '* VALUE': true,\n  '* VSPACE': true,\n  '* WIDTH': true\n};\n\n/**\n * A whitelist for attributes that are not safe to allow unrestricted, but are\n * made safe by default policies installed by the sanitizer in\n * goog.html.sanitizer.HtmlSanitizer.Builder.prototype.build, and thus allowed\n * by default under these policies.\n * @const @dict {boolean}\n */\ngoog.html.sanitizer.AttributeSanitizedWhitelist = {\n\n  // Attributes which can contain URL fragments\n  '* USEMAP': true,\n  // Attributes which can contain URLs\n  '* ACTION': true,\n  '* CITE': true,\n  '* HREF': true,\n  // Attributes which can cause network requests\n  '* LONGDESC': true,\n  '* SRC': true,\n  'LINK HREF': true,\n  // Prevents clobbering\n  '* FOR': true,\n  '* HEADERS': true,\n  '* NAME': true,\n  // Controls where a window is opened. Prevents tab-nabbing\n  'A TARGET': true,\n\n  // Attributes which could cause UI redressing.\n  '* CLASS': true,\n  '* ID': true,\n\n  // CSS style can cause network requests and XSSs\n  '* STYLE': true\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/sanitizer/attributewhitelist.js"],"^:1",["^9K",["~$goog.html.sanitizer.AttributeSanitizedWhitelist","~$goog.html.sanitizer.AttributeWhitelist"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.events.eventobserver.js","^9C",["^9D","goog/testing/events/eventobserver.js"],"^9E","goog/testing/events/eventobserver.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Event observer.\n *\n * Provides an event observer that holds onto events that it handles.  This\n * can be used in unit testing to verify an event target's events --\n * that the order count, types, etc. are correct.\n *\n * Example usage:\n * <pre>\n * var observer = new goog.testing.events.EventObserver();\n * var widget = new foo.Widget();\n * goog.events.listen(widget, ['select', 'submit'], observer);\n * // Simulate user action of 3 select events and 2 submit events.\n * assertEquals(3, observer.getEvents('select').length);\n * assertEquals(2, observer.getEvents('submit').length);\n * </pre>\n *\n * @author nnaze@google.com (Nathan Naze)\n */\n\ngoog.setTestOnly('goog.testing.events.EventObserver');\ngoog.provide('goog.testing.events.EventObserver');\n\ngoog.require('goog.array');\ngoog.require('goog.events.Event');\n\n\n\n/**\n * Event observer.  Implements a handleEvent interface so it may be used as\n * a listener in listening functions and methods.\n * @see goog.events.listen\n * @see goog.events.EventHandler\n * @constructor\n * @final\n */\ngoog.testing.events.EventObserver = function() {\n\n  /**\n   * A list of events handled by the observer in order of handling, oldest to\n   * newest.\n   * @type {!Array<!goog.events.Event>}\n   * @private\n   */\n  this.events_ = [];\n};\n\n\n/**\n * Handles an event and remembers it.  Event listening functions and methods\n * will call this method when this observer is used as a listener.\n * @see goog.events.listen\n * @see goog.events.EventHandler\n * @param {!goog.events.Event} e Event to handle.\n */\ngoog.testing.events.EventObserver.prototype.handleEvent = function(e) {\n  this.events_.push(e);\n};\n\n\n/**\n * @param {string|!goog.events.EventId=} opt_type If given, only return events\n *     of this type.\n * @return {!Array<!goog.events.Event>} The events handled, oldest to newest.\n */\ngoog.testing.events.EventObserver.prototype.getEvents = function(opt_type) {\n  var events = goog.array.clone(this.events_);\n\n  if (opt_type) {\n    events = goog.array.filter(events, function(event) {\n      return event.type == String(opt_type);\n    });\n  }\n\n  return events;\n};\n\n\n/** Clears the list of events seen by this observer. */\ngoog.testing.events.EventObserver.prototype.clear = function() {\n  this.events_ = [];\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.events.Event","~$goog.array"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/events/eventobserver.js"],"^:1",["^9K",["~$goog.testing.events.EventObserver"]],"^9<",true,"^9=",["^9>","^;9","^;8"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.tablesorter.js","^9C",["^9D","goog/ui/tablesorter.js"],"^9E","goog/ui/tablesorter.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A table sorting decorator.\n *\n * @author robbyw@google.com (Robby Walker)\n * @see ../demos/tablesorter.html\n */\n\ngoog.provide('goog.ui.TableSorter');\ngoog.provide('goog.ui.TableSorter.EventType');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.EventType');\ngoog.require('goog.functions');\ngoog.require('goog.ui.Component');\n\n\n\n/**\n * A table sorter allows for sorting of a table by column.  This component can\n * be used to decorate an already existing TABLE element with sorting\n * features.\n *\n * The TABLE should use a THEAD containing TH elements for the table column\n * headers.\n *\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.Component}\n */\ngoog.ui.TableSorter = function(opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * The current sort header of the table, or null if none.\n   * @type {?HTMLTableCellElement}\n   * @private\n   */\n  this.header_ = null;\n\n  /**\n   * Whether the last sort was in reverse.\n   * @type {boolean}\n   * @private\n   */\n  this.reversed_ = false;\n\n  /**\n   * The default sorting function.\n   * @type {function(*, *) : number}\n   * @private\n   */\n  this.defaultSortFunction_ = goog.ui.TableSorter.numericSort;\n\n  /**\n   * Array of custom sorting functions per colun.\n   * @type {Array<function(*, *) : number>}\n   * @private\n   */\n  this.sortFunctions_ = [];\n};\ngoog.inherits(goog.ui.TableSorter, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.TableSorter);\n\n\n/**\n * Row number (in <thead>) to use for sorting.\n * @type {number}\n * @private\n */\ngoog.ui.TableSorter.prototype.sortableHeaderRowIndex_ = 0;\n\n\n/**\n * Sets the row index (in <thead>) to be used for sorting.\n * By default, the first row (index 0) is used.\n * Must be called before decorate() is called.\n * @param {number} index The row index.\n */\ngoog.ui.TableSorter.prototype.setSortableHeaderRowIndex = function(index) {\n  if (this.isInDocument()) {\n    throw new Error(goog.ui.Component.Error.ALREADY_RENDERED);\n  }\n  this.sortableHeaderRowIndex_ = index;\n};\n\n\n/**\n * Table sorter events.\n * @enum {string}\n */\ngoog.ui.TableSorter.EventType = {\n  BEFORESORT: 'beforesort',\n  SORT: 'sort'\n};\n\n\n/** @override */\ngoog.ui.TableSorter.prototype.canDecorate = function(element) {\n  return element.tagName == goog.dom.TagName.TABLE;\n};\n\n\n/**\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.TableSorter.prototype.enterDocument = function() {\n  goog.ui.TableSorter.superClass_.enterDocument.call(this);\n\n  var table = this.getElement();\n  var headerRow = table.tHead.rows[this.sortableHeaderRowIndex_];\n\n  this.getHandler().listen(headerRow, goog.events.EventType.CLICK, this.sort_);\n};\n\n\n/**\n * @return {number} The current sort column of the table, or -1 if none.\n */\ngoog.ui.TableSorter.prototype.getSortColumn = function() {\n  return this.header_ ? this.header_.cellIndex : -1;\n};\n\n\n/**\n * @return {boolean} Whether the last sort was in reverse.\n */\ngoog.ui.TableSorter.prototype.isSortReversed = function() {\n  return this.reversed_;\n};\n\n\n/**\n * @return {function(*, *) : number} The default sort function to be used by\n *     all columns.\n */\ngoog.ui.TableSorter.prototype.getDefaultSortFunction = function() {\n  return this.defaultSortFunction_;\n};\n\n\n/**\n * Sets the default sort function to be used by all columns.  If not set\n * explicitly, this defaults to numeric sorting.\n * @param {function(*, *) : number} sortFunction The new default sort function.\n */\ngoog.ui.TableSorter.prototype.setDefaultSortFunction = function(sortFunction) {\n  this.defaultSortFunction_ = sortFunction;\n};\n\n\n/**\n * Gets the sort function to be used by the given column.  Returns the default\n * sort function if no sort function is explicitly set for this column.\n * @param {number} column The column index.\n * @return {function(*, *) : number} The sort function used by the column.\n */\ngoog.ui.TableSorter.prototype.getSortFunction = function(column) {\n  return this.sortFunctions_[column] || this.defaultSortFunction_;\n};\n\n\n/**\n * Set the sort function for the given column, overriding the default sort\n * function.\n * @param {number} column The column index.\n * @param {function(*, *) : number} sortFunction The new sort function.\n */\ngoog.ui.TableSorter.prototype.setSortFunction = function(column, sortFunction) {\n  this.sortFunctions_[column] = sortFunction;\n};\n\n\n/**\n * Sort the table contents by the values in the given column.\n * @param {goog.events.BrowserEvent} e The click event.\n * @private\n */\ngoog.ui.TableSorter.prototype.sort_ = function(e) {\n  // Determine what column was clicked.\n  // TODO(robbyw): If this table cell contains another table, this could break.\n  var target = e.target;\n  var th = goog.dom.getAncestorByTagNameAndClass(target, goog.dom.TagName.TH);\n\n  // If the user clicks on the same column, sort it in reverse of what it is\n  // now.  Otherwise, sort forward.\n  var reverse = th == this.header_ ? !this.reversed_ : false;\n\n  // Perform the sort.\n  if (this.dispatchEvent(goog.ui.TableSorter.EventType.BEFORESORT)) {\n    if (this.sort(th.cellIndex, reverse)) {\n      this.dispatchEvent(goog.ui.TableSorter.EventType.SORT);\n    }\n  }\n};\n\n\n/**\n * Sort the table contents by the values in the given column.\n * @param {number} column The column to sort by.\n * @param {boolean=} opt_reverse Whether to sort in reverse.\n * @return {boolean} Whether the sort was executed.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.TableSorter.prototype.sort = function(column, opt_reverse) {\n  var sortFunction = this.getSortFunction(column);\n  if (sortFunction === goog.ui.TableSorter.noSort) {\n    return false;\n  }\n\n  // Remove old header classes.\n  if (this.header_) {\n    goog.dom.classlist.remove(\n        this.header_, this.reversed_ ?\n            goog.getCssName('goog-tablesorter-sorted-reverse') :\n            goog.getCssName('goog-tablesorter-sorted'));\n  }\n\n  // If the user clicks on the same column, sort it in reverse of what it is\n  // now.  Otherwise, sort forward.\n  this.reversed_ = !!opt_reverse;\n  var multiplier = this.reversed_ ? -1 : 1;\n  var cmpFn = function(a, b) {\n    return multiplier * sortFunction(a[0], b[0]) || a[1] - b[1];\n  };\n\n  // Sort all tBodies\n  var table = this.getElement();\n  goog.array.forEach(table.tBodies, function(tBody) {\n    // Collect all of the rows into an array.\n    var values = goog.array.map(tBody.rows, function(row, rowIndex) {\n      return [goog.dom.getTextContent(row.cells[column]), rowIndex, row];\n    });\n\n    goog.array.sort(values, cmpFn);\n\n    // Remove the tBody temporarily since this speeds up the sort on some\n    // browsers.\n    var nextSibling = tBody.nextSibling;\n    table.removeChild(tBody);\n\n    // Sort the rows, using the resulting array.\n    goog.array.forEach(values, function(row) { tBody.appendChild(row[2]); });\n\n    // Reinstate the tBody.\n    table.insertBefore(tBody, nextSibling);\n  });\n\n  // Mark this as the last sorted column.\n  this.header_ = /** @type {!HTMLTableCellElement} */\n      (table.tHead.rows[this.sortableHeaderRowIndex_].cells[column]);\n\n  // Update the header class.\n  goog.dom.classlist.add(\n      this.header_, this.reversed_ ?\n          goog.getCssName('goog-tablesorter-sorted-reverse') :\n          goog.getCssName('goog-tablesorter-sorted'));\n\n  return true;\n};\n\n\n/**\n * Disables sorting on the specified column\n * @param {*} a First sort value.\n * @param {*} b Second sort value.\n * @return {number} Negative if a < b, 0 if a = b, and positive if a > b.\n */\ngoog.ui.TableSorter.noSort = goog.functions.error('no sort');\n\n\n/**\n * A numeric sort function.  NaN values (or values that do not parse as float\n * numbers) compare equal to each other and greater to any other number.\n * @param {*} a First sort value.\n * @param {*} b Second sort value.\n * @return {number} Negative if a < b, 0 if a = b, and positive if a > b.\n */\ngoog.ui.TableSorter.numericSort = function(a, b) {\n  a = parseFloat(a);\n  b = parseFloat(b);\n  // foo == foo is false if and only if foo is NaN.\n  if (a == a) {\n    return b == b ? a - b : -1;\n  } else {\n    return b == b ? 1 : 0;\n  }\n};\n\n\n/**\n * Alphabetic sort function.\n * @param {*} a First sort value.\n * @param {*} b Second sort value.\n * @return {number} Negative if a < b, 0 if a = b, and positive if a > b.\n */\ngoog.ui.TableSorter.alphaSort = goog.array.defaultCompare;\n\n\n/**\n * Returns a function that is the given sort function in reverse.\n * @param {function(*, *) : number} sortFunction The original sort function.\n * @return {function(*, *) : number} A new sort function that reverses the\n *     given sort function.\n */\ngoog.ui.TableSorter.createReverseSort = function(sortFunction) {\n  return function(a, b) { return -1 * sortFunction(a, b); };\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.dom","~$goog.functions","^:;","^:=","^9>","^:I","^;9","~$goog.dom.TagName"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/tablesorter.js"],"^:1",["^9K",["~$goog.ui.TableSorter.EventType","~$goog.ui.TableSorter"]],"^9<",true,"^9=",["^9>","^;9","^;;","^;=","^:;","^:I","^;<","^:="]],["^ ","^9A",[1579837703000],"^9B","goog.graphics.strokeandfillelement.js","^9C",["^9D","goog/graphics/strokeandfillelement.js"],"^9E","goog/graphics/strokeandfillelement.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A thin wrapper around the DOM element for elements with a\n * stroke and fill.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.graphics.StrokeAndFillElement');\n\ngoog.require('goog.graphics.Element');\n\n\n\n/**\n * Interface for a graphics element with a stroke and fill.\n * This is the base interface for ellipse, rectangle and other\n * shape interfaces.\n * You should not construct objects from this constructor. The graphics\n * will return an implementation of this interface for you.\n *\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.AbstractGraphics} graphics The graphics creating\n *     this element.\n * @param {goog.graphics.Stroke?} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill?} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.Element}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n */\ngoog.graphics.StrokeAndFillElement = function(element, graphics, stroke, fill) {\n  goog.graphics.Element.call(this, element, graphics);\n  this.setStroke(stroke);\n  this.setFill(fill);\n};\ngoog.inherits(goog.graphics.StrokeAndFillElement, goog.graphics.Element);\n\n\n/**\n * The latest fill applied to this element.\n * @type {goog.graphics.Fill?}\n * @protected\n */\ngoog.graphics.StrokeAndFillElement.prototype.fill = null;\n\n\n/**\n * The latest stroke applied to this element.\n * @type {goog.graphics.Stroke?}\n * @private\n */\ngoog.graphics.StrokeAndFillElement.prototype.stroke_ = null;\n\n\n/**\n * Sets the fill for this element.\n * @param {goog.graphics.Fill?} fill The fill object.\n */\ngoog.graphics.StrokeAndFillElement.prototype.setFill = function(fill) {\n  this.fill = fill;\n  this.getGraphics().setElementFill(this, fill);\n};\n\n\n/**\n * @return {goog.graphics.Fill?} fill The fill object.\n */\ngoog.graphics.StrokeAndFillElement.prototype.getFill = function() {\n  return this.fill;\n};\n\n\n/**\n * Sets the stroke for this element.\n * @param {goog.graphics.Stroke?} stroke The stroke object.\n */\ngoog.graphics.StrokeAndFillElement.prototype.setStroke = function(stroke) {\n  this.stroke_ = stroke;\n  this.getGraphics().setElementStroke(this, stroke);\n};\n\n\n/**\n * @return {goog.graphics.Stroke?} stroke The stroke object.\n */\ngoog.graphics.StrokeAndFillElement.prototype.getStroke = function() {\n  return this.stroke_;\n};\n\n\n/**\n * Re-strokes the element to react to coordinate size changes.\n */\ngoog.graphics.StrokeAndFillElement.prototype.reapplyStroke = function() {\n  if (this.stroke_) {\n    this.setStroke(this.stroke_);\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.graphics.Element"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/strokeandfillelement.js"],"^:1",["^9K",["~$goog.graphics.StrokeAndFillElement"]],"^9<",true,"^9=",["^9>","^;@"]],["^ ","^9A",[1579837703000],"^9B","goog.editor.plugin.js","^9C",["^9D","goog/editor/plugin.js"],"^9E","goog/editor/plugin.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved.\n\n/**\n * @fileoverview Aliases `goog.editor.PluginImpl`.\n *\n * This is done to create a target for `goog.editor.PluginImpl` that also pulls\n * in `goog.editor.Field` without creating a cycle. Doing so allows downstream\n * targets to depend only on `goog.editor.Plugin` without js_library complaining\n * about unfullfilled forward declarations.\n */\n\ngoog.provide('goog.editor.Plugin');\n\n/** @suppress {extraRequire} This is the whole point. */\ngoog.require('goog.editor.Field');\ngoog.require('goog.editor.PluginImpl');\n\n/**\n * @constructor\n * @extends {goog.editor.PluginImpl}\n */\ngoog.editor.Plugin = goog.editor.PluginImpl;\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.editor.Field","~$goog.editor.PluginImpl"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugin.js"],"^:1",["^9K",["~$goog.editor.Plugin"]],"^9<",true,"^9=",["^9>","^;B","^;C"]],["^ ","^9A",[1579837703000],"^9B","goog.math.integer.js","^9C",["^9D","goog/math/integer.js"],"^9E","goog/math/integer.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines an Integer class for representing (potentially)\n * infinite length two's-complement integer values.\n *\n * For the specific case of 64-bit integers, use goog.math.Long, which is more\n * efficient.\n *\n */\n\ngoog.provide('goog.math.Integer');\n\ngoog.require('goog.reflect');\n\n/**\n * Constructs a two's-complement integer an array containing bits of the\n * integer in 32-bit (signed) pieces, given in little-endian order (i.e.,\n * lowest-order bits in the first piece), and the sign of -1 or 0.\n *\n * See the from* functions below for other convenient ways of constructing\n * Integers.\n *\n * The internal representation of an integer is an array of 32-bit signed\n * pieces, along with a sign (0 or -1) that indicates the contents of all the\n * other 32-bit pieces out to infinity.  We use 32-bit pieces because these are\n * the size of integers on which JavaScript performs bit-operations.  For\n * operations like addition and multiplication, we split each number into 16-bit\n * pieces, which can easily be multiplied within JavaScript's floating-point\n * representation without overflow or change in sign.\n *\n * @struct\n * @constructor\n * @param {Array<number>} bits Array containing the bits of the number.\n * @param {number} sign The sign of the number: -1 for negative and 0 positive.\n * @final\n */\ngoog.math.Integer = function(bits, sign) {\n\n  /**\n   * @type {number}\n   * @private\n   */\n  this.sign_ = sign;\n\n  // Note: using a local variable while initializing the array helps the\n  // compiler understand that assigning to the array is local side-effect and\n  // that enables the entire constructor to be seen as side-effect free.\n  var localBits = [];\n\n  // Copy the 32-bit signed integer values passed in.  We prune out those at the\n  // top that equal the sign since they are redundant.\n  var top = true;\n\n  for (var i = bits.length - 1; i >= 0; i--) {\n    var val = bits[i] | 0;\n    if (!top || val != sign) {\n      localBits[i] = val;\n      top = false;\n    }\n  }\n\n  /**\n   * @type {!Array<number>}\n   * @private\n   * @const\n   */\n  this.bits_ = localBits;\n};\n\n\n// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the\n// from* methods on which they depend.\n\n\n/**\n * A cache of the Integer representations of small integer values.\n * @type {!Object<number, !goog.math.Integer>}\n * @private\n */\ngoog.math.Integer.IntCache_ = {};\n\n\n/**\n * Returns an Integer representing the given (32-bit) integer value.\n * @param {number} value A 32-bit integer value.\n * @return {!goog.math.Integer} The corresponding Integer value.\n */\ngoog.math.Integer.fromInt = function(value) {\n  if (-128 <= value && value < 128) {\n    return goog.reflect.cache(\n        goog.math.Integer.IntCache_, value, function(val) {\n          return new goog.math.Integer([val | 0], val < 0 ? -1 : 0);\n        });\n  }\n  return new goog.math.Integer([value | 0], value < 0 ? -1 : 0);\n};\n\n\n/**\n * Returns an Integer representing the given value, provided that it is a finite\n * number.  Otherwise, zero is returned.\n * @param {number} value The value in question.\n * @return {!goog.math.Integer} The corresponding Integer value.\n */\ngoog.math.Integer.fromNumber = function(value) {\n  if (isNaN(value) || !isFinite(value)) {\n    return goog.math.Integer.ZERO;\n  } else if (value < 0) {\n    return goog.math.Integer.fromNumber(-value).negate();\n  } else {\n    var bits = [];\n    var pow = 1;\n    for (var i = 0; value >= pow; i++) {\n      bits[i] = (value / pow) | 0;\n      pow *= goog.math.Integer.TWO_PWR_32_DBL_;\n    }\n    return new goog.math.Integer(bits, 0);\n  }\n};\n\n\n/**\n * Returns a Integer representing the value that comes by concatenating the\n * given entries, each is assumed to be 32 signed bits, given in little-endian\n * order (lowest order bits in the lowest index), and sign-extending the highest\n * order 32-bit value.\n * @param {Array<number>} bits The bits of the number, in 32-bit signed pieces,\n *     in little-endian order.\n * @return {!goog.math.Integer} The corresponding Integer value.\n */\ngoog.math.Integer.fromBits = function(bits) {\n  var high = bits[bits.length - 1];\n  return new goog.math.Integer(bits, high & (1 << 31) ? -1 : 0);\n};\n\n\n/**\n * Returns an Integer representation of the given string, written using the\n * given radix.\n * @param {string} str The textual representation of the Integer.\n * @param {number=} opt_radix The radix in which the text is written.\n * @return {!goog.math.Integer} The corresponding Integer value.\n */\ngoog.math.Integer.fromString = function(str, opt_radix) {\n  if (str.length == 0) {\n    throw new Error('number format error: empty string');\n  }\n\n  var radix = opt_radix || 10;\n  if (radix < 2 || 36 < radix) {\n    throw new Error('radix out of range: ' + radix);\n  }\n\n  if (str.charAt(0) == '-') {\n    return goog.math.Integer.fromString(str.substring(1), radix).negate();\n  } else if (str.indexOf('-') >= 0) {\n    throw new Error('number format error: interior \"-\" character');\n  }\n\n  // Do several (8) digits each time through the loop, so as to\n  // minimize the calls to the very expensive emulated div.\n  var radixToPower = goog.math.Integer.fromNumber(Math.pow(radix, 8));\n\n  var result = goog.math.Integer.ZERO;\n  for (var i = 0; i < str.length; i += 8) {\n    var size = Math.min(8, str.length - i);\n    var value = parseInt(str.substring(i, i + size), radix);\n    if (size < 8) {\n      var power = goog.math.Integer.fromNumber(Math.pow(radix, size));\n      result = result.multiply(power).add(goog.math.Integer.fromNumber(value));\n    } else {\n      result = result.multiply(radixToPower);\n      result = result.add(goog.math.Integer.fromNumber(value));\n    }\n  }\n  return result;\n};\n\n\n/**\n * A number used repeatedly in calculations.  This must appear before the first\n * call to the from* functions below.\n * @type {number}\n * @private\n */\ngoog.math.Integer.TWO_PWR_32_DBL_ = (1 << 16) * (1 << 16);\n\n\n/**  @type {!goog.math.Integer} */\ngoog.math.Integer.ZERO = goog.math.Integer.fromInt(0);\n\n/**  @type {!goog.math.Integer} */\ngoog.math.Integer.ONE = goog.math.Integer.fromInt(1);\n\n\n/**\n * @const\n * @type {!goog.math.Integer}\n * @private\n */\ngoog.math.Integer.TWO_PWR_24_ = goog.math.Integer.fromInt(1 << 24);\n\n/**\n * Returns the value, assuming it is a 32-bit integer.\n * @return {number} The corresponding int value.\n */\ngoog.math.Integer.prototype.toInt = function() {\n  return this.bits_.length > 0 ? this.bits_[0] : this.sign_;\n};\n\n\n/** @return {number} The closest floating-point representation to this value. */\ngoog.math.Integer.prototype.toNumber = function() {\n  if (this.isNegative()) {\n    return -this.negate().toNumber();\n  } else {\n    var val = 0;\n    var pow = 1;\n    for (var i = 0; i < this.bits_.length; i++) {\n      val += this.getBitsUnsigned(i) * pow;\n      pow *= goog.math.Integer.TWO_PWR_32_DBL_;\n    }\n    return val;\n  }\n};\n\n\n/**\n * @param {number=} opt_radix The radix in which the text should be written.\n * @return {string} The textual representation of this value.\n * @override\n */\ngoog.math.Integer.prototype.toString = function(opt_radix) {\n  var radix = opt_radix || 10;\n  if (radix < 2 || 36 < radix) {\n    throw new Error('radix out of range: ' + radix);\n  }\n\n  if (this.isZero()) {\n    return '0';\n  } else if (this.isNegative()) {\n    return '-' + this.negate().toString(radix);\n  }\n\n  // Do several (6) digits each time through the loop, so as to\n  // minimize the calls to the very expensive emulated div.\n  var radixToPower = goog.math.Integer.fromNumber(Math.pow(radix, 6));\n\n  var rem = this;\n  var result = '';\n  while (true) {\n    var remDiv = rem.divide(radixToPower);\n    // The right shifting fixes negative values in the case when\n    // intval >= 2^31; for more details see\n    // https://github.com/google/closure-library/pull/498\n    var intval = rem.subtract(remDiv.multiply(radixToPower)).toInt() >>> 0;\n    var digits = intval.toString(radix);\n\n    rem = remDiv;\n    if (rem.isZero()) {\n      return digits + result;\n    } else {\n      while (digits.length < 6) {\n        digits = '0' + digits;\n      }\n      result = '' + digits + result;\n    }\n  }\n};\n\n\n/**\n * Returns the index-th 32-bit (signed) piece of the Integer according to\n * little-endian order (i.e., index 0 contains the smallest bits).\n * @param {number} index The index in question.\n * @return {number} The requested 32-bits as a signed number.\n */\ngoog.math.Integer.prototype.getBits = function(index) {\n  if (index < 0) {\n    return 0;  // Allowing this simplifies bit shifting operations below...\n  } else if (index < this.bits_.length) {\n    return this.bits_[index];\n  } else {\n    return this.sign_;\n  }\n};\n\n\n/**\n * Returns the index-th 32-bit piece as an unsigned number.\n * @param {number} index The index in question.\n * @return {number} The requested 32-bits as an unsigned number.\n */\ngoog.math.Integer.prototype.getBitsUnsigned = function(index) {\n  var val = this.getBits(index);\n  return val >= 0 ? val : goog.math.Integer.TWO_PWR_32_DBL_ + val;\n};\n\n\n/** @return {number} The sign bit of this number, -1 or 0. */\ngoog.math.Integer.prototype.getSign = function() {\n  return this.sign_;\n};\n\n\n/** @return {boolean} Whether this value is zero. */\ngoog.math.Integer.prototype.isZero = function() {\n  if (this.sign_ != 0) {\n    return false;\n  }\n  for (var i = 0; i < this.bits_.length; i++) {\n    if (this.bits_[i] != 0) {\n      return false;\n    }\n  }\n  return true;\n};\n\n\n/** @return {boolean} Whether this value is negative. */\ngoog.math.Integer.prototype.isNegative = function() {\n  return this.sign_ == -1;\n};\n\n\n/** @return {boolean} Whether this value is odd. */\ngoog.math.Integer.prototype.isOdd = function() {\n  return (this.bits_.length == 0) && (this.sign_ == -1) ||\n      (this.bits_.length > 0) && ((this.bits_[0] & 1) != 0);\n};\n\n\n/**\n * @param {goog.math.Integer} other Integer to compare against.\n * @return {boolean} Whether this Integer equals the other.\n */\ngoog.math.Integer.prototype.equals = function(other) {\n  if (this.sign_ != other.sign_) {\n    return false;\n  }\n  var len = Math.max(this.bits_.length, other.bits_.length);\n  for (var i = 0; i < len; i++) {\n    if (this.getBits(i) != other.getBits(i)) {\n      return false;\n    }\n  }\n  return true;\n};\n\n\n/**\n * @param {goog.math.Integer} other Integer to compare against.\n * @return {boolean} Whether this Integer does not equal the other.\n */\ngoog.math.Integer.prototype.notEquals = function(other) {\n  return !this.equals(other);\n};\n\n\n/**\n * @param {goog.math.Integer} other Integer to compare against.\n * @return {boolean} Whether this Integer is greater than the other.\n */\ngoog.math.Integer.prototype.greaterThan = function(other) {\n  return this.compare(other) > 0;\n};\n\n\n/**\n * @param {goog.math.Integer} other Integer to compare against.\n * @return {boolean} Whether this Integer is greater than or equal to the other.\n */\ngoog.math.Integer.prototype.greaterThanOrEqual = function(other) {\n  return this.compare(other) >= 0;\n};\n\n\n/**\n * @param {goog.math.Integer} other Integer to compare against.\n * @return {boolean} Whether this Integer is less than the other.\n */\ngoog.math.Integer.prototype.lessThan = function(other) {\n  return this.compare(other) < 0;\n};\n\n\n/**\n * @param {goog.math.Integer} other Integer to compare against.\n * @return {boolean} Whether this Integer is less than or equal to the other.\n */\ngoog.math.Integer.prototype.lessThanOrEqual = function(other) {\n  return this.compare(other) <= 0;\n};\n\n\n/**\n * Compares this Integer with the given one.\n * @param {goog.math.Integer} other Integer to compare against.\n * @return {number} 0 if they are the same, 1 if the this is greater, and -1\n *     if the given one is greater.\n */\ngoog.math.Integer.prototype.compare = function(other) {\n  var diff = this.subtract(other);\n  if (diff.isNegative()) {\n    return -1;\n  } else if (diff.isZero()) {\n    return 0;\n  } else {\n    return +1;\n  }\n};\n\n\n/**\n * Returns an integer with only the first numBits bits of this value, sign\n * extended from the final bit.\n * @param {number} numBits The number of bits by which to shift.\n * @return {!goog.math.Integer} The shorted integer value.\n */\ngoog.math.Integer.prototype.shorten = function(numBits) {\n  var arr_index = (numBits - 1) >> 5;\n  var bit_index = (numBits - 1) % 32;\n  var bits = [];\n  for (var i = 0; i < arr_index; i++) {\n    bits[i] = this.getBits(i);\n  }\n  var sigBits = bit_index == 31 ? 0xFFFFFFFF : (1 << (bit_index + 1)) - 1;\n  var val = this.getBits(arr_index) & sigBits;\n  if (val & (1 << bit_index)) {\n    val |= 0xFFFFFFFF - sigBits;\n    bits[arr_index] = val;\n    return new goog.math.Integer(bits, -1);\n  } else {\n    bits[arr_index] = val;\n    return new goog.math.Integer(bits, 0);\n  }\n};\n\n\n/** @return {!goog.math.Integer} The negation of this value. */\ngoog.math.Integer.prototype.negate = function() {\n  return this.not().add(goog.math.Integer.ONE);\n};\n\n\n/** @return {!goog.math.Integer} The absolute value of this value. */\ngoog.math.Integer.prototype.abs = function() {\n  return this.isNegative() ? this.negate() : this;\n};\n\n\n/**\n * Returns the sum of this and the given Integer.\n * @param {goog.math.Integer} other The Integer to add to this.\n * @return {!goog.math.Integer} The Integer result.\n */\ngoog.math.Integer.prototype.add = function(other) {\n  var len = Math.max(this.bits_.length, other.bits_.length);\n  var arr = [];\n  var carry = 0;\n\n  for (var i = 0; i <= len; i++) {\n    var a1 = this.getBits(i) >>> 16;\n    var a0 = this.getBits(i) & 0xFFFF;\n\n    var b1 = other.getBits(i) >>> 16;\n    var b0 = other.getBits(i) & 0xFFFF;\n\n    var c0 = carry + a0 + b0;\n    var c1 = (c0 >>> 16) + a1 + b1;\n    carry = c1 >>> 16;\n    c0 &= 0xFFFF;\n    c1 &= 0xFFFF;\n    arr[i] = (c1 << 16) | c0;\n  }\n  return goog.math.Integer.fromBits(arr);\n};\n\n\n/**\n * Returns the difference of this and the given Integer.\n * @param {goog.math.Integer} other The Integer to subtract from this.\n * @return {!goog.math.Integer} The Integer result.\n */\ngoog.math.Integer.prototype.subtract = function(other) {\n  return this.add(other.negate());\n};\n\n\n/**\n * Returns the product of this and the given Integer.\n * @param {goog.math.Integer} other The Integer to multiply against this.\n * @return {!goog.math.Integer} The product of this and the other.\n */\ngoog.math.Integer.prototype.multiply = function(other) {\n  if (this.isZero()) {\n    return goog.math.Integer.ZERO;\n  } else if (other.isZero()) {\n    return goog.math.Integer.ZERO;\n  }\n\n  if (this.isNegative()) {\n    if (other.isNegative()) {\n      return this.negate().multiply(other.negate());\n    } else {\n      return this.negate().multiply(other).negate();\n    }\n  } else if (other.isNegative()) {\n    return this.multiply(other.negate()).negate();\n  }\n\n  // If both numbers are small, use float multiplication\n  if (this.lessThan(goog.math.Integer.TWO_PWR_24_) &&\n      other.lessThan(goog.math.Integer.TWO_PWR_24_)) {\n    return goog.math.Integer.fromNumber(this.toNumber() * other.toNumber());\n  }\n\n  // Fill in an array of 16-bit products.\n  var len = this.bits_.length + other.bits_.length;\n  var arr = [];\n  for (var i = 0; i < 2 * len; i++) {\n    arr[i] = 0;\n  }\n  for (var i = 0; i < this.bits_.length; i++) {\n    for (var j = 0; j < other.bits_.length; j++) {\n      var a1 = this.getBits(i) >>> 16;\n      var a0 = this.getBits(i) & 0xFFFF;\n\n      var b1 = other.getBits(j) >>> 16;\n      var b0 = other.getBits(j) & 0xFFFF;\n\n      arr[2 * i + 2 * j] += a0 * b0;\n      goog.math.Integer.carry16_(arr, 2 * i + 2 * j);\n      arr[2 * i + 2 * j + 1] += a1 * b0;\n      goog.math.Integer.carry16_(arr, 2 * i + 2 * j + 1);\n      arr[2 * i + 2 * j + 1] += a0 * b1;\n      goog.math.Integer.carry16_(arr, 2 * i + 2 * j + 1);\n      arr[2 * i + 2 * j + 2] += a1 * b1;\n      goog.math.Integer.carry16_(arr, 2 * i + 2 * j + 2);\n    }\n  }\n\n  // Combine the 16-bit values into 32-bit values.\n  for (var i = 0; i < len; i++) {\n    arr[i] = (arr[2 * i + 1] << 16) | arr[2 * i];\n  }\n  for (var i = len; i < 2 * len; i++) {\n    arr[i] = 0;\n  }\n  return new goog.math.Integer(arr, 0);\n};\n\n\n/**\n * Carries any overflow from the given index into later entries.\n * @param {Array<number>} bits Array of 16-bit values in little-endian order.\n * @param {number} index The index in question.\n * @private\n */\ngoog.math.Integer.carry16_ = function(bits, index) {\n  while ((bits[index] & 0xFFFF) != bits[index]) {\n    bits[index + 1] += bits[index] >>> 16;\n    bits[index] &= 0xFFFF;\n    index++;\n  }\n};\n\n\n/**\n * Returns \"this\" Integer divided by the given one. Both \"this\" and the given\n * Integer MUST be positive.\n *\n * This method is only needed for very large numbers (>10^308),\n * for which the original division algorithm gets into an infinite\n * loop (see https://github.com/google/closure-library/issues/500).\n *\n * The algorithm has some possible performance enhancements (or\n * could be rewritten entirely), it's just an initial solution for\n * the issue linked above.\n *\n * @param {!goog.math.Integer} other The Integer to divide \"this\" by.\n * @return {!goog.math.Integer.DivisionResult}\n * @private\n */\ngoog.math.Integer.prototype.slowDivide_ = function(other) {\n  if (this.isNegative() || other.isNegative()) {\n    throw new Error('slowDivide_ only works with positive integers.');\n  }\n\n  var twoPower = goog.math.Integer.ONE;\n  var multiple = other;\n\n  // First we have to figure out what the highest bit of the result\n  // is, so we increase \"twoPower\" and \"multiple\" until \"multiple\"\n  // exceeds \"this\".\n  while (multiple.lessThanOrEqual(this)) {\n    twoPower = twoPower.shiftLeft(1);\n    multiple = multiple.shiftLeft(1);\n  }\n\n  // Rewind by one power of two, giving us the highest bit of the\n  // result.\n  var res = twoPower.shiftRight(1);\n  var total = multiple.shiftRight(1);\n\n  // Now we starting decreasing \"multiple\" and \"twoPower\" to find the\n  // rest of the bits of the result.\n  var total2;\n  multiple = multiple.shiftRight(2);\n  twoPower = twoPower.shiftRight(2);\n  while (!multiple.isZero()) {\n    // whenever we can add \"multiple\" to the total and not exceed\n    // \"this\", that means we've found a 1 bit. Else we've found a 0\n    // and don't need to add to the result.\n    total2 = total.add(multiple);\n    if (total2.lessThanOrEqual(this)) {\n      res = res.add(twoPower);\n      total = total2;\n    }\n    multiple = multiple.shiftRight(1);\n    twoPower = twoPower.shiftRight(1);\n  }\n\n\n  // TODO(b/130639293): Calculate this more efficiently during the division.\n  // This is kind of a waste since it isn't always needed, but it keeps the\n  // API smooth. Since this is already a slow path it probably isn't a big deal.\n  var remainder = this.subtract(res.multiply(other));\n  return new goog.math.Integer.DivisionResult(res, remainder);\n};\n\n\n/**\n * Returns this Integer divided by the given one.\n * @param {!goog.math.Integer} other The Integer to divide this by.\n * @return {!goog.math.Integer} This value divided by the given one.\n */\ngoog.math.Integer.prototype.divide = function(other) {\n  return this.divideAndRemainder(other).quotient;\n};\n\n\n/**\n * A struct for holding the quotient and remainder of a division.\n *\n * @constructor\n * @final\n * @struct\n *\n * @param {!goog.math.Integer} quotient\n * @param {!goog.math.Integer} remainder\n */\ngoog.math.Integer.DivisionResult = function(quotient, remainder) {\n  /** @const */\n  this.quotient = quotient;\n\n  /** @const */\n  this.remainder = remainder;\n};\n\n\n/**\n * Returns this Integer divided by the given one, as well as the remainder of\n * that division.\n *\n * @param {!goog.math.Integer} other The Integer to divide this by.\n * @return {!goog.math.Integer.DivisionResult}\n */\ngoog.math.Integer.prototype.divideAndRemainder = function(other) {\n  if (other.isZero()) {\n    throw new Error('division by zero');\n  } else if (this.isZero()) {\n    return new goog.math.Integer.DivisionResult(\n        goog.math.Integer.ZERO, goog.math.Integer.ZERO);\n  }\n\n  if (this.isNegative()) {\n    // Do the division on the negative of the numerator...\n    var result = this.negate().divideAndRemainder(other);\n    return new goog.math.Integer.DivisionResult(\n        // ...and flip the sign back after.\n        result.quotient.negate(),\n        // The remainder must always have the same sign as the numerator.\n        result.remainder.negate());\n  } else if (other.isNegative()) {\n    // Do the division on the negative of the denominator...\n    var result = this.divideAndRemainder(other.negate());\n    return new goog.math.Integer.DivisionResult(\n        // ...and flip the sign back after.\n        result.quotient.negate(),\n        // The remainder must always have the same sign as the numerator.\n        result.remainder);\n  }\n\n  // Have to degrade to slowDivide for Very Large Numbers, because\n  // they're out of range for the floating-point approximation\n  // technique used below.\n  if (this.bits_.length > 30) {\n    return this.slowDivide_(other);\n  }\n\n  // Repeat the following until the remainder is less than other:  find a\n  // floating-point that approximates remainder / other *from below*, add this\n  // into the result, and subtract it from the remainder.  It is critical that\n  // the approximate value is less than or equal to the real value so that the\n  // remainder never becomes negative.\n  var res = goog.math.Integer.ZERO;\n  var rem = this;\n  while (rem.greaterThanOrEqual(other)) {\n    // Approximate the result of division. This may be a little greater or\n    // smaller than the actual value.\n    var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));\n\n    // We will tweak the approximate result by changing it in the 48-th digit or\n    // the smallest non-fractional digit, whichever is larger.\n    var log2 = Math.ceil(Math.log(approx) / Math.LN2);\n    var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);\n\n    // Decrease the approximation until it is smaller than the remainder.  Note\n    // that if it is too large, the product overflows and is negative.\n    var approxRes = goog.math.Integer.fromNumber(approx);\n    var approxRem = approxRes.multiply(other);\n    while (approxRem.isNegative() || approxRem.greaterThan(rem)) {\n      approx -= delta;\n      approxRes = goog.math.Integer.fromNumber(approx);\n      approxRem = approxRes.multiply(other);\n    }\n\n    // We know the answer can't be zero... and actually, zero would cause\n    // infinite recursion since we would make no progress.\n    if (approxRes.isZero()) {\n      approxRes = goog.math.Integer.ONE;\n    }\n\n    res = res.add(approxRes);\n    rem = rem.subtract(approxRem);\n  }\n  return new goog.math.Integer.DivisionResult(res, rem);\n};\n\n\n/**\n * Returns this Integer modulo the given one.\n * @param {!goog.math.Integer} other The Integer by which to mod.\n * @return {!goog.math.Integer} This value modulo the given one.\n */\ngoog.math.Integer.prototype.modulo = function(other) {\n  return this.divideAndRemainder(other).remainder;\n};\n\n\n/** @return {!goog.math.Integer} The bitwise-NOT of this value. */\ngoog.math.Integer.prototype.not = function() {\n  var len = this.bits_.length;\n  var arr = [];\n  for (var i = 0; i < len; i++) {\n    arr[i] = ~this.bits_[i];\n  }\n  return new goog.math.Integer(arr, ~this.sign_);\n};\n\n\n/**\n * Returns the bitwise-AND of this Integer and the given one.\n * @param {goog.math.Integer} other The Integer to AND with this.\n * @return {!goog.math.Integer} The bitwise-AND of this and the other.\n */\ngoog.math.Integer.prototype.and = function(other) {\n  var len = Math.max(this.bits_.length, other.bits_.length);\n  var arr = [];\n  for (var i = 0; i < len; i++) {\n    arr[i] = this.getBits(i) & other.getBits(i);\n  }\n  return new goog.math.Integer(arr, this.sign_ & other.sign_);\n};\n\n\n/**\n * Returns the bitwise-OR of this Integer and the given one.\n * @param {goog.math.Integer} other The Integer to OR with this.\n * @return {!goog.math.Integer} The bitwise-OR of this and the other.\n */\ngoog.math.Integer.prototype.or = function(other) {\n  var len = Math.max(this.bits_.length, other.bits_.length);\n  var arr = [];\n  for (var i = 0; i < len; i++) {\n    arr[i] = this.getBits(i) | other.getBits(i);\n  }\n  return new goog.math.Integer(arr, this.sign_ | other.sign_);\n};\n\n\n/**\n * Returns the bitwise-XOR of this Integer and the given one.\n * @param {goog.math.Integer} other The Integer to XOR with this.\n * @return {!goog.math.Integer} The bitwise-XOR of this and the other.\n */\ngoog.math.Integer.prototype.xor = function(other) {\n  var len = Math.max(this.bits_.length, other.bits_.length);\n  var arr = [];\n  for (var i = 0; i < len; i++) {\n    arr[i] = this.getBits(i) ^ other.getBits(i);\n  }\n  return new goog.math.Integer(arr, this.sign_ ^ other.sign_);\n};\n\n\n/**\n * Returns this value with bits shifted to the left by the given amount.\n * @param {number} numBits The number of bits by which to shift.\n * @return {!goog.math.Integer} This shifted to the left by the given amount.\n */\ngoog.math.Integer.prototype.shiftLeft = function(numBits) {\n  var arr_delta = numBits >> 5;\n  var bit_delta = numBits % 32;\n  var len = this.bits_.length + arr_delta + (bit_delta > 0 ? 1 : 0);\n  var arr = [];\n  for (var i = 0; i < len; i++) {\n    if (bit_delta > 0) {\n      arr[i] = (this.getBits(i - arr_delta) << bit_delta) |\n          (this.getBits(i - arr_delta - 1) >>> (32 - bit_delta));\n    } else {\n      arr[i] = this.getBits(i - arr_delta);\n    }\n  }\n  return new goog.math.Integer(arr, this.sign_);\n};\n\n\n/**\n * Returns this value with bits shifted to the right by the given amount.\n * @param {number} numBits The number of bits by which to shift.\n * @return {!goog.math.Integer} This shifted to the right by the given amount.\n */\ngoog.math.Integer.prototype.shiftRight = function(numBits) {\n  var arr_delta = numBits >> 5;\n  var bit_delta = numBits % 32;\n  var len = this.bits_.length - arr_delta;\n  var arr = [];\n  for (var i = 0; i < len; i++) {\n    if (bit_delta > 0) {\n      arr[i] = (this.getBits(i + arr_delta) >>> bit_delta) |\n          (this.getBits(i + arr_delta + 1) << (32 - bit_delta));\n    } else {\n      arr[i] = this.getBits(i + arr_delta);\n    }\n  }\n  return new goog.math.Integer(arr, this.sign_);\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.reflect","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/integer.js"],"^:1",["^9K",["~$goog.math.Integer"]],"^9<",true,"^9=",["^9>","^;E"]],["^ ","^9A",[1579837703000],"^9B","goog.a11y.aria.roles.js","^9C",["^9D","goog/a11y/aria/roles.js"],"^9E","goog/a11y/aria/roles.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview The file contains generated enumerations for ARIA roles\n * as defined by W3C ARIA standard: http://www.w3.org/TR/wai-aria/.\n *\n * This is auto-generated code. Do not manually edit! For more details\n * about how to edit it via the generator check go/closure-ariagen.\n */\n\ngoog.provide('goog.a11y.aria.Role');\n\n\n/**\n * ARIA role values.\n * @enum {string}\n */\ngoog.a11y.aria.Role = {\n  // ARIA role for an alert element that doesn't need to be explicitly closed.\n  ALERT: 'alert',\n\n  // ARIA role for an alert dialog element that takes focus and must be closed.\n  ALERTDIALOG: 'alertdialog',\n\n  // ARIA role for an application that implements its own keyboard navigation.\n  APPLICATION: 'application',\n\n  // ARIA role for an article.\n  ARTICLE: 'article',\n\n  // ARIA role for a banner containing mostly site content, not page content.\n  BANNER: 'banner',\n\n  // ARIA role for a button element.\n  BUTTON: 'button',\n\n  // ARIA role for a checkbox button element; use with the CHECKED state.\n  CHECKBOX: 'checkbox',\n\n  // ARIA role for a column header of a table or grid.\n  COLUMNHEADER: 'columnheader',\n\n  // ARIA role for a combo box element.\n  COMBOBOX: 'combobox',\n\n  // ARIA role for a supporting section of the document.\n  COMPLEMENTARY: 'complementary',\n\n  // ARIA role for a large perceivable region that contains information\n  // about the parent document.\n  CONTENTINFO: 'contentinfo',\n\n  // ARIA role for a definition of a term or concept.\n  DEFINITION: 'definition',\n\n  // ARIA role for a dialog, some descendant must take initial focus.\n  DIALOG: 'dialog',\n\n  // ARIA role for a directory, like a table of contents.\n  DIRECTORY: 'directory',\n\n  // ARIA role for a part of a page that's a document, not a web application.\n  DOCUMENT: 'document',\n\n  // ARIA role for a landmark region logically considered one form.\n  FORM: 'form',\n\n  // ARIA role for an interactive control of tabular data.\n  GRID: 'grid',\n\n  // ARIA role for a cell in a grid.\n  GRIDCELL: 'gridcell',\n\n  // ARIA role for a group of related elements like tree item siblings.\n  GROUP: 'group',\n\n  // ARIA role for a heading element.\n  HEADING: 'heading',\n\n  // ARIA role for a container of elements that together comprise one image.\n  IMG: 'img',\n\n  // ARIA role for a link.\n  LINK: 'link',\n\n  // ARIA role for a list of non-interactive list items.\n  LIST: 'list',\n\n  // ARIA role for a listbox.\n  LISTBOX: 'listbox',\n\n  // ARIA role for a list item.\n  LISTITEM: 'listitem',\n\n  // ARIA role for a live region where new information is added.\n  LOG: 'log',\n\n  // ARIA landmark role for the main content in a document. Use only once.\n  MAIN: 'main',\n\n  // ARIA role for a live region of non-essential information that changes.\n  MARQUEE: 'marquee',\n\n  // ARIA role for a mathematical expression.\n  MATH: 'math',\n\n  // ARIA role for a popup menu.\n  MENU: 'menu',\n\n  // ARIA role for a menubar element containing menu elements.\n  MENUBAR: 'menubar',\n\n  // ARIA role for menu item elements.\n  MENU_ITEM: 'menuitem',\n\n  // ARIA role for a checkbox box element inside a menu.\n  MENU_ITEM_CHECKBOX: 'menuitemcheckbox',\n\n  // ARIA role for a radio button element inside a menu.\n  MENU_ITEM_RADIO: 'menuitemradio',\n\n  // ARIA landmark role for a collection of navigation links.\n  NAVIGATION: 'navigation',\n\n  // ARIA role for a section ancillary to the main content.\n  NOTE: 'note',\n\n  // ARIA role for option items that are  children of combobox, listbox, menu,\n  // radiogroup, or tree elements.\n  OPTION: 'option',\n\n  // ARIA role for ignorable cosmetic elements with no semantic significance.\n  PRESENTATION: 'presentation',\n\n  // ARIA role for a progress bar element.\n  PROGRESSBAR: 'progressbar',\n\n  // ARIA role for a radio button element.\n  RADIO: 'radio',\n\n  // ARIA role for a group of connected radio button elements.\n  RADIOGROUP: 'radiogroup',\n\n  // ARIA role for an important region of the page.\n  REGION: 'region',\n\n  // ARIA role for a row of cells in a grid.\n  ROW: 'row',\n\n  // ARIA role for a group of one or more rows in a grid.\n  ROWGROUP: 'rowgroup',\n\n  // ARIA role for a row header of a table or grid.\n  ROWHEADER: 'rowheader',\n\n  // ARIA role for a scrollbar element.\n  SCROLLBAR: 'scrollbar',\n\n  // ARIA landmark role for a part of the page providing search functionality.\n  SEARCH: 'search',\n\n  // ARIA role for a menu separator.\n  SEPARATOR: 'separator',\n\n  // ARIA role for a slider.\n  SLIDER: 'slider',\n\n  // ARIA role for a spin button.\n  SPINBUTTON: 'spinbutton',\n\n  // ARIA role for a live region with advisory info less severe than an alert.\n  STATUS: 'status',\n\n  // ARIA role for a tab button.\n  TAB: 'tab',\n\n  // ARIA role for a tab bar (i.e. a list of tab buttons).\n  TAB_LIST: 'tablist',\n\n  // ARIA role for a tab page (i.e. the element holding tab contents).\n  TAB_PANEL: 'tabpanel',\n\n  // ARIA role for a textbox element.\n  TEXTBOX: 'textbox',\n\n  // ARIA role for a textinfo element.\n  TEXTINFO: 'textinfo',\n\n  // ARIA role for an element displaying elapsed time or time remaining.\n  TIMER: 'timer',\n\n  // ARIA role for a toolbar element.\n  TOOLBAR: 'toolbar',\n\n  // ARIA role for a tooltip element.\n  TOOLTIP: 'tooltip',\n\n  // ARIA role for a tree.\n  TREE: 'tree',\n\n  // ARIA role for a grid whose rows can be expanded and collapsed like a tree.\n  TREEGRID: 'treegrid',\n\n  // ARIA role for a tree item that sometimes may be expanded or collapsed.\n  TREEITEM: 'treeitem'\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/a11y/aria/roles.js"],"^:1",["^9K",["~$goog.a11y.aria.Role"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.datepickerrenderer.js","^9C",["^9D","goog/ui/datepickerrenderer.js"],"^9E","goog/ui/datepickerrenderer.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The renderer interface for {@link goog.ui.DatePicker}.\n *\n * @see ../demos/datepicker.html\n */\n\ngoog.provide('goog.ui.DatePickerRenderer');\n\n\n\n/**\n * The renderer for {@link goog.ui.DatePicker}. Renders the date picker's\n * navigation header and footer.\n * @interface\n */\ngoog.ui.DatePickerRenderer = function() {};\n\n\n/**\n * Render the navigation row.\n *\n * @param {!Element} row The parent element to render the component into.\n * @param {boolean} simpleNavigation Whether the picker should render a simple\n *     navigation menu that only contains controls for navigating to the next\n *     and previous month. The default navigation menu contains controls for\n *     navigating to the next/previous month, next/previous year, and menus for\n *     jumping to specific months and years.\n * @param {boolean} showWeekNum Whether week numbers should be shown.\n * @param {string} fullDateFormat The full date format.\n *     {@see goog.i18n.DateTimeSymbols}.\n */\ngoog.ui.DatePickerRenderer.prototype.renderNavigationRow = goog.abstractMethod;\n\n\n/**\n * Render the footer row.\n *\n * @param {!Element} row The parent element to render the component into.\n * @param {boolean} showWeekNum Whether week numbers should be shown.\n */\ngoog.ui.DatePickerRenderer.prototype.renderFooterRow = goog.abstractMethod;\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/datepickerrenderer.js"],"^:1",["^9K",["~$goog.ui.DatePickerRenderer"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"~:goog-module",true,"^9B","goog.iter.es6.js","^9C",["^9D","goog/iter/es6.js"],"^9E","goog/iter/es6.js","^9F","^9G","^9H","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Shims between goog.iter.Iterator and ES6 iterator.\n */\n\ngoog.module('goog.iter.es6');\n\nconst GoogIterable = goog.require('goog.iter.Iterable');\nconst GoogIterator = goog.require('goog.iter.Iterator');\nconst StopIteration = goog.require('goog.iter.StopIteration');\n\n\n/**\n * Common interface extending both `goog.iter.Iterable` and ES6 `Iterable`,\n * and providing `toGoog()` and `toEs6()` methods to get either kind\n * of iterator.  `ShimIterable.of()` is the primary entry point for\n * this library.  If it is given an iterable that is *not* also an\n * iterator, then it will inherit any reusability from its argument\n * (i.e. `ShimIterable.of(mySet)` will be reusable, since mySet makes\n * a fresh Iterator every time, whereas `ShimIterable.of(myIterator)`\n * will be one-shot).\n *\n * `ShimGoogIterator` and `ShimEs6Iterator` extend `ShimIterable` and\n * also implement one or the other iterator API.  Since they extend\n * `ShimIterable`, it is easy to convert back and forth between the two\n * APIs.  Any such conversion will expose a view to the same underlying\n * iterator, so elements pulled via one API will not be available from\n * the other.\n *\n * @interface\n * @extends {Iterable<VALUE>}\n * @template VALUE\n */\nclass ShimIterable {\n  /** @return {!GoogIterator<VALUE>} */\n  __iterator__() {}\n\n  /** @return {!ShimGoogIterator<VALUE>} */\n  toGoog() {}\n\n  /** @return {!ShimEs6Iterator<VALUE>} */\n  toEs6() {}\n\n  /**\n   * @param {!Iterable<VALUE>|!Iterator<VALUE>|\n   *         !GoogIterator<VALUE>|!GoogIterable} iter\n   * @return {!ShimIterable}\n   * @template VALUE\n   */\n  static of(iter) {\n    if (iter instanceof ShimIterableImpl || iter instanceof ShimGoogIterator ||\n        iter instanceof ShimEs6Iterator) {\n      return iter;\n    } else if (typeof iter.next == 'function') {\n      return new ShimIterableImpl(\n          () => wrapGoog(/** @type {!Iterator|!GoogIterator} */ (iter)));\n    } else if (typeof iter[Symbol.iterator] == 'function') {\n      return new ShimIterableImpl(() => iter[Symbol.iterator]());\n    } else if (typeof iter.__iterator__ == 'function') {\n      return new ShimIterableImpl(\n          () => wrapGoog(\n              /** @type {{__iterator__:function(this:?, boolean=)}} */ (iter)\n                  .__iterator__()));\n    }\n    throw new Error('Not an iterator or iterable.');\n  }\n}\n\n\n/**\n * @param {!GoogIterator<VALUE>|!Iterator<VALUE>} iter\n * @return {!Iterator<VALUE>}\n * @template VALUE\n */\nconst wrapGoog = (iter) => {\n  if (!(iter instanceof GoogIterator)) return iter;\n  let done = false;\n  return /** @type {?} */ ({\n    next() {\n      let value;\n      while (!done) {\n        try {\n          value = iter.next();\n          break;\n        } catch (err) {\n          if (err !== StopIteration) throw err;\n          done = true;\n        }\n      }\n      return {value, done};\n    },\n  });\n};\n\n\n/**\n * Concrete (private) implementation of a non-iterator iterable.  This is\n * separate from the iterator versions since it supports iterables that\n * are not \"one-shot\".\n * @implements {ShimIterable<VALUE>}\n * @template VALUE\n */\nclass ShimIterableImpl {\n  /** @param {function(): !Iterator<VALUE>} func */\n  constructor(func) {\n    /** @const @private */\n    this.func_ = func;\n  }\n\n  /** @override */\n  __iterator__() {\n    return new ShimGoogIterator(this.func_());\n  }\n\n  /** @override */\n  toGoog() {\n    return new ShimGoogIterator(this.func_());\n  }\n\n  /** @override */\n  [Symbol.iterator]() {\n    return new ShimEs6Iterator(this.func_());\n  }\n\n  /** @override */\n  toEs6() {\n    return new ShimEs6Iterator(this.func_());\n  }\n}\n\n\n/**\n * Concrete `goog.iter.Iterator` subclass that also implements `ShimIterable`.\n * @extends {GoogIterator<VALUE>}\n * @implements {ShimIterable<VALUE>}\n * @template VALUE\n */\nclass ShimGoogIterator extends GoogIterator {\n  /** @param {!Iterator<VALUE>} iter */\n  constructor(iter) {\n    super();\n    this.iter_ = iter;\n  }\n\n  /** @override */\n  __iterator__() {\n    // TODO(sdh): this seems ridiculous, but the compiler complains\n    // that it's not implemented if we don't have it.\n    return super.__iterator__();\n  }\n\n  /** @override */\n  next() {\n    const result = this.iter_.next();\n    if (result.done) throw StopIteration;\n    return result.value;\n  }\n\n  /** @override */\n  toGoog() {\n    return this;\n  }\n\n  /** @override */\n  [Symbol.iterator]() {\n    return new ShimEs6Iterator(this.iter_);\n  }\n\n  /** @override */\n  toEs6() {\n    return new ShimEs6Iterator(this.iter_);\n  }\n}\n\n\n/**\n * Concrete ES6 `Iterator` that also implements `ShimIterable`.\n * @implements {IteratorIterable<VALUE>}\n * @extends {ShimIterableImpl<VALUE>}\n * @template VALUE\n */\nclass ShimEs6Iterator extends ShimIterableImpl {\n  /** @param {!Iterator<VALUE>} iter */\n  constructor(iter) {\n    super(() => iter);\n    /** @const @private */\n    this.iter_ = iter;\n  }\n\n  /** @override */\n  next() {\n    return this.iter_.next();\n  }\n}\n\n\nexports = {\n  ShimIterable,\n  ShimEs6Iterator,\n  ShimGoogIterator,\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.iter.StopIteration","~$goog.iter.Iterator","~$goog.iter.Iterable"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/iter/es6.js"],"^:1",["^9K",["~$goog.iter.es6"]],"^9<",true,"^9=",["^9>","^;L","^;K","^;J"]],["^ ","^9A",[1579837703000],"^9B","goog.debug.errorreporter.js","^9C",["^9D","goog/debug/errorreporter.js"],"^9E","goog/debug/errorreporter.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the ErrorReporter class, which creates an error\n * handler that reports any errors raised to a URL.\n *\n */\n\ngoog.provide('goog.debug.ErrorReporter');\ngoog.provide('goog.debug.ErrorReporter.ExceptionEvent');\n\ngoog.require('goog.asserts');\ngoog.require('goog.debug');\ngoog.require('goog.debug.Error');\ngoog.require('goog.debug.ErrorHandler');\ngoog.require('goog.debug.entryPointRegistry');\ngoog.require('goog.debug.errorcontext');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.log');\ngoog.require('goog.net.XhrIo');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.uri.utils');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Constructs an error reporter. Internal Use Only. To install an error\n * reporter see the {@see #install} method below.\n *\n * @param {string} handlerUrl The URL to which all errors will be reported.\n * @param {function(!Error, !Object<string, string>)=}\n *     opt_contextProvider When a report is to be sent to the server,\n *     this method will be called, and given an opportunity to modify the\n *     context object before submission to the server.\n * @param {boolean=} opt_noAutoProtect Whether to automatically add handlers for\n *     onerror and to protect entry points.  If apps have other error reporting\n *     facilities, it may make sense for them to set these up themselves and use\n *     the ErrorReporter just for transmission of reports.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.debug.ErrorReporter = function(\n    handlerUrl, opt_contextProvider, opt_noAutoProtect) {\n  goog.debug.ErrorReporter.base(this, 'constructor');\n\n  /**\n   * Context provider, if one was provided.\n   * @type {?function(!Error, !Object<string, string>)}\n   * @private\n   */\n  this.contextProvider_ = opt_contextProvider || null;\n\n  /**\n   * The string prefix of any optional context parameters logged with the error.\n   * @private {string}\n   */\n  this.contextPrefix_ = 'context.';\n\n  /**\n   * The number of bytes after which the ErrorReporter truncates the POST body.\n   * If null, the ErrorReporter won't truncate the body.\n   * @private {?number}\n   */\n  this.truncationLimit_ = null;\n\n  /**\n   * Additional arguments to append to URL before sending XHR.\n   * @private {!Object<string,string>}\n   */\n  this.additionalArguments_ = {};\n\n  /**\n   * XHR sender.\n   * @type {function(string, string, string, (Object|goog.structs.Map)=)}\n   * @private\n   */\n  this.xhrSender_ = goog.debug.ErrorReporter.defaultXhrSender;\n\n  /**\n   * The URL at which all errors caught by this handler will be logged.\n   *\n   * @type {string}\n   * @private\n   */\n  this.handlerUrl_ = handlerUrl;\n\n  if (goog.debug.ErrorReporter.ALLOW_AUTO_PROTECT) {\n    if (!opt_noAutoProtect) {\n      /**\n       * The internal error handler used to catch all errors.\n       *\n       * @private {?goog.debug.ErrorHandler}\n       */\n      this.errorHandler_ = null;\n\n      this.setup_();\n    }\n  } else if (!opt_noAutoProtect) {\n    goog.asserts.fail(\n        'opt_noAutoProtect cannot be false while ' +\n        'goog.debug.ErrorReporter.ALLOW_AUTO_PROTECT is false.  Setting ' +\n        'ALLOW_AUTO_PROTECT to false removes the necessary auto-protect code ' +\n        'in compiled/optimized mode.');\n  }\n};\ngoog.inherits(goog.debug.ErrorReporter, goog.events.EventTarget);\n\n\n/**\n * @define {boolean} If true, the code that provides additional entry point\n *     protection and setup is exposed in this file.  Set to false to avoid\n *     bringing in a lot of code from ErrorHandler and entryPointRegistry in\n *     compiled mode.\n */\ngoog.debug.ErrorReporter.ALLOW_AUTO_PROTECT =\n    goog.define('goog.debug.ErrorReporter.ALLOW_AUTO_PROTECT', true);\n\n\n\n/**\n * Event broadcast when an exception is logged.\n * @param {Error} error The exception that was was reported.\n * @param {!Object<string, string>} context The context values sent to the\n *     server alongside this error.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.debug.ErrorReporter.ExceptionEvent = function(error, context) {\n  goog.events.Event.call(this, goog.debug.ErrorReporter.ExceptionEvent.TYPE);\n\n  /**\n   * The error that was reported.\n   * @type {Error}\n   */\n  this.error = error;\n\n  /**\n   * Context values sent to the server alongside this report.\n   * @type {!Object<string, string>}\n   */\n  this.context = context;\n};\ngoog.inherits(goog.debug.ErrorReporter.ExceptionEvent, goog.events.Event);\n\n\n/**\n * Event type for notifying of a logged exception.\n * @type {string}\n */\ngoog.debug.ErrorReporter.ExceptionEvent.TYPE =\n    goog.events.getUniqueId('exception');\n\n\n/**\n * Extra headers for the error-reporting XHR.\n * @type {Object|goog.structs.Map|undefined}\n * @private\n */\ngoog.debug.ErrorReporter.prototype.extraHeaders_;\n\n\n/**\n * Logging object.\n *\n * @type {goog.log.Logger}\n * @private\n */\ngoog.debug.ErrorReporter.logger_ =\n    goog.log.getLogger('goog.debug.ErrorReporter');\n\n\n/**\n * Installs an error reporter to catch all JavaScript errors raised.\n *\n * @param {string} loggingUrl The URL to which the errors caught will be\n *     reported.\n * @param {function(!Error, !Object<string, string>)=}\n *     opt_contextProvider When a report is to be sent to the server,\n *     this method will be called, and given an opportunity to modify the\n *     context object before submission to the server.\n * @param {boolean=} opt_noAutoProtect Whether to automatically add handlers for\n *     onerror and to protect entry points.  If apps have other error reporting\n *     facilities, it may make sense for them to set these up themselves and use\n *     the ErrorReporter just for transmission of reports.\n * @return {!goog.debug.ErrorReporter} The error reporter.\n */\ngoog.debug.ErrorReporter.install = function(\n    loggingUrl, opt_contextProvider, opt_noAutoProtect) {\n  var instance = new goog.debug.ErrorReporter(\n      loggingUrl, opt_contextProvider, opt_noAutoProtect);\n  return instance;\n};\n\n\n/**\n * Default implementation of XHR sender interface.\n *\n * @param {string} uri URI to make request to.\n * @param {string} method Send method.\n * @param {string} content Post data.\n * @param {Object|goog.structs.Map=} opt_headers Map of headers to add to the\n *     request.\n */\ngoog.debug.ErrorReporter.defaultXhrSender = function(\n    uri, method, content, opt_headers) {\n  goog.net.XhrIo.send(uri, null, method, content, opt_headers);\n};\n\n\n/**\n * Installs exception protection for an entry point function in addition\n * to those that are protected by default.\n * Has no effect in IE because window.onerror is used for reporting\n * exceptions in that case.\n *\n * @this {goog.debug.ErrorReporter}\n * @param {Function} fn An entry point function to be protected.\n * @return {Function} A protected wrapper function that calls the entry point\n *     function or null if the entry point could not be protected.\n */\ngoog.debug.ErrorReporter.prototype.protectAdditionalEntryPoint =\n    goog.debug.ErrorReporter.ALLOW_AUTO_PROTECT ? function(fn) {\n      if (this.errorHandler_) {\n        return this.errorHandler_.protectEntryPoint(fn);\n      }\n      return null;\n    } : function(fn) {\n      goog.asserts.fail(\n          'Cannot call protectAdditionalEntryPoint while ALLOW_AUTO_PROTECT ' +\n          'is false.  If ALLOW_AUTO_PROTECT is false, the necessary ' +\n          'auto-protect code in compiled/optimized mode is removed.');\n      return null;\n    };\n\n\nif (goog.debug.ErrorReporter.ALLOW_AUTO_PROTECT) {\n  /**\n   * Sets up the error reporter.\n   *\n   * @private\n   */\n  goog.debug.ErrorReporter.prototype.setup_ = function() {\n    if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('10')) {\n      // Use \"onerror\" because caught exceptions in IE don't provide line\n      // number.\n      goog.debug.catchErrors(\n          goog.bind(this.handleException, this), false, null);\n    } else {\n      // \"onerror\" doesn't work with FF2 or Chrome\n      this.errorHandler_ =\n          new goog.debug.ErrorHandler(goog.bind(this.handleException, this));\n\n      this.errorHandler_.protectWindowSetTimeout();\n      this.errorHandler_.protectWindowSetInterval();\n      this.errorHandler_.protectWindowRequestAnimationFrame();\n      goog.debug.entryPointRegistry.monitorAll(this.errorHandler_);\n    }\n  };\n}\n\n\n/**\n * Add headers to the logging url.\n * @param {Object|goog.structs.Map} loggingHeaders Extra headers to send\n *     to the logging URL.\n */\ngoog.debug.ErrorReporter.prototype.setLoggingHeaders = function(\n    loggingHeaders) {\n  this.extraHeaders_ = loggingHeaders;\n};\n\n\n/**\n * Set the function used to send error reports to the server.\n * @param {function(string, string, string, (Object|goog.structs.Map)=)}\n *     xhrSender If provided, this will be used to send a report to the\n *     server instead of the default method. The function will be given the URI,\n *     HTTP method request content, and (optionally) request headers to be\n *     added.\n */\ngoog.debug.ErrorReporter.prototype.setXhrSender = function(xhrSender) {\n  this.xhrSender_ = xhrSender;\n};\n\n\n/**\n * Handler for caught exceptions. Sends report to the LoggingServlet and\n * notifies any listeners.\n *\n * @param {Object} e The exception.\n * @param {!Object<string, string>=} opt_context Context values to optionally\n *     include in the error report.\n * @suppress {strictMissingProperties} error is not defined on Object\n */\ngoog.debug.ErrorReporter.prototype.handleException = function(e, opt_context) {\n  // goog.debug.catchErrors passes the actual error object (in some browsers) in\n  // the error property. If we have that, use that instead of the incomplete set\n  // of random properties passed to window.onerror.\n  e = e.error || e;\n  // Construct the context, possibly from the one provided in the argument, and\n  // pass it to the context provider if there is one.\n  var context = opt_context ? goog.object.clone(opt_context) : {};\n  if (e instanceof Error) {\n    goog.object.extend(\n        context,\n        goog.debug.errorcontext.getErrorContext(/** @type {!Error} */ (e)));\n  }\n\n  var error = /** @type {!Error} */ (goog.debug.normalizeErrorObject(e));\n\n  if (this.contextProvider_) {\n    try {\n      this.contextProvider_(error, context);\n    } catch (err) {\n      goog.log.error(\n          goog.debug.ErrorReporter.logger_,\n          'Context provider threw an exception: ' + err.message);\n    }\n  }\n  // Truncate message to a reasonable length, since it will be sent in the URL.\n  // The entire URL length historically needed to be 2,083 or less, so leave\n  // some room for the rest of the URL.\n  var message = error.message.substring(0, 1900);\n  if (!(e instanceof goog.debug.Error) || e.reportErrorToServer) {\n    this.sendErrorReport(\n        message, error.fileName, error.lineNumber, error.stack, context);\n  }\n\n  try {\n    this.dispatchEvent(\n        new goog.debug.ErrorReporter.ExceptionEvent(error, context));\n  } catch (ex) {\n    // Swallow exception to avoid infinite recursion.\n  }\n};\n\n\n/**\n * Sends an error report to the logging URL.  This will not consult the context\n * provider, the report will be sent exactly as specified.\n *\n * @param {string} message Error description.\n * @param {string} fileName URL of the JavaScript file with the error.\n * @param {number} line Line number of the error.\n * @param {string=} opt_trace Call stack trace of the error.\n * @param {!Object<string, string>=} opt_context Context information to include\n *     in the request.\n */\ngoog.debug.ErrorReporter.prototype.sendErrorReport = function(\n    message, fileName, line, opt_trace, opt_context) {\n  try {\n    // Create the logging URL.\n    var requestUrl = goog.uri.utils.appendParams(\n        this.handlerUrl_, 'script', fileName, 'error', message, 'line', line);\n\n    if (!goog.object.isEmpty(this.additionalArguments_)) {\n      requestUrl = goog.uri.utils.appendParamsFromMap(\n          requestUrl, this.additionalArguments_);\n    }\n\n    var queryMap = {};\n    queryMap['trace'] = opt_trace;\n\n    // Copy context into query data map\n    if (opt_context) {\n      for (var entry in opt_context) {\n        queryMap[this.contextPrefix_ + entry] = opt_context[entry];\n      }\n    }\n\n    // Copy query data map into request.\n    var queryData = goog.uri.utils.buildQueryDataFromMap(queryMap);\n\n    // Truncate if truncationLimit set.\n    if (typeof this.truncationLimit_ === 'number') {\n      queryData = queryData.substring(0, this.truncationLimit_);\n    }\n\n    // Send the request with the contents of the error.\n    this.xhrSender_(requestUrl, 'POST', queryData, this.extraHeaders_);\n  } catch (e) {\n    var logMessage = goog.string.buildString(\n        'Error occurred in sending an error report.\\n\\n', 'script:', fileName,\n        '\\n', 'line:', line, '\\n', 'error:', message, '\\n', 'trace:',\n        opt_trace);\n    goog.log.info(goog.debug.ErrorReporter.logger_, logMessage);\n  }\n};\n\n\n/**\n * @param {string} prefix The prefix to appear prepended to all context\n *     variables in the error report body.\n */\ngoog.debug.ErrorReporter.prototype.setContextPrefix = function(prefix) {\n  this.contextPrefix_ = prefix;\n};\n\n\n/**\n * @param {?number} limit Size in bytes to begin truncating POST body.  Set to\n *     null to prevent truncation.  The limit must be >= 0.\n */\ngoog.debug.ErrorReporter.prototype.setTruncationLimit = function(limit) {\n  goog.asserts.assert(\n      typeof limit !== 'number' || limit >= 0,\n      'Body limit must be valid number >= 0 or null');\n  this.truncationLimit_ = limit;\n};\n\n\n/**\n * @param {!Object<string,string>} urlArgs Set of key-value pairs to append\n *     to handlerUrl_ before sending XHR.\n */\ngoog.debug.ErrorReporter.prototype.setAdditionalArguments = function(urlArgs) {\n  this.additionalArguments_ = urlArgs;\n};\n\n\n/** @override */\ngoog.debug.ErrorReporter.prototype.disposeInternal = function() {\n  if (goog.debug.ErrorReporter.ALLOW_AUTO_PROTECT) {\n    goog.dispose(this.errorHandler_);\n  }\n  goog.debug.ErrorReporter.base(this, 'disposeInternal');\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.net.XhrIo","~$goog.uri.utils","^9L","^9>","~$goog.object","^:L","^:S","~$goog.log","~$goog.debug.Error","~$goog.debug.errorcontext","~$goog.debug","~$goog.debug.entryPointRegistry","^;8","^:N","~$goog.debug.ErrorHandler"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/errorreporter.js"],"^:1",["^9K",["~$goog.debug.ErrorReporter.ExceptionEvent","~$goog.debug.ErrorReporter"]],"^9<",true,"^9=",["^9>","^:E","^;T","^;R","^;V","^;U","^;S","^:N","^;8","^:L","^;Q","^;N","^;P","^9L","^;O","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.labs.format.csv.js","^9C",["^9D","goog/labs/format/csv.js"],"^9E","goog/labs/format/csv.js","^9F","^9G","^9H","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a parser that turns a string of well-formed CSV data\n * into an array of objects or an array of arrays. All values are returned as\n * strings; the user has to convert data into numbers or Dates as required.\n * Empty fields (adjacent commas) are returned as empty strings.\n *\n * This parser uses http://tools.ietf.org/html/rfc4180 as the definition of CSV.\n *\n * @author nnaze@google.com (Nathan Naze) Ported to Closure\n */\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.labs.format.csv');\ngoog.provide('goog.labs.format.csv.ParseError');\ngoog.provide('goog.labs.format.csv.Token');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.debug.Error');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.string.newlines');\n\n\n/**\n * @define {boolean} Enable verbose debugging. This is a flag so it can be\n * enabled in production if necessary post-compilation.  Otherwise, debug\n * information will be stripped to minimize final code size.\n */\ngoog.labs.format.csv.ENABLE_VERBOSE_DEBUGGING = goog.DEBUG;\n\n\n\n/**\n * Error thrown when parsing fails.\n *\n * @param {string} text The CSV source text being parsed.\n * @param {number} index The index, in the string, of the position of the\n *      error.\n * @param {string=} opt_message A description of the violated parse expectation.\n * @constructor\n * @extends {goog.debug.Error}\n * @final\n */\ngoog.labs.format.csv.ParseError = function(text, index, opt_message) {\n\n  var message;\n\n  /**\n   * @type {?{line: number, column: number}} The line and column of the parse\n   *     error.\n   */\n  this.position = null;\n\n  if (goog.labs.format.csv.ENABLE_VERBOSE_DEBUGGING) {\n    message = opt_message || '';\n\n    var info = goog.labs.format.csv.ParseError.findLineInfo_(text, index);\n    if (info) {\n      var lineNumber = info.lineIndex + 1;\n      var columnNumber = index - info.line.startLineIndex + 1;\n\n      this.position = {line: lineNumber, column: columnNumber};\n\n      message +=\n          goog.string.subs(' at line %s column %s', lineNumber, columnNumber);\n      message += '\\n' +\n          goog.labs.format.csv.ParseError.getLineDebugString_(\n              info.line.getContent(), columnNumber);\n    }\n  }\n\n  goog.labs.format.csv.ParseError.base(this, 'constructor', message);\n};\ngoog.inherits(goog.labs.format.csv.ParseError, goog.debug.Error);\n\n\n/** @inheritDoc */\ngoog.labs.format.csv.ParseError.prototype.name = 'ParseError';\n\n\n/**\n * Calculate the line and column for an index in a string.\n * TODO(nnaze): Consider moving to goog.string.newlines.\n * @param {string} str A string.\n * @param {number} index An index into the string.\n * @return {?{line: !goog.string.newlines.Line, lineIndex: number}} The line\n *     and index of the line.\n * @private\n */\ngoog.labs.format.csv.ParseError.findLineInfo_ = function(str, index) {\n  var lines = goog.string.newlines.getLines(str);\n  var lineIndex = goog.array.findIndex(lines, function(line) {\n    return line.startLineIndex <= index && line.endLineIndex > index;\n  });\n\n  if (typeof (lineIndex) === 'number') {\n    var line = lines[lineIndex];\n    return {line: line, lineIndex: lineIndex};\n  }\n\n  return null;\n};\n\n\n/**\n * Get a debug string of a line and a pointing caret beneath it.\n * @param {string} str The string.\n * @param {number} column The column to point at (1-indexed).\n * @return {string} The debug line.\n * @private\n */\ngoog.labs.format.csv.ParseError.getLineDebugString_ = function(str, column) {\n  var returnString = str + '\\n';\n  returnString += goog.string.repeat(' ', column - 1) + '^';\n  return returnString;\n};\n\n\n/**\n * A token -- a single-character string or a sentinel.\n * @typedef {string|!goog.labs.format.csv.Sentinels_}\n */\ngoog.labs.format.csv.Token;\n\n\n/**\n * Parses a CSV string to create a two-dimensional array.\n *\n * This function does not process header lines, etc -- such transformations can\n * be made on the resulting array.\n *\n * @param {string} text The entire CSV text to be parsed.\n * @param {boolean=} opt_ignoreErrors Whether to ignore parsing errors and\n *      instead try to recover and keep going.\n * @param {string=} opt_delimiter The delimiter to use. Defaults to ','\n * @return {!Array<!Array<string>>} The parsed CSV.\n */\ngoog.labs.format.csv.parse = function(text, opt_ignoreErrors, opt_delimiter) {\n\n  var index = 0;  // current char offset being considered\n\n  var delimiter = opt_delimiter || ',';\n  goog.asserts.assert(\n      delimiter.length == 1, 'Delimiter must be a single character.');\n  goog.asserts.assert(\n      delimiter != '\\r' && opt_delimiter != '\\n',\n      'Cannot use newline or carriage return has delimiter.');\n\n  var EOF = goog.labs.format.csv.Sentinels_.EOF;\n  var EOR = goog.labs.format.csv.Sentinels_.EOR;\n  var NEWLINE = goog.labs.format.csv.Sentinels_.NEWLINE;  // \\r?\\n\n  var EMPTY = goog.labs.format.csv.Sentinels_.EMPTY;\n\n  var pushBackToken = null;  // A single-token pushback.\n  var sawComma = false;      // Special case for terminal comma.\n\n  /**\n   * Push a single token into the push-back variable.\n   * @param {goog.labs.format.csv.Token} t Single token.\n   */\n  function pushBack(t) {\n    goog.labs.format.csv.assertToken_(t);\n    goog.asserts.assert(pushBackToken === null);\n    pushBackToken = t;\n  }\n\n  /**\n   * @return {goog.labs.format.csv.Token} The next token in the stream.\n   */\n  function nextToken() {\n    // Give the push back token if present.\n    if (pushBackToken != null) {\n      var c = pushBackToken;\n      pushBackToken = null;\n      return c;\n    }\n\n    // We're done. EOF.\n    if (index >= text.length) {\n      return EOF;\n    }\n\n    // Give the next charater.\n    var chr = text.charAt(index++);\n    goog.labs.format.csv.assertToken_(chr);\n\n    // Check if this is a newline.  If so, give the new line sentinel.\n    var isNewline = false;\n    if (chr == '\\n') {\n      isNewline = true;\n    } else if (chr == '\\r') {\n      // This is a '\\r\\n' newline. Treat as single token, go\n      // forward two indicies.\n      if (index < text.length && text.charAt(index) == '\\n') {\n        index++;\n      }\n\n      isNewline = true;\n    }\n\n    if (isNewline) {\n      return NEWLINE;\n    }\n\n    return chr;\n  }\n\n  /**\n   * Read a quoted field from input.\n   * @return {string} The field, as a string.\n   */\n  function readQuotedField() {\n    // We've already consumed the first quote by the time we get here.\n    var start = index;\n    var end = null;\n\n    for (var token = nextToken(); token != EOF; token = nextToken()) {\n      if (token == '\"') {\n        end = index - 1;\n        token = nextToken();\n\n        // Two double quotes in a row.  Keep scanning.\n        if (token == '\"') {\n          end = null;\n          continue;\n        }\n\n        // End of field.  Break out.\n        if (token == delimiter || token == EOF || token == NEWLINE) {\n          if (token == NEWLINE) {\n            pushBack(token);\n          }\n          if (token == delimiter) {\n            sawComma = true;\n          }\n          break;\n        }\n\n        if (!opt_ignoreErrors) {\n          // Ignoring errors here means keep going in current field after\n          // closing quote. E.g. \"ab\"c,d splits into abc,d\n          throw new goog.labs.format.csv.ParseError(\n              text, index - 1,\n              'Unexpected character \"' + token + '\" after quote mark');\n        } else {\n          // Fall back to reading the rest of this field as unquoted.\n          // Note: the rest is guaranteed not start with \", as that case is\n          // eliminated above.\n          var prefix = '\"' + text.substring(start, index);\n          var suffix = readField();\n          if (suffix == EOR) {\n            pushBack(NEWLINE);\n            return prefix;\n          } else {\n            return prefix + suffix;\n          }\n        }\n      }\n    }\n\n    if (end === null) {\n      if (!opt_ignoreErrors) {\n        throw new goog.labs.format.csv.ParseError(\n            text, text.length - 1, 'Unexpected end of text after open quote');\n      } else {\n        end = text.length;\n      }\n    }\n\n    // Take substring, combine double quotes.\n    return text.substring(start, end).replace(/\"\"/g, '\"');\n  }\n\n  /**\n   * Read a field from input.\n   * @return {string|!goog.labs.format.csv.Sentinels_} The field, as a string,\n   *     or a sentinel (if applicable).\n   */\n  function readField() {\n    var start = index;\n    var didSeeComma = sawComma;\n    sawComma = false;\n    var token = nextToken();\n    if (token == EMPTY) {\n      return EOR;\n    }\n    if (token == EOF || token == NEWLINE) {\n      if (didSeeComma) {\n        pushBack(EMPTY);\n        return '';\n      }\n      return EOR;\n    }\n\n    // This is the beginning of a quoted field.\n    if (token == '\"') {\n      return readQuotedField();\n    }\n\n    while (true) {\n      // This is the end of line or file.\n      if (token == EOF || token == NEWLINE) {\n        pushBack(token);\n        break;\n      }\n\n      // This is the end of record.\n      if (token == delimiter) {\n        sawComma = true;\n        break;\n      }\n\n      if (token == '\"' && !opt_ignoreErrors) {\n        throw new goog.labs.format.csv.ParseError(\n            text, index - 1, 'Unexpected quote mark');\n      }\n\n      token = nextToken();\n    }\n\n\n    var returnString = (token == EOF) ?\n        text.substring(start) :  // Return to end of file.\n        text.substring(start, index - 1);\n\n    return returnString.replace(/[\\r\\n]+/g, '');  // Squash any CRLFs.\n  }\n\n  /**\n   * Read the next record.\n   * @return {!Array<string>|!goog.labs.format.csv.Sentinels_} A single record\n   *     with multiple fields.\n   */\n  function readRecord() {\n    if (index >= text.length) {\n      return EOF;\n    }\n    var record = [];\n    for (var field = readField(); field != EOR; field = readField()) {\n      record.push(field);\n    }\n    return record;\n  }\n\n  // Read all records and return.\n  var records = [];\n  for (var record = readRecord(); record != EOF; record = readRecord()) {\n    records.push(record);\n  }\n  return records;\n};\n\n\n/**\n * Sentinel tracking objects.\n * @enum {!Object}\n * @private\n */\ngoog.labs.format.csv.Sentinels_ = {\n  /** Empty field */\n  EMPTY: {},\n\n  /** End of file */\n  EOF: {},\n\n  /** End of record */\n  EOR: {},\n\n  /** Newline. \\r?\\n */\n  NEWLINE: {}\n};\n\n\n/**\n * @param {string} str A string.\n * @return {boolean} Whether the string is a single character.\n * @private\n */\ngoog.labs.format.csv.isCharacterString_ = function(str) {\n  return typeof str === 'string' && str.length == 1;\n};\n\n\n/**\n * Assert the parameter is a token.\n * @param {*} o What should be a token.\n * @throws {goog.asserts.AssertionError} If {@ code} is not a token.\n * @private\n */\ngoog.labs.format.csv.assertToken_ = function(o) {\n  if (typeof o === 'string') {\n    goog.asserts.assertString(o);\n    goog.asserts.assert(\n        goog.labs.format.csv.isCharacterString_(o),\n        'Should be a string of length 1 or a sentinel.');\n  } else {\n    goog.asserts.assert(\n        goog.object.containsValue(goog.labs.format.csv.Sentinels_, o),\n        'Should be a string of length 1 or a sentinel.');\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.string.newlines","^9L","^9>","^;P","^;R","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/format/csv.js"],"^:1",["^9K",["~$goog.labs.format.csv","~$goog.labs.format.csv.ParseError","~$goog.labs.format.csv.Token"]],"^9<",true,"^9=",["^9>","^;9","^:E","^;R","^;P","^9L","^;Y"]],["^ ","^9A",[1579837703000],"^9B","goog.string.stringbuffer.js","^9C",["^9D","goog/string/stringbuffer.js"],"^9E","goog/string/stringbuffer.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility for fast string concatenation.\n */\n\ngoog.provide('goog.string.StringBuffer');\n\n\n\n/**\n * Utility class to facilitate string concatenation.\n *\n * @param {*=} opt_a1 Optional first initial item to append.\n * @param {...*} var_args Other initial items to\n *     append, e.g., new goog.string.StringBuffer('foo', 'bar').\n * @constructor\n */\ngoog.string.StringBuffer = function(opt_a1, var_args) {\n  if (opt_a1 != null) {\n    this.append.apply(this, arguments);\n  }\n};\n\n\n/**\n * Internal buffer for the string to be concatenated.\n * @type {string}\n * @private\n */\ngoog.string.StringBuffer.prototype.buffer_ = '';\n\n\n/**\n * Sets the contents of the string buffer object, replacing what's currently\n * there.\n *\n * @param {*} s String to set.\n */\ngoog.string.StringBuffer.prototype.set = function(s) {\n  this.buffer_ = '' + s;\n};\n\n\n/**\n * Appends one or more items to the buffer.\n *\n * Calling this with null, undefined, or empty arguments is an error.\n *\n * @param {*} a1 Required first string.\n * @param {*=} opt_a2 Optional second string.\n * @param {...?} var_args Other items to append,\n *     e.g., sb.append('foo', 'bar', 'baz').\n * @return {!goog.string.StringBuffer} This same StringBuffer object.\n * @suppress {duplicate}\n */\ngoog.string.StringBuffer.prototype.append = function(a1, opt_a2, var_args) {\n  // Use a1 directly to avoid arguments instantiation for single-arg case.\n  this.buffer_ += String(a1);\n  if (opt_a2 != null) {  // second argument is undefined (null == undefined)\n    for (let i = 1; i < arguments.length; i++) {\n      this.buffer_ += arguments[i];\n    }\n  }\n  return this;\n};\n\n\n/**\n * Clears the internal buffer.\n */\ngoog.string.StringBuffer.prototype.clear = function() {\n  this.buffer_ = '';\n};\n\n\n/**\n * @return {number} the length of the current contents of the buffer.\n */\ngoog.string.StringBuffer.prototype.getLength = function() {\n  return this.buffer_.length;\n};\n\n\n/**\n * @return {string} The concatenated string.\n * @override\n */\ngoog.string.StringBuffer.prototype.toString = function() {\n  return this.buffer_;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/string/stringbuffer.js"],"^:1",["^9K",["~$goog.string.StringBuffer"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.events.mousewheelhandler.js","^9C",["^9D","goog/events/mousewheelhandler.js"],"^9E","goog/events/mousewheelhandler.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This event wrapper will dispatch an event when the user uses\n * the mouse wheel to scroll an element. You can get the direction by checking\n * the deltaX and deltaY properties of the event.\n *\n * This class aims to smooth out inconsistencies between browser platforms with\n * regards to mousewheel events, but we do not cover every possible\n * software/hardware combination out there, some of which occasionally produce\n * very large deltas in mousewheel events. If your application wants to guard\n * against extremely large deltas, use the setMaxDeltaX and setMaxDeltaY APIs\n * to set maximum values that make sense for your application.\n *\n * @author arv@google.com (Erik Arvidsson)\n * @see ../demos/mousewheelhandler.html\n */\n\ngoog.provide('goog.events.MouseWheelEvent');\ngoog.provide('goog.events.MouseWheelHandler');\ngoog.provide('goog.events.MouseWheelHandler.EventType');\n\ngoog.require('goog.dom');\ngoog.require('goog.events');\ngoog.require('goog.events.BrowserEvent');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.math');\ngoog.require('goog.style');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * This event handler allows you to catch mouse wheel events in a consistent\n * manner.\n * @param {Element|Document} element The element to listen to the mouse wheel\n *     event on.\n * @param {boolean=} opt_capture Whether to handle the mouse wheel event in\n *     capture phase.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.events.MouseWheelHandler = function(element, opt_capture) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * This is the element that we will listen to the real mouse wheel events on.\n   * @type {Element|Document}\n   * @private\n   */\n  this.element_ = element;\n\n  var rtlElement = goog.dom.isElement(this.element_) ?\n      /** @type {Element} */ (this.element_) :\n                             (this.element_ ?\n                                  /** @type {Document} */ (this.element_).body :\n                                  null);\n\n  /**\n   * True if the element exists and is RTL, false otherwise.\n   * @type {boolean}\n   * @private\n   */\n  this.isRtl_ = !!rtlElement && goog.style.isRightToLeft(rtlElement);\n\n  var type = goog.userAgent.GECKO ? 'DOMMouseScroll' : 'mousewheel';\n\n  /**\n   * The key returned from the goog.events.listen.\n   * @type {goog.events.Key}\n   * @private\n   */\n  this.listenKey_ = goog.events.listen(this.element_, type, this, opt_capture);\n};\ngoog.inherits(goog.events.MouseWheelHandler, goog.events.EventTarget);\n\n\n/**\n * Enum type for the events fired by the mouse wheel handler.\n * @enum {string}\n */\ngoog.events.MouseWheelHandler.EventType = {\n  MOUSEWHEEL: 'mousewheel'\n};\n\n\n/**\n * Optional maximum magnitude for x delta on each mousewheel event.\n * @type {number|undefined}\n * @private\n */\ngoog.events.MouseWheelHandler.prototype.maxDeltaX_;\n\n\n/**\n * Optional maximum magnitude for y delta on each mousewheel event.\n * @type {number|undefined}\n * @private\n */\ngoog.events.MouseWheelHandler.prototype.maxDeltaY_;\n\n\n/**\n * @param {number} maxDeltaX Maximum magnitude for x delta on each mousewheel\n *     event. Should be non-negative.\n */\ngoog.events.MouseWheelHandler.prototype.setMaxDeltaX = function(maxDeltaX) {\n  this.maxDeltaX_ = maxDeltaX;\n};\n\n\n/**\n * @param {number} maxDeltaY Maximum magnitude for y delta on each mousewheel\n *     event. Should be non-negative.\n */\ngoog.events.MouseWheelHandler.prototype.setMaxDeltaY = function(maxDeltaY) {\n  this.maxDeltaY_ = maxDeltaY;\n};\n\n\n/**\n * Handles the events on the element.\n * @param {goog.events.BrowserEvent} e The underlying browser event.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.events.MouseWheelHandler.prototype.handleEvent = function(e) {\n  var deltaX = 0;\n  var deltaY = 0;\n  var detail = 0;\n  var be = e.getBrowserEvent();\n  if (be.type == 'mousewheel') {\n    // In IE we get a multiple of 120; we adjust to a multiple of 3 to\n    // represent number of lines scrolled (like Gecko).\n    // Newer versions of Webkit match IE behavior, and WebKit on\n    // Windows also matches IE behavior.\n    // See bug https://bugs.webkit.org/show_bug.cgi?id=24368\n    var wheelDeltaScaleFactor = 40;\n\n    detail = goog.events.MouseWheelHandler.smartScale_(\n        -be.wheelDelta, wheelDeltaScaleFactor);\n    if (be.wheelDeltaX !== undefined) {\n      // Webkit has two properties to indicate directional scroll, and\n      // can scroll both directions at once.\n      deltaX = goog.events.MouseWheelHandler.smartScale_(\n          -be.wheelDeltaX, wheelDeltaScaleFactor);\n      deltaY = goog.events.MouseWheelHandler.smartScale_(\n          -be.wheelDeltaY, wheelDeltaScaleFactor);\n    } else {\n      deltaY = detail;\n    }\n\n    // Historical note: Opera (pre 9.5) used to negate the detail value.\n  } else {  // Gecko\n    // Gecko returns multiple of 3 (representing the number of lines scrolled)\n    detail = be.detail;\n\n    // Gecko sometimes returns really big values if the user changes settings to\n    // scroll a whole page per scroll\n    if (detail > 100) {\n      detail = 3;\n    } else if (detail < -100) {\n      detail = -3;\n    }\n\n    // Firefox 3.1 adds an axis field to the event to indicate direction of\n    // scroll.  See https://developer.mozilla.org/en/Gecko-Specific_DOM_Events\n    if (be.axis !== undefined && be.axis === be.HORIZONTAL_AXIS) {\n      deltaX = detail;\n    } else {\n      deltaY = detail;\n    }\n  }\n\n  if (typeof this.maxDeltaX_ === 'number') {\n    deltaX = goog.math.clamp(deltaX, -this.maxDeltaX_, this.maxDeltaX_);\n  }\n  if (typeof this.maxDeltaY_ === 'number') {\n    deltaY = goog.math.clamp(deltaY, -this.maxDeltaY_, this.maxDeltaY_);\n  }\n  // Don't clamp 'detail', since it could be ambiguous which axis it refers to\n  // and because it's informally deprecated anyways.\n\n  // For horizontal scrolling we need to flip the value for RTL grids.\n  if (this.isRtl_) {\n    deltaX = -deltaX;\n  }\n  var newEvent = new goog.events.MouseWheelEvent(detail, be, deltaX, deltaY);\n  this.dispatchEvent(newEvent);\n};\n\n\n/**\n * Helper for scaling down a mousewheel delta by a scale factor, if appropriate.\n * @param {number} mouseWheelDelta Delta from a mouse wheel event. Expected to\n *     be an integer.\n * @param {number} scaleFactor Factor to scale the delta down by. Expected to\n *     be an integer.\n * @return {number} Scaled-down delta value, or the original delta if the\n *     scaleFactor does not appear to be applicable.\n * @private\n */\ngoog.events.MouseWheelHandler.smartScale_ = function(\n    mouseWheelDelta, scaleFactor) {\n  // The basic problem here is that in Webkit on Mac and Linux, we can get two\n  // very different types of mousewheel events: from continuous devices\n  // (touchpads, Mighty Mouse) or non-continuous devices (normal wheel mice).\n  //\n  // Non-continuous devices in Webkit get their wheel deltas scaled up to\n  // behave like IE. Continuous devices return much smaller unscaled values\n  // (which most of the time will not be cleanly divisible by the IE scale\n  // factor), so we should not try to normalize them down.\n  //\n  // Detailed discussion:\n  //   https://bugs.webkit.org/show_bug.cgi?id=29601\n  //   http://trac.webkit.org/browser/trunk/WebKit/chromium/src/mac/WebInputEventFactory.mm#L1063\n  if (goog.userAgent.WEBKIT && (goog.userAgent.MAC || goog.userAgent.LINUX) &&\n      (mouseWheelDelta % scaleFactor) != 0) {\n    return mouseWheelDelta;\n  } else {\n    return mouseWheelDelta / scaleFactor;\n  }\n};\n\n\n/** @override */\ngoog.events.MouseWheelHandler.prototype.disposeInternal = function() {\n  goog.events.MouseWheelHandler.superClass_.disposeInternal.call(this);\n  goog.events.unlistenByKey(this.listenKey_);\n  this.listenKey_ = null;\n};\n\n\n\n/**\n * A base class for mouse wheel events. This is used with the\n * MouseWheelHandler.\n *\n * @param {number} detail The number of rows the user scrolled.\n * @param {Event} browserEvent Browser event object.\n * @param {number} deltaX The number of rows the user scrolled in the X\n *     direction.\n * @param {number} deltaY The number of rows the user scrolled in the Y\n *     direction.\n * @constructor\n * @extends {goog.events.BrowserEvent}\n * @final\n */\ngoog.events.MouseWheelEvent = function(detail, browserEvent, deltaX, deltaY) {\n  goog.events.BrowserEvent.call(this, browserEvent);\n\n  this.type = goog.events.MouseWheelHandler.EventType.MOUSEWHEEL;\n\n  /**\n   * The number of lines the user scrolled\n   * @type {number}\n   * NOTE: Informally deprecated. Use deltaX and deltaY instead, they provide\n   * more information.\n   */\n  this.detail = detail;\n\n  /**\n   * The number of \"lines\" scrolled in the X direction.\n   *\n   * Note that not all browsers provide enough information to distinguish\n   * horizontal and vertical scroll events, so for these unsupported browsers,\n   * we will always have a deltaX of 0, even if the user scrolled their mouse\n   * wheel or trackpad sideways.\n   *\n   * Currently supported browsers are Webkit and Firefox 3.1 or later.\n   *\n   * @type {number}\n   */\n  this.deltaX = deltaX;\n\n  /**\n   * The number of lines scrolled in the Y direction.\n   * @type {number}\n   */\n  this.deltaY = deltaY;\n};\ngoog.inherits(goog.events.MouseWheelEvent, goog.events.BrowserEvent);\n","^9I",1579837703000,"^9J",["^9K",["^;;","^9>","^:L","^:S","~$goog.math","~$goog.style","~$goog.events.BrowserEvent","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/mousewheelhandler.js"],"^:1",["^9K",["~$goog.events.MouseWheelHandler.EventType","~$goog.events.MouseWheelEvent","~$goog.events.MouseWheelHandler"]],"^9<",true,"^9=",["^9>","^;;","^:N","^<4","^:L","^<2","^<3","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.fs.filesystem.js","^9C",["^9D","goog/fs/filesystem.js"],"^9E","goog/fs/filesystem.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A wrapper for the HTML5 FileSystem object.\n *\n */\n\ngoog.provide('goog.fs.FileSystem');\n\ngoog.forwardDeclare('goog.fs.DirectoryEntry');\n\n\n\n/**\n * A local filesystem.\n *\n * @interface\n */\ngoog.fs.FileSystem = function() {};\n\n\n/**\n * @return {string} The name of the filesystem.\n */\ngoog.fs.FileSystem.prototype.getName = function() {};\n\n\n/**\n * @return {!goog.fs.DirectoryEntry} The root directory of the filesystem.\n */\ngoog.fs.FileSystem.prototype.getRoot = function() {};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fs/filesystem.js"],"^:1",["^9K",["~$goog.fs.FileSystem"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.labs.collections.iterables.js","^9C",["^9D","goog/labs/collections/iterables.js"],"^9E","goog/labs/collections/iterables.js","^9F","^9G","^9H","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for working with ES6 iterables.\n *\n * The goal is that this should be a replacement for goog.iter which uses\n * a now non-standard approach to iterables.\n *\n * @see https://goo.gl/Rok5YQ\n */\n\ngoog.module('goog.labs.collections.iterables');\n\n\n/**\n * Get the iterator for an iterable.\n * @param {!Iterable<VALUE>} iterable\n * @return {!Iterator<VALUE>}\n * @template VALUE\n */\nexports.getIterator = function(iterable) {\n  return iterable[goog.global.Symbol.iterator]();\n};\n\n\n/**\n * Call a function with every value of an iterable.\n *\n * Warning: this function will never halt if given an iterable that\n * is never exhausted.\n *\n * @param {!Iterable<VALUE>} iterable\n * @param {function(VALUE) : *} f\n * @template VALUE\n */\nexports.forEach = function(iterable, f) {\n  for (const elem of iterable) {\n    f(elem);\n  }\n};\n\n\n/**\n * Maps the values of one iterable to create another iterable.\n *\n * When next() is called on the returned iterable, it will call the given\n * function `f` with the next value of the given iterable\n * `iterable` until the given iterable is exhausted.\n *\n * @param {!Iterable<VALUE>} iterable\n * @param {function(this: THIS, VALUE): RESULT} f\n * @return {!Iterable<RESULT>} The created iterable that gives the mapped\n *     values.\n * @template THIS, VALUE, RESULT\n */\nexports.map = function*(iterable, f) {\n  for (const elem of iterable) {\n    yield f(elem);\n  }\n};\n\n\n/**\n * Filter elements from one iterator to create another iterable.\n *\n * When next() is called on the returned iterator, it will call next() on the\n * given iterator and call the given function `f` with that value until `true`\n * is returned or the given iterator is exhausted.\n *\n * @param {!Iterable<VALUE>} iterable\n * @param {function(VALUE): boolean} f\n * @return {!Iterable<VALUE>} The created iterable that gives the mapped\n *     values.\n * @template VALUE\n */\nexports.filter = function*(iterable, f) {\n  for (const elem of iterable) {\n    if (f(elem)) {\n      yield elem;\n    }\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/collections/iterables.js"],"^:1",["^9K",["~$goog.labs.collections.iterables"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.async.workqueue.js","^9C",["^9D","goog/async/workqueue.js"],"^9E","goog/async/workqueue.js","^9F","^9G","^9H","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.async.WorkItem');\ngoog.provide('goog.async.WorkQueue');\n\ngoog.require('goog.asserts');\ngoog.require('goog.async.FreeList');\n\n\n// TODO(johnlenz): generalize the WorkQueue if this is used by more\n// than goog.async.run.\n\n\n\n/**\n * A low GC workqueue. The key elements of this design:\n *   - avoids the need for goog.bind or equivalent by carrying scope\n *   - avoids the need for array reallocation by using a linked list\n *   - minimizes work entry objects allocation by recycling objects\n * @constructor\n * @final\n * @struct\n */\ngoog.async.WorkQueue = function() {\n  this.workHead_ = null;\n  this.workTail_ = null;\n};\n\n\n/** @define {number} The maximum number of entries to keep for recycling. */\ngoog.async.WorkQueue.DEFAULT_MAX_UNUSED =\n    goog.define('goog.async.WorkQueue.DEFAULT_MAX_UNUSED', 100);\n\n\n/** @const @private {goog.async.FreeList<goog.async.WorkItem>} */\ngoog.async.WorkQueue.freelist_ = new goog.async.FreeList(\n    function() { return new goog.async.WorkItem(); },\n    function(item) { item.reset(); }, goog.async.WorkQueue.DEFAULT_MAX_UNUSED);\n\n\n/**\n * @param {function()} fn\n * @param {Object|null|undefined} scope\n */\ngoog.async.WorkQueue.prototype.add = function(fn, scope) {\n  var item = this.getUnusedItem_();\n  item.set(fn, scope);\n\n  if (this.workTail_) {\n    this.workTail_.next = item;\n    this.workTail_ = item;\n  } else {\n    goog.asserts.assert(!this.workHead_);\n    this.workHead_ = item;\n    this.workTail_ = item;\n  }\n};\n\n\n/**\n * @return {goog.async.WorkItem}\n */\ngoog.async.WorkQueue.prototype.remove = function() {\n  var item = null;\n\n  if (this.workHead_) {\n    item = this.workHead_;\n    this.workHead_ = this.workHead_.next;\n    if (!this.workHead_) {\n      this.workTail_ = null;\n    }\n    item.next = null;\n  }\n  return item;\n};\n\n\n/**\n * @param {goog.async.WorkItem} item\n */\ngoog.async.WorkQueue.prototype.returnUnused = function(item) {\n  goog.async.WorkQueue.freelist_.put(item);\n};\n\n\n/**\n * @return {goog.async.WorkItem}\n * @private\n */\ngoog.async.WorkQueue.prototype.getUnusedItem_ = function() {\n  return goog.async.WorkQueue.freelist_.get();\n};\n\n\n\n/**\n * @constructor\n * @final\n * @struct\n */\ngoog.async.WorkItem = function() {\n  /** @type {?function()} */\n  this.fn = null;\n  /** @type {?Object|null|undefined} */\n  this.scope = null;\n  /** @type {?goog.async.WorkItem} */\n  this.next = null;\n};\n\n\n/**\n * @param {function()} fn\n * @param {Object|null|undefined} scope\n */\ngoog.async.WorkItem.prototype.set = function(fn, scope) {\n  this.fn = fn;\n  this.scope = scope;\n  this.next = null;\n};\n\n\n/** Reset the work item so they don't prevent GC before reuse */\ngoog.async.WorkItem.prototype.reset = function() {\n  this.fn = null;\n  this.scope = null;\n  this.next = null;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9>","~$goog.async.FreeList"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/async/workqueue.js"],"^:1",["^9K",["~$goog.async.WorkItem","~$goog.async.WorkQueue"]],"^9<",true,"^9=",["^9>","^:E","^<:"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.popup.js","^9C",["^9D","goog/ui/popup.js"],"^9E","goog/ui/popup.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the Popup class.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/popup.html\n */\n\ngoog.provide('goog.ui.Popup');\n\ngoog.require('goog.math.Box');\ngoog.require('goog.positioning.AbstractPosition');\ngoog.require('goog.positioning.Corner');\ngoog.require('goog.style');\ngoog.require('goog.ui.PopupBase');\n\n\n\n/**\n * The Popup class provides functionality for displaying an absolutely\n * positioned element at a particular location in the window. It's designed to\n * be used as the foundation for building controls like a menu or tooltip. The\n * Popup class includes functionality for displaying a Popup near adjacent to\n * an anchor element.\n *\n * This works cross browser and thus does not use IE's createPopup feature\n * which supports extending outside the edge of the brower window.\n *\n * @param {Element=} opt_element A DOM element for the popup.\n * @param {goog.positioning.AbstractPosition=} opt_position A positioning helper\n *     object.\n * @constructor\n * @extends {goog.ui.PopupBase}\n */\ngoog.ui.Popup = function(opt_element, opt_position) {\n  /**\n   * Corner of the popup to used in the positioning algorithm.\n   *\n   * @type {goog.positioning.Corner}\n   * @private\n   */\n  this.popupCorner_ = goog.positioning.Corner.TOP_START;\n\n  /**\n   * Positioning helper object.\n   *\n   * @private {goog.positioning.AbstractPosition|undefined}\n   */\n  this.position_ = opt_position || undefined;\n  goog.ui.PopupBase.call(this, opt_element);\n};\ngoog.inherits(goog.ui.Popup, goog.ui.PopupBase);\ngoog.tagUnsealableClass(goog.ui.Popup);\n\n\n/**\n * Margin for the popup used in positioning algorithms.\n *\n * @type {goog.math.Box|undefined}\n * @private\n */\ngoog.ui.Popup.prototype.margin_;\n\n\n/**\n * Returns the corner of the popup to used in the positioning algorithm.\n *\n * @return {goog.positioning.Corner} The popup corner used for positioning.\n */\ngoog.ui.Popup.prototype.getPinnedCorner = function() {\n  return this.popupCorner_;\n};\n\n\n/**\n * Sets the corner of the popup to used in the positioning algorithm.\n *\n * @param {goog.positioning.Corner} corner The popup corner used for\n *     positioning.\n */\ngoog.ui.Popup.prototype.setPinnedCorner = function(corner) {\n  this.popupCorner_ = corner;\n  if (this.isVisible()) {\n    this.reposition();\n  }\n};\n\n\n/**\n * @return {goog.positioning.AbstractPosition} The position helper object\n *     associated with the popup.\n */\ngoog.ui.Popup.prototype.getPosition = function() {\n  return this.position_ || null;\n};\n\n\n/**\n * Sets the position helper object associated with the popup.\n *\n * @param {goog.positioning.AbstractPosition} position A position helper object.\n */\ngoog.ui.Popup.prototype.setPosition = function(position) {\n  this.position_ = position || undefined;\n  if (this.isVisible()) {\n    this.reposition();\n  }\n};\n\n\n/**\n * Returns the margin to place around the popup.\n *\n * @return {goog.math.Box?} The margin.\n */\ngoog.ui.Popup.prototype.getMargin = function() {\n  return this.margin_ || null;\n};\n\n\n/**\n * Sets the margin to place around the popup.\n *\n * @param {goog.math.Box|number|null} arg1 Top value or Box.\n * @param {number=} opt_arg2 Right value.\n * @param {number=} opt_arg3 Bottom value.\n * @param {number=} opt_arg4 Left value.\n */\ngoog.ui.Popup.prototype.setMargin = function(\n    arg1, opt_arg2, opt_arg3, opt_arg4) {\n  if (arg1 == null || arg1 instanceof goog.math.Box) {\n    this.margin_ = arg1;\n  } else {\n    this.margin_ = new goog.math.Box(\n        arg1,\n        /** @type {number} */ (opt_arg2),\n        /** @type {number} */ (opt_arg3),\n        /** @type {number} */ (opt_arg4));\n  }\n  if (this.isVisible()) {\n    this.reposition();\n  }\n};\n\n\n/**\n * Repositions the popup according to the current state.\n * @override\n */\ngoog.ui.Popup.prototype.reposition = function() {\n  if (!this.position_) {\n    return;\n  }\n\n  var hideForPositioning = !this.isVisible() &&\n      this.getType() != goog.ui.PopupBase.Type.MOVE_OFFSCREEN;\n  var el = this.getElement();\n  if (hideForPositioning) {\n    el.style.visibility = 'hidden';\n    goog.style.setElementShown(el, true);\n  }\n\n  this.position_.reposition(el, this.popupCorner_, this.margin_);\n\n  if (hideForPositioning) {\n    // NOTE(eae): The visibility property is reset to 'visible' by the show_\n    // method in PopupBase. Resetting it here causes flickering in some\n    // situations, even if set to visible after the display property has been\n    // set to none by the call below.\n    goog.style.setElementShown(el, false);\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:G","~$goog.ui.PopupBase","^9>","~$goog.positioning.AbstractPosition","~$goog.math.Box","^<3"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/popup.js"],"^:1",["^9K",["^:J"]],"^9<",true,"^9=",["^9>","^<?","^<>","^:G","^<3","^<="]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.json.jsonable.js","^9C",["^9D","goog/json/jsonable.js"],"^9E","goog/json/jsonable.js","^9F","^9G","^9H","// Copyright 2018 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Typedef for JavaScript types that can be JSON serialized.\n *\n * @author ruilopes@google.com (Rui Lopes)\n */\n\ngoog.module('goog.json.Jsonable');\n\n/**\n * @typedef {boolean|number|string}\n */\nlet Primitive;\n\n/**\n * @typedef {!Primitive|!Array|!Object}\n */\nlet NestedType;\n\n/**\n * Types that can be JSON serialized. We only check one level deep for Objects\n * and Arrays so it's not checked at compile time whether nested types are\n * correct, and it would be possible for a user to pass in an invalid JSON\n * object. Which would be a bummer.\n * NOTE: If the compiler were to support recursive typedefs, this would be\n * {boolean|number|string|!Object<string, !Jsonable>|!Array<!Jsonable>}.\n * Recursive type checking is supported by @record but not @typedef.\n * @typedef {?Primitive|!Object<string, ?NestedType>|!Array<?NestedType>}\n */\nlet Jsonable;\n\nexports = Jsonable;\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/json/jsonable.js"],"^:1",["^9K",["~$goog.json.Jsonable"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.labs.net.webchannel.webchannelbasetransport.js","^9C",["^9D","goog/labs/net/webchannel/webchannelbasetransport.js"],"^9E","goog/labs/net/webchannel/webchannelbasetransport.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implementation of a WebChannel transport using WebChannelBase.\n *\n * When WebChannelBase is used as the underlying transport, the capabilities\n * of the WebChannel are limited to what's supported by the implementation.\n * Particularly, multiplexing is not possible, and only strings are\n * supported as message types.\n *\n */\n\ngoog.provide('goog.labs.net.webChannel.WebChannelBaseTransport');\n\ngoog.require('goog.asserts');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.json');\ngoog.require('goog.labs.net.webChannel.ChannelRequest');\ngoog.require('goog.labs.net.webChannel.WebChannelBase');\ngoog.require('goog.labs.net.webChannel.Wire');\ngoog.require('goog.log');\ngoog.require('goog.net.WebChannel');\ngoog.require('goog.net.WebChannelTransport');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.string.path');\n\n\n\n/**\n * Implementation of {@link goog.net.WebChannelTransport} with\n * {@link goog.labs.net.webChannel.WebChannelBase} as the underlying channel\n * implementation.\n *\n * @constructor\n * @struct\n * @implements {goog.net.WebChannelTransport}\n * @final\n */\ngoog.labs.net.webChannel.WebChannelBaseTransport = function() {\n  if (!goog.labs.net.webChannel.ChannelRequest.supportsXhrStreaming()) {\n    throw new Error('Environmental error: no available transport.');\n  }\n};\n\n\ngoog.scope(function() {\nvar WebChannelBaseTransport = goog.labs.net.webChannel.WebChannelBaseTransport;\nvar WebChannelBase = goog.labs.net.webChannel.WebChannelBase;\nvar Wire = goog.labs.net.webChannel.Wire;\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.prototype.createWebChannel = function(\n    url, opt_options) {\n  return new WebChannelBaseTransport.Channel(url, opt_options);\n};\n\n\n\n/**\n * Implementation of the {@link goog.net.WebChannel} interface.\n *\n * @param {string} url The URL path for the new WebChannel instance.\n * @param {!goog.net.WebChannel.Options=} opt_options Configuration for the\n *     new WebChannel instance.\n *\n * @constructor\n * @implements {goog.net.WebChannel}\n * @extends {goog.events.EventTarget}\n * @final\n */\nWebChannelBaseTransport.Channel = function(url, opt_options) {\n  WebChannelBaseTransport.Channel.base(this, 'constructor');\n\n  /**\n   * @private {!WebChannelBase} The underlying channel object.\n   */\n  this.channel_ = new WebChannelBase(\n      opt_options, goog.net.WebChannelTransport.CLIENT_VERSION);\n\n  /**\n   * @private {string} The URL of the target server end-point.\n   */\n  this.url_ = url;\n\n  /**\n   * The test URL of the target server end-point. This value defaults to\n   * this.url_ + '/test'.\n   *\n   * @private {string}\n   */\n  this.testUrl_ = (opt_options && opt_options.testUrl) ?\n      opt_options.testUrl :\n      goog.string.path.join(this.url_, 'test');\n\n  /**\n   * @private {goog.log.Logger} The logger for this class.\n   */\n  this.logger_ =\n      goog.log.getLogger('goog.labs.net.webChannel.WebChannelBaseTransport');\n\n  /**\n   * @private {Object<string, string>} Extra URL parameters\n   * to be added to each HTTP request.\n   */\n  this.messageUrlParams_ =\n      (opt_options && opt_options.messageUrlParams) || null;\n\n  var messageHeaders = (opt_options && opt_options.messageHeaders) || null;\n\n  // default is false\n  if (opt_options && opt_options.clientProtocolHeaderRequired) {\n    if (messageHeaders) {\n      goog.object.set(\n          messageHeaders, goog.net.WebChannel.X_CLIENT_PROTOCOL,\n          goog.net.WebChannel.X_CLIENT_PROTOCOL_WEB_CHANNEL);\n    } else {\n      messageHeaders = goog.object.create(\n          goog.net.WebChannel.X_CLIENT_PROTOCOL,\n          goog.net.WebChannel.X_CLIENT_PROTOCOL_WEB_CHANNEL);\n    }\n  }\n\n  this.channel_.setExtraHeaders(messageHeaders);\n\n  var initHeaders = (opt_options && opt_options.initMessageHeaders) || null;\n\n  if (opt_options && opt_options.messageContentType) {\n    if (initHeaders) {\n      goog.object.set(\n          initHeaders, goog.net.WebChannel.X_WEBCHANNEL_CONTENT_TYPE,\n          opt_options.messageContentType);\n    } else {\n      initHeaders = goog.object.create(\n          goog.net.WebChannel.X_WEBCHANNEL_CONTENT_TYPE,\n          opt_options.messageContentType);\n    }\n  }\n\n  if (opt_options && opt_options.clientProfile) {\n    if (initHeaders) {\n      goog.object.set(\n          initHeaders, goog.net.WebChannel.X_WEBCHANNEL_CLIENT_PROFILE,\n          opt_options.clientProfile);\n    } else {\n      initHeaders = goog.object.create(\n          goog.net.WebChannel.X_WEBCHANNEL_CLIENT_PROFILE,\n          opt_options.clientProfile);\n    }\n  }\n\n  this.channel_.setInitHeaders(initHeaders);\n\n  var httpHeadersOverwriteParam =\n      opt_options && opt_options.httpHeadersOverwriteParam;\n  if (httpHeadersOverwriteParam &&\n      !goog.string.isEmptyOrWhitespace(httpHeadersOverwriteParam)) {\n    this.channel_.setHttpHeadersOverwriteParam(httpHeadersOverwriteParam);\n  }\n\n  /**\n   * @private {boolean} Whether to enable CORS.\n   */\n  this.supportsCrossDomainXhr_ =\n      (opt_options && opt_options.supportsCrossDomainXhr) || false;\n\n  /**\n   * @private {boolean} Whether to send raw Json and bypass v8 wire format.\n   */\n  this.sendRawJson_ = (opt_options && opt_options.sendRawJson) || false;\n\n  // Note that httpSessionIdParam will be ignored if the same parameter name\n  // has already been specified with messageUrlParams\n  var httpSessionIdParam = opt_options && opt_options.httpSessionIdParam;\n  if (httpSessionIdParam &&\n      !goog.string.isEmptyOrWhitespace(httpSessionIdParam)) {\n    this.channel_.setHttpSessionIdParam(httpSessionIdParam);\n    if (goog.object.containsKey(this.messageUrlParams_, httpSessionIdParam)) {\n      goog.object.remove(this.messageUrlParams_, httpSessionIdParam);\n      goog.log.warning(this.logger_,\n          'Ignore httpSessionIdParam also specified with messageUrlParams: '\n          + httpSessionIdParam);\n    }\n  }\n\n  /**\n   * The channel handler.\n   *\n   * @private {!WebChannelBaseTransport.Channel.Handler_}\n   */\n  this.channelHandler_ = new WebChannelBaseTransport.Channel.Handler_(this);\n};\ngoog.inherits(WebChannelBaseTransport.Channel, goog.events.EventTarget);\n\n\n/**\n * @override\n * @suppress {checkTypes}\n */\nWebChannelBaseTransport.Channel.prototype.addEventListener = function(\n    type, handler, /** boolean= */ opt_capture, opt_handlerScope) {\n  WebChannelBaseTransport.Channel.base(\n      this, 'addEventListener', type, handler, opt_capture, opt_handlerScope);\n};\n\n\n/**\n * @override\n * @suppress {checkTypes}\n */\nWebChannelBaseTransport.Channel.prototype.removeEventListener = function(\n    type, handler, /** boolean= */ opt_capture, opt_handlerScope) {\n  WebChannelBaseTransport.Channel.base(\n      this, 'removeEventListener', type, handler, opt_capture,\n      opt_handlerScope);\n};\n\n\n/**\n * Test path is always set to \"/url/test\".\n *\n * @override\n */\nWebChannelBaseTransport.Channel.prototype.open = function() {\n  this.channel_.setHandler(this.channelHandler_);\n  if (this.supportsCrossDomainXhr_) {\n    this.channel_.setSupportsCrossDomainXhrs(true);\n  }\n  this.channel_.connect(\n      this.testUrl_, this.url_, (this.messageUrlParams_ || undefined));\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.prototype.close = function() {\n  this.channel_.disconnect();\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.prototype.halfClose = function() {\n  // to be implemented\n  throw new Error('Not implemented');\n};\n\n\n/**\n * The WebChannelBase only supports object types.\n *\n * @param {!goog.net.WebChannel.MessageData} message The message to send.\n *\n * @override\n */\nWebChannelBaseTransport.Channel.prototype.send = function(message) {\n  goog.asserts.assert(\n      goog.isObject(message) || typeof message === 'string',\n      'only object type or raw string is supported');\n\n  if (typeof message === 'string') {\n    var rawJson = {};\n    rawJson[Wire.RAW_DATA_KEY] = message;\n    this.channel_.sendMap(rawJson);\n  } else if (this.sendRawJson_) {\n    var rawJson = {};\n    rawJson[Wire.RAW_DATA_KEY] = goog.json.serialize(message);\n    this.channel_.sendMap(rawJson);\n  } else {\n    this.channel_.sendMap(message);\n  }\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.prototype.disposeInternal = function() {\n  this.channel_.setHandler(null);\n  delete this.channelHandler_;\n  this.channel_.disconnect();\n  delete this.channel_;\n\n  WebChannelBaseTransport.Channel.base(this, 'disposeInternal');\n};\n\n\n\n/**\n * The message event.\n *\n * @param {!Array<?>|!Object} array The data array from the underlying channel.\n * @constructor\n * @extends {goog.net.WebChannel.MessageEvent}\n * @final\n */\nWebChannelBaseTransport.Channel.MessageEvent = function(array) {\n  WebChannelBaseTransport.Channel.MessageEvent.base(this, 'constructor');\n\n  // single-metadata only\n  var metadata = array['__sm__'];\n  if (metadata) {\n    this.metadataKey = goog.object.getAnyKey(metadata);\n    if (this.metadataKey) {\n      this.data = goog.object.get(metadata, this.metadataKey);\n    } else {\n      this.data = metadata;  // empty\n    }\n  } else {\n    this.data = array;\n  }\n};\ngoog.inherits(\n    WebChannelBaseTransport.Channel.MessageEvent,\n    goog.net.WebChannel.MessageEvent);\n\n\n\n/**\n * The error event.\n *\n * @param {WebChannelBase.Error} error The error code.\n * @constructor\n * @extends {goog.net.WebChannel.ErrorEvent}\n * @final\n */\nWebChannelBaseTransport.Channel.ErrorEvent = function(error) {\n  WebChannelBaseTransport.Channel.ErrorEvent.base(this, 'constructor');\n\n  /**\n   * High-level status code.\n   */\n  this.status = goog.net.WebChannel.ErrorStatus.NETWORK_ERROR;\n\n  /**\n   * @const {WebChannelBase.Error} Internal error code, for debugging use only.\n   */\n  this.errorCode = error;\n};\ngoog.inherits(\n    WebChannelBaseTransport.Channel.ErrorEvent, goog.net.WebChannel.ErrorEvent);\n\n\n\n/**\n * Implementation of {@link WebChannelBase.Handler} interface.\n *\n * @param {!WebChannelBaseTransport.Channel} channel The enclosing WebChannel.\n *\n * @constructor\n * @extends {WebChannelBase.Handler}\n * @private\n */\nWebChannelBaseTransport.Channel.Handler_ = function(channel) {\n  WebChannelBaseTransport.Channel.Handler_.base(this, 'constructor');\n\n  /**\n   * @type {!WebChannelBaseTransport.Channel}\n   * @private\n   */\n  this.channel_ = channel;\n};\ngoog.inherits(WebChannelBaseTransport.Channel.Handler_, WebChannelBase.Handler);\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.Handler_.prototype.channelOpened = function(\n    channel) {\n  goog.log.info(\n      this.channel_.logger_, 'WebChannel opened on ' + this.channel_.url_);\n  this.channel_.dispatchEvent(goog.net.WebChannel.EventType.OPEN);\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.Handler_.prototype.channelHandleArray =\n    function(channel, array) {\n  goog.asserts.assert(array, 'array expected to be defined');\n  this.channel_.dispatchEvent(\n      new WebChannelBaseTransport.Channel.MessageEvent(array));\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.Handler_.prototype.channelError = function(\n    channel, error) {\n  goog.log.info(\n      this.channel_.logger_, 'WebChannel aborted on ' + this.channel_.url_ +\n          ' due to channel error: ' + error);\n  this.channel_.dispatchEvent(\n      new WebChannelBaseTransport.Channel.ErrorEvent(error));\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.Handler_.prototype.channelClosed = function(\n    channel, opt_pendingMaps, opt_undeliveredMaps) {\n  goog.log.info(\n      this.channel_.logger_, 'WebChannel closed on ' + this.channel_.url_);\n  this.channel_.dispatchEvent(goog.net.WebChannel.EventType.CLOSE);\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.Channel.prototype.getRuntimeProperties = function() {\n  return new WebChannelBaseTransport.ChannelProperties(this.channel_);\n};\n\n\n\n/**\n * Implementation of the {@link goog.net.WebChannel.RuntimeProperties}.\n *\n * @param {!WebChannelBase} channel The underlying channel object.\n *\n * @constructor\n * @implements {goog.net.WebChannel.RuntimeProperties}\n * @final\n */\nWebChannelBaseTransport.ChannelProperties = function(channel) {\n  /**\n   * The underlying channel object.\n   *\n   * @private {!WebChannelBase}\n   */\n  this.channel_ = channel;\n\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.getConcurrentRequestLimit =\n    function() {\n  return this.channel_.getForwardChannelRequestPool().getMaxSize();\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.isSpdyEnabled = function() {\n  return this.getConcurrentRequestLimit() > 1;\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.getPendingRequestCount =\n    function() {\n  return this.channel_.getForwardChannelRequestPool().getRequestCount();\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.getHttpSessionId =\n    function() {\n  return this.channel_.getHttpSessionId();\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.commit = function(\n    callback) {\n  this.channel_.setForwardChannelFlushCallback(callback);\n};\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.getNonAckedMessageCount =\n    goog.abstractMethod;\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.notifyNonAckedMessageCount =\n    goog.abstractMethod;\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.onCommit =\n    goog.abstractMethod;\n\n\n/**\n * @override\n */\nWebChannelBaseTransport.ChannelProperties.prototype.ackCommit =\n    goog.abstractMethod;\n\n\n/** @override */\nWebChannelBaseTransport.ChannelProperties.prototype.getLastStatusCode =\n    function() {\n  return this.channel_.getLastStatusCode();\n};\n});  // goog.scope\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.json","^9L","~$goog.labs.net.webChannel.Wire","~$goog.labs.net.webChannel.ChannelRequest","^9>","^;P","^:L","^;Q","~$goog.net.WebChannel","~$goog.net.WebChannelTransport","~$goog.string.path","~$goog.labs.net.webChannel.WebChannelBase"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchannel/webchannelbasetransport.js"],"^:1",["^9K",["~$goog.labs.net.webChannel.WebChannelBaseTransport"]],"^9<",true,"^9=",["^9>","^:E","^:L","^<A","^<C","^<G","^<B","^;Q","^<D","^<E","^;P","^9L","^<F"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.propertyreplacer.js","^9C",["^9D","goog/testing/propertyreplacer.js"],"^9E","goog/testing/propertyreplacer.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Helper class for creating stubs for testing.\n *\n */\n\ngoog.setTestOnly('goog.testing.PropertyReplacer');\ngoog.provide('goog.testing.PropertyReplacer');\n\ngoog.require('goog.asserts');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Helper class for stubbing out variables and object properties for unit tests.\n * This class can change the value of some variables before running the test\n * cases, and to reset them in the tearDown phase.\n * See googletest.StubOutForTesting as an analogy in Python:\n * http://protobuf.googlecode.com/svn/trunk/python/stubout.py\n *\n * Example usage:\n *\n *     var stubs = new goog.testing.PropertyReplacer();\n *\n *     function setUp() {\n *       // Mock functions used in all test cases.\n *       stubs.replace(Math, 'random', function() {\n *         return 4;  // Chosen by fair dice roll. Guaranteed to be random.\n *       });\n *     }\n *\n *     function tearDown() {\n *       stubs.reset();\n *     }\n *\n *     function testThreeDice() {\n *       // Mock a constant used only in this test case.\n *       stubs.set(goog.global, 'DICE_COUNT', 3);\n *       assertEquals(12, rollAllDice());\n *     }\n *\n * Constraints on altered objects:\n * <ul>\n *   <li>DOM subclasses aren't supported.\n *   <li>The value of the objects' constructor property must either be equal to\n *       the real constructor or kept untouched.\n * </ul>\n *\n * Code compiled with property renaming may need to use\n * `goog.reflect.objectProperty` instead of simply naming the property to\n * replace.\n *\n * @constructor\n * @final\n */\ngoog.testing.PropertyReplacer = function() {\n  /**\n   * Stores the values changed by the set() method in chronological order.\n   * Its items are objects with 3 fields: 'object', 'key', 'value'. The\n   * original value for the given key in the given object is stored under the\n   * 'value' key.\n   * @type {Array<{ object: ?, key: string, value: ? }>}\n   * @private\n   */\n  this.original_ = [];\n};\n\n\n/**\n * Indicates that a key didn't exist before having been set by the set() method.\n * @private @const\n */\ngoog.testing.PropertyReplacer.NO_SUCH_KEY_ = {};\n\n\n/**\n * Tells if the given key exists in the object. Ignores inherited fields.\n * @param {!Object|!Function} obj The JavaScript or native object or function\n *     whose key is to be checked.\n * @param {string} key The key to check.\n * @return {boolean} Whether the object has the key as own key.\n * @private\n * @suppress {unusedLocalVariables}\n */\ngoog.testing.PropertyReplacer.hasKey_ = function(obj, key) {\n  if (!(key in obj)) {\n    return false;\n  }\n  // hasOwnProperty is only reliable with JavaScript objects. It returns false\n  // for built-in DOM attributes.\n  if (Object.prototype.hasOwnProperty.call(obj, key)) {\n    return true;\n  }\n  // In all browsers except Opera obj.constructor never equals to Object if\n  // obj is an instance of a native class. In Opera we have to fall back on\n  // examining obj.toString().\n  if (obj.constructor == Object &&\n      (!goog.userAgent.OPERA ||\n       Object.prototype.toString.call(obj) == '[object Object]')) {\n    return false;\n  }\n  try {\n    // Firefox hack to consider \"className\" part of the HTML elements or\n    // \"body\" part of document. Although they are defined in the prototype of\n    // HTMLElement or Document, accessing them this way throws an exception.\n    // <pre>\n    //   var dummy = document.body.constructor.prototype.className\n    //   [Exception... \"Cannot modify properties of a WrappedNative\"]\n    // </pre>\n    var dummy = obj.constructor.prototype[key];\n  } catch (e) {\n    return true;\n  }\n  return !(key in obj.constructor.prototype);\n};\n\n\n/**\n * Deletes a key from an object. Sets it to undefined or empty string if the\n * delete failed.\n * @param {!Object|!Function} obj The object or function to delete a key from.\n * @param {string} key The key to delete.\n * @throws {Error} In case of trying to set a read-only property\n * @private\n */\ngoog.testing.PropertyReplacer.deleteKey_ = function(obj, key) {\n  try {\n    delete obj[key];\n    // Delete has no effect for built-in properties of DOM nodes in FF.\n    if (!goog.testing.PropertyReplacer.hasKey_(obj, key)) {\n      return;\n    }\n  } catch (e) {\n    // IE throws TypeError when trying to delete properties of native objects\n    // (e.g. DOM nodes or window), even if they have been added by JavaScript.\n  }\n\n  obj[key] = undefined;\n  if (obj[key] == 'undefined') {\n    // Some properties such as className in IE are always evaluated as string\n    // so undefined will become 'undefined'.\n    obj[key] = '';\n  }\n\n  if (obj[key]) {\n    throw new Error(\n        'Cannot delete non configurable property \"' + key + '\" in ' + obj);\n  }\n};\n\n\n/**\n * Restore the original state of a key in an object.\n * @param {{ object: ?, key: string, value: ? }} original Original state\n * @private\n */\ngoog.testing.PropertyReplacer.restoreOriginal_ = function(original) {\n  if (original.value == goog.testing.PropertyReplacer.NO_SUCH_KEY_) {\n    goog.testing.PropertyReplacer.deleteKey_(original.object, original.key);\n  } else {\n    original.object[original.key] = original.value;\n  }\n};\n\n\n/**\n * Adds or changes a value in an object while saving its original state.\n * @param {Object|Function} obj The JavaScript or native object or function to\n *     alter. See the constraints in the class description.\n * @param {string} key The key to change the value for.\n * @param {*} value The new value to set.\n * @throws {Error} In case of trying to set a read-only property.\n */\ngoog.testing.PropertyReplacer.prototype.set = function(obj, key, value) {\n  goog.asserts.assert(obj);\n  var origValue = goog.testing.PropertyReplacer.hasKey_(obj, key) ?\n      obj[key] :\n      goog.testing.PropertyReplacer.NO_SUCH_KEY_;\n  this.original_.push({object: obj, key: key, value: origValue});\n  obj[key] = value;\n\n  // Check whether obj[key] was a read-only value and the assignment failed.\n  // Also, check that we're not comparing returned pixel values when \"value\"\n  // is 0. In other words, account for this case:\n  // document.body.style.margin = 0;\n  // document.body.style.margin; // returns \"0px\"\n  if (obj[key] != value && (value + 'px') != obj[key]) {\n    throw new Error(\n        'Cannot overwrite read-only property \"' + key + '\" in ' + obj);\n  }\n};\n\n\n/**\n * Changes an existing value in an object to another one of the same type while\n * saving its original state. The advantage of `replace` over {@link #set}\n * is that `replace` protects against typos and erroneously passing tests\n * after some members have been renamed during a refactoring.\n * @param {Object|Function} obj The JavaScript or native object or function to\n *     alter. See the constraints in the class description.\n * @param {string} key The key to change the value for. It has to be present\n *     either in `obj` or in its prototype chain.\n * @param {*} value The new value to set.\n * @param {boolean=} opt_allowNullOrUndefined By default, this method requires\n *     `value` to match the type of the existing value, as determined by\n *     {@link goog.typeOf}. Setting opt_allowNullOrUndefined to `true`\n *     allows an existing value to be replaced by `null` or\n       `undefined`, or vice versa.\n * @throws {Error} In case of missing key or type mismatch.\n */\ngoog.testing.PropertyReplacer.prototype.replace = function(\n    obj, key, value, opt_allowNullOrUndefined) {\n  if (!(key in obj)) {\n    throw new Error('Cannot replace missing property \"' + key + '\" in ' + obj);\n  }\n  // If opt_allowNullOrUndefined is true, then we do not check the types if\n  // either the original or new value is null or undefined.\n  var shouldCheckTypes =\n      !opt_allowNullOrUndefined || (obj[key] != null && value != null);\n  if (shouldCheckTypes) {\n    var originalType = goog.typeOf(obj[key]);\n    var newType = goog.typeOf(value);\n    if (originalType != newType) {\n      throw new Error(\n          'Cannot replace property \"' + key + '\" in ' + obj +\n          ' with a value of different type (expected ' + originalType +\n          ', found ' + newType + ')');\n    }\n  }\n  this.set(obj, key, value);\n};\n\n\n/**\n * Builds an object structure for the provided namespace path.  Doesn't\n * overwrite those prefixes of the path that are already objects or functions.\n * @param {string} path The path to create or alter, e.g. 'goog.ui.Menu'.\n * @param {*} value The value to set.\n */\ngoog.testing.PropertyReplacer.prototype.setPath = function(path, value) {\n  var parts = path.split('.');\n  var obj = goog.global;\n  for (var i = 0; i < parts.length - 1; i++) {\n    var part = parts[i];\n    if (part == 'prototype' && !obj[part]) {\n      throw new Error(\n          'Cannot set the prototype of ' + parts.slice(0, i).join('.'));\n    }\n    if (!goog.isObject(obj[part]) && !goog.isFunction(obj[part])) {\n      this.set(obj, part, {});\n    }\n    obj = obj[part];\n  }\n  this.set(obj, parts[parts.length - 1], value);\n};\n\n\n/**\n * Deletes the key from the object while saving its original value.\n * @param {Object|Function} obj The JavaScript or native object or function to\n *     alter. See the constraints in the class description.\n * @param {string} key The key to delete.\n */\ngoog.testing.PropertyReplacer.prototype.remove = function(obj, key) {\n  if (obj && goog.testing.PropertyReplacer.hasKey_(obj, key)) {\n    this.original_.push({object: obj, key: key, value: obj[key]});\n    goog.testing.PropertyReplacer.deleteKey_(obj, key);\n  }\n};\n\n\n/**\n * Restore the original state of key in an object.\n * @param {!Object|!Function} obj The JavaScript or native object whose state\n *     should be restored.\n * @param {string} key The key to restore the original value for.\n * @throws {Error} In case the object/key pair hadn't been modified earlier.\n */\ngoog.testing.PropertyReplacer.prototype.restore = function(obj, key) {\n  for (var i = this.original_.length - 1; i >= 0; i--) {\n    var original = this.original_[i];\n    if (original.object === obj && original.key == key) {\n      goog.testing.PropertyReplacer.restoreOriginal_(original);\n      this.original_.splice(i, 1);\n      return;\n    }\n  }\n  throw new Error('Cannot restore unmodified property \"' + key + '\" of ' + obj);\n};\n\n\n/**\n * Resets all changes made by goog.testing.PropertyReplacer.prototype.set.\n */\ngoog.testing.PropertyReplacer.prototype.reset = function() {\n  for (var i = this.original_.length - 1; i >= 0; i--) {\n    goog.testing.PropertyReplacer.restoreOriginal_(this.original_[i]);\n    delete this.original_[i];\n  }\n  this.original_.length = 0;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9>","^:S"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/propertyreplacer.js"],"^:1",["^9K",["^:5"]],"^9<",true,"^9=",["^9>","^:E","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.filterobservingmenuitem.js","^9C",["^9D","goog/ui/filterobservingmenuitem.js"],"^9E","goog/ui/filterobservingmenuitem.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Menu item observing the filter text in a\n * {@link goog.ui.FilteredMenu}. The observer method is called when the filter\n * text changes and allows the menu item to update its content and state based\n * on the filter.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.ui.FilterObservingMenuItem');\n\ngoog.require('goog.ui.FilterObservingMenuItemRenderer');\ngoog.require('goog.ui.MenuItem');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Class representing a filter observing menu item.\n *\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to\n *     display as the content of the item (use to add icons or styling to\n *     menus).\n * @param {*=} opt_model Data/model associated with the menu item.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper used for\n *     document interactions.\n * @param {goog.ui.MenuItemRenderer=} opt_renderer Optional renderer.\n * @constructor\n * @extends {goog.ui.MenuItem}\n */\ngoog.ui.FilterObservingMenuItem = function(\n    content, opt_model, opt_domHelper, opt_renderer) {\n  goog.ui.MenuItem.call(\n      this, content, opt_model, opt_domHelper,\n      opt_renderer || new goog.ui.FilterObservingMenuItemRenderer());\n};\ngoog.inherits(goog.ui.FilterObservingMenuItem, goog.ui.MenuItem);\ngoog.tagUnsealableClass(goog.ui.FilterObservingMenuItem);\n\n\n/**\n * Function called when the filter text changes.\n * @type {?Function} function(goog.ui.FilterObservingMenuItem, string)\n * @private\n */\ngoog.ui.FilterObservingMenuItem.prototype.observer_ = null;\n\n\n/** @override */\ngoog.ui.FilterObservingMenuItem.prototype.enterDocument = function() {\n  goog.ui.FilterObservingMenuItem.superClass_.enterDocument.call(this);\n  this.callObserver();\n};\n\n\n/**\n * Sets the observer functions.\n * @param {Function} f function(goog.ui.FilterObservingMenuItem, string).\n */\ngoog.ui.FilterObservingMenuItem.prototype.setObserver = function(f) {\n  this.observer_ = f;\n  this.callObserver();\n};\n\n\n/**\n * Calls the observer function if one has been specified.\n * @param {?string=} opt_str Filter string.\n */\ngoog.ui.FilterObservingMenuItem.prototype.callObserver = function(opt_str) {\n  if (this.observer_) {\n    this.observer_(this, opt_str || '');\n  }\n};\n\n\n// Register a decorator factory function for\n// goog.ui.FilterObservingMenuItemRenderer.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.FilterObservingMenuItemRenderer.CSS_CLASS, function() {\n      // FilterObservingMenuItem defaults to using\n      // FilterObservingMenuItemRenderer.\n      return new goog.ui.FilterObservingMenuItem(null);\n    });\n","^9I",1579837703000,"^9J",["^9K",["~$goog.ui.FilterObservingMenuItemRenderer","^9>","^:>","^:?"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/filterobservingmenuitem.js"],"^:1",["^9K",["~$goog.ui.FilterObservingMenuItem"]],"^9<",true,"^9=",["^9>","^<I","^:?","^:>"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.streams.full_impl.js","^9C",["^9D","goog/streams/full_impl.js"],"^9E","goog/streams/full_impl.js","^9F","^9G","^9H","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A full ponyfill of the ReadableStream native API.\n */\ngoog.module('goog.streams.fullImpl');\n\nconst NativeResolver = goog.require('goog.promise.NativeResolver');\nconst fullTypes = goog.require('goog.streams.fullTypes');\nconst liteImpl = goog.require('goog.streams.liteImpl');\nconst {assert, assertNumber} = goog.require('goog.asserts');\n\n/**\n * @typedef {function(!ReadableStreamDefaultController):\n * (!Promise<undefined>|undefined)}\n */\nlet StartAlgorithm;\n\n/** @typedef {function(*): !Promise<undefined>} */\nlet CancelAlgorithm;\n\n/**\n * @typedef {function(!ReadableStreamDefaultController): !Promise<undefined>}\n */\nlet PullAlgorithm;\n\n/**\n * The implemenation of ReadableStream.\n * @template T\n * @implements {fullTypes.ReadableStream<T>}\n */\nclass ReadableStream extends liteImpl.ReadableStream {\n  /** @package */\n  constructor() {\n    super();\n\n    /**\n     * Returns an AsyncIterator over the ReadableStream.\n     * https://streams.spec.whatwg.org/#rs-asynciterator\n     * @return {!AsyncIterator<!IIterableResult<T>>}\n     */\n    this[Symbol.asyncIterator] = this.getIterator;\n\n    /** @package {boolean} */\n    this.disturbed = false;\n  }\n\n  /**\n   * Returns a ReadableStreamDefaultReader that enables reading chunks from\n   * the source.\n   * https://streams.spec.whatwg.org/#rs-get-reader\n   * @return {!ReadableStreamDefaultReader<T>}\n   * @override\n   */\n  getReader() {\n    return this.reader = new ReadableStreamDefaultReader(this);\n  }\n\n  /**\n   * Cancels the ReadableStream with an optional reason.\n   * https://streams.spec.whatwg.org/#rs-cancel\n   * @param {*} reason\n   * @return {!Promise<undefined>}\n   * @override\n   */\n  cancel(reason) {\n    if (this.locked) {\n      return Promise.reject(new TypeError('Cannot cancel a locked stream'));\n    }\n    return this.cancelInternal(reason);\n  }\n\n  /**\n   * Returns an AyncIterator over the ReadableStream.\n   *\n   * If preventCancel is passed as an option, calling the return() method on the\n   * iterator will terminate the iterator, but will not cancel the\n   * ReadableStream.\n   * https://streams.spec.whatwg.org/#rs-get-iterator\n   * @param {{preventCancel: boolean}=} options\n   * @return {!AsyncIterator<T>}\n   * @override\n   */\n  getIterator({preventCancel = false} = {}) {\n    return new ReadableStreamAsyncIterator(this.getReader(), preventCancel);\n  }\n\n  /**\n   * Returns an Array with two elements, both new ReadableStreams that contain\n   * the same data as this ReadableStream. This stream will become permanently\n   * locked.\n   * https://streams.spec.whatwg.org/#rs-tee\n   * @return {!Array<!ReadableStream>}\n   * @override\n   */\n  tee() {\n    const reader = this.getReader();\n    let reading = false;\n    let canceled1 = false;\n    let canceled2 = false;\n    let reason1;\n    let reason2;\n    let branch1;\n    let branch2;\n    const cancelResolver = new NativeResolver();\n    const pullAlgorithm = () => {\n      if (reading) {\n        return Promise.resolve();\n      }\n      reading = true;\n      reader.read()\n          .then(({value, done}) => {\n            reading = false;\n            if (done) {\n              if (!canceled1) {\n                branch1.readableStreamController.close();\n              }\n              if (!canceled2) {\n                branch2.readableStreamController.close();\n              }\n              return;\n            }\n            if (!canceled1) {\n              branch1.readableStreamController.enqueue(value);\n            }\n            if (!canceled2) {\n              branch2.readableStreamController.enqueue(value);\n            }\n          })\n          .catch(() => {});\n      return Promise.resolve();\n    };\n    const cancel1Algorithm = (reason) => {\n      canceled1 = true;\n      reason1 = reason;\n      if (canceled2) {\n        const cancelResult = this.cancelInternal([reason1, reason2]);\n        cancelResolver.resolve(cancelResult);\n      }\n      return cancelResolver.promise;\n    };\n    const cancel2Algorithm = (reason) => {\n      canceled2 = true;\n      reason2 = reason;\n      if (canceled1) {\n        const cancelResult = this.cancelInternal([reason1, reason2]);\n        cancelResolver.resolve(cancelResult);\n      }\n      return cancelResolver.promise;\n    };\n    const startAlgorithm = () => {};\n    branch1 = new ReadableStream();\n    const controller1 = new ReadableStreamDefaultController(\n        branch1, cancel1Algorithm, pullAlgorithm, /* highWaterMark= */ 1,\n        /* size= */ undefined);\n    branch1.readableStreamController = controller1;\n    controller1.start(startAlgorithm);\n    branch2 = new ReadableStream();\n    const controller2 = new ReadableStreamDefaultController(\n        branch2, cancel2Algorithm, pullAlgorithm, /* highWatermark= */ 1,\n        /* size= */ undefined);\n    branch2.readableStreamController = controller2;\n    controller2.start(startAlgorithm);\n    reader.closed.catch((reason) => {\n      controller1.error(reason);\n      controller2.error(reason);\n    });\n    return [branch1, branch2];\n  }\n\n  /**\n   * @param {*} reason\n   * @return {!Promise<undefined>}\n   * @package\n   */\n  cancelInternal(reason) {\n    this.disturbed = true;\n    if (this.state === liteImpl.ReadableStream.State.CLOSED) {\n      return Promise.resolve();\n    }\n    if (this.state === liteImpl.ReadableStream.State.ERRORED) {\n      return Promise.reject(this.storedError);\n    }\n    this.close();\n    return /** @type {!ReadableStreamDefaultController} */ (\n               this.readableStreamController)\n        .cancelSteps(reason)\n        .then(() => {});\n  }\n}\n\n/**\n * Creates and returns a new ReadableStream.\n *\n * The underlying source should only have a start() method, and no other\n * properties.\n * @param {!fullTypes.ReadableStreamUnderlyingSource<T>=} underlyingSource\n * @param {!fullTypes.ReadableStreamStrategy<T>=} strategy\n * @return {!ReadableStream<T>}\n * @suppress {strictMissingProperties}\n * @template T\n */\nfunction newReadableStream(underlyingSource = {}, strategy = {}) {\n  const verifyObject =\n      /** @type {!Object} */ (underlyingSource);\n  assert(\n      !(verifyObject.type),\n      `'type' property not allowed on an underlying source for a ` +\n          'liteImpl ReadableStream');\n  assert(\n      !(verifyObject.autoAllocateChunkSize),\n      `'autoAllocateChunkSize' property not allowed on an underlying ` +\n          'source for a liteImpl ReadableStream');\n  const startAlgorithm = underlyingSource.start ?\n      (controller) => underlyingSource.start(controller) :\n      () => {};\n  const cancelAlgorithm = underlyingSource.cancel ? (reason) => {\n    try {\n      return Promise.resolve(underlyingSource.cancel(reason));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  } : undefined;\n  const pullAlgorithm = underlyingSource.pull ? (controller) => {\n    try {\n      return Promise.resolve(underlyingSource.pull(controller));\n    } catch (e) {\n      return Promise.reject(e);\n    }\n  } : undefined;\n  const highWaterMark =\n      strategy.highWaterMark === undefined ? 1 : strategy.highWaterMark;\n  const sizeAlgorithm = strategy.size ?\n      (chunk) => strategy.size.call(undefined, chunk) :\n      undefined;\n  const stream = new ReadableStream();\n  const controller = new ReadableStreamDefaultController(\n      stream, cancelAlgorithm, pullAlgorithm, highWaterMark, sizeAlgorithm);\n  stream.readableStreamController = controller;\n  controller.start(startAlgorithm);\n  return stream;\n}\n\n/**\n * The DefaultReader for a ReadableStream. Adds cancellation onto the liteImpl\n * DefaultReader.\n * @template T\n * @implements {fullTypes.ReadableStreamDefaultReader<T>}\n */\nclass ReadableStreamDefaultReader extends liteImpl.ReadableStreamDefaultReader {\n  /**\n   * Cancels the ReadableStream with an optional reason.\n   * https://streams.spec.whatwg.org/#default-reader-cancel\n   * @param {*} reason\n   * @return {!Promise<undefined>}\n   * @override\n   */\n  cancel(reason) {\n    if (!this.ownerReadableStream) {\n      return Promise.reject(new TypeError(\n          'This readable stream reader has been released and cannot be used ' +\n          'to cancel its previous owner stream'));\n    }\n    return /** @type {!ReadableStream} */ (this.ownerReadableStream)\n        .cancelInternal(reason);\n  }\n}\n\n/**\n * @template T\n * @implements {fullTypes.ReadableStreamAsyncIterator<T>}\n */\nclass ReadableStreamAsyncIterator {\n  /**\n   * @param {!ReadableStreamDefaultReader<T>} asyncIteratorReader\n   * @param {boolean} preventCancel\n   * @package\n   */\n  constructor(asyncIteratorReader, preventCancel) {\n    /** @package @const {!ReadableStreamDefaultReader<T>} */\n    this.asyncIteratorReader = asyncIteratorReader;\n\n    /** @package @const {boolean} */\n    this.preventCancel = preventCancel;\n  }\n\n  /**\n   * Gets the next value from the ReadableStream.\n   * https://streams.spec.whatwg.org/#rs-asynciterator-prototype-next\n   * @override\n   */\n  next() {\n    if (!this.asyncIteratorReader.ownerReadableStream) {\n      return Promise.reject(\n          new TypeError('There is no more data left in the ReadableStream'));\n    }\n    return this.asyncIteratorReader.read().then(({value, done}) => {\n      if (done) {\n        this.asyncIteratorReader.release();\n      }\n      return {value, done};\n    });\n  }\n\n  /**\n   * Cancels the underlying stream and resolves with the value.\n   * @param {*} value\n   * @return {!Promise<!IIterableResult<T>>}\n   * @override\n   */\n  return(value) {\n    if (!this.asyncIteratorReader.ownerReadableStream) {\n      return Promise.reject(\n          new TypeError('There is no more data left in the ReadableStream'));\n    }\n    if (this.asyncIteratorReader.readRequests.length) {\n      return Promise.reject(new TypeError(\n          'There are pending read requests in the ReadableStream'));\n    }\n    if (!this.preventCancel) {\n      const result = this.asyncIteratorReader.cancel(value);\n      this.asyncIteratorReader.release();\n      return result.then(() => ({done: true, value}));\n    }\n    this.asyncIteratorReader.release();\n    return Promise.resolve({done: true, value});\n  }\n}\n\n/**\n * The controller for a ReadableStream. Adds cancellation and backpressure onto\n * the liteImpl DefaultController.\n * @template T\n * @implements {fullTypes.ReadableStreamDefaultController}\n */\nclass ReadableStreamDefaultController extends\n    liteImpl.ReadableStreamDefaultController {\n  /**\n   * @param {!ReadableStream} stream\n   * @param {!CancelAlgorithm|undefined} cancelAlgorithm\n   * @param {!PullAlgorithm|undefined} pullAlgorithm\n   * @param {number} strategyHWM\n   * @param {(function(T): number)|undefined} strategySizeAlgorithm\n   * @package\n   */\n  constructor(\n      stream, cancelAlgorithm, pullAlgorithm, strategyHWM,\n      strategySizeAlgorithm) {\n    super(stream);\n\n    /** @private {!CancelAlgorithm|undefined} */\n    this.cancelAlgorithm_ = cancelAlgorithm;\n\n    /** @private {boolean} */\n    this.pullAgain_ = false;\n\n    /** @private {!PullAlgorithm|undefined} */\n    this.pullAlgorithm_ = pullAlgorithm;\n\n    /** @private {boolean} */\n    this.pulling_ = false;\n\n    /** @private {number} */\n    this.queueTotalSize_ = 0;\n\n    /** @private {boolean} */\n    this.started_ = false;\n\n    /** @private @const {number} */\n    this.strategyHWM_ = strategyHWM;\n\n    /** @private {(function(T): number)|undefined} */\n    this.strategySizeAlgorithm_ = strategySizeAlgorithm;\n\n    /** @private @const {!QueueWithSizes<T>} */\n    this.queueWithSizes_ = new QueueWithSizes(this.queue);\n  }\n\n  /**\n   * Returns the desired size to fill the controlled stream's internal queue. It\n   * can be negative if the queue is full.\n   * https://streams.spec.whatwg.org/#rs-default-controller-desired-size\n   * @return {?number}\n   * @override\n   */\n  get desiredSize() {\n    return this.getDesiredSize_();\n  }\n\n  /** @override */\n  started() {\n    this.started_ = true;\n    this.callPullIfNeeded();\n  }\n\n  /** @override */\n  callPullIfNeeded() {\n    if (!this.pullAlgorithm_ || !this.shouldCallPull_()) {\n      return;\n    }\n    if (this.pulling_) {\n      this.pullAgain_ = true;\n      return;\n    }\n    this.pulling_ = true;\n    this.pullAlgorithm_(this).then(\n        () => {\n          this.pulling_ = false;\n          if (this.pullAgain_) {\n            this.pullAgain_ = false;\n            this.callPullIfNeeded();\n          }\n        },\n        (error) => {\n          this.error(error);\n        });\n  }\n\n  /**\n   * @return {boolean}\n   * @private\n   */\n  shouldCallPull_() {\n    if (!this.canCloseOrEnqueue()) {\n      return false;\n    }\n    if (!this.started_) {\n      return false;\n    }\n    if (this.controlledReadableStream.locked &&\n        this.controlledReadableStream.getNumReadRequests() > 0) {\n      return true;\n    }\n    return assertNumber(this.getDesiredSize_()) > 0;\n  }\n\n  /** @override */\n  clearAlgorithms() {\n    this.cancelAlgorithm_ = undefined;\n    this.pullAlgorithm_ = undefined;\n    this.strategySizeAlgorithm_ = undefined;\n  }\n\n  /**\n   * @param {*} reason\n   * @return {!Promise<*>}\n   * @package\n   */\n  cancelSteps(reason) {\n    this.queue.resetQueue();\n    const cancelResult = this.cancelAlgorithm_ ? this.cancelAlgorithm_(reason) :\n                                                 Promise.resolve();\n    this.clearAlgorithms();\n    return cancelResult;\n  }\n\n  /** @override */\n  enqueueIntoQueue(chunk) {\n    let size;\n    try {\n      // Default to size of 1 if no algorithm is specified.\n      size = Number(\n          this.strategySizeAlgorithm_ ? this.strategySizeAlgorithm_(chunk) : 1);\n    } catch (e) {\n      this.error(e);\n      throw e;\n    }\n    if (typeof size !== 'number' || Number.isNaN(size) || size < 0 ||\n        size === Infinity) {\n      throw new RangeError(\n          `The return value of a queuing strategy's size function must be a` +\n          ' finite, non-NaN, non-negative number');\n    }\n    this.queueTotalSize_ += size;\n    this.queueWithSizes_.enqueueValueWithSize(chunk, size);\n  }\n\n  /** @override */\n  dequeueFromQueue() {\n    const {value, size} = this.queueWithSizes_.dequeueValueWithSize();\n    this.queueTotalSize_ -= size;\n    if (this.queueTotalSize_ < 0) {\n      // This might be less than zero due to rounding errors.\n      this.queueTotalSize_ = 0;\n    }\n    return value;\n  }\n\n  /** @override */\n  resetQueue() {\n    this.queueWithSizes_.resetQueue();\n  }\n\n  /**\n   * @return {?number}\n   * @private\n   */\n  getDesiredSize_() {\n    if (this.controlledReadableStream.state ===\n        liteImpl.ReadableStream.State.ERRORED) {\n      return null;\n    }\n    if (this.controlledReadableStream.state ===\n        liteImpl.ReadableStream.State.CLOSED) {\n      return 0;\n    }\n    return this.strategyHWM_ - this.queueTotalSize_;\n  }\n}\n\n/**\n * An internal Queue representation that wraps a queue and has a size associated\n * with each chunk.\n * @template T\n * @package\n */\nclass QueueWithSizes {\n  /**\n   * @param {!liteImpl.Queue} queue\n   */\n  constructor(queue) {\n    /**\n     * @private @const {!liteImpl.Queue}\n     */\n    this.queue_ = queue;\n\n    /**\n     * @private {!Array<number>}\n     */\n    this.sizes_ = [];\n  }\n\n  /**\n   * @param {T} chunk\n   * @param {number} size\n   */\n  enqueueValueWithSize(chunk, size) {\n    this.queue_.enqueueValue(chunk);\n    this.sizes_.push(size);\n  }\n\n  /**\n   * @return {{value: T, size: number}}\n   */\n  dequeueValueWithSize() {\n    return {\n      value: this.queue_.dequeueValue(),\n      size: this.sizes_.shift(),\n    };\n  }\n\n  /**\n   * @return {void}\n   */\n  resetQueue() {\n    this.queue_.resetQueue();\n    this.sizes_ = [];\n  }\n}\n\nexports = {\n  ReadableStream,\n  ReadableStreamAsyncIterator,\n  ReadableStreamDefaultController,\n  ReadableStreamDefaultReader,\n  newReadableStream,\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9>","~$goog.streams.liteImpl","~$goog.promise.NativeResolver","~$goog.streams.fullTypes"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/streams/full_impl.js"],"^:1",["^9K",["~$goog.streams.fullImpl"]],"^9<",true,"^9=",["^9>","^<L","^<M","^<K","^:E"]],["^ ","^9A",[1579837703000],"^9B","goog.net.browserchannel.js","^9C",["^9D","goog/net/browserchannel.js"],"^9E","goog/net/browserchannel.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the BrowserChannel class.  A BrowserChannel\n * simulates a bidirectional socket over HTTP. It is the basis of the\n * Gmail Chat IM connections to the server.\n *\n * Typical usage will look like\n *  var handler = [handler object];\n *  var channel = new BrowserChannel(clientVersion);\n *  channel.setHandler(handler);\n *  channel.connect('channel/test', 'channel/bind');\n *\n * See goog.net.BrowserChannel.Handler for the handler interface.\n *\n */\n\n\ngoog.provide('goog.net.BrowserChannel');\ngoog.provide('goog.net.BrowserChannel.Error');\ngoog.provide('goog.net.BrowserChannel.Event');\ngoog.provide('goog.net.BrowserChannel.Handler');\ngoog.provide('goog.net.BrowserChannel.LogSaver');\ngoog.provide('goog.net.BrowserChannel.QueuedMap');\ngoog.provide('goog.net.BrowserChannel.ServerReachability');\ngoog.provide('goog.net.BrowserChannel.ServerReachabilityEvent');\ngoog.provide('goog.net.BrowserChannel.Stat');\ngoog.provide('goog.net.BrowserChannel.StatEvent');\ngoog.provide('goog.net.BrowserChannel.State');\ngoog.provide('goog.net.BrowserChannel.TimingEvent');\n\ngoog.require('goog.Uri');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.debug.TextFormatter');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.json');\ngoog.require('goog.json.NativeJsonProcessor');\ngoog.require('goog.log');\ngoog.require('goog.net.BrowserTestChannel');\ngoog.require('goog.net.ChannelDebug');\ngoog.require('goog.net.ChannelRequest');\ngoog.require('goog.net.XhrIo');\ngoog.require('goog.net.tmpnetwork');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.structs');\ngoog.require('goog.structs.CircularBuffer');\n\n\n\n/**\n * Encapsulates the logic for a single BrowserChannel.\n *\n * @param {string=} opt_clientVersion An application-specific version number\n *        that is sent to the server when connected.\n * @param {Array<string>=} opt_firstTestResults Previously determined results\n *        of the first browser channel test.\n * @param {boolean=} opt_secondTestResults Previously determined results\n *        of the second browser channel test.\n * @param {boolean=} opt_asyncTest Whether to perform the test requests\n *        asynchronously. While the test is performed, we'll assume the worst\n *        (connection is buffered), in order to avoid delaying the connection\n *        until the test is performed.\n * @constructor\n */\ngoog.net.BrowserChannel = function(\n    opt_clientVersion, opt_firstTestResults, opt_secondTestResults,\n    opt_asyncTest) {\n  /**\n   * The application specific version that is passed to the server.\n   * @type {?string}\n   * @private\n   */\n  this.clientVersion_ = opt_clientVersion || null;\n\n  /**\n   * The current state of the BrowserChannel. It should be one of the\n   * goog.net.BrowserChannel.State constants.\n   * @type {!goog.net.BrowserChannel.State}\n   * @private\n   */\n  this.state_ = goog.net.BrowserChannel.State.INIT;\n\n  /**\n   * An array of queued maps that need to be sent to the server.\n   * @type {Array<goog.net.BrowserChannel.QueuedMap>}\n   * @private\n   */\n  this.outgoingMaps_ = [];\n\n  /**\n   * An array of dequeued maps that we have either received a non-successful\n   * response for, or no response at all, and which therefore may or may not\n   * have been received by the server.\n   * @type {Array<goog.net.BrowserChannel.QueuedMap>}\n   * @private\n   */\n  this.pendingMaps_ = [];\n\n  /**\n   * The channel debug used for browserchannel logging\n   * @type {!goog.net.ChannelDebug}\n   * @private\n   */\n  this.channelDebug_ = new goog.net.ChannelDebug();\n\n  /**\n   * Parser for a response payload. The parser should return an array.\n   * @type {!goog.string.Parser}\n   * @private\n   */\n  this.parser_ = new goog.json.NativeJsonProcessor();\n\n  /**\n   * An array of results for the first browser channel test call.\n   * @type {Array<string>}\n   * @private\n   */\n  this.firstTestResults_ = opt_firstTestResults || null;\n\n  /**\n   * The results of the second browser channel test. True implies the\n   * connection is buffered, False means unbuffered, null means that\n   * the results are not available.\n   * @private\n   */\n  this.secondTestResults_ =\n      (opt_secondTestResults != null) ? opt_secondTestResults : null;\n\n  /**\n   * Whether to perform the test requests asynchronously. While the test is\n   * performed, we'll assume the worst (connection is buffered), in order to\n   * avoid delaying the connection until the test is performed.\n   * @private {boolean}\n   */\n  this.asyncTest_ = opt_asyncTest || false;\n};\n\n\n\n/**\n * Simple container class for a (mapId, map) pair.\n * @param {number} mapId The id for this map.\n * @param {Object|goog.structs.Map} map The map itself.\n * @param {Object=} opt_context The context associated with the map.\n * @constructor\n * @final\n */\ngoog.net.BrowserChannel.QueuedMap = function(mapId, map, opt_context) {\n  /**\n   * The id for this map.\n   * @type {number}\n   */\n  this.mapId = mapId;\n\n  /**\n   * The map itself.\n   * @type {Object}\n   */\n  this.map = map;\n\n  /**\n   * The context for the map.\n   * @type {Object}\n   */\n  this.context = opt_context || null;\n};\n\n\n/**\n * Extra HTTP headers to add to all the requests sent to the server.\n * @type {?Object}\n * @private\n */\ngoog.net.BrowserChannel.prototype.extraHeaders_ = null;\n\n\n/**\n * Extra parameters to add to all the requests sent to the server.\n * @type {?Object}\n * @private\n */\ngoog.net.BrowserChannel.prototype.extraParams_ = null;\n\n\n/**\n * The current ChannelRequest object for the forwardchannel.\n * @type {goog.net.ChannelRequest?}\n * @private\n */\ngoog.net.BrowserChannel.prototype.forwardChannelRequest_ = null;\n\n\n/**\n * The ChannelRequest object for the backchannel.\n * @type {goog.net.ChannelRequest?}\n * @private\n */\ngoog.net.BrowserChannel.prototype.backChannelRequest_ = null;\n\n\n/**\n * The relative path (in the context of the the page hosting the browser\n * channel) for making requests to the server.\n * @type {?string}\n * @private\n */\ngoog.net.BrowserChannel.prototype.path_ = null;\n\n\n/**\n * The absolute URI for the forwardchannel request.\n * @type {?goog.Uri}\n * @private\n */\ngoog.net.BrowserChannel.prototype.forwardChannelUri_ = null;\n\n\n/**\n * The absolute URI for the backchannel request.\n * @type {?goog.Uri}\n * @private\n */\ngoog.net.BrowserChannel.prototype.backChannelUri_ = null;\n\n\n/**\n * A subdomain prefix for using a subdomain in IE for the backchannel\n * requests.\n * @type {?string}\n * @private\n */\ngoog.net.BrowserChannel.prototype.hostPrefix_ = null;\n\n\n/**\n * Whether we allow the use of a subdomain in IE for the backchannel requests.\n * @private\n */\ngoog.net.BrowserChannel.prototype.allowHostPrefix_ = true;\n\n\n/**\n * The next id to use for the RID (request identifier) parameter. This\n * identifier uniquely identifies the forward channel request.\n * @type {number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.nextRid_ = 0;\n\n\n/**\n * The id to use for the next outgoing map. This identifier uniquely\n * identifies a sent map.\n * @type {number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.nextMapId_ = 0;\n\n\n/**\n * Whether to fail forward-channel requests after one try, or after a few tries.\n * @type {boolean}\n * @private\n */\ngoog.net.BrowserChannel.prototype.failFast_ = false;\n\n\n/**\n * The handler that receive callbacks for state changes and data.\n * @type {?goog.net.BrowserChannel.Handler}\n * @private\n */\ngoog.net.BrowserChannel.prototype.handler_ = null;\n\n\n/**\n * Timer identifier for asynchronously making a forward channel request.\n * @type {?number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.forwardChannelTimerId_ = null;\n\n\n/**\n * Timer identifier for asynchronously making a back channel request.\n * @type {?number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.backChannelTimerId_ = null;\n\n\n/**\n * Timer identifier for the timer that waits for us to retry the backchannel in\n * the case where it is dead and no longer receiving data.\n * @type {?number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.deadBackChannelTimerId_ = null;\n\n\n/**\n * The BrowserTestChannel object which encapsulates the logic for determining\n * interesting network conditions about the client.\n * @type {goog.net.BrowserTestChannel?}\n * @private\n */\ngoog.net.BrowserChannel.prototype.connectionTest_ = null;\n\n\n/**\n * Whether the client's network conditions can support chunked responses.\n * @type {?boolean}\n * @private\n */\ngoog.net.BrowserChannel.prototype.useChunked_ = null;\n\n\n/**\n * Whether chunked mode is allowed. In certain debugging situations, it's\n * useful to disable this.\n * @private\n */\ngoog.net.BrowserChannel.prototype.allowChunkedMode_ = true;\n\n\n/**\n * The array identifier of the last array received from the server for the\n * backchannel request.\n * @type {number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.lastArrayId_ = -1;\n\n\n/**\n * The array identifier of the last array sent by the server that we know about.\n * @type {number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.lastPostResponseArrayId_ = -1;\n\n\n/**\n * The last status code received.\n * @type {number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.lastStatusCode_ = -1;\n\n\n/**\n * Number of times we have retried the current forward channel request.\n * @type {number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.forwardChannelRetryCount_ = 0;\n\n\n/**\n * Number of times it a row that we have retried the current back channel\n * request and received no data.\n * @type {number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.backChannelRetryCount_ = 0;\n\n\n/**\n * The attempt id for the current back channel request. Starts at 1 and\n * increments for each reconnect. The server uses this to log if our connection\n * is flaky or not.\n * @type {number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.backChannelAttemptId_;\n\n\n/**\n * The base part of the time before firing next retry request. Default is 5\n * seconds. Note that a random delay is added (see {@link retryDelaySeedMs_})\n * for all retries, and linear backoff is applied to the sum for subsequent\n * retries.\n * @type {number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.baseRetryDelayMs_ = 5 * 1000;\n\n\n/**\n * A random time between 0 and this number of MS is added to the\n * {@link baseRetryDelayMs_}. Default is 10 seconds.\n * @type {number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.retryDelaySeedMs_ = 10 * 1000;\n\n\n/**\n * Maximum number of attempts to connect to the server for forward channel\n * requests. Defaults to 2.\n * @type {number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.forwardChannelMaxRetries_ = 2;\n\n\n/**\n * The timeout in milliseconds for a forward channel request. Defaults to 20\n * seconds. Note that part of this timeout can be randomized.\n * @type {number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.forwardChannelRequestTimeoutMs_ = 20 * 1000;\n\n\n/**\n * A throttle time in ms for readystatechange events for the backchannel.\n * Useful for throttling when ready state is INTERACTIVE (partial data).\n *\n * This throttle is useful if the server sends large data chunks down the\n * backchannel.  It prevents examining XHR partial data on every\n * readystate change event.  This is useful because large chunks can\n * trigger hundreds of readystatechange events, each of which takes ~5ms\n * or so to handle, in turn making the UI unresponsive for a significant period.\n *\n * If set to zero no throttle is used.\n * @type {number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.readyStateChangeThrottleMs_ = 0;\n\n\n/**\n * Whether cross origin requests are supported for the browser channel.\n *\n * See {@link goog.net.XhrIo#setWithCredentials}.\n * @type {boolean}\n * @private\n */\ngoog.net.BrowserChannel.prototype.supportsCrossDomainXhrs_ = false;\n\n\n/**\n * The latest protocol version that this class supports. We request this version\n * from the server when opening the connection. Should match\n * com.google.net.browserchannel.BrowserChannel.LATEST_CHANNEL_VERSION.\n * @type {number}\n */\ngoog.net.BrowserChannel.LATEST_CHANNEL_VERSION = 8;\n\n\n/**\n * The channel version that we negotiated with the server for this session.\n * Starts out as the version we request, and then is changed to the negotiated\n * version after the initial open.\n * @type {number}\n * @private\n */\ngoog.net.BrowserChannel.prototype.channelVersion_ =\n    goog.net.BrowserChannel.LATEST_CHANNEL_VERSION;\n\n\n/**\n * Enum type for the browser channel state machine.\n * @enum {number}\n */\ngoog.net.BrowserChannel.State = {\n  /** The channel is closed. */\n  CLOSED: 0,\n\n  /** The channel has been initialized but hasn't yet initiated a connection. */\n  INIT: 1,\n\n  /** The channel is in the process of opening a connection to the server. */\n  OPENING: 2,\n\n  /** The channel is open. */\n  OPENED: 3\n};\n\n\n/**\n * The timeout in milliseconds for a forward channel request.\n * @type {number}\n */\ngoog.net.BrowserChannel.FORWARD_CHANNEL_RETRY_TIMEOUT = 20 * 1000;\n\n\n/**\n * Maximum number of attempts to connect to the server for back channel\n * requests.\n * @type {number}\n */\ngoog.net.BrowserChannel.BACK_CHANNEL_MAX_RETRIES = 3;\n\n\n/**\n * A number in MS of how long we guess the maxmium amount of time a round trip\n * to the server should take. In the future this could be substituted with a\n * real measurement of the RTT.\n * @type {number}\n */\ngoog.net.BrowserChannel.RTT_ESTIMATE = 3 * 1000;\n\n\n/**\n * When retrying for an inactive channel, we will multiply the total delay by\n * this number.\n * @type {number}\n */\ngoog.net.BrowserChannel.INACTIVE_CHANNEL_RETRY_FACTOR = 2;\n\n\n/**\n * Enum type for identifying a BrowserChannel error.\n * @enum {number}\n */\ngoog.net.BrowserChannel.Error = {\n  /** Value that indicates no error has occurred. */\n  OK: 0,\n\n  /** An error due to a request failing. */\n  REQUEST_FAILED: 2,\n\n  /** An error due to the user being logged out. */\n  LOGGED_OUT: 4,\n\n  /** An error due to server response which contains no data. */\n  NO_DATA: 5,\n\n  /** An error due to a server response indicating an unknown session id */\n  UNKNOWN_SESSION_ID: 6,\n\n  /** An error due to a server response requesting to stop the channel. */\n  STOP: 7,\n\n  /** A general network error. */\n  NETWORK: 8,\n\n  /** An error due to the channel being blocked by a network administrator. */\n  BLOCKED: 9,\n\n  /** An error due to bad data being returned from the server. */\n  BAD_DATA: 10,\n\n  /** An error due to a response that doesn't start with the magic cookie. */\n  BAD_RESPONSE: 11,\n\n  /** ActiveX is blocked by the machine's admin settings. */\n  ACTIVE_X_BLOCKED: 12\n};\n\n\n/**\n * Internal enum type for the two browser channel channel types.\n * @enum {number}\n * @private\n */\ngoog.net.BrowserChannel.ChannelType_ = {\n  FORWARD_CHANNEL: 1,\n\n  BACK_CHANNEL: 2\n};\n\n\n/**\n * The maximum number of maps that can be sent in one POST. Should match\n * com.google.net.browserchannel.BrowserChannel.MAX_MAPS_PER_REQUEST.\n * @type {number}\n * @private\n */\ngoog.net.BrowserChannel.MAX_MAPS_PER_REQUEST_ = 1000;\n\n\n/**\n * Singleton event target for firing stat events\n * @type {goog.events.EventTarget}\n * @private\n */\ngoog.net.BrowserChannel.statEventTarget_ = new goog.events.EventTarget();\n\n\n/**\n * Events fired by BrowserChannel and associated objects\n * @const\n */\ngoog.net.BrowserChannel.Event = {};\n\n\n/**\n * Stat Event that fires when things of interest happen that may be useful for\n * applications to know about for stats or debugging purposes. This event fires\n * on the EventTarget returned by getStatEventTarget.\n */\ngoog.net.BrowserChannel.Event.STAT_EVENT = 'statevent';\n\n\n\n/**\n * Event class for goog.net.BrowserChannel.Event.STAT_EVENT\n *\n * @param {goog.events.EventTarget} eventTarget The stat event target for\n       the browser channel.\n * @param {goog.net.BrowserChannel.Stat} stat The stat.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.net.BrowserChannel.StatEvent = function(eventTarget, stat) {\n  goog.events.Event.call(\n      this, goog.net.BrowserChannel.Event.STAT_EVENT, eventTarget);\n\n  /**\n   * The stat\n   * @type {goog.net.BrowserChannel.Stat}\n   */\n  this.stat = stat;\n\n};\ngoog.inherits(goog.net.BrowserChannel.StatEvent, goog.events.Event);\n\n\n/**\n * An event that fires when POST requests complete successfully, indicating\n * the size of the POST and the round trip time.\n * This event fires on the EventTarget returned by getStatEventTarget.\n */\ngoog.net.BrowserChannel.Event.TIMING_EVENT = 'timingevent';\n\n\n\n/**\n * Event class for goog.net.BrowserChannel.Event.TIMING_EVENT\n *\n * @param {goog.events.EventTarget} target The stat event target for\n       the browser channel.\n * @param {number} size The number of characters in the POST data.\n * @param {number} rtt The total round trip time from POST to response in MS.\n * @param {number} retries The number of times the POST had to be retried.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.net.BrowserChannel.TimingEvent = function(target, size, rtt, retries) {\n  goog.events.Event.call(\n      this, goog.net.BrowserChannel.Event.TIMING_EVENT, target);\n\n  /**\n   * @type {number}\n   */\n  this.size = size;\n\n  /**\n   * @type {number}\n   */\n  this.rtt = rtt;\n\n  /**\n   * @type {number}\n   */\n  this.retries = retries;\n\n};\ngoog.inherits(goog.net.BrowserChannel.TimingEvent, goog.events.Event);\n\n\n/**\n * The type of event that occurs every time some information about how reachable\n * the server is is discovered.\n */\ngoog.net.BrowserChannel.Event.SERVER_REACHABILITY_EVENT = 'serverreachability';\n\n\n/**\n * Types of events which reveal information about the reachability of the\n * server.\n * @enum {number}\n */\ngoog.net.BrowserChannel.ServerReachability = {\n  REQUEST_MADE: 1,\n  REQUEST_SUCCEEDED: 2,\n  REQUEST_FAILED: 3,\n  BACK_CHANNEL_ACTIVITY: 4\n};\n\n\n\n/**\n * Event class for goog.net.BrowserChannel.Event.SERVER_REACHABILITY_EVENT.\n *\n * @param {goog.events.EventTarget} target The stat event target for\n       the browser channel.\n * @param {goog.net.BrowserChannel.ServerReachability} reachabilityType The\n *     reachability event type.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.net.BrowserChannel.ServerReachabilityEvent = function(\n    target, reachabilityType) {\n  goog.events.Event.call(\n      this, goog.net.BrowserChannel.Event.SERVER_REACHABILITY_EVENT, target);\n\n  /**\n   * @type {goog.net.BrowserChannel.ServerReachability}\n   */\n  this.reachabilityType = reachabilityType;\n};\ngoog.inherits(\n    goog.net.BrowserChannel.ServerReachabilityEvent, goog.events.Event);\n\n\n/**\n * Enum that identifies events for statistics that are interesting to track.\n * TODO(user) - Change name not to use Event or use EventTarget\n * @enum {number}\n */\ngoog.net.BrowserChannel.Stat = {\n  /** Event indicating a new connection attempt. */\n  CONNECT_ATTEMPT: 0,\n\n  /** Event indicating a connection error due to a general network problem. */\n  ERROR_NETWORK: 1,\n\n  /**\n   * Event indicating a connection error that isn't due to a general network\n   * problem.\n   */\n  ERROR_OTHER: 2,\n\n  /** Event indicating the start of test stage one. */\n  TEST_STAGE_ONE_START: 3,\n\n\n  /** Event indicating the channel is blocked by a network administrator. */\n  CHANNEL_BLOCKED: 4,\n\n  /** Event indicating the start of test stage two. */\n  TEST_STAGE_TWO_START: 5,\n\n  /** Event indicating the first piece of test data was received. */\n  TEST_STAGE_TWO_DATA_ONE: 6,\n\n  /**\n   * Event indicating that the second piece of test data was received and it was\n   * received separately from the first.\n   */\n  TEST_STAGE_TWO_DATA_TWO: 7,\n\n  /** Event indicating both pieces of test data were received simultaneously. */\n  TEST_STAGE_TWO_DATA_BOTH: 8,\n\n  /** Event indicating stage one of the test request failed. */\n  TEST_STAGE_ONE_FAILED: 9,\n\n  /** Event indicating stage two of the test request failed. */\n  TEST_STAGE_TWO_FAILED: 10,\n\n  /**\n   * Event indicating that a buffering proxy is likely between the client and\n   * the server.\n   */\n  PROXY: 11,\n\n  /**\n   * Event indicating that no buffering proxy is likely between the client and\n   * the server.\n   */\n  NOPROXY: 12,\n\n  /** Event indicating an unknown SID error. */\n  REQUEST_UNKNOWN_SESSION_ID: 13,\n\n  /** Event indicating a bad status code was received. */\n  REQUEST_BAD_STATUS: 14,\n\n  /** Event indicating incomplete data was received */\n  REQUEST_INCOMPLETE_DATA: 15,\n\n  /** Event indicating bad data was received */\n  REQUEST_BAD_DATA: 16,\n\n  /** Event indicating no data was received when data was expected. */\n  REQUEST_NO_DATA: 17,\n\n  /** Event indicating a request timeout. */\n  REQUEST_TIMEOUT: 18,\n\n  /**\n   * Event indicating that the server never received our hanging GET and so it\n   * is being retried.\n   */\n  BACKCHANNEL_MISSING: 19,\n\n  /**\n   * Event indicating that we have determined that our hanging GET is not\n   * receiving data when it should be. Thus it is dead dead and will be retried.\n   */\n  BACKCHANNEL_DEAD: 20,\n\n  /**\n   * The browser declared itself offline during the lifetime of a request, or\n   * was offline when a request was initially made.\n   */\n  BROWSER_OFFLINE: 21,\n\n  /** ActiveX is blocked by the machine's admin settings. */\n  ACTIVE_X_BLOCKED: 22\n};\n\n\n/**\n * A guess at a cutoff at which to no longer assume the backchannel is dead\n * when we are slow to receive data. Number in bytes.\n *\n * Assumption: The worst bandwidth we work on is 50 kilobits/sec\n * 50kbits/sec * (1 byte / 8 bits) * 6 sec dead backchannel timeout\n * @type {number}\n */\ngoog.net.BrowserChannel.OUTSTANDING_DATA_BACKCHANNEL_RETRY_CUTOFF = 37500;\n\n\n/**\n * Returns the browserchannel logger.\n *\n * @return {!goog.net.ChannelDebug} The channel debug object.\n */\ngoog.net.BrowserChannel.prototype.getChannelDebug = function() {\n  return this.channelDebug_;\n};\n\n\n/**\n * Set the browserchannel logger.\n * TODO(user): Add interface for channel loggers or remove this function.\n *\n * @param {goog.net.ChannelDebug} channelDebug The channel debug object.\n */\ngoog.net.BrowserChannel.prototype.setChannelDebug = function(channelDebug) {\n  if (channelDebug != null) {\n    this.channelDebug_ = channelDebug;\n  }\n};\n\n\n/**\n * Allows the application to set an execution hooks for when BrowserChannel\n * starts processing requests. This is useful to track timing or logging\n * special information. The function takes no parameters and return void.\n * @param {Function} startHook  The function for the start hook.\n */\ngoog.net.BrowserChannel.setStartThreadExecutionHook = function(startHook) {\n  goog.net.BrowserChannel.startExecutionHook_ = startHook;\n};\n\n\n/**\n * Allows the application to set an execution hooks for when BrowserChannel\n * stops processing requests. This is useful to track timing or logging\n * special information. The function takes no parameters and return void.\n * @param {Function} endHook  The function for the end hook.\n */\ngoog.net.BrowserChannel.setEndThreadExecutionHook = function(endHook) {\n  goog.net.BrowserChannel.endExecutionHook_ = endHook;\n};\n\n\n/**\n * Application provided execution hook for the start hook.\n *\n * @type {Function}\n * @private\n */\ngoog.net.BrowserChannel.startExecutionHook_ = function() {};\n\n\n/**\n * Application provided execution hook for the end hook.\n *\n * @type {Function}\n * @private\n */\ngoog.net.BrowserChannel.endExecutionHook_ = function() {};\n\n\n/**\n * Instantiates a ChannelRequest with the given parameters. Overidden in tests.\n *\n * @param {goog.net.BrowserChannel|goog.net.BrowserTestChannel} channel\n *     The BrowserChannel that owns this request.\n * @param {goog.net.ChannelDebug} channelDebug A ChannelDebug to use for\n *     logging.\n * @param {string=} opt_sessionId  The session id for the channel.\n * @param {string|number=} opt_requestId  The request id for this request.\n * @param {number=} opt_retryId  The retry id for this request.\n * @return {!goog.net.ChannelRequest} The created channel request.\n */\ngoog.net.BrowserChannel.createChannelRequest = function(\n    channel, channelDebug, opt_sessionId, opt_requestId, opt_retryId) {\n  return new goog.net.ChannelRequest(\n      channel, channelDebug, opt_sessionId, opt_requestId, opt_retryId);\n};\n\n\n/**\n * Starts the channel. This initiates connections to the server.\n *\n * @param {string} testPath  The path for the test connection.\n * @param {string} channelPath  The path for the channel connection.\n * @param {Object=} opt_extraParams  Extra parameter keys and values to add to\n *     the requests.\n * @param {string=} opt_oldSessionId  Session ID from a previous session.\n * @param {number=} opt_oldArrayId  The last array ID from a previous session.\n */\ngoog.net.BrowserChannel.prototype.connect = function(\n    testPath, channelPath, opt_extraParams, opt_oldSessionId, opt_oldArrayId) {\n  this.channelDebug_.debug('connect()');\n\n  goog.net.BrowserChannel.notifyStatEvent(\n      goog.net.BrowserChannel.Stat.CONNECT_ATTEMPT);\n\n  this.path_ = channelPath;\n  this.extraParams_ = opt_extraParams || {};\n\n  // Attach parameters about the previous session if reconnecting.\n  if (opt_oldSessionId && opt_oldArrayId !== undefined) {\n    this.extraParams_['OSID'] = opt_oldSessionId;\n    this.extraParams_['OAID'] = opt_oldArrayId;\n  }\n\n  if (this.asyncTest_) {\n    goog.net.BrowserChannel.setTimeout(\n        goog.bind(this.connectTest_, this, testPath), 100);\n    this.connectChannel_();\n  } else {\n    this.connectTest_(testPath);\n  }\n};\n\n\n/**\n * Disconnects and closes the channel.\n */\ngoog.net.BrowserChannel.prototype.disconnect = function() {\n  this.channelDebug_.debug('disconnect()');\n\n  this.cancelRequests_();\n\n  if (this.state_ == goog.net.BrowserChannel.State.OPENED) {\n    var rid = this.nextRid_++;\n    var uri = this.forwardChannelUri_.clone();\n    uri.setParameterValue('SID', this.sid_);\n    uri.setParameterValue('RID', rid);\n    uri.setParameterValue('TYPE', 'terminate');\n\n    // Add the reconnect parameters.\n    this.addAdditionalParams_(uri);\n\n    var request = goog.net.BrowserChannel.createChannelRequest(\n        this, this.channelDebug_, this.sid_, rid);\n    request.sendUsingImgTag(uri);\n  }\n\n  this.onClose_();\n};\n\n\n/**\n * Returns the session id of the channel. Only available after the\n * channel has been opened.\n * @return {string} Session ID.\n */\ngoog.net.BrowserChannel.prototype.getSessionId = function() {\n  return this.sid_;\n};\n\n\n/**\n * Starts the test channel to determine network conditions.\n *\n * @param {string} testPath  The relative PATH for the test connection.\n * @private\n */\ngoog.net.BrowserChannel.prototype.connectTest_ = function(testPath) {\n  this.channelDebug_.debug('connectTest_()');\n  if (!this.okToMakeRequest_()) {\n    return;  // channel is cancelled\n  }\n  this.connectionTest_ =\n      new goog.net.BrowserTestChannel(this, this.channelDebug_);\n  this.connectionTest_.setExtraHeaders(this.extraHeaders_);\n  this.connectionTest_.setParser(this.parser_);\n  this.connectionTest_.connect(testPath);\n};\n\n\n/**\n * Starts the regular channel which is run after the test channel is complete.\n * @private\n */\ngoog.net.BrowserChannel.prototype.connectChannel_ = function() {\n  this.channelDebug_.debug('connectChannel_()');\n  this.ensureInState_(\n      goog.net.BrowserChannel.State.INIT, goog.net.BrowserChannel.State.CLOSED);\n  this.forwardChannelUri_ =\n      this.getForwardChannelUri(/** @type {string} */ (this.path_));\n  this.ensureForwardChannel_();\n};\n\n\n/**\n * Cancels all outstanding requests.\n * @private\n */\ngoog.net.BrowserChannel.prototype.cancelRequests_ = function() {\n  if (this.connectionTest_) {\n    this.connectionTest_.abort();\n    this.connectionTest_ = null;\n  }\n\n  if (this.backChannelRequest_) {\n    this.backChannelRequest_.cancel();\n    this.backChannelRequest_ = null;\n  }\n\n  if (this.backChannelTimerId_) {\n    goog.global.clearTimeout(this.backChannelTimerId_);\n    this.backChannelTimerId_ = null;\n  }\n\n  this.clearDeadBackchannelTimer_();\n\n  if (this.forwardChannelRequest_) {\n    this.forwardChannelRequest_.cancel();\n    this.forwardChannelRequest_ = null;\n  }\n\n  if (this.forwardChannelTimerId_) {\n    goog.global.clearTimeout(this.forwardChannelTimerId_);\n    this.forwardChannelTimerId_ = null;\n  }\n};\n\n\n/**\n * Returns the extra HTTP headers to add to all the requests sent to the server.\n *\n * @return {Object} The HTTP headers, or null.\n */\ngoog.net.BrowserChannel.prototype.getExtraHeaders = function() {\n  return this.extraHeaders_;\n};\n\n\n/**\n * Sets extra HTTP headers to add to all the requests sent to the server.\n *\n * @param {Object} extraHeaders The HTTP headers, or null.\n */\ngoog.net.BrowserChannel.prototype.setExtraHeaders = function(extraHeaders) {\n  this.extraHeaders_ = extraHeaders;\n};\n\n\n/**\n * Sets the throttle for handling onreadystatechange events for the request.\n *\n * @param {number} throttle The throttle in ms.  A value of zero indicates\n *     no throttle.\n */\ngoog.net.BrowserChannel.prototype.setReadyStateChangeThrottle = function(\n    throttle) {\n  this.readyStateChangeThrottleMs_ = throttle;\n};\n\n\n/**\n * Sets whether cross origin requests are supported for the browser channel.\n *\n * Setting this allows the creation of requests to secondary domains and\n * sends XHRs with the CORS withCredentials bit set to true.\n *\n * In order for cross-origin requests to work, the server will also need to set\n * CORS response headers as per:\n * https://developer.mozilla.org/en-US/docs/HTTP_access_control\n *\n * See {@link goog.net.XhrIo#setWithCredentials}.\n * @param {boolean} supportCrossDomain Whether cross domain XHRs are supported.\n */\ngoog.net.BrowserChannel.prototype.setSupportsCrossDomainXhrs = function(\n    supportCrossDomain) {\n  this.supportsCrossDomainXhrs_ = supportCrossDomain;\n};\n\n\n/**\n * Returns the handler used for channel callback events.\n *\n * @return {goog.net.BrowserChannel.Handler} The handler.\n */\ngoog.net.BrowserChannel.prototype.getHandler = function() {\n  return this.handler_;\n};\n\n\n/**\n * Sets the handler used for channel callback events.\n * @param {goog.net.BrowserChannel.Handler} handler The handler to set.\n */\ngoog.net.BrowserChannel.prototype.setHandler = function(handler) {\n  this.handler_ = handler;\n};\n\n\n/**\n * Returns whether the channel allows the use of a subdomain. There may be\n * cases where this isn't allowed.\n * @return {boolean} Whether a host prefix is allowed.\n */\ngoog.net.BrowserChannel.prototype.getAllowHostPrefix = function() {\n  return this.allowHostPrefix_;\n};\n\n\n/**\n * Sets whether the channel allows the use of a subdomain. There may be cases\n * where this isn't allowed, for example, logging in with troutboard where\n * using a subdomain causes Apache to force the user to authenticate twice.\n * @param {boolean} allowHostPrefix Whether a host prefix is allowed.\n */\ngoog.net.BrowserChannel.prototype.setAllowHostPrefix = function(\n    allowHostPrefix) {\n  this.allowHostPrefix_ = allowHostPrefix;\n};\n\n\n/**\n * Returns whether the channel is buffered or not. This state is valid for\n * querying only after the test connection has completed. This may be\n * queried in the goog.net.BrowserChannel.okToMakeRequest() callback.\n * A channel may be buffered if the test connection determines that\n * a chunked response could not be sent down within a suitable time.\n * @return {boolean} Whether the channel is buffered.\n */\ngoog.net.BrowserChannel.prototype.isBuffered = function() {\n  return !this.useChunked_;\n};\n\n\n/**\n * Returns whether chunked mode is allowed. In certain debugging situations,\n * it's useful for the application to have a way to disable chunked mode for a\n * user.\n\n * @return {boolean} Whether chunked mode is allowed.\n */\ngoog.net.BrowserChannel.prototype.getAllowChunkedMode = function() {\n  return this.allowChunkedMode_;\n};\n\n\n/**\n * Sets whether chunked mode is allowed. In certain debugging situations, it's\n * useful for the application to have a way to disable chunked mode for a user.\n * @param {boolean} allowChunkedMode  Whether chunked mode is allowed.\n */\ngoog.net.BrowserChannel.prototype.setAllowChunkedMode = function(\n    allowChunkedMode) {\n  this.allowChunkedMode_ = allowChunkedMode;\n};\n\n\n/**\n * Sends a request to the server. The format of the request is a Map data\n * structure of key/value pairs. These maps are then encoded in a format\n * suitable for the wire and then reconstituted as a Map data structure that\n * the server can process.\n * @param {Object} map  The map to send.\n * @param {?Object=} opt_context The context associated with the map.\n */\ngoog.net.BrowserChannel.prototype.sendMap = function(map, opt_context) {\n  if (this.state_ == goog.net.BrowserChannel.State.CLOSED) {\n    throw new Error('Invalid operation: sending map when state is closed');\n  }\n\n  // We can only send 1000 maps per POST, but typically we should never have\n  // that much to send, so warn if we exceed that (we still send all the maps).\n  if (this.outgoingMaps_.length ==\n      goog.net.BrowserChannel.MAX_MAPS_PER_REQUEST_) {\n    // severe() is temporary so that we get these uploaded and can figure out\n    // what's causing them. Afterwards can change to warning().\n    this.channelDebug_.severe(\n        'Already have ' + goog.net.BrowserChannel.MAX_MAPS_PER_REQUEST_ +\n        ' queued maps upon queueing ' + this.parser_.stringify(map));\n  }\n\n  this.outgoingMaps_.push(\n      new goog.net.BrowserChannel.QueuedMap(\n          this.nextMapId_++, map, opt_context));\n  if (this.state_ == goog.net.BrowserChannel.State.OPENING ||\n      this.state_ == goog.net.BrowserChannel.State.OPENED) {\n    this.ensureForwardChannel_();\n  }\n};\n\n\n/**\n * When set to true, this changes the behavior of the forward channel so it\n * will not retry requests; it will fail after one network failure, and if\n * there was already one network failure, the request will fail immediately.\n * @param {boolean} failFast  Whether or not to fail fast.\n */\ngoog.net.BrowserChannel.prototype.setFailFast = function(failFast) {\n  this.failFast_ = failFast;\n  this.channelDebug_.info('setFailFast: ' + failFast);\n  if ((this.forwardChannelRequest_ || this.forwardChannelTimerId_) &&\n      this.forwardChannelRetryCount_ > this.getForwardChannelMaxRetries()) {\n    this.channelDebug_.info(\n        'Retry count ' + this.forwardChannelRetryCount_ + ' > new maxRetries ' +\n        this.getForwardChannelMaxRetries() + '. Fail immediately!');\n    if (this.forwardChannelRequest_) {\n      this.forwardChannelRequest_.cancel();\n      // Go through the standard onRequestComplete logic to expose the max-retry\n      // failure in the standard way.\n      this.onRequestComplete(this.forwardChannelRequest_);\n    } else {  // i.e., this.forwardChannelTimerId_\n      goog.global.clearTimeout(this.forwardChannelTimerId_);\n      this.forwardChannelTimerId_ = null;\n      // The error code from the last failed request is gone, so just use a\n      // generic one.\n      this.signalError_(goog.net.BrowserChannel.Error.REQUEST_FAILED);\n    }\n  }\n};\n\n\n/**\n * @return {number} The max number of forward-channel retries, which will be 0\n * in fail-fast mode.\n */\ngoog.net.BrowserChannel.prototype.getForwardChannelMaxRetries = function() {\n  return this.failFast_ ? 0 : this.forwardChannelMaxRetries_;\n};\n\n\n/**\n * Sets the maximum number of attempts to connect to the server for forward\n * channel requests.\n * @param {number} retries The maximum number of attempts.\n */\ngoog.net.BrowserChannel.prototype.setForwardChannelMaxRetries = function(\n    retries) {\n  this.forwardChannelMaxRetries_ = retries;\n};\n\n\n/**\n * Sets the timeout for a forward channel request.\n * @param {number} timeoutMs The timeout in milliseconds.\n */\ngoog.net.BrowserChannel.prototype.setForwardChannelRequestTimeout = function(\n    timeoutMs) {\n  this.forwardChannelRequestTimeoutMs_ = timeoutMs;\n};\n\n\n/**\n * @return {number} The max number of back-channel retries, which is a constant.\n */\ngoog.net.BrowserChannel.prototype.getBackChannelMaxRetries = function() {\n  // Back-channel retries is a constant.\n  return goog.net.BrowserChannel.BACK_CHANNEL_MAX_RETRIES;\n};\n\n\n/**\n * Returns whether the channel is closed\n * @return {boolean} true if the channel is closed.\n */\ngoog.net.BrowserChannel.prototype.isClosed = function() {\n  return this.state_ == goog.net.BrowserChannel.State.CLOSED;\n};\n\n\n/**\n * Returns the browser channel state.\n * @return {goog.net.BrowserChannel.State} The current state of the browser\n * channel.\n */\ngoog.net.BrowserChannel.prototype.getState = function() {\n  return this.state_;\n};\n\n\n/**\n * Return the last status code received for a request.\n * @return {number} The last status code received for a request.\n */\ngoog.net.BrowserChannel.prototype.getLastStatusCode = function() {\n  return this.lastStatusCode_;\n};\n\n\n/**\n * @return {number} The last array id received.\n */\ngoog.net.BrowserChannel.prototype.getLastArrayId = function() {\n  return this.lastArrayId_;\n};\n\n\n/**\n * Returns whether there are outstanding requests servicing the channel.\n * @return {boolean} true if there are outstanding requests.\n */\ngoog.net.BrowserChannel.prototype.hasOutstandingRequests = function() {\n  return this.outstandingRequests_() != 0;\n};\n\n\n/**\n * Sets a new parser for the response payload.\n * @param {!goog.string.Parser} parser Parser.\n */\ngoog.net.BrowserChannel.prototype.setParser = function(parser) {\n  this.parser_ = parser;\n};\n\n\n/**\n * Returns the number of outstanding requests.\n * @return {number} The number of outstanding requests to the server.\n * @private\n */\ngoog.net.BrowserChannel.prototype.outstandingRequests_ = function() {\n  var count = 0;\n  if (this.backChannelRequest_) {\n    count++;\n  }\n  if (this.forwardChannelRequest_) {\n    count++;\n  }\n  return count;\n};\n\n\n/**\n * Ensures that a forward channel request is scheduled.\n * @private\n */\ngoog.net.BrowserChannel.prototype.ensureForwardChannel_ = function() {\n  if (this.forwardChannelRequest_) {\n    // connection in process - no need to start a new request\n    return;\n  }\n\n  if (this.forwardChannelTimerId_) {\n    // no need to start a new request - one is already scheduled\n    return;\n  }\n\n  this.forwardChannelTimerId_ = goog.net.BrowserChannel.setTimeout(\n      goog.bind(this.onStartForwardChannelTimer_, this), 0);\n  this.forwardChannelRetryCount_ = 0;\n};\n\n\n/**\n * Schedules a forward-channel retry for the specified request, unless the max\n * retries has been reached.\n * @param {goog.net.ChannelRequest} request The failed request to retry.\n * @return {boolean} true iff a retry was scheduled.\n * @private\n */\ngoog.net.BrowserChannel.prototype.maybeRetryForwardChannel_ = function(\n    request) {\n  if (this.forwardChannelRequest_ || this.forwardChannelTimerId_) {\n    // Should be impossible to be called in this state.\n    this.channelDebug_.severe('Request already in progress');\n    return false;\n  }\n\n  if (this.state_ == goog.net.BrowserChannel.State.INIT ||  // no retry open_()\n      (this.forwardChannelRetryCount_ >= this.getForwardChannelMaxRetries())) {\n    return false;\n  }\n\n  this.channelDebug_.debug('Going to retry POST');\n\n  this.forwardChannelTimerId_ = goog.net.BrowserChannel.setTimeout(\n      goog.bind(this.onStartForwardChannelTimer_, this, request),\n      this.getRetryTime_(this.forwardChannelRetryCount_));\n  this.forwardChannelRetryCount_++;\n  return true;\n};\n\n\n/**\n * Timer callback for ensureForwardChannel\n * @param {goog.net.ChannelRequest=} opt_retryRequest A failed request to retry.\n * @private\n */\ngoog.net.BrowserChannel.prototype.onStartForwardChannelTimer_ = function(\n    opt_retryRequest) {\n  this.forwardChannelTimerId_ = null;\n  this.startForwardChannel_(opt_retryRequest);\n};\n\n\n/**\n * Begins a new forward channel operation to the server.\n * @param {goog.net.ChannelRequest=} opt_retryRequest A failed request to retry.\n * @private\n */\ngoog.net.BrowserChannel.prototype.startForwardChannel_ = function(\n    opt_retryRequest) {\n  this.channelDebug_.debug('startForwardChannel_');\n  if (!this.okToMakeRequest_()) {\n    return;  // channel is cancelled\n  } else if (this.state_ == goog.net.BrowserChannel.State.INIT) {\n    if (opt_retryRequest) {\n      this.channelDebug_.severe('Not supposed to retry the open');\n      return;\n    }\n    this.open_();\n    this.state_ = goog.net.BrowserChannel.State.OPENING;\n  } else if (this.state_ == goog.net.BrowserChannel.State.OPENED) {\n    if (opt_retryRequest) {\n      this.makeForwardChannelRequest_(opt_retryRequest);\n      return;\n    }\n\n    if (this.outgoingMaps_.length == 0) {\n      this.channelDebug_.debug(\n          'startForwardChannel_ returned: ' +\n          'nothing to send');\n      // no need to start a new forward channel request\n      return;\n    }\n\n    if (this.forwardChannelRequest_) {\n      // Should be impossible to be called in this state.\n      this.channelDebug_.severe(\n          'startForwardChannel_ returned: ' +\n          'connection already in progress');\n      return;\n    }\n\n    this.makeForwardChannelRequest_();\n    this.channelDebug_.debug('startForwardChannel_ finished, sent request');\n  }\n};\n\n\n/**\n * Establishes a new channel session with the the server.\n * @private\n */\ngoog.net.BrowserChannel.prototype.open_ = function() {\n  this.channelDebug_.debug('open_()');\n  this.nextRid_ = Math.floor(Math.random() * 100000);\n\n  var rid = this.nextRid_++;\n  var request = goog.net.BrowserChannel.createChannelRequest(\n      this, this.channelDebug_, '', rid);\n  request.setExtraHeaders(this.extraHeaders_);\n  var requestText = this.dequeueOutgoingMaps_();\n  var uri = this.forwardChannelUri_.clone();\n  uri.setParameterValue('RID', rid);\n  if (this.clientVersion_) {\n    uri.setParameterValue('CVER', this.clientVersion_);\n  }\n\n  // Add the reconnect parameters.\n  this.addAdditionalParams_(uri);\n\n  request.xmlHttpPost(uri, requestText, true);\n  this.forwardChannelRequest_ = request;\n};\n\n\n/**\n * Makes a forward channel request using XMLHTTP.\n * @param {goog.net.ChannelRequest=} opt_retryRequest A failed request to retry.\n * @private\n */\ngoog.net.BrowserChannel.prototype.makeForwardChannelRequest_ = function(\n    opt_retryRequest) {\n  var rid;\n  var requestText;\n  if (opt_retryRequest) {\n    if (this.channelVersion_ > 6) {\n      // In version 7 and up we can tack on new arrays to a retry.\n      this.requeuePendingMaps_();\n      rid = this.nextRid_ - 1;  // Must use last RID\n      requestText = this.dequeueOutgoingMaps_();\n    } else {\n      // TODO(user): Remove this code and the opt_retryRequest passing\n      // once server-side support for ver 7 is ubiquitous.\n      rid = opt_retryRequest.getRequestId();\n      requestText = /** @type {string} */ (opt_retryRequest.getPostData());\n    }\n  } else {\n    rid = this.nextRid_++;\n    requestText = this.dequeueOutgoingMaps_();\n  }\n\n  var uri = this.forwardChannelUri_.clone();\n  uri.setParameterValue('SID', this.sid_);\n  uri.setParameterValue('RID', rid);\n  uri.setParameterValue('AID', this.lastArrayId_);\n  // Add the additional reconnect parameters.\n  this.addAdditionalParams_(uri);\n\n  var request = goog.net.BrowserChannel.createChannelRequest(\n      this, this.channelDebug_, this.sid_, rid,\n      this.forwardChannelRetryCount_ + 1);\n  request.setExtraHeaders(this.extraHeaders_);\n\n  // randomize from 50%-100% of the forward channel timeout to avoid\n  // a big hit if servers happen to die at once.\n  request.setTimeout(\n      Math.round(this.forwardChannelRequestTimeoutMs_ * 0.50) +\n      Math.round(this.forwardChannelRequestTimeoutMs_ * 0.50 * Math.random()));\n  this.forwardChannelRequest_ = request;\n  request.xmlHttpPost(uri, requestText, true);\n};\n\n\n/**\n * Adds the additional parameters from the handler to the given URI.\n * @param {goog.Uri} uri The URI to add the parameters to.\n * @private\n */\ngoog.net.BrowserChannel.prototype.addAdditionalParams_ = function(uri) {\n  // Add the additional reconnect parameters as needed.\n  if (this.handler_) {\n    var params = this.handler_.getAdditionalParams(this);\n    if (params) {\n      goog.object.forEach(\n          params, function(value, key) { uri.setParameterValue(key, value); });\n    }\n  }\n};\n\n\n/**\n * Returns the request text from the outgoing maps and resets it.\n * @return {string} The encoded request text created from all the currently\n *                  queued outgoing maps.\n * @private\n */\ngoog.net.BrowserChannel.prototype.dequeueOutgoingMaps_ = function() {\n  var count = Math.min(\n      this.outgoingMaps_.length, goog.net.BrowserChannel.MAX_MAPS_PER_REQUEST_);\n  var sb = ['count=' + count];\n  var offset;\n  if (this.channelVersion_ > 6 && count > 0) {\n    // To save a bit of bandwidth, specify the base mapId and the rest as\n    // offsets from it.\n    offset = this.outgoingMaps_[0].mapId;\n    sb.push('ofs=' + offset);\n  } else {\n    offset = 0;\n  }\n  for (var i = 0; i < count; i++) {\n    var mapId = this.outgoingMaps_[i].mapId;\n    var map = this.outgoingMaps_[i].map;\n    if (this.channelVersion_ <= 6) {\n      // Map IDs were not used in ver 6 and before, just indexes in the request.\n      mapId = i;\n    } else {\n      mapId -= offset;\n    }\n    try {\n      goog.object.forEach(map, function(value, key, coll) {\n        sb.push('req' + mapId + '_' + key + '=' + encodeURIComponent(value));\n      });\n    } catch (ex) {\n      // We send a map here because lots of the retry logic relies on map IDs,\n      // so we have to send something.\n      sb.push(\n          'req' + mapId + '_' +\n          'type' +\n          '=' + encodeURIComponent('_badmap'));\n      if (this.handler_) {\n        this.handler_.badMapError(this, map);\n      }\n    }\n  }\n  this.pendingMaps_ =\n      this.pendingMaps_.concat(this.outgoingMaps_.splice(0, count));\n  return sb.join('&');\n};\n\n\n/**\n * Requeues unacknowledged sent arrays for retransmission in the next forward\n * channel request.\n * @private\n */\ngoog.net.BrowserChannel.prototype.requeuePendingMaps_ = function() {\n  this.outgoingMaps_ = this.pendingMaps_.concat(this.outgoingMaps_);\n  this.pendingMaps_.length = 0;\n};\n\n\n/**\n * Ensures there is a backchannel request for receiving data from the server.\n * @private\n */\ngoog.net.BrowserChannel.prototype.ensureBackChannel_ = function() {\n  if (this.backChannelRequest_) {\n    // already have one\n    return;\n  }\n\n  if (this.backChannelTimerId_) {\n    // no need to start a new request - one is already scheduled\n    return;\n  }\n\n  this.backChannelAttemptId_ = 1;\n  this.backChannelTimerId_ = goog.net.BrowserChannel.setTimeout(\n      goog.bind(this.onStartBackChannelTimer_, this), 0);\n  this.backChannelRetryCount_ = 0;\n};\n\n\n/**\n * Schedules a back-channel retry, unless the max retries has been reached.\n * @return {boolean} true iff a retry was scheduled.\n * @private\n */\ngoog.net.BrowserChannel.prototype.maybeRetryBackChannel_ = function() {\n  if (this.backChannelRequest_ || this.backChannelTimerId_) {\n    // Should be impossible to be called in this state.\n    this.channelDebug_.severe('Request already in progress');\n    return false;\n  }\n\n  if (this.backChannelRetryCount_ >= this.getBackChannelMaxRetries()) {\n    return false;\n  }\n\n  this.channelDebug_.debug('Going to retry GET');\n\n  this.backChannelAttemptId_++;\n  this.backChannelTimerId_ = goog.net.BrowserChannel.setTimeout(\n      goog.bind(this.onStartBackChannelTimer_, this),\n      this.getRetryTime_(this.backChannelRetryCount_));\n  this.backChannelRetryCount_++;\n  return true;\n};\n\n\n/**\n * Timer callback for ensureBackChannel_.\n * @private\n */\ngoog.net.BrowserChannel.prototype.onStartBackChannelTimer_ = function() {\n  this.backChannelTimerId_ = null;\n  this.startBackChannel_();\n};\n\n\n/**\n * Begins a new back channel operation to the server.\n * @private\n */\ngoog.net.BrowserChannel.prototype.startBackChannel_ = function() {\n  if (!this.okToMakeRequest_()) {\n    // channel is cancelled\n    return;\n  }\n\n  this.channelDebug_.debug('Creating new HttpRequest');\n  this.backChannelRequest_ = goog.net.BrowserChannel.createChannelRequest(\n      this, this.channelDebug_, this.sid_, 'rpc', this.backChannelAttemptId_);\n  this.backChannelRequest_.setExtraHeaders(this.extraHeaders_);\n  this.backChannelRequest_.setReadyStateChangeThrottle(\n      this.readyStateChangeThrottleMs_);\n  var uri = this.backChannelUri_.clone();\n  uri.setParameterValue('RID', 'rpc');\n  uri.setParameterValue('SID', this.sid_);\n  uri.setParameterValue('CI', this.useChunked_ ? '0' : '1');\n  uri.setParameterValue('AID', this.lastArrayId_);\n\n  // Add the reconnect parameters.\n  this.addAdditionalParams_(uri);\n\n  if (!goog.net.ChannelRequest.supportsXhrStreaming()) {\n    uri.setParameterValue('TYPE', 'html');\n    this.backChannelRequest_.tridentGet(uri, Boolean(this.hostPrefix_));\n  } else {\n    uri.setParameterValue('TYPE', 'xmlhttp');\n    this.backChannelRequest_.xmlHttpGet(\n        uri, true /* decodeChunks */, this.hostPrefix_,\n        false /* opt_noClose */);\n  }\n  this.channelDebug_.debug('New Request created');\n};\n\n\n/**\n * Gives the handler a chance to return an error code and stop channel\n * execution. A handler might want to do this to check that the user is still\n * logged in, for example.\n * @private\n * @return {boolean} If it's OK to make a request.\n */\ngoog.net.BrowserChannel.prototype.okToMakeRequest_ = function() {\n  if (this.handler_) {\n    var result = this.handler_.okToMakeRequest(this);\n    if (result != goog.net.BrowserChannel.Error.OK) {\n      this.channelDebug_.debug(\n          'Handler returned error code from ' +\n          'okToMakeRequest');\n      this.signalError_(result);\n      return false;\n    }\n  }\n  return true;\n};\n\n\n/**\n * Callback from BrowserTestChannel for when the channel is finished.\n * @param {goog.net.BrowserTestChannel} testChannel The BrowserTestChannel.\n * @param {boolean} useChunked  Whether we can chunk responses.\n */\ngoog.net.BrowserChannel.prototype.testConnectionFinished = function(\n    testChannel, useChunked) {\n  this.channelDebug_.debug('Test Connection Finished');\n\n  this.useChunked_ = this.allowChunkedMode_ && useChunked;\n  this.lastStatusCode_ = testChannel.getLastStatusCode();\n  // When using asynchronous test, the channel is already open by connect().\n  if (!this.asyncTest_) {\n    this.connectChannel_();\n  }\n};\n\n\n/**\n * Callback from BrowserTestChannel for when the channel has an error.\n * @param {goog.net.BrowserTestChannel} testChannel The BrowserTestChannel.\n * @param {goog.net.ChannelRequest.Error} errorCode  The error code of the\n       failure.\n */\ngoog.net.BrowserChannel.prototype.testConnectionFailure = function(\n    testChannel, errorCode) {\n  this.channelDebug_.debug('Test Connection Failed');\n  this.lastStatusCode_ = testChannel.getLastStatusCode();\n  this.signalError_(goog.net.BrowserChannel.Error.REQUEST_FAILED);\n};\n\n\n/**\n * Callback from BrowserTestChannel for when the channel is blocked.\n * @param {goog.net.BrowserTestChannel} testChannel The BrowserTestChannel.\n */\ngoog.net.BrowserChannel.prototype.testConnectionBlocked = function(\n    testChannel) {\n  this.channelDebug_.debug('Test Connection Blocked');\n  this.lastStatusCode_ = this.connectionTest_.getLastStatusCode();\n  this.signalError_(goog.net.BrowserChannel.Error.BLOCKED);\n};\n\n\n/**\n * Callback from ChannelRequest for when new data is received\n * @param {goog.net.ChannelRequest} request  The request object.\n * @param {string} responseText The text of the response.\n */\ngoog.net.BrowserChannel.prototype.onRequestData = function(\n    request, responseText) {\n  if (this.state_ == goog.net.BrowserChannel.State.CLOSED ||\n      (this.backChannelRequest_ != request &&\n       this.forwardChannelRequest_ != request)) {\n    // either CLOSED or a request we don't know about (perhaps an old request)\n    return;\n  }\n  this.lastStatusCode_ = request.getLastStatusCode();\n\n  if (this.forwardChannelRequest_ == request &&\n      this.state_ == goog.net.BrowserChannel.State.OPENED) {\n    if (this.channelVersion_ > 7) {\n      var response;\n      try {\n        response = this.parser_.parse(responseText);\n      } catch (ex) {\n        response = null;\n      }\n      if (goog.isArray(response) && response.length == 3) {\n        this.handlePostResponse_(response);\n      } else {\n        this.channelDebug_.debug('Bad POST response data returned');\n        this.signalError_(goog.net.BrowserChannel.Error.BAD_RESPONSE);\n      }\n    } else if (responseText != goog.net.ChannelDebug.MAGIC_RESPONSE_COOKIE) {\n      this.channelDebug_.debug(\n          'Bad data returned - missing/invald ' +\n          'magic cookie');\n      this.signalError_(goog.net.BrowserChannel.Error.BAD_RESPONSE);\n    }\n  } else {\n    if (this.backChannelRequest_ == request) {\n      this.clearDeadBackchannelTimer_();\n    }\n    if (!goog.string.isEmptyOrWhitespace(responseText)) {\n      var response = this.parser_.parse(responseText);\n      goog.asserts.assert(goog.isArray(response));\n      this.onInput_(/** @type {!Array<?>} */ (response));\n    }\n  }\n};\n\n\n/**\n * Handles a POST response from the server.\n * @param {Array<number>} responseValues The key value pairs in the POST\n *     response.\n * @private\n */\ngoog.net.BrowserChannel.prototype.handlePostResponse_ = function(\n    responseValues) {\n  // The first response value is set to 0 if server is missing backchannel.\n  if (responseValues[0] == 0) {\n    this.handleBackchannelMissing_();\n    return;\n  }\n  this.lastPostResponseArrayId_ = responseValues[1];\n  var outstandingArrays = this.lastPostResponseArrayId_ - this.lastArrayId_;\n  if (0 < outstandingArrays) {\n    var numOutstandingBackchannelBytes = responseValues[2];\n    this.channelDebug_.debug(\n        numOutstandingBackchannelBytes + ' bytes (in ' + outstandingArrays +\n        ' arrays) are outstanding on the BackChannel');\n    if (!this.shouldRetryBackChannel_(numOutstandingBackchannelBytes)) {\n      return;\n    }\n    if (!this.deadBackChannelTimerId_) {\n      // We expect to receive data within 2 RTTs or we retry the backchannel.\n      this.deadBackChannelTimerId_ = goog.net.BrowserChannel.setTimeout(\n          goog.bind(this.onBackChannelDead_, this),\n          2 * goog.net.BrowserChannel.RTT_ESTIMATE);\n    }\n  }\n};\n\n\n/**\n * Handles a POST response from the server telling us that it has detected that\n * we have no hanging GET connection.\n * @private\n */\ngoog.net.BrowserChannel.prototype.handleBackchannelMissing_ = function() {\n  // As long as the back channel was started before the POST was sent,\n  // we should retry the backchannel. We give a slight buffer of RTT_ESTIMATE\n  // so as not to excessively retry the backchannel\n  this.channelDebug_.debug('Server claims our backchannel is missing.');\n  if (this.backChannelTimerId_) {\n    this.channelDebug_.debug('But we are currently starting the request.');\n    return;\n  } else if (!this.backChannelRequest_) {\n    this.channelDebug_.warning('We do not have a BackChannel established');\n  } else if (\n      this.backChannelRequest_.getRequestStartTime() +\n          goog.net.BrowserChannel.RTT_ESTIMATE <\n      this.forwardChannelRequest_.getRequestStartTime()) {\n    this.clearDeadBackchannelTimer_();\n    this.backChannelRequest_.cancel();\n    this.backChannelRequest_ = null;\n  } else {\n    return;\n  }\n  this.maybeRetryBackChannel_();\n  goog.net.BrowserChannel.notifyStatEvent(\n      goog.net.BrowserChannel.Stat.BACKCHANNEL_MISSING);\n};\n\n\n/**\n * Determines whether we should start the process of retrying a possibly\n * dead backchannel.\n * @param {number} outstandingBytes The number of bytes for which the server has\n *     not yet received acknowledgement.\n * @return {boolean} Whether to start the backchannel retry timer.\n * @private\n */\ngoog.net.BrowserChannel.prototype.shouldRetryBackChannel_ = function(\n    outstandingBytes) {\n  // Not too many outstanding bytes, not buffered and not after a retry.\n  return outstandingBytes <\n      goog.net.BrowserChannel.OUTSTANDING_DATA_BACKCHANNEL_RETRY_CUTOFF &&\n      !this.isBuffered() && this.backChannelRetryCount_ == 0;\n};\n\n\n/**\n * Decides which host prefix should be used, if any.  If there is a handler,\n * allows the handler to validate a host prefix provided by the server, and\n * optionally override it.\n * @param {?string} serverHostPrefix The host prefix provided by the server.\n * @return {?string} The host prefix to actually use, if any. Will return null\n *     if the use of host prefixes was disabled via setAllowHostPrefix().\n */\ngoog.net.BrowserChannel.prototype.correctHostPrefix = function(\n    serverHostPrefix) {\n  if (this.allowHostPrefix_) {\n    if (this.handler_) {\n      return this.handler_.correctHostPrefix(serverHostPrefix);\n    }\n    return serverHostPrefix;\n  }\n  return null;\n};\n\n\n/**\n * Handles the timer that indicates that our backchannel is no longer able to\n * successfully receive data from the server.\n * @private\n */\ngoog.net.BrowserChannel.prototype.onBackChannelDead_ = function() {\n  if (this.deadBackChannelTimerId_ != null) {\n    this.deadBackChannelTimerId_ = null;\n    this.backChannelRequest_.cancel();\n    this.backChannelRequest_ = null;\n    this.maybeRetryBackChannel_();\n    goog.net.BrowserChannel.notifyStatEvent(\n        goog.net.BrowserChannel.Stat.BACKCHANNEL_DEAD);\n  }\n};\n\n\n/**\n * Clears the timer that indicates that our backchannel is no longer able to\n * successfully receive data from the server.\n * @private\n */\ngoog.net.BrowserChannel.prototype.clearDeadBackchannelTimer_ = function() {\n  if (this.deadBackChannelTimerId_ != null) {\n    goog.global.clearTimeout(this.deadBackChannelTimerId_);\n    this.deadBackChannelTimerId_ = null;\n  }\n};\n\n\n/**\n * Returns whether or not the given error/status combination is fatal or not.\n * On fatal errors we immediately close the session rather than retrying the\n * failed request.\n * @param {goog.net.ChannelRequest.Error?} error The error code for the failed\n * request.\n * @param {number} statusCode The last HTTP status code.\n * @return {boolean} Whether or not the error is fatal.\n * @private\n */\ngoog.net.BrowserChannel.isFatalError_ = function(error, statusCode) {\n  return error == goog.net.ChannelRequest.Error.UNKNOWN_SESSION_ID ||\n      error == goog.net.ChannelRequest.Error.ACTIVE_X_BLOCKED ||\n      (error == goog.net.ChannelRequest.Error.STATUS && statusCode > 0);\n};\n\n\n/**\n * Callback from ChannelRequest that indicates a request has completed.\n * @param {goog.net.ChannelRequest} request  The request object.\n */\ngoog.net.BrowserChannel.prototype.onRequestComplete = function(request) {\n  this.channelDebug_.debug('Request complete');\n  var type;\n  if (this.backChannelRequest_ == request) {\n    this.clearDeadBackchannelTimer_();\n    this.backChannelRequest_ = null;\n    type = goog.net.BrowserChannel.ChannelType_.BACK_CHANNEL;\n  } else if (this.forwardChannelRequest_ == request) {\n    this.forwardChannelRequest_ = null;\n    type = goog.net.BrowserChannel.ChannelType_.FORWARD_CHANNEL;\n  } else {\n    // return if it was an old request from a previous session\n    return;\n  }\n\n  this.lastStatusCode_ = request.getLastStatusCode();\n\n  if (this.state_ == goog.net.BrowserChannel.State.CLOSED) {\n    return;\n  }\n\n  if (request.getSuccess()) {\n    // Yay!\n    if (type == goog.net.BrowserChannel.ChannelType_.FORWARD_CHANNEL) {\n      var size = request.getPostData() ? request.getPostData().length : 0;\n      goog.net.BrowserChannel.notifyTimingEvent(\n          size, goog.now() - request.getRequestStartTime(),\n          this.forwardChannelRetryCount_);\n      this.ensureForwardChannel_();\n      this.onSuccess_();\n      this.pendingMaps_.length = 0;\n    } else {  // i.e., back-channel\n      this.ensureBackChannel_();\n    }\n    return;\n  }\n  // Else unsuccessful. Fall through.\n\n  var lastError = request.getLastError();\n  if (!goog.net.BrowserChannel.isFatalError_(lastError, this.lastStatusCode_)) {\n    // Maybe retry.\n    this.channelDebug_.debug(\n        'Maybe retrying, last error: ' +\n        goog.net.ChannelRequest.errorStringFromCode(\n            /** @type {goog.net.ChannelRequest.Error} */ (lastError),\n            this.lastStatusCode_));\n    if (type == goog.net.BrowserChannel.ChannelType_.FORWARD_CHANNEL) {\n      if (this.maybeRetryForwardChannel_(request)) {\n        return;\n      }\n    }\n    if (type == goog.net.BrowserChannel.ChannelType_.BACK_CHANNEL) {\n      if (this.maybeRetryBackChannel_()) {\n        return;\n      }\n    }\n    // Else exceeded max retries. Fall through.\n    this.channelDebug_.debug('Exceeded max number of retries');\n  } else {\n    // Else fatal error. Fall through and mark the pending maps as failed.\n    this.channelDebug_.debug('Not retrying due to error type');\n  }\n\n\n  // Can't save this session. :(\n  this.channelDebug_.debug('Error: HTTP request failed');\n  switch (lastError) {\n    case goog.net.ChannelRequest.Error.NO_DATA:\n      this.signalError_(goog.net.BrowserChannel.Error.NO_DATA);\n      break;\n    case goog.net.ChannelRequest.Error.BAD_DATA:\n      this.signalError_(goog.net.BrowserChannel.Error.BAD_DATA);\n      break;\n    case goog.net.ChannelRequest.Error.UNKNOWN_SESSION_ID:\n      this.signalError_(goog.net.BrowserChannel.Error.UNKNOWN_SESSION_ID);\n      break;\n    case goog.net.ChannelRequest.Error.ACTIVE_X_BLOCKED:\n      this.signalError_(goog.net.BrowserChannel.Error.ACTIVE_X_BLOCKED);\n      break;\n    default:\n      this.signalError_(goog.net.BrowserChannel.Error.REQUEST_FAILED);\n      break;\n  }\n};\n\n\n/**\n * @param {number} retryCount Number of retries so far.\n * @return {number} Time in ms before firing next retry request.\n * @private\n */\ngoog.net.BrowserChannel.prototype.getRetryTime_ = function(retryCount) {\n  var retryTime = this.baseRetryDelayMs_ +\n      Math.floor(Math.random() * this.retryDelaySeedMs_);\n  if (!this.isActive()) {\n    this.channelDebug_.debug('Inactive channel');\n    retryTime =\n        retryTime * goog.net.BrowserChannel.INACTIVE_CHANNEL_RETRY_FACTOR;\n  }\n  // Backoff for subsequent retries\n  retryTime = retryTime * retryCount;\n  return retryTime;\n};\n\n\n/**\n * @param {number} baseDelayMs The base part of the retry delay, in ms.\n * @param {number} delaySeedMs A random delay between 0 and this is added to\n *     the base part.\n */\ngoog.net.BrowserChannel.prototype.setRetryDelay = function(\n    baseDelayMs, delaySeedMs) {\n  this.baseRetryDelayMs_ = baseDelayMs;\n  this.retryDelaySeedMs_ = delaySeedMs;\n};\n\n\n/**\n * Processes the data returned by the server.\n * @param {!Array<!Array<?>>} respArray The response array returned\n *     by the server.\n * @private\n */\ngoog.net.BrowserChannel.prototype.onInput_ = function(respArray) {\n  var batch =\n      this.handler_ && this.handler_.channelHandleMultipleArrays ? [] : null;\n  for (var i = 0; i < respArray.length; i++) {\n    var nextArray = respArray[i];\n    this.lastArrayId_ = nextArray[0];\n    nextArray = nextArray[1];\n    if (this.state_ == goog.net.BrowserChannel.State.OPENING) {\n      if (nextArray[0] == 'c') {\n        this.sid_ = nextArray[1];\n        this.hostPrefix_ = this.correctHostPrefix(nextArray[2]);\n        var negotiatedVersion = nextArray[3];\n        if (negotiatedVersion != null) {\n          this.channelVersion_ = negotiatedVersion;\n        } else {\n          // Servers prior to version 7 did not send this, so assume version 6.\n          this.channelVersion_ = 6;\n        }\n        this.state_ = goog.net.BrowserChannel.State.OPENED;\n        if (this.handler_) {\n          this.handler_.channelOpened(this);\n        }\n        this.backChannelUri_ = this.getBackChannelUri(\n            this.hostPrefix_, /** @type {string} */ (this.path_));\n        // Open connection to receive data\n        this.ensureBackChannel_();\n      } else if (nextArray[0] == 'stop') {\n        this.signalError_(goog.net.BrowserChannel.Error.STOP);\n      }\n    } else if (this.state_ == goog.net.BrowserChannel.State.OPENED) {\n      if (nextArray[0] == 'stop') {\n        if (batch && !goog.array.isEmpty(batch)) {\n          this.handler_.channelHandleMultipleArrays(this, batch);\n          batch.length = 0;\n        }\n        this.signalError_(goog.net.BrowserChannel.Error.STOP);\n      } else if (nextArray[0] == 'noop') {\n        // ignore - noop to keep connection happy\n      } else {\n        if (batch) {\n          batch.push(nextArray);\n        } else if (this.handler_) {\n          this.handler_.channelHandleArray(this, nextArray);\n        }\n      }\n      // We have received useful data on the back-channel, so clear its retry\n      // count. We do this because back-channels by design do not complete\n      // quickly, so on a flaky connection we could have many fail to complete\n      // fully but still deliver a lot of data before they fail. We don't want\n      // to count such failures towards the retry limit, because we don't want\n      // to give up on a session if we can still receive data.\n      this.backChannelRetryCount_ = 0;\n    }\n  }\n  if (batch && !goog.array.isEmpty(batch)) {\n    this.handler_.channelHandleMultipleArrays(this, batch);\n  }\n};\n\n\n/**\n * Helper to ensure the BrowserChannel is in the expected state.\n * @param {...number} var_args The channel must be in one of the indicated\n *     states.\n * @private\n */\ngoog.net.BrowserChannel.prototype.ensureInState_ = function(var_args) {\n  if (!goog.array.contains(arguments, this.state_)) {\n    throw new Error('Unexpected channel state: ' + this.state_);\n  }\n};\n\n\n/**\n * Signals an error has occurred.\n * @param {goog.net.BrowserChannel.Error} error  The error code for the failure.\n * @private\n */\ngoog.net.BrowserChannel.prototype.signalError_ = function(error) {\n  this.channelDebug_.info('Error code ' + error);\n  if (error == goog.net.BrowserChannel.Error.REQUEST_FAILED ||\n      error == goog.net.BrowserChannel.Error.BLOCKED) {\n    // Ping google to check if it's a server error or user's network error.\n    var imageUri = null;\n    if (this.handler_) {\n      imageUri = this.handler_.getNetworkTestImageUri(this);\n    }\n    goog.net.tmpnetwork.testGoogleCom(\n        goog.bind(this.testGoogleComCallback_, this), imageUri);\n  } else {\n    goog.net.BrowserChannel.notifyStatEvent(\n        goog.net.BrowserChannel.Stat.ERROR_OTHER);\n  }\n  this.onError_(error);\n};\n\n\n/**\n * Callback for testGoogleCom during error handling.\n * @param {boolean} networkUp Whether the network is up.\n * @private\n */\ngoog.net.BrowserChannel.prototype.testGoogleComCallback_ = function(networkUp) {\n  if (networkUp) {\n    this.channelDebug_.info('Successfully pinged google.com');\n    goog.net.BrowserChannel.notifyStatEvent(\n        goog.net.BrowserChannel.Stat.ERROR_OTHER);\n  } else {\n    this.channelDebug_.info('Failed to ping google.com');\n    goog.net.BrowserChannel.notifyStatEvent(\n        goog.net.BrowserChannel.Stat.ERROR_NETWORK);\n    // We call onError_ here instead of signalError_ because the latter just\n    // calls notifyStatEvent, and we don't want to have another stat event.\n    this.onError_(goog.net.BrowserChannel.Error.NETWORK);\n  }\n};\n\n\n/**\n * Called when messages have been successfully sent from the queue.\n * @private\n */\ngoog.net.BrowserChannel.prototype.onSuccess_ = function() {\n  if (this.handler_) {\n    this.handler_.channelSuccess(this, this.pendingMaps_);\n  }\n};\n\n\n/**\n * Called when we've determined the final error for a channel. It closes the\n * notifiers the handler of the error and closes the channel.\n * @param {goog.net.BrowserChannel.Error} error  The error code for the failure.\n * @private\n */\ngoog.net.BrowserChannel.prototype.onError_ = function(error) {\n  this.channelDebug_.debug('HttpChannel: error - ' + error);\n  this.state_ = goog.net.BrowserChannel.State.CLOSED;\n  if (this.handler_) {\n    this.handler_.channelError(this, error);\n  }\n  this.onClose_();\n  this.cancelRequests_();\n};\n\n\n/**\n * Called when the channel has been closed. It notifiers the handler of the\n * event, and reports any pending or undelivered maps.\n * @private\n */\ngoog.net.BrowserChannel.prototype.onClose_ = function() {\n  this.state_ = goog.net.BrowserChannel.State.CLOSED;\n  this.lastStatusCode_ = -1;\n  if (this.handler_) {\n    if (this.pendingMaps_.length == 0 && this.outgoingMaps_.length == 0) {\n      this.handler_.channelClosed(this);\n    } else {\n      this.channelDebug_.debug(\n          'Number of undelivered maps' +\n          ', pending: ' + this.pendingMaps_.length + ', outgoing: ' +\n          this.outgoingMaps_.length);\n\n      var copyOfPendingMaps = goog.array.clone(this.pendingMaps_);\n      var copyOfUndeliveredMaps = goog.array.clone(this.outgoingMaps_);\n      this.pendingMaps_.length = 0;\n      this.outgoingMaps_.length = 0;\n\n      this.handler_.channelClosed(\n          this, copyOfPendingMaps, copyOfUndeliveredMaps);\n    }\n  }\n};\n\n\n/**\n * Gets the Uri used for the connection that sends data to the server.\n * @param {string} path The path on the host.\n * @return {!goog.Uri} The forward channel URI.\n */\ngoog.net.BrowserChannel.prototype.getForwardChannelUri = function(path) {\n  var uri = this.createDataUri(null, path);\n  this.channelDebug_.debug('GetForwardChannelUri: ' + uri);\n  return uri;\n};\n\n\n/**\n * Gets the results for the first browser channel test\n * @return {Array<string>} The results.\n */\ngoog.net.BrowserChannel.prototype.getFirstTestResults = function() {\n  return this.firstTestResults_;\n};\n\n\n/**\n * Gets the results for the second browser channel test\n * @return {?boolean} The results. True -> buffered connection,\n *      False -> unbuffered, null -> unknown.\n */\ngoog.net.BrowserChannel.prototype.getSecondTestResults = function() {\n  return this.secondTestResults_;\n};\n\n\n/**\n * Gets the Uri used for the connection that receives data from the server.\n * @param {?string} hostPrefix The host prefix.\n * @param {string} path The path on the host.\n * @return {!goog.Uri} The back channel URI.\n */\ngoog.net.BrowserChannel.prototype.getBackChannelUri = function(\n    hostPrefix, path) {\n  var uri = this.createDataUri(\n      this.shouldUseSecondaryDomains() ? hostPrefix : null, path);\n  this.channelDebug_.debug('GetBackChannelUri: ' + uri);\n  return uri;\n};\n\n\n/**\n * Creates a data Uri applying logic for secondary hostprefix, port\n * overrides, and versioning.\n * @param {?string} hostPrefix The host prefix.\n * @param {string} path The path on the host (may be absolute or relative).\n * @param {number=} opt_overridePort Optional override port.\n * @return {!goog.Uri} The data URI.\n */\ngoog.net.BrowserChannel.prototype.createDataUri = function(\n    hostPrefix, path, opt_overridePort) {\n  var uri = goog.Uri.parse(path);\n  var uriAbsolute = (uri.getDomain() != '');\n  if (uriAbsolute) {\n    if (hostPrefix) {\n      uri.setDomain(hostPrefix + '.' + uri.getDomain());\n    }\n\n    uri.setPort(opt_overridePort || uri.getPort());\n  } else {\n    var locationPage = window.location;\n    var hostName;\n    if (hostPrefix) {\n      hostName = hostPrefix + '.' + locationPage.hostname;\n    } else {\n      hostName = locationPage.hostname;\n    }\n\n    var port = opt_overridePort || +locationPage.port;\n\n    uri = goog.Uri.create(locationPage.protocol, null, hostName, port, path);\n  }\n\n  if (this.extraParams_) {\n    goog.object.forEach(this.extraParams_, function(value, key) {\n      uri.setParameterValue(key, value);\n    });\n  }\n\n  // Add the protocol version to the URI.\n  uri.setParameterValue('VER', this.channelVersion_);\n\n  // Add the reconnect parameters.\n  this.addAdditionalParams_(uri);\n\n  return uri;\n};\n\n\n/**\n * Called when BC needs to create an XhrIo object.  Override in a subclass if\n * you need to customize the behavior, for example to enable the creation of\n * XHR's capable of calling a secondary domain. Will also allow calling\n * a secondary domain if withCredentials (CORS) is enabled.\n * @param {?string} hostPrefix The host prefix, if we need an XhrIo object\n *     capable of calling a secondary domain.\n * @return {!goog.net.XhrIo} A new XhrIo object.\n */\ngoog.net.BrowserChannel.prototype.createXhrIo = function(hostPrefix) {\n  if (hostPrefix && !this.supportsCrossDomainXhrs_) {\n    throw new Error('Can\\'t create secondary domain capable XhrIo object.');\n  }\n  var xhr = new goog.net.XhrIo();\n  xhr.setWithCredentials(this.supportsCrossDomainXhrs_);\n  return xhr;\n};\n\n\n/**\n * Gets whether this channel is currently active. This is used to determine the\n * length of time to wait before retrying. This call delegates to the handler.\n * @return {boolean} Whether the channel is currently active.\n */\ngoog.net.BrowserChannel.prototype.isActive = function() {\n  return !!this.handler_ && this.handler_.isActive(this);\n};\n\n\n/**\n * Wrapper around SafeTimeout which calls the start and end execution hooks\n * with a try...finally block.\n * @param {Function} fn The callback function.\n * @param {number} ms The time in MS for the timer.\n * @return {number} The ID of the timer.\n */\ngoog.net.BrowserChannel.setTimeout = function(fn, ms) {\n  if (!goog.isFunction(fn)) {\n    throw new Error('Fn must not be null and must be a function');\n  }\n  return goog.global.setTimeout(function() {\n    goog.net.BrowserChannel.onStartExecution();\n    try {\n      fn();\n    } finally {\n      goog.net.BrowserChannel.onEndExecution();\n    }\n  }, ms);\n};\n\n\n/**\n * Helper function to call the start hook\n */\ngoog.net.BrowserChannel.onStartExecution = function() {\n  goog.net.BrowserChannel.startExecutionHook_();\n};\n\n\n/**\n * Helper function to call the end hook\n */\ngoog.net.BrowserChannel.onEndExecution = function() {\n  goog.net.BrowserChannel.endExecutionHook_();\n};\n\n\n/**\n * Returns the singleton event target for stat events.\n * @return {goog.events.EventTarget} The event target for stat events.\n */\ngoog.net.BrowserChannel.getStatEventTarget = function() {\n  return goog.net.BrowserChannel.statEventTarget_;\n};\n\n\n/**\n * Notify the channel that a particular fine grained network event has occurred.\n * Should be considered package-private.\n * @param {goog.net.BrowserChannel.ServerReachability} reachabilityType The\n *     reachability event type.\n */\ngoog.net.BrowserChannel.prototype.notifyServerReachabilityEvent = function(\n    reachabilityType) {\n  var target = goog.net.BrowserChannel.statEventTarget_;\n  target.dispatchEvent(\n      new goog.net.BrowserChannel.ServerReachabilityEvent(\n          target, reachabilityType));\n};\n\n\n/**\n * Helper function to call the stat event callback.\n * @param {goog.net.BrowserChannel.Stat} stat The stat.\n */\ngoog.net.BrowserChannel.notifyStatEvent = function(stat) {\n  var target = goog.net.BrowserChannel.statEventTarget_;\n  target.dispatchEvent(new goog.net.BrowserChannel.StatEvent(target, stat));\n};\n\n\n/**\n * Helper function to notify listeners about POST request performance.\n *\n * @param {number} size Number of characters in the POST data.\n * @param {number} rtt The amount of time from POST start to response.\n * @param {number} retries The number of times the POST had to be retried.\n */\ngoog.net.BrowserChannel.notifyTimingEvent = function(size, rtt, retries) {\n  var target = goog.net.BrowserChannel.statEventTarget_;\n  target.dispatchEvent(\n      new goog.net.BrowserChannel.TimingEvent(target, size, rtt, retries));\n};\n\n\n/**\n * Determines whether to use a secondary domain when the server gives us\n * a host prefix. This allows us to work around browser per-domain\n * connection limits.\n *\n * Currently, we  use secondary domains when using Trident's ActiveXObject,\n * because it supports cross-domain requests out of the box.  Note that in IE10\n * we no longer use ActiveX since it's not supported in Metro mode and IE10\n * supports XHR streaming.\n *\n * If you need to use secondary domains on other browsers and IE10,\n * you have two choices:\n *     1) If you only care about browsers that support CORS\n *        (https://developer.mozilla.org/en-US/docs/HTTP_access_control), you\n *        can use {@link #setSupportsCrossDomainXhrs} and set the appropriate\n *        CORS response headers on the server.\n *     2) Or, override this method in a subclass, and make sure that those\n *        browsers use some messaging mechanism that works cross-domain (e.g\n *        iframes and window.postMessage).\n *\n * @return {boolean} Whether to use secondary domains.\n * @see http://code.google.com/p/closure-library/issues/detail?id=339\n */\ngoog.net.BrowserChannel.prototype.shouldUseSecondaryDomains = function() {\n  return this.supportsCrossDomainXhrs_ ||\n      !goog.net.ChannelRequest.supportsXhrStreaming();\n};\n\n\n/**\n * A LogSaver that can be used to accumulate all the debug logs for\n * BrowserChannels so they can be sent to the server when a problem is\n * detected.\n * @const\n */\ngoog.net.BrowserChannel.LogSaver = {};\n\n\n/**\n * Buffer for accumulating the debug log\n * @type {goog.structs.CircularBuffer}\n * @private\n */\ngoog.net.BrowserChannel.LogSaver.buffer_ =\n    new goog.structs.CircularBuffer(1000);\n\n\n/**\n * Whether we're currently accumulating the debug log.\n * @type {boolean}\n * @private\n */\ngoog.net.BrowserChannel.LogSaver.enabled_ = false;\n\n\n/**\n * Formatter for saving logs.\n * @type {goog.debug.Formatter}\n * @private\n */\ngoog.net.BrowserChannel.LogSaver.formatter_ = new goog.debug.TextFormatter();\n\n\n/**\n * Returns whether the LogSaver is enabled.\n * @return {boolean} Whether saving is enabled or disabled.\n */\ngoog.net.BrowserChannel.LogSaver.isEnabled = function() {\n  return goog.net.BrowserChannel.LogSaver.enabled_;\n};\n\n\n/**\n * Enables of disables the LogSaver.\n * @param {boolean} enable Whether to enable or disable saving.\n */\ngoog.net.BrowserChannel.LogSaver.setEnabled = function(enable) {\n  if (enable == goog.net.BrowserChannel.LogSaver.enabled_) {\n    return;\n  }\n\n  var fn = goog.net.BrowserChannel.LogSaver.addLogRecord;\n  var logger = goog.log.getLogger('goog.net');\n  if (enable) {\n    goog.log.addHandler(logger, fn);\n  } else {\n    goog.log.removeHandler(logger, fn);\n  }\n};\n\n\n/**\n * Adds a log record.\n * @param {goog.log.LogRecord} logRecord the LogRecord.\n */\ngoog.net.BrowserChannel.LogSaver.addLogRecord = function(logRecord) {\n  goog.net.BrowserChannel.LogSaver.buffer_.add(\n      goog.net.BrowserChannel.LogSaver.formatter_.formatRecord(logRecord));\n};\n\n\n/**\n * Returns the log as a single string.\n * @return {string} The log as a single string.\n */\ngoog.net.BrowserChannel.LogSaver.getBuffer = function() {\n  return goog.net.BrowserChannel.LogSaver.buffer_.getValues().join('');\n};\n\n\n/**\n * Clears the buffer\n */\ngoog.net.BrowserChannel.LogSaver.clearBuffer = function() {\n  goog.net.BrowserChannel.LogSaver.buffer_.clear();\n};\n\n\n\n/**\n * Abstract base class for the browser channel handler\n * @constructor\n */\ngoog.net.BrowserChannel.Handler = function() {};\n\n\n/**\n * Callback handler for when a batch of response arrays is received from the\n * server.\n * @type {?function(!goog.net.BrowserChannel, !Array<!Array<?>>)}\n */\ngoog.net.BrowserChannel.Handler.prototype.channelHandleMultipleArrays = null;\n\n\n/**\n * Whether it's okay to make a request to the server. A handler can return\n * false if the channel should fail. For example, if the user has logged out,\n * the handler may want all requests to fail immediately.\n * @param {goog.net.BrowserChannel} browserChannel The browser channel.\n * @return {goog.net.BrowserChannel.Error} An error code. The code should\n * return goog.net.BrowserChannel.Error.OK to indicate it's okay. Any other\n * error code will cause a failure.\n */\ngoog.net.BrowserChannel.Handler.prototype.okToMakeRequest = function(\n    browserChannel) {\n  return goog.net.BrowserChannel.Error.OK;\n};\n\n\n/**\n * Indicates the BrowserChannel has successfully negotiated with the server\n * and can now send and receive data.\n * @param {goog.net.BrowserChannel} browserChannel The browser channel.\n */\ngoog.net.BrowserChannel.Handler.prototype.channelOpened = function(\n    browserChannel) {};\n\n\n/**\n * New input is available for the application to process.\n *\n * @param {goog.net.BrowserChannel} browserChannel The browser channel.\n * @param {Array<?>} array The data array.\n */\ngoog.net.BrowserChannel.Handler.prototype.channelHandleArray = function(\n    browserChannel, array) {};\n\n\n/**\n * Indicates maps were successfully sent on the BrowserChannel.\n *\n * @param {goog.net.BrowserChannel} browserChannel The browser channel.\n * @param {Array<goog.net.BrowserChannel.QueuedMap>} deliveredMaps The\n *     array of maps that have been delivered to the server. This is a direct\n *     reference to the internal BrowserChannel array, so a copy should be made\n *     if the caller desires a reference to the data.\n */\ngoog.net.BrowserChannel.Handler.prototype.channelSuccess = function(\n    browserChannel, deliveredMaps) {};\n\n\n/**\n * Indicates an error occurred on the BrowserChannel.\n *\n * @param {goog.net.BrowserChannel} browserChannel The browser channel.\n * @param {goog.net.BrowserChannel.Error} error The error code.\n */\ngoog.net.BrowserChannel.Handler.prototype.channelError = function(\n    browserChannel, error) {};\n\n\n/**\n * Indicates the BrowserChannel is closed. Also notifies about which maps,\n * if any, that may not have been delivered to the server.\n * @param {goog.net.BrowserChannel} browserChannel The browser channel.\n * @param {Array<goog.net.BrowserChannel.QueuedMap>=} opt_pendingMaps The\n *     array of pending maps, which may or may not have been delivered to the\n *     server.\n * @param {Array<goog.net.BrowserChannel.QueuedMap>=} opt_undeliveredMaps\n *     The array of undelivered maps, which have definitely not been delivered\n *     to the server.\n */\ngoog.net.BrowserChannel.Handler.prototype.channelClosed = function(\n    browserChannel, opt_pendingMaps, opt_undeliveredMaps) {};\n\n\n/**\n * Gets any parameters that should be added at the time another connection is\n * made to the server.\n * @param {goog.net.BrowserChannel} browserChannel The browser channel.\n * @return {!Object} Extra parameter keys and values to add to the\n *     requests.\n */\ngoog.net.BrowserChannel.Handler.prototype.getAdditionalParams = function(\n    browserChannel) {\n  return {};\n};\n\n\n/**\n * Gets the URI of an image that can be used to test network connectivity.\n * @param {goog.net.BrowserChannel} browserChannel The browser channel.\n * @return {goog.Uri?} A custom URI to load for the network test.\n */\ngoog.net.BrowserChannel.Handler.prototype.getNetworkTestImageUri = function(\n    browserChannel) {\n  return null;\n};\n\n\n/**\n * Gets whether this channel is currently active. This is used to determine the\n * length of time to wait before retrying.\n * @param {goog.net.BrowserChannel} browserChannel The browser channel.\n * @return {boolean} Whether the channel is currently active.\n */\ngoog.net.BrowserChannel.Handler.prototype.isActive = function(browserChannel) {\n  return true;\n};\n\n\n/**\n * Called by the channel if enumeration of the map throws an exception.\n * @param {goog.net.BrowserChannel} browserChannel The browser channel.\n * @param {Object} map The map that can't be enumerated.\n */\ngoog.net.BrowserChannel.Handler.prototype.badMapError = function(\n    browserChannel, map) {\n  return;\n};\n\n\n/**\n * Allows the handler to override a host prefix provided by the server.  Will\n * be called whenever the channel has received such a prefix and is considering\n * its use.\n * @param {?string} serverHostPrefix The host prefix provided by the server.\n * @return {?string} The host prefix the client should use.\n */\ngoog.net.BrowserChannel.Handler.prototype.correctHostPrefix = function(\n    serverHostPrefix) {\n  return serverHostPrefix;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.json.NativeJsonProcessor","~$goog.debug.TextFormatter","~$goog.net.ChannelDebug","^;N","^<A","~$goog.structs.CircularBuffer","^9L","~$goog.Uri","^9>","~$goog.net.tmpnetwork","^;P","^:L","^;Q","~$goog.structs","~$goog.net.ChannelRequest","^;8","^;9","~$goog.net.BrowserTestChannel"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/browserchannel.js"],"^:1",["^9K",["~$goog.net.BrowserChannel.ServerReachabilityEvent","~$goog.net.BrowserChannel.Stat","~$goog.net.BrowserChannel.StatEvent","~$goog.net.BrowserChannel","~$goog.net.BrowserChannel.LogSaver","~$goog.net.BrowserChannel.State","~$goog.net.BrowserChannel.TimingEvent","~$goog.net.BrowserChannel.Event","~$goog.net.BrowserChannel.QueuedMap","~$goog.net.BrowserChannel.Error","~$goog.net.BrowserChannel.ServerReachability","~$goog.net.BrowserChannel.Handler"]],"^9<",true,"^9=",["^9>","^<S","^;9","^:E","^<P","^;8","^:L","^<A","^<O","^;Q","^<W","^<Q","^<V","^;N","^<T","^;P","^9L","^<U","^<R"]],["^ ","^9A",[1579837703000],"^9B","goog.vec.mat4d.js","^9C",["^9D","goog/vec/mat4d.js"],"^9E","goog/vec/mat4d.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n//                                                                           //\n// Any edits to this file must be applied to mat4f.js by running:            //\n//   swap_type.sh mat4d.js > mat4f.js                                        //\n//                                                                           //\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n\n\n/**\n * @fileoverview Provides functions for operating on 4x4 double (64bit)\n * matrices.  The matrices are stored in column-major order.\n *\n * The last parameter will typically be the output matrix and an\n * object can be both an input and output parameter to all methods except\n * where noted.\n *\n * See the README for notes about the design and structure of the API\n * (especially related to performance).\n *\n */\ngoog.provide('goog.vec.mat4d');\ngoog.provide('goog.vec.mat4d.Type');\n\ngoog.require('goog.vec');\n/** @suppress {extraRequire} */\ngoog.require('goog.vec.Quaternion');\ngoog.require('goog.vec.vec3d');\ngoog.require('goog.vec.vec4d');\n\n\n/** @typedef {!goog.vec.Float64} */ goog.vec.mat4d.Type;\n\n\n/**\n * Creates a mat4d with all elements initialized to zero.\n *\n * @return {!goog.vec.mat4d.Type} The new mat4d.\n */\ngoog.vec.mat4d.create = function() {\n  return new Float64Array(16);\n};\n\n\n/**\n * Creates a mat4d identity matrix.\n *\n * @return {!goog.vec.mat4d.Type} The new mat4d.\n */\ngoog.vec.mat4d.createIdentity = function() {\n  var mat = goog.vec.mat4d.create();\n  mat[0] = mat[5] = mat[10] = mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Initializes the matrix from the set of values. Note the values supplied are\n * in column major order.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix to receive the\n *     values.\n * @param {number} v00 The values at (0, 0).\n * @param {number} v10 The values at (1, 0).\n * @param {number} v20 The values at (2, 0).\n * @param {number} v30 The values at (3, 0).\n * @param {number} v01 The values at (0, 1).\n * @param {number} v11 The values at (1, 1).\n * @param {number} v21 The values at (2, 1).\n * @param {number} v31 The values at (3, 1).\n * @param {number} v02 The values at (0, 2).\n * @param {number} v12 The values at (1, 2).\n * @param {number} v22 The values at (2, 2).\n * @param {number} v32 The values at (3, 2).\n * @param {number} v03 The values at (0, 3).\n * @param {number} v13 The values at (1, 3).\n * @param {number} v23 The values at (2, 3).\n * @param {number} v33 The values at (3, 3).\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.setFromValues = function(\n    mat, v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13,\n    v23, v33) {\n  mat[0] = v00;\n  mat[1] = v10;\n  mat[2] = v20;\n  mat[3] = v30;\n  mat[4] = v01;\n  mat[5] = v11;\n  mat[6] = v21;\n  mat[7] = v31;\n  mat[8] = v02;\n  mat[9] = v12;\n  mat[10] = v22;\n  mat[11] = v32;\n  mat[12] = v03;\n  mat[13] = v13;\n  mat[14] = v23;\n  mat[15] = v33;\n  return mat;\n};\n\n\n/**\n * Initializes mat4d mat from mat4d src.\n *\n * @param {!goog.vec.mat4d.Type} mat The destination matrix.\n * @param {!goog.vec.mat4d.Type} src The source matrix.\n * @return {!goog.vec.mat4d.Type} Return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.setFromMat4d = function(mat, src) {\n  mat[0] = src[0];\n  mat[1] = src[1];\n  mat[2] = src[2];\n  mat[3] = src[3];\n  mat[4] = src[4];\n  mat[5] = src[5];\n  mat[6] = src[6];\n  mat[7] = src[7];\n  mat[8] = src[8];\n  mat[9] = src[9];\n  mat[10] = src[10];\n  mat[11] = src[11];\n  mat[12] = src[12];\n  mat[13] = src[13];\n  mat[14] = src[14];\n  mat[15] = src[15];\n  return mat;\n};\n\n\n/**\n * Initializes mat4d mat from mat4f src (typed as a Float32Array to\n * avoid circular goog.requires).\n *\n * @param {!goog.vec.mat4d.Type} mat The destination matrix.\n * @param {Float32Array} src The source matrix.\n * @return {!goog.vec.mat4d.Type} Return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.setFromMat4f = function(mat, src) {\n  mat[0] = src[0];\n  mat[1] = src[1];\n  mat[2] = src[2];\n  mat[3] = src[3];\n  mat[4] = src[4];\n  mat[5] = src[5];\n  mat[6] = src[6];\n  mat[7] = src[7];\n  mat[8] = src[8];\n  mat[9] = src[9];\n  mat[10] = src[10];\n  mat[11] = src[11];\n  mat[12] = src[12];\n  mat[13] = src[13];\n  mat[14] = src[14];\n  mat[15] = src[15];\n  return mat;\n};\n\n\n/**\n * Initializes mat4d mat from Array src.\n *\n * @param {!goog.vec.mat4d.Type} mat The destination matrix.\n * @param {Array<number>} src The source matrix.\n * @return {!goog.vec.mat4d.Type} Return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.setFromArray = function(mat, src) {\n  mat[0] = src[0];\n  mat[1] = src[1];\n  mat[2] = src[2];\n  mat[3] = src[3];\n  mat[4] = src[4];\n  mat[5] = src[5];\n  mat[6] = src[6];\n  mat[7] = src[7];\n  mat[8] = src[8];\n  mat[9] = src[9];\n  mat[10] = src[10];\n  mat[11] = src[11];\n  mat[12] = src[12];\n  mat[13] = src[13];\n  mat[14] = src[14];\n  mat[15] = src[15];\n  return mat;\n};\n\n\n/**\n * Retrieves the element at the requested row and column.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix containing the value to\n *     retrieve.\n * @param {number} row The row index.\n * @param {number} column The column index.\n * @return {number} The element value at the requested row, column indices.\n */\ngoog.vec.mat4d.getElement = function(mat, row, column) {\n  return mat[row + column * 4];\n};\n\n\n/**\n * Sets the element at the requested row and column.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix containing the value to\n *     retrieve.\n * @param {number} row The row index.\n * @param {number} column The column index.\n * @param {number} value The value to set at the requested row, column.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.setElement = function(mat, row, column, value) {\n  mat[row + column * 4] = value;\n  return mat;\n};\n\n\n/**\n * Sets the diagonal values of the matrix from the given values.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix to receive the values.\n * @param {number} v00 The values for (0, 0).\n * @param {number} v11 The values for (1, 1).\n * @param {number} v22 The values for (2, 2).\n * @param {number} v33 The values for (3, 3).\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.setDiagonalValues = function(mat, v00, v11, v22, v33) {\n  mat[0] = v00;\n  mat[5] = v11;\n  mat[10] = v22;\n  mat[15] = v33;\n  return mat;\n};\n\n\n/**\n * Sets the diagonal values of the matrix from the given vector.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix to receive the values.\n * @param {!goog.vec.vec4d.Type} vec The vector containing the values.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.setDiagonal = function(mat, vec) {\n  mat[0] = vec[0];\n  mat[5] = vec[1];\n  mat[10] = vec[2];\n  mat[15] = vec[3];\n  return mat;\n};\n\n\n/**\n * Gets the diagonal values of the matrix into the given vector.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix containing the values.\n * @param {!goog.vec.vec4d.Type} vec The vector to receive the values.\n * @param {number=} opt_diagonal Which diagonal to get. A value of 0 selects the\n *     main diagonal, a positive number selects a super diagonal and a negative\n *     number selects a sub diagonal.\n * @return {!goog.vec.vec4d.Type} return vec so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.getDiagonal = function(mat, vec, opt_diagonal) {\n  if (!opt_diagonal) {\n    // This is the most common case, so we avoid the for loop.\n    vec[0] = mat[0];\n    vec[1] = mat[5];\n    vec[2] = mat[10];\n    vec[3] = mat[15];\n  } else {\n    var offset = opt_diagonal > 0 ? 4 * opt_diagonal : -opt_diagonal;\n    for (var i = 0; i < 4 - Math.abs(opt_diagonal); i++) {\n      vec[i] = mat[offset + 5 * i];\n    }\n  }\n  return vec;\n};\n\n\n/**\n * Sets the specified column with the supplied values.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix to receive the values.\n * @param {number} column The column index to set the values on.\n * @param {number} v0 The value for row 0.\n * @param {number} v1 The value for row 1.\n * @param {number} v2 The value for row 2.\n * @param {number} v3 The value for row 3.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.setColumnValues = function(mat, column, v0, v1, v2, v3) {\n  var i = column * 4;\n  mat[i] = v0;\n  mat[i + 1] = v1;\n  mat[i + 2] = v2;\n  mat[i + 3] = v3;\n  return mat;\n};\n\n\n/**\n * Sets the specified column with the value from the supplied vector.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix to receive the values.\n * @param {number} column The column index to set the values on.\n * @param {!goog.vec.vec4d.Type} vec The vector of elements for the column.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.setColumn = function(mat, column, vec) {\n  var i = column * 4;\n  mat[i] = vec[0];\n  mat[i + 1] = vec[1];\n  mat[i + 2] = vec[2];\n  mat[i + 3] = vec[3];\n  return mat;\n};\n\n\n/**\n * Retrieves the specified column from the matrix into the given vector.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix supplying the values.\n * @param {number} column The column to get the values from.\n * @param {!goog.vec.vec4d.Type} vec The vector of elements to\n *     receive the column.\n * @return {!goog.vec.vec4d.Type} return vec so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.getColumn = function(mat, column, vec) {\n  var i = column * 4;\n  vec[0] = mat[i];\n  vec[1] = mat[i + 1];\n  vec[2] = mat[i + 2];\n  vec[3] = mat[i + 3];\n  return vec;\n};\n\n\n/**\n * Sets the columns of the matrix from the given vectors.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix to receive the values.\n * @param {!goog.vec.vec4d.Type} vec0 The values for column 0.\n * @param {!goog.vec.vec4d.Type} vec1 The values for column 1.\n * @param {!goog.vec.vec4d.Type} vec2 The values for column 2.\n * @param {!goog.vec.vec4d.Type} vec3 The values for column 3.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.setColumns = function(mat, vec0, vec1, vec2, vec3) {\n  mat[0] = vec0[0];\n  mat[1] = vec0[1];\n  mat[2] = vec0[2];\n  mat[3] = vec0[3];\n  mat[4] = vec1[0];\n  mat[5] = vec1[1];\n  mat[6] = vec1[2];\n  mat[7] = vec1[3];\n  mat[8] = vec2[0];\n  mat[9] = vec2[1];\n  mat[10] = vec2[2];\n  mat[11] = vec2[3];\n  mat[12] = vec3[0];\n  mat[13] = vec3[1];\n  mat[14] = vec3[2];\n  mat[15] = vec3[3];\n  return mat;\n};\n\n\n/**\n * Retrieves the column values from the given matrix into the given vectors.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix supplying the columns.\n * @param {!goog.vec.vec4d.Type} vec0 The vector to receive column 0.\n * @param {!goog.vec.vec4d.Type} vec1 The vector to receive column 1.\n * @param {!goog.vec.vec4d.Type} vec2 The vector to receive column 2.\n * @param {!goog.vec.vec4d.Type} vec3 The vector to receive column 3.\n */\ngoog.vec.mat4d.getColumns = function(mat, vec0, vec1, vec2, vec3) {\n  vec0[0] = mat[0];\n  vec0[1] = mat[1];\n  vec0[2] = mat[2];\n  vec0[3] = mat[3];\n  vec1[0] = mat[4];\n  vec1[1] = mat[5];\n  vec1[2] = mat[6];\n  vec1[3] = mat[7];\n  vec2[0] = mat[8];\n  vec2[1] = mat[9];\n  vec2[2] = mat[10];\n  vec2[3] = mat[11];\n  vec3[0] = mat[12];\n  vec3[1] = mat[13];\n  vec3[2] = mat[14];\n  vec3[3] = mat[15];\n};\n\n\n/**\n * Sets the row values from the supplied values.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix to receive the values.\n * @param {number} row The index of the row to receive the values.\n * @param {number} v0 The value for column 0.\n * @param {number} v1 The value for column 1.\n * @param {number} v2 The value for column 2.\n * @param {number} v3 The value for column 3.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.setRowValues = function(mat, row, v0, v1, v2, v3) {\n  mat[row] = v0;\n  mat[row + 4] = v1;\n  mat[row + 8] = v2;\n  mat[row + 12] = v3;\n  return mat;\n};\n\n\n/**\n * Sets the row values from the supplied vector.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix to receive the row values.\n * @param {number} row The index of the row.\n * @param {!goog.vec.vec4d.Type} vec The vector containing the values.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.setRow = function(mat, row, vec) {\n  mat[row] = vec[0];\n  mat[row + 4] = vec[1];\n  mat[row + 8] = vec[2];\n  mat[row + 12] = vec[3];\n  return mat;\n};\n\n\n/**\n * Retrieves the row values into the given vector.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix supplying the values.\n * @param {number} row The index of the row supplying the values.\n * @param {!goog.vec.vec4d.Type} vec The vector to receive the row.\n * @return {!goog.vec.vec4d.Type} return vec so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.getRow = function(mat, row, vec) {\n  vec[0] = mat[row];\n  vec[1] = mat[row + 4];\n  vec[2] = mat[row + 8];\n  vec[3] = mat[row + 12];\n  return vec;\n};\n\n\n/**\n * Sets the rows of the matrix from the supplied vectors.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix to receive the values.\n * @param {!goog.vec.vec4d.Type} vec0 The values for row 0.\n * @param {!goog.vec.vec4d.Type} vec1 The values for row 1.\n * @param {!goog.vec.vec4d.Type} vec2 The values for row 2.\n * @param {!goog.vec.vec4d.Type} vec3 The values for row 3.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.setRows = function(mat, vec0, vec1, vec2, vec3) {\n  mat[0] = vec0[0];\n  mat[1] = vec1[0];\n  mat[2] = vec2[0];\n  mat[3] = vec3[0];\n  mat[4] = vec0[1];\n  mat[5] = vec1[1];\n  mat[6] = vec2[1];\n  mat[7] = vec3[1];\n  mat[8] = vec0[2];\n  mat[9] = vec1[2];\n  mat[10] = vec2[2];\n  mat[11] = vec3[2];\n  mat[12] = vec0[3];\n  mat[13] = vec1[3];\n  mat[14] = vec2[3];\n  mat[15] = vec3[3];\n  return mat;\n};\n\n\n/**\n * Retrieves the rows of the matrix into the supplied vectors.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix to supply the values.\n * @param {!goog.vec.vec4d.Type} vec0 The vector to receive row 0.\n * @param {!goog.vec.vec4d.Type} vec1 The vector to receive row 1.\n * @param {!goog.vec.vec4d.Type} vec2 The vector to receive row 2.\n * @param {!goog.vec.vec4d.Type} vec3 The vector to receive row 3.\n */\ngoog.vec.mat4d.getRows = function(mat, vec0, vec1, vec2, vec3) {\n  vec0[0] = mat[0];\n  vec1[0] = mat[1];\n  vec2[0] = mat[2];\n  vec3[0] = mat[3];\n  vec0[1] = mat[4];\n  vec1[1] = mat[5];\n  vec2[1] = mat[6];\n  vec3[1] = mat[7];\n  vec0[2] = mat[8];\n  vec1[2] = mat[9];\n  vec2[2] = mat[10];\n  vec3[2] = mat[11];\n  vec0[3] = mat[12];\n  vec1[3] = mat[13];\n  vec2[3] = mat[14];\n  vec3[3] = mat[15];\n};\n\n\n/**\n * Makes the given 4x4 matrix the zero matrix.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @return {!goog.vec.mat4d.Type} return mat so operations can be chained.\n */\ngoog.vec.mat4d.makeZero = function(mat) {\n  mat[0] = 0;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = 0;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = 0;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 0;\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix the identity matrix.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @return {!goog.vec.mat4d.Type} return mat so operations can be chained.\n */\ngoog.vec.mat4d.makeIdentity = function(mat) {\n  mat[0] = 1;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = 1;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = 1;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Performs a per-component addition of the matrix mat0 and mat1, storing\n * the result into resultMat.\n *\n * @param {!goog.vec.mat4d.Type} mat0 The first addend.\n * @param {!goog.vec.mat4d.Type} mat1 The second addend.\n * @param {!goog.vec.mat4d.Type} resultMat The matrix to\n *     receive the results (may be either mat0 or mat1).\n * @return {!goog.vec.mat4d.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.addMat = function(mat0, mat1, resultMat) {\n  resultMat[0] = mat0[0] + mat1[0];\n  resultMat[1] = mat0[1] + mat1[1];\n  resultMat[2] = mat0[2] + mat1[2];\n  resultMat[3] = mat0[3] + mat1[3];\n  resultMat[4] = mat0[4] + mat1[4];\n  resultMat[5] = mat0[5] + mat1[5];\n  resultMat[6] = mat0[6] + mat1[6];\n  resultMat[7] = mat0[7] + mat1[7];\n  resultMat[8] = mat0[8] + mat1[8];\n  resultMat[9] = mat0[9] + mat1[9];\n  resultMat[10] = mat0[10] + mat1[10];\n  resultMat[11] = mat0[11] + mat1[11];\n  resultMat[12] = mat0[12] + mat1[12];\n  resultMat[13] = mat0[13] + mat1[13];\n  resultMat[14] = mat0[14] + mat1[14];\n  resultMat[15] = mat0[15] + mat1[15];\n  return resultMat;\n};\n\n\n/**\n * Performs a per-component subtraction of the matrix mat0 and mat1,\n * storing the result into resultMat.\n *\n * @param {!goog.vec.mat4d.Type} mat0 The minuend.\n * @param {!goog.vec.mat4d.Type} mat1 The subtrahend.\n * @param {!goog.vec.mat4d.Type} resultMat The matrix to receive\n *     the results (may be either mat0 or mat1).\n * @return {!goog.vec.mat4d.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.subMat = function(mat0, mat1, resultMat) {\n  resultMat[0] = mat0[0] - mat1[0];\n  resultMat[1] = mat0[1] - mat1[1];\n  resultMat[2] = mat0[2] - mat1[2];\n  resultMat[3] = mat0[3] - mat1[3];\n  resultMat[4] = mat0[4] - mat1[4];\n  resultMat[5] = mat0[5] - mat1[5];\n  resultMat[6] = mat0[6] - mat1[6];\n  resultMat[7] = mat0[7] - mat1[7];\n  resultMat[8] = mat0[8] - mat1[8];\n  resultMat[9] = mat0[9] - mat1[9];\n  resultMat[10] = mat0[10] - mat1[10];\n  resultMat[11] = mat0[11] - mat1[11];\n  resultMat[12] = mat0[12] - mat1[12];\n  resultMat[13] = mat0[13] - mat1[13];\n  resultMat[14] = mat0[14] - mat1[14];\n  resultMat[15] = mat0[15] - mat1[15];\n  return resultMat;\n};\n\n\n/**\n * Multiplies matrix mat with the given scalar, storing the result\n * into resultMat.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} scalar The scalar value to multiply to each element of mat.\n * @param {!goog.vec.mat4d.Type} resultMat The matrix to receive\n *     the results (may be mat).\n * @return {!goog.vec.mat4d.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.multScalar = function(mat, scalar, resultMat) {\n  resultMat[0] = mat[0] * scalar;\n  resultMat[1] = mat[1] * scalar;\n  resultMat[2] = mat[2] * scalar;\n  resultMat[3] = mat[3] * scalar;\n  resultMat[4] = mat[4] * scalar;\n  resultMat[5] = mat[5] * scalar;\n  resultMat[6] = mat[6] * scalar;\n  resultMat[7] = mat[7] * scalar;\n  resultMat[8] = mat[8] * scalar;\n  resultMat[9] = mat[9] * scalar;\n  resultMat[10] = mat[10] * scalar;\n  resultMat[11] = mat[11] * scalar;\n  resultMat[12] = mat[12] * scalar;\n  resultMat[13] = mat[13] * scalar;\n  resultMat[14] = mat[14] * scalar;\n  resultMat[15] = mat[15] * scalar;\n  return resultMat;\n};\n\n\n/**\n * Multiplies the two matrices mat0 and mat1 using matrix multiplication,\n * storing the result into resultMat.\n *\n * @param {!goog.vec.mat4d.Type} mat0 The first (left hand) matrix.\n * @param {!goog.vec.mat4d.Type} mat1 The second (right hand) matrix.\n * @param {!goog.vec.mat4d.Type} resultMat The matrix to receive\n *     the results (may be either mat0 or mat1).\n * @return {!goog.vec.mat4d.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.multMat = function(mat0, mat1, resultMat) {\n  var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2], a30 = mat0[3];\n  var a01 = mat0[4], a11 = mat0[5], a21 = mat0[6], a31 = mat0[7];\n  var a02 = mat0[8], a12 = mat0[9], a22 = mat0[10], a32 = mat0[11];\n  var a03 = mat0[12], a13 = mat0[13], a23 = mat0[14], a33 = mat0[15];\n\n  var b00 = mat1[0], b10 = mat1[1], b20 = mat1[2], b30 = mat1[3];\n  var b01 = mat1[4], b11 = mat1[5], b21 = mat1[6], b31 = mat1[7];\n  var b02 = mat1[8], b12 = mat1[9], b22 = mat1[10], b32 = mat1[11];\n  var b03 = mat1[12], b13 = mat1[13], b23 = mat1[14], b33 = mat1[15];\n\n  resultMat[0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30;\n  resultMat[1] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30;\n  resultMat[2] = a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30;\n  resultMat[3] = a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30;\n\n  resultMat[4] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31;\n  resultMat[5] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31;\n  resultMat[6] = a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31;\n  resultMat[7] = a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31;\n\n  resultMat[8] = a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32;\n  resultMat[9] = a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32;\n  resultMat[10] = a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32;\n  resultMat[11] = a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32;\n\n  resultMat[12] = a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33;\n  resultMat[13] = a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33;\n  resultMat[14] = a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33;\n  resultMat[15] = a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33;\n  return resultMat;\n};\n\n\n/**\n * Transposes the given matrix mat storing the result into resultMat.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix to transpose.\n * @param {!goog.vec.mat4d.Type} resultMat The matrix to receive\n *     the results (may be mat).\n * @return {!goog.vec.mat4d.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.transpose = function(mat, resultMat) {\n  if (resultMat == mat) {\n    var a10 = mat[1], a20 = mat[2], a30 = mat[3];\n    var a21 = mat[6], a31 = mat[7];\n    var a32 = mat[11];\n    resultMat[1] = mat[4];\n    resultMat[2] = mat[8];\n    resultMat[3] = mat[12];\n    resultMat[4] = a10;\n    resultMat[6] = mat[9];\n    resultMat[7] = mat[13];\n    resultMat[8] = a20;\n    resultMat[9] = a21;\n    resultMat[11] = mat[14];\n    resultMat[12] = a30;\n    resultMat[13] = a31;\n    resultMat[14] = a32;\n  } else {\n    resultMat[0] = mat[0];\n    resultMat[1] = mat[4];\n    resultMat[2] = mat[8];\n    resultMat[3] = mat[12];\n\n    resultMat[4] = mat[1];\n    resultMat[5] = mat[5];\n    resultMat[6] = mat[9];\n    resultMat[7] = mat[13];\n\n    resultMat[8] = mat[2];\n    resultMat[9] = mat[6];\n    resultMat[10] = mat[10];\n    resultMat[11] = mat[14];\n\n    resultMat[12] = mat[3];\n    resultMat[13] = mat[7];\n    resultMat[14] = mat[11];\n    resultMat[15] = mat[15];\n  }\n  return resultMat;\n};\n\n\n/**\n * Computes the determinant of the matrix.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix to compute the matrix for.\n * @return {number} The determinant of the matrix.\n */\ngoog.vec.mat4d.determinant = function(mat) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];\n  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];\n  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];\n  var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15];\n\n  var a0 = m00 * m11 - m10 * m01;\n  var a1 = m00 * m21 - m20 * m01;\n  var a2 = m00 * m31 - m30 * m01;\n  var a3 = m10 * m21 - m20 * m11;\n  var a4 = m10 * m31 - m30 * m11;\n  var a5 = m20 * m31 - m30 * m21;\n  var b0 = m02 * m13 - m12 * m03;\n  var b1 = m02 * m23 - m22 * m03;\n  var b2 = m02 * m33 - m32 * m03;\n  var b3 = m12 * m23 - m22 * m13;\n  var b4 = m12 * m33 - m32 * m13;\n  var b5 = m22 * m33 - m32 * m23;\n\n  return a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0;\n};\n\n\n/**\n * Computes the inverse of mat storing the result into resultMat. If the\n * inverse is defined, this function returns true, false otherwise.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix to invert.\n * @param {!goog.vec.mat4d.Type} resultMat The matrix to receive\n *     the result (may be mat).\n * @return {boolean} True if the inverse is defined. If false is returned,\n *     resultMat is not modified.\n */\ngoog.vec.mat4d.invert = function(mat, resultMat) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];\n  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];\n  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];\n  var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15];\n\n  var a0 = m00 * m11 - m10 * m01;\n  var a1 = m00 * m21 - m20 * m01;\n  var a2 = m00 * m31 - m30 * m01;\n  var a3 = m10 * m21 - m20 * m11;\n  var a4 = m10 * m31 - m30 * m11;\n  var a5 = m20 * m31 - m30 * m21;\n  var b0 = m02 * m13 - m12 * m03;\n  var b1 = m02 * m23 - m22 * m03;\n  var b2 = m02 * m33 - m32 * m03;\n  var b3 = m12 * m23 - m22 * m13;\n  var b4 = m12 * m33 - m32 * m13;\n  var b5 = m22 * m33 - m32 * m23;\n\n  var det = a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0;\n  if (det == 0) {\n    return false;\n  }\n\n  var idet = 1.0 / det;\n  resultMat[0] = (m11 * b5 - m21 * b4 + m31 * b3) * idet;\n  resultMat[1] = (-m10 * b5 + m20 * b4 - m30 * b3) * idet;\n  resultMat[2] = (m13 * a5 - m23 * a4 + m33 * a3) * idet;\n  resultMat[3] = (-m12 * a5 + m22 * a4 - m32 * a3) * idet;\n  resultMat[4] = (-m01 * b5 + m21 * b2 - m31 * b1) * idet;\n  resultMat[5] = (m00 * b5 - m20 * b2 + m30 * b1) * idet;\n  resultMat[6] = (-m03 * a5 + m23 * a2 - m33 * a1) * idet;\n  resultMat[7] = (m02 * a5 - m22 * a2 + m32 * a1) * idet;\n  resultMat[8] = (m01 * b4 - m11 * b2 + m31 * b0) * idet;\n  resultMat[9] = (-m00 * b4 + m10 * b2 - m30 * b0) * idet;\n  resultMat[10] = (m03 * a4 - m13 * a2 + m33 * a0) * idet;\n  resultMat[11] = (-m02 * a4 + m12 * a2 - m32 * a0) * idet;\n  resultMat[12] = (-m01 * b3 + m11 * b1 - m21 * b0) * idet;\n  resultMat[13] = (m00 * b3 - m10 * b1 + m20 * b0) * idet;\n  resultMat[14] = (-m03 * a3 + m13 * a1 - m23 * a0) * idet;\n  resultMat[15] = (m02 * a3 - m12 * a1 + m22 * a0) * idet;\n  return true;\n};\n\n\n/**\n * Returns true if the components of mat0 are equal to the components of mat1.\n *\n * @param {!goog.vec.mat4d.Type} mat0 The first matrix.\n * @param {!goog.vec.mat4d.Type} mat1 The second matrix.\n * @return {boolean} True if the the two matrices are equivalent.\n */\ngoog.vec.mat4d.equals = function(mat0, mat1) {\n  return mat0.length == mat1.length && mat0[0] == mat1[0] &&\n      mat0[1] == mat1[1] && mat0[2] == mat1[2] && mat0[3] == mat1[3] &&\n      mat0[4] == mat1[4] && mat0[5] == mat1[5] && mat0[6] == mat1[6] &&\n      mat0[7] == mat1[7] && mat0[8] == mat1[8] && mat0[9] == mat1[9] &&\n      mat0[10] == mat1[10] && mat0[11] == mat1[11] && mat0[12] == mat1[12] &&\n      mat0[13] == mat1[13] && mat0[14] == mat1[14] && mat0[15] == mat1[15];\n};\n\n\n/**\n * Transforms the given vector with the given matrix storing the resulting,\n * transformed vector into resultVec. The input vector is multiplied against the\n * upper 3x4 matrix omitting the projective component.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix supplying the transformation.\n * @param {!goog.vec.vec3d.Type} vec The 3 element vector to transform.\n * @param {!goog.vec.vec3d.Type} resultVec The 3 element vector to\n *     receive the results (may be vec).\n * @return {!goog.vec.vec3d.Type} return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.multVec3 = function(mat, vec, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2];\n  resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8] + mat[12];\n  resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9] + mat[13];\n  resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10] + mat[14];\n  return resultVec;\n};\n\n\n/**\n * Transforms the given vector with the given matrix storing the resulting,\n * transformed vector into resultVec. The input vector is multiplied against the\n * upper 3x3 matrix omitting the projective component and translation\n * components.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix supplying the transformation.\n * @param {!goog.vec.vec3d.Type} vec The 3 element vector to transform.\n * @param {!goog.vec.vec3d.Type} resultVec The 3 element vector to\n *     receive the results (may be vec).\n * @return {!goog.vec.vec3d.Type} return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.multVec3NoTranslate = function(mat, vec, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2];\n  resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8];\n  resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9];\n  resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10];\n  return resultVec;\n};\n\n\n/**\n * Transforms the given vector with the given matrix storing the resulting,\n * transformed vector into resultVec. The input vector is multiplied against the\n * full 4x4 matrix with the homogeneous divide applied to reduce the 4 element\n * vector to a 3 element vector.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix supplying the transformation.\n * @param {!goog.vec.vec3d.Type} vec The 3 element vector to transform.\n * @param {!goog.vec.vec3d.Type} resultVec The 3 element vector\n *     to receive the results (may be vec).\n * @return {!goog.vec.vec3d.Type} return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.multVec3Projective = function(mat, vec, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2];\n  var invw = 1 / (x * mat[3] + y * mat[7] + z * mat[11] + mat[15]);\n  resultVec[0] = (x * mat[0] + y * mat[4] + z * mat[8] + mat[12]) * invw;\n  resultVec[1] = (x * mat[1] + y * mat[5] + z * mat[9] + mat[13]) * invw;\n  resultVec[2] = (x * mat[2] + y * mat[6] + z * mat[10] + mat[14]) * invw;\n  return resultVec;\n};\n\n\n/**\n * Transforms the given vector with the given matrix storing the resulting,\n * transformed vector into resultVec.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix supplying the transformation.\n * @param {!goog.vec.vec4d.Type} vec The vector to transform.\n * @param {!goog.vec.vec4d.Type} resultVec The vector to\n *     receive the results (may be vec).\n * @return {!goog.vec.vec4d.Type} return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.multVec4 = function(mat, vec, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2], w = vec[3];\n  resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8] + w * mat[12];\n  resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9] + w * mat[13];\n  resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10] + w * mat[14];\n  resultVec[3] = x * mat[3] + y * mat[7] + z * mat[11] + w * mat[15];\n  return resultVec;\n};\n\n\n/**\n * Makes the given 4x4 matrix a translation matrix with x, y and z\n * translation factors.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} x The translation along the x axis.\n * @param {number} y The translation along the y axis.\n * @param {number} z The translation along the z axis.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.makeTranslate = function(mat, x, y, z) {\n  mat[0] = 1;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = 1;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = 1;\n  mat[11] = 0;\n  mat[12] = x;\n  mat[13] = y;\n  mat[14] = z;\n  mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix as a scale matrix with x, y and z scale factors.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} x The scale along the x axis.\n * @param {number} y The scale along the y axis.\n * @param {number} z The scale along the z axis.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.makeScale = function(mat, x, y, z) {\n  mat[0] = x;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = y;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = z;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix a rotation matrix with the given rotation\n * angle about the axis defined by the vector (ax, ay, az).\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @param {number} ax The x component of the rotation axis.\n * @param {number} ay The y component of the rotation axis.\n * @param {number} az The z component of the rotation axis.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.makeRotate = function(mat, angle, ax, ay, az) {\n  var c = Math.cos(angle);\n  var d = 1 - c;\n  var s = Math.sin(angle);\n\n  mat[0] = ax * ax * d + c;\n  mat[1] = ax * ay * d + az * s;\n  mat[2] = ax * az * d - ay * s;\n  mat[3] = 0;\n  mat[4] = ax * ay * d - az * s;\n  mat[5] = ay * ay * d + c;\n  mat[6] = ay * az * d + ax * s;\n  mat[7] = 0;\n  mat[8] = ax * az * d + ay * s;\n  mat[9] = ay * az * d - ax * s;\n  mat[10] = az * az * d + c;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix a rotation matrix with the given rotation\n * angle about the X axis.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.makeRotateX = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = 1;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = c;\n  mat[6] = s;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = -s;\n  mat[10] = c;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix a rotation matrix with the given rotation\n * angle about the Y axis.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.makeRotateY = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = c;\n  mat[1] = 0;\n  mat[2] = -s;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = 1;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = s;\n  mat[9] = 0;\n  mat[10] = c;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix a rotation matrix with the given rotation\n * angle about the Z axis.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.makeRotateZ = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = c;\n  mat[1] = s;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = -s;\n  mat[5] = c;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = 1;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n\n  return mat;\n};\n\n\n/**\n * Creates a matrix from a quaternion rotation and vector translation.\n *\n * This is a specialization of makeRotationTranslationScaleOrigin.\n *\n * This is equivalent to, but faster than:\n *     goog.vec.mat4d.makeIdentity(m);\n *     goog.vec.mat4d.translate(m, tx, ty, tz);\n *     goog.vec.mat4d.rotate(m, theta, rx, ry, rz);\n * and:\n *     goog.vec.Quaternion.toRotationMatrix4(rotation, mat);\n *     mat[12] = translation[0];\n *     mat[13] = translation[1];\n *     mat[14] = translation[2];\n * See http://jsperf.com/goog-vec-makerotationtranslation2 .\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {!goog.vec.Quaternion.AnyType} rotation The quaternion rotation.\n *     Note: this quaternion is assumed to already be normalized.\n * @param {!goog.vec.vec3d.Type} translation The vector translation.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.makeRotationTranslation = function(mat, rotation, translation) {\n  // Quaternion math\n  var x = rotation[0], y = rotation[1], z = rotation[2], w = rotation[3];\n  var x2 = 2 * x, y2 = 2 * y, z2 = 2 * z;\n  var xx = x * x2;\n  var xy = x * y2;\n  var xz = x * z2;\n  var yy = y * y2;\n  var yz = y * z2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n\n  mat[0] = 1 - (yy + zz);\n  mat[1] = xy + wz;\n  mat[2] = xz - wy;\n  mat[3] = 0;\n  mat[4] = xy - wz;\n  mat[5] = 1 - (xx + zz);\n  mat[6] = yz + wx;\n  mat[7] = 0;\n  mat[8] = xz + wy;\n  mat[9] = yz - wx;\n  mat[10] = 1 - (xx + yy);\n  mat[11] = 0;\n  mat[12] = translation[0];\n  mat[13] = translation[1];\n  mat[14] = translation[2];\n  mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation, and\n * vector scale.\n *\n * This is a specialization of makeRotationTranslationScaleOrigin.\n *\n * This is equivalent to, but faster than:\n *     goog.vec.mat4d.makeIdentity(m);\n *     goog.vec.mat4d.translate(m, tx, ty, tz);\n *     goog.vec.mat4d.rotate(m, theta, rx, ry, rz);\n *     goog.vec.mat4d.scale(m, sx, sy, sz);\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {!goog.vec.Quaternion.AnyType} rotation The quaternion rotation.\n *     Note: this quaternion is assumed to already be normalized.\n * @param {!goog.vec.vec3d.Type} translation The vector translation.\n * @param {!goog.vec.vec3d.Type} scale The vector scale.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.makeRotationTranslationScale = function(\n    mat, rotation, translation, scale) {\n  // Quaternion math\n  var x = rotation[0], y = rotation[1], z = rotation[2], w = rotation[3];\n  var x2 = 2 * x, y2 = 2 * y, z2 = 2 * z;\n  var xx = x * x2;\n  var xy = x * y2;\n  var xz = x * z2;\n  var yy = y * y2;\n  var yz = y * z2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n  var sx = scale[0];\n  var sy = scale[1];\n  var sz = scale[2];\n\n  mat[0] = (1 - (yy + zz)) * sx;\n  mat[1] = (xy + wz) * sx;\n  mat[2] = (xz - wy) * sx;\n  mat[3] = 0;\n  mat[4] = (xy - wz) * sy;\n  mat[5] = (1 - (xx + zz)) * sy;\n  mat[6] = (yz + wx) * sy;\n  mat[7] = 0;\n  mat[8] = (xz + wy) * sz;\n  mat[9] = (yz - wx) * sz;\n  mat[10] = (1 - (xx + yy)) * sz;\n  mat[11] = 0;\n  mat[12] = translation[0];\n  mat[13] = translation[1];\n  mat[14] = translation[2];\n  mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation, and\n * vector scale, rotating and scaling about the given origin.\n *\n * This is equivalent to, but faster than:\n *     goog.vec.mat4d.makeIdentity(m);\n *     goog.vec.mat4d.translate(m, tx, ty, tz);\n *     goog.vec.mat4d.translate(m, ox, oy, oz);\n *     goog.vec.mat4d.rotate(m, theta, rx, ry, rz);\n *     goog.vec.mat4d.scale(m, sx, sy, sz);\n *     goog.vec.mat4d.translate(m, -ox, -oy, -oz);\n * See http://jsperf.com/glmatrix-matrix-variant-test/3 for performance\n * results of a similar function in the glmatrix library.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {!goog.vec.Quaternion.AnyType} rotation The quaternion rotation.\n *     Note: this quaternion is assumed to already be normalized.\n * @param {!goog.vec.vec3d.Type} translation The vector translation.\n * @param {!goog.vec.vec3d.Type} scale The vector scale.\n * @param {!goog.vec.vec3d.Type} origin The origin about which to scale and\n *     rotate.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.makeRotationTranslationScaleOrigin = function(\n    mat, rotation, translation, scale, origin) {\n  // Quaternion math\n  var x = rotation[0], y = rotation[1], z = rotation[2], w = rotation[3];\n  var x2 = 2 * x, y2 = 2 * y, z2 = 2 * z;\n  var xx = x * x2;\n  var xy = x * y2;\n  var xz = x * z2;\n  var yy = y * y2;\n  var yz = y * z2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n  var sx = scale[0];\n  var sy = scale[1];\n  var sz = scale[2];\n  var ox = origin[0];\n  var oy = origin[1];\n  var oz = origin[2];\n\n  mat[0] = (1 - (yy + zz)) * sx;\n  mat[1] = (xy + wz) * sx;\n  mat[2] = (xz - wy) * sx;\n  mat[3] = 0;\n  mat[4] = (xy - wz) * sy;\n  mat[5] = (1 - (xx + zz)) * sy;\n  mat[6] = (yz + wx) * sy;\n  mat[7] = 0;\n  mat[8] = (xz + wy) * sz;\n  mat[9] = (yz - wx) * sz;\n  mat[10] = (1 - (xx + yy)) * sz;\n  mat[11] = 0;\n  mat[12] = translation[0] + ox - (mat[0] * ox + mat[4] * oy + mat[8] * oz);\n  mat[13] = translation[1] + oy - (mat[1] * ox + mat[5] * oy + mat[9] * oz);\n  mat[14] = translation[2] + oz - (mat[2] * ox + mat[6] * oy + mat[10] * oz);\n  mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix a perspective projection matrix.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} left The coordinate of the left clipping plane.\n * @param {number} right The coordinate of the right clipping plane.\n * @param {number} bottom The coordinate of the bottom clipping plane.\n * @param {number} top The coordinate of the top clipping plane.\n * @param {number} near The distance to the near clipping plane.\n * @param {number} far The distance to the far clipping plane.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.makeFrustum = function(\n    mat, left, right, bottom, top, near, far) {\n  var x = (2 * near) / (right - left);\n  var y = (2 * near) / (top - bottom);\n  var a = (right + left) / (right - left);\n  var b = (top + bottom) / (top - bottom);\n  var c = -(far + near) / (far - near);\n  var d = -(2 * far * near) / (far - near);\n\n  mat[0] = x;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = y;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = a;\n  mat[9] = b;\n  mat[10] = c;\n  mat[11] = -1;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = d;\n  mat[15] = 0;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix  perspective projection matrix given a\n * field of view and aspect ratio.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} fovy The field of view along the y (vertical) axis in\n *     radians.\n * @param {number} aspect The x (width) to y (height) aspect ratio.\n * @param {number} near The distance to the near clipping plane.\n * @param {number} far The distance to the far clipping plane.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.makePerspective = function(mat, fovy, aspect, near, far) {\n  var angle = fovy / 2;\n  var dz = far - near;\n  var sinAngle = Math.sin(angle);\n  if (dz == 0 || sinAngle == 0 || aspect == 0) {\n    return mat;\n  }\n\n  var cot = Math.cos(angle) / sinAngle;\n\n  mat[0] = cot / aspect;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = cot;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = -(far + near) / dz;\n  mat[11] = -1;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = -(2 * near * far) / dz;\n  mat[15] = 0;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix an orthographic projection matrix.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} left The coordinate of the left clipping plane.\n * @param {number} right The coordinate of the right clipping plane.\n * @param {number} bottom The coordinate of the bottom clipping plane.\n * @param {number} top The coordinate of the top clipping plane.\n * @param {number} near The distance to the near clipping plane.\n * @param {number} far The distance to the far clipping plane.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.makeOrtho = function(mat, left, right, bottom, top, near, far) {\n  var x = 2 / (right - left);\n  var y = 2 / (top - bottom);\n  var z = -2 / (far - near);\n  var a = -(right + left) / (right - left);\n  var b = -(top + bottom) / (top - bottom);\n  var c = -(far + near) / (far - near);\n\n  mat[0] = x;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = y;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = z;\n  mat[11] = 0;\n  mat[12] = a;\n  mat[13] = b;\n  mat[14] = c;\n  mat[15] = 1;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix a modelview matrix of a camera so that\n * the camera is 'looking at' the given center point.\n *\n * Note that unlike most other goog.vec functions where we inline\n * everything, this function does not inline various goog.vec\n * functions.  This makes the code more readable, but somewhat\n * less efficient.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {!goog.vec.vec3d.Type} eyePt The position of the eye point\n *     (camera origin).\n * @param {!goog.vec.vec3d.Type} centerPt The point to aim the camera at.\n * @param {!goog.vec.vec3d.Type} worldUpVec The vector that identifies\n *     the up direction for the camera.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.makeLookAt = function(mat, eyePt, centerPt, worldUpVec) {\n  // Compute the direction vector from the eye point to the center point and\n  // normalize.\n  var fwdVec = goog.vec.mat4d.tmpvec4d_[0];\n  goog.vec.vec3d.subtract(centerPt, eyePt, fwdVec);\n  goog.vec.vec3d.normalize(fwdVec, fwdVec);\n  fwdVec[3] = 0;\n\n  // Compute the side vector from the forward vector and the input up vector.\n  var sideVec = goog.vec.mat4d.tmpvec4d_[1];\n  goog.vec.vec3d.cross(fwdVec, worldUpVec, sideVec);\n  goog.vec.vec3d.normalize(sideVec, sideVec);\n  sideVec[3] = 0;\n\n  // Now the up vector to form the orthonormal basis.\n  var upVec = goog.vec.mat4d.tmpvec4d_[2];\n  goog.vec.vec3d.cross(sideVec, fwdVec, upVec);\n  goog.vec.vec3d.normalize(upVec, upVec);\n  upVec[3] = 0;\n\n  // Update the view matrix with the new orthonormal basis and position the\n  // camera at the given eye point.\n  goog.vec.vec3d.negate(fwdVec, fwdVec);\n  goog.vec.mat4d.setRow(mat, 0, sideVec);\n  goog.vec.mat4d.setRow(mat, 1, upVec);\n  goog.vec.mat4d.setRow(mat, 2, fwdVec);\n  goog.vec.mat4d.setRowValues(mat, 3, 0, 0, 0, 1);\n  goog.vec.mat4d.translate(mat, -eyePt[0], -eyePt[1], -eyePt[2]);\n\n  return mat;\n};\n\n\n/**\n * Decomposes a matrix into the lookAt vectors eyePt, fwdVec and worldUpVec.\n * The matrix represents the modelview matrix of a camera. It is the inverse\n * of lookAt except for the output of the fwdVec instead of centerPt.\n * The centerPt itself cannot be recovered from a modelview matrix.\n *\n * Note that unlike most other goog.vec functions where we inline\n * everything, this function does not inline various goog.vec\n * functions.  This makes the code more readable, but somewhat\n * less efficient.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {!goog.vec.vec3d.Type} eyePt The position of the eye point\n *     (camera origin).\n * @param {!goog.vec.vec3d.Type} fwdVec The vector describing where\n *     the camera points to.\n * @param {!goog.vec.vec3d.Type} worldUpVec The vector that\n *     identifies the up direction for the camera.\n * @return {boolean} True if the method succeeds, false otherwise.\n *     The method can only fail if the inverse of viewMatrix is not defined.\n */\ngoog.vec.mat4d.toLookAt = function(mat, eyePt, fwdVec, worldUpVec) {\n  // Get eye of the camera.\n  var matInverse = goog.vec.mat4d.tmpmat4d_[0];\n  if (!goog.vec.mat4d.invert(mat, matInverse)) {\n    // The input matrix does not have a valid inverse.\n    return false;\n  }\n\n  if (eyePt) {\n    eyePt[0] = matInverse[12];\n    eyePt[1] = matInverse[13];\n    eyePt[2] = matInverse[14];\n  }\n\n  // Get forward vector from the definition of lookAt.\n  if (fwdVec || worldUpVec) {\n    if (!fwdVec) {\n      fwdVec = goog.vec.mat4d.tmpvec3d_[0];\n    }\n    fwdVec[0] = -mat[2];\n    fwdVec[1] = -mat[6];\n    fwdVec[2] = -mat[10];\n    // Normalize forward vector.\n    goog.vec.vec3d.normalize(fwdVec, fwdVec);\n  }\n\n  if (worldUpVec) {\n    // Get side vector from the definition of gluLookAt.\n    var side = goog.vec.mat4d.tmpvec3d_[1];\n    side[0] = mat[0];\n    side[1] = mat[4];\n    side[2] = mat[8];\n    // Compute up vector as a up = side x forward.\n    goog.vec.vec3d.cross(side, fwdVec, worldUpVec);\n    // Normalize up vector.\n    goog.vec.vec3d.normalize(worldUpVec, worldUpVec);\n  }\n  return true;\n};\n\n\n/**\n * Makes the given 4x4 matrix a rotation matrix given Euler angles using\n * the ZXZ convention.\n * Given the euler angles [theta1, theta2, theta3], the rotation is defined as\n * rotation = rotation_z(theta1) * rotation_x(theta2) * rotation_z(theta3),\n * with theta1 in [0, 2 * pi], theta2 in [0, pi] and theta3 in [0, 2 * pi].\n * rotation_x(theta) means rotation around the X axis of theta radians,\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} theta1 The angle of rotation around the Z axis in radians.\n * @param {number} theta2 The angle of rotation around the X axis in radians.\n * @param {number} theta3 The angle of rotation around the Z axis in radians.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.makeEulerZXZ = function(mat, theta1, theta2, theta3) {\n  var c1 = Math.cos(theta1);\n  var s1 = Math.sin(theta1);\n\n  var c2 = Math.cos(theta2);\n  var s2 = Math.sin(theta2);\n\n  var c3 = Math.cos(theta3);\n  var s3 = Math.sin(theta3);\n\n  mat[0] = c1 * c3 - c2 * s1 * s3;\n  mat[1] = c2 * c1 * s3 + c3 * s1;\n  mat[2] = s3 * s2;\n  mat[3] = 0;\n\n  mat[4] = -c1 * s3 - c3 * c2 * s1;\n  mat[5] = c1 * c2 * c3 - s1 * s3;\n  mat[6] = c3 * s2;\n  mat[7] = 0;\n\n  mat[8] = s2 * s1;\n  mat[9] = -c1 * s2;\n  mat[10] = c2;\n  mat[11] = 0;\n\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n\n  return mat;\n};\n\n\n/**\n * Decomposes a rotation matrix into Euler angles using the ZXZ convention so\n * that rotation = rotation_z(theta1) * rotation_x(theta2) * rotation_z(theta3),\n * with theta1 in [0, 2 * pi], theta2 in [0, pi] and theta3 in [0, 2 * pi].\n * rotation_x(theta) means rotation around the X axis of theta radians.\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {!goog.vec.vec3d.Type} euler The ZXZ Euler angles in\n *     radians as [theta1, theta2, theta3].\n * @param {boolean=} opt_theta2IsNegative Whether theta2 is in [-pi, 0] instead\n *     of the default [0, pi].\n * @return {!goog.vec.vec4d.Type} return euler so that operations can be\n *     chained together.\n */\ngoog.vec.mat4d.toEulerZXZ = function(mat, euler, opt_theta2IsNegative) {\n  // There is an ambiguity in the sign of sinTheta2 because of the sqrt.\n  var sinTheta2 = Math.sqrt(mat[2] * mat[2] + mat[6] * mat[6]);\n\n  // By default we explicitely constrain theta2 to be in [0, pi],\n  // so sinTheta2 is always positive. We can change the behavior and specify\n  // theta2 to be negative in [-pi, 0] with opt_Theta2IsNegative.\n  var signTheta2 = opt_theta2IsNegative ? -1 : 1;\n\n  if (sinTheta2 > goog.vec.EPSILON) {\n    euler[2] = Math.atan2(mat[2] * signTheta2, mat[6] * signTheta2);\n    euler[1] = Math.atan2(sinTheta2 * signTheta2, mat[10]);\n    euler[0] = Math.atan2(mat[8] * signTheta2, -mat[9] * signTheta2);\n  } else {\n    // There is also an arbitrary choice for theta1 = 0 or theta2 = 0 here.\n    // We assume theta1 = 0 as some applications do not allow the camera to roll\n    // (i.e. have theta1 != 0).\n    euler[0] = 0;\n    euler[1] = Math.atan2(sinTheta2 * signTheta2, mat[10]);\n    euler[2] = Math.atan2(mat[1], mat[0]);\n  }\n\n  // Atan2 outputs angles in [-pi, pi] so we bring them back to [0, 2 * pi].\n  euler[0] = (euler[0] + Math.PI * 2) % (Math.PI * 2);\n  euler[2] = (euler[2] + Math.PI * 2) % (Math.PI * 2);\n  // For theta2 we want the angle to be in [0, pi] or [-pi, 0] depending on\n  // signTheta2.\n  euler[1] =\n      ((euler[1] * signTheta2 + Math.PI * 2) % (Math.PI * 2)) * signTheta2;\n\n  return euler;\n};\n\n\n/**\n * Translates the given matrix by x,y,z.  Equvialent to:\n * goog.vec.mat4d.multMat(\n *     mat,\n *     goog.vec.mat4d.makeTranslate(goog.vec.mat4d.create(), x, y, z),\n *     mat);\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} x The translation along the x axis.\n * @param {number} y The translation along the y axis.\n * @param {number} z The translation along the z axis.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.translate = function(mat, x, y, z) {\n  mat[12] += mat[0] * x + mat[4] * y + mat[8] * z;\n  mat[13] += mat[1] * x + mat[5] * y + mat[9] * z;\n  mat[14] += mat[2] * x + mat[6] * y + mat[10] * z;\n  mat[15] += mat[3] * x + mat[7] * y + mat[11] * z;\n\n  return mat;\n};\n\n\n/**\n * Scales the given matrix by x,y,z.  Equivalent to:\n * goog.vec.mat4d.multMat(\n *     mat,\n *     goog.vec.mat4d.makeScale(goog.vec.mat4d.create(), x, y, z),\n *     mat);\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} x The x scale factor.\n * @param {number} y The y scale factor.\n * @param {number} z The z scale factor.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.scale = function(mat, x, y, z) {\n  mat[0] = mat[0] * x;\n  mat[1] = mat[1] * x;\n  mat[2] = mat[2] * x;\n  mat[3] = mat[3] * x;\n  mat[4] = mat[4] * y;\n  mat[5] = mat[5] * y;\n  mat[6] = mat[6] * y;\n  mat[7] = mat[7] * y;\n  mat[8] = mat[8] * z;\n  mat[9] = mat[9] * z;\n  mat[10] = mat[10] * z;\n  mat[11] = mat[11] * z;\n  mat[12] = mat[12];\n  mat[13] = mat[13];\n  mat[14] = mat[14];\n  mat[15] = mat[15];\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the x,y,z axis.  Equivalent to:\n * goog.vec.mat4d.multMat(\n *     mat,\n *     goog.vec.mat4d.makeRotate(goog.vec.mat4d.create(), angle, x, y, z),\n *     mat);\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @param {number} x The x component of the rotation axis.\n * @param {number} y The y component of the rotation axis.\n * @param {number} z The z component of the rotation axis.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.rotate = function(mat, angle, x, y, z) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];\n  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];\n  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];\n\n  var cosAngle = Math.cos(angle);\n  var sinAngle = Math.sin(angle);\n  var diffCosAngle = 1 - cosAngle;\n  var r00 = x * x * diffCosAngle + cosAngle;\n  var r10 = x * y * diffCosAngle + z * sinAngle;\n  var r20 = x * z * diffCosAngle - y * sinAngle;\n\n  var r01 = x * y * diffCosAngle - z * sinAngle;\n  var r11 = y * y * diffCosAngle + cosAngle;\n  var r21 = y * z * diffCosAngle + x * sinAngle;\n\n  var r02 = x * z * diffCosAngle + y * sinAngle;\n  var r12 = y * z * diffCosAngle - x * sinAngle;\n  var r22 = z * z * diffCosAngle + cosAngle;\n\n  mat[0] = m00 * r00 + m01 * r10 + m02 * r20;\n  mat[1] = m10 * r00 + m11 * r10 + m12 * r20;\n  mat[2] = m20 * r00 + m21 * r10 + m22 * r20;\n  mat[3] = m30 * r00 + m31 * r10 + m32 * r20;\n  mat[4] = m00 * r01 + m01 * r11 + m02 * r21;\n  mat[5] = m10 * r01 + m11 * r11 + m12 * r21;\n  mat[6] = m20 * r01 + m21 * r11 + m22 * r21;\n  mat[7] = m30 * r01 + m31 * r11 + m32 * r21;\n  mat[8] = m00 * r02 + m01 * r12 + m02 * r22;\n  mat[9] = m10 * r02 + m11 * r12 + m12 * r22;\n  mat[10] = m20 * r02 + m21 * r12 + m22 * r22;\n  mat[11] = m30 * r02 + m31 * r12 + m32 * r22;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the x axis.  Equivalent to:\n * goog.vec.mat4d.multMat(\n *     mat,\n *     goog.vec.mat4d.makeRotateX(goog.vec.mat4d.create(), angle),\n *     mat);\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.rotateX = function(mat, angle) {\n  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];\n  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[4] = m01 * c + m02 * s;\n  mat[5] = m11 * c + m12 * s;\n  mat[6] = m21 * c + m22 * s;\n  mat[7] = m31 * c + m32 * s;\n  mat[8] = m01 * -s + m02 * c;\n  mat[9] = m11 * -s + m12 * c;\n  mat[10] = m21 * -s + m22 * c;\n  mat[11] = m31 * -s + m32 * c;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the y axis.  Equivalent to:\n * goog.vec.mat4d.multMat(\n *     mat,\n *     goog.vec.mat4d.makeRotateY(goog.vec.mat4d.create(), angle),\n *     mat);\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.rotateY = function(mat, angle) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];\n  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = m00 * c + m02 * -s;\n  mat[1] = m10 * c + m12 * -s;\n  mat[2] = m20 * c + m22 * -s;\n  mat[3] = m30 * c + m32 * -s;\n  mat[8] = m00 * s + m02 * c;\n  mat[9] = m10 * s + m12 * c;\n  mat[10] = m20 * s + m22 * c;\n  mat[11] = m30 * s + m32 * c;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the z axis.  Equivalent to:\n * goog.vec.mat4d.multMat(\n *     mat,\n *     goog.vec.mat4d.makeRotateZ(goog.vec.mat4d.create(), angle),\n *     mat);\n *\n * @param {!goog.vec.mat4d.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {!goog.vec.mat4d.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.rotateZ = function(mat, angle) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];\n  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = m00 * c + m01 * s;\n  mat[1] = m10 * c + m11 * s;\n  mat[2] = m20 * c + m21 * s;\n  mat[3] = m30 * c + m31 * s;\n  mat[4] = m00 * -s + m01 * c;\n  mat[5] = m10 * -s + m11 * c;\n  mat[6] = m20 * -s + m21 * c;\n  mat[7] = m30 * -s + m31 * c;\n\n  return mat;\n};\n\n\n/**\n * Retrieves the translation component of the transformation matrix.\n *\n * @param {!goog.vec.mat4d.Type} mat The transformation matrix.\n * @param {!goog.vec.vec3d.Type} translation The vector for storing the\n *     result.\n * @return {!goog.vec.vec3d.Type} return translation so that operations can be\n *     chained.\n */\ngoog.vec.mat4d.getTranslation = function(mat, translation) {\n  translation[0] = mat[12];\n  translation[1] = mat[13];\n  translation[2] = mat[14];\n  return translation;\n};\n\n\n/**\n * @type {Array<goog.vec.vec3d.Type>}\n * @private\n */\ngoog.vec.mat4d.tmpvec3d_ = [goog.vec.vec3d.create(), goog.vec.vec3d.create()];\n\n\n/**\n * @type {Array<goog.vec.vec4d.Type>}\n * @private\n */\ngoog.vec.mat4d.tmpvec4d_ =\n    [goog.vec.vec4d.create(), goog.vec.vec4d.create(), goog.vec.vec4d.create()];\n\n\n/**\n * @type {Array<goog.vec.mat4d.Type>}\n * @private\n */\ngoog.vec.mat4d.tmpmat4d_ = [goog.vec.mat4d.create()];\n","^9I",1579837703000,"^9J",["^9K",["^;2","^9>","~$goog.vec.Quaternion","~$goog.vec.vec4d","~$goog.vec.vec3d"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/mat4d.js"],"^:1",["^9K",["~$goog.vec.mat4d.Type","~$goog.vec.mat4d"]],"^9<",true,"^9=",["^9>","^;2","^=8","^=:","^=9"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.pattern.tag.js","^9C",["^9D","goog/dom/pattern/tag.js"],"^9E","goog/dom/pattern/tag.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview DOM pattern to match a tag.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.pattern.Tag');\n\ngoog.require('goog.dom.pattern');\ngoog.require('goog.dom.pattern.AbstractPattern');\ngoog.require('goog.dom.pattern.MatchType');\ngoog.require('goog.object');\n\n\n\n/**\n * Pattern object that matches an tag.\n *\n * @param {string|RegExp} tag Name of the tag.  Also will accept a regular\n *     expression to match against the tag name.\n * @param {goog.dom.TagWalkType} type Type of token to match.\n * @param {Object=} opt_attrs Optional map of attribute names to desired values.\n *     This pattern will only match when all attributes are present and match\n *     the string or regular expression value provided here.\n * @param {Object=} opt_styles Optional map of CSS style names to desired\n *     values. This pattern will only match when all styles are present and\n *     match the string or regular expression value provided here.\n * @param {Function=} opt_test Optional function that takes the element as a\n *     parameter and returns true if this pattern should match it.\n * @constructor\n * @extends {goog.dom.pattern.AbstractPattern}\n */\ngoog.dom.pattern.Tag = function(tag, type, opt_attrs, opt_styles, opt_test) {\n  /**\n   * The tag to match.\n   *\n   * @private {string|RegExp}\n   */\n  this.tag_ = (typeof tag === 'string') ? tag.toUpperCase() : tag;\n\n  /**\n   * The type of token to match.\n   *\n   * @private {goog.dom.TagWalkType}\n   */\n  this.type_ = type;\n\n  /**\n   * The attributes to test for.\n   *\n   * @private {Object}\n   */\n  this.attrs_ = opt_attrs || null;\n\n  /**\n   * The styles to test for.\n   *\n   * @private {Object}\n   */\n  this.styles_ = opt_styles || null;\n\n  /**\n   * Function that takes the element as a parameter and returns true if this\n   * pattern should match it.\n   *\n   * @private {Function}\n   */\n  this.test_ = opt_test || null;\n};\ngoog.inherits(goog.dom.pattern.Tag, goog.dom.pattern.AbstractPattern);\n\n\n/**\n * Test whether the given token is a tag token which matches the tag name,\n * style, and attributes provided in the constructor.\n * @param {Node} token Token to match against.\n * @param {goog.dom.TagWalkType} type The type of token.\n * @return {goog.dom.pattern.MatchType} <code>MATCH</code> if the pattern\n *     matches, <code>NO_MATCH</code> otherwise.\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.dom.pattern.Tag.prototype.matchToken = function(token, type) {\n  // Check the direction and tag name.\n  if (type == this.type_ &&\n      goog.dom.pattern.matchStringOrRegex(this.tag_, token.nodeName)) {\n    // Check the attributes.\n    if (this.attrs_ &&\n        !goog.object.every(\n            this.attrs_, goog.dom.pattern.matchStringOrRegexMap, token)) {\n      return goog.dom.pattern.MatchType.NO_MATCH;\n    }\n    // Check the styles.\n    if (this.styles_ &&\n        !goog.object.every(\n            this.styles_, goog.dom.pattern.matchStringOrRegexMap,\n            token.style)) {\n      return goog.dom.pattern.MatchType.NO_MATCH;\n    }\n\n    if (this.test_ && !this.test_(token)) {\n      return goog.dom.pattern.MatchType.NO_MATCH;\n    }\n\n    // If we reach this point, we have a match and should save it.\n    this.matchedNode = token;\n    return goog.dom.pattern.MatchType.MATCH;\n  }\n\n  return goog.dom.pattern.MatchType.NO_MATCH;\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.dom.pattern.AbstractPattern","^9>","^;P","~$goog.dom.pattern","~$goog.dom.pattern.MatchType"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/tag.js"],"^:1",["^9K",["~$goog.dom.pattern.Tag"]],"^9<",true,"^9=",["^9>","^=>","^==","^=?","^;P"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.range.js","^9C",["^9D","goog/dom/range.js"],"^9E","goog/dom/range.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for working with ranges in HTML documents.\n *\n * @author robbyw@google.com (Robby Walker)\n * @suppress {strictMissingProperties}\n */\n\ngoog.provide('goog.dom.Range');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.AbstractRange');\ngoog.require('goog.dom.BrowserFeature');\ngoog.require('goog.dom.ControlRange');\ngoog.require('goog.dom.MultiRange');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TextRange');\n\n\n/**\n * Create a new selection from the given browser window's current selection.\n * Note that this object does not auto-update if the user changes their\n * selection and should be used as a snapshot.\n * @param {Window=} opt_win The window to get the selection of.  Defaults to the\n *     window this class was defined in.\n * @return {goog.dom.AbstractRange?} A range wrapper object, or null if there\n *     was an error.\n */\ngoog.dom.Range.createFromWindow = function(opt_win) {\n  var sel =\n      goog.dom.AbstractRange.getBrowserSelectionForWindow(opt_win || window);\n  return sel && goog.dom.Range.createFromBrowserSelection(sel);\n};\n\n\n/**\n * Create a new range wrapper from the given browser selection object.  Note\n * that this object does not auto-update if the user changes their selection and\n * should be used as a snapshot.\n * @param {!Object} selection The browser selection object.\n * @return {goog.dom.AbstractRange?} A range wrapper object or null if there\n *    was an error.\n */\ngoog.dom.Range.createFromBrowserSelection = function(selection) {\n  var range;\n  var isReversed = false;\n  if (selection.createRange) {\n\n    try {\n      range = selection.createRange();\n    } catch (e) {\n      // Access denied errors can be thrown here in IE if the selection was\n      // a flash obj or if there are cross domain issues\n      return null;\n    }\n  } else if (selection.rangeCount) {\n    if (selection.rangeCount > 1) {\n      return goog.dom.MultiRange.createFromBrowserSelection(\n          /** @type {!Selection} */ (selection));\n    } else {\n      range = selection.getRangeAt(0);\n      isReversed = goog.dom.Range.isReversed(\n          selection.anchorNode, selection.anchorOffset, selection.focusNode,\n          selection.focusOffset);\n    }\n  } else {\n    return null;\n  }\n\n  return goog.dom.Range.createFromBrowserRange(range, isReversed);\n};\n\n\n/**\n * Create a new range wrapper from the given browser range object.\n * @param {Range|TextRange} range The browser range object.\n * @param {boolean=} opt_isReversed Whether the focus node is before the anchor\n *     node.\n * @return {!goog.dom.AbstractRange} A range wrapper object.\n */\ngoog.dom.Range.createFromBrowserRange = function(range, opt_isReversed) {\n  // Create an IE control range when appropriate.\n  return goog.dom.AbstractRange.isNativeControlRange(range) ?\n      goog.dom.ControlRange.createFromBrowserRange(range) :\n      goog.dom.TextRange.createFromBrowserRange(range, opt_isReversed);\n};\n\n\n/**\n * Create a new range wrapper that selects the given node's text.\n * @param {Node} node The node to select.\n * @param {boolean=} opt_isReversed Whether the focus node is before the anchor\n *     node.\n * @return {!goog.dom.AbstractRange} A range wrapper object.\n */\ngoog.dom.Range.createFromNodeContents = function(node, opt_isReversed) {\n  return goog.dom.TextRange.createFromNodeContents(node, opt_isReversed);\n};\n\n\n/**\n * Create a new range wrapper that represents a caret at the given node,\n * accounting for the given offset.  This always creates a TextRange, regardless\n * of whether node is an image node or other control range type node.\n * @param {Node} node The node to place a caret at.\n * @param {number} offset The offset within the node to place the caret at.\n * @return {!goog.dom.AbstractRange} A range wrapper object.\n */\ngoog.dom.Range.createCaret = function(node, offset) {\n  return goog.dom.TextRange.createFromNodes(node, offset, node, offset);\n};\n\n\n/**\n * Create a new range wrapper that selects the area between the given nodes,\n * accounting for the given offsets.\n * @param {Node} anchorNode The node to anchor on.\n * @param {number} anchorOffset The offset within the node to anchor on.\n * @param {Node} focusNode The node to focus on.\n * @param {number} focusOffset The offset within the node to focus on.\n * @return {!goog.dom.AbstractRange} A range wrapper object.\n */\ngoog.dom.Range.createFromNodes = function(\n    anchorNode, anchorOffset, focusNode, focusOffset) {\n  return goog.dom.TextRange.createFromNodes(\n      anchorNode, anchorOffset, focusNode, focusOffset);\n};\n\n\n/**\n * Clears the window's selection.\n * @param {Window=} opt_win The window to get the selection of.  Defaults to the\n *     window this class was defined in.\n */\ngoog.dom.Range.clearSelection = function(opt_win) {\n  var sel =\n      goog.dom.AbstractRange.getBrowserSelectionForWindow(opt_win || window);\n  if (!sel) {\n    return;\n  }\n  if (sel.empty) {\n    // We can't just check that the selection is empty, because IE\n    // sometimes gets confused.\n    try {\n      sel.empty();\n    } catch (e) {\n      // Emptying an already empty selection throws an exception in IE\n    }\n  } else {\n    try {\n      sel.removeAllRanges();\n    } catch (e) {\n      // This throws in IE9 if the range has been invalidated; for example, if\n      // the user clicked on an element which disappeared during the event\n      // handler.\n    }\n  }\n};\n\n\n/**\n * Tests if the window has a selection.\n * @param {Window=} opt_win The window to check the selection of.  Defaults to\n *     the window this class was defined in.\n * @return {boolean} Whether the window has a selection.\n */\ngoog.dom.Range.hasSelection = function(opt_win) {\n  var sel =\n      goog.dom.AbstractRange.getBrowserSelectionForWindow(opt_win || window);\n  return !!sel &&\n      (goog.dom.BrowserFeature.LEGACY_IE_RANGES ? sel.type != 'None' :\n                                                  !!sel.rangeCount);\n};\n\n\n/**\n * Returns whether the focus position occurs before the anchor position.\n * @param {Node} anchorNode The node to anchor on.\n * @param {number} anchorOffset The offset within the node to anchor on.\n * @param {Node} focusNode The node to focus on.\n * @param {number} focusOffset The offset within the node to focus on.\n * @return {boolean} Whether the focus position occurs before the anchor\n *     position.\n */\ngoog.dom.Range.isReversed = function(\n    anchorNode, anchorOffset, focusNode, focusOffset) {\n  if (anchorNode == focusNode) {\n    return focusOffset < anchorOffset;\n  }\n  var child;\n  if (anchorNode.nodeType == goog.dom.NodeType.ELEMENT && anchorOffset) {\n    child = anchorNode.childNodes[anchorOffset];\n    if (child) {\n      anchorNode = child;\n      anchorOffset = 0;\n    } else if (goog.dom.contains(anchorNode, focusNode)) {\n      // If focus node is contained in anchorNode, it must be before the\n      // end of the node.  Hence we are reversed.\n      return true;\n    }\n  }\n  if (focusNode.nodeType == goog.dom.NodeType.ELEMENT && focusOffset) {\n    child = focusNode.childNodes[focusOffset];\n    if (child) {\n      focusNode = child;\n      focusOffset = 0;\n    } else if (goog.dom.contains(focusNode, anchorNode)) {\n      // If anchor node is contained in focusNode, it must be before the\n      // end of the node.  Hence we are not reversed.\n      return false;\n    }\n  }\n  return (goog.dom.compareNodeOrder(anchorNode, focusNode) ||\n          anchorOffset - focusOffset) > 0;\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.dom.BrowserFeature","^;;","^:B","~$goog.dom.NodeType","~$goog.dom.ControlRange","^9>","~$goog.dom.TextRange","~$goog.dom.MultiRange"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/range.js"],"^:1",["^9K",["~$goog.dom.Range"]],"^9<",true,"^9=",["^9>","^;;","^:B","^=A","^=C","^=E","^=B","^=D"]],["^ ","^9A",[1579837703000],"^9B","goog.net.testdata.jsloader_test1.js","^9C",["^9D","goog/net/testdata/jsloader_test1.js"],"^9E","goog/net/testdata/jsloader_test1.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved\n\n/**\n * @fileoverview Test #1 of jsloader.\n */\n\ngoog.provide('goog.net.testdata.jsloader_test1');\ngoog.setTestOnly('jsloader_test1');\n\nwindow['test1'] = 'Test #1 loaded';\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/testdata/jsloader_test1.js"],"^:1",["^9K",["~$goog.net.testdata.jsloader_test1","~$goog.net.testdata.jsloader-test1"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.media.picasa.js","^9C",["^9D","goog/ui/media/picasa.js"],"^9E","goog/ui/media/picasa.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview provides a reusable picasa album UI component given a public\n * picasa album URL.\n *\n * TODO(user): implement the javascript viewer, for users without flash. Get it\n * from the Gmail Picasa gadget.\n *\n * goog.ui.media.PicasaAlbum is actually a {@link goog.ui.ControlRenderer}, a\n * stateless class - that could/should be used as a Singleton with the static\n * method `goog.ui.media.PicasaAlbum.getInstance` -, that knows how to\n * render picasa albums. It is designed to be used with a\n * {@link goog.ui.Control}, which will actually control the media renderer and\n * provide the {@link goog.ui.Component} base. This design guarantees that all\n * different types of medias will behave alike but will look different.\n *\n * goog.ui.media.PicasaAlbum expects `goog.ui.media.PicasaAlbumModel`s on\n * `goog.ui.Control.getModel` as data models, and render a flash object\n * that will show a slideshow with the contents of that album URL.\n *\n * Example of usage:\n *\n * <pre>\n *   var album = goog.ui.media.PicasaAlbumModel.newInstance(\n *       'http://picasaweb.google.com/username/SanFranciscoCalifornia');\n *   goog.ui.media.PicasaAlbum.newControl(album).render();\n * </pre>\n *\n * picasa medias currently support the following states:\n *\n * <ul>\n *   <li> {@link goog.ui.Component.State.DISABLED}: shows 'flash not available'\n *   <li> {@link goog.ui.Component.State.HOVER}: mouse cursor is over the album\n *   <li> {@link goog.ui.Component.State.SELECTED}: flash album is shown\n * </ul>\n *\n * Which can be accessed by\n *\n * <pre>\n *   picasa.setEnabled(true);\n *   picasa.setHighlighted(true);\n *   picasa.setSelected(true);\n * </pre>\n *\n * Requires flash to actually work.\n */\n\ngoog.provide('goog.ui.media.PicasaAlbum');\ngoog.provide('goog.ui.media.PicasaAlbumModel');\n\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.string.Const');\ngoog.require('goog.ui.media.FlashObject');\ngoog.require('goog.ui.media.Media');\ngoog.require('goog.ui.media.MediaModel');\ngoog.require('goog.ui.media.MediaRenderer');\n\n\n\n/**\n * Subclasses a goog.ui.media.MediaRenderer to provide a Picasa specific media\n * renderer.\n *\n * This class knows how to parse picasa URLs, and render the DOM structure\n * of picasa album players and previews. This class is meant to be used as a\n * singleton static stateless class, that takes `goog.ui.media.Media`\n * instances and renders it. It expects `goog.ui.media.Media.getModel` to\n * return a well formed, previously constructed, object with a user and album\n * fields {@see goog.ui.media.PicasaAlbum.parseUrl}, which is the data model\n * this renderer will use to construct the DOM structure.\n * {@see goog.ui.media.PicasaAlbum.newControl} for a example of constructing a\n * control with this renderer.\n *\n * goog.ui.media.PicasaAlbum currently displays a picasa-made flash slideshow\n * with the photos, but could possibly display a handwritten js photo viewer,\n * in case flash is not available.\n *\n * This design is patterned after http://go/closure_control_subclassing\n *\n * It uses {@link goog.ui.media.FlashObject} to embed the flash object.\n *\n * @constructor\n * @extends {goog.ui.media.MediaRenderer}\n * @final\n */\ngoog.ui.media.PicasaAlbum = function() {\n  goog.ui.media.MediaRenderer.call(this);\n};\ngoog.inherits(goog.ui.media.PicasaAlbum, goog.ui.media.MediaRenderer);\ngoog.addSingletonGetter(goog.ui.media.PicasaAlbum);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n *\n * @type {string}\n */\ngoog.ui.media.PicasaAlbum.CSS_CLASS = goog.getCssName('goog-ui-media-picasa');\n\n\n/**\n * A static convenient method to construct a goog.ui.media.Media control out of\n * a picasa data model. It sets it as the data model goog.ui.media.PicasaAlbum\n * renderer uses, sets the states supported by the renderer, and returns a\n * Control that binds everything together. This is what you should be using for\n * constructing Picasa albums, except if you need finer control over the\n * configuration.\n *\n * @param {goog.ui.media.PicasaAlbumModel} dataModel A picasa album data model.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @return {!goog.ui.media.Media} A Control instance binded to the Picasa\n *     renderer.\n */\ngoog.ui.media.PicasaAlbum.newControl = function(dataModel, opt_domHelper) {\n  var control = new goog.ui.media.Media(\n      dataModel, goog.ui.media.PicasaAlbum.getInstance(), opt_domHelper);\n  control.setSelected(true);\n  return control;\n};\n\n\n/**\n * Creates the initial DOM structure of the picasa album, which is basically a\n * the flash object pointing to a flash picasa album player.\n *\n * @param {goog.ui.Control} c The media control.\n * @return {!Element} The DOM structure that represents the control.\n * @override\n */\ngoog.ui.media.PicasaAlbum.prototype.createDom = function(c) {\n  var control = /** @type {goog.ui.media.Media} */ (c);\n  var div = goog.ui.media.PicasaAlbum.superClass_.createDom.call(this, control);\n\n  var picasaAlbum =\n      /** @type {goog.ui.media.PicasaAlbumModel} */ (control.getDataModel());\n  var flash = new goog.ui.media.FlashObject(\n      picasaAlbum.getPlayer().getTrustedResourceUrl(), control.getDomHelper());\n  flash.addFlashVars(picasaAlbum.getPlayer().getVars());\n  flash.render(div);\n\n  return div;\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.media.PicasaAlbum.prototype.getCssClass = function() {\n  return goog.ui.media.PicasaAlbum.CSS_CLASS;\n};\n\n\n\n/**\n * The `goog.ui.media.PicasaAlbum` media data model. It stores a required\n * `userId` and `albumId` fields, sets the picasa album URL, and\n * allows a few optional parameters.\n *\n * @param {string} userId The picasa userId associated with this album.\n * @param {string} albumId The picasa albumId associated with this album.\n * @param {string=} opt_authKey An optional authentication key, used on private\n *     albums.\n * @param {string=} opt_caption An optional caption of the picasa album.\n * @param {string=} opt_description An optional description of the picasa album.\n * @param {boolean=} opt_autoplay Whether to autoplay the slideshow.\n * @constructor\n * @extends {goog.ui.media.MediaModel}\n * @final\n */\ngoog.ui.media.PicasaAlbumModel = function(\n    userId, albumId, opt_authKey, opt_caption, opt_description, opt_autoplay) {\n  goog.ui.media.MediaModel.call(\n      this, goog.ui.media.PicasaAlbumModel.buildUrl(userId, albumId),\n      opt_caption, opt_description, goog.ui.media.MediaModel.MimeType.FLASH);\n\n  /**\n   * The Picasa user id.\n   * @type {string}\n   * @private\n   */\n  this.userId_ = userId;\n\n  /**\n   * The Picasa album id.\n   * @type {string}\n   * @private\n   */\n  this.albumId_ = albumId;\n\n  /**\n   * The Picasa authentication key, used on private albums.\n   * @type {?string}\n   * @private\n   */\n  this.authKey_ = opt_authKey || null;\n\n  var authParam = opt_authKey ? ('&authkey=' + opt_authKey) : '';\n\n  var flashVars = {\n    'host': 'picasaweb.google.com',\n    'RGB': '0x000000',\n    'feed': 'http://picasaweb.google.com/data/feed/api/user/' + userId +\n        '/album/' + albumId + '?kind=photo&alt=rss' + authParam\n  };\n  flashVars[opt_autoplay ? 'autoplay' : 'noautoplay'] = '1';\n\n  var flashUrl = goog.html.TrustedResourceUrl.fromConstant(\n      goog.string.Const.from(\n          'http://picasaweb.google.com/s/c/bin/slideshow.swf'));\n  var player = new goog.ui.media.MediaModel.Player(flashUrl, flashVars);\n\n  this.setPlayer(player);\n};\ngoog.inherits(goog.ui.media.PicasaAlbumModel, goog.ui.media.MediaModel);\n\n\n/**\n * Regular expression used to extract the picasa username and albumid out of\n * picasa URLs.\n *\n * Copied from http://go/markdownlite.js,\n * and {@link PicasaWebExtractor.xml}.\n *\n * @type {RegExp}\n * @private\n * @const\n */\ngoog.ui.media.PicasaAlbumModel.MATCHER_ =\n    /https?:\\/\\/(?:www\\.)?picasaweb\\.(?:google\\.)?com\\/([\\d\\w\\.]+)\\/([\\d\\w_\\-\\.]+)(?:\\?[\\w\\d\\-_=&amp;;\\.]*&?authKey=([\\w\\d\\-_=;\\.]+))?(?:#([\\d]+)?)?/im;\n\n\n/**\n * Gets a `picasaUrl` and extracts the user and album id.\n *\n * @param {string} picasaUrl A picasa album URL.\n * @param {string=} opt_caption An optional caption of the picasa album.\n * @param {string=} opt_description An optional description of the picasa album.\n * @param {boolean=} opt_autoplay Whether to autoplay the slideshow.\n * @return {!goog.ui.media.PicasaAlbumModel} The picasa album data model that\n *     represents the picasa URL.\n * @throws exception in case the parsing fails\n */\ngoog.ui.media.PicasaAlbumModel.newInstance = function(\n    picasaUrl, opt_caption, opt_description, opt_autoplay) {\n  if (goog.ui.media.PicasaAlbumModel.MATCHER_.test(picasaUrl)) {\n    var data = goog.ui.media.PicasaAlbumModel.MATCHER_.exec(picasaUrl);\n    return new goog.ui.media.PicasaAlbumModel(\n        data[1], data[2], data[3], opt_caption, opt_description, opt_autoplay);\n  }\n  throw new Error(\n      'failed to parse user and album from picasa url: ' + picasaUrl);\n};\n\n\n/**\n * The opposite of `newInstance`: takes an `userId` and an\n * `albumId` and builds a URL.\n *\n * @param {string} userId The user that owns the album.\n * @param {string} albumId The album id.\n * @return {string} The URL of the album.\n */\ngoog.ui.media.PicasaAlbumModel.buildUrl = function(userId, albumId) {\n  return 'http://picasaweb.google.com/' + userId + '/' + albumId;\n};\n\n\n/**\n * Gets the Picasa user id.\n * @return {string} The Picasa user id.\n */\ngoog.ui.media.PicasaAlbumModel.prototype.getUserId = function() {\n  return this.userId_;\n};\n\n\n/**\n * Gets the Picasa album id.\n * @return {string} The Picasa album id.\n */\ngoog.ui.media.PicasaAlbumModel.prototype.getAlbumId = function() {\n  return this.albumId_;\n};\n\n\n/**\n * Gets the Picasa album authentication key.\n * @return {?string} The Picasa album authentication key.\n */\ngoog.ui.media.PicasaAlbumModel.prototype.getAuthKey = function() {\n  return this.authKey_;\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.html.TrustedResourceUrl","~$goog.ui.media.MediaModel","~$goog.ui.media.Media","~$goog.ui.media.MediaRenderer","^9>","~$goog.string.Const","~$goog.ui.media.FlashObject"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/media/picasa.js"],"^:1",["^9K",["~$goog.ui.media.PicasaAlbum","~$goog.ui.media.PicasaAlbumModel"]],"^9<",true,"^9=",["^9>","^=I","^=M","^=N","^=K","^=J","^=L"]],["^ ","^9A",[1579837703000],"^9B","goog.graphics.ext.image.js","^9C",["^9D","goog/graphics/ext/image.js"],"^9E","goog/graphics/ext/image.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A thick wrapper around images.\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.graphics.ext.Image');\n\ngoog.forwardDeclare('goog.graphics.ext.Group');\ngoog.require('goog.graphics.ext.Element');\n\n\n\n/**\n * Wrapper for a graphics image element.\n * @param {goog.graphics.ext.Group} group Parent for this element.\n * @param {string} src The path to the image to display.\n * @constructor\n * @extends {goog.graphics.ext.Element}\n * @final\n */\ngoog.graphics.ext.Image = function(group, src) {\n  // Initialize with some stock values.\n  var wrapper = group.getGraphicsImplementation().drawImage(\n      0, 0, 1, 1, src, group.getWrapper());\n  goog.graphics.ext.Element.call(this, group, wrapper);\n};\ngoog.inherits(goog.graphics.ext.Image, goog.graphics.ext.Element);\n\n\n/**\n * Redraw the image.  Called when the coordinate system is changed.\n * @protected\n * @override\n */\ngoog.graphics.ext.Image.prototype.redraw = function() {\n  goog.graphics.ext.Image.superClass_.redraw.call(this);\n\n  // Our position is already handled bu transform_.\n  this.getWrapper().setSize(this.getWidth(), this.getHeight());\n};\n\n\n/**\n * Update the source of the image.\n * @param {string} src  Source of the image.\n */\ngoog.graphics.ext.Image.prototype.setSource = function(src) {\n  this.getWrapper().setSource(src);\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.graphics.ext.Element"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/ext/image.js"],"^:1",["^9K",["~$goog.graphics.ext.Image"]],"^9<",true,"^9=",["^9>","^=Q"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.textarea.js","^9C",["^9D","goog/ui/textarea.js"],"^9E","goog/ui/textarea.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A content-aware textarea control that grows and shrinks\n * automatically. This implementation extends {@link goog.ui.Control}.\n * This code is inspired by Dojo Dijit's Textarea implementation with\n * modifications to support native (when available) textarea resizing and\n * minHeight and maxHeight enforcement.\n *\n * @see ../demos/textarea.html\n */\n\ngoog.provide('goog.ui.Textarea');\ngoog.provide('goog.ui.Textarea.EventType');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.EventType');\ngoog.require('goog.style');\ngoog.require('goog.ui.Control');\ngoog.require('goog.ui.TextareaRenderer');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A textarea control to handle growing/shrinking with textarea.value.\n *\n * @param {string} content Text to set as the textarea's value.\n * @param {goog.ui.TextareaRenderer=} opt_renderer Renderer used to render or\n *     decorate the textarea. Defaults to {@link goog.ui.TextareaRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.Control}\n */\ngoog.ui.Textarea = function(content, opt_renderer, opt_domHelper) {\n  goog.ui.Control.call(\n      this, content, opt_renderer || goog.ui.TextareaRenderer.getInstance(),\n      opt_domHelper);\n\n  this.setHandleMouseEvents(false);\n  this.setAllowTextSelection(true);\n  this.hasUserInput_ = (content != '');\n  if (!content) {\n    this.setContentInternal('');\n  }\n};\ngoog.inherits(goog.ui.Textarea, goog.ui.Control);\ngoog.tagUnsealableClass(goog.ui.Textarea);\n\n\n/**\n * Some UAs will shrink the textarea automatically, some won't.\n * @type {boolean}\n * @private\n */\ngoog.ui.Textarea.NEEDS_HELP_SHRINKING_ =\n    !(goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(11));\n\n\n/**\n * True if the resizing function is executing, false otherwise.\n * @type {boolean}\n * @private\n */\ngoog.ui.Textarea.prototype.isResizing_ = false;\n\n\n/**\n * Represents if we have focus on the textarea element, used only\n * to render the placeholder if we don't have native placeholder\n * support.\n * @type {boolean}\n * @private\n */\ngoog.ui.Textarea.prototype.hasFocusForPlaceholder_ = false;\n\n\n/**\n * @type {boolean}\n * @private\n */\ngoog.ui.Textarea.prototype.hasUserInput_ = false;\n\n\n/**\n * The height of the textarea as last measured.\n * @type {number}\n * @private\n */\ngoog.ui.Textarea.prototype.height_ = 0;\n\n\n/**\n * A maximum height for the textarea. When set to 0, the default, there is no\n * enforcement of this value during resize.\n * @type {number}\n * @private\n */\ngoog.ui.Textarea.prototype.maxHeight_ = 0;\n\n\n/**\n * A minimum height for the textarea. When set to 0, the default, there is no\n * enforcement of this value during resize.\n * @type {number}\n * @private\n */\ngoog.ui.Textarea.prototype.minHeight_ = 0;\n\n\n/**\n * Whether or not textarea rendering characteristics have been discovered.\n * Specifically we determine, at runtime:\n *    If the padding and border box is included in offsetHeight.\n *    @see {goog.ui.Textarea.prototype.needsPaddingBorderFix_}\n *    If the padding and border box is included in scrollHeight.\n *    @see {goog.ui.Textarea.prototype.scrollHeightIncludesPadding_} and\n *    @see {goog.ui.Textarea.prototype.scrollHeightIncludesBorder_}\n * TODO(user): See if we can determine goog.ui.Textarea.NEEDS_HELP_SHRINKING_.\n * @type {boolean}\n * @private\n */\ngoog.ui.Textarea.prototype.hasDiscoveredTextareaCharacteristics_ = false;\n\n\n/**\n * If a user agent doesn't correctly support the box-sizing:border-box CSS\n * value then we'll need to adjust our height calculations.\n * @see {goog.ui.Textarea.prototype.discoverTextareaCharacteristics_}\n * @type {boolean}\n * @private\n */\ngoog.ui.Textarea.prototype.needsPaddingBorderFix_ = false;\n\n\n/**\n * Whether or not scrollHeight of a textarea includes the padding box.\n * @type {boolean}\n * @private\n */\ngoog.ui.Textarea.prototype.scrollHeightIncludesPadding_ = false;\n\n\n/**\n * Whether or not scrollHeight of a textarea includes the border box.\n * @type {boolean}\n * @private\n */\ngoog.ui.Textarea.prototype.scrollHeightIncludesBorder_ = false;\n\n\n/**\n * For storing the padding box size during enterDocument, to prevent possible\n * measurement differences that can happen after text zooming.\n * Note: runtime padding changes will cause problems with this.\n * @type {goog.math.Box}\n * @private\n */\ngoog.ui.Textarea.prototype.paddingBox_;\n\n\n/**\n * For storing the border box size during enterDocument, to prevent possible\n * measurement differences that can happen after text zooming.\n * Note: runtime border width changes will cause problems with this.\n * @type {goog.math.Box}\n * @private\n */\ngoog.ui.Textarea.prototype.borderBox_;\n\n\n/**\n * Default text content for the textarea when it is unchanged and unfocussed.\n * We use the placeholder attribute for all browsers that have support for\n * it (new in HTML5 for the following browsers:\n *\n *   Internet Explorer 10.0\n *   Firefox 4.0\n *   Opera 11.6\n *   Chrome 4.0\n *   Safari 5.0\n *\n * For older browsers, we save the placeholderText_ and set it as the element's\n * value and add the TEXTAREA_PLACEHOLDER_CLASS to indicate that it's a\n * placeholder string.\n * @type {string}\n * @private\n */\ngoog.ui.Textarea.prototype.placeholderText_ = '';\n\n\n/**\n * Constants for event names.\n * @enum {string}\n */\ngoog.ui.Textarea.EventType = {\n  RESIZE: 'resize'\n};\n\n\n/**\n * Sets the default text for the textarea.\n * @param {string} text The default text for the textarea.\n */\ngoog.ui.Textarea.prototype.setPlaceholder = function(text) {\n  this.placeholderText_ = text;\n  if (this.getElement()) {\n    this.restorePlaceholder_();\n  }\n};\n\n\n/**\n * @return {number} The padding plus the border box height.\n * @private\n */\ngoog.ui.Textarea.prototype.getPaddingBorderBoxHeight_ = function() {\n  var paddingBorderBoxHeight = this.paddingBox_.top + this.paddingBox_.bottom +\n      this.borderBox_.top + this.borderBox_.bottom;\n  return paddingBorderBoxHeight;\n};\n\n\n/**\n * @return {number} The minHeight value.\n */\ngoog.ui.Textarea.prototype.getMinHeight = function() {\n  return this.minHeight_;\n};\n\n\n/**\n * @return {number} The minHeight value with a potential padding fix.\n * @private\n */\ngoog.ui.Textarea.prototype.getMinHeight_ = function() {\n  var minHeight = this.minHeight_;\n  var textarea = this.getElement();\n  if (minHeight && textarea && this.needsPaddingBorderFix_) {\n    minHeight -= this.getPaddingBorderBoxHeight_();\n  }\n  return minHeight;\n};\n\n\n/**\n * Sets a minimum height for the textarea, and calls resize if rendered.\n * @param {number} height New minHeight value.\n */\ngoog.ui.Textarea.prototype.setMinHeight = function(height) {\n  this.minHeight_ = height;\n  this.resize();\n};\n\n\n/**\n * @return {number} The maxHeight value.\n */\ngoog.ui.Textarea.prototype.getMaxHeight = function() {\n  return this.maxHeight_;\n};\n\n\n/**\n * @return {number} The maxHeight value with a potential padding fix.\n * @private\n */\ngoog.ui.Textarea.prototype.getMaxHeight_ = function() {\n  var maxHeight = this.maxHeight_;\n  var textarea = this.getElement();\n  if (maxHeight && textarea && this.needsPaddingBorderFix_) {\n    maxHeight -= this.getPaddingBorderBoxHeight_();\n  }\n  return maxHeight;\n};\n\n\n/**\n * Sets a maximum height for the textarea, and calls resize if rendered.\n * @param {number} height New maxHeight value.\n */\ngoog.ui.Textarea.prototype.setMaxHeight = function(height) {\n  this.maxHeight_ = height;\n  this.resize();\n};\n\n\n/**\n * Sets the textarea's value.\n * @param {*} value The value property for the textarea, will be cast to a\n *     string by the browser when setting textarea.value.\n */\ngoog.ui.Textarea.prototype.setValue = function(value) {\n  this.setContent(String(value));\n};\n\n\n/**\n * Gets the textarea's value.\n * @return {string} value The value of the textarea.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Textarea.prototype.getValue = function() {\n  // We potentially have the placeholder stored in the value.\n  // If a client of this class sets this.getElement().value directly\n  // we don't set the this.hasUserInput_ boolean. Thus, we need to\n  // explicitly check if the value != the placeholder text. This has\n  // the unfortunate edge case of:\n  //   If the client sets this.getElement().value to the placeholder\n  //   text, we'll return the empty string.\n  // The normal use case shouldn't be an issue, however, since the\n  // default placeholderText is the empty string. Also, if the end user\n  // inputs text, then this.hasUserInput_ will always be true.\n  if (this.getElement().value != this.placeholderText_ ||\n      this.supportsNativePlaceholder_() || this.hasUserInput_) {\n    // We don't do anything fancy here.\n    return this.getElement().value;\n  }\n  return '';\n};\n\n\n/** @override */\ngoog.ui.Textarea.prototype.setContent = function(content) {\n  goog.ui.Textarea.superClass_.setContent.call(this, content);\n  this.hasUserInput_ = (content != '');\n  this.resize();\n};\n\n\n/**\n * @override *\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Textarea.prototype.setEnabled = function(enable) {\n  goog.ui.Textarea.superClass_.setEnabled.call(this, enable);\n  this.getElement().disabled = !enable;\n};\n\n\n/**\n * Resizes the textarea vertically.\n */\ngoog.ui.Textarea.prototype.resize = function() {\n  if (this.getElement()) {\n    this.grow_();\n  }\n};\n\n\n/**\n * @return {boolean} True if the element supports the placeholder attribute.\n * @private\n */\ngoog.ui.Textarea.prototype.supportsNativePlaceholder_ = function() {\n  goog.asserts.assert(this.getElement());\n  return 'placeholder' in this.getElement();\n};\n\n\n/**\n * Sets the value of the textarea element to the default text.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Textarea.prototype.restorePlaceholder_ = function() {\n  if (!this.placeholderText_) {\n    // Return early if there is no placeholder to mess with.\n    return;\n  }\n  // Check again in case something changed since this was scheduled.\n  // We check that the element is still there since this is called by a timer\n  // and the dispose method may have been called prior to this.\n  if (this.supportsNativePlaceholder_()) {\n    this.getElement().placeholder = this.placeholderText_;\n  } else if (\n      this.getElement() && !this.hasUserInput_ &&\n      !this.hasFocusForPlaceholder_) {\n    // We only want to set the value + placeholder CSS if we actually have\n    // some placeholder text to show.\n    goog.dom.classlist.add(\n        goog.asserts.assert(this.getElement()),\n        goog.ui.Textarea.TEXTAREA_PLACEHOLDER_CLASS);\n    this.getElement().value = this.placeholderText_;\n  }\n};\n\n\n/** @override **/\ngoog.ui.Textarea.prototype.enterDocument = function() {\n  goog.ui.Textarea.base(this, 'enterDocument');\n  var textarea = this.getElement();\n\n  // Eliminates the vertical scrollbar and changes the box-sizing mode for the\n  // textarea to the border-box (aka quirksmode) paradigm.\n  goog.style.setStyle(textarea, {\n    'overflowY': 'hidden',\n    'overflowX': 'auto',\n    'boxSizing': 'border-box',\n    'MsBoxSizing': 'border-box',\n    'WebkitBoxSizing': 'border-box',\n    'MozBoxSizing': 'border-box'\n  });\n\n  this.paddingBox_ = goog.style.getPaddingBox(textarea);\n  this.borderBox_ = goog.style.getBorderBox(textarea);\n\n  this.getHandler()\n      .listen(textarea, goog.events.EventType.SCROLL, this.grow_)\n      .listen(textarea, goog.events.EventType.FOCUS, this.grow_)\n      .listen(textarea, goog.events.EventType.KEYUP, this.grow_)\n      .listen(textarea, goog.events.EventType.MOUSEUP, this.mouseUpListener_)\n      .listen(textarea, goog.events.EventType.BLUR, this.blur_);\n\n  this.restorePlaceholder_();\n  this.resize();\n};\n\n\n/**\n * Gets the textarea's content height + padding height + border height.\n * This is done by getting the scrollHeight and adjusting from there.\n * In the end this result is what we want the new offsetHeight to equal.\n * @return {number} The height of the textarea.\n * @private\n */\ngoog.ui.Textarea.prototype.getHeight_ = function() {\n  this.discoverTextareaCharacteristics_();\n  var textarea = this.getElement();\n  // Because enterDocument can be called even when the component is rendered\n  // without being in a document, we may not have cached the correct paddingBox\n  // data on render(). We try to make up for this here.\n  if (isNaN(this.paddingBox_.top)) {\n    this.paddingBox_ = goog.style.getPaddingBox(textarea);\n    this.borderBox_ = goog.style.getBorderBox(textarea);\n  }\n  // Accounts for a possible (though unlikely) horizontal scrollbar.\n  var height =\n      this.getElement().scrollHeight + this.getHorizontalScrollBarHeight_();\n  if (this.needsPaddingBorderFix_) {\n    height -= this.getPaddingBorderBoxHeight_();\n  } else {\n    if (!this.scrollHeightIncludesPadding_) {\n      var paddingBox = this.paddingBox_;\n      var paddingBoxHeight = paddingBox.top + paddingBox.bottom;\n      height += paddingBoxHeight;\n    }\n    if (!this.scrollHeightIncludesBorder_) {\n      var borderBox = goog.style.getBorderBox(textarea);\n      var borderBoxHeight = borderBox.top + borderBox.bottom;\n      height += borderBoxHeight;\n    }\n  }\n  return height;\n};\n\n\n/**\n * Sets the textarea's height.\n * @param {number} height The height to set.\n * @private\n */\ngoog.ui.Textarea.prototype.setHeight_ = function(height) {\n  if (this.height_ != height) {\n    this.height_ = height;\n    this.getElement().style.height = height + 'px';\n  }\n};\n\n\n/**\n * Sets the textarea's rows attribute to be the number of newlines + 1.\n * This is necessary when the textarea is hidden, in which case scrollHeight\n * is not available.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Textarea.prototype.setHeightToEstimate_ = function() {\n  var textarea = this.getElement();\n  textarea.style.height = 'auto';\n  var newlines = textarea.value.match(/\\n/g) || [];\n  textarea.rows = newlines.length + 1;\n  this.height_ = 0;\n};\n\n\n/**\n * Gets the the height of (possibly present) horizontal scrollbar.\n * @return {number} The height of the horizontal scrollbar.\n * @private\n */\ngoog.ui.Textarea.prototype.getHorizontalScrollBarHeight_ = function() {\n  var textarea = /** @type {!HTMLElement} */ (this.getElement());\n  var height = textarea.offsetHeight - textarea.clientHeight;\n  if (!this.scrollHeightIncludesPadding_) {\n    var paddingBox = this.paddingBox_;\n    var paddingBoxHeight = paddingBox.top + paddingBox.bottom;\n    height -= paddingBoxHeight;\n  }\n  if (!this.scrollHeightIncludesBorder_) {\n    var borderBox = goog.style.getBorderBox(textarea);\n    var borderBoxHeight = borderBox.top + borderBox.bottom;\n    height -= borderBoxHeight;\n  }\n  // Prevent negative number results, which sometimes show up.\n  return height > 0 ? height : 0;\n};\n\n\n/**\n * In order to assess the correct height for a textarea, we need to know\n * whether the scrollHeight (the full height of the text) property includes\n * the values for padding and borders. We can also test whether the\n * box-sizing: border-box setting is working and then tweak accordingly.\n * Instead of hardcoding a list of currently known behaviors and testing\n * for quirksmode, we do a runtime check out of the flow. The performance\n * impact should be very small.\n * @private\n */\ngoog.ui.Textarea.prototype.discoverTextareaCharacteristics_ = function() {\n  if (!this.hasDiscoveredTextareaCharacteristics_) {\n    var textarea =\n        /** @type {!HTMLElement} */ (this.getElement().cloneNode(false));\n    // We need to overwrite/write box model specific styles that might\n    // affect height.\n    goog.style.setStyle(textarea, {\n      'position': 'absolute',\n      'height': 'auto',\n      'top': '-9999px',\n      'margin': '0',\n      'padding': '1px',\n      'border': '1px solid #000',\n      'overflow': 'hidden'\n    });\n    goog.dom.appendChild(this.getDomHelper().getDocument().body, textarea);\n    var initialScrollHeight = textarea.scrollHeight;\n\n    textarea.style.padding = '10px';\n    var paddingScrollHeight = textarea.scrollHeight;\n    this.scrollHeightIncludesPadding_ =\n        paddingScrollHeight > initialScrollHeight;\n\n    initialScrollHeight = paddingScrollHeight;\n    textarea.style.borderWidth = '10px';\n    var borderScrollHeight = textarea.scrollHeight;\n    this.scrollHeightIncludesBorder_ = borderScrollHeight > initialScrollHeight;\n\n    // Tests if border-box sizing is working or not.\n    textarea.style.height = '100px';\n    var offsetHeightAtHeight100 = textarea.offsetHeight;\n    if (offsetHeightAtHeight100 != 100) {\n      this.needsPaddingBorderFix_ = true;\n    }\n\n    goog.dom.removeNode(textarea);\n    this.hasDiscoveredTextareaCharacteristics_ = true;\n  }\n};\n\n\n/**\n * The CSS class name to add to the input when the user has not entered a\n * value.\n */\ngoog.ui.Textarea.TEXTAREA_PLACEHOLDER_CLASS =\n    goog.getCssName('textarea-placeholder-input');\n\n\n/**\n * Called when the element goes out of focus.\n * @param {goog.events.Event=} opt_e The browser event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Textarea.prototype.blur_ = function(opt_e) {\n  if (!this.supportsNativePlaceholder_()) {\n    this.hasFocusForPlaceholder_ = false;\n    if (this.getElement().value == '') {\n      // Only transition to the default text if we have\n      // no user input.\n      this.hasUserInput_ = false;\n      this.restorePlaceholder_();\n    }\n  }\n};\n\n\n/**\n * Resizes the textarea to grow/shrink to match its contents.\n * @param {goog.events.Event=} opt_e The browser event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Textarea.prototype.grow_ = function(opt_e) {\n  if (this.isResizing_) {\n    return;\n  }\n  var textarea = /** @type {!HTMLElement} */ (this.getElement());\n  // If the element is getting focus and we don't support placeholders\n  // natively, then remove the placeholder class.\n  if (!this.supportsNativePlaceholder_() && opt_e &&\n      opt_e.type == goog.events.EventType.FOCUS) {\n    // We must have a textarea element, since we're growing it.\n    // Remove the placeholder CSS + set the value to empty if we're currently\n    // showing the placeholderText_ value if this is the first time we're\n    // getting focus.\n    if (textarea.value == this.placeholderText_ && this.placeholderText_ &&\n        !this.hasFocusForPlaceholder_) {\n      goog.dom.classlist.remove(\n          textarea, goog.ui.Textarea.TEXTAREA_PLACEHOLDER_CLASS);\n      textarea.value = '';\n    }\n    this.hasFocusForPlaceholder_ = true;\n    this.hasUserInput_ = (textarea.value != '');\n  }\n  var shouldCallShrink = false;\n  this.isResizing_ = true;\n  var oldHeight = this.height_;\n  if (textarea.scrollHeight) {\n    var setMinHeight = false;\n    var setMaxHeight = false;\n    var newHeight = this.getHeight_();\n    var currentHeight = textarea.offsetHeight;\n    var minHeight = this.getMinHeight_();\n    var maxHeight = this.getMaxHeight_();\n    if (minHeight && newHeight < minHeight) {\n      this.setHeight_(minHeight);\n      setMinHeight = true;\n    } else if (maxHeight && newHeight > maxHeight) {\n      this.setHeight_(maxHeight);\n      // If the content is greater than the height, we'll want the vertical\n      // scrollbar back.\n      textarea.style.overflowY = '';\n      setMaxHeight = true;\n    } else if (currentHeight != newHeight) {\n      this.setHeight_(newHeight);\n      // Makes sure that height_ is at least set.\n    } else if (!this.height_) {\n      this.height_ = newHeight;\n    }\n    if (!setMinHeight && !setMaxHeight &&\n        goog.ui.Textarea.NEEDS_HELP_SHRINKING_) {\n      shouldCallShrink = true;\n    }\n  } else {\n    this.setHeightToEstimate_();\n  }\n  this.isResizing_ = false;\n\n  if (shouldCallShrink) {\n    this.shrink_();\n  }\n  if (oldHeight != this.height_) {\n    this.dispatchEvent(goog.ui.Textarea.EventType.RESIZE);\n  }\n};\n\n\n/**\n * Resizes the textarea to shrink to fit its contents. The way this works is\n * by increasing the padding of the textarea by 1px (it's important here that\n * we're in box-sizing: border-box mode). If the size of the textarea grows,\n * then the box is filled up to the padding box with text.\n * If it doesn't change, then we can shrink.\n * @private\n */\ngoog.ui.Textarea.prototype.shrink_ = function() {\n  var textarea = this.getElement();\n  if (!this.isResizing_) {\n    this.isResizing_ = true;\n    var scrollHeight = textarea.scrollHeight;\n    if (!scrollHeight) {\n      this.setHeightToEstimate_();\n    } else {\n      var currentHeight = this.getHeight_();\n      var minHeight = this.getMinHeight_();\n      if (!(minHeight && currentHeight <= minHeight)) {\n        // Nudge the padding by 1px.\n        var paddingBox = this.paddingBox_;\n        textarea.style.paddingBottom = paddingBox.bottom + 1 + 'px';\n        var heightAfterNudge = this.getHeight_();\n        // If the one px of padding had no effect, then we can shrink.\n        if (heightAfterNudge == currentHeight) {\n          textarea.style.paddingBottom =\n              paddingBox.bottom + scrollHeight + 'px';\n          textarea.scrollTop = 0;\n          var shrinkToHeight = this.getHeight_() - scrollHeight;\n          if (shrinkToHeight >= minHeight) {\n            this.setHeight_(shrinkToHeight);\n          } else {\n            this.setHeight_(minHeight);\n          }\n        }\n        textarea.style.paddingBottom = paddingBox.bottom + 'px';\n      }\n    }\n    this.isResizing_ = false;\n  }\n};\n\n\n/**\n * We use this listener to check if the textarea has been natively resized\n * and if so we reset minHeight so that we don't ever shrink smaller than\n * the user's manually set height. Note that we cannot check size on mousedown\n * and then just compare here because we cannot capture mousedown on\n * the textarea resizer, while mouseup fires reliably.\n * @param {goog.events.BrowserEvent} e The mousedown event.\n * @private\n */\ngoog.ui.Textarea.prototype.mouseUpListener_ = function(e) {\n  var textarea = /** @type {!HTMLElement} */ (this.getElement());\n  var height = textarea.offsetHeight;\n\n  // This solves for when the MSIE DropShadow filter is enabled,\n  // as it affects the offsetHeight value, even with MsBoxSizing:border-box.\n  if (textarea['filters'] && textarea['filters'].length) {\n    var dropShadow =\n        textarea['filters']['item']('DXImageTransform.Microsoft.DropShadow');\n    if (dropShadow) {\n      height -= dropShadow['offX'];\n    }\n  }\n\n  if (height != this.height_) {\n    this.minHeight_ = height;\n    this.height_ = height;\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^:;","~$goog.ui.TextareaRenderer","^9>","^:S","^:I","~$goog.ui.Control","^<3"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/textarea.js"],"^:1",["^9K",["~$goog.ui.Textarea","~$goog.ui.Textarea.EventType"]],"^9<",true,"^9=",["^9>","^:E","^;;","^:;","^:I","^<3","^=T","^=S","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.jstdasyncwrapper.js","^9C",["^9D","goog/testing/jstdasyncwrapper.js"],"^9E","goog/testing/jstdasyncwrapper.js","^9F","^9G","^9H","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A utility for wrapping a JSTD test object so that any test\n * methods are receive a queue that is compatible with JSTD but supports the\n * JsUnit async API of returning a promise in the test method.\n *\n * To convert a JSTD object call convertToAsyncTestObj on it and run with the\n * JsUnit test runner.\n */\n\ngoog.provide('goog.testing.JsTdAsyncWrapper');\n\ngoog.require('goog.Promise');\n\n\n/**\n * @param {Function|string} callback\n * @param {number=} opt_delay\n * @param {...*} var_args\n * @return {number}\n * @private\n */\ngoog.testing.JsTdAsyncWrapper.REAL_SET_TIMEOUT_FN_ = goog.global.setTimeout;\n\n\n/**\n * Calls a function after a specified timeout. This uses the original setTimeout\n * to be resilient to tests that override it.\n * @param {Function} fn The function to call.\n * @param {number} timeout Timeout time in ms.\n * @private\n */\ngoog.testing.JsTdAsyncWrapper.REAL_SET_TIMEOUT_ = function(fn, timeout) {\n  // Setting timeout into a variable is necessary to invoke the function in the\n  // default global context. Inlining breaks chrome since it requires setTimeout\n  // to be called with the global context, and IE8 doesn't support the call\n  // method on setTimeout.\n  var setTimeoutFn = goog.testing.JsTdAsyncWrapper.REAL_SET_TIMEOUT_FN_;\n  setTimeoutFn(fn, timeout);\n};\n\n\n/**\n * Wraps an object's methods by passing in a Queue that is based on the JSTD\n * async API. The queue exposes a promise that resolves when the queue\n * completes. This promise can be used in JsUnit tests.\n *\n * @template T\n * @param {T} original The original JSTD test object. The object should\n *     contain methods such as testXyz or setUp.\n * @return {T} A object that has all test methods wrapped in a fake\n *     testing queue.\n */\ngoog.testing.JsTdAsyncWrapper.convertToAsyncTestObj = function(original) {\n  // Wraps a call to a test function and passes an instance of a fake queue\n  // into the test function.\n  var queueWrapperFn = function(fn) {\n    return function() {\n      var self = /** @type {?} */ (this);  // T this is expected\n      var queue = new goog.testing.JsTdAsyncWrapper.Queue(self);\n      fn.call(self, queue);\n      return queue.startExecuting();\n    };\n  };\n\n  var newTestObj = {};\n  for (var prop in original) {\n    // If this is a test or tearDown/setUp method wrap the method with a queue\n    if (prop.indexOf('test') == 0 || prop == 'setUp' || prop == 'tearDown') {\n      newTestObj[prop] = queueWrapperFn(original[prop]);\n    } else {\n      newTestObj[prop] = original[prop];\n    }\n  }\n  return newTestObj;\n};\n\n\n\n/**\n * A queue that mirrors the JSTD Async Queue api but exposes a promise that\n * resolves once the queue is complete for compatibility with JsUnit.\n * @param {!Object} testObj The test object containing all test methods. This\n *     object is passed into queue callbacks as the \"this\" object.\n * @constructor\n * @final\n */\ngoog.testing.JsTdAsyncWrapper.Queue = function(testObj) {\n  /**\n   * The queue steps.\n   * @private {!Array<!goog.testing.JsTdAsyncWrapper.Step_>}\n   */\n  this.steps_ = [];\n\n  /**\n   * A delegate that is used within a defer call.\n   * @private {?goog.testing.JsTdAsyncWrapper.Queue}\n   */\n  this.delegate_ = null;\n\n  /**\n   * thisArg that should be used by default for addCallback function calls.\n   * @private {!Object}\n   */\n  this.testObj_ = testObj;\n};\n\n\n/**\n * @param {string|function(!goog.testing.JsTdAsyncWrapper.Pool_=)} stepName\n *     The name of the current testing step, or the fn parameter if\n *     no stepName is desired.\n * @param {function(!goog.testing.JsTdAsyncWrapper.Pool_=)=} opt_fn A function\n *   that will be called.\n */\ngoog.testing.JsTdAsyncWrapper.Queue.prototype.defer = function(\n    stepName, opt_fn) {\n  var fn = opt_fn;\n  if (!opt_fn && typeof stepName == 'function') {\n    fn = stepName;\n    stepName = '(Not named)';\n  }\n  // If another queue.defer is called within a pool callback it should be\n  // executed after the current one. Any defer that is called within a defer\n  // will be passed to a delegate and the current defer waits till all delegate\n  // defer are resolved.\n  if (this.delegate_) {\n    this.delegate_.defer(stepName, fn);\n    return;\n  }\n  this.steps_.push(new goog.testing.JsTdAsyncWrapper.Step_(\n      /** @type {string} */ (stepName),\n      /** @type {function(!goog.testing.JsTdAsyncWrapper.Pool_=)} */ (fn)));\n};\n\n\n/**\n * Starts the execution.\n * @return {!goog.Promise<void>}\n */\ngoog.testing.JsTdAsyncWrapper.Queue.prototype.startExecuting = function() {\n  return new goog.Promise(goog.bind(function(resolve, reject) {\n    this.executeNextStep_(resolve, reject);\n  }, this));\n};\n\n\n/**\n * Executes the next step on the queue waiting for all pool callbacks and then\n * starts executing any delegate queues before it finishes.\n * @param {function()} callback\n * @param {function(*)} errback\n * @private\n */\ngoog.testing.JsTdAsyncWrapper.Queue.prototype.executeNextStep_ = function(\n    callback, errback) {\n  // Note: From this point on, we can no longer use goog.Promise (which uses\n  // the goog.async.run queue) because it conflicts with MockClock, and we can't\n  // use the native Promise because it is not supported on IE. So we revert to\n  // using callbacks and setTimeout.\n  if (!this.steps_.length) {\n    callback();\n    return;\n  }\n  var step = this.steps_.shift();\n  this.delegate_ = new goog.testing.JsTdAsyncWrapper.Queue(this.testObj_);\n  var pool = new goog.testing.JsTdAsyncWrapper.Pool_(\n      this.testObj_, goog.bind(function() {\n        goog.testing.JsTdAsyncWrapper.REAL_SET_TIMEOUT_(goog.bind(function() {\n          this.executeDelegate_(callback, errback);\n        }, this), 0);\n      }, this), goog.bind(function(reason) {\n        this.handleError_(errback, reason, step.name);\n      }, this));\n  try {\n    step.fn.call(this.testObj_, pool);\n  } catch (e) {\n    this.handleError_(errback, e, step.name);\n  }\n  pool.maybeComplete();\n};\n\n\n/**\n * Execute the delegate queue.\n * @param {function()} callback\n * @param {function(*)} errback\n * @private\n */\ngoog.testing.JsTdAsyncWrapper.Queue.prototype.executeDelegate_ = function(\n    callback, errback) {\n  // Wait till the delegate queue completes before moving on to the\n  // next step.\n  if (!this.delegate_) {\n    this.executeNextStep_(callback, errback);\n    return;\n  }\n  this.delegate_.executeNextStep_(goog.bind(function() {\n    this.delegate_ = null;\n    goog.testing.JsTdAsyncWrapper.REAL_SET_TIMEOUT_(goog.bind(function() {\n      this.executeNextStep_(callback, errback);\n    }, this), 0);\n  }, this), errback);\n};\n\n\n/**\n * @param {function(*)} errback\n * @param {*} reason\n * @param {string} stepName\n * @private\n */\ngoog.testing.JsTdAsyncWrapper.Queue.prototype.handleError_ = function(\n    errback, reason, stepName) {\n  var error = reason instanceof Error ? reason : Error(reason);\n  error.message = 'In step ' + stepName + ', error: ' + error.message;\n  errback(reason);\n};\n\n\n\n/**\n * A step to be executed.\n * @param {string} name\n * @param {function(!goog.testing.JsTdAsyncWrapper.Pool_=)} fn\n * @constructor\n * @private\n */\ngoog.testing.JsTdAsyncWrapper.Step_ = function(name, fn) {\n  /** @final {string} */\n  this.name = name;\n  /** @final {function(!goog.testing.JsTdAsyncWrapper.Pool_=)} */\n  this.fn = fn;\n};\n\n\n\n/**\n * A fake pool that mimics the JSTD AsyncTestCase's pool object.\n * @param {!Object} testObj The test object containing all test methods. This\n *     object is passed into queue callbacks as the \"this\" object.\n * @param {function()} callback\n * @param {function(*)} errback\n * @constructor\n * @private\n * @final\n */\ngoog.testing.JsTdAsyncWrapper.Pool_ = function(testObj, callback, errback) {\n\n  /** @private {number} */\n  this.outstandingCallbacks_ = 0;\n\n  /** @private {function()} */\n  this.callback_ = callback;\n\n  /** @private {function(*)} */\n  this.errback_ = errback;\n\n  /**\n   * thisArg that should be used by default for defer function calls.\n   * @private {!Object}\n   */\n  this.testObj_ = testObj;\n\n  /** @private {boolean} */\n  this.callbackCalled_ = false;\n};\n\n\n/**\n * @return {function()}\n */\ngoog.testing.JsTdAsyncWrapper.Pool_.prototype.noop = function() {\n  return this.addCallback(function() {});\n};\n\n\n/**\n * @param {function(...*):*} fn The function to add to the pool.\n * @param {?number=} opt_n The number of permitted uses of the given callback;\n *     defaults to one.\n * @param {?number=} opt_timeout The timeout in milliseconds.\n *     This is not supported in the adapter for now. Specifying this argument\n *     will result in a test failure.\n * @param {?string=} opt_description The callback description.\n * @return {function()}\n */\ngoog.testing.JsTdAsyncWrapper.Pool_.prototype.addCallback = function(\n    fn, opt_n, opt_timeout, opt_description) {\n  // TODO(mtragut): This could be fixed if required by test cases.\n  if (opt_timeout || opt_description) {\n    throw new Error(\n        'Setting timeout or description in a pool callback is not supported.');\n  }\n  var numCallbacks = opt_n || 1;\n  this.outstandingCallbacks_ = this.outstandingCallbacks_ + numCallbacks;\n  return goog.bind(function() {\n    try {\n      fn.apply(this.testObj_, arguments);\n    } catch (e) {\n      if (opt_description) {\n        e.message = opt_description + e.message;\n      }\n      this.errback_(e);\n    }\n    this.outstandingCallbacks_ = this.outstandingCallbacks_ - 1;\n    this.maybeComplete();\n  }, this);\n};\n\n\n/**\n * @param {function(...*):*} fn The function to add to the pool.\n * @param {?number=} opt_n The number of permitted uses of the given callback;\n *     defaults to one.\n * @param {?number=} opt_timeout The timeout in milliseconds.\n *     This is not supported in the adapter for now. Specifying this argument\n *     will result in a test failure.\n * @param {?string=} opt_description The callback description.\n * @return {function()}\n */\ngoog.testing.JsTdAsyncWrapper.Pool_.prototype.add =\n    goog.testing.JsTdAsyncWrapper.Pool_.prototype.addCallback;\n\n\n/**\n * @param {string} msg The message to print if the error callback gets called.\n * @return {function()}\n */\ngoog.testing.JsTdAsyncWrapper.Pool_.prototype.addErrback = function(msg) {\n  return goog.bind(function() {\n    var errorMsg = msg;\n    if (arguments.length) {\n      errorMsg += ' - Error callback called with params: ( ';\n      for (var i = 0; i < arguments.length; i++) {\n        var arg = arguments[i];\n        errorMsg += arg + ' ';\n        if (arg instanceof Error) {\n          errorMsg += '\\n' + arg.stack + '\\n';\n        }\n      }\n      errorMsg += ')';\n    }\n    this.errback_(errorMsg);\n  }, this);\n};\n\n\n/**\n * Completes the pool if there are no outstanding callbacks.\n */\ngoog.testing.JsTdAsyncWrapper.Pool_.prototype.maybeComplete = function() {\n  if (this.outstandingCallbacks_ == 0 && !this.callbackCalled_) {\n    this.callbackCalled_ = true;\n    this.callback_();\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:4"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/jstdasyncwrapper.js"],"^:1",["^9K",["~$goog.testing.JsTdAsyncWrapper"]],"^9<",true,"^9=",["^9>","^:4"]],["^ ","^9A",[1579837703000],"^9B","goog.labs.net.webchannel.wirev8.js","^9C",["^9D","goog/labs/net/webchannel/wirev8.js"],"^9E","goog/labs/net/webchannel/wirev8.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Codec functions of the v8 wire protocol. Eventually we'd want\n * to support pluggable wire-format to improve wire efficiency and to enable\n * binary encoding. Such support will require an interface class, which\n * will be added later.\n */\n\n\ngoog.provide('goog.labs.net.webChannel.WireV8');\n\ngoog.forwardDeclare('goog.structs.Map');\ngoog.require('goog.asserts');\ngoog.require('goog.json');\ngoog.require('goog.json.NativeJsonProcessor');\ngoog.require('goog.labs.net.webChannel.Wire');\ngoog.require('goog.structs');\n\n\n\n/**\n * The v8 codec class.\n *\n * @constructor\n * @struct\n */\ngoog.labs.net.webChannel.WireV8 = function() {\n  /**\n   * Parser for a response payload. The parser should return an array.\n   * @private {!goog.string.Parser}\n   */\n  this.parser_ = new goog.json.NativeJsonProcessor();\n};\n\n\ngoog.scope(function() {\nvar WireV8 = goog.labs.net.webChannel.WireV8;\nvar Wire = goog.labs.net.webChannel.Wire;\n\n\n/**\n * Encodes a standalone message into the wire format.\n *\n * May throw exception if the message object contains any invalid elements.\n *\n * @param {!Object|!goog.structs.Map} message The message data.\n *     V8 only support JS objects (or Map).\n * @param {!Array<string>} buffer The text buffer to write the message to.\n * @param {string=} opt_prefix The prefix for each field of the object.\n */\nWireV8.prototype.encodeMessage = function(message, buffer, opt_prefix) {\n  var prefix = opt_prefix || '';\n  try {\n    goog.structs.forEach(message, function(value, key) {\n      var encodedValue = value;\n      if (goog.isObject(value)) {\n        encodedValue = goog.json.serialize(value);\n      }  // keep the fast-path for primitive types\n      buffer.push(prefix + key + '=' + encodeURIComponent(encodedValue));\n    });\n  } catch (ex) {\n    // We send a map here because lots of the retry logic relies on map IDs,\n    // so we have to send something (possibly redundant).\n    buffer.push(\n        prefix + 'type' +\n        '=' + encodeURIComponent('_badmap'));\n    throw ex;\n  }\n};\n\n\n/**\n * Encodes all the buffered messages of the forward channel.\n *\n * @param {!Array<Wire.QueuedMap>} messageQueue The message data.\n *     V8 only support JS objects.\n * @param {number} count The number of messages to be encoded.\n * @param {?function(!Object)} badMapHandler Callback for bad messages.\n * @return {string} the encoded messages\n */\nWireV8.prototype.encodeMessageQueue = function(\n    messageQueue, count, badMapHandler) {\n  var offset = -1;\n  while (true) {\n    var sb = ['count=' + count];\n    // To save a bit of bandwidth, specify the base mapId and the rest as\n    // offsets from it.\n    if (offset == -1) {\n      if (count > 0) {\n        offset = messageQueue[0].mapId;\n        sb.push('ofs=' + offset);\n      } else {\n        offset = 0;\n      }\n    } else {\n      sb.push('ofs=' + offset);\n    }\n    var done = true;\n    for (var i = 0; i < count; i++) {\n      var mapId = messageQueue[i].mapId;\n      var map = messageQueue[i].map;\n      mapId -= offset;\n      if (mapId < 0) {\n        // redo the encoding in case of retry/reordering, plus extra space\n        offset = Math.max(0, messageQueue[i].mapId - 100);\n        done = false;\n        continue;\n      }\n      try {\n        this.encodeMessage(map, sb, 'req' + mapId + '_');\n      } catch (ex) {\n        if (badMapHandler) {\n          badMapHandler(map);\n        }\n      }\n    }\n    if (done) {\n      return sb.join('&');\n    }\n  }\n};\n\n\n/**\n * Decodes a standalone message received from the wire. May throw exception\n * if text is ill-formatted.\n *\n * Must be valid JSON as it is insecure to use eval() to decode JS literals;\n * and eval() is disallowed in Chrome apps too.\n *\n * Invalid JS literals include null array elements, quotas etc.\n *\n * @param {string} messageText The string content as received from the wire.\n * @return {*} The decoded message object.\n */\nWireV8.prototype.decodeMessage = function(messageText) {\n  var response = this.parser_.parse(messageText);\n  goog.asserts.assert(goog.isArray(response));  // throw exception\n  return response;\n};\n});  // goog.scope\n","^9I",1579837703000,"^9J",["^9K",["^:E","^<O","^<A","^<B","^9>","^<U"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchannel/wirev8.js"],"^:1",["^9K",["~$goog.labs.net.webChannel.WireV8"]],"^9<",true,"^9=",["^9>","^:E","^<A","^<O","^<B","^<U"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.net.xhrio.js","^9C",["^9D","goog/testing/net/xhrio.js"],"^9E","goog/testing/net/xhrio.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Mock of XhrIo for unit testing.\n * @suppress {accessControls} Overriding private properties for test impl.\n */\n\ngoog.setTestOnly('goog.testing.net.XhrIo');\ngoog.provide('goog.testing.net.XhrIo');\n\ngoog.require('goog.Uri');\ngoog.require('goog.array');\ngoog.require('goog.dom.xml');\ngoog.require('goog.events');\ngoog.require('goog.net.ErrorCode');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.HttpStatus');\ngoog.require('goog.net.XhrIo');\ngoog.require('goog.net.XmlHttp');\ngoog.require('goog.object');\ngoog.require('goog.structs');\ngoog.require('goog.structs.Map');\ngoog.require('goog.testing.TestQueue');\ngoog.require('goog.uri.utils');\n\n/**\n * Mock implementation of goog.net.XhrIo. This doesn't provide a mock\n * implementation for all cases, but it's not too hard to add them as needed.\n * @param {goog.testing.TestQueue=} opt_testQueue Test queue for inserting test\n *     events.\n * @constructor\n * @extends {goog.net.XhrIo}\n */\ngoog.testing.net.XhrIo = function(opt_testQueue) {\n  goog.testing.net.XhrIo.base.call(this);\n\n  /**\n   * Map of default headers to add to every request, use:\n   * XhrIo.headers.set(name, value)\n   * @type {!goog.structs.Map}\n   */\n  this.headers = new goog.structs.Map();\n\n  /**\n   * Queue of events write to.\n   * @private {?goog.testing.TestQueue}\n   */\n  this.testQueue_ = opt_testQueue || null;\n};\ngoog.inherits(goog.testing.net.XhrIo, goog.net.XhrIo);\n\n/**\n * Some compiled tests replace goog.net.XhrIo with goog.testing.net.XhrIo,\n * which would cause a circular constructor loop.\n * @nocollapse\n */\ngoog.testing.net.XhrIo.base = goog.net.XhrIo;\n\n/**\n * To emulate the behavior of the actual XhrIo, we do not allow access to the\n * XhrIo's properties outside the event callbacks. For backwards compatibility,\n * we allow tests to allow access by setting this value to true.\n * @type {boolean}\n */\ngoog.testing.net.XhrIo.allowUnsafeAccessToXhrIoOutsideCallbacks = false;\n\n\n/**\n * Alias this enum here to make mocking of goog.net.XhrIo easier.\n * @enum {string}\n */\ngoog.testing.net.XhrIo.ResponseType = goog.net.XhrIo.ResponseType;\n\n\n/**\n * The pattern matching the 'http' and 'https' URI schemes.\n * @private {!RegExp}\n */\ngoog.testing.net.XhrIo.HTTP_SCHEME_PATTERN_ = /^https?$/i;\n\n\n/**\n * All non-disposed instances of goog.testing.net.XhrIo created\n * by {@link goog.testing.net.XhrIo.send} are in this Array.\n * @see goog.testing.net.XhrIo.cleanup\n * @type {!Array<!goog.testing.net.XhrIo>}\n * @private\n */\ngoog.testing.net.XhrIo.sendInstances_ = [];\n\n\n/**\n * Returns an Array containing all non-disposed instances of\n * goog.testing.net.XhrIo created by {@link goog.testing.net.XhrIo.send}.\n * @return {!Array<!goog.testing.net.XhrIo>} Array of goog.testing.net.XhrIo\n *     instances.\n */\ngoog.testing.net.XhrIo.getSendInstances = function() {\n  return goog.testing.net.XhrIo.sendInstances_;\n};\n\n\n/**\n * Disposes all non-disposed instances of goog.testing.net.XhrIo created by\n * {@link goog.testing.net.XhrIo.send}.\n * @see goog.net.XhrIo.cleanup\n */\ngoog.testing.net.XhrIo.cleanup = function() {\n  var instances = goog.testing.net.XhrIo.sendInstances_;\n  while (instances.length) {\n    instances.pop().dispose();\n  }\n};\n\n\n/**\n * Simulates the static XhrIo send method.\n * @param {string} url Uri to make request to.\n * @param {Function=} opt_callback Callback function for when request is\n *     complete.\n * @param {string=} opt_method Send method, default: GET.\n * @param {ArrayBuffer|ArrayBufferView|Blob|Document|FormData|string=}\n *     opt_content Body data.\n * @param {Object|goog.structs.Map=} opt_headers Map of headers to add to the\n *     request.\n * @param {number=} opt_timeoutInterval Number of milliseconds after which an\n *     incomplete request will be aborted; 0 means no timeout is set.\n * @param {boolean=} opt_withCredentials Whether to send credentials with the\n *     request. Default to false. See {@link goog.net.XhrIo#setWithCredentials}.\n * @return {!goog.testing.net.XhrIo} The mocked sent XhrIo.\n */\ngoog.testing.net.XhrIo.send = function(\n    url, opt_callback, opt_method, opt_content, opt_headers,\n    opt_timeoutInterval, opt_withCredentials) {\n  var x = new goog.testing.net.XhrIo();\n  goog.testing.net.XhrIo.sendInstances_.push(x);\n  if (opt_callback) {\n    goog.events.listen(x, goog.net.EventType.COMPLETE, opt_callback);\n  }\n  goog.events.listen(\n      x, goog.net.EventType.READY,\n      goog.partial(goog.testing.net.XhrIo.cleanupSend_, x));\n  if (opt_timeoutInterval) {\n    x.setTimeoutInterval(opt_timeoutInterval);\n  }\n  x.setWithCredentials(Boolean(opt_withCredentials));\n  x.send(url, opt_method, opt_content, opt_headers);\n\n  return x;\n};\n\n\n/**\n * Disposes of the specified goog.testing.net.XhrIo created by\n * {@link goog.testing.net.XhrIo.send} and removes it from\n * {@link goog.testing.net.XhrIo.pendingStaticSendInstances_}.\n * @param {!goog.testing.net.XhrIo} XhrIo An XhrIo created by\n *     {@link goog.testing.net.XhrIo.send}.\n * @private\n */\ngoog.testing.net.XhrIo.cleanupSend_ = function(XhrIo) {\n  XhrIo.dispose();\n  goog.array.remove(goog.testing.net.XhrIo.sendInstances_, XhrIo);\n};\n\n\n/**\n * Stores the simulated response headers for the requests which are sent through\n * this XhrIo.\n * @type {Object}\n * @private\n */\ngoog.testing.net.XhrIo.prototype.responseHeaders_;\n\n\n/**\n * Whether MockXhrIo is active.\n * @private {boolean}\n * @override\n */\ngoog.testing.net.XhrIo.prototype.active_ = false;\n\n\n/**\n * Last URI that was requested.\n * @private {?goog.Uri|string}\n * @override\n */\ngoog.testing.net.XhrIo.prototype.lastUri_ = '';\n\n\n/**\n * Last HTTP method that was requested.\n * @private {string|undefined}\n * @override\n */\ngoog.testing.net.XhrIo.prototype.lastMethod_;\n\n\n/**\n * Last POST content that was requested.\n * @private {\n *     ArrayBuffer|ArrayBufferView|Blob|Document|FormData|string|undefined}\n */\ngoog.testing.net.XhrIo.prototype.lastContent_;\n\n\n/**\n * Additional headers that were requested in the last query.\n * @private {Object|goog.structs.Map|undefined}\n */\ngoog.testing.net.XhrIo.prototype.lastHeaders_;\n\n\n/**\n * Last error code.\n * @private {!goog.net.ErrorCode}\n * @override\n */\ngoog.testing.net.XhrIo.prototype.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR;\n\n\n/**\n * Last error message.\n * @private {string}\n * @override\n */\ngoog.testing.net.XhrIo.prototype.lastError_ = '';\n\n\n/**\n * The response object.\n * @private {string|Document|ArrayBuffer}\n */\ngoog.testing.net.XhrIo.prototype.response_ = '';\n\n\n/**\n * The status code.\n * @private {number}\n */\ngoog.testing.net.XhrIo.prototype.statusCode_ = 0;\n\n\n/**\n * Mock ready state.\n * @private {number}\n */\ngoog.testing.net.XhrIo.prototype.readyState_ =\n    goog.net.XmlHttp.ReadyState.UNINITIALIZED;\n\n\n/**\n * Number of milliseconds after which an incomplete request will be aborted and\n * a {@link goog.net.EventType.TIMEOUT} event raised; 0 means no timeout is set.\n * @private {number}\n * @override\n */\ngoog.testing.net.XhrIo.prototype.timeoutInterval_ = 0;\n\n\n/**\n * The requested type for the response. The empty string means use the default\n * XHR behavior.\n * @private {goog.net.XhrIo.ResponseType}\n * @override\n */\ngoog.testing.net.XhrIo.prototype.responseType_ =\n    goog.net.XhrIo.ResponseType.DEFAULT;\n\n\n/**\n * Whether a \"credentialed\" request is to be sent (one that is aware of cookies\n * and authentication) . This is applicable only for cross-domain requests and\n * more recent browsers that support this part of the HTTP Access Control\n * standard.\n *\n * @see http://dev.w3.org/2006/webapi/XMLHttpRequest-2/#withcredentials\n *\n * @private {boolean}\n * @override\n */\ngoog.testing.net.XhrIo.prototype.withCredentials_ = false;\n\n\n/**\n * Whether progress events shall be sent for this request.\n *\n * @private {boolean}\n * @override\n */\ngoog.testing.net.XhrIo.prototype.progressEventsEnabled_ = false;\n\n\n/**\n * Whether there's currently an underlying XHR object.\n * @private {boolean}\n */\ngoog.testing.net.XhrIo.prototype.hasXhr_ = false;\n\n\n/**\n * Returns the number of milliseconds after which an incomplete request will be\n * aborted, or 0 if no timeout is set.\n * @return {number} Timeout interval in milliseconds.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getTimeoutInterval = function() {\n  return this.timeoutInterval_;\n};\n\n\n/**\n * Sets the number of milliseconds after which an incomplete request will be\n * aborted and a {@link goog.net.EventType.TIMEOUT} event raised; 0 means no\n * timeout is set.\n * @param {number} ms Timeout interval in milliseconds; 0 means none.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.setTimeoutInterval = function(ms) {\n  this.timeoutInterval_ = Math.max(0, ms);\n};\n\n\n/**\n * Causes timeout events to be fired.\n */\ngoog.testing.net.XhrIo.prototype.simulateTimeout = function() {\n  this.lastErrorCode_ = goog.net.ErrorCode.TIMEOUT;\n  this.dispatchEvent(goog.net.EventType.TIMEOUT);\n  this.abort(goog.net.ErrorCode.TIMEOUT);\n};\n\n\n/**\n * Sets the desired type for the response. At time of writing, this is only\n * supported in very recent versions of WebKit (10.0.612.1 dev and later).\n *\n * If this is used, the response may only be accessed via {@link #getResponse}.\n *\n * @param {goog.net.XhrIo.ResponseType} type The desired type for the response.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.setResponseType = function(type) {\n  this.responseType_ = type;\n};\n\n\n/**\n * Gets the desired type for the response.\n * @return {!goog.net.XhrIo.ResponseType} The desired type for the response.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getResponseType = function() {\n  return this.responseType_;\n};\n\n\n/**\n * Sets whether a \"credentialed\" request that is aware of cookie and\n * authentication information should be made. This option is only supported by\n * browsers that support HTTP Access Control. As of this writing, this option\n * is not supported in IE.\n *\n * @param {boolean} withCredentials Whether this should be a \"credentialed\"\n *     request.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.setWithCredentials = function(\n    withCredentials) {\n  this.withCredentials_ = withCredentials;\n};\n\n\n/**\n * Gets whether a \"credentialed\" request is to be sent.\n * @return {boolean} The desired type for the response.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getWithCredentials = function() {\n  return this.withCredentials_;\n};\n\n\n/**\n * Sets whether progress events are enabled for this request. Note\n * that progress events require pre-flight OPTIONS request handling\n * for CORS requests, and may cause trouble with older browsers. See\n * goog.net.XhrIo.progressEventsEnabled_ for details.\n * @param {boolean} enabled Whether progress events should be enabled.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.setProgressEventsEnabled = function(enabled) {\n  this.progressEventsEnabled_ = enabled;\n};\n\n\n/**\n * Gets whether progress events are enabled.\n * @return {boolean} Whether progress events are enabled for this request.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getProgressEventsEnabled = function() {\n  return this.progressEventsEnabled_;\n};\n\n\n/**\n * Abort the current XMLHttpRequest\n * @param {!goog.net.ErrorCode=} opt_failureCode Optional error code to use -\n *     defaults to ABORT.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.abort = function(opt_failureCode) {\n  if (this.active_) {\n    try {\n      this.active_ = false;\n      this.readyState_ = goog.net.XmlHttp.ReadyState.UNINITIALIZED;\n      this.statusCode_ = -1;\n      this.lastErrorCode_ = opt_failureCode || goog.net.ErrorCode.ABORT;\n      this.dispatchEvent(goog.net.EventType.COMPLETE);\n      this.dispatchEvent(goog.net.EventType.ABORT);\n    } finally {\n      this.simulateReady();\n    }\n  }\n};\n\n\n/**\n * Simulates the XhrIo send.\n * @param {?goog.Uri|string} url Uri to make request too.\n * @param {string=} opt_method Send method, default: GET.\n * @param {ArrayBuffer|ArrayBufferView|Blob|Document|FormData|string=}\n *     opt_content Body data.\n * @param {Object|goog.structs.Map=} opt_headers Map of headers to add to the\n *     request.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.send = function(\n    url, opt_method, opt_content, opt_headers) {\n  if (this.hasXhr_) {\n    throw new Error('[goog.net.XhrIo] Object is active with another request');\n  }\n\n  this.lastUri_ = url;\n  this.lastMethod_ = opt_method || 'GET';\n  this.lastContent_ = opt_content;\n  if (!this.headers.isEmpty()) {\n    this.lastHeaders_ = this.headers.toObject();\n    // Add headers specific to this request\n    if (opt_headers) {\n      goog.structs.forEach(opt_headers, goog.bind(function(value, key) {\n        this.lastHeaders_[key] = value;\n      }, this));\n    }\n  } else {\n    this.lastHeaders_ = opt_headers;\n  }\n\n  if (this.testQueue_) {\n    this.testQueue_.enqueue(['s', url, opt_method, opt_content, opt_headers]);\n  }\n  this.hasXhr_ = true;\n  this.active_ = true;\n  this.readyState_ = goog.net.XmlHttp.ReadyState.UNINITIALIZED;\n  this.simulateReadyStateChange(goog.net.XmlHttp.ReadyState.LOADING);\n};\n\n\n/**\n * Creates a new XHR object.\n * @return {!goog.net.XhrLike.OrNative} The newly created XHR object.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.createXhr = function() {\n  return goog.net.XmlHttp();\n};\n\n\n/**\n * Simulates changing to the new ready state.\n * @param {number} readyState Ready state to change to.\n */\ngoog.testing.net.XhrIo.prototype.simulateReadyStateChange = function(\n    readyState) {\n  if (readyState < this.readyState_) {\n    throw new Error('Readystate cannot go backwards');\n  }\n\n  // INTERACTIVE can be dispatched repeatedly as more data is reported.\n  if (readyState == goog.net.XmlHttp.ReadyState.INTERACTIVE &&\n      readyState == this.readyState_) {\n    this.dispatchEvent(goog.net.EventType.READY_STATE_CHANGE);\n    return;\n  }\n\n  while (this.readyState_ < readyState) {\n    this.readyState_++;\n    this.dispatchEvent(goog.net.EventType.READY_STATE_CHANGE);\n\n    if (this.readyState_ == goog.net.XmlHttp.ReadyState.COMPLETE) {\n      this.active_ = false;\n      this.dispatchEvent(goog.net.EventType.COMPLETE);\n    }\n  }\n};\n\n\n/**\n * Simulate receiving some bytes but the request not fully completing, and\n * the XHR entering the 'INTERACTIVE' state.\n * @param {string} partialResponse A string to append to the response text.\n * @param {Object=} opt_headers Simulated response headers.\n */\ngoog.testing.net.XhrIo.prototype.simulatePartialResponse = function(\n    partialResponse, opt_headers) {\n  this.response_ += partialResponse;\n  this.responseHeaders_ = opt_headers || {};\n  this.statusCode_ = 200;\n  this.simulateReadyStateChange(goog.net.XmlHttp.ReadyState.INTERACTIVE);\n};\n\n\n/**\n * Simulates receiving a response.\n * @param {number} statusCode Simulated status code.\n * @param {string|Document|ArrayBuffer|null} response Simulated response.\n * @param {Object=} opt_headers Simulated response headers.\n */\ngoog.testing.net.XhrIo.prototype.simulateResponse = function(\n    statusCode, response, opt_headers) {\n  // This library allows a response to be simulated without send ever being\n  // called. If there are no send instances, then just pretend that xhr_ and\n  // active_ have been set to true.\n  if (!goog.testing.net.XhrIo.allowUnsafeAccessToXhrIoOutsideCallbacks &&\n      !goog.testing.net.XhrIo.sendInstances_.length) {\n    this.hasXhr_ = true;\n    this.active_ = true;\n  }\n  this.statusCode_ = statusCode;\n  this.response_ = response || '';\n  this.responseHeaders_ = opt_headers || {};\n\n  try {\n    if (this.isSuccess()) {\n      this.simulateReadyStateChange(goog.net.XmlHttp.ReadyState.COMPLETE);\n      this.dispatchEvent(goog.net.EventType.SUCCESS);\n    } else {\n      this.lastErrorCode_ = goog.net.ErrorCode.HTTP_ERROR;\n      this.lastError_ = this.getStatusText() + ' [' + this.getStatus() + ']';\n      this.simulateReadyStateChange(goog.net.XmlHttp.ReadyState.COMPLETE);\n      this.dispatchEvent(goog.net.EventType.ERROR);\n    }\n  } finally {\n    this.simulateReady();\n  }\n};\n\n\n/**\n * Simulates the Xhr is ready for the next request.\n */\ngoog.testing.net.XhrIo.prototype.simulateReady = function() {\n  this.active_ = false;\n  this.hasXhr_ = false;\n  this.dispatchEvent(goog.net.EventType.READY);\n};\n\n\n/**\n * Simulates the Xhr progress event.\n * @param {boolean} lengthComputable Whether progress is measurable.\n * @param {number} loaded Amount of work already performed.\n * @param {number} total Total amount of work to perform.\n * @param {boolean=} opt_isDownload Whether the progress is from a download or\n *     upload.\n */\ngoog.testing.net.XhrIo.prototype.simulateProgress = function(\n    lengthComputable, loaded, total, opt_isDownload) {\n  /**\n   * @typedef {{\n   *   type: goog.net.EventType,\n   *   lengthComputable: boolean,\n   *   loaded: number,\n   *   total: number\n   * }}\n   */\n  var ProgressEventType;\n\n  var /** ProgressEventType */ progressEvent = {\n    type: goog.net.EventType.PROGRESS,\n    lengthComputable: lengthComputable,\n    loaded: loaded,\n    total: total\n  };\n  this.dispatchEvent(progressEvent);\n  var specificProgress =\n      /** @type {ProgressEventType} */ (goog.object.clone(progressEvent));\n  specificProgress.type = opt_isDownload ?\n      goog.net.EventType.DOWNLOAD_PROGRESS :\n      goog.net.EventType.UPLOAD_PROGRESS;\n  this.dispatchEvent(specificProgress);\n};\n\n\n/**\n * @return {boolean} Whether there is an active request.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.isActive = function() {\n  return !!this.hasXhr_;\n};\n\n\n/**\n * Has the request completed.\n * @return {boolean} Whether the request has completed.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.isComplete = function() {\n  return this.readyState_ == goog.net.XmlHttp.ReadyState.COMPLETE;\n};\n\n\n/**\n * Has the request compeleted with a success.\n * @return {boolean} Whether the request compeleted successfully.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.isSuccess = function() {\n  var status = this.getStatus();\n  // A zero status code is considered successful for local files.\n  return goog.net.HttpStatus.isSuccess(status) ||\n      status === 0 && !this.isLastUriEffectiveSchemeHttp_();\n};\n\n\n/**\n * @return {boolean} whether the effective scheme of the last URI that was\n *     fetched was 'http' or 'https'.\n * @private\n * @override\n */\ngoog.testing.net.XhrIo.prototype.isLastUriEffectiveSchemeHttp_ = function() {\n  var scheme = goog.uri.utils.getEffectiveScheme(String(this.lastUri_));\n  return goog.testing.net.XhrIo.HTTP_SCHEME_PATTERN_.test(scheme);\n};\n\n\n/**\n * Returns the readystate.\n * @return {!goog.net.XmlHttp.ReadyState} goog.net.XmlHttp.ReadyState.*.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getReadyState = function() {\n  return /** @type {!goog.net.XmlHttp.ReadyState} */ (this.readyState_);\n};\n\n\n/**\n * Get the status from the Xhr object.  Will only return correct result when\n * called from the context of a callback.\n * @return {number} Http status.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getStatus = function() {\n  return this.statusCode_;\n};\n\n\n/**\n * Get the status text from the Xhr object.  Will only return correct result\n * when called from the context of a callback.\n * @return {string} Status text.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getStatusText = function() {\n  return '';\n};\n\n\n/**\n * Gets the last error message.\n * @return {!goog.net.ErrorCode} Last error code.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getLastErrorCode = function() {\n  return this.lastErrorCode_;\n};\n\n\n/**\n * Gets the last error message.\n * @return {string} Last error message.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getLastError = function() {\n  return this.lastError_;\n};\n\n\n/**\n * Gets the last URI that was requested.\n * @return {string} Last URI.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getLastUri = function() {\n  // A few tests depend on this returning a goog.Uri object, even though\n  // goog.net.XhrIo only ever returns a string from getLastUri.\n  // TODO(closure-team): Update the tests that are using getLastUri for\n  // null or goog.Uri return values.\n  return /** @type {string} */ (this.lastUri_);\n};\n\n\n/**\n * Gets the last HTTP method that was requested.\n * @return {string|undefined} Last HTTP method used by send.\n */\ngoog.testing.net.XhrIo.prototype.getLastMethod = function() {\n  return this.lastMethod_;\n};\n\n\n/**\n * Gets the last POST content that was requested.\n * @return {ArrayBuffer|ArrayBufferView|Blob|Document|FormData|string|undefined}\n *     Last POST content or undefined if last request was a GET.\n */\ngoog.testing.net.XhrIo.prototype.getLastContent = function() {\n  return this.lastContent_;\n};\n\n\n/**\n * Gets the headers of the last request.\n * @return {Object|goog.structs.Map|undefined} Last headers manually set in send\n *      call or undefined if no additional headers were specified.\n */\ngoog.testing.net.XhrIo.prototype.getLastRequestHeaders = function() {\n  return this.lastHeaders_;\n};\n\n\n/**\n * Returns true if there is a valid xhr, or if\n * allowUnsafeAccessToXhrIoOutsideCallbacks is false.\n * @return {boolean}\n * @private\n */\ngoog.testing.net.XhrIo.prototype.checkXhr_ = function() {\n  return (\n      goog.testing.net.XhrIo.allowUnsafeAccessToXhrIoOutsideCallbacks ||\n      !!this.hasXhr_);\n};\n\n\n/**\n * Gets the response text from the Xhr object.  Will only return correct result\n * when called from the context of a callback.\n * @return {string} Result from the server.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getResponseText = function() {\n  if (!this.checkXhr_()) {\n    return '';\n  } else if (typeof this.response_ === 'string') {\n    return this.response_;\n  } else if (\n      goog.global['ArrayBuffer'] && this.response_ instanceof ArrayBuffer) {\n    return '';\n  } else {\n    return goog.dom.xml.serialize(/** @type {Document} */ (this.response_));\n  }\n};\n\n\n/**\n * Gets the response body from the Xhr object. Will only return correct result\n * when called from the context of a callback.\n * @return {Object} Binary result from the server or null.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getResponseBody = function() {\n  return null;\n};\n\n\n/**\n * Gets the response and evaluates it as JSON from the Xhr object.  Will only\n * return correct result when called from the context of a callback.\n * @param {string=} opt_xssiPrefix Optional XSSI prefix string to use for\n *     stripping of the response before parsing. This needs to be set only if\n *     your backend server prepends the same prefix string to the JSON response.\n * @return {Object|undefined} JavaScript object.\n * @throws Error if s is invalid JSON.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getResponseJson = function(opt_xssiPrefix) {\n  if (!this.checkXhr_()) {\n    return undefined;\n  }\n\n  var responseText = this.getResponseText();\n  if (opt_xssiPrefix && responseText.indexOf(opt_xssiPrefix) == 0) {\n    responseText = responseText.substring(opt_xssiPrefix.length);\n  }\n\n  return /** @type {!Object} */ (JSON.parse(responseText));\n};\n\n\n/**\n * Gets the response XML from the Xhr object.  Will only return correct result\n * when called from the context of a callback.\n * @return {Document} Result from the server if it was XML.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getResponseXml = function() {\n  if (!this.checkXhr_()) {\n    return null;\n  }\n  // NOTE(user): I haven't found out how to check in Internet Explorer\n  // whether the response is XML document, so I do it the other way around.\n  return typeof this.response_ === 'string' ||\n          (goog.global['ArrayBuffer'] &&\n           this.response_ instanceof ArrayBuffer) ?\n      null :\n      /** @type {Document} */ (this.response_);\n};\n\n\n/**\n * Get the response as the type specificed by {@link #setResponseType}. At time\n * of writing, this is only supported in very recent versions of WebKit\n * (10.0.612.1 dev and later).\n *\n * @return {*} The response.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getResponse = function() {\n  return this.checkXhr_() ? this.response_ : null;\n};\n\n\n/**\n * Get the value of the response-header with the given name from the Xhr object\n * Will only return correct result when called from the context of a callback\n * and the request has completed\n * @param {string} key The name of the response-header to retrieve.\n * @return {string|undefined} The value of the response-header named key.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getResponseHeader = function(key) {\n  if (!this.checkXhr_() || !this.isComplete()) {\n    return undefined;\n  }\n  return this.responseHeaders_[key];\n};\n\n\n/**\n * Gets the text of all the headers in the response.\n * Will only return correct result when called from the context of a callback\n * and the request has completed\n * @return {string} The string containing all the response headers.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getAllResponseHeaders = function() {\n  if (!this.checkXhr_() || !this.isComplete()) {\n    return '';\n  }\n  return this.getAllStreamingResponseHeaders();\n};\n\n\n/**\n * Returns all response headers as a key-value map.\n * Multiple values for the same header key can be combined into one,\n * separated by a comma and a space.\n * Note that the native getResponseHeader method for retrieving a single header\n * does a case insensitive match on the header name. This method does not\n * include any case normalization logic, it will just return a key-value\n * representation of the headers.\n * See: http://www.w3.org/TR/XMLHttpRequest/#the-getresponseheader()-method\n * @return {!Object<string, string>} An object with the header keys as keys\n *     and header values as values.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getResponseHeaders = function() {\n  if (!this.checkXhr_() || !this.isComplete()) {\n    return {};\n  }\n  var headersObject = {};\n  goog.object.forEach(this.responseHeaders_, function(value, key) {\n    if (headersObject[key]) {\n      headersObject[key] += ', ' + value;\n    } else {\n      headersObject[key] = value;\n    }\n  });\n  return headersObject;\n};\n\n\n/**\n * Get the value of the response-header with the given name from the Xhr object.\n * As opposed to {@link #getResponseHeader}, this method does not require that\n * the request has completed.\n * @param {string} key The name of the response-header to retrieve.\n * @return {?string} The value of the response-header, or null if it is\n *     unavailable.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getStreamingResponseHeader = function(key) {\n  if (!this.checkXhr_()) {\n    return null;\n  }\n  return key in this.responseHeaders_ ? this.responseHeaders_[key] : null;\n};\n\n\n/**\n * Gets the text of all the headers in the response. As opposed to\n * {@link #getAllResponseHeaders}, this method does not require that the request\n * has completed.\n * @return {string} The value of the response headers or empty string.\n * @override\n */\ngoog.testing.net.XhrIo.prototype.getAllStreamingResponseHeaders = function() {\n  if (!this.checkXhr_()) {\n    return '';\n  }\n  var headers = [];\n  goog.object.forEach(this.responseHeaders_, function(value, name) {\n    headers.push(name + ': ' + value);\n  });\n  return headers.join('\\r\\n');\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.testing.TestQueue","~$goog.net.HttpStatus","^;N","^;O","~$goog.structs.Map","^<S","^9>","^;P","~$goog.net.EventType","^<U","~$goog.net.XmlHttp","^;9","^:N","~$goog.dom.xml","~$goog.net.ErrorCode"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/net/xhrio.js"],"^:1",["^9K",["~$goog.testing.net.XhrIo"]],"^9<",true,"^9=",["^9>","^<S","^;9","^>2","^:N","^>3","^>0","^=Z","^;N","^>1","^;P","^<U","^=[","^=Y","^;O"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.streams.lite_types.js","^9C",["^9D","goog/streams/lite_types.js"],"^9E","goog/streams/lite_types.js","^9F","^9G","^9H","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Types provided by the lite implementation. DO NOT WRITE\n * IMPLEMANTATIONS OF THE INTERFACES PROVIDED HERE. These exist to provide\n * a super type for the native-wrapped impl and the ponyfill impl.\n */\ngoog.module('goog.streams.liteTypes');\n\n/**\n * The lite ReadableStream.\n *\n * Supports the getReader() method and locked property.\n *\n * The only method of underlying sources that is supported is enqueueing,\n * closing, and erroring.\n *\n * Pulling (including backpressure and sizes) and cancellation are not\n * supported.\n * @template T\n * @interface\n */\nclass ReadableStream {\n  /**\n   * Returns true if the ReadableStream has been locked to a reader.\n   * https://streams.spec.whatwg.org/#rs-locked\n   * @return {boolean}\n   */\n  get locked() {}\n\n  /**\n   * Returns a ReadableStreamDefaultReader that enables reading chunks from\n   * the source.\n   * https://streams.spec.whatwg.org/#rs-get-reader\n   * @return {!ReadableStreamDefaultReader<T>}\n   */\n  getReader() {}\n}\n\n/**\n * A reader for a lite ReadableStream.\n *\n * Supports the read() and releaseLock() methods, along with the closed\n * property.\n * @template T\n * @interface\n */\nclass ReadableStreamDefaultReader {\n  /**\n   * Returns a Promise that resolves when the Stream closes or is errored, or if\n   * the reader releases its lock.\n   * https://streams.spec.whatwg.org/#default-reader-closed\n   * @return {!Promise<undefined>}\n   */\n  get closed() {}\n\n  /**\n   * Returns a Promise that resolves with an IIterableResult providing the next\n   * chunk or that the stream is closed. The Promise may reject if the stream\n   * is errored.\n   * https://streams.spec.whatwg.org/#default-reader-read\n   * @return {!Promise<!IIterableResult<T>>}\n   */\n  read() {}\n\n  /**\n   * Release the lock on the stream. Any further calls to read() will error,\n   * and the stream can create another reader.\n   * https://streams.spec.whatwg.org/#default-reader-release-lock\n   * @return {void}\n   */\n  releaseLock() {}\n}\n\n/**\n * A controller for a lite ReadableStream.\n *\n * Provides the enqueue(), error(), and close() methods.\n * @template T\n * @interface\n */\nclass ReadableStreamDefaultController {\n  /**\n   * Signals that the ReadableStream should close. The ReadableStream will\n   * actually close once all of its chunks have been read.\n   * https://streams.spec.whatwg.org/#rs-default-controller-close\n   * @return {void}\n   */\n  close() {}\n\n  /**\n   * Enqueues a new chunk into the stream that can be read.\n   * https://streams.spec.whatwg.org/#rs-default-controller-enqueue\n   * @param {T} chunk\n   */\n  enqueue(chunk) {}\n\n  /**\n   * Closes the stream with an error. Any future interactions with the\n   * controller will throw an error.\n   * https://streams.spec.whatwg.org/#rs-default-controller-error\n   * @param {*} e\n   */\n  error(e) {}\n}\n\n/**\n * The underlying source for a lite ReadableStream.\n * @template T\n * @record\n */\nclass ReadableStreamUnderlyingSource {\n  constructor() {\n    /**\n     * A start method that is called when the ReadableStream is constructed.\n     *\n     * For the purpose of the lite version, this method is not optional,\n     * and the return value is not used. In other versions, a Promise return\n     * value will prevent calls to pull until the Promise is resolved.\n     * @type {(function(!ReadableStreamDefaultController<T>):\n     *     (!Promise<undefined>|undefined))|undefined}\n     * https://streams.spec.whatwg.org/#dom-underlying-source-start\n     */\n    this.start;\n  }\n}\n\nexports = {\n  ReadableStream,\n  ReadableStreamDefaultController,\n  ReadableStreamDefaultReader,\n  ReadableStreamUnderlyingSource,\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/streams/lite_types.js"],"^:1",["^9K",["~$goog.streams.liteTypes"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.browserrange.abstractrange.js","^9C",["^9D","goog/dom/browserrange/abstractrange.js"],"^9E","goog/dom/browserrange/abstractrange.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the browser range interface.\n *\n * DO NOT USE THIS FILE DIRECTLY.  Use goog.dom.Range instead.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.dom.browserrange.AbstractRange');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.RangeEndpoint');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.TextRangeIterator');\ngoog.require('goog.iter');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.string');\ngoog.require('goog.string.StringBuffer');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * The constructor for abstract ranges.  Don't call this from subclasses.\n * @constructor\n */\ngoog.dom.browserrange.AbstractRange = function() {};\n\n\n/**\n * @return {goog.dom.browserrange.AbstractRange} A clone of this range.\n */\ngoog.dom.browserrange.AbstractRange.prototype.clone = goog.abstractMethod;\n\n\n/**\n * Returns the browser native implementation of the range.  Please refrain from\n * using this function - if you find you need the range please add wrappers for\n * the functionality you need rather than just using the native range.\n * @return {Range|TextRange} The browser native range object.\n */\ngoog.dom.browserrange.AbstractRange.prototype.getBrowserRange =\n    goog.abstractMethod;\n\n\n/**\n * Returns the deepest node in the tree that contains the entire range.\n * @return {Node} The deepest node that contains the entire range.\n */\ngoog.dom.browserrange.AbstractRange.prototype.getContainer =\n    goog.abstractMethod;\n\n\n/**\n * Returns the node the range starts in.\n * @return {Node} The element or text node the range starts in.\n */\ngoog.dom.browserrange.AbstractRange.prototype.getStartNode =\n    goog.abstractMethod;\n\n\n/**\n * Returns the offset into the node the range starts in.\n * @return {number} The offset into the node the range starts in.  For text\n *     nodes, this is an offset into the node value.  For elements, this is\n *     an offset into the childNodes array.\n */\ngoog.dom.browserrange.AbstractRange.prototype.getStartOffset =\n    goog.abstractMethod;\n\n\n/**\n * @return {goog.math.Coordinate} The coordinate of the selection start node\n *     and offset.\n */\ngoog.dom.browserrange.AbstractRange.prototype.getStartPosition = function() {\n  return this.getPosition_(true);\n};\n\n\n/**\n * Returns the node the range ends in.\n * @return {Node} The element or text node the range ends in.\n */\ngoog.dom.browserrange.AbstractRange.prototype.getEndNode = goog.abstractMethod;\n\n\n/**\n * Returns the offset into the node the range ends in.\n * @return {number} The offset into the node the range ends in.  For text\n *     nodes, this is an offset into the node value.  For elements, this is\n *     an offset into the childNodes array.\n */\ngoog.dom.browserrange.AbstractRange.prototype.getEndOffset =\n    goog.abstractMethod;\n\n\n/**\n * @return {goog.math.Coordinate} The coordinate of the selection end node\n *     and offset.\n */\ngoog.dom.browserrange.AbstractRange.prototype.getEndPosition = function() {\n  return this.getPosition_(false);\n};\n\n\n/**\n * @param {boolean} start Whether to get the position of the start or end.\n * @return {goog.math.Coordinate} The coordinate of the selection point.\n * @private\n */\ngoog.dom.browserrange.AbstractRange.prototype.getPosition_ = function(start) {\n  goog.asserts.assert(\n      this.range_.getClientRects,\n      'Getting selection coordinates is not supported.');\n\n  var rects = this.range_.getClientRects();\n  if (rects.length) {\n    var r = start ? rects[0] : goog.array.peek(rects);\n    return new goog.math.Coordinate(\n        start ? r.left : r.right, start ? r.top : r.bottom);\n  }\n  return null;\n};\n\n\n/**\n * Compares one endpoint of this range with the endpoint of another browser\n * native range object.\n * @param {Range|TextRange} range The browser native range to compare against.\n * @param {goog.dom.RangeEndpoint} thisEndpoint The endpoint of this range\n *     to compare with.\n * @param {goog.dom.RangeEndpoint} otherEndpoint The endpoint of the other\n *     range to compare with.\n * @return {number} 0 if the endpoints are equal, negative if this range\n *     endpoint comes before the other range endpoint, and positive otherwise.\n */\ngoog.dom.browserrange.AbstractRange.prototype.compareBrowserRangeEndpoints =\n    goog.abstractMethod;\n\n\n/**\n * Tests if this range contains the given range.\n * @param {goog.dom.browserrange.AbstractRange} abstractRange The range to test.\n * @param {boolean=} opt_allowPartial If not set or false, the range must be\n *     entirely contained in the selection for this function to return true.\n * @return {boolean} Whether this range contains the given range.\n */\ngoog.dom.browserrange.AbstractRange.prototype.containsRange = function(\n    abstractRange, opt_allowPartial) {\n  // IE sometimes misreports the boundaries for collapsed ranges. So if the\n  // other range is collapsed, make sure the whole range is contained. This is\n  // logically equivalent, and works around IE's bug.\n  var checkPartial = opt_allowPartial && !abstractRange.isCollapsed();\n\n  var range = abstractRange.getBrowserRange();\n  var start = goog.dom.RangeEndpoint.START, end = goog.dom.RangeEndpoint.END;\n\n  try {\n    if (checkPartial) {\n      // There are two ways to not overlap.  Being before, and being after.\n      // Before is represented by this.end before range.start: comparison < 0.\n      // After is represented by this.start after range.end: comparison > 0.\n      // The below is the negation of not overlapping.\n      return this.compareBrowserRangeEndpoints(range, end, start) >= 0 &&\n          this.compareBrowserRangeEndpoints(range, start, end) <= 0;\n\n    } else {\n      // Return true if this range bounds the parameter range from both sides.\n      return this.compareBrowserRangeEndpoints(range, end, end) >= 0 &&\n          this.compareBrowserRangeEndpoints(range, start, start) <= 0;\n    }\n  } catch (e) {\n    if (!goog.userAgent.IE) {\n      throw e;\n    }\n    // IE sometimes throws exceptions when one range is invalid, i.e. points\n    // to a node that has been removed from the document.  Return false in this\n    // case.\n    return false;\n  }\n};\n\n\n/**\n * Tests if this range contains the given node.\n * @param {Node} node The node to test.\n * @param {boolean=} opt_allowPartial If not set or false, the node must be\n *     entirely contained in the selection for this function to return true.\n * @return {boolean} Whether this range contains the given node.\n * @suppress {missingRequire} Cannot depend on goog.dom.browserrange because it\n *     creates a circular dependency.\n */\ngoog.dom.browserrange.AbstractRange.prototype.containsNode = function(\n    node, opt_allowPartial) {\n  /** @suppress {missingRequire} Circular dep with browserrange */\n  return this.containsRange(\n      goog.dom.browserrange.createRangeFromNodeContents(node),\n      opt_allowPartial);\n};\n\n\n/**\n * Tests if the selection is collapsed - i.e. is just a caret.\n * @return {boolean} Whether the range is collapsed.\n */\ngoog.dom.browserrange.AbstractRange.prototype.isCollapsed = goog.abstractMethod;\n\n\n/**\n * @return {string} The text content of the range.\n */\ngoog.dom.browserrange.AbstractRange.prototype.getText = goog.abstractMethod;\n\n\n/**\n * Returns the HTML fragment this range selects.  This is slow on all browsers.\n * @return {string} HTML fragment of the range, does not include context\n *     containing elements.\n */\ngoog.dom.browserrange.AbstractRange.prototype.getHtmlFragment = function() {\n  var output = new goog.string.StringBuffer();\n  goog.iter.forEach(this, function(node, ignore, it) {\n    if (node.nodeType == goog.dom.NodeType.TEXT) {\n      output.append(\n          goog.string.htmlEscape(\n              node.nodeValue.substring(\n                  it.getStartTextOffset(), it.getEndTextOffset())));\n    } else if (node.nodeType == goog.dom.NodeType.ELEMENT) {\n      if (it.isEndTag()) {\n        if (goog.dom.canHaveChildren(node)) {\n          output.append('</' + node.tagName + '>');\n        }\n      } else {\n        var shallow = node.cloneNode(false);\n        var html = goog.dom.getOuterHtml(shallow);\n        if (goog.userAgent.IE && node.tagName == goog.dom.TagName.LI) {\n          // For an LI, IE just returns \"<li>\" with no closing tag\n          output.append(html);\n        } else {\n          var index = html.lastIndexOf('<');\n          output.append(index ? html.substr(0, index) : html);\n        }\n      }\n    }\n  }, this);\n\n  return output.toString();\n};\n\n\n/**\n * Returns valid HTML for this range.  This is fast on IE, and semi-fast on\n * other browsers.\n * @return {string} Valid HTML of the range, including context containing\n *     elements.\n */\ngoog.dom.browserrange.AbstractRange.prototype.getValidHtml =\n    goog.abstractMethod;\n\n\n/**\n * Returns a RangeIterator over the contents of the range.  Regardless of the\n * direction of the range, the iterator will move in document order.\n * @param {boolean=} opt_keys Unused for this iterator.\n * @return {!goog.dom.RangeIterator} An iterator over tags in the range.\n */\ngoog.dom.browserrange.AbstractRange.prototype.__iterator__ = function(\n    opt_keys) {\n  return new goog.dom.TextRangeIterator(\n      this.getStartNode(), this.getStartOffset(), this.getEndNode(),\n      this.getEndOffset());\n};\n\n\n// SELECTION MODIFICATION\n\n\n/**\n * Set this range as the selection in its window.\n * @param {boolean=} opt_reverse Whether to select the range in reverse,\n *     if possible.\n */\ngoog.dom.browserrange.AbstractRange.prototype.select = goog.abstractMethod;\n\n\n/**\n * Removes the contents of the range from the document.  As a side effect, the\n * selection will be collapsed.  The behavior of content removal is normalized\n * across browsers.  For instance, IE sometimes creates extra text nodes that\n * a W3C browser does not.  That behavior is corrected for.\n */\ngoog.dom.browserrange.AbstractRange.prototype.removeContents =\n    goog.abstractMethod;\n\n\n/**\n * Surrounds the text range with the specified element (on Mozilla) or with a\n * clone of the specified element (on IE).  Returns a reference to the\n * surrounding element if the operation was successful; returns null if the\n * operation failed.\n * @param {Element} element The element with which the selection is to be\n *    surrounded.\n * @return {Element} The surrounding element (same as the argument on Mozilla,\n *    but not on IE), or null if unsuccessful.\n */\ngoog.dom.browserrange.AbstractRange.prototype.surroundContents =\n    goog.abstractMethod;\n\n\n/**\n * Inserts a node before (or after) the range.  The range may be disrupted\n * beyond recovery because of the way this splits nodes.\n * @param {Node} node The node to insert.\n * @param {boolean} before True to insert before, false to insert after.\n * @return {Node} The node added to the document.  This may be different\n *     than the node parameter because on IE we have to clone it.\n */\ngoog.dom.browserrange.AbstractRange.prototype.insertNode = goog.abstractMethod;\n\n\n/**\n * Surrounds this range with the two given nodes.  The range may be disrupted\n * beyond recovery because of the way this splits nodes.\n * @param {Element} startNode The node to insert at the start.\n * @param {Element} endNode The node to insert at the end.\n */\ngoog.dom.browserrange.AbstractRange.prototype.surroundWithNodes =\n    goog.abstractMethod;\n\n\n/**\n * Collapses the range to one of its boundary points.\n * @param {boolean} toStart Whether to collapse to the start of the range.\n */\ngoog.dom.browserrange.AbstractRange.prototype.collapse = goog.abstractMethod;\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.iter","^;;","^=B","^9L","~$goog.dom.TextRangeIterator","^9>","^:S","^<1","~$goog.math.Coordinate","~$goog.dom.RangeEndpoint","^;9","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/browserrange/abstractrange.js"],"^:1",["^9K",["~$goog.dom.browserrange.AbstractRange"]],"^9<",true,"^9=",["^9>","^;9","^:E","^;;","^=B","^>9","^;=","^>7","^>6","^>8","^9L","^<1","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.iframemask.js","^9C",["^9D","goog/ui/iframemask.js"],"^9E","goog/ui/iframemask.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Iframe shims, to protect controls on the underlying page\n * from bleeding through popups.\n *\n * @author gboyer@google.com (Garrett Boyer)\n * @author nicksantos@google.com (Nick Santos) (Ported to Closure)\n */\n\n\ngoog.provide('goog.ui.IframeMask');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.Timer');\ngoog.require('goog.dom');\ngoog.require('goog.dom.iframe');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.structs.Pool');\ngoog.require('goog.style');\n\n\n\n/**\n * Controller for an iframe mask. The mask is only valid in the current\n * document, or else the document of the given DOM helper.\n *\n * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper for the relevant\n *     document.\n * @param {goog.structs.Pool=} opt_iframePool An optional source of iframes.\n *     Iframes will be grabbed from the pool when they're needed and returned\n *     to the pool (but still attached to the DOM) when they're done.\n * @constructor\n * @extends {goog.Disposable}\n */\ngoog.ui.IframeMask = function(opt_domHelper, opt_iframePool) {\n  goog.Disposable.call(this);\n\n  /**\n   * The DOM helper for this document.\n   * @type {goog.dom.DomHelper}\n   * @private\n   */\n  this.dom_ = opt_domHelper || goog.dom.getDomHelper();\n\n  /**\n   * An Element to snap the mask to. If none is given, defaults to\n   * a full-screen iframe mask.\n   * @type {Element}\n   * @private\n   */\n  this.snapElement_ = this.dom_.getDocument().documentElement;\n\n  /**\n   * An event handler for listening to popups and the like.\n   * @type {goog.events.EventHandler<!goog.ui.IframeMask>}\n   * @private\n   */\n  this.handler_ = new goog.events.EventHandler(this);\n\n  /**\n   * An iframe pool.\n   * @type {goog.structs.Pool|undefined}\n   * @private\n   */\n  this.iframePool_ = opt_iframePool;\n};\ngoog.inherits(goog.ui.IframeMask, goog.Disposable);\ngoog.tagUnsealableClass(goog.ui.IframeMask);\n\n\n/**\n * An iframe.\n * @type {HTMLIFrameElement}\n * @private\n */\ngoog.ui.IframeMask.prototype.iframe_;\n\n\n/**\n * The z-index of the iframe mask.\n * @type {number}\n * @private\n */\ngoog.ui.IframeMask.prototype.zIndex_ = 1;\n\n\n/**\n * The opacity of the iframe mask, expressed as a value between 0 and 1, with\n * 1 being totally opaque.\n * @type {number}\n * @private\n */\ngoog.ui.IframeMask.prototype.opacity_ = 0;\n\n\n/**\n * Removes the iframe from the DOM.\n * @override\n * @protected\n */\ngoog.ui.IframeMask.prototype.disposeInternal = function() {\n  if (this.iframePool_) {\n    this.iframePool_.releaseObject(\n        /** @type {HTMLIFrameElement} */ (this.iframe_));\n  } else {\n    goog.dom.removeNode(this.iframe_);\n  }\n  this.iframe_ = null;\n\n  this.handler_.dispose();\n  this.handler_ = null;\n\n  goog.ui.IframeMask.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * CSS for a hidden iframe.\n * @type {string}\n * @private\n */\ngoog.ui.IframeMask.HIDDEN_CSS_TEXT_ =\n    'position:absolute;display:none;z-index:1';\n\n\n/**\n * Removes the mask from the screen.\n */\ngoog.ui.IframeMask.prototype.hideMask = function() {\n  if (this.iframe_) {\n    this.iframe_.style.cssText = goog.ui.IframeMask.HIDDEN_CSS_TEXT_;\n    if (this.iframePool_) {\n      this.iframePool_.releaseObject(this.iframe_);\n      this.iframe_ = null;\n    }\n  }\n};\n\n\n/**\n * Gets the iframe to use as a mask. Creates a new one if one has not been\n * created yet.\n * @return {!HTMLIFrameElement} The iframe.\n * @private\n */\ngoog.ui.IframeMask.prototype.getIframe_ = function() {\n  if (!this.iframe_) {\n    this.iframe_ = this.iframePool_ ?\n        /** @type {HTMLIFrameElement} */ (this.iframePool_.getObject()) :\n                                         goog.dom.iframe.createBlank(this.dom_);\n    this.iframe_.style.cssText = goog.ui.IframeMask.HIDDEN_CSS_TEXT_;\n    this.dom_.getDocument().body.appendChild(this.iframe_);\n  }\n  return this.iframe_;\n};\n\n\n/**\n * Applies the iframe mask to the screen.\n */\ngoog.ui.IframeMask.prototype.applyMask = function() {\n  var iframe = this.getIframe_();\n  var bounds = goog.style.getBounds(this.snapElement_);\n  iframe.style.cssText = 'position:absolute;' +\n      'left:' + bounds.left + 'px;' +\n      'top:' + bounds.top + 'px;' +\n      'width:' + bounds.width + 'px;' +\n      'height:' + bounds.height + 'px;' +\n      'z-index:' + this.zIndex_;\n  goog.style.setOpacity(iframe, this.opacity_);\n  iframe.style.display = 'block';\n};\n\n\n/**\n * Sets the opacity of the mask. Will take effect the next time the mask\n * is applied.\n * @param {number} opacity A value between 0 and 1, with 1 being\n *     totally opaque.\n */\ngoog.ui.IframeMask.prototype.setOpacity = function(opacity) {\n  this.opacity_ = opacity;\n};\n\n\n/**\n * Sets the z-index of the mask. Will take effect the next time the mask\n * is applied.\n * @param {number} zIndex A z-index value.\n */\ngoog.ui.IframeMask.prototype.setZIndex = function(zIndex) {\n  this.zIndex_ = zIndex;\n};\n\n\n/**\n * Sets the element to use as the bounds of the mask. Takes effect immediately.\n * @param {Element} snapElement The snap element, which the iframe will be\n *     \"snapped\" around.\n */\ngoog.ui.IframeMask.prototype.setSnapElement = function(snapElement) {\n  this.snapElement_ = snapElement;\n  if (this.iframe_ && goog.style.isElementShown(this.iframe_)) {\n    this.applyMask();\n  }\n};\n\n\n/**\n * Listens on the specified target, hiding and showing the iframe mask\n * when the given event types are dispatched.\n * @param {goog.events.EventTarget} target The event target to listen on.\n * @param {string} showEvent When this event fires, the mask will be applied.\n * @param {string} hideEvent When this event fires, the mask will be hidden.\n * @param {Element=} opt_snapElement When the mask is applied, it will\n *     automatically snap to this element. If no element is specified, it will\n *     use the default snap element.\n */\ngoog.ui.IframeMask.prototype.listenOnTarget = function(\n    target, showEvent, hideEvent, opt_snapElement) {\n  var timerKey;\n  this.handler_.listen(target, showEvent, function() {\n    if (opt_snapElement) {\n      this.setSnapElement(opt_snapElement);\n    }\n    // Check out the iframe asynchronously, so we don't block the SHOW\n    // event and cause a bounce.\n    timerKey = goog.Timer.callOnce(this.applyMask, 0, this);\n  });\n  this.handler_.listen(target, hideEvent, function() {\n    if (timerKey) {\n      goog.Timer.clear(timerKey);\n      timerKey = null;\n    }\n    this.hideMask();\n  });\n};\n\n\n/**\n * Removes all handlers attached by listenOnTarget.\n */\ngoog.ui.IframeMask.prototype.removeHandlers = function() {\n  this.handler_.removeAll();\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","~$goog.events.EventHandler","~$goog.Timer","^9>","~$goog.structs.Pool","^:7","~$goog.dom.iframe","^<3"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/iframemask.js"],"^:1",["^9K",["~$goog.ui.IframeMask"]],"^9<",true,"^9=",["^9>","^:7","^><","^;;","^>>","^>;","^>=","^<3"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.net.streams.base64pbstreamparser.js","^9C",["^9D","goog/net/streams/base64pbstreamparser.js"],"^9E","goog/net/streams/base64pbstreamparser.js","^9F","^9G","^9H","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The default base64-encoded Protobuf stream parser.\n *\n * A composed parser that first applies base64 stream decoding (see\n * {@link goog.net.streams.Base64StreamDecoder}) followed by Protobuf stream\n * parsing (see {@link goog.net.streams.PbStreamParser}).\n */\n\ngoog.module('goog.net.streams.Base64PbStreamParser');\n\nvar Base64StreamDecoder = goog.require('goog.net.streams.Base64StreamDecoder');\nvar PbStreamParser = goog.require('goog.net.streams.PbStreamParser');\nvar StreamParser = goog.require('goog.net.streams.StreamParser');\nvar asserts = goog.require('goog.asserts');\n\n\n/**\n * The default base64-encoded Protobuf stream parser.\n *\n * @constructor\n * @struct\n * @implements {StreamParser}\n * @final\n */\nvar Base64PbStreamParser = function() {\n  /**\n   * The current error message, if any.\n   * @private {?string}\n   */\n  this.errorMessage_ = null;\n\n  /**\n   * The current position in the streamed data.\n   * @private {number}\n   */\n  this.streamPos_ = 0;\n\n  /**\n   * Base64 stream decoder\n   * @private @const {!Base64StreamDecoder}\n   */\n  this.base64Decoder_ = new Base64StreamDecoder();\n\n  /**\n   * Protobuf raw bytes stream parser\n   * @private @const\n   */\n  this.pbParser_ = new PbStreamParser();\n};\n\n\n/** @override */\nBase64PbStreamParser.prototype.isInputValid = function() {\n  return this.errorMessage_ === null;\n};\n\n\n/** @override */\nBase64PbStreamParser.prototype.getErrorMessage = function() {\n  return this.errorMessage_;\n};\n\n\n/**\n * @param {string} input The current input string to be processed\n * @param {string} errorMsg Additional error message\n * @throws {!Error} Throws an error indicating where the stream is broken\n * @private\n */\nBase64PbStreamParser.prototype.error_ = function(input, errorMsg) {\n  this.errorMessage_ = 'The stream is broken @' + this.streamPos_ +\n      '. Error: ' + errorMsg + '. With input:\\n' + input;\n  throw new Error(this.errorMessage_);\n};\n\n\n/** @override */\nBase64PbStreamParser.prototype.parse = function(input) {\n  asserts.assertString(input);\n\n  if (this.errorMessage_ !== null) {\n    this.error_(input, 'stream already broken');\n  }\n\n  var result = null;\n  try {\n    var rawBytes = this.base64Decoder_.decode(input);\n    result = (rawBytes === null) ? null : this.pbParser_.parse(rawBytes);\n  } catch (e) {\n    this.error_(input, e.message);\n  }\n\n  this.streamPos_ += input.length;\n  return result;\n};\n\n\nexports = Base64PbStreamParser;\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.net.streams.PbStreamParser","^9>","~$goog.net.streams.StreamParser","~$goog.net.streams.Base64StreamDecoder"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/streams/base64pbstreamparser.js"],"^:1",["^9K",["~$goog.net.streams.Base64PbStreamParser"]],"^9<",true,"^9=",["^9>","^>B","^>@","^>A","^:E"]],["^ ","^9A",[1579837703000],"^9B","goog.promise.resolver.js","^9C",["^9D","goog/promise/resolver.js"],"^9E","goog/promise/resolver.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.promise.Resolver');\n\ngoog.forwardDeclare('goog.Promise');\n\n\n\n/**\n * Resolver interface for promises. The resolver is a convenience interface that\n * bundles the promise and its associated resolve and reject functions together,\n * for cases where the resolver needs to be persisted internally.\n *\n * @interface\n * @template TYPE\n */\ngoog.promise.Resolver = function() {};\n\n\n/**\n * The promise that created this resolver.\n * @type {!goog.Promise<TYPE>}\n */\ngoog.promise.Resolver.prototype.promise;\n\n\n/**\n * Resolves this resolver with the specified value.\n * @type {function((TYPE|goog.Promise<TYPE>|Thenable)=)}\n */\ngoog.promise.Resolver.prototype.resolve;\n\n\n/**\n * Rejects this resolver with the specified reason.\n * @type {function(*=): void}\n */\ngoog.promise.Resolver.prototype.reject;\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/promise/resolver.js"],"^:1",["^9K",["~$goog.promise.Resolver"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.structs.priorityqueue.js","^9C",["^9D","goog/structs/priorityqueue.js"],"^9E","goog/structs/priorityqueue.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Datastructure: Priority Queue.\n *\n *\n * This file provides the implementation of a Priority Queue. Smaller priorities\n * move to the front of the queue. If two values have the same priority,\n * it is arbitrary which value will come to the front of the queue first.\n */\n\n// TODO(user): Should this rely on natural ordering via some Comparable\n//     interface?\n\n\ngoog.provide('goog.structs.PriorityQueue');\n\ngoog.require('goog.structs.Heap');\n\n\n\n/**\n * Class for Priority Queue datastructure.\n *\n * @constructor\n * @extends {goog.structs.Heap<number, VALUE>}\n * @template VALUE\n * @final\n */\ngoog.structs.PriorityQueue = function() {\n  goog.structs.Heap.call(this);\n};\ngoog.inherits(goog.structs.PriorityQueue, goog.structs.Heap);\n\n\n/**\n * Puts the specified value in the queue.\n * @param {number} priority The priority of the value. A smaller value here\n *     means a higher priority.\n * @param {VALUE} value The value.\n */\ngoog.structs.PriorityQueue.prototype.enqueue = function(priority, value) {\n  this.insert(priority, value);\n};\n\n\n/**\n * Retrieves and removes the head of this queue.\n * @return {VALUE} The element at the head of this queue. Returns undefined if\n *     the queue is empty.\n */\ngoog.structs.PriorityQueue.prototype.dequeue = function() {\n  return this.remove();\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.structs.Heap","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/priorityqueue.js"],"^:1",["^9K",["~$goog.structs.PriorityQueue"]],"^9<",true,"^9=",["^9>","^>E"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.editor.toolbarfactory.js","^9C",["^9D","goog/ui/editor/toolbarfactory.js"],"^9E","goog/ui/editor/toolbarfactory.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Generic factory functions for creating the building blocks for\n * an editor toolbar.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.editor.ToolbarFactory');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.string');\ngoog.require('goog.string.Unicode');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Container');\ngoog.require('goog.ui.Option');\ngoog.require('goog.ui.Toolbar');\ngoog.require('goog.ui.ToolbarButton');\ngoog.require('goog.ui.ToolbarColorMenuButton');\ngoog.require('goog.ui.ToolbarMenuButton');\ngoog.require('goog.ui.ToolbarRenderer');\ngoog.require('goog.ui.ToolbarSelect');\ngoog.require('goog.userAgent');\n\n\n/**\n * Takes a font spec (e.g. \"Arial, Helvetica, sans-serif\") and returns the\n * primary font name, normalized to lowercase (e.g. \"arial\").\n * @param {string} fontSpec Font specification.\n * @return {string} The primary font name, in lowercase.\n */\ngoog.ui.editor.ToolbarFactory.getPrimaryFont = function(fontSpec) {\n  var i = fontSpec.indexOf(',');\n  var fontName = (i != -1 ? fontSpec.substring(0, i) : fontSpec).toLowerCase();\n  // Strip leading/trailing quotes from the font name (bug 1050118).\n  return goog.string.stripQuotes(fontName, '\"\\'');\n};\n\n\n/**\n * Bulk-adds fonts to the given font menu button.  The argument must be an\n * array of font descriptor objects, each of which must have the following\n * attributes:\n * <ul>\n *   <li>`caption` - Caption to show in the font menu (e.g. 'Tahoma')\n *   <li>`value` - Value for the corresponding 'font-family' CSS style\n *       (e.g. 'Tahoma, Arial, sans-serif')\n * </ul>\n * @param {!goog.ui.Select} button Font menu button.\n * @param {!Array<{caption: string, value: string}>} fonts Array of\n *     font descriptors.\n */\ngoog.ui.editor.ToolbarFactory.addFonts = function(button, fonts) {\n  goog.array.forEach(fonts, function(font) {\n    goog.ui.editor.ToolbarFactory.addFont(button, font.caption, font.value);\n  });\n};\n\n\n/**\n * Adds a menu item to the given font menu button.  The first font listed in\n * the `value` argument is considered the font ID, so adding two items\n * whose CSS style starts with the same font may lead to unpredictable results.\n * @param {!goog.ui.Select} button Font menu button.\n * @param {string} caption Caption to show for the font menu.\n * @param {string} value Value for the corresponding 'font-family' CSS style.\n */\ngoog.ui.editor.ToolbarFactory.addFont = function(button, caption, value) {\n  // The font ID is the first font listed in the CSS style, normalized to\n  // lowercase.\n  var id = goog.ui.editor.ToolbarFactory.getPrimaryFont(value);\n\n  // Construct the option, and add it to the button.\n  var option = new goog.ui.Option(caption, value, button.getDomHelper());\n  option.setId(id);\n  button.addItem(option);\n\n  // Captions are shown in their own font.\n  option.getContentElement().style.fontFamily = value;\n};\n\n\n/**\n * Bulk-adds font sizes to the given font size menu button.  The argument must\n * be an array of font size descriptor objects, each of which must have the\n * following attributes:\n * <ul>\n *   <li>`caption` - Caption to show in the font size menu (e.g. 'Huge')\n *   <li>`value` - Value for the corresponding HTML font size (e.g. 6)\n * </ul>\n * @param {!goog.ui.Select} button Font size menu button.\n * @param {!Array<{caption: string, value:number}>} sizes Array of font\n *     size descriptors.\n */\ngoog.ui.editor.ToolbarFactory.addFontSizes = function(button, sizes) {\n  goog.array.forEach(sizes, function(size) {\n    goog.ui.editor.ToolbarFactory.addFontSize(button, size.caption, size.value);\n  });\n};\n\n\n/**\n * Adds a menu item to the given font size menu button.  The `value`\n * argument must be a legacy HTML font size in the 0-7 range.\n * @param {!goog.ui.Select} button Font size menu button.\n * @param {string} caption Caption to show in the font size menu.\n * @param {number} value Value for the corresponding HTML font size.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.editor.ToolbarFactory.addFontSize = function(button, caption, value) {\n  // Construct the option, and add it to the button.\n  var option = new goog.ui.Option(caption, value, button.getDomHelper());\n  button.addItem(option);\n\n  // Adjust the font size of the menu item and the height of the checkbox\n  // element after they've been rendered by addItem().  Captions are shown in\n  // the corresponding font size, and lining up the checkbox is tricky.\n  var content = option.getContentElement();\n  content.style.fontSize =\n      goog.ui.editor.ToolbarFactory.getPxFromLegacySize(value) + 'px';\n  content.firstChild.style.height = '1.1em';\n};\n\n\n/**\n * Converts a legacy font size specification into an equivalent pixel size.\n * For example, {@code &lt;font size=\"6\"&gt;} is {@code font-size: 32px;}, etc.\n * @param {number} fontSize Legacy font size spec in the 0-7 range.\n * @return {number} Equivalent pixel size.\n */\ngoog.ui.editor.ToolbarFactory.getPxFromLegacySize = function(fontSize) {\n  return goog.ui.editor.ToolbarFactory.LEGACY_SIZE_TO_PX_MAP_[fontSize] || 10;\n};\n\n\n/**\n * Converts a pixel font size specification into an equivalent legacy size.\n * For example, {@code font-size: 32px;} is {@code &lt;font size=\"6\"&gt;}, etc.\n * If the given pixel size doesn't exactly match one of the legacy sizes, -1 is\n * returned.\n * @param {number} px Pixel font size.\n * @return {number} Equivalent legacy size spec in the 0-7 range, or -1 if none\n *     exists.\n */\ngoog.ui.editor.ToolbarFactory.getLegacySizeFromPx = function(px) {\n  // Use lastIndexOf to get the largest legacy size matching the pixel size\n  // (most notably returning 1 instead of 0 for 10px).\n  return goog.array.lastIndexOf(\n      goog.ui.editor.ToolbarFactory.LEGACY_SIZE_TO_PX_MAP_, px);\n};\n\n\n/**\n * Map of legacy font sizes (0-7) to equivalent pixel sizes.\n * @type {!Array<number>}\n * @private\n */\ngoog.ui.editor.ToolbarFactory.LEGACY_SIZE_TO_PX_MAP_ =\n    [10, 10, 13, 16, 18, 24, 32, 48];\n\n\n/**\n * Bulk-adds format options to the given \"Format block\" menu button.  The\n * argument must be an array of format option descriptor objects, each of\n * which must have the following attributes:\n * <ul>\n *   <li>`caption` - Caption to show in the menu (e.g. 'Minor heading')\n *   <li>`command` - Corresponding {@link goog.dom.TagName} (e.g.\n *       'H4')\n * </ul>\n * @param {!goog.ui.Select} button \"Format block\" menu button.\n * @param {!Array<{caption: string, command: !goog.dom.TagName}>} formats Array\n *     of format option descriptors.\n */\ngoog.ui.editor.ToolbarFactory.addFormatOptions = function(button, formats) {\n  goog.array.forEach(formats, function(format) {\n    goog.ui.editor.ToolbarFactory.addFormatOption(\n        button, format.caption, format.command);\n  });\n};\n\n\n/**\n * Adds a menu item to the given \"Format block\" menu button.\n * @param {!goog.ui.Select} button \"Format block\" menu button.\n * @param {string} caption Caption to show in the menu.\n * @param {!goog.dom.TagName} tag Corresponding block format tag.\n */\ngoog.ui.editor.ToolbarFactory.addFormatOption = function(button, caption, tag) {\n  // Construct the option, and add it to the button.\n  // TODO(attila): Create boring but functional menu item for now...\n  var buttonDom = button.getDomHelper();\n  var option = new goog.ui.Option(\n      buttonDom.createDom(goog.dom.TagName.DIV, null, caption), tag, buttonDom);\n  option.setId(String(tag));\n  button.addItem(option);\n};\n\n\n/**\n * Creates a {@link goog.ui.Toolbar} containing the specified set of\n * toolbar buttons, and renders it into the given parent element.  Each\n * item in the `items` array must a {@link goog.ui.Control}.\n * @param {!Array<goog.ui.Control>} items Toolbar items; each must\n *     be a {@link goog.ui.Control}.\n * @param {!Element} elem Toolbar parent element.\n * @param {boolean=} opt_isRightToLeft Whether the editor chrome is\n *     right-to-left; defaults to the directionality of the toolbar parent\n *     element.\n * @return {!goog.ui.Toolbar} Editor toolbar, rendered into the given parent\n *     element.\n */\ngoog.ui.editor.ToolbarFactory.makeToolbar = function(\n    items, elem, opt_isRightToLeft) {\n  var domHelper = goog.dom.getDomHelper(elem);\n\n  // Create an empty horizontal toolbar using the default renderer.\n  var toolbar = new goog.ui.Toolbar(\n      goog.ui.ToolbarRenderer.getInstance(),\n      goog.ui.Container.Orientation.HORIZONTAL, domHelper);\n\n  // Optimization:  Explicitly test for the directionality of the parent\n  // element here, so we can set it for both the toolbar and its children,\n  // saving a lot of expensive calls to goog.style.isRightToLeft() during\n  // rendering.\n  var isRightToLeft = opt_isRightToLeft || goog.style.isRightToLeft(elem);\n  toolbar.setRightToLeft(isRightToLeft);\n\n  // Optimization:  Set the toolbar to non-focusable before it is rendered,\n  // to avoid creating unnecessary keyboard event handler objects.\n  toolbar.setFocusable(false);\n\n  for (var i = 0, button; button = items[i]; i++) {\n    // Optimization:  Set the button to non-focusable before it is rendered,\n    // to avoid creating unnecessary keyboard event handler objects.  Also set\n    // the directionality of the button explicitly, to avoid expensive calls\n    // to goog.style.isRightToLeft() during rendering.\n    button.setSupportedState(goog.ui.Component.State.FOCUSED, false);\n    button.setRightToLeft(isRightToLeft);\n    toolbar.addChild(button, true);\n  }\n\n  toolbar.render(elem);\n  return toolbar;\n};\n\n\n/**\n * Creates a toolbar button with the given ID, tooltip, and caption.  Applies\n * any custom CSS class names to the button's caption element.\n * @param {string} id Button ID; must equal a {@link goog.editor.Command} for\n *     built-in buttons, anything else for custom buttons.\n * @param {string} tooltip Tooltip to be shown on hover.\n * @param {goog.ui.ControlContent} caption Button caption.\n * @param {string=} opt_classNames CSS class name(s) to apply to the caption\n *     element.\n * @param {goog.ui.ButtonRenderer=} opt_renderer Button renderer; defaults to\n *     {@link goog.ui.ToolbarButtonRenderer} if unspecified.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for DOM\n *     creation; defaults to the current document if unspecified.\n * @return {!goog.ui.Button} A toolbar button.\n */\ngoog.ui.editor.ToolbarFactory.makeButton = function(\n    id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper) {\n  var button = new goog.ui.ToolbarButton(\n      goog.ui.editor.ToolbarFactory.createContent_(\n          caption, opt_classNames, opt_domHelper),\n      opt_renderer, opt_domHelper);\n  button.setId(id);\n  button.setTooltip(tooltip);\n  return button;\n};\n\n\n/**\n * Creates a toggle button with the given ID, tooltip, and caption. Applies\n * any custom CSS class names to the button's caption element. The button\n * returned has checkbox-like toggle semantics.\n * @param {string} id Button ID; must equal a {@link goog.editor.Command} for\n *     built-in buttons, anything else for custom buttons.\n * @param {string} tooltip Tooltip to be shown on hover.\n * @param {goog.ui.ControlContent} caption Button caption.\n * @param {string=} opt_classNames CSS class name(s) to apply to the caption\n *     element.\n * @param {goog.ui.ButtonRenderer=} opt_renderer Button renderer; defaults to\n *     {@link goog.ui.ToolbarButtonRenderer} if unspecified.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for DOM\n *     creation; defaults to the current document if unspecified.\n * @return {!goog.ui.Button} A toggle button.\n */\ngoog.ui.editor.ToolbarFactory.makeToggleButton = function(\n    id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper) {\n  var button = goog.ui.editor.ToolbarFactory.makeButton(\n      id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper);\n  button.setSupportedState(goog.ui.Component.State.CHECKED, true);\n  return button;\n};\n\n\n/**\n * Creates a menu button with the given ID, tooltip, and caption. Applies\n * any custom CSS class names to the button's caption element.  The button\n * returned doesn't have an actual menu attached; use {@link\n * goog.ui.MenuButton#setMenu} to attach a {@link goog.ui.Menu} to the\n * button.\n * @param {string} id Button ID; must equal a {@link goog.editor.Command} for\n *     built-in buttons, anything else for custom buttons.\n * @param {string} tooltip Tooltip to be shown on hover.\n * @param {goog.ui.ControlContent} caption Button caption.\n * @param {string=} opt_classNames CSS class name(s) to apply to the caption\n *     element.\n * @param {goog.ui.ButtonRenderer=} opt_renderer Button renderer; defaults to\n *     {@link goog.ui.ToolbarMenuButtonRenderer} if unspecified.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for DOM\n *     creation; defaults to the current document if unspecified.\n * @return {!goog.ui.MenuButton} A menu button.\n */\ngoog.ui.editor.ToolbarFactory.makeMenuButton = function(\n    id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper) {\n  var button = new goog.ui.ToolbarMenuButton(\n      goog.ui.editor.ToolbarFactory.createContent_(\n          caption, opt_classNames, opt_domHelper),\n      null, opt_renderer, opt_domHelper);\n  button.setId(id);\n  button.setTooltip(tooltip);\n  return button;\n};\n\n\n/**\n * Creates a select button with the given ID, tooltip, and caption. Applies\n * any custom CSS class names to the button's root element.  The button\n * returned doesn't have an actual menu attached; use {@link\n * goog.ui.Select#setMenu} to attach a {@link goog.ui.Menu} containing\n * {@link goog.ui.Option}s to the select button.\n * @param {string} id Button ID; must equal a {@link goog.editor.Command} for\n *     built-in buttons, anything else for custom buttons.\n * @param {string} tooltip Tooltip to be shown on hover.\n * @param {goog.ui.ControlContent} caption Button caption; used as the\n *     default caption when nothing is selected.\n * @param {string=} opt_classNames CSS class name(s) to apply to the button's\n *     root element.\n * @param {goog.ui.MenuButtonRenderer=} opt_renderer Button renderer;\n *     defaults to {@link goog.ui.ToolbarMenuButtonRenderer} if unspecified.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for DOM\n *     creation; defaults to the current document if unspecified.\n * @return {!goog.ui.Select} A select button.\n */\ngoog.ui.editor.ToolbarFactory.makeSelectButton = function(\n    id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper) {\n  var button =\n      new goog.ui.ToolbarSelect(null, null, opt_renderer, opt_domHelper);\n  if (opt_classNames) {\n    // Unlike the other button types, for goog.ui.Select buttons we apply the\n    // extra class names to the root element, because for select buttons the\n    // caption isn't stable (as it changes each time the selection changes).\n    goog.array.forEach(\n        opt_classNames.split(/\\s+/), button.addClassName, button);\n  }\n  button.addClassName(goog.getCssName('goog-toolbar-select'));\n  button.setDefaultCaption(caption);\n  button.setId(id);\n  button.setTooltip(tooltip);\n  return button;\n};\n\n\n/**\n * Creates a color menu button with the given ID, tooltip, and caption.\n * Applies any custom CSS class names to the button's caption element.  The\n * button is created with a default color menu containing standard color\n * palettes.\n * @param {string} id Button ID; must equal a {@link goog.editor.Command} for\n *     built-in toolbar buttons, but can be anything else for custom buttons.\n * @param {string} tooltip Tooltip to be shown on hover.\n * @param {goog.ui.ControlContent} caption Button caption.\n * @param {string=} opt_classNames CSS class name(s) to apply to the caption\n *     element.\n * @param {goog.ui.ColorMenuButtonRenderer=} opt_renderer Button renderer;\n *     defaults to {@link goog.ui.ToolbarColorMenuButtonRenderer}\n *     if unspecified.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for DOM\n *     creation; defaults to the current document if unspecified.\n * @return {!goog.ui.ColorMenuButton} A color menu button.\n */\ngoog.ui.editor.ToolbarFactory.makeColorMenuButton = function(\n    id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper) {\n  var button = new goog.ui.ToolbarColorMenuButton(\n      goog.ui.editor.ToolbarFactory.createContent_(\n          caption, opt_classNames, opt_domHelper),\n      null, opt_renderer, opt_domHelper);\n  button.setId(id);\n  button.setTooltip(tooltip);\n  return button;\n};\n\n\n/**\n * Creates a new DIV that wraps a button caption, optionally applying CSS\n * class names to it.  Used as a helper function in button factory methods.\n * @param {goog.ui.ControlContent} caption Button caption.\n * @param {string=} opt_classNames CSS class name(s) to apply to the DIV that\n *     wraps the caption (if any).\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for DOM\n *     creation; defaults to the current document if unspecified.\n * @return {!Element} DIV that wraps the caption.\n * @private\n */\ngoog.ui.editor.ToolbarFactory.createContent_ = function(\n    caption, opt_classNames, opt_domHelper) {\n  // FF2 doesn't like empty DIVs, especially when rendered right-to-left.\n  if ((!caption || caption == '') && goog.userAgent.GECKO &&\n      !goog.userAgent.isVersionOrHigher('1.9a')) {\n    caption = goog.string.Unicode.NBSP;\n  }\n  return (opt_domHelper || goog.dom.getDomHelper())\n      .createDom(goog.dom.TagName.DIV, opt_classNames, caption);\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.ui.ToolbarColorMenuButton","^;;","~$goog.ui.ToolbarButton","~$goog.ui.ToolbarSelect","~$goog.ui.ToolbarMenuButton","^9L","^:=","^9>","^:S","~$goog.ui.Container","~$goog.ui.Option","^<3","~$goog.string.Unicode","^;9","~$goog.ui.Toolbar","~$goog.ui.ToolbarRenderer","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/editor/toolbarfactory.js"],"^:1",["^9K",["~$goog.ui.editor.ToolbarFactory"]],"^9<",true,"^9=",["^9>","^;9","^;;","^;=","^9L","^>M","^<3","^:=","^>K","^>L","^>N","^>H","^>G","^>J","^>O","^>I","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.popupbase.js","^9C",["^9D","goog/ui/popupbase.js"],"^9E","goog/ui/popupbase.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the PopupBase class.\n *\n */\n\ngoog.provide('goog.ui.PopupBase');\ngoog.provide('goog.ui.PopupBase.EventType');\ngoog.provide('goog.ui.PopupBase.Type');\n\ngoog.require('goog.Timer');\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.fx.Transition');\ngoog.require('goog.style');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * The PopupBase class provides functionality for showing and hiding a generic\n * container element. It also provides the option for hiding the popup element\n * if the user clicks outside the popup or the popup loses focus.\n *\n * @constructor\n * @extends {goog.events.EventTarget}\n * @param {Element=} opt_element A DOM element for the popup.\n * @param {goog.ui.PopupBase.Type=} opt_type Type of popup.\n */\ngoog.ui.PopupBase = function(opt_element, opt_type) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * An event handler to manage the events easily\n   * @type {goog.events.EventHandler<!goog.ui.PopupBase>}\n   * @private\n   */\n  this.handler_ = new goog.events.EventHandler(this);\n\n  this.setElement(opt_element || null);\n  if (opt_type) {\n    this.setType(opt_type);\n  }\n};\ngoog.inherits(goog.ui.PopupBase, goog.events.EventTarget);\ngoog.tagUnsealableClass(goog.ui.PopupBase);\n\n\n/**\n * Constants for type of Popup\n * @enum {string}\n */\ngoog.ui.PopupBase.Type = {\n  TOGGLE_DISPLAY: 'toggle_display',\n  MOVE_OFFSCREEN: 'move_offscreen'\n};\n\n\n/**\n * The popup dom element that this Popup wraps.\n * @type {?Element}\n * @private\n */\ngoog.ui.PopupBase.prototype.element_ = null;\n\n\n/**\n * Whether the Popup dismisses itself it the user clicks outside of it or the\n * popup loses focus\n * @type {boolean}\n * @private\n */\ngoog.ui.PopupBase.prototype.autoHide_ = true;\n\n\n/**\n * Mouse events without auto hide partner elements will not dismiss the popup.\n * @type {?Array<?Element>}\n * @private\n */\ngoog.ui.PopupBase.prototype.autoHidePartners_ = null;\n\n\n/**\n * Clicks outside the popup but inside this element will cause the popup to\n * hide if autoHide_ is true. If this is null, then the entire document is used.\n * For example, you can use a body-size div so that clicks on the browser\n * scrollbar do not dismiss the popup.\n * @type {?Element}\n * @private\n */\ngoog.ui.PopupBase.prototype.autoHideRegion_ = null;\n\n\n/**\n * Whether the popup is currently being shown.\n * @type {boolean}\n * @private\n */\ngoog.ui.PopupBase.prototype.isVisible_ = false;\n\n\n/**\n * Whether the popup should hide itself asynchrously. This was added because\n * there are cases where hiding the element in mouse down handler in IE can\n * cause textinputs to get into a bad state if the element that had focus is\n * hidden.\n * @type {boolean}\n * @private\n */\ngoog.ui.PopupBase.prototype.shouldHideAsync_ = false;\n\n\n/**\n * The time when the popup was last shown.\n * @type {number}\n * @private\n */\ngoog.ui.PopupBase.prototype.lastShowTime_ = -1;\n\n\n/**\n * The time when the popup was last hidden.\n * @type {number}\n * @private\n */\ngoog.ui.PopupBase.prototype.lastHideTime_ = -1;\n\n\n/**\n * Whether to hide when the escape key is pressed.\n * @type {boolean}\n * @private\n */\ngoog.ui.PopupBase.prototype.hideOnEscape_ = false;\n\n\n/**\n * Whether to enable cross-iframe dismissal.\n * @type {boolean}\n * @private\n */\ngoog.ui.PopupBase.prototype.enableCrossIframeDismissal_ = true;\n\n\n/**\n * The type of popup\n * @type {goog.ui.PopupBase.Type}\n * @private\n */\ngoog.ui.PopupBase.prototype.type_ = goog.ui.PopupBase.Type.TOGGLE_DISPLAY;\n\n\n/**\n * Transition to play on showing the popup.\n * @type {goog.fx.Transition|undefined}\n * @private\n */\ngoog.ui.PopupBase.prototype.showTransition_;\n\n\n/**\n * Transition to play on hiding the popup.\n * @type {goog.fx.Transition|undefined}\n * @private\n */\ngoog.ui.PopupBase.prototype.hideTransition_;\n\n\n/**\n * Constants for event type fired by Popup\n *\n * @enum {string}\n */\ngoog.ui.PopupBase.EventType = {\n  BEFORE_SHOW: 'beforeshow',\n  SHOW: 'show',\n  BEFORE_HIDE: 'beforehide',\n  HIDE: 'hide'\n};\n\n\n/**\n * A time in ms used to debounce events that happen right after each other.\n *\n * A note about why this is necessary. There are two cases to consider.\n * First case, a popup will usually see a focus event right after it's launched\n * because it's typical for it to be launched in a mouse-down event which will\n * then move focus to the launching button. We don't want to think this is a\n * separate user action moving focus. Second case, a user clicks on the\n * launcher button to close the menu. In that case, we'll close the menu in the\n * focus event and then show it again because of the mouse down event, even\n * though the intention is to just close the menu. This workaround appears to\n * be the least intrusive fix.\n *\n * @type {number}\n */\ngoog.ui.PopupBase.DEBOUNCE_DELAY_MS = 150;\n\n\n/**\n * @return {goog.ui.PopupBase.Type} The type of popup this is.\n */\ngoog.ui.PopupBase.prototype.getType = function() {\n  return this.type_;\n};\n\n\n/**\n * Specifies the type of popup to use.\n *\n * @param {goog.ui.PopupBase.Type} type Type of popup.\n */\ngoog.ui.PopupBase.prototype.setType = function(type) {\n  this.type_ = type;\n};\n\n\n/**\n * Returns whether the popup should hide itself asynchronously using a timeout\n * instead of synchronously.\n * @return {boolean} Whether to hide async.\n */\ngoog.ui.PopupBase.prototype.shouldHideAsync = function() {\n  return this.shouldHideAsync_;\n};\n\n\n/**\n * Sets whether the popup should hide itself asynchronously using a timeout\n * instead of synchronously.\n * @param {boolean} b Whether to hide async.\n */\ngoog.ui.PopupBase.prototype.setShouldHideAsync = function(b) {\n  this.shouldHideAsync_ = b;\n};\n\n\n/**\n * Returns the dom element that should be used for the popup.\n *\n * @return {Element} The popup element.\n */\ngoog.ui.PopupBase.prototype.getElement = function() {\n  return this.element_;\n};\n\n\n/**\n * Specifies the dom element that should be used for the popup.\n *\n * @param {Element} elt A DOM element for the popup.\n */\ngoog.ui.PopupBase.prototype.setElement = function(elt) {\n  this.ensureNotVisible_();\n  this.element_ = elt;\n};\n\n\n/**\n * Returns whether the Popup dismisses itself when the user clicks outside of\n * it.\n * @return {boolean} Whether the Popup autohides on an external click.\n */\ngoog.ui.PopupBase.prototype.getAutoHide = function() {\n  return this.autoHide_;\n};\n\n\n/**\n * Sets whether the Popup dismisses itself when the user clicks outside of it.\n * @param {boolean} autoHide Whether to autohide on an external click.\n */\ngoog.ui.PopupBase.prototype.setAutoHide = function(autoHide) {\n  this.ensureNotVisible_();\n  this.autoHide_ = autoHide;\n};\n\n\n/**\n * Mouse events that occur within an autoHide partner will not hide a popup\n * set to autoHide.\n * @param {!Element} partner The auto hide partner element.\n */\ngoog.ui.PopupBase.prototype.addAutoHidePartner = function(partner) {\n  if (!this.autoHidePartners_) {\n    this.autoHidePartners_ = [];\n  }\n\n  goog.array.insert(this.autoHidePartners_, partner);\n};\n\n\n/**\n * Removes a previously registered auto hide partner.\n * @param {!Element} partner The auto hide partner element.\n */\ngoog.ui.PopupBase.prototype.removeAutoHidePartner = function(partner) {\n  if (this.autoHidePartners_) {\n    goog.array.remove(this.autoHidePartners_, partner);\n  }\n};\n\n\n/**\n * @return {boolean} Whether the Popup autohides on the escape key.\n */\ngoog.ui.PopupBase.prototype.getHideOnEscape = function() {\n  return this.hideOnEscape_;\n};\n\n\n/**\n * Sets whether the Popup dismisses itself on the escape key.\n * @param {boolean} hideOnEscape Whether to autohide on the escape key.\n */\ngoog.ui.PopupBase.prototype.setHideOnEscape = function(hideOnEscape) {\n  this.ensureNotVisible_();\n  this.hideOnEscape_ = hideOnEscape;\n};\n\n\n/**\n * @return {boolean} Whether cross iframe dismissal is enabled.\n */\ngoog.ui.PopupBase.prototype.getEnableCrossIframeDismissal = function() {\n  return this.enableCrossIframeDismissal_;\n};\n\n\n/**\n * Sets whether clicks in other iframes should dismiss this popup.  In some\n * cases it should be disabled, because it can cause spurious\n * @param {boolean} enable Whether to enable cross iframe dismissal.\n */\ngoog.ui.PopupBase.prototype.setEnableCrossIframeDismissal = function(enable) {\n  this.enableCrossIframeDismissal_ = enable;\n};\n\n\n/**\n * Returns the region inside which the Popup dismisses itself when the user\n * clicks, or null if it's the entire document.\n * @return {Element} The DOM element for autohide, or null if it hasn't been\n *     set.\n */\ngoog.ui.PopupBase.prototype.getAutoHideRegion = function() {\n  return this.autoHideRegion_;\n};\n\n\n/**\n * Sets the region inside which the Popup dismisses itself when the user\n * clicks.\n * @param {Element} element The DOM element for autohide.\n */\ngoog.ui.PopupBase.prototype.setAutoHideRegion = function(element) {\n  this.autoHideRegion_ = element;\n};\n\n\n/**\n * Sets transition animation on showing and hiding the popup.\n * @param {goog.fx.Transition=} opt_showTransition Transition to play on\n *     showing the popup.\n * @param {goog.fx.Transition=} opt_hideTransition Transition to play on\n *     hiding the popup.\n */\ngoog.ui.PopupBase.prototype.setTransition = function(\n    opt_showTransition, opt_hideTransition) {\n  this.showTransition_ = opt_showTransition;\n  this.hideTransition_ = opt_hideTransition;\n};\n\n\n/**\n * Returns the time when the popup was last shown.\n *\n * @return {number} time in ms since epoch when the popup was last shown, or\n * -1 if the popup was never shown.\n */\ngoog.ui.PopupBase.prototype.getLastShowTime = function() {\n  return this.lastShowTime_;\n};\n\n\n/**\n * Returns the time when the popup was last hidden.\n *\n * @return {number} time in ms since epoch when the popup was last hidden, or\n * -1 if the popup was never hidden or is currently showing.\n */\ngoog.ui.PopupBase.prototype.getLastHideTime = function() {\n  return this.lastHideTime_;\n};\n\n\n/**\n * Returns the event handler for the popup. All event listeners belonging to\n * this handler are removed when the tooltip is hidden. Therefore,\n * the recommended usage of this handler is to listen on events in\n * {@link #onShow}.\n * @return {goog.events.EventHandler<T>} Event handler for this popup.\n * @protected\n * @this {T}\n * @template T\n */\ngoog.ui.PopupBase.prototype.getHandler = function() {\n  // As the template type is unbounded, narrow the \"this\" type\n  var self = /** @type {!goog.ui.PopupBase} */ (this);\n\n  return self.handler_;\n};\n\n\n/**\n * Helper to throw exception if the popup is showing.\n * @private\n */\ngoog.ui.PopupBase.prototype.ensureNotVisible_ = function() {\n  if (this.isVisible_) {\n    throw new Error('Can not change this state of the popup while showing.');\n  }\n};\n\n\n/**\n * Returns whether the popup is currently visible.\n *\n * @return {boolean} whether the popup is currently visible.\n */\ngoog.ui.PopupBase.prototype.isVisible = function() {\n  return this.isVisible_;\n};\n\n\n/**\n * Returns whether the popup is currently visible or was visible within about\n * 150 ms ago. This is used by clients to handle a very specific, but common,\n * popup scenario. The button that launches the popup should close the popup\n * on mouse down if the popup is alrady open. The problem is that the popup\n * closes itself during the capture phase of the mouse down and thus the button\n * thinks it's hidden and this should show it again. This method provides a\n * good heuristic for clients. Typically in their event handler they will have\n * code that is:\n *\n * if (menu.isOrWasRecentlyVisible()) {\n *   menu.setVisible(false);\n * } else {\n *   ... // code to position menu and initialize other state\n *   menu.setVisible(true);\n * }\n * @return {boolean} Whether the popup is currently visible or was visible\n *     within about 150 ms ago.\n */\ngoog.ui.PopupBase.prototype.isOrWasRecentlyVisible = function() {\n  return this.isVisible_ ||\n      (goog.now() - this.lastHideTime_ < goog.ui.PopupBase.DEBOUNCE_DELAY_MS);\n};\n\n\n/**\n * Sets whether the popup should be visible. After this method\n * returns, isVisible() will always return the new state, even if\n * there is a transition.\n *\n * @param {boolean} visible Desired visibility state.\n */\ngoog.ui.PopupBase.prototype.setVisible = function(visible) {\n  // Make sure that any currently running transition is stopped.\n  if (this.showTransition_) this.showTransition_.stop();\n  if (this.hideTransition_) this.hideTransition_.stop();\n\n  if (visible) {\n    this.show_();\n  } else {\n    this.hide_();\n  }\n};\n\n\n/**\n * Repositions the popup according to the current state.\n * Should be overriden by subclases.\n */\ngoog.ui.PopupBase.prototype.reposition = goog.nullFunction;\n\n\n/**\n * Does the work to show the popup.\n * @private\n */\ngoog.ui.PopupBase.prototype.show_ = function() {\n  // Ignore call if we are already showing.\n  if (this.isVisible_) {\n    return;\n  }\n\n  // Give derived classes and handlers a chance to customize popup.\n  if (!this.onBeforeShow()) {\n    return;\n  }\n\n  // Allow callers to set the element in the BEFORE_SHOW event.\n  if (!this.element_) {\n    throw new Error(\n        'Caller must call setElement before trying to show the popup');\n  }\n\n  // Call reposition after onBeforeShow, as it may change the style and/or\n  // content of the popup and thereby affecting the size which is used for the\n  // viewport calculation.\n  this.reposition();\n\n  var doc = goog.dom.getOwnerDocument(this.element_);\n\n  if (this.hideOnEscape_) {\n    // Handle the escape keys.  Listen in the capture phase so that we can\n    // stop the escape key from propagating to other elements.  For example,\n    // if there is a popup within a dialog box, we want the popup to be\n    // dismissed first, rather than the dialog.\n    this.handler_.listen(\n        doc, goog.events.EventType.KEYDOWN, this.onDocumentKeyDown_, true);\n  }\n\n  // Set up event handlers.\n  if (this.autoHide_) {\n    // Even if the popup is not in the focused document, we want to\n    // close it on mousedowns in the document it's in.\n    this.handler_.listen(\n        doc, goog.events.EventType.MOUSEDOWN, this.onDocumentMouseDown_, true);\n\n    if (goog.userAgent.IE) {\n      // We want to know about deactivates/mousedowns on the document with focus\n      // The top-level document won't get a deactivate event if the focus is\n      // in an iframe and the deactivate fires within that iframe.\n      // The active element in the top-level document will remain the iframe\n      // itself.\n      var activeElement;\n\n      try {\n        activeElement = doc.activeElement;\n      } catch (e) {\n        // There is an IE browser bug which can cause just the reading of\n        // document.activeElement to throw an Unspecified Error.  This\n        // may have to do with loading a popup within a hidden iframe.\n      }\n      while (activeElement &&\n             activeElement.nodeName == goog.dom.TagName.IFRAME) {\n\n        try {\n          var tempDoc = goog.dom.getFrameContentDocument(activeElement);\n        } catch (e) {\n          // The frame is on a different domain that its parent document\n          // This way, we grab the lowest-level document object we can get\n          // a handle on given cross-domain security.\n          break;\n        }\n        doc = tempDoc;\n        activeElement = doc.activeElement;\n      }\n\n      // Handle mousedowns in the focused document in case the user clicks\n      // on the activeElement (in which case the popup should hide).\n      this.handler_.listen(\n          doc, goog.events.EventType.MOUSEDOWN, this.onDocumentMouseDown_,\n          true);\n\n      // If the active element inside the focused document changes, then\n      // we probably need to hide the popup.\n      this.handler_.listen(\n          doc, goog.events.EventType.DEACTIVATE, this.onDocumentBlur_);\n\n    } else {\n      this.handler_.listen(\n          doc, goog.events.EventType.BLUR, this.onDocumentBlur_);\n    }\n  }\n\n  // Make the popup visible.\n  if (this.type_ == goog.ui.PopupBase.Type.TOGGLE_DISPLAY) {\n    this.showPopupElement();\n  } else if (this.type_ == goog.ui.PopupBase.Type.MOVE_OFFSCREEN) {\n    this.reposition();\n  }\n  this.isVisible_ = true;\n\n  this.lastShowTime_ = goog.now();\n  this.lastHideTime_ = -1;\n\n  // If there is transition to play, we play it and fire SHOW event after\n  // the transition is over.\n  if (this.showTransition_) {\n    goog.events.listenOnce(\n        /** @type {!goog.events.EventTarget} */ (this.showTransition_),\n        goog.fx.Transition.EventType.END, this.onShow, false, this);\n    this.showTransition_.play();\n  } else {\n    // Notify derived classes and handlers.\n    this.onShow();\n  }\n};\n\n\n/**\n * Hides the popup. This call is idempotent.\n *\n * @param {?Node=} opt_target Target of the event causing the hide.\n * @return {boolean} Whether the popup was hidden and not cancelled.\n * @private\n */\ngoog.ui.PopupBase.prototype.hide_ = function(opt_target) {\n  // Give derived classes and handlers a chance to cancel hiding.\n  if (!this.isVisible_ || !this.onBeforeHide(opt_target)) {\n    return false;\n  }\n\n  // Remove any listeners we attached when showing the popup.\n  if (this.handler_) {\n    this.handler_.removeAll();\n  }\n\n  // Set visibility to hidden even if there is a transition.\n  this.isVisible_ = false;\n  this.lastHideTime_ = goog.now();\n\n  // If there is transition to play, we play it and only hide the element\n  // (and fire HIDE event) after the transition is over.\n  if (this.hideTransition_) {\n    goog.events.listenOnce(\n        /** @type {!goog.events.EventTarget} */ (this.hideTransition_),\n        goog.fx.Transition.EventType.END,\n        goog.partial(this.continueHidingPopup_, opt_target), false, this);\n    this.hideTransition_.play();\n  } else {\n    this.continueHidingPopup_(opt_target);\n  }\n\n  return true;\n};\n\n\n/**\n * Continues hiding the popup. This is a continuation from hide_. It is\n * a separate method so that we can add a transition before hiding.\n * @param {?Node=} opt_target Target of the event causing the hide.\n * @private\n */\ngoog.ui.PopupBase.prototype.continueHidingPopup_ = function(opt_target) {\n  // Hide the popup.\n  if (this.type_ == goog.ui.PopupBase.Type.TOGGLE_DISPLAY) {\n    if (this.shouldHideAsync_) {\n      goog.Timer.callOnce(this.hidePopupElement, 0, this);\n    } else {\n      this.hidePopupElement();\n    }\n  } else if (this.type_ == goog.ui.PopupBase.Type.MOVE_OFFSCREEN) {\n    this.moveOffscreen_();\n  }\n\n  // Notify derived classes and handlers.\n  this.onHide(opt_target);\n};\n\n\n/**\n * Shows the popup element.\n * @protected\n */\ngoog.ui.PopupBase.prototype.showPopupElement = function() {\n  this.element_.style.visibility = 'visible';\n  goog.style.setElementShown(this.element_, true);\n};\n\n\n/**\n * Hides the popup element.\n * @protected\n */\ngoog.ui.PopupBase.prototype.hidePopupElement = function() {\n  this.element_.style.visibility = 'hidden';\n  goog.style.setElementShown(this.element_, false);\n};\n\n\n/**\n * Hides the popup by moving it offscreen.\n *\n * @private\n */\ngoog.ui.PopupBase.prototype.moveOffscreen_ = function() {\n  this.element_.style.top = '-10000px';\n};\n\n\n/**\n * Called before the popup is shown. Derived classes can override to hook this\n * event but should make sure to call the parent class method.\n *\n * @return {boolean} If anyone called preventDefault on the event object (or\n *     if any of the handlers returns false this will also return false.\n * @protected\n */\ngoog.ui.PopupBase.prototype.onBeforeShow = function() {\n  return this.dispatchEvent(goog.ui.PopupBase.EventType.BEFORE_SHOW);\n};\n\n\n/**\n * Called after the popup is shown. Derived classes can override to hook this\n * event but should make sure to call the parent class method.\n * @protected\n */\ngoog.ui.PopupBase.prototype.onShow = function() {\n  this.dispatchEvent(goog.ui.PopupBase.EventType.SHOW);\n};\n\n\n/**\n * Called before the popup is hidden. Derived classes can override to hook this\n * event but should make sure to call the parent class method.\n *\n * @param {?Node=} opt_target Target of the event causing the hide.\n * @return {boolean} If anyone called preventDefault on the event object (or\n *     if any of the handlers returns false this will also return false.\n * @protected\n */\ngoog.ui.PopupBase.prototype.onBeforeHide = function(opt_target) {\n  return this.dispatchEvent(\n      {type: goog.ui.PopupBase.EventType.BEFORE_HIDE, target: opt_target});\n};\n\n\n/**\n * Called after the popup is hidden. Derived classes can override to hook this\n * event but should make sure to call the parent class method.\n * @param {?Node=} opt_target Target of the event causing the hide.\n * @protected\n */\ngoog.ui.PopupBase.prototype.onHide = function(opt_target) {\n  this.dispatchEvent(\n      {type: goog.ui.PopupBase.EventType.HIDE, target: opt_target});\n};\n\n\n/**\n * Mouse down handler for the document on capture phase. Used to hide the\n * popup for auto-hide mode.\n *\n * @param {goog.events.BrowserEvent} e The event object.\n * @private\n */\ngoog.ui.PopupBase.prototype.onDocumentMouseDown_ = function(e) {\n  var target = e.target;\n\n  if (!goog.dom.contains(this.element_, target) &&\n      !this.isOrWithinAutoHidePartner_(target) &&\n      this.isWithinAutoHideRegion_(target) && !this.shouldDebounce_()) {\n    // Mouse click was outside popup and partners, so hide.\n    this.hide_(target);\n  }\n};\n\n\n/**\n * Handles key-downs on the document to handle the escape key.\n *\n * @param {goog.events.BrowserEvent} e The event object.\n * @private\n */\ngoog.ui.PopupBase.prototype.onDocumentKeyDown_ = function(e) {\n  if (e.keyCode == goog.events.KeyCodes.ESC) {\n    if (this.hide_(e.target)) {\n      // Eat the escape key, but only if this popup was actually closed.\n      e.preventDefault();\n      e.stopPropagation();\n    }\n  }\n};\n\n\n/**\n * Deactivate handler(IE) and blur handler (other browsers) for document.\n * Used to hide the popup for auto-hide mode.\n *\n * @param {goog.events.BrowserEvent} e The event object.\n * @private\n */\ngoog.ui.PopupBase.prototype.onDocumentBlur_ = function(e) {\n  if (!this.enableCrossIframeDismissal_) {\n    return;\n  }\n\n  var doc = goog.dom.getOwnerDocument(this.element_);\n\n  // Ignore blur events if the active element is still inside the popup or if\n  // there is no longer an active element.  For example, a widget like a\n  // goog.ui.Button might programatically blur itself before losing tabIndex.\n  if (typeof document.activeElement != 'undefined') {\n    var activeElement = doc.activeElement;\n    if (!activeElement || goog.dom.contains(this.element_, activeElement) ||\n        activeElement.tagName == goog.dom.TagName.BODY) {\n      return;\n    }\n\n    // Ignore blur events not for the document itself in non-IE browsers.\n  } else if (e.target != doc) {\n    return;\n  }\n\n  // Debounce the initial focus move.\n  if (this.shouldDebounce_()) {\n    return;\n  }\n\n  this.hide_();\n};\n\n\n/**\n * @param {Node} element The element to inspect.\n * @return {boolean} Returns true if the given element is one of the auto hide\n *     partners or is a child of an auto hide partner.\n * @private\n */\ngoog.ui.PopupBase.prototype.isOrWithinAutoHidePartner_ = function(element) {\n  return goog.array.some(this.autoHidePartners_ || [], function(partner) {\n    return element === partner || goog.dom.contains(partner, element);\n  });\n};\n\n\n/**\n * @param {Node} element The element to inspect.\n * @return {boolean} Returns true if the element is contained within\n *     the autohide region. If unset, the autohide region is the entire\n *     entire document.\n * @private\n */\ngoog.ui.PopupBase.prototype.isWithinAutoHideRegion_ = function(element) {\n  return this.autoHideRegion_ ?\n      goog.dom.contains(this.autoHideRegion_, element) :\n      true;\n};\n\n\n/**\n * @return {boolean} Whether the time since last show is less than the debounce\n *     delay.\n * @private\n */\ngoog.ui.PopupBase.prototype.shouldDebounce_ = function() {\n  return goog.now() - this.lastShowTime_ < goog.ui.PopupBase.DEBOUNCE_DELAY_MS;\n};\n\n\n/** @override */\ngoog.ui.PopupBase.prototype.disposeInternal = function() {\n  goog.ui.PopupBase.base(this, 'disposeInternal');\n  this.handler_.dispose();\n  goog.dispose(this.showTransition_);\n  goog.dispose(this.hideTransition_);\n  delete this.element_;\n  delete this.handler_;\n  delete this.autoHidePartners_;\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","^>;","^><","^9>","^:L","^:S","^:I","~$goog.fx.Transition","^<3","~$goog.events.KeyCodes","^;9","^:N","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/popupbase.js"],"^:1",["^9K",["^<=","~$goog.ui.PopupBase.Type","~$goog.ui.PopupBase.EventType"]],"^9<",true,"^9=",["^9>","^><","^;9","^;;","^;=","^:N","^>;","^:L","^:I","^>R","^>Q","^<3","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.pattern.sequence.js","^9C",["^9D","goog/dom/pattern/sequence.js"],"^9E","goog/dom/pattern/sequence.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview DOM pattern to match a sequence of other patterns.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.pattern.Sequence');\n\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.pattern');\ngoog.require('goog.dom.pattern.AbstractPattern');\ngoog.require('goog.dom.pattern.MatchType');\n\n\n\n/**\n * Pattern object that matches a sequence of other patterns.\n *\n * @param {Array<goog.dom.pattern.AbstractPattern>} patterns Ordered array of\n *     patterns to match.\n * @param {boolean=} opt_ignoreWhitespace Optional flag to ignore text nodes\n *     consisting entirely of whitespace.  The default is to not ignore them.\n * @constructor\n * @extends {goog.dom.pattern.AbstractPattern}\n * @final\n */\ngoog.dom.pattern.Sequence = function(patterns, opt_ignoreWhitespace) {\n  /**\n   * Ordered array of patterns to match.\n   *\n   * @type {Array<goog.dom.pattern.AbstractPattern>}\n   */\n  this.patterns = patterns;\n\n  /**\n   * Whether or not to ignore whitespace only Text nodes.\n   *\n   * @private {boolean}\n   */\n  this.ignoreWhitespace_ = !!opt_ignoreWhitespace;\n\n  /**\n   * Position in the patterns array we have reached by successful matches.\n   *\n   * @private {number}\n   */\n  this.currentPosition_ = 0;\n};\ngoog.inherits(goog.dom.pattern.Sequence, goog.dom.pattern.AbstractPattern);\n\n\n/**\n * Regular expression for breaking text nodes.\n * @private {!RegExp}\n */\ngoog.dom.pattern.Sequence.BREAKING_TEXTNODE_RE_ = /^\\s*$/;\n\n\n/**\n * Test whether the given token starts, continues, or finishes the sequence\n * of patterns given in the constructor.\n *\n * @param {Node} token Token to match against.\n * @param {goog.dom.TagWalkType} type The type of token.\n * @return {goog.dom.pattern.MatchType} <code>MATCH</code> if the pattern\n *     matches, <code>MATCHING</code> if the pattern starts a match, and\n *     <code>NO_MATCH</code> if the pattern does not match.\n * @override\n */\ngoog.dom.pattern.Sequence.prototype.matchToken = function(token, type) {\n  // If the option is set, ignore any whitespace only text nodes\n  if (this.ignoreWhitespace_ && token.nodeType == goog.dom.NodeType.TEXT &&\n      goog.dom.pattern.Sequence.BREAKING_TEXTNODE_RE_.test(token.nodeValue)) {\n    return goog.dom.pattern.MatchType.MATCHING;\n  }\n\n  switch (this.patterns[this.currentPosition_].matchToken(token, type)) {\n    case goog.dom.pattern.MatchType.MATCH:\n      // Record the first token we match.\n      if (this.currentPosition_ == 0) {\n        this.matchedNode = token;\n      }\n\n      // Move forward one position.\n      this.currentPosition_++;\n\n      // Check if this is the last position.\n      if (this.currentPosition_ == this.patterns.length) {\n        this.reset();\n        return goog.dom.pattern.MatchType.MATCH;\n      } else {\n        return goog.dom.pattern.MatchType.MATCHING;\n      }\n\n    case goog.dom.pattern.MatchType.MATCHING:\n      // This can happen when our child pattern is a sequence or a repetition.\n      return goog.dom.pattern.MatchType.MATCHING;\n\n    case goog.dom.pattern.MatchType.BACKTRACK_MATCH:\n      // This means a repetitive match succeeded 1 token ago.\n      // TODO(robbyw): Backtrack further if necessary.\n      this.currentPosition_++;\n\n      if (this.currentPosition_ == this.patterns.length) {\n        this.reset();\n        return goog.dom.pattern.MatchType.BACKTRACK_MATCH;\n      } else {\n        // Retry the same token on the next pattern.\n        return this.matchToken(token, type);\n      }\n\n    default:\n      this.reset();\n      return goog.dom.pattern.MatchType.NO_MATCH;\n  }\n};\n\n\n/**\n * Reset any internal state this pattern keeps.\n * @override\n */\ngoog.dom.pattern.Sequence.prototype.reset = function() {\n  if (this.patterns[this.currentPosition_]) {\n    this.patterns[this.currentPosition_].reset();\n  }\n  this.currentPosition_ = 0;\n};\n","^9I",1579837703000,"^9J",["^9K",["^==","^=B","^9>","^=>","^=?"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/sequence.js"],"^:1",["^9K",["~$goog.dom.pattern.Sequence"]],"^9<",true,"^9=",["^9>","^=B","^=>","^==","^=?"]],["^ ","^9A",[1579837703000],"^9B","goog.net.testdata.jsloader_test2.js","^9C",["^9D","goog/net/testdata/jsloader_test2.js"],"^9E","goog/net/testdata/jsloader_test2.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved\n\n/**\n * @fileoverview Test #2 of jsloader.\n */\n\ngoog.provide('goog.net.testdata.jsloader_test2');\ngoog.setTestOnly('jsloader_test2');\n\nwindow['closure_verification']['test2'] = 'Test #2 loaded';\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/testdata/jsloader_test2.js"],"^:1",["^9K",["~$goog.net.testdata.jsloader_test2","~$goog.net.testdata.jsloader-test2"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.testing.assertionfailure.js","^9C",["^9D","goog/testing/assertionfailure.js"],"^9E","goog/testing/assertionfailure.js","^9F","^9G","^9H","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * Utilities intended for testing assertion functions.\n */\n\ngoog.module('goog.testing.safe.assertionFailure');\ngoog.setTestOnly();\n\nconst asserts = goog.require('goog.asserts');\nconst testingAsserts = goog.require('goog.testing.asserts');\n\n/**\n * Tests that f raises exactaly one AssertionError and runs f while disabling\n * assertion errors. This is only intended to use in a few test files that is\n * guaranteed that will not affect anything for convenience. It is not intended\n * for broader consumption outside of those test files. We do not want to\n * encourage this pattern.\n *\n * @param {function():*} f function with a failing assertion.\n * @param {string=} opt_message error message the expected error should contain\n * @param {number=} opt_number of time the assertion should throw. Default is 1.\n * @return {*} the return value of f.\n */\nexports.withAssertionFailure = function(f, opt_message, opt_number) {\n  try {\n    if (!opt_number) {\n      opt_number = 1;\n    }\n    var assertions = 0;\n    asserts.setErrorHandler(function(e) {\n      asserts.assertInstanceof(\n          e, asserts.AssertionError, 'A none assertion failure is thrown');\n      if (opt_message) {\n        testingAsserts.assertContains(opt_message, e.message);\n      }\n      assertions += 1;\n    });\n    var result = f();\n    asserts.assert(\n        assertions == opt_number, '%d assertion failed.', assertions);\n    return result;\n  } finally {\n    asserts.setErrorHandler(asserts.DEFAULT_ERROR_HANDLER);\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.testing.asserts","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/assertionfailure.js"],"^:1",["^9K",["~$goog.testing.safe.assertionFailure"]],"^9<",true,"^9=",["^9>","^:E","^>X"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.ac.cachingmatcher.js","^9C",["^9D","goog/ui/ac/cachingmatcher.js"],"^9E","goog/ui/ac/cachingmatcher.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Matcher which maintains a client-side cache on top of some\n * other matcher.\n * @author reinerp@google.com (Reiner Pope)\n */\n\n\ngoog.provide('goog.ui.ac.CachingMatcher');\n\ngoog.require('goog.array');\ngoog.require('goog.async.Throttle');\ngoog.require('goog.ui.ac.ArrayMatcher');\ngoog.require('goog.ui.ac.RenderOptions');\n\n\n\n/**\n * A matcher which wraps another (typically slow) matcher and\n * keeps a client-side cache of the results. For instance, you can use this to\n * wrap a RemoteArrayMatcher to hide the latency of the underlying matcher\n * having to make ajax request.\n *\n * Objects in the cache are deduped on their stringified forms.\n *\n * Note - when the user types a character, they will instantly get a set of\n * local results, and then some time later, the results from the server will\n * show up.\n *\n * @constructor\n * @param {!Object} baseMatcher The underlying matcher to use. Must implement\n *     requestMatchingRows.\n * @final\n */\ngoog.ui.ac.CachingMatcher = function(baseMatcher) {\n  /** @private {!Array<!Object>}} The cache. */\n  this.rows_ = [];\n\n  /**\n   * Set of stringified rows, for fast deduping. Each element of this.rows_\n   * is stored in rowStrings_ as (' ' + row) to ensure we avoid builtin\n   * properties like 'toString'.\n   * @private {Object<string, boolean>}\n   */\n  this.rowStrings_ = {};\n\n  /**\n   * Maximum number of rows in the cache. If the cache grows larger than this,\n   * the entire cache will be emptied.\n   * @private {number}\n   */\n  this.maxCacheSize_ = 1000;\n\n  /** @private {!Object} The underlying matcher to use. */\n  this.baseMatcher_ = baseMatcher;\n\n  /**\n   * Local matching function.\n   * @private {function(string, number, !Array<!Object>): !Array<!Object>}\n   */\n  this.getMatchesForRows_ = goog.ui.ac.ArrayMatcher.getMatchesForRows;\n\n  /** @private {number} Number of matches to request from the base matcher. */\n  this.baseMatcherMaxMatches_ = 100;\n\n  /** @private {goog.async.Throttle} */\n  this.throttledTriggerBaseMatch_ =\n      new goog.async.Throttle(this.triggerBaseMatch_, 150, this);\n\n  /** @private {string} */\n  this.mostRecentToken_ = '';\n\n  /** @private {?Function} */\n  this.mostRecentMatchHandler_ = null;\n\n  /** @private {number} */\n  this.mostRecentMaxMatches_ = 10;\n\n  /**\n   * The set of rows which we last displayed.\n   *\n   * NOTE(reinerp): The need for this is subtle. When a server result comes\n   * back, we don't want to suddenly change the list of results without the user\n   * doing anything. So we make sure to add the new server results to the end of\n   * the currently displayed list.\n   *\n   * We need to keep track of the last rows we displayed, because the \"similar\n   * matcher\" we use locally might otherwise reorder results.\n   *\n   * @private {Array<!Object>}\n   */\n  this.mostRecentMatches_ = [];\n};\n\n\n/**\n * Sets the number of milliseconds with which to throttle the match requests\n * on the underlying matcher.\n *\n * Default value: 150.\n *\n * @param {number} throttleTime .\n */\ngoog.ui.ac.CachingMatcher.prototype.setThrottleTime = function(throttleTime) {\n  this.throttledTriggerBaseMatch_ =\n      new goog.async.Throttle(this.triggerBaseMatch_, throttleTime, this);\n};\n\n\n/**\n * Sets the maxMatches to use for the base matcher. If the base matcher makes\n * AJAX requests, it may help to make this a large number so that the local\n * cache gets populated quickly.\n *\n * Default value: 100.\n *\n * @param {number} maxMatches The value to set.\n */\ngoog.ui.ac.CachingMatcher.prototype.setBaseMatcherMaxMatches = function(\n    maxMatches) {\n  this.baseMatcherMaxMatches_ = maxMatches;\n};\n\n\n/**\n * Sets the maximum size of the local cache. If the local cache grows larger\n * than this size, it will be emptied.\n *\n * Default value: 1000.\n *\n * @param {number} maxCacheSize .\n */\ngoog.ui.ac.CachingMatcher.prototype.setMaxCacheSize = function(maxCacheSize) {\n  this.maxCacheSize_ = maxCacheSize;\n};\n\n\n/**\n * Sets the local matcher to use.\n *\n * The local matcher should be a function with the same signature as\n * {@link goog.ui.ac.ArrayMatcher.getMatchesForRows}, i.e. its arguments are\n * searchToken, maxMatches, rowsToSearch; and it returns a list of matching\n * rows.\n *\n * Default value: {@link goog.ui.ac.ArrayMatcher.getMatchesForRows}.\n *\n * @param {function(string, number, !Array<!Object>): !Array<!Object>}\n *     localMatcher\n */\ngoog.ui.ac.CachingMatcher.prototype.setLocalMatcher = function(localMatcher) {\n  this.getMatchesForRows_ = localMatcher;\n};\n\n\n/**\n * Function used to pass matches to the autocomplete.\n * @param {string} token Token to match.\n * @param {number} maxMatches Max number of matches to return.\n * @param {Function} matchHandler callback to execute after matching.\n */\ngoog.ui.ac.CachingMatcher.prototype.requestMatchingRows = function(\n    token, maxMatches, matchHandler) {\n  this.mostRecentMaxMatches_ = maxMatches;\n  this.mostRecentToken_ = token;\n  this.mostRecentMatchHandler_ = matchHandler;\n  this.throttledTriggerBaseMatch_.fire();\n\n  var matches = this.getMatchesForRows_(token, maxMatches, this.rows_);\n  matchHandler(token, matches);\n  this.mostRecentMatches_ = matches;\n};\n\n\n/** Clears the cache. */\ngoog.ui.ac.CachingMatcher.prototype.clearCache = function() {\n  this.rows_ = [];\n  this.rowStrings_ = {};\n};\n\n\n/**\n * Adds the specified rows to the cache.\n * @param {!Array<!Object>} rows .\n * @private\n */\ngoog.ui.ac.CachingMatcher.prototype.addRows_ = function(rows) {\n  goog.array.forEach(rows, function(row) {\n    // The ' ' prefix is to avoid colliding with builtins like toString.\n    if (!this.rowStrings_[' ' + row]) {\n      this.rows_.push(row);\n      this.rowStrings_[' ' + row] = true;\n    }\n  }, this);\n};\n\n\n/**\n * Checks if the cache is larger than the maximum cache size. If so clears it.\n * @private\n */\ngoog.ui.ac.CachingMatcher.prototype.clearCacheIfTooLarge_ = function() {\n  if (this.rows_.length > this.maxCacheSize_) {\n    this.clearCache();\n  }\n};\n\n\n/**\n * Triggers a match request against the base matcher. This function is\n * unthrottled, so don't call it directly; instead use\n * this.throttledTriggerBaseMatch_.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.ac.CachingMatcher.prototype.triggerBaseMatch_ = function() {\n  this.baseMatcher_.requestMatchingRows(\n      this.mostRecentToken_, this.baseMatcherMaxMatches_,\n      goog.bind(this.onBaseMatch_, this));\n};\n\n\n/**\n * Handles a match response from the base matcher.\n * @param {string} token The token against which the base match was called.\n * @param {!Array<!Object>} matches The matches returned by the base matcher.\n * @private\n */\ngoog.ui.ac.CachingMatcher.prototype.onBaseMatch_ = function(token, matches) {\n  // NOTE(reinerp): The user might have typed some more characters since the\n  // base matcher request was sent out, which manifests in that token might be\n  // older than this.mostRecentToken_. We make sure to do our local matches\n  // using this.mostRecentToken_ rather than token so that we display results\n  // relevant to what the user is seeing right now.\n\n  // NOTE(reinerp): We compute a diff between the currently displayed results\n  // and the new results we would get now that the server results have come\n  // back. Using this diff, we make sure the new results are only added to the\n  // end of the list of results. See the documentation on\n  // this.mostRecentMatches_ for details\n\n  this.addRows_(matches);\n\n  var oldMatchesSet = {};\n  goog.array.forEach(this.mostRecentMatches_, function(match) {\n    // The ' ' prefix is to avoid colliding with builtins like toString.\n    oldMatchesSet[' ' + match] = true;\n  });\n  var newMatches = this.getMatchesForRows_(\n      this.mostRecentToken_, this.mostRecentMaxMatches_, this.rows_);\n  newMatches = goog.array.filter(\n      newMatches, function(match) { return !(oldMatchesSet[' ' + match]); });\n  newMatches = this.mostRecentMatches_.concat(newMatches)\n                   .slice(0, this.mostRecentMaxMatches_);\n\n  this.mostRecentMatches_ = newMatches;\n\n  // We've gone to the effort of keeping the existing rows as before, so let's\n  // make sure to keep them highlighted.\n  var options = new goog.ui.ac.RenderOptions();\n  options.setPreserveHilited(true);\n  this.mostRecentMatchHandler_(this.mostRecentToken_, newMatches, options);\n\n  // We clear the cache *after* running the local match, so we don't\n  // suddenly remove results just because the remote match came back.\n  this.clearCacheIfTooLarge_();\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.async.Throttle","^9>","~$goog.ui.ac.RenderOptions","~$goog.ui.ac.ArrayMatcher","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/ac/cachingmatcher.js"],"^:1",["^9K",["~$goog.ui.ac.CachingMatcher"]],"^9<",true,"^9=",["^9>","^;9","^>Z","^?0","^>["]],["^ ","^9A",[1579837703000],"^9B","goog.labs.testing.numbermatcher.js","^9C",["^9D","goog/labs/testing/numbermatcher.js"],"^9E","goog/labs/testing/numbermatcher.js","^9F","^9G","^9H","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides the built-in number matchers like lessThan,\n * greaterThan, etc.\n */\n\ngoog.provide('goog.labs.testing.AnyNumberMatcher');\ngoog.provide('goog.labs.testing.CloseToMatcher');\ngoog.provide('goog.labs.testing.EqualToMatcher');\ngoog.provide('goog.labs.testing.GreaterThanEqualToMatcher');\ngoog.provide('goog.labs.testing.GreaterThanMatcher');\ngoog.provide('goog.labs.testing.LessThanEqualToMatcher');\ngoog.provide('goog.labs.testing.LessThanMatcher');\n\ngoog.require('goog.asserts');\ngoog.require('goog.labs.testing.Matcher');\n\n\n/**\n * Matches any number value.\n *\n * @constructor @struct @implements {goog.labs.testing.Matcher} @final\n */\ngoog.labs.testing.AnyNumberMatcher = function() {};\n\n\n/** @override */\ngoog.labs.testing.AnyNumberMatcher.prototype.matches = function(actualValue) {\n  return typeof actualValue === 'number';\n};\n\n\n/** @override */\ngoog.labs.testing.AnyNumberMatcher.prototype.describe = function(actualValue) {\n  return '<' + actualValue + '> is not a number';\n};\n\n\n\n/**\n * The GreaterThan matcher.\n *\n * @param {number} value The value to compare.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.GreaterThanMatcher = function(value) {\n  /**\n   * @type {number}\n   * @private\n   */\n  this.value_ = value;\n};\n\n\n/**\n * Determines if input value is greater than the expected value.\n *\n * @override\n */\ngoog.labs.testing.GreaterThanMatcher.prototype.matches = function(actualValue) {\n  goog.asserts.assertNumber(actualValue);\n  return actualValue > this.value_;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.GreaterThanMatcher.prototype.describe = function(\n    actualValue) {\n  goog.asserts.assertNumber(actualValue);\n  return actualValue + ' is not greater than ' + this.value_;\n};\n\n\n\n/**\n * The lessThan matcher.\n *\n * @param {number} value The value to compare.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.LessThanMatcher = function(value) {\n  /**\n   * @type {number}\n   * @private\n   */\n  this.value_ = value;\n};\n\n\n/**\n * Determines if the input value is less than the expected value.\n *\n * @override\n */\ngoog.labs.testing.LessThanMatcher.prototype.matches = function(actualValue) {\n  goog.asserts.assertNumber(actualValue);\n  return actualValue < this.value_;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.LessThanMatcher.prototype.describe = function(actualValue) {\n  goog.asserts.assertNumber(actualValue);\n  return actualValue + ' is not less than ' + this.value_;\n};\n\n\n\n/**\n * The GreaterThanEqualTo matcher.\n *\n * @param {number} value The value to compare.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.GreaterThanEqualToMatcher = function(value) {\n  /**\n   * @type {number}\n   * @private\n   */\n  this.value_ = value;\n};\n\n\n/**\n * Determines if the input value is greater than equal to the expected value.\n *\n * @override\n */\ngoog.labs.testing.GreaterThanEqualToMatcher.prototype.matches = function(\n    actualValue) {\n  goog.asserts.assertNumber(actualValue);\n  return actualValue >= this.value_;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.GreaterThanEqualToMatcher.prototype.describe = function(\n    actualValue) {\n  goog.asserts.assertNumber(actualValue);\n  return actualValue + ' is not greater than equal to ' + this.value_;\n};\n\n\n\n/**\n * The LessThanEqualTo matcher.\n *\n * @param {number} value The value to compare.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.LessThanEqualToMatcher = function(value) {\n  /**\n   * @type {number}\n   * @private\n   */\n  this.value_ = value;\n};\n\n\n/**\n * Determines if the input value is less than or equal to the expected value.\n *\n * @override\n */\ngoog.labs.testing.LessThanEqualToMatcher.prototype.matches = function(\n    actualValue) {\n  goog.asserts.assertNumber(actualValue);\n  return actualValue <= this.value_;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.LessThanEqualToMatcher.prototype.describe = function(\n    actualValue) {\n  goog.asserts.assertNumber(actualValue);\n  return actualValue + ' is not less than equal to ' + this.value_;\n};\n\n\n\n/**\n * The EqualTo matcher.\n *\n * @param {number} value The value to compare.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.EqualToMatcher = function(value) {\n  /**\n   * @type {number}\n   * @private\n   */\n  this.value_ = value;\n};\n\n\n/**\n * Determines if the input value is equal to the expected value.\n *\n * @override\n */\ngoog.labs.testing.EqualToMatcher.prototype.matches = function(actualValue) {\n  goog.asserts.assertNumber(actualValue);\n  return actualValue === this.value_;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.EqualToMatcher.prototype.describe = function(actualValue) {\n  goog.asserts.assertNumber(actualValue);\n  return actualValue + ' is not equal to ' + this.value_;\n};\n\n\n\n/**\n * The CloseTo matcher.\n *\n * @param {number} value The value to compare.\n * @param {number} range The range to check within.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.CloseToMatcher = function(value, range) {\n  /**\n   * @type {number}\n   * @private\n   */\n  this.value_ = value;\n  /**\n   * @type {number}\n   * @private\n   */\n  this.range_ = range;\n};\n\n\n/**\n * Determines if input value is within a certain range of the expected value.\n *\n * @override\n */\ngoog.labs.testing.CloseToMatcher.prototype.matches = function(actualValue) {\n  goog.asserts.assertNumber(actualValue);\n  return Math.abs(this.value_ - actualValue) < this.range_;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.CloseToMatcher.prototype.describe = function(actualValue) {\n  goog.asserts.assertNumber(actualValue);\n  return actualValue + ' is not close to(' + this.range_ + ') ' + this.value_;\n};\n\n\n/** @return {!goog.labs.testing.AnyNumberMatcher} */\nvar anyNumber = goog.labs.testing.AnyNumberMatcher.anyNumber = function() {\n  return new goog.labs.testing.AnyNumberMatcher();\n};\n\n\n/**\n * @param {number} value The expected value.\n *\n * @return {!goog.labs.testing.GreaterThanMatcher} A GreaterThanMatcher.\n */\nvar greaterThan =\n    goog.labs.testing.GreaterThanMatcher.greaterThan = function(value) {\n      return new goog.labs.testing.GreaterThanMatcher(value);\n    };\n\n\n/**\n * @param {number} value The expected value.\n *\n * @return {!goog.labs.testing.GreaterThanEqualToMatcher} A\n *     GreaterThanEqualToMatcher.\n */\nvar greaterThanEqualTo =\n    goog.labs.testing.GreaterThanEqualToMatcher.greaterThanEqualTo = function(\n        value) {\n      return new goog.labs.testing.GreaterThanEqualToMatcher(value);\n    };\n\n\n/**\n * @param {number} value The expected value.\n *\n * @return {!goog.labs.testing.LessThanMatcher} A LessThanMatcher.\n */\nvar lessThan = goog.labs.testing.LessThanMatcher.lessThan = function(value) {\n  return new goog.labs.testing.LessThanMatcher(value);\n};\n\n\n/**\n * @param {number} value The expected value.\n *\n * @return {!goog.labs.testing.LessThanEqualToMatcher} A LessThanEqualToMatcher.\n */\nvar lessThanEqualTo =\n    goog.labs.testing.LessThanEqualToMatcher.lessThanEqualTo = function(value) {\n      return new goog.labs.testing.LessThanEqualToMatcher(value);\n    };\n\n\n/**\n * @param {number} value The expected value.\n *\n * @return {!goog.labs.testing.EqualToMatcher} An EqualToMatcher.\n */\nvar equalTo = goog.labs.testing.EqualToMatcher.equalTo = function(value) {\n  return new goog.labs.testing.EqualToMatcher(value);\n};\n\n\n/**\n * @param {number} value The expected value.\n * @param {number} range The maximum allowed difference from the expected value.\n *\n * @return {!goog.labs.testing.CloseToMatcher} A CloseToMatcher.\n */\nvar closeTo =\n    goog.labs.testing.CloseToMatcher.closeTo = function(value, range) {\n      return new goog.labs.testing.CloseToMatcher(value, range);\n    };\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.labs.testing.Matcher","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/testing/numbermatcher.js"],"^:1",["^9K",["~$goog.labs.testing.CloseToMatcher","~$goog.labs.testing.GreaterThanMatcher","~$goog.labs.testing.AnyNumberMatcher","~$goog.labs.testing.EqualToMatcher","~$goog.labs.testing.LessThanEqualToMatcher","~$goog.labs.testing.GreaterThanEqualToMatcher","~$goog.labs.testing.LessThanMatcher"]],"^9<",true,"^9=",["^9>","^:E","^?2"]],["^ ","^9A",[1579837703000],"^9B","goog.module.moduleloadcallback.js","^9C",["^9D","goog/module/moduleloadcallback.js"],"^9E","goog/module/moduleloadcallback.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A simple callback mechanism for notification about module\n * loads. Should be considered package-private to goog.module.\n *\n */\n\ngoog.provide('goog.module.ModuleLoadCallback');\n\ngoog.require('goog.debug.entryPointRegistry');\n/** @suppress {extraRequire} */\ngoog.require('goog.module');\n\n\n\n/**\n * Class used to encapsulate the callbacks to be called when a module loads.\n * @param {Function} fn Callback function.\n * @param {Object=} opt_handler Optional handler under whose scope to execute\n *     the callback.\n * @constructor\n * @final\n */\ngoog.module.ModuleLoadCallback = function(fn, opt_handler) {\n  /**\n   * Callback function.\n   * @type {Function}\n   * @private\n   */\n  this.fn_ = fn;\n\n  /**\n   * Optional handler under whose scope to execute the callback.\n   * @type {Object|undefined}\n   * @private\n   */\n  this.handler_ = opt_handler;\n};\n\n\n/**\n * Completes the operation and calls the callback function if appropriate.\n * @param {*} context The module context.\n */\ngoog.module.ModuleLoadCallback.prototype.execute = function(context) {\n  if (this.fn_) {\n    this.fn_.call(this.handler_ || null, context);\n    this.handler_ = null;\n    this.fn_ = null;\n  }\n};\n\n\n/**\n * Abort the callback, but not the actual module load.\n */\ngoog.module.ModuleLoadCallback.prototype.abort = function() {\n  this.fn_ = null;\n  this.handler_ = null;\n};\n\n\n// Register the browser event handler as an entry point, so that\n// it can be monitored for exception handling, etc.\ngoog.debug.entryPointRegistry.register(\n    /**\n     * @param {function(!Function): !Function} transformer The transforming\n     *     function.\n     */\n    function(transformer) {\n      goog.module.ModuleLoadCallback.prototype.execute =\n          transformer(goog.module.ModuleLoadCallback.prototype.execute);\n    });\n","^9I",1579837703000,"^9J",["^9K",["~$goog.module","^9>","^;U"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/module/moduleloadcallback.js"],"^:1",["^9K",["~$goog.module.ModuleLoadCallback"]],"^9<",true,"^9=",["^9>","^;U","^?:"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.editor.testhelper.js","^9C",["^9D","goog/testing/editor/testhelper.js"],"^9E","goog/testing/editor/testhelper.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class that allows for simple text editing tests.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.setTestOnly('goog.testing.editor.TestHelper');\ngoog.provide('goog.testing.editor.TestHelper');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.dom');\ngoog.require('goog.dom.Range');\ngoog.require('goog.editor.BrowserFeature');\ngoog.require('goog.editor.node');\ngoog.require('goog.editor.plugins.AbstractBubblePlugin');\ngoog.require('goog.testing.dom');\n\n\n\n/**\n * Create a new test controller.\n * @param {Element} root The root editable element.\n * @constructor\n * @extends {goog.Disposable}\n * @final\n */\ngoog.testing.editor.TestHelper = function(root) {\n  if (!root) {\n    throw new Error('Null root');\n  }\n  goog.Disposable.call(this);\n\n  /**\n   * Convenience variable for root DOM element.\n   * @type {!Element}\n   * @private\n   */\n  this.root_ = root;\n\n  /**\n   * The starting HTML of the editable element.\n   * @type {string}\n   * @private\n   */\n  this.savedHtml_ = '';\n};\ngoog.inherits(goog.testing.editor.TestHelper, goog.Disposable);\n\n\n/**\n * Selects a new root element.\n * @param {Element} root The root editable element.\n */\ngoog.testing.editor.TestHelper.prototype.setRoot = function(root) {\n  if (!root) {\n    throw new Error('Null root');\n  }\n  this.root_ = root;\n};\n\n\n/**\n * Make the root element editable.  Also saves its HTML to be restored\n * in tearDown.\n */\ngoog.testing.editor.TestHelper.prototype.setUpEditableElement = function() {\n  this.savedHtml_ = this.root_.innerHTML;\n  if (goog.editor.BrowserFeature.HAS_CONTENT_EDITABLE) {\n    this.root_.contentEditable = true;\n  } else {\n    this.root_.ownerDocument.designMode = 'on';\n  }\n  this.root_.setAttribute('g_editable', 'true');\n};\n\n\n/**\n * Reset the element previously initialized, restoring its HTML and making it\n * non editable.\n * @suppress {accessControls} Private state of\n *     {@link goog.editor.plugins.AbstractBubblePlugin} is accessed for test\n *     purposes.\n */\ngoog.testing.editor.TestHelper.prototype.tearDownEditableElement = function() {\n  if (goog.editor.BrowserFeature.HAS_CONTENT_EDITABLE) {\n    this.root_.contentEditable = false;\n  } else {\n    this.root_.ownerDocument.designMode = 'off';\n  }\n  goog.dom.removeChildren(this.root_);\n  this.root_.innerHTML = this.savedHtml_;\n  this.root_.removeAttribute('g_editable');\n\n  if (goog.editor.plugins && goog.editor.plugins.AbstractBubblePlugin) {\n    // Remove old bubbles.\n    for (var key in goog.editor.plugins.AbstractBubblePlugin.bubbleMap_) {\n      goog.editor.plugins.AbstractBubblePlugin.bubbleMap_[key].dispose();\n    }\n    // Ensure we get a new bubble for each test.\n    goog.editor.plugins.AbstractBubblePlugin.bubbleMap_ = {};\n  }\n};\n\n\n/**\n * Assert that the html in 'root' is substantially similar to htmlPattern.\n * This method tests for the same set of styles, and for the same order of\n * nodes.  Breaking whitespace nodes are ignored.  Elements can be annotated\n * with classnames corresponding to keys in goog.userAgent and will be\n * expected to show up in that user agent and expected not to show up in\n * others.\n * @param {string} htmlPattern The pattern to match.\n */\ngoog.testing.editor.TestHelper.prototype.assertHtmlMatches = function(\n    htmlPattern) {\n  goog.testing.dom.assertHtmlContentsMatch(htmlPattern, this.root_);\n};\n\n\n/**\n * Finds the first text node descendant of root with the given content.\n * @param {string|RegExp} textOrRegexp The text to find, or a regular\n *     expression to find a match of.\n * @return {Node} The first text node that matches, or null if none is found.\n */\ngoog.testing.editor.TestHelper.prototype.findTextNode = function(textOrRegexp) {\n  return goog.testing.dom.findTextNode(textOrRegexp, this.root_);\n};\n\n\n/**\n * Select from the given `fromOffset` in the given `from` node to\n * the given `toOffset` in the optionally given `to` node. If nodes\n * are passed in, uses them, otherwise uses findTextNode to find the nodes to\n * select. Selects a caret if opt_to and opt_toOffset are not given.\n * @param {Node|string} from Node or text of the node to start the selection at.\n * @param {number} fromOffset Offset within the above node to start the\n *     selection at.\n * @param {Node|string=} opt_to Node or text of the node to end the selection\n *     at.\n * @param {number=} opt_toOffset Offset within the above node to end the\n *     selection at.\n * @return {!goog.dom.AbstractRange}\n */\ngoog.testing.editor.TestHelper.prototype.select = function(\n    from, fromOffset, opt_to, opt_toOffset) {\n  var end;\n  var start = end = (typeof from === 'string') ? this.findTextNode(from) : from;\n  var endOffset;\n  var startOffset = endOffset = fromOffset;\n\n  if (opt_to && typeof opt_toOffset === 'number') {\n    end = (typeof opt_to === 'string') ? this.findTextNode(opt_to) : opt_to;\n    endOffset = opt_toOffset;\n  }\n\n  var range =\n      goog.dom.Range.createFromNodes(start, startOffset, end, endOffset);\n  range.select();\n  return range;\n};\n\n\n/** @override */\ngoog.testing.editor.TestHelper.prototype.disposeInternal = function() {\n  if (goog.editor.node.isEditableContainer(this.root_)) {\n    this.tearDownEditableElement();\n  }\n  delete this.root_;\n  goog.testing.editor.TestHelper.base(this, 'disposeInternal');\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","~$goog.editor.plugins.AbstractBubblePlugin","~$goog.editor.BrowserFeature","^9>","~$goog.testing.dom","^:7","~$goog.editor.node","^=F"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/editor/testhelper.js"],"^:1",["^9K",["~$goog.testing.editor.TestHelper"]],"^9<",true,"^9=",["^9>","^:7","^;;","^=F","^?=","^??","^?<","^?>"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.decorate.js","^9C",["^9D","goog/ui/decorate.js"],"^9E","goog/ui/decorate.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a function that decorates an element based on its CSS\n * class name.\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.decorate');\n\ngoog.forwardDeclare('goog.ui.Component');\ngoog.require('goog.ui.registry');\n\n\n/**\n * Decorates the element with a suitable {@link goog.ui.Component} instance, if\n * a matching decorator is found.\n * @param {Element} element Element to decorate.\n * @return {goog.ui.Component?} New component instance, decorating the element.\n */\ngoog.ui.decorate = function(element) {\n  var decorator = goog.ui.registry.getDecorator(element);\n  if (decorator) {\n    decorator.decorate(element);\n  }\n  return decorator;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/decorate.js"],"^:1",["^9K",["~$goog.ui.decorate"]],"^9<",true,"^9=",["^9>","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.browserrange.webkitrange.js","^9C",["^9D","goog/dom/browserrange/webkitrange.js"],"^9E","goog/dom/browserrange/webkitrange.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the WebKit specific range wrapper.  Inherits most\n * functionality from W3CRange, but adds exceptions as necessary.\n *\n * DO NOT USE THIS FILE DIRECTLY.  Use goog.dom.Range instead.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.dom.browserrange.WebKitRange');\n\ngoog.require('goog.dom.RangeEndpoint');\ngoog.require('goog.dom.browserrange.W3cRange');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * The constructor for WebKit specific browser ranges.\n * @param {Range} range The range object.\n * @constructor\n * @extends {goog.dom.browserrange.W3cRange}\n * @final\n */\ngoog.dom.browserrange.WebKitRange = function(range) {\n  goog.dom.browserrange.W3cRange.call(this, range);\n};\ngoog.inherits(\n    goog.dom.browserrange.WebKitRange, goog.dom.browserrange.W3cRange);\n\n\n/**\n * Creates a range object that selects the given node's text.\n * @param {Node} node The node to select.\n * @return {!goog.dom.browserrange.WebKitRange} A WebKit range wrapper object.\n */\ngoog.dom.browserrange.WebKitRange.createFromNodeContents = function(node) {\n  return new goog.dom.browserrange.WebKitRange(\n      goog.dom.browserrange.W3cRange.getBrowserRangeForNode(node));\n};\n\n\n/**\n * Creates a range object that selects between the given nodes.\n * @param {Node} startNode The node to start with.\n * @param {number} startOffset The offset within the start node.\n * @param {Node} endNode The node to end with.\n * @param {number} endOffset The offset within the end node.\n * @return {!goog.dom.browserrange.WebKitRange} A wrapper object.\n */\ngoog.dom.browserrange.WebKitRange.createFromNodes = function(\n    startNode, startOffset, endNode, endOffset) {\n  return new goog.dom.browserrange.WebKitRange(\n      goog.dom.browserrange.W3cRange.getBrowserRangeForNodes(\n          startNode, startOffset, endNode, endOffset));\n};\n\n\n/** @override */\ngoog.dom.browserrange.WebKitRange.prototype.compareBrowserRangeEndpoints =\n    function(range, thisEndpoint, otherEndpoint) {\n  // Webkit pre-528 has some bugs where compareBoundaryPoints() doesn't work the\n  // way it is supposed to, but if we reverse the sense of two comparisons,\n  // it works fine.\n  // https://bugs.webkit.org/show_bug.cgi?id=20738\n  if (goog.userAgent.isVersionOrHigher('528')) {\n    return (\n        goog.dom.browserrange.WebKitRange.superClass_\n            .compareBrowserRangeEndpoints.call(\n                this, range, thisEndpoint, otherEndpoint));\n  }\n  return this.range_.compareBoundaryPoints(\n      otherEndpoint == goog.dom.RangeEndpoint.START ?\n          (thisEndpoint == goog.dom.RangeEndpoint.START ?\n               goog.global['Range'].START_TO_START :\n               goog.global['Range'].END_TO_START) :  // Sense reversed\n          (thisEndpoint == goog.dom.RangeEndpoint.START ?\n               goog.global['Range'].START_TO_END :  // Sense reversed\n               goog.global['Range'].END_TO_END),\n      /** @type {Range} */ (range));\n};\n\n\n/** @override */\ngoog.dom.browserrange.WebKitRange.prototype.selectInternal = function(\n    selection, reversed) {\n  if (reversed) {\n    selection.setBaseAndExtent(\n        this.getEndNode(), this.getEndOffset(), this.getStartNode(),\n        this.getStartOffset());\n  } else {\n    selection.setBaseAndExtent(\n        this.getStartNode(), this.getStartOffset(), this.getEndNode(),\n        this.getEndOffset());\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.dom.browserrange.W3cRange","^9>","^:S","^>9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/browserrange/webkitrange.js"],"^:1",["^9K",["~$goog.dom.browserrange.WebKitRange"]],"^9<",true,"^9=",["^9>","^>9","^?B","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.sliderbase.js","^9C",["^9D","goog/ui/sliderbase.js"],"^9E","goog/ui/sliderbase.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implementation of a basic slider control.\n *\n * Models a control that allows to select a sub-range within a given\n * range of values using two thumbs.  The underlying range is modeled\n * as a range model, where the min thumb points to value of the\n * rangemodel, and the max thumb points to value + extent of the range\n * model.\n *\n * The currently selected range is exposed through methods\n * getValue() and getExtent().\n *\n * The reason for modelling the basic slider state as value + extent is\n * to be able to capture both, a two-thumb slider to select a range, and\n * a single-thumb slider to just select a value (in the latter case, extent\n * is always zero). We provide subclasses (twothumbslider.js and slider.js)\n * that model those special cases of this control.\n *\n * All rendering logic is left out, so that the subclasses can define\n * their own rendering. To do so, the subclasses overwrite:\n * - createDom\n * - decorateInternal\n * - getCssClass\n *\n * @author arv@google.com (Erik Arvidsson)\n */\n\ngoog.provide('goog.ui.SliderBase');\ngoog.provide('goog.ui.SliderBase.AnimationFactory');\ngoog.provide('goog.ui.SliderBase.Orientation');\n\ngoog.require('goog.Timer');\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.events.KeyHandler');\ngoog.require('goog.events.MouseWheelHandler');\ngoog.require('goog.functions');\ngoog.require('goog.fx.AnimationParallelQueue');\ngoog.require('goog.fx.Dragger');\ngoog.require('goog.fx.Transition');\ngoog.require('goog.fx.dom.ResizeHeight');\ngoog.require('goog.fx.dom.ResizeWidth');\ngoog.require('goog.fx.dom.Slide');\ngoog.require('goog.math');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.style');\ngoog.require('goog.style.bidi');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.RangeModel');\n\n\n\n/**\n * This creates a SliderBase object.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @param {(function(number):?string)=} opt_labelFn An optional function mapping\n *     slider values to a description of the value.\n * @constructor\n * @extends {goog.ui.Component}\n */\ngoog.ui.SliderBase = function(opt_domHelper, opt_labelFn) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * The factory to use to generate additional animations when animating to a\n   * new value.\n   * @type {?goog.ui.SliderBase.AnimationFactory}\n   * @private\n   */\n  this.additionalAnimations_ = null;\n\n  /**\n   * The model for the range of the slider.\n   * @protected {!goog.ui.RangeModel}\n   */\n  this.rangeModel = new goog.ui.RangeModel();\n\n  /**\n   * A function mapping slider values to text description.\n   * @private {function(number):?string}\n   */\n  this.labelFn_ = opt_labelFn || goog.functions.NULL;\n\n  /**\n   * Whether to move the focus to the top level element when dragging the\n   * slider, default true.\n   * @private {boolean}\n   */\n  this.focusElementOnSliderDrag_ = true;\n\n  // Don't use getHandler because it gets cleared in exitDocument.\n  goog.events.listen(\n      this.rangeModel, goog.ui.Component.EventType.CHANGE,\n      this.handleRangeModelChange, false, this);\n};\ngoog.inherits(goog.ui.SliderBase, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.SliderBase);\n\n\n/**\n * Event types used to listen for dragging events. Note that extent drag events\n * are also sent for single-thumb sliders, since the one thumb controls both\n * value and extent together; in this case, they can simply be ignored.\n * @enum {string}\n */\ngoog.ui.SliderBase.EventType = {\n  /** User started dragging the value thumb */\n  DRAG_VALUE_START: goog.events.getUniqueId('dragvaluestart'),\n  /** User is done dragging the value thumb */\n  DRAG_VALUE_END: goog.events.getUniqueId('dragvalueend'),\n  /** User started dragging the extent thumb */\n  DRAG_EXTENT_START: goog.events.getUniqueId('dragextentstart'),\n  /** User is done dragging the extent thumb */\n  DRAG_EXTENT_END: goog.events.getUniqueId('dragextentend'),\n  // Note that the following two events are sent twice, once for the value\n  // dragger, and once of the extent dragger. If you need to differentiate\n  // between the two, or if your code relies on receiving a single event per\n  // START/END event, it should listen to one of the VALUE/EXTENT-specific\n  // events.\n  /** User started dragging a thumb */\n  DRAG_START: goog.events.getUniqueId('dragstart'),\n  /** User is done dragging a thumb */\n  DRAG_END: goog.events.getUniqueId('dragend'),\n  /** Animation on the value thumb ends */\n  ANIMATION_END: goog.events.getUniqueId('animationend')\n};\n\n\n/**\n * Enum for representing the orientation of the slider.\n *\n * @enum {string}\n */\ngoog.ui.SliderBase.Orientation = {\n  VERTICAL: 'vertical',\n  HORIZONTAL: 'horizontal'\n};\n\n\n/**\n * Orientation of the slider.\n * @type {goog.ui.SliderBase.Orientation}\n * @private\n */\ngoog.ui.SliderBase.prototype.orientation_ =\n    goog.ui.SliderBase.Orientation.HORIZONTAL;\n\n\n/** @private {goog.fx.AnimationParallelQueue} */\ngoog.ui.SliderBase.prototype.currentAnimation_;\n\n\n/** @private {!goog.Timer} */\ngoog.ui.SliderBase.prototype.incTimer_;\n\n\n/** @private {boolean} */\ngoog.ui.SliderBase.prototype.incrementing_;\n\n\n/** @private {number} */\ngoog.ui.SliderBase.prototype.lastMousePosition_;\n\n\n/**\n * When the user holds down the mouse on the slider background, the closest\n * thumb will move in \"lock-step\" towards the mouse. This number indicates how\n * long each step should take (in milliseconds).\n * @type {number}\n * @private\n */\ngoog.ui.SliderBase.MOUSE_DOWN_INCREMENT_INTERVAL_ = 200;\n\n\n/**\n * How long the animations should take (in milliseconds).\n * @type {number}\n * @private\n */\ngoog.ui.SliderBase.ANIMATION_INTERVAL_ = 100;\n\n\n/**\n * The minThumb dom-element, pointing to the start of the selected range.\n * @type {HTMLDivElement}\n * @protected\n */\ngoog.ui.SliderBase.prototype.valueThumb;\n\n\n/**\n * The maxThumb dom-element, pointing to the end of the selected range.\n * @type {HTMLDivElement}\n * @protected\n */\ngoog.ui.SliderBase.prototype.extentThumb;\n\n\n/**\n * The dom-element highlighting the selected range.\n * @type {HTMLDivElement}\n * @protected\n */\ngoog.ui.SliderBase.prototype.rangeHighlight;\n\n\n/**\n * The thumb that we should be moving (only relevant when timed move is active).\n * @type {HTMLDivElement}\n * @private\n */\ngoog.ui.SliderBase.prototype.thumbToMove_;\n\n\n/**\n * The object handling keyboard events.\n * @type {goog.events.KeyHandler}\n * @private\n */\ngoog.ui.SliderBase.prototype.keyHandler_;\n\n\n/**\n * The object handling mouse wheel events.\n * @type {goog.events.MouseWheelHandler}\n * @private\n */\ngoog.ui.SliderBase.prototype.mouseWheelHandler_;\n\n\n/**\n * The Dragger for dragging the valueThumb.\n * @type {goog.fx.Dragger}\n * @private\n */\ngoog.ui.SliderBase.prototype.valueDragger_;\n\n\n/**\n * The Dragger for dragging the extentThumb.\n * @type {goog.fx.Dragger}\n * @private\n */\ngoog.ui.SliderBase.prototype.extentDragger_;\n\n\n/**\n * If we are currently animating the thumb.\n * @private\n * @type {boolean}\n */\ngoog.ui.SliderBase.prototype.isAnimating_ = false;\n\n\n/**\n * Whether clicking on the backgtround should move directly to that point.\n * @private\n * @type {boolean}\n */\ngoog.ui.SliderBase.prototype.moveToPointEnabled_ = false;\n\n\n/**\n * The amount to increment/decrement for page up/down as well as when holding\n * down the mouse button on the background.\n * @private\n * @type {number}\n */\ngoog.ui.SliderBase.prototype.blockIncrement_ = 10;\n\n\n/**\n * The minimal extent. The class will ensure that the extent cannot shrink\n * to a value smaller than minExtent.\n * @private\n * @type {number}\n */\ngoog.ui.SliderBase.prototype.minExtent_ = 0;\n\n\n/**\n * Whether the slider should handle mouse wheel events.\n * @private\n * @type {boolean}\n */\ngoog.ui.SliderBase.prototype.isHandleMouseWheel_ = true;\n\n\n/**\n * The time the last mousedown event was received.\n * @private\n * @type {number}\n */\ngoog.ui.SliderBase.prototype.mouseDownTime_ = 0;\n\n\n/**\n * The delay after mouseDownTime_ during which a click event is ignored.\n * @private\n * @type {number}\n * @const\n */\ngoog.ui.SliderBase.prototype.MOUSE_DOWN_DELAY_ = 1000;\n\n\n/**\n * Whether the slider is enabled or not.\n * @private\n * @type {boolean}\n */\ngoog.ui.SliderBase.prototype.enabled_ = true;\n\n\n/**\n * Whether the slider implements the changes described in http://b/6324964,\n * making it truly RTL.  This is a temporary flag to allow clients to transition\n * to the new behavior at their convenience.  At some point it will be the\n * default.\n * @type {boolean}\n * @private\n */\ngoog.ui.SliderBase.prototype.flipForRtl_ = false;\n\n\n/**\n * Enables/disables true RTL behavior.  This should be called immediately after\n * construction.  This is a temporary flag to allow clients to transition\n * to the new behavior at their convenience.  At some point it will be the\n * default.\n * @param {boolean} flipForRtl True if the slider should be flipped for RTL,\n *     false otherwise.\n */\ngoog.ui.SliderBase.prototype.enableFlipForRtl = function(flipForRtl) {\n  this.flipForRtl_ = flipForRtl;\n};\n\n\n// TODO: Make this return a base CSS class (without orientation), in subclasses.\n/**\n * Returns the CSS class applied to the slider element for the given\n * orientation. Subclasses must override this method.\n * @param {goog.ui.SliderBase.Orientation} orient The orientation.\n * @return {string} The CSS class applied to slider elements.\n * @protected\n */\ngoog.ui.SliderBase.prototype.getCssClass = goog.abstractMethod;\n\n\n/** @override */\ngoog.ui.SliderBase.prototype.createDom = function() {\n  goog.ui.SliderBase.superClass_.createDom.call(this);\n  var element = this.getDomHelper().createDom(\n      goog.dom.TagName.DIV, this.getCssClass(this.orientation_));\n  this.decorateInternal(element);\n};\n\n\n/**\n * Subclasses must implement this method and set the valueThumb and\n * extentThumb to non-null values. They can also set the rangeHighlight\n * element if a range highlight is desired.\n * @type {function() : void}\n * @protected\n */\ngoog.ui.SliderBase.prototype.createThumbs = goog.abstractMethod;\n\n\n/**\n * CSS class name applied to the slider while its thumbs are being dragged.\n * @type {string}\n * @private\n */\ngoog.ui.SliderBase.SLIDER_DRAGGING_CSS_CLASS_ =\n    goog.getCssName('goog-slider-dragging');\n\n\n/**\n * CSS class name applied to a thumb while it's being dragged.\n * @type {string}\n * @private\n */\ngoog.ui.SliderBase.THUMB_DRAGGING_CSS_CLASS_ =\n    goog.getCssName('goog-slider-thumb-dragging');\n\n\n/**\n * CSS class name applied when the slider is disabled.\n * @type {string}\n * @private\n */\ngoog.ui.SliderBase.DISABLED_CSS_CLASS_ =\n    goog.getCssName('goog-slider-disabled');\n\n\n/** @override */\ngoog.ui.SliderBase.prototype.decorateInternal = function(element) {\n  goog.ui.SliderBase.superClass_.decorateInternal.call(this, element);\n  goog.asserts.assert(element);\n  goog.dom.classlist.add(element, this.getCssClass(this.orientation_));\n  this.createThumbs();\n  this.setAriaRoles();\n};\n\n\n/**\n * Called when the DOM for the component is for sure in the document.\n * Subclasses should override this method to set this element's role.\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.SliderBase.prototype.enterDocument = function() {\n  goog.ui.SliderBase.superClass_.enterDocument.call(this);\n\n  // Attach the events\n  this.valueDragger_ = new goog.fx.Dragger(this.valueThumb);\n  this.extentDragger_ = new goog.fx.Dragger(this.extentThumb);\n  this.valueDragger_.enableRightPositioningForRtl(this.flipForRtl_);\n  this.extentDragger_.enableRightPositioningForRtl(this.flipForRtl_);\n\n  // The slider is handling the positioning so make the defaultActions empty.\n  this.valueDragger_.defaultAction = this.extentDragger_.defaultAction =\n      goog.nullFunction;\n  this.keyHandler_ = new goog.events.KeyHandler(this.getElement());\n  this.enableEventHandlers_(true);\n\n  this.getElement().tabIndex = 0;\n  this.updateUi_();\n};\n\n\n/**\n * Attaches/Detaches the event handlers on the slider.\n * @param {boolean} enable Whether to attach or detach the event handlers.\n * @private\n */\ngoog.ui.SliderBase.prototype.enableEventHandlers_ = function(enable) {\n  if (enable) {\n    this.getHandler()\n        .listen(\n            this.valueDragger_, goog.fx.Dragger.EventType.BEFOREDRAG,\n            this.handleBeforeDrag_)\n        .listen(\n            this.extentDragger_, goog.fx.Dragger.EventType.BEFOREDRAG,\n            this.handleBeforeDrag_)\n        .listen(\n            this.valueDragger_,\n            [goog.fx.Dragger.EventType.START, goog.fx.Dragger.EventType.END],\n            this.handleThumbDragStartEnd_)\n        .listen(\n            this.extentDragger_,\n            [goog.fx.Dragger.EventType.START, goog.fx.Dragger.EventType.END],\n            this.handleThumbDragStartEnd_)\n        .listen(\n            this.keyHandler_, goog.events.KeyHandler.EventType.KEY,\n            this.handleKeyDown_)\n        .listen(\n            this.getElement(), goog.events.EventType.CLICK,\n            this.handleMouseDownAndClick_)\n        .listen(\n            this.getElement(), goog.events.EventType.MOUSEDOWN,\n            this.handleMouseDownAndClick_);\n    if (this.isHandleMouseWheel()) {\n      this.enableMouseWheelHandling_(true);\n    }\n  } else {\n    this.getHandler()\n        .unlisten(\n            this.valueDragger_, goog.fx.Dragger.EventType.BEFOREDRAG,\n            this.handleBeforeDrag_)\n        .unlisten(\n            this.extentDragger_, goog.fx.Dragger.EventType.BEFOREDRAG,\n            this.handleBeforeDrag_)\n        .unlisten(\n            this.valueDragger_,\n            [goog.fx.Dragger.EventType.START, goog.fx.Dragger.EventType.END],\n            this.handleThumbDragStartEnd_)\n        .unlisten(\n            this.extentDragger_,\n            [goog.fx.Dragger.EventType.START, goog.fx.Dragger.EventType.END],\n            this.handleThumbDragStartEnd_)\n        .unlisten(\n            this.keyHandler_, goog.events.KeyHandler.EventType.KEY,\n            this.handleKeyDown_)\n        .unlisten(\n            this.getElement(), goog.events.EventType.CLICK,\n            this.handleMouseDownAndClick_)\n        .unlisten(\n            this.getElement(), goog.events.EventType.MOUSEDOWN,\n            this.handleMouseDownAndClick_);\n    if (this.isHandleMouseWheel()) {\n      this.enableMouseWheelHandling_(false);\n    }\n  }\n};\n\n\n/** @override */\ngoog.ui.SliderBase.prototype.exitDocument = function() {\n  goog.ui.SliderBase.base(this, 'exitDocument');\n  goog.disposeAll(\n      this.valueDragger_, this.extentDragger_, this.keyHandler_,\n      this.mouseWheelHandler_);\n};\n\n\n/**\n * Handler for the before drag event. We use the event properties to determine\n * the new value.\n * @param {goog.fx.DragEvent} e  The drag event used to drag the thumb.\n * @private\n */\ngoog.ui.SliderBase.prototype.handleBeforeDrag_ = function(e) {\n  var thumbToDrag =\n      e.dragger == this.valueDragger_ ? this.valueThumb : this.extentThumb;\n  var value;\n  if (this.orientation_ == goog.ui.SliderBase.Orientation.VERTICAL) {\n    var availHeight = this.getElement().clientHeight - thumbToDrag.offsetHeight;\n    value = (availHeight - e.top) / availHeight *\n            (this.getMaximum() - this.getMinimum()) +\n        this.getMinimum();\n  } else {\n    var availWidth = this.getElement().clientWidth - thumbToDrag.offsetWidth;\n    value = (e.left / availWidth) * (this.getMaximum() - this.getMinimum()) +\n        this.getMinimum();\n  }\n  // Bind the value within valid range before calling setThumbPosition_.\n  // This is necessary because setThumbPosition_ is a no-op for values outside\n  // of the legal range. For drag operations, we want the handle to snap to the\n  // last valid value instead of remaining at the previous position.\n  if (e.dragger == this.valueDragger_) {\n    value = Math.min(\n        Math.max(value, this.getMinimum()), this.getValue() + this.getExtent());\n  } else {\n    value = Math.min(Math.max(value, this.getValue()), this.getMaximum());\n  }\n  this.setThumbPosition_(thumbToDrag, value);\n};\n\n\n/**\n * Handler for the start/end drag event on the thumbs. Adds/removes\n * the \"-dragging\" CSS classes on the slider and thumb.\n * @param {goog.fx.DragEvent} e The drag event used to drag the thumb.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.SliderBase.prototype.handleThumbDragStartEnd_ = function(e) {\n  var isDragStart = e.type == goog.fx.Dragger.EventType.START;\n  goog.dom.classlist.enable(\n      goog.asserts.assertElement(this.getElement()),\n      goog.ui.SliderBase.SLIDER_DRAGGING_CSS_CLASS_, isDragStart);\n  goog.dom.classlist.enable(\n      goog.asserts.assertElement(e.target.handle),\n      goog.ui.SliderBase.THUMB_DRAGGING_CSS_CLASS_, isDragStart);\n  var isValueDragger = e.dragger == this.valueDragger_;\n  if (isDragStart) {\n    this.dispatchEvent(goog.ui.SliderBase.EventType.DRAG_START);\n    this.dispatchEvent(\n        isValueDragger ? goog.ui.SliderBase.EventType.DRAG_VALUE_START :\n                         goog.ui.SliderBase.EventType.DRAG_EXTENT_START);\n  } else {\n    this.dispatchEvent(goog.ui.SliderBase.EventType.DRAG_END);\n    this.dispatchEvent(\n        isValueDragger ? goog.ui.SliderBase.EventType.DRAG_VALUE_END :\n                         goog.ui.SliderBase.EventType.DRAG_EXTENT_END);\n  }\n};\n\n\n/**\n * Event handler for the key down event. This is used to update the value\n * based on the key pressed.\n * @param {goog.events.KeyEvent} e  The keyboard event object.\n * @private\n */\ngoog.ui.SliderBase.prototype.handleKeyDown_ = function(e) {\n  var handled = true;\n  switch (e.keyCode) {\n    case goog.events.KeyCodes.HOME:\n      this.animatedSetValue(this.getMinimum());\n      break;\n    case goog.events.KeyCodes.END:\n      this.animatedSetValue(this.getMaximum());\n      break;\n    case goog.events.KeyCodes.PAGE_UP:\n      this.moveThumbs(this.getBlockIncrement());\n      break;\n    case goog.events.KeyCodes.PAGE_DOWN:\n      this.moveThumbs(-this.getBlockIncrement());\n      break;\n    case goog.events.KeyCodes.LEFT:\n      var sign = this.flipForRtl_ && this.isRightToLeft() ? 1 : -1;\n      this.moveThumbs(\n          e.shiftKey ? sign * this.getBlockIncrement() :\n                       sign * this.getUnitIncrement());\n      break;\n    case goog.events.KeyCodes.DOWN:\n      this.moveThumbs(\n          e.shiftKey ? -this.getBlockIncrement() : -this.getUnitIncrement());\n      break;\n    case goog.events.KeyCodes.RIGHT:\n      var sign = this.flipForRtl_ && this.isRightToLeft() ? -1 : 1;\n      this.moveThumbs(\n          e.shiftKey ? sign * this.getBlockIncrement() :\n                       sign * this.getUnitIncrement());\n      break;\n    case goog.events.KeyCodes.UP:\n      this.moveThumbs(\n          e.shiftKey ? this.getBlockIncrement() : this.getUnitIncrement());\n      break;\n\n    default:\n      handled = false;\n  }\n\n  if (handled) {\n    e.preventDefault();\n  }\n};\n\n\n/**\n * Handler for the mouse down event and click event.\n * @param {goog.events.Event} e  The mouse event object.\n * @private\n */\ngoog.ui.SliderBase.prototype.handleMouseDownAndClick_ = function(e) {\n  if (this.focusElementOnSliderDrag_ && this.getElement().focus) {\n    this.getElement().focus();\n  }\n\n  // Known Element.\n  var target = /** @type {Element} */ (e.target);\n\n  if (!goog.dom.contains(this.valueThumb, target) &&\n      !goog.dom.contains(this.extentThumb, target)) {\n    var isClick = e.type == goog.events.EventType.CLICK;\n    if (isClick && goog.now() < this.mouseDownTime_ + this.MOUSE_DOWN_DELAY_) {\n      // Ignore a click event that comes a short moment after a mousedown\n      // event.  This happens for desktop.  For devices with both a touch\n      // screen and a mouse pad we do not get a mousedown event from the mouse\n      // pad and do get a click event.\n      return;\n    }\n    if (!isClick) {\n      this.mouseDownTime_ = goog.now();\n    }\n\n    if (this.moveToPointEnabled_) {\n      // just set the value directly based on the position of the click\n      this.animatedSetValue(this.getValueFromMousePosition(e));\n    } else {\n      // start a timer that incrementally moves the handle\n      this.startBlockIncrementing_(e);\n    }\n  }\n};\n\n\n/**\n * Handler for the mouse wheel event.\n * @param {goog.events.MouseWheelEvent} e  The mouse wheel event object.\n * @private\n */\ngoog.ui.SliderBase.prototype.handleMouseWheel_ = function(e) {\n  // Just move one unit increment per mouse wheel event\n  var direction = e.detail > 0 ? -1 : 1;\n  this.moveThumbs(direction * this.getUnitIncrement());\n  e.preventDefault();\n};\n\n\n/**\n * Starts the animation that causes the thumb to increment/decrement by the\n * block increment when the user presses down on the background.\n * @param {goog.events.Event} e  The mouse event object.\n * @private\n */\ngoog.ui.SliderBase.prototype.startBlockIncrementing_ = function(e) {\n  this.storeMousePos_(e);\n  this.thumbToMove_ = this.getClosestThumb_(this.getValueFromMousePosition(e));\n  if (this.orientation_ == goog.ui.SliderBase.Orientation.VERTICAL) {\n    this.incrementing_ = this.lastMousePosition_ < this.thumbToMove_.offsetTop;\n  } else {\n    this.incrementing_ = this.lastMousePosition_ >\n        this.getOffsetStart_(this.thumbToMove_) + this.thumbToMove_.offsetWidth;\n  }\n\n  var doc = goog.dom.getOwnerDocument(this.getElement());\n  this.getHandler()\n      .listen(\n          doc, goog.events.EventType.MOUSEUP, this.stopBlockIncrementing_, true)\n      .listen(\n          this.getElement(), goog.events.EventType.MOUSEMOVE,\n          this.storeMousePos_);\n\n  if (!this.incTimer_) {\n    this.incTimer_ =\n        new goog.Timer(goog.ui.SliderBase.MOUSE_DOWN_INCREMENT_INTERVAL_);\n    this.getHandler().listen(\n        this.incTimer_, goog.Timer.TICK, this.handleTimerTick_);\n  }\n  this.handleTimerTick_();\n  this.incTimer_.start();\n};\n\n\n/**\n * Handler for the tick event dispatched by the timer used to update the value\n * in a block increment. This is also called directly from\n * startBlockIncrementing_.\n * @private\n */\ngoog.ui.SliderBase.prototype.handleTimerTick_ = function() {\n  var value;\n  if (this.orientation_ == goog.ui.SliderBase.Orientation.VERTICAL) {\n    var mouseY = this.lastMousePosition_;\n    var thumbY = this.thumbToMove_.offsetTop;\n    if (this.incrementing_) {\n      if (mouseY < thumbY) {\n        value = this.getThumbPosition_(this.thumbToMove_) +\n            this.getBlockIncrement();\n      }\n    } else {\n      var thumbH = this.thumbToMove_.offsetHeight;\n      if (mouseY > thumbY + thumbH) {\n        value = this.getThumbPosition_(this.thumbToMove_) -\n            this.getBlockIncrement();\n      }\n    }\n  } else {\n    var mouseX = this.lastMousePosition_;\n    var thumbX = this.getOffsetStart_(this.thumbToMove_);\n    if (this.incrementing_) {\n      var thumbW = this.thumbToMove_.offsetWidth;\n      if (mouseX > thumbX + thumbW) {\n        value = this.getThumbPosition_(this.thumbToMove_) +\n            this.getBlockIncrement();\n      }\n    } else {\n      if (mouseX < thumbX) {\n        value = this.getThumbPosition_(this.thumbToMove_) -\n            this.getBlockIncrement();\n      }\n    }\n  }\n\n  if (value !== undefined) {  // not all code paths sets the value variable\n    this.setThumbPosition_(this.thumbToMove_, value);\n  }\n};\n\n\n/**\n * Stops the block incrementing animation and unlistens the necessary\n * event handlers.\n * @private\n */\ngoog.ui.SliderBase.prototype.stopBlockIncrementing_ = function() {\n  if (this.incTimer_) {\n    this.incTimer_.stop();\n  }\n\n  var doc = goog.dom.getOwnerDocument(this.getElement());\n  this.getHandler()\n      .unlisten(\n          doc, goog.events.EventType.MOUSEUP, this.stopBlockIncrementing_, true)\n      .unlisten(\n          this.getElement(), goog.events.EventType.MOUSEMOVE,\n          this.storeMousePos_);\n};\n\n\n/**\n * Returns the relative mouse position to the slider.\n * @param {goog.events.Event} e  The mouse event object.\n * @return {number} The relative mouse position to the slider.\n * @private\n */\ngoog.ui.SliderBase.prototype.getRelativeMousePos_ = function(e) {\n  var coord = goog.style.getRelativePosition(e, this.getElement());\n  if (this.orientation_ == goog.ui.SliderBase.Orientation.VERTICAL) {\n    return coord.y;\n  } else {\n    if (this.flipForRtl_ && this.isRightToLeft()) {\n      return this.getElement().clientWidth - coord.x;\n    } else {\n      return coord.x;\n    }\n  }\n};\n\n\n/**\n * Stores the current mouse position so that it can be used in the timer.\n * @param {goog.events.Event} e  The mouse event object.\n * @private\n */\ngoog.ui.SliderBase.prototype.storeMousePos_ = function(e) {\n  this.lastMousePosition_ = this.getRelativeMousePos_(e);\n};\n\n\n/**\n * Returns the value to use for the current mouse position\n * @param {goog.events.Event} e  The mouse event object.\n * @return {number} The value that this mouse position represents.\n */\ngoog.ui.SliderBase.prototype.getValueFromMousePosition = function(e) {\n  var min = this.getMinimum();\n  var max = this.getMaximum();\n  if (this.orientation_ == goog.ui.SliderBase.Orientation.VERTICAL) {\n    var thumbH = this.valueThumb.offsetHeight;\n    var availH = this.getElement().clientHeight - thumbH;\n    var y = this.getRelativeMousePos_(e) - thumbH / 2;\n    return (max - min) * (availH - y) / availH + min;\n  } else {\n    var thumbW = this.valueThumb.offsetWidth;\n    var availW = this.getElement().clientWidth - thumbW;\n    var x = this.getRelativeMousePos_(e) - thumbW / 2;\n    return (max - min) * x / availW + min;\n  }\n};\n\n\n/**\n * @param {HTMLDivElement} thumb  The thumb object.\n * @return {number} The position of the specified thumb.\n * @private\n */\ngoog.ui.SliderBase.prototype.getThumbPosition_ = function(thumb) {\n  if (thumb == this.valueThumb) {\n    return this.rangeModel.getValue();\n  } else if (thumb == this.extentThumb) {\n    return this.rangeModel.getValue() + this.rangeModel.getExtent();\n  } else {\n    throw new Error('Illegal thumb element. Neither minThumb nor maxThumb');\n  }\n};\n\n\n/**\n * Returns whether a thumb is currently being dragged with the mouse (or via\n * touch). Note that changing the value with keyboard, mouswheel, or via\n * move-to-point click immediately sends a CHANGE event without going through a\n * dragged state.\n * @return {boolean} Whether a dragger is currently being dragged.\n */\ngoog.ui.SliderBase.prototype.isDragging = function() {\n  return this.valueDragger_.isDragging() || this.extentDragger_.isDragging();\n};\n\n\n/**\n * Moves the thumbs by the specified delta as follows\n * - as long as both thumbs stay within [min,max], both thumbs are moved\n * - once a thumb reaches or exceeds min (or max, respectively), it stays\n * - at min (or max, respectively).\n * In case both thumbs have reached min (or max), no change event will fire.\n * If the specified delta is smaller than the step size, it will be rounded\n * to the step size.\n * @param {number} delta The delta by which to move the selected range.\n * @suppress {strictPrimitiveOperators} Part of the go/strict_warnings_migration\n */\ngoog.ui.SliderBase.prototype.moveThumbs = function(delta) {\n  // Assume that a small delta is supposed to be at least a step.\n  if (Math.abs(delta) < this.getStep()) {\n    delta = goog.math.sign(delta) * this.getStep();\n  }\n  var newMinPos = this.getThumbPosition_(this.valueThumb) + delta;\n  var newMaxPos = this.getThumbPosition_(this.extentThumb) + delta;\n  // correct min / max positions to be within bounds\n  newMinPos = goog.math.clamp(\n      newMinPos, this.getMinimum(), this.getMaximum() - this.minExtent_);\n  newMaxPos = goog.math.clamp(\n      newMaxPos, this.getMinimum() + this.minExtent_, this.getMaximum());\n  // Set value and extent atomically\n  this.setValueAndExtent(newMinPos, newMaxPos - newMinPos);\n};\n\n\n/**\n * Sets the position of the given thumb. The set is ignored and no CHANGE event\n * fires if it violates the constraint minimum <= value (valueThumb position) <=\n * value + extent (extentThumb position) <= maximum.\n *\n * Note: To keep things simple, the setThumbPosition_ function does not have the\n * side-effect of \"correcting\" value or extent to fit the above constraint as it\n * is the case in the underlying range model. Instead, we simply ignore the\n * call. Callers must make these adjustements explicitly if they wish.\n * @param {Element} thumb The thumb whose position to set.\n * @param {number} position The position to move the thumb to.\n * @private\n */\ngoog.ui.SliderBase.prototype.setThumbPosition_ = function(thumb, position) {\n  // Round first so that all computations and checks are consistent.\n  var roundedPosition = this.rangeModel.roundToStepWithMin(position);\n  var value =\n      thumb == this.valueThumb ? roundedPosition : this.rangeModel.getValue();\n  var end = thumb == this.extentThumb ?\n      roundedPosition :\n      this.rangeModel.getValue() + this.rangeModel.getExtent();\n  if (value >= this.getMinimum() && end >= value + this.minExtent_ &&\n      this.getMaximum() >= end) {\n    this.setValueAndExtent(value, end - value);\n  }\n};\n\n\n/**\n * Sets the value and extent of the underlying range model. We enforce that\n * getMinimum() <= value <= getMaximum() - extent and\n * getMinExtent <= extent <= getMaximum() - getValue()\n * If this is not satisfied for the given extent, the call is ignored and no\n * CHANGE event fires. This is a utility method to allow setting the thumbs\n * simultaneously and ensuring that only one event fires.\n * @param {number} value The value to which to set the value.\n * @param {number} extent The value to which to set the extent.\n */\ngoog.ui.SliderBase.prototype.setValueAndExtent = function(value, extent) {\n  if (this.getMinimum() <= value && value <= this.getMaximum() - extent &&\n      this.minExtent_ <= extent && extent <= this.getMaximum() - value) {\n    if (value == this.getValue() && extent == this.getExtent()) {\n      return;\n    }\n    // because the underlying range model applies adjustements of value\n    // and extent to fit within bounds, we need to reset the extent\n    // first so these adjustements don't kick in.\n    this.rangeModel.setMute(true);\n    this.rangeModel.setExtent(0);\n    this.rangeModel.setValue(value);\n    this.rangeModel.setExtent(extent);\n    this.rangeModel.setMute(false);\n    this.handleRangeModelChange(null);\n  }\n};\n\n\n/**\n * @return {number} The minimum value.\n */\ngoog.ui.SliderBase.prototype.getMinimum = function() {\n  return this.rangeModel.getMinimum();\n};\n\n\n/**\n * Sets the minimum number.\n * @param {number} min The minimum value.\n */\ngoog.ui.SliderBase.prototype.setMinimum = function(min) {\n  this.rangeModel.setMinimum(min);\n};\n\n\n/**\n * @return {number} The maximum value.\n */\ngoog.ui.SliderBase.prototype.getMaximum = function() {\n  return this.rangeModel.getMaximum();\n};\n\n\n/**\n * Sets the maximum number.\n * @param {number} max The maximum value.\n */\ngoog.ui.SliderBase.prototype.setMaximum = function(max) {\n  this.rangeModel.setMaximum(max);\n};\n\n\n/**\n * @return {HTMLDivElement} The value thumb element.\n */\ngoog.ui.SliderBase.prototype.getValueThumb = function() {\n  return this.valueThumb;\n};\n\n\n/**\n * @return {HTMLDivElement} The extent thumb element.\n */\ngoog.ui.SliderBase.prototype.getExtentThumb = function() {\n  return this.extentThumb;\n};\n\n\n/**\n * @param {number} position The position to get the closest thumb to.\n * @return {HTMLDivElement} The thumb that is closest to the given position.\n * @private\n */\ngoog.ui.SliderBase.prototype.getClosestThumb_ = function(position) {\n  if (position <=\n      (this.rangeModel.getValue() + this.rangeModel.getExtent() / 2)) {\n    return this.valueThumb;\n  } else {\n    return this.extentThumb;\n  }\n};\n\n\n/**\n * Call back when the internal range model changes. Sub-classes may override\n * and re-enter this method to update a11y state. Consider protected.\n * @param {goog.events.Event} e The event object.\n * @protected\n */\ngoog.ui.SliderBase.prototype.handleRangeModelChange = function(e) {\n  this.updateUi_();\n  this.updateAriaStates();\n  this.dispatchEvent(goog.ui.Component.EventType.CHANGE);\n};\n\n\n/**\n * This is called when we need to update the size of the thumb. This happens\n * when first created as well as when the value and the orientation changes.\n * @private\n */\ngoog.ui.SliderBase.prototype.updateUi_ = function() {\n  if (this.valueThumb && !this.isAnimating_) {\n    var minCoord = this.getThumbCoordinateForValue(\n        this.getThumbPosition_(this.valueThumb));\n    var maxCoord = this.getThumbCoordinateForValue(\n        this.getThumbPosition_(this.extentThumb));\n\n    if (this.orientation_ == goog.ui.SliderBase.Orientation.VERTICAL) {\n      this.valueThumb.style.top = minCoord.y + 'px';\n      this.extentThumb.style.top = maxCoord.y + 'px';\n      if (this.rangeHighlight) {\n        var highlightPositioning = this.calculateRangeHighlightPositioning_(\n            maxCoord.y, minCoord.y, this.valueThumb.offsetHeight);\n        this.rangeHighlight.style.top = highlightPositioning.offset + 'px';\n        this.rangeHighlight.style.height = highlightPositioning.size + 'px';\n      }\n    } else {\n      var pos = (this.flipForRtl_ && this.isRightToLeft()) ? 'right' : 'left';\n      this.valueThumb.style[pos] = minCoord.x + 'px';\n      this.extentThumb.style[pos] = maxCoord.x + 'px';\n      if (this.rangeHighlight) {\n        var highlightPositioning = this.calculateRangeHighlightPositioning_(\n            minCoord.x, maxCoord.x, this.valueThumb.offsetWidth);\n        this.rangeHighlight.style[pos] = highlightPositioning.offset + 'px';\n        this.rangeHighlight.style.width = highlightPositioning.size + 'px';\n      }\n    }\n  }\n};\n\n\n/**\n * Calculates the start position (offset) and size of the range highlight, e.g.\n * for a horizontal slider, this will return [left, width] for the highlight.\n * @param {number} firstThumbPos The position of the first thumb along the\n *     slider axis.\n * @param {number} secondThumbPos The position of the second thumb along the\n *     slider axis, must be >= firstThumbPos.\n * @param {number} thumbSize The size of the thumb, along the slider axis.\n * @return {{offset: number, size: number}} The positioning parameters for the\n *     range highlight.\n * @private\n */\ngoog.ui.SliderBase.prototype.calculateRangeHighlightPositioning_ = function(\n    firstThumbPos, secondThumbPos, thumbSize) {\n  // Highlight is inset by half the thumb size, from the edges of the thumb.\n  var highlightInset = Math.ceil(thumbSize / 2);\n  var size = secondThumbPos - firstThumbPos + thumbSize - 2 * highlightInset;\n  // Don't return negative size since it causes an error. IE sometimes attempts\n  // to position the thumbs while slider size is 0, resulting in size < 0 here.\n  return {offset: firstThumbPos + highlightInset, size: Math.max(size, 0)};\n};\n\n\n/**\n * Returns the position to move the handle to for a given value\n * @param {number} val  The value to get the coordinate for.\n * @return {!goog.math.Coordinate} Coordinate with either x or y set.\n */\ngoog.ui.SliderBase.prototype.getThumbCoordinateForValue = function(val) {\n  var coord = new goog.math.Coordinate;\n  if (this.valueThumb) {\n    var min = this.getMinimum();\n    var max = this.getMaximum();\n\n    // This check ensures the ratio never take NaN value, which is possible when\n    // the slider min & max are same numbers (i.e. 1).\n    var ratio = (val == min && min == max) ? 0 : (val - min) / (max - min);\n\n    if (this.orientation_ == goog.ui.SliderBase.Orientation.VERTICAL) {\n      var thumbHeight = this.valueThumb.offsetHeight;\n      var h = this.getElement().clientHeight - thumbHeight;\n      var bottom = Math.round(ratio * h);\n      if (this.moveToPointEnabled_) {\n        coord.x = 0;\n      } else {\n        coord.x = this.getOffsetStart_(this.valueThumb);  // Keep x the same.\n      }\n      coord.y = h - bottom;\n    } else {\n      var w = this.getElement().clientWidth - this.valueThumb.offsetWidth;\n      var left = Math.round(ratio * w);\n      coord.x = left;\n      if (this.moveToPointEnabled_) {\n        coord.y = 0;\n      } else {\n        coord.y = this.valueThumb.offsetTop;  // Keep y the same.\n      }\n    }\n  }\n  return coord;\n};\n\n\n/**\n * Sets the value and starts animating the handle towards that position.\n * @param {number} v Value to set and animate to.\n * @suppress {strictPrimitiveOperators} Part of the go/strict_warnings_migration\n */\ngoog.ui.SliderBase.prototype.animatedSetValue = function(v) {\n  // the value might be out of bounds\n  v = goog.math.clamp(v, this.getMinimum(), this.getMaximum());\n\n  if (this.isAnimating_) {\n    this.currentAnimation_.stop(true);\n    this.currentAnimation_.dispose();\n  }\n  var animations = new goog.fx.AnimationParallelQueue();\n  var end;\n\n  var thumb = this.getClosestThumb_(v);\n  var previousValue = this.getValue();\n  var previousExtent = this.getExtent();\n  var previousThumbValue = this.getThumbPosition_(thumb);\n  var previousCoord = this.getThumbCoordinateForValue(previousThumbValue);\n  var stepSize = this.getStep();\n\n  // If the delta is less than a single step, increase it to a step, else the\n  // range model will reduce it to zero.\n  if (Math.abs(v - previousThumbValue) < stepSize) {\n    var delta = v > previousThumbValue ? stepSize : -stepSize;\n    v = previousThumbValue + delta;\n\n    // The resulting value may be out of bounds, sanitize.\n    v = goog.math.clamp(v, this.getMinimum(), this.getMaximum());\n  }\n\n  this.setThumbPosition_(thumb, v);\n  var coord = this.getThumbCoordinateForValue(this.getThumbPosition_(thumb));\n\n  if (this.orientation_ == goog.ui.SliderBase.Orientation.VERTICAL) {\n    end = [this.getOffsetStart_(thumb), coord.y];\n  } else {\n    end = [coord.x, thumb.offsetTop];\n  }\n\n  var slide = new goog.fx.dom.Slide(\n      thumb, [previousCoord.x, previousCoord.y], end,\n      goog.ui.SliderBase.ANIMATION_INTERVAL_);\n  slide.enableRightPositioningForRtl(this.flipForRtl_);\n  animations.add(slide);\n  if (this.rangeHighlight) {\n    this.addRangeHighlightAnimations_(\n        thumb, previousValue, previousExtent, coord, animations);\n  }\n\n  // Create additional animations to play if a factory has been set.\n  if (this.additionalAnimations_) {\n    var additionalAnimations = this.additionalAnimations_.createAnimations(\n        previousValue, v, goog.ui.SliderBase.ANIMATION_INTERVAL_);\n    goog.array.forEach(additionalAnimations, function(animation) {\n      animations.add(animation);\n    });\n  }\n\n  this.currentAnimation_ = animations;\n  this.getHandler().listen(\n      animations, goog.fx.Transition.EventType.END, this.endAnimation_);\n\n  this.isAnimating_ = true;\n  animations.play(false);\n};\n\n\n/**\n * @return {boolean} True if the slider is animating, false otherwise.\n */\ngoog.ui.SliderBase.prototype.isAnimating = function() {\n  return this.isAnimating_;\n};\n\n\n/**\n * Sets the factory that will be used to create additional animations to be\n * played when animating to a new value.  These animations can be for any\n * element and the animations will be played in addition to the default\n * animation(s).  The animations will also be played in the same parallel queue\n * ensuring that all animations are played at the same time.\n * @see #animatedSetValue\n *\n * @param {goog.ui.SliderBase.AnimationFactory} factory The animation factory to\n *     use.  This will not change the default animations played by the slider.\n *     It will only allow for additional animations.\n */\ngoog.ui.SliderBase.prototype.setAdditionalAnimations = function(factory) {\n  this.additionalAnimations_ = factory;\n};\n\n\n/**\n * Adds animations for the range highlight element to the animation queue.\n *\n * @param {Element} thumb The thumb that's moving, must be\n *     either valueThumb or extentThumb.\n * @param {number} previousValue The previous value of the slider.\n * @param {number} previousExtent The previous extent of the\n *     slider.\n * @param {goog.math.Coordinate} newCoord The new pixel coordinate of the\n *     thumb that's moving.\n * @param {goog.fx.AnimationParallelQueue} animations The animation queue.\n * @private\n */\ngoog.ui.SliderBase.prototype.addRangeHighlightAnimations_ = function(\n    thumb, previousValue, previousExtent, newCoord, animations) {\n  var previousMinCoord = this.getThumbCoordinateForValue(previousValue);\n  var previousMaxCoord =\n      this.getThumbCoordinateForValue(previousValue + previousExtent);\n  var minCoord = previousMinCoord;\n  var maxCoord = previousMaxCoord;\n  if (thumb == this.valueThumb) {\n    minCoord = newCoord;\n  } else {\n    maxCoord = newCoord;\n  }\n\n  if (this.orientation_ == goog.ui.SliderBase.Orientation.VERTICAL) {\n    var previousHighlightPositioning = this.calculateRangeHighlightPositioning_(\n        previousMaxCoord.y, previousMinCoord.y, this.valueThumb.offsetHeight);\n    var highlightPositioning = this.calculateRangeHighlightPositioning_(\n        maxCoord.y, minCoord.y, this.valueThumb.offsetHeight);\n    var slide = new goog.fx.dom.Slide(\n        this.rangeHighlight,\n        [\n          this.getOffsetStart_(this.rangeHighlight),\n          previousHighlightPositioning.offset\n        ],\n        [\n          this.getOffsetStart_(this.rangeHighlight), highlightPositioning.offset\n        ],\n        goog.ui.SliderBase.ANIMATION_INTERVAL_);\n    var resizeHeight = new goog.fx.dom.ResizeHeight(\n        this.rangeHighlight, previousHighlightPositioning.size,\n        highlightPositioning.size, goog.ui.SliderBase.ANIMATION_INTERVAL_);\n    slide.enableRightPositioningForRtl(this.flipForRtl_);\n    resizeHeight.enableRightPositioningForRtl(this.flipForRtl_);\n    animations.add(slide);\n    animations.add(resizeHeight);\n  } else {\n    var previousHighlightPositioning = this.calculateRangeHighlightPositioning_(\n        previousMinCoord.x, previousMaxCoord.x, this.valueThumb.offsetWidth);\n    var highlightPositioning = this.calculateRangeHighlightPositioning_(\n        minCoord.x, maxCoord.x, this.valueThumb.offsetWidth);\n    var slide = new goog.fx.dom.Slide(\n        this.rangeHighlight,\n        [previousHighlightPositioning.offset, this.rangeHighlight.offsetTop],\n        [highlightPositioning.offset, this.rangeHighlight.offsetTop],\n        goog.ui.SliderBase.ANIMATION_INTERVAL_);\n    var resizeWidth = new goog.fx.dom.ResizeWidth(\n        this.rangeHighlight, previousHighlightPositioning.size,\n        highlightPositioning.size, goog.ui.SliderBase.ANIMATION_INTERVAL_);\n    slide.enableRightPositioningForRtl(this.flipForRtl_);\n    resizeWidth.enableRightPositioningForRtl(this.flipForRtl_);\n    animations.add(slide);\n    animations.add(resizeWidth);\n  }\n};\n\n\n/**\n * Sets the isAnimating_ field to false once the animation is done.\n * @param {goog.fx.AnimationEvent} e Event object passed by the animation\n *     object.\n * @private\n */\ngoog.ui.SliderBase.prototype.endAnimation_ = function(e) {\n  this.isAnimating_ = false;\n  this.dispatchEvent(goog.ui.SliderBase.EventType.ANIMATION_END);\n};\n\n\n/**\n * Changes the orientation.\n * @param {goog.ui.SliderBase.Orientation} orient The orientation.\n */\ngoog.ui.SliderBase.prototype.setOrientation = function(orient) {\n  if (this.orientation_ != orient) {\n    var oldCss = this.getCssClass(this.orientation_);\n    var newCss = this.getCssClass(orient);\n    this.orientation_ = orient;\n\n    // Update the DOM\n    if (this.getElement()) {\n      goog.dom.classlist.swap(\n          goog.asserts.assert(this.getElement()), oldCss, newCss);\n      // we need to reset the left and top, plus range highlight\n      var pos = (this.flipForRtl_ && this.isRightToLeft()) ? 'right' : 'left';\n      this.valueThumb.style[pos] = this.valueThumb.style.top = '';\n      this.extentThumb.style[pos] = this.extentThumb.style.top = '';\n      if (this.rangeHighlight) {\n        this.rangeHighlight.style[pos] = this.rangeHighlight.style.top = '';\n        this.rangeHighlight.style.width = this.rangeHighlight.style.height = '';\n      }\n      this.updateUi_();\n    }\n  }\n};\n\n\n/**\n * @return {goog.ui.SliderBase.Orientation} the orientation of the slider.\n */\ngoog.ui.SliderBase.prototype.getOrientation = function() {\n  return this.orientation_;\n};\n\n\n/** @override */\ngoog.ui.SliderBase.prototype.disposeInternal = function() {\n  goog.ui.SliderBase.superClass_.disposeInternal.call(this);\n  if (this.incTimer_) {\n    this.incTimer_.dispose();\n  }\n  delete this.incTimer_;\n  if (this.currentAnimation_) {\n    this.currentAnimation_.dispose();\n  }\n  delete this.currentAnimation_;\n  delete this.valueThumb;\n  delete this.extentThumb;\n  if (this.rangeHighlight) {\n    delete this.rangeHighlight;\n  }\n  this.rangeModel.dispose();\n  delete this.rangeModel;\n  if (this.keyHandler_) {\n    this.keyHandler_.dispose();\n    delete this.keyHandler_;\n  }\n  if (this.mouseWheelHandler_) {\n    this.mouseWheelHandler_.dispose();\n    delete this.mouseWheelHandler_;\n  }\n  if (this.valueDragger_) {\n    this.valueDragger_.dispose();\n    delete this.valueDragger_;\n  }\n  if (this.extentDragger_) {\n    this.extentDragger_.dispose();\n    delete this.extentDragger_;\n  }\n};\n\n\n/**\n * @return {number} The amount to increment/decrement for page up/down as well\n *     as when holding down the mouse button on the background.\n */\ngoog.ui.SliderBase.prototype.getBlockIncrement = function() {\n  return this.blockIncrement_;\n};\n\n\n/**\n * Sets the amount to increment/decrement for page up/down as well as when\n * holding down the mouse button on the background.\n *\n * @param {number} value The value to set the block increment to.\n */\ngoog.ui.SliderBase.prototype.setBlockIncrement = function(value) {\n  this.blockIncrement_ = value;\n};\n\n\n/**\n * Sets the minimal value that the extent may have.\n *\n * @param {number} value The minimal value for the extent.\n */\ngoog.ui.SliderBase.prototype.setMinExtent = function(value) {\n  this.minExtent_ = value;\n};\n\n\n/**\n * The amount to increment/decrement for up, down, left and right arrow keys\n * and mouse wheel events.\n * @private\n * @type {number}\n */\ngoog.ui.SliderBase.prototype.unitIncrement_ = 1;\n\n\n/**\n * @return {number} The amount to increment/decrement for up, down, left and\n *     right arrow keys and mouse wheel events.\n */\ngoog.ui.SliderBase.prototype.getUnitIncrement = function() {\n  return this.unitIncrement_;\n};\n\n\n/**\n * Sets the amount to increment/decrement for up, down, left and right arrow\n * keys and mouse wheel events.\n * @param {number} value  The value to set the unit increment to.\n */\ngoog.ui.SliderBase.prototype.setUnitIncrement = function(value) {\n  this.unitIncrement_ = value;\n};\n\n\n/**\n * @return {?number} The step value used to determine how to round the value.\n */\ngoog.ui.SliderBase.prototype.getStep = function() {\n  return this.rangeModel.getStep();\n};\n\n\n/**\n * Sets the step value. The step value is used to determine how to round the\n * value.\n * @param {?number} step  The step size.\n */\ngoog.ui.SliderBase.prototype.setStep = function(step) {\n  this.rangeModel.setStep(step);\n};\n\n\n/**\n * @return {boolean} Whether clicking on the backgtround should move directly to\n *     that point.\n */\ngoog.ui.SliderBase.prototype.getMoveToPointEnabled = function() {\n  return this.moveToPointEnabled_;\n};\n\n\n/**\n * Sets whether clicking on the background should move directly to that point.\n * @param {boolean} val Whether clicking on the background should move directly\n *     to that point.\n */\ngoog.ui.SliderBase.prototype.setMoveToPointEnabled = function(val) {\n  this.moveToPointEnabled_ = val;\n};\n\n\n/**\n * @return {number} The value of the underlying range model.\n */\ngoog.ui.SliderBase.prototype.getValue = function() {\n  return this.rangeModel.getValue();\n};\n\n\n/**\n * Sets the value of the underlying range model. We enforce that\n * getMinimum() <= value <= getMaximum() - getExtent()\n * If this is not satisifed for the given value, the call is ignored and no\n * CHANGE event fires.\n * @param {number} value The value.\n */\ngoog.ui.SliderBase.prototype.setValue = function(value) {\n  // Set the position through the thumb method to enforce constraints.\n  this.setThumbPosition_(this.valueThumb, value);\n};\n\n\n/**\n * @return {number} The value of the extent of the underlying range model.\n */\ngoog.ui.SliderBase.prototype.getExtent = function() {\n  return this.rangeModel.getExtent();\n};\n\n\n/**\n * Sets the extent of the underlying range model. We enforce that\n * getMinExtent() <= extent <= getMaximum() - getValue()\n * If this is not satisifed for the given extent, the call is ignored and no\n * CHANGE event fires.\n * @param {number} extent The value to which to set the extent.\n */\ngoog.ui.SliderBase.prototype.setExtent = function(extent) {\n  // Set the position through the thumb method to enforce constraints.\n  this.setThumbPosition_(\n      this.extentThumb, (this.rangeModel.getValue() + extent));\n};\n\n\n/**\n * Change the visibility of the slider.\n * You must call this if you had set the slider's value when it was invisible.\n * @param {boolean} visible Whether to show the slider.\n */\ngoog.ui.SliderBase.prototype.setVisible = function(visible) {\n  goog.style.setElementShown(this.getElement(), visible);\n  if (visible) {\n    this.updateUi_();\n  }\n};\n\n\n/**\n * Set a11y roles and state.\n * @protected\n */\ngoog.ui.SliderBase.prototype.setAriaRoles = function() {\n  var el = this.getElement();\n  goog.asserts.assert(\n      el, 'The DOM element for the slider base cannot be null.');\n  goog.a11y.aria.setRole(el, goog.a11y.aria.Role.SLIDER);\n  this.updateAriaStates();\n};\n\n\n/**\n * Set a11y roles and state when values change.\n * @protected\n */\ngoog.ui.SliderBase.prototype.updateAriaStates = function() {\n  var element = this.getElement();\n  if (element) {\n    goog.a11y.aria.setState(\n        element, goog.a11y.aria.State.VALUEMIN, this.getMinimum());\n    goog.a11y.aria.setState(\n        element, goog.a11y.aria.State.VALUEMAX, this.getMaximum());\n    goog.a11y.aria.setState(\n        element, goog.a11y.aria.State.VALUENOW, this.getValue());\n    // Passing an empty value to setState will restore the default.\n    goog.a11y.aria.setState(\n        element, goog.a11y.aria.State.VALUETEXT, this.getTextValue() || '');\n  }\n};\n\n\n/**\n * Enables or disables mouse wheel handling for the slider. The mouse wheel\n * handler enables the user to change the value of slider using a mouse wheel.\n *\n * @param {boolean} enable Whether to enable mouse wheel handling.\n */\ngoog.ui.SliderBase.prototype.setHandleMouseWheel = function(enable) {\n  if (this.isInDocument() && enable != this.isHandleMouseWheel()) {\n    this.enableMouseWheelHandling_(enable);\n  }\n\n  this.isHandleMouseWheel_ = enable;\n};\n\n\n/**\n * @return {boolean} Whether the slider handles mousewheel.\n */\ngoog.ui.SliderBase.prototype.isHandleMouseWheel = function() {\n  return this.isHandleMouseWheel_;\n};\n\n\n/**\n * Enable/Disable mouse wheel handling.\n * @param {boolean} enable Whether to enable mouse wheel handling.\n * @private\n */\ngoog.ui.SliderBase.prototype.enableMouseWheelHandling_ = function(enable) {\n  if (enable) {\n    if (!this.mouseWheelHandler_) {\n      this.mouseWheelHandler_ =\n          new goog.events.MouseWheelHandler(this.getElement());\n    }\n    this.getHandler().listen(\n        this.mouseWheelHandler_,\n        goog.events.MouseWheelHandler.EventType.MOUSEWHEEL,\n        this.handleMouseWheel_, {passive: false});\n  } else {\n    this.getHandler().unlisten(\n        this.mouseWheelHandler_,\n        goog.events.MouseWheelHandler.EventType.MOUSEWHEEL,\n        this.handleMouseWheel_, {passive: false});\n  }\n};\n\n\n/**\n * Enables or disables the slider. A disabled slider will ignore all\n * user-initiated events. Also fires goog.ui.Component.EventType.ENABLE/DISABLE\n * event as appropriate.\n * @param {boolean} enable Whether to enable the slider or not.\n */\ngoog.ui.SliderBase.prototype.setEnabled = function(enable) {\n  if (this.enabled_ == enable) {\n    return;\n  }\n\n  var eventType = enable ? goog.ui.Component.EventType.ENABLE :\n                           goog.ui.Component.EventType.DISABLE;\n  if (this.dispatchEvent(eventType)) {\n    this.enabled_ = enable;\n    this.enableEventHandlers_(enable);\n    if (!enable) {\n      // Disabling a slider is equivalent to a mouse up event when the block\n      // increment (if happening) should be halted and any possible event\n      // handlers be appropriately unlistened.\n      this.stopBlockIncrementing_();\n    }\n    goog.dom.classlist.enable(\n        goog.asserts.assert(this.getElement()),\n        goog.ui.SliderBase.DISABLED_CSS_CLASS_, !enable);\n  }\n};\n\n\n/**\n * @return {boolean} Whether the slider is enabled or not.\n */\ngoog.ui.SliderBase.prototype.isEnabled = function() {\n  return this.enabled_;\n};\n\n\n/**\n * @param {Element} element An element for which we want offsetLeft.\n * @return {number} Returns the element's offsetLeft, accounting for RTL if\n *     flipForRtl_ is true.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.SliderBase.prototype.getOffsetStart_ = function(element) {\n  return this.flipForRtl_ ? goog.style.bidi.getOffsetStart(element) :\n                            element.offsetLeft;\n};\n\n\n/**\n * @return {?string} The text value for the slider's current value, or null if\n *     unavailable.\n */\ngoog.ui.SliderBase.prototype.getTextValue = function() {\n  return this.labelFn_(this.getValue());\n};\n\n\n/**\n * Sets whether focus will be moved to the top-level element when the slider is\n * dragged.\n * @param {boolean} focusElementOnSliderDrag\n */\ngoog.ui.SliderBase.prototype.setFocusElementOnSliderDrag = function(\n    focusElementOnSliderDrag) {\n  this.focusElementOnSliderDrag_ = focusElementOnSliderDrag;\n};\n\n\n/**\n * The factory for creating additional animations to be played when animating to\n * a new value.\n * @interface\n */\ngoog.ui.SliderBase.AnimationFactory = function() {};\n\n\n/**\n * Creates an additional animation to play when animating to a new value.\n *\n * @param {number} previousValue The previous value (before animation).\n * @param {number} newValue The new value (after animation).\n * @param {number} interval The animation interval.\n * @return {!Array<!goog.fx.TransitionBase>} The additional animations to play.\n */\ngoog.ui.SliderBase.AnimationFactory.prototype.createAnimations;\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","~$goog.fx.dom.ResizeWidth","^><","^;<","~$goog.fx.AnimationParallelQueue","^:;","~$goog.style.bidi","~$goog.ui.RangeModel","~$goog.a11y.aria","^:=","^;G","~$goog.events.KeyHandler","^9>","~$goog.fx.dom.Slide","~$goog.fx.Dragger","^:I","^>8","~$goog.fx.dom.ResizeHeight","^<7","^>Q","^<2","~$goog.a11y.aria.State","^<3","^>R","^;9","^:N","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/sliderbase.js"],"^:1",["^9K",["~$goog.ui.SliderBase.Orientation","~$goog.ui.SliderBase.AnimationFactory","~$goog.ui.SliderBase"]],"^9<",true,"^9=",["^9>","^><","^?H","^;G","^?M","^;9","^:E","^;;","^;=","^:;","^:N","^:I","^>R","^?I","^<7","^;<","^?E","^?K","^>Q","^?L","^?D","^?J","^<2","^>8","^<3","^?F","^:=","^?G"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.toolbarseparator.js","^9C",["^9D","goog/ui/toolbarseparator.js"],"^9E","goog/ui/toolbarseparator.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A toolbar separator control.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ToolbarSeparator');\n\ngoog.require('goog.ui.Separator');\ngoog.require('goog.ui.ToolbarSeparatorRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * A separator control for a toolbar.\n *\n * @param {goog.ui.ToolbarSeparatorRenderer=} opt_renderer Renderer to render or\n *    decorate the separator; defaults to\n *     {@link goog.ui.ToolbarSeparatorRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *    document interaction.\n * @constructor\n * @extends {goog.ui.Separator}\n * @final\n */\ngoog.ui.ToolbarSeparator = function(opt_renderer, opt_domHelper) {\n  goog.ui.Separator.call(\n      this, opt_renderer || goog.ui.ToolbarSeparatorRenderer.getInstance(),\n      opt_domHelper);\n};\ngoog.inherits(goog.ui.ToolbarSeparator, goog.ui.Separator);\n\n\n// Registers a decorator factory function for toolbar separators.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.ToolbarSeparatorRenderer.CSS_CLASS,\n    function() { return new goog.ui.ToolbarSeparator(); });\n","^9I",1579837703000,"^9J",["^9K",["~$goog.ui.Separator","^9>","^:>","~$goog.ui.ToolbarSeparatorRenderer"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/toolbarseparator.js"],"^:1",["^9K",["~$goog.ui.ToolbarSeparator"]],"^9<",true,"^9=",["^9>","^?Q","^?R","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.crypt.bytestring_perf.js","^9C",["^9D","goog/crypt/bytestring_perf.js"],"^9E","goog/crypt/bytestring_perf.js","^9F","^9G","^9H","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Performance test for different implementations of\n * byteArrayToString.\n */\n\n\ngoog.provide('goog.crypt.byteArrayToStringPerf');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.testing.PerformanceTable');\n\ngoog.setTestOnly('goog.crypt.byteArrayToStringPerf');\n\n\nvar table = new goog.testing.PerformanceTable(goog.dom.getElement('perfTable'));\n\n\nvar BYTES_LENGTH = Math.pow(2, 20);\nvar CHUNK_SIZE = 8192;\n\nfunction getBytes() {\n  var bytes = [];\n  for (var i = 0; i < BYTES_LENGTH; i++) {\n    bytes.push('A'.charCodeAt(0));\n  }\n  return bytes;\n}\n\nfunction copyAndSpliceByteArray(bytes) {\n  // Copy the passed byte array since we're going to destroy it.\n  var remainingBytes = goog.array.clone(bytes);\n  var strings = [];\n\n  // Convert each chunk to a string.\n  while (remainingBytes.length) {\n    var chunk = goog.array.splice(remainingBytes, 0, CHUNK_SIZE);\n    strings.push(String.fromCharCode.apply(null, chunk));\n  }\n  return strings.join('');\n}\n\nfunction sliceByteArrayConcat(bytes) {\n  var str = '';\n  for (var i = 0; i < bytes.length; i += CHUNK_SIZE) {\n    var chunk = goog.array.slice(bytes, i, i + CHUNK_SIZE);\n    str += String.fromCharCode.apply(null, chunk);\n  }\n  return str;\n}\n\n\nfunction sliceByteArrayJoin(bytes) {\n  var strings = [];\n  for (var i = 0; i < bytes.length; i += CHUNK_SIZE) {\n    var chunk = goog.array.slice(bytes, i, i + CHUNK_SIZE);\n    strings.push(String.fromCharCode.apply(null, chunk));\n  }\n  return strings.join('');\n}\n\nfunction mapByteArray(bytes) {\n  var strings = goog.array.map(bytes, String.fromCharCode);\n  return strings.join('');\n}\n\nfunction forLoopByteArrayConcat(bytes) {\n  var str = '';\n  for (var i = 0; i < bytes.length; i++) {\n    str += String.fromCharCode(bytes[i]);\n  }\n  return str;\n}\n\nfunction forLoopByteArrayJoin(bytes) {\n  var strs = [];\n  for (var i = 0; i < bytes.length; i++) {\n    strs.push(String.fromCharCode(bytes[i]));\n  }\n  return strs.join('');\n}\n\n\nfunction run() {\n  var bytes = getBytes();\n  table.run(\n      goog.partial(copyAndSpliceByteArray, getBytes()),\n      'Copy array and splice out chunks.');\n\n  table.run(\n      goog.partial(sliceByteArrayConcat, getBytes()),\n      'Slice out copies of the byte array, concatenating results');\n\n  table.run(\n      goog.partial(sliceByteArrayJoin, getBytes()),\n      'Slice out copies of the byte array, joining results');\n\n  table.run(\n      goog.partial(forLoopByteArrayConcat, getBytes()),\n      'Use for loop with concat.');\n\n  table.run(\n      goog.partial(forLoopByteArrayJoin, getBytes()),\n      'Use for loop with join.');\n\n  // Purposefully commented out. This ends up being tremendously expensive.\n  // table.run(goog.partial(mapByteArray, getBytes()),\n  //           'Use goog.array.map and fromCharCode.');\n}\n\nrun();\n","^9I",1579837703000,"^9J",["^9K",["^;;","^9>","~$goog.testing.PerformanceTable","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/bytestring_perf.js"],"^:1",["^9K",["~$goog.crypt.byteArrayToStringPerf"]],"^9<",true,"^9=",["^9>","^;9","^;;","^?T"]],["^ ","^9A",[1579837703000],"^9B","goog.graphics.ext.rectangle.js","^9C",["^9D","goog/graphics/ext/rectangle.js"],"^9E","goog/graphics/ext/rectangle.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A thick wrapper around rectangles.\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.graphics.ext.Rectangle');\n\ngoog.forwardDeclare('goog.graphics.ext.Group');\ngoog.require('goog.graphics.ext.StrokeAndFillElement');\n\n\n\n/**\n * Wrapper for a graphics rectangle element.\n * @param {goog.graphics.ext.Group} group Parent for this element.\n * @constructor\n * @extends {goog.graphics.ext.StrokeAndFillElement}\n * @final\n */\ngoog.graphics.ext.Rectangle = function(group) {\n  // Initialize with some stock values.\n  var wrapper = group.getGraphicsImplementation().drawRect(\n      0, 0, 1, 1, null, null, group.getWrapper());\n  goog.graphics.ext.StrokeAndFillElement.call(this, group, wrapper);\n};\ngoog.inherits(\n    goog.graphics.ext.Rectangle, goog.graphics.ext.StrokeAndFillElement);\n\n\n/**\n * Redraw the rectangle.  Called when the coordinate system is changed.\n * @protected\n * @override\n */\ngoog.graphics.ext.Rectangle.prototype.redraw = function() {\n  goog.graphics.ext.Rectangle.superClass_.redraw.call(this);\n\n  // Our position is already handled by transform_.\n  this.getWrapper().setSize(this.getWidth(), this.getHeight());\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.graphics.ext.StrokeAndFillElement"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/ext/rectangle.js"],"^:1",["^9K",["~$goog.graphics.ext.Rectangle"]],"^9<",true,"^9=",["^9>","^?V"]],["^ ","^9A",[1579837703000],"^9B","goog.messaging.portchannel.js","^9C",["^9D","goog/messaging/portchannel.js"],"^9E","goog/messaging/portchannel.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A class that wraps several types of HTML5 message-passing\n * entities ({@link MessagePort}s, {@link WebWorker}s, and {@link Window}s),\n * providing a unified interface.\n *\n * This is tested under Chrome, Safari, and Firefox. Since Firefox 3.6 has an\n * incomplete implementation of web workers, it doesn't support sending ports\n * over Window connections. IE has no web worker support at all, and so is\n * unsupported by this class.\n *\n */\n\ngoog.provide('goog.messaging.PortChannel');\n\ngoog.require('goog.Timer');\ngoog.require('goog.array');\ngoog.require('goog.async.Deferred');\ngoog.require('goog.debug');\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.json');\ngoog.require('goog.log');\ngoog.require('goog.messaging.AbstractChannel');\ngoog.require('goog.messaging.DeferredChannel');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A wrapper for several types of HTML5 message-passing entities\n * ({@link MessagePort}s and {@link WebWorker}s). This class implements the\n * {@link goog.messaging.MessageChannel} interface.\n *\n * This class can be used in conjunction with other communication on the port.\n * It sets {@link goog.messaging.PortChannel.FLAG} to true on all messages it\n * sends.\n *\n * @param {!MessagePort|!WebWorker} underlyingPort The message-passing\n *     entity to wrap. If this is a {@link MessagePort}, it should be started.\n *     The remote end should also be wrapped in a PortChannel. This will be\n *     disposed along with the PortChannel; this means terminating it if it's a\n *     worker or removing it from the DOM if it's an iframe.\n * @constructor\n * @extends {goog.messaging.AbstractChannel}\n * @final\n */\ngoog.messaging.PortChannel = function(underlyingPort) {\n  goog.messaging.PortChannel.base(this, 'constructor');\n\n  /**\n   * The wrapped message-passing entity.\n   * @type {!MessagePort|!WebWorker}\n   * @private\n   */\n  this.port_ = underlyingPort;\n\n  /**\n   * The key for the event listener.\n   * @type {goog.events.Key}\n   * @private\n   */\n  this.listenerKey_ = goog.events.listen(\n      this.port_, goog.events.EventType.MESSAGE, this.deliver_, false, this);\n};\ngoog.inherits(goog.messaging.PortChannel, goog.messaging.AbstractChannel);\n\n\n/**\n * Create a PortChannel that communicates with a window embedded in the current\n * page (e.g. an iframe contentWindow). The code within the window should call\n * {@link forGlobalWindow} to establish the connection.\n *\n * It's possible to use this channel in conjunction with other messages to the\n * embedded window. However, only one PortChannel should be used for a given\n * window at a time.\n *\n * @param {!Window} peerWindow The window object to communicate with.\n * @param {string} peerOrigin The expected origin of the window. See\n *     http://dev.w3.org/html5/postmsg/#dom-window-postmessage.\n * @param {goog.Timer=} opt_timer The timer that regulates how often the initial\n *     connection message is attempted. This will be automatically disposed once\n *     the connection is established, or when the connection is cancelled.\n * @return {!goog.messaging.DeferredChannel} The PortChannel. Although this is\n *     not actually an instance of the PortChannel class, it will behave like\n *     one in that MessagePorts may be sent across it. The DeferredChannel may\n *     be cancelled before a connection is established in order to abort the\n *     attempt to make a connection.\n */\ngoog.messaging.PortChannel.forEmbeddedWindow = function(\n    peerWindow, peerOrigin, opt_timer) {\n  if (peerOrigin == '*') {\n    return new goog.messaging.DeferredChannel(\n        goog.async.Deferred.fail(new Error('Invalid origin')));\n  }\n\n  var timer = opt_timer || new goog.Timer(50);\n\n  var disposeTimer = goog.partial(goog.dispose, timer);\n  var deferred = new goog.async.Deferred(disposeTimer);\n  deferred.addBoth(disposeTimer);\n\n  timer.start();\n  // Every tick, attempt to set up a connection by sending in one end of an\n  // HTML5 MessageChannel. If the inner window posts a response along a channel,\n  // then we'll use that channel to create the PortChannel.\n  //\n  // As per http://dev.w3.org/html5/postmsg/#ports-and-garbage-collection, any\n  // ports that are not ultimately used to set up the channel will be garbage\n  // collected (since there are no references in this context, and the remote\n  // context hasn't seen them).\n  goog.events.listen(timer, goog.Timer.TICK, function() {\n    var channel = new MessageChannel();\n    var gotMessage = function(e) {\n      channel.port1.removeEventListener(\n          goog.events.EventType.MESSAGE, gotMessage, true);\n      // If the connection has been cancelled, don't create the channel.\n      if (!timer.isDisposed()) {\n        deferred.callback(new goog.messaging.PortChannel(channel.port1));\n      }\n    };\n    channel.port1.start();\n    // Don't use goog.events because we don't want any lingering references to\n    // the ports to prevent them from getting GCed. Only modern browsers support\n    // these APIs anyway, so we don't need to worry about event API\n    // compatibility.\n    channel.port1.addEventListener(\n        goog.events.EventType.MESSAGE, gotMessage, true);\n\n    var msg = {};\n    msg[goog.messaging.PortChannel.FLAG] = true;\n    peerWindow.postMessage(msg, peerOrigin, [channel.port2]);\n  });\n\n  return new goog.messaging.DeferredChannel(deferred);\n};\n\n\n/**\n * Create a PortChannel that communicates with the document in which this window\n * is embedded (e.g. within an iframe). The enclosing document should call\n * {@link forEmbeddedWindow} to establish the connection.\n *\n * It's possible to use this channel in conjunction with other messages posted\n * to the global window. However, only one PortChannel should be used for the\n * global window at a time.\n *\n * @param {string} peerOrigin The expected origin of the enclosing document. See\n *     http://dev.w3.org/html5/postmsg/#dom-window-postmessage.\n * @return {!goog.messaging.MessageChannel} The PortChannel. Although this may\n *     not actually be an instance of the PortChannel class, it will behave like\n *     one in that MessagePorts may be sent across it.\n */\ngoog.messaging.PortChannel.forGlobalWindow = function(peerOrigin) {\n  if (peerOrigin == '*') {\n    return new goog.messaging.DeferredChannel(\n        goog.async.Deferred.fail(new Error('Invalid origin')));\n  }\n\n  var deferred = new goog.async.Deferred();\n  // Wait for the external page to post a message containing the message port\n  // which we'll use to set up the PortChannel. Ignore all other messages. Once\n  // we receive the port, notify the other end and then set up the PortChannel.\n  var key =\n      goog.events.listen(window, goog.events.EventType.MESSAGE, function(e) {\n        var browserEvent = e.getBrowserEvent();\n        var data = browserEvent.data;\n        if (!goog.isObject(data) || !data[goog.messaging.PortChannel.FLAG]) {\n          return;\n        }\n\n        if (window.parent != browserEvent.source ||\n            peerOrigin != browserEvent.origin) {\n          return;\n        }\n\n        var port = browserEvent.ports[0];\n        // Notify the other end of the channel that we've received our port\n        port.postMessage({});\n\n        port.start();\n        deferred.callback(new goog.messaging.PortChannel(port));\n        goog.events.unlistenByKey(key);\n      });\n  return new goog.messaging.DeferredChannel(deferred);\n};\n\n\n/**\n * The flag added to messages that are sent by a PortChannel, and are meant to\n * be handled by one on the other side.\n * @type {string}\n */\ngoog.messaging.PortChannel.FLAG = '--goog.messaging.PortChannel';\n\n\n/**\n * Whether the messages sent across the channel must be JSON-serialized. This is\n * required for older versions of Webkit, which can only send string messages.\n *\n * Although Safari and Chrome have separate implementations of message passing,\n * both of them support passing objects by Webkit 533.\n *\n * @type {boolean}\n * @private\n */\ngoog.messaging.PortChannel.REQUIRES_SERIALIZATION_ = goog.userAgent.WEBKIT &&\n    goog.string.compareVersions(goog.userAgent.VERSION, '533') < 0;\n\n\n/**\n * Logger for this class.\n * @type {goog.log.Logger}\n * @protected\n * @override\n */\ngoog.messaging.PortChannel.prototype.logger =\n    goog.log.getLogger('goog.messaging.PortChannel');\n\n\n/**\n * Sends a message over the channel.\n *\n * As an addition to the basic MessageChannel send API, PortChannels can send\n * objects that contain MessagePorts. Note that only plain Objects and Arrays,\n * not their subclasses, can contain MessagePorts.\n *\n * As per {@link http://www.w3.org/TR/html5/comms.html#clone-a-port}, once a\n * port is copied to be sent across a channel, the original port will cease\n * being able to send or receive messages.\n *\n * @override\n * @param {string} serviceName The name of the service this message should be\n *     delivered to.\n * @param {string|!Object|!MessagePort} payload The value of the message. May\n *     contain MessagePorts or be a MessagePort.\n */\ngoog.messaging.PortChannel.prototype.send = function(serviceName, payload) {\n  var ports = [];\n  payload = this.extractPorts_(ports, payload);\n  var message = {'serviceName': serviceName, 'payload': payload};\n  message[goog.messaging.PortChannel.FLAG] = true;\n\n  if (goog.messaging.PortChannel.REQUIRES_SERIALIZATION_) {\n    message = goog.json.serialize(message);\n  }\n\n  // Avoid a type error by casting to unknown as the type checker doesn't\n  // know which variant we are calling here.\n  this.port_.postMessage(/** @type {?} */ (message), ports);\n};\n\n\n/**\n * Delivers a message to the appropriate service handler. If this message isn't\n * a GearsWorkerChannel message, it's ignored and passed on to other handlers.\n *\n * @param {goog.events.Event} e The event.\n * @private\n */\ngoog.messaging.PortChannel.prototype.deliver_ = function(e) {\n  var browserEvent = e.getBrowserEvent();\n  var data = browserEvent.data;\n\n  if (goog.messaging.PortChannel.REQUIRES_SERIALIZATION_) {\n    try {\n      data = JSON.parse(data);\n    } catch (error) {\n      // Ignore any non-JSON messages.\n      return;\n    }\n  }\n\n  if (!goog.isObject(data) || !data[goog.messaging.PortChannel.FLAG]) {\n    return;\n  }\n\n  if (this.validateMessage_(data)) {\n    var serviceName = data['serviceName'];\n    var payload = data['payload'];\n    var service = this.getService(serviceName, payload);\n    if (!service) {\n      return;\n    }\n\n    payload = this.decodePayload(\n        serviceName, this.injectPorts_(browserEvent.ports || [], payload),\n        service.objectPayload);\n    if (payload != null) {\n      service.callback(payload);\n    }\n  }\n};\n\n\n/**\n * Checks whether the message is invalid in some way.\n *\n * @param {Object} data The contents of the message.\n * @return {boolean} True if the message is valid, false otherwise.\n * @private\n */\ngoog.messaging.PortChannel.prototype.validateMessage_ = function(data) {\n  if (!('serviceName' in data)) {\n    goog.log.warning(\n        this.logger,\n        'Message object doesn\\'t contain service name: ' +\n            goog.debug.deepExpose(data));\n    return false;\n  }\n\n  if (!('payload' in data)) {\n    goog.log.warning(\n        this.logger,\n        'Message object doesn\\'t contain payload: ' +\n            goog.debug.deepExpose(data));\n    return false;\n  }\n\n  return true;\n};\n\n\n/**\n * Extracts all MessagePort objects from a message to be sent into an array.\n *\n * The message ports are replaced by placeholder objects that will be replaced\n * with the ports again on the other side of the channel.\n *\n * @param {Array<MessagePort>} ports The array that will contain ports\n *     extracted from the message. Will be destructively modified. Should be\n *     empty initially.\n * @param {string|!Object} message The message from which ports will be\n *     extracted.\n * @return {string|!Object} The message with ports extracted.\n * @private\n */\ngoog.messaging.PortChannel.prototype.extractPorts_ = function(ports, message) {\n  // Can't use instanceof here because MessagePort is undefined in workers\n  if (message &&\n      Object.prototype.toString.call(/** @type {!Object} */ (message)) ==\n          '[object MessagePort]') {\n    ports.push(/** @type {MessagePort} */ (message));\n    return {'_port': {'type': 'real', 'index': ports.length - 1}};\n  } else if (goog.isArray(message)) {\n    return goog.array.map(message, goog.bind(this.extractPorts_, this, ports));\n    // We want to compare the exact constructor here because we only want to\n    // recurse into object literals, not native objects like Date.\n  } else if (message && message.constructor == Object) {\n    return goog.object.map(\n        /** @type {!Object} */ (message), function(val, key) {\n          val = this.extractPorts_(ports, val);\n          return key == '_port' ? {'type': 'escaped', 'val': val} : val;\n        }, this);\n  } else {\n    return message;\n  }\n};\n\n\n/**\n * Injects MessagePorts back into a message received from across the channel.\n *\n * @param {Array<MessagePort>} ports The array of ports to be injected into the\n *     message.\n * @param {string|!Object} message The message into which the ports will be\n *     injected.\n * @return {string|!Object} The message with ports injected.\n * @private\n */\ngoog.messaging.PortChannel.prototype.injectPorts_ = function(ports, message) {\n  if (goog.isArray(message)) {\n    return goog.array.map(message, goog.bind(this.injectPorts_, this, ports));\n  } else if (message && message.constructor == Object) {\n    message = /** @type {!Object} */ (message);\n    if (message['_port'] && message['_port']['type'] == 'real') {\n      return /** @type {!MessagePort} */ (ports[message['_port']['index']]);\n    }\n    return goog.object.map(message, function(val, key) {\n      return this.injectPorts_(ports, key == '_port' ? val['val'] : val);\n    }, this);\n  } else {\n    return message;\n  }\n};\n\n\n/** @override */\ngoog.messaging.PortChannel.prototype.disposeInternal = function() {\n  goog.events.unlistenByKey(this.listenerKey_);\n  // Can't use instanceof here because MessagePort is undefined in workers and\n  // in Firefox\n  if (Object.prototype.toString.call(this.port_) == '[object MessagePort]') {\n    this.port_.close();\n    // Worker is undefined in workers as well as of Chrome 9\n  } else if (Object.prototype.toString.call(this.port_) == '[object Worker]') {\n    this.port_.terminate();\n  }\n  delete this.port_;\n  goog.messaging.PortChannel.base(this, 'disposeInternal');\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.messaging.AbstractChannel","^><","^<A","^9L","~$goog.messaging.DeferredChannel","^9>","^;P","^:S","^;Q","^:I","^;T","~$goog.async.Deferred","^;9","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/portchannel.js"],"^:1",["^9K",["~$goog.messaging.PortChannel"]],"^9<",true,"^9=",["^9>","^><","^;9","^?Z","^;T","^:N","^:I","^<A","^;Q","^?X","^?Y","^;P","^9L","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.tweak.testhelpers.js","^9C",["^9D","goog/tweak/testhelpers.js"],"^9E","goog/tweak/testhelpers.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Common test functions for tweak unit tests.\n *\n * @author agrieve@google.com (Andrew Grieve)\n * @package\n */\n\ngoog.provide('goog.tweak.testhelpers');\n\ngoog.setTestOnly();\n\ngoog.require('goog.tweak');\ngoog.require('goog.tweak.BooleanGroup');\ngoog.require('goog.tweak.BooleanInGroupSetting');\ngoog.require('goog.tweak.BooleanSetting');\ngoog.require('goog.tweak.ButtonAction');\ngoog.require('goog.tweak.NumericSetting');\ngoog.require('goog.tweak.Registry');\ngoog.require('goog.tweak.StringSetting');\n\n\nvar boolEntry;\nvar boolEntry2;\nvar strEntry;\nvar strEntry2;\nvar strEnumEntry;\nvar numEntry;\nvar numEnumEntry;\nvar boolGroup;\nvar boolOneEntry;\nvar boolTwoEntry;\nvar buttonEntry;\n\n\n/**\n * Creates a registry with some entries in it.\n * @param {string} queryParams The query parameter string to use for the\n *     registry.\n * @param {!Object<string|number|boolean>=} opt_compilerOverrides Compiler\n *     overrides.\n * @suppress {accessControls} Private state is accessed for test purposes.\n */\nfunction createRegistryEntries(queryParams, opt_compilerOverrides) {\n  // Initialize the registry with the given query string.\n  var registry =\n      new goog.tweak.Registry(queryParams, opt_compilerOverrides || {});\n  goog.tweak.registry_ = registry;\n\n  boolEntry = new goog.tweak.BooleanSetting('Bool', 'The bool1');\n  registry.register(boolEntry);\n\n  boolEntry2 = new goog.tweak.BooleanSetting('Bool2', 'The bool2');\n  boolEntry2.setDefaultValue(true);\n  registry.register(boolEntry2);\n\n  strEntry = new goog.tweak.StringSetting('Str', 'The str1');\n  strEntry.setParamName('s');\n  registry.register(strEntry);\n\n  strEntry2 = new goog.tweak.StringSetting('Str2', 'The str2');\n  strEntry2.setDefaultValue('foo');\n  registry.register(strEntry2);\n\n  strEnumEntry = new goog.tweak.StringSetting('Enum', 'The enum');\n  strEnumEntry.setValidValues(['A', 'B', 'C']);\n  strEnumEntry.setRestartRequired(false);\n  registry.register(strEnumEntry);\n\n  numEntry = new goog.tweak.NumericSetting('Num', 'The num');\n  numEntry.setDefaultValue(99);\n  registry.register(numEntry);\n\n  numEnumEntry = new goog.tweak.NumericSetting('Enum2', 'The 2nd enum');\n  numEnumEntry.setValidValues([1, 2, 3]);\n  numEnumEntry.setRestartRequired(false);\n  numEnumEntry.label = 'Enum the second&';\n  registry.register(numEnumEntry);\n\n  boolGroup = new goog.tweak.BooleanGroup('BoolGroup', 'The bool group');\n  registry.register(boolGroup);\n\n  boolOneEntry =\n      new goog.tweak.BooleanInGroupSetting('BoolOne', 'Desc for 1', boolGroup);\n  boolOneEntry.setToken('B1');\n  boolOneEntry.setRestartRequired(false);\n  boolGroup.addChild(boolOneEntry);\n  registry.register(boolOneEntry);\n\n  boolTwoEntry =\n      new goog.tweak.BooleanInGroupSetting('BoolTwo', 'Desc for 2', boolGroup);\n  boolTwoEntry.setDefaultValue(true);\n  boolGroup.addChild(boolTwoEntry);\n  registry.register(boolTwoEntry);\n\n  buttonEntry =\n      new goog.tweak.ButtonAction('Button', 'The Btn', goog.nullFunction);\n  buttonEntry.label = '<btn>';\n  registry.register(buttonEntry);\n\n  var nsBoolGroup =\n      new goog.tweak.BooleanGroup('foo.bar.BoolGroup', 'Namespaced Bool Group');\n  registry.register(nsBoolGroup);\n  var nsBool = new goog.tweak.BooleanInGroupSetting(\n      'foo.bar.BoolOne', 'Desc for Namespaced 1', nsBoolGroup);\n  nsBoolGroup.addChild(nsBool);\n  registry.register(nsBool);\n}\n","^9I",1579837703000,"^9J",["^9K",["~$goog.tweak","~$goog.tweak.StringSetting","^9>","~$goog.tweak.NumericSetting","~$goog.tweak.BooleanInGroupSetting","~$goog.tweak.BooleanSetting","~$goog.tweak.BooleanGroup","~$goog.tweak.ButtonAction","~$goog.tweak.Registry"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/tweak/testhelpers.js"],"^:1",["^9K",["~$goog.tweak.testhelpers"]],"^9<",true,"^9=",["^9>","^@0","^@5","^@3","^@4","^@6","^@2","^@7","^@1"]],["^ ","^9A",[1579837703000],"^9B","goog.graphics.canvaselement.js","^9C",["^9D","goog/graphics/canvaselement.js"],"^9E","goog/graphics/canvaselement.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Objects representing shapes drawn on a canvas.\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.graphics.CanvasEllipseElement');\ngoog.provide('goog.graphics.CanvasGroupElement');\ngoog.provide('goog.graphics.CanvasImageElement');\ngoog.provide('goog.graphics.CanvasPathElement');\ngoog.provide('goog.graphics.CanvasRectElement');\ngoog.provide('goog.graphics.CanvasTextElement');\n\n\ngoog.forwardDeclare('goog.graphics.CanvasGraphics');\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.graphics.EllipseElement');\ngoog.require('goog.graphics.Font');\ngoog.require('goog.graphics.GroupElement');\ngoog.require('goog.graphics.ImageElement');\ngoog.require('goog.graphics.Path');\ngoog.require('goog.graphics.PathElement');\ngoog.require('goog.graphics.RectElement');\ngoog.require('goog.graphics.TextElement');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.uncheckedconversions');\ngoog.require('goog.math');\ngoog.require('goog.string');\ngoog.require('goog.string.Const');\n\n\n\n/**\n * Object representing a group of objects in a canvas.\n * This is an implementation of the goog.graphics.GroupElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {goog.graphics.CanvasGraphics} graphics The graphics creating\n *     this element.\n * @constructor\n * @extends {goog.graphics.GroupElement}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n * @final\n */\ngoog.graphics.CanvasGroupElement = function(graphics) {\n  goog.graphics.GroupElement.call(this, null, graphics);\n\n\n  /**\n   * Children contained by this group.\n   * @type {Array<goog.graphics.Element>}\n   * @private\n   */\n  this.children_ = [];\n};\ngoog.inherits(goog.graphics.CanvasGroupElement, goog.graphics.GroupElement);\n\n\n/**\n * Remove all drawing elements from the group.\n * @override\n */\ngoog.graphics.CanvasGroupElement.prototype.clear = function() {\n  if (this.children_.length) {\n    this.children_.length = 0;\n    this.getGraphics().redraw();\n  }\n};\n\n\n/**\n * Set the size of the group element.\n * @param {number|string} width The width of the group element.\n * @param {number|string} height The height of the group element.\n * @override\n */\ngoog.graphics.CanvasGroupElement.prototype.setSize = function(width, height) {\n  // Do nothing.\n};\n\n\n/**\n * Append a child to the group.  Does not draw it\n * @param {goog.graphics.Element} element The child to append.\n */\ngoog.graphics.CanvasGroupElement.prototype.appendChild = function(element) {\n  this.children_.push(element);\n};\n\n\n/**\n * Draw the group.\n * @param {CanvasRenderingContext2D} ctx The context to draw the element in.\n */\ngoog.graphics.CanvasGroupElement.prototype.draw = function(ctx) {\n  for (var i = 0, len = this.children_.length; i < len; i++) {\n    this.getGraphics().drawElement(this.children_[i]);\n  }\n};\n\n\n/**\n * Removes an element from the group.\n * @param {!goog.graphics.Element} elem the element to remove.\n */\ngoog.graphics.CanvasGroupElement.prototype.removeElement = function(elem) {\n  goog.array.removeIf(this.children_, function(child) {\n    // If the child has children (and thus is a group element)\n    // call removeElement on that group\n    if (child.children_) {\n      child.removeElement(elem);\n      return false;\n    } else {\n      return child === elem;\n    }\n  });\n};\n\n\n\n/**\n * Thin wrapper for canvas ellipse elements.\n * This is an implementation of the goog.graphics.EllipseElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.CanvasGraphics} graphics  The graphics creating\n *     this element.\n * @param {number} cx Center X coordinate.\n * @param {number} cy Center Y coordinate.\n * @param {number} rx Radius length for the x-axis.\n * @param {number} ry Radius length for the y-axis.\n * @param {goog.graphics.Stroke} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.EllipseElement}\n * @final\n */\ngoog.graphics.CanvasEllipseElement = function(\n    element, graphics, cx, cy, rx, ry, stroke, fill) {\n  goog.graphics.EllipseElement.call(this, element, graphics, stroke, fill);\n\n  /**\n   * X coordinate of the ellipse center.\n   * @type {number}\n   * @private\n   */\n  this.cx_ = cx;\n\n\n  /**\n   * Y coordinate of the ellipse center.\n   * @type {number}\n   * @private\n   */\n  this.cy_ = cy;\n\n\n  /**\n   * Radius length for the x-axis.\n   * @type {number}\n   * @private\n   */\n  this.rx_ = rx;\n\n\n  /**\n   * Radius length for the y-axis.\n   * @type {number}\n   * @private\n   */\n  this.ry_ = ry;\n\n\n  /**\n   * Internal path approximating an ellipse.\n   * @type {goog.graphics.Path}\n   * @private\n   */\n  this.path_ = new goog.graphics.Path();\n  this.setUpPath_();\n\n  /**\n   * Internal path element that actually does the drawing.\n   * @type {goog.graphics.CanvasPathElement}\n   * @private\n   */\n  this.pathElement_ = new goog.graphics.CanvasPathElement(\n      null, graphics, this.path_, stroke, fill);\n};\ngoog.inherits(goog.graphics.CanvasEllipseElement, goog.graphics.EllipseElement);\n\n\n/**\n * Sets up the path.\n * @private\n */\ngoog.graphics.CanvasEllipseElement.prototype.setUpPath_ = function() {\n  this.path_.clear();\n  this.path_.moveTo(\n      this.cx_ + goog.math.angleDx(0, this.rx_),\n      this.cy_ + goog.math.angleDy(0, this.ry_));\n  this.path_.arcTo(this.rx_, this.ry_, 0, 360);\n  this.path_.close();\n};\n\n\n/**\n * Update the center point of the ellipse.\n * @param {number} cx Center X coordinate.\n * @param {number} cy Center Y coordinate.\n * @override\n */\ngoog.graphics.CanvasEllipseElement.prototype.setCenter = function(cx, cy) {\n  this.cx_ = cx;\n  this.cy_ = cy;\n  this.setUpPath_();\n  this.pathElement_.setPath(/** @type {!goog.graphics.Path} */ (this.path_));\n};\n\n\n/**\n * Update the radius of the ellipse.\n * @param {number} rx Center X coordinate.\n * @param {number} ry Center Y coordinate.\n * @override\n */\ngoog.graphics.CanvasEllipseElement.prototype.setRadius = function(rx, ry) {\n  this.rx_ = rx;\n  this.ry_ = ry;\n  this.setUpPath_();\n  this.pathElement_.setPath(/** @type {!goog.graphics.Path} */ (this.path_));\n};\n\n\n/**\n * Draw the ellipse.  Should be treated as package scope.\n * @param {CanvasRenderingContext2D} ctx The context to draw the element in.\n */\ngoog.graphics.CanvasEllipseElement.prototype.draw = function(ctx) {\n  this.pathElement_.draw(ctx);\n};\n\n\n\n/**\n * Thin wrapper for canvas rectangle elements.\n * This is an implementation of the goog.graphics.RectElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.CanvasGraphics} graphics The graphics creating\n *     this element.\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @param {number} w Width of rectangle.\n * @param {number} h Height of rectangle.\n * @param {goog.graphics.Stroke} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.RectElement}\n * @final\n */\ngoog.graphics.CanvasRectElement = function(\n    element, graphics, x, y, w, h, stroke, fill) {\n  goog.graphics.RectElement.call(this, element, graphics, stroke, fill);\n\n  /**\n   * X coordinate of the top left corner.\n   * @type {number}\n   * @private\n   */\n  this.x_ = x;\n\n\n  /**\n   * Y coordinate of the top left corner.\n   * @type {number}\n   * @private\n   */\n  this.y_ = y;\n\n\n  /**\n   * Width of the rectangle.\n   * @type {number}\n   * @private\n   */\n  this.w_ = w;\n\n\n  /**\n   * Height of the rectangle.\n   * @type {number}\n   * @private\n   */\n  this.h_ = h;\n};\ngoog.inherits(goog.graphics.CanvasRectElement, goog.graphics.RectElement);\n\n\n/**\n * Update the position of the rectangle.\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @override\n */\ngoog.graphics.CanvasRectElement.prototype.setPosition = function(x, y) {\n  this.x_ = x;\n  this.y_ = y;\n  if (this.drawn_) {\n    this.getGraphics().redraw();\n  }\n};\n\n\n/**\n * Whether the rectangle has been drawn yet.\n * @type {boolean}\n * @private\n */\ngoog.graphics.CanvasRectElement.prototype.drawn_ = false;\n\n\n/**\n * Update the size of the rectangle.\n * @param {number} width Width of rectangle.\n * @param {number} height Height of rectangle.\n * @override\n */\ngoog.graphics.CanvasRectElement.prototype.setSize = function(width, height) {\n  this.w_ = width;\n  this.h_ = height;\n  if (this.drawn_) {\n    this.getGraphics().redraw();\n  }\n};\n\n\n/**\n * Draw the rectangle.  Should be treated as package scope.\n * @param {CanvasRenderingContext2D} ctx The context to draw the element in.\n */\ngoog.graphics.CanvasRectElement.prototype.draw = function(ctx) {\n  this.drawn_ = true;\n  ctx.beginPath();\n  ctx.moveTo(this.x_, this.y_);\n  ctx.lineTo(this.x_, this.y_ + this.h_);\n  ctx.lineTo(this.x_ + this.w_, this.y_ + this.h_);\n  ctx.lineTo(this.x_ + this.w_, this.y_);\n  ctx.closePath();\n};\n\n\n\n/**\n * Thin wrapper for canvas path elements.\n * This is an implementation of the goog.graphics.PathElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.CanvasGraphics} graphics The graphics creating\n *     this element.\n * @param {!goog.graphics.Path} path The path object to draw.\n * @param {goog.graphics.Stroke} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.PathElement}\n * @final\n */\ngoog.graphics.CanvasPathElement = function(\n    element, graphics, path, stroke, fill) {\n  goog.graphics.PathElement.call(this, element, graphics, stroke, fill);\n\n  this.setPath(path);\n};\ngoog.inherits(goog.graphics.CanvasPathElement, goog.graphics.PathElement);\n\n\n/**\n * Whether the shape has been drawn yet.\n * @type {boolean}\n * @private\n */\ngoog.graphics.CanvasPathElement.prototype.drawn_ = false;\n\n\n/**\n * The path to draw.\n * @type {goog.graphics.Path}\n * @private\n */\ngoog.graphics.CanvasPathElement.prototype.path_;\n\n\n/**\n * Update the underlying path.\n * @param {!goog.graphics.Path} path The path object to draw.\n * @override\n */\ngoog.graphics.CanvasPathElement.prototype.setPath = function(path) {\n  this.path_ =\n      path.isSimple() ? path : goog.graphics.Path.createSimplifiedPath(path);\n  if (this.drawn_) {\n    this.getGraphics().redraw();\n  }\n};\n\n\n/**\n * Draw the path.  Should be treated as package scope.\n * @param {CanvasRenderingContext2D} ctx The context to draw the element in.\n * @suppress {deprecated} goog.graphics is deprecated.\n */\ngoog.graphics.CanvasPathElement.prototype.draw = function(ctx) {\n  this.drawn_ = true;\n\n  ctx.beginPath();\n  this.path_.forEachSegment(function(segment, args) {\n    switch (segment) {\n      case goog.graphics.Path.Segment.MOVETO:\n        ctx.moveTo(args[0], args[1]);\n        break;\n      case goog.graphics.Path.Segment.LINETO:\n        for (var i = 0; i < args.length; i += 2) {\n          ctx.lineTo(args[i], args[i + 1]);\n        }\n        break;\n      case goog.graphics.Path.Segment.CURVETO:\n        for (var i = 0; i < args.length; i += 6) {\n          ctx.bezierCurveTo(\n              args[i], args[i + 1], args[i + 2], args[i + 3], args[i + 4],\n              args[i + 5]);\n        }\n        break;\n      case goog.graphics.Path.Segment.ARCTO:\n        throw new Error('Canvas paths cannot contain arcs');\n      case goog.graphics.Path.Segment.CLOSE:\n        ctx.closePath();\n        break;\n    }\n  });\n};\n\n\n\n/**\n * Thin wrapper for canvas text elements.\n * This is an implementation of the goog.graphics.TextElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {!goog.graphics.CanvasGraphics} graphics The graphics creating\n *     this element.\n * @param {string} text The text to draw.\n * @param {number} x1 X coordinate of start of line.\n * @param {number} y1 Y coordinate of start of line.\n * @param {number} x2 X coordinate of end of line.\n * @param {number} y2 Y coordinate of end of line.\n * @param {?string} align Horizontal alignment: left (default), center, right.\n * @param {!goog.graphics.Font} font Font describing the font properties.\n * @param {goog.graphics.Stroke} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.TextElement}\n * @final\n */\ngoog.graphics.CanvasTextElement = function(\n    graphics, text, x1, y1, x2, y2, align, font, stroke, fill) {\n  var element = goog.dom.createDom(\n      goog.dom.TagName.DIV,\n      {'style': 'display:table;position:absolute;padding:0;margin:0;border:0'});\n  goog.graphics.TextElement.call(this, element, graphics, stroke, fill);\n\n  /**\n   * The text to draw.\n   * @type {string}\n   * @private\n   */\n  this.text_ = text;\n\n  /**\n   * X coordinate of the start of the line the text is drawn on.\n   * @type {number}\n   * @private\n   */\n  this.x1_ = x1;\n\n  /**\n   * Y coordinate of the start of the line the text is drawn on.\n   * @type {number}\n   * @private\n   */\n  this.y1_ = y1;\n\n  /**\n   * X coordinate of the end of the line the text is drawn on.\n   * @type {number}\n   * @private\n   */\n  this.x2_ = x2;\n\n  /**\n   * Y coordinate of the end of the line the text is drawn on.\n   * @type {number}\n   * @private\n   */\n  this.y2_ = y2;\n\n  /**\n   * Horizontal alignment: left (default), center, right.\n   * @type {string}\n   * @private\n   */\n  this.align_ = align || 'left';\n\n  /**\n   * Font object describing the font properties.\n   * @type {goog.graphics.Font}\n   * @private\n   */\n  this.font_ = font;\n\n  /**\n   * The inner element that contains the text.\n   * @type {Element}\n   * @private\n   */\n  this.innerElement_ = goog.dom.createDom(\n      goog.dom.TagName.DIV,\n      {'style': 'display:table-cell;padding: 0;margin: 0;border: 0'});\n\n  this.updateStyle_();\n  this.updateText_();\n\n  // Append to the DOM.\n  graphics.getElement().appendChild(element);\n  element.appendChild(this.innerElement_);\n};\ngoog.inherits(goog.graphics.CanvasTextElement, goog.graphics.TextElement);\n\n\n/**\n * Update the displayed text of the element.\n * @param {string} text The text to draw.\n * @override\n */\ngoog.graphics.CanvasTextElement.prototype.setText = function(text) {\n  this.text_ = text;\n  this.updateText_();\n};\n\n\n/**\n * Sets the fill for this element.\n * @param {goog.graphics.Fill} fill The fill object.\n * @override\n */\ngoog.graphics.CanvasTextElement.prototype.setFill = function(fill) {\n  this.fill = fill;\n  var element = this.getElement();\n  if (element) {\n    element.style.color = fill.getColor() || fill.getColor1();\n  }\n};\n\n\n/**\n * Sets the stroke for this element.\n * @param {goog.graphics.Stroke} stroke The stroke object.\n * @override\n */\ngoog.graphics.CanvasTextElement.prototype.setStroke = function(stroke) {\n  // Ignore stroke\n};\n\n\n/**\n * Draw the text.  Should be treated as package scope.\n * @param {CanvasRenderingContext2D} ctx The context to draw the element in.\n */\ngoog.graphics.CanvasTextElement.prototype.draw = function(ctx) {\n  // Do nothing - the text is already drawn.\n};\n\n\n/**\n * Update the styles of the DIVs.\n * @private\n */\ngoog.graphics.CanvasTextElement.prototype.updateStyle_ = function() {\n  var x1 = this.x1_;\n  var x2 = this.x2_;\n  var y1 = this.y1_;\n  var y2 = this.y2_;\n  var align = this.align_;\n  var font = this.font_;\n  var style = this.getElement().style;\n  var scaleX = this.getGraphics().getPixelScaleX();\n  var scaleY = this.getGraphics().getPixelScaleY();\n\n  if (x1 == x2) {\n    // Special case vertical text\n    style.lineHeight = '90%';\n\n    this.innerElement_.style.verticalAlign =\n        align == 'center' ? 'middle' : align == 'left' ?\n                            (y1 < y2 ? 'top' : 'bottom') :\n                            y1 < y2 ? 'bottom' : 'top';\n    style.textAlign = 'center';\n\n    var w = font.size * scaleX;\n    style.top = Math.round(Math.min(y1, y2) * scaleY) + 'px';\n    style.left = Math.round((x1 - w / 2) * scaleX) + 'px';\n    style.width = Math.round(w) + 'px';\n    style.height = Math.abs(y1 - y2) * scaleY + 'px';\n\n    style.fontSize = font.size * 0.6 * scaleY + 'pt';\n  } else {\n    style.lineHeight = '100%';\n    this.innerElement_.style.verticalAlign = 'top';\n    style.textAlign = align;\n\n    style.top = Math.round(((y1 + y2) / 2 - font.size * 2 / 3) * scaleY) + 'px';\n    style.left = Math.round(x1 * scaleX) + 'px';\n    style.width = Math.round(Math.abs(x2 - x1) * scaleX) + 'px';\n    style.height = 'auto';\n\n    style.fontSize = font.size * scaleY + 'pt';\n  }\n\n  style.fontWeight = font.bold ? 'bold' : 'normal';\n  style.fontStyle = font.italic ? 'italic' : 'normal';\n  style.fontFamily = font.family;\n\n  var fill = this.getFill();\n  style.color = fill.getColor() || fill.getColor1();\n};\n\n\n/**\n * Update the text content.\n * @private\n */\ngoog.graphics.CanvasTextElement.prototype.updateText_ = function() {\n  if (this.x1_ == this.x2_) {\n    // Special case vertical text\n    var html =\n        goog.array\n            .map(\n                this.text_.split(''),\n                function(entry) { return goog.string.htmlEscape(entry); })\n            .join('<br>');\n    // Creating a SafeHtml for each character would be quite expensive, and it's\n    // obvious that this is safe, so an unchecked conversion is appropriate.\n    var safeHtml =\n        goog.html.uncheckedconversions\n            .safeHtmlFromStringKnownToSatisfyTypeContract(\n                goog.string.Const.from('Concatenate escaped chars and <br>'),\n                html);\n    goog.dom.safe.setInnerHtml(\n        /** @type {!Element} */ (this.innerElement_), safeHtml);\n  } else {\n    goog.dom.safe.setInnerHtml(\n        /** @type {!Element} */ (this.innerElement_),\n        goog.html.SafeHtml.htmlEscape(this.text_));\n  }\n};\n\n\n\n/**\n * Thin wrapper for canvas image elements.\n * This is an implementation of the goog.graphics.ImageElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.CanvasGraphics} graphics The graphics creating\n *     this element.\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @param {number} w Width of rectangle.\n * @param {number} h Height of rectangle.\n * @param {string} src Source of the image.\n * @constructor\n * @extends {goog.graphics.ImageElement}\n * @final\n */\ngoog.graphics.CanvasImageElement = function(\n    element, graphics, x, y, w, h, src) {\n  goog.graphics.ImageElement.call(this, element, graphics);\n\n  /**\n   * X coordinate of the top left corner.\n   * @type {number}\n   * @private\n   */\n  this.x_ = x;\n\n\n  /**\n   * Y coordinate of the top left corner.\n   * @type {number}\n   * @private\n   */\n  this.y_ = y;\n\n\n  /**\n   * Width of the rectangle.\n   * @type {number}\n   * @private\n   */\n  this.w_ = w;\n\n\n  /**\n   * Height of the rectangle.\n   * @type {number}\n   * @private\n   */\n  this.h_ = h;\n\n\n  /**\n   * URL of the image source.\n   * @type {string}\n   * @private\n   */\n  this.src_ = src;\n};\ngoog.inherits(goog.graphics.CanvasImageElement, goog.graphics.ImageElement);\n\n\n/**\n * Whether the image has been drawn yet.\n * @type {boolean}\n * @private\n */\ngoog.graphics.CanvasImageElement.prototype.drawn_ = false;\n\n\n/**\n * Update the position of the image.\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @override\n */\ngoog.graphics.CanvasImageElement.prototype.setPosition = function(x, y) {\n  this.x_ = x;\n  this.y_ = y;\n  if (this.drawn_) {\n    this.getGraphics().redraw();\n  }\n};\n\n\n/**\n * Update the size of the image.\n * @param {number} width Width of rectangle.\n * @param {number} height Height of rectangle.\n * @override\n */\ngoog.graphics.CanvasImageElement.prototype.setSize = function(width, height) {\n  this.w_ = width;\n  this.h_ = height;\n  if (this.drawn_) {\n    this.getGraphics().redraw();\n  }\n};\n\n\n/**\n * Update the source of the image.\n * @param {string} src Source of the image.\n * @override\n */\ngoog.graphics.CanvasImageElement.prototype.setSource = function(src) {\n  this.src_ = src;\n  if (this.drawn_) {\n    // TODO(robbyw): Probably need to reload the image here.\n    this.getGraphics().redraw();\n  }\n};\n\n\n/**\n * Draw the image.  Should be treated as package scope.\n * @param {CanvasRenderingContext2D} ctx The context to draw the element in.\n */\ngoog.graphics.CanvasImageElement.prototype.draw = function(ctx) {\n  if (this.img_) {\n    if (this.w_ && this.h_) {\n      // If the image is already loaded, draw it.\n      ctx.drawImage(this.img_, this.x_, this.y_, this.w_, this.h_);\n    }\n    this.drawn_ = true;\n\n  } else {\n    // Otherwise, load it.\n    var img = new Image();\n    img.onload = goog.bind(this.handleImageLoad_, this, img);\n    // TODO(robbyw): Handle image load errors.\n    img.src = this.src_;\n  }\n};\n\n\n/**\n * Handle an image load.\n * @param {Element} img The image element that finished loading.\n * @private\n */\ngoog.graphics.CanvasImageElement.prototype.handleImageLoad_ = function(img) {\n  this.img_ = img;\n\n  // TODO(robbyw): Add a small delay to catch batched images\n  this.getGraphics().redraw();\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.graphics.RectElement","~$goog.graphics.Font","^;;","~$goog.graphics.EllipseElement","^9L","~$goog.graphics.GroupElement","^9>","~$goog.html.uncheckedconversions","^=M","~$goog.graphics.Path","~$goog.graphics.PathElement","~$goog.graphics.ImageElement","~$goog.graphics.TextElement","~$goog.dom.safe","^<2","^;9","~$goog.html.SafeHtml","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/canvaselement.js"],"^:1",["^9K",["~$goog.graphics.CanvasRectElement","~$goog.graphics.CanvasGroupElement","~$goog.graphics.CanvasTextElement","~$goog.graphics.CanvasPathElement","~$goog.graphics.CanvasEllipseElement","~$goog.graphics.CanvasImageElement"]],"^9<",true,"^9=",["^9>","^;9","^;;","^;=","^@B","^@;","^@:","^@<","^@@","^@>","^@?","^@9","^@A","^@C","^@=","^<2","^9L","^=M"]],["^ ","^9A",[1579837703000],"^9B","goog.vec.vec3d.js","^9C",["^9D","goog/vec/vec3d.js"],"^9E","goog/vec/vec3d.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n//                                                                           //\n// Any edits to this file must be applied to vec3f.js by running:            //\n//   swap_type.sh vec3d.js > vec3f.js                                        //\n//                                                                           //\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n\n\n/**\n * @fileoverview Provides functions for operating on 3 element double (64bit)\n * vectors.\n *\n * The last parameter will typically be the output object and an object\n * can be both an input and output parameter to all methods except where\n * noted.\n *\n * See the README for notes about the design and structure of the API\n * (especially related to performance).\n *\n */\ngoog.provide('goog.vec.vec3d');\ngoog.provide('goog.vec.vec3d.Type');\n\n/** @suppress {extraRequire} */\ngoog.require('goog.vec');\n\n/** @typedef {!goog.vec.Float64} */ goog.vec.vec3d.Type;\n\n\n/**\n * Creates a vec3d with all elements initialized to zero.\n *\n * @return {!goog.vec.vec3d.Type} The new vec3d.\n */\ngoog.vec.vec3d.create = function() {\n  return new Float64Array(3);\n};\n\n\n/**\n * Creates a new vec3d initialized with the value from the given array.\n *\n * @param {!Array<number>} vec The source 3 element array.\n * @return {!goog.vec.vec3d.Type} The new vec3d.\n */\ngoog.vec.vec3d.createFromArray = function(vec) {\n  var newVec = goog.vec.vec3d.create();\n  goog.vec.vec3d.setFromArray(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Creates a new vec3d initialized with the supplied values.\n *\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @return {!goog.vec.vec3d.Type} The new vector.\n */\ngoog.vec.vec3d.createFromValues = function(v0, v1, v2) {\n  var vec = goog.vec.vec3d.create();\n  goog.vec.vec3d.setFromValues(vec, v0, v1, v2);\n  return vec;\n};\n\n\n/**\n * Creates a clone of the given vec3d.\n *\n * @param {!goog.vec.vec3d.Type} vec The source vec3d.\n * @return {!goog.vec.vec3d.Type} The new cloned vec3d.\n */\ngoog.vec.vec3d.clone = function(vec) {\n  var newVec = goog.vec.vec3d.create();\n  goog.vec.vec3d.setFromVec3d(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Initializes the vector with the given values.\n *\n * @param {!goog.vec.vec3d.Type} vec The vector to receive the values.\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @return {!goog.vec.vec3d.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.setFromValues = function(vec, v0, v1, v2) {\n  vec[0] = v0;\n  vec[1] = v1;\n  vec[2] = v2;\n  return vec;\n};\n\n\n/**\n * Initializes vec3d vec from vec3d src.\n *\n * @param {!goog.vec.vec3d.Type} vec The destination vector.\n * @param {!goog.vec.vec3d.Type} src The source vector.\n * @return {!goog.vec.vec3d.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.setFromVec3d = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  vec[2] = src[2];\n  return vec;\n};\n\n\n/**\n * Initializes vec3d vec from vec3f src (typed as a Float32Array to\n * avoid circular goog.requires).\n *\n * @param {!goog.vec.vec3d.Type} vec The destination vector.\n * @param {Float32Array} src The source vector.\n * @return {!goog.vec.vec3d.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.setFromVec3f = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  vec[2] = src[2];\n  return vec;\n};\n\n\n/**\n * Initializes vec3d vec from Array src.\n *\n * @param {!goog.vec.vec3d.Type} vec The destination vector.\n * @param {Array<number>} src The source vector.\n * @return {!goog.vec.vec3d.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.setFromArray = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  vec[2] = src[2];\n  return vec;\n};\n\n\n/**\n * Performs a component-wise addition of vec0 and vec1 together storing the\n * result into resultVec.\n *\n * @param {!goog.vec.vec3d.Type} vec0 The first addend.\n * @param {!goog.vec.vec3d.Type} vec1 The second addend.\n * @param {!goog.vec.vec3d.Type} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.vec3d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.add = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] + vec1[0];\n  resultVec[1] = vec0[1] + vec1[1];\n  resultVec[2] = vec0[2] + vec1[2];\n  return resultVec;\n};\n\n\n/**\n * Performs a component-wise subtraction of vec1 from vec0 storing the\n * result into resultVec.\n *\n * @param {!goog.vec.vec3d.Type} vec0 The minuend.\n * @param {!goog.vec.vec3d.Type} vec1 The subtrahend.\n * @param {!goog.vec.vec3d.Type} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.vec3d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.subtract = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] - vec1[0];\n  resultVec[1] = vec0[1] - vec1[1];\n  resultVec[2] = vec0[2] - vec1[2];\n  return resultVec;\n};\n\n\n/**\n * Negates vec0, storing the result into resultVec.\n *\n * @param {!goog.vec.vec3d.Type} vec0 The vector to negate.\n * @param {!goog.vec.vec3d.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec3d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.negate = function(vec0, resultVec) {\n  resultVec[0] = -vec0[0];\n  resultVec[1] = -vec0[1];\n  resultVec[2] = -vec0[2];\n  return resultVec;\n};\n\n\n/**\n * Takes the absolute value of each component of vec0 storing the result in\n * resultVec.\n *\n * @param {!goog.vec.vec3d.Type} vec0 The source vector.\n * @param {!goog.vec.vec3d.Type} resultVec The vector to receive the result.\n *     May be vec0.\n * @return {!goog.vec.vec3d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.abs = function(vec0, resultVec) {\n  resultVec[0] = Math.abs(vec0[0]);\n  resultVec[1] = Math.abs(vec0[1]);\n  resultVec[2] = Math.abs(vec0[2]);\n  return resultVec;\n};\n\n\n/**\n * Multiplies each component of vec0 with scalar storing the product into\n * resultVec.\n *\n * @param {!goog.vec.vec3d.Type} vec0 The source vector.\n * @param {number} scalar The value to multiply with each component of vec0.\n * @param {!goog.vec.vec3d.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec3d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.scale = function(vec0, scalar, resultVec) {\n  resultVec[0] = vec0[0] * scalar;\n  resultVec[1] = vec0[1] * scalar;\n  resultVec[2] = vec0[2] * scalar;\n  return resultVec;\n};\n\n\n/**\n * Returns the magnitudeSquared of the given vector.\n *\n * @param {!goog.vec.vec3d.Type} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.vec3d.magnitudeSquared = function(vec0) {\n  var x = vec0[0], y = vec0[1], z = vec0[2];\n  return x * x + y * y + z * z;\n};\n\n\n/**\n * Returns the magnitude of the given vector.\n *\n * @param {!goog.vec.vec3d.Type} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.vec3d.magnitude = function(vec0) {\n  var x = vec0[0], y = vec0[1], z = vec0[2];\n  return Math.sqrt(x * x + y * y + z * z);\n};\n\n\n/**\n * Normalizes the given vector storing the result into resultVec.\n *\n * @param {!goog.vec.vec3d.Type} vec0 The vector to normalize.\n * @param {!goog.vec.vec3d.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec3d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.normalize = function(vec0, resultVec) {\n  var x = vec0[0], y = vec0[1], z = vec0[2];\n  var ilen = 1 / Math.sqrt(x * x + y * y + z * z);\n  resultVec[0] = x * ilen;\n  resultVec[1] = y * ilen;\n  resultVec[2] = z * ilen;\n  return resultVec;\n};\n\n\n/**\n * Returns the scalar product of vectors v0 and v1.\n *\n * @param {!goog.vec.vec3d.Type} v0 The first vector.\n * @param {!goog.vec.vec3d.Type} v1 The second vector.\n * @return {number} The scalar product.\n */\ngoog.vec.vec3d.dot = function(v0, v1) {\n  return v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2];\n};\n\n\n/**\n * Computes the vector (cross) product of v0 and v1 storing the result into\n * resultVec.\n *\n * @param {!goog.vec.vec3d.Type} v0 The first vector.\n * @param {!goog.vec.vec3d.Type} v1 The second vector.\n * @param {!goog.vec.vec3d.Type} resultVec The vector to receive the\n *     results. May be either v0 or v1.\n * @return {!goog.vec.vec3d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.cross = function(v0, v1, resultVec) {\n  var x0 = v0[0], y0 = v0[1], z0 = v0[2];\n  var x1 = v1[0], y1 = v1[1], z1 = v1[2];\n  resultVec[0] = y0 * z1 - z0 * y1;\n  resultVec[1] = z0 * x1 - x0 * z1;\n  resultVec[2] = x0 * y1 - y0 * x1;\n  return resultVec;\n};\n\n\n/**\n * Returns the squared distance between two points.\n *\n * @param {!goog.vec.vec3d.Type} vec0 First point.\n * @param {!goog.vec.vec3d.Type} vec1 Second point.\n * @return {number} The squared distance between the points.\n */\ngoog.vec.vec3d.distanceSquared = function(vec0, vec1) {\n  var x = vec0[0] - vec1[0];\n  var y = vec0[1] - vec1[1];\n  var z = vec0[2] - vec1[2];\n  return x * x + y * y + z * z;\n};\n\n\n/**\n * Returns the distance between two points.\n *\n * @param {!goog.vec.vec3d.Type} vec0 First point.\n * @param {!goog.vec.vec3d.Type} vec1 Second point.\n * @return {number} The distance between the points.\n */\ngoog.vec.vec3d.distance = function(vec0, vec1) {\n  return Math.sqrt(goog.vec.vec3d.distanceSquared(vec0, vec1));\n};\n\n\n/**\n * Returns a unit vector pointing from one point to another.\n * If the input points are equal then the result will be all zeros.\n *\n * @param {!goog.vec.vec3d.Type} vec0 Origin point.\n * @param {!goog.vec.vec3d.Type} vec1 Target point.\n * @param {!goog.vec.vec3d.Type} resultVec The vector to receive the\n *     results (may be vec0 or vec1).\n * @return {!goog.vec.vec3d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.direction = function(vec0, vec1, resultVec) {\n  var x = vec1[0] - vec0[0];\n  var y = vec1[1] - vec0[1];\n  var z = vec1[2] - vec0[2];\n  var d = Math.sqrt(x * x + y * y + z * z);\n  if (d) {\n    d = 1 / d;\n    resultVec[0] = x * d;\n    resultVec[1] = y * d;\n    resultVec[2] = z * d;\n  } else {\n    resultVec[0] = resultVec[1] = resultVec[2] = 0;\n  }\n  return resultVec;\n};\n\n\n/**\n * Linearly interpolate from vec0 to v1 according to f. The value of f should be\n * in the range [0..1] otherwise the results are undefined.\n *\n * @param {!goog.vec.vec3d.Type} v0 The first vector.\n * @param {!goog.vec.vec3d.Type} v1 The second vector.\n * @param {number} f The interpolation factor.\n * @param {!goog.vec.vec3d.Type} resultVec The vector to receive the\n *     results (may be v0 or v1).\n * @return {!goog.vec.vec3d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.lerp = function(v0, v1, f, resultVec) {\n  var x = v0[0], y = v0[1], z = v0[2];\n  resultVec[0] = (v1[0] - x) * f + x;\n  resultVec[1] = (v1[1] - y) * f + y;\n  resultVec[2] = (v1[2] - z) * f + z;\n  return resultVec;\n};\n\n\n/**\n * Perform a spherical linear interpolation from v0 to v1 according to f. The\n * value of f should be in the range [0..1] otherwise the results are undefined.\n *\n * Slerp is normally used to interpolate quaternions, but there is a geometric\n * formula for interpolating vectors directly, see \"Geometric Slerp\" in:\n * https://en.wikipedia.org/wiki/Slerp.\n *\n * This interpolates the vectors' directions via slerp, but linearly\n * interpolates the vectors' magnitudes.\n *\n * Results are undefined if v0 or v1 are of zero magnitude.\n *\n * @param {!goog.vec.vec3d.Type} v0 The first vector.\n * @param {!goog.vec.vec3d.Type} v1 The second vector.\n * @param {number} f The interpolation factor.\n * @param {!goog.vec.vec3d.Type} resultVec The vector to receive the\n *     results (may be v0 or v1).\n * @return {!goog.vec.vec3d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.slerp = function(v0, v1, f, resultVec) {\n  var v0Magnitude = goog.vec.vec3d.magnitude(v0);\n  var v1Magnitude = goog.vec.vec3d.magnitude(v1);\n\n  var cosAngle = goog.vec.vec3d.dot(v0, v1) / (v0Magnitude * v1Magnitude);\n\n  // If v0 and v1 are almost the same direction, fall back on a straight lerp.\n  if (cosAngle > 1 - goog.vec.EPSILON) {\n    return goog.vec.vec3d.lerp(v0, v1, f, resultVec);\n  }\n\n  var angle = 0;\n  var sinAngle = 0;\n\n  // If v0 and v1 are opposite directions, pick an arbitrary 'mid' vector that\n  // is perpendicular to both, and slerp from v0 -> mid -> v1.\n  if (cosAngle < -1 + goog.vec.EPSILON) {\n    var mid = goog.vec.vec3d.create();\n    var magnitudeFactor = (v0Magnitude + v1Magnitude) / 2;\n    if (v0[0]) {  // v0 not parallel to [0,0,1].\n      magnitudeFactor /= Math.sqrt(v0[0] * v0[0] + v0[1] + v0[1]);\n      mid[0] = -v0[1] * magnitudeFactor;\n      mid[1] = v0[0] * magnitudeFactor;\n      mid[2] = 0;\n    } else {  // v0 not parallel to [1,0,0].\n      magnitudeFactor /= Math.sqrt(v0[2] * v0[2] + v0[1] + v0[1]);\n      mid[0] = 0;\n      mid[1] = -v0[2] * magnitudeFactor;\n      mid[2] = v0[1] * magnitudeFactor;\n    }\n\n    // Depending on f, slerp between either v0 and mid, or mid and v1.\n    if (f <= 0.5) {\n      v1Magnitude = v0Magnitude;\n      v1 = mid;\n      f *= 2;\n    } else {\n      v0 = mid;\n      f = 2 * f - 1;\n    }\n\n    angle = Math.PI / 2;\n    cosAngle = 0;\n    sinAngle = 1;\n  } else {\n    angle = Math.acos(cosAngle);\n    sinAngle = Math.sqrt(1 - cosAngle * cosAngle);\n  }\n\n  var coeff0 = (Math.sin((1 - f) * angle) / sinAngle) / v0Magnitude;\n  var coeff1 = (Math.sin(f * angle) / sinAngle) / v1Magnitude;\n  var magnitude = (1 - f) * v0Magnitude + f * v1Magnitude;\n\n  resultVec[0] = (v0[0] * coeff0 + v1[0] * coeff1) * magnitude;\n  resultVec[1] = (v0[1] * coeff0 + v1[1] * coeff1) * magnitude;\n  resultVec[2] = (v0[2] * coeff0 + v1[2] * coeff1) * magnitude;\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the larger values in resultVec.\n *\n * @param {!goog.vec.vec3d.Type} vec0 The source vector.\n * @param {!goog.vec.vec3d.Type|number} limit The limit vector or scalar.\n * @param {!goog.vec.vec3d.Type} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.vec3d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.max = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.max(vec0[0], limit);\n    resultVec[1] = Math.max(vec0[1], limit);\n    resultVec[2] = Math.max(vec0[2], limit);\n  } else {\n    resultVec[0] = Math.max(vec0[0], limit[0]);\n    resultVec[1] = Math.max(vec0[1], limit[1]);\n    resultVec[2] = Math.max(vec0[2], limit[2]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the smaller values in resultVec.\n *\n * @param {!goog.vec.vec3d.Type} vec0 The source vector.\n * @param {!goog.vec.vec3d.Type|number} limit The limit vector or scalar.\n * @param {!goog.vec.vec3d.Type} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.vec3d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3d.min = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.min(vec0[0], limit);\n    resultVec[1] = Math.min(vec0[1], limit);\n    resultVec[2] = Math.min(vec0[2], limit);\n  } else {\n    resultVec[0] = Math.min(vec0[0], limit[0]);\n    resultVec[1] = Math.min(vec0[1], limit[1]);\n    resultVec[2] = Math.min(vec0[2], limit[2]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Returns true if the components of v0 are equal to the components of v1.\n *\n * @param {!goog.vec.vec3d.Type} v0 The first vector.\n * @param {!goog.vec.vec3d.Type} v1 The second vector.\n * @return {boolean} True if the vectors are equal, false otherwise.\n */\ngoog.vec.vec3d.equals = function(v0, v1) {\n  return v0.length == v1.length && v0[0] == v1[0] && v0[1] == v1[1] &&\n      v0[2] == v1[2];\n};\n","^9I",1579837703000,"^9J",["^9K",["^;2","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/vec3d.js"],"^:1",["^9K",["^;1","^=:"]],"^9<",true,"^9=",["^9>","^;2"]],["^ ","^9A",[1579837703000],"^9B","goog.i18n.messageformat.js","^9C",["^9D","goog/i18n/messageformat.js"],"^9E","goog/i18n/messageformat.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Message/plural format library with locale support.\n *\n * Message format grammar:\n *\n * messageFormatPattern := string ( \"{\" messageFormatElement \"}\" string )*\n * messageFormatElement := argumentIndex [ \",\" elementFormat ]\n * elementFormat := \"plural\" \",\" pluralStyle\n *                  | \"selectordinal\" \",\" ordinalStyle\n *                  | \"select\" \",\" selectStyle\n * pluralStyle :=  pluralFormatPattern\n * ordinalStyle :=  selectFormatPattern\n * selectStyle :=  selectFormatPattern\n * pluralFormatPattern := [ \"offset\" \":\" offsetIndex ] pluralForms*\n * selectFormatPattern := pluralForms*\n * pluralForms := stringKey \"{\" ( \"{\" messageFormatElement \"}\"|string )* \"}\"\n *\n * This is a subset of the ICU MessageFormatSyntax:\n *   http://userguide.icu-project.org/formatparse/messages\n * See also http://go/plurals and http://go/ordinals for internal details.\n *\n *\n * Message example:\n *\n * I see {NUM_PEOPLE, plural, offset:1\n *         =0 {no one at all}\n *         =1 {{WHO}}\n *         one {{WHO} and one other person}\n *         other {{WHO} and # other people}}\n * in {PLACE}.\n *\n * Calling format({'NUM_PEOPLE': 2, 'WHO': 'Mark', 'PLACE': 'Athens'}) would\n * produce \"I see Mark and one other person in Athens.\" as output.\n *\n * OR:\n *\n * {NUM_FLOOR, selectordinal,\n *   one {Take the elevator to the #st floor.}\n *   two {Take the elevator to the #nd floor.}\n *   few {Take the elevator to the #rd floor.}\n *   other {Take the elevator to the #th floor.}}\n *\n * Calling format({'NUM_FLOOR': 22}) would produce\n * \"Take the elevator to the 22nd floor\".\n *\n * See messageformat_test.html for more examples.\n */\n\ngoog.provide('goog.i18n.MessageFormat');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.i18n.CompactNumberFormatSymbols');\ngoog.require('goog.i18n.NumberFormat');\ngoog.require('goog.i18n.NumberFormatSymbols');\ngoog.require('goog.i18n.ordinalRules');\ngoog.require('goog.i18n.pluralRules');\n\n\n\n/**\n * Constructor of MessageFormat.\n * @param {string} pattern The pattern we parse and apply positional parameters\n *     to.\n * @constructor\n * @final\n */\ngoog.i18n.MessageFormat = function(pattern) {\n  /**\n   * The pattern we parse and apply positional parameters to.\n   * @type {?string}\n   * @private\n   */\n  this.pattern_ = pattern;\n\n  /**\n   * All encountered literals during parse stage. Indices tell us the order of\n   * replacement.\n   * @type {?Array<string>}\n   * @private\n   */\n  this.initialLiterals_ = null;\n\n  /**\n   * Working array with all encountered literals during parse and format stages.\n   * Indices tell us the order of replacement.\n   * @type {?Array<string>}\n   * @private\n   */\n  this.literals_ = null;\n\n  /**\n   * Input pattern gets parsed into objects for faster formatting.\n   * @type {?Array<!goog.i18n.MessageFormat.BlockTypeVal_>}\n   * @private\n   */\n  this.parsedPattern_ = null;\n\n  /**\n   * Locale aware number formatter.\n   * @type {!goog.i18n.NumberFormat}\n   * @private\n   */\n  this.numberFormatter_ = goog.i18n.MessageFormat.getNumberFormatter_();\n};\n\n\n/**\n * Locale associated with the most recently created NumberFormat.\n * @type {?Object}\n * @private\n */\ngoog.i18n.MessageFormat.numberFormatterSymbols_ = null;\n\n\n/**\n * Locale associated with the most recently created NumberFormat.\n * @type {?Object}\n * @private\n */\ngoog.i18n.MessageFormat.compactNumberFormatterSymbols_ = null;\n\n\n/**\n * Locale aware number formatter. Reference to the most recently created\n * NumberFormat for sharing between MessageFormat instances.\n * @type {?goog.i18n.NumberFormat}\n * @private\n */\ngoog.i18n.MessageFormat.numberFormatter_ = null;\n\n\n/**\n * Literal strings, including '', are replaced with \\uFDDF_x_ for\n * parsing purposes, and recovered during format phase.\n * \\uFDDF is a Unicode nonprinting character, not expected to be found in the\n * typical message.\n * @type {string}\n * @private\n */\ngoog.i18n.MessageFormat.LITERAL_PLACEHOLDER_ = '\\uFDDF_';\n\n\n/**\n * Marks a string and block during parsing.\n * @enum {number}\n * @private\n */\ngoog.i18n.MessageFormat.Element_ = {\n  STRING: 0,\n  BLOCK: 1\n};\n\n\n/**\n * Block type.\n * @enum {number}\n * @private\n */\ngoog.i18n.MessageFormat.BlockType_ = {\n  PLURAL: 0,\n  ORDINAL: 1,\n  SELECT: 2,\n  SIMPLE: 3,\n  STRING: 4,\n  UNKNOWN: 5\n};\n\n\n/**\n * Mandatory option in both select and plural form.\n * @type {string}\n * @private\n */\ngoog.i18n.MessageFormat.OTHER_ = 'other';\n\n\n/**\n * Regular expression for looking for string literals.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.MessageFormat.REGEX_LITERAL_ = new RegExp(\"'([{}#].*?)'\", 'g');\n\n\n/**\n * Regular expression for looking for '' in the message.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.MessageFormat.REGEX_DOUBLE_APOSTROPHE_ = new RegExp(\"''\", 'g');\n\n/** @typedef {{ type: !goog.i18n.MessageFormat.Element_, value: ? }} */\ngoog.i18n.MessageFormat.TypeVal_;\n\n/** @typedef {{ type: !goog.i18n.MessageFormat.BlockType_, value: ? }} */\ngoog.i18n.MessageFormat.BlockTypeVal_;\n\n\n/**\n * Gets the a NumberFormat instance for the current locale.\n * If the locale is the same as the previous invocation, returns the same\n * NumberFormat instance. Otherwise, creates a new one.\n * @return {!goog.i18n.NumberFormat}\n * @private\n */\ngoog.i18n.MessageFormat.getNumberFormatter_ = function() {\n  var currentSymbols = goog.i18n.NumberFormatSymbols;\n  var currentCompactSymbols = goog.i18n.CompactNumberFormatSymbols;\n\n  if (goog.i18n.MessageFormat.numberFormatterSymbols_ !== currentSymbols ||\n      goog.i18n.MessageFormat.compactNumberFormatterSymbols_ !==\n          currentCompactSymbols) {\n    goog.i18n.MessageFormat.numberFormatterSymbols_ = currentSymbols;\n    goog.i18n.MessageFormat.compactNumberFormatterSymbols_ =\n        currentCompactSymbols;\n    goog.i18n.MessageFormat.numberFormatter_ =\n        new goog.i18n.NumberFormat(goog.i18n.NumberFormat.Format.DECIMAL);\n  }\n\n  return /** @type {!goog.i18n.NumberFormat} */ (\n      goog.i18n.MessageFormat.numberFormatter_);\n};\n\n\n/**\n * Formats a message, treating '#' with special meaning representing\n * the number (plural_variable - offset).\n * @param {!Object} namedParameters Parameters that either\n *     influence the formatting or are used as actual data.\n *     I.e. in call to fmt.format({'NUM_PEOPLE': 5, 'NAME': 'Angela'}),\n *     object {'NUM_PEOPLE': 5, 'NAME': 'Angela'} holds positional parameters.\n *     1st parameter could mean 5 people, which could influence plural format,\n *     and 2nd parameter is just a data to be printed out in proper position.\n * @return {string} Formatted message.\n */\ngoog.i18n.MessageFormat.prototype.format = function(namedParameters) {\n  return this.format_(namedParameters, false);\n};\n\n\n/**\n * Formats a message, treating '#' as literary character.\n * @param {!Object} namedParameters Parameters that either\n *     influence the formatting or are used as actual data.\n *     I.e. in call to fmt.format({'NUM_PEOPLE': 5, 'NAME': 'Angela'}),\n *     object {'NUM_PEOPLE': 5, 'NAME': 'Angela'} holds positional parameters.\n *     1st parameter could mean 5 people, which could influence plural format,\n *     and 2nd parameter is just a data to be printed out in proper position.\n * @return {string} Formatted message.\n */\ngoog.i18n.MessageFormat.prototype.formatIgnoringPound = function(\n    namedParameters) {\n  return this.format_(namedParameters, true);\n};\n\n\n/**\n * Formats a message.\n * @param {!Object} namedParameters Parameters that either\n *     influence the formatting or are used as actual data.\n *     I.e. in call to fmt.format({'NUM_PEOPLE': 5, 'NAME': 'Angela'}),\n *     object {'NUM_PEOPLE': 5, 'NAME': 'Angela'} holds positional parameters.\n *     1st parameter could mean 5 people, which could influence plural format,\n *     and 2nd parameter is just a data to be printed out in proper position.\n * @param {boolean} ignorePound If true, treat '#' in plural messages as a\n *     literary character, else treat it as an ICU syntax character, resolving\n *     to the number (plural_variable - offset).\n * @return {string} Formatted message.\n * @private\n */\ngoog.i18n.MessageFormat.prototype.format_ = function(\n    namedParameters, ignorePound) {\n  this.init_();\n  if (!this.parsedPattern_ || this.parsedPattern_.length == 0) {\n    return '';\n  }\n  this.literals_ = goog.array.clone(this.initialLiterals_);\n\n  var result = [];\n  this.formatBlock_(this.parsedPattern_, namedParameters, ignorePound, result);\n  var message = result.join('');\n\n  if (!ignorePound) {\n    goog.asserts.assert(message.search('#') == -1, 'Not all # were replaced.');\n  }\n\n  while (this.literals_.length > 0) {\n    message = message.replace(\n        this.buildPlaceholder_(this.literals_), this.literals_.pop());\n  }\n\n  return message;\n};\n\n\n/**\n * Parses generic block and returns a formatted string.\n * @param {!Array<!goog.i18n.MessageFormat.BlockTypeVal_>} parsedPattern\n *     Holds parsed tree.\n * @param {!Object} namedParameters Parameters that either influence\n *     the formatting or are used as actual data.\n * @param {boolean} ignorePound If true, treat '#' in plural messages as a\n *     literary character, else treat it as an ICU syntax character, resolving\n *     to the number (plural_variable - offset).\n * @param {!Array<string>} result Each formatting stage appends its product\n *     to the result.\n * @private\n */\ngoog.i18n.MessageFormat.prototype.formatBlock_ = function(\n    parsedPattern, namedParameters, ignorePound, result) {\n  for (var i = 0; i < parsedPattern.length; i++) {\n    switch (parsedPattern[i].type) {\n      case goog.i18n.MessageFormat.BlockType_.STRING:\n        result.push(parsedPattern[i].value);\n        break;\n      case goog.i18n.MessageFormat.BlockType_.SIMPLE:\n        var pattern = parsedPattern[i].value;\n        this.formatSimplePlaceholder_(pattern, namedParameters, result);\n        break;\n      case goog.i18n.MessageFormat.BlockType_.SELECT:\n        var pattern = parsedPattern[i].value;\n        this.formatSelectBlock_(pattern, namedParameters, ignorePound, result);\n        break;\n      case goog.i18n.MessageFormat.BlockType_.PLURAL:\n        var pattern = parsedPattern[i].value;\n        this.formatPluralOrdinalBlock_(\n            pattern, namedParameters, goog.i18n.pluralRules.select, ignorePound,\n            result);\n        break;\n      case goog.i18n.MessageFormat.BlockType_.ORDINAL:\n        var pattern = parsedPattern[i].value;\n        this.formatPluralOrdinalBlock_(\n            pattern, namedParameters, goog.i18n.ordinalRules.select,\n            ignorePound, result);\n        break;\n      default:\n        goog.asserts.fail('Unrecognized block type: ' + parsedPattern[i].type);\n    }\n  }\n};\n\n\n/**\n * Formats simple placeholder.\n * @param {!Object} parsedPattern JSON object containing placeholder info.\n * @param {!Object} namedParameters Parameters that are used as actual data.\n * @param {!Array<string>} result Each formatting stage appends its product\n *     to the result.\n * @private\n */\ngoog.i18n.MessageFormat.prototype.formatSimplePlaceholder_ = function(\n    parsedPattern, namedParameters, result) {\n  var value = namedParameters[parsedPattern];\n  if (value === undefined) {\n    result.push('Undefined parameter - ' + parsedPattern);\n    return;\n  }\n\n  // Don't push the value yet, it may contain any of # { } in it which\n  // will break formatter. Insert a placeholder and replace at the end.\n  this.literals_.push(value);\n  result.push(this.buildPlaceholder_(this.literals_));\n};\n\n\n/**\n * Formats select block. Only one option is selected.\n * @param {{argumentIndex:?}} parsedPattern JSON object containing select\n *     block info.\n * @param {!Object} namedParameters Parameters that either influence\n *     the formatting or are used as actual data.\n * @param {boolean} ignorePound If true, treat '#' in plural messages as a\n *     literary character, else treat it as an ICU syntax character, resolving\n *     to the number (plural_variable - offset).\n * @param {!Array<string>} result Each formatting stage appends its product\n *     to the result.\n * @private\n */\ngoog.i18n.MessageFormat.prototype.formatSelectBlock_ = function(\n    parsedPattern, namedParameters, ignorePound, result) {\n  var argumentIndex = parsedPattern.argumentIndex;\n  if (namedParameters[argumentIndex] === undefined) {\n    result.push('Undefined parameter - ' + argumentIndex);\n    return;\n  }\n\n  var option = parsedPattern[namedParameters[argumentIndex]];\n  if (option === undefined) {\n    option = parsedPattern[goog.i18n.MessageFormat.OTHER_];\n    goog.asserts.assertArray(\n        option, 'Invalid option or missing other option for select block.');\n  }\n\n  this.formatBlock_(option, namedParameters, ignorePound, result);\n};\n\n\n/**\n * Formats plural or selectordinal block. Only one option is selected and all #\n * are replaced.\n * @param {{argumentIndex, argumentOffset}} parsedPattern JSON object\n *     containing plural block info.\n * @param {!Object} namedParameters Parameters that either influence\n *     the formatting or are used as actual data.\n * @param {function(number, number=):string} pluralSelector  A select function\n *     from goog.i18n.pluralRules or goog.i18n.ordinalRules which determines\n *     which plural/ordinal form to use based on the input number's cardinality.\n * @param {boolean} ignorePound If true, treat '#' in plural messages as a\n *     literary character, else treat it as an ICU syntax character, resolving\n *     to the number (plural_variable - offset).\n * @param {!Array<string>} result Each formatting stage appends its product\n *     to the result.\n * @private\n */\ngoog.i18n.MessageFormat.prototype.formatPluralOrdinalBlock_ = function(\n    parsedPattern, namedParameters, pluralSelector, ignorePound, result) {\n  var argumentIndex = parsedPattern.argumentIndex;\n  var argumentOffset = parsedPattern.argumentOffset;\n  var pluralValue = +namedParameters[argumentIndex];\n  if (isNaN(pluralValue)) {\n    // TODO(user): Distinguish between undefined and invalid parameters.\n    result.push('Undefined or invalid parameter - ' + argumentIndex);\n    return;\n  }\n  var diff = pluralValue - argumentOffset;\n\n  // Check if there is an exact match.\n  var option = parsedPattern[namedParameters[argumentIndex]];\n  if (option === undefined) {\n    var item = pluralSelector(Math.abs(diff));\n    goog.asserts.assertString(item, 'Invalid plural key.');\n\n    option = parsedPattern[item];\n\n    // If option is not provided fall back to \"other\".\n    if (option === undefined) {\n      option = parsedPattern[goog.i18n.MessageFormat.OTHER_];\n    }\n\n    goog.asserts.assertArray(\n        option, 'Invalid option or missing other option for plural block.');\n  }\n\n  var pluralResult = [];\n  this.formatBlock_(option, namedParameters, ignorePound, pluralResult);\n  var plural = pluralResult.join('');\n  goog.asserts.assertString(plural, 'Empty block in plural.');\n  if (ignorePound) {\n    result.push(plural);\n  } else {\n    var localeAwareDiff = this.numberFormatter_.format(diff);\n    result.push(plural.replace(/#/g, localeAwareDiff));\n  }\n};\n\n\n/**\n * Set up the MessageFormat.\n * Parses input pattern into an array, for faster reformatting with\n * different input parameters.\n * Parsing is locale independent.\n * @private\n */\ngoog.i18n.MessageFormat.prototype.init_ = function() {\n  if (this.pattern_) {\n    this.initialLiterals_ = [];\n    var pattern = this.insertPlaceholders_(this.pattern_);\n\n    this.parsedPattern_ = this.parseBlock_(pattern);\n    this.pattern_ = null;\n  }\n};\n\n\n/**\n * Replaces string literals with literal placeholders.\n * Literals are string of the form '}...', '{...' and '#...' where ... is\n * set of characters not containing '\n * Builds a dictionary so we can recover literals during format phase.\n * @param {string} pattern Pattern to clean up.\n * @return {string} Pattern with literals replaced with placeholders.\n * @private\n */\ngoog.i18n.MessageFormat.prototype.insertPlaceholders_ = function(pattern) {\n  var literals = this.initialLiterals_;\n  var buildPlaceholder = goog.bind(this.buildPlaceholder_, this);\n\n  // First replace '' with single quote placeholder since they can be found\n  // inside other literals.\n  pattern = pattern.replace(\n      goog.i18n.MessageFormat.REGEX_DOUBLE_APOSTROPHE_, function() {\n        literals.push(\"'\");\n        return buildPlaceholder(literals);\n      });\n\n  pattern = pattern.replace(\n      goog.i18n.MessageFormat.REGEX_LITERAL_, function(match, text) {\n        literals.push(text);\n        return buildPlaceholder(literals);\n      });\n\n  return pattern;\n};\n\n\n/**\n * Breaks pattern into strings and top level {...} blocks.\n * @param {string} pattern (sub)Pattern to be broken.\n * @return {!Array<goog.i18n.MessageFormat.TypeVal_>}\n * @private\n */\ngoog.i18n.MessageFormat.prototype.extractParts_ = function(pattern) {\n  var prevPos = 0;\n  var braceStack = [];\n  var results = [];\n\n  var braces = /[{}]/g;\n  braces.lastIndex = 0;  // lastIndex doesn't get set to 0 so we have to.\n  var match;\n\n  while (match = braces.exec(pattern)) {\n    var pos = match.index;\n    if (match[0] == '}') {\n      var brace = braceStack.pop();\n      goog.asserts.assert(\n          brace !== undefined && brace == '{', 'No matching { for }.');\n\n      if (braceStack.length == 0) {\n        // End of the block.\n        var part = {};\n        part.type = goog.i18n.MessageFormat.Element_.BLOCK;\n        part.value = pattern.substring(prevPos, pos);\n        results.push(part);\n        prevPos = pos + 1;\n      }\n    } else {\n      if (braceStack.length == 0) {\n        var substring = pattern.substring(prevPos, pos);\n        if (substring != '') {\n          results.push({\n            type: goog.i18n.MessageFormat.Element_.STRING,\n            value: substring\n          });\n        }\n        prevPos = pos + 1;\n      }\n      braceStack.push('{');\n    }\n  }\n\n  // Take care of the final string, and check if the braceStack is empty.\n  goog.asserts.assert(\n      braceStack.length == 0, 'There are mismatched { or } in the pattern.');\n\n  var substring = pattern.substring(prevPos);\n  if (substring != '') {\n    results.push(\n        {type: goog.i18n.MessageFormat.Element_.STRING, value: substring});\n  }\n\n  return results;\n};\n\n\n/**\n * A regular expression to parse the plural block, extracting the argument\n * index and offset (if any).\n * @type {RegExp}\n * @private\n */\ngoog.i18n.MessageFormat.PLURAL_BLOCK_RE_ =\n    /^\\s*(\\w+)\\s*,\\s*plural\\s*,(?:\\s*offset:(\\d+))?/;\n\n\n/**\n * A regular expression to parse the ordinal block, extracting the argument\n * index.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.MessageFormat.ORDINAL_BLOCK_RE_ = /^\\s*(\\w+)\\s*,\\s*selectordinal\\s*,/;\n\n\n/**\n * A regular expression to parse the select block, extracting the argument\n * index.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.MessageFormat.SELECT_BLOCK_RE_ = /^\\s*(\\w+)\\s*,\\s*select\\s*,/;\n\n\n/**\n * Detects which type of a block is the pattern.\n * @param {string} pattern Content of the block.\n * @return {goog.i18n.MessageFormat.BlockType_} One of the block types.\n * @private\n */\ngoog.i18n.MessageFormat.prototype.parseBlockType_ = function(pattern) {\n  if (goog.i18n.MessageFormat.PLURAL_BLOCK_RE_.test(pattern)) {\n    return goog.i18n.MessageFormat.BlockType_.PLURAL;\n  }\n\n  if (goog.i18n.MessageFormat.ORDINAL_BLOCK_RE_.test(pattern)) {\n    return goog.i18n.MessageFormat.BlockType_.ORDINAL;\n  }\n\n  if (goog.i18n.MessageFormat.SELECT_BLOCK_RE_.test(pattern)) {\n    return goog.i18n.MessageFormat.BlockType_.SELECT;\n  }\n\n  if (/^\\s*\\w+\\s*/.test(pattern)) {\n    return goog.i18n.MessageFormat.BlockType_.SIMPLE;\n  }\n\n  return goog.i18n.MessageFormat.BlockType_.UNKNOWN;\n};\n\n\n/**\n * Parses generic block.\n * @param {string} pattern Content of the block to parse.\n * @return {!Array<!goog.i18n.MessageFormat.BlockTypeVal_>} Subblocks marked as\n *     strings, select...\n * @private\n */\ngoog.i18n.MessageFormat.prototype.parseBlock_ = function(pattern) {\n  var result = [];\n  var parts = this.extractParts_(pattern);\n  for (var i = 0; i < parts.length; i++) {\n    var block = {};\n    if (goog.i18n.MessageFormat.Element_.STRING == parts[i].type) {\n      block.type = goog.i18n.MessageFormat.BlockType_.STRING;\n      block.value = parts[i].value;\n    } else if (goog.i18n.MessageFormat.Element_.BLOCK == parts[i].type) {\n      var blockType = this.parseBlockType_(parts[i].value);\n\n      switch (blockType) {\n        case goog.i18n.MessageFormat.BlockType_.SELECT:\n          block.type = goog.i18n.MessageFormat.BlockType_.SELECT;\n          block.value = this.parseSelectBlock_(parts[i].value);\n          break;\n        case goog.i18n.MessageFormat.BlockType_.PLURAL:\n          block.type = goog.i18n.MessageFormat.BlockType_.PLURAL;\n          block.value = this.parsePluralBlock_(parts[i].value);\n          break;\n        case goog.i18n.MessageFormat.BlockType_.ORDINAL:\n          block.type = goog.i18n.MessageFormat.BlockType_.ORDINAL;\n          block.value = this.parseOrdinalBlock_(parts[i].value);\n          break;\n        case goog.i18n.MessageFormat.BlockType_.SIMPLE:\n          block.type = goog.i18n.MessageFormat.BlockType_.SIMPLE;\n          block.value = parts[i].value;\n          break;\n        default:\n          goog.asserts.fail(\n              'Unknown block type for pattern: ' + parts[i].value);\n      }\n    } else {\n      goog.asserts.fail('Unknown part of the pattern.');\n    }\n    result.push(block);\n  }\n\n  return result;\n};\n\n\n/**\n * Parses a select type of a block and produces JSON object for it.\n * @param {string} pattern Subpattern that needs to be parsed as select pattern.\n * @return {!Object<string, !Array<!goog.i18n.MessageFormat.BlockTypeVal_>>}\n *     Object with select block info.\n * @private\n */\ngoog.i18n.MessageFormat.prototype.parseSelectBlock_ = function(pattern) {\n  var argumentIndex = '';\n  var replaceRegex = goog.i18n.MessageFormat.SELECT_BLOCK_RE_;\n  pattern = pattern.replace(replaceRegex, function(string, name) {\n    argumentIndex = name;\n    return '';\n  });\n  var result = {};\n  result.argumentIndex = argumentIndex;\n\n  var parts = this.extractParts_(pattern);\n  // Looking for (key block)+ sequence. One of the keys has to be \"other\".\n  var pos = 0;\n  while (pos < parts.length) {\n    var key = parts[pos].value;\n    goog.asserts.assertString(key, 'Missing select key element.');\n\n    pos++;\n    goog.asserts.assert(\n        pos < parts.length, 'Missing or invalid select value element.');\n\n    var value;\n    if (goog.i18n.MessageFormat.Element_.BLOCK == parts[pos].type) {\n      value = this.parseBlock_(parts[pos].value);\n    } else {\n      goog.asserts.fail('Expected block type.');\n    }\n    result[key.replace(/\\s/g, '')] = value;\n    pos++;\n  }\n\n  goog.asserts.assertArray(\n      result[goog.i18n.MessageFormat.OTHER_],\n      'Missing other key in select statement.');\n  return result;\n};\n\n\n/**\n * Parses a plural type of a block and produces JSON object for it.\n * @param {string} pattern Subpattern that needs to be parsed as plural pattern.\n * @return {!Object<string, !Array<!goog.i18n.MessageFormat.BlockTypeVal_>>}\n *     Object with select block info.\n * @private\n */\ngoog.i18n.MessageFormat.prototype.parsePluralBlock_ = function(pattern) {\n  var argumentIndex = '';\n  var argumentOffset = 0;\n  var replaceRegex = goog.i18n.MessageFormat.PLURAL_BLOCK_RE_;\n  pattern = pattern.replace(replaceRegex, function(string, name, offset) {\n    argumentIndex = name;\n    if (offset) {\n      argumentOffset = parseInt(offset, 10);\n    }\n    return '';\n  });\n\n  var result = {};\n  result.argumentIndex = argumentIndex;\n  result.argumentOffset = argumentOffset;\n\n  var parts = this.extractParts_(pattern);\n  // Looking for (key block)+ sequence.\n  var pos = 0;\n  while (pos < parts.length) {\n    var key = parts[pos].value;\n    goog.asserts.assertString(key, 'Missing plural key element.');\n\n    pos++;\n    goog.asserts.assert(\n        pos < parts.length, 'Missing or invalid plural value element.');\n\n    var value;\n    if (goog.i18n.MessageFormat.Element_.BLOCK == parts[pos].type) {\n      value = this.parseBlock_(parts[pos].value);\n    } else {\n      goog.asserts.fail('Expected block type.');\n    }\n    result[key.replace(/\\s*(?:=)?(\\w+)\\s*/, '$1')] = value;\n    pos++;\n  }\n\n  goog.asserts.assertArray(\n      result[goog.i18n.MessageFormat.OTHER_],\n      'Missing other key in plural statement.');\n\n  return result;\n};\n\n\n/**\n * Parses an ordinal type of a block and produces JSON object for it.\n * For example the input string:\n *  '{FOO, selectordinal, one {Message A}other {Message B}}'\n * Should result in the output object:\n * {\n *   argumentIndex: 'FOO',\n *   argumentOffest: 0,\n *   one: [ { type: 4, value: 'Message A' } ],\n *   other: [ { type: 4, value: 'Message B' } ]\n * }\n * @param {string} pattern Subpattern that needs to be parsed as plural pattern.\n * @return {!Object} Object with select block info.\n * @private\n */\ngoog.i18n.MessageFormat.prototype.parseOrdinalBlock_ = function(pattern) {\n  var argumentIndex = '';\n  var replaceRegex = goog.i18n.MessageFormat.ORDINAL_BLOCK_RE_;\n  pattern = pattern.replace(replaceRegex, function(string, name) {\n    argumentIndex = name;\n    return '';\n  });\n\n  var result = {};\n  result.argumentIndex = argumentIndex;\n  result.argumentOffset = 0;\n\n  var parts = this.extractParts_(pattern);\n  // Looking for (key block)+ sequence.\n  var pos = 0;\n  while (pos < parts.length) {\n    var key = parts[pos].value;\n    goog.asserts.assertString(key, 'Missing ordinal key element.');\n\n    pos++;\n    goog.asserts.assert(\n        pos < parts.length, 'Missing or invalid ordinal value element.');\n\n    if (goog.i18n.MessageFormat.Element_.BLOCK == parts[pos].type) {\n      var value = this.parseBlock_(parts[pos].value);\n    } else {\n      goog.asserts.fail('Expected block type.');\n    }\n    result[key.replace(/\\s*(?:=)?(\\w+)\\s*/, '$1')] = value;\n    pos++;\n  }\n\n  goog.asserts.assertArray(\n      result[goog.i18n.MessageFormat.OTHER_],\n      'Missing other key in selectordinal statement.');\n\n  return result;\n};\n\n\n/**\n * Builds a placeholder from the last index of the array.\n * @param {!Array<string>} literals All literals encountered during parse.\n * @return {string} \\uFDDF_ + last index + _.\n * @private\n */\ngoog.i18n.MessageFormat.prototype.buildPlaceholder_ = function(literals) {\n  goog.asserts.assert(literals.length > 0, 'Literal array is empty.');\n\n  var index = (literals.length - 1).toString(10);\n  return goog.i18n.MessageFormat.LITERAL_PLACEHOLDER_ + index + '_';\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9>","~$goog.i18n.NumberFormat","~$goog.i18n.pluralRules","^;0","^;9","~$goog.i18n.CompactNumberFormatSymbols","^9?"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/messageformat.js"],"^:1",["^9K",["~$goog.i18n.MessageFormat"]],"^9<",true,"^9=",["^9>","^;9","^:E","^@L","^@J","^9?","^;0","^@K"]],["^ ","^9A",[1579837703000],"^9B","goog.format.htmlprettyprinter.js","^9C",["^9D","goog/format/htmlprettyprinter.js"],"^9E","goog/format/htmlprettyprinter.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides functions to parse and pretty-print HTML strings.\n *\n */\n\ngoog.provide('goog.format.HtmlPrettyPrinter');\ngoog.provide('goog.format.HtmlPrettyPrinter.Buffer');\n\ngoog.require('goog.dom.TagName');\ngoog.require('goog.object');\ngoog.require('goog.string.StringBuffer');\n\n\n\n/**\n * This class formats HTML to be more human-readable.\n * TODO(user): Add hierarchical indentation.\n * @param {number=} opt_timeOutMillis Max # milliseconds to spend on #format. If\n *     this time is exceeded, return partially formatted. 0 or negative number\n *     indicates no timeout.\n * @constructor\n * @final\n */\ngoog.format.HtmlPrettyPrinter = function(opt_timeOutMillis) {\n  /**\n   * Max # milliseconds to spend on #format.\n   * @type {number}\n   * @private\n   */\n  this.timeOutMillis_ =\n      opt_timeOutMillis && opt_timeOutMillis > 0 ? opt_timeOutMillis : 0;\n};\n\n\n/**\n * Singleton.\n * @private {goog.format.HtmlPrettyPrinter?}\n */\ngoog.format.HtmlPrettyPrinter.instance_ = null;\n\n\n/**\n * Singleton lazy initializer.\n * @return {!goog.format.HtmlPrettyPrinter} Singleton.\n * @private\n */\ngoog.format.HtmlPrettyPrinter.getInstance_ = function() {\n  if (!goog.format.HtmlPrettyPrinter.instance_) {\n    goog.format.HtmlPrettyPrinter.instance_ =\n        new goog.format.HtmlPrettyPrinter();\n  }\n  return goog.format.HtmlPrettyPrinter.instance_;\n};\n\n\n/**\n * Static utility function. See prototype #format.\n * @param {string} html The HTML text to pretty print.\n * @return {string} Formatted result.\n */\ngoog.format.HtmlPrettyPrinter.format = function(html) {\n  return goog.format.HtmlPrettyPrinter.getInstance_().format(html);\n};\n\n\n/**\n * List of patterns used to tokenize HTML for pretty printing. Cache\n * subexpression for tag name.\n * comment|meta-tag|tag|text|other-less-than-characters\n * @private {!RegExp}\n * @const\n */\ngoog.format.HtmlPrettyPrinter.TOKEN_REGEX_ =\n    /(?:<!--.*?-->|<!.*?>|<(\\/?)(\\w+)[^<>]*>|[^<]+|<)/g;\n\n\n/**\n * Tags whose contents we don't want pretty printed.\n * @private {!Object}\n * @const\n */\ngoog.format.HtmlPrettyPrinter.NON_PRETTY_PRINTED_TAGS_ = goog.object.createSet(\n    goog.dom.TagName.SCRIPT, goog.dom.TagName.STYLE, goog.dom.TagName.PRE,\n    'XMP');\n\n\n/**\n * 'Block' tags. We should add newlines before and after these tags during\n * pretty printing. Tags drawn mostly from HTML4 definitions for block and other\n * non-online tags, excepting the ones in\n * #goog.format.HtmlPrettyPrinter.NON_PRETTY_PRINTED_TAGS_.\n * @private {!Object}\n * @const\n */\ngoog.format.HtmlPrettyPrinter.BLOCK_TAGS_ = goog.object.createSet(\n    goog.dom.TagName.ADDRESS, goog.dom.TagName.APPLET, goog.dom.TagName.AREA,\n    goog.dom.TagName.BASE, goog.dom.TagName.BASEFONT,\n    goog.dom.TagName.BLOCKQUOTE, goog.dom.TagName.BODY,\n    goog.dom.TagName.CAPTION, goog.dom.TagName.CENTER, goog.dom.TagName.COL,\n    goog.dom.TagName.COLGROUP, goog.dom.TagName.DIR, goog.dom.TagName.DIV,\n    goog.dom.TagName.DL, goog.dom.TagName.FIELDSET, goog.dom.TagName.FORM,\n    goog.dom.TagName.FRAME, goog.dom.TagName.FRAMESET, goog.dom.TagName.H1,\n    goog.dom.TagName.H2, goog.dom.TagName.H3, goog.dom.TagName.H4,\n    goog.dom.TagName.H5, goog.dom.TagName.H6, goog.dom.TagName.HEAD,\n    goog.dom.TagName.HR, goog.dom.TagName.HTML, goog.dom.TagName.IFRAME,\n    goog.dom.TagName.ISINDEX, goog.dom.TagName.LEGEND, goog.dom.TagName.LINK,\n    goog.dom.TagName.MENU, goog.dom.TagName.META, goog.dom.TagName.NOFRAMES,\n    goog.dom.TagName.NOSCRIPT, goog.dom.TagName.OL, goog.dom.TagName.OPTGROUP,\n    goog.dom.TagName.OPTION, goog.dom.TagName.P, goog.dom.TagName.PARAM,\n    goog.dom.TagName.TABLE, goog.dom.TagName.TBODY, goog.dom.TagName.TD,\n    goog.dom.TagName.TFOOT, goog.dom.TagName.TH, goog.dom.TagName.THEAD,\n    goog.dom.TagName.TITLE, goog.dom.TagName.TR, goog.dom.TagName.UL);\n\n\n/**\n * Non-block tags that break flow. We insert a line break after, but not before\n * these. Tags drawn from HTML4 definitions.\n * @private {!Object}\n * @const\n */\ngoog.format.HtmlPrettyPrinter.BREAKS_FLOW_TAGS_ = goog.object.createSet(\n    goog.dom.TagName.BR, goog.dom.TagName.DD, goog.dom.TagName.DT,\n    goog.dom.TagName.LI, goog.dom.TagName.NOFRAMES);\n\n\n/**\n * Empty tags. These are treated as both start and end tags.\n * @private {!Object}\n * @const\n */\ngoog.format.HtmlPrettyPrinter.EMPTY_TAGS_ = goog.object.createSet(\n    goog.dom.TagName.BR, goog.dom.TagName.HR, goog.dom.TagName.ISINDEX);\n\n\n/**\n * Breaks up HTML so it's easily readable by the user.\n * @param {string} html The HTML text to pretty print.\n * @return {string} Formatted result.\n * @throws {Error} Regex error, data loss, or endless loop detected.\n */\ngoog.format.HtmlPrettyPrinter.prototype.format = function(html) {\n  // Trim leading whitespace, but preserve first indent; in other words, keep\n  // any spaces immediately before the first non-whitespace character (that's\n  // what $1 is), but remove all other leading whitespace. This adjustment\n  // historically had been made in Docs. The motivation is that some\n  // browsers prepend several line breaks in designMode.\n  html = html.replace(/^\\s*?( *\\S)/, '$1');\n\n  // Trim trailing whitespace.\n  html = html.replace(/\\s+$/, '');\n\n  // Keep track of how much time we've used.\n  var timeOutMillis = this.timeOutMillis_;\n  var startMillis = timeOutMillis ? goog.now() : 0;\n\n  // Handles concatenation of the result and required line breaks.\n  var buffer = new goog.format.HtmlPrettyPrinter.Buffer();\n\n  // Declare these for efficiency since we access them in a loop.\n  var tokenRegex = goog.format.HtmlPrettyPrinter.TOKEN_REGEX_;\n  var nonPpTags = goog.format.HtmlPrettyPrinter.NON_PRETTY_PRINTED_TAGS_;\n  var blockTags = goog.format.HtmlPrettyPrinter.BLOCK_TAGS_;\n  var breaksFlowTags = goog.format.HtmlPrettyPrinter.BREAKS_FLOW_TAGS_;\n  var emptyTags = goog.format.HtmlPrettyPrinter.EMPTY_TAGS_;\n\n  // Used to verify we're making progress through our regex tokenization.\n  var lastIndex = 0;\n\n  // Use this to track non-pretty-printed tags and children.\n  var nonPpTagStack = [];\n\n  // Loop through each matched token.\n  var match;\n  while (match = tokenRegex.exec(html)) {\n    // Get token.\n    var token = match[0];\n\n    // Is this token a tag? match.length == 3 for tags, 1 for all others.\n    if (match.length == 3) {\n      var tagName = match[2];\n      if (tagName) {\n        tagName = tagName.toUpperCase();\n      }\n\n      // Non-pretty-printed tags?\n      if (nonPpTags.hasOwnProperty(tagName)) {\n        // End tag?\n        if (match[1] == '/') {\n          // Do we have a matching start tag?\n          var stackSize = nonPpTagStack.length;\n          var startTagName = stackSize ? nonPpTagStack[stackSize - 1] : null;\n          if (startTagName == tagName) {\n            // End of non-pretty-printed block. Line break after.\n            nonPpTagStack.pop();\n            buffer.pushToken(false, token, !nonPpTagStack.length);\n          } else {\n            // Malformed HTML. No line breaks.\n            buffer.pushToken(false, token, false);\n          }\n        } else {\n          // Start of non-pretty-printed block. Line break before.\n          buffer.pushToken(!nonPpTagStack.length, token, false);\n          nonPpTagStack.push(tagName);\n        }\n      } else if (nonPpTagStack.length) {\n        // Inside non-pretty-printed block, no new line breaks.\n        buffer.pushToken(false, token, false);\n      } else if (blockTags.hasOwnProperty(tagName)) {\n        // Put line break before start block and after end block tags.\n        var isEmpty = emptyTags.hasOwnProperty(tagName);\n        var isEndTag = match[1] == '/';\n        buffer.pushToken(isEmpty || !isEndTag, token, isEmpty || isEndTag);\n      } else if (breaksFlowTags.hasOwnProperty(tagName)) {\n        var isEmpty = emptyTags.hasOwnProperty(tagName);\n        var isEndTag = match[1] == '/';\n        // Put line break after end flow-breaking tags.\n        buffer.pushToken(false, token, isEndTag || isEmpty);\n      } else {\n        // All other tags, no line break.\n        buffer.pushToken(false, token, false);\n      }\n    } else {\n      // Non-tags, no line break.\n      buffer.pushToken(false, token, false);\n    }\n\n    // Double check that we're making progress.\n    var newLastIndex = tokenRegex.lastIndex;\n    if (!token || newLastIndex <= lastIndex) {\n      throw new Error('Regex failed to make progress through source html.');\n    }\n    lastIndex = newLastIndex;\n\n    // Out of time?\n    if (timeOutMillis) {\n      if (goog.now() - startMillis > timeOutMillis) {\n        // Push unprocessed data as one big token and reset regex object.\n        buffer.pushToken(false, html.substring(tokenRegex.lastIndex), false);\n        tokenRegex.lastIndex = 0;\n        break;\n      }\n    }\n  }\n\n  // Ensure we end in a line break.\n  buffer.lineBreak();\n\n  // Construct result string.\n  var result = String(buffer);\n\n  // Length should be original length plus # line breaks added.\n  var expectedLength = html.length + buffer.breakCount;\n  if (result.length != expectedLength) {\n    throw new Error('Lost data pretty printing html.');\n  }\n\n  return result;\n};\n\n\n\n/**\n * This class is a buffer to which we push our output. It tracks line breaks to\n * make sure we don't add unnecessary ones.\n * @constructor\n * @final\n */\ngoog.format.HtmlPrettyPrinter.Buffer = function() {\n  /**\n   * Tokens to be output in #toString.\n   * @type {goog.string.StringBuffer}\n   * @private\n   */\n  this.out_ = new goog.string.StringBuffer();\n};\n\n\n/**\n * Tracks number of line breaks added.\n * @type {number}\n */\ngoog.format.HtmlPrettyPrinter.Buffer.prototype.breakCount = 0;\n\n\n/**\n * Tracks if we are at the start of a new line.\n * @type {boolean}\n * @private\n */\ngoog.format.HtmlPrettyPrinter.Buffer.prototype.isBeginningOfNewLine_ = true;\n\n\n/**\n * Tracks if we need a new line before the next token.\n * @type {boolean}\n * @private\n */\ngoog.format.HtmlPrettyPrinter.Buffer.prototype.needsNewLine_ = false;\n\n\n/**\n * Adds token and necessary line breaks to output buffer.\n * @param {boolean} breakBefore If true, add line break before token if\n *     necessary.\n * @param {string} token Token to push.\n * @param {boolean} breakAfter If true, add line break after token if\n *     necessary.\n */\ngoog.format.HtmlPrettyPrinter.Buffer.prototype.pushToken = function(\n    breakBefore, token, breakAfter) {\n  // If this token needs a preceding line break, and\n  // we haven't already added a line break, and\n  // this token does not start with a line break,\n  // then add line break.\n  // Due to FF3.0 bug with lists, we don't insert a /n\n  // right before </ul>. See bug 1520665.\n  if ((this.needsNewLine_ || breakBefore) && !/^\\r?\\n/.test(token) &&\n      !/\\/ul/i.test(token)) {\n    this.lineBreak();\n  }\n\n  // Token.\n  this.out_.append(token);\n\n  // Remember if this string ended with a line break so we know we don't have to\n  // insert another one before the next token.\n  this.isBeginningOfNewLine_ = /\\r?\\n$/.test(token);\n\n  // Remember if this token requires a line break after it. We don't insert it\n  // here because we might not have to if the next token starts with a line\n  // break.\n  this.needsNewLine_ = breakAfter && !this.isBeginningOfNewLine_;\n};\n\n\n/**\n * Append line break if we need one.\n */\ngoog.format.HtmlPrettyPrinter.Buffer.prototype.lineBreak = function() {\n  if (!this.isBeginningOfNewLine_) {\n    this.out_.append('\\n');\n    ++this.breakCount;\n  }\n};\n\n\n/**\n * @return {string} String representation of tokens.\n * @override\n */\ngoog.format.HtmlPrettyPrinter.Buffer.prototype.toString = function() {\n  return this.out_.toString();\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^;P","^<1","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/format/htmlprettyprinter.js"],"^:1",["^9K",["~$goog.format.HtmlPrettyPrinter.Buffer","~$goog.format.HtmlPrettyPrinter"]],"^9<",true,"^9=",["^9>","^;=","^;P","^<1"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.selectionmodel.js","^9C",["^9D","goog/ui/selectionmodel.js"],"^9E","goog/ui/selectionmodel.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Single-selection model implemenation.\n *\n * TODO(attila): Add keyboard & mouse event hooks?\n * TODO(attila): Add multiple selection?\n *\n * @author attila@google.com (Attila Bodis)\n */\n\n\ngoog.provide('goog.ui.SelectionModel');\n\ngoog.require('goog.array');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\n\n\n\n/**\n * Single-selection model.  Dispatches a {@link goog.events.EventType.SELECT}\n * event when a selection is made.\n * @param {Array<Object>=} opt_items Array of items; defaults to empty.\n * @extends {goog.events.EventTarget}\n * @constructor\n */\ngoog.ui.SelectionModel = function(opt_items) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * Array of items controlled by the selection model.  If the items support\n   * the `setSelected(Boolean)` interface, they will be (de)selected\n   * as needed.\n   * @type {!Array<Object>}\n   * @private\n   */\n  this.items_ = [];\n  this.addItems(opt_items);\n};\ngoog.inherits(goog.ui.SelectionModel, goog.events.EventTarget);\ngoog.tagUnsealableClass(goog.ui.SelectionModel);\n\n\n/**\n * The currently selected item (null if none).\n * @type {?Object}\n * @private\n */\ngoog.ui.SelectionModel.prototype.selectedItem_ = null;\n\n\n/**\n * Selection handler function.  Called with two arguments (the item to be\n * selected or deselected, and a Boolean indicating whether the item is to\n * be selected or deselected).\n * @type {?Function}\n * @private\n */\ngoog.ui.SelectionModel.prototype.selectionHandler_ = null;\n\n\n/**\n * Returns the selection handler function used by the selection model to change\n * the internal selection state of items under its control.\n * @return {Function} Selection handler function (null if none).\n */\ngoog.ui.SelectionModel.prototype.getSelectionHandler = function() {\n  return this.selectionHandler_;\n};\n\n\n/**\n * Sets the selection handler function to be used by the selection model to\n * change the internal selection state of items under its control.  The\n * function must take two arguments:  an item and a Boolean to indicate whether\n * the item is to be selected or deselected.  Selection handler functions are\n * only needed if the items in the selection model don't natively support the\n * `setSelected(Boolean)` interface.\n * @param {Function} handler Selection handler function.\n */\ngoog.ui.SelectionModel.prototype.setSelectionHandler = function(handler) {\n  this.selectionHandler_ = handler;\n};\n\n\n/**\n * Returns the number of items controlled by the selection model.\n * @return {number} Number of items.\n */\ngoog.ui.SelectionModel.prototype.getItemCount = function() {\n  return this.items_.length;\n};\n\n\n/**\n * Returns the 0-based index of the given item within the selection model, or\n * -1 if no such item is found.\n * @param {Object|undefined} item Item to look for.\n * @return {number} Index of the given item (-1 if none).\n */\ngoog.ui.SelectionModel.prototype.indexOfItem = function(item) {\n  return item ? goog.array.indexOf(this.items_, item) : -1;\n};\n\n\n/**\n * @return {Object|undefined} The first item, or undefined if there are no items\n *     in the model.\n */\ngoog.ui.SelectionModel.prototype.getFirst = function() {\n  return this.items_[0];\n};\n\n\n/**\n * @return {Object|undefined} The last item, or undefined if there are no items\n *     in the model.\n */\ngoog.ui.SelectionModel.prototype.getLast = function() {\n  return this.items_[this.items_.length - 1];\n};\n\n\n/**\n * Returns the item at the given 0-based index.\n * @param {number} index Index of the item to return.\n * @return {Object} Item at the given index (null if none).\n */\ngoog.ui.SelectionModel.prototype.getItemAt = function(index) {\n  return this.items_[index] || null;\n};\n\n\n/**\n * Bulk-adds items to the selection model.  This is more efficient than calling\n * {@link #addItem} for each new item.\n * @param {Array<Object>|undefined} items New items to add.\n */\ngoog.ui.SelectionModel.prototype.addItems = function(items) {\n  if (items) {\n    // New items shouldn't be selected.\n    goog.array.forEach(\n        items, function(item) { this.selectItem_(item, false); }, this);\n    goog.array.extend(this.items_, items);\n  }\n};\n\n\n/**\n * Adds an item at the end of the list.\n * @param {Object} item Item to add.\n */\ngoog.ui.SelectionModel.prototype.addItem = function(item) {\n  this.addItemAt(item, this.getItemCount());\n};\n\n\n/**\n * Adds an item at the given index.\n * @param {Object} item Item to add.\n * @param {number} index Index at which to add the new item.\n */\ngoog.ui.SelectionModel.prototype.addItemAt = function(item, index) {\n  if (item) {\n    // New items must not be selected.\n    this.selectItem_(item, false);\n    goog.array.insertAt(this.items_, item, index);\n  }\n};\n\n\n/**\n * Removes the given item (if it exists).  Dispatches a `SELECT` event if\n * the removed item was the currently selected item.\n * @param {Object} item Item to remove.\n */\ngoog.ui.SelectionModel.prototype.removeItem = function(item) {\n  if (item && goog.array.remove(this.items_, item)) {\n    if (item == this.selectedItem_) {\n      this.selectedItem_ = null;\n      this.dispatchEvent(goog.events.EventType.SELECT);\n    }\n  }\n};\n\n\n/**\n * Removes the item at the given index.\n * @param {number} index Index of the item to remove.\n */\ngoog.ui.SelectionModel.prototype.removeItemAt = function(index) {\n  this.removeItem(this.getItemAt(index));\n};\n\n\n/**\n * @return {Object} The currently selected item, or null if none.\n */\ngoog.ui.SelectionModel.prototype.getSelectedItem = function() {\n  return this.selectedItem_;\n};\n\n\n/**\n * @return {!Array<Object>} All items in the selection model.\n */\ngoog.ui.SelectionModel.prototype.getItems = function() {\n  return goog.array.clone(this.items_);\n};\n\n\n/**\n * Selects the given item, deselecting any previously selected item, and\n * dispatches a `SELECT` event.\n * @param {Object} item Item to select (null to clear the selection).\n */\ngoog.ui.SelectionModel.prototype.setSelectedItem = function(item) {\n  if (item != this.selectedItem_) {\n    this.selectItem_(this.selectedItem_, false);\n    this.selectedItem_ = item;\n    this.selectItem_(item, true);\n  }\n\n  // Always dispatch a SELECT event; let listeners decide what to do if the\n  // selected item hasn't changed.\n  this.dispatchEvent(goog.events.EventType.SELECT);\n};\n\n\n/**\n * @return {number} The 0-based index of the currently selected item, or -1\n *     if none.\n */\ngoog.ui.SelectionModel.prototype.getSelectedIndex = function() {\n  return this.indexOfItem(this.selectedItem_);\n};\n\n\n/**\n * Selects the item at the given index, deselecting any previously selected\n * item, and dispatches a `SELECT` event.\n * @param {number} index Index to select (-1 to clear the selection).\n */\ngoog.ui.SelectionModel.prototype.setSelectedIndex = function(index) {\n  this.setSelectedItem(this.getItemAt(index));\n};\n\n\n/**\n * Clears the selection model by removing all items from the selection.\n */\ngoog.ui.SelectionModel.prototype.clear = function() {\n  goog.array.clear(this.items_);\n  this.selectedItem_ = null;\n};\n\n\n/** @override */\ngoog.ui.SelectionModel.prototype.disposeInternal = function() {\n  goog.ui.SelectionModel.superClass_.disposeInternal.call(this);\n  delete this.items_;\n  this.selectedItem_ = null;\n};\n\n\n/**\n * Private helper; selects or deselects the given item based on the value of\n * the `select` argument.  If a selection handler has been registered\n * (via {@link #setSelectionHandler}, calls it to update the internal selection\n * state of the item.  Otherwise, attempts to call `setSelected(Boolean)`\n * on the item itself, provided the object supports that interface.\n * @param {Object} item Item to select or deselect.\n * @param {boolean} select If true, the object will be selected; if false, it\n *     will be deselected.\n * @private\n */\ngoog.ui.SelectionModel.prototype.selectItem_ = function(item, select) {\n  if (item) {\n    if (typeof this.selectionHandler_ == 'function') {\n      // Use the registered selection handler function.\n      this.selectionHandler_(item, select);\n    } else if (typeof item.setSelected == 'function') {\n      // Call setSelected() on the item, if it supports it.\n      item.setSelected(select);\n    }\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:L","^:I","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/selectionmodel.js"],"^:1",["^9K",["~$goog.ui.SelectionModel"]],"^9<",true,"^9=",["^9>","^;9","^:L","^:I"]],["^ ","^9A",[1579837703000],"^9B","goog.net.xpc.iframepollingtransport.js","^9C",["^9D","goog/net/xpc/iframepollingtransport.js"],"^9E","goog/net/xpc/iframepollingtransport.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Contains the iframe polling transport.\n */\n\n\ngoog.provide('goog.net.xpc.IframePollingTransport');\ngoog.provide('goog.net.xpc.IframePollingTransport.Receiver');\ngoog.provide('goog.net.xpc.IframePollingTransport.Sender');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.log');\ngoog.require('goog.log.Level');\ngoog.require('goog.net.xpc');\ngoog.require('goog.net.xpc.CfgFields');\ngoog.require('goog.net.xpc.CrossPageChannelRole');\ngoog.require('goog.net.xpc.Transport');\ngoog.require('goog.net.xpc.TransportTypes');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Iframe polling transport. Uses hidden iframes to transfer data\n * in the fragment identifier of the URL. The peer polls the iframe's location\n * for changes.\n * Unfortunately, in Safari this screws up the history, because Safari doesn't\n * allow to call location.replace() on a window containing a document from a\n * different domain (last version tested: 2.0.4).\n *\n * @param {goog.net.xpc.CrossPageChannel} channel The channel this\n *     transport belongs to.\n * @param {goog.dom.DomHelper=} opt_domHelper The dom helper to use for finding\n *     the correct window.\n * @constructor\n * @extends {goog.net.xpc.Transport}\n * @final\n */\ngoog.net.xpc.IframePollingTransport = function(channel, opt_domHelper) {\n  goog.net.xpc.IframePollingTransport.base(this, 'constructor', opt_domHelper);\n\n  /**\n   * The channel this transport belongs to.\n   * @type {goog.net.xpc.CrossPageChannel}\n   * @private\n   */\n  this.channel_ = channel;\n\n  /**\n   * The URI used to send messages.\n   * @type {string}\n   * @private\n   */\n  this.sendUri_ =\n      this.channel_.getConfig()[goog.net.xpc.CfgFields.PEER_POLL_URI];\n\n  /**\n   * The URI which is polled for incoming messages.\n   * @type {string}\n   * @private\n   */\n  this.rcvUri_ =\n      this.channel_.getConfig()[goog.net.xpc.CfgFields.LOCAL_POLL_URI];\n\n  /**\n   * The queue to hold messages which can't be sent immediately.\n   * @type {Array<string>}\n   * @private\n   */\n  this.sendQueue_ = [];\n};\ngoog.inherits(goog.net.xpc.IframePollingTransport, goog.net.xpc.Transport);\n\n\n/**\n * The number of times the inner frame will check for evidence of the outer\n * frame before it tries its reconnection sequence.  These occur at 100ms\n * intervals, making this an effective max waiting period of 500ms.\n * @type {number}\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.pollsBeforeReconnect_ = 5;\n\n\n/**\n * The transport type.\n * @type {number}\n * @protected\n * @override\n */\ngoog.net.xpc.IframePollingTransport.prototype.transportType =\n    goog.net.xpc.TransportTypes.IFRAME_POLLING;\n\n\n/**\n * Sequence counter.\n * @type {number}\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.sequence_ = 0;\n\n\n/**\n * Flag indicating whether we are waiting for an acknoledgement.\n * @type {boolean}\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.waitForAck_ = false;\n\n\n/**\n * Flag indicating if channel has been initialized.\n * @type {boolean}\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.initialized_ = false;\n\n\n/**\n * Reconnection iframe created by inner peer.\n * @type {?Element}\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.reconnectFrame_ = null;\n\n\n/** @private {goog.net.xpc.IframePollingTransport.Receiver} */\ngoog.net.xpc.IframePollingTransport.prototype.ackReceiver_;\n\n\n/** @private {goog.net.xpc.IframePollingTransport.Sender} */\ngoog.net.xpc.IframePollingTransport.prototype.ackSender_;\n\n\n/** @private */\ngoog.net.xpc.IframePollingTransport.prototype.ackIframeElm_;\n\n\n/** @private */\ngoog.net.xpc.IframePollingTransport.prototype.ackWinObj_;\n\n\n/** @private {!Function|undefined} */\ngoog.net.xpc.IframePollingTransport.prototype.checkLocalFramesPresentCb_;\n\n\n/** @private */\ngoog.net.xpc.IframePollingTransport.prototype.deliveryQueue_;\n\n\n/** @private */\ngoog.net.xpc.IframePollingTransport.prototype.msgIframeElm_;\n\n\n/** @private */\ngoog.net.xpc.IframePollingTransport.prototype.msgReceiver_;\n\n\n/** @private */\ngoog.net.xpc.IframePollingTransport.prototype.msgSender_;\n\n\n/** @private */\ngoog.net.xpc.IframePollingTransport.prototype.msgWinObj_;\n\n\n/** @private */\ngoog.net.xpc.IframePollingTransport.prototype.rcvdConnectionSetupAck_;\n\n\n/** @private */\ngoog.net.xpc.IframePollingTransport.prototype.sentConnectionSetupAck_;\n\n\n/** @private */\ngoog.net.xpc.IframePollingTransport.prototype.parts_;\n\n\n/**\n * The string used to prefix all iframe names and IDs.\n * @type {string}\n */\ngoog.net.xpc.IframePollingTransport.IFRAME_PREFIX = 'googlexpc';\n\n\n/**\n * Returns the name/ID of the message frame.\n * @return {string} Name of message frame.\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.getMsgFrameName_ = function() {\n  return goog.net.xpc.IframePollingTransport.IFRAME_PREFIX + '_' +\n      this.channel_.name + '_msg';\n};\n\n\n/**\n * Returns the name/ID of the ack frame.\n * @return {string} Name of ack frame.\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.getAckFrameName_ = function() {\n  return goog.net.xpc.IframePollingTransport.IFRAME_PREFIX + '_' +\n      this.channel_.name + '_ack';\n};\n\n\n/**\n * Determines whether the channel is still available. The channel is\n * unavailable if the transport was disposed or the peer is no longer\n * available.\n * @return {boolean} Whether the channel is available.\n */\ngoog.net.xpc.IframePollingTransport.prototype.isChannelAvailable = function() {\n  return !this.isDisposed() && this.channel_.isPeerAvailable();\n};\n\n\n/**\n * Safely retrieves the frames from the peer window. If an error is thrown\n * (e.g. the window is closing) an empty frame object is returned.\n * @return {!Object<string|number, !Window>} The frames from the peer window.\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.getPeerFrames_ = function() {\n  try {\n    if (this.isChannelAvailable()) {\n      return this.channel_.getPeerWindowObject().frames || {};\n    }\n  } catch (e) {\n    // An error may be thrown if the window is closing.\n    goog.log.fine(goog.net.xpc.logger, 'error retrieving peer frames');\n  }\n  return {};\n};\n\n\n/**\n * Safely retrieves the peer frame with the specified name.\n * @param {string} frameName The name of the peer frame to retrieve.\n * @return {!Window} The peer frame with the specified name.\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.getPeerFrame_ = function(\n    frameName) {\n  return this.getPeerFrames_()[frameName];\n};\n\n\n/**\n * Connects this transport.\n * @override\n */\ngoog.net.xpc.IframePollingTransport.prototype.connect = function() {\n  if (!this.isChannelAvailable()) {\n    // When the channel is unavailable there is no peer to poll so stop trying\n    // to connect.\n    return;\n  }\n\n  goog.log.fine(goog.net.xpc.logger, 'transport connect called');\n  if (!this.initialized_) {\n    goog.log.fine(goog.net.xpc.logger, 'initializing...');\n    this.constructSenderFrames_();\n    this.initialized_ = true;\n  }\n  this.checkForeignFramesReady_();\n};\n\n\n/**\n * Creates the iframes which are used to send messages (and acknowledgements)\n * to the peer. Sender iframes contain a document from a different origin and\n * therefore their content can't be accessed.\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.constructSenderFrames_ =\n    function() {\n  var name = this.getMsgFrameName_();\n  this.msgIframeElm_ = this.constructSenderFrame_(name);\n  this.msgWinObj_ = this.getWindow().frames[name];\n\n  name = this.getAckFrameName_();\n  this.ackIframeElm_ = this.constructSenderFrame_(name);\n  this.ackWinObj_ = this.getWindow().frames[name];\n};\n\n\n/**\n * Constructs a sending frame the the given id.\n * @param {string} id The id.\n * @return {!Element} The constructed frame.\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.constructSenderFrame_ = function(\n    id) {\n  goog.log.log(\n      goog.net.xpc.logger, goog.log.Level.FINEST,\n      'constructing sender frame: ' + id);\n  var ifr = goog.dom.createElement(goog.dom.TagName.IFRAME);\n  var s = ifr.style;\n  s.position = 'absolute';\n  s.top = '-10px';\n  s.left = '10px';\n  s.width = '1px';\n  s.height = '1px';\n  ifr.id = ifr.name = id;\n  ifr.src = this.sendUri_ + '#INITIAL';\n  this.getWindow().document.body.appendChild(ifr);\n  return ifr;\n};\n\n\n/**\n * The protocol for reconnecting is for the inner frame to change channel\n * names, and then communicate the new channel name to the outer peer.\n * The outer peer looks in a predefined location for the channel name\n * upate. It is important to use a completely new channel name, as this\n * will ensure that all messaging iframes are not in the bfcache.\n * Otherwise, Safari may pollute the history when modifying the location\n * of bfcached iframes.\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.maybeInnerPeerReconnect_ =\n    function() {\n  // Reconnection has been found to not function on some browsers (eg IE7), so\n  // it's important that the mechanism only be triggered as a last resort.  As\n  // such, we poll a number of times to find the outer iframe before triggering\n  // it.\n  if (this.reconnectFrame_ || this.pollsBeforeReconnect_-- > 0) {\n    return;\n  }\n\n  goog.log.log(\n      goog.net.xpc.logger, goog.log.Level.FINEST,\n      'Inner peer reconnect triggered.');\n  this.channel_.updateChannelNameAndCatalog(goog.net.xpc.getRandomString(10));\n  goog.log.log(\n      goog.net.xpc.logger, goog.log.Level.FINEST,\n      'switching channels: ' + this.channel_.name);\n  this.deconstructSenderFrames_();\n  this.initialized_ = false;\n  // Communicate new channel name to outer peer.\n  this.reconnectFrame_ = this.constructSenderFrame_(\n      goog.net.xpc.IframePollingTransport.IFRAME_PREFIX + '_reconnect_' +\n      this.channel_.name);\n};\n\n\n/**\n * Scans inner peer for a reconnect message, which will be used to update\n * the outer peer's channel name. If a reconnect message is found, the\n * sender frames will be cleaned up to make way for the new sender frames.\n * Only called by the outer peer.\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.outerPeerReconnect_ = function() {\n  goog.log.log(\n      goog.net.xpc.logger, goog.log.Level.FINEST, 'outerPeerReconnect called');\n  var frames = this.getPeerFrames_();\n  var length = frames.length;\n  for (var i = 0; i < length; i++) {\n    var frameName;\n    try {\n      if (frames[i] && frames[i].name) {\n        frameName = frames[i].name;\n      }\n    } catch (e) {\n      // Do nothing.\n    }\n    if (!frameName) {\n      continue;\n    }\n    var message = frameName.split('_');\n    if (message.length == 3 &&\n        message[0] == goog.net.xpc.IframePollingTransport.IFRAME_PREFIX &&\n        message[1] == 'reconnect') {\n      // This is a legitimate reconnect message from the peer. Start using\n      // the peer provided channel name, and start a connection over from\n      // scratch.\n      this.channel_.name = message[2];\n      this.deconstructSenderFrames_();\n      this.initialized_ = false;\n      break;\n    }\n  }\n};\n\n\n/**\n * Cleans up the existing sender frames owned by this peer. Only called by\n * the outer peer.\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.deconstructSenderFrames_ =\n    function() {\n  goog.log.log(\n      goog.net.xpc.logger, goog.log.Level.FINEST,\n      'deconstructSenderFrames called');\n  if (this.msgIframeElm_) {\n    this.msgIframeElm_.parentNode.removeChild(this.msgIframeElm_);\n    this.msgIframeElm_ = null;\n    this.msgWinObj_ = null;\n  }\n  if (this.ackIframeElm_) {\n    this.ackIframeElm_.parentNode.removeChild(this.ackIframeElm_);\n    this.ackIframeElm_ = null;\n    this.ackWinObj_ = null;\n  }\n};\n\n\n/**\n * Checks if the frames in the peer's page are ready. These contain a\n * document from the own domain and are the ones messages are received through.\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.checkForeignFramesReady_ =\n    function() {\n  // check if the connected iframe ready\n  if (!(this.isRcvFrameReady_(this.getMsgFrameName_()) &&\n        this.isRcvFrameReady_(this.getAckFrameName_()))) {\n    goog.log.log(\n        goog.net.xpc.logger, goog.log.Level.FINEST,\n        'foreign frames not (yet) present');\n\n    if (this.channel_.getRole() == goog.net.xpc.CrossPageChannelRole.INNER) {\n      // The outer peer might need a short time to get its frames ready, as\n      // CrossPageChannel prevents them from getting created until the inner\n      // peer's frame has thrown its loaded event.  This method is a noop for\n      // the first few times it's called, and then allows the reconnection\n      // sequence to begin.\n      this.maybeInnerPeerReconnect_();\n    } else if (\n        this.channel_.getRole() == goog.net.xpc.CrossPageChannelRole.OUTER) {\n      // The inner peer is either not loaded yet, or the receiving\n      // frames are simply missing. Since we cannot discern the two cases, we\n      // should scan for a reconnect message from the inner peer.\n      this.outerPeerReconnect_();\n    }\n\n    // start a timer to check again\n    this.getWindow().setTimeout(goog.bind(this.connect, this), 100);\n  } else {\n    goog.log.fine(goog.net.xpc.logger, 'foreign frames present');\n\n    // Create receivers.\n    this.msgReceiver_ = new goog.net.xpc.IframePollingTransport.Receiver(\n        this, this.getPeerFrame_(this.getMsgFrameName_()),\n        goog.bind(this.processIncomingMsg, this));\n    this.ackReceiver_ = new goog.net.xpc.IframePollingTransport.Receiver(\n        this, this.getPeerFrame_(this.getAckFrameName_()),\n        goog.bind(this.processIncomingAck, this));\n\n    this.checkLocalFramesPresent_();\n  }\n};\n\n\n/**\n * Checks if the receiving frame is ready.\n * @param {string} frameName Which receiving frame to check.\n * @return {boolean} Whether the receiving frame is ready.\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.isRcvFrameReady_ = function(\n    frameName) {\n  goog.log.log(\n      goog.net.xpc.logger, goog.log.Level.FINEST,\n      'checking for receive frame: ' + frameName);\n\n  try {\n    var winObj = this.getPeerFrame_(frameName);\n    if (!winObj || winObj.location.href.indexOf(this.rcvUri_) != 0) {\n      return false;\n    }\n  } catch (e) {\n    return false;\n  }\n  return true;\n};\n\n\n/**\n * Checks if the iframes created in the own document are ready.\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.checkLocalFramesPresent_ =\n    function() {\n\n  // Are the sender frames ready?\n  // These contain a document from the peer's domain, therefore we can only\n  // check if the frame itself is present.\n  var frames = this.getPeerFrames_();\n  if (!(frames[this.getAckFrameName_()] && frames[this.getMsgFrameName_()])) {\n    // start a timer to check again\n    if (!this.checkLocalFramesPresentCb_) {\n      this.checkLocalFramesPresentCb_ =\n          goog.bind(this.checkLocalFramesPresent_, this);\n    }\n    this.getWindow().setTimeout(this.checkLocalFramesPresentCb_, 100);\n    goog.log.fine(goog.net.xpc.logger, 'local frames not (yet) present');\n  } else {\n    // Create senders.\n    this.msgSender_ = new goog.net.xpc.IframePollingTransport.Sender(\n        this.sendUri_, this.msgWinObj_);\n    this.ackSender_ = new goog.net.xpc.IframePollingTransport.Sender(\n        this.sendUri_, this.ackWinObj_);\n\n    goog.log.fine(goog.net.xpc.logger, 'local frames ready');\n\n    this.getWindow().setTimeout(goog.bind(function() {\n      this.msgSender_.send(goog.net.xpc.SETUP);\n      this.waitForAck_ = true;\n      goog.log.fine(goog.net.xpc.logger, 'SETUP sent');\n    }, this), 100);\n  }\n};\n\n\n/**\n * Check if connection is ready.\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.checkIfConnected_ = function() {\n  if (this.sentConnectionSetupAck_ && this.rcvdConnectionSetupAck_) {\n    this.channel_.notifyConnected();\n\n    if (this.deliveryQueue_) {\n      goog.log.fine(\n          goog.net.xpc.logger, 'delivering queued messages ' +\n              '(' + this.deliveryQueue_.length + ')');\n\n      for (var i = 0, m; i < this.deliveryQueue_.length; i++) {\n        m = this.deliveryQueue_[i];\n        this.channel_.xpcDeliver(m.service, m.payload);\n      }\n      delete this.deliveryQueue_;\n    }\n  } else {\n    goog.log.log(\n        goog.net.xpc.logger, goog.log.Level.FINEST, 'checking if connected: ' +\n            'ack sent:' + this.sentConnectionSetupAck_ + ', ack rcvd: ' +\n            this.rcvdConnectionSetupAck_);\n  }\n};\n\n\n/**\n * Processes an incoming message.\n * @param {string} raw The complete received string.\n */\ngoog.net.xpc.IframePollingTransport.prototype.processIncomingMsg = function(\n    raw) {\n  goog.log.log(\n      goog.net.xpc.logger, goog.log.Level.FINEST, 'msg received: ' + raw);\n\n  if (raw == goog.net.xpc.SETUP) {\n    if (!this.ackSender_) {\n      // Got SETUP msg, but we can't send an ack.\n      return;\n    }\n\n    this.ackSender_.send(goog.net.xpc.SETUP_ACK_);\n    goog.log.log(goog.net.xpc.logger, goog.log.Level.FINEST, 'SETUP_ACK sent');\n\n    this.sentConnectionSetupAck_ = true;\n    this.checkIfConnected_();\n\n  } else if (this.channel_.isConnected() || this.sentConnectionSetupAck_) {\n    var pos = raw.indexOf('|');\n    var head = raw.substring(0, pos);\n    var frame = raw.substring(pos + 1);\n\n    // check if it is a framed message\n    pos = head.indexOf(',');\n    if (pos == -1) {\n      var seq = head;\n      // send acknowledgement\n      this.ackSender_.send('ACK:' + seq);\n      this.deliverPayload_(frame);\n    } else {\n      var seq = head.substring(0, pos);\n      // send acknowledgement\n      this.ackSender_.send('ACK:' + seq);\n\n      var partInfo = head.substring(pos + 1).split('/');\n      var part0 = parseInt(partInfo[0], 10);\n      var part1 = parseInt(partInfo[1], 10);\n      // create an array to accumulate the parts if this is the\n      // first frame of a message\n      if (part0 == 1) {\n        this.parts_ = [];\n      }\n      this.parts_.push(frame);\n      // deliver the message if this was the last frame of a message\n      if (part0 == part1) {\n        this.deliverPayload_(this.parts_.join(''));\n        delete this.parts_;\n      }\n    }\n  } else {\n    goog.log.warning(\n        goog.net.xpc.logger, 'received msg, but channel is not connected');\n  }\n};\n\n\n/**\n * Process an incoming acknowdedgement.\n * @param {string} msgStr The incoming ack string to process.\n */\ngoog.net.xpc.IframePollingTransport.prototype.processIncomingAck = function(\n    msgStr) {\n  goog.log.log(\n      goog.net.xpc.logger, goog.log.Level.FINEST, 'ack received: ' + msgStr);\n\n  if (msgStr == goog.net.xpc.SETUP_ACK_) {\n    this.waitForAck_ = false;\n    this.rcvdConnectionSetupAck_ = true;\n    // send the next frame\n    this.checkIfConnected_();\n\n  } else if (this.channel_.isConnected()) {\n    if (!this.waitForAck_) {\n      goog.log.warning(goog.net.xpc.logger, 'got unexpected ack');\n      return;\n    }\n\n    var seq = parseInt(msgStr.split(':')[1], 10);\n    if (seq == this.sequence_) {\n      this.waitForAck_ = false;\n      this.sendNextFrame_();\n    } else {\n      goog.log.warning(goog.net.xpc.logger, 'got ack with wrong sequence');\n    }\n  } else {\n    goog.log.warning(\n        goog.net.xpc.logger, 'received ack, but channel not connected');\n  }\n};\n\n\n/**\n * Sends a frame (message part).\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.sendNextFrame_ = function() {\n  // do nothing if we are waiting for an acknowledgement or the\n  // queue is emtpy\n  if (this.waitForAck_ || !this.sendQueue_.length) {\n    return;\n  }\n\n  var s = this.sendQueue_.shift();\n  ++this.sequence_;\n  this.msgSender_.send(this.sequence_ + s);\n  goog.log.log(\n      goog.net.xpc.logger, goog.log.Level.FINEST,\n      'msg sent: ' + this.sequence_ + s);\n\n\n  this.waitForAck_ = true;\n};\n\n\n/**\n * Delivers a message.\n * @param {string} s The complete message string (\"<service_name>:<payload>\").\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.deliverPayload_ = function(s) {\n  // determine the service name and the payload\n  var pos = s.indexOf(':');\n  var service = s.substr(0, pos);\n  var payload = s.substring(pos + 1);\n\n  // deliver the message\n  if (!this.channel_.isConnected()) {\n    // as valid messages can come in before a SETUP_ACK has\n    // been received (because subchannels for msgs and acks are independent),\n    // delay delivery of early messages until after 'connect'-event\n    (this.deliveryQueue_ || (this.deliveryQueue_ = [\n     ])).push({service: service, payload: payload});\n    goog.log.log(goog.net.xpc.logger, goog.log.Level.FINEST, 'queued delivery');\n  } else {\n    this.channel_.xpcDeliver(service, payload);\n  }\n};\n\n\n// ---- send message ----\n\n\n/**\n * Maximal frame length.\n * @type {number}\n * @private\n */\ngoog.net.xpc.IframePollingTransport.prototype.MAX_FRAME_LENGTH_ = 3800;\n\n\n/**\n * Sends a message. Splits it in multiple frames if too long (exceeds IE's\n * URL-length maximum.\n * Wireformat: `<seq>[,<frame_no>/<#frames>]|<frame_content>`\n *\n * @param {string} service Name of service this the message has to be delivered.\n * @param {string} payload The message content.\n * @override\n */\ngoog.net.xpc.IframePollingTransport.prototype.send = function(\n    service, payload) {\n  var frame = service + ':' + payload;\n  // put in queue\n  if (!goog.userAgent.IE || payload.length <= this.MAX_FRAME_LENGTH_) {\n    this.sendQueue_.push('|' + frame);\n  } else {\n    var l = payload.length;\n    var num = Math.ceil(l / this.MAX_FRAME_LENGTH_);  // number of frames\n    var pos = 0;\n    var i = 1;\n    while (pos < l) {\n      this.sendQueue_.push(\n          ',' + i + '/' + num + '|' +\n          frame.substr(pos, this.MAX_FRAME_LENGTH_));\n      i++;\n      pos += this.MAX_FRAME_LENGTH_;\n    }\n  }\n  this.sendNextFrame_();\n};\n\n\n/** @override */\ngoog.net.xpc.IframePollingTransport.prototype.disposeInternal = function() {\n  goog.net.xpc.IframePollingTransport.base(this, 'disposeInternal');\n\n  var receivers = goog.net.xpc.IframePollingTransport.receivers_;\n  goog.array.remove(receivers, this.msgReceiver_);\n  goog.array.remove(receivers, this.ackReceiver_);\n  this.msgReceiver_ = this.ackReceiver_ = null;\n\n  goog.dom.removeNode(this.msgIframeElm_);\n  goog.dom.removeNode(this.ackIframeElm_);\n  this.msgIframeElm_ = this.ackIframeElm_ = null;\n  this.msgWinObj_ = this.ackWinObj_ = null;\n};\n\n\n/**\n * Array holding all Receiver-instances.\n * @type {Array<goog.net.xpc.IframePollingTransport.Receiver>}\n * @private\n */\ngoog.net.xpc.IframePollingTransport.receivers_ = [];\n\n\n/**\n * Short polling interval.\n * @type {number}\n * @private\n */\ngoog.net.xpc.IframePollingTransport.TIME_POLL_SHORT_ = 10;\n\n\n/**\n * Long polling interval.\n * @type {number}\n * @private\n */\ngoog.net.xpc.IframePollingTransport.TIME_POLL_LONG_ = 100;\n\n\n/**\n * Period how long to use TIME_POLL_SHORT_ before raising polling-interval\n * to TIME_POLL_LONG_ after an activity.\n * @type {number}\n * @private\n */\ngoog.net.xpc.IframePollingTransport.TIME_SHORT_POLL_AFTER_ACTIVITY_ = 1000;\n\n\n/**\n * Polls all receivers.\n * @private\n */\ngoog.net.xpc.IframePollingTransport.receive_ = function() {\n  var receivers = goog.net.xpc.IframePollingTransport.receivers_;\n  var receiver;\n  var rcvd = false;\n\n\n  try {\n    for (var i = 0; receiver = receivers[i]; i++) {\n      rcvd = rcvd || receiver.receive();\n    }\n  } catch (e) {\n    goog.log.info(goog.net.xpc.logger, 'receive_() failed: ' + e);\n\n    // Notify the channel that the transport had an error.\n    receiver.transport_.channel_.notifyTransportError();\n\n    // notifyTransportError() closes the channel and disposes the transport.\n    // If there are no other channels present, this.receivers_ will now be empty\n    // and there is no need to keep polling.\n    if (!receivers.length) {\n      return;\n    }\n  }\n\n  var now = goog.now();\n  if (rcvd) {\n    goog.net.xpc.IframePollingTransport.lastActivity_ = now;\n  }\n\n  // Schedule next check.\n  var t = now - goog.net.xpc.IframePollingTransport.lastActivity_ <\n          goog.net.xpc.IframePollingTransport.TIME_SHORT_POLL_AFTER_ACTIVITY_ ?\n      goog.net.xpc.IframePollingTransport.TIME_POLL_SHORT_ :\n      goog.net.xpc.IframePollingTransport.TIME_POLL_LONG_;\n  goog.net.xpc.IframePollingTransport.rcvTimer_ =\n      window.setTimeout(goog.net.xpc.IframePollingTransport.receiveCb_, t);\n};\n\n\n/**\n * Callback that wraps receive_ to be used in timers.\n * @type {Function}\n * @private\n */\ngoog.net.xpc.IframePollingTransport.receiveCb_ = goog.bind(\n    goog.net.xpc.IframePollingTransport.receive_,\n    goog.net.xpc.IframePollingTransport);\n\n\n/**\n * Starts the polling loop.\n * @private\n */\ngoog.net.xpc.IframePollingTransport.startRcvTimer_ = function() {\n  goog.log.fine(goog.net.xpc.logger, 'starting receive-timer');\n  goog.net.xpc.IframePollingTransport.lastActivity_ = goog.now();\n  if (goog.net.xpc.IframePollingTransport.rcvTimer_) {\n    window.clearTimeout(goog.net.xpc.IframePollingTransport.rcvTimer_);\n  }\n  goog.net.xpc.IframePollingTransport.rcvTimer_ = window.setTimeout(\n      goog.net.xpc.IframePollingTransport.receiveCb_,\n      goog.net.xpc.IframePollingTransport.TIME_POLL_SHORT_);\n};\n\n\n\n/**\n * goog.net.xpc.IframePollingTransport.Sender\n *\n * Utility class to send message-parts to a document from a different origin.\n *\n * @constructor\n * @param {string} url The url the other document will use for polling. Must\n *     be an http:// or https:// URL.\n * @param {Object} windowObj The frame used for sending information to.\n * @final\n */\ngoog.net.xpc.IframePollingTransport.Sender = function(url, windowObj) {\n  // This class is instantiated from goog.net.xpc.IframePollingTransport, which\n  // takes its URLs from a goog.net.xpc.CrossPageChannel, which in turns\n  // sanitizes them. However, since this class can be instantiated from\n  // elsewhere than IframePollingTransport the url needs to be sanitized\n  // here too.\n  if (!/^https?:\\/\\//.test(url)) {\n    throw new Error('URL ' + url + ' is invalid');\n  }\n\n  /**\n   * The URI used to sending messages.\n   * @type {string}\n   * @private\n   */\n  this.sanitizedSendUri_ = url;\n\n  /**\n   * The window object of the iframe used to send messages.\n   * The script instantiating the Sender won't have access to\n   * the content of sendFrame_.\n   * @type {Window}\n   * @private\n   */\n  this.sendFrame_ = /** @type {Window} */ (windowObj);\n\n  /**\n   * Cycle counter (used to make sure that sending two identical messages sent\n   * in direct succession can be recognized as such by the receiver).\n   * @type {number}\n   * @private\n   */\n  this.cycle_ = 0;\n};\n\n\n/**\n * Sends a message-part (frame) to the peer.\n * The message-part is encoded and put in the fragment identifier\n * of the URL used for sending (and belongs to the origin/domain of the peer).\n * @param {string} payload The message to send.\n */\ngoog.net.xpc.IframePollingTransport.Sender.prototype.send = function(payload) {\n  this.cycle_ = ++this.cycle_ % 2;\n\n  var url =\n      this.sanitizedSendUri_ + '#' + this.cycle_ + encodeURIComponent(payload);\n\n  // TODO(user) Find out if try/catch is still needed\n\n  try {\n    // safari doesn't allow to call location.replace()\n    if (goog.userAgent.WEBKIT) {\n      goog.dom.safe.setLocationHref(this.sendFrame_.location, url);\n    } else {\n      this.sendFrame_.location.replace(url);\n    }\n  } catch (e) {\n    goog.log.error(goog.net.xpc.logger, 'sending failed', e);\n  }\n\n  // Restart receiver timer on short polling interval, to support use-cases\n  // where we need to capture responses quickly.\n  goog.net.xpc.IframePollingTransport.startRcvTimer_();\n};\n\n\n\n/**\n * goog.net.xpc.IframePollingTransport.Receiver\n *\n * @constructor\n * @param {goog.net.xpc.IframePollingTransport} transport The transport to\n *     receive from.\n * @param {Object} windowObj The window-object to poll for location-changes.\n * @param {Function} callback The callback-function to be called when\n *     location has changed.\n * @final\n */\ngoog.net.xpc.IframePollingTransport.Receiver = function(\n    transport, windowObj, callback) {\n  /**\n   * The transport to receive from.\n   * @type {goog.net.xpc.IframePollingTransport}\n   * @private\n   */\n  this.transport_ = transport;\n  this.rcvFrame_ = windowObj;\n\n  this.cb_ = callback;\n  this.currentLoc_ = this.rcvFrame_.location.href.split('#')[0] + '#INITIAL';\n\n  goog.net.xpc.IframePollingTransport.receivers_.push(this);\n  goog.net.xpc.IframePollingTransport.startRcvTimer_();\n};\n\n\n/**\n * Polls the location of the receiver-frame for changes.\n * @return {boolean} Whether a change has been detected.\n */\ngoog.net.xpc.IframePollingTransport.Receiver.prototype.receive = function() {\n  var loc = this.rcvFrame_.location.href;\n\n  if (loc != this.currentLoc_) {\n    this.currentLoc_ = loc;\n    var payload = loc.split('#')[1];\n    if (payload) {\n      payload = payload.substr(1);  // discard first character (cycle)\n      this.cb_(decodeURIComponent(payload));\n    }\n    return true;\n  } else {\n    return false;\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.net.xpc.CfgFields","^;;","~$goog.net.xpc","~$goog.net.xpc.CrossPageChannelRole","~$goog.log.Level","~$goog.net.xpc.TransportTypes","^9>","^:S","^;Q","^@B","~$goog.net.xpc.Transport","^;9","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/xpc/iframepollingtransport.js"],"^:1",["^9K",["~$goog.net.xpc.IframePollingTransport.Sender","~$goog.net.xpc.IframePollingTransport","~$goog.net.xpc.IframePollingTransport.Receiver"]],"^9<",true,"^9=",["^9>","^;9","^;;","^;=","^@B","^;Q","^@T","^@R","^@Q","^@S","^@V","^@U","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.editor.plugins.linkdialogplugin.js","^9C",["^9D","goog/editor/plugins/linkdialogplugin.js"],"^9E","goog/editor/plugins/linkdialogplugin.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A plugin for the LinkDialog.\n *\n * @author nicksantos@google.com (Nick Santos)\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.editor.plugins.LinkDialogPlugin');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.editor.Command');\ngoog.require('goog.editor.plugins.AbstractDialogPlugin');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.functions');\ngoog.require('goog.ui.editor.AbstractDialog');\ngoog.require('goog.ui.editor.LinkDialog');\ngoog.require('goog.uri.utils');\n\n\n\n/**\n * A plugin that opens the link dialog.\n * @constructor\n * @extends {goog.editor.plugins.AbstractDialogPlugin}\n */\ngoog.editor.plugins.LinkDialogPlugin = function() {\n  goog.editor.plugins.LinkDialogPlugin.base(\n      this, 'constructor', goog.editor.Command.MODAL_LINK_EDITOR);\n\n  /**\n   * Event handler for this object.\n   * @type {goog.events.EventHandler<!goog.editor.plugins.LinkDialogPlugin>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n\n  /**\n   * A list of whitelisted URL schemes which are safe to open.\n   * @type {Array<string>}\n   * @private\n   */\n  this.safeToOpenSchemes_ = ['http', 'https', 'ftp'];\n};\ngoog.inherits(\n    goog.editor.plugins.LinkDialogPlugin,\n    goog.editor.plugins.AbstractDialogPlugin);\n\n\n/**\n * Link object that the dialog is editing.\n * @type {goog.editor.Link}\n * @protected\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.currentLink_;\n\n\n/**\n * Optional warning to show about email addresses.\n * @type {goog.html.SafeHtml}\n * @private\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.emailWarning_;\n\n\n/**\n * Whether to show a checkbox where the user can choose to have the link open in\n * a new window.\n * @type {boolean}\n * @private\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.showOpenLinkInNewWindow_ = false;\n\n\n/**\n * Whether to focus the text to display input instead of the url input if the\n * text to display input is empty when the dialog opens.\n * @type {boolean}\n * @private\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype\n    .focusTextToDisplayOnOpenIfEmpty_ = false;\n\n/**\n * Whether the \"open link in new window\" checkbox should be checked when the\n * dialog is shown, and also whether it was checked last time the dialog was\n * closed.\n * @type {boolean}\n * @private\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.isOpenLinkInNewWindowChecked_ =\n    false;\n\n\n/**\n * Weather to show a checkbox where the user can choose to add 'rel=nofollow'\n * attribute added to the link.\n * @type {boolean}\n * @private\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.showRelNoFollow_ = false;\n\n\n/**\n * Whether to stop referrer leaks.  Defaults to false.\n * @type {boolean}\n * @private\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.stopReferrerLeaks_ = false;\n\n\n/**\n * Whether to prevent access to the opener window in the new window to prevent\n * reverse tabnabbing. Defaults to false.\n * @private {boolean}\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.stopTabNabbing_ = false;\n\n\n/**\n * Whether to block opening links with a non-whitelisted URL scheme.\n * @type {boolean}\n * @private\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.blockOpeningUnsafeSchemes_ =\n    true;\n\n\n/** @override */\ngoog.editor.plugins.LinkDialogPlugin.prototype.getTrogClassId =\n    goog.functions.constant('LinkDialogPlugin');\n\n\n/**\n * Tells the plugin whether to block URLs with schemes not in the whitelist.\n * If blocking is enabled, this plugin will stop the 'Test Link' popup\n * window from being created. Blocking doesn't affect link creation--if the\n * user clicks the 'OK' button with an unsafe URL, the link will still be\n * created as normal.\n * @param {boolean} blockOpeningUnsafeSchemes Whether to block non-whitelisted\n *     schemes.\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.setBlockOpeningUnsafeSchemes =\n    function(blockOpeningUnsafeSchemes) {\n  this.blockOpeningUnsafeSchemes_ = blockOpeningUnsafeSchemes;\n};\n\n\n/**\n * Sets a whitelist of allowed URL schemes that are safe to open.\n * Schemes should all be in lowercase. If the plugin is set to block opening\n * unsafe schemes, user-entered URLs will be converted to lowercase and checked\n * against this list. The whitelist has no effect if blocking is not enabled.\n * @param {Array<string>} schemes String array of URL schemes to allow (http,\n *     https, etc.).\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.setSafeToOpenSchemes = function(\n    schemes) {\n  this.safeToOpenSchemes_ = schemes;\n};\n\n\n/**\n * Tells the dialog to show a checkbox where the user can choose to have the\n * link open in a new window.\n * @param {boolean} startChecked Whether to check the checkbox the first\n *     time the dialog is shown. Subesquent times the checkbox will remember its\n *     previous state.\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.showOpenLinkInNewWindow =\n    function(startChecked) {\n  this.showOpenLinkInNewWindow_ = true;\n  this.isOpenLinkInNewWindowChecked_ = startChecked;\n};\n\n\n/**\n * Tells the dialog to focus the text to display input instead of the url field\n * if the text to display input is empty when the dialog is opened.\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.focusTextToDisplayOnOpenIfEmpty =\n    function() {\n  this.focusTextToDisplayOnOpenIfEmpty_ = true;\n};\n\n\n/**\n * Tells the dialog to show a checkbox where the user can choose to have\n * 'rel=nofollow' attribute added to the link.\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.showRelNoFollow = function() {\n  this.showRelNoFollow_ = true;\n};\n\n\n/**\n * Returns whether the\"open link in new window\" checkbox was checked last time\n * the dialog was closed.\n * @return {boolean} Whether the\"open link in new window\" checkbox was checked\n *     last time the dialog was closed.\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype\n    .getOpenLinkInNewWindowCheckedState = function() {\n  return this.isOpenLinkInNewWindowChecked_;\n};\n\n\n/**\n * Tells the plugin to stop leaking the page's url via the referrer header when\n * the \"test this link\" link is clicked. When the user clicks on a link, the\n * browser makes a request for the link url, passing the url of the current page\n * in the request headers. If the user wants the current url to be kept secret\n * (e.g. an unpublished document), the owner of the url that was clicked will\n * see the secret url in the request headers, and it will no longer be a secret.\n * Calling this method will not send a referrer header in the request, just as\n * if the user had opened a blank window and typed the url in themselves.\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.stopReferrerLeaks = function() {\n  this.stopReferrerLeaks_ = true;\n};\n\n\n/**\n * Tells the plugin to stop leaving a reference to the current window in windows\n * opened when \"Test this link\" is clicked. Otherwise, the reference can be used\n * to launch a reverse tabnabbing attack.\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.stopTabNabbing = function() {\n  this.stopTabNabbing_ = true;\n};\n\n\n/**\n * Sets the warning message to show to users about including email addresses on\n * public web pages.\n * @param {!goog.html.SafeHtml} emailWarning Warning message to show users about\n *     including email addresses on the web.\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.setEmailWarning = function(\n    emailWarning) {\n  this.emailWarning_ = emailWarning;\n};\n\n\n/**\n * Handles execCommand by opening the dialog.\n * @param {string} command The command to execute.\n * @param {*=} opt_arg {@link A goog.editor.Link} object representing the link\n *     being edited.\n * @return {*} Always returns true, indicating the dialog was shown.\n * @protected\n * @override\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.execCommandInternal = function(\n    command, opt_arg) {\n  this.currentLink_ = /** @type {goog.editor.Link} */ (opt_arg);\n  return goog.editor.plugins.LinkDialogPlugin.base(\n      this, 'execCommandInternal', command, opt_arg);\n};\n\n\n/**\n * Handles when the dialog closes.\n * @param {goog.events.Event} e The AFTER_HIDE event object.\n * @override\n * @protected\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.handleAfterHide = function(e) {\n  goog.editor.plugins.LinkDialogPlugin.base(this, 'handleAfterHide', e);\n  this.currentLink_ = null;\n};\n\n\n/**\n * @return {goog.events.EventHandler<T>} The event handler.\n * @protected\n * @this {T}\n * @template T\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.getEventHandler = function() {\n  return this.eventHandler_;\n};\n\n\n/**\n * @return {goog.editor.Link} The link being edited.\n * @protected\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.getCurrentLink = function() {\n  return this.currentLink_;\n};\n\n\n/**\n * Creates a new instance of the dialog and registers for the relevant events.\n * @param {goog.dom.DomHelper} dialogDomHelper The dom helper to be used to\n *     create the dialog.\n * @param {*=} opt_link The target link (should be a goog.editor.Link).\n * @return {!goog.ui.editor.LinkDialog} The dialog.\n * @override\n * @protected\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.createDialog = function(\n    dialogDomHelper, opt_link) {\n  var dialog = new goog.ui.editor.LinkDialog(\n      dialogDomHelper,\n      /** @type {goog.editor.Link} */ (opt_link));\n  if (this.emailWarning_) {\n    dialog.setEmailWarning(this.emailWarning_);\n  }\n  if (this.showOpenLinkInNewWindow_) {\n    dialog.showOpenLinkInNewWindow(this.isOpenLinkInNewWindowChecked_);\n  }\n  if (this.focusTextToDisplayOnOpenIfEmpty_) {\n    dialog.focusTextToDisplayOnOpenIfEmpty();\n  }\n  if (this.showRelNoFollow_) {\n    dialog.showRelNoFollow();\n  }\n  dialog.setStopReferrerLeaks(this.stopReferrerLeaks_);\n  dialog.setStopTabNabbing(this.stopTabNabbing_);\n  this.eventHandler_\n      .listen(dialog, goog.ui.editor.AbstractDialog.EventType.OK, this.handleOk)\n      .listen(\n          dialog, goog.ui.editor.AbstractDialog.EventType.CANCEL,\n          this.handleCancel_)\n      .listen(\n          dialog, goog.ui.editor.LinkDialog.EventType.BEFORE_TEST_LINK,\n          this.handleBeforeTestLink);\n  return dialog;\n};\n\n\n/** @override */\ngoog.editor.plugins.LinkDialogPlugin.prototype.disposeInternal = function() {\n  goog.editor.plugins.LinkDialogPlugin.base(this, 'disposeInternal');\n  this.eventHandler_.dispose();\n};\n\n\n/**\n * Handles the OK event from the dialog by updating the link in the field.\n * @param {goog.ui.editor.LinkDialog.OkEvent} e OK event object.\n * @protected\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.handleOk = function(e) {\n  // We're not restoring the original selection, so clear it out.\n  this.disposeOriginalSelection();\n\n  this.currentLink_.setTextAndUrl(e.linkText, e.linkUrl);\n  if (this.showOpenLinkInNewWindow_) {\n    // Save checkbox state for next time.\n    this.isOpenLinkInNewWindowChecked_ = e.openInNewWindow;\n  }\n\n  var anchor = this.currentLink_.getAnchor();\n  this.touchUpAnchorOnOk_(anchor, e);\n  var extraAnchors = this.currentLink_.getExtraAnchors();\n  for (var i = 0; i < extraAnchors.length; ++i) {\n    extraAnchors[i].href = anchor.href;\n    this.touchUpAnchorOnOk_(extraAnchors[i], e);\n  }\n\n  // Place cursor to the right of the modified link.\n  this.currentLink_.placeCursorRightOf();\n\n  this.getFieldObject().focus();\n\n  this.getFieldObject().dispatchSelectionChangeEvent();\n  this.getFieldObject().dispatchChange();\n\n  this.eventHandler_.removeAll();\n};\n\n\n/**\n * Apply the necessary properties to a link upon Ok being clicked in the dialog.\n * @param {HTMLAnchorElement} anchor The anchor to set properties on.\n * @param {goog.events.Event} e Event object.\n * @private\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.touchUpAnchorOnOk_ = function(\n    anchor, e) {\n  if (this.showOpenLinkInNewWindow_) {\n    if (e.openInNewWindow) {\n      anchor.target = '_blank';\n    } else {\n      if (anchor.target == '_blank') {\n        anchor.target = '';\n      }\n      // If user didn't indicate to open in a new window but the link already\n      // had a target other than '_blank', let's leave what they had before.\n    }\n  }\n\n  if (this.showRelNoFollow_) {\n    var alreadyPresent = goog.ui.editor.LinkDialog.hasNoFollow(anchor.rel);\n    if (alreadyPresent && !e.noFollow) {\n      anchor.rel = goog.ui.editor.LinkDialog.removeNoFollow(anchor.rel);\n    } else if (!alreadyPresent && e.noFollow) {\n      anchor.rel = anchor.rel ? anchor.rel + ' nofollow' : 'nofollow';\n    }\n  }\n};\n\n\n/**\n * Handles the CANCEL event from the dialog by clearing the anchor if needed.\n * @param {goog.events.Event} e Event object.\n * @private\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.handleCancel_ = function(e) {\n  if (this.currentLink_.isNew()) {\n    goog.dom.flattenElement(this.currentLink_.getAnchor());\n    var extraAnchors = this.currentLink_.getExtraAnchors();\n    for (var i = 0; i < extraAnchors.length; ++i) {\n      goog.dom.flattenElement(extraAnchors[i]);\n    }\n    // Make sure listeners know the anchor was flattened out.\n    this.getFieldObject().dispatchChange();\n  }\n\n  this.eventHandler_.removeAll();\n};\n\n\n/**\n * Handles the BeforeTestLink event fired when the 'test' link is clicked.\n * @param {goog.ui.editor.LinkDialog.BeforeTestLinkEvent} e BeforeTestLink event\n *     object.\n * @protected\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.handleBeforeTestLink = function(\n    e) {\n  if (!this.shouldOpenUrl(e.url)) {\n    /** @desc Message when the user tries to test (preview) a link, but the\n     * link cannot be tested. */\n    var MSG_UNSAFE_LINK = goog.getMsg('This link cannot be tested.');\n    alert(MSG_UNSAFE_LINK);\n    e.preventDefault();\n  }\n};\n\n\n/**\n * Checks whether the plugin should open the given url in a new window.\n * @param {string} url The url to check.\n * @return {boolean} If the plugin should open the given url in a new window.\n * @protected\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.shouldOpenUrl = function(url) {\n  return !this.blockOpeningUnsafeSchemes_ || this.isSafeSchemeToOpen_(url);\n};\n\n\n/**\n * Determines whether or not a url has a scheme which is safe to open.\n * Schemes like javascript are unsafe due to the possibility of XSS.\n * @param {string} url A url.\n * @return {boolean} Whether the url has a safe scheme.\n * @private\n */\ngoog.editor.plugins.LinkDialogPlugin.prototype.isSafeSchemeToOpen_ = function(\n    url) {\n  var scheme = goog.uri.utils.getScheme(url) || 'http';\n  return goog.array.contains(this.safeToOpenSchemes_, scheme.toLowerCase());\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","^>;","^;<","^;O","~$goog.editor.Command","~$goog.ui.editor.LinkDialog","^9>","~$goog.ui.editor.AbstractDialog","~$goog.editor.plugins.AbstractDialogPlugin","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/linkdialogplugin.js"],"^:1",["^9K",["~$goog.editor.plugins.LinkDialogPlugin"]],"^9<",true,"^9=",["^9>","^;9","^;;","^@Z","^A1","^>;","^;<","^A0","^@[","^;O"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.menuitem.js","^9C",["^9D","goog/ui/menuitem.js"],"^9E","goog/ui/menuitem.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A class for representing items in menus.\n * @see goog.ui.Menu\n *\n * @author attila@google.com (Attila Bodis)\n * @see ../demos/menuitem.html\n */\n\ngoog.provide('goog.ui.MenuItem');\n\ngoog.forwardDeclare('goog.ui.Menu');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.string');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Control');\ngoog.require('goog.ui.MenuItemRenderer');\ngoog.require('goog.ui.registry');  // circular\n\n\n\n/**\n * Class representing an item in a menu.\n *\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to\n *     display as the content of the item (use to add icons or styling to\n *     menus).\n * @param {*=} opt_model Data/model associated with the menu item.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper used for\n *     document interactions.\n * @param {goog.ui.MenuItemRenderer=} opt_renderer Optional renderer.\n * @constructor\n * @extends {goog.ui.Control}\n */\ngoog.ui.MenuItem = function(content, opt_model, opt_domHelper, opt_renderer) {\n  goog.ui.Control.call(\n      this, content, opt_renderer || goog.ui.MenuItemRenderer.getInstance(),\n      opt_domHelper);\n  this.setValue(opt_model);\n};\ngoog.inherits(goog.ui.MenuItem, goog.ui.Control);\ngoog.tagUnsealableClass(goog.ui.MenuItem);\n\n\n/**\n * The access key for this menu item. This key allows the user to quickly\n * trigger this item's action with they keyboard. For example, setting the\n * mnenomic key to 70 (F), when the user opens the menu and hits \"F,\" the\n * menu item is triggered.\n *\n * @type {goog.events.KeyCodes}\n * @private\n */\ngoog.ui.MenuItem.prototype.mnemonicKey_;\n\n\n/**\n * The class set on an element that contains a parenthetical mnemonic key hint.\n * Parenthetical hints are added to items in which the mnemonic key is not found\n * within the menu item's caption itself. For example, if you have a menu item\n * with the caption \"Record,\" but its mnemonic key is \"I\", the caption displayed\n * in the menu will appear as \"Record (I)\".\n *\n * @type {string}\n * @private\n */\ngoog.ui.MenuItem.MNEMONIC_WRAPPER_CLASS_ =\n    goog.getCssName('goog-menuitem-mnemonic-separator');\n\n\n/**\n * The class set on an element that contains a keyboard accelerator hint.\n * @type {string}\n */\ngoog.ui.MenuItem.ACCELERATOR_CLASS = goog.getCssName('goog-menuitem-accel');\n\n\n// goog.ui.Component and goog.ui.Control implementation.\n\n\n/**\n * Returns the value associated with the menu item.  The default implementation\n * returns the model object associated with the item (if any), or its caption.\n * @return {*} Value associated with the menu item, if any, or its caption.\n */\ngoog.ui.MenuItem.prototype.getValue = function() {\n  var model = this.getModel();\n  return model != null ? model : this.getCaption();\n};\n\n\n/**\n * Sets the value associated with the menu item.  The default implementation\n * stores the value as the model of the menu item.\n * @param {*} value Value to be associated with the menu item.\n */\ngoog.ui.MenuItem.prototype.setValue = function(value) {\n  this.setModel(value);\n};\n\n\n/** @override */\ngoog.ui.MenuItem.prototype.setSupportedState = function(state, support) {\n  goog.ui.MenuItem.base(this, 'setSupportedState', state, support);\n  switch (state) {\n    case goog.ui.Component.State.SELECTED:\n      this.setSelectableInternal_(support);\n      break;\n    case goog.ui.Component.State.CHECKED:\n      this.setCheckableInternal_(support);\n      break;\n  }\n};\n\n\n/**\n * Sets the menu item to be selectable or not.  Set to true for menu items\n * that represent selectable options.\n * @param {boolean} selectable Whether the menu item is selectable.\n */\ngoog.ui.MenuItem.prototype.setSelectable = function(selectable) {\n  this.setSupportedState(goog.ui.Component.State.SELECTED, selectable);\n};\n\n\n/**\n * Sets the menu item to be selectable or not.\n * @param {boolean} selectable  Whether the menu item is selectable.\n * @private\n */\ngoog.ui.MenuItem.prototype.setSelectableInternal_ = function(selectable) {\n  if (this.isChecked() && !selectable) {\n    this.setChecked(false);\n  }\n\n  var element = this.getElement();\n  if (element) {\n    this.getRenderer().setSelectable(this, element, selectable);\n  }\n};\n\n\n/**\n * Sets the menu item to be checkable or not.  Set to true for menu items\n * that represent checkable options.\n * @param {boolean} checkable Whether the menu item is checkable.\n */\ngoog.ui.MenuItem.prototype.setCheckable = function(checkable) {\n  this.setSupportedState(goog.ui.Component.State.CHECKED, checkable);\n};\n\n\n/**\n * Sets the menu item to be checkable or not.\n * @param {boolean} checkable Whether the menu item is checkable.\n * @private\n */\ngoog.ui.MenuItem.prototype.setCheckableInternal_ = function(checkable) {\n  var element = this.getElement();\n  if (element) {\n    this.getRenderer().setCheckable(this, element, checkable);\n  }\n};\n\n\n/**\n * Returns the text caption of the component while ignoring accelerators.\n * @override\n */\ngoog.ui.MenuItem.prototype.getCaption = function() {\n  var content = this.getContent();\n  if (goog.isArray(content)) {\n    var acceleratorClass = goog.ui.MenuItem.ACCELERATOR_CLASS;\n    var mnemonicWrapClass = goog.ui.MenuItem.MNEMONIC_WRAPPER_CLASS_;\n    var caption =\n        goog.array\n            .map(\n                content,\n                function(node) {\n                  if (goog.dom.isElement(node) &&\n                      (goog.dom.classlist.contains(\n                           /** @type {!Element} */ (node), acceleratorClass) ||\n                       goog.dom.classlist.contains(\n                           /** @type {!Element} */ (node),\n                           mnemonicWrapClass))) {\n                    return '';\n                  } else {\n                    return goog.dom.getRawTextContent(node);\n                  }\n                })\n            .join('');\n    return goog.string.collapseBreakingSpaces(caption);\n  }\n  return goog.ui.MenuItem.superClass_.getCaption.call(this);\n};\n\n\n/**\n * @return {?string} The keyboard accelerator text, or null if the menu item\n *     doesn't have one.\n */\ngoog.ui.MenuItem.prototype.getAccelerator = function() {\n  var dom = this.getDomHelper();\n  var content = this.getContent();\n  if (goog.isArray(content)) {\n    var acceleratorEl = goog.array.find(content, function(e) {\n      return goog.dom.classlist.contains(\n          /** @type {!Element} */ (e), goog.ui.MenuItem.ACCELERATOR_CLASS);\n    });\n    if (acceleratorEl) {\n      return dom.getTextContent(acceleratorEl);\n    }\n  }\n  return null;\n};\n\n\n/** @override */\ngoog.ui.MenuItem.prototype.handleMouseUp = function(e) {\n  var parentMenu = /** @type {goog.ui.Menu} */ (this.getParent());\n\n  if (parentMenu) {\n    var oldCoords = parentMenu.openingCoords;\n    // Clear out the saved opening coords immediately so they're not used twice.\n    parentMenu.openingCoords = null;\n\n    if (oldCoords && typeof e.clientX === 'number') {\n      var newCoords = new goog.math.Coordinate(e.clientX, e.clientY);\n      if (goog.math.Coordinate.equals(oldCoords, newCoords)) {\n        // This menu was opened by a mousedown and we're handling the consequent\n        // mouseup. The coords haven't changed, meaning this was a simple click,\n        // not a click and drag. Don't do the usual behavior because the menu\n        // just popped up under the mouse and the user didn't mean to activate\n        // this item.\n        return;\n      }\n    }\n  }\n\n  goog.ui.MenuItem.base(this, 'handleMouseUp', e);\n};\n\n\n/** @override */\ngoog.ui.MenuItem.prototype.handleKeyEventInternal = function(e) {\n  if (e.keyCode == this.getMnemonic() && this.performActionInternal(e)) {\n    return true;\n  } else {\n    return goog.ui.MenuItem.base(this, 'handleKeyEventInternal', e);\n  }\n};\n\n\n/**\n * Sets the mnemonic key code. The mnemonic is the key associated with this\n * action.\n * @param {goog.events.KeyCodes} key The key code.\n */\ngoog.ui.MenuItem.prototype.setMnemonic = function(key) {\n  this.mnemonicKey_ = key;\n};\n\n\n/**\n * Gets the mnemonic key code. The mnemonic is the key associated with this\n * action.\n * @return {goog.events.KeyCodes} The key code of the mnemonic key.\n */\ngoog.ui.MenuItem.prototype.getMnemonic = function() {\n  return this.mnemonicKey_;\n};\n\n\n// Register a decorator factory function for goog.ui.MenuItems.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.MenuItemRenderer.CSS_CLASS, function() {\n      // MenuItem defaults to using MenuItemRenderer.\n      return new goog.ui.MenuItem(null);\n    });\n\n\n/**\n * @override\n */\ngoog.ui.MenuItem.prototype.getPreferredAriaRole = function() {\n  if (this.isSupportedState(goog.ui.Component.State.CHECKED)) {\n    return goog.a11y.aria.Role.MENU_ITEM_CHECKBOX;\n  }\n  if (this.isSupportedState(goog.ui.Component.State.SELECTED)) {\n    return goog.a11y.aria.Role.MENU_ITEM_RADIO;\n  }\n  return goog.ui.MenuItem.base(this, 'getPreferredAriaRole');\n};\n\n\n/**\n * @override\n * @return {goog.ui.Menu}\n */\ngoog.ui.MenuItem.prototype.getParent = function() {\n  return /** @type {goog.ui.Menu} */ (\n      goog.ui.Control.prototype.getParent.call(this));\n};\n\n\n/**\n * @override\n * @return {goog.ui.Menu}\n */\ngoog.ui.MenuItem.prototype.getParentEventTarget = function() {\n  return /** @type {goog.ui.Menu} */ (\n      goog.ui.Control.prototype.getParentEventTarget.call(this));\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","^:;","^9L","^:=","^;G","^9>","^:>","~$goog.ui.MenuItemRenderer","^>8","^=T","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/menuitem.js"],"^:1",["^9K",["^:?"]],"^9<",true,"^9=",["^9>","^;G","^;9","^;;","^:;","^>8","^9L","^:=","^=T","^A3","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.promise.thenable.js","^9C",["^9D","goog/promise/thenable.js"],"^9E","goog/promise/thenable.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.Thenable');\n\n/** @suppress {extraRequire} */\ngoog.forwardDeclare('goog.Promise'); // for the type reference.\n\n\n\n/**\n * Provides a more strict interface for Thenables in terms of\n * http://promisesaplus.com for interop with {@see goog.Promise}.\n *\n * @interface\n * @extends {IThenable<TYPE>}\n * @template TYPE\n */\ngoog.Thenable = function() {};\n\n\n/**\n * Adds callbacks that will operate on the result of the Thenable, returning a\n * new child Promise.\n *\n * If the Thenable is fulfilled, the `onFulfilled` callback will be\n * invoked with the fulfillment value as argument, and the child Promise will\n * be fulfilled with the return value of the callback. If the callback throws\n * an exception, the child Promise will be rejected with the thrown value\n * instead.\n *\n * If the Thenable is rejected, the `onRejected` callback will be invoked\n * with the rejection reason as argument, and the child Promise will be rejected\n * with the return value of the callback or thrown value.\n *\n * @param {?(function(this:THIS, TYPE): VALUE)=} opt_onFulfilled A\n *     function that will be invoked with the fulfillment value if the Promise\n *     is fulfilled.\n * @param {?(function(this:THIS, *): *)=} opt_onRejected A function that will\n *     be invoked with the rejection reason if the Promise is rejected.\n * @param {THIS=} opt_context An optional context object that will be the\n *     execution context for the callbacks. By default, functions are executed\n *     with the default this.\n *\n * @return {RESULT} A new Promise that will receive the result\n *     of the fulfillment or rejection callback.\n * @template VALUE\n * @template THIS\n *\n * When a Promise (or thenable) is returned from the fulfilled callback,\n * the result is the payload of that promise, not the promise itself.\n *\n * @template RESULT := type('goog.Promise',\n *     cond(isUnknown(VALUE), unknown(),\n *       mapunion(VALUE, (V) =>\n *         cond(isTemplatized(V) && sub(rawTypeOf(V), 'IThenable'),\n *           templateTypeOf(V, 0),\n *           cond(sub(V, 'Thenable'),\n *              unknown(),\n *              V)))))\n *  =:\n *\n */\ngoog.Thenable.prototype.then = function(\n    opt_onFulfilled, opt_onRejected, opt_context) {};\n\n\n/**\n * An expando property to indicate that an object implements\n * `goog.Thenable`.\n *\n * {@see addImplementation}.\n *\n * @const\n */\ngoog.Thenable.IMPLEMENTED_BY_PROP = '$goog_Thenable';\n\n\n/**\n * Marks a given class (constructor) as an implementation of Thenable, so\n * that we can query that fact at runtime. The class must have already\n * implemented the interface.\n * Exports a 'then' method on the constructor prototype, so that the objects\n * also implement the extern {@see goog.Thenable} interface for interop with\n * other Promise implementations.\n * @param {function(new:goog.Thenable,...?)} ctor The class constructor. The\n *     corresponding class must have already implemented the interface.\n */\ngoog.Thenable.addImplementation = function(ctor) {\n  if (COMPILED) {\n    ctor.prototype[goog.Thenable.IMPLEMENTED_BY_PROP] = true;\n  } else {\n    // Avoids dictionary access in uncompiled mode.\n    ctor.prototype.$goog_Thenable = true;\n  }\n};\n\n\n/**\n * @param {?} object\n * @return {boolean} Whether a given instance implements `goog.Thenable`.\n *     The class/superclass of the instance must call `addImplementation`.\n */\ngoog.Thenable.isImplementedBy = function(object) {\n  if (!object) {\n    return false;\n  }\n  try {\n    if (COMPILED) {\n      return !!object[goog.Thenable.IMPLEMENTED_BY_PROP];\n    }\n    return !!object.$goog_Thenable;\n  } catch (e) {\n    // Property access seems to be forbidden.\n    return false;\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/promise/thenable.js"],"^:1",["^9K",["^:9"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.positioning.viewportclientposition.js","^9C",["^9D","goog/positioning/viewportclientposition.js"],"^9E","goog/positioning/viewportclientposition.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Client viewport positioning class.\n *\n * @author robbyw@google.com (Robert Walker)\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.positioning.ViewportClientPosition');\n\ngoog.require('goog.dom');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.positioning');\ngoog.require('goog.positioning.ClientPosition');\ngoog.require('goog.positioning.Overflow');\ngoog.require('goog.positioning.OverflowStatus');\ngoog.require('goog.style');\n\n\n\n/**\n * Encapsulates a popup position where the popup is positioned relative to the\n * window (client) coordinates, and made to stay within the viewport.\n *\n * @param {number|goog.math.Coordinate} arg1 Left position or coordinate.\n * @param {number=} opt_arg2 Top position if arg1 is a number representing the\n *     left position, ignored otherwise.\n * @constructor\n * @extends {goog.positioning.ClientPosition}\n */\ngoog.positioning.ViewportClientPosition = function(arg1, opt_arg2) {\n  goog.positioning.ClientPosition.call(this, arg1, opt_arg2);\n};\ngoog.inherits(\n    goog.positioning.ViewportClientPosition, goog.positioning.ClientPosition);\n\n\n/**\n * The last-resort overflow strategy, if the popup fails to fit.\n * @type {number}\n * @private\n */\ngoog.positioning.ViewportClientPosition.prototype.lastResortOverflow_ = 0;\n\n\n/**\n * Set the last-resort overflow strategy, if the popup fails to fit.\n * @param {number} overflow A bitmask of goog.positioning.Overflow strategies.\n */\ngoog.positioning.ViewportClientPosition.prototype.setLastResortOverflow =\n    function(overflow) {\n  this.lastResortOverflow_ = overflow;\n};\n\n\n/**\n * Repositions the popup according to the current state.\n *\n * @param {Element} element The DOM element of the popup.\n * @param {goog.positioning.Corner} popupCorner The corner of the popup\n *     element that that should be positioned adjacent to the anchorElement.\n *     One of the goog.positioning.Corner constants.\n * @param {goog.math.Box=} opt_margin A margin specified in pixels.\n * @param {goog.math.Size=} opt_preferredSize Preferred size fo the element.\n * @override\n */\ngoog.positioning.ViewportClientPosition.prototype.reposition = function(\n    element, popupCorner, opt_margin, opt_preferredSize) {\n  var viewportElt = goog.style.getClientViewportElement(element);\n  var viewport = goog.style.getVisibleRectForElement(viewportElt);\n  var scrollEl = goog.dom.getDomHelper(element).getDocumentScrollElement();\n  var clientPos = new goog.math.Coordinate(\n      this.coordinate.x + scrollEl.scrollLeft,\n      this.coordinate.y + scrollEl.scrollTop);\n\n  var failXY =\n      goog.positioning.Overflow.FAIL_X | goog.positioning.Overflow.FAIL_Y;\n  var corner = popupCorner;\n\n  // Try the requested position.\n  var status = goog.positioning.positionAtCoordinate(\n      clientPos, element, corner, opt_margin, viewport, failXY,\n      opt_preferredSize);\n  if ((status & goog.positioning.OverflowStatus.FAILED) == 0) {\n    return;\n  }\n\n  // Outside left or right edge of viewport, try try to flip it horizontally.\n  if (status & goog.positioning.OverflowStatus.FAILED_LEFT ||\n      status & goog.positioning.OverflowStatus.FAILED_RIGHT) {\n    corner = goog.positioning.flipCornerHorizontal(corner);\n  }\n\n  // Outside top or bottom edge of viewport, try try to flip it vertically.\n  if (status & goog.positioning.OverflowStatus.FAILED_TOP ||\n      status & goog.positioning.OverflowStatus.FAILED_BOTTOM) {\n    corner = goog.positioning.flipCornerVertical(corner);\n  }\n\n  // Try flipped position.\n  status = goog.positioning.positionAtCoordinate(\n      clientPos, element, corner, opt_margin, viewport, failXY,\n      opt_preferredSize);\n  if ((status & goog.positioning.OverflowStatus.FAILED) == 0) {\n    return;\n  }\n\n  // If that failed, the viewport is simply too small to contain the popup.\n  // Revert to the original position.\n  goog.positioning.positionAtCoordinate(\n      clientPos, element, popupCorner, opt_margin, viewport,\n      this.lastResortOverflow_, opt_preferredSize);\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","~$goog.positioning","^9>","^>8","~$goog.positioning.Overflow","~$goog.positioning.OverflowStatus","^<3","~$goog.positioning.ClientPosition"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/positioning/viewportclientposition.js"],"^:1",["^9K",["~$goog.positioning.ViewportClientPosition"]],"^9<",true,"^9=",["^9>","^;;","^>8","^A4","^A7","^A5","^A6","^<3"]],["^ ","^9A",[1579837703000],"^9B","goog.html.sanitizer.html_test_vectors.js","^9C",["^9D","goog/html/sanitizer/html_test_vectors.js"],"^9E","goog/html/sanitizer/html_test_vectors.js","^9F","^9G","^9H","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n// AUTOGENERATED. DO NOT EDIT.\n\ngoog.provide('goog.html.htmlTestVectors');\ngoog.setTestOnly();\n\ngoog.html.htmlTestVectors.HTML_TEST_VECTORS = [\n    {input: \"<body onload=alert('xss')>\",\n     acceptable: [\n         \"\",\n     ],\n     name: \"body_onload\"},\n    {input: \"<form><input name=\\\"children\\\"></form>\",\n     acceptable: [\n         \"\",\n         \"<form><input></form>\",\n     ],\n     name: \"clobbering_children\"},\n    {input: \"<form><input name=\\\"firstChild\\\"></form>\",\n     acceptable: [\n         \"\",\n         \"<form><input></form>\",\n     ],\n     name: \"clobbering_firstchild\"},\n    {input: \"<form><input name=\\\"__proto__\\\"></form>\",\n     acceptable: [\n         \"\",\n         \"<form><input></form>\",\n     ],\n     name: \"clobbering_proto\"},\n    {input: \"<form><input name=\\\"tagName\\\"></form>\",\n     acceptable: [\n         \"\",\n     ],\n     name: \"clobbering_tagname\"},\n    {input: \"<details open ontoggle=\\\"alert('xss')\\\">\",\n     acceptable: [\n         \"\",\n         \"<details></details>\",\n         \"<details open></details>\",\n         \"<details open=\\\"\\\"></details>\",\n         \"<DETAILS open=\\\"\\\" />\",\n         \"<DETAILS open=\\\"\\\"></DETAILS>\",\n     ],\n     name: \"details\"},\n    {input: \"<iframe src=\\\"javascript:alert('xss')\\\">\",\n     acceptable: [\n         \"\",\n         \"<iframe></iframe>\",\n     ],\n     name: \"iframe_src\"},\n    {input: \"<iframe srcdoc=\\\"&lt;img src&equals;x:x onerror&equals;alert&lpar;xss&rpar;&gt;\\\" />\",\n     acceptable: [\n         \"\",\n         \"<iframe srcdoc=\\\"&lt;img src=&#34;about:invalid#zGoSafez&#34;/&gt;\\\"></iframe>\",\n         \"<iframe srcdoc=\\\"&lt;img src=&quot;about:invalid#zCSafez&quot;&gt;\\\"></iframe>\",\n         \"<iframe srcdoc=\\\"<img src=&quot;about:invalid#zCSafez&quot;>\\\"></iframe>\",\n     ],\n     name: \"iframe_srcdoc\"},\n    {input: \"<img src=\\\"javascript:alert('xss');\\\">\",\n     acceptable: [\n         \"<img src=\\\"javascript:void(0);\\\">\",\n         \"<img src=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<img src=\\\"about:invalid#zCSafez\\\">\",\n         \"<img>\",\n         \"<img />\",\n     ],\n     name: \"img\"},\n    {input: \"<!--<img src=\\\"--><img src=x onerror=alert('xss')//\\\">\",\n     acceptable: [\n         \"<img />\",\n         \"<img src=x>\",\n         \"<img src=\\\"x\\\">\",\n         \"<img src=\\\"x\\\"/>\",\n         \"<img src=\\\"javascript:void(0);\\\">\",\n     ],\n     name: \"img_comment\"},\n    {input: \"<img \\\"\\\"\\\"><script>alert('xss')</script>\\\">\",\n     acceptable: [\n         \"<img/>&#34;&gt;\",\n         \"<img>&quot;&gt;\",\n         \"<img>\\\"&gt;\",\n         \"<img />\\\"&gt;\",\n     ],\n     name: \"img_malformed\"},\n    {input: \"<img src=x onerror=\\\"alert('xxs')\\\">\",\n     acceptable: [\n         \"<img src=\\\"x\\\"/>\",\n         \"<img src=\\\"x\\\">\",\n         \"<img src=x>\",\n         \"<img src=\\\"javascript:void(0);\\\">\",\n         \"<img />\",\n     ],\n     name: \"img_onerror\"},\n    {input: \"<img src=javascript:alert(&quot;XSS&quot;)>\",\n     acceptable: [\n         \"<img src=\\\"javascript:void(0);\\\">\",\n         \"<img src=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<img src=\\\"about:invalid#zCSafez\\\">\",\n         \"<img>\",\n         \"<img />\",\n     ],\n     name: \"img_quot\"},\n    {input: \"<style><img src=\\\"</style><img src=x onerror=alert('xss')//\\\">\",\n     acceptable: [\n         \"\",\n         \"<img />\",\n         \"<img src=x>\",\n         \"<img src=\\\"x\\\"/>\",\n         \"<img src=\\\"x\\\">\",\n         \"<img src=\\\"javascript:void(0);\\\">\",\n     ],\n     name: \"img_style\"},\n    {input: \"<img src=\\\"jav&#x09;ascript:alert('xss');\\\">\",\n     acceptable: [\n         \"<img src=\\\"javascript:void(0);\\\">\",\n         \"<img src=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<img src=\\\"about:invalid#zCSafez\\\">\",\n         \"<img>\",\n         \"<img />\",\n     ],\n     name: \"img_tab\"},\n    {input: \"<input type=\\\"image\\\" src=\\\"javascript:alert('xss');\\\">\",\n     acceptable: [\n         \"\",\n         \"<input type=\\\"image\\\">\",\n         \"<input type=\\\"image\\\" />\",\n         \"<input type=\\\"image\\\" src=\\\"about:invalid#zCSafez\\\">\",\n     ],\n     name: \"input\"},\n    {input: \"<a><a<a>a><a style=\\\"<a><a<a>a><a\\\"<a><a<a>a><a >\",\n     acceptable: [\n         \"<a>a&gt;<a>a&gt;<a></a></a></a>\",\n         \"<a></a><a></a><a></a>\",\n         \"<a><span>a&gt;</span></a><a><span>a&gt;</span></a><a></a>\",\n         \"<a><span>a&gt;</span></a><a><span>a&gt;</span></a><a />\",\n     ],\n     name: \"mess_of_anchors\"},\n    {input: \"<a><a></a></a>\",\n     acceptable: [\n         \"<a><a></a></a>\",\n         \"<a></a><a></a>\",\n         \"<a /><a />\",\n     ],\n     name: \"nested_anchors\"},\n    {input: \"<object data=\\\"data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==\\\"></object>\",\n     acceptable: [\n         \"\",\n     ],\n     name: \"object\"},\n    {input: \"javascript:/*--></title></style></textarea></script></xmp><svg/onload='+/\\\"/+/onmouseover=1/+/[*/[]/+alert(xss)//'>\",\n     acceptable: [\n         \"javascript:/*--&gt;\",\n     ],\n     name: \"polygot\"},\n    {input: \"javascript:x//*/javascript:javascript:\\\"/*'/*`/*--></noscript></title></textarea></style></template></noembed></script><html \\\" onmouseover=/*&lt;svg/*/onload=xonload=x//><svg onload=x><svg onload=x>*/</style><script>x</script><style>\",\n     acceptable: [\n         \"javascript:x//*/javascript:javascript:&quot;/*&#39;/*`/*--&gt;\",\n         \"javascript:x//*/javascript:javascript:&#34;/*&#39;/*`/*--&gt;\",\n         \"javascript:x//*/javascript:javascript:&quot;/*&#39;/*`/*--&gt;*/\",\n         \"javascript:x//*/javascript:javascript:\\\"/*'/*`/*--&gt;\",\n         \"javascript:x//*/javascript:javascript:\\\"/*'/*`/*--&gt;*/\",\n     ],\n     name: \"polygot_inquisition\"},\n    {input: \"'\\\"\",\n     acceptable: [\n         \"'\\\"\",\n         \"&#39;&quot;\",\n         \"&#39;&#34;\",\n     ],\n     name: \"quotes\"},\n    {input: \"<LINK REL=\\\"stylesheet\\\" HREF=\\\"javascript:alert('xss')\\\">\",\n     acceptable: [\n         \"\",\n         \"<link rel=\\\"stylesheet\\\"/>\",\n         \"<link rel=stylesheet>\",\n         \"<link rel=\\\"stylesheet\\\">\",\n     ],\n     name: \"remote_stylesheet\"},\n    {input: \"<STYLE>@import'javascript:alert('xss')';</STYLE>\",\n     acceptable: [\n         \"\",\n     ],\n     name: \"remote_stylesheet2\"},\n    {input: \"<script>alert('xss')</script>\",\n     acceptable: [\n         \"\",\n     ],\n     name: \"script_alert\"},\n    {input: \"<scrIpt>alert('xss')</scrIpt>\",\n     acceptable: [\n         \"\",\n     ],\n     name: \"script_case\"},\n    {input: \"<<script>alert('xss');//<</script>\",\n     acceptable: [\n         \"&lt;\",\n     ],\n     name: \"script_extra\"},\n    {input: \"<<s<script>script>alert()<</script>/script>\",\n     acceptable: [\n         \"&lt;\",\n         \"&lt;script&gt;alert()&lt;/script&gt;\",\n         \"&lt;<span>script&gt;alert()&lt;/script&gt;</span>\",\n     ],\n     name: \"script_inception\"},\n    {input: \"<script/xss src=\\\"/xss.js\\\"><\\\\/script>\",\n     acceptable: [\n         \"\",\n     ],\n     name: \"script_nondigit\"},\n    {input: \"<script src=\\\"/xss.js\\\"< b >\",\n     acceptable: [\n         \"\",\n     ],\n     name: \"script_open\"},\n    {input: \"<script src=\\\"/xss.js\\\"></script>\",\n     acceptable: [\n         \"\",\n     ],\n     name: \"script_src\"},\n    {input: \"</title><script>alert('xss');</script>\",\n     acceptable: [\n         \"\",\n     ],\n     name: \"script_title\"},\n    {input: \"<svg onload=\\\"javascript:alert('xss')\\\" xmlns=\\\"http://www.google.com\\\"></svg>\",\n     acceptable: [\n         \"\",\n     ],\n     name: \"svg\"},\n    {input: \"<img src=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#88;&#83;&#83;&#39;&#41;>\",\n     acceptable: [\n         \"<img src=\\\"javascript:void(0);\\\">\",\n         \"<img src=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<img src=\\\"about:invalid#zCSafez\\\">\",\n         \"<img>\",\n         \"<img />\",\n     ],\n     name: \"unicode\"},\n    {input: \"<html></html>\",\n     acceptable: [\n         \"<html>\",\n         \"<html />\",\n         \"<html></html>\",\n         \"<table><html></html></table>\",\n         \"<HTML />\",\n         \"<HTML></HTML>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_html_plain\"},\n    {input: \"<html><script>alert()</script></html>\",\n     acceptable: [\n         \"<html>\",\n         \"<html />\",\n         \"<html></html>\",\n         \"<table><html></html></table>\",\n         \"<HTML />\",\n         \"<HTML></HTML>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><html><td></td></html></table>\",\n         \"<table><html></html><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_html_scriptinside\"},\n    {input: \"<html media=\\\"x\\\">\",\n     acceptable: [\n         \"<html></html>\",\n         \"<html>\",\n         \"<html/>\",\n         \"<html />\",\n         \"<table><html></html></table>\",\n         \"<table><html></table>\",\n         \"<HTML />\",\n         \"<HTML></HTML>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_html_media\"},\n    {input: \"<html nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<html></html>\",\n         \"<html>\",\n         \"<html/>\",\n         \"<html />\",\n         \"<table><html></html></table>\",\n         \"<table><html></table>\",\n         \"<HTML />\",\n         \"<HTML></HTML>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_html_nonce\"},\n    {input: \"<html srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<html></html>\",\n         \"<html>\",\n         \"<html/>\",\n         \"<html />\",\n         \"<table><html></html></table>\",\n         \"<table><html></table>\",\n         \"<HTML />\",\n         \"<HTML></HTML>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_html_srcset\"},\n    {input: \"<html srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<html></html>\",\n         \"<html>\",\n         \"<html/>\",\n         \"<html />\",\n         \"<table><html></html></table>\",\n         \"<table><html></table>\",\n         \"<HTML />\",\n         \"<HTML></HTML>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_html_srcdoc\"},\n    {input: \"<html poster=\\\"x\\\">\",\n     acceptable: [\n         \"<html></html>\",\n         \"<html>\",\n         \"<html/>\",\n         \"<html />\",\n         \"<table><html></html></table>\",\n         \"<table><html></table>\",\n         \"<HTML />\",\n         \"<HTML></HTML>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_html_poster\"},\n    {input: \"<html autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<html></html>\",\n         \"<html>\",\n         \"<html/>\",\n         \"<html />\",\n         \"<table><html></html></table>\",\n         \"<table><html></table>\",\n         \"<HTML />\",\n         \"<HTML></HTML>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_html_autoplay\"},\n    {input: \"<html controls=\\\"x\\\">\",\n     acceptable: [\n         \"<html></html>\",\n         \"<html>\",\n         \"<html/>\",\n         \"<html />\",\n         \"<table><html></html></table>\",\n         \"<table><html></table>\",\n         \"<HTML />\",\n         \"<HTML></HTML>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_html_controls\"},\n    {input: \"<html formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<html></html>\",\n         \"<html>\",\n         \"<html/>\",\n         \"<html />\",\n         \"<table><html></html></table>\",\n         \"<table><html></table>\",\n         \"<HTML />\",\n         \"<HTML></HTML>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_html_formaction\"},\n    {input: \"<html formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<html></html>\",\n         \"<html>\",\n         \"<html/>\",\n         \"<html />\",\n         \"<table><html></html></table>\",\n         \"<table><html></table>\",\n         \"<HTML />\",\n         \"<HTML></HTML>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_html_formmethod\"},\n    {input: \"<html pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<html></html>\",\n         \"<html>\",\n         \"<html/>\",\n         \"<html />\",\n         \"<table><html></html></table>\",\n         \"<table><html></table>\",\n         \"<HTML />\",\n         \"<HTML></HTML>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_html_pattern\"},\n    {input: \"<html icon=\\\"x\\\">\",\n     acceptable: [\n         \"<html></html>\",\n         \"<html>\",\n         \"<html/>\",\n         \"<html />\",\n         \"<table><html></html></table>\",\n         \"<table><html></table>\",\n         \"<HTML />\",\n         \"<HTML></HTML>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_html_icon\"},\n    {input: \"<html select=\\\"x\\\">\",\n     acceptable: [\n         \"<html></html>\",\n         \"<html>\",\n         \"<html/>\",\n         \"<html />\",\n         \"<table><html></html></table>\",\n         \"<table><html></table>\",\n         \"<HTML />\",\n         \"<HTML></HTML>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_html_select\"},\n    {input: \"<head></head>\",\n     acceptable: [\n         \"<head>\",\n         \"<head />\",\n         \"<head></head>\",\n         \"<table><head></head></table>\",\n         \"<HEAD />\",\n         \"<HEAD></HEAD>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_head_plain\"},\n    {input: \"<head><script>alert()</script></head>\",\n     acceptable: [\n         \"<head>\",\n         \"<head />\",\n         \"<head></head>\",\n         \"<table><head></head></table>\",\n         \"<HEAD />\",\n         \"<HEAD></HEAD>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><head><td></td></head></table>\",\n         \"<table><head></head><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_head_scriptinside\"},\n    {input: \"<head media=\\\"x\\\">\",\n     acceptable: [\n         \"<head></head>\",\n         \"<head>\",\n         \"<head/>\",\n         \"<head />\",\n         \"<table><head></head></table>\",\n         \"<table><head></table>\",\n         \"<HEAD />\",\n         \"<HEAD></HEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_head_media\"},\n    {input: \"<head nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<head></head>\",\n         \"<head>\",\n         \"<head/>\",\n         \"<head />\",\n         \"<table><head></head></table>\",\n         \"<table><head></table>\",\n         \"<HEAD />\",\n         \"<HEAD></HEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_head_nonce\"},\n    {input: \"<head srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<head></head>\",\n         \"<head>\",\n         \"<head/>\",\n         \"<head />\",\n         \"<table><head></head></table>\",\n         \"<table><head></table>\",\n         \"<HEAD />\",\n         \"<HEAD></HEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_head_srcset\"},\n    {input: \"<head srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<head></head>\",\n         \"<head>\",\n         \"<head/>\",\n         \"<head />\",\n         \"<table><head></head></table>\",\n         \"<table><head></table>\",\n         \"<HEAD />\",\n         \"<HEAD></HEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_head_srcdoc\"},\n    {input: \"<head poster=\\\"x\\\">\",\n     acceptable: [\n         \"<head></head>\",\n         \"<head>\",\n         \"<head/>\",\n         \"<head />\",\n         \"<table><head></head></table>\",\n         \"<table><head></table>\",\n         \"<HEAD />\",\n         \"<HEAD></HEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_head_poster\"},\n    {input: \"<head autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<head></head>\",\n         \"<head>\",\n         \"<head/>\",\n         \"<head />\",\n         \"<table><head></head></table>\",\n         \"<table><head></table>\",\n         \"<HEAD />\",\n         \"<HEAD></HEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_head_autoplay\"},\n    {input: \"<head controls=\\\"x\\\">\",\n     acceptable: [\n         \"<head></head>\",\n         \"<head>\",\n         \"<head/>\",\n         \"<head />\",\n         \"<table><head></head></table>\",\n         \"<table><head></table>\",\n         \"<HEAD />\",\n         \"<HEAD></HEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_head_controls\"},\n    {input: \"<head formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<head></head>\",\n         \"<head>\",\n         \"<head/>\",\n         \"<head />\",\n         \"<table><head></head></table>\",\n         \"<table><head></table>\",\n         \"<HEAD />\",\n         \"<HEAD></HEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_head_formaction\"},\n    {input: \"<head formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<head></head>\",\n         \"<head>\",\n         \"<head/>\",\n         \"<head />\",\n         \"<table><head></head></table>\",\n         \"<table><head></table>\",\n         \"<HEAD />\",\n         \"<HEAD></HEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_head_formmethod\"},\n    {input: \"<head pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<head></head>\",\n         \"<head>\",\n         \"<head/>\",\n         \"<head />\",\n         \"<table><head></head></table>\",\n         \"<table><head></table>\",\n         \"<HEAD />\",\n         \"<HEAD></HEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_head_pattern\"},\n    {input: \"<head icon=\\\"x\\\">\",\n     acceptable: [\n         \"<head></head>\",\n         \"<head>\",\n         \"<head/>\",\n         \"<head />\",\n         \"<table><head></head></table>\",\n         \"<table><head></table>\",\n         \"<HEAD />\",\n         \"<HEAD></HEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_head_icon\"},\n    {input: \"<head select=\\\"x\\\">\",\n     acceptable: [\n         \"<head></head>\",\n         \"<head>\",\n         \"<head/>\",\n         \"<head />\",\n         \"<table><head></head></table>\",\n         \"<table><head></table>\",\n         \"<HEAD />\",\n         \"<HEAD></HEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_head_select\"},\n    {input: \"<title></title>\",\n     acceptable: [\n         \"<title></title>\",\n         \"<title />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_title_plain\"},\n    {input: \"<title><script>alert()</script></title>\",\n     acceptable: [\n         \"<title></title>\",\n         \"<title />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<title>&lt;script&gt;alert()&lt;/script&gt;</title>\",\n         \"<span>&lt;script&gt;alert()&lt;/script&gt;</span>\",\n         \"&lt;script&gt;alert()&lt;/script&gt;\",\n     ],\n     name: \"contract_title_scriptinside\"},\n    {input: \"<title media=\\\"x\\\">\",\n     acceptable: [\n         \"<title></title>\",\n         \"<title>\",\n         \"<title/>\",\n         \"<title />\",\n         \"<table><title></title></table>\",\n         \"<table><title></table>\",\n         \"<TITLE />\",\n         \"<TITLE></TITLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_title_media\"},\n    {input: \"<title nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<title></title>\",\n         \"<title>\",\n         \"<title/>\",\n         \"<title />\",\n         \"<table><title></title></table>\",\n         \"<table><title></table>\",\n         \"<TITLE />\",\n         \"<TITLE></TITLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_title_nonce\"},\n    {input: \"<title srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<title></title>\",\n         \"<title>\",\n         \"<title/>\",\n         \"<title />\",\n         \"<table><title></title></table>\",\n         \"<table><title></table>\",\n         \"<TITLE />\",\n         \"<TITLE></TITLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_title_srcset\"},\n    {input: \"<title srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<title></title>\",\n         \"<title>\",\n         \"<title/>\",\n         \"<title />\",\n         \"<table><title></title></table>\",\n         \"<table><title></table>\",\n         \"<TITLE />\",\n         \"<TITLE></TITLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_title_srcdoc\"},\n    {input: \"<title poster=\\\"x\\\">\",\n     acceptable: [\n         \"<title></title>\",\n         \"<title>\",\n         \"<title/>\",\n         \"<title />\",\n         \"<table><title></title></table>\",\n         \"<table><title></table>\",\n         \"<TITLE />\",\n         \"<TITLE></TITLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_title_poster\"},\n    {input: \"<title autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<title></title>\",\n         \"<title>\",\n         \"<title/>\",\n         \"<title />\",\n         \"<table><title></title></table>\",\n         \"<table><title></table>\",\n         \"<TITLE />\",\n         \"<TITLE></TITLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_title_autoplay\"},\n    {input: \"<title controls=\\\"x\\\">\",\n     acceptable: [\n         \"<title></title>\",\n         \"<title>\",\n         \"<title/>\",\n         \"<title />\",\n         \"<table><title></title></table>\",\n         \"<table><title></table>\",\n         \"<TITLE />\",\n         \"<TITLE></TITLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_title_controls\"},\n    {input: \"<title formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<title></title>\",\n         \"<title>\",\n         \"<title/>\",\n         \"<title />\",\n         \"<table><title></title></table>\",\n         \"<table><title></table>\",\n         \"<TITLE />\",\n         \"<TITLE></TITLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_title_formaction\"},\n    {input: \"<title formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<title></title>\",\n         \"<title>\",\n         \"<title/>\",\n         \"<title />\",\n         \"<table><title></title></table>\",\n         \"<table><title></table>\",\n         \"<TITLE />\",\n         \"<TITLE></TITLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_title_formmethod\"},\n    {input: \"<title pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<title></title>\",\n         \"<title>\",\n         \"<title/>\",\n         \"<title />\",\n         \"<table><title></title></table>\",\n         \"<table><title></table>\",\n         \"<TITLE />\",\n         \"<TITLE></TITLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_title_pattern\"},\n    {input: \"<title icon=\\\"x\\\">\",\n     acceptable: [\n         \"<title></title>\",\n         \"<title>\",\n         \"<title/>\",\n         \"<title />\",\n         \"<table><title></title></table>\",\n         \"<table><title></table>\",\n         \"<TITLE />\",\n         \"<TITLE></TITLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_title_icon\"},\n    {input: \"<title select=\\\"x\\\">\",\n     acceptable: [\n         \"<title></title>\",\n         \"<title>\",\n         \"<title/>\",\n         \"<title />\",\n         \"<table><title></title></table>\",\n         \"<table><title></table>\",\n         \"<TITLE />\",\n         \"<TITLE></TITLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_title_select\"},\n    {input: \"<base></base>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_base_plain\"},\n    {input: \"<base><script>alert()</script></base>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_base_scriptinside\"},\n    {input: \"<base media=\\\"x\\\">\",\n     acceptable: [\n         \"<base></base>\",\n         \"<base>\",\n         \"<base/>\",\n         \"<base />\",\n         \"<table><base></base></table>\",\n         \"<table><base></table>\",\n         \"<BASE />\",\n         \"<BASE></BASE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_base_media\"},\n    {input: \"<base nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<base></base>\",\n         \"<base>\",\n         \"<base/>\",\n         \"<base />\",\n         \"<table><base></base></table>\",\n         \"<table><base></table>\",\n         \"<BASE />\",\n         \"<BASE></BASE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_base_nonce\"},\n    {input: \"<base srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<base></base>\",\n         \"<base>\",\n         \"<base/>\",\n         \"<base />\",\n         \"<table><base></base></table>\",\n         \"<table><base></table>\",\n         \"<BASE />\",\n         \"<BASE></BASE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_base_srcset\"},\n    {input: \"<base srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<base></base>\",\n         \"<base>\",\n         \"<base/>\",\n         \"<base />\",\n         \"<table><base></base></table>\",\n         \"<table><base></table>\",\n         \"<BASE />\",\n         \"<BASE></BASE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_base_srcdoc\"},\n    {input: \"<base poster=\\\"x\\\">\",\n     acceptable: [\n         \"<base></base>\",\n         \"<base>\",\n         \"<base/>\",\n         \"<base />\",\n         \"<table><base></base></table>\",\n         \"<table><base></table>\",\n         \"<BASE />\",\n         \"<BASE></BASE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_base_poster\"},\n    {input: \"<base autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<base></base>\",\n         \"<base>\",\n         \"<base/>\",\n         \"<base />\",\n         \"<table><base></base></table>\",\n         \"<table><base></table>\",\n         \"<BASE />\",\n         \"<BASE></BASE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_base_autoplay\"},\n    {input: \"<base controls=\\\"x\\\">\",\n     acceptable: [\n         \"<base></base>\",\n         \"<base>\",\n         \"<base/>\",\n         \"<base />\",\n         \"<table><base></base></table>\",\n         \"<table><base></table>\",\n         \"<BASE />\",\n         \"<BASE></BASE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_base_controls\"},\n    {input: \"<base formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<base></base>\",\n         \"<base>\",\n         \"<base/>\",\n         \"<base />\",\n         \"<table><base></base></table>\",\n         \"<table><base></table>\",\n         \"<BASE />\",\n         \"<BASE></BASE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_base_formaction\"},\n    {input: \"<base formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<base></base>\",\n         \"<base>\",\n         \"<base/>\",\n         \"<base />\",\n         \"<table><base></base></table>\",\n         \"<table><base></table>\",\n         \"<BASE />\",\n         \"<BASE></BASE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_base_formmethod\"},\n    {input: \"<base pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<base></base>\",\n         \"<base>\",\n         \"<base/>\",\n         \"<base />\",\n         \"<table><base></base></table>\",\n         \"<table><base></table>\",\n         \"<BASE />\",\n         \"<BASE></BASE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_base_pattern\"},\n    {input: \"<base icon=\\\"x\\\">\",\n     acceptable: [\n         \"<base></base>\",\n         \"<base>\",\n         \"<base/>\",\n         \"<base />\",\n         \"<table><base></base></table>\",\n         \"<table><base></table>\",\n         \"<BASE />\",\n         \"<BASE></BASE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_base_icon\"},\n    {input: \"<base select=\\\"x\\\">\",\n     acceptable: [\n         \"<base></base>\",\n         \"<base>\",\n         \"<base/>\",\n         \"<base />\",\n         \"<table><base></base></table>\",\n         \"<table><base></table>\",\n         \"<BASE />\",\n         \"<BASE></BASE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_base_select\"},\n    {input: \"<meta></meta>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meta_plain\"},\n    {input: \"<meta><script>alert()</script></meta>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meta_scriptinside\"},\n    {input: \"<meta media=\\\"x\\\">\",\n     acceptable: [\n         \"<meta></meta>\",\n         \"<meta>\",\n         \"<meta/>\",\n         \"<meta />\",\n         \"<table><meta></meta></table>\",\n         \"<table><meta></table>\",\n         \"<META />\",\n         \"<META></META>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meta_media\"},\n    {input: \"<meta nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<meta></meta>\",\n         \"<meta>\",\n         \"<meta/>\",\n         \"<meta />\",\n         \"<table><meta></meta></table>\",\n         \"<table><meta></table>\",\n         \"<META />\",\n         \"<META></META>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meta_nonce\"},\n    {input: \"<meta srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<meta></meta>\",\n         \"<meta>\",\n         \"<meta/>\",\n         \"<meta />\",\n         \"<table><meta></meta></table>\",\n         \"<table><meta></table>\",\n         \"<META />\",\n         \"<META></META>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meta_srcset\"},\n    {input: \"<meta srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<meta></meta>\",\n         \"<meta>\",\n         \"<meta/>\",\n         \"<meta />\",\n         \"<table><meta></meta></table>\",\n         \"<table><meta></table>\",\n         \"<META />\",\n         \"<META></META>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meta_srcdoc\"},\n    {input: \"<meta poster=\\\"x\\\">\",\n     acceptable: [\n         \"<meta></meta>\",\n         \"<meta>\",\n         \"<meta/>\",\n         \"<meta />\",\n         \"<table><meta></meta></table>\",\n         \"<table><meta></table>\",\n         \"<META />\",\n         \"<META></META>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meta_poster\"},\n    {input: \"<meta autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<meta></meta>\",\n         \"<meta>\",\n         \"<meta/>\",\n         \"<meta />\",\n         \"<table><meta></meta></table>\",\n         \"<table><meta></table>\",\n         \"<META />\",\n         \"<META></META>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meta_autoplay\"},\n    {input: \"<meta controls=\\\"x\\\">\",\n     acceptable: [\n         \"<meta></meta>\",\n         \"<meta>\",\n         \"<meta/>\",\n         \"<meta />\",\n         \"<table><meta></meta></table>\",\n         \"<table><meta></table>\",\n         \"<META />\",\n         \"<META></META>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meta_controls\"},\n    {input: \"<meta formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<meta></meta>\",\n         \"<meta>\",\n         \"<meta/>\",\n         \"<meta />\",\n         \"<table><meta></meta></table>\",\n         \"<table><meta></table>\",\n         \"<META />\",\n         \"<META></META>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meta_formaction\"},\n    {input: \"<meta formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<meta></meta>\",\n         \"<meta>\",\n         \"<meta/>\",\n         \"<meta />\",\n         \"<table><meta></meta></table>\",\n         \"<table><meta></table>\",\n         \"<META />\",\n         \"<META></META>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meta_formmethod\"},\n    {input: \"<meta pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<meta></meta>\",\n         \"<meta>\",\n         \"<meta/>\",\n         \"<meta />\",\n         \"<table><meta></meta></table>\",\n         \"<table><meta></table>\",\n         \"<META />\",\n         \"<META></META>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meta_pattern\"},\n    {input: \"<meta icon=\\\"x\\\">\",\n     acceptable: [\n         \"<meta></meta>\",\n         \"<meta>\",\n         \"<meta/>\",\n         \"<meta />\",\n         \"<table><meta></meta></table>\",\n         \"<table><meta></table>\",\n         \"<META />\",\n         \"<META></META>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meta_icon\"},\n    {input: \"<meta select=\\\"x\\\">\",\n     acceptable: [\n         \"<meta></meta>\",\n         \"<meta>\",\n         \"<meta/>\",\n         \"<meta />\",\n         \"<table><meta></meta></table>\",\n         \"<table><meta></table>\",\n         \"<META />\",\n         \"<META></META>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meta_select\"},\n    {input: \"<style></style>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_style_plain\"},\n    {input: \"<style><script>alert()</script></style>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_style_scriptinside\"},\n    {input: \"<style srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<style></style>\",\n         \"<style>\",\n         \"<style/>\",\n         \"<style />\",\n         \"<table><style></style></table>\",\n         \"<table><style></table>\",\n         \"<STYLE />\",\n         \"<STYLE></STYLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_style_srcset\"},\n    {input: \"<style srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<style></style>\",\n         \"<style>\",\n         \"<style/>\",\n         \"<style />\",\n         \"<table><style></style></table>\",\n         \"<table><style></table>\",\n         \"<STYLE />\",\n         \"<STYLE></STYLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_style_srcdoc\"},\n    {input: \"<style poster=\\\"x\\\">\",\n     acceptable: [\n         \"<style></style>\",\n         \"<style>\",\n         \"<style/>\",\n         \"<style />\",\n         \"<table><style></style></table>\",\n         \"<table><style></table>\",\n         \"<STYLE />\",\n         \"<STYLE></STYLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_style_poster\"},\n    {input: \"<style autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<style></style>\",\n         \"<style>\",\n         \"<style/>\",\n         \"<style />\",\n         \"<table><style></style></table>\",\n         \"<table><style></table>\",\n         \"<STYLE />\",\n         \"<STYLE></STYLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_style_autoplay\"},\n    {input: \"<style controls=\\\"x\\\">\",\n     acceptable: [\n         \"<style></style>\",\n         \"<style>\",\n         \"<style/>\",\n         \"<style />\",\n         \"<table><style></style></table>\",\n         \"<table><style></table>\",\n         \"<STYLE />\",\n         \"<STYLE></STYLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_style_controls\"},\n    {input: \"<style formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<style></style>\",\n         \"<style>\",\n         \"<style/>\",\n         \"<style />\",\n         \"<table><style></style></table>\",\n         \"<table><style></table>\",\n         \"<STYLE />\",\n         \"<STYLE></STYLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_style_formaction\"},\n    {input: \"<style formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<style></style>\",\n         \"<style>\",\n         \"<style/>\",\n         \"<style />\",\n         \"<table><style></style></table>\",\n         \"<table><style></table>\",\n         \"<STYLE />\",\n         \"<STYLE></STYLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_style_formmethod\"},\n    {input: \"<style pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<style></style>\",\n         \"<style>\",\n         \"<style/>\",\n         \"<style />\",\n         \"<table><style></style></table>\",\n         \"<table><style></table>\",\n         \"<STYLE />\",\n         \"<STYLE></STYLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_style_pattern\"},\n    {input: \"<style icon=\\\"x\\\">\",\n     acceptable: [\n         \"<style></style>\",\n         \"<style>\",\n         \"<style/>\",\n         \"<style />\",\n         \"<table><style></style></table>\",\n         \"<table><style></table>\",\n         \"<STYLE />\",\n         \"<STYLE></STYLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_style_icon\"},\n    {input: \"<style select=\\\"x\\\">\",\n     acceptable: [\n         \"<style></style>\",\n         \"<style>\",\n         \"<style/>\",\n         \"<style />\",\n         \"<table><style></style></table>\",\n         \"<table><style></table>\",\n         \"<STYLE />\",\n         \"<STYLE></STYLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_style_select\"},\n    {input: \"<body></body>\",\n     acceptable: [\n         \"<body>\",\n         \"<body />\",\n         \"<body></body>\",\n         \"<table><body></body></table>\",\n         \"<BODY />\",\n         \"<BODY></BODY>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_body_plain\"},\n    {input: \"<body><script>alert()</script></body>\",\n     acceptable: [\n         \"<body>\",\n         \"<body />\",\n         \"<body></body>\",\n         \"<table><body></body></table>\",\n         \"<BODY />\",\n         \"<BODY></BODY>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><body><td></td></body></table>\",\n         \"<table><body></body><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_body_scriptinside\"},\n    {input: \"<body media=\\\"x\\\">\",\n     acceptable: [\n         \"<body></body>\",\n         \"<body>\",\n         \"<body/>\",\n         \"<body />\",\n         \"<table><body></body></table>\",\n         \"<table><body></table>\",\n         \"<BODY />\",\n         \"<BODY></BODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_body_media\"},\n    {input: \"<body nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<body></body>\",\n         \"<body>\",\n         \"<body/>\",\n         \"<body />\",\n         \"<table><body></body></table>\",\n         \"<table><body></table>\",\n         \"<BODY />\",\n         \"<BODY></BODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_body_nonce\"},\n    {input: \"<body srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<body></body>\",\n         \"<body>\",\n         \"<body/>\",\n         \"<body />\",\n         \"<table><body></body></table>\",\n         \"<table><body></table>\",\n         \"<BODY />\",\n         \"<BODY></BODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_body_srcset\"},\n    {input: \"<body srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<body></body>\",\n         \"<body>\",\n         \"<body/>\",\n         \"<body />\",\n         \"<table><body></body></table>\",\n         \"<table><body></table>\",\n         \"<BODY />\",\n         \"<BODY></BODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_body_srcdoc\"},\n    {input: \"<body poster=\\\"x\\\">\",\n     acceptable: [\n         \"<body></body>\",\n         \"<body>\",\n         \"<body/>\",\n         \"<body />\",\n         \"<table><body></body></table>\",\n         \"<table><body></table>\",\n         \"<BODY />\",\n         \"<BODY></BODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_body_poster\"},\n    {input: \"<body autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<body></body>\",\n         \"<body>\",\n         \"<body/>\",\n         \"<body />\",\n         \"<table><body></body></table>\",\n         \"<table><body></table>\",\n         \"<BODY />\",\n         \"<BODY></BODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_body_autoplay\"},\n    {input: \"<body controls=\\\"x\\\">\",\n     acceptable: [\n         \"<body></body>\",\n         \"<body>\",\n         \"<body/>\",\n         \"<body />\",\n         \"<table><body></body></table>\",\n         \"<table><body></table>\",\n         \"<BODY />\",\n         \"<BODY></BODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_body_controls\"},\n    {input: \"<body formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<body></body>\",\n         \"<body>\",\n         \"<body/>\",\n         \"<body />\",\n         \"<table><body></body></table>\",\n         \"<table><body></table>\",\n         \"<BODY />\",\n         \"<BODY></BODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_body_formaction\"},\n    {input: \"<body formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<body></body>\",\n         \"<body>\",\n         \"<body/>\",\n         \"<body />\",\n         \"<table><body></body></table>\",\n         \"<table><body></table>\",\n         \"<BODY />\",\n         \"<BODY></BODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_body_formmethod\"},\n    {input: \"<body pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<body></body>\",\n         \"<body>\",\n         \"<body/>\",\n         \"<body />\",\n         \"<table><body></body></table>\",\n         \"<table><body></table>\",\n         \"<BODY />\",\n         \"<BODY></BODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_body_pattern\"},\n    {input: \"<body icon=\\\"x\\\">\",\n     acceptable: [\n         \"<body></body>\",\n         \"<body>\",\n         \"<body/>\",\n         \"<body />\",\n         \"<table><body></body></table>\",\n         \"<table><body></table>\",\n         \"<BODY />\",\n         \"<BODY></BODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_body_icon\"},\n    {input: \"<body select=\\\"x\\\">\",\n     acceptable: [\n         \"<body></body>\",\n         \"<body>\",\n         \"<body/>\",\n         \"<body />\",\n         \"<table><body></body></table>\",\n         \"<table><body></table>\",\n         \"<BODY />\",\n         \"<BODY></BODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_body_select\"},\n    {input: \"<article></article>\",\n     acceptable: [\n         \"<article>\",\n         \"<article />\",\n         \"<article></article>\",\n         \"<table><article></article></table>\",\n         \"<ARTICLE />\",\n         \"<ARTICLE></ARTICLE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_article_plain\"},\n    {input: \"<article><script>alert()</script></article>\",\n     acceptable: [\n         \"<article>\",\n         \"<article />\",\n         \"<article></article>\",\n         \"<table><article></article></table>\",\n         \"<ARTICLE />\",\n         \"<ARTICLE></ARTICLE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><article><td></td></article></table>\",\n         \"<table><article></article><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_article_scriptinside\"},\n    {input: \"<article media=\\\"x\\\">\",\n     acceptable: [\n         \"<article></article>\",\n         \"<article>\",\n         \"<article/>\",\n         \"<article />\",\n         \"<table><article></article></table>\",\n         \"<table><article></table>\",\n         \"<ARTICLE />\",\n         \"<ARTICLE></ARTICLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_article_media\"},\n    {input: \"<article nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<article></article>\",\n         \"<article>\",\n         \"<article/>\",\n         \"<article />\",\n         \"<table><article></article></table>\",\n         \"<table><article></table>\",\n         \"<ARTICLE />\",\n         \"<ARTICLE></ARTICLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_article_nonce\"},\n    {input: \"<article srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<article></article>\",\n         \"<article>\",\n         \"<article/>\",\n         \"<article />\",\n         \"<table><article></article></table>\",\n         \"<table><article></table>\",\n         \"<ARTICLE />\",\n         \"<ARTICLE></ARTICLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_article_srcset\"},\n    {input: \"<article srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<article></article>\",\n         \"<article>\",\n         \"<article/>\",\n         \"<article />\",\n         \"<table><article></article></table>\",\n         \"<table><article></table>\",\n         \"<ARTICLE />\",\n         \"<ARTICLE></ARTICLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_article_srcdoc\"},\n    {input: \"<article poster=\\\"x\\\">\",\n     acceptable: [\n         \"<article></article>\",\n         \"<article>\",\n         \"<article/>\",\n         \"<article />\",\n         \"<table><article></article></table>\",\n         \"<table><article></table>\",\n         \"<ARTICLE />\",\n         \"<ARTICLE></ARTICLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_article_poster\"},\n    {input: \"<article autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<article></article>\",\n         \"<article>\",\n         \"<article/>\",\n         \"<article />\",\n         \"<table><article></article></table>\",\n         \"<table><article></table>\",\n         \"<ARTICLE />\",\n         \"<ARTICLE></ARTICLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_article_autoplay\"},\n    {input: \"<article controls=\\\"x\\\">\",\n     acceptable: [\n         \"<article></article>\",\n         \"<article>\",\n         \"<article/>\",\n         \"<article />\",\n         \"<table><article></article></table>\",\n         \"<table><article></table>\",\n         \"<ARTICLE />\",\n         \"<ARTICLE></ARTICLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_article_controls\"},\n    {input: \"<article formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<article></article>\",\n         \"<article>\",\n         \"<article/>\",\n         \"<article />\",\n         \"<table><article></article></table>\",\n         \"<table><article></table>\",\n         \"<ARTICLE />\",\n         \"<ARTICLE></ARTICLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_article_formaction\"},\n    {input: \"<article formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<article></article>\",\n         \"<article>\",\n         \"<article/>\",\n         \"<article />\",\n         \"<table><article></article></table>\",\n         \"<table><article></table>\",\n         \"<ARTICLE />\",\n         \"<ARTICLE></ARTICLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_article_formmethod\"},\n    {input: \"<article pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<article></article>\",\n         \"<article>\",\n         \"<article/>\",\n         \"<article />\",\n         \"<table><article></article></table>\",\n         \"<table><article></table>\",\n         \"<ARTICLE />\",\n         \"<ARTICLE></ARTICLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_article_pattern\"},\n    {input: \"<article icon=\\\"x\\\">\",\n     acceptable: [\n         \"<article></article>\",\n         \"<article>\",\n         \"<article/>\",\n         \"<article />\",\n         \"<table><article></article></table>\",\n         \"<table><article></table>\",\n         \"<ARTICLE />\",\n         \"<ARTICLE></ARTICLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_article_icon\"},\n    {input: \"<article select=\\\"x\\\">\",\n     acceptable: [\n         \"<article></article>\",\n         \"<article>\",\n         \"<article/>\",\n         \"<article />\",\n         \"<table><article></article></table>\",\n         \"<table><article></table>\",\n         \"<ARTICLE />\",\n         \"<ARTICLE></ARTICLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_article_select\"},\n    {input: \"<section></section>\",\n     acceptable: [\n         \"<section>\",\n         \"<section />\",\n         \"<section></section>\",\n         \"<table><section></section></table>\",\n         \"<SECTION />\",\n         \"<SECTION></SECTION>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_section_plain\"},\n    {input: \"<section><script>alert()</script></section>\",\n     acceptable: [\n         \"<section>\",\n         \"<section />\",\n         \"<section></section>\",\n         \"<table><section></section></table>\",\n         \"<SECTION />\",\n         \"<SECTION></SECTION>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><section><td></td></section></table>\",\n         \"<table><section></section><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_section_scriptinside\"},\n    {input: \"<section media=\\\"x\\\">\",\n     acceptable: [\n         \"<section></section>\",\n         \"<section>\",\n         \"<section/>\",\n         \"<section />\",\n         \"<table><section></section></table>\",\n         \"<table><section></table>\",\n         \"<SECTION />\",\n         \"<SECTION></SECTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_section_media\"},\n    {input: \"<section nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<section></section>\",\n         \"<section>\",\n         \"<section/>\",\n         \"<section />\",\n         \"<table><section></section></table>\",\n         \"<table><section></table>\",\n         \"<SECTION />\",\n         \"<SECTION></SECTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_section_nonce\"},\n    {input: \"<section srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<section></section>\",\n         \"<section>\",\n         \"<section/>\",\n         \"<section />\",\n         \"<table><section></section></table>\",\n         \"<table><section></table>\",\n         \"<SECTION />\",\n         \"<SECTION></SECTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_section_srcset\"},\n    {input: \"<section srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<section></section>\",\n         \"<section>\",\n         \"<section/>\",\n         \"<section />\",\n         \"<table><section></section></table>\",\n         \"<table><section></table>\",\n         \"<SECTION />\",\n         \"<SECTION></SECTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_section_srcdoc\"},\n    {input: \"<section poster=\\\"x\\\">\",\n     acceptable: [\n         \"<section></section>\",\n         \"<section>\",\n         \"<section/>\",\n         \"<section />\",\n         \"<table><section></section></table>\",\n         \"<table><section></table>\",\n         \"<SECTION />\",\n         \"<SECTION></SECTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_section_poster\"},\n    {input: \"<section autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<section></section>\",\n         \"<section>\",\n         \"<section/>\",\n         \"<section />\",\n         \"<table><section></section></table>\",\n         \"<table><section></table>\",\n         \"<SECTION />\",\n         \"<SECTION></SECTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_section_autoplay\"},\n    {input: \"<section controls=\\\"x\\\">\",\n     acceptable: [\n         \"<section></section>\",\n         \"<section>\",\n         \"<section/>\",\n         \"<section />\",\n         \"<table><section></section></table>\",\n         \"<table><section></table>\",\n         \"<SECTION />\",\n         \"<SECTION></SECTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_section_controls\"},\n    {input: \"<section formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<section></section>\",\n         \"<section>\",\n         \"<section/>\",\n         \"<section />\",\n         \"<table><section></section></table>\",\n         \"<table><section></table>\",\n         \"<SECTION />\",\n         \"<SECTION></SECTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_section_formaction\"},\n    {input: \"<section formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<section></section>\",\n         \"<section>\",\n         \"<section/>\",\n         \"<section />\",\n         \"<table><section></section></table>\",\n         \"<table><section></table>\",\n         \"<SECTION />\",\n         \"<SECTION></SECTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_section_formmethod\"},\n    {input: \"<section pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<section></section>\",\n         \"<section>\",\n         \"<section/>\",\n         \"<section />\",\n         \"<table><section></section></table>\",\n         \"<table><section></table>\",\n         \"<SECTION />\",\n         \"<SECTION></SECTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_section_pattern\"},\n    {input: \"<section icon=\\\"x\\\">\",\n     acceptable: [\n         \"<section></section>\",\n         \"<section>\",\n         \"<section/>\",\n         \"<section />\",\n         \"<table><section></section></table>\",\n         \"<table><section></table>\",\n         \"<SECTION />\",\n         \"<SECTION></SECTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_section_icon\"},\n    {input: \"<section select=\\\"x\\\">\",\n     acceptable: [\n         \"<section></section>\",\n         \"<section>\",\n         \"<section/>\",\n         \"<section />\",\n         \"<table><section></section></table>\",\n         \"<table><section></table>\",\n         \"<SECTION />\",\n         \"<SECTION></SECTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_section_select\"},\n    {input: \"<nav></nav>\",\n     acceptable: [\n         \"<nav>\",\n         \"<nav />\",\n         \"<nav></nav>\",\n         \"<table><nav></nav></table>\",\n         \"<NAV />\",\n         \"<NAV></NAV>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_nav_plain\"},\n    {input: \"<nav><script>alert()</script></nav>\",\n     acceptable: [\n         \"<nav>\",\n         \"<nav />\",\n         \"<nav></nav>\",\n         \"<table><nav></nav></table>\",\n         \"<NAV />\",\n         \"<NAV></NAV>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><nav><td></td></nav></table>\",\n         \"<table><nav></nav><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_nav_scriptinside\"},\n    {input: \"<nav media=\\\"x\\\">\",\n     acceptable: [\n         \"<nav></nav>\",\n         \"<nav>\",\n         \"<nav/>\",\n         \"<nav />\",\n         \"<table><nav></nav></table>\",\n         \"<table><nav></table>\",\n         \"<NAV />\",\n         \"<NAV></NAV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_nav_media\"},\n    {input: \"<nav nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<nav></nav>\",\n         \"<nav>\",\n         \"<nav/>\",\n         \"<nav />\",\n         \"<table><nav></nav></table>\",\n         \"<table><nav></table>\",\n         \"<NAV />\",\n         \"<NAV></NAV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_nav_nonce\"},\n    {input: \"<nav srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<nav></nav>\",\n         \"<nav>\",\n         \"<nav/>\",\n         \"<nav />\",\n         \"<table><nav></nav></table>\",\n         \"<table><nav></table>\",\n         \"<NAV />\",\n         \"<NAV></NAV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_nav_srcset\"},\n    {input: \"<nav srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<nav></nav>\",\n         \"<nav>\",\n         \"<nav/>\",\n         \"<nav />\",\n         \"<table><nav></nav></table>\",\n         \"<table><nav></table>\",\n         \"<NAV />\",\n         \"<NAV></NAV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_nav_srcdoc\"},\n    {input: \"<nav poster=\\\"x\\\">\",\n     acceptable: [\n         \"<nav></nav>\",\n         \"<nav>\",\n         \"<nav/>\",\n         \"<nav />\",\n         \"<table><nav></nav></table>\",\n         \"<table><nav></table>\",\n         \"<NAV />\",\n         \"<NAV></NAV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_nav_poster\"},\n    {input: \"<nav autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<nav></nav>\",\n         \"<nav>\",\n         \"<nav/>\",\n         \"<nav />\",\n         \"<table><nav></nav></table>\",\n         \"<table><nav></table>\",\n         \"<NAV />\",\n         \"<NAV></NAV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_nav_autoplay\"},\n    {input: \"<nav controls=\\\"x\\\">\",\n     acceptable: [\n         \"<nav></nav>\",\n         \"<nav>\",\n         \"<nav/>\",\n         \"<nav />\",\n         \"<table><nav></nav></table>\",\n         \"<table><nav></table>\",\n         \"<NAV />\",\n         \"<NAV></NAV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_nav_controls\"},\n    {input: \"<nav formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<nav></nav>\",\n         \"<nav>\",\n         \"<nav/>\",\n         \"<nav />\",\n         \"<table><nav></nav></table>\",\n         \"<table><nav></table>\",\n         \"<NAV />\",\n         \"<NAV></NAV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_nav_formaction\"},\n    {input: \"<nav formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<nav></nav>\",\n         \"<nav>\",\n         \"<nav/>\",\n         \"<nav />\",\n         \"<table><nav></nav></table>\",\n         \"<table><nav></table>\",\n         \"<NAV />\",\n         \"<NAV></NAV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_nav_formmethod\"},\n    {input: \"<nav pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<nav></nav>\",\n         \"<nav>\",\n         \"<nav/>\",\n         \"<nav />\",\n         \"<table><nav></nav></table>\",\n         \"<table><nav></table>\",\n         \"<NAV />\",\n         \"<NAV></NAV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_nav_pattern\"},\n    {input: \"<nav icon=\\\"x\\\">\",\n     acceptable: [\n         \"<nav></nav>\",\n         \"<nav>\",\n         \"<nav/>\",\n         \"<nav />\",\n         \"<table><nav></nav></table>\",\n         \"<table><nav></table>\",\n         \"<NAV />\",\n         \"<NAV></NAV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_nav_icon\"},\n    {input: \"<nav select=\\\"x\\\">\",\n     acceptable: [\n         \"<nav></nav>\",\n         \"<nav>\",\n         \"<nav/>\",\n         \"<nav />\",\n         \"<table><nav></nav></table>\",\n         \"<table><nav></table>\",\n         \"<NAV />\",\n         \"<NAV></NAV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_nav_select\"},\n    {input: \"<aside></aside>\",\n     acceptable: [\n         \"<aside>\",\n         \"<aside />\",\n         \"<aside></aside>\",\n         \"<table><aside></aside></table>\",\n         \"<ASIDE />\",\n         \"<ASIDE></ASIDE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_aside_plain\"},\n    {input: \"<aside><script>alert()</script></aside>\",\n     acceptable: [\n         \"<aside>\",\n         \"<aside />\",\n         \"<aside></aside>\",\n         \"<table><aside></aside></table>\",\n         \"<ASIDE />\",\n         \"<ASIDE></ASIDE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><aside><td></td></aside></table>\",\n         \"<table><aside></aside><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_aside_scriptinside\"},\n    {input: \"<aside media=\\\"x\\\">\",\n     acceptable: [\n         \"<aside></aside>\",\n         \"<aside>\",\n         \"<aside/>\",\n         \"<aside />\",\n         \"<table><aside></aside></table>\",\n         \"<table><aside></table>\",\n         \"<ASIDE />\",\n         \"<ASIDE></ASIDE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_aside_media\"},\n    {input: \"<aside nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<aside></aside>\",\n         \"<aside>\",\n         \"<aside/>\",\n         \"<aside />\",\n         \"<table><aside></aside></table>\",\n         \"<table><aside></table>\",\n         \"<ASIDE />\",\n         \"<ASIDE></ASIDE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_aside_nonce\"},\n    {input: \"<aside srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<aside></aside>\",\n         \"<aside>\",\n         \"<aside/>\",\n         \"<aside />\",\n         \"<table><aside></aside></table>\",\n         \"<table><aside></table>\",\n         \"<ASIDE />\",\n         \"<ASIDE></ASIDE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_aside_srcset\"},\n    {input: \"<aside srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<aside></aside>\",\n         \"<aside>\",\n         \"<aside/>\",\n         \"<aside />\",\n         \"<table><aside></aside></table>\",\n         \"<table><aside></table>\",\n         \"<ASIDE />\",\n         \"<ASIDE></ASIDE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_aside_srcdoc\"},\n    {input: \"<aside poster=\\\"x\\\">\",\n     acceptable: [\n         \"<aside></aside>\",\n         \"<aside>\",\n         \"<aside/>\",\n         \"<aside />\",\n         \"<table><aside></aside></table>\",\n         \"<table><aside></table>\",\n         \"<ASIDE />\",\n         \"<ASIDE></ASIDE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_aside_poster\"},\n    {input: \"<aside autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<aside></aside>\",\n         \"<aside>\",\n         \"<aside/>\",\n         \"<aside />\",\n         \"<table><aside></aside></table>\",\n         \"<table><aside></table>\",\n         \"<ASIDE />\",\n         \"<ASIDE></ASIDE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_aside_autoplay\"},\n    {input: \"<aside controls=\\\"x\\\">\",\n     acceptable: [\n         \"<aside></aside>\",\n         \"<aside>\",\n         \"<aside/>\",\n         \"<aside />\",\n         \"<table><aside></aside></table>\",\n         \"<table><aside></table>\",\n         \"<ASIDE />\",\n         \"<ASIDE></ASIDE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_aside_controls\"},\n    {input: \"<aside formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<aside></aside>\",\n         \"<aside>\",\n         \"<aside/>\",\n         \"<aside />\",\n         \"<table><aside></aside></table>\",\n         \"<table><aside></table>\",\n         \"<ASIDE />\",\n         \"<ASIDE></ASIDE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_aside_formaction\"},\n    {input: \"<aside formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<aside></aside>\",\n         \"<aside>\",\n         \"<aside/>\",\n         \"<aside />\",\n         \"<table><aside></aside></table>\",\n         \"<table><aside></table>\",\n         \"<ASIDE />\",\n         \"<ASIDE></ASIDE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_aside_formmethod\"},\n    {input: \"<aside pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<aside></aside>\",\n         \"<aside>\",\n         \"<aside/>\",\n         \"<aside />\",\n         \"<table><aside></aside></table>\",\n         \"<table><aside></table>\",\n         \"<ASIDE />\",\n         \"<ASIDE></ASIDE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_aside_pattern\"},\n    {input: \"<aside icon=\\\"x\\\">\",\n     acceptable: [\n         \"<aside></aside>\",\n         \"<aside>\",\n         \"<aside/>\",\n         \"<aside />\",\n         \"<table><aside></aside></table>\",\n         \"<table><aside></table>\",\n         \"<ASIDE />\",\n         \"<ASIDE></ASIDE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_aside_icon\"},\n    {input: \"<aside select=\\\"x\\\">\",\n     acceptable: [\n         \"<aside></aside>\",\n         \"<aside>\",\n         \"<aside/>\",\n         \"<aside />\",\n         \"<table><aside></aside></table>\",\n         \"<table><aside></table>\",\n         \"<ASIDE />\",\n         \"<ASIDE></ASIDE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_aside_select\"},\n    {input: \"<h1></h1>\",\n     acceptable: [\n         \"<h1>\",\n         \"<h1 />\",\n         \"<h1></h1>\",\n         \"<table><h1></h1></table>\",\n         \"<H1 />\",\n         \"<H1></H1>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h1_plain\"},\n    {input: \"<h1><script>alert()</script></h1>\",\n     acceptable: [\n         \"<h1>\",\n         \"<h1 />\",\n         \"<h1></h1>\",\n         \"<table><h1></h1></table>\",\n         \"<H1 />\",\n         \"<H1></H1>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><h1><td></td></h1></table>\",\n         \"<table><h1></h1><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_h1_scriptinside\"},\n    {input: \"<h1 media=\\\"x\\\">\",\n     acceptable: [\n         \"<h1></h1>\",\n         \"<h1>\",\n         \"<h1/>\",\n         \"<h1 />\",\n         \"<table><h1></h1></table>\",\n         \"<table><h1></table>\",\n         \"<H1 />\",\n         \"<H1></H1>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h1_media\"},\n    {input: \"<h1 nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<h1></h1>\",\n         \"<h1>\",\n         \"<h1/>\",\n         \"<h1 />\",\n         \"<table><h1></h1></table>\",\n         \"<table><h1></table>\",\n         \"<H1 />\",\n         \"<H1></H1>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h1_nonce\"},\n    {input: \"<h1 srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<h1></h1>\",\n         \"<h1>\",\n         \"<h1/>\",\n         \"<h1 />\",\n         \"<table><h1></h1></table>\",\n         \"<table><h1></table>\",\n         \"<H1 />\",\n         \"<H1></H1>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h1_srcset\"},\n    {input: \"<h1 srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<h1></h1>\",\n         \"<h1>\",\n         \"<h1/>\",\n         \"<h1 />\",\n         \"<table><h1></h1></table>\",\n         \"<table><h1></table>\",\n         \"<H1 />\",\n         \"<H1></H1>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h1_srcdoc\"},\n    {input: \"<h1 poster=\\\"x\\\">\",\n     acceptable: [\n         \"<h1></h1>\",\n         \"<h1>\",\n         \"<h1/>\",\n         \"<h1 />\",\n         \"<table><h1></h1></table>\",\n         \"<table><h1></table>\",\n         \"<H1 />\",\n         \"<H1></H1>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h1_poster\"},\n    {input: \"<h1 autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<h1></h1>\",\n         \"<h1>\",\n         \"<h1/>\",\n         \"<h1 />\",\n         \"<table><h1></h1></table>\",\n         \"<table><h1></table>\",\n         \"<H1 />\",\n         \"<H1></H1>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h1_autoplay\"},\n    {input: \"<h1 controls=\\\"x\\\">\",\n     acceptable: [\n         \"<h1></h1>\",\n         \"<h1>\",\n         \"<h1/>\",\n         \"<h1 />\",\n         \"<table><h1></h1></table>\",\n         \"<table><h1></table>\",\n         \"<H1 />\",\n         \"<H1></H1>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h1_controls\"},\n    {input: \"<h1 formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<h1></h1>\",\n         \"<h1>\",\n         \"<h1/>\",\n         \"<h1 />\",\n         \"<table><h1></h1></table>\",\n         \"<table><h1></table>\",\n         \"<H1 />\",\n         \"<H1></H1>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h1_formaction\"},\n    {input: \"<h1 formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<h1></h1>\",\n         \"<h1>\",\n         \"<h1/>\",\n         \"<h1 />\",\n         \"<table><h1></h1></table>\",\n         \"<table><h1></table>\",\n         \"<H1 />\",\n         \"<H1></H1>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h1_formmethod\"},\n    {input: \"<h1 pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<h1></h1>\",\n         \"<h1>\",\n         \"<h1/>\",\n         \"<h1 />\",\n         \"<table><h1></h1></table>\",\n         \"<table><h1></table>\",\n         \"<H1 />\",\n         \"<H1></H1>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h1_pattern\"},\n    {input: \"<h1 icon=\\\"x\\\">\",\n     acceptable: [\n         \"<h1></h1>\",\n         \"<h1>\",\n         \"<h1/>\",\n         \"<h1 />\",\n         \"<table><h1></h1></table>\",\n         \"<table><h1></table>\",\n         \"<H1 />\",\n         \"<H1></H1>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h1_icon\"},\n    {input: \"<h1 select=\\\"x\\\">\",\n     acceptable: [\n         \"<h1></h1>\",\n         \"<h1>\",\n         \"<h1/>\",\n         \"<h1 />\",\n         \"<table><h1></h1></table>\",\n         \"<table><h1></table>\",\n         \"<H1 />\",\n         \"<H1></H1>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h1_select\"},\n    {input: \"<h2></h2>\",\n     acceptable: [\n         \"<h2>\",\n         \"<h2 />\",\n         \"<h2></h2>\",\n         \"<table><h2></h2></table>\",\n         \"<H2 />\",\n         \"<H2></H2>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h2_plain\"},\n    {input: \"<h2><script>alert()</script></h2>\",\n     acceptable: [\n         \"<h2>\",\n         \"<h2 />\",\n         \"<h2></h2>\",\n         \"<table><h2></h2></table>\",\n         \"<H2 />\",\n         \"<H2></H2>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><h2><td></td></h2></table>\",\n         \"<table><h2></h2><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_h2_scriptinside\"},\n    {input: \"<h2 media=\\\"x\\\">\",\n     acceptable: [\n         \"<h2></h2>\",\n         \"<h2>\",\n         \"<h2/>\",\n         \"<h2 />\",\n         \"<table><h2></h2></table>\",\n         \"<table><h2></table>\",\n         \"<H2 />\",\n         \"<H2></H2>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h2_media\"},\n    {input: \"<h2 nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<h2></h2>\",\n         \"<h2>\",\n         \"<h2/>\",\n         \"<h2 />\",\n         \"<table><h2></h2></table>\",\n         \"<table><h2></table>\",\n         \"<H2 />\",\n         \"<H2></H2>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h2_nonce\"},\n    {input: \"<h2 srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<h2></h2>\",\n         \"<h2>\",\n         \"<h2/>\",\n         \"<h2 />\",\n         \"<table><h2></h2></table>\",\n         \"<table><h2></table>\",\n         \"<H2 />\",\n         \"<H2></H2>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h2_srcset\"},\n    {input: \"<h2 srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<h2></h2>\",\n         \"<h2>\",\n         \"<h2/>\",\n         \"<h2 />\",\n         \"<table><h2></h2></table>\",\n         \"<table><h2></table>\",\n         \"<H2 />\",\n         \"<H2></H2>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h2_srcdoc\"},\n    {input: \"<h2 poster=\\\"x\\\">\",\n     acceptable: [\n         \"<h2></h2>\",\n         \"<h2>\",\n         \"<h2/>\",\n         \"<h2 />\",\n         \"<table><h2></h2></table>\",\n         \"<table><h2></table>\",\n         \"<H2 />\",\n         \"<H2></H2>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h2_poster\"},\n    {input: \"<h2 autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<h2></h2>\",\n         \"<h2>\",\n         \"<h2/>\",\n         \"<h2 />\",\n         \"<table><h2></h2></table>\",\n         \"<table><h2></table>\",\n         \"<H2 />\",\n         \"<H2></H2>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h2_autoplay\"},\n    {input: \"<h2 controls=\\\"x\\\">\",\n     acceptable: [\n         \"<h2></h2>\",\n         \"<h2>\",\n         \"<h2/>\",\n         \"<h2 />\",\n         \"<table><h2></h2></table>\",\n         \"<table><h2></table>\",\n         \"<H2 />\",\n         \"<H2></H2>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h2_controls\"},\n    {input: \"<h2 formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<h2></h2>\",\n         \"<h2>\",\n         \"<h2/>\",\n         \"<h2 />\",\n         \"<table><h2></h2></table>\",\n         \"<table><h2></table>\",\n         \"<H2 />\",\n         \"<H2></H2>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h2_formaction\"},\n    {input: \"<h2 formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<h2></h2>\",\n         \"<h2>\",\n         \"<h2/>\",\n         \"<h2 />\",\n         \"<table><h2></h2></table>\",\n         \"<table><h2></table>\",\n         \"<H2 />\",\n         \"<H2></H2>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h2_formmethod\"},\n    {input: \"<h2 pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<h2></h2>\",\n         \"<h2>\",\n         \"<h2/>\",\n         \"<h2 />\",\n         \"<table><h2></h2></table>\",\n         \"<table><h2></table>\",\n         \"<H2 />\",\n         \"<H2></H2>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h2_pattern\"},\n    {input: \"<h2 icon=\\\"x\\\">\",\n     acceptable: [\n         \"<h2></h2>\",\n         \"<h2>\",\n         \"<h2/>\",\n         \"<h2 />\",\n         \"<table><h2></h2></table>\",\n         \"<table><h2></table>\",\n         \"<H2 />\",\n         \"<H2></H2>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h2_icon\"},\n    {input: \"<h2 select=\\\"x\\\">\",\n     acceptable: [\n         \"<h2></h2>\",\n         \"<h2>\",\n         \"<h2/>\",\n         \"<h2 />\",\n         \"<table><h2></h2></table>\",\n         \"<table><h2></table>\",\n         \"<H2 />\",\n         \"<H2></H2>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h2_select\"},\n    {input: \"<h3></h3>\",\n     acceptable: [\n         \"<h3>\",\n         \"<h3 />\",\n         \"<h3></h3>\",\n         \"<table><h3></h3></table>\",\n         \"<H3 />\",\n         \"<H3></H3>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h3_plain\"},\n    {input: \"<h3><script>alert()</script></h3>\",\n     acceptable: [\n         \"<h3>\",\n         \"<h3 />\",\n         \"<h3></h3>\",\n         \"<table><h3></h3></table>\",\n         \"<H3 />\",\n         \"<H3></H3>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><h3><td></td></h3></table>\",\n         \"<table><h3></h3><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_h3_scriptinside\"},\n    {input: \"<h3 media=\\\"x\\\">\",\n     acceptable: [\n         \"<h3></h3>\",\n         \"<h3>\",\n         \"<h3/>\",\n         \"<h3 />\",\n         \"<table><h3></h3></table>\",\n         \"<table><h3></table>\",\n         \"<H3 />\",\n         \"<H3></H3>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h3_media\"},\n    {input: \"<h3 nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<h3></h3>\",\n         \"<h3>\",\n         \"<h3/>\",\n         \"<h3 />\",\n         \"<table><h3></h3></table>\",\n         \"<table><h3></table>\",\n         \"<H3 />\",\n         \"<H3></H3>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h3_nonce\"},\n    {input: \"<h3 srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<h3></h3>\",\n         \"<h3>\",\n         \"<h3/>\",\n         \"<h3 />\",\n         \"<table><h3></h3></table>\",\n         \"<table><h3></table>\",\n         \"<H3 />\",\n         \"<H3></H3>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h3_srcset\"},\n    {input: \"<h3 srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<h3></h3>\",\n         \"<h3>\",\n         \"<h3/>\",\n         \"<h3 />\",\n         \"<table><h3></h3></table>\",\n         \"<table><h3></table>\",\n         \"<H3 />\",\n         \"<H3></H3>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h3_srcdoc\"},\n    {input: \"<h3 poster=\\\"x\\\">\",\n     acceptable: [\n         \"<h3></h3>\",\n         \"<h3>\",\n         \"<h3/>\",\n         \"<h3 />\",\n         \"<table><h3></h3></table>\",\n         \"<table><h3></table>\",\n         \"<H3 />\",\n         \"<H3></H3>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h3_poster\"},\n    {input: \"<h3 autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<h3></h3>\",\n         \"<h3>\",\n         \"<h3/>\",\n         \"<h3 />\",\n         \"<table><h3></h3></table>\",\n         \"<table><h3></table>\",\n         \"<H3 />\",\n         \"<H3></H3>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h3_autoplay\"},\n    {input: \"<h3 controls=\\\"x\\\">\",\n     acceptable: [\n         \"<h3></h3>\",\n         \"<h3>\",\n         \"<h3/>\",\n         \"<h3 />\",\n         \"<table><h3></h3></table>\",\n         \"<table><h3></table>\",\n         \"<H3 />\",\n         \"<H3></H3>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h3_controls\"},\n    {input: \"<h3 formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<h3></h3>\",\n         \"<h3>\",\n         \"<h3/>\",\n         \"<h3 />\",\n         \"<table><h3></h3></table>\",\n         \"<table><h3></table>\",\n         \"<H3 />\",\n         \"<H3></H3>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h3_formaction\"},\n    {input: \"<h3 formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<h3></h3>\",\n         \"<h3>\",\n         \"<h3/>\",\n         \"<h3 />\",\n         \"<table><h3></h3></table>\",\n         \"<table><h3></table>\",\n         \"<H3 />\",\n         \"<H3></H3>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h3_formmethod\"},\n    {input: \"<h3 pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<h3></h3>\",\n         \"<h3>\",\n         \"<h3/>\",\n         \"<h3 />\",\n         \"<table><h3></h3></table>\",\n         \"<table><h3></table>\",\n         \"<H3 />\",\n         \"<H3></H3>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h3_pattern\"},\n    {input: \"<h3 icon=\\\"x\\\">\",\n     acceptable: [\n         \"<h3></h3>\",\n         \"<h3>\",\n         \"<h3/>\",\n         \"<h3 />\",\n         \"<table><h3></h3></table>\",\n         \"<table><h3></table>\",\n         \"<H3 />\",\n         \"<H3></H3>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h3_icon\"},\n    {input: \"<h3 select=\\\"x\\\">\",\n     acceptable: [\n         \"<h3></h3>\",\n         \"<h3>\",\n         \"<h3/>\",\n         \"<h3 />\",\n         \"<table><h3></h3></table>\",\n         \"<table><h3></table>\",\n         \"<H3 />\",\n         \"<H3></H3>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h3_select\"},\n    {input: \"<h4></h4>\",\n     acceptable: [\n         \"<h4>\",\n         \"<h4 />\",\n         \"<h4></h4>\",\n         \"<table><h4></h4></table>\",\n         \"<H4 />\",\n         \"<H4></H4>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h4_plain\"},\n    {input: \"<h4><script>alert()</script></h4>\",\n     acceptable: [\n         \"<h4>\",\n         \"<h4 />\",\n         \"<h4></h4>\",\n         \"<table><h4></h4></table>\",\n         \"<H4 />\",\n         \"<H4></H4>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><h4><td></td></h4></table>\",\n         \"<table><h4></h4><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_h4_scriptinside\"},\n    {input: \"<h4 media=\\\"x\\\">\",\n     acceptable: [\n         \"<h4></h4>\",\n         \"<h4>\",\n         \"<h4/>\",\n         \"<h4 />\",\n         \"<table><h4></h4></table>\",\n         \"<table><h4></table>\",\n         \"<H4 />\",\n         \"<H4></H4>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h4_media\"},\n    {input: \"<h4 nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<h4></h4>\",\n         \"<h4>\",\n         \"<h4/>\",\n         \"<h4 />\",\n         \"<table><h4></h4></table>\",\n         \"<table><h4></table>\",\n         \"<H4 />\",\n         \"<H4></H4>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h4_nonce\"},\n    {input: \"<h4 srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<h4></h4>\",\n         \"<h4>\",\n         \"<h4/>\",\n         \"<h4 />\",\n         \"<table><h4></h4></table>\",\n         \"<table><h4></table>\",\n         \"<H4 />\",\n         \"<H4></H4>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h4_srcset\"},\n    {input: \"<h4 srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<h4></h4>\",\n         \"<h4>\",\n         \"<h4/>\",\n         \"<h4 />\",\n         \"<table><h4></h4></table>\",\n         \"<table><h4></table>\",\n         \"<H4 />\",\n         \"<H4></H4>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h4_srcdoc\"},\n    {input: \"<h4 poster=\\\"x\\\">\",\n     acceptable: [\n         \"<h4></h4>\",\n         \"<h4>\",\n         \"<h4/>\",\n         \"<h4 />\",\n         \"<table><h4></h4></table>\",\n         \"<table><h4></table>\",\n         \"<H4 />\",\n         \"<H4></H4>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h4_poster\"},\n    {input: \"<h4 autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<h4></h4>\",\n         \"<h4>\",\n         \"<h4/>\",\n         \"<h4 />\",\n         \"<table><h4></h4></table>\",\n         \"<table><h4></table>\",\n         \"<H4 />\",\n         \"<H4></H4>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h4_autoplay\"},\n    {input: \"<h4 controls=\\\"x\\\">\",\n     acceptable: [\n         \"<h4></h4>\",\n         \"<h4>\",\n         \"<h4/>\",\n         \"<h4 />\",\n         \"<table><h4></h4></table>\",\n         \"<table><h4></table>\",\n         \"<H4 />\",\n         \"<H4></H4>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h4_controls\"},\n    {input: \"<h4 formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<h4></h4>\",\n         \"<h4>\",\n         \"<h4/>\",\n         \"<h4 />\",\n         \"<table><h4></h4></table>\",\n         \"<table><h4></table>\",\n         \"<H4 />\",\n         \"<H4></H4>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h4_formaction\"},\n    {input: \"<h4 formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<h4></h4>\",\n         \"<h4>\",\n         \"<h4/>\",\n         \"<h4 />\",\n         \"<table><h4></h4></table>\",\n         \"<table><h4></table>\",\n         \"<H4 />\",\n         \"<H4></H4>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h4_formmethod\"},\n    {input: \"<h4 pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<h4></h4>\",\n         \"<h4>\",\n         \"<h4/>\",\n         \"<h4 />\",\n         \"<table><h4></h4></table>\",\n         \"<table><h4></table>\",\n         \"<H4 />\",\n         \"<H4></H4>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h4_pattern\"},\n    {input: \"<h4 icon=\\\"x\\\">\",\n     acceptable: [\n         \"<h4></h4>\",\n         \"<h4>\",\n         \"<h4/>\",\n         \"<h4 />\",\n         \"<table><h4></h4></table>\",\n         \"<table><h4></table>\",\n         \"<H4 />\",\n         \"<H4></H4>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h4_icon\"},\n    {input: \"<h4 select=\\\"x\\\">\",\n     acceptable: [\n         \"<h4></h4>\",\n         \"<h4>\",\n         \"<h4/>\",\n         \"<h4 />\",\n         \"<table><h4></h4></table>\",\n         \"<table><h4></table>\",\n         \"<H4 />\",\n         \"<H4></H4>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h4_select\"},\n    {input: \"<h5></h5>\",\n     acceptable: [\n         \"<h5>\",\n         \"<h5 />\",\n         \"<h5></h5>\",\n         \"<table><h5></h5></table>\",\n         \"<H5 />\",\n         \"<H5></H5>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h5_plain\"},\n    {input: \"<h5><script>alert()</script></h5>\",\n     acceptable: [\n         \"<h5>\",\n         \"<h5 />\",\n         \"<h5></h5>\",\n         \"<table><h5></h5></table>\",\n         \"<H5 />\",\n         \"<H5></H5>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><h5><td></td></h5></table>\",\n         \"<table><h5></h5><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_h5_scriptinside\"},\n    {input: \"<h5 media=\\\"x\\\">\",\n     acceptable: [\n         \"<h5></h5>\",\n         \"<h5>\",\n         \"<h5/>\",\n         \"<h5 />\",\n         \"<table><h5></h5></table>\",\n         \"<table><h5></table>\",\n         \"<H5 />\",\n         \"<H5></H5>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h5_media\"},\n    {input: \"<h5 nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<h5></h5>\",\n         \"<h5>\",\n         \"<h5/>\",\n         \"<h5 />\",\n         \"<table><h5></h5></table>\",\n         \"<table><h5></table>\",\n         \"<H5 />\",\n         \"<H5></H5>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h5_nonce\"},\n    {input: \"<h5 srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<h5></h5>\",\n         \"<h5>\",\n         \"<h5/>\",\n         \"<h5 />\",\n         \"<table><h5></h5></table>\",\n         \"<table><h5></table>\",\n         \"<H5 />\",\n         \"<H5></H5>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h5_srcset\"},\n    {input: \"<h5 srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<h5></h5>\",\n         \"<h5>\",\n         \"<h5/>\",\n         \"<h5 />\",\n         \"<table><h5></h5></table>\",\n         \"<table><h5></table>\",\n         \"<H5 />\",\n         \"<H5></H5>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h5_srcdoc\"},\n    {input: \"<h5 poster=\\\"x\\\">\",\n     acceptable: [\n         \"<h5></h5>\",\n         \"<h5>\",\n         \"<h5/>\",\n         \"<h5 />\",\n         \"<table><h5></h5></table>\",\n         \"<table><h5></table>\",\n         \"<H5 />\",\n         \"<H5></H5>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h5_poster\"},\n    {input: \"<h5 autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<h5></h5>\",\n         \"<h5>\",\n         \"<h5/>\",\n         \"<h5 />\",\n         \"<table><h5></h5></table>\",\n         \"<table><h5></table>\",\n         \"<H5 />\",\n         \"<H5></H5>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h5_autoplay\"},\n    {input: \"<h5 controls=\\\"x\\\">\",\n     acceptable: [\n         \"<h5></h5>\",\n         \"<h5>\",\n         \"<h5/>\",\n         \"<h5 />\",\n         \"<table><h5></h5></table>\",\n         \"<table><h5></table>\",\n         \"<H5 />\",\n         \"<H5></H5>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h5_controls\"},\n    {input: \"<h5 formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<h5></h5>\",\n         \"<h5>\",\n         \"<h5/>\",\n         \"<h5 />\",\n         \"<table><h5></h5></table>\",\n         \"<table><h5></table>\",\n         \"<H5 />\",\n         \"<H5></H5>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h5_formaction\"},\n    {input: \"<h5 formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<h5></h5>\",\n         \"<h5>\",\n         \"<h5/>\",\n         \"<h5 />\",\n         \"<table><h5></h5></table>\",\n         \"<table><h5></table>\",\n         \"<H5 />\",\n         \"<H5></H5>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h5_formmethod\"},\n    {input: \"<h5 pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<h5></h5>\",\n         \"<h5>\",\n         \"<h5/>\",\n         \"<h5 />\",\n         \"<table><h5></h5></table>\",\n         \"<table><h5></table>\",\n         \"<H5 />\",\n         \"<H5></H5>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h5_pattern\"},\n    {input: \"<h5 icon=\\\"x\\\">\",\n     acceptable: [\n         \"<h5></h5>\",\n         \"<h5>\",\n         \"<h5/>\",\n         \"<h5 />\",\n         \"<table><h5></h5></table>\",\n         \"<table><h5></table>\",\n         \"<H5 />\",\n         \"<H5></H5>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h5_icon\"},\n    {input: \"<h5 select=\\\"x\\\">\",\n     acceptable: [\n         \"<h5></h5>\",\n         \"<h5>\",\n         \"<h5/>\",\n         \"<h5 />\",\n         \"<table><h5></h5></table>\",\n         \"<table><h5></table>\",\n         \"<H5 />\",\n         \"<H5></H5>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h5_select\"},\n    {input: \"<h6></h6>\",\n     acceptable: [\n         \"<h6>\",\n         \"<h6 />\",\n         \"<h6></h6>\",\n         \"<table><h6></h6></table>\",\n         \"<H6 />\",\n         \"<H6></H6>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h6_plain\"},\n    {input: \"<h6><script>alert()</script></h6>\",\n     acceptable: [\n         \"<h6>\",\n         \"<h6 />\",\n         \"<h6></h6>\",\n         \"<table><h6></h6></table>\",\n         \"<H6 />\",\n         \"<H6></H6>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><h6><td></td></h6></table>\",\n         \"<table><h6></h6><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_h6_scriptinside\"},\n    {input: \"<h6 media=\\\"x\\\">\",\n     acceptable: [\n         \"<h6></h6>\",\n         \"<h6>\",\n         \"<h6/>\",\n         \"<h6 />\",\n         \"<table><h6></h6></table>\",\n         \"<table><h6></table>\",\n         \"<H6 />\",\n         \"<H6></H6>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h6_media\"},\n    {input: \"<h6 nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<h6></h6>\",\n         \"<h6>\",\n         \"<h6/>\",\n         \"<h6 />\",\n         \"<table><h6></h6></table>\",\n         \"<table><h6></table>\",\n         \"<H6 />\",\n         \"<H6></H6>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h6_nonce\"},\n    {input: \"<h6 srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<h6></h6>\",\n         \"<h6>\",\n         \"<h6/>\",\n         \"<h6 />\",\n         \"<table><h6></h6></table>\",\n         \"<table><h6></table>\",\n         \"<H6 />\",\n         \"<H6></H6>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h6_srcset\"},\n    {input: \"<h6 srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<h6></h6>\",\n         \"<h6>\",\n         \"<h6/>\",\n         \"<h6 />\",\n         \"<table><h6></h6></table>\",\n         \"<table><h6></table>\",\n         \"<H6 />\",\n         \"<H6></H6>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h6_srcdoc\"},\n    {input: \"<h6 poster=\\\"x\\\">\",\n     acceptable: [\n         \"<h6></h6>\",\n         \"<h6>\",\n         \"<h6/>\",\n         \"<h6 />\",\n         \"<table><h6></h6></table>\",\n         \"<table><h6></table>\",\n         \"<H6 />\",\n         \"<H6></H6>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h6_poster\"},\n    {input: \"<h6 autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<h6></h6>\",\n         \"<h6>\",\n         \"<h6/>\",\n         \"<h6 />\",\n         \"<table><h6></h6></table>\",\n         \"<table><h6></table>\",\n         \"<H6 />\",\n         \"<H6></H6>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h6_autoplay\"},\n    {input: \"<h6 controls=\\\"x\\\">\",\n     acceptable: [\n         \"<h6></h6>\",\n         \"<h6>\",\n         \"<h6/>\",\n         \"<h6 />\",\n         \"<table><h6></h6></table>\",\n         \"<table><h6></table>\",\n         \"<H6 />\",\n         \"<H6></H6>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h6_controls\"},\n    {input: \"<h6 formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<h6></h6>\",\n         \"<h6>\",\n         \"<h6/>\",\n         \"<h6 />\",\n         \"<table><h6></h6></table>\",\n         \"<table><h6></table>\",\n         \"<H6 />\",\n         \"<H6></H6>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h6_formaction\"},\n    {input: \"<h6 formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<h6></h6>\",\n         \"<h6>\",\n         \"<h6/>\",\n         \"<h6 />\",\n         \"<table><h6></h6></table>\",\n         \"<table><h6></table>\",\n         \"<H6 />\",\n         \"<H6></H6>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h6_formmethod\"},\n    {input: \"<h6 pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<h6></h6>\",\n         \"<h6>\",\n         \"<h6/>\",\n         \"<h6 />\",\n         \"<table><h6></h6></table>\",\n         \"<table><h6></table>\",\n         \"<H6 />\",\n         \"<H6></H6>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h6_pattern\"},\n    {input: \"<h6 icon=\\\"x\\\">\",\n     acceptable: [\n         \"<h6></h6>\",\n         \"<h6>\",\n         \"<h6/>\",\n         \"<h6 />\",\n         \"<table><h6></h6></table>\",\n         \"<table><h6></table>\",\n         \"<H6 />\",\n         \"<H6></H6>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h6_icon\"},\n    {input: \"<h6 select=\\\"x\\\">\",\n     acceptable: [\n         \"<h6></h6>\",\n         \"<h6>\",\n         \"<h6/>\",\n         \"<h6 />\",\n         \"<table><h6></h6></table>\",\n         \"<table><h6></table>\",\n         \"<H6 />\",\n         \"<H6></H6>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_h6_select\"},\n    {input: \"<header></header>\",\n     acceptable: [\n         \"<header>\",\n         \"<header />\",\n         \"<header></header>\",\n         \"<table><header></header></table>\",\n         \"<HEADER />\",\n         \"<HEADER></HEADER>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_header_plain\"},\n    {input: \"<header><script>alert()</script></header>\",\n     acceptable: [\n         \"<header>\",\n         \"<header />\",\n         \"<header></header>\",\n         \"<table><header></header></table>\",\n         \"<HEADER />\",\n         \"<HEADER></HEADER>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><header><td></td></header></table>\",\n         \"<table><header></header><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_header_scriptinside\"},\n    {input: \"<header media=\\\"x\\\">\",\n     acceptable: [\n         \"<header></header>\",\n         \"<header>\",\n         \"<header/>\",\n         \"<header />\",\n         \"<table><header></header></table>\",\n         \"<table><header></table>\",\n         \"<HEADER />\",\n         \"<HEADER></HEADER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_header_media\"},\n    {input: \"<header nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<header></header>\",\n         \"<header>\",\n         \"<header/>\",\n         \"<header />\",\n         \"<table><header></header></table>\",\n         \"<table><header></table>\",\n         \"<HEADER />\",\n         \"<HEADER></HEADER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_header_nonce\"},\n    {input: \"<header srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<header></header>\",\n         \"<header>\",\n         \"<header/>\",\n         \"<header />\",\n         \"<table><header></header></table>\",\n         \"<table><header></table>\",\n         \"<HEADER />\",\n         \"<HEADER></HEADER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_header_srcset\"},\n    {input: \"<header srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<header></header>\",\n         \"<header>\",\n         \"<header/>\",\n         \"<header />\",\n         \"<table><header></header></table>\",\n         \"<table><header></table>\",\n         \"<HEADER />\",\n         \"<HEADER></HEADER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_header_srcdoc\"},\n    {input: \"<header poster=\\\"x\\\">\",\n     acceptable: [\n         \"<header></header>\",\n         \"<header>\",\n         \"<header/>\",\n         \"<header />\",\n         \"<table><header></header></table>\",\n         \"<table><header></table>\",\n         \"<HEADER />\",\n         \"<HEADER></HEADER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_header_poster\"},\n    {input: \"<header autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<header></header>\",\n         \"<header>\",\n         \"<header/>\",\n         \"<header />\",\n         \"<table><header></header></table>\",\n         \"<table><header></table>\",\n         \"<HEADER />\",\n         \"<HEADER></HEADER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_header_autoplay\"},\n    {input: \"<header controls=\\\"x\\\">\",\n     acceptable: [\n         \"<header></header>\",\n         \"<header>\",\n         \"<header/>\",\n         \"<header />\",\n         \"<table><header></header></table>\",\n         \"<table><header></table>\",\n         \"<HEADER />\",\n         \"<HEADER></HEADER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_header_controls\"},\n    {input: \"<header formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<header></header>\",\n         \"<header>\",\n         \"<header/>\",\n         \"<header />\",\n         \"<table><header></header></table>\",\n         \"<table><header></table>\",\n         \"<HEADER />\",\n         \"<HEADER></HEADER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_header_formaction\"},\n    {input: \"<header formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<header></header>\",\n         \"<header>\",\n         \"<header/>\",\n         \"<header />\",\n         \"<table><header></header></table>\",\n         \"<table><header></table>\",\n         \"<HEADER />\",\n         \"<HEADER></HEADER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_header_formmethod\"},\n    {input: \"<header pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<header></header>\",\n         \"<header>\",\n         \"<header/>\",\n         \"<header />\",\n         \"<table><header></header></table>\",\n         \"<table><header></table>\",\n         \"<HEADER />\",\n         \"<HEADER></HEADER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_header_pattern\"},\n    {input: \"<header icon=\\\"x\\\">\",\n     acceptable: [\n         \"<header></header>\",\n         \"<header>\",\n         \"<header/>\",\n         \"<header />\",\n         \"<table><header></header></table>\",\n         \"<table><header></table>\",\n         \"<HEADER />\",\n         \"<HEADER></HEADER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_header_icon\"},\n    {input: \"<header select=\\\"x\\\">\",\n     acceptable: [\n         \"<header></header>\",\n         \"<header>\",\n         \"<header/>\",\n         \"<header />\",\n         \"<table><header></header></table>\",\n         \"<table><header></table>\",\n         \"<HEADER />\",\n         \"<HEADER></HEADER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_header_select\"},\n    {input: \"<footer></footer>\",\n     acceptable: [\n         \"<footer>\",\n         \"<footer />\",\n         \"<footer></footer>\",\n         \"<table><footer></footer></table>\",\n         \"<FOOTER />\",\n         \"<FOOTER></FOOTER>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_footer_plain\"},\n    {input: \"<footer><script>alert()</script></footer>\",\n     acceptable: [\n         \"<footer>\",\n         \"<footer />\",\n         \"<footer></footer>\",\n         \"<table><footer></footer></table>\",\n         \"<FOOTER />\",\n         \"<FOOTER></FOOTER>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><footer><td></td></footer></table>\",\n         \"<table><footer></footer><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_footer_scriptinside\"},\n    {input: \"<footer media=\\\"x\\\">\",\n     acceptable: [\n         \"<footer></footer>\",\n         \"<footer>\",\n         \"<footer/>\",\n         \"<footer />\",\n         \"<table><footer></footer></table>\",\n         \"<table><footer></table>\",\n         \"<FOOTER />\",\n         \"<FOOTER></FOOTER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_footer_media\"},\n    {input: \"<footer nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<footer></footer>\",\n         \"<footer>\",\n         \"<footer/>\",\n         \"<footer />\",\n         \"<table><footer></footer></table>\",\n         \"<table><footer></table>\",\n         \"<FOOTER />\",\n         \"<FOOTER></FOOTER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_footer_nonce\"},\n    {input: \"<footer srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<footer></footer>\",\n         \"<footer>\",\n         \"<footer/>\",\n         \"<footer />\",\n         \"<table><footer></footer></table>\",\n         \"<table><footer></table>\",\n         \"<FOOTER />\",\n         \"<FOOTER></FOOTER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_footer_srcset\"},\n    {input: \"<footer srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<footer></footer>\",\n         \"<footer>\",\n         \"<footer/>\",\n         \"<footer />\",\n         \"<table><footer></footer></table>\",\n         \"<table><footer></table>\",\n         \"<FOOTER />\",\n         \"<FOOTER></FOOTER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_footer_srcdoc\"},\n    {input: \"<footer poster=\\\"x\\\">\",\n     acceptable: [\n         \"<footer></footer>\",\n         \"<footer>\",\n         \"<footer/>\",\n         \"<footer />\",\n         \"<table><footer></footer></table>\",\n         \"<table><footer></table>\",\n         \"<FOOTER />\",\n         \"<FOOTER></FOOTER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_footer_poster\"},\n    {input: \"<footer autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<footer></footer>\",\n         \"<footer>\",\n         \"<footer/>\",\n         \"<footer />\",\n         \"<table><footer></footer></table>\",\n         \"<table><footer></table>\",\n         \"<FOOTER />\",\n         \"<FOOTER></FOOTER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_footer_autoplay\"},\n    {input: \"<footer controls=\\\"x\\\">\",\n     acceptable: [\n         \"<footer></footer>\",\n         \"<footer>\",\n         \"<footer/>\",\n         \"<footer />\",\n         \"<table><footer></footer></table>\",\n         \"<table><footer></table>\",\n         \"<FOOTER />\",\n         \"<FOOTER></FOOTER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_footer_controls\"},\n    {input: \"<footer formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<footer></footer>\",\n         \"<footer>\",\n         \"<footer/>\",\n         \"<footer />\",\n         \"<table><footer></footer></table>\",\n         \"<table><footer></table>\",\n         \"<FOOTER />\",\n         \"<FOOTER></FOOTER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_footer_formaction\"},\n    {input: \"<footer formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<footer></footer>\",\n         \"<footer>\",\n         \"<footer/>\",\n         \"<footer />\",\n         \"<table><footer></footer></table>\",\n         \"<table><footer></table>\",\n         \"<FOOTER />\",\n         \"<FOOTER></FOOTER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_footer_formmethod\"},\n    {input: \"<footer pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<footer></footer>\",\n         \"<footer>\",\n         \"<footer/>\",\n         \"<footer />\",\n         \"<table><footer></footer></table>\",\n         \"<table><footer></table>\",\n         \"<FOOTER />\",\n         \"<FOOTER></FOOTER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_footer_pattern\"},\n    {input: \"<footer icon=\\\"x\\\">\",\n     acceptable: [\n         \"<footer></footer>\",\n         \"<footer>\",\n         \"<footer/>\",\n         \"<footer />\",\n         \"<table><footer></footer></table>\",\n         \"<table><footer></table>\",\n         \"<FOOTER />\",\n         \"<FOOTER></FOOTER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_footer_icon\"},\n    {input: \"<footer select=\\\"x\\\">\",\n     acceptable: [\n         \"<footer></footer>\",\n         \"<footer>\",\n         \"<footer/>\",\n         \"<footer />\",\n         \"<table><footer></footer></table>\",\n         \"<table><footer></table>\",\n         \"<FOOTER />\",\n         \"<FOOTER></FOOTER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_footer_select\"},\n    {input: \"<address></address>\",\n     acceptable: [\n         \"<address>\",\n         \"<address />\",\n         \"<address></address>\",\n         \"<table><address></address></table>\",\n         \"<ADDRESS />\",\n         \"<ADDRESS></ADDRESS>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_address_plain\"},\n    {input: \"<address><script>alert()</script></address>\",\n     acceptable: [\n         \"<address>\",\n         \"<address />\",\n         \"<address></address>\",\n         \"<table><address></address></table>\",\n         \"<ADDRESS />\",\n         \"<ADDRESS></ADDRESS>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><address><td></td></address></table>\",\n         \"<table><address></address><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_address_scriptinside\"},\n    {input: \"<address media=\\\"x\\\">\",\n     acceptable: [\n         \"<address></address>\",\n         \"<address>\",\n         \"<address/>\",\n         \"<address />\",\n         \"<table><address></address></table>\",\n         \"<table><address></table>\",\n         \"<ADDRESS />\",\n         \"<ADDRESS></ADDRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_address_media\"},\n    {input: \"<address nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<address></address>\",\n         \"<address>\",\n         \"<address/>\",\n         \"<address />\",\n         \"<table><address></address></table>\",\n         \"<table><address></table>\",\n         \"<ADDRESS />\",\n         \"<ADDRESS></ADDRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_address_nonce\"},\n    {input: \"<address srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<address></address>\",\n         \"<address>\",\n         \"<address/>\",\n         \"<address />\",\n         \"<table><address></address></table>\",\n         \"<table><address></table>\",\n         \"<ADDRESS />\",\n         \"<ADDRESS></ADDRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_address_srcset\"},\n    {input: \"<address srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<address></address>\",\n         \"<address>\",\n         \"<address/>\",\n         \"<address />\",\n         \"<table><address></address></table>\",\n         \"<table><address></table>\",\n         \"<ADDRESS />\",\n         \"<ADDRESS></ADDRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_address_srcdoc\"},\n    {input: \"<address poster=\\\"x\\\">\",\n     acceptable: [\n         \"<address></address>\",\n         \"<address>\",\n         \"<address/>\",\n         \"<address />\",\n         \"<table><address></address></table>\",\n         \"<table><address></table>\",\n         \"<ADDRESS />\",\n         \"<ADDRESS></ADDRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_address_poster\"},\n    {input: \"<address autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<address></address>\",\n         \"<address>\",\n         \"<address/>\",\n         \"<address />\",\n         \"<table><address></address></table>\",\n         \"<table><address></table>\",\n         \"<ADDRESS />\",\n         \"<ADDRESS></ADDRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_address_autoplay\"},\n    {input: \"<address controls=\\\"x\\\">\",\n     acceptable: [\n         \"<address></address>\",\n         \"<address>\",\n         \"<address/>\",\n         \"<address />\",\n         \"<table><address></address></table>\",\n         \"<table><address></table>\",\n         \"<ADDRESS />\",\n         \"<ADDRESS></ADDRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_address_controls\"},\n    {input: \"<address formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<address></address>\",\n         \"<address>\",\n         \"<address/>\",\n         \"<address />\",\n         \"<table><address></address></table>\",\n         \"<table><address></table>\",\n         \"<ADDRESS />\",\n         \"<ADDRESS></ADDRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_address_formaction\"},\n    {input: \"<address formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<address></address>\",\n         \"<address>\",\n         \"<address/>\",\n         \"<address />\",\n         \"<table><address></address></table>\",\n         \"<table><address></table>\",\n         \"<ADDRESS />\",\n         \"<ADDRESS></ADDRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_address_formmethod\"},\n    {input: \"<address pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<address></address>\",\n         \"<address>\",\n         \"<address/>\",\n         \"<address />\",\n         \"<table><address></address></table>\",\n         \"<table><address></table>\",\n         \"<ADDRESS />\",\n         \"<ADDRESS></ADDRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_address_pattern\"},\n    {input: \"<address icon=\\\"x\\\">\",\n     acceptable: [\n         \"<address></address>\",\n         \"<address>\",\n         \"<address/>\",\n         \"<address />\",\n         \"<table><address></address></table>\",\n         \"<table><address></table>\",\n         \"<ADDRESS />\",\n         \"<ADDRESS></ADDRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_address_icon\"},\n    {input: \"<address select=\\\"x\\\">\",\n     acceptable: [\n         \"<address></address>\",\n         \"<address>\",\n         \"<address/>\",\n         \"<address />\",\n         \"<table><address></address></table>\",\n         \"<table><address></table>\",\n         \"<ADDRESS />\",\n         \"<ADDRESS></ADDRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_address_select\"},\n    {input: \"<p></p>\",\n     acceptable: [\n         \"<p>\",\n         \"<p />\",\n         \"<p></p>\",\n         \"<table><p></p></table>\",\n         \"<P />\",\n         \"<P></P>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_p_plain\"},\n    {input: \"<p><script>alert()</script></p>\",\n     acceptable: [\n         \"<p>\",\n         \"<p />\",\n         \"<p></p>\",\n         \"<table><p></p></table>\",\n         \"<P />\",\n         \"<P></P>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><p><td></td></p></table>\",\n         \"<table><p></p><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_p_scriptinside\"},\n    {input: \"<p media=\\\"x\\\">\",\n     acceptable: [\n         \"<p></p>\",\n         \"<p>\",\n         \"<p/>\",\n         \"<p />\",\n         \"<table><p></p></table>\",\n         \"<table><p></table>\",\n         \"<P />\",\n         \"<P></P>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_p_media\"},\n    {input: \"<p nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<p></p>\",\n         \"<p>\",\n         \"<p/>\",\n         \"<p />\",\n         \"<table><p></p></table>\",\n         \"<table><p></table>\",\n         \"<P />\",\n         \"<P></P>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_p_nonce\"},\n    {input: \"<p srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<p></p>\",\n         \"<p>\",\n         \"<p/>\",\n         \"<p />\",\n         \"<table><p></p></table>\",\n         \"<table><p></table>\",\n         \"<P />\",\n         \"<P></P>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_p_srcset\"},\n    {input: \"<p srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<p></p>\",\n         \"<p>\",\n         \"<p/>\",\n         \"<p />\",\n         \"<table><p></p></table>\",\n         \"<table><p></table>\",\n         \"<P />\",\n         \"<P></P>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_p_srcdoc\"},\n    {input: \"<p poster=\\\"x\\\">\",\n     acceptable: [\n         \"<p></p>\",\n         \"<p>\",\n         \"<p/>\",\n         \"<p />\",\n         \"<table><p></p></table>\",\n         \"<table><p></table>\",\n         \"<P />\",\n         \"<P></P>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_p_poster\"},\n    {input: \"<p autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<p></p>\",\n         \"<p>\",\n         \"<p/>\",\n         \"<p />\",\n         \"<table><p></p></table>\",\n         \"<table><p></table>\",\n         \"<P />\",\n         \"<P></P>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_p_autoplay\"},\n    {input: \"<p controls=\\\"x\\\">\",\n     acceptable: [\n         \"<p></p>\",\n         \"<p>\",\n         \"<p/>\",\n         \"<p />\",\n         \"<table><p></p></table>\",\n         \"<table><p></table>\",\n         \"<P />\",\n         \"<P></P>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_p_controls\"},\n    {input: \"<p formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<p></p>\",\n         \"<p>\",\n         \"<p/>\",\n         \"<p />\",\n         \"<table><p></p></table>\",\n         \"<table><p></table>\",\n         \"<P />\",\n         \"<P></P>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_p_formaction\"},\n    {input: \"<p formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<p></p>\",\n         \"<p>\",\n         \"<p/>\",\n         \"<p />\",\n         \"<table><p></p></table>\",\n         \"<table><p></table>\",\n         \"<P />\",\n         \"<P></P>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_p_formmethod\"},\n    {input: \"<p pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<p></p>\",\n         \"<p>\",\n         \"<p/>\",\n         \"<p />\",\n         \"<table><p></p></table>\",\n         \"<table><p></table>\",\n         \"<P />\",\n         \"<P></P>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_p_pattern\"},\n    {input: \"<p icon=\\\"x\\\">\",\n     acceptable: [\n         \"<p></p>\",\n         \"<p>\",\n         \"<p/>\",\n         \"<p />\",\n         \"<table><p></p></table>\",\n         \"<table><p></table>\",\n         \"<P />\",\n         \"<P></P>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_p_icon\"},\n    {input: \"<p select=\\\"x\\\">\",\n     acceptable: [\n         \"<p></p>\",\n         \"<p>\",\n         \"<p/>\",\n         \"<p />\",\n         \"<table><p></p></table>\",\n         \"<table><p></table>\",\n         \"<P />\",\n         \"<P></P>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_p_select\"},\n    {input: \"<hr></hr>\",\n     acceptable: [\n         \"<hr>\",\n         \"<hr />\",\n         \"<hr/>\",\n         \"<hr><hr>\",\n         \"<hr/><hr/>\",\n         \"<hr /><hr />\",\n         \"<table><hr></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_hr_plain\"},\n    {input: \"<hr><script>alert()</script></hr>\",\n     acceptable: [\n         \"<hr>\",\n         \"<hr />\",\n         \"<hr/>\",\n         \"<hr><hr>\",\n         \"<hr/><hr/>\",\n         \"<hr /><hr />\",\n         \"<table><hr></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><hr><td></td></table>\",\n     ],\n     name: \"contract_hr_scriptinside\"},\n    {input: \"<hr media=\\\"x\\\">\",\n     acceptable: [\n         \"<hr></hr>\",\n         \"<hr>\",\n         \"<hr/>\",\n         \"<hr />\",\n         \"<table><hr></hr></table>\",\n         \"<table><hr></table>\",\n         \"<HR />\",\n         \"<HR></HR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_hr_media\"},\n    {input: \"<hr nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<hr></hr>\",\n         \"<hr>\",\n         \"<hr/>\",\n         \"<hr />\",\n         \"<table><hr></hr></table>\",\n         \"<table><hr></table>\",\n         \"<HR />\",\n         \"<HR></HR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_hr_nonce\"},\n    {input: \"<hr srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<hr></hr>\",\n         \"<hr>\",\n         \"<hr/>\",\n         \"<hr />\",\n         \"<table><hr></hr></table>\",\n         \"<table><hr></table>\",\n         \"<HR />\",\n         \"<HR></HR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_hr_srcset\"},\n    {input: \"<hr srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<hr></hr>\",\n         \"<hr>\",\n         \"<hr/>\",\n         \"<hr />\",\n         \"<table><hr></hr></table>\",\n         \"<table><hr></table>\",\n         \"<HR />\",\n         \"<HR></HR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_hr_srcdoc\"},\n    {input: \"<hr poster=\\\"x\\\">\",\n     acceptable: [\n         \"<hr></hr>\",\n         \"<hr>\",\n         \"<hr/>\",\n         \"<hr />\",\n         \"<table><hr></hr></table>\",\n         \"<table><hr></table>\",\n         \"<HR />\",\n         \"<HR></HR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_hr_poster\"},\n    {input: \"<hr autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<hr></hr>\",\n         \"<hr>\",\n         \"<hr/>\",\n         \"<hr />\",\n         \"<table><hr></hr></table>\",\n         \"<table><hr></table>\",\n         \"<HR />\",\n         \"<HR></HR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_hr_autoplay\"},\n    {input: \"<hr controls=\\\"x\\\">\",\n     acceptable: [\n         \"<hr></hr>\",\n         \"<hr>\",\n         \"<hr/>\",\n         \"<hr />\",\n         \"<table><hr></hr></table>\",\n         \"<table><hr></table>\",\n         \"<HR />\",\n         \"<HR></HR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_hr_controls\"},\n    {input: \"<hr formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<hr></hr>\",\n         \"<hr>\",\n         \"<hr/>\",\n         \"<hr />\",\n         \"<table><hr></hr></table>\",\n         \"<table><hr></table>\",\n         \"<HR />\",\n         \"<HR></HR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_hr_formaction\"},\n    {input: \"<hr formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<hr></hr>\",\n         \"<hr>\",\n         \"<hr/>\",\n         \"<hr />\",\n         \"<table><hr></hr></table>\",\n         \"<table><hr></table>\",\n         \"<HR />\",\n         \"<HR></HR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_hr_formmethod\"},\n    {input: \"<hr pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<hr></hr>\",\n         \"<hr>\",\n         \"<hr/>\",\n         \"<hr />\",\n         \"<table><hr></hr></table>\",\n         \"<table><hr></table>\",\n         \"<HR />\",\n         \"<HR></HR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_hr_pattern\"},\n    {input: \"<hr icon=\\\"x\\\">\",\n     acceptable: [\n         \"<hr></hr>\",\n         \"<hr>\",\n         \"<hr/>\",\n         \"<hr />\",\n         \"<table><hr></hr></table>\",\n         \"<table><hr></table>\",\n         \"<HR />\",\n         \"<HR></HR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_hr_icon\"},\n    {input: \"<hr select=\\\"x\\\">\",\n     acceptable: [\n         \"<hr></hr>\",\n         \"<hr>\",\n         \"<hr/>\",\n         \"<hr />\",\n         \"<table><hr></hr></table>\",\n         \"<table><hr></table>\",\n         \"<HR />\",\n         \"<HR></HR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_hr_select\"},\n    {input: \"<pre></pre>\",\n     acceptable: [\n         \"<pre>\",\n         \"<pre />\",\n         \"<pre></pre>\",\n         \"<table><pre></pre></table>\",\n         \"<PRE />\",\n         \"<PRE></PRE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_pre_plain\"},\n    {input: \"<pre><script>alert()</script></pre>\",\n     acceptable: [\n         \"<pre>\",\n         \"<pre />\",\n         \"<pre></pre>\",\n         \"<table><pre></pre></table>\",\n         \"<PRE />\",\n         \"<PRE></PRE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><pre><td></td></pre></table>\",\n         \"<table><pre></pre><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_pre_scriptinside\"},\n    {input: \"<pre media=\\\"x\\\">\",\n     acceptable: [\n         \"<pre></pre>\",\n         \"<pre>\",\n         \"<pre/>\",\n         \"<pre />\",\n         \"<table><pre></pre></table>\",\n         \"<table><pre></table>\",\n         \"<PRE />\",\n         \"<PRE></PRE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_pre_media\"},\n    {input: \"<pre nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<pre></pre>\",\n         \"<pre>\",\n         \"<pre/>\",\n         \"<pre />\",\n         \"<table><pre></pre></table>\",\n         \"<table><pre></table>\",\n         \"<PRE />\",\n         \"<PRE></PRE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_pre_nonce\"},\n    {input: \"<pre srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<pre></pre>\",\n         \"<pre>\",\n         \"<pre/>\",\n         \"<pre />\",\n         \"<table><pre></pre></table>\",\n         \"<table><pre></table>\",\n         \"<PRE />\",\n         \"<PRE></PRE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_pre_srcset\"},\n    {input: \"<pre srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<pre></pre>\",\n         \"<pre>\",\n         \"<pre/>\",\n         \"<pre />\",\n         \"<table><pre></pre></table>\",\n         \"<table><pre></table>\",\n         \"<PRE />\",\n         \"<PRE></PRE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_pre_srcdoc\"},\n    {input: \"<pre poster=\\\"x\\\">\",\n     acceptable: [\n         \"<pre></pre>\",\n         \"<pre>\",\n         \"<pre/>\",\n         \"<pre />\",\n         \"<table><pre></pre></table>\",\n         \"<table><pre></table>\",\n         \"<PRE />\",\n         \"<PRE></PRE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_pre_poster\"},\n    {input: \"<pre autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<pre></pre>\",\n         \"<pre>\",\n         \"<pre/>\",\n         \"<pre />\",\n         \"<table><pre></pre></table>\",\n         \"<table><pre></table>\",\n         \"<PRE />\",\n         \"<PRE></PRE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_pre_autoplay\"},\n    {input: \"<pre controls=\\\"x\\\">\",\n     acceptable: [\n         \"<pre></pre>\",\n         \"<pre>\",\n         \"<pre/>\",\n         \"<pre />\",\n         \"<table><pre></pre></table>\",\n         \"<table><pre></table>\",\n         \"<PRE />\",\n         \"<PRE></PRE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_pre_controls\"},\n    {input: \"<pre formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<pre></pre>\",\n         \"<pre>\",\n         \"<pre/>\",\n         \"<pre />\",\n         \"<table><pre></pre></table>\",\n         \"<table><pre></table>\",\n         \"<PRE />\",\n         \"<PRE></PRE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_pre_formaction\"},\n    {input: \"<pre formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<pre></pre>\",\n         \"<pre>\",\n         \"<pre/>\",\n         \"<pre />\",\n         \"<table><pre></pre></table>\",\n         \"<table><pre></table>\",\n         \"<PRE />\",\n         \"<PRE></PRE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_pre_formmethod\"},\n    {input: \"<pre pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<pre></pre>\",\n         \"<pre>\",\n         \"<pre/>\",\n         \"<pre />\",\n         \"<table><pre></pre></table>\",\n         \"<table><pre></table>\",\n         \"<PRE />\",\n         \"<PRE></PRE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_pre_pattern\"},\n    {input: \"<pre icon=\\\"x\\\">\",\n     acceptable: [\n         \"<pre></pre>\",\n         \"<pre>\",\n         \"<pre/>\",\n         \"<pre />\",\n         \"<table><pre></pre></table>\",\n         \"<table><pre></table>\",\n         \"<PRE />\",\n         \"<PRE></PRE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_pre_icon\"},\n    {input: \"<pre select=\\\"x\\\">\",\n     acceptable: [\n         \"<pre></pre>\",\n         \"<pre>\",\n         \"<pre/>\",\n         \"<pre />\",\n         \"<table><pre></pre></table>\",\n         \"<table><pre></table>\",\n         \"<PRE />\",\n         \"<PRE></PRE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_pre_select\"},\n    {input: \"<blockquote></blockquote>\",\n     acceptable: [\n         \"<blockquote>\",\n         \"<blockquote />\",\n         \"<blockquote></blockquote>\",\n         \"<table><blockquote></blockquote></table>\",\n         \"<BLOCKQUOTE />\",\n         \"<BLOCKQUOTE></BLOCKQUOTE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_blockquote_plain\"},\n    {input: \"<blockquote><script>alert()</script></blockquote>\",\n     acceptable: [\n         \"<blockquote>\",\n         \"<blockquote />\",\n         \"<blockquote></blockquote>\",\n         \"<table><blockquote></blockquote></table>\",\n         \"<BLOCKQUOTE />\",\n         \"<BLOCKQUOTE></BLOCKQUOTE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><blockquote><td></td></blockquote></table>\",\n         \"<table><blockquote></blockquote><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_blockquote_scriptinside\"},\n    {input: \"<blockquote cite=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<blockquote cite=\\\"about:invalid#zCSafez\\\"></blockquote>\",\n         \"<blockquote cite=\\\"about:invalid#zCSafez\\\">\",\n         \"<blockquote cite=\\\"about:invalid#zGoSafez\\\"></blockquote>\",\n         \"<blockquote cite=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<blockquote cite=\\\"javascript:void(0);\\\"></blockquote>\",\n         \"<blockquote cite=\\\"javascript:void(0);\\\">\",\n         \"<blockquote></blockquote>\",\n         \"<blockquote>\",\n         \"<blockquote/>\",\n         \"<blockquote />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_blockquote_cite\"},\n    {input: \"<blockquote media=\\\"x\\\">\",\n     acceptable: [\n         \"<blockquote></blockquote>\",\n         \"<blockquote>\",\n         \"<blockquote/>\",\n         \"<blockquote />\",\n         \"<table><blockquote></blockquote></table>\",\n         \"<table><blockquote></table>\",\n         \"<BLOCKQUOTE />\",\n         \"<BLOCKQUOTE></BLOCKQUOTE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_blockquote_media\"},\n    {input: \"<blockquote nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<blockquote></blockquote>\",\n         \"<blockquote>\",\n         \"<blockquote/>\",\n         \"<blockquote />\",\n         \"<table><blockquote></blockquote></table>\",\n         \"<table><blockquote></table>\",\n         \"<BLOCKQUOTE />\",\n         \"<BLOCKQUOTE></BLOCKQUOTE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_blockquote_nonce\"},\n    {input: \"<blockquote srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<blockquote></blockquote>\",\n         \"<blockquote>\",\n         \"<blockquote/>\",\n         \"<blockquote />\",\n         \"<table><blockquote></blockquote></table>\",\n         \"<table><blockquote></table>\",\n         \"<BLOCKQUOTE />\",\n         \"<BLOCKQUOTE></BLOCKQUOTE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_blockquote_srcset\"},\n    {input: \"<blockquote srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<blockquote></blockquote>\",\n         \"<blockquote>\",\n         \"<blockquote/>\",\n         \"<blockquote />\",\n         \"<table><blockquote></blockquote></table>\",\n         \"<table><blockquote></table>\",\n         \"<BLOCKQUOTE />\",\n         \"<BLOCKQUOTE></BLOCKQUOTE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_blockquote_srcdoc\"},\n    {input: \"<blockquote poster=\\\"x\\\">\",\n     acceptable: [\n         \"<blockquote></blockquote>\",\n         \"<blockquote>\",\n         \"<blockquote/>\",\n         \"<blockquote />\",\n         \"<table><blockquote></blockquote></table>\",\n         \"<table><blockquote></table>\",\n         \"<BLOCKQUOTE />\",\n         \"<BLOCKQUOTE></BLOCKQUOTE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_blockquote_poster\"},\n    {input: \"<blockquote autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<blockquote></blockquote>\",\n         \"<blockquote>\",\n         \"<blockquote/>\",\n         \"<blockquote />\",\n         \"<table><blockquote></blockquote></table>\",\n         \"<table><blockquote></table>\",\n         \"<BLOCKQUOTE />\",\n         \"<BLOCKQUOTE></BLOCKQUOTE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_blockquote_autoplay\"},\n    {input: \"<blockquote controls=\\\"x\\\">\",\n     acceptable: [\n         \"<blockquote></blockquote>\",\n         \"<blockquote>\",\n         \"<blockquote/>\",\n         \"<blockquote />\",\n         \"<table><blockquote></blockquote></table>\",\n         \"<table><blockquote></table>\",\n         \"<BLOCKQUOTE />\",\n         \"<BLOCKQUOTE></BLOCKQUOTE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_blockquote_controls\"},\n    {input: \"<blockquote formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<blockquote></blockquote>\",\n         \"<blockquote>\",\n         \"<blockquote/>\",\n         \"<blockquote />\",\n         \"<table><blockquote></blockquote></table>\",\n         \"<table><blockquote></table>\",\n         \"<BLOCKQUOTE />\",\n         \"<BLOCKQUOTE></BLOCKQUOTE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_blockquote_formaction\"},\n    {input: \"<blockquote formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<blockquote></blockquote>\",\n         \"<blockquote>\",\n         \"<blockquote/>\",\n         \"<blockquote />\",\n         \"<table><blockquote></blockquote></table>\",\n         \"<table><blockquote></table>\",\n         \"<BLOCKQUOTE />\",\n         \"<BLOCKQUOTE></BLOCKQUOTE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_blockquote_formmethod\"},\n    {input: \"<blockquote pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<blockquote></blockquote>\",\n         \"<blockquote>\",\n         \"<blockquote/>\",\n         \"<blockquote />\",\n         \"<table><blockquote></blockquote></table>\",\n         \"<table><blockquote></table>\",\n         \"<BLOCKQUOTE />\",\n         \"<BLOCKQUOTE></BLOCKQUOTE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_blockquote_pattern\"},\n    {input: \"<blockquote icon=\\\"x\\\">\",\n     acceptable: [\n         \"<blockquote></blockquote>\",\n         \"<blockquote>\",\n         \"<blockquote/>\",\n         \"<blockquote />\",\n         \"<table><blockquote></blockquote></table>\",\n         \"<table><blockquote></table>\",\n         \"<BLOCKQUOTE />\",\n         \"<BLOCKQUOTE></BLOCKQUOTE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_blockquote_icon\"},\n    {input: \"<blockquote select=\\\"x\\\">\",\n     acceptable: [\n         \"<blockquote></blockquote>\",\n         \"<blockquote>\",\n         \"<blockquote/>\",\n         \"<blockquote />\",\n         \"<table><blockquote></blockquote></table>\",\n         \"<table><blockquote></table>\",\n         \"<BLOCKQUOTE />\",\n         \"<BLOCKQUOTE></BLOCKQUOTE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_blockquote_select\"},\n    {input: \"<ol></ol>\",\n     acceptable: [\n         \"<ol>\",\n         \"<ol />\",\n         \"<ol></ol>\",\n         \"<table><ol></ol></table>\",\n         \"<OL />\",\n         \"<OL></OL>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ol_plain\"},\n    {input: \"<ol><script>alert()</script></ol>\",\n     acceptable: [\n         \"<ol>\",\n         \"<ol />\",\n         \"<ol></ol>\",\n         \"<table><ol></ol></table>\",\n         \"<OL />\",\n         \"<OL></OL>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><ol><td></td></ol></table>\",\n         \"<table><ol></ol><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_ol_scriptinside\"},\n    {input: \"<ol media=\\\"x\\\">\",\n     acceptable: [\n         \"<ol></ol>\",\n         \"<ol>\",\n         \"<ol/>\",\n         \"<ol />\",\n         \"<table><ol></ol></table>\",\n         \"<table><ol></table>\",\n         \"<OL />\",\n         \"<OL></OL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ol_media\"},\n    {input: \"<ol nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<ol></ol>\",\n         \"<ol>\",\n         \"<ol/>\",\n         \"<ol />\",\n         \"<table><ol></ol></table>\",\n         \"<table><ol></table>\",\n         \"<OL />\",\n         \"<OL></OL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ol_nonce\"},\n    {input: \"<ol srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<ol></ol>\",\n         \"<ol>\",\n         \"<ol/>\",\n         \"<ol />\",\n         \"<table><ol></ol></table>\",\n         \"<table><ol></table>\",\n         \"<OL />\",\n         \"<OL></OL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ol_srcset\"},\n    {input: \"<ol srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<ol></ol>\",\n         \"<ol>\",\n         \"<ol/>\",\n         \"<ol />\",\n         \"<table><ol></ol></table>\",\n         \"<table><ol></table>\",\n         \"<OL />\",\n         \"<OL></OL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ol_srcdoc\"},\n    {input: \"<ol poster=\\\"x\\\">\",\n     acceptable: [\n         \"<ol></ol>\",\n         \"<ol>\",\n         \"<ol/>\",\n         \"<ol />\",\n         \"<table><ol></ol></table>\",\n         \"<table><ol></table>\",\n         \"<OL />\",\n         \"<OL></OL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ol_poster\"},\n    {input: \"<ol autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<ol></ol>\",\n         \"<ol>\",\n         \"<ol/>\",\n         \"<ol />\",\n         \"<table><ol></ol></table>\",\n         \"<table><ol></table>\",\n         \"<OL />\",\n         \"<OL></OL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ol_autoplay\"},\n    {input: \"<ol controls=\\\"x\\\">\",\n     acceptable: [\n         \"<ol></ol>\",\n         \"<ol>\",\n         \"<ol/>\",\n         \"<ol />\",\n         \"<table><ol></ol></table>\",\n         \"<table><ol></table>\",\n         \"<OL />\",\n         \"<OL></OL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ol_controls\"},\n    {input: \"<ol formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<ol></ol>\",\n         \"<ol>\",\n         \"<ol/>\",\n         \"<ol />\",\n         \"<table><ol></ol></table>\",\n         \"<table><ol></table>\",\n         \"<OL />\",\n         \"<OL></OL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ol_formaction\"},\n    {input: \"<ol formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<ol></ol>\",\n         \"<ol>\",\n         \"<ol/>\",\n         \"<ol />\",\n         \"<table><ol></ol></table>\",\n         \"<table><ol></table>\",\n         \"<OL />\",\n         \"<OL></OL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ol_formmethod\"},\n    {input: \"<ol pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<ol></ol>\",\n         \"<ol>\",\n         \"<ol/>\",\n         \"<ol />\",\n         \"<table><ol></ol></table>\",\n         \"<table><ol></table>\",\n         \"<OL />\",\n         \"<OL></OL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ol_pattern\"},\n    {input: \"<ol icon=\\\"x\\\">\",\n     acceptable: [\n         \"<ol></ol>\",\n         \"<ol>\",\n         \"<ol/>\",\n         \"<ol />\",\n         \"<table><ol></ol></table>\",\n         \"<table><ol></table>\",\n         \"<OL />\",\n         \"<OL></OL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ol_icon\"},\n    {input: \"<ol select=\\\"x\\\">\",\n     acceptable: [\n         \"<ol></ol>\",\n         \"<ol>\",\n         \"<ol/>\",\n         \"<ol />\",\n         \"<table><ol></ol></table>\",\n         \"<table><ol></table>\",\n         \"<OL />\",\n         \"<OL></OL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ol_select\"},\n    {input: \"<ul></ul>\",\n     acceptable: [\n         \"<ul>\",\n         \"<ul />\",\n         \"<ul></ul>\",\n         \"<table><ul></ul></table>\",\n         \"<UL />\",\n         \"<UL></UL>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ul_plain\"},\n    {input: \"<ul><script>alert()</script></ul>\",\n     acceptable: [\n         \"<ul>\",\n         \"<ul />\",\n         \"<ul></ul>\",\n         \"<table><ul></ul></table>\",\n         \"<UL />\",\n         \"<UL></UL>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><ul><td></td></ul></table>\",\n         \"<table><ul></ul><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_ul_scriptinside\"},\n    {input: \"<ul media=\\\"x\\\">\",\n     acceptable: [\n         \"<ul></ul>\",\n         \"<ul>\",\n         \"<ul/>\",\n         \"<ul />\",\n         \"<table><ul></ul></table>\",\n         \"<table><ul></table>\",\n         \"<UL />\",\n         \"<UL></UL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ul_media\"},\n    {input: \"<ul nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<ul></ul>\",\n         \"<ul>\",\n         \"<ul/>\",\n         \"<ul />\",\n         \"<table><ul></ul></table>\",\n         \"<table><ul></table>\",\n         \"<UL />\",\n         \"<UL></UL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ul_nonce\"},\n    {input: \"<ul srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<ul></ul>\",\n         \"<ul>\",\n         \"<ul/>\",\n         \"<ul />\",\n         \"<table><ul></ul></table>\",\n         \"<table><ul></table>\",\n         \"<UL />\",\n         \"<UL></UL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ul_srcset\"},\n    {input: \"<ul srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<ul></ul>\",\n         \"<ul>\",\n         \"<ul/>\",\n         \"<ul />\",\n         \"<table><ul></ul></table>\",\n         \"<table><ul></table>\",\n         \"<UL />\",\n         \"<UL></UL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ul_srcdoc\"},\n    {input: \"<ul poster=\\\"x\\\">\",\n     acceptable: [\n         \"<ul></ul>\",\n         \"<ul>\",\n         \"<ul/>\",\n         \"<ul />\",\n         \"<table><ul></ul></table>\",\n         \"<table><ul></table>\",\n         \"<UL />\",\n         \"<UL></UL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ul_poster\"},\n    {input: \"<ul autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<ul></ul>\",\n         \"<ul>\",\n         \"<ul/>\",\n         \"<ul />\",\n         \"<table><ul></ul></table>\",\n         \"<table><ul></table>\",\n         \"<UL />\",\n         \"<UL></UL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ul_autoplay\"},\n    {input: \"<ul controls=\\\"x\\\">\",\n     acceptable: [\n         \"<ul></ul>\",\n         \"<ul>\",\n         \"<ul/>\",\n         \"<ul />\",\n         \"<table><ul></ul></table>\",\n         \"<table><ul></table>\",\n         \"<UL />\",\n         \"<UL></UL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ul_controls\"},\n    {input: \"<ul formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<ul></ul>\",\n         \"<ul>\",\n         \"<ul/>\",\n         \"<ul />\",\n         \"<table><ul></ul></table>\",\n         \"<table><ul></table>\",\n         \"<UL />\",\n         \"<UL></UL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ul_formaction\"},\n    {input: \"<ul formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<ul></ul>\",\n         \"<ul>\",\n         \"<ul/>\",\n         \"<ul />\",\n         \"<table><ul></ul></table>\",\n         \"<table><ul></table>\",\n         \"<UL />\",\n         \"<UL></UL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ul_formmethod\"},\n    {input: \"<ul pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<ul></ul>\",\n         \"<ul>\",\n         \"<ul/>\",\n         \"<ul />\",\n         \"<table><ul></ul></table>\",\n         \"<table><ul></table>\",\n         \"<UL />\",\n         \"<UL></UL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ul_pattern\"},\n    {input: \"<ul icon=\\\"x\\\">\",\n     acceptable: [\n         \"<ul></ul>\",\n         \"<ul>\",\n         \"<ul/>\",\n         \"<ul />\",\n         \"<table><ul></ul></table>\",\n         \"<table><ul></table>\",\n         \"<UL />\",\n         \"<UL></UL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ul_icon\"},\n    {input: \"<ul select=\\\"x\\\">\",\n     acceptable: [\n         \"<ul></ul>\",\n         \"<ul>\",\n         \"<ul/>\",\n         \"<ul />\",\n         \"<table><ul></ul></table>\",\n         \"<table><ul></table>\",\n         \"<UL />\",\n         \"<UL></UL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ul_select\"},\n    {input: \"<li></li>\",\n     acceptable: [\n         \"<li>\",\n         \"<li />\",\n         \"<li></li>\",\n         \"<table><li></li></table>\",\n         \"<LI />\",\n         \"<LI></LI>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_li_plain\"},\n    {input: \"<li><script>alert()</script></li>\",\n     acceptable: [\n         \"<li>\",\n         \"<li />\",\n         \"<li></li>\",\n         \"<table><li></li></table>\",\n         \"<LI />\",\n         \"<LI></LI>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><li><td></td></li></table>\",\n         \"<table><li></li><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_li_scriptinside\"},\n    {input: \"<li media=\\\"x\\\">\",\n     acceptable: [\n         \"<li></li>\",\n         \"<li>\",\n         \"<li/>\",\n         \"<li />\",\n         \"<table><li></li></table>\",\n         \"<table><li></table>\",\n         \"<LI />\",\n         \"<LI></LI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_li_media\"},\n    {input: \"<li nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<li></li>\",\n         \"<li>\",\n         \"<li/>\",\n         \"<li />\",\n         \"<table><li></li></table>\",\n         \"<table><li></table>\",\n         \"<LI />\",\n         \"<LI></LI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_li_nonce\"},\n    {input: \"<li srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<li></li>\",\n         \"<li>\",\n         \"<li/>\",\n         \"<li />\",\n         \"<table><li></li></table>\",\n         \"<table><li></table>\",\n         \"<LI />\",\n         \"<LI></LI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_li_srcset\"},\n    {input: \"<li srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<li></li>\",\n         \"<li>\",\n         \"<li/>\",\n         \"<li />\",\n         \"<table><li></li></table>\",\n         \"<table><li></table>\",\n         \"<LI />\",\n         \"<LI></LI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_li_srcdoc\"},\n    {input: \"<li poster=\\\"x\\\">\",\n     acceptable: [\n         \"<li></li>\",\n         \"<li>\",\n         \"<li/>\",\n         \"<li />\",\n         \"<table><li></li></table>\",\n         \"<table><li></table>\",\n         \"<LI />\",\n         \"<LI></LI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_li_poster\"},\n    {input: \"<li autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<li></li>\",\n         \"<li>\",\n         \"<li/>\",\n         \"<li />\",\n         \"<table><li></li></table>\",\n         \"<table><li></table>\",\n         \"<LI />\",\n         \"<LI></LI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_li_autoplay\"},\n    {input: \"<li controls=\\\"x\\\">\",\n     acceptable: [\n         \"<li></li>\",\n         \"<li>\",\n         \"<li/>\",\n         \"<li />\",\n         \"<table><li></li></table>\",\n         \"<table><li></table>\",\n         \"<LI />\",\n         \"<LI></LI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_li_controls\"},\n    {input: \"<li formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<li></li>\",\n         \"<li>\",\n         \"<li/>\",\n         \"<li />\",\n         \"<table><li></li></table>\",\n         \"<table><li></table>\",\n         \"<LI />\",\n         \"<LI></LI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_li_formaction\"},\n    {input: \"<li formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<li></li>\",\n         \"<li>\",\n         \"<li/>\",\n         \"<li />\",\n         \"<table><li></li></table>\",\n         \"<table><li></table>\",\n         \"<LI />\",\n         \"<LI></LI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_li_formmethod\"},\n    {input: \"<li pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<li></li>\",\n         \"<li>\",\n         \"<li/>\",\n         \"<li />\",\n         \"<table><li></li></table>\",\n         \"<table><li></table>\",\n         \"<LI />\",\n         \"<LI></LI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_li_pattern\"},\n    {input: \"<li icon=\\\"x\\\">\",\n     acceptable: [\n         \"<li></li>\",\n         \"<li>\",\n         \"<li/>\",\n         \"<li />\",\n         \"<table><li></li></table>\",\n         \"<table><li></table>\",\n         \"<LI />\",\n         \"<LI></LI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_li_icon\"},\n    {input: \"<li select=\\\"x\\\">\",\n     acceptable: [\n         \"<li></li>\",\n         \"<li>\",\n         \"<li/>\",\n         \"<li />\",\n         \"<table><li></li></table>\",\n         \"<table><li></table>\",\n         \"<LI />\",\n         \"<LI></LI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_li_select\"},\n    {input: \"<dl></dl>\",\n     acceptable: [\n         \"<dl>\",\n         \"<dl />\",\n         \"<dl></dl>\",\n         \"<table><dl></dl></table>\",\n         \"<DL />\",\n         \"<DL></DL>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dl_plain\"},\n    {input: \"<dl><script>alert()</script></dl>\",\n     acceptable: [\n         \"<dl>\",\n         \"<dl />\",\n         \"<dl></dl>\",\n         \"<table><dl></dl></table>\",\n         \"<DL />\",\n         \"<DL></DL>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><dl><td></td></dl></table>\",\n         \"<table><dl></dl><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_dl_scriptinside\"},\n    {input: \"<dl media=\\\"x\\\">\",\n     acceptable: [\n         \"<dl></dl>\",\n         \"<dl>\",\n         \"<dl/>\",\n         \"<dl />\",\n         \"<table><dl></dl></table>\",\n         \"<table><dl></table>\",\n         \"<DL />\",\n         \"<DL></DL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dl_media\"},\n    {input: \"<dl nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<dl></dl>\",\n         \"<dl>\",\n         \"<dl/>\",\n         \"<dl />\",\n         \"<table><dl></dl></table>\",\n         \"<table><dl></table>\",\n         \"<DL />\",\n         \"<DL></DL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dl_nonce\"},\n    {input: \"<dl srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<dl></dl>\",\n         \"<dl>\",\n         \"<dl/>\",\n         \"<dl />\",\n         \"<table><dl></dl></table>\",\n         \"<table><dl></table>\",\n         \"<DL />\",\n         \"<DL></DL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dl_srcset\"},\n    {input: \"<dl srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<dl></dl>\",\n         \"<dl>\",\n         \"<dl/>\",\n         \"<dl />\",\n         \"<table><dl></dl></table>\",\n         \"<table><dl></table>\",\n         \"<DL />\",\n         \"<DL></DL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dl_srcdoc\"},\n    {input: \"<dl poster=\\\"x\\\">\",\n     acceptable: [\n         \"<dl></dl>\",\n         \"<dl>\",\n         \"<dl/>\",\n         \"<dl />\",\n         \"<table><dl></dl></table>\",\n         \"<table><dl></table>\",\n         \"<DL />\",\n         \"<DL></DL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dl_poster\"},\n    {input: \"<dl autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<dl></dl>\",\n         \"<dl>\",\n         \"<dl/>\",\n         \"<dl />\",\n         \"<table><dl></dl></table>\",\n         \"<table><dl></table>\",\n         \"<DL />\",\n         \"<DL></DL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dl_autoplay\"},\n    {input: \"<dl controls=\\\"x\\\">\",\n     acceptable: [\n         \"<dl></dl>\",\n         \"<dl>\",\n         \"<dl/>\",\n         \"<dl />\",\n         \"<table><dl></dl></table>\",\n         \"<table><dl></table>\",\n         \"<DL />\",\n         \"<DL></DL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dl_controls\"},\n    {input: \"<dl formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<dl></dl>\",\n         \"<dl>\",\n         \"<dl/>\",\n         \"<dl />\",\n         \"<table><dl></dl></table>\",\n         \"<table><dl></table>\",\n         \"<DL />\",\n         \"<DL></DL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dl_formaction\"},\n    {input: \"<dl formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<dl></dl>\",\n         \"<dl>\",\n         \"<dl/>\",\n         \"<dl />\",\n         \"<table><dl></dl></table>\",\n         \"<table><dl></table>\",\n         \"<DL />\",\n         \"<DL></DL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dl_formmethod\"},\n    {input: \"<dl pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<dl></dl>\",\n         \"<dl>\",\n         \"<dl/>\",\n         \"<dl />\",\n         \"<table><dl></dl></table>\",\n         \"<table><dl></table>\",\n         \"<DL />\",\n         \"<DL></DL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dl_pattern\"},\n    {input: \"<dl icon=\\\"x\\\">\",\n     acceptable: [\n         \"<dl></dl>\",\n         \"<dl>\",\n         \"<dl/>\",\n         \"<dl />\",\n         \"<table><dl></dl></table>\",\n         \"<table><dl></table>\",\n         \"<DL />\",\n         \"<DL></DL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dl_icon\"},\n    {input: \"<dl select=\\\"x\\\">\",\n     acceptable: [\n         \"<dl></dl>\",\n         \"<dl>\",\n         \"<dl/>\",\n         \"<dl />\",\n         \"<table><dl></dl></table>\",\n         \"<table><dl></table>\",\n         \"<DL />\",\n         \"<DL></DL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dl_select\"},\n    {input: \"<dt></dt>\",\n     acceptable: [\n         \"<dt>\",\n         \"<dt />\",\n         \"<dt></dt>\",\n         \"<table><dt></dt></table>\",\n         \"<DT />\",\n         \"<DT></DT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dt_plain\"},\n    {input: \"<dt><script>alert()</script></dt>\",\n     acceptable: [\n         \"<dt>\",\n         \"<dt />\",\n         \"<dt></dt>\",\n         \"<table><dt></dt></table>\",\n         \"<DT />\",\n         \"<DT></DT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><dt><td></td></dt></table>\",\n         \"<table><dt></dt><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_dt_scriptinside\"},\n    {input: \"<dt media=\\\"x\\\">\",\n     acceptable: [\n         \"<dt></dt>\",\n         \"<dt>\",\n         \"<dt/>\",\n         \"<dt />\",\n         \"<table><dt></dt></table>\",\n         \"<table><dt></table>\",\n         \"<DT />\",\n         \"<DT></DT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dt_media\"},\n    {input: \"<dt nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<dt></dt>\",\n         \"<dt>\",\n         \"<dt/>\",\n         \"<dt />\",\n         \"<table><dt></dt></table>\",\n         \"<table><dt></table>\",\n         \"<DT />\",\n         \"<DT></DT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dt_nonce\"},\n    {input: \"<dt srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<dt></dt>\",\n         \"<dt>\",\n         \"<dt/>\",\n         \"<dt />\",\n         \"<table><dt></dt></table>\",\n         \"<table><dt></table>\",\n         \"<DT />\",\n         \"<DT></DT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dt_srcset\"},\n    {input: \"<dt srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<dt></dt>\",\n         \"<dt>\",\n         \"<dt/>\",\n         \"<dt />\",\n         \"<table><dt></dt></table>\",\n         \"<table><dt></table>\",\n         \"<DT />\",\n         \"<DT></DT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dt_srcdoc\"},\n    {input: \"<dt poster=\\\"x\\\">\",\n     acceptable: [\n         \"<dt></dt>\",\n         \"<dt>\",\n         \"<dt/>\",\n         \"<dt />\",\n         \"<table><dt></dt></table>\",\n         \"<table><dt></table>\",\n         \"<DT />\",\n         \"<DT></DT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dt_poster\"},\n    {input: \"<dt autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<dt></dt>\",\n         \"<dt>\",\n         \"<dt/>\",\n         \"<dt />\",\n         \"<table><dt></dt></table>\",\n         \"<table><dt></table>\",\n         \"<DT />\",\n         \"<DT></DT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dt_autoplay\"},\n    {input: \"<dt controls=\\\"x\\\">\",\n     acceptable: [\n         \"<dt></dt>\",\n         \"<dt>\",\n         \"<dt/>\",\n         \"<dt />\",\n         \"<table><dt></dt></table>\",\n         \"<table><dt></table>\",\n         \"<DT />\",\n         \"<DT></DT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dt_controls\"},\n    {input: \"<dt formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<dt></dt>\",\n         \"<dt>\",\n         \"<dt/>\",\n         \"<dt />\",\n         \"<table><dt></dt></table>\",\n         \"<table><dt></table>\",\n         \"<DT />\",\n         \"<DT></DT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dt_formaction\"},\n    {input: \"<dt formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<dt></dt>\",\n         \"<dt>\",\n         \"<dt/>\",\n         \"<dt />\",\n         \"<table><dt></dt></table>\",\n         \"<table><dt></table>\",\n         \"<DT />\",\n         \"<DT></DT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dt_formmethod\"},\n    {input: \"<dt pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<dt></dt>\",\n         \"<dt>\",\n         \"<dt/>\",\n         \"<dt />\",\n         \"<table><dt></dt></table>\",\n         \"<table><dt></table>\",\n         \"<DT />\",\n         \"<DT></DT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dt_pattern\"},\n    {input: \"<dt icon=\\\"x\\\">\",\n     acceptable: [\n         \"<dt></dt>\",\n         \"<dt>\",\n         \"<dt/>\",\n         \"<dt />\",\n         \"<table><dt></dt></table>\",\n         \"<table><dt></table>\",\n         \"<DT />\",\n         \"<DT></DT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dt_icon\"},\n    {input: \"<dt select=\\\"x\\\">\",\n     acceptable: [\n         \"<dt></dt>\",\n         \"<dt>\",\n         \"<dt/>\",\n         \"<dt />\",\n         \"<table><dt></dt></table>\",\n         \"<table><dt></table>\",\n         \"<DT />\",\n         \"<DT></DT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dt_select\"},\n    {input: \"<dd></dd>\",\n     acceptable: [\n         \"<dd>\",\n         \"<dd />\",\n         \"<dd></dd>\",\n         \"<table><dd></dd></table>\",\n         \"<DD />\",\n         \"<DD></DD>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dd_plain\"},\n    {input: \"<dd><script>alert()</script></dd>\",\n     acceptable: [\n         \"<dd>\",\n         \"<dd />\",\n         \"<dd></dd>\",\n         \"<table><dd></dd></table>\",\n         \"<DD />\",\n         \"<DD></DD>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><dd><td></td></dd></table>\",\n         \"<table><dd></dd><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_dd_scriptinside\"},\n    {input: \"<dd media=\\\"x\\\">\",\n     acceptable: [\n         \"<dd></dd>\",\n         \"<dd>\",\n         \"<dd/>\",\n         \"<dd />\",\n         \"<table><dd></dd></table>\",\n         \"<table><dd></table>\",\n         \"<DD />\",\n         \"<DD></DD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dd_media\"},\n    {input: \"<dd nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<dd></dd>\",\n         \"<dd>\",\n         \"<dd/>\",\n         \"<dd />\",\n         \"<table><dd></dd></table>\",\n         \"<table><dd></table>\",\n         \"<DD />\",\n         \"<DD></DD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dd_nonce\"},\n    {input: \"<dd srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<dd></dd>\",\n         \"<dd>\",\n         \"<dd/>\",\n         \"<dd />\",\n         \"<table><dd></dd></table>\",\n         \"<table><dd></table>\",\n         \"<DD />\",\n         \"<DD></DD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dd_srcset\"},\n    {input: \"<dd srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<dd></dd>\",\n         \"<dd>\",\n         \"<dd/>\",\n         \"<dd />\",\n         \"<table><dd></dd></table>\",\n         \"<table><dd></table>\",\n         \"<DD />\",\n         \"<DD></DD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dd_srcdoc\"},\n    {input: \"<dd poster=\\\"x\\\">\",\n     acceptable: [\n         \"<dd></dd>\",\n         \"<dd>\",\n         \"<dd/>\",\n         \"<dd />\",\n         \"<table><dd></dd></table>\",\n         \"<table><dd></table>\",\n         \"<DD />\",\n         \"<DD></DD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dd_poster\"},\n    {input: \"<dd autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<dd></dd>\",\n         \"<dd>\",\n         \"<dd/>\",\n         \"<dd />\",\n         \"<table><dd></dd></table>\",\n         \"<table><dd></table>\",\n         \"<DD />\",\n         \"<DD></DD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dd_autoplay\"},\n    {input: \"<dd controls=\\\"x\\\">\",\n     acceptable: [\n         \"<dd></dd>\",\n         \"<dd>\",\n         \"<dd/>\",\n         \"<dd />\",\n         \"<table><dd></dd></table>\",\n         \"<table><dd></table>\",\n         \"<DD />\",\n         \"<DD></DD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dd_controls\"},\n    {input: \"<dd formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<dd></dd>\",\n         \"<dd>\",\n         \"<dd/>\",\n         \"<dd />\",\n         \"<table><dd></dd></table>\",\n         \"<table><dd></table>\",\n         \"<DD />\",\n         \"<DD></DD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dd_formaction\"},\n    {input: \"<dd formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<dd></dd>\",\n         \"<dd>\",\n         \"<dd/>\",\n         \"<dd />\",\n         \"<table><dd></dd></table>\",\n         \"<table><dd></table>\",\n         \"<DD />\",\n         \"<DD></DD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dd_formmethod\"},\n    {input: \"<dd pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<dd></dd>\",\n         \"<dd>\",\n         \"<dd/>\",\n         \"<dd />\",\n         \"<table><dd></dd></table>\",\n         \"<table><dd></table>\",\n         \"<DD />\",\n         \"<DD></DD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dd_pattern\"},\n    {input: \"<dd icon=\\\"x\\\">\",\n     acceptable: [\n         \"<dd></dd>\",\n         \"<dd>\",\n         \"<dd/>\",\n         \"<dd />\",\n         \"<table><dd></dd></table>\",\n         \"<table><dd></table>\",\n         \"<DD />\",\n         \"<DD></DD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dd_icon\"},\n    {input: \"<dd select=\\\"x\\\">\",\n     acceptable: [\n         \"<dd></dd>\",\n         \"<dd>\",\n         \"<dd/>\",\n         \"<dd />\",\n         \"<table><dd></dd></table>\",\n         \"<table><dd></table>\",\n         \"<DD />\",\n         \"<DD></DD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dd_select\"},\n    {input: \"<figure></figure>\",\n     acceptable: [\n         \"<figure>\",\n         \"<figure />\",\n         \"<figure></figure>\",\n         \"<table><figure></figure></table>\",\n         \"<FIGURE />\",\n         \"<FIGURE></FIGURE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figure_plain\"},\n    {input: \"<figure><script>alert()</script></figure>\",\n     acceptable: [\n         \"<figure>\",\n         \"<figure />\",\n         \"<figure></figure>\",\n         \"<table><figure></figure></table>\",\n         \"<FIGURE />\",\n         \"<FIGURE></FIGURE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><figure><td></td></figure></table>\",\n         \"<table><figure></figure><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_figure_scriptinside\"},\n    {input: \"<figure media=\\\"x\\\">\",\n     acceptable: [\n         \"<figure></figure>\",\n         \"<figure>\",\n         \"<figure/>\",\n         \"<figure />\",\n         \"<table><figure></figure></table>\",\n         \"<table><figure></table>\",\n         \"<FIGURE />\",\n         \"<FIGURE></FIGURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figure_media\"},\n    {input: \"<figure nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<figure></figure>\",\n         \"<figure>\",\n         \"<figure/>\",\n         \"<figure />\",\n         \"<table><figure></figure></table>\",\n         \"<table><figure></table>\",\n         \"<FIGURE />\",\n         \"<FIGURE></FIGURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figure_nonce\"},\n    {input: \"<figure srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<figure></figure>\",\n         \"<figure>\",\n         \"<figure/>\",\n         \"<figure />\",\n         \"<table><figure></figure></table>\",\n         \"<table><figure></table>\",\n         \"<FIGURE />\",\n         \"<FIGURE></FIGURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figure_srcset\"},\n    {input: \"<figure srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<figure></figure>\",\n         \"<figure>\",\n         \"<figure/>\",\n         \"<figure />\",\n         \"<table><figure></figure></table>\",\n         \"<table><figure></table>\",\n         \"<FIGURE />\",\n         \"<FIGURE></FIGURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figure_srcdoc\"},\n    {input: \"<figure poster=\\\"x\\\">\",\n     acceptable: [\n         \"<figure></figure>\",\n         \"<figure>\",\n         \"<figure/>\",\n         \"<figure />\",\n         \"<table><figure></figure></table>\",\n         \"<table><figure></table>\",\n         \"<FIGURE />\",\n         \"<FIGURE></FIGURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figure_poster\"},\n    {input: \"<figure autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<figure></figure>\",\n         \"<figure>\",\n         \"<figure/>\",\n         \"<figure />\",\n         \"<table><figure></figure></table>\",\n         \"<table><figure></table>\",\n         \"<FIGURE />\",\n         \"<FIGURE></FIGURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figure_autoplay\"},\n    {input: \"<figure controls=\\\"x\\\">\",\n     acceptable: [\n         \"<figure></figure>\",\n         \"<figure>\",\n         \"<figure/>\",\n         \"<figure />\",\n         \"<table><figure></figure></table>\",\n         \"<table><figure></table>\",\n         \"<FIGURE />\",\n         \"<FIGURE></FIGURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figure_controls\"},\n    {input: \"<figure formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<figure></figure>\",\n         \"<figure>\",\n         \"<figure/>\",\n         \"<figure />\",\n         \"<table><figure></figure></table>\",\n         \"<table><figure></table>\",\n         \"<FIGURE />\",\n         \"<FIGURE></FIGURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figure_formaction\"},\n    {input: \"<figure formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<figure></figure>\",\n         \"<figure>\",\n         \"<figure/>\",\n         \"<figure />\",\n         \"<table><figure></figure></table>\",\n         \"<table><figure></table>\",\n         \"<FIGURE />\",\n         \"<FIGURE></FIGURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figure_formmethod\"},\n    {input: \"<figure pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<figure></figure>\",\n         \"<figure>\",\n         \"<figure/>\",\n         \"<figure />\",\n         \"<table><figure></figure></table>\",\n         \"<table><figure></table>\",\n         \"<FIGURE />\",\n         \"<FIGURE></FIGURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figure_pattern\"},\n    {input: \"<figure icon=\\\"x\\\">\",\n     acceptable: [\n         \"<figure></figure>\",\n         \"<figure>\",\n         \"<figure/>\",\n         \"<figure />\",\n         \"<table><figure></figure></table>\",\n         \"<table><figure></table>\",\n         \"<FIGURE />\",\n         \"<FIGURE></FIGURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figure_icon\"},\n    {input: \"<figure select=\\\"x\\\">\",\n     acceptable: [\n         \"<figure></figure>\",\n         \"<figure>\",\n         \"<figure/>\",\n         \"<figure />\",\n         \"<table><figure></figure></table>\",\n         \"<table><figure></table>\",\n         \"<FIGURE />\",\n         \"<FIGURE></FIGURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figure_select\"},\n    {input: \"<figcaption></figcaption>\",\n     acceptable: [\n         \"<figcaption>\",\n         \"<figcaption />\",\n         \"<figcaption></figcaption>\",\n         \"<table><figcaption></figcaption></table>\",\n         \"<FIGCAPTION />\",\n         \"<FIGCAPTION></FIGCAPTION>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figcaption_plain\"},\n    {input: \"<figcaption><script>alert()</script></figcaption>\",\n     acceptable: [\n         \"<figcaption>\",\n         \"<figcaption />\",\n         \"<figcaption></figcaption>\",\n         \"<table><figcaption></figcaption></table>\",\n         \"<FIGCAPTION />\",\n         \"<FIGCAPTION></FIGCAPTION>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><figcaption><td></td></figcaption></table>\",\n         \"<table><figcaption></figcaption><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_figcaption_scriptinside\"},\n    {input: \"<figcaption media=\\\"x\\\">\",\n     acceptable: [\n         \"<figcaption></figcaption>\",\n         \"<figcaption>\",\n         \"<figcaption/>\",\n         \"<figcaption />\",\n         \"<table><figcaption></figcaption></table>\",\n         \"<table><figcaption></table>\",\n         \"<FIGCAPTION />\",\n         \"<FIGCAPTION></FIGCAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figcaption_media\"},\n    {input: \"<figcaption nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<figcaption></figcaption>\",\n         \"<figcaption>\",\n         \"<figcaption/>\",\n         \"<figcaption />\",\n         \"<table><figcaption></figcaption></table>\",\n         \"<table><figcaption></table>\",\n         \"<FIGCAPTION />\",\n         \"<FIGCAPTION></FIGCAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figcaption_nonce\"},\n    {input: \"<figcaption srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<figcaption></figcaption>\",\n         \"<figcaption>\",\n         \"<figcaption/>\",\n         \"<figcaption />\",\n         \"<table><figcaption></figcaption></table>\",\n         \"<table><figcaption></table>\",\n         \"<FIGCAPTION />\",\n         \"<FIGCAPTION></FIGCAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figcaption_srcset\"},\n    {input: \"<figcaption srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<figcaption></figcaption>\",\n         \"<figcaption>\",\n         \"<figcaption/>\",\n         \"<figcaption />\",\n         \"<table><figcaption></figcaption></table>\",\n         \"<table><figcaption></table>\",\n         \"<FIGCAPTION />\",\n         \"<FIGCAPTION></FIGCAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figcaption_srcdoc\"},\n    {input: \"<figcaption poster=\\\"x\\\">\",\n     acceptable: [\n         \"<figcaption></figcaption>\",\n         \"<figcaption>\",\n         \"<figcaption/>\",\n         \"<figcaption />\",\n         \"<table><figcaption></figcaption></table>\",\n         \"<table><figcaption></table>\",\n         \"<FIGCAPTION />\",\n         \"<FIGCAPTION></FIGCAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figcaption_poster\"},\n    {input: \"<figcaption autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<figcaption></figcaption>\",\n         \"<figcaption>\",\n         \"<figcaption/>\",\n         \"<figcaption />\",\n         \"<table><figcaption></figcaption></table>\",\n         \"<table><figcaption></table>\",\n         \"<FIGCAPTION />\",\n         \"<FIGCAPTION></FIGCAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figcaption_autoplay\"},\n    {input: \"<figcaption controls=\\\"x\\\">\",\n     acceptable: [\n         \"<figcaption></figcaption>\",\n         \"<figcaption>\",\n         \"<figcaption/>\",\n         \"<figcaption />\",\n         \"<table><figcaption></figcaption></table>\",\n         \"<table><figcaption></table>\",\n         \"<FIGCAPTION />\",\n         \"<FIGCAPTION></FIGCAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figcaption_controls\"},\n    {input: \"<figcaption formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<figcaption></figcaption>\",\n         \"<figcaption>\",\n         \"<figcaption/>\",\n         \"<figcaption />\",\n         \"<table><figcaption></figcaption></table>\",\n         \"<table><figcaption></table>\",\n         \"<FIGCAPTION />\",\n         \"<FIGCAPTION></FIGCAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figcaption_formaction\"},\n    {input: \"<figcaption formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<figcaption></figcaption>\",\n         \"<figcaption>\",\n         \"<figcaption/>\",\n         \"<figcaption />\",\n         \"<table><figcaption></figcaption></table>\",\n         \"<table><figcaption></table>\",\n         \"<FIGCAPTION />\",\n         \"<FIGCAPTION></FIGCAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figcaption_formmethod\"},\n    {input: \"<figcaption pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<figcaption></figcaption>\",\n         \"<figcaption>\",\n         \"<figcaption/>\",\n         \"<figcaption />\",\n         \"<table><figcaption></figcaption></table>\",\n         \"<table><figcaption></table>\",\n         \"<FIGCAPTION />\",\n         \"<FIGCAPTION></FIGCAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figcaption_pattern\"},\n    {input: \"<figcaption icon=\\\"x\\\">\",\n     acceptable: [\n         \"<figcaption></figcaption>\",\n         \"<figcaption>\",\n         \"<figcaption/>\",\n         \"<figcaption />\",\n         \"<table><figcaption></figcaption></table>\",\n         \"<table><figcaption></table>\",\n         \"<FIGCAPTION />\",\n         \"<FIGCAPTION></FIGCAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figcaption_icon\"},\n    {input: \"<figcaption select=\\\"x\\\">\",\n     acceptable: [\n         \"<figcaption></figcaption>\",\n         \"<figcaption>\",\n         \"<figcaption/>\",\n         \"<figcaption />\",\n         \"<table><figcaption></figcaption></table>\",\n         \"<table><figcaption></table>\",\n         \"<FIGCAPTION />\",\n         \"<FIGCAPTION></FIGCAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_figcaption_select\"},\n    {input: \"<main></main>\",\n     acceptable: [\n         \"<main>\",\n         \"<main />\",\n         \"<main></main>\",\n         \"<table><main></main></table>\",\n         \"<MAIN />\",\n         \"<MAIN></MAIN>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_main_plain\"},\n    {input: \"<main><script>alert()</script></main>\",\n     acceptable: [\n         \"<main>\",\n         \"<main />\",\n         \"<main></main>\",\n         \"<table><main></main></table>\",\n         \"<MAIN />\",\n         \"<MAIN></MAIN>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><main><td></td></main></table>\",\n         \"<table><main></main><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_main_scriptinside\"},\n    {input: \"<main media=\\\"x\\\">\",\n     acceptable: [\n         \"<main></main>\",\n         \"<main>\",\n         \"<main/>\",\n         \"<main />\",\n         \"<table><main></main></table>\",\n         \"<table><main></table>\",\n         \"<MAIN />\",\n         \"<MAIN></MAIN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_main_media\"},\n    {input: \"<main nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<main></main>\",\n         \"<main>\",\n         \"<main/>\",\n         \"<main />\",\n         \"<table><main></main></table>\",\n         \"<table><main></table>\",\n         \"<MAIN />\",\n         \"<MAIN></MAIN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_main_nonce\"},\n    {input: \"<main srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<main></main>\",\n         \"<main>\",\n         \"<main/>\",\n         \"<main />\",\n         \"<table><main></main></table>\",\n         \"<table><main></table>\",\n         \"<MAIN />\",\n         \"<MAIN></MAIN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_main_srcset\"},\n    {input: \"<main srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<main></main>\",\n         \"<main>\",\n         \"<main/>\",\n         \"<main />\",\n         \"<table><main></main></table>\",\n         \"<table><main></table>\",\n         \"<MAIN />\",\n         \"<MAIN></MAIN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_main_srcdoc\"},\n    {input: \"<main poster=\\\"x\\\">\",\n     acceptable: [\n         \"<main></main>\",\n         \"<main>\",\n         \"<main/>\",\n         \"<main />\",\n         \"<table><main></main></table>\",\n         \"<table><main></table>\",\n         \"<MAIN />\",\n         \"<MAIN></MAIN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_main_poster\"},\n    {input: \"<main autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<main></main>\",\n         \"<main>\",\n         \"<main/>\",\n         \"<main />\",\n         \"<table><main></main></table>\",\n         \"<table><main></table>\",\n         \"<MAIN />\",\n         \"<MAIN></MAIN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_main_autoplay\"},\n    {input: \"<main controls=\\\"x\\\">\",\n     acceptable: [\n         \"<main></main>\",\n         \"<main>\",\n         \"<main/>\",\n         \"<main />\",\n         \"<table><main></main></table>\",\n         \"<table><main></table>\",\n         \"<MAIN />\",\n         \"<MAIN></MAIN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_main_controls\"},\n    {input: \"<main formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<main></main>\",\n         \"<main>\",\n         \"<main/>\",\n         \"<main />\",\n         \"<table><main></main></table>\",\n         \"<table><main></table>\",\n         \"<MAIN />\",\n         \"<MAIN></MAIN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_main_formaction\"},\n    {input: \"<main formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<main></main>\",\n         \"<main>\",\n         \"<main/>\",\n         \"<main />\",\n         \"<table><main></main></table>\",\n         \"<table><main></table>\",\n         \"<MAIN />\",\n         \"<MAIN></MAIN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_main_formmethod\"},\n    {input: \"<main pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<main></main>\",\n         \"<main>\",\n         \"<main/>\",\n         \"<main />\",\n         \"<table><main></main></table>\",\n         \"<table><main></table>\",\n         \"<MAIN />\",\n         \"<MAIN></MAIN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_main_pattern\"},\n    {input: \"<main icon=\\\"x\\\">\",\n     acceptable: [\n         \"<main></main>\",\n         \"<main>\",\n         \"<main/>\",\n         \"<main />\",\n         \"<table><main></main></table>\",\n         \"<table><main></table>\",\n         \"<MAIN />\",\n         \"<MAIN></MAIN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_main_icon\"},\n    {input: \"<main select=\\\"x\\\">\",\n     acceptable: [\n         \"<main></main>\",\n         \"<main>\",\n         \"<main/>\",\n         \"<main />\",\n         \"<table><main></main></table>\",\n         \"<table><main></table>\",\n         \"<MAIN />\",\n         \"<MAIN></MAIN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_main_select\"},\n    {input: \"<div></div>\",\n     acceptable: [\n         \"<div>\",\n         \"<div />\",\n         \"<div></div>\",\n         \"<table><div></div></table>\",\n         \"<DIV />\",\n         \"<DIV></DIV>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_div_plain\"},\n    {input: \"<div><script>alert()</script></div>\",\n     acceptable: [\n         \"<div>\",\n         \"<div />\",\n         \"<div></div>\",\n         \"<table><div></div></table>\",\n         \"<DIV />\",\n         \"<DIV></DIV>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><div><td></td></div></table>\",\n         \"<table><div></div><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_div_scriptinside\"},\n    {input: \"<div media=\\\"x\\\">\",\n     acceptable: [\n         \"<div></div>\",\n         \"<div>\",\n         \"<div/>\",\n         \"<div />\",\n         \"<table><div></div></table>\",\n         \"<table><div></table>\",\n         \"<DIV />\",\n         \"<DIV></DIV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_div_media\"},\n    {input: \"<div nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<div></div>\",\n         \"<div>\",\n         \"<div/>\",\n         \"<div />\",\n         \"<table><div></div></table>\",\n         \"<table><div></table>\",\n         \"<DIV />\",\n         \"<DIV></DIV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_div_nonce\"},\n    {input: \"<div srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<div></div>\",\n         \"<div>\",\n         \"<div/>\",\n         \"<div />\",\n         \"<table><div></div></table>\",\n         \"<table><div></table>\",\n         \"<DIV />\",\n         \"<DIV></DIV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_div_srcset\"},\n    {input: \"<div srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<div></div>\",\n         \"<div>\",\n         \"<div/>\",\n         \"<div />\",\n         \"<table><div></div></table>\",\n         \"<table><div></table>\",\n         \"<DIV />\",\n         \"<DIV></DIV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_div_srcdoc\"},\n    {input: \"<div poster=\\\"x\\\">\",\n     acceptable: [\n         \"<div></div>\",\n         \"<div>\",\n         \"<div/>\",\n         \"<div />\",\n         \"<table><div></div></table>\",\n         \"<table><div></table>\",\n         \"<DIV />\",\n         \"<DIV></DIV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_div_poster\"},\n    {input: \"<div autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<div></div>\",\n         \"<div>\",\n         \"<div/>\",\n         \"<div />\",\n         \"<table><div></div></table>\",\n         \"<table><div></table>\",\n         \"<DIV />\",\n         \"<DIV></DIV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_div_autoplay\"},\n    {input: \"<div controls=\\\"x\\\">\",\n     acceptable: [\n         \"<div></div>\",\n         \"<div>\",\n         \"<div/>\",\n         \"<div />\",\n         \"<table><div></div></table>\",\n         \"<table><div></table>\",\n         \"<DIV />\",\n         \"<DIV></DIV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_div_controls\"},\n    {input: \"<div formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<div></div>\",\n         \"<div>\",\n         \"<div/>\",\n         \"<div />\",\n         \"<table><div></div></table>\",\n         \"<table><div></table>\",\n         \"<DIV />\",\n         \"<DIV></DIV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_div_formaction\"},\n    {input: \"<div formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<div></div>\",\n         \"<div>\",\n         \"<div/>\",\n         \"<div />\",\n         \"<table><div></div></table>\",\n         \"<table><div></table>\",\n         \"<DIV />\",\n         \"<DIV></DIV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_div_formmethod\"},\n    {input: \"<div pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<div></div>\",\n         \"<div>\",\n         \"<div/>\",\n         \"<div />\",\n         \"<table><div></div></table>\",\n         \"<table><div></table>\",\n         \"<DIV />\",\n         \"<DIV></DIV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_div_pattern\"},\n    {input: \"<div icon=\\\"x\\\">\",\n     acceptable: [\n         \"<div></div>\",\n         \"<div>\",\n         \"<div/>\",\n         \"<div />\",\n         \"<table><div></div></table>\",\n         \"<table><div></table>\",\n         \"<DIV />\",\n         \"<DIV></DIV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_div_icon\"},\n    {input: \"<div select=\\\"x\\\">\",\n     acceptable: [\n         \"<div></div>\",\n         \"<div>\",\n         \"<div/>\",\n         \"<div />\",\n         \"<table><div></div></table>\",\n         \"<table><div></table>\",\n         \"<DIV />\",\n         \"<DIV></DIV>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_div_select\"},\n    {input: \"<a></a>\",\n     acceptable: [\n         \"<a>\",\n         \"<a />\",\n         \"<a></a>\",\n         \"<table><a></a></table>\",\n         \"<A />\",\n         \"<A></A>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_a_plain\"},\n    {input: \"<a><script>alert()</script></a>\",\n     acceptable: [\n         \"<a>\",\n         \"<a />\",\n         \"<a></a>\",\n         \"<table><a></a></table>\",\n         \"<A />\",\n         \"<A></A>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><a><td></td></a></table>\",\n         \"<table><a></a><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_a_scriptinside\"},\n    {input: \"<a href=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<a href=\\\"about:invalid#zCSafez\\\"></a>\",\n         \"<a href=\\\"about:invalid#zCSafez\\\">\",\n         \"<a href=\\\"about:invalid#zGoSafez\\\"></a>\",\n         \"<a href=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<a href=\\\"javascript:void(0);\\\"></a>\",\n         \"<a href=\\\"javascript:void(0);\\\">\",\n         \"<a></a>\",\n         \"<a>\",\n         \"<a/>\",\n         \"<a />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_a_href\"},\n    {input: \"<a media=\\\"x\\\">\",\n     acceptable: [\n         \"<a></a>\",\n         \"<a>\",\n         \"<a/>\",\n         \"<a />\",\n         \"<table><a></a></table>\",\n         \"<table><a></table>\",\n         \"<A />\",\n         \"<A></A>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_a_media\"},\n    {input: \"<a nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<a></a>\",\n         \"<a>\",\n         \"<a/>\",\n         \"<a />\",\n         \"<table><a></a></table>\",\n         \"<table><a></table>\",\n         \"<A />\",\n         \"<A></A>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_a_nonce\"},\n    {input: \"<a srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<a></a>\",\n         \"<a>\",\n         \"<a/>\",\n         \"<a />\",\n         \"<table><a></a></table>\",\n         \"<table><a></table>\",\n         \"<A />\",\n         \"<A></A>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_a_srcset\"},\n    {input: \"<a srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<a></a>\",\n         \"<a>\",\n         \"<a/>\",\n         \"<a />\",\n         \"<table><a></a></table>\",\n         \"<table><a></table>\",\n         \"<A />\",\n         \"<A></A>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_a_srcdoc\"},\n    {input: \"<a poster=\\\"x\\\">\",\n     acceptable: [\n         \"<a></a>\",\n         \"<a>\",\n         \"<a/>\",\n         \"<a />\",\n         \"<table><a></a></table>\",\n         \"<table><a></table>\",\n         \"<A />\",\n         \"<A></A>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_a_poster\"},\n    {input: \"<a autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<a></a>\",\n         \"<a>\",\n         \"<a/>\",\n         \"<a />\",\n         \"<table><a></a></table>\",\n         \"<table><a></table>\",\n         \"<A />\",\n         \"<A></A>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_a_autoplay\"},\n    {input: \"<a controls=\\\"x\\\">\",\n     acceptable: [\n         \"<a></a>\",\n         \"<a>\",\n         \"<a/>\",\n         \"<a />\",\n         \"<table><a></a></table>\",\n         \"<table><a></table>\",\n         \"<A />\",\n         \"<A></A>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_a_controls\"},\n    {input: \"<a formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<a></a>\",\n         \"<a>\",\n         \"<a/>\",\n         \"<a />\",\n         \"<table><a></a></table>\",\n         \"<table><a></table>\",\n         \"<A />\",\n         \"<A></A>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_a_formaction\"},\n    {input: \"<a formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<a></a>\",\n         \"<a>\",\n         \"<a/>\",\n         \"<a />\",\n         \"<table><a></a></table>\",\n         \"<table><a></table>\",\n         \"<A />\",\n         \"<A></A>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_a_formmethod\"},\n    {input: \"<a pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<a></a>\",\n         \"<a>\",\n         \"<a/>\",\n         \"<a />\",\n         \"<table><a></a></table>\",\n         \"<table><a></table>\",\n         \"<A />\",\n         \"<A></A>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_a_pattern\"},\n    {input: \"<a icon=\\\"x\\\">\",\n     acceptable: [\n         \"<a></a>\",\n         \"<a>\",\n         \"<a/>\",\n         \"<a />\",\n         \"<table><a></a></table>\",\n         \"<table><a></table>\",\n         \"<A />\",\n         \"<A></A>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_a_icon\"},\n    {input: \"<a select=\\\"x\\\">\",\n     acceptable: [\n         \"<a></a>\",\n         \"<a>\",\n         \"<a/>\",\n         \"<a />\",\n         \"<table><a></a></table>\",\n         \"<table><a></table>\",\n         \"<A />\",\n         \"<A></A>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_a_select\"},\n    {input: \"<area></area>\",\n     acceptable: [\n         \"<area>\",\n         \"<area />\",\n         \"<area/>\",\n         \"<area><area>\",\n         \"<area/><area/>\",\n         \"<area /><area />\",\n         \"<table><area></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_area_plain\"},\n    {input: \"<area><script>alert()</script></area>\",\n     acceptable: [\n         \"<area>\",\n         \"<area />\",\n         \"<area/>\",\n         \"<area><area>\",\n         \"<area/><area/>\",\n         \"<area /><area />\",\n         \"<table><area></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><area><td></td></table>\",\n     ],\n     name: \"contract_area_scriptinside\"},\n    {input: \"<area href=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<area href=\\\"about:invalid#zCSafez\\\"></area>\",\n         \"<area href=\\\"about:invalid#zCSafez\\\">\",\n         \"<area href=\\\"about:invalid#zGoSafez\\\"></area>\",\n         \"<area href=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<area href=\\\"javascript:void(0);\\\"></area>\",\n         \"<area href=\\\"javascript:void(0);\\\">\",\n         \"<area></area>\",\n         \"<area>\",\n         \"<area/>\",\n         \"<area />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_area_href\"},\n    {input: \"<area media=\\\"x\\\">\",\n     acceptable: [\n         \"<area></area>\",\n         \"<area>\",\n         \"<area/>\",\n         \"<area />\",\n         \"<table><area></area></table>\",\n         \"<table><area></table>\",\n         \"<AREA />\",\n         \"<AREA></AREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_area_media\"},\n    {input: \"<area nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<area></area>\",\n         \"<area>\",\n         \"<area/>\",\n         \"<area />\",\n         \"<table><area></area></table>\",\n         \"<table><area></table>\",\n         \"<AREA />\",\n         \"<AREA></AREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_area_nonce\"},\n    {input: \"<area srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<area></area>\",\n         \"<area>\",\n         \"<area/>\",\n         \"<area />\",\n         \"<table><area></area></table>\",\n         \"<table><area></table>\",\n         \"<AREA />\",\n         \"<AREA></AREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_area_srcset\"},\n    {input: \"<area srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<area></area>\",\n         \"<area>\",\n         \"<area/>\",\n         \"<area />\",\n         \"<table><area></area></table>\",\n         \"<table><area></table>\",\n         \"<AREA />\",\n         \"<AREA></AREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_area_srcdoc\"},\n    {input: \"<area poster=\\\"x\\\">\",\n     acceptable: [\n         \"<area></area>\",\n         \"<area>\",\n         \"<area/>\",\n         \"<area />\",\n         \"<table><area></area></table>\",\n         \"<table><area></table>\",\n         \"<AREA />\",\n         \"<AREA></AREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_area_poster\"},\n    {input: \"<area autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<area></area>\",\n         \"<area>\",\n         \"<area/>\",\n         \"<area />\",\n         \"<table><area></area></table>\",\n         \"<table><area></table>\",\n         \"<AREA />\",\n         \"<AREA></AREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_area_autoplay\"},\n    {input: \"<area controls=\\\"x\\\">\",\n     acceptable: [\n         \"<area></area>\",\n         \"<area>\",\n         \"<area/>\",\n         \"<area />\",\n         \"<table><area></area></table>\",\n         \"<table><area></table>\",\n         \"<AREA />\",\n         \"<AREA></AREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_area_controls\"},\n    {input: \"<area formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<area></area>\",\n         \"<area>\",\n         \"<area/>\",\n         \"<area />\",\n         \"<table><area></area></table>\",\n         \"<table><area></table>\",\n         \"<AREA />\",\n         \"<AREA></AREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_area_formaction\"},\n    {input: \"<area formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<area></area>\",\n         \"<area>\",\n         \"<area/>\",\n         \"<area />\",\n         \"<table><area></area></table>\",\n         \"<table><area></table>\",\n         \"<AREA />\",\n         \"<AREA></AREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_area_formmethod\"},\n    {input: \"<area pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<area></area>\",\n         \"<area>\",\n         \"<area/>\",\n         \"<area />\",\n         \"<table><area></area></table>\",\n         \"<table><area></table>\",\n         \"<AREA />\",\n         \"<AREA></AREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_area_pattern\"},\n    {input: \"<area icon=\\\"x\\\">\",\n     acceptable: [\n         \"<area></area>\",\n         \"<area>\",\n         \"<area/>\",\n         \"<area />\",\n         \"<table><area></area></table>\",\n         \"<table><area></table>\",\n         \"<AREA />\",\n         \"<AREA></AREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_area_icon\"},\n    {input: \"<area select=\\\"x\\\">\",\n     acceptable: [\n         \"<area></area>\",\n         \"<area>\",\n         \"<area/>\",\n         \"<area />\",\n         \"<table><area></area></table>\",\n         \"<table><area></table>\",\n         \"<AREA />\",\n         \"<AREA></AREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_area_select\"},\n    {input: \"<em></em>\",\n     acceptable: [\n         \"<em>\",\n         \"<em />\",\n         \"<em></em>\",\n         \"<table><em></em></table>\",\n         \"<EM />\",\n         \"<EM></EM>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_em_plain\"},\n    {input: \"<em><script>alert()</script></em>\",\n     acceptable: [\n         \"<em>\",\n         \"<em />\",\n         \"<em></em>\",\n         \"<table><em></em></table>\",\n         \"<EM />\",\n         \"<EM></EM>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><em><td></td></em></table>\",\n         \"<table><em></em><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_em_scriptinside\"},\n    {input: \"<em media=\\\"x\\\">\",\n     acceptable: [\n         \"<em></em>\",\n         \"<em>\",\n         \"<em/>\",\n         \"<em />\",\n         \"<table><em></em></table>\",\n         \"<table><em></table>\",\n         \"<EM />\",\n         \"<EM></EM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_em_media\"},\n    {input: \"<em nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<em></em>\",\n         \"<em>\",\n         \"<em/>\",\n         \"<em />\",\n         \"<table><em></em></table>\",\n         \"<table><em></table>\",\n         \"<EM />\",\n         \"<EM></EM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_em_nonce\"},\n    {input: \"<em srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<em></em>\",\n         \"<em>\",\n         \"<em/>\",\n         \"<em />\",\n         \"<table><em></em></table>\",\n         \"<table><em></table>\",\n         \"<EM />\",\n         \"<EM></EM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_em_srcset\"},\n    {input: \"<em srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<em></em>\",\n         \"<em>\",\n         \"<em/>\",\n         \"<em />\",\n         \"<table><em></em></table>\",\n         \"<table><em></table>\",\n         \"<EM />\",\n         \"<EM></EM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_em_srcdoc\"},\n    {input: \"<em poster=\\\"x\\\">\",\n     acceptable: [\n         \"<em></em>\",\n         \"<em>\",\n         \"<em/>\",\n         \"<em />\",\n         \"<table><em></em></table>\",\n         \"<table><em></table>\",\n         \"<EM />\",\n         \"<EM></EM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_em_poster\"},\n    {input: \"<em autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<em></em>\",\n         \"<em>\",\n         \"<em/>\",\n         \"<em />\",\n         \"<table><em></em></table>\",\n         \"<table><em></table>\",\n         \"<EM />\",\n         \"<EM></EM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_em_autoplay\"},\n    {input: \"<em controls=\\\"x\\\">\",\n     acceptable: [\n         \"<em></em>\",\n         \"<em>\",\n         \"<em/>\",\n         \"<em />\",\n         \"<table><em></em></table>\",\n         \"<table><em></table>\",\n         \"<EM />\",\n         \"<EM></EM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_em_controls\"},\n    {input: \"<em formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<em></em>\",\n         \"<em>\",\n         \"<em/>\",\n         \"<em />\",\n         \"<table><em></em></table>\",\n         \"<table><em></table>\",\n         \"<EM />\",\n         \"<EM></EM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_em_formaction\"},\n    {input: \"<em formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<em></em>\",\n         \"<em>\",\n         \"<em/>\",\n         \"<em />\",\n         \"<table><em></em></table>\",\n         \"<table><em></table>\",\n         \"<EM />\",\n         \"<EM></EM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_em_formmethod\"},\n    {input: \"<em pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<em></em>\",\n         \"<em>\",\n         \"<em/>\",\n         \"<em />\",\n         \"<table><em></em></table>\",\n         \"<table><em></table>\",\n         \"<EM />\",\n         \"<EM></EM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_em_pattern\"},\n    {input: \"<em icon=\\\"x\\\">\",\n     acceptable: [\n         \"<em></em>\",\n         \"<em>\",\n         \"<em/>\",\n         \"<em />\",\n         \"<table><em></em></table>\",\n         \"<table><em></table>\",\n         \"<EM />\",\n         \"<EM></EM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_em_icon\"},\n    {input: \"<em select=\\\"x\\\">\",\n     acceptable: [\n         \"<em></em>\",\n         \"<em>\",\n         \"<em/>\",\n         \"<em />\",\n         \"<table><em></em></table>\",\n         \"<table><em></table>\",\n         \"<EM />\",\n         \"<EM></EM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_em_select\"},\n    {input: \"<strong></strong>\",\n     acceptable: [\n         \"<strong>\",\n         \"<strong />\",\n         \"<strong></strong>\",\n         \"<table><strong></strong></table>\",\n         \"<STRONG />\",\n         \"<STRONG></STRONG>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_strong_plain\"},\n    {input: \"<strong><script>alert()</script></strong>\",\n     acceptable: [\n         \"<strong>\",\n         \"<strong />\",\n         \"<strong></strong>\",\n         \"<table><strong></strong></table>\",\n         \"<STRONG />\",\n         \"<STRONG></STRONG>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><strong><td></td></strong></table>\",\n         \"<table><strong></strong><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_strong_scriptinside\"},\n    {input: \"<strong media=\\\"x\\\">\",\n     acceptable: [\n         \"<strong></strong>\",\n         \"<strong>\",\n         \"<strong/>\",\n         \"<strong />\",\n         \"<table><strong></strong></table>\",\n         \"<table><strong></table>\",\n         \"<STRONG />\",\n         \"<STRONG></STRONG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_strong_media\"},\n    {input: \"<strong nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<strong></strong>\",\n         \"<strong>\",\n         \"<strong/>\",\n         \"<strong />\",\n         \"<table><strong></strong></table>\",\n         \"<table><strong></table>\",\n         \"<STRONG />\",\n         \"<STRONG></STRONG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_strong_nonce\"},\n    {input: \"<strong srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<strong></strong>\",\n         \"<strong>\",\n         \"<strong/>\",\n         \"<strong />\",\n         \"<table><strong></strong></table>\",\n         \"<table><strong></table>\",\n         \"<STRONG />\",\n         \"<STRONG></STRONG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_strong_srcset\"},\n    {input: \"<strong srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<strong></strong>\",\n         \"<strong>\",\n         \"<strong/>\",\n         \"<strong />\",\n         \"<table><strong></strong></table>\",\n         \"<table><strong></table>\",\n         \"<STRONG />\",\n         \"<STRONG></STRONG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_strong_srcdoc\"},\n    {input: \"<strong poster=\\\"x\\\">\",\n     acceptable: [\n         \"<strong></strong>\",\n         \"<strong>\",\n         \"<strong/>\",\n         \"<strong />\",\n         \"<table><strong></strong></table>\",\n         \"<table><strong></table>\",\n         \"<STRONG />\",\n         \"<STRONG></STRONG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_strong_poster\"},\n    {input: \"<strong autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<strong></strong>\",\n         \"<strong>\",\n         \"<strong/>\",\n         \"<strong />\",\n         \"<table><strong></strong></table>\",\n         \"<table><strong></table>\",\n         \"<STRONG />\",\n         \"<STRONG></STRONG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_strong_autoplay\"},\n    {input: \"<strong controls=\\\"x\\\">\",\n     acceptable: [\n         \"<strong></strong>\",\n         \"<strong>\",\n         \"<strong/>\",\n         \"<strong />\",\n         \"<table><strong></strong></table>\",\n         \"<table><strong></table>\",\n         \"<STRONG />\",\n         \"<STRONG></STRONG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_strong_controls\"},\n    {input: \"<strong formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<strong></strong>\",\n         \"<strong>\",\n         \"<strong/>\",\n         \"<strong />\",\n         \"<table><strong></strong></table>\",\n         \"<table><strong></table>\",\n         \"<STRONG />\",\n         \"<STRONG></STRONG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_strong_formaction\"},\n    {input: \"<strong formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<strong></strong>\",\n         \"<strong>\",\n         \"<strong/>\",\n         \"<strong />\",\n         \"<table><strong></strong></table>\",\n         \"<table><strong></table>\",\n         \"<STRONG />\",\n         \"<STRONG></STRONG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_strong_formmethod\"},\n    {input: \"<strong pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<strong></strong>\",\n         \"<strong>\",\n         \"<strong/>\",\n         \"<strong />\",\n         \"<table><strong></strong></table>\",\n         \"<table><strong></table>\",\n         \"<STRONG />\",\n         \"<STRONG></STRONG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_strong_pattern\"},\n    {input: \"<strong icon=\\\"x\\\">\",\n     acceptable: [\n         \"<strong></strong>\",\n         \"<strong>\",\n         \"<strong/>\",\n         \"<strong />\",\n         \"<table><strong></strong></table>\",\n         \"<table><strong></table>\",\n         \"<STRONG />\",\n         \"<STRONG></STRONG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_strong_icon\"},\n    {input: \"<strong select=\\\"x\\\">\",\n     acceptable: [\n         \"<strong></strong>\",\n         \"<strong>\",\n         \"<strong/>\",\n         \"<strong />\",\n         \"<table><strong></strong></table>\",\n         \"<table><strong></table>\",\n         \"<STRONG />\",\n         \"<STRONG></STRONG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_strong_select\"},\n    {input: \"<small></small>\",\n     acceptable: [\n         \"<small>\",\n         \"<small />\",\n         \"<small></small>\",\n         \"<table><small></small></table>\",\n         \"<SMALL />\",\n         \"<SMALL></SMALL>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_small_plain\"},\n    {input: \"<small><script>alert()</script></small>\",\n     acceptable: [\n         \"<small>\",\n         \"<small />\",\n         \"<small></small>\",\n         \"<table><small></small></table>\",\n         \"<SMALL />\",\n         \"<SMALL></SMALL>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><small><td></td></small></table>\",\n         \"<table><small></small><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_small_scriptinside\"},\n    {input: \"<small media=\\\"x\\\">\",\n     acceptable: [\n         \"<small></small>\",\n         \"<small>\",\n         \"<small/>\",\n         \"<small />\",\n         \"<table><small></small></table>\",\n         \"<table><small></table>\",\n         \"<SMALL />\",\n         \"<SMALL></SMALL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_small_media\"},\n    {input: \"<small nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<small></small>\",\n         \"<small>\",\n         \"<small/>\",\n         \"<small />\",\n         \"<table><small></small></table>\",\n         \"<table><small></table>\",\n         \"<SMALL />\",\n         \"<SMALL></SMALL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_small_nonce\"},\n    {input: \"<small srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<small></small>\",\n         \"<small>\",\n         \"<small/>\",\n         \"<small />\",\n         \"<table><small></small></table>\",\n         \"<table><small></table>\",\n         \"<SMALL />\",\n         \"<SMALL></SMALL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_small_srcset\"},\n    {input: \"<small srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<small></small>\",\n         \"<small>\",\n         \"<small/>\",\n         \"<small />\",\n         \"<table><small></small></table>\",\n         \"<table><small></table>\",\n         \"<SMALL />\",\n         \"<SMALL></SMALL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_small_srcdoc\"},\n    {input: \"<small poster=\\\"x\\\">\",\n     acceptable: [\n         \"<small></small>\",\n         \"<small>\",\n         \"<small/>\",\n         \"<small />\",\n         \"<table><small></small></table>\",\n         \"<table><small></table>\",\n         \"<SMALL />\",\n         \"<SMALL></SMALL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_small_poster\"},\n    {input: \"<small autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<small></small>\",\n         \"<small>\",\n         \"<small/>\",\n         \"<small />\",\n         \"<table><small></small></table>\",\n         \"<table><small></table>\",\n         \"<SMALL />\",\n         \"<SMALL></SMALL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_small_autoplay\"},\n    {input: \"<small controls=\\\"x\\\">\",\n     acceptable: [\n         \"<small></small>\",\n         \"<small>\",\n         \"<small/>\",\n         \"<small />\",\n         \"<table><small></small></table>\",\n         \"<table><small></table>\",\n         \"<SMALL />\",\n         \"<SMALL></SMALL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_small_controls\"},\n    {input: \"<small formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<small></small>\",\n         \"<small>\",\n         \"<small/>\",\n         \"<small />\",\n         \"<table><small></small></table>\",\n         \"<table><small></table>\",\n         \"<SMALL />\",\n         \"<SMALL></SMALL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_small_formaction\"},\n    {input: \"<small formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<small></small>\",\n         \"<small>\",\n         \"<small/>\",\n         \"<small />\",\n         \"<table><small></small></table>\",\n         \"<table><small></table>\",\n         \"<SMALL />\",\n         \"<SMALL></SMALL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_small_formmethod\"},\n    {input: \"<small pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<small></small>\",\n         \"<small>\",\n         \"<small/>\",\n         \"<small />\",\n         \"<table><small></small></table>\",\n         \"<table><small></table>\",\n         \"<SMALL />\",\n         \"<SMALL></SMALL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_small_pattern\"},\n    {input: \"<small icon=\\\"x\\\">\",\n     acceptable: [\n         \"<small></small>\",\n         \"<small>\",\n         \"<small/>\",\n         \"<small />\",\n         \"<table><small></small></table>\",\n         \"<table><small></table>\",\n         \"<SMALL />\",\n         \"<SMALL></SMALL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_small_icon\"},\n    {input: \"<small select=\\\"x\\\">\",\n     acceptable: [\n         \"<small></small>\",\n         \"<small>\",\n         \"<small/>\",\n         \"<small />\",\n         \"<table><small></small></table>\",\n         \"<table><small></table>\",\n         \"<SMALL />\",\n         \"<SMALL></SMALL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_small_select\"},\n    {input: \"<s></s>\",\n     acceptable: [\n         \"<s>\",\n         \"<s />\",\n         \"<s></s>\",\n         \"<table><s></s></table>\",\n         \"<S />\",\n         \"<S></S>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_s_plain\"},\n    {input: \"<s><script>alert()</script></s>\",\n     acceptable: [\n         \"<s>\",\n         \"<s />\",\n         \"<s></s>\",\n         \"<table><s></s></table>\",\n         \"<S />\",\n         \"<S></S>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><s><td></td></s></table>\",\n         \"<table><s></s><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_s_scriptinside\"},\n    {input: \"<s media=\\\"x\\\">\",\n     acceptable: [\n         \"<s></s>\",\n         \"<s>\",\n         \"<s/>\",\n         \"<s />\",\n         \"<table><s></s></table>\",\n         \"<table><s></table>\",\n         \"<S />\",\n         \"<S></S>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_s_media\"},\n    {input: \"<s nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<s></s>\",\n         \"<s>\",\n         \"<s/>\",\n         \"<s />\",\n         \"<table><s></s></table>\",\n         \"<table><s></table>\",\n         \"<S />\",\n         \"<S></S>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_s_nonce\"},\n    {input: \"<s srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<s></s>\",\n         \"<s>\",\n         \"<s/>\",\n         \"<s />\",\n         \"<table><s></s></table>\",\n         \"<table><s></table>\",\n         \"<S />\",\n         \"<S></S>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_s_srcset\"},\n    {input: \"<s srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<s></s>\",\n         \"<s>\",\n         \"<s/>\",\n         \"<s />\",\n         \"<table><s></s></table>\",\n         \"<table><s></table>\",\n         \"<S />\",\n         \"<S></S>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_s_srcdoc\"},\n    {input: \"<s poster=\\\"x\\\">\",\n     acceptable: [\n         \"<s></s>\",\n         \"<s>\",\n         \"<s/>\",\n         \"<s />\",\n         \"<table><s></s></table>\",\n         \"<table><s></table>\",\n         \"<S />\",\n         \"<S></S>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_s_poster\"},\n    {input: \"<s autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<s></s>\",\n         \"<s>\",\n         \"<s/>\",\n         \"<s />\",\n         \"<table><s></s></table>\",\n         \"<table><s></table>\",\n         \"<S />\",\n         \"<S></S>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_s_autoplay\"},\n    {input: \"<s controls=\\\"x\\\">\",\n     acceptable: [\n         \"<s></s>\",\n         \"<s>\",\n         \"<s/>\",\n         \"<s />\",\n         \"<table><s></s></table>\",\n         \"<table><s></table>\",\n         \"<S />\",\n         \"<S></S>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_s_controls\"},\n    {input: \"<s formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<s></s>\",\n         \"<s>\",\n         \"<s/>\",\n         \"<s />\",\n         \"<table><s></s></table>\",\n         \"<table><s></table>\",\n         \"<S />\",\n         \"<S></S>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_s_formaction\"},\n    {input: \"<s formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<s></s>\",\n         \"<s>\",\n         \"<s/>\",\n         \"<s />\",\n         \"<table><s></s></table>\",\n         \"<table><s></table>\",\n         \"<S />\",\n         \"<S></S>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_s_formmethod\"},\n    {input: \"<s pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<s></s>\",\n         \"<s>\",\n         \"<s/>\",\n         \"<s />\",\n         \"<table><s></s></table>\",\n         \"<table><s></table>\",\n         \"<S />\",\n         \"<S></S>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_s_pattern\"},\n    {input: \"<s icon=\\\"x\\\">\",\n     acceptable: [\n         \"<s></s>\",\n         \"<s>\",\n         \"<s/>\",\n         \"<s />\",\n         \"<table><s></s></table>\",\n         \"<table><s></table>\",\n         \"<S />\",\n         \"<S></S>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_s_icon\"},\n    {input: \"<s select=\\\"x\\\">\",\n     acceptable: [\n         \"<s></s>\",\n         \"<s>\",\n         \"<s/>\",\n         \"<s />\",\n         \"<table><s></s></table>\",\n         \"<table><s></table>\",\n         \"<S />\",\n         \"<S></S>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_s_select\"},\n    {input: \"<cite></cite>\",\n     acceptable: [\n         \"<cite>\",\n         \"<cite />\",\n         \"<cite></cite>\",\n         \"<table><cite></cite></table>\",\n         \"<CITE />\",\n         \"<CITE></CITE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_cite_plain\"},\n    {input: \"<cite><script>alert()</script></cite>\",\n     acceptable: [\n         \"<cite>\",\n         \"<cite />\",\n         \"<cite></cite>\",\n         \"<table><cite></cite></table>\",\n         \"<CITE />\",\n         \"<CITE></CITE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><cite><td></td></cite></table>\",\n         \"<table><cite></cite><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_cite_scriptinside\"},\n    {input: \"<cite media=\\\"x\\\">\",\n     acceptable: [\n         \"<cite></cite>\",\n         \"<cite>\",\n         \"<cite/>\",\n         \"<cite />\",\n         \"<table><cite></cite></table>\",\n         \"<table><cite></table>\",\n         \"<CITE />\",\n         \"<CITE></CITE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_cite_media\"},\n    {input: \"<cite nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<cite></cite>\",\n         \"<cite>\",\n         \"<cite/>\",\n         \"<cite />\",\n         \"<table><cite></cite></table>\",\n         \"<table><cite></table>\",\n         \"<CITE />\",\n         \"<CITE></CITE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_cite_nonce\"},\n    {input: \"<cite srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<cite></cite>\",\n         \"<cite>\",\n         \"<cite/>\",\n         \"<cite />\",\n         \"<table><cite></cite></table>\",\n         \"<table><cite></table>\",\n         \"<CITE />\",\n         \"<CITE></CITE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_cite_srcset\"},\n    {input: \"<cite srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<cite></cite>\",\n         \"<cite>\",\n         \"<cite/>\",\n         \"<cite />\",\n         \"<table><cite></cite></table>\",\n         \"<table><cite></table>\",\n         \"<CITE />\",\n         \"<CITE></CITE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_cite_srcdoc\"},\n    {input: \"<cite poster=\\\"x\\\">\",\n     acceptable: [\n         \"<cite></cite>\",\n         \"<cite>\",\n         \"<cite/>\",\n         \"<cite />\",\n         \"<table><cite></cite></table>\",\n         \"<table><cite></table>\",\n         \"<CITE />\",\n         \"<CITE></CITE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_cite_poster\"},\n    {input: \"<cite autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<cite></cite>\",\n         \"<cite>\",\n         \"<cite/>\",\n         \"<cite />\",\n         \"<table><cite></cite></table>\",\n         \"<table><cite></table>\",\n         \"<CITE />\",\n         \"<CITE></CITE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_cite_autoplay\"},\n    {input: \"<cite controls=\\\"x\\\">\",\n     acceptable: [\n         \"<cite></cite>\",\n         \"<cite>\",\n         \"<cite/>\",\n         \"<cite />\",\n         \"<table><cite></cite></table>\",\n         \"<table><cite></table>\",\n         \"<CITE />\",\n         \"<CITE></CITE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_cite_controls\"},\n    {input: \"<cite formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<cite></cite>\",\n         \"<cite>\",\n         \"<cite/>\",\n         \"<cite />\",\n         \"<table><cite></cite></table>\",\n         \"<table><cite></table>\",\n         \"<CITE />\",\n         \"<CITE></CITE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_cite_formaction\"},\n    {input: \"<cite formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<cite></cite>\",\n         \"<cite>\",\n         \"<cite/>\",\n         \"<cite />\",\n         \"<table><cite></cite></table>\",\n         \"<table><cite></table>\",\n         \"<CITE />\",\n         \"<CITE></CITE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_cite_formmethod\"},\n    {input: \"<cite pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<cite></cite>\",\n         \"<cite>\",\n         \"<cite/>\",\n         \"<cite />\",\n         \"<table><cite></cite></table>\",\n         \"<table><cite></table>\",\n         \"<CITE />\",\n         \"<CITE></CITE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_cite_pattern\"},\n    {input: \"<cite icon=\\\"x\\\">\",\n     acceptable: [\n         \"<cite></cite>\",\n         \"<cite>\",\n         \"<cite/>\",\n         \"<cite />\",\n         \"<table><cite></cite></table>\",\n         \"<table><cite></table>\",\n         \"<CITE />\",\n         \"<CITE></CITE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_cite_icon\"},\n    {input: \"<cite select=\\\"x\\\">\",\n     acceptable: [\n         \"<cite></cite>\",\n         \"<cite>\",\n         \"<cite/>\",\n         \"<cite />\",\n         \"<table><cite></cite></table>\",\n         \"<table><cite></table>\",\n         \"<CITE />\",\n         \"<CITE></CITE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_cite_select\"},\n    {input: \"<q></q>\",\n     acceptable: [\n         \"<q>\",\n         \"<q />\",\n         \"<q></q>\",\n         \"<table><q></q></table>\",\n         \"<Q />\",\n         \"<Q></Q>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_q_plain\"},\n    {input: \"<q><script>alert()</script></q>\",\n     acceptable: [\n         \"<q>\",\n         \"<q />\",\n         \"<q></q>\",\n         \"<table><q></q></table>\",\n         \"<Q />\",\n         \"<Q></Q>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><q><td></td></q></table>\",\n         \"<table><q></q><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_q_scriptinside\"},\n    {input: \"<q cite=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<q cite=\\\"about:invalid#zCSafez\\\"></q>\",\n         \"<q cite=\\\"about:invalid#zCSafez\\\">\",\n         \"<q cite=\\\"about:invalid#zGoSafez\\\"></q>\",\n         \"<q cite=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<q cite=\\\"javascript:void(0);\\\"></q>\",\n         \"<q cite=\\\"javascript:void(0);\\\">\",\n         \"<q></q>\",\n         \"<q>\",\n         \"<q/>\",\n         \"<q />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_q_cite\"},\n    {input: \"<q media=\\\"x\\\">\",\n     acceptable: [\n         \"<q></q>\",\n         \"<q>\",\n         \"<q/>\",\n         \"<q />\",\n         \"<table><q></q></table>\",\n         \"<table><q></table>\",\n         \"<Q />\",\n         \"<Q></Q>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_q_media\"},\n    {input: \"<q nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<q></q>\",\n         \"<q>\",\n         \"<q/>\",\n         \"<q />\",\n         \"<table><q></q></table>\",\n         \"<table><q></table>\",\n         \"<Q />\",\n         \"<Q></Q>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_q_nonce\"},\n    {input: \"<q srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<q></q>\",\n         \"<q>\",\n         \"<q/>\",\n         \"<q />\",\n         \"<table><q></q></table>\",\n         \"<table><q></table>\",\n         \"<Q />\",\n         \"<Q></Q>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_q_srcset\"},\n    {input: \"<q srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<q></q>\",\n         \"<q>\",\n         \"<q/>\",\n         \"<q />\",\n         \"<table><q></q></table>\",\n         \"<table><q></table>\",\n         \"<Q />\",\n         \"<Q></Q>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_q_srcdoc\"},\n    {input: \"<q poster=\\\"x\\\">\",\n     acceptable: [\n         \"<q></q>\",\n         \"<q>\",\n         \"<q/>\",\n         \"<q />\",\n         \"<table><q></q></table>\",\n         \"<table><q></table>\",\n         \"<Q />\",\n         \"<Q></Q>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_q_poster\"},\n    {input: \"<q autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<q></q>\",\n         \"<q>\",\n         \"<q/>\",\n         \"<q />\",\n         \"<table><q></q></table>\",\n         \"<table><q></table>\",\n         \"<Q />\",\n         \"<Q></Q>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_q_autoplay\"},\n    {input: \"<q controls=\\\"x\\\">\",\n     acceptable: [\n         \"<q></q>\",\n         \"<q>\",\n         \"<q/>\",\n         \"<q />\",\n         \"<table><q></q></table>\",\n         \"<table><q></table>\",\n         \"<Q />\",\n         \"<Q></Q>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_q_controls\"},\n    {input: \"<q formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<q></q>\",\n         \"<q>\",\n         \"<q/>\",\n         \"<q />\",\n         \"<table><q></q></table>\",\n         \"<table><q></table>\",\n         \"<Q />\",\n         \"<Q></Q>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_q_formaction\"},\n    {input: \"<q formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<q></q>\",\n         \"<q>\",\n         \"<q/>\",\n         \"<q />\",\n         \"<table><q></q></table>\",\n         \"<table><q></table>\",\n         \"<Q />\",\n         \"<Q></Q>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_q_formmethod\"},\n    {input: \"<q pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<q></q>\",\n         \"<q>\",\n         \"<q/>\",\n         \"<q />\",\n         \"<table><q></q></table>\",\n         \"<table><q></table>\",\n         \"<Q />\",\n         \"<Q></Q>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_q_pattern\"},\n    {input: \"<q icon=\\\"x\\\">\",\n     acceptable: [\n         \"<q></q>\",\n         \"<q>\",\n         \"<q/>\",\n         \"<q />\",\n         \"<table><q></q></table>\",\n         \"<table><q></table>\",\n         \"<Q />\",\n         \"<Q></Q>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_q_icon\"},\n    {input: \"<q select=\\\"x\\\">\",\n     acceptable: [\n         \"<q></q>\",\n         \"<q>\",\n         \"<q/>\",\n         \"<q />\",\n         \"<table><q></q></table>\",\n         \"<table><q></table>\",\n         \"<Q />\",\n         \"<Q></Q>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_q_select\"},\n    {input: \"<dfn></dfn>\",\n     acceptable: [\n         \"<dfn>\",\n         \"<dfn />\",\n         \"<dfn></dfn>\",\n         \"<table><dfn></dfn></table>\",\n         \"<DFN />\",\n         \"<DFN></DFN>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dfn_plain\"},\n    {input: \"<dfn><script>alert()</script></dfn>\",\n     acceptable: [\n         \"<dfn>\",\n         \"<dfn />\",\n         \"<dfn></dfn>\",\n         \"<table><dfn></dfn></table>\",\n         \"<DFN />\",\n         \"<DFN></DFN>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><dfn><td></td></dfn></table>\",\n         \"<table><dfn></dfn><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_dfn_scriptinside\"},\n    {input: \"<dfn media=\\\"x\\\">\",\n     acceptable: [\n         \"<dfn></dfn>\",\n         \"<dfn>\",\n         \"<dfn/>\",\n         \"<dfn />\",\n         \"<table><dfn></dfn></table>\",\n         \"<table><dfn></table>\",\n         \"<DFN />\",\n         \"<DFN></DFN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dfn_media\"},\n    {input: \"<dfn nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<dfn></dfn>\",\n         \"<dfn>\",\n         \"<dfn/>\",\n         \"<dfn />\",\n         \"<table><dfn></dfn></table>\",\n         \"<table><dfn></table>\",\n         \"<DFN />\",\n         \"<DFN></DFN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dfn_nonce\"},\n    {input: \"<dfn srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<dfn></dfn>\",\n         \"<dfn>\",\n         \"<dfn/>\",\n         \"<dfn />\",\n         \"<table><dfn></dfn></table>\",\n         \"<table><dfn></table>\",\n         \"<DFN />\",\n         \"<DFN></DFN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dfn_srcset\"},\n    {input: \"<dfn srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<dfn></dfn>\",\n         \"<dfn>\",\n         \"<dfn/>\",\n         \"<dfn />\",\n         \"<table><dfn></dfn></table>\",\n         \"<table><dfn></table>\",\n         \"<DFN />\",\n         \"<DFN></DFN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dfn_srcdoc\"},\n    {input: \"<dfn poster=\\\"x\\\">\",\n     acceptable: [\n         \"<dfn></dfn>\",\n         \"<dfn>\",\n         \"<dfn/>\",\n         \"<dfn />\",\n         \"<table><dfn></dfn></table>\",\n         \"<table><dfn></table>\",\n         \"<DFN />\",\n         \"<DFN></DFN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dfn_poster\"},\n    {input: \"<dfn autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<dfn></dfn>\",\n         \"<dfn>\",\n         \"<dfn/>\",\n         \"<dfn />\",\n         \"<table><dfn></dfn></table>\",\n         \"<table><dfn></table>\",\n         \"<DFN />\",\n         \"<DFN></DFN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dfn_autoplay\"},\n    {input: \"<dfn controls=\\\"x\\\">\",\n     acceptable: [\n         \"<dfn></dfn>\",\n         \"<dfn>\",\n         \"<dfn/>\",\n         \"<dfn />\",\n         \"<table><dfn></dfn></table>\",\n         \"<table><dfn></table>\",\n         \"<DFN />\",\n         \"<DFN></DFN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dfn_controls\"},\n    {input: \"<dfn formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<dfn></dfn>\",\n         \"<dfn>\",\n         \"<dfn/>\",\n         \"<dfn />\",\n         \"<table><dfn></dfn></table>\",\n         \"<table><dfn></table>\",\n         \"<DFN />\",\n         \"<DFN></DFN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dfn_formaction\"},\n    {input: \"<dfn formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<dfn></dfn>\",\n         \"<dfn>\",\n         \"<dfn/>\",\n         \"<dfn />\",\n         \"<table><dfn></dfn></table>\",\n         \"<table><dfn></table>\",\n         \"<DFN />\",\n         \"<DFN></DFN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dfn_formmethod\"},\n    {input: \"<dfn pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<dfn></dfn>\",\n         \"<dfn>\",\n         \"<dfn/>\",\n         \"<dfn />\",\n         \"<table><dfn></dfn></table>\",\n         \"<table><dfn></table>\",\n         \"<DFN />\",\n         \"<DFN></DFN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dfn_pattern\"},\n    {input: \"<dfn icon=\\\"x\\\">\",\n     acceptable: [\n         \"<dfn></dfn>\",\n         \"<dfn>\",\n         \"<dfn/>\",\n         \"<dfn />\",\n         \"<table><dfn></dfn></table>\",\n         \"<table><dfn></table>\",\n         \"<DFN />\",\n         \"<DFN></DFN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dfn_icon\"},\n    {input: \"<dfn select=\\\"x\\\">\",\n     acceptable: [\n         \"<dfn></dfn>\",\n         \"<dfn>\",\n         \"<dfn/>\",\n         \"<dfn />\",\n         \"<table><dfn></dfn></table>\",\n         \"<table><dfn></table>\",\n         \"<DFN />\",\n         \"<DFN></DFN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dfn_select\"},\n    {input: \"<abbr></abbr>\",\n     acceptable: [\n         \"<abbr>\",\n         \"<abbr />\",\n         \"<abbr></abbr>\",\n         \"<table><abbr></abbr></table>\",\n         \"<ABBR />\",\n         \"<ABBR></ABBR>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_abbr_plain\"},\n    {input: \"<abbr><script>alert()</script></abbr>\",\n     acceptable: [\n         \"<abbr>\",\n         \"<abbr />\",\n         \"<abbr></abbr>\",\n         \"<table><abbr></abbr></table>\",\n         \"<ABBR />\",\n         \"<ABBR></ABBR>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><abbr><td></td></abbr></table>\",\n         \"<table><abbr></abbr><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_abbr_scriptinside\"},\n    {input: \"<abbr media=\\\"x\\\">\",\n     acceptable: [\n         \"<abbr></abbr>\",\n         \"<abbr>\",\n         \"<abbr/>\",\n         \"<abbr />\",\n         \"<table><abbr></abbr></table>\",\n         \"<table><abbr></table>\",\n         \"<ABBR />\",\n         \"<ABBR></ABBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_abbr_media\"},\n    {input: \"<abbr nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<abbr></abbr>\",\n         \"<abbr>\",\n         \"<abbr/>\",\n         \"<abbr />\",\n         \"<table><abbr></abbr></table>\",\n         \"<table><abbr></table>\",\n         \"<ABBR />\",\n         \"<ABBR></ABBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_abbr_nonce\"},\n    {input: \"<abbr srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<abbr></abbr>\",\n         \"<abbr>\",\n         \"<abbr/>\",\n         \"<abbr />\",\n         \"<table><abbr></abbr></table>\",\n         \"<table><abbr></table>\",\n         \"<ABBR />\",\n         \"<ABBR></ABBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_abbr_srcset\"},\n    {input: \"<abbr srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<abbr></abbr>\",\n         \"<abbr>\",\n         \"<abbr/>\",\n         \"<abbr />\",\n         \"<table><abbr></abbr></table>\",\n         \"<table><abbr></table>\",\n         \"<ABBR />\",\n         \"<ABBR></ABBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_abbr_srcdoc\"},\n    {input: \"<abbr poster=\\\"x\\\">\",\n     acceptable: [\n         \"<abbr></abbr>\",\n         \"<abbr>\",\n         \"<abbr/>\",\n         \"<abbr />\",\n         \"<table><abbr></abbr></table>\",\n         \"<table><abbr></table>\",\n         \"<ABBR />\",\n         \"<ABBR></ABBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_abbr_poster\"},\n    {input: \"<abbr autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<abbr></abbr>\",\n         \"<abbr>\",\n         \"<abbr/>\",\n         \"<abbr />\",\n         \"<table><abbr></abbr></table>\",\n         \"<table><abbr></table>\",\n         \"<ABBR />\",\n         \"<ABBR></ABBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_abbr_autoplay\"},\n    {input: \"<abbr controls=\\\"x\\\">\",\n     acceptable: [\n         \"<abbr></abbr>\",\n         \"<abbr>\",\n         \"<abbr/>\",\n         \"<abbr />\",\n         \"<table><abbr></abbr></table>\",\n         \"<table><abbr></table>\",\n         \"<ABBR />\",\n         \"<ABBR></ABBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_abbr_controls\"},\n    {input: \"<abbr formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<abbr></abbr>\",\n         \"<abbr>\",\n         \"<abbr/>\",\n         \"<abbr />\",\n         \"<table><abbr></abbr></table>\",\n         \"<table><abbr></table>\",\n         \"<ABBR />\",\n         \"<ABBR></ABBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_abbr_formaction\"},\n    {input: \"<abbr formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<abbr></abbr>\",\n         \"<abbr>\",\n         \"<abbr/>\",\n         \"<abbr />\",\n         \"<table><abbr></abbr></table>\",\n         \"<table><abbr></table>\",\n         \"<ABBR />\",\n         \"<ABBR></ABBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_abbr_formmethod\"},\n    {input: \"<abbr pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<abbr></abbr>\",\n         \"<abbr>\",\n         \"<abbr/>\",\n         \"<abbr />\",\n         \"<table><abbr></abbr></table>\",\n         \"<table><abbr></table>\",\n         \"<ABBR />\",\n         \"<ABBR></ABBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_abbr_pattern\"},\n    {input: \"<abbr icon=\\\"x\\\">\",\n     acceptable: [\n         \"<abbr></abbr>\",\n         \"<abbr>\",\n         \"<abbr/>\",\n         \"<abbr />\",\n         \"<table><abbr></abbr></table>\",\n         \"<table><abbr></table>\",\n         \"<ABBR />\",\n         \"<ABBR></ABBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_abbr_icon\"},\n    {input: \"<abbr select=\\\"x\\\">\",\n     acceptable: [\n         \"<abbr></abbr>\",\n         \"<abbr>\",\n         \"<abbr/>\",\n         \"<abbr />\",\n         \"<table><abbr></abbr></table>\",\n         \"<table><abbr></table>\",\n         \"<ABBR />\",\n         \"<ABBR></ABBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_abbr_select\"},\n    {input: \"<ruby></ruby>\",\n     acceptable: [\n         \"<ruby>\",\n         \"<ruby />\",\n         \"<ruby></ruby>\",\n         \"<table><ruby></ruby></table>\",\n         \"<RUBY />\",\n         \"<RUBY></RUBY>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ruby_plain\"},\n    {input: \"<ruby><script>alert()</script></ruby>\",\n     acceptable: [\n         \"<ruby>\",\n         \"<ruby />\",\n         \"<ruby></ruby>\",\n         \"<table><ruby></ruby></table>\",\n         \"<RUBY />\",\n         \"<RUBY></RUBY>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><ruby><td></td></ruby></table>\",\n         \"<table><ruby></ruby><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_ruby_scriptinside\"},\n    {input: \"<ruby media=\\\"x\\\">\",\n     acceptable: [\n         \"<ruby></ruby>\",\n         \"<ruby>\",\n         \"<ruby/>\",\n         \"<ruby />\",\n         \"<table><ruby></ruby></table>\",\n         \"<table><ruby></table>\",\n         \"<RUBY />\",\n         \"<RUBY></RUBY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ruby_media\"},\n    {input: \"<ruby nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<ruby></ruby>\",\n         \"<ruby>\",\n         \"<ruby/>\",\n         \"<ruby />\",\n         \"<table><ruby></ruby></table>\",\n         \"<table><ruby></table>\",\n         \"<RUBY />\",\n         \"<RUBY></RUBY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ruby_nonce\"},\n    {input: \"<ruby srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<ruby></ruby>\",\n         \"<ruby>\",\n         \"<ruby/>\",\n         \"<ruby />\",\n         \"<table><ruby></ruby></table>\",\n         \"<table><ruby></table>\",\n         \"<RUBY />\",\n         \"<RUBY></RUBY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ruby_srcset\"},\n    {input: \"<ruby srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<ruby></ruby>\",\n         \"<ruby>\",\n         \"<ruby/>\",\n         \"<ruby />\",\n         \"<table><ruby></ruby></table>\",\n         \"<table><ruby></table>\",\n         \"<RUBY />\",\n         \"<RUBY></RUBY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ruby_srcdoc\"},\n    {input: \"<ruby poster=\\\"x\\\">\",\n     acceptable: [\n         \"<ruby></ruby>\",\n         \"<ruby>\",\n         \"<ruby/>\",\n         \"<ruby />\",\n         \"<table><ruby></ruby></table>\",\n         \"<table><ruby></table>\",\n         \"<RUBY />\",\n         \"<RUBY></RUBY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ruby_poster\"},\n    {input: \"<ruby autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<ruby></ruby>\",\n         \"<ruby>\",\n         \"<ruby/>\",\n         \"<ruby />\",\n         \"<table><ruby></ruby></table>\",\n         \"<table><ruby></table>\",\n         \"<RUBY />\",\n         \"<RUBY></RUBY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ruby_autoplay\"},\n    {input: \"<ruby controls=\\\"x\\\">\",\n     acceptable: [\n         \"<ruby></ruby>\",\n         \"<ruby>\",\n         \"<ruby/>\",\n         \"<ruby />\",\n         \"<table><ruby></ruby></table>\",\n         \"<table><ruby></table>\",\n         \"<RUBY />\",\n         \"<RUBY></RUBY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ruby_controls\"},\n    {input: \"<ruby formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<ruby></ruby>\",\n         \"<ruby>\",\n         \"<ruby/>\",\n         \"<ruby />\",\n         \"<table><ruby></ruby></table>\",\n         \"<table><ruby></table>\",\n         \"<RUBY />\",\n         \"<RUBY></RUBY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ruby_formaction\"},\n    {input: \"<ruby formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<ruby></ruby>\",\n         \"<ruby>\",\n         \"<ruby/>\",\n         \"<ruby />\",\n         \"<table><ruby></ruby></table>\",\n         \"<table><ruby></table>\",\n         \"<RUBY />\",\n         \"<RUBY></RUBY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ruby_formmethod\"},\n    {input: \"<ruby pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<ruby></ruby>\",\n         \"<ruby>\",\n         \"<ruby/>\",\n         \"<ruby />\",\n         \"<table><ruby></ruby></table>\",\n         \"<table><ruby></table>\",\n         \"<RUBY />\",\n         \"<RUBY></RUBY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ruby_pattern\"},\n    {input: \"<ruby icon=\\\"x\\\">\",\n     acceptable: [\n         \"<ruby></ruby>\",\n         \"<ruby>\",\n         \"<ruby/>\",\n         \"<ruby />\",\n         \"<table><ruby></ruby></table>\",\n         \"<table><ruby></table>\",\n         \"<RUBY />\",\n         \"<RUBY></RUBY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ruby_icon\"},\n    {input: \"<ruby select=\\\"x\\\">\",\n     acceptable: [\n         \"<ruby></ruby>\",\n         \"<ruby>\",\n         \"<ruby/>\",\n         \"<ruby />\",\n         \"<table><ruby></ruby></table>\",\n         \"<table><ruby></table>\",\n         \"<RUBY />\",\n         \"<RUBY></RUBY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ruby_select\"},\n    {input: \"<rb></rb>\",\n     acceptable: [\n         \"<rb>\",\n         \"<rb />\",\n         \"<rb></rb>\",\n         \"<table><rb></rb></table>\",\n         \"<RB />\",\n         \"<RB></RB>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rb_plain\"},\n    {input: \"<rb><script>alert()</script></rb>\",\n     acceptable: [\n         \"<rb>\",\n         \"<rb />\",\n         \"<rb></rb>\",\n         \"<table><rb></rb></table>\",\n         \"<RB />\",\n         \"<RB></RB>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><rb><td></td></rb></table>\",\n         \"<table><rb></rb><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_rb_scriptinside\"},\n    {input: \"<rb media=\\\"x\\\">\",\n     acceptable: [\n         \"<rb></rb>\",\n         \"<rb>\",\n         \"<rb/>\",\n         \"<rb />\",\n         \"<table><rb></rb></table>\",\n         \"<table><rb></table>\",\n         \"<RB />\",\n         \"<RB></RB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rb_media\"},\n    {input: \"<rb nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<rb></rb>\",\n         \"<rb>\",\n         \"<rb/>\",\n         \"<rb />\",\n         \"<table><rb></rb></table>\",\n         \"<table><rb></table>\",\n         \"<RB />\",\n         \"<RB></RB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rb_nonce\"},\n    {input: \"<rb srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<rb></rb>\",\n         \"<rb>\",\n         \"<rb/>\",\n         \"<rb />\",\n         \"<table><rb></rb></table>\",\n         \"<table><rb></table>\",\n         \"<RB />\",\n         \"<RB></RB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rb_srcset\"},\n    {input: \"<rb srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<rb></rb>\",\n         \"<rb>\",\n         \"<rb/>\",\n         \"<rb />\",\n         \"<table><rb></rb></table>\",\n         \"<table><rb></table>\",\n         \"<RB />\",\n         \"<RB></RB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rb_srcdoc\"},\n    {input: \"<rb poster=\\\"x\\\">\",\n     acceptable: [\n         \"<rb></rb>\",\n         \"<rb>\",\n         \"<rb/>\",\n         \"<rb />\",\n         \"<table><rb></rb></table>\",\n         \"<table><rb></table>\",\n         \"<RB />\",\n         \"<RB></RB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rb_poster\"},\n    {input: \"<rb autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<rb></rb>\",\n         \"<rb>\",\n         \"<rb/>\",\n         \"<rb />\",\n         \"<table><rb></rb></table>\",\n         \"<table><rb></table>\",\n         \"<RB />\",\n         \"<RB></RB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rb_autoplay\"},\n    {input: \"<rb controls=\\\"x\\\">\",\n     acceptable: [\n         \"<rb></rb>\",\n         \"<rb>\",\n         \"<rb/>\",\n         \"<rb />\",\n         \"<table><rb></rb></table>\",\n         \"<table><rb></table>\",\n         \"<RB />\",\n         \"<RB></RB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rb_controls\"},\n    {input: \"<rb formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<rb></rb>\",\n         \"<rb>\",\n         \"<rb/>\",\n         \"<rb />\",\n         \"<table><rb></rb></table>\",\n         \"<table><rb></table>\",\n         \"<RB />\",\n         \"<RB></RB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rb_formaction\"},\n    {input: \"<rb formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<rb></rb>\",\n         \"<rb>\",\n         \"<rb/>\",\n         \"<rb />\",\n         \"<table><rb></rb></table>\",\n         \"<table><rb></table>\",\n         \"<RB />\",\n         \"<RB></RB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rb_formmethod\"},\n    {input: \"<rb pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<rb></rb>\",\n         \"<rb>\",\n         \"<rb/>\",\n         \"<rb />\",\n         \"<table><rb></rb></table>\",\n         \"<table><rb></table>\",\n         \"<RB />\",\n         \"<RB></RB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rb_pattern\"},\n    {input: \"<rb icon=\\\"x\\\">\",\n     acceptable: [\n         \"<rb></rb>\",\n         \"<rb>\",\n         \"<rb/>\",\n         \"<rb />\",\n         \"<table><rb></rb></table>\",\n         \"<table><rb></table>\",\n         \"<RB />\",\n         \"<RB></RB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rb_icon\"},\n    {input: \"<rb select=\\\"x\\\">\",\n     acceptable: [\n         \"<rb></rb>\",\n         \"<rb>\",\n         \"<rb/>\",\n         \"<rb />\",\n         \"<table><rb></rb></table>\",\n         \"<table><rb></table>\",\n         \"<RB />\",\n         \"<RB></RB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rb_select\"},\n    {input: \"<rt></rt>\",\n     acceptable: [\n         \"<rt>\",\n         \"<rt />\",\n         \"<rt></rt>\",\n         \"<table><rt></rt></table>\",\n         \"<RT />\",\n         \"<RT></RT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rt_plain\"},\n    {input: \"<rt><script>alert()</script></rt>\",\n     acceptable: [\n         \"<rt>\",\n         \"<rt />\",\n         \"<rt></rt>\",\n         \"<table><rt></rt></table>\",\n         \"<RT />\",\n         \"<RT></RT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><rt><td></td></rt></table>\",\n         \"<table><rt></rt><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_rt_scriptinside\"},\n    {input: \"<rt media=\\\"x\\\">\",\n     acceptable: [\n         \"<rt></rt>\",\n         \"<rt>\",\n         \"<rt/>\",\n         \"<rt />\",\n         \"<table><rt></rt></table>\",\n         \"<table><rt></table>\",\n         \"<RT />\",\n         \"<RT></RT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rt_media\"},\n    {input: \"<rt nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<rt></rt>\",\n         \"<rt>\",\n         \"<rt/>\",\n         \"<rt />\",\n         \"<table><rt></rt></table>\",\n         \"<table><rt></table>\",\n         \"<RT />\",\n         \"<RT></RT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rt_nonce\"},\n    {input: \"<rt srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<rt></rt>\",\n         \"<rt>\",\n         \"<rt/>\",\n         \"<rt />\",\n         \"<table><rt></rt></table>\",\n         \"<table><rt></table>\",\n         \"<RT />\",\n         \"<RT></RT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rt_srcset\"},\n    {input: \"<rt srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<rt></rt>\",\n         \"<rt>\",\n         \"<rt/>\",\n         \"<rt />\",\n         \"<table><rt></rt></table>\",\n         \"<table><rt></table>\",\n         \"<RT />\",\n         \"<RT></RT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rt_srcdoc\"},\n    {input: \"<rt poster=\\\"x\\\">\",\n     acceptable: [\n         \"<rt></rt>\",\n         \"<rt>\",\n         \"<rt/>\",\n         \"<rt />\",\n         \"<table><rt></rt></table>\",\n         \"<table><rt></table>\",\n         \"<RT />\",\n         \"<RT></RT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rt_poster\"},\n    {input: \"<rt autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<rt></rt>\",\n         \"<rt>\",\n         \"<rt/>\",\n         \"<rt />\",\n         \"<table><rt></rt></table>\",\n         \"<table><rt></table>\",\n         \"<RT />\",\n         \"<RT></RT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rt_autoplay\"},\n    {input: \"<rt controls=\\\"x\\\">\",\n     acceptable: [\n         \"<rt></rt>\",\n         \"<rt>\",\n         \"<rt/>\",\n         \"<rt />\",\n         \"<table><rt></rt></table>\",\n         \"<table><rt></table>\",\n         \"<RT />\",\n         \"<RT></RT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rt_controls\"},\n    {input: \"<rt formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<rt></rt>\",\n         \"<rt>\",\n         \"<rt/>\",\n         \"<rt />\",\n         \"<table><rt></rt></table>\",\n         \"<table><rt></table>\",\n         \"<RT />\",\n         \"<RT></RT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rt_formaction\"},\n    {input: \"<rt formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<rt></rt>\",\n         \"<rt>\",\n         \"<rt/>\",\n         \"<rt />\",\n         \"<table><rt></rt></table>\",\n         \"<table><rt></table>\",\n         \"<RT />\",\n         \"<RT></RT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rt_formmethod\"},\n    {input: \"<rt pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<rt></rt>\",\n         \"<rt>\",\n         \"<rt/>\",\n         \"<rt />\",\n         \"<table><rt></rt></table>\",\n         \"<table><rt></table>\",\n         \"<RT />\",\n         \"<RT></RT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rt_pattern\"},\n    {input: \"<rt icon=\\\"x\\\">\",\n     acceptable: [\n         \"<rt></rt>\",\n         \"<rt>\",\n         \"<rt/>\",\n         \"<rt />\",\n         \"<table><rt></rt></table>\",\n         \"<table><rt></table>\",\n         \"<RT />\",\n         \"<RT></RT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rt_icon\"},\n    {input: \"<rt select=\\\"x\\\">\",\n     acceptable: [\n         \"<rt></rt>\",\n         \"<rt>\",\n         \"<rt/>\",\n         \"<rt />\",\n         \"<table><rt></rt></table>\",\n         \"<table><rt></table>\",\n         \"<RT />\",\n         \"<RT></RT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rt_select\"},\n    {input: \"<rtc></rtc>\",\n     acceptable: [\n         \"<rtc>\",\n         \"<rtc />\",\n         \"<rtc></rtc>\",\n         \"<table><rtc></rtc></table>\",\n         \"<RTC />\",\n         \"<RTC></RTC>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rtc_plain\"},\n    {input: \"<rtc><script>alert()</script></rtc>\",\n     acceptable: [\n         \"<rtc>\",\n         \"<rtc />\",\n         \"<rtc></rtc>\",\n         \"<table><rtc></rtc></table>\",\n         \"<RTC />\",\n         \"<RTC></RTC>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><rtc><td></td></rtc></table>\",\n         \"<table><rtc></rtc><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_rtc_scriptinside\"},\n    {input: \"<rtc media=\\\"x\\\">\",\n     acceptable: [\n         \"<rtc></rtc>\",\n         \"<rtc>\",\n         \"<rtc/>\",\n         \"<rtc />\",\n         \"<table><rtc></rtc></table>\",\n         \"<table><rtc></table>\",\n         \"<RTC />\",\n         \"<RTC></RTC>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rtc_media\"},\n    {input: \"<rtc nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<rtc></rtc>\",\n         \"<rtc>\",\n         \"<rtc/>\",\n         \"<rtc />\",\n         \"<table><rtc></rtc></table>\",\n         \"<table><rtc></table>\",\n         \"<RTC />\",\n         \"<RTC></RTC>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rtc_nonce\"},\n    {input: \"<rtc srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<rtc></rtc>\",\n         \"<rtc>\",\n         \"<rtc/>\",\n         \"<rtc />\",\n         \"<table><rtc></rtc></table>\",\n         \"<table><rtc></table>\",\n         \"<RTC />\",\n         \"<RTC></RTC>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rtc_srcset\"},\n    {input: \"<rtc srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<rtc></rtc>\",\n         \"<rtc>\",\n         \"<rtc/>\",\n         \"<rtc />\",\n         \"<table><rtc></rtc></table>\",\n         \"<table><rtc></table>\",\n         \"<RTC />\",\n         \"<RTC></RTC>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rtc_srcdoc\"},\n    {input: \"<rtc poster=\\\"x\\\">\",\n     acceptable: [\n         \"<rtc></rtc>\",\n         \"<rtc>\",\n         \"<rtc/>\",\n         \"<rtc />\",\n         \"<table><rtc></rtc></table>\",\n         \"<table><rtc></table>\",\n         \"<RTC />\",\n         \"<RTC></RTC>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rtc_poster\"},\n    {input: \"<rtc autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<rtc></rtc>\",\n         \"<rtc>\",\n         \"<rtc/>\",\n         \"<rtc />\",\n         \"<table><rtc></rtc></table>\",\n         \"<table><rtc></table>\",\n         \"<RTC />\",\n         \"<RTC></RTC>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rtc_autoplay\"},\n    {input: \"<rtc controls=\\\"x\\\">\",\n     acceptable: [\n         \"<rtc></rtc>\",\n         \"<rtc>\",\n         \"<rtc/>\",\n         \"<rtc />\",\n         \"<table><rtc></rtc></table>\",\n         \"<table><rtc></table>\",\n         \"<RTC />\",\n         \"<RTC></RTC>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rtc_controls\"},\n    {input: \"<rtc formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<rtc></rtc>\",\n         \"<rtc>\",\n         \"<rtc/>\",\n         \"<rtc />\",\n         \"<table><rtc></rtc></table>\",\n         \"<table><rtc></table>\",\n         \"<RTC />\",\n         \"<RTC></RTC>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rtc_formaction\"},\n    {input: \"<rtc formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<rtc></rtc>\",\n         \"<rtc>\",\n         \"<rtc/>\",\n         \"<rtc />\",\n         \"<table><rtc></rtc></table>\",\n         \"<table><rtc></table>\",\n         \"<RTC />\",\n         \"<RTC></RTC>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rtc_formmethod\"},\n    {input: \"<rtc pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<rtc></rtc>\",\n         \"<rtc>\",\n         \"<rtc/>\",\n         \"<rtc />\",\n         \"<table><rtc></rtc></table>\",\n         \"<table><rtc></table>\",\n         \"<RTC />\",\n         \"<RTC></RTC>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rtc_pattern\"},\n    {input: \"<rtc icon=\\\"x\\\">\",\n     acceptable: [\n         \"<rtc></rtc>\",\n         \"<rtc>\",\n         \"<rtc/>\",\n         \"<rtc />\",\n         \"<table><rtc></rtc></table>\",\n         \"<table><rtc></table>\",\n         \"<RTC />\",\n         \"<RTC></RTC>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rtc_icon\"},\n    {input: \"<rtc select=\\\"x\\\">\",\n     acceptable: [\n         \"<rtc></rtc>\",\n         \"<rtc>\",\n         \"<rtc/>\",\n         \"<rtc />\",\n         \"<table><rtc></rtc></table>\",\n         \"<table><rtc></table>\",\n         \"<RTC />\",\n         \"<RTC></RTC>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rtc_select\"},\n    {input: \"<rp></rp>\",\n     acceptable: [\n         \"<rp>\",\n         \"<rp />\",\n         \"<rp></rp>\",\n         \"<table><rp></rp></table>\",\n         \"<RP />\",\n         \"<RP></RP>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rp_plain\"},\n    {input: \"<rp><script>alert()</script></rp>\",\n     acceptable: [\n         \"<rp>\",\n         \"<rp />\",\n         \"<rp></rp>\",\n         \"<table><rp></rp></table>\",\n         \"<RP />\",\n         \"<RP></RP>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><rp><td></td></rp></table>\",\n         \"<table><rp></rp><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_rp_scriptinside\"},\n    {input: \"<rp media=\\\"x\\\">\",\n     acceptable: [\n         \"<rp></rp>\",\n         \"<rp>\",\n         \"<rp/>\",\n         \"<rp />\",\n         \"<table><rp></rp></table>\",\n         \"<table><rp></table>\",\n         \"<RP />\",\n         \"<RP></RP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rp_media\"},\n    {input: \"<rp nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<rp></rp>\",\n         \"<rp>\",\n         \"<rp/>\",\n         \"<rp />\",\n         \"<table><rp></rp></table>\",\n         \"<table><rp></table>\",\n         \"<RP />\",\n         \"<RP></RP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rp_nonce\"},\n    {input: \"<rp srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<rp></rp>\",\n         \"<rp>\",\n         \"<rp/>\",\n         \"<rp />\",\n         \"<table><rp></rp></table>\",\n         \"<table><rp></table>\",\n         \"<RP />\",\n         \"<RP></RP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rp_srcset\"},\n    {input: \"<rp srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<rp></rp>\",\n         \"<rp>\",\n         \"<rp/>\",\n         \"<rp />\",\n         \"<table><rp></rp></table>\",\n         \"<table><rp></table>\",\n         \"<RP />\",\n         \"<RP></RP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rp_srcdoc\"},\n    {input: \"<rp poster=\\\"x\\\">\",\n     acceptable: [\n         \"<rp></rp>\",\n         \"<rp>\",\n         \"<rp/>\",\n         \"<rp />\",\n         \"<table><rp></rp></table>\",\n         \"<table><rp></table>\",\n         \"<RP />\",\n         \"<RP></RP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rp_poster\"},\n    {input: \"<rp autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<rp></rp>\",\n         \"<rp>\",\n         \"<rp/>\",\n         \"<rp />\",\n         \"<table><rp></rp></table>\",\n         \"<table><rp></table>\",\n         \"<RP />\",\n         \"<RP></RP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rp_autoplay\"},\n    {input: \"<rp controls=\\\"x\\\">\",\n     acceptable: [\n         \"<rp></rp>\",\n         \"<rp>\",\n         \"<rp/>\",\n         \"<rp />\",\n         \"<table><rp></rp></table>\",\n         \"<table><rp></table>\",\n         \"<RP />\",\n         \"<RP></RP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rp_controls\"},\n    {input: \"<rp formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<rp></rp>\",\n         \"<rp>\",\n         \"<rp/>\",\n         \"<rp />\",\n         \"<table><rp></rp></table>\",\n         \"<table><rp></table>\",\n         \"<RP />\",\n         \"<RP></RP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rp_formaction\"},\n    {input: \"<rp formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<rp></rp>\",\n         \"<rp>\",\n         \"<rp/>\",\n         \"<rp />\",\n         \"<table><rp></rp></table>\",\n         \"<table><rp></table>\",\n         \"<RP />\",\n         \"<RP></RP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rp_formmethod\"},\n    {input: \"<rp pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<rp></rp>\",\n         \"<rp>\",\n         \"<rp/>\",\n         \"<rp />\",\n         \"<table><rp></rp></table>\",\n         \"<table><rp></table>\",\n         \"<RP />\",\n         \"<RP></RP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rp_pattern\"},\n    {input: \"<rp icon=\\\"x\\\">\",\n     acceptable: [\n         \"<rp></rp>\",\n         \"<rp>\",\n         \"<rp/>\",\n         \"<rp />\",\n         \"<table><rp></rp></table>\",\n         \"<table><rp></table>\",\n         \"<RP />\",\n         \"<RP></RP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rp_icon\"},\n    {input: \"<rp select=\\\"x\\\">\",\n     acceptable: [\n         \"<rp></rp>\",\n         \"<rp>\",\n         \"<rp/>\",\n         \"<rp />\",\n         \"<table><rp></rp></table>\",\n         \"<table><rp></table>\",\n         \"<RP />\",\n         \"<RP></RP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_rp_select\"},\n    {input: \"<data></data>\",\n     acceptable: [\n         \"<data>\",\n         \"<data />\",\n         \"<data></data>\",\n         \"<table><data></data></table>\",\n         \"<DATA />\",\n         \"<DATA></DATA>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_data_plain\"},\n    {input: \"<data><script>alert()</script></data>\",\n     acceptable: [\n         \"<data>\",\n         \"<data />\",\n         \"<data></data>\",\n         \"<table><data></data></table>\",\n         \"<DATA />\",\n         \"<DATA></DATA>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><data><td></td></data></table>\",\n         \"<table><data></data><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_data_scriptinside\"},\n    {input: \"<data media=\\\"x\\\">\",\n     acceptable: [\n         \"<data></data>\",\n         \"<data>\",\n         \"<data/>\",\n         \"<data />\",\n         \"<table><data></data></table>\",\n         \"<table><data></table>\",\n         \"<DATA />\",\n         \"<DATA></DATA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_data_media\"},\n    {input: \"<data nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<data></data>\",\n         \"<data>\",\n         \"<data/>\",\n         \"<data />\",\n         \"<table><data></data></table>\",\n         \"<table><data></table>\",\n         \"<DATA />\",\n         \"<DATA></DATA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_data_nonce\"},\n    {input: \"<data srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<data></data>\",\n         \"<data>\",\n         \"<data/>\",\n         \"<data />\",\n         \"<table><data></data></table>\",\n         \"<table><data></table>\",\n         \"<DATA />\",\n         \"<DATA></DATA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_data_srcset\"},\n    {input: \"<data srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<data></data>\",\n         \"<data>\",\n         \"<data/>\",\n         \"<data />\",\n         \"<table><data></data></table>\",\n         \"<table><data></table>\",\n         \"<DATA />\",\n         \"<DATA></DATA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_data_srcdoc\"},\n    {input: \"<data poster=\\\"x\\\">\",\n     acceptable: [\n         \"<data></data>\",\n         \"<data>\",\n         \"<data/>\",\n         \"<data />\",\n         \"<table><data></data></table>\",\n         \"<table><data></table>\",\n         \"<DATA />\",\n         \"<DATA></DATA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_data_poster\"},\n    {input: \"<data autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<data></data>\",\n         \"<data>\",\n         \"<data/>\",\n         \"<data />\",\n         \"<table><data></data></table>\",\n         \"<table><data></table>\",\n         \"<DATA />\",\n         \"<DATA></DATA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_data_autoplay\"},\n    {input: \"<data controls=\\\"x\\\">\",\n     acceptable: [\n         \"<data></data>\",\n         \"<data>\",\n         \"<data/>\",\n         \"<data />\",\n         \"<table><data></data></table>\",\n         \"<table><data></table>\",\n         \"<DATA />\",\n         \"<DATA></DATA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_data_controls\"},\n    {input: \"<data formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<data></data>\",\n         \"<data>\",\n         \"<data/>\",\n         \"<data />\",\n         \"<table><data></data></table>\",\n         \"<table><data></table>\",\n         \"<DATA />\",\n         \"<DATA></DATA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_data_formaction\"},\n    {input: \"<data formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<data></data>\",\n         \"<data>\",\n         \"<data/>\",\n         \"<data />\",\n         \"<table><data></data></table>\",\n         \"<table><data></table>\",\n         \"<DATA />\",\n         \"<DATA></DATA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_data_formmethod\"},\n    {input: \"<data pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<data></data>\",\n         \"<data>\",\n         \"<data/>\",\n         \"<data />\",\n         \"<table><data></data></table>\",\n         \"<table><data></table>\",\n         \"<DATA />\",\n         \"<DATA></DATA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_data_pattern\"},\n    {input: \"<data icon=\\\"x\\\">\",\n     acceptable: [\n         \"<data></data>\",\n         \"<data>\",\n         \"<data/>\",\n         \"<data />\",\n         \"<table><data></data></table>\",\n         \"<table><data></table>\",\n         \"<DATA />\",\n         \"<DATA></DATA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_data_icon\"},\n    {input: \"<data select=\\\"x\\\">\",\n     acceptable: [\n         \"<data></data>\",\n         \"<data>\",\n         \"<data/>\",\n         \"<data />\",\n         \"<table><data></data></table>\",\n         \"<table><data></table>\",\n         \"<DATA />\",\n         \"<DATA></DATA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_data_select\"},\n    {input: \"<time></time>\",\n     acceptable: [\n         \"<time>\",\n         \"<time />\",\n         \"<time></time>\",\n         \"<table><time></time></table>\",\n         \"<TIME />\",\n         \"<TIME></TIME>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_time_plain\"},\n    {input: \"<time><script>alert()</script></time>\",\n     acceptable: [\n         \"<time>\",\n         \"<time />\",\n         \"<time></time>\",\n         \"<table><time></time></table>\",\n         \"<TIME />\",\n         \"<TIME></TIME>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><time><td></td></time></table>\",\n         \"<table><time></time><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_time_scriptinside\"},\n    {input: \"<time media=\\\"x\\\">\",\n     acceptable: [\n         \"<time></time>\",\n         \"<time>\",\n         \"<time/>\",\n         \"<time />\",\n         \"<table><time></time></table>\",\n         \"<table><time></table>\",\n         \"<TIME />\",\n         \"<TIME></TIME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_time_media\"},\n    {input: \"<time nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<time></time>\",\n         \"<time>\",\n         \"<time/>\",\n         \"<time />\",\n         \"<table><time></time></table>\",\n         \"<table><time></table>\",\n         \"<TIME />\",\n         \"<TIME></TIME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_time_nonce\"},\n    {input: \"<time srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<time></time>\",\n         \"<time>\",\n         \"<time/>\",\n         \"<time />\",\n         \"<table><time></time></table>\",\n         \"<table><time></table>\",\n         \"<TIME />\",\n         \"<TIME></TIME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_time_srcset\"},\n    {input: \"<time srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<time></time>\",\n         \"<time>\",\n         \"<time/>\",\n         \"<time />\",\n         \"<table><time></time></table>\",\n         \"<table><time></table>\",\n         \"<TIME />\",\n         \"<TIME></TIME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_time_srcdoc\"},\n    {input: \"<time poster=\\\"x\\\">\",\n     acceptable: [\n         \"<time></time>\",\n         \"<time>\",\n         \"<time/>\",\n         \"<time />\",\n         \"<table><time></time></table>\",\n         \"<table><time></table>\",\n         \"<TIME />\",\n         \"<TIME></TIME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_time_poster\"},\n    {input: \"<time autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<time></time>\",\n         \"<time>\",\n         \"<time/>\",\n         \"<time />\",\n         \"<table><time></time></table>\",\n         \"<table><time></table>\",\n         \"<TIME />\",\n         \"<TIME></TIME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_time_autoplay\"},\n    {input: \"<time controls=\\\"x\\\">\",\n     acceptable: [\n         \"<time></time>\",\n         \"<time>\",\n         \"<time/>\",\n         \"<time />\",\n         \"<table><time></time></table>\",\n         \"<table><time></table>\",\n         \"<TIME />\",\n         \"<TIME></TIME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_time_controls\"},\n    {input: \"<time formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<time></time>\",\n         \"<time>\",\n         \"<time/>\",\n         \"<time />\",\n         \"<table><time></time></table>\",\n         \"<table><time></table>\",\n         \"<TIME />\",\n         \"<TIME></TIME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_time_formaction\"},\n    {input: \"<time formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<time></time>\",\n         \"<time>\",\n         \"<time/>\",\n         \"<time />\",\n         \"<table><time></time></table>\",\n         \"<table><time></table>\",\n         \"<TIME />\",\n         \"<TIME></TIME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_time_formmethod\"},\n    {input: \"<time pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<time></time>\",\n         \"<time>\",\n         \"<time/>\",\n         \"<time />\",\n         \"<table><time></time></table>\",\n         \"<table><time></table>\",\n         \"<TIME />\",\n         \"<TIME></TIME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_time_pattern\"},\n    {input: \"<time icon=\\\"x\\\">\",\n     acceptable: [\n         \"<time></time>\",\n         \"<time>\",\n         \"<time/>\",\n         \"<time />\",\n         \"<table><time></time></table>\",\n         \"<table><time></table>\",\n         \"<TIME />\",\n         \"<TIME></TIME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_time_icon\"},\n    {input: \"<time select=\\\"x\\\">\",\n     acceptable: [\n         \"<time></time>\",\n         \"<time>\",\n         \"<time/>\",\n         \"<time />\",\n         \"<table><time></time></table>\",\n         \"<table><time></table>\",\n         \"<TIME />\",\n         \"<TIME></TIME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_time_select\"},\n    {input: \"<code></code>\",\n     acceptable: [\n         \"<code>\",\n         \"<code />\",\n         \"<code></code>\",\n         \"<table><code></code></table>\",\n         \"<CODE />\",\n         \"<CODE></CODE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_code_plain\"},\n    {input: \"<code><script>alert()</script></code>\",\n     acceptable: [\n         \"<code>\",\n         \"<code />\",\n         \"<code></code>\",\n         \"<table><code></code></table>\",\n         \"<CODE />\",\n         \"<CODE></CODE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><code><td></td></code></table>\",\n         \"<table><code></code><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_code_scriptinside\"},\n    {input: \"<code media=\\\"x\\\">\",\n     acceptable: [\n         \"<code></code>\",\n         \"<code>\",\n         \"<code/>\",\n         \"<code />\",\n         \"<table><code></code></table>\",\n         \"<table><code></table>\",\n         \"<CODE />\",\n         \"<CODE></CODE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_code_media\"},\n    {input: \"<code nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<code></code>\",\n         \"<code>\",\n         \"<code/>\",\n         \"<code />\",\n         \"<table><code></code></table>\",\n         \"<table><code></table>\",\n         \"<CODE />\",\n         \"<CODE></CODE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_code_nonce\"},\n    {input: \"<code srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<code></code>\",\n         \"<code>\",\n         \"<code/>\",\n         \"<code />\",\n         \"<table><code></code></table>\",\n         \"<table><code></table>\",\n         \"<CODE />\",\n         \"<CODE></CODE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_code_srcset\"},\n    {input: \"<code srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<code></code>\",\n         \"<code>\",\n         \"<code/>\",\n         \"<code />\",\n         \"<table><code></code></table>\",\n         \"<table><code></table>\",\n         \"<CODE />\",\n         \"<CODE></CODE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_code_srcdoc\"},\n    {input: \"<code poster=\\\"x\\\">\",\n     acceptable: [\n         \"<code></code>\",\n         \"<code>\",\n         \"<code/>\",\n         \"<code />\",\n         \"<table><code></code></table>\",\n         \"<table><code></table>\",\n         \"<CODE />\",\n         \"<CODE></CODE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_code_poster\"},\n    {input: \"<code autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<code></code>\",\n         \"<code>\",\n         \"<code/>\",\n         \"<code />\",\n         \"<table><code></code></table>\",\n         \"<table><code></table>\",\n         \"<CODE />\",\n         \"<CODE></CODE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_code_autoplay\"},\n    {input: \"<code controls=\\\"x\\\">\",\n     acceptable: [\n         \"<code></code>\",\n         \"<code>\",\n         \"<code/>\",\n         \"<code />\",\n         \"<table><code></code></table>\",\n         \"<table><code></table>\",\n         \"<CODE />\",\n         \"<CODE></CODE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_code_controls\"},\n    {input: \"<code formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<code></code>\",\n         \"<code>\",\n         \"<code/>\",\n         \"<code />\",\n         \"<table><code></code></table>\",\n         \"<table><code></table>\",\n         \"<CODE />\",\n         \"<CODE></CODE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_code_formaction\"},\n    {input: \"<code formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<code></code>\",\n         \"<code>\",\n         \"<code/>\",\n         \"<code />\",\n         \"<table><code></code></table>\",\n         \"<table><code></table>\",\n         \"<CODE />\",\n         \"<CODE></CODE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_code_formmethod\"},\n    {input: \"<code pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<code></code>\",\n         \"<code>\",\n         \"<code/>\",\n         \"<code />\",\n         \"<table><code></code></table>\",\n         \"<table><code></table>\",\n         \"<CODE />\",\n         \"<CODE></CODE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_code_pattern\"},\n    {input: \"<code icon=\\\"x\\\">\",\n     acceptable: [\n         \"<code></code>\",\n         \"<code>\",\n         \"<code/>\",\n         \"<code />\",\n         \"<table><code></code></table>\",\n         \"<table><code></table>\",\n         \"<CODE />\",\n         \"<CODE></CODE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_code_icon\"},\n    {input: \"<code select=\\\"x\\\">\",\n     acceptable: [\n         \"<code></code>\",\n         \"<code>\",\n         \"<code/>\",\n         \"<code />\",\n         \"<table><code></code></table>\",\n         \"<table><code></table>\",\n         \"<CODE />\",\n         \"<CODE></CODE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_code_select\"},\n    {input: \"<var></var>\",\n     acceptable: [\n         \"<var>\",\n         \"<var />\",\n         \"<var></var>\",\n         \"<table><var></var></table>\",\n         \"<VAR />\",\n         \"<VAR></VAR>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_var_plain\"},\n    {input: \"<var><script>alert()</script></var>\",\n     acceptable: [\n         \"<var>\",\n         \"<var />\",\n         \"<var></var>\",\n         \"<table><var></var></table>\",\n         \"<VAR />\",\n         \"<VAR></VAR>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><var><td></td></var></table>\",\n         \"<table><var></var><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_var_scriptinside\"},\n    {input: \"<var media=\\\"x\\\">\",\n     acceptable: [\n         \"<var></var>\",\n         \"<var>\",\n         \"<var/>\",\n         \"<var />\",\n         \"<table><var></var></table>\",\n         \"<table><var></table>\",\n         \"<VAR />\",\n         \"<VAR></VAR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_var_media\"},\n    {input: \"<var nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<var></var>\",\n         \"<var>\",\n         \"<var/>\",\n         \"<var />\",\n         \"<table><var></var></table>\",\n         \"<table><var></table>\",\n         \"<VAR />\",\n         \"<VAR></VAR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_var_nonce\"},\n    {input: \"<var srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<var></var>\",\n         \"<var>\",\n         \"<var/>\",\n         \"<var />\",\n         \"<table><var></var></table>\",\n         \"<table><var></table>\",\n         \"<VAR />\",\n         \"<VAR></VAR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_var_srcset\"},\n    {input: \"<var srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<var></var>\",\n         \"<var>\",\n         \"<var/>\",\n         \"<var />\",\n         \"<table><var></var></table>\",\n         \"<table><var></table>\",\n         \"<VAR />\",\n         \"<VAR></VAR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_var_srcdoc\"},\n    {input: \"<var poster=\\\"x\\\">\",\n     acceptable: [\n         \"<var></var>\",\n         \"<var>\",\n         \"<var/>\",\n         \"<var />\",\n         \"<table><var></var></table>\",\n         \"<table><var></table>\",\n         \"<VAR />\",\n         \"<VAR></VAR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_var_poster\"},\n    {input: \"<var autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<var></var>\",\n         \"<var>\",\n         \"<var/>\",\n         \"<var />\",\n         \"<table><var></var></table>\",\n         \"<table><var></table>\",\n         \"<VAR />\",\n         \"<VAR></VAR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_var_autoplay\"},\n    {input: \"<var controls=\\\"x\\\">\",\n     acceptable: [\n         \"<var></var>\",\n         \"<var>\",\n         \"<var/>\",\n         \"<var />\",\n         \"<table><var></var></table>\",\n         \"<table><var></table>\",\n         \"<VAR />\",\n         \"<VAR></VAR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_var_controls\"},\n    {input: \"<var formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<var></var>\",\n         \"<var>\",\n         \"<var/>\",\n         \"<var />\",\n         \"<table><var></var></table>\",\n         \"<table><var></table>\",\n         \"<VAR />\",\n         \"<VAR></VAR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_var_formaction\"},\n    {input: \"<var formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<var></var>\",\n         \"<var>\",\n         \"<var/>\",\n         \"<var />\",\n         \"<table><var></var></table>\",\n         \"<table><var></table>\",\n         \"<VAR />\",\n         \"<VAR></VAR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_var_formmethod\"},\n    {input: \"<var pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<var></var>\",\n         \"<var>\",\n         \"<var/>\",\n         \"<var />\",\n         \"<table><var></var></table>\",\n         \"<table><var></table>\",\n         \"<VAR />\",\n         \"<VAR></VAR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_var_pattern\"},\n    {input: \"<var icon=\\\"x\\\">\",\n     acceptable: [\n         \"<var></var>\",\n         \"<var>\",\n         \"<var/>\",\n         \"<var />\",\n         \"<table><var></var></table>\",\n         \"<table><var></table>\",\n         \"<VAR />\",\n         \"<VAR></VAR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_var_icon\"},\n    {input: \"<var select=\\\"x\\\">\",\n     acceptable: [\n         \"<var></var>\",\n         \"<var>\",\n         \"<var/>\",\n         \"<var />\",\n         \"<table><var></var></table>\",\n         \"<table><var></table>\",\n         \"<VAR />\",\n         \"<VAR></VAR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_var_select\"},\n    {input: \"<samp></samp>\",\n     acceptable: [\n         \"<samp>\",\n         \"<samp />\",\n         \"<samp></samp>\",\n         \"<table><samp></samp></table>\",\n         \"<SAMP />\",\n         \"<SAMP></SAMP>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_samp_plain\"},\n    {input: \"<samp><script>alert()</script></samp>\",\n     acceptable: [\n         \"<samp>\",\n         \"<samp />\",\n         \"<samp></samp>\",\n         \"<table><samp></samp></table>\",\n         \"<SAMP />\",\n         \"<SAMP></SAMP>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><samp><td></td></samp></table>\",\n         \"<table><samp></samp><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_samp_scriptinside\"},\n    {input: \"<samp media=\\\"x\\\">\",\n     acceptable: [\n         \"<samp></samp>\",\n         \"<samp>\",\n         \"<samp/>\",\n         \"<samp />\",\n         \"<table><samp></samp></table>\",\n         \"<table><samp></table>\",\n         \"<SAMP />\",\n         \"<SAMP></SAMP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_samp_media\"},\n    {input: \"<samp nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<samp></samp>\",\n         \"<samp>\",\n         \"<samp/>\",\n         \"<samp />\",\n         \"<table><samp></samp></table>\",\n         \"<table><samp></table>\",\n         \"<SAMP />\",\n         \"<SAMP></SAMP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_samp_nonce\"},\n    {input: \"<samp srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<samp></samp>\",\n         \"<samp>\",\n         \"<samp/>\",\n         \"<samp />\",\n         \"<table><samp></samp></table>\",\n         \"<table><samp></table>\",\n         \"<SAMP />\",\n         \"<SAMP></SAMP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_samp_srcset\"},\n    {input: \"<samp srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<samp></samp>\",\n         \"<samp>\",\n         \"<samp/>\",\n         \"<samp />\",\n         \"<table><samp></samp></table>\",\n         \"<table><samp></table>\",\n         \"<SAMP />\",\n         \"<SAMP></SAMP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_samp_srcdoc\"},\n    {input: \"<samp poster=\\\"x\\\">\",\n     acceptable: [\n         \"<samp></samp>\",\n         \"<samp>\",\n         \"<samp/>\",\n         \"<samp />\",\n         \"<table><samp></samp></table>\",\n         \"<table><samp></table>\",\n         \"<SAMP />\",\n         \"<SAMP></SAMP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_samp_poster\"},\n    {input: \"<samp autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<samp></samp>\",\n         \"<samp>\",\n         \"<samp/>\",\n         \"<samp />\",\n         \"<table><samp></samp></table>\",\n         \"<table><samp></table>\",\n         \"<SAMP />\",\n         \"<SAMP></SAMP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_samp_autoplay\"},\n    {input: \"<samp controls=\\\"x\\\">\",\n     acceptable: [\n         \"<samp></samp>\",\n         \"<samp>\",\n         \"<samp/>\",\n         \"<samp />\",\n         \"<table><samp></samp></table>\",\n         \"<table><samp></table>\",\n         \"<SAMP />\",\n         \"<SAMP></SAMP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_samp_controls\"},\n    {input: \"<samp formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<samp></samp>\",\n         \"<samp>\",\n         \"<samp/>\",\n         \"<samp />\",\n         \"<table><samp></samp></table>\",\n         \"<table><samp></table>\",\n         \"<SAMP />\",\n         \"<SAMP></SAMP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_samp_formaction\"},\n    {input: \"<samp formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<samp></samp>\",\n         \"<samp>\",\n         \"<samp/>\",\n         \"<samp />\",\n         \"<table><samp></samp></table>\",\n         \"<table><samp></table>\",\n         \"<SAMP />\",\n         \"<SAMP></SAMP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_samp_formmethod\"},\n    {input: \"<samp pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<samp></samp>\",\n         \"<samp>\",\n         \"<samp/>\",\n         \"<samp />\",\n         \"<table><samp></samp></table>\",\n         \"<table><samp></table>\",\n         \"<SAMP />\",\n         \"<SAMP></SAMP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_samp_pattern\"},\n    {input: \"<samp icon=\\\"x\\\">\",\n     acceptable: [\n         \"<samp></samp>\",\n         \"<samp>\",\n         \"<samp/>\",\n         \"<samp />\",\n         \"<table><samp></samp></table>\",\n         \"<table><samp></table>\",\n         \"<SAMP />\",\n         \"<SAMP></SAMP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_samp_icon\"},\n    {input: \"<samp select=\\\"x\\\">\",\n     acceptable: [\n         \"<samp></samp>\",\n         \"<samp>\",\n         \"<samp/>\",\n         \"<samp />\",\n         \"<table><samp></samp></table>\",\n         \"<table><samp></table>\",\n         \"<SAMP />\",\n         \"<SAMP></SAMP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_samp_select\"},\n    {input: \"<kbd></kbd>\",\n     acceptable: [\n         \"<kbd>\",\n         \"<kbd />\",\n         \"<kbd></kbd>\",\n         \"<table><kbd></kbd></table>\",\n         \"<KBD />\",\n         \"<KBD></KBD>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_kbd_plain\"},\n    {input: \"<kbd><script>alert()</script></kbd>\",\n     acceptable: [\n         \"<kbd>\",\n         \"<kbd />\",\n         \"<kbd></kbd>\",\n         \"<table><kbd></kbd></table>\",\n         \"<KBD />\",\n         \"<KBD></KBD>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><kbd><td></td></kbd></table>\",\n         \"<table><kbd></kbd><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_kbd_scriptinside\"},\n    {input: \"<kbd media=\\\"x\\\">\",\n     acceptable: [\n         \"<kbd></kbd>\",\n         \"<kbd>\",\n         \"<kbd/>\",\n         \"<kbd />\",\n         \"<table><kbd></kbd></table>\",\n         \"<table><kbd></table>\",\n         \"<KBD />\",\n         \"<KBD></KBD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_kbd_media\"},\n    {input: \"<kbd nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<kbd></kbd>\",\n         \"<kbd>\",\n         \"<kbd/>\",\n         \"<kbd />\",\n         \"<table><kbd></kbd></table>\",\n         \"<table><kbd></table>\",\n         \"<KBD />\",\n         \"<KBD></KBD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_kbd_nonce\"},\n    {input: \"<kbd srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<kbd></kbd>\",\n         \"<kbd>\",\n         \"<kbd/>\",\n         \"<kbd />\",\n         \"<table><kbd></kbd></table>\",\n         \"<table><kbd></table>\",\n         \"<KBD />\",\n         \"<KBD></KBD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_kbd_srcset\"},\n    {input: \"<kbd srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<kbd></kbd>\",\n         \"<kbd>\",\n         \"<kbd/>\",\n         \"<kbd />\",\n         \"<table><kbd></kbd></table>\",\n         \"<table><kbd></table>\",\n         \"<KBD />\",\n         \"<KBD></KBD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_kbd_srcdoc\"},\n    {input: \"<kbd poster=\\\"x\\\">\",\n     acceptable: [\n         \"<kbd></kbd>\",\n         \"<kbd>\",\n         \"<kbd/>\",\n         \"<kbd />\",\n         \"<table><kbd></kbd></table>\",\n         \"<table><kbd></table>\",\n         \"<KBD />\",\n         \"<KBD></KBD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_kbd_poster\"},\n    {input: \"<kbd autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<kbd></kbd>\",\n         \"<kbd>\",\n         \"<kbd/>\",\n         \"<kbd />\",\n         \"<table><kbd></kbd></table>\",\n         \"<table><kbd></table>\",\n         \"<KBD />\",\n         \"<KBD></KBD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_kbd_autoplay\"},\n    {input: \"<kbd controls=\\\"x\\\">\",\n     acceptable: [\n         \"<kbd></kbd>\",\n         \"<kbd>\",\n         \"<kbd/>\",\n         \"<kbd />\",\n         \"<table><kbd></kbd></table>\",\n         \"<table><kbd></table>\",\n         \"<KBD />\",\n         \"<KBD></KBD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_kbd_controls\"},\n    {input: \"<kbd formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<kbd></kbd>\",\n         \"<kbd>\",\n         \"<kbd/>\",\n         \"<kbd />\",\n         \"<table><kbd></kbd></table>\",\n         \"<table><kbd></table>\",\n         \"<KBD />\",\n         \"<KBD></KBD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_kbd_formaction\"},\n    {input: \"<kbd formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<kbd></kbd>\",\n         \"<kbd>\",\n         \"<kbd/>\",\n         \"<kbd />\",\n         \"<table><kbd></kbd></table>\",\n         \"<table><kbd></table>\",\n         \"<KBD />\",\n         \"<KBD></KBD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_kbd_formmethod\"},\n    {input: \"<kbd pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<kbd></kbd>\",\n         \"<kbd>\",\n         \"<kbd/>\",\n         \"<kbd />\",\n         \"<table><kbd></kbd></table>\",\n         \"<table><kbd></table>\",\n         \"<KBD />\",\n         \"<KBD></KBD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_kbd_pattern\"},\n    {input: \"<kbd icon=\\\"x\\\">\",\n     acceptable: [\n         \"<kbd></kbd>\",\n         \"<kbd>\",\n         \"<kbd/>\",\n         \"<kbd />\",\n         \"<table><kbd></kbd></table>\",\n         \"<table><kbd></table>\",\n         \"<KBD />\",\n         \"<KBD></KBD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_kbd_icon\"},\n    {input: \"<kbd select=\\\"x\\\">\",\n     acceptable: [\n         \"<kbd></kbd>\",\n         \"<kbd>\",\n         \"<kbd/>\",\n         \"<kbd />\",\n         \"<table><kbd></kbd></table>\",\n         \"<table><kbd></table>\",\n         \"<KBD />\",\n         \"<KBD></KBD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_kbd_select\"},\n    {input: \"<sub></sub>\",\n     acceptable: [\n         \"<sub>\",\n         \"<sub />\",\n         \"<sub></sub>\",\n         \"<table><sub></sub></table>\",\n         \"<SUB />\",\n         \"<SUB></SUB>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sub_plain\"},\n    {input: \"<sub><script>alert()</script></sub>\",\n     acceptable: [\n         \"<sub>\",\n         \"<sub />\",\n         \"<sub></sub>\",\n         \"<table><sub></sub></table>\",\n         \"<SUB />\",\n         \"<SUB></SUB>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><sub><td></td></sub></table>\",\n         \"<table><sub></sub><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_sub_scriptinside\"},\n    {input: \"<sub media=\\\"x\\\">\",\n     acceptable: [\n         \"<sub></sub>\",\n         \"<sub>\",\n         \"<sub/>\",\n         \"<sub />\",\n         \"<table><sub></sub></table>\",\n         \"<table><sub></table>\",\n         \"<SUB />\",\n         \"<SUB></SUB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sub_media\"},\n    {input: \"<sub nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<sub></sub>\",\n         \"<sub>\",\n         \"<sub/>\",\n         \"<sub />\",\n         \"<table><sub></sub></table>\",\n         \"<table><sub></table>\",\n         \"<SUB />\",\n         \"<SUB></SUB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sub_nonce\"},\n    {input: \"<sub srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<sub></sub>\",\n         \"<sub>\",\n         \"<sub/>\",\n         \"<sub />\",\n         \"<table><sub></sub></table>\",\n         \"<table><sub></table>\",\n         \"<SUB />\",\n         \"<SUB></SUB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sub_srcset\"},\n    {input: \"<sub srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<sub></sub>\",\n         \"<sub>\",\n         \"<sub/>\",\n         \"<sub />\",\n         \"<table><sub></sub></table>\",\n         \"<table><sub></table>\",\n         \"<SUB />\",\n         \"<SUB></SUB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sub_srcdoc\"},\n    {input: \"<sub poster=\\\"x\\\">\",\n     acceptable: [\n         \"<sub></sub>\",\n         \"<sub>\",\n         \"<sub/>\",\n         \"<sub />\",\n         \"<table><sub></sub></table>\",\n         \"<table><sub></table>\",\n         \"<SUB />\",\n         \"<SUB></SUB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sub_poster\"},\n    {input: \"<sub autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<sub></sub>\",\n         \"<sub>\",\n         \"<sub/>\",\n         \"<sub />\",\n         \"<table><sub></sub></table>\",\n         \"<table><sub></table>\",\n         \"<SUB />\",\n         \"<SUB></SUB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sub_autoplay\"},\n    {input: \"<sub controls=\\\"x\\\">\",\n     acceptable: [\n         \"<sub></sub>\",\n         \"<sub>\",\n         \"<sub/>\",\n         \"<sub />\",\n         \"<table><sub></sub></table>\",\n         \"<table><sub></table>\",\n         \"<SUB />\",\n         \"<SUB></SUB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sub_controls\"},\n    {input: \"<sub formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<sub></sub>\",\n         \"<sub>\",\n         \"<sub/>\",\n         \"<sub />\",\n         \"<table><sub></sub></table>\",\n         \"<table><sub></table>\",\n         \"<SUB />\",\n         \"<SUB></SUB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sub_formaction\"},\n    {input: \"<sub formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<sub></sub>\",\n         \"<sub>\",\n         \"<sub/>\",\n         \"<sub />\",\n         \"<table><sub></sub></table>\",\n         \"<table><sub></table>\",\n         \"<SUB />\",\n         \"<SUB></SUB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sub_formmethod\"},\n    {input: \"<sub pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<sub></sub>\",\n         \"<sub>\",\n         \"<sub/>\",\n         \"<sub />\",\n         \"<table><sub></sub></table>\",\n         \"<table><sub></table>\",\n         \"<SUB />\",\n         \"<SUB></SUB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sub_pattern\"},\n    {input: \"<sub icon=\\\"x\\\">\",\n     acceptable: [\n         \"<sub></sub>\",\n         \"<sub>\",\n         \"<sub/>\",\n         \"<sub />\",\n         \"<table><sub></sub></table>\",\n         \"<table><sub></table>\",\n         \"<SUB />\",\n         \"<SUB></SUB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sub_icon\"},\n    {input: \"<sub select=\\\"x\\\">\",\n     acceptable: [\n         \"<sub></sub>\",\n         \"<sub>\",\n         \"<sub/>\",\n         \"<sub />\",\n         \"<table><sub></sub></table>\",\n         \"<table><sub></table>\",\n         \"<SUB />\",\n         \"<SUB></SUB>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sub_select\"},\n    {input: \"<sup></sup>\",\n     acceptable: [\n         \"<sup>\",\n         \"<sup />\",\n         \"<sup></sup>\",\n         \"<table><sup></sup></table>\",\n         \"<SUP />\",\n         \"<SUP></SUP>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sup_plain\"},\n    {input: \"<sup><script>alert()</script></sup>\",\n     acceptable: [\n         \"<sup>\",\n         \"<sup />\",\n         \"<sup></sup>\",\n         \"<table><sup></sup></table>\",\n         \"<SUP />\",\n         \"<SUP></SUP>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><sup><td></td></sup></table>\",\n         \"<table><sup></sup><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_sup_scriptinside\"},\n    {input: \"<sup media=\\\"x\\\">\",\n     acceptable: [\n         \"<sup></sup>\",\n         \"<sup>\",\n         \"<sup/>\",\n         \"<sup />\",\n         \"<table><sup></sup></table>\",\n         \"<table><sup></table>\",\n         \"<SUP />\",\n         \"<SUP></SUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sup_media\"},\n    {input: \"<sup nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<sup></sup>\",\n         \"<sup>\",\n         \"<sup/>\",\n         \"<sup />\",\n         \"<table><sup></sup></table>\",\n         \"<table><sup></table>\",\n         \"<SUP />\",\n         \"<SUP></SUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sup_nonce\"},\n    {input: \"<sup srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<sup></sup>\",\n         \"<sup>\",\n         \"<sup/>\",\n         \"<sup />\",\n         \"<table><sup></sup></table>\",\n         \"<table><sup></table>\",\n         \"<SUP />\",\n         \"<SUP></SUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sup_srcset\"},\n    {input: \"<sup srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<sup></sup>\",\n         \"<sup>\",\n         \"<sup/>\",\n         \"<sup />\",\n         \"<table><sup></sup></table>\",\n         \"<table><sup></table>\",\n         \"<SUP />\",\n         \"<SUP></SUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sup_srcdoc\"},\n    {input: \"<sup poster=\\\"x\\\">\",\n     acceptable: [\n         \"<sup></sup>\",\n         \"<sup>\",\n         \"<sup/>\",\n         \"<sup />\",\n         \"<table><sup></sup></table>\",\n         \"<table><sup></table>\",\n         \"<SUP />\",\n         \"<SUP></SUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sup_poster\"},\n    {input: \"<sup autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<sup></sup>\",\n         \"<sup>\",\n         \"<sup/>\",\n         \"<sup />\",\n         \"<table><sup></sup></table>\",\n         \"<table><sup></table>\",\n         \"<SUP />\",\n         \"<SUP></SUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sup_autoplay\"},\n    {input: \"<sup controls=\\\"x\\\">\",\n     acceptable: [\n         \"<sup></sup>\",\n         \"<sup>\",\n         \"<sup/>\",\n         \"<sup />\",\n         \"<table><sup></sup></table>\",\n         \"<table><sup></table>\",\n         \"<SUP />\",\n         \"<SUP></SUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sup_controls\"},\n    {input: \"<sup formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<sup></sup>\",\n         \"<sup>\",\n         \"<sup/>\",\n         \"<sup />\",\n         \"<table><sup></sup></table>\",\n         \"<table><sup></table>\",\n         \"<SUP />\",\n         \"<SUP></SUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sup_formaction\"},\n    {input: \"<sup formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<sup></sup>\",\n         \"<sup>\",\n         \"<sup/>\",\n         \"<sup />\",\n         \"<table><sup></sup></table>\",\n         \"<table><sup></table>\",\n         \"<SUP />\",\n         \"<SUP></SUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sup_formmethod\"},\n    {input: \"<sup pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<sup></sup>\",\n         \"<sup>\",\n         \"<sup/>\",\n         \"<sup />\",\n         \"<table><sup></sup></table>\",\n         \"<table><sup></table>\",\n         \"<SUP />\",\n         \"<SUP></SUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sup_pattern\"},\n    {input: \"<sup icon=\\\"x\\\">\",\n     acceptable: [\n         \"<sup></sup>\",\n         \"<sup>\",\n         \"<sup/>\",\n         \"<sup />\",\n         \"<table><sup></sup></table>\",\n         \"<table><sup></table>\",\n         \"<SUP />\",\n         \"<SUP></SUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sup_icon\"},\n    {input: \"<sup select=\\\"x\\\">\",\n     acceptable: [\n         \"<sup></sup>\",\n         \"<sup>\",\n         \"<sup/>\",\n         \"<sup />\",\n         \"<table><sup></sup></table>\",\n         \"<table><sup></table>\",\n         \"<SUP />\",\n         \"<SUP></SUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_sup_select\"},\n    {input: \"<i></i>\",\n     acceptable: [\n         \"<i>\",\n         \"<i />\",\n         \"<i></i>\",\n         \"<table><i></i></table>\",\n         \"<I />\",\n         \"<I></I>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_i_plain\"},\n    {input: \"<i><script>alert()</script></i>\",\n     acceptable: [\n         \"<i>\",\n         \"<i />\",\n         \"<i></i>\",\n         \"<table><i></i></table>\",\n         \"<I />\",\n         \"<I></I>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><i><td></td></i></table>\",\n         \"<table><i></i><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_i_scriptinside\"},\n    {input: \"<i media=\\\"x\\\">\",\n     acceptable: [\n         \"<i></i>\",\n         \"<i>\",\n         \"<i/>\",\n         \"<i />\",\n         \"<table><i></i></table>\",\n         \"<table><i></table>\",\n         \"<I />\",\n         \"<I></I>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_i_media\"},\n    {input: \"<i nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<i></i>\",\n         \"<i>\",\n         \"<i/>\",\n         \"<i />\",\n         \"<table><i></i></table>\",\n         \"<table><i></table>\",\n         \"<I />\",\n         \"<I></I>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_i_nonce\"},\n    {input: \"<i srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<i></i>\",\n         \"<i>\",\n         \"<i/>\",\n         \"<i />\",\n         \"<table><i></i></table>\",\n         \"<table><i></table>\",\n         \"<I />\",\n         \"<I></I>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_i_srcset\"},\n    {input: \"<i srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<i></i>\",\n         \"<i>\",\n         \"<i/>\",\n         \"<i />\",\n         \"<table><i></i></table>\",\n         \"<table><i></table>\",\n         \"<I />\",\n         \"<I></I>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_i_srcdoc\"},\n    {input: \"<i poster=\\\"x\\\">\",\n     acceptable: [\n         \"<i></i>\",\n         \"<i>\",\n         \"<i/>\",\n         \"<i />\",\n         \"<table><i></i></table>\",\n         \"<table><i></table>\",\n         \"<I />\",\n         \"<I></I>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_i_poster\"},\n    {input: \"<i autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<i></i>\",\n         \"<i>\",\n         \"<i/>\",\n         \"<i />\",\n         \"<table><i></i></table>\",\n         \"<table><i></table>\",\n         \"<I />\",\n         \"<I></I>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_i_autoplay\"},\n    {input: \"<i controls=\\\"x\\\">\",\n     acceptable: [\n         \"<i></i>\",\n         \"<i>\",\n         \"<i/>\",\n         \"<i />\",\n         \"<table><i></i></table>\",\n         \"<table><i></table>\",\n         \"<I />\",\n         \"<I></I>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_i_controls\"},\n    {input: \"<i formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<i></i>\",\n         \"<i>\",\n         \"<i/>\",\n         \"<i />\",\n         \"<table><i></i></table>\",\n         \"<table><i></table>\",\n         \"<I />\",\n         \"<I></I>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_i_formaction\"},\n    {input: \"<i formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<i></i>\",\n         \"<i>\",\n         \"<i/>\",\n         \"<i />\",\n         \"<table><i></i></table>\",\n         \"<table><i></table>\",\n         \"<I />\",\n         \"<I></I>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_i_formmethod\"},\n    {input: \"<i pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<i></i>\",\n         \"<i>\",\n         \"<i/>\",\n         \"<i />\",\n         \"<table><i></i></table>\",\n         \"<table><i></table>\",\n         \"<I />\",\n         \"<I></I>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_i_pattern\"},\n    {input: \"<i icon=\\\"x\\\">\",\n     acceptable: [\n         \"<i></i>\",\n         \"<i>\",\n         \"<i/>\",\n         \"<i />\",\n         \"<table><i></i></table>\",\n         \"<table><i></table>\",\n         \"<I />\",\n         \"<I></I>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_i_icon\"},\n    {input: \"<i select=\\\"x\\\">\",\n     acceptable: [\n         \"<i></i>\",\n         \"<i>\",\n         \"<i/>\",\n         \"<i />\",\n         \"<table><i></i></table>\",\n         \"<table><i></table>\",\n         \"<I />\",\n         \"<I></I>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_i_select\"},\n    {input: \"<b></b>\",\n     acceptable: [\n         \"<b>\",\n         \"<b />\",\n         \"<b></b>\",\n         \"<table><b></b></table>\",\n         \"<B />\",\n         \"<B></B>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_b_plain\"},\n    {input: \"<b><script>alert()</script></b>\",\n     acceptable: [\n         \"<b>\",\n         \"<b />\",\n         \"<b></b>\",\n         \"<table><b></b></table>\",\n         \"<B />\",\n         \"<B></B>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><b><td></td></b></table>\",\n         \"<table><b></b><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_b_scriptinside\"},\n    {input: \"<b media=\\\"x\\\">\",\n     acceptable: [\n         \"<b></b>\",\n         \"<b>\",\n         \"<b/>\",\n         \"<b />\",\n         \"<table><b></b></table>\",\n         \"<table><b></table>\",\n         \"<B />\",\n         \"<B></B>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_b_media\"},\n    {input: \"<b nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<b></b>\",\n         \"<b>\",\n         \"<b/>\",\n         \"<b />\",\n         \"<table><b></b></table>\",\n         \"<table><b></table>\",\n         \"<B />\",\n         \"<B></B>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_b_nonce\"},\n    {input: \"<b srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<b></b>\",\n         \"<b>\",\n         \"<b/>\",\n         \"<b />\",\n         \"<table><b></b></table>\",\n         \"<table><b></table>\",\n         \"<B />\",\n         \"<B></B>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_b_srcset\"},\n    {input: \"<b srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<b></b>\",\n         \"<b>\",\n         \"<b/>\",\n         \"<b />\",\n         \"<table><b></b></table>\",\n         \"<table><b></table>\",\n         \"<B />\",\n         \"<B></B>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_b_srcdoc\"},\n    {input: \"<b poster=\\\"x\\\">\",\n     acceptable: [\n         \"<b></b>\",\n         \"<b>\",\n         \"<b/>\",\n         \"<b />\",\n         \"<table><b></b></table>\",\n         \"<table><b></table>\",\n         \"<B />\",\n         \"<B></B>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_b_poster\"},\n    {input: \"<b autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<b></b>\",\n         \"<b>\",\n         \"<b/>\",\n         \"<b />\",\n         \"<table><b></b></table>\",\n         \"<table><b></table>\",\n         \"<B />\",\n         \"<B></B>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_b_autoplay\"},\n    {input: \"<b controls=\\\"x\\\">\",\n     acceptable: [\n         \"<b></b>\",\n         \"<b>\",\n         \"<b/>\",\n         \"<b />\",\n         \"<table><b></b></table>\",\n         \"<table><b></table>\",\n         \"<B />\",\n         \"<B></B>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_b_controls\"},\n    {input: \"<b formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<b></b>\",\n         \"<b>\",\n         \"<b/>\",\n         \"<b />\",\n         \"<table><b></b></table>\",\n         \"<table><b></table>\",\n         \"<B />\",\n         \"<B></B>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_b_formaction\"},\n    {input: \"<b formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<b></b>\",\n         \"<b>\",\n         \"<b/>\",\n         \"<b />\",\n         \"<table><b></b></table>\",\n         \"<table><b></table>\",\n         \"<B />\",\n         \"<B></B>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_b_formmethod\"},\n    {input: \"<b pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<b></b>\",\n         \"<b>\",\n         \"<b/>\",\n         \"<b />\",\n         \"<table><b></b></table>\",\n         \"<table><b></table>\",\n         \"<B />\",\n         \"<B></B>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_b_pattern\"},\n    {input: \"<b icon=\\\"x\\\">\",\n     acceptable: [\n         \"<b></b>\",\n         \"<b>\",\n         \"<b/>\",\n         \"<b />\",\n         \"<table><b></b></table>\",\n         \"<table><b></table>\",\n         \"<B />\",\n         \"<B></B>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_b_icon\"},\n    {input: \"<b select=\\\"x\\\">\",\n     acceptable: [\n         \"<b></b>\",\n         \"<b>\",\n         \"<b/>\",\n         \"<b />\",\n         \"<table><b></b></table>\",\n         \"<table><b></table>\",\n         \"<B />\",\n         \"<B></B>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_b_select\"},\n    {input: \"<u></u>\",\n     acceptable: [\n         \"<u>\",\n         \"<u />\",\n         \"<u></u>\",\n         \"<table><u></u></table>\",\n         \"<U />\",\n         \"<U></U>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_u_plain\"},\n    {input: \"<u><script>alert()</script></u>\",\n     acceptable: [\n         \"<u>\",\n         \"<u />\",\n         \"<u></u>\",\n         \"<table><u></u></table>\",\n         \"<U />\",\n         \"<U></U>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><u><td></td></u></table>\",\n         \"<table><u></u><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_u_scriptinside\"},\n    {input: \"<u media=\\\"x\\\">\",\n     acceptable: [\n         \"<u></u>\",\n         \"<u>\",\n         \"<u/>\",\n         \"<u />\",\n         \"<table><u></u></table>\",\n         \"<table><u></table>\",\n         \"<U />\",\n         \"<U></U>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_u_media\"},\n    {input: \"<u nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<u></u>\",\n         \"<u>\",\n         \"<u/>\",\n         \"<u />\",\n         \"<table><u></u></table>\",\n         \"<table><u></table>\",\n         \"<U />\",\n         \"<U></U>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_u_nonce\"},\n    {input: \"<u srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<u></u>\",\n         \"<u>\",\n         \"<u/>\",\n         \"<u />\",\n         \"<table><u></u></table>\",\n         \"<table><u></table>\",\n         \"<U />\",\n         \"<U></U>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_u_srcset\"},\n    {input: \"<u srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<u></u>\",\n         \"<u>\",\n         \"<u/>\",\n         \"<u />\",\n         \"<table><u></u></table>\",\n         \"<table><u></table>\",\n         \"<U />\",\n         \"<U></U>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_u_srcdoc\"},\n    {input: \"<u poster=\\\"x\\\">\",\n     acceptable: [\n         \"<u></u>\",\n         \"<u>\",\n         \"<u/>\",\n         \"<u />\",\n         \"<table><u></u></table>\",\n         \"<table><u></table>\",\n         \"<U />\",\n         \"<U></U>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_u_poster\"},\n    {input: \"<u autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<u></u>\",\n         \"<u>\",\n         \"<u/>\",\n         \"<u />\",\n         \"<table><u></u></table>\",\n         \"<table><u></table>\",\n         \"<U />\",\n         \"<U></U>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_u_autoplay\"},\n    {input: \"<u controls=\\\"x\\\">\",\n     acceptable: [\n         \"<u></u>\",\n         \"<u>\",\n         \"<u/>\",\n         \"<u />\",\n         \"<table><u></u></table>\",\n         \"<table><u></table>\",\n         \"<U />\",\n         \"<U></U>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_u_controls\"},\n    {input: \"<u formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<u></u>\",\n         \"<u>\",\n         \"<u/>\",\n         \"<u />\",\n         \"<table><u></u></table>\",\n         \"<table><u></table>\",\n         \"<U />\",\n         \"<U></U>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_u_formaction\"},\n    {input: \"<u formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<u></u>\",\n         \"<u>\",\n         \"<u/>\",\n         \"<u />\",\n         \"<table><u></u></table>\",\n         \"<table><u></table>\",\n         \"<U />\",\n         \"<U></U>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_u_formmethod\"},\n    {input: \"<u pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<u></u>\",\n         \"<u>\",\n         \"<u/>\",\n         \"<u />\",\n         \"<table><u></u></table>\",\n         \"<table><u></table>\",\n         \"<U />\",\n         \"<U></U>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_u_pattern\"},\n    {input: \"<u icon=\\\"x\\\">\",\n     acceptable: [\n         \"<u></u>\",\n         \"<u>\",\n         \"<u/>\",\n         \"<u />\",\n         \"<table><u></u></table>\",\n         \"<table><u></table>\",\n         \"<U />\",\n         \"<U></U>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_u_icon\"},\n    {input: \"<u select=\\\"x\\\">\",\n     acceptable: [\n         \"<u></u>\",\n         \"<u>\",\n         \"<u/>\",\n         \"<u />\",\n         \"<table><u></u></table>\",\n         \"<table><u></table>\",\n         \"<U />\",\n         \"<U></U>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_u_select\"},\n    {input: \"<mark></mark>\",\n     acceptable: [\n         \"<mark>\",\n         \"<mark />\",\n         \"<mark></mark>\",\n         \"<table><mark></mark></table>\",\n         \"<MARK />\",\n         \"<MARK></MARK>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_mark_plain\"},\n    {input: \"<mark><script>alert()</script></mark>\",\n     acceptable: [\n         \"<mark>\",\n         \"<mark />\",\n         \"<mark></mark>\",\n         \"<table><mark></mark></table>\",\n         \"<MARK />\",\n         \"<MARK></MARK>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><mark><td></td></mark></table>\",\n         \"<table><mark></mark><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_mark_scriptinside\"},\n    {input: \"<mark media=\\\"x\\\">\",\n     acceptable: [\n         \"<mark></mark>\",\n         \"<mark>\",\n         \"<mark/>\",\n         \"<mark />\",\n         \"<table><mark></mark></table>\",\n         \"<table><mark></table>\",\n         \"<MARK />\",\n         \"<MARK></MARK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_mark_media\"},\n    {input: \"<mark nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<mark></mark>\",\n         \"<mark>\",\n         \"<mark/>\",\n         \"<mark />\",\n         \"<table><mark></mark></table>\",\n         \"<table><mark></table>\",\n         \"<MARK />\",\n         \"<MARK></MARK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_mark_nonce\"},\n    {input: \"<mark srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<mark></mark>\",\n         \"<mark>\",\n         \"<mark/>\",\n         \"<mark />\",\n         \"<table><mark></mark></table>\",\n         \"<table><mark></table>\",\n         \"<MARK />\",\n         \"<MARK></MARK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_mark_srcset\"},\n    {input: \"<mark srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<mark></mark>\",\n         \"<mark>\",\n         \"<mark/>\",\n         \"<mark />\",\n         \"<table><mark></mark></table>\",\n         \"<table><mark></table>\",\n         \"<MARK />\",\n         \"<MARK></MARK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_mark_srcdoc\"},\n    {input: \"<mark poster=\\\"x\\\">\",\n     acceptable: [\n         \"<mark></mark>\",\n         \"<mark>\",\n         \"<mark/>\",\n         \"<mark />\",\n         \"<table><mark></mark></table>\",\n         \"<table><mark></table>\",\n         \"<MARK />\",\n         \"<MARK></MARK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_mark_poster\"},\n    {input: \"<mark autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<mark></mark>\",\n         \"<mark>\",\n         \"<mark/>\",\n         \"<mark />\",\n         \"<table><mark></mark></table>\",\n         \"<table><mark></table>\",\n         \"<MARK />\",\n         \"<MARK></MARK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_mark_autoplay\"},\n    {input: \"<mark controls=\\\"x\\\">\",\n     acceptable: [\n         \"<mark></mark>\",\n         \"<mark>\",\n         \"<mark/>\",\n         \"<mark />\",\n         \"<table><mark></mark></table>\",\n         \"<table><mark></table>\",\n         \"<MARK />\",\n         \"<MARK></MARK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_mark_controls\"},\n    {input: \"<mark formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<mark></mark>\",\n         \"<mark>\",\n         \"<mark/>\",\n         \"<mark />\",\n         \"<table><mark></mark></table>\",\n         \"<table><mark></table>\",\n         \"<MARK />\",\n         \"<MARK></MARK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_mark_formaction\"},\n    {input: \"<mark formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<mark></mark>\",\n         \"<mark>\",\n         \"<mark/>\",\n         \"<mark />\",\n         \"<table><mark></mark></table>\",\n         \"<table><mark></table>\",\n         \"<MARK />\",\n         \"<MARK></MARK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_mark_formmethod\"},\n    {input: \"<mark pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<mark></mark>\",\n         \"<mark>\",\n         \"<mark/>\",\n         \"<mark />\",\n         \"<table><mark></mark></table>\",\n         \"<table><mark></table>\",\n         \"<MARK />\",\n         \"<MARK></MARK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_mark_pattern\"},\n    {input: \"<mark icon=\\\"x\\\">\",\n     acceptable: [\n         \"<mark></mark>\",\n         \"<mark>\",\n         \"<mark/>\",\n         \"<mark />\",\n         \"<table><mark></mark></table>\",\n         \"<table><mark></table>\",\n         \"<MARK />\",\n         \"<MARK></MARK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_mark_icon\"},\n    {input: \"<mark select=\\\"x\\\">\",\n     acceptable: [\n         \"<mark></mark>\",\n         \"<mark>\",\n         \"<mark/>\",\n         \"<mark />\",\n         \"<table><mark></mark></table>\",\n         \"<table><mark></table>\",\n         \"<MARK />\",\n         \"<MARK></MARK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_mark_select\"},\n    {input: \"<bdi></bdi>\",\n     acceptable: [\n         \"<bdi>\",\n         \"<bdi />\",\n         \"<bdi></bdi>\",\n         \"<table><bdi></bdi></table>\",\n         \"<BDI />\",\n         \"<BDI></BDI>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdi_plain\"},\n    {input: \"<bdi><script>alert()</script></bdi>\",\n     acceptable: [\n         \"<bdi>\",\n         \"<bdi />\",\n         \"<bdi></bdi>\",\n         \"<table><bdi></bdi></table>\",\n         \"<BDI />\",\n         \"<BDI></BDI>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><bdi><td></td></bdi></table>\",\n         \"<table><bdi></bdi><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_bdi_scriptinside\"},\n    {input: \"<bdi media=\\\"x\\\">\",\n     acceptable: [\n         \"<bdi></bdi>\",\n         \"<bdi>\",\n         \"<bdi/>\",\n         \"<bdi />\",\n         \"<table><bdi></bdi></table>\",\n         \"<table><bdi></table>\",\n         \"<BDI />\",\n         \"<BDI></BDI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdi_media\"},\n    {input: \"<bdi nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<bdi></bdi>\",\n         \"<bdi>\",\n         \"<bdi/>\",\n         \"<bdi />\",\n         \"<table><bdi></bdi></table>\",\n         \"<table><bdi></table>\",\n         \"<BDI />\",\n         \"<BDI></BDI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdi_nonce\"},\n    {input: \"<bdi srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<bdi></bdi>\",\n         \"<bdi>\",\n         \"<bdi/>\",\n         \"<bdi />\",\n         \"<table><bdi></bdi></table>\",\n         \"<table><bdi></table>\",\n         \"<BDI />\",\n         \"<BDI></BDI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdi_srcset\"},\n    {input: \"<bdi srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<bdi></bdi>\",\n         \"<bdi>\",\n         \"<bdi/>\",\n         \"<bdi />\",\n         \"<table><bdi></bdi></table>\",\n         \"<table><bdi></table>\",\n         \"<BDI />\",\n         \"<BDI></BDI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdi_srcdoc\"},\n    {input: \"<bdi poster=\\\"x\\\">\",\n     acceptable: [\n         \"<bdi></bdi>\",\n         \"<bdi>\",\n         \"<bdi/>\",\n         \"<bdi />\",\n         \"<table><bdi></bdi></table>\",\n         \"<table><bdi></table>\",\n         \"<BDI />\",\n         \"<BDI></BDI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdi_poster\"},\n    {input: \"<bdi autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<bdi></bdi>\",\n         \"<bdi>\",\n         \"<bdi/>\",\n         \"<bdi />\",\n         \"<table><bdi></bdi></table>\",\n         \"<table><bdi></table>\",\n         \"<BDI />\",\n         \"<BDI></BDI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdi_autoplay\"},\n    {input: \"<bdi controls=\\\"x\\\">\",\n     acceptable: [\n         \"<bdi></bdi>\",\n         \"<bdi>\",\n         \"<bdi/>\",\n         \"<bdi />\",\n         \"<table><bdi></bdi></table>\",\n         \"<table><bdi></table>\",\n         \"<BDI />\",\n         \"<BDI></BDI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdi_controls\"},\n    {input: \"<bdi formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<bdi></bdi>\",\n         \"<bdi>\",\n         \"<bdi/>\",\n         \"<bdi />\",\n         \"<table><bdi></bdi></table>\",\n         \"<table><bdi></table>\",\n         \"<BDI />\",\n         \"<BDI></BDI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdi_formaction\"},\n    {input: \"<bdi formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<bdi></bdi>\",\n         \"<bdi>\",\n         \"<bdi/>\",\n         \"<bdi />\",\n         \"<table><bdi></bdi></table>\",\n         \"<table><bdi></table>\",\n         \"<BDI />\",\n         \"<BDI></BDI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdi_formmethod\"},\n    {input: \"<bdi pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<bdi></bdi>\",\n         \"<bdi>\",\n         \"<bdi/>\",\n         \"<bdi />\",\n         \"<table><bdi></bdi></table>\",\n         \"<table><bdi></table>\",\n         \"<BDI />\",\n         \"<BDI></BDI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdi_pattern\"},\n    {input: \"<bdi icon=\\\"x\\\">\",\n     acceptable: [\n         \"<bdi></bdi>\",\n         \"<bdi>\",\n         \"<bdi/>\",\n         \"<bdi />\",\n         \"<table><bdi></bdi></table>\",\n         \"<table><bdi></table>\",\n         \"<BDI />\",\n         \"<BDI></BDI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdi_icon\"},\n    {input: \"<bdi select=\\\"x\\\">\",\n     acceptable: [\n         \"<bdi></bdi>\",\n         \"<bdi>\",\n         \"<bdi/>\",\n         \"<bdi />\",\n         \"<table><bdi></bdi></table>\",\n         \"<table><bdi></table>\",\n         \"<BDI />\",\n         \"<BDI></BDI>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdi_select\"},\n    {input: \"<bdo></bdo>\",\n     acceptable: [\n         \"<bdo>\",\n         \"<bdo />\",\n         \"<bdo></bdo>\",\n         \"<table><bdo></bdo></table>\",\n         \"<BDO />\",\n         \"<BDO></BDO>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdo_plain\"},\n    {input: \"<bdo><script>alert()</script></bdo>\",\n     acceptable: [\n         \"<bdo>\",\n         \"<bdo />\",\n         \"<bdo></bdo>\",\n         \"<table><bdo></bdo></table>\",\n         \"<BDO />\",\n         \"<BDO></BDO>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><bdo><td></td></bdo></table>\",\n         \"<table><bdo></bdo><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_bdo_scriptinside\"},\n    {input: \"<bdo media=\\\"x\\\">\",\n     acceptable: [\n         \"<bdo></bdo>\",\n         \"<bdo>\",\n         \"<bdo/>\",\n         \"<bdo />\",\n         \"<table><bdo></bdo></table>\",\n         \"<table><bdo></table>\",\n         \"<BDO />\",\n         \"<BDO></BDO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdo_media\"},\n    {input: \"<bdo nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<bdo></bdo>\",\n         \"<bdo>\",\n         \"<bdo/>\",\n         \"<bdo />\",\n         \"<table><bdo></bdo></table>\",\n         \"<table><bdo></table>\",\n         \"<BDO />\",\n         \"<BDO></BDO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdo_nonce\"},\n    {input: \"<bdo srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<bdo></bdo>\",\n         \"<bdo>\",\n         \"<bdo/>\",\n         \"<bdo />\",\n         \"<table><bdo></bdo></table>\",\n         \"<table><bdo></table>\",\n         \"<BDO />\",\n         \"<BDO></BDO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdo_srcset\"},\n    {input: \"<bdo srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<bdo></bdo>\",\n         \"<bdo>\",\n         \"<bdo/>\",\n         \"<bdo />\",\n         \"<table><bdo></bdo></table>\",\n         \"<table><bdo></table>\",\n         \"<BDO />\",\n         \"<BDO></BDO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdo_srcdoc\"},\n    {input: \"<bdo poster=\\\"x\\\">\",\n     acceptable: [\n         \"<bdo></bdo>\",\n         \"<bdo>\",\n         \"<bdo/>\",\n         \"<bdo />\",\n         \"<table><bdo></bdo></table>\",\n         \"<table><bdo></table>\",\n         \"<BDO />\",\n         \"<BDO></BDO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdo_poster\"},\n    {input: \"<bdo autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<bdo></bdo>\",\n         \"<bdo>\",\n         \"<bdo/>\",\n         \"<bdo />\",\n         \"<table><bdo></bdo></table>\",\n         \"<table><bdo></table>\",\n         \"<BDO />\",\n         \"<BDO></BDO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdo_autoplay\"},\n    {input: \"<bdo controls=\\\"x\\\">\",\n     acceptable: [\n         \"<bdo></bdo>\",\n         \"<bdo>\",\n         \"<bdo/>\",\n         \"<bdo />\",\n         \"<table><bdo></bdo></table>\",\n         \"<table><bdo></table>\",\n         \"<BDO />\",\n         \"<BDO></BDO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdo_controls\"},\n    {input: \"<bdo formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<bdo></bdo>\",\n         \"<bdo>\",\n         \"<bdo/>\",\n         \"<bdo />\",\n         \"<table><bdo></bdo></table>\",\n         \"<table><bdo></table>\",\n         \"<BDO />\",\n         \"<BDO></BDO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdo_formaction\"},\n    {input: \"<bdo formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<bdo></bdo>\",\n         \"<bdo>\",\n         \"<bdo/>\",\n         \"<bdo />\",\n         \"<table><bdo></bdo></table>\",\n         \"<table><bdo></table>\",\n         \"<BDO />\",\n         \"<BDO></BDO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdo_formmethod\"},\n    {input: \"<bdo pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<bdo></bdo>\",\n         \"<bdo>\",\n         \"<bdo/>\",\n         \"<bdo />\",\n         \"<table><bdo></bdo></table>\",\n         \"<table><bdo></table>\",\n         \"<BDO />\",\n         \"<BDO></BDO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdo_pattern\"},\n    {input: \"<bdo icon=\\\"x\\\">\",\n     acceptable: [\n         \"<bdo></bdo>\",\n         \"<bdo>\",\n         \"<bdo/>\",\n         \"<bdo />\",\n         \"<table><bdo></bdo></table>\",\n         \"<table><bdo></table>\",\n         \"<BDO />\",\n         \"<BDO></BDO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdo_icon\"},\n    {input: \"<bdo select=\\\"x\\\">\",\n     acceptable: [\n         \"<bdo></bdo>\",\n         \"<bdo>\",\n         \"<bdo/>\",\n         \"<bdo />\",\n         \"<table><bdo></bdo></table>\",\n         \"<table><bdo></table>\",\n         \"<BDO />\",\n         \"<BDO></BDO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_bdo_select\"},\n    {input: \"<span></span>\",\n     acceptable: [\n         \"<span>\",\n         \"<span />\",\n         \"<span></span>\",\n         \"<table><span></span></table>\",\n         \"<SPAN />\",\n         \"<SPAN></SPAN>\",\n         \"\",\n     ],\n     name: \"contract_span_plain\"},\n    {input: \"<span><script>alert()</script></span>\",\n     acceptable: [\n         \"<span>\",\n         \"<span />\",\n         \"<span></span>\",\n         \"<table><span></span></table>\",\n         \"<SPAN />\",\n         \"<SPAN></SPAN>\",\n         \"\",\n         \"<table><span><td></td></span></table>\",\n         \"<table><span></span><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_span_scriptinside\"},\n    {input: \"<span media=\\\"x\\\">\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span>\",\n         \"<span/>\",\n         \"<span />\",\n         \"<table><span></span></table>\",\n         \"<table><span></table>\",\n         \"<SPAN />\",\n         \"<SPAN></SPAN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"\",\n     ],\n     name: \"contract_span_media\"},\n    {input: \"<span nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span>\",\n         \"<span/>\",\n         \"<span />\",\n         \"<table><span></span></table>\",\n         \"<table><span></table>\",\n         \"<SPAN />\",\n         \"<SPAN></SPAN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"\",\n     ],\n     name: \"contract_span_nonce\"},\n    {input: \"<span srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span>\",\n         \"<span/>\",\n         \"<span />\",\n         \"<table><span></span></table>\",\n         \"<table><span></table>\",\n         \"<SPAN />\",\n         \"<SPAN></SPAN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"\",\n     ],\n     name: \"contract_span_srcset\"},\n    {input: \"<span srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span>\",\n         \"<span/>\",\n         \"<span />\",\n         \"<table><span></span></table>\",\n         \"<table><span></table>\",\n         \"<SPAN />\",\n         \"<SPAN></SPAN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"\",\n     ],\n     name: \"contract_span_srcdoc\"},\n    {input: \"<span poster=\\\"x\\\">\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span>\",\n         \"<span/>\",\n         \"<span />\",\n         \"<table><span></span></table>\",\n         \"<table><span></table>\",\n         \"<SPAN />\",\n         \"<SPAN></SPAN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"\",\n     ],\n     name: \"contract_span_poster\"},\n    {input: \"<span autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span>\",\n         \"<span/>\",\n         \"<span />\",\n         \"<table><span></span></table>\",\n         \"<table><span></table>\",\n         \"<SPAN />\",\n         \"<SPAN></SPAN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"\",\n     ],\n     name: \"contract_span_autoplay\"},\n    {input: \"<span controls=\\\"x\\\">\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span>\",\n         \"<span/>\",\n         \"<span />\",\n         \"<table><span></span></table>\",\n         \"<table><span></table>\",\n         \"<SPAN />\",\n         \"<SPAN></SPAN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"\",\n     ],\n     name: \"contract_span_controls\"},\n    {input: \"<span formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span>\",\n         \"<span/>\",\n         \"<span />\",\n         \"<table><span></span></table>\",\n         \"<table><span></table>\",\n         \"<SPAN />\",\n         \"<SPAN></SPAN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"\",\n     ],\n     name: \"contract_span_formaction\"},\n    {input: \"<span formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span>\",\n         \"<span/>\",\n         \"<span />\",\n         \"<table><span></span></table>\",\n         \"<table><span></table>\",\n         \"<SPAN />\",\n         \"<SPAN></SPAN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"\",\n     ],\n     name: \"contract_span_formmethod\"},\n    {input: \"<span pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span>\",\n         \"<span/>\",\n         \"<span />\",\n         \"<table><span></span></table>\",\n         \"<table><span></table>\",\n         \"<SPAN />\",\n         \"<SPAN></SPAN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"\",\n     ],\n     name: \"contract_span_pattern\"},\n    {input: \"<span icon=\\\"x\\\">\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span>\",\n         \"<span/>\",\n         \"<span />\",\n         \"<table><span></span></table>\",\n         \"<table><span></table>\",\n         \"<SPAN />\",\n         \"<SPAN></SPAN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"\",\n     ],\n     name: \"contract_span_icon\"},\n    {input: \"<span select=\\\"x\\\">\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span>\",\n         \"<span/>\",\n         \"<span />\",\n         \"<table><span></span></table>\",\n         \"<table><span></table>\",\n         \"<SPAN />\",\n         \"<SPAN></SPAN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"\",\n     ],\n     name: \"contract_span_select\"},\n    {input: \"<br></br>\",\n     acceptable: [\n         \"<br>\",\n         \"<br />\",\n         \"<br/>\",\n         \"<br><br>\",\n         \"<br/><br/>\",\n         \"<br /><br />\",\n         \"<table><br></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_br_plain\"},\n    {input: \"<br><script>alert()</script></br>\",\n     acceptable: [\n         \"<br>\",\n         \"<br />\",\n         \"<br/>\",\n         \"<br><br>\",\n         \"<br/><br/>\",\n         \"<br /><br />\",\n         \"<table><br></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><br><td></td></table>\",\n     ],\n     name: \"contract_br_scriptinside\"},\n    {input: \"<br media=\\\"x\\\">\",\n     acceptable: [\n         \"<br></br>\",\n         \"<br>\",\n         \"<br/>\",\n         \"<br />\",\n         \"<table><br></br></table>\",\n         \"<table><br></table>\",\n         \"<BR />\",\n         \"<BR></BR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_br_media\"},\n    {input: \"<br nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<br></br>\",\n         \"<br>\",\n         \"<br/>\",\n         \"<br />\",\n         \"<table><br></br></table>\",\n         \"<table><br></table>\",\n         \"<BR />\",\n         \"<BR></BR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_br_nonce\"},\n    {input: \"<br srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<br></br>\",\n         \"<br>\",\n         \"<br/>\",\n         \"<br />\",\n         \"<table><br></br></table>\",\n         \"<table><br></table>\",\n         \"<BR />\",\n         \"<BR></BR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_br_srcset\"},\n    {input: \"<br srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<br></br>\",\n         \"<br>\",\n         \"<br/>\",\n         \"<br />\",\n         \"<table><br></br></table>\",\n         \"<table><br></table>\",\n         \"<BR />\",\n         \"<BR></BR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_br_srcdoc\"},\n    {input: \"<br poster=\\\"x\\\">\",\n     acceptable: [\n         \"<br></br>\",\n         \"<br>\",\n         \"<br/>\",\n         \"<br />\",\n         \"<table><br></br></table>\",\n         \"<table><br></table>\",\n         \"<BR />\",\n         \"<BR></BR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_br_poster\"},\n    {input: \"<br autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<br></br>\",\n         \"<br>\",\n         \"<br/>\",\n         \"<br />\",\n         \"<table><br></br></table>\",\n         \"<table><br></table>\",\n         \"<BR />\",\n         \"<BR></BR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_br_autoplay\"},\n    {input: \"<br controls=\\\"x\\\">\",\n     acceptable: [\n         \"<br></br>\",\n         \"<br>\",\n         \"<br/>\",\n         \"<br />\",\n         \"<table><br></br></table>\",\n         \"<table><br></table>\",\n         \"<BR />\",\n         \"<BR></BR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_br_controls\"},\n    {input: \"<br formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<br></br>\",\n         \"<br>\",\n         \"<br/>\",\n         \"<br />\",\n         \"<table><br></br></table>\",\n         \"<table><br></table>\",\n         \"<BR />\",\n         \"<BR></BR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_br_formaction\"},\n    {input: \"<br formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<br></br>\",\n         \"<br>\",\n         \"<br/>\",\n         \"<br />\",\n         \"<table><br></br></table>\",\n         \"<table><br></table>\",\n         \"<BR />\",\n         \"<BR></BR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_br_formmethod\"},\n    {input: \"<br pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<br></br>\",\n         \"<br>\",\n         \"<br/>\",\n         \"<br />\",\n         \"<table><br></br></table>\",\n         \"<table><br></table>\",\n         \"<BR />\",\n         \"<BR></BR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_br_pattern\"},\n    {input: \"<br icon=\\\"x\\\">\",\n     acceptable: [\n         \"<br></br>\",\n         \"<br>\",\n         \"<br/>\",\n         \"<br />\",\n         \"<table><br></br></table>\",\n         \"<table><br></table>\",\n         \"<BR />\",\n         \"<BR></BR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_br_icon\"},\n    {input: \"<br select=\\\"x\\\">\",\n     acceptable: [\n         \"<br></br>\",\n         \"<br>\",\n         \"<br/>\",\n         \"<br />\",\n         \"<table><br></br></table>\",\n         \"<table><br></table>\",\n         \"<BR />\",\n         \"<BR></BR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_br_select\"},\n    {input: \"<wbr></wbr>\",\n     acceptable: [\n         \"<wbr>\",\n         \"<wbr />\",\n         \"<wbr/>\",\n         \"<wbr><wbr>\",\n         \"<wbr/><wbr/>\",\n         \"<wbr /><wbr />\",\n         \"<table><wbr></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_wbr_plain\"},\n    {input: \"<wbr><script>alert()</script></wbr>\",\n     acceptable: [\n         \"<wbr>\",\n         \"<wbr />\",\n         \"<wbr/>\",\n         \"<wbr><wbr>\",\n         \"<wbr/><wbr/>\",\n         \"<wbr /><wbr />\",\n         \"<table><wbr></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><wbr><td></td></table>\",\n     ],\n     name: \"contract_wbr_scriptinside\"},\n    {input: \"<wbr media=\\\"x\\\">\",\n     acceptable: [\n         \"<wbr></wbr>\",\n         \"<wbr>\",\n         \"<wbr/>\",\n         \"<wbr />\",\n         \"<table><wbr></wbr></table>\",\n         \"<table><wbr></table>\",\n         \"<WBR />\",\n         \"<WBR></WBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_wbr_media\"},\n    {input: \"<wbr nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<wbr></wbr>\",\n         \"<wbr>\",\n         \"<wbr/>\",\n         \"<wbr />\",\n         \"<table><wbr></wbr></table>\",\n         \"<table><wbr></table>\",\n         \"<WBR />\",\n         \"<WBR></WBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_wbr_nonce\"},\n    {input: \"<wbr srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<wbr></wbr>\",\n         \"<wbr>\",\n         \"<wbr/>\",\n         \"<wbr />\",\n         \"<table><wbr></wbr></table>\",\n         \"<table><wbr></table>\",\n         \"<WBR />\",\n         \"<WBR></WBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_wbr_srcset\"},\n    {input: \"<wbr srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<wbr></wbr>\",\n         \"<wbr>\",\n         \"<wbr/>\",\n         \"<wbr />\",\n         \"<table><wbr></wbr></table>\",\n         \"<table><wbr></table>\",\n         \"<WBR />\",\n         \"<WBR></WBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_wbr_srcdoc\"},\n    {input: \"<wbr poster=\\\"x\\\">\",\n     acceptable: [\n         \"<wbr></wbr>\",\n         \"<wbr>\",\n         \"<wbr/>\",\n         \"<wbr />\",\n         \"<table><wbr></wbr></table>\",\n         \"<table><wbr></table>\",\n         \"<WBR />\",\n         \"<WBR></WBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_wbr_poster\"},\n    {input: \"<wbr autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<wbr></wbr>\",\n         \"<wbr>\",\n         \"<wbr/>\",\n         \"<wbr />\",\n         \"<table><wbr></wbr></table>\",\n         \"<table><wbr></table>\",\n         \"<WBR />\",\n         \"<WBR></WBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_wbr_autoplay\"},\n    {input: \"<wbr controls=\\\"x\\\">\",\n     acceptable: [\n         \"<wbr></wbr>\",\n         \"<wbr>\",\n         \"<wbr/>\",\n         \"<wbr />\",\n         \"<table><wbr></wbr></table>\",\n         \"<table><wbr></table>\",\n         \"<WBR />\",\n         \"<WBR></WBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_wbr_controls\"},\n    {input: \"<wbr formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<wbr></wbr>\",\n         \"<wbr>\",\n         \"<wbr/>\",\n         \"<wbr />\",\n         \"<table><wbr></wbr></table>\",\n         \"<table><wbr></table>\",\n         \"<WBR />\",\n         \"<WBR></WBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_wbr_formaction\"},\n    {input: \"<wbr formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<wbr></wbr>\",\n         \"<wbr>\",\n         \"<wbr/>\",\n         \"<wbr />\",\n         \"<table><wbr></wbr></table>\",\n         \"<table><wbr></table>\",\n         \"<WBR />\",\n         \"<WBR></WBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_wbr_formmethod\"},\n    {input: \"<wbr pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<wbr></wbr>\",\n         \"<wbr>\",\n         \"<wbr/>\",\n         \"<wbr />\",\n         \"<table><wbr></wbr></table>\",\n         \"<table><wbr></table>\",\n         \"<WBR />\",\n         \"<WBR></WBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_wbr_pattern\"},\n    {input: \"<wbr icon=\\\"x\\\">\",\n     acceptable: [\n         \"<wbr></wbr>\",\n         \"<wbr>\",\n         \"<wbr/>\",\n         \"<wbr />\",\n         \"<table><wbr></wbr></table>\",\n         \"<table><wbr></table>\",\n         \"<WBR />\",\n         \"<WBR></WBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_wbr_icon\"},\n    {input: \"<wbr select=\\\"x\\\">\",\n     acceptable: [\n         \"<wbr></wbr>\",\n         \"<wbr>\",\n         \"<wbr/>\",\n         \"<wbr />\",\n         \"<table><wbr></wbr></table>\",\n         \"<table><wbr></table>\",\n         \"<WBR />\",\n         \"<WBR></WBR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_wbr_select\"},\n    {input: \"<link></link>\",\n     acceptable: [\n         \"<link>\",\n         \"<link />\",\n         \"<link/>\",\n         \"<link><link>\",\n         \"<link/><link/>\",\n         \"<link /><link />\",\n         \"<table><link></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_link_plain\"},\n    {input: \"<link><script>alert()</script></link>\",\n     acceptable: [\n         \"<link>\",\n         \"<link />\",\n         \"<link/>\",\n         \"<link><link>\",\n         \"<link/><link/>\",\n         \"<link /><link />\",\n         \"<table><link></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><link><td></td></table>\",\n     ],\n     name: \"contract_link_scriptinside\"},\n    {input: \"<link rel=\\\"alternate\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=alternate>\",\n         \"<link href=x rel=\\\"alternate\\\">\",\n         \"<link rel=\\\"alternate\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"alternate\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_alternate\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_alternate_x\"},\n    {input: \"<link rel=\\\"author\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=author>\",\n         \"<link href=x rel=\\\"author\\\">\",\n         \"<link rel=\\\"author\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"author\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_author\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_author_x\"},\n    {input: \"<link rel=\\\"bookmark\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=bookmark>\",\n         \"<link href=x rel=\\\"bookmark\\\">\",\n         \"<link rel=\\\"bookmark\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"bookmark\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_bookmark\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_bookmark_x\"},\n    {input: \"<link rel=\\\"canonical\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=canonical>\",\n         \"<link href=x rel=\\\"canonical\\\">\",\n         \"<link rel=\\\"canonical\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"canonical\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_canonical\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_canonical_x\"},\n    {input: \"<link rel=\\\"cite\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=cite>\",\n         \"<link href=x rel=\\\"cite\\\">\",\n         \"<link rel=\\\"cite\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"cite\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_cite\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_cite_x\"},\n    {input: \"<link rel=\\\"help\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=help>\",\n         \"<link href=x rel=\\\"help\\\">\",\n         \"<link rel=\\\"help\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"help\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_help\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_help_x\"},\n    {input: \"<link rel=\\\"icon\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=icon>\",\n         \"<link href=x rel=\\\"icon\\\">\",\n         \"<link rel=\\\"icon\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"icon\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_icon\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_icon_x\"},\n    {input: \"<link rel=\\\"license\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=license>\",\n         \"<link href=x rel=\\\"license\\\">\",\n         \"<link rel=\\\"license\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"license\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_license\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_license_x\"},\n    {input: \"<link rel=\\\"next\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=next>\",\n         \"<link href=x rel=\\\"next\\\">\",\n         \"<link rel=\\\"next\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"next\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_next\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_next_x\"},\n    {input: \"<link rel=\\\"prefetch\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=prefetch>\",\n         \"<link href=x rel=\\\"prefetch\\\">\",\n         \"<link rel=\\\"prefetch\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"prefetch\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_prefetch\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_prefetch_x\"},\n    {input: \"<link rel=\\\"dns-prefetch\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=dns-prefetch>\",\n         \"<link href=x rel=\\\"dns-prefetch\\\">\",\n         \"<link rel=\\\"dns-prefetch\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"dns-prefetch\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_dns-prefetch\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_dns-prefetch_x\"},\n    {input: \"<link rel=\\\"prerender\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=prerender>\",\n         \"<link href=x rel=\\\"prerender\\\">\",\n         \"<link rel=\\\"prerender\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"prerender\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_prerender\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_prerender_x\"},\n    {input: \"<link rel=\\\"preconnect\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=preconnect>\",\n         \"<link href=x rel=\\\"preconnect\\\">\",\n         \"<link rel=\\\"preconnect\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"preconnect\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_preconnect\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_preconnect_x\"},\n    {input: \"<link rel=\\\"preload\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=preload>\",\n         \"<link href=x rel=\\\"preload\\\">\",\n         \"<link rel=\\\"preload\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"preload\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_preload\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_preload_x\"},\n    {input: \"<link rel=\\\"prev\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=prev>\",\n         \"<link href=x rel=\\\"prev\\\">\",\n         \"<link rel=\\\"prev\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"prev\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_prev\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_prev_x\"},\n    {input: \"<link rel=\\\"search\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=search>\",\n         \"<link href=x rel=\\\"search\\\">\",\n         \"<link rel=\\\"search\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"search\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_search\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_search_x\"},\n    {input: \"<link rel=\\\"subresource\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link href=x rel=subresource>\",\n         \"<link href=x rel=\\\"subresource\\\">\",\n         \"<link rel=\\\"subresource\\\" href=\\\"x\\\">\",\n         \"<link rel=\\\"subresource\\\" href=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"contract_link_rel_subresource\"},\n    {input: \"<link rel=\\\"x\\\" href=\\\"x\\\">\",\n     acceptable: [\n         \"<link rel=x>\",\n         \"<link rel=\\\"x\\\">\",\n         \"<link rel=\\\"x\\\"/>\",\n         \"\",\n     ],\n     name: \"link_subresource_x\"},\n    {input: \"<link srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<link></link>\",\n         \"<link>\",\n         \"<link/>\",\n         \"<link />\",\n         \"<table><link></link></table>\",\n         \"<table><link></table>\",\n         \"<LINK />\",\n         \"<LINK></LINK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_link_srcset\"},\n    {input: \"<link srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<link></link>\",\n         \"<link>\",\n         \"<link/>\",\n         \"<link />\",\n         \"<table><link></link></table>\",\n         \"<table><link></table>\",\n         \"<LINK />\",\n         \"<LINK></LINK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_link_srcdoc\"},\n    {input: \"<link poster=\\\"x\\\">\",\n     acceptable: [\n         \"<link></link>\",\n         \"<link>\",\n         \"<link/>\",\n         \"<link />\",\n         \"<table><link></link></table>\",\n         \"<table><link></table>\",\n         \"<LINK />\",\n         \"<LINK></LINK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_link_poster\"},\n    {input: \"<link autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<link></link>\",\n         \"<link>\",\n         \"<link/>\",\n         \"<link />\",\n         \"<table><link></link></table>\",\n         \"<table><link></table>\",\n         \"<LINK />\",\n         \"<LINK></LINK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_link_autoplay\"},\n    {input: \"<link controls=\\\"x\\\">\",\n     acceptable: [\n         \"<link></link>\",\n         \"<link>\",\n         \"<link/>\",\n         \"<link />\",\n         \"<table><link></link></table>\",\n         \"<table><link></table>\",\n         \"<LINK />\",\n         \"<LINK></LINK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_link_controls\"},\n    {input: \"<link formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<link></link>\",\n         \"<link>\",\n         \"<link/>\",\n         \"<link />\",\n         \"<table><link></link></table>\",\n         \"<table><link></table>\",\n         \"<LINK />\",\n         \"<LINK></LINK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_link_formaction\"},\n    {input: \"<link formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<link></link>\",\n         \"<link>\",\n         \"<link/>\",\n         \"<link />\",\n         \"<table><link></link></table>\",\n         \"<table><link></table>\",\n         \"<LINK />\",\n         \"<LINK></LINK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_link_formmethod\"},\n    {input: \"<link pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<link></link>\",\n         \"<link>\",\n         \"<link/>\",\n         \"<link />\",\n         \"<table><link></link></table>\",\n         \"<table><link></table>\",\n         \"<LINK />\",\n         \"<LINK></LINK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_link_pattern\"},\n    {input: \"<link icon=\\\"x\\\">\",\n     acceptable: [\n         \"<link></link>\",\n         \"<link>\",\n         \"<link/>\",\n         \"<link />\",\n         \"<table><link></link></table>\",\n         \"<table><link></table>\",\n         \"<LINK />\",\n         \"<LINK></LINK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_link_icon\"},\n    {input: \"<link select=\\\"x\\\">\",\n     acceptable: [\n         \"<link></link>\",\n         \"<link>\",\n         \"<link/>\",\n         \"<link />\",\n         \"<table><link></link></table>\",\n         \"<table><link></table>\",\n         \"<LINK />\",\n         \"<LINK></LINK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_link_select\"},\n    {input: \"<ins></ins>\",\n     acceptable: [\n         \"<ins>\",\n         \"<ins />\",\n         \"<ins></ins>\",\n         \"<table><ins></ins></table>\",\n         \"<INS />\",\n         \"<INS></INS>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ins_plain\"},\n    {input: \"<ins><script>alert()</script></ins>\",\n     acceptable: [\n         \"<ins>\",\n         \"<ins />\",\n         \"<ins></ins>\",\n         \"<table><ins></ins></table>\",\n         \"<INS />\",\n         \"<INS></INS>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><ins><td></td></ins></table>\",\n         \"<table><ins></ins><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_ins_scriptinside\"},\n    {input: \"<ins cite=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<ins cite=\\\"about:invalid#zCSafez\\\"></ins>\",\n         \"<ins cite=\\\"about:invalid#zCSafez\\\">\",\n         \"<ins cite=\\\"about:invalid#zGoSafez\\\"></ins>\",\n         \"<ins cite=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<ins cite=\\\"javascript:void(0);\\\"></ins>\",\n         \"<ins cite=\\\"javascript:void(0);\\\">\",\n         \"<ins></ins>\",\n         \"<ins>\",\n         \"<ins/>\",\n         \"<ins />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ins_cite\"},\n    {input: \"<ins media=\\\"x\\\">\",\n     acceptable: [\n         \"<ins></ins>\",\n         \"<ins>\",\n         \"<ins/>\",\n         \"<ins />\",\n         \"<table><ins></ins></table>\",\n         \"<table><ins></table>\",\n         \"<INS />\",\n         \"<INS></INS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ins_media\"},\n    {input: \"<ins nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<ins></ins>\",\n         \"<ins>\",\n         \"<ins/>\",\n         \"<ins />\",\n         \"<table><ins></ins></table>\",\n         \"<table><ins></table>\",\n         \"<INS />\",\n         \"<INS></INS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ins_nonce\"},\n    {input: \"<ins srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<ins></ins>\",\n         \"<ins>\",\n         \"<ins/>\",\n         \"<ins />\",\n         \"<table><ins></ins></table>\",\n         \"<table><ins></table>\",\n         \"<INS />\",\n         \"<INS></INS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ins_srcset\"},\n    {input: \"<ins srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<ins></ins>\",\n         \"<ins>\",\n         \"<ins/>\",\n         \"<ins />\",\n         \"<table><ins></ins></table>\",\n         \"<table><ins></table>\",\n         \"<INS />\",\n         \"<INS></INS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ins_srcdoc\"},\n    {input: \"<ins poster=\\\"x\\\">\",\n     acceptable: [\n         \"<ins></ins>\",\n         \"<ins>\",\n         \"<ins/>\",\n         \"<ins />\",\n         \"<table><ins></ins></table>\",\n         \"<table><ins></table>\",\n         \"<INS />\",\n         \"<INS></INS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ins_poster\"},\n    {input: \"<ins autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<ins></ins>\",\n         \"<ins>\",\n         \"<ins/>\",\n         \"<ins />\",\n         \"<table><ins></ins></table>\",\n         \"<table><ins></table>\",\n         \"<INS />\",\n         \"<INS></INS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ins_autoplay\"},\n    {input: \"<ins controls=\\\"x\\\">\",\n     acceptable: [\n         \"<ins></ins>\",\n         \"<ins>\",\n         \"<ins/>\",\n         \"<ins />\",\n         \"<table><ins></ins></table>\",\n         \"<table><ins></table>\",\n         \"<INS />\",\n         \"<INS></INS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ins_controls\"},\n    {input: \"<ins formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<ins></ins>\",\n         \"<ins>\",\n         \"<ins/>\",\n         \"<ins />\",\n         \"<table><ins></ins></table>\",\n         \"<table><ins></table>\",\n         \"<INS />\",\n         \"<INS></INS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ins_formaction\"},\n    {input: \"<ins formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<ins></ins>\",\n         \"<ins>\",\n         \"<ins/>\",\n         \"<ins />\",\n         \"<table><ins></ins></table>\",\n         \"<table><ins></table>\",\n         \"<INS />\",\n         \"<INS></INS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ins_formmethod\"},\n    {input: \"<ins pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<ins></ins>\",\n         \"<ins>\",\n         \"<ins/>\",\n         \"<ins />\",\n         \"<table><ins></ins></table>\",\n         \"<table><ins></table>\",\n         \"<INS />\",\n         \"<INS></INS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ins_pattern\"},\n    {input: \"<ins icon=\\\"x\\\">\",\n     acceptable: [\n         \"<ins></ins>\",\n         \"<ins>\",\n         \"<ins/>\",\n         \"<ins />\",\n         \"<table><ins></ins></table>\",\n         \"<table><ins></table>\",\n         \"<INS />\",\n         \"<INS></INS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ins_icon\"},\n    {input: \"<ins select=\\\"x\\\">\",\n     acceptable: [\n         \"<ins></ins>\",\n         \"<ins>\",\n         \"<ins/>\",\n         \"<ins />\",\n         \"<table><ins></ins></table>\",\n         \"<table><ins></table>\",\n         \"<INS />\",\n         \"<INS></INS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_ins_select\"},\n    {input: \"<del></del>\",\n     acceptable: [\n         \"<del>\",\n         \"<del />\",\n         \"<del></del>\",\n         \"<table><del></del></table>\",\n         \"<DEL />\",\n         \"<DEL></DEL>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_del_plain\"},\n    {input: \"<del><script>alert()</script></del>\",\n     acceptable: [\n         \"<del>\",\n         \"<del />\",\n         \"<del></del>\",\n         \"<table><del></del></table>\",\n         \"<DEL />\",\n         \"<DEL></DEL>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><del><td></td></del></table>\",\n         \"<table><del></del><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_del_scriptinside\"},\n    {input: \"<del cite=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<del cite=\\\"about:invalid#zCSafez\\\"></del>\",\n         \"<del cite=\\\"about:invalid#zCSafez\\\">\",\n         \"<del cite=\\\"about:invalid#zGoSafez\\\"></del>\",\n         \"<del cite=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<del cite=\\\"javascript:void(0);\\\"></del>\",\n         \"<del cite=\\\"javascript:void(0);\\\">\",\n         \"<del></del>\",\n         \"<del>\",\n         \"<del/>\",\n         \"<del />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_del_cite\"},\n    {input: \"<del media=\\\"x\\\">\",\n     acceptable: [\n         \"<del></del>\",\n         \"<del>\",\n         \"<del/>\",\n         \"<del />\",\n         \"<table><del></del></table>\",\n         \"<table><del></table>\",\n         \"<DEL />\",\n         \"<DEL></DEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_del_media\"},\n    {input: \"<del nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<del></del>\",\n         \"<del>\",\n         \"<del/>\",\n         \"<del />\",\n         \"<table><del></del></table>\",\n         \"<table><del></table>\",\n         \"<DEL />\",\n         \"<DEL></DEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_del_nonce\"},\n    {input: \"<del srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<del></del>\",\n         \"<del>\",\n         \"<del/>\",\n         \"<del />\",\n         \"<table><del></del></table>\",\n         \"<table><del></table>\",\n         \"<DEL />\",\n         \"<DEL></DEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_del_srcset\"},\n    {input: \"<del srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<del></del>\",\n         \"<del>\",\n         \"<del/>\",\n         \"<del />\",\n         \"<table><del></del></table>\",\n         \"<table><del></table>\",\n         \"<DEL />\",\n         \"<DEL></DEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_del_srcdoc\"},\n    {input: \"<del poster=\\\"x\\\">\",\n     acceptable: [\n         \"<del></del>\",\n         \"<del>\",\n         \"<del/>\",\n         \"<del />\",\n         \"<table><del></del></table>\",\n         \"<table><del></table>\",\n         \"<DEL />\",\n         \"<DEL></DEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_del_poster\"},\n    {input: \"<del autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<del></del>\",\n         \"<del>\",\n         \"<del/>\",\n         \"<del />\",\n         \"<table><del></del></table>\",\n         \"<table><del></table>\",\n         \"<DEL />\",\n         \"<DEL></DEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_del_autoplay\"},\n    {input: \"<del controls=\\\"x\\\">\",\n     acceptable: [\n         \"<del></del>\",\n         \"<del>\",\n         \"<del/>\",\n         \"<del />\",\n         \"<table><del></del></table>\",\n         \"<table><del></table>\",\n         \"<DEL />\",\n         \"<DEL></DEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_del_controls\"},\n    {input: \"<del formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<del></del>\",\n         \"<del>\",\n         \"<del/>\",\n         \"<del />\",\n         \"<table><del></del></table>\",\n         \"<table><del></table>\",\n         \"<DEL />\",\n         \"<DEL></DEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_del_formaction\"},\n    {input: \"<del formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<del></del>\",\n         \"<del>\",\n         \"<del/>\",\n         \"<del />\",\n         \"<table><del></del></table>\",\n         \"<table><del></table>\",\n         \"<DEL />\",\n         \"<DEL></DEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_del_formmethod\"},\n    {input: \"<del pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<del></del>\",\n         \"<del>\",\n         \"<del/>\",\n         \"<del />\",\n         \"<table><del></del></table>\",\n         \"<table><del></table>\",\n         \"<DEL />\",\n         \"<DEL></DEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_del_pattern\"},\n    {input: \"<del icon=\\\"x\\\">\",\n     acceptable: [\n         \"<del></del>\",\n         \"<del>\",\n         \"<del/>\",\n         \"<del />\",\n         \"<table><del></del></table>\",\n         \"<table><del></table>\",\n         \"<DEL />\",\n         \"<DEL></DEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_del_icon\"},\n    {input: \"<del select=\\\"x\\\">\",\n     acceptable: [\n         \"<del></del>\",\n         \"<del>\",\n         \"<del/>\",\n         \"<del />\",\n         \"<table><del></del></table>\",\n         \"<table><del></table>\",\n         \"<DEL />\",\n         \"<DEL></DEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_del_select\"},\n    {input: \"<picture></picture>\",\n     acceptable: [\n         \"<picture>\",\n         \"<picture />\",\n         \"<picture></picture>\",\n         \"<table><picture></picture></table>\",\n         \"<PICTURE />\",\n         \"<PICTURE></PICTURE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_picture_plain\"},\n    {input: \"<picture><script>alert()</script></picture>\",\n     acceptable: [\n         \"<picture>\",\n         \"<picture />\",\n         \"<picture></picture>\",\n         \"<table><picture></picture></table>\",\n         \"<PICTURE />\",\n         \"<PICTURE></PICTURE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><picture><td></td></picture></table>\",\n         \"<table><picture></picture><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_picture_scriptinside\"},\n    {input: \"<picture media=\\\"x\\\">\",\n     acceptable: [\n         \"<picture></picture>\",\n         \"<picture>\",\n         \"<picture/>\",\n         \"<picture />\",\n         \"<table><picture></picture></table>\",\n         \"<table><picture></table>\",\n         \"<PICTURE />\",\n         \"<PICTURE></PICTURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_picture_media\"},\n    {input: \"<picture nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<picture></picture>\",\n         \"<picture>\",\n         \"<picture/>\",\n         \"<picture />\",\n         \"<table><picture></picture></table>\",\n         \"<table><picture></table>\",\n         \"<PICTURE />\",\n         \"<PICTURE></PICTURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_picture_nonce\"},\n    {input: \"<picture srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<picture></picture>\",\n         \"<picture>\",\n         \"<picture/>\",\n         \"<picture />\",\n         \"<table><picture></picture></table>\",\n         \"<table><picture></table>\",\n         \"<PICTURE />\",\n         \"<PICTURE></PICTURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_picture_srcset\"},\n    {input: \"<picture srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<picture></picture>\",\n         \"<picture>\",\n         \"<picture/>\",\n         \"<picture />\",\n         \"<table><picture></picture></table>\",\n         \"<table><picture></table>\",\n         \"<PICTURE />\",\n         \"<PICTURE></PICTURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_picture_srcdoc\"},\n    {input: \"<picture poster=\\\"x\\\">\",\n     acceptable: [\n         \"<picture></picture>\",\n         \"<picture>\",\n         \"<picture/>\",\n         \"<picture />\",\n         \"<table><picture></picture></table>\",\n         \"<table><picture></table>\",\n         \"<PICTURE />\",\n         \"<PICTURE></PICTURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_picture_poster\"},\n    {input: \"<picture autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<picture></picture>\",\n         \"<picture>\",\n         \"<picture/>\",\n         \"<picture />\",\n         \"<table><picture></picture></table>\",\n         \"<table><picture></table>\",\n         \"<PICTURE />\",\n         \"<PICTURE></PICTURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_picture_autoplay\"},\n    {input: \"<picture controls=\\\"x\\\">\",\n     acceptable: [\n         \"<picture></picture>\",\n         \"<picture>\",\n         \"<picture/>\",\n         \"<picture />\",\n         \"<table><picture></picture></table>\",\n         \"<table><picture></table>\",\n         \"<PICTURE />\",\n         \"<PICTURE></PICTURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_picture_controls\"},\n    {input: \"<picture formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<picture></picture>\",\n         \"<picture>\",\n         \"<picture/>\",\n         \"<picture />\",\n         \"<table><picture></picture></table>\",\n         \"<table><picture></table>\",\n         \"<PICTURE />\",\n         \"<PICTURE></PICTURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_picture_formaction\"},\n    {input: \"<picture formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<picture></picture>\",\n         \"<picture>\",\n         \"<picture/>\",\n         \"<picture />\",\n         \"<table><picture></picture></table>\",\n         \"<table><picture></table>\",\n         \"<PICTURE />\",\n         \"<PICTURE></PICTURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_picture_formmethod\"},\n    {input: \"<picture pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<picture></picture>\",\n         \"<picture>\",\n         \"<picture/>\",\n         \"<picture />\",\n         \"<table><picture></picture></table>\",\n         \"<table><picture></table>\",\n         \"<PICTURE />\",\n         \"<PICTURE></PICTURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_picture_pattern\"},\n    {input: \"<picture icon=\\\"x\\\">\",\n     acceptable: [\n         \"<picture></picture>\",\n         \"<picture>\",\n         \"<picture/>\",\n         \"<picture />\",\n         \"<table><picture></picture></table>\",\n         \"<table><picture></table>\",\n         \"<PICTURE />\",\n         \"<PICTURE></PICTURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_picture_icon\"},\n    {input: \"<picture select=\\\"x\\\">\",\n     acceptable: [\n         \"<picture></picture>\",\n         \"<picture>\",\n         \"<picture/>\",\n         \"<picture />\",\n         \"<table><picture></picture></table>\",\n         \"<table><picture></table>\",\n         \"<PICTURE />\",\n         \"<PICTURE></PICTURE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_picture_select\"},\n    {input: \"<source></source>\",\n     acceptable: [\n         \"<source>\",\n         \"<source />\",\n         \"<source/>\",\n         \"<source><source>\",\n         \"<source/><source/>\",\n         \"<source /><source />\",\n         \"<table><source></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_source_plain\"},\n    {input: \"<source><script>alert()</script></source>\",\n     acceptable: [\n         \"<source>\",\n         \"<source />\",\n         \"<source/>\",\n         \"<source><source>\",\n         \"<source/><source/>\",\n         \"<source /><source />\",\n         \"<table><source></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><source><td></td></table>\",\n     ],\n     name: \"contract_source_scriptinside\"},\n    {input: \"<source src=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<source src=\\\"about:invalid#zCSafez\\\"></source>\",\n         \"<source src=\\\"about:invalid#zCSafez\\\">\",\n         \"<source src=\\\"about:invalid#zGoSafez\\\"></source>\",\n         \"<source src=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<source src=\\\"javascript:void(0);\\\"></source>\",\n         \"<source src=\\\"javascript:void(0);\\\">\",\n         \"<source></source>\",\n         \"<source>\",\n         \"<source/>\",\n         \"<source />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_source_src\"},\n    {input: \"<source srcset=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<source srcset=\\\"about:invalid#zCSafez\\\"></source>\",\n         \"<source srcset=\\\"about:invalid#zCSafez\\\">\",\n         \"<source srcset=\\\"about:invalid#zGoSafez\\\"></source>\",\n         \"<source srcset=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<source srcset=\\\"javascript:void(0);\\\"></source>\",\n         \"<source srcset=\\\"javascript:void(0);\\\">\",\n         \"<source></source>\",\n         \"<source>\",\n         \"<source/>\",\n         \"<source />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_source_srcset\"},\n    {input: \"<source nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<source></source>\",\n         \"<source>\",\n         \"<source/>\",\n         \"<source />\",\n         \"<table><source></source></table>\",\n         \"<table><source></table>\",\n         \"<SOURCE />\",\n         \"<SOURCE></SOURCE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_source_nonce\"},\n    {input: \"<source srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<source></source>\",\n         \"<source>\",\n         \"<source/>\",\n         \"<source />\",\n         \"<table><source></source></table>\",\n         \"<table><source></table>\",\n         \"<SOURCE />\",\n         \"<SOURCE></SOURCE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_source_srcdoc\"},\n    {input: \"<source poster=\\\"x\\\">\",\n     acceptable: [\n         \"<source></source>\",\n         \"<source>\",\n         \"<source/>\",\n         \"<source />\",\n         \"<table><source></source></table>\",\n         \"<table><source></table>\",\n         \"<SOURCE />\",\n         \"<SOURCE></SOURCE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_source_poster\"},\n    {input: \"<source autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<source></source>\",\n         \"<source>\",\n         \"<source/>\",\n         \"<source />\",\n         \"<table><source></source></table>\",\n         \"<table><source></table>\",\n         \"<SOURCE />\",\n         \"<SOURCE></SOURCE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_source_autoplay\"},\n    {input: \"<source controls=\\\"x\\\">\",\n     acceptable: [\n         \"<source></source>\",\n         \"<source>\",\n         \"<source/>\",\n         \"<source />\",\n         \"<table><source></source></table>\",\n         \"<table><source></table>\",\n         \"<SOURCE />\",\n         \"<SOURCE></SOURCE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_source_controls\"},\n    {input: \"<source formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<source></source>\",\n         \"<source>\",\n         \"<source/>\",\n         \"<source />\",\n         \"<table><source></source></table>\",\n         \"<table><source></table>\",\n         \"<SOURCE />\",\n         \"<SOURCE></SOURCE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_source_formaction\"},\n    {input: \"<source formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<source></source>\",\n         \"<source>\",\n         \"<source/>\",\n         \"<source />\",\n         \"<table><source></source></table>\",\n         \"<table><source></table>\",\n         \"<SOURCE />\",\n         \"<SOURCE></SOURCE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_source_formmethod\"},\n    {input: \"<source pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<source></source>\",\n         \"<source>\",\n         \"<source/>\",\n         \"<source />\",\n         \"<table><source></source></table>\",\n         \"<table><source></table>\",\n         \"<SOURCE />\",\n         \"<SOURCE></SOURCE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_source_pattern\"},\n    {input: \"<source icon=\\\"x\\\">\",\n     acceptable: [\n         \"<source></source>\",\n         \"<source>\",\n         \"<source/>\",\n         \"<source />\",\n         \"<table><source></source></table>\",\n         \"<table><source></table>\",\n         \"<SOURCE />\",\n         \"<SOURCE></SOURCE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_source_icon\"},\n    {input: \"<source select=\\\"x\\\">\",\n     acceptable: [\n         \"<source></source>\",\n         \"<source>\",\n         \"<source/>\",\n         \"<source />\",\n         \"<table><source></source></table>\",\n         \"<table><source></table>\",\n         \"<SOURCE />\",\n         \"<SOURCE></SOURCE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_source_select\"},\n    {input: \"<img></img>\",\n     acceptable: [\n         \"<img>\",\n         \"<img />\",\n         \"<img/>\",\n         \"<img><img>\",\n         \"<img/><img/>\",\n         \"<img /><img />\",\n         \"<table><img></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_img_plain\"},\n    {input: \"<img><script>alert()</script></img>\",\n     acceptable: [\n         \"<img>\",\n         \"<img />\",\n         \"<img/>\",\n         \"<img><img>\",\n         \"<img/><img/>\",\n         \"<img /><img />\",\n         \"<table><img></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><img><td></td></table>\",\n     ],\n     name: \"contract_img_scriptinside\"},\n    {input: \"<img src=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<img src=\\\"about:invalid#zCSafez\\\"></img>\",\n         \"<img src=\\\"about:invalid#zCSafez\\\">\",\n         \"<img src=\\\"about:invalid#zGoSafez\\\"></img>\",\n         \"<img src=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<img src=\\\"javascript:void(0);\\\"></img>\",\n         \"<img src=\\\"javascript:void(0);\\\">\",\n         \"<img></img>\",\n         \"<img>\",\n         \"<img/>\",\n         \"<img />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_img_src\"},\n    {input: \"<img srcset=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<img srcset=\\\"about:invalid#zCSafez\\\"></img>\",\n         \"<img srcset=\\\"about:invalid#zCSafez\\\">\",\n         \"<img srcset=\\\"about:invalid#zGoSafez\\\"></img>\",\n         \"<img srcset=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<img srcset=\\\"javascript:void(0);\\\"></img>\",\n         \"<img srcset=\\\"javascript:void(0);\\\">\",\n         \"<img></img>\",\n         \"<img>\",\n         \"<img/>\",\n         \"<img />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_img_srcset\"},\n    {input: \"<img media=\\\"x\\\">\",\n     acceptable: [\n         \"<img></img>\",\n         \"<img>\",\n         \"<img/>\",\n         \"<img />\",\n         \"<table><img></img></table>\",\n         \"<table><img></table>\",\n         \"<IMG />\",\n         \"<IMG></IMG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_img_media\"},\n    {input: \"<img nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<img></img>\",\n         \"<img>\",\n         \"<img/>\",\n         \"<img />\",\n         \"<table><img></img></table>\",\n         \"<table><img></table>\",\n         \"<IMG />\",\n         \"<IMG></IMG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_img_nonce\"},\n    {input: \"<img srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<img></img>\",\n         \"<img>\",\n         \"<img/>\",\n         \"<img />\",\n         \"<table><img></img></table>\",\n         \"<table><img></table>\",\n         \"<IMG />\",\n         \"<IMG></IMG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_img_srcdoc\"},\n    {input: \"<img poster=\\\"x\\\">\",\n     acceptable: [\n         \"<img></img>\",\n         \"<img>\",\n         \"<img/>\",\n         \"<img />\",\n         \"<table><img></img></table>\",\n         \"<table><img></table>\",\n         \"<IMG />\",\n         \"<IMG></IMG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_img_poster\"},\n    {input: \"<img autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<img></img>\",\n         \"<img>\",\n         \"<img/>\",\n         \"<img />\",\n         \"<table><img></img></table>\",\n         \"<table><img></table>\",\n         \"<IMG />\",\n         \"<IMG></IMG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_img_autoplay\"},\n    {input: \"<img controls=\\\"x\\\">\",\n     acceptable: [\n         \"<img></img>\",\n         \"<img>\",\n         \"<img/>\",\n         \"<img />\",\n         \"<table><img></img></table>\",\n         \"<table><img></table>\",\n         \"<IMG />\",\n         \"<IMG></IMG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_img_controls\"},\n    {input: \"<img formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<img></img>\",\n         \"<img>\",\n         \"<img/>\",\n         \"<img />\",\n         \"<table><img></img></table>\",\n         \"<table><img></table>\",\n         \"<IMG />\",\n         \"<IMG></IMG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_img_formaction\"},\n    {input: \"<img formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<img></img>\",\n         \"<img>\",\n         \"<img/>\",\n         \"<img />\",\n         \"<table><img></img></table>\",\n         \"<table><img></table>\",\n         \"<IMG />\",\n         \"<IMG></IMG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_img_formmethod\"},\n    {input: \"<img pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<img></img>\",\n         \"<img>\",\n         \"<img/>\",\n         \"<img />\",\n         \"<table><img></img></table>\",\n         \"<table><img></table>\",\n         \"<IMG />\",\n         \"<IMG></IMG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_img_pattern\"},\n    {input: \"<img icon=\\\"x\\\">\",\n     acceptable: [\n         \"<img></img>\",\n         \"<img>\",\n         \"<img/>\",\n         \"<img />\",\n         \"<table><img></img></table>\",\n         \"<table><img></table>\",\n         \"<IMG />\",\n         \"<IMG></IMG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_img_icon\"},\n    {input: \"<img select=\\\"x\\\">\",\n     acceptable: [\n         \"<img></img>\",\n         \"<img>\",\n         \"<img/>\",\n         \"<img />\",\n         \"<table><img></img></table>\",\n         \"<table><img></table>\",\n         \"<IMG />\",\n         \"<IMG></IMG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_img_select\"},\n    {input: \"<iframe></iframe>\",\n     acceptable: [\n         \"<iframe>\",\n         \"<iframe />\",\n         \"<iframe></iframe>\",\n         \"<table><iframe></iframe></table>\",\n         \"<IFRAME />\",\n         \"<IFRAME></IFRAME>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_iframe_plain\"},\n    {input: \"<iframe><script>alert()</script></iframe>\",\n     acceptable: [\n         \"<iframe>\",\n         \"<iframe />\",\n         \"<iframe></iframe>\",\n         \"<table><iframe></iframe></table>\",\n         \"<IFRAME />\",\n         \"<IFRAME></IFRAME>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><iframe><td></td></iframe></table>\",\n         \"<table><iframe></iframe><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_iframe_scriptinside\"},\n    {input: \"<iframe srcdoc=\\\"<script>alert()</script>\\\">\",\n     acceptable: [\n         \"<iframe srcdoc></iframe>\",\n         \"<iframe srcdoc=\\\"\\\"></iframe>\",\n         \"\",\n     ],\n     name: \"contract_iframe_srcdoc\"},\n    {input: \"<iframe media=\\\"x\\\">\",\n     acceptable: [\n         \"<iframe></iframe>\",\n         \"<iframe>\",\n         \"<iframe/>\",\n         \"<iframe />\",\n         \"<table><iframe></iframe></table>\",\n         \"<table><iframe></table>\",\n         \"<IFRAME />\",\n         \"<IFRAME></IFRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_iframe_media\"},\n    {input: \"<iframe nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<iframe></iframe>\",\n         \"<iframe>\",\n         \"<iframe/>\",\n         \"<iframe />\",\n         \"<table><iframe></iframe></table>\",\n         \"<table><iframe></table>\",\n         \"<IFRAME />\",\n         \"<IFRAME></IFRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_iframe_nonce\"},\n    {input: \"<iframe srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<iframe></iframe>\",\n         \"<iframe>\",\n         \"<iframe/>\",\n         \"<iframe />\",\n         \"<table><iframe></iframe></table>\",\n         \"<table><iframe></table>\",\n         \"<IFRAME />\",\n         \"<IFRAME></IFRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_iframe_srcset\"},\n    {input: \"<iframe poster=\\\"x\\\">\",\n     acceptable: [\n         \"<iframe></iframe>\",\n         \"<iframe>\",\n         \"<iframe/>\",\n         \"<iframe />\",\n         \"<table><iframe></iframe></table>\",\n         \"<table><iframe></table>\",\n         \"<IFRAME />\",\n         \"<IFRAME></IFRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_iframe_poster\"},\n    {input: \"<iframe autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<iframe></iframe>\",\n         \"<iframe>\",\n         \"<iframe/>\",\n         \"<iframe />\",\n         \"<table><iframe></iframe></table>\",\n         \"<table><iframe></table>\",\n         \"<IFRAME />\",\n         \"<IFRAME></IFRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_iframe_autoplay\"},\n    {input: \"<iframe controls=\\\"x\\\">\",\n     acceptable: [\n         \"<iframe></iframe>\",\n         \"<iframe>\",\n         \"<iframe/>\",\n         \"<iframe />\",\n         \"<table><iframe></iframe></table>\",\n         \"<table><iframe></table>\",\n         \"<IFRAME />\",\n         \"<IFRAME></IFRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_iframe_controls\"},\n    {input: \"<iframe formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<iframe></iframe>\",\n         \"<iframe>\",\n         \"<iframe/>\",\n         \"<iframe />\",\n         \"<table><iframe></iframe></table>\",\n         \"<table><iframe></table>\",\n         \"<IFRAME />\",\n         \"<IFRAME></IFRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_iframe_formaction\"},\n    {input: \"<iframe formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<iframe></iframe>\",\n         \"<iframe>\",\n         \"<iframe/>\",\n         \"<iframe />\",\n         \"<table><iframe></iframe></table>\",\n         \"<table><iframe></table>\",\n         \"<IFRAME />\",\n         \"<IFRAME></IFRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_iframe_formmethod\"},\n    {input: \"<iframe pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<iframe></iframe>\",\n         \"<iframe>\",\n         \"<iframe/>\",\n         \"<iframe />\",\n         \"<table><iframe></iframe></table>\",\n         \"<table><iframe></table>\",\n         \"<IFRAME />\",\n         \"<IFRAME></IFRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_iframe_pattern\"},\n    {input: \"<iframe icon=\\\"x\\\">\",\n     acceptable: [\n         \"<iframe></iframe>\",\n         \"<iframe>\",\n         \"<iframe/>\",\n         \"<iframe />\",\n         \"<table><iframe></iframe></table>\",\n         \"<table><iframe></table>\",\n         \"<IFRAME />\",\n         \"<IFRAME></IFRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_iframe_icon\"},\n    {input: \"<iframe select=\\\"x\\\">\",\n     acceptable: [\n         \"<iframe></iframe>\",\n         \"<iframe>\",\n         \"<iframe/>\",\n         \"<iframe />\",\n         \"<table><iframe></iframe></table>\",\n         \"<table><iframe></table>\",\n         \"<IFRAME />\",\n         \"<IFRAME></IFRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_iframe_select\"},\n    {input: \"<embed></embed>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_embed_plain\"},\n    {input: \"<embed><script>alert()</script></embed>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_embed_scriptinside\"},\n    {input: \"<embed media=\\\"x\\\">\",\n     acceptable: [\n         \"<embed></embed>\",\n         \"<embed>\",\n         \"<embed/>\",\n         \"<embed />\",\n         \"<table><embed></embed></table>\",\n         \"<table><embed></table>\",\n         \"<EMBED />\",\n         \"<EMBED></EMBED>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_embed_media\"},\n    {input: \"<embed nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<embed></embed>\",\n         \"<embed>\",\n         \"<embed/>\",\n         \"<embed />\",\n         \"<table><embed></embed></table>\",\n         \"<table><embed></table>\",\n         \"<EMBED />\",\n         \"<EMBED></EMBED>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_embed_nonce\"},\n    {input: \"<embed srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<embed></embed>\",\n         \"<embed>\",\n         \"<embed/>\",\n         \"<embed />\",\n         \"<table><embed></embed></table>\",\n         \"<table><embed></table>\",\n         \"<EMBED />\",\n         \"<EMBED></EMBED>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_embed_srcset\"},\n    {input: \"<embed srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<embed></embed>\",\n         \"<embed>\",\n         \"<embed/>\",\n         \"<embed />\",\n         \"<table><embed></embed></table>\",\n         \"<table><embed></table>\",\n         \"<EMBED />\",\n         \"<EMBED></EMBED>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_embed_srcdoc\"},\n    {input: \"<embed poster=\\\"x\\\">\",\n     acceptable: [\n         \"<embed></embed>\",\n         \"<embed>\",\n         \"<embed/>\",\n         \"<embed />\",\n         \"<table><embed></embed></table>\",\n         \"<table><embed></table>\",\n         \"<EMBED />\",\n         \"<EMBED></EMBED>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_embed_poster\"},\n    {input: \"<embed autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<embed></embed>\",\n         \"<embed>\",\n         \"<embed/>\",\n         \"<embed />\",\n         \"<table><embed></embed></table>\",\n         \"<table><embed></table>\",\n         \"<EMBED />\",\n         \"<EMBED></EMBED>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_embed_autoplay\"},\n    {input: \"<embed controls=\\\"x\\\">\",\n     acceptable: [\n         \"<embed></embed>\",\n         \"<embed>\",\n         \"<embed/>\",\n         \"<embed />\",\n         \"<table><embed></embed></table>\",\n         \"<table><embed></table>\",\n         \"<EMBED />\",\n         \"<EMBED></EMBED>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_embed_controls\"},\n    {input: \"<embed formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<embed></embed>\",\n         \"<embed>\",\n         \"<embed/>\",\n         \"<embed />\",\n         \"<table><embed></embed></table>\",\n         \"<table><embed></table>\",\n         \"<EMBED />\",\n         \"<EMBED></EMBED>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_embed_formaction\"},\n    {input: \"<embed formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<embed></embed>\",\n         \"<embed>\",\n         \"<embed/>\",\n         \"<embed />\",\n         \"<table><embed></embed></table>\",\n         \"<table><embed></table>\",\n         \"<EMBED />\",\n         \"<EMBED></EMBED>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_embed_formmethod\"},\n    {input: \"<embed pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<embed></embed>\",\n         \"<embed>\",\n         \"<embed/>\",\n         \"<embed />\",\n         \"<table><embed></embed></table>\",\n         \"<table><embed></table>\",\n         \"<EMBED />\",\n         \"<EMBED></EMBED>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_embed_pattern\"},\n    {input: \"<embed icon=\\\"x\\\">\",\n     acceptable: [\n         \"<embed></embed>\",\n         \"<embed>\",\n         \"<embed/>\",\n         \"<embed />\",\n         \"<table><embed></embed></table>\",\n         \"<table><embed></table>\",\n         \"<EMBED />\",\n         \"<EMBED></EMBED>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_embed_icon\"},\n    {input: \"<embed select=\\\"x\\\">\",\n     acceptable: [\n         \"<embed></embed>\",\n         \"<embed>\",\n         \"<embed/>\",\n         \"<embed />\",\n         \"<table><embed></embed></table>\",\n         \"<table><embed></table>\",\n         \"<EMBED />\",\n         \"<EMBED></EMBED>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_embed_select\"},\n    {input: \"<object></object>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_object_plain\"},\n    {input: \"<object><script>alert()</script></object>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_object_scriptinside\"},\n    {input: \"<object media=\\\"x\\\">\",\n     acceptable: [\n         \"<object></object>\",\n         \"<object>\",\n         \"<object/>\",\n         \"<object />\",\n         \"<table><object></object></table>\",\n         \"<table><object></table>\",\n         \"<OBJECT />\",\n         \"<OBJECT></OBJECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_object_media\"},\n    {input: \"<object nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<object></object>\",\n         \"<object>\",\n         \"<object/>\",\n         \"<object />\",\n         \"<table><object></object></table>\",\n         \"<table><object></table>\",\n         \"<OBJECT />\",\n         \"<OBJECT></OBJECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_object_nonce\"},\n    {input: \"<object srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<object></object>\",\n         \"<object>\",\n         \"<object/>\",\n         \"<object />\",\n         \"<table><object></object></table>\",\n         \"<table><object></table>\",\n         \"<OBJECT />\",\n         \"<OBJECT></OBJECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_object_srcset\"},\n    {input: \"<object srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<object></object>\",\n         \"<object>\",\n         \"<object/>\",\n         \"<object />\",\n         \"<table><object></object></table>\",\n         \"<table><object></table>\",\n         \"<OBJECT />\",\n         \"<OBJECT></OBJECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_object_srcdoc\"},\n    {input: \"<object poster=\\\"x\\\">\",\n     acceptable: [\n         \"<object></object>\",\n         \"<object>\",\n         \"<object/>\",\n         \"<object />\",\n         \"<table><object></object></table>\",\n         \"<table><object></table>\",\n         \"<OBJECT />\",\n         \"<OBJECT></OBJECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_object_poster\"},\n    {input: \"<object autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<object></object>\",\n         \"<object>\",\n         \"<object/>\",\n         \"<object />\",\n         \"<table><object></object></table>\",\n         \"<table><object></table>\",\n         \"<OBJECT />\",\n         \"<OBJECT></OBJECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_object_autoplay\"},\n    {input: \"<object controls=\\\"x\\\">\",\n     acceptable: [\n         \"<object></object>\",\n         \"<object>\",\n         \"<object/>\",\n         \"<object />\",\n         \"<table><object></object></table>\",\n         \"<table><object></table>\",\n         \"<OBJECT />\",\n         \"<OBJECT></OBJECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_object_controls\"},\n    {input: \"<object formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<object></object>\",\n         \"<object>\",\n         \"<object/>\",\n         \"<object />\",\n         \"<table><object></object></table>\",\n         \"<table><object></table>\",\n         \"<OBJECT />\",\n         \"<OBJECT></OBJECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_object_formaction\"},\n    {input: \"<object formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<object></object>\",\n         \"<object>\",\n         \"<object/>\",\n         \"<object />\",\n         \"<table><object></object></table>\",\n         \"<table><object></table>\",\n         \"<OBJECT />\",\n         \"<OBJECT></OBJECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_object_formmethod\"},\n    {input: \"<object pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<object></object>\",\n         \"<object>\",\n         \"<object/>\",\n         \"<object />\",\n         \"<table><object></object></table>\",\n         \"<table><object></table>\",\n         \"<OBJECT />\",\n         \"<OBJECT></OBJECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_object_pattern\"},\n    {input: \"<object icon=\\\"x\\\">\",\n     acceptable: [\n         \"<object></object>\",\n         \"<object>\",\n         \"<object/>\",\n         \"<object />\",\n         \"<table><object></object></table>\",\n         \"<table><object></table>\",\n         \"<OBJECT />\",\n         \"<OBJECT></OBJECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_object_icon\"},\n    {input: \"<object select=\\\"x\\\">\",\n     acceptable: [\n         \"<object></object>\",\n         \"<object>\",\n         \"<object/>\",\n         \"<object />\",\n         \"<table><object></object></table>\",\n         \"<table><object></table>\",\n         \"<OBJECT />\",\n         \"<OBJECT></OBJECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_object_select\"},\n    {input: \"<param></param>\",\n     acceptable: [\n         \"<param>\",\n         \"<param />\",\n         \"<param/>\",\n         \"<param><param>\",\n         \"<param/><param/>\",\n         \"<param /><param />\",\n         \"<table><param></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_param_plain\"},\n    {input: \"<param><script>alert()</script></param>\",\n     acceptable: [\n         \"<param>\",\n         \"<param />\",\n         \"<param/>\",\n         \"<param><param>\",\n         \"<param/><param/>\",\n         \"<param /><param />\",\n         \"<table><param></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><param><td></td></table>\",\n     ],\n     name: \"contract_param_scriptinside\"},\n    {input: \"<param media=\\\"x\\\">\",\n     acceptable: [\n         \"<param></param>\",\n         \"<param>\",\n         \"<param/>\",\n         \"<param />\",\n         \"<table><param></param></table>\",\n         \"<table><param></table>\",\n         \"<PARAM />\",\n         \"<PARAM></PARAM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_param_media\"},\n    {input: \"<param nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<param></param>\",\n         \"<param>\",\n         \"<param/>\",\n         \"<param />\",\n         \"<table><param></param></table>\",\n         \"<table><param></table>\",\n         \"<PARAM />\",\n         \"<PARAM></PARAM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_param_nonce\"},\n    {input: \"<param srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<param></param>\",\n         \"<param>\",\n         \"<param/>\",\n         \"<param />\",\n         \"<table><param></param></table>\",\n         \"<table><param></table>\",\n         \"<PARAM />\",\n         \"<PARAM></PARAM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_param_srcset\"},\n    {input: \"<param srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<param></param>\",\n         \"<param>\",\n         \"<param/>\",\n         \"<param />\",\n         \"<table><param></param></table>\",\n         \"<table><param></table>\",\n         \"<PARAM />\",\n         \"<PARAM></PARAM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_param_srcdoc\"},\n    {input: \"<param poster=\\\"x\\\">\",\n     acceptable: [\n         \"<param></param>\",\n         \"<param>\",\n         \"<param/>\",\n         \"<param />\",\n         \"<table><param></param></table>\",\n         \"<table><param></table>\",\n         \"<PARAM />\",\n         \"<PARAM></PARAM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_param_poster\"},\n    {input: \"<param autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<param></param>\",\n         \"<param>\",\n         \"<param/>\",\n         \"<param />\",\n         \"<table><param></param></table>\",\n         \"<table><param></table>\",\n         \"<PARAM />\",\n         \"<PARAM></PARAM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_param_autoplay\"},\n    {input: \"<param controls=\\\"x\\\">\",\n     acceptable: [\n         \"<param></param>\",\n         \"<param>\",\n         \"<param/>\",\n         \"<param />\",\n         \"<table><param></param></table>\",\n         \"<table><param></table>\",\n         \"<PARAM />\",\n         \"<PARAM></PARAM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_param_controls\"},\n    {input: \"<param formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<param></param>\",\n         \"<param>\",\n         \"<param/>\",\n         \"<param />\",\n         \"<table><param></param></table>\",\n         \"<table><param></table>\",\n         \"<PARAM />\",\n         \"<PARAM></PARAM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_param_formaction\"},\n    {input: \"<param formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<param></param>\",\n         \"<param>\",\n         \"<param/>\",\n         \"<param />\",\n         \"<table><param></param></table>\",\n         \"<table><param></table>\",\n         \"<PARAM />\",\n         \"<PARAM></PARAM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_param_formmethod\"},\n    {input: \"<param pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<param></param>\",\n         \"<param>\",\n         \"<param/>\",\n         \"<param />\",\n         \"<table><param></param></table>\",\n         \"<table><param></table>\",\n         \"<PARAM />\",\n         \"<PARAM></PARAM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_param_pattern\"},\n    {input: \"<param icon=\\\"x\\\">\",\n     acceptable: [\n         \"<param></param>\",\n         \"<param>\",\n         \"<param/>\",\n         \"<param />\",\n         \"<table><param></param></table>\",\n         \"<table><param></table>\",\n         \"<PARAM />\",\n         \"<PARAM></PARAM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_param_icon\"},\n    {input: \"<param select=\\\"x\\\">\",\n     acceptable: [\n         \"<param></param>\",\n         \"<param>\",\n         \"<param/>\",\n         \"<param />\",\n         \"<table><param></param></table>\",\n         \"<table><param></table>\",\n         \"<PARAM />\",\n         \"<PARAM></PARAM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_param_select\"},\n    {input: \"<video></video>\",\n     acceptable: [\n         \"<video>\",\n         \"<video />\",\n         \"<video></video>\",\n         \"<table><video></video></table>\",\n         \"<VIDEO />\",\n         \"<VIDEO></VIDEO>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_video_plain\"},\n    {input: \"<video><script>alert()</script></video>\",\n     acceptable: [\n         \"<video>\",\n         \"<video />\",\n         \"<video></video>\",\n         \"<table><video></video></table>\",\n         \"<VIDEO />\",\n         \"<VIDEO></VIDEO>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><video><td></td></video></table>\",\n         \"<table><video></video><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_video_scriptinside\"},\n    {input: \"<video src=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<video src=\\\"about:invalid#zCSafez\\\"></video>\",\n         \"<video src=\\\"about:invalid#zCSafez\\\">\",\n         \"<video src=\\\"about:invalid#zGoSafez\\\"></video>\",\n         \"<video src=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<video src=\\\"javascript:void(0);\\\"></video>\",\n         \"<video src=\\\"javascript:void(0);\\\">\",\n         \"<video></video>\",\n         \"<video>\",\n         \"<video/>\",\n         \"<video />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_video_src\"},\n    {input: \"<video poster=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<video poster=\\\"about:invalid#zCSafez\\\"></video>\",\n         \"<video poster=\\\"about:invalid#zCSafez\\\">\",\n         \"<video poster=\\\"about:invalid#zGoSafez\\\"></video>\",\n         \"<video poster=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<video poster=\\\"javascript:void(0);\\\"></video>\",\n         \"<video poster=\\\"javascript:void(0);\\\">\",\n         \"<video></video>\",\n         \"<video>\",\n         \"<video/>\",\n         \"<video />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_video_poster\"},\n    {input: \"<video media=\\\"x\\\">\",\n     acceptable: [\n         \"<video></video>\",\n         \"<video>\",\n         \"<video/>\",\n         \"<video />\",\n         \"<table><video></video></table>\",\n         \"<table><video></table>\",\n         \"<VIDEO />\",\n         \"<VIDEO></VIDEO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_video_media\"},\n    {input: \"<video nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<video></video>\",\n         \"<video>\",\n         \"<video/>\",\n         \"<video />\",\n         \"<table><video></video></table>\",\n         \"<table><video></table>\",\n         \"<VIDEO />\",\n         \"<VIDEO></VIDEO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_video_nonce\"},\n    {input: \"<video srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<video></video>\",\n         \"<video>\",\n         \"<video/>\",\n         \"<video />\",\n         \"<table><video></video></table>\",\n         \"<table><video></table>\",\n         \"<VIDEO />\",\n         \"<VIDEO></VIDEO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_video_srcset\"},\n    {input: \"<video srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<video></video>\",\n         \"<video>\",\n         \"<video/>\",\n         \"<video />\",\n         \"<table><video></video></table>\",\n         \"<table><video></table>\",\n         \"<VIDEO />\",\n         \"<VIDEO></VIDEO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_video_srcdoc\"},\n    {input: \"<video formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<video></video>\",\n         \"<video>\",\n         \"<video/>\",\n         \"<video />\",\n         \"<table><video></video></table>\",\n         \"<table><video></table>\",\n         \"<VIDEO />\",\n         \"<VIDEO></VIDEO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_video_formaction\"},\n    {input: \"<video formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<video></video>\",\n         \"<video>\",\n         \"<video/>\",\n         \"<video />\",\n         \"<table><video></video></table>\",\n         \"<table><video></table>\",\n         \"<VIDEO />\",\n         \"<VIDEO></VIDEO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_video_formmethod\"},\n    {input: \"<video pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<video></video>\",\n         \"<video>\",\n         \"<video/>\",\n         \"<video />\",\n         \"<table><video></video></table>\",\n         \"<table><video></table>\",\n         \"<VIDEO />\",\n         \"<VIDEO></VIDEO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_video_pattern\"},\n    {input: \"<video icon=\\\"x\\\">\",\n     acceptable: [\n         \"<video></video>\",\n         \"<video>\",\n         \"<video/>\",\n         \"<video />\",\n         \"<table><video></video></table>\",\n         \"<table><video></table>\",\n         \"<VIDEO />\",\n         \"<VIDEO></VIDEO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_video_icon\"},\n    {input: \"<video select=\\\"x\\\">\",\n     acceptable: [\n         \"<video></video>\",\n         \"<video>\",\n         \"<video/>\",\n         \"<video />\",\n         \"<table><video></video></table>\",\n         \"<table><video></table>\",\n         \"<VIDEO />\",\n         \"<VIDEO></VIDEO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_video_select\"},\n    {input: \"<audio></audio>\",\n     acceptable: [\n         \"<audio>\",\n         \"<audio />\",\n         \"<audio></audio>\",\n         \"<table><audio></audio></table>\",\n         \"<AUDIO />\",\n         \"<AUDIO></AUDIO>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_audio_plain\"},\n    {input: \"<audio><script>alert()</script></audio>\",\n     acceptable: [\n         \"<audio>\",\n         \"<audio />\",\n         \"<audio></audio>\",\n         \"<table><audio></audio></table>\",\n         \"<AUDIO />\",\n         \"<AUDIO></AUDIO>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><audio><td></td></audio></table>\",\n         \"<table><audio></audio><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_audio_scriptinside\"},\n    {input: \"<audio src=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<audio src=\\\"about:invalid#zCSafez\\\"></audio>\",\n         \"<audio src=\\\"about:invalid#zCSafez\\\">\",\n         \"<audio src=\\\"about:invalid#zGoSafez\\\"></audio>\",\n         \"<audio src=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<audio src=\\\"javascript:void(0);\\\"></audio>\",\n         \"<audio src=\\\"javascript:void(0);\\\">\",\n         \"<audio></audio>\",\n         \"<audio>\",\n         \"<audio/>\",\n         \"<audio />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_audio_src\"},\n    {input: \"<audio media=\\\"x\\\">\",\n     acceptable: [\n         \"<audio></audio>\",\n         \"<audio>\",\n         \"<audio/>\",\n         \"<audio />\",\n         \"<table><audio></audio></table>\",\n         \"<table><audio></table>\",\n         \"<AUDIO />\",\n         \"<AUDIO></AUDIO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_audio_media\"},\n    {input: \"<audio nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<audio></audio>\",\n         \"<audio>\",\n         \"<audio/>\",\n         \"<audio />\",\n         \"<table><audio></audio></table>\",\n         \"<table><audio></table>\",\n         \"<AUDIO />\",\n         \"<AUDIO></AUDIO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_audio_nonce\"},\n    {input: \"<audio srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<audio></audio>\",\n         \"<audio>\",\n         \"<audio/>\",\n         \"<audio />\",\n         \"<table><audio></audio></table>\",\n         \"<table><audio></table>\",\n         \"<AUDIO />\",\n         \"<AUDIO></AUDIO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_audio_srcset\"},\n    {input: \"<audio srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<audio></audio>\",\n         \"<audio>\",\n         \"<audio/>\",\n         \"<audio />\",\n         \"<table><audio></audio></table>\",\n         \"<table><audio></table>\",\n         \"<AUDIO />\",\n         \"<AUDIO></AUDIO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_audio_srcdoc\"},\n    {input: \"<audio poster=\\\"x\\\">\",\n     acceptable: [\n         \"<audio></audio>\",\n         \"<audio>\",\n         \"<audio/>\",\n         \"<audio />\",\n         \"<table><audio></audio></table>\",\n         \"<table><audio></table>\",\n         \"<AUDIO />\",\n         \"<AUDIO></AUDIO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_audio_poster\"},\n    {input: \"<audio autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<audio></audio>\",\n         \"<audio>\",\n         \"<audio/>\",\n         \"<audio />\",\n         \"<table><audio></audio></table>\",\n         \"<table><audio></table>\",\n         \"<AUDIO />\",\n         \"<AUDIO></AUDIO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_audio_autoplay\"},\n    {input: \"<audio controls=\\\"x\\\">\",\n     acceptable: [\n         \"<audio></audio>\",\n         \"<audio>\",\n         \"<audio/>\",\n         \"<audio />\",\n         \"<table><audio></audio></table>\",\n         \"<table><audio></table>\",\n         \"<AUDIO />\",\n         \"<AUDIO></AUDIO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_audio_controls\"},\n    {input: \"<audio formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<audio></audio>\",\n         \"<audio>\",\n         \"<audio/>\",\n         \"<audio />\",\n         \"<table><audio></audio></table>\",\n         \"<table><audio></table>\",\n         \"<AUDIO />\",\n         \"<AUDIO></AUDIO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_audio_formaction\"},\n    {input: \"<audio formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<audio></audio>\",\n         \"<audio>\",\n         \"<audio/>\",\n         \"<audio />\",\n         \"<table><audio></audio></table>\",\n         \"<table><audio></table>\",\n         \"<AUDIO />\",\n         \"<AUDIO></AUDIO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_audio_formmethod\"},\n    {input: \"<audio pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<audio></audio>\",\n         \"<audio>\",\n         \"<audio/>\",\n         \"<audio />\",\n         \"<table><audio></audio></table>\",\n         \"<table><audio></table>\",\n         \"<AUDIO />\",\n         \"<AUDIO></AUDIO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_audio_pattern\"},\n    {input: \"<audio icon=\\\"x\\\">\",\n     acceptable: [\n         \"<audio></audio>\",\n         \"<audio>\",\n         \"<audio/>\",\n         \"<audio />\",\n         \"<table><audio></audio></table>\",\n         \"<table><audio></table>\",\n         \"<AUDIO />\",\n         \"<AUDIO></AUDIO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_audio_icon\"},\n    {input: \"<audio select=\\\"x\\\">\",\n     acceptable: [\n         \"<audio></audio>\",\n         \"<audio>\",\n         \"<audio/>\",\n         \"<audio />\",\n         \"<table><audio></audio></table>\",\n         \"<table><audio></table>\",\n         \"<AUDIO />\",\n         \"<AUDIO></AUDIO>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_audio_select\"},\n    {input: \"<track></track>\",\n     acceptable: [\n         \"<track>\",\n         \"<track />\",\n         \"<track/>\",\n         \"<track><track>\",\n         \"<track/><track/>\",\n         \"<track /><track />\",\n         \"<table><track></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_track_plain\"},\n    {input: \"<track><script>alert()</script></track>\",\n     acceptable: [\n         \"<track>\",\n         \"<track />\",\n         \"<track/>\",\n         \"<track><track>\",\n         \"<track/><track/>\",\n         \"<track /><track />\",\n         \"<table><track></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><track><td></td></table>\",\n     ],\n     name: \"contract_track_scriptinside\"},\n    {input: \"<track media=\\\"x\\\">\",\n     acceptable: [\n         \"<track></track>\",\n         \"<track>\",\n         \"<track/>\",\n         \"<track />\",\n         \"<table><track></track></table>\",\n         \"<table><track></table>\",\n         \"<TRACK />\",\n         \"<TRACK></TRACK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_track_media\"},\n    {input: \"<track nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<track></track>\",\n         \"<track>\",\n         \"<track/>\",\n         \"<track />\",\n         \"<table><track></track></table>\",\n         \"<table><track></table>\",\n         \"<TRACK />\",\n         \"<TRACK></TRACK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_track_nonce\"},\n    {input: \"<track srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<track></track>\",\n         \"<track>\",\n         \"<track/>\",\n         \"<track />\",\n         \"<table><track></track></table>\",\n         \"<table><track></table>\",\n         \"<TRACK />\",\n         \"<TRACK></TRACK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_track_srcset\"},\n    {input: \"<track srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<track></track>\",\n         \"<track>\",\n         \"<track/>\",\n         \"<track />\",\n         \"<table><track></track></table>\",\n         \"<table><track></table>\",\n         \"<TRACK />\",\n         \"<TRACK></TRACK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_track_srcdoc\"},\n    {input: \"<track poster=\\\"x\\\">\",\n     acceptable: [\n         \"<track></track>\",\n         \"<track>\",\n         \"<track/>\",\n         \"<track />\",\n         \"<table><track></track></table>\",\n         \"<table><track></table>\",\n         \"<TRACK />\",\n         \"<TRACK></TRACK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_track_poster\"},\n    {input: \"<track autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<track></track>\",\n         \"<track>\",\n         \"<track/>\",\n         \"<track />\",\n         \"<table><track></track></table>\",\n         \"<table><track></table>\",\n         \"<TRACK />\",\n         \"<TRACK></TRACK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_track_autoplay\"},\n    {input: \"<track controls=\\\"x\\\">\",\n     acceptable: [\n         \"<track></track>\",\n         \"<track>\",\n         \"<track/>\",\n         \"<track />\",\n         \"<table><track></track></table>\",\n         \"<table><track></table>\",\n         \"<TRACK />\",\n         \"<TRACK></TRACK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_track_controls\"},\n    {input: \"<track formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<track></track>\",\n         \"<track>\",\n         \"<track/>\",\n         \"<track />\",\n         \"<table><track></track></table>\",\n         \"<table><track></table>\",\n         \"<TRACK />\",\n         \"<TRACK></TRACK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_track_formaction\"},\n    {input: \"<track formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<track></track>\",\n         \"<track>\",\n         \"<track/>\",\n         \"<track />\",\n         \"<table><track></track></table>\",\n         \"<table><track></table>\",\n         \"<TRACK />\",\n         \"<TRACK></TRACK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_track_formmethod\"},\n    {input: \"<track pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<track></track>\",\n         \"<track>\",\n         \"<track/>\",\n         \"<track />\",\n         \"<table><track></track></table>\",\n         \"<table><track></table>\",\n         \"<TRACK />\",\n         \"<TRACK></TRACK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_track_pattern\"},\n    {input: \"<track icon=\\\"x\\\">\",\n     acceptable: [\n         \"<track></track>\",\n         \"<track>\",\n         \"<track/>\",\n         \"<track />\",\n         \"<table><track></track></table>\",\n         \"<table><track></table>\",\n         \"<TRACK />\",\n         \"<TRACK></TRACK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_track_icon\"},\n    {input: \"<track select=\\\"x\\\">\",\n     acceptable: [\n         \"<track></track>\",\n         \"<track>\",\n         \"<track/>\",\n         \"<track />\",\n         \"<table><track></track></table>\",\n         \"<table><track></table>\",\n         \"<TRACK />\",\n         \"<TRACK></TRACK>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_track_select\"},\n    {input: \"<map></map>\",\n     acceptable: [\n         \"<map>\",\n         \"<map />\",\n         \"<map></map>\",\n         \"<table><map></map></table>\",\n         \"<MAP />\",\n         \"<MAP></MAP>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_map_plain\"},\n    {input: \"<map><script>alert()</script></map>\",\n     acceptable: [\n         \"<map>\",\n         \"<map />\",\n         \"<map></map>\",\n         \"<table><map></map></table>\",\n         \"<MAP />\",\n         \"<MAP></MAP>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><map><td></td></map></table>\",\n         \"<table><map></map><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_map_scriptinside\"},\n    {input: \"<map media=\\\"x\\\">\",\n     acceptable: [\n         \"<map></map>\",\n         \"<map>\",\n         \"<map/>\",\n         \"<map />\",\n         \"<table><map></map></table>\",\n         \"<table><map></table>\",\n         \"<MAP />\",\n         \"<MAP></MAP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_map_media\"},\n    {input: \"<map nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<map></map>\",\n         \"<map>\",\n         \"<map/>\",\n         \"<map />\",\n         \"<table><map></map></table>\",\n         \"<table><map></table>\",\n         \"<MAP />\",\n         \"<MAP></MAP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_map_nonce\"},\n    {input: \"<map srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<map></map>\",\n         \"<map>\",\n         \"<map/>\",\n         \"<map />\",\n         \"<table><map></map></table>\",\n         \"<table><map></table>\",\n         \"<MAP />\",\n         \"<MAP></MAP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_map_srcset\"},\n    {input: \"<map srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<map></map>\",\n         \"<map>\",\n         \"<map/>\",\n         \"<map />\",\n         \"<table><map></map></table>\",\n         \"<table><map></table>\",\n         \"<MAP />\",\n         \"<MAP></MAP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_map_srcdoc\"},\n    {input: \"<map poster=\\\"x\\\">\",\n     acceptable: [\n         \"<map></map>\",\n         \"<map>\",\n         \"<map/>\",\n         \"<map />\",\n         \"<table><map></map></table>\",\n         \"<table><map></table>\",\n         \"<MAP />\",\n         \"<MAP></MAP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_map_poster\"},\n    {input: \"<map autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<map></map>\",\n         \"<map>\",\n         \"<map/>\",\n         \"<map />\",\n         \"<table><map></map></table>\",\n         \"<table><map></table>\",\n         \"<MAP />\",\n         \"<MAP></MAP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_map_autoplay\"},\n    {input: \"<map controls=\\\"x\\\">\",\n     acceptable: [\n         \"<map></map>\",\n         \"<map>\",\n         \"<map/>\",\n         \"<map />\",\n         \"<table><map></map></table>\",\n         \"<table><map></table>\",\n         \"<MAP />\",\n         \"<MAP></MAP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_map_controls\"},\n    {input: \"<map formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<map></map>\",\n         \"<map>\",\n         \"<map/>\",\n         \"<map />\",\n         \"<table><map></map></table>\",\n         \"<table><map></table>\",\n         \"<MAP />\",\n         \"<MAP></MAP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_map_formaction\"},\n    {input: \"<map formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<map></map>\",\n         \"<map>\",\n         \"<map/>\",\n         \"<map />\",\n         \"<table><map></map></table>\",\n         \"<table><map></table>\",\n         \"<MAP />\",\n         \"<MAP></MAP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_map_formmethod\"},\n    {input: \"<map pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<map></map>\",\n         \"<map>\",\n         \"<map/>\",\n         \"<map />\",\n         \"<table><map></map></table>\",\n         \"<table><map></table>\",\n         \"<MAP />\",\n         \"<MAP></MAP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_map_pattern\"},\n    {input: \"<map icon=\\\"x\\\">\",\n     acceptable: [\n         \"<map></map>\",\n         \"<map>\",\n         \"<map/>\",\n         \"<map />\",\n         \"<table><map></map></table>\",\n         \"<table><map></table>\",\n         \"<MAP />\",\n         \"<MAP></MAP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_map_icon\"},\n    {input: \"<map select=\\\"x\\\">\",\n     acceptable: [\n         \"<map></map>\",\n         \"<map>\",\n         \"<map/>\",\n         \"<map />\",\n         \"<table><map></map></table>\",\n         \"<table><map></table>\",\n         \"<MAP />\",\n         \"<MAP></MAP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_map_select\"},\n    {input: \"<table></table>\",\n     acceptable: [\n         \"<table>\",\n         \"<table />\",\n         \"<table></table>\",\n         \"<table><table></table></table>\",\n         \"<TABLE />\",\n         \"<TABLE></TABLE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_table_plain\"},\n    {input: \"<table><script>alert()</script></table>\",\n     acceptable: [\n         \"<table>\",\n         \"<table />\",\n         \"<table></table>\",\n         \"<table><table></table></table>\",\n         \"<TABLE />\",\n         \"<TABLE></TABLE>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><table><td></td></table></table>\",\n         \"<table><table></table><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_table_scriptinside\"},\n    {input: \"<table media=\\\"x\\\">\",\n     acceptable: [\n         \"<table></table>\",\n         \"<table>\",\n         \"<table/>\",\n         \"<table />\",\n         \"<table><table></table></table>\",\n         \"<table><table></table>\",\n         \"<TABLE />\",\n         \"<TABLE></TABLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_table_media\"},\n    {input: \"<table nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<table></table>\",\n         \"<table>\",\n         \"<table/>\",\n         \"<table />\",\n         \"<table><table></table></table>\",\n         \"<table><table></table>\",\n         \"<TABLE />\",\n         \"<TABLE></TABLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_table_nonce\"},\n    {input: \"<table srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<table></table>\",\n         \"<table>\",\n         \"<table/>\",\n         \"<table />\",\n         \"<table><table></table></table>\",\n         \"<table><table></table>\",\n         \"<TABLE />\",\n         \"<TABLE></TABLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_table_srcset\"},\n    {input: \"<table srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<table></table>\",\n         \"<table>\",\n         \"<table/>\",\n         \"<table />\",\n         \"<table><table></table></table>\",\n         \"<table><table></table>\",\n         \"<TABLE />\",\n         \"<TABLE></TABLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_table_srcdoc\"},\n    {input: \"<table poster=\\\"x\\\">\",\n     acceptable: [\n         \"<table></table>\",\n         \"<table>\",\n         \"<table/>\",\n         \"<table />\",\n         \"<table><table></table></table>\",\n         \"<table><table></table>\",\n         \"<TABLE />\",\n         \"<TABLE></TABLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_table_poster\"},\n    {input: \"<table autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<table></table>\",\n         \"<table>\",\n         \"<table/>\",\n         \"<table />\",\n         \"<table><table></table></table>\",\n         \"<table><table></table>\",\n         \"<TABLE />\",\n         \"<TABLE></TABLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_table_autoplay\"},\n    {input: \"<table controls=\\\"x\\\">\",\n     acceptable: [\n         \"<table></table>\",\n         \"<table>\",\n         \"<table/>\",\n         \"<table />\",\n         \"<table><table></table></table>\",\n         \"<table><table></table>\",\n         \"<TABLE />\",\n         \"<TABLE></TABLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_table_controls\"},\n    {input: \"<table formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<table></table>\",\n         \"<table>\",\n         \"<table/>\",\n         \"<table />\",\n         \"<table><table></table></table>\",\n         \"<table><table></table>\",\n         \"<TABLE />\",\n         \"<TABLE></TABLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_table_formaction\"},\n    {input: \"<table formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<table></table>\",\n         \"<table>\",\n         \"<table/>\",\n         \"<table />\",\n         \"<table><table></table></table>\",\n         \"<table><table></table>\",\n         \"<TABLE />\",\n         \"<TABLE></TABLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_table_formmethod\"},\n    {input: \"<table pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<table></table>\",\n         \"<table>\",\n         \"<table/>\",\n         \"<table />\",\n         \"<table><table></table></table>\",\n         \"<table><table></table>\",\n         \"<TABLE />\",\n         \"<TABLE></TABLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_table_pattern\"},\n    {input: \"<table icon=\\\"x\\\">\",\n     acceptable: [\n         \"<table></table>\",\n         \"<table>\",\n         \"<table/>\",\n         \"<table />\",\n         \"<table><table></table></table>\",\n         \"<table><table></table>\",\n         \"<TABLE />\",\n         \"<TABLE></TABLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_table_icon\"},\n    {input: \"<table select=\\\"x\\\">\",\n     acceptable: [\n         \"<table></table>\",\n         \"<table>\",\n         \"<table/>\",\n         \"<table />\",\n         \"<table><table></table></table>\",\n         \"<table><table></table>\",\n         \"<TABLE />\",\n         \"<TABLE></TABLE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_table_select\"},\n    {input: \"<caption></caption>\",\n     acceptable: [\n         \"<caption>\",\n         \"<caption />\",\n         \"<caption></caption>\",\n         \"<table><caption></caption></table>\",\n         \"<CAPTION />\",\n         \"<CAPTION></CAPTION>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_caption_plain\"},\n    {input: \"<caption><script>alert()</script></caption>\",\n     acceptable: [\n         \"<caption>\",\n         \"<caption />\",\n         \"<caption></caption>\",\n         \"<table><caption></caption></table>\",\n         \"<CAPTION />\",\n         \"<CAPTION></CAPTION>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><caption><td></td></caption></table>\",\n         \"<table><caption></caption><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_caption_scriptinside\"},\n    {input: \"<caption media=\\\"x\\\">\",\n     acceptable: [\n         \"<caption></caption>\",\n         \"<caption>\",\n         \"<caption/>\",\n         \"<caption />\",\n         \"<table><caption></caption></table>\",\n         \"<table><caption></table>\",\n         \"<CAPTION />\",\n         \"<CAPTION></CAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_caption_media\"},\n    {input: \"<caption nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<caption></caption>\",\n         \"<caption>\",\n         \"<caption/>\",\n         \"<caption />\",\n         \"<table><caption></caption></table>\",\n         \"<table><caption></table>\",\n         \"<CAPTION />\",\n         \"<CAPTION></CAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_caption_nonce\"},\n    {input: \"<caption srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<caption></caption>\",\n         \"<caption>\",\n         \"<caption/>\",\n         \"<caption />\",\n         \"<table><caption></caption></table>\",\n         \"<table><caption></table>\",\n         \"<CAPTION />\",\n         \"<CAPTION></CAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_caption_srcset\"},\n    {input: \"<caption srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<caption></caption>\",\n         \"<caption>\",\n         \"<caption/>\",\n         \"<caption />\",\n         \"<table><caption></caption></table>\",\n         \"<table><caption></table>\",\n         \"<CAPTION />\",\n         \"<CAPTION></CAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_caption_srcdoc\"},\n    {input: \"<caption poster=\\\"x\\\">\",\n     acceptable: [\n         \"<caption></caption>\",\n         \"<caption>\",\n         \"<caption/>\",\n         \"<caption />\",\n         \"<table><caption></caption></table>\",\n         \"<table><caption></table>\",\n         \"<CAPTION />\",\n         \"<CAPTION></CAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_caption_poster\"},\n    {input: \"<caption autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<caption></caption>\",\n         \"<caption>\",\n         \"<caption/>\",\n         \"<caption />\",\n         \"<table><caption></caption></table>\",\n         \"<table><caption></table>\",\n         \"<CAPTION />\",\n         \"<CAPTION></CAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_caption_autoplay\"},\n    {input: \"<caption controls=\\\"x\\\">\",\n     acceptable: [\n         \"<caption></caption>\",\n         \"<caption>\",\n         \"<caption/>\",\n         \"<caption />\",\n         \"<table><caption></caption></table>\",\n         \"<table><caption></table>\",\n         \"<CAPTION />\",\n         \"<CAPTION></CAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_caption_controls\"},\n    {input: \"<caption formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<caption></caption>\",\n         \"<caption>\",\n         \"<caption/>\",\n         \"<caption />\",\n         \"<table><caption></caption></table>\",\n         \"<table><caption></table>\",\n         \"<CAPTION />\",\n         \"<CAPTION></CAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_caption_formaction\"},\n    {input: \"<caption formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<caption></caption>\",\n         \"<caption>\",\n         \"<caption/>\",\n         \"<caption />\",\n         \"<table><caption></caption></table>\",\n         \"<table><caption></table>\",\n         \"<CAPTION />\",\n         \"<CAPTION></CAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_caption_formmethod\"},\n    {input: \"<caption pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<caption></caption>\",\n         \"<caption>\",\n         \"<caption/>\",\n         \"<caption />\",\n         \"<table><caption></caption></table>\",\n         \"<table><caption></table>\",\n         \"<CAPTION />\",\n         \"<CAPTION></CAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_caption_pattern\"},\n    {input: \"<caption icon=\\\"x\\\">\",\n     acceptable: [\n         \"<caption></caption>\",\n         \"<caption>\",\n         \"<caption/>\",\n         \"<caption />\",\n         \"<table><caption></caption></table>\",\n         \"<table><caption></table>\",\n         \"<CAPTION />\",\n         \"<CAPTION></CAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_caption_icon\"},\n    {input: \"<caption select=\\\"x\\\">\",\n     acceptable: [\n         \"<caption></caption>\",\n         \"<caption>\",\n         \"<caption/>\",\n         \"<caption />\",\n         \"<table><caption></caption></table>\",\n         \"<table><caption></table>\",\n         \"<CAPTION />\",\n         \"<CAPTION></CAPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_caption_select\"},\n    {input: \"<colgroup></colgroup>\",\n     acceptable: [\n         \"<colgroup>\",\n         \"<colgroup />\",\n         \"<colgroup></colgroup>\",\n         \"<table><colgroup></colgroup></table>\",\n         \"<COLGROUP />\",\n         \"<COLGROUP></COLGROUP>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_colgroup_plain\"},\n    {input: \"<colgroup><script>alert()</script></colgroup>\",\n     acceptable: [\n         \"<colgroup>\",\n         \"<colgroup />\",\n         \"<colgroup></colgroup>\",\n         \"<table><colgroup></colgroup></table>\",\n         \"<COLGROUP />\",\n         \"<COLGROUP></COLGROUP>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><colgroup><td></td></colgroup></table>\",\n         \"<table><colgroup></colgroup><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_colgroup_scriptinside\"},\n    {input: \"<colgroup media=\\\"x\\\">\",\n     acceptable: [\n         \"<colgroup></colgroup>\",\n         \"<colgroup>\",\n         \"<colgroup/>\",\n         \"<colgroup />\",\n         \"<table><colgroup></colgroup></table>\",\n         \"<table><colgroup></table>\",\n         \"<COLGROUP />\",\n         \"<COLGROUP></COLGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_colgroup_media\"},\n    {input: \"<colgroup nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<colgroup></colgroup>\",\n         \"<colgroup>\",\n         \"<colgroup/>\",\n         \"<colgroup />\",\n         \"<table><colgroup></colgroup></table>\",\n         \"<table><colgroup></table>\",\n         \"<COLGROUP />\",\n         \"<COLGROUP></COLGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_colgroup_nonce\"},\n    {input: \"<colgroup srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<colgroup></colgroup>\",\n         \"<colgroup>\",\n         \"<colgroup/>\",\n         \"<colgroup />\",\n         \"<table><colgroup></colgroup></table>\",\n         \"<table><colgroup></table>\",\n         \"<COLGROUP />\",\n         \"<COLGROUP></COLGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_colgroup_srcset\"},\n    {input: \"<colgroup srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<colgroup></colgroup>\",\n         \"<colgroup>\",\n         \"<colgroup/>\",\n         \"<colgroup />\",\n         \"<table><colgroup></colgroup></table>\",\n         \"<table><colgroup></table>\",\n         \"<COLGROUP />\",\n         \"<COLGROUP></COLGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_colgroup_srcdoc\"},\n    {input: \"<colgroup poster=\\\"x\\\">\",\n     acceptable: [\n         \"<colgroup></colgroup>\",\n         \"<colgroup>\",\n         \"<colgroup/>\",\n         \"<colgroup />\",\n         \"<table><colgroup></colgroup></table>\",\n         \"<table><colgroup></table>\",\n         \"<COLGROUP />\",\n         \"<COLGROUP></COLGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_colgroup_poster\"},\n    {input: \"<colgroup autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<colgroup></colgroup>\",\n         \"<colgroup>\",\n         \"<colgroup/>\",\n         \"<colgroup />\",\n         \"<table><colgroup></colgroup></table>\",\n         \"<table><colgroup></table>\",\n         \"<COLGROUP />\",\n         \"<COLGROUP></COLGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_colgroup_autoplay\"},\n    {input: \"<colgroup controls=\\\"x\\\">\",\n     acceptable: [\n         \"<colgroup></colgroup>\",\n         \"<colgroup>\",\n         \"<colgroup/>\",\n         \"<colgroup />\",\n         \"<table><colgroup></colgroup></table>\",\n         \"<table><colgroup></table>\",\n         \"<COLGROUP />\",\n         \"<COLGROUP></COLGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_colgroup_controls\"},\n    {input: \"<colgroup formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<colgroup></colgroup>\",\n         \"<colgroup>\",\n         \"<colgroup/>\",\n         \"<colgroup />\",\n         \"<table><colgroup></colgroup></table>\",\n         \"<table><colgroup></table>\",\n         \"<COLGROUP />\",\n         \"<COLGROUP></COLGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_colgroup_formaction\"},\n    {input: \"<colgroup formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<colgroup></colgroup>\",\n         \"<colgroup>\",\n         \"<colgroup/>\",\n         \"<colgroup />\",\n         \"<table><colgroup></colgroup></table>\",\n         \"<table><colgroup></table>\",\n         \"<COLGROUP />\",\n         \"<COLGROUP></COLGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_colgroup_formmethod\"},\n    {input: \"<colgroup pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<colgroup></colgroup>\",\n         \"<colgroup>\",\n         \"<colgroup/>\",\n         \"<colgroup />\",\n         \"<table><colgroup></colgroup></table>\",\n         \"<table><colgroup></table>\",\n         \"<COLGROUP />\",\n         \"<COLGROUP></COLGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_colgroup_pattern\"},\n    {input: \"<colgroup icon=\\\"x\\\">\",\n     acceptable: [\n         \"<colgroup></colgroup>\",\n         \"<colgroup>\",\n         \"<colgroup/>\",\n         \"<colgroup />\",\n         \"<table><colgroup></colgroup></table>\",\n         \"<table><colgroup></table>\",\n         \"<COLGROUP />\",\n         \"<COLGROUP></COLGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_colgroup_icon\"},\n    {input: \"<colgroup select=\\\"x\\\">\",\n     acceptable: [\n         \"<colgroup></colgroup>\",\n         \"<colgroup>\",\n         \"<colgroup/>\",\n         \"<colgroup />\",\n         \"<table><colgroup></colgroup></table>\",\n         \"<table><colgroup></table>\",\n         \"<COLGROUP />\",\n         \"<COLGROUP></COLGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_colgroup_select\"},\n    {input: \"<col></col>\",\n     acceptable: [\n         \"<col>\",\n         \"<col />\",\n         \"<col/>\",\n         \"<col><col>\",\n         \"<col/><col/>\",\n         \"<col /><col />\",\n         \"<table><col></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_col_plain\"},\n    {input: \"<col><script>alert()</script></col>\",\n     acceptable: [\n         \"<col>\",\n         \"<col />\",\n         \"<col/>\",\n         \"<col><col>\",\n         \"<col/><col/>\",\n         \"<col /><col />\",\n         \"<table><col></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><col><td></td></table>\",\n     ],\n     name: \"contract_col_scriptinside\"},\n    {input: \"<col media=\\\"x\\\">\",\n     acceptable: [\n         \"<col></col>\",\n         \"<col>\",\n         \"<col/>\",\n         \"<col />\",\n         \"<table><col></col></table>\",\n         \"<table><col></table>\",\n         \"<COL />\",\n         \"<COL></COL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_col_media\"},\n    {input: \"<col nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<col></col>\",\n         \"<col>\",\n         \"<col/>\",\n         \"<col />\",\n         \"<table><col></col></table>\",\n         \"<table><col></table>\",\n         \"<COL />\",\n         \"<COL></COL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_col_nonce\"},\n    {input: \"<col srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<col></col>\",\n         \"<col>\",\n         \"<col/>\",\n         \"<col />\",\n         \"<table><col></col></table>\",\n         \"<table><col></table>\",\n         \"<COL />\",\n         \"<COL></COL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_col_srcset\"},\n    {input: \"<col srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<col></col>\",\n         \"<col>\",\n         \"<col/>\",\n         \"<col />\",\n         \"<table><col></col></table>\",\n         \"<table><col></table>\",\n         \"<COL />\",\n         \"<COL></COL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_col_srcdoc\"},\n    {input: \"<col poster=\\\"x\\\">\",\n     acceptable: [\n         \"<col></col>\",\n         \"<col>\",\n         \"<col/>\",\n         \"<col />\",\n         \"<table><col></col></table>\",\n         \"<table><col></table>\",\n         \"<COL />\",\n         \"<COL></COL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_col_poster\"},\n    {input: \"<col autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<col></col>\",\n         \"<col>\",\n         \"<col/>\",\n         \"<col />\",\n         \"<table><col></col></table>\",\n         \"<table><col></table>\",\n         \"<COL />\",\n         \"<COL></COL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_col_autoplay\"},\n    {input: \"<col controls=\\\"x\\\">\",\n     acceptable: [\n         \"<col></col>\",\n         \"<col>\",\n         \"<col/>\",\n         \"<col />\",\n         \"<table><col></col></table>\",\n         \"<table><col></table>\",\n         \"<COL />\",\n         \"<COL></COL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_col_controls\"},\n    {input: \"<col formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<col></col>\",\n         \"<col>\",\n         \"<col/>\",\n         \"<col />\",\n         \"<table><col></col></table>\",\n         \"<table><col></table>\",\n         \"<COL />\",\n         \"<COL></COL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_col_formaction\"},\n    {input: \"<col formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<col></col>\",\n         \"<col>\",\n         \"<col/>\",\n         \"<col />\",\n         \"<table><col></col></table>\",\n         \"<table><col></table>\",\n         \"<COL />\",\n         \"<COL></COL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_col_formmethod\"},\n    {input: \"<col pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<col></col>\",\n         \"<col>\",\n         \"<col/>\",\n         \"<col />\",\n         \"<table><col></col></table>\",\n         \"<table><col></table>\",\n         \"<COL />\",\n         \"<COL></COL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_col_pattern\"},\n    {input: \"<col icon=\\\"x\\\">\",\n     acceptable: [\n         \"<col></col>\",\n         \"<col>\",\n         \"<col/>\",\n         \"<col />\",\n         \"<table><col></col></table>\",\n         \"<table><col></table>\",\n         \"<COL />\",\n         \"<COL></COL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_col_icon\"},\n    {input: \"<col select=\\\"x\\\">\",\n     acceptable: [\n         \"<col></col>\",\n         \"<col>\",\n         \"<col/>\",\n         \"<col />\",\n         \"<table><col></col></table>\",\n         \"<table><col></table>\",\n         \"<COL />\",\n         \"<COL></COL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_col_select\"},\n    {input: \"<tbody></tbody>\",\n     acceptable: [\n         \"<tbody>\",\n         \"<tbody />\",\n         \"<tbody></tbody>\",\n         \"<table><tbody></tbody></table>\",\n         \"<TBODY />\",\n         \"<TBODY></TBODY>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tbody_plain\"},\n    {input: \"<tbody><script>alert()</script></tbody>\",\n     acceptable: [\n         \"<tbody>\",\n         \"<tbody />\",\n         \"<tbody></tbody>\",\n         \"<table><tbody></tbody></table>\",\n         \"<TBODY />\",\n         \"<TBODY></TBODY>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><tbody><td></td></tbody></table>\",\n         \"<table><tbody></tbody><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_tbody_scriptinside\"},\n    {input: \"<tbody media=\\\"x\\\">\",\n     acceptable: [\n         \"<tbody></tbody>\",\n         \"<tbody>\",\n         \"<tbody/>\",\n         \"<tbody />\",\n         \"<table><tbody></tbody></table>\",\n         \"<table><tbody></table>\",\n         \"<TBODY />\",\n         \"<TBODY></TBODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tbody_media\"},\n    {input: \"<tbody nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<tbody></tbody>\",\n         \"<tbody>\",\n         \"<tbody/>\",\n         \"<tbody />\",\n         \"<table><tbody></tbody></table>\",\n         \"<table><tbody></table>\",\n         \"<TBODY />\",\n         \"<TBODY></TBODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tbody_nonce\"},\n    {input: \"<tbody srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<tbody></tbody>\",\n         \"<tbody>\",\n         \"<tbody/>\",\n         \"<tbody />\",\n         \"<table><tbody></tbody></table>\",\n         \"<table><tbody></table>\",\n         \"<TBODY />\",\n         \"<TBODY></TBODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tbody_srcset\"},\n    {input: \"<tbody srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<tbody></tbody>\",\n         \"<tbody>\",\n         \"<tbody/>\",\n         \"<tbody />\",\n         \"<table><tbody></tbody></table>\",\n         \"<table><tbody></table>\",\n         \"<TBODY />\",\n         \"<TBODY></TBODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tbody_srcdoc\"},\n    {input: \"<tbody poster=\\\"x\\\">\",\n     acceptable: [\n         \"<tbody></tbody>\",\n         \"<tbody>\",\n         \"<tbody/>\",\n         \"<tbody />\",\n         \"<table><tbody></tbody></table>\",\n         \"<table><tbody></table>\",\n         \"<TBODY />\",\n         \"<TBODY></TBODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tbody_poster\"},\n    {input: \"<tbody autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<tbody></tbody>\",\n         \"<tbody>\",\n         \"<tbody/>\",\n         \"<tbody />\",\n         \"<table><tbody></tbody></table>\",\n         \"<table><tbody></table>\",\n         \"<TBODY />\",\n         \"<TBODY></TBODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tbody_autoplay\"},\n    {input: \"<tbody controls=\\\"x\\\">\",\n     acceptable: [\n         \"<tbody></tbody>\",\n         \"<tbody>\",\n         \"<tbody/>\",\n         \"<tbody />\",\n         \"<table><tbody></tbody></table>\",\n         \"<table><tbody></table>\",\n         \"<TBODY />\",\n         \"<TBODY></TBODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tbody_controls\"},\n    {input: \"<tbody formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<tbody></tbody>\",\n         \"<tbody>\",\n         \"<tbody/>\",\n         \"<tbody />\",\n         \"<table><tbody></tbody></table>\",\n         \"<table><tbody></table>\",\n         \"<TBODY />\",\n         \"<TBODY></TBODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tbody_formaction\"},\n    {input: \"<tbody formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<tbody></tbody>\",\n         \"<tbody>\",\n         \"<tbody/>\",\n         \"<tbody />\",\n         \"<table><tbody></tbody></table>\",\n         \"<table><tbody></table>\",\n         \"<TBODY />\",\n         \"<TBODY></TBODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tbody_formmethod\"},\n    {input: \"<tbody pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<tbody></tbody>\",\n         \"<tbody>\",\n         \"<tbody/>\",\n         \"<tbody />\",\n         \"<table><tbody></tbody></table>\",\n         \"<table><tbody></table>\",\n         \"<TBODY />\",\n         \"<TBODY></TBODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tbody_pattern\"},\n    {input: \"<tbody icon=\\\"x\\\">\",\n     acceptable: [\n         \"<tbody></tbody>\",\n         \"<tbody>\",\n         \"<tbody/>\",\n         \"<tbody />\",\n         \"<table><tbody></tbody></table>\",\n         \"<table><tbody></table>\",\n         \"<TBODY />\",\n         \"<TBODY></TBODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tbody_icon\"},\n    {input: \"<tbody select=\\\"x\\\">\",\n     acceptable: [\n         \"<tbody></tbody>\",\n         \"<tbody>\",\n         \"<tbody/>\",\n         \"<tbody />\",\n         \"<table><tbody></tbody></table>\",\n         \"<table><tbody></table>\",\n         \"<TBODY />\",\n         \"<TBODY></TBODY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tbody_select\"},\n    {input: \"<thead></thead>\",\n     acceptable: [\n         \"<thead>\",\n         \"<thead />\",\n         \"<thead></thead>\",\n         \"<table><thead></thead></table>\",\n         \"<THEAD />\",\n         \"<THEAD></THEAD>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_thead_plain\"},\n    {input: \"<thead><script>alert()</script></thead>\",\n     acceptable: [\n         \"<thead>\",\n         \"<thead />\",\n         \"<thead></thead>\",\n         \"<table><thead></thead></table>\",\n         \"<THEAD />\",\n         \"<THEAD></THEAD>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><thead><td></td></thead></table>\",\n         \"<table><thead></thead><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_thead_scriptinside\"},\n    {input: \"<thead media=\\\"x\\\">\",\n     acceptable: [\n         \"<thead></thead>\",\n         \"<thead>\",\n         \"<thead/>\",\n         \"<thead />\",\n         \"<table><thead></thead></table>\",\n         \"<table><thead></table>\",\n         \"<THEAD />\",\n         \"<THEAD></THEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_thead_media\"},\n    {input: \"<thead nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<thead></thead>\",\n         \"<thead>\",\n         \"<thead/>\",\n         \"<thead />\",\n         \"<table><thead></thead></table>\",\n         \"<table><thead></table>\",\n         \"<THEAD />\",\n         \"<THEAD></THEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_thead_nonce\"},\n    {input: \"<thead srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<thead></thead>\",\n         \"<thead>\",\n         \"<thead/>\",\n         \"<thead />\",\n         \"<table><thead></thead></table>\",\n         \"<table><thead></table>\",\n         \"<THEAD />\",\n         \"<THEAD></THEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_thead_srcset\"},\n    {input: \"<thead srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<thead></thead>\",\n         \"<thead>\",\n         \"<thead/>\",\n         \"<thead />\",\n         \"<table><thead></thead></table>\",\n         \"<table><thead></table>\",\n         \"<THEAD />\",\n         \"<THEAD></THEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_thead_srcdoc\"},\n    {input: \"<thead poster=\\\"x\\\">\",\n     acceptable: [\n         \"<thead></thead>\",\n         \"<thead>\",\n         \"<thead/>\",\n         \"<thead />\",\n         \"<table><thead></thead></table>\",\n         \"<table><thead></table>\",\n         \"<THEAD />\",\n         \"<THEAD></THEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_thead_poster\"},\n    {input: \"<thead autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<thead></thead>\",\n         \"<thead>\",\n         \"<thead/>\",\n         \"<thead />\",\n         \"<table><thead></thead></table>\",\n         \"<table><thead></table>\",\n         \"<THEAD />\",\n         \"<THEAD></THEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_thead_autoplay\"},\n    {input: \"<thead controls=\\\"x\\\">\",\n     acceptable: [\n         \"<thead></thead>\",\n         \"<thead>\",\n         \"<thead/>\",\n         \"<thead />\",\n         \"<table><thead></thead></table>\",\n         \"<table><thead></table>\",\n         \"<THEAD />\",\n         \"<THEAD></THEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_thead_controls\"},\n    {input: \"<thead formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<thead></thead>\",\n         \"<thead>\",\n         \"<thead/>\",\n         \"<thead />\",\n         \"<table><thead></thead></table>\",\n         \"<table><thead></table>\",\n         \"<THEAD />\",\n         \"<THEAD></THEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_thead_formaction\"},\n    {input: \"<thead formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<thead></thead>\",\n         \"<thead>\",\n         \"<thead/>\",\n         \"<thead />\",\n         \"<table><thead></thead></table>\",\n         \"<table><thead></table>\",\n         \"<THEAD />\",\n         \"<THEAD></THEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_thead_formmethod\"},\n    {input: \"<thead pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<thead></thead>\",\n         \"<thead>\",\n         \"<thead/>\",\n         \"<thead />\",\n         \"<table><thead></thead></table>\",\n         \"<table><thead></table>\",\n         \"<THEAD />\",\n         \"<THEAD></THEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_thead_pattern\"},\n    {input: \"<thead icon=\\\"x\\\">\",\n     acceptable: [\n         \"<thead></thead>\",\n         \"<thead>\",\n         \"<thead/>\",\n         \"<thead />\",\n         \"<table><thead></thead></table>\",\n         \"<table><thead></table>\",\n         \"<THEAD />\",\n         \"<THEAD></THEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_thead_icon\"},\n    {input: \"<thead select=\\\"x\\\">\",\n     acceptable: [\n         \"<thead></thead>\",\n         \"<thead>\",\n         \"<thead/>\",\n         \"<thead />\",\n         \"<table><thead></thead></table>\",\n         \"<table><thead></table>\",\n         \"<THEAD />\",\n         \"<THEAD></THEAD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_thead_select\"},\n    {input: \"<tfoot></tfoot>\",\n     acceptable: [\n         \"<tfoot>\",\n         \"<tfoot />\",\n         \"<tfoot></tfoot>\",\n         \"<table><tfoot></tfoot></table>\",\n         \"<TFOOT />\",\n         \"<TFOOT></TFOOT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tfoot_plain\"},\n    {input: \"<tfoot><script>alert()</script></tfoot>\",\n     acceptable: [\n         \"<tfoot>\",\n         \"<tfoot />\",\n         \"<tfoot></tfoot>\",\n         \"<table><tfoot></tfoot></table>\",\n         \"<TFOOT />\",\n         \"<TFOOT></TFOOT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><tfoot><td></td></tfoot></table>\",\n         \"<table><tfoot></tfoot><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_tfoot_scriptinside\"},\n    {input: \"<tfoot media=\\\"x\\\">\",\n     acceptable: [\n         \"<tfoot></tfoot>\",\n         \"<tfoot>\",\n         \"<tfoot/>\",\n         \"<tfoot />\",\n         \"<table><tfoot></tfoot></table>\",\n         \"<table><tfoot></table>\",\n         \"<TFOOT />\",\n         \"<TFOOT></TFOOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tfoot_media\"},\n    {input: \"<tfoot nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<tfoot></tfoot>\",\n         \"<tfoot>\",\n         \"<tfoot/>\",\n         \"<tfoot />\",\n         \"<table><tfoot></tfoot></table>\",\n         \"<table><tfoot></table>\",\n         \"<TFOOT />\",\n         \"<TFOOT></TFOOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tfoot_nonce\"},\n    {input: \"<tfoot srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<tfoot></tfoot>\",\n         \"<tfoot>\",\n         \"<tfoot/>\",\n         \"<tfoot />\",\n         \"<table><tfoot></tfoot></table>\",\n         \"<table><tfoot></table>\",\n         \"<TFOOT />\",\n         \"<TFOOT></TFOOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tfoot_srcset\"},\n    {input: \"<tfoot srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<tfoot></tfoot>\",\n         \"<tfoot>\",\n         \"<tfoot/>\",\n         \"<tfoot />\",\n         \"<table><tfoot></tfoot></table>\",\n         \"<table><tfoot></table>\",\n         \"<TFOOT />\",\n         \"<TFOOT></TFOOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tfoot_srcdoc\"},\n    {input: \"<tfoot poster=\\\"x\\\">\",\n     acceptable: [\n         \"<tfoot></tfoot>\",\n         \"<tfoot>\",\n         \"<tfoot/>\",\n         \"<tfoot />\",\n         \"<table><tfoot></tfoot></table>\",\n         \"<table><tfoot></table>\",\n         \"<TFOOT />\",\n         \"<TFOOT></TFOOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tfoot_poster\"},\n    {input: \"<tfoot autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<tfoot></tfoot>\",\n         \"<tfoot>\",\n         \"<tfoot/>\",\n         \"<tfoot />\",\n         \"<table><tfoot></tfoot></table>\",\n         \"<table><tfoot></table>\",\n         \"<TFOOT />\",\n         \"<TFOOT></TFOOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tfoot_autoplay\"},\n    {input: \"<tfoot controls=\\\"x\\\">\",\n     acceptable: [\n         \"<tfoot></tfoot>\",\n         \"<tfoot>\",\n         \"<tfoot/>\",\n         \"<tfoot />\",\n         \"<table><tfoot></tfoot></table>\",\n         \"<table><tfoot></table>\",\n         \"<TFOOT />\",\n         \"<TFOOT></TFOOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tfoot_controls\"},\n    {input: \"<tfoot formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<tfoot></tfoot>\",\n         \"<tfoot>\",\n         \"<tfoot/>\",\n         \"<tfoot />\",\n         \"<table><tfoot></tfoot></table>\",\n         \"<table><tfoot></table>\",\n         \"<TFOOT />\",\n         \"<TFOOT></TFOOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tfoot_formaction\"},\n    {input: \"<tfoot formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<tfoot></tfoot>\",\n         \"<tfoot>\",\n         \"<tfoot/>\",\n         \"<tfoot />\",\n         \"<table><tfoot></tfoot></table>\",\n         \"<table><tfoot></table>\",\n         \"<TFOOT />\",\n         \"<TFOOT></TFOOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tfoot_formmethod\"},\n    {input: \"<tfoot pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<tfoot></tfoot>\",\n         \"<tfoot>\",\n         \"<tfoot/>\",\n         \"<tfoot />\",\n         \"<table><tfoot></tfoot></table>\",\n         \"<table><tfoot></table>\",\n         \"<TFOOT />\",\n         \"<TFOOT></TFOOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tfoot_pattern\"},\n    {input: \"<tfoot icon=\\\"x\\\">\",\n     acceptable: [\n         \"<tfoot></tfoot>\",\n         \"<tfoot>\",\n         \"<tfoot/>\",\n         \"<tfoot />\",\n         \"<table><tfoot></tfoot></table>\",\n         \"<table><tfoot></table>\",\n         \"<TFOOT />\",\n         \"<TFOOT></TFOOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tfoot_icon\"},\n    {input: \"<tfoot select=\\\"x\\\">\",\n     acceptable: [\n         \"<tfoot></tfoot>\",\n         \"<tfoot>\",\n         \"<tfoot/>\",\n         \"<tfoot />\",\n         \"<table><tfoot></tfoot></table>\",\n         \"<table><tfoot></table>\",\n         \"<TFOOT />\",\n         \"<TFOOT></TFOOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tfoot_select\"},\n    {input: \"<tr></tr>\",\n     acceptable: [\n         \"<tr>\",\n         \"<tr />\",\n         \"<tr></tr>\",\n         \"<table><tr></tr></table>\",\n         \"<TR />\",\n         \"<TR></TR>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tr_plain\"},\n    {input: \"<tr><script>alert()</script></tr>\",\n     acceptable: [\n         \"<tr>\",\n         \"<tr />\",\n         \"<tr></tr>\",\n         \"<table><tr></tr></table>\",\n         \"<TR />\",\n         \"<TR></TR>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><tr><td></td></tr></table>\",\n         \"<table><tr></tr><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_tr_scriptinside\"},\n    {input: \"<tr media=\\\"x\\\">\",\n     acceptable: [\n         \"<tr></tr>\",\n         \"<tr>\",\n         \"<tr/>\",\n         \"<tr />\",\n         \"<table><tr></tr></table>\",\n         \"<table><tr></table>\",\n         \"<TR />\",\n         \"<TR></TR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tr_media\"},\n    {input: \"<tr nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<tr></tr>\",\n         \"<tr>\",\n         \"<tr/>\",\n         \"<tr />\",\n         \"<table><tr></tr></table>\",\n         \"<table><tr></table>\",\n         \"<TR />\",\n         \"<TR></TR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tr_nonce\"},\n    {input: \"<tr srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<tr></tr>\",\n         \"<tr>\",\n         \"<tr/>\",\n         \"<tr />\",\n         \"<table><tr></tr></table>\",\n         \"<table><tr></table>\",\n         \"<TR />\",\n         \"<TR></TR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tr_srcset\"},\n    {input: \"<tr srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<tr></tr>\",\n         \"<tr>\",\n         \"<tr/>\",\n         \"<tr />\",\n         \"<table><tr></tr></table>\",\n         \"<table><tr></table>\",\n         \"<TR />\",\n         \"<TR></TR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tr_srcdoc\"},\n    {input: \"<tr poster=\\\"x\\\">\",\n     acceptable: [\n         \"<tr></tr>\",\n         \"<tr>\",\n         \"<tr/>\",\n         \"<tr />\",\n         \"<table><tr></tr></table>\",\n         \"<table><tr></table>\",\n         \"<TR />\",\n         \"<TR></TR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tr_poster\"},\n    {input: \"<tr autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<tr></tr>\",\n         \"<tr>\",\n         \"<tr/>\",\n         \"<tr />\",\n         \"<table><tr></tr></table>\",\n         \"<table><tr></table>\",\n         \"<TR />\",\n         \"<TR></TR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tr_autoplay\"},\n    {input: \"<tr controls=\\\"x\\\">\",\n     acceptable: [\n         \"<tr></tr>\",\n         \"<tr>\",\n         \"<tr/>\",\n         \"<tr />\",\n         \"<table><tr></tr></table>\",\n         \"<table><tr></table>\",\n         \"<TR />\",\n         \"<TR></TR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tr_controls\"},\n    {input: \"<tr formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<tr></tr>\",\n         \"<tr>\",\n         \"<tr/>\",\n         \"<tr />\",\n         \"<table><tr></tr></table>\",\n         \"<table><tr></table>\",\n         \"<TR />\",\n         \"<TR></TR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tr_formaction\"},\n    {input: \"<tr formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<tr></tr>\",\n         \"<tr>\",\n         \"<tr/>\",\n         \"<tr />\",\n         \"<table><tr></tr></table>\",\n         \"<table><tr></table>\",\n         \"<TR />\",\n         \"<TR></TR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tr_formmethod\"},\n    {input: \"<tr pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<tr></tr>\",\n         \"<tr>\",\n         \"<tr/>\",\n         \"<tr />\",\n         \"<table><tr></tr></table>\",\n         \"<table><tr></table>\",\n         \"<TR />\",\n         \"<TR></TR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tr_pattern\"},\n    {input: \"<tr icon=\\\"x\\\">\",\n     acceptable: [\n         \"<tr></tr>\",\n         \"<tr>\",\n         \"<tr/>\",\n         \"<tr />\",\n         \"<table><tr></tr></table>\",\n         \"<table><tr></table>\",\n         \"<TR />\",\n         \"<TR></TR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tr_icon\"},\n    {input: \"<tr select=\\\"x\\\">\",\n     acceptable: [\n         \"<tr></tr>\",\n         \"<tr>\",\n         \"<tr/>\",\n         \"<tr />\",\n         \"<table><tr></tr></table>\",\n         \"<table><tr></table>\",\n         \"<TR />\",\n         \"<TR></TR>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_tr_select\"},\n    {input: \"<td></td>\",\n     acceptable: [\n         \"<td>\",\n         \"<td />\",\n         \"<td></td>\",\n         \"<table><td></td></table>\",\n         \"<TD />\",\n         \"<TD></TD>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_td_plain\"},\n    {input: \"<td><script>alert()</script></td>\",\n     acceptable: [\n         \"<td>\",\n         \"<td />\",\n         \"<td></td>\",\n         \"<table><td></td></table>\",\n         \"<TD />\",\n         \"<TD></TD>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><td><td></td></td></table>\",\n         \"<table><td></td><td></td></table>\",\n     ],\n     name: \"contract_td_scriptinside\"},\n    {input: \"<td media=\\\"x\\\">\",\n     acceptable: [\n         \"<td></td>\",\n         \"<td>\",\n         \"<td/>\",\n         \"<td />\",\n         \"<table><td></td></table>\",\n         \"<table><td></table>\",\n         \"<TD />\",\n         \"<TD></TD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_td_media\"},\n    {input: \"<td nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<td></td>\",\n         \"<td>\",\n         \"<td/>\",\n         \"<td />\",\n         \"<table><td></td></table>\",\n         \"<table><td></table>\",\n         \"<TD />\",\n         \"<TD></TD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_td_nonce\"},\n    {input: \"<td srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<td></td>\",\n         \"<td>\",\n         \"<td/>\",\n         \"<td />\",\n         \"<table><td></td></table>\",\n         \"<table><td></table>\",\n         \"<TD />\",\n         \"<TD></TD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_td_srcset\"},\n    {input: \"<td srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<td></td>\",\n         \"<td>\",\n         \"<td/>\",\n         \"<td />\",\n         \"<table><td></td></table>\",\n         \"<table><td></table>\",\n         \"<TD />\",\n         \"<TD></TD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_td_srcdoc\"},\n    {input: \"<td poster=\\\"x\\\">\",\n     acceptable: [\n         \"<td></td>\",\n         \"<td>\",\n         \"<td/>\",\n         \"<td />\",\n         \"<table><td></td></table>\",\n         \"<table><td></table>\",\n         \"<TD />\",\n         \"<TD></TD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_td_poster\"},\n    {input: \"<td autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<td></td>\",\n         \"<td>\",\n         \"<td/>\",\n         \"<td />\",\n         \"<table><td></td></table>\",\n         \"<table><td></table>\",\n         \"<TD />\",\n         \"<TD></TD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_td_autoplay\"},\n    {input: \"<td controls=\\\"x\\\">\",\n     acceptable: [\n         \"<td></td>\",\n         \"<td>\",\n         \"<td/>\",\n         \"<td />\",\n         \"<table><td></td></table>\",\n         \"<table><td></table>\",\n         \"<TD />\",\n         \"<TD></TD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_td_controls\"},\n    {input: \"<td formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<td></td>\",\n         \"<td>\",\n         \"<td/>\",\n         \"<td />\",\n         \"<table><td></td></table>\",\n         \"<table><td></table>\",\n         \"<TD />\",\n         \"<TD></TD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_td_formaction\"},\n    {input: \"<td formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<td></td>\",\n         \"<td>\",\n         \"<td/>\",\n         \"<td />\",\n         \"<table><td></td></table>\",\n         \"<table><td></table>\",\n         \"<TD />\",\n         \"<TD></TD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_td_formmethod\"},\n    {input: \"<td pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<td></td>\",\n         \"<td>\",\n         \"<td/>\",\n         \"<td />\",\n         \"<table><td></td></table>\",\n         \"<table><td></table>\",\n         \"<TD />\",\n         \"<TD></TD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_td_pattern\"},\n    {input: \"<td icon=\\\"x\\\">\",\n     acceptable: [\n         \"<td></td>\",\n         \"<td>\",\n         \"<td/>\",\n         \"<td />\",\n         \"<table><td></td></table>\",\n         \"<table><td></table>\",\n         \"<TD />\",\n         \"<TD></TD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_td_icon\"},\n    {input: \"<td select=\\\"x\\\">\",\n     acceptable: [\n         \"<td></td>\",\n         \"<td>\",\n         \"<td/>\",\n         \"<td />\",\n         \"<table><td></td></table>\",\n         \"<table><td></table>\",\n         \"<TD />\",\n         \"<TD></TD>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_td_select\"},\n    {input: \"<th></th>\",\n     acceptable: [\n         \"<th>\",\n         \"<th />\",\n         \"<th></th>\",\n         \"<table><th></th></table>\",\n         \"<TH />\",\n         \"<TH></TH>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_th_plain\"},\n    {input: \"<th><script>alert()</script></th>\",\n     acceptable: [\n         \"<th>\",\n         \"<th />\",\n         \"<th></th>\",\n         \"<table><th></th></table>\",\n         \"<TH />\",\n         \"<TH></TH>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><th><td></td></th></table>\",\n         \"<table><th></th><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_th_scriptinside\"},\n    {input: \"<th media=\\\"x\\\">\",\n     acceptable: [\n         \"<th></th>\",\n         \"<th>\",\n         \"<th/>\",\n         \"<th />\",\n         \"<table><th></th></table>\",\n         \"<table><th></table>\",\n         \"<TH />\",\n         \"<TH></TH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_th_media\"},\n    {input: \"<th nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<th></th>\",\n         \"<th>\",\n         \"<th/>\",\n         \"<th />\",\n         \"<table><th></th></table>\",\n         \"<table><th></table>\",\n         \"<TH />\",\n         \"<TH></TH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_th_nonce\"},\n    {input: \"<th srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<th></th>\",\n         \"<th>\",\n         \"<th/>\",\n         \"<th />\",\n         \"<table><th></th></table>\",\n         \"<table><th></table>\",\n         \"<TH />\",\n         \"<TH></TH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_th_srcset\"},\n    {input: \"<th srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<th></th>\",\n         \"<th>\",\n         \"<th/>\",\n         \"<th />\",\n         \"<table><th></th></table>\",\n         \"<table><th></table>\",\n         \"<TH />\",\n         \"<TH></TH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_th_srcdoc\"},\n    {input: \"<th poster=\\\"x\\\">\",\n     acceptable: [\n         \"<th></th>\",\n         \"<th>\",\n         \"<th/>\",\n         \"<th />\",\n         \"<table><th></th></table>\",\n         \"<table><th></table>\",\n         \"<TH />\",\n         \"<TH></TH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_th_poster\"},\n    {input: \"<th autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<th></th>\",\n         \"<th>\",\n         \"<th/>\",\n         \"<th />\",\n         \"<table><th></th></table>\",\n         \"<table><th></table>\",\n         \"<TH />\",\n         \"<TH></TH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_th_autoplay\"},\n    {input: \"<th controls=\\\"x\\\">\",\n     acceptable: [\n         \"<th></th>\",\n         \"<th>\",\n         \"<th/>\",\n         \"<th />\",\n         \"<table><th></th></table>\",\n         \"<table><th></table>\",\n         \"<TH />\",\n         \"<TH></TH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_th_controls\"},\n    {input: \"<th formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<th></th>\",\n         \"<th>\",\n         \"<th/>\",\n         \"<th />\",\n         \"<table><th></th></table>\",\n         \"<table><th></table>\",\n         \"<TH />\",\n         \"<TH></TH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_th_formaction\"},\n    {input: \"<th formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<th></th>\",\n         \"<th>\",\n         \"<th/>\",\n         \"<th />\",\n         \"<table><th></th></table>\",\n         \"<table><th></table>\",\n         \"<TH />\",\n         \"<TH></TH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_th_formmethod\"},\n    {input: \"<th pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<th></th>\",\n         \"<th>\",\n         \"<th/>\",\n         \"<th />\",\n         \"<table><th></th></table>\",\n         \"<table><th></table>\",\n         \"<TH />\",\n         \"<TH></TH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_th_pattern\"},\n    {input: \"<th icon=\\\"x\\\">\",\n     acceptable: [\n         \"<th></th>\",\n         \"<th>\",\n         \"<th/>\",\n         \"<th />\",\n         \"<table><th></th></table>\",\n         \"<table><th></table>\",\n         \"<TH />\",\n         \"<TH></TH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_th_icon\"},\n    {input: \"<th select=\\\"x\\\">\",\n     acceptable: [\n         \"<th></th>\",\n         \"<th>\",\n         \"<th/>\",\n         \"<th />\",\n         \"<table><th></th></table>\",\n         \"<table><th></table>\",\n         \"<TH />\",\n         \"<TH></TH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_th_select\"},\n    {input: \"<form></form>\",\n     acceptable: [\n         \"<form>\",\n         \"<form />\",\n         \"<form></form>\",\n         \"<table><form></form></table>\",\n         \"<FORM />\",\n         \"<FORM></FORM>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_form_plain\"},\n    {input: \"<form><script>alert()</script></form>\",\n     acceptable: [\n         \"<form>\",\n         \"<form />\",\n         \"<form></form>\",\n         \"<table><form></form></table>\",\n         \"<FORM />\",\n         \"<FORM></FORM>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><form><td></td></form></table>\",\n         \"<table><form></form><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_form_scriptinside\"},\n    {input: \"<form action=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<form action=\\\"about:invalid#zCSafez\\\"></form>\",\n         \"<form action=\\\"about:invalid#zCSafez\\\">\",\n         \"<form action=\\\"about:invalid#zGoSafez\\\"></form>\",\n         \"<form action=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<form action=\\\"javascript:void(0);\\\"></form>\",\n         \"<form action=\\\"javascript:void(0);\\\">\",\n         \"<form></form>\",\n         \"<form>\",\n         \"<form/>\",\n         \"<form />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_form_action\"},\n    {input: \"<form media=\\\"x\\\">\",\n     acceptable: [\n         \"<form></form>\",\n         \"<form>\",\n         \"<form/>\",\n         \"<form />\",\n         \"<table><form></form></table>\",\n         \"<table><form></table>\",\n         \"<FORM />\",\n         \"<FORM></FORM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_form_media\"},\n    {input: \"<form nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<form></form>\",\n         \"<form>\",\n         \"<form/>\",\n         \"<form />\",\n         \"<table><form></form></table>\",\n         \"<table><form></table>\",\n         \"<FORM />\",\n         \"<FORM></FORM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_form_nonce\"},\n    {input: \"<form srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<form></form>\",\n         \"<form>\",\n         \"<form/>\",\n         \"<form />\",\n         \"<table><form></form></table>\",\n         \"<table><form></table>\",\n         \"<FORM />\",\n         \"<FORM></FORM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_form_srcset\"},\n    {input: \"<form srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<form></form>\",\n         \"<form>\",\n         \"<form/>\",\n         \"<form />\",\n         \"<table><form></form></table>\",\n         \"<table><form></table>\",\n         \"<FORM />\",\n         \"<FORM></FORM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_form_srcdoc\"},\n    {input: \"<form poster=\\\"x\\\">\",\n     acceptable: [\n         \"<form></form>\",\n         \"<form>\",\n         \"<form/>\",\n         \"<form />\",\n         \"<table><form></form></table>\",\n         \"<table><form></table>\",\n         \"<FORM />\",\n         \"<FORM></FORM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_form_poster\"},\n    {input: \"<form autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<form></form>\",\n         \"<form>\",\n         \"<form/>\",\n         \"<form />\",\n         \"<table><form></form></table>\",\n         \"<table><form></table>\",\n         \"<FORM />\",\n         \"<FORM></FORM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_form_autoplay\"},\n    {input: \"<form controls=\\\"x\\\">\",\n     acceptable: [\n         \"<form></form>\",\n         \"<form>\",\n         \"<form/>\",\n         \"<form />\",\n         \"<table><form></form></table>\",\n         \"<table><form></table>\",\n         \"<FORM />\",\n         \"<FORM></FORM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_form_controls\"},\n    {input: \"<form formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<form></form>\",\n         \"<form>\",\n         \"<form/>\",\n         \"<form />\",\n         \"<table><form></form></table>\",\n         \"<table><form></table>\",\n         \"<FORM />\",\n         \"<FORM></FORM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_form_formaction\"},\n    {input: \"<form formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<form></form>\",\n         \"<form>\",\n         \"<form/>\",\n         \"<form />\",\n         \"<table><form></form></table>\",\n         \"<table><form></table>\",\n         \"<FORM />\",\n         \"<FORM></FORM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_form_formmethod\"},\n    {input: \"<form pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<form></form>\",\n         \"<form>\",\n         \"<form/>\",\n         \"<form />\",\n         \"<table><form></form></table>\",\n         \"<table><form></table>\",\n         \"<FORM />\",\n         \"<FORM></FORM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_form_pattern\"},\n    {input: \"<form icon=\\\"x\\\">\",\n     acceptable: [\n         \"<form></form>\",\n         \"<form>\",\n         \"<form/>\",\n         \"<form />\",\n         \"<table><form></form></table>\",\n         \"<table><form></table>\",\n         \"<FORM />\",\n         \"<FORM></FORM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_form_icon\"},\n    {input: \"<form select=\\\"x\\\">\",\n     acceptable: [\n         \"<form></form>\",\n         \"<form>\",\n         \"<form/>\",\n         \"<form />\",\n         \"<table><form></form></table>\",\n         \"<table><form></table>\",\n         \"<FORM />\",\n         \"<FORM></FORM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_form_select\"},\n    {input: \"<label></label>\",\n     acceptable: [\n         \"<label>\",\n         \"<label />\",\n         \"<label></label>\",\n         \"<table><label></label></table>\",\n         \"<LABEL />\",\n         \"<LABEL></LABEL>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_label_plain\"},\n    {input: \"<label><script>alert()</script></label>\",\n     acceptable: [\n         \"<label>\",\n         \"<label />\",\n         \"<label></label>\",\n         \"<table><label></label></table>\",\n         \"<LABEL />\",\n         \"<LABEL></LABEL>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><label><td></td></label></table>\",\n         \"<table><label></label><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_label_scriptinside\"},\n    {input: \"<label media=\\\"x\\\">\",\n     acceptable: [\n         \"<label></label>\",\n         \"<label>\",\n         \"<label/>\",\n         \"<label />\",\n         \"<table><label></label></table>\",\n         \"<table><label></table>\",\n         \"<LABEL />\",\n         \"<LABEL></LABEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_label_media\"},\n    {input: \"<label nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<label></label>\",\n         \"<label>\",\n         \"<label/>\",\n         \"<label />\",\n         \"<table><label></label></table>\",\n         \"<table><label></table>\",\n         \"<LABEL />\",\n         \"<LABEL></LABEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_label_nonce\"},\n    {input: \"<label srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<label></label>\",\n         \"<label>\",\n         \"<label/>\",\n         \"<label />\",\n         \"<table><label></label></table>\",\n         \"<table><label></table>\",\n         \"<LABEL />\",\n         \"<LABEL></LABEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_label_srcset\"},\n    {input: \"<label srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<label></label>\",\n         \"<label>\",\n         \"<label/>\",\n         \"<label />\",\n         \"<table><label></label></table>\",\n         \"<table><label></table>\",\n         \"<LABEL />\",\n         \"<LABEL></LABEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_label_srcdoc\"},\n    {input: \"<label poster=\\\"x\\\">\",\n     acceptable: [\n         \"<label></label>\",\n         \"<label>\",\n         \"<label/>\",\n         \"<label />\",\n         \"<table><label></label></table>\",\n         \"<table><label></table>\",\n         \"<LABEL />\",\n         \"<LABEL></LABEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_label_poster\"},\n    {input: \"<label autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<label></label>\",\n         \"<label>\",\n         \"<label/>\",\n         \"<label />\",\n         \"<table><label></label></table>\",\n         \"<table><label></table>\",\n         \"<LABEL />\",\n         \"<LABEL></LABEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_label_autoplay\"},\n    {input: \"<label controls=\\\"x\\\">\",\n     acceptable: [\n         \"<label></label>\",\n         \"<label>\",\n         \"<label/>\",\n         \"<label />\",\n         \"<table><label></label></table>\",\n         \"<table><label></table>\",\n         \"<LABEL />\",\n         \"<LABEL></LABEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_label_controls\"},\n    {input: \"<label formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<label></label>\",\n         \"<label>\",\n         \"<label/>\",\n         \"<label />\",\n         \"<table><label></label></table>\",\n         \"<table><label></table>\",\n         \"<LABEL />\",\n         \"<LABEL></LABEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_label_formaction\"},\n    {input: \"<label formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<label></label>\",\n         \"<label>\",\n         \"<label/>\",\n         \"<label />\",\n         \"<table><label></label></table>\",\n         \"<table><label></table>\",\n         \"<LABEL />\",\n         \"<LABEL></LABEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_label_formmethod\"},\n    {input: \"<label pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<label></label>\",\n         \"<label>\",\n         \"<label/>\",\n         \"<label />\",\n         \"<table><label></label></table>\",\n         \"<table><label></table>\",\n         \"<LABEL />\",\n         \"<LABEL></LABEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_label_pattern\"},\n    {input: \"<label icon=\\\"x\\\">\",\n     acceptable: [\n         \"<label></label>\",\n         \"<label>\",\n         \"<label/>\",\n         \"<label />\",\n         \"<table><label></label></table>\",\n         \"<table><label></table>\",\n         \"<LABEL />\",\n         \"<LABEL></LABEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_label_icon\"},\n    {input: \"<label select=\\\"x\\\">\",\n     acceptable: [\n         \"<label></label>\",\n         \"<label>\",\n         \"<label/>\",\n         \"<label />\",\n         \"<table><label></label></table>\",\n         \"<table><label></table>\",\n         \"<LABEL />\",\n         \"<LABEL></LABEL>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_label_select\"},\n    {input: \"<input></input>\",\n     acceptable: [\n         \"<input>\",\n         \"<input />\",\n         \"<input/>\",\n         \"<input><input>\",\n         \"<input/><input/>\",\n         \"<input /><input />\",\n         \"<table><input></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_input_plain\"},\n    {input: \"<input><script>alert()</script></input>\",\n     acceptable: [\n         \"<input>\",\n         \"<input />\",\n         \"<input/>\",\n         \"<input><input>\",\n         \"<input/><input/>\",\n         \"<input /><input />\",\n         \"<table><input></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><input><td></td></table>\",\n     ],\n     name: \"contract_input_scriptinside\"},\n    {input: \"<input formaction=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<input formaction=\\\"about:invalid#zCSafez\\\"></input>\",\n         \"<input formaction=\\\"about:invalid#zCSafez\\\">\",\n         \"<input formaction=\\\"about:invalid#zGoSafez\\\"></input>\",\n         \"<input formaction=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<input formaction=\\\"javascript:void(0);\\\"></input>\",\n         \"<input formaction=\\\"javascript:void(0);\\\">\",\n         \"<input></input>\",\n         \"<input>\",\n         \"<input/>\",\n         \"<input />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_input_formaction\"},\n    {input: \"<input src=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<input src=\\\"about:invalid#zCSafez\\\"></input>\",\n         \"<input src=\\\"about:invalid#zCSafez\\\">\",\n         \"<input src=\\\"about:invalid#zGoSafez\\\"></input>\",\n         \"<input src=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<input src=\\\"javascript:void(0);\\\"></input>\",\n         \"<input src=\\\"javascript:void(0);\\\">\",\n         \"<input></input>\",\n         \"<input>\",\n         \"<input/>\",\n         \"<input />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_input_src\"},\n    {input: \"<input media=\\\"x\\\">\",\n     acceptable: [\n         \"<input></input>\",\n         \"<input>\",\n         \"<input/>\",\n         \"<input />\",\n         \"<table><input></input></table>\",\n         \"<table><input></table>\",\n         \"<INPUT />\",\n         \"<INPUT></INPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_input_media\"},\n    {input: \"<input nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<input></input>\",\n         \"<input>\",\n         \"<input/>\",\n         \"<input />\",\n         \"<table><input></input></table>\",\n         \"<table><input></table>\",\n         \"<INPUT />\",\n         \"<INPUT></INPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_input_nonce\"},\n    {input: \"<input srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<input></input>\",\n         \"<input>\",\n         \"<input/>\",\n         \"<input />\",\n         \"<table><input></input></table>\",\n         \"<table><input></table>\",\n         \"<INPUT />\",\n         \"<INPUT></INPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_input_srcset\"},\n    {input: \"<input srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<input></input>\",\n         \"<input>\",\n         \"<input/>\",\n         \"<input />\",\n         \"<table><input></input></table>\",\n         \"<table><input></table>\",\n         \"<INPUT />\",\n         \"<INPUT></INPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_input_srcdoc\"},\n    {input: \"<input poster=\\\"x\\\">\",\n     acceptable: [\n         \"<input></input>\",\n         \"<input>\",\n         \"<input/>\",\n         \"<input />\",\n         \"<table><input></input></table>\",\n         \"<table><input></table>\",\n         \"<INPUT />\",\n         \"<INPUT></INPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_input_poster\"},\n    {input: \"<input autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<input></input>\",\n         \"<input>\",\n         \"<input/>\",\n         \"<input />\",\n         \"<table><input></input></table>\",\n         \"<table><input></table>\",\n         \"<INPUT />\",\n         \"<INPUT></INPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_input_autoplay\"},\n    {input: \"<input controls=\\\"x\\\">\",\n     acceptable: [\n         \"<input></input>\",\n         \"<input>\",\n         \"<input/>\",\n         \"<input />\",\n         \"<table><input></input></table>\",\n         \"<table><input></table>\",\n         \"<INPUT />\",\n         \"<INPUT></INPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_input_controls\"},\n    {input: \"<input icon=\\\"x\\\">\",\n     acceptable: [\n         \"<input></input>\",\n         \"<input>\",\n         \"<input/>\",\n         \"<input />\",\n         \"<table><input></input></table>\",\n         \"<table><input></table>\",\n         \"<INPUT />\",\n         \"<INPUT></INPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_input_icon\"},\n    {input: \"<input select=\\\"x\\\">\",\n     acceptable: [\n         \"<input></input>\",\n         \"<input>\",\n         \"<input/>\",\n         \"<input />\",\n         \"<table><input></input></table>\",\n         \"<table><input></table>\",\n         \"<INPUT />\",\n         \"<INPUT></INPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_input_select\"},\n    {input: \"<command></command>\",\n     acceptable: [\n         \"<command>\",\n         \"<command />\",\n         \"<command></command>\",\n         \"<table><command></command></table>\",\n         \"<COMMAND />\",\n         \"<COMMAND></COMMAND>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_command_plain\"},\n    {input: \"<command><script>alert()</script></command>\",\n     acceptable: [\n         \"<command>\",\n         \"<command />\",\n         \"<command></command>\",\n         \"<table><command></command></table>\",\n         \"<COMMAND />\",\n         \"<COMMAND></COMMAND>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><command><td></td></command></table>\",\n         \"<table><command></command><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_command_scriptinside\"},\n    {input: \"<command media=\\\"x\\\">\",\n     acceptable: [\n         \"<command></command>\",\n         \"<command>\",\n         \"<command/>\",\n         \"<command />\",\n         \"<table><command></command></table>\",\n         \"<table><command></table>\",\n         \"<COMMAND />\",\n         \"<COMMAND></COMMAND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_command_media\"},\n    {input: \"<command nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<command></command>\",\n         \"<command>\",\n         \"<command/>\",\n         \"<command />\",\n         \"<table><command></command></table>\",\n         \"<table><command></table>\",\n         \"<COMMAND />\",\n         \"<COMMAND></COMMAND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_command_nonce\"},\n    {input: \"<command srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<command></command>\",\n         \"<command>\",\n         \"<command/>\",\n         \"<command />\",\n         \"<table><command></command></table>\",\n         \"<table><command></table>\",\n         \"<COMMAND />\",\n         \"<COMMAND></COMMAND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_command_srcset\"},\n    {input: \"<command srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<command></command>\",\n         \"<command>\",\n         \"<command/>\",\n         \"<command />\",\n         \"<table><command></command></table>\",\n         \"<table><command></table>\",\n         \"<COMMAND />\",\n         \"<COMMAND></COMMAND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_command_srcdoc\"},\n    {input: \"<command poster=\\\"x\\\">\",\n     acceptable: [\n         \"<command></command>\",\n         \"<command>\",\n         \"<command/>\",\n         \"<command />\",\n         \"<table><command></command></table>\",\n         \"<table><command></table>\",\n         \"<COMMAND />\",\n         \"<COMMAND></COMMAND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_command_poster\"},\n    {input: \"<command autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<command></command>\",\n         \"<command>\",\n         \"<command/>\",\n         \"<command />\",\n         \"<table><command></command></table>\",\n         \"<table><command></table>\",\n         \"<COMMAND />\",\n         \"<COMMAND></COMMAND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_command_autoplay\"},\n    {input: \"<command controls=\\\"x\\\">\",\n     acceptable: [\n         \"<command></command>\",\n         \"<command>\",\n         \"<command/>\",\n         \"<command />\",\n         \"<table><command></command></table>\",\n         \"<table><command></table>\",\n         \"<COMMAND />\",\n         \"<COMMAND></COMMAND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_command_controls\"},\n    {input: \"<command formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<command></command>\",\n         \"<command>\",\n         \"<command/>\",\n         \"<command />\",\n         \"<table><command></command></table>\",\n         \"<table><command></table>\",\n         \"<COMMAND />\",\n         \"<COMMAND></COMMAND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_command_formaction\"},\n    {input: \"<command formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<command></command>\",\n         \"<command>\",\n         \"<command/>\",\n         \"<command />\",\n         \"<table><command></command></table>\",\n         \"<table><command></table>\",\n         \"<COMMAND />\",\n         \"<COMMAND></COMMAND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_command_formmethod\"},\n    {input: \"<command pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<command></command>\",\n         \"<command>\",\n         \"<command/>\",\n         \"<command />\",\n         \"<table><command></command></table>\",\n         \"<table><command></table>\",\n         \"<COMMAND />\",\n         \"<COMMAND></COMMAND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_command_pattern\"},\n    {input: \"<command icon=\\\"x\\\">\",\n     acceptable: [\n         \"<command></command>\",\n         \"<command>\",\n         \"<command/>\",\n         \"<command />\",\n         \"<table><command></command></table>\",\n         \"<table><command></table>\",\n         \"<COMMAND />\",\n         \"<COMMAND></COMMAND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_command_icon\"},\n    {input: \"<command select=\\\"x\\\">\",\n     acceptable: [\n         \"<command></command>\",\n         \"<command>\",\n         \"<command/>\",\n         \"<command />\",\n         \"<table><command></command></table>\",\n         \"<table><command></table>\",\n         \"<COMMAND />\",\n         \"<COMMAND></COMMAND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_command_select\"},\n    {input: \"<button></button>\",\n     acceptable: [\n         \"<button>\",\n         \"<button />\",\n         \"<button></button>\",\n         \"<table><button></button></table>\",\n         \"<BUTTON />\",\n         \"<BUTTON></BUTTON>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_button_plain\"},\n    {input: \"<button><script>alert()</script></button>\",\n     acceptable: [\n         \"<button>\",\n         \"<button />\",\n         \"<button></button>\",\n         \"<table><button></button></table>\",\n         \"<BUTTON />\",\n         \"<BUTTON></BUTTON>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><button><td></td></button></table>\",\n         \"<table><button></button><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_button_scriptinside\"},\n    {input: \"<button formaction=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<button formaction=\\\"about:invalid#zCSafez\\\"></button>\",\n         \"<button formaction=\\\"about:invalid#zCSafez\\\">\",\n         \"<button formaction=\\\"about:invalid#zGoSafez\\\"></button>\",\n         \"<button formaction=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<button formaction=\\\"javascript:void(0);\\\"></button>\",\n         \"<button formaction=\\\"javascript:void(0);\\\">\",\n         \"<button></button>\",\n         \"<button>\",\n         \"<button/>\",\n         \"<button />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_button_formaction\"},\n    {input: \"<button media=\\\"x\\\">\",\n     acceptable: [\n         \"<button></button>\",\n         \"<button>\",\n         \"<button/>\",\n         \"<button />\",\n         \"<table><button></button></table>\",\n         \"<table><button></table>\",\n         \"<BUTTON />\",\n         \"<BUTTON></BUTTON>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_button_media\"},\n    {input: \"<button nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<button></button>\",\n         \"<button>\",\n         \"<button/>\",\n         \"<button />\",\n         \"<table><button></button></table>\",\n         \"<table><button></table>\",\n         \"<BUTTON />\",\n         \"<BUTTON></BUTTON>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_button_nonce\"},\n    {input: \"<button srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<button></button>\",\n         \"<button>\",\n         \"<button/>\",\n         \"<button />\",\n         \"<table><button></button></table>\",\n         \"<table><button></table>\",\n         \"<BUTTON />\",\n         \"<BUTTON></BUTTON>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_button_srcset\"},\n    {input: \"<button srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<button></button>\",\n         \"<button>\",\n         \"<button/>\",\n         \"<button />\",\n         \"<table><button></button></table>\",\n         \"<table><button></table>\",\n         \"<BUTTON />\",\n         \"<BUTTON></BUTTON>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_button_srcdoc\"},\n    {input: \"<button poster=\\\"x\\\">\",\n     acceptable: [\n         \"<button></button>\",\n         \"<button>\",\n         \"<button/>\",\n         \"<button />\",\n         \"<table><button></button></table>\",\n         \"<table><button></table>\",\n         \"<BUTTON />\",\n         \"<BUTTON></BUTTON>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_button_poster\"},\n    {input: \"<button autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<button></button>\",\n         \"<button>\",\n         \"<button/>\",\n         \"<button />\",\n         \"<table><button></button></table>\",\n         \"<table><button></table>\",\n         \"<BUTTON />\",\n         \"<BUTTON></BUTTON>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_button_autoplay\"},\n    {input: \"<button controls=\\\"x\\\">\",\n     acceptable: [\n         \"<button></button>\",\n         \"<button>\",\n         \"<button/>\",\n         \"<button />\",\n         \"<table><button></button></table>\",\n         \"<table><button></table>\",\n         \"<BUTTON />\",\n         \"<BUTTON></BUTTON>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_button_controls\"},\n    {input: \"<button pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<button></button>\",\n         \"<button>\",\n         \"<button/>\",\n         \"<button />\",\n         \"<table><button></button></table>\",\n         \"<table><button></table>\",\n         \"<BUTTON />\",\n         \"<BUTTON></BUTTON>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_button_pattern\"},\n    {input: \"<button icon=\\\"x\\\">\",\n     acceptable: [\n         \"<button></button>\",\n         \"<button>\",\n         \"<button/>\",\n         \"<button />\",\n         \"<table><button></button></table>\",\n         \"<table><button></table>\",\n         \"<BUTTON />\",\n         \"<BUTTON></BUTTON>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_button_icon\"},\n    {input: \"<button select=\\\"x\\\">\",\n     acceptable: [\n         \"<button></button>\",\n         \"<button>\",\n         \"<button/>\",\n         \"<button />\",\n         \"<table><button></button></table>\",\n         \"<table><button></table>\",\n         \"<BUTTON />\",\n         \"<BUTTON></BUTTON>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_button_select\"},\n    {input: \"<select></select>\",\n     acceptable: [\n         \"<select>\",\n         \"<select />\",\n         \"<select></select>\",\n         \"<table><select></select></table>\",\n         \"<SELECT />\",\n         \"<SELECT></SELECT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_select_plain\"},\n    {input: \"<select><script>alert()</script></select>\",\n     acceptable: [\n         \"<select>\",\n         \"<select />\",\n         \"<select></select>\",\n         \"<table><select></select></table>\",\n         \"<SELECT />\",\n         \"<SELECT></SELECT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><select><td></td></select></table>\",\n         \"<table><select></select><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_select_scriptinside\"},\n    {input: \"<select media=\\\"x\\\">\",\n     acceptable: [\n         \"<select></select>\",\n         \"<select>\",\n         \"<select/>\",\n         \"<select />\",\n         \"<table><select></select></table>\",\n         \"<table><select></table>\",\n         \"<SELECT />\",\n         \"<SELECT></SELECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_select_media\"},\n    {input: \"<select nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<select></select>\",\n         \"<select>\",\n         \"<select/>\",\n         \"<select />\",\n         \"<table><select></select></table>\",\n         \"<table><select></table>\",\n         \"<SELECT />\",\n         \"<SELECT></SELECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_select_nonce\"},\n    {input: \"<select srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<select></select>\",\n         \"<select>\",\n         \"<select/>\",\n         \"<select />\",\n         \"<table><select></select></table>\",\n         \"<table><select></table>\",\n         \"<SELECT />\",\n         \"<SELECT></SELECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_select_srcset\"},\n    {input: \"<select srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<select></select>\",\n         \"<select>\",\n         \"<select/>\",\n         \"<select />\",\n         \"<table><select></select></table>\",\n         \"<table><select></table>\",\n         \"<SELECT />\",\n         \"<SELECT></SELECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_select_srcdoc\"},\n    {input: \"<select poster=\\\"x\\\">\",\n     acceptable: [\n         \"<select></select>\",\n         \"<select>\",\n         \"<select/>\",\n         \"<select />\",\n         \"<table><select></select></table>\",\n         \"<table><select></table>\",\n         \"<SELECT />\",\n         \"<SELECT></SELECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_select_poster\"},\n    {input: \"<select autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<select></select>\",\n         \"<select>\",\n         \"<select/>\",\n         \"<select />\",\n         \"<table><select></select></table>\",\n         \"<table><select></table>\",\n         \"<SELECT />\",\n         \"<SELECT></SELECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_select_autoplay\"},\n    {input: \"<select controls=\\\"x\\\">\",\n     acceptable: [\n         \"<select></select>\",\n         \"<select>\",\n         \"<select/>\",\n         \"<select />\",\n         \"<table><select></select></table>\",\n         \"<table><select></table>\",\n         \"<SELECT />\",\n         \"<SELECT></SELECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_select_controls\"},\n    {input: \"<select formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<select></select>\",\n         \"<select>\",\n         \"<select/>\",\n         \"<select />\",\n         \"<table><select></select></table>\",\n         \"<table><select></table>\",\n         \"<SELECT />\",\n         \"<SELECT></SELECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_select_formaction\"},\n    {input: \"<select formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<select></select>\",\n         \"<select>\",\n         \"<select/>\",\n         \"<select />\",\n         \"<table><select></select></table>\",\n         \"<table><select></table>\",\n         \"<SELECT />\",\n         \"<SELECT></SELECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_select_formmethod\"},\n    {input: \"<select pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<select></select>\",\n         \"<select>\",\n         \"<select/>\",\n         \"<select />\",\n         \"<table><select></select></table>\",\n         \"<table><select></table>\",\n         \"<SELECT />\",\n         \"<SELECT></SELECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_select_pattern\"},\n    {input: \"<select icon=\\\"x\\\">\",\n     acceptable: [\n         \"<select></select>\",\n         \"<select>\",\n         \"<select/>\",\n         \"<select />\",\n         \"<table><select></select></table>\",\n         \"<table><select></table>\",\n         \"<SELECT />\",\n         \"<SELECT></SELECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_select_icon\"},\n    {input: \"<select select=\\\"x\\\">\",\n     acceptable: [\n         \"<select></select>\",\n         \"<select>\",\n         \"<select/>\",\n         \"<select />\",\n         \"<table><select></select></table>\",\n         \"<table><select></table>\",\n         \"<SELECT />\",\n         \"<SELECT></SELECT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_select_select\"},\n    {input: \"<datalist></datalist>\",\n     acceptable: [\n         \"<datalist>\",\n         \"<datalist />\",\n         \"<datalist></datalist>\",\n         \"<table><datalist></datalist></table>\",\n         \"<DATALIST />\",\n         \"<DATALIST></DATALIST>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_datalist_plain\"},\n    {input: \"<datalist><script>alert()</script></datalist>\",\n     acceptable: [\n         \"<datalist>\",\n         \"<datalist />\",\n         \"<datalist></datalist>\",\n         \"<table><datalist></datalist></table>\",\n         \"<DATALIST />\",\n         \"<DATALIST></DATALIST>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><datalist><td></td></datalist></table>\",\n         \"<table><datalist></datalist><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_datalist_scriptinside\"},\n    {input: \"<datalist media=\\\"x\\\">\",\n     acceptable: [\n         \"<datalist></datalist>\",\n         \"<datalist>\",\n         \"<datalist/>\",\n         \"<datalist />\",\n         \"<table><datalist></datalist></table>\",\n         \"<table><datalist></table>\",\n         \"<DATALIST />\",\n         \"<DATALIST></DATALIST>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_datalist_media\"},\n    {input: \"<datalist nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<datalist></datalist>\",\n         \"<datalist>\",\n         \"<datalist/>\",\n         \"<datalist />\",\n         \"<table><datalist></datalist></table>\",\n         \"<table><datalist></table>\",\n         \"<DATALIST />\",\n         \"<DATALIST></DATALIST>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_datalist_nonce\"},\n    {input: \"<datalist srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<datalist></datalist>\",\n         \"<datalist>\",\n         \"<datalist/>\",\n         \"<datalist />\",\n         \"<table><datalist></datalist></table>\",\n         \"<table><datalist></table>\",\n         \"<DATALIST />\",\n         \"<DATALIST></DATALIST>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_datalist_srcset\"},\n    {input: \"<datalist srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<datalist></datalist>\",\n         \"<datalist>\",\n         \"<datalist/>\",\n         \"<datalist />\",\n         \"<table><datalist></datalist></table>\",\n         \"<table><datalist></table>\",\n         \"<DATALIST />\",\n         \"<DATALIST></DATALIST>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_datalist_srcdoc\"},\n    {input: \"<datalist poster=\\\"x\\\">\",\n     acceptable: [\n         \"<datalist></datalist>\",\n         \"<datalist>\",\n         \"<datalist/>\",\n         \"<datalist />\",\n         \"<table><datalist></datalist></table>\",\n         \"<table><datalist></table>\",\n         \"<DATALIST />\",\n         \"<DATALIST></DATALIST>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_datalist_poster\"},\n    {input: \"<datalist autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<datalist></datalist>\",\n         \"<datalist>\",\n         \"<datalist/>\",\n         \"<datalist />\",\n         \"<table><datalist></datalist></table>\",\n         \"<table><datalist></table>\",\n         \"<DATALIST />\",\n         \"<DATALIST></DATALIST>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_datalist_autoplay\"},\n    {input: \"<datalist controls=\\\"x\\\">\",\n     acceptable: [\n         \"<datalist></datalist>\",\n         \"<datalist>\",\n         \"<datalist/>\",\n         \"<datalist />\",\n         \"<table><datalist></datalist></table>\",\n         \"<table><datalist></table>\",\n         \"<DATALIST />\",\n         \"<DATALIST></DATALIST>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_datalist_controls\"},\n    {input: \"<datalist formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<datalist></datalist>\",\n         \"<datalist>\",\n         \"<datalist/>\",\n         \"<datalist />\",\n         \"<table><datalist></datalist></table>\",\n         \"<table><datalist></table>\",\n         \"<DATALIST />\",\n         \"<DATALIST></DATALIST>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_datalist_formaction\"},\n    {input: \"<datalist formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<datalist></datalist>\",\n         \"<datalist>\",\n         \"<datalist/>\",\n         \"<datalist />\",\n         \"<table><datalist></datalist></table>\",\n         \"<table><datalist></table>\",\n         \"<DATALIST />\",\n         \"<DATALIST></DATALIST>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_datalist_formmethod\"},\n    {input: \"<datalist pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<datalist></datalist>\",\n         \"<datalist>\",\n         \"<datalist/>\",\n         \"<datalist />\",\n         \"<table><datalist></datalist></table>\",\n         \"<table><datalist></table>\",\n         \"<DATALIST />\",\n         \"<DATALIST></DATALIST>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_datalist_pattern\"},\n    {input: \"<datalist icon=\\\"x\\\">\",\n     acceptable: [\n         \"<datalist></datalist>\",\n         \"<datalist>\",\n         \"<datalist/>\",\n         \"<datalist />\",\n         \"<table><datalist></datalist></table>\",\n         \"<table><datalist></table>\",\n         \"<DATALIST />\",\n         \"<DATALIST></DATALIST>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_datalist_icon\"},\n    {input: \"<datalist select=\\\"x\\\">\",\n     acceptable: [\n         \"<datalist></datalist>\",\n         \"<datalist>\",\n         \"<datalist/>\",\n         \"<datalist />\",\n         \"<table><datalist></datalist></table>\",\n         \"<table><datalist></table>\",\n         \"<DATALIST />\",\n         \"<DATALIST></DATALIST>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_datalist_select\"},\n    {input: \"<optgroup></optgroup>\",\n     acceptable: [\n         \"<optgroup>\",\n         \"<optgroup />\",\n         \"<optgroup></optgroup>\",\n         \"<table><optgroup></optgroup></table>\",\n         \"<OPTGROUP />\",\n         \"<OPTGROUP></OPTGROUP>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_optgroup_plain\"},\n    {input: \"<optgroup><script>alert()</script></optgroup>\",\n     acceptable: [\n         \"<optgroup>\",\n         \"<optgroup />\",\n         \"<optgroup></optgroup>\",\n         \"<table><optgroup></optgroup></table>\",\n         \"<OPTGROUP />\",\n         \"<OPTGROUP></OPTGROUP>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><optgroup><td></td></optgroup></table>\",\n         \"<table><optgroup></optgroup><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_optgroup_scriptinside\"},\n    {input: \"<optgroup media=\\\"x\\\">\",\n     acceptable: [\n         \"<optgroup></optgroup>\",\n         \"<optgroup>\",\n         \"<optgroup/>\",\n         \"<optgroup />\",\n         \"<table><optgroup></optgroup></table>\",\n         \"<table><optgroup></table>\",\n         \"<OPTGROUP />\",\n         \"<OPTGROUP></OPTGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_optgroup_media\"},\n    {input: \"<optgroup nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<optgroup></optgroup>\",\n         \"<optgroup>\",\n         \"<optgroup/>\",\n         \"<optgroup />\",\n         \"<table><optgroup></optgroup></table>\",\n         \"<table><optgroup></table>\",\n         \"<OPTGROUP />\",\n         \"<OPTGROUP></OPTGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_optgroup_nonce\"},\n    {input: \"<optgroup srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<optgroup></optgroup>\",\n         \"<optgroup>\",\n         \"<optgroup/>\",\n         \"<optgroup />\",\n         \"<table><optgroup></optgroup></table>\",\n         \"<table><optgroup></table>\",\n         \"<OPTGROUP />\",\n         \"<OPTGROUP></OPTGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_optgroup_srcset\"},\n    {input: \"<optgroup srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<optgroup></optgroup>\",\n         \"<optgroup>\",\n         \"<optgroup/>\",\n         \"<optgroup />\",\n         \"<table><optgroup></optgroup></table>\",\n         \"<table><optgroup></table>\",\n         \"<OPTGROUP />\",\n         \"<OPTGROUP></OPTGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_optgroup_srcdoc\"},\n    {input: \"<optgroup poster=\\\"x\\\">\",\n     acceptable: [\n         \"<optgroup></optgroup>\",\n         \"<optgroup>\",\n         \"<optgroup/>\",\n         \"<optgroup />\",\n         \"<table><optgroup></optgroup></table>\",\n         \"<table><optgroup></table>\",\n         \"<OPTGROUP />\",\n         \"<OPTGROUP></OPTGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_optgroup_poster\"},\n    {input: \"<optgroup autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<optgroup></optgroup>\",\n         \"<optgroup>\",\n         \"<optgroup/>\",\n         \"<optgroup />\",\n         \"<table><optgroup></optgroup></table>\",\n         \"<table><optgroup></table>\",\n         \"<OPTGROUP />\",\n         \"<OPTGROUP></OPTGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_optgroup_autoplay\"},\n    {input: \"<optgroup controls=\\\"x\\\">\",\n     acceptable: [\n         \"<optgroup></optgroup>\",\n         \"<optgroup>\",\n         \"<optgroup/>\",\n         \"<optgroup />\",\n         \"<table><optgroup></optgroup></table>\",\n         \"<table><optgroup></table>\",\n         \"<OPTGROUP />\",\n         \"<OPTGROUP></OPTGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_optgroup_controls\"},\n    {input: \"<optgroup formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<optgroup></optgroup>\",\n         \"<optgroup>\",\n         \"<optgroup/>\",\n         \"<optgroup />\",\n         \"<table><optgroup></optgroup></table>\",\n         \"<table><optgroup></table>\",\n         \"<OPTGROUP />\",\n         \"<OPTGROUP></OPTGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_optgroup_formaction\"},\n    {input: \"<optgroup formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<optgroup></optgroup>\",\n         \"<optgroup>\",\n         \"<optgroup/>\",\n         \"<optgroup />\",\n         \"<table><optgroup></optgroup></table>\",\n         \"<table><optgroup></table>\",\n         \"<OPTGROUP />\",\n         \"<OPTGROUP></OPTGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_optgroup_formmethod\"},\n    {input: \"<optgroup pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<optgroup></optgroup>\",\n         \"<optgroup>\",\n         \"<optgroup/>\",\n         \"<optgroup />\",\n         \"<table><optgroup></optgroup></table>\",\n         \"<table><optgroup></table>\",\n         \"<OPTGROUP />\",\n         \"<OPTGROUP></OPTGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_optgroup_pattern\"},\n    {input: \"<optgroup icon=\\\"x\\\">\",\n     acceptable: [\n         \"<optgroup></optgroup>\",\n         \"<optgroup>\",\n         \"<optgroup/>\",\n         \"<optgroup />\",\n         \"<table><optgroup></optgroup></table>\",\n         \"<table><optgroup></table>\",\n         \"<OPTGROUP />\",\n         \"<OPTGROUP></OPTGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_optgroup_icon\"},\n    {input: \"<optgroup select=\\\"x\\\">\",\n     acceptable: [\n         \"<optgroup></optgroup>\",\n         \"<optgroup>\",\n         \"<optgroup/>\",\n         \"<optgroup />\",\n         \"<table><optgroup></optgroup></table>\",\n         \"<table><optgroup></table>\",\n         \"<OPTGROUP />\",\n         \"<OPTGROUP></OPTGROUP>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_optgroup_select\"},\n    {input: \"<option></option>\",\n     acceptable: [\n         \"<option>\",\n         \"<option />\",\n         \"<option></option>\",\n         \"<table><option></option></table>\",\n         \"<OPTION />\",\n         \"<OPTION></OPTION>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_option_plain\"},\n    {input: \"<option><script>alert()</script></option>\",\n     acceptable: [\n         \"<option>\",\n         \"<option />\",\n         \"<option></option>\",\n         \"<table><option></option></table>\",\n         \"<OPTION />\",\n         \"<OPTION></OPTION>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><option><td></td></option></table>\",\n         \"<table><option></option><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_option_scriptinside\"},\n    {input: \"<option media=\\\"x\\\">\",\n     acceptable: [\n         \"<option></option>\",\n         \"<option>\",\n         \"<option/>\",\n         \"<option />\",\n         \"<table><option></option></table>\",\n         \"<table><option></table>\",\n         \"<OPTION />\",\n         \"<OPTION></OPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_option_media\"},\n    {input: \"<option nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<option></option>\",\n         \"<option>\",\n         \"<option/>\",\n         \"<option />\",\n         \"<table><option></option></table>\",\n         \"<table><option></table>\",\n         \"<OPTION />\",\n         \"<OPTION></OPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_option_nonce\"},\n    {input: \"<option srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<option></option>\",\n         \"<option>\",\n         \"<option/>\",\n         \"<option />\",\n         \"<table><option></option></table>\",\n         \"<table><option></table>\",\n         \"<OPTION />\",\n         \"<OPTION></OPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_option_srcset\"},\n    {input: \"<option srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<option></option>\",\n         \"<option>\",\n         \"<option/>\",\n         \"<option />\",\n         \"<table><option></option></table>\",\n         \"<table><option></table>\",\n         \"<OPTION />\",\n         \"<OPTION></OPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_option_srcdoc\"},\n    {input: \"<option poster=\\\"x\\\">\",\n     acceptable: [\n         \"<option></option>\",\n         \"<option>\",\n         \"<option/>\",\n         \"<option />\",\n         \"<table><option></option></table>\",\n         \"<table><option></table>\",\n         \"<OPTION />\",\n         \"<OPTION></OPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_option_poster\"},\n    {input: \"<option autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<option></option>\",\n         \"<option>\",\n         \"<option/>\",\n         \"<option />\",\n         \"<table><option></option></table>\",\n         \"<table><option></table>\",\n         \"<OPTION />\",\n         \"<OPTION></OPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_option_autoplay\"},\n    {input: \"<option controls=\\\"x\\\">\",\n     acceptable: [\n         \"<option></option>\",\n         \"<option>\",\n         \"<option/>\",\n         \"<option />\",\n         \"<table><option></option></table>\",\n         \"<table><option></table>\",\n         \"<OPTION />\",\n         \"<OPTION></OPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_option_controls\"},\n    {input: \"<option formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<option></option>\",\n         \"<option>\",\n         \"<option/>\",\n         \"<option />\",\n         \"<table><option></option></table>\",\n         \"<table><option></table>\",\n         \"<OPTION />\",\n         \"<OPTION></OPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_option_formaction\"},\n    {input: \"<option formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<option></option>\",\n         \"<option>\",\n         \"<option/>\",\n         \"<option />\",\n         \"<table><option></option></table>\",\n         \"<table><option></table>\",\n         \"<OPTION />\",\n         \"<OPTION></OPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_option_formmethod\"},\n    {input: \"<option pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<option></option>\",\n         \"<option>\",\n         \"<option/>\",\n         \"<option />\",\n         \"<table><option></option></table>\",\n         \"<table><option></table>\",\n         \"<OPTION />\",\n         \"<OPTION></OPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_option_pattern\"},\n    {input: \"<option icon=\\\"x\\\">\",\n     acceptable: [\n         \"<option></option>\",\n         \"<option>\",\n         \"<option/>\",\n         \"<option />\",\n         \"<table><option></option></table>\",\n         \"<table><option></table>\",\n         \"<OPTION />\",\n         \"<OPTION></OPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_option_icon\"},\n    {input: \"<option select=\\\"x\\\">\",\n     acceptable: [\n         \"<option></option>\",\n         \"<option>\",\n         \"<option/>\",\n         \"<option />\",\n         \"<table><option></option></table>\",\n         \"<table><option></table>\",\n         \"<OPTION />\",\n         \"<OPTION></OPTION>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_option_select\"},\n    {input: \"<textarea></textarea>\",\n     acceptable: [\n         \"<textarea></textarea>\",\n         \"<textarea />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_textarea_plain\"},\n    {input: \"<textarea><script>alert()</script></textarea>\",\n     acceptable: [\n         \"<textarea></textarea>\",\n         \"<textarea />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<textarea>&lt;script&gt;alert()&lt;/script&gt;</textarea>\",\n         \"<span>&lt;script&gt;alert()&lt;/script&gt;</span>\",\n         \"&lt;script&gt;alert()&lt;/script&gt;\",\n     ],\n     name: \"contract_textarea_scriptinside\"},\n    {input: \"<textarea media=\\\"x\\\">\",\n     acceptable: [\n         \"<textarea></textarea>\",\n         \"<textarea>\",\n         \"<textarea/>\",\n         \"<textarea />\",\n         \"<table><textarea></textarea></table>\",\n         \"<table><textarea></table>\",\n         \"<TEXTAREA />\",\n         \"<TEXTAREA></TEXTAREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_textarea_media\"},\n    {input: \"<textarea nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<textarea></textarea>\",\n         \"<textarea>\",\n         \"<textarea/>\",\n         \"<textarea />\",\n         \"<table><textarea></textarea></table>\",\n         \"<table><textarea></table>\",\n         \"<TEXTAREA />\",\n         \"<TEXTAREA></TEXTAREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_textarea_nonce\"},\n    {input: \"<textarea srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<textarea></textarea>\",\n         \"<textarea>\",\n         \"<textarea/>\",\n         \"<textarea />\",\n         \"<table><textarea></textarea></table>\",\n         \"<table><textarea></table>\",\n         \"<TEXTAREA />\",\n         \"<TEXTAREA></TEXTAREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_textarea_srcset\"},\n    {input: \"<textarea srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<textarea></textarea>\",\n         \"<textarea>\",\n         \"<textarea/>\",\n         \"<textarea />\",\n         \"<table><textarea></textarea></table>\",\n         \"<table><textarea></table>\",\n         \"<TEXTAREA />\",\n         \"<TEXTAREA></TEXTAREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_textarea_srcdoc\"},\n    {input: \"<textarea poster=\\\"x\\\">\",\n     acceptable: [\n         \"<textarea></textarea>\",\n         \"<textarea>\",\n         \"<textarea/>\",\n         \"<textarea />\",\n         \"<table><textarea></textarea></table>\",\n         \"<table><textarea></table>\",\n         \"<TEXTAREA />\",\n         \"<TEXTAREA></TEXTAREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_textarea_poster\"},\n    {input: \"<textarea autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<textarea></textarea>\",\n         \"<textarea>\",\n         \"<textarea/>\",\n         \"<textarea />\",\n         \"<table><textarea></textarea></table>\",\n         \"<table><textarea></table>\",\n         \"<TEXTAREA />\",\n         \"<TEXTAREA></TEXTAREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_textarea_autoplay\"},\n    {input: \"<textarea controls=\\\"x\\\">\",\n     acceptable: [\n         \"<textarea></textarea>\",\n         \"<textarea>\",\n         \"<textarea/>\",\n         \"<textarea />\",\n         \"<table><textarea></textarea></table>\",\n         \"<table><textarea></table>\",\n         \"<TEXTAREA />\",\n         \"<TEXTAREA></TEXTAREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_textarea_controls\"},\n    {input: \"<textarea formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<textarea></textarea>\",\n         \"<textarea>\",\n         \"<textarea/>\",\n         \"<textarea />\",\n         \"<table><textarea></textarea></table>\",\n         \"<table><textarea></table>\",\n         \"<TEXTAREA />\",\n         \"<TEXTAREA></TEXTAREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_textarea_formaction\"},\n    {input: \"<textarea formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<textarea></textarea>\",\n         \"<textarea>\",\n         \"<textarea/>\",\n         \"<textarea />\",\n         \"<table><textarea></textarea></table>\",\n         \"<table><textarea></table>\",\n         \"<TEXTAREA />\",\n         \"<TEXTAREA></TEXTAREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_textarea_formmethod\"},\n    {input: \"<textarea pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<textarea></textarea>\",\n         \"<textarea>\",\n         \"<textarea/>\",\n         \"<textarea />\",\n         \"<table><textarea></textarea></table>\",\n         \"<table><textarea></table>\",\n         \"<TEXTAREA />\",\n         \"<TEXTAREA></TEXTAREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_textarea_pattern\"},\n    {input: \"<textarea icon=\\\"x\\\">\",\n     acceptable: [\n         \"<textarea></textarea>\",\n         \"<textarea>\",\n         \"<textarea/>\",\n         \"<textarea />\",\n         \"<table><textarea></textarea></table>\",\n         \"<table><textarea></table>\",\n         \"<TEXTAREA />\",\n         \"<TEXTAREA></TEXTAREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_textarea_icon\"},\n    {input: \"<textarea select=\\\"x\\\">\",\n     acceptable: [\n         \"<textarea></textarea>\",\n         \"<textarea>\",\n         \"<textarea/>\",\n         \"<textarea />\",\n         \"<table><textarea></textarea></table>\",\n         \"<table><textarea></table>\",\n         \"<TEXTAREA />\",\n         \"<TEXTAREA></TEXTAREA>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_textarea_select\"},\n    {input: \"<keygen></keygen>\",\n     acceptable: [\n         \"<keygen>\",\n         \"<keygen />\",\n         \"<keygen/>\",\n         \"<keygen><keygen>\",\n         \"<keygen/><keygen/>\",\n         \"<keygen /><keygen />\",\n         \"<table><keygen></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_keygen_plain\"},\n    {input: \"<keygen><script>alert()</script></keygen>\",\n     acceptable: [\n         \"<keygen>\",\n         \"<keygen />\",\n         \"<keygen/>\",\n         \"<keygen><keygen>\",\n         \"<keygen/><keygen/>\",\n         \"<keygen /><keygen />\",\n         \"<table><keygen></table>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><keygen><td></td></table>\",\n     ],\n     name: \"contract_keygen_scriptinside\"},\n    {input: \"<keygen media=\\\"x\\\">\",\n     acceptable: [\n         \"<keygen></keygen>\",\n         \"<keygen>\",\n         \"<keygen/>\",\n         \"<keygen />\",\n         \"<table><keygen></keygen></table>\",\n         \"<table><keygen></table>\",\n         \"<KEYGEN />\",\n         \"<KEYGEN></KEYGEN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_keygen_media\"},\n    {input: \"<keygen nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<keygen></keygen>\",\n         \"<keygen>\",\n         \"<keygen/>\",\n         \"<keygen />\",\n         \"<table><keygen></keygen></table>\",\n         \"<table><keygen></table>\",\n         \"<KEYGEN />\",\n         \"<KEYGEN></KEYGEN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_keygen_nonce\"},\n    {input: \"<keygen srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<keygen></keygen>\",\n         \"<keygen>\",\n         \"<keygen/>\",\n         \"<keygen />\",\n         \"<table><keygen></keygen></table>\",\n         \"<table><keygen></table>\",\n         \"<KEYGEN />\",\n         \"<KEYGEN></KEYGEN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_keygen_srcset\"},\n    {input: \"<keygen srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<keygen></keygen>\",\n         \"<keygen>\",\n         \"<keygen/>\",\n         \"<keygen />\",\n         \"<table><keygen></keygen></table>\",\n         \"<table><keygen></table>\",\n         \"<KEYGEN />\",\n         \"<KEYGEN></KEYGEN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_keygen_srcdoc\"},\n    {input: \"<keygen poster=\\\"x\\\">\",\n     acceptable: [\n         \"<keygen></keygen>\",\n         \"<keygen>\",\n         \"<keygen/>\",\n         \"<keygen />\",\n         \"<table><keygen></keygen></table>\",\n         \"<table><keygen></table>\",\n         \"<KEYGEN />\",\n         \"<KEYGEN></KEYGEN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_keygen_poster\"},\n    {input: \"<keygen autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<keygen></keygen>\",\n         \"<keygen>\",\n         \"<keygen/>\",\n         \"<keygen />\",\n         \"<table><keygen></keygen></table>\",\n         \"<table><keygen></table>\",\n         \"<KEYGEN />\",\n         \"<KEYGEN></KEYGEN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_keygen_autoplay\"},\n    {input: \"<keygen controls=\\\"x\\\">\",\n     acceptable: [\n         \"<keygen></keygen>\",\n         \"<keygen>\",\n         \"<keygen/>\",\n         \"<keygen />\",\n         \"<table><keygen></keygen></table>\",\n         \"<table><keygen></table>\",\n         \"<KEYGEN />\",\n         \"<KEYGEN></KEYGEN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_keygen_controls\"},\n    {input: \"<keygen formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<keygen></keygen>\",\n         \"<keygen>\",\n         \"<keygen/>\",\n         \"<keygen />\",\n         \"<table><keygen></keygen></table>\",\n         \"<table><keygen></table>\",\n         \"<KEYGEN />\",\n         \"<KEYGEN></KEYGEN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_keygen_formaction\"},\n    {input: \"<keygen formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<keygen></keygen>\",\n         \"<keygen>\",\n         \"<keygen/>\",\n         \"<keygen />\",\n         \"<table><keygen></keygen></table>\",\n         \"<table><keygen></table>\",\n         \"<KEYGEN />\",\n         \"<KEYGEN></KEYGEN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_keygen_formmethod\"},\n    {input: \"<keygen pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<keygen></keygen>\",\n         \"<keygen>\",\n         \"<keygen/>\",\n         \"<keygen />\",\n         \"<table><keygen></keygen></table>\",\n         \"<table><keygen></table>\",\n         \"<KEYGEN />\",\n         \"<KEYGEN></KEYGEN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_keygen_pattern\"},\n    {input: \"<keygen icon=\\\"x\\\">\",\n     acceptable: [\n         \"<keygen></keygen>\",\n         \"<keygen>\",\n         \"<keygen/>\",\n         \"<keygen />\",\n         \"<table><keygen></keygen></table>\",\n         \"<table><keygen></table>\",\n         \"<KEYGEN />\",\n         \"<KEYGEN></KEYGEN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_keygen_icon\"},\n    {input: \"<keygen select=\\\"x\\\">\",\n     acceptable: [\n         \"<keygen></keygen>\",\n         \"<keygen>\",\n         \"<keygen/>\",\n         \"<keygen />\",\n         \"<table><keygen></keygen></table>\",\n         \"<table><keygen></table>\",\n         \"<KEYGEN />\",\n         \"<KEYGEN></KEYGEN>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_keygen_select\"},\n    {input: \"<output></output>\",\n     acceptable: [\n         \"<output>\",\n         \"<output />\",\n         \"<output></output>\",\n         \"<table><output></output></table>\",\n         \"<OUTPUT />\",\n         \"<OUTPUT></OUTPUT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_output_plain\"},\n    {input: \"<output><script>alert()</script></output>\",\n     acceptable: [\n         \"<output>\",\n         \"<output />\",\n         \"<output></output>\",\n         \"<table><output></output></table>\",\n         \"<OUTPUT />\",\n         \"<OUTPUT></OUTPUT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><output><td></td></output></table>\",\n         \"<table><output></output><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_output_scriptinside\"},\n    {input: \"<output media=\\\"x\\\">\",\n     acceptable: [\n         \"<output></output>\",\n         \"<output>\",\n         \"<output/>\",\n         \"<output />\",\n         \"<table><output></output></table>\",\n         \"<table><output></table>\",\n         \"<OUTPUT />\",\n         \"<OUTPUT></OUTPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_output_media\"},\n    {input: \"<output nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<output></output>\",\n         \"<output>\",\n         \"<output/>\",\n         \"<output />\",\n         \"<table><output></output></table>\",\n         \"<table><output></table>\",\n         \"<OUTPUT />\",\n         \"<OUTPUT></OUTPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_output_nonce\"},\n    {input: \"<output srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<output></output>\",\n         \"<output>\",\n         \"<output/>\",\n         \"<output />\",\n         \"<table><output></output></table>\",\n         \"<table><output></table>\",\n         \"<OUTPUT />\",\n         \"<OUTPUT></OUTPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_output_srcset\"},\n    {input: \"<output srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<output></output>\",\n         \"<output>\",\n         \"<output/>\",\n         \"<output />\",\n         \"<table><output></output></table>\",\n         \"<table><output></table>\",\n         \"<OUTPUT />\",\n         \"<OUTPUT></OUTPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_output_srcdoc\"},\n    {input: \"<output poster=\\\"x\\\">\",\n     acceptable: [\n         \"<output></output>\",\n         \"<output>\",\n         \"<output/>\",\n         \"<output />\",\n         \"<table><output></output></table>\",\n         \"<table><output></table>\",\n         \"<OUTPUT />\",\n         \"<OUTPUT></OUTPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_output_poster\"},\n    {input: \"<output autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<output></output>\",\n         \"<output>\",\n         \"<output/>\",\n         \"<output />\",\n         \"<table><output></output></table>\",\n         \"<table><output></table>\",\n         \"<OUTPUT />\",\n         \"<OUTPUT></OUTPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_output_autoplay\"},\n    {input: \"<output controls=\\\"x\\\">\",\n     acceptable: [\n         \"<output></output>\",\n         \"<output>\",\n         \"<output/>\",\n         \"<output />\",\n         \"<table><output></output></table>\",\n         \"<table><output></table>\",\n         \"<OUTPUT />\",\n         \"<OUTPUT></OUTPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_output_controls\"},\n    {input: \"<output formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<output></output>\",\n         \"<output>\",\n         \"<output/>\",\n         \"<output />\",\n         \"<table><output></output></table>\",\n         \"<table><output></table>\",\n         \"<OUTPUT />\",\n         \"<OUTPUT></OUTPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_output_formaction\"},\n    {input: \"<output formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<output></output>\",\n         \"<output>\",\n         \"<output/>\",\n         \"<output />\",\n         \"<table><output></output></table>\",\n         \"<table><output></table>\",\n         \"<OUTPUT />\",\n         \"<OUTPUT></OUTPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_output_formmethod\"},\n    {input: \"<output pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<output></output>\",\n         \"<output>\",\n         \"<output/>\",\n         \"<output />\",\n         \"<table><output></output></table>\",\n         \"<table><output></table>\",\n         \"<OUTPUT />\",\n         \"<OUTPUT></OUTPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_output_pattern\"},\n    {input: \"<output icon=\\\"x\\\">\",\n     acceptable: [\n         \"<output></output>\",\n         \"<output>\",\n         \"<output/>\",\n         \"<output />\",\n         \"<table><output></output></table>\",\n         \"<table><output></table>\",\n         \"<OUTPUT />\",\n         \"<OUTPUT></OUTPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_output_icon\"},\n    {input: \"<output select=\\\"x\\\">\",\n     acceptable: [\n         \"<output></output>\",\n         \"<output>\",\n         \"<output/>\",\n         \"<output />\",\n         \"<table><output></output></table>\",\n         \"<table><output></table>\",\n         \"<OUTPUT />\",\n         \"<OUTPUT></OUTPUT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_output_select\"},\n    {input: \"<progress></progress>\",\n     acceptable: [\n         \"<progress>\",\n         \"<progress />\",\n         \"<progress></progress>\",\n         \"<table><progress></progress></table>\",\n         \"<PROGRESS />\",\n         \"<PROGRESS></PROGRESS>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_progress_plain\"},\n    {input: \"<progress><script>alert()</script></progress>\",\n     acceptable: [\n         \"<progress>\",\n         \"<progress />\",\n         \"<progress></progress>\",\n         \"<table><progress></progress></table>\",\n         \"<PROGRESS />\",\n         \"<PROGRESS></PROGRESS>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><progress><td></td></progress></table>\",\n         \"<table><progress></progress><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_progress_scriptinside\"},\n    {input: \"<progress media=\\\"x\\\">\",\n     acceptable: [\n         \"<progress></progress>\",\n         \"<progress>\",\n         \"<progress/>\",\n         \"<progress />\",\n         \"<table><progress></progress></table>\",\n         \"<table><progress></table>\",\n         \"<PROGRESS />\",\n         \"<PROGRESS></PROGRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_progress_media\"},\n    {input: \"<progress nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<progress></progress>\",\n         \"<progress>\",\n         \"<progress/>\",\n         \"<progress />\",\n         \"<table><progress></progress></table>\",\n         \"<table><progress></table>\",\n         \"<PROGRESS />\",\n         \"<PROGRESS></PROGRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_progress_nonce\"},\n    {input: \"<progress srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<progress></progress>\",\n         \"<progress>\",\n         \"<progress/>\",\n         \"<progress />\",\n         \"<table><progress></progress></table>\",\n         \"<table><progress></table>\",\n         \"<PROGRESS />\",\n         \"<PROGRESS></PROGRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_progress_srcset\"},\n    {input: \"<progress srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<progress></progress>\",\n         \"<progress>\",\n         \"<progress/>\",\n         \"<progress />\",\n         \"<table><progress></progress></table>\",\n         \"<table><progress></table>\",\n         \"<PROGRESS />\",\n         \"<PROGRESS></PROGRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_progress_srcdoc\"},\n    {input: \"<progress poster=\\\"x\\\">\",\n     acceptable: [\n         \"<progress></progress>\",\n         \"<progress>\",\n         \"<progress/>\",\n         \"<progress />\",\n         \"<table><progress></progress></table>\",\n         \"<table><progress></table>\",\n         \"<PROGRESS />\",\n         \"<PROGRESS></PROGRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_progress_poster\"},\n    {input: \"<progress autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<progress></progress>\",\n         \"<progress>\",\n         \"<progress/>\",\n         \"<progress />\",\n         \"<table><progress></progress></table>\",\n         \"<table><progress></table>\",\n         \"<PROGRESS />\",\n         \"<PROGRESS></PROGRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_progress_autoplay\"},\n    {input: \"<progress controls=\\\"x\\\">\",\n     acceptable: [\n         \"<progress></progress>\",\n         \"<progress>\",\n         \"<progress/>\",\n         \"<progress />\",\n         \"<table><progress></progress></table>\",\n         \"<table><progress></table>\",\n         \"<PROGRESS />\",\n         \"<PROGRESS></PROGRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_progress_controls\"},\n    {input: \"<progress formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<progress></progress>\",\n         \"<progress>\",\n         \"<progress/>\",\n         \"<progress />\",\n         \"<table><progress></progress></table>\",\n         \"<table><progress></table>\",\n         \"<PROGRESS />\",\n         \"<PROGRESS></PROGRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_progress_formaction\"},\n    {input: \"<progress formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<progress></progress>\",\n         \"<progress>\",\n         \"<progress/>\",\n         \"<progress />\",\n         \"<table><progress></progress></table>\",\n         \"<table><progress></table>\",\n         \"<PROGRESS />\",\n         \"<PROGRESS></PROGRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_progress_formmethod\"},\n    {input: \"<progress pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<progress></progress>\",\n         \"<progress>\",\n         \"<progress/>\",\n         \"<progress />\",\n         \"<table><progress></progress></table>\",\n         \"<table><progress></table>\",\n         \"<PROGRESS />\",\n         \"<PROGRESS></PROGRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_progress_pattern\"},\n    {input: \"<progress icon=\\\"x\\\">\",\n     acceptable: [\n         \"<progress></progress>\",\n         \"<progress>\",\n         \"<progress/>\",\n         \"<progress />\",\n         \"<table><progress></progress></table>\",\n         \"<table><progress></table>\",\n         \"<PROGRESS />\",\n         \"<PROGRESS></PROGRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_progress_icon\"},\n    {input: \"<progress select=\\\"x\\\">\",\n     acceptable: [\n         \"<progress></progress>\",\n         \"<progress>\",\n         \"<progress/>\",\n         \"<progress />\",\n         \"<table><progress></progress></table>\",\n         \"<table><progress></table>\",\n         \"<PROGRESS />\",\n         \"<PROGRESS></PROGRESS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_progress_select\"},\n    {input: \"<meter></meter>\",\n     acceptable: [\n         \"<meter>\",\n         \"<meter />\",\n         \"<meter></meter>\",\n         \"<table><meter></meter></table>\",\n         \"<METER />\",\n         \"<METER></METER>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meter_plain\"},\n    {input: \"<meter><script>alert()</script></meter>\",\n     acceptable: [\n         \"<meter>\",\n         \"<meter />\",\n         \"<meter></meter>\",\n         \"<table><meter></meter></table>\",\n         \"<METER />\",\n         \"<METER></METER>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><meter><td></td></meter></table>\",\n         \"<table><meter></meter><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_meter_scriptinside\"},\n    {input: \"<meter media=\\\"x\\\">\",\n     acceptable: [\n         \"<meter></meter>\",\n         \"<meter>\",\n         \"<meter/>\",\n         \"<meter />\",\n         \"<table><meter></meter></table>\",\n         \"<table><meter></table>\",\n         \"<METER />\",\n         \"<METER></METER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meter_media\"},\n    {input: \"<meter nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<meter></meter>\",\n         \"<meter>\",\n         \"<meter/>\",\n         \"<meter />\",\n         \"<table><meter></meter></table>\",\n         \"<table><meter></table>\",\n         \"<METER />\",\n         \"<METER></METER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meter_nonce\"},\n    {input: \"<meter srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<meter></meter>\",\n         \"<meter>\",\n         \"<meter/>\",\n         \"<meter />\",\n         \"<table><meter></meter></table>\",\n         \"<table><meter></table>\",\n         \"<METER />\",\n         \"<METER></METER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meter_srcset\"},\n    {input: \"<meter srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<meter></meter>\",\n         \"<meter>\",\n         \"<meter/>\",\n         \"<meter />\",\n         \"<table><meter></meter></table>\",\n         \"<table><meter></table>\",\n         \"<METER />\",\n         \"<METER></METER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meter_srcdoc\"},\n    {input: \"<meter poster=\\\"x\\\">\",\n     acceptable: [\n         \"<meter></meter>\",\n         \"<meter>\",\n         \"<meter/>\",\n         \"<meter />\",\n         \"<table><meter></meter></table>\",\n         \"<table><meter></table>\",\n         \"<METER />\",\n         \"<METER></METER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meter_poster\"},\n    {input: \"<meter autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<meter></meter>\",\n         \"<meter>\",\n         \"<meter/>\",\n         \"<meter />\",\n         \"<table><meter></meter></table>\",\n         \"<table><meter></table>\",\n         \"<METER />\",\n         \"<METER></METER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meter_autoplay\"},\n    {input: \"<meter controls=\\\"x\\\">\",\n     acceptable: [\n         \"<meter></meter>\",\n         \"<meter>\",\n         \"<meter/>\",\n         \"<meter />\",\n         \"<table><meter></meter></table>\",\n         \"<table><meter></table>\",\n         \"<METER />\",\n         \"<METER></METER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meter_controls\"},\n    {input: \"<meter formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<meter></meter>\",\n         \"<meter>\",\n         \"<meter/>\",\n         \"<meter />\",\n         \"<table><meter></meter></table>\",\n         \"<table><meter></table>\",\n         \"<METER />\",\n         \"<METER></METER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meter_formaction\"},\n    {input: \"<meter formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<meter></meter>\",\n         \"<meter>\",\n         \"<meter/>\",\n         \"<meter />\",\n         \"<table><meter></meter></table>\",\n         \"<table><meter></table>\",\n         \"<METER />\",\n         \"<METER></METER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meter_formmethod\"},\n    {input: \"<meter pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<meter></meter>\",\n         \"<meter>\",\n         \"<meter/>\",\n         \"<meter />\",\n         \"<table><meter></meter></table>\",\n         \"<table><meter></table>\",\n         \"<METER />\",\n         \"<METER></METER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meter_pattern\"},\n    {input: \"<meter icon=\\\"x\\\">\",\n     acceptable: [\n         \"<meter></meter>\",\n         \"<meter>\",\n         \"<meter/>\",\n         \"<meter />\",\n         \"<table><meter></meter></table>\",\n         \"<table><meter></table>\",\n         \"<METER />\",\n         \"<METER></METER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meter_icon\"},\n    {input: \"<meter select=\\\"x\\\">\",\n     acceptable: [\n         \"<meter></meter>\",\n         \"<meter>\",\n         \"<meter/>\",\n         \"<meter />\",\n         \"<table><meter></meter></table>\",\n         \"<table><meter></table>\",\n         \"<METER />\",\n         \"<METER></METER>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_meter_select\"},\n    {input: \"<fieldset></fieldset>\",\n     acceptable: [\n         \"<fieldset>\",\n         \"<fieldset />\",\n         \"<fieldset></fieldset>\",\n         \"<table><fieldset></fieldset></table>\",\n         \"<FIELDSET />\",\n         \"<FIELDSET></FIELDSET>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_fieldset_plain\"},\n    {input: \"<fieldset><script>alert()</script></fieldset>\",\n     acceptable: [\n         \"<fieldset>\",\n         \"<fieldset />\",\n         \"<fieldset></fieldset>\",\n         \"<table><fieldset></fieldset></table>\",\n         \"<FIELDSET />\",\n         \"<FIELDSET></FIELDSET>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><fieldset><td></td></fieldset></table>\",\n         \"<table><fieldset></fieldset><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_fieldset_scriptinside\"},\n    {input: \"<fieldset media=\\\"x\\\">\",\n     acceptable: [\n         \"<fieldset></fieldset>\",\n         \"<fieldset>\",\n         \"<fieldset/>\",\n         \"<fieldset />\",\n         \"<table><fieldset></fieldset></table>\",\n         \"<table><fieldset></table>\",\n         \"<FIELDSET />\",\n         \"<FIELDSET></FIELDSET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_fieldset_media\"},\n    {input: \"<fieldset nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<fieldset></fieldset>\",\n         \"<fieldset>\",\n         \"<fieldset/>\",\n         \"<fieldset />\",\n         \"<table><fieldset></fieldset></table>\",\n         \"<table><fieldset></table>\",\n         \"<FIELDSET />\",\n         \"<FIELDSET></FIELDSET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_fieldset_nonce\"},\n    {input: \"<fieldset srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<fieldset></fieldset>\",\n         \"<fieldset>\",\n         \"<fieldset/>\",\n         \"<fieldset />\",\n         \"<table><fieldset></fieldset></table>\",\n         \"<table><fieldset></table>\",\n         \"<FIELDSET />\",\n         \"<FIELDSET></FIELDSET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_fieldset_srcset\"},\n    {input: \"<fieldset srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<fieldset></fieldset>\",\n         \"<fieldset>\",\n         \"<fieldset/>\",\n         \"<fieldset />\",\n         \"<table><fieldset></fieldset></table>\",\n         \"<table><fieldset></table>\",\n         \"<FIELDSET />\",\n         \"<FIELDSET></FIELDSET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_fieldset_srcdoc\"},\n    {input: \"<fieldset poster=\\\"x\\\">\",\n     acceptable: [\n         \"<fieldset></fieldset>\",\n         \"<fieldset>\",\n         \"<fieldset/>\",\n         \"<fieldset />\",\n         \"<table><fieldset></fieldset></table>\",\n         \"<table><fieldset></table>\",\n         \"<FIELDSET />\",\n         \"<FIELDSET></FIELDSET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_fieldset_poster\"},\n    {input: \"<fieldset autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<fieldset></fieldset>\",\n         \"<fieldset>\",\n         \"<fieldset/>\",\n         \"<fieldset />\",\n         \"<table><fieldset></fieldset></table>\",\n         \"<table><fieldset></table>\",\n         \"<FIELDSET />\",\n         \"<FIELDSET></FIELDSET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_fieldset_autoplay\"},\n    {input: \"<fieldset controls=\\\"x\\\">\",\n     acceptable: [\n         \"<fieldset></fieldset>\",\n         \"<fieldset>\",\n         \"<fieldset/>\",\n         \"<fieldset />\",\n         \"<table><fieldset></fieldset></table>\",\n         \"<table><fieldset></table>\",\n         \"<FIELDSET />\",\n         \"<FIELDSET></FIELDSET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_fieldset_controls\"},\n    {input: \"<fieldset formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<fieldset></fieldset>\",\n         \"<fieldset>\",\n         \"<fieldset/>\",\n         \"<fieldset />\",\n         \"<table><fieldset></fieldset></table>\",\n         \"<table><fieldset></table>\",\n         \"<FIELDSET />\",\n         \"<FIELDSET></FIELDSET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_fieldset_formaction\"},\n    {input: \"<fieldset formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<fieldset></fieldset>\",\n         \"<fieldset>\",\n         \"<fieldset/>\",\n         \"<fieldset />\",\n         \"<table><fieldset></fieldset></table>\",\n         \"<table><fieldset></table>\",\n         \"<FIELDSET />\",\n         \"<FIELDSET></FIELDSET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_fieldset_formmethod\"},\n    {input: \"<fieldset pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<fieldset></fieldset>\",\n         \"<fieldset>\",\n         \"<fieldset/>\",\n         \"<fieldset />\",\n         \"<table><fieldset></fieldset></table>\",\n         \"<table><fieldset></table>\",\n         \"<FIELDSET />\",\n         \"<FIELDSET></FIELDSET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_fieldset_pattern\"},\n    {input: \"<fieldset icon=\\\"x\\\">\",\n     acceptable: [\n         \"<fieldset></fieldset>\",\n         \"<fieldset>\",\n         \"<fieldset/>\",\n         \"<fieldset />\",\n         \"<table><fieldset></fieldset></table>\",\n         \"<table><fieldset></table>\",\n         \"<FIELDSET />\",\n         \"<FIELDSET></FIELDSET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_fieldset_icon\"},\n    {input: \"<fieldset select=\\\"x\\\">\",\n     acceptable: [\n         \"<fieldset></fieldset>\",\n         \"<fieldset>\",\n         \"<fieldset/>\",\n         \"<fieldset />\",\n         \"<table><fieldset></fieldset></table>\",\n         \"<table><fieldset></table>\",\n         \"<FIELDSET />\",\n         \"<FIELDSET></FIELDSET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_fieldset_select\"},\n    {input: \"<legend></legend>\",\n     acceptable: [\n         \"<legend>\",\n         \"<legend />\",\n         \"<legend></legend>\",\n         \"<table><legend></legend></table>\",\n         \"<LEGEND />\",\n         \"<LEGEND></LEGEND>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_legend_plain\"},\n    {input: \"<legend><script>alert()</script></legend>\",\n     acceptable: [\n         \"<legend>\",\n         \"<legend />\",\n         \"<legend></legend>\",\n         \"<table><legend></legend></table>\",\n         \"<LEGEND />\",\n         \"<LEGEND></LEGEND>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><legend><td></td></legend></table>\",\n         \"<table><legend></legend><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_legend_scriptinside\"},\n    {input: \"<legend media=\\\"x\\\">\",\n     acceptable: [\n         \"<legend></legend>\",\n         \"<legend>\",\n         \"<legend/>\",\n         \"<legend />\",\n         \"<table><legend></legend></table>\",\n         \"<table><legend></table>\",\n         \"<LEGEND />\",\n         \"<LEGEND></LEGEND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_legend_media\"},\n    {input: \"<legend nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<legend></legend>\",\n         \"<legend>\",\n         \"<legend/>\",\n         \"<legend />\",\n         \"<table><legend></legend></table>\",\n         \"<table><legend></table>\",\n         \"<LEGEND />\",\n         \"<LEGEND></LEGEND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_legend_nonce\"},\n    {input: \"<legend srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<legend></legend>\",\n         \"<legend>\",\n         \"<legend/>\",\n         \"<legend />\",\n         \"<table><legend></legend></table>\",\n         \"<table><legend></table>\",\n         \"<LEGEND />\",\n         \"<LEGEND></LEGEND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_legend_srcset\"},\n    {input: \"<legend srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<legend></legend>\",\n         \"<legend>\",\n         \"<legend/>\",\n         \"<legend />\",\n         \"<table><legend></legend></table>\",\n         \"<table><legend></table>\",\n         \"<LEGEND />\",\n         \"<LEGEND></LEGEND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_legend_srcdoc\"},\n    {input: \"<legend poster=\\\"x\\\">\",\n     acceptable: [\n         \"<legend></legend>\",\n         \"<legend>\",\n         \"<legend/>\",\n         \"<legend />\",\n         \"<table><legend></legend></table>\",\n         \"<table><legend></table>\",\n         \"<LEGEND />\",\n         \"<LEGEND></LEGEND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_legend_poster\"},\n    {input: \"<legend autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<legend></legend>\",\n         \"<legend>\",\n         \"<legend/>\",\n         \"<legend />\",\n         \"<table><legend></legend></table>\",\n         \"<table><legend></table>\",\n         \"<LEGEND />\",\n         \"<LEGEND></LEGEND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_legend_autoplay\"},\n    {input: \"<legend controls=\\\"x\\\">\",\n     acceptable: [\n         \"<legend></legend>\",\n         \"<legend>\",\n         \"<legend/>\",\n         \"<legend />\",\n         \"<table><legend></legend></table>\",\n         \"<table><legend></table>\",\n         \"<LEGEND />\",\n         \"<LEGEND></LEGEND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_legend_controls\"},\n    {input: \"<legend formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<legend></legend>\",\n         \"<legend>\",\n         \"<legend/>\",\n         \"<legend />\",\n         \"<table><legend></legend></table>\",\n         \"<table><legend></table>\",\n         \"<LEGEND />\",\n         \"<LEGEND></LEGEND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_legend_formaction\"},\n    {input: \"<legend formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<legend></legend>\",\n         \"<legend>\",\n         \"<legend/>\",\n         \"<legend />\",\n         \"<table><legend></legend></table>\",\n         \"<table><legend></table>\",\n         \"<LEGEND />\",\n         \"<LEGEND></LEGEND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_legend_formmethod\"},\n    {input: \"<legend pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<legend></legend>\",\n         \"<legend>\",\n         \"<legend/>\",\n         \"<legend />\",\n         \"<table><legend></legend></table>\",\n         \"<table><legend></table>\",\n         \"<LEGEND />\",\n         \"<LEGEND></LEGEND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_legend_pattern\"},\n    {input: \"<legend icon=\\\"x\\\">\",\n     acceptable: [\n         \"<legend></legend>\",\n         \"<legend>\",\n         \"<legend/>\",\n         \"<legend />\",\n         \"<table><legend></legend></table>\",\n         \"<table><legend></table>\",\n         \"<LEGEND />\",\n         \"<LEGEND></LEGEND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_legend_icon\"},\n    {input: \"<legend select=\\\"x\\\">\",\n     acceptable: [\n         \"<legend></legend>\",\n         \"<legend>\",\n         \"<legend/>\",\n         \"<legend />\",\n         \"<table><legend></legend></table>\",\n         \"<table><legend></table>\",\n         \"<LEGEND />\",\n         \"<LEGEND></LEGEND>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_legend_select\"},\n    {input: \"<details></details>\",\n     acceptable: [\n         \"<details>\",\n         \"<details />\",\n         \"<details></details>\",\n         \"<table><details></details></table>\",\n         \"<DETAILS />\",\n         \"<DETAILS></DETAILS>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_details_plain\"},\n    {input: \"<details><script>alert()</script></details>\",\n     acceptable: [\n         \"<details>\",\n         \"<details />\",\n         \"<details></details>\",\n         \"<table><details></details></table>\",\n         \"<DETAILS />\",\n         \"<DETAILS></DETAILS>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><details><td></td></details></table>\",\n         \"<table><details></details><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_details_scriptinside\"},\n    {input: \"<details media=\\\"x\\\">\",\n     acceptable: [\n         \"<details></details>\",\n         \"<details>\",\n         \"<details/>\",\n         \"<details />\",\n         \"<table><details></details></table>\",\n         \"<table><details></table>\",\n         \"<DETAILS />\",\n         \"<DETAILS></DETAILS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_details_media\"},\n    {input: \"<details nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<details></details>\",\n         \"<details>\",\n         \"<details/>\",\n         \"<details />\",\n         \"<table><details></details></table>\",\n         \"<table><details></table>\",\n         \"<DETAILS />\",\n         \"<DETAILS></DETAILS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_details_nonce\"},\n    {input: \"<details srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<details></details>\",\n         \"<details>\",\n         \"<details/>\",\n         \"<details />\",\n         \"<table><details></details></table>\",\n         \"<table><details></table>\",\n         \"<DETAILS />\",\n         \"<DETAILS></DETAILS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_details_srcset\"},\n    {input: \"<details srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<details></details>\",\n         \"<details>\",\n         \"<details/>\",\n         \"<details />\",\n         \"<table><details></details></table>\",\n         \"<table><details></table>\",\n         \"<DETAILS />\",\n         \"<DETAILS></DETAILS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_details_srcdoc\"},\n    {input: \"<details poster=\\\"x\\\">\",\n     acceptable: [\n         \"<details></details>\",\n         \"<details>\",\n         \"<details/>\",\n         \"<details />\",\n         \"<table><details></details></table>\",\n         \"<table><details></table>\",\n         \"<DETAILS />\",\n         \"<DETAILS></DETAILS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_details_poster\"},\n    {input: \"<details autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<details></details>\",\n         \"<details>\",\n         \"<details/>\",\n         \"<details />\",\n         \"<table><details></details></table>\",\n         \"<table><details></table>\",\n         \"<DETAILS />\",\n         \"<DETAILS></DETAILS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_details_autoplay\"},\n    {input: \"<details controls=\\\"x\\\">\",\n     acceptable: [\n         \"<details></details>\",\n         \"<details>\",\n         \"<details/>\",\n         \"<details />\",\n         \"<table><details></details></table>\",\n         \"<table><details></table>\",\n         \"<DETAILS />\",\n         \"<DETAILS></DETAILS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_details_controls\"},\n    {input: \"<details formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<details></details>\",\n         \"<details>\",\n         \"<details/>\",\n         \"<details />\",\n         \"<table><details></details></table>\",\n         \"<table><details></table>\",\n         \"<DETAILS />\",\n         \"<DETAILS></DETAILS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_details_formaction\"},\n    {input: \"<details formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<details></details>\",\n         \"<details>\",\n         \"<details/>\",\n         \"<details />\",\n         \"<table><details></details></table>\",\n         \"<table><details></table>\",\n         \"<DETAILS />\",\n         \"<DETAILS></DETAILS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_details_formmethod\"},\n    {input: \"<details pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<details></details>\",\n         \"<details>\",\n         \"<details/>\",\n         \"<details />\",\n         \"<table><details></details></table>\",\n         \"<table><details></table>\",\n         \"<DETAILS />\",\n         \"<DETAILS></DETAILS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_details_pattern\"},\n    {input: \"<details icon=\\\"x\\\">\",\n     acceptable: [\n         \"<details></details>\",\n         \"<details>\",\n         \"<details/>\",\n         \"<details />\",\n         \"<table><details></details></table>\",\n         \"<table><details></table>\",\n         \"<DETAILS />\",\n         \"<DETAILS></DETAILS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_details_icon\"},\n    {input: \"<details select=\\\"x\\\">\",\n     acceptable: [\n         \"<details></details>\",\n         \"<details>\",\n         \"<details/>\",\n         \"<details />\",\n         \"<table><details></details></table>\",\n         \"<table><details></table>\",\n         \"<DETAILS />\",\n         \"<DETAILS></DETAILS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_details_select\"},\n    {input: \"<summary></summary>\",\n     acceptable: [\n         \"<summary>\",\n         \"<summary />\",\n         \"<summary></summary>\",\n         \"<table><summary></summary></table>\",\n         \"<SUMMARY />\",\n         \"<SUMMARY></SUMMARY>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_summary_plain\"},\n    {input: \"<summary><script>alert()</script></summary>\",\n     acceptable: [\n         \"<summary>\",\n         \"<summary />\",\n         \"<summary></summary>\",\n         \"<table><summary></summary></table>\",\n         \"<SUMMARY />\",\n         \"<SUMMARY></SUMMARY>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><summary><td></td></summary></table>\",\n         \"<table><summary></summary><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_summary_scriptinside\"},\n    {input: \"<summary media=\\\"x\\\">\",\n     acceptable: [\n         \"<summary></summary>\",\n         \"<summary>\",\n         \"<summary/>\",\n         \"<summary />\",\n         \"<table><summary></summary></table>\",\n         \"<table><summary></table>\",\n         \"<SUMMARY />\",\n         \"<SUMMARY></SUMMARY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_summary_media\"},\n    {input: \"<summary nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<summary></summary>\",\n         \"<summary>\",\n         \"<summary/>\",\n         \"<summary />\",\n         \"<table><summary></summary></table>\",\n         \"<table><summary></table>\",\n         \"<SUMMARY />\",\n         \"<SUMMARY></SUMMARY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_summary_nonce\"},\n    {input: \"<summary srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<summary></summary>\",\n         \"<summary>\",\n         \"<summary/>\",\n         \"<summary />\",\n         \"<table><summary></summary></table>\",\n         \"<table><summary></table>\",\n         \"<SUMMARY />\",\n         \"<SUMMARY></SUMMARY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_summary_srcset\"},\n    {input: \"<summary srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<summary></summary>\",\n         \"<summary>\",\n         \"<summary/>\",\n         \"<summary />\",\n         \"<table><summary></summary></table>\",\n         \"<table><summary></table>\",\n         \"<SUMMARY />\",\n         \"<SUMMARY></SUMMARY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_summary_srcdoc\"},\n    {input: \"<summary poster=\\\"x\\\">\",\n     acceptable: [\n         \"<summary></summary>\",\n         \"<summary>\",\n         \"<summary/>\",\n         \"<summary />\",\n         \"<table><summary></summary></table>\",\n         \"<table><summary></table>\",\n         \"<SUMMARY />\",\n         \"<SUMMARY></SUMMARY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_summary_poster\"},\n    {input: \"<summary autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<summary></summary>\",\n         \"<summary>\",\n         \"<summary/>\",\n         \"<summary />\",\n         \"<table><summary></summary></table>\",\n         \"<table><summary></table>\",\n         \"<SUMMARY />\",\n         \"<SUMMARY></SUMMARY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_summary_autoplay\"},\n    {input: \"<summary controls=\\\"x\\\">\",\n     acceptable: [\n         \"<summary></summary>\",\n         \"<summary>\",\n         \"<summary/>\",\n         \"<summary />\",\n         \"<table><summary></summary></table>\",\n         \"<table><summary></table>\",\n         \"<SUMMARY />\",\n         \"<SUMMARY></SUMMARY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_summary_controls\"},\n    {input: \"<summary formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<summary></summary>\",\n         \"<summary>\",\n         \"<summary/>\",\n         \"<summary />\",\n         \"<table><summary></summary></table>\",\n         \"<table><summary></table>\",\n         \"<SUMMARY />\",\n         \"<SUMMARY></SUMMARY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_summary_formaction\"},\n    {input: \"<summary formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<summary></summary>\",\n         \"<summary>\",\n         \"<summary/>\",\n         \"<summary />\",\n         \"<table><summary></summary></table>\",\n         \"<table><summary></table>\",\n         \"<SUMMARY />\",\n         \"<SUMMARY></SUMMARY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_summary_formmethod\"},\n    {input: \"<summary pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<summary></summary>\",\n         \"<summary>\",\n         \"<summary/>\",\n         \"<summary />\",\n         \"<table><summary></summary></table>\",\n         \"<table><summary></table>\",\n         \"<SUMMARY />\",\n         \"<SUMMARY></SUMMARY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_summary_pattern\"},\n    {input: \"<summary icon=\\\"x\\\">\",\n     acceptable: [\n         \"<summary></summary>\",\n         \"<summary>\",\n         \"<summary/>\",\n         \"<summary />\",\n         \"<table><summary></summary></table>\",\n         \"<table><summary></table>\",\n         \"<SUMMARY />\",\n         \"<SUMMARY></SUMMARY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_summary_icon\"},\n    {input: \"<summary select=\\\"x\\\">\",\n     acceptable: [\n         \"<summary></summary>\",\n         \"<summary>\",\n         \"<summary/>\",\n         \"<summary />\",\n         \"<table><summary></summary></table>\",\n         \"<table><summary></table>\",\n         \"<SUMMARY />\",\n         \"<SUMMARY></SUMMARY>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_summary_select\"},\n    {input: \"<menu></menu>\",\n     acceptable: [\n         \"<menu>\",\n         \"<menu />\",\n         \"<menu></menu>\",\n         \"<table><menu></menu></table>\",\n         \"<MENU />\",\n         \"<MENU></MENU>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menu_plain\"},\n    {input: \"<menu><script>alert()</script></menu>\",\n     acceptable: [\n         \"<menu>\",\n         \"<menu />\",\n         \"<menu></menu>\",\n         \"<table><menu></menu></table>\",\n         \"<MENU />\",\n         \"<MENU></MENU>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><menu><td></td></menu></table>\",\n         \"<table><menu></menu><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_menu_scriptinside\"},\n    {input: \"<menu media=\\\"x\\\">\",\n     acceptable: [\n         \"<menu></menu>\",\n         \"<menu>\",\n         \"<menu/>\",\n         \"<menu />\",\n         \"<table><menu></menu></table>\",\n         \"<table><menu></table>\",\n         \"<MENU />\",\n         \"<MENU></MENU>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menu_media\"},\n    {input: \"<menu nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<menu></menu>\",\n         \"<menu>\",\n         \"<menu/>\",\n         \"<menu />\",\n         \"<table><menu></menu></table>\",\n         \"<table><menu></table>\",\n         \"<MENU />\",\n         \"<MENU></MENU>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menu_nonce\"},\n    {input: \"<menu srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<menu></menu>\",\n         \"<menu>\",\n         \"<menu/>\",\n         \"<menu />\",\n         \"<table><menu></menu></table>\",\n         \"<table><menu></table>\",\n         \"<MENU />\",\n         \"<MENU></MENU>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menu_srcset\"},\n    {input: \"<menu srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<menu></menu>\",\n         \"<menu>\",\n         \"<menu/>\",\n         \"<menu />\",\n         \"<table><menu></menu></table>\",\n         \"<table><menu></table>\",\n         \"<MENU />\",\n         \"<MENU></MENU>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menu_srcdoc\"},\n    {input: \"<menu poster=\\\"x\\\">\",\n     acceptable: [\n         \"<menu></menu>\",\n         \"<menu>\",\n         \"<menu/>\",\n         \"<menu />\",\n         \"<table><menu></menu></table>\",\n         \"<table><menu></table>\",\n         \"<MENU />\",\n         \"<MENU></MENU>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menu_poster\"},\n    {input: \"<menu autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<menu></menu>\",\n         \"<menu>\",\n         \"<menu/>\",\n         \"<menu />\",\n         \"<table><menu></menu></table>\",\n         \"<table><menu></table>\",\n         \"<MENU />\",\n         \"<MENU></MENU>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menu_autoplay\"},\n    {input: \"<menu controls=\\\"x\\\">\",\n     acceptable: [\n         \"<menu></menu>\",\n         \"<menu>\",\n         \"<menu/>\",\n         \"<menu />\",\n         \"<table><menu></menu></table>\",\n         \"<table><menu></table>\",\n         \"<MENU />\",\n         \"<MENU></MENU>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menu_controls\"},\n    {input: \"<menu formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<menu></menu>\",\n         \"<menu>\",\n         \"<menu/>\",\n         \"<menu />\",\n         \"<table><menu></menu></table>\",\n         \"<table><menu></table>\",\n         \"<MENU />\",\n         \"<MENU></MENU>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menu_formaction\"},\n    {input: \"<menu formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<menu></menu>\",\n         \"<menu>\",\n         \"<menu/>\",\n         \"<menu />\",\n         \"<table><menu></menu></table>\",\n         \"<table><menu></table>\",\n         \"<MENU />\",\n         \"<MENU></MENU>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menu_formmethod\"},\n    {input: \"<menu pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<menu></menu>\",\n         \"<menu>\",\n         \"<menu/>\",\n         \"<menu />\",\n         \"<table><menu></menu></table>\",\n         \"<table><menu></table>\",\n         \"<MENU />\",\n         \"<MENU></MENU>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menu_pattern\"},\n    {input: \"<menu icon=\\\"x\\\">\",\n     acceptable: [\n         \"<menu></menu>\",\n         \"<menu>\",\n         \"<menu/>\",\n         \"<menu />\",\n         \"<table><menu></menu></table>\",\n         \"<table><menu></table>\",\n         \"<MENU />\",\n         \"<MENU></MENU>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menu_icon\"},\n    {input: \"<menu select=\\\"x\\\">\",\n     acceptable: [\n         \"<menu></menu>\",\n         \"<menu>\",\n         \"<menu/>\",\n         \"<menu />\",\n         \"<table><menu></menu></table>\",\n         \"<table><menu></table>\",\n         \"<MENU />\",\n         \"<MENU></MENU>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menu_select\"},\n    {input: \"<menuitem></menuitem>\",\n     acceptable: [\n         \"<menuitem>\",\n         \"<menuitem />\",\n         \"<menuitem></menuitem>\",\n         \"<table><menuitem></menuitem></table>\",\n         \"<MENUITEM />\",\n         \"<MENUITEM></MENUITEM>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menuitem_plain\"},\n    {input: \"<menuitem><script>alert()</script></menuitem>\",\n     acceptable: [\n         \"<menuitem>\",\n         \"<menuitem />\",\n         \"<menuitem></menuitem>\",\n         \"<table><menuitem></menuitem></table>\",\n         \"<MENUITEM />\",\n         \"<MENUITEM></MENUITEM>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><menuitem><td></td></menuitem></table>\",\n         \"<table><menuitem></menuitem><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_menuitem_scriptinside\"},\n    {input: \"<menuitem icon=\\\"javascript:xss\\\">\",\n     acceptable: [\n         \"<menuitem icon=\\\"about:invalid#zCSafez\\\"></menuitem>\",\n         \"<menuitem icon=\\\"about:invalid#zCSafez\\\">\",\n         \"<menuitem icon=\\\"about:invalid#zGoSafez\\\"></menuitem>\",\n         \"<menuitem icon=\\\"about:invalid#zGoSafez\\\"/>\",\n         \"<menuitem icon=\\\"javascript:void(0);\\\"></menuitem>\",\n         \"<menuitem icon=\\\"javascript:void(0);\\\">\",\n         \"<menuitem></menuitem>\",\n         \"<menuitem>\",\n         \"<menuitem/>\",\n         \"<menuitem />\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menuitem_icon\"},\n    {input: \"<menuitem media=\\\"x\\\">\",\n     acceptable: [\n         \"<menuitem></menuitem>\",\n         \"<menuitem>\",\n         \"<menuitem/>\",\n         \"<menuitem />\",\n         \"<table><menuitem></menuitem></table>\",\n         \"<table><menuitem></table>\",\n         \"<MENUITEM />\",\n         \"<MENUITEM></MENUITEM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menuitem_media\"},\n    {input: \"<menuitem nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<menuitem></menuitem>\",\n         \"<menuitem>\",\n         \"<menuitem/>\",\n         \"<menuitem />\",\n         \"<table><menuitem></menuitem></table>\",\n         \"<table><menuitem></table>\",\n         \"<MENUITEM />\",\n         \"<MENUITEM></MENUITEM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menuitem_nonce\"},\n    {input: \"<menuitem srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<menuitem></menuitem>\",\n         \"<menuitem>\",\n         \"<menuitem/>\",\n         \"<menuitem />\",\n         \"<table><menuitem></menuitem></table>\",\n         \"<table><menuitem></table>\",\n         \"<MENUITEM />\",\n         \"<MENUITEM></MENUITEM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menuitem_srcset\"},\n    {input: \"<menuitem srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<menuitem></menuitem>\",\n         \"<menuitem>\",\n         \"<menuitem/>\",\n         \"<menuitem />\",\n         \"<table><menuitem></menuitem></table>\",\n         \"<table><menuitem></table>\",\n         \"<MENUITEM />\",\n         \"<MENUITEM></MENUITEM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menuitem_srcdoc\"},\n    {input: \"<menuitem poster=\\\"x\\\">\",\n     acceptable: [\n         \"<menuitem></menuitem>\",\n         \"<menuitem>\",\n         \"<menuitem/>\",\n         \"<menuitem />\",\n         \"<table><menuitem></menuitem></table>\",\n         \"<table><menuitem></table>\",\n         \"<MENUITEM />\",\n         \"<MENUITEM></MENUITEM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menuitem_poster\"},\n    {input: \"<menuitem autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<menuitem></menuitem>\",\n         \"<menuitem>\",\n         \"<menuitem/>\",\n         \"<menuitem />\",\n         \"<table><menuitem></menuitem></table>\",\n         \"<table><menuitem></table>\",\n         \"<MENUITEM />\",\n         \"<MENUITEM></MENUITEM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menuitem_autoplay\"},\n    {input: \"<menuitem controls=\\\"x\\\">\",\n     acceptable: [\n         \"<menuitem></menuitem>\",\n         \"<menuitem>\",\n         \"<menuitem/>\",\n         \"<menuitem />\",\n         \"<table><menuitem></menuitem></table>\",\n         \"<table><menuitem></table>\",\n         \"<MENUITEM />\",\n         \"<MENUITEM></MENUITEM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menuitem_controls\"},\n    {input: \"<menuitem formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<menuitem></menuitem>\",\n         \"<menuitem>\",\n         \"<menuitem/>\",\n         \"<menuitem />\",\n         \"<table><menuitem></menuitem></table>\",\n         \"<table><menuitem></table>\",\n         \"<MENUITEM />\",\n         \"<MENUITEM></MENUITEM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menuitem_formaction\"},\n    {input: \"<menuitem formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<menuitem></menuitem>\",\n         \"<menuitem>\",\n         \"<menuitem/>\",\n         \"<menuitem />\",\n         \"<table><menuitem></menuitem></table>\",\n         \"<table><menuitem></table>\",\n         \"<MENUITEM />\",\n         \"<MENUITEM></MENUITEM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menuitem_formmethod\"},\n    {input: \"<menuitem pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<menuitem></menuitem>\",\n         \"<menuitem>\",\n         \"<menuitem/>\",\n         \"<menuitem />\",\n         \"<table><menuitem></menuitem></table>\",\n         \"<table><menuitem></table>\",\n         \"<MENUITEM />\",\n         \"<MENUITEM></MENUITEM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menuitem_pattern\"},\n    {input: \"<menuitem select=\\\"x\\\">\",\n     acceptable: [\n         \"<menuitem></menuitem>\",\n         \"<menuitem>\",\n         \"<menuitem/>\",\n         \"<menuitem />\",\n         \"<table><menuitem></menuitem></table>\",\n         \"<table><menuitem></table>\",\n         \"<MENUITEM />\",\n         \"<MENUITEM></MENUITEM>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_menuitem_select\"},\n    {input: \"<dialog></dialog>\",\n     acceptable: [\n         \"<dialog>\",\n         \"<dialog />\",\n         \"<dialog></dialog>\",\n         \"<table><dialog></dialog></table>\",\n         \"<DIALOG />\",\n         \"<DIALOG></DIALOG>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dialog_plain\"},\n    {input: \"<dialog><script>alert()</script></dialog>\",\n     acceptable: [\n         \"<dialog>\",\n         \"<dialog />\",\n         \"<dialog></dialog>\",\n         \"<table><dialog></dialog></table>\",\n         \"<DIALOG />\",\n         \"<DIALOG></DIALOG>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><dialog><td></td></dialog></table>\",\n         \"<table><dialog></dialog><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_dialog_scriptinside\"},\n    {input: \"<dialog media=\\\"x\\\">\",\n     acceptable: [\n         \"<dialog></dialog>\",\n         \"<dialog>\",\n         \"<dialog/>\",\n         \"<dialog />\",\n         \"<table><dialog></dialog></table>\",\n         \"<table><dialog></table>\",\n         \"<DIALOG />\",\n         \"<DIALOG></DIALOG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dialog_media\"},\n    {input: \"<dialog nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<dialog></dialog>\",\n         \"<dialog>\",\n         \"<dialog/>\",\n         \"<dialog />\",\n         \"<table><dialog></dialog></table>\",\n         \"<table><dialog></table>\",\n         \"<DIALOG />\",\n         \"<DIALOG></DIALOG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dialog_nonce\"},\n    {input: \"<dialog srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<dialog></dialog>\",\n         \"<dialog>\",\n         \"<dialog/>\",\n         \"<dialog />\",\n         \"<table><dialog></dialog></table>\",\n         \"<table><dialog></table>\",\n         \"<DIALOG />\",\n         \"<DIALOG></DIALOG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dialog_srcset\"},\n    {input: \"<dialog srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<dialog></dialog>\",\n         \"<dialog>\",\n         \"<dialog/>\",\n         \"<dialog />\",\n         \"<table><dialog></dialog></table>\",\n         \"<table><dialog></table>\",\n         \"<DIALOG />\",\n         \"<DIALOG></DIALOG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dialog_srcdoc\"},\n    {input: \"<dialog poster=\\\"x\\\">\",\n     acceptable: [\n         \"<dialog></dialog>\",\n         \"<dialog>\",\n         \"<dialog/>\",\n         \"<dialog />\",\n         \"<table><dialog></dialog></table>\",\n         \"<table><dialog></table>\",\n         \"<DIALOG />\",\n         \"<DIALOG></DIALOG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dialog_poster\"},\n    {input: \"<dialog autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<dialog></dialog>\",\n         \"<dialog>\",\n         \"<dialog/>\",\n         \"<dialog />\",\n         \"<table><dialog></dialog></table>\",\n         \"<table><dialog></table>\",\n         \"<DIALOG />\",\n         \"<DIALOG></DIALOG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dialog_autoplay\"},\n    {input: \"<dialog controls=\\\"x\\\">\",\n     acceptable: [\n         \"<dialog></dialog>\",\n         \"<dialog>\",\n         \"<dialog/>\",\n         \"<dialog />\",\n         \"<table><dialog></dialog></table>\",\n         \"<table><dialog></table>\",\n         \"<DIALOG />\",\n         \"<DIALOG></DIALOG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dialog_controls\"},\n    {input: \"<dialog formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<dialog></dialog>\",\n         \"<dialog>\",\n         \"<dialog/>\",\n         \"<dialog />\",\n         \"<table><dialog></dialog></table>\",\n         \"<table><dialog></table>\",\n         \"<DIALOG />\",\n         \"<DIALOG></DIALOG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dialog_formaction\"},\n    {input: \"<dialog formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<dialog></dialog>\",\n         \"<dialog>\",\n         \"<dialog/>\",\n         \"<dialog />\",\n         \"<table><dialog></dialog></table>\",\n         \"<table><dialog></table>\",\n         \"<DIALOG />\",\n         \"<DIALOG></DIALOG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dialog_formmethod\"},\n    {input: \"<dialog pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<dialog></dialog>\",\n         \"<dialog>\",\n         \"<dialog/>\",\n         \"<dialog />\",\n         \"<table><dialog></dialog></table>\",\n         \"<table><dialog></table>\",\n         \"<DIALOG />\",\n         \"<DIALOG></DIALOG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dialog_pattern\"},\n    {input: \"<dialog icon=\\\"x\\\">\",\n     acceptable: [\n         \"<dialog></dialog>\",\n         \"<dialog>\",\n         \"<dialog/>\",\n         \"<dialog />\",\n         \"<table><dialog></dialog></table>\",\n         \"<table><dialog></table>\",\n         \"<DIALOG />\",\n         \"<DIALOG></DIALOG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dialog_icon\"},\n    {input: \"<dialog select=\\\"x\\\">\",\n     acceptable: [\n         \"<dialog></dialog>\",\n         \"<dialog>\",\n         \"<dialog/>\",\n         \"<dialog />\",\n         \"<table><dialog></dialog></table>\",\n         \"<table><dialog></table>\",\n         \"<DIALOG />\",\n         \"<DIALOG></DIALOG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_dialog_select\"},\n    {input: \"<script></script>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_script_plain\"},\n    {input: \"<script><script>alert()</script></script>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_script_scriptinside\"},\n    {input: \"<script media=\\\"x\\\">\",\n     acceptable: [\n         \"<script></script>\",\n         \"<script>\",\n         \"<script/>\",\n         \"<script />\",\n         \"<table><script></script></table>\",\n         \"<table><script></table>\",\n         \"<SCRIPT />\",\n         \"<SCRIPT></SCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_script_media\"},\n    {input: \"<script srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<script></script>\",\n         \"<script>\",\n         \"<script/>\",\n         \"<script />\",\n         \"<table><script></script></table>\",\n         \"<table><script></table>\",\n         \"<SCRIPT />\",\n         \"<SCRIPT></SCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_script_srcset\"},\n    {input: \"<script srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<script></script>\",\n         \"<script>\",\n         \"<script/>\",\n         \"<script />\",\n         \"<table><script></script></table>\",\n         \"<table><script></table>\",\n         \"<SCRIPT />\",\n         \"<SCRIPT></SCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_script_srcdoc\"},\n    {input: \"<script poster=\\\"x\\\">\",\n     acceptable: [\n         \"<script></script>\",\n         \"<script>\",\n         \"<script/>\",\n         \"<script />\",\n         \"<table><script></script></table>\",\n         \"<table><script></table>\",\n         \"<SCRIPT />\",\n         \"<SCRIPT></SCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_script_poster\"},\n    {input: \"<script autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<script></script>\",\n         \"<script>\",\n         \"<script/>\",\n         \"<script />\",\n         \"<table><script></script></table>\",\n         \"<table><script></table>\",\n         \"<SCRIPT />\",\n         \"<SCRIPT></SCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_script_autoplay\"},\n    {input: \"<script controls=\\\"x\\\">\",\n     acceptable: [\n         \"<script></script>\",\n         \"<script>\",\n         \"<script/>\",\n         \"<script />\",\n         \"<table><script></script></table>\",\n         \"<table><script></table>\",\n         \"<SCRIPT />\",\n         \"<SCRIPT></SCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_script_controls\"},\n    {input: \"<script formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<script></script>\",\n         \"<script>\",\n         \"<script/>\",\n         \"<script />\",\n         \"<table><script></script></table>\",\n         \"<table><script></table>\",\n         \"<SCRIPT />\",\n         \"<SCRIPT></SCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_script_formaction\"},\n    {input: \"<script formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<script></script>\",\n         \"<script>\",\n         \"<script/>\",\n         \"<script />\",\n         \"<table><script></script></table>\",\n         \"<table><script></table>\",\n         \"<SCRIPT />\",\n         \"<SCRIPT></SCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_script_formmethod\"},\n    {input: \"<script pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<script></script>\",\n         \"<script>\",\n         \"<script/>\",\n         \"<script />\",\n         \"<table><script></script></table>\",\n         \"<table><script></table>\",\n         \"<SCRIPT />\",\n         \"<SCRIPT></SCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_script_pattern\"},\n    {input: \"<script icon=\\\"x\\\">\",\n     acceptable: [\n         \"<script></script>\",\n         \"<script>\",\n         \"<script/>\",\n         \"<script />\",\n         \"<table><script></script></table>\",\n         \"<table><script></table>\",\n         \"<SCRIPT />\",\n         \"<SCRIPT></SCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_script_icon\"},\n    {input: \"<script select=\\\"x\\\">\",\n     acceptable: [\n         \"<script></script>\",\n         \"<script>\",\n         \"<script/>\",\n         \"<script />\",\n         \"<table><script></script></table>\",\n         \"<table><script></table>\",\n         \"<SCRIPT />\",\n         \"<SCRIPT></SCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_script_select\"},\n    {input: \"<noscript media=\\\"x\\\">\",\n     acceptable: [\n         \"<noscript></noscript>\",\n         \"<noscript>\",\n         \"<noscript/>\",\n         \"<noscript />\",\n         \"<table><noscript></noscript></table>\",\n         \"<table><noscript></table>\",\n         \"<NOSCRIPT />\",\n         \"<NOSCRIPT></NOSCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_noscript_media\"},\n    {input: \"<noscript nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<noscript></noscript>\",\n         \"<noscript>\",\n         \"<noscript/>\",\n         \"<noscript />\",\n         \"<table><noscript></noscript></table>\",\n         \"<table><noscript></table>\",\n         \"<NOSCRIPT />\",\n         \"<NOSCRIPT></NOSCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_noscript_nonce\"},\n    {input: \"<noscript srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<noscript></noscript>\",\n         \"<noscript>\",\n         \"<noscript/>\",\n         \"<noscript />\",\n         \"<table><noscript></noscript></table>\",\n         \"<table><noscript></table>\",\n         \"<NOSCRIPT />\",\n         \"<NOSCRIPT></NOSCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_noscript_srcset\"},\n    {input: \"<noscript srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<noscript></noscript>\",\n         \"<noscript>\",\n         \"<noscript/>\",\n         \"<noscript />\",\n         \"<table><noscript></noscript></table>\",\n         \"<table><noscript></table>\",\n         \"<NOSCRIPT />\",\n         \"<NOSCRIPT></NOSCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_noscript_srcdoc\"},\n    {input: \"<noscript poster=\\\"x\\\">\",\n     acceptable: [\n         \"<noscript></noscript>\",\n         \"<noscript>\",\n         \"<noscript/>\",\n         \"<noscript />\",\n         \"<table><noscript></noscript></table>\",\n         \"<table><noscript></table>\",\n         \"<NOSCRIPT />\",\n         \"<NOSCRIPT></NOSCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_noscript_poster\"},\n    {input: \"<noscript autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<noscript></noscript>\",\n         \"<noscript>\",\n         \"<noscript/>\",\n         \"<noscript />\",\n         \"<table><noscript></noscript></table>\",\n         \"<table><noscript></table>\",\n         \"<NOSCRIPT />\",\n         \"<NOSCRIPT></NOSCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_noscript_autoplay\"},\n    {input: \"<noscript controls=\\\"x\\\">\",\n     acceptable: [\n         \"<noscript></noscript>\",\n         \"<noscript>\",\n         \"<noscript/>\",\n         \"<noscript />\",\n         \"<table><noscript></noscript></table>\",\n         \"<table><noscript></table>\",\n         \"<NOSCRIPT />\",\n         \"<NOSCRIPT></NOSCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_noscript_controls\"},\n    {input: \"<noscript formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<noscript></noscript>\",\n         \"<noscript>\",\n         \"<noscript/>\",\n         \"<noscript />\",\n         \"<table><noscript></noscript></table>\",\n         \"<table><noscript></table>\",\n         \"<NOSCRIPT />\",\n         \"<NOSCRIPT></NOSCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_noscript_formaction\"},\n    {input: \"<noscript formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<noscript></noscript>\",\n         \"<noscript>\",\n         \"<noscript/>\",\n         \"<noscript />\",\n         \"<table><noscript></noscript></table>\",\n         \"<table><noscript></table>\",\n         \"<NOSCRIPT />\",\n         \"<NOSCRIPT></NOSCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_noscript_formmethod\"},\n    {input: \"<noscript pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<noscript></noscript>\",\n         \"<noscript>\",\n         \"<noscript/>\",\n         \"<noscript />\",\n         \"<table><noscript></noscript></table>\",\n         \"<table><noscript></table>\",\n         \"<NOSCRIPT />\",\n         \"<NOSCRIPT></NOSCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_noscript_pattern\"},\n    {input: \"<noscript icon=\\\"x\\\">\",\n     acceptable: [\n         \"<noscript></noscript>\",\n         \"<noscript>\",\n         \"<noscript/>\",\n         \"<noscript />\",\n         \"<table><noscript></noscript></table>\",\n         \"<table><noscript></table>\",\n         \"<NOSCRIPT />\",\n         \"<NOSCRIPT></NOSCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_noscript_icon\"},\n    {input: \"<noscript select=\\\"x\\\">\",\n     acceptable: [\n         \"<noscript></noscript>\",\n         \"<noscript>\",\n         \"<noscript/>\",\n         \"<noscript />\",\n         \"<table><noscript></noscript></table>\",\n         \"<table><noscript></table>\",\n         \"<NOSCRIPT />\",\n         \"<NOSCRIPT></NOSCRIPT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_noscript_select\"},\n    {input: \"<template></template>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_template_plain\"},\n    {input: \"<template><script>alert()</script></template>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_template_scriptinside\"},\n    {input: \"<template media=\\\"x\\\">\",\n     acceptable: [\n         \"<template></template>\",\n         \"<template>\",\n         \"<template/>\",\n         \"<template />\",\n         \"<table><template></template></table>\",\n         \"<table><template></table>\",\n         \"<TEMPLATE />\",\n         \"<TEMPLATE></TEMPLATE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_template_media\"},\n    {input: \"<template nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<template></template>\",\n         \"<template>\",\n         \"<template/>\",\n         \"<template />\",\n         \"<table><template></template></table>\",\n         \"<table><template></table>\",\n         \"<TEMPLATE />\",\n         \"<TEMPLATE></TEMPLATE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_template_nonce\"},\n    {input: \"<template srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<template></template>\",\n         \"<template>\",\n         \"<template/>\",\n         \"<template />\",\n         \"<table><template></template></table>\",\n         \"<table><template></table>\",\n         \"<TEMPLATE />\",\n         \"<TEMPLATE></TEMPLATE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_template_srcset\"},\n    {input: \"<template srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<template></template>\",\n         \"<template>\",\n         \"<template/>\",\n         \"<template />\",\n         \"<table><template></template></table>\",\n         \"<table><template></table>\",\n         \"<TEMPLATE />\",\n         \"<TEMPLATE></TEMPLATE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_template_srcdoc\"},\n    {input: \"<template poster=\\\"x\\\">\",\n     acceptable: [\n         \"<template></template>\",\n         \"<template>\",\n         \"<template/>\",\n         \"<template />\",\n         \"<table><template></template></table>\",\n         \"<table><template></table>\",\n         \"<TEMPLATE />\",\n         \"<TEMPLATE></TEMPLATE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_template_poster\"},\n    {input: \"<template autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<template></template>\",\n         \"<template>\",\n         \"<template/>\",\n         \"<template />\",\n         \"<table><template></template></table>\",\n         \"<table><template></table>\",\n         \"<TEMPLATE />\",\n         \"<TEMPLATE></TEMPLATE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_template_autoplay\"},\n    {input: \"<template controls=\\\"x\\\">\",\n     acceptable: [\n         \"<template></template>\",\n         \"<template>\",\n         \"<template/>\",\n         \"<template />\",\n         \"<table><template></template></table>\",\n         \"<table><template></table>\",\n         \"<TEMPLATE />\",\n         \"<TEMPLATE></TEMPLATE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_template_controls\"},\n    {input: \"<template formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<template></template>\",\n         \"<template>\",\n         \"<template/>\",\n         \"<template />\",\n         \"<table><template></template></table>\",\n         \"<table><template></table>\",\n         \"<TEMPLATE />\",\n         \"<TEMPLATE></TEMPLATE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_template_formaction\"},\n    {input: \"<template formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<template></template>\",\n         \"<template>\",\n         \"<template/>\",\n         \"<template />\",\n         \"<table><template></template></table>\",\n         \"<table><template></table>\",\n         \"<TEMPLATE />\",\n         \"<TEMPLATE></TEMPLATE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_template_formmethod\"},\n    {input: \"<template pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<template></template>\",\n         \"<template>\",\n         \"<template/>\",\n         \"<template />\",\n         \"<table><template></template></table>\",\n         \"<table><template></table>\",\n         \"<TEMPLATE />\",\n         \"<TEMPLATE></TEMPLATE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_template_pattern\"},\n    {input: \"<template icon=\\\"x\\\">\",\n     acceptable: [\n         \"<template></template>\",\n         \"<template>\",\n         \"<template/>\",\n         \"<template />\",\n         \"<table><template></template></table>\",\n         \"<table><template></table>\",\n         \"<TEMPLATE />\",\n         \"<TEMPLATE></TEMPLATE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_template_icon\"},\n    {input: \"<template select=\\\"x\\\">\",\n     acceptable: [\n         \"<template></template>\",\n         \"<template>\",\n         \"<template/>\",\n         \"<template />\",\n         \"<table><template></template></table>\",\n         \"<table><template></table>\",\n         \"<TEMPLATE />\",\n         \"<TEMPLATE></TEMPLATE>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_template_select\"},\n    {input: \"<slot></slot>\",\n     acceptable: [\n         \"<slot>\",\n         \"<slot />\",\n         \"<slot></slot>\",\n         \"<table><slot></slot></table>\",\n         \"<SLOT />\",\n         \"<SLOT></SLOT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_slot_plain\"},\n    {input: \"<slot><script>alert()</script></slot>\",\n     acceptable: [\n         \"<slot>\",\n         \"<slot />\",\n         \"<slot></slot>\",\n         \"<table><slot></slot></table>\",\n         \"<SLOT />\",\n         \"<SLOT></SLOT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><slot><td></td></slot></table>\",\n         \"<table><slot></slot><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_slot_scriptinside\"},\n    {input: \"<slot media=\\\"x\\\">\",\n     acceptable: [\n         \"<slot></slot>\",\n         \"<slot>\",\n         \"<slot/>\",\n         \"<slot />\",\n         \"<table><slot></slot></table>\",\n         \"<table><slot></table>\",\n         \"<SLOT />\",\n         \"<SLOT></SLOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_slot_media\"},\n    {input: \"<slot nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<slot></slot>\",\n         \"<slot>\",\n         \"<slot/>\",\n         \"<slot />\",\n         \"<table><slot></slot></table>\",\n         \"<table><slot></table>\",\n         \"<SLOT />\",\n         \"<SLOT></SLOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_slot_nonce\"},\n    {input: \"<slot srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<slot></slot>\",\n         \"<slot>\",\n         \"<slot/>\",\n         \"<slot />\",\n         \"<table><slot></slot></table>\",\n         \"<table><slot></table>\",\n         \"<SLOT />\",\n         \"<SLOT></SLOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_slot_srcset\"},\n    {input: \"<slot srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<slot></slot>\",\n         \"<slot>\",\n         \"<slot/>\",\n         \"<slot />\",\n         \"<table><slot></slot></table>\",\n         \"<table><slot></table>\",\n         \"<SLOT />\",\n         \"<SLOT></SLOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_slot_srcdoc\"},\n    {input: \"<slot poster=\\\"x\\\">\",\n     acceptable: [\n         \"<slot></slot>\",\n         \"<slot>\",\n         \"<slot/>\",\n         \"<slot />\",\n         \"<table><slot></slot></table>\",\n         \"<table><slot></table>\",\n         \"<SLOT />\",\n         \"<SLOT></SLOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_slot_poster\"},\n    {input: \"<slot autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<slot></slot>\",\n         \"<slot>\",\n         \"<slot/>\",\n         \"<slot />\",\n         \"<table><slot></slot></table>\",\n         \"<table><slot></table>\",\n         \"<SLOT />\",\n         \"<SLOT></SLOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_slot_autoplay\"},\n    {input: \"<slot controls=\\\"x\\\">\",\n     acceptable: [\n         \"<slot></slot>\",\n         \"<slot>\",\n         \"<slot/>\",\n         \"<slot />\",\n         \"<table><slot></slot></table>\",\n         \"<table><slot></table>\",\n         \"<SLOT />\",\n         \"<SLOT></SLOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_slot_controls\"},\n    {input: \"<slot formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<slot></slot>\",\n         \"<slot>\",\n         \"<slot/>\",\n         \"<slot />\",\n         \"<table><slot></slot></table>\",\n         \"<table><slot></table>\",\n         \"<SLOT />\",\n         \"<SLOT></SLOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_slot_formaction\"},\n    {input: \"<slot formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<slot></slot>\",\n         \"<slot>\",\n         \"<slot/>\",\n         \"<slot />\",\n         \"<table><slot></slot></table>\",\n         \"<table><slot></table>\",\n         \"<SLOT />\",\n         \"<SLOT></SLOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_slot_formmethod\"},\n    {input: \"<slot pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<slot></slot>\",\n         \"<slot>\",\n         \"<slot/>\",\n         \"<slot />\",\n         \"<table><slot></slot></table>\",\n         \"<table><slot></table>\",\n         \"<SLOT />\",\n         \"<SLOT></SLOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_slot_pattern\"},\n    {input: \"<slot icon=\\\"x\\\">\",\n     acceptable: [\n         \"<slot></slot>\",\n         \"<slot>\",\n         \"<slot/>\",\n         \"<slot />\",\n         \"<table><slot></slot></table>\",\n         \"<table><slot></table>\",\n         \"<SLOT />\",\n         \"<SLOT></SLOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_slot_icon\"},\n    {input: \"<slot select=\\\"x\\\">\",\n     acceptable: [\n         \"<slot></slot>\",\n         \"<slot>\",\n         \"<slot/>\",\n         \"<slot />\",\n         \"<table><slot></slot></table>\",\n         \"<table><slot></table>\",\n         \"<SLOT />\",\n         \"<SLOT></SLOT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_slot_select\"},\n    {input: \"<canvas></canvas>\",\n     acceptable: [\n         \"<canvas>\",\n         \"<canvas />\",\n         \"<canvas></canvas>\",\n         \"<table><canvas></canvas></table>\",\n         \"<CANVAS />\",\n         \"<CANVAS></CANVAS>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_canvas_plain\"},\n    {input: \"<canvas><script>alert()</script></canvas>\",\n     acceptable: [\n         \"<canvas>\",\n         \"<canvas />\",\n         \"<canvas></canvas>\",\n         \"<table><canvas></canvas></table>\",\n         \"<CANVAS />\",\n         \"<CANVAS></CANVAS>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><canvas><td></td></canvas></table>\",\n         \"<table><canvas></canvas><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_canvas_scriptinside\"},\n    {input: \"<canvas media=\\\"x\\\">\",\n     acceptable: [\n         \"<canvas></canvas>\",\n         \"<canvas>\",\n         \"<canvas/>\",\n         \"<canvas />\",\n         \"<table><canvas></canvas></table>\",\n         \"<table><canvas></table>\",\n         \"<CANVAS />\",\n         \"<CANVAS></CANVAS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_canvas_media\"},\n    {input: \"<canvas nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<canvas></canvas>\",\n         \"<canvas>\",\n         \"<canvas/>\",\n         \"<canvas />\",\n         \"<table><canvas></canvas></table>\",\n         \"<table><canvas></table>\",\n         \"<CANVAS />\",\n         \"<CANVAS></CANVAS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_canvas_nonce\"},\n    {input: \"<canvas srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<canvas></canvas>\",\n         \"<canvas>\",\n         \"<canvas/>\",\n         \"<canvas />\",\n         \"<table><canvas></canvas></table>\",\n         \"<table><canvas></table>\",\n         \"<CANVAS />\",\n         \"<CANVAS></CANVAS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_canvas_srcset\"},\n    {input: \"<canvas srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<canvas></canvas>\",\n         \"<canvas>\",\n         \"<canvas/>\",\n         \"<canvas />\",\n         \"<table><canvas></canvas></table>\",\n         \"<table><canvas></table>\",\n         \"<CANVAS />\",\n         \"<CANVAS></CANVAS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_canvas_srcdoc\"},\n    {input: \"<canvas poster=\\\"x\\\">\",\n     acceptable: [\n         \"<canvas></canvas>\",\n         \"<canvas>\",\n         \"<canvas/>\",\n         \"<canvas />\",\n         \"<table><canvas></canvas></table>\",\n         \"<table><canvas></table>\",\n         \"<CANVAS />\",\n         \"<CANVAS></CANVAS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_canvas_poster\"},\n    {input: \"<canvas autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<canvas></canvas>\",\n         \"<canvas>\",\n         \"<canvas/>\",\n         \"<canvas />\",\n         \"<table><canvas></canvas></table>\",\n         \"<table><canvas></table>\",\n         \"<CANVAS />\",\n         \"<CANVAS></CANVAS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_canvas_autoplay\"},\n    {input: \"<canvas controls=\\\"x\\\">\",\n     acceptable: [\n         \"<canvas></canvas>\",\n         \"<canvas>\",\n         \"<canvas/>\",\n         \"<canvas />\",\n         \"<table><canvas></canvas></table>\",\n         \"<table><canvas></table>\",\n         \"<CANVAS />\",\n         \"<CANVAS></CANVAS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_canvas_controls\"},\n    {input: \"<canvas formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<canvas></canvas>\",\n         \"<canvas>\",\n         \"<canvas/>\",\n         \"<canvas />\",\n         \"<table><canvas></canvas></table>\",\n         \"<table><canvas></table>\",\n         \"<CANVAS />\",\n         \"<CANVAS></CANVAS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_canvas_formaction\"},\n    {input: \"<canvas formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<canvas></canvas>\",\n         \"<canvas>\",\n         \"<canvas/>\",\n         \"<canvas />\",\n         \"<table><canvas></canvas></table>\",\n         \"<table><canvas></table>\",\n         \"<CANVAS />\",\n         \"<CANVAS></CANVAS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_canvas_formmethod\"},\n    {input: \"<canvas pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<canvas></canvas>\",\n         \"<canvas>\",\n         \"<canvas/>\",\n         \"<canvas />\",\n         \"<table><canvas></canvas></table>\",\n         \"<table><canvas></table>\",\n         \"<CANVAS />\",\n         \"<CANVAS></CANVAS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_canvas_pattern\"},\n    {input: \"<canvas icon=\\\"x\\\">\",\n     acceptable: [\n         \"<canvas></canvas>\",\n         \"<canvas>\",\n         \"<canvas/>\",\n         \"<canvas />\",\n         \"<table><canvas></canvas></table>\",\n         \"<table><canvas></table>\",\n         \"<CANVAS />\",\n         \"<CANVAS></CANVAS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_canvas_icon\"},\n    {input: \"<canvas select=\\\"x\\\">\",\n     acceptable: [\n         \"<canvas></canvas>\",\n         \"<canvas>\",\n         \"<canvas/>\",\n         \"<canvas />\",\n         \"<table><canvas></canvas></table>\",\n         \"<table><canvas></table>\",\n         \"<CANVAS />\",\n         \"<CANVAS></CANVAS>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_canvas_select\"},\n    {input: \"<applet></applet>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_applet_plain\"},\n    {input: \"<applet><script>alert()</script></applet>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_applet_scriptinside\"},\n    {input: \"<applet media=\\\"x\\\">\",\n     acceptable: [\n         \"<applet></applet>\",\n         \"<applet>\",\n         \"<applet/>\",\n         \"<applet />\",\n         \"<table><applet></applet></table>\",\n         \"<table><applet></table>\",\n         \"<APPLET />\",\n         \"<APPLET></APPLET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_applet_media\"},\n    {input: \"<applet nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<applet></applet>\",\n         \"<applet>\",\n         \"<applet/>\",\n         \"<applet />\",\n         \"<table><applet></applet></table>\",\n         \"<table><applet></table>\",\n         \"<APPLET />\",\n         \"<APPLET></APPLET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_applet_nonce\"},\n    {input: \"<applet srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<applet></applet>\",\n         \"<applet>\",\n         \"<applet/>\",\n         \"<applet />\",\n         \"<table><applet></applet></table>\",\n         \"<table><applet></table>\",\n         \"<APPLET />\",\n         \"<APPLET></APPLET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_applet_srcset\"},\n    {input: \"<applet srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<applet></applet>\",\n         \"<applet>\",\n         \"<applet/>\",\n         \"<applet />\",\n         \"<table><applet></applet></table>\",\n         \"<table><applet></table>\",\n         \"<APPLET />\",\n         \"<APPLET></APPLET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_applet_srcdoc\"},\n    {input: \"<applet poster=\\\"x\\\">\",\n     acceptable: [\n         \"<applet></applet>\",\n         \"<applet>\",\n         \"<applet/>\",\n         \"<applet />\",\n         \"<table><applet></applet></table>\",\n         \"<table><applet></table>\",\n         \"<APPLET />\",\n         \"<APPLET></APPLET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_applet_poster\"},\n    {input: \"<applet autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<applet></applet>\",\n         \"<applet>\",\n         \"<applet/>\",\n         \"<applet />\",\n         \"<table><applet></applet></table>\",\n         \"<table><applet></table>\",\n         \"<APPLET />\",\n         \"<APPLET></APPLET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_applet_autoplay\"},\n    {input: \"<applet controls=\\\"x\\\">\",\n     acceptable: [\n         \"<applet></applet>\",\n         \"<applet>\",\n         \"<applet/>\",\n         \"<applet />\",\n         \"<table><applet></applet></table>\",\n         \"<table><applet></table>\",\n         \"<APPLET />\",\n         \"<APPLET></APPLET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_applet_controls\"},\n    {input: \"<applet formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<applet></applet>\",\n         \"<applet>\",\n         \"<applet/>\",\n         \"<applet />\",\n         \"<table><applet></applet></table>\",\n         \"<table><applet></table>\",\n         \"<APPLET />\",\n         \"<APPLET></APPLET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_applet_formaction\"},\n    {input: \"<applet formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<applet></applet>\",\n         \"<applet>\",\n         \"<applet/>\",\n         \"<applet />\",\n         \"<table><applet></applet></table>\",\n         \"<table><applet></table>\",\n         \"<APPLET />\",\n         \"<APPLET></APPLET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_applet_formmethod\"},\n    {input: \"<applet pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<applet></applet>\",\n         \"<applet>\",\n         \"<applet/>\",\n         \"<applet />\",\n         \"<table><applet></applet></table>\",\n         \"<table><applet></table>\",\n         \"<APPLET />\",\n         \"<APPLET></APPLET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_applet_pattern\"},\n    {input: \"<applet icon=\\\"x\\\">\",\n     acceptable: [\n         \"<applet></applet>\",\n         \"<applet>\",\n         \"<applet/>\",\n         \"<applet />\",\n         \"<table><applet></applet></table>\",\n         \"<table><applet></table>\",\n         \"<APPLET />\",\n         \"<APPLET></APPLET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_applet_icon\"},\n    {input: \"<applet select=\\\"x\\\">\",\n     acceptable: [\n         \"<applet></applet>\",\n         \"<applet>\",\n         \"<applet/>\",\n         \"<applet />\",\n         \"<table><applet></applet></table>\",\n         \"<table><applet></table>\",\n         \"<APPLET />\",\n         \"<APPLET></APPLET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_applet_select\"},\n    {input: \"<math></math>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_math_plain\"},\n    {input: \"<math><script>alert()</script></math>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_math_scriptinside\"},\n    {input: \"<math media=\\\"x\\\">\",\n     acceptable: [\n         \"<math></math>\",\n         \"<math>\",\n         \"<math/>\",\n         \"<math />\",\n         \"<table><math></math></table>\",\n         \"<table><math></table>\",\n         \"<MATH />\",\n         \"<MATH></MATH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_math_media\"},\n    {input: \"<math nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<math></math>\",\n         \"<math>\",\n         \"<math/>\",\n         \"<math />\",\n         \"<table><math></math></table>\",\n         \"<table><math></table>\",\n         \"<MATH />\",\n         \"<MATH></MATH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_math_nonce\"},\n    {input: \"<math srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<math></math>\",\n         \"<math>\",\n         \"<math/>\",\n         \"<math />\",\n         \"<table><math></math></table>\",\n         \"<table><math></table>\",\n         \"<MATH />\",\n         \"<MATH></MATH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_math_srcset\"},\n    {input: \"<math srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<math></math>\",\n         \"<math>\",\n         \"<math/>\",\n         \"<math />\",\n         \"<table><math></math></table>\",\n         \"<table><math></table>\",\n         \"<MATH />\",\n         \"<MATH></MATH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_math_srcdoc\"},\n    {input: \"<math poster=\\\"x\\\">\",\n     acceptable: [\n         \"<math></math>\",\n         \"<math>\",\n         \"<math/>\",\n         \"<math />\",\n         \"<table><math></math></table>\",\n         \"<table><math></table>\",\n         \"<MATH />\",\n         \"<MATH></MATH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_math_poster\"},\n    {input: \"<math autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<math></math>\",\n         \"<math>\",\n         \"<math/>\",\n         \"<math />\",\n         \"<table><math></math></table>\",\n         \"<table><math></table>\",\n         \"<MATH />\",\n         \"<MATH></MATH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_math_autoplay\"},\n    {input: \"<math controls=\\\"x\\\">\",\n     acceptable: [\n         \"<math></math>\",\n         \"<math>\",\n         \"<math/>\",\n         \"<math />\",\n         \"<table><math></math></table>\",\n         \"<table><math></table>\",\n         \"<MATH />\",\n         \"<MATH></MATH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_math_controls\"},\n    {input: \"<math formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<math></math>\",\n         \"<math>\",\n         \"<math/>\",\n         \"<math />\",\n         \"<table><math></math></table>\",\n         \"<table><math></table>\",\n         \"<MATH />\",\n         \"<MATH></MATH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_math_formaction\"},\n    {input: \"<math formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<math></math>\",\n         \"<math>\",\n         \"<math/>\",\n         \"<math />\",\n         \"<table><math></math></table>\",\n         \"<table><math></table>\",\n         \"<MATH />\",\n         \"<MATH></MATH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_math_formmethod\"},\n    {input: \"<math pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<math></math>\",\n         \"<math>\",\n         \"<math/>\",\n         \"<math />\",\n         \"<table><math></math></table>\",\n         \"<table><math></table>\",\n         \"<MATH />\",\n         \"<MATH></MATH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_math_pattern\"},\n    {input: \"<math icon=\\\"x\\\">\",\n     acceptable: [\n         \"<math></math>\",\n         \"<math>\",\n         \"<math/>\",\n         \"<math />\",\n         \"<table><math></math></table>\",\n         \"<table><math></table>\",\n         \"<MATH />\",\n         \"<MATH></MATH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_math_icon\"},\n    {input: \"<math select=\\\"x\\\">\",\n     acceptable: [\n         \"<math></math>\",\n         \"<math>\",\n         \"<math/>\",\n         \"<math />\",\n         \"<table><math></math></table>\",\n         \"<table><math></table>\",\n         \"<MATH />\",\n         \"<MATH></MATH>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_math_select\"},\n    {input: \"<svg></svg>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_svg_plain\"},\n    {input: \"<svg><script>alert()</script></svg>\",\n     acceptable: [\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_svg_scriptinside\"},\n    {input: \"<svg media=\\\"x\\\">\",\n     acceptable: [\n         \"<svg></svg>\",\n         \"<svg>\",\n         \"<svg/>\",\n         \"<svg />\",\n         \"<table><svg></svg></table>\",\n         \"<table><svg></table>\",\n         \"<SVG />\",\n         \"<SVG></SVG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_svg_media\"},\n    {input: \"<svg nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<svg></svg>\",\n         \"<svg>\",\n         \"<svg/>\",\n         \"<svg />\",\n         \"<table><svg></svg></table>\",\n         \"<table><svg></table>\",\n         \"<SVG />\",\n         \"<SVG></SVG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_svg_nonce\"},\n    {input: \"<svg srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<svg></svg>\",\n         \"<svg>\",\n         \"<svg/>\",\n         \"<svg />\",\n         \"<table><svg></svg></table>\",\n         \"<table><svg></table>\",\n         \"<SVG />\",\n         \"<SVG></SVG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_svg_srcset\"},\n    {input: \"<svg srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<svg></svg>\",\n         \"<svg>\",\n         \"<svg/>\",\n         \"<svg />\",\n         \"<table><svg></svg></table>\",\n         \"<table><svg></table>\",\n         \"<SVG />\",\n         \"<SVG></SVG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_svg_srcdoc\"},\n    {input: \"<svg poster=\\\"x\\\">\",\n     acceptable: [\n         \"<svg></svg>\",\n         \"<svg>\",\n         \"<svg/>\",\n         \"<svg />\",\n         \"<table><svg></svg></table>\",\n         \"<table><svg></table>\",\n         \"<SVG />\",\n         \"<SVG></SVG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_svg_poster\"},\n    {input: \"<svg autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<svg></svg>\",\n         \"<svg>\",\n         \"<svg/>\",\n         \"<svg />\",\n         \"<table><svg></svg></table>\",\n         \"<table><svg></table>\",\n         \"<SVG />\",\n         \"<SVG></SVG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_svg_autoplay\"},\n    {input: \"<svg controls=\\\"x\\\">\",\n     acceptable: [\n         \"<svg></svg>\",\n         \"<svg>\",\n         \"<svg/>\",\n         \"<svg />\",\n         \"<table><svg></svg></table>\",\n         \"<table><svg></table>\",\n         \"<SVG />\",\n         \"<SVG></SVG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_svg_controls\"},\n    {input: \"<svg formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<svg></svg>\",\n         \"<svg>\",\n         \"<svg/>\",\n         \"<svg />\",\n         \"<table><svg></svg></table>\",\n         \"<table><svg></table>\",\n         \"<SVG />\",\n         \"<SVG></SVG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_svg_formaction\"},\n    {input: \"<svg formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<svg></svg>\",\n         \"<svg>\",\n         \"<svg/>\",\n         \"<svg />\",\n         \"<table><svg></svg></table>\",\n         \"<table><svg></table>\",\n         \"<SVG />\",\n         \"<SVG></SVG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_svg_formmethod\"},\n    {input: \"<svg pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<svg></svg>\",\n         \"<svg>\",\n         \"<svg/>\",\n         \"<svg />\",\n         \"<table><svg></svg></table>\",\n         \"<table><svg></table>\",\n         \"<SVG />\",\n         \"<SVG></SVG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_svg_pattern\"},\n    {input: \"<svg icon=\\\"x\\\">\",\n     acceptable: [\n         \"<svg></svg>\",\n         \"<svg>\",\n         \"<svg/>\",\n         \"<svg />\",\n         \"<table><svg></svg></table>\",\n         \"<table><svg></table>\",\n         \"<SVG />\",\n         \"<SVG></SVG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_svg_icon\"},\n    {input: \"<svg select=\\\"x\\\">\",\n     acceptable: [\n         \"<svg></svg>\",\n         \"<svg>\",\n         \"<svg/>\",\n         \"<svg />\",\n         \"<table><svg></svg></table>\",\n         \"<table><svg></table>\",\n         \"<SVG />\",\n         \"<SVG></SVG>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_svg_select\"},\n    {input: \"<frameset></frameset>\",\n     acceptable: [\n         \"<frameset>\",\n         \"<frameset />\",\n         \"<frameset></frameset>\",\n         \"<table><frameset></frameset></table>\",\n         \"<FRAMESET />\",\n         \"<FRAMESET></FRAMESET>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frameset_plain\"},\n    {input: \"<frameset><script>alert()</script></frameset>\",\n     acceptable: [\n         \"<frameset>\",\n         \"<frameset />\",\n         \"<frameset></frameset>\",\n         \"<table><frameset></frameset></table>\",\n         \"<FRAMESET />\",\n         \"<FRAMESET></FRAMESET>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><frameset><td></td></frameset></table>\",\n         \"<table><frameset></frameset><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_frameset_scriptinside\"},\n    {input: \"<frameset media=\\\"x\\\">\",\n     acceptable: [\n         \"<frameset></frameset>\",\n         \"<frameset>\",\n         \"<frameset/>\",\n         \"<frameset />\",\n         \"<table><frameset></frameset></table>\",\n         \"<table><frameset></table>\",\n         \"<FRAMESET />\",\n         \"<FRAMESET></FRAMESET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frameset_media\"},\n    {input: \"<frameset nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<frameset></frameset>\",\n         \"<frameset>\",\n         \"<frameset/>\",\n         \"<frameset />\",\n         \"<table><frameset></frameset></table>\",\n         \"<table><frameset></table>\",\n         \"<FRAMESET />\",\n         \"<FRAMESET></FRAMESET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frameset_nonce\"},\n    {input: \"<frameset srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<frameset></frameset>\",\n         \"<frameset>\",\n         \"<frameset/>\",\n         \"<frameset />\",\n         \"<table><frameset></frameset></table>\",\n         \"<table><frameset></table>\",\n         \"<FRAMESET />\",\n         \"<FRAMESET></FRAMESET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frameset_srcset\"},\n    {input: \"<frameset srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<frameset></frameset>\",\n         \"<frameset>\",\n         \"<frameset/>\",\n         \"<frameset />\",\n         \"<table><frameset></frameset></table>\",\n         \"<table><frameset></table>\",\n         \"<FRAMESET />\",\n         \"<FRAMESET></FRAMESET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frameset_srcdoc\"},\n    {input: \"<frameset poster=\\\"x\\\">\",\n     acceptable: [\n         \"<frameset></frameset>\",\n         \"<frameset>\",\n         \"<frameset/>\",\n         \"<frameset />\",\n         \"<table><frameset></frameset></table>\",\n         \"<table><frameset></table>\",\n         \"<FRAMESET />\",\n         \"<FRAMESET></FRAMESET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frameset_poster\"},\n    {input: \"<frameset autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<frameset></frameset>\",\n         \"<frameset>\",\n         \"<frameset/>\",\n         \"<frameset />\",\n         \"<table><frameset></frameset></table>\",\n         \"<table><frameset></table>\",\n         \"<FRAMESET />\",\n         \"<FRAMESET></FRAMESET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frameset_autoplay\"},\n    {input: \"<frameset controls=\\\"x\\\">\",\n     acceptable: [\n         \"<frameset></frameset>\",\n         \"<frameset>\",\n         \"<frameset/>\",\n         \"<frameset />\",\n         \"<table><frameset></frameset></table>\",\n         \"<table><frameset></table>\",\n         \"<FRAMESET />\",\n         \"<FRAMESET></FRAMESET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frameset_controls\"},\n    {input: \"<frameset formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<frameset></frameset>\",\n         \"<frameset>\",\n         \"<frameset/>\",\n         \"<frameset />\",\n         \"<table><frameset></frameset></table>\",\n         \"<table><frameset></table>\",\n         \"<FRAMESET />\",\n         \"<FRAMESET></FRAMESET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frameset_formaction\"},\n    {input: \"<frameset formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<frameset></frameset>\",\n         \"<frameset>\",\n         \"<frameset/>\",\n         \"<frameset />\",\n         \"<table><frameset></frameset></table>\",\n         \"<table><frameset></table>\",\n         \"<FRAMESET />\",\n         \"<FRAMESET></FRAMESET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frameset_formmethod\"},\n    {input: \"<frameset pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<frameset></frameset>\",\n         \"<frameset>\",\n         \"<frameset/>\",\n         \"<frameset />\",\n         \"<table><frameset></frameset></table>\",\n         \"<table><frameset></table>\",\n         \"<FRAMESET />\",\n         \"<FRAMESET></FRAMESET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frameset_pattern\"},\n    {input: \"<frameset icon=\\\"x\\\">\",\n     acceptable: [\n         \"<frameset></frameset>\",\n         \"<frameset>\",\n         \"<frameset/>\",\n         \"<frameset />\",\n         \"<table><frameset></frameset></table>\",\n         \"<table><frameset></table>\",\n         \"<FRAMESET />\",\n         \"<FRAMESET></FRAMESET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frameset_icon\"},\n    {input: \"<frameset select=\\\"x\\\">\",\n     acceptable: [\n         \"<frameset></frameset>\",\n         \"<frameset>\",\n         \"<frameset/>\",\n         \"<frameset />\",\n         \"<table><frameset></frameset></table>\",\n         \"<table><frameset></table>\",\n         \"<FRAMESET />\",\n         \"<FRAMESET></FRAMESET>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frameset_select\"},\n    {input: \"<frame></frame>\",\n     acceptable: [\n         \"<frame>\",\n         \"<frame />\",\n         \"<frame></frame>\",\n         \"<table><frame></frame></table>\",\n         \"<FRAME />\",\n         \"<FRAME></FRAME>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frame_plain\"},\n    {input: \"<frame><script>alert()</script></frame>\",\n     acceptable: [\n         \"<frame>\",\n         \"<frame />\",\n         \"<frame></frame>\",\n         \"<table><frame></frame></table>\",\n         \"<FRAME />\",\n         \"<FRAME></FRAME>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><frame><td></td></frame></table>\",\n         \"<table><frame></frame><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_frame_scriptinside\"},\n    {input: \"<frame media=\\\"x\\\">\",\n     acceptable: [\n         \"<frame></frame>\",\n         \"<frame>\",\n         \"<frame/>\",\n         \"<frame />\",\n         \"<table><frame></frame></table>\",\n         \"<table><frame></table>\",\n         \"<FRAME />\",\n         \"<FRAME></FRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frame_media\"},\n    {input: \"<frame nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<frame></frame>\",\n         \"<frame>\",\n         \"<frame/>\",\n         \"<frame />\",\n         \"<table><frame></frame></table>\",\n         \"<table><frame></table>\",\n         \"<FRAME />\",\n         \"<FRAME></FRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frame_nonce\"},\n    {input: \"<frame srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<frame></frame>\",\n         \"<frame>\",\n         \"<frame/>\",\n         \"<frame />\",\n         \"<table><frame></frame></table>\",\n         \"<table><frame></table>\",\n         \"<FRAME />\",\n         \"<FRAME></FRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frame_srcset\"},\n    {input: \"<frame srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<frame></frame>\",\n         \"<frame>\",\n         \"<frame/>\",\n         \"<frame />\",\n         \"<table><frame></frame></table>\",\n         \"<table><frame></table>\",\n         \"<FRAME />\",\n         \"<FRAME></FRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frame_srcdoc\"},\n    {input: \"<frame poster=\\\"x\\\">\",\n     acceptable: [\n         \"<frame></frame>\",\n         \"<frame>\",\n         \"<frame/>\",\n         \"<frame />\",\n         \"<table><frame></frame></table>\",\n         \"<table><frame></table>\",\n         \"<FRAME />\",\n         \"<FRAME></FRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frame_poster\"},\n    {input: \"<frame autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<frame></frame>\",\n         \"<frame>\",\n         \"<frame/>\",\n         \"<frame />\",\n         \"<table><frame></frame></table>\",\n         \"<table><frame></table>\",\n         \"<FRAME />\",\n         \"<FRAME></FRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frame_autoplay\"},\n    {input: \"<frame controls=\\\"x\\\">\",\n     acceptable: [\n         \"<frame></frame>\",\n         \"<frame>\",\n         \"<frame/>\",\n         \"<frame />\",\n         \"<table><frame></frame></table>\",\n         \"<table><frame></table>\",\n         \"<FRAME />\",\n         \"<FRAME></FRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frame_controls\"},\n    {input: \"<frame formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<frame></frame>\",\n         \"<frame>\",\n         \"<frame/>\",\n         \"<frame />\",\n         \"<table><frame></frame></table>\",\n         \"<table><frame></table>\",\n         \"<FRAME />\",\n         \"<FRAME></FRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frame_formaction\"},\n    {input: \"<frame formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<frame></frame>\",\n         \"<frame>\",\n         \"<frame/>\",\n         \"<frame />\",\n         \"<table><frame></frame></table>\",\n         \"<table><frame></table>\",\n         \"<FRAME />\",\n         \"<FRAME></FRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frame_formmethod\"},\n    {input: \"<frame pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<frame></frame>\",\n         \"<frame>\",\n         \"<frame/>\",\n         \"<frame />\",\n         \"<table><frame></frame></table>\",\n         \"<table><frame></table>\",\n         \"<FRAME />\",\n         \"<FRAME></FRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frame_pattern\"},\n    {input: \"<frame icon=\\\"x\\\">\",\n     acceptable: [\n         \"<frame></frame>\",\n         \"<frame>\",\n         \"<frame/>\",\n         \"<frame />\",\n         \"<table><frame></frame></table>\",\n         \"<table><frame></table>\",\n         \"<FRAME />\",\n         \"<FRAME></FRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frame_icon\"},\n    {input: \"<frame select=\\\"x\\\">\",\n     acceptable: [\n         \"<frame></frame>\",\n         \"<frame>\",\n         \"<frame/>\",\n         \"<frame />\",\n         \"<table><frame></frame></table>\",\n         \"<table><frame></table>\",\n         \"<FRAME />\",\n         \"<FRAME></FRAME>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_frame_select\"},\n    {input: \"<font></font>\",\n     acceptable: [\n         \"<font>\",\n         \"<font />\",\n         \"<font></font>\",\n         \"<table><font></font></table>\",\n         \"<FONT />\",\n         \"<FONT></FONT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_font_plain\"},\n    {input: \"<font><script>alert()</script></font>\",\n     acceptable: [\n         \"<font>\",\n         \"<font />\",\n         \"<font></font>\",\n         \"<table><font></font></table>\",\n         \"<FONT />\",\n         \"<FONT></FONT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><font><td></td></font></table>\",\n         \"<table><font></font><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_font_scriptinside\"},\n    {input: \"<font media=\\\"x\\\">\",\n     acceptable: [\n         \"<font></font>\",\n         \"<font>\",\n         \"<font/>\",\n         \"<font />\",\n         \"<table><font></font></table>\",\n         \"<table><font></table>\",\n         \"<FONT />\",\n         \"<FONT></FONT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_font_media\"},\n    {input: \"<font nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<font></font>\",\n         \"<font>\",\n         \"<font/>\",\n         \"<font />\",\n         \"<table><font></font></table>\",\n         \"<table><font></table>\",\n         \"<FONT />\",\n         \"<FONT></FONT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_font_nonce\"},\n    {input: \"<font srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<font></font>\",\n         \"<font>\",\n         \"<font/>\",\n         \"<font />\",\n         \"<table><font></font></table>\",\n         \"<table><font></table>\",\n         \"<FONT />\",\n         \"<FONT></FONT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_font_srcset\"},\n    {input: \"<font srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<font></font>\",\n         \"<font>\",\n         \"<font/>\",\n         \"<font />\",\n         \"<table><font></font></table>\",\n         \"<table><font></table>\",\n         \"<FONT />\",\n         \"<FONT></FONT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_font_srcdoc\"},\n    {input: \"<font poster=\\\"x\\\">\",\n     acceptable: [\n         \"<font></font>\",\n         \"<font>\",\n         \"<font/>\",\n         \"<font />\",\n         \"<table><font></font></table>\",\n         \"<table><font></table>\",\n         \"<FONT />\",\n         \"<FONT></FONT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_font_poster\"},\n    {input: \"<font autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<font></font>\",\n         \"<font>\",\n         \"<font/>\",\n         \"<font />\",\n         \"<table><font></font></table>\",\n         \"<table><font></table>\",\n         \"<FONT />\",\n         \"<FONT></FONT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_font_autoplay\"},\n    {input: \"<font controls=\\\"x\\\">\",\n     acceptable: [\n         \"<font></font>\",\n         \"<font>\",\n         \"<font/>\",\n         \"<font />\",\n         \"<table><font></font></table>\",\n         \"<table><font></table>\",\n         \"<FONT />\",\n         \"<FONT></FONT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_font_controls\"},\n    {input: \"<font formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<font></font>\",\n         \"<font>\",\n         \"<font/>\",\n         \"<font />\",\n         \"<table><font></font></table>\",\n         \"<table><font></table>\",\n         \"<FONT />\",\n         \"<FONT></FONT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_font_formaction\"},\n    {input: \"<font formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<font></font>\",\n         \"<font>\",\n         \"<font/>\",\n         \"<font />\",\n         \"<table><font></font></table>\",\n         \"<table><font></table>\",\n         \"<FONT />\",\n         \"<FONT></FONT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_font_formmethod\"},\n    {input: \"<font pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<font></font>\",\n         \"<font>\",\n         \"<font/>\",\n         \"<font />\",\n         \"<table><font></font></table>\",\n         \"<table><font></table>\",\n         \"<FONT />\",\n         \"<FONT></FONT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_font_pattern\"},\n    {input: \"<font icon=\\\"x\\\">\",\n     acceptable: [\n         \"<font></font>\",\n         \"<font>\",\n         \"<font/>\",\n         \"<font />\",\n         \"<table><font></font></table>\",\n         \"<table><font></table>\",\n         \"<FONT />\",\n         \"<FONT></FONT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_font_icon\"},\n    {input: \"<font select=\\\"x\\\">\",\n     acceptable: [\n         \"<font></font>\",\n         \"<font>\",\n         \"<font/>\",\n         \"<font />\",\n         \"<table><font></font></table>\",\n         \"<table><font></table>\",\n         \"<FONT />\",\n         \"<FONT></FONT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_font_select\"},\n    {input: \"<content></content>\",\n     acceptable: [\n         \"<content>\",\n         \"<content />\",\n         \"<content></content>\",\n         \"<table><content></content></table>\",\n         \"<CONTENT />\",\n         \"<CONTENT></CONTENT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_content_plain\"},\n    {input: \"<content><script>alert()</script></content>\",\n     acceptable: [\n         \"<content>\",\n         \"<content />\",\n         \"<content></content>\",\n         \"<table><content></content></table>\",\n         \"<CONTENT />\",\n         \"<CONTENT></CONTENT>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n         \"<table><content><td></td></content></table>\",\n         \"<table><content></content><td></td></table>\",\n         \"<table><td></td></table>\",\n     ],\n     name: \"contract_content_scriptinside\"},\n    {input: \"<content media=\\\"x\\\">\",\n     acceptable: [\n         \"<content></content>\",\n         \"<content>\",\n         \"<content/>\",\n         \"<content />\",\n         \"<table><content></content></table>\",\n         \"<table><content></table>\",\n         \"<CONTENT />\",\n         \"<CONTENT></CONTENT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_content_media\"},\n    {input: \"<content nonce=\\\"x\\\">\",\n     acceptable: [\n         \"<content></content>\",\n         \"<content>\",\n         \"<content/>\",\n         \"<content />\",\n         \"<table><content></content></table>\",\n         \"<table><content></table>\",\n         \"<CONTENT />\",\n         \"<CONTENT></CONTENT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_content_nonce\"},\n    {input: \"<content srcset=\\\"x\\\">\",\n     acceptable: [\n         \"<content></content>\",\n         \"<content>\",\n         \"<content/>\",\n         \"<content />\",\n         \"<table><content></content></table>\",\n         \"<table><content></table>\",\n         \"<CONTENT />\",\n         \"<CONTENT></CONTENT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_content_srcset\"},\n    {input: \"<content srcdoc=\\\"x\\\">\",\n     acceptable: [\n         \"<content></content>\",\n         \"<content>\",\n         \"<content/>\",\n         \"<content />\",\n         \"<table><content></content></table>\",\n         \"<table><content></table>\",\n         \"<CONTENT />\",\n         \"<CONTENT></CONTENT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_content_srcdoc\"},\n    {input: \"<content poster=\\\"x\\\">\",\n     acceptable: [\n         \"<content></content>\",\n         \"<content>\",\n         \"<content/>\",\n         \"<content />\",\n         \"<table><content></content></table>\",\n         \"<table><content></table>\",\n         \"<CONTENT />\",\n         \"<CONTENT></CONTENT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_content_poster\"},\n    {input: \"<content autoplay=\\\"x\\\">\",\n     acceptable: [\n         \"<content></content>\",\n         \"<content>\",\n         \"<content/>\",\n         \"<content />\",\n         \"<table><content></content></table>\",\n         \"<table><content></table>\",\n         \"<CONTENT />\",\n         \"<CONTENT></CONTENT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_content_autoplay\"},\n    {input: \"<content controls=\\\"x\\\">\",\n     acceptable: [\n         \"<content></content>\",\n         \"<content>\",\n         \"<content/>\",\n         \"<content />\",\n         \"<table><content></content></table>\",\n         \"<table><content></table>\",\n         \"<CONTENT />\",\n         \"<CONTENT></CONTENT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_content_controls\"},\n    {input: \"<content formaction=\\\"x\\\">\",\n     acceptable: [\n         \"<content></content>\",\n         \"<content>\",\n         \"<content/>\",\n         \"<content />\",\n         \"<table><content></content></table>\",\n         \"<table><content></table>\",\n         \"<CONTENT />\",\n         \"<CONTENT></CONTENT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_content_formaction\"},\n    {input: \"<content formmethod=\\\"x\\\">\",\n     acceptable: [\n         \"<content></content>\",\n         \"<content>\",\n         \"<content/>\",\n         \"<content />\",\n         \"<table><content></content></table>\",\n         \"<table><content></table>\",\n         \"<CONTENT />\",\n         \"<CONTENT></CONTENT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_content_formmethod\"},\n    {input: \"<content pattern=\\\"x\\\">\",\n     acceptable: [\n         \"<content></content>\",\n         \"<content>\",\n         \"<content/>\",\n         \"<content />\",\n         \"<table><content></content></table>\",\n         \"<table><content></table>\",\n         \"<CONTENT />\",\n         \"<CONTENT></CONTENT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_content_pattern\"},\n    {input: \"<content icon=\\\"x\\\">\",\n     acceptable: [\n         \"<content></content>\",\n         \"<content>\",\n         \"<content/>\",\n         \"<content />\",\n         \"<table><content></content></table>\",\n         \"<table><content></table>\",\n         \"<CONTENT />\",\n         \"<CONTENT></CONTENT>\",\n         \"<select><option>High Grade</option><option>Medium Grade</option></select>\",\n         \"<span></span>\",\n         \"<span />\",\n         \"\",\n     ],\n     name: \"contract_content_icon\"},\n    {input: \"<p style=\\\"javascript:xss\\\"></p>\",\n     acceptable: [\n         \"<p style=\\\"about:invalid#zCSafez\\\"></p>\",\n         \"<p style=\\\"about:invalid#zGoSafez\\\"></p>\",\n         \"<p style=\\\"javascript:void(0);\\\"></p>\",\n         \"<p></p>\",\n         \"<p />\",\n         \"\",\n     ],\n     name: \"contract_style\"},\n    {input: \"<p aria-activedescendant=\\\"javascript:xss\\\"></p>\",\n     acceptable: [\n         \"<p aria-activedescendant=\\\"about:invalid#zCSafez\\\"></p>\",\n         \"<p aria-activedescendant=\\\"about:invalid#zGoSafez\\\"></p>\",\n         \"<p aria-activedescendant=\\\"javascript:void(0);\\\"></p>\",\n         \"<p></p>\",\n         \"<p />\",\n         \"\",\n     ],\n     name: \"contract_aria-activedescendant\"},\n    {input: \"<p async=\\\"x\\\"></p>\",\n     acceptable: [\n         \"<p></p>\",\n         \"<p />\",\n         \"\",\n     ],\n     name: \"contract_async\"},\n    {input: \"<p async=\\\"async\\\"></p>\",\n     acceptable: [\n         \"<p async=\\\"async\\\"></p>\",\n         \"<p async=async></p>\",\n         \"<p></p>\",\n         \"<p />\",\n         \"\",\n     ],\n     name: \"contract_async_async\"},\n    {input: \"<p for=\\\"javascript:xss\\\"></p>\",\n     acceptable: [\n         \"<p for=\\\"about:invalid#zCSafez\\\"></p>\",\n         \"<p for=\\\"about:invalid#zGoSafez\\\"></p>\",\n         \"<p for=\\\"javascript:void(0);\\\"></p>\",\n         \"<p></p>\",\n         \"<p />\",\n         \"\",\n     ],\n     name: \"contract_for\"},\n    {input: \"<p id=\\\"javascript:xss\\\"></p>\",\n     acceptable: [\n         \"<p id=\\\"about:invalid#zCSafez\\\"></p>\",\n         \"<p id=\\\"about:invalid#zGoSafez\\\"></p>\",\n         \"<p id=\\\"javascript:void(0);\\\"></p>\",\n         \"<p></p>\",\n         \"<p />\",\n         \"\",\n     ],\n     name: \"contract_id\"},\n    {input: \"<p list=\\\"javascript:xss\\\"></p>\",\n     acceptable: [\n         \"<p list=\\\"about:invalid#zCSafez\\\"></p>\",\n         \"<p list=\\\"about:invalid#zGoSafez\\\"></p>\",\n         \"<p list=\\\"javascript:void(0);\\\"></p>\",\n         \"<p></p>\",\n         \"<p />\",\n         \"\",\n     ],\n     name: \"contract_list\"},\n    {input: \"<p name=\\\"javascript:xss\\\"></p>\",\n     acceptable: [\n         \"<p name=\\\"about:invalid#zCSafez\\\"></p>\",\n         \"<p name=\\\"about:invalid#zGoSafez\\\"></p>\",\n         \"<p name=\\\"javascript:void(0);\\\"></p>\",\n         \"<p></p>\",\n         \"<p />\",\n         \"\",\n     ],\n     name: \"contract_name\"},\n    {input: \"<p src=\\\"x\\\"></p>\",\n     acceptable: [\n         \"<p src=\\\"javascript:void(0);\\\"></p>\",\n         \"<p></p>\",\n         \"<p />\",\n         \"\",\n     ],\n     name: \"contract_src\"},\n    {input: \"<p target=\\\"x\\\"></p>\",\n     acceptable: [\n         \"<p></p>\",\n         \"<p />\",\n         \"\",\n     ],\n     name: \"contract_target\"},\n    {input: \"<p target=\\\"_self\\\"></p>\",\n     acceptable: [\n         \"<p target=\\\"_self\\\"></p>\",\n         \"<p target=_self></p>\",\n         \"<p></p>\",\n         \"<p />\",\n         \"\",\n     ],\n     name: \"contract_target__self\"},\n    {input: \"<p target=\\\"_blank\\\"></p>\",\n     acceptable: [\n         \"<p target=\\\"_blank\\\"></p>\",\n         \"<p target=_blank></p>\",\n         \"<p></p>\",\n         \"<p />\",\n         \"\",\n     ],\n     name: \"contract_target__blank\"},\n];\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/sanitizer/html_test_vectors.js"],"^:1",["^9K",["~$goog.html.htmlTestVectors"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.locale.nativenameconstants.js","^9C",["^9D","goog/locale/nativenameconstants.js"],"^9E","goog/locale/nativenameconstants.js","^9F","^9G","^9H","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview List of native country and language names.\n *\n * File generated from CLDR ver. 35\n */\n\n// clang-format off\n\n/**\n * Namespace for native country and language names\n */\ngoog.provide('goog.locale.nativeNameConstants');\n\n/**\n * Native country and language names\n * @const {!Object<string, !Object<string, string>>}\n */\ngoog.locale.nativeNameConstants = {\n  'COUNTRY': {\n    'AC': 'Ascension Island',\n    'AD': 'Andorra',\n    'AE': 'الإمارات العربية المتحدة',\n    'AF': 'افغانستان',\n    'AG': 'Antigua & Barbuda',\n    'AI': 'Anguilla',\n    'AL': 'Shqipëri',\n    'AM': 'Հայաստան',\n    'AO': 'Angola',\n    'AQ': 'Antarctica',\n    'AR': 'Argentina',\n    'AS': 'American Samoa',\n    'AT': 'Österreich',\n    'AU': 'Australia',\n    'AW': 'Aruba',\n    'AX': 'Åland',\n    'AZ': 'Azərbaycan',\n    'BA': 'Bosna i Hercegovina',\n    'BB': 'Barbados',\n    'BD': 'বাংলাদেশ',\n    'BE': 'België',\n    'BF': 'Burkina Faso',\n    'BG': 'България',\n    'BH': 'البحرين',\n    'BI': 'Uburundi',\n    'BJ': 'Bénin',\n    'BL': 'Saint-Barthélemy',\n    'BM': 'Bermuda',\n    'BN': 'Brunei',\n    'BO': 'Bolivia',\n    'BQ': 'Caribbean Netherlands',\n    'BR': 'Brasil',\n    'BS': 'Bahamas',\n    'BT': 'འབྲུག',\n    'BV': 'Bouvet Island',\n    'BW': 'Botswana',\n    'BY': 'Беларусь',\n    'BZ': 'Belize',\n    'CA': 'Canada',\n    'CC': 'Cocos (Keeling) Islands',\n    'CD': 'Jamhuri ya Kidemokrasia ya Kongo',\n    'CF': 'République centrafricaine',\n    'CG': 'Congo-Brazzaville',\n    'CH': 'Schweiz',\n    'CI': 'Côte d’Ivoire',\n    'CK': 'Cook Islands',\n    'CL': 'Chile',\n    'CM': 'Cameroun',\n    'CN': '中国',\n    'CO': 'Colombia',\n    'CP': 'Clipperton Island',\n    'CR': 'Costa Rica',\n    'CU': 'Cuba',\n    'CV': 'Cabo Verde',\n    'CW': 'Curaçao',\n    'CX': 'Christmas Island',\n    'CY': 'Κύπρος',\n    'CZ': 'Česko',\n    'DE': 'Deutschland',\n    'DG': 'Diego Garcia',\n    'DJ': 'Djibouti',\n    'DK': 'Danmark',\n    'DM': 'Dominica',\n    'DO': 'República Dominicana',\n    'DZ': 'الجزائر',\n    'EA': 'Ceuta y Melilla',\n    'EC': 'Ecuador',\n    'EE': 'Eesti',\n    'EG': 'مصر',\n    'EH': 'الصحراء الغربية',\n    'ER': 'ኤርትራ',\n    'ES': 'España',\n    'ET': 'ኢትዮጵያ',\n    'FI': 'Suomi',\n    'FJ': 'Fiji',\n    'FK': 'Falkland Islands (Islas Malvinas)',\n    'FM': 'Micronesia',\n    'FO': 'Føroyar',\n    'FR': 'France',\n    'GA': 'Gabon',\n    'GB': 'United Kingdom',\n    'GD': 'Grenada',\n    'GE': 'საქართველო',\n    'GF': 'Guyane française',\n    'GG': 'Guernsey',\n    'GH': 'Gaana',\n    'GI': 'Gibraltar',\n    'GL': 'Kalaallit Nunaat',\n    'GM': 'Gambia',\n    'GN': 'Guinée',\n    'GP': 'Guadeloupe',\n    'GQ': 'Guinea Ecuatorial',\n    'GR': 'Ελλάδα',\n    'GS': 'South Georgia & South Sandwich Islands',\n    'GT': 'Guatemala',\n    'GU': 'Guam',\n    'GW': 'Guiné-Bissau',\n    'GY': 'Guyana',\n    'HK': '香港',\n    'HM': 'Heard & McDonald Islands',\n    'HN': 'Honduras',\n    'HR': 'Hrvatska',\n    'HT': 'Haiti',\n    'HU': 'Magyarország',\n    'IC': 'Canarias',\n    'ID': 'Indonesia',\n    'IE': 'Ireland',\n    'IL': 'ישראל',\n    'IM': 'Isle of Man',\n    'IN': 'भारत',\n    'IO': 'British Indian Ocean Territory',\n    'IQ': 'العراق',\n    'IR': 'ایران',\n    'IS': 'Ísland',\n    'IT': 'Italia',\n    'JE': 'Jersey',\n    'JM': 'Jamaica',\n    'JO': 'الأردن',\n    'JP': '日本',\n    'KE': 'Kenya',\n    'KG': 'Кыргызстан',\n    'KH': 'កម្ពុជា',\n    'KI': 'Kiribati',\n    'KM': 'جزر القمر',\n    'KN': 'St. Kitts & Nevis',\n    'KP': '북한',\n    'KR': '대한민국',\n    'KW': 'الكويت',\n    'KY': 'Cayman Islands',\n    'KZ': 'Казахстан',\n    'LA': 'ລາວ',\n    'LB': 'لبنان',\n    'LC': 'St. Lucia',\n    'LI': 'Liechtenstein',\n    'LK': 'ශ්‍රී ලංකාව',\n    'LR': 'Liberia',\n    'LS': 'Lesotho',\n    'LT': 'Lietuva',\n    'LU': 'Luxembourg',\n    'LV': 'Latvija',\n    'LY': 'ليبيا',\n    'MA': 'المغرب',\n    'MC': 'Monaco',\n    'MD': 'Republica Moldova',\n    'ME': 'Crna Gora',\n    'MF': 'Saint-Martin',\n    'MG': 'Madagasikara',\n    'MH': 'Marshall Islands',\n    'MK': 'Северна Македонија',\n    'ML': 'Mali',\n    'MM': 'မြန်မာ',\n    'MN': 'Монгол',\n    'MO': '澳門',\n    'MP': 'Northern Mariana Islands',\n    'MQ': 'Martinique',\n    'MR': 'موريتانيا',\n    'MS': 'Montserrat',\n    'MT': 'Malta',\n    'MU': 'Moris',\n    'MV': 'Maldives',\n    'MW': 'Malawi',\n    'MX': 'México',\n    'MY': 'Malaysia',\n    'MZ': 'Moçambique',\n    'NA': 'Namibië',\n    'NC': 'Nouvelle-Calédonie',\n    'NE': 'Nijar',\n    'NF': 'Norfolk Island',\n    'NG': 'Nigeria',\n    'NI': 'Nicaragua',\n    'NL': 'Nederland',\n    'NO': 'Norge',\n    'NP': 'नेपाल',\n    'NR': 'Nauru',\n    'NU': 'Niue',\n    'NZ': 'New Zealand',\n    'OM': 'عُمان',\n    'PA': 'Panamá',\n    'PE': 'Perú',\n    'PF': 'Polynésie française',\n    'PG': 'Papua New Guinea',\n    'PH': 'Pilipinas',\n    'PK': 'پاکستان',\n    'PL': 'Polska',\n    'PM': 'Saint-Pierre-et-Miquelon',\n    'PN': 'Pitcairn Islands',\n    'PR': 'Puerto Rico',\n    'PS': 'فلسطين',\n    'PT': 'Portugal',\n    'PW': 'Palau',\n    'PY': 'Paraguay',\n    'QA': 'قطر',\n    'RE': 'La Réunion',\n    'RO': 'România',\n    'RS': 'Србија',\n    'RU': 'Россия',\n    'RW': 'U Rwanda',\n    'SA': 'المملكة العربية السعودية',\n    'SB': 'Solomon Islands',\n    'SC': 'Seychelles',\n    'SD': 'السودان',\n    'SE': 'Sverige',\n    'SG': 'Singapore',\n    'SH': 'St. Helena',\n    'SI': 'Slovenija',\n    'SJ': 'Svalbard og Jan Mayen',\n    'SK': 'Slovensko',\n    'SL': 'Sierra Leone',\n    'SM': 'San Marino',\n    'SN': 'Sénégal',\n    'SO': 'Soomaaliya',\n    'SR': 'Suriname',\n    'SS': 'South Sudan',\n    'ST': 'São Tomé e Príncipe',\n    'SV': 'El Salvador',\n    'SX': 'Sint Maarten',\n    'SY': 'سوريا',\n    'SZ': 'Eswatini',\n    'TA': 'Tristan da Cunha',\n    'TC': 'Turks & Caicos Islands',\n    'TD': 'Tchad',\n    'TF': 'Terres australes françaises',\n    'TG': 'Togo',\n    'TH': 'ไทย',\n    'TJ': 'Тоҷикистон',\n    'TK': 'Tokelau',\n    'TL': 'Timor-Leste',\n    'TM': 'Türkmenistan',\n    'TN': 'تونس',\n    'TO': 'Tonga',\n    'TR': 'Türkiye',\n    'TT': 'Trinidad & Tobago',\n    'TV': 'Tuvalu',\n    'TW': '台灣',\n    'TZ': 'Tanzania',\n    'UA': 'Україна',\n    'UG': 'Uganda',\n    'UM': 'U.S. Outlying Islands',\n    'US': 'United States',\n    'UY': 'Uruguay',\n    'UZ': 'Oʻzbekiston',\n    'VA': 'Città del Vaticano',\n    'VC': 'St. Vincent & Grenadines',\n    'VE': 'Venezuela',\n    'VG': 'British Virgin Islands',\n    'VI': 'U.S. Virgin Islands',\n    'VN': 'Việt Nam',\n    'VU': 'Vanuatu',\n    'WF': 'Wallis-et-Futuna',\n    'WS': 'Samoa',\n    'XK': 'Kosovë',\n    'YE': 'اليمن',\n    'YT': 'Mayotte',\n    'ZA': 'South Africa',\n    'ZM': 'Zambia',\n    'ZW': 'Zimbabwe',\n    'af_NA': 'Namibië',\n    'af_ZA': 'Suid-Afrika',\n    'agq_CM': 'Kàmàlûŋ',\n    'ak_GH': 'Gaana',\n    'am_ET': 'ኢትዮጵያ',\n    'ar_001': 'العالم',\n    'ar_AE': 'الإمارات العربية المتحدة',\n    'ar_BH': 'البحرين',\n    'ar_DJ': 'جيبوتي',\n    'ar_DZ': 'الجزائر',\n    'ar_EG': 'مصر',\n    'ar_EH': 'الصحراء الغربية',\n    'ar_ER': 'إريتريا',\n    'ar_IL': 'إسرائيل',\n    'ar_IQ': 'العراق',\n    'ar_JO': 'الأردن',\n    'ar_KM': 'جزر القمر',\n    'ar_KW': 'الكويت',\n    'ar_LB': 'لبنان',\n    'ar_LY': 'ليبيا',\n    'ar_MA': 'المغرب',\n    'ar_MR': 'موريتانيا',\n    'ar_OM': 'عُمان',\n    'ar_PS': 'فلسطين',\n    'ar_QA': 'قطر',\n    'ar_SA': 'المملكة العربية السعودية',\n    'ar_SD': 'السودان',\n    'ar_SO': 'الصومال',\n    'ar_SS': 'جنوب السودان',\n    'ar_SY': 'سوريا',\n    'ar_TD': 'تشاد',\n    'ar_TN': 'تونس',\n    'ar_XB': '[XB]',\n    'ar_YE': 'اليمن',\n    'as_IN': 'ভাৰত',\n    'asa_TZ': 'Tadhania',\n    'ast_ES': 'España',\n    'az_Cyrl_AZ': 'Азәрбајҹан',\n    'az_Latn_AZ': 'Azərbaycan',\n    'bas_CM': 'Kàmɛ̀rûn',\n    'be_BY': 'Беларусь',\n    'bem_ZM': 'Zambia',\n    'bez_TZ': 'Hutanzania',\n    'bg_BG': 'България',\n    'bm_ML': 'Mali',\n    'bn_BD': 'বাংলাদেশ',\n    'bn_IN': 'ভারত',\n    'bo_CN': 'རྒྱ་ནག',\n    'bo_IN': 'རྒྱ་གར་',\n    'br_FR': 'Frañs',\n    'brx_IN': 'भारत',\n    'bs_Cyrl_BA': 'Босна и Херцеговина',\n    'bs_Latn_BA': 'Bosna i Hercegovina',\n    'ca_AD': 'Andorra',\n    'ca_ES': 'Espanya',\n    'ca_FR': 'França',\n    'ca_IT': 'Itàlia',\n    'ccp_BD': '\uD804\uDD1D\uD804\uDD01\uD804\uDD23\uD804\uDD18\uD804\uDD2C\uD804\uDD0C\uD804\uDD34',\n    'ccp_IN': '\uD804\uDD1E\uD804\uDD22\uD804\uDD27\uD804\uDD16\uD804\uDD34',\n    'ce_RU': 'Росси',\n    'ceb_PH': 'Pilipinas',\n    'cgg_UG': 'Uganda',\n    'chr_US': 'ᏌᏊ ᎢᏳᎾᎵᏍᏔᏅ ᏍᎦᏚᎩ',\n    'ckb_IQ': 'عێراق',\n    'ckb_IR': 'ئێران',\n    'cs_CZ': 'Česko',\n    'cy_GB': 'Y Deyrnas Unedig',\n    'da_DK': 'Danmark',\n    'da_GL': 'Grønland',\n    'dav_KE': 'Kenya',\n    'de_AT': 'Österreich',\n    'de_BE': 'Belgien',\n    'de_CH': 'Schweiz',\n    'de_DE': 'Deutschland',\n    'de_IT': 'Italien',\n    'de_LI': 'Liechtenstein',\n    'de_LU': 'Luxemburg',\n    'dje_NE': 'Nižer',\n    'dsb_DE': 'Nimska',\n    'dua_CM': 'Cameroun',\n    'dyo_SN': 'Senegal',\n    'dz_BT': 'འབྲུག',\n    'ebu_KE': 'Kenya',\n    'ee_GH': 'Ghana nutome',\n    'ee_TG': 'Togo nutome',\n    'el_CY': 'Κύπρος',\n    'el_GR': 'Ελλάδα',\n    'en_001': 'World',\n    'en_150': 'Europe',\n    'en_AE': 'United Arab Emirates',\n    'en_AG': 'Antigua & Barbuda',\n    'en_AI': 'Anguilla',\n    'en_AS': 'American Samoa',\n    'en_AT': 'Austria',\n    'en_AU': 'Australia',\n    'en_BB': 'Barbados',\n    'en_BE': 'Belgium',\n    'en_BI': 'Burundi',\n    'en_BM': 'Bermuda',\n    'en_BS': 'Bahamas',\n    'en_BW': 'Botswana',\n    'en_BZ': 'Belize',\n    'en_CA': 'Canada',\n    'en_CC': 'Cocos (Keeling) Islands',\n    'en_CH': 'Switzerland',\n    'en_CK': 'Cook Islands',\n    'en_CM': 'Cameroon',\n    'en_CX': 'Christmas Island',\n    'en_CY': 'Cyprus',\n    'en_DE': 'Germany',\n    'en_DG': 'Diego Garcia',\n    'en_DK': 'Denmark',\n    'en_DM': 'Dominica',\n    'en_ER': 'Eritrea',\n    'en_FI': 'Finland',\n    'en_FJ': 'Fiji',\n    'en_FK': 'Falkland Islands (Islas Malvinas)',\n    'en_FM': 'Micronesia',\n    'en_GB': 'United Kingdom',\n    'en_GD': 'Grenada',\n    'en_GG': 'Guernsey',\n    'en_GH': 'Ghana',\n    'en_GI': 'Gibraltar',\n    'en_GM': 'Gambia',\n    'en_GU': 'Guam',\n    'en_GY': 'Guyana',\n    'en_HK': 'Hong Kong',\n    'en_IE': 'Ireland',\n    'en_IL': 'Israel',\n    'en_IM': 'Isle of Man',\n    'en_IN': 'India',\n    'en_IO': 'British Indian Ocean Territory',\n    'en_JE': 'Jersey',\n    'en_JM': 'Jamaica',\n    'en_KE': 'Kenya',\n    'en_KI': 'Kiribati',\n    'en_KN': 'St. Kitts & Nevis',\n    'en_KY': 'Cayman Islands',\n    'en_LC': 'St. Lucia',\n    'en_LR': 'Liberia',\n    'en_LS': 'Lesotho',\n    'en_MG': 'Madagascar',\n    'en_MH': 'Marshall Islands',\n    'en_MO': 'Macao',\n    'en_MP': 'Northern Mariana Islands',\n    'en_MS': 'Montserrat',\n    'en_MT': 'Malta',\n    'en_MU': 'Mauritius',\n    'en_MW': 'Malawi',\n    'en_MY': 'Malaysia',\n    'en_NA': 'Namibia',\n    'en_NF': 'Norfolk Island',\n    'en_NG': 'Nigeria',\n    'en_NL': 'Netherlands',\n    'en_NR': 'Nauru',\n    'en_NU': 'Niue',\n    'en_NZ': 'New Zealand',\n    'en_PG': 'Papua New Guinea',\n    'en_PH': 'Philippines',\n    'en_PK': 'Pakistan',\n    'en_PN': 'Pitcairn Islands',\n    'en_PR': 'Puerto Rico',\n    'en_PW': 'Palau',\n    'en_RW': 'Rwanda',\n    'en_SB': 'Solomon Islands',\n    'en_SC': 'Seychelles',\n    'en_SD': 'Sudan',\n    'en_SE': 'Sweden',\n    'en_SG': 'Singapore',\n    'en_SH': 'St. Helena',\n    'en_SI': 'Slovenia',\n    'en_SL': 'Sierra Leone',\n    'en_SS': 'South Sudan',\n    'en_SX': 'Sint Maarten',\n    'en_SZ': 'Eswatini',\n    'en_TC': 'Turks & Caicos Islands',\n    'en_TK': 'Tokelau',\n    'en_TO': 'Tonga',\n    'en_TT': 'Trinidad & Tobago',\n    'en_TV': 'Tuvalu',\n    'en_TZ': 'Tanzania',\n    'en_UG': 'Uganda',\n    'en_UM': 'U.S. Outlying Islands',\n    'en_US': 'United States',\n    'en_US_POSIX': 'United States',\n    'en_VC': 'St. Vincent & Grenadines',\n    'en_VG': 'British Virgin Islands',\n    'en_VI': 'U.S. Virgin Islands',\n    'en_VU': 'Vanuatu',\n    'en_WS': 'Samoa',\n    'en_XA': '[XA]',\n    'en_ZA': 'South Africa',\n    'en_ZM': 'Zambia',\n    'en_ZW': 'Zimbabwe',\n    'eo_001': 'Mondo',\n    'es_419': 'Latinoamérica',\n    'es_AR': 'Argentina',\n    'es_BO': 'Bolivia',\n    'es_BR': 'Brasil',\n    'es_BZ': 'Belice',\n    'es_CL': 'Chile',\n    'es_CO': 'Colombia',\n    'es_CR': 'Costa Rica',\n    'es_CU': 'Cuba',\n    'es_DO': 'República Dominicana',\n    'es_EA': 'Ceuta y Melilla',\n    'es_EC': 'Ecuador',\n    'es_ES': 'España',\n    'es_GQ': 'Guinea Ecuatorial',\n    'es_GT': 'Guatemala',\n    'es_HN': 'Honduras',\n    'es_IC': 'Canarias',\n    'es_MX': 'México',\n    'es_NI': 'Nicaragua',\n    'es_PA': 'Panamá',\n    'es_PE': 'Perú',\n    'es_PH': 'Filipinas',\n    'es_PR': 'Puerto Rico',\n    'es_PY': 'Paraguay',\n    'es_SV': 'El Salvador',\n    'es_US': 'Estados Unidos',\n    'es_UY': 'Uruguay',\n    'es_VE': 'Venezuela',\n    'et_EE': 'Eesti',\n    'eu_ES': 'Espainia',\n    'ewo_CM': 'Kamərún',\n    'fa_AF': 'افغانستان',\n    'fa_IR': 'ایران',\n    'ff_Latn_BF': 'Burkibaa Faaso',\n    'ff_Latn_CM': 'Kameruun',\n    'ff_Latn_GH': 'Ganaa',\n    'ff_Latn_GM': 'Gammbi',\n    'ff_Latn_GN': 'Gine',\n    'ff_Latn_GW': 'Gine-Bisaawo',\n    'ff_Latn_LR': 'Liberiyaa',\n    'ff_Latn_MR': 'Muritani',\n    'ff_Latn_NE': 'Nijeer',\n    'ff_Latn_NG': 'Nijeriyaa',\n    'ff_Latn_SL': 'Seraa liyon',\n    'ff_Latn_SN': 'Senegaal',\n    'fi_FI': 'Suomi',\n    'fil_PH': 'Pilipinas',\n    'fo_DK': 'Danmark',\n    'fo_FO': 'Føroyar',\n    'fr_BE': 'Belgique',\n    'fr_BF': 'Burkina Faso',\n    'fr_BI': 'Burundi',\n    'fr_BJ': 'Bénin',\n    'fr_BL': 'Saint-Barthélemy',\n    'fr_CA': 'Canada',\n    'fr_CD': 'Congo-Kinshasa',\n    'fr_CF': 'République centrafricaine',\n    'fr_CG': 'Congo-Brazzaville',\n    'fr_CH': 'Suisse',\n    'fr_CI': 'Côte d’Ivoire',\n    'fr_CM': 'Cameroun',\n    'fr_DJ': 'Djibouti',\n    'fr_DZ': 'Algérie',\n    'fr_FR': 'France',\n    'fr_GA': 'Gabon',\n    'fr_GF': 'Guyane française',\n    'fr_GN': 'Guinée',\n    'fr_GP': 'Guadeloupe',\n    'fr_GQ': 'Guinée équatoriale',\n    'fr_HT': 'Haïti',\n    'fr_KM': 'Comores',\n    'fr_LU': 'Luxembourg',\n    'fr_MA': 'Maroc',\n    'fr_MC': 'Monaco',\n    'fr_MF': 'Saint-Martin',\n    'fr_MG': 'Madagascar',\n    'fr_ML': 'Mali',\n    'fr_MQ': 'Martinique',\n    'fr_MR': 'Mauritanie',\n    'fr_MU': 'Maurice',\n    'fr_NC': 'Nouvelle-Calédonie',\n    'fr_NE': 'Niger',\n    'fr_PF': 'Polynésie française',\n    'fr_PM': 'Saint-Pierre-et-Miquelon',\n    'fr_RE': 'La Réunion',\n    'fr_RW': 'Rwanda',\n    'fr_SC': 'Seychelles',\n    'fr_SN': 'Sénégal',\n    'fr_SY': 'Syrie',\n    'fr_TD': 'Tchad',\n    'fr_TG': 'Togo',\n    'fr_TN': 'Tunisie',\n    'fr_VU': 'Vanuatu',\n    'fr_WF': 'Wallis-et-Futuna',\n    'fr_YT': 'Mayotte',\n    'fur_IT': 'Italie',\n    'fy_NL': 'Nederlân',\n    'ga_IE': 'Éire',\n    'gd_GB': 'An Rìoghachd Aonaichte',\n    'gl_ES': 'España',\n    'gsw_CH': 'Schwiiz',\n    'gsw_FR': 'Frankriich',\n    'gsw_LI': 'Liächteschtäi',\n    'gu_IN': 'ભારત',\n    'guz_KE': 'Kenya',\n    'gv_IM': 'Ellan Vannin',\n    'ha_GH': 'Gana',\n    'ha_NE': 'Nijar',\n    'ha_NG': 'Najeriya',\n    'haw_US': 'ʻAmelika Hui Pū ʻIa',\n    'he_IL': 'ישראל',\n    'hi_IN': 'भारत',\n    'hr_BA': 'Bosna i Hercegovina',\n    'hr_HR': 'Hrvatska',\n    'hsb_DE': 'Němska',\n    'hu_HU': 'Magyarország',\n    'hy_AM': 'Հայաստան',\n    'ia_001': 'Mundo',\n    'id_ID': 'Indonesia',\n    'ig_NG': 'Naịjịrịa',\n    'ii_CN': 'ꍏꇩ',\n    'is_IS': 'Ísland',\n    'it_CH': 'Svizzera',\n    'it_IT': 'Italia',\n    'it_SM': 'San Marino',\n    'it_VA': 'Città del Vaticano',\n    'ja_JP': '日本',\n    'jgo_CM': 'Kamɛlûn',\n    'jmc_TZ': 'Tanzania',\n    'jv_ID': 'Indonésia',\n    'ka_GE': 'საქართველო',\n    'kab_DZ': 'Lezzayer',\n    'kam_KE': 'Kenya',\n    'kde_TZ': 'Tanzania',\n    'kea_CV': 'Kabu Verdi',\n    'khq_ML': 'Maali',\n    'ki_KE': 'Kenya',\n    'kk_KZ': 'Қазақстан',\n    'kkj_CM': 'Kamɛrun',\n    'kl_GL': 'Kalaallit Nunaat',\n    'kln_KE': 'Emetab Kenya',\n    'km_KH': 'កម្ពុជា',\n    'kn_IN': 'ಭಾರತ',\n    'ko_KP': '조선민주주의인민공화국',\n    'ko_KR': '대한민국',\n    'kok_IN': 'भारत',\n    'ks_IN': 'ہِندوستان',\n    'ksb_TZ': 'Tanzania',\n    'ksf_CM': 'kamɛrún',\n    'ksh_DE': 'Doütschland',\n    'ku_TR': 'Tirkiye',\n    'kw_GB': 'Rywvaneth Unys',\n    'ky_KG': 'Кыргызстан',\n    'lag_TZ': 'Taansanía',\n    'lb_LU': 'Lëtzebuerg',\n    'lg_UG': 'Yuganda',\n    'lkt_US': 'Mílahaŋska Tȟamákȟočhe',\n    'ln_AO': 'Angóla',\n    'ln_CD': 'Republíki ya Kongó Demokratíki',\n    'ln_CF': 'Repibiki ya Afríka ya Káti',\n    'ln_CG': 'Kongo',\n    'lo_LA': 'ລາວ',\n    'lrc_IQ': 'Iraq',\n    'lrc_IR': 'Iran',\n    'lt_LT': 'Lietuva',\n    'lu_CD': 'Ditunga wa Kongu',\n    'luo_KE': 'Kenya',\n    'luy_KE': 'Kenya',\n    'lv_LV': 'Latvija',\n    'mas_KE': 'Kenya',\n    'mas_TZ': 'Tansania',\n    'mer_KE': 'Kenya',\n    'mfe_MU': 'Moris',\n    'mg_MG': 'Madagasikara',\n    'mgh_MZ': 'Umozambiki',\n    'mgo_CM': 'Kamalun',\n    'mi_NZ': 'Aotearoa',\n    'mk_MK': 'Северна Македонија',\n    'ml_IN': 'ഇന്ത്യ',\n    'mn_MN': 'Монгол',\n    'mr_IN': 'भारत',\n    'ms_BN': 'Brunei',\n    'ms_MY': 'Malaysia',\n    'ms_SG': 'Singapura',\n    'mt_MT': 'Malta',\n    'mua_CM': 'kameruŋ',\n    'my_MM': 'မြန်မာ',\n    'mzn_IR': 'ایران',\n    'naq_NA': 'Namibiab',\n    'nb_NO': 'Norge',\n    'nb_SJ': 'Svalbard og Jan Mayen',\n    'nd_ZW': 'Zimbabwe',\n    'nds_DE': 'Germany',\n    'nds_NL': 'Netherlands',\n    'ne_IN': 'भारत',\n    'ne_NP': 'नेपाल',\n    'nl_AW': 'Aruba',\n    'nl_BE': 'België',\n    'nl_BQ': 'Caribisch Nederland',\n    'nl_CW': 'Curaçao',\n    'nl_NL': 'Nederland',\n    'nl_SR': 'Suriname',\n    'nl_SX': 'Sint-Maarten',\n    'nmg_CM': 'Kamerun',\n    'nn_NO': 'Noreg',\n    'nnh_CM': 'Kàmalûm',\n    'no_NO': 'Norge',\n    'nus_SS': 'South Sudan',\n    'nyn_UG': 'Uganda',\n    'om_ET': 'Itoophiyaa',\n    'om_KE': 'Keeniyaa',\n    'or_IN': 'ଭାରତ',\n    'os_GE': 'Гуырдзыстон',\n    'os_RU': 'Уӕрӕсе',\n    'pa_Arab_PK': 'پاکستان',\n    'pa_Guru_IN': 'ਭਾਰਤ',\n    'pl_PL': 'Polska',\n    'ps_AF': 'افغانستان',\n    'ps_PK': 'پاکستان',\n    'pt_AO': 'Angola',\n    'pt_BR': 'Brasil',\n    'pt_CH': 'Suíça',\n    'pt_CV': 'Cabo Verde',\n    'pt_GQ': 'Guiné Equatorial',\n    'pt_GW': 'Guiné-Bissau',\n    'pt_LU': 'Luxemburgo',\n    'pt_MO': 'Macau',\n    'pt_MZ': 'Moçambique',\n    'pt_PT': 'Portugal',\n    'pt_ST': 'São Tomé e Príncipe',\n    'pt_TL': 'Timor-Leste',\n    'qu_BO': 'Bolivia',\n    'qu_EC': 'Ecuador',\n    'qu_PE': 'Perú',\n    'rm_CH': 'Svizra',\n    'rn_BI': 'Uburundi',\n    'ro_MD': 'Republica Moldova',\n    'ro_RO': 'România',\n    'rof_TZ': 'Tanzania',\n    'ru_BY': 'Беларусь',\n    'ru_KG': 'Киргизия',\n    'ru_KZ': 'Казахстан',\n    'ru_MD': 'Молдова',\n    'ru_RU': 'Россия',\n    'ru_UA': 'Украина',\n    'rw_RW': 'U Rwanda',\n    'rwk_TZ': 'Tanzania',\n    'sah_RU': 'Арассыыйа',\n    'saq_KE': 'Kenya',\n    'sbp_TZ': 'Tansaniya',\n    'sd_PK': 'پاڪستان',\n    'se_FI': 'Suopma',\n    'se_NO': 'Norga',\n    'se_SE': 'Ruoŧŧa',\n    'seh_MZ': 'Moçambique',\n    'ses_ML': 'Maali',\n    'sg_CF': 'Ködörösêse tî Bêafrîka',\n    'shi_Latn_MA': 'lmɣrib',\n    'shi_Tfng_MA': 'ⵍⵎⵖⵔⵉⴱ',\n    'si_LK': 'ශ්‍රී ලංකාව',\n    'sk_SK': 'Slovensko',\n    'sl_SI': 'Slovenija',\n    'smn_FI': 'Suomâ',\n    'sn_ZW': 'Zimbabwe',\n    'so_DJ': 'Jabuuti',\n    'so_ET': 'Itoobiya',\n    'so_KE': 'Kenya',\n    'so_SO': 'Soomaaliya',\n    'sq_AL': 'Shqipëri',\n    'sq_MK': 'Maqedonia e Veriut',\n    'sq_XK': 'Kosovë',\n    'sr_Cyrl_BA': 'Босна и Херцеговина',\n    'sr_Cyrl_ME': 'Црна Гора',\n    'sr_Cyrl_RS': 'Србија',\n    'sr_Cyrl_XK': 'Косово',\n    'sr_Latn_BA': 'Bosna i Hercegovina',\n    'sr_Latn_ME': 'Crna Gora',\n    'sr_Latn_RS': 'Srbija',\n    'sr_Latn_XK': 'Kosovo',\n    'sv_AX': 'Åland',\n    'sv_FI': 'Finland',\n    'sv_SE': 'Sverige',\n    'sw_CD': 'Jamhuri ya Kidemokrasia ya Kongo',\n    'sw_KE': 'Kenya',\n    'sw_TZ': 'Tanzania',\n    'sw_UG': 'Uganda',\n    'ta_IN': 'இந்தியா',\n    'ta_LK': 'இலங்கை',\n    'ta_MY': 'மலேசியா',\n    'ta_SG': 'சிங்கப்பூர்',\n    'te_IN': 'భారతదేశం',\n    'teo_KE': 'Kenia',\n    'teo_UG': 'Uganda',\n    'tg_TJ': 'Тоҷикистон',\n    'th_TH': 'ไทย',\n    'ti_ER': 'ኤርትራ',\n    'ti_ET': 'ኢትዮጵያ',\n    'tk_TM': 'Türkmenistan',\n    'to_TO': 'Tonga',\n    'tr_CY': 'Kıbrıs',\n    'tr_TR': 'Türkiye',\n    'tt_RU': 'Россия',\n    'twq_NE': 'Nižer',\n    'tzm_MA': 'Meṛṛuk',\n    'ug_CN': 'جۇڭگو',\n    'uk_UA': 'Україна',\n    'ur_IN': 'بھارت',\n    'ur_PK': 'پاکستان',\n    'uz_Arab_AF': 'افغانستان',\n    'uz_Cyrl_UZ': 'Ўзбекистон',\n    'uz_Latn_UZ': 'Oʻzbekiston',\n    'vai_Latn_LR': 'Laibhiya',\n    'vai_Vaii_LR': 'ꕞꔤꔫꕩ',\n    'vi_VN': 'Việt Nam',\n    'vun_TZ': 'Tanzania',\n    'wae_CH': 'Schwiz',\n    'wo_SN': 'Senegaal',\n    'xh_ZA': 'eMzantsi Afrika',\n    'xog_UG': 'Yuganda',\n    'yav_CM': 'Kemelún',\n    'yi_001': 'וועלט',\n    'yo_BJ': 'Orílɛ́ède Bɛ̀nɛ̀',\n    'yo_NG': 'Orilẹ̀-èdè Nàìjíríà',\n    'yue_Hans_CN': '中华人民共和国',\n    'yue_Hant_HK': '香港',\n    'zgh_MA': 'ⵍⵎⵖⵔⵉⴱ',\n    'zh_CN': '中国',\n    'zh_HK': '香港',\n    'zh_Hans_CN': '中国',\n    'zh_Hans_HK': '香港',\n    'zh_Hans_MO': '澳门',\n    'zh_Hans_SG': '新加坡',\n    'zh_Hant_HK': '香港',\n    'zh_Hant_MO': '澳門',\n    'zh_Hant_TW': '台灣',\n    'zh_TW': '台灣',\n    'zu_ZA': 'iNingizimu Afrika'\n  },\n  'LANGUAGE': {\n    'aa': 'Afar',\n    'ab': 'Abkhazian',\n    'ace': 'Achinese',\n    'ach': 'Acoli',\n    'ada': 'Adangme',\n    'ady': 'Adyghe',\n    'ae': 'Avestan',\n    'af': 'Afrikaans',\n    'afh': 'Afrihili',\n    'agq': 'Aghem',\n    'ain': 'Ainu',\n    'ak': 'Akan',\n    'akk': 'Akkadian',\n    'ale': 'Aleut',\n    'alt': 'Southern Altai',\n    'am': 'አማርኛ',\n    'an': 'Aragonese',\n    'ang': 'Old English',\n    'anp': 'Angika',\n    'ar': 'العربية',\n    'ar_001': 'العربية (العالم)',\n    'arc': 'Aramaic',\n    'arn': 'Mapuche',\n    'arp': 'Arapaho',\n    'ars': 'اللهجة النجدية',\n    'arw': 'Arawak',\n    'as': 'অসমীয়া',\n    'asa': 'Kipare',\n    'ast': 'asturianu',\n    'av': 'Avaric',\n    'awa': 'Awadhi',\n    'ay': 'Aymara',\n    'az': 'azərbaycan',\n    'az_Cyrl': 'азәрбајҹан (Кирил)',\n    'az_Latn': 'azərbaycan (latın)',\n    'ba': 'Bashkir',\n    'bal': 'Baluchi',\n    'ban': 'Balinese',\n    'bas': 'Ɓàsàa',\n    'bax': 'Bamun',\n    'bbj': 'Ghomala',\n    'be': 'беларуская',\n    'bej': 'Beja',\n    'bem': 'Ichibemba',\n    'bez': 'Hibena',\n    'bfd': 'Bafut',\n    'bg': 'български',\n    'bho': 'Bhojpuri',\n    'bi': 'Bislama',\n    'bik': 'Bikol',\n    'bin': 'Bini',\n    'bkm': 'Kom',\n    'bla': 'Siksika',\n    'bm': 'bamanakan',\n    'bn': 'বাংলা',\n    'bo': 'བོད་སྐད་',\n    'br': 'brezhoneg',\n    'bra': 'Braj',\n    'brx': 'बड़ो',\n    'bs': 'bosanski',\n    'bs_Cyrl': 'босански (ћирилица)',\n    'bs_Latn': 'bosanski (latinica)',\n    'bss': 'Akoose',\n    'bua': 'Buriat',\n    'bug': 'Buginese',\n    'bum': 'Bulu',\n    'byn': 'Blin',\n    'byv': 'Medumba',\n    'ca': 'català',\n    'cad': 'Caddo',\n    'car': 'Carib',\n    'cay': 'Cayuga',\n    'cch': 'Atsam',\n    'ccp': '\uD804\uDD0C\uD804\uDD0B\uD804\uDD34\uD804\uDD1F\uD804\uDD33\uD804\uDD26',\n    'ce': 'нохчийн',\n    'ceb': 'Cebuano',\n    'cgg': 'Rukiga',\n    'ch': 'Chamorro',\n    'chb': 'Chibcha',\n    'chg': 'Chagatai',\n    'chk': 'Chuukese',\n    'chm': 'Mari',\n    'chn': 'Chinook Jargon',\n    'cho': 'Choctaw',\n    'chp': 'Chipewyan',\n    'chr': 'ᏣᎳᎩ',\n    'chy': 'Cheyenne',\n    'ckb': 'کوردیی ناوەندی',\n    'co': 'Corsican',\n    'cop': 'Coptic',\n    'cr': 'Cree',\n    'crh': 'Crimean Turkish',\n    'cs': 'čeština',\n    'csb': 'Kashubian',\n    'cu': 'Church Slavic',\n    'cv': 'Chuvash',\n    'cy': 'Cymraeg',\n    'da': 'dansk',\n    'dak': 'Dakota',\n    'dar': 'Dargwa',\n    'dav': 'Kitaita',\n    'de': 'Deutsch',\n    'de_AT': 'Deutsch (Österreich)',\n    'de_CH': 'Deutsch (Schweiz)',\n    'del': 'Delaware',\n    'den': 'Slave',\n    'dgr': 'Dogrib',\n    'din': 'Dinka',\n    'dje': 'Zarmaciine',\n    'doi': 'Dogri',\n    'dsb': 'dolnoserbšćina',\n    'dua': 'duálá',\n    'dum': 'Middle Dutch',\n    'dv': 'Divehi',\n    'dyo': 'joola',\n    'dyu': 'Dyula',\n    'dz': 'རྫོང་ཁ',\n    'dzg': 'Dazaga',\n    'ebu': 'Kĩembu',\n    'ee': 'Eʋegbe',\n    'efi': 'Efik',\n    'egy': 'Ancient Egyptian',\n    'eka': 'Ekajuk',\n    'el': 'Ελληνικά',\n    'elx': 'Elamite',\n    'en': 'English',\n    'en_AU': 'English (Australia)',\n    'en_CA': 'English (Canada)',\n    'en_GB': 'English (United Kingdom)',\n    'en_US': 'English (United States)',\n    'enm': 'Middle English',\n    'eo': 'esperanto',\n    'es': 'español',\n    'es_419': 'español (Latinoamérica)',\n    'es_ES': 'español (España)',\n    'es_MX': 'español (México)',\n    'et': 'eesti',\n    'eu': 'euskara',\n    'ewo': 'ewondo',\n    'fa': 'فارسی',\n    'fa_AF': 'فارسی (افغانستان)',\n    'fan': 'Fang',\n    'fat': 'Fanti',\n    'ff': 'Pulaar',\n    'ff_Latn': 'Fulah (Latin)',\n    'fi': 'suomi',\n    'fil': 'Filipino',\n    'fj': 'Fijian',\n    'fo': 'føroyskt',\n    'fon': 'Fon',\n    'fr': 'français',\n    'fr_CA': 'français (Canada)',\n    'fr_CH': 'français (Suisse)',\n    'frm': 'Middle French',\n    'fro': 'Old French',\n    'frr': 'Northern Frisian',\n    'frs': 'Eastern Frisian',\n    'fur': 'furlan',\n    'fy': 'Frysk',\n    'ga': 'Gaeilge',\n    'gaa': 'Ga',\n    'gay': 'Gayo',\n    'gba': 'Gbaya',\n    'gd': 'Gàidhlig',\n    'gez': 'Geez',\n    'gil': 'Gilbertese',\n    'gl': 'galego',\n    'gmh': 'Middle High German',\n    'gn': 'Guarani',\n    'goh': 'Old High German',\n    'gon': 'Gondi',\n    'gor': 'Gorontalo',\n    'got': 'Gothic',\n    'grb': 'Grebo',\n    'grc': 'Ancient Greek',\n    'gsw': 'Schwiizertüütsch',\n    'gu': 'ગુજરાતી',\n    'guz': 'Ekegusii',\n    'gv': 'Gaelg',\n    'gwi': 'Gwichʼin',\n    'ha': 'Hausa',\n    'hai': 'Haida',\n    'haw': 'ʻŌlelo Hawaiʻi',\n    'he': 'עברית',\n    'hi': 'हिन्दी',\n    'hil': 'Hiligaynon',\n    'hit': 'Hittite',\n    'hmn': 'Hmong',\n    'ho': 'Hiri Motu',\n    'hr': 'hrvatski',\n    'hsb': 'hornjoserbšćina',\n    'ht': 'Haitian Creole',\n    'hu': 'magyar',\n    'hup': 'Hupa',\n    'hy': 'հայերեն',\n    'hz': 'Herero',\n    'ia': 'interlingua',\n    'iba': 'Iban',\n    'ibb': 'Ibibio',\n    'id': 'Indonesia',\n    'ie': 'Interlingue',\n    'ig': 'Asụsụ Igbo',\n    'ii': 'ꆈꌠꉙ',\n    'ik': 'Inupiaq',\n    'ilo': 'Iloko',\n    'in': 'Indonesia',\n    'inh': 'Ingush',\n    'io': 'Ido',\n    'is': 'íslenska',\n    'it': 'italiano',\n    'iu': 'Inuktitut',\n    'iw': 'עברית',\n    'ja': '日本語',\n    'jbo': 'Lojban',\n    'jgo': 'Ndaꞌa',\n    'jmc': 'Kimachame',\n    'jpr': 'Judeo-Persian',\n    'jrb': 'Judeo-Arabic',\n    'jv': 'Jawa',\n    'ka': 'ქართული',\n    'kaa': 'Kara-Kalpak',\n    'kab': 'Taqbaylit',\n    'kac': 'Kachin',\n    'kaj': 'Jju',\n    'kam': 'Kikamba',\n    'kaw': 'Kawi',\n    'kbd': 'Kabardian',\n    'kbl': 'Kanembu',\n    'kcg': 'Tyap',\n    'kde': 'Chimakonde',\n    'kea': 'kabuverdianu',\n    'kfo': 'Koro',\n    'kg': 'Kongo',\n    'kha': 'Khasi',\n    'kho': 'Khotanese',\n    'khq': 'Koyra ciini',\n    'ki': 'Gikuyu',\n    'kj': 'Kuanyama',\n    'kk': 'қазақ тілі',\n    'kkj': 'kakɔ',\n    'kl': 'kalaallisut',\n    'kln': 'Kalenjin',\n    'km': 'ខ្មែរ',\n    'kmb': 'Kimbundu',\n    'kn': 'ಕನ್ನಡ',\n    'ko': '한국어',\n    'kok': 'कोंकणी',\n    'kos': 'Kosraean',\n    'kpe': 'Kpelle',\n    'kr': 'Kanuri',\n    'krc': 'Karachay-Balkar',\n    'krl': 'Karelian',\n    'kru': 'Kurukh',\n    'ks': 'کٲشُر',\n    'ksb': 'Kishambaa',\n    'ksf': 'rikpa',\n    'ksh': 'Kölsch',\n    'ku': 'kurdî',\n    'kum': 'Kumyk',\n    'kut': 'Kutenai',\n    'kv': 'Komi',\n    'kw': 'kernewek',\n    'ky': 'кыргызча',\n    'la': 'Latin',\n    'lad': 'Ladino',\n    'lag': 'Kɨlaangi',\n    'lah': 'Lahnda',\n    'lam': 'Lamba',\n    'lb': 'Lëtzebuergesch',\n    'lez': 'Lezghian',\n    'lg': 'Luganda',\n    'li': 'Limburgish',\n    'lkt': 'Lakȟólʼiyapi',\n    'ln': 'lingála',\n    'lo': 'ລາວ',\n    'lol': 'Mongo',\n    'loz': 'Lozi',\n    'lrc': 'لۊری شومالی',\n    'lt': 'lietuvių',\n    'lu': 'Tshiluba',\n    'lua': 'Luba-Lulua',\n    'lui': 'Luiseno',\n    'lun': 'Lunda',\n    'luo': 'Dholuo',\n    'lus': 'Mizo',\n    'luy': 'Luluhia',\n    'lv': 'latviešu',\n    'mad': 'Madurese',\n    'maf': 'Mafa',\n    'mag': 'Magahi',\n    'mai': 'Maithili',\n    'mak': 'Makasar',\n    'man': 'Mandingo',\n    'mas': 'Maa',\n    'mde': 'Maba',\n    'mdf': 'Moksha',\n    'mdr': 'Mandar',\n    'men': 'Mende',\n    'mer': 'Kĩmĩrũ',\n    'mfe': 'kreol morisien',\n    'mg': 'Malagasy',\n    'mga': 'Middle Irish',\n    'mgh': 'Makua',\n    'mgo': 'metaʼ',\n    'mh': 'Marshallese',\n    'mi': 'Māori',\n    'mic': 'Mi\\'kmaq',\n    'min': 'Minangkabau',\n    'mk': 'македонски',\n    'ml': 'മലയാളം',\n    'mn': 'монгол',\n    'mnc': 'Manchu',\n    'mni': 'Manipuri',\n    'moh': 'Mohawk',\n    'mos': 'Mossi',\n    'mr': 'मराठी',\n    'ms': 'Melayu',\n    'mt': 'Malti',\n    'mua': 'MUNDAŊ',\n    'mul': 'Multiple languages',\n    'mus': 'Creek',\n    'mwl': 'Mirandese',\n    'mwr': 'Marwari',\n    'my': 'မြန်မာ',\n    'mye': 'Myene',\n    'myv': 'Erzya',\n    'mzn': 'مازرونی',\n    'na': 'Nauru',\n    'nap': 'Neapolitan',\n    'naq': 'Khoekhoegowab',\n    'nb': 'norsk bokmål',\n    'nd': 'isiNdebele',\n    'nds': 'Low German',\n    'nds_NL': 'Low German (Netherlands)',\n    'ne': 'नेपाली',\n    'new': 'Newari',\n    'ng': 'Ndonga',\n    'nia': 'Nias',\n    'niu': 'Niuean',\n    'nl': 'Nederlands',\n    'nl_BE': 'Nederlands (België)',\n    'nmg': 'Kwasio',\n    'nn': 'nynorsk',\n    'nnh': 'Shwóŋò ngiembɔɔn',\n    'no': 'norsk',\n    'nog': 'Nogai',\n    'non': 'Old Norse',\n    'nqo': 'N’Ko',\n    'nr': 'South Ndebele',\n    'nso': 'Northern Sotho',\n    'nus': 'Thok Nath',\n    'nv': 'Navajo',\n    'nwc': 'Classical Newari',\n    'ny': 'Nyanja',\n    'nym': 'Nyamwezi',\n    'nyn': 'Runyankore',\n    'nyo': 'Nyoro',\n    'nzi': 'Nzima',\n    'oc': 'Occitan',\n    'oj': 'Ojibwa',\n    'om': 'Oromoo',\n    'or': 'ଓଡ଼ିଆ',\n    'os': 'ирон',\n    'osa': 'Osage',\n    'ota': 'Ottoman Turkish',\n    'pa': 'ਪੰਜਾਬੀ',\n    'pa_Arab': 'پنجابی (عربی)',\n    'pa_Guru': 'ਪੰਜਾਬੀ (ਗੁਰਮੁਖੀ)',\n    'pag': 'Pangasinan',\n    'pal': 'Pahlavi',\n    'pam': 'Pampanga',\n    'pap': 'Papiamento',\n    'pau': 'Palauan',\n    'peo': 'Old Persian',\n    'phn': 'Phoenician',\n    'pi': 'Pali',\n    'pl': 'polski',\n    'pon': 'Pohnpeian',\n    'pro': 'Old Provençal',\n    'ps': 'پښتو',\n    'pt': 'português',\n    'pt_BR': 'português (Brasil)',\n    'pt_PT': 'português (Portugal)',\n    'qu': 'Runasimi',\n    'raj': 'Rajasthani',\n    'rap': 'Rapanui',\n    'rar': 'Rarotongan',\n    'rm': 'rumantsch',\n    'rn': 'Ikirundi',\n    'ro': 'română',\n    'ro_MD': 'română (Republica Moldova)',\n    'rof': 'Kihorombo',\n    'rom': 'Romany',\n    'ru': 'русский',\n    'rup': 'Aromanian',\n    'rw': 'Kinyarwanda',\n    'rwk': 'Kiruwa',\n    'sa': 'Sanskrit',\n    'sad': 'Sandawe',\n    'sah': 'саха тыла',\n    'sam': 'Samaritan Aramaic',\n    'saq': 'Kisampur',\n    'sas': 'Sasak',\n    'sat': 'Santali',\n    'sba': 'Ngambay',\n    'sbp': 'Ishisangu',\n    'sc': 'Sardinian',\n    'scn': 'Sicilian',\n    'sco': 'Scots',\n    'sd': 'سنڌي',\n    'se': 'davvisámegiella',\n    'see': 'Seneca',\n    'seh': 'sena',\n    'sel': 'Selkup',\n    'ses': 'Koyraboro senni',\n    'sg': 'Sängö',\n    'sga': 'Old Irish',\n    'sh': 'srpskohrvatski',\n    'shi': 'ⵜⴰⵛⵍⵃⵉⵜ',\n    'shi_Latn': 'Tachelhit (Latin)',\n    'shi_Tfng': 'Tachelhit (Tifinagh)',\n    'shn': 'Shan',\n    'shu': 'Chadian Arabic',\n    'si': 'සිංහල',\n    'sid': 'Sidamo',\n    'sk': 'slovenčina',\n    'sl': 'slovenščina',\n    'sm': 'Samoan',\n    'sma': 'Southern Sami',\n    'smj': 'Lule Sami',\n    'smn': 'anarâškielâ',\n    'sms': 'Skolt Sami',\n    'sn': 'chiShona',\n    'snk': 'Soninke',\n    'so': 'Soomaali',\n    'sog': 'Sogdien',\n    'sq': 'shqip',\n    'sr': 'српски',\n    'sr_Cyrl': 'српски (ћирилица)',\n    'sr_Latn': 'srpski (latinica)',\n    'srn': 'Sranan Tongo',\n    'srr': 'Serer',\n    'ss': 'Swati',\n    'ssy': 'Saho',\n    'st': 'Southern Sotho',\n    'su': 'Sundanese',\n    'suk': 'Sukuma',\n    'sus': 'Susu',\n    'sux': 'Sumerian',\n    'sv': 'svenska',\n    'sw': 'Kiswahili',\n    'sw_CD': 'Kiswahili (Jamhuri ya Kidemokrasia ya Kongo)',\n    'swb': 'Comorian',\n    'syc': 'Classical Syriac',\n    'syr': 'Syriac',\n    'ta': 'தமிழ்',\n    'te': 'తెలుగు',\n    'tem': 'Timne',\n    'teo': 'Kiteso',\n    'ter': 'Tereno',\n    'tet': 'Tetum',\n    'tg': 'тоҷикӣ',\n    'th': 'ไทย',\n    'ti': 'ትግርኛ',\n    'tig': 'Tigre',\n    'tiv': 'Tiv',\n    'tk': 'türkmen dili',\n    'tkl': 'Tokelau',\n    'tl': 'Tagalog',\n    'tlh': 'Klingon',\n    'tli': 'Tlingit',\n    'tmh': 'Tamashek',\n    'tn': 'Tswana',\n    'to': 'lea fakatonga',\n    'tog': 'Nyasa Tonga',\n    'tpi': 'Tok Pisin',\n    'tr': 'Türkçe',\n    'trv': 'Taroko',\n    'ts': 'Tsonga',\n    'tsi': 'Tsimshian',\n    'tt': 'татар',\n    'tum': 'Tumbuka',\n    'tvl': 'Tuvalu',\n    'tw': 'Twi',\n    'twq': 'Tasawaq senni',\n    'ty': 'Tahitian',\n    'tyv': 'Tuvinian',\n    'tzm': 'Tamaziɣt n laṭlaṣ',\n    'udm': 'Udmurt',\n    'ug': 'ئۇيغۇرچە',\n    'uga': 'Ugaritic',\n    'uk': 'українська',\n    'umb': 'Umbundu',\n    'ur': 'اردو',\n    'uz': 'o‘zbek',\n    'uz_Arab': 'اوزبیک (عربی)',\n    'uz_Cyrl': 'ўзбекча (Кирил)',\n    'uz_Latn': 'o‘zbek (lotin)',\n    'vai': 'ꕙꔤ',\n    'vai_Latn': 'Vai (Latin)',\n    'vai_Vaii': 'Vai (Vai)',\n    've': 'Venda',\n    'vi': 'Tiếng Việt',\n    'vo': 'Volapük',\n    'vot': 'Votic',\n    'vun': 'Kyivunjo',\n    'wa': 'Walloon',\n    'wae': 'Walser',\n    'wal': 'Wolaytta',\n    'war': 'Waray',\n    'was': 'Washo',\n    'wo': 'Wolof',\n    'xal': 'Kalmyk',\n    'xh': 'isiXhosa',\n    'xog': 'Olusoga',\n    'yao': 'Yao',\n    'yap': 'Yapese',\n    'yav': 'nuasue',\n    'ybb': 'Yemba',\n    'yi': 'ייִדיש',\n    'yo': 'Èdè Yorùbá',\n    'yue': '粵語',\n    'yue_Hans': '粤语 (简体)',\n    'yue_Hant': '粵語 (繁體)',\n    'za': 'Zhuang',\n    'zap': 'Zapotec',\n    'zbl': 'Blissymbols',\n    'zen': 'Zenaga',\n    'zgh': 'ⵜⴰⵎⴰⵣⵉⵖⵜ',\n    'zh': '中文',\n    'zh_Hans': '中文（简体）',\n    'zh_Hant': '中文（繁體）',\n    'zh_TW': '中文（台灣）',\n    'zu': 'isiZulu',\n    'zun': 'Zuni',\n    'zxx': 'No linguistic content',\n    'zza': 'Zaza'\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/locale/nativenameconstants.js"],"^:1",["^9K",["~$goog.locale.nativeNameConstants"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.ac.autocomplete.js","^9C",["^9D","goog/ui/ac/autocomplete.js"],"^9E","goog/ui/ac/autocomplete.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Gmail-like AutoComplete logic.\n *\n * @see ../../demos/autocomplete-basic.html\n */\n\ngoog.provide('goog.ui.ac.AutoComplete');\ngoog.provide('goog.ui.ac.AutoComplete.EventType');\n\ngoog.forwardDeclare('goog.ui.ac.InputHandler');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.events');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.object');\ngoog.require('goog.ui.ac.RenderOptions');\n\n\n/**\n * This is the central manager class for an AutoComplete instance. The matcher\n * can specify disabled rows that should not be hilited or selected by\n * implementing <code>isRowDisabled(row):boolean</code> for each autocomplete\n * row. No row will be considered disabled if this method is not implemented.\n *\n * @param {Object} matcher A data source and row matcher, implements\n *        <code>requestMatchingRows(token, maxMatches, matchCallback)</code>.\n * @param {goog.events.EventTarget} renderer An object that implements\n *        <code>\n *          isVisible():boolean<br>\n *          renderRows(rows:Array, token:string, target:Element);<br>\n *          hiliteId(row-id:number);<br>\n *          dismiss();<br>\n *          dispose():\n *        </code>.\n * @param {Object} selectionHandler An object that implements\n *        <code>\n *          selectRow(row);<br>\n *          update(opt_force);\n *        </code>.\n *\n * @constructor\n * @extends {goog.events.EventTarget}\n * @suppress {underscore}\n */\ngoog.ui.ac.AutoComplete = function(matcher, renderer, selectionHandler) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * A data-source which provides autocomplete suggestions.\n   *\n   * TODO(chrishenry): Tighten the type to !goog.ui.ac.AutoComplete.Matcher.\n   *\n   * @type {Object}\n   * @protected\n   * @suppress {underscore|visibility}\n   */\n  this.matcher_ = matcher;\n\n  /**\n   * A handler which interacts with the input DOM element (textfield, textarea,\n   * or richedit).\n   *\n   * TODO(chrishenry): Tighten the type to !Object.\n   *\n   * @type {Object}\n   * @protected\n   * @suppress {underscore|visibility}\n   */\n  this.selectionHandler_ = selectionHandler;\n\n  /**\n   * A renderer to render/show/highlight/hide the autocomplete menu.\n   * @type {goog.events.EventTarget}\n   * @protected\n   * @suppress {underscore|visibility}\n   */\n  this.renderer_ = renderer;\n  goog.events.listen(\n      renderer,\n      [\n        goog.ui.ac.AutoComplete.EventType.HILITE,\n        goog.ui.ac.AutoComplete.EventType.SELECT,\n        goog.ui.ac.AutoComplete.EventType.CANCEL_DISMISS,\n        goog.ui.ac.AutoComplete.EventType.DISMISS\n      ],\n      this.handleEvent, false, this);\n\n  /**\n   * Currently typed token which will be used for completion.\n   * @type {?string}\n   * @protected\n   * @suppress {underscore|visibility}\n   */\n  this.token_ = null;\n\n  /**\n   * Autocomplete suggestion items.\n   * @type {Array<?>}\n   * @protected\n   * @suppress {underscore|visibility}\n   */\n  this.rows_ = [];\n\n  /**\n   * Id of the currently highlighted row.\n   * @type {number}\n   * @protected\n   * @suppress {underscore|visibility}\n   */\n  this.hiliteId_ = -1;\n\n  /**\n   * Id of the first row in autocomplete menu. Note that new ids are assigned\n   * every time new suggestions are fetched.\n   *\n   * TODO(chrishenry): Figure out what subclass does with this value\n   * and whether we should expose a more proper API.\n   *\n   * @type {number}\n   * @protected\n   * @suppress {underscore|visibility}\n   */\n  this.firstRowId_ = 0;\n\n  /**\n   * The target HTML node for displaying.\n   * @type {?Element}\n   * @protected\n   * @suppress {underscore|visibility}\n   */\n  this.target_ = null;\n\n  /**\n   * The timer id for dismissing autocomplete menu with a delay.\n   * @type {?number}\n   * @private\n   */\n  this.dismissTimer_ = null;\n\n  /**\n   * Mapping from text input element to the anchor element. If the\n   * mapping does not exist, the input element will act as the anchor\n   * element.\n   * @type {Object<Element>}\n   * @private\n   */\n  this.inputToAnchorMap_ = {};\n};\ngoog.inherits(goog.ui.ac.AutoComplete, goog.events.EventTarget);\n\n\n/**\n * The maximum number of matches that should be returned\n * @type {number}\n * @private\n */\ngoog.ui.ac.AutoComplete.prototype.maxMatches_ = 10;\n\n\n/**\n * True iff the first row should automatically be highlighted\n * @type {boolean}\n * @private\n */\ngoog.ui.ac.AutoComplete.prototype.autoHilite_ = true;\n\n\n/**\n * True iff the user can unhilight all rows by pressing the up arrow.\n * @type {boolean}\n * @private\n */\ngoog.ui.ac.AutoComplete.prototype.allowFreeSelect_ = false;\n\n\n/**\n * True iff item selection should wrap around from last to first. If\n *     allowFreeSelect_ is on in conjunction, there is a step of free selection\n *     before wrapping.\n * @type {boolean}\n * @private\n */\ngoog.ui.ac.AutoComplete.prototype.wrap_ = false;\n\n\n/**\n * Whether completion from suggestion triggers fetching new suggestion.\n * @type {boolean}\n * @private\n */\ngoog.ui.ac.AutoComplete.prototype.triggerSuggestionsOnUpdate_ = false;\n\n\n/**\n * Events associated with the autocomplete\n * @enum {string}\n */\ngoog.ui.ac.AutoComplete.EventType = {\n\n  /** A row has been highlighted by the renderer */\n  ROW_HILITE: 'rowhilite',\n\n  // Note: The events below are used for internal autocomplete events only and\n  // should not be used in non-autocomplete code.\n\n  /** A row has been mouseovered and should be highlighted by the renderer. */\n  HILITE: 'hilite',\n\n  /** A row has been selected by the renderer */\n  SELECT: 'select',\n\n  /** A dismiss event has occurred */\n  DISMISS: 'dismiss',\n\n  /** Event that cancels a dismiss event */\n  CANCEL_DISMISS: 'canceldismiss',\n\n  /**\n   * Field value was updated.  A row field is included and is non-null when a\n   * row has been selected.  The value of the row typically includes fields:\n   * contactData and formattedValue as well as a toString function (though none\n   * of these fields are guaranteed to exist).  The row field may be used to\n   * return custom-type row data.\n   */\n  UPDATE: 'update',\n\n  /**\n   * The list of suggestions has been updated, usually because either the list\n   * has opened, or because the user has typed another character and the\n   * suggestions have been updated, or the user has dismissed the autocomplete.\n   */\n  SUGGESTIONS_UPDATE: 'suggestionsupdate'\n};\n\n\n/**\n * @typedef {{\n *   requestMatchingRows:(!Function|undefined),\n *   isRowDisabled:(!Function|undefined)\n * }}\n */\ngoog.ui.ac.AutoComplete.Matcher;\n\n\n/**\n * @return {!Object} The data source providing the `autocomplete\n *     suggestions.\n */\ngoog.ui.ac.AutoComplete.prototype.getMatcher = function() {\n  return goog.asserts.assert(this.matcher_);\n};\n\n\n/**\n * Sets the data source providing the autocomplete suggestions.\n *\n * See constructor documentation for the interface.\n *\n * @param {!Object} matcher The matcher.\n * @protected\n */\ngoog.ui.ac.AutoComplete.prototype.setMatcher = function(matcher) {\n  this.matcher_ = matcher;\n};\n\n\n/**\n * @return {!Object} The handler used to interact with the input DOM\n *     element (textfield, textarea, or richedit), e.g. to update the\n *     input DOM element with selected value.\n * @protected\n */\ngoog.ui.ac.AutoComplete.prototype.getSelectionHandler = function() {\n  return goog.asserts.assert(this.selectionHandler_);\n};\n\n\n/**\n * @return {goog.events.EventTarget} The renderer that\n *     renders/shows/highlights/hides the autocomplete menu.\n *     See constructor documentation for the expected renderer API.\n */\ngoog.ui.ac.AutoComplete.prototype.getRenderer = function() {\n  return this.renderer_;\n};\n\n\n/**\n * Sets the renderer that renders/shows/highlights/hides the autocomplete\n * menu.\n *\n * See constructor documentation for the expected renderer API.\n *\n * @param {goog.events.EventTarget} renderer The renderer.\n * @protected\n */\ngoog.ui.ac.AutoComplete.prototype.setRenderer = function(renderer) {\n  this.renderer_ = renderer;\n};\n\n\n/**\n * @return {?string} The currently typed token used for completion.\n * @protected\n */\ngoog.ui.ac.AutoComplete.prototype.getToken = function() {\n  return this.token_;\n};\n\n\n/**\n * Sets the current token (without changing the rendered autocompletion).\n *\n * NOTE(chrishenry): This method will likely go away when we figure\n * out a better API.\n *\n * @param {?string} token The new token.\n * @protected\n */\ngoog.ui.ac.AutoComplete.prototype.setTokenInternal = function(token) {\n  this.token_ = token;\n};\n\n\n/**\n * @param {number} index The suggestion index, must be within the\n *     interval [0, this.getSuggestionCount()).\n * @return {Object} The currently suggested item at the given index\n *     (or null if there is none).\n */\ngoog.ui.ac.AutoComplete.prototype.getSuggestion = function(index) {\n  return this.rows_[index];\n};\n\n\n/**\n * @return {!Array<?>} The current autocomplete suggestion items.\n */\ngoog.ui.ac.AutoComplete.prototype.getAllSuggestions = function() {\n  return goog.asserts.assert(this.rows_);\n};\n\n\n/**\n * @return {number} The number of currently suggested items.\n */\ngoog.ui.ac.AutoComplete.prototype.getSuggestionCount = function() {\n  return this.rows_.length;\n};\n\n\n/**\n * @return {number} The id (not index!) of the currently highlighted row.\n */\ngoog.ui.ac.AutoComplete.prototype.getHighlightedId = function() {\n  return this.hiliteId_;\n};\n\n\n/**\n * Generic event handler that handles any events this object is listening to.\n * @param {goog.events.Event} e Event Object.\n */\ngoog.ui.ac.AutoComplete.prototype.handleEvent = function(e) {\n  var matcher = /** @type {?goog.ui.ac.AutoComplete.Matcher} */ (this.matcher_);\n\n  if (e.target == this.renderer_) {\n    switch (e.type) {\n      case goog.ui.ac.AutoComplete.EventType.HILITE:\n        this.hiliteId(/** @type {number} */ (e.row));\n        break;\n\n      case goog.ui.ac.AutoComplete.EventType.SELECT:\n        var rowDisabled = false;\n\n        // e.row can be either a valid row id or empty.\n        if (typeof e.row === 'number') {\n          var rowId = e.row;\n          var index = this.getIndexOfId(rowId);\n          var row = this.rows_[index];\n\n          // Make sure the row selected is not a disabled row.\n          rowDisabled =\n              !!row && matcher.isRowDisabled && matcher.isRowDisabled(row);\n          if (row && !rowDisabled && this.hiliteId_ != rowId) {\n            // Event target row not currently highlighted - fix the mismatch.\n            this.hiliteId(rowId);\n          }\n        }\n        if (!rowDisabled) {\n          // Note that rowDisabled can be false even if e.row does not\n          // contain a valid row ID; at least one client depends on us\n          // proceeding anyway.\n          this.selectHilited();\n        }\n        break;\n\n      case goog.ui.ac.AutoComplete.EventType.CANCEL_DISMISS:\n        this.cancelDelayedDismiss();\n        break;\n\n      case goog.ui.ac.AutoComplete.EventType.DISMISS:\n        this.dismissOnDelay();\n        break;\n    }\n  }\n};\n\n\n/**\n * Sets the max number of matches to fetch from the Matcher.\n *\n * @param {number} max Max number of matches.\n */\ngoog.ui.ac.AutoComplete.prototype.setMaxMatches = function(max) {\n  this.maxMatches_ = max;\n};\n\n\n/**\n * Sets whether or not the first row should be highlighted by default.\n *\n * @param {boolean} autoHilite true iff the first row should be\n *      highlighted by default.\n */\ngoog.ui.ac.AutoComplete.prototype.setAutoHilite = function(autoHilite) {\n  this.autoHilite_ = autoHilite;\n};\n\n\n/**\n * Sets whether or not the up/down arrow can unhilite all rows.\n *\n * @param {boolean} allowFreeSelect true iff the up arrow can unhilite all rows.\n */\ngoog.ui.ac.AutoComplete.prototype.setAllowFreeSelect = function(\n    allowFreeSelect) {\n  this.allowFreeSelect_ = allowFreeSelect;\n};\n\n\n/**\n * Sets whether or not selections can wrap around the edges.\n *\n * @param {boolean} wrap true iff sections should wrap around the edges.\n */\ngoog.ui.ac.AutoComplete.prototype.setWrap = function(wrap) {\n  this.wrap_ = wrap;\n};\n\n\n/**\n * Sets whether or not to request new suggestions immediately after completion\n * of a suggestion.\n *\n * @param {boolean} triggerSuggestionsOnUpdate true iff completion should fetch\n *     new suggestions.\n */\ngoog.ui.ac.AutoComplete.prototype.setTriggerSuggestionsOnUpdate = function(\n    triggerSuggestionsOnUpdate) {\n  this.triggerSuggestionsOnUpdate_ = triggerSuggestionsOnUpdate;\n};\n\n\n/**\n * Sets the token to match against.  This triggers calls to the Matcher to\n * fetch the matches (up to maxMatches), and then it triggers a call to\n * <code>renderer.renderRows()</code>.\n *\n * @param {string} token The string for which to search in the Matcher.\n * @param {string=} opt_fullString Optionally, the full string in the input\n *     field.\n */\ngoog.ui.ac.AutoComplete.prototype.setToken = function(token, opt_fullString) {\n  if (this.token_ == token) {\n    return;\n  }\n  this.token_ = token;\n  this.matcher_.requestMatchingRows(\n      this.token_, this.maxMatches_, goog.bind(this.matchListener_, this),\n      opt_fullString);\n  this.cancelDelayedDismiss();\n};\n\n\n/**\n * Gets the current target HTML node for displaying autocomplete UI.\n * @return {Element} The current target HTML node for displaying autocomplete\n *     UI.\n */\ngoog.ui.ac.AutoComplete.prototype.getTarget = function() {\n  return this.target_;\n};\n\n\n/**\n * Sets the current target HTML node for displaying autocomplete UI.\n * Can be an implementation specific definition of how to display UI in relation\n * to the target node.\n * This target will be passed into  <code>renderer.renderRows()</code>\n *\n * @param {Element} target The current target HTML node for displaying\n *     autocomplete UI.\n */\ngoog.ui.ac.AutoComplete.prototype.setTarget = function(target) {\n  this.target_ = target;\n};\n\n\n/**\n * @return {boolean} Whether the autocomplete's renderer is open.\n */\ngoog.ui.ac.AutoComplete.prototype.isOpen = function() {\n  return this.renderer_.isVisible();\n};\n\n\n/**\n * @return {number} Number of rows in the autocomplete.\n * @deprecated Use this.getSuggestionCount().\n */\ngoog.ui.ac.AutoComplete.prototype.getRowCount = function() {\n  return this.getSuggestionCount();\n};\n\n\n/**\n * Moves the hilite to the next non-disabled row.\n * Calls renderer.hiliteId() when there's something to do.\n * @return {boolean} Returns true on a successful hilite.\n */\ngoog.ui.ac.AutoComplete.prototype.hiliteNext = function() {\n  var lastId = this.firstRowId_ + this.rows_.length - 1;\n  var toHilite = this.hiliteId_;\n  // Hilite the next row, skipping any disabled rows.\n  for (var i = 0; i < this.rows_.length; i++) {\n    // Increment to the next row.\n    if (toHilite >= this.firstRowId_ && toHilite < lastId) {\n      toHilite++;\n    } else if (toHilite == -1) {\n      toHilite = this.firstRowId_;\n    } else if (this.allowFreeSelect_ && toHilite == lastId) {\n      this.hiliteId(-1);\n      return false;\n    } else if (this.wrap_ && toHilite == lastId) {\n      toHilite = this.firstRowId_;\n    } else {\n      return false;\n    }\n\n    if (this.hiliteId(toHilite)) {\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Moves the hilite to the previous non-disabled row.  Calls\n * renderer.hiliteId() when there's something to do.\n * @return {boolean} Returns true on a successful hilite.\n */\ngoog.ui.ac.AutoComplete.prototype.hilitePrev = function() {\n  var lastId = this.firstRowId_ + this.rows_.length - 1;\n  var toHilite = this.hiliteId_;\n  // Hilite the previous row, skipping any disabled rows.\n  for (var i = 0; i < this.rows_.length; i++) {\n    // Decrement to the previous row.\n    if (toHilite > this.firstRowId_) {\n      toHilite--;\n    } else if (this.allowFreeSelect_ && toHilite == this.firstRowId_) {\n      this.hiliteId(-1);\n      return false;\n    } else if (this.wrap_ && (toHilite == -1 || toHilite == this.firstRowId_)) {\n      toHilite = lastId;\n    } else {\n      return false;\n    }\n\n    if (this.hiliteId(toHilite)) {\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Hilites the id if it's valid and the row is not disabled, otherwise does\n * nothing.\n * @param {number} id A row id (not index).\n * @return {boolean} Whether the id was hilited. Returns false if the row is\n *     disabled.\n */\ngoog.ui.ac.AutoComplete.prototype.hiliteId = function(id) {\n  var index = this.getIndexOfId(id);\n  var row = this.rows_[index];\n  var rowDisabled =\n      !!row && this.matcher_.isRowDisabled && this.matcher_.isRowDisabled(row);\n  if (!rowDisabled) {\n    this.hiliteId_ = id;\n    this.renderer_.hiliteId(id);\n    return index != -1;\n  }\n  return false;\n};\n\n\n/**\n * Hilites the index, if it's valid and the row is not disabled, otherwise does\n * nothing.\n * @param {number} index The row's index.\n * @return {boolean} Whether the index was hilited.\n */\ngoog.ui.ac.AutoComplete.prototype.hiliteIndex = function(index) {\n  return this.hiliteId(this.getIdOfIndex_(index));\n};\n\n\n/**\n * If there are any current matches, this passes the hilited row data to\n * <code>selectionHandler.selectRow()</code>\n * @return {boolean} Whether there are any current matches.\n */\ngoog.ui.ac.AutoComplete.prototype.selectHilited = function() {\n  var index = this.getIndexOfId(this.hiliteId_);\n  if (index != -1) {\n    var selectedRow = this.rows_[index];\n    var suppressUpdate =\n        /** @type {!goog.ui.ac.InputHandler} */ (this.selectionHandler_)\n            .selectRow(selectedRow);\n    if (this.triggerSuggestionsOnUpdate_) {\n      this.token_ = null;\n      this.dismissOnDelay();\n    } else {\n      this.dismiss();\n    }\n    if (!suppressUpdate) {\n      this.dispatchEvent({\n        type: goog.ui.ac.AutoComplete.EventType.UPDATE,\n        row: selectedRow,\n        index: index\n      });\n      if (this.triggerSuggestionsOnUpdate_) {\n        this.selectionHandler_.update(true);\n      }\n    }\n    return true;\n  } else {\n    this.dismiss();\n    this.dispatchEvent({\n      type: goog.ui.ac.AutoComplete.EventType.UPDATE,\n      row: null,\n      index: null\n    });\n    return false;\n  }\n};\n\n\n/**\n * Returns whether or not the autocomplete is open and has a highlighted row.\n * @return {boolean} Whether an autocomplete row is highlighted.\n */\ngoog.ui.ac.AutoComplete.prototype.hasHighlight = function() {\n  return this.isOpen() && this.getIndexOfId(this.hiliteId_) != -1;\n};\n\n\n/**\n * Clears out the token, rows, and hilite, and calls\n * <code>renderer.dismiss()</code>\n */\ngoog.ui.ac.AutoComplete.prototype.dismiss = function() {\n  this.hiliteId_ = -1;\n  this.token_ = null;\n  this.firstRowId_ += this.rows_.length;\n  this.rows_ = [];\n  window.clearTimeout(this.dismissTimer_);\n  this.dismissTimer_ = null;\n  this.renderer_.dismiss();\n  this.dispatchEvent(goog.ui.ac.AutoComplete.EventType.SUGGESTIONS_UPDATE);\n  this.dispatchEvent(goog.ui.ac.AutoComplete.EventType.DISMISS);\n};\n\n\n/**\n * Call a dismiss after a delay, if there's already a dismiss active, ignore.\n */\ngoog.ui.ac.AutoComplete.prototype.dismissOnDelay = function() {\n  if (!this.dismissTimer_) {\n    this.dismissTimer_ = window.setTimeout(goog.bind(this.dismiss, this), 100);\n  }\n};\n\n\n/**\n * Cancels any delayed dismiss events immediately.\n * @return {boolean} Whether a delayed dismiss was cancelled.\n * @private\n */\ngoog.ui.ac.AutoComplete.prototype.immediatelyCancelDelayedDismiss_ =\n    function() {\n  if (this.dismissTimer_) {\n    window.clearTimeout(this.dismissTimer_);\n    this.dismissTimer_ = null;\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Cancel the active delayed dismiss if there is one.\n */\ngoog.ui.ac.AutoComplete.prototype.cancelDelayedDismiss = function() {\n  // Under certain circumstances a cancel event occurs immediately prior to a\n  // delayedDismiss event that it should be cancelling. To handle this situation\n  // properly, a timer is used to stop that event.\n  // Using only the timer creates undesirable behavior when the cancel occurs\n  // less than 10ms before the delayed dismiss timout ends. If that happens the\n  // clearTimeout() will occur too late and have no effect.\n  if (!this.immediatelyCancelDelayedDismiss_()) {\n    window.setTimeout(\n        goog.bind(this.immediatelyCancelDelayedDismiss_, this), 10);\n  }\n};\n\n\n/** @override */\ngoog.ui.ac.AutoComplete.prototype.disposeInternal = function() {\n  goog.ui.ac.AutoComplete.superClass_.disposeInternal.call(this);\n  delete this.inputToAnchorMap_;\n  this.renderer_.dispose();\n  this.selectionHandler_.dispose();\n  this.matcher_ = null;\n};\n\n\n/**\n * Callback passed to Matcher when requesting matches for a token.\n * This might be called synchronously, or asynchronously, or both, for\n * any implementation of a Matcher.\n * If the Matcher calls this back, with the same token this AutoComplete\n * has set currently, then this will package the matching rows in object\n * of the form\n * <pre>\n * {\n *   id: an integer ID unique to this result set and AutoComplete instance,\n *   data: the raw row data from Matcher\n * }\n * </pre>\n *\n * @param {string} matchedToken Token that corresponds with the rows.\n * @param {!Array<?>} rows Set of data that match the given token.\n * @param {(boolean|goog.ui.ac.RenderOptions)=} opt_options If true,\n *     keeps the currently hilited (by index) element hilited. If false not.\n *     Otherwise a RenderOptions object.\n * @private\n */\ngoog.ui.ac.AutoComplete.prototype.matchListener_ = function(\n    matchedToken, rows, opt_options) {\n  if (this.token_ != matchedToken) {\n    // Matcher's response token doesn't match current token.\n    // This is probably an async response that came in after\n    // the token was changed, so don't do anything.\n    return;\n  }\n\n  this.renderRows(rows, opt_options);\n};\n\n\n/**\n * Renders the rows and adds highlighting.\n * @param {!Array<?>} rows Set of data that match the given token.\n * @param {(boolean|goog.ui.ac.RenderOptions)=} opt_options If true,\n *     keeps the currently hilited (by index) element hilited. If false not.\n *     Otherwise a RenderOptions object.\n */\ngoog.ui.ac.AutoComplete.prototype.renderRows = function(rows, opt_options) {\n  // The optional argument should be a RenderOptions object.  It can be a\n  // boolean for backwards compatibility, defaulting to false.\n  var optionsObj = goog.typeOf(opt_options) == 'object' && opt_options;\n\n  var preserveHilited =\n      optionsObj ? optionsObj.getPreserveHilited() : opt_options;\n  var indexToHilite = preserveHilited ? this.getIndexOfId(this.hiliteId_) : -1;\n\n  // Current token matches the matcher's response token.\n  this.firstRowId_ += this.rows_.length;\n  this.rows_ = rows;\n  var rendRows = [];\n  for (var i = 0; i < rows.length; ++i) {\n    rendRows.push({id: this.getIdOfIndex_(i), data: rows[i]});\n  }\n\n  var anchor = null;\n  if (this.target_) {\n    anchor = this.inputToAnchorMap_[goog.getUid(this.target_)] || this.target_;\n  }\n  this.renderer_.setAnchorElement(anchor);\n  this.renderer_.renderRows(rendRows, this.token_, this.target_);\n\n  var autoHilite = this.autoHilite_;\n  if (optionsObj && optionsObj.getAutoHilite() !== undefined) {\n    autoHilite = optionsObj.getAutoHilite();\n  }\n  this.hiliteId_ = -1;\n  if ((autoHilite || indexToHilite >= 0) && rendRows.length != 0 &&\n      this.token_) {\n    if (indexToHilite >= 0) {\n      this.hiliteId(this.getIdOfIndex_(indexToHilite));\n    } else {\n      // Hilite the first non-disabled row.\n      this.hiliteNext();\n    }\n  }\n  this.dispatchEvent(goog.ui.ac.AutoComplete.EventType.SUGGESTIONS_UPDATE);\n};\n\n\n/**\n * Gets the index corresponding to a particular id.\n * @param {number} id A unique id for the row.\n * @return {number} A valid index into rows_, or -1 if the id is invalid.\n * @protected\n */\ngoog.ui.ac.AutoComplete.prototype.getIndexOfId = function(id) {\n  var index = id - this.firstRowId_;\n  if (index < 0 || index >= this.rows_.length) {\n    return -1;\n  }\n  return index;\n};\n\n\n/**\n * Gets the id corresponding to a particular index.  (Does no checking.)\n * @param {number} index The index of a row in the result set.\n * @return {number} The id that currently corresponds to that index.\n * @private\n */\ngoog.ui.ac.AutoComplete.prototype.getIdOfIndex_ = function(index) {\n  return this.firstRowId_ + index;\n};\n\n\n/**\n * Attach text areas or input boxes to the autocomplete by DOM reference.  After\n * elements are attached to the autocomplete, when a user types they will see\n * the autocomplete drop down.\n * @param {...Element} var_args Variable args: Input or text area elements to\n *     attach the autocomplete too.\n */\ngoog.ui.ac.AutoComplete.prototype.attachInputs = function(var_args) {\n  // Delegate to the input handler\n  var inputHandler = /** @type {goog.ui.ac.InputHandler} */\n      (this.selectionHandler_);\n  inputHandler.attachInputs.apply(inputHandler, arguments);\n};\n\n\n/**\n * Detach text areas or input boxes to the autocomplete by DOM reference.\n * @param {...Element} var_args Variable args: Input or text area elements to\n *     detach from the autocomplete.\n */\ngoog.ui.ac.AutoComplete.prototype.detachInputs = function(var_args) {\n  // Delegate to the input handler\n  var inputHandler = /** @type {goog.ui.ac.InputHandler} */\n      (this.selectionHandler_);\n  inputHandler.detachInputs.apply(inputHandler, arguments);\n\n  // Remove mapping from input to anchor if one exists.\n  goog.array.forEach(arguments, function(input) {\n    goog.object.remove(this.inputToAnchorMap_, goog.getUid(input));\n  }, this);\n};\n\n\n/**\n * Attaches the autocompleter to a text area or text input element\n * with an anchor element. The anchor element is the element the\n * autocomplete box will be positioned against.\n * @param {Element} inputElement The input element. May be 'textarea',\n *     text 'input' element, or any other element that exposes similar\n *     interface.\n * @param {Element} anchorElement The anchor element.\n */\ngoog.ui.ac.AutoComplete.prototype.attachInputWithAnchor = function(\n    inputElement, anchorElement) {\n  this.inputToAnchorMap_[goog.getUid(inputElement)] = anchorElement;\n  this.attachInputs(inputElement);\n};\n\n\n/**\n * Forces an update of the display.\n * @param {boolean=} opt_force Whether to force an update.\n */\ngoog.ui.ac.AutoComplete.prototype.update = function(opt_force) {\n  var inputHandler = /** @type {goog.ui.ac.InputHandler} */\n      (this.selectionHandler_);\n  inputHandler.update(opt_force);\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9>","^;P","^:L","^>[","^;9","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/ac/autocomplete.js"],"^:1",["^9K",["~$goog.ui.ac.AutoComplete","~$goog.ui.ac.AutoComplete.EventType"]],"^9<",true,"^9=",["^9>","^;9","^:E","^:N","^:L","^;P","^>["]],["^ ","^9A",[1579837703000],"^9B","goog.events.keyhandler.js","^9C",["^9D","goog/events/keyhandler.js"],"^9E","goog/events/keyhandler.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This file contains a class for working with keyboard events\n * that repeat consistently across browsers and platforms. It also unifies the\n * key code so that it is the same in all browsers and platforms.\n *\n * Different web browsers have very different keyboard event handling. Most\n * importantly is that only certain browsers repeat keydown events:\n * IE, Opera, FF/Win32, and Safari 3 repeat keydown events.\n * FF/Mac and Safari 2 do not.\n *\n * For the purposes of this code, \"Safari 3\" means WebKit 525+, when WebKit\n * decided that they should try to match IE's key handling behavior.\n * Safari 3.0.4, which shipped with Leopard (WebKit 523), has the\n * Safari 2 behavior.\n *\n * Firefox, Safari, Opera prevent on keypress\n *\n * IE prevents on keydown\n *\n * Firefox does not fire keypress for shift, ctrl, alt\n * Firefox does fire keydown for shift, ctrl, alt, meta\n * Firefox does not repeat keydown for shift, ctrl, alt, meta\n *\n * Firefox does not fire keypress for up and down in an input\n *\n * Opera fires keypress for shift, ctrl, alt, meta\n * Opera does not repeat keypress for shift, ctrl, alt, meta\n *\n * Safari 2 and 3 do not fire keypress for shift, ctrl, alt\n * Safari 2 does not fire keydown for shift, ctrl, alt\n * Safari 3 *does* fire keydown for shift, ctrl, alt\n *\n * IE provides the keycode for keyup/down events and the charcode (in the\n * keycode field) for keypress.\n *\n * Mozilla provides the keycode for keyup/down and the charcode for keypress\n * unless it's a non text modifying key in which case the keycode is provided.\n *\n * Safari 3 provides the keycode and charcode for all events.\n *\n * Opera provides the keycode for keyup/down event and either the charcode or\n * the keycode (in the keycode field) for keypress events.\n *\n * Firefox x11 doesn't fire keydown events if a another key is already held down\n * until the first key is released. This can cause a key event to be fired with\n * a keyCode for the first key and a charCode for the second key.\n *\n * Safari in keypress\n *\n *        charCode keyCode which\n * ENTER:       13      13    13\n * F1:       63236   63236 63236\n * F8:       63243   63243 63243\n * ...\n * p:          112     112   112\n * P:           80      80    80\n *\n * Firefox, keypress:\n *\n *        charCode keyCode which\n * ENTER:        0      13    13\n * F1:           0     112     0\n * F8:           0     119     0\n * ...\n * p:          112       0   112\n * P:           80       0    80\n *\n * Opera, Mac+Win32, keypress:\n *\n *         charCode keyCode which\n * ENTER: undefined      13    13\n * F1:    undefined     112     0\n * F8:    undefined     119     0\n * ...\n * p:     undefined     112   112\n * P:     undefined      80    80\n *\n * IE7, keydown\n *\n *         charCode keyCode     which\n * ENTER: undefined      13 undefined\n * F1:    undefined     112 undefined\n * F8:    undefined     119 undefined\n * ...\n * p:     undefined      80 undefined\n * P:     undefined      80 undefined\n *\n * @author arv@google.com (Erik Arvidsson)\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/keyhandler.html\n */\n\ngoog.provide('goog.events.KeyEvent');\ngoog.provide('goog.events.KeyHandler');\ngoog.provide('goog.events.KeyHandler.EventType');\n\ngoog.require('goog.events');\ngoog.require('goog.events.BrowserEvent');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A wrapper around an element that you want to listen to keyboard events on.\n * @param {Element|Document=} opt_element The element or document to listen on.\n * @param {boolean=} opt_capture Whether to listen for browser events in\n *     capture phase (defaults to false).\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.events.KeyHandler = function(opt_element, opt_capture) {\n  goog.events.EventTarget.call(this);\n\n  if (opt_element) {\n    this.attach(opt_element, opt_capture);\n  }\n};\ngoog.inherits(goog.events.KeyHandler, goog.events.EventTarget);\n\n\n/**\n * This is the element that we will listen to the real keyboard events on.\n * @type {?Element|?Document|null}\n * @private\n */\ngoog.events.KeyHandler.prototype.element_ = null;\n\n\n/**\n * The key for the key press listener.\n * @type {?goog.events.Key}\n * @private\n */\ngoog.events.KeyHandler.prototype.keyPressKey_ = null;\n\n\n/**\n * The key for the key down listener.\n * @type {?goog.events.Key}\n * @private\n */\ngoog.events.KeyHandler.prototype.keyDownKey_ = null;\n\n\n/**\n * The key for the key up listener.\n * @type {?goog.events.Key}\n * @private\n */\ngoog.events.KeyHandler.prototype.keyUpKey_ = null;\n\n\n/**\n * Used to detect keyboard repeat events.\n * @private\n * @type {number}\n */\ngoog.events.KeyHandler.prototype.lastKey_ = -1;\n\n\n/**\n * Keycode recorded for key down events. As most browsers don't report the\n * keycode in the key press event we need to record it in the key down phase.\n * @private\n * @type {number}\n */\ngoog.events.KeyHandler.prototype.keyCode_ = -1;\n\n\n/**\n * Alt key recorded for key down events. FF on Mac does not report the alt key\n * flag in the key press event, we need to record it in the key down phase.\n * @type {boolean}\n * @private\n */\ngoog.events.KeyHandler.prototype.altKey_ = false;\n\n\n/**\n * Enum type for the events fired by the key handler\n * @enum {string}\n */\ngoog.events.KeyHandler.EventType = {\n  KEY: 'key'\n};\n\n\n/**\n * An enumeration of key codes that Safari 2 does incorrectly\n * @type {Object}\n * @private\n */\ngoog.events.KeyHandler.safariKey_ = {\n  '3': goog.events.KeyCodes.ENTER,             // 13\n  '12': goog.events.KeyCodes.NUMLOCK,          // 144\n  '63232': goog.events.KeyCodes.UP,            // 38\n  '63233': goog.events.KeyCodes.DOWN,          // 40\n  '63234': goog.events.KeyCodes.LEFT,          // 37\n  '63235': goog.events.KeyCodes.RIGHT,         // 39\n  '63236': goog.events.KeyCodes.F1,            // 112\n  '63237': goog.events.KeyCodes.F2,            // 113\n  '63238': goog.events.KeyCodes.F3,            // 114\n  '63239': goog.events.KeyCodes.F4,            // 115\n  '63240': goog.events.KeyCodes.F5,            // 116\n  '63241': goog.events.KeyCodes.F6,            // 117\n  '63242': goog.events.KeyCodes.F7,            // 118\n  '63243': goog.events.KeyCodes.F8,            // 119\n  '63244': goog.events.KeyCodes.F9,            // 120\n  '63245': goog.events.KeyCodes.F10,           // 121\n  '63246': goog.events.KeyCodes.F11,           // 122\n  '63247': goog.events.KeyCodes.F12,           // 123\n  '63248': goog.events.KeyCodes.PRINT_SCREEN,  // 44\n  '63272': goog.events.KeyCodes.DELETE,        // 46\n  '63273': goog.events.KeyCodes.HOME,          // 36\n  '63275': goog.events.KeyCodes.END,           // 35\n  '63276': goog.events.KeyCodes.PAGE_UP,       // 33\n  '63277': goog.events.KeyCodes.PAGE_DOWN,     // 34\n  '63289': goog.events.KeyCodes.NUMLOCK,       // 144\n  '63302': goog.events.KeyCodes.INSERT         // 45\n};\n\n\n/**\n * An enumeration of key identifiers currently part of the W3C draft for DOM3\n * and their mappings to keyCodes.\n * http://www.w3.org/TR/DOM-Level-3-Events/keyset.html#KeySet-Set\n * This is currently supported in Safari and should be platform independent.\n * @type {Object}\n * @private\n */\ngoog.events.KeyHandler.keyIdentifier_ = {\n  'Up': goog.events.KeyCodes.UP,               // 38\n  'Down': goog.events.KeyCodes.DOWN,           // 40\n  'Left': goog.events.KeyCodes.LEFT,           // 37\n  'Right': goog.events.KeyCodes.RIGHT,         // 39\n  'Enter': goog.events.KeyCodes.ENTER,         // 13\n  'F1': goog.events.KeyCodes.F1,               // 112\n  'F2': goog.events.KeyCodes.F2,               // 113\n  'F3': goog.events.KeyCodes.F3,               // 114\n  'F4': goog.events.KeyCodes.F4,               // 115\n  'F5': goog.events.KeyCodes.F5,               // 116\n  'F6': goog.events.KeyCodes.F6,               // 117\n  'F7': goog.events.KeyCodes.F7,               // 118\n  'F8': goog.events.KeyCodes.F8,               // 119\n  'F9': goog.events.KeyCodes.F9,               // 120\n  'F10': goog.events.KeyCodes.F10,             // 121\n  'F11': goog.events.KeyCodes.F11,             // 122\n  'F12': goog.events.KeyCodes.F12,             // 123\n  'U+007F': goog.events.KeyCodes.DELETE,       // 46\n  'Home': goog.events.KeyCodes.HOME,           // 36\n  'End': goog.events.KeyCodes.END,             // 35\n  'PageUp': goog.events.KeyCodes.PAGE_UP,      // 33\n  'PageDown': goog.events.KeyCodes.PAGE_DOWN,  // 34\n  'Insert': goog.events.KeyCodes.INSERT        // 45\n};\n\n\n/**\n * If true, the KeyEvent fires on keydown. Otherwise, it fires on keypress.\n *\n * @type {boolean}\n * @private\n */\ngoog.events.KeyHandler.USES_KEYDOWN_ =\n    !goog.userAgent.WEBKIT || goog.userAgent.isVersionOrHigher('525');\n\n\n/**\n * If true, the alt key flag is saved during the key down and reused when\n * handling the key press. FF on Mac does not set the alt flag in the key press\n * event.\n * @type {boolean}\n * @private\n */\ngoog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_ =\n    goog.userAgent.MAC && goog.userAgent.GECKO;\n\n\n/**\n * Records the keycode for browsers that only returns the keycode for key up/\n * down events. For browser/key combinations that doesn't trigger a key pressed\n * event it also fires the patched key event.\n * @param {goog.events.BrowserEvent} e The key down event.\n * @private\n */\ngoog.events.KeyHandler.prototype.handleKeyDown_ = function(e) {\n  // Ctrl-Tab and Alt-Tab can cause the focus to be moved to another window\n  // before we've caught a key-up event.  If the last-key was one of these we\n  // reset the state.\n  if (goog.userAgent.WEBKIT || goog.userAgent.EDGE) {\n    if (this.lastKey_ == goog.events.KeyCodes.CTRL && !e.ctrlKey ||\n        this.lastKey_ == goog.events.KeyCodes.ALT && !e.altKey ||\n        goog.userAgent.MAC && this.lastKey_ == goog.events.KeyCodes.META &&\n            !e.metaKey) {\n      this.resetState();\n    }\n  }\n\n  if (this.lastKey_ == -1) {\n    if (e.ctrlKey && e.keyCode != goog.events.KeyCodes.CTRL) {\n      this.lastKey_ = goog.events.KeyCodes.CTRL;\n    } else if (e.altKey && e.keyCode != goog.events.KeyCodes.ALT) {\n      this.lastKey_ = goog.events.KeyCodes.ALT;\n    } else if (e.metaKey && e.keyCode != goog.events.KeyCodes.META) {\n      this.lastKey_ = goog.events.KeyCodes.META;\n    }\n  }\n\n  if (goog.events.KeyHandler.USES_KEYDOWN_ &&\n      !goog.events.KeyCodes.firesKeyPressEvent(\n          e.keyCode, this.lastKey_, e.shiftKey, e.ctrlKey, e.altKey,\n          e.metaKey)) {\n    this.handleEvent(e);\n  } else {\n    this.keyCode_ = goog.events.KeyCodes.normalizeKeyCode(e.keyCode);\n    if (goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_) {\n      this.altKey_ = e.altKey;\n    }\n  }\n};\n\n\n/**\n * Resets the stored previous values. Needed to be called for webkit which will\n * not generate a key up for meta key operations. This should only be called\n * when having finished with repeat key possibilities.\n */\ngoog.events.KeyHandler.prototype.resetState = function() {\n  this.lastKey_ = -1;\n  this.keyCode_ = -1;\n};\n\n\n/**\n * Clears the stored previous key value, resetting the key repeat status. Uses\n * -1 because the Safari 3 Windows beta reports 0 for certain keys (like Home\n * and End.)\n * @param {goog.events.BrowserEvent} e The keyup event.\n * @private\n */\ngoog.events.KeyHandler.prototype.handleKeyup_ = function(e) {\n  this.resetState();\n  this.altKey_ = e.altKey;\n};\n\n\n/**\n * Handles the events on the element.\n * @param {goog.events.BrowserEvent} e  The keyboard event sent from the\n *     browser.\n */\ngoog.events.KeyHandler.prototype.handleEvent = function(e) {\n  var be = e.getBrowserEvent();\n  var keyCode, charCode;\n  var altKey = be.altKey;\n\n  // IE reports the character code in the keyCode field for keypress events.\n  // There are two exceptions however, Enter and Escape.\n  if (goog.userAgent.IE && e.type == goog.events.EventType.KEYPRESS) {\n    keyCode = this.keyCode_;\n    charCode = keyCode != goog.events.KeyCodes.ENTER &&\n            keyCode != goog.events.KeyCodes.ESC ?\n        be.keyCode :\n        0;\n\n    // Safari reports the character code in the keyCode field for keypress\n    // events but also has a charCode field.\n  } else if (\n      (goog.userAgent.WEBKIT || goog.userAgent.EDGE) &&\n      e.type == goog.events.EventType.KEYPRESS) {\n    keyCode = this.keyCode_;\n    charCode = be.charCode >= 0 && be.charCode < 63232 &&\n            goog.events.KeyCodes.isCharacterKey(keyCode) ?\n        be.charCode :\n        0;\n\n    // Opera reports the keycode or the character code in the keyCode field.\n  } else if (goog.userAgent.OPERA && !goog.userAgent.WEBKIT) {\n    keyCode = this.keyCode_;\n    charCode = goog.events.KeyCodes.isCharacterKey(keyCode) ? be.keyCode : 0;\n\n    // Mozilla reports the character code in the charCode field.\n  } else {\n    if (e.type == goog.events.EventType.KEYPRESS) {\n      if (goog.events.KeyHandler.SAVE_ALT_FOR_KEYPRESS_) {\n        altKey = this.altKey_;\n      }\n\n      // Newer versions of Firefox will set the keyCode of non-function keys to\n      // be the same as charCode. We need to account for this and update the\n      // key event values accordingly. See\n      // https://github.com/google/closure-library/issues/932 for more details.\n      if (be.keyCode == be.charCode) {\n        // Adjust any function key (ie. non-printable, such as ESC or\n        // backspace) to not have a charCode. We don't want these keys to\n        // accidentally be interpreted as insertable characters.\n        if (be.keyCode < 0x20) {\n          keyCode = be.keyCode;\n          charCode = 0;\n        } else {\n          // For character keys, we want to use the preserved key code rather\n          // than the keyCode on the browser event, which now uses the charCode.\n          // These differ (eg. pressing 'a' gives keydown with keyCode = 65,\n          // keypress with keyCode = charCode = 97) and so we need to account\n          // for this.\n          keyCode = this.keyCode_;\n          charCode = be.charCode;\n        }\n      } else {\n        keyCode = be.keyCode || this.keyCode_;\n        charCode = be.charCode || 0;\n      }\n    } else {\n      keyCode = be.keyCode || this.keyCode_;\n      charCode = be.charCode || 0;\n    }\n\n    // On the Mac, shift-/ triggers a question mark char code and no key code\n    // (WIN_KEY_FF_LINUX), so we synthesize the latter.\n    if (goog.userAgent.MAC && charCode == goog.events.KeyCodes.QUESTION_MARK &&\n        keyCode == goog.events.KeyCodes.WIN_KEY) {\n      keyCode = goog.events.KeyCodes.SLASH;\n    }\n  }\n\n  keyCode = goog.events.KeyCodes.normalizeKeyCode(keyCode);\n  var key = keyCode;\n\n  // Correct the key value for certain browser-specific quirks.\n  if (keyCode) {\n    if (keyCode >= 63232 && keyCode in goog.events.KeyHandler.safariKey_) {\n      // NOTE(nicksantos): Safari 3 has fixed this problem,\n      // this is only needed for Safari 2.\n      key = goog.events.KeyHandler.safariKey_[keyCode];\n    } else {\n      // Safari returns 25 for Shift+Tab instead of 9.\n      if (keyCode == 25 && e.shiftKey) {\n        key = 9;\n      }\n    }\n  } else if (\n      be.keyIdentifier &&\n      be.keyIdentifier in goog.events.KeyHandler.keyIdentifier_) {\n    // This is needed for Safari Windows because it currently doesn't give a\n    // keyCode/which for non printable keys.\n    key = goog.events.KeyHandler.keyIdentifier_[be.keyIdentifier];\n  }\n\n  // If this was a redundant keypress event, we ignore it to avoid double-firing\n  // an event as the event would've been handled by KEYDOWN. Gecko is currently\n  // in the process of removing keypress events for non-printable characters\n  // (https://bugzilla.mozilla.org/show_bug.cgi?id=968056) so we simulate this\n  // logic here for older Gecko versions which still fire the events.\n  if (goog.userAgent.GECKO && goog.events.KeyHandler.USES_KEYDOWN_ &&\n      e.type == goog.events.EventType.KEYPRESS &&\n      !goog.events.KeyCodes.firesKeyPressEvent(\n          key, this.lastKey_, e.shiftKey, e.ctrlKey, altKey, e.metaKey)) {\n    return;\n  }\n\n  // If we get the same keycode as a keydown/keypress without having seen a\n  // keyup event, then this event was caused by key repeat.\n  var repeat = key == this.lastKey_;\n  this.lastKey_ = key;\n\n  var event = new goog.events.KeyEvent(key, charCode, repeat, be);\n  event.altKey = altKey;\n  this.dispatchEvent(event);\n};\n\n\n/**\n * Returns the element listened on for the real keyboard events.\n * @return {Element|Document|null} The element listened on for the real\n *     keyboard events.\n */\ngoog.events.KeyHandler.prototype.getElement = function() {\n  return this.element_;\n};\n\n\n/**\n * Adds the proper key event listeners to the element.\n * @param {Element|Document} element The element to listen on.\n * @param {boolean=} opt_capture Whether to listen for browser events in\n *     capture phase (defaults to false).\n */\ngoog.events.KeyHandler.prototype.attach = function(element, opt_capture) {\n  if (this.keyUpKey_) {\n    this.detach();\n  }\n\n  this.element_ = element;\n\n  this.keyPressKey_ = goog.events.listen(\n      this.element_, goog.events.EventType.KEYPRESS, this, opt_capture);\n\n  // Most browsers (Safari 2 being the notable exception) doesn't include the\n  // keyCode in keypress events (IE has the char code in the keyCode field and\n  // Mozilla only included the keyCode if there's no charCode). Thus we have to\n  // listen for keydown to capture the keycode.\n  this.keyDownKey_ = goog.events.listen(\n      this.element_, goog.events.EventType.KEYDOWN, this.handleKeyDown_,\n      opt_capture, this);\n\n\n  this.keyUpKey_ = goog.events.listen(\n      this.element_, goog.events.EventType.KEYUP, this.handleKeyup_,\n      opt_capture, this);\n};\n\n\n/**\n * Removes the listeners that may exist.\n */\ngoog.events.KeyHandler.prototype.detach = function() {\n  if (this.keyPressKey_) {\n    goog.events.unlistenByKey(this.keyPressKey_);\n    goog.events.unlistenByKey(this.keyDownKey_);\n    goog.events.unlistenByKey(this.keyUpKey_);\n    this.keyPressKey_ = null;\n    this.keyDownKey_ = null;\n    this.keyUpKey_ = null;\n  }\n  this.element_ = null;\n  this.lastKey_ = -1;\n  this.keyCode_ = -1;\n};\n\n\n/** @override */\ngoog.events.KeyHandler.prototype.disposeInternal = function() {\n  goog.events.KeyHandler.superClass_.disposeInternal.call(this);\n  this.detach();\n};\n\n\n\n/**\n * This class is used for the goog.events.KeyHandler.EventType.KEY event and\n * it overrides the key code with the fixed key code.\n * @param {number} keyCode The adjusted key code.\n * @param {number} charCode The unicode character code.\n * @param {boolean} repeat Whether this event was generated by keyboard repeat.\n * @param {Event} browserEvent Browser event object.\n * @constructor\n * @extends {goog.events.BrowserEvent}\n * @final\n */\ngoog.events.KeyEvent = function(keyCode, charCode, repeat, browserEvent) {\n  goog.events.BrowserEvent.call(this, browserEvent);\n  this.type = goog.events.KeyHandler.EventType.KEY;\n\n  /**\n   * Keycode of key press.\n   * @type {number}\n   */\n  this.keyCode = keyCode;\n\n  /**\n   * Unicode character code.\n   * @type {number}\n   */\n  this.charCode = charCode;\n\n  /**\n   * True if this event was generated by keyboard auto-repeat (i.e., the user is\n   * holding the key down.)\n   * @type {boolean}\n   */\n  this.repeat = repeat;\n};\ngoog.inherits(goog.events.KeyEvent, goog.events.BrowserEvent);\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:L","^:S","^:I","^<4","^>R","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/keyhandler.js"],"^:1",["^9K",["^?I","~$goog.events.KeyHandler.EventType","~$goog.events.KeyEvent"]],"^9<",true,"^9=",["^9>","^:N","^<4","^:L","^:I","^>R","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.modalpopup.js","^9C",["^9D","goog/ui/modalpopup.js"],"^9E","goog/ui/modalpopup.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class for showing simple modal popup.\n * @author chrishenry@google.com (Chris Henry)\n */\n\ngoog.provide('goog.ui.ModalPopup');\n\ngoog.require('goog.Timer');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.animationFrame');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.dom.iframe');\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.FocusHandler');\ngoog.require('goog.fx.Transition');\ngoog.require('goog.string');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.ModalAriaVisibilityHelper');\ngoog.require('goog.ui.PopupBase');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Base class for modal popup UI components. This can also be used as\n * a standalone component to render a modal popup with an empty div.\n *\n * WARNING: goog.ui.ModalPopup is only guaranteed to work when it is rendered\n * directly in the 'body' element.\n *\n * The Html structure of the modal popup is:\n * <pre>\n *  Element         Function              Class-name, goog-modalpopup = default\n * ----------------------------------------------------------------------------\n * - iframe         Iframe mask           goog-modalpopup-bg\n * - div            Background mask       goog-modalpopup-bg\n * - div            Modal popup area      goog-modalpopup\n * - span           Tab catcher\n * </pre>\n * @constructor\n * @param {boolean=} opt_useIframeMask Work around windowed controls z-index\n *     issue by using an iframe instead of a div for bg element.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper; see {@link\n *     goog.ui.Component} for semantics.\n * @extends {goog.ui.Component}\n */\ngoog.ui.ModalPopup = function(opt_useIframeMask, opt_domHelper) {\n  goog.ui.ModalPopup.base(this, 'constructor', opt_domHelper);\n\n  /**\n   * Whether the modal popup should use an iframe as the background\n   * element to work around z-order issues.\n   * @type {boolean}\n   * @private\n   */\n  this.useIframeMask_ = !!opt_useIframeMask;\n\n  /**\n   * The element that had focus before the popup was displayed.\n   * @type {?Element}\n   * @private\n   */\n  this.lastFocus_ = null;\n\n  /**\n   * The animation task that resizes the background, scheduled to run in the\n   * next animation frame.\n   * @type {function(...?)}\n   * @private\n   */\n  this.resizeBackgroundTask_ = goog.dom.animationFrame.createTask(\n      {mutate: this.resizeBackground_}, this);\n};\ngoog.inherits(goog.ui.ModalPopup, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.ModalPopup);\n\n\n/**\n * Focus handler. It will be initialized in enterDocument.\n * @type {?goog.events.FocusHandler}\n * @private\n */\ngoog.ui.ModalPopup.prototype.focusHandler_ = null;\n\n\n/**\n * Whether the modal popup is visible.\n * @type {boolean}\n * @private\n */\ngoog.ui.ModalPopup.prototype.visible_ = false;\n\n\n/**\n * Element for the background which obscures the UI and blocks events.\n * @type {?Element}\n * @private\n */\ngoog.ui.ModalPopup.prototype.bgEl_ = null;\n\n\n/**\n * Iframe element that is only used for IE as a workaround to keep select-type\n * elements from burning through background.\n * @type {?Element}\n * @private\n */\ngoog.ui.ModalPopup.prototype.bgIframeEl_ = null;\n\n\n/**\n * Element used to catch focus and prevent the user from tabbing out\n * of the popup.\n * @type {?Element}\n * @private\n */\ngoog.ui.ModalPopup.prototype.tabCatcherElement_ = null;\n\n\n/**\n * Whether the modal popup is in the process of wrapping focus from the top of\n * the popup to the last tabbable element.\n * @type {boolean}\n * @private\n */\ngoog.ui.ModalPopup.prototype.backwardTabWrapInProgress_ = false;\n\n\n/**\n * Transition to show the popup.\n * @type {goog.fx.Transition}\n * @private\n */\ngoog.ui.ModalPopup.prototype.popupShowTransition_;\n\n\n/**\n * Transition to hide the popup.\n * @type {goog.fx.Transition}\n * @private\n */\ngoog.ui.ModalPopup.prototype.popupHideTransition_;\n\n\n/**\n * Transition to show the background.\n * @type {goog.fx.Transition}\n * @private\n */\ngoog.ui.ModalPopup.prototype.bgShowTransition_;\n\n\n/**\n * Transition to hide the background.\n * @type {goog.fx.Transition}\n * @private\n */\ngoog.ui.ModalPopup.prototype.bgHideTransition_;\n\n\n/**\n * Helper object to control aria visibility of the rest of the page.\n * @type {goog.ui.ModalAriaVisibilityHelper}\n * @private\n */\ngoog.ui.ModalPopup.prototype.modalAriaVisibilityHelper_;\n\n\n/**\n * @return {string} Base CSS class for this component.\n * @protected\n */\ngoog.ui.ModalPopup.prototype.getCssClass = function() {\n  return goog.getCssName('goog-modalpopup');\n};\n\n\n/**\n * Returns the background iframe mask element, if any.\n * @return {Element} The background iframe mask element, may return\n *     null/undefined if the modal popup does not use iframe mask.\n */\ngoog.ui.ModalPopup.prototype.getBackgroundIframe = function() {\n  return this.bgIframeEl_;\n};\n\n\n/**\n * Returns the background mask element.\n * @return {Element} The background mask element.\n */\ngoog.ui.ModalPopup.prototype.getBackgroundElement = function() {\n  return this.bgEl_;\n};\n\n\n/**\n * Creates the initial DOM representation for the modal popup.\n * @override\n */\ngoog.ui.ModalPopup.prototype.createDom = function() {\n  // Create the modal popup element, and make sure it's hidden.\n  goog.ui.ModalPopup.base(this, 'createDom');\n\n  var element = this.getElement();\n  goog.asserts.assert(element);\n  var allClasses = goog.string.trim(this.getCssClass()).split(' ');\n  goog.dom.classlist.addAll(element, allClasses);\n  goog.dom.setFocusableTabIndex(element, true);\n  goog.style.setElementShown(element, false);\n\n  // Manages the DOM for background mask elements.\n  this.manageBackgroundDom_();\n  this.createTabCatcher_();\n};\n\n\n/**\n * Creates and disposes of the DOM for background mask elements.\n * @private\n */\ngoog.ui.ModalPopup.prototype.manageBackgroundDom_ = function() {\n  if (this.useIframeMask_ && !this.bgIframeEl_) {\n    // IE renders the iframe on top of the select elements while still\n    // respecting the z-index of the other elements on the page.  See\n    // http://support.microsoft.com/kb/177378 for more information.\n    // Flash and other controls behave in similar ways for other browsers\n    this.bgIframeEl_ = goog.dom.iframe.createBlank(this.getDomHelper());\n    this.bgIframeEl_.className = goog.getCssName(this.getCssClass(), 'bg');\n    goog.style.setElementShown(this.bgIframeEl_, false);\n    goog.style.setOpacity(this.bgIframeEl_, 0);\n  }\n\n  // Create the backgound mask, initialize its opacity, and make sure it's\n  // hidden.\n  if (!this.bgEl_) {\n    this.bgEl_ = this.getDomHelper().createDom(\n        goog.dom.TagName.DIV, goog.getCssName(this.getCssClass(), 'bg'));\n    goog.style.setElementShown(this.bgEl_, false);\n  }\n};\n\n\n/**\n * Creates the tab catcher element.\n * @private\n */\ngoog.ui.ModalPopup.prototype.createTabCatcher_ = function() {\n  // Creates tab catcher element.\n  if (!this.tabCatcherElement_) {\n    this.tabCatcherElement_ =\n        this.getDomHelper().createElement(goog.dom.TagName.SPAN);\n    goog.style.setElementShown(this.tabCatcherElement_, false);\n    goog.dom.setFocusableTabIndex(this.tabCatcherElement_, true);\n    this.tabCatcherElement_.style.position = 'absolute';\n  }\n};\n\n\n/**\n * Allow a shift-tab from the top of the modal popup to the last tabbable\n * element by moving focus to the tab catcher. This should be called after\n * catching a wrapping shift-tab event and before allowing it to propagate, so\n * that focus will land on the last tabbable element before the tab catcher.\n * @protected\n */\ngoog.ui.ModalPopup.prototype.setupBackwardTabWrap = function() {\n  this.backwardTabWrapInProgress_ = true;\n  try {\n    this.tabCatcherElement_.focus();\n  } catch (e) {\n    // Swallow this. IE can throw an error if the element can not be focused.\n  }\n  // Reset the flag on a timer in case anything goes wrong with the followup\n  // event.\n  goog.Timer.callOnce(this.resetBackwardTabWrap_, 0, this);\n};\n\n\n/**\n * Resets the backward tab wrap flag.\n * @private\n */\ngoog.ui.ModalPopup.prototype.resetBackwardTabWrap_ = function() {\n  this.backwardTabWrapInProgress_ = false;\n};\n\n\n/**\n * Renders the background mask.\n * @private\n */\ngoog.ui.ModalPopup.prototype.renderBackground_ = function() {\n  goog.asserts.assert(!!this.bgEl_, 'Background element must not be null.');\n  if (this.bgIframeEl_) {\n    goog.dom.insertSiblingBefore(this.bgIframeEl_, this.getElement());\n  }\n  goog.dom.insertSiblingBefore(this.bgEl_, this.getElement());\n};\n\n\n/** @override */\ngoog.ui.ModalPopup.prototype.canDecorate = function(element) {\n  // Assume we can decorate any DIV.\n  return !!element && element.tagName == goog.dom.TagName.DIV;\n};\n\n\n/** @override */\ngoog.ui.ModalPopup.prototype.decorateInternal = function(element) {\n  // Decorate the modal popup area element.\n  goog.ui.ModalPopup.base(this, 'decorateInternal', element);\n  var allClasses = goog.string.trim(this.getCssClass()).split(' ');\n\n  goog.dom.classlist.addAll(goog.asserts.assert(this.getElement()), allClasses);\n\n  // Create the background mask...\n  this.manageBackgroundDom_();\n  this.createTabCatcher_();\n\n  // Make sure the decorated modal popup is focusable and hidden.\n  goog.dom.setFocusableTabIndex(this.getElement(), true);\n  goog.style.setElementShown(this.getElement(), false);\n};\n\n\n/** @override */\ngoog.ui.ModalPopup.prototype.enterDocument = function() {\n  this.renderBackground_();\n  goog.ui.ModalPopup.base(this, 'enterDocument');\n\n  goog.dom.insertSiblingAfter(this.tabCatcherElement_, this.getElement());\n\n  this.focusHandler_ =\n      new goog.events.FocusHandler(this.getDomHelper().getDocument());\n\n  // We need to watch the entire document so that we can detect when the\n  // focus is moved out of this modal popup.\n  this.getHandler().listen(\n      this.focusHandler_, goog.events.FocusHandler.EventType.FOCUSIN,\n      this.onFocus);\n  this.setA11YDetectBackground(false);\n};\n\n\n/** @override */\ngoog.ui.ModalPopup.prototype.exitDocument = function() {\n  if (this.isVisible()) {\n    this.setVisible(false);\n  }\n\n  goog.dispose(this.focusHandler_);\n\n  goog.ui.ModalPopup.base(this, 'exitDocument');\n  goog.dom.removeNode(this.bgIframeEl_);\n  goog.dom.removeNode(this.bgEl_);\n  goog.dom.removeNode(this.tabCatcherElement_);\n};\n\n\n/**\n * Sets the visibility of the modal popup box and focus to the popup.\n * @param {boolean} visible Whether the modal popup should be visible.\n */\ngoog.ui.ModalPopup.prototype.setVisible = function(visible) {\n  goog.asserts.assert(\n      this.isInDocument(), 'ModalPopup must be rendered first.');\n\n  if (visible == this.visible_) {\n    return;\n  }\n\n  if (this.popupShowTransition_) this.popupShowTransition_.stop();\n  if (this.bgShowTransition_) this.bgShowTransition_.stop();\n  if (this.popupHideTransition_) this.popupHideTransition_.stop();\n  if (this.bgHideTransition_) this.bgHideTransition_.stop();\n\n  if (this.isInDocument()) {\n    this.setA11YDetectBackground(visible);\n  }\n  if (visible) {\n    this.show_();\n  } else {\n    this.hide_();\n  }\n};\n\n\n/**\n * Sets aria-hidden on the rest of the page to restrict screen reader focus.\n * Top-level elements with an explicit aria-hidden state are not altered.\n * @param {boolean} hide Whether to hide or show the rest of the page.\n * @protected\n */\ngoog.ui.ModalPopup.prototype.setA11YDetectBackground = function(hide) {\n  if (!this.modalAriaVisibilityHelper_) {\n    this.modalAriaVisibilityHelper_ = new goog.ui.ModalAriaVisibilityHelper(\n        this.getElementStrict(), this.dom_);\n  }\n  this.modalAriaVisibilityHelper_.setBackgroundVisibility(hide);\n};\n\n\n/**\n * Sets the transitions to show and hide the popup and background.\n * @param {!goog.fx.Transition} popupShowTransition Transition to show the\n *     popup.\n * @param {!goog.fx.Transition} popupHideTransition Transition to hide the\n *     popup.\n * @param {!goog.fx.Transition} bgShowTransition Transition to show\n *     the background.\n * @param {!goog.fx.Transition} bgHideTransition Transition to hide\n *     the background.\n */\ngoog.ui.ModalPopup.prototype.setTransition = function(\n    popupShowTransition, popupHideTransition, bgShowTransition,\n    bgHideTransition) {\n  this.popupShowTransition_ = popupShowTransition;\n  this.popupHideTransition_ = popupHideTransition;\n  this.bgShowTransition_ = bgShowTransition;\n  this.bgHideTransition_ = bgHideTransition;\n};\n\n\n/**\n * Shows the popup.\n * @private\n */\ngoog.ui.ModalPopup.prototype.show_ = function() {\n  if (!this.dispatchEvent(goog.ui.PopupBase.EventType.BEFORE_SHOW)) {\n    return;\n  }\n\n  try {\n    this.lastFocus_ = this.getDomHelper().getDocument().activeElement;\n  } catch (e) {\n    // Focus-related actions often throw exceptions.\n    // Sample past issue: https://bugzilla.mozilla.org/show_bug.cgi?id=656283\n  }\n  this.resizeBackground_();\n  this.reposition();\n\n  // Listen for keyboard and resize events while the modal popup is visible.\n  this.getHandler()\n      .listen(\n          this.getDomHelper().getWindow(), goog.events.EventType.RESIZE,\n          this.resizeBackground_)\n      .listen(\n          this.getDomHelper().getWindow(),\n          goog.events.EventType.ORIENTATIONCHANGE, this.resizeBackgroundTask_);\n\n  this.showPopupElement_(true);\n  this.focus();\n  this.visible_ = true;\n\n  if (this.popupShowTransition_ && this.bgShowTransition_) {\n    goog.events.listenOnce(\n        /** @type {!goog.events.EventTarget} */ (this.popupShowTransition_),\n        goog.fx.Transition.EventType.END, this.onShow, false, this);\n    this.bgShowTransition_.play();\n    this.popupShowTransition_.play();\n  } else {\n    this.onShow();\n  }\n};\n\n\n/**\n * Hides the popup.\n * @private\n */\ngoog.ui.ModalPopup.prototype.hide_ = function() {\n  if (!this.dispatchEvent(goog.ui.PopupBase.EventType.BEFORE_HIDE)) {\n    return;\n  }\n\n  // Stop listening for keyboard and resize events while the modal\n  // popup is hidden.\n  this.getHandler()\n      .unlisten(\n          this.getDomHelper().getWindow(), goog.events.EventType.RESIZE,\n          this.resizeBackground_)\n      .unlisten(\n          this.getDomHelper().getWindow(),\n          goog.events.EventType.ORIENTATIONCHANGE, this.resizeBackgroundTask_);\n\n  // Set visibility to hidden even if there is a transition. This\n  // reduces complexity in subclasses who may want to override\n  // setVisible (such as goog.ui.Dialog).\n  this.visible_ = false;\n\n  if (this.popupHideTransition_ && this.bgHideTransition_) {\n    goog.events.listenOnce(\n        /** @type {!goog.events.EventTarget} */ (this.popupHideTransition_),\n        goog.fx.Transition.EventType.END, this.onHide, false, this);\n    this.bgHideTransition_.play();\n    // The transition whose END event you are listening to must be played last\n    // to prevent errors when disposing on hide event, which occur on browsers\n    // that do not support CSS3 transitions.\n    this.popupHideTransition_.play();\n  } else {\n    this.onHide();\n  }\n\n  this.returnFocus_();\n};\n\n\n/**\n * Attempts to return the focus back to the element that had it before the popup\n * was opened.\n * @private\n */\ngoog.ui.ModalPopup.prototype.returnFocus_ = function() {\n  try {\n    var dom = this.getDomHelper();\n    var body = dom.getDocument().body;\n    var active = dom.getDocument().activeElement || body;\n    if (!this.lastFocus_ || this.lastFocus_ == body) {\n      this.lastFocus_ = null;\n      return;\n    }\n    // We only want to move the focus if we actually have it, i.e.:\n    //  - if we immediately hid the popup the focus should have moved to the\n    // body element\n    //  - if there is a hiding transition in progress the focus would still be\n    // within the dialog and it is safe to move it if the current focused\n    // element is a child of the dialog\n    if (active == body || dom.contains(this.getElement(), active)) {\n      this.lastFocus_.focus();\n    }\n  } catch (e) {\n    // Swallow this. IE can throw an error if the element can not be focused.\n  }\n  // Explicitly want to null this out even if there was an error focusing to\n  // avoid bleed over between dialog invocations.\n  this.lastFocus_ = null;\n};\n\n\n/**\n * Shows or hides the popup element.\n * @param {boolean} visible Shows the popup element if true, hides if false.\n * @private\n */\ngoog.ui.ModalPopup.prototype.showPopupElement_ = function(visible) {\n  if (this.bgIframeEl_) {\n    goog.style.setElementShown(this.bgIframeEl_, visible);\n  }\n  if (this.bgEl_) {\n    goog.style.setElementShown(this.bgEl_, visible);\n  }\n  goog.style.setElementShown(this.getElement(), visible);\n  goog.style.setElementShown(this.tabCatcherElement_, visible);\n};\n\n\n/**\n * Called after the popup is shown. If there is a transition, this\n * will be called after the transition completed or stopped.\n * @protected\n */\ngoog.ui.ModalPopup.prototype.onShow = function() {\n  this.dispatchEvent(goog.ui.PopupBase.EventType.SHOW);\n};\n\n\n/**\n * Called after the popup is hidden. If there is a transition, this\n * will be called after the transition completed or stopped.\n * @protected\n */\ngoog.ui.ModalPopup.prototype.onHide = function() {\n  this.showPopupElement_(false);\n  this.dispatchEvent(goog.ui.PopupBase.EventType.HIDE);\n};\n\n\n/**\n * @return {boolean} Whether the modal popup is visible.\n */\ngoog.ui.ModalPopup.prototype.isVisible = function() {\n  return this.visible_;\n};\n\n\n/**\n * Focuses on the modal popup.\n */\ngoog.ui.ModalPopup.prototype.focus = function() {\n  this.focusElement_();\n};\n\n\n/**\n * Make the background element the size of the document.\n *\n * NOTE(user): We must hide the background element before measuring the\n * document, otherwise the size of the background will stop the document from\n * shrinking to fit a smaller window.  This does cause a slight flicker in Linux\n * browsers, but should not be a common scenario.\n * @private\n */\ngoog.ui.ModalPopup.prototype.resizeBackground_ = function() {\n  if (this.bgIframeEl_) {\n    goog.style.setElementShown(this.bgIframeEl_, false);\n  }\n  if (this.bgEl_) {\n    goog.style.setElementShown(this.bgEl_, false);\n  }\n\n  var doc = this.getDomHelper().getDocument();\n  var win = goog.dom.getWindow(doc) || window;\n\n  // Take the max of document height and view height, in case the document does\n  // not fill the viewport. Read from both the body element and the html element\n  // to account for browser differences in treatment of absolutely-positioned\n  // content.\n  var viewSize = goog.dom.getViewportSize(win);\n  var w = Math.max(\n      viewSize.width,\n      Math.max(doc.body.scrollWidth, doc.documentElement.scrollWidth));\n  var h = Math.max(\n      viewSize.height,\n      Math.max(doc.body.scrollHeight, doc.documentElement.scrollHeight));\n\n  if (this.bgIframeEl_) {\n    goog.style.setElementShown(this.bgIframeEl_, true);\n    goog.style.setSize(this.bgIframeEl_, w, h);\n  }\n  if (this.bgEl_) {\n    goog.style.setElementShown(this.bgEl_, true);\n    goog.style.setSize(this.bgEl_, w, h);\n  }\n};\n\n\n/**\n * Centers the modal popup in the viewport, taking scrolling into account.\n */\ngoog.ui.ModalPopup.prototype.reposition = function() {\n  // TODO(chrishenry): Make this use goog.positioning as in goog.ui.PopupBase?\n\n  // Get the current viewport to obtain the scroll offset.\n  var doc = this.getDomHelper().getDocument();\n  var win = goog.dom.getWindow(doc) || window;\n  if (goog.style.getComputedPosition(this.getElement()) == 'fixed') {\n    var x = 0;\n    var y = 0;\n  } else {\n    var scroll = this.getDomHelper().getDocumentScroll();\n    var x = scroll.x;\n    var y = scroll.y;\n  }\n\n  var popupSize = goog.style.getSize(this.getElement());\n  var viewSize = goog.dom.getViewportSize(win);\n\n  // Make sure left and top are non-negatives.\n  var left = Math.max(x + viewSize.width / 2 - popupSize.width / 2, 0);\n  var top = Math.max(y + viewSize.height / 2 - popupSize.height / 2, 0);\n  goog.style.setPosition(this.getElement(), left, top);\n\n  // We place the tab catcher at the same position as the dialog to\n  // prevent IE from scrolling when users try to tab out of the dialog.\n  goog.style.setPosition(this.tabCatcherElement_, left, top);\n};\n\n\n/**\n * Handles focus events.  Makes sure that if the user tabs past the\n * elements in the modal popup, the focus wraps back to the beginning, and that\n * if the user shift-tabs past the front of the modal popup, focus wraps around\n * to the end.\n * @param {goog.events.BrowserEvent} e Browser's event object.\n * @protected\n */\ngoog.ui.ModalPopup.prototype.onFocus = function(e) {\n  if (this.backwardTabWrapInProgress_) {\n    this.resetBackwardTabWrap_();\n  } else if (e.target == this.tabCatcherElement_) {\n    goog.Timer.callOnce(this.focusElement_, 0, this);\n  }\n};\n\n\n/**\n * Returns the magic tab catcher element used to detect when the user has\n * rolled focus off of the popup content.  It is automatically created during\n * the createDom method() and can be used by subclasses to implement custom\n * tab-loop behavior.\n * @return {Element} The tab catcher element.\n * @protected\n */\ngoog.ui.ModalPopup.prototype.getTabCatcherElement = function() {\n  return this.tabCatcherElement_;\n};\n\n\n/**\n * Moves the focus to the modal popup.\n * @private\n */\ngoog.ui.ModalPopup.prototype.focusElement_ = function() {\n  try {\n    if (goog.userAgent.IE) {\n      // In IE, we must first focus on the body or else focussing on a\n      // sub-element will not work.\n      this.getDomHelper().getDocument().body.focus();\n    }\n    this.getElement().focus();\n  } catch (e) {\n    // Swallow this. IE can throw an error if the element can not be focused.\n  }\n};\n\n\n/** @override */\ngoog.ui.ModalPopup.prototype.disposeInternal = function() {\n  goog.dispose(this.popupShowTransition_);\n  this.popupShowTransition_ = null;\n\n  goog.dispose(this.popupHideTransition_);\n  this.popupHideTransition_ = null;\n\n  goog.dispose(this.bgShowTransition_);\n  this.bgShowTransition_ = null;\n\n  goog.dispose(this.bgHideTransition_);\n  this.bgHideTransition_ = null;\n\n  goog.ui.ModalPopup.base(this, 'disposeInternal');\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^><","^:;","~$goog.dom.animationFrame","^<=","^9L","^:=","^9>","^:S","~$goog.ui.ModalAriaVisibilityHelper","^:I","^>Q","^>>","^<3","~$goog.events.FocusHandler","^:N","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/modalpopup.js"],"^:1",["^9K",["~$goog.ui.ModalPopup"]],"^9<",true,"^9=",["^9>","^><","^:E","^;;","^;=","^A?","^:;","^>>","^:N","^:I","^AA","^>Q","^9L","^<3","^:=","^A@","^<=","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.zippy.js","^9C",["^9D","goog/ui/zippy.js"],"^9E","goog/ui/zippy.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Zippy widget implementation.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/zippy.html\n */\n\ngoog.provide('goog.ui.Zippy');\ngoog.provide('goog.ui.Zippy.Events');\ngoog.provide('goog.ui.ZippyEvent');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.dom');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.events.KeyHandler');\ngoog.require('goog.style');\n\n\n\n/**\n * Zippy widget. Expandable/collapsible container, clicking the header toggles\n * the visibility of the content.\n *\n * @extends {goog.events.EventTarget}\n * @param {Element|string|null} header Header element, either element\n *     reference, string id or null if no header exists.\n * @param {Element|string|function():Element=} opt_content Content element\n *     (if any), either element reference or string id.  If skipped, the caller\n *     should handle the TOGGLE event in its own way. If a function is passed,\n *     then if will be called to create the content element the first time the\n *     zippy is expanded.\n * @param {boolean=} opt_expanded Initial expanded/visibility state. If\n *     undefined, attempts to infer the state from the DOM. Setting visibility\n *     using one of the standard Soy templates guarantees correct inference.\n * @param {Element|string=} opt_expandedHeader Element to use as the header when\n *     the zippy is expanded.\n * @param {goog.dom.DomHelper=} opt_domHelper An optional DOM helper.\n * @param {goog.a11y.aria.Role<string>=} opt_role ARIA role, default TAB.\n * @constructor\n */\ngoog.ui.Zippy = function(\n    header, opt_content, opt_expanded, opt_expandedHeader, opt_domHelper,\n    opt_role) {\n  goog.ui.Zippy.base(this, 'constructor');\n\n  /**\n   * DomHelper used to interact with the document, allowing components to be\n   * created in a different window.\n   * @type {!goog.dom.DomHelper}\n   * @private\n   */\n  this.dom_ = opt_domHelper || goog.dom.getDomHelper();\n\n  /**\n   * Header element or null if no header exists.\n   * @type {Element}\n   * @private\n   */\n  this.elHeader_ = this.dom_.getElement(header) || null;\n\n  /**\n   * When present, the header to use when the zippy is expanded.\n   * @type {Element}\n   * @private\n   */\n  this.elExpandedHeader_ = this.dom_.getElement(opt_expandedHeader || null);\n\n  /**\n   * Function that will create the content element, or false if there is no such\n   * function.\n   * @type {?function():Element}\n   * @private\n   */\n  this.lazyCreateFunc_ = goog.isFunction(opt_content) ? opt_content : null;\n\n  /**\n   * ARIA role.\n   * @type {goog.a11y.aria.Role<string>}\n   * @private\n   */\n  this.role_ = opt_role || goog.a11y.aria.Role.TAB;\n\n  /**\n   * Content element.\n   * @type {Element}\n   * @private\n   */\n  this.elContent_ = this.lazyCreateFunc_ || !opt_content ?\n      null :\n      this.dom_.getElement(/** @type {!Element} */ (opt_content));\n\n  /**\n   * Expanded state.\n   * @type {boolean}\n   * @private\n   */\n  this.expanded_ = opt_expanded == true;\n  if (opt_expanded === undefined && !this.lazyCreateFunc_) {\n    // For the dual caption case, we can get expanded_ from the visibility of\n    // the expandedHeader. For the single-caption case, we use the\n    // presence/absence of the relevant class. Using one of the standard Soy\n    // templates guarantees that this will work.\n    if (this.elExpandedHeader_) {\n      this.expanded_ = goog.style.isElementShown(this.elExpandedHeader_);\n    } else if (this.elHeader_) {\n      this.expanded_ = goog.dom.classlist.contains(\n          this.elHeader_, goog.getCssName('goog-zippy-expanded'));\n    }\n  }\n\n\n  /**\n   * A keyboard events handler. If there are two headers it is shared for both.\n   * @type {goog.events.EventHandler<!goog.ui.Zippy>}\n   * @private\n   */\n  this.keyboardEventHandler_ = new goog.events.EventHandler(this);\n\n  /**\n   * The keyhandler used for listening on most key events. This takes care of\n   * abstracting away some of the browser differences.\n   * @private {!goog.events.KeyHandler}\n   */\n  this.keyHandler_ = new goog.events.KeyHandler();\n\n  /**\n   * A mouse events handler. If there are two headers it is shared for both.\n   * @type {goog.events.EventHandler<!goog.ui.Zippy>}\n   * @private\n   */\n  this.mouseEventHandler_ = new goog.events.EventHandler(this);\n\n  var self = this;\n  function addHeaderEvents(el) {\n    if (el) {\n      el.tabIndex = 0;\n      goog.a11y.aria.setRole(el, self.getAriaRole());\n      goog.dom.classlist.add(el, goog.getCssName('goog-zippy-header'));\n      self.enableMouseEventsHandling_(el);\n      self.enableKeyboardEventsHandling_(el);\n    }\n  }\n  addHeaderEvents(this.elHeader_);\n  addHeaderEvents(this.elExpandedHeader_);\n\n  // initialize based on expanded state\n  this.setExpanded(this.expanded_);\n};\ngoog.inherits(goog.ui.Zippy, goog.events.EventTarget);\ngoog.tagUnsealableClass(goog.ui.Zippy);\n\n\n/**\n * Constants for event names\n *\n * @enum {string}\n */\ngoog.ui.Zippy.Events = {\n  // Zippy will dispatch an ACTION event for user interaction. Mimics\n  // `goog.ui.Controls#performActionInternal` by first changing\n  // the toggle state and then dispatching an ACTION event.\n  ACTION: 'action',\n  // Zippy state is toggled from collapsed to expanded or vice versa.\n  TOGGLE: 'toggle'\n};\n\n\n/**\n * Whether to listen for and handle mouse events; defaults to true.\n * @type {boolean}\n * @private\n */\ngoog.ui.Zippy.prototype.handleMouseEvents_ = true;\n\n\n/**\n * Whether to listen for and handle key events; defaults to true.\n * @type {boolean}\n * @private\n */\ngoog.ui.Zippy.prototype.handleKeyEvents_ = true;\n\n\n/** @override */\ngoog.ui.Zippy.prototype.disposeInternal = function() {\n  goog.ui.Zippy.base(this, 'disposeInternal');\n  goog.dispose(this.keyboardEventHandler_);\n  goog.dispose(this.keyHandler_);\n  goog.dispose(this.mouseEventHandler_);\n};\n\n\n/**\n * @return {goog.a11y.aria.Role} The ARIA role to be applied to Zippy element.\n */\ngoog.ui.Zippy.prototype.getAriaRole = function() {\n  return this.role_;\n};\n\n\n/**\n * @return {HTMLElement} The content element.\n */\ngoog.ui.Zippy.prototype.getContentElement = function() {\n  return /** @type {!HTMLElement} */ (this.elContent_);\n};\n\n\n/**\n * @return {Element} The visible header element.\n */\ngoog.ui.Zippy.prototype.getVisibleHeaderElement = function() {\n  var expandedHeader = this.elExpandedHeader_;\n  return expandedHeader && goog.style.isElementShown(expandedHeader) ?\n      expandedHeader :\n      this.elHeader_;\n};\n\n\n/**\n * Expands content pane.\n */\ngoog.ui.Zippy.prototype.expand = function() {\n  this.setExpanded(true);\n};\n\n\n/**\n * Collapses content pane.\n */\ngoog.ui.Zippy.prototype.collapse = function() {\n  this.setExpanded(false);\n};\n\n\n/**\n * Toggles expanded state.\n */\ngoog.ui.Zippy.prototype.toggle = function() {\n  this.setExpanded(!this.expanded_);\n};\n\n\n/**\n * Sets expanded state.\n *\n * @param {boolean} expanded Expanded/visibility state.\n */\ngoog.ui.Zippy.prototype.setExpanded = function(expanded) {\n  if (this.elContent_) {\n    // Hide the element, if one is provided.\n    goog.style.setElementShown(this.elContent_, expanded);\n  } else if (expanded && this.lazyCreateFunc_) {\n    // Assume that when the element is not hidden upon creation.\n    this.elContent_ = this.lazyCreateFunc_();\n  }\n  if (this.elContent_) {\n    goog.dom.classlist.add(\n        this.elContent_, goog.getCssName('goog-zippy-content'));\n  }\n\n  if (this.elExpandedHeader_) {\n    // Hide the show header and show the hide one.\n    goog.style.setElementShown(this.elHeader_, !expanded);\n    goog.style.setElementShown(this.elExpandedHeader_, expanded);\n  } else {\n    // Update header image, if any.\n    this.updateHeaderClassName(expanded);\n  }\n\n  this.setExpandedInternal(expanded);\n\n  // Fire toggle event\n  this.dispatchEvent(\n      new goog.ui.ZippyEvent(\n          goog.ui.Zippy.Events.TOGGLE, this, this.expanded_));\n};\n\n\n/**\n * Sets expanded internal state.\n *\n * @param {boolean} expanded Expanded/visibility state.\n * @protected\n */\ngoog.ui.Zippy.prototype.setExpandedInternal = function(expanded) {\n  this.expanded_ = expanded;\n};\n\n\n/**\n * @return {boolean} Whether the zippy is expanded.\n */\ngoog.ui.Zippy.prototype.isExpanded = function() {\n  return this.expanded_;\n};\n\n\n/**\n * Updates the header element's className and ARIA (accessibility) EXPANDED\n * state.\n *\n * @param {boolean} expanded Expanded/visibility state.\n * @protected\n */\ngoog.ui.Zippy.prototype.updateHeaderClassName = function(expanded) {\n  if (this.elHeader_) {\n    goog.dom.classlist.enable(\n        this.elHeader_, goog.getCssName('goog-zippy-expanded'), expanded);\n    goog.dom.classlist.enable(\n        this.elHeader_, goog.getCssName('goog-zippy-collapsed'), !expanded);\n    goog.a11y.aria.setState(\n        this.elHeader_, goog.a11y.aria.State.EXPANDED, expanded);\n  }\n};\n\n\n/**\n * @return {boolean} Whether the Zippy handles its own key events.\n */\ngoog.ui.Zippy.prototype.isHandleKeyEvents = function() {\n  return this.handleKeyEvents_;\n};\n\n\n/**\n * @return {boolean} Whether the Zippy handles its own mouse events.\n */\ngoog.ui.Zippy.prototype.isHandleMouseEvents = function() {\n  return this.handleMouseEvents_;\n};\n\n\n/**\n * Sets whether the Zippy handles it's own keyboard events.\n * @param {boolean} enable Whether the Zippy handles keyboard events.\n */\ngoog.ui.Zippy.prototype.setHandleKeyboardEvents = function(enable) {\n  if (this.handleKeyEvents_ != enable) {\n    this.handleKeyEvents_ = enable;\n    if (enable) {\n      this.enableKeyboardEventsHandling_(this.elHeader_);\n      this.enableKeyboardEventsHandling_(this.elExpandedHeader_);\n    } else {\n      this.keyboardEventHandler_.removeAll();\n      this.keyHandler_.detach();\n    }\n  }\n};\n\n\n/**\n * Sets whether the Zippy handles it's own mouse events.\n * @param {boolean} enable Whether the Zippy handles mouse events.\n */\ngoog.ui.Zippy.prototype.setHandleMouseEvents = function(enable) {\n  if (this.handleMouseEvents_ != enable) {\n    this.handleMouseEvents_ = enable;\n    if (enable) {\n      this.enableMouseEventsHandling_(this.elHeader_);\n      this.enableMouseEventsHandling_(this.elExpandedHeader_);\n    } else {\n      this.mouseEventHandler_.removeAll();\n    }\n  }\n};\n\n\n/**\n * Enables keyboard events handling for the passed header element.\n * @param {Element} header The header element.\n * @private\n */\ngoog.ui.Zippy.prototype.enableKeyboardEventsHandling_ = function(header) {\n  if (header) {\n    this.keyHandler_.attach(header);\n    this.keyboardEventHandler_.listen(\n        this.keyHandler_, goog.events.KeyHandler.EventType.KEY,\n        this.onHeaderKeyDown_);\n  }\n};\n\n\n/**\n * Enables mouse events handling for the passed header element.\n * @param {Element} header The header element.\n * @private\n */\ngoog.ui.Zippy.prototype.enableMouseEventsHandling_ = function(header) {\n  if (header) {\n    this.mouseEventHandler_.listen(\n        header, goog.events.EventType.CLICK, this.onHeaderClick_);\n  }\n};\n\n\n/**\n * KeyDown event handler for header element. Enter and space toggles expanded\n * state.\n *\n * @param {!goog.events.BrowserEvent} event KeyDown event.\n * @private\n */\ngoog.ui.Zippy.prototype.onHeaderKeyDown_ = function(event) {\n  if (event.keyCode == goog.events.KeyCodes.ENTER ||\n      event.keyCode == goog.events.KeyCodes.SPACE) {\n    this.toggle();\n    this.dispatchActionEvent_(event);\n\n    // Prevent enter key from submitting form.\n    event.preventDefault();\n\n    event.stopPropagation();\n  }\n};\n\n\n/**\n * Click event handler for header element.\n *\n * @param {!goog.events.BrowserEvent} event Click event.\n * @private\n */\ngoog.ui.Zippy.prototype.onHeaderClick_ = function(event) {\n  this.toggle();\n  this.dispatchActionEvent_(event);\n};\n\n\n/**\n * Dispatch an ACTION event whenever there is user interaction with the header.\n * Please note that after the zippy state change is completed a TOGGLE event\n * will be dispatched. However, the TOGGLE event is dispatch on every toggle,\n * including programmatic call to `#toggle`.\n * @param {!goog.events.BrowserEvent} triggeringEvent\n * @private\n */\ngoog.ui.Zippy.prototype.dispatchActionEvent_ = function(triggeringEvent) {\n  this.dispatchEvent(new goog.ui.ZippyEvent(\n      goog.ui.Zippy.Events.ACTION, this, this.expanded_, triggeringEvent));\n};\n\n\n\n/**\n * Object representing a zippy toggle event.\n *\n * @param {string} type Event type.\n * @param {goog.ui.Zippy} target Zippy widget initiating event.\n * @param {boolean} expanded Expanded state.\n * @param {!goog.events.BrowserEvent=} opt_triggeringEvent\n * @extends {goog.events.Event}\n * @constructor\n * @final\n */\ngoog.ui.ZippyEvent = function(type, target, expanded, opt_triggeringEvent) {\n  goog.ui.ZippyEvent.base(this, 'constructor', type, target);\n\n  /**\n   * The expanded state.\n   * @type {boolean}\n   */\n  this.expanded = expanded;\n\n  /**\n   * For ACTION events, the key or mouse event that triggered this event, if\n   * there was one.\n   * @type {?goog.events.BrowserEvent}\n   */\n  this.triggeringEvent = opt_triggeringEvent || null;\n};\ngoog.inherits(goog.ui.ZippyEvent, goog.events.Event);\n","^9I",1579837703000,"^9J",["^9K",["^;;","^>;","^:;","^?H","^;G","^?I","^9>","^:L","^:I","^?M","^<3","^;8","^>R"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/zippy.js"],"^:1",["^9K",["~$goog.ui.ZippyEvent","~$goog.ui.Zippy","~$goog.ui.Zippy.Events"]],"^9<",true,"^9=",["^9>","^?H","^;G","^?M","^;;","^:;","^;8","^>;","^:L","^:I","^>R","^?I","^<3"]],["^ ","^9A",[1579837703000],"^9B","goog.events.listener.js","^9C",["^9D","goog/events/listener.js"],"^9E","goog/events/listener.js","^9F","^9G","^9H","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Listener object.\n * @see ../demos/events.html\n */\n\ngoog.provide('goog.events.Listener');\n\ngoog.require('goog.events.ListenableKey');\n\n\n\n/**\n * Simple class that stores information about a listener\n * @param {function(?):?} listener Callback function.\n * @param {Function} proxy Wrapper for the listener that patches the event.\n * @param {EventTarget|goog.events.Listenable} src Source object for\n *     the event.\n * @param {string} type Event type.\n * @param {boolean} capture Whether in capture or bubble phase.\n * @param {Object=} opt_handler Object in whose context to execute the callback.\n * @implements {goog.events.ListenableKey}\n * @constructor\n */\ngoog.events.Listener = function(\n    listener, proxy, src, type, capture, opt_handler) {\n  if (goog.events.Listener.ENABLE_MONITORING) {\n    this.creationStack = new Error().stack;\n  }\n\n  /** @override */\n  this.listener = listener;\n\n  /**\n   * A wrapper over the original listener. This is used solely to\n   * handle native browser events (it is used to simulate the capture\n   * phase and to patch the event object).\n   * @type {Function}\n   */\n  this.proxy = proxy;\n\n  /**\n   * Object or node that callback is listening to\n   * @type {EventTarget|goog.events.Listenable}\n   */\n  this.src = src;\n\n  /**\n   * The event type.\n   * @const {string}\n   */\n  this.type = type;\n\n  /**\n   * Whether the listener is being called in the capture or bubble phase\n   * @const {boolean}\n   */\n  this.capture = !!capture;\n\n  /**\n   * Optional object whose context to execute the listener in\n   * @type {Object|undefined}\n   */\n  this.handler = opt_handler;\n\n  /**\n   * The key of the listener.\n   * @const {number}\n   * @override\n   */\n  this.key = goog.events.ListenableKey.reserveKey();\n\n  /**\n   * Whether to remove the listener after it has been called.\n   * @type {boolean}\n   */\n  this.callOnce = false;\n\n  /**\n   * Whether the listener has been removed.\n   * @type {boolean}\n   */\n  this.removed = false;\n};\n\n\n/**\n * @define {boolean} Whether to enable the monitoring of the\n *     goog.events.Listener instances. Switching on the monitoring is only\n *     recommended for debugging because it has a significant impact on\n *     performance and memory usage. If switched off, the monitoring code\n *     compiles down to 0 bytes.\n */\ngoog.events.Listener.ENABLE_MONITORING =\n    goog.define('goog.events.Listener.ENABLE_MONITORING', false);\n\n\n/**\n * If monitoring the goog.events.Listener instances is enabled, stores the\n * creation stack trace of the Disposable instance.\n * @type {string}\n */\ngoog.events.Listener.prototype.creationStack;\n\n\n/**\n * Marks this listener as removed. This also remove references held by\n * this listener object (such as listener and event source).\n */\ngoog.events.Listener.prototype.markAsRemoved = function() {\n  this.removed = true;\n  this.listener = null;\n  this.proxy = null;\n  this.src = null;\n  this.handler = null;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.events.ListenableKey"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/listener.js"],"^:1",["^9K",["~$goog.events.Listener"]],"^9<",true,"^9=",["^9>","^AF"]],["^ ","^9A",[1579837703000],"^9B","goog.labs.net.webchanneltransportfactory.js","^9C",["^9D","goog/labs/net/webchanneltransportfactory.js"],"^9E","goog/labs/net/webchanneltransportfactory.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Default factory for <code>WebChannelTransport</code> to\n * avoid exposing concrete classes to clients.\n *\n */\n\ngoog.provide('goog.net.createWebChannelTransport');\n\ngoog.require('goog.functions');\ngoog.require('goog.labs.net.webChannel.WebChannelBaseTransport');\n\n\n/**\n * Create a new WebChannelTransport instance using the default implementation.\n * Throws an error message if no default transport available in the current\n * environment.\n *\n * @return {!goog.net.WebChannelTransport} the newly created transport instance.\n */\ngoog.net.createWebChannelTransport =\n    /** @type {function(): !goog.net.WebChannelTransport} */ (\n        goog.partial(\n            goog.functions.create,\n            goog.labs.net.webChannel.WebChannelBaseTransport));\n","^9I",1579837703000,"^9J",["^9K",["^;<","^9>","^<H"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchanneltransportfactory.js"],"^:1",["^9K",["~$goog.net.createWebChannelTransport"]],"^9<",true,"^9=",["^9>","^;<","^<H"]],["^ ","^9A",[1579837703000],"^9B","goog.datasource.xmldatasource.js","^9C",["^9D","goog/datasource/xmldatasource.js"],"^9E","goog/datasource/xmldatasource.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview\n * Implementations of DataNode for wrapping XML data.\n *\n */\n\ngoog.provide('goog.ds.XmlDataSource');\ngoog.provide('goog.ds.XmlHttpDataSource');\n\ngoog.require('goog.Uri');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.xml');\ngoog.require('goog.ds.BasicNodeList');\ngoog.require('goog.ds.DataManager');\ngoog.require('goog.ds.DataNode');\ngoog.require('goog.ds.LoadState');\ngoog.require('goog.ds.logger');\ngoog.require('goog.log');\ngoog.require('goog.net.XhrIo');\ngoog.require('goog.string');\n\n\n\n/**\n * Data source whose backing is an xml node\n *\n * @param {Node} node The XML node. Can be null.\n * @param {goog.ds.XmlDataSource} parent Parent of XML element. Can be null.\n * @param {string=} opt_name The name of this node relative to the parent node.\n *\n * @extends {goog.ds.DataNode}\n * @constructor\n */\n// TODO(arv): Use interfaces when available.\ngoog.ds.XmlDataSource = function(node, parent, opt_name) {\n  this.parent_ = parent;\n  this.dataName_ = opt_name || (node ? node.nodeName : '');\n  this.setNode_(node);\n};\n\n\n/**\n * Constant to select XML attributes for getChildNodes\n * @type {string}\n * @private\n */\ngoog.ds.XmlDataSource.ATTRIBUTE_SELECTOR_ = '@*';\n\n\n/**\n * Set the current root nodeof the data source.\n * Can be an attribute node, text node, or element node\n * @param {Node} node The node. Can be null.\n *\n * @private\n */\ngoog.ds.XmlDataSource.prototype.setNode_ = function(node) {\n  this.node_ = node;\n  if (node != null) {\n    switch (node.nodeType) {\n      case goog.dom.NodeType.ATTRIBUTE:\n      case goog.dom.NodeType.TEXT:\n        this.value_ = node.nodeValue;\n        break;\n      case goog.dom.NodeType.ELEMENT:\n        if (node.childNodes.length == 1 &&\n            node.firstChild.nodeType == goog.dom.NodeType.TEXT) {\n          this.value_ = node.firstChild.nodeValue;\n        }\n    }\n  }\n};\n\n\n/**\n * Creates the DataNodeList with the child nodes for this element.\n * Allows for only building list as needed.\n *\n * @private\n */\ngoog.ds.XmlDataSource.prototype.createChildNodes_ = function() {\n  if (this.childNodeList_) {\n    return;\n  }\n  var childNodeList = new goog.ds.BasicNodeList();\n  if (this.node_ != null) {\n    var childNodes = this.node_.childNodes;\n    for (var i = 0, childNode; childNode = childNodes[i]; i++) {\n      if (childNode.nodeType != goog.dom.NodeType.TEXT ||\n          !goog.ds.XmlDataSource.isEmptyTextNodeValue_(childNode.nodeValue)) {\n        var newNode =\n            new goog.ds.XmlDataSource(childNode, this, childNode.nodeName);\n        childNodeList.add(newNode);\n      }\n    }\n  }\n  this.childNodeList_ = childNodeList;\n};\n\n\n/**\n * Creates the DataNodeList with the attributes for the element\n * Allows for only building list as needed.\n *\n * @private\n */\ngoog.ds.XmlDataSource.prototype.createAttributes_ = function() {\n  if (this.attributes_) {\n    return;\n  }\n  var attributes = new goog.ds.BasicNodeList();\n  if (this.node_ != null && this.node_.attributes != null) {\n    var atts = this.node_.attributes;\n    for (var i = 0, att; att = atts[i]; i++) {\n      var newNode = new goog.ds.XmlDataSource(att, this, att.nodeName);\n      attributes.add(newNode);\n    }\n  }\n  this.attributes_ = attributes;\n};\n\n\n/**\n * Get the value of the node\n * @return {Object} The value of the node, or null if no value.\n * @override\n */\ngoog.ds.XmlDataSource.prototype.get = function() {\n  this.createChildNodes_();\n  return this.value_;\n};\n\n\n/**\n * Set the value of the node\n * @param {*} value The new value of the node.\n * @override\n */\ngoog.ds.XmlDataSource.prototype.set = function(value) {\n  throw new Error('Can\\'t set on XmlDataSource yet');\n};\n\n\n/** @override */\ngoog.ds.XmlDataSource.prototype.getChildNodes = function(opt_selector) {\n  if (opt_selector &&\n      opt_selector == goog.ds.XmlDataSource.ATTRIBUTE_SELECTOR_) {\n    this.createAttributes_();\n    return this.attributes_;\n  } else if (\n      opt_selector == null ||\n      opt_selector == goog.ds.STR_ALL_CHILDREN_SELECTOR) {\n    this.createChildNodes_();\n    return this.childNodeList_;\n  } else {\n    throw new Error('Unsupported selector');\n  }\n\n};\n\n\n/**\n * Gets a named child node of the current node\n * @param {string} name The node name.\n * @return {goog.ds.DataNode} The child node, or null if\n *   no node of this name exists.\n * @override\n */\ngoog.ds.XmlDataSource.prototype.getChildNode = function(name) {\n  if (goog.string.startsWith(name, goog.ds.STR_ATTRIBUTE_START)) {\n    var att = this.node_.getAttributeNode(name.substring(1));\n    return att ? new goog.ds.XmlDataSource(att, this) : null;\n  } else {\n    return /** @type {goog.ds.DataNode} */ (this.getChildNodes().get(name));\n  }\n};\n\n\n/**\n * Gets the value of a child node\n * @param {string} name The node name.\n * @return {*} The value of the node, or null if no value or the child node\n *    doesn't exist.\n * @override\n */\ngoog.ds.XmlDataSource.prototype.getChildNodeValue = function(name) {\n  if (goog.string.startsWith(name, goog.ds.STR_ATTRIBUTE_START)) {\n    var node = this.node_.getAttributeNode(name.substring(1));\n    return node ? node.nodeValue : null;\n  } else {\n    var node = this.getChildNode(name);\n    return node ? node.get() : null;\n  }\n};\n\n\n/**\n * Get the name of the node relative to the parent node\n * @return {string} The name of the node.\n * @override\n */\ngoog.ds.XmlDataSource.prototype.getDataName = function() {\n  return this.dataName_;\n};\n\n\n/**\n * Setthe name of the node relative to the parent node\n * @param {string} name The name of the node.\n * @override\n */\ngoog.ds.XmlDataSource.prototype.setDataName = function(name) {\n  this.dataName_ = name;\n};\n\n\n/**\n * Gets the a qualified data path to this node\n * @return {string} The data path.\n * @override\n */\ngoog.ds.XmlDataSource.prototype.getDataPath = function() {\n  var parentPath = '';\n  if (this.parent_) {\n    parentPath = this.parent_.getDataPath() +\n        (this.dataName_.indexOf(goog.ds.STR_ARRAY_START) != -1 ?\n             '' :\n             goog.ds.STR_PATH_SEPARATOR);\n  }\n\n  return parentPath + this.dataName_;\n};\n\n\n/**\n * Load or reload the backing data for this node\n * @override\n */\ngoog.ds.XmlDataSource.prototype.load = function() {\n  // Nothing to do\n};\n\n\n/**\n * Gets the state of the backing data for this node\n * @return {goog.ds.LoadState} The state.\n * @override\n */\ngoog.ds.XmlDataSource.prototype.getLoadState = function() {\n  return this.node_ ? goog.ds.LoadState.LOADED : goog.ds.LoadState.NOT_LOADED;\n};\n\n\n/**\n * Check whether a node is an empty text node. Nodes consisting of only white\n * space (#x20, #xD, #xA, #x9) can generally be collapsed to a zero length\n * text string.\n * @param {string} str String to match.\n * @return {boolean} True if string equates to empty text node.\n * @private\n */\ngoog.ds.XmlDataSource.isEmptyTextNodeValue_ = function(str) {\n  return /^[\\r\\n\\t ]*$/.test(str);\n};\n\n\n/**\n * Creates an XML document with one empty node.\n * Useful for places where you need a node that\n * can be queried against.\n *\n * @return {Document} Document with one empty node.\n * @private\n */\ngoog.ds.XmlDataSource.createChildlessDocument_ = function() {\n  return goog.dom.xml.createDocument('nothing');\n};\n\n\n\n/**\n * Data source whose backing is an XMLHttpRequest,\n *\n * A URI of an empty string will mean that no request is made\n * and the data source will be a single, empty node.\n *\n * @param {(string|goog.Uri)} uri URL of the XMLHttpRequest.\n * @param {string} name Name of the datasource.\n *\n * implements goog.ds.XmlHttpDataSource.\n * @constructor\n * @extends {goog.ds.XmlDataSource}\n * @final\n */\ngoog.ds.XmlHttpDataSource = function(uri, name) {\n  goog.ds.XmlDataSource.call(this, null, null, name);\n  if (uri) {\n    this.uri_ = new goog.Uri(uri);\n  } else {\n    this.uri_ = null;\n  }\n};\ngoog.inherits(goog.ds.XmlHttpDataSource, goog.ds.XmlDataSource);\n\n\n/**\n * Default load state is NOT_LOADED\n * @private\n */\ngoog.ds.XmlHttpDataSource.prototype.loadState_ = goog.ds.LoadState.NOT_LOADED;\n\n\n/**\n * Load or reload the backing data for this node.\n * Fires the XMLHttpRequest\n * @override\n */\ngoog.ds.XmlHttpDataSource.prototype.load = function() {\n  if (this.uri_) {\n    goog.log.info(\n        goog.ds.logger, 'Sending XML request for DataSource ' +\n            this.getDataName() + ' to ' + this.uri_);\n    this.loadState_ = goog.ds.LoadState.LOADING;\n\n    goog.net.XhrIo.send(this.uri_, goog.bind(this.complete_, this));\n  } else {\n    this.node_ = goog.ds.XmlDataSource.createChildlessDocument_();\n    this.loadState_ = goog.ds.LoadState.NOT_LOADED;\n  }\n};\n\n\n/**\n * Gets the state of the backing data for this node\n * @return {goog.ds.LoadState} The state.\n * @override\n */\ngoog.ds.XmlHttpDataSource.prototype.getLoadState = function() {\n  return this.loadState_;\n};\n\n\n/**\n * Handles the completion of an XhrIo request. Dispatches to success or load\n * based on the result.\n * @param {!goog.events.Event} e The XhrIo event object.\n * @private\n */\ngoog.ds.XmlHttpDataSource.prototype.complete_ = function(e) {\n  var xhr = /** @type {goog.net.XhrIo} */ (e.target);\n  if (xhr && xhr.isSuccess()) {\n    this.success_(xhr);\n  } else {\n    this.failure_();\n  }\n};\n\n\n/**\n * Success result. Checks whether valid XML was returned\n * and sets the XML and loadstate.\n *\n * @param {!goog.net.XhrIo} xhr The successful XhrIo object.\n * @private\n */\ngoog.ds.XmlHttpDataSource.prototype.success_ = function(xhr) {\n  goog.log.info(\n      goog.ds.logger, 'Got data for DataSource ' + this.getDataName());\n  var xml = xhr.getResponseXml();\n\n  // Fix for case where IE returns valid XML as text but\n  // doesn't parse by default\n  if (xml && !xml.hasChildNodes() && goog.isObject(xhr.getResponseText())) {\n    xml = goog.dom.xml.loadXml(xhr.getResponseText());\n  }\n  // Failure result\n  if (!xml || !xml.hasChildNodes()) {\n    this.loadState_ = goog.ds.LoadState.FAILED;\n    this.node_ = goog.ds.XmlDataSource.createChildlessDocument_();\n  } else {\n    this.loadState_ = goog.ds.LoadState.LOADED;\n    this.node_ = xml.documentElement;\n  }\n\n  if (this.getDataName()) {\n    goog.ds.DataManager.getInstance().fireDataChange(this.getDataName());\n  }\n};\n\n\n/**\n * Failure result\n *\n * @private\n */\ngoog.ds.XmlHttpDataSource.prototype.failure_ = function() {\n  goog.log.info(\n      goog.ds.logger,\n      'Data retrieve failed for DataSource ' + this.getDataName());\n\n  this.loadState_ = goog.ds.LoadState.FAILED;\n  this.node_ = goog.ds.XmlDataSource.createChildlessDocument_();\n\n  if (this.getDataName()) {\n    goog.ds.DataManager.getInstance().fireDataChange(this.getDataName());\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.ds.logger","^;N","^=B","^9L","^<S","~$goog.ds.BasicNodeList","^9>","^;Q","~$goog.ds.DataManager","~$goog.ds.LoadState","~$goog.ds.DataNode","^>2"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/datasource/xmldatasource.js"],"^:1",["^9K",["~$goog.ds.XmlHttpDataSource","~$goog.ds.XmlDataSource"]],"^9<",true,"^9=",["^9>","^<S","^=B","^>2","^AJ","^AK","^AM","^AL","^AI","^;Q","^;N","^9L"]],["^ ","^9A",[1579837703000],"^9B","goog.i18n.numberformatsymbols.js","^9C",["^9D","goog/i18n/numberformatsymbols.js"],"^9E","goog/i18n/numberformatsymbols.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Number formatting symbols.\n *\n * File generated from CLDR ver. 35\n *\n * To reduce the file size (which may cause issues in some JS\n * developing environments), this file will only contain locales\n * that are frequently used by web applications. This is defined as\n * proto/closure_locales_data.txt and will change (most likely addition)\n * over time.  Rest of the data can be found in another file named\n * \"numberformatsymbolsext.js\", which will be generated at\n * the same time together with this file.\n *\n * @suppress {const}\n */\n\n// clang-format off\n\ngoog.provide('goog.i18n.NumberFormatSymbols');\ngoog.provide('goog.i18n.NumberFormatSymbols_af');\ngoog.provide('goog.i18n.NumberFormatSymbols_am');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_DZ');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_EG');\ngoog.provide('goog.i18n.NumberFormatSymbols_ar_EG_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_az');\ngoog.provide('goog.i18n.NumberFormatSymbols_be');\ngoog.provide('goog.i18n.NumberFormatSymbols_bg');\ngoog.provide('goog.i18n.NumberFormatSymbols_bn');\ngoog.provide('goog.i18n.NumberFormatSymbols_bn_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_br');\ngoog.provide('goog.i18n.NumberFormatSymbols_bs');\ngoog.provide('goog.i18n.NumberFormatSymbols_ca');\ngoog.provide('goog.i18n.NumberFormatSymbols_chr');\ngoog.provide('goog.i18n.NumberFormatSymbols_cs');\ngoog.provide('goog.i18n.NumberFormatSymbols_cy');\ngoog.provide('goog.i18n.NumberFormatSymbols_da');\ngoog.provide('goog.i18n.NumberFormatSymbols_de');\ngoog.provide('goog.i18n.NumberFormatSymbols_de_AT');\ngoog.provide('goog.i18n.NumberFormatSymbols_de_CH');\ngoog.provide('goog.i18n.NumberFormatSymbols_el');\ngoog.provide('goog.i18n.NumberFormatSymbols_en');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_AU');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_CA');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_GB');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_IE');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_IN');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_SG');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_US');\ngoog.provide('goog.i18n.NumberFormatSymbols_en_ZA');\ngoog.provide('goog.i18n.NumberFormatSymbols_es');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_419');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_ES');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_MX');\ngoog.provide('goog.i18n.NumberFormatSymbols_es_US');\ngoog.provide('goog.i18n.NumberFormatSymbols_et');\ngoog.provide('goog.i18n.NumberFormatSymbols_eu');\ngoog.provide('goog.i18n.NumberFormatSymbols_fa');\ngoog.provide('goog.i18n.NumberFormatSymbols_fa_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_fi');\ngoog.provide('goog.i18n.NumberFormatSymbols_fil');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr');\ngoog.provide('goog.i18n.NumberFormatSymbols_fr_CA');\ngoog.provide('goog.i18n.NumberFormatSymbols_ga');\ngoog.provide('goog.i18n.NumberFormatSymbols_gl');\ngoog.provide('goog.i18n.NumberFormatSymbols_gsw');\ngoog.provide('goog.i18n.NumberFormatSymbols_gu');\ngoog.provide('goog.i18n.NumberFormatSymbols_haw');\ngoog.provide('goog.i18n.NumberFormatSymbols_he');\ngoog.provide('goog.i18n.NumberFormatSymbols_hi');\ngoog.provide('goog.i18n.NumberFormatSymbols_hr');\ngoog.provide('goog.i18n.NumberFormatSymbols_hu');\ngoog.provide('goog.i18n.NumberFormatSymbols_hy');\ngoog.provide('goog.i18n.NumberFormatSymbols_id');\ngoog.provide('goog.i18n.NumberFormatSymbols_in');\ngoog.provide('goog.i18n.NumberFormatSymbols_is');\ngoog.provide('goog.i18n.NumberFormatSymbols_it');\ngoog.provide('goog.i18n.NumberFormatSymbols_iw');\ngoog.provide('goog.i18n.NumberFormatSymbols_ja');\ngoog.provide('goog.i18n.NumberFormatSymbols_ka');\ngoog.provide('goog.i18n.NumberFormatSymbols_kk');\ngoog.provide('goog.i18n.NumberFormatSymbols_km');\ngoog.provide('goog.i18n.NumberFormatSymbols_kn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ko');\ngoog.provide('goog.i18n.NumberFormatSymbols_ky');\ngoog.provide('goog.i18n.NumberFormatSymbols_ln');\ngoog.provide('goog.i18n.NumberFormatSymbols_lo');\ngoog.provide('goog.i18n.NumberFormatSymbols_lt');\ngoog.provide('goog.i18n.NumberFormatSymbols_lv');\ngoog.provide('goog.i18n.NumberFormatSymbols_mk');\ngoog.provide('goog.i18n.NumberFormatSymbols_ml');\ngoog.provide('goog.i18n.NumberFormatSymbols_mn');\ngoog.provide('goog.i18n.NumberFormatSymbols_mo');\ngoog.provide('goog.i18n.NumberFormatSymbols_mr');\ngoog.provide('goog.i18n.NumberFormatSymbols_mr_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_ms');\ngoog.provide('goog.i18n.NumberFormatSymbols_mt');\ngoog.provide('goog.i18n.NumberFormatSymbols_my');\ngoog.provide('goog.i18n.NumberFormatSymbols_my_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_nb');\ngoog.provide('goog.i18n.NumberFormatSymbols_ne');\ngoog.provide('goog.i18n.NumberFormatSymbols_ne_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_nl');\ngoog.provide('goog.i18n.NumberFormatSymbols_no');\ngoog.provide('goog.i18n.NumberFormatSymbols_no_NO');\ngoog.provide('goog.i18n.NumberFormatSymbols_or');\ngoog.provide('goog.i18n.NumberFormatSymbols_pa');\ngoog.provide('goog.i18n.NumberFormatSymbols_pl');\ngoog.provide('goog.i18n.NumberFormatSymbols_pt');\ngoog.provide('goog.i18n.NumberFormatSymbols_pt_BR');\ngoog.provide('goog.i18n.NumberFormatSymbols_pt_PT');\ngoog.provide('goog.i18n.NumberFormatSymbols_ro');\ngoog.provide('goog.i18n.NumberFormatSymbols_ru');\ngoog.provide('goog.i18n.NumberFormatSymbols_sh');\ngoog.provide('goog.i18n.NumberFormatSymbols_si');\ngoog.provide('goog.i18n.NumberFormatSymbols_sk');\ngoog.provide('goog.i18n.NumberFormatSymbols_sl');\ngoog.provide('goog.i18n.NumberFormatSymbols_sq');\ngoog.provide('goog.i18n.NumberFormatSymbols_sr');\ngoog.provide('goog.i18n.NumberFormatSymbols_sr_Latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_sv');\ngoog.provide('goog.i18n.NumberFormatSymbols_sw');\ngoog.provide('goog.i18n.NumberFormatSymbols_ta');\ngoog.provide('goog.i18n.NumberFormatSymbols_te');\ngoog.provide('goog.i18n.NumberFormatSymbols_th');\ngoog.provide('goog.i18n.NumberFormatSymbols_tl');\ngoog.provide('goog.i18n.NumberFormatSymbols_tr');\ngoog.provide('goog.i18n.NumberFormatSymbols_u_nu_latn');\ngoog.provide('goog.i18n.NumberFormatSymbols_uk');\ngoog.provide('goog.i18n.NumberFormatSymbols_ur');\ngoog.provide('goog.i18n.NumberFormatSymbols_uz');\ngoog.provide('goog.i18n.NumberFormatSymbols_vi');\ngoog.provide('goog.i18n.NumberFormatSymbols_zh');\ngoog.provide('goog.i18n.NumberFormatSymbols_zh_CN');\ngoog.provide('goog.i18n.NumberFormatSymbols_zh_HK');\ngoog.provide('goog.i18n.NumberFormatSymbols_zh_TW');\ngoog.provide('goog.i18n.NumberFormatSymbols_zu');\n\n\n/**\n * Number formatting symbols for locale af.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_af = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'ZAR'\n};\n\n\n/**\n * Number formatting symbols for locale am.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_am = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'ETB'\n};\n\n\n/**\n * Number formatting symbols for locale ar.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'EGP'\n};\n\n\n/**\n * Number formatting symbols for locale ar_DZ.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_DZ = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'DZD'\n};\n\n\n/**\n * Number formatting symbols for locale ar_EG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_EG = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪؜',\n  ZERO_DIGIT: '٠',\n  PLUS_SIGN: '؜+',\n  MINUS_SIGN: '؜-',\n  EXP_SYMBOL: 'اس',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ليس رقم',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EGP'\n};\n\n\n/**\n * Number formatting symbols for locale ar_EG_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ar_EG_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '‎%‎',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ليس رقمًا',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'EGP'\n};\n\n\n/**\n * Number formatting symbols for locale az.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_az = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'AZN'\n};\n\n\n/**\n * Number formatting symbols for locale be.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_be = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'BYN'\n};\n\n\n/**\n * Number formatting symbols for locale bg.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bg = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '0.00 ¤',\n  DEF_CURRENCY_CODE: 'BGN'\n};\n\n\n/**\n * Number formatting symbols for locale bn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '০',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##,##0.00¤',\n  DEF_CURRENCY_CODE: 'BDT'\n};\n\n\n/**\n * Number formatting symbols for locale bn_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bn_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '#,##,##0.00¤',\n  DEF_CURRENCY_CODE: 'BDT'\n};\n\n\n/**\n * Number formatting symbols for locale br.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_br = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale bs.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_bs = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'BAM'\n};\n\n\n/**\n * Number formatting symbols for locale ca.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ca = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale chr.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_chr = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale cs.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_cs = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'CZK'\n};\n\n\n/**\n * Number formatting symbols for locale cy.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_cy = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'GBP'\n};\n\n\n/**\n * Number formatting symbols for locale da.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_da = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'DKK'\n};\n\n\n/**\n * Number formatting symbols for locale de.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_de = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale de_AT.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_de_AT = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale de_CH.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_de_CH = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: '’',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00;¤-#,##0.00',\n  DEF_CURRENCY_CODE: 'CHF'\n};\n\n\n/**\n * Number formatting symbols for locale el.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_el = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'e',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale en.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale en_AU.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_AU = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'e',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'AUD'\n};\n\n\n/**\n * Number formatting symbols for locale en_CA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_CA = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'e',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'CAD'\n};\n\n\n/**\n * Number formatting symbols for locale en_GB.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_GB = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'GBP'\n};\n\n\n/**\n * Number formatting symbols for locale en_IE.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_IE = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale en_IN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_IN = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '¤ #,##,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale en_SG.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_SG = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'SGD'\n};\n\n\n/**\n * Number formatting symbols for locale en_US.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_US = goog.i18n.NumberFormatSymbols_en;\n\n\n/**\n * Number formatting symbols for locale en_ZA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_en_ZA = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'ZAR'\n};\n\n\n/**\n * Number formatting symbols for locale es.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale es_419.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_419 = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'MXN'\n};\n\n\n/**\n * Number formatting symbols for locale es_ES.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_ES = goog.i18n.NumberFormatSymbols_es;\n\n\n/**\n * Number formatting symbols for locale es_MX.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_MX = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'MXN'\n};\n\n\n/**\n * Number formatting symbols for locale es_US.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_es_US = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale et.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_et = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: '×10^',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale eu.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_eu = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '% #,##0',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale fa.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fa = {\n  DECIMAL_SEP: '٫',\n  GROUP_SEP: '٬',\n  PERCENT: '٪',\n  ZERO_DIGIT: '۰',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎−',\n  EXP_SYMBOL: '×۱۰^',\n  PERMILL: '؉',\n  INFINITY: '∞',\n  NAN: 'ناعدد',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '‎¤#,##0.00',\n  DEF_CURRENCY_CODE: 'IRR'\n};\n\n\n/**\n * Number formatting symbols for locale fa_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fa_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ناعدد',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '‎¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'IRR'\n};\n\n\n/**\n * Number formatting symbols for locale fi.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fi = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'epäluku',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale fil.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fil = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'PHP'\n};\n\n\n/**\n * Number formatting symbols for locale fr.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale fr_CA.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_fr_CA = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'CAD'\n};\n\n\n/**\n * Number formatting symbols for locale ga.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ga = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale gl.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_gl = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale gsw.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_gsw = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: '’',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'CHF'\n};\n\n\n/**\n * Number formatting symbols for locale gu.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_gu = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '[#E0]',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '¤#,##,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale haw.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_haw = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'USD'\n};\n\n\n/**\n * Number formatting symbols for locale he.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_he = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '‏#,##0.00 ¤;‏-#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'ILS'\n};\n\n\n/**\n * Number formatting symbols for locale hi.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_hi = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '[#E0]',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '¤#,##,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale hr.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_hr = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'HRK'\n};\n\n\n/**\n * Number formatting symbols for locale hu.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_hu = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'HUF'\n};\n\n\n/**\n * Number formatting symbols for locale hy.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_hy = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ՈչԹ',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'AMD'\n};\n\n\n/**\n * Number formatting symbols for locale id.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_id = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'IDR'\n};\n\n\n/**\n * Number formatting symbols for locale in.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_in = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'IDR'\n};\n\n\n/**\n * Number formatting symbols for locale is.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_is = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'ISK'\n};\n\n\n/**\n * Number formatting symbols for locale it.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_it = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale iw.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_iw = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '‏#,##0.00 ¤;‏-#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'ILS'\n};\n\n\n/**\n * Number formatting symbols for locale ja.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ja = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'JPY'\n};\n\n\n/**\n * Number formatting symbols for locale ka.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ka = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'არ არის რიცხვი',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'GEL'\n};\n\n\n/**\n * Number formatting symbols for locale kk.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kk = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'сан емес',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'KZT'\n};\n\n\n/**\n * Number formatting symbols for locale km.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_km = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00¤',\n  DEF_CURRENCY_CODE: 'KHR'\n};\n\n\n/**\n * Number formatting symbols for locale kn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_kn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale ko.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ko = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'KRW'\n};\n\n\n/**\n * Number formatting symbols for locale ky.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ky = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'сан эмес',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'KGS'\n};\n\n\n/**\n * Number formatting symbols for locale ln.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ln = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'CDF'\n};\n\n\n/**\n * Number formatting symbols for locale lo.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lo = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ບໍ່​ແມ່ນ​ໂຕ​ເລກ',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00;¤-#,##0.00',\n  DEF_CURRENCY_CODE: 'LAK'\n};\n\n\n/**\n * Number formatting symbols for locale lt.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lt = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: '×10^',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale lv.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_lv = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NS',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale mk.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mk = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'MKD'\n};\n\n\n/**\n * Number formatting symbols for locale ml.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ml = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale mn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'MNT'\n};\n\n\n/**\n * Number formatting symbols for locale mo.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mo = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'MDL'\n};\n\n\n/**\n * Number formatting symbols for locale mr.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mr = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '०',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '[#E0]',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale mr_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mr_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '[#E0]',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale ms.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ms = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'MYR'\n};\n\n\n/**\n * Number formatting symbols for locale mt.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_mt = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale my.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_my = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '၀',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ဂဏန်းမဟုတ်သော',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'MMK'\n};\n\n\n/**\n * Number formatting symbols for locale my_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_my_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'ဂဏန်းမဟုတ်သော',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'MMK'\n};\n\n\n/**\n * Number formatting symbols for locale nb.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nb = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'NOK'\n};\n\n\n/**\n * Number formatting symbols for locale ne.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ne = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '०',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'NPR'\n};\n\n\n/**\n * Number formatting symbols for locale ne_u_nu_latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ne_u_nu_latn = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'NPR'\n};\n\n\n/**\n * Number formatting symbols for locale nl.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_nl = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00;¤ -#,##0.00',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale no.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_no = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'NOK'\n};\n\n\n/**\n * Number formatting symbols for locale no_NO.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_no_NO = goog.i18n.NumberFormatSymbols_no;\n\n\n/**\n * Number formatting symbols for locale or.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_or = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale pa.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pa = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '[#E0]',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '¤ #,##,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale pl.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pl = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'PLN'\n};\n\n\n/**\n * Number formatting symbols for locale pt.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pt = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'BRL'\n};\n\n\n/**\n * Number formatting symbols for locale pt_BR.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pt_BR = goog.i18n.NumberFormatSymbols_pt;\n\n\n/**\n * Number formatting symbols for locale pt_PT.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_pt_PT = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale ro.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ro = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'RON'\n};\n\n\n/**\n * Number formatting symbols for locale ru.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ru = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'не число',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'RUB'\n};\n\n\n/**\n * Number formatting symbols for locale sh.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sh = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'RSD'\n};\n\n\n/**\n * Number formatting symbols for locale si.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_si = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'LKR'\n};\n\n\n/**\n * Number formatting symbols for locale sk.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sk = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'e',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale sl.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sl = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: 'e',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'EUR'\n};\n\n\n/**\n * Number formatting symbols for locale sq.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sq = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'ALL'\n};\n\n\n/**\n * Number formatting symbols for locale sr.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sr = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'RSD'\n};\n\n\n/**\n * Number formatting symbols for locale sr_Latn.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sr_Latn = goog.i18n.NumberFormatSymbols_sr;\n\n\n/**\n * Number formatting symbols for locale sv.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sv = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '−',\n  EXP_SYMBOL: '×10^',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0 %',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'SEK'\n};\n\n\n/**\n * Number formatting symbols for locale sw.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_sw = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'TZS'\n};\n\n\n/**\n * Number formatting symbols for locale ta.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ta = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##,##0%',\n  CURRENCY_PATTERN: '¤ #,##,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale te.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_te = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##,##0.00',\n  DEF_CURRENCY_CODE: 'INR'\n};\n\n\n/**\n * Number formatting symbols for locale th.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_th = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'THB'\n};\n\n\n/**\n * Number formatting symbols for locale tl.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_tl = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'PHP'\n};\n\n\n/**\n * Number formatting symbols for locale tr.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_tr = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '%#,##0',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'TRY'\n};\n\n\n/**\n * Number formatting symbols for locale uk.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_uk = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'Е',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'UAH'\n};\n\n\n/**\n * Number formatting symbols for locale ur.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_ur = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '‎+',\n  MINUS_SIGN: '‎-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤ #,##0.00',\n  DEF_CURRENCY_CODE: 'PKR'\n};\n\n\n/**\n * Number formatting symbols for locale uz.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_uz = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: ' ',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'son emas',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'UZS'\n};\n\n\n/**\n * Number formatting symbols for locale vi.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_vi = {\n  DECIMAL_SEP: ',',\n  GROUP_SEP: '.',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '#,##0.00 ¤',\n  DEF_CURRENCY_CODE: 'VND'\n};\n\n\n/**\n * Number formatting symbols for locale zh.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zh = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'CNY'\n};\n\n\n/**\n * Number formatting symbols for locale zh_CN.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zh_CN = goog.i18n.NumberFormatSymbols_zh;\n\n\n/**\n * Number formatting symbols for locale zh_HK.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zh_HK = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: '非數值',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'HKD'\n};\n\n\n/**\n * Number formatting symbols for locale zh_TW.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zh_TW = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: '非數值',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'TWD'\n};\n\n\n/**\n * Number formatting symbols for locale zu.\n * @enum {string}\n */\ngoog.i18n.NumberFormatSymbols_zu = {\n  DECIMAL_SEP: '.',\n  GROUP_SEP: ',',\n  PERCENT: '%',\n  ZERO_DIGIT: '0',\n  PLUS_SIGN: '+',\n  MINUS_SIGN: '-',\n  EXP_SYMBOL: 'E',\n  PERMILL: '‰',\n  INFINITY: '∞',\n  NAN: 'NaN',\n  DECIMAL_PATTERN: '#,##0.###',\n  SCIENTIFIC_PATTERN: '#E0',\n  PERCENT_PATTERN: '#,##0%',\n  CURRENCY_PATTERN: '¤#,##0.00',\n  DEF_CURRENCY_CODE: 'ZAR'\n};\n\n\n/**\n * Selected number formatting symbols by locale.\n */\ngoog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en;\ngoog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en;\n\nswitch (goog.LOCALE) {\n  case 'af':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_af;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_af;\n    break;\n  case 'am':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_am;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_am;\n    break;\n  case 'ar':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar;\n    break;\n  case 'ar_DZ':\n  case 'ar-DZ':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_DZ;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_DZ;\n    break;\n  case 'ar_EG':\n  case 'ar-EG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ar_EG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ar_EG_u_nu_latn;\n    break;\n  case 'az':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_az;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_az;\n    break;\n  case 'be':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_be;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_be;\n    break;\n  case 'bg':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bg;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bg;\n    break;\n  case 'bn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bn_u_nu_latn;\n    break;\n  case 'br':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_br;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_br;\n    break;\n  case 'bs':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_bs;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_bs;\n    break;\n  case 'ca':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ca;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ca;\n    break;\n  case 'chr':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_chr;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_chr;\n    break;\n  case 'cs':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cs;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_cs;\n    break;\n  case 'cy':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_cy;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_cy;\n    break;\n  case 'da':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_da;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_da;\n    break;\n  case 'de':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_de;\n    break;\n  case 'de_AT':\n  case 'de-AT':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de_AT;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_de_AT;\n    break;\n  case 'de_CH':\n  case 'de-CH':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_de_CH;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_de_CH;\n    break;\n  case 'el':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_el;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_el;\n    break;\n  case 'en':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en;\n    break;\n  case 'en_AU':\n  case 'en-AU':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_AU;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_AU;\n    break;\n  case 'en_CA':\n  case 'en-CA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_CA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_CA;\n    break;\n  case 'en_GB':\n  case 'en-GB':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_GB;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_GB;\n    break;\n  case 'en_IE':\n  case 'en-IE':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_IE;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_IE;\n    break;\n  case 'en_IN':\n  case 'en-IN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_IN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_IN;\n    break;\n  case 'en_SG':\n  case 'en-SG':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_SG;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_SG;\n    break;\n  case 'en_US':\n  case 'en-US':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_US;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_US;\n    break;\n  case 'en_ZA':\n  case 'en-ZA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en_ZA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_en_ZA;\n    break;\n  case 'es':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es;\n    break;\n  case 'es_419':\n  case 'es-419':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_419;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_419;\n    break;\n  case 'es_ES':\n  case 'es-ES':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_ES;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_ES;\n    break;\n  case 'es_MX':\n  case 'es-MX':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_MX;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_MX;\n    break;\n  case 'es_US':\n  case 'es-US':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_es_US;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_es_US;\n    break;\n  case 'et':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_et;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_et;\n    break;\n  case 'eu':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_eu;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_eu;\n    break;\n  case 'fa':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fa;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fa_u_nu_latn;\n    break;\n  case 'fi':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fi;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fi;\n    break;\n  case 'fil':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fil;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fil;\n    break;\n  case 'fr':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr;\n    break;\n  case 'fr_CA':\n  case 'fr-CA':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_fr_CA;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_fr_CA;\n    break;\n  case 'ga':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ga;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ga;\n    break;\n  case 'gl':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gl;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_gl;\n    break;\n  case 'gsw':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gsw;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_gsw;\n    break;\n  case 'gu':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_gu;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_gu;\n    break;\n  case 'haw':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_haw;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_haw;\n    break;\n  case 'he':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_he;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_he;\n    break;\n  case 'hi':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hi;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_hi;\n    break;\n  case 'hr':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hr;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_hr;\n    break;\n  case 'hu':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hu;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_hu;\n    break;\n  case 'hy':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_hy;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_hy;\n    break;\n  case 'id':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_id;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_id;\n    break;\n  case 'in':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_in;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_in;\n    break;\n  case 'is':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_is;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_is;\n    break;\n  case 'it':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_it;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_it;\n    break;\n  case 'iw':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_iw;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_iw;\n    break;\n  case 'ja':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ja;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ja;\n    break;\n  case 'ka':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ka;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ka;\n    break;\n  case 'kk':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kk;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kk;\n    break;\n  case 'km':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_km;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_km;\n    break;\n  case 'kn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_kn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_kn;\n    break;\n  case 'ko':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ko;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ko;\n    break;\n  case 'ky':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ky;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ky;\n    break;\n  case 'ln':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ln;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ln;\n    break;\n  case 'lo':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lo;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lo;\n    break;\n  case 'lt':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lt;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lt;\n    break;\n  case 'lv':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_lv;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_lv;\n    break;\n  case 'mk':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mk;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mk;\n    break;\n  case 'ml':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ml;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ml;\n    break;\n  case 'mn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mn;\n    break;\n  case 'mo':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mo;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mo;\n    break;\n  case 'mr':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mr;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mr_u_nu_latn;\n    break;\n  case 'ms':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ms;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ms;\n    break;\n  case 'mt':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_mt;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_mt;\n    break;\n  case 'my':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_my;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_my_u_nu_latn;\n    break;\n  case 'nb':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nb;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nb;\n    break;\n  case 'ne':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ne;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ne_u_nu_latn;\n    break;\n  case 'nl':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_nl;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_nl;\n    break;\n  case 'no':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_no;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_no;\n    break;\n  case 'no_NO':\n  case 'no-NO':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_no_NO;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_no_NO;\n    break;\n  case 'or':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_or;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_or;\n    break;\n  case 'pa':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pa;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pa;\n    break;\n  case 'pl':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pl;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pl;\n    break;\n  case 'pt':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pt;\n    break;\n  case 'pt_BR':\n  case 'pt-BR':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_BR;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pt_BR;\n    break;\n  case 'pt_PT':\n  case 'pt-PT':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_pt_PT;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_pt_PT;\n    break;\n  case 'ro':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ro;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ro;\n    break;\n  case 'ru':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ru;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ru;\n    break;\n  case 'sh':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sh;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sh;\n    break;\n  case 'si':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_si;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_si;\n    break;\n  case 'sk':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sk;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sk;\n    break;\n  case 'sl':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sl;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sl;\n    break;\n  case 'sq':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sq;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sq;\n    break;\n  case 'sr':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sr;\n    break;\n  case 'sr_Latn':\n  case 'sr-Latn':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sr_Latn;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sr_Latn;\n    break;\n  case 'sv':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sv;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sv;\n    break;\n  case 'sw':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_sw;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_sw;\n    break;\n  case 'ta':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ta;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ta;\n    break;\n  case 'te':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_te;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_te;\n    break;\n  case 'th':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_th;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_th;\n    break;\n  case 'tl':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tl;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_tl;\n    break;\n  case 'tr':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_tr;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_tr;\n    break;\n  case 'uk':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uk;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_uk;\n    break;\n  case 'ur':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_ur;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_ur;\n    break;\n  case 'uz':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_uz;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_uz;\n    break;\n  case 'vi':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_vi;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_vi;\n    break;\n  case 'zh':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zh;\n    break;\n  case 'zh_CN':\n  case 'zh-CN':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_CN;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zh_CN;\n    break;\n  case 'zh_HK':\n  case 'zh-HK':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_HK;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zh_HK;\n    break;\n  case 'zh_TW':\n  case 'zh-TW':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zh_TW;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zh_TW;\n    break;\n  case 'zu':\n    goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_zu;\n    goog.i18n.NumberFormatSymbols_u_nu_latn = goog.i18n.NumberFormatSymbols_zu;\n    break;\n}\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/numberformatsymbols.js"],"^:1",["^9K",["~$goog.i18n.NumberFormatSymbols-mr-u-nu-latn","~$goog.i18n.NumberFormatSymbols_my","~$goog.i18n.NumberFormatSymbols-lt","~$goog.i18n.NumberFormatSymbols-en-GB","~$goog.i18n.NumberFormatSymbols_nb","~$goog.i18n.NumberFormatSymbols_lo","~$goog.i18n.NumberFormatSymbols-uk","~$goog.i18n.NumberFormatSymbols-ca","~$goog.i18n.NumberFormatSymbols-bn-u-nu-latn","~$goog.i18n.NumberFormatSymbols-id","~$goog.i18n.NumberFormatSymbols-pt-PT","~$goog.i18n.NumberFormatSymbols_hu","~$goog.i18n.NumberFormatSymbols-en-SG","~$goog.i18n.NumberFormatSymbols_in","~$goog.i18n.NumberFormatSymbols_he","~$goog.i18n.NumberFormatSymbols-sr","~$goog.i18n.NumberFormatSymbols-ja","~$goog.i18n.NumberFormatSymbols_en_IN","~$goog.i18n.NumberFormatSymbols-ne-u-nu-latn","~$goog.i18n.NumberFormatSymbols-fr-CA","~$goog.i18n.NumberFormatSymbols_km","~$goog.i18n.NumberFormatSymbols_be","~$goog.i18n.NumberFormatSymbols_sq","~$goog.i18n.NumberFormatSymbols_de_CH","~$goog.i18n.NumberFormatSymbols_ky","~$goog.i18n.NumberFormatSymbols_zh_CN","~$goog.i18n.NumberFormatSymbols-uz","~$goog.i18n.NumberFormatSymbols_uz","~$goog.i18n.NumberFormatSymbols-fa-u-nu-latn","~$goog.i18n.NumberFormatSymbols-ur","~$goog.i18n.NumberFormatSymbols-ko","~$goog.i18n.NumberFormatSymbols-no-NO","~$goog.i18n.NumberFormatSymbols-bn","~$goog.i18n.NumberFormatSymbols-mn","~$goog.i18n.NumberFormatSymbols_ur","~$goog.i18n.NumberFormatSymbols_lt","~$goog.i18n.NumberFormatSymbols-ln","~$goog.i18n.NumberFormatSymbols-ml","~$goog.i18n.NumberFormatSymbols_pt_PT","~$goog.i18n.NumberFormatSymbols-ro","~$goog.i18n.NumberFormatSymbols_zu","~$goog.i18n.NumberFormatSymbols_hi","~$goog.i18n.NumberFormatSymbols-zh-HK","~$goog.i18n.NumberFormatSymbols_en_CA","~$goog.i18n.NumberFormatSymbols-ar","~$goog.i18n.NumberFormatSymbols-en-AU","~$goog.i18n.NumberFormatSymbols-eu","~$goog.i18n.NumberFormatSymbols-am","~$goog.i18n.NumberFormatSymbols_my_u_nu_latn","~$goog.i18n.NumberFormatSymbols_fi","~$goog.i18n.NumberFormatSymbols-iw","~$goog.i18n.NumberFormatSymbols-de-AT","~$goog.i18n.NumberFormatSymbols_no_NO","~$goog.i18n.NumberFormatSymbols_mo","~$goog.i18n.NumberFormatSymbols-tr","~$goog.i18n.NumberFormatSymbols-km","~$goog.i18n.NumberFormatSymbols_ar_DZ","~$goog.i18n.NumberFormatSymbols-nb","~$goog.i18n.NumberFormatSymbols-sw","~$goog.i18n.NumberFormatSymbols-is","~$goog.i18n.NumberFormatSymbols-ky","~$goog.i18n.NumberFormatSymbols_si","~$goog.i18n.NumberFormatSymbols-es","~$goog.i18n.NumberFormatSymbols_mn","~$goog.i18n.NumberFormatSymbols-es-MX","~$goog.i18n.NumberFormatSymbols-chr","~$goog.i18n.NumberFormatSymbols-en-IE","~$goog.i18n.NumberFormatSymbols_id","~$goog.i18n.NumberFormatSymbols_ar_EG_u_nu_latn","~$goog.i18n.NumberFormatSymbols-hy","~$goog.i18n.NumberFormatSymbols_or","~$goog.i18n.NumberFormatSymbols-gu","~$goog.i18n.NumberFormatSymbols-my","~$goog.i18n.NumberFormatSymbols_cs","~$goog.i18n.NumberFormatSymbols_ar","~$goog.i18n.NumberFormatSymbols_en","~$goog.i18n.NumberFormatSymbols_ru","~$goog.i18n.NumberFormatSymbols_en_SG","~$goog.i18n.NumberFormatSymbols-af","~$goog.i18n.NumberFormatSymbols-bg","~$goog.i18n.NumberFormatSymbols_sv","~$goog.i18n.NumberFormatSymbols-sk","~$goog.i18n.NumberFormatSymbols-mt","~$goog.i18n.NumberFormatSymbols_mr_u_nu_latn","~$goog.i18n.NumberFormatSymbols-cy","~$goog.i18n.NumberFormatSymbols-hr","~$goog.i18n.NumberFormatSymbols_ar_EG","~$goog.i18n.NumberFormatSymbols_te","~$goog.i18n.NumberFormatSymbols-kk","~$goog.i18n.NumberFormatSymbols_bg","~$goog.i18n.NumberFormatSymbols_en_AU","~$goog.i18n.NumberFormatSymbols_es_419","~$goog.i18n.NumberFormatSymbols_pt_BR","~$goog.i18n.NumberFormatSymbols-kn","~$goog.i18n.NumberFormatSymbols-sv","~$goog.i18n.NumberFormatSymbols_el","~$goog.i18n.NumberFormatSymbols_no","^9@","~$goog.i18n.NumberFormatSymbols_ln","~$goog.i18n.NumberFormatSymbols-zu","~$goog.i18n.NumberFormatSymbols_fil","~$goog.i18n.NumberFormatSymbols-th","~$goog.i18n.NumberFormatSymbols_pa","~$goog.i18n.NumberFormatSymbols_vi","~$goog.i18n.NumberFormatSymbols-en-US","~$goog.i18n.NumberFormatSymbols-mk","~$goog.i18n.NumberFormatSymbols-zh-TW","~$goog.i18n.NumberFormatSymbols-es-ES","~$goog.i18n.NumberFormatSymbols-es-US","~$goog.i18n.NumberFormatSymbols-tl","~$goog.i18n.NumberFormatSymbols-lv","~$goog.i18n.NumberFormatSymbols-ta","~$goog.i18n.NumberFormatSymbols-ga","~$goog.i18n.NumberFormatSymbols_ta","~$goog.i18n.NumberFormatSymbols-sq","~$goog.i18n.NumberFormatSymbols_uk","~$goog.i18n.NumberFormatSymbols-el","~$goog.i18n.NumberFormatSymbols_lv","~$goog.i18n.NumberFormatSymbols_ne_u_nu_latn","~$goog.i18n.NumberFormatSymbols_haw","~$goog.i18n.NumberFormatSymbols_ko","~$goog.i18n.NumberFormatSymbols_az","~$goog.i18n.NumberFormatSymbols-or","~$goog.i18n.NumberFormatSymbols-ru","~$goog.i18n.NumberFormatSymbols-zh","~$goog.i18n.NumberFormatSymbols-mo","~$goog.i18n.NumberFormatSymbols-fi","~$goog.i18n.NumberFormatSymbols_de_AT","~$goog.i18n.NumberFormatSymbols_fa","~$goog.i18n.NumberFormatSymbols_is","~$goog.i18n.NumberFormatSymbols-haw","~$goog.i18n.NumberFormatSymbols-ms","~$goog.i18n.NumberFormatSymbols-te","~$goog.i18n.NumberFormatSymbols_ga","~$goog.i18n.NumberFormatSymbols_ka","~$goog.i18n.NumberFormatSymbols-nl","~$goog.i18n.NumberFormatSymbols_fr","~$goog.i18n.NumberFormatSymbols_sh","~$goog.i18n.NumberFormatSymbols_sl","~$goog.i18n.NumberFormatSymbols_gu","~$goog.i18n.NumberFormatSymbols_sw","~$goog.i18n.NumberFormatSymbols-vi","~$goog.i18n.NumberFormatSymbols_af","~$goog.i18n.NumberFormatSymbols-sl","~$goog.i18n.NumberFormatSymbols-it","~$goog.i18n.NumberFormatSymbols_zh_HK","~$goog.i18n.NumberFormatSymbols_am","~$goog.i18n.NumberFormatSymbols_tl","~$goog.i18n.NumberFormatSymbols-es-419","~$goog.i18n.NumberFormatSymbols_u_nu_latn","~$goog.i18n.NumberFormatSymbols_sr_Latn","~$goog.i18n.NumberFormatSymbols_es","~$goog.i18n.NumberFormatSymbols_eu","~$goog.i18n.NumberFormatSymbols_sr","~$goog.i18n.NumberFormatSymbols_en_US","~$goog.i18n.NumberFormatSymbols-fr","~$goog.i18n.NumberFormatSymbols_bs","~$goog.i18n.NumberFormatSymbols-gsw","~$goog.i18n.NumberFormatSymbols_chr","~$goog.i18n.NumberFormatSymbols_br","~$goog.i18n.NumberFormatSymbols_sk","~$goog.i18n.NumberFormatSymbols_et","~$goog.i18n.NumberFormatSymbols_es_ES","~$goog.i18n.NumberFormatSymbols-sh","~$goog.i18n.NumberFormatSymbols_fa_u_nu_latn","~$goog.i18n.NumberFormatSymbols_it","~$goog.i18n.NumberFormatSymbols-sr-Latn","~$goog.i18n.NumberFormatSymbols-fil","~$goog.i18n.NumberFormatSymbols_mt","~$goog.i18n.NumberFormatSymbols-fa","~$goog.i18n.NumberFormatSymbols_pl","~$goog.i18n.NumberFormatSymbols_de","~$goog.i18n.NumberFormatSymbols-pt","~$goog.i18n.NumberFormatSymbols-pl","~$goog.i18n.NumberFormatSymbols-lo","~$goog.i18n.NumberFormatSymbols-be","~$goog.i18n.NumberFormatSymbols_zh_TW","~$goog.i18n.NumberFormatSymbols-et","~$goog.i18n.NumberFormatSymbols-my-u-nu-latn","~$goog.i18n.NumberFormatSymbols_en_IE","~$goog.i18n.NumberFormatSymbols_kn","~$goog.i18n.NumberFormatSymbols-en-CA","~$goog.i18n.NumberFormatSymbols_bn","~$goog.i18n.NumberFormatSymbols-ka","~$goog.i18n.NumberFormatSymbols_en_GB","~$goog.i18n.NumberFormatSymbols-ar-EG","~$goog.i18n.NumberFormatSymbols-ar-EG-u-nu-latn","~$goog.i18n.NumberFormatSymbols-hu","~$goog.i18n.NumberFormatSymbols_en_ZA","~$goog.i18n.NumberFormatSymbols_hr","~$goog.i18n.NumberFormatSymbols_cy","~$goog.i18n.NumberFormatSymbols_ne","~$goog.i18n.NumberFormatSymbols-mr","~$goog.i18n.NumberFormatSymbols_mr","~$goog.i18n.NumberFormatSymbols_ml","~$goog.i18n.NumberFormatSymbols_da","~$goog.i18n.NumberFormatSymbols_fr_CA","~$goog.i18n.NumberFormatSymbols_hy","~$goog.i18n.NumberFormatSymbols_iw","~$goog.i18n.NumberFormatSymbols-cs","~$goog.i18n.NumberFormatSymbols-en","~$goog.i18n.NumberFormatSymbols-no","~$goog.i18n.NumberFormatSymbols-de","~$goog.i18n.NumberFormatSymbols-zh-CN","~$goog.i18n.NumberFormatSymbols_kk","~$goog.i18n.NumberFormatSymbols-da","~$goog.i18n.NumberFormatSymbols-he","~$goog.i18n.NumberFormatSymbols_pt","~$goog.i18n.NumberFormatSymbols_ja","~$goog.i18n.NumberFormatSymbols-br","~$goog.i18n.NumberFormatSymbols-bs","~$goog.i18n.NumberFormatSymbols_es_US","~$goog.i18n.NumberFormatSymbols-az","~$goog.i18n.NumberFormatSymbols-pt-BR","~$goog.i18n.NumberFormatSymbols_bn_u_nu_latn","~$goog.i18n.NumberFormatSymbols_es_MX","~$goog.i18n.NumberFormatSymbols_zh","~$goog.i18n.NumberFormatSymbols_mk","~$goog.i18n.NumberFormatSymbols_ro","~$goog.i18n.NumberFormatSymbols_gsw","~$goog.i18n.NumberFormatSymbols-pa","~$goog.i18n.NumberFormatSymbols_ca","~$goog.i18n.NumberFormatSymbols_gl","~$goog.i18n.NumberFormatSymbols-en-ZA","^9?","~$goog.i18n.NumberFormatSymbols_tr","~$goog.i18n.NumberFormatSymbols-ne","~$goog.i18n.NumberFormatSymbols-en-IN","~$goog.i18n.NumberFormatSymbols-hi","~$goog.i18n.NumberFormatSymbols-de-CH","~$goog.i18n.NumberFormatSymbols-in","~$goog.i18n.NumberFormatSymbols-gl","~$goog.i18n.NumberFormatSymbols_th","~$goog.i18n.NumberFormatSymbols_nl","~$goog.i18n.NumberFormatSymbols_ms","~$goog.i18n.NumberFormatSymbols-si","~$goog.i18n.NumberFormatSymbols-ar-DZ"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.iframe.js","^9C",["^9D","goog/dom/iframe.js"],"^9E","goog/dom/iframe.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for creating and working with iframes\n * cross-browser.\n * @author gboyer@google.com (Garry Boyer)\n */\n\n\ngoog.provide('goog.dom.iframe');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.SafeStyle');\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.string.Const');\ngoog.require('goog.userAgent');\n\n\n/**\n * Safe source for a blank iframe.\n *\n * Intentionally not about:blank for IE, which gives mixed content warnings in\n * IE6 over HTTPS. Using 'about:blank' for all other browsers to support Content\n * Security Policy (CSP). According to http://www.w3.org/TR/CSP/ CSP does not\n * allow inline javascript by default.\n *\n * @const {!goog.html.TrustedResourceUrl}\n */\ngoog.dom.iframe.BLANK_SOURCE_URL = goog.userAgent.IE ?\n    goog.html.TrustedResourceUrl.fromConstant(\n        goog.string.Const.from('javascript:\"\"')) :\n    goog.html.TrustedResourceUrl.fromConstant(\n        goog.string.Const.from('about:blank'));\n\n\n/**\n * Legacy version of goog.dom.iframe.BLANK_SOURCE_URL.\n * @const {string}\n */\ngoog.dom.iframe.BLANK_SOURCE =\n    goog.html.TrustedResourceUrl.unwrap(goog.dom.iframe.BLANK_SOURCE_URL);\n\n\n/**\n * Safe source for a new blank iframe that may not cause a new load of the\n * iframe. This is different from `goog.dom.iframe.BLANK_SOURCE` in that\n * it will allow an iframe to be loaded synchronously in more browsers, notably\n * Gecko, following the javascript protocol spec.\n *\n * NOTE: This should not be used to replace the source of an existing iframe.\n * The new src value will be ignored, per the spec.\n *\n * Due to cross-browser differences, the load is not guaranteed  to be\n * synchronous. If code depends on the load of the iframe,\n * then `goog.net.IframeLoadMonitor` or a similar technique should be\n * used.\n *\n * According to\n * http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#javascript-protocol\n * the 'javascript:\"\"' URL should trigger a new load of the iframe, which may be\n * asynchronous. A void src, such as 'javascript:undefined', does not change\n * the browsing context document's, and thus should not trigger another load.\n *\n * Intentionally not about:blank, which also triggers a load.\n *\n * NOTE: 'javascript:' URL handling spec compliance varies per browser. IE\n * throws an error with 'javascript:undefined'. Webkit browsers will reload the\n * iframe when setting this source on an existing iframe.\n *\n * @const {!goog.html.TrustedResourceUrl}\n */\ngoog.dom.iframe.BLANK_SOURCE_NEW_FRAME_URL = goog.userAgent.IE ?\n    goog.html.TrustedResourceUrl.fromConstant(\n        goog.string.Const.from('javascript:\"\"')) :\n    goog.html.TrustedResourceUrl.fromConstant(\n        goog.string.Const.from('javascript:undefined'));\n\n\n/**\n * Legacy version of goog.dom.iframe.BLANK_SOURCE_NEW_FRAME_URL.\n * @const {string}\n */\ngoog.dom.iframe.BLANK_SOURCE_NEW_FRAME = goog.html.TrustedResourceUrl.unwrap(\n    goog.dom.iframe.BLANK_SOURCE_NEW_FRAME_URL);\n\n\n/**\n * Styles to help ensure an undecorated iframe.\n * @const {string}\n * @private\n */\ngoog.dom.iframe.STYLES_ = 'border:0;vertical-align:bottom;';\n\n\n/**\n * Creates a completely blank iframe element.\n *\n * The iframe will not caused mixed-content warnings for IE6 under HTTPS.\n * The iframe will also have no borders or padding, so that the styled width\n * and height will be the actual width and height of the iframe.\n *\n * This function currently only attempts to create a blank iframe.  There\n * are no guarantees to the contents of the iframe or whether it is rendered\n * in quirks mode.\n *\n * @param {goog.dom.DomHelper} domHelper The dom helper to use.\n * @param {!goog.html.SafeStyle=} opt_styles CSS styles for the iframe.\n * @return {!HTMLIFrameElement} A completely blank iframe.\n */\ngoog.dom.iframe.createBlank = function(domHelper, opt_styles) {\n  var styles;\n  if (opt_styles) {\n    // SafeStyle has to be converted back to a string for now, since there's\n    // no safe alternative to createDom().\n    styles = goog.html.SafeStyle.unwrap(opt_styles);\n  } else {  // undefined.\n    styles = '';\n  }\n  var iframe = domHelper.createDom(goog.dom.TagName.IFRAME, {\n    'frameborder': 0,\n    // Since iframes are inline elements, we must align to bottom to\n    // compensate for the line descent.\n    'style': goog.dom.iframe.STYLES_ + styles\n  });\n  goog.dom.safe.setIframeSrc(iframe, goog.dom.iframe.BLANK_SOURCE_URL);\n  return iframe;\n};\n\n\n/**\n * Writes the contents of a blank iframe that has already been inserted\n * into the document.\n * @param {!HTMLIFrameElement} iframe An iframe with no contents, such as\n *     one created by {@link #createBlank}, but already appended to\n *     a parent document.\n * @param {!goog.html.SafeHtml} content Content to write to the iframe,\n *     from doctype to the HTML close tag.\n */\ngoog.dom.iframe.writeSafeContent = function(iframe, content) {\n  var doc = goog.dom.getFrameContentDocument(iframe);\n  doc.open();\n  goog.dom.safe.documentWrite(doc, content);\n  doc.close();\n};\n\n\n// TODO(gboyer): Provide a higher-level API for the most common use case, so\n// that you can just provide a list of stylesheets and some content HTML.\n/**\n * Creates a same-domain iframe containing preloaded content.\n *\n * This is primarily useful for DOM sandboxing.  One use case is to embed\n * a trusted JavaScript app with potentially conflicting CSS styles.  The\n * second case is to reduce the cost of layout passes by the browser -- for\n * example, you can perform sandbox sizing of characters in an iframe while\n * manipulating a heavy DOM in the main window.  The iframe and parent frame\n * can access each others' properties and functions without restriction.\n *\n * @param {!Element} parentElement The parent element in which to append the\n *     iframe.\n * @param {!goog.html.SafeHtml=} opt_headContents Contents to go into the\n *     iframe's head.\n * @param {!goog.html.SafeHtml=} opt_bodyContents Contents to go into the\n *     iframe's body.\n * @param {!goog.html.SafeStyle=} opt_styles CSS styles for the iframe itself,\n *     before adding to the parent element.\n * @param {boolean=} opt_quirks Whether to use quirks mode (false by default).\n * @return {!HTMLIFrameElement} An iframe that has the specified contents.\n */\ngoog.dom.iframe.createWithContent = function(\n    parentElement, opt_headContents, opt_bodyContents, opt_styles, opt_quirks) {\n  var domHelper = goog.dom.getDomHelper(parentElement);\n\n  var content = goog.html.SafeHtml.create(\n      'html', {},\n      goog.html.SafeHtml.concat(\n          goog.html.SafeHtml.create('head', {}, opt_headContents),\n          goog.html.SafeHtml.create('body', {}, opt_bodyContents)));\n  if (!opt_quirks) {\n    content =\n        goog.html.SafeHtml.concat(goog.html.SafeHtml.DOCTYPE_HTML, content);\n  }\n\n  var iframe = goog.dom.iframe.createBlank(domHelper, opt_styles);\n\n  // Cannot manipulate iframe content until it is in a document.\n  parentElement.appendChild(iframe);\n  goog.dom.iframe.writeSafeContent(iframe, content);\n\n  return iframe;\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","^=I","^9>","^:S","^=M","~$goog.html.SafeStyle","^@B","^@C","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/iframe.js"],"^:1",["^9K",["^>>"]],"^9<",true,"^9=",["^9>","^;;","^;=","^@B","^@C","^G3","^=I","^=M","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.math.matrix.js","^9C",["^9D","goog/math/matrix.js"],"^9E","goog/math/matrix.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class for representing matrices and static helper functions.\n */\n\ngoog.provide('goog.math.Matrix');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.math');\ngoog.require('goog.math.Size');\ngoog.require('goog.string');\n\n\n\n/**\n * Class for representing and manipulating matrices.\n *\n * The entry that lies in the i-th row and the j-th column of a matrix is\n * typically referred to as the i,j entry of the matrix.\n *\n * The m-by-n matrix A would have its entries referred to as:\n *   [ a0,0   a0,1   a0,2   ...   a0,j  ...  a0,n ]\n *   [ a1,0   a1,1   a1,2   ...   a1,j  ...  a1,n ]\n *   [ a2,0   a2,1   a2,2   ...   a2,j  ...  a2,n ]\n *   [  .      .      .            .          .   ]\n *   [  .      .      .            .          .   ]\n *   [  .      .      .            .          .   ]\n *   [ ai,0   ai,1   ai,2   ...   ai,j  ...  ai,n ]\n *   [  .      .      .            .          .   ]\n *   [  .      .      .            .          .   ]\n *   [  .      .      .            .          .   ]\n *   [ am,0   am,1   am,2   ...   am,j  ...  am,n ]\n *\n * @param {!goog.math.Matrix|!Array<!Array<number>>|!goog.math.Size|number} m\n *     A matrix to copy, a 2D-array to take as a template, a size object for\n *     dimensions, or the number of rows.\n * @param {number=} opt_n Number of columns of the matrix (only applicable if\n *     the first argument is also numeric).\n * @struct\n * @constructor\n * @final\n */\ngoog.math.Matrix = function(m, opt_n) {\n  if (m instanceof goog.math.Matrix) {\n    this.array_ = m.toArray();\n  } else if (\n      goog.isArrayLike(m) &&\n      goog.math.Matrix.isValidArray(\n          /** @type {!Array<!Array<number>>} */ (m))) {\n    this.array_ = goog.array.clone(/** @type {!Array<!Array<number>>} */ (m));\n  } else if (m instanceof goog.math.Size) {\n    this.array_ = goog.math.Matrix.createZeroPaddedArray_(m.height, m.width);\n  } else if (\n      typeof m === 'number' && typeof opt_n === 'number' && m > 0 &&\n      opt_n > 0) {\n    this.array_ = goog.math.Matrix.createZeroPaddedArray_(\n        /** @type {number} */ (m), opt_n);\n  } else {\n    throw new Error('Invalid argument(s) for Matrix contructor');\n  }\n\n  this.size_ = new goog.math.Size(this.array_[0].length, this.array_.length);\n};\n\n\n/**\n * Creates a square identity matrix. i.e. for n = 3:\n * <pre>\n * [ 1 0 0 ]\n * [ 0 1 0 ]\n * [ 0 0 1 ]\n * </pre>\n * @param {number} n The size of the square identity matrix.\n * @return {!goog.math.Matrix} Identity matrix of width and height `n`.\n */\ngoog.math.Matrix.createIdentityMatrix = function(n) {\n  var rv = [];\n  for (var i = 0; i < n; i++) {\n    rv[i] = [];\n    for (var j = 0; j < n; j++) {\n      rv[i][j] = i == j ? 1 : 0;\n    }\n  }\n  return new goog.math.Matrix(rv);\n};\n\n\n/**\n * Calls a function for each cell in a matrix.\n * @param {goog.math.Matrix} matrix The matrix to iterate over.\n * @param {function(this:T, number, number, number, !goog.math.Matrix)} fn\n *     The function to call for every element. This function\n *     takes 4 arguments (value, i, j, and the matrix)\n *     and the return value is irrelevant.\n * @param {T=} opt_obj The object to be used as the value of 'this'\n *     within `fn`.\n * @template T\n */\ngoog.math.Matrix.forEach = function(matrix, fn, opt_obj) {\n  for (var i = 0; i < matrix.getSize().height; i++) {\n    for (var j = 0; j < matrix.getSize().width; j++) {\n      fn.call(opt_obj, matrix.array_[i][j], i, j, matrix);\n    }\n  }\n};\n\n\n/**\n * Tests whether an array is a valid matrix.  A valid array is an array of\n * arrays where all arrays are of the same length and all elements are numbers.\n * @param {!Array<!Array<number>>} arr An array to test.\n * @return {boolean} Whether the array is a valid matrix.\n */\ngoog.math.Matrix.isValidArray = function(arr) {\n  var len = 0;\n  for (var i = 0; i < arr.length; i++) {\n    if (!goog.isArrayLike(arr[i]) || len > 0 && arr[i].length != len) {\n      return false;\n    }\n    for (var j = 0; j < arr[i].length; j++) {\n      if (typeof arr[i][j] !== 'number') {\n        return false;\n      }\n    }\n    if (len == 0) {\n      len = arr[i].length;\n    }\n  }\n  return len != 0;\n};\n\n\n/**\n * Calls a function for every cell in a matrix and inserts the result into a\n * new matrix of equal dimensions.\n * @param {!goog.math.Matrix} matrix The matrix to iterate over.\n * @param {function(this:T, number, number, number, !goog.math.Matrix): number}\n *     fn The function to call for every element. This function\n *     takes 4 arguments (value, i, j and the matrix)\n *     and should return a number, which will be inserted into a new matrix.\n * @param {T=} opt_obj The object to be used as the value of 'this'\n *     within `fn`.\n * @return {!goog.math.Matrix} A new matrix with the results from `fn`.\n * @template T\n */\ngoog.math.Matrix.map = function(matrix, fn, opt_obj) {\n  var m = new goog.math.Matrix(matrix.getSize());\n  goog.math.Matrix.forEach(matrix, function(value, i, j) {\n    m.array_[i][j] = fn.call(opt_obj, value, i, j, matrix);\n  });\n  return m;\n};\n\n\n/**\n * Creates a new zero padded matix.\n * @param {number} m Height of matrix.\n * @param {number} n Width of matrix.\n * @return {!Array<!Array<number>>} The new zero padded matrix.\n * @private\n */\ngoog.math.Matrix.createZeroPaddedArray_ = function(m, n) {\n  var rv = [];\n  for (var i = 0; i < m; i++) {\n    rv[i] = [];\n    for (var j = 0; j < n; j++) {\n      rv[i][j] = 0;\n    }\n  }\n  return rv;\n};\n\n\n/**\n * Internal array representing the matrix.\n * @type {!Array<!Array<number>>}\n * @private\n */\ngoog.math.Matrix.prototype.array_;\n\n\n/**\n * After construction the Matrix's size is constant and stored in this object.\n * @type {!goog.math.Size}\n * @private\n */\ngoog.math.Matrix.prototype.size_;\n\n\n/**\n * Returns a new matrix that is the sum of this and the provided matrix.\n * @param {goog.math.Matrix} m The matrix to add to this one.\n * @return {!goog.math.Matrix} Resultant sum.\n */\ngoog.math.Matrix.prototype.add = function(m) {\n  if (!goog.math.Size.equals(this.size_, m.getSize())) {\n    throw new Error(\n        'Matrix summation is only supported on arrays of equal size');\n  }\n  return goog.math.Matrix.map(\n      this, function(val, i, j) { return val + m.array_[i][j]; });\n};\n\n\n/**\n * Appends the given matrix to the right side of this matrix.\n * @param {goog.math.Matrix} m The matrix to augment this matrix with.\n * @return {!goog.math.Matrix} A new matrix with additional columns on the\n *     right.\n */\ngoog.math.Matrix.prototype.appendColumns = function(m) {\n  if (this.size_.height != m.getSize().height) {\n    throw new Error(\n        'The given matrix has height ' + m.size_.height + ', but ' +\n        ' needs to have height ' + this.size_.height + '.');\n  }\n  var result =\n      new goog.math.Matrix(this.size_.height, this.size_.width + m.size_.width);\n  goog.math.Matrix.forEach(\n      this, function(value, i, j) { result.array_[i][j] = value; });\n  goog.math.Matrix.forEach(m, function(value, i, j) {\n    result.array_[i][this.size_.width + j] = value;\n  }, this);\n  return result;\n};\n\n\n/**\n * Appends the given matrix to the bottom of this matrix.\n * @param {goog.math.Matrix} m The matrix to augment this matrix with.\n * @return {!goog.math.Matrix} A new matrix with added columns on the bottom.\n */\ngoog.math.Matrix.prototype.appendRows = function(m) {\n  if (this.size_.width != m.getSize().width) {\n    throw new Error(\n        'The given matrix has width ' + m.size_.width + ', but ' +\n        ' needs to have width ' + this.size_.width + '.');\n  }\n  var result = new goog.math.Matrix(\n      this.size_.height + m.size_.height, this.size_.width);\n  goog.math.Matrix.forEach(\n      this, function(value, i, j) { result.array_[i][j] = value; });\n  goog.math.Matrix.forEach(m, function(value, i, j) {\n    result.array_[this.size_.height + i][j] = value;\n  }, this);\n  return result;\n};\n\n\n/**\n * Returns whether the given matrix equals this matrix.\n * @param {goog.math.Matrix} m The matrix to compare to this one.\n * @param {number=} opt_tolerance The tolerance when comparing array entries.\n * @return {boolean} Whether the given matrix equals this matrix.\n */\ngoog.math.Matrix.prototype.equals = function(m, opt_tolerance) {\n  if (this.size_.width != m.size_.width) {\n    return false;\n  }\n  if (this.size_.height != m.size_.height) {\n    return false;\n  }\n\n  var tolerance = opt_tolerance || 0;\n  for (var i = 0; i < this.size_.height; i++) {\n    for (var j = 0; j < this.size_.width; j++) {\n      if (!goog.math.nearlyEquals(\n              this.array_[i][j], m.array_[i][j], tolerance)) {\n        return false;\n      }\n    }\n  }\n\n  return true;\n};\n\n\n/**\n * Returns the determinant of this matrix.  The determinant of a matrix A is\n * often denoted as |A| and can only be applied to a square matrix.\n * @return {number} The determinant of this matrix.\n */\ngoog.math.Matrix.prototype.getDeterminant = function() {\n  if (!this.isSquare()) {\n    throw new Error('A determinant can only be take on a square matrix');\n  }\n\n  return this.getDeterminant_();\n};\n\n\n/**\n * Returns the inverse of this matrix if it exists or null if the matrix is\n * not invertible.\n * @return {goog.math.Matrix} A new matrix which is the inverse of this matrix.\n */\ngoog.math.Matrix.prototype.getInverse = function() {\n  if (!this.isSquare()) {\n    throw new Error('An inverse can only be taken on a square matrix.');\n  }\n  if (this.getSize().width == 1) {\n    var a = this.getValueAt(0, 0);\n    return a == 0 ? null : new goog.math.Matrix([[1 / Number(a)]]);\n  }\n  var identity = goog.math.Matrix.createIdentityMatrix(this.size_.height);\n  var mi = this.appendColumns(identity).getReducedRowEchelonForm();\n  var i = mi.getSubmatrixByCoordinates_(\n      0, 0, identity.size_.width - 1, identity.size_.height - 1);\n  if (!i.equals(identity)) {\n    return null;  // This matrix was not invertible\n  }\n  return mi.getSubmatrixByCoordinates_(0, identity.size_.width);\n};\n\n\n/**\n * Transforms this matrix into reduced row echelon form.\n * @return {!goog.math.Matrix} A new matrix reduced row echelon form.\n */\ngoog.math.Matrix.prototype.getReducedRowEchelonForm = function() {\n  var result = new goog.math.Matrix(this);\n  var col = 0;\n  // Each iteration puts one row in reduced row echelon form\n  for (var row = 0; row < result.size_.height; row++) {\n    if (col >= result.size_.width) {\n      return result;\n    }\n\n    // Scan each column starting from this row on down for a non-zero value\n    var i = row;\n    while (result.array_[i][col] == 0) {\n      i++;\n      if (i == result.size_.height) {\n        i = row;\n        col++;\n        if (col == result.size_.width) {\n          return result;\n        }\n      }\n    }\n\n    // Make the row we found the current row with a leading 1\n    this.swapRows_(i, row);\n    var divisor = result.array_[row][col];\n    for (var j = col; j < result.size_.width; j++) {\n      result.array_[row][j] = result.array_[row][j] / divisor;\n    }\n\n    // Subtract a multiple of this row from each other row\n    // so that all the other entries in this column are 0\n    for (i = 0; i < result.size_.height; i++) {\n      if (i != row) {\n        var multiple = result.array_[i][col];\n        for (var j = col; j < result.size_.width; j++) {\n          result.array_[i][j] -= multiple * result.array_[row][j];\n        }\n      }\n    }\n\n    // Move on to the next column\n    col++;\n  }\n  return result;\n};\n\n\n/**\n * @return {!goog.math.Size} The dimensions of the matrix.\n */\ngoog.math.Matrix.prototype.getSize = function() {\n  return this.size_;\n};\n\n\n/**\n * Return the transpose of this matrix.  For an m-by-n matrix, the transpose\n * is the n-by-m matrix which results from turning rows into columns and columns\n * into rows\n * @return {!goog.math.Matrix} A new matrix A^T.\n */\ngoog.math.Matrix.prototype.getTranspose = function() {\n  var m = new goog.math.Matrix(this.size_.width, this.size_.height);\n  goog.math.Matrix.forEach(\n      this, function(value, i, j) { m.array_[j][i] = value; });\n  return m;\n};\n\n\n/**\n * Retrieves the value of a particular coordinate in the matrix or null if the\n * requested coordinates are out of range.\n * @param {number} i The i index of the coordinate.\n * @param {number} j The j index of the coordinate.\n * @return {?number} The value at the specified coordinate.\n */\ngoog.math.Matrix.prototype.getValueAt = function(i, j) {\n  if (!this.isInBounds_(i, j)) {\n    return null;\n  }\n  return this.array_[i][j];\n};\n\n\n/**\n * @return {boolean} Whether the horizontal and vertical dimensions of this\n *     matrix are the same.\n */\ngoog.math.Matrix.prototype.isSquare = function() {\n  return this.size_.width == this.size_.height;\n};\n\n\n/**\n * Sets the value at a particular coordinate (if the coordinate is within the\n * bounds of the matrix).\n * @param {number} i The i index of the coordinate.\n * @param {number} j The j index of the coordinate.\n * @param {number} value The new value for the coordinate.\n */\ngoog.math.Matrix.prototype.setValueAt = function(i, j, value) {\n  if (!this.isInBounds_(i, j)) {\n    throw new Error(\n        'Index out of bounds when setting matrix value, (' + i + ',' + j +\n        ') in size (' + this.size_.height + ',' + this.size_.width + ')');\n  }\n  this.array_[i][j] = value;\n};\n\n\n/**\n * Performs matrix or scalar multiplication on a matrix and returns the\n * resultant matrix.\n *\n * Matrix multiplication is defined between two matrices only if the number of\n * columns of the first matrix is the same as the number of rows of the second\n * matrix. If A is an m-by-n matrix and B is an n-by-p matrix, then their\n * product AB is an m-by-p matrix\n *\n * Scalar multiplication returns a matrix of the same size as the original,\n * each value multiplied by the given value.\n *\n * @param {goog.math.Matrix|number} m Matrix/number to multiply the matrix by.\n * @return {!goog.math.Matrix} Resultant product.\n */\ngoog.math.Matrix.prototype.multiply = function(m) {\n  if (m instanceof goog.math.Matrix) {\n    if (this.size_.width != m.getSize().height) {\n      throw new Error(\n          'Invalid matrices for multiplication. Second matrix ' +\n          'should have the same number of rows as the first has columns.');\n    }\n    return this.matrixMultiply_(/** @type {!goog.math.Matrix} */ (m));\n  } else if (typeof m === 'number') {\n    return this.scalarMultiply_(/** @type {number} */ (m));\n  } else {\n    throw new Error(\n        'A matrix can only be multiplied by' +\n        ' a number or another matrix.');\n  }\n};\n\n\n/**\n * Returns a new matrix that is the difference of this and the provided matrix.\n * @param {goog.math.Matrix} m The matrix to subtract from this one.\n * @return {!goog.math.Matrix} Resultant difference.\n */\ngoog.math.Matrix.prototype.subtract = function(m) {\n  if (!goog.math.Size.equals(this.size_, m.getSize())) {\n    throw new Error(\n        'Matrix subtraction is only supported on arrays of equal size.');\n  }\n  return goog.math.Matrix.map(\n      this, function(val, i, j) { return val - m.array_[i][j]; });\n};\n\n\n/**\n * @return {!Array<!Array<number>>} A 2D internal array representing this\n *     matrix.  Not a clone.\n */\ngoog.math.Matrix.prototype.toArray = function() {\n  return this.array_;\n};\n\n\nif (goog.DEBUG) {\n  /**\n   * Returns a string representation of the matrix.  e.g.\n   * <pre>\n   * [ 12  5  9  1 ]\n   * [  4 16  0 17 ]\n   * [ 12  5  1 23 ]\n   * </pre>\n   *\n   * @return {string} A string representation of this matrix.\n   * @override\n   */\n  goog.math.Matrix.prototype.toString = function() {\n    // Calculate correct padding for optimum display of matrix\n    var maxLen = 0;\n    goog.math.Matrix.forEach(this, function(val) {\n      var len = String(val).length;\n      if (len > maxLen) {\n        maxLen = len;\n      }\n    });\n\n    // Build the string\n    var sb = [];\n    goog.array.forEach(this.array_, function(row, x) {\n      sb.push('[ ');\n      goog.array.forEach(row, function(val, y) {\n        var strval = String(val);\n        sb.push(goog.string.repeat(' ', maxLen - strval.length) + strval + ' ');\n      });\n      sb.push(']\\n');\n    });\n\n    return sb.join('');\n  };\n}\n\n\n/**\n * Returns the signed minor.\n * @param {number} i The row index.\n * @param {number} j The column index.\n * @return {number} The cofactor C[i,j] of this matrix.\n * @private\n */\ngoog.math.Matrix.prototype.getCofactor_ = function(i, j) {\n  return (i + j % 2 == 0 ? 1 : -1) * this.getMinor_(i, j);\n};\n\n\n/**\n * Returns the determinant of this matrix.  The determinant of a matrix A is\n * often denoted as |A| and can only be applied to a square matrix.  Same as\n * public method but without validation.  Implemented using Laplace's formula.\n * @return {number} The determinant of this matrix.\n * @private\n */\ngoog.math.Matrix.prototype.getDeterminant_ = function() {\n  if (this.getSize().area() == 1) {\n    return this.array_[0][0];\n  }\n\n  // We might want to use matrix decomposition to improve running time\n  // For now we'll do a Laplace expansion along the first row\n  var determinant = 0;\n  for (var j = 0; j < this.size_.width; j++) {\n    determinant += (this.array_[0][j] * this.getCofactor_(0, j));\n  }\n  return determinant;\n};\n\n\n/**\n * Returns the determinant of the submatrix resulting from the deletion of row i\n * and column j.\n * @param {number} i The row to delete.\n * @param {number} j The column to delete.\n * @return {number} The first minor M[i,j] of this matrix.\n * @private\n */\ngoog.math.Matrix.prototype.getMinor_ = function(i, j) {\n  return this.getSubmatrixByDeletion_(i, j).getDeterminant_();\n};\n\n\n/**\n * Returns a submatrix contained within this matrix.\n * @param {number} i1 The upper row index.\n * @param {number} j1 The left column index.\n * @param {number=} opt_i2 The lower row index.\n * @param {number=} opt_j2 The right column index.\n * @return {!goog.math.Matrix} The submatrix contained within the given bounds.\n * @private\n */\ngoog.math.Matrix.prototype.getSubmatrixByCoordinates_ = function(\n    i1, j1, opt_i2, opt_j2) {\n  var i2 = opt_i2 ? opt_i2 : this.size_.height - 1;\n  var j2 = opt_j2 ? opt_j2 : this.size_.width - 1;\n  var result = new goog.math.Matrix(i2 - i1 + 1, j2 - j1 + 1);\n  goog.math.Matrix.forEach(result, function(value, i, j) {\n    result.array_[i][j] = this.array_[i1 + i][j1 + j];\n  }, this);\n  return result;\n};\n\n\n/**\n * Returns a new matrix equal to this one, but with row i and column j deleted.\n * @param {number} i The row index of the coordinate.\n * @param {number} j The column index of the coordinate.\n * @return {!goog.math.Matrix} The value at the specified coordinate.\n * @private\n */\ngoog.math.Matrix.prototype.getSubmatrixByDeletion_ = function(i, j) {\n  var m = new goog.math.Matrix(this.size_.width - 1, this.size_.height - 1);\n  goog.math.Matrix.forEach(m, function(value, x, y) {\n    m.setValueAt(x, y, this.array_[x >= i ? x + 1 : x][y >= j ? y + 1 : y]);\n  }, this);\n  return m;\n};\n\n\n/**\n * Returns whether the given coordinates are contained within the bounds of the\n * matrix.\n * @param {number} i The i index of the coordinate.\n * @param {number} j The j index of the coordinate.\n * @return {boolean} The value at the specified coordinate.\n * @private\n */\ngoog.math.Matrix.prototype.isInBounds_ = function(i, j) {\n  return i >= 0 && i < this.size_.height && j >= 0 && j < this.size_.width;\n};\n\n\n/**\n * Matrix multiplication is defined between two matrices only if the number of\n * columns of the first matrix is the same as the number of rows of the second\n * matrix. If A is an m-by-n matrix and B is an n-by-p matrix, then their\n * product AB is an m-by-p matrix\n *\n * @param {goog.math.Matrix} m Matrix to multiply the matrix by.\n * @return {!goog.math.Matrix} Resultant product.\n * @private\n */\ngoog.math.Matrix.prototype.matrixMultiply_ = function(m) {\n  var resultMatrix = new goog.math.Matrix(this.size_.height, m.getSize().width);\n  goog.math.Matrix.forEach(resultMatrix, function(val, x, y) {\n    var newVal = 0;\n    for (var i = 0; i < this.size_.width; i++) {\n      newVal += goog.asserts.assertNumber(this.getValueAt(x, i)) *\n          goog.asserts.assertNumber(m.getValueAt(i, y));\n    }\n    resultMatrix.setValueAt(x, y, newVal);\n  }, this);\n  return resultMatrix;\n};\n\n\n/**\n * Scalar multiplication returns a matrix of the same size as the original,\n * each value multiplied by the given value.\n *\n * @param {number} m number to multiply the matrix by.\n * @return {!goog.math.Matrix} Resultant product.\n * @private\n */\ngoog.math.Matrix.prototype.scalarMultiply_ = function(m) {\n  return goog.math.Matrix.map(this, function(val, x, y) { return val * m; });\n};\n\n\n/**\n * Swaps two rows.\n * @param {number} i1 The index of the first row to swap.\n * @param {number} i2 The index of the second row to swap.\n * @private\n */\ngoog.math.Matrix.prototype.swapRows_ = function(i1, i2) {\n  var tmp = this.array_[i1];\n  this.array_[i1] = this.array_[i2];\n  this.array_[i2] = tmp;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9L","~$goog.math.Size","^9>","^<2","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/matrix.js"],"^:1",["^9K",["~$goog.math.Matrix"]],"^9<",true,"^9=",["^9>","^;9","^:E","^<2","^G4","^9L"]],["^ ","^9A",[1579837703000],"^9B","goog.fx.dom.js","^9C",["^9D","goog/fx/dom.js"],"^9E","goog/fx/dom.js","^9F","^9G","^9H","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Predefined DHTML animations such as slide, resize and fade.\n *\n * @see ../demos/effects.html\n */\n\ngoog.provide('goog.fx.dom');\ngoog.provide('goog.fx.dom.BgColorTransform');\ngoog.provide('goog.fx.dom.ColorTransform');\ngoog.provide('goog.fx.dom.Fade');\ngoog.provide('goog.fx.dom.FadeIn');\ngoog.provide('goog.fx.dom.FadeInAndShow');\ngoog.provide('goog.fx.dom.FadeOut');\ngoog.provide('goog.fx.dom.FadeOutAndHide');\ngoog.provide('goog.fx.dom.PredefinedEffect');\ngoog.provide('goog.fx.dom.Resize');\ngoog.provide('goog.fx.dom.ResizeHeight');\ngoog.provide('goog.fx.dom.ResizeWidth');\ngoog.provide('goog.fx.dom.Scroll');\ngoog.provide('goog.fx.dom.Slide');\ngoog.provide('goog.fx.dom.SlideFrom');\ngoog.provide('goog.fx.dom.Swipe');\n\ngoog.forwardDeclare('goog.events.EventHandler');\ngoog.require('goog.color');\ngoog.require('goog.events');\ngoog.require('goog.fx.Animation');\ngoog.require('goog.fx.Transition');\ngoog.require('goog.style');\ngoog.require('goog.style.bidi');\n\n\n\n/**\n * Abstract class that provides reusable functionality for predefined animations\n * that manipulate a single DOM element\n *\n * @param {Element} element Dom Node to be used in the animation.\n * @param {Array<number>} start Array for start coordinates.\n * @param {Array<number>} end Array for end coordinates.\n * @param {number} time Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @extends {goog.fx.Animation}\n * @constructor\n * @struct\n */\ngoog.fx.dom.PredefinedEffect = function(element, start, end, time, opt_acc) {\n  goog.fx.dom.PredefinedEffect.base(\n      this, 'constructor', start, end, time, opt_acc);\n\n  /**\n   * DOM Node that will be used in the animation\n   * @type {Element}\n   */\n  this.element = element;\n\n  /**\n   * Whether the element is rendered right-to-left. We cache this here for\n   * efficiency.\n   * @private {boolean|undefined}\n   */\n  this.rightToLeft_;\n};\ngoog.inherits(goog.fx.dom.PredefinedEffect, goog.fx.Animation);\n\n\n/**\n * Called to update the style of the element.\n * @protected\n */\ngoog.fx.dom.PredefinedEffect.prototype.updateStyle = goog.nullFunction;\n\n\n/**\n * Whether the DOM element being manipulated is rendered right-to-left.\n * @return {boolean} True if the DOM element is rendered right-to-left, false\n *     otherwise.\n */\ngoog.fx.dom.PredefinedEffect.prototype.isRightToLeft = function() {\n  if (this.rightToLeft_ === undefined) {\n    this.rightToLeft_ = goog.style.isRightToLeft(this.element);\n  }\n  return this.rightToLeft_;\n};\n\n\n/** @override */\ngoog.fx.dom.PredefinedEffect.prototype.onAnimate = function() {\n  this.updateStyle();\n  goog.fx.dom.PredefinedEffect.superClass_.onAnimate.call(this);\n};\n\n\n/** @override */\ngoog.fx.dom.PredefinedEffect.prototype.onEnd = function() {\n  this.updateStyle();\n  goog.fx.dom.PredefinedEffect.superClass_.onEnd.call(this);\n};\n\n\n/** @override */\ngoog.fx.dom.PredefinedEffect.prototype.onBegin = function() {\n  this.updateStyle();\n  goog.fx.dom.PredefinedEffect.superClass_.onBegin.call(this);\n};\n\n\n\n/**\n * Creates an animation object that will slide an element from A to B.  (This\n * in effect automatically sets up the onanimate event for an Animation object)\n *\n * Start and End should be 2 dimensional arrays\n *\n * @param {Element} element Dom Node to be used in the animation.\n * @param {Array<number>} start 2D array for start coordinates (X, Y).\n * @param {Array<number>} end 2D array for end coordinates (X, Y).\n * @param {number} time Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @extends {goog.fx.dom.PredefinedEffect}\n * @constructor\n * @struct\n */\ngoog.fx.dom.Slide = function(element, start, end, time, opt_acc) {\n  if (start.length != 2 || end.length != 2) {\n    throw new Error('Start and end points must be 2D');\n  }\n  goog.fx.dom.Slide.base(\n      this, 'constructor', element, start, end, time, opt_acc);\n};\ngoog.inherits(goog.fx.dom.Slide, goog.fx.dom.PredefinedEffect);\n\n\n/** @override */\ngoog.fx.dom.Slide.prototype.updateStyle = function() {\n  var pos = (this.isRightPositioningForRtlEnabled() && this.isRightToLeft()) ?\n      'right' :\n      'left';\n  this.element.style[pos] = Math.round(this.coords[0]) + 'px';\n  this.element.style.top = Math.round(this.coords[1]) + 'px';\n};\n\n\n\n/**\n * Slides an element from its current position.\n *\n * @param {Element} element DOM node to be used in the animation.\n * @param {Array<number>} end 2D array for end coordinates (X, Y).\n * @param {number} time Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @extends {goog.fx.dom.Slide}\n * @constructor\n * @struct\n */\ngoog.fx.dom.SlideFrom = function(element, end, time, opt_acc) {\n  var offsetLeft = /** @type {!HTMLElement} */ (element).offsetLeft;\n  var start = [offsetLeft, /** @type {!HTMLElement} */ (element).offsetTop];\n  goog.fx.dom.SlideFrom.base(\n      this, 'constructor', element, start, end, time, opt_acc);\n  /** @type {?Array<number>} */\n  this.startPoint;\n};\ngoog.inherits(goog.fx.dom.SlideFrom, goog.fx.dom.Slide);\n\n\n/** @override */\ngoog.fx.dom.SlideFrom.prototype.onBegin = function() {\n  var offsetLeft = this.isRightPositioningForRtlEnabled() ?\n      goog.style.bidi.getOffsetStart(this.element) :\n      /** @type {!HTMLElement} */ (this.element).offsetLeft;\n  this.startPoint = [\n    offsetLeft,\n    /** @type {!HTMLElement} */ (this.element).offsetTop\n  ];\n  goog.fx.dom.SlideFrom.superClass_.onBegin.call(this);\n};\n\n\n\n/**\n * Creates an animation object that will slide an element into its final size.\n * Requires that the element is absolutely positioned.\n *\n * @param {Element} element Dom Node to be used in the animation.\n * @param {Array<number>} start 2D array for start size (W, H).\n * @param {Array<number>} end 2D array for end size (W, H).\n * @param {number} time Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @extends {goog.fx.dom.PredefinedEffect}\n * @constructor\n * @struct\n */\ngoog.fx.dom.Swipe = function(element, start, end, time, opt_acc) {\n  if (start.length != 2 || end.length != 2) {\n    throw new Error('Start and end points must be 2D');\n  }\n  goog.fx.dom.Swipe.base(\n      this, 'constructor', element, start, end, time, opt_acc);\n\n  /**\n   * Maximum width for element.\n   * @type {number}\n   * @private\n   */\n  this.maxWidth_ = Math.max(this.endPoint[0], this.startPoint[0]);\n\n  /**\n   * Maximum height for element.\n   * @type {number}\n   * @private\n   */\n  this.maxHeight_ = Math.max(this.endPoint[1], this.startPoint[1]);\n};\ngoog.inherits(goog.fx.dom.Swipe, goog.fx.dom.PredefinedEffect);\n\n\n/**\n * Animation event handler that will resize an element by setting its width,\n * height and clipping.\n * @protected\n * @override\n */\ngoog.fx.dom.Swipe.prototype.updateStyle = function() {\n  var x = this.coords[0];\n  var y = this.coords[1];\n  this.clip_(Math.round(x), Math.round(y), this.maxWidth_, this.maxHeight_);\n  this.element.style.width = Math.round(x) + 'px';\n  var marginX =\n      (this.isRightPositioningForRtlEnabled() && this.isRightToLeft()) ?\n      'marginRight' :\n      'marginLeft';\n\n  this.element.style[marginX] = Math.round(x) - this.maxWidth_ + 'px';\n  this.element.style.marginTop = Math.round(y) - this.maxHeight_ + 'px';\n};\n\n\n/**\n * Helper function for setting element clipping.\n * @param {number} x Current element width.\n * @param {number} y Current element height.\n * @param {number} w Maximum element width.\n * @param {number} h Maximum element height.\n * @private\n */\ngoog.fx.dom.Swipe.prototype.clip_ = function(x, y, w, h) {\n  this.element.style.clip =\n      'rect(' + (h - y) + 'px ' + w + 'px ' + h + 'px ' + (w - x) + 'px)';\n};\n\n\n\n/**\n * Creates an animation object that will scroll an element from A to B.\n *\n * Start and End should be 2 dimensional arrays\n *\n * @param {Element} element Dom Node to be used in the animation.\n * @param {Array<number>} start 2D array for start scroll left and top.\n * @param {Array<number>} end 2D array for end scroll left and top.\n * @param {number} time Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @extends {goog.fx.dom.PredefinedEffect}\n * @constructor\n * @struct\n */\ngoog.fx.dom.Scroll = function(element, start, end, time, opt_acc) {\n  if (start.length != 2 || end.length != 2) {\n    throw new Error('Start and end points must be 2D');\n  }\n  goog.fx.dom.Scroll.base(\n      this, 'constructor', element, start, end, time, opt_acc);\n};\ngoog.inherits(goog.fx.dom.Scroll, goog.fx.dom.PredefinedEffect);\n\n\n/**\n * Animation event handler that will set the scroll position of an element.\n * @protected\n * @override\n */\ngoog.fx.dom.Scroll.prototype.updateStyle = function() {\n  if (this.isRightPositioningForRtlEnabled()) {\n    goog.style.bidi.setScrollOffset(this.element, Math.round(this.coords[0]));\n  } else {\n    this.element.scrollLeft = Math.round(this.coords[0]);\n  }\n  this.element.scrollTop = Math.round(this.coords[1]);\n};\n\n\n\n/**\n * Creates an animation object that will resize an element between two widths\n * and heights.\n *\n * Start and End should be 2 dimensional arrays\n *\n * @param {Element} element Dom Node to be used in the animation.\n * @param {Array<number>} start 2D array for start width and height.\n * @param {Array<number>} end 2D array for end width and height.\n * @param {number} time Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @extends {goog.fx.dom.PredefinedEffect}\n * @constructor\n * @struct\n */\ngoog.fx.dom.Resize = function(element, start, end, time, opt_acc) {\n  if (start.length != 2 || end.length != 2) {\n    throw new Error('Start and end points must be 2D');\n  }\n  goog.fx.dom.Resize.base(\n      this, 'constructor', element, start, end, time, opt_acc);\n};\ngoog.inherits(goog.fx.dom.Resize, goog.fx.dom.PredefinedEffect);\n\n\n/**\n * Animation event handler that will resize an element by setting its width and\n * height.\n * @protected\n * @override\n */\ngoog.fx.dom.Resize.prototype.updateStyle = function() {\n  this.element.style.width = Math.round(this.coords[0]) + 'px';\n  this.element.style.height = Math.round(this.coords[1]) + 'px';\n};\n\n\n\n/**\n * Creates an animation object that will resize an element between two widths\n *\n * Start and End should be numbers\n *\n * @param {Element} element Dom Node to be used in the animation.\n * @param {number} start Start width.\n * @param {number} end End width.\n * @param {number} time Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @extends {goog.fx.dom.PredefinedEffect}\n * @constructor\n * @struct\n */\ngoog.fx.dom.ResizeWidth = function(element, start, end, time, opt_acc) {\n  goog.fx.dom.ResizeWidth.base(\n      this, 'constructor', element, [start], [end], time, opt_acc);\n};\ngoog.inherits(goog.fx.dom.ResizeWidth, goog.fx.dom.PredefinedEffect);\n\n\n/**\n * Animation event handler that will resize an element by setting its width.\n * @protected\n * @override\n */\ngoog.fx.dom.ResizeWidth.prototype.updateStyle = function() {\n  this.element.style.width = Math.round(this.coords[0]) + 'px';\n};\n\n\n\n/**\n * Creates an animation object that will resize an element between two heights\n *\n * Start and End should be numbers\n *\n * @param {Element} element Dom Node to be used in the animation.\n * @param {number} start Start height.\n * @param {number} end End height.\n * @param {number} time Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @extends {goog.fx.dom.PredefinedEffect}\n * @constructor\n * @struct\n */\ngoog.fx.dom.ResizeHeight = function(element, start, end, time, opt_acc) {\n  goog.fx.dom.ResizeHeight.base(\n      this, 'constructor', element, [start], [end], time, opt_acc);\n};\ngoog.inherits(goog.fx.dom.ResizeHeight, goog.fx.dom.PredefinedEffect);\n\n\n/**\n * Animation event handler that will resize an element by setting its height.\n * @protected\n * @override\n */\ngoog.fx.dom.ResizeHeight.prototype.updateStyle = function() {\n  this.element.style.height = Math.round(this.coords[0]) + 'px';\n};\n\n\n\n/**\n * Creates an animation object that fades the opacity of an element between two\n * limits.\n *\n * Start and End should be floats between 0 and 1\n *\n * @param {Element} element Dom Node to be used in the animation.\n * @param {Array<number>|number} start 1D Array or Number with start opacity.\n * @param {Array<number>|number} end 1D Array or Number for end opacity.\n * @param {number} time Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @extends {goog.fx.dom.PredefinedEffect}\n * @constructor\n * @struct\n */\ngoog.fx.dom.Fade = function(element, start, end, time, opt_acc) {\n  if (typeof start === 'number') start = [start];\n  if (typeof end === 'number') end = [end];\n\n  goog.fx.dom.Fade.base(\n      this, 'constructor', element, start, end, time, opt_acc);\n\n  if (start.length != 1 || end.length != 1) {\n    throw new Error('Start and end points must be 1D');\n  }\n\n  /**\n   * The last opacity we set, or -1 for not set.\n   * @private {number}\n   */\n  this.lastOpacityUpdate_ = goog.fx.dom.Fade.OPACITY_UNSET_;\n};\ngoog.inherits(goog.fx.dom.Fade, goog.fx.dom.PredefinedEffect);\n\n\n/**\n * The quantization of opacity values to use.\n * @private {number}\n */\ngoog.fx.dom.Fade.TOLERANCE_ = 1.0 / 0x400;  // 10-bit color\n\n\n/**\n * Value indicating that the opacity must be set on next update.\n * @private {number}\n */\ngoog.fx.dom.Fade.OPACITY_UNSET_ = -1;\n\n\n/**\n * Animation event handler that will set the opacity of an element.\n * @protected\n * @override\n */\ngoog.fx.dom.Fade.prototype.updateStyle = function() {\n  var opacity = this.coords[0];\n  var delta = Math.abs(opacity - this.lastOpacityUpdate_);\n  // In order to keep eager browsers from over-rendering, only update\n  // on a potentially visible change in opacity.\n  if (delta >= goog.fx.dom.Fade.TOLERANCE_) {\n    goog.style.setOpacity(this.element, opacity);\n    this.lastOpacityUpdate_ = opacity;\n  }\n};\n\n\n/** @override */\ngoog.fx.dom.Fade.prototype.onBegin = function() {\n  this.lastOpacityUpdate_ = goog.fx.dom.Fade.OPACITY_UNSET_;\n  goog.fx.dom.Fade.base(this, 'onBegin');\n};\n\n\n/** @override */\ngoog.fx.dom.Fade.prototype.onEnd = function() {\n  this.lastOpacityUpdate_ = goog.fx.dom.Fade.OPACITY_UNSET_;\n  goog.fx.dom.Fade.base(this, 'onEnd');\n};\n\n\n/**\n * Animation event handler that will show the element.\n */\ngoog.fx.dom.Fade.prototype.show = function() {\n  this.element.style.display = '';\n};\n\n\n/**\n * Animation event handler that will hide the element\n */\ngoog.fx.dom.Fade.prototype.hide = function() {\n  this.element.style.display = 'none';\n};\n\n\n\n/**\n * Fades an element out from full opacity to completely transparent.\n *\n * @param {Element} element Dom Node to be used in the animation.\n * @param {number} time Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @extends {goog.fx.dom.Fade}\n * @constructor\n * @struct\n */\ngoog.fx.dom.FadeOut = function(element, time, opt_acc) {\n  goog.fx.dom.FadeOut.base(this, 'constructor', element, 1, 0, time, opt_acc);\n};\ngoog.inherits(goog.fx.dom.FadeOut, goog.fx.dom.Fade);\n\n\n\n/**\n * Fades an element in from completely transparent to fully opacity.\n *\n * @param {Element} element Dom Node to be used in the animation.\n * @param {number} time Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @extends {goog.fx.dom.Fade}\n * @constructor\n * @struct\n */\ngoog.fx.dom.FadeIn = function(element, time, opt_acc) {\n  goog.fx.dom.FadeIn.base(this, 'constructor', element, 0, 1, time, opt_acc);\n};\ngoog.inherits(goog.fx.dom.FadeIn, goog.fx.dom.Fade);\n\n\n\n/**\n * Fades an element out from full opacity to completely transparent and then\n * sets the display to 'none'\n *\n * @param {Element} element Dom Node to be used in the animation.\n * @param {number} time Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @extends {goog.fx.dom.Fade}\n * @constructor\n * @struct\n */\ngoog.fx.dom.FadeOutAndHide = function(element, time, opt_acc) {\n  goog.fx.dom.FadeOutAndHide.base(\n      this, 'constructor', element, 1, 0, time, opt_acc);\n};\ngoog.inherits(goog.fx.dom.FadeOutAndHide, goog.fx.dom.Fade);\n\n\n/** @override */\ngoog.fx.dom.FadeOutAndHide.prototype.onBegin = function() {\n  this.show();\n  goog.fx.dom.FadeOutAndHide.superClass_.onBegin.call(this);\n};\n\n\n/** @override */\ngoog.fx.dom.FadeOutAndHide.prototype.onEnd = function() {\n  this.hide();\n  goog.fx.dom.FadeOutAndHide.superClass_.onEnd.call(this);\n};\n\n\n\n/**\n * Sets an element's display to be visible and then fades an element in from\n * completely transparent to fully opaque.\n *\n * @param {Element} element Dom Node to be used in the animation.\n * @param {number} time Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @extends {goog.fx.dom.Fade}\n * @constructor\n * @struct\n */\ngoog.fx.dom.FadeInAndShow = function(element, time, opt_acc) {\n  goog.fx.dom.FadeInAndShow.base(\n      this, 'constructor', element, 0, 1, time, opt_acc);\n};\ngoog.inherits(goog.fx.dom.FadeInAndShow, goog.fx.dom.Fade);\n\n\n/** @override */\ngoog.fx.dom.FadeInAndShow.prototype.onBegin = function() {\n  this.show();\n  goog.fx.dom.FadeInAndShow.superClass_.onBegin.call(this);\n};\n\n\n\n/**\n * Provides a transformation of an elements background-color.\n *\n * Start and End should be 3D arrays representing R,G,B\n *\n * @param {Element} element Dom Node to be used in the animation.\n * @param {Array<number>} start 3D Array for RGB of start color.\n * @param {Array<number>} end 3D Array for RGB of end color.\n * @param {number} time Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @extends {goog.fx.dom.PredefinedEffect}\n * @constructor\n * @struct\n */\ngoog.fx.dom.BgColorTransform = function(element, start, end, time, opt_acc) {\n  if (start.length != 3 || end.length != 3) {\n    throw new Error('Start and end points must be 3D');\n  }\n  goog.fx.dom.BgColorTransform.base(\n      this, 'constructor', element, start, end, time, opt_acc);\n};\ngoog.inherits(goog.fx.dom.BgColorTransform, goog.fx.dom.PredefinedEffect);\n\n\n/**\n * Animation event handler that will set the background-color of an element\n */\ngoog.fx.dom.BgColorTransform.prototype.setColor = function() {\n  var coordsAsInts = [];\n  for (var i = 0; i < this.coords.length; i++) {\n    coordsAsInts[i] = Math.round(this.coords[i]);\n  }\n  var color = 'rgb(' + coordsAsInts.join(',') + ')';\n  this.element.style.backgroundColor = color;\n};\n\n\n/** @override */\ngoog.fx.dom.BgColorTransform.prototype.updateStyle = function() {\n  this.setColor();\n};\n\n\n/**\n * Fade elements background color from start color to the element's current\n * background color.\n *\n * Start should be a 3D array representing R,G,B\n *\n * @param {Element} element Dom Node to be used in the animation.\n * @param {Array<number>} start 3D Array for RGB of start color.\n * @param {number} time Length of animation in milliseconds.\n * @param {goog.events.EventHandler=} opt_eventHandler Optional event handler\n *     to use when listening for events.\n */\ngoog.fx.dom.bgColorFadeIn = function(element, start, time, opt_eventHandler) {\n  var initialBgColor = element.style.backgroundColor || '';\n  var computedBgColor = goog.style.getBackgroundColor(element);\n  var end;\n\n  if (computedBgColor && computedBgColor != 'transparent' &&\n      computedBgColor != 'rgba(0, 0, 0, 0)') {\n    end = goog.color.hexToRgb(goog.color.parse(computedBgColor).hex);\n  } else {\n    end = [255, 255, 255];\n  }\n\n  var anim = new goog.fx.dom.BgColorTransform(element, start, end, time);\n\n  function setBgColor() { element.style.backgroundColor = initialBgColor; }\n\n  if (opt_eventHandler) {\n    opt_eventHandler.listen(anim, goog.fx.Transition.EventType.END, setBgColor);\n  } else {\n    goog.events.listen(anim, goog.fx.Transition.EventType.END, setBgColor);\n  }\n\n  anim.play();\n};\n\n\n\n/**\n * Provides a transformation of an elements color.\n *\n * @param {Element} element Dom Node to be used in the animation.\n * @param {Array<number>} start 3D Array representing R,G,B.\n * @param {Array<number>} end 3D Array representing R,G,B.\n * @param {number} time Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @constructor\n * @struct\n * @extends {goog.fx.dom.PredefinedEffect}\n */\ngoog.fx.dom.ColorTransform = function(element, start, end, time, opt_acc) {\n  if (start.length != 3 || end.length != 3) {\n    throw new Error('Start and end points must be 3D');\n  }\n  goog.fx.dom.ColorTransform.base(\n      this, 'constructor', element, start, end, time, opt_acc);\n};\ngoog.inherits(goog.fx.dom.ColorTransform, goog.fx.dom.PredefinedEffect);\n\n\n/**\n * Animation event handler that will set the color of an element.\n * @protected\n * @override\n */\ngoog.fx.dom.ColorTransform.prototype.updateStyle = function() {\n  var coordsAsInts = [];\n  for (var i = 0; i < this.coords.length; i++) {\n    coordsAsInts[i] = Math.round(this.coords[i]);\n  }\n  var color = 'rgb(' + coordsAsInts.join(',') + ')';\n  this.element.style.color = color;\n};\n","^9I",1579837703000,"^9J",["^9K",["^?F","~$goog.color","^9>","~$goog.fx.Animation","^>Q","^<3","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/dom.js"],"^:1",["^9K",["~$goog.fx.dom.ColorTransform","^?D","~$goog.fx.dom.SlideFrom","~$goog.fx.dom.BgColorTransform","~$goog.fx.dom.FadeOut","~$goog.fx.dom.PredefinedEffect","^?J","~$goog.fx.dom.Resize","~$goog.fx.dom.Swipe","~$goog.fx.dom.Scroll","^?L","~$goog.fx.dom","~$goog.fx.dom.FadeOutAndHide","~$goog.fx.dom.FadeInAndShow","~$goog.fx.dom.FadeIn","~$goog.fx.dom.Fade"]],"^9<",true,"^9=",["^9>","^G6","^:N","^G7","^>Q","^<3","^?F"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.menubuttonrenderer.js","^9C",["^9D","goog/ui/menubuttonrenderer.js"],"^9E","goog/ui/menubuttonrenderer.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for {@link goog.ui.MenuButton}s and subclasses.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.MenuButtonRenderer');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.style');\ngoog.require('goog.ui.CustomButtonRenderer');\ngoog.require('goog.ui.INLINE_BLOCK_CLASSNAME');\ngoog.require('goog.ui.Menu');\ngoog.require('goog.ui.MenuRenderer');\n\n\n\n/**\n * Renderer for {@link goog.ui.MenuButton}s.  This implementation overrides\n * {@link goog.ui.CustomButtonRenderer#createButton} to create a separate\n * caption and dropdown element.\n * @constructor\n * @extends {goog.ui.CustomButtonRenderer}\n */\ngoog.ui.MenuButtonRenderer = function() {\n  goog.ui.CustomButtonRenderer.call(this);\n};\ngoog.inherits(goog.ui.MenuButtonRenderer, goog.ui.CustomButtonRenderer);\ngoog.addSingletonGetter(goog.ui.MenuButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.MenuButtonRenderer.CSS_CLASS = goog.getCssName('goog-menu-button');\n\n\n/**\n * Takes the button's root element and returns the parent element of the\n * button's contents.  Overrides the superclass implementation by taking\n * the nested DIV structure of menu buttons into account.\n * @param {Element} element Root element of the button whose content element\n *     is to be returned.\n * @return {Element} The button's content element.\n * @override\n */\ngoog.ui.MenuButtonRenderer.prototype.getContentElement = function(element) {\n  return goog.ui.MenuButtonRenderer.superClass_.getContentElement.call(\n      this,\n      /** @type {Element} */ (element && element.firstChild));\n};\n\n\n/**\n * Takes an element, decorates it with the menu button control, and returns\n * the element.  Overrides {@link goog.ui.CustomButtonRenderer#decorate} by\n * looking for a child element that can be decorated by a menu, and if it\n * finds one, decorates it and attaches it to the menu button.\n * @param {goog.ui.Control} control goog.ui.MenuButton to decorate the element.\n * @param {Element} element Element to decorate.\n * @return {Element} Decorated element.\n * @override\n */\ngoog.ui.MenuButtonRenderer.prototype.decorate = function(control, element) {\n  var button = /** @type {goog.ui.MenuButton} */ (control);\n  // TODO(attila):  Add more robust support for subclasses of goog.ui.Menu.\n  var menuElem = goog.dom.getElementsByTagNameAndClass(\n      '*', goog.ui.MenuRenderer.CSS_CLASS, element)[0];\n  if (menuElem) {\n    // Move the menu element directly under the body (but hide it first to\n    // prevent flicker; see bug 1089244).\n    goog.style.setElementShown(menuElem, false);\n    goog.dom.appendChild(goog.dom.getOwnerDocument(menuElem).body, menuElem);\n\n    // Decorate the menu and attach it to the button.\n    var menu = new goog.ui.Menu();\n    menu.decorate(menuElem);\n    button.setMenu(menu);\n  }\n\n  // Let the superclass do the rest.\n  return goog.ui.MenuButtonRenderer.superClass_.decorate.call(\n      this, button, element);\n};\n\n\n/**\n * Takes a text caption or existing DOM structure, and returns the content and\n * a dropdown arrow element wrapped in a pseudo-rounded-corner box.  Creates\n * the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-menu-button-outer-box\">\n *      <div class=\"goog-inline-block goog-menu-button-inner-box\">\n *        <div class=\"goog-inline-block goog-menu-button-caption\">\n *          Contents...\n *        </div>\n *        <div class=\"goog-inline-block goog-menu-button-dropdown\">\n *          &nbsp;\n *        </div>\n *      </div>\n *    </div>\n *\n * @param {goog.ui.ControlContent} content Text caption or DOM structure\n *     to wrap in a box.\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {Element} Pseudo-rounded-corner box containing the content.\n * @override\n */\ngoog.ui.MenuButtonRenderer.prototype.createButton = function(content, dom) {\n  return goog.ui.MenuButtonRenderer.superClass_.createButton.call(\n      this, [this.createCaption(content, dom), this.createDropdown(dom)], dom);\n};\n\n\n/**\n * Takes a text caption or existing DOM structure, and returns it wrapped in\n * an appropriately-styled DIV.  Creates the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-menu-button-caption\">\n *      Contents...\n *    </div>\n *\n * @param {goog.ui.ControlContent} content Text caption or DOM structure\n *     to wrap in a box.\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {Element} Caption element.\n */\ngoog.ui.MenuButtonRenderer.prototype.createCaption = function(content, dom) {\n  return goog.ui.MenuButtonRenderer.wrapCaption(\n      content, this.getCssClass(), dom);\n};\n\n\n/**\n * Takes a text caption or existing DOM structure, and returns it wrapped in\n * an appropriately-styled DIV.  Creates the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-menu-button-caption\">\n *      Contents...\n *    </div>\n *\n * @param {goog.ui.ControlContent} content Text caption or DOM structure\n *     to wrap in a box.\n * @param {string} cssClass The CSS class for the renderer.\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {!Element} Caption element.\n */\ngoog.ui.MenuButtonRenderer.wrapCaption = function(content, cssClass, dom) {\n  return dom.createDom(\n      goog.dom.TagName.DIV, goog.ui.INLINE_BLOCK_CLASSNAME + ' ' +\n          goog.getCssName(cssClass, 'caption'),\n      content);\n};\n\n\n/**\n * Returns an appropriately-styled DIV containing a dropdown arrow element.\n * Creates the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-menu-button-dropdown\">\n *      &nbsp;\n *    </div>\n *\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {Element} Dropdown element.\n */\ngoog.ui.MenuButtonRenderer.prototype.createDropdown = function(dom) {\n  // 00A0 is &nbsp;\n  return dom.createDom(\n      goog.dom.TagName.DIV, goog.ui.INLINE_BLOCK_CLASSNAME + ' ' +\n          goog.getCssName(this.getCssClass(), 'dropdown'),\n      '\\u00A0');\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.MenuButtonRenderer.prototype.getCssClass = function() {\n  return goog.ui.MenuButtonRenderer.CSS_CLASS;\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","^9>","~$goog.ui.MenuRenderer","~$goog.ui.Menu","~$goog.ui.CustomButtonRenderer","^<3","~$goog.ui.INLINE-BLOCK-CLASSNAME","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/menubuttonrenderer.js"],"^:1",["^9K",["~$goog.ui.MenuButtonRenderer"]],"^9<",true,"^9=",["^9>","^;;","^;=","^<3","^GG","^GH","^GF","^GE"]],["^ ","^9A",[1579837703000],"^9B","goog.html.utils.js","^9C",["^9D","goog/html/utils.js"],"^9E","goog/html/utils.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview HTML processing utilities for HTML in string form.\n */\n\ngoog.provide('goog.html.utils');\n\ngoog.require('goog.string');\n\n\n/**\n * Extracts plain text from HTML.\n *\n * This behaves similarly to extracting textContent from a hypothetical DOM\n * element containing the specified HTML.  Block-level elements such as div are\n * surrounded with whitespace, but inline elements are not.  Span is treated as\n * a block level element because it is often used as a container.  Breaking\n * spaces are compressed and trimmed.\n *\n * @param {string} value The input HTML to have tags removed.\n * @return {string} The plain text of value without tags, HTML comments, or\n *     other non-text content.  Does NOT return safe HTML!\n */\ngoog.html.utils.stripHtmlTags = function(value) {\n  // TODO(user): Make a version that extracts text attributes such as alt.\n  return goog.string.unescapeEntities(\n      goog.string.trim(\n          value\n              .replace(\n                  goog.html.utils.HTML_TAG_REGEX_,\n                  function(fullMatch, tagName) {\n                    return goog.html.utils.INLINE_HTML_TAG_REGEX_.test(\n                               tagName) ?\n                        '' :\n                        ' ';\n                  })\n              .replace(/[\\t\\n ]+/g, ' ')));\n};\n\n\n/**\n * Matches all tags that do not require extra space.\n *\n * @private @const\n */\ngoog.html.utils.INLINE_HTML_TAG_REGEX_ =\n    /^(?:abbr|acronym|address|b|em|i|small|strong|su[bp]|u)$/i;\n\n\n/**\n * Matches all tags, HTML comments, and DOCTYPEs in tag soup HTML.\n * By removing these, and replacing any '<' or '>' characters with\n * entities we guarantee that the result can be embedded into\n * an attribute without introducing a tag boundary.\n *\n * @private @const\n */\ngoog.html.utils.HTML_TAG_REGEX_ = /<[!\\/]?([a-z0-9]+)([\\/ ][^>]*)?>/gi;\n","^9I",1579837703000,"^9J",["^9K",["^9L","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/utils.js"],"^:1",["^9K",["~$goog.html.utils"]],"^9<",true,"^9=",["^9>","^9L"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.messaging.mockmessageevent.js","^9C",["^9D","goog/testing/messaging/mockmessageevent.js"],"^9E","goog/testing/messaging/mockmessageevent.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A simple mock class for imitating HTML5 MessageEvents.\n *\n */\n\ngoog.setTestOnly('goog.testing.messaging.MockMessageEvent');\ngoog.provide('goog.testing.messaging.MockMessageEvent');\n\ngoog.require('goog.events.BrowserEvent');\ngoog.require('goog.events.EventType');\ngoog.require('goog.testing.events.Event');\n\n\n\n/**\n * Creates a new fake MessageEvent.\n *\n * @param {*} data The data of the message.\n * @param {string=} opt_origin The origin of the message, for server-sent and\n *     cross-document events.\n * @param {string=} opt_lastEventId The last event ID, for server-sent events.\n * @param {Window=} opt_source The proxy for the source window, for\n *     cross-document events.\n * @param {Array<MessagePort>=} opt_ports The Array of ports sent with the\n *     message, for cross-document and channel events.\n * @extends {goog.testing.events.Event}\n * @constructor\n * @final\n */\ngoog.testing.messaging.MockMessageEvent = function(\n    data, opt_origin, opt_lastEventId, opt_source, opt_ports) {\n  goog.testing.messaging.MockMessageEvent.base(\n      this, 'constructor', goog.events.EventType.MESSAGE);\n\n  /**\n   * The data of the message.\n   * @type {*}\n   */\n  this.data = data;\n\n  /**\n   * The origin of the message, for server-sent and cross-document events.\n   * @type {?string}\n   */\n  this.origin = opt_origin || null;\n\n  /**\n   * The last event ID, for server-sent events.\n   * @type {?string}\n   */\n  this.lastEventId = opt_lastEventId || null;\n\n  /**\n   * The proxy for the source window, for cross-document events.\n   * @type {Window}\n   */\n  this.source = opt_source || null;\n\n  /**\n   * The Array of ports sent with the message, for cross-document and channel\n   * events.\n   * @type {Array<!MessagePort>}\n   */\n  this.ports = opt_ports || null;\n};\ngoog.inherits(\n    goog.testing.messaging.MockMessageEvent, goog.testing.events.Event);\n\n\n/**\n * Wraps a new fake MessageEvent in a BrowserEvent, like how a real MessageEvent\n * would be wrapped.\n *\n * @param {*} data The data of the message.\n * @param {string=} opt_origin The origin of the message, for server-sent and\n *     cross-document events.\n * @param {string=} opt_lastEventId The last event ID, for server-sent events.\n * @param {Window=} opt_source The proxy for the source window, for\n *     cross-document events.\n * @param {Array<MessagePort>=} opt_ports The Array of ports sent with the\n *     message, for cross-document and channel events.\n * @return {!goog.events.BrowserEvent} The wrapping event.\n */\ngoog.testing.messaging.MockMessageEvent.wrap = function(\n    data, opt_origin, opt_lastEventId, opt_source, opt_ports) {\n  return new goog.events.BrowserEvent(\n      new goog.testing.messaging.MockMessageEvent(\n          data, opt_origin, opt_lastEventId, opt_source, opt_ports));\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:I","^:8","^<4"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/messaging/mockmessageevent.js"],"^:1",["^9K",["~$goog.testing.messaging.MockMessageEvent"]],"^9<",true,"^9=",["^9>","^<4","^:I","^:8"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.selectionmenubutton.js","^9C",["^9D","goog/ui/selectionmenubutton.js"],"^9E","goog/ui/selectionmenubutton.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A customized MenuButton for selection of items among lists.\n * Menu contains 'select all' and 'select none' MenuItems for selecting all and\n * no items by default. Other MenuItems can be added by user.\n *\n * The checkbox content fires the action events associated with the 'select all'\n * and 'select none' menu items.\n *\n * @see ../demos/selectionmenubutton.html\n */\n\ngoog.provide('goog.ui.SelectionMenuButton');\ngoog.provide('goog.ui.SelectionMenuButton.SelectionState');\n\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events.EventType');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.MenuButton');\ngoog.require('goog.ui.MenuItem');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * A selection menu button control.  Extends {@link goog.ui.MenuButton}.\n * Menu contains 'select all' and 'select none' MenuItems for selecting all and\n * no items by default. Other MenuItems can be added by user.\n *\n * The checkbox content fires the action events associated with the 'select all'\n * and 'select none' menu items.\n *\n * @param {goog.ui.ButtonRenderer=} opt_renderer Renderer used to render or\n *     decorate the menu button; defaults to {@link goog.ui.MenuButtonRenderer}.\n * @param {goog.ui.MenuItemRenderer=} opt_itemRenderer Optional menu item\n *     renderer.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.MenuButton}\n */\ngoog.ui.SelectionMenuButton = function(\n    opt_renderer, opt_itemRenderer, opt_domHelper) {\n  goog.ui.MenuButton.call(this, null, null, opt_renderer, opt_domHelper);\n  this.initialItemRenderer_ = opt_itemRenderer || null;\n};\ngoog.inherits(goog.ui.SelectionMenuButton, goog.ui.MenuButton);\ngoog.tagUnsealableClass(goog.ui.SelectionMenuButton);\n\n\n/**\n * Constants for menu action types.\n * @enum {number}\n */\ngoog.ui.SelectionMenuButton.SelectionState = {\n  ALL: 0,\n  SOME: 1,\n  NONE: 2\n};\n\n\n/**\n * Select button state\n * @type {goog.ui.SelectionMenuButton.SelectionState}\n * @protected\n */\ngoog.ui.SelectionMenuButton.prototype.selectionState =\n    goog.ui.SelectionMenuButton.SelectionState.NONE;\n\n\n/**\n * Item renderer used for the first 2 items, 'select all' and 'select none'.\n * @type {goog.ui.MenuItemRenderer}\n * @private\n */\ngoog.ui.SelectionMenuButton.prototype.initialItemRenderer_;\n\n\n/**\n * Enables button and embedded checkbox.\n * @param {boolean} enable Whether to enable or disable the button.\n * @override\n */\ngoog.ui.SelectionMenuButton.prototype.setEnabled = function(enable) {\n  goog.ui.SelectionMenuButton.base(this, 'setEnabled', enable);\n  this.setCheckboxEnabled(enable);\n};\n\n\n/**\n * Enables the embedded checkbox.\n * @param {boolean} enable Whether to enable or disable the checkbox.\n * @protected\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.SelectionMenuButton.prototype.setCheckboxEnabled = function(enable) {\n  this.getCheckboxElement().disabled = !enable;\n};\n\n\n/** @override */\ngoog.ui.SelectionMenuButton.prototype.handleMouseDown = function(e) {\n  if (!this.getDomHelper().contains(\n          this.getCheckboxElement(),\n          /** @type {Element} */ (e.target))) {\n    goog.ui.SelectionMenuButton.superClass_.handleMouseDown.call(this, e);\n  }\n};\n\n\n/**\n * Gets the checkbox element. Needed because if decorating html, getContent()\n * may include and comment/text elements in addition to the input element.\n * @return {Element} Checkbox.\n * @protected\n */\ngoog.ui.SelectionMenuButton.prototype.getCheckboxElement = function() {\n  var elements = this.getDomHelper().getElementsByTagNameAndClass(\n      goog.dom.TagName.INPUT,\n      goog.getCssName('goog-selectionmenubutton-checkbox'),\n      this.getContentElement());\n  return elements[0];\n};\n\n\n/**\n * Checkbox click handler.\n * @param {goog.events.BrowserEvent} e Checkbox click event.\n * @protected\n */\ngoog.ui.SelectionMenuButton.prototype.handleCheckboxClick = function(e) {\n  if (this.selectionState == goog.ui.SelectionMenuButton.SelectionState.NONE) {\n    this.setSelectionState(goog.ui.SelectionMenuButton.SelectionState.ALL);\n    if (this.getItemAt(0)) {\n      this.getItemAt(0).dispatchEvent(  // 'All' item\n          goog.ui.Component.EventType.ACTION);\n    }\n  } else {\n    this.setSelectionState(goog.ui.SelectionMenuButton.SelectionState.NONE);\n    if (this.getItemAt(1)) {\n      this.getItemAt(1).dispatchEvent(  // 'None' item\n          goog.ui.Component.EventType.ACTION);\n    }\n  }\n};\n\n\n/**\n * Menu action handler to update checkbox checked state.\n * @param {goog.events.Event} e Menu action event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.SelectionMenuButton.prototype.handleMenuAction_ = function(e) {\n  if (e.target.getModel() == goog.ui.SelectionMenuButton.SelectionState.ALL) {\n    this.setSelectionState(goog.ui.SelectionMenuButton.SelectionState.ALL);\n  } else {\n    this.setSelectionState(goog.ui.SelectionMenuButton.SelectionState.NONE);\n  }\n};\n\n\n/**\n * Set up events related to the menu items.\n * @private\n */\ngoog.ui.SelectionMenuButton.prototype.addMenuEvent_ = function() {\n  if (this.getItemAt(0) && this.getItemAt(1)) {\n    this.getHandler().listen(\n        this.getMenu(), goog.ui.Component.EventType.ACTION,\n        this.handleMenuAction_);\n    this.getItemAt(0).setModel(goog.ui.SelectionMenuButton.SelectionState.ALL);\n    this.getItemAt(1).setModel(goog.ui.SelectionMenuButton.SelectionState.NONE);\n  }\n};\n\n\n/**\n * Set up events related to the checkbox.\n * @protected\n */\ngoog.ui.SelectionMenuButton.prototype.addCheckboxEvent = function() {\n  this.getHandler().listen(\n      this.getCheckboxElement(), goog.events.EventType.CLICK,\n      this.handleCheckboxClick);\n};\n\n\n/**\n * Adds the checkbox to the button, and adds 2 items to the menu corresponding\n * to 'select all' and 'select none'.\n * @override\n * @protected\n */\ngoog.ui.SelectionMenuButton.prototype.createDom = function() {\n  goog.ui.SelectionMenuButton.superClass_.createDom.call(this);\n\n  this.createCheckbox();\n\n  /** @desc Text for 'All' button, used to select all items in a list. */\n  var MSG_SELECTIONMENUITEM_ALL = goog.getMsg('All');\n  /** @desc Text for 'None' button, used to unselect all items in a list. */\n  var MSG_SELECTIONMENUITEM_NONE = goog.getMsg('None');\n\n  var itemAll = new goog.ui.MenuItem(\n      MSG_SELECTIONMENUITEM_ALL, null, this.getDomHelper(),\n      this.initialItemRenderer_);\n  var itemNone = new goog.ui.MenuItem(\n      MSG_SELECTIONMENUITEM_NONE, null, this.getDomHelper(),\n      this.initialItemRenderer_);\n  this.addItem(itemAll);\n  this.addItem(itemNone);\n\n  this.addCheckboxEvent();\n  this.addMenuEvent_();\n};\n\n\n/**\n * Creates and adds the checkbox to the button.\n * @protected\n */\ngoog.ui.SelectionMenuButton.prototype.createCheckbox = function() {\n  var checkbox = this.getDomHelper().createElement(goog.dom.TagName.INPUT);\n  checkbox.type = goog.dom.InputType.CHECKBOX;\n  checkbox.className = goog.getCssName('goog-selectionmenubutton-checkbox');\n  this.setContent(checkbox);\n};\n\n\n/** @override */\ngoog.ui.SelectionMenuButton.prototype.decorateInternal = function(element) {\n  goog.ui.SelectionMenuButton.superClass_.decorateInternal.call(this, element);\n  this.addCheckboxEvent();\n  this.addMenuEvent_();\n};\n\n\n/** @override */\ngoog.ui.SelectionMenuButton.prototype.setMenu = function(menu) {\n  goog.ui.SelectionMenuButton.superClass_.setMenu.call(this, menu);\n  this.addMenuEvent_();\n};\n\n\n/**\n * Set selection state and update checkbox.\n * @param {goog.ui.SelectionMenuButton.SelectionState} state Selection state.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.SelectionMenuButton.prototype.setSelectionState = function(state) {\n  if (this.selectionState != state) {\n    var checkbox = this.getCheckboxElement();\n    if (state == goog.ui.SelectionMenuButton.SelectionState.ALL) {\n      checkbox.checked = true;\n      goog.style.setOpacity(checkbox, 1);\n    } else if (state == goog.ui.SelectionMenuButton.SelectionState.SOME) {\n      checkbox.checked = true;\n      // TODO(user): Get UX help to style this\n      goog.style.setOpacity(checkbox, 0.5);\n    } else {  // NONE\n      checkbox.checked = false;\n      goog.style.setOpacity(checkbox, 1);\n    }\n    this.selectionState = state;\n  }\n};\n\n\n/**\n* Get selection state.\n* @return {goog.ui.SelectionMenuButton.SelectionState} Selection state.\n*/\ngoog.ui.SelectionMenuButton.prototype.getSelectionState = function() {\n  return this.selectionState;\n};\n\n\n// Register a decorator factory function for goog.ui.SelectionMenuButton.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.getCssName('goog-selectionmenubutton-button'),\n    function() { return new goog.ui.SelectionMenuButton(); });\n","^9I",1579837703000,"^9J",["^9K",["^:=","~$goog.dom.InputType","~$goog.ui.MenuButton","^9>","^:>","^:I","^:?","^<3","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/selectionmenubutton.js"],"^:1",["^9K",["~$goog.ui.SelectionMenuButton.SelectionState","~$goog.ui.SelectionMenuButton"]],"^9<",true,"^9=",["^9>","^GL","^;=","^:I","^<3","^:=","^GM","^:?","^:>"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.i18n.relativedatetimesymbols.js","^9C",["^9D","goog/i18n/relativedatetimesymbols.js"],"^9E","goog/i18n/relativedatetimesymbols.js","^9F","^9G","^9H","// Copyright 2018 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Relative date time formatting symbols.\n *\n * File generated from CLDR ver. 35.1\n *\n * To reduce the file size (which may cause issues in some JS\n * developing environments), this file will only contain locales\n * that are frequently used by web applications. This is defined as\n * proto/closure_locales_data.txt and will change (most likely addition)\n * over time.  Rest of the data can be found in another file named\n * \"relativedatetimesymbolsext.js\", which will be generated at\n * the same time together with this file.\n */\n\n// clang-format off\n\ngoog.module('goog.i18n.relativeDateTimeSymbols');\n\n/**\n * Collection of relative date time unit symbols for a locale.\n * @typedef {{\n *   YEAR:    RelativeDateTimeFormatStyles!,\n *   QUARTER: RelativeDateTimeFormatStyles!,\n *   MONTH:   RelativeDateTimeFormatStyles!,\n *   WEEK:    RelativeDateTimeFormatStyles!,\n *   DAY:     RelativeDateTimeFormatStyles!,\n *   HOUR:    RelativeDateTimeFormatStyles!,\n *   MINUTE:  RelativeDateTimeFormatStyles!,\n *   SECOND:  RelativeDateTimeFormatStyles!,\n * }}\n */\nlet RelativeDateTimeSymbols; /* The data for the locale */\n\n/** @typedef {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols;\n\n/**\n * Collection of date interval symbols for each relative unit.\n * @typedef {{\n *   LONG:   StyleElement!,\n *   SHORT:  (!StyleElement|undefined),\n *   NARROW: (!StyleElement|undefined),\n * }}\n */\nlet RelativeDateTimeFormatStyles;\n\n/** @typedef {!RelativeDateTimeFormatStyles} */\nexports.RelativeDateTimeFormatStyles;\n\n/**\n * Collection of relative symbols for a given style.\n * Field names are single character to save space.\n * R: relative fields for named relative times, e.g., \"yesteday\", \"vorgestern\", \"mañana\"\n * F: plural format for future numeric differences, e.g., \"in 3 days\", \"hace 3 horas\"\n * P: plural format for past numeric differences, e.g., \"3 seconds ago\", \"vor 17 Min.\"\n * @typedef {{\n *   R: RelativeDateTimeDirectionMap!,\n *   F: string,\n *   P: string,\n * }}\n */\nlet StyleElement;\n\n/** @typedef {?StyleElement} */\nexports.StyleElement;\n\n/**\n * Map of direction options for RELATIVE data with integer keys.\n * @typedef {!Object<string, string>}\n */\nlet RelativeDateTimeDirectionMap;\n\n/** @typedef {!RelativeDateTimeDirectionMap} */\nexports.RelativeDateTimeDirectionMap;\n\n/** @type {!RelativeDateTimeSymbols} */\nlet defaultSymbols;\n\n/**\n * Returns the default RelativeDateTimeSymbols.\n * @return {!RelativeDateTimeSymbols}\n */\nexports.getRelativeDateTimeSymbols = function() {\n  return defaultSymbols;\n};\n\n/**\n * Sets the default RelativeDateTimeSymbols.\n * @param {!RelativeDateTimeSymbols} symbols\n */\nexports.setRelativeDateTimeSymbols = function(symbols) {\n  defaultSymbols = symbols;\n};\n\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_af =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'gister','-2':'eergister','0':'vandag','1':'môre','2':'oormôre'},\n      P:'one{# dag gelede}other{# dae gelede}',\n      F:'one{oor # dag}other{oor # dae}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'hierdie uur'},\n      P:'one{# uur gelede}other{# uur gelede}',\n      F:'one{oor # uur}other{oor # uur}',\n    },\n    SHORT:{\n      R:{'0':'hierdie uur'},\n      P:'one{# u. gelede}other{# u. gelede}',\n      F:'one{oor # u.}other{oor # u.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'hierdie minuut'},\n      P:'one{# minuut gelede}other{# minute gelede}',\n      F:'one{oor # minuut}other{oor # minute}',\n    },\n    SHORT:{\n      R:{'0':'hierdie minuut'},\n      P:'one{# min. gelede}other{# min. gelede}',\n      F:'one{oor # min.}other{oor # min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'verlede maand','0':'vandeesmaand','1':'volgende maand'},\n      P:'one{# maand gelede}other{# maande gelede}',\n      F:'one{oor # maand}other{oor # maande}',\n    },\n    SHORT:{\n      R:{'-1':'verlede maand','0':'vandeesmaand','1':'volgende maand'},\n      P:'one{# md. gelede}other{# md. gelede}',\n      F:'one{oor # md.}other{oor # md.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'verlede kwartaal','0':'hierdie kwartaal','1':'volgende kwartaal'},\n      P:'one{# kwartaal gelede}other{# kwartale gelede}',\n      F:'one{oor # kwartaal}other{oor # kwartale}',\n    },\n    SHORT:{\n      R:{'-1':'verlede kwartaal','0':'hierdie kwartaal','1':'volgende kwartaal'},\n      P:'one{# kw. gelede}other{# kw. gelede}',\n      F:'one{oor # kw.}other{oor # kw.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'nou'},\n      P:'one{# sekonde gelede}other{# sekondes gelede}',\n      F:'one{oor # sekonde}other{oor # sekondes}',\n    },\n    SHORT:{\n      R:{'0':'nou'},\n      P:'one{# s. gelede}other{# s. gelede}',\n      F:'one{oor # s.}other{oor # s.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'verlede week','0':'hierdie week','1':'volgende week'},\n      P:'one{# week gelede}other{# weke gelede}',\n      F:'one{oor # week}other{oor # weke}',\n    },\n    SHORT:{\n      R:{'-1':'verlede week','0':'hierdie week','1':'volgende week'},\n      P:'one{# w. gelede}other{# w. gelede}',\n      F:'one{oor # w.}other{oor # w.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'verlede jaar','0':'hierdie jaar','1':'volgende jaar'},\n      P:'one{# jaar gelede}other{# jaar gelede}',\n      F:'one{oor # jaar}other{oor # jaar}',\n    },\n    SHORT:{\n      R:{'-1':'verlede jaar','0':'hierdie jaar','1':'volgende jaar'},\n      P:'one{# j. gelede}other{# j. gelede}',\n      F:'one{oor # j.}other{oor # j.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_am =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ትናንት','-2':'ከትናንት ወዲያ','0':'ዛሬ','1':'ነገ','2':'ከነገ ወዲያ'},\n      P:'one{ከ# ቀን በፊት}other{ከ# ቀናት በፊት}',\n      F:'one{በ# ቀን ውስጥ}other{በ# ቀናት ውስጥ}',\n    },\n    SHORT:{\n      R:{'-1':'ትላንትና','-2':'ከትናንት ወዲያ','0':'ዛሬ','1':'ነገ','2':'ከነገ ወዲያ'},\n      P:'one{ከ # ቀን በፊት}other{ከ# ቀኖች በፊት}',\n      F:'one{በ# ቀን ውስጥ}other{በ# ቀኖች ውስጥ}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ይህ ሰዓት'},\n      P:'one{ከ# ሰዓት በፊት}other{ከ# ሰዓቶች በፊት}',\n      F:'one{በ# ሰዓት ውስጥ}other{በ# ሰዓቶች ውስጥ}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ይህ ደቂቃ'},\n      P:'one{ከ# ደቂቃ በፊት}other{ከ# ደቂቃዎች በፊት}',\n      F:'one{በ# ደቂቃ ውስጥ}other{በ# ደቂቃዎች ውስጥ}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ያለፈው ወር','0':'በዚህ ወር','1':'የሚቀጥለው ወር'},\n      P:'one{ከ# ወር በፊት}other{ከ# ወራት በፊት}',\n      F:'one{በ# ወር ውስጥ}other{በ# ወራት ውስጥ}',\n    },\n    SHORT:{\n      R:{'-1':'ያለፈው ወር','0':'በዚህ ወር','1':'የሚቀጥለው ወር'},\n      P:'one{ከ# ወራት በፊት}other{ከ# ወራት በፊት}',\n      F:'one{በ# ወራት ውስጥ}other{በ# ወራት ውስጥ}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'የመጨረሻው ሩብ','0':'ይህ ሩብ','1':'የሚቀጥለው ሩብ'},\n      P:'one{# ሩብ በፊት}other{# ሩብ በፊት}',\n      F:'one{+# ሩብ}other{+# ሩብ}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'አሁን'},\n      P:'one{ከ# ሰከንድ በፊት}other{ከ# ሰከንዶች በፊት}',\n      F:'one{በ# ሰከንድ ውስጥ}other{በ# ሰከንዶች ውስጥ}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ያለፈው ሳምንት','0':'በዚህ ሳምንት','1':'የሚቀጥለው ሳምንት'},\n      P:'one{ከ# ሳምንት በፊት}other{ከ# ሳምንታት በፊት}',\n      F:'one{በ# ሳምንት ውስጥ}other{በ# ሳምንታት ውስጥ}',\n    },\n    SHORT:{\n      R:{'-1':'ባለፈው ሳምንት','0':'በዚህ ሣምንት','1':'የሚቀጥለው ሳምንት'},\n      P:'one{ከ# ሳምንታት በፊት}other{ከ# ሳምንታት በፊት}',\n      F:'one{በ# ሳምንታት ውስጥ}other{በ# ሳምንታት ውስጥ}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ያለፈው ዓመት','0':'በዚህ ዓመት','1':'የሚቀጥለው ዓመት'},\n      P:'one{ከ# ዓመት በፊት}other{ከ# ዓመታት በፊት}',\n      F:'one{በ# ዓመታት ውስጥ}other{በ# ዓመታት ውስጥ}',\n    },\n    SHORT:{\n      R:{'-1':'ያለፈው ዓመት','0':'በዚህ ዓመት','1':'የሚቀጥለው ዓመት'},\n      P:'one{ከ# ዓመታት በፊት}other{ከ# ዓመታት በፊት}',\n      F:'one{በ# ዓመታት ውስጥ}other{በ# ዓመታት ውስጥ}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'أمس','-2':'أول أمس','0':'اليوم','1':'غدًا','2':'بعد الغد'},\n      P:'few{قبل # أيام}many{قبل # يومًا}one{قبل يوم واحد}other{قبل # يوم}two{قبل يومين}zero{قبل # يوم}',\n      F:'few{خلال # أيام}many{خلال # يومًا}one{خلال يوم واحد}other{خلال # يوم}two{خلال يومين}zero{خلال # يوم}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'الساعة الحالية'},\n      P:'few{قبل # ساعات}many{قبل # ساعة}one{قبل ساعة واحدة}other{قبل # ساعة}two{قبل ساعتين}zero{قبل # ساعة}',\n      F:'few{خلال # ساعات}many{خلال # ساعة}one{خلال ساعة واحدة}other{خلال # ساعة}two{خلال ساعتين}zero{خلال # ساعة}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'هذه الدقيقة'},\n      P:'few{قبل # دقائق}many{قبل # دقيقة}one{قبل دقيقة واحدة}other{قبل # دقيقة}two{قبل دقيقتين}zero{قبل # دقيقة}',\n      F:'few{خلال # دقائق}many{خلال # دقيقة}one{خلال دقيقة واحدة}other{خلال # دقيقة}two{خلال دقيقتين}zero{خلال # دقيقة}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'الشهر الماضي','0':'هذا الشهر','1':'الشهر القادم'},\n      P:'few{قبل # أشهر}many{قبل # شهرًا}one{قبل شهر واحد}other{قبل # شهر}two{قبل شهرين}zero{قبل # شهر}',\n      F:'few{خلال # أشهر}many{خلال # شهرًا}one{خلال شهر واحد}other{خلال # شهر}two{خلال شهرين}zero{خلال # شهر}',\n    },\n    SHORT:{\n      R:{'-1':'الشهر الماضي','0':'هذا الشهر','1':'الشهر القادم'},\n      P:'few{خلال # أشهر}many{قبل # شهرًا}one{قبل شهر واحد}other{قبل # شهر}two{قبل شهرين}zero{قبل # شهر}',\n      F:'few{خلال # أشهر}many{خلال # شهرًا}one{خلال شهر واحد}other{خلال # شهر}two{خلال شهرين}zero{خلال # شهر}',\n    },\n    NARROW:{\n      R:{'-1':'الشهر الماضي','0':'هذا الشهر','1':'الشهر القادم'},\n      P:'few{قبل # أشهر}many{قبل # شهرًا}one{قبل شهر واحد}other{قبل # شهر}two{قبل شهرين}zero{قبل # شهر}',\n      F:'few{خلال # أشهر}many{خلال # شهرًا}one{خلال شهر واحد}other{خلال # شهر}two{خلال شهرين}zero{خلال # شهر}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'الربع الأخير','0':'هذا الربع','1':'الربع القادم'},\n      P:'few{قبل # أرباع سنة}many{قبل # ربع سنة}one{قبل ربع سنة واحد}other{قبل # ربع سنة}two{قبل ربعي سنة}zero{قبل # ربع سنة}',\n      F:'few{خلال # أرباع سنة}many{خلال # ربع سنة}one{خلال ربع سنة واحد}other{خلال # ربع سنة}two{خلال ربعي سنة}zero{خلال # ربع سنة}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'الآن'},\n      P:'few{قبل # ثوانِ}many{قبل # ثانية}one{قبل ثانية واحدة}other{قبل # ثانية}two{قبل ثانيتين}zero{قبل # ثانية}',\n      F:'few{خلال # ثوانٍ}many{خلال # ثانية}one{خلال ثانية واحدة}other{خلال # ثانية}two{خلال ثانيتين}zero{خلال # ثانية}',\n    },\n    SHORT:{\n      R:{'0':'الآن'},\n      P:'few{قبل # ثوانٍ}many{قبل # ثانية}one{قبل ثانية واحدة}other{قبل # ثانية}two{قبل ثانيتين}zero{قبل # ثانية}',\n      F:'few{خلال # ثوانٍ}many{خلال # ثانية}one{خلال ثانية واحدة}other{خلال # ثانية}two{خلال ثانيتين}zero{خلال # ثانية}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'الأسبوع الماضي','0':'هذا الأسبوع','1':'الأسبوع القادم'},\n      P:'few{قبل # أسابيع}many{قبل # أسبوعًا}one{قبل أسبوع واحد}other{قبل # أسبوع}two{قبل أسبوعين}zero{قبل # أسبوع}',\n      F:'few{خلال # أسابيع}many{خلال # أسبوعًا}one{خلال أسبوع واحد}other{خلال # أسبوع}two{خلال أسبوعين}zero{خلال # أسبوع}',\n    },\n    SHORT:{\n      R:{'-1':'الأسبوع الماضي','0':'هذا الأسبوع','1':'الأسبوع القادم'},\n      P:'few{قبل # أسابيع}many{قبل # أسبوعًا}one{قبل أسبوع واحد}other{قبل # أسبوع}two{قبل أسبوعين}zero{قبل # أسبوع}',\n      F:'few{خلال # أسابيع}many{خلال # أسبوعًا}one{خلال أسبوع واحد}other{خلال # أسبوع}two{خلال # أسبوعين}zero{خلال # أسبوع}',\n    },\n    NARROW:{\n      R:{'-1':'الأسبوع الماضي','0':'هذا الأسبوع','1':'الأسبوع القادم'},\n      P:'few{قبل # أسابيع}many{قبل # أسبوعًا}one{قبل أسبوع واحد}other{قبل # أسبوع}two{قبل أسبوعين}zero{قبل # أسبوع}',\n      F:'few{خلال # أسابيع}many{خلال # أسبوعًا}one{خلال أسبوع واحد}other{خلال # أسبوع}two{خلال أسبوعين}zero{خلال # أسبوع}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'السنة الماضية','0':'السنة الحالية','1':'السنة القادمة'},\n      P:'few{قبل # سنوات}many{قبل # سنة}one{قبل سنة واحدة}other{قبل # سنة}two{قبل سنتين}zero{قبل # سنة}',\n      F:'few{خلال # سنوات}many{خلال # سنة}one{خلال سنة واحدة}other{خلال # سنة}two{خلال سنتين}zero{خلال # سنة}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_DZ = exports.RelativeDateTimeSymbols_ar;\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ar_EG = exports.RelativeDateTimeSymbols_ar;\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_az =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'dünən','0':'bu gün','1':'sabah'},\n      P:'one{# gün öncə}other{# gün öncə}',\n      F:'one{# gün ərzində}other{# gün ərzində}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'bu saat'},\n      P:'one{# saat öncə}other{# saat öncə}',\n      F:'one{# saat ərzində}other{# saat ərzində}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'bu dəqiqə'},\n      P:'one{# dəqiqə öncə}other{# dəqiqə öncə}',\n      F:'one{# dəqiqə ərzində}other{# dəqiqə ərzində}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'keçən ay','0':'bu ay','1':'gələn ay'},\n      P:'one{# ay öncə}other{# ay öncə}',\n      F:'one{# ay ərzində}other{# ay ərzində}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'keçən rüb','0':'bu rüb','1':'gələn rüb'},\n      P:'one{# rüb öncə}other{# rüb öncə}',\n      F:'one{# rüb ərzində}other{# rüb ərzində}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'indi'},\n      P:'one{# saniyə öncə}other{# saniyə öncə}',\n      F:'one{# saniyə ərzində}other{# saniyə ərzində}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'keçən həftə','0':'bu həftə','1':'gələn həftə'},\n      P:'one{# həftə öncə}other{# həftə öncə}',\n      F:'one{# həftə ərzində}other{# həftə ərzində}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'keçən il','0':'bu il','1':'gələn il'},\n      P:'one{# il öncə}other{# il öncə}',\n      F:'one{# il ərzində}other{# il ərzində}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_be =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'учора','-2':'пазаўчора','0':'сёння','1':'заўтра','2':'паслязаўтра'},\n      P:'few{# дні таму}many{# дзён таму}one{# дзень таму}other{# дня таму}',\n      F:'few{праз # дні}many{праз # дзён}one{праз # дзень}other{праз # дня}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'у гэту гадзіну'},\n      P:'few{# гадзіны таму}many{# гадзін таму}one{# гадзіну таму}other{# гадзіны таму}',\n      F:'few{праз # гадзіны}many{праз # гадзін}one{праз # гадзіну}other{праз # гадзіны}',\n    },\n    SHORT:{\n      R:{'0':'у гэту гадзіну'},\n      P:'few{# гадз таму}many{# гадз таму}one{# гадз таму}other{# гадз таму}',\n      F:'few{праз # гадз}many{праз # гадз}one{праз # гадз}other{праз # гадз}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'у гэту хвіліну'},\n      P:'few{# хвіліны таму}many{# хвілін таму}one{# хвіліну таму}other{# хвіліны таму}',\n      F:'few{праз # хвіліны}many{праз # хвілін}one{праз # хвіліну}other{праз # хвіліны}',\n    },\n    SHORT:{\n      R:{'0':'у гэту хвіліну'},\n      P:'few{# хв таму}many{# хв таму}one{# хв таму}other{# хв таму}',\n      F:'few{праз # хв}many{праз # хв}one{праз # хв}other{праз # хв}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'у мінулым месяцы','0':'у гэтым месяцы','1':'у наступным месяцы'},\n      P:'few{# месяцы таму}many{# месяцаў таму}one{# месяц таму}other{# месяца таму}',\n      F:'few{праз # месяцы}many{праз # месяцаў}one{праз # месяц}other{праз # месяца}',\n    },\n    SHORT:{\n      R:{'-1':'у мінулым месяцы','0':'у гэтым месяцы','1':'у наступным месяцы'},\n      P:'few{# мес. таму}many{# мес. таму}one{# мес. таму}other{# мес. таму}',\n      F:'few{праз # мес.}many{праз # мес.}one{праз # мес.}other{праз # мес.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'у мінулым квартале','0':'у гэтым квартале','1':'у наступным квартале'},\n      P:'few{# кварталы таму}many{# кварталаў таму}one{# квартал таму}other{# квартала таму}',\n      F:'few{праз # кварталы}many{праз # кварталаў}one{праз # квартал}other{праз # квартала}',\n    },\n    SHORT:{\n      R:{'-1':'у мінулым квартале','0':'у гэтым квартале','1':'у наступным квартале'},\n      P:'few{# кв. таму}many{# кв. таму}one{# кв. таму}other{# кв. таму}',\n      F:'few{праз # кв.}many{праз # кв.}one{праз # кв.}other{праз # кв.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'цяпер'},\n      P:'few{# секунды таму}many{# секунд таму}one{# секунду таму}other{# секунды таму}',\n      F:'few{праз # секунды}many{праз # секунд}one{праз # секунду}other{праз # секунды}',\n    },\n    SHORT:{\n      R:{'0':'цяпер'},\n      P:'few{# с таму}many{# с таму}one{# с таму}other{# с таму}',\n      F:'few{праз # с}many{праз # с}one{праз # с}other{праз # с}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'на мінулым тыдні','0':'на гэтым тыдні','1':'на наступным тыдні'},\n      P:'few{# тыдні таму}many{# тыдняў таму}one{# тыдзень таму}other{# тыдня таму}',\n      F:'few{праз # тыдні}many{праз # тыдняў}one{праз # тыдзень}other{праз # тыдня}',\n    },\n    SHORT:{\n      R:{'-1':'на мінулым тыдні','0':'на гэтым тыдні','1':'на наступным тыдні'},\n      P:'few{# тыд таму}many{# тыд таму}one{# тыд таму}other{# тыд таму}',\n      F:'few{праз # тыд}many{праз # тыд}one{праз # тыд}other{праз # тыд}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'у мінулым годзе','0':'у гэтым годзе','1':'у наступным годзе'},\n      P:'few{# гады таму}many{# гадоў таму}one{# год таму}other{# года таму}',\n      F:'few{праз # гады}many{праз # гадоў}one{праз # год}other{праз # года}',\n    },\n    SHORT:{\n      R:{'-1':'у мінулым годзе','0':'у гэтым годзе','1':'у наступным годзе'},\n      P:'few{# г. таму}many{# г. таму}one{# г. таму}other{# г. таму}',\n      F:'few{праз # г.}many{праз # г.}one{праз # г.}other{праз # г.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bg =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'вчера','-2':'онзи ден','0':'днес','1':'утре','2':'вдругиден'},\n      P:'one{преди # ден}other{преди # дни}',\n      F:'one{след # ден}other{след # дни}',\n    },\n    NARROW:{\n      R:{'-1':'вчера','-2':'онзи ден','0':'днес','1':'утре','2':'вдругиден'},\n      P:'one{пр. # д}other{пр. # д}',\n      F:'one{сл. # д}other{сл. # д}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'в този час'},\n      P:'one{преди # час}other{преди # часа}',\n      F:'one{след # час}other{след # часа}',\n    },\n    SHORT:{\n      R:{'0':'в този час'},\n      P:'one{преди # ч}other{преди # ч}',\n      F:'one{след # ч}other{след # ч}',\n    },\n    NARROW:{\n      R:{'0':'в този час'},\n      P:'one{пр. # ч}other{пр. # ч}',\n      F:'one{сл. # ч}other{сл. # ч}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'в тази минута'},\n      P:'one{преди # минута}other{преди # минути}',\n      F:'one{след # минута}other{след # минути}',\n    },\n    SHORT:{\n      R:{'0':'в тази минута'},\n      P:'one{преди # мин}other{преди # мин}',\n      F:'one{след # мин}other{след # мин}',\n    },\n    NARROW:{\n      R:{'0':'в тази минута'},\n      P:'one{пр. # мин}other{пр. # мин}',\n      F:'one{сл. # мин}other{сл. # мин}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'предходен месец','0':'този месец','1':'следващ месец'},\n      P:'one{преди # месец}other{преди # месеца}',\n      F:'one{след # месец}other{след # месеца}',\n    },\n    SHORT:{\n      R:{'-1':'мин. мес.','0':'този мес.','1':'следв. мес.'},\n      P:'one{преди # м.}other{преди # м.}',\n      F:'one{след # м.}other{след # м.}',\n    },\n    NARROW:{\n      R:{'-1':'мин. м.','0':'т. м.','1':'сл. м.'},\n      P:'one{пр. # м.}other{пр. # м.}',\n      F:'one{сл. # м.}other{сл. # м.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'предходно тримесечие','0':'това тримесечие','1':'следващо тримесечие'},\n      P:'one{преди # тримесечие}other{преди # тримесечия}',\n      F:'one{след # тримесечие}other{след # тримесечия}',\n    },\n    SHORT:{\n      R:{'-1':'мин. трим.','0':'това трим.','1':'следв. трим.'},\n      P:'one{преди # трим.}other{преди # трим.}',\n      F:'one{след # трим.}other{след # трим.}',\n    },\n    NARROW:{\n      R:{'-1':'мин. трим.','0':'това трим.','1':'следв. трим.'},\n      P:'one{пр. # трим.}other{пр. # трим.}',\n      F:'one{сл. # трим.}other{сл. # трим.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'сега'},\n      P:'one{преди # секунда}other{преди # секунди}',\n      F:'one{след # секунда}other{след # секунди}',\n    },\n    SHORT:{\n      R:{'0':'сега'},\n      P:'one{преди # сек}other{преди # сек}',\n      F:'one{след # сек}other{след # сек}',\n    },\n    NARROW:{\n      R:{'0':'сега'},\n      P:'one{пр. # сек}other{пр. # сек}',\n      F:'one{сл. # сек}other{сл. # сек}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'предходната седмица','0':'тази седмица','1':'следващата седмица'},\n      P:'one{преди # седмица}other{преди # седмици}',\n      F:'one{след # седмица}other{след # седмици}',\n    },\n    SHORT:{\n      R:{'-1':'миналата седмица','0':'тази седм.','1':'следв. седм.'},\n      P:'one{преди # седм.}other{преди # седм.}',\n      F:'one{след # седм.}other{след # седм.}',\n    },\n    NARROW:{\n      R:{'-1':'мин. седм.','0':'тази седм.','1':'сл. седм.'},\n      P:'one{пр. # седм.}other{пр. # седм.}',\n      F:'one{сл. # седм.}other{сл. # седм.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'миналата година','0':'тази година','1':'следващата година'},\n      P:'one{преди # година}other{преди # години}',\n      F:'one{след # година}other{след # години}',\n    },\n    SHORT:{\n      R:{'-1':'мин. г.','0':'т. г.','1':'следв. г.'},\n      P:'one{преди # г.}other{преди # г.}',\n      F:'one{след # г.}other{след # г.}',\n    },\n    NARROW:{\n      R:{'-1':'мин. г.','0':'т. г.','1':'сл. г.'},\n      P:'one{пр. # г.}other{пр. # г.}',\n      F:'one{сл. # г.}other{сл. # г.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bn =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'গতকাল','-2':'গত পরশু','0':'আজ','1':'আগামীকাল','2':'আগামী পরশু'},\n      P:'one{# দিন আগে}other{# দিন আগে}',\n      F:'one{# দিনের মধ্যে}other{# দিনের মধ্যে}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'এই ঘণ্টায়'},\n      P:'one{# ঘন্টা আগে}other{# ঘন্টা আগে}',\n      F:'one{# ঘন্টায়}other{# ঘন্টায়}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'এই মিনিট'},\n      P:'one{# মিনিট আগে}other{# মিনিট আগে}',\n      F:'one{# মিনিটে}other{# মিনিটে}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'গত মাস','0':'এই মাস','1':'পরের মাস'},\n      P:'one{# মাস আগে}other{# মাস আগে}',\n      F:'one{# মাসে}other{# মাসে}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'গত ত্রৈমাসিক','0':'এই ত্রৈমাসিক','1':'পরের ত্রৈমাসিক'},\n      P:'one{# ত্রৈমাসিক আগে}other{# ত্রৈমাসিক আগে}',\n      F:'one{# ত্রৈমাসিকে}other{# ত্রৈমাসিকে}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'এখন'},\n      P:'one{# সেকেন্ড পূর্বে}other{# সেকেন্ড পূর্বে}',\n      F:'one{# সেকেন্ডে}other{# সেকেন্ডে}',\n    },\n    NARROW:{\n      R:{'0':'এখন'},\n      P:'one{# সেকেন্ড আগে}other{# সেকেন্ড আগে}',\n      F:'one{# সেকেন্ডে}other{# সেকেন্ডে}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'গত সপ্তাহ','0':'এই সপ্তাহ','1':'পরের সপ্তাহ'},\n      P:'one{# সপ্তাহ আগে}other{# সপ্তাহ আগে}',\n      F:'one{# সপ্তাহে}other{# সপ্তাহে}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'গত বছর','0':'এই বছর','1':'পরের বছর'},\n      P:'one{# বছর পূর্বে}other{# বছর পূর্বে}',\n      F:'one{# বছরে}other{# বছরে}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_br =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'decʼh','-2':'dercʼhent-decʼh','0':'hiziv','1':'warcʼhoazh'},\n      P:'few{# deiz zo}many{# a zeizioù zo}one{# deiz zo}other{# deiz zo}two{# zeiz zo}',\n      F:'few{a-benn # deiz}many{a-benn # a zeizioù}one{a-benn # deiz}other{a-benn # deiz}two{a-benn # zeiz}',\n    },\n    SHORT:{\n      R:{'-1':'decʼh','-2':'dercʼhent-decʼh','0':'hiziv','1':'warcʼhoazh'},\n      P:'few{# d zo}many{# d zo}one{# d zo}other{# d zo}two{# d zo}',\n      F:'few{a-benn # d}many{a-benn # d}one{a-benn # d}other{a-benn # d}two{a-benn # d}',\n    },\n    NARROW:{\n      R:{'-1':'decʼh','-2':'dercʼhent-decʼh','0':'hiziv','1':'warcʼhoazh'},\n      P:'few{-# d}many{-# d}one{-# d}other{-# d}two{-# d}',\n      F:'few{+# d}many{+# d}one{+# d}other{+# d}two{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'dʼan eur-mañ'},\n      P:'few{# eur zo}many{# a eurioù zo}one{# eur zo}other{# eur zo}two{# eur zo}',\n      F:'few{a-benn # eur}many{a-benn # a eurioù}one{a-benn # eur}other{a-benn # eur}two{a-benn # eur}',\n    },\n    SHORT:{\n      R:{'0':'dʼan eur-mañ'},\n      P:'few{# e zo}many{# e zo}one{# e zo}other{# e zo}two{# e zo}',\n      F:'few{a-benn # e}many{a-benn # e}one{a-benn # e}other{a-benn # e}two{a-benn # e}',\n    },\n    NARROW:{\n      R:{'0':'dʼan eur-mañ'},\n      P:'few{-# h}many{-# h}one{-# h}other{-# h}two{-# h}',\n      F:'few{+# h}many{+# h}one{+# h}other{+# h}two{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'few{# munut zo}many{# a vunutoù zo}one{# munut zo}other{# munut zo}two{# vunut zo}',\n      F:'few{a-benn # munut}many{a-benn # a vunutoù}one{a-benn # munut}other{a-benn # munut}two{a-benn # vunut}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'few{# min zo}many{# min zo}one{# min zo}other{# min zo}two{# min zo}',\n      F:'few{a-benn # min}many{a-benn # min}one{a-benn # min}other{a-benn # min}two{a-benn # min}',\n    },\n    NARROW:{\n      R:{'0':'this minute'},\n      P:'few{-# min}many{-# min}one{-# min}other{-# min}two{-# min}',\n      F:'few{+# min}many{+# min}one{+# min}other{+# min}two{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ar miz diaraok','0':'ar miz-mañ','1':'ar miz a zeu'},\n      P:'few{# miz zo}many{# a vizioù zo}one{# miz zo}other{# miz zo}two{# viz zo}',\n      F:'few{a-benn # miz}many{a-benn # a vizioù}one{a-benn # miz}other{a-benn # miz}two{a-benn # viz}',\n    },\n    NARROW:{\n      R:{'-1':'ar miz diaraok','0':'ar miz-mañ','1':'ar miz a zeu'},\n      P:'few{-# miz}many{-# miz}one{-# miz}other{-# miz}two{-# miz}',\n      F:'few{+# miz}many{+# miz}one{+# miz}other{+# miz}two{+# miz}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'an trimiziad diaraok','0':'an trimiziad-mañ','1':'an trimiziad a zeu'},\n      P:'few{# zrimiziad zo}many{# a zrimiziadoù zo}one{# trimiziad zo}other{# trimiziad zo}two{# drimiziad zo}',\n      F:'few{a-benn # zrimiziad}many{a-benn # a drimiziadoù}one{a-benn # trimiziad}other{a-benn # trimiziad}two{a-benn # drimiziad}',\n    },\n    SHORT:{\n      R:{'-1':'an trim. diaraok','0':'an trim.-mañ','1':'an trim. a zeu'},\n      P:'few{# trim. zo}many{# trim. zo}one{# trim. zo}other{# trim. zo}two{# trim. zo}',\n      F:'few{a-benn # trim.}many{a-benn # trim.}one{a-benn # trim.}other{a-benn # trim.}two{a-benn # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'an trim. diaraok','0':'an trim.-mañ','1':'an trim. a zeu'},\n      P:'few{-# trim.}many{-# trim.}one{-# trim.}other{-# trim.}two{-# trim.}',\n      F:'few{+# trim.}many{+# trim.}one{+# trim.}other{+# trim.}two{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'bremañ'},\n      P:'few{# eilenn zo}many{# eilenn zo}one{# eilenn zo}other{# eilenn zo}two{# eilenn zo}',\n      F:'few{a-benn # eilenn}many{a-benn # a eilennoù}one{a-benn # eilenn}other{a-benn # eilenn}two{a-benn # eilenn}',\n    },\n    SHORT:{\n      R:{'0':'brem.'},\n      P:'few{# s zo}many{# s zo}one{# s zo}other{# s zo}two{# s zo}',\n      F:'few{a-benn # s}many{a-benn # s}one{a-benn # s}other{a-benn # s}two{a-benn # s}',\n    },\n    NARROW:{\n      R:{'0':'brem.'},\n      P:'few{-# s}many{-# s}one{-# s}other{-# s}two{-# s}',\n      F:'few{+# s}many{+# s}one{+# s}other{+# s}two{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ar sizhun diaraok','0':'ar sizhun-mañ','1':'ar sizhun a zeu'},\n      P:'few{# sizhun zo}many{# a sizhunioù zo}one{# sizhun zo}other{# sizhun zo}two{# sizhun zo}',\n      F:'few{a-benn # sizhun}many{a-benn # a sizhunioù}one{a-benn # sizhun}other{a-benn # sizhun}two{a-benn # sizhun}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'warlene','0':'hevlene','1':'ar bloaz a zeu'},\n      P:'few{# bloaz zo}many{# a vloazioù zo}one{# bloaz zo}other{# vloaz zo}two{# vloaz zo}',\n      F:'few{a-benn # bloaz}many{a-benn # a vloazioù}one{a-benn # bloaz}other{a-benn # vloaz}two{a-benn # vloaz}',\n    },\n    SHORT:{\n      R:{'-1':'warlene','0':'hevlene','1':'ar bl. a zeu'},\n      P:'few{# bl. zo}many{# bl. zo}one{# bl. zo}other{# bl. zo}two{# bl. zo}',\n      F:'few{a-benn # bl.}many{a-benn # bl.}one{a-benn # bl.}other{a-benn # bl.}two{a-benn # bl.}',\n    },\n    NARROW:{\n      R:{'-1':'warlene','0':'hevlene','1':'ar bl. a zeu'},\n      P:'few{-# bl.}many{-# bl.}one{-# bl.}other{-# bl.}two{-# bl.}',\n      F:'few{+# bl.}many{+# bl.}one{+# bl.}other{+# bl.}two{+# bl.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_bs =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'jučer','-2':'prekjučer','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{prije # dana}one{prije # dan}other{prije # dana}',\n      F:'few{za # dana}one{za # dan}other{za # dana}',\n    },\n    SHORT:{\n      R:{'-1':'jučer','-2':'prekjučer','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{prije # d.}one{prije # d.}other{prije # d.}',\n      F:'few{za # d.}one{za # d.}other{za # d.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ovaj sat'},\n      P:'few{prije # sata}one{prije # sat}other{prije # sati}',\n      F:'few{za # sata}one{za # sat}other{za # sati}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ova minuta'},\n      P:'few{prije # minute}one{prije # minutu}other{prije # minuta}',\n      F:'few{za # minute}one{za # minutu}other{za # minuta}',\n    },\n    SHORT:{\n      R:{'0':'ova minuta'},\n      P:'few{prije # min.}one{prije # min.}other{prije # min.}',\n      F:'few{za # min.}one{za # min.}other{za # min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'prošli mjesec','0':'ovaj mjesec','1':'sljedeći mjesec'},\n      P:'few{prije # mjeseca}one{prije # mjesec}other{prije # mjeseci}',\n      F:'few{za # mjeseca}one{za # mjesec}other{za # mjeseci}',\n    },\n    SHORT:{\n      R:{'-1':'prošli mjesec','0':'ovaj mjesec','1':'sljedeći mjesec'},\n      P:'few{prije # mj.}one{prije # mj.}other{prije # mj.}',\n      F:'few{za # mj.}one{za # mj.}other{za # mj.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'posljednji kvartal','0':'ovaj kvartal','1':'sljedeći kvartal'},\n      P:'few{prije # kvartala}one{prije # kvartal}other{prije # kvartala}',\n      F:'few{za # kvartala}one{za # kvartal}other{za # kvartala}',\n    },\n    SHORT:{\n      R:{'-1':'posljednji kvartal','0':'ovaj kvartal','1':'sljedeći kvartal'},\n      P:'few{prije # kv.}one{prije # kv.}other{prije # kv.}',\n      F:'few{za # kv.}one{za # kv.}other{za # kv.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'sada'},\n      P:'few{prije # sekunde}one{prije # sekundu}other{prije # sekundi}',\n      F:'few{za # sekunde}one{za # sekundu}other{za # sekundi}',\n    },\n    SHORT:{\n      R:{'0':'sada'},\n      P:'few{prije # sek.}one{prije # sek.}other{prije # sek.}',\n      F:'few{za # sek.}one{za # sek.}other{za # sek.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'prošle sedmice','0':'ove sedmice','1':'sljedeće sedmice'},\n      P:'few{prije # sedmice}one{prije # sedmicu}other{prije # sedmica}',\n      F:'few{za # sedmice}one{za # sedmicu}other{za # sedmica}',\n    },\n    SHORT:{\n      R:{'-1':'prošle sedmice','0':'ove sedmice','1':'sljedeće sedmice'},\n      P:'few{prije # sed.}one{prije # sed.}other{prije # sed.}',\n      F:'few{za # sed.}one{za # sed.}other{za # sed.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'prošle godine','0':'ove godine','1':'sljedeće godine'},\n      P:'few{prije # godine}one{prije # godinu}other{prije # godina}',\n      F:'few{za # godine}one{za # godinu}other{za # godina}',\n    },\n    SHORT:{\n      R:{'-1':'prošle godine','0':'ove godine','1':'sljedeće godine'},\n      P:'few{prije # god.}one{prije # god.}other{prije # god.}',\n      F:'few{za # god.}one{za # god.}other{za # god.}',\n    },\n    NARROW:{\n      R:{'-1':'prošle godine','0':'ove godine','1':'sljedeće godine'},\n      P:'few{prije # g.}one{prije # g.}other{prije # g.}',\n      F:'few{za # g.}one{za # g.}other{za # g.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ca =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ahir','-2':'abans-d’ahir','0':'avui','1':'demà','2':'demà passat'},\n      P:'one{fa # dia}other{fa # dies}',\n      F:'one{d’aquí a # dia}other{d’aquí a # dies}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'aquesta hora'},\n      P:'one{fa # hora}other{fa # hores}',\n      F:'one{d’aquí a # hora}other{d’aquí a # hores}',\n    },\n    SHORT:{\n      R:{'0':'aquesta hora'},\n      P:'one{fa # h}other{fa # h}',\n      F:'one{d’aquí a # h}other{d’aquí a # h}',\n    },\n    NARROW:{\n      R:{'0':'aquesta hora'},\n      P:'one{fa # h}other{fa # h}',\n      F:'one{d‘aquí a # h}other{d‘aquí a # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'aquest minut'},\n      P:'one{fa # minut}other{fa # minuts}',\n      F:'one{d’aquí a # minut}other{d’aquí a # minuts}',\n    },\n    SHORT:{\n      R:{'0':'aquest minut'},\n      P:'one{fa # min}other{fa # min}',\n      F:'one{d’aquí a # min}other{d’aquí a # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes passat','0':'aquest mes','1':'el mes que ve'},\n      P:'one{fa # mes}other{fa # mesos}',\n      F:'one{d’aquí a # mes}other{d’aquí a # mesos}',\n    },\n    NARROW:{\n      R:{'-1':'mes passat','0':'aquest mes','1':'mes vinent'},\n      P:'one{fa # mes}other{fa # mesos}',\n      F:'one{d’aquí a # mes}other{d’aquí a # mesos}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre passat','0':'aquest trimestre','1':'el trimestre que ve'},\n      P:'one{fa # trimestre}other{fa # trimestres}',\n      F:'one{d’aquí a # trimestre}other{d’aquí a # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trim. passat','0':'aquest trim.','1':'el trim. que ve'},\n      P:'one{fa # trim.}other{fa # trim.}',\n      F:'one{d’aquí a # trim.}other{d’aquí a # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. passat','0':'aquest trim.','1':'trim. vinent'},\n      P:'one{fa # trim.}other{fa # trim.}',\n      F:'one{d’aquí a # trim.}other{d’aquí a # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ara'},\n      P:'one{fa # segon}other{fa # segons}',\n      F:'one{d’aquí a # segon}other{d’aquí a # segons}',\n    },\n    SHORT:{\n      R:{'0':'ara'},\n      P:'one{fa # s}other{fa # s}',\n      F:'one{d’aquí a # s}other{d’aquí a # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la setmana passada','0':'aquesta setmana','1':'la setmana que ve'},\n      P:'one{fa # setmana}other{fa # setmanes}',\n      F:'one{d’aquí a # setmana}other{d’aquí a # setmanes}',\n    },\n    SHORT:{\n      R:{'-1':'la setm. passada','0':'aquesta setm.','1':'la setm. que ve'},\n      P:'one{fa # setm.}other{fa # setm.}',\n      F:'one{d’aquí a # setm.}other{d’aquí a # setm.}',\n    },\n    NARROW:{\n      R:{'-1':'setm. passada','0':'aquesta setm.','1':'setm. vinent'},\n      P:'one{fa # setm.}other{fa # setm.}',\n      F:'one{d’aquí a # setm.}other{d’aquí a # setm.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'l’any passat','0':'enguany','1':'l’any que ve'},\n      P:'one{fa # any}other{fa # anys}',\n      F:'one{d’aquí a # any}other{d’aquí a # anys}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_chr =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ᏒᎯ','0':'ᎪᎯ ᎢᎦ','1':'ᏌᎾᎴᎢ'},\n      P:'one{# ᎢᎦ ᏥᎨᏒ}other{# ᎯᎸᏍᎩ ᏧᏒᎯᏛ ᏥᎨᏒ}',\n      F:'one{ᎾᎿ # ᎢᎦ}other{ᎾᎿ # ᎯᎸᏍᎩ ᏧᏒᎯᏛ}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ᎯᎠ ᏑᏟᎶᏓ'},\n      P:'one{# ᏑᏟᎶᏓ ᏥᎨᏒ}other{# ᎢᏳᏟᎶᏓ ᏥᎨᏒ}',\n      F:'one{ᎾᎿ # ᏑᏟᎶᏓ}other{ᎾᎿ # ᎢᏳᏟᎶᏓ}',\n    },\n    SHORT:{\n      R:{'0':'ᎯᎠ ᏑᏟᎶᏓ'},\n      P:'one{# ᏑᏟ. ᏥᎨᏒ}other{# ᏑᏟ. ᏥᎨᏒ}',\n      F:'one{ᎾᎿ # ᏑᏟ.}other{ᎾᎿ # ᏑᏟ.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ᎯᎠ ᎢᏯᏔᏬᏍᏔᏅ'},\n      P:'one{# ᎢᏯᏔᏬᏍᏔᏅ ᏥᎨᏒ}other{# ᎢᏯᏔᏬᏍᏔᏅ ᏥᎨᏒ}',\n      F:'one{ᎾᎿ # ᎢᏯᏔᏬᏍᏔᏅ}other{ᎾᎿ # ᎢᏯᏔᏬᏍᏔᏅ}',\n    },\n    SHORT:{\n      R:{'0':'ᎯᎠ ᎢᏯᏔᏬᏍᏔᏅ'},\n      P:'one{# ᎢᏯᏔ. ᏥᎨᏒ}other{# ᎢᏯᏔ. ᏥᎨᏒ}',\n      F:'one{ᎾᎿ # ᎢᏯᏔ.}other{ᎾᎿ # ᎢᏯᏔ.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ᎧᎸᎢ ᏥᎨᏒ','0':'ᎯᎠ ᎧᎸᎢ','1':'ᏔᎵᏁ ᎧᎸᎢ'},\n      P:'one{# ᎧᎸᎢ ᏥᎨᏒ}other{# ᏗᎧᎸᎢ ᏥᎨᏒ}',\n      F:'one{ᎾᎿ # ᎧᎸᎢ}other{ᎾᎿ # ᏗᎧᎸᎢ}',\n    },\n    SHORT:{\n      R:{'-1':'ᎧᎸᎢ ᏥᎨᏒ','0':'ᎯᎠ ᎧᎸᎢ','1':'ᏔᎵᏁ ᎧᎸᎢ'},\n      P:'one{# ᎧᎸ. ᏥᎨᏒ}other{# ᎧᎸ. ᏥᎨᏒ}',\n      F:'one{ᎾᎿ # ᎧᎸ.}other{ᎾᎿ # ᎧᎸ.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'ᎩᏄᏙᏗ ᏥᎨᏒ','0':'ᎯᎠ ᎩᏄᏙᏗ','1':'ᏔᎵᏁ ᎩᏄᏙᏗ'},\n      P:'one{ᎾᎿ # ᎩᏄᏙᏗ ᏥᎨᏒ}other{# ᎩᏄᏙᏗ ᏥᎨᏒ}',\n      F:'one{ᎾᎿ # ᎩᏄᏙᏗ}other{ᎾᎿ # ᎩᏄᏙᏗ}',\n    },\n    SHORT:{\n      R:{'-1':'ᎩᏄᏙᏗ ᏥᎨᏒ','0':'ᎯᎠ ᎩᏄᏙᏗ','1':'ᏔᎵᏁ ᎩᏄᏙᏗ'},\n      P:'one{# ᎩᏄᏘ. ᏥᎨᏒ}other{# ᎩᏄᏘ. ᏥᎨᏒ}',\n      F:'one{ᎾᎿ # ᎩᏄᏘ.}other{ᎾᎿ # ᎩᏄᏘ.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ᏃᏊ'},\n      P:'one{# ᎠᏎᏢ ᏥᎨᏒ}other{# ᏓᏓᎾᏩᏍᎬ ᏥᎨᏒ}',\n      F:'one{ᎾᎿ # ᎠᏎᏢ}other{ᎾᎿ # ᏓᏓᎾᏩᏍᎬ ᏥᎨᏒ}',\n    },\n    SHORT:{\n      R:{'0':'ᏃᏊ'},\n      P:'one{# ᎠᏎ. ᏥᎨᏒ}other{# ᎠᏎ. ᏥᎨᏒ}',\n      F:'one{ᎾᎿ # ᎠᏎ.}other{ᎾᎿ # ᎠᏎ.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ᏥᏛᎵᏱᎵᏒᎢ','0':'ᎯᎠ ᎠᎵᎵᏌ','1':'ᏐᏆᎴᏅᎲ'},\n      P:'one{# ᏒᎾᏙᏓᏆᏍᏗ ᏥᎨᏒ}other{# ᎢᏳᎾᏙᏓᏆᏍᏗ ᏥᎨᏒ}',\n      F:'one{ᎾᎿ # ᏒᎾᏙᏓᏆᏍᏗ}other{ᎾᎿ # ᎢᏳᎾᏙᏓᏆᏍᏗ}',\n    },\n    SHORT:{\n      R:{'-1':'ᏥᏛᎵᏱᎵᏒᎢ','0':'ᎯᎠ ᎠᎵᎵᏌ','1':'ᏐᏆᎴᏅᎲ'},\n      P:'one{# ᏒᎾ. ᏥᎨᏒ}other{# ᏒᎾ. ᏥᎨᏒ}',\n      F:'one{ᎾᎿ # ᏒᎾ.}other{ᎾᎿ # ᏒᎾ.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ᎡᏘ ᏥᎨᏒ','0':'ᎯᎠ ᏧᏕᏘᏴᏒᏘ','1':'ᎡᏘᏴᎢ'},\n      P:'one{# ᎤᏕᏘᏴᏌᏗᏒᎢ ᏥᎨᏒ}other{# ᎢᏧᏕᏘᏴᏌᏗᏒᎢ ᏥᎨᏒ}',\n      F:'one{ᎾᎿ # ᎤᏕᏘᏴᏌᏗᏒᎢ}other{ᎾᎿ # ᎢᏧᏕᏘᏴᏌᏗᏒᎢ}',\n    },\n    SHORT:{\n      R:{'-1':'ᎡᏘ ᏥᎨᏒ','0':'ᎯᎠ ᏧᏕᏘᏴᏒᏘ','1':'ᎡᏘᏴᎢ'},\n      P:'one{# ᎤᏕ. ᏥᎨᏒ}other{# ᎤᏕ. ᏥᎨᏒ}',\n      F:'one{ᎾᎿ # ᎤᏕ.}other{ᎾᎿ # ᎤᏕ.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_cs =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'včera','-2':'předevčírem','0':'dnes','1':'zítra','2':'pozítří'},\n      P:'few{před # dny}many{před # dne}one{před # dnem}other{před # dny}',\n      F:'few{za # dny}many{za # dne}one{za # den}other{za # dní}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'tuto hodinu'},\n      P:'few{před # hodinami}many{před # hodiny}one{před # hodinou}other{před # hodinami}',\n      F:'few{za # hodiny}many{za # hodiny}one{za # hodinu}other{za # hodin}',\n    },\n    SHORT:{\n      R:{'0':'tuto hodinu'},\n      P:'few{před # h}many{před # h}one{před # h}other{před # h}',\n      F:'few{za # h}many{za # h}one{za # h}other{za # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'tuto minutu'},\n      P:'few{před # minutami}many{před # minuty}one{před # minutou}other{před # minutami}',\n      F:'few{za # minuty}many{za # minuty}one{za # minutu}other{za # minut}',\n    },\n    SHORT:{\n      R:{'0':'tuto minutu'},\n      P:'few{před # min}many{před # min}one{před # min}other{před # min}',\n      F:'few{za # min}many{za # min}one{za # min}other{za # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'minulý měsíc','0':'tento měsíc','1':'příští měsíc'},\n      P:'few{před # měsíci}many{před # měsíce}one{před # měsícem}other{před # měsíci}',\n      F:'few{za # měsíce}many{za # měsíce}one{za # měsíc}other{za # měsíců}',\n    },\n    SHORT:{\n      R:{'-1':'minulý měs.','0':'tento měs.','1':'příští měs.'},\n      P:'few{před # měs.}many{před # měs.}one{před # měs.}other{před # měs.}',\n      F:'few{za # měs.}many{za # měs.}one{za # měs.}other{za # měs.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'minulé čtvrtletí','0':'toto čtvrtletí','1':'příští čtvrtletí'},\n      P:'few{před # čtvrtletími}many{před # čtvrtletí}one{před # čtvrtletím}other{před # čtvrtletími}',\n      F:'few{za # čtvrtletí}many{za # čtvrtletí}one{za # čtvrtletí}other{za # čtvrtletí}',\n    },\n    SHORT:{\n      R:{'-1':'minulé čtvrtletí','0':'toto čtvrtletí','1':'příští čtvrtletí'},\n      P:'few{-# Q}many{-# Q}one{-# Q}other{-# Q}',\n      F:'few{+# Q}many{+# Q}one{+# Q}other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'nyní'},\n      P:'few{před # sekundami}many{před # sekundy}one{před # sekundou}other{před # sekundami}',\n      F:'few{za # sekundy}many{za # sekundy}one{za # sekundu}other{za # sekund}',\n    },\n    SHORT:{\n      R:{'0':'nyní'},\n      P:'few{před # s}many{před # s}one{před # s}other{před # s}',\n      F:'few{za # s}many{za # s}one{za # s}other{za # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'minulý týden','0':'tento týden','1':'příští týden'},\n      P:'few{před # týdny}many{před # týdne}one{před # týdnem}other{před # týdny}',\n      F:'few{za # týdny}many{za # týdne}one{za # týden}other{za # týdnů}',\n    },\n    SHORT:{\n      R:{'-1':'minulý týd.','0':'tento týd.','1':'příští týd.'},\n      P:'few{před # týd.}many{před # týd.}one{před # týd.}other{před # týd.}',\n      F:'few{za # týd.}many{za # týd.}one{za # týd.}other{za # týd.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'minulý rok','0':'tento rok','1':'příští rok'},\n      P:'few{před # lety}many{před # roku}one{před # rokem}other{před # lety}',\n      F:'few{za # roky}many{za # roku}one{za # rok}other{za # let}',\n    },\n    SHORT:{\n      R:{'-1':'minulý rok','0':'tento rok','1':'příští rok'},\n      P:'few{před # r.}many{před # r.}one{před # r.}other{před # l.}',\n      F:'few{za # r.}many{za # r.}one{za # r.}other{za # l.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_cy =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ddoe','-2':'echdoe','0':'heddiw','1':'yfory','2':'drennydd'},\n      P:'few{# diwrnod yn ôl}many{# diwrnod yn ôl}one{# diwrnod yn ôl}other{# diwrnod yn ôl}two{# ddiwrnod yn ôl}zero{# diwrnod yn ôl}',\n      F:'few{ymhen # diwrnod}many{ymhen # diwrnod}one{ymhen diwrnod}other{ymhen # diwrnod}two{ymhen deuddydd}zero{ymhen # diwrnod}',\n    },\n    NARROW:{\n      R:{'-1':'ddoe','-2':'echdoe','0':'heddiw','1':'yfory','2':'drennydd'},\n      P:'few{# diwrnod yn ôl}many{# diwrnod yn ôl}one{# diwrnod yn ôl}other{# diwrnod yn ôl}two{# ddiwrnod yn ôl}zero{# diwrnod yn ôl}',\n      F:'few{ymhen # diwrnod}many{ymhen # diwrnod}one{ymhen # diwrnod}other{ymhen # diwrnod}two{ymhen # diwrnod}zero{ymhen # diwrnod}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'yr awr hon'},\n      P:'few{# awr yn ôl}many{# awr yn ôl}one{# awr yn ôl}other{# awr yn ôl}two{# awr yn ôl}zero{# awr yn ôl}',\n      F:'few{ymhen # awr}many{ymhen # awr}one{ymhen awr}other{ymhen # awr}two{ymhen # awr}zero{ymhen # awr}',\n    },\n    SHORT:{\n      R:{'0':'yr awr hon'},\n      P:'few{# awr yn ôl}many{# awr yn ôl}one{awr yn ôl}other{# awr yn ôl}two{# awr yn ôl}zero{# awr yn ôl}',\n      F:'few{ymhen # awr}many{ymhen # awr}one{ymhen awr}other{ymhen # awr}two{ymhen # awr}zero{ymhen # awr}',\n    },\n    NARROW:{\n      R:{'0':'yr awr hon'},\n      P:'few{# awr yn ôl}many{# awr yn ôl}one{# awr yn ôl}other{# awr yn ôl}two{# awr yn ôl}zero{# awr yn ôl}',\n      F:'few{ymhen # awr}many{ymhen # awr}one{ymhen # awr}other{ymhen # awr}two{ymhen # awr}zero{ymhen # awr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'y funud hon'},\n      P:'few{# munud yn ôl}many{# munud yn ôl}one{# munud yn ôl}other{# munud yn ôl}two{# munud yn ôl}zero{# munud yn ôl}',\n      F:'few{ymhen # munud}many{ymhen # munud}one{ymhen # munud}other{ymhen # munud}two{ymhen # munud}zero{ymhen # munud}',\n    },\n    SHORT:{\n      R:{'0':'y funud hon'},\n      P:'few{# munud yn ôl}many{# munud yn ôl}one{# munud yn ôl}other{# munud yn ôl}two{# fun. yn ôl}zero{# munud yn ôl}',\n      F:'few{ymhen # munud}many{ymhen # munud}one{ymhen # mun.}other{ymhen # munud}two{ymhen # fun.}zero{ymhen # munud}',\n    },\n    NARROW:{\n      R:{'0':'y funud hon'},\n      P:'few{# mun. yn ôl}many{# mun. yn ôl}one{# mun. yn ôl}other{# mun. yn ôl}two{# mun. yn ôl}zero{# mun. yn ôl}',\n      F:'few{ymhen # mun.}many{ymhen # mun.}one{ymhen # mun.}other{ymhen # mun.}two{ymhen # mun.}zero{ymhen # mun.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mis diwethaf','0':'y mis hwn','1':'mis nesaf'},\n      P:'few{# mis yn ôl}many{# mis yn ôl}one{# mis yn ôl}other{# mis yn ôl}two{# fis yn ôl}zero{# mis yn ôl}',\n      F:'few{ymhen # mis}many{ymhen # mis}one{ymhen mis}other{ymhen # mis}two{ymhen deufis}zero{ymhen # mis}',\n    },\n    SHORT:{\n      R:{'-1':'mis diwethaf','0':'y mis hwn','1':'mis nesaf'},\n      P:'few{# mis yn ôl}many{# mis yn ôl}one{# mis yn ôl}other{# mis yn ôl}two{deufis yn ôl}zero{# mis yn ôl}',\n      F:'few{ymhen # mis}many{ymhen # mis}one{ymhen mis}other{ymhen # mis}two{ymhen deufis}zero{ymhen # mis}',\n    },\n    NARROW:{\n      R:{'-1':'mis diwethaf','0':'y mis hwn','1':'mis nesaf'},\n      P:'few{# mis yn ôl}many{# mis yn ôl}one{# mis yn ôl}other{# mis yn ôl}two{# fis yn ôl}zero{# mis yn ôl}',\n      F:'few{ymhen # mis}many{ymhen # mis}one{ymhen mis}other{ymhen # mis}two{ymhen deufis}zero{ymhen # mis}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'chwarter olaf','0':'chwarter hwn','1':'chwarter nesaf'},\n      P:'few{# chwarter yn ôl}many{# chwarter yn ôl}one{# chwarter yn ôl}other{# o chwarteri yn ôl}two{# chwarter yn ôl}zero{# o chwarteri yn ôl}',\n      F:'few{ymhen # chwarter}many{ymhen # chwarter}one{ymhen # chwarter}other{ymhen # chwarter}two{ymhen # chwarter}zero{ymhen # chwarter}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'nawr'},\n      P:'few{# eiliad yn ôl}many{# eiliad yn ôl}one{# eiliad yn ôl}other{# eiliad yn ôl}two{# eiliad yn ôl}zero{# eiliad yn ôl}',\n      F:'few{ymhen # eiliad}many{ymhen # eiliad}one{ymhen # eiliad}other{ymhen # eiliad}two{ymhen # eiliad}zero{ymhen # eiliad}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'wythnos ddiwethaf','0':'yr wythnos hon','1':'wythnos nesaf'},\n      P:'few{# wythnos yn ôl}many{# wythnos yn ôl}one{# wythnos yn ôl}other{# wythnos yn ôl}two{# wythnos yn ôl}zero{# wythnos yn ôl}',\n      F:'few{ymhen # wythnos}many{ymhen # wythnos}one{ymhen wythnos}other{ymhen # wythnos}two{ymhen pythefnos}zero{ymhen # wythnos}',\n    },\n    SHORT:{\n      R:{'-1':'wythnos ddiwethaf','0':'yr wythnos hon','1':'wythnos nesaf'},\n      P:'few{# wythnos yn ôl}many{# wythnos yn ôl}one{# wythnos yn ôl}other{# wythnos yn ôl}two{pythefnos yn ôl}zero{# wythnos yn ôl}',\n      F:'few{ymhen # wythnos}many{ymhen # wythnos}one{ymhen wythnos}other{ymhen # wythnos}two{ymhen pythefnos}zero{ymhen # wythnos}',\n    },\n    NARROW:{\n      R:{'-1':'wythnos ddiwethaf','0':'yr wythnos hon','1':'wythnos nesaf'},\n      P:'few{# wythnos yn ôl}many{# wythnos yn ôl}one{# wythnos yn ôl}other{# wythnos yn ôl}two{pythefnos yn ôl}zero{# wythnos yn ôl}',\n      F:'few{ymhen # wythnos}many{ymhen # wythnos}one{ymhen # wythnos}other{ymhen # wythnos}two{ymhen # wythnos}zero{ymhen # wythnos}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'llynedd','0':'eleni','1':'blwyddyn nesaf'},\n      P:'few{# blynedd yn ôl}many{# blynedd yn ôl}one{blwyddyn yn ôl}other{# o flynyddoedd yn ôl}two{# flynedd yn ôl}zero{# o flynyddoedd yn ôl}',\n      F:'few{ymhen # blynedd}many{ymhen # blynedd}one{ymhen blwyddyn}other{ymhen # mlynedd}two{ymhen # flynedd}zero{ymhen # mlynedd}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_da =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'i går','-2':'i forgårs','0':'i dag','1':'i morgen','2':'i overmorgen'},\n      P:'one{for # dag siden}other{for # dage siden}',\n      F:'one{om # dag}other{om # dage}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'i den kommende time'},\n      P:'one{for # time siden}other{for # timer siden}',\n      F:'one{om # time}other{om # timer}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'i det kommende minut'},\n      P:'one{for # minut siden}other{for # minutter siden}',\n      F:'one{om # minut}other{om # minutter}',\n    },\n    SHORT:{\n      R:{'0':'i det kommende minut'},\n      P:'one{for # min. siden}other{for # min. siden}',\n      F:'one{om # min.}other{om # min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'sidste måned','0':'denne måned','1':'næste måned'},\n      P:'one{for # måned siden}other{for # måneder siden}',\n      F:'one{om # måned}other{om # måneder}',\n    },\n    SHORT:{\n      R:{'-1':'sidste md.','0':'denne md.','1':'næste md.'},\n      P:'one{for # md. siden}other{for # mdr. siden}',\n      F:'one{om # md.}other{om # mdr.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'sidste kvartal','0':'dette kvartal','1':'næste kvartal'},\n      P:'one{for # kvartal siden}other{for # kvartaler siden}',\n      F:'one{om # kvartal}other{om # kvartaler}',\n    },\n    SHORT:{\n      R:{'-1':'sidste kvt.','0':'dette kvt.','1':'næste kvt.'},\n      P:'one{for # kvt. siden}other{for # kvt. siden}',\n      F:'one{om # kvt.}other{om # kvt.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'nu'},\n      P:'one{for # sekund siden}other{for # sekunder siden}',\n      F:'one{om # sekund}other{om # sekunder}',\n    },\n    SHORT:{\n      R:{'0':'nu'},\n      P:'one{for # sek. siden}other{for # sek. siden}',\n      F:'one{om # sek.}other{om # sek.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'sidste uge','0':'denne uge','1':'næste uge'},\n      P:'one{for # uge siden}other{for # uger siden}',\n      F:'one{om # uge}other{om # uger}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'sidste år','0':'i år','1':'næste år'},\n      P:'one{for # år siden}other{for # år siden}',\n      F:'one{om # år}other{om # år}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_de =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'gestern','-2':'vorgestern','0':'heute','1':'morgen','2':'übermorgen'},\n      P:'one{vor # Tag}other{vor # Tagen}',\n      F:'one{in # Tag}other{in # Tagen}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'in dieser Stunde'},\n      P:'one{vor # Stunde}other{vor # Stunden}',\n      F:'one{in # Stunde}other{in # Stunden}',\n    },\n    SHORT:{\n      R:{'0':'in dieser Stunde'},\n      P:'one{vor # Std.}other{vor # Std.}',\n      F:'one{in # Std.}other{in # Std.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'in dieser Minute'},\n      P:'one{vor # Minute}other{vor # Minuten}',\n      F:'one{in # Minute}other{in # Minuten}',\n    },\n    SHORT:{\n      R:{'0':'in dieser Minute'},\n      P:'one{vor # Min.}other{vor # Min.}',\n      F:'one{in # Min.}other{in # Min.}',\n    },\n    NARROW:{\n      R:{'0':'in dieser Minute'},\n      P:'one{vor # m}other{vor # m}',\n      F:'one{in # m}other{in # m}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'letzten Monat','0':'diesen Monat','1':'nächsten Monat'},\n      P:'one{vor # Monat}other{vor # Monaten}',\n      F:'one{in # Monat}other{in # Monaten}',\n    },\n    SHORT:{\n      R:{'-1':'letzten Monat','0':'diesen Monat','1':'nächsten Monat'},\n      P:'one{vor # Monat}other{vor # Monaten}',\n      F:'one{in # Monat}other{in # Monaten}',\n    },\n    NARROW:{\n      R:{'-1':'letzten Monat','0':'diesen Monat','1':'nächsten Monat'},\n      P:'one{vor # Monat}other{vor # Monaten}',\n      F:'one{in # Monat}other{in # Monaten}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'letztes Quartal','0':'dieses Quartal','1':'nächstes Quartal'},\n      P:'one{vor # Quartal}other{vor # Quartalen}',\n      F:'one{in # Quartal}other{in # Quartalen}',\n    },\n    SHORT:{\n      R:{'-1':'letztes Quartal','0':'dieses Quartal','1':'nächstes Quartal'},\n      P:'one{vor # Quart.}other{vor # Quart.}',\n      F:'one{in # Quart.}other{in # Quart.}',\n    },\n    NARROW:{\n      R:{'-1':'letztes Quartal','0':'dieses Quartal','1':'nächstes Quartal'},\n      P:'one{vor # Q}other{vor # Q}',\n      F:'one{in # Q}other{in # Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'jetzt'},\n      P:'one{vor # Sekunde}other{vor # Sekunden}',\n      F:'one{in # Sekunde}other{in # Sekunden}',\n    },\n    SHORT:{\n      R:{'0':'jetzt'},\n      P:'one{vor # Sek.}other{vor # Sek.}',\n      F:'one{in # Sek.}other{in # Sek.}',\n    },\n    NARROW:{\n      R:{'0':'jetzt'},\n      P:'one{vor # s}other{vor # s}',\n      F:'one{in # s}other{in # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'letzte Woche','0':'diese Woche','1':'nächste Woche'},\n      P:'one{vor # Woche}other{vor # Wochen}',\n      F:'one{in # Woche}other{in # Wochen}',\n    },\n    NARROW:{\n      R:{'-1':'letzte Woche','0':'diese Woche','1':'nächste Woche'},\n      P:'one{vor # Wo.}other{vor # Wo.}',\n      F:'one{in # Wo.}other{in # Wo.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'letztes Jahr','0':'dieses Jahr','1':'nächstes Jahr'},\n      P:'one{vor # Jahr}other{vor # Jahren}',\n      F:'one{in # Jahr}other{in # Jahren}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_de_AT = exports.RelativeDateTimeSymbols_de;\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_de_CH =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'gestern','-2':'vorgestern','0':'heute','1':'morgen','2':'übermorgen'},\n      P:'one{vor # Tag}other{vor # Tagen}',\n      F:'one{in # Tag}other{in # Tagen}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'in dieser Stunde'},\n      P:'one{vor # Stunde}other{vor # Stunden}',\n      F:'one{in # Stunde}other{in # Stunden}',\n    },\n    SHORT:{\n      R:{'0':'in dieser Stunde'},\n      P:'one{vor # Std.}other{vor # Std.}',\n      F:'one{in # Std.}other{in # Std.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'in dieser Minute'},\n      P:'one{vor # Minute}other{vor # Minuten}',\n      F:'one{in # Minute}other{in # Minuten}',\n    },\n    SHORT:{\n      R:{'0':'in dieser Minute'},\n      P:'one{vor # Min.}other{vor # Min.}',\n      F:'one{in # Min.}other{in # Min.}',\n    },\n    NARROW:{\n      R:{'0':'in dieser Minute'},\n      P:'one{vor # m}other{vor # m}',\n      F:'one{in # m}other{in # m}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'letzten Monat','0':'diesen Monat','1':'nächsten Monat'},\n      P:'one{vor # Monat}other{vor # Monaten}',\n      F:'one{in # Monat}other{in # Monaten}',\n    },\n    SHORT:{\n      R:{'-1':'letzten Monat','0':'diesen Monat','1':'nächsten Monat'},\n      P:'one{vor # Monat}other{vor # Monaten}',\n      F:'one{in # Monat}other{in # Monaten}',\n    },\n    NARROW:{\n      R:{'-1':'letzten Monat','0':'diesen Monat','1':'nächsten Monat'},\n      P:'one{vor # Monat}other{vor # Monaten}',\n      F:'one{in # Monat}other{in # Monaten}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'letztes Quartal','0':'dieses Quartal'},\n      P:'one{vor # Quartal}other{vor # Quartalen}',\n      F:'one{in # Quartal}other{in # Quartalen}',\n    },\n    SHORT:{\n      R:{'-1':'letztes Quartal','0':'dieses Quartal'},\n      P:'one{vor # Quart.}other{vor # Quart.}',\n      F:'one{in # Quart.}other{in # Quart.}',\n    },\n    NARROW:{\n      R:{'-1':'letztes Quartal','0':'dieses Quartal'},\n      P:'one{vor # Q}other{vor # Q}',\n      F:'one{in # Q}other{in # Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'jetzt'},\n      P:'one{vor # Sekunde}other{vor # Sekunden}',\n      F:'one{in # Sekunde}other{in # Sekunden}',\n    },\n    SHORT:{\n      R:{'0':'jetzt'},\n      P:'one{vor # Sek.}other{vor # Sek.}',\n      F:'one{in # Sek.}other{in # Sek.}',\n    },\n    NARROW:{\n      R:{'0':'jetzt'},\n      P:'one{vor # s}other{vor # s}',\n      F:'one{in # s}other{in # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'letzte Woche','0':'diese Woche','1':'nächste Woche'},\n      P:'one{vor # Woche}other{vor # Wochen}',\n      F:'one{in # Woche}other{in # Wochen}',\n    },\n    NARROW:{\n      R:{'-1':'letzte Woche','0':'diese Woche','1':'nächste Woche'},\n      P:'one{vor # Wo.}other{vor # Wo.}',\n      F:'one{in # Wo.}other{in # Wo.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'letztes Jahr','0':'dieses Jahr','1':'nächstes Jahr'},\n      P:'one{vor # Jahr}other{vor # Jahren}',\n      F:'one{in # Jahr}other{in # Jahren}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_el =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'χθες','-2':'προχθές','0':'σήμερα','1':'αύριο','2':'μεθαύριο'},\n      P:'one{πριν από # ημέρα}other{πριν από # ημέρες}',\n      F:'one{σε # ημέρα}other{σε # ημέρες}',\n    },\n    SHORT:{\n      R:{'-1':'χθες','0':'σήμερα','1':'αύριο'},\n      P:'one{πριν από # ημ.}other{πριν από # ημ.}',\n      F:'one{σε # ημ.}other{σε # ημ.}',\n    },\n    NARROW:{\n      R:{'-1':'χθες','0':'σήμερα','1':'αύριο'},\n      P:'one{# ημ. πριν}other{# ημ. πριν}',\n      F:'one{σε # ημ.}other{σε # ημ.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'τρέχουσα ώρα'},\n      P:'one{πριν από # ώρα}other{πριν από # ώρες}',\n      F:'one{σε # ώρα}other{σε # ώρες}',\n    },\n    SHORT:{\n      R:{'0':'τρέχουσα ώρα'},\n      P:'one{πριν από # ώ.}other{πριν από # ώ.}',\n      F:'one{σε # ώ.}other{σε # ώ.}',\n    },\n    NARROW:{\n      R:{'0':'τρέχουσα ώρα'},\n      P:'one{# ώ. πριν}other{# ώ. πριν}',\n      F:'one{σε # ώ.}other{σε # ώ.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'τρέχον λεπτό'},\n      P:'one{πριν από # λεπτό}other{πριν από # λεπτά}',\n      F:'one{σε # λεπτό}other{σε # λεπτά}',\n    },\n    SHORT:{\n      R:{'0':'τρέχον λεπτό'},\n      P:'one{πριν από # λεπ.}other{πριν από # λεπ.}',\n      F:'one{σε # λεπ.}other{σε # λεπ.}',\n    },\n    NARROW:{\n      R:{'0':'τρέχον λεπτό'},\n      P:'one{# λ. πριν}other{# λ. πριν}',\n      F:'one{σε # λ.}other{σε # λ.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'προηγούμενος μήνας','0':'τρέχων μήνας','1':'επόμενος μήνας'},\n      P:'one{πριν από # μήνα}other{πριν από # μήνες}',\n      F:'one{σε # μήνα}other{σε # μήνες}',\n    },\n    NARROW:{\n      R:{'-1':'προηγούμενος μήνας','0':'τρέχων μήνας','1':'επόμενος μήνας'},\n      P:'one{# μ. πριν}other{# μ. πριν}',\n      F:'one{σε # μ.}other{σε # μ.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'προηγούμενο τρίμηνο','0':'τρέχον τρίμηνο','1':'επόμενο τρίμηνο'},\n      P:'one{πριν από # τρίμηνο}other{πριν από # τρίμηνα}',\n      F:'one{σε # τρίμηνο}other{σε # τρίμηνα}',\n    },\n    SHORT:{\n      R:{'-1':'προηγ. τρίμ.','0':'τρέχον τρίμ.','1':'επόμ. τρίμ.'},\n      P:'one{πριν από # τρίμ.}other{πριν από # τρίμ.}',\n      F:'one{σε # τρίμ.}other{σε # τρίμ.}',\n    },\n    NARROW:{\n      R:{'-1':'προηγ. τρίμ.','0':'τρέχον τρίμ.','1':'επόμ. τρίμ.'},\n      P:'one{# τρίμ. πριν}other{# τρίμ. πριν}',\n      F:'one{σε # τρίμ.}other{σε # τρίμ.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'τώρα'},\n      P:'one{πριν από # δευτερόλεπτο}other{πριν από # δευτερόλεπτα}',\n      F:'one{σε # δευτερόλεπτο}other{σε # δευτερόλεπτα}',\n    },\n    SHORT:{\n      R:{'0':'τώρα'},\n      P:'one{πριν από # δευτ.}other{πριν από # δευτ.}',\n      F:'one{σε # δευτ.}other{σε # δευτ.}',\n    },\n    NARROW:{\n      R:{'0':'τώρα'},\n      P:'one{# δ. πριν}other{# δ. πριν}',\n      F:'one{σε # δ.}other{σε # δ.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'προηγούμενη εβδομάδα','0':'τρέχουσα εβδομάδα','1':'επόμενη εβδομάδα'},\n      P:'one{πριν από # εβδομάδα}other{πριν από # εβδομάδες}',\n      F:'one{σε # εβδομάδα}other{σε # εβδομάδες}',\n    },\n    SHORT:{\n      R:{'-1':'προηγούμενη εβδομάδα','0':'τρέχουσα εβδομάδα','1':'επόμενη εβδομάδα'},\n      P:'one{πριν από # εβδ.}other{πριν από # εβδ.}',\n      F:'one{σε # εβδ.}other{σε # εβδ.}',\n    },\n    NARROW:{\n      R:{'-1':'προηγούμενη εβδομάδα','0':'τρέχουσα εβδομάδα','1':'επόμενη εβδομάδα'},\n      P:'one{# εβδ. πριν}other{# εβδ. πριν}',\n      F:'one{σε # εβδ.}other{σε # εβδ.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'πέρσι','0':'φέτος','1':'επόμενο έτος'},\n      P:'one{πριν από # έτος}other{πριν από # έτη}',\n      F:'one{σε # έτος}other{σε # έτη}',\n    },\n    NARROW:{\n      R:{'-1':'πέρσι','0':'φέτος','1':'επόμενο έτος'},\n      P:'one{# έτος πριν}other{# έτη πριν}',\n      F:'one{σε # έτος}other{σε # έτη}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr. ago}other{# hr. ago}',\n      F:'one{in # hr.}other{in # hr.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min. ago}other{# min. ago}',\n      F:'one{in # min.}other{in # min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo. ago}other{# mo. ago}',\n      F:'one{in # mo.}other{in # mo.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr. ago}other{# qtrs. ago}',\n      F:'one{in # qtr.}other{in # qtrs.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec. ago}other{# sec. ago}',\n      F:'one{in # sec.}other{in # sec.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk. ago}other{# wk. ago}',\n      F:'one{in # wk.}other{in # wk.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr. ago}other{# yr. ago}',\n      F:'one{in # yr.}other{in # yr.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_AU =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n    NARROW:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'other{# hrs ago}',\n      F:'other{in # hrs}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min. ago}other{# mins ago}',\n      F:'one{in # min.}other{in # mins}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo. ago}other{# mo. ago}',\n      F:'one{in # mo.}other{in # mo.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtrs ago}',\n      F:'other{in # qtrs}',\n    },\n    NARROW:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{in # qtr ago}other{# qtrs ago}',\n      F:'other{in # qtrs}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec. ago}other{# secs ago}',\n      F:'one{in # sec.}other{in # secs}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'other{# wks ago}',\n      F:'other{in # wks}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'other{# yrs ago}',\n      F:'other{in # yrs}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_CA =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr. ago}other{# hrs. ago}',\n      F:'one{in # hr.}other{in # hrs.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min. ago}other{# mins. ago}',\n      F:'one{in # min.}other{in # mins.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo. ago}other{# mos. ago}',\n      F:'one{in # mo.}other{in # mos.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr. ago}other{# qtrs. ago}',\n      F:'one{in # qtr.}other{in # qtrs.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec. ago}other{# secs. ago}',\n      F:'one{in # sec.}other{in # secs.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk. ago}other{# wks. ago}',\n      F:'one{in # wk.}other{in # wks.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr. ago}other{# yrs. ago}',\n      F:'one{in # yr.}other{in # yrs.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_GB =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n    SHORT:{\n      R:{'-1':'yesterday'},\n      P:'other{# days ago}',\n      F:'other{in # days}',\n    },\n    NARROW:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{# days ago}',\n      F:'other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_IE =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_IN =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_SG =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mth','0':'this mth','1':'next mth'},\n      P:'one{# mth ago}other{# mth ago}',\n      F:'one{in # mth}other{in # mth}',\n    },\n    NARROW:{\n      R:{'-1':'last mth','0':'this mth','1':'next mth'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr','0':'this qtr','1':'next qtr'},\n      P:'one{# qtr ago}other{# qtrs ago}',\n      F:'one{in # qtr}other{in # qtrs}',\n    },\n    NARROW:{\n      R:{'-1':'last qtr','0':'this qtr','1':'next qtr'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk','0':'this wk','1':'next wk'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr','0':'this yr','1':'next yr'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_US = exports.RelativeDateTimeSymbols_en;\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_en_ZA =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'one{# day ago}other{# days ago}',\n      F:'one{in # day}other{in # days}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'one{# hour ago}other{# hours ago}',\n      F:'one{in # hour}other{in # hours}',\n    },\n    SHORT:{\n      R:{'0':'this hour'},\n      P:'one{# hr ago}other{# hr ago}',\n      F:'one{in # hr}other{in # hr}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'one{# minute ago}other{# minutes ago}',\n      F:'one{in # minute}other{in # minutes}',\n    },\n    SHORT:{\n      R:{'0':'this minute'},\n      P:'one{# min ago}other{# min ago}',\n      F:'one{in # min}other{in # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'one{# month ago}other{# months ago}',\n      F:'one{in # month}other{in # months}',\n    },\n    SHORT:{\n      R:{'-1':'last mo.','0':'this mo.','1':'next mo.'},\n      P:'one{# mo ago}other{# mo ago}',\n      F:'one{in # mo}other{in # mo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'one{# quarter ago}other{# quarters ago}',\n      F:'one{in # quarter}other{in # quarters}',\n    },\n    SHORT:{\n      R:{'-1':'last qtr.','0':'this qtr.','1':'next qtr.'},\n      P:'one{# qtr ago}other{# qtr ago}',\n      F:'one{in # qtr}other{in # qtr}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'one{# second ago}other{# seconds ago}',\n      F:'one{in # second}other{in # seconds}',\n    },\n    SHORT:{\n      R:{'0':'now'},\n      P:'one{# sec ago}other{# sec ago}',\n      F:'one{in # sec}other{in # sec}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'one{# week ago}other{# weeks ago}',\n      F:'one{in # week}other{in # weeks}',\n    },\n    SHORT:{\n      R:{'-1':'last wk.','0':'this wk.','1':'next wk.'},\n      P:'one{# wk ago}other{# wk ago}',\n      F:'one{in # wk}other{in # wk}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'one{# year ago}other{# years ago}',\n      F:'one{in # year}other{in # years}',\n    },\n    SHORT:{\n      R:{'-1':'last yr.','0':'this yr.','1':'next yr.'},\n      P:'one{# yr ago}other{# yr ago}',\n      F:'one{in # yr}other{in # yr}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana','1':'la próxima semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana','1':'la próxima semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_419 =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_ES = exports.RelativeDateTimeSymbols_es;\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_MX =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{en # día}other{en # días}',\n    },\n    NARROW:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{+# día}other{+# días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{en # h}other{en # n}',\n    },\n    NARROW:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{en # min}other{en # min}',\n    },\n    NARROW:{\n      R:{'0':'este minuto'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el mes próximo'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{en # mes}other{en # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{en # m}other{en # m}',\n    },\n    NARROW:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{-# m}other{-# m}',\n      F:'one{+# m}other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimetre}other{dentro de # trimetres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{en # trim.}other{en # trim}',\n    },\n    NARROW:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{-# T}other{-# T}',\n      F:'one{+# T}other{+# T}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{en # s}other{en # s}',\n    },\n    NARROW:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semana pasada','0':'esta semana','1':'la semana próxima'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'la semana pasada','0':'esta semana','1':'la semana próxima'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{en # sem.}other{en # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semana pasada','0':'esta semana','1':'la semana próxima'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'el año pasado','0':'este año','1':'el año próximo'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{en # a}other{en # a}',\n    },\n    NARROW:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{-# a}other{-# a}',\n      F:'one{en # a}other{en # a}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_es_US =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n    SHORT:{\n      R:{'-1':'ayer','-2':'anteayer','0':'hoy','1':'mañana','2':'pasado mañana'},\n      P:'one{hace # día}other{hace # días}',\n      F:'one{dentro de # día}other{dentro de # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hace # hora}other{hace # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hace # h}other{hace # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hace # minuto}other{hace # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hace # min}other{hace # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'1':'el mes próximo'},\n      P:'one{hace # mes}other{hace # meses}',\n      F:'one{dentro de # mes}other{dentro de # meses}',\n    },\n    SHORT:{\n      R:{'-1':'el mes pasado','0':'este mes','1':'el próximo mes'},\n      P:'one{hace # m}other{hace # m}',\n      F:'one{dentro de # m}other{dentro de # m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trimestre}other{hace # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'el trimestre pasado','0':'este trimestre','1':'el próximo trimestre'},\n      P:'one{hace # trim.}other{hace # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ahora'},\n      P:'one{hace # segundo}other{hace # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'ahora'},\n      P:'one{hace # s}other{hace # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'1':'la semana próxima'},\n      P:'one{hace # semana}other{hace # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'1':'la semana próxima'},\n      P:'one{hace # sem.}other{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'1':'la semana próxima'},\n      P:'one{hace # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'1':'el año próximo'},\n      P:'one{hace # año}other{hace # años}',\n      F:'one{dentro de # año}other{dentro de # años}',\n    },\n    SHORT:{\n      R:{'-1':'el año pasado','0':'este año','1':'el próximo año'},\n      P:'one{hace # a}other{hace # a}',\n      F:'one{dentro de # a}other{dentro de # a}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_et =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'eile','-2':'üleeile','0':'täna','1':'homme','2':'ülehomme'},\n      P:'one{# päeva eest}other{# päeva eest}',\n      F:'one{# päeva pärast}other{# päeva pärast}',\n    },\n    SHORT:{\n      R:{'-1':'eile','-2':'üleeile','0':'täna','1':'homme','2':'ülehomme'},\n      P:'one{# p eest}other{# p eest}',\n      F:'one{# p pärast}other{# p pärast}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'praegusel tunnil'},\n      P:'one{# tunni eest}other{# tunni eest}',\n      F:'one{# tunni pärast}other{# tunni pärast}',\n    },\n    SHORT:{\n      R:{'0':'praegusel tunnil'},\n      P:'one{# t eest}other{# t eest}',\n      F:'one{# t pärast}other{# t pärast}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'praegusel minutil'},\n      P:'one{# minuti eest}other{# minuti eest}',\n      F:'one{# minuti pärast}other{# minuti pärast}',\n    },\n    SHORT:{\n      R:{'0':'praegusel minutil'},\n      P:'one{# min eest}other{# min eest}',\n      F:'one{# min pärast}other{# min pärast}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'eelmine kuu','0':'käesolev kuu','1':'järgmine kuu'},\n      P:'one{# kuu eest}other{# kuu eest}',\n      F:'one{# kuu pärast}other{# kuu pärast}',\n    },\n    NARROW:{\n      R:{'-1':'eelmine kuu','0':'käesolev kuu','1':'järgmine kuu'},\n      P:'one{# k eest}other{# k eest}',\n      F:'one{# k pärast}other{# k pärast}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'eelmine kvartal','0':'käesolev kvartal','1':'järgmine kvartal'},\n      P:'one{# kvartali eest}other{# kvartali eest}',\n      F:'one{# kvartali pärast}other{# kvartali pärast}',\n    },\n    SHORT:{\n      R:{'-1':'eelmine kv','0':'käesolev kv','1':'järgmine kv'},\n      P:'one{# kv eest}other{# kv eest}',\n      F:'one{# kv pärast}other{# kv pärast}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'nüüd'},\n      P:'one{# sekundi eest}other{# sekundi eest}',\n      F:'one{# sekundi pärast}other{# sekundi pärast}',\n    },\n    SHORT:{\n      R:{'0':'nüüd'},\n      P:'one{# sek eest}other{# sek eest}',\n      F:'one{# sek pärast}other{# sek pärast}',\n    },\n    NARROW:{\n      R:{'0':'nüüd'},\n      P:'one{# s eest}other{# s eest}',\n      F:'one{# s pärast}other{# s pärast}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'eelmine nädal','0':'käesolev nädal','1':'järgmine nädal'},\n      P:'one{# nädala eest}other{# nädala eest}',\n      F:'one{# nädala pärast}other{# nädala pärast}',\n    },\n    SHORT:{\n      R:{'-1':'eelmine nädal','0':'käesolev nädal','1':'järgmine nädal'},\n      P:'one{# näd eest}other{# näd eest}',\n      F:'one{# näd pärast}other{# näd pärast}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'eelmine aasta','0':'käesolev aasta','1':'järgmine aasta'},\n      P:'one{# aasta eest}other{# aasta eest}',\n      F:'one{# aasta pärast}other{# aasta pärast}',\n    },\n    SHORT:{\n      R:{'-1':'eelmine aasta','0':'käesolev aasta','1':'järgmine aasta'},\n      P:'one{# a eest}other{# a eest}',\n      F:'one{# a pärast}other{# a pärast}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_eu =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'atzo','-2':'herenegun','0':'gaur','1':'bihar','2':'etzi'},\n      P:'one{Duela # egun}other{Duela # egun}',\n      F:'one{# egun barru}other{# egun barru}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ordu honetan'},\n      P:'one{Duela # ordu}other{Duela # ordu}',\n      F:'one{# ordu barru}other{# ordu barru}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'minutu honetan'},\n      P:'one{Duela # minutu}other{Duela # minutu}',\n      F:'one{# minutu barru}other{# minutu barru}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'aurreko hilabetean','0':'hilabete honetan','1':'hurrengo hilabetean'},\n      P:'one{Duela # hilabete}other{Duela # hilabete}',\n      F:'one{# hilabete barru}other{# hilabete barru}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'aurreko hiruhilekoa','0':'hiruhileko hau','1':'hurrengo hiruhilekoa'},\n      P:'one{Duela # hiruhileko}other{Duela # hiruhileko}',\n      F:'one{# hiruhileko barru}other{# hiruhileko barru}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'orain'},\n      P:'one{Duela # segundo}other{Duela # segundo}',\n      F:'one{# segundo barru}other{# segundo barru}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'aurreko astean','0':'aste honetan','1':'hurrengo astean'},\n      P:'one{Duela # aste}other{Duela # aste}',\n      F:'one{# aste barru}other{# aste barru}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'iaz','0':'aurten','1':'hurrengo urtean'},\n      P:'one{Duela # urte}other{Duela # urte}',\n      F:'one{# urte barru}other{# urte barru}',\n    },\n    SHORT:{\n      R:{'-1':'aurreko urtea','0':'aurten','1':'hurrengo urtea'},\n      P:'one{Duela # urte}other{Duela # urte}',\n      F:'one{# urte barru}other{# urte barru}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fa =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'دیروز','-2':'پریروز','0':'امروز','1':'فردا','2':'پس‌فردا'},\n      P:'one{# روز پیش}other{# روز پیش}',\n      F:'one{# روز بعد}other{# روز بعد}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'همین ساعت'},\n      P:'one{# ساعت پیش}other{# ساعت پیش}',\n      F:'one{# ساعت بعد}other{# ساعت بعد}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'همین دقیقه'},\n      P:'one{# دقیقه پیش}other{# دقیقه پیش}',\n      F:'one{# دقیقه بعد}other{# دقیقه بعد}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ماه گذشته','0':'این ماه','1':'ماه آینده'},\n      P:'one{# ماه پیش}other{# ماه پیش}',\n      F:'one{# ماه بعد}other{# ماه بعد}',\n    },\n    SHORT:{\n      R:{'-1':'ماه پیش','0':'این ماه','1':'ماه آینده'},\n      P:'one{# ماه پیش}other{# ماه پیش}',\n      F:'one{# ماه بعد}other{# ماه بعد}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'سه‌ماههٔ گذشته','0':'سه‌ماههٔ کنونی','1':'سه‌ماههٔ آینده'},\n      P:'one{# سه‌ماههٔ پیش}other{# سه‌ماههٔ پیش}',\n      F:'one{# سه‌ماههٔ بعد}other{# سه‌ماههٔ بعد}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'اکنون'},\n      P:'one{# ثانیه پیش}other{# ثانیه پیش}',\n      F:'one{# ثانیه بعد}other{# ثانیه بعد}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'هفتهٔ گذشته','0':'این هفته','1':'هفتهٔ آینده'},\n      P:'one{# هفته پیش}other{# هفته پیش}',\n      F:'one{# هفته بعد}other{# هفته بعد}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'سال گذشته','0':'امسال','1':'سال آینده'},\n      P:'one{# سال پیش}other{# سال پیش}',\n      F:'one{# سال بعد}other{# سال بعد}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fi =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'eilen','-2':'toissa päivänä','0':'tänään','1':'huomenna','2':'ylihuomenna'},\n      P:'one{# päivä sitten}other{# päivää sitten}',\n      F:'one{# päivän päästä}other{# päivän päästä}',\n    },\n    SHORT:{\n      R:{'-1':'eilen','-2':'toissap.','0':'tänään','1':'huom.','2':'ylihuom.'},\n      P:'one{# pv sitten}other{# pv sitten}',\n      F:'one{# pv päästä}other{# pv päästä}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'tämän tunnin aikana'},\n      P:'one{# tunti sitten}other{# tuntia sitten}',\n      F:'one{# tunnin päästä}other{# tunnin päästä}',\n    },\n    SHORT:{\n      R:{'0':'tunnin sisällä'},\n      P:'one{# t sitten}other{# t sitten}',\n      F:'one{# t päästä}other{# t päästä}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'tämän minuutin aikana'},\n      P:'one{# minuutti sitten}other{# minuuttia sitten}',\n      F:'one{# minuutin päästä}other{# minuutin päästä}',\n    },\n    SHORT:{\n      R:{'0':'minuutin sisällä'},\n      P:'one{# min sitten}other{# min sitten}',\n      F:'one{# min päästä}other{# min päästä}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'viime kuussa','0':'tässä kuussa','1':'ensi kuussa'},\n      P:'one{# kuukausi sitten}other{# kuukautta sitten}',\n      F:'one{# kuukauden päästä}other{# kuukauden päästä}',\n    },\n    SHORT:{\n      R:{'-1':'viime kk','0':'tässä kk','1':'ensi kk'},\n      P:'one{# kk sitten}other{# kk sitten}',\n      F:'one{# kk päästä}other{# kk päästä}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'viime neljännesvuonna','0':'tänä neljännesvuonna','1':'ensi neljännesvuonna'},\n      P:'one{# neljännesvuosi sitten}other{# neljännesvuotta sitten}',\n      F:'one{# neljännesvuoden päästä}other{# neljännesvuoden päästä}',\n    },\n    SHORT:{\n      R:{'-1':'viime neljänneksenä','0':'tänä neljänneksenä','1':'ensi neljänneksenä'},\n      P:'one{# neljännes sitten}other{# neljännestä sitten}',\n      F:'one{# neljänneksen päästä}other{# neljänneksen päästä}',\n    },\n    NARROW:{\n      R:{'-1':'viime nelj.','0':'tänä nelj.','1':'ensi nelj.'},\n      P:'one{# nelj. sitten}other{# nelj. sitten}',\n      F:'one{# nelj. päästä}other{# nelj. päästä}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'nyt'},\n      P:'one{# sekunti sitten}other{# sekuntia sitten}',\n      F:'one{# sekunnin päästä}other{# sekunnin päästä}',\n    },\n    SHORT:{\n      R:{'0':'nyt'},\n      P:'one{# s sitten}other{# s sitten}',\n      F:'one{# s päästä}other{# s päästä}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'viime viikolla','0':'tällä viikolla','1':'ensi viikolla'},\n      P:'one{# viikko sitten}other{# viikkoa sitten}',\n      F:'one{# viikon päästä}other{# viikon päästä}',\n    },\n    SHORT:{\n      R:{'-1':'viime vk','0':'tällä vk','1':'ensi vk'},\n      P:'one{# vk sitten}other{# vk sitten}',\n      F:'one{# vk päästä}other{# vk päästä}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'viime vuonna','0':'tänä vuonna','1':'ensi vuonna'},\n      P:'one{# vuosi sitten}other{# vuotta sitten}',\n      F:'one{# vuoden päästä}other{# vuoden päästä}',\n    },\n    SHORT:{\n      R:{'-1':'viime v','0':'tänä v','1':'ensi v'},\n      P:'one{# v sitten}other{# v sitten}',\n      F:'one{# v päästä}other{# v päästä}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fil =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'kahapon','-2':'Araw bago ang kahapon','0':'ngayong araw','1':'bukas','2':'Samakalawa'},\n      P:'one{# araw ang nakalipas}other{# (na) araw ang nakalipas}',\n      F:'one{sa # araw}other{sa # (na) araw}',\n    },\n    SHORT:{\n      R:{'-1':'kahapon','-2':'Araw bago ang kahapon','0':'ngayong araw','1':'bukas','2':'Samakalawa'},\n      P:'one{# (na) araw ang nakalipas}other{# (na) araw ang nakalipas}',\n      F:'one{sa # (na) araw}other{sa # (na) araw}',\n    },\n    NARROW:{\n      R:{'-1':'kahapon','-2':'Araw bago ang kahapon','0':'ngayong araw','1':'bukas','2':'Samakalawa'},\n      P:'one{# araw ang nakalipas}other{# (na) araw ang nakalipas}',\n      F:'one{sa # araw}other{sa # (na) araw}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ngayong oras'},\n      P:'one{# oras ang nakalipas}other{# (na) oras ang nakalipas}',\n      F:'one{sa # oras}other{sa # (na) oras}',\n    },\n    NARROW:{\n      R:{'0':'ngayong oras'},\n      P:'one{# oras nakalipas}other{# (na) oras nakalipas}',\n      F:'one{sa # oras}other{sa # (na) oras}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'sa minutong ito'},\n      P:'one{# minuto ang nakalipas}other{# (na) minuto ang nakalipas}',\n      F:'one{sa # minuto}other{sa # (na) minuto}',\n    },\n    SHORT:{\n      R:{'0':'sa minutong ito'},\n      P:'one{# min. ang nakalipas}other{# (na) min. ang nakalipas}',\n      F:'one{sa # min.}other{sa # (na) min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'nakaraang buwan','0':'ngayong buwan','1':'susunod na buwan'},\n      P:'one{# buwan ang nakalipas}other{# (na) buwan ang nakalipas}',\n      F:'one{sa # buwan}other{sa # (na) buwan}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'nakaraang quarter','0':'ngayong quarter','1':'susunod na quarter'},\n      P:'one{# quarter ang nakalipas}other{# (na) quarter ang nakalipas}',\n      F:'one{sa # quarter}other{sa # (na) quarter}',\n    },\n    SHORT:{\n      R:{'-1':'nakaraang quarter','0':'ngayong quarter','1':'susunod na quarter'},\n      P:'one{# quarter ang nakalipas}other{# (na) quarter ang nakalipas}',\n      F:'one{sa # (na) quarter}other{sa # (na) quarter}',\n    },\n    NARROW:{\n      R:{'-1':'nakaraang quarter','0':'ngayong quarter','1':'susunod na quarter'},\n      P:'one{# quarter ang nakalipas}other{# (na) quarter ang nakalipas}',\n      F:'one{sa # quarter}other{sa # (na) quarter}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ngayon'},\n      P:'one{# segundo ang nakalipas}other{# (na) segundo ang nakalipas}',\n      F:'one{sa # segundo}other{sa # (na) segundo}',\n    },\n    SHORT:{\n      R:{'0':'ngayon'},\n      P:'one{# seg. ang nakalipas}other{# (na) seg. nakalipas}',\n      F:'one{sa # seg.}other{sa # (na) seg.}',\n    },\n    NARROW:{\n      R:{'0':'ngayon'},\n      P:'one{# seg. nakalipas}other{# (na) seg. nakalipas}',\n      F:'one{sa # seg.}other{sa # (na) seg.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'nakalipas na linggo','0':'sa linggong ito','1':'susunod na linggo'},\n      P:'one{# linggo ang nakalipas}other{# (na) linggo ang nakalipas}',\n      F:'one{sa # linggo}other{sa # (na) linggo}',\n    },\n    SHORT:{\n      R:{'-1':'nakaraang linggo','0':'ngayong linggo','1':'susunod na linggo'},\n      P:'one{# linggo ang nakalipas}other{# (na) linggo ang nakalipas}',\n      F:'one{sa # linggo}other{sa # (na) linggo}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'nakaraang taon','0':'ngayong taon','1':'susunod na taon'},\n      P:'one{# taon ang nakalipas}other{# (na) taon ang nakalipas}',\n      F:'one{sa # taon}other{sa # (na) taon}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'hier','-2':'avant-hier','0':'aujourd’hui','1':'demain','2':'après-demain'},\n      P:'one{il y a # jour}other{il y a # jours}',\n      F:'one{dans # jour}other{dans # jours}',\n    },\n    SHORT:{\n      R:{'-1':'hier','-2':'avant-hier','0':'aujourd’hui','1':'demain','2':'après-demain'},\n      P:'one{il y a # j}other{il y a # j}',\n      F:'one{dans # j}other{dans # j}',\n    },\n    NARROW:{\n      R:{'-1':'hier','-2':'avant-hier','0':'aujourd’hui','1':'demain','2':'après-demain'},\n      P:'one{-# j}other{-# j}',\n      F:'one{+# j}other{+# j}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'cette heure-ci'},\n      P:'one{il y a # heure}other{il y a # heures}',\n      F:'one{dans # heure}other{dans # heures}',\n    },\n    SHORT:{\n      R:{'0':'cette heure-ci'},\n      P:'one{il y a # h}other{il y a # h}',\n      F:'one{dans # h}other{dans # h}',\n    },\n    NARROW:{\n      R:{'0':'cette heure-ci'},\n      P:'one{-# h}other{-# h}',\n      F:'one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'cette minute-ci'},\n      P:'one{il y a # minute}other{il y a # minutes}',\n      F:'one{dans # minute}other{dans # minutes}',\n    },\n    SHORT:{\n      R:{'0':'cette minute-ci'},\n      P:'one{il y a # min}other{il y a # min}',\n      F:'one{dans # min}other{dans # min}',\n    },\n    NARROW:{\n      R:{'0':'cette minute-ci'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'le mois dernier','0':'ce mois-ci','1':'le mois prochain'},\n      P:'one{il y a # mois}other{il y a # mois}',\n      F:'one{dans # mois}other{dans # mois}',\n    },\n    SHORT:{\n      R:{'-1':'le mois dernier','0':'ce mois-ci','1':'le mois prochain'},\n      P:'one{il y a # m.}other{il y a # m.}',\n      F:'one{dans # m.}other{dans # m.}',\n    },\n    NARROW:{\n      R:{'-1':'le mois dernier','0':'ce mois-ci','1':'le mois prochain'},\n      P:'one{-# m.}other{-# m.}',\n      F:'one{+# m.}other{+# m.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'le trimestre dernier','0':'ce trimestre','1':'le trimestre prochain'},\n      P:'one{il y a # trimestre}other{il y a # trimestres}',\n      F:'one{dans # trimestre}other{dans # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'le trimestre dernier','0':'ce trimestre','1':'le trimestre prochain'},\n      P:'one{il y a # trim.}other{il y a # trim.}',\n      F:'one{dans # trim.}other{dans # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'le trimestre dernier','0':'ce trimestre','1':'le trimestre prochain'},\n      P:'one{-# trim.}other{-# trim.}',\n      F:'one{+# trim.}other{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'maintenant'},\n      P:'one{il y a # seconde}other{il y a # secondes}',\n      F:'one{dans # seconde}other{dans # secondes}',\n    },\n    SHORT:{\n      R:{'0':'maintenant'},\n      P:'one{il y a # s}other{il y a # s}',\n      F:'one{dans # s}other{dans # s}',\n    },\n    NARROW:{\n      R:{'0':'maintenant'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semaine dernière','0':'cette semaine','1':'la semaine prochaine'},\n      P:'one{il y a # semaine}other{il y a # semaines}',\n      F:'one{dans # semaine}other{dans # semaines}',\n    },\n    SHORT:{\n      R:{'-1':'la semaine dernière','0':'cette semaine','1':'la semaine prochaine'},\n      P:'one{il y a # sem.}other{il y a # sem.}',\n      F:'one{dans # sem.}other{dans # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semaine dernière','0':'cette semaine','1':'la semaine prochaine'},\n      P:'one{-# sem.}other{-# sem.}',\n      F:'one{+# sem.}other{+# sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'l’année dernière','0':'cette année','1':'l’année prochaine'},\n      P:'one{il y a # an}other{il y a # ans}',\n      F:'one{dans # an}other{dans # ans}',\n    },\n    SHORT:{\n      R:{'-1':'l’année dernière','0':'cette année','1':'l’année prochaine'},\n      P:'one{il y a # a}other{il y a # a}',\n      F:'one{dans # a}other{dans # a}',\n    },\n    NARROW:{\n      R:{'-1':'l’année dernière','0':'cette année','1':'l’année prochaine'},\n      P:'one{-# a}other{-# a}',\n      F:'one{+# a}other{+# a}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_fr_CA =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'hier','-2':'avant-hier','0':'aujourd’hui','1':'demain','2':'après-demain'},\n      P:'one{il y a # jour}other{il y a # jours}',\n      F:'one{dans # jour}other{dans # jours}',\n    },\n    SHORT:{\n      R:{'-1':'hier','-2':'avant-hier','0':'aujourd’hui','1':'demain','2':'après-demain'},\n      P:'one{il y a # j}other{il y a # j}',\n      F:'other{dans # j}',\n    },\n    NARROW:{\n      R:{'-1':'hier','-2':'avant-hier','0':'aujourd’hui','1':'demain','2':'après-demain'},\n      P:'one{-# j}other{-# j}',\n      F:'one{+# j}other{+# j}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'cette heure-ci'},\n      P:'one{il y a # heure}other{il y a # heures}',\n      F:'one{dans # heure}other{dans # heures}',\n    },\n    SHORT:{\n      R:{'0':'cette heure-ci'},\n      P:'one{il y a # h}other{il y a # h}',\n      F:'one{dans # h}other{dans # h}',\n    },\n    NARROW:{\n      R:{'0':'cette heure-ci'},\n      P:'one{-# h}other{-# h}',\n      F:'one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'cette minute-ci'},\n      P:'one{il y a # minute}other{il y a # minutes}',\n      F:'one{dans # minute}other{dans # minutes}',\n    },\n    SHORT:{\n      R:{'0':'cette minute-ci'},\n      P:'one{il y a # min}other{il y a # min}',\n      F:'one{dans # min}other{dans # min}',\n    },\n    NARROW:{\n      R:{'0':'cette minute-ci'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'le mois dernier','0':'ce mois-ci','1':'le mois prochain'},\n      P:'one{il y a # mois}other{il y a # mois}',\n      F:'one{dans # mois}other{dans # mois}',\n    },\n    SHORT:{\n      R:{'-1':'le mois dernier','0':'ce mois-ci','1':'le mois prochain'},\n      P:'one{il y a # m.}other{il y a # m.}',\n      F:'one{dans # m.}other{dans # m.}',\n    },\n    NARROW:{\n      R:{'-1':'le mois dernier','0':'ce mois-ci','1':'le mois prochain'},\n      P:'one{-# m.}other{-# m.}',\n      F:'one{+# m.}other{+# m.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'le trimestre dernier','0':'ce trimestre-ci','1':'le trimestre prochain'},\n      P:'one{il y a # trimestre}other{il y a # trimestres}',\n      F:'one{dans # trimestre}other{dans # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'trim. dernier','1':'trim. prochain'},\n      P:'one{il y a # trim.}other{il y a # trim.}',\n      F:'one{dans # trim.}other{dans # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. dernier','1':'trim.prochain'},\n      P:'one{-# trim.}other{-# trim.}',\n      F:'one{+# trim.}other{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'maintenant'},\n      P:'one{il y a # seconde}other{il y a # secondes}',\n      F:'one{dans # seconde}other{dans # secondes}',\n    },\n    SHORT:{\n      R:{'0':'maintenant'},\n      P:'one{il y a # s}other{il y a # s}',\n      F:'one{dans # s}other{dans # s}',\n    },\n    NARROW:{\n      R:{'0':'maintenant'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+ # s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'la semaine dernière','0':'cette semaine','1':'la semaine prochaine'},\n      P:'one{il y a # semaine}other{il y a # semaines}',\n      F:'one{dans # semaine}other{dans # semaines}',\n    },\n    SHORT:{\n      R:{'-1':'la semaine dernière','0':'cette semaine','1':'la semaine prochaine'},\n      P:'one{il y a # sem.}other{il y a # sem.}',\n      F:'one{dans # sem.}other{dans # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'la semaine dernière','0':'cette semaine','1':'la semaine prochaine'},\n      P:'one{-# sem.}other{-# sem.}',\n      F:'one{+# sem.}other{+# sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'l’année dernière','0':'cette année','1':'l’année prochaine'},\n      P:'one{Il y a # an}other{Il y a # ans}',\n      F:'one{Dans # an}other{Dans # ans}',\n    },\n    SHORT:{\n      R:{'-1':'l’année dernière','0':'cette année','1':'l’année prochaine'},\n      P:'one{il y a # a}other{il y a # a}',\n      F:'one{dans # a}other{dans # a}',\n    },\n    NARROW:{\n      R:{'-1':'l’année dernière','0':'cette année','1':'l’année prochaine'},\n      P:'one{-# a}other{-# a}',\n      F:'one{+# a}other{+# a}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ga =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'inné','-2':'arú inné','0':'inniu','1':'amárach','2':'arú amárach'},\n      P:'few{# lá ó shin}many{# lá ó shin}one{# lá ó shin}other{# lá ó shin}two{# lá ó shin}',\n      F:'few{i gceann # lá}many{i gceann # lá}one{i gceann # lá}other{i gceann # lá}two{i gceann # lá}',\n    },\n    NARROW:{\n      R:{'-1':'inné','-2':'arú inné','0':'inniu','1':'amárach','2':'arú amárach'},\n      P:'few{-# lá}many{-# lá}one{-# lá}other{-# lá}two{-# lá}',\n      F:'few{+# lá}many{+# lá}one{+# lá}other{+# lá}two{+# lá}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'an uair seo'},\n      P:'few{# huaire an chloig ó shin}many{# n-uaire an chloig ó shin}one{# uair an chloig ó shin}other{# uair an chloig ó shin}two{# uair an chloig ó shin}',\n      F:'few{i gceann # huaire an chloig}many{i gceann # n-uaire an chloig}one{i gceann # uair an chloig}other{i gceann # uair an chloig}two{i gceann # uair an chloig}',\n    },\n    SHORT:{\n      R:{'0':'an uair seo'},\n      P:'few{# huaire ó shin}many{# n-uaire ó shin}one{# uair ó shin}other{# uair ó shin}two{# uair ó shin}',\n      F:'few{i gceann # huaire}many{i gceann # n-uaire}one{i gceann # uair}other{i gceann # uair}two{i gceann # uair}',\n    },\n    NARROW:{\n      R:{'0':'an uair seo'},\n      P:'few{-# u}many{-# u}one{-# u}other{-# u}two{-# u}',\n      F:'few{+# u}many{+# u}one{+# u}other{+# u}two{+# u}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'an nóiméad seo'},\n      P:'few{# nóiméad ó shin}many{# nóiméad ó shin}one{# nóiméad ó shin}other{# nóiméad ó shin}two{# nóiméad ó shin}',\n      F:'few{i gceann # nóiméad}many{i gceann # nóiméad}one{i gceann # nóiméad}other{i gceann # nóiméad}two{i gceann # nóiméad}',\n    },\n    SHORT:{\n      R:{'0':'an nóiméad seo'},\n      P:'few{# nóim. ó shin}many{# nóim. ó shin}one{# nóim. ó shin}other{# nóim. ó shin}two{# nóim. ó shin}',\n      F:'few{i gceann # nóim.}many{i gceann # nóim.}one{i gceann # nóim.}other{i gceann # nóim.}two{i gceann # nóim.}',\n    },\n    NARROW:{\n      R:{'0':'an nóiméad seo'},\n      P:'few{-# n}many{-# n}one{-# n}other{-# n}two{-# n}',\n      F:'few{+# n}many{+# n}one{+# n}other{+# n}two{+# n}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'an mhí seo caite','0':'an mhí seo','1':'an mhí seo chugainn'},\n      P:'few{# mhí ó shin}many{# mí ó shin}one{# mhí ó shin}other{# mí ó shin}two{# mhí ó shin}',\n      F:'few{i gceann # mhí}many{i gceann # mí}one{i gceann # mhí}other{i gceann # mí}two{i gceann # mhí}',\n    },\n    NARROW:{\n      R:{'-1':'an mhí seo caite','0':'an mhí seo','1':'an mhí seo chugainn'},\n      P:'few{-# mhí}many{-# mí}one{-# mhí}other{-# mí}two{-# mhí}',\n      F:'few{+# mhí}many{+# mí}one{+# mhí}other{+# mí}two{+# mhí}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'an ráithe seo caite','0':'an ráithe seo','1':'an ráithe seo chugainn'},\n      P:'few{# ráithe ó shin}many{# ráithe ó shin}one{# ráithe ó shin}other{# ráithe ó shin}two{# ráithe ó shin}',\n      F:'few{i gceann # ráithe}many{i gceann # ráithe}one{i gceann # ráithe}other{i gceann # ráithe}two{i gceann # ráithe}',\n    },\n    NARROW:{\n      R:{'-1':'an ráithe seo caite','0':'an ráithe seo','1':'an ráithe seo chugainn'},\n      P:'few{-# R}many{-# R}one{-# R}other{-# R}two{-# R}',\n      F:'few{+# R}many{+# R}one{+# R}other{+# R}two{+# R}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'anois'},\n      P:'few{# shoicind ó shin}many{# soicind ó shin}one{# soicind ó shin}other{# soicind ó shin}two{# shoicind ó shin}',\n      F:'few{i gceann # shoicind}many{i gceann # soicind}one{i gceann # soicind}other{i gceann # soicind}two{i gceann # shoicind}',\n    },\n    SHORT:{\n      R:{'0':'anois'},\n      P:'few{# shoic. ó shin}many{# soic. ó shin}one{# soic. ó shin}other{# soic. ó shin}two{# shoic. ó shin}',\n      F:'few{i gceann # shoic.}many{i gceann # soic.}one{i gceann # soic.}other{i gceann # soic.}two{i gceann # shoic.}',\n    },\n    NARROW:{\n      R:{'0':'anois'},\n      P:'few{-# s}many{-# s}one{-# s}other{-# s}two{-# s}',\n      F:'few{+# s}many{+# s}one{+# s}other{+# s}two{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'an tseachtain seo caite','0':'an tseachtain seo','1':'an tseachtain seo chugainn'},\n      P:'few{# seachtaine ó shin}many{# seachtaine ó shin}one{# seachtain ó shin}other{# seachtain ó shin}two{# sheachtain ó shin}',\n      F:'few{i gceann # seachtaine}many{i gceann # seachtaine}one{i gceann # seachtain}other{i gceann # seachtain}two{i gceann # sheachtain}',\n    },\n    SHORT:{\n      R:{'-1':'an tscht. seo caite','0':'an tscht. seo','1':'an tscht. seo chugainn'},\n      P:'few{# scht. ó shin}many{# scht. ó shin}one{# scht. ó shin}other{# scht. ó shin}two{# scht. ó shin}',\n      F:'few{i gceann # scht.}many{i gceann # scht.}one{i gceann # scht.}other{i gceann # scht.}two{i gceann # shcht.}',\n    },\n    NARROW:{\n      R:{'-1':'an tscht. seo caite','0':'an tscht. seo','1':'an tscht. seo chugainn'},\n      P:'few{-# scht.}many{-# scht.}one{-# scht.}other{-# scht.}two{-# scht.}',\n      F:'few{+# scht.}many{+# scht.}one{+# scht.}other{+# scht.}two{+# scht.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'anuraidh','0':'an bhliain seo','1':'an bhliain seo chugainn'},\n      P:'few{# bliana ó shin}many{# mbliana ó shin}one{# bhliain ó shin}other{# bliain ó shin}two{# bhliain ó shin}',\n      F:'few{i gceann # bliana}many{i gceann # mbliana}one{i gceann # bhliain}other{i gceann # bliain}two{i gceann # bhliain}',\n    },\n    SHORT:{\n      R:{'-1':'anuraidh','0':'an bhl. seo','1':'an bhl. seo chugainn'},\n      P:'few{# bl. ó shin}many{# mbl. ó shin}one{# bhl. ó shin}other{# bl. ó shin}two{# bhl. ó shin}',\n      F:'few{i gceann # bl.}many{i gceann # mbl.}one{i gceann # bl.}other{i gceann # bl.}two{i gceann # bhl.}',\n    },\n    NARROW:{\n      R:{'-1':'anuraidh','0':'an bhl. seo','1':'an bhl. seo chugainn'},\n      P:'few{-# bl.}many{-# mbl.}one{-# bhl.}other{-# bl.}two{-# bhl.}',\n      F:'few{+# bl.}many{+# mbl.}one{+# bhl.}other{+# bl.}two{+# bhl.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_gl =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'onte','-2':'antonte','0':'hoxe','1':'mañá','2':'pasadomañá'},\n      P:'one{hai # día}other{hai # días}',\n      F:'one{en # día}other{en # días}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{hai # hora}other{hai # horas}',\n      F:'one{en # hora}other{en # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{hai # h}other{hai # h}',\n      F:'one{en # h}other{en # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{hai # minuto}other{hai # minutos}',\n      F:'one{en # minuto}other{en # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{hai # min}other{hai # min}',\n      F:'one{en # min}other{en # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'o mes pasado','0':'este mes','1':'o próximo mes'},\n      P:'one{hai # mes}other{hai # meses}',\n      F:'one{en # mes}other{en # meses}',\n    },\n    SHORT:{\n      R:{'-1':'m. pasado','0':'este m.','1':'m. seguinte'},\n      P:'one{hai # mes}other{hai # meses}',\n      F:'one{en # mes}other{en # meses}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'o trimestre pasado','0':'este trimestre','1':'o próximo trimestre'},\n      P:'one{hai # trimestre}other{hai # trimestres}',\n      F:'one{en # trimestre}other{en # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'trim. pasado','0':'este trim.','1':'trim. seguinte'},\n      P:'one{hai # trim.}other{hai # trim.}',\n      F:'one{en # trim.}other{en # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'agora'},\n      P:'one{hai # segundo}other{hai # segundos}',\n      F:'one{en # segundo}other{en # segundos}',\n    },\n    SHORT:{\n      R:{'0':'agora'},\n      P:'one{hai # s}other{hai # s}',\n      F:'one{en # s}other{en # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'a semana pasada','0':'esta semana','1':'a próxima semana'},\n      P:'one{hai # semana}other{hai # semanas}',\n      F:'one{en # semana}other{en # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'sem. pasada','0':'esta sem.','1':'sem. seguinte'},\n      P:'one{hai # sem.}other{hai # sem.}',\n      F:'one{en # sem.}other{en # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'o ano pasado','0':'este ano','1':'o próximo ano'},\n      P:'one{hai # ano}other{hai # anos}',\n      F:'one{en # ano}other{en # anos}',\n    },\n    SHORT:{\n      R:{'-1':'ano pasado','0':'este ano','1':'seguinte ano'},\n      P:'one{hai # ano}other{hai # anos}',\n      F:'one{en # ano}other{en # anos}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_gsw =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'geschter','-2':'vorgeschter','0':'hüt','1':'moorn','2':'übermoorn'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_gu =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ગઈકાલે','-2':'ગયા પરમદિવસે','0':'આજે','1':'આવતીકાલે','2':'પરમદિવસે'},\n      P:'one{# દિવસ પહેલાં}other{# દિવસ પહેલાં}',\n      F:'one{# દિવસમાં}other{# દિવસમાં}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'આ કલાક'},\n      P:'one{# કલાક પહેલાં}other{# કલાક પહેલાં}',\n      F:'one{# કલાકમાં}other{# કલાકમાં}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'આ મિનિટ'},\n      P:'one{# મિનિટ પહેલાં}other{# મિનિટ પહેલાં}',\n      F:'one{# મિનિટમાં}other{# મિનિટમાં}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ગયા મહિને','0':'આ મહિને','1':'આવતા મહિને'},\n      P:'one{# મહિના પહેલાં}other{# મહિના પહેલાં}',\n      F:'one{# મહિનામાં}other{# મહિનામાં}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'છેલ્લું ત્રિમાસિક','0':'આ ત્રિમાસિક','1':'પછીનું ત્રિમાસિક'},\n      P:'one{# ત્રિમાસિક પહેલાં}other{# ત્રિમાસિક પહેલાં}',\n      F:'one{# ત્રિમાસિકમાં}other{# ત્રિમાસિકમાં}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'હમણાં'},\n      P:'one{# સેકંડ પહેલાં}other{# સેકંડ પહેલાં}',\n      F:'one{# સેકંડમાં}other{# સેકંડમાં}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ગયા અઠવાડિયે','0':'આ અઠવાડિયે','1':'આવતા અઠવાડિયે'},\n      P:'one{# અઠવાડિયા પહેલાં}other{# અઠવાડિયા પહેલાં}',\n      F:'one{# અઠવાડિયામાં}other{# અઠવાડિયામાં}',\n    },\n    SHORT:{\n      R:{'-1':'ગયા અઠવાડિયે','0':'આ અઠવાડિયે','1':'આવતા અઠવાડિયે'},\n      P:'one{# અઠ. પહેલાં}other{# અઠ. પહેલાં}',\n      F:'one{# અઠ. માં}other{# અઠ. માં}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ગયા વર્ષે','0':'આ વર્ષે','1':'આવતા વર્ષે'},\n      P:'one{# વર્ષ પહેલાં}other{# વર્ષ પહેલાં}',\n      F:'one{# વર્ષમાં}other{# વર્ષમાં}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_haw =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'yesterday','0':'today','1':'tomorrow'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_he =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'אתמול','-2':'שלשום','0':'היום','1':'מחר','2':'מחרתיים'},\n      P:'many{לפני # ימים}one{לפני יום #}other{לפני # ימים}two{לפני יומיים}',\n      F:'many{בעוד # ימים}one{בעוד יום #}other{בעוד # ימים}two{בעוד יומיים}',\n    },\n    SHORT:{\n      R:{'-1':'אתמול','-2':'שלשום','0':'היום','1':'מחר','2':'מחרתיים'},\n      P:'many{לפני # ימים}one{אתמול}other{לפני # ימים}two{לפני יומיים}',\n      F:'many{בעוד # ימים}one{מחר}other{בעוד # ימים}two{בעוד יומיים}',\n    },\n    NARROW:{\n      R:{'-1':'אתמול','-2':'שלשום','0':'היום','1':'מחר'},\n      P:'many{לפני # ימים}one{אתמול}other{לפני # ימים}two{לפני יומיים}',\n      F:'many{בעוד # ימים}one{מחר}other{בעוד # ימים}two{בעוד יומיים}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'בשעה זו'},\n      P:'many{לפני # שעות}one{לפני שעה}other{לפני # שעות}two{לפני שעתיים}',\n      F:'many{בעוד # שעות}one{בעוד שעה}other{בעוד # שעות}two{בעוד שעתיים}',\n    },\n    SHORT:{\n      R:{'0':'בשעה זו'},\n      P:'many{לפני # שע׳}one{לפני שעה}other{לפני # שע׳}two{לפני שעתיים}',\n      F:'many{בעוד # שע׳}one{בעוד שעה}other{בעוד # שע׳}two{בעוד שעתיים}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'בדקה זו'},\n      P:'many{לפני # דקות}one{לפני דקה}other{לפני # דקות}two{לפני שתי דקות}',\n      F:'many{בעוד # דקות}one{בעוד דקה}other{בעוד # דקות}two{בעוד שתי דקות}',\n    },\n    SHORT:{\n      R:{'0':'בדקה זו'},\n      P:'many{לפני # דק׳}one{לפני דקה}other{לפני # דק׳}two{לפני # דק׳}',\n      F:'many{בעוד # דק׳}one{בעוד דקה}other{בעוד # דק׳}two{בעוד שתי דק׳}',\n    },\n    NARROW:{\n      R:{'0':'בדקה זו'},\n      P:'many{לפני # דק׳}one{לפני דקה}other{לפני # דק׳}two{לפני שתי דק׳}',\n      F:'many{בעוד # דק׳}one{בעוד דקה}other{בעוד # דק׳}two{בעוד שתי דק׳}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'החודש שעבר','0':'החודש','1':'החודש הבא'},\n      P:'many{לפני # חודשים}one{לפני חודש}other{לפני # חודשים}two{לפני חודשיים}',\n      F:'many{בעוד # חודשים}one{בעוד חודש}other{בעוד # חודשים}two{בעוד חודשיים}',\n    },\n    NARROW:{\n      R:{'-1':'החודש שעבר','0':'החודש','1':'החודש הבא'},\n      P:'many{לפני # חו׳}one{לפני חו׳}other{לפני # חו׳}two{לפני חודשיים}',\n      F:'many{בעוד # חו׳}one{בעוד חו׳}other{בעוד # חו׳}two{בעוד חודשיים}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'הרבעון הקודם','0':'רבעון זה','1':'הרבעון הבא'},\n      P:'many{לפני # רבעונים}one{ברבעון הקודם}other{לפני # רבעונים}two{לפני שני רבעונים}',\n      F:'many{בעוד # רבעונים}one{ברבעון הבא}other{בעוד # רבעונים}two{בעוד שני רבעונים}',\n    },\n    SHORT:{\n      R:{'-1':'הרבעון הקודם','0':'רבעון זה','1':'הרבעון הבא'},\n      P:'many{לפני # רבע׳}one{ברבע׳ הקודם}other{לפני # רבע׳}two{לפני שני רבע׳}',\n      F:'many{בעוד # רבע׳}one{ברבע׳ הבא}other{בעוד # רבע׳}two{בעוד שני רבע׳}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'עכשיו'},\n      P:'many{לפני # שניות}one{לפני שנייה}other{לפני # שניות}two{לפני שתי שניות}',\n      F:'many{בעוד # שניות}one{בעוד שנייה}other{בעוד # שניות}two{בעוד שתי שניות}',\n    },\n    SHORT:{\n      R:{'0':'עכשיו'},\n      P:'many{לפני # שנ׳}one{לפני שנ׳}other{לפני # שנ׳}two{לפני שתי שנ׳}',\n      F:'many{בעוד # שנ׳}one{בעוד שנ׳}other{בעוד # שנ׳}two{בעוד שתי שנ׳}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'השבוע שעבר','0':'השבוע','1':'השבוע הבא'},\n      P:'many{לפני # שבועות}one{לפני שבוע}other{לפני # שבועות}two{לפני שבועיים}',\n      F:'many{בעוד # שבועות}one{בעוד שבוע}other{בעוד # שבועות}two{בעוד שבועיים}',\n    },\n    SHORT:{\n      R:{'-1':'השבוע שעבר','0':'השבוע','1':'השבוע הבא'},\n      P:'many{לפני # שב׳}one{לפני שב׳}other{לפני # שב׳}two{לפני שבועיים}',\n      F:'many{בעוד # שב׳}one{בעוד שב׳}other{בעוד # שב׳}two{בעוד שבועיים}',\n    },\n    NARROW:{\n      R:{'-1':'השבוע שעבר','0':'השבוע','1':'השבוע הבא'},\n      P:'many{לפני # שב׳}one{לפני שבוע}other{לפני # שב׳}two{לפני שבועיים}',\n      F:'many{בעוד # שב׳}one{בעוד שב׳}other{בעוד # שב׳}two{בעוד שבועיים}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'השנה שעברה','0':'השנה','1':'השנה הבאה'},\n      P:'many{לפני # שנה}one{לפני שנה}other{לפני # שנים}two{לפני שנתיים}',\n      F:'many{בעוד # שנה}one{בעוד שנה}other{בעוד # שנים}two{בעוד שנתיים}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_hi =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'कल','-2':'परसों','0':'आज','1':'कल','2':'परसों'},\n      P:'one{# दिन पहले}other{# दिन पहले}',\n      F:'one{# दिन में}other{# दिन में}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'यह घंटा'},\n      P:'one{# घंटे पहले}other{# घंटे पहले}',\n      F:'one{# घंटे में}other{# घंटे में}',\n    },\n    SHORT:{\n      R:{'0':'यह घंटा'},\n      P:'one{# घं॰ पहले}other{# घं॰ पहले}',\n      F:'one{# घं॰ में}other{# घं॰ में}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'यह मिनट'},\n      P:'one{# मिनट पहले}other{# मिनट पहले}',\n      F:'one{# मिनट में}other{# मिनट में}',\n    },\n    SHORT:{\n      R:{'0':'यह मिनट'},\n      P:'one{# मि॰ पहले}other{# मि॰ पहले}',\n      F:'one{# मि॰ में}other{# मि॰ में}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'पिछला माह','0':'इस माह','1':'अगला माह'},\n      P:'one{# माह पहले}other{# माह पहले}',\n      F:'one{# माह में}other{# माह में}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'अंतिम तिमाही','0':'इस तिमाही','1':'अगली तिमाही'},\n      P:'one{# तिमाही पहले}other{# तिमाही पहले}',\n      F:'one{# तिमाही में}other{# तिमाहियों में}',\n    },\n    SHORT:{\n      R:{'-1':'अंतिम तिमाही','0':'इस तिमाही','1':'अगली तिमाही'},\n      P:'one{# तिमाही पहले}other{# तिमाहियों पहले}',\n      F:'one{# तिमाही में}other{# तिमाहियों में}',\n    },\n    NARROW:{\n      R:{'-1':'अंतिम तिमाही','0':'इस तिमाही','1':'अगली तिमाही'},\n      P:'one{# ति॰ पहले}other{# ति॰ पहले}',\n      F:'one{# ति॰ में}other{# ति॰ में}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'अब'},\n      P:'one{# सेकंड पहले}other{# सेकंड पहले}',\n      F:'one{# सेकंड में}other{# सेकंड में}',\n    },\n    SHORT:{\n      R:{'0':'अब'},\n      P:'one{# से॰ पहले}other{# से॰ पहले}',\n      F:'one{# से॰ में}other{# से॰ में}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'पिछला सप्ताह','0':'इस सप्ताह','1':'अगला सप्ताह'},\n      P:'one{# सप्ताह पहले}other{# सप्ताह पहले}',\n      F:'one{# सप्ताह में}other{# सप्ताह में}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'पिछला वर्ष','0':'इस वर्ष','1':'अगला वर्ष'},\n      P:'one{# वर्ष पहले}other{# वर्ष पहले}',\n      F:'one{# वर्ष में}other{# वर्ष में}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_hr =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'jučer','-2':'prekjučer','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{prije # dana}one{prije # dan}other{prije # dana}',\n      F:'few{za # dana}one{za # dan}other{za # dana}',\n    },\n    NARROW:{\n      R:{'-1':'jučer','-2':'prekjučer','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{prije # d}one{prije # d}other{prije # d}',\n      F:'few{za # d}one{za # d}other{za # d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ovaj sat'},\n      P:'few{prije # sata}one{prije # sat}other{prije # sati}',\n      F:'few{za # sata}one{za # sat}other{za # sati}',\n    },\n    SHORT:{\n      R:{'0':'ovaj sat'},\n      P:'few{prije # h}one{prije # h}other{prije # h}',\n      F:'few{za # h}one{za # h}other{za # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ova minuta'},\n      P:'few{prije # minute}one{prije # minutu}other{prije # minuta}',\n      F:'few{za # minute}one{za # minutu}other{za # minuta}',\n    },\n    SHORT:{\n      R:{'0':'ova minuta'},\n      P:'few{prije # min}one{prije # min}other{prije # min}',\n      F:'few{za # min}one{za # min}other{za # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'prošli mjesec','0':'ovaj mjesec','1':'sljedeći mjesec'},\n      P:'few{prije # mjeseca}one{prije # mjesec}other{prije # mjeseci}',\n      F:'few{za # mjeseca}one{za # mjesec}other{za # mjeseci}',\n    },\n    SHORT:{\n      R:{'-1':'prošli mj.','0':'ovaj mj.','1':'sljedeći mj.'},\n      P:'few{prije # mj.}one{prije # mj.}other{prije # mj.}',\n      F:'few{za # mj.}one{za # mj.}other{za # mj.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'prošli kvartal','0':'ovaj kvartal','1':'sljedeći kvartal'},\n      P:'few{prije # kvartala}one{prije # kvartal}other{prije # kvartala}',\n      F:'few{za # kvartala}one{za # kvartal}other{za # kvartala}',\n    },\n    SHORT:{\n      R:{'-1':'prošli kv.','0':'ovaj kv.','1':'sljedeći kv.'},\n      P:'few{prije # kv.}one{prije # kv.}other{prije # kv.}',\n      F:'few{za # kv.}one{za # kv.}other{za # kv.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'sad'},\n      P:'few{prije # sekunde}one{prije # sekundu}other{prije # sekundi}',\n      F:'few{za # sekunde}one{za # sekundu}other{za # sekundi}',\n    },\n    SHORT:{\n      R:{'0':'sad'},\n      P:'few{prije # s}one{prije # s}other{prije # s}',\n      F:'few{za # s}one{za # s}other{za # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'prošli tjedan','0':'ovaj tjedan','1':'sljedeći tjedan'},\n      P:'few{prije # tjedna}one{prije # tjedan}other{prije # tjedana}',\n      F:'few{za # tjedna}one{za # tjedan}other{za # tjedana}',\n    },\n    SHORT:{\n      R:{'-1':'prošli tj.','0':'ovaj tj.','1':'sljedeći tj.'},\n      P:'few{prije # tj.}one{prije # tj.}other{prije # tj.}',\n      F:'few{za # tj.}one{za # tj.}other{za # tj.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'prošle godine','0':'ove godine','1':'sljedeće godine'},\n      P:'few{prije # godine}one{prije # godinu}other{prije # godina}',\n      F:'few{za # godine}one{za # godinu}other{za # godina}',\n    },\n    SHORT:{\n      R:{'-1':'prošle god.','0':'ove god.','1':'sljedeće god.'},\n      P:'few{prije # g.}one{prije # g.}other{prije # g.}',\n      F:'few{za # g.}one{za # g.}other{za # g.}',\n    },\n    NARROW:{\n      R:{'-1':'prošle g.','0':'ove g.','1':'sljedeće g.'},\n      P:'few{prije # g.}one{prije # g.}other{prije # g.}',\n      F:'few{za # g.}one{za # g.}other{za # g.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_hu =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'tegnap','-2':'tegnapelőtt','0':'ma','1':'holnap','2':'holnapután'},\n      P:'one{# nappal ezelőtt}other{# nappal ezelőtt}',\n      F:'one{# nap múlva}other{# nap múlva}',\n    },\n    SHORT:{\n      R:{'-1':'tegnap','-2':'tegnapelőtt','0':'ma','1':'holnap','2':'holnapután'},\n      P:'one{# napja}other{# napja}',\n      F:'one{# nap múlva}other{# nap múlva}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ebben az órában'},\n      P:'one{# órával ezelőtt}other{# órával ezelőtt}',\n      F:'one{# óra múlva}other{# óra múlva}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ebben a percben'},\n      P:'one{# perccel ezelőtt}other{# perccel ezelőtt}',\n      F:'one{# perc múlva}other{# perc múlva}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'előző hónap','0':'ez a hónap','1':'következő hónap'},\n      P:'one{# hónappal ezelőtt}other{# hónappal ezelőtt}',\n      F:'one{# hónap múlva}other{# hónap múlva}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'előző negyedév','0':'ez a negyedév','1':'következő negyedév'},\n      P:'one{# negyedévvel ezelőtt}other{# negyedévvel ezelőtt}',\n      F:'one{# negyedév múlva}other{# negyedév múlva}',\n    },\n    NARROW:{\n      R:{'-1':'előző negyedév','0':'ez a negyedév','1':'következő negyedév'},\n      P:'one{# negyedévvel ezelőtt}other{# negyedévvel ezelőtt}',\n      F:'one{# n.év múlva}other{# n.év múlva}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'most'},\n      P:'one{# másodperccel ezelőtt}other{# másodperccel ezelőtt}',\n      F:'one{# másodperc múlva}other{# másodperc múlva}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'előző hét','0':'ez a hét','1':'következő hét'},\n      P:'one{# héttel ezelőtt}other{# héttel ezelőtt}',\n      F:'one{# hét múlva}other{# hét múlva}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'előző év','0':'ez az év','1':'következő év'},\n      P:'one{# évvel ezelőtt}other{# évvel ezelőtt}',\n      F:'one{# év múlva}other{# év múlva}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_hy =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'երեկ','-2':'երեկ չէ առաջի օրը','0':'այսօր','1':'վաղը','2':'վաղը չէ մյուս օրը'},\n      P:'one{# օր առաջ}other{# օր առաջ}',\n      F:'one{# օրից}other{# օրից}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'այս ժամին'},\n      P:'one{# ժամ առաջ}other{# ժամ առաջ}',\n      F:'one{# ժամից}other{# ժամից}',\n    },\n    SHORT:{\n      R:{'0':'այս ժամին'},\n      P:'one{# ժ առաջ}other{# ժ առաջ}',\n      F:'one{# ժ-ից}other{# ժ-ից}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'այս րոպեին'},\n      P:'one{# րոպե առաջ}other{# րոպե առաջ}',\n      F:'one{# րոպեից}other{# րոպեից}',\n    },\n    SHORT:{\n      R:{'0':'այս րոպեին'},\n      P:'one{# ր առաջ}other{# ր առաջ}',\n      F:'one{# ր-ից}other{# ր-ից}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'նախորդ ամիս','0':'այս ամիս','1':'հաջորդ ամիս'},\n      P:'one{# ամիս առաջ}other{# ամիս առաջ}',\n      F:'one{# ամսից}other{# ամսից}',\n    },\n    SHORT:{\n      R:{'-1':'անցյալ ամիս','0':'այս ամիս','1':'հաջորդ ամիս'},\n      P:'one{# ամիս առաջ}other{# ամիս առաջ}',\n      F:'one{# ամսից}other{# ամսից}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'նախորդ եռամսյակ','0':'այս եռամսյակ','1':'հաջորդ եռամսյակ'},\n      P:'one{# եռամսյակ առաջ}other{# եռամսյակ առաջ}',\n      F:'one{# եռամսյակից}other{# եռամսյակից}',\n    },\n    SHORT:{\n      R:{'-1':'նախորդ եռամսյակ','0':'այս եռամսյակ','1':'հաջորդ եռամսյակ'},\n      P:'one{# եռմս առաջ}other{# եռմս առաջ}',\n      F:'one{# եռմս-ից}other{# եռմս-ից}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'հիմա'},\n      P:'one{# վայրկյան առաջ}other{# վայրկյան առաջ}',\n      F:'one{# վայրկյանից}other{# վայրկյանից}',\n    },\n    SHORT:{\n      R:{'0':'հիմա'},\n      P:'one{# վրկ առաջ}other{# վրկ առաջ}',\n      F:'one{# վրկ-ից}other{# վրկ-ից}',\n    },\n    NARROW:{\n      R:{'0':'հիմա'},\n      P:'one{# վ առաջ}other{# վ առաջ}',\n      F:'one{# վ-ից}other{# վ-ից}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'նախորդ շաբաթ','0':'այս շաբաթ','1':'հաջորդ շաբաթ'},\n      P:'one{# շաբաթ առաջ}other{# շաբաթ առաջ}',\n      F:'one{# շաբաթից}other{# շաբաթից}',\n    },\n    SHORT:{\n      R:{'-1':'նախորդ շաբաթ','0':'այս շաբաթ','1':'հաջորդ շաբաթ'},\n      P:'one{# շաբ առաջ}other{# շաբ առաջ}',\n      F:'one{# շաբ-ից}other{# շաբ-ից}',\n    },\n    NARROW:{\n      R:{'-1':'նախորդ շաբաթ','0':'այս շաբաթ','1':'հաջորդ շաբաթ'},\n      P:'one{# շաբ առաջ}other{# շաբ առաջ}',\n      F:'one{# շաբ անց}other{# շաբ անց}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'նախորդ տարի','0':'այս տարի','1':'հաջորդ տարի'},\n      P:'one{# տարի առաջ}other{# տարի առաջ}',\n      F:'one{# տարուց}other{# տարուց}',\n    },\n    SHORT:{\n      R:{'-1':'նախորդ տարի','0':'այս տարի','1':'հաջորդ տարի'},\n      P:'one{# տ առաջ}other{# տ առաջ}',\n      F:'one{# տարուց}other{# տարուց}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_id =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'kemarin','-2':'kemarin dulu','0':'hari ini','1':'besok','2':'lusa'},\n      P:'other{# hari yang lalu}',\n      F:'other{dalam # hari}',\n    },\n    SHORT:{\n      R:{'2':'lusa'},\n      P:'other{# h lalu}',\n      F:'other{dalam # h}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'jam ini'},\n      P:'other{# jam yang lalu}',\n      F:'other{dalam # jam}',\n    },\n    SHORT:{\n      R:{'0':'jam ini'},\n      P:'other{# jam lalu}',\n      F:'other{dalam # jam}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'menit ini'},\n      P:'other{# menit yang lalu}',\n      F:'other{dalam # menit}',\n    },\n    SHORT:{\n      R:{'0':'menit ini'},\n      P:'other{# mnt lalu}',\n      F:'other{dlm # mnt}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'bulan lalu','0':'bulan ini','1':'bulan berikutnya'},\n      P:'other{# bulan yang lalu}',\n      F:'other{dalam # bulan}',\n    },\n    SHORT:{\n      R:{'-1':'bulan lalu','0':'bulan ini','1':'bulan berikutnya'},\n      P:'other{# bln lalu}',\n      F:'other{dlm # bln}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'Kuartal lalu','0':'kuartal ini','1':'kuartal berikutnya'},\n      P:'other{# kuartal yang lalu}',\n      F:'other{dalam # kuartal}',\n    },\n    SHORT:{\n      R:{'-1':'Kuartal lalu','0':'kuartal ini','1':'kuartal berikutnya'},\n      P:'other{# krtl. lalu}',\n      F:'other{dlm # krtl.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'sekarang'},\n      P:'other{# detik yang lalu}',\n      F:'other{dalam # detik}',\n    },\n    SHORT:{\n      R:{'0':'sekarang'},\n      P:'other{# dtk lalu}',\n      F:'other{dlm # dtk}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'minggu lalu','0':'minggu ini','1':'minggu depan'},\n      P:'other{# minggu yang lalu}',\n      F:'other{dalam # minggu}',\n    },\n    SHORT:{\n      R:{'-1':'minggu lalu','0':'minggu ini','1':'minggu depan'},\n      P:'other{# mgg lalu}',\n      F:'other{dlm # mgg}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'tahun lalu','0':'tahun ini','1':'tahun depan'},\n      P:'other{# tahun yang lalu}',\n      F:'other{dalam # tahun}',\n    },\n    SHORT:{\n      R:{'-1':'tahun lalu','0':'tahun ini','1':'tahun depan'},\n      P:'other{# thn lalu}',\n      F:'other{dlm # thn}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_in =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'kemarin','-2':'kemarin dulu','0':'hari ini','1':'besok','2':'lusa'},\n      P:'other{# hari yang lalu}',\n      F:'other{dalam # hari}',\n    },\n    SHORT:{\n      R:{'2':'lusa'},\n      P:'other{# h lalu}',\n      F:'other{dalam # h}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'jam ini'},\n      P:'other{# jam yang lalu}',\n      F:'other{dalam # jam}',\n    },\n    SHORT:{\n      R:{'0':'jam ini'},\n      P:'other{# jam lalu}',\n      F:'other{dalam # jam}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'menit ini'},\n      P:'other{# menit yang lalu}',\n      F:'other{dalam # menit}',\n    },\n    SHORT:{\n      R:{'0':'menit ini'},\n      P:'other{# mnt lalu}',\n      F:'other{dlm # mnt}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'bulan lalu','0':'bulan ini','1':'bulan berikutnya'},\n      P:'other{# bulan yang lalu}',\n      F:'other{dalam # bulan}',\n    },\n    SHORT:{\n      R:{'-1':'bulan lalu','0':'bulan ini','1':'bulan berikutnya'},\n      P:'other{# bln lalu}',\n      F:'other{dlm # bln}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'Kuartal lalu','0':'kuartal ini','1':'kuartal berikutnya'},\n      P:'other{# kuartal yang lalu}',\n      F:'other{dalam # kuartal}',\n    },\n    SHORT:{\n      R:{'-1':'Kuartal lalu','0':'kuartal ini','1':'kuartal berikutnya'},\n      P:'other{# krtl. lalu}',\n      F:'other{dlm # krtl.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'sekarang'},\n      P:'other{# detik yang lalu}',\n      F:'other{dalam # detik}',\n    },\n    SHORT:{\n      R:{'0':'sekarang'},\n      P:'other{# dtk lalu}',\n      F:'other{dlm # dtk}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'minggu lalu','0':'minggu ini','1':'minggu depan'},\n      P:'other{# minggu yang lalu}',\n      F:'other{dalam # minggu}',\n    },\n    SHORT:{\n      R:{'-1':'minggu lalu','0':'minggu ini','1':'minggu depan'},\n      P:'other{# mgg lalu}',\n      F:'other{dlm # mgg}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'tahun lalu','0':'tahun ini','1':'tahun depan'},\n      P:'other{# tahun yang lalu}',\n      F:'other{dalam # tahun}',\n    },\n    SHORT:{\n      R:{'-1':'tahun lalu','0':'tahun ini','1':'tahun depan'},\n      P:'other{# thn lalu}',\n      F:'other{dlm # thn}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_is =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'í gær','-2':'í fyrradag','0':'í dag','1':'á morgun','2':'eftir tvo daga'},\n      P:'one{fyrir # degi}other{fyrir # dögum}',\n      F:'one{eftir # dag}other{eftir # daga}',\n    },\n    NARROW:{\n      R:{'-1':'í gær','-2':'í fyrradag','0':'í dag','1':'á morgun','2':'eftir tvo daga'},\n      P:'one{-# degi}other{-# dögum}',\n      F:'one{+# dag}other{+# daga}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'þessa stundina'},\n      P:'one{fyrir # klukkustund}other{fyrir # klukkustundum}',\n      F:'one{eftir # klukkustund}other{eftir # klukkustundir}',\n    },\n    SHORT:{\n      R:{'0':'þessa stundina'},\n      P:'one{fyrir # klst.}other{fyrir # klst.}',\n      F:'one{eftir # klst.}other{eftir # klst.}',\n    },\n    NARROW:{\n      R:{'0':'þessa stundina'},\n      P:'one{-# klst.}other{-# klst.}',\n      F:'one{+# klst.}other{+# klst.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'á þessari mínútu'},\n      P:'one{fyrir # mínútu}other{fyrir # mínútum}',\n      F:'one{eftir # mínútu}other{eftir # mínútur}',\n    },\n    SHORT:{\n      R:{'0':'á þessari mínútu'},\n      P:'one{fyrir # mín.}other{fyrir # mín.}',\n      F:'one{eftir # mín.}other{eftir # mín.}',\n    },\n    NARROW:{\n      R:{'0':'á þessari mínútu'},\n      P:'one{-# mín.}other{-# mín.}',\n      F:'one{+# mín.}other{+# mín.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'í síðasta mánuði','0':'í þessum mánuði','1':'í næsta mánuði'},\n      P:'one{fyrir # mánuði}other{fyrir # mánuðum}',\n      F:'one{eftir # mánuð}other{eftir # mánuði}',\n    },\n    SHORT:{\n      R:{'-1':'í síðasta mán.','0':'í þessum mán.','1':'í næsta mán.'},\n      P:'one{fyrir # mán.}other{fyrir # mán.}',\n      F:'one{eftir # mán.}other{eftir # mán.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'síðasti ársfjórðungur','0':'þessi ársfjórðungur','1':'næsti ársfjórðungur'},\n      P:'one{fyrir # ársfjórðungi}other{fyrir # ársfjórðungum}',\n      F:'one{eftir # ársfjórðung}other{eftir # ársfjórðunga}',\n    },\n    SHORT:{\n      R:{'-1':'síðasti ársfj.','0':'þessi ársfj.','1':'næsti ársfj.'},\n      P:'one{fyrir # ársfj.}other{fyrir # ársfj.}',\n      F:'one{eftir # ársfj.}other{eftir # ársfj.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'núna'},\n      P:'one{fyrir # sekúndu}other{fyrir # sekúndum}',\n      F:'one{eftir # sekúndu}other{eftir # sekúndur}',\n    },\n    SHORT:{\n      R:{'0':'núna'},\n      P:'one{fyrir # sek.}other{fyrir # sek.}',\n      F:'one{eftir # sek.}other{eftir # sek.}',\n    },\n    NARROW:{\n      R:{'0':'núna'},\n      P:'one{-# sek.}other{-# sek.}',\n      F:'one{+# sek.}other{+# sek.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'í síðustu viku','0':'í þessari viku','1':'í næstu viku'},\n      P:'one{fyrir # viku}other{fyrir # vikum}',\n      F:'one{eftir # viku}other{eftir # vikur}',\n    },\n    NARROW:{\n      R:{'-1':'í síðustu viku','0':'í þessari viku','1':'í næstu viku'},\n      P:'one{-# viku}other{-# vikur}',\n      F:'one{+# viku}other{+# vikur}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'á síðasta ári','0':'á þessu ári','1':'á næsta ári'},\n      P:'one{fyrir # ári}other{fyrir # árum}',\n      F:'one{eftir # ár}other{eftir # ár}',\n    },\n    NARROW:{\n      R:{'-1':'á síðasta ári','0':'á þessu ári','1':'á næsta ári'},\n      P:'one{fyrir # árum}other{fyrir # árum}',\n      F:'one{eftir # ár}other{eftir # ár}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_it =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ieri','-2':'l’altro ieri','0':'oggi','1':'domani','2':'dopodomani'},\n      P:'one{# giorno fa}other{# giorni fa}',\n      F:'one{tra # giorno}other{tra # giorni}',\n    },\n    SHORT:{\n      R:{'-1':'ieri','-2':'l’altro ieri','0':'oggi','1':'domani','2':'dopodomani'},\n      P:'one{# g fa}other{# gg fa}',\n      F:'one{tra # g}other{tra # gg}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'quest’ora'},\n      P:'one{# ora fa}other{# ore fa}',\n      F:'one{tra # ora}other{tra # ore}',\n    },\n    SHORT:{\n      R:{'0':'quest’ora'},\n      P:'one{# h fa}other{# h fa}',\n      F:'one{tra # h}other{tra # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'questo minuto'},\n      P:'one{# minuto fa}other{# minuti fa}',\n      F:'one{tra # minuto}other{tra # minuti}',\n    },\n    SHORT:{\n      R:{'0':'questo minuto'},\n      P:'one{# min fa}other{# min fa}',\n      F:'one{tra # min}other{tra # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mese scorso','0':'questo mese','1':'mese prossimo'},\n      P:'one{# mese fa}other{# mesi fa}',\n      F:'one{tra # mese}other{tra # mesi}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'trimestre scorso','0':'questo trimestre','1':'trimestre prossimo'},\n      P:'one{# trimestre fa}other{# trimestri fa}',\n      F:'one{tra # trimestre}other{tra # trimestri}',\n    },\n    SHORT:{\n      R:{'-1':'trim. scorso','0':'questo trim.','1':'trim. prossimo'},\n      P:'one{# trim. fa}other{# trim. fa}',\n      F:'one{tra # trim.}other{tra # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ora'},\n      P:'one{# secondo fa}other{# secondi fa}',\n      F:'one{tra # secondo}other{tra # secondi}',\n    },\n    SHORT:{\n      R:{'0':'ora'},\n      P:'one{# s fa}other{# sec. fa}',\n      F:'one{tra # s}other{tra # sec.}',\n    },\n    NARROW:{\n      R:{'0':'ora'},\n      P:'one{# s fa}other{# s fa}',\n      F:'one{tra # s}other{tra # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'settimana scorsa','0':'questa settimana','1':'settimana prossima'},\n      P:'one{# settimana fa}other{# settimane fa}',\n      F:'one{tra # settimana}other{tra # settimane}',\n    },\n    SHORT:{\n      R:{'-1':'settimana scorsa','0':'questa settimana','1':'settimana prossima'},\n      P:'one{# sett. fa}other{# sett. fa}',\n      F:'one{tra # sett.}other{tra # sett.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'anno scorso','0':'quest’anno','1':'anno prossimo'},\n      P:'one{# anno fa}other{# anni fa}',\n      F:'one{tra # anno}other{tra # anni}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_iw =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'אתמול','-2':'שלשום','0':'היום','1':'מחר','2':'מחרתיים'},\n      P:'many{לפני # ימים}one{לפני יום #}other{לפני # ימים}two{לפני יומיים}',\n      F:'many{בעוד # ימים}one{בעוד יום #}other{בעוד # ימים}two{בעוד יומיים}',\n    },\n    SHORT:{\n      R:{'-1':'אתמול','-2':'שלשום','0':'היום','1':'מחר','2':'מחרתיים'},\n      P:'many{לפני # ימים}one{אתמול}other{לפני # ימים}two{לפני יומיים}',\n      F:'many{בעוד # ימים}one{מחר}other{בעוד # ימים}two{בעוד יומיים}',\n    },\n    NARROW:{\n      R:{'-1':'אתמול','-2':'שלשום','0':'היום','1':'מחר'},\n      P:'many{לפני # ימים}one{אתמול}other{לפני # ימים}two{לפני יומיים}',\n      F:'many{בעוד # ימים}one{מחר}other{בעוד # ימים}two{בעוד יומיים}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'בשעה זו'},\n      P:'many{לפני # שעות}one{לפני שעה}other{לפני # שעות}two{לפני שעתיים}',\n      F:'many{בעוד # שעות}one{בעוד שעה}other{בעוד # שעות}two{בעוד שעתיים}',\n    },\n    SHORT:{\n      R:{'0':'בשעה זו'},\n      P:'many{לפני # שע׳}one{לפני שעה}other{לפני # שע׳}two{לפני שעתיים}',\n      F:'many{בעוד # שע׳}one{בעוד שעה}other{בעוד # שע׳}two{בעוד שעתיים}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'בדקה זו'},\n      P:'many{לפני # דקות}one{לפני דקה}other{לפני # דקות}two{לפני שתי דקות}',\n      F:'many{בעוד # דקות}one{בעוד דקה}other{בעוד # דקות}two{בעוד שתי דקות}',\n    },\n    SHORT:{\n      R:{'0':'בדקה זו'},\n      P:'many{לפני # דק׳}one{לפני דקה}other{לפני # דק׳}two{לפני # דק׳}',\n      F:'many{בעוד # דק׳}one{בעוד דקה}other{בעוד # דק׳}two{בעוד שתי דק׳}',\n    },\n    NARROW:{\n      R:{'0':'בדקה זו'},\n      P:'many{לפני # דק׳}one{לפני דקה}other{לפני # דק׳}two{לפני שתי דק׳}',\n      F:'many{בעוד # דק׳}one{בעוד דקה}other{בעוד # דק׳}two{בעוד שתי דק׳}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'החודש שעבר','0':'החודש','1':'החודש הבא'},\n      P:'many{לפני # חודשים}one{לפני חודש}other{לפני # חודשים}two{לפני חודשיים}',\n      F:'many{בעוד # חודשים}one{בעוד חודש}other{בעוד # חודשים}two{בעוד חודשיים}',\n    },\n    NARROW:{\n      R:{'-1':'החודש שעבר','0':'החודש','1':'החודש הבא'},\n      P:'many{לפני # חו׳}one{לפני חו׳}other{לפני # חו׳}two{לפני חודשיים}',\n      F:'many{בעוד # חו׳}one{בעוד חו׳}other{בעוד # חו׳}two{בעוד חודשיים}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'הרבעון הקודם','0':'רבעון זה','1':'הרבעון הבא'},\n      P:'many{לפני # רבעונים}one{ברבעון הקודם}other{לפני # רבעונים}two{לפני שני רבעונים}',\n      F:'many{בעוד # רבעונים}one{ברבעון הבא}other{בעוד # רבעונים}two{בעוד שני רבעונים}',\n    },\n    SHORT:{\n      R:{'-1':'הרבעון הקודם','0':'רבעון זה','1':'הרבעון הבא'},\n      P:'many{לפני # רבע׳}one{ברבע׳ הקודם}other{לפני # רבע׳}two{לפני שני רבע׳}',\n      F:'many{בעוד # רבע׳}one{ברבע׳ הבא}other{בעוד # רבע׳}two{בעוד שני רבע׳}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'עכשיו'},\n      P:'many{לפני # שניות}one{לפני שנייה}other{לפני # שניות}two{לפני שתי שניות}',\n      F:'many{בעוד # שניות}one{בעוד שנייה}other{בעוד # שניות}two{בעוד שתי שניות}',\n    },\n    SHORT:{\n      R:{'0':'עכשיו'},\n      P:'many{לפני # שנ׳}one{לפני שנ׳}other{לפני # שנ׳}two{לפני שתי שנ׳}',\n      F:'many{בעוד # שנ׳}one{בעוד שנ׳}other{בעוד # שנ׳}two{בעוד שתי שנ׳}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'השבוע שעבר','0':'השבוע','1':'השבוע הבא'},\n      P:'many{לפני # שבועות}one{לפני שבוע}other{לפני # שבועות}two{לפני שבועיים}',\n      F:'many{בעוד # שבועות}one{בעוד שבוע}other{בעוד # שבועות}two{בעוד שבועיים}',\n    },\n    SHORT:{\n      R:{'-1':'השבוע שעבר','0':'השבוע','1':'השבוע הבא'},\n      P:'many{לפני # שב׳}one{לפני שב׳}other{לפני # שב׳}two{לפני שבועיים}',\n      F:'many{בעוד # שב׳}one{בעוד שב׳}other{בעוד # שב׳}two{בעוד שבועיים}',\n    },\n    NARROW:{\n      R:{'-1':'השבוע שעבר','0':'השבוע','1':'השבוע הבא'},\n      P:'many{לפני # שב׳}one{לפני שבוע}other{לפני # שב׳}two{לפני שבועיים}',\n      F:'many{בעוד # שב׳}one{בעוד שב׳}other{בעוד # שב׳}two{בעוד שבועיים}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'השנה שעברה','0':'השנה','1':'השנה הבאה'},\n      P:'many{לפני # שנה}one{לפני שנה}other{לפני # שנים}two{לפני שנתיים}',\n      F:'many{בעוד # שנה}one{בעוד שנה}other{בעוד # שנים}two{בעוד שנתיים}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ja =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'昨日','-2':'一昨日','0':'今日','1':'明日','2':'明後日'},\n      P:'other{# 日前}',\n      F:'other{# 日後}',\n    },\n    NARROW:{\n      R:{'-1':'昨日','-2':'一昨日','0':'今日','1':'明日','2':'明後日'},\n      P:'other{#日前}',\n      F:'other{#日後}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'1 時間以内'},\n      P:'other{# 時間前}',\n      F:'other{# 時間後}',\n    },\n    NARROW:{\n      R:{'0':'1 時間以内'},\n      P:'other{#時間前}',\n      F:'other{#時間後}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'1 分以内'},\n      P:'other{# 分前}',\n      F:'other{# 分後}',\n    },\n    NARROW:{\n      R:{'0':'1 分以内'},\n      P:'other{#分前}',\n      F:'other{#分後}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'先月','0':'今月','1':'翌月'},\n      P:'other{# か月前}',\n      F:'other{# か月後}',\n    },\n    NARROW:{\n      R:{'-1':'先月','0':'今月','1':'翌月'},\n      P:'other{#か月前}',\n      F:'other{#か月後}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'前四半期','0':'今四半期','1':'翌四半期'},\n      P:'other{# 四半期前}',\n      F:'other{# 四半期後}',\n    },\n    NARROW:{\n      R:{'-1':'前四半期','0':'今四半期','1':'翌四半期'},\n      P:'other{#四半期前}',\n      F:'other{#四半期後}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'今'},\n      P:'other{# 秒前}',\n      F:'other{# 秒後}',\n    },\n    NARROW:{\n      R:{'0':'今'},\n      P:'other{#秒前}',\n      F:'other{#秒後}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'先週','0':'今週','1':'翌週'},\n      P:'other{# 週間前}',\n      F:'other{# 週間後}',\n    },\n    NARROW:{\n      R:{'-1':'先週','0':'今週','1':'翌週'},\n      P:'other{#週間前}',\n      F:'other{#週間後}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'昨年','0':'今年','1':'翌年'},\n      P:'other{# 年前}',\n      F:'other{# 年後}',\n    },\n    NARROW:{\n      R:{'-1':'昨年','0':'今年','1':'翌年'},\n      P:'other{#年前}',\n      F:'other{#年後}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ka =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'გუშინ','-2':'გუშინწინ','0':'დღეს','1':'ხვალ','2':'ზეგ'},\n      P:'one{# დღის წინ}other{# დღის წინ}',\n      F:'one{# დღეში}other{# დღეში}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ამ საათში'},\n      P:'one{# საათის წინ}other{# საათის წინ}',\n      F:'one{# საათში}other{# საათში}',\n    },\n    SHORT:{\n      R:{'0':'ამ საათში'},\n      P:'one{# სთ წინ}other{# სთ წინ}',\n      F:'one{# საათში}other{# საათში}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ამ წუთში'},\n      P:'one{# წუთის წინ}other{# წუთის წინ}',\n      F:'one{# წუთში}other{# წუთში}',\n    },\n    SHORT:{\n      R:{'0':'ამ წუთში'},\n      P:'one{# წთ წინ}other{# წთ წინ}',\n      F:'one{# წუთში}other{# წუთში}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'გასულ თვეს','0':'ამ თვეში','1':'მომავალ თვეს'},\n      P:'one{# თვის წინ}other{# თვის წინ}',\n      F:'one{# თვეში}other{# თვეში}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'გასულ კვარტალში','0':'ამ კვარტალში','1':'შემდეგ კვარტალში'},\n      P:'one{# კვარტალის წინ}other{# კვარტალის წინ}',\n      F:'one{# კვარტალში}other{# კვარტალში}',\n    },\n    SHORT:{\n      R:{'-1':'გასულ კვარტალში','0':'ამ კვარტალში','1':'შემდეგ კვარტალში'},\n      P:'one{# კვარტ. წინ}other{# კვარტ. წინ}',\n      F:'one{# კვარტალში}other{# კვარტალში}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ახლა'},\n      P:'one{# წამის წინ}other{# წამის წინ}',\n      F:'one{# წამში}other{# წამში}',\n    },\n    SHORT:{\n      R:{'0':'ახლა'},\n      P:'one{# წმ წინ}other{# წმ წინ}',\n      F:'one{# წამში}other{# წამში}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'გასულ კვირაში','0':'ამ კვირაში','1':'მომავალ კვირაში'},\n      P:'one{# კვირის წინ}other{# კვირის წინ}',\n      F:'one{# კვირაში}other{# კვირაში}',\n    },\n    SHORT:{\n      R:{'-1':'გასულ კვირაში','0':'ამ კვირაში','1':'მომავალ კვირაში'},\n      P:'one{# კვ. წინ}other{# კვ. წინ}',\n      F:'one{# კვირაში}other{# კვირაში}',\n    },\n    NARROW:{\n      R:{'-1':'გასულ კვირაში','0':'ამ კვირაში','1':'მომავალ კვირაში'},\n      P:'one{# კვირის წინ}other{# კვირის წინ}',\n      F:'one{# კვირაში}other{# კვირაში}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'გასულ წელს','0':'ამ წელს','1':'მომავალ წელს'},\n      P:'one{# წლის წინ}other{# წლის წინ}',\n      F:'one{# წელიწადში}other{# წელიწადში}',\n    },\n    SHORT:{\n      R:{'-1':'გასულ წელს','0':'ამ წელს','1':'მომავალ წელს'},\n      P:'one{# წლის წინ}other{# წლის წინ}',\n      F:'one{# წელში}other{# წელში}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kk =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'кеше','-2':'алдыңгүні','0':'бүгін','1':'ертең','2':'бүрсігүні'},\n      P:'one{# күн бұрын}other{# күн бұрын}',\n      F:'one{# күннен кейін}other{# күннен кейін}',\n    },\n    SHORT:{\n      R:{'-1':'кеше','-2':'алдыңғы күні','0':'бүгін','1':'ертең','2':'бүрсігүні'},\n      P:'one{# күн бұрын}other{# күн бұрын}',\n      F:'one{# күннен кейін}other{# күннен кейін}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'осы сағат'},\n      P:'one{# сағат бұрын}other{# сағат бұрын}',\n      F:'one{# сағаттан кейін}other{# сағаттан кейін}',\n    },\n    SHORT:{\n      R:{'0':'осы сағат'},\n      P:'one{# сағ. бұрын}other{# сағ. бұрын}',\n      F:'one{# сағ. кейін}other{# сағ. кейін}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'осы минут'},\n      P:'one{# минут бұрын}other{# минут бұрын}',\n      F:'one{# минуттан кейін}other{# минуттан кейін}',\n    },\n    SHORT:{\n      R:{'0':'осы минут'},\n      P:'one{# мин. бұрын}other{# мин. бұрын}',\n      F:'one{# мин. кейін}other{# мин. кейін}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'өткен ай','0':'осы ай','1':'келесі ай'},\n      P:'one{# ай бұрын}other{# ай бұрын}',\n      F:'one{# айдан кейін}other{# айдан кейін}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'өткен тоқсан','0':'осы тоқсан','1':'келесі тоқсан'},\n      P:'one{# тоқсан бұрын}other{# тоқсан бұрын}',\n      F:'one{# тоқсаннан кейін}other{# тоқсаннан кейін}',\n    },\n    SHORT:{\n      R:{'-1':'өткен тоқсан','0':'осы тоқсан','1':'келесі тоқсан'},\n      P:'one{# тқс. бұрын}other{# тқс. бұрын}',\n      F:'one{# тқс. кейін}other{# тқс. кейін}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'қазір'},\n      P:'one{# секунд бұрын}other{# секунд бұрын}',\n      F:'one{# секундтан кейін}other{# секундтан кейін}',\n    },\n    SHORT:{\n      R:{'0':'қазір'},\n      P:'one{# сек. бұрын}other{# сек. бұрын}',\n      F:'one{# сек. кейін}other{# сек. кейін}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'өткен апта','0':'осы апта','1':'келесі апта'},\n      P:'one{# апта бұрын}other{# апта бұрын}',\n      F:'one{# аптадан кейін}other{# аптадан кейін}',\n    },\n    SHORT:{\n      R:{'-1':'өткен апта','0':'осы апта','1':'келесі апта'},\n      P:'one{# ап. бұрын}other{# ап. бұрын}',\n      F:'one{# ап. кейін}other{# ап. кейін}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'былтырғы жыл','0':'биылғы жыл','1':'келесі жыл'},\n      P:'one{# жыл бұрын}other{# жыл бұрын}',\n      F:'one{# жылдан кейін}other{# жылдан кейін}',\n    },\n    SHORT:{\n      R:{'-1':'былтырғы жыл','0':'биылғы жыл','1':'келесі жыл'},\n      P:'one{# ж. бұрын}other{# ж. бұрын}',\n      F:'one{# ж. кейін}other{# ж. кейін}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_km =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ម្សិលមិញ','-2':'ម្សិល​ម៉្ងៃ','0':'ថ្ងៃ​នេះ','1':'ថ្ងៃ​ស្អែក','2':'​ខាន​ស្អែក'},\n      P:'other{# ថ្ងៃ​មុន}',\n      F:'other{# ថ្ងៃទៀត}',\n    },\n    SHORT:{\n      R:{'-1':'ម្សិលមិញ','-2':'ម្សិល​ម៉្ងៃ','0':'ថ្ងៃ​នេះ','1':'ថ្ងៃស្អែក','2':'​ខាន​ស្អែក'},\n      P:'other{# ថ្ងៃ​​មុន}',\n      F:'other{# ថ្ងៃទៀត}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ម៉ោងនេះ'},\n      P:'other{# ម៉ោង​មុន}',\n      F:'other{ក្នុង​រយៈ​ពេល # ម៉ោង}',\n    },\n    SHORT:{\n      R:{'0':'ម៉ោងនេះ'},\n      P:'other{# ម៉ោង​មុន}',\n      F:'other{# ម៉ោងទៀត}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'នាទីនេះ'},\n      P:'other{# នាទី​មុន}',\n      F:'other{# នាទីទៀត}',\n    },\n    SHORT:{\n      R:{'0':'នាទីនេះ'},\n      P:'other{# នាទី​​មុន}',\n      F:'other{# នាទីទៀត}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ខែ​មុន','0':'ខែ​នេះ','1':'ខែ​ក្រោយ'},\n      P:'other{# ខែមុន}',\n      F:'other{# ខែទៀត}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'ត្រីមាស​មុន','0':'ត្រីមាស​នេះ','1':'ត្រីមាស​ក្រោយ'},\n      P:'other{# ត្រីមាស​មុន}',\n      F:'other{# ត្រីមាសទៀត}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ឥឡូវ'},\n      P:'other{# វិនាទី​មុន}',\n      F:'other{# វិនាទីទៀត}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'សប្ដាហ៍​មុន','0':'សប្ដាហ៍​នេះ','1':'សប្ដាហ៍​ក្រោយ'},\n      P:'other{# សប្ដាហ៍​មុន}',\n      F:'other{# សប្ដាហ៍ទៀត}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ឆ្នាំ​មុន','0':'ឆ្នាំ​នេះ','1':'ឆ្នាំ​ក្រោយ'},\n      P:'other{# ឆ្នាំ​មុន}',\n      F:'other{# ឆ្នាំទៀត}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_kn =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ನಿನ್ನೆ','-2':'ಮೊನ್ನೆ','0':'ಇಂದು','1':'ನಾಳೆ','2':'ನಾಡಿದ್ದು'},\n      P:'one{# ದಿನದ ಹಿಂದೆ}other{# ದಿನಗಳ ಹಿಂದೆ}',\n      F:'one{# ದಿನದಲ್ಲಿ}other{# ದಿನಗಳಲ್ಲಿ}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ಈ ಗಂಟೆ'},\n      P:'one{# ಗಂಟೆ ಹಿಂದೆ}other{# ಗಂಟೆಗಳ ಹಿಂದೆ}',\n      F:'one{# ಗಂಟೆಯಲ್ಲಿ}other{# ಗಂಟೆಗಳಲ್ಲಿ}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ಈ ನಿಮಿಷ'},\n      P:'one{# ನಿಮಿಷದ ಹಿಂದೆ}other{# ನಿಮಿಷಗಳ ಹಿಂದೆ}',\n      F:'one{# ನಿಮಿಷದಲ್ಲಿ}other{# ನಿಮಿಷಗಳಲ್ಲಿ}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ಕಳೆದ ತಿಂಗಳು','0':'ಈ ತಿಂಗಳು','1':'ಮುಂದಿನ ತಿಂಗಳು'},\n      P:'one{# ತಿಂಗಳ ಹಿಂದೆ}other{# ತಿಂಗಳುಗಳ ಹಿಂದೆ}',\n      F:'one{# ತಿಂಗಳಲ್ಲಿ}other{# ತಿಂಗಳುಗಳಲ್ಲಿ}',\n    },\n    SHORT:{\n      R:{'-1':'ಕಳೆದ ತಿಂಗಳು','0':'ಈ ತಿಂಗಳು','1':'ಮುಂದಿನ ತಿಂಗಳು'},\n      P:'one{# ತಿಂಗಳು ಹಿಂದೆ}other{# ತಿಂಗಳುಗಳ ಹಿಂದೆ}',\n      F:'one{# ತಿಂಗಳಲ್ಲಿ}other{# ತಿಂಗಳುಗಳಲ್ಲಿ}',\n    },\n    NARROW:{\n      R:{'-1':'ಕಳೆದ ತಿಂಗಳು','0':'ಈ ತಿಂಗಳು','1':'ಮುಂದಿನ ತಿಂಗಳು'},\n      P:'one{# ತಿಂಗಳ ಹಿಂದೆ}other{# ತಿಂಗಳುಗಳ ಹಿಂದೆ}',\n      F:'one{# ತಿಂಗಳಲ್ಲಿ}other{# ತಿಂಗಳುಗಳಲ್ಲಿ}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'ಹಿಂದಿನ ತ್ರೈಮಾಸಿಕ','0':'ಈ ತ್ರೈಮಾಸಿಕ','1':'ಮುಂದಿನ ತ್ರೈಮಾಸಿಕ'},\n      P:'one{# ತ್ರೈಮಾಸಿಕದ ಹಿಂದೆ}other{# ತ್ರೈಮಾಸಿಕಗಳ ಹಿಂದೆ}',\n      F:'one{# ತ್ರೈಮಾಸಿಕದಲ್ಲಿ}other{# ತ್ರೈಮಾಸಿಕಗಳಲ್ಲಿ}',\n    },\n    SHORT:{\n      R:{'-1':'ಕಳೆದ ತ್ರೈಮಾಸಿಕ','0':'ಈ ತ್ರೈಮಾಸಿಕ','1':'ಮುಂದಿನ ತ್ರೈಮಾಸಿಕ'},\n      P:'one{# ತ್ರೈ.ಮಾ. ಹಿಂದೆ}other{# ತ್ರೈಮಾಸಿಕಗಳ ಹಿಂದೆ}',\n      F:'one{# ತ್ರೈ.ಮಾ.ದಲ್ಲಿ}other{# ತ್ರೈಮಾಸಿಕಗಳಲ್ಲಿ}',\n    },\n    NARROW:{\n      R:{'-1':'ಕಳೆದ ತ್ರೈಮಾಸಿಕ','0':'ಈ ತ್ರೈಮಾಸಿಕ','1':'ಮುಂದಿನ ತ್ರೈಮಾಸಿಕ'},\n      P:'one{# ತ್ರೈ.ಮಾ. ಹಿಂದೆ}other{# ತ್ರೈಮಾಸಿಕಗಳ ಹಿಂದೆ}',\n      F:'one{# ತ್ರೈಮಾಸಿಕಗಳಲ್ಲಿ}other{# ತ್ರೈಮಾಸಿಕಗಳಲ್ಲಿ}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ಈಗ'},\n      P:'one{# ಸೆಕೆಂಡ್ ಹಿಂದೆ}other{# ಸೆಕೆಂಡುಗಳ ಹಿಂದೆ}',\n      F:'one{# ಸೆಕೆಂಡ್‌ನಲ್ಲಿ}other{# ಸೆಕೆಂಡ್‌ಗಳಲ್ಲಿ}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ಕಳೆದ ವಾರ','0':'ಈ ವಾರ','1':'ಮುಂದಿನ ವಾರ'},\n      P:'one{# ವಾರದ ಹಿಂದೆ}other{# ವಾರಗಳ ಹಿಂದೆ}',\n      F:'one{# ವಾರದಲ್ಲಿ}other{# ವಾರಗಳಲ್ಲಿ}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ಹಿಂದಿನ ವರ್ಷ','0':'ಈ ವರ್ಷ','1':'ಮುಂದಿನ ವರ್ಷ'},\n      P:'one{# ವರ್ಷದ ಹಿಂದೆ}other{# ವರ್ಷಗಳ ಹಿಂದೆ}',\n      F:'one{# ವರ್ಷದಲ್ಲಿ}other{# ವರ್ಷಗಳಲ್ಲಿ}',\n    },\n    SHORT:{\n      R:{'-1':'ಕಳೆದ ವರ್ಷ','0':'ಈ ವರ್ಷ','1':'ಮುಂದಿನ ವರ್ಷ'},\n      P:'one{# ವರ್ಷದ ಹಿಂದೆ}other{# ವರ್ಷಗಳ ಹಿಂದೆ}',\n      F:'one{# ವರ್ಷದಲ್ಲಿ}other{# ವರ್ಷಗಳಲ್ಲಿ}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ko =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'어제','-2':'그저께','0':'오늘','1':'내일','2':'모레'},\n      P:'other{#일 전}',\n      F:'other{#일 후}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'현재 시간'},\n      P:'other{#시간 전}',\n      F:'other{#시간 후}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'현재 분'},\n      P:'other{#분 전}',\n      F:'other{#분 후}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'지난달','0':'이번 달','1':'다음 달'},\n      P:'other{#개월 전}',\n      F:'other{#개월 후}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'지난 분기','0':'이번 분기','1':'다음 분기'},\n      P:'other{#분기 전}',\n      F:'other{#분기 후}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'지금'},\n      P:'other{#초 전}',\n      F:'other{#초 후}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'지난주','0':'이번 주','1':'다음 주'},\n      P:'other{#주 전}',\n      F:'other{#주 후}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'작년','0':'올해','1':'내년'},\n      P:'other{#년 전}',\n      F:'other{#년 후}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ky =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'кечээ','-2':'мурдагы күнү','0':'бүгүн','1':'эртең','2':'бүрсүгүнү'},\n      P:'one{# күн мурун}other{# күн мурун}',\n      F:'one{# күндөн кийин}other{# күндөн кийин}',\n    },\n    SHORT:{\n      R:{'-1':'кечээ','-2':'мурдагы күнү','0':'бүгүн','1':'эртең','2':'бүрсүгүнү'},\n      P:'one{# күн мурун}other{# күн мурун}',\n      F:'one{# күн. кийин}other{# күн. кийин}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ушул саатта'},\n      P:'one{# саат мурун}other{# саат мурун}',\n      F:'one{# сааттан кийин}other{# сааттан кийин}',\n    },\n    SHORT:{\n      R:{'0':'ушул саатта'},\n      P:'one{# саат. мурун}other{# саат. мурун}',\n      F:'one{# саат. кийин}other{# саат. кийин}',\n    },\n    NARROW:{\n      R:{'0':'ушул саатта'},\n      P:'one{# с. мурн}other{# с. мурн}',\n      F:'one{# с. кийн}other{# с. кийн}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ушул мүнөттө'},\n      P:'one{# мүнөт мурун}other{# мүнөт мурун}',\n      F:'one{# мүнөттөн кийин}other{# мүнөттөн кийин}',\n    },\n    SHORT:{\n      R:{'0':'ушул мүнөттө'},\n      P:'one{# мүн. мурун}other{# мүн. мурун}',\n      F:'one{# мүн. кийин}other{# мүн. кийин}',\n    },\n    NARROW:{\n      R:{'0':'ушул мүнөттө'},\n      P:'one{# мүн. мурн}other{# мүн. мурн}',\n      F:'one{# мүн. кийн}other{# мүн. кийн}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'өткөн айда','0':'бул айда','1':'эмдиги айда'},\n      P:'one{# ай мурун}other{# ай мурун}',\n      F:'one{# айдан кийин}other{# айдан кийин}',\n    },\n    SHORT:{\n      R:{'-1':'өткөн айда','0':'бул айда','1':'эмдиги айда'},\n      P:'one{# ай мурун}other{# ай мурун}',\n      F:'one{# айд. кийин}other{# айд. кийин}',\n    },\n    NARROW:{\n      R:{'-1':'өткөн айда','0':'бул айда','1':'эмдиги айда'},\n      P:'one{# ай мурн}other{# ай мурн}',\n      F:'one{# айд. кийн}other{# айд. кийн}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'акыркы чейрек','0':'бул чейрек','1':'кийинки чейрек'},\n      P:'one{# чейрек мурун}other{# чейрек мурун}',\n      F:'one{# чейректен кийин}other{# чейректен кийин}',\n    },\n    SHORT:{\n      R:{'-1':'акыркы чейр.','0':'бул чейр.','1':'кийинки чейр.'},\n      P:'one{# чейр. мурун}other{# чейр. мурун}',\n      F:'one{# чейректен кийин}other{# чейректен кийин}',\n    },\n    NARROW:{\n      R:{'-1':'акыркы чейр.','0':'бул чейр.','1':'кийинки чейр.'},\n      P:'one{# чейр. мурун}other{# чейр. мурун}',\n      F:'one{# чейр. кийин}other{# чейр. кийин}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'азыр'},\n      P:'one{# секунд мурун}other{# секунд мурун}',\n      F:'one{# секунддан кийин}other{# секунддан кийин}',\n    },\n    SHORT:{\n      R:{'0':'азыр'},\n      P:'one{# сек. мурун}other{# сек. мурун}',\n      F:'one{# сек. кийин}other{# сек. кийин}',\n    },\n    NARROW:{\n      R:{'0':'азыр'},\n      P:'one{# сек. мурн}other{# сек. мурн}',\n      F:'one{# сек. кийн}other{# сек. кийн}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'өткөн аптада','0':'ушул аптада','1':'келерки аптада'},\n      P:'one{# апта мурун}other{# апта мурун}',\n      F:'one{# аптадан кийин}other{# аптадан кийин}',\n    },\n    SHORT:{\n      R:{'-1':'өткөн апт.','0':'ушул апт.','1':'келерки апт.'},\n      P:'one{# апт. мурун}other{# апт. мурун}',\n      F:'one{# апт. кийин}other{# апт. кийин}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'былтыр','0':'быйыл','1':'эмдиги жылы'},\n      P:'one{# жыл мурун}other{# жыл мурун}',\n      F:'one{# жылдан кийин}other{# жылдан кийин}',\n    },\n    SHORT:{\n      R:{'-1':'былтыр','0':'быйыл','1':'эмдиги жылы'},\n      P:'one{# жыл мурун}other{# жыл мурун}',\n      F:'one{# жыл. кийин}other{# жыл. кийин}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ln =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Lóbi elékí','0':'Lɛlɔ́','1':'Lóbi ekoyâ'},\n      P:'other{-# d}',\n      F:'other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'this hour'},\n      P:'other{-# h}',\n      F:'other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'this minute'},\n      P:'other{-# min}',\n      F:'other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'last month','0':'this month','1':'next month'},\n      P:'other{-# m}',\n      F:'other{+# m}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'last quarter','0':'this quarter','1':'next quarter'},\n      P:'other{-# Q}',\n      F:'other{+# Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'now'},\n      P:'other{-# s}',\n      F:'other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'last week','0':'this week','1':'next week'},\n      P:'other{-# w}',\n      F:'other{+# w}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'last year','0':'this year','1':'next year'},\n      P:'other{-# y}',\n      F:'other{+# y}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lo =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ມື້ວານ','-2':'ມື້ກ່ອນ','0':'ມື້ນີ້','1':'ມື້ອື່ນ','2':'ມື້ຮື'},\n      P:'other{# ມື້ກ່ອນ}',\n      F:'other{ໃນອີກ # ມື້}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ຊົ່ວໂມງນີ້'},\n      P:'other{# ຊົ່ວໂມງກ່ອນ}',\n      F:'other{ໃນອີກ # ຊົ່ວໂມງ}',\n    },\n    SHORT:{\n      R:{'0':'ຊົ່ວໂມງນີ້'},\n      P:'other{# ຊມ. ກ່ອນ}',\n      F:'other{ໃນອີກ # ຊມ.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ນາທີນີ້'},\n      P:'other{# ນາທີກ່ອນ}',\n      F:'other{# ໃນອີກ 0 ນາທີ}',\n    },\n    SHORT:{\n      R:{'0':'ນາທີນີ້'},\n      P:'other{# ນທ. ກ່ອນ}',\n      F:'other{ໃນ # ນທ.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ເດືອນແລ້ວ','0':'ເດືອນນີ້','1':'ເດືອນໜ້າ'},\n      P:'other{# ເດືອນກ່ອນ}',\n      F:'other{ໃນອີກ # ເດືອນ}',\n    },\n    SHORT:{\n      R:{'-1':'ເດືອນແລ້ວ','0':'ເດືອນນີ້','1':'ເດືອນໜ້າ'},\n      P:'other{# ດ. ກ່ອນ}',\n      F:'other{ໃນອີກ # ດ.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'ໄຕຣມາດກ່ອນໜ້າ','0':'ໄຕຣມາດນີ້','1':'ໄຕຣມາດໜ້າ'},\n      P:'other{# ໄຕຣມາດກ່ອນ}',\n      F:'other{ໃນອີກ # ໄຕຣມາດ}',\n    },\n    SHORT:{\n      R:{'-1':'ໄຕຣມາດກ່ອນໜ້າ','0':'ໄຕຣມາດນີ້','1':'ໄຕຣມາດໜ້າ'},\n      P:'other{# ຕມ. ກ່ອນ}',\n      F:'other{ໃນ # ຕມ.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ຕອນນີ້'},\n      P:'other{# ວິນາທີກ່ອນ}',\n      F:'other{ໃນອີກ # ວິນາທີ}',\n    },\n    SHORT:{\n      R:{'0':'ຕອນນີ້'},\n      P:'other{# ວິ. ກ່ອນ}',\n      F:'other{ໃນ # ວິ.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ອາທິດແລ້ວ','0':'ອາທິດນີ້','1':'ອາທິດໜ້າ'},\n      P:'other{# ອາທິດກ່ອນ}',\n      F:'other{ໃນອີກ # ອາທິດ}',\n    },\n    SHORT:{\n      R:{'-1':'ອາທິດແລ້ວ','0':'ອາທິດນີ້','1':'ອາທິດໜ້າ'},\n      P:'other{# ອທ. ກ່ອນ}',\n      F:'other{ໃນອີກ # ອທ.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ປີກາຍ','0':'ປີນີ້','1':'ປີໜ້າ'},\n      P:'other{# ປີກ່ອນ}',\n      F:'other{ໃນອີກ # ປີ}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lt =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'vakar','-2':'užvakar','0':'šiandien','1':'rytoj','2':'poryt'},\n      P:'few{prieš # dienas}many{prieš # dienos}one{prieš # dieną}other{prieš # dienų}',\n      F:'few{po # dienų}many{po # dienos}one{po # dienos}other{po # dienų}',\n    },\n    SHORT:{\n      R:{'-1':'vakar','-2':'užvakar','0':'šiandien','1':'rytoj','2':'poryt'},\n      P:'few{prieš # d.}many{prieš # d.}one{prieš # d.}other{prieš # d.}',\n      F:'few{po # d.}many{po # d.}one{po # d.}other{po # d.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'šią valandą'},\n      P:'few{prieš # valandas}many{prieš # valandos}one{prieš # valandą}other{prieš # valandų}',\n      F:'few{po # valandų}many{po # valandos}one{po # valandos}other{po # valandų}',\n    },\n    SHORT:{\n      R:{'0':'šią valandą'},\n      P:'few{prieš # val.}many{prieš # val.}one{prieš # val.}other{prieš # val.}',\n      F:'few{po # val.}many{po # val.}one{po # val.}other{po # val.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'šią minutę'},\n      P:'few{prieš # minutes}many{prieš # minutės}one{prieš # minutę}other{prieš # minučių}',\n      F:'few{po # minučių}many{po # minutės}one{po # minutės}other{po # minučių}',\n    },\n    SHORT:{\n      R:{'0':'šią minutę'},\n      P:'few{prieš # min.}many{prieš # min.}one{prieš # min.}other{prieš # min.}',\n      F:'few{po # min.}many{po # min.}one{po # min.}other{po # min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'praėjusį mėnesį','0':'šį mėnesį','1':'kitą mėnesį'},\n      P:'few{prieš # mėnesius}many{prieš # mėnesio}one{prieš # mėnesį}other{prieš # mėnesių}',\n      F:'few{po # mėnesių}many{po # mėnesio}one{po # mėnesio}other{po # mėnesių}',\n    },\n    SHORT:{\n      R:{'-1':'praėjusį mėnesį','0':'šį mėnesį','1':'kitą mėnesį'},\n      P:'few{prieš # mėn.}many{prieš # mėn.}one{prieš # mėn.}other{prieš # mėn.}',\n      F:'few{po # mėn.}many{po # mėn.}one{po # mėn.}other{po # mėn.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'praėjęs ketvirtis','0':'šis ketvirtis','1':'kitas ketvirtis'},\n      P:'few{prieš # ketvirčius}many{prieš # ketvirčio}one{prieš # ketvirtį}other{prieš # ketvirčių}',\n      F:'few{po # ketvirčių}many{po # ketvirčio}one{po # ketvirčio}other{po # ketvirčių}',\n    },\n    SHORT:{\n      R:{'-1':'praėjęs ketvirtis','0':'šis ketvirtis','1':'kitas ketvirtis'},\n      P:'few{prieš # ketv.}many{prieš # ketv.}one{prieš # ketv.}other{prieš # ketv.}',\n      F:'few{po # ketv.}many{po # ketv.}one{po # ketv.}other{po # ketv.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'dabar'},\n      P:'few{prieš # sekundes}many{prieš # sekundės}one{prieš # sekundę}other{prieš # sekundžių}',\n      F:'few{po # sekundžių}many{po # sekundės}one{po # sekundės}other{po # sekundžių}',\n    },\n    SHORT:{\n      R:{'0':'dabar'},\n      P:'few{prieš # sek.}many{prieš # sek.}one{prieš # sek.}other{prieš # sek.}',\n      F:'few{po # sek.}many{po # sek.}one{po # sek.}other{po # sek.}',\n    },\n    NARROW:{\n      R:{'0':'dabar'},\n      P:'few{prieš # s}many{prieš # s}one{prieš # s}other{prieš # s}',\n      F:'few{po # s}many{po # s}one{po # s}other{po # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'praėjusią savaitę','0':'šią savaitę','1':'kitą savaitę'},\n      P:'few{prieš # savaites}many{prieš # savaitės}one{prieš # savaitę}other{prieš # savaičių}',\n      F:'few{po # savaičių}many{po # savaitės}one{po # savaitės}other{po # savaičių}',\n    },\n    SHORT:{\n      R:{'-1':'praėjusią savaitę','0':'šią savaitę','1':'kitą savaitę'},\n      P:'few{prieš # sav.}many{prieš # sav.}one{prieš # sav.}other{prieš # sav.}',\n      F:'few{po # sav.}many{po # sav.}one{po # sav.}other{po # sav.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'praėjusiais metais','0':'šiais metais','1':'kitais metais'},\n      P:'few{prieš # metus}many{prieš # metų}one{prieš # metus}other{prieš # metų}',\n      F:'few{po # metų}many{po # metų}one{po # metų}other{po # metų}',\n    },\n    SHORT:{\n      R:{'-1':'praėjusiais metais','0':'šiais metais','1':'kitais metais'},\n      P:'few{prieš # m.}many{prieš # m.}one{prieš # m.}other{prieš # m.}',\n      F:'few{po # m.}many{po # m.}one{po # m.}other{po # m.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_lv =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'vakar','-2':'aizvakar','0':'šodien','1':'rīt','2':'parīt'},\n      P:'one{pirms # dienas}other{pirms # dienām}zero{pirms # dienām}',\n      F:'one{pēc # dienas}other{pēc # dienām}zero{pēc # dienām}',\n    },\n    SHORT:{\n      R:{'-1':'vakar','-2':'aizvakar','0':'šodien','1':'rīt','2':'parīt'},\n      P:'one{pirms # d.}other{pirms # d.}zero{pirms # d.}',\n      F:'one{pēc # d.}other{pēc # d.}zero{pēc # d.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'šajā stundā'},\n      P:'one{pirms # stundas}other{pirms # stundām}zero{pirms # stundām}',\n      F:'one{pēc # stundas}other{pēc # stundām}zero{pēc # stundām}',\n    },\n    SHORT:{\n      R:{'0':'šajā stundā'},\n      P:'one{pirms # st.}other{pirms # st.}zero{pirms # st.}',\n      F:'one{pēc # st.}other{pēc # st.}zero{pēc # st.}',\n    },\n    NARROW:{\n      R:{'0':'šajā stundā'},\n      P:'one{pirms # h}other{pirms # h}zero{pirms # h}',\n      F:'one{pēc # h}other{pēc # h}zero{pēc # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'šajā minūtē'},\n      P:'one{pirms # minūtes}other{pirms # minūtēm}zero{pirms # minūtēm}',\n      F:'one{pēc # minūtes}other{pēc # minūtēm}zero{pēc # minūtēm}',\n    },\n    SHORT:{\n      R:{'0':'šajā minūtē'},\n      P:'one{pirms # min.}other{pirms # min.}zero{pirms # min.}',\n      F:'one{pēc # min.}other{pēc # min.}zero{pēc # min.}',\n    },\n    NARROW:{\n      R:{'0':'šajā minūtē'},\n      P:'one{pirms # min}other{pirms # min}zero{pirms # min}',\n      F:'one{pēc # min}other{pēc # min}zero{pēc # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'pagājušajā mēnesī','0':'šajā mēnesī','1':'nākamajā mēnesī'},\n      P:'one{pirms # mēneša}other{pirms # mēnešiem}zero{pirms # mēnešiem}',\n      F:'one{pēc # mēneša}other{pēc # mēnešiem}zero{pēc # mēnešiem}',\n    },\n    SHORT:{\n      R:{'-1':'pagājušajā mēnesī','0':'šajā mēnesī','1':'nākamajā mēnesī'},\n      P:'one{pirms # mēn.}other{pirms # mēn.}zero{pirms # mēn.}',\n      F:'one{pēc # mēn.}other{pēc # mēn.}zero{pēc # mēn.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'pēdējais ceturksnis','0':'šis ceturksnis','1':'nākamais ceturksnis'},\n      P:'one{pirms # ceturkšņa}other{pirms # ceturkšņiem}zero{pirms # ceturkšņiem}',\n      F:'one{pēc # ceturkšņa}other{pēc # ceturkšņiem}zero{pēc # ceturkšņiem}',\n    },\n    SHORT:{\n      R:{'-1':'pēdējais ceturksnis','0':'šis ceturksnis','1':'nākamais ceturksnis'},\n      P:'one{pirms # cet.}other{pirms # cet.}zero{pirms # cet.}',\n      F:'one{pēc # cet.}other{pēc # cet.}zero{pēc # cet.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'tagad'},\n      P:'one{pirms # sekundes}other{pirms # sekundēm}zero{pirms # sekundēm}',\n      F:'one{pēc # sekundes}other{pēc # sekundēm}zero{pēc # sekundēm}',\n    },\n    SHORT:{\n      R:{'0':'tagad'},\n      P:'one{pirms # sek.}other{pirms # sek.}zero{pirms # sek.}',\n      F:'one{pēc # sek.}other{pēc # sek.}zero{pēc # sek.}',\n    },\n    NARROW:{\n      R:{'0':'tagad'},\n      P:'one{pirms # s}other{pirms # s}zero{pirms # s}',\n      F:'one{pēc # s}other{pēc # s}zero{pēc # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'pagājušajā nedēļā','0':'šajā nedēļā','1':'nākamajā nedēļā'},\n      P:'one{pirms # nedēļas}other{pirms # nedēļām}zero{pirms # nedēļām}',\n      F:'one{pēc # nedēļas}other{pēc # nedēļām}zero{pēc # nedēļām}',\n    },\n    SHORT:{\n      R:{'-1':'pagājušajā nedēļā','0':'šajā nedēļā','1':'nākamajā nedēļā'},\n      P:'one{pirms # ned.}other{pirms # ned.}zero{pirms # ned.}',\n      F:'one{pēc # ned.}other{pēc # ned.}zero{pēc # ned.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'pagājušajā gadā','0':'šajā gadā','1':'nākamajā gadā'},\n      P:'one{pirms # gada}other{pirms # gadiem}zero{pirms # gadiem}',\n      F:'one{pēc # gada}other{pēc # gadiem}zero{pēc # gadiem}',\n    },\n    SHORT:{\n      R:{'-1':'pagājušajā gadā','0':'šajā gadā','1':'nākamajā gadā'},\n      P:'one{pirms # g.}other{pirms # g.}zero{pirms # g.}',\n      F:'one{pēc # g.}other{pēc # g.}zero{pēc # g.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mk =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'вчера','-2':'завчера','0':'денес','1':'утре','2':'задутре'},\n      P:'one{пред # ден}other{пред # дена}',\n      F:'one{за # ден}other{за # дена}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'часов'},\n      P:'one{пред # час}other{пред # часа}',\n      F:'one{за # час}other{за # часа}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'оваа минута'},\n      P:'one{пред # минута}other{пред # минути}',\n      F:'one{за # минута}other{за # минути}',\n    },\n    SHORT:{\n      R:{'0':'оваа минута'},\n      P:'one{пред # мин.}other{пред # мин.}',\n      F:'one{за # мин.}other{за # мин.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'минатиот месец','0':'овој месец','1':'следниот месец'},\n      P:'one{пред # месец}other{пред # месеци}',\n      F:'one{за # месец}other{за # месеци}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'последното тромесечје','0':'ова тромесечје','1':'следното тромесечје'},\n      P:'one{пред # тромесечје}other{пред # тромесечја}',\n      F:'one{за # тромесечје}other{за # тромесечја}',\n    },\n    SHORT:{\n      R:{'-1':'последното тромесечје','0':'ова тромесечје','1':'следното тромесечје'},\n      P:'one{пред # тромес.}other{пред # тромес.}',\n      F:'one{за # тромес.}other{за # тромес.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'сега'},\n      P:'one{пред # секунда}other{пред # секунди}',\n      F:'one{за # секунда}other{за # секунди}',\n    },\n    SHORT:{\n      R:{'0':'сега'},\n      P:'one{пред # сек.}other{пред # сек.}',\n      F:'one{за # сек.}other{за # сек.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'минатата седмица','0':'оваа седмица','1':'следната седмица'},\n      P:'one{пред # седмица}other{пред # седмици}',\n      F:'one{за # седмица}other{за # седмици}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'минатата година','0':'оваа година','1':'следната година'},\n      P:'one{пред # година}other{пред # години}',\n      F:'one{за # година}other{за # години}',\n    },\n    SHORT:{\n      R:{'-1':'минатата година','0':'оваа година','1':'следната година'},\n      P:'one{пред # год.}other{пред # год.}',\n      F:'one{за # год.}other{за # год.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ml =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ഇന്നലെ','-2':'മിനിഞ്ഞാന്ന്','0':'ഇന്ന്','1':'നാളെ','2':'മറ്റന്നാൾ'},\n      P:'one{# ദിവസം മുമ്പ്}other{# ദിവസം മുമ്പ്}',\n      F:'one{# ദിവസത്തിൽ}other{# ദിവസത്തിൽ}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ഈ മണിക്കൂറിൽ'},\n      P:'one{# മണിക്കൂർ മുമ്പ്}other{# മണിക്കൂർ മുമ്പ്}',\n      F:'one{# മണിക്കൂറിൽ}other{# മണിക്കൂറിൽ}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ഈ മിനിറ്റിൽ'},\n      P:'one{# മിനിറ്റ് മുമ്പ്}other{# മിനിറ്റ് മുമ്പ്}',\n      F:'one{# മിനിറ്റിൽ}other{# മിനിറ്റിൽ}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'കഴിഞ്ഞ മാസം','0':'ഈ മാസം','1':'അടുത്ത മാസം'},\n      P:'one{# മാസം മുമ്പ്}other{# മാസം മുമ്പ്}',\n      F:'one{# മാസത്തിൽ}other{# മാസത്തിൽ}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'കഴിഞ്ഞ പാദം','0':'ഈ പാദം','1':'അടുത്ത പാദം'},\n      P:'one{# പാദം മുമ്പ്}other{# പാദം മുമ്പ്}',\n      F:'one{# പാദത്തിൽ}other{# പാദത്തിൽ}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ഇപ്പോൾ'},\n      P:'one{# സെക്കൻഡ് മുമ്പ്}other{# സെക്കൻഡ് മുമ്പ്}',\n      F:'one{# സെക്കൻഡിൽ}other{# സെക്കൻഡിൽ}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'കഴിഞ്ഞ ആഴ്‌ച','0':'ഈ ആഴ്ച','1':'അടുത്ത ആഴ്ച'},\n      P:'one{# ആഴ്ച മുമ്പ്}other{# ആഴ്ച മുമ്പ്}',\n      F:'one{# ആഴ്ചയിൽ}other{# ആഴ്ചയിൽ}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'കഴിഞ്ഞ വർഷം','0':'ഈ വർ‌ഷം','1':'അടുത്തവർഷം'},\n      P:'one{# വർഷം മുമ്പ്}other{# വർഷം മുമ്പ്}',\n      F:'one{# വർഷത്തിൽ}other{# വർഷത്തിൽ}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mn =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'өчигдөр','-2':'уржигдар','0':'өнөөдөр','1':'маргааш','2':'нөгөөдөр'},\n      P:'one{# өдрийн өмнө}other{# өдрийн өмнө}',\n      F:'one{# өдрийн дараа}other{# өдрийн дараа}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'энэ цаг'},\n      P:'one{# цагийн өмнө}other{# цагийн өмнө}',\n      F:'one{# цагийн дараа}other{# цагийн дараа}',\n    },\n    SHORT:{\n      R:{'0':'энэ цаг'},\n      P:'one{# ц өмнө}other{# ц өмнө}',\n      F:'one{# ц дараа}other{# ц дараа}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'энэ минут'},\n      P:'one{# минутын өмнө}other{# минутын өмнө}',\n      F:'one{# минутын дараа}other{# минутын дараа}',\n    },\n    SHORT:{\n      R:{'0':'энэ минут'},\n      P:'one{# мин өмнө}other{# мин өмнө}',\n      F:'one{# мин дараа}other{# мин дараа}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'өнгөрсөн сар','0':'энэ сар','1':'ирэх сар'},\n      P:'one{# сарын өмнө}other{# сарын өмнө}',\n      F:'one{# сарын дараа}other{# сарын дараа}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'өнгөрсөн улирал','0':'энэ улирал','1':'дараагийн улирал'},\n      P:'one{# улирлын өмнө}other{# улирлын өмнө}',\n      F:'one{# улирлын дараа}other{# улирлын дараа}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'одоо'},\n      P:'one{# секундын өмнө}other{# секундын өмнө}',\n      F:'one{# секундын дараа}other{# секундын дараа}',\n    },\n    SHORT:{\n      R:{'0':'одоо'},\n      P:'one{# сек өмнө}other{# сек өмнө}',\n      F:'one{# сек дараа}other{# сек дараа}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'өнгөрсөн долоо хоног','0':'энэ долоо хоног','1':'ирэх долоо хоног'},\n      P:'one{# долоо хоногийн өмнө}other{# долоо хоногийн өмнө}',\n      F:'one{# долоо хоногийн дараа}other{# долоо хоногийн дараа}',\n    },\n    SHORT:{\n      R:{'-1':'өнгөрсөн долоо хоног','0':'энэ долоо хоног','1':'ирэх долоо хоног'},\n      P:'one{# 7 хоногийн өмнө}other{# 7 хоногийн өмнө}',\n      F:'one{# 7 хоногийн дараа}other{# 7 хоногийн дараа}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'өнгөрсөн жил','0':'энэ жил','1':'ирэх жил'},\n      P:'one{# жилийн өмнө}other{# жилийн өмнө}',\n      F:'one{# жилийн дараа}other{# жилийн дараа}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mo =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ieri','-2':'alaltăieri','0':'azi','1':'mâine','2':'poimâine'},\n      P:'few{acum # zile}one{acum # zi}other{acum # de zile}',\n      F:'few{peste # zile}one{peste # zi}other{peste # de zile}',\n    },\n    NARROW:{\n      R:{'-1':'ieri','-2':'alaltăieri','0':'azi','1':'mâine','2':'poimâine'},\n      P:'few{-# zile}one{-# zi}other{-# zile}',\n      F:'few{+# zile}one{+# zi}other{+# zile}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ora aceasta'},\n      P:'few{acum # ore}one{acum # oră}other{acum # de ore}',\n      F:'few{peste # ore}one{peste # oră}other{peste # de ore}',\n    },\n    SHORT:{\n      R:{'0':'ora aceasta'},\n      P:'few{acum # h}one{acum # h}other{acum # h}',\n      F:'few{peste # h}one{peste # h}other{peste # h}',\n    },\n    NARROW:{\n      R:{'0':'ora aceasta'},\n      P:'few{-# h}one{-# h}other{-# h}',\n      F:'few{+# h}one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'minutul acesta'},\n      P:'few{acum # minute}one{acum # minut}other{acum # de minute}',\n      F:'few{peste # minute}one{peste # minut}other{peste # de minute}',\n    },\n    SHORT:{\n      R:{'0':'minutul acesta'},\n      P:'few{acum # min.}one{acum # min.}other{acum # min.}',\n      F:'few{peste # min.}one{peste # min.}other{peste # min.}',\n    },\n    NARROW:{\n      R:{'0':'minutul acesta'},\n      P:'few{-# m}one{-# m}other{-# m}',\n      F:'few{+# m}one{+# m}other{+# m}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'luna trecută','0':'luna aceasta','1':'luna viitoare'},\n      P:'few{acum # luni}one{acum # lună}other{acum # de luni}',\n      F:'few{peste # luni}one{peste # lună}other{peste # de luni}',\n    },\n    SHORT:{\n      R:{'-1':'luna trecută','0':'luna aceasta','1':'luna viitoare'},\n      P:'few{acum # luni}one{acum # lună}other{acum # luni}',\n      F:'few{peste # luni}one{peste # lună}other{peste # luni}',\n    },\n    NARROW:{\n      R:{'-1':'luna trecută','0':'luna aceasta','1':'luna viitoare'},\n      P:'few{-# luni}one{-# lună}other{-# luni}',\n      F:'few{+# luni}one{+# lună}other{+# luni}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'trimestrul trecut','0':'trimestrul acesta','1':'trimestrul viitor'},\n      P:'few{acum # trimestre}one{acum # trimestru}other{acum # de trimestre}',\n      F:'few{peste # trimestre}one{peste # trimestru}other{peste # de trimestre}',\n    },\n    SHORT:{\n      R:{'-1':'trim. trecut','0':'trim. acesta','1':'trim. viitor'},\n      P:'few{acum # trim.}one{acum # trim.}other{acum # trim.}',\n      F:'few{peste # trim.}one{peste # trim.}other{peste # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. trecut','0':'trim. acesta','1':'trim. viitor'},\n      P:'few{-# trim.}one{-# trim.}other{-# trim.}',\n      F:'few{+# trim.}one{+# trim.}other{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'acum'},\n      P:'few{acum # secunde}one{acum # secundă}other{acum # de secunde}',\n      F:'few{peste # secunde}one{peste # secundă}other{peste # de secunde}',\n    },\n    SHORT:{\n      R:{'0':'acum'},\n      P:'few{acum # sec.}one{acum # sec.}other{acum # sec.}',\n      F:'few{peste # sec.}one{peste # sec.}other{peste # sec.}',\n    },\n    NARROW:{\n      R:{'0':'acum'},\n      P:'few{-# s}one{-# s}other{-# s}',\n      F:'few{+# s}one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'săptămâna trecută','0':'săptămâna aceasta','1':'săptămâna viitoare'},\n      P:'few{acum # săptămâni}one{acum # săptămână}other{acum # de săptămâni}',\n      F:'few{peste # săptămâni}one{peste # săptămână}other{peste # de săptămâni}',\n    },\n    SHORT:{\n      R:{'-1':'săpt. trecută','0':'săpt. aceasta','1':'săpt. viitoare'},\n      P:'few{acum # săpt.}one{acum # săpt.}other{acum # săpt.}',\n      F:'few{peste # săpt.}one{peste # săpt.}other{peste # săpt.}',\n    },\n    NARROW:{\n      R:{'-1':'săpt. trecută','0':'săptămâna aceasta','1':'săpt. viitoare'},\n      P:'few{-# săpt.}one{-# săpt.}other{-# săpt.}',\n      F:'few{+# săpt.}one{+# săpt.}other{+# săpt.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'anul trecut','0':'anul acesta','1':'anul viitor'},\n      P:'few{acum # ani}one{acum # an}other{acum # de ani}',\n      F:'few{peste # ani}one{peste # an}other{peste # de ani}',\n    },\n    NARROW:{\n      R:{'-1':'anul trecut','0':'anul acesta','1':'anul viitor'},\n      P:'few{-# ani}one{-# an}other{-# ani}',\n      F:'few{+# ani}one{+# an}other{+# ani}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mr =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'काल','0':'आज','1':'उद्या'},\n      P:'one{# दिवसापूर्वी}other{# दिवसांपूर्वी}',\n      F:'one{येत्या # दिवसामध्ये}other{येत्या # दिवसांमध्ये}',\n    },\n    SHORT:{\n      R:{'-1':'काल','0':'आज','1':'उद्या'},\n      P:'one{# दिवसापूर्वी}other{# दिवसांपूर्वी}',\n      F:'one{# दिवसामध्ये}other{येत्या # दिवसांमध्ये}',\n    },\n    NARROW:{\n      R:{'-1':'काल','0':'आज','1':'उद्या'},\n      P:'one{# दिवसापूर्वी}other{# दिवसांपूर्वी}',\n      F:'one{# दिवसामध्ये}other{# दिवसांमध्ये}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'तासात'},\n      P:'one{# तासापूर्वी}other{# तासांपूर्वी}',\n      F:'one{# तासामध्ये}other{# तासांमध्ये}',\n    },\n    NARROW:{\n      R:{'0':'तासात'},\n      P:'one{# तासापूर्वी}other{# तासांपूर्वी}',\n      F:'one{येत्या # तासामध्ये}other{येत्या # तासांमध्ये}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'या मिनिटात'},\n      P:'one{# मिनिटापूर्वी}other{# मिनिटांपूर्वी}',\n      F:'one{# मिनिटामध्ये}other{# मिनिटांमध्ये}',\n    },\n    SHORT:{\n      R:{'0':'या मिनिटात'},\n      P:'one{# मिनि. पूर्वी}other{# मिनि. पूर्वी}',\n      F:'one{# मिनि. मध्ये}other{# मिनि. मध्ये}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'मागील महिना','0':'हा महिना','1':'पुढील महिना'},\n      P:'one{# महिन्यापूर्वी}other{# महिन्यांपूर्वी}',\n      F:'one{येत्या # महिन्यामध्ये}other{येत्या # महिन्यांमध्ये}',\n    },\n    SHORT:{\n      R:{'-1':'मागील महिना','0':'हा महिना','1':'पुढील महिना'},\n      P:'one{# महिन्यापूर्वी}other{# महिन्यांपूर्वी}',\n      F:'one{# महिन्यामध्ये}other{# महिन्यामध्ये}',\n    },\n    NARROW:{\n      R:{'-1':'मागील महिना','0':'हा महिना','1':'पुढील महिना'},\n      P:'one{# महिन्यापूर्वी}other{# महिन्यांपूर्वी}',\n      F:'one{# महिन्यामध्ये}other{# महिन्यांमध्ये}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'मागील तिमाही','0':'ही तिमाही','1':'पुढील तिमाही'},\n      P:'one{# तिमाहीपूर्वी}other{# तिमाहींपूर्वी}',\n      F:'one{# तिमाहीमध्ये}other{# तिमाहींमध्ये}',\n    },\n    SHORT:{\n      R:{'-1':'मागील तिमाही','0':'ही तिमाही','1':'पुढील तिमाही'},\n      P:'one{# तिमाहीपूर्वी}other{# तिमाहींपूर्वी}',\n      F:'one{येत्या # तिमाहीमध्ये}other{येत्या # तिमाहींमध्ये}',\n    },\n    NARROW:{\n      R:{'-1':'मागील तिमाही','0':'ही तिमाही','1':'पुढील तिमाही'},\n      P:'one{# तिमाहीपूर्वी}other{# तिमाहींपूर्वी}',\n      F:'one{# तिमाहीमध्ये}other{# तिमाहींमध्ये}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'आत्ता'},\n      P:'one{# सेकंदापूर्वी}other{# सेकंदांपूर्वी}',\n      F:'one{# सेकंदामध्ये}other{# सेकंदांमध्ये}',\n    },\n    SHORT:{\n      R:{'0':'आत्ता'},\n      P:'one{# से. पूर्वी}other{# से. पूर्वी}',\n      F:'one{# से. मध्ये}other{# से. मध्ये}',\n    },\n    NARROW:{\n      R:{'0':'आत्ता'},\n      P:'one{# से. पूर्वी}other{# से. पूर्वी}',\n      F:'one{# से. मध्ये}other{येत्या # से. मध्ये}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'मागील आठवडा','0':'हा आठवडा','1':'पुढील आठवडा'},\n      P:'one{# आठवड्यापूर्वी}other{# आठवड्यांपूर्वी}',\n      F:'one{# आठवड्यामध्ये}other{# आठवड्यांमध्ये}',\n    },\n    SHORT:{\n      R:{'-1':'मागील आठवडा','0':'हा आठवडा','1':'पुढील आठवडा'},\n      P:'one{# आठवड्यापूर्वी}other{# आठवड्यांपूर्वी}',\n      F:'one{येत्या # आठवड्यामध्ये}other{येत्या # आठवड्यांमध्ये}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'मागील वर्ष','0':'हे वर्ष','1':'पुढील वर्ष'},\n      P:'one{# वर्षापूर्वी}other{# वर्षांपूर्वी}',\n      F:'one{येत्या # वर्षामध्ये}other{येत्या # वर्षांमध्ये}',\n    },\n    SHORT:{\n      R:{'-1':'मागील वर्ष','0':'हे वर्ष','1':'पुढील वर्ष'},\n      P:'one{# वर्षापूर्वी}other{# वर्षांपूर्वी}',\n      F:'one{# वर्षामध्ये}other{# वर्षांमध्ये}',\n    },\n    NARROW:{\n      R:{'-1':'मागील वर्ष','0':'हे वर्ष','1':'पुढील वर्ष'},\n      P:'one{# वर्षापूर्वी}other{# वर्षांपूर्वी}',\n      F:'one{येत्या # वर्षामध्ये}other{येत्या # वर्षांमध्ये}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ms =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'semalam','-2':'kelmarin','0':'hari ini','1':'esok','2':'lusa'},\n      P:'other{# hari lalu}',\n      F:'other{dalam # hari}',\n    },\n    SHORT:{\n      R:{'-1':'semlm','-2':'kelmarin','0':'hari ini','1':'esok','2':'lusa'},\n      P:'other{# hari lalu}',\n      F:'other{dlm # hari}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'jam ini'},\n      P:'other{# jam lalu}',\n      F:'other{dalam # jam}',\n    },\n    SHORT:{\n      R:{'0':'jam ini'},\n      P:'other{# jam lalu}',\n      F:'other{dlm # jam}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'pada minit ini'},\n      P:'other{# minit lalu}',\n      F:'other{dalam # minit}',\n    },\n    SHORT:{\n      R:{'0':'pada minit ini'},\n      P:'other{# min lalu}',\n      F:'other{dlm # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'bulan lalu','0':'bulan ini','1':'bulan depan'},\n      P:'other{# bulan lalu}',\n      F:'other{dalam # bulan}',\n    },\n    SHORT:{\n      R:{'-1':'bln lalu','0':'bln ini','1':'bln depan'},\n      P:'other{# bln lalu}',\n      F:'other{dlm # bln}',\n    },\n    NARROW:{\n      R:{'-1':'bln lalu','0':'bln ini','1':'bln depan'},\n      P:'other{# bulan lalu}',\n      F:'other{dlm # bln}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'suku tahun lalu','0':'suku tahun ini','1':'suku tahun seterusnya'},\n      P:'other{# suku tahun lalu}',\n      F:'other{dalam # suku tahun}',\n    },\n    SHORT:{\n      R:{'-1':'suku lepas','0':'suku ini','1':'suku seterusnya'},\n      P:'other{# suku thn lalu}',\n      F:'other{dlm # suku thn}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'sekarang'},\n      P:'other{# saat lalu}',\n      F:'other{dalam # saat}',\n    },\n    SHORT:{\n      R:{'0':'sekarang'},\n      P:'other{# saat lalu}',\n      F:'other{dlm # saat}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'minggu lalu','0':'minggu ini','1':'minggu depan'},\n      P:'other{# minggu lalu}',\n      F:'other{dalam # minggu}',\n    },\n    SHORT:{\n      R:{'-1':'mng lepas','0':'mng ini','1':'mng depan'},\n      P:'other{# mgu lalu}',\n      F:'other{dlm # mgu}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'tahun lalu','0':'tahun ini','1':'tahun depan'},\n      P:'other{# tahun lalu}',\n      F:'other{dalam # tahun}',\n    },\n    SHORT:{\n      R:{'-1':'thn lepas','0':'thn ini','1':'thn depan'},\n      P:'other{# thn lalu}',\n      F:'other{dalam # thn}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_mt =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'lbieraħ','0':'illum','1':'għada'},\n      P:'few{# ġranet ilu}many{#-il ġurnata ilu}one{ġurnata ilu}other{#-il ġurnata ilu}',\n      F:'few{fi żmien # ġurnata oħra}many{fi żmien # ġurnata oħra}one{fi żmien ġurnata}other{fi żmien # ġurnata oħra}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'din is-siegħa'},\n      P:'few{# sigħat ilu}many{# sigħat ilu}one{siegħa ilu}other{# sigħat ilu}',\n      F:'few{fi żmien # sigħat}many{fi żmien# sigħat}one{fi żmien siegħa oħra}other{fi żmien # sigħat}',\n    },\n    SHORT:{\n      R:{'0':'din is-siegħa'},\n      P:'few{# sigħat ilu}many{# sigħat ilu}one{siegħa ilu}other{# sigħat ilu}',\n      F:'few{fi żmien # sigħat}many{+# h}one{fi żmien siegħa oħra}other{fi żmien # sigħat}',\n    },\n    NARROW:{\n      R:{'0':'din is-siegħa'},\n      P:'few{# sigħat ilu}many{# sigħat ilu}one{siegħa ilu}other{# sigħat ilu}',\n      F:'few{fi żmien # sigħat}many{fi żmien # sigħat}one{fi żmien siegħa oħra}other{fi żmien # sigħat}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'din il-minuta'},\n      P:'few{# minuti ilu}many{# minuti ilu}one{minuta ilu}other{# minuti ilu}',\n      F:'few{sa # minuti oħra}many{sa # minuti oħra}one{sa minuta oħra}other{sa # minuti oħra}',\n    },\n    SHORT:{\n      R:{'0':'din il-minuta'},\n      P:'few{# min. ilu}many{# minuti ilu}one{min. ilu}other{# min. ilu}',\n      F:'few{sa # min. oħra}many{sa # min. oħra}one{sa min. oħra}other{sa # min. oħra}',\n    },\n    NARROW:{\n      R:{'0':'din il-minuta'},\n      P:'few{# min. ilu}many{# min. ilu}one{min. ilu}other{# min. ilu}',\n      F:'few{sa # min. oħra}many{+# min}one{sa min. oħra}other{sa # min. oħra}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'Ix-xahar li għadda','0':'Dan ix-xahar','1':'Ix-xahar id-dieħel'},\n      P:'few{# xhur ilu}many{# xhur ilu}one{xahar ilu}other{# xhur ilu}',\n      F:'few{fi # xhur oħra}many{fi # xhur oħra}one{sa xahar ieħor}other{fi # xhur oħra}',\n    },\n    SHORT:{\n      R:{'-1':'Ix-xahar li għadda','0':'Dan ix-xahar','1':'Ix-xahar id-dieħel'},\n      P:'few{# xhur ilu}many{# xhur ilu}one{# xahar ilu}other{# xhur ilu}',\n      F:'few{sa # xhur oħra}many{sa # xhur oħra}one{sa xahar ieħor}other{sa # xhur oħra}',\n    },\n    NARROW:{\n      R:{'-1':'Ix-xahar li għadda','0':'Dan ix-xahar','1':'Ix-xahar id-dieħel'},\n      P:'few{# xhur ilu}many{# xhur ilu}one{xahar ilu}other{# xhur ilu}',\n      F:'few{sa # xhur oħra}many{sa # xhur oħra}one{sa xahar ieħor}other{sa # xhur oħra}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'il-kwart ta’ sena li għadda','0':'il-kwart ta’ sena li qegħdin fih','1':'il-kwart li jmiss tas-sena'},\n      P:'few{# kwarti ta’ sena li għaddew}many{# kwarti ta’ sena li għaddew}one{il-kwart ta’ sena li għadda}other{# kwarti ta’ sena li għaddew}',\n      F:'few{f’# kwarti ta’ sena oħrajn}many{f’# kwarti ta’ sena oħrajn}one{f’# kwarti ta’ sena oħrajn}other{f’# kwarti ta’ sena oħrajn}',\n    },\n    SHORT:{\n      R:{'-1':'il-kwart ta’ sena li għadda','0':'il-kwart ta’ sena li qegħdin fih','1':'il-kwart li jmiss tas-sena'},\n      P:'few{# kwarti ta’ sena ilu}many{# kwarti ta’ sena ilu}one{fil-kwart tas-sena li għadda}other{# kwarti ta’ sena ilu}',\n      F:'few{f’# kwarti ta’ sena oħrajn}many{f’# kwarti ta’ sena oħrajn}one{fil-kwart tas-sena li ġej}other{f’# kwarti ta’ sena oħrajn}',\n    },\n    NARROW:{\n      R:{'-1':'il-kwart ta’ sena li għadda','0':'il-kwart ta’ sena li qegħdin fih','1':'il-kwart li jmiss tas-sena'},\n      P:'few{# kwarti ta’ sena ilu}many{# kwarti ta’ sena ilu}one{fil-kwart tas-sena li għadda}other{# kwarti ta’ sena ilu}',\n      F:'few{f’# kwarti ta’ sena oħrajn}many{f’# kwarti ta’ sena oħrajn}one{fi kwart ta’ sena ieħor}other{f’# kwarti ta’ sena oħrajn}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'issa'},\n      P:'few{# sekondi ilu}many{# sekondi ilu}one{sekonda ilu}other{# sekondi ilu}',\n      F:'few{sa # sekondi oħra}many{sa # sekondi oħra}one{sa # sekondi oħra}other{sa # sekondi oħra}',\n    },\n    SHORT:{\n      R:{'0':'issa'},\n      P:'few{# sek. ilu}many{# sek. ilu}one{sek. ilu}other{# sek. ilu}',\n      F:'few{sa # sek. oħra}many{sa # sek. oħra}one{sa # sekondi oħra}other{sa # sekondi oħra}',\n    },\n    NARROW:{\n      R:{'0':'issa'},\n      P:'few{# sek. ilu}many{# sek. ilu}one{sek. ilu}other{# sek. ilu}',\n      F:'few{sa # sek. oħra}many{sa # sek. oħra}one{sa sek. oħra}other{sa # sek. oħra}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'il-ġimgħa li għaddiet','0':'din il-ġimgħa','1':'il-ġimgħa d-dieħla'},\n      P:'few{# ġimgħat ilu}many{# ġimgħat ilu}one{ġimgħa ilu}other{# ġimgħat ilu}',\n      F:'few{sa # ġimgħat oħra}many{sa # ġimgħat oħra}one{sa ġimgħa oħra}other{sa # ġimgħat oħra}',\n    },\n    SHORT:{\n      R:{'-1':'il-ġimgħa li għaddiet','0':'din il-ġimgħa','1':'il-ġimgħa d-dieħla'},\n      P:'few{# ġimgħat ilu}many{# ġimgħat ilu}one{ġimgħa ilu}other{# ġimgħat ilu}',\n      F:'few{sa # ġimgħat oħra}many{sa # ġimgħat oħra}one{sa ġimgħa oħra}other{+# w}',\n    },\n    NARROW:{\n      R:{'-1':'il-ġimgħa li għaddiet','0':'din il-ġimgħa','1':'il-ġimgħa d-dieħla'},\n      P:'few{# ġimgħat ilu}many{# ġimgħat ilu}one{ġimgħa ilu}other{# ġimgħat ilu}',\n      F:'few{sa # ġimgħat oħra}many{sa # ġimgħat oħra}one{sa ġimgħa oħra}other{sa # ġimgħat oħra}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'is-sena l-oħra','0':'din is-sena','1':'is-sena d-dieħla'},\n      P:'few{# snin ilu}many{# snin ilu}one{sena ilu}other{# snin ilu}',\n      F:'few{fi żmien # snin oħra}many{fi żmien # snin oħra}one{fi żmien sena}other{fi żmien # snin oħra}',\n    },\n    SHORT:{\n      R:{'-1':'is-sena l-oħra','0':'din is-sena','1':'is-sena d-dieħla'},\n      P:'few{# snin ilu}many{# snin ilu}one{sa sena ilu}other{# snin ilu}',\n      F:'few{fi żmien # snin oħra}many{fi żmien # snin oħra}one{fi żmien sena}other{fi żmien # snin oħra}',\n    },\n    NARROW:{\n      R:{'-1':'is-sena l-oħra','0':'din is-sena','1':'is-sena d-dieħla'},\n      P:'few{# snin ilu}many{# snin ilu}one{sena ilu}other{# snin ilu}',\n      F:'few{fi żmien # snin oħra}many{fi żmien # snin oħra}one{fi żmien sena}other{fi żmien # snin oħra}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_my =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'မနေ့က','-2':'တစ်နေ့က','0':'ယနေ့','1':'မနက်ဖြန်','2':'သန်ဘက်ခါ'},\n      P:'other{ပြီးခဲ့သည့် # ရက်}',\n      F:'other{# ရက်အတွင်း}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ဤအချိန်'},\n      P:'other{ပြီးခဲ့သည့် # နာရီ}',\n      F:'other{# နာရီအတွင်း}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ဤမိနစ်'},\n      P:'other{ပြီးခဲ့သည့် # မိနစ်}',\n      F:'other{# မိနစ်အတွင်း}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ပြီးခဲ့သည့်လ','0':'ယခုလ','1':'လာမည့်လ'},\n      P:'other{ပြီးခဲ့သည့် # လ}',\n      F:'other{# လအတွင်း}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'ပြီးခဲ့သည့် သုံးလပတ်','0':'ယခု သုံးလပတ်','1':'လာမည့် သုံးလပတ်'},\n      P:'other{ပြီးခဲ့သည့် သုံးလပတ်ကာလ # ခုအတွင်း}',\n      F:'other{သုံးလပတ်ကာလ # အတွင်း}',\n    },\n    SHORT:{\n      R:{'-1':'ပြီးခဲ့သောသုံးလပတ်','0':'ယခုသုံးလပတ်','1':'နောက်လာမည့်သုံးလပတ်'},\n      P:'other{ပြီးခဲ့သည့် သုံးလပတ်ကာလ # ခုအတွင်း}',\n      F:'other{သုံးလပတ်ကာလ # ခုအတွင်း}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ယခု'},\n      P:'other{ပြီးခဲ့သည့် # စက္ကန့်}',\n      F:'other{# စက္ကန့်အတွင်း}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ပြီးခဲ့သည့် သီတင်းပတ်','0':'ယခု သီတင်းပတ်','1':'လာမည့် သီတင်းပတ်'},\n      P:'other{ပြီးခဲ့သည့် # ပတ်}',\n      F:'other{# ပတ်အတွင်း}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ယမန်နှစ်','0':'ယခုနှစ်','1':'လာမည့်နှစ်'},\n      P:'other{ပြီးခဲ့သည့် # နှစ်}',\n      F:'other{# နှစ်အတွင်း}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nb =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'i går','-2':'i forgårs','0':'i dag','1':'i morgen','2':'i overmorgen'},\n      P:'one{for # døgn siden}other{for # døgn siden}',\n      F:'one{om # døgn}other{om # døgn}',\n    },\n    SHORT:{\n      R:{'-1':'i går','-2':'i forgårs','0':'i dag','1':'i morgen','2':'i overmorgen'},\n      P:'one{for # d. siden}other{for # d. siden}',\n      F:'one{om # d.}other{om # d.}',\n    },\n    NARROW:{\n      R:{'-1':'i går','-2':'-2 d.','0':'i dag','1':'i morgen','2':'+2 d.'},\n      P:'one{-# d.}other{-# d.}',\n      F:'one{+# d.}other{+# d.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'denne timen'},\n      P:'one{for # time siden}other{for # timer siden}',\n      F:'one{om # time}other{om # timer}',\n    },\n    SHORT:{\n      R:{'0':'denne timen'},\n      P:'one{for # t siden}other{for # t siden}',\n      F:'one{om # t}other{om # t}',\n    },\n    NARROW:{\n      R:{'0':'denne timen'},\n      P:'one{-# t}other{-# t}',\n      F:'one{+# t}other{+# t}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'dette minuttet'},\n      P:'one{for # minutt siden}other{for # minutter siden}',\n      F:'one{om # minutt}other{om # minutter}',\n    },\n    SHORT:{\n      R:{'0':'dette minuttet'},\n      P:'one{for # min siden}other{for # min siden}',\n      F:'one{om # min}other{om # min}',\n    },\n    NARROW:{\n      R:{'0':'dette minuttet'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'forrige måned','0':'denne måneden','1':'neste måned'},\n      P:'one{for # måned siden}other{for # måneder siden}',\n      F:'one{om # måned}other{om # måneder}',\n    },\n    SHORT:{\n      R:{'-1':'forrige md.','0':'denne md.','1':'neste md.'},\n      P:'one{for # md. siden}other{for # md. siden}',\n      F:'one{om # md.}other{om # md.}',\n    },\n    NARROW:{\n      R:{'-1':'forrige md.','0':'denne md.','1':'neste md.'},\n      P:'one{-# md.}other{-# md.}',\n      F:'one{+# md.}other{+# md.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'forrige kvartal','0':'dette kvartalet','1':'neste kvartal'},\n      P:'one{for # kvartal siden}other{for # kvartaler siden}',\n      F:'one{om # kvartal}other{om # kvartaler}',\n    },\n    SHORT:{\n      R:{'-1':'forrige kv.','0':'dette kv.','1':'neste kv.'},\n      P:'one{for # kv. siden}other{for # kv. siden}',\n      F:'one{om # kv.}other{om # kv.}',\n    },\n    NARROW:{\n      R:{'-1':'forrige kv.','0':'dette kv.','1':'neste kv.'},\n      P:'one{–# kv.}other{–# kv.}',\n      F:'one{+# kv.}other{+# kv.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'nå'},\n      P:'one{for # sekund siden}other{for # sekunder siden}',\n      F:'one{om # sekund}other{om # sekunder}',\n    },\n    SHORT:{\n      R:{'0':'nå'},\n      P:'one{for # sek siden}other{for # sek siden}',\n      F:'one{om # sek}other{om # sek}',\n    },\n    NARROW:{\n      R:{'0':'nå'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'forrige uke','0':'denne uken','1':'neste uke'},\n      P:'one{for # uke siden}other{for # uker siden}',\n      F:'one{om # uke}other{om # uker}',\n    },\n    SHORT:{\n      R:{'-1':'forrige uke','0':'denne uken','1':'neste uke'},\n      P:'one{for # u. siden}other{for # u. siden}',\n      F:'one{om # u.}other{om # u.}',\n    },\n    NARROW:{\n      R:{'-1':'forrige uke','0':'denne uken','1':'neste uke'},\n      P:'one{-# u.}other{-# u.}',\n      F:'one{+# u.}other{+# u.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'i fjor','0':'i år','1':'neste år'},\n      P:'one{for # år siden}other{for # år siden}',\n      F:'one{om # år}other{om # år}',\n    },\n    NARROW:{\n      R:{'-1':'i fjor','0':'i år','1':'neste år'},\n      P:'one{–# år}other{–# år}',\n      F:'one{+# år}other{+# år}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ne =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'हिजो','-2':'अस्ति','0':'आज','1':'भोलि','2':'पर्सि'},\n      P:'one{# दिन पहिले}other{# दिन पहिले}',\n      F:'one{# दिनमा}other{# दिनमा}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'यस घडीमा'},\n      P:'one{# घण्टा पहिले}other{# घण्टा पहिले}',\n      F:'one{# घण्टामा}other{# घण्टामा}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'यही मिनेटमा'},\n      P:'one{# मिनेट पहिले}other{# मिनेट पहिले}',\n      F:'one{# मिनेटमा}other{# मिनेटमा}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'गत महिना','0':'यो महिना','1':'अर्को महिना'},\n      P:'one{# महिना पहिले}other{# महिना पहिले}',\n      F:'one{# महिनामा}other{# महिनामा}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'अघिल्लो सत्र','0':'यो सत्र','1':'अर्को सत्र'},\n      P:'one{#सत्र अघि}other{#सत्र अघि}',\n      F:'one{+# सत्रमा}other{#सत्रमा}',\n    },\n    SHORT:{\n      R:{'-1':'अघिल्लो सत्र','0':'यो सत्र','1':'अर्को सत्र'},\n      P:'one{#सत्र अघि}other{#सत्र अघि}',\n      F:'one{#सत्रमा}other{#सत्रमा}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'अहिले'},\n      P:'one{# सेकेन्ड पहिले}other{# सेकेन्ड पहिले}',\n      F:'one{# सेकेन्डमा}other{# सेकेन्डमा}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'गत हप्ता','0':'यो हप्ता','1':'आउने हप्ता'},\n      P:'one{# हप्ता पहिले}other{# हप्ता पहिले}',\n      F:'one{# हप्तामा}other{# हप्तामा}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'गत वर्ष','0':'यो वर्ष','1':'आगामी वर्ष'},\n      P:'one{# वर्ष अघि}other{# वर्ष अघि}',\n      F:'one{# वर्षमा}other{# वर्षमा}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_nl =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'gisteren','-2':'eergisteren','0':'vandaag','1':'morgen','2':'overmorgen'},\n      P:'one{# dag geleden}other{# dagen geleden}',\n      F:'one{over # dag}other{over # dagen}',\n    },\n    SHORT:{\n      R:{'-1':'gisteren','-2':'eergisteren','0':'vandaag','1':'morgen','2':'overmorgen'},\n      P:'one{# dag geleden}other{# dgn geleden}',\n      F:'one{over # dag}other{over # dgn}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'binnen een uur'},\n      P:'one{# uur geleden}other{# uur geleden}',\n      F:'one{over # uur}other{over # uur}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'binnen een minuut'},\n      P:'one{# minuut geleden}other{# minuten geleden}',\n      F:'one{over # minuut}other{over # minuten}',\n    },\n    SHORT:{\n      R:{'0':'binnen een minuut'},\n      P:'one{# min. geleden}other{# min. geleden}',\n      F:'one{over # min.}other{over # min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'vorige maand','0':'deze maand','1':'volgende maand'},\n      P:'one{# maand geleden}other{# maanden geleden}',\n      F:'one{over # maand}other{over # maanden}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'vorig kwartaal','0':'dit kwartaal','1':'volgend kwartaal'},\n      P:'one{# kwartaal geleden}other{# kwartalen geleden}',\n      F:'one{over # kwartaal}other{over # kwartalen}',\n    },\n    NARROW:{\n      R:{'-1':'vorig kwartaal','0':'dit kwartaal','1':'volgend kwartaal'},\n      P:'one{# kwartaal geleden}other{# kwartalen geleden}',\n      F:'one{over # kw.}other{over # kwartalen}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'nu'},\n      P:'one{# seconde geleden}other{# seconden geleden}',\n      F:'one{over # seconde}other{over # seconden}',\n    },\n    SHORT:{\n      R:{'0':'nu'},\n      P:'one{# sec. geleden}other{# sec. geleden}',\n      F:'one{over # sec.}other{over # sec.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'vorige week','0':'deze week','1':'volgende week'},\n      P:'one{# week geleden}other{# weken geleden}',\n      F:'one{over # week}other{over # weken}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'vorig jaar','0':'dit jaar','1':'volgend jaar'},\n      P:'one{# jaar geleden}other{# jaar geleden}',\n      F:'one{over # jaar}other{over # jaar}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_no =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'i går','-2':'i forgårs','0':'i dag','1':'i morgen','2':'i overmorgen'},\n      P:'one{for # døgn siden}other{for # døgn siden}',\n      F:'one{om # døgn}other{om # døgn}',\n    },\n    SHORT:{\n      R:{'-1':'i går','-2':'i forgårs','0':'i dag','1':'i morgen','2':'i overmorgen'},\n      P:'one{for # d. siden}other{for # d. siden}',\n      F:'one{om # d.}other{om # d.}',\n    },\n    NARROW:{\n      R:{'-1':'i går','-2':'-2 d.','0':'i dag','1':'i morgen','2':'+2 d.'},\n      P:'one{-# d.}other{-# d.}',\n      F:'one{+# d.}other{+# d.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'denne timen'},\n      P:'one{for # time siden}other{for # timer siden}',\n      F:'one{om # time}other{om # timer}',\n    },\n    SHORT:{\n      R:{'0':'denne timen'},\n      P:'one{for # t siden}other{for # t siden}',\n      F:'one{om # t}other{om # t}',\n    },\n    NARROW:{\n      R:{'0':'denne timen'},\n      P:'one{-# t}other{-# t}',\n      F:'one{+# t}other{+# t}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'dette minuttet'},\n      P:'one{for # minutt siden}other{for # minutter siden}',\n      F:'one{om # minutt}other{om # minutter}',\n    },\n    SHORT:{\n      R:{'0':'dette minuttet'},\n      P:'one{for # min siden}other{for # min siden}',\n      F:'one{om # min}other{om # min}',\n    },\n    NARROW:{\n      R:{'0':'dette minuttet'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'forrige måned','0':'denne måneden','1':'neste måned'},\n      P:'one{for # måned siden}other{for # måneder siden}',\n      F:'one{om # måned}other{om # måneder}',\n    },\n    SHORT:{\n      R:{'-1':'forrige md.','0':'denne md.','1':'neste md.'},\n      P:'one{for # md. siden}other{for # md. siden}',\n      F:'one{om # md.}other{om # md.}',\n    },\n    NARROW:{\n      R:{'-1':'forrige md.','0':'denne md.','1':'neste md.'},\n      P:'one{-# md.}other{-# md.}',\n      F:'one{+# md.}other{+# md.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'forrige kvartal','0':'dette kvartalet','1':'neste kvartal'},\n      P:'one{for # kvartal siden}other{for # kvartaler siden}',\n      F:'one{om # kvartal}other{om # kvartaler}',\n    },\n    SHORT:{\n      R:{'-1':'forrige kv.','0':'dette kv.','1':'neste kv.'},\n      P:'one{for # kv. siden}other{for # kv. siden}',\n      F:'one{om # kv.}other{om # kv.}',\n    },\n    NARROW:{\n      R:{'-1':'forrige kv.','0':'dette kv.','1':'neste kv.'},\n      P:'one{–# kv.}other{–# kv.}',\n      F:'one{+# kv.}other{+# kv.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'nå'},\n      P:'one{for # sekund siden}other{for # sekunder siden}',\n      F:'one{om # sekund}other{om # sekunder}',\n    },\n    SHORT:{\n      R:{'0':'nå'},\n      P:'one{for # sek siden}other{for # sek siden}',\n      F:'one{om # sek}other{om # sek}',\n    },\n    NARROW:{\n      R:{'0':'nå'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'forrige uke','0':'denne uken','1':'neste uke'},\n      P:'one{for # uke siden}other{for # uker siden}',\n      F:'one{om # uke}other{om # uker}',\n    },\n    SHORT:{\n      R:{'-1':'forrige uke','0':'denne uken','1':'neste uke'},\n      P:'one{for # u. siden}other{for # u. siden}',\n      F:'one{om # u.}other{om # u.}',\n    },\n    NARROW:{\n      R:{'-1':'forrige uke','0':'denne uken','1':'neste uke'},\n      P:'one{-# u.}other{-# u.}',\n      F:'one{+# u.}other{+# u.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'i fjor','0':'i år','1':'neste år'},\n      P:'one{for # år siden}other{for # år siden}',\n      F:'one{om # år}other{om # år}',\n    },\n    NARROW:{\n      R:{'-1':'i fjor','0':'i år','1':'neste år'},\n      P:'one{–# år}other{–# år}',\n      F:'one{+# år}other{+# år}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_no_NO = exports.RelativeDateTimeSymbols_no;\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_or =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ଗତକାଲି','0':'ଆଜି','1':'ଆସନ୍ତାକାଲି'},\n      P:'one{# ଦିନ ପୂର୍ବେ}other{# ଦିନ ପୂର୍ବେ}',\n      F:'one{# ଦିନରେ}other{# ଦିନରେ}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ଏହି ଘଣ୍ଟା'},\n      P:'one{# ଘଣ୍ଟା ପୂର୍ବେ}other{# ଘଣ୍ଟା ପୂର୍ବେ}',\n      F:'one{# ଘଣ୍ଟାରେ}other{# ଘଣ୍ଟାରେ}',\n    },\n    SHORT:{\n      R:{'0':'ଏହି ଘଣ୍ଟା'},\n      P:'one{# ଘ. ପୂର୍ବେ}other{# ଘ. ପୂର୍ବେ}',\n      F:'one{# ଘ. ରେ}other{# ଘ. ରେ}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ଏହି ମିନିଟ୍'},\n      P:'one{# ମିନିଟ୍ ପୂର୍ବେ}other{# ମିନିଟ୍ ପୂର୍ବେ}',\n      F:'one{# ମିନିଟ୍‌‌ରେ}other{# ମିନିଟ୍‌‌ରେ}',\n    },\n    SHORT:{\n      R:{'0':'ଏହି ମିନିଟ୍'},\n      P:'one{# ମି. ପୂର୍ବେ}other{# ମି. ପୂର୍ବେ}',\n      F:'one{# ମି. ରେ}other{# ମି. ରେ}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ଗତ ମାସ','0':'ଏହି ମାସ','1':'ଆଗାମୀ ମାସ'},\n      P:'one{# ମାସ ପୂର୍ବେ}other{# ମାସ ପୂର୍ବେ}',\n      F:'one{# ମାସରେ}other{# ମାସରେ}',\n    },\n    SHORT:{\n      R:{'-1':'ଗତ ମାସ','0':'ଏହି ମାସ','1':'ଆଗାମୀ ମାସ'},\n      P:'one{# ମା. ପୂର୍ବେ}other{# ମା. ପୂର୍ବେ}',\n      F:'one{# ମା. ରେ}other{# ମା. ରେ}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'ଗତ ତ୍ରୟମାସ','0':'ଗତ ତ୍ରୟମାସ','1':'ଆଗାମୀ ତ୍ରୟମାସ'},\n      P:'one{# ତ୍ରୟମାସ ପୂର୍ବେ}other{# ତ୍ରୟମାସ ପୂର୍ବେ}',\n      F:'one{# ତ୍ରୟମାସରେ}other{# ତ୍ରୟମାସରେ}',\n    },\n    SHORT:{\n      R:{'-1':'ଗତ ତ୍ରୟମାସ','0':'ଗତ ତ୍ରୟମାସ','1':'ଆଗାମୀ ତ୍ରୟମାସ'},\n      P:'one{# ତ୍ରୟ. ପୂର୍ବେ}other{# ତ୍ରୟ. ପୂର୍ବେ}',\n      F:'one{# ତ୍ରୟ. ରେ}other{# ତ୍ରୟ. ରେ}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ବର୍ତ୍ତମାନ'},\n      P:'one{# ସେକେଣ୍ଡ ପୂର୍ବେ}other{# ସେକେଣ୍ଡ ପୂର୍ବେ}',\n      F:'one{# ସେକେଣ୍ଡରେ}other{# ସେକେଣ୍ଡରେ}',\n    },\n    SHORT:{\n      R:{'0':'ବର୍ତ୍ତମାନ'},\n      P:'one{# ସେ. ପୂର୍ବେ}other{# ସେ. ପୂର୍ବେ}',\n      F:'one{# ସେ. ରେ}other{# ସେ. ରେ}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ଗତ ସପ୍ତାହ','0':'ଏହି ସପ୍ତାହ','1':'ଆଗାମୀ ସପ୍ତାହ'},\n      P:'one{# ସପ୍ତାହରେ}other{# ସପ୍ତାହ ପୂର୍ବେ}',\n      F:'one{# ସପ୍ତାହରେ}other{# ସପ୍ତାହରେ}',\n    },\n    SHORT:{\n      R:{'-1':'ଗତ ସପ୍ତାହ','0':'ଏହି ସପ୍ତାହ','1':'ଆଗାମୀ ସପ୍ତାହ'},\n      P:'one{# ସପ୍ତା. ପୂର୍ବେ}other{# ସପ୍ତା. ପୂର୍ବେ}',\n      F:'one{# ସପ୍ତା. ରେ}other{# ସପ୍ତା. ରେ}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ଗତ ବର୍ଷ','0':'ଏହି ବର୍ଷ','1':'ଆଗାମୀ ବର୍ଷ'},\n      P:'one{# ବର୍ଷ ପୂର୍ବେ}other{# ବର୍ଷ ପୂର୍ବେ}',\n      F:'one{# ବର୍ଷରେ}other{# ବର୍ଷରେ}',\n    },\n    SHORT:{\n      R:{'-1':'ଗତ ବର୍ଷ','0':'ଏହି ବର୍ଷ','1':'ଆଗାମୀ ବର୍ଷ'},\n      P:'one{# ବ. ପୂର୍ବେ}other{# ବ. ପୂର୍ବେ}',\n      F:'one{# ବ. ରେ}other{# ବ. ରେ}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pa =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ਬੀਤਿਆ ਕੱਲ੍ਹ','0':'ਅੱਜ','1':'ਭਲਕੇ'},\n      P:'one{# ਦਿਨ ਪਹਿਲਾਂ}other{# ਦਿਨ ਪਹਿਲਾਂ}',\n      F:'one{# ਦਿਨ ਵਿੱਚ}other{# ਦਿਨਾਂ ਵਿੱਚ}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ਇਸ ਘੰਟੇ'},\n      P:'one{# ਘੰਟਾ ਪਹਿਲਾਂ}other{# ਘੰਟੇ ਪਹਿਲਾਂ}',\n      F:'one{# ਘੰਟੇ ਵਿੱਚ}other{# ਘੰਟਿਆਂ ਵਿੱਚ}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ਇਸ ਮਿੰਟ'},\n      P:'one{# ਮਿੰਟ ਪਹਿਲਾਂ}other{# ਮਿੰਟ ਪਹਿਲਾਂ}',\n      F:'one{# ਮਿੰਟ ਵਿੱਚ}other{# ਮਿੰਟਾਂ ਵਿੱਚ}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'ਪਿਛਲਾ ਮਹੀਨਾ','0':'ਇਹ ਮਹੀਨਾ','1':'ਅਗਲਾ ਮਹੀਨਾ'},\n      P:'one{# ਮਹੀਨਾ ਪਹਿਲਾਂ}other{# ਮਹੀਨੇ ਪਹਿਲਾਂ}',\n      F:'one{# ਮਹੀਨੇ ਵਿੱਚ}other{# ਮਹੀਨਿਆਂ ਵਿੱਚ}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'ਪਿਛਲੀ ਤਿਮਾਹੀ','0':'ਇਸ ਤਿਮਾਹੀ','1':'ਅਗਲੀ ਤਿਮਾਹੀ'},\n      P:'one{# ਤਿਮਾਹੀ ਪਹਿਲਾਂ}other{# ਤਿਮਾਹੀਆਂ ਪਹਿਲਾਂ}',\n      F:'one{# ਤਿਮਾਹੀ ਵਿੱਚ}other{# ਤਿਮਾਹੀਆਂ ਵਿੱਚ}',\n    },\n    SHORT:{\n      R:{'-1':'ਪਿਛਲੀ ਤਿਮਾਹੀ','0':'ਇਹ ਤਿਮਾਹੀ','1':'ਅਗਲੀ ਤਿਮਾਹੀ'},\n      P:'one{# ਤਿਮਾਹੀ ਪਹਿਲਾਂ}other{# ਤਿਮਾਹੀਆਂ ਪਹਿਲਾਂ}',\n      F:'one{# ਤਿਮਾਹੀ ਵਿੱਚ}other{# ਤਿਮਾਹੀਆਂ ਵਿੱਚ}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ਹੁਣ'},\n      P:'one{# ਸਕਿੰਟ ਪਹਿਲਾਂ}other{# ਸਕਿੰਟ ਪਹਿਲਾਂ}',\n      F:'one{# ਸਕਿੰਟ ਵਿੱਚ}other{# ਸਕਿੰਟਾਂ ਵਿੱਚ}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'ਪਿਛਲਾ ਹਫ਼ਤਾ','0':'ਇਹ ਹਫ਼ਤਾ','1':'ਅਗਲਾ ਹਫ਼ਤਾ'},\n      P:'one{# ਹਫ਼ਤਾ ਪਹਿਲਾਂ}other{# ਹਫ਼ਤੇ ਪਹਿਲਾਂ}',\n      F:'one{# ਹਫ਼ਤੇ ਵਿੱਚ}other{# ਹਫ਼ਤਿਆਂ ਵਿੱਚ}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ਪਿਛਲਾ ਸਾਲ','0':'ਇਹ ਸਾਲ','1':'ਅਗਲਾ ਸਾਲ'},\n      P:'one{# ਸਾਲ ਪਹਿਲਾਂ}other{# ਸਾਲ ਪਹਿਲਾਂ}',\n      F:'one{# ਸਾਲ ਵਿੱਚ}other{# ਸਾਲਾਂ ਵਿੱਚ}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pl =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'wczoraj','-2':'przedwczoraj','0':'dzisiaj','1':'jutro','2':'pojutrze'},\n      P:'few{# dni temu}many{# dni temu}one{# dzień temu}other{# dnia temu}',\n      F:'few{za # dni}many{za # dni}one{za # dzień}other{za # dnia}',\n    },\n    SHORT:{\n      R:{'-2':'przedwczoraj','2':'pojutrze'},\n      P:'few{# dni temu}many{# dni temu}one{# dzień temu}other{# dnia temu}',\n      F:'few{za # dni}many{za # dni}one{za # dzień}other{za # dnia}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ta godzina'},\n      P:'few{# godziny temu}many{# godzin temu}one{# godzinę temu}other{# godziny temu}',\n      F:'few{za # godziny}many{za # godzin}one{za # godzinę}other{za # godziny}',\n    },\n    SHORT:{\n      R:{'0':'ta godzina'},\n      P:'few{# godz. temu}many{# godz. temu}one{# godz. temu}other{# godz. temu}',\n      F:'few{za # godz.}many{za # godz.}one{za # godz.}other{za # godz.}',\n    },\n    NARROW:{\n      R:{'0':'ta godzina'},\n      P:'few{# g. temu}many{# g. temu}one{# g. temu}other{# g. temu}',\n      F:'few{za # g.}many{za # g.}one{za # g.}other{za # g.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ta minuta'},\n      P:'few{# minuty temu}many{# minut temu}one{# minutę temu}other{# minuty temu}',\n      F:'few{za # minuty}many{za # minut}one{za # minutę}other{za # minuty}',\n    },\n    SHORT:{\n      R:{'0':'ta minuta'},\n      P:'few{# min temu}many{# min temu}one{# min temu}other{# min temu}',\n      F:'few{za # min}many{za # min}one{za # min}other{za # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'w zeszłym miesiącu','0':'w tym miesiącu','1':'w przyszłym miesiącu'},\n      P:'few{# miesiące temu}many{# miesięcy temu}one{# miesiąc temu}other{# miesiąca temu}',\n      F:'few{za # miesiące}many{za # miesięcy}one{za # miesiąc}other{za # miesiąca}',\n    },\n    SHORT:{\n      R:{'-1':'w zeszłym miesiącu','0':'w tym miesiącu','1':'w przyszłym miesiącu'},\n      P:'few{# mies. temu}many{# mies. temu}one{# mies. temu}other{# mies. temu}',\n      F:'few{za # mies.}many{za # mies.}one{za # mies.}other{za # mies.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'w zeszłym kwartale','0':'w tym kwartale','1':'w przyszłym kwartale'},\n      P:'few{# kwartały temu}many{# kwartałów temu}one{# kwartał temu}other{# kwartału temu}',\n      F:'few{za # kwartały}many{za # kwartałów}one{za # kwartał}other{za # kwartału}',\n    },\n    SHORT:{\n      R:{'-1':'w zeszłym kwartale','0':'w tym kwartale','1':'w przyszłym kwartale'},\n      P:'few{# kw. temu}many{# kw. temu}one{# kw. temu}other{# kw. temu}',\n      F:'few{za # kw.}many{za # kw.}one{za # kw.}other{za # kw.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'teraz'},\n      P:'few{# sekundy temu}many{# sekund temu}one{# sekundę temu}other{# sekundy temu}',\n      F:'few{za # sekundy}many{za # sekund}one{za # sekundę}other{za # sekundy}',\n    },\n    SHORT:{\n      R:{'0':'teraz'},\n      P:'few{# sek. temu}many{# sek. temu}one{# sek. temu}other{# sek. temu}',\n      F:'few{za # sek.}many{za # sek.}one{za # sek.}other{za # sek.}',\n    },\n    NARROW:{\n      R:{'0':'teraz'},\n      P:'few{# s temu}many{# s temu}one{# s temu}other{# s temu}',\n      F:'few{za # s}many{za # s}one{za # s}other{za # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'w zeszłym tygodniu','0':'w tym tygodniu','1':'w przyszłym tygodniu'},\n      P:'few{# tygodnie temu}many{# tygodni temu}one{# tydzień temu}other{# tygodnia temu}',\n      F:'few{za # tygodnie}many{za # tygodni}one{za # tydzień}other{za # tygodnia}',\n    },\n    SHORT:{\n      R:{'-1':'w zeszłym tygodniu','0':'w tym tygodniu','1':'w przyszłym tygodniu'},\n      P:'few{# tyg. temu}many{# tyg. temu}one{# tydz. temu}other{# tyg. temu}',\n      F:'few{za # tyg.}many{za # tyg.}one{za # tydz.}other{za # tyg.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'w zeszłym roku','0':'w tym roku','1':'w przyszłym roku'},\n      P:'few{# lata temu}many{# lat temu}one{# rok temu}other{# roku temu}',\n      F:'few{za # lata}many{za # lat}one{za # rok}other{za # roku}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pt =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ontem','-2':'anteontem','0':'hoje','1':'amanhã','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{em # dia}other{em # dias}',\n    },\n    SHORT:{\n      R:{'-2':'anteontem','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{em # dia}other{em # dias}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{há # hora}other{há # horas}',\n      F:'one{em # hora}other{em # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{há # h}other{há # h}',\n      F:'one{em # h}other{em # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{há # minuto}other{há # minutos}',\n      F:'one{em # minuto}other{em # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{há # min.}other{há # min.}',\n      F:'one{em # min.}other{em # min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{há # mês}other{há # meses}',\n      F:'one{em # mês}other{em # meses}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'último trimestre','0':'este trimestre','1':'próximo trimestre'},\n      P:'one{há # trimestre}other{há # trimestres}',\n      F:'one{em # trimestre}other{em # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'último trimestre','0':'este trimestre','1':'próximo trimestre'},\n      P:'one{há # trim.}other{# trim. atrás}',\n      F:'one{em # trim.}other{em # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'último trimestre','0':'este trimestre','1':'próximo trimestre'},\n      P:'one{há # trim.}other{há # trim.}',\n      F:'one{em # trim.}other{em # trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'agora'},\n      P:'one{há # segundo}other{há # segundos}',\n      F:'one{em # segundo}other{em # segundos}',\n    },\n    SHORT:{\n      R:{'0':'agora'},\n      P:'one{há # seg.}other{há # seg.}',\n      F:'one{em # seg.}other{em # seg.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # semana}other{há # semanas}',\n      F:'one{em # semana}other{em # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # sem.}other{há # sem.}',\n      F:'one{em # sem.}other{em # sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{há # ano}other{há # anos}',\n      F:'one{em # ano}other{em # anos}',\n    },\n    NARROW:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{há # ano}other{# anos atrás}',\n      F:'one{em # ano}other{em # anos}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pt_BR = exports.RelativeDateTimeSymbols_pt;\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_pt_PT =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ontem','-2':'anteontem','0':'hoje','1':'amanhã','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    SHORT:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dia}other{há # dias}',\n      F:'one{dentro de # dia}other{dentro de # dias}',\n    },\n    NARROW:{\n      R:{'-2':'anteontem','0':'hoje','2':'depois de amanhã'},\n      P:'one{há # dias}other{há # dias}',\n      F:'one{+# dia}other{+# dias}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'esta hora'},\n      P:'one{há # hora}other{há # horas}',\n      F:'one{dentro de # hora}other{dentro de # horas}',\n    },\n    SHORT:{\n      R:{'0':'esta hora'},\n      P:'one{há # h}other{há # h}',\n      F:'one{dentro de # h}other{dentro de # h}',\n    },\n    NARROW:{\n      R:{'0':'esta hora'},\n      P:'one{-# h}other{-# h}',\n      F:'one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'este minuto'},\n      P:'one{há # minuto}other{há # minutos}',\n      F:'one{dentro de # minuto}other{dentro de # minutos}',\n    },\n    SHORT:{\n      R:{'0':'este minuto'},\n      P:'one{há # min}other{há # min}',\n      F:'one{dentro de # min}other{dentro de # min}',\n    },\n    NARROW:{\n      R:{'0':'este minuto'},\n      P:'one{-# min}other{-# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{há # mês}other{há # meses}',\n      F:'one{dentro de # mês}other{dentro de # meses}',\n    },\n    NARROW:{\n      R:{'-1':'mês passado','0':'este mês','1':'próximo mês'},\n      P:'one{-# mês}other{-# meses}',\n      F:'one{+# mês}other{+# meses}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'trimestre passado','0':'este trimestre','1':'próximo trimestre'},\n      P:'one{há # trimestre}other{há # trimestres}',\n      F:'one{dentro de # trimestre}other{dentro de # trimestres}',\n    },\n    SHORT:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{há # trim.}other{há # trim.}',\n      F:'one{dentro de # trim.}other{dentro de # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. passado','0':'este trim.','1':'próximo trim.'},\n      P:'one{-# trim.}other{-# trim.}',\n      F:'one{+# trim.}other{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'agora'},\n      P:'one{há # segundo}other{há # segundos}',\n      F:'one{dentro de # segundo}other{dentro de # segundos}',\n    },\n    SHORT:{\n      R:{'0':'agora'},\n      P:'one{há # s}other{há # s}',\n      F:'one{dentro de # s}other{dentro de # s}',\n    },\n    NARROW:{\n      R:{'0':'agora'},\n      P:'one{-# s}other{-# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # semana}other{há # semanas}',\n      F:'one{dentro de # semana}other{dentro de # semanas}',\n    },\n    SHORT:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{há # sem.}other{há # sem.}',\n      F:'one{dentro de # sem.}other{dentro de # sem.}',\n    },\n    NARROW:{\n      R:{'-1':'semana passada','0':'esta semana','1':'próxima semana'},\n      P:'one{-# sem.}other{-# sem.}',\n      F:'one{+# sem.}other{+# sem.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{há # ano}other{há # anos}',\n      F:'one{dentro de # ano}other{dentro de # anos}',\n    },\n    NARROW:{\n      R:{'-1':'ano passado','0':'este ano','1':'próximo ano'},\n      P:'one{-# ano}other{-# anos}',\n      F:'one{+# ano}other{+# anos}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ro =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ieri','-2':'alaltăieri','0':'azi','1':'mâine','2':'poimâine'},\n      P:'few{acum # zile}one{acum # zi}other{acum # de zile}',\n      F:'few{peste # zile}one{peste # zi}other{peste # de zile}',\n    },\n    NARROW:{\n      R:{'-1':'ieri','-2':'alaltăieri','0':'azi','1':'mâine','2':'poimâine'},\n      P:'few{-# zile}one{-# zi}other{-# zile}',\n      F:'few{+# zile}one{+# zi}other{+# zile}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ora aceasta'},\n      P:'few{acum # ore}one{acum # oră}other{acum # de ore}',\n      F:'few{peste # ore}one{peste # oră}other{peste # de ore}',\n    },\n    SHORT:{\n      R:{'0':'ora aceasta'},\n      P:'few{acum # h}one{acum # h}other{acum # h}',\n      F:'few{peste # h}one{peste # h}other{peste # h}',\n    },\n    NARROW:{\n      R:{'0':'ora aceasta'},\n      P:'few{-# h}one{-# h}other{-# h}',\n      F:'few{+# h}one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'minutul acesta'},\n      P:'few{acum # minute}one{acum # minut}other{acum # de minute}',\n      F:'few{peste # minute}one{peste # minut}other{peste # de minute}',\n    },\n    SHORT:{\n      R:{'0':'minutul acesta'},\n      P:'few{acum # min.}one{acum # min.}other{acum # min.}',\n      F:'few{peste # min.}one{peste # min.}other{peste # min.}',\n    },\n    NARROW:{\n      R:{'0':'minutul acesta'},\n      P:'few{-# m}one{-# m}other{-# m}',\n      F:'few{+# m}one{+# m}other{+# m}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'luna trecută','0':'luna aceasta','1':'luna viitoare'},\n      P:'few{acum # luni}one{acum # lună}other{acum # de luni}',\n      F:'few{peste # luni}one{peste # lună}other{peste # de luni}',\n    },\n    SHORT:{\n      R:{'-1':'luna trecută','0':'luna aceasta','1':'luna viitoare'},\n      P:'few{acum # luni}one{acum # lună}other{acum # luni}',\n      F:'few{peste # luni}one{peste # lună}other{peste # luni}',\n    },\n    NARROW:{\n      R:{'-1':'luna trecută','0':'luna aceasta','1':'luna viitoare'},\n      P:'few{-# luni}one{-# lună}other{-# luni}',\n      F:'few{+# luni}one{+# lună}other{+# luni}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'trimestrul trecut','0':'trimestrul acesta','1':'trimestrul viitor'},\n      P:'few{acum # trimestre}one{acum # trimestru}other{acum # de trimestre}',\n      F:'few{peste # trimestre}one{peste # trimestru}other{peste # de trimestre}',\n    },\n    SHORT:{\n      R:{'-1':'trim. trecut','0':'trim. acesta','1':'trim. viitor'},\n      P:'few{acum # trim.}one{acum # trim.}other{acum # trim.}',\n      F:'few{peste # trim.}one{peste # trim.}other{peste # trim.}',\n    },\n    NARROW:{\n      R:{'-1':'trim. trecut','0':'trim. acesta','1':'trim. viitor'},\n      P:'few{-# trim.}one{-# trim.}other{-# trim.}',\n      F:'few{+# trim.}one{+# trim.}other{+# trim.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'acum'},\n      P:'few{acum # secunde}one{acum # secundă}other{acum # de secunde}',\n      F:'few{peste # secunde}one{peste # secundă}other{peste # de secunde}',\n    },\n    SHORT:{\n      R:{'0':'acum'},\n      P:'few{acum # sec.}one{acum # sec.}other{acum # sec.}',\n      F:'few{peste # sec.}one{peste # sec.}other{peste # sec.}',\n    },\n    NARROW:{\n      R:{'0':'acum'},\n      P:'few{-# s}one{-# s}other{-# s}',\n      F:'few{+# s}one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'săptămâna trecută','0':'săptămâna aceasta','1':'săptămâna viitoare'},\n      P:'few{acum # săptămâni}one{acum # săptămână}other{acum # de săptămâni}',\n      F:'few{peste # săptămâni}one{peste # săptămână}other{peste # de săptămâni}',\n    },\n    SHORT:{\n      R:{'-1':'săpt. trecută','0':'săpt. aceasta','1':'săpt. viitoare'},\n      P:'few{acum # săpt.}one{acum # săpt.}other{acum # săpt.}',\n      F:'few{peste # săpt.}one{peste # săpt.}other{peste # săpt.}',\n    },\n    NARROW:{\n      R:{'-1':'săpt. trecută','0':'săptămâna aceasta','1':'săpt. viitoare'},\n      P:'few{-# săpt.}one{-# săpt.}other{-# săpt.}',\n      F:'few{+# săpt.}one{+# săpt.}other{+# săpt.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'anul trecut','0':'anul acesta','1':'anul viitor'},\n      P:'few{acum # ani}one{acum # an}other{acum # de ani}',\n      F:'few{peste # ani}one{peste # an}other{peste # de ani}',\n    },\n    NARROW:{\n      R:{'-1':'anul trecut','0':'anul acesta','1':'anul viitor'},\n      P:'few{-# ani}one{-# an}other{-# ani}',\n      F:'few{+# ani}one{+# an}other{+# ani}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ru =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'вчера','-2':'позавчера','0':'сегодня','1':'завтра','2':'послезавтра'},\n      P:'few{# дня назад}many{# дней назад}one{# день назад}other{# дня назад}',\n      F:'few{через # дня}many{через # дней}one{через # день}other{через # дня}',\n    },\n    SHORT:{\n      R:{'-2':'позавчера','2':'послезавтра'},\n      P:'few{# дн. назад}many{# дн. назад}one{# дн. назад}other{# дн. назад}',\n      F:'few{через # дн.}many{через # дн.}one{через # дн.}other{через # дн.}',\n    },\n    NARROW:{\n      R:{'-2':'позавчера','2':'послезавтра'},\n      P:'few{-# дн.}many{-# дн.}one{-# дн.}other{-# дн.}',\n      F:'few{+# дн.}many{+# дн.}one{+# дн.}other{+# дн.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'в этот час'},\n      P:'few{# часа назад}many{# часов назад}one{# час назад}other{# часа назад}',\n      F:'few{через # часа}many{через # часов}one{через # час}other{через # часа}',\n    },\n    SHORT:{\n      R:{'0':'в этот час'},\n      P:'few{# ч. назад}many{# ч. назад}one{# ч. назад}other{# ч. назад}',\n      F:'few{через # ч.}many{через # ч.}one{через # ч.}other{через # ч.}',\n    },\n    NARROW:{\n      R:{'0':'в этот час'},\n      P:'few{-# ч.}many{-# ч.}one{-# ч.}other{-# ч.}',\n      F:'few{+# ч.}many{+# ч.}one{+# ч.}other{+# ч.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'в эту минуту'},\n      P:'few{# минуты назад}many{# минут назад}one{# минуту назад}other{# минуты назад}',\n      F:'few{через # минуты}many{через # минут}one{через # минуту}other{через # минуты}',\n    },\n    SHORT:{\n      R:{'0':'в эту минуту'},\n      P:'few{# мин. назад}many{# мин. назад}one{# мин. назад}other{# мин. назад}',\n      F:'few{через # мин.}many{через # мин.}one{через # мин.}other{через # мин.}',\n    },\n    NARROW:{\n      R:{'0':'в эту минуту'},\n      P:'few{-# мин.}many{-# мин.}one{-# мин.}other{-# мин.}',\n      F:'few{+# мин.}many{+# мин.}one{+# мин.}other{+# мин.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'в прошлом месяце','0':'в этом месяце','1':'в следующем месяце'},\n      P:'few{# месяца назад}many{# месяцев назад}one{# месяц назад}other{# месяца назад}',\n      F:'few{через # месяца}many{через # месяцев}one{через # месяц}other{через # месяца}',\n    },\n    SHORT:{\n      R:{'-1':'в прошлом мес.','0':'в этом мес.','1':'в следующем мес.'},\n      P:'few{# мес. назад}many{# мес. назад}one{# мес. назад}other{# мес. назад}',\n      F:'few{через # мес.}many{через # мес.}one{через # мес.}other{через # мес.}',\n    },\n    NARROW:{\n      R:{'-1':'в пр. мес.','0':'в эт. мес.','1':'в след. мес.'},\n      P:'few{-# мес.}many{-# мес.}one{-# мес.}other{-# мес.}',\n      F:'few{+# мес.}many{+# мес.}one{+# мес.}other{+# мес.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'в прошлом квартале','0':'в текущем квартале','1':'в следующем квартале'},\n      P:'few{# квартала назад}many{# кварталов назад}one{# квартал назад}other{# квартала назад}',\n      F:'few{через # квартала}many{через # кварталов}one{через # квартал}other{через # квартала}',\n    },\n    SHORT:{\n      R:{'-1':'последний кв.','0':'текущий кв.','1':'следующий кв.'},\n      P:'few{# кв. назад}many{# кв. назад}one{# кв. назад}other{# кв. назад}',\n      F:'few{через # кв.}many{через # кв.}one{через # кв.}other{через # кв.}',\n    },\n    NARROW:{\n      R:{'-1':'посл. кв.','0':'тек. кв.','1':'след. кв.'},\n      P:'few{-# кв.}many{-# кв.}one{-# кв.}other{-# кв.}',\n      F:'few{+# кв.}many{+# кв.}one{+# кв.}other{+# кв.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'сейчас'},\n      P:'few{# секунды назад}many{# секунд назад}one{# секунду назад}other{# секунды назад}',\n      F:'few{через # секунды}many{через # секунд}one{через # секунду}other{через # секунды}',\n    },\n    SHORT:{\n      R:{'0':'сейчас'},\n      P:'few{# сек. назад}many{# сек. назад}one{# сек. назад}other{# сек. назад}',\n      F:'few{через # сек.}many{через # сек.}one{через # сек.}other{через # сек.}',\n    },\n    NARROW:{\n      R:{'0':'сейчас'},\n      P:'few{-# с}many{-# с}one{-# с}other{-# с}',\n      F:'few{+# с}many{+# с}one{+# с}other{+# с}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'на прошлой неделе','0':'на этой неделе','1':'на следующей неделе'},\n      P:'few{# недели назад}many{# недель назад}one{# неделю назад}other{# недели назад}',\n      F:'few{через # недели}many{через # недель}one{через # неделю}other{через # недели}',\n    },\n    SHORT:{\n      R:{'-1':'на прошлой нед.','0':'на этой нед.','1':'на следующей нед.'},\n      P:'few{# нед. назад}many{# нед. назад}one{# нед. назад}other{# нед. назад}',\n      F:'few{через # нед.}many{через # нед.}one{через # нед.}other{через # нед.}',\n    },\n    NARROW:{\n      R:{'-1':'на пр. нед.','0':'на эт. нед.','1':'на след. неделе'},\n      P:'few{-# нед.}many{-# нед.}one{-# нед.}other{-# нед.}',\n      F:'few{+# нед.}many{+# нед.}one{+# нед.}other{+# нед.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'в прошлом году','0':'в этом году','1':'в следующем году'},\n      P:'few{# года назад}many{# лет назад}one{# год назад}other{# года назад}',\n      F:'few{через # года}many{через # лет}one{через # год}other{через # года}',\n    },\n    SHORT:{\n      R:{'-1':'в прошлом г.','0':'в этом г.','1':'в след. г.'},\n      P:'few{# г. назад}many{# л. назад}one{# г. назад}other{# г. назад}',\n      F:'few{через # г.}many{через # л.}one{через # г.}other{через # г.}',\n    },\n    NARROW:{\n      R:{'-1':'в пр. г.','0':'в эт. г.','1':'в сл. г.'},\n      P:'few{-# г.}many{-# л.}one{-# г.}other{-# г.}',\n      F:'few{+# г.}many{+# л.}one{+# г.}other{+# г.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sh =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'juče','-2':'prekjuče','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{pre # dana}one{pre # dana}other{pre # dana}',\n      F:'few{za # dana}one{za # dan}other{za # dana}',\n    },\n    SHORT:{\n      R:{'-1':'juče','-2':'prekjuče','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{pre # d.}one{pre # d.}other{pre # d.}',\n      F:'few{za # d.}one{za # d.}other{za # d.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ovog sata'},\n      P:'few{pre # sata}one{pre # sata}other{pre # sati}',\n      F:'few{za # sata}one{za # sat}other{za # sati}',\n    },\n    SHORT:{\n      R:{'0':'ovog sata'},\n      P:'few{pre # č.}one{pre # č.}other{pre # č.}',\n      F:'few{za # č.}one{za # č.}other{za # č.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ovog minuta'},\n      P:'few{pre # minuta}one{pre # minuta}other{pre # minuta}',\n      F:'few{za # minuta}one{za # minut}other{za # minuta}',\n    },\n    SHORT:{\n      R:{'0':'ovog minuta'},\n      P:'few{pre # min.}one{pre # min.}other{pre # min.}',\n      F:'few{za # min.}one{za # min.}other{za # min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'prošlog meseca','0':'ovog meseca','1':'sledećeg meseca'},\n      P:'few{pre # meseca}one{pre # meseca}other{pre # meseci}',\n      F:'few{za # meseca}one{za # mesec}other{za # meseci}',\n    },\n    SHORT:{\n      R:{'-1':'prošlog mes.','0':'ovog mes.','1':'sledećeg mes.'},\n      P:'few{pre # mes.}one{pre # mes.}other{pre # mes.}',\n      F:'few{za # mes.}one{za # mes.}other{za # mes.}',\n    },\n    NARROW:{\n      R:{'-1':'prošlog m.','0':'ovog m.','1':'sledećeg m.'},\n      P:'few{pre # m.}one{pre # m.}other{pre # m.}',\n      F:'few{za # m.}one{za # m.}other{za # m.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'prošlog kvartala','0':'ovog kvartala','1':'sledećeg kvartala'},\n      P:'few{pre # kvartala}one{pre # kvartala}other{pre # kvartala}',\n      F:'few{za # kvartala}one{za # kvartal}other{za # kvartala}',\n    },\n    SHORT:{\n      R:{'-1':'prošlog kvartala','0':'ovog kvartala','1':'sledećeg kvartala'},\n      P:'few{pre # kv.}one{pre # kv.}other{pre # kv.}',\n      F:'few{za # kv.}one{za # kv.}other{za # kv.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'sada'},\n      P:'few{pre # sekunde}one{pre # sekunde}other{pre # sekundi}',\n      F:'few{za # sekunde}one{za # sekundu}other{za # sekundi}',\n    },\n    SHORT:{\n      R:{'0':'sada'},\n      P:'few{pre # sek.}one{pre # sek.}other{pre # sek.}',\n      F:'few{za # sek.}one{za # sek.}other{za # sek.}',\n    },\n    NARROW:{\n      R:{'0':'sada'},\n      P:'few{pre # s.}one{pre # s.}other{pre # s.}',\n      F:'few{za # s.}one{za # s.}other{za # s.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'prošle nedelje','0':'ove nedelje','1':'sledeće nedelje'},\n      P:'few{pre # nedelje}one{pre # nedelje}other{pre # nedelja}',\n      F:'few{za # nedelje}one{za # nedelju}other{za # nedelja}',\n    },\n    SHORT:{\n      R:{'-1':'prošle ned.','0':'ove ned.','1':'sledeće ned.'},\n      P:'few{pre # ned.}one{pre # ned.}other{pre # ned.}',\n      F:'few{za # ned.}one{za # ned.}other{za # ned.}',\n    },\n    NARROW:{\n      R:{'-1':'prošle n.','0':'ove n.','1':'sledeće n.'},\n      P:'few{pre # n.}one{pre # n.}other{pre # n.}',\n      F:'few{za # n.}one{za # n.}other{za # n.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'prošle godine','0':'ove godine','1':'sledeće godine'},\n      P:'few{pre # godine}one{pre # godine}other{pre # godina}',\n      F:'few{za # godine}one{za # godinu}other{za # godina}',\n    },\n    SHORT:{\n      R:{'-1':'prošle god.','0':'ove god.','1':'sledeće god.'},\n      P:'few{pre # god.}one{pre # god.}other{pre # god.}',\n      F:'few{za # god.}one{za # god.}other{za # god.}',\n    },\n    NARROW:{\n      R:{'-1':'prošle g.','0':'ove g.','1':'sledeće g.'},\n      P:'few{pre # g.}one{pre # g.}other{pre # g.}',\n      F:'few{za # g.}one{za # g.}other{za # g.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_si =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'ඊයේ','-2':'පෙරේදා','0':'අද','1':'හෙට','2':'අනිද්දා'},\n      P:'one{දින #කට පෙර}other{දින #කට පෙර}',\n      F:'one{දින #න්}other{දින #න්}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'මෙම පැය'},\n      P:'one{පැය #කට පෙර}other{පැය #කට පෙර}',\n      F:'one{පැය #කින්}other{පැය #කින්}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'මෙම මිනිත්තුව'},\n      P:'one{මිනිත්තු #කට පෙර}other{මිනිත්තු #කට පෙර}',\n      F:'one{මිනිත්තු #කින්}other{මිනිත්තු #කින්}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'පසුගිය මාසය','0':'මෙම මාසය','1':'ඊළඟ මාසය'},\n      P:'one{මාස #කට පෙර}other{මාස #කට පෙර}',\n      F:'one{මාස #කින්}other{මාස #කින්}',\n    },\n    SHORT:{\n      R:{'-1':'පසුගිය මාස.','0':'මෙම මාස.','1':'ඊළඟ මාස.'},\n      P:'one{මාස #කට පෙර}other{මාස #කට පෙර}',\n      F:'one{මාස #කින්}other{මාස #කින්}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'පසුගිය කාර්තුව','0':'මෙම කාර්තුව','1':'ඊළඟ කාර්තුව'},\n      P:'one{කාර්තු #කට පෙර}other{කාර්තු #කට පෙර}',\n      F:'one{කාර්තු #කින්}other{කාර්තු #කින්}',\n    },\n    SHORT:{\n      R:{'-1':'පසුගිය කාර්.','0':'මෙම කාර්.','1':'ඊළඟ කාර්.'},\n      P:'one{කාර්. #කට පෙර}other{කාර්. #කට පෙර}',\n      F:'one{කාර්. #කින්}other{කාර්. #කින්}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'දැන්'},\n      P:'one{තත්පර #කට පෙර}other{තත්පර #කට පෙර}',\n      F:'one{තත්පර #කින්}other{තත්පර #කින්}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'පසුගිය සතිය','0':'මෙම සතිය','1':'ඊළඟ සතිය'},\n      P:'one{සති #කට පෙර}other{සති #කට පෙර}',\n      F:'one{සති #කින්}other{සති #කින්}',\n    },\n    SHORT:{\n      R:{'-1':'පසුගිය සති.','0':'මෙම සති.','1':'ඊළඟ සති.'},\n      P:'one{සති #කට පෙර}other{සති #කට පෙර}',\n      F:'one{සති #කින්}other{සති #කින්}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'පසුගිය වසර','0':'මෙම වසර','1':'ඊළඟ වසර'},\n      P:'one{වසර #කට පෙර}other{වසර #කට පෙර}',\n      F:'one{වසර #කින්}other{වසර #කින්}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sk =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'včera','-2':'predvčerom','0':'dnes','1':'zajtra','2':'pozajtra'},\n      P:'few{pred # dňami}many{pred # dňa}one{pred # dňom}other{pred # dňami}',\n      F:'few{o # dni}many{o # dňa}one{o # deň}other{o # dní}',\n    },\n    SHORT:{\n      R:{'-1':'včera','-2':'predvčerom','0':'dnes','1':'zajtra','2':'pozajtra'},\n      P:'few{pred # d.}many{pred # d.}one{pred # d.}other{pred # d.}',\n      F:'few{o # d.}many{o # d.}one{o # d.}other{o # d.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'v tejto hodine'},\n      P:'few{pred # hodinami}many{pred # hodinou}one{pred # hodinou}other{pred # hodinami}',\n      F:'few{o # hodiny}many{o # hodiny}one{o # hodinu}other{o # hodín}',\n    },\n    SHORT:{\n      R:{'0':'v tejto hodine'},\n      P:'few{pred # h}many{pred # h}one{pred # h}other{pred # h}',\n      F:'few{o # h}many{o # h}one{o # h}other{o # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'v tejto minúte'},\n      P:'few{pred # minútami}many{pred # minúty}one{pred # minútou}other{pred # minútami}',\n      F:'few{o # minúty}many{o # minúty}one{o # minútu}other{o # minút}',\n    },\n    SHORT:{\n      R:{'0':'v tejto minúte'},\n      P:'few{pred # min}many{pred # min}one{pred # min}other{pred # min}',\n      F:'few{o # min}many{o # min}one{o # min}other{o # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'minulý mesiac','0':'tento mesiac','1':'budúci mesiac'},\n      P:'few{pred # mesiacmi}many{pred # mesiaca}one{pred # mesiacom}other{pred # mesiacmi}',\n      F:'few{o # mesiace}many{o # mesiaca}one{o # mesiac}other{o # mesiacov}',\n    },\n    SHORT:{\n      R:{'-1':'minulý mes.','0':'tento mes.','1':'budúci mes.'},\n      P:'few{pred # mes.}many{pred # mes.}one{pred # mes.}other{pred # mes.}',\n      F:'few{o # mes.}many{o # mes.}one{o # mes.}other{o # mes.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'minulý štvrťrok','0':'tento štvrťrok','1':'budúci štvrťrok'},\n      P:'few{pred # štvrťrokmi}many{pred # štvrťroka}one{pred # štvrťrokom}other{pred # štvrťrokmi}',\n      F:'few{o # štvrťroky}many{o # štvrťroka}one{o # štvrťrok}other{o # štvrťrokov}',\n    },\n    SHORT:{\n      R:{'-1':'minulý štvrťr.','0':'tento štvrťr.','1':'budúci štvrťr.'},\n      P:'few{pred # štvrťr.}many{pred # štvrťr.}one{pred # štvrťr.}other{pred # štvrťr.}',\n      F:'few{o # štvrťr.}many{o # štvrťr.}one{o # štvrťr.}other{o # štvrťr.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'teraz'},\n      P:'few{pred # sekundami}many{pred # sekundy}one{pred # sekundou}other{pred # sekundami}',\n      F:'few{o # sekundy}many{o # sekundy}one{o # sekundu}other{o # sekúnd}',\n    },\n    SHORT:{\n      R:{'0':'teraz'},\n      P:'few{pred # s}many{pred # s}one{pred # s}other{pred # s}',\n      F:'few{o # s}many{o # s}one{o # s}other{o # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'minulý týždeň','0':'tento týždeň','1':'budúci týždeň'},\n      P:'few{pred # týždňami}many{pred # týždňa}one{pred # týždňom}other{pred # týždňami}',\n      F:'few{o # týždne}many{o # týždňa}one{o # týždeň}other{o # týždňov}',\n    },\n    SHORT:{\n      R:{'-1':'minulý týž.','0':'tento týž.','1':'budúci týž.'},\n      P:'few{pred # týž.}many{pred # týž.}one{pred # týž.}other{pred # týž.}',\n      F:'few{o # týž.}many{o # týž.}one{o # týž.}other{o # týž.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'minulý rok','0':'tento rok','1':'budúci rok'},\n      P:'few{pred # rokmi}many{pred # roka}one{pred # rokom}other{pred # rokmi}',\n      F:'few{o # roky}many{o # roka}one{o # rok}other{o # rokov}',\n    },\n    SHORT:{\n      R:{'-1':'minulý rok','0':'tento rok','1':'budúci rok'},\n      P:'few{pred # r.}many{pred # r.}one{pred # r.}other{pred # r.}',\n      F:'few{o # r.}many{o # r.}one{o # r.}other{o # r.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sl =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'včeraj','-2':'predvčerajšnjim','0':'danes','1':'jutri','2':'pojutrišnjem'},\n      P:'few{pred # dnevi}one{pred # dnevom}other{pred # dnevi}two{pred # dnevoma}',\n      F:'few{čez # dni}one{čez # dan}other{čez # dni}two{čez # dneva}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'v tej uri'},\n      P:'few{pred # urami}one{pred # uro}other{pred # urami}two{pred # urama}',\n      F:'few{čez # ure}one{čez # uro}other{čez # ur}two{čez # uri}',\n    },\n    NARROW:{\n      R:{'0':'v tej uri'},\n      P:'few{pred # h}one{pred # h}other{pred # h}two{pred # h}',\n      F:'few{čez # h}one{čez # h}other{čez # h}two{čez # h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'to minuto'},\n      P:'few{pred # minutami}one{pred # minuto}other{pred # minutami}two{pred # minutama}',\n      F:'few{čez # minute}one{čez # minuto}other{čez # minut}two{čez # minuti}',\n    },\n    SHORT:{\n      R:{'0':'to minuto'},\n      P:'few{pred # min.}one{pred # min.}other{pred # min.}two{pred # min.}',\n      F:'few{čez # min.}one{čez # min.}other{čez # min.}two{čez # min.}',\n    },\n    NARROW:{\n      R:{'0':'to minuto'},\n      P:'few{pred # min}one{pred # min}other{pred # min}two{pred # min}',\n      F:'few{čez # min}one{čez # min}other{čez # min}two{čez # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'prejšnji mesec','0':'ta mesec','1':'naslednji mesec'},\n      P:'few{pred # meseci}one{pred # mesecem}other{pred # meseci}two{pred # mesecema}',\n      F:'few{čez # mesece}one{čez # mesec}other{čez # mesecev}two{čez # meseca}',\n    },\n    SHORT:{\n      R:{'-1':'prejšnji mesec','0':'ta mesec','1':'naslednji mesec'},\n      P:'few{pred # mes.}one{pred # mes.}other{pred # mes.}two{pred # mes.}',\n      F:'few{čez # mes.}one{čez # mes.}other{čez # mes.}two{čez # mes.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'zadnje četrtletje','0':'to četrtletje','1':'naslednje četrtletje'},\n      P:'few{pred # četrtletji}one{pred # četrtletjem}other{pred # četrtletji}two{pred # četrtletjema}',\n      F:'few{čez # četrtletja}one{čez # četrtletje}other{čez # četrtletij}two{čez # četrtletji}',\n    },\n    SHORT:{\n      R:{'-1':'zadnje četrtletje','0':'to četrtletje','1':'naslednje četrtletje'},\n      P:'few{pred # četrtl.}one{pred # četrtl.}other{pred # četrtl.}two{pred # četrtl.}',\n      F:'few{čez # četrtl.}one{čez # četrtl.}other{čez # četrtl.}two{čez # četrtl.}',\n    },\n    NARROW:{\n      R:{'-1':'zadnje četrtletje','0':'to četrtletje','1':'naslednje četrtletje'},\n      P:'few{pred # četr.}one{pred # četr.}other{pred # četr.}two{pred # četr.}',\n      F:'few{čez # četr.}one{čez # četr.}other{čez # četr.}two{čez # četr.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'zdaj'},\n      P:'few{pred # sekundami}one{pred # sekundo}other{pred # sekundami}two{pred # sekundama}',\n      F:'few{čez # sekunde}one{čez # sekundo}other{čez # sekund}two{čez # sekundi}',\n    },\n    SHORT:{\n      R:{'0':'zdaj'},\n      P:'few{pred # s}one{pred # s}other{pred # s}two{pred # s}',\n      F:'few{čez # s}one{čez # s}other{čez # s}two{čez # s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'prejšnji teden','0':'ta teden','1':'naslednji teden'},\n      P:'few{pred # tedni}one{pred # tednom}other{pred # tedni}two{pred # tednoma}',\n      F:'few{čez # tedne}one{čez # teden}other{čez # tednov}two{čez # tedna}',\n    },\n    SHORT:{\n      R:{'-1':'prejšnji teden','0':'ta teden','1':'naslednji teden'},\n      P:'few{pred # ted.}one{pred # ted.}other{pred # ted.}two{pred # ted.}',\n      F:'few{čez # ted.}one{čez # ted.}other{čez # ted.}two{čez # ted.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'lani','0':'letos','1':'naslednje leto'},\n      P:'few{pred # leti}one{pred # letom}other{pred # leti}two{pred # letoma}',\n      F:'few{čez # leta}one{čez # leto}other{čez # let}two{čez # leti}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sq =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'dje','0':'sot','1':'nesër'},\n      P:'one{# ditë më parë}other{# ditë më parë}',\n      F:'one{pas # dite}other{pas # ditësh}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'këtë orë'},\n      P:'one{# orë më parë}other{# orë më parë}',\n      F:'one{pas # ore}other{pas # orësh}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'këtë minutë'},\n      P:'one{# minutë më parë}other{# minuta më parë}',\n      F:'one{pas # minute}other{pas # minutash}',\n    },\n    SHORT:{\n      R:{'0':'këtë minutë'},\n      P:'one{# min më parë}other{# min më parë}',\n      F:'one{pas # min}other{pas # min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'muajin e kaluar','0':'këtë muaj','1':'muajin e ardhshëm'},\n      P:'one{# muaj më parë}other{# muaj më parë}',\n      F:'one{pas # muaji}other{pas # muajsh}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'tremujorin e kaluar','0':'këtë tremujor','1':'tremujorin e ardhshëm'},\n      P:'one{# tremujor më parë}other{# tremujorë më parë}',\n      F:'one{pas # tremujori}other{pas # tremujorësh}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'tani'},\n      P:'one{# sekondë më parë}other{# sekonda më parë}',\n      F:'one{pas # sekonde}other{pas # sekondash}',\n    },\n    SHORT:{\n      R:{'0':'tani'},\n      P:'one{# sek më parë}other{# sek më parë}',\n      F:'one{pas # sek}other{pas # sek}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'javën e kaluar','0':'këtë javë','1':'javën e ardhshme'},\n      P:'one{# javë më parë}other{# javë më parë}',\n      F:'one{pas # jave}other{pas # javësh}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'vjet','0':'sivjet','1':'mot'},\n      P:'one{# vit më parë}other{# vjet më parë}',\n      F:'one{pas # viti}other{pas # vjetësh}',\n    },\n    SHORT:{\n      R:{'-1':'vitin e kaluar','0':'këtë vit','1':'vitin e ardhshëm'},\n      P:'one{# vit më parë}other{# vjet më parë}',\n      F:'one{pas # viti}other{pas # vjetësh}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sr =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'јуче','-2':'прекјуче','0':'данас','1':'сутра','2':'прекосутра'},\n      P:'few{пре # дана}one{пре # дана}other{пре # дана}',\n      F:'few{за # дана}one{за # дан}other{за # дана}',\n    },\n    SHORT:{\n      R:{'-1':'јуче','-2':'прекјуче','0':'данас','1':'сутра','2':'прекосутра'},\n      P:'few{пре # д.}one{пре # д.}other{пре # д.}',\n      F:'few{за # д.}one{за # д.}other{за # д.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'овог сата'},\n      P:'few{пре # сата}one{пре # сата}other{пре # сати}',\n      F:'few{за # сата}one{за # сат}other{за # сати}',\n    },\n    SHORT:{\n      R:{'0':'овог сата'},\n      P:'few{пре # ч.}one{пре # ч.}other{пре # ч.}',\n      F:'few{за # ч.}one{за # ч.}other{за # ч.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'овог минута'},\n      P:'few{пре # минута}one{пре # минута}other{пре # минута}',\n      F:'few{за # минута}one{за # минут}other{за # минута}',\n    },\n    SHORT:{\n      R:{'0':'овог минута'},\n      P:'few{пре # мин.}one{пре # мин.}other{пре # мин.}',\n      F:'few{за # мин.}one{за # мин.}other{за # мин.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'прошлог месеца','0':'овог месеца','1':'следећег месеца'},\n      P:'few{пре # месеца}one{пре # месеца}other{пре # месеци}',\n      F:'few{за # месеца}one{за # месец}other{за # месеци}',\n    },\n    SHORT:{\n      R:{'-1':'прошлог мес.','0':'овог мес.','1':'следећег мес.'},\n      P:'few{пре # мес.}one{пре # мес.}other{пре # мес.}',\n      F:'few{за # мес.}one{за # мес.}other{за # мес.}',\n    },\n    NARROW:{\n      R:{'-1':'прошлог м.','0':'овог м.','1':'следећег м.'},\n      P:'few{пре # м.}one{пре # м.}other{пре # м.}',\n      F:'few{за # м.}one{за # м.}other{за # м.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'прошлог квартала','0':'овог квартала','1':'следећег квартала'},\n      P:'few{пре # квартала}one{пре # квартала}other{пре # квартала}',\n      F:'few{за # квартала}one{за # квартал}other{за # квартала}',\n    },\n    SHORT:{\n      R:{'-1':'прошлог квартала','0':'овог квартала','1':'следећег квартала'},\n      P:'few{пре # кв.}one{пре # кв.}other{пре # кв.}',\n      F:'few{за # кв.}one{за # кв.}other{за # кв.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'сада'},\n      P:'few{пре # секунде}one{пре # секунде}other{пре # секунди}',\n      F:'few{за # секунде}one{за # секунду}other{за # секунди}',\n    },\n    SHORT:{\n      R:{'0':'сада'},\n      P:'few{пре # сек.}one{пре # сек.}other{пре # сек.}',\n      F:'few{за # сек.}one{за # сек.}other{за # сек.}',\n    },\n    NARROW:{\n      R:{'0':'сада'},\n      P:'few{пре # с.}one{пре # с.}other{пре # с.}',\n      F:'few{за # с.}one{за # с.}other{за # с.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'прошле недеље','0':'ове недеље','1':'следеће недеље'},\n      P:'few{пре # недеље}one{пре # недеље}other{пре # недеља}',\n      F:'few{за # недеље}one{за # недељу}other{за # недеља}',\n    },\n    SHORT:{\n      R:{'-1':'прошле нед.','0':'ове нед.','1':'следеће нед.'},\n      P:'few{пре # нед.}one{пре # нед.}other{пре # нед.}',\n      F:'few{за # нед.}one{за # нед.}other{за # нед.}',\n    },\n    NARROW:{\n      R:{'-1':'прошле н.','0':'ове н.','1':'следеће н.'},\n      P:'few{пре # н.}one{пре # н.}other{пре # н.}',\n      F:'few{за # н.}one{за # н.}other{за # н.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'прошле године','0':'ове године','1':'следеће године'},\n      P:'few{пре # године}one{пре # године}other{пре # година}',\n      F:'few{за # године}one{за # годину}other{за # година}',\n    },\n    SHORT:{\n      R:{'-1':'прошле год.','0':'ове год.','1':'следеће год.'},\n      P:'few{пре # год.}one{пре # год.}other{пре # год.}',\n      F:'few{за # год.}one{за # год.}other{за # год.}',\n    },\n    NARROW:{\n      R:{'-1':'прошле г.','0':'ове г.','1':'следеће г.'},\n      P:'few{пре # г.}one{пре # г.}other{пре # г.}',\n      F:'few{за # г.}one{за # г.}other{за # г.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sr_Latn =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'juče','-2':'prekjuče','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{pre # dana}one{pre # dana}other{pre # dana}',\n      F:'few{za # dana}one{za # dan}other{za # dana}',\n    },\n    SHORT:{\n      R:{'-1':'juče','-2':'prekjuče','0':'danas','1':'sutra','2':'prekosutra'},\n      P:'few{pre # d.}one{pre # d.}other{pre # d.}',\n      F:'few{za # d.}one{za # d.}other{za # d.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ovog sata'},\n      P:'few{pre # sata}one{pre # sata}other{pre # sati}',\n      F:'few{za # sata}one{za # sat}other{za # sati}',\n    },\n    SHORT:{\n      R:{'0':'ovog sata'},\n      P:'few{pre # č.}one{pre # č.}other{pre # č.}',\n      F:'few{za # č.}one{za # č.}other{za # č.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ovog minuta'},\n      P:'few{pre # minuta}one{pre # minuta}other{pre # minuta}',\n      F:'few{za # minuta}one{za # minut}other{za # minuta}',\n    },\n    SHORT:{\n      R:{'0':'ovog minuta'},\n      P:'few{pre # min.}one{pre # min.}other{pre # min.}',\n      F:'few{za # min.}one{za # min.}other{za # min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'prošlog meseca','0':'ovog meseca','1':'sledećeg meseca'},\n      P:'few{pre # meseca}one{pre # meseca}other{pre # meseci}',\n      F:'few{za # meseca}one{za # mesec}other{za # meseci}',\n    },\n    SHORT:{\n      R:{'-1':'prošlog mes.','0':'ovog mes.','1':'sledećeg mes.'},\n      P:'few{pre # mes.}one{pre # mes.}other{pre # mes.}',\n      F:'few{za # mes.}one{za # mes.}other{za # mes.}',\n    },\n    NARROW:{\n      R:{'-1':'prošlog m.','0':'ovog m.','1':'sledećeg m.'},\n      P:'few{pre # m.}one{pre # m.}other{pre # m.}',\n      F:'few{za # m.}one{za # m.}other{za # m.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'prošlog kvartala','0':'ovog kvartala','1':'sledećeg kvartala'},\n      P:'few{pre # kvartala}one{pre # kvartala}other{pre # kvartala}',\n      F:'few{za # kvartala}one{za # kvartal}other{za # kvartala}',\n    },\n    SHORT:{\n      R:{'-1':'prošlog kvartala','0':'ovog kvartala','1':'sledećeg kvartala'},\n      P:'few{pre # kv.}one{pre # kv.}other{pre # kv.}',\n      F:'few{za # kv.}one{za # kv.}other{za # kv.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'sada'},\n      P:'few{pre # sekunde}one{pre # sekunde}other{pre # sekundi}',\n      F:'few{za # sekunde}one{za # sekundu}other{za # sekundi}',\n    },\n    SHORT:{\n      R:{'0':'sada'},\n      P:'few{pre # sek.}one{pre # sek.}other{pre # sek.}',\n      F:'few{za # sek.}one{za # sek.}other{za # sek.}',\n    },\n    NARROW:{\n      R:{'0':'sada'},\n      P:'few{pre # s.}one{pre # s.}other{pre # s.}',\n      F:'few{za # s.}one{za # s.}other{za # s.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'prošle nedelje','0':'ove nedelje','1':'sledeće nedelje'},\n      P:'few{pre # nedelje}one{pre # nedelje}other{pre # nedelja}',\n      F:'few{za # nedelje}one{za # nedelju}other{za # nedelja}',\n    },\n    SHORT:{\n      R:{'-1':'prošle ned.','0':'ove ned.','1':'sledeće ned.'},\n      P:'few{pre # ned.}one{pre # ned.}other{pre # ned.}',\n      F:'few{za # ned.}one{za # ned.}other{za # ned.}',\n    },\n    NARROW:{\n      R:{'-1':'prošle n.','0':'ove n.','1':'sledeće n.'},\n      P:'few{pre # n.}one{pre # n.}other{pre # n.}',\n      F:'few{za # n.}one{za # n.}other{za # n.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'prošle godine','0':'ove godine','1':'sledeće godine'},\n      P:'few{pre # godine}one{pre # godine}other{pre # godina}',\n      F:'few{za # godine}one{za # godinu}other{za # godina}',\n    },\n    SHORT:{\n      R:{'-1':'prošle god.','0':'ove god.','1':'sledeće god.'},\n      P:'few{pre # god.}one{pre # god.}other{pre # god.}',\n      F:'few{za # god.}one{za # god.}other{za # god.}',\n    },\n    NARROW:{\n      R:{'-1':'prošle g.','0':'ove g.','1':'sledeće g.'},\n      P:'few{pre # g.}one{pre # g.}other{pre # g.}',\n      F:'few{za # g.}one{za # g.}other{za # g.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sv =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'i går','-2':'i förrgår','0':'i dag','1':'i morgon','2':'i övermorgon'},\n      P:'one{för # dag sedan}other{för # dagar sedan}',\n      F:'one{om # dag}other{om # dagar}',\n    },\n    SHORT:{\n      R:{'-1':'i går','-2':'i förrgår','0':'i dag','1':'i morgon','2':'i övermorgon'},\n      P:'one{för # d sedan}other{för # d sedan}',\n      F:'one{om # d}other{om # d}',\n    },\n    NARROW:{\n      R:{'-1':'igår','-2':'i förrgår','0':'idag','1':'imorgon','2':'i övermorgon'},\n      P:'one{−# d}other{−# d}',\n      F:'one{+# d}other{+# d}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'denna timme'},\n      P:'one{för # timme sedan}other{för # timmar sedan}',\n      F:'one{om # timme}other{om # timmar}',\n    },\n    SHORT:{\n      R:{'0':'denna timme'},\n      P:'one{för # tim sedan}other{för # tim sedan}',\n      F:'one{om # tim}other{om # tim}',\n    },\n    NARROW:{\n      R:{'0':'denna timme'},\n      P:'one{−# h}other{−# h}',\n      F:'one{+# h}other{+# h}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'denna minut'},\n      P:'one{för # minut sedan}other{för # minuter sedan}',\n      F:'one{om # minut}other{om # minuter}',\n    },\n    SHORT:{\n      R:{'0':'denna minut'},\n      P:'one{för # min sen}other{för # min sen}',\n      F:'one{om # min}other{om # min}',\n    },\n    NARROW:{\n      R:{'0':'denna minut'},\n      P:'one{−# min}other{−# min}',\n      F:'one{+# min}other{+# min}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'förra månaden','0':'denna månad','1':'nästa månad'},\n      P:'one{för # månad sedan}other{för # månader sedan}',\n      F:'one{om # månad}other{om # månader}',\n    },\n    SHORT:{\n      R:{'-1':'förra mån.','0':'denna mån.','1':'nästa mån.'},\n      P:'one{för # mån. sen}other{för # mån. sen}',\n      F:'one{om # mån.}other{om # mån.}',\n    },\n    NARROW:{\n      R:{'-1':'förra mån.','0':'denna mån.','1':'nästa mån.'},\n      P:'one{−# mån}other{−# mån}',\n      F:'one{+# mån.}other{+# mån.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'förra kvartalet','0':'detta kvartal','1':'nästa kvartal'},\n      P:'one{för # kvartal sedan}other{för # kvartal sedan}',\n      F:'one{om # kvartal}other{om # kvartal}',\n    },\n    SHORT:{\n      R:{'-1':'förra kv.','0':'detta kv.','1':'nästa kv.'},\n      P:'one{för # kv. sen}other{för # kv. sen}',\n      F:'one{om # kv.}other{om # kv.}',\n    },\n    NARROW:{\n      R:{'-1':'förra kv.','0':'detta kv.','1':'nästa kv.'},\n      P:'one{−# kv}other{−# kv}',\n      F:'one{+# kv.}other{+# kv.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'nu'},\n      P:'one{för # sekund sedan}other{för # sekunder sedan}',\n      F:'one{om # sekund}other{om # sekunder}',\n    },\n    SHORT:{\n      R:{'0':'nu'},\n      P:'one{för # s sen}other{för # s sen}',\n      F:'one{om # sek}other{om # sek}',\n    },\n    NARROW:{\n      R:{'0':'nu'},\n      P:'one{−# s}other{−# s}',\n      F:'one{+# s}other{+# s}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'förra veckan','0':'denna vecka','1':'nästa vecka'},\n      P:'one{för # vecka sedan}other{för # veckor sedan}',\n      F:'one{om # vecka}other{om # veckor}',\n    },\n    SHORT:{\n      R:{'-1':'förra v.','0':'denna v.','1':'nästa v.'},\n      P:'one{för # v. sedan}other{för # v. sedan}',\n      F:'one{om # v.}other{om # v.}',\n    },\n    NARROW:{\n      R:{'-1':'förra v.','0':'denna v.','1':'nästa v.'},\n      P:'one{−# v}other{−# v}',\n      F:'one{+# v.}other{+# v.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'i fjol','0':'i år','1':'nästa år'},\n      P:'one{för # år sedan}other{för # år sedan}',\n      F:'one{om # år}other{om # år}',\n    },\n    SHORT:{\n      R:{'-1':'i fjol','0':'i år','1':'nästa år'},\n      P:'one{för # år sen}other{för # år sen}',\n      F:'one{om # år}other{om # år}',\n    },\n    NARROW:{\n      R:{'-1':'i fjol','0':'i år','1':'nästa år'},\n      P:'one{−# år}other{−# år}',\n      F:'one{+# år}other{+# år}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_sw =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'jana','-2':'juzi','0':'leo','1':'kesho','2':'kesho kutwa'},\n      P:'one{siku # iliyopita}other{siku # zilizopita}',\n      F:'one{baada ya siku #}other{baada ya siku #}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'saa hii'},\n      P:'one{saa # iliyopita}other{saa # zilizopita}',\n      F:'one{baada ya saa #}other{baada ya saa #}',\n    },\n    NARROW:{\n      R:{'0':'saa hii'},\n      P:'one{Saa # iliyopita}other{Saa # zilizopita}',\n      F:'one{baada ya saa #}other{baada ya saa #}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'dakika hii'},\n      P:'one{dakika # iliyopita}other{dakika # zilizopita}',\n      F:'one{baada ya dakika #}other{baada ya dakika #}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'mwezi uliopita','0':'mwezi huu','1':'mwezi ujao'},\n      P:'one{mwezi # uliopita}other{miezi # iliyopita}',\n      F:'one{baada ya mwezi #}other{baada ya miezi #}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'robo ya mwaka iliyopita','0':'robo hii ya mwaka','1':'robo ya mwaka inayofuata'},\n      P:'one{robo # iliyopita}other{robo # zilizopita}',\n      F:'one{baada ya robo #}other{baada ya robo #}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'sasa hivi'},\n      P:'one{Sekunde # iliyopita}other{Sekunde # zilizopita}',\n      F:'one{baada ya sekunde #}other{baada ya sekunde #}',\n    },\n    SHORT:{\n      R:{'0':'sasa hivi'},\n      P:'one{sekunde # iliyopita}other{sekunde # zilizopita}',\n      F:'one{baada ya sekunde #}other{baada ya sekunde #}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'wiki iliyopita','0':'wiki hii','1':'wiki ijayo'},\n      P:'one{wiki # iliyopita}other{wiki # zilizopita}',\n      F:'one{baada ya wiki #}other{baada ya wiki #}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'mwaka uliopita','0':'mwaka huu','1':'mwaka ujao'},\n      P:'one{mwaka # uliopita}other{miaka # iliyopita}',\n      F:'one{baada ya mwaka #}other{baada ya miaka #}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ta =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'நேற்று','-2':'நேற்று முன் தினம்','0':'இன்று','1':'நாளை','2':'நாளை மறுநாள்'},\n      P:'one{# நாளுக்கு முன்}other{# நாட்களுக்கு முன்}',\n      F:'one{# நாளில்}other{# நாட்களில்}',\n    },\n    NARROW:{\n      R:{'-1':'நேற்று','-2':'நேற்று முன் தினம்','0':'இன்று','1':'நாளை','2':'நாளை மறுநாள்'},\n      P:'one{# நா. முன்}other{# நா. முன்}',\n      F:'one{# நா.}other{# நா.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'இந்த ஒரு மணிநேரத்தில்'},\n      P:'one{# மணிநேரம் முன்}other{# மணிநேரம் முன்}',\n      F:'one{# மணிநேரத்தில்}other{# மணிநேரத்தில்}',\n    },\n    SHORT:{\n      R:{'0':'இந்த ஒரு மணிநேரத்தில்'},\n      P:'one{# மணி. முன்}other{# மணி. முன்}',\n      F:'one{# மணி.}other{# மணி.}',\n    },\n    NARROW:{\n      R:{'0':'இந்த ஒரு மணிநேரத்தில்'},\n      P:'one{# ம. முன்}other{# ம. முன்}',\n      F:'one{# ம.}other{# ம.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'இந்த ஒரு நிமிடத்தில்'},\n      P:'one{# நிமிடத்திற்கு முன்}other{# நிமிடங்களுக்கு முன்}',\n      F:'one{# நிமிடத்தில்}other{# நிமிடங்களில்}',\n    },\n    SHORT:{\n      R:{'0':'இந்த ஒரு நிமிடத்தில்'},\n      P:'one{# நிமி. முன்}other{# நிமி. முன்}',\n      F:'one{# நிமி.}other{# நிமி.}',\n    },\n    NARROW:{\n      R:{'0':'இந்த ஒரு நிமிடத்தில்'},\n      P:'one{# நி. முன்}other{# நி. முன்}',\n      F:'one{# நி.}other{# நி.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'கடந்த மாதம்','0':'இந்த மாதம்','1':'அடுத்த மாதம்'},\n      P:'one{# மாதத்துக்கு முன்}other{# மாதங்களுக்கு முன்}',\n      F:'one{# மாதத்தில்}other{# மாதங்களில்}',\n    },\n    SHORT:{\n      R:{'-1':'கடந்த மாதம்','0':'இந்த மாதம்','1':'அடுத்த மாதம்'},\n      P:'one{# மாத. முன்}other{# மாத. முன்}',\n      F:'one{# மாத.}other{# மாத.}',\n    },\n    NARROW:{\n      R:{'-1':'கடந்த மாதம்','0':'இந்த மாதம்','1':'அடுத்த மாதம்'},\n      P:'one{# மா. முன்}other{# மா. முன்}',\n      F:'one{# மா.}other{# மா.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'கடந்த காலாண்டு','0':'இந்த காலாண்டு','1':'அடுத்த காலாண்டு'},\n      P:'one{# காலாண்டுக்கு முன்}other{# காலாண்டுகளுக்கு முன்}',\n      F:'one{+# காலாண்டில்}other{# காலாண்டுகளில்}',\n    },\n    SHORT:{\n      R:{'-1':'இறுதி காலாண்டு','0':'இந்த காலாண்டு','1':'அடுத்த காலாண்டு'},\n      P:'one{# காலா. முன்}other{# காலா. முன்}',\n      F:'one{# காலா.}other{# காலா.}',\n    },\n    NARROW:{\n      R:{'-1':'இறுதி காலாண்டு','0':'இந்த காலாண்டு','1':'அடுத்த காலாண்டு'},\n      P:'one{# கா. முன்}other{# கா. முன்}',\n      F:'one{# கா.}other{# கா.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'இப்போது'},\n      P:'one{# விநாடிக்கு முன்}other{# விநாடிகளுக்கு முன்}',\n      F:'one{# விநாடியில்}other{# விநாடிகளில்}',\n    },\n    SHORT:{\n      R:{'0':'இப்போது'},\n      P:'one{# விநா. முன்}other{# விநா. முன்}',\n      F:'one{# விநா.}other{# விநா.}',\n    },\n    NARROW:{\n      R:{'0':'இப்போது'},\n      P:'one{# வி. முன்}other{# வி. முன்}',\n      F:'one{# வி.}other{# வி.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'கடந்த வாரம்','0':'இந்த வாரம்','1':'அடுத்த வாரம்'},\n      P:'one{# வாரத்திற்கு முன்}other{# வாரங்களுக்கு முன்}',\n      F:'one{# வாரத்தில்}other{# வாரங்களில்}',\n    },\n    SHORT:{\n      R:{'-1':'கடந்த வாரம்','0':'இந்த வாரம்','1':'அடுத்த வாரம்'},\n      P:'one{# வார. முன்}other{# வார. முன்}',\n      F:'one{# வார.}other{# வார.}',\n    },\n    NARROW:{\n      R:{'-1':'கடந்த வாரம்','0':'இந்த வாரம்','1':'அடுத்த வாரம்'},\n      P:'one{# வா. முன்}other{# வா. முன்}',\n      F:'one{# வா.}other{# வா.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'கடந்த ஆண்டு','0':'இந்த ஆண்டு','1':'அடுத்த ஆண்டு'},\n      P:'one{# ஆண்டிற்கு முன்}other{# ஆண்டுகளுக்கு முன்}',\n      F:'one{# ஆண்டில்}other{# ஆண்டுகளில்}',\n    },\n    NARROW:{\n      R:{'-1':'கடந்த ஆண்டு','0':'இந்த ஆண்டு','1':'அடுத்த ஆண்டு'},\n      P:'one{# ஆ. முன்}other{# ஆ. முன்}',\n      F:'one{# ஆ.}other{# ஆ.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_te =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'నిన్న','-2':'మొన్న','0':'ఈ రోజు','1':'రేపు','2':'ఎల్లుండి'},\n      P:'one{# రోజు క్రితం}other{# రోజుల క్రితం}',\n      F:'one{# రోజులో}other{# రోజుల్లో}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ఈ గంట'},\n      P:'one{# గంట క్రితం}other{# గంటల క్రితం}',\n      F:'one{# గంటలో}other{# గంటల్లో}',\n    },\n    SHORT:{\n      R:{'0':'ఈ గంట'},\n      P:'one{# గం. క్రితం}other{# గం. క్రితం}',\n      F:'one{# గం.లో}other{# గం.లో}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'ఈ నిమిషం'},\n      P:'one{# నిమిషం క్రితం}other{# నిమిషాల క్రితం}',\n      F:'one{# నిమిషంలో}other{# నిమిషాల్లో}',\n    },\n    SHORT:{\n      R:{'0':'ఈ నిమిషం'},\n      P:'one{# నిమి. క్రితం}other{# నిమి. క్రితం}',\n      F:'one{# నిమి.లో}other{# నిమి.లో}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'గత నెల','0':'ఈ నెల','1':'తదుపరి నెల'},\n      P:'one{# నెల క్రితం}other{# నెలల క్రితం}',\n      F:'one{# నెలలో}other{# నెలల్లో}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'గత త్రైమాసికం','0':'ఈ త్రైమాసికం','1':'తదుపరి త్రైమాసికం'},\n      P:'one{# త్రైమాసికం క్రితం}other{# త్రైమాసికాల క్రితం}',\n      F:'one{# త్రైమాసికంలో}other{# త్రైమాసికాల్లో}',\n    },\n    SHORT:{\n      R:{'-1':'గత త్రైమాసికం','0':'ఈ త్రైమాసికం','1':'తదుపరి త్రైమాసికం'},\n      P:'one{# త్రైమా. క్రితం}other{# త్రైమా. క్రితం}',\n      F:'one{# త్రైమా.లో}other{# త్రైమా.ల్లో}',\n    },\n    NARROW:{\n      R:{'-1':'గత త్రైమాసికం','0':'ఈ త్రైమాసికం','1':'తదుపరి త్రైమాసికం'},\n      P:'one{# త్రైమా. క్రితం}other{# త్రైమా. క్రితం}',\n      F:'one{# త్రైమాసికంలో}other{# త్రైమాసికాల్లో}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ప్రస్తుతం'},\n      P:'one{# సెకను క్రితం}other{# సెకన్ల క్రితం}',\n      F:'one{# సెకనులో}other{# సెకన్లలో}',\n    },\n    SHORT:{\n      R:{'0':'ప్రస్తుతం'},\n      P:'one{# సెక. క్రితం}other{# సెక. క్రితం}',\n      F:'one{# సెకనులో}other{# సెకన్లలో}',\n    },\n    NARROW:{\n      R:{'0':'ప్రస్తుతం'},\n      P:'one{# సెక. క్రితం}other{# సెక. క్రితం}',\n      F:'one{# సెక.లో}other{# సెక. లో}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'గత వారం','0':'ఈ వారం','1':'తదుపరి వారం'},\n      P:'one{# వారం క్రితం}other{# వారాల క్రితం}',\n      F:'one{# వారంలో}other{# వారాల్లో}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'గత సంవత్సరం','0':'ఈ సంవత్సరం','1':'తదుపరి సంవత్సరం'},\n      P:'one{# సంవత్సరం క్రితం}other{# సంవత్సరాల క్రితం}',\n      F:'one{# సంవత్సరంలో}other{# సంవత్సరాల్లో}',\n    },\n    SHORT:{\n      R:{'-1':'గత సంవత్సరం','0':'ఈ సంవత్సరం','1':'తదుపరి సంవత్సరం'},\n      P:'one{# సం. క్రితం}other{# సం. క్రితం}',\n      F:'one{# సం.లో}other{# సం.ల్లో}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_th =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'เมื่อวาน','-2':'เมื่อวานซืน','0':'วันนี้','1':'พรุ่งนี้','2':'มะรืนนี้'},\n      P:'other{# วันที่ผ่านมา}',\n      F:'other{ในอีก # วัน}',\n    },\n    SHORT:{\n      R:{'-1':'เมื่อวาน','-2':'เมื่อวานซืน','0':'วันนี้','1':'พรุ่งนี้','2':'มะรืนนี้'},\n      P:'other{# วันที่แล้ว}',\n      F:'other{ใน # วัน}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ชั่วโมงนี้'},\n      P:'other{# ชั่วโมงที่ผ่านมา}',\n      F:'other{ในอีก # ชั่วโมง}',\n    },\n    SHORT:{\n      R:{'0':'ชั่วโมงนี้'},\n      P:'other{# ชม. ที่แล้ว}',\n      F:'other{ใน # ชม.}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'นาทีนี้'},\n      P:'other{# นาทีที่ผ่านมา}',\n      F:'other{ในอีก # นาที}',\n    },\n    SHORT:{\n      R:{'0':'นาทีนี้'},\n      P:'other{# นาทีที่แล้ว}',\n      F:'other{ใน # นาที}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'เดือนที่แล้ว','0':'เดือนนี้','1':'เดือนหน้า'},\n      P:'other{# เดือนที่ผ่านมา}',\n      F:'other{ในอีก # เดือน}',\n    },\n    SHORT:{\n      R:{'-1':'เดือนที่แล้ว','0':'เดือนนี้','1':'เดือนหน้า'},\n      P:'other{# เดือนที่แล้ว}',\n      F:'other{ใน # เดือน}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'ไตรมาสที่แล้ว','0':'ไตรมาสนี้','1':'ไตรมาสหน้า'},\n      P:'other{# ไตรมาสที่แล้ว}',\n      F:'other{ในอีก # ไตรมาส}',\n    },\n    SHORT:{\n      R:{'-1':'ไตรมาสที่แล้ว','0':'ไตรมาสนี้','1':'ไตรมาสหน้า'},\n      P:'other{# ไตรมาสที่แล้ว}',\n      F:'other{ใน # ไตรมาส}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ขณะนี้'},\n      P:'other{# วินาทีที่ผ่านมา}',\n      F:'other{ในอีก # วินาที}',\n    },\n    SHORT:{\n      R:{'0':'ขณะนี้'},\n      P:'other{# วินาทีที่แล้ว}',\n      F:'other{ใน # วินาที}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'สัปดาห์ที่แล้ว','0':'สัปดาห์นี้','1':'สัปดาห์หน้า'},\n      P:'other{# สัปดาห์ที่ผ่านมา}',\n      F:'other{ในอีก # สัปดาห์}',\n    },\n    SHORT:{\n      R:{'-1':'สัปดาห์ที่แล้ว','0':'สัปดาห์นี้','1':'สัปดาห์หน้า'},\n      P:'other{# สัปดาห์ที่แล้ว}',\n      F:'other{ใน # สัปดาห์}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'ปีที่แล้ว','0':'ปีนี้','1':'ปีหน้า'},\n      P:'other{# ปีที่แล้ว}',\n      F:'other{ในอีก # ปี}',\n    },\n    SHORT:{\n      R:{'-1':'ปีที่แล้ว','0':'ปีนี้','1':'ปีหน้า'},\n      P:'other{# ปีที่แล้ว}',\n      F:'other{ใน # ปี}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_tl =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'kahapon','-2':'Araw bago ang kahapon','0':'ngayong araw','1':'bukas','2':'Samakalawa'},\n      P:'one{# araw ang nakalipas}other{# (na) araw ang nakalipas}',\n      F:'one{sa # araw}other{sa # (na) araw}',\n    },\n    SHORT:{\n      R:{'-1':'kahapon','-2':'Araw bago ang kahapon','0':'ngayong araw','1':'bukas','2':'Samakalawa'},\n      P:'one{# (na) araw ang nakalipas}other{# (na) araw ang nakalipas}',\n      F:'one{sa # (na) araw}other{sa # (na) araw}',\n    },\n    NARROW:{\n      R:{'-1':'kahapon','-2':'Araw bago ang kahapon','0':'ngayong araw','1':'bukas','2':'Samakalawa'},\n      P:'one{# araw ang nakalipas}other{# (na) araw ang nakalipas}',\n      F:'one{sa # araw}other{sa # (na) araw}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'ngayong oras'},\n      P:'one{# oras ang nakalipas}other{# (na) oras ang nakalipas}',\n      F:'one{sa # oras}other{sa # (na) oras}',\n    },\n    NARROW:{\n      R:{'0':'ngayong oras'},\n      P:'one{# oras nakalipas}other{# (na) oras nakalipas}',\n      F:'one{sa # oras}other{sa # (na) oras}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'sa minutong ito'},\n      P:'one{# minuto ang nakalipas}other{# (na) minuto ang nakalipas}',\n      F:'one{sa # minuto}other{sa # (na) minuto}',\n    },\n    SHORT:{\n      R:{'0':'sa minutong ito'},\n      P:'one{# min. ang nakalipas}other{# (na) min. ang nakalipas}',\n      F:'one{sa # min.}other{sa # (na) min.}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'nakaraang buwan','0':'ngayong buwan','1':'susunod na buwan'},\n      P:'one{# buwan ang nakalipas}other{# (na) buwan ang nakalipas}',\n      F:'one{sa # buwan}other{sa # (na) buwan}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'nakaraang quarter','0':'ngayong quarter','1':'susunod na quarter'},\n      P:'one{# quarter ang nakalipas}other{# (na) quarter ang nakalipas}',\n      F:'one{sa # quarter}other{sa # (na) quarter}',\n    },\n    SHORT:{\n      R:{'-1':'nakaraang quarter','0':'ngayong quarter','1':'susunod na quarter'},\n      P:'one{# quarter ang nakalipas}other{# (na) quarter ang nakalipas}',\n      F:'one{sa # (na) quarter}other{sa # (na) quarter}',\n    },\n    NARROW:{\n      R:{'-1':'nakaraang quarter','0':'ngayong quarter','1':'susunod na quarter'},\n      P:'one{# quarter ang nakalipas}other{# (na) quarter ang nakalipas}',\n      F:'one{sa # quarter}other{sa # (na) quarter}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'ngayon'},\n      P:'one{# segundo ang nakalipas}other{# (na) segundo ang nakalipas}',\n      F:'one{sa # segundo}other{sa # (na) segundo}',\n    },\n    SHORT:{\n      R:{'0':'ngayon'},\n      P:'one{# seg. ang nakalipas}other{# (na) seg. nakalipas}',\n      F:'one{sa # seg.}other{sa # (na) seg.}',\n    },\n    NARROW:{\n      R:{'0':'ngayon'},\n      P:'one{# seg. nakalipas}other{# (na) seg. nakalipas}',\n      F:'one{sa # seg.}other{sa # (na) seg.}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'nakalipas na linggo','0':'sa linggong ito','1':'susunod na linggo'},\n      P:'one{# linggo ang nakalipas}other{# (na) linggo ang nakalipas}',\n      F:'one{sa # linggo}other{sa # (na) linggo}',\n    },\n    SHORT:{\n      R:{'-1':'nakaraang linggo','0':'ngayong linggo','1':'susunod na linggo'},\n      P:'one{# linggo ang nakalipas}other{# (na) linggo ang nakalipas}',\n      F:'one{sa # linggo}other{sa # (na) linggo}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'nakaraang taon','0':'ngayong taon','1':'susunod na taon'},\n      P:'one{# taon ang nakalipas}other{# (na) taon ang nakalipas}',\n      F:'one{sa # taon}other{sa # (na) taon}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_tr =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'dün','-2':'evvelsi gün','0':'bugün','1':'yarın','2':'öbür gün'},\n      P:'one{# gün önce}other{# gün önce}',\n      F:'one{# gün sonra}other{# gün sonra}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'bu saat'},\n      P:'one{# saat önce}other{# saat önce}',\n      F:'one{# saat sonra}other{# saat sonra}',\n    },\n    SHORT:{\n      R:{'0':'bu saat'},\n      P:'one{# sa. önce}other{# sa. önce}',\n      F:'one{# sa. sonra}other{# sa. sonra}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'bu dakika'},\n      P:'one{# dakika önce}other{# dakika önce}',\n      F:'one{# dakika sonra}other{# dakika sonra}',\n    },\n    SHORT:{\n      R:{'0':'bu dakika'},\n      P:'one{# dk. önce}other{# dk. önce}',\n      F:'one{# dk. sonra}other{# dk. sonra}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'geçen ay','0':'bu ay','1':'gelecek ay'},\n      P:'one{# ay önce}other{# ay önce}',\n      F:'one{# ay sonra}other{# ay sonra}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'geçen çeyrek','0':'bu çeyrek','1':'gelecek çeyrek'},\n      P:'one{# çeyrek önce}other{# çeyrek önce}',\n      F:'one{# çeyrek sonra}other{# çeyrek sonra}',\n    },\n    SHORT:{\n      R:{'-1':'geçen çeyrek','0':'bu çeyrek','1':'gelecek çeyrek'},\n      P:'one{# çyr. önce}other{# çyr. önce}',\n      F:'one{# çyr. sonra}other{# çyr. sonra}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'şimdi'},\n      P:'one{# saniye önce}other{# saniye önce}',\n      F:'one{# saniye sonra}other{# saniye sonra}',\n    },\n    SHORT:{\n      R:{'0':'şimdi'},\n      P:'one{# sn. önce}other{# sn. önce}',\n      F:'one{# sn. sonra}other{# sn. sonra}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'geçen hafta','0':'bu hafta','1':'gelecek hafta'},\n      P:'one{# hafta önce}other{# hafta önce}',\n      F:'one{# hafta sonra}other{# hafta sonra}',\n    },\n    SHORT:{\n      R:{'-1':'geçen hafta','0':'bu hafta','1':'gelecek hafta'},\n      P:'one{# hf. önce}other{# hf. önce}',\n      F:'one{# hf. sonra}other{# hf. sonra}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'geçen yıl','0':'bu yıl','1':'gelecek yıl'},\n      P:'one{# yıl önce}other{# yıl önce}',\n      F:'one{# yıl sonra}other{# yıl sonra}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_uk =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'учора','-2':'позавчора','0':'сьогодні','1':'завтра','2':'післязавтра'},\n      P:'few{# дні тому}many{# днів тому}one{# день тому}other{# дня тому}',\n      F:'few{через # дні}many{через # днів}one{через # день}other{через # дня}',\n    },\n    SHORT:{\n      R:{'-1':'учора','-2':'позавчора','0':'сьогодні','1':'завтра','2':'післязавтра'},\n      P:'few{# дн. тому}many{# дн. тому}one{# дн. тому}other{# дн. тому}',\n      F:'few{через # дн.}many{через # дн.}one{через # дн.}other{через # дн.}',\n    },\n    NARROW:{\n      R:{'-1':'учора','-2':'позавчора','0':'сьогодні','1':'завтра','2':'післязавтра'},\n      P:'few{-# дн.}many{-# дн.}one{# д. тому}other{-# дн.}',\n      F:'few{за # д.}many{за # д.}one{за # д.}other{за # д.}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'цієї години'},\n      P:'few{# години тому}many{# годин тому}one{# годину тому}other{# години тому}',\n      F:'few{через # години}many{через # годин}one{через # годину}other{через # години}',\n    },\n    SHORT:{\n      R:{'0':'цієї години'},\n      P:'few{# год тому}many{# год тому}one{# год тому}other{# год тому}',\n      F:'few{через # год}many{через # год}one{через # год}other{через # год}',\n    },\n    NARROW:{\n      R:{'0':'цієї години'},\n      P:'few{# год тому}many{# год тому}one{# год тому}other{# год тому}',\n      F:'few{за # год}many{за # год}one{за # год}other{за # год}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'цієї хвилини'},\n      P:'few{# хвилини тому}many{# хвилин тому}one{# хвилину тому}other{# хвилини тому}',\n      F:'few{через # хвилини}many{через # хвилин}one{через # хвилину}other{через # хвилини}',\n    },\n    SHORT:{\n      R:{'0':'цієї хвилини'},\n      P:'few{# хв тому}many{# хв тому}one{# хв тому}other{# хв тому}',\n      F:'few{через # хв}many{через # хв}one{через # хв}other{через # хв}',\n    },\n    NARROW:{\n      R:{'0':'цієї хвилини'},\n      P:'few{# хв тому}many{# хв тому}one{# хв тому}other{# хв тому}',\n      F:'few{за # хв}many{за # хв}one{за # хв}other{за # хв}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'минулого місяця','0':'цього місяця','1':'наступного місяця'},\n      P:'few{# місяці тому}many{# місяців тому}one{# місяць тому}other{# місяця тому}',\n      F:'few{через # місяці}many{через # місяців}one{через # місяць}other{через # місяця}',\n    },\n    SHORT:{\n      R:{'-1':'минулого місяця','0':'цього місяця','1':'наступного місяця'},\n      P:'few{# міс. тому}many{# міс. тому}one{# міс. тому}other{# міс. тому}',\n      F:'few{через # міс.}many{через # міс.}one{через # міс.}other{через # міс.}',\n    },\n    NARROW:{\n      R:{'-1':'минулого місяця','0':'цього місяця','1':'наступного місяця'},\n      P:'few{# міс. тому}many{# міс. тому}one{# міс. тому}other{# міс. тому}',\n      F:'few{за # міс.}many{за # міс.}one{за # міс.}other{за # міс.}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'минулого кварталу','0':'цього кварталу','1':'наступного кварталу'},\n      P:'few{# квартали тому}many{# кварталів тому}one{# квартал тому}other{# кварталу тому}',\n      F:'few{через # квартали}many{через # кварталів}one{через # квартал}other{через # кварталу}',\n    },\n    SHORT:{\n      R:{'-1':'минулого кв.','0':'цього кв.','1':'наступного кв.'},\n      P:'few{# кв. тому}many{# кв. тому}one{# кв. тому}other{# кв. тому}',\n      F:'few{через # кв.}many{через # кв.}one{через # кв.}other{через # кв.}',\n    },\n    NARROW:{\n      R:{'-1':'минулого кв.','0':'цього кв.','1':'наступного кв.'},\n      P:'few{# кв. тому}many{# кв. тому}one{# кв. тому}other{# кв. тому}',\n      F:'few{за # кв.}many{за # кв.}one{за # кв.}other{за # кв.}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'зараз'},\n      P:'few{# секунди тому}many{# секунд тому}one{# секунду тому}other{# секунди тому}',\n      F:'few{через # секунди}many{через # секунд}one{через # секунду}other{через # секунди}',\n    },\n    SHORT:{\n      R:{'0':'зараз'},\n      P:'few{# с тому}many{# с тому}one{# с тому}other{# с тому}',\n      F:'few{через # с}many{через # с}one{через # с}other{через # с}',\n    },\n    NARROW:{\n      R:{'0':'зараз'},\n      P:'few{# с тому}many{# с тому}one{# с тому}other{# с тому}',\n      F:'few{за # с}many{за # с}one{за # с}other{за # с}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'минулого тижня','0':'цього тижня','1':'наступного тижня'},\n      P:'few{# тижні тому}many{# тижнів тому}one{# тиждень тому}other{# тижня тому}',\n      F:'few{через # тижні}many{через # тижнів}one{через # тиждень}other{через # тижня}',\n    },\n    SHORT:{\n      R:{'-1':'минулого тижня','0':'цього тижня','1':'наступного тижня'},\n      P:'few{# тиж. тому}many{# тиж. тому}one{# тиж. тому}other{# тиж. тому}',\n      F:'few{через # тиж.}many{через # тиж.}one{через # тиж.}other{через # тиж.}',\n    },\n    NARROW:{\n      R:{'-1':'минулого тижня','0':'цього тижня','1':'наступного тижня'},\n      P:'few{# тиж. тому}many{# тиж. тому}one{# тиж. тому}other{# тиж. тому}',\n      F:'few{за # тиж.}many{за # тиж.}one{за # тиж.}other{за # тиж.}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'торік','0':'цього року','1':'наступного року'},\n      P:'few{# роки тому}many{# років тому}one{# рік тому}other{# року тому}',\n      F:'few{через # роки}many{через # років}one{через # рік}other{через # року}',\n    },\n    SHORT:{\n      R:{'-1':'торік','0':'цього року','1':'наступного року'},\n      P:'few{# р. тому}many{# р. тому}one{# р. тому}other{# р. тому}',\n      F:'few{через # р.}many{через # р.}one{через # р.}other{через # р.}',\n    },\n    NARROW:{\n      R:{'-1':'торік','0':'цього року','1':'наступного року'},\n      P:'few{# р. тому}many{# р. тому}one{# р. тому}other{# р. тому}',\n      F:'few{за # р.}many{за # р.}one{за # р.}other{за # р.}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_ur =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'گزشتہ کل','-2':'گزشتہ پرسوں','0':'آج','1':'آئندہ کل','2':'آنے والا پرسوں'},\n      P:'one{# دن پہلے}other{# دنوں پہلے}',\n      F:'one{# دن میں}other{# دنوں میں}',\n    },\n    NARROW:{\n      R:{'-1':'گزشتہ کل','-2':'گزشتہ پرسوں','0':'آج','1':'آئندہ کل','2':'آنے والا پرسوں'},\n      P:'one{# دن پہلے}other{# دن پہلے}',\n      F:'one{# دن میں}other{# دنوں میں}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'اس گھنٹے'},\n      P:'one{# گھنٹہ پہلے}other{# گھنٹے پہلے}',\n      F:'one{# گھنٹے میں}other{# گھنٹے میں}',\n    },\n    SHORT:{\n      R:{'0':'اس گھنٹے'},\n      P:'one{# گھنٹے پہلے}other{# گھنٹے پہلے}',\n      F:'one{# گھنٹے میں}other{# گھنٹے میں}',\n    },\n    NARROW:{\n      R:{'0':'اس گھنٹے'},\n      P:'one{# گھنٹہ پہلے}other{# گھنٹے پہلے}',\n      F:'one{# گھنٹے میں}other{# گھنٹوں میں}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'اس منٹ'},\n      P:'one{# منٹ پہلے}other{# منٹ پہلے}',\n      F:'one{# منٹ میں}other{# منٹ میں}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'پچھلا مہینہ','0':'اس مہینہ','1':'اگلا مہینہ'},\n      P:'one{# مہینہ پہلے}other{# مہینے پہلے}',\n      F:'one{# مہینہ میں}other{# مہینے میں}',\n    },\n    SHORT:{\n      R:{'-1':'پچھلے مہینہ','0':'اس مہینہ','1':'اگلے مہینہ'},\n      P:'one{# ماہ قبل}other{# ماہ قبل}',\n      F:'one{# ماہ میں}other{# ماہ میں}',\n    },\n    NARROW:{\n      R:{'-1':'پچھلے مہینہ','0':'اس مہینہ','1':'اگلے مہینہ'},\n      P:'one{# ماہ پہلے}other{# ماہ پہلے}',\n      F:'one{# ماہ میں}other{# ماہ میں}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'گزشتہ سہ ماہی','0':'اس سہ ماہی','1':'اگلے سہ ماہی'},\n      P:'one{# سہ ماہی پہلے}other{# سہ ماہی پہلے}',\n      F:'one{# سہ ماہی میں}other{# سہ ماہی میں}',\n    },\n    SHORT:{\n      R:{'-1':'گزشتہ سہ ماہی','0':'اس سہ ماہی','1':'اگلے سہ ماہی'},\n      P:'one{# سہ ماہی قبل}other{# سہ ماہی قبل}',\n      F:'one{# سہ ماہی میں}other{# سہ ماہی میں}',\n    },\n    NARROW:{\n      R:{'-1':'گزشتہ سہ ماہی','0':'اس سہ ماہی','1':'اگلے سہ ماہی'},\n      P:'one{# سہ ماہی پہلے}other{# سہ ماہی پہلے}',\n      F:'one{# سہ ماہی میں}other{# سہ ماہی میں}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'اب'},\n      P:'one{# سیکنڈ پہلے}other{# سیکنڈ پہلے}',\n      F:'one{# سیکنڈ میں}other{# سیکنڈ میں}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'پچھلے ہفتہ','0':'اس ہفتہ','1':'اگلے ہفتہ'},\n      P:'one{# ہفتہ پہلے}other{# ہفتے پہلے}',\n      F:'one{# ہفتہ میں}other{# ہفتے میں}',\n    },\n    SHORT:{\n      R:{'-1':'پچھلے ہفتہ','0':'اس ہفتہ','1':'اگلے ہفتہ'},\n      P:'one{# ہفتے پہلے}other{# ہفتے پہلے}',\n      F:'one{# ہفتے میں}other{# ہفتے میں}',\n    },\n    NARROW:{\n      R:{'-1':'پچھلے ہفتہ','0':'اس ہفتہ','1':'اگلے ہفتہ'},\n      P:'one{# ہفتہ پہلے}other{# ہفتے پہلے}',\n      F:'one{# ہفتہ میں}other{# ہفتے میں}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'گزشتہ سال','0':'اس سال','1':'اگلے سال'},\n      P:'one{# سال پہلے}other{# سال پہلے}',\n      F:'one{# سال میں}other{# سال میں}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_uz =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'kecha','0':'bugun','1':'ertaga'},\n      P:'one{# kun oldin}other{# kun oldin}',\n      F:'one{# kundan keyin}other{# kundan keyin}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'shu soatda'},\n      P:'one{# soat oldin}other{# soat oldin}',\n      F:'one{# soatdan keyin}other{# soatdan keyin}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'shu daqiqada'},\n      P:'one{# daqiqa oldin}other{# daqiqa oldin}',\n      F:'one{# daqiqadan keyin}other{# daqiqadan keyin}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'o‘tgan oy','0':'shu oy','1':'keyingi oy'},\n      P:'one{# oy oldin}other{# oy oldin}',\n      F:'one{# oydan keyin}other{# oydan keyin}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'o‘tgan chorak','0':'shu chorak','1':'keyingi chorak'},\n      P:'one{# chorak oldin}other{# chorak oldin}',\n      F:'one{# chorakdan keyin}other{# chorakdan keyin}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'hozir'},\n      P:'one{# soniya oldin}other{# soniya oldin}',\n      F:'one{# soniyadan keyin}other{# soniyadan keyin}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'o‘tgan hafta','0':'shu hafta','1':'keyingi hafta'},\n      P:'one{# hafta oldin}other{# hafta oldin}',\n      F:'one{# haftadan keyin}other{# haftadan keyin}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'o‘tgan yil','0':'shu yil','1':'keyingi yil'},\n      P:'one{# yil oldin}other{# yil oldin}',\n      F:'one{# yildan keyin}other{# yildan keyin}',\n    },\n    SHORT:{\n      R:{'-1':'oʻtgan yil','0':'bu yil','1':'keyingi yil'},\n      P:'one{# yil oldin}other{# yil oldin}',\n      F:'one{# yildan keyin}other{# yildan keyin}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_vi =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'Hôm qua','-2':'Hôm kia','0':'Hôm nay','1':'Ngày mai','2':'Ngày kia'},\n      P:'other{# ngày trước}',\n      F:'other{sau # ngày nữa}',\n    },\n    SHORT:{\n      R:{'-2':'Hôm kia','2':'Ngày kia'},\n      P:'other{# ngày trước}',\n      F:'other{sau # ngày nữa}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'giờ này'},\n      P:'other{# giờ trước}',\n      F:'other{sau # giờ nữa}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'phút này'},\n      P:'other{# phút trước}',\n      F:'other{sau # phút nữa}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'tháng trước','0':'tháng này','1':'tháng sau'},\n      P:'other{# tháng trước}',\n      F:'other{sau # tháng nữa}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'quý trước','0':'quý này','1':'quý sau'},\n      P:'other{# quý trước}',\n      F:'other{sau # quý nữa}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'bây giờ'},\n      P:'other{# giây trước}',\n      F:'other{sau # giây nữa}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'tuần trước','0':'tuần này','1':'tuần sau'},\n      P:'other{# tuần trước}',\n      F:'other{sau # tuần nữa}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'năm ngoái','0':'năm nay','1':'năm sau'},\n      P:'other{# năm trước}',\n      F:'other{sau # năm nữa}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zh =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'昨天','-2':'前天','0':'今天','1':'明天','2':'后天'},\n      P:'other{#天前}',\n      F:'other{#天后}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'这一时间 / 此时'},\n      P:'other{#小时前}',\n      F:'other{#小时后}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'此刻'},\n      P:'other{#分钟前}',\n      F:'other{#分钟后}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'上个月','0':'本月','1':'下个月'},\n      P:'other{#个月前}',\n      F:'other{#个月后}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'上季度','0':'本季度','1':'下季度'},\n      P:'other{#个季度前}',\n      F:'other{#个季度后}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'现在'},\n      P:'other{#秒钟前}',\n      F:'other{#秒钟后}',\n    },\n    SHORT:{\n      R:{'0':'现在'},\n      P:'other{#秒前}',\n      F:'other{#秒后}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'上周','0':'本周','1':'下周'},\n      P:'other{#周前}',\n      F:'other{#周后}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'去年','0':'今年','1':'明年'},\n      P:'other{#年前}',\n      F:'other{#年后}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zh_CN = exports.RelativeDateTimeSymbols_zh;\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zh_HK =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'昨日','-2':'前日','0':'今日','1':'明日','2':'後日'},\n      P:'other{# 日前}',\n      F:'other{# 日後}',\n    },\n    NARROW:{\n      R:{'-1':'昨日','-2':'前日','0':'今日','1':'明日','2':'後日'},\n      P:'other{#日前}',\n      F:'other{#日後}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'這個小時'},\n      P:'other{# 小時前}',\n      F:'other{# 小時後}',\n    },\n    NARROW:{\n      R:{'0':'這個小時'},\n      P:'other{#小時前}',\n      F:'other{#小時後}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'這分鐘'},\n      P:'other{# 分鐘前}',\n      F:'other{# 分鐘後}',\n    },\n    NARROW:{\n      R:{'0':'這分鐘'},\n      P:'other{#分前}',\n      F:'other{#分後}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'上個月','0':'本月','1':'下個月'},\n      P:'other{# 個月前}',\n      F:'other{# 個月後}',\n    },\n    NARROW:{\n      R:{'-1':'上個月','0':'本月','1':'下個月'},\n      P:'other{#個月前}',\n      F:'other{#個月後}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'上一季','0':'今季','1':'下一季'},\n      P:'other{# 季前}',\n      F:'other{# 季後}',\n    },\n    SHORT:{\n      R:{'-1':'上季','0':'今季','1':'下季'},\n      P:'other{# 季前}',\n      F:'other{# 季後}',\n    },\n    NARROW:{\n      R:{'-1':'上季','0':'今季','1':'下季'},\n      P:'other{-#Q}',\n      F:'other{+#Q}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'現在'},\n      P:'other{# 秒前}',\n      F:'other{# 秒後}',\n    },\n    NARROW:{\n      R:{'0':'現在'},\n      P:'other{#秒前}',\n      F:'other{#秒後}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'上星期','0':'本星期','1':'下星期'},\n      P:'other{# 星期前}',\n      F:'other{# 星期後}',\n    },\n    NARROW:{\n      R:{'-1':'上星期','0':'本星期','1':'下星期'},\n      P:'other{#星期前}',\n      F:'other{#星期後}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'上年','0':'今年','1':'下年'},\n      P:'other{# 年前}',\n      F:'other{# 年後}',\n    },\n    NARROW:{\n      R:{'-1':'上年','0':'今年','1':'下年'},\n      P:'other{#年前}',\n      F:'other{#年後}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zh_TW =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'昨天','-2':'前天','0':'今天','1':'明天','2':'後天'},\n      P:'other{# 天前}',\n      F:'other{# 天後}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'這一小時'},\n      P:'other{# 小時前}',\n      F:'other{# 小時後}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'這一分鐘'},\n      P:'other{# 分鐘前}',\n      F:'other{# 分鐘後}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'上個月','0':'本月','1':'下個月'},\n      P:'other{# 個月前}',\n      F:'other{# 個月後}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'上一季','0':'這一季','1':'下一季'},\n      P:'other{# 季前}',\n      F:'other{# 季後}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'現在'},\n      P:'other{# 秒前}',\n      F:'other{# 秒後}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'上週','0':'本週','1':'下週'},\n      P:'other{# 週前}',\n      F:'other{# 週後}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'去年','0':'今年','1':'明年'},\n      P:'other{# 年前}',\n      F:'other{# 年後}',\n    },\n  },\n};\n\n/** @const {!RelativeDateTimeSymbols} */\nexports.RelativeDateTimeSymbols_zu =  {\n  DAY: {\n    LONG:{\n      R:{'-1':'izolo','-2':'usuku olwandulela olwayizolo','0':'namhlanje','1':'kusasa','2':'usuku olulandela olwakusasa'},\n      P:'one{osukwini olungu-# olwedlule}other{ezinsukwini ezingu-# ezedlule.}',\n      F:'one{osukwini olungu-# oluzayo}other{ezinsukwini ezingu-# ezizayo}',\n    },\n    SHORT:{\n      R:{'-1':'izolo','0':'namhlanje','1':'kusasa'},\n      P:'one{# usuku olwedlule}other{# izinsuku ezedlule}',\n      F:'one{osukwini olungu-# oluzayo}other{ezinsukwini ezingu-# ezizayo}',\n    },\n  },\n  HOUR: {\n    LONG:{\n      R:{'0':'leli hora'},\n      P:'one{# ihora eledlule}other{emahoreni angu-# edlule}',\n      F:'one{ehoreni elingu-# elizayo}other{emahoreni angu-# ezayo}',\n    },\n    NARROW:{\n      R:{'0':'leli hora'},\n      P:'one{# ihora eledlule}other{# amahora edlule}',\n      F:'one{ehoreni elingu-# elizayo}other{emahoreni angu-# ezayo}',\n    },\n  },\n  MINUTE: {\n    LONG:{\n      R:{'0':'leli minithi'},\n      P:'one{# iminithi eledlule}other{# amaminithi edlule}',\n      F:'one{kuminithi elingu-# elizayo}other{kumaminithi angu-# ezayo}',\n    },\n  },\n  MONTH: {\n    LONG:{\n      R:{'-1':'inyanga edlule','0':'le nyanga','1':'inyanga ezayo'},\n      P:'one{# inyanga edlule}other{# izinyanga ezedlule}',\n      F:'one{enyangeni engu-#}other{ezinyangeni ezingu-# ezizayo}',\n    },\n    SHORT:{\n      R:{'-1':'inyanga edlule','0':'le nyanga','1':'inyanga ezayo'},\n      P:'one{# izinyanga ezedlule}other{# izinyanga ezedlule}',\n      F:'one{ezinyangeni ezingu-# ezizayo}other{ezinyangeni ezingu-# ezizayo}',\n    },\n    NARROW:{\n      R:{'-1':'inyanga edlule','0':'le nyanga','1':'inyanga ezayo'},\n      P:'one{# izinyanga ezedlule}other{# izinyanga ezedlule}',\n      F:'one{enyangeni engu-# ezayo}other{enyangeni engu-# ezayo}',\n    },\n  },\n  QUARTER: {\n    LONG:{\n      R:{'-1':'ikota edlule','0':'le kota','1':'ikota ezayo'},\n      P:'one{# ikota edlule}other{# amakota adlule}',\n      F:'one{kwikota engu-# ezayo}other{kumakota angu-# ezayo}',\n    },\n    SHORT:{\n      R:{'-1':'ikota edlule','0':'le kota','1':'ikota ezayo'},\n      P:'one{# amakota adlule}other{# amakota edlule}',\n      F:'one{kwikota engu-# ezayo}other{kumakota angu-# ezayo}',\n    },\n    NARROW:{\n      R:{'-1':'ikota edlule','0':'le kota','1':'ikota ezayo'},\n      P:'one{# amakota adlule}other{# amakota edlule}',\n      F:'one{kumakota angu-#}other{kumakota angu-#}',\n    },\n  },\n  SECOND: {\n    LONG:{\n      R:{'0':'manje'},\n      P:'one{# isekhondi eledlule}other{# amasekhondi edlule}',\n      F:'one{kusekhondi elingu-# elizayo}other{kumasekhondi angu-# ezayo}',\n    },\n  },\n  WEEK: {\n    LONG:{\n      R:{'-1':'iviki eledlule','0':'leli viki','1':'iviki elizayo'},\n      P:'one{evikini elingu-# eledlule}other{amaviki angu-# edlule}',\n      F:'one{evikini elingu-#}other{emavikini angu-#}',\n    },\n    SHORT:{\n      R:{'-1':'iviki eledlule','0':'leli viki','1':'iviki elizayo'},\n      P:'one{amaviki angu-# edlule}other{amaviki angu-# edlule}',\n      F:'one{evikini elingu-# elizayo}other{emavikini angu-# ezayo}',\n    },\n    NARROW:{\n      R:{'-1':'iviki eledlule','0':'leli viki','1':'iviki elizayo'},\n      P:'one{amaviki angu-# edlule}other{amaviki angu-# edlule}',\n      F:'one{emavikini angu-# ezayo}other{emavikini angu-# ezayo}',\n    },\n  },\n  YEAR: {\n    LONG:{\n      R:{'-1':'onyakeni odlule','0':'kulo nyaka','1':'unyaka ozayo'},\n      P:'one{# unyaka odlule}other{# iminyaka edlule}',\n      F:'one{onyakeni ongu-# ozayo}other{eminyakeni engu-# ezayo}',\n    },\n    SHORT:{\n      R:{'-1':'onyakeni odlule','0':'kulo nyaka','1':'unyaka ozayo'},\n      P:'one{# unyaka odlule}other{# unyaka odlule}',\n      F:'one{onyakeni ongu-# ozayo}other{eminyakeni engu-# ezayo}',\n    },\n  },\n};\n\nswitch (goog.LOCALE) {\n  case 'af':\n    defaultSymbols = exports.RelativeDateTimeSymbols_af;\n    break;\n  case 'am':\n    defaultSymbols = exports.RelativeDateTimeSymbols_am;\n    break;\n  case 'ar':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar;\n    break;\n  case 'ar_DZ':\n  case 'ar-DZ':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_DZ;\n    break;\n  case 'ar_EG':\n  case 'ar-EG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ar_EG;\n    break;\n  case 'az':\n    defaultSymbols = exports.RelativeDateTimeSymbols_az;\n    break;\n  case 'be':\n    defaultSymbols = exports.RelativeDateTimeSymbols_be;\n    break;\n  case 'bg':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bg;\n    break;\n  case 'bn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bn;\n    break;\n  case 'br':\n    defaultSymbols = exports.RelativeDateTimeSymbols_br;\n    break;\n  case 'bs':\n    defaultSymbols = exports.RelativeDateTimeSymbols_bs;\n    break;\n  case 'ca':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ca;\n    break;\n  case 'chr':\n    defaultSymbols = exports.RelativeDateTimeSymbols_chr;\n    break;\n  case 'cs':\n    defaultSymbols = exports.RelativeDateTimeSymbols_cs;\n    break;\n  case 'cy':\n    defaultSymbols = exports.RelativeDateTimeSymbols_cy;\n    break;\n  case 'da':\n    defaultSymbols = exports.RelativeDateTimeSymbols_da;\n    break;\n  case 'de':\n    defaultSymbols = exports.RelativeDateTimeSymbols_de;\n    break;\n  case 'de_AT':\n  case 'de-AT':\n    defaultSymbols = exports.RelativeDateTimeSymbols_de_AT;\n    break;\n  case 'de_CH':\n  case 'de-CH':\n    defaultSymbols = exports.RelativeDateTimeSymbols_de_CH;\n    break;\n  case 'el':\n    defaultSymbols = exports.RelativeDateTimeSymbols_el;\n    break;\n  case 'en':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en;\n    break;\n  case 'en_AU':\n  case 'en-AU':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_AU;\n    break;\n  case 'en_CA':\n  case 'en-CA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_CA;\n    break;\n  case 'en_GB':\n  case 'en-GB':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_GB;\n    break;\n  case 'en_IE':\n  case 'en-IE':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_IE;\n    break;\n  case 'en_IN':\n  case 'en-IN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_IN;\n    break;\n  case 'en_SG':\n  case 'en-SG':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_SG;\n    break;\n  case 'en_US':\n  case 'en-US':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_US;\n    break;\n  case 'en_ZA':\n  case 'en-ZA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_en_ZA;\n    break;\n  case 'es':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es;\n    break;\n  case 'es_419':\n  case 'es-419':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_419;\n    break;\n  case 'es_ES':\n  case 'es-ES':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_ES;\n    break;\n  case 'es_MX':\n  case 'es-MX':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_MX;\n    break;\n  case 'es_US':\n  case 'es-US':\n    defaultSymbols = exports.RelativeDateTimeSymbols_es_US;\n    break;\n  case 'et':\n    defaultSymbols = exports.RelativeDateTimeSymbols_et;\n    break;\n  case 'eu':\n    defaultSymbols = exports.RelativeDateTimeSymbols_eu;\n    break;\n  case 'fa':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fa;\n    break;\n  case 'fi':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fi;\n    break;\n  case 'fil':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fil;\n    break;\n  case 'fr':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr;\n    break;\n  case 'fr_CA':\n  case 'fr-CA':\n    defaultSymbols = exports.RelativeDateTimeSymbols_fr_CA;\n    break;\n  case 'ga':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ga;\n    break;\n  case 'gl':\n    defaultSymbols = exports.RelativeDateTimeSymbols_gl;\n    break;\n  case 'gsw':\n    defaultSymbols = exports.RelativeDateTimeSymbols_gsw;\n    break;\n  case 'gu':\n    defaultSymbols = exports.RelativeDateTimeSymbols_gu;\n    break;\n  case 'haw':\n    defaultSymbols = exports.RelativeDateTimeSymbols_haw;\n    break;\n  case 'he':\n    defaultSymbols = exports.RelativeDateTimeSymbols_he;\n    break;\n  case 'hi':\n    defaultSymbols = exports.RelativeDateTimeSymbols_hi;\n    break;\n  case 'hr':\n    defaultSymbols = exports.RelativeDateTimeSymbols_hr;\n    break;\n  case 'hu':\n    defaultSymbols = exports.RelativeDateTimeSymbols_hu;\n    break;\n  case 'hy':\n    defaultSymbols = exports.RelativeDateTimeSymbols_hy;\n    break;\n  case 'id':\n    defaultSymbols = exports.RelativeDateTimeSymbols_id;\n    break;\n  case 'in':\n    defaultSymbols = exports.RelativeDateTimeSymbols_in;\n    break;\n  case 'is':\n    defaultSymbols = exports.RelativeDateTimeSymbols_is;\n    break;\n  case 'it':\n    defaultSymbols = exports.RelativeDateTimeSymbols_it;\n    break;\n  case 'iw':\n    defaultSymbols = exports.RelativeDateTimeSymbols_iw;\n    break;\n  case 'ja':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ja;\n    break;\n  case 'ka':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ka;\n    break;\n  case 'kk':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kk;\n    break;\n  case 'km':\n    defaultSymbols = exports.RelativeDateTimeSymbols_km;\n    break;\n  case 'kn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_kn;\n    break;\n  case 'ko':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ko;\n    break;\n  case 'ky':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ky;\n    break;\n  case 'ln':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ln;\n    break;\n  case 'lo':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lo;\n    break;\n  case 'lt':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lt;\n    break;\n  case 'lv':\n    defaultSymbols = exports.RelativeDateTimeSymbols_lv;\n    break;\n  case 'mk':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mk;\n    break;\n  case 'ml':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ml;\n    break;\n  case 'mn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mn;\n    break;\n  case 'mo':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mo;\n    break;\n  case 'mr':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mr;\n    break;\n  case 'ms':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ms;\n    break;\n  case 'mt':\n    defaultSymbols = exports.RelativeDateTimeSymbols_mt;\n    break;\n  case 'my':\n    defaultSymbols = exports.RelativeDateTimeSymbols_my;\n    break;\n  case 'nb':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nb;\n    break;\n  case 'ne':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ne;\n    break;\n  case 'nl':\n    defaultSymbols = exports.RelativeDateTimeSymbols_nl;\n    break;\n  case 'no':\n    defaultSymbols = exports.RelativeDateTimeSymbols_no;\n    break;\n  case 'no_NO':\n  case 'no-NO':\n    defaultSymbols = exports.RelativeDateTimeSymbols_no_NO;\n    break;\n  case 'or':\n    defaultSymbols = exports.RelativeDateTimeSymbols_or;\n    break;\n  case 'pa':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pa;\n    break;\n  case 'pl':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pl;\n    break;\n  case 'pt':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pt;\n    break;\n  case 'pt_BR':\n  case 'pt-BR':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pt_BR;\n    break;\n  case 'pt_PT':\n  case 'pt-PT':\n    defaultSymbols = exports.RelativeDateTimeSymbols_pt_PT;\n    break;\n  case 'ro':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ro;\n    break;\n  case 'ru':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ru;\n    break;\n  case 'sh':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sh;\n    break;\n  case 'si':\n    defaultSymbols = exports.RelativeDateTimeSymbols_si;\n    break;\n  case 'sk':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sk;\n    break;\n  case 'sl':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sl;\n    break;\n  case 'sq':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sq;\n    break;\n  case 'sr':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sr;\n    break;\n  case 'sr_Latn':\n  case 'sr-Latn':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sr_Latn;\n    break;\n  case 'sv':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sv;\n    break;\n  case 'sw':\n    defaultSymbols = exports.RelativeDateTimeSymbols_sw;\n    break;\n  case 'ta':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ta;\n    break;\n  case 'te':\n    defaultSymbols = exports.RelativeDateTimeSymbols_te;\n    break;\n  case 'th':\n    defaultSymbols = exports.RelativeDateTimeSymbols_th;\n    break;\n  case 'tl':\n    defaultSymbols = exports.RelativeDateTimeSymbols_tl;\n    break;\n  case 'tr':\n    defaultSymbols = exports.RelativeDateTimeSymbols_tr;\n    break;\n  case 'uk':\n    defaultSymbols = exports.RelativeDateTimeSymbols_uk;\n    break;\n  case 'ur':\n    defaultSymbols = exports.RelativeDateTimeSymbols_ur;\n    break;\n  case 'uz':\n    defaultSymbols = exports.RelativeDateTimeSymbols_uz;\n    break;\n  case 'vi':\n    defaultSymbols = exports.RelativeDateTimeSymbols_vi;\n    break;\n  case 'zh':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zh;\n    break;\n  case 'zh_CN':\n  case 'zh-CN':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zh_CN;\n    break;\n  case 'zh_HK':\n  case 'zh-HK':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zh_HK;\n    break;\n  case 'zh_TW':\n  case 'zh-TW':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zh_TW;\n    break;\n  case 'zu':\n    defaultSymbols = exports.RelativeDateTimeSymbols_zu;\n    break;\n  default:\n    defaultSymbols = exports.RelativeDateTimeSymbols_en;\n}\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/relativedatetimesymbols.js"],"^:1",["^9K",["~$goog.i18n.relativeDateTimeSymbols"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.html.safehtml.js","^9C",["^9D","goog/html/safehtml.js"],"^9E","goog/html/safehtml.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview The SafeHtml type and its builders.\n *\n * TODO(xtof): Link to document stating type contract.\n */\n\ngoog.provide('goog.html.SafeHtml');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.tags');\ngoog.require('goog.html.SafeScript');\ngoog.require('goog.html.SafeStyle');\ngoog.require('goog.html.SafeStyleSheet');\ngoog.require('goog.html.SafeUrl');\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.html.trustedtypes');\ngoog.require('goog.i18n.bidi.Dir');\ngoog.require('goog.i18n.bidi.DirectionalString');\ngoog.require('goog.labs.userAgent.browser');\ngoog.require('goog.object');\ngoog.require('goog.string.Const');\ngoog.require('goog.string.TypedString');\ngoog.require('goog.string.internal');\n\n\n\n/**\n * A string that is safe to use in HTML context in DOM APIs and HTML documents.\n *\n * A SafeHtml is a string-like object that carries the security type contract\n * that its value as a string will not cause untrusted script execution when\n * evaluated as HTML in a browser.\n *\n * Values of this type are guaranteed to be safe to use in HTML contexts,\n * such as, assignment to the innerHTML DOM property, or interpolation into\n * a HTML template in HTML PC_DATA context, in the sense that the use will not\n * result in a Cross-Site-Scripting vulnerability.\n *\n * Instances of this type must be created via the factory methods\n * (`goog.html.SafeHtml.create`, `goog.html.SafeHtml.htmlEscape`),\n * etc and not by invoking its constructor.  The constructor intentionally\n * takes no parameters and the type is immutable; hence only a default instance\n * corresponding to the empty string can be obtained via constructor invocation.\n *\n * Note that there is no `goog.html.SafeHtml.fromConstant`. The reason is that\n * the following code would create an unsafe HTML:\n *\n * ```\n * goog.html.SafeHtml.concat(\n *     goog.html.SafeHtml.fromConstant(goog.string.Const.from('<script>')),\n *     goog.html.SafeHtml.htmlEscape(userInput),\n *     goog.html.SafeHtml.fromConstant(goog.string.Const.from('<\\/script>')));\n * ```\n *\n * There's `goog.dom.constHtmlToNode` to create a node from constant strings\n * only.\n *\n * @see goog.html.SafeHtml.create\n * @see goog.html.SafeHtml.htmlEscape\n * @constructor\n * @final\n * @struct\n * @implements {goog.i18n.bidi.DirectionalString}\n * @implements {goog.string.TypedString}\n */\ngoog.html.SafeHtml = function() {\n  /**\n   * The contained value of this SafeHtml.  The field has a purposely ugly\n   * name to make (non-compiled) code that attempts to directly access this\n   * field stand out.\n   * @private {!TrustedHTML|string}\n   */\n  this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ = '';\n\n  /**\n   * A type marker used to implement additional run-time type checking.\n   * @see goog.html.SafeHtml.unwrap\n   * @const {!Object}\n   * @private\n   */\n  this.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =\n      goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;\n\n  /**\n   * This SafeHtml's directionality, or null if unknown.\n   * @private {?goog.i18n.bidi.Dir}\n   */\n  this.dir_ = null;\n};\n\n\n/**\n * @define {boolean} Whether to strip out error messages or to leave them in.\n */\ngoog.html.SafeHtml.ENABLE_ERROR_MESSAGES =\n    goog.define('goog.html.SafeHtml.ENABLE_ERROR_MESSAGES', goog.DEBUG);\n\n\n/**\n * Whether the `style` attribute is supported. Set to false to avoid the byte\n * weight of `goog.html.SafeStyle` where unneeded. An error will be thrown if\n * the `style` attribute is used.\n * @define {boolean}\n */\ngoog.html.SafeHtml.SUPPORT_STYLE_ATTRIBUTE =\n    goog.define('goog.html.SafeHtml.SUPPORT_STYLE_ATTRIBUTE', true);\n\n\n/**\n * @override\n * @const\n */\ngoog.html.SafeHtml.prototype.implementsGoogI18nBidiDirectionalString = true;\n\n\n/** @override */\ngoog.html.SafeHtml.prototype.getDirection = function() {\n  return this.dir_;\n};\n\n\n/**\n * @override\n * @const\n */\ngoog.html.SafeHtml.prototype.implementsGoogStringTypedString = true;\n\n\n/**\n * Returns this SafeHtml's value as string.\n *\n * IMPORTANT: In code where it is security relevant that an object's type is\n * indeed `SafeHtml`, use `goog.html.SafeHtml.unwrap` instead of\n * this method. If in doubt, assume that it's security relevant. In particular,\n * note that goog.html functions which return a goog.html type do not guarantee\n * that the returned instance is of the right type. For example:\n *\n * <pre>\n * var fakeSafeHtml = new String('fake');\n * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;\n * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);\n * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by\n * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml\n * // instanceof goog.html.SafeHtml.\n * </pre>\n *\n * @see goog.html.SafeHtml.unwrap\n * @override\n */\ngoog.html.SafeHtml.prototype.getTypedStringValue = function() {\n  return this.privateDoNotAccessOrElseSafeHtmlWrappedValue_.toString();\n};\n\n\nif (goog.DEBUG) {\n  /**\n   * Returns a debug string-representation of this value.\n   *\n   * To obtain the actual string value wrapped in a SafeHtml, use\n   * `goog.html.SafeHtml.unwrap`.\n   *\n   * @see goog.html.SafeHtml.unwrap\n   * @override\n   */\n  goog.html.SafeHtml.prototype.toString = function() {\n    return 'SafeHtml{' + this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ +\n        '}';\n  };\n}\n\n\n/**\n * Performs a runtime check that the provided object is indeed a SafeHtml\n * object, and returns its value.\n * @param {!goog.html.SafeHtml} safeHtml The object to extract from.\n * @return {string} The SafeHtml object's contained string, unless the run-time\n *     type check fails. In that case, `unwrap` returns an innocuous\n *     string, or, if assertions are enabled, throws\n *     `goog.asserts.AssertionError`.\n */\ngoog.html.SafeHtml.unwrap = function(safeHtml) {\n  return goog.html.SafeHtml.unwrapTrustedHTML(safeHtml).toString();\n};\n\n\n/**\n * Unwraps value as TrustedHTML if supported or as a string if not.\n * @param {!goog.html.SafeHtml} safeHtml\n * @return {!TrustedHTML|string}\n * @see goog.html.SafeHtml.unwrap\n */\ngoog.html.SafeHtml.unwrapTrustedHTML = function(safeHtml) {\n  // Perform additional run-time type-checking to ensure that safeHtml is indeed\n  // an instance of the expected type.  This provides some additional protection\n  // against security bugs due to application code that disables type checks.\n  // Specifically, the following checks are performed:\n  // 1. The object is an instance of the expected type.\n  // 2. The object is not an instance of a subclass.\n  // 3. The object carries a type marker for the expected type. \"Faking\" an\n  // object requires a reference to the type marker, which has names intended\n  // to stand out in code reviews.\n  if (safeHtml instanceof goog.html.SafeHtml &&\n      safeHtml.constructor === goog.html.SafeHtml &&\n      safeHtml.SAFE_HTML_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===\n          goog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {\n    return safeHtml.privateDoNotAccessOrElseSafeHtmlWrappedValue_;\n  } else {\n    goog.asserts.fail('expected object of type SafeHtml, got \\'' +\n        safeHtml + '\\' of type ' + goog.typeOf(safeHtml));\n    return 'type_error:SafeHtml';\n  }\n};\n\n\n/**\n * Shorthand for union of types that can sensibly be converted to strings\n * or might already be SafeHtml (as SafeHtml is a goog.string.TypedString).\n * @private\n * @typedef {string|number|boolean|!goog.string.TypedString|\n *           !goog.i18n.bidi.DirectionalString}\n */\ngoog.html.SafeHtml.TextOrHtml_;\n\n\n/**\n * Returns HTML-escaped text as a SafeHtml object.\n *\n * If text is of a type that implements\n * `goog.i18n.bidi.DirectionalString`, the directionality of the new\n * `SafeHtml` object is set to `text`'s directionality, if known.\n * Otherwise, the directionality of the resulting SafeHtml is unknown (i.e.,\n * `null`).\n *\n * @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text to escape. If\n *     the parameter is of type SafeHtml it is returned directly (no escaping\n *     is done).\n * @return {!goog.html.SafeHtml} The escaped text, wrapped as a SafeHtml.\n */\ngoog.html.SafeHtml.htmlEscape = function(textOrHtml) {\n  if (textOrHtml instanceof goog.html.SafeHtml) {\n    return textOrHtml;\n  }\n  var textIsObject = typeof textOrHtml == 'object';\n  var dir = null;\n  if (textIsObject && textOrHtml.implementsGoogI18nBidiDirectionalString) {\n    dir = /** @type {!goog.i18n.bidi.DirectionalString} */ (textOrHtml)\n              .getDirection();\n  }\n  var textAsString;\n  if (textIsObject && textOrHtml.implementsGoogStringTypedString) {\n    textAsString = /** @type {!goog.string.TypedString} */ (textOrHtml)\n                       .getTypedStringValue();\n  } else {\n    textAsString = String(textOrHtml);\n  }\n  return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(\n      goog.string.internal.htmlEscape(textAsString), dir);\n};\n\n\n/**\n * Returns HTML-escaped text as a SafeHtml object, with newlines changed to\n * &lt;br&gt;.\n * @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text to escape. If\n *     the parameter is of type SafeHtml it is returned directly (no escaping\n *     is done).\n * @return {!goog.html.SafeHtml} The escaped text, wrapped as a SafeHtml.\n */\ngoog.html.SafeHtml.htmlEscapePreservingNewlines = function(textOrHtml) {\n  if (textOrHtml instanceof goog.html.SafeHtml) {\n    return textOrHtml;\n  }\n  var html = goog.html.SafeHtml.htmlEscape(textOrHtml);\n  return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(\n      goog.string.internal.newLineToBr(goog.html.SafeHtml.unwrap(html)),\n      html.getDirection());\n};\n\n\n/**\n * Returns HTML-escaped text as a SafeHtml object, with newlines changed to\n * &lt;br&gt; and escaping whitespace to preserve spatial formatting. Character\n * entity #160 is used to make it safer for XML.\n * @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text to escape. If\n *     the parameter is of type SafeHtml it is returned directly (no escaping\n *     is done).\n * @return {!goog.html.SafeHtml} The escaped text, wrapped as a SafeHtml.\n */\ngoog.html.SafeHtml.htmlEscapePreservingNewlinesAndSpaces = function(\n    textOrHtml) {\n  if (textOrHtml instanceof goog.html.SafeHtml) {\n    return textOrHtml;\n  }\n  var html = goog.html.SafeHtml.htmlEscape(textOrHtml);\n  return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(\n      goog.string.internal.whitespaceEscape(goog.html.SafeHtml.unwrap(html)),\n      html.getDirection());\n};\n\n\n/**\n * Coerces an arbitrary object into a SafeHtml object.\n *\n * If `textOrHtml` is already of type `goog.html.SafeHtml`, the same\n * object is returned. Otherwise, `textOrHtml` is coerced to string, and\n * HTML-escaped. If `textOrHtml` is of a type that implements\n * `goog.i18n.bidi.DirectionalString`, its directionality, if known, is\n * preserved.\n *\n * @param {!goog.html.SafeHtml.TextOrHtml_} textOrHtml The text or SafeHtml to\n *     coerce.\n * @return {!goog.html.SafeHtml} The resulting SafeHtml object.\n * @deprecated Use goog.html.SafeHtml.htmlEscape.\n */\ngoog.html.SafeHtml.from = goog.html.SafeHtml.htmlEscape;\n\n\n/**\n * @const\n * @private\n */\ngoog.html.SafeHtml.VALID_NAMES_IN_TAG_ = /^[a-zA-Z0-9-]+$/;\n\n\n/**\n * Set of attributes containing URL as defined at\n * http://www.w3.org/TR/html5/index.html#attributes-1.\n * @private @const {!Object<string,boolean>}\n */\ngoog.html.SafeHtml.URL_ATTRIBUTES_ = goog.object.createSet(\n    'action', 'cite', 'data', 'formaction', 'href', 'manifest', 'poster',\n    'src');\n\n\n/**\n * Tags which are unsupported via create(). They might be supported via a\n * tag-specific create method. These are tags which might require a\n * TrustedResourceUrl in one of their attributes or a restricted type for\n * their content.\n * @private @const {!Object<string,boolean>}\n */\ngoog.html.SafeHtml.NOT_ALLOWED_TAG_NAMES_ = goog.object.createSet(\n    goog.dom.TagName.APPLET, goog.dom.TagName.BASE, goog.dom.TagName.EMBED,\n    goog.dom.TagName.IFRAME, goog.dom.TagName.LINK, goog.dom.TagName.MATH,\n    goog.dom.TagName.META, goog.dom.TagName.OBJECT, goog.dom.TagName.SCRIPT,\n    goog.dom.TagName.STYLE, goog.dom.TagName.SVG, goog.dom.TagName.TEMPLATE);\n\n\n/**\n * @typedef {string|number|goog.string.TypedString|\n *     goog.html.SafeStyle.PropertyMap|undefined}\n */\ngoog.html.SafeHtml.AttributeValue;\n\n\n/**\n * Creates a SafeHtml content consisting of a tag with optional attributes and\n * optional content.\n *\n * For convenience tag names and attribute names are accepted as regular\n * strings, instead of goog.string.Const. Nevertheless, you should not pass\n * user-controlled values to these parameters. Note that these parameters are\n * syntactically validated at runtime, and invalid values will result in\n * an exception.\n *\n * Example usage:\n *\n * goog.html.SafeHtml.create('br');\n * goog.html.SafeHtml.create('div', {'class': 'a'});\n * goog.html.SafeHtml.create('p', {}, 'a');\n * goog.html.SafeHtml.create('p', {}, goog.html.SafeHtml.create('br'));\n *\n * goog.html.SafeHtml.create('span', {\n *   'style': {'margin': '0'}\n * });\n *\n * To guarantee SafeHtml's type contract is upheld there are restrictions on\n * attribute values and tag names.\n *\n * - For attributes which contain script code (on*), a goog.string.Const is\n *   required.\n * - For attributes which contain style (style), a goog.html.SafeStyle or a\n *   goog.html.SafeStyle.PropertyMap is required.\n * - For attributes which are interpreted as URLs (e.g. src, href) a\n *   goog.html.SafeUrl, goog.string.Const or string is required. If a string\n *   is passed, it will be sanitized with SafeUrl.sanitize().\n * - For tags which can load code or set security relevant page metadata,\n *   more specific goog.html.SafeHtml.create*() functions must be used. Tags\n *   which are not supported by this function are applet, base, embed, iframe,\n *   link, math, object, script, style, svg, and template.\n *\n * @param {!goog.dom.TagName|string} tagName The name of the tag. Only tag names\n *     consisting of [a-zA-Z0-9-] are allowed. Tag names documented above are\n *     disallowed.\n * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n *     Mapping from attribute names to their values. Only attribute names\n *     consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes\n *     the attribute to be omitted.\n * @param {!goog.html.SafeHtml.TextOrHtml_|\n *     !Array<!goog.html.SafeHtml.TextOrHtml_>=} opt_content Content to\n *     HTML-escape and put inside the tag. This must be empty for void tags\n *     like <br>. Array elements are concatenated.\n * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.\n * @throws {Error} If invalid tag name, attribute name, or attribute value is\n *     provided.\n * @throws {goog.asserts.AssertionError} If content for void tag is provided.\n */\ngoog.html.SafeHtml.create = function(tagName, opt_attributes, opt_content) {\n  goog.html.SafeHtml.verifyTagName(String(tagName));\n  return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(\n      String(tagName), opt_attributes, opt_content);\n};\n\n\n/**\n * Verifies if the tag name is valid and if it doesn't change the context.\n * E.g. STRONG is fine but SCRIPT throws because it changes context. See\n * goog.html.SafeHtml.create for an explanation of allowed tags.\n * @param {string} tagName\n * @throws {Error} If invalid tag name is provided.\n * @package\n */\ngoog.html.SafeHtml.verifyTagName = function(tagName) {\n  if (!goog.html.SafeHtml.VALID_NAMES_IN_TAG_.test(tagName)) {\n    throw new Error(\n        goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ?\n            'Invalid tag name <' + tagName + '>.' :\n            '');\n  }\n  if (tagName.toUpperCase() in goog.html.SafeHtml.NOT_ALLOWED_TAG_NAMES_) {\n    throw new Error(\n        goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ?\n\n            'Tag name <' + tagName + '> is not allowed for SafeHtml.' :\n            '');\n  }\n};\n\n\n/**\n * Creates a SafeHtml representing an iframe tag.\n *\n * This by default restricts the iframe as much as possible by setting the\n * sandbox attribute to the empty string. If the iframe requires less\n * restrictions, set the sandbox attribute as tight as possible, but do not rely\n * on the sandbox as a security feature because it is not supported by older\n * browsers. If a sandbox is essential to security (e.g. for third-party\n * frames), use createSandboxIframe which checks for browser support.\n *\n * @see https://developer.mozilla.org/en/docs/Web/HTML/Element/iframe#attr-sandbox\n *\n * @param {?goog.html.TrustedResourceUrl=} opt_src The value of the src\n *     attribute. If null or undefined src will not be set.\n * @param {?goog.html.SafeHtml=} opt_srcdoc The value of the srcdoc attribute.\n *     If null or undefined srcdoc will not be set.\n * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n *     Mapping from attribute names to their values. Only attribute names\n *     consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes\n *     the attribute to be omitted.\n * @param {!goog.html.SafeHtml.TextOrHtml_|\n *     !Array<!goog.html.SafeHtml.TextOrHtml_>=} opt_content Content to\n *     HTML-escape and put inside the tag. Array elements are concatenated.\n * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.\n * @throws {Error} If invalid tag name, attribute name, or attribute value is\n *     provided. If opt_attributes contains the src or srcdoc attributes.\n */\ngoog.html.SafeHtml.createIframe = function(\n    opt_src, opt_srcdoc, opt_attributes, opt_content) {\n  if (opt_src) {\n    // Check whether this is really TrustedResourceUrl.\n    goog.html.TrustedResourceUrl.unwrap(opt_src);\n  }\n\n  var fixedAttributes = {};\n  fixedAttributes['src'] = opt_src || null;\n  fixedAttributes['srcdoc'] =\n      opt_srcdoc && goog.html.SafeHtml.unwrap(opt_srcdoc);\n  var defaultAttributes = {'sandbox': ''};\n  var attributes = goog.html.SafeHtml.combineAttributes(\n      fixedAttributes, defaultAttributes, opt_attributes);\n  return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(\n      'iframe', attributes, opt_content);\n};\n\n\n/**\n * Creates a SafeHtml representing a sandboxed iframe tag.\n *\n * The sandbox attribute is enforced in its most restrictive mode, an empty\n * string. Consequently, the security requirements for the src and srcdoc\n * attributes are relaxed compared to SafeHtml.createIframe. This function\n * will throw on browsers that do not support the sandbox attribute, as\n * determined by SafeHtml.canUseSandboxIframe.\n *\n * The SafeHtml returned by this function can trigger downloads with no\n * user interaction on Chrome (though only a few, further attempts are blocked).\n * Firefox and IE will block all downloads from the sandbox.\n *\n * @see https://developer.mozilla.org/en/docs/Web/HTML/Element/iframe#attr-sandbox\n * @see https://lists.w3.org/Archives/Public/public-whatwg-archive/2013Feb/0112.html\n *\n * @param {string|!goog.html.SafeUrl=} opt_src The value of the src\n *     attribute. If null or undefined src will not be set.\n * @param {string=} opt_srcdoc The value of the srcdoc attribute.\n *     If null or undefined srcdoc will not be set. Will not be sanitized.\n * @param {!Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n *     Mapping from attribute names to their values. Only attribute names\n *     consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes\n *     the attribute to be omitted.\n * @param {!goog.html.SafeHtml.TextOrHtml_|\n *     !Array<!goog.html.SafeHtml.TextOrHtml_>=} opt_content Content to\n *     HTML-escape and put inside the tag. Array elements are concatenated.\n * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.\n * @throws {Error} If invalid tag name, attribute name, or attribute value is\n *     provided. If opt_attributes contains the src, srcdoc or sandbox\n *     attributes. If browser does not support the sandbox attribute on iframe.\n */\ngoog.html.SafeHtml.createSandboxIframe = function(\n    opt_src, opt_srcdoc, opt_attributes, opt_content) {\n  if (!goog.html.SafeHtml.canUseSandboxIframe()) {\n    throw new Error(\n        goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ?\n            'The browser does not support sandboxed iframes.' :\n            '');\n  }\n\n  var fixedAttributes = {};\n  if (opt_src) {\n    // Note that sanitize is a no-op on SafeUrl.\n    fixedAttributes['src'] =\n        goog.html.SafeUrl.unwrap(goog.html.SafeUrl.sanitize(opt_src));\n  } else {\n    fixedAttributes['src'] = null;\n  }\n  fixedAttributes['srcdoc'] = opt_srcdoc || null;\n  fixedAttributes['sandbox'] = '';\n  var attributes =\n      goog.html.SafeHtml.combineAttributes(fixedAttributes, {}, opt_attributes);\n  return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(\n      'iframe', attributes, opt_content);\n};\n\n\n/**\n * Checks if the user agent supports sandboxed iframes.\n * @return {boolean}\n */\ngoog.html.SafeHtml.canUseSandboxIframe = function() {\n  return goog.global['HTMLIFrameElement'] &&\n      ('sandbox' in goog.global['HTMLIFrameElement'].prototype);\n};\n\n\n/**\n * Creates a SafeHtml representing a script tag with the src attribute.\n * @param {!goog.html.TrustedResourceUrl} src The value of the src\n * attribute.\n * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=}\n * opt_attributes\n *     Mapping from attribute names to their values. Only attribute names\n *     consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined\n *     causes the attribute to be omitted.\n * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.\n * @throws {Error} If invalid attribute name or value is provided. If\n *     opt_attributes contains the src attribute.\n */\ngoog.html.SafeHtml.createScriptSrc = function(src, opt_attributes) {\n  // TODO(mlourenco): The charset attribute should probably be blocked. If\n  // its value is attacker controlled, the script contains attacker controlled\n  // sub-strings (even if properly escaped) and the server does not set charset\n  // then XSS is likely possible.\n  // https://html.spec.whatwg.org/multipage/scripting.html#dom-script-charset\n\n  // Check whether this is really TrustedResourceUrl.\n  goog.html.TrustedResourceUrl.unwrap(src);\n\n  var fixedAttributes = {'src': src};\n  var defaultAttributes = {};\n  var attributes = goog.html.SafeHtml.combineAttributes(\n      fixedAttributes, defaultAttributes, opt_attributes);\n  return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(\n      'script', attributes);\n};\n\n\n/**\n * Creates a SafeHtml representing a script tag. Does not allow the language,\n * src, text or type attributes to be set.\n * @param {!goog.html.SafeScript|!Array<!goog.html.SafeScript>}\n *     script Content to put inside the tag. Array elements are\n *     concatenated.\n * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n *     Mapping from attribute names to their values. Only attribute names\n *     consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes\n *     the attribute to be omitted.\n * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.\n * @throws {Error} If invalid attribute name or attribute value is provided. If\n *     opt_attributes contains the language, src, text or type attribute.\n */\ngoog.html.SafeHtml.createScript = function(script, opt_attributes) {\n  for (var attr in opt_attributes) {\n    var attrLower = attr.toLowerCase();\n    if (attrLower == 'language' || attrLower == 'src' || attrLower == 'text' ||\n        attrLower == 'type') {\n      throw new Error(\n          goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ?\n              'Cannot set \"' + attrLower + '\" attribute' :\n              '');\n    }\n  }\n\n  var content = '';\n  script = goog.array.concat(script);\n  for (var i = 0; i < script.length; i++) {\n    content += goog.html.SafeScript.unwrap(script[i]);\n  }\n  // Convert to SafeHtml so that it's not HTML-escaped. This is safe because\n  // as part of its contract, SafeScript should have no dangerous '<'.\n  var htmlContent =\n      goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(\n          content, goog.i18n.bidi.Dir.NEUTRAL);\n  return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(\n      'script', opt_attributes, htmlContent);\n};\n\n\n/**\n * Creates a SafeHtml representing a style tag. The type attribute is set\n * to \"text/css\".\n * @param {!goog.html.SafeStyleSheet|!Array<!goog.html.SafeStyleSheet>}\n *     styleSheet Content to put inside the tag. Array elements are\n *     concatenated.\n * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n *     Mapping from attribute names to their values. Only attribute names\n *     consisting of [a-zA-Z0-9-] are allowed. Value of null or undefined causes\n *     the attribute to be omitted.\n * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.\n * @throws {Error} If invalid attribute name or attribute value is provided. If\n *     opt_attributes contains the type attribute.\n */\ngoog.html.SafeHtml.createStyle = function(styleSheet, opt_attributes) {\n  var fixedAttributes = {'type': 'text/css'};\n  var defaultAttributes = {};\n  var attributes = goog.html.SafeHtml.combineAttributes(\n      fixedAttributes, defaultAttributes, opt_attributes);\n\n  var content = '';\n  styleSheet = goog.array.concat(styleSheet);\n  for (var i = 0; i < styleSheet.length; i++) {\n    content += goog.html.SafeStyleSheet.unwrap(styleSheet[i]);\n  }\n  // Convert to SafeHtml so that it's not HTML-escaped. This is safe because\n  // as part of its contract, SafeStyleSheet should have no dangerous '<'.\n  var htmlContent =\n      goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(\n          content, goog.i18n.bidi.Dir.NEUTRAL);\n  return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(\n      'style', attributes, htmlContent);\n};\n\n\n/**\n * Creates a SafeHtml representing a meta refresh tag.\n * @param {!goog.html.SafeUrl|string} url Where to redirect. If a string is\n *     passed, it will be sanitized with SafeUrl.sanitize().\n * @param {number=} opt_secs Number of seconds until the page should be\n *     reloaded. Will be set to 0 if unspecified.\n * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.\n */\ngoog.html.SafeHtml.createMetaRefresh = function(url, opt_secs) {\n\n  // Note that sanitize is a no-op on SafeUrl.\n  var unwrappedUrl = goog.html.SafeUrl.unwrap(goog.html.SafeUrl.sanitize(url));\n\n  if (goog.labs.userAgent.browser.isIE() ||\n      goog.labs.userAgent.browser.isEdge()) {\n    // IE/EDGE can't parse the content attribute if the url contains a\n    // semicolon. We can fix this by adding quotes around the url, but then we\n    // can't parse quotes in the URL correctly. Also, it seems that IE/EDGE\n    // did not unescape semicolons in these URLs at some point in the past. We\n    // take a best-effort approach.\n    //\n    // If the URL has semicolons (which may happen in some cases, see\n    // http://www.w3.org/TR/1999/REC-html401-19991224/appendix/notes.html#h-B.2\n    // for instance), wrap it in single quotes to protect the semicolons.\n    // If the URL has semicolons and single quotes, url-encode the single quotes\n    // as well.\n    //\n    // This is imperfect. Notice that both ' and ; are reserved characters in\n    // URIs, so this could do the wrong thing, but at least it will do the wrong\n    // thing in only rare cases.\n    if (goog.string.internal.contains(unwrappedUrl, ';')) {\n      unwrappedUrl = \"'\" + unwrappedUrl.replace(/'/g, '%27') + \"'\";\n    }\n  }\n  var attributes = {\n    'http-equiv': 'refresh',\n    'content': (opt_secs || 0) + '; url=' + unwrappedUrl\n  };\n\n  // This function will handle the HTML escaping for attributes.\n  return goog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse(\n      'meta', attributes);\n};\n\n\n/**\n * @param {string} tagName The tag name.\n * @param {string} name The attribute name.\n * @param {!goog.html.SafeHtml.AttributeValue} value The attribute value.\n * @return {string} A \"name=value\" string.\n * @throws {Error} If attribute value is unsafe for the given tag and attribute.\n * @private\n */\ngoog.html.SafeHtml.getAttrNameAndValue_ = function(tagName, name, value) {\n  // If it's goog.string.Const, allow any valid attribute name.\n  if (value instanceof goog.string.Const) {\n    value = goog.string.Const.unwrap(value);\n  } else if (name.toLowerCase() == 'style') {\n    if (goog.html.SafeHtml.SUPPORT_STYLE_ATTRIBUTE) {\n      value = goog.html.SafeHtml.getStyleValue_(value);\n    } else {\n      throw new Error(\n          goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ?\n              'Attribute \"style\" not supported.' :\n              '');\n    }\n  } else if (/^on/i.test(name)) {\n    // TODO(jakubvrana): Disallow more attributes with a special meaning.\n    throw new Error(\n        goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ? 'Attribute \"' + name +\n                '\" requires goog.string.Const value, \"' + value + '\" given.' :\n                                                   '');\n    // URL attributes handled differently according to tag.\n  } else if (name.toLowerCase() in goog.html.SafeHtml.URL_ATTRIBUTES_) {\n    if (value instanceof goog.html.TrustedResourceUrl) {\n      value = goog.html.TrustedResourceUrl.unwrap(value);\n    } else if (value instanceof goog.html.SafeUrl) {\n      value = goog.html.SafeUrl.unwrap(value);\n    } else if (typeof value === 'string') {\n      value = goog.html.SafeUrl.sanitize(value).getTypedStringValue();\n    } else {\n      throw new Error(\n          goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ?\n              'Attribute \"' + name + '\" on tag \"' + tagName +\n                  '\" requires goog.html.SafeUrl, goog.string.Const, or' +\n                  ' string, value \"' + value + '\" given.' :\n              '');\n    }\n  }\n\n  // Accept SafeUrl, TrustedResourceUrl, etc. for attributes which only require\n  // HTML-escaping.\n  if (value.implementsGoogStringTypedString) {\n    // Ok to call getTypedStringValue() since there's no reliance on the type\n    // contract for security here.\n    value =\n        /** @type {!goog.string.TypedString} */ (value).getTypedStringValue();\n  }\n\n  goog.asserts.assert(\n      typeof value === 'string' || typeof value === 'number',\n      'String or number value expected, got ' + (typeof value) +\n          ' with value: ' + value);\n  return name + '=\"' + goog.string.internal.htmlEscape(String(value)) + '\"';\n};\n\n\n/**\n * Gets value allowed in \"style\" attribute.\n * @param {!goog.html.SafeHtml.AttributeValue} value It could be SafeStyle or a\n *     map which will be passed to goog.html.SafeStyle.create.\n * @return {string} Unwrapped value.\n * @throws {Error} If string value is given.\n * @private\n */\ngoog.html.SafeHtml.getStyleValue_ = function(value) {\n  if (!goog.isObject(value)) {\n    throw new Error(\n        goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ?\n            'The \"style\" attribute requires goog.html.SafeStyle or map ' +\n                'of style properties, ' + (typeof value) + ' given: ' + value :\n            '');\n  }\n  if (!(value instanceof goog.html.SafeStyle)) {\n    // Process the property bag into a style object.\n    value = goog.html.SafeStyle.create(value);\n  }\n  return goog.html.SafeStyle.unwrap(value);\n};\n\n\n/**\n * Creates a SafeHtml content with known directionality consisting of a tag with\n * optional attributes and optional content.\n * @param {!goog.i18n.bidi.Dir} dir Directionality.\n * @param {string} tagName\n * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n * @param {!goog.html.SafeHtml.TextOrHtml_|\n *     !Array<!goog.html.SafeHtml.TextOrHtml_>=} opt_content\n * @return {!goog.html.SafeHtml} The SafeHtml content with the tag.\n */\ngoog.html.SafeHtml.createWithDir = function(\n    dir, tagName, opt_attributes, opt_content) {\n  var html = goog.html.SafeHtml.create(tagName, opt_attributes, opt_content);\n  html.dir_ = dir;\n  return html;\n};\n\n\n/**\n * Creates a new SafeHtml object by joining the parts with separator.\n * @param {!goog.html.SafeHtml.TextOrHtml_} separator\n * @param {!Array<!goog.html.SafeHtml.TextOrHtml_|\n *     !Array<!goog.html.SafeHtml.TextOrHtml_>>} parts Parts to join. If a part\n *     contains an array then each member of this array is also joined with the\n *     separator.\n * @return {!goog.html.SafeHtml}\n */\ngoog.html.SafeHtml.join = function(separator, parts) {\n  var separatorHtml = goog.html.SafeHtml.htmlEscape(separator);\n  var dir = separatorHtml.getDirection();\n  var content = [];\n\n  /**\n   * @param {!goog.html.SafeHtml.TextOrHtml_|\n   *     !Array<!goog.html.SafeHtml.TextOrHtml_>} argument\n   */\n  var addArgument = function(argument) {\n    if (goog.isArray(argument)) {\n      goog.array.forEach(argument, addArgument);\n    } else {\n      var html = goog.html.SafeHtml.htmlEscape(argument);\n      content.push(goog.html.SafeHtml.unwrap(html));\n      var htmlDir = html.getDirection();\n      if (dir == goog.i18n.bidi.Dir.NEUTRAL) {\n        dir = htmlDir;\n      } else if (htmlDir != goog.i18n.bidi.Dir.NEUTRAL && dir != htmlDir) {\n        dir = null;\n      }\n    }\n  };\n\n  goog.array.forEach(parts, addArgument);\n  return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(\n      content.join(goog.html.SafeHtml.unwrap(separatorHtml)), dir);\n};\n\n\n/**\n * Creates a new SafeHtml object by concatenating values.\n * @param {...(!goog.html.SafeHtml.TextOrHtml_|\n *     !Array<!goog.html.SafeHtml.TextOrHtml_>)} var_args Values to concatenate.\n * @return {!goog.html.SafeHtml}\n */\ngoog.html.SafeHtml.concat = function(var_args) {\n  return goog.html.SafeHtml.join(\n      goog.html.SafeHtml.EMPTY, Array.prototype.slice.call(arguments));\n};\n\n\n/**\n * Creates a new SafeHtml object with known directionality by concatenating the\n * values.\n * @param {!goog.i18n.bidi.Dir} dir Directionality.\n * @param {...(!goog.html.SafeHtml.TextOrHtml_|\n *     !Array<!goog.html.SafeHtml.TextOrHtml_>)} var_args Elements of array\n *     arguments would be processed recursively.\n * @return {!goog.html.SafeHtml}\n */\ngoog.html.SafeHtml.concatWithDir = function(dir, var_args) {\n  var html = goog.html.SafeHtml.concat(goog.array.slice(arguments, 1));\n  html.dir_ = dir;\n  return html;\n};\n\n\n/**\n * Type marker for the SafeHtml type, used to implement additional run-time\n * type checking.\n * @const {!Object}\n * @private\n */\ngoog.html.SafeHtml.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};\n\n\n/**\n * Package-internal utility method to create SafeHtml instances.\n *\n * @param {string} html The string to initialize the SafeHtml object with.\n * @param {?goog.i18n.bidi.Dir} dir The directionality of the SafeHtml to be\n *     constructed, or null if unknown.\n * @return {!goog.html.SafeHtml} The initialized SafeHtml object.\n * @package\n */\ngoog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse = function(\n    html, dir) {\n  return new goog.html.SafeHtml().initSecurityPrivateDoNotAccessOrElse_(\n      html, dir);\n};\n\n\n/**\n * Called from createSafeHtmlSecurityPrivateDoNotAccessOrElse(). This\n * method exists only so that the compiler can dead code eliminate static\n * fields (like EMPTY) when they're not accessed.\n * @param {string} html\n * @param {?goog.i18n.bidi.Dir} dir\n * @return {!goog.html.SafeHtml}\n * @private\n */\ngoog.html.SafeHtml.prototype.initSecurityPrivateDoNotAccessOrElse_ = function(\n    html, dir) {\n  this.privateDoNotAccessOrElseSafeHtmlWrappedValue_ =\n      goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY ?\n      goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY.createHTML(\n          html) :\n      html;\n  this.dir_ = dir;\n  return this;\n};\n\n\n/**\n * Like create() but does not restrict which tags can be constructed.\n *\n * @param {string} tagName Tag name. Set or validated by caller.\n * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n * @param {(!goog.html.SafeHtml.TextOrHtml_|\n *     !Array<!goog.html.SafeHtml.TextOrHtml_>)=} opt_content\n * @return {!goog.html.SafeHtml}\n * @throws {Error} If invalid or unsafe attribute name or value is provided.\n * @throws {goog.asserts.AssertionError} If content for void tag is provided.\n * @package\n */\ngoog.html.SafeHtml.createSafeHtmlTagSecurityPrivateDoNotAccessOrElse = function(\n    tagName, opt_attributes, opt_content) {\n  var dir = null;\n  var result = '<' + tagName;\n  result += goog.html.SafeHtml.stringifyAttributes(tagName, opt_attributes);\n\n  var content = opt_content;\n  if (content == null) {\n    content = [];\n  } else if (!goog.isArray(content)) {\n    content = [content];\n  }\n\n  if (goog.dom.tags.isVoidTag(tagName.toLowerCase())) {\n    goog.asserts.assert(\n        !content.length, 'Void tag <' + tagName + '> does not allow content.');\n    result += '>';\n  } else {\n    var html = goog.html.SafeHtml.concat(content);\n    result += '>' + goog.html.SafeHtml.unwrap(html) + '</' + tagName + '>';\n    dir = html.getDirection();\n  }\n\n  var dirAttribute = opt_attributes && opt_attributes['dir'];\n  if (dirAttribute) {\n    if (/^(ltr|rtl|auto)$/i.test(dirAttribute)) {\n      // If the tag has the \"dir\" attribute specified then its direction is\n      // neutral because it can be safely used in any context.\n      dir = goog.i18n.bidi.Dir.NEUTRAL;\n    } else {\n      dir = null;\n    }\n  }\n\n  return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(\n      result, dir);\n};\n\n\n/**\n * Creates a string with attributes to insert after tagName.\n * @param {string} tagName\n * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n * @return {string} Returns an empty string if there are no attributes, returns\n *     a string starting with a space otherwise.\n * @throws {Error} If attribute value is unsafe for the given tag and attribute.\n * @package\n */\ngoog.html.SafeHtml.stringifyAttributes = function(tagName, opt_attributes) {\n  var result = '';\n  if (opt_attributes) {\n    for (var name in opt_attributes) {\n      if (!goog.html.SafeHtml.VALID_NAMES_IN_TAG_.test(name)) {\n        throw new Error(\n            goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ?\n                'Invalid attribute name \"' + name + '\".' :\n                '');\n      }\n      var value = opt_attributes[name];\n      if (value == null) {\n        continue;\n      }\n      result +=\n          ' ' + goog.html.SafeHtml.getAttrNameAndValue_(tagName, name, value);\n    }\n  }\n  return result;\n};\n\n\n/**\n * @param {!Object<string, ?goog.html.SafeHtml.AttributeValue>} fixedAttributes\n * @param {!Object<string, string>} defaultAttributes\n * @param {?Object<string, ?goog.html.SafeHtml.AttributeValue>=} opt_attributes\n *     Optional attributes passed to create*().\n * @return {!Object<string, ?goog.html.SafeHtml.AttributeValue>}\n * @throws {Error} If opt_attributes contains an attribute with the same name\n *     as an attribute in fixedAttributes.\n * @package\n */\ngoog.html.SafeHtml.combineAttributes = function(\n    fixedAttributes, defaultAttributes, opt_attributes) {\n  var combinedAttributes = {};\n  var name;\n\n  for (name in fixedAttributes) {\n    goog.asserts.assert(name.toLowerCase() == name, 'Must be lower case');\n    combinedAttributes[name] = fixedAttributes[name];\n  }\n  for (name in defaultAttributes) {\n    goog.asserts.assert(name.toLowerCase() == name, 'Must be lower case');\n    combinedAttributes[name] = defaultAttributes[name];\n  }\n\n  if (opt_attributes) {\n    for (name in opt_attributes) {\n      var nameLower = name.toLowerCase();\n      if (nameLower in fixedAttributes) {\n        throw new Error(\n            goog.html.SafeHtml.ENABLE_ERROR_MESSAGES ?\n                'Cannot override \"' + nameLower + '\" attribute, got \"' + name +\n                    '\" with value \"' + opt_attributes[name] + '\"' :\n                '');\n      }\n      if (nameLower in defaultAttributes) {\n        delete combinedAttributes[nameLower];\n      }\n      combinedAttributes[name] = opt_attributes[name];\n    }\n  }\n\n  return combinedAttributes;\n};\n\n\n/**\n * A SafeHtml instance corresponding to the HTML doctype: \"<!DOCTYPE html>\".\n * @const {!goog.html.SafeHtml}\n */\ngoog.html.SafeHtml.DOCTYPE_HTML =\n    goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(\n        '<!DOCTYPE html>', goog.i18n.bidi.Dir.NEUTRAL);\n\n\n/**\n * A SafeHtml instance corresponding to the empty string.\n * @const {!goog.html.SafeHtml}\n */\ngoog.html.SafeHtml.EMPTY =\n    goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(\n        '', goog.i18n.bidi.Dir.NEUTRAL);\n\n\n/**\n * A SafeHtml instance corresponding to the <br> tag.\n * @const {!goog.html.SafeHtml}\n */\ngoog.html.SafeHtml.BR =\n    goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(\n        '<br>', goog.i18n.bidi.Dir.NEUTRAL);\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.html.SafeScript","^=I","~$goog.html.SafeUrl","~$goog.string.TypedString","^9>","^;P","^=M","^G3","~$goog.i18n.bidi.Dir","~$goog.labs.userAgent.browser","~$goog.dom.tags","~$goog.html.SafeStyleSheet","~$goog.string.internal","^;9","^;=","~$goog.i18n.bidi.DirectionalString","~$goog.html.trustedtypes"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/safehtml.js"],"^:1",["^9K",["^@C"]],"^9<",true,"^9=",["^9>","^;9","^:E","^;=","^GV","^GQ","^G3","^GW","^GR","^=I","^GZ","^GT","^GY","^GU","^;P","^=M","^GS","^GX"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.media.media.js","^9C",["^9D","goog/ui/media/media.js"],"^9E","goog/ui/media/media.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides the base goog.ui.Control and goog.ui.ControlRenderer\n * for media types, as well as a media model consistent with the Yahoo Media RSS\n * specification {@link http://search.yahoo.com/mrss/}.\n *\n * The goog.ui.media.* package is basically a set of goog.ui.ControlRenderers\n * subclasses (such as goog.ui.media.Youtube, goog.ui.media.Picasa, etc) that\n * should all work with the same goog.ui.Control (goog.ui.media.Media) logic.\n *\n * This design guarantees that all different types of medias will behave alike\n * (in a base level) but will look different.\n *\n * In MVC terms, {@link goog.ui.media.Media} is the Controller,\n * {@link goog.ui.media.MediaRenderer} + CSS definitions are the View and\n * `goog.ui.media.MediaModel` is the data Model. Typically,\n * MediaRenderer will be subclassed to provide media specific renderers.\n * MediaRenderer subclasses are also responsible for defining the data model.\n *\n * This design is strongly patterned after:\n * http://go/closure_control_subclassing\n *\n * goog.ui.media.MediaRenderer handles the basic common ways to display media,\n * such as displaying tooltips, frames, minimize/maximize buttons, play buttons,\n * etc. Its subclasses are responsible for rendering media specific DOM\n * structures, like youtube flash players, picasa albums, etc.\n *\n * goog.ui.media.Media handles the Control of Medias, by listening to events\n * and firing the appropriate actions. It knows about the existence of captions,\n * minimize/maximize buttons, and takes all the actions needed to change states,\n * including delegating the UI actions to MediaRenderers.\n *\n * Although MediaRenderer is a base class designed to be subclassed, it can\n * be used by itself:\n *\n * <pre>\n *   var renderer = new goog.ui.media.MediaRenderer();\n *   var control = new goog.ui.media.Media('hello world', renderer);\n *   var control.render(goog.dom.getElement('mediaHolder'));\n * </pre>\n *\n * It requires a few CSS rules to be defined, which you should use to control\n * how the component is displayed. {@link goog.ui.ControlRenderer}s is very CSS\n * intensive, which separates the UI structure (the HTML DOM elements, which is\n * created by the `goog.ui.media.MediaRenderer`) from the UI view (which\n * nodes are visible, which aren't, where they are positioned. These are defined\n * on the CSS rules for each state). A few examples of CSS selectors that needs\n * to be defined are:\n *\n * <ul>\n *   <li>.goog-ui-media\n *   <li>.goog-ui-media-hover\n *   <li>.goog-ui-media-selected\n * </ul>\n *\n * If you want to have different custom renderers CSS namespaces (eg. you may\n * want to show a small thumbnail, or you may want to hide the caption, etc),\n * you can do so by using:\n *\n * <pre>\n *   var renderer = goog.ui.ControlRenderer.getCustomRenderer(\n *       goog.ui.media.MediaRenderer, 'my-custom-namespace');\n *   var media = new goog.ui.media.Media('', renderer);\n *   media.render(goog.dom.getElement('parent'));\n * </pre>\n *\n * Which will allow you to set your own .my-custom-namespace-hover,\n * .my-custom-namespace-selected CSS selectors.\n *\n * NOTE(user): it seems like an overkill to subclass goog.ui.Control instead of\n * using a factory, but we wanted to make sure we had more control over the\n * events for future media implementations. Since we intent to use it in many\n * different places, it makes sense to have a more flexible design that lets us\n * control the inner workings of goog.ui.Control.\n *\n * TODO(user): implement, as needed, the Media specific state changes UI, such\n * as minimize/maximize buttons, expand/close buttons, etc.\n *\n */\n\ngoog.provide('goog.ui.media.Media');\ngoog.provide('goog.ui.media.MediaRenderer');\n\ngoog.forwardDeclare('goog.ui.media.MediaModel');\ngoog.require('goog.asserts');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Control');\ngoog.require('goog.ui.ControlRenderer');\n\n\n\n/**\n * Provides the control mechanism of media types.\n *\n * @param {goog.ui.media.MediaModel} dataModel The data model to be used by the\n *     renderer.\n * @param {goog.ui.ControlRenderer=} opt_renderer Renderer used to render or\n *     decorate the component; defaults to {@link goog.ui.ControlRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.Control}\n * @final\n */\ngoog.ui.media.Media = function(dataModel, opt_renderer, opt_domHelper) {\n  goog.ui.Control.call(this, null, opt_renderer, opt_domHelper);\n\n  // Sets up the data model.\n  this.setDataModel(dataModel);\n  this.setSupportedState(goog.ui.Component.State.OPENED, true);\n  this.setSupportedState(goog.ui.Component.State.SELECTED, true);\n  // TODO(user): had to do this to for mouseDownHandler not to\n  // e.preventDefault(), because it was not allowing the event to reach the\n  // flash player. figure out a better way to not e.preventDefault().\n  this.setAllowTextSelection(true);\n\n  // Media items don't use RTL styles, so avoid accessing computed styles to\n  // figure out if the control is RTL.\n  this.setRightToLeft(false);\n};\ngoog.inherits(goog.ui.media.Media, goog.ui.Control);\n\n\n/**\n * The media data model used on the renderer.\n *\n * @type {goog.ui.media.MediaModel}\n * @private\n */\ngoog.ui.media.Media.prototype.dataModel_;\n\n\n/**\n * Sets the media model to be used on the renderer.\n * @param {goog.ui.media.MediaModel} dataModel The media model the renderer\n *     should use.\n */\ngoog.ui.media.Media.prototype.setDataModel = function(dataModel) {\n  this.dataModel_ = dataModel;\n};\n\n\n/**\n * Gets the media model renderer is using.\n * @return {goog.ui.media.MediaModel} The media model being used.\n */\ngoog.ui.media.Media.prototype.getDataModel = function() {\n  return this.dataModel_;\n};\n\n\n\n/**\n * Base class of all media renderers. Provides the common renderer functionality\n * of medias.\n *\n * The current common functionality shared by Medias is to have an outer frame\n * that gets highlighted on mouse hover.\n *\n * TODO(user): implement more common UI behavior, as needed.\n *\n * NOTE(user): I am not enjoying how the subclasses are changing their state\n * through setState() ... maybe provide abstract methods like\n * goog.ui.media.MediaRenderer.prototype.preview = goog.abstractMethod;\n * goog.ui.media.MediaRenderer.prototype.play = goog.abstractMethod;\n * goog.ui.media.MediaRenderer.prototype.minimize = goog.abstractMethod;\n * goog.ui.media.MediaRenderer.prototype.maximize = goog.abstractMethod;\n * and call them on this parent class setState ?\n *\n * @constructor\n * @extends {goog.ui.ControlRenderer}\n */\ngoog.ui.media.MediaRenderer = function() {\n  goog.ui.ControlRenderer.call(this);\n};\ngoog.inherits(goog.ui.media.MediaRenderer, goog.ui.ControlRenderer);\n\n\n/**\n * Builds the common DOM structure of medias. Builds an outer div, and appends\n * a child div with the `goog.ui.Control.getContent` content. Marks the\n * caption with a `this.getClassClass()` + '-caption' css flag, so that\n * specific renderers can hide/show the caption as desired.\n *\n * @param {goog.ui.Control} control The control instance.\n * @return {!Element} The DOM structure that represents control.\n * @override\n */\ngoog.ui.media.MediaRenderer.prototype.createDom = function(control) {\n  goog.asserts.assertInstanceof(control, goog.ui.media.Media);\n  var domHelper = control.getDomHelper();\n  var div = domHelper.createElement(goog.dom.TagName.DIV);\n  div.className = this.getClassNames(control).join(' ');\n\n  var dataModel = control.getDataModel();\n\n  // Only creates DOMs if the data is available.\n  var dataCaption = dataModel.getCaption();\n  if (dataCaption) {\n    var caption = domHelper.createElement(goog.dom.TagName.DIV);\n    caption.className = goog.getCssName(this.getCssClass(), 'caption');\n\n    caption.appendChild(domHelper.createDom(\n        goog.dom.TagName.P, goog.getCssName(this.getCssClass(), 'caption-text'),\n        dataCaption));\n    domHelper.appendChild(div, caption);\n  }\n\n  var dataDescription = dataModel.getDescription();\n  if (dataDescription) {\n    var description = domHelper.createElement(goog.dom.TagName.DIV);\n    description.className = goog.getCssName(this.getCssClass(), 'description');\n    description.appendChild(domHelper.createDom(\n        goog.dom.TagName.P,\n        goog.getCssName(this.getCssClass(), 'description-text'),\n        dataDescription));\n    domHelper.appendChild(div, description);\n  }\n\n  // Creates thumbnails of the media.\n  var thumbnails = dataModel.getThumbnails() || [];\n  for (var index = 0; index < thumbnails.length; index++) {\n    var thumbnail = thumbnails[index];\n    var thumbnailElement = domHelper.createElement(goog.dom.TagName.IMG);\n    thumbnailElement.src = thumbnail.getUrl();\n    thumbnailElement.className = this.getThumbnailCssName(index);\n\n    // Check that the size is defined and that the size's height and width\n    // are defined. Undefined height and width is deprecated but still\n    // seems to exist in some cases.\n    var size = thumbnail.getSize();\n\n    if (size && size.height != null && size.width != null) {\n      goog.style.setSize(thumbnailElement, size);\n    }\n    domHelper.appendChild(div, thumbnailElement);\n  }\n\n  if (dataModel.getPlayer()) {\n    // if medias have players, allow UI for a play button.\n    var playButton = domHelper.createElement(goog.dom.TagName.DIV);\n    playButton.className = goog.getCssName(this.getCssClass(), 'playbutton');\n    domHelper.appendChild(div, playButton);\n  }\n\n  control.setElementInternal(div);\n\n  this.setState(\n      control,\n      /** @type {goog.ui.Component.State} */ (control.getState()), true);\n\n  return div;\n};\n\n\n/**\n * Returns a renamable CSS class name for a numbered thumbnail. The default\n * implementation generates the class names goog-ui-media-thumbnail0,\n * goog-ui-media-thumbnail1, and the generic goog-ui-media-thumbnailn.\n * Subclasses can override this method when their media requires additional\n * specific class names (Applications are supposed to know how many thumbnails\n * media will have).\n *\n * @param {number} index The thumbnail index.\n * @return {string} CSS class name.\n * @protected\n */\ngoog.ui.media.MediaRenderer.prototype.getThumbnailCssName = function(index) {\n  switch (index) {\n    case 0:\n      return goog.getCssName(this.getCssClass(), 'thumbnail0');\n    case 1:\n      return goog.getCssName(this.getCssClass(), 'thumbnail1');\n    case 2:\n      return goog.getCssName(this.getCssClass(), 'thumbnail2');\n    case 3:\n      return goog.getCssName(this.getCssClass(), 'thumbnail3');\n    case 4:\n      return goog.getCssName(this.getCssClass(), 'thumbnail4');\n    default:\n      return goog.getCssName(this.getCssClass(), 'thumbnailn');\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^:=","^9>","~$goog.ui.ControlRenderer","^=T","^<3","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/media/media.js"],"^:1",["^9K",["^=K","^=L"]],"^9<",true,"^9=",["^9>","^:E","^;=","^<3","^:=","^=T","^G["]],["^ ","^9A",[1579837703000],"^9B","goog.fx.animationqueue.js","^9C",["^9D","goog/fx/animationqueue.js"],"^9E","goog/fx/animationqueue.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A class which automatically plays through a queue of\n * animations.  AnimationParallelQueue and AnimationSerialQueue provide\n * specific implementations of the abstract class AnimationQueue.\n *\n * @see ../demos/animationqueue.html\n */\n\ngoog.provide('goog.fx.AnimationParallelQueue');\ngoog.provide('goog.fx.AnimationQueue');\ngoog.provide('goog.fx.AnimationSerialQueue');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.events');\ngoog.require('goog.fx.Animation');\ngoog.require('goog.fx.Transition');\ngoog.require('goog.fx.TransitionBase');\n\n\n\n/**\n * Constructor for AnimationQueue object.\n *\n * @constructor\n * @struct\n * @extends {goog.fx.TransitionBase}\n */\ngoog.fx.AnimationQueue = function() {\n  goog.fx.AnimationQueue.base(this, 'constructor');\n\n  /**\n   * An array holding all animations in the queue.\n   * @type {Array<goog.fx.TransitionBase>}\n   * @protected\n   */\n  this.queue = [];\n};\ngoog.inherits(goog.fx.AnimationQueue, goog.fx.TransitionBase);\n\n\n/**\n * Pushes an Animation to the end of the queue.\n * @param {goog.fx.TransitionBase} animation The animation to add to the queue.\n */\ngoog.fx.AnimationQueue.prototype.add = function(animation) {\n  goog.asserts.assert(\n      this.isStopped(),\n      'Not allowed to add animations to a running animation queue.');\n\n  if (goog.array.contains(this.queue, animation)) {\n    return;\n  }\n\n  this.queue.push(animation);\n  goog.events.listen(\n      animation, goog.fx.Transition.EventType.FINISH, this.onAnimationFinish,\n      false, this);\n};\n\n\n/**\n * Removes an Animation from the queue.\n * @param {goog.fx.Animation} animation The animation to remove.\n */\ngoog.fx.AnimationQueue.prototype.remove = function(animation) {\n  goog.asserts.assert(\n      this.isStopped(),\n      'Not allowed to remove animations from a running animation queue.');\n\n  if (goog.array.remove(this.queue, animation)) {\n    goog.events.unlisten(\n        animation, goog.fx.Transition.EventType.FINISH, this.onAnimationFinish,\n        false, this);\n  }\n};\n\n\n/**\n * Handles the event that an animation has finished.\n * @param {goog.events.Event} e The finishing event.\n * @protected\n */\ngoog.fx.AnimationQueue.prototype.onAnimationFinish = goog.abstractMethod;\n\n\n/**\n * Disposes of the animations.\n * @override\n */\ngoog.fx.AnimationQueue.prototype.disposeInternal = function() {\n  goog.array.forEach(this.queue, function(animation) { animation.dispose(); });\n  this.queue.length = 0;\n\n  goog.fx.AnimationQueue.base(this, 'disposeInternal');\n};\n\n\n\n/**\n * Constructor for AnimationParallelQueue object.\n * @constructor\n * @struct\n * @extends {goog.fx.AnimationQueue}\n */\ngoog.fx.AnimationParallelQueue = function() {\n  goog.fx.AnimationParallelQueue.base(this, 'constructor');\n\n  /**\n   * Number of finished animations.\n   * @type {number}\n   * @private\n   */\n  this.finishedCounter_ = 0;\n};\ngoog.inherits(goog.fx.AnimationParallelQueue, goog.fx.AnimationQueue);\n\n\n/** @override */\ngoog.fx.AnimationParallelQueue.prototype.play = function(opt_restart) {\n  if (this.queue.length == 0) {\n    return false;\n  }\n\n  if (opt_restart || this.isStopped()) {\n    this.finishedCounter_ = 0;\n    this.onBegin();\n  } else if (this.isPlaying()) {\n    return false;\n  }\n\n  this.onPlay();\n  if (this.isPaused()) {\n    this.onResume();\n  }\n  var resuming = this.isPaused() && !opt_restart;\n\n  this.startTime = goog.now();\n  this.endTime = null;\n  this.setStatePlaying();\n\n  goog.array.forEach(this.queue, function(anim) {\n    if (!resuming || anim.isPaused()) {\n      anim.play(opt_restart);\n    }\n  });\n\n  return true;\n};\n\n\n/** @override */\ngoog.fx.AnimationParallelQueue.prototype.pause = function() {\n  if (this.isPlaying()) {\n    goog.array.forEach(this.queue, function(anim) {\n      if (anim.isPlaying()) {\n        anim.pause();\n      }\n    });\n\n    this.setStatePaused();\n    this.onPause();\n  }\n};\n\n\n/** @override */\ngoog.fx.AnimationParallelQueue.prototype.stop = function(opt_gotoEnd) {\n  goog.array.forEach(this.queue, function(anim) {\n    if (!anim.isStopped()) {\n      anim.stop(opt_gotoEnd);\n    }\n  });\n\n  this.setStateStopped();\n  this.endTime = goog.now();\n\n  this.onStop();\n  this.onEnd();\n};\n\n\n/** @override */\ngoog.fx.AnimationParallelQueue.prototype.onAnimationFinish = function(e) {\n  this.finishedCounter_++;\n  if (this.finishedCounter_ == this.queue.length) {\n    this.endTime = goog.now();\n\n    this.setStateStopped();\n\n    this.onFinish();\n    this.onEnd();\n  }\n};\n\n\n\n/**\n * Constructor for AnimationSerialQueue object.\n * @constructor\n * @struct\n * @extends {goog.fx.AnimationQueue}\n */\ngoog.fx.AnimationSerialQueue = function() {\n  goog.fx.AnimationSerialQueue.base(this, 'constructor');\n\n  /**\n   * Current animation in queue currently active.\n   * @type {number}\n   * @private\n   */\n  this.current_ = 0;\n};\ngoog.inherits(goog.fx.AnimationSerialQueue, goog.fx.AnimationQueue);\n\n\n/** @override */\ngoog.fx.AnimationSerialQueue.prototype.play = function(opt_restart) {\n  if (this.queue.length == 0) {\n    return false;\n  }\n\n  if (opt_restart || this.isStopped()) {\n    if (this.current_ < this.queue.length &&\n        !this.queue[this.current_].isStopped()) {\n      this.queue[this.current_].stop(false);\n    }\n\n    this.current_ = 0;\n    this.onBegin();\n  } else if (this.isPlaying()) {\n    return false;\n  }\n\n  this.onPlay();\n  if (this.isPaused()) {\n    this.onResume();\n  }\n\n  this.startTime = goog.now();\n  this.endTime = null;\n  this.setStatePlaying();\n\n  this.queue[this.current_].play(opt_restart);\n\n  return true;\n};\n\n\n/** @override */\ngoog.fx.AnimationSerialQueue.prototype.pause = function() {\n  if (this.isPlaying()) {\n    this.queue[this.current_].pause();\n    this.setStatePaused();\n    this.onPause();\n  }\n};\n\n\n/** @override */\ngoog.fx.AnimationSerialQueue.prototype.stop = function(opt_gotoEnd) {\n  this.setStateStopped();\n  this.endTime = goog.now();\n\n  if (opt_gotoEnd) {\n    for (var i = this.current_; i < this.queue.length; ++i) {\n      var anim = this.queue[i];\n      // If the animation is stopped, start it to initiate rendering.  This\n      // might be needed to make the next line work.\n      if (anim.isStopped()) anim.play();\n      // If the animation is not done, stop it and go to the end state of the\n      // animation.\n      if (!anim.isStopped()) anim.stop(true);\n    }\n  } else if (this.current_ < this.queue.length) {\n    this.queue[this.current_].stop(false);\n  }\n\n  this.onStop();\n  this.onEnd();\n};\n\n\n/** @override */\ngoog.fx.AnimationSerialQueue.prototype.onAnimationFinish = function(e) {\n  if (this.isPlaying()) {\n    this.current_++;\n    if (this.current_ < this.queue.length) {\n      this.queue[this.current_].play();\n    } else {\n      this.endTime = goog.now();\n      this.setStateStopped();\n\n      this.onFinish();\n      this.onEnd();\n    }\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9>","^G7","^>Q","~$goog.fx.TransitionBase","^;9","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/animationqueue.js"],"^:1",["^9K",["^?E","~$goog.fx.AnimationQueue","~$goog.fx.AnimationSerialQueue"]],"^9<",true,"^9=",["^9>","^;9","^:E","^:N","^G7","^>Q","^H0"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.labs.net.webchannel.environment.js","^9C",["^9D","goog/labs/net/webchannel/environment.js"],"^9E","goog/labs/net/webchannel/environment.js","^9F","^9G","^9H","// Copyright 2018 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A single module to define user-agent specific environment\n * details.\n */\n\ngoog.module('goog.labs.net.webChannel.environment');\n\ngoog.module.declareLegacyNamespace();\n\nvar userAgent = goog.require('goog.userAgent');\n\n\n/**\n * The default polling interval in millis for Edge.\n *\n * Currently on edge, new-chunk events may be not be fired (at all) if a new\n * chunk arrives within 50ms following the previous chunk. This may be fixed\n * in future, which requires changes to the whatwg spec too.\n *\n * @private @const {number}\n */\nvar EDGE_POLLING_INTERVAL_ = 125;\n\n\n/**\n * History:\n *\n * IE11 is still using Trident, the traditional engine for IE.\n * Edge is using EdgeHTML, a fork of Trident. We are seeing the same issue\n * on IE-11 (reported in 2017), so treat IE the same as Edge for now.\n *\n * We used to do polling for Opera (only) with an 250ms interval, because Opera\n * only fires readyState == INTERACTIVE once. Opera switched to WebKit in 2013,\n * and then to Blink (chrome).\n *\n * TODO(user): check the raw UA string to keep polling for old, mobile operas\n * that may still be affected. For old Opera, double the polling interval\n * to 250ms.\n *\n * @return {boolean} True if polling is required with XHR.\n */\nexports.isPollingRequired = function() {\n  return userAgent.EDGE_OR_IE;\n};\n\n\n/**\n * How often to poll (in MS) for changes to responseText in browsers that don't\n * fire onreadystatechange during incremental loading of the response body.\n *\n * @return {number|undefined} The polling interval (MS) for the current U-A;\n * or undefined if polling is not supposed to be enabled.\n */\nexports.getPollingInterval = function() {\n  if (userAgent.EDGE_OR_IE) {\n    return EDGE_POLLING_INTERVAL_;\n  }\n\n  return undefined;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:S"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchannel/environment.js"],"^:1",["^9K",["~$goog.labs.net.webChannel.environment"]],"^9<",true,"^9=",["^9>","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.graphics.solidfill.js","^9C",["^9D","goog/graphics/solidfill.js"],"^9E","goog/graphics/solidfill.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Represents a solid color fill goog.graphics.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.graphics.SolidFill');\n\n\ngoog.require('goog.graphics.Fill');\n\n\n\n/**\n * Creates an immutable solid color fill object.\n *\n * @param {string} color The color of the background.\n * @param {number=} opt_opacity The opacity of the background fill. The value\n *    must be greater than or equal to zero (transparent) and less than or\n *    equal to 1 (opaque).\n * @constructor\n * @extends {goog.graphics.Fill}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n */\ngoog.graphics.SolidFill = function(color, opt_opacity) {\n  /**\n   * The color with which to fill.\n   * @type {string}\n   * @private\n   */\n  this.color_ = color;\n\n\n  /**\n   * The opacity of the fill.\n   * @type {number}\n   * @private\n   */\n  this.opacity_ = opt_opacity == null ? 1.0 : opt_opacity;\n};\ngoog.inherits(goog.graphics.SolidFill, goog.graphics.Fill);\n\n\n/**\n * @return {string} The color of this fill.\n */\ngoog.graphics.SolidFill.prototype.getColor = function() {\n  return this.color_;\n};\n\n\n/**\n * @return {number} The opacity of this fill.\n */\ngoog.graphics.SolidFill.prototype.getOpacity = function() {\n  return this.opacity_;\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.graphics.Fill","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/solidfill.js"],"^:1",["^9K",["~$goog.graphics.SolidFill"]],"^9<",true,"^9=",["^9>","^H4"]],["^ ","^9A",[1579837703000],"^9B","goog.module.abstractmoduleloader.js","^9C",["^9D","goog/module/abstractmoduleloader.js"],"^9E","goog/module/abstractmoduleloader.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An interface for module loading.\n *\n */\n\ngoog.provide('goog.module.AbstractModuleLoader');\n\n/** @suppress {extraRequire} */\ngoog.require('goog.module');\ngoog.require('goog.module.ModuleInfo');\n\n\n/**\n * An interface that loads JavaScript modules.\n * @interface\n */\ngoog.module.AbstractModuleLoader = function() {};\n\n\n/**\n * Loads a list of JavaScript modules.\n *\n * @param {Array<string>} ids The module ids in dependency order.\n * @param {!Object<string, !goog.module.ModuleInfo>} moduleInfoMap A mapping\n *     from module id to ModuleInfo object.\n * @param {function()?=} opt_successFn The callback if module loading is a\n *     success.\n * @param {function(?number)?=} opt_errorFn The callback if module loading is an\n *     error.\n * @param {function()?=} opt_timeoutFn The callback if module loading times out.\n * @param {boolean=} opt_forceReload Whether to bypass cache while loading the\n *     module.\n */\ngoog.module.AbstractModuleLoader.prototype.loadModules = function(\n    ids, moduleInfoMap, opt_successFn, opt_errorFn, opt_timeoutFn,\n    opt_forceReload) {};\n\n\n/**\n * Pre-fetches a JavaScript module.\n *\n * @param {string} id The module id.\n * @param {!goog.module.ModuleInfo} moduleInfo The module info.\n */\ngoog.module.AbstractModuleLoader.prototype.prefetchModule = function(\n    id, moduleInfo) {};\n","^9I",1579837703000,"^9J",["^9K",["^?:","~$goog.module.ModuleInfo","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/module/abstractmoduleloader.js"],"^:1",["^9K",["~$goog.module.AbstractModuleLoader"]],"^9<",true,"^9=",["^9>","^?:","^H6"]],["^ ","^9A",[1579837703000],"^9B","goog.math.bezier.js","^9C",["^9D","goog/math/bezier.js"],"^9E","goog/math/bezier.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Represents a cubic Bezier curve.\n *\n * Uses the deCasteljau algorithm to compute points on the curve.\n * http://en.wikipedia.org/wiki/De_Casteljau's_algorithm\n *\n * Currently it uses an unrolled version of the algorithm for speed.  Eventually\n * it may be useful to use the loop form of the algorithm in order to support\n * curves of arbitrary degree.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.math.Bezier');\n\ngoog.require('goog.math');\ngoog.require('goog.math.Coordinate');\n\n\n\n/**\n * Object representing a cubic bezier curve.\n * @param {number} x0 X coordinate of the start point.\n * @param {number} y0 Y coordinate of the start point.\n * @param {number} x1 X coordinate of the first control point.\n * @param {number} y1 Y coordinate of the first control point.\n * @param {number} x2 X coordinate of the second control point.\n * @param {number} y2 Y coordinate of the second control point.\n * @param {number} x3 X coordinate of the end point.\n * @param {number} y3 Y coordinate of the end point.\n * @struct\n * @constructor\n * @final\n */\ngoog.math.Bezier = function(x0, y0, x1, y1, x2, y2, x3, y3) {\n  /**\n   * X coordinate of the first point.\n   * @type {number}\n   */\n  this.x0 = x0;\n\n  /**\n   * Y coordinate of the first point.\n   * @type {number}\n   */\n  this.y0 = y0;\n\n  /**\n   * X coordinate of the first control point.\n   * @type {number}\n   */\n  this.x1 = x1;\n\n  /**\n   * Y coordinate of the first control point.\n   * @type {number}\n   */\n  this.y1 = y1;\n\n  /**\n   * X coordinate of the second control point.\n   * @type {number}\n   */\n  this.x2 = x2;\n\n  /**\n   * Y coordinate of the second control point.\n   * @type {number}\n   */\n  this.y2 = y2;\n\n  /**\n   * X coordinate of the end point.\n   * @type {number}\n   */\n  this.x3 = x3;\n\n  /**\n   * Y coordinate of the end point.\n   * @type {number}\n   */\n  this.y3 = y3;\n};\n\n\n/**\n * Constant used to approximate ellipses.\n * See: http://canvaspaint.org/blog/2006/12/ellipse/\n * @type {number}\n */\ngoog.math.Bezier.KAPPA = 4 * (Math.sqrt(2) - 1) / 3;\n\n\n/**\n * @return {!goog.math.Bezier} A copy of this curve.\n */\ngoog.math.Bezier.prototype.clone = function() {\n  return new goog.math.Bezier(\n      this.x0, this.y0, this.x1, this.y1, this.x2, this.y2, this.x3, this.y3);\n};\n\n\n/**\n * Test if the given curve is exactly the same as this one.\n * @param {goog.math.Bezier} other The other curve.\n * @return {boolean} Whether the given curve is the same as this one.\n */\ngoog.math.Bezier.prototype.equals = function(other) {\n  return this.x0 == other.x0 && this.y0 == other.y0 && this.x1 == other.x1 &&\n      this.y1 == other.y1 && this.x2 == other.x2 && this.y2 == other.y2 &&\n      this.x3 == other.x3 && this.y3 == other.y3;\n};\n\n\n/**\n * Modifies the curve in place to progress in the opposite direction.\n */\ngoog.math.Bezier.prototype.flip = function() {\n  var temp = this.x0;\n  this.x0 = this.x3;\n  this.x3 = temp;\n  temp = this.y0;\n  this.y0 = this.y3;\n  this.y3 = temp;\n\n  temp = this.x1;\n  this.x1 = this.x2;\n  this.x2 = temp;\n  temp = this.y1;\n  this.y1 = this.y2;\n  this.y2 = temp;\n};\n\n\n/**\n * Computes the curve's X coordinate at a point between 0 and 1.\n * @param {number} t The point on the curve to find.\n * @return {number} The computed coordinate.\n */\ngoog.math.Bezier.prototype.getPointX = function(t) {\n  // Special case start and end.\n  if (t == 0) {\n    return this.x0;\n  } else if (t == 1) {\n    return this.x3;\n  }\n\n  // Step one - from 4 points to 3\n  var ix0 = goog.math.lerp(this.x0, this.x1, t);\n  var ix1 = goog.math.lerp(this.x1, this.x2, t);\n  var ix2 = goog.math.lerp(this.x2, this.x3, t);\n\n  // Step two - from 3 points to 2\n  ix0 = goog.math.lerp(ix0, ix1, t);\n  ix1 = goog.math.lerp(ix1, ix2, t);\n\n  // Final step - last point\n  return goog.math.lerp(ix0, ix1, t);\n};\n\n\n/**\n * Computes the curve's Y coordinate at a point between 0 and 1.\n * @param {number} t The point on the curve to find.\n * @return {number} The computed coordinate.\n */\ngoog.math.Bezier.prototype.getPointY = function(t) {\n  // Special case start and end.\n  if (t == 0) {\n    return this.y0;\n  } else if (t == 1) {\n    return this.y3;\n  }\n\n  // Step one - from 4 points to 3\n  var iy0 = goog.math.lerp(this.y0, this.y1, t);\n  var iy1 = goog.math.lerp(this.y1, this.y2, t);\n  var iy2 = goog.math.lerp(this.y2, this.y3, t);\n\n  // Step two - from 3 points to 2\n  iy0 = goog.math.lerp(iy0, iy1, t);\n  iy1 = goog.math.lerp(iy1, iy2, t);\n\n  // Final step - last point\n  return goog.math.lerp(iy0, iy1, t);\n};\n\n\n/**\n * Computes the curve at a point between 0 and 1.\n * @param {number} t The point on the curve to find.\n * @return {!goog.math.Coordinate} The computed coordinate.\n */\ngoog.math.Bezier.prototype.getPoint = function(t) {\n  return new goog.math.Coordinate(this.getPointX(t), this.getPointY(t));\n};\n\n\n/**\n * Changes this curve in place to be the portion of itself from [t, 1].\n * @param {number} t The start of the desired portion of the curve.\n */\ngoog.math.Bezier.prototype.subdivideLeft = function(t) {\n  if (t == 1) {\n    return;\n  }\n\n  // Step one - from 4 points to 3\n  var ix0 = goog.math.lerp(this.x0, this.x1, t);\n  var iy0 = goog.math.lerp(this.y0, this.y1, t);\n\n  var ix1 = goog.math.lerp(this.x1, this.x2, t);\n  var iy1 = goog.math.lerp(this.y1, this.y2, t);\n\n  var ix2 = goog.math.lerp(this.x2, this.x3, t);\n  var iy2 = goog.math.lerp(this.y2, this.y3, t);\n\n  // Collect our new x1 and y1\n  this.x1 = ix0;\n  this.y1 = iy0;\n\n  // Step two - from 3 points to 2\n  ix0 = goog.math.lerp(ix0, ix1, t);\n  iy0 = goog.math.lerp(iy0, iy1, t);\n\n  ix1 = goog.math.lerp(ix1, ix2, t);\n  iy1 = goog.math.lerp(iy1, iy2, t);\n\n  // Collect our new x2 and y2\n  this.x2 = ix0;\n  this.y2 = iy0;\n\n  // Final step - last point\n  this.x3 = goog.math.lerp(ix0, ix1, t);\n  this.y3 = goog.math.lerp(iy0, iy1, t);\n};\n\n\n/**\n * Changes this curve in place to be the portion of itself from [0, t].\n * @param {number} t The end of the desired portion of the curve.\n */\ngoog.math.Bezier.prototype.subdivideRight = function(t) {\n  this.flip();\n  this.subdivideLeft(1 - t);\n  this.flip();\n};\n\n\n/**\n * Changes this curve in place to be the portion of itself from [s, t].\n * @param {number} s The start of the desired portion of the curve.\n * @param {number} t The end of the desired portion of the curve.\n */\ngoog.math.Bezier.prototype.subdivide = function(s, t) {\n  this.subdivideRight(s);\n  this.subdivideLeft((t - s) / (1 - s));\n};\n\n\n/**\n * Computes the position t of a point on the curve given its x coordinate.\n * That is, for an input xVal, finds t s.t. getPointX(t) = xVal.\n * As such, the following should always be true up to some small epsilon:\n * t ~ solvePositionFromXValue(getPointX(t)) for t in [0, 1].\n * @param {number} xVal The x coordinate of the point to find on the curve.\n * @return {number} The position t.\n */\ngoog.math.Bezier.prototype.solvePositionFromXValue = function(xVal) {\n  // Desired precision on the computation.\n  var epsilon = 1e-6;\n\n  // Initial estimate of t using linear interpolation.\n  var t = (xVal - this.x0) / (this.x3 - this.x0);\n  if (t <= 0) {\n    return 0;\n  } else if (t >= 1) {\n    return 1;\n  }\n\n  // Try gradient descent to solve for t. If it works, it is very fast.\n  var tMin = 0;\n  var tMax = 1;\n  var value = 0;\n  for (var i = 0; i < 8; i++) {\n    value = this.getPointX(t);\n    var derivative = (this.getPointX(t + epsilon) - value) / epsilon;\n    if (Math.abs(value - xVal) < epsilon) {\n      return t;\n    } else if (Math.abs(derivative) < epsilon) {\n      break;\n    } else {\n      if (value < xVal) {\n        tMin = t;\n      } else {\n        tMax = t;\n      }\n      t -= (value - xVal) / derivative;\n    }\n  }\n\n  // If the gradient descent got stuck in a local minimum, e.g. because\n  // the derivative was close to 0, use a Dichotomy refinement instead.\n  // We limit the number of interations to 8.\n  for (var i = 0; Math.abs(value - xVal) > epsilon && i < 8; i++) {\n    if (value < xVal) {\n      tMin = t;\n      t = (t + tMax) / 2;\n    } else {\n      tMax = t;\n      t = (t + tMin) / 2;\n    }\n    value = this.getPointX(t);\n  }\n  return t;\n};\n\n\n/**\n * Computes the y coordinate of a point on the curve given its x coordinate.\n * @param {number} xVal The x coordinate of the point on the curve.\n * @return {number} The y coordinate of the point on the curve.\n */\ngoog.math.Bezier.prototype.solveYValueFromXValue = function(xVal) {\n  return this.getPointY(this.solvePositionFromXValue(xVal));\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^>8","^<2"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/bezier.js"],"^:1",["^9K",["~$goog.math.Bezier"]],"^9<",true,"^9=",["^9>","^<2","^>8"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.gauge.js","^9C",["^9D","goog/ui/gauge.js"],"^9E","goog/ui/gauge.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Gauge UI component, using browser vector graphics.\n * @see ../demos/gauge.html\n */\n\n\ngoog.provide('goog.ui.Gauge');\ngoog.provide('goog.ui.GaugeColoredRange');\n\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.asserts');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events');\ngoog.require('goog.fx.Animation');\ngoog.require('goog.fx.Transition');\ngoog.require('goog.fx.easing');\ngoog.require('goog.graphics');\ngoog.require('goog.graphics.Font');\ngoog.require('goog.graphics.Path');\ngoog.require('goog.graphics.SolidFill');\ngoog.require('goog.math');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.GaugeTheme');\n\n\n\n/**\n * Information on how to decorate a range in the gauge.\n * This is an internal-only class.\n * @param {number} fromValue The range start (minimal) value.\n * @param {number} toValue The range end (maximal) value.\n * @param {string} backgroundColor Color to fill the range background with.\n * @constructor\n * @final\n */\ngoog.ui.GaugeColoredRange = function(fromValue, toValue, backgroundColor) {\n\n  /**\n   * The range start (minimal) value.\n   * @type {number}\n   */\n  this.fromValue = fromValue;\n\n\n  /**\n   * The range end (maximal) value.\n   * @type {number}\n   */\n  this.toValue = toValue;\n\n\n  /**\n   * Color to fill the range background with.\n   * @type {string}\n   */\n  this.backgroundColor = backgroundColor;\n};\n\n\n\n/**\n * A UI component that displays a gauge.\n * A gauge displayes a current value within a round axis that represents a\n * given range.\n * The gauge is built from an external border, and internal border inside it,\n * ticks and labels inside the internal border, and a needle that points to\n * the current value.\n * @param {number} width The width in pixels.\n * @param {number} height The height in pixels.\n * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper object for the\n *     document we want to render in.\n * @constructor\n * @extends {goog.ui.Component}\n * @final\n */\ngoog.ui.Gauge = function(width, height, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * The width in pixels of this component.\n   * @type {number}\n   * @private\n   */\n  this.width_ = width;\n\n\n  /**\n   * The height in pixels of this component.\n   * @type {number}\n   * @private\n   */\n  this.height_ = height;\n\n\n  /**\n   * The underlying graphics.\n   * @type {goog.graphics.AbstractGraphics}\n   * @private\n   */\n  this.graphics_ =\n      goog.graphics.createGraphics(width, height, null, null, opt_domHelper);\n\n\n  /**\n   * Colors to paint the background of certain ranges (optional).\n   * @type {Array<goog.ui.GaugeColoredRange>}\n   * @private\n   */\n  this.rangeColors_ = [];\n};\ngoog.inherits(goog.ui.Gauge, goog.ui.Component);\n\n\n/**\n * Constant for a background color for a gauge area.\n */\ngoog.ui.Gauge.RED = '#ffc0c0';\n\n\n/**\n * Constant for a background color for a gauge area.\n */\ngoog.ui.Gauge.GREEN = '#c0ffc0';\n\n\n/**\n * Constant for a background color for a gauge area.\n */\ngoog.ui.Gauge.YELLOW = '#ffffa0';\n\n\n/**\n * The radius of the entire gauge from the canvas size.\n * @type {number}\n */\ngoog.ui.Gauge.FACTOR_RADIUS_FROM_SIZE = 0.45;\n\n\n/**\n * The ratio of internal gauge radius from entire radius.\n * The remaining area is the border around the gauge.\n * @type {number}\n */\ngoog.ui.Gauge.FACTOR_MAIN_AREA = 0.9;\n\n\n/**\n * The ratio of the colored background area for value ranges.\n * The colored area width is computed as\n * InternalRadius * (1 - FACTOR_COLOR_RADIUS)\n * @type {number}\n */\ngoog.ui.Gauge.FACTOR_COLOR_RADIUS = 0.75;\n\n\n/**\n * The ratio of the major ticks length start position, from the radius.\n * The major ticks length width is computed as\n * InternalRadius * (1 - FACTOR_MAJOR_TICKS)\n * @type {number}\n */\ngoog.ui.Gauge.FACTOR_MAJOR_TICKS = 0.8;\n\n\n/**\n * The ratio of the minor ticks length start position, from the radius.\n * The minor ticks length width is computed as\n * InternalRadius * (1 - FACTOR_MINOR_TICKS)\n * @type {number}\n */\ngoog.ui.Gauge.FACTOR_MINOR_TICKS = 0.9;\n\n\n/**\n * The length of the needle front (value facing) from the internal radius.\n * The needle front is the part of the needle that points to the value.\n * @type {number}\n */\ngoog.ui.Gauge.FACTOR_NEEDLE_FRONT = 0.95;\n\n\n/**\n * The length of the needle back relative to the internal radius.\n * The needle back is the part of the needle that points away from the value.\n * @type {number}\n */\ngoog.ui.Gauge.FACTOR_NEEDLE_BACK = 0.3;\n\n\n/**\n * The width of the needle front at the hinge.\n * This is the width of the curve control point, the actual width is\n * computed by the curve itself.\n * @type {number}\n */\ngoog.ui.Gauge.FACTOR_NEEDLE_WIDTH = 0.07;\n\n\n/**\n * The width (radius) of the needle hinge from the gauge radius.\n * @type {number}\n */\ngoog.ui.Gauge.FACTOR_NEEDLE_HINGE = 0.15;\n\n\n/**\n * The title font size (height) for titles relative to the internal radius.\n * @type {number}\n */\ngoog.ui.Gauge.FACTOR_TITLE_FONT_SIZE = 0.16;\n\n\n/**\n * The offset of the title from the center, relative to the internal radius.\n * @type {number}\n */\ngoog.ui.Gauge.FACTOR_TITLE_OFFSET = 0.35;\n\n\n/**\n * The formatted value font size (height) relative to the internal radius.\n * @type {number}\n */\ngoog.ui.Gauge.FACTOR_VALUE_FONT_SIZE = 0.18;\n\n\n/**\n * The title font size (height) for tick labels relative to the internal radius.\n * @type {number}\n */\ngoog.ui.Gauge.FACTOR_TICK_LABEL_FONT_SIZE = 0.14;\n\n\n/**\n * The offset of the formatted value down from the center, relative to the\n * internal radius.\n * @type {number}\n */\ngoog.ui.Gauge.FACTOR_VALUE_OFFSET = 0.75;\n\n\n/**\n * The font name for title text.\n * @type {string}\n */\ngoog.ui.Gauge.TITLE_FONT_NAME = 'arial';\n\n\n/**\n * The maximal size of a step the needle can move (percent from size of range).\n * If the needle needs to move more, it will be moved in animated steps, to\n * show a smooth transition between values.\n * @type {number}\n */\ngoog.ui.Gauge.NEEDLE_MOVE_MAX_STEP = 0.02;\n\n\n/**\n * Time in miliseconds for animating a move of the value pointer.\n * @type {number}\n */\ngoog.ui.Gauge.NEEDLE_MOVE_TIME = 400;\n\n\n/**\n * Tolerance factor for how much values can exceed the range (being too\n * low or too high). The value is presented as a position (percentage).\n * @type {number}\n */\ngoog.ui.Gauge.MAX_EXCEED_POSITION_POSITION = 0.02;\n\n\n/**\n * The minimal value that can be displayed.\n * @private\n * @type {number}\n */\ngoog.ui.Gauge.prototype.minValue_ = 0;\n\n\n/**\n * The maximal value that can be displayed.\n * @private\n * @type {number}\n */\ngoog.ui.Gauge.prototype.maxValue_ = 100;\n\n\n/**\n * The number of major tick sections.\n * @private\n * @type {number}\n */\ngoog.ui.Gauge.prototype.majorTicks_ = 5;\n\n\n/**\n * The number of minor tick sections in each major tick section.\n * @private\n * @type {number}\n */\ngoog.ui.Gauge.prototype.minorTicks_ = 2;\n\n\n/**\n * The current value that needs to be displayed in the gauge.\n * @private\n * @type {number}\n */\ngoog.ui.Gauge.prototype.value_ = 0;\n\n\n/**\n * The current value formatted into a String.\n * @private\n * @type {?string}\n */\ngoog.ui.Gauge.prototype.formattedValue_ = null;\n\n\n/**\n * The current colors theme.\n * @private\n * @type {goog.ui.GaugeTheme?}\n */\ngoog.ui.Gauge.prototype.theme_ = null;\n\n\n/**\n * Title to display above the gauge center.\n * @private\n * @type {?string}\n */\ngoog.ui.Gauge.prototype.titleTop_ = null;\n\n\n/**\n * Title to display below the gauge center.\n * @private\n * @type {?string}\n */\ngoog.ui.Gauge.prototype.titleBottom_ = null;\n\n\n/**\n * Font to use for drawing titles.\n * If null (default), computed dynamically with a size relative to the\n * gauge radius.\n * @private\n * @type {goog.graphics.Font?}\n */\ngoog.ui.Gauge.prototype.titleFont_ = null;\n\n\n/**\n * Font to use for drawing the formatted value.\n * If null (default), computed dynamically with a size relative to the\n * gauge radius.\n * @private\n * @type {goog.graphics.Font?}\n */\ngoog.ui.Gauge.prototype.valueFont_ = null;\n\n\n/**\n * Font to use for drawing tick labels.\n * If null (default), computed dynamically with a size relative to the\n * gauge radius.\n * @private\n * @type {goog.graphics.Font?}\n */\ngoog.ui.Gauge.prototype.tickLabelFont_ = null;\n\n\n/**\n * The size in angles of the gauge axis area.\n * @private\n * @type {number}\n */\ngoog.ui.Gauge.prototype.angleSpan_ = 270;\n\n\n/**\n * The radius for drawing the needle.\n * Computed on full redraw, and used on every animation step of moving\n * the needle.\n * @type {number}\n * @private\n */\ngoog.ui.Gauge.prototype.needleRadius_ = 0;\n\n\n/**\n * The group elemnt of the needle. Contains all elements that change when the\n * gauge value changes.\n * @type {goog.graphics.GroupElement?}\n * @private\n */\ngoog.ui.Gauge.prototype.needleGroup_ = null;\n\n\n/**\n * The current position (0-1) of the visible needle.\n * Initially set to null to prevent animation on first opening of the gauge.\n * @type {?number}\n * @private\n */\ngoog.ui.Gauge.prototype.needleValuePosition_ = null;\n\n\n/**\n * Text labels to display by major tick marks.\n * @type {Array<string>?}\n * @private\n */\ngoog.ui.Gauge.prototype.majorTickLabels_ = null;\n\n\n/**\n * Animation object while needle is being moved (animated).\n * @type {goog.fx.Animation?}\n * @private\n */\ngoog.ui.Gauge.prototype.animation_ = null;\n\n\n/**\n * @return {number} The minimum value of the range.\n */\ngoog.ui.Gauge.prototype.getMinimum = function() {\n  return this.minValue_;\n};\n\n\n/**\n * Sets the minimum value of the range\n * @param {number} min The minimum value of the range.\n */\ngoog.ui.Gauge.prototype.setMinimum = function(min) {\n  this.minValue_ = min;\n  var element = this.getElement();\n  if (element) {\n    goog.a11y.aria.setState(element, 'valuemin', min);\n  }\n};\n\n\n/**\n * @return {number} The maximum value of the range.\n */\ngoog.ui.Gauge.prototype.getMaximum = function() {\n  return this.maxValue_;\n};\n\n\n/**\n * Sets the maximum number of the range\n * @param {number} max The maximum value of the range.\n */\ngoog.ui.Gauge.prototype.setMaximum = function(max) {\n  this.maxValue_ = max;\n\n  var element = this.getElement();\n  if (element) {\n    goog.a11y.aria.setState(element, 'valuemax', max);\n  }\n};\n\n\n/**\n * Sets the current value range displayed by the gauge.\n * @param {number} value The current value for the gauge. This value\n *     determines the position of the needle of the gauge.\n * @param {string=} opt_formattedValue The string value to show in the gauge.\n *     If not specified, no string value will be displayed.\n */\ngoog.ui.Gauge.prototype.setValue = function(value, opt_formattedValue) {\n  this.value_ = value;\n  this.formattedValue_ = opt_formattedValue || null;\n\n  this.stopAnimation_();  // Stop the active animation if exists\n\n  // Compute desired value position (normalize value to range 0-1)\n  var valuePosition = this.valueToRangePosition_(value);\n  if (this.needleValuePosition_ == null) {\n    // No animation on initial display\n    this.needleValuePosition_ = valuePosition;\n    this.drawValue_();\n  } else {\n    // Animate move\n    this.animation_ = new goog.fx.Animation(\n        [this.needleValuePosition_], [valuePosition],\n        goog.ui.Gauge.NEEDLE_MOVE_TIME, goog.fx.easing.inAndOut);\n\n    var events = [\n      goog.fx.Transition.EventType.BEGIN, goog.fx.Animation.EventType.ANIMATE,\n      goog.fx.Transition.EventType.END\n    ];\n    goog.events.listen(this.animation_, events, this.onAnimate_, false, this);\n    goog.events.listen(\n        this.animation_, goog.fx.Transition.EventType.END, this.onAnimateEnd_,\n        false, this);\n\n    // Start animation\n    this.animation_.play(false);\n  }\n\n  var element = this.getElement();\n  if (element) {\n    goog.a11y.aria.setState(element, 'valuenow', this.value_);\n  }\n};\n\n\n/**\n * Sets the number of major tick sections and minor tick sections.\n * @param {number} majorUnits The number of major tick sections.\n * @param {number} minorUnits The number of minor tick sections for each major\n *     tick section.\n */\ngoog.ui.Gauge.prototype.setTicks = function(majorUnits, minorUnits) {\n  this.majorTicks_ = Math.max(1, majorUnits);\n  this.minorTicks_ = Math.max(1, minorUnits);\n  this.draw_();\n};\n\n\n/**\n * Sets the labels of the major ticks.\n * @param {Array<string>} tickLabels A text label for each major tick value.\n */\ngoog.ui.Gauge.prototype.setMajorTickLabels = function(tickLabels) {\n  this.majorTickLabels_ = tickLabels;\n  this.draw_();\n};\n\n\n/**\n * Sets the top title of the gauge.\n * The top title is displayed above the center.\n * @param {string} text The top title text.\n */\ngoog.ui.Gauge.prototype.setTitleTop = function(text) {\n  this.titleTop_ = text;\n  this.draw_();\n};\n\n\n/**\n * Sets the bottom title of the gauge.\n * The top title is displayed below the center.\n * @param {string} text The bottom title text.\n */\ngoog.ui.Gauge.prototype.setTitleBottom = function(text) {\n  this.titleBottom_ = text;\n  this.draw_();\n};\n\n\n/**\n * Sets the font for displaying top and bottom titles.\n * @param {goog.graphics.Font} font The font for titles.\n */\ngoog.ui.Gauge.prototype.setTitleFont = function(font) {\n  this.titleFont_ = font;\n  this.draw_();\n};\n\n\n/**\n * Sets the font for displaying the formatted value.\n * @param {goog.graphics.Font} font The font for displaying the value.\n */\ngoog.ui.Gauge.prototype.setValueFont = function(font) {\n  this.valueFont_ = font;\n  this.drawValue_();\n};\n\n\n/**\n * Sets the color theme for drawing the gauge.\n * @param {goog.ui.GaugeTheme} theme The color theme to use.\n */\ngoog.ui.Gauge.prototype.setTheme = function(theme) {\n  this.theme_ = theme;\n  this.draw_();\n};\n\n\n/**\n * Set the background color for a range of values on the gauge.\n * @param {number} fromValue The lower (start) value of the colored range.\n * @param {number} toValue The higher (end) value of the colored range.\n * @param {string} color The color name to paint the range with. For example\n *     'red', '#ffcc00' or constants like goog.ui.Gauge.RED.\n */\ngoog.ui.Gauge.prototype.addBackgroundColor = function(\n    fromValue, toValue, color) {\n  this.rangeColors_.push(\n      new goog.ui.GaugeColoredRange(fromValue, toValue, color));\n  this.draw_();\n};\n\n\n/**\n * Creates the DOM representation of the graphics area.\n * @override\n */\ngoog.ui.Gauge.prototype.createDom = function() {\n  this.setElementInternal(\n      this.getDomHelper().createDom(\n          goog.dom.TagName.DIV, goog.getCssName('goog-gauge'),\n          this.graphics_.getElement()));\n};\n\n\n/**\n * Clears the entire graphics area.\n * @private\n */\ngoog.ui.Gauge.prototype.clear_ = function() {\n  this.graphics_.clear();\n  this.needleGroup_ = null;\n};\n\n\n/**\n * Redraw the entire gauge.\n * @private\n * @suppress {strictPrimitiveOperators} Part of the go/strict_warnings_migration\n */\ngoog.ui.Gauge.prototype.draw_ = function() {\n  if (!this.isInDocument()) {\n    return;\n  }\n\n  this.clear_();\n\n  var x, y;\n  var size = Math.min(this.width_, this.height_);\n  var r = Math.round(goog.ui.Gauge.FACTOR_RADIUS_FROM_SIZE * size);\n  var cx = this.width_ / 2;\n  var cy = this.height_ / 2;\n\n  var theme = this.theme_;\n  if (!theme) {\n    // Lazy allocation of default theme, common to all instances\n    theme = goog.ui.Gauge.prototype.theme_ = new goog.ui.GaugeTheme();\n  }\n\n  // Draw main circle frame around gauge\n  var graphics = this.graphics_;\n  var stroke = this.theme_.getExternalBorderStroke();\n  var fill = theme.getExternalBorderFill(cx, cy, r);\n  graphics.drawCircle(cx, cy, r, stroke, fill);\n\n  r -= stroke.getWidth();\n  r = Math.round(r * goog.ui.Gauge.FACTOR_MAIN_AREA);\n  stroke = theme.getInternalBorderStroke();\n  fill = theme.getInternalBorderFill(cx, cy, r);\n  graphics.drawCircle(cx, cy, r, stroke, fill);\n  r -= stroke.getWidth() * 2;\n\n  // Draw Background with external and internal borders\n  var rBackgroundInternal = r * goog.ui.Gauge.FACTOR_COLOR_RADIUS;\n  for (var i = 0; i < this.rangeColors_.length; i++) {\n    var rangeColor = this.rangeColors_[i];\n    var fromValue = rangeColor.fromValue;\n    var toValue = rangeColor.toValue;\n    var path = new goog.graphics.Path();\n    var fromAngle = this.valueToAngle_(fromValue);\n    var toAngle = this.valueToAngle_(toValue);\n    // Move to outer point at \"from\" angle\n    path.moveTo(\n        cx + goog.math.angleDx(fromAngle, r),\n        cy + goog.math.angleDy(fromAngle, r));\n    // Arc to outer point at \"to\" angle\n    path.arcTo(r, r, fromAngle, toAngle - fromAngle);\n    // Line to inner point at \"to\" angle\n    path.lineTo(\n        cx + goog.math.angleDx(toAngle, rBackgroundInternal),\n        cy + goog.math.angleDy(toAngle, rBackgroundInternal));\n    // Arc to inner point at \"from\" angle\n    path.arcTo(\n        rBackgroundInternal, rBackgroundInternal, toAngle, fromAngle - toAngle);\n    path.close();\n    fill = new goog.graphics.SolidFill(rangeColor.backgroundColor);\n    graphics.drawPath(path, null, fill);\n  }\n\n  // Draw titles\n  if (this.titleTop_ || this.titleBottom_) {\n    var font = this.titleFont_;\n    if (!font) {\n      // Lazy creation of font\n      var fontSize = Math.round(r * goog.ui.Gauge.FACTOR_TITLE_FONT_SIZE);\n      font = new goog.graphics.Font(fontSize, goog.ui.Gauge.TITLE_FONT_NAME);\n      this.titleFont_ = font;\n    }\n    fill = new goog.graphics.SolidFill(theme.getTitleColor());\n    if (this.titleTop_) {\n      y = cy - Math.round(r * goog.ui.Gauge.FACTOR_TITLE_OFFSET);\n      graphics.drawTextOnLine(\n          this.titleTop_, 0, y, this.width_, y, 'center', font, null, fill);\n    }\n    if (this.titleBottom_) {\n      y = cy + Math.round(r * goog.ui.Gauge.FACTOR_TITLE_OFFSET);\n      graphics.drawTextOnLine(\n          this.titleBottom_, 0, y, this.width_, y, 'center', font, null, fill);\n    }\n  }\n\n  // Draw tick marks\n  var majorTicks = this.majorTicks_;\n  var minorTicks = this.minorTicks_;\n  var rMajorTickInternal = r * goog.ui.Gauge.FACTOR_MAJOR_TICKS;\n  var rMinorTickInternal = r * goog.ui.Gauge.FACTOR_MINOR_TICKS;\n  var ticks = majorTicks * minorTicks;\n  var valueRange = this.maxValue_ - this.minValue_;\n  var tickValueSpan = valueRange / ticks;\n  var majorTicksPath = new goog.graphics.Path();\n  var minorTicksPath = new goog.graphics.Path();\n\n  var tickLabelFill = new goog.graphics.SolidFill(theme.getTickLabelColor());\n  var tickLabelFont = this.tickLabelFont_;\n  if (!tickLabelFont) {\n    tickLabelFont = new goog.graphics.Font(\n        Math.round(r * goog.ui.Gauge.FACTOR_TICK_LABEL_FONT_SIZE),\n        goog.ui.Gauge.TITLE_FONT_NAME);\n  }\n  var tickLabelFontSize = tickLabelFont.size;\n\n  for (var i = 0; i <= ticks; i++) {\n    var angle = this.valueToAngle_(i * tickValueSpan + this.minValue_);\n    var isMajorTick = i % minorTicks == 0;\n    var rInternal = isMajorTick ? rMajorTickInternal : rMinorTickInternal;\n    var path = isMajorTick ? majorTicksPath : minorTicksPath;\n    x = cx + goog.math.angleDx(angle, rInternal);\n    y = cy + goog.math.angleDy(angle, rInternal);\n    path.moveTo(x, y);\n    x = cx + goog.math.angleDx(angle, r);\n    y = cy + goog.math.angleDy(angle, r);\n    path.lineTo(x, y);\n\n    // Draw the tick's label for major ticks\n    if (isMajorTick && this.majorTickLabels_) {\n      var tickIndex = Math.floor(i / minorTicks);\n      var label = this.majorTickLabels_[tickIndex];\n      if (label) {\n        x = cx + goog.math.angleDx(angle, rInternal - tickLabelFontSize / 2);\n        y = cy + goog.math.angleDy(angle, rInternal - tickLabelFontSize / 2);\n        var x1, x2;\n        var align = 'center';\n        if (angle > 280 || angle < 90) {\n          align = 'right';\n          x1 = 0;\n          x2 = x;\n        } else if (angle >= 90 && angle < 260) {\n          align = 'left';\n          x1 = x;\n          x2 = this.width_;\n        } else {\n          // Values around top (angle 260-280) are centered around point\n          var dw = Math.min(x, this.width_ - x);  // Nearest side border\n          x1 = x - dw;\n          x2 = x + dw;\n          y += Math.round(tickLabelFontSize / 4);  // Movea bit down\n        }\n        graphics.drawTextOnLine(\n            label, x1, y, x2, y, align, tickLabelFont, null, tickLabelFill);\n      }\n    }\n  }\n  stroke = theme.getMinorTickStroke();\n  graphics.drawPath(minorTicksPath, stroke, null);\n  stroke = theme.getMajorTickStroke();\n  graphics.drawPath(majorTicksPath, stroke, null);\n\n  // Draw the needle and the value label. Stop animation when doing\n  // full redraw and jump to the final value position.\n  this.stopAnimation_();\n  this.needleRadius_ = r;\n  this.drawValue_();\n};\n\n\n/**\n * Handle animation events while the hand is moving.\n * @param {goog.fx.AnimationEvent} e The event.\n * @private\n */\ngoog.ui.Gauge.prototype.onAnimate_ = function(e) {\n  this.needleValuePosition_ = e.x;\n  this.drawValue_();\n};\n\n\n/**\n * Handle animation events when hand move is complete.\n * @private\n */\ngoog.ui.Gauge.prototype.onAnimateEnd_ = function() {\n  this.stopAnimation_();\n};\n\n\n/**\n * Stop the current animation, if it is active.\n * @private\n */\ngoog.ui.Gauge.prototype.stopAnimation_ = function() {\n  if (this.animation_) {\n    goog.events.removeAll(this.animation_);\n    this.animation_.stop(false);\n    this.animation_ = null;\n  }\n};\n\n\n/**\n * Convert a value to the position in the range. The returned position\n * is a value between 0 and 1, where 0 indicates the lowest range value,\n * 1 is the highest range, and any value in between is proportional\n * to mapping the range to (0-1).\n * If the value is not within the range, the returned value may be a bit\n * lower than 0, or a bit higher than 1. This is done so that values out\n * of range will be displayed just a bit outside of the gauge axis.\n * @param {number} value The value to convert.\n * @private\n * @return {number} The range position.\n */\ngoog.ui.Gauge.prototype.valueToRangePosition_ = function(value) {\n  var valueRange = this.maxValue_ - this.minValue_;\n  var valuePct = (value - this.minValue_) / valueRange;  // 0 to 1\n\n  // If value is out of range, trim it not to be too much out of range\n  valuePct = Math.max(valuePct, -goog.ui.Gauge.MAX_EXCEED_POSITION_POSITION);\n  valuePct = Math.min(valuePct, 1 + goog.ui.Gauge.MAX_EXCEED_POSITION_POSITION);\n\n  return valuePct;\n};\n\n\n/**\n * Convert a value to an angle based on the value range and angle span\n * @param {number} value The value.\n * @return {number} The angle where this value is located on the round\n *     axis, based on the range and angle span.\n * @private\n */\ngoog.ui.Gauge.prototype.valueToAngle_ = function(value) {\n  var valuePct = this.valueToRangePosition_(value);\n  return this.valuePositionToAngle_(valuePct);\n};\n\n\n/**\n * Convert a value-position (percent in the range) to an angle based on\n * the angle span. A value-position is a value that has been proportinally\n * adjusted to a value betwwen 0-1, proportionaly to the range.\n * @param {number} valuePct The value.\n * @return {number} The angle where this value is located on the round\n *     axis, based on the range and angle span.\n * @private\n */\ngoog.ui.Gauge.prototype.valuePositionToAngle_ = function(valuePct) {\n  var startAngle = goog.math.standardAngle((360 - this.angleSpan_) / 2 + 90);\n  return this.angleSpan_ * valuePct + startAngle;\n};\n\n\n/**\n * Draw the elements that depend on the current value (the needle and\n * the formatted value). This function is called whenever a value is changed\n * or when the entire gauge is redrawn.\n * @private\n */\ngoog.ui.Gauge.prototype.drawValue_ = function() {\n  if (!this.isInDocument()) {\n    return;\n  }\n\n  var r = this.needleRadius_;\n  var graphics = this.graphics_;\n  var theme = this.theme_;\n  var cx = this.width_ / 2;\n  var cy = this.height_ / 2;\n  var angle = this.valuePositionToAngle_(\n      /** @type {number} */ (this.needleValuePosition_));\n\n  // Compute the needle path\n  var frontRadius = Math.round(r * goog.ui.Gauge.FACTOR_NEEDLE_FRONT);\n  var backRadius = Math.round(r * goog.ui.Gauge.FACTOR_NEEDLE_BACK);\n  var frontDx = goog.math.angleDx(angle, frontRadius);\n  var frontDy = goog.math.angleDy(angle, frontRadius);\n  var backDx = goog.math.angleDx(angle, backRadius);\n  var backDy = goog.math.angleDy(angle, backRadius);\n  var angleRight = goog.math.standardAngle(angle + 90);\n  var distanceControlPointBase = r * goog.ui.Gauge.FACTOR_NEEDLE_WIDTH;\n  var controlPointMidDx =\n      goog.math.angleDx(angleRight, distanceControlPointBase);\n  var controlPointMidDy =\n      goog.math.angleDy(angleRight, distanceControlPointBase);\n\n  var path = new goog.graphics.Path();\n  path.moveTo(cx + frontDx, cy + frontDy);\n  path.curveTo(\n      cx + controlPointMidDx, cy + controlPointMidDy,\n      cx - backDx + (controlPointMidDx / 2),\n      cy - backDy + (controlPointMidDy / 2), cx - backDx, cy - backDy);\n  path.curveTo(\n      cx - backDx - (controlPointMidDx / 2),\n      cy - backDy - (controlPointMidDy / 2), cx - controlPointMidDx,\n      cy - controlPointMidDy, cx + frontDx, cy + frontDy);\n\n  // Draw the needle hinge\n  var rh = Math.round(r * goog.ui.Gauge.FACTOR_NEEDLE_HINGE);\n\n  // Clean previous needle\n  var needleGroup = this.needleGroup_;\n  if (needleGroup) {\n    needleGroup.clear();\n  } else {\n    needleGroup = this.needleGroup_ = graphics.createGroup();\n  }\n\n  // Draw current formatted value if provided.\n  if (this.formattedValue_) {\n    var font = this.valueFont_;\n    if (!font) {\n      var fontSize = Math.round(r * goog.ui.Gauge.FACTOR_VALUE_FONT_SIZE);\n      font = new goog.graphics.Font(fontSize, goog.ui.Gauge.TITLE_FONT_NAME);\n      font.bold = true;\n      this.valueFont_ = font;\n    }\n    var fill = new goog.graphics.SolidFill(theme.getValueColor());\n    var y = cy + Math.round(r * goog.ui.Gauge.FACTOR_VALUE_OFFSET);\n    graphics.drawTextOnLine(\n        this.formattedValue_, 0, y, this.width_, y, 'center', font, null, fill,\n        needleGroup);\n  }\n\n  // Draw the needle\n  var stroke = theme.getNeedleStroke();\n  var fill = theme.getNeedleFill(cx, cy, rh);\n  graphics.drawPath(path, stroke, fill, needleGroup);\n  stroke = theme.getHingeStroke();\n  fill = theme.getHingeFill(cx, cy, rh);\n  graphics.drawCircle(cx, cy, rh, stroke, fill, needleGroup);\n};\n\n\n/**\n * Redraws the entire gauge.\n * Should be called after theme colors have been changed.\n */\ngoog.ui.Gauge.prototype.redraw = function() {\n  this.draw_();\n};\n\n\n/** @override */\ngoog.ui.Gauge.prototype.enterDocument = function() {\n  goog.ui.Gauge.superClass_.enterDocument.call(this);\n\n  // set roles and states\n  var el = this.getElement();\n  goog.asserts.assert(el, 'The DOM element for the gauge cannot be null.');\n  goog.a11y.aria.setRole(el, 'progressbar');\n  goog.a11y.aria.setState(el, 'live', 'polite');\n  goog.a11y.aria.setState(el, 'valuemin', this.minValue_);\n  goog.a11y.aria.setState(el, 'valuemax', this.maxValue_);\n  goog.a11y.aria.setState(el, 'valuenow', this.value_);\n  this.draw_();\n};\n\n\n/** @override */\ngoog.ui.Gauge.prototype.exitDocument = function() {\n  goog.ui.Gauge.superClass_.exitDocument.call(this);\n  this.stopAnimation_();\n};\n\n\n/** @override */\ngoog.ui.Gauge.prototype.disposeInternal = function() {\n  this.stopAnimation_();\n  this.graphics_.dispose();\n  delete this.graphics_;\n  delete this.needleGroup_;\n  delete this.theme_;\n  delete this.rangeColors_;\n  goog.ui.Gauge.superClass_.disposeInternal.call(this);\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^@:","^?H","^:=","^9>","~$goog.ui.GaugeTheme","^@>","^G7","^>Q","~$goog.fx.easing","^<2","~$goog.graphics","^:N","^;=","^H5"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/gauge.js"],"^:1",["^9K",["~$goog.ui.Gauge","~$goog.ui.GaugeColoredRange"]],"^9<",true,"^9=",["^9>","^?H","^:E","^;=","^:N","^G7","^>Q","^H:","^H;","^@:","^@>","^H5","^<2","^:=","^H9"]],["^ ","^9A",[1579837703000],"^9B","goog.net.corsxmlhttpfactory.js","^9C",["^9D","goog/net/corsxmlhttpfactory.js"],"^9E","goog/net/corsxmlhttpfactory.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This file contain classes that add support for cross-domain XHR\n * requests (see http://www.w3.org/TR/cors/). Most modern browsers are able to\n * use a regular XMLHttpRequest for that, but IE 8 use XDomainRequest object\n * instead. This file provides an adapter from this object to a goog.net.XhrLike\n * and a factory to allow using this with a goog.net.XhrIo instance.\n *\n * IE 7 and older versions are not supported (given that they do not support\n * CORS requests).\n */\ngoog.provide('goog.net.CorsXmlHttpFactory');\ngoog.provide('goog.net.IeCorsXhrAdapter');\n\ngoog.require('goog.net.HttpStatus');\ngoog.require('goog.net.XhrLike');\ngoog.require('goog.net.XmlHttp');\ngoog.require('goog.net.XmlHttpFactory');\n\n\n\n/**\n * A factory of XML http request objects that supports cross domain requests.\n * This class should be instantiated and passed as the parameter of a\n * goog.net.XhrIo constructor to allow cross-domain requests in every browser.\n *\n * @extends {goog.net.XmlHttpFactory}\n * @constructor\n * @final\n */\ngoog.net.CorsXmlHttpFactory = function() {\n  goog.net.XmlHttpFactory.call(this);\n};\ngoog.inherits(goog.net.CorsXmlHttpFactory, goog.net.XmlHttpFactory);\n\n\n/** @override */\ngoog.net.CorsXmlHttpFactory.prototype.createInstance = function() {\n  var xhr = new XMLHttpRequest();\n  if (('withCredentials' in xhr)) {\n    return xhr;\n  } else if (typeof XDomainRequest != 'undefined') {\n    return new goog.net.IeCorsXhrAdapter();\n  } else {\n    throw new Error('Unsupported browser');\n  }\n};\n\n\n/** @override */\ngoog.net.CorsXmlHttpFactory.prototype.internalGetOptions = function() {\n  return {};\n};\n\n\n\n/**\n * An adapter around Internet Explorer's XDomainRequest object that makes it\n * look like a standard XMLHttpRequest. This can be used instead of\n * XMLHttpRequest to support CORS.\n *\n * @implements {goog.net.XhrLike}\n * @constructor\n * @struct\n * @final\n */\ngoog.net.IeCorsXhrAdapter = function() {\n  /**\n   * The underlying XDomainRequest used to make the HTTP request.\n   * @type {!XDomainRequest}\n   * @private\n   */\n  this.xdr_ = new XDomainRequest();\n\n  /**\n   * The simulated ready state.\n   * @type {number}\n   */\n  this.readyState = goog.net.XmlHttp.ReadyState.UNINITIALIZED;\n\n  /**\n   * The simulated ready state change callback function.\n   * @type {?function()|undefined}\n   */\n  this.onreadystatechange = null;\n\n  /** @override */\n  this.response = '';\n\n  /**\n   * The simulated response text parameter.\n   * @type {string}\n   */\n  this.responseText = '';\n\n  /**\n   * This implementation only supports text response.\n   * @type {string}\n   * @override\n   */\n  this.responseType = '';\n\n  /**\n   * The simulated status code\n   * @type {number}\n   */\n  this.status = -1;\n\n  /** @override */\n  this.responseXML = null;\n\n  /** @override */\n  this.statusText = '';\n\n  this.xdr_.onload = goog.bind(this.handleLoad_, this);\n  this.xdr_.onerror = goog.bind(this.handleError_, this);\n  this.xdr_.onprogress = goog.bind(this.handleProgress_, this);\n  this.xdr_.ontimeout = goog.bind(this.handleTimeout_, this);\n};\n\n\n/**\n * Opens a connection to the provided URL.\n * @param {string} method The HTTP method to use. Valid methods include GET and\n *     POST.\n * @param {string} url The URL to contact. The authority of this URL must match\n *     the authority of the current page's URL (e.g. http or https).\n * @param {?boolean=} opt_async Whether the request is asynchronous, defaulting\n *     to true. XDomainRequest does not support syncronous requests, so setting\n *     it to false will actually raise an exception.\n * @override\n */\ngoog.net.IeCorsXhrAdapter.prototype.open = function(method, url, opt_async) {\n  if (opt_async != null && (!opt_async)) {\n    throw new Error('Only async requests are supported.');\n  }\n  this.xdr_.open(method, url);\n};\n\n\n/**\n * Sends the request to the remote server. Before calling this function, always\n * call {@link open}.\n * @param {(ArrayBuffer|ArrayBufferView|Blob|Document|FormData|null|string)=}\n *     opt_content The content to send as POSTDATA, if any. Only string data is\n *     supported by this implementation.\n * @override\n */\ngoog.net.IeCorsXhrAdapter.prototype.send = function(opt_content) {\n  if (opt_content) {\n    if (typeof opt_content == 'string') {\n      this.xdr_.send(opt_content);\n    } else {\n      throw new Error('Only string data is supported');\n    }\n  } else {\n    this.xdr_.send();\n  }\n};\n\n\n/**\n * @override\n */\ngoog.net.IeCorsXhrAdapter.prototype.abort = function() {\n  this.xdr_.abort();\n};\n\n\n/**\n * Sets a request header to send to the remote server. Because this\n * implementation does not support request headers, this function does nothing.\n * @param {string} key The name of the HTTP header to set. Ignored.\n * @param {string} value The value to set for the HTTP header. Ignored.\n * @override\n */\ngoog.net.IeCorsXhrAdapter.prototype.setRequestHeader = function(key, value) {\n  // Unsupported; ignore the header.\n};\n\n\n/**\n * Returns the value of the response header identified by key. This\n * implementation only supports the 'content-type' header.\n * @param {string} key The request header to fetch. If this parameter is set to\n *     'content-type' (case-insensitive), this function returns the value of\n *     the 'content-type' request header. If this parameter is set to any other\n *     value, this function always returns an empty string.\n * @return {string} The value of the response header, or an empty string if key\n *     is not 'content-type' (case-insensitive).\n * @override\n */\ngoog.net.IeCorsXhrAdapter.prototype.getResponseHeader = function(key) {\n  if (key.toLowerCase() == 'content-type') {\n    return this.xdr_.contentType;\n  }\n  return '';\n};\n\n\n/**\n * Handles a request that has fully loaded successfully.\n * @private\n */\ngoog.net.IeCorsXhrAdapter.prototype.handleLoad_ = function() {\n  // IE only calls onload if the status is 200, so the status code must be OK.\n  this.status = goog.net.HttpStatus.OK;\n  this.response = this.responseText = this.xdr_.responseText;\n  this.setReadyState_(goog.net.XmlHttp.ReadyState.COMPLETE);\n};\n\n\n/**\n * Handles a request that has failed to load.\n * @private\n */\ngoog.net.IeCorsXhrAdapter.prototype.handleError_ = function() {\n  // IE doesn't tell us what the status code actually is (other than the fact\n  // that it is not 200), so simulate an INTERNAL_SERVER_ERROR.\n  this.status = goog.net.HttpStatus.INTERNAL_SERVER_ERROR;\n  this.response = this.responseText = '';\n  this.setReadyState_(goog.net.XmlHttp.ReadyState.COMPLETE);\n};\n\n\n/**\n * Handles a request that timed out.\n * @private\n */\ngoog.net.IeCorsXhrAdapter.prototype.handleTimeout_ = function() {\n  this.handleError_();\n};\n\n\n/**\n * Handles a request that is in the process of loading.\n * @private\n */\ngoog.net.IeCorsXhrAdapter.prototype.handleProgress_ = function() {\n  // IE only calls onprogress if the status is 200, so the status code must be\n  // OK.\n  this.status = goog.net.HttpStatus.OK;\n  this.setReadyState_(goog.net.XmlHttp.ReadyState.LOADING);\n};\n\n\n/**\n * Sets this XHR's ready state and fires the onreadystatechange listener (if one\n * is set).\n * @param {number} readyState The new ready state.\n * @private\n */\ngoog.net.IeCorsXhrAdapter.prototype.setReadyState_ = function(readyState) {\n  this.readyState = readyState;\n  if (this.onreadystatechange) {\n    this.onreadystatechange();\n  }\n};\n\n\n/**\n * Returns the response headers from the server. This implemntation only returns\n * the 'content-type' header.\n * @return {string} The headers returned from the server.\n * @override\n */\ngoog.net.IeCorsXhrAdapter.prototype.getAllResponseHeaders = function() {\n  return 'content-type: ' + this.xdr_.contentType;\n};\n","^9I",1579837703000,"^9J",["^9K",["^=Z","^9>","~$goog.net.XhrLike","~$goog.net.XmlHttpFactory","^>1"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/corsxmlhttpfactory.js"],"^:1",["^9K",["~$goog.net.IeCorsXhrAdapter","~$goog.net.CorsXmlHttpFactory"]],"^9<",true,"^9=",["^9>","^=Z","^H>","^>1","^H?"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.checkboxmenuitem.js","^9C",["^9D","goog/ui/checkboxmenuitem.js"],"^9E","goog/ui/checkboxmenuitem.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A menu item class that supports checkbox semantics.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.CheckBoxMenuItem');\n\ngoog.require('goog.ui.MenuItem');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Class representing a checkbox menu item.  This is just a convenience class\n * that extends {@link goog.ui.MenuItem} by making it checkable.\n *\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to\n *     display as the content of the item (use to add icons or styling to\n *     menus).\n * @param {*=} opt_model Data/model associated with the menu item.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper used for\n *     document interactions.\n * @constructor\n * @extends {goog.ui.MenuItem}\n */\ngoog.ui.CheckBoxMenuItem = function(content, opt_model, opt_domHelper) {\n  goog.ui.MenuItem.call(this, content, opt_model, opt_domHelper);\n  this.setCheckable(true);\n};\ngoog.inherits(goog.ui.CheckBoxMenuItem, goog.ui.MenuItem);\n\n\n// Register a decorator factory function for goog.ui.CheckBoxMenuItems.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.getCssName('goog-checkbox-menuitem'), function() {\n      // CheckBoxMenuItem defaults to using MenuItemRenderer.\n      return new goog.ui.CheckBoxMenuItem(null);\n    });\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:>","^:?"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/checkboxmenuitem.js"],"^:1",["^9K",["~$goog.ui.CheckBoxMenuItem"]],"^9<",true,"^9=",["^9>","^:?","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.tweak.registry.js","^9C",["^9D","goog/tweak/registry.js"],"^9E","goog/tweak/registry.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition for goog.tweak.Registry.\n * Most clients should not use this class directly, but instead use the API\n * defined in tweak.js. One possible use case for directly using TweakRegistry\n * is to register tweaks that are not known at compile time.\n *\n * @author agrieve@google.com (Andrew Grieve)\n */\n\ngoog.provide('goog.tweak.Registry');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.log');\ngoog.require('goog.string');\ngoog.require('goog.tweak.BasePrimitiveSetting');\ngoog.require('goog.tweak.BaseSetting');\ngoog.require('goog.tweak.BooleanSetting');\ngoog.require('goog.tweak.NumericSetting');\ngoog.require('goog.tweak.StringSetting');\ngoog.require('goog.uri.utils');\n\n\n\n/**\n * Singleton that manages all tweaks. This should be instantiated only from\n * goog.tweak.getRegistry().\n * @param {string} queryParams Value of window.location.search.\n * @param {!Object<string|number|boolean>} compilerOverrides Default value\n *     overrides set by the compiler.\n * @constructor\n * @final\n */\ngoog.tweak.Registry = function(queryParams, compilerOverrides) {\n  /**\n   * A map of entry id -> entry object\n   * @type {!Object<!goog.tweak.BaseEntry>}\n   * @private\n   */\n  this.entryMap_ = {};\n\n  /**\n   * The map of query params to use when initializing entry settings.\n   * @type {!Object<string>}\n   * @private\n   */\n  this.parsedQueryParams_ = goog.tweak.Registry.parseQueryParams(queryParams);\n\n  /**\n   * List of callbacks to call when a new entry is registered.\n   * @type {!Array<!Function>}\n   * @private\n   */\n  this.onRegisterListeners_ = [];\n\n  /**\n   * A map of entry ID -> default value override for overrides set by the\n   * compiler.\n   * @type {!Object<string|number|boolean>}\n   * @private\n   */\n  this.compilerDefaultValueOverrides_ = compilerOverrides;\n\n  /**\n   * A map of entry ID -> default value override for overrides set by\n   * goog.tweak.overrideDefaultValue().\n   * @type {!Object<string|number|boolean>}\n   * @private\n   */\n  this.defaultValueOverrides_ = {};\n};\n\n\n/**\n * The logger for this class.\n * @type {goog.log.Logger}\n * @private\n */\ngoog.tweak.Registry.prototype.logger_ =\n    goog.log.getLogger('goog.tweak.Registry');\n\n\n/**\n * Simple parser for query params. Makes all keys lower-case.\n * @param {string} queryParams The part of the url between the ? and the #.\n * @return {!Object<string>} map of key->value.\n */\ngoog.tweak.Registry.parseQueryParams = function(queryParams) {\n  // Strip off the leading ? and split on &.\n  var parts = queryParams.substr(1).split('&');\n  var ret = {};\n\n  for (var i = 0, il = parts.length; i < il; ++i) {\n    var entry = parts[i].split('=');\n    if (entry[0]) {\n      ret[goog.string.urlDecode(entry[0]).toLowerCase()] =\n          goog.string.urlDecode(entry[1] || '');\n    }\n  }\n  return ret;\n};\n\n\n/**\n * Registers the given tweak setting/action.\n * @param {goog.tweak.BaseEntry} entry The entry.\n */\ngoog.tweak.Registry.prototype.register = function(entry) {\n  var id = entry.getId();\n  var oldBaseEntry = this.entryMap_[id];\n  if (oldBaseEntry) {\n    if (oldBaseEntry == entry) {\n      goog.log.warning(this.logger_, 'Tweak entry registered twice: ' + id);\n      return;\n    }\n    goog.asserts.fail(\n        'Tweak entry registered twice and with different types: ' + id);\n  }\n\n  // Check for a default value override, either from compiler flags or from a\n  // call to overrideDefaultValue().\n  var defaultValueOverride = (id in this.compilerDefaultValueOverrides_) ?\n      this.compilerDefaultValueOverrides_[id] :\n      this.defaultValueOverrides_[id];\n  if (defaultValueOverride !== undefined) {\n    goog.asserts.assertInstanceof(\n        entry, goog.tweak.BasePrimitiveSetting,\n        'Cannot set the default value of non-primitive setting %s',\n        entry.label);\n    entry.setDefaultValue(defaultValueOverride);\n  }\n\n  // Set its value from the query params.\n  if (entry instanceof goog.tweak.BaseSetting) {\n    if (entry.getParamName()) {\n      entry.setInitialQueryParamValue(\n          this.parsedQueryParams_[entry.getParamName()]);\n    }\n  }\n\n  this.entryMap_[id] = entry;\n  // Call all listeners.\n  for (var i = 0, callback; callback = this.onRegisterListeners_[i]; ++i) {\n    callback(entry);\n  }\n};\n\n\n/**\n * Adds a callback to be called whenever a new tweak is added.\n * @param {!Function} func The callback.\n */\ngoog.tweak.Registry.prototype.addOnRegisterListener = function(func) {\n  this.onRegisterListeners_.push(func);\n};\n\n\n/**\n * @param {string} id The unique string that identifies this entry.\n * @return {boolean} Whether a tweak with the given ID is registered.\n */\ngoog.tweak.Registry.prototype.hasEntry = function(id) {\n  return id in this.entryMap_;\n};\n\n\n/**\n * Returns the BaseEntry with the given ID. Asserts if it does not exists.\n * @param {string} id The unique string that identifies this entry.\n * @return {!goog.tweak.BaseEntry} The entry.\n */\ngoog.tweak.Registry.prototype.getEntry = function(id) {\n  var ret = this.entryMap_[id];\n  goog.asserts.assert(ret, 'Tweak not registered: %s', id);\n  return ret;\n};\n\n\n/**\n * Returns the boolean setting with the given ID. Asserts if the ID does not\n * refer to a registered entry or if it refers to one of the wrong type.\n * @param {string} id The unique string that identifies this entry.\n * @return {!goog.tweak.BooleanSetting} The entry.\n */\ngoog.tweak.Registry.prototype.getBooleanSetting = function(id) {\n  var entry = this.getEntry(id);\n  goog.asserts.assertInstanceof(\n      entry, goog.tweak.BooleanSetting,\n      'getBooleanSetting called on wrong type of BaseSetting');\n  return /** @type {!goog.tweak.BooleanSetting} */ (entry);\n};\n\n\n/**\n * Returns the string setting with the given ID. Asserts if the ID does not\n * refer to a registered entry or if it refers to one of the wrong type.\n * @param {string} id The unique string that identifies this entry.\n * @return {!goog.tweak.StringSetting} The entry.\n */\ngoog.tweak.Registry.prototype.getStringSetting = function(id) {\n  var entry = this.getEntry(id);\n  goog.asserts.assertInstanceof(\n      entry, goog.tweak.StringSetting,\n      'getStringSetting called on wrong type of BaseSetting');\n  return /** @type {!goog.tweak.StringSetting} */ (entry);\n};\n\n\n/**\n * Returns the numeric setting with the given ID. Asserts if the ID does not\n * refer to a registered entry or if it refers to one of the wrong type.\n * @param {string} id The unique string that identifies this entry.\n * @return {!goog.tweak.NumericSetting} The entry.\n */\ngoog.tweak.Registry.prototype.getNumericSetting = function(id) {\n  var entry = this.getEntry(id);\n  goog.asserts.assertInstanceof(\n      entry, goog.tweak.NumericSetting,\n      'getNumericSetting called on wrong type of BaseSetting');\n  return /** @type {!goog.tweak.NumericSetting} */ (entry);\n};\n\n\n/**\n * Creates and returns an array of all BaseSetting objects with an associted\n * query parameter.\n * @param {boolean} excludeChildEntries Exclude BooleanInGroupSettings.\n * @param {boolean} excludeNonSettings Exclude entries that are not subclasses\n *     of BaseSetting.\n * @return {!Array<!goog.tweak.BaseSetting>} The settings.\n */\ngoog.tweak.Registry.prototype.extractEntries = function(\n    excludeChildEntries, excludeNonSettings) {\n  var entries = [];\n  for (var id in this.entryMap_) {\n    var entry = this.entryMap_[id];\n    if (entry instanceof goog.tweak.BaseSetting) {\n      if (excludeChildEntries && !entry.getParamName()) {\n        continue;\n      }\n    } else if (excludeNonSettings) {\n      continue;\n    }\n    entries.push(entry);\n  }\n  return entries;\n};\n\n\n/**\n * Returns the query part of the URL that will apply all set tweaks.\n * @param {string=} opt_existingSearchStr The part of the url between the ? and\n *     the #. Uses window.location.search if not given.\n * @return {string} The query string.\n */\ngoog.tweak.Registry.prototype.makeUrlQuery = function(opt_existingSearchStr) {\n  var existingParams = opt_existingSearchStr == undefined ?\n      window.location.search :\n      opt_existingSearchStr;\n\n  var sortedEntries = this.extractEntries(\n      true /* excludeChildEntries */, true /* excludeNonSettings */);\n  // Sort the params so that the urlQuery has stable ordering.\n  sortedEntries.sort(function(a, b) {\n    return goog.array.defaultCompare(a.getParamName(), b.getParamName());\n  });\n\n  // Add all values that are not set to their defaults.\n  var keysAndValues = [];\n  for (var i = 0, entry; entry = sortedEntries[i]; ++i) {\n    var encodedValue = entry.getNewValueEncoded();\n    if (encodedValue != null) {\n      keysAndValues.push(entry.getParamName(), encodedValue);\n    }\n    // Strip all tweak query params from the existing query string. This will\n    // make the final query string contain only the tweak settings that are set\n    // to their non-default values and also maintain non-tweak related query\n    // parameters.\n    existingParams = goog.uri.utils.removeParam(\n        existingParams,\n        encodeURIComponent(/** @type {string} */ (entry.getParamName())));\n  }\n\n  var tweakParams = goog.uri.utils.buildQueryData(keysAndValues);\n  // Decode spaces and commas in order to make the URL more readable.\n  tweakParams = tweakParams.replace(/%2C/g, ',').replace(/%20/g, '+');\n  return !tweakParams ? existingParams : existingParams ?\n                        existingParams + '&' + tweakParams :\n                        '?' + tweakParams;\n};\n\n\n/**\n * Sets a default value to use for the given tweak instead of the one passed\n * to the register* function. This function must be called before the tweak is\n * registered.\n * @param {string} id The unique string that identifies the entry.\n * @param {string|number|boolean} value The replacement value to be used as the\n *     default value for the setting.\n */\ngoog.tweak.Registry.prototype.overrideDefaultValue = function(id, value) {\n  goog.asserts.assert(\n      !this.hasEntry(id),\n      'goog.tweak.overrideDefaultValue must be called before the tweak is ' +\n          'registered. Tweak: %s',\n      id);\n  this.defaultValueOverrides_[id] = value;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.tweak.BaseSetting","^;O","^9L","^@1","^9>","^@2","^;Q","^@4","^;9","~$goog.tweak.BasePrimitiveSetting"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/tweak/registry.js"],"^:1",["^9K",["^@7"]],"^9<",true,"^9=",["^9>","^;9","^:E","^;Q","^9L","^HD","^HC","^@4","^@2","^@1","^;O"]],["^ ","^9A",[1579837703000],"^9B","goog.locale.timezonelist.js","^9C",["^9D","goog/locale/timezonelist.js"],"^9E","goog/locale/timezonelist.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions for listing timezone names.\n * @suppress {deprecated} Use goog.i18n instead.\n */\n\ngoog.provide('goog.locale.TimeZoneList');\ngoog.provide('goog.locale.getTimeZoneAllLongNames');\ngoog.provide('goog.locale.getTimeZoneSelectedLongNames');\ngoog.provide('goog.locale.getTimeZoneSelectedShortNames');\n\ngoog.require('goog.locale');\n\n\n/**\n * Returns the displayable list of short timezone names paired with its id for\n * the current locale, selected based on the region or language provided.\n *\n * This method depends on `goog.locale.TimeZone*__<locale>` available\n * from http://go/js_locale_data. Users of this method must add a dependency on\n * this.\n *\n * @param {string=} opt_regionOrLang If region tag is provided, timezone ids\n *    specific this region are considered. If language is provided, all regions\n *    for which this language is defacto official is considered. If\n *    this parameter is not speficied, current locale is used to\n *    extract this information.\n *\n * @return {!Array<Object>} Localized and relevant list of timezone names\n *    and ids.\n */\ngoog.locale.getTimeZoneSelectedShortNames = function(opt_regionOrLang) {\n  return goog.locale.getTimeZoneNameList_(\n      'TimeZoneSelectedShortNames', opt_regionOrLang);\n};\n\n\n/**\n * Returns the displayable list of long timezone names paired with its id for\n * the current locale, selected based on the region or language provided.\n *\n * This method depends on `goog.locale.TimeZone*__<locale>` available\n * from http://go/js_locale_data. Users of this method must add a dependency on\n * this.\n *\n * @param {string=} opt_regionOrLang If region tag is provided, timezone ids\n *    specific this region are considered. If language is provided, all regions\n *    for which this language is defacto official is considered. If\n *    this parameter is not speficied, current locale is used to\n *    extract this information.\n *\n * @return {!Array<Object>} Localized and relevant list of timezone names\n *    and ids.\n */\ngoog.locale.getTimeZoneSelectedLongNames = function(opt_regionOrLang) {\n  return goog.locale.getTimeZoneNameList_(\n      'TimeZoneSelectedLongNames', opt_regionOrLang);\n};\n\n\n/**\n * Returns the displayable list of long timezone names paired with its id for\n * the current locale.\n *\n * This method depends on `goog.locale.TimeZoneAllLongNames__<locale>` available\n * from http://go/js_locale_data. Users of this method must add a dependency on\n * this.\n *\n * @return {Array<Object>} localized and relevant list of timezone names\n *    and ids.\n */\ngoog.locale.getTimeZoneAllLongNames = function() {\n  var locale = goog.locale.getLocale();\n  return /** @type {Array<Object>} */ (\n      goog.locale.getResource('TimeZoneAllLongNames', locale));\n};\n\n\n/**\n * Returns the displayable list of timezone names paired with its id for\n * the current locale, selected based on the region or language provided.\n *\n * This method depends on `goog.locale.TimeZone*__<locale>` available\n * from http://go/js_locale_data. Users of this method must add a dependency on\n * this.\n *\n * @param {string} nameType Resource name to be loaded to get the names.\n *\n * @param {string=} opt_resource If resource is region tag, timezone ids\n *    specific this region are considered. If it is language, all regions\n *    for which this language is defacto official is considered. If it is\n *    undefined, current locale is used to extract this information.\n *\n * @return {!Array<Object>} Localized and relevant list of timezone names\n *    and ids.\n * @private\n */\ngoog.locale.getTimeZoneNameList_ = function(nameType, opt_resource) {\n  var locale = goog.locale.getLocale();\n\n  if (!opt_resource) {\n    opt_resource = goog.locale.getRegionSubTag(locale);\n  }\n  // if there is no region subtag, use the language itself as the resource\n  if (!opt_resource) {\n    opt_resource = locale;\n  }\n\n  var names = goog.locale.getResource(nameType, locale);\n  var ids = goog.locale.getResource('TimeZoneSelectedIds', opt_resource);\n  var len = ids.length;\n  var result = [];\n\n  for (var i = 0; i < len; i++) {\n    var id = ids[i];\n    result.push({'id': id, 'name': names[id]});\n  }\n  return result;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.locale"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/locale/timezonelist.js"],"^:1",["^9K",["~$goog.locale.TimeZoneList","~$goog.locale.getTimeZoneSelectedShortNames","~$goog.locale.getTimeZoneSelectedLongNames","~$goog.locale.getTimeZoneAllLongNames"]],"^9<",true,"^9=",["^9>","^HE"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.tab.js","^9C",["^9D","goog/ui/tab.js"],"^9E","goog/ui/tab.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A tab control, designed to be used in {@link goog.ui.TabBar}s.\n *\n * @author attila@google.com (Attila Bodis)\n * @see ../demos/tabbar.html\n */\n\ngoog.provide('goog.ui.Tab');\n\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Control');\ngoog.require('goog.ui.TabRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Tab control, designed to be hosted in a {@link goog.ui.TabBar}.  The tab's\n * DOM may be different based on the configuration of the containing tab bar,\n * so tabs should only be rendered or decorated as children of a tab bar.\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to\n *     display as the tab's caption (if any).\n * @param {goog.ui.TabRenderer=} opt_renderer Optional renderer used to render\n *     or decorate the tab.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.Control}\n */\ngoog.ui.Tab = function(content, opt_renderer, opt_domHelper) {\n  goog.ui.Control.call(\n      this, content, opt_renderer || goog.ui.TabRenderer.getInstance(),\n      opt_domHelper);\n\n  // Tabs support the SELECTED state.\n  this.setSupportedState(goog.ui.Component.State.SELECTED, true);\n\n  // Tabs must dispatch state transition events for the DISABLED and SELECTED\n  // states in order for the tab bar to function properly.\n  this.setDispatchTransitionEvents(\n      goog.ui.Component.State.DISABLED | goog.ui.Component.State.SELECTED,\n      true);\n};\ngoog.inherits(goog.ui.Tab, goog.ui.Control);\ngoog.tagUnsealableClass(goog.ui.Tab);\n\n\n/**\n * Tooltip text for the tab, displayed on hover (if any).\n * @type {string|undefined}\n * @private\n */\ngoog.ui.Tab.prototype.tooltip_;\n\n\n/**\n * @return {string|undefined} Tab tooltip text (if any).\n */\ngoog.ui.Tab.prototype.getTooltip = function() {\n  return this.tooltip_;\n};\n\n\n/**\n * Sets the tab tooltip text.  If the tab has already been rendered, updates\n * its tooltip.\n * @param {string} tooltip New tooltip text.\n */\ngoog.ui.Tab.prototype.setTooltip = function(tooltip) {\n  this.getRenderer().setTooltip(this.getElement(), tooltip);\n  this.setTooltipInternal(tooltip);\n};\n\n\n/**\n * Sets the tab tooltip text.  Considered protected; to be called only by the\n * renderer during element decoration.\n * @param {string} tooltip New tooltip text.\n * @protected\n */\ngoog.ui.Tab.prototype.setTooltipInternal = function(tooltip) {\n  this.tooltip_ = tooltip;\n};\n\n\n// Register a decorator factory function for goog.ui.Tabs.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.TabRenderer.CSS_CLASS,\n    function() { return new goog.ui.Tab(null); });\n","^9I",1579837703000,"^9J",["^9K",["~$goog.ui.TabRenderer","^:=","^9>","^:>","^=T"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/tab.js"],"^:1",["^9K",["~$goog.ui.Tab"]],"^9<",true,"^9=",["^9>","^:=","^=T","^HJ","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.net.mockiframeio.js","^9C",["^9D","goog/net/mockiframeio.js"],"^9E","goog/net/mockiframeio.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Mock of IframeIo for unit testing.\n */\n\ngoog.provide('goog.net.MockIFrameIo');\ngoog.forwardDeclare('goog.testing.TestQueue');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.net.ErrorCode');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.IframeIo');\n\n\n\n/**\n * Mock implementation of goog.net.IframeIo. This doesn't provide a mock\n * implementation for all cases, but it's not too hard to add them as needed.\n * @param {goog.testing.TestQueue} testQueue Test queue for inserting test\n *     events.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n * @deprecated Use goog.testing.net.MockIFrameIo instead.\n */\ngoog.net.MockIFrameIo = function(testQueue) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * Queue of events write to\n   * @type {goog.testing.TestQueue}\n   * @private\n   */\n  this.testQueue_ = testQueue;\n\n};\ngoog.inherits(goog.net.MockIFrameIo, goog.events.EventTarget);\n\n\n/**\n * Whether MockIFrameIo is active.\n * @type {boolean}\n * @private\n */\ngoog.net.MockIFrameIo.prototype.active_ = false;\n\n\n/**\n * Last content.\n * @type {string}\n * @private\n */\ngoog.net.MockIFrameIo.prototype.lastContent_ = '';\n\n\n/**\n * Last error code.\n * @type {goog.net.ErrorCode}\n * @private\n */\ngoog.net.MockIFrameIo.prototype.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR;\n\n\n/**\n * Last error message.\n * @type {string}\n * @private\n */\ngoog.net.MockIFrameIo.prototype.lastError_ = '';\n\n\n/**\n * Last custom error.\n * @type {?Object}\n * @private\n */\ngoog.net.MockIFrameIo.prototype.lastCustomError_ = null;\n\n\n/**\n * Last URI.\n * @type {?goog.Uri}\n * @private\n */\ngoog.net.MockIFrameIo.prototype.lastUri_ = null;\n\n\n/** @private {Function} */\ngoog.net.MockIFrameIo.prototype.errorChecker_;\n\n\n/** @private {boolean} */\ngoog.net.MockIFrameIo.prototype.success_;\n\n\n/** @private {boolean} */\ngoog.net.MockIFrameIo.prototype.complete_;\n\n\n/**\n * Simulates the iframe send.\n *\n * @param {goog.Uri|string} uri Uri of the request.\n * @param {string=} opt_method Default is GET, POST uses a form to submit the\n *     request.\n * @param {boolean=} opt_noCache Append a timestamp to the request to avoid\n *     caching.\n * @param {Object|goog.structs.Map=} opt_data Map of key-value pairs.\n */\ngoog.net.MockIFrameIo.prototype.send = function(\n    uri, opt_method, opt_noCache, opt_data) {\n  if (this.active_) {\n    throw new Error('[goog.net.IframeIo] Unable to send, already active.');\n  }\n\n  this.testQueue_.enqueue(['s', uri, opt_method, opt_noCache, opt_data]);\n  this.complete_ = false;\n  this.active_ = true;\n};\n\n\n/**\n * Simulates the iframe send from a form.\n * @param {Element} form Form element used to send the request to the server.\n * @param {string=} opt_uri Uri to set for the destination of the request, by\n *     default the uri will come from the form.\n * @param {boolean=} opt_noCache Append a timestamp to the request to avoid\n *     caching.\n */\ngoog.net.MockIFrameIo.prototype.sendFromForm = function(\n    form, opt_uri, opt_noCache) {\n  if (this.active_) {\n    throw new Error('[goog.net.IframeIo] Unable to send, already active.');\n  }\n\n  this.testQueue_.enqueue(['s', form, opt_uri, opt_noCache]);\n  this.complete_ = false;\n  this.active_ = true;\n};\n\n\n/**\n * Simulates aborting the current Iframe request.\n * @param {goog.net.ErrorCode=} opt_failureCode Optional error code to use -\n *     defaults to ABORT.\n */\ngoog.net.MockIFrameIo.prototype.abort = function(opt_failureCode) {\n  if (this.active_) {\n    this.testQueue_.enqueue(['a', opt_failureCode]);\n    this.complete_ = false;\n    this.active_ = false;\n    this.success_ = false;\n    this.lastErrorCode_ = opt_failureCode || goog.net.ErrorCode.ABORT;\n    this.dispatchEvent(goog.net.EventType.ABORT);\n    this.simulateReady();\n  }\n};\n\n\n/**\n * Simulates receive of incremental data.\n * @param {Object} data Data.\n */\ngoog.net.MockIFrameIo.prototype.simulateIncrementalData = function(data) {\n  this.dispatchEvent(new goog.net.IframeIo.IncrementalDataEvent(data));\n};\n\n\n/**\n * Simulates the iframe is done.\n * @param {goog.net.ErrorCode} errorCode The error code for any error that\n *     should be simulated.\n */\ngoog.net.MockIFrameIo.prototype.simulateDone = function(errorCode) {\n  if (errorCode) {\n    this.success_ = false;\n    this.lastErrorCode_ = goog.net.ErrorCode.HTTP_ERROR;\n    this.lastError_ = this.getLastError();\n    this.dispatchEvent(goog.net.EventType.ERROR);\n  } else {\n    this.success_ = true;\n    this.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR;\n    this.dispatchEvent(goog.net.EventType.SUCCESS);\n  }\n  this.complete_ = true;\n  this.dispatchEvent(goog.net.EventType.COMPLETE);\n};\n\n\n/**\n * Simulates the IFrame is ready for the next request.\n */\ngoog.net.MockIFrameIo.prototype.simulateReady = function() {\n  this.dispatchEvent(goog.net.EventType.READY);\n};\n\n\n/**\n * @return {boolean} True if transfer is complete.\n */\ngoog.net.MockIFrameIo.prototype.isComplete = function() {\n  return this.complete_;\n};\n\n\n/**\n * @return {boolean} True if transfer was successful.\n */\ngoog.net.MockIFrameIo.prototype.isSuccess = function() {\n  return this.success_;\n};\n\n\n/**\n * @return {boolean} True if a transfer is in progress.\n */\ngoog.net.MockIFrameIo.prototype.isActive = function() {\n  return this.active_;\n};\n\n\n/**\n * Returns the last response text (i.e. the text content of the iframe).\n * Assumes plain text!\n * @return {string} Result from the server.\n */\ngoog.net.MockIFrameIo.prototype.getResponseText = function() {\n  return this.lastContent_;\n};\n\n\n/**\n * Parses the content as JSON. This is a safe parse and may throw an error\n * if the response is malformed.\n * @return {Object} The parsed content.\n */\ngoog.net.MockIFrameIo.prototype.getResponseJson = function() {\n  return /** @type {!Object} */ (JSON.parse(this.lastContent_));\n};\n\n\n/**\n * Get the uri of the last request.\n * @return {goog.Uri} Uri of last request.\n */\ngoog.net.MockIFrameIo.prototype.getLastUri = function() {\n  return this.lastUri_;\n};\n\n\n/**\n * Gets the last error code.\n * @return {goog.net.ErrorCode} Last error code.\n */\ngoog.net.MockIFrameIo.prototype.getLastErrorCode = function() {\n  return this.lastErrorCode_;\n};\n\n\n/**\n * Gets the last error message.\n * @return {string} Last error message.\n */\ngoog.net.MockIFrameIo.prototype.getLastError = function() {\n  return goog.net.ErrorCode.getDebugMessage(this.lastErrorCode_);\n};\n\n\n/**\n * Gets the last custom error.\n * @return {Object} Last custom error.\n */\ngoog.net.MockIFrameIo.prototype.getLastCustomError = function() {\n  return this.lastCustomError_;\n};\n\n\n/**\n * Sets the callback function used to check if a loaded IFrame is in an error\n * state.\n * @param {Function} fn Callback that expects a document object as it's single\n *     argument.\n */\ngoog.net.MockIFrameIo.prototype.setErrorChecker = function(fn) {\n  this.errorChecker_ = fn;\n};\n\n\n/**\n * Gets the callback function used to check if a loaded IFrame is in an error\n * state.\n * @return {Function} A callback that expects a document object as it's single\n *     argument.\n */\ngoog.net.MockIFrameIo.prototype.getErrorChecker = function() {\n  return this.errorChecker_;\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.net.IframeIo","^9>","^:L","^>0","^>3"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/mockiframeio.js"],"^:1",["^9K",["~$goog.net.MockIFrameIo"]],"^9<",true,"^9=",["^9>","^:L","^>3","^>0","^HL"]],["^ ","^9A",[1579837703000],"^9B","goog.debug.debug.js","^9C",["^9D","goog/debug/debug.js"],"^9E","goog/debug/debug.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Logging and debugging utilities.\n *\n * @see ../demos/debug.html\n */\n\ngoog.provide('goog.debug');\n\ngoog.require('goog.array');\ngoog.require('goog.debug.errorcontext');\ngoog.require('goog.userAgent');\n\n\n/** @define {boolean} Whether logging should be enabled. */\ngoog.debug.LOGGING_ENABLED =\n    goog.define('goog.debug.LOGGING_ENABLED', goog.DEBUG);\n\n\n/** @define {boolean} Whether to force \"sloppy\" stack building. */\ngoog.debug.FORCE_SLOPPY_STACKS =\n    goog.define('goog.debug.FORCE_SLOPPY_STACKS', false);\n\n\n/**\n * Catches onerror events fired by windows and similar objects.\n * @param {function(Object)} logFunc The function to call with the error\n *    information.\n * @param {boolean=} opt_cancel Whether to stop the error from reaching the\n *    browser.\n * @param {Object=} opt_target Object that fires onerror events.\n * @suppress {strictMissingProperties} onerror is not defined as a property\n *    on Object.\n */\ngoog.debug.catchErrors = function(logFunc, opt_cancel, opt_target) {\n  var target = opt_target || goog.global;\n  var oldErrorHandler = target.onerror;\n  var retVal = !!opt_cancel;\n\n  // Chrome interprets onerror return value backwards (http://crbug.com/92062)\n  // until it was fixed in webkit revision r94061 (Webkit 535.3). This\n  // workaround still needs to be skipped in Safari after the webkit change\n  // gets pushed out in Safari.\n  // See https://bugs.webkit.org/show_bug.cgi?id=67119\n  if (goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher('535.3')) {\n    retVal = !retVal;\n  }\n\n  /**\n   * New onerror handler for this target. This onerror handler follows the spec\n   * according to\n   * http://www.whatwg.org/specs/web-apps/current-work/#runtime-script-errors\n   * The spec was changed in August 2013 to support receiving column information\n   * and an error object for all scripts on the same origin or cross origin\n   * scripts with the proper headers. See\n   * https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror\n   *\n   * @param {string} message The error message. For cross-origin errors, this\n   *     will be scrubbed to just \"Script error.\". For new browsers that have\n   *     updated to follow the latest spec, errors that come from origins that\n   *     have proper cross origin headers will not be scrubbed.\n   * @param {string} url The URL of the script that caused the error. The URL\n   *     will be scrubbed to \"\" for cross origin scripts unless the script has\n   *     proper cross origin headers and the browser has updated to the latest\n   *     spec.\n   * @param {number} line The line number in the script that the error\n   *     occurred on.\n   * @param {number=} opt_col The optional column number that the error\n   *     occurred on. Only browsers that have updated to the latest spec will\n   *     include this.\n   * @param {Error=} opt_error The optional actual error object for this\n   *     error that should include the stack. Only browsers that have updated\n   *     to the latest spec will inlude this parameter.\n   * @return {boolean} Whether to prevent the error from reaching the browser.\n   */\n  target.onerror = function(message, url, line, opt_col, opt_error) {\n    if (oldErrorHandler) {\n      oldErrorHandler(message, url, line, opt_col, opt_error);\n    }\n    logFunc({\n      message: message,\n      fileName: url,\n      line: line,\n      lineNumber: line,\n      col: opt_col,\n      error: opt_error\n    });\n    return retVal;\n  };\n};\n\n\n/**\n * Creates a string representing an object and all its properties.\n * @param {Object|null|undefined} obj Object to expose.\n * @param {boolean=} opt_showFn Show the functions as well as the properties,\n *     default is false.\n * @return {string} The string representation of `obj`.\n */\ngoog.debug.expose = function(obj, opt_showFn) {\n  if (typeof obj == 'undefined') {\n    return 'undefined';\n  }\n  if (obj == null) {\n    return 'NULL';\n  }\n  var str = [];\n\n  for (var x in obj) {\n    if (!opt_showFn && goog.isFunction(obj[x])) {\n      continue;\n    }\n    var s = x + ' = ';\n\n    try {\n      s += obj[x];\n    } catch (e) {\n      s += '*** ' + e + ' ***';\n    }\n    str.push(s);\n  }\n  return str.join('\\n');\n};\n\n\n/**\n * Creates a string representing a given primitive or object, and for an\n * object, all its properties and nested objects. NOTE: The output will include\n * Uids on all objects that were exposed. Any added Uids will be removed before\n * returning.\n * @param {*} obj Object to expose.\n * @param {boolean=} opt_showFn Also show properties that are functions (by\n *     default, functions are omitted).\n * @return {string} A string representation of `obj`.\n */\ngoog.debug.deepExpose = function(obj, opt_showFn) {\n  var str = [];\n\n  // Track any objects where deepExpose added a Uid, so they can be cleaned up\n  // before return. We do this globally, rather than only on ancestors so that\n  // if the same object appears in the output, you can see it.\n  var uidsToCleanup = [];\n  var ancestorUids = {};\n\n  var helper = function(obj, space) {\n    var nestspace = space + '  ';\n\n    var indentMultiline = function(str) {\n      return str.replace(/\\n/g, '\\n' + space);\n    };\n\n\n    try {\n      if (obj === undefined) {\n        str.push('undefined');\n      } else if (obj === null) {\n        str.push('NULL');\n      } else if (typeof obj === 'string') {\n        str.push('\"' + indentMultiline(obj) + '\"');\n      } else if (goog.isFunction(obj)) {\n        str.push(indentMultiline(String(obj)));\n      } else if (goog.isObject(obj)) {\n        // Add a Uid if needed. The struct calls implicitly adds them.\n        if (!goog.hasUid(obj)) {\n          uidsToCleanup.push(obj);\n        }\n        var uid = goog.getUid(obj);\n        if (ancestorUids[uid]) {\n          str.push('*** reference loop detected (id=' + uid + ') ***');\n        } else {\n          ancestorUids[uid] = true;\n          str.push('{');\n          for (var x in obj) {\n            if (!opt_showFn && goog.isFunction(obj[x])) {\n              continue;\n            }\n            str.push('\\n');\n            str.push(nestspace);\n            str.push(x + ' = ');\n            helper(obj[x], nestspace);\n          }\n          str.push('\\n' + space + '}');\n          delete ancestorUids[uid];\n        }\n      } else {\n        str.push(obj);\n      }\n    } catch (e) {\n      str.push('*** ' + e + ' ***');\n    }\n  };\n\n  helper(obj, '');\n\n  // Cleanup any Uids that were added by the deepExpose.\n  for (var i = 0; i < uidsToCleanup.length; i++) {\n    goog.removeUid(uidsToCleanup[i]);\n  }\n\n  return str.join('');\n};\n\n\n/**\n * Recursively outputs a nested array as a string.\n * @param {Array<?>} arr The array.\n * @return {string} String representing nested array.\n */\ngoog.debug.exposeArray = function(arr) {\n  var str = [];\n  for (var i = 0; i < arr.length; i++) {\n    if (goog.isArray(arr[i])) {\n      str.push(goog.debug.exposeArray(arr[i]));\n    } else {\n      str.push(arr[i]);\n    }\n  }\n  return '[ ' + str.join(', ') + ' ]';\n};\n\n\n/**\n * Normalizes the error/exception object between browsers.\n * @param {*} err Raw error object.\n * @return {{\n *    message: (?|undefined),\n *    name: (?|undefined),\n *    lineNumber: (?|undefined),\n *    fileName: (?|undefined),\n *    stack: (?|undefined)\n * }} Normalized error object.\n * @suppress {strictMissingProperties} properties not defined on err\n */\ngoog.debug.normalizeErrorObject = function(err) {\n  var href = goog.getObjectByName('window.location.href');\n  if (err == null) {\n    err = 'Unknown Error of type \"null/undefined\"';\n  }\n  if (typeof err === 'string') {\n    return {\n      'message': err,\n      'name': 'Unknown error',\n      'lineNumber': 'Not available',\n      'fileName': href,\n      'stack': 'Not available'\n    };\n  }\n\n  var lineNumber, fileName;\n  var threwError = false;\n\n  try {\n    lineNumber = err.lineNumber || err.line || 'Not available';\n  } catch (e) {\n    // Firefox 2 sometimes throws an error when accessing 'lineNumber':\n    // Message: Permission denied to get property UnnamedClass.lineNumber\n    lineNumber = 'Not available';\n    threwError = true;\n  }\n\n  try {\n    fileName = err.fileName || err.filename || err.sourceURL ||\n        // $googDebugFname may be set before a call to eval to set the filename\n        // that the eval is supposed to present.\n        goog.global['$googDebugFname'] || href;\n  } catch (e) {\n    // Firefox 2 may also throw an error when accessing 'filename'.\n    fileName = 'Not available';\n    threwError = true;\n  }\n\n  // The IE Error object contains only the name and the message.\n  // The Safari Error object uses the line and sourceURL fields.\n  if (threwError || !err.lineNumber || !err.fileName || !err.stack ||\n      !err.message || !err.name) {\n    var message = err.message;\n    if (message == null) {\n      if (err.constructor && err.constructor instanceof Function) {\n        var ctorName = err.constructor.name ?\n            err.constructor.name :\n            goog.debug.getFunctionName(err.constructor);\n        message = 'Unknown Error of type \"' + ctorName + '\"';\n      } else {\n        message = 'Unknown Error of unknown type';\n      }\n    }\n    return {\n      'message': message,\n      'name': err.name || 'UnknownError',\n      'lineNumber': lineNumber,\n      'fileName': fileName,\n      'stack': err.stack || 'Not available'\n    };\n  }\n\n  // Standards error object\n  // Typed !Object. Should be a subtype of the return type, but it's not.\n  return /** @type {?} */ (err);\n};\n\n\n/**\n * Converts an object to an Error using the object's toString if it's not\n * already an Error, adds a stacktrace if there isn't one, and optionally adds\n * an extra message.\n * @param {*} err The original thrown error, object, or string.\n * @param {string=} opt_message  optional additional message to add to the\n *     error.\n * @return {!Error} If err is an Error, it is enhanced and returned. Otherwise,\n *     it is converted to an Error which is enhanced and returned.\n */\ngoog.debug.enhanceError = function(err, opt_message) {\n  var error;\n  if (!(err instanceof Error)) {\n    error = Error(err);\n    if (Error.captureStackTrace) {\n      // Trim this function off the call stack, if we can.\n      Error.captureStackTrace(error, goog.debug.enhanceError);\n    }\n  } else {\n    error = err;\n  }\n\n  if (!error.stack) {\n    error.stack = goog.debug.getStacktrace(goog.debug.enhanceError);\n  }\n  if (opt_message) {\n    // find the first unoccupied 'messageX' property\n    var x = 0;\n    while (error['message' + x]) {\n      ++x;\n    }\n    error['message' + x] = String(opt_message);\n  }\n  return error;\n};\n\n\n/**\n * Converts an object to an Error using the object's toString if it's not\n * already an Error, adds a stacktrace if there isn't one, and optionally adds\n * context to the Error, which is reported by the closure error reporter.\n * @param {*} err The original thrown error, object, or string.\n * @param {!Object<string, string>=} opt_context Key-value context to add to the\n *     Error.\n * @return {!Error} If err is an Error, it is enhanced and returned. Otherwise,\n *     it is converted to an Error which is enhanced and returned.\n */\ngoog.debug.enhanceErrorWithContext = function(err, opt_context) {\n  var error = goog.debug.enhanceError(err);\n  if (opt_context) {\n    for (var key in opt_context) {\n      goog.debug.errorcontext.addErrorContext(error, key, opt_context[key]);\n    }\n  }\n  return error;\n};\n\n\n/**\n * Gets the current stack trace. Simple and iterative - doesn't worry about\n * catching circular references or getting the args.\n * @param {number=} opt_depth Optional maximum depth to trace back to.\n * @return {string} A string with the function names of all functions in the\n *     stack, separated by \\n.\n * @suppress {es5Strict}\n */\ngoog.debug.getStacktraceSimple = function(opt_depth) {\n  if (!goog.debug.FORCE_SLOPPY_STACKS) {\n    var stack = goog.debug.getNativeStackTrace_(goog.debug.getStacktraceSimple);\n    if (stack) {\n      return stack;\n    }\n    // NOTE: browsers that have strict mode support also have native \"stack\"\n    // properties.  Fall-through for legacy browser support.\n  }\n\n  var sb = [];\n  var fn = arguments.callee.caller;\n  var depth = 0;\n\n  while (fn && (!opt_depth || depth < opt_depth)) {\n    sb.push(goog.debug.getFunctionName(fn));\n    sb.push('()\\n');\n\n    try {\n      fn = fn.caller;\n    } catch (e) {\n      sb.push('[exception trying to get caller]\\n');\n      break;\n    }\n    depth++;\n    if (depth >= goog.debug.MAX_STACK_DEPTH) {\n      sb.push('[...long stack...]');\n      break;\n    }\n  }\n  if (opt_depth && depth >= opt_depth) {\n    sb.push('[...reached max depth limit...]');\n  } else {\n    sb.push('[end]');\n  }\n\n  return sb.join('');\n};\n\n\n/**\n * Max length of stack to try and output\n * @type {number}\n */\ngoog.debug.MAX_STACK_DEPTH = 50;\n\n\n/**\n * @param {Function} fn The function to start getting the trace from.\n * @return {?string}\n * @private\n */\ngoog.debug.getNativeStackTrace_ = function(fn) {\n  var tempErr = new Error();\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(tempErr, fn);\n    return String(tempErr.stack);\n  } else {\n    // IE10, only adds stack traces when an exception is thrown.\n    try {\n      throw tempErr;\n    } catch (e) {\n      tempErr = e;\n    }\n    var stack = tempErr.stack;\n    if (stack) {\n      return String(stack);\n    }\n  }\n  return null;\n};\n\n\n/**\n * Gets the current stack trace, either starting from the caller or starting\n * from a specified function that's currently on the call stack.\n * @param {?Function=} fn If provided, when collecting the stack trace all\n *     frames above the topmost call to this function, including that call,\n *     will be left out of the stack trace.\n * @return {string} Stack trace.\n * @suppress {es5Strict}\n */\ngoog.debug.getStacktrace = function(fn) {\n  var stack;\n  if (!goog.debug.FORCE_SLOPPY_STACKS) {\n    // Try to get the stack trace from the environment if it is available.\n    var contextFn = fn || goog.debug.getStacktrace;\n    stack = goog.debug.getNativeStackTrace_(contextFn);\n  }\n  if (!stack) {\n    // NOTE: browsers that have strict mode support also have native \"stack\"\n    // properties. This function will throw in strict mode.\n    stack = goog.debug.getStacktraceHelper_(fn || arguments.callee.caller, []);\n  }\n  return stack;\n};\n\n\n/**\n * Private helper for getStacktrace().\n * @param {?Function} fn If provided, when collecting the stack trace all\n *     frames above the topmost call to this function, including that call,\n *     will be left out of the stack trace.\n * @param {Array<!Function>} visited List of functions visited so far.\n * @return {string} Stack trace starting from function fn.\n * @suppress {es5Strict}\n * @private\n */\ngoog.debug.getStacktraceHelper_ = function(fn, visited) {\n  var sb = [];\n\n  // Circular reference, certain functions like bind seem to cause a recursive\n  // loop so we need to catch circular references\n  if (goog.array.contains(visited, fn)) {\n    sb.push('[...circular reference...]');\n\n    // Traverse the call stack until function not found or max depth is reached\n  } else if (fn && visited.length < goog.debug.MAX_STACK_DEPTH) {\n    sb.push(goog.debug.getFunctionName(fn) + '(');\n    var args = fn.arguments;\n    // Args may be null for some special functions such as host objects or eval.\n    for (var i = 0; args && i < args.length; i++) {\n      if (i > 0) {\n        sb.push(', ');\n      }\n      var argDesc;\n      var arg = args[i];\n      switch (typeof arg) {\n        case 'object':\n          argDesc = arg ? 'object' : 'null';\n          break;\n\n        case 'string':\n          argDesc = arg;\n          break;\n\n        case 'number':\n          argDesc = String(arg);\n          break;\n\n        case 'boolean':\n          argDesc = arg ? 'true' : 'false';\n          break;\n\n        case 'function':\n          argDesc = goog.debug.getFunctionName(arg);\n          argDesc = argDesc ? argDesc : '[fn]';\n          break;\n\n        case 'undefined':\n        default:\n          argDesc = typeof arg;\n          break;\n      }\n\n      if (argDesc.length > 40) {\n        argDesc = argDesc.substr(0, 40) + '...';\n      }\n      sb.push(argDesc);\n    }\n    visited.push(fn);\n    sb.push(')\\n');\n\n    try {\n      sb.push(goog.debug.getStacktraceHelper_(fn.caller, visited));\n    } catch (e) {\n      sb.push('[exception trying to get caller]\\n');\n    }\n\n  } else if (fn) {\n    sb.push('[...long stack...]');\n  } else {\n    sb.push('[end]');\n  }\n  return sb.join('');\n};\n\n\n/**\n * Gets a function name\n * @param {Function} fn Function to get name of.\n * @return {string} Function's name.\n */\ngoog.debug.getFunctionName = function(fn) {\n  if (goog.debug.fnNameCache_[fn]) {\n    return goog.debug.fnNameCache_[fn];\n  }\n\n  // Heuristically determine function name based on code.\n  var functionSource = String(fn);\n  if (!goog.debug.fnNameCache_[functionSource]) {\n    var matches = /function\\s+([^\\(]+)/m.exec(functionSource);\n    if (matches) {\n      var method = matches[1];\n      goog.debug.fnNameCache_[functionSource] = method;\n    } else {\n      goog.debug.fnNameCache_[functionSource] = '[Anonymous]';\n    }\n  }\n\n  return goog.debug.fnNameCache_[functionSource];\n};\n\n\n/**\n * Makes whitespace visible by replacing it with printable characters.\n * This is useful in finding diffrences between the expected and the actual\n * output strings of a testcase.\n * @param {string} string whose whitespace needs to be made visible.\n * @return {string} string whose whitespace is made visible.\n */\ngoog.debug.makeWhitespaceVisible = function(string) {\n  return string.replace(/ /g, '[_]')\n      .replace(/\\f/g, '[f]')\n      .replace(/\\n/g, '[n]\\n')\n      .replace(/\\r/g, '[r]')\n      .replace(/\\t/g, '[t]');\n};\n\n\n/**\n * Returns the type of a value. If a constructor is passed, and a suitable\n * string cannot be found, 'unknown type name' will be returned.\n *\n * <p>Forked rather than moved from {@link goog.asserts.getType_}\n * to avoid adding a dependency to goog.asserts.\n * @param {*} value A constructor, object, or primitive.\n * @return {string} The best display name for the value, or 'unknown type name'.\n */\ngoog.debug.runtimeType = function(value) {\n  if (value instanceof Function) {\n    return value.displayName || value.name || 'unknown type name';\n  } else if (value instanceof Object) {\n    return /** @type {string} */ (value.constructor.displayName) ||\n        value.constructor.name || Object.prototype.toString.call(value);\n  } else {\n    return value === null ? 'null' : typeof value;\n  }\n};\n\n\n/**\n * Hash map for storing function names that have already been looked up.\n * @type {Object}\n * @private\n */\ngoog.debug.fnNameCache_ = {};\n\n\n/**\n * Private internal function to support goog.debug.freeze.\n * @param {T} arg\n * @return {T}\n * @template T\n * @private\n */\ngoog.debug.freezeInternal_ = goog.DEBUG && Object.freeze || function(arg) {\n  return arg;\n};\n\n\n/**\n * Freezes the given object, but only in debug mode (and in browsers that\n * support it).  Note that this is a shallow freeze, so for deeply nested\n * objects it must be called at every level to ensure deep immutability.\n * @param {T} arg\n * @return {T}\n * @template T\n */\ngoog.debug.freeze = function(arg) {\n  // NOTE: this compiles to nothing, but hides the possible side effect of\n  // freezeInternal_ from the compiler so that the entire call can be\n  // removed if the result is not used.\n  return {\n    valueOf: function() {\n      return goog.debug.freezeInternal_(arg);\n    }\n  }.valueOf();\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:S","^;S","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/debug.js"],"^:1",["^9K",["^;T"]],"^9<",true,"^9=",["^9>","^;9","^;S","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.synthetickeyboardevent.js","^9C",["^9D","goog/ui/synthetickeyboardevent.js"],"^9E","goog/ui/synthetickeyboardevent.js","^9F","^9G","^9H","// Copyright 2018 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.ui.SyntheticKeyboardEvent');\n\ngoog.require('goog.events.Event');\ngoog.require('goog.ui.KeyboardEventData');\n\n\n\n/**\n * Synthetic keyboard event that can be handled by `KeyboardShortcutHandler`.\n *\n * Prefer using the available `createKeyUp`, `createKeyDown`, `createKeyPress`\n * helpers over using this constructor.\n * @param {!goog.ui.SyntheticKeyboardEvent.Type} type\n * @param {number} keyCode\n * @param {boolean} shiftKey\n * @param {boolean} altKey\n * @param {boolean} ctrlKey\n * @param {boolean} metaKey\n * @param {!Node} target\n * @param {function(): void} preventDefaultFn\n * @param {function(): void} stopPropagationFn\n * @extends {goog.events.Event}\n * @constructor @struct @final\n */\ngoog.ui.SyntheticKeyboardEvent = function(\n    type, keyCode, shiftKey, altKey, ctrlKey, metaKey, target, preventDefaultFn,\n    stopPropagationFn) {\n  goog.ui.SyntheticKeyboardEvent.base(this, 'constructor', type);\n\n  /** @private @const {!goog.ui.KeyboardEventData} */\n  this.data_ = new goog.ui.KeyboardEventData.Builder()\n                   .keyCode(keyCode)\n                   .shiftKey(shiftKey)\n                   .altKey(altKey)\n                   .ctrlKey(ctrlKey)\n                   .metaKey(metaKey)\n                   .target(target)\n                   .rootTarget(target)\n                   .preventDefaultFn(preventDefaultFn)\n                   .stopPropagationFn(stopPropagationFn)\n                   .build();\n};\ngoog.inherits(goog.ui.SyntheticKeyboardEvent, goog.events.Event);\n\n\n/**\n * @return {!goog.ui.KeyboardEventData}\n * @package\n */\ngoog.ui.SyntheticKeyboardEvent.prototype.getData = function() {\n  return this.data_;\n};\n\n\n/**\n * Creates a synthetic keydown event.\n * @param {number} keyCode\n * @param {boolean} shiftKey\n * @param {boolean} altKey\n * @param {boolean} ctrlKey\n * @param {boolean} metaKey\n * @param {!Node} target\n * @param {function(): void} preventDefaultFn\n * @param {function(): void} stopPropagationFn\n * @return {!goog.ui.SyntheticKeyboardEvent}\n */\ngoog.ui.SyntheticKeyboardEvent.createKeyDown = function(\n    keyCode, shiftKey, altKey, ctrlKey, metaKey, target, preventDefaultFn,\n    stopPropagationFn) {\n  return new goog.ui.SyntheticKeyboardEvent(\n      goog.ui.SyntheticKeyboardEvent.Type.KEYDOWN, keyCode, shiftKey, altKey,\n      ctrlKey, metaKey, target, preventDefaultFn, stopPropagationFn);\n};\n\n\n/**\n * Creates a synthetic keyup event.\n * @param {number} keyCode\n * @param {boolean} shiftKey\n * @param {boolean} altKey\n * @param {boolean} ctrlKey\n * @param {boolean} metaKey\n * @param {!Node} target\n * @param {function(): void} preventDefaultFn\n * @param {function(): void} stopPropagationFn\n * @return {!goog.ui.SyntheticKeyboardEvent}\n */\ngoog.ui.SyntheticKeyboardEvent.createKeyUp = function(\n    keyCode, shiftKey, altKey, ctrlKey, metaKey, target, preventDefaultFn,\n    stopPropagationFn) {\n  return new goog.ui.SyntheticKeyboardEvent(\n      goog.ui.SyntheticKeyboardEvent.Type.KEYUP, keyCode, shiftKey, altKey,\n      ctrlKey, metaKey, target, preventDefaultFn, stopPropagationFn);\n};\n\n\n/**\n * Creates a synthetic keypress event.\n * @param {number} keyCode\n * @param {boolean} shiftKey\n * @param {boolean} altKey\n * @param {boolean} ctrlKey\n * @param {boolean} metaKey\n * @param {!Node} target\n * @param {function(): void} preventDefaultFn\n * @param {function(): void} stopPropagationFn\n * @return {!goog.ui.SyntheticKeyboardEvent}\n */\ngoog.ui.SyntheticKeyboardEvent.createKeyPress = function(\n    keyCode, shiftKey, altKey, ctrlKey, metaKey, target, preventDefaultFn,\n    stopPropagationFn) {\n  return new goog.ui.SyntheticKeyboardEvent(\n      goog.ui.SyntheticKeyboardEvent.Type.KEYPRESS, keyCode, shiftKey, altKey,\n      ctrlKey, metaKey, target, preventDefaultFn, stopPropagationFn);\n};\n\n\n/**\n * Synthetic event types.\n * @enum {string}\n */\ngoog.ui.SyntheticKeyboardEvent.Type = {\n  KEYDOWN: 'synthetic-keydown',\n  KEYUP: 'synthetic-keyup',\n  KEYPRESS: 'synthetic-keypress'\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.ui.KeyboardEventData","^9>","^;8"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/synthetickeyboardevent.js"],"^:1",["^9K",["~$goog.ui.SyntheticKeyboardEvent"]],"^9<",true,"^9=",["^9>","^;8","^HN"]],["^ ","^9A",[1579837703000],"^9B","goog.locale.defaultlocalenameconstants.js","^9C",["^9D","goog/locale/defaultlocalenameconstants.js"],"^9E","goog/locale/defaultlocalenameconstants.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Default list of locale specific country and language names.\n *\n * File generated from CLDR ver. 35\n *\n */\n\n// clang-format off\n\n/**\n * Namespace for locale specific country and lanugage names\n */\ngoog.provide('goog.locale.defaultLocaleNameConstants');\n\n/**\n * Default list of locale specific country and language names\n * @const\n */\ngoog.locale.defaultLocaleNameConstants = {\n  'COUNTRY': {\n    '001': 'World',\n    '002': 'Africa',\n    '003': 'North America',\n    '005': 'South America',\n    '009': 'Oceania',\n    '011': 'Western Africa',\n    '013': 'Central America',\n    '014': 'Eastern Africa',\n    '015': 'Northern Africa',\n    '017': 'Middle Africa',\n    '018': 'Southern Africa',\n    '019': 'Americas',\n    '021': 'Northern America',\n    '029': 'Caribbean',\n    '030': 'Eastern Asia',\n    '034': 'Southern Asia',\n    '035': 'Southeast Asia',\n    '039': 'Southern Europe',\n    '053': 'Australasia',\n    '054': 'Melanesia',\n    '057': 'Micronesian Region',\n    '061': 'Polynesia',\n    '142': 'Asia',\n    '143': 'Central Asia',\n    '145': 'Western Asia',\n    '150': 'Europe',\n    '151': 'Eastern Europe',\n    '154': 'Northern Europe',\n    '155': 'Western Europe',\n    '202': 'Sub-Saharan Africa',\n    '419': 'Latin America',\n    'AC': 'Ascension Island',\n    'AD': 'Andorra',\n    'AE': 'United Arab Emirates',\n    'AF': 'Afghanistan',\n    'AG': 'Antigua & Barbuda',\n    'AI': 'Anguilla',\n    'AL': 'Albania',\n    'AM': 'Armenia',\n    'AO': 'Angola',\n    'AQ': 'Antarctica',\n    'AR': 'Argentina',\n    'AS': 'American Samoa',\n    'AT': 'Austria',\n    'AU': 'Australia',\n    'AW': 'Aruba',\n    'AX': 'Åland Islands',\n    'AZ': 'Azerbaijan',\n    'BA': 'Bosnia & Herzegovina',\n    'BB': 'Barbados',\n    'BD': 'Bangladesh',\n    'BE': 'Belgium',\n    'BF': 'Burkina Faso',\n    'BG': 'Bulgaria',\n    'BH': 'Bahrain',\n    'BI': 'Burundi',\n    'BJ': 'Benin',\n    'BL': 'St. Barthélemy',\n    'BM': 'Bermuda',\n    'BN': 'Brunei',\n    'BO': 'Bolivia',\n    'BQ': 'Caribbean Netherlands',\n    'BR': 'Brazil',\n    'BS': 'Bahamas',\n    'BT': 'Bhutan',\n    'BV': 'Bouvet Island',\n    'BW': 'Botswana',\n    'BY': 'Belarus',\n    'BZ': 'Belize',\n    'CA': 'Canada',\n    'CC': 'Cocos (Keeling) Islands',\n    'CD': 'Congo - Kinshasa',\n    'CF': 'Central African Republic',\n    'CG': 'Congo - Brazzaville',\n    'CH': 'Switzerland',\n    'CI': 'Côte d’Ivoire',\n    'CK': 'Cook Islands',\n    'CL': 'Chile',\n    'CM': 'Cameroon',\n    'CN': 'China',\n    'CO': 'Colombia',\n    'CP': 'Clipperton Island',\n    'CR': 'Costa Rica',\n    'CU': 'Cuba',\n    'CV': 'Cape Verde',\n    'CW': 'Curaçao',\n    'CX': 'Christmas Island',\n    'CY': 'Cyprus',\n    'CZ': 'Czechia',\n    'DE': 'Germany',\n    'DG': 'Diego Garcia',\n    'DJ': 'Djibouti',\n    'DK': 'Denmark',\n    'DM': 'Dominica',\n    'DO': 'Dominican Republic',\n    'DZ': 'Algeria',\n    'EA': 'Ceuta & Melilla',\n    'EC': 'Ecuador',\n    'EE': 'Estonia',\n    'EG': 'Egypt',\n    'EH': 'Western Sahara',\n    'ER': 'Eritrea',\n    'ES': 'Spain',\n    'ET': 'Ethiopia',\n    'EU': 'European Union',\n    'EZ': 'Eurozone',\n    'FI': 'Finland',\n    'FJ': 'Fiji',\n    'FK': 'Falkland Islands (Islas Malvinas)',\n    'FM': 'Micronesia',\n    'FO': 'Faroe Islands',\n    'FR': 'France',\n    'GA': 'Gabon',\n    'GB': 'United Kingdom',\n    'GD': 'Grenada',\n    'GE': 'Georgia',\n    'GF': 'French Guiana',\n    'GG': 'Guernsey',\n    'GH': 'Ghana',\n    'GI': 'Gibraltar',\n    'GL': 'Greenland',\n    'GM': 'Gambia',\n    'GN': 'Guinea',\n    'GP': 'Guadeloupe',\n    'GQ': 'Equatorial Guinea',\n    'GR': 'Greece',\n    'GS': 'South Georgia & South Sandwich Islands',\n    'GT': 'Guatemala',\n    'GU': 'Guam',\n    'GW': 'Guinea-Bissau',\n    'GY': 'Guyana',\n    'HK': 'Hong Kong',\n    'HM': 'Heard & McDonald Islands',\n    'HN': 'Honduras',\n    'HR': 'Croatia',\n    'HT': 'Haiti',\n    'HU': 'Hungary',\n    'IC': 'Canary Islands',\n    'ID': 'Indonesia',\n    'IE': 'Ireland',\n    'IL': 'Israel',\n    'IM': 'Isle of Man',\n    'IN': 'India',\n    'IO': 'British Indian Ocean Territory',\n    'IQ': 'Iraq',\n    'IR': 'Iran',\n    'IS': 'Iceland',\n    'IT': 'Italy',\n    'JE': 'Jersey',\n    'JM': 'Jamaica',\n    'JO': 'Jordan',\n    'JP': 'Japan',\n    'KE': 'Kenya',\n    'KG': 'Kyrgyzstan',\n    'KH': 'Cambodia',\n    'KI': 'Kiribati',\n    'KM': 'Comoros',\n    'KN': 'St. Kitts & Nevis',\n    'KP': 'North Korea',\n    'KR': 'South Korea',\n    'KW': 'Kuwait',\n    'KY': 'Cayman Islands',\n    'KZ': 'Kazakhstan',\n    'LA': 'Laos',\n    'LB': 'Lebanon',\n    'LC': 'St. Lucia',\n    'LI': 'Liechtenstein',\n    'LK': 'Sri Lanka',\n    'LR': 'Liberia',\n    'LS': 'Lesotho',\n    'LT': 'Lithuania',\n    'LU': 'Luxembourg',\n    'LV': 'Latvia',\n    'LY': 'Libya',\n    'MA': 'Morocco',\n    'MC': 'Monaco',\n    'MD': 'Moldova',\n    'ME': 'Montenegro',\n    'MF': 'St. Martin',\n    'MG': 'Madagascar',\n    'MH': 'Marshall Islands',\n    'MK': 'North Macedonia',\n    'ML': 'Mali',\n    'MM': 'Myanmar (Burma)',\n    'MN': 'Mongolia',\n    'MO': 'Macao',\n    'MP': 'Northern Mariana Islands',\n    'MQ': 'Martinique',\n    'MR': 'Mauritania',\n    'MS': 'Montserrat',\n    'MT': 'Malta',\n    'MU': 'Mauritius',\n    'MV': 'Maldives',\n    'MW': 'Malawi',\n    'MX': 'Mexico',\n    'MY': 'Malaysia',\n    'MZ': 'Mozambique',\n    'NA': 'Namibia',\n    'NC': 'New Caledonia',\n    'NE': 'Niger',\n    'NF': 'Norfolk Island',\n    'NG': 'Nigeria',\n    'NI': 'Nicaragua',\n    'NL': 'Netherlands',\n    'NO': 'Norway',\n    'NP': 'Nepal',\n    'NR': 'Nauru',\n    'NU': 'Niue',\n    'NZ': 'New Zealand',\n    'OM': 'Oman',\n    'PA': 'Panama',\n    'PE': 'Peru',\n    'PF': 'French Polynesia',\n    'PG': 'Papua New Guinea',\n    'PH': 'Philippines',\n    'PK': 'Pakistan',\n    'PL': 'Poland',\n    'PM': 'St. Pierre & Miquelon',\n    'PN': 'Pitcairn Islands',\n    'PR': 'Puerto Rico',\n    'PS': 'Palestine',\n    'PT': 'Portugal',\n    'PW': 'Palau',\n    'PY': 'Paraguay',\n    'QA': 'Qatar',\n    'QO': 'Outlying Oceania',\n    'RE': 'Réunion',\n    'RO': 'Romania',\n    'RS': 'Serbia',\n    'RU': 'Russia',\n    'RW': 'Rwanda',\n    'SA': 'Saudi Arabia',\n    'SB': 'Solomon Islands',\n    'SC': 'Seychelles',\n    'SD': 'Sudan',\n    'SE': 'Sweden',\n    'SG': 'Singapore',\n    'SH': 'St. Helena',\n    'SI': 'Slovenia',\n    'SJ': 'Svalbard & Jan Mayen',\n    'SK': 'Slovakia',\n    'SL': 'Sierra Leone',\n    'SM': 'San Marino',\n    'SN': 'Senegal',\n    'SO': 'Somalia',\n    'SR': 'Suriname',\n    'SS': 'South Sudan',\n    'ST': 'São Tomé & Príncipe',\n    'SV': 'El Salvador',\n    'SX': 'Sint Maarten',\n    'SY': 'Syria',\n    'SZ': 'Eswatini',\n    'TA': 'Tristan da Cunha',\n    'TC': 'Turks & Caicos Islands',\n    'TD': 'Chad',\n    'TF': 'French Southern Territories',\n    'TG': 'Togo',\n    'TH': 'Thailand',\n    'TJ': 'Tajikistan',\n    'TK': 'Tokelau',\n    'TL': 'Timor-Leste',\n    'TM': 'Turkmenistan',\n    'TN': 'Tunisia',\n    'TO': 'Tonga',\n    'TR': 'Turkey',\n    'TT': 'Trinidad & Tobago',\n    'TV': 'Tuvalu',\n    'TW': 'Taiwan',\n    'TZ': 'Tanzania',\n    'UA': 'Ukraine',\n    'UG': 'Uganda',\n    'UM': 'U.S. Outlying Islands',\n    'UN': 'United Nations',\n    'US': 'United States',\n    'UY': 'Uruguay',\n    'UZ': 'Uzbekistan',\n    'VA': 'Vatican City',\n    'VC': 'St. Vincent & Grenadines',\n    'VE': 'Venezuela',\n    'VG': 'British Virgin Islands',\n    'VI': 'U.S. Virgin Islands',\n    'VN': 'Vietnam',\n    'VU': 'Vanuatu',\n    'WF': 'Wallis & Futuna',\n    'WS': 'Samoa',\n    'XK': 'Kosovo',\n    'YE': 'Yemen',\n    'YT': 'Mayotte',\n    'ZA': 'South Africa',\n    'ZM': 'Zambia',\n    'ZW': 'Zimbabwe',\n    'ZZ': 'Unknown Region'\n  },\n  'LANGUAGE': {\n    'aa': 'Afar',\n    'ab': 'Abkhazian',\n    'ace': 'Achinese',\n    'ach': 'Acoli',\n    'ada': 'Adangme',\n    'ady': 'Adyghe',\n    'ae': 'Avestan',\n    'af': 'Afrikaans',\n    'afh': 'Afrihili',\n    'agq': 'Aghem',\n    'ain': 'Ainu',\n    'ak': 'Akan',\n    'akk': 'Akkadian',\n    'ale': 'Aleut',\n    'alt': 'Southern Altai',\n    'am': 'Amharic',\n    'an': 'Aragonese',\n    'ang': 'Old English',\n    'anp': 'Angika',\n    'ar': 'Arabic',\n    'ar_001': 'Arabic (World)',\n    'arc': 'Aramaic',\n    'arn': 'Mapuche',\n    'arp': 'Arapaho',\n    'ars': 'Najdi Arabic',\n    'arw': 'Arawak',\n    'as': 'Assamese',\n    'asa': 'Asu',\n    'ast': 'Asturian',\n    'av': 'Avaric',\n    'awa': 'Awadhi',\n    'ay': 'Aymara',\n    'az': 'Azerbaijani',\n    'az_Cyrl': 'Azerbaijani (Cyrillic)',\n    'az_Latn': 'Azerbaijani (Latin)',\n    'ba': 'Bashkir',\n    'bal': 'Baluchi',\n    'ban': 'Balinese',\n    'bas': 'Basaa',\n    'bax': 'Bamun',\n    'bbj': 'Ghomala',\n    'be': 'Belarusian',\n    'bej': 'Beja',\n    'bem': 'Bemba',\n    'bez': 'Bena',\n    'bfd': 'Bafut',\n    'bg': 'Bulgarian',\n    'bho': 'Bhojpuri',\n    'bi': 'Bislama',\n    'bik': 'Bikol',\n    'bin': 'Bini',\n    'bkm': 'Kom',\n    'bla': 'Siksika',\n    'bm': 'Bambara',\n    'bn': 'Bangla',\n    'bo': 'Tibetan',\n    'br': 'Breton',\n    'bra': 'Braj',\n    'brx': 'Bodo',\n    'bs': 'Bosnian',\n    'bs_Cyrl': 'Bosnian (Cyrillic)',\n    'bs_Latn': 'Bosnian (Latin)',\n    'bss': 'Akoose',\n    'bua': 'Buriat',\n    'bug': 'Buginese',\n    'bum': 'Bulu',\n    'byn': 'Blin',\n    'byv': 'Medumba',\n    'ca': 'Catalan',\n    'cad': 'Caddo',\n    'car': 'Carib',\n    'cay': 'Cayuga',\n    'cch': 'Atsam',\n    'ccp': 'Chakma',\n    'ce': 'Chechen',\n    'ceb': 'Cebuano',\n    'cgg': 'Chiga',\n    'ch': 'Chamorro',\n    'chb': 'Chibcha',\n    'chg': 'Chagatai',\n    'chk': 'Chuukese',\n    'chm': 'Mari',\n    'chn': 'Chinook Jargon',\n    'cho': 'Choctaw',\n    'chp': 'Chipewyan',\n    'chr': 'Cherokee',\n    'chy': 'Cheyenne',\n    'ckb': 'Central Kurdish',\n    'co': 'Corsican',\n    'cop': 'Coptic',\n    'cr': 'Cree',\n    'crh': 'Crimean Turkish',\n    'cs': 'Czech',\n    'csb': 'Kashubian',\n    'cu': 'Church Slavic',\n    'cv': 'Chuvash',\n    'cy': 'Welsh',\n    'da': 'Danish',\n    'dak': 'Dakota',\n    'dar': 'Dargwa',\n    'dav': 'Taita',\n    'de': 'German',\n    'de_AT': 'German (Austria)',\n    'de_CH': 'German (Switzerland)',\n    'del': 'Delaware',\n    'den': 'Slave',\n    'dgr': 'Dogrib',\n    'din': 'Dinka',\n    'dje': 'Zarma',\n    'doi': 'Dogri',\n    'dsb': 'Lower Sorbian',\n    'dua': 'Duala',\n    'dum': 'Middle Dutch',\n    'dv': 'Divehi',\n    'dyo': 'Jola-Fonyi',\n    'dyu': 'Dyula',\n    'dz': 'Dzongkha',\n    'dzg': 'Dazaga',\n    'ebu': 'Embu',\n    'ee': 'Ewe',\n    'efi': 'Efik',\n    'egy': 'Ancient Egyptian',\n    'eka': 'Ekajuk',\n    'el': 'Greek',\n    'elx': 'Elamite',\n    'en': 'English',\n    'en_AU': 'English (Australia)',\n    'en_CA': 'English (Canada)',\n    'en_GB': 'English (United Kingdom)',\n    'en_US': 'English (United States)',\n    'enm': 'Middle English',\n    'eo': 'Esperanto',\n    'es': 'Spanish',\n    'es_419': 'Spanish (Latin America)',\n    'es_ES': 'Spanish (Spain)',\n    'es_MX': 'Spanish (Mexico)',\n    'et': 'Estonian',\n    'eu': 'Basque',\n    'ewo': 'Ewondo',\n    'fa': 'Persian',\n    'fa_AF': 'Persian (Afghanistan)',\n    'fan': 'Fang',\n    'fat': 'Fanti',\n    'ff': 'Fulah',\n    'ff_Latn': 'Fulah (Latin)',\n    'fi': 'Finnish',\n    'fil': 'Filipino',\n    'fj': 'Fijian',\n    'fo': 'Faroese',\n    'fon': 'Fon',\n    'fr': 'French',\n    'fr_CA': 'French (Canada)',\n    'fr_CH': 'French (Switzerland)',\n    'frm': 'Middle French',\n    'fro': 'Old French',\n    'frr': 'Northern Frisian',\n    'frs': 'Eastern Frisian',\n    'fur': 'Friulian',\n    'fy': 'Western Frisian',\n    'ga': 'Irish',\n    'gaa': 'Ga',\n    'gay': 'Gayo',\n    'gba': 'Gbaya',\n    'gd': 'Scottish Gaelic',\n    'gez': 'Geez',\n    'gil': 'Gilbertese',\n    'gl': 'Galician',\n    'gmh': 'Middle High German',\n    'gn': 'Guarani',\n    'goh': 'Old High German',\n    'gon': 'Gondi',\n    'gor': 'Gorontalo',\n    'got': 'Gothic',\n    'grb': 'Grebo',\n    'grc': 'Ancient Greek',\n    'gsw': 'Swiss German',\n    'gu': 'Gujarati',\n    'guz': 'Gusii',\n    'gv': 'Manx',\n    'gwi': 'Gwichʼin',\n    'ha': 'Hausa',\n    'hai': 'Haida',\n    'haw': 'Hawaiian',\n    'he': 'Hebrew',\n    'hi': 'Hindi',\n    'hil': 'Hiligaynon',\n    'hit': 'Hittite',\n    'hmn': 'Hmong',\n    'ho': 'Hiri Motu',\n    'hr': 'Croatian',\n    'hsb': 'Upper Sorbian',\n    'ht': 'Haitian Creole',\n    'hu': 'Hungarian',\n    'hup': 'Hupa',\n    'hy': 'Armenian',\n    'hz': 'Herero',\n    'ia': 'Interlingua',\n    'iba': 'Iban',\n    'ibb': 'Ibibio',\n    'id': 'Indonesian',\n    'ie': 'Interlingue',\n    'ig': 'Igbo',\n    'ii': 'Sichuan Yi',\n    'ik': 'Inupiaq',\n    'ilo': 'Iloko',\n    'in': 'Indonesian',\n    'inh': 'Ingush',\n    'io': 'Ido',\n    'is': 'Icelandic',\n    'it': 'Italian',\n    'iu': 'Inuktitut',\n    'iw': 'Hebrew',\n    'ja': 'Japanese',\n    'jbo': 'Lojban',\n    'jgo': 'Ngomba',\n    'jmc': 'Machame',\n    'jpr': 'Judeo-Persian',\n    'jrb': 'Judeo-Arabic',\n    'jv': 'Javanese',\n    'ka': 'Georgian',\n    'kaa': 'Kara-Kalpak',\n    'kab': 'Kabyle',\n    'kac': 'Kachin',\n    'kaj': 'Jju',\n    'kam': 'Kamba',\n    'kaw': 'Kawi',\n    'kbd': 'Kabardian',\n    'kbl': 'Kanembu',\n    'kcg': 'Tyap',\n    'kde': 'Makonde',\n    'kea': 'Kabuverdianu',\n    'kfo': 'Koro',\n    'kg': 'Kongo',\n    'kha': 'Khasi',\n    'kho': 'Khotanese',\n    'khq': 'Koyra Chiini',\n    'ki': 'Kikuyu',\n    'kj': 'Kuanyama',\n    'kk': 'Kazakh',\n    'kkj': 'Kako',\n    'kl': 'Kalaallisut',\n    'kln': 'Kalenjin',\n    'km': 'Khmer',\n    'kmb': 'Kimbundu',\n    'kn': 'Kannada',\n    'ko': 'Korean',\n    'kok': 'Konkani',\n    'kos': 'Kosraean',\n    'kpe': 'Kpelle',\n    'kr': 'Kanuri',\n    'krc': 'Karachay-Balkar',\n    'krl': 'Karelian',\n    'kru': 'Kurukh',\n    'ks': 'Kashmiri',\n    'ksb': 'Shambala',\n    'ksf': 'Bafia',\n    'ksh': 'Colognian',\n    'ku': 'Kurdish',\n    'kum': 'Kumyk',\n    'kut': 'Kutenai',\n    'kv': 'Komi',\n    'kw': 'Cornish',\n    'ky': 'Kyrgyz',\n    'la': 'Latin',\n    'lad': 'Ladino',\n    'lag': 'Langi',\n    'lah': 'Lahnda',\n    'lam': 'Lamba',\n    'lb': 'Luxembourgish',\n    'lez': 'Lezghian',\n    'lg': 'Ganda',\n    'li': 'Limburgish',\n    'lkt': 'Lakota',\n    'ln': 'Lingala',\n    'lo': 'Lao',\n    'lol': 'Mongo',\n    'loz': 'Lozi',\n    'lrc': 'Northern Luri',\n    'lt': 'Lithuanian',\n    'lu': 'Luba-Katanga',\n    'lua': 'Luba-Lulua',\n    'lui': 'Luiseno',\n    'lun': 'Lunda',\n    'luo': 'Luo',\n    'lus': 'Mizo',\n    'luy': 'Luyia',\n    'lv': 'Latvian',\n    'mad': 'Madurese',\n    'maf': 'Mafa',\n    'mag': 'Magahi',\n    'mai': 'Maithili',\n    'mak': 'Makasar',\n    'man': 'Mandingo',\n    'mas': 'Masai',\n    'mde': 'Maba',\n    'mdf': 'Moksha',\n    'mdr': 'Mandar',\n    'men': 'Mende',\n    'mer': 'Meru',\n    'mfe': 'Morisyen',\n    'mg': 'Malagasy',\n    'mga': 'Middle Irish',\n    'mgh': 'Makhuwa-Meetto',\n    'mgo': 'Metaʼ',\n    'mh': 'Marshallese',\n    'mi': 'Maori',\n    'mic': 'Mi\\'kmaq',\n    'min': 'Minangkabau',\n    'mk': 'Macedonian',\n    'ml': 'Malayalam',\n    'mn': 'Mongolian',\n    'mnc': 'Manchu',\n    'mni': 'Manipuri',\n    'mo': 'Romanian (Moldova)',\n    'moh': 'Mohawk',\n    'mos': 'Mossi',\n    'mr': 'Marathi',\n    'ms': 'Malay',\n    'mt': 'Maltese',\n    'mua': 'Mundang',\n    'mul': 'Multiple languages',\n    'mus': 'Creek',\n    'mwl': 'Mirandese',\n    'mwr': 'Marwari',\n    'my': 'Burmese',\n    'mye': 'Myene',\n    'myv': 'Erzya',\n    'mzn': 'Mazanderani',\n    'na': 'Nauru',\n    'nap': 'Neapolitan',\n    'naq': 'Nama',\n    'nb': 'Norwegian Bokmål',\n    'nd': 'North Ndebele',\n    'nds': 'Low German',\n    'nds_NL': 'Low German (Netherlands)',\n    'ne': 'Nepali',\n    'new': 'Newari',\n    'ng': 'Ndonga',\n    'nia': 'Nias',\n    'niu': 'Niuean',\n    'nl': 'Dutch',\n    'nl_BE': 'Dutch (Belgium)',\n    'nmg': 'Kwasio',\n    'nn': 'Norwegian Nynorsk',\n    'nnh': 'Ngiemboon',\n    'no': 'Norwegian',\n    'nog': 'Nogai',\n    'non': 'Old Norse',\n    'nqo': 'N’Ko',\n    'nr': 'South Ndebele',\n    'nso': 'Northern Sotho',\n    'nus': 'Nuer',\n    'nv': 'Navajo',\n    'nwc': 'Classical Newari',\n    'ny': 'Nyanja',\n    'nym': 'Nyamwezi',\n    'nyn': 'Nyankole',\n    'nyo': 'Nyoro',\n    'nzi': 'Nzima',\n    'oc': 'Occitan',\n    'oj': 'Ojibwa',\n    'om': 'Oromo',\n    'or': 'Odia',\n    'os': 'Ossetic',\n    'osa': 'Osage',\n    'ota': 'Ottoman Turkish',\n    'pa': 'Punjabi',\n    'pa_Arab': 'Punjabi (Arabic)',\n    'pa_Guru': 'Punjabi (Gurmukhi)',\n    'pag': 'Pangasinan',\n    'pal': 'Pahlavi',\n    'pam': 'Pampanga',\n    'pap': 'Papiamento',\n    'pau': 'Palauan',\n    'peo': 'Old Persian',\n    'phn': 'Phoenician',\n    'pi': 'Pali',\n    'pl': 'Polish',\n    'pon': 'Pohnpeian',\n    'pro': 'Old Provençal',\n    'ps': 'Pashto',\n    'pt': 'Portuguese',\n    'pt_BR': 'Portuguese (Brazil)',\n    'pt_PT': 'Portuguese (Portugal)',\n    'qu': 'Quechua',\n    'raj': 'Rajasthani',\n    'rap': 'Rapanui',\n    'rar': 'Rarotongan',\n    'rm': 'Romansh',\n    'rn': 'Rundi',\n    'ro': 'Romanian',\n    'ro_MD': 'Romanian (Moldova)',\n    'rof': 'Rombo',\n    'rom': 'Romany',\n    'ru': 'Russian',\n    'rup': 'Aromanian',\n    'rw': 'Kinyarwanda',\n    'rwk': 'Rwa',\n    'sa': 'Sanskrit',\n    'sad': 'Sandawe',\n    'sah': 'Sakha',\n    'sam': 'Samaritan Aramaic',\n    'saq': 'Samburu',\n    'sas': 'Sasak',\n    'sat': 'Santali',\n    'sba': 'Ngambay',\n    'sbp': 'Sangu',\n    'sc': 'Sardinian',\n    'scn': 'Sicilian',\n    'sco': 'Scots',\n    'sd': 'Sindhi',\n    'se': 'Northern Sami',\n    'see': 'Seneca',\n    'seh': 'Sena',\n    'sel': 'Selkup',\n    'ses': 'Koyraboro Senni',\n    'sg': 'Sango',\n    'sga': 'Old Irish',\n    'sh': 'Serbo-Croatian',\n    'shi': 'Tachelhit',\n    'shi_Latn': 'Tachelhit (Latin)',\n    'shi_Tfng': 'Tachelhit (Tifinagh)',\n    'shn': 'Shan',\n    'shu': 'Chadian Arabic',\n    'si': 'Sinhala',\n    'sid': 'Sidamo',\n    'sk': 'Slovak',\n    'sl': 'Slovenian',\n    'sm': 'Samoan',\n    'sma': 'Southern Sami',\n    'smj': 'Lule Sami',\n    'smn': 'Inari Sami',\n    'sms': 'Skolt Sami',\n    'sn': 'Shona',\n    'snk': 'Soninke',\n    'so': 'Somali',\n    'sog': 'Sogdien',\n    'sq': 'Albanian',\n    'sr': 'Serbian',\n    'sr_Cyrl': 'Serbian (Cyrillic)',\n    'sr_Latn': 'Serbian (Latin)',\n    'srn': 'Sranan Tongo',\n    'srr': 'Serer',\n    'ss': 'Swati',\n    'ssy': 'Saho',\n    'st': 'Southern Sotho',\n    'su': 'Sundanese',\n    'suk': 'Sukuma',\n    'sus': 'Susu',\n    'sux': 'Sumerian',\n    'sv': 'Swedish',\n    'sw': 'Swahili',\n    'sw_CD': 'Swahili (Congo - Kinshasa)',\n    'swb': 'Comorian',\n    'syc': 'Classical Syriac',\n    'syr': 'Syriac',\n    'ta': 'Tamil',\n    'te': 'Telugu',\n    'tem': 'Timne',\n    'teo': 'Teso',\n    'ter': 'Tereno',\n    'tet': 'Tetum',\n    'tg': 'Tajik',\n    'th': 'Thai',\n    'ti': 'Tigrinya',\n    'tig': 'Tigre',\n    'tiv': 'Tiv',\n    'tk': 'Turkmen',\n    'tkl': 'Tokelau',\n    'tl': 'Tagalog',\n    'tlh': 'Klingon',\n    'tli': 'Tlingit',\n    'tmh': 'Tamashek',\n    'tn': 'Tswana',\n    'to': 'Tongan',\n    'tog': 'Nyasa Tonga',\n    'tpi': 'Tok Pisin',\n    'tr': 'Turkish',\n    'trv': 'Taroko',\n    'ts': 'Tsonga',\n    'tsi': 'Tsimshian',\n    'tt': 'Tatar',\n    'tum': 'Tumbuka',\n    'tvl': 'Tuvalu',\n    'tw': 'Twi',\n    'twq': 'Tasawaq',\n    'ty': 'Tahitian',\n    'tyv': 'Tuvinian',\n    'tzm': 'Central Atlas Tamazight',\n    'udm': 'Udmurt',\n    'ug': 'Uyghur',\n    'uga': 'Ugaritic',\n    'uk': 'Ukrainian',\n    'umb': 'Umbundu',\n    'ur': 'Urdu',\n    'uz': 'Uzbek',\n    'uz_Arab': 'Uzbek (Arabic)',\n    'uz_Cyrl': 'Uzbek (Cyrillic)',\n    'uz_Latn': 'Uzbek (Latin)',\n    'vai': 'Vai',\n    'vai_Latn': 'Vai (Latin)',\n    'vai_Vaii': 'Vai (Vai)',\n    've': 'Venda',\n    'vi': 'Vietnamese',\n    'vo': 'Volapük',\n    'vot': 'Votic',\n    'vun': 'Vunjo',\n    'wa': 'Walloon',\n    'wae': 'Walser',\n    'wal': 'Wolaytta',\n    'war': 'Waray',\n    'was': 'Washo',\n    'wo': 'Wolof',\n    'xal': 'Kalmyk',\n    'xh': 'Xhosa',\n    'xog': 'Soga',\n    'yao': 'Yao',\n    'yap': 'Yapese',\n    'yav': 'Yangben',\n    'ybb': 'Yemba',\n    'yi': 'Yiddish',\n    'yo': 'Yoruba',\n    'yue': 'Cantonese',\n    'yue_Hans': 'Cantonese (Simplified)',\n    'yue_Hant': 'Cantonese (Traditional)',\n    'za': 'Zhuang',\n    'zap': 'Zapotec',\n    'zbl': 'Blissymbols',\n    'zen': 'Zenaga',\n    'zgh': 'Standard Moroccan Tamazight',\n    'zh': 'Chinese',\n    'zh_Hans': 'Chinese (Simplified)',\n    'zh_Hant': 'Chinese (Traditional)',\n    'zh_TW': 'Chinese (Taiwan)',\n    'zu': 'Zulu',\n    'zun': 'Zuni',\n    'zxx': 'No linguistic content',\n    'zza': 'Zaza'\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/locale/defaultlocalenameconstants.js"],"^:1",["^9K",["~$goog.locale.defaultLocaleNameConstants"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.strictmock.js","^9C",["^9D","goog/testing/strictmock.js"],"^9E","goog/testing/strictmock.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This file defines a strict mock implementation.\n */\n\ngoog.setTestOnly('goog.testing.StrictMock');\ngoog.provide('goog.testing.StrictMock');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.structs.Set');\ngoog.require('goog.testing.Mock');\n\n\n\n/**\n * This is a mock that verifies that methods are called in the order that they\n * are specified during the recording phase. Since it verifies order, it\n * follows 'fail fast' semantics. If it detects a deviation from the\n * expectations, it will throw an exception and not wait for verify to be\n * called.\n * @param {Object|Function} objectToMock The object that should be mocked, or\n *    the constructor of an object to mock.\n * @param {boolean=} opt_mockStaticMethods An optional argument denoting that\n *     a mock should be constructed from the static functions of a class.\n * @param {boolean=} opt_createProxy An optional argument denoting that\n *     a proxy for the target mock should be created.\n * @constructor\n * @extends {goog.testing.Mock}\n * @final\n */\ngoog.testing.StrictMock = function(\n    objectToMock, opt_mockStaticMethods, opt_createProxy) {\n  goog.testing.Mock.call(\n      this, objectToMock, opt_mockStaticMethods, opt_createProxy);\n\n  /**\n   * An array of MockExpectations.\n   * @type {!Array<!goog.testing.MockExpectation>}\n   * @private\n   */\n  this.$expectations_ = [];\n\n  /** @private {!goog.structs.Set<!goog.testing.MockExpectation>} */\n  this.awaitingExpectations_ = new goog.structs.Set();\n};\ngoog.inherits(goog.testing.StrictMock, goog.testing.Mock);\n\n\n/** @override */\ngoog.testing.StrictMock.prototype.$recordExpectation = function() {\n  if (this.$pendingExpectation) {\n    this.$expectations_.push(this.$pendingExpectation);\n    this.awaitingExpectations_.add(this.$pendingExpectation);\n  }\n};\n\n\n/** @override */\ngoog.testing.StrictMock.prototype.$recordCall = function(name, args) {\n  if (this.$expectations_.length == 0) {\n    this.$throwCallException(name, args);\n  }\n\n  // If the current expectation has a different name, make sure it was called\n  // enough and then discard it. We're through with it.\n  var currentExpectation = this.$expectations_[0];\n  while (!this.$verifyCall(currentExpectation, name, args)) {\n    // This might be an item which has passed its min, and we can now\n    // look past it, or it might be below its min and generate an error.\n    if (currentExpectation.actualCalls < currentExpectation.minCalls) {\n      this.$throwCallException(name, args, currentExpectation);\n    }\n\n    this.$expectations_.shift();\n    this.awaitingExpectations_.remove(currentExpectation);\n    this.maybeFinishedWithExpectations_();\n    if (this.$expectations_.length < 1) {\n      // Nothing left, but this may be a failed attempt to call the previous\n      // item on the list, which may have been between its min and max.\n      this.$throwCallException(name, args, currentExpectation);\n    }\n    currentExpectation = this.$expectations_[0];\n  }\n\n  if (currentExpectation.maxCalls == 0) {\n    this.$throwCallException(name, args);\n  }\n\n  currentExpectation.actualCalls++;\n  // If we hit the max number of calls for this expectation, we're finished\n  // with it.\n  if (currentExpectation.actualCalls == currentExpectation.maxCalls) {\n    this.$expectations_.shift();\n  }\n  if (currentExpectation.actualCalls >= currentExpectation.minCalls) {\n    this.awaitingExpectations_.remove(currentExpectation);\n    this.maybeFinishedWithExpectations_();\n  }\n\n  return this.$do(currentExpectation, args);\n};\n\n\n/** @override */\ngoog.testing.StrictMock.prototype.$reset = function() {\n  goog.testing.StrictMock.superClass_.$reset.call(this);\n\n  goog.array.clear(this.$expectations_);\n  this.awaitingExpectations_.clear();\n};\n\n\n/** @override */\ngoog.testing.StrictMock.prototype.$waitAndVerify = function() {\n  for (var i = 0; i < this.$expectations_.length; i++) {\n    var expectation = this.$expectations_[i];\n    goog.asserts.assert(\n        !isFinite(expectation.maxCalls) ||\n            expectation.minCalls == expectation.maxCalls,\n        'Mock expectations cannot have a loose number of expected calls to ' +\n            'use $waitAndVerify.');\n  }\n  var promise = goog.testing.StrictMock.base(this, '$waitAndVerify');\n  this.maybeFinishedWithExpectations_();\n  return promise;\n};\n\n/**\n * @private\n */\ngoog.testing.StrictMock.prototype.maybeFinishedWithExpectations_ = function() {\n  var unresolvedExpectations =\n      goog.array.count(this.$expectations_, function(expectation) {\n        return expectation.actualCalls < expectation.minCalls;\n      });\n  if (this.waitingForExpectations && !unresolvedExpectations) {\n    this.waitingForExpectations.resolve();\n  }\n};\n\n\n/** @override */\ngoog.testing.StrictMock.prototype.$verify = function() {\n  goog.testing.StrictMock.superClass_.$verify.call(this);\n\n  while (this.$expectations_.length > 0) {\n    var expectation = this.$expectations_[0];\n    if (expectation.actualCalls < expectation.minCalls) {\n      this.$throwException(\n          'Missing a call to ' + expectation.name + '\\nExpected: ' +\n          expectation.minCalls + ' but was: ' + expectation.actualCalls);\n\n    } else {\n      // Don't need to check max, that's handled when the call is made\n      this.$expectations_.shift();\n    }\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9>","~$goog.testing.Mock","^;9","~$goog.structs.Set"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/strictmock.js"],"^:1",["^9K",["~$goog.testing.StrictMock"]],"^9<",true,"^9=",["^9>","^;9","^:E","^HR","^HQ"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.dom.uri.js","^9C",["^9D","goog/dom/uri.js"],"^9E","goog/dom/uri.js","^9F","^9G","^9H","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.module('goog.dom.uri');\n\nconst Const = goog.require('goog.string.Const');\nconst TagName = goog.require('goog.dom.TagName');\nconst uncheckedconversions = goog.require('goog.html.uncheckedconversions');\nconst {createElement} = goog.require('goog.dom');\nconst {setAnchorHref} = goog.require('goog.dom.safe');\n\n/**\n * Normalizes a URL by assigning it to an anchor element and reading back href.\n *\n * This converts relative URLs to absolute, and cleans up whitespace.\n * @param {string} uri A string containing a URI.\n * @return {string} Normalized, absolute form of uri.\n */\nfunction normalizeUri(uri) {\n  const anchor = createElement(TagName.A);\n  // This is safe even though the URL might be untrustworthy.\n  // The SafeURL is only used to set the href of an HTMLAnchorElement\n  // that is never added to the DOM. Therefore, the user cannot navigate\n  // to this URL.\n  const safeUrl =\n      uncheckedconversions.safeUrlFromStringKnownToSatisfyTypeContract(\n          Const.from('This URL is never added to the DOM'), uri);\n  setAnchorHref(anchor, safeUrl);\n  return anchor.href;\n}\nexports.normalizeUri = normalizeUri;\n\n/**\n * Gets the href property of an anchor element, suppressing exceptions coming\n * from certain URLs in IE.\n * @param {!HTMLAnchorElement} element\n * @return {?string}\n * @deprecated This format is deprecated in RFC 3986. Use this function only for\n * legacy behavior, and avoid accepting such URLs in new code.\n */\nfunction getHref(element) {\n  try {\n    return element.href || null;\n  } catch (x) {\n    // IE throws a security exception for urls including username/password:\n    // http://user:password@example.com/\n    return null;\n  }\n}\nexports.getHref = getHref;\n","^9I",1579837703000,"^9J",["^9K",["^;;","^9>","^@=","^=M","^@B","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/uri.js"],"^:1",["^9K",["~$goog.dom.uri"]],"^9<",true,"^9=",["^9>","^=M","^;=","^@=","^;;","^@B"]],["^ ","^9A",[1579837703000],"^9B","goog.history.html5history.js","^9C",["^9D","goog/history/html5history.js"],"^9E","goog/history/html5history.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview HTML5 based history implementation, compatible with\n * goog.History.\n *\n * TODO(user): There should really be a history interface and multiple\n * implementations.\n *\n */\n\n\ngoog.provide('goog.history.Html5History');\ngoog.provide('goog.history.Html5History.TokenTransformer');\n\ngoog.require('goog.asserts');\ngoog.require('goog.events');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.history.Event');\n\n\n\n/**\n * An implementation compatible with goog.History that uses the HTML5\n * history APIs.\n *\n * @param {Window=} opt_win The window to listen/dispatch history events on.\n * @param {goog.history.Html5History.TokenTransformer=} opt_transformer\n *     The token transformer that is used to create URL from the token\n *     when storing token without using hash fragment.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.history.Html5History = function(opt_win, opt_transformer) {\n  goog.events.EventTarget.call(this);\n  goog.asserts.assert(\n      goog.history.Html5History.isSupported(opt_win),\n      'HTML5 history is not supported.');\n\n  /**\n   * The window object to use for history tokens.  Typically the top window.\n   * @type {Window}\n   * @private\n   */\n  this.window_ = opt_win || window;\n\n  /**\n   * The token transformer that is used to create URL from the token\n   * when storing token without using hash fragment.\n   * @type {goog.history.Html5History.TokenTransformer}\n   * @private\n   */\n  this.transformer_ = opt_transformer || null;\n\n  /**\n   * The fragment of the last navigation. Used to eliminate duplicate/redundant\n   * NAVIGATE events when a POPSTATE and HASHCHANGE event are triggered for the\n   * same navigation (e.g., back button click).\n   * @private {?string}\n   */\n  this.lastFragment_ = null;\n\n  goog.events.listen(\n      this.window_, goog.events.EventType.POPSTATE, this.onHistoryEvent_, false,\n      this);\n  goog.events.listen(\n      this.window_, goog.events.EventType.HASHCHANGE, this.onHistoryEvent_,\n      false, this);\n};\ngoog.inherits(goog.history.Html5History, goog.events.EventTarget);\n\n\n/**\n * Returns whether Html5History is supported.\n * @param {Window=} opt_win Optional window to check.\n * @return {boolean} Whether html5 history is supported.\n */\ngoog.history.Html5History.isSupported = function(opt_win) {\n  var win = opt_win || window;\n  return !!(win.history && win.history.pushState);\n};\n\n\n/**\n * Status of when the object is active and dispatching events.\n * @type {boolean}\n * @private\n */\ngoog.history.Html5History.prototype.enabled_ = false;\n\n\n/**\n * Whether to use the fragment to store the token, defaults to true.\n * @type {boolean}\n * @private\n */\ngoog.history.Html5History.prototype.useFragment_ = true;\n\n\n/**\n * If useFragment is false the path will be used, the path prefix will be\n * prepended to all tokens. Defaults to '/'.\n * @type {string}\n * @private\n */\ngoog.history.Html5History.prototype.pathPrefix_ = '/';\n\n\n/**\n * Starts or stops the History.  When enabled, the History object\n * will immediately fire an event for the current location. The caller can set\n * up event listeners between the call to the constructor and the call to\n * setEnabled.\n *\n * @param {boolean} enable Whether to enable history.\n */\ngoog.history.Html5History.prototype.setEnabled = function(enable) {\n  if (enable == this.enabled_) {\n    return;\n  }\n\n  this.enabled_ = enable;\n\n  if (enable) {\n    this.dispatchEvent(new goog.history.Event(this.getToken(), false));\n  }\n};\n\n\n/**\n * Returns the current token.\n * @return {string} The current token.\n */\ngoog.history.Html5History.prototype.getToken = function() {\n  if (this.useFragment_) {\n    return goog.asserts.assertString(this.getFragment_());\n  } else {\n    return this.transformer_ ?\n        this.transformer_.retrieveToken(\n            this.pathPrefix_, this.window_.location) :\n        this.window_.location.pathname.substr(this.pathPrefix_.length);\n  }\n};\n\n\n/**\n * Sets the history state.\n * @param {string} token The history state identifier.\n * @param {string=} opt_title Optional title to associate with history entry.\n */\ngoog.history.Html5History.prototype.setToken = function(token, opt_title) {\n  if (token == this.getToken()) {\n    return;\n  }\n\n  // Per externs/gecko_dom.js document.title can be null.\n  this.window_.history.pushState(\n      null, opt_title || this.window_.document.title || '',\n      this.getUrl_(token));\n  this.dispatchEvent(new goog.history.Event(token, false));\n};\n\n\n/**\n * Replaces the current history state without affecting the rest of the history\n * stack.\n * @param {string} token The history state identifier.\n * @param {string=} opt_title Optional title to associate with history entry.\n */\ngoog.history.Html5History.prototype.replaceToken = function(token, opt_title) {\n  // Per externs/gecko_dom.js document.title can be null.\n  this.window_.history.replaceState(\n      null, opt_title || this.window_.document.title || '',\n      this.getUrl_(token));\n  this.dispatchEvent(new goog.history.Event(token, false));\n};\n\n\n/** @override */\ngoog.history.Html5History.prototype.disposeInternal = function() {\n  goog.events.unlisten(\n      this.window_, goog.events.EventType.POPSTATE, this.onHistoryEvent_, false,\n      this);\n  if (this.useFragment_) {\n    goog.events.unlisten(\n        this.window_, goog.events.EventType.HASHCHANGE, this.onHistoryEvent_,\n        false, this);\n  }\n};\n\n\n/**\n * Sets whether to use the fragment to store tokens.\n * @param {boolean} useFragment Whether to use the fragment.\n */\ngoog.history.Html5History.prototype.setUseFragment = function(useFragment) {\n  if (this.useFragment_ != useFragment) {\n    if (useFragment) {\n      goog.events.listen(\n          this.window_, goog.events.EventType.HASHCHANGE, this.onHistoryEvent_,\n          false, this);\n    } else {\n      goog.events.unlisten(\n          this.window_, goog.events.EventType.HASHCHANGE, this.onHistoryEvent_,\n          false, this);\n    }\n    this.useFragment_ = useFragment;\n  }\n};\n\n\n/**\n * Sets the path prefix to use if storing tokens in the path. The path\n * prefix should start and end with slash.\n * @param {string} pathPrefix Sets the path prefix.\n */\ngoog.history.Html5History.prototype.setPathPrefix = function(pathPrefix) {\n  this.pathPrefix_ = pathPrefix;\n};\n\n\n/**\n * Gets the path prefix.\n * @return {string} The path prefix.\n */\ngoog.history.Html5History.prototype.getPathPrefix = function() {\n  return this.pathPrefix_;\n};\n\n\n/**\n * Gets the current hash fragment, if useFragment_ is enabled.\n * @return {?string} The hash fragment.\n * @private\n */\ngoog.history.Html5History.prototype.getFragment_ = function() {\n  if (this.useFragment_) {\n    var loc = this.window_.location.href;\n    var index = loc.indexOf('#');\n    return index < 0 ? '' : loc.substring(index + 1);\n  } else {\n    return null;\n  }\n};\n\n\n/**\n * Gets the URL to set when calling history.pushState\n * @param {string} token The history token.\n * @return {string} The URL.\n * @private\n */\ngoog.history.Html5History.prototype.getUrl_ = function(token) {\n  if (this.useFragment_) {\n    return '#' + token;\n  } else {\n    return this.transformer_ ?\n        this.transformer_.createUrl(\n            token, this.pathPrefix_, this.window_.location) :\n        this.pathPrefix_ + token + this.window_.location.search;\n  }\n};\n\n\n/**\n * Handles history events dispatched by the browser.\n * @param {goog.events.BrowserEvent} e The browser event object.\n * @private\n */\ngoog.history.Html5History.prototype.onHistoryEvent_ = function(e) {\n  if (this.enabled_) {\n    var fragment = this.getFragment_();\n    // Only fire NAVIGATE event if it's POPSTATE or if the fragment has changed\n    // without a POPSTATE event. The latter is an indication the browser doesn't\n    // support POPSTATE, and the event is a HASHCHANGE instead.\n    if (e.type == goog.events.EventType.POPSTATE ||\n        fragment != this.lastFragment_) {\n      this.lastFragment_ = fragment;\n      this.dispatchEvent(new goog.history.Event(this.getToken(), true));\n    }\n  }\n};\n\n\n\n/**\n * A token transformer that can create a URL from a history\n * token. This is used by `goog.history.Html5History` to create\n * URL when storing token without the hash fragment.\n *\n * Given a `window.location` object containing the location\n * created by `createUrl`, the token transformer allows\n * retrieval of the token back via `retrieveToken`.\n *\n * @interface\n */\ngoog.history.Html5History.TokenTransformer = function() {};\n\n\n/**\n * Retrieves a history token given the path prefix and\n * `window.location` object.\n *\n * @param {string} pathPrefix The path prefix to use when storing token\n *     in a path; always begin with a slash.\n * @param {Location} location The `window.location` object.\n *     Treat this object as read-only.\n * @return {string} token The history token.\n */\ngoog.history.Html5History.TokenTransformer.prototype.retrieveToken = function(\n    pathPrefix, location) {};\n\n\n/**\n * Creates a URL to be pushed into HTML5 history stack when storing\n * token without using hash fragment.\n *\n * @param {string} token The history token.\n * @param {string} pathPrefix The path prefix to use when storing token\n *     in a path; always begin with a slash.\n * @param {Location} location The `window.location` object.\n *     Treat this object as read-only.\n * @return {string} url The complete URL string from path onwards\n *     (without {@code protocol://host:port} part); must begin with a\n *     slash.\n */\ngoog.history.Html5History.TokenTransformer.prototype.createUrl = function(\n    token, pathPrefix, location) {};\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.history.Event","^9>","^:L","^:I","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/history/html5history.js"],"^:1",["^9K",["~$goog.history.Html5History.TokenTransformer","~$goog.history.Html5History"]],"^9<",true,"^9=",["^9>","^:E","^:N","^:L","^:I","^HU"]],["^ ","^9A",[1579837703000],"^9B","goog.string.const.js","^9C",["^9D","goog/string/const.js"],"^9E","goog/string/const.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.string.Const');\n\ngoog.require('goog.asserts');\ngoog.require('goog.string.TypedString');\n\n\n\n/**\n * Wrapper for compile-time-constant strings.\n *\n * Const is a wrapper for strings that can only be created from program\n * constants (i.e., string literals).  This property relies on a custom Closure\n * compiler check that `goog.string.Const.from` is only invoked on\n * compile-time-constant expressions.\n *\n * Const is useful in APIs whose correct and secure use requires that certain\n * arguments are not attacker controlled: Compile-time constants are inherently\n * under the control of the application and not under control of external\n * attackers, and hence are safe to use in such contexts.\n *\n * Instances of this type must be created via its factory method\n * `goog.string.Const.from` and not by invoking its constructor.  The\n * constructor intentionally takes no parameters and the type is immutable;\n * hence only a default instance corresponding to the empty string can be\n * obtained via constructor invocation.  Use goog.string.Const.EMPTY\n * instead of using this constructor to get an empty Const string.\n *\n * @see goog.string.Const#from\n * @constructor\n * @final\n * @struct\n * @implements {goog.string.TypedString}\n * @param {Object=} opt_token package-internal implementation detail.\n * @param {string=} opt_content package-internal implementation detail.\n */\ngoog.string.Const = function(opt_token, opt_content) {\n  /**\n   * The wrapped value of this Const object.  The field has a purposely ugly\n   * name to make (non-compiled) code that attempts to directly access this\n   * field stand out.\n   * @private {string}\n   */\n  this.stringConstValueWithSecurityContract__googStringSecurityPrivate_ =\n      ((opt_token ===\n        goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_) &&\n       opt_content) ||\n      '';\n\n  /**\n   * A type marker used to implement additional run-time type checking.\n   * @see goog.string.Const#unwrap\n   * @const {!Object}\n   * @private\n   */\n  this.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_ =\n      goog.string.Const.TYPE_MARKER_;\n};\n\n\n/**\n * @override\n * @const\n */\ngoog.string.Const.prototype.implementsGoogStringTypedString = true;\n\n\n/**\n * Returns this Const's value a string.\n *\n * IMPORTANT: In code where it is security-relevant that an object's type is\n * indeed `goog.string.Const`, use `goog.string.Const.unwrap`\n * instead of this method.\n *\n * @see goog.string.Const#unwrap\n * @override\n */\ngoog.string.Const.prototype.getTypedStringValue = function() {\n  return this.stringConstValueWithSecurityContract__googStringSecurityPrivate_;\n};\n\n\nif (goog.DEBUG) {\n  /**\n   * Returns a debug-string representation of this value.\n   *\n   * To obtain the actual string value wrapped inside an object of this type,\n   * use `goog.string.Const.unwrap`.\n   *\n   * @see goog.string.Const#unwrap\n   * @override\n   */\n  goog.string.Const.prototype.toString = function() {\n    return 'Const{' +\n        this.stringConstValueWithSecurityContract__googStringSecurityPrivate_ +\n        '}';\n  };\n}\n\n\n/**\n * Performs a runtime check that the provided object is indeed an instance\n * of `goog.string.Const`, and returns its value.\n * @param {!goog.string.Const} stringConst The object to extract from.\n * @return {string} The Const object's contained string, unless the run-time\n *     type check fails. In that case, `unwrap` returns an innocuous\n *     string, or, if assertions are enabled, throws\n *     `goog.asserts.AssertionError`.\n */\ngoog.string.Const.unwrap = function(stringConst) {\n  // Perform additional run-time type-checking to ensure that stringConst is\n  // indeed an instance of the expected type.  This provides some additional\n  // protection against security bugs due to application code that disables type\n  // checks.\n  if (stringConst instanceof goog.string.Const &&\n      stringConst.constructor === goog.string.Const &&\n      stringConst.STRING_CONST_TYPE_MARKER__GOOG_STRING_SECURITY_PRIVATE_ ===\n          goog.string.Const.TYPE_MARKER_) {\n    return stringConst\n        .stringConstValueWithSecurityContract__googStringSecurityPrivate_;\n  } else {\n    goog.asserts.fail(\n        'expected object of type Const, got \\'' + stringConst + '\\'');\n    return 'type_error:Const';\n  }\n};\n\n\n/**\n * Creates a Const object from a compile-time constant string.\n *\n * It is illegal to invoke this function on an expression whose\n * compile-time-constant value cannot be determined by the Closure compiler.\n *\n * Correct invocations include,\n * <pre>\n *   var s = goog.string.Const.from('hello');\n *   var t = goog.string.Const.from('hello' + 'world');\n * </pre>\n *\n * In contrast, the following are illegal:\n * <pre>\n *   var s = goog.string.Const.from(getHello());\n *   var t = goog.string.Const.from('hello' + world);\n * </pre>\n *\n * @param {string} s A constant string from which to create a Const.\n * @return {!goog.string.Const} A Const object initialized to stringConst.\n */\ngoog.string.Const.from = function(s) {\n  return new goog.string.Const(\n      goog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_, s);\n};\n\n/**\n * Type marker for the Const type, used to implement additional run-time\n * type checking.\n * @const {!Object}\n * @private\n */\ngoog.string.Const.TYPE_MARKER_ = {};\n\n/**\n * @type {!Object}\n * @private\n * @const\n */\ngoog.string.Const.GOOG_STRING_CONSTRUCTOR_TOKEN_PRIVATE_ = {};\n\n/**\n * A Const instance wrapping the empty string.\n * @const {!goog.string.Const}\n */\ngoog.string.Const.EMPTY = goog.string.Const.from('');\n","^9I",1579837703000,"^9J",["^9K",["^:E","^GS","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/string/const.js"],"^:1",["^9K",["^=M"]],"^9<",true,"^9=",["^9>","^:E","^GS"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.hovercard.js","^9C",["^9D","goog/ui/hovercard.js"],"^9E","goog/ui/hovercard.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Show hovercards with a delay after the mouse moves over an\n * element of a specified type and with a specific attribute.\n *\n * @see ../demos/hovercard.html\n */\n\ngoog.provide('goog.ui.HoverCard');\ngoog.provide('goog.ui.HoverCard.EventType');\ngoog.provide('goog.ui.HoverCard.TriggerEvent');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventType');\ngoog.require('goog.ui.AdvancedTooltip');\ngoog.require('goog.ui.PopupBase');\ngoog.require('goog.ui.Tooltip');\n\n\n\n/**\n * Create a hover card object.  Hover cards extend tooltips in that they don't\n * have to be manually attached to each element that can cause them to display.\n * Instead, you can create a function that gets called when the mouse goes over\n * any element on your page, and returns whether or not the hovercard should be\n * shown for that element.\n *\n * Alternatively, you can define a map of tag names to the attribute name each\n * tag should have for that tag to trigger the hover card.  See example below.\n *\n * Hovercards can also be triggered manually by calling\n * `triggerForElement`, shown without a delay by calling\n * `showForElement`, or triggered over other elements by calling\n * `attach`.  For the latter two cases, the application is responsible\n * for calling `detach` when finished.\n *\n * HoverCard objects fire a TRIGGER event when the mouse moves over an element\n * that can trigger a hovercard, and BEFORE_SHOW when the hovercard is\n * about to be shown.  Clients can respond to these events and can prevent the\n * hovercard from being triggered or shown.\n *\n * @param {Function|Object} isAnchor Function that returns true if a given\n *     element should trigger the hovercard.  Alternatively, it can be a map of\n *     tag names to the attribute that the tag should have in order to trigger\n *     the hovercard, e.g., {A: 'href'} for all links.  Tag names must be all\n *     upper case; attribute names are case insensitive.\n * @param {boolean=} opt_checkDescendants Use false for a performance gain if\n *     you are sure that none of your triggering elements have child elements.\n *     Default is true.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper to use for\n *     creating and rendering the hovercard element.\n * @param {Document=} opt_triggeringDocument Optional document to use in place\n *     of the one included in the DomHelper for finding triggering elements.\n *     Defaults to the document included in the DomHelper.\n * @constructor\n * @extends {goog.ui.AdvancedTooltip}\n */\ngoog.ui.HoverCard = function(\n    isAnchor, opt_checkDescendants, opt_domHelper, opt_triggeringDocument) {\n  goog.ui.AdvancedTooltip.call(this, null, null, opt_domHelper);\n\n  if (goog.isFunction(isAnchor)) {\n    // Override default implementation of `isAnchor_`.\n    this.isAnchor_ = isAnchor;\n  } else {\n    /**\n     * Map of tag names to attribute names that will trigger a hovercard.\n     * @type {Object}\n     * @private\n     */\n    this.anchors_ = isAnchor;\n  }\n\n  /**\n   * Whether anchors may have child elements.  If true, then we need to check\n   * the parent chain of any mouse over event to see if any of those elements\n   * could be anchors.  Default is true.\n   * @type {boolean}\n   * @private\n   */\n  this.checkDescendants_ = opt_checkDescendants != false;\n\n  /**\n   * Array of anchor elements that should be detached when we are no longer\n   * associated with them.\n   * @type {!Array<Element>}\n   * @private\n   */\n  this.tempAttachedAnchors_ = [];\n\n  /**\n   * Document containing the triggering elements, to which we listen for\n   * mouseover events.\n   * @type {Document}\n   * @private\n   */\n  this.document_ = opt_triggeringDocument ||\n      (opt_domHelper ? opt_domHelper.getDocument() : goog.dom.getDocument());\n\n  goog.events.listen(\n      this.document_, goog.events.EventType.MOUSEOVER,\n      this.handleTriggerMouseOver_, false, this);\n};\ngoog.inherits(goog.ui.HoverCard, goog.ui.AdvancedTooltip);\ngoog.tagUnsealableClass(goog.ui.HoverCard);\n\n\n/**\n * Enum for event type fired by HoverCard.\n * @enum {string}\n */\ngoog.ui.HoverCard.EventType = {\n  TRIGGER: 'trigger',\n  CANCEL_TRIGGER: 'canceltrigger',\n  BEFORE_SHOW: goog.ui.PopupBase.EventType.BEFORE_SHOW,\n  SHOW: goog.ui.PopupBase.EventType.SHOW,\n  BEFORE_HIDE: goog.ui.PopupBase.EventType.BEFORE_HIDE,\n  HIDE: goog.ui.PopupBase.EventType.HIDE\n};\n\n\n/** @override */\ngoog.ui.HoverCard.prototype.disposeInternal = function() {\n  goog.ui.HoverCard.superClass_.disposeInternal.call(this);\n\n  goog.events.unlisten(\n      this.document_, goog.events.EventType.MOUSEOVER,\n      this.handleTriggerMouseOver_, false, this);\n};\n\n\n/**\n * Anchor of hovercard currently being shown.  This may be different from\n * `anchor` property if a second hovercard is triggered, when\n * `anchor` becomes the second hovercard while `currentAnchor_`\n * is still the old (but currently displayed) anchor.\n * @type {Element}\n * @private\n */\ngoog.ui.HoverCard.prototype.currentAnchor_;\n\n\n/**\n * Maximum number of levels to search up the dom when checking descendants.\n * @type {number}\n * @private\n */\ngoog.ui.HoverCard.prototype.maxSearchSteps_;\n\n\n/**\n * This function can be overridden by passing a function as the first parameter\n * to the constructor.\n * @param {Node} node Node to test.\n * @return {boolean} Whether or not hovercard should be shown.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.HoverCard.prototype.isAnchor_ = function(node) {\n  return node.tagName in this.anchors_ &&\n      !!node.getAttribute(this.anchors_[node.tagName]);\n};\n\n\n/**\n * If the user mouses over an element with the correct tag and attribute, then\n * trigger the hovercard for that element.  If anchors could have children, then\n * we also need to check the parent chain of the given element.\n * @param {goog.events.Event} e Mouse over event.\n * @private\n */\ngoog.ui.HoverCard.prototype.handleTriggerMouseOver_ = function(e) {\n  var target = /** @type {Element} */ (e.target);\n  // Target might be null when hovering over disabled input textboxes in IE.\n  if (!target) {\n    return;\n  }\n  if (this.isAnchor_(target)) {\n    this.setPosition(null);\n    this.triggerForElement(target);\n  } else if (this.checkDescendants_) {\n    var trigger = goog.dom.getAncestor(\n        target, goog.bind(this.isAnchor_, this), false, this.maxSearchSteps_);\n    if (trigger) {\n      this.setPosition(null);\n      this.triggerForElement(/** @type {!Element} */ (trigger));\n    }\n  }\n};\n\n\n/**\n * Triggers the hovercard to show after a delay.\n * @param {Element} anchorElement Element that is triggering the hovercard.\n * @param {goog.positioning.AbstractPosition=} opt_pos Position to display\n *     hovercard.\n * @param {Object=} opt_data Data to pass to the onTrigger event.\n */\ngoog.ui.HoverCard.prototype.triggerForElement = function(\n    anchorElement, opt_pos, opt_data) {\n  if (anchorElement == this.currentAnchor_) {\n    // Element is already showing, just make sure it doesn't hide.\n    this.clearHideTimer();\n    return;\n  }\n  if (anchorElement == this.anchor) {\n    // Hovercard is pending, no need to retrigger.\n    return;\n  }\n\n  // If a previous hovercard was being triggered, cancel it.\n  this.maybeCancelTrigger_();\n\n  // Create a new event for this trigger\n  var triggerEvent = new goog.ui.HoverCard.TriggerEvent(\n      goog.ui.HoverCard.EventType.TRIGGER, this, anchorElement, opt_data);\n\n  if (!this.getElements().contains(anchorElement)) {\n    this.attach(anchorElement);\n    this.tempAttachedAnchors_.push(anchorElement);\n  }\n  this.anchor = anchorElement;\n  if (!this.onTrigger(triggerEvent)) {\n    this.onCancelTrigger();\n    return;\n  }\n  var pos = opt_pos || this.getPosition();\n  this.startShowTimer(\n      anchorElement,\n      /** @type {goog.positioning.AbstractPosition} */ (pos));\n};\n\n\n/**\n * Sets the current anchor element at the time that the hovercard is shown.\n * @param {Element} anchor New current anchor element, or null if there is\n *     no current anchor.\n * @private\n */\ngoog.ui.HoverCard.prototype.setCurrentAnchor_ = function(anchor) {\n  if (anchor != this.currentAnchor_) {\n    this.detachTempAnchor_(this.currentAnchor_);\n  }\n  this.currentAnchor_ = anchor;\n};\n\n\n/**\n * If given anchor is in the list of temporarily attached anchors, then\n * detach and remove from the list.\n * @param {Element|undefined} anchor Anchor element that we may want to detach\n *     from.\n * @private\n */\ngoog.ui.HoverCard.prototype.detachTempAnchor_ = function(anchor) {\n  if (anchor) {\n    var pos = goog.array.indexOf(this.tempAttachedAnchors_, anchor);\n    if (pos != -1) {\n      this.detach(anchor);\n      this.tempAttachedAnchors_.splice(pos, 1);\n    }\n  }\n};\n\n\n/**\n * Called when an element triggers the hovercard.  This will return false\n * if an event handler sets preventDefault to true, which will prevent\n * the hovercard from being shown.\n * @param {!goog.ui.HoverCard.TriggerEvent} triggerEvent Event object to use\n *     for trigger event.\n * @return {boolean} Whether hovercard should be shown or cancelled.\n * @protected\n */\ngoog.ui.HoverCard.prototype.onTrigger = function(triggerEvent) {\n  return this.dispatchEvent(triggerEvent);\n};\n\n\n/**\n * Abort pending hovercard showing, if any.\n */\ngoog.ui.HoverCard.prototype.cancelTrigger = function() {\n  this.clearShowTimer();\n  this.onCancelTrigger();\n};\n\n\n/**\n * If hovercard is in the process of being triggered, then cancel it.\n * @private\n */\ngoog.ui.HoverCard.prototype.maybeCancelTrigger_ = function() {\n  if (this.getState() == goog.ui.Tooltip.State.WAITING_TO_SHOW ||\n      this.getState() == goog.ui.Tooltip.State.UPDATING) {\n    this.cancelTrigger();\n  }\n};\n\n\n/**\n * This method gets called when we detect that a trigger event will not lead\n * to the hovercard being shown.\n * @protected\n */\ngoog.ui.HoverCard.prototype.onCancelTrigger = function() {\n  var event = new goog.ui.HoverCard.TriggerEvent(\n      goog.ui.HoverCard.EventType.CANCEL_TRIGGER, this, this.anchor || null);\n  this.dispatchEvent(event);\n  this.detachTempAnchor_(this.anchor);\n  delete this.anchor;\n};\n\n\n/**\n * Gets the DOM element that triggered the current hovercard.  Note that in\n * the TRIGGER or CANCEL_TRIGGER events, the current hovercard's anchor may not\n * be the one that caused the event, so use the event's anchor property instead.\n * @return {Element} Object that caused the currently displayed hovercard (or\n *     pending hovercard if none is displayed) to be triggered.\n */\ngoog.ui.HoverCard.prototype.getAnchorElement = function() {\n  // this.currentAnchor_ is only set if the hovercard is showing.  If it isn't\n  // showing yet, then use this.anchor as the pending anchor.\n  return /** @type {Element} */ (this.currentAnchor_ || this.anchor);\n};\n\n\n/**\n * Make sure we detach from temp anchor when we are done displaying hovercard.\n * @protected\n * @override\n */\ngoog.ui.HoverCard.prototype.onHide = function() {\n  goog.ui.HoverCard.superClass_.onHide.call(this);\n  this.setCurrentAnchor_(null);\n};\n\n\n/**\n * This mouse over event is only received if the anchor is already attached.\n * If it was attached manually, then it may need to be triggered.\n * @param {goog.events.BrowserEvent} event Mouse over event.\n * @override\n */\ngoog.ui.HoverCard.prototype.handleMouseOver = function(event) {\n  // If this is a child of a triggering element, find the triggering element.\n  var trigger = this.getAnchorFromElement(\n      /** @type {Element} */ (event.target));\n\n  // If we moused over an element different from the one currently being\n  // triggered (if any), then trigger this new element.\n  if (trigger && trigger != this.anchor) {\n    this.triggerForElement(trigger);\n    return;\n  }\n\n  goog.ui.HoverCard.superClass_.handleMouseOver.call(this, event);\n};\n\n\n/**\n * If the mouse moves out of the trigger while we're being triggered, then\n * cancel it.\n * @param {goog.events.BrowserEvent} event Mouse out or blur event.\n * @override\n */\ngoog.ui.HoverCard.prototype.handleMouseOutAndBlur = function(event) {\n  // Get ready to see if a trigger should be cancelled.\n  var anchor = this.anchor;\n  var state = this.getState();\n  goog.ui.HoverCard.superClass_.handleMouseOutAndBlur.call(this, event);\n  if (state != this.getState() &&\n      (state == goog.ui.Tooltip.State.WAITING_TO_SHOW ||\n       state == goog.ui.Tooltip.State.UPDATING)) {\n    // Tooltip's handleMouseOutAndBlur method sets anchor to null.  Reset\n    // so that the cancel trigger event will have the right data, and so that\n    // it will be properly detached.\n    this.anchor = anchor;\n    this.onCancelTrigger();  // This will remove and detach the anchor.\n  }\n};\n\n\n/**\n * Called by timer from mouse over handler. If this is called and the hovercard\n * is not shown for whatever reason, then send a cancel trigger event.\n * @param {Element} el Element to show tooltip for.\n * @param {goog.positioning.AbstractPosition=} opt_pos Position to display popup\n *     at.\n * @override\n */\ngoog.ui.HoverCard.prototype.maybeShow = function(el, opt_pos) {\n  goog.ui.HoverCard.superClass_.maybeShow.call(this, el, opt_pos);\n\n  if (!this.isVisible()) {\n    this.cancelTrigger();\n  } else {\n    this.setCurrentAnchor_(el);\n  }\n};\n\n\n/**\n * Sets the max number of levels to search up the dom if checking descendants.\n * @param {number} maxSearchSteps Maximum number of levels to search up the\n *     dom if checking descendants.\n */\ngoog.ui.HoverCard.prototype.setMaxSearchSteps = function(maxSearchSteps) {\n  if (!maxSearchSteps) {\n    this.checkDescendants_ = false;\n  } else if (this.checkDescendants_) {\n    this.maxSearchSteps_ = maxSearchSteps;\n  }\n};\n\n\n\n/**\n * Create a trigger event for specified anchor and optional data.\n * @param {goog.ui.HoverCard.EventType} type Event type.\n * @param {goog.ui.HoverCard} target Hovercard that is triggering the event.\n * @param {Element} anchor Element that triggered event.\n * @param {Object=} opt_data Optional data to be available in the TRIGGER event.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.ui.HoverCard.TriggerEvent = function(type, target, anchor, opt_data) {\n  goog.events.Event.call(this, type, target);\n\n  /**\n   * Element that triggered the hovercard event.\n   * @type {Element}\n   */\n  this.anchor = anchor;\n\n  /**\n   * Optional data to be passed to the listener.\n   * @type {Object|undefined}\n   */\n  this.data = opt_data;\n};\ngoog.inherits(goog.ui.HoverCard.TriggerEvent, goog.events.Event);\n","^9I",1579837703000,"^9J",["^9K",["^;;","^<=","~$goog.ui.AdvancedTooltip","^9>","~$goog.ui.Tooltip","^:I","^;8","^;9","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/hovercard.js"],"^:1",["^9K",["~$goog.ui.HoverCard.TriggerEvent","~$goog.ui.HoverCard.EventType","~$goog.ui.HoverCard"]],"^9<",true,"^9=",["^9>","^;9","^;;","^:N","^;8","^:I","^HX","^<=","^HY"]],["^ ","^9A",[1579837703000],"^9B","goog.i18n.uchar.js","^9C",["^9D","goog/i18n/uchar.js"],"^9E","goog/i18n/uchar.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Collection of utility functions for Unicode character.\n *\n */\n\ngoog.provide('goog.i18n.uChar');\n\n\n// Constants for handling Unicode supplementary characters (surrogate pairs).\n\n\n/**\n * The minimum value for Supplementary code points.\n * @type {number}\n * @private\n */\ngoog.i18n.uChar.SUPPLEMENTARY_CODE_POINT_MIN_VALUE_ = 0x10000;\n\n\n/**\n * The highest Unicode code point value (scalar value) according to the Unicode\n * Standard.\n * @type {number}\n * @private\n */\ngoog.i18n.uChar.CODE_POINT_MAX_VALUE_ = 0x10FFFF;\n\n\n/**\n * Lead surrogate minimum value.\n * @type {number}\n * @private\n */\ngoog.i18n.uChar.LEAD_SURROGATE_MIN_VALUE_ = 0xD800;\n\n\n/**\n * Lead surrogate maximum value.\n * @type {number}\n * @private\n */\ngoog.i18n.uChar.LEAD_SURROGATE_MAX_VALUE_ = 0xDBFF;\n\n\n/**\n * Trail surrogate minimum value.\n * @type {number}\n * @private\n */\ngoog.i18n.uChar.TRAIL_SURROGATE_MIN_VALUE_ = 0xDC00;\n\n\n/**\n * Trail surrogate maximum value.\n * @type {number}\n * @private\n */\ngoog.i18n.uChar.TRAIL_SURROGATE_MAX_VALUE_ = 0xDFFF;\n\n\n/**\n * The number of least significant bits of a supplementary code point that in\n * UTF-16 become the least significant bits of the trail surrogate. The rest of\n * the in-use bits of the supplementary code point become the least significant\n * bits of the lead surrogate.\n * @type {number}\n * @private\n */\ngoog.i18n.uChar.TRAIL_SURROGATE_BIT_COUNT_ = 10;\n\n\n/**\n * Gets the U+ notation string of a Unicode character. Ex: 'U+0041' for 'A'.\n * @param {string} ch The given character.\n * @return {string} The U+ notation of the given character.\n */\ngoog.i18n.uChar.toHexString = function(ch) {\n  const chCode = goog.i18n.uChar.toCharCode(ch);\n  const chCodeStr = 'U+' +\n      goog.i18n.uChar.padString_(chCode.toString(16).toUpperCase(), 4, '0');\n\n  return chCodeStr;\n};\n\n\n/**\n * Gets a string padded with given character to get given size.\n * @param {string} str The given string to be padded.\n * @param {number} length The target size of the string.\n * @param {string} ch The character to be padded with.\n * @return {string} The padded string.\n * @private\n */\ngoog.i18n.uChar.padString_ = function(str, length, ch) {\n  while (str.length < length) {\n    str = ch + str;\n  }\n  return str;\n};\n\n\n/**\n * Gets Unicode value of the given character.\n * @param {string} ch The given character, which in the case of a supplementary\n * character is actually a surrogate pair. The remainder of the string is\n * ignored.\n * @return {number} The Unicode value of the character.\n */\ngoog.i18n.uChar.toCharCode = function(ch) {\n  return goog.i18n.uChar.getCodePointAround(ch, 0);\n};\n\n\n/**\n * Gets a character from the given Unicode value. If the given code point is not\n * a valid Unicode code point, null is returned.\n * @param {number} code The Unicode value of the character.\n * @return {?string} The character corresponding to the given Unicode value.\n */\ngoog.i18n.uChar.fromCharCode = function(code) {\n  if (code == null ||\n      !(code >= 0 && code <= goog.i18n.uChar.CODE_POINT_MAX_VALUE_)) {\n    return null;\n  }\n  if (goog.i18n.uChar.isSupplementaryCodePoint(code)) {\n    // First, we split the code point into the trail surrogate part (the\n    // TRAIL_SURROGATE_BIT_COUNT_ least significant bits) and the lead surrogate\n    // part (the rest of the bits, shifted down; note that for now this includes\n    // the supplementary offset, also shifted down, to be subtracted off below).\n    const leadBits = code >> goog.i18n.uChar.TRAIL_SURROGATE_BIT_COUNT_;\n    const trailBits = code &\n        // A bit-mask to get the TRAIL_SURROGATE_BIT_COUNT_ (i.e. 10) least\n        // significant bits. 1 << 10 = 0x0400. 0x0400 - 1 = 0x03FF.\n        ((1 << goog.i18n.uChar.TRAIL_SURROGATE_BIT_COUNT_) - 1);\n\n    // Now we calculate the code point of each surrogate by adding each offset\n    // to the corresponding base code point.\n    const leadCodePoint = leadBits +\n        (goog.i18n.uChar.LEAD_SURROGATE_MIN_VALUE_ -\n         // Subtract off the supplementary offset, which had been shifted down\n         // with the rest of leadBits. We do this here instead of before the\n         // shift in order to save a separate subtraction step.\n         (goog.i18n.uChar.SUPPLEMENTARY_CODE_POINT_MIN_VALUE_ >>\n          goog.i18n.uChar.TRAIL_SURROGATE_BIT_COUNT_));\n    const trailCodePoint =\n        trailBits + goog.i18n.uChar.TRAIL_SURROGATE_MIN_VALUE_;\n\n    // Convert the code points into a 2-character long string.\n    return String.fromCharCode(leadCodePoint) +\n        String.fromCharCode(trailCodePoint);\n  }\n  return String.fromCharCode(code);\n};\n\n\n/**\n * Returns the Unicode code point at the specified index.\n *\n * If the char value specified at the given index is in the leading-surrogate\n * range, and the following index is less than the length of `string`, and\n * the char value at the following index is in the trailing-surrogate range,\n * then the supplementary code point corresponding to this surrogate pair is\n * returned.\n *\n * If the char value specified at the given index is in the trailing-surrogate\n * range, and the preceding index is not before the start of `string`, and\n * the char value at the preceding index is in the leading-surrogate range, then\n * the negated supplementary code point corresponding to this surrogate pair is\n * returned.\n *\n * The negation allows the caller to differentiate between the case where the\n * given index is at the leading surrogate and the one where it is at the\n * trailing surrogate, and thus deduce where the next character starts and\n * preceding character ends.\n *\n * Otherwise, the char value at the given index is returned. Thus, a leading\n * surrogate is returned when it is not followed by a trailing surrogate, and a\n * trailing surrogate is returned when it is not preceded by a leading\n * surrogate.\n *\n * @param {string} string The string.\n * @param {number} index The index from which the code point is to be retrieved.\n * @return {number} The code point at the given index. If the given index is\n * that of the start (i.e. lead surrogate) of a surrogate pair, returns the code\n * point encoded by the pair. If the given index is that of the end (i.e. trail\n * surrogate) of a surrogate pair, returns the negated code pointed encoded by\n * the pair.\n */\ngoog.i18n.uChar.getCodePointAround = function(string, index) {\n  const charCode = string.charCodeAt(index);\n  if (goog.i18n.uChar.isLeadSurrogateCodePoint(charCode) &&\n      index + 1 < string.length) {\n    const trail = string.charCodeAt(index + 1);\n    if (goog.i18n.uChar.isTrailSurrogateCodePoint(trail)) {\n      // Part of a surrogate pair.\n      return /** @type {number} */ (\n          goog.i18n.uChar.buildSupplementaryCodePoint(charCode, trail));\n    }\n  } else if (goog.i18n.uChar.isTrailSurrogateCodePoint(charCode) && index > 0) {\n    const lead = string.charCodeAt(index - 1);\n    if (goog.i18n.uChar.isLeadSurrogateCodePoint(lead)) {\n      // Part of a surrogate pair.\n      const codepoint = /** @type {number} */ (\n          goog.i18n.uChar.buildSupplementaryCodePoint(lead, charCode));\n      return -codepoint;\n    }\n  }\n  return charCode;\n};\n\n\n/**\n * Determines the length of the string needed to represent the specified\n * Unicode code point.\n * @param {number} codePoint\n * @return {number} 2 if codePoint is a supplementary character, 1 otherwise.\n */\ngoog.i18n.uChar.charCount = function(codePoint) {\n  return goog.i18n.uChar.isSupplementaryCodePoint(codePoint) ? 2 : 1;\n};\n\n\n/**\n * Determines whether the specified Unicode code point is in the supplementary\n * Unicode characters range.\n * @param {number} codePoint\n * @return {boolean} Whether then given code point is a supplementary character.\n */\ngoog.i18n.uChar.isSupplementaryCodePoint = function(codePoint) {\n  return codePoint >= goog.i18n.uChar.SUPPLEMENTARY_CODE_POINT_MIN_VALUE_ &&\n      codePoint <= goog.i18n.uChar.CODE_POINT_MAX_VALUE_;\n};\n\n\n/**\n * Gets whether the given code point is a leading surrogate character.\n * @param {number} codePoint\n * @return {boolean} Whether the given code point is a leading surrogate\n * character.\n */\ngoog.i18n.uChar.isLeadSurrogateCodePoint = function(codePoint) {\n  return codePoint >= goog.i18n.uChar.LEAD_SURROGATE_MIN_VALUE_ &&\n      codePoint <= goog.i18n.uChar.LEAD_SURROGATE_MAX_VALUE_;\n};\n\n\n/**\n * Gets whether the given code point is a trailing surrogate character.\n * @param {number} codePoint\n * @return {boolean} Whether the given code point is a trailing surrogate\n * character.\n */\ngoog.i18n.uChar.isTrailSurrogateCodePoint = function(codePoint) {\n  return codePoint >= goog.i18n.uChar.TRAIL_SURROGATE_MIN_VALUE_ &&\n      codePoint <= goog.i18n.uChar.TRAIL_SURROGATE_MAX_VALUE_;\n};\n\n\n/**\n * Composes a supplementary Unicode code point from the given UTF-16 surrogate\n * pair. If leadSurrogate isn't a leading surrogate code point or trailSurrogate\n * isn't a trailing surrogate code point, null is returned.\n * @param {number} lead The leading surrogate code point.\n * @param {number} trail The trailing surrogate code point.\n * @return {?number} The supplementary Unicode code point obtained by decoding\n * the given UTF-16 surrogate pair.\n */\ngoog.i18n.uChar.buildSupplementaryCodePoint = function(lead, trail) {\n  if (goog.i18n.uChar.isLeadSurrogateCodePoint(lead) &&\n      goog.i18n.uChar.isTrailSurrogateCodePoint(trail)) {\n    const shiftedLeadOffset =\n        (lead << goog.i18n.uChar.TRAIL_SURROGATE_BIT_COUNT_) -\n        (goog.i18n.uChar.LEAD_SURROGATE_MIN_VALUE_\n         << goog.i18n.uChar.TRAIL_SURROGATE_BIT_COUNT_);\n    const trailOffset = trail - goog.i18n.uChar.TRAIL_SURROGATE_MIN_VALUE_ +\n        goog.i18n.uChar.SUPPLEMENTARY_CODE_POINT_MIN_VALUE_;\n    return shiftedLeadOffset + trailOffset;\n  }\n  return null;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/uchar.js"],"^:1",["^9K",["~$goog.i18n.uChar"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.events.keys.js","^9C",["^9D","goog/events/keys.js"],"^9E","goog/events/keys.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Constant declarations for common key values.\n *\n */\n\ngoog.provide('goog.events.Keys');\n\n\n/**\n * Key values for common characters.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/key\n * @enum {string}\n */\ngoog.events.Keys = {\n  ALT: 'Meta',\n  ALTGRAPH: 'AltGraph',\n  CTRL: 'Control',\n  DOWN: 'ArrowDown',\n  END: 'End',\n  ENTER: 'Enter',\n  ESCAPE: 'Escape',\n  HOME: 'Home',\n  LEFT: 'ArrowLeft',\n  PAGE_DOWN: 'PageDown',\n  PAGE_UP: 'PageUp',\n  RIGHT: 'ArrowRight',\n  SHIFT: 'Shift',\n  SPACE: ' ',\n  TAB: 'Tab',\n  UP: 'ArrowUp',\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/keys.js"],"^:1",["^9K",["~$goog.events.Keys"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.module.loader.js","^9C",["^9D","goog/module/loader.js"],"^9E","goog/module/loader.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n *\n * @fileoverview This class supports the dynamic loading of compiled\n * javascript modules at runtime, as described in the designdoc.\n *\n *   <http://go/js_modules_design>\n *\n */\n\ngoog.provide('goog.module.Loader');\n\ngoog.require('goog.Timer');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.legacyconversions');\n/** @suppress {extraRequire} */\ngoog.require('goog.module');\ngoog.require('goog.object');\n\n\n\n/**\n * The dynamic loading functionality is defined as a class. The class\n * will be used as singleton. There is, however, a two step\n * initialization procedure because parameters need to be passed to\n * the goog.module.Loader instance.\n *\n * @constructor\n * @final\n */\ngoog.module.Loader = function() {\n  /**\n   * Map of module name/array of {symbol name, callback} pairs that are pending\n   * to be loaded.\n   * @type {Object}\n   * @private\n   */\n  this.pending_ = {};\n\n  /**\n   * Provides associative access to each module and the symbols of each module\n   * that have already been loaded (one lookup for the module, another lookup\n   * on the module for the symbol).\n   * @type {Object}\n   * @private\n   */\n  this.modules_ = {};\n\n  /**\n   * Map of module name to module url. Used to avoid fetching the same URL\n   * twice by keeping track of in-flight URLs.\n   * Note: this allows two modules to be bundled into the same file.\n   * @type {Object}\n   * @private\n   */\n  this.pendingModuleUrls_ = {};\n\n  /**\n   * The base url to load modules from. This property will be set in init().\n   * @type {?string}\n   * @private\n   */\n  this.urlBase_ = null;\n\n  /**\n   * Array of modules that have been requested before init() was called.\n   * If require() is called before init() was called, the required\n   * modules can obviously not yet be loaded, because their URL is\n   * unknown. The modules that are requested before init() are\n   * therefore stored in this array, and they are loaded at init()\n   * time.\n   * @type {Array<string>}\n   * @private\n   */\n  this.pendingBeforeInit_ = [];\n};\ngoog.addSingletonGetter(goog.module.Loader);\n\n\n/**\n * Wrapper of goog.module.Loader.require() for use in modules.\n * See method goog.module.Loader.require() for\n * explanation of params.\n *\n * @param {string} module The name of the module. Usually, the value\n *     is defined as a constant whose name starts with MOD_.\n * @param {number|string} symbol The ID of the symbol. Usually, the value is\n *     defined as a constant whose name starts with SYM_.\n * @param {Function} callback This function will be called with the\n *     resolved symbol as the argument once the module is loaded.\n */\ngoog.module.Loader.require = function(module, symbol, callback) {\n  goog.module.Loader.getInstance().require(module, symbol, callback);\n};\n\n\n/**\n * Wrapper of goog.module.Loader.provide() for use in modules\n * See method goog.module.Loader.provide() for explanation of params.\n *\n * @param {string} module The name of the module. Cf. parameter module\n *     of method require().\n * @param {number|string=} opt_symbol The symbol being defined, or nothing\n *     when all symbols of the module are defined. Cf. parameter symbol of\n *     method require().\n * @param {Object=} opt_object The object bound to the symbol, or nothing when\n *     all symbols of the module are defined.\n */\ngoog.module.Loader.provide = function(module, opt_symbol, opt_object) {\n  goog.module.Loader.getInstance().provide(module, opt_symbol, opt_object);\n};\n\n\n/**\n * Wrapper of init() so that we only need to export this single\n * identifier instead of three. See method goog.module.Loader.init() for\n * explanation of param.\n *\n * @param {string} urlBase The URL of the base library.\n * @param {Function=} opt_urlFunction Function that creates the URL for the\n *     module file. It will be passed the base URL for module files and the\n *     module name and should return the fully-formed URL to the module file to\n *     load.\n */\ngoog.module.Loader.init = function(urlBase, opt_urlFunction) {\n  goog.module.Loader.getInstance().init(urlBase, opt_urlFunction);\n};\n\n\n/**\n * Produces a function that delegates all its arguments to a\n * dynamically loaded function. This is used to export dynamically\n * loaded functions.\n *\n * @param {string} module The module to load from.\n * @param {number|string} symbol The ID of the symbol to load from the module.\n *     This symbol must resolve to a function.\n * @return {!Function} A function that forwards all its arguments to\n *     the dynamically loaded function specified by module and symbol.\n */\ngoog.module.Loader.loaderCall = function(module, symbol) {\n  return function() {\n    var args = arguments;\n    goog.module.Loader.require(\n        module, symbol, function(f) { f.apply(null, args); });\n  };\n};\n\n\n/**\n * Creates a full URL to the compiled module code given a base URL and a\n * module name. By default it's urlBase + '_' + module + '.js'.\n * @param {string} urlBase URL to the module files.\n * @param {string} module Module name.\n * @return {string} The full url to the module binary.\n * @private\n */\ngoog.module.Loader.prototype.getModuleUrl_ = function(urlBase, module) {\n  return urlBase + '_' + module + '.js';\n};\n\n\n/**\n * The globally exported name of the load callback. Matches the\n * definition in the js_module_binary() BUILD rule.\n * @type {string}\n */\ngoog.module.Loader.LOAD_CALLBACK = '__gjsload__';\n\n\n/**\n * Loads the module by evaluating the javascript text in the current\n * scope. Uncompiled, base identifiers are visible in the global scope;\n * when compiled they are visible in the closure of the anonymous\n * namespace. Notice that this cannot be replaced by the global eval,\n * because the global eval isn't in the scope of the anonymous\n * namespace function that the jscompiled code lives in.\n *\n * @param {string} t_ The javascript text to evaluate. IMPORTANT: The\n *   name of the identifier is chosen so that it isn't compiled and\n *   hence cannot shadow compiled identifiers in the surrounding scope.\n * @private\n */\ngoog.module.Loader.loaderEval_ = function(t_) {\n  eval(t_);\n};\n\n\n/**\n * Initializes the Loader to be fully functional. Also executes load\n * requests that were received before initialization. Must be called\n * exactly once, with the URL of the base library. Module URLs are\n * derived from the URL of the base library by inserting the module\n * name, preceded by a period, before the .js prefix of the base URL.\n *\n * @param {string} baseUrl The URL of the base library.\n * @param {Function=} opt_urlFunction Function that creates the URL for the\n *     module file. It will be passed the base URL for module files and the\n *     module name and should return the fully-formed URL to the module file to\n *     load.\n */\ngoog.module.Loader.prototype.init = function(baseUrl, opt_urlFunction) {\n  // For the use by the module wrappers, loaderEval_ is exported to\n  // the page. Note that, despite the name, this is not part of the\n  // API, so it is here and not in api_app.js. Cf. BUILD. Note this is\n  // done before the first load requests are sent.\n  goog.exportSymbol(\n      goog.module.Loader.LOAD_CALLBACK, goog.module.Loader.loaderEval_);\n\n  this.urlBase_ = baseUrl.replace(/\\.js$/, '');\n  if (opt_urlFunction) {\n    this.getModuleUrl_ = opt_urlFunction;\n  }\n\n  goog.array.forEach(\n      this.pendingBeforeInit_, function(module) { this.load_(module); }, this);\n  goog.array.clear(this.pendingBeforeInit_);\n};\n\n\n/**\n * Requests the loading of a symbol from a module. When the module is\n * loaded, the requested symbol will be passed as argument to the\n * function callback.\n *\n * @param {string} module The name of the module. Usually, the value\n *     is defined as a constant whose name starts with MOD_.\n * @param {number|string} symbol The ID of the symbol. Usually, the value is\n *     defined as a constant whose name starts with SYM_.\n * @param {Function} callback This function will be called with the\n *     resolved symbol as the argument once the module is loaded.\n */\ngoog.module.Loader.prototype.require = function(module, symbol, callback) {\n  var pending = this.pending_;\n  var modules = this.modules_;\n  if (modules[module]) {\n    // already loaded\n    callback(modules[module][symbol]);\n  } else if (pending[module]) {\n    // loading is pending from another require of the same module\n    pending[module].push([symbol, callback]);\n  } else {\n    // not loaded, and not requested\n    pending[module] = [[symbol, callback]];  // Yes, really [[ ]].\n    // Defer loading to initialization if Loader is not yet\n    // initialized, otherwise load the module.\n    if (typeof this.urlBase_ === 'string') {\n      this.load_(module);\n    } else {\n      this.pendingBeforeInit_.push(module);\n    }\n  }\n};\n\n\n/**\n * Registers a symbol in a loaded module. When called without symbol,\n * registers the module to be fully loaded and executes all callbacks\n * from pending require() callbacks for this module.\n * @param {string} module The name of the module. Cf. parameter module\n *     of method require().\n * @param {number|string=} opt_symbol The symbol being defined, or nothing when\n *     all symbols of the module are defined. Cf. parameter symbol of method\n *     require().\n * @param {Object=} opt_object The object bound to the symbol, or nothing when\n *     all symbols of the module are defined.\n * @suppress {strictPrimitiveOperators} Part of the go/strict_warnings_migration\n */\ngoog.module.Loader.prototype.provide = function(\n    module, opt_symbol, opt_object) {\n  var modules = this.modules_;\n  var pending = this.pending_;\n  if (!modules[module]) {\n    modules[module] = {};\n  }\n  if (opt_object) {\n    // When an object is provided, just register it.\n    modules[module][opt_symbol] = opt_object;\n  } else if (pending[module]) {\n    // When no object is provided, and there are pending require()\n    // callbacks for this module, execute them.\n    for (var i = 0; i < pending[module].length; ++i) {\n      var symbol = pending[module][i][0];\n      var callback = pending[module][i][1];\n      callback(modules[module][symbol]);\n    }\n    delete pending[module];\n    delete this.pendingModuleUrls_[module];\n  }\n};\n\n\n/**\n * Starts to load a module. Assumes that init() was called.\n *\n * @param {string} module The name of the module.\n * @private\n */\ngoog.module.Loader.prototype.load_ = function(module) {\n  // NOTE(user): If the module request happens inside a click handler\n  // (presumably inside any user event handler, but the onload event\n  // handler is fine), IE will load the script but not execute\n  // it. Thus we break out of the current flow of control before we do\n  // the load. For the record, for IE it would have been enough to\n  // just defer the assignment to src. Safari doesn't execute the\n  // script if the assignment to src happens *after* the script\n  // element is inserted into the DOM.\n  goog.Timer.callOnce(function() {\n    // The module might have been registered in the interim (if fetched as part\n    // of another module fetch because they share the same url)\n    if (this.modules_[module]) {\n      return;\n    }\n\n    goog.asserts.assertString(this.urlBase_);\n    var url = this.getModuleUrl_(this.urlBase_, module);\n\n    // Check if specified URL is already in flight\n    var urlInFlight = goog.object.containsValue(this.pendingModuleUrls_, url);\n    this.pendingModuleUrls_[module] = url;\n    if (urlInFlight) {\n      return;\n    }\n\n    var s = goog.dom.createDom(\n        goog.dom.TagName.SCRIPT, {'type': 'text/javascript'});\n    goog.dom.safe.setScriptSrc(\n        s, goog.html.legacyconversions.trustedResourceUrlFromString(url));\n    document.body.appendChild(s);\n  }, 0, this);\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^><","^?:","^9>","^;P","~$goog.html.legacyconversions","^@B","^;9","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/module/loader.js"],"^:1",["^9K",["~$goog.module.Loader"]],"^9<",true,"^9=",["^9>","^><","^;9","^:E","^;;","^;=","^@B","^I3","^?:","^;P"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.ac.remotearraymatcher.js","^9C",["^9D","goog/ui/ac/remotearraymatcher.js"],"^9E","goog/ui/ac/remotearraymatcher.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class that retrieves autocomplete matches via an ajax call.\n *\n */\n\ngoog.provide('goog.ui.ac.RemoteArrayMatcher');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.Uri');\ngoog.require('goog.events');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.XhrIo');\n\n\n\n/**\n * An array matcher that requests matches via ajax.\n * @param {string} url The Uri which generates the auto complete matches.  The\n *     search term is passed to the server as the 'token' query param.\n * @param {boolean=} opt_noSimilar If true, request that the server does not do\n *     similarity matches for the input token against the dictionary.\n *     The value is sent to the server as the 'use_similar' query param which is\n *     either \"1\" (opt_noSimilar==false) or \"0\" (opt_noSimilar==true).\n * @param {goog.net.XmlHttpFactory=} opt_xmlHttpFactory Specify the\n *     XmlHttpFactory used to retrieve the matches.\n * @constructor\n * @extends {goog.Disposable}\n */\ngoog.ui.ac.RemoteArrayMatcher = function(\n    url, opt_noSimilar, opt_xmlHttpFactory) {\n  goog.Disposable.call(this);\n\n  /**\n   * The base URL for the ajax call.  The token and max_matches are added as\n   * query params.\n   * @type {string}\n   * @private\n   */\n  this.url_ = url;\n\n  /**\n   * Whether similar matches should be found as well.  This is sent as a hint\n   * to the server only.\n   * @type {boolean}\n   * @private\n   */\n  this.useSimilar_ = !opt_noSimilar;\n\n  /**\n   * The XhrIo object used for making remote requests.  When a new request\n   * is made, the current one is aborted and the new one sent.\n   * @type {goog.net.XhrIo}\n   * @private\n   */\n  this.xhr_ = new goog.net.XhrIo(opt_xmlHttpFactory);\n};\ngoog.inherits(goog.ui.ac.RemoteArrayMatcher, goog.Disposable);\n\n\n/**\n * The HTTP send method (GET, POST) to use when making the ajax call.\n * @type {string}\n * @private\n */\ngoog.ui.ac.RemoteArrayMatcher.prototype.method_ = 'GET';\n\n\n/**\n * Data to submit during a POST.\n * @type {string|undefined}\n * @private\n */\ngoog.ui.ac.RemoteArrayMatcher.prototype.content_ = undefined;\n\n\n/**\n * Headers to send with every HTTP request.\n * @type {?Object|?goog.structs.Map}\n * @private\n */\ngoog.ui.ac.RemoteArrayMatcher.prototype.headers_ = null;\n\n\n/**\n * Key to the listener on XHR. Used to clear previous listeners.\n * @type {?goog.events.Key}\n * @private\n */\ngoog.ui.ac.RemoteArrayMatcher.prototype.lastListenerKey_ = null;\n\n\n/**\n * Set the send method (\"GET\", \"POST\").\n * @param {string} method The send method; default: GET.\n */\ngoog.ui.ac.RemoteArrayMatcher.prototype.setMethod = function(method) {\n  this.method_ = method;\n};\n\n\n/**\n * Set the post data.\n * @param {string} content Post data.\n */\ngoog.ui.ac.RemoteArrayMatcher.prototype.setContent = function(content) {\n  this.content_ = content;\n};\n\n\n/**\n * Set the HTTP headers.\n * @param {Object|goog.structs.Map} headers Map of headers to add to the\n *     request.\n */\ngoog.ui.ac.RemoteArrayMatcher.prototype.setHeaders = function(headers) {\n  this.headers_ = headers;\n};\n\n\n/**\n * Set the timeout interval.\n * @param {number} interval Number of milliseconds after which an\n *     incomplete request will be aborted; 0 means no timeout is set.\n */\ngoog.ui.ac.RemoteArrayMatcher.prototype.setTimeoutInterval = function(\n    interval) {\n  this.xhr_.setTimeoutInterval(interval);\n};\n\n\n/**\n * Builds a complete GET-style URL, given the base URI and autocomplete related\n * parameter values.\n * <b>Override this to build any customized lookup URLs.</b>\n * <b>Can be used to change request method and any post content as well.</b>\n * @param {string} uri The base URI of the request target.\n * @param {string} token Current token in autocomplete.\n * @param {number} maxMatches Maximum number of matches required.\n * @param {boolean} useSimilar A hint to the server.\n * @param {string=} opt_fullString Complete text in the input element.\n * @return {?string} The complete url. Return null if no request should be sent.\n * @protected\n */\ngoog.ui.ac.RemoteArrayMatcher.prototype.buildUrl = function(\n    uri, token, maxMatches, useSimilar, opt_fullString) {\n  var url = new goog.Uri(uri);\n  url.setParameterValue('token', token);\n  url.setParameterValue('max_matches', String(maxMatches));\n  url.setParameterValue('use_similar', String(Number(useSimilar)));\n  return url.toString();\n};\n\n\n/**\n * Returns whether the suggestions should be updated?\n * <b>Override this to prevent updates eg - when token is empty.</b>\n * @param {string} uri The base URI of the request target.\n * @param {string} token Current token in autocomplete.\n * @param {number} maxMatches Maximum number of matches required.\n * @param {boolean} useSimilar A hint to the server.\n * @param {string=} opt_fullString Complete text in the input element.\n * @return {boolean} Whether new matches be requested.\n * @protected\n */\ngoog.ui.ac.RemoteArrayMatcher.prototype.shouldRequestMatches = function(\n    uri, token, maxMatches, useSimilar, opt_fullString) {\n  return true;\n};\n\n\n/**\n * Parses and retrieves the array of suggestions from XHR response.\n * <b>Override this if the response is not a simple JSON array.</b>\n * @param {string} responseText The XHR response text.\n * @return {Array<string>} The array of suggestions.\n * @protected\n */\ngoog.ui.ac.RemoteArrayMatcher.prototype.parseResponseText = function(\n    responseText) {\n\n  var matches = [];\n  // If there is no response text, JSON.parse will throw a syntax error.\n  if (responseText) {\n\n    try {\n      matches = JSON.parse(responseText);\n    } catch (exception) {\n    }\n  }\n  return /** @type {Array<string>} */ (matches);\n};\n\n\n/**\n * Handles the XHR response.\n * @param {string} token The XHR autocomplete token.\n * @param {Function} matchHandler The AutoComplete match handler.\n * @param {goog.events.Event} event The XHR success event.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.ac.RemoteArrayMatcher.prototype.xhrCallback = function(\n    token, matchHandler, event) {\n  var text = event.target.getResponseText();\n  matchHandler(token, this.parseResponseText(text));\n};\n\n\n/**\n * Retrieve a set of matching rows from the server via ajax.\n * @param {string} token The text that should be matched; passed to the server\n *     as the 'token' query param.\n * @param {number} maxMatches The maximum number of matches requested from the\n *     server; passed as the 'max_matches' query param.  The server is\n *     responsible for limiting the number of matches that are returned.\n * @param {Function} matchHandler Callback to execute on the result after\n *     matching.\n * @param {string=} opt_fullString The full string from the input box.\n */\ngoog.ui.ac.RemoteArrayMatcher.prototype.requestMatchingRows = function(\n    token, maxMatches, matchHandler, opt_fullString) {\n\n  if (!this.shouldRequestMatches(\n          this.url_, token, maxMatches, this.useSimilar_, opt_fullString)) {\n    return;\n  }\n  // Set the query params on the URL.\n  var url = this.buildUrl(\n      this.url_, token, maxMatches, this.useSimilar_, opt_fullString);\n  if (!url) {\n    // Do nothing if there is no URL.\n    return;\n  }\n\n  // The callback evals the server response and calls the match handler on\n  // the array of matches.\n  var callback = goog.bind(this.xhrCallback, this, token, matchHandler);\n\n  // Abort the current request and issue the new one; prevent requests from\n  // being queued up by the browser with a slow server\n  if (this.xhr_.isActive()) {\n    this.xhr_.abort();\n  }\n  // This ensures if previous XHR is aborted or ends with error, the\n  // corresponding success-callbacks are cleared.\n  if (this.lastListenerKey_) {\n    goog.events.unlistenByKey(this.lastListenerKey_);\n  }\n  // Listen once ensures successful callback gets cleared by itself.\n  this.lastListenerKey_ =\n      goog.events.listenOnce(this.xhr_, goog.net.EventType.SUCCESS, callback);\n  this.xhr_.send(url, this.method_, this.content_, this.headers_);\n};\n\n\n/** @override */\ngoog.ui.ac.RemoteArrayMatcher.prototype.disposeInternal = function() {\n  this.xhr_.dispose();\n  goog.ui.ac.RemoteArrayMatcher.superClass_.disposeInternal.call(this);\n};\n","^9I",1579837703000,"^9J",["^9K",["^;N","^<S","^9>","^>0","^:7","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/ac/remotearraymatcher.js"],"^:1",["^9K",["~$goog.ui.ac.RemoteArrayMatcher"]],"^9<",true,"^9=",["^9>","^:7","^<S","^:N","^>0","^;N"]],["^ ","^9A",[1579837703000],"^9B","goog.proto2.message.js","^9C",["^9D","goog/proto2/message.js"],"^9E","goog/proto2/message.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Protocol Buffer Message base class.\n * @suppress {unusedPrivateMembers} For descriptor_ declaration.\n */\n\ngoog.provide('goog.proto2.Message');\n\ngoog.forwardDeclare('goog.proto2.LazyDeserializer');\ngoog.require('goog.asserts');\ngoog.require('goog.proto2.Descriptor');\ngoog.require('goog.proto2.FieldDescriptor');  // circular reference\n\n\n\n/**\n * Abstract base class for all Protocol Buffer 2 messages. It will be\n * subclassed in the code generated by the Protocol Compiler. Any other\n * subclasses are prohibited.\n * @constructor\n */\ngoog.proto2.Message = function() {\n  /**\n   * Stores the field values in this message. Keyed by the tag of the fields.\n   * @type {!Object}\n   * @private\n   */\n  this.values_ = {};\n\n  /**\n   * Stores the field information (i.e. metadata) about this message.\n   * @type {Object<number, !goog.proto2.FieldDescriptor>}\n   * @private\n   */\n  this.fields_ = this.getDescriptor().getFieldsMap();\n\n  /**\n   * The lazy deserializer for this message instance, if any.\n   * @type {?goog.proto2.LazyDeserializer}\n   * @private\n   */\n  this.lazyDeserializer_ = null;\n\n  /**\n   * A map of those fields deserialized, from tag number to their deserialized\n   * value.\n   * @type {?Object}\n   * @private\n   */\n  this.deserializedFields_ = null;\n};\n\n\n/**\n * An enumeration defining the possible field types.\n * Should be a mirror of that defined in descriptor.h.\n *\n * TODO(user): Remove this alias.  The code generator generates code that\n * references this enum, so it needs to exist until the code generator is\n * changed.  The enum was moved to from Message to FieldDescriptor to avoid a\n * dependency cycle.\n *\n * Use goog.proto2.FieldDescriptor.FieldType instead.\n *\n * @enum {number}\n */\ngoog.proto2.Message.FieldType = {\n  DOUBLE: 1,\n  FLOAT: 2,\n  INT64: 3,\n  UINT64: 4,\n  INT32: 5,\n  FIXED64: 6,\n  FIXED32: 7,\n  BOOL: 8,\n  STRING: 9,\n  GROUP: 10,\n  MESSAGE: 11,\n  BYTES: 12,\n  UINT32: 13,\n  ENUM: 14,\n  SFIXED32: 15,\n  SFIXED64: 16,\n  SINT32: 17,\n  SINT64: 18\n};\n\n\n/**\n * All instances of goog.proto2.Message should have a static descriptor_\n * property. The Descriptor will be deserialized lazily in the getDescriptor()\n * method.\n *\n * This declaration is just here for documentation purposes.\n * goog.proto2.Message does not have its own descriptor.\n *\n * @type {undefined}\n * @private\n */\ngoog.proto2.Message.descriptor_;\n\n\n/**\n * Initializes the message with a lazy deserializer and its associated data.\n * This method should be called by internal methods ONLY.\n *\n * @param {goog.proto2.LazyDeserializer} deserializer The lazy deserializer to\n *   use to decode the data on the fly.\n *\n * @param {?} data The data to decode/deserialize.\n */\ngoog.proto2.Message.prototype.initializeForLazyDeserializer = function(\n    deserializer, data) {\n\n  this.lazyDeserializer_ = deserializer;\n  this.values_ = data;\n  this.deserializedFields_ = {};\n};\n\n\n/**\n * Sets the value of an unknown field, by tag.\n *\n * @param {number} tag The tag of an unknown field (must be >= 1).\n * @param {*} value The value for that unknown field.\n */\ngoog.proto2.Message.prototype.setUnknown = function(tag, value) {\n  goog.asserts.assert(\n      !this.fields_[tag], 'Field is not unknown in this message');\n  goog.asserts.assert(\n      tag >= 1, 'Tag ' + tag + ' has value \"' + value + '\" in descriptor ' +\n          this.getDescriptor().getName());\n\n  goog.asserts.assert(value !== null, 'Value cannot be null');\n\n  this.values_[tag] = value;\n  if (this.deserializedFields_) {\n    delete this.deserializedFields_[tag];\n  }\n};\n\n\n/**\n * Iterates over all the unknown fields in the message.\n *\n * @param {function(this:T, number, *)} callback A callback method\n *     which gets invoked for each unknown field.\n * @param {T=} opt_scope The scope under which to execute the callback.\n *     If not given, the current message will be used.\n * @template T\n */\ngoog.proto2.Message.prototype.forEachUnknown = function(callback, opt_scope) {\n  var scope = opt_scope || this;\n  for (var key in this.values_) {\n    var keyNum = Number(key);\n    if (!this.fields_[keyNum]) {\n      callback.call(scope, keyNum, this.values_[key]);\n    }\n  }\n};\n\n\n/**\n * Returns the descriptor which describes the current message.\n *\n * This only works if we assume people never subclass protobufs.\n *\n * @return {!goog.proto2.Descriptor} The descriptor.\n */\ngoog.proto2.Message.prototype.getDescriptor = goog.abstractMethod;\n\n\n/**\n * Returns whether there is a value stored at the field specified by the\n * given field descriptor.\n *\n * @param {goog.proto2.FieldDescriptor} field The field for which to check\n *     if there is a value.\n *\n * @return {boolean} True if a value was found.\n */\ngoog.proto2.Message.prototype.has = function(field) {\n  goog.asserts.assert(\n      field.getContainingType() == this.getDescriptor(),\n      'The current message does not contain the given field');\n\n  return this.has$Value(field.getTag());\n};\n\n\n/**\n * Returns the array of values found for the given repeated field.\n *\n * @param {goog.proto2.FieldDescriptor} field The field for which to\n *     return the values.\n *\n * @return {!Array<?>} The values found.\n */\ngoog.proto2.Message.prototype.arrayOf = function(field) {\n  goog.asserts.assert(\n      field.getContainingType() == this.getDescriptor(),\n      'The current message does not contain the given field');\n\n  return this.array$Values(field.getTag());\n};\n\n\n/**\n * Returns the number of values stored in the given field.\n *\n * @param {goog.proto2.FieldDescriptor} field The field for which to count\n *     the number of values.\n *\n * @return {number} The count of the values in the given field.\n */\ngoog.proto2.Message.prototype.countOf = function(field) {\n  goog.asserts.assert(\n      field.getContainingType() == this.getDescriptor(),\n      'The current message does not contain the given field');\n\n  return this.count$Values(field.getTag());\n};\n\n\n/**\n * Returns the value stored at the field specified by the\n * given field descriptor.\n *\n * @param {goog.proto2.FieldDescriptor} field The field for which to get the\n *     value.\n * @param {number=} opt_index If the field is repeated, the index to use when\n *     looking up the value.\n *\n * @return {?} The value found or null if none.\n */\ngoog.proto2.Message.prototype.get = function(field, opt_index) {\n  goog.asserts.assert(\n      field.getContainingType() == this.getDescriptor(),\n      'The current message does not contain the given field');\n\n  return this.get$Value(field.getTag(), opt_index);\n};\n\n\n/**\n * Returns the value stored at the field specified by the\n * given field descriptor or the default value if none exists.\n *\n * @param {goog.proto2.FieldDescriptor} field The field for which to get the\n *     value.\n * @param {number=} opt_index If the field is repeated, the index to use when\n *     looking up the value.\n *\n * @return {?} The value found or the default if none.\n */\ngoog.proto2.Message.prototype.getOrDefault = function(field, opt_index) {\n  goog.asserts.assert(\n      field.getContainingType() == this.getDescriptor(),\n      'The current message does not contain the given field');\n\n  return this.get$ValueOrDefault(field.getTag(), opt_index);\n};\n\n\n/**\n * Stores the given value to the field specified by the\n * given field descriptor. Note that the field must not be repeated.\n *\n * @param {goog.proto2.FieldDescriptor} field The field for which to set\n *     the value.\n * @param {*} value The new value for the field.\n */\ngoog.proto2.Message.prototype.set = function(field, value) {\n  goog.asserts.assert(\n      field.getContainingType() == this.getDescriptor(),\n      'The current message does not contain the given field');\n\n  this.set$Value(field.getTag(), value);\n};\n\n\n/**\n * Adds the given value to the field specified by the\n * given field descriptor. Note that the field must be repeated.\n *\n * @param {goog.proto2.FieldDescriptor} field The field in which to add the\n *     the value.\n * @param {*} value The new value to add to the field.\n */\ngoog.proto2.Message.prototype.add = function(field, value) {\n  goog.asserts.assert(\n      field.getContainingType() == this.getDescriptor(),\n      'The current message does not contain the given field');\n\n  this.add$Value(field.getTag(), value);\n};\n\n\n/**\n * Clears the field specified.\n *\n * @param {goog.proto2.FieldDescriptor} field The field to clear.\n */\ngoog.proto2.Message.prototype.clear = function(field) {\n  goog.asserts.assert(\n      field.getContainingType() == this.getDescriptor(),\n      'The current message does not contain the given field');\n\n  this.clear$Field(field.getTag());\n};\n\n\n/**\n * Compares this message with another one ignoring the unknown fields.\n * @param {?} other The other message.\n * @return {boolean} Whether they are equal. Returns false if the `other`\n *     argument is a different type of message or not a message.\n */\ngoog.proto2.Message.prototype.equals = function(other) {\n  if (!other || this.constructor != other.constructor) {\n    return false;\n  }\n\n  var fields = this.getDescriptor().getFields();\n  for (var i = 0; i < fields.length; i++) {\n    var field = fields[i];\n    var tag = field.getTag();\n    if (this.has$Value(tag) != other.has$Value(tag)) {\n      return false;\n    }\n\n    if (this.has$Value(tag)) {\n      var isComposite = field.isCompositeType();\n\n      var fieldsEqual = function(value1, value2) {\n        return isComposite ? value1.equals(value2) : value1 == value2;\n      };\n\n      var thisValue = this.getValueForTag_(tag);\n      var otherValue = other.getValueForTag_(tag);\n\n      if (field.isRepeated()) {\n        // In this case thisValue and otherValue are arrays.\n        if (thisValue.length != otherValue.length) {\n          return false;\n        }\n        for (var j = 0; j < thisValue.length; j++) {\n          if (!fieldsEqual(thisValue[j], otherValue[j])) {\n            return false;\n          }\n        }\n      } else if (!fieldsEqual(thisValue, otherValue)) {\n        return false;\n      }\n    }\n  }\n\n  return true;\n};\n\n\n/**\n * Recursively copies the known fields from the given message to this message.\n * Removes the fields which are not present in the source message.\n * @param {!goog.proto2.Message} message The source message.\n */\ngoog.proto2.Message.prototype.copyFrom = function(message) {\n  goog.asserts.assert(\n      this.constructor == message.constructor,\n      'The source message must have the same type.');\n\n  if (this != message) {\n    this.values_ = {};\n    if (this.deserializedFields_) {\n      this.deserializedFields_ = {};\n    }\n    this.mergeFrom(message);\n  }\n};\n\n\n/**\n * Merges the given message into this message.\n *\n * Singular fields will be overwritten, except for embedded messages which will\n * be merged. Repeated fields will be concatenated.\n * @param {!goog.proto2.Message} message The source message.\n */\ngoog.proto2.Message.prototype.mergeFrom = function(message) {\n  goog.asserts.assert(\n      this.constructor == message.constructor,\n      'The source message must have the same type.');\n  var fields = this.getDescriptor().getFields();\n\n  for (var i = 0; i < fields.length; i++) {\n    var field = fields[i];\n    var tag = field.getTag();\n    if (message.has$Value(tag)) {\n      if (this.deserializedFields_) {\n        delete this.deserializedFields_[field.getTag()];\n      }\n\n      var isComposite = field.isCompositeType();\n      if (field.isRepeated()) {\n        var values = message.array$Values(tag);\n        for (var j = 0; j < values.length; j++) {\n          this.add$Value(tag, isComposite ? values[j].clone() : values[j]);\n        }\n      } else {\n        var value = message.getValueForTag_(tag);\n        if (isComposite) {\n          var child = this.getValueForTag_(tag);\n          if (child) {\n            child.mergeFrom(value);\n          } else {\n            this.set$Value(tag, value.clone());\n          }\n        } else {\n          this.set$Value(tag, value);\n        }\n      }\n    }\n  }\n};\n\n\n/**\n * @return {!goog.proto2.Message} Recursive clone of the message only including\n *     the known fields.\n */\ngoog.proto2.Message.prototype.clone = function() {\n  /** @type {!goog.proto2.Message} */\n  var clone = new this.constructor;\n  clone.copyFrom(this);\n  return clone;\n};\n\n\n/**\n * Fills in the protocol buffer with default values. Any fields that are\n * already set will not be overridden.\n * @param {boolean} simpleFieldsToo If true, all fields will be initialized;\n *     if false, only the nested messages and groups.\n */\ngoog.proto2.Message.prototype.initDefaults = function(simpleFieldsToo) {\n  var fields = this.getDescriptor().getFields();\n  for (var i = 0; i < fields.length; i++) {\n    var field = fields[i];\n    var tag = field.getTag();\n    var isComposite = field.isCompositeType();\n\n    // Initialize missing fields.\n    if (!this.has$Value(tag) && !field.isRepeated()) {\n      if (isComposite) {\n        this.values_[tag] = new /** @type {Function} */ (field.getNativeType());\n      } else if (simpleFieldsToo) {\n        this.values_[tag] = field.getDefaultValue();\n      }\n    }\n\n    // Fill in the existing composite fields recursively.\n    if (isComposite) {\n      if (field.isRepeated()) {\n        var values = this.array$Values(tag);\n        for (var j = 0; j < values.length; j++) {\n          values[j].initDefaults(simpleFieldsToo);\n        }\n      } else {\n        this.get$Value(tag).initDefaults(simpleFieldsToo);\n      }\n    }\n  }\n};\n\n\n/**\n * Returns the whether or not the field indicated by the given tag\n * has a value.\n *\n * GENERATED CODE USE ONLY. Basis of the has{Field} methods.\n *\n * @param {number} tag The tag.\n *\n * @return {boolean} Whether the message has a value for the field.\n */\ngoog.proto2.Message.prototype.has$Value = function(tag) {\n  return this.values_[tag] != null;\n};\n\n\n/**\n * Returns the value for the given tag number. If a lazy deserializer is\n * instantiated, lazily deserializes the field if required before returning the\n * value.\n *\n * @param {number} tag The tag number.\n * @return {?} The corresponding value, if any.\n * @private\n */\ngoog.proto2.Message.prototype.getValueForTag_ = function(tag) {\n  // Retrieve the current value, which may still be serialized.\n  var value = this.values_[tag];\n  if (value == null) {\n    return null;\n  }\n\n  // If we have a lazy deserializer, then ensure that the field is\n  // properly deserialized.\n  if (this.lazyDeserializer_) {\n    // If the tag is not deserialized, then we must do so now. Deserialize\n    // the field's value via the deserializer.\n    if (!(tag in /** @type {!Object} */ (this.deserializedFields_))) {\n      var deserializedValue = this.lazyDeserializer_.deserializeField(\n          this, this.fields_[tag], value);\n      this.deserializedFields_[tag] = deserializedValue;\n      return deserializedValue;\n    }\n\n    return this.deserializedFields_[tag];\n  }\n\n  // Otherwise, just return the value.\n  return value;\n};\n\n\n/**\n * Gets the value at the field indicated by the given tag.\n *\n * GENERATED CODE USE ONLY. Basis of the get{Field} methods.\n *\n * @param {number} tag The field's tag index.\n * @param {number=} opt_index If the field is a repeated field, the index\n *     at which to get the value.\n *\n * @return {?} The value found or null for none.\n * @protected\n */\ngoog.proto2.Message.prototype.get$Value = function(tag, opt_index) {\n  var value = this.getValueForTag_(tag);\n\n  if (this.fields_[tag].isRepeated()) {\n    var index = opt_index || 0;\n    goog.asserts.assert(\n        index >= 0 && index < value.length,\n        'Given index %s is out of bounds.  Repeated field length: %s', index,\n        value.length);\n    return value[index];\n  }\n\n  return value;\n};\n\n\n/**\n * Gets the value at the field indicated by the given tag or the default value\n * if none.\n *\n * GENERATED CODE USE ONLY. Basis of the get{Field} methods.\n *\n * @param {number} tag The field's tag index.\n * @param {number=} opt_index If the field is a repeated field, the index\n *     at which to get the value.\n *\n * @return {?} The value found or the default value if none set.\n * @protected\n */\ngoog.proto2.Message.prototype.get$ValueOrDefault = function(tag, opt_index) {\n  if (!this.has$Value(tag)) {\n    // Return the default value.\n    var field = this.fields_[tag];\n    return field.getDefaultValue();\n  }\n\n  return this.get$Value(tag, opt_index);\n};\n\n\n/**\n * Gets the values at the field indicated by the given tag.\n *\n * GENERATED CODE USE ONLY. Basis of the {field}Array methods.\n *\n * @param {number} tag The field's tag index.\n *\n * @return {!Array<?>} The values found. If none, returns an empty array.\n * @protected\n */\ngoog.proto2.Message.prototype.array$Values = function(tag) {\n  var value = this.getValueForTag_(tag);\n  return value || [];\n};\n\n\n/**\n * Returns the number of values stored in the field by the given tag.\n *\n * GENERATED CODE USE ONLY. Basis of the {field}Count methods.\n *\n * @param {number} tag The tag.\n *\n * @return {number} The number of values.\n * @protected\n */\ngoog.proto2.Message.prototype.count$Values = function(tag) {\n  var field = this.fields_[tag];\n  if (field.isRepeated()) {\n    return this.has$Value(tag) ? this.values_[tag].length : 0;\n  } else {\n    return this.has$Value(tag) ? 1 : 0;\n  }\n};\n\n\n/**\n * Sets the value of the *non-repeating* field indicated by the given tag.\n *\n * GENERATED CODE USE ONLY. Basis of the set{Field} methods.\n *\n * @param {number} tag The field's tag index.\n * @param {*} value The field's value.\n * @protected\n */\ngoog.proto2.Message.prototype.set$Value = function(tag, value) {\n  if (goog.asserts.ENABLE_ASSERTS) {\n    var field = this.fields_[tag];\n    this.checkFieldType_(field, value);\n  }\n\n  this.values_[tag] = value;\n  if (this.deserializedFields_) {\n    this.deserializedFields_[tag] = value;\n  }\n};\n\n\n/**\n * Adds the value to the *repeating* field indicated by the given tag.\n *\n * GENERATED CODE USE ONLY. Basis of the add{Field} methods.\n *\n * @param {number} tag The field's tag index.\n * @param {*} value The value to add.\n * @protected\n */\ngoog.proto2.Message.prototype.add$Value = function(tag, value) {\n  if (goog.asserts.ENABLE_ASSERTS) {\n    var field = this.fields_[tag];\n    this.checkFieldType_(field, value);\n  }\n\n  if (!this.values_[tag]) {\n    this.values_[tag] = [];\n  }\n\n  this.values_[tag].push(value);\n  if (this.deserializedFields_) {\n    delete this.deserializedFields_[tag];\n  }\n};\n\n\n/**\n * Ensures that the value being assigned to the given field\n * is valid.\n *\n * @param {!goog.proto2.FieldDescriptor} field The field being assigned.\n * @param {*} value The value being assigned.\n * @private\n */\ngoog.proto2.Message.prototype.checkFieldType_ = function(field, value) {\n  if (field.getFieldType() == goog.proto2.FieldDescriptor.FieldType.ENUM) {\n    goog.asserts.assertNumber(value);\n  } else {\n    goog.asserts.assert(Object(value).constructor == field.getNativeType());\n  }\n};\n\n\n/**\n * Clears the field specified by tag.\n *\n * GENERATED CODE USE ONLY. Basis of the clear{Field} methods.\n *\n * @param {number} tag The tag of the field to clear.\n * @protected\n */\ngoog.proto2.Message.prototype.clear$Field = function(tag) {\n  delete this.values_[tag];\n  if (this.deserializedFields_) {\n    delete this.deserializedFields_[tag];\n  }\n};\n\n\n/**\n * Creates the metadata descriptor representing the definition of this message.\n *\n * @param {function(new:goog.proto2.Message)} messageType Constructor for the\n *     message type to which this metadata applies.\n * @param {!Object} metadataObj The object containing the metadata.\n * @return {!goog.proto2.Descriptor} The new descriptor.\n */\ngoog.proto2.Message.createDescriptor = function(messageType, metadataObj) {\n  var fields = [];\n  var descriptorInfo = metadataObj[0];\n\n  for (var key in metadataObj) {\n    if (key != 0) {\n      // Create the field descriptor.\n      fields.push(\n          new goog.proto2.FieldDescriptor(messageType, key, metadataObj[key]));\n    }\n  }\n\n  return new goog.proto2.Descriptor(messageType, descriptorInfo, fields);\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.proto2.Descriptor","^9>","~$goog.proto2.FieldDescriptor"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/proto2/message.js"],"^:1",["^9K",["~$goog.proto2.Message"]],"^9<",true,"^9=",["^9>","^:E","^I6","^I7"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.style.layoutasserts.js","^9C",["^9D","goog/testing/style/layoutasserts.js"],"^9E","goog/testing/style/layoutasserts.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A utility class for making layout assertions. This is a port\n * of http://go/layoutbot.java\n * See {@link http://go/layouttesting}.\n */\n\ngoog.setTestOnly('goog.testing.style.layoutasserts');\ngoog.provide('goog.testing.style.layoutasserts');\n\ngoog.require('goog.style');\ngoog.require('goog.testing.asserts');\ngoog.require('goog.testing.style');\n\n\n/**\n * Asserts that an element has:\n *   1 - a CSS rendering the makes the element visible.\n *   2 - a non-zero width and height.\n * @param {Element|string} a The element or optionally the comment string.\n * @param {Element=} opt_b The element when a comment string is present.\n */\nvar assertIsVisible = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var element = nonCommentArg(1, 1, arguments);\n\n  _assert(\n      commentArg(1, arguments), goog.testing.style.isVisible(element) &&\n          goog.testing.style.hasVisibleDimensions(element),\n      'Specified element should be visible.');\n};\n\n\n/**\n * The counter assertion of assertIsVisible().\n * @param {Element|string} a The element or optionally the comment string.\n * @param {Element=} opt_b The element when a comment string is present.\n */\nvar assertNotVisible = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var element = nonCommentArg(1, 1, arguments);\n  if (!element) {\n    return;\n  }\n\n  _assert(\n      commentArg(1, arguments), !goog.testing.style.isVisible(element) ||\n          !goog.testing.style.hasVisibleDimensions(element),\n      'Specified element should not be visible.');\n};\n\n\n/**\n * Asserts that the two specified elements intersect.\n * @param {Element|string} a The first element or optionally the comment string.\n * @param {Element} b The second element or the first element if comment string\n *     is present.\n * @param {Element=} opt_c The second element if comment string is present.\n */\nvar assertIntersect = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var element = nonCommentArg(1, 2, arguments);\n  var otherElement = nonCommentArg(2, 2, arguments);\n\n  _assert(\n      commentArg(1, arguments),\n      goog.testing.style.intersects(element, otherElement),\n      'Elements should intersect.');\n};\n\n\n/**\n * Asserts that the two specified elements do not intersect.\n * @param {Element|string} a The first element or optionally the comment string.\n * @param {Element} b The second element or the first element if comment string\n *     is present.\n * @param {Element=} opt_c The second element if comment string is present.\n */\nvar assertNoIntersect = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var element = nonCommentArg(1, 2, arguments);\n  var otherElement = nonCommentArg(2, 2, arguments);\n\n  _assert(\n      commentArg(1, arguments),\n      !goog.testing.style.intersects(element, otherElement),\n      'Elements should not intersect.');\n};\n\n\n/**\n * Asserts that the element must have the specified width.\n * @param {Element|string} a The first element or optionally the comment string.\n * @param {Element} b The second element or the first element if comment string\n *     is present.\n * @param {Element=} opt_c The second element if comment string is present.\n */\nvar assertWidth = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var element = nonCommentArg(1, 2, arguments);\n  var width = nonCommentArg(2, 2, arguments);\n  var size = goog.style.getSize(element);\n  var elementWidth = size.width;\n\n  _assert(\n      commentArg(1, arguments),\n      goog.testing.style.layoutasserts.isWithinThreshold_(\n          width, elementWidth, 0 /* tolerance */),\n      'Element should have width ' + width + ' but was ' + elementWidth + '.');\n};\n\n\n/**\n * Asserts that the element must have the specified width within the specified\n * tolerance.\n * @param {Element|string} a The element or optionally the comment string.\n * @param {number|Element} b The height or the element if comment string is\n *     present.\n * @param {number} c The tolerance or the height if comment string is\n *     present.\n * @param {number=} opt_d The tolerance if comment string is present.\n */\nvar assertWidthWithinTolerance = function(a, b, c, opt_d) {\n  _validateArguments(3, arguments);\n  var element = nonCommentArg(1, 3, arguments);\n  var width = nonCommentArg(2, 3, arguments);\n  var tolerance = nonCommentArg(3, 3, arguments);\n  var size = goog.style.getSize(element);\n  var elementWidth = size.width;\n\n  _assert(\n      commentArg(1, arguments),\n      goog.testing.style.layoutasserts.isWithinThreshold_(\n          width, elementWidth, tolerance),\n      'Element width(' + elementWidth + ') should be within given width(' +\n          width + ') with tolerance value of ' + tolerance + '.');\n};\n\n\n/**\n * Asserts that the element must have the specified height.\n * @param {Element|string} a The first element or optionally the comment string.\n * @param {Element} b The second element or the first element if comment string\n *     is present.\n * @param {Element=} opt_c The second element if comment string is present.\n */\nvar assertHeight = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var element = nonCommentArg(1, 2, arguments);\n  var height = nonCommentArg(2, 2, arguments);\n  var size = goog.style.getSize(element);\n  var elementHeight = size.height;\n\n  _assert(\n      commentArg(1, arguments),\n      goog.testing.style.layoutasserts.isWithinThreshold_(\n          height, elementHeight, 0 /* tolerance */),\n      'Element should have height ' + height + '.');\n};\n\n\n/**\n * Asserts that the element must have the specified height within the specified\n * tolerance.\n * @param {Element|string} a The element or optionally the comment string.\n * @param {number|Element} b The height or the element if comment string is\n *     present.\n * @param {number} c The tolerance or the height if comment string is\n *     present.\n * @param {number=} opt_d The tolerance if comment string is present.\n */\nvar assertHeightWithinTolerance = function(a, b, c, opt_d) {\n  _validateArguments(3, arguments);\n  var element = nonCommentArg(1, 3, arguments);\n  var height = nonCommentArg(2, 3, arguments);\n  var tolerance = nonCommentArg(3, 3, arguments);\n  var size = goog.style.getSize(element);\n  var elementHeight = size.height;\n\n  _assert(\n      commentArg(1, arguments),\n      goog.testing.style.layoutasserts.isWithinThreshold_(\n          height, elementHeight, tolerance),\n      'Element width(' + elementHeight + ') should be within given width(' +\n          height + ') with tolerance value of ' + tolerance + '.');\n};\n\n\n/**\n * Asserts that the first element is to the left of the second element.\n * @param {Element|string} a The first element or optionally the comment string.\n * @param {Element} b The second element or the first element if comment string\n *     is present.\n * @param {Element=} opt_c The second element if comment string is present.\n */\nvar assertIsLeftOf = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var element = nonCommentArg(1, 2, arguments);\n  var otherElement = nonCommentArg(2, 2, arguments);\n  var elementRect = goog.style.getBounds(element);\n  var otherElementRect = goog.style.getBounds(otherElement);\n\n  _assert(\n      commentArg(1, arguments), elementRect.left < otherElementRect.left,\n      'Elements should be left to right.');\n};\n\n\n/**\n * Asserts that the first element is strictly left of the second element.\n * @param {Element|string} a The first element or optionally the comment string.\n * @param {Element} b The second element or the first element if comment string\n *     is present.\n * @param {Element=} opt_c The second element if comment string is present.\n */\nvar assertIsStrictlyLeftOf = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var element = nonCommentArg(1, 2, arguments);\n  var otherElement = nonCommentArg(2, 2, arguments);\n  var elementRect = goog.style.getBounds(element);\n  var otherElementRect = goog.style.getBounds(otherElement);\n\n  _assert(\n      commentArg(1, arguments),\n      elementRect.left + elementRect.width < otherElementRect.left,\n      'Elements should be strictly left to right.');\n};\n\n\n/**\n * Asserts that the first element is higher than the second element.\n * @param {Element|string} a The first element or optionally the comment string.\n * @param {Element} b The second element or the first element if comment string\n *     is present.\n * @param {Element=} opt_c The second element if comment string is present.\n */\nvar assertIsAbove = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var element = nonCommentArg(1, 2, arguments);\n  var otherElement = nonCommentArg(2, 2, arguments);\n  var elementRect = goog.style.getBounds(element);\n  var otherElementRect = goog.style.getBounds(otherElement);\n\n  _assert(\n      commentArg(1, arguments), elementRect.top < otherElementRect.top,\n      'Elements should be top to bottom.');\n};\n\n\n/**\n * Asserts that the first element is strictly higher than the second element.\n * @param {Element|string} a The first element or optionally the comment string.\n * @param {Element} b The second element or the first element if comment string\n *     is present.\n * @param {Element=} opt_c The second element if comment string is present.\n */\nvar assertIsStrictlyAbove = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var element = nonCommentArg(1, 2, arguments);\n  var otherElement = nonCommentArg(2, 2, arguments);\n  var elementRect = goog.style.getBounds(element);\n  var otherElementRect = goog.style.getBounds(otherElement);\n\n  _assert(\n      commentArg(1, arguments),\n      elementRect.top + elementRect.height < otherElementRect.top,\n      'Elements should be strictly top to bottom.');\n};\n\n\n/**\n * Asserts that the first element's bounds contain the bounds of the second\n * element.\n * @param {Element|string} a The first element or optionally the comment string.\n * @param {Element} b The second element or the first element if comment string\n *     is present.\n * @param {Element=} opt_c The second element if comment string is present.\n */\nvar assertContained = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var element = nonCommentArg(1, 2, arguments);\n  var otherElement = nonCommentArg(2, 2, arguments);\n  var elementRect = goog.style.getBounds(element);\n  var otherElementRect = goog.style.getBounds(otherElement);\n\n  _assert(\n      commentArg(1, arguments), elementRect.contains(otherElementRect),\n      'Element should be contained within the other element.');\n};\n\n\n/**\n * Returns true if the difference between val1 and val2 is less than or equal to\n * the threashold.\n * @param {number} val1 The first value.\n * @param {number} val2 The second value.\n * @param {number} threshold The threshold value.\n * @return {boolean} Whether or not the the values are within the threshold.\n * @private\n */\ngoog.testing.style.layoutasserts.isWithinThreshold_ = function(\n    val1, val2, threshold) {\n  return Math.abs(val1 - val2) <= threshold;\n};\n","^9I",1579837703000,"^9J",["^9K",["^>X","^9>","~$goog.testing.style","^<3"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/style/layoutasserts.js"],"^:1",["^9K",["~$goog.testing.style.layoutasserts"]],"^9<",true,"^9=",["^9>","^<3","^>X","^I9"]],["^ ","^9A",[1579837703000],"^9B","goog.graphics.rectelement.js","^9C",["^9D","goog/graphics/rectelement.js"],"^9E","goog/graphics/rectelement.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A thin wrapper around the DOM element for rectangles.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.graphics.RectElement');\n\ngoog.require('goog.graphics.StrokeAndFillElement');\n\n\n\n/**\n * Interface for a graphics rectangle element.\n * You should not construct objects from this constructor. The graphics\n * will return an implementation of this interface for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.AbstractGraphics} graphics The graphics creating\n *     this element.\n * @param {goog.graphics.Stroke?} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill?} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.StrokeAndFillElement}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n */\ngoog.graphics.RectElement = function(element, graphics, stroke, fill) {\n  goog.graphics.StrokeAndFillElement.call(\n      this, element, graphics, stroke, fill);\n};\ngoog.inherits(goog.graphics.RectElement, goog.graphics.StrokeAndFillElement);\n\n\n/**\n * Update the position of the rectangle.\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n */\ngoog.graphics.RectElement.prototype.setPosition = goog.abstractMethod;\n\n\n/**\n * Update the size of the rectangle.\n * @param {number} width Width of rectangle.\n * @param {number} height Height of rectangle.\n */\ngoog.graphics.RectElement.prototype.setSize = goog.abstractMethod;\n","^9I",1579837703000,"^9J",["^9K",["^9>","^;A"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/rectelement.js"],"^:1",["^9K",["^@9"]],"^9<",true,"^9=",["^9>","^;A"]],["^ ","^9A",[1579837703000],"^9B","goog.storage.storage.js","^9C",["^9D","goog/storage/storage.js"],"^9E","goog/storage/storage.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a convenient API for data persistence using a selected\n * data storage mechanism.\n *\n */\n\ngoog.provide('goog.storage.Storage');\n\ngoog.forwardDeclare('goog.storage.mechanism.Mechanism');\ngoog.require('goog.json');\ngoog.require('goog.storage.ErrorCode');\n\n\n\n/**\n * The base implementation for all storage APIs.\n *\n * @param {!goog.storage.mechanism.Mechanism} mechanism The underlying\n *     storage mechanism.\n * @constructor\n * @struct\n */\ngoog.storage.Storage = function(mechanism) {\n  /**\n   * The mechanism used to persist key-value pairs.\n   *\n   * @protected {goog.storage.mechanism.Mechanism}\n   */\n  this.mechanism = mechanism;\n};\n\n\n/**\n * Sets an item in the data storage.\n *\n * @param {string} key The key to set.\n * @param {*} value The value to serialize to a string and save.\n */\ngoog.storage.Storage.prototype.set = function(key, value) {\n  if (value === undefined) {\n    this.mechanism.remove(key);\n    return;\n  }\n  this.mechanism.set(key, goog.json.serialize(value));\n};\n\n\n/**\n * Gets an item from the data storage.\n *\n * @param {string} key The key to get.\n * @return {*} Deserialized value or undefined if not found.\n */\ngoog.storage.Storage.prototype.get = function(key) {\n  var json;\n  try {\n    json = this.mechanism.get(key);\n  } catch (e) {\n    // If, for any reason, the value returned by a mechanism's get method is not\n    // a string, an exception is thrown.  In this case, we must fail gracefully\n    // instead of propagating the exception to clients.  See b/8095488 for\n    // details.\n    return undefined;\n  }\n  if (json === null) {\n    return undefined;\n  }\n\n  try {\n    return JSON.parse(json);\n  } catch (e) {\n    throw goog.storage.ErrorCode.INVALID_VALUE;\n  }\n};\n\n\n/**\n * Removes an item from the data storage.\n *\n * @param {string} key The key to remove.\n */\ngoog.storage.Storage.prototype.remove = function(key) {\n  this.mechanism.remove(key);\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.storage.ErrorCode","^<A","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/storage.js"],"^:1",["^9K",["~$goog.storage.Storage"]],"^9<",true,"^9=",["^9>","^<A","^I;"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.tabpane.js","^9C",["^9D","goog/ui/tabpane.js"],"^9E","goog/ui/tabpane.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview TabPane widget implementation.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.ui.TabPane');\ngoog.provide('goog.ui.TabPane.Events');\ngoog.provide('goog.ui.TabPane.TabLocation');\ngoog.provide('goog.ui.TabPane.TabPage');\ngoog.provide('goog.ui.TabPaneEvent');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.html.SafeStyleSheet');\ngoog.require('goog.style');\n\n\n\n/**\n * TabPane widget. All children already inside the tab pane container element\n * will be be converted to tabs. Each tab is represented by a goog.ui.TabPane.\n * TabPage object. Further pages can be constructed either from an existing\n * container or created from scratch.\n *\n * @param {Element} el Container element to create the tab pane out of.\n * @param {goog.ui.TabPane.TabLocation=} opt_tabLocation Location of the tabs\n *     in relation to the content container. Default is top.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @param {boolean=} opt_useMouseDown Whether to use MOUSEDOWN instead of CLICK\n *     for tab changes.\n * @extends {goog.events.EventTarget}\n * @constructor\n * @see ../demos/tabpane.html\n * @deprecated Use goog.ui.TabBar instead.\n */\ngoog.ui.TabPane = function(\n    el, opt_tabLocation, opt_domHelper, opt_useMouseDown) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * DomHelper used to interact with the document, allowing components to be\n   * created in a different window.  This property is considered protected;\n   * subclasses of Component may refer to it directly.\n   * @type {goog.dom.DomHelper}\n   * @protected\n   * @suppress {underscore|visibility}\n   */\n  this.dom_ = opt_domHelper || goog.dom.getDomHelper();\n\n  /**\n   * Tab pane element.\n   * @type {Element}\n   * @private\n   */\n  this.el_ = el;\n\n  /**\n   * Collection of tab panes.\n   * @type {Array<goog.ui.TabPane.TabPage>}\n   * @private\n   */\n  this.pages_ = [];\n\n  /**\n   * Location of the tabs with respect to the content box.\n   * @type {goog.ui.TabPane.TabLocation}\n   * @private\n   */\n  this.tabLocation_ =\n      opt_tabLocation ? opt_tabLocation : goog.ui.TabPane.TabLocation.TOP;\n\n  /**\n   * Whether to use MOUSEDOWN instead of CLICK for tab change events. This\n   * fixes some focus problems on Safari/Chrome.\n   * @type {boolean}\n   * @private\n   */\n  this.useMouseDown_ = !!opt_useMouseDown;\n\n  this.create_();\n};\ngoog.inherits(goog.ui.TabPane, goog.events.EventTarget);\ngoog.tagUnsealableClass(goog.ui.TabPane);\n\n\n/**\n * Element containing the tab buttons.\n * @type {Element}\n * @private\n */\ngoog.ui.TabPane.prototype.elButtonBar_;\n\n\n/**\n * Element containing the tab pages.\n * @type {Element}\n * @private\n */\ngoog.ui.TabPane.prototype.elContent_;\n\n\n/**\n * Selected page.\n * @type {goog.ui.TabPane.TabPage?}\n * @private\n */\ngoog.ui.TabPane.prototype.selected_;\n\n\n/**\n * Constants for event names\n *\n * @const\n */\ngoog.ui.TabPane.Events = {\n  CHANGE: 'change'\n};\n\n\n/**\n * Enum for representing the location of the tabs in relation to the content.\n *\n * @enum {number}\n */\ngoog.ui.TabPane.TabLocation = {\n  TOP: 0,\n  BOTTOM: 1,\n  LEFT: 2,\n  RIGHT: 3\n};\n\n\n/**\n * Creates HTML nodes for tab pane.\n *\n * @private\n */\ngoog.ui.TabPane.prototype.create_ = function() {\n  this.el_.className = goog.getCssName('goog-tabpane');\n\n  var nodes = this.getChildNodes_();\n\n  // Create tab strip\n  this.elButtonBar_ = this.dom_.createDom(\n      goog.dom.TagName.UL,\n      {'className': goog.getCssName('goog-tabpane-tabs'), 'tabIndex': '0'});\n\n  // Create content area\n  this.elContent_ = this.dom_.createDom(\n      goog.dom.TagName.DIV, goog.getCssName('goog-tabpane-cont'));\n  this.el_.appendChild(this.elContent_);\n\n  var element = goog.asserts.assertElement(this.el_);\n\n  switch (this.tabLocation_) {\n    case goog.ui.TabPane.TabLocation.TOP:\n      element.insertBefore(this.elButtonBar_, this.elContent_);\n      element.insertBefore(this.createClear_(), this.elContent_);\n      goog.dom.classlist.add(element, goog.getCssName('goog-tabpane-top'));\n      break;\n    case goog.ui.TabPane.TabLocation.BOTTOM:\n      element.appendChild(this.elButtonBar_);\n      element.appendChild(this.createClear_());\n      goog.dom.classlist.add(element, goog.getCssName('goog-tabpane-bottom'));\n      break;\n    case goog.ui.TabPane.TabLocation.LEFT:\n      element.insertBefore(this.elButtonBar_, this.elContent_);\n      goog.dom.classlist.add(element, goog.getCssName('goog-tabpane-left'));\n      break;\n    case goog.ui.TabPane.TabLocation.RIGHT:\n      element.insertBefore(this.elButtonBar_, this.elContent_);\n      goog.dom.classlist.add(element, goog.getCssName('goog-tabpane-right'));\n      break;\n    default:\n      throw new Error('Invalid tab location');\n  }\n\n  // Listen for click and keydown events on header\n  this.elButtonBar_.tabIndex = 0;\n  goog.events.listen(\n      this.elButtonBar_, this.useMouseDown_ ? goog.events.EventType.MOUSEDOWN :\n                                              goog.events.EventType.CLICK,\n      this.onHeaderClick_, false, this);\n  goog.events.listen(\n      this.elButtonBar_, goog.events.EventType.KEYDOWN, this.onHeaderKeyDown_,\n      false, this);\n\n  this.createPages_(nodes);\n};\n\n\n/**\n * Creates the HTML node for the clearing div, and associated style in\n * the <HEAD>.\n *\n * @return {!Element} Reference to a DOM div node.\n * @private\n */\ngoog.ui.TabPane.prototype.createClear_ = function() {\n  var clearFloatStyle = goog.html.SafeStyleSheet.createRule(\n      '.' + goog.getCssName('goog-tabpane-clear'),\n      {'clear': 'both', 'height': '0', 'overflow': 'hidden'});\n  goog.style.installSafeStyleSheet(clearFloatStyle);\n  return this.dom_.createDom(\n      goog.dom.TagName.DIV, goog.getCssName('goog-tabpane-clear'));\n};\n\n\n/** @override */\ngoog.ui.TabPane.prototype.disposeInternal = function() {\n  goog.ui.TabPane.superClass_.disposeInternal.call(this);\n  goog.events.unlisten(\n      this.elButtonBar_, this.useMouseDown_ ? goog.events.EventType.MOUSEDOWN :\n                                              goog.events.EventType.CLICK,\n      this.onHeaderClick_, false, this);\n  goog.events.unlisten(\n      this.elButtonBar_, goog.events.EventType.KEYDOWN, this.onHeaderKeyDown_,\n      false, this);\n  delete this.el_;\n  this.elButtonBar_ = null;\n  this.elContent_ = null;\n};\n\n\n/**\n * @return {!Array<Element>} The element child nodes of tab pane container.\n * @private\n */\ngoog.ui.TabPane.prototype.getChildNodes_ = function() {\n  var nodes = [];\n\n  var child = goog.dom.getFirstElementChild(this.el_);\n  while (child) {\n    nodes.push(child);\n    child = goog.dom.getNextElementSibling(child);\n  }\n\n  return nodes;\n};\n\n\n/**\n * Creates pages out of a collection of elements.\n *\n * @param {Array<Element>} nodes Array of elements to create pages out of.\n * @private\n */\ngoog.ui.TabPane.prototype.createPages_ = function(nodes) {\n  for (var node, i = 0; node = nodes[i]; i++) {\n    this.addPage(new goog.ui.TabPane.TabPage(node));\n  }\n};\n\n\n/**\n * Adds a page to the tab pane.\n *\n * @param {goog.ui.TabPane.TabPage} page Tab page to add.\n * @param {number=} opt_index Zero based index to insert tab at. Inserted at the\n *                           end if not specified.\n */\ngoog.ui.TabPane.prototype.addPage = function(page, opt_index) {\n  // If page is already in another tab pane it's removed from that one before it\n  // can be added to this one.\n  if (page.parent_ && page.parent_ != this &&\n      page.parent_ instanceof goog.ui.TabPane) {\n    page.parent_.removePage(page);\n  }\n\n  // Insert page at specified position\n  var index = this.pages_.length;\n  if (opt_index !== undefined && opt_index != index) {\n    index = opt_index;\n    this.pages_.splice(index, 0, page);\n    this.elButtonBar_.insertBefore(\n        page.elTitle_, this.elButtonBar_.childNodes[index]);\n  }\n\n  // Append page to end\n  else {\n    this.pages_.push(page);\n    this.elButtonBar_.appendChild(page.elTitle_);\n  }\n\n  page.setParent_(this, index);\n\n  // Select first page and fire change event\n  if (!this.selected_) {\n    this.selected_ = page;\n    this.dispatchEvent(\n        new goog.ui.TabPaneEvent(\n            goog.ui.TabPane.Events.CHANGE, this, this.selected_));\n  }\n\n  // Move page content to the tab pane and update visibility.\n  this.elContent_.appendChild(page.elContent_);\n  page.setVisible_(page == this.selected_);\n\n  // Update index for following pages\n  for (var pg, i = index + 1; pg = this.pages_[i]; i++) {\n    pg.index_ = i;\n  }\n};\n\n\n/**\n * Removes the specified page from the tab pane.\n *\n * @param {goog.ui.TabPane.TabPage|number} page Reference to tab page or zero\n *     based index.\n */\ngoog.ui.TabPane.prototype.removePage = function(page) {\n  if (typeof page === 'number') {\n    page = this.pages_[page];\n  }\n  this.pages_.splice(page.index_, 1);\n  page.setParent_(null);\n\n  goog.dom.removeNode(page.elTitle_);\n  goog.dom.removeNode(page.elContent_);\n\n  for (var pg, i = 0; pg = this.pages_[i]; i++) {\n    pg.setParent_(this, i);\n  }\n};\n\n\n/**\n * Gets the tab page by zero based index.\n *\n * @param {number} index Index of page to return.\n * @return {goog.ui.TabPane.TabPage?} page The tab page.\n */\ngoog.ui.TabPane.prototype.getPage = function(index) {\n  return this.pages_[index];\n};\n\n\n/**\n * Sets the selected tab page by object reference.\n *\n * @param {goog.ui.TabPane.TabPage} page Tab page to select.\n */\ngoog.ui.TabPane.prototype.setSelectedPage = function(page) {\n  if (page.isEnabled() && (!this.selected_ || page != this.selected_)) {\n    this.selected_.setVisible_(false);\n    page.setVisible_(true);\n    this.selected_ = page;\n\n    // Fire changed event\n    this.dispatchEvent(\n        new goog.ui.TabPaneEvent(\n            goog.ui.TabPane.Events.CHANGE, this, this.selected_));\n  }\n};\n\n\n/**\n * Sets the selected tab page by zero based index.\n *\n * @param {number} index Index of page to select.\n */\ngoog.ui.TabPane.prototype.setSelectedIndex = function(index) {\n  if (index >= 0 && index < this.pages_.length) {\n    this.setSelectedPage(this.pages_[index]);\n  }\n};\n\n\n/**\n * @return {number} The index for the selected tab page or -1 if no page is\n *     selected.\n */\ngoog.ui.TabPane.prototype.getSelectedIndex = function() {\n  return this.selected_ ? /** @type {number} */ (this.selected_.index_) : -1;\n};\n\n\n/**\n * @return {goog.ui.TabPane.TabPage?} The selected tab page.\n */\ngoog.ui.TabPane.prototype.getSelectedPage = function() {\n  return this.selected_ || null;\n};\n\n\n/**\n * @return {Element} The element that contains the tab pages.\n */\ngoog.ui.TabPane.prototype.getContentElement = function() {\n  return this.elContent_ || null;\n};\n\n\n/**\n * @return {Element} The main element for the tabpane.\n */\ngoog.ui.TabPane.prototype.getElement = function() {\n  return this.el_ || null;\n};\n\n\n/**\n * Click event handler for header element, handles clicks on tabs.\n * @param {goog.events.BrowserEvent} event Click event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.TabPane.prototype.onHeaderClick_ = function(event) {\n  var el = event.target;\n\n  // Determine index if a tab (li element) was clicked.\n  while (el != this.elButtonBar_) {\n    if (el.tagName == goog.dom.TagName.LI) {\n      var i;\n      // {} prevents compiler warning\n      for (i = 0; el = el.previousSibling; i++) {\n      }\n      this.setSelectedIndex(i);\n      break;\n    }\n    el = el.parentNode;\n  }\n  event.preventDefault();\n};\n\n\n/**\n * KeyDown event handler for header element. Arrow keys moves between pages.\n * Home and end selects the first/last page.\n * @param {goog.events.BrowserEvent} event KeyDown event.\n * @private\n * @suppress {strictPrimitiveOperators} Part of the go/strict_warnings_migration\n */\ngoog.ui.TabPane.prototype.onHeaderKeyDown_ = function(event) {\n  if (event.altKey || event.metaKey || event.ctrlKey) {\n    return;\n  }\n\n  switch (event.keyCode) {\n    case goog.events.KeyCodes.LEFT:\n      var index = this.selected_.getIndex() - 1;\n      this.setSelectedIndex(index < 0 ? this.pages_.length - 1 : index);\n      break;\n    case goog.events.KeyCodes.RIGHT:\n      var index = this.selected_.getIndex() + 1;\n      this.setSelectedIndex(index >= this.pages_.length ? 0 : index);\n      break;\n    case goog.events.KeyCodes.HOME:\n      this.setSelectedIndex(0);\n      break;\n    case goog.events.KeyCodes.END:\n      this.setSelectedIndex(this.pages_.length - 1);\n      break;\n  }\n};\n\n\n\n/**\n * Object representing an individual tab pane.\n *\n * @param {Element=} opt_el Container element to create the pane out of.\n * @param {(Element|string)=} opt_title Pane title or element to use as the\n *     title. If not specified the first element in the container is used as\n *     the title.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper\n * The first parameter can be omitted.\n * @constructor\n */\ngoog.ui.TabPane.TabPage = function(opt_el, opt_title, opt_domHelper) {\n  /** @type {!Element|string|null} */\n  var title = null;\n  var el;\n  if (opt_title) {\n    title = opt_title;\n    el = opt_el;\n  } else if (opt_el) {\n    var child = goog.dom.getFirstElementChild(opt_el);\n    if (child) {\n      title = goog.dom.getTextContent(child);\n      child.parentNode.removeChild(child);\n    }\n    el = opt_el;\n  }\n\n  /**\n   * DomHelper used to interact with the document, allowing components to be\n   * created in a different window.  This property is considered protected;\n   * subclasses of Component may refer to it directly.\n   * @type {goog.dom.DomHelper}\n   * @protected\n   * @suppress {underscore|visibility}\n   */\n  this.dom_ = opt_domHelper || goog.dom.getDomHelper();\n\n  /**\n   * Content element\n   * @type {Element}\n   * @private\n   */\n  this.elContent_ = el || this.dom_.createDom(goog.dom.TagName.DIV);\n\n  /**\n   * Title element\n   * @type {Element}\n   * @private\n   */\n  this.elTitle_ = this.dom_.createDom(goog.dom.TagName.LI, null, title);\n\n  /**\n   * Parent TabPane reference.\n   * @type {goog.ui.TabPane?}\n   * @private\n   */\n  this.parent_ = null;\n\n  /**\n   * Index for page in tab pane.\n   * @type {?number}\n   * @private\n   */\n  this.index_ = null;\n\n  /**\n   * Flags if this page is enabled and can be selected.\n   * @type {boolean}\n   * @private\n   */\n  this.enabled_ = true;\n};\n\n\n/**\n * @return {string} The title for tab page.\n */\ngoog.ui.TabPane.TabPage.prototype.getTitle = function() {\n  return goog.dom.getTextContent(this.elTitle_);\n};\n\n\n/**\n * Sets title for tab page.\n *\n * @param {string} title Title for tab page.\n */\ngoog.ui.TabPane.TabPage.prototype.setTitle = function(title) {\n  goog.dom.setTextContent(this.elTitle_, title);\n};\n\n\n/**\n * @return {Element} The title element.\n */\ngoog.ui.TabPane.TabPage.prototype.getTitleElement = function() {\n  return this.elTitle_;\n};\n\n\n/**\n * @return {Element} The content element.\n */\ngoog.ui.TabPane.TabPage.prototype.getContentElement = function() {\n  return this.elContent_;\n};\n\n\n/**\n * @return {?number} The index of page in tab pane.\n */\ngoog.ui.TabPane.TabPage.prototype.getIndex = function() {\n  return this.index_;\n};\n\n\n/**\n * @return {goog.ui.TabPane?} The parent tab pane for page.\n */\ngoog.ui.TabPane.TabPage.prototype.getParent = function() {\n  return this.parent_;\n};\n\n\n/**\n * Selects page in the associated tab pane.\n */\ngoog.ui.TabPane.TabPage.prototype.select = function() {\n  if (this.parent_) {\n    this.parent_.setSelectedPage(this);\n  }\n};\n\n\n/**\n * Sets the enabled state.\n *\n * @param {boolean} enabled Enabled state.\n */\ngoog.ui.TabPane.TabPage.prototype.setEnabled = function(enabled) {\n  this.enabled_ = enabled;\n  this.elTitle_.className = enabled ?\n      goog.getCssName('goog-tabpane-tab') :\n      goog.getCssName('goog-tabpane-tab-disabled');\n};\n\n\n/**\n * Returns if the page is enabled.\n * @return {boolean} Whether the page is enabled or not.\n */\ngoog.ui.TabPane.TabPage.prototype.isEnabled = function() {\n  return this.enabled_;\n};\n\n\n/**\n * Sets visible state for page content and updates style of tab.\n *\n * @param {boolean} visible Visible state.\n * @private\n */\ngoog.ui.TabPane.TabPage.prototype.setVisible_ = function(visible) {\n  if (this.isEnabled()) {\n    this.elContent_.style.display = visible ? '' : 'none';\n    this.elTitle_.className = visible ?\n        goog.getCssName('goog-tabpane-tab-selected') :\n        goog.getCssName('goog-tabpane-tab');\n  }\n};\n\n\n/**\n * Sets parent tab pane for tab page.\n *\n * @param {goog.ui.TabPane?} tabPane Tab strip object.\n * @param {number=} opt_index Index of page in pane.\n * @private\n */\ngoog.ui.TabPane.TabPage.prototype.setParent_ = function(tabPane, opt_index) {\n  this.parent_ = tabPane;\n  this.index_ = (opt_index !== undefined) ? opt_index : null;\n};\n\n\n\n/**\n * Object representing a tab pane page changed event.\n *\n * @param {string} type Event type.\n * @param {goog.ui.TabPane} target Tab widget initiating event.\n * @param {goog.ui.TabPane.TabPage} page Selected page in tab pane.\n * @extends {goog.events.Event}\n * @constructor\n * @final\n */\ngoog.ui.TabPaneEvent = function(type, target, page) {\n  goog.events.Event.call(this, type, target);\n\n  /**\n   * The selected page.\n   * @type {goog.ui.TabPane.TabPage}\n   */\n  this.page = page;\n};\ngoog.inherits(goog.ui.TabPaneEvent, goog.events.Event);\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^:;","^9>","^:L","^:I","^<3","^GW","^;8","^>R","^:N","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/tabpane.js"],"^:1",["^9K",["~$goog.ui.TabPaneEvent","~$goog.ui.TabPane","~$goog.ui.TabPane.TabPage","~$goog.ui.TabPane.Events","~$goog.ui.TabPane.TabLocation"]],"^9<",true,"^9=",["^9>","^:E","^;;","^;=","^:;","^:N","^;8","^:L","^:I","^>R","^GW","^<3"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.pattern.fulltag.js","^9C",["^9D","goog/dom/pattern/fulltag.js"],"^9E","goog/dom/pattern/fulltag.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview DOM pattern to match a tag and all of its children.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.dom.pattern.FullTag');\n\ngoog.require('goog.dom.pattern.MatchType');\ngoog.require('goog.dom.pattern.StartTag');\ngoog.require('goog.dom.pattern.Tag');\n\n\n\n/**\n * Pattern object that matches a full tag including all its children.\n *\n * @param {string|RegExp} tag Name of the tag.  Also will accept a regular\n *     expression to match against the tag name.\n * @param {Object=} opt_attrs Optional map of attribute names to desired values.\n *     This pattern will only match when all attributes are present and match\n *     the string or regular expression value provided here.\n * @param {Object=} opt_styles Optional map of CSS style names to desired\n *     values. This pattern will only match when all styles are present and\n *     match the string or regular expression value provided here.\n * @param {Function=} opt_test Optional function that takes the element as a\n *     parameter and returns true if this pattern should match it.\n * @constructor\n * @extends {goog.dom.pattern.StartTag}\n * @final\n */\ngoog.dom.pattern.FullTag = function(tag, opt_attrs, opt_styles, opt_test) {\n  /**\n   * Tracks the matcher's depth to detect the end of the tag.\n   *\n   * @private {number}\n   */\n  this.depth_ = 0;\n\n  goog.dom.pattern.FullTag.base(\n      this, 'constructor', tag, opt_attrs, opt_styles, opt_test);\n};\ngoog.inherits(goog.dom.pattern.FullTag, goog.dom.pattern.StartTag);\n\n\n/**\n * Test whether the given token is a start tag token which matches the tag name,\n * style, and attributes provided in the constructor.\n *\n * @param {Node} token Token to match against.\n * @param {goog.dom.TagWalkType} type The type of token.\n * @return {goog.dom.pattern.MatchType} <code>MATCH</code> at the end of our\n *    tag, <code>MATCHING</code> if we are within the tag, and\n *    <code>NO_MATCH</code> if the starting tag does not match.\n * @override\n */\ngoog.dom.pattern.FullTag.prototype.matchToken = function(token, type) {\n  if (!this.depth_) {\n    // If we have not yet started, make sure we match as a StartTag.\n    if (goog.dom.pattern.Tag.prototype.matchToken.call(this, token, type)) {\n      this.depth_ = type;\n      return goog.dom.pattern.MatchType.MATCHING;\n\n    } else {\n      return goog.dom.pattern.MatchType.NO_MATCH;\n    }\n  } else {\n    this.depth_ += type;\n\n    return this.depth_ ? goog.dom.pattern.MatchType.MATCHING :\n                         goog.dom.pattern.MatchType.MATCH;\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.dom.pattern.StartTag","^=@","^=?"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/fulltag.js"],"^:1",["^9K",["~$goog.dom.pattern.FullTag"]],"^9<",true,"^9=",["^9>","^=?","^IB","^=@"]],["^ ","^9A",[1579837703000],"^9B","goog.fs.error.js","^9C",["^9D","goog/fs/error.js"],"^9E","goog/fs/error.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A wrapper for the HTML5 FileError object.\n *\n */\n\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.fs.DOMErrorLike');\ngoog.provide('goog.fs.Error');\ngoog.provide('goog.fs.Error.ErrorCode');\n\ngoog.require('goog.asserts');\ngoog.require('goog.debug.Error');\ngoog.require('goog.object');\ngoog.require('goog.string');\n\n/** @record */\ngoog.fs.DOMErrorLike = function() {};\n\n/** @type {string|undefined} */\ngoog.fs.DOMErrorLike.prototype.name;\n\n/** @type {!goog.fs.Error.ErrorCode|undefined} */\ngoog.fs.DOMErrorLike.prototype.code;\n\n\n\n/**\n * A filesystem error. Since the filesystem API is asynchronous, stack traces\n * are less useful for identifying where errors come from, so this includes a\n * large amount of metadata in the message.\n *\n * @param {!DOMError|!goog.fs.DOMErrorLike} error\n * @param {string} action The action being undertaken when the error was raised.\n * @constructor\n * @extends {goog.debug.Error}\n * @final\n */\ngoog.fs.Error = function(error, action) {\n  /** @type {string} */\n  this.name;\n\n  /**\n   * @type {!goog.fs.Error.ErrorCode}\n   * @deprecated Use the 'name' or 'message' field instead.\n   */\n  this.code;\n\n  if (error.name !== undefined) {\n    this.name = error.name;\n    // TODO(user): Remove warning suppression after JSCompiler stops\n    // firing a spurious warning here.\n    /** @suppress {deprecated} */\n    this.code = goog.fs.Error.getCodeFromName_(error.name);\n  } else {\n    var code = /** @type {!goog.fs.Error.ErrorCode} */ (\n        goog.asserts.assertNumber(error.code));\n    this.code = code;\n    this.name = goog.fs.Error.getNameFromCode_(code);\n  }\n  goog.fs.Error.base(\n      this, 'constructor', goog.string.subs('%s %s', this.name, action));\n};\ngoog.inherits(goog.fs.Error, goog.debug.Error);\n\n\n/**\n * Names of errors that may be thrown by the File API, the File System API, or\n * the File Writer API.\n *\n * @see http://dev.w3.org/2006/webapi/FileAPI/#ErrorAndException\n * @see http://www.w3.org/TR/file-system-api/#definitions\n * @see http://dev.w3.org/2009/dap/file-system/file-writer.html#definitions\n * @enum {string}\n */\ngoog.fs.Error.ErrorName = {\n  ABORT: 'AbortError',\n  ENCODING: 'EncodingError',\n  INVALID_MODIFICATION: 'InvalidModificationError',\n  INVALID_STATE: 'InvalidStateError',\n  NOT_FOUND: 'NotFoundError',\n  NOT_READABLE: 'NotReadableError',\n  NO_MODIFICATION_ALLOWED: 'NoModificationAllowedError',\n  PATH_EXISTS: 'PathExistsError',\n  QUOTA_EXCEEDED: 'QuotaExceededError',\n  SECURITY: 'SecurityError',\n  SYNTAX: 'SyntaxError',\n  TYPE_MISMATCH: 'TypeMismatchError'\n};\n\n\n/**\n * Error codes for file errors.\n * @see http://www.w3.org/TR/file-system-api/#idl-def-FileException\n *\n * @enum {number}\n * @deprecated Use the 'name' or 'message' attribute instead.\n */\ngoog.fs.Error.ErrorCode = {\n  NOT_FOUND: 1,\n  SECURITY: 2,\n  ABORT: 3,\n  NOT_READABLE: 4,\n  ENCODING: 5,\n  NO_MODIFICATION_ALLOWED: 6,\n  INVALID_STATE: 7,\n  SYNTAX: 8,\n  INVALID_MODIFICATION: 9,\n  QUOTA_EXCEEDED: 10,\n  TYPE_MISMATCH: 11,\n  PATH_EXISTS: 12\n};\n\n\n/**\n * @param {goog.fs.Error.ErrorCode|undefined} code\n * @return {string} name\n * @private\n */\ngoog.fs.Error.getNameFromCode_ = function(code) {\n  var name = goog.object.findKey(\n      goog.fs.Error.NameToCodeMap_, function(c) { return code == c; });\n  if (name === undefined) {\n    throw new Error('Invalid code: ' + code);\n  }\n  return name;\n};\n\n\n/**\n * Returns the code that corresponds to the given name.\n * @param {string} name\n * @return {goog.fs.Error.ErrorCode} code\n * @private\n */\ngoog.fs.Error.getCodeFromName_ = function(name) {\n  return goog.fs.Error.NameToCodeMap_[name];\n};\n\n\n/**\n * Mapping from error names to values from the ErrorCode enum.\n * @see http://www.w3.org/TR/file-system-api/#definitions.\n * @private {!Object<string, goog.fs.Error.ErrorCode>}\n */\ngoog.fs.Error.NameToCodeMap_ = goog.object.create(\n    goog.fs.Error.ErrorName.ABORT, goog.fs.Error.ErrorCode.ABORT,\n\n    goog.fs.Error.ErrorName.ENCODING, goog.fs.Error.ErrorCode.ENCODING,\n\n    goog.fs.Error.ErrorName.INVALID_MODIFICATION,\n    goog.fs.Error.ErrorCode.INVALID_MODIFICATION,\n\n    goog.fs.Error.ErrorName.INVALID_STATE,\n    goog.fs.Error.ErrorCode.INVALID_STATE,\n\n    goog.fs.Error.ErrorName.NOT_FOUND, goog.fs.Error.ErrorCode.NOT_FOUND,\n\n    goog.fs.Error.ErrorName.NOT_READABLE, goog.fs.Error.ErrorCode.NOT_READABLE,\n\n    goog.fs.Error.ErrorName.NO_MODIFICATION_ALLOWED,\n    goog.fs.Error.ErrorCode.NO_MODIFICATION_ALLOWED,\n\n    goog.fs.Error.ErrorName.PATH_EXISTS, goog.fs.Error.ErrorCode.PATH_EXISTS,\n\n    goog.fs.Error.ErrorName.QUOTA_EXCEEDED,\n    goog.fs.Error.ErrorCode.QUOTA_EXCEEDED,\n\n    goog.fs.Error.ErrorName.SECURITY, goog.fs.Error.ErrorCode.SECURITY,\n\n    goog.fs.Error.ErrorName.SYNTAX, goog.fs.Error.ErrorCode.SYNTAX,\n\n    goog.fs.Error.ErrorName.TYPE_MISMATCH,\n    goog.fs.Error.ErrorCode.TYPE_MISMATCH);\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9L","^9>","^;P","^;R"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fs/error.js"],"^:1",["^9K",["~$goog.fs.Error.ErrorCode","~$goog.fs.Error","~$goog.fs.DOMErrorLike"]],"^9<",true,"^9=",["^9>","^:E","^;R","^;P","^9L"]],["^ ","^9A",[1579837703000],"^9B","goog.messaging.deferredchannel.js","^9C",["^9D","goog/messaging/deferredchannel.js"],"^9E","goog/messaging/deferredchannel.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A MessageChannel decorator that wraps a deferred MessageChannel\n * and enqueues messages and service registrations until that channel exists.\n *\n */\n\ngoog.provide('goog.messaging.DeferredChannel');\n\n// interface\ngoog.forwardDeclare('goog.async.Deferred');\ngoog.require('goog.Disposable');\ngoog.require('goog.messaging.MessageChannel');\n\n\n\n/**\n * Creates a new DeferredChannel, which wraps a deferred MessageChannel and\n * enqueues messages to be sent once the wrapped channel is resolved.\n *\n * @param {!goog.async.Deferred<!goog.messaging.MessageChannel>} deferredChannel\n *     The underlying deferred MessageChannel.\n * @constructor\n * @extends {goog.Disposable}\n * @implements {goog.messaging.MessageChannel}\n * @final\n */\ngoog.messaging.DeferredChannel = function(deferredChannel) {\n  goog.messaging.DeferredChannel.base(this, 'constructor');\n\n  /** @private {!goog.async.Deferred<!goog.messaging.MessageChannel>} */\n  this.deferred_ = deferredChannel;\n};\ngoog.inherits(goog.messaging.DeferredChannel, goog.Disposable);\n\n\n/**\n * Cancels the wrapped Deferred.\n */\ngoog.messaging.DeferredChannel.prototype.cancel = function() {\n  this.deferred_.cancel();\n};\n\n\n/** @override */\ngoog.messaging.DeferredChannel.prototype.connect = function(opt_connectCb) {\n  if (opt_connectCb) {\n    opt_connectCb();\n  }\n};\n\n\n/** @override */\ngoog.messaging.DeferredChannel.prototype.isConnected = function() {\n  return true;\n};\n\n\n/** @override */\ngoog.messaging.DeferredChannel.prototype.registerService = function(\n    serviceName, callback, opt_objectPayload) {\n  this.deferred_.addCallback(function(resolved) {\n    resolved.registerService(serviceName, callback, opt_objectPayload);\n  });\n};\n\n\n/** @override */\ngoog.messaging.DeferredChannel.prototype.registerDefaultService = function(\n    callback) {\n  this.deferred_.addCallback(function(resolved) {\n    resolved.registerDefaultService(callback);\n  });\n};\n\n\n/** @override */\ngoog.messaging.DeferredChannel.prototype.send = function(serviceName, payload) {\n  this.deferred_.addCallback(function(resolved) {\n    resolved.send(serviceName, payload);\n  });\n};\n\n\n/** @override */\ngoog.messaging.DeferredChannel.prototype.disposeInternal = function() {\n  this.cancel();\n  goog.messaging.DeferredChannel.base(this, 'disposeInternal');\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.messaging.MessageChannel","^9>","^:7"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/deferredchannel.js"],"^:1",["^9K",["^?Y"]],"^9<",true,"^9=",["^9>","^:7","^IG"]],["^ ","^9A",[1579837703000],"^9B","goog.net.bulkloader.js","^9C",["^9D","goog/net/bulkloader.js"],"^9E","goog/net/bulkloader.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Loads a list of URIs in bulk. All requests must be a success\n * in order for the load to be considered a success.\n *\n */\n\ngoog.provide('goog.net.BulkLoader');\n\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.log');\ngoog.require('goog.net.BulkLoaderHelper');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.XhrIo');\n\n\n\n/**\n * Class used to load multiple URIs.\n * @param {Array<string|goog.Uri>} uris The URIs to load.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.net.BulkLoader = function(uris) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * The bulk loader helper.\n   * @type {goog.net.BulkLoaderHelper}\n   * @private\n   */\n  this.helper_ = new goog.net.BulkLoaderHelper(uris);\n\n  /**\n   * The handler for managing events.\n   * @type {goog.events.EventHandler<!goog.net.BulkLoader>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n};\ngoog.inherits(goog.net.BulkLoader, goog.events.EventTarget);\n\n\n/**\n * A logger.\n * @type {goog.log.Logger}\n * @private\n */\ngoog.net.BulkLoader.prototype.logger_ =\n    goog.log.getLogger('goog.net.BulkLoader');\n\n\n/**\n * Gets the response texts, in order.\n * @return {Array<string>} The response texts.\n */\ngoog.net.BulkLoader.prototype.getResponseTexts = function() {\n  return this.helper_.getResponseTexts();\n};\n\n\n/**\n * Gets the request Uris.\n * @return {Array<string>} The request URIs, in order.\n */\ngoog.net.BulkLoader.prototype.getRequestUris = function() {\n  return this.helper_.getUris();\n};\n\n\n/**\n * Starts the process of loading the URIs.\n */\ngoog.net.BulkLoader.prototype.load = function() {\n  var eventHandler = this.eventHandler_;\n  var uris = this.helper_.getUris();\n  goog.log.info(\n      this.logger_, 'Starting load of code with ' + uris.length + ' uris.');\n\n  for (var i = 0; i < uris.length; i++) {\n    var xhrIo = new goog.net.XhrIo();\n    eventHandler.listen(\n        xhrIo, goog.net.EventType.COMPLETE,\n        goog.bind(this.handleEvent_, this, i));\n\n    xhrIo.send(uris[i]);\n  }\n};\n\n\n/**\n * Handles all events fired by the XhrManager.\n * @param {number} id The id of the request.\n * @param {goog.events.Event} e The event.\n * @private\n */\ngoog.net.BulkLoader.prototype.handleEvent_ = function(id, e) {\n  goog.log.info(\n      this.logger_, 'Received event \"' + e.type + '\" for id ' + id +\n          ' with uri ' + this.helper_.getUri(id));\n  var xhrIo = /** @type {goog.net.XhrIo} */ (e.target);\n  if (xhrIo.isSuccess()) {\n    this.handleSuccess_(id, xhrIo);\n  } else {\n    this.handleError_(id, xhrIo);\n  }\n};\n\n\n/**\n * Handles when a request is successful (i.e., completed and response received).\n * Stores thhe responseText and checks if loading is complete.\n * @param {number} id The id of the request.\n * @param {goog.net.XhrIo} xhrIo The XhrIo objects that was used.\n * @private\n */\ngoog.net.BulkLoader.prototype.handleSuccess_ = function(id, xhrIo) {\n  // Save the response text.\n  this.helper_.setResponseText(id, xhrIo.getResponseText());\n\n  // Check if all response texts have been received.\n  if (this.helper_.isLoadComplete()) {\n    this.finishLoad_();\n  }\n  xhrIo.dispose();\n};\n\n\n/**\n * Handles when a request has ended in error (i.e., all retries completed and\n * none were successful). Cancels loading of the URI's.\n * @param {number|string} id The id of the request.\n * @param {goog.net.XhrIo} xhrIo The XhrIo objects that was used.\n * @private\n */\ngoog.net.BulkLoader.prototype.handleError_ = function(id, xhrIo) {\n  // TODO(user): Abort all pending requests.\n\n  // Dispatch the ERROR event.\n  this.dispatchEvent(new goog.net.BulkLoader.LoadErrorEvent(xhrIo.getStatus()));\n  xhrIo.dispose();\n};\n\n\n/**\n * Finishes the load of the URI's. Dispatches the SUCCESS event.\n * @private\n */\ngoog.net.BulkLoader.prototype.finishLoad_ = function() {\n  goog.log.info(this.logger_, 'All uris loaded.');\n\n  // Dispatch the SUCCESS event.\n  this.dispatchEvent(goog.net.EventType.SUCCESS);\n};\n\n\n/** @override */\ngoog.net.BulkLoader.prototype.disposeInternal = function() {\n  goog.net.BulkLoader.superClass_.disposeInternal.call(this);\n\n  this.eventHandler_.dispose();\n  this.eventHandler_ = null;\n\n  this.helper_.dispose();\n  this.helper_ = null;\n};\n\n\n/**\n * @param {number} status The response status.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n * @protected\n */\ngoog.net.BulkLoader.LoadErrorEvent = function(status) {\n  goog.net.BulkLoader.LoadErrorEvent.base(\n      this, 'constructor', goog.net.EventType.ERROR);\n\n  /** @type {number} */\n  this.status = status;\n};\ngoog.inherits(goog.net.BulkLoader.LoadErrorEvent, goog.events.Event);\n","^9I",1579837703000,"^9J",["^9K",["^>;","^;N","~$goog.net.BulkLoaderHelper","^9>","^:L","^;Q","^>0","^;8"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/bulkloader.js"],"^:1",["^9K",["~$goog.net.BulkLoader"]],"^9<",true,"^9=",["^9>","^;8","^>;","^:L","^;Q","^IH","^>0","^;N"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.browserrange.operarange.js","^9C",["^9D","goog/dom/browserrange/operarange.js"],"^9E","goog/dom/browserrange/operarange.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the Opera specific range wrapper.  Inherits most\n * functionality from W3CRange, but adds exceptions as necessary.\n *\n * DO NOT USE THIS FILE DIRECTLY.  Use goog.dom.Range instead.\n *\n */\n\n\ngoog.provide('goog.dom.browserrange.OperaRange');\n\ngoog.require('goog.dom.browserrange.W3cRange');\n\n\n\n/**\n * The constructor for Opera specific browser ranges.\n * @param {Range} range The range object.\n * @constructor\n * @extends {goog.dom.browserrange.W3cRange}\n * @final\n */\ngoog.dom.browserrange.OperaRange = function(range) {\n  goog.dom.browserrange.W3cRange.call(this, range);\n};\ngoog.inherits(goog.dom.browserrange.OperaRange, goog.dom.browserrange.W3cRange);\n\n\n/**\n * Creates a range object that selects the given node's text.\n * @param {Node} node The node to select.\n * @return {!goog.dom.browserrange.OperaRange} A Opera range wrapper object.\n */\ngoog.dom.browserrange.OperaRange.createFromNodeContents = function(node) {\n  return new goog.dom.browserrange.OperaRange(\n      goog.dom.browserrange.W3cRange.getBrowserRangeForNode(node));\n};\n\n\n/**\n * Creates a range object that selects between the given nodes.\n * @param {Node} startNode The node to start with.\n * @param {number} startOffset The offset within the node to start.\n * @param {Node} endNode The node to end with.\n * @param {number} endOffset The offset within the node to end.\n * @return {!goog.dom.browserrange.OperaRange} A wrapper object.\n */\ngoog.dom.browserrange.OperaRange.createFromNodes = function(\n    startNode, startOffset, endNode, endOffset) {\n  return new goog.dom.browserrange.OperaRange(\n      goog.dom.browserrange.W3cRange.getBrowserRangeForNodes(\n          startNode, startOffset, endNode, endOffset));\n};\n\n\n/** @override */\ngoog.dom.browserrange.OperaRange.prototype.selectInternal = function(\n    selection, reversed) {\n  // Avoid using addRange as we have to removeAllRanges first, which\n  // blurs editable fields in Opera.\n  selection.collapse(this.getStartNode(), this.getStartOffset());\n  if (this.getEndNode() != this.getStartNode() ||\n      this.getEndOffset() != this.getStartOffset()) {\n    selection.extend(this.getEndNode(), this.getEndOffset());\n  }\n  // This can happen if the range isn't in an editable field.\n  if (selection.rangeCount == 0) {\n    selection.addRange(this.range_);\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^?B","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/browserrange/operarange.js"],"^:1",["^9K",["~$goog.dom.browserrange.OperaRange"]],"^9<",true,"^9=",["^9>","^?B"]],["^ ","^9A",[1579837703000],"^9B","goog.log.log.js","^9C",["^9D","goog/log/log.js"],"^9E","goog/log/log.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Basic strippable logging definitions.\n * @see http://go/closurelogging\n *\n * @author johnlenz@google.com (John Lenz)\n */\n\ngoog.provide('goog.log');\ngoog.provide('goog.log.Level');\ngoog.provide('goog.log.LogRecord');\ngoog.provide('goog.log.Logger');\n\ngoog.require('goog.debug');\ngoog.require('goog.debug.LogManager');\ngoog.require('goog.debug.LogRecord');\ngoog.require('goog.debug.Logger');\n\n\n/** @define {boolean} Whether logging is enabled. */\ngoog.log.ENABLED = goog.define('goog.log.ENABLED', goog.debug.LOGGING_ENABLED);\n\n\n/** @const {string} */\ngoog.log.ROOT_LOGGER_NAME = goog.debug.Logger.ROOT_LOGGER_NAME;\n\n\n\n/**\n * @constructor\n * @final\n */\ngoog.log.Logger = goog.debug.Logger;\n\n\n\n/**\n * @constructor\n * @final\n */\ngoog.log.Level = goog.debug.Logger.Level;\n\n\n\n/**\n * @constructor\n * @final\n */\ngoog.log.LogRecord = goog.debug.LogRecord;\n\n\n/**\n * Finds or creates a logger for a named subsystem. If a logger has already been\n * created with the given name it is returned. Otherwise a new logger is\n * created. If a new logger is created its log level will be configured based\n * on the goog.debug.LogManager configuration and it will configured to also\n * send logging output to its parent's handlers.\n * @see goog.debug.LogManager\n *\n * @param {string} name A name for the logger. This should be a dot-separated\n *     name and should normally be based on the package name or class name of\n *     the subsystem, such as goog.net.BrowserChannel.\n * @param {goog.log.Level=} opt_level If provided, override the\n *     default logging level with the provided level.\n * @return {goog.log.Logger} The named logger or null if logging is disabled.\n */\ngoog.log.getLogger = function(name, opt_level) {\n  if (goog.log.ENABLED) {\n    var logger = goog.debug.LogManager.getLogger(name);\n    if (opt_level && logger) {\n      logger.setLevel(opt_level);\n    }\n    return logger;\n  } else {\n    return null;\n  }\n};\n\n\n// TODO(johnlenz): try to tighten the types to these functions.\n/**\n * Adds a handler to the logger. This doesn't use the event system because\n * we want to be able to add logging to the event system.\n * @param {goog.log.Logger} logger\n * @param {Function} handler Handler function to add.\n */\ngoog.log.addHandler = function(logger, handler) {\n  if (goog.log.ENABLED && logger) {\n    logger.addHandler(handler);\n  }\n};\n\n\n/**\n * Removes a handler from the logger. This doesn't use the event system because\n * we want to be able to add logging to the event system.\n * @param {goog.log.Logger} logger\n * @param {Function} handler Handler function to remove.\n * @return {boolean} Whether the handler was removed.\n */\ngoog.log.removeHandler = function(logger, handler) {\n  if (goog.log.ENABLED && logger) {\n    return logger.removeHandler(handler);\n  } else {\n    return false;\n  }\n};\n\n\n/**\n * Logs a message. If the logger is currently enabled for the\n * given message level then the given message is forwarded to all the\n * registered output Handler objects.\n * @param {goog.log.Logger} logger\n * @param {goog.log.Level} level One of the level identifiers.\n * @param {goog.debug.Loggable} msg The message to log.\n * @param {Error|Object=} opt_exception An exception associated with the\n *     message.\n */\ngoog.log.log = function(logger, level, msg, opt_exception) {\n  if (goog.log.ENABLED && logger) {\n    logger.log(level, msg, opt_exception);\n  }\n};\n\n\n/**\n * Logs a message at the Level.SEVERE level.\n * If the logger is currently enabled for the given message level then the\n * given message is forwarded to all the registered output Handler objects.\n * @param {goog.log.Logger} logger\n * @param {goog.debug.Loggable} msg The message to log.\n * @param {Error=} opt_exception An exception associated with the message.\n */\ngoog.log.error = function(logger, msg, opt_exception) {\n  if (goog.log.ENABLED && logger) {\n    logger.severe(msg, opt_exception);\n  }\n};\n\n\n/**\n * Logs a message at the Level.WARNING level.\n * If the logger is currently enabled for the given message level then the\n * given message is forwarded to all the registered output Handler objects.\n * @param {goog.log.Logger} logger\n * @param {goog.debug.Loggable} msg The message to log.\n * @param {Error=} opt_exception An exception associated with the message.\n */\ngoog.log.warning = function(logger, msg, opt_exception) {\n  if (goog.log.ENABLED && logger) {\n    logger.warning(msg, opt_exception);\n  }\n};\n\n\n/**\n * Logs a message at the Level.INFO level.\n * If the logger is currently enabled for the given message level then the\n * given message is forwarded to all the registered output Handler objects.\n * @param {goog.log.Logger} logger\n * @param {goog.debug.Loggable} msg The message to log.\n * @param {Error=} opt_exception An exception associated with the message.\n */\ngoog.log.info = function(logger, msg, opt_exception) {\n  if (goog.log.ENABLED && logger) {\n    logger.info(msg, opt_exception);\n  }\n};\n\n\n/**\n * Logs a message at the Level.Fine level.\n * If the logger is currently enabled for the given message level then the\n * given message is forwarded to all the registered output Handler objects.\n * @param {goog.log.Logger} logger\n * @param {goog.debug.Loggable} msg The message to log.\n * @param {Error=} opt_exception An exception associated with the message.\n */\ngoog.log.fine = function(logger, msg, opt_exception) {\n  if (goog.log.ENABLED && logger) {\n    logger.fine(msg, opt_exception);\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.debug.LogManager","^9>","~$goog.debug.Logger","^;T","~$goog.debug.LogRecord"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/log/log.js"],"^:1",["^9K",["^@T","~$goog.log.LogRecord","^;Q","~$goog.log.Logger"]],"^9<",true,"^9=",["^9>","^;T","^IK","^IM","^IL"]],["^ ","^9A",[1579837703000],"^9B","goog.storage.storagetester.js","^9C",["^9D","goog/storage/storagetester.js"],"^9E","goog/storage/storagetester.js","^9F","^9G","^9H","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Helper for various storage tests.\n *\n * @author johnlenz@google.com (John Lenz)\n */\n\ngoog.provide('goog.storage.storageTester');\ngoog.setTestOnly();\n\ngoog.require('goog.storage.Storage');\ngoog.require('goog.structs.Map');\ngoog.require('goog.testing.asserts');\n\n/**\n * @param {!goog.storage.Storage} storage\n */\ngoog.storage.storageTester.runBasicTests = function(storage) {\n  // Simple Objects.\n  storage.set('first', 'Hello world!');\n  storage.set('second', ['one', 'two', 'three']);\n  storage.set('third', {'a': 97, 'b': 98});\n  assertEquals('Hello world!', storage.get('first'));\n  assertObjectEquals(['one', 'two', 'three'], storage.get('second'));\n  assertObjectEquals({'a': 97, 'b': 98}, storage.get('third'));\n\n  // Some more complex fun with a Map.\n  var map = new goog.structs.Map();\n  map.set('Alice', 'Hello world!');\n  map.set('Bob', ['one', 'two', 'three']);\n  map.set('Cecile', {'a': 97, 'b': 98});\n  storage.set('first', map.toObject());\n  assertObjectEquals(map.toObject(), storage.get('first'));\n\n  // Setting weird values.\n  storage.set('second', null);\n  assertEquals(null, storage.get('second'));\n  storage.set('second', undefined);\n  assertEquals(undefined, storage.get('second'));\n  storage.set('second', '');\n  assertEquals('', storage.get('second'));\n\n  // Clean up.\n  storage.remove('first');\n  storage.remove('second');\n  storage.remove('third');\n  assertUndefined(storage.get('first'));\n  assertUndefined(storage.get('second'));\n  assertUndefined(storage.get('third'));\n};\n","^9I",1579837703000,"^9J",["^9K",["^>X","^=[","^9>","^I<"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/storagetester.js"],"^:1",["^9K",["~$goog.storage.storageTester"]],"^9<",true,"^9=",["^9>","^I<","^=[","^>X"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.toolbartogglebutton.js","^9C",["^9D","goog/ui/toolbartogglebutton.js"],"^9E","goog/ui/toolbartogglebutton.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A toolbar toggle button control.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ToolbarToggleButton');\n\ngoog.require('goog.ui.ToggleButton');\ngoog.require('goog.ui.ToolbarButtonRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * A toggle button control for a toolbar.\n *\n * @param {goog.ui.ControlContent} content Text caption or existing DOM\n *     structure to display as the button's caption.\n * @param {goog.ui.ToolbarButtonRenderer=} opt_renderer Optional renderer used\n *     to render or decorate the button; defaults to\n *     {@link goog.ui.ToolbarButtonRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.ToggleButton}\n */\ngoog.ui.ToolbarToggleButton = function(content, opt_renderer, opt_domHelper) {\n  goog.ui.ToggleButton.call(\n      this, content,\n      opt_renderer || goog.ui.ToolbarButtonRenderer.getInstance(),\n      opt_domHelper);\n};\ngoog.inherits(goog.ui.ToolbarToggleButton, goog.ui.ToggleButton);\n\n\n// Registers a decorator factory function for toggle buttons in toolbars.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.getCssName('goog-toolbar-toggle-button'),\n    function() { return new goog.ui.ToolbarToggleButton(null); });\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:>","~$goog.ui.ToggleButton","~$goog.ui.ToolbarButtonRenderer"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/toolbartogglebutton.js"],"^:1",["^9K",["~$goog.ui.ToolbarToggleButton"]],"^9<",true,"^9=",["^9>","^IQ","^IR","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.math.size.js","^9C",["^9D","goog/math/size.js"],"^9E","goog/math/size.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A utility class for representing two-dimensional sizes.\n * @author brenneman@google.com (Shawn Brenneman)\n */\n\n\ngoog.provide('goog.math.Size');\n\n\n\n/**\n * Class for representing sizes consisting of a width and height. Undefined\n * width and height support is deprecated and results in compiler warning.\n * @param {number} width Width.\n * @param {number} height Height.\n * @struct\n * @constructor\n */\ngoog.math.Size = function(width, height) {\n  /**\n   * Width\n   * @type {number}\n   */\n  this.width = width;\n\n  /**\n   * Height\n   * @type {number}\n   */\n  this.height = height;\n};\n\n\n/**\n * Compares sizes for equality.\n * @param {goog.math.Size} a A Size.\n * @param {goog.math.Size} b A Size.\n * @return {boolean} True iff the sizes have equal widths and equal\n *     heights, or if both are null.\n */\ngoog.math.Size.equals = function(a, b) {\n  if (a == b) {\n    return true;\n  }\n  if (!a || !b) {\n    return false;\n  }\n  return a.width == b.width && a.height == b.height;\n};\n\n\n/**\n * @return {!goog.math.Size} A new copy of the Size.\n */\ngoog.math.Size.prototype.clone = function() {\n  return new goog.math.Size(this.width, this.height);\n};\n\n\nif (goog.DEBUG) {\n  /**\n   * Returns a nice string representing size.\n   * @return {string} In the form (50 x 73).\n   * @override\n   */\n  goog.math.Size.prototype.toString = function() {\n    return '(' + this.width + ' x ' + this.height + ')';\n  };\n}\n\n\n/**\n * @return {number} The longer of the two dimensions in the size.\n */\ngoog.math.Size.prototype.getLongest = function() {\n  return Math.max(this.width, this.height);\n};\n\n\n/**\n * @return {number} The shorter of the two dimensions in the size.\n */\ngoog.math.Size.prototype.getShortest = function() {\n  return Math.min(this.width, this.height);\n};\n\n\n/**\n * @return {number} The area of the size (width * height).\n */\ngoog.math.Size.prototype.area = function() {\n  return this.width * this.height;\n};\n\n\n/**\n * @return {number} The perimeter of the size (width + height) * 2.\n */\ngoog.math.Size.prototype.perimeter = function() {\n  return (this.width + this.height) * 2;\n};\n\n\n/**\n * @return {number} The ratio of the size's width to its height.\n */\ngoog.math.Size.prototype.aspectRatio = function() {\n  return this.width / this.height;\n};\n\n\n/**\n * @return {boolean} True if the size has zero area, false if both dimensions\n *     are non-zero numbers.\n */\ngoog.math.Size.prototype.isEmpty = function() {\n  return !this.area();\n};\n\n\n/**\n * Clamps the width and height parameters upward to integer values.\n * @return {!goog.math.Size} This size with ceil'd components.\n */\ngoog.math.Size.prototype.ceil = function() {\n  this.width = Math.ceil(this.width);\n  this.height = Math.ceil(this.height);\n  return this;\n};\n\n\n/**\n * @param {!goog.math.Size} target The target size.\n * @return {boolean} True if this Size is the same size or smaller than the\n *     target size in both dimensions.\n */\ngoog.math.Size.prototype.fitsInside = function(target) {\n  return this.width <= target.width && this.height <= target.height;\n};\n\n\n/**\n * Clamps the width and height parameters downward to integer values.\n * @return {!goog.math.Size} This size with floored components.\n */\ngoog.math.Size.prototype.floor = function() {\n  this.width = Math.floor(this.width);\n  this.height = Math.floor(this.height);\n  return this;\n};\n\n\n/**\n * Rounds the width and height parameters to integer values.\n * @return {!goog.math.Size} This size with rounded components.\n */\ngoog.math.Size.prototype.round = function() {\n  this.width = Math.round(this.width);\n  this.height = Math.round(this.height);\n  return this;\n};\n\n\n/**\n * Scales this size by the given scale factors. The width and height are scaled\n * by `sx` and `opt_sy` respectively.  If `opt_sy` is not\n * given, then `sx` is used for both the width and height.\n * @param {number} sx The scale factor to use for the width.\n * @param {number=} opt_sy The scale factor to use for the height.\n * @return {!goog.math.Size} This Size object after scaling.\n */\ngoog.math.Size.prototype.scale = function(sx, opt_sy) {\n  const sy = (typeof opt_sy === 'number') ? opt_sy : sx;\n  this.width *= sx;\n  this.height *= sy;\n  return this;\n};\n\n\n/**\n * Uniformly scales the size to perfectly cover the dimensions of a given size.\n * If the size is already larger than the target, it will be scaled down to the\n * minimum size at which it still covers the entire target. The original aspect\n * ratio will be preserved.\n *\n * This function assumes that both Sizes contain strictly positive dimensions.\n * @param {!goog.math.Size} target The target size.\n * @return {!goog.math.Size} This Size object, after optional scaling.\n */\ngoog.math.Size.prototype.scaleToCover = function(target) {\n  const s = this.aspectRatio() <= target.aspectRatio() ?\n      target.width / this.width :\n      target.height / this.height;\n\n  return this.scale(s);\n};\n\n\n/**\n * Uniformly scales the size to fit inside the dimensions of a given size. The\n * original aspect ratio will be preserved.\n *\n * This function assumes that both Sizes contain strictly positive dimensions.\n * @param {!goog.math.Size} target The target size.\n * @return {!goog.math.Size} This Size object, after optional scaling.\n */\ngoog.math.Size.prototype.scaleToFit = function(target) {\n  const s = this.aspectRatio() > target.aspectRatio() ?\n      target.width / this.width :\n      target.height / this.height;\n\n  return this.scale(s);\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/size.js"],"^:1",["^9K",["^G4"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.fs.entryimpl.js","^9C",["^9D","goog/fs/entryimpl.js"],"^9E","goog/fs/entryimpl.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Concrete implementations of the\n *     goog.fs.DirectoryEntry, and goog.fs.FileEntry interfaces.\n */\ngoog.provide('goog.fs.DirectoryEntryImpl');\ngoog.provide('goog.fs.EntryImpl');\ngoog.provide('goog.fs.FileEntryImpl');\n\ngoog.forwardDeclare('goog.fs.FileSystem');\ngoog.require('goog.array');\ngoog.require('goog.async.Deferred');\ngoog.require('goog.fs.DirectoryEntry');\ngoog.require('goog.fs.Entry');\ngoog.require('goog.fs.Error');\ngoog.require('goog.fs.FileEntry');\ngoog.require('goog.fs.FileWriter');\ngoog.require('goog.functions');\ngoog.require('goog.string');\n\n\n\n/**\n * Base class for concrete implementations of goog.fs.Entry.\n * @param {!goog.fs.FileSystem} fs The wrapped filesystem.\n * @param {!Entry} entry The underlying Entry object.\n * @constructor\n * @implements {goog.fs.Entry}\n */\ngoog.fs.EntryImpl = function(fs, entry) {\n  /**\n   * The wrapped filesystem.\n   *\n   * @type {!goog.fs.FileSystem}\n   * @private\n   */\n  this.fs_ = fs;\n\n  /**\n   * The underlying Entry object.\n   *\n   * @type {!Entry}\n   * @private\n   */\n  this.entry_ = entry;\n};\n\n\n/** @override */\ngoog.fs.EntryImpl.prototype.isFile = function() {\n  return this.entry_.isFile;\n};\n\n\n/** @override */\ngoog.fs.EntryImpl.prototype.isDirectory = function() {\n  return this.entry_.isDirectory;\n};\n\n\n/** @override */\ngoog.fs.EntryImpl.prototype.getName = function() {\n  return this.entry_.name;\n};\n\n\n/** @override */\ngoog.fs.EntryImpl.prototype.getFullPath = function() {\n  return this.entry_.fullPath;\n};\n\n\n/** @override */\ngoog.fs.EntryImpl.prototype.getFileSystem = function() {\n  return this.fs_;\n};\n\n\n/** @override */\ngoog.fs.EntryImpl.prototype.getLastModified = function() {\n  return this.getMetadata().addCallback(function(metadata) {\n    return metadata.modificationTime;\n  });\n};\n\n\n/** @override */\ngoog.fs.EntryImpl.prototype.getMetadata = function() {\n  var d = new goog.async.Deferred();\n\n  this.entry_.getMetadata(function(metadata) {\n    d.callback(metadata);\n  }, goog.bind(function(err) {\n    var msg = 'retrieving metadata for ' + this.getFullPath();\n    d.errback(new goog.fs.Error(err, msg));\n  }, this));\n  return d;\n};\n\n\n/** @override */\ngoog.fs.EntryImpl.prototype.moveTo = function(parent, opt_newName) {\n  var d = new goog.async.Deferred();\n  this.entry_.moveTo(\n      /** @type {!goog.fs.DirectoryEntryImpl} */ (parent).dir_, opt_newName,\n      goog.bind(function(entry) {\n        d.callback(this.wrapEntry(entry));\n      }, this), goog.bind(function(err) {\n        var msg = 'moving ' + this.getFullPath() + ' into ' +\n            parent.getFullPath() +\n            (opt_newName ? ', renaming to ' + opt_newName : '');\n        d.errback(new goog.fs.Error(err, msg));\n      }, this));\n  return d;\n};\n\n\n/** @override */\ngoog.fs.EntryImpl.prototype.copyTo = function(parent, opt_newName) {\n  var d = new goog.async.Deferred();\n  this.entry_.copyTo(\n      /** @type {!goog.fs.DirectoryEntryImpl} */ (parent).dir_, opt_newName,\n      goog.bind(function(entry) {\n        d.callback(this.wrapEntry(entry));\n      }, this), goog.bind(function(err) {\n        var msg = 'copying ' + this.getFullPath() + ' into ' +\n            parent.getFullPath() +\n            (opt_newName ? ', renaming to ' + opt_newName : '');\n        d.errback(new goog.fs.Error(err, msg));\n      }, this));\n  return d;\n};\n\n\n/** @override */\ngoog.fs.EntryImpl.prototype.wrapEntry = function(entry) {\n  return entry.isFile ?\n      new goog.fs.FileEntryImpl(this.fs_, /** @type {!FileEntry} */ (entry)) :\n      new goog.fs.DirectoryEntryImpl(\n          this.fs_, /** @type {!DirectoryEntry} */ (entry));\n};\n\n\n/** @override */\ngoog.fs.EntryImpl.prototype.toUrl = function(opt_mimeType) {\n  return this.entry_.toURL(opt_mimeType);\n};\n\n\n/** @override */\ngoog.fs.EntryImpl.prototype.toUri = goog.fs.EntryImpl.prototype.toUrl;\n\n\n/** @override */\ngoog.fs.EntryImpl.prototype.remove = function() {\n  var d = new goog.async.Deferred();\n  this.entry_.remove(\n      goog.bind(d.callback, d, true /* result */), goog.bind(function(err) {\n        var msg = 'removing ' + this.getFullPath();\n        d.errback(new goog.fs.Error(err, msg));\n      }, this));\n  return d;\n};\n\n\n/** @override */\ngoog.fs.EntryImpl.prototype.getParent = function() {\n  var d = new goog.async.Deferred();\n  this.entry_.getParent(goog.bind(function(parent) {\n    d.callback(new goog.fs.DirectoryEntryImpl(this.fs_, parent));\n  }, this), goog.bind(function(err) {\n    var msg = 'getting parent of ' + this.getFullPath();\n    d.errback(new goog.fs.Error(err, msg));\n  }, this));\n  return d;\n};\n\n\n\n/**\n * A directory in a local FileSystem.\n *\n * This should not be instantiated directly. Instead, it should be accessed via\n * {@link goog.fs.FileSystem#getRoot} or\n * {@link goog.fs.DirectoryEntry#getDirectoryEntry}.\n *\n * @param {!goog.fs.FileSystem} fs The wrapped filesystem.\n * @param {!DirectoryEntry} dir The underlying DirectoryEntry object.\n * @constructor\n * @extends {goog.fs.EntryImpl}\n * @implements {goog.fs.DirectoryEntry}\n * @final\n */\ngoog.fs.DirectoryEntryImpl = function(fs, dir) {\n  goog.fs.DirectoryEntryImpl.base(this, 'constructor', fs, dir);\n\n  /**\n   * The underlying DirectoryEntry object.\n   *\n   * @type {!DirectoryEntry}\n   * @private\n   */\n  this.dir_ = dir;\n};\ngoog.inherits(goog.fs.DirectoryEntryImpl, goog.fs.EntryImpl);\n\n\n/** @override */\ngoog.fs.DirectoryEntryImpl.prototype.getFile = function(path, opt_behavior) {\n  var d = new goog.async.Deferred();\n  this.dir_.getFile(\n      path, this.getOptions_(opt_behavior), goog.bind(function(entry) {\n        d.callback(new goog.fs.FileEntryImpl(this.fs_, entry));\n      }, this), goog.bind(function(err) {\n        var msg = 'loading file ' + path + ' from ' + this.getFullPath();\n        d.errback(new goog.fs.Error(err, msg));\n      }, this));\n  return d;\n};\n\n\n/** @override */\ngoog.fs.DirectoryEntryImpl.prototype.getDirectory = function(\n    path, opt_behavior) {\n  var d = new goog.async.Deferred();\n  this.dir_.getDirectory(\n      path, this.getOptions_(opt_behavior), goog.bind(function(entry) {\n        d.callback(new goog.fs.DirectoryEntryImpl(this.fs_, entry));\n      }, this), goog.bind(function(err) {\n        var msg = 'loading directory ' + path + ' from ' + this.getFullPath();\n        d.errback(new goog.fs.Error(err, msg));\n      }, this));\n  return d;\n};\n\n\n/** @override */\ngoog.fs.DirectoryEntryImpl.prototype.createPath = function(path) {\n  // If the path begins at the root, reinvoke createPath on the root directory.\n  if (goog.string.startsWith(path, '/')) {\n    var root = this.getFileSystem().getRoot();\n    if (this.getFullPath() != root.getFullPath()) {\n      return root.createPath(path);\n    }\n  }\n\n  // Filter out any empty path components caused by '//' or a leading slash.\n  var parts = goog.array.filter(path.split('/'), goog.functions.identity);\n\n  /**\n   * @param {goog.fs.DirectoryEntryImpl} dir\n   * @return {!goog.async.Deferred}\n   */\n  function getNextDirectory(dir) {\n    if (!parts.length) {\n      return goog.async.Deferred.succeed(dir);\n    }\n\n    var def;\n    var nextDir = parts.shift();\n\n    if (nextDir == '..') {\n      def = dir.getParent();\n    } else if (nextDir == '.') {\n      def = goog.async.Deferred.succeed(dir);\n    } else {\n      def = dir.getDirectory(nextDir, goog.fs.DirectoryEntry.Behavior.CREATE);\n    }\n    return def.addCallback(getNextDirectory);\n  }\n\n  return getNextDirectory(this);\n};\n\n\n/** @override */\ngoog.fs.DirectoryEntryImpl.prototype.listDirectory = function() {\n  var d = new goog.async.Deferred();\n  var reader = this.dir_.createReader();\n  var results = [];\n\n  var errorCallback = goog.bind(function(err) {\n    var msg = 'listing directory ' + this.getFullPath();\n    d.errback(new goog.fs.Error(err, msg));\n  }, this);\n\n  var successCallback = goog.bind(function(entries) {\n    if (entries.length) {\n      for (var i = 0, entry; entry = entries[i]; i++) {\n        results.push(this.wrapEntry(entry));\n      }\n      reader.readEntries(successCallback, errorCallback);\n    } else {\n      d.callback(results);\n    }\n  }, this);\n\n  reader.readEntries(successCallback, errorCallback);\n  return d;\n};\n\n\n/** @override */\ngoog.fs.DirectoryEntryImpl.prototype.removeRecursively = function() {\n  var d = new goog.async.Deferred();\n  this.dir_.removeRecursively(\n      goog.bind(d.callback, d, true /* result */), goog.bind(function(err) {\n        var msg = 'removing ' + this.getFullPath() + ' recursively';\n        d.errback(new goog.fs.Error(err, msg));\n      }, this));\n  return d;\n};\n\n\n/**\n * Converts a value in the Behavior enum into an options object expected by the\n * File API.\n *\n * @param {goog.fs.DirectoryEntry.Behavior=} opt_behavior The behavior for\n *     existing files.\n * @return {!Object<boolean>} The options object expected by the File API.\n * @private\n */\ngoog.fs.DirectoryEntryImpl.prototype.getOptions_ = function(opt_behavior) {\n  if (opt_behavior == goog.fs.DirectoryEntry.Behavior.CREATE) {\n    return {'create': true};\n  } else if (opt_behavior == goog.fs.DirectoryEntry.Behavior.CREATE_EXCLUSIVE) {\n    return {'create': true, 'exclusive': true};\n  } else {\n    return {};\n  }\n};\n\n\n\n/**\n * A file in a local filesystem.\n *\n * This should not be instantiated directly. Instead, it should be accessed via\n * {@link goog.fs.DirectoryEntry#getFile}.\n *\n * @param {!goog.fs.FileSystem} fs The wrapped filesystem.\n * @param {!FileEntry} file The underlying FileEntry object.\n * @constructor\n * @extends {goog.fs.EntryImpl}\n * @implements {goog.fs.FileEntry}\n * @final\n */\ngoog.fs.FileEntryImpl = function(fs, file) {\n  goog.fs.FileEntryImpl.base(this, 'constructor', fs, file);\n\n  /**\n   * The underlying FileEntry object.\n   *\n   * @type {!FileEntry}\n   * @private\n   */\n  this.file_ = file;\n};\ngoog.inherits(goog.fs.FileEntryImpl, goog.fs.EntryImpl);\n\n\n/** @override */\ngoog.fs.FileEntryImpl.prototype.createWriter = function() {\n  var d = new goog.async.Deferred();\n  this.file_.createWriter(function(w) {\n    d.callback(new goog.fs.FileWriter(w));\n  }, goog.bind(function(err) {\n    var msg = 'creating writer for ' + this.getFullPath();\n    d.errback(new goog.fs.Error(err, msg));\n  }, this));\n  return d;\n};\n\n\n/** @override */\ngoog.fs.FileEntryImpl.prototype.file = function() {\n  var d = new goog.async.Deferred();\n  this.file_.file(function(f) { d.callback(f); }, goog.bind(function(err) {\n    var msg = 'getting file for ' + this.getFullPath();\n    d.errback(new goog.fs.Error(err, msg));\n  }, this));\n  return d;\n};\n","^9I",1579837703000,"^9J",["^9K",["^;<","^9L","~$goog.fs.FileEntry","^IE","^9>","~$goog.fs.FileWriter","~$goog.fs.Entry","~$goog.fs.DirectoryEntry","^?Z","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fs/entryimpl.js"],"^:1",["^9K",["~$goog.fs.FileEntryImpl","~$goog.fs.EntryImpl","~$goog.fs.DirectoryEntryImpl"]],"^9<",true,"^9=",["^9>","^;9","^?Z","^IW","^IV","^IE","^IT","^IU","^;<","^9L"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.menurenderer.js","^9C",["^9D","goog/ui/menurenderer.js"],"^9E","goog/ui/menurenderer.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for {@link goog.ui.Menu}s.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.ui.MenuRenderer');\n\ngoog.forwardDeclare('goog.ui.Menu');\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.ui.ContainerRenderer');\ngoog.require('goog.ui.Separator');\n\n\n\n/**\n * Default renderer for {@link goog.ui.Menu}s, based on {@link\n * goog.ui.ContainerRenderer}.\n * @param {string=} opt_ariaRole Optional ARIA role used for the element.\n * @constructor\n * @extends {goog.ui.ContainerRenderer}\n */\ngoog.ui.MenuRenderer = function(opt_ariaRole) {\n  goog.ui.ContainerRenderer.call(\n      this, opt_ariaRole || goog.a11y.aria.Role.MENU);\n};\ngoog.inherits(goog.ui.MenuRenderer, goog.ui.ContainerRenderer);\ngoog.addSingletonGetter(goog.ui.MenuRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of toolbars rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.MenuRenderer.CSS_CLASS = goog.getCssName('goog-menu');\n\n\n/**\n * Returns whether the element is a UL or acceptable to our superclass.\n * @param {Element} element Element to decorate.\n * @return {boolean} Whether the renderer can decorate the element.\n * @override\n */\ngoog.ui.MenuRenderer.prototype.canDecorate = function(element) {\n  return element.tagName == goog.dom.TagName.UL ||\n      goog.ui.MenuRenderer.superClass_.canDecorate.call(this, element);\n};\n\n\n/**\n * Inspects the element, and creates an instance of {@link goog.ui.Control} or\n * an appropriate subclass best suited to decorate it.  Overrides the superclass\n * implementation by recognizing HR elements as separators.\n * @param {Element} element Element to decorate.\n * @return {goog.ui.Control?} A new control suitable to decorate the element\n *     (null if none).\n * @override\n */\ngoog.ui.MenuRenderer.prototype.getDecoratorForChild = function(element) {\n  return element.tagName == goog.dom.TagName.HR ?\n      new goog.ui.Separator() :\n      goog.ui.MenuRenderer.superClass_.getDecoratorForChild.call(this, element);\n};\n\n\n/**\n * Returns whether the given element is contained in the menu's DOM.\n * @param {goog.ui.Menu} menu The menu to test.\n * @param {Element} element The element to test.\n * @return {boolean} Whether the given element is contained in the menu.\n */\ngoog.ui.MenuRenderer.prototype.containsElement = function(menu, element) {\n  return goog.dom.contains(menu.getElement(), element);\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of containers\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.MenuRenderer.prototype.getCssClass = function() {\n  return goog.ui.MenuRenderer.CSS_CLASS;\n};\n\n\n/** @override */\ngoog.ui.MenuRenderer.prototype.initializeDom = function(container) {\n  goog.ui.MenuRenderer.superClass_.initializeDom.call(this, container);\n\n  var element = container.getElement();\n  goog.asserts.assert(element, 'The menu DOM element cannot be null.');\n  goog.a11y.aria.setState(element, goog.a11y.aria.State.HASPOPUP, 'true');\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","~$goog.ui.ContainerRenderer","^?H","^?Q","^;G","^9>","^?M","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/menurenderer.js"],"^:1",["^9K",["^GE"]],"^9<",true,"^9=",["^9>","^?H","^;G","^?M","^:E","^;;","^;=","^I[","^?Q"]],["^ ","^9A",[1579837703000],"^9B","goog.promise.promise.js","^9C",["^9D","goog/promise/promise.js"],"^9E","goog/promise/promise.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.Promise');\n\ngoog.require('goog.Thenable');\ngoog.require('goog.asserts');\ngoog.require('goog.async.FreeList');\ngoog.require('goog.async.run');\ngoog.require('goog.async.throwException');\ngoog.require('goog.debug.Error');\ngoog.require('goog.promise.Resolver');\n\n\n\n/**\n * NOTE: This class was created in anticipation of the built-in Promise type\n * being standardized and implemented across browsers. Now that Promise is\n * available in modern browsers, and is automatically polyfilled by the Closure\n * Compiler, by default, most new code should use native `Promise`\n * instead of `goog.Promise`. However, `goog.Promise` has the\n * concept of cancellation which native Promises do not yet have. So code\n * needing cancellation may still want to use `goog.Promise`.\n *\n * Promises provide a result that may be resolved asynchronously. A Promise may\n * be resolved by being fulfilled with a fulfillment value, rejected with a\n * rejection reason, or blocked by another Promise. A Promise is said to be\n * settled if it is either fulfilled or rejected. Once settled, the Promise\n * result is immutable.\n *\n * Promises may represent results of any type, including undefined. Rejection\n * reasons are typically Errors, but may also be of any type. Closure Promises\n * allow for optional type annotations that enforce that fulfillment values are\n * of the appropriate types at compile time.\n *\n * The result of a Promise is accessible by calling `then` and registering\n * `onFulfilled` and `onRejected` callbacks. Once the Promise\n * is settled, the relevant callbacks are invoked with the fulfillment value or\n * rejection reason as argument. Callbacks are always invoked in the order they\n * were registered, even when additional `then` calls are made from inside\n * another callback. A callback is always run asynchronously sometime after the\n * scope containing the registering `then` invocation has returned.\n *\n * If a Promise is resolved with another Promise, the first Promise will block\n * until the second is settled, and then assumes the same result as the second\n * Promise. This allows Promises to depend on the results of other Promises,\n * linking together multiple asynchronous operations.\n *\n * This implementation is compatible with the Promises/A+ specification and\n * passes that specification's conformance test suite. A Closure Promise may be\n * resolved with a Promise instance (or sufficiently compatible Promise-like\n * object) created by other Promise implementations. From the specification,\n * Promise-like objects are known as \"Thenables\".\n *\n * @see http://promisesaplus.com/\n *\n * @param {function(\n *             this:RESOLVER_CONTEXT,\n *             function((TYPE|IThenable<TYPE>|Thenable)=),\n *             function(*=)): void} resolver\n *     Initialization function that is invoked immediately with `resolve`\n *     and `reject` functions as arguments. The Promise is resolved or\n *     rejected with the first argument passed to either function.\n * @param {RESOLVER_CONTEXT=} opt_context An optional context for executing the\n *     resolver function. If unspecified, the resolver function will be executed\n *     in the default scope.\n * @constructor\n * @struct\n * @final\n * @implements {goog.Thenable<TYPE>}\n * @template TYPE,RESOLVER_CONTEXT\n */\ngoog.Promise = function(resolver, opt_context) {\n  /**\n   * The internal state of this Promise. Either PENDING, FULFILLED, REJECTED, or\n   * BLOCKED.\n   * @private {goog.Promise.State_}\n   */\n  this.state_ = goog.Promise.State_.PENDING;\n\n  /**\n   * The settled result of the Promise. Immutable once set with either a\n   * fulfillment value or rejection reason.\n   * @private {*}\n   */\n  this.result_ = undefined;\n\n  /**\n   * For Promises created by calling `then()`, the originating parent.\n   * @private {?goog.Promise}\n   */\n  this.parent_ = null;\n\n  /**\n   * The linked list of `onFulfilled` and `onRejected` callbacks\n   * added to this Promise by calls to `then()`.\n   * @private {?goog.Promise.CallbackEntry_}\n   */\n  this.callbackEntries_ = null;\n\n  /**\n   * The tail of the linked list of `onFulfilled` and `onRejected`\n   * callbacks added to this Promise by calls to `then()`.\n   * @private {?goog.Promise.CallbackEntry_}\n   */\n  this.callbackEntriesTail_ = null;\n\n  /**\n   * Whether the Promise is in the queue of Promises to execute.\n   * @private {boolean}\n   */\n  this.executing_ = false;\n\n  if (goog.Promise.UNHANDLED_REJECTION_DELAY > 0) {\n    /**\n     * A timeout ID used when the `UNHANDLED_REJECTION_DELAY` is greater\n     * than 0 milliseconds. The ID is set when the Promise is rejected, and\n     * cleared only if an `onRejected` callback is invoked for the\n     * Promise (or one of its descendants) before the delay is exceeded.\n     *\n     * If the rejection is not handled before the timeout completes, the\n     * rejection reason is passed to the unhandled rejection handler.\n     * @private {number}\n     */\n    this.unhandledRejectionId_ = 0;\n  } else if (goog.Promise.UNHANDLED_REJECTION_DELAY == 0) {\n    /**\n     * When the `UNHANDLED_REJECTION_DELAY` is set to 0 milliseconds, a\n     * boolean that is set if the Promise is rejected, and reset to false if an\n     * `onRejected` callback is invoked for the Promise (or one of its\n     * descendants). If the rejection is not handled before the next timestep,\n     * the rejection reason is passed to the unhandled rejection handler.\n     * @private {boolean}\n     */\n    this.hadUnhandledRejection_ = false;\n  }\n\n  if (goog.Promise.LONG_STACK_TRACES) {\n    /**\n     * A list of stack trace frames pointing to the locations where this Promise\n     * was created or had callbacks added to it. Saved to add additional context\n     * to stack traces when an exception is thrown.\n     * @private {!Array<string>}\n     */\n    this.stack_ = [];\n    this.addStackTrace_(new Error('created'));\n\n    /**\n     * Index of the most recently executed stack frame entry.\n     * @private {number}\n     */\n    this.currentStep_ = 0;\n  }\n\n  // As an optimization, we can skip this if resolver is goog.nullFunction.\n  // This value is passed internally when creating a promise which will be\n  // resolved through a more optimized path.\n  if (resolver != goog.nullFunction) {\n    try {\n      var self = this;\n      resolver.call(\n          opt_context,\n          function(value) {\n            self.resolve_(goog.Promise.State_.FULFILLED, value);\n          },\n          function(reason) {\n            if (goog.DEBUG &&\n                !(reason instanceof goog.Promise.CancellationError)) {\n              try {\n                // Promise was rejected. Step up one call frame to see why.\n                if (reason instanceof Error) {\n                  throw reason;\n                } else {\n                  throw new Error('Promise rejected.');\n                }\n              } catch (e) {\n                // Only thrown so browser dev tools can catch rejections of\n                // promises when the option to break on caught exceptions is\n                // activated.\n              }\n            }\n            self.resolve_(goog.Promise.State_.REJECTED, reason);\n          });\n    } catch (e) {\n      this.resolve_(goog.Promise.State_.REJECTED, e);\n    }\n  }\n};\n\n\n/**\n * @define {boolean} Whether traces of `then` calls should be included in\n * exceptions thrown\n */\ngoog.Promise.LONG_STACK_TRACES =\n    goog.define('goog.Promise.LONG_STACK_TRACES', false);\n\n\n/**\n * @define {number} The delay in milliseconds before a rejected Promise's reason\n * is passed to the rejection handler. By default, the rejection handler\n * rethrows the rejection reason so that it appears in the developer console or\n * `window.onerror` handler.\n *\n * Rejections are rethrown as quickly as possible by default. A negative value\n * disables rejection handling entirely.\n */\ngoog.Promise.UNHANDLED_REJECTION_DELAY =\n    goog.define('goog.Promise.UNHANDLED_REJECTION_DELAY', 0);\n\n\n/**\n * The possible internal states for a Promise. These states are not directly\n * observable to external callers.\n * @enum {number}\n * @private\n */\ngoog.Promise.State_ = {\n  /** The Promise is waiting for resolution. */\n  PENDING: 0,\n\n  /** The Promise is blocked waiting for the result of another Thenable. */\n  BLOCKED: 1,\n\n  /** The Promise has been resolved with a fulfillment value. */\n  FULFILLED: 2,\n\n  /** The Promise has been resolved with a rejection reason. */\n  REJECTED: 3\n};\n\n\n\n/**\n * Entries in the callback chain. Each call to `then`,\n * `thenCatch`, or `thenAlways` creates an entry containing the\n * functions that may be invoked once the Promise is settled.\n *\n * @private @final @struct @constructor\n */\ngoog.Promise.CallbackEntry_ = function() {\n  /** @type {?goog.Promise} */\n  this.child = null;\n  /** @type {?Function} */\n  this.onFulfilled = null;\n  /** @type {?Function} */\n  this.onRejected = null;\n  /** @type {?} */\n  this.context = null;\n  /** @type {?goog.Promise.CallbackEntry_} */\n  this.next = null;\n\n  /**\n   * A boolean value to indicate this is a \"thenAlways\" callback entry.\n   * Unlike a normal \"then/thenVoid\" a \"thenAlways doesn't participate\n   * in \"cancel\" considerations but is simply an observer and requires\n   * special handling.\n   * @type {boolean}\n   */\n  this.always = false;\n};\n\n\n/** clear the object prior to reuse */\ngoog.Promise.CallbackEntry_.prototype.reset = function() {\n  this.child = null;\n  this.onFulfilled = null;\n  this.onRejected = null;\n  this.context = null;\n  this.always = false;\n};\n\n\n/**\n * @define {number} The number of currently unused objects to keep around for\n *    reuse.\n */\ngoog.Promise.DEFAULT_MAX_UNUSED =\n    goog.define('goog.Promise.DEFAULT_MAX_UNUSED', 100);\n\n\n/** @const @private {goog.async.FreeList<!goog.Promise.CallbackEntry_>} */\ngoog.Promise.freelist_ = new goog.async.FreeList(\n    function() { return new goog.Promise.CallbackEntry_(); },\n    function(item) { item.reset(); }, goog.Promise.DEFAULT_MAX_UNUSED);\n\n\n/**\n * @param {Function} onFulfilled\n * @param {Function} onRejected\n * @param {?} context\n * @return {!goog.Promise.CallbackEntry_}\n * @private\n */\ngoog.Promise.getCallbackEntry_ = function(onFulfilled, onRejected, context) {\n  var entry = goog.Promise.freelist_.get();\n  entry.onFulfilled = onFulfilled;\n  entry.onRejected = onRejected;\n  entry.context = context;\n  return entry;\n};\n\n\n/**\n * @param {!goog.Promise.CallbackEntry_} entry\n * @private\n */\ngoog.Promise.returnEntry_ = function(entry) {\n  goog.Promise.freelist_.put(entry);\n};\n\n\n// NOTE: this is the same template expression as is used for\n// goog.IThenable.prototype.then\n\n\n/**\n * @param {VALUE=} opt_value\n * @return {RESULT} A new Promise that is immediately resolved\n *     with the given value. If the input value is already a goog.Promise, it\n *     will be returned immediately without creating a new instance.\n * @template VALUE\n * @template RESULT := type('goog.Promise',\n *     cond(isUnknown(VALUE), unknown(),\n *       mapunion(VALUE, (V) =>\n *         cond(isTemplatized(V) && sub(rawTypeOf(V), 'IThenable'),\n *           templateTypeOf(V, 0),\n *           cond(sub(V, 'Thenable'),\n *              unknown(),\n *              V)))))\n * =:\n */\ngoog.Promise.resolve = function(opt_value) {\n  if (opt_value instanceof goog.Promise) {\n    // Avoid creating a new object if we already have a promise object\n    // of the correct type.\n    return opt_value;\n  }\n\n  // Passing goog.nullFunction will cause the constructor to take an optimized\n  // path that skips calling the resolver function.\n  var promise = new goog.Promise(goog.nullFunction);\n  promise.resolve_(goog.Promise.State_.FULFILLED, opt_value);\n  return promise;\n};\n\n\n/**\n * @param {*=} opt_reason\n * @return {!goog.Promise} A new Promise that is immediately rejected with the\n *     given reason.\n */\ngoog.Promise.reject = function(opt_reason) {\n  return new goog.Promise(function(resolve, reject) { reject(opt_reason); });\n};\n\n\n/**\n * This is identical to\n * {@code goog.Promise.resolve(value).then(onFulfilled, onRejected)}, but it\n * avoids creating an unnecessary wrapper Promise when `value` is already\n * thenable.\n *\n * @param {?(goog.Thenable<TYPE>|Thenable|TYPE)} value\n * @param {function(TYPE): ?} onFulfilled\n * @param {function(*): *} onRejected\n * @template TYPE\n * @private\n */\ngoog.Promise.resolveThen_ = function(value, onFulfilled, onRejected) {\n  var isThenable =\n      goog.Promise.maybeThen_(value, onFulfilled, onRejected, null);\n  if (!isThenable) {\n    goog.async.run(goog.partial(onFulfilled, value));\n  }\n};\n\n\n/**\n * @param {!Array<?(goog.Promise<TYPE>|goog.Thenable<TYPE>|Thenable|*)>}\n *     promises\n * @return {!goog.Promise<TYPE>} A Promise that receives the result of the\n *     first Promise (or Promise-like) input to settle immediately after it\n *     settles.\n * @template TYPE\n */\ngoog.Promise.race = function(promises) {\n  return new goog.Promise(function(resolve, reject) {\n    if (!promises.length) {\n      resolve(undefined);\n    }\n    for (var i = 0, promise; i < promises.length; i++) {\n      promise = promises[i];\n      goog.Promise.resolveThen_(promise, resolve, reject);\n    }\n  });\n};\n\n\n/**\n * @param {!Array<?(goog.Promise<TYPE>|goog.Thenable<TYPE>|Thenable|*)>}\n *     promises\n * @return {!goog.Promise<!Array<TYPE>>} A Promise that receives a list of\n *     every fulfilled value once every input Promise (or Promise-like) is\n *     successfully fulfilled, or is rejected with the first rejection reason\n *     immediately after it is rejected.\n * @template TYPE\n */\ngoog.Promise.all = function(promises) {\n  return new goog.Promise(function(resolve, reject) {\n    var toFulfill = promises.length;\n    var values = [];\n\n    if (!toFulfill) {\n      resolve(values);\n      return;\n    }\n\n    var onFulfill = function(index, value) {\n      toFulfill--;\n      values[index] = value;\n      if (toFulfill == 0) {\n        resolve(values);\n      }\n    };\n\n    var onReject = function(reason) { reject(reason); };\n\n    for (var i = 0, promise; i < promises.length; i++) {\n      promise = promises[i];\n      goog.Promise.resolveThen_(promise, goog.partial(onFulfill, i), onReject);\n    }\n  });\n};\n\n\n/**\n * @param {!Array<?(goog.Promise<TYPE>|goog.Thenable<TYPE>|Thenable|*)>}\n *     promises\n * @return {!goog.Promise<!Array<{\n *     fulfilled: boolean,\n *     value: (TYPE|undefined),\n *     reason: (*|undefined)}>>} A Promise that resolves with a list of\n *         result objects once all input Promises (or Promise-like) have\n *         settled. Each result object contains a 'fulfilled' boolean indicating\n *         whether an input Promise was fulfilled or rejected. For fulfilled\n *         Promises, the resulting value is stored in the 'value' field. For\n *         rejected Promises, the rejection reason is stored in the 'reason'\n *         field.\n * @template TYPE\n */\ngoog.Promise.allSettled = function(promises) {\n  return new goog.Promise(function(resolve, reject) {\n    var toSettle = promises.length;\n    var results = [];\n\n    if (!toSettle) {\n      resolve(results);\n      return;\n    }\n\n    var onSettled = function(index, fulfilled, result) {\n      toSettle--;\n      results[index] = fulfilled ? {fulfilled: true, value: result} :\n                                   {fulfilled: false, reason: result};\n      if (toSettle == 0) {\n        resolve(results);\n      }\n    };\n\n    for (var i = 0, promise; i < promises.length; i++) {\n      promise = promises[i];\n      goog.Promise.resolveThen_(\n          promise, goog.partial(onSettled, i, true /* fulfilled */),\n          goog.partial(onSettled, i, false /* fulfilled */));\n    }\n  });\n};\n\n\n/**\n * @param {!Array<?(goog.Promise<TYPE>|goog.Thenable<TYPE>|Thenable|*)>}\n *     promises\n * @return {!goog.Promise<TYPE>} A Promise that receives the value of the first\n *     input to be fulfilled, or is rejected with a list of every rejection\n *     reason if all inputs are rejected.\n * @template TYPE\n */\ngoog.Promise.firstFulfilled = function(promises) {\n  return new goog.Promise(function(resolve, reject) {\n    var toReject = promises.length;\n    var reasons = [];\n\n    if (!toReject) {\n      resolve(undefined);\n      return;\n    }\n\n    var onFulfill = function(value) { resolve(value); };\n\n    var onReject = function(index, reason) {\n      toReject--;\n      reasons[index] = reason;\n      if (toReject == 0) {\n        reject(reasons);\n      }\n    };\n\n    for (var i = 0, promise; i < promises.length; i++) {\n      promise = promises[i];\n      goog.Promise.resolveThen_(promise, onFulfill, goog.partial(onReject, i));\n    }\n  });\n};\n\n\n/**\n * @return {!goog.promise.Resolver<TYPE>} Resolver wrapping the promise and its\n *     resolve / reject functions. Resolving or rejecting the resolver\n *     resolves or rejects the promise.\n * @template TYPE\n */\ngoog.Promise.withResolver = function() {\n  var resolve, reject;\n  var promise = new goog.Promise(function(rs, rj) {\n    resolve = rs;\n    reject = rj;\n  });\n  return new goog.Promise.Resolver_(promise, resolve, reject);\n};\n\n\n/**\n * Adds callbacks that will operate on the result of the Promise, returning a\n * new child Promise.\n *\n * If the Promise is fulfilled, the `onFulfilled` callback will be invoked\n * with the fulfillment value as argument, and the child Promise will be\n * fulfilled with the return value of the callback. If the callback throws an\n * exception, the child Promise will be rejected with the thrown value instead.\n *\n * If the Promise is rejected, the `onRejected` callback will be invoked\n * with the rejection reason as argument, and the child Promise will be resolved\n * with the return value or rejected with the thrown value of the callback.\n *\n * @override\n */\ngoog.Promise.prototype.then = function(\n    opt_onFulfilled, opt_onRejected, opt_context) {\n\n  if (opt_onFulfilled != null) {\n    goog.asserts.assertFunction(\n        opt_onFulfilled, 'opt_onFulfilled should be a function.');\n  }\n  if (opt_onRejected != null) {\n    goog.asserts.assertFunction(\n        opt_onRejected,\n        'opt_onRejected should be a function. Did you pass opt_context ' +\n            'as the second argument instead of the third?');\n  }\n\n  if (goog.Promise.LONG_STACK_TRACES) {\n    this.addStackTrace_(new Error('then'));\n  }\n\n  return this.addChildPromise_(\n      goog.isFunction(opt_onFulfilled) ? opt_onFulfilled : null,\n      goog.isFunction(opt_onRejected) ? opt_onRejected : null, opt_context);\n};\ngoog.Thenable.addImplementation(goog.Promise);\n\n\n/**\n * Adds callbacks that will operate on the result of the Promise without\n * returning a child Promise (unlike \"then\").\n *\n * If the Promise is fulfilled, the `onFulfilled` callback will be invoked\n * with the fulfillment value as argument.\n *\n * If the Promise is rejected, the `onRejected` callback will be invoked\n * with the rejection reason as argument.\n *\n * @param {?(function(this:THIS, TYPE):?)=} opt_onFulfilled A\n *     function that will be invoked with the fulfillment value if the Promise\n *     is fulfilled.\n * @param {?(function(this:THIS, *): *)=} opt_onRejected A function that will\n *     be invoked with the rejection reason if the Promise is rejected.\n * @param {THIS=} opt_context An optional context object that will be the\n *     execution context for the callbacks. By default, functions are executed\n *     with the default this.\n * @package\n * @template THIS\n */\ngoog.Promise.prototype.thenVoid = function(\n    opt_onFulfilled, opt_onRejected, opt_context) {\n\n  if (opt_onFulfilled != null) {\n    goog.asserts.assertFunction(\n        opt_onFulfilled, 'opt_onFulfilled should be a function.');\n  }\n  if (opt_onRejected != null) {\n    goog.asserts.assertFunction(\n        opt_onRejected,\n        'opt_onRejected should be a function. Did you pass opt_context ' +\n            'as the second argument instead of the third?');\n  }\n\n  if (goog.Promise.LONG_STACK_TRACES) {\n    this.addStackTrace_(new Error('then'));\n  }\n\n  // Note: no default rejection handler is provided here as we need to\n  // distinguish unhandled rejections.\n  this.addCallbackEntry_(\n      goog.Promise.getCallbackEntry_(\n          opt_onFulfilled || goog.nullFunction, opt_onRejected || null,\n          opt_context));\n};\n\n\n/**\n * Adds a callback that will be invoked when the Promise is settled (fulfilled\n * or rejected). The callback receives no argument, and no new child Promise is\n * created. This is useful for ensuring that cleanup takes place after certain\n * asynchronous operations. Callbacks added with `thenAlways` will be\n * executed in the same order with other calls to `then`,\n * `thenAlways`, or `thenCatch`.\n *\n * Since it does not produce a new child Promise, cancellation propagation is\n * not prevented by adding callbacks with `thenAlways`. A Promise that has\n * a cleanup handler added with `thenAlways` will be canceled if all of\n * its children created by `then` (or `thenCatch`) are canceled.\n * Additionally, since any rejections are not passed to the callback, it does\n * not stop the unhandled rejection handler from running.\n *\n * @param {function(this:THIS): void} onSettled A function that will be invoked\n *     when the Promise is settled (fulfilled or rejected).\n * @param {THIS=} opt_context An optional context object that will be the\n *     execution context for the callbacks. By default, functions are executed\n *     in the global scope.\n * @return {!goog.Promise<TYPE>} This Promise, for chaining additional calls.\n * @template THIS\n */\ngoog.Promise.prototype.thenAlways = function(onSettled, opt_context) {\n  if (goog.Promise.LONG_STACK_TRACES) {\n    this.addStackTrace_(new Error('thenAlways'));\n  }\n\n  var entry = goog.Promise.getCallbackEntry_(onSettled, onSettled, opt_context);\n  entry.always = true;\n  this.addCallbackEntry_(entry);\n  return this;\n};\n\n\n/**\n * Adds a callback that will be invoked only if the Promise is rejected. This\n * is equivalent to `then(null, onRejected)`.\n *\n * @param {function(this:THIS, *): *} onRejected A function that will be\n *     invoked with the rejection reason if this Promise is rejected.\n * @param {THIS=} opt_context An optional context object that will be the\n *     execution context for the callbacks. By default, functions are executed\n *     in the global scope.\n * @return {!goog.Promise} A new Promise that will resolve either to the\n *     value of this promise, or if this promise is rejected, the result of\n *     `onRejected`. The returned Promise will reject if `onRejected` throws.\n * @template THIS\n */\ngoog.Promise.prototype.thenCatch = function(onRejected, opt_context) {\n  if (goog.Promise.LONG_STACK_TRACES) {\n    this.addStackTrace_(new Error('thenCatch'));\n  }\n  return this.addChildPromise_(null, onRejected, opt_context);\n};\n\n\n/**\n * Cancels the Promise if it is still pending by rejecting it with a cancel\n * Error. No action is performed if the Promise is already resolved.\n *\n * All child Promises of the canceled Promise will be rejected with the same\n * cancel error, as with normal Promise rejection. If the Promise to be canceled\n * is the only child of a pending Promise, the parent Promise will also be\n * canceled. Cancellation may propagate upward through multiple generations.\n *\n * @param {string=} opt_message An optional debugging message for describing the\n *     cancellation reason.\n */\ngoog.Promise.prototype.cancel = function(opt_message) {\n  if (this.state_ == goog.Promise.State_.PENDING) {\n    // Instantiate Error object synchronously. This ensures Error::stack points\n    // to the cancel() callsite.\n    var err = new goog.Promise.CancellationError(opt_message);\n    goog.async.run(function() {\n      this.cancelInternal_(err);\n    }, this);\n  }\n};\n\n\n/**\n * Cancels this Promise with the given error.\n *\n * @param {!Error} err The cancellation error.\n * @private\n */\ngoog.Promise.prototype.cancelInternal_ = function(err) {\n  if (this.state_ == goog.Promise.State_.PENDING) {\n    if (this.parent_) {\n      // Cancel the Promise and remove it from the parent's child list.\n      this.parent_.cancelChild_(this, err);\n      this.parent_ = null;\n    } else {\n      this.resolve_(goog.Promise.State_.REJECTED, err);\n    }\n  }\n};\n\n\n/**\n * Cancels a child Promise from the list of callback entries. If the Promise has\n * not already been resolved, reject it with a cancel error. If there are no\n * other children in the list of callback entries, propagate the cancellation\n * by canceling this Promise as well.\n *\n * @param {!goog.Promise} childPromise The Promise to cancel.\n * @param {!Error} err The cancel error to use for rejecting the Promise.\n * @private\n */\ngoog.Promise.prototype.cancelChild_ = function(childPromise, err) {\n  if (!this.callbackEntries_) {\n    return;\n  }\n  var childCount = 0;\n  var childEntry = null;\n  var beforeChildEntry = null;\n\n  // Find the callback entry for the childPromise, and count whether there are\n  // additional child Promises.\n  for (var entry = this.callbackEntries_; entry; entry = entry.next) {\n    if (!entry.always) {\n      childCount++;\n      if (entry.child == childPromise) {\n        childEntry = entry;\n      }\n      if (childEntry && childCount > 1) {\n        break;\n      }\n    }\n    if (!childEntry) {\n      beforeChildEntry = entry;\n    }\n  }\n\n  // Can a child entry be missing?\n\n  // If the child Promise was the only child, cancel this Promise as well.\n  // Otherwise, reject only the child Promise with the cancel error.\n  if (childEntry) {\n    if (this.state_ == goog.Promise.State_.PENDING && childCount == 1) {\n      this.cancelInternal_(err);\n    } else {\n      if (beforeChildEntry) {\n        this.removeEntryAfter_(beforeChildEntry);\n      } else {\n        this.popEntry_();\n      }\n\n      this.executeCallback_(childEntry, goog.Promise.State_.REJECTED, err);\n    }\n  }\n};\n\n\n/**\n * Adds a callback entry to the current Promise, and schedules callback\n * execution if the Promise has already been settled.\n *\n * @param {goog.Promise.CallbackEntry_} callbackEntry Record containing\n *     `onFulfilled` and `onRejected` callbacks to execute after\n *     the Promise is settled.\n * @private\n */\ngoog.Promise.prototype.addCallbackEntry_ = function(callbackEntry) {\n  if (!this.hasEntry_() && (this.state_ == goog.Promise.State_.FULFILLED ||\n                            this.state_ == goog.Promise.State_.REJECTED)) {\n    this.scheduleCallbacks_();\n  }\n  this.queueEntry_(callbackEntry);\n};\n\n\n/**\n * Creates a child Promise and adds it to the callback entry list. The result of\n * the child Promise is determined by the state of the parent Promise and the\n * result of the `onFulfilled` or `onRejected` callbacks as\n * specified in the Promise resolution procedure.\n *\n * @see http://promisesaplus.com/#the__method\n *\n * @param {?function(this:THIS, TYPE):\n *          (RESULT|goog.Promise<RESULT>|Thenable)} onFulfilled A callback that\n *     will be invoked if the Promise is fulfilled, or null.\n * @param {?function(this:THIS, *): *} onRejected A callback that will be\n *     invoked if the Promise is rejected, or null.\n * @param {THIS=} opt_context An optional execution context for the callbacks.\n *     in the default calling context.\n * @return {!goog.Promise} The child Promise.\n * @template RESULT,THIS\n * @private\n */\ngoog.Promise.prototype.addChildPromise_ = function(\n    onFulfilled, onRejected, opt_context) {\n\n  /** @type {goog.Promise.CallbackEntry_} */\n  var callbackEntry = goog.Promise.getCallbackEntry_(null, null, null);\n\n  callbackEntry.child = new goog.Promise(function(resolve, reject) {\n    // Invoke onFulfilled, or resolve with the parent's value if absent.\n    callbackEntry.onFulfilled = onFulfilled ? function(value) {\n      try {\n        var result = onFulfilled.call(opt_context, value);\n        resolve(result);\n      } catch (err) {\n        reject(err);\n      }\n    } : resolve;\n\n    // Invoke onRejected, or reject with the parent's reason if absent.\n    callbackEntry.onRejected = onRejected ? function(reason) {\n      try {\n        var result = onRejected.call(opt_context, reason);\n        if (result === undefined &&\n            reason instanceof goog.Promise.CancellationError) {\n          // Propagate cancellation to children if no other result is returned.\n          reject(reason);\n        } else {\n          resolve(result);\n        }\n      } catch (err) {\n        reject(err);\n      }\n    } : reject;\n  });\n\n  callbackEntry.child.parent_ = this;\n  this.addCallbackEntry_(callbackEntry);\n  return callbackEntry.child;\n};\n\n\n/**\n * Unblocks the Promise and fulfills it with the given value.\n *\n * @param {TYPE} value\n * @private\n */\ngoog.Promise.prototype.unblockAndFulfill_ = function(value) {\n  goog.asserts.assert(this.state_ == goog.Promise.State_.BLOCKED);\n  this.state_ = goog.Promise.State_.PENDING;\n  this.resolve_(goog.Promise.State_.FULFILLED, value);\n};\n\n\n/**\n * Unblocks the Promise and rejects it with the given rejection reason.\n *\n * @param {*} reason\n * @private\n */\ngoog.Promise.prototype.unblockAndReject_ = function(reason) {\n  goog.asserts.assert(this.state_ == goog.Promise.State_.BLOCKED);\n  this.state_ = goog.Promise.State_.PENDING;\n  this.resolve_(goog.Promise.State_.REJECTED, reason);\n};\n\n\n/**\n * Attempts to resolve a Promise with a given resolution state and value. This\n * is a no-op if the given Promise has already been resolved.\n *\n * If the given result is a Thenable (such as another Promise), the Promise will\n * be settled with the same state and result as the Thenable once it is itself\n * settled.\n *\n * If the given result is not a Thenable, the Promise will be settled (fulfilled\n * or rejected) with that result based on the given state.\n *\n * @see http://promisesaplus.com/#the_promise_resolution_procedure\n *\n * @param {goog.Promise.State_} state\n * @param {*} x The result to apply to the Promise.\n * @private\n */\ngoog.Promise.prototype.resolve_ = function(state, x) {\n  if (this.state_ != goog.Promise.State_.PENDING) {\n    return;\n  }\n\n  if (this === x) {\n    state = goog.Promise.State_.REJECTED;\n    x = new TypeError('Promise cannot resolve to itself');\n  }\n\n  this.state_ = goog.Promise.State_.BLOCKED;\n  var isThenable = goog.Promise.maybeThen_(\n      x, this.unblockAndFulfill_, this.unblockAndReject_, this);\n  if (isThenable) {\n    return;\n  }\n\n  this.result_ = x;\n  this.state_ = state;\n  // Since we can no longer be canceled, remove link to parent, so that the\n  // child promise does not keep the parent promise alive.\n  this.parent_ = null;\n  this.scheduleCallbacks_();\n\n  if (state == goog.Promise.State_.REJECTED &&\n      !(x instanceof goog.Promise.CancellationError)) {\n    goog.Promise.addUnhandledRejection_(this, x);\n  }\n};\n\n\n/**\n * Invokes the \"then\" method of an input value if that value is a Thenable. This\n * is a no-op if the value is not thenable.\n *\n * @param {?} value A potentially thenable value.\n * @param {!Function} onFulfilled\n * @param {!Function} onRejected\n * @param {?} context\n * @return {boolean} Whether the input value was thenable.\n * @private\n */\ngoog.Promise.maybeThen_ = function(value, onFulfilled, onRejected, context) {\n  if (value instanceof goog.Promise) {\n    value.thenVoid(onFulfilled, onRejected, context);\n    return true;\n  } else if (goog.Thenable.isImplementedBy(value)) {\n    value = /** @type {!goog.Thenable} */ (value);\n    value.then(onFulfilled, onRejected, context);\n    return true;\n  } else if (goog.isObject(value)) {\n    try {\n      var then = value['then'];\n      if (goog.isFunction(then)) {\n        goog.Promise.tryThen_(value, then, onFulfilled, onRejected, context);\n        return true;\n      }\n    } catch (e) {\n      onRejected.call(context, e);\n      return true;\n    }\n  }\n\n  return false;\n};\n\n\n/**\n * Attempts to call the `then` method on an object in the hopes that it is\n * a Promise-compatible instance. This allows interoperation between different\n * Promise implementations, however a non-compliant object may cause a Promise\n * to hang indefinitely. If the `then` method throws an exception, the\n * dependent Promise will be rejected with the thrown value.\n *\n * @see http://promisesaplus.com/#point-70\n *\n * @param {Thenable} thenable An object with a `then` method that may be\n *     compatible with the Promise/A+ specification.\n * @param {!Function} then The `then` method of the Thenable object.\n * @param {!Function} onFulfilled\n * @param {!Function} onRejected\n * @param {*} context\n * @private\n */\ngoog.Promise.tryThen_ = function(\n    thenable, then, onFulfilled, onRejected, context) {\n\n  var called = false;\n  var resolve = function(value) {\n    if (!called) {\n      called = true;\n      onFulfilled.call(context, value);\n    }\n  };\n\n  var reject = function(reason) {\n    if (!called) {\n      called = true;\n      onRejected.call(context, reason);\n    }\n  };\n\n  try {\n    then.call(thenable, resolve, reject);\n  } catch (e) {\n    reject(e);\n  }\n};\n\n\n/**\n * Executes the pending callbacks of a settled Promise after a timeout.\n *\n * Section 2.2.4 of the Promises/A+ specification requires that Promise\n * callbacks must only be invoked from a call stack that only contains Promise\n * implementation code, which we accomplish by invoking callback execution after\n * a timeout. If `startExecution_` is called multiple times for the same\n * Promise, the callback chain will be evaluated only once. Additional callbacks\n * may be added during the evaluation phase, and will be executed in the same\n * event loop.\n *\n * All Promises added to the waiting list during the same browser event loop\n * will be executed in one batch to avoid using a separate timeout per Promise.\n *\n * @private\n */\ngoog.Promise.prototype.scheduleCallbacks_ = function() {\n  if (!this.executing_) {\n    this.executing_ = true;\n    goog.async.run(this.executeCallbacks_, this);\n  }\n};\n\n\n/**\n * @return {boolean} Whether there are any pending callbacks queued.\n * @private\n */\ngoog.Promise.prototype.hasEntry_ = function() {\n  return !!this.callbackEntries_;\n};\n\n\n/**\n * @param {goog.Promise.CallbackEntry_} entry\n * @private\n */\ngoog.Promise.prototype.queueEntry_ = function(entry) {\n  goog.asserts.assert(entry.onFulfilled != null);\n\n  if (this.callbackEntriesTail_) {\n    this.callbackEntriesTail_.next = entry;\n    this.callbackEntriesTail_ = entry;\n  } else {\n    // It the work queue was empty set the head too.\n    this.callbackEntries_ = entry;\n    this.callbackEntriesTail_ = entry;\n  }\n};\n\n\n/**\n * @return {goog.Promise.CallbackEntry_} entry\n * @private\n */\ngoog.Promise.prototype.popEntry_ = function() {\n  var entry = null;\n  if (this.callbackEntries_) {\n    entry = this.callbackEntries_;\n    this.callbackEntries_ = entry.next;\n    entry.next = null;\n  }\n  // It the work queue is empty clear the tail too.\n  if (!this.callbackEntries_) {\n    this.callbackEntriesTail_ = null;\n  }\n\n  if (entry != null) {\n    goog.asserts.assert(entry.onFulfilled != null);\n  }\n  return entry;\n};\n\n\n/**\n * @param {goog.Promise.CallbackEntry_} previous\n * @private\n */\ngoog.Promise.prototype.removeEntryAfter_ = function(previous) {\n  goog.asserts.assert(this.callbackEntries_);\n  goog.asserts.assert(previous != null);\n  // If the last entry is being removed, update the tail\n  if (previous.next == this.callbackEntriesTail_) {\n    this.callbackEntriesTail_ = previous;\n  }\n\n  previous.next = previous.next.next;\n};\n\n\n/**\n * Executes all pending callbacks for this Promise.\n *\n * @private\n */\ngoog.Promise.prototype.executeCallbacks_ = function() {\n  var entry = null;\n  while (entry = this.popEntry_()) {\n    if (goog.Promise.LONG_STACK_TRACES) {\n      this.currentStep_++;\n    }\n    this.executeCallback_(entry, this.state_, this.result_);\n  }\n  this.executing_ = false;\n};\n\n\n/**\n * Executes a pending callback for this Promise. Invokes an `onFulfilled`\n * or `onRejected` callback based on the settled state of the Promise.\n *\n * @param {!goog.Promise.CallbackEntry_} callbackEntry An entry containing the\n *     onFulfilled and/or onRejected callbacks for this step.\n * @param {goog.Promise.State_} state The resolution status of the Promise,\n *     either FULFILLED or REJECTED.\n * @param {*} result The settled result of the Promise.\n * @private\n */\ngoog.Promise.prototype.executeCallback_ = function(\n    callbackEntry, state, result) {\n  // Cancel an unhandled rejection if the then/thenVoid call had an onRejected.\n  if (state == goog.Promise.State_.REJECTED && callbackEntry.onRejected &&\n      !callbackEntry.always) {\n    this.removeUnhandledRejection_();\n  }\n\n  if (callbackEntry.child) {\n    // When the parent is settled, the child no longer needs to hold on to it,\n    // as the parent can no longer be canceled.\n    callbackEntry.child.parent_ = null;\n    goog.Promise.invokeCallback_(callbackEntry, state, result);\n  } else {\n    // Callbacks created with thenAlways or thenVoid do not have the rejection\n    // handling code normally set up in the child Promise.\n    try {\n      callbackEntry.always ?\n          callbackEntry.onFulfilled.call(callbackEntry.context) :\n          goog.Promise.invokeCallback_(callbackEntry, state, result);\n    } catch (err) {\n      goog.Promise.handleRejection_.call(null, err);\n    }\n  }\n  goog.Promise.returnEntry_(callbackEntry);\n};\n\n\n/**\n * Executes the onFulfilled or onRejected callback for a callbackEntry.\n *\n * @param {!goog.Promise.CallbackEntry_} callbackEntry\n * @param {goog.Promise.State_} state\n * @param {*} result\n * @private\n */\ngoog.Promise.invokeCallback_ = function(callbackEntry, state, result) {\n  if (state == goog.Promise.State_.FULFILLED) {\n    callbackEntry.onFulfilled.call(callbackEntry.context, result);\n  } else if (callbackEntry.onRejected) {\n    callbackEntry.onRejected.call(callbackEntry.context, result);\n  }\n};\n\n\n/**\n * Records a stack trace entry for functions that call `then` or the\n * Promise constructor. May be disabled by unsetting `LONG_STACK_TRACES`.\n *\n * @param {!Error} err An Error object created by the calling function for\n *     providing a stack trace.\n * @private\n */\ngoog.Promise.prototype.addStackTrace_ = function(err) {\n  if (goog.Promise.LONG_STACK_TRACES && typeof err.stack === 'string') {\n    // Extract the third line of the stack trace, which is the entry for the\n    // user function that called into Promise code.\n    var trace = err.stack.split('\\n', 4)[3];\n    var message = err.message;\n\n    // Pad the message to align the traces.\n    message += Array(11 - message.length).join(' ');\n    this.stack_.push(message + trace);\n  }\n};\n\n\n/**\n * Adds extra stack trace information to an exception for the list of\n * asynchronous `then` calls that have been run for this Promise. Stack\n * trace information is recorded in {@see #addStackTrace_}, and appended to\n * rethrown errors when `LONG_STACK_TRACES` is enabled.\n *\n * @param {?} err An unhandled exception captured during callback execution.\n * @private\n */\ngoog.Promise.prototype.appendLongStack_ = function(err) {\n  if (goog.Promise.LONG_STACK_TRACES && err && typeof err.stack === 'string' &&\n      this.stack_.length) {\n    var longTrace = ['Promise trace:'];\n\n    for (var promise = this; promise; promise = promise.parent_) {\n      for (var i = this.currentStep_; i >= 0; i--) {\n        longTrace.push(promise.stack_[i]);\n      }\n      longTrace.push(\n          'Value: ' +\n          '[' + (promise.state_ == goog.Promise.State_.REJECTED ? 'REJECTED' :\n                                                                  'FULFILLED') +\n          '] ' +\n          '<' + String(promise.result_) + '>');\n    }\n    err.stack += '\\n\\n' + longTrace.join('\\n');\n  }\n};\n\n\n/**\n * Marks this rejected Promise as having being handled. Also marks any parent\n * Promises in the rejected state as handled. The rejection handler will no\n * longer be invoked for this Promise (if it has not been called already).\n *\n * @private\n */\ngoog.Promise.prototype.removeUnhandledRejection_ = function() {\n  if (goog.Promise.UNHANDLED_REJECTION_DELAY > 0) {\n    for (var p = this; p && p.unhandledRejectionId_; p = p.parent_) {\n      goog.global.clearTimeout(p.unhandledRejectionId_);\n      p.unhandledRejectionId_ = 0;\n    }\n  } else if (goog.Promise.UNHANDLED_REJECTION_DELAY == 0) {\n    for (var p = this; p && p.hadUnhandledRejection_; p = p.parent_) {\n      p.hadUnhandledRejection_ = false;\n    }\n  }\n};\n\n\n/**\n * Marks this rejected Promise as unhandled. If no `onRejected` callback\n * is called for this Promise before the `UNHANDLED_REJECTION_DELAY`\n * expires, the reason will be passed to the unhandled rejection handler. The\n * handler typically rethrows the rejection reason so that it becomes visible in\n * the developer console.\n *\n * @param {!goog.Promise} promise The rejected Promise.\n * @param {*} reason The Promise rejection reason.\n * @private\n */\ngoog.Promise.addUnhandledRejection_ = function(promise, reason) {\n  if (goog.Promise.UNHANDLED_REJECTION_DELAY > 0) {\n    promise.unhandledRejectionId_ = goog.global.setTimeout(function() {\n      promise.appendLongStack_(reason);\n      goog.Promise.handleRejection_.call(null, reason);\n    }, goog.Promise.UNHANDLED_REJECTION_DELAY);\n\n  } else if (goog.Promise.UNHANDLED_REJECTION_DELAY == 0) {\n    promise.hadUnhandledRejection_ = true;\n    goog.async.run(function() {\n      if (promise.hadUnhandledRejection_) {\n        promise.appendLongStack_(reason);\n        goog.Promise.handleRejection_.call(null, reason);\n      }\n    });\n  }\n};\n\n\n/**\n * A method that is invoked with the rejection reasons for Promises that are\n * rejected but have no `onRejected` callbacks registered yet.\n * @type {function(*)}\n * @private\n */\ngoog.Promise.handleRejection_ = goog.async.throwException;\n\n\n/**\n * Sets a handler that will be called with reasons from unhandled rejected\n * Promises. If the rejected Promise (or one of its descendants) has an\n * `onRejected` callback registered, the rejection will be considered\n * handled, and the rejection handler will not be called.\n *\n * By default, unhandled rejections are rethrown so that the error may be\n * captured by the developer console or a `window.onerror` handler.\n *\n * @param {function(*)} handler A function that will be called with reasons from\n *     rejected Promises. Defaults to `goog.async.throwException`.\n */\ngoog.Promise.setUnhandledRejectionHandler = function(handler) {\n  goog.Promise.handleRejection_ = handler;\n};\n\n\n\n/**\n * Error used as a rejection reason for canceled Promises.\n *\n * @param {string=} opt_message\n * @constructor\n * @extends {goog.debug.Error}\n * @final\n */\ngoog.Promise.CancellationError = function(opt_message) {\n  goog.Promise.CancellationError.base(this, 'constructor', opt_message);\n};\ngoog.inherits(goog.Promise.CancellationError, goog.debug.Error);\n\n\n/** @override */\ngoog.Promise.CancellationError.prototype.name = 'cancel';\n\n\n\n/**\n * Internal implementation of the resolver interface.\n *\n * @param {!goog.Promise<TYPE>} promise\n * @param {function((TYPE|goog.Promise<TYPE>|Thenable)=)} resolve\n * @param {function(*=): void} reject\n * @implements {goog.promise.Resolver<TYPE>}\n * @final @struct\n * @constructor\n * @private\n * @template TYPE\n */\ngoog.Promise.Resolver_ = function(promise, resolve, reject) {\n  /** @const */\n  this.promise = promise;\n\n  /** @const */\n  this.resolve = resolve;\n\n  /** @const */\n  this.reject = reject;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^:3","~$goog.async.throwException","^9>","^;R","^<:","^>D","^:9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/promise/promise.js"],"^:1",["^9K",["^:4"]],"^9<",true,"^9=",["^9>","^:9","^:E","^<:","^:3","^J0","^;R","^>D"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.componentutil.js","^9C",["^9D","goog/ui/componentutil.js"],"^9E","goog/ui/componentutil.js","^9F","^9G","^9H","// Copyright 2018 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Static utility methods for UI components.\n */\n\ngoog.provide('goog.ui.ComponentUtil');\n\ngoog.require('goog.events.MouseAsMouseEventType');\ngoog.require('goog.events.MouseEvents');\ngoog.require('goog.events.PointerAsMouseEventType');\n\n\n\n/**\n * @param {!goog.ui.Component} component\n * @return {!goog.events.MouseEvents} The browser events that should be listened\n *     to for the given mouse events.\n */\ngoog.ui.ComponentUtil.getMouseEventType = function(component) {\n  return component.pointerEventsEnabled() ?\n      goog.events.PointerAsMouseEventType :\n      goog.events.MouseAsMouseEventType;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.events.MouseAsMouseEventType","~$goog.events.PointerAsMouseEventType","~$goog.events.MouseEvents"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/componentutil.js"],"^:1",["^9K",["~$goog.ui.ComponentUtil"]],"^9<",true,"^9=",["^9>","^J1","^J3","^J2"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.submenurenderer.js","^9C",["^9D","goog/ui/submenurenderer.js"],"^9E","goog/ui/submenurenderer.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for {@link goog.ui.SubMenu}s.\n *\n */\n\ngoog.provide('goog.ui.SubMenuRenderer');\n\ngoog.forwardDeclare('goog.ui.SubMenu');\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.style');\ngoog.require('goog.ui.Menu');\ngoog.require('goog.ui.MenuItemRenderer');\n\n\n\n/**\n * Default renderer for {@link goog.ui.SubMenu}s.  Each item has the following\n * structure:\n *\n *    <div class=\"goog-submenu\">\n *      ...(menuitem content)...\n *      <div class=\"goog-menu\">\n *        ... (submenu content) ...\n *      </div>\n *    </div>\n *\n * @constructor\n * @extends {goog.ui.MenuItemRenderer}\n */\ngoog.ui.SubMenuRenderer = function() {\n  goog.ui.MenuItemRenderer.call(this);\n};\ngoog.inherits(goog.ui.SubMenuRenderer, goog.ui.MenuItemRenderer);\ngoog.addSingletonGetter(goog.ui.SubMenuRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.SubMenuRenderer.CSS_CLASS = goog.getCssName('goog-submenu');\n\n\n/**\n * The CSS class for submenus that displays the submenu arrow.\n * @type {string}\n * @private\n */\ngoog.ui.SubMenuRenderer.CSS_CLASS_SUBMENU_ =\n    goog.getCssName('goog-submenu-arrow');\n\n\n/**\n * Overrides {@link goog.ui.MenuItemRenderer#createDom} by adding\n * the additional class 'goog-submenu' to the created element,\n * and passes the element to {@link goog.ui.SubMenuItemRenderer#addArrow_}\n * to add an child element that can be styled to show an arrow.\n * @param {goog.ui.Control} control goog.ui.SubMenu to render.\n * @return {!Element} Root element for the item.\n * @override\n */\ngoog.ui.SubMenuRenderer.prototype.createDom = function(control) {\n  var subMenu = /** @type {goog.ui.SubMenu} */ (control);\n  var element =\n      goog.ui.SubMenuRenderer.superClass_.createDom.call(this, subMenu);\n  goog.asserts.assert(element);\n  goog.dom.classlist.add(element, goog.ui.SubMenuRenderer.CSS_CLASS);\n  this.addArrow_(subMenu, element);\n  return element;\n};\n\n\n/**\n * Overrides {@link goog.ui.MenuItemRenderer#decorate} by adding\n * the additional class 'goog-submenu' to the decorated element,\n * and passing the element to {@link goog.ui.SubMenuItemRenderer#addArrow_}\n * to add a child element that can be styled to show an arrow.\n * Also searches the element for a child with the class goog-menu. If a\n * matching child element is found, creates a goog.ui.Menu, uses it to\n * decorate the child element, and passes that menu to subMenu.setMenu.\n * @param {goog.ui.Control} control goog.ui.SubMenu to render.\n * @param {Element} element Element to decorate.\n * @return {!Element} Root element for the item.\n * @override\n */\ngoog.ui.SubMenuRenderer.prototype.decorate = function(control, element) {\n  var subMenu = /** @type {goog.ui.SubMenu} */ (control);\n  element =\n      goog.ui.SubMenuRenderer.superClass_.decorate.call(this, subMenu, element);\n  goog.asserts.assert(element);\n  goog.dom.classlist.add(element, goog.ui.SubMenuRenderer.CSS_CLASS);\n  this.addArrow_(subMenu, element);\n\n  // Search for a child menu and decorate it.\n  var childMenuEls = goog.dom.getElementsByTagNameAndClass(\n      goog.dom.TagName.DIV, goog.getCssName('goog-menu'), element);\n  if (childMenuEls.length) {\n    var childMenu = new goog.ui.Menu(subMenu.getDomHelper());\n    var childMenuEl = childMenuEls[0];\n    // Hide the menu element before attaching it to the document body; see\n    // bug 1089244.\n    goog.style.setElementShown(childMenuEl, false);\n    subMenu.getDomHelper().getDocument().body.appendChild(childMenuEl);\n    childMenu.decorate(childMenuEl);\n    subMenu.setMenu(childMenu, true);\n  }\n  return element;\n};\n\n\n/**\n * Takes a menu item's root element, and sets its content to the given text\n * caption or DOM structure.  Overrides the superclass immplementation by\n * making sure that the submenu arrow structure is preserved.\n * @param {Element} element The item's root element.\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to be\n *     set as the item's content.\n * @override\n */\ngoog.ui.SubMenuRenderer.prototype.setContent = function(element, content) {\n  // Save the submenu arrow element, if present.\n  var contentElement = this.getContentElement(element);\n  var arrowElement = contentElement && contentElement.lastChild;\n  goog.ui.SubMenuRenderer.superClass_.setContent.call(this, element, content);\n  // If the arrowElement was there, is no longer there, and really was an arrow,\n  // reappend it.\n  if (arrowElement && contentElement.lastChild != arrowElement &&\n      goog.dom.classlist.contains(\n          /** @type {!Element} */ (arrowElement),\n          goog.ui.SubMenuRenderer.CSS_CLASS_SUBMENU_)) {\n    contentElement.appendChild(arrowElement);\n  }\n};\n\n\n/**\n * Overrides {@link goog.ui.MenuItemRenderer#initializeDom} to tweak\n * the DOM structure for the span.goog-submenu-arrow element\n * depending on the text direction (LTR or RTL). When the SubMenu is RTL\n * the arrow will be given the additional class of goog-submenu-arrow-rtl,\n * and the arrow will be moved up to be the first child in the SubMenu's\n * element. Otherwise the arrow will have the class goog-submenu-arrow-ltr,\n * and be kept as the last child of the SubMenu's element.\n * @param {goog.ui.Control} control goog.ui.SubMenu whose DOM is to be\n *     initialized as it enters the document.\n * @override\n */\ngoog.ui.SubMenuRenderer.prototype.initializeDom = function(control) {\n  var subMenu = /** @type {goog.ui.SubMenu} */ (control);\n  goog.ui.SubMenuRenderer.superClass_.initializeDom.call(this, subMenu);\n  var element = subMenu.getContentElement();\n  var arrow = subMenu.getDomHelper().getElementsByTagNameAndClass(\n      goog.dom.TagName.SPAN, goog.ui.SubMenuRenderer.CSS_CLASS_SUBMENU_,\n      element)[0];\n  goog.ui.SubMenuRenderer.setArrowTextContent_(subMenu, arrow);\n  if (arrow != element.lastChild) {\n    element.appendChild(arrow);\n  }\n  var subMenuElement = subMenu.getElement();\n  goog.asserts.assert(\n      subMenuElement, 'The sub menu DOM element cannot be null.');\n  goog.a11y.aria.setState(\n      subMenuElement, goog.a11y.aria.State.HASPOPUP, 'true');\n};\n\n\n/**\n * Appends a child node with the class goog.getCssName('goog-submenu-arrow') or\n * 'goog-submenu-arrow-rtl' which can be styled to show an arrow.\n * @param {goog.ui.SubMenu} subMenu SubMenu to render.\n * @param {Element} element Element to decorate.\n * @private\n */\ngoog.ui.SubMenuRenderer.prototype.addArrow_ = function(subMenu, element) {\n  var arrow = subMenu.getDomHelper().createDom(goog.dom.TagName.SPAN);\n  arrow.className = goog.ui.SubMenuRenderer.CSS_CLASS_SUBMENU_;\n  goog.ui.SubMenuRenderer.setArrowTextContent_(subMenu, arrow);\n  this.getContentElement(element).appendChild(arrow);\n};\n\n\n/**\n * The unicode char for a left arrow.\n * @type {string}\n * @private\n */\ngoog.ui.SubMenuRenderer.LEFT_ARROW_ = '\\u25C4';\n\n\n/**\n * The unicode char for a right arrow.\n * @type {string}\n * @private\n */\ngoog.ui.SubMenuRenderer.RIGHT_ARROW_ = '\\u25BA';\n\n\n/**\n * Set the text content of an arrow.\n * @param {goog.ui.SubMenu} subMenu The sub menu that owns the arrow.\n * @param {Element} arrow The arrow element.\n * @private\n */\ngoog.ui.SubMenuRenderer.setArrowTextContent_ = function(subMenu, arrow) {\n  // Fix arrow rtl\n  var leftArrow = goog.ui.SubMenuRenderer.LEFT_ARROW_;\n  var rightArrow = goog.ui.SubMenuRenderer.RIGHT_ARROW_;\n\n  goog.asserts.assert(arrow);\n\n  if (subMenu.isRightToLeft()) {\n    goog.dom.classlist.add(arrow, goog.getCssName('goog-submenu-arrow-rtl'));\n    // Unicode character - Black left-pointing pointer iff aligned to end.\n    goog.dom.setTextContent(\n        arrow, subMenu.isAlignedToEnd() ? leftArrow : rightArrow);\n  } else {\n    goog.dom.classlist.remove(arrow, goog.getCssName('goog-submenu-arrow-rtl'));\n    // Unicode character - Black right-pointing pointer iff aligned to end.\n    goog.dom.setTextContent(\n        arrow, subMenu.isAlignedToEnd() ? rightArrow : leftArrow);\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^:;","^?H","^9>","^A3","^GF","^?M","^<3","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/submenurenderer.js"],"^:1",["^9K",["~$goog.ui.SubMenuRenderer"]],"^9<",true,"^9=",["^9>","^?H","^?M","^:E","^;;","^;=","^:;","^<3","^GF","^A3"]],["^ ","^9A",[1579837703000],"^9B","goog.editor.plugins.listtabhandler.js","^9C",["^9D","goog/editor/plugins/listtabhandler.js"],"^9E","goog/editor/plugins/listtabhandler.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Editor plugin to handle tab keys in lists to indent and\n * outdent.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.editor.plugins.ListTabHandler');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.editor.Command');\ngoog.require('goog.editor.plugins.AbstractTabHandler');\ngoog.require('goog.iter');\n\n\n\n/**\n * Plugin to handle tab keys in lists to indent and outdent.\n * @constructor\n * @extends {goog.editor.plugins.AbstractTabHandler}\n * @final\n */\ngoog.editor.plugins.ListTabHandler = function() {\n  goog.editor.plugins.AbstractTabHandler.call(this);\n};\ngoog.inherits(\n    goog.editor.plugins.ListTabHandler, goog.editor.plugins.AbstractTabHandler);\n\n\n/** @override */\ngoog.editor.plugins.ListTabHandler.prototype.getTrogClassId = function() {\n  return 'ListTabHandler';\n};\n\n\n/** @override */\ngoog.editor.plugins.ListTabHandler.prototype.handleTabKey = function(e) {\n  var range = this.getFieldObject().getRange();\n  if (goog.dom.getAncestorByTagNameAndClass(\n          range.getContainerElement(), goog.dom.TagName.LI) ||\n      goog.iter.some(range, function(node) {\n        return node.tagName == goog.dom.TagName.LI;\n      })) {\n    this.getFieldObject().execCommand(\n        e.shiftKey ? goog.editor.Command.OUTDENT : goog.editor.Command.INDENT);\n    e.preventDefault();\n    return true;\n  }\n\n  return false;\n};\n","^9I",1579837703000,"^9J",["^9K",["^>6","^;;","^@Z","~$goog.editor.plugins.AbstractTabHandler","^9>","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/listtabhandler.js"],"^:1",["^9K",["~$goog.editor.plugins.ListTabHandler"]],"^9<",true,"^9=",["^9>","^;;","^;=","^@Z","^J6","^>6"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.i18n.asserts.js","^9C",["^9D","goog/testing/i18n/asserts.js"],"^9E","goog/testing/i18n/asserts.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Assert functions that account for locale data changes.\n *\n * The locale data gets updated from CLDR (http://cldr.unicode.org/),\n * and CLDR gets an update about twice per year.\n * So the locale data are expected to change.\n * This can make unit tests quite fragile:\n *   assertEquals(\"Dec 31, 2013, 1:23pm\", format);\n * Now imagine that the decision is made to add a dot after abbreviations,\n * and a comma between date and time.\n * The previous assert will fail, because the string is now\n *   \"Dec. 31 2013, 1:23pm\"\n *\n * One option is to not unit test the results of the formatters client side,\n * and just trust that CLDR and closure/i18n takes care of that.\n * The other option is to be a more flexible when testing.\n * This is the role of assertI18nEquals, to centralize all the small\n * differences between hard-coded values in unit tests and the current result.\n * It allows some decupling, so that the closure/i18n can be updated without\n * breaking all the clients using it.\n * For the example above, this will succeed:\n *   assertI18nEquals(\"Dec 31, 2013, 1:23pm\", \"Dec. 31, 2013 1:23pm\");\n * It does this by white-listing, no \"guessing\" involved.\n *\n * But I would say that the best practice is the first option: trust the\n * library, stop unit-testing it.\n */\n\ngoog.provide('goog.testing.i18n.asserts');\ngoog.setTestOnly('goog.testing.i18n.asserts');\n\ngoog.require('goog.testing.jsunit');\n\n\n/**\n * A map of known tests where locale data changed, but the old values are\n * still tested for by various clients.\n * @const {!Object<string, string>}\n * @private\n */\ngoog.testing.i18n.asserts.EXPECTED_VALUE_MAP_ = {\n    // NOTE: Add mappings for each test file using addI18nMapping.\n};\n\n\n/**\n * Asserts that the two values are \"almost equal\" from i18n perspective.\n * I18n-equivalent strings are set with addI18nMapping.\n *\n * @param {string} expected The expected value.\n * @param {string} actual The actual value.\n */\ngoog.testing.i18n.asserts.assertI18nEquals = function(expected, actual) {\n  if (expected === actual) {\n    return;\n  }\n\n  const newExpected = goog.testing.i18n.asserts.EXPECTED_VALUE_MAP_[expected];\n  if (newExpected === actual) {\n    return;\n  }\n\n  assertEquals(expected, actual);\n};\n\n\n/**\n * Asserts that needle, or a string i18n-equivalent to needle, is a substring of\n * haystack. I18n-equivalent strings are set with addI18nMapping.\n *\n * @param {string} needle The substring to search for.\n * @param {string} haystack The string to search within.\n */\ngoog.testing.i18n.asserts.assertI18nContains = function(needle, haystack) {\n  if (needle === haystack) {\n    return;\n  }\n\n  const newNeedle = goog.testing.i18n.asserts.EXPECTED_VALUE_MAP_[needle];\n  if (haystack.indexOf(newNeedle) !== -1) {\n    return;\n  }\n\n  assertContains(needle, haystack);\n};\n\n\n/**\n * Adds two strings as being i18n-equivalent. Call this\n * method in your unit test file to add mappings scoped to the file.\n *\n * @param {string} expected The expected string in assertI18nEquals.\n * @param {string} equivalent A string which is i18n-equal.\n */\ngoog.testing.i18n.asserts.addI18nMapping = function(expected, equivalent) {\n  if (goog.testing.i18n.asserts.EXPECTED_VALUE_MAP_.hasOwnProperty(expected)) {\n    throw new RangeError('Mapping for string already exists');\n  }\n  goog.testing.i18n.asserts.EXPECTED_VALUE_MAP_[expected] = equivalent;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.testing.jsunit"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/i18n/asserts.js"],"^:1",["^9K",["~$goog.testing.i18n.asserts"]],"^9<",true,"^9=",["^9>","^J8"]],["^ ","^9A",[1579837703000],"^9B","goog.fx.dragger.js","^9C",["^9D","goog/fx/dragger.js"],"^9E","goog/fx/dragger.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Drag Utilities.\n *\n * Provides extensible functionality for drag & drop behaviour.\n *\n * @see ../demos/drag.html\n * @see ../demos/dragger.html\n */\n\n\ngoog.provide('goog.fx.DragEvent');\ngoog.provide('goog.fx.Dragger');\ngoog.provide('goog.fx.Dragger.EventType');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.math.Rect');\ngoog.require('goog.style');\ngoog.require('goog.style.bidi');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A class that allows mouse or touch-based dragging (moving) of an element\n *\n * @param {Element} target The element that will be dragged.\n * @param {Element=} opt_handle An optional handle to control the drag, if null\n *     the target is used.\n * @param {goog.math.Rect=} opt_limits Object containing left, top, width,\n *     and height.\n *\n * @extends {goog.events.EventTarget}\n * @constructor\n * @struct\n */\ngoog.fx.Dragger = function(target, opt_handle, opt_limits) {\n  goog.fx.Dragger.base(this, 'constructor');\n\n  /**\n   * Reference to drag target element.\n   * @type {?Element}\n   */\n  this.target = target;\n\n  /**\n   * Reference to the handler that initiates the drag.\n   * @type {?Element}\n   */\n  this.handle = opt_handle || target;\n\n  /**\n   * Object representing the limits of the drag region.\n   * @type {goog.math.Rect}\n   */\n  this.limits = opt_limits || new goog.math.Rect(NaN, NaN, NaN, NaN);\n\n  /**\n   * Reference to a document object to use for the events.\n   * @private {Document}\n   */\n  this.document_ = goog.dom.getOwnerDocument(target);\n\n  /** @private {!goog.events.EventHandler} */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n  this.registerDisposable(this.eventHandler_);\n\n  /**\n   * Whether the element is rendered right-to-left. We initialize this lazily.\n   * @private {boolean|undefined}}\n   */\n  this.rightToLeft_;\n\n  /**\n   * Current x position of mouse or touch relative to viewport.\n   * @type {number}\n   */\n  this.clientX = 0;\n\n  /**\n   * Current y position of mouse or touch relative to viewport.\n   * @type {number}\n   */\n  this.clientY = 0;\n\n  /**\n   * Current x position of mouse or touch relative to screen. Deprecated because\n   * it doesn't take into affect zoom level or pixel density.\n   * @type {number}\n   * @deprecated Consider switching to clientX instead.\n   */\n  this.screenX = 0;\n\n  /**\n   * Current y position of mouse or touch relative to screen. Deprecated because\n   * it doesn't take into affect zoom level or pixel density.\n   * @type {number}\n   * @deprecated Consider switching to clientY instead.\n   */\n  this.screenY = 0;\n\n  /**\n   * The x position where the first mousedown or touchstart occurred.\n   * @type {number}\n   */\n  this.startX = 0;\n\n  /**\n   * The y position where the first mousedown or touchstart occurred.\n   * @type {number}\n   */\n  this.startY = 0;\n\n  /**\n   * Current x position of drag relative to target's parent.\n   * @type {number}\n   */\n  this.deltaX = 0;\n\n  /**\n   * Current y position of drag relative to target's parent.\n   * @type {number}\n   */\n  this.deltaY = 0;\n\n  /**\n   * The current page scroll value.\n   * @type {?goog.math.Coordinate}\n   */\n  this.pageScroll;\n\n  /**\n   * Whether dragging is currently enabled.\n   * @private {boolean}\n   */\n  this.enabled_ = true;\n\n  /**\n   * Whether object is currently being dragged.\n   * @private {boolean}\n   */\n  this.dragging_ = false;\n\n  /**\n   * Whether mousedown should be default prevented.\n   * @private {boolean}\n   **/\n  this.preventMouseDown_ = true;\n\n  /**\n   * The amount of distance, in pixels, after which a mousedown or touchstart is\n   * considered a drag.\n   * @private {number}\n   */\n  this.hysteresisDistanceSquared_ = 0;\n\n  /**\n   * The SCROLL event target used to make drag element follow scrolling.\n   * @private {?EventTarget}\n   */\n  this.scrollTarget_;\n\n  /**\n   * Whether IE drag events cancelling is on.\n   * @private {boolean}\n   */\n  this.ieDragStartCancellingOn_ = false;\n\n  /**\n   * Whether the dragger implements the changes described in http://b/6324964,\n   * making it truly RTL.  This is a temporary flag to allow clients to\n   * transition to the new behavior at their convenience.  At some point it will\n   * be the default.\n   * @private {boolean}\n   */\n  this.useRightPositioningForRtl_ = false;\n\n  // Add listener. Do not use the event handler here since the event handler is\n  // used for listeners added and removed during the drag operation.\n  goog.events.listen(\n      this.handle,\n      [goog.events.EventType.TOUCHSTART, goog.events.EventType.MOUSEDOWN],\n      this.startDrag, false, this);\n\n  /** @private {boolean} Avoids setCapture() calls to fix click handlers. */\n  this.useSetCapture_ = goog.fx.Dragger.HAS_SET_CAPTURE_;\n};\ngoog.inherits(goog.fx.Dragger, goog.events.EventTarget);\n// Dragger is meant to be extended, but defines most properties on its\n// prototype, thus making it unsuitable for sealing.\ngoog.tagUnsealableClass(goog.fx.Dragger);\n\n\n/**\n * Whether setCapture is supported by the browser.\n * IE and Gecko after 1.9.3 have setCapture. MS Edge and WebKit\n * (https://bugs.webkit.org/show_bug.cgi?id=27330) don't.\n * @type {boolean}\n * @private\n */\ngoog.fx.Dragger.HAS_SET_CAPTURE_ = goog.global.document &&\n    goog.global.document.documentElement &&\n    !!goog.global.document.documentElement.setCapture &&\n    !!goog.global.document.releaseCapture;\n\n\n/**\n * Creates copy of node being dragged.  This is a utility function to be used\n * wherever it is inappropriate for the original source to follow the mouse\n * cursor itself.\n *\n * @param {Element} sourceEl Element to copy.\n * @return {!Element} The clone of `sourceEl`.\n */\ngoog.fx.Dragger.cloneNode = function(sourceEl) {\n  var clonedEl = sourceEl.cloneNode(true),\n      origTexts =\n          goog.dom.getElementsByTagName(goog.dom.TagName.TEXTAREA, sourceEl),\n      dragTexts =\n          goog.dom.getElementsByTagName(goog.dom.TagName.TEXTAREA, clonedEl);\n  // Cloning does not copy the current value of textarea elements, so correct\n  // this manually.\n  for (var i = 0; i < origTexts.length; i++) {\n    dragTexts[i].value = origTexts[i].value;\n  }\n  switch (sourceEl.tagName) {\n    case String(goog.dom.TagName.TR):\n      return goog.dom.createDom(\n          goog.dom.TagName.TABLE, null,\n          goog.dom.createDom(goog.dom.TagName.TBODY, null, clonedEl));\n    case String(goog.dom.TagName.TD):\n    case String(goog.dom.TagName.TH):\n      return goog.dom.createDom(\n          goog.dom.TagName.TABLE, null,\n          goog.dom.createDom(\n              goog.dom.TagName.TBODY, null,\n              goog.dom.createDom(goog.dom.TagName.TR, null, clonedEl)));\n    case String(goog.dom.TagName.TEXTAREA):\n      clonedEl.value = sourceEl.value;\n    default:\n      return clonedEl;\n  }\n};\n\n\n/**\n * Constants for event names.\n * @enum {string}\n */\ngoog.fx.Dragger.EventType = {\n  // The drag action was canceled before the START event. Possible reasons:\n  // disabled dragger, dragging with the right mouse button or releasing the\n  // button before reaching the hysteresis distance.\n  EARLY_CANCEL: 'earlycancel',\n  START: 'start',\n  BEFOREDRAG: 'beforedrag',\n  DRAG: 'drag',\n  END: 'end'\n};\n\n\n/**\n * Prevents the dragger from calling setCapture(), even in browsers that support\n * it.  If the draggable item has click handlers, setCapture() can break them.\n * @param {boolean} allow True to use setCapture if the browser supports it.\n */\ngoog.fx.Dragger.prototype.setAllowSetCapture = function(allow) {\n  this.useSetCapture_ = allow && goog.fx.Dragger.HAS_SET_CAPTURE_;\n};\n\n\n/**\n * Turns on/off true RTL behavior.  This should be called immediately after\n * construction.  This is a temporary flag to allow clients to transition\n * to the new component at their convenience.  At some point true will be the\n * default.\n * @param {boolean} useRightPositioningForRtl True if \"right\" should be used for\n *     positioning, false if \"left\" should be used for positioning.\n */\ngoog.fx.Dragger.prototype.enableRightPositioningForRtl = function(\n    useRightPositioningForRtl) {\n  this.useRightPositioningForRtl_ = useRightPositioningForRtl;\n};\n\n\n/**\n * Returns the event handler, intended for subclass use.\n * @return {!goog.events.EventHandler<T>} The event handler.\n * @this {T}\n * @template T\n */\ngoog.fx.Dragger.prototype.getHandler = function() {\n  // TODO(user): templated \"this\" values currently result in \"this\" being\n  // \"unknown\" in the body of the function.\n  var self = /** @type {goog.fx.Dragger} */ (this);\n  return self.eventHandler_;\n};\n\n\n/**\n * Sets (or reset) the Drag limits after a Dragger is created.\n * @param {goog.math.Rect?} limits Object containing left, top, width,\n *     height for new Dragger limits. If target is right-to-left and\n *     enableRightPositioningForRtl(true) is called, then rect is interpreted as\n *     right, top, width, and height.\n */\ngoog.fx.Dragger.prototype.setLimits = function(limits) {\n  this.limits = limits || new goog.math.Rect(NaN, NaN, NaN, NaN);\n};\n\n\n/**\n * Sets the distance the user has to drag the element before a drag operation is\n * started.\n * @param {number} distance The number of pixels after which a mousedown and\n *     move is considered a drag.\n */\ngoog.fx.Dragger.prototype.setHysteresis = function(distance) {\n  this.hysteresisDistanceSquared_ = Math.pow(distance, 2);\n};\n\n\n/**\n * Gets the distance the user has to drag the element before a drag operation is\n * started.\n * @return {number} distance The number of pixels after which a mousedown and\n *     move is considered a drag.\n */\ngoog.fx.Dragger.prototype.getHysteresis = function() {\n  return Math.sqrt(this.hysteresisDistanceSquared_);\n};\n\n\n/**\n * Sets the SCROLL event target to make drag element follow scrolling.\n *\n * @param {EventTarget} scrollTarget The event target that dispatches SCROLL\n *     events.\n */\ngoog.fx.Dragger.prototype.setScrollTarget = function(scrollTarget) {\n  this.scrollTarget_ = scrollTarget;\n};\n\n\n/**\n * Enables cancelling of built-in IE drag events.\n * @param {boolean} cancelIeDragStart Whether to enable cancelling of IE\n *     dragstart event.\n */\ngoog.fx.Dragger.prototype.setCancelIeDragStart = function(cancelIeDragStart) {\n  this.ieDragStartCancellingOn_ = cancelIeDragStart;\n};\n\n\n/**\n * @return {boolean} Whether the dragger is enabled.\n */\ngoog.fx.Dragger.prototype.getEnabled = function() {\n  return this.enabled_;\n};\n\n\n/**\n * Set whether dragger is enabled\n * @param {boolean} enabled Whether dragger is enabled.\n */\ngoog.fx.Dragger.prototype.setEnabled = function(enabled) {\n  this.enabled_ = enabled;\n};\n\n\n/**\n * Set whether mousedown should be default prevented.\n * @param {boolean} preventMouseDown Whether mousedown should be default\n *     prevented.\n */\ngoog.fx.Dragger.prototype.setPreventMouseDown = function(preventMouseDown) {\n  this.preventMouseDown_ = preventMouseDown;\n};\n\n\n/** @override */\ngoog.fx.Dragger.prototype.disposeInternal = function() {\n  goog.fx.Dragger.superClass_.disposeInternal.call(this);\n  goog.events.unlisten(\n      this.handle,\n      [goog.events.EventType.TOUCHSTART, goog.events.EventType.MOUSEDOWN],\n      this.startDrag, false, this);\n  this.cleanUpAfterDragging_();\n\n  this.target = null;\n  this.handle = null;\n};\n\n\n/**\n * Whether the DOM element being manipulated is rendered right-to-left.\n * @return {boolean} True if the DOM element is rendered right-to-left, false\n *     otherwise.\n * @private\n */\ngoog.fx.Dragger.prototype.isRightToLeft_ = function() {\n  if (this.rightToLeft_ === undefined) {\n    this.rightToLeft_ = goog.style.isRightToLeft(this.target);\n  }\n  return this.rightToLeft_;\n};\n\n\n/**\n * Event handler that is used to start the drag\n * @param {goog.events.BrowserEvent} e Event object.\n */\ngoog.fx.Dragger.prototype.startDrag = function(e) {\n  var isMouseDown = e.type == goog.events.EventType.MOUSEDOWN;\n\n  // Dragger.startDrag() can be called by AbstractDragDrop with a mousemove\n  // event and IE does not report pressed mouse buttons on mousemove. Also,\n  // it does not make sense to check for the button if the user is already\n  // dragging.\n\n  if (this.enabled_ && !this.dragging_ &&\n      (!isMouseDown || e.isMouseActionButton())) {\n    if (this.hysteresisDistanceSquared_ == 0) {\n      if (this.fireDragStart_(e)) {\n        this.dragging_ = true;\n        if (this.preventMouseDown_ && isMouseDown) {\n          e.preventDefault();\n        }\n      } else {\n        // If the start drag is cancelled, don't setup for a drag.\n        return;\n      }\n    } else if (this.preventMouseDown_ && isMouseDown) {\n      // Need to preventDefault for hysteresis to prevent page getting selected.\n      e.preventDefault();\n    }\n    this.setupDragHandlers();\n\n    this.clientX = this.startX = e.clientX;\n    this.clientY = this.startY = e.clientY;\n    this.screenX = e.screenX;\n    this.screenY = e.screenY;\n    this.computeInitialPosition();\n    this.pageScroll = goog.dom.getDomHelper(this.document_).getDocumentScroll();\n  } else {\n    this.dispatchEvent(goog.fx.Dragger.EventType.EARLY_CANCEL);\n  }\n};\n\n\n/**\n * Sets up event handlers when dragging starts.\n * @protected\n */\ngoog.fx.Dragger.prototype.setupDragHandlers = function() {\n  var doc = this.document_;\n  var docEl = doc.documentElement;\n  // Use bubbling when we have setCapture since we got reports that IE has\n  // problems with the capturing events in combination with setCapture.\n  var useCapture = !this.useSetCapture_;\n\n  this.eventHandler_.listen(\n      doc, [goog.events.EventType.TOUCHMOVE, goog.events.EventType.MOUSEMOVE],\n      this.handleMove_, {capture: useCapture, passive: false});\n  this.eventHandler_.listen(\n      doc, [goog.events.EventType.TOUCHEND, goog.events.EventType.MOUSEUP],\n      this.endDrag, useCapture);\n\n  if (this.useSetCapture_) {\n    docEl.setCapture(false);\n    this.eventHandler_.listen(\n        docEl, goog.events.EventType.LOSECAPTURE, this.endDrag);\n  } else {\n    // Make sure we stop the dragging if the window loses focus.\n    // Don't use capture in this listener because we only want to end the drag\n    // if the actual window loses focus. Since blur events do not bubble we use\n    // a bubbling listener on the window.\n    this.eventHandler_.listen(\n        goog.dom.getWindow(doc), goog.events.EventType.BLUR, this.endDrag);\n  }\n\n  if (goog.userAgent.IE && this.ieDragStartCancellingOn_) {\n    // Cancel IE's 'ondragstart' event.\n    this.eventHandler_.listen(\n        doc, goog.events.EventType.DRAGSTART, goog.events.Event.preventDefault);\n  }\n\n  if (this.scrollTarget_) {\n    this.eventHandler_.listen(\n        this.scrollTarget_, goog.events.EventType.SCROLL, this.onScroll_,\n        useCapture);\n  }\n};\n\n\n/**\n * Fires a goog.fx.Dragger.EventType.START event.\n * @param {goog.events.BrowserEvent} e Browser event that triggered the drag.\n * @return {boolean} False iff preventDefault was called on the DragEvent.\n * @private\n */\ngoog.fx.Dragger.prototype.fireDragStart_ = function(e) {\n  return this.dispatchEvent(\n      new goog.fx.DragEvent(\n          goog.fx.Dragger.EventType.START, this, e.clientX, e.clientY, e));\n};\n\n\n/**\n * Unregisters the event handlers that are only active during dragging, and\n * releases mouse capture.\n * @private\n */\ngoog.fx.Dragger.prototype.cleanUpAfterDragging_ = function() {\n  this.eventHandler_.removeAll();\n  if (this.useSetCapture_) {\n    this.document_.releaseCapture();\n  }\n};\n\n\n/**\n * Event handler that is used to end the drag.\n * @param {goog.events.BrowserEvent} e Event object.\n * @param {boolean=} opt_dragCanceled Whether the drag has been canceled.\n */\ngoog.fx.Dragger.prototype.endDrag = function(e, opt_dragCanceled) {\n  this.cleanUpAfterDragging_();\n\n  if (this.dragging_) {\n    this.dragging_ = false;\n\n    var x = this.limitX(this.deltaX);\n    var y = this.limitY(this.deltaY);\n    var dragCanceled =\n        opt_dragCanceled || e.type == goog.events.EventType.TOUCHCANCEL;\n    this.dispatchEvent(\n        new goog.fx.DragEvent(\n            goog.fx.Dragger.EventType.END, this, e.clientX, e.clientY, e, x, y,\n            dragCanceled));\n  } else {\n    this.dispatchEvent(goog.fx.Dragger.EventType.EARLY_CANCEL);\n  }\n};\n\n\n/**\n * Event handler that is used to end the drag by cancelling it.\n * @param {goog.events.BrowserEvent} e Event object.\n */\ngoog.fx.Dragger.prototype.endDragCancel = function(e) {\n  this.endDrag(e, true);\n};\n\n\n/**\n * Event handler that is used on mouse / touch move to update the drag\n * @param {goog.events.BrowserEvent} e Event object.\n * @private\n */\ngoog.fx.Dragger.prototype.handleMove_ = function(e) {\n  if (this.enabled_) {\n    // dx in right-to-left cases is relative to the right.\n    var sign =\n        this.useRightPositioningForRtl_ && this.isRightToLeft_() ? -1 : 1;\n    var dx = sign * (e.clientX - this.clientX);\n    var dy = e.clientY - this.clientY;\n    this.clientX = e.clientX;\n    this.clientY = e.clientY;\n    this.screenX = e.screenX;\n    this.screenY = e.screenY;\n\n    if (!this.dragging_) {\n      var diffX = this.startX - this.clientX;\n      var diffY = this.startY - this.clientY;\n      var distance = diffX * diffX + diffY * diffY;\n      if (distance > this.hysteresisDistanceSquared_) {\n        if (this.fireDragStart_(e)) {\n          this.dragging_ = true;\n        } else {\n          // DragListGroup disposes of the dragger if BEFOREDRAGSTART is\n          // canceled.\n          if (!this.isDisposed()) {\n            this.endDrag(e);\n          }\n          return;\n        }\n      }\n    }\n\n    var pos = this.calculatePosition_(dx, dy);\n    var x = pos.x;\n    var y = pos.y;\n\n    if (this.dragging_) {\n      var rv = this.dispatchEvent(\n          new goog.fx.DragEvent(\n              goog.fx.Dragger.EventType.BEFOREDRAG, this, e.clientX, e.clientY,\n              e, x, y));\n\n      // Only do the defaultAction and dispatch drag event if predrag didn't\n      // prevent default\n      if (rv) {\n        this.doDrag(e, x, y, false);\n        e.preventDefault();\n      }\n    }\n  }\n};\n\n\n/**\n * Calculates the drag position.\n *\n * @param {number} dx The horizontal movement delta.\n * @param {number} dy The vertical movement delta.\n * @return {!goog.math.Coordinate} The newly calculated drag element position.\n * @private\n */\ngoog.fx.Dragger.prototype.calculatePosition_ = function(dx, dy) {\n  // Update the position for any change in body scrolling\n  var pageScroll = goog.dom.getDomHelper(this.document_).getDocumentScroll();\n  dx += pageScroll.x - this.pageScroll.x;\n  dy += pageScroll.y - this.pageScroll.y;\n  this.pageScroll = pageScroll;\n\n  this.deltaX += dx;\n  this.deltaY += dy;\n\n  var x = this.limitX(this.deltaX);\n  var y = this.limitY(this.deltaY);\n  return new goog.math.Coordinate(x, y);\n};\n\n\n/**\n * Event handler for scroll target scrolling.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.fx.Dragger.prototype.onScroll_ = function(e) {\n  var pos = this.calculatePosition_(0, 0);\n  e.clientX = this.clientX;\n  e.clientY = this.clientY;\n  this.doDrag(e, pos.x, pos.y, true);\n};\n\n\n/**\n * @param {goog.events.BrowserEvent} e The closure object\n *     representing the browser event that caused a drag event.\n * @param {number} x The new horizontal position for the drag element.\n * @param {number} y The new vertical position for the drag element.\n * @param {boolean} dragFromScroll Whether dragging was caused by scrolling\n *     the associated scroll target.\n * @protected\n */\ngoog.fx.Dragger.prototype.doDrag = function(e, x, y, dragFromScroll) {\n  this.defaultAction(x, y);\n  this.dispatchEvent(\n      new goog.fx.DragEvent(\n          goog.fx.Dragger.EventType.DRAG, this, e.clientX, e.clientY, e, x, y));\n};\n\n\n/**\n * Returns the 'real' x after limits are applied (allows for some\n * limits to be undefined).\n * @param {number} x X-coordinate to limit.\n * @return {number} The 'real' X-coordinate after limits are applied.\n */\ngoog.fx.Dragger.prototype.limitX = function(x) {\n  var rect = this.limits;\n  var left = !isNaN(rect.left) ? rect.left : null;\n  var width = !isNaN(rect.width) ? rect.width : 0;\n  var maxX = left != null ? left + width : Infinity;\n  var minX = left != null ? left : -Infinity;\n  return Math.min(maxX, Math.max(minX, x));\n};\n\n\n/**\n * Returns the 'real' y after limits are applied (allows for some\n * limits to be undefined).\n * @param {number} y Y-coordinate to limit.\n * @return {number} The 'real' Y-coordinate after limits are applied.\n */\ngoog.fx.Dragger.prototype.limitY = function(y) {\n  var rect = this.limits;\n  var top = !isNaN(rect.top) ? rect.top : null;\n  var height = !isNaN(rect.height) ? rect.height : 0;\n  var maxY = top != null ? top + height : Infinity;\n  var minY = top != null ? top : -Infinity;\n  return Math.min(maxY, Math.max(minY, y));\n};\n\n\n/**\n * Overridable function for computing the initial position of the target\n * before dragging begins.\n * @protected\n */\ngoog.fx.Dragger.prototype.computeInitialPosition = function() {\n  this.deltaX = this.useRightPositioningForRtl_ ?\n      goog.style.bidi.getOffsetStart(this.target) :\n      /** @type {!HTMLElement} */ (this.target).offsetLeft;\n  this.deltaY = /** @type {!HTMLElement} */ (this.target).offsetTop;\n};\n\n\n/**\n * Overridable function for handling the default action of the drag behaviour.\n * Normally this is simply moving the element to x,y though in some cases it\n * might be used to resize the layer.  This is basically a shortcut to\n * implementing a default ondrag event handler.\n * @param {number} x X-coordinate for target element. In right-to-left, x this\n *     is the number of pixels the target should be moved to from the right.\n * @param {number} y Y-coordinate for target element.\n */\ngoog.fx.Dragger.prototype.defaultAction = function(x, y) {\n  if (this.useRightPositioningForRtl_ && this.isRightToLeft_()) {\n    this.target.style.right = x + 'px';\n  } else {\n    this.target.style.left = x + 'px';\n  }\n  this.target.style.top = y + 'px';\n};\n\n\n/**\n * @return {boolean} Whether the dragger is currently in the midst of a drag.\n */\ngoog.fx.Dragger.prototype.isDragging = function() {\n  return this.dragging_;\n};\n\n\n\n/**\n * Object representing a drag event\n * @param {string} type Event type.\n * @param {goog.fx.Dragger} dragobj Drag object initiating event.\n * @param {number} clientX X-coordinate relative to the viewport.\n * @param {number} clientY Y-coordinate relative to the viewport.\n * @param {goog.events.BrowserEvent} browserEvent The closure object\n *   representing the browser event that caused this drag event.\n * @param {number=} opt_actX Optional actual x for drag if it has been limited.\n * @param {number=} opt_actY Optional actual y for drag if it has been limited.\n * @param {boolean=} opt_dragCanceled Whether the drag has been canceled.\n * @constructor\n * @struct\n * @extends {goog.events.Event}\n */\ngoog.fx.DragEvent = function(\n    type, dragobj, clientX, clientY, browserEvent, opt_actX, opt_actY,\n    opt_dragCanceled) {\n  goog.events.Event.call(this, type);\n\n  /**\n   * X-coordinate relative to the viewport\n   * @type {number}\n   */\n  this.clientX = clientX;\n\n  /**\n   * Y-coordinate relative to the viewport\n   * @type {number}\n   */\n  this.clientY = clientY;\n\n  /**\n   * The closure object representing the browser event that caused this drag\n   * event.\n   * @type {goog.events.BrowserEvent}\n   */\n  this.browserEvent = browserEvent;\n\n  /**\n   * The real x-position of the drag if it has been limited\n   * @type {number}\n   */\n  this.left = (opt_actX !== undefined) ? opt_actX : dragobj.deltaX;\n\n  /**\n   * The real y-position of the drag if it has been limited\n   * @type {number}\n   */\n  this.top = (opt_actY !== undefined) ? opt_actY : dragobj.deltaY;\n\n  /**\n   * Reference to the drag object for this event\n   * @type {goog.fx.Dragger}\n   */\n  this.dragger = dragobj;\n\n  /**\n   * Whether drag was canceled with this event. Used to differentiate between\n   * a legitimate drag END that can result in an action and a drag END which is\n   * a result of a drag cancelation. For now it can happen 1) with drag END\n   * event on FireFox when user drags the mouse out of the window, 2) with\n   * drag END event on IE7 which is generated on MOUSEMOVE event when user\n   * moves the mouse into the document after the mouse button has been\n   * released, 3) when TOUCHCANCEL is raised instead of TOUCHEND (on touch\n   * events).\n   * @type {boolean}\n   */\n  this.dragCanceled = !!opt_dragCanceled;\n};\ngoog.inherits(goog.fx.DragEvent, goog.events.Event);\n","^9I",1579837703000,"^9J",["^9K",["^;;","^>;","^?F","^9>","^:L","^:S","^:I","^>8","~$goog.math.Rect","^<3","^;8","^:N","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/dragger.js"],"^:1",["^9K",["^?K","~$goog.fx.Dragger.EventType","~$goog.fx.DragEvent"]],"^9<",true,"^9=",["^9>","^;;","^;=","^:N","^;8","^>;","^:L","^:I","^>8","^J:","^<3","^?F","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.scrollfloater.js","^9C",["^9D","goog/ui/scrollfloater.js"],"^9E","goog/ui/scrollfloater.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview  Class for making an element detach and float to remain visible\n * even when the viewport has been scrolled.\n * <p>\n * The element remains at its normal position in the layout until scrolling\n * would cause its top edge to scroll off the top of the viewport; at that\n * point, the element is replaced with an invisible placeholder (to keep the\n * layout stable), reattached in the dom tree to a new parent (the body element\n * by default), and set to \"fixed\" positioning (emulated for IE < 7) so that it\n * remains at its original X position while staying fixed to the top of the\n * viewport in the Y dimension.\n * <p>\n * When the window is scrolled up past the point where the original element\n * would be fully visible again, the element snaps back into place, replacing\n * the placeholder.\n *\n * @see ../demos/scrollfloater.html\n *\n * Adapted from http://go/elementfloater.js\n */\n\n\ngoog.provide('goog.ui.ScrollFloater');\ngoog.provide('goog.ui.ScrollFloater.EventType');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.EventType');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Creates a ScrollFloater; see file overview for details.\n *\n * @param {Element=} opt_parentElement Where to attach the element when it's\n *     floating.  Default is the document body.  If the floating element\n *     contains form inputs, it will be necessary to attach it to the\n *     corresponding form element, or to an element in the DOM subtree under\n *     the form element.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.Component}\n */\ngoog.ui.ScrollFloater = function(opt_parentElement, opt_domHelper) {\n  // If a parentElement is supplied, we want to use its domHelper,\n  // ignoring the caller-supplied one.\n  var domHelper = opt_parentElement ? goog.dom.getDomHelper(opt_parentElement) :\n                                      opt_domHelper;\n\n  goog.ui.ScrollFloater.base(this, 'constructor', domHelper);\n\n  /**\n   * The element to which the scroll-floated element will be attached\n   * when it is floating.\n   * @type {Element}\n   * @private\n   */\n  this.parentElement_ =\n      opt_parentElement || this.getDomHelper().getDocument().body;\n\n  /**\n   * The original styles applied to the element before it began floating;\n   * used to restore those styles when the element stops floating.\n   * @type {Object}\n   * @private\n   */\n  this.originalStyles_ = {};\n\n  /**\n   * A vertical offset from which to start floating the element.  This is\n   * useful in cases when there are 'position:fixed' elements covering up\n   * part of the viewport.\n   * @type {number}\n   * @private\n   */\n  this.viewportTopOffset_ = 0;\n\n  /**\n   * An element used to define the boundaries within which the floater can\n   * be positioned.\n   * @type {?Element}\n   * @private\n   */\n  this.containerElement_ = null;\n\n  /**\n   * Container element's bounding rectangle.\n   * @type {?goog.math.Rect}\n   * @private\n   */\n  this.containerBounds_ = null;\n\n  /**\n   * Element's original bounding rectangle.\n   * @type {?goog.math.Rect}\n   * @private\n   */\n  this.originalBounds_ = null;\n\n  /**\n   * Element's top offset when it's not floated or pinned.\n   * @type {number}\n   * @private\n   */\n  this.originalTopOffset_ = 0;\n\n  /**\n   * Element's left offset when it's not floated or pinned.\n   * @type {number}\n   * @private\n   */\n  this.originalLeftOffset_ = 0;\n\n  /**\n   * The placeholder element dropped in to hold the layout for\n   * the floated element.\n   * @type {?Element}\n   * @private\n   */\n  this.placeholder_ = null;\n\n  /**\n   * Whether scrolling is enabled for this element; true by default.\n   * The {@link #setScrollingEnabled} method can be used to change this value.\n   * @type {boolean}\n   * @private\n   */\n  this.scrollingEnabled_ = true;\n\n  /**\n   * A flag indicating whether this instance is currently pinned to the bottom\n   * of the container element.\n   * @type {boolean}\n   * @private\n   */\n  this.pinned_ = false;\n\n  /**\n   * A flag indicating whether this instance is currently floating.\n   * @type {boolean}\n   * @private\n   */\n  this.floating_ = false;\n};\ngoog.inherits(goog.ui.ScrollFloater, goog.ui.Component);\n\n\n/**\n * Events dispatched by this component.\n * @enum {string}\n */\ngoog.ui.ScrollFloater.EventType = {\n  /**\n   * Dispatched when the component starts floating. The event is\n   * cancellable.\n   */\n  FLOAT: 'float',\n\n  /**\n   * Dispatched when the component returns to its original state.\n   * The event is cancellable.\n   */\n  DOCK: 'dock',\n\n  /**\n   * Dispatched when the component gets pinned to the bottom of the\n   * container element.  This event is cancellable.\n   */\n  PIN: 'pin'\n};\n\n\n/**\n * The element can float at different positions on the page.\n * @enum {number}\n * @private\n */\ngoog.ui.ScrollFloater.FloatMode_ = {\n  TOP: 0,\n  BOTTOM: 1\n};\n\n\n/**\n * The style properties which are stored when we float an element, so they\n * can be restored when it 'docks' again.\n * @type {Array<string>}\n * @private\n */\ngoog.ui.ScrollFloater.STORED_STYLE_PROPS_ =\n    ['position', 'top', 'left', 'width', 'cssFloat'];\n\n\n/**\n * The style elements managed for the placeholder object.\n * @type {Array<string>}\n * @private\n */\ngoog.ui.ScrollFloater.PLACEHOLDER_STYLE_PROPS_ = [\n  'position', 'top', 'left', 'display', 'cssFloat', 'marginTop', 'marginLeft',\n  'marginRight', 'marginBottom'\n];\n\n\n/**\n * The class name applied to the floating element.\n * @type {string}\n * @private\n */\ngoog.ui.ScrollFloater.CSS_CLASS_ = goog.getCssName('goog-scrollfloater');\n\n\n/**\n * Delegates dom creation to superclass, then constructs and\n * decorates required DOM elements.\n * @override\n */\ngoog.ui.ScrollFloater.prototype.createDom = function() {\n  goog.ui.ScrollFloater.base(this, 'createDom');\n\n  this.decorateInternal(this.getElement());\n};\n\n\n/**\n * Decorates the floated element with the standard ScrollFloater CSS class.\n * @param {Element} element The element to decorate.\n * @override\n */\ngoog.ui.ScrollFloater.prototype.decorateInternal = function(element) {\n  goog.ui.ScrollFloater.base(this, 'decorateInternal', element);\n  goog.asserts.assert(element);\n  goog.dom.classlist.add(element, goog.ui.ScrollFloater.CSS_CLASS_);\n};\n\n\n/** @override */\ngoog.ui.ScrollFloater.prototype.enterDocument = function() {\n  goog.ui.ScrollFloater.base(this, 'enterDocument');\n\n  if (!this.placeholder_) {\n    this.placeholder_ = this.getDomHelper().createDom(\n        goog.dom.TagName.DIV, {'style': 'visibility:hidden'});\n  }\n\n  this.update();\n\n  this.setScrollingEnabled(this.scrollingEnabled_);\n  var win = this.getDomHelper().getWindow();\n  this.getHandler()\n      .listen(win, goog.events.EventType.SCROLL, this.handleScroll_)\n      .listen(win, goog.events.EventType.RESIZE, this.update);\n};\n\n\n/**\n * Forces the component to update the cached element positions and sizes and\n * to re-evaluate whether the the component should be docked, floated or\n * pinned.\n */\ngoog.ui.ScrollFloater.prototype.update = function() {\n  if (!this.isInDocument()) {\n    return;\n  }\n\n  // These values can only be calculated when the element is in its original\n  // state, so we dock first, and then re-evaluate.\n  this.dock_();\n  if (this.containerElement_) {\n    this.containerBounds_ = goog.style.getBounds(this.containerElement_);\n  }\n  var pageOffset_ = goog.style.getPageOffset(this.getElement());\n  this.originalBounds_ = goog.style.getBounds(this.getElement());\n  this.originalTopOffset_ = pageOffset_.y;\n  this.originalLeftOffset_ = pageOffset_.x;\n  this.handleScroll_();\n};\n\n\n/** @override */\ngoog.ui.ScrollFloater.prototype.disposeInternal = function() {\n  goog.ui.ScrollFloater.base(this, 'disposeInternal');\n\n  this.placeholder_ = null;\n};\n\n\n/**\n * Sets whether the element should be floated if it scrolls out of view.\n * @param {boolean} enable Whether floating is enabled for this element.\n */\ngoog.ui.ScrollFloater.prototype.setScrollingEnabled = function(enable) {\n  this.scrollingEnabled_ = enable;\n\n  if (enable) {\n    this.applyIeBgHack_();\n    this.handleScroll_();\n  } else {\n    this.dock_();\n  }\n};\n\n\n/**\n * @return {boolean} Whether the component is enabled for scroll-floating.\n */\ngoog.ui.ScrollFloater.prototype.isScrollingEnabled = function() {\n  return this.scrollingEnabled_;\n};\n\n\n/**\n * @return {boolean} Whether the component is currently scroll-floating.\n */\ngoog.ui.ScrollFloater.prototype.isFloating = function() {\n  return this.floating_;\n};\n\n\n/**\n * @return {boolean} Whether the component is currently pinned to the bottom\n *     of the container.\n */\ngoog.ui.ScrollFloater.prototype.isPinned = function() {\n  return this.pinned_;\n};\n\n\n/**\n * @param {number} offset A vertical offset from the top of the viewport, from\n *    which to start floating the element. Default is 0. This is useful in cases\n *    when there are 'position:fixed' elements covering up part of the viewport.\n */\ngoog.ui.ScrollFloater.prototype.setViewportTopOffset = function(offset) {\n  this.viewportTopOffset_ = offset;\n  this.update();\n};\n\n\n/**\n * @param {Element} container An element used to define the boundaries within\n *     which the floater can be positioned. If not specified, scrolling the page\n *     down far enough may result in the floated element extending past the\n *     containing element as it is being scrolled out of the viewport. In some\n *     cases, such as a list with a sticky header, this may be undesirable. If\n *     the container element is specified and the floated element extends past\n *     the bottom of the container, the element will be pinned to the bottom of\n *     the container.\n */\ngoog.ui.ScrollFloater.prototype.setContainerElement = function(container) {\n  this.containerElement_ = container;\n  this.update();\n};\n\n\n/**\n * When a scroll event occurs, compares the element's position to the current\n * document scroll position, and stops or starts floating behavior if needed.\n * @param {goog.events.Event=} opt_e The event, which is ignored.\n * @private\n */\ngoog.ui.ScrollFloater.prototype.handleScroll_ = function(opt_e) {\n  if (this.scrollingEnabled_) {\n    var scrollTop = this.getDomHelper().getDocumentScroll().y;\n\n    if (this.originalBounds_.top - scrollTop >= this.viewportTopOffset_) {\n      this.dock_();\n      return;\n    }\n\n    var effectiveElementHeight =\n        this.originalBounds_.height + this.viewportTopOffset_;\n\n    // If the element extends past the container, we need to pin it instead.\n    if (this.containerElement_) {\n      var containerBottom =\n          this.containerBounds_.top + this.containerBounds_.height;\n\n      if (scrollTop > containerBottom - effectiveElementHeight) {\n        this.pin_();\n        return;\n      }\n    }\n\n    var windowHeight = this.getDomHelper().getViewportSize().height;\n\n    // If the element is shorter than the window or the user uses IE < 7,\n    // float it at the top.\n    if (this.needsIePositionHack_() || effectiveElementHeight < windowHeight) {\n      this.float_(goog.ui.ScrollFloater.FloatMode_.TOP);\n      return;\n    }\n\n    // If the element is taller than the window and is extending past the\n    // bottom, allow it scroll with the page until the bottom of the element is\n    // fully visible.\n    if (this.originalBounds_.height + this.originalTopOffset_ >\n        windowHeight + scrollTop) {\n      this.dock_();\n    } else {\n      // Pin the element to the bottom of the page since the user has scrolled\n      // past it.\n      this.float_(goog.ui.ScrollFloater.FloatMode_.BOTTOM);\n    }\n  }\n};\n\n\n/**\n * Pins the element to the bottom of the container, making as much of the\n * element visible as possible without extending past it.\n * @private\n */\ngoog.ui.ScrollFloater.prototype.pin_ = function() {\n  if (this.floating_ && !this.dock_()) {\n    return;\n  }\n\n  // Ignore if the component is pinned or the PIN event is cancelled.\n  if (this.pinned_ ||\n      !this.dispatchEvent(goog.ui.ScrollFloater.EventType.PIN)) {\n    return;\n  }\n\n  var elem = this.getElement();\n\n  this.storeOriginalStyles_();\n\n  elem.style.position = 'relative';\n  elem.style.top = this.containerBounds_.height - this.originalBounds_.height -\n      this.originalBounds_.top + this.containerBounds_.top + 'px';\n\n  this.pinned_ = true;\n};\n\n\n/**\n * Begins floating behavior, making the element position:fixed (or IE hacked\n * equivalent) and inserting a placeholder where it used to be to keep the\n * layout from shifting around. For IE < 7 users, we only support floating at\n * the top.\n * @param {goog.ui.ScrollFloater.FloatMode_} floatMode The position at which we\n *     should float.\n * @private\n */\ngoog.ui.ScrollFloater.prototype.float_ = function(floatMode) {\n  var isTop = floatMode == goog.ui.ScrollFloater.FloatMode_.TOP;\n  if (this.pinned_ && !this.dock_()) {\n    return;\n  }\n\n  // Ignore if the FLOAT event is cancelled.\n  if (!this.dispatchEvent(goog.ui.ScrollFloater.EventType.FLOAT)) {\n    return;\n  }\n\n  // If the component is already floating, only update the left position.\n  var newWindowLeftOffset_ = goog.dom.getDocumentScroll().x;\n  if (this.floating_) {\n    this.updateFloatingLeftPosition_();\n    return;\n  }\n\n  var elem = /** @type {!HTMLElement} */ (this.getElement());\n\n  // Read properties of element before modifying it.\n  var originalLeft_ = goog.style.getPageOffsetLeft(elem);\n  var originalWidth_ = goog.style.getContentBoxSize(elem).width;\n\n  this.storeOriginalStyles_();\n\n  goog.style.setSize(this.placeholder_, elem.offsetWidth, elem.offsetHeight);\n\n  // Make element float.\n  goog.style.setStyle(elem, {\n    'left': (originalLeft_ - newWindowLeftOffset_) + 'px',\n    'width': originalWidth_ + 'px',\n    'cssFloat': 'none'\n  });\n\n  // If parents are the same, avoid detaching and reattaching elem.\n  // This prevents Flash embeds from being reloaded, for example.\n  if (elem.parentNode == this.parentElement_) {\n    elem.parentNode.insertBefore(this.placeholder_, elem);\n  } else {\n    elem.parentNode.replaceChild(this.placeholder_, elem);\n    this.parentElement_.appendChild(elem);\n  }\n\n  // Versions of IE below 7-in-standards-mode don't handle 'position: fixed',\n  // so we must emulate it using an IE-specific idiom for JS-based calculated\n  // style values. These users will only ever float at the top (bottom floating\n  // not supported.) Also checked in handleScroll_.\n  if (this.needsIePositionHack_()) {\n    elem.style.position = 'absolute';\n    elem.style.setExpression(\n        'top', 'document.compatMode==\"CSS1Compat\"?' +\n            'documentElement.scrollTop:document.body.scrollTop');\n  } else {\n    elem.style.position = 'fixed';\n    if (isTop) {\n      elem.style.top = this.viewportTopOffset_ + 'px';\n      elem.style.bottom = 'auto';\n    } else {\n      elem.style.top = 'auto';\n      elem.style.bottom = '0';\n    }\n  }\n\n  this.floating_ = true;\n};\n\n\n/**\n * Stops floating behavior, returning element to its original state.\n * @return {boolean} True if the the element has been docked.  False if the\n *     element is already docked or the event was cancelled.\n * @private\n */\ngoog.ui.ScrollFloater.prototype.dock_ = function() {\n  // Ignore if the component is docked or the DOCK event is cancelled.\n  if (!(this.floating_ || this.pinned_) ||\n      !this.dispatchEvent(goog.ui.ScrollFloater.EventType.DOCK)) {\n    return false;\n  }\n\n  var elem = this.getElement();\n\n  if (this.floating_) {\n    this.restoreOriginalStyles_();\n\n    if (this.needsIePositionHack_()) {\n      elem.style.removeExpression('top');\n    }\n\n    // If placeholder_ was inserted and didn't replace elem then elem has\n    // the right parent already, no need to replace (which removes elem before\n    // inserting it).\n    if (this.placeholder_.parentNode == this.parentElement_) {\n      this.placeholder_.parentNode.removeChild(this.placeholder_);\n    } else {\n      this.placeholder_.parentNode.replaceChild(elem, this.placeholder_);\n    }\n  }\n\n  if (this.pinned_) {\n    this.restoreOriginalStyles_();\n  }\n\n  this.floating_ = this.pinned_ = false;\n\n  return true;\n};\n\n\n/**\n * Handle horizontal scroll events by updating the left offset position. This\n * cannot change the floating or docked state and is only valid while the\n * element is floating.\n * @private\n */\ngoog.ui.ScrollFloater.prototype.updateFloatingLeftPosition_ = function() {\n  goog.asserts.assert(this.floating_);\n\n  var newWindowLeftOffset_ = goog.dom.getDocumentScroll().x;\n\n  goog.style.setStyle(\n      this.getElement(),\n      {'left': (this.originalLeftOffset_ - newWindowLeftOffset_) + 'px'});\n};\n\n\n/**\n * @private\n */\ngoog.ui.ScrollFloater.prototype.storeOriginalStyles_ = function() {\n  var elem = this.getElement();\n  this.originalStyles_ = {};\n\n  // Store styles while not floating so we can restore them when the\n  // element stops floating.\n  goog.array.forEach(\n      goog.ui.ScrollFloater.STORED_STYLE_PROPS_, function(property) {\n        this.originalStyles_[property] = elem.style[property];\n      }, this);\n\n  // Copy relevant styles to placeholder so it will be laid out the same\n  // as the element that's about to be floated.\n  goog.array.forEach(\n      goog.ui.ScrollFloater.PLACEHOLDER_STYLE_PROPS_, function(property) {\n        this.placeholder_.style[property] = elem.style[property] ||\n            goog.style.getCascadedStyle(elem, property) ||\n            goog.style.getComputedStyle(elem, property);\n      }, this);\n};\n\n\n/**\n * @private\n */\ngoog.ui.ScrollFloater.prototype.restoreOriginalStyles_ = function() {\n  var elem = this.getElement();\n  for (var prop in this.originalStyles_) {\n    elem.style[prop] = this.originalStyles_[prop];\n  }\n};\n\n\n/**\n * Determines whether we need to apply the position hack to emulated position:\n * fixed on this browser.\n * @return {boolean} Whether the current browser needs the position hack.\n * @private\n */\ngoog.ui.ScrollFloater.prototype.needsIePositionHack_ = function() {\n  return goog.userAgent.IE &&\n      !(goog.userAgent.isVersionOrHigher('7') &&\n        this.getDomHelper().isCss1CompatMode());\n};\n\n\n/**\n * Sets some magic CSS properties that make float-scrolling work smoothly\n * in IE6 (and IE7 in quirks mode). Without this hack, the floating element\n * will appear jumpy when you scroll the document. This involves modifying\n * the background of the HTML element (or BODY in quirks mode). If there's\n * already a background image in use this is not required.\n * For further reading, see\n * http://annevankesteren.nl/2005/01/position-fixed-in-ie\n * @private\n */\ngoog.ui.ScrollFloater.prototype.applyIeBgHack_ = function() {\n  if (this.needsIePositionHack_()) {\n    var doc = this.getDomHelper().getDocument();\n    var topLevelElement = goog.style.getClientViewportElement(doc);\n\n    if (topLevelElement.currentStyle.backgroundImage == 'none') {\n      // Using an https URL if the current windowbp is https avoids an IE\n      // \"This page contains a mix of secure and nonsecure items\" warning.\n      topLevelElement.style.backgroundImage =\n          this.getDomHelper().getWindow().location.protocol == 'https:' ?\n          'url(https:///)' :\n          'url(about:blank)';\n      topLevelElement.style.backgroundAttachment = 'fixed';\n    }\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^:;","^:=","^9>","^:S","^:I","^<3","^;9","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/scrollfloater.js"],"^:1",["^9K",["~$goog.ui.ScrollFloater","~$goog.ui.ScrollFloater.EventType"]],"^9<",true,"^9=",["^9>","^;9","^:E","^;;","^;=","^:;","^:I","^<3","^:=","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.math.vec3.js","^9C",["^9D","goog/math/vec3.js"],"^9E","goog/math/vec3.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines a 3-element vector class that can be used for\n * coordinate math, useful for animation systems and point manipulation.\n *\n * Based heavily on code originally by:\n * @author brenneman@google.com (Shawn Brenneman)\n */\n\n\ngoog.provide('goog.math.Vec3');\n\ngoog.require('goog.math');\ngoog.require('goog.math.Coordinate3');\n\n\n\n/**\n * Class for a three-dimensional vector object and assorted functions useful for\n * manipulation.\n *\n * Inherits from goog.math.Coordinate3 so that a Vec3 may be passed in to any\n * function that requires a Coordinate.\n *\n * @param {number} x The x value for the vector.\n * @param {number} y The y value for the vector.\n * @param {number} z The z value for the vector.\n * @struct\n * @constructor\n * @extends {goog.math.Coordinate3}\n */\ngoog.math.Vec3 = function(x, y, z) {\n  /**\n   * X-value\n   * @type {number}\n   */\n  this.x = x;\n\n  /**\n   * Y-value\n   * @type {number}\n   */\n  this.y = y;\n\n  /**\n   * Z-value\n   * @type {number}\n   */\n  this.z = z;\n};\ngoog.inherits(goog.math.Vec3, goog.math.Coordinate3);\n\n\n/**\n * Generates a random unit vector.\n *\n * http://mathworld.wolfram.com/SpherePointPicking.html\n * Using (6), (7), and (8) to generate coordinates.\n * @return {!goog.math.Vec3} A random unit-length vector.\n */\ngoog.math.Vec3.randomUnit = function() {\n  var theta = Math.random() * Math.PI * 2;\n  var phi = Math.random() * Math.PI * 2;\n\n  var z = Math.cos(phi);\n  var x = Math.sqrt(1 - z * z) * Math.cos(theta);\n  var y = Math.sqrt(1 - z * z) * Math.sin(theta);\n\n  return new goog.math.Vec3(x, y, z);\n};\n\n\n/**\n * Generates a random vector inside the unit sphere.\n *\n * @return {!goog.math.Vec3} A random vector.\n */\ngoog.math.Vec3.random = function() {\n  return goog.math.Vec3.randomUnit().scale(Math.random());\n};\n\n\n/**\n * Returns a new Vec3 object from a given coordinate.\n *\n * @param {goog.math.Coordinate3} a The coordinate.\n * @return {!goog.math.Vec3} A new vector object.\n */\ngoog.math.Vec3.fromCoordinate3 = function(a) {\n  return new goog.math.Vec3(a.x, a.y, a.z);\n};\n\n\n/**\n * Creates a new copy of this Vec3.\n *\n * @return {!goog.math.Vec3} A new vector with the same coordinates as this one.\n * @override\n */\ngoog.math.Vec3.prototype.clone = function() {\n  return new goog.math.Vec3(this.x, this.y, this.z);\n};\n\n\n/**\n * Returns the magnitude of the vector measured from the origin.\n *\n * @return {number} The length of the vector.\n */\ngoog.math.Vec3.prototype.magnitude = function() {\n  return Math.sqrt(this.x * this.x + this.y * this.y + this.z * this.z);\n};\n\n\n/**\n * Returns the squared magnitude of the vector measured from the origin.\n * NOTE(brenneman): Leaving out the square root is not a significant\n * optimization in JavaScript.\n *\n * @return {number} The length of the vector, squared.\n */\ngoog.math.Vec3.prototype.squaredMagnitude = function() {\n  return this.x * this.x + this.y * this.y + this.z * this.z;\n};\n\n\n/**\n * Scales the current vector by a constant.\n *\n * @param {number} s The scale factor.\n * @return {!goog.math.Vec3} This vector, scaled.\n */\ngoog.math.Vec3.prototype.scale = function(s) {\n  this.x *= s;\n  this.y *= s;\n  this.z *= s;\n  return this;\n};\n\n\n/**\n * Reverses the sign of the vector. Equivalent to scaling the vector by -1.\n *\n * @return {!goog.math.Vec3} This vector, inverted.\n */\ngoog.math.Vec3.prototype.invert = function() {\n  this.x = -this.x;\n  this.y = -this.y;\n  this.z = -this.z;\n  return this;\n};\n\n\n/**\n * Normalizes the current vector to have a magnitude of 1.\n *\n * @return {!goog.math.Vec3} This vector, normalized.\n */\ngoog.math.Vec3.prototype.normalize = function() {\n  return this.scale(1 / this.magnitude());\n};\n\n\n/**\n * Adds another vector to this vector in-place.\n *\n * @param {goog.math.Vec3} b The vector to add.\n * @return {!goog.math.Vec3} This vector with `b` added.\n */\ngoog.math.Vec3.prototype.add = function(b) {\n  this.x += b.x;\n  this.y += b.y;\n  this.z += b.z;\n  return this;\n};\n\n\n/**\n * Subtracts another vector from this vector in-place.\n *\n * @param {goog.math.Vec3} b The vector to subtract.\n * @return {!goog.math.Vec3} This vector with `b` subtracted.\n */\ngoog.math.Vec3.prototype.subtract = function(b) {\n  this.x -= b.x;\n  this.y -= b.y;\n  this.z -= b.z;\n  return this;\n};\n\n\n/**\n * Compares this vector with another for equality.\n *\n * @param {goog.math.Vec3} b The other vector.\n * @return {boolean} True if this vector's x, y and z equal the given vector's\n *     x, y, and z, respectively.\n */\ngoog.math.Vec3.prototype.equals = function(b) {\n  return this == b || !!b && this.x == b.x && this.y == b.y && this.z == b.z;\n};\n\n\n/**\n * Returns the distance between two vectors.\n *\n * @param {goog.math.Vec3} a The first vector.\n * @param {goog.math.Vec3} b The second vector.\n * @return {number} The distance.\n */\ngoog.math.Vec3.distance = goog.math.Coordinate3.distance;\n\n\n/**\n * Returns the squared distance between two vectors.\n *\n * @param {goog.math.Vec3} a The first vector.\n * @param {goog.math.Vec3} b The second vector.\n * @return {number} The squared distance.\n */\ngoog.math.Vec3.squaredDistance = goog.math.Coordinate3.squaredDistance;\n\n\n/**\n * Compares vectors for equality.\n *\n * @param {goog.math.Vec3} a The first vector.\n * @param {goog.math.Vec3} b The second vector.\n * @return {boolean} True if the vectors have equal x, y, and z coordinates.\n */\ngoog.math.Vec3.equals = goog.math.Coordinate3.equals;\n\n\n/**\n * Returns the sum of two vectors as a new Vec3.\n *\n * @param {goog.math.Vec3} a The first vector.\n * @param {goog.math.Vec3} b The second vector.\n * @return {!goog.math.Vec3} The sum vector.\n */\ngoog.math.Vec3.sum = function(a, b) {\n  return new goog.math.Vec3(a.x + b.x, a.y + b.y, a.z + b.z);\n};\n\n\n/**\n * Returns the difference of two vectors as a new Vec3.\n *\n * @param {goog.math.Vec3} a The first vector.\n * @param {goog.math.Vec3} b The second vector.\n * @return {!goog.math.Vec3} The difference vector.\n */\ngoog.math.Vec3.difference = function(a, b) {\n  return new goog.math.Vec3(a.x - b.x, a.y - b.y, a.z - b.z);\n};\n\n\n/**\n * Returns the dot-product of two vectors.\n *\n * @param {goog.math.Vec3} a The first vector.\n * @param {goog.math.Vec3} b The second vector.\n * @return {number} The dot-product of the two vectors.\n */\ngoog.math.Vec3.dot = function(a, b) {\n  return a.x * b.x + a.y * b.y + a.z * b.z;\n};\n\n\n/**\n * Returns the cross-product of two vectors.\n *\n * @param {goog.math.Vec3} a The first vector.\n * @param {goog.math.Vec3} b The second vector.\n * @return {!goog.math.Vec3} The cross-product of the two vectors.\n */\ngoog.math.Vec3.cross = function(a, b) {\n  return new goog.math.Vec3(\n      a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);\n};\n\n\n/**\n * Returns a new Vec3 that is the linear interpolant between vectors a and b at\n * scale-value x.\n *\n * @param {goog.math.Vec3} a Vector a.\n * @param {goog.math.Vec3} b Vector b.\n * @param {number} x The proportion between a and b.\n * @return {!goog.math.Vec3} The interpolated vector.\n */\ngoog.math.Vec3.lerp = function(a, b, x) {\n  return new goog.math.Vec3(\n      goog.math.lerp(a.x, b.x, x), goog.math.lerp(a.y, b.y, x),\n      goog.math.lerp(a.z, b.z, x));\n};\n\n\n/**\n * Returns a new Vec3 that is a copy of the vector a, but rescaled by a factor s\n * in all dimensions.\n * @param {!goog.math.Vec3} a Vector a.\n * @param {number} s Scale factor.\n * @return {!goog.math.Vec3} A new rescaled vector.\n */\ngoog.math.Vec3.rescaled = function(a, s) {\n  return new goog.math.Vec3(a.x * s, a.y * s, a.z * s);\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^<2","~$goog.math.Coordinate3"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/vec3.js"],"^:1",["^9K",["~$goog.math.Vec3"]],"^9<",true,"^9=",["^9>","^<2","^J?"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.messaging.mockmessagechannel.js","^9C",["^9D","goog/testing/messaging/mockmessagechannel.js"],"^9E","goog/testing/messaging/mockmessagechannel.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Mock MessageChannel implementation that can receive fake\n * messages and test that the right messages are sent.\n *\n */\n\n\ngoog.setTestOnly('goog.testing.messaging.MockMessageChannel');\ngoog.provide('goog.testing.messaging.MockMessageChannel');\n\ngoog.require('goog.messaging.AbstractChannel');\ngoog.require('goog.testing.MockControl');\ngoog.require('goog.testing.asserts');\n\n\n\n/**\n * Class for unit-testing code that communicates over a MessageChannel.\n * @param {goog.testing.MockControl} mockControl The mock control used to create\n *   the method mock for #send.\n * @extends {goog.messaging.AbstractChannel}\n * @constructor\n * @final\n */\ngoog.testing.messaging.MockMessageChannel = function(mockControl) {\n  goog.testing.messaging.MockMessageChannel.base(this, 'constructor');\n\n  /**\n   * Whether the channel has been disposed.\n   * @type {boolean}\n   */\n  this.disposed = false;\n\n  mockControl.createMethodMock(this, 'send');\n};\ngoog.inherits(\n    goog.testing.messaging.MockMessageChannel, goog.messaging.AbstractChannel);\n\n\n/**\n * A mock send function. Actually an instance of\n * {@link goog.testing.FunctionMock}.\n * @param {string} serviceName The name of the remote service to run.\n * @param {string|!Object} payload The payload to send to the remote page.\n * @override\n */\ngoog.testing.messaging.MockMessageChannel.prototype.send = function(\n    serviceName, payload) {};\n\n\n/**\n * Sets a flag indicating that this is disposed.\n * @override\n */\ngoog.testing.messaging.MockMessageChannel.prototype.dispose = function() {\n  this.disposed = true;\n};\n\n\n/**\n * Mocks the receipt of a message. Passes the payload the appropriate service.\n * @param {string} serviceName The service to run.\n * @param {string|!Object} payload The argument to pass to the service.\n */\ngoog.testing.messaging.MockMessageChannel.prototype.receive = function(\n    serviceName, payload) {\n  this.deliver(serviceName, payload);\n};\n","^9I",1579837703000,"^9J",["^9K",["^?X","^>X","^9>","~$goog.testing.MockControl"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/messaging/mockmessagechannel.js"],"^:1",["^9K",["~$goog.testing.messaging.MockMessageChannel"]],"^9<",true,"^9=",["^9>","^?X","^JA","^>X"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.toolbarcolormenubutton.js","^9C",["^9D","goog/ui/toolbarcolormenubutton.js"],"^9E","goog/ui/toolbarcolormenubutton.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A toolbar color menu button control.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ToolbarColorMenuButton');\n\ngoog.require('goog.ui.ColorMenuButton');\ngoog.require('goog.ui.ToolbarColorMenuButtonRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * A color menu button control for a toolbar.\n *\n * @param {goog.ui.ControlContent} content Text caption or existing DOM\n *     structure to display as the button's caption.\n * @param {goog.ui.Menu=} opt_menu Menu to render under the button when clicked;\n *     should contain at least one {@link goog.ui.ColorPalette} if present.\n * @param {goog.ui.ColorMenuButtonRenderer=} opt_renderer Optional\n *     renderer used to render or decorate the button; defaults to\n *     {@link goog.ui.ToolbarColorMenuButtonRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.ColorMenuButton}\n */\ngoog.ui.ToolbarColorMenuButton = function(\n    content, opt_menu, opt_renderer, opt_domHelper) {\n  goog.ui.ColorMenuButton.call(\n      this, content, opt_menu,\n      opt_renderer || goog.ui.ToolbarColorMenuButtonRenderer.getInstance(),\n      opt_domHelper);\n};\ngoog.inherits(goog.ui.ToolbarColorMenuButton, goog.ui.ColorMenuButton);\n\n\n// Registers a decorator factory function for toolbar color menu buttons.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.getCssName('goog-toolbar-color-menu-button'),\n    function() { return new goog.ui.ToolbarColorMenuButton(null); });\n","^9I",1579837703000,"^9J",["^9K",["~$goog.ui.ColorMenuButton","~$goog.ui.ToolbarColorMenuButtonRenderer","^9>","^:>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/toolbarcolormenubutton.js"],"^:1",["^9K",["^>G"]],"^9<",true,"^9=",["^9>","^JC","^JD","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.debug.logrecord.js","^9C",["^9D","goog/debug/logrecord.js"],"^9E","goog/debug/logrecord.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the LogRecord class. Please minimize\n * dependencies this file has on other closure classes as any dependency it\n * takes won't be able to use the logging infrastructure.\n *\n */\n\ngoog.provide('goog.debug.LogRecord');\n\n\n\n/**\n * LogRecord objects are used to pass logging requests between\n * the logging framework and individual log Handlers.\n * @constructor\n * @param {goog.debug.Logger.Level} level One of the level identifiers.\n * @param {string} msg The string message.\n * @param {string} loggerName The name of the source logger.\n * @param {number=} opt_time Time this log record was created if other than now.\n *     If 0, we use #goog.now.\n * @param {number=} opt_sequenceNumber Sequence number of this log record. This\n *     should only be passed in when restoring a log record from persistence.\n */\ngoog.debug.LogRecord = function(\n    level, msg, loggerName, opt_time, opt_sequenceNumber) {\n  this.reset(level, msg, loggerName, opt_time, opt_sequenceNumber);\n};\n\n\n/**\n * Time the LogRecord was created.\n * @type {number}\n * @private\n */\ngoog.debug.LogRecord.prototype.time_;\n\n\n/**\n * Level of the LogRecord\n * @type {goog.debug.Logger.Level}\n * @private\n */\ngoog.debug.LogRecord.prototype.level_;\n\n\n/**\n * Message associated with the record\n * @type {string}\n * @private\n */\ngoog.debug.LogRecord.prototype.msg_;\n\n\n/**\n * Name of the logger that created the record.\n * @type {string}\n * @private\n */\ngoog.debug.LogRecord.prototype.loggerName_;\n\n\n/**\n * Sequence number for the LogRecord. Each record has a unique sequence number\n * that is greater than all log records created before it.\n * @type {number}\n * @private\n */\ngoog.debug.LogRecord.prototype.sequenceNumber_ = 0;\n\n\n/**\n * Exception associated with the record\n * @type {?Object}\n * @private\n */\ngoog.debug.LogRecord.prototype.exception_ = null;\n\n\n/**\n * @define {boolean} Whether to enable log sequence numbers.\n */\ngoog.debug.LogRecord.ENABLE_SEQUENCE_NUMBERS =\n    goog.define('goog.debug.LogRecord.ENABLE_SEQUENCE_NUMBERS', true);\n\n\n/**\n * A sequence counter for assigning increasing sequence numbers to LogRecord\n * objects.\n * @type {number}\n * @private\n */\ngoog.debug.LogRecord.nextSequenceNumber_ = 0;\n\n\n/**\n * Sets all fields of the log record.\n * @param {goog.debug.Logger.Level} level One of the level identifiers.\n * @param {string} msg The string message.\n * @param {string} loggerName The name of the source logger.\n * @param {number=} opt_time Time this log record was created if other than now.\n *     If 0, we use #goog.now.\n * @param {number=} opt_sequenceNumber Sequence number of this log record. This\n *     should only be passed in when restoring a log record from persistence.\n */\ngoog.debug.LogRecord.prototype.reset = function(\n    level, msg, loggerName, opt_time, opt_sequenceNumber) {\n  if (goog.debug.LogRecord.ENABLE_SEQUENCE_NUMBERS) {\n    this.sequenceNumber_ = typeof opt_sequenceNumber == 'number' ?\n        opt_sequenceNumber :\n        goog.debug.LogRecord.nextSequenceNumber_++;\n  }\n\n  this.time_ = opt_time || goog.now();\n  this.level_ = level;\n  this.msg_ = msg;\n  this.loggerName_ = loggerName;\n  delete this.exception_;\n};\n\n\n/**\n * Get the source Logger's name.\n *\n * @return {string} source logger name (may be null).\n */\ngoog.debug.LogRecord.prototype.getLoggerName = function() {\n  return this.loggerName_;\n};\n\n\n/**\n * Get the exception that is part of the log record.\n *\n * @return {Object} the exception.\n */\ngoog.debug.LogRecord.prototype.getException = function() {\n  return this.exception_;\n};\n\n\n/**\n * Set the exception that is part of the log record.\n *\n * @param {Object} exception the exception.\n */\ngoog.debug.LogRecord.prototype.setException = function(exception) {\n  this.exception_ = exception;\n};\n\n\n/**\n * Get the source Logger's name.\n *\n * @param {string} loggerName source logger name (may be null).\n */\ngoog.debug.LogRecord.prototype.setLoggerName = function(loggerName) {\n  this.loggerName_ = loggerName;\n};\n\n\n/**\n * Get the logging message level, for example Level.SEVERE.\n * @return {goog.debug.Logger.Level} the logging message level.\n */\ngoog.debug.LogRecord.prototype.getLevel = function() {\n  return this.level_;\n};\n\n\n/**\n * Set the logging message level, for example Level.SEVERE.\n * @param {goog.debug.Logger.Level} level the logging message level.\n */\ngoog.debug.LogRecord.prototype.setLevel = function(level) {\n  this.level_ = level;\n};\n\n\n/**\n * Get the \"raw\" log message, before localization or formatting.\n *\n * @return {string} the raw message string.\n */\ngoog.debug.LogRecord.prototype.getMessage = function() {\n  return this.msg_;\n};\n\n\n/**\n * Set the \"raw\" log message, before localization or formatting.\n *\n * @param {string} msg the raw message string.\n */\ngoog.debug.LogRecord.prototype.setMessage = function(msg) {\n  this.msg_ = msg;\n};\n\n\n/**\n * Get event time in milliseconds since 1970.\n *\n * @return {number} event time in millis since 1970.\n */\ngoog.debug.LogRecord.prototype.getMillis = function() {\n  return this.time_;\n};\n\n\n/**\n * Set event time in milliseconds since 1970.\n *\n * @param {number} time event time in millis since 1970.\n */\ngoog.debug.LogRecord.prototype.setMillis = function(time) {\n  this.time_ = time;\n};\n\n\n/**\n * Get the sequence number.\n * <p>\n * Sequence numbers are normally assigned in the LogRecord\n * constructor, which assigns unique sequence numbers to\n * each new LogRecord in increasing order.\n * @return {number} the sequence number.\n */\ngoog.debug.LogRecord.prototype.getSequenceNumber = function() {\n  return this.sequenceNumber_;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/logrecord.js"],"^:1",["^9K",["^IM"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.functions.functions.js","^9C",["^9D","goog/functions/functions.js"],"^9E","goog/functions/functions.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for creating functions. Loosely inspired by these\n * java classes from the Guava library:\n * com.google.common.base.Functions\n * https://google.github.io/guava/releases/snapshot-jre/api/docs/index.html?com/google/common/base/Functions.html\n *\n * com.google.common.base.Predicates\n * https://google.github.io/guava/releases/snapshot-jre/api/docs/index.html?com/google/common/base/Predicates.html\n *\n * More about these can be found at\n * https://github.com/google/guava/wiki/FunctionalExplained\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\n\ngoog.provide('goog.functions');\n\n\n/**\n * Creates a function that always returns the same value.\n * @param {T} retValue The value to return.\n * @return {function():T} The new function.\n * @template T\n */\ngoog.functions.constant = function(retValue) {\n  return function() { return retValue; };\n};\n\n\n/**\n * Always returns false.\n * @type {function(...): boolean}\n */\ngoog.functions.FALSE = function() {\n  return false;\n};\n\n\n/**\n * Always returns true.\n * @type {function(...): boolean}\n */\ngoog.functions.TRUE = function() {\n  return true;\n};\n\n\n/**\n * Always returns NULL.\n * @type {function(...): null}\n */\ngoog.functions.NULL = function() {\n  return null;\n};\n\n\n/**\n * A simple function that returns the first argument of whatever is passed\n * into it.\n * @param {T=} opt_returnValue The single value that will be returned.\n * @param {...*} var_args Optional trailing arguments. These are ignored.\n * @return {T} The first argument passed in, or undefined if nothing was passed.\n * @template T\n */\ngoog.functions.identity = function(opt_returnValue, var_args) {\n  return opt_returnValue;\n};\n\n\n/**\n * Creates a function that always throws an error with the given message.\n * @param {string} message The error message.\n * @return {!Function} The error-throwing function.\n */\ngoog.functions.error = function(message) {\n  return function() {\n    throw new Error(message);\n  };\n};\n\n\n/**\n * Creates a function that throws the given object.\n * @param {*} err An object to be thrown.\n * @return {!Function} The error-throwing function.\n */\ngoog.functions.fail = function(err) {\n  return function() { throw err; };\n};\n\n\n/**\n * Given a function, create a function that keeps opt_numArgs arguments and\n * silently discards all additional arguments.\n * @param {Function} f The original function.\n * @param {number=} opt_numArgs The number of arguments to keep. Defaults to 0.\n * @return {!Function} A version of f that only keeps the first opt_numArgs\n *     arguments.\n */\ngoog.functions.lock = function(f, opt_numArgs) {\n  opt_numArgs = opt_numArgs || 0;\n  return function() {\n    const self = /** @type {*} */ (this);\n    return f.apply(self, Array.prototype.slice.call(arguments, 0, opt_numArgs));\n  };\n};\n\n\n/**\n * Creates a function that returns its nth argument.\n * @param {number} n The position of the return argument.\n * @return {!Function} A new function.\n */\ngoog.functions.nth = function(n) {\n  return function() { return arguments[n]; };\n};\n\n\n/**\n * Like goog.partial(), except that arguments are added after arguments to the\n * returned function.\n *\n * Usage:\n * function f(arg1, arg2, arg3, arg4) { ... }\n * var g = goog.functions.partialRight(f, arg3, arg4);\n * g(arg1, arg2);\n *\n * @param {!Function} fn A function to partially apply.\n * @param {...*} var_args Additional arguments that are partially applied to fn\n *     at the end.\n * @return {!Function} A partially-applied form of the function goog.partial()\n *     was invoked as a method of.\n */\ngoog.functions.partialRight = function(fn, var_args) {\n  const rightArgs = Array.prototype.slice.call(arguments, 1);\n  return function() {\n    const self = /** @type {*} */ (this);\n    const newArgs = Array.prototype.slice.call(arguments);\n    newArgs.push.apply(newArgs, rightArgs);\n    return fn.apply(self, newArgs);\n  };\n};\n\n\n/**\n * Given a function, create a new function that swallows its return value\n * and replaces it with a new one.\n * @param {Function} f A function.\n * @param {T} retValue A new return value.\n * @return {function(...?):T} A new function.\n * @template T\n */\ngoog.functions.withReturnValue = function(f, retValue) {\n  return goog.functions.sequence(f, goog.functions.constant(retValue));\n};\n\n\n/**\n * Creates a function that returns whether its argument equals the given value.\n *\n * Example:\n * var key = goog.object.findKey(obj, goog.functions.equalTo('needle'));\n *\n * @param {*} value The value to compare to.\n * @param {boolean=} opt_useLooseComparison Whether to use a loose (==)\n *     comparison rather than a strict (===) one. Defaults to false.\n * @return {function(*):boolean} The new function.\n */\ngoog.functions.equalTo = function(value, opt_useLooseComparison) {\n  return function(other) {\n    return opt_useLooseComparison ? (value == other) : (value === other);\n  };\n};\n\n\n/**\n * Creates the composition of the functions passed in.\n * For example, (goog.functions.compose(f, g))(a) is equivalent to f(g(a)).\n * @param {function(...?):T} fn The final function.\n * @param {...Function} var_args A list of functions.\n * @return {function(...?):T} The composition of all inputs.\n * @template T\n */\ngoog.functions.compose = function(fn, var_args) {\n  const functions = arguments;\n  const length = functions.length;\n  return function() {\n    const self = /** @type {*} */ (this);\n    let result;\n    if (length) {\n      result = functions[length - 1].apply(self, arguments);\n    }\n\n    for (let i = length - 2; i >= 0; i--) {\n      result = functions[i].call(self, result);\n    }\n    return result;\n  };\n};\n\n\n/**\n * Creates a function that calls the functions passed in in sequence, and\n * returns the value of the last function. For example,\n * (goog.functions.sequence(f, g))(x) is equivalent to f(x),g(x).\n * @param {...Function} var_args A list of functions.\n * @return {!Function} A function that calls all inputs in sequence.\n */\ngoog.functions.sequence = function(var_args) {\n  const functions = arguments;\n  const length = functions.length;\n  return function() {\n    const self = /** @type {*} */ (this);\n    let result;\n    for (let i = 0; i < length; i++) {\n      result = functions[i].apply(self, arguments);\n    }\n    return result;\n  };\n};\n\n\n/**\n * Creates a function that returns true if each of its components evaluates\n * to true. The components are evaluated in order, and the evaluation will be\n * short-circuited as soon as a function returns false.\n * For example, (goog.functions.and(f, g))(x) is equivalent to f(x) && g(x).\n * @param {...Function} var_args A list of functions.\n * @return {function(...?):boolean} A function that ANDs its component\n *      functions.\n */\ngoog.functions.and = function(var_args) {\n  const functions = arguments;\n  const length = functions.length;\n  return function() {\n    const self = /** @type {*} */ (this);\n    for (let i = 0; i < length; i++) {\n      if (!functions[i].apply(self, arguments)) {\n        return false;\n      }\n    }\n    return true;\n  };\n};\n\n\n/**\n * Creates a function that returns true if any of its components evaluates\n * to true. The components are evaluated in order, and the evaluation will be\n * short-circuited as soon as a function returns true.\n * For example, (goog.functions.or(f, g))(x) is equivalent to f(x) || g(x).\n * @param {...Function} var_args A list of functions.\n * @return {function(...?):boolean} A function that ORs its component\n *    functions.\n */\ngoog.functions.or = function(var_args) {\n  const functions = arguments;\n  const length = functions.length;\n  return function() {\n    const self = /** @type {*} */ (this);\n    for (let i = 0; i < length; i++) {\n      if (functions[i].apply(self, arguments)) {\n        return true;\n      }\n    }\n    return false;\n  };\n};\n\n\n/**\n * Creates a function that returns the Boolean opposite of a provided function.\n * For example, (goog.functions.not(f))(x) is equivalent to !f(x).\n * @param {!Function} f The original function.\n * @return {function(...?):boolean} A function that delegates to f and returns\n * opposite.\n */\ngoog.functions.not = function(f) {\n  return function() {\n    const self = /** @type {*} */ (this);\n    return !f.apply(self, arguments);\n  };\n};\n\n\n/**\n * Generic factory function to construct an object given the constructor\n * and the arguments. Intended to be bound to create object factories.\n *\n * Example:\n *\n * var factory = goog.partial(goog.functions.create, Class);\n *\n * @param {function(new:T, ...)} constructor The constructor for the Object.\n * @param {...*} var_args The arguments to be passed to the constructor.\n * @return {T} A new instance of the class given in `constructor`.\n * @template T\n */\ngoog.functions.create = function(constructor, var_args) {\n  /**\n   * @constructor\n   * @final\n   */\n  const temp = function() {};\n  temp.prototype = constructor.prototype;\n\n  // obj will have constructor's prototype in its chain and\n  // 'obj instanceof constructor' will be true.\n  const obj = new temp();\n\n  // obj is initialized by constructor.\n  // arguments is only array-like so lacks shift(), but can be used with\n  // the Array prototype function.\n  constructor.apply(obj, Array.prototype.slice.call(arguments, 1));\n  return obj;\n};\n\n\n/**\n * @define {boolean} Whether the return value cache should be used.\n *    This should only be used to disable caches when testing.\n */\ngoog.functions.CACHE_RETURN_VALUE =\n    goog.define('goog.functions.CACHE_RETURN_VALUE', true);\n\n\n/**\n * Gives a wrapper function that caches the return value of a parameterless\n * function when first called.\n *\n * When called for the first time, the given function is called and its\n * return value is cached (thus this is only appropriate for idempotent\n * functions).  Subsequent calls will return the cached return value. This\n * allows the evaluation of expensive functions to be delayed until first used.\n *\n * To cache the return values of functions with parameters, see goog.memoize.\n *\n * @param {function():T} fn A function to lazily evaluate.\n * @return {function():T} A wrapped version the function.\n * @template T\n */\ngoog.functions.cacheReturnValue = function(fn) {\n  let called = false;\n  let value;\n\n  return function() {\n    if (!goog.functions.CACHE_RETURN_VALUE) {\n      return fn();\n    }\n\n    if (!called) {\n      value = fn();\n      called = true;\n    }\n\n    return value;\n  };\n};\n\n\n/**\n * Wraps a function to allow it to be called, at most, once. All\n * additional calls are no-ops.\n *\n * This is particularly useful for initialization functions\n * that should be called, at most, once.\n *\n * @param {function():*} f Function to call.\n * @return {function():undefined} Wrapped function.\n */\ngoog.functions.once = function(f) {\n  // Keep a reference to the function that we null out when we're done with\n  // it -- that way, the function can be GC'd when we're done with it.\n  let inner = f;\n  return function() {\n    if (inner) {\n      const tmp = inner;\n      inner = null;\n      tmp();\n    }\n  };\n};\n\n\n/**\n * Wraps a function to allow it to be called, at most, once per interval\n * (specified in milliseconds). If the wrapper function is called N times within\n * that interval, only the Nth call will go through.\n *\n * This is particularly useful for batching up repeated actions where the\n * last action should win. This can be used, for example, for refreshing an\n * autocomplete pop-up every so often rather than updating with every keystroke,\n * since the final text typed by the user is the one that should produce the\n * final autocomplete results. For more stateful debouncing with support for\n * pausing, resuming, and canceling debounced actions, use\n * `goog.async.Debouncer`.\n *\n * @param {function(this:SCOPE, ...?)} f Function to call.\n * @param {number} interval Interval over which to debounce. The function will\n *     only be called after the full interval has elapsed since the last call.\n * @param {SCOPE=} opt_scope Object in whose scope to call the function.\n * @return {function(...?): undefined} Wrapped function.\n * @template SCOPE\n */\ngoog.functions.debounce = function(f, interval, opt_scope) {\n  let timeout = 0;\n  return /** @type {function(...?)} */ (function(var_args) {\n    goog.global.clearTimeout(timeout);\n    const args = arguments;\n    timeout = goog.global.setTimeout(function() {\n      f.apply(opt_scope, args);\n    }, interval);\n  });\n};\n\n\n/**\n * Wraps a function to allow it to be called, at most, once per interval\n * (specified in milliseconds). If the wrapper function is called N times in\n * that interval, both the 1st and the Nth calls will go through.\n *\n * This is particularly useful for limiting repeated user requests where the\n * the last action should win, but you also don't want to wait until the end of\n * the interval before sending a request out, as it leads to a perception of\n * slowness for the user.\n *\n * @param {function(this:SCOPE, ...?)} f Function to call.\n * @param {number} interval Interval over which to throttle. The function can\n *     only be called once per interval.\n * @param {SCOPE=} opt_scope Object in whose scope to call the function.\n * @return {function(...?): undefined} Wrapped function.\n * @template SCOPE\n */\ngoog.functions.throttle = function(f, interval, opt_scope) {\n  let timeout = 0;\n  let shouldFire = false;\n  let args = [];\n\n  const handleTimeout = function() {\n    timeout = 0;\n    if (shouldFire) {\n      shouldFire = false;\n      fire();\n    }\n  };\n\n  const fire = function() {\n    timeout = goog.global.setTimeout(handleTimeout, interval);\n    f.apply(opt_scope, args);\n  };\n\n  return /** @type {function(...?)} */ (function(var_args) {\n    args = arguments;\n    if (!timeout) {\n      fire();\n    } else {\n      shouldFire = true;\n    }\n  });\n};\n\n\n/**\n * Wraps a function to allow it to be called, at most, once per interval\n * (specified in milliseconds). If the wrapper function is called N times within\n * that interval, only the 1st call will go through.\n *\n * This is particularly useful for limiting repeated user requests where the\n * first request is guaranteed to have all the data required to perform the\n * final action, so there's no need to wait until the end of the interval before\n * sending the request out.\n *\n * @param {function(this:SCOPE, ...?)} f Function to call.\n * @param {number} interval Interval over which to rate-limit. The function will\n *     only be called once per interval, and ignored for the remainer of the\n *     interval.\n * @param {SCOPE=} opt_scope Object in whose scope to call the function.\n * @return {function(...?): undefined} Wrapped function.\n * @template SCOPE\n */\ngoog.functions.rateLimit = function(f, interval, opt_scope) {\n  let timeout = 0;\n\n  const handleTimeout = function() {\n    timeout = 0;\n  };\n\n  return /** @type {function(...?)} */ (function(var_args) {\n    if (!timeout) {\n      timeout = goog.global.setTimeout(handleTimeout, interval);\n      f.apply(opt_scope, arguments);\n    }\n  });\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/functions/functions.js"],"^:1",["^9K",["^;<"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.crypt.crypt.js","^9C",["^9D","goog/crypt/crypt.js"],"^9E","goog/crypt/crypt.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Namespace with crypto related helper functions.\n */\n\ngoog.provide('goog.crypt');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\n\n\n/**\n * Turns a string into an array of bytes; a \"byte\" being a JS number in the\n * range 0-255. Multi-byte characters are written as little-endian.\n * @param {string} str String value to arrify.\n * @return {!Array<number>} Array of numbers corresponding to the\n *     UCS character codes of each character in str.\n */\ngoog.crypt.stringToByteArray = function(str) {\n  var output = [], p = 0;\n  for (var i = 0; i < str.length; i++) {\n    var c = str.charCodeAt(i);\n    // NOTE: c <= 0xffff since JavaScript strings are UTF-16.\n    if (c > 0xff) {\n      output[p++] = c & 0xff;\n      c >>= 8;\n    }\n    output[p++] = c;\n  }\n  return output;\n};\n\n\n/**\n * Turns an array of numbers into the string given by the concatenation of the\n * characters to which the numbers correspond.\n * @param {!Uint8Array|!Array<number>} bytes Array of numbers representing\n *     characters.\n * @return {string} Stringification of the array.\n */\ngoog.crypt.byteArrayToString = function(bytes) {\n  var CHUNK_SIZE = 8192;\n\n  // Special-case the simple case for speed's sake.\n  if (bytes.length <= CHUNK_SIZE) {\n    return String.fromCharCode.apply(null, bytes);\n  }\n\n  // The remaining logic splits conversion by chunks since\n  // Function#apply() has a maximum parameter count.\n  // See discussion: http://goo.gl/LrWmZ9\n\n  var str = '';\n  for (var i = 0; i < bytes.length; i += CHUNK_SIZE) {\n    var chunk = goog.array.slice(bytes, i, i + CHUNK_SIZE);\n    str += String.fromCharCode.apply(null, chunk);\n  }\n  return str;\n};\n\n\n/**\n * Turns an array of numbers into the hex string given by the concatenation of\n * the hex values to which the numbers correspond.\n * @param {Uint8Array|Array<number>} array Array of numbers representing\n *     characters.\n * @param {string=} opt_separator Optional separator between values\n * @return {string} Hex string.\n */\ngoog.crypt.byteArrayToHex = function(array, opt_separator) {\n  return goog.array\n      .map(\n          array,\n          function(numByte) {\n            var hexByte = numByte.toString(16);\n            return hexByte.length > 1 ? hexByte : '0' + hexByte;\n          })\n      .join(opt_separator || '');\n};\n\n\n/**\n * Converts a hex string into an integer array.\n * @param {string} hexString Hex string of 16-bit integers (two characters\n *     per integer).\n * @return {!Array<number>} Array of {0,255} integers for the given string.\n */\ngoog.crypt.hexToByteArray = function(hexString) {\n  goog.asserts.assert(\n      hexString.length % 2 == 0, 'Key string length must be multiple of 2');\n  var arr = [];\n  for (var i = 0; i < hexString.length; i += 2) {\n    arr.push(parseInt(hexString.substring(i, i + 2), 16));\n  }\n  return arr;\n};\n\n\n/**\n * Converts a JS string to a UTF-8 \"byte\" array.\n * @param {string} str 16-bit unicode string.\n * @return {!Array<number>} UTF-8 byte array.\n */\ngoog.crypt.stringToUtf8ByteArray = function(str) {\n  // TODO(user): Use native implementations if/when available\n  var out = [], p = 0;\n  for (var i = 0; i < str.length; i++) {\n    var c = str.charCodeAt(i);\n    if (c < 128) {\n      out[p++] = c;\n    } else if (c < 2048) {\n      out[p++] = (c >> 6) | 192;\n      out[p++] = (c & 63) | 128;\n    } else if (\n        ((c & 0xFC00) == 0xD800) && (i + 1) < str.length &&\n        ((str.charCodeAt(i + 1) & 0xFC00) == 0xDC00)) {\n      // Surrogate Pair\n      c = 0x10000 + ((c & 0x03FF) << 10) + (str.charCodeAt(++i) & 0x03FF);\n      out[p++] = (c >> 18) | 240;\n      out[p++] = ((c >> 12) & 63) | 128;\n      out[p++] = ((c >> 6) & 63) | 128;\n      out[p++] = (c & 63) | 128;\n    } else {\n      out[p++] = (c >> 12) | 224;\n      out[p++] = ((c >> 6) & 63) | 128;\n      out[p++] = (c & 63) | 128;\n    }\n  }\n  return out;\n};\n\n\n/**\n * Converts a UTF-8 byte array to JavaScript's 16-bit Unicode.\n * @param {Uint8Array|Array<number>} bytes UTF-8 byte array.\n * @return {string} 16-bit Unicode string.\n */\ngoog.crypt.utf8ByteArrayToString = function(bytes) {\n  // TODO(user): Use native implementations if/when available\n  var out = [], pos = 0, c = 0;\n  while (pos < bytes.length) {\n    var c1 = bytes[pos++];\n    if (c1 < 128) {\n      out[c++] = String.fromCharCode(c1);\n    } else if (c1 > 191 && c1 < 224) {\n      var c2 = bytes[pos++];\n      out[c++] = String.fromCharCode((c1 & 31) << 6 | c2 & 63);\n    } else if (c1 > 239 && c1 < 365) {\n      // Surrogate Pair\n      var c2 = bytes[pos++];\n      var c3 = bytes[pos++];\n      var c4 = bytes[pos++];\n      var u = ((c1 & 7) << 18 | (c2 & 63) << 12 | (c3 & 63) << 6 | c4 & 63) -\n          0x10000;\n      out[c++] = String.fromCharCode(0xD800 + (u >> 10));\n      out[c++] = String.fromCharCode(0xDC00 + (u & 1023));\n    } else {\n      var c2 = bytes[pos++];\n      var c3 = bytes[pos++];\n      out[c++] =\n          String.fromCharCode((c1 & 15) << 12 | (c2 & 63) << 6 | c3 & 63);\n    }\n  }\n  return out.join('');\n};\n\n\n/**\n * XOR two byte arrays.\n * @param {!Uint8Array|!Int8Array|!Array<number>} bytes1 Byte array 1.\n * @param {!Uint8Array|!Int8Array|!Array<number>} bytes2 Byte array 2.\n * @return {!Array<number>} Resulting XOR of the two byte arrays.\n */\ngoog.crypt.xorByteArray = function(bytes1, bytes2) {\n  goog.asserts.assert(\n      bytes1.length == bytes2.length, 'XOR array lengths must match');\n\n  var result = [];\n  for (var i = 0; i < bytes1.length; i++) {\n    result.push(bytes1[i] ^ bytes2[i]);\n  }\n  return result;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9>","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/crypt.js"],"^:1",["^9K",["~$goog.crypt"]],"^9<",true,"^9=",["^9>","^;9","^:E"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.singleton.js","^9C",["^9D","goog/testing/singleton.js"],"^9E","goog/testing/singleton.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This module simplifies testing code which uses stateful\n * singletons. `goog.testing.singleton.reset` resets all instances, so\n * next time when `getInstance` is called, a new instance is created.\n * It's recommended to reset the singletons in `tearDown` to prevent\n * interference between subsequent tests.\n *\n * The `goog.testing.singleton` functions expect that the goog.DEBUG flag\n * is enabled, and the tests are either uncompiled or compiled without renaming.\n *\n */\n\ngoog.setTestOnly('goog.testing.singleton');\ngoog.provide('goog.testing.singleton');\n\n\n/**\n * Deletes all singleton instances, so `getInstance` will return a new\n * instance on next call.\n */\ngoog.testing.singleton.reset = function() {\n  const singletons = goog.getObjectByName('goog.instantiatedSingletons_');\n  let ctor;\n  while (ctor = singletons.pop()) {\n    delete ctor.instance_;\n  }\n};\n\n\n/**\n * @deprecated Please use `goog.addSingletonGetter`.\n */\ngoog.testing.singleton.addSingletonGetter = goog.addSingletonGetter;\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/singleton.js"],"^:1",["^9K",["~$goog.testing.singleton"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.roundedtabrenderer.js","^9C",["^9D","goog/ui/roundedtabrenderer.js"],"^9E","goog/ui/roundedtabrenderer.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Rounded corner tab renderer for {@link goog.ui.Tab}s.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.RoundedTabRenderer');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.ui.Tab');\ngoog.require('goog.ui.TabBar');\ngoog.require('goog.ui.TabRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Rounded corner tab renderer for {@link goog.ui.Tab}s.\n * @constructor\n * @extends {goog.ui.TabRenderer}\n * @final\n */\ngoog.ui.RoundedTabRenderer = function() {\n  goog.ui.TabRenderer.call(this);\n};\ngoog.inherits(goog.ui.RoundedTabRenderer, goog.ui.TabRenderer);\ngoog.addSingletonGetter(goog.ui.RoundedTabRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.RoundedTabRenderer.CSS_CLASS = goog.getCssName('goog-rounded-tab');\n\n\n/**\n * Returns the CSS class name to be applied to the root element of all tabs\n * rendered or decorated using this renderer.\n * @return {string} Renderer-specific CSS class name.\n * @override\n */\ngoog.ui.RoundedTabRenderer.prototype.getCssClass = function() {\n  return goog.ui.RoundedTabRenderer.CSS_CLASS;\n};\n\n\n/**\n * Creates the tab's DOM structure, based on the containing tab bar's location\n * relative to tab contents.  For example, the DOM for a tab in a tab bar\n * located above tab contents would look like this:\n *\n *    <div class=\"goog-rounded-tab\" title=\"...\">\n *      <table class=\"goog-rounded-tab-table\">\n *        <tbody>\n *          <tr>\n *            <td nowrap>\n *              <div class=\"goog-rounded-tab-outer-edge\"></div>\n *              <div class=\"goog-rounded-tab-inner-edge\"></div>\n *            </td>\n *          </tr>\n *          <tr>\n *            <td nowrap>\n *              <div class=\"goog-rounded-tab-caption\">Hello, world</div>\n *            </td>\n *          </tr>\n *        </tbody>\n *      </table>\n *    </div>\n *\n * @param {goog.ui.Control} tab Tab to render.\n * @return {Element} Root element for the tab.\n * @override\n */\ngoog.ui.RoundedTabRenderer.prototype.createDom = function(tab) {\n  return this.decorate(\n      tab, goog.ui.RoundedTabRenderer.superClass_.createDom.call(this, tab));\n};\n\n\n/**\n * Decorates the element with the tab.  Overrides the superclass implementation\n * by wrapping the tab's content in a table that implements rounded corners.\n * @param {goog.ui.Control} tab Tab to decorate the element.\n * @param {Element} element Element to decorate.\n * @return {Element} Decorated element.\n * @override\n */\ngoog.ui.RoundedTabRenderer.prototype.decorate = function(tab, element) {\n  var tabBar = tab.getParent();\n\n  if (!this.getContentElement(element)) {\n    // The element to be decorated doesn't appear to have the full tab DOM,\n    // so we have to create it.\n    element.appendChild(\n        this.createTab(\n            tab.getDomHelper(), element.childNodes, tabBar.getLocation()));\n  }\n\n  return goog.ui.RoundedTabRenderer.superClass_.decorate.call(\n      this, tab, element);\n};\n\n\n/**\n * Creates a table implementing a rounded corner tab.\n * @param {goog.dom.DomHelper} dom DOM helper to use for element construction.\n * @param {goog.ui.ControlContent} caption Text caption or DOM structure\n *     to display as the tab's caption.\n * @param {goog.ui.TabBar.Location} location Tab bar location relative to the\n *     tab contents.\n * @return {!Element} Table implementing a rounded corner tab.\n * @protected\n */\ngoog.ui.RoundedTabRenderer.prototype.createTab = function(\n    dom, caption, location) {\n  var rows = [];\n\n  if (location != goog.ui.TabBar.Location.BOTTOM) {\n    // This is a left, right, or top tab, so it needs a rounded top edge.\n    rows.push(this.createEdge(dom, /* isTopEdge */ true));\n  }\n  rows.push(this.createCaption(dom, caption));\n  if (location != goog.ui.TabBar.Location.TOP) {\n    // This is a left, right, or bottom tab, so it needs a rounded bottom edge.\n    rows.push(this.createEdge(dom, /* isTopEdge */ false));\n  }\n\n  return dom.createDom(\n      goog.dom.TagName.TABLE, {\n        'cellPadding': 0,\n        'cellSpacing': 0,\n        'className': goog.getCssName(this.getStructuralCssClass(), 'table')\n      },\n      dom.createDom(goog.dom.TagName.TBODY, null, rows));\n};\n\n\n/**\n * Creates a table row implementing the tab caption.\n * @param {goog.dom.DomHelper} dom DOM helper to use for element construction.\n * @param {goog.ui.ControlContent} caption Text caption or DOM structure\n *     to display as the tab's caption.\n * @return {!Element} Tab caption table row.\n * @protected\n */\ngoog.ui.RoundedTabRenderer.prototype.createCaption = function(dom, caption) {\n  var baseClass = this.getStructuralCssClass();\n  return dom.createDom(\n      goog.dom.TagName.TR, null,\n      dom.createDom(\n          goog.dom.TagName.TD, {'noWrap': true},\n          dom.createDom(\n              goog.dom.TagName.DIV, goog.getCssName(baseClass, 'caption'),\n              caption)));\n};\n\n\n/**\n * Creates a table row implementing a rounded tab edge.\n * @param {goog.dom.DomHelper} dom DOM helper to use for element construction.\n * @param {boolean} isTopEdge Whether to create a top or bottom edge.\n * @return {!Element} Rounded tab edge table row.\n * @protected\n */\ngoog.ui.RoundedTabRenderer.prototype.createEdge = function(dom, isTopEdge) {\n  var baseClass = this.getStructuralCssClass();\n  var inner = dom.createDom(\n      goog.dom.TagName.DIV, goog.getCssName(baseClass, 'inner-edge'));\n  var outer = dom.createDom(\n      goog.dom.TagName.DIV, goog.getCssName(baseClass, 'outer-edge'));\n  return dom.createDom(\n      goog.dom.TagName.TR, null,\n      dom.createDom(\n          goog.dom.TagName.TD, {'noWrap': true},\n          isTopEdge ? [outer, inner] : [inner, outer]));\n};\n\n\n/** @override */\ngoog.ui.RoundedTabRenderer.prototype.getContentElement = function(element) {\n  var baseClass = this.getStructuralCssClass();\n  return element &&\n      goog.dom.getElementsByTagNameAndClass(\n          goog.dom.TagName.DIV, goog.getCssName(baseClass, 'caption'),\n          element)[0];\n};\n\n\n// Register a decorator factory function for goog.ui.Tabs using the rounded\n// tab renderer.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.RoundedTabRenderer.CSS_CLASS, function() {\n      return new goog.ui.Tab(null, goog.ui.RoundedTabRenderer.getInstance());\n    });\n","^9I",1579837703000,"^9J",["^9K",["^;;","^HJ","^9>","~$goog.ui.TabBar","^:>","^HK","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/roundedtabrenderer.js"],"^:1",["^9K",["~$goog.ui.RoundedTabRenderer"]],"^9<",true,"^9=",["^9>","^;;","^;=","^HK","^JG","^HJ","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.storage.mechanism.errorhandlingmechanism.js","^9C",["^9D","goog/storage/mechanism/errorhandlingmechanism.js"],"^9E","goog/storage/mechanism/errorhandlingmechanism.js","^9F","^9G","^9H","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Wraps a storage mechanism with a custom error handler.\n *\n * @author ruilopes@google.com (Rui do Nascimento Dias Lopes)\n */\n\ngoog.provide('goog.storage.mechanism.ErrorHandlingMechanism');\n\ngoog.require('goog.storage.mechanism.Mechanism');\n\n\n\n/**\n * Wraps a storage mechanism with a custom error handler.\n *\n * @param {!goog.storage.mechanism.Mechanism} mechanism Underlying storage\n *     mechanism.\n * @param {goog.storage.mechanism.ErrorHandlingMechanism.ErrorHandler}\n *     errorHandler An error handler.\n * @constructor\n * @struct\n * @extends {goog.storage.mechanism.Mechanism}\n * @final\n */\ngoog.storage.mechanism.ErrorHandlingMechanism = function(\n    mechanism, errorHandler) {\n  goog.storage.mechanism.ErrorHandlingMechanism.base(this, 'constructor');\n\n  /**\n   * The mechanism to be wrapped.\n   * @type {!goog.storage.mechanism.Mechanism}\n   * @private\n   */\n  this.mechanism_ = mechanism;\n\n  /**\n   * The error handler.\n   * @type {goog.storage.mechanism.ErrorHandlingMechanism.ErrorHandler}\n   * @private\n   */\n  this.errorHandler_ = errorHandler;\n};\ngoog.inherits(\n    goog.storage.mechanism.ErrorHandlingMechanism,\n    goog.storage.mechanism.Mechanism);\n\n\n/**\n * Valid storage mechanism operations.\n * @enum {string}\n */\ngoog.storage.mechanism.ErrorHandlingMechanism.Operation = {\n  SET: 'set',\n  GET: 'get',\n  REMOVE: 'remove'\n};\n\n\n/**\n * A function that handles errors raised in goog.storage.  Since some places in\n * the goog.storage codebase throw strings instead of Error objects, we accept\n * these as a valid parameter type.  It supports the following arguments:\n *\n * 1) The raised error (either in Error or string form);\n * 2) The operation name which triggered the error, as defined per the\n *    ErrorHandlingMechanism.Operation enum;\n * 3) The key that is passed to a storage method;\n * 4) An optional value that is passed to a storage method (only used in set\n *    operations).\n *\n * @typedef {function(\n *   (!Error|string),\n *   goog.storage.mechanism.ErrorHandlingMechanism.Operation,\n *   string,\n *   *=)}\n */\ngoog.storage.mechanism.ErrorHandlingMechanism.ErrorHandler;\n\n\n/** @override */\ngoog.storage.mechanism.ErrorHandlingMechanism.prototype.set = function(\n    key, value) {\n  try {\n    this.mechanism_.set(key, value);\n  } catch (e) {\n    this.errorHandler_(\n        e, goog.storage.mechanism.ErrorHandlingMechanism.Operation.SET, key,\n        value);\n  }\n};\n\n\n/** @override */\ngoog.storage.mechanism.ErrorHandlingMechanism.prototype.get = function(key) {\n  try {\n    return this.mechanism_.get(key);\n  } catch (e) {\n    this.errorHandler_(\n        e, goog.storage.mechanism.ErrorHandlingMechanism.Operation.GET, key);\n    return null;\n  }\n};\n\n\n/** @override */\ngoog.storage.mechanism.ErrorHandlingMechanism.prototype.remove = function(key) {\n  try {\n    this.mechanism_.remove(key);\n  } catch (e) {\n    this.errorHandler_(\n        e, goog.storage.mechanism.ErrorHandlingMechanism.Operation.REMOVE, key);\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.storage.mechanism.Mechanism"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/mechanism/errorhandlingmechanism.js"],"^:1",["^9K",["~$goog.storage.mechanism.ErrorHandlingMechanism"]],"^9<",true,"^9=",["^9>","^JI"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.editor.bubble.js","^9C",["^9D","goog/ui/editor/bubble.js"],"^9E","goog/ui/editor/bubble.js","^9F","^9G","^9H","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Bubble component - handles display, hiding, etc. of the\n * actual bubble UI.\n *\n * This is used exclusively by code within the editor package, and should not\n * be used directly.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.ui.editor.Bubble');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.ViewportSizeMonitor');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.editor.style');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.functions');\ngoog.require('goog.log');\ngoog.require('goog.math.Box');\ngoog.require('goog.object');\ngoog.require('goog.positioning');\ngoog.require('goog.positioning.Corner');\ngoog.require('goog.positioning.Overflow');\ngoog.require('goog.positioning.OverflowStatus');\ngoog.require('goog.string');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.PopupBase');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Property bubble UI element.\n * @param {Element} parent The parent element for this bubble.\n * @param {number} zIndex The z index to draw the bubble at.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.ui.editor.Bubble = function(parent, zIndex) {\n  goog.ui.editor.Bubble.base(this, 'constructor');\n\n  /**\n   * Dom helper for the document the bubble should be shown in.\n   * @type {!goog.dom.DomHelper}\n   * @private\n   */\n  this.dom_ = goog.dom.getDomHelper(parent);\n\n  /**\n   * Event handler for this bubble.\n   * @type {goog.events.EventHandler<!goog.ui.editor.Bubble>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  /**\n   * Object that monitors the application window for size changes.\n   * @type {goog.dom.ViewportSizeMonitor}\n   * @private\n   */\n  this.viewPortSizeMonitor_ =\n      new goog.dom.ViewportSizeMonitor(this.dom_.getWindow());\n\n  /**\n   * Maps panel ids to panels.\n   * @type {Object<goog.ui.editor.Bubble.Panel_>}\n   * @private\n   */\n  this.panels_ = {};\n\n  /**\n   * Container element for the entire bubble.  This may contain elements related\n   * to look and feel or styling of the bubble.\n   * @type {Element}\n   * @private\n   */\n  this.bubbleContainer_ = this.dom_.createDom(\n      goog.dom.TagName.DIV,\n      {'className': goog.ui.editor.Bubble.BUBBLE_CLASSNAME});\n\n  goog.style.setElementShown(this.bubbleContainer_, false);\n  goog.dom.appendChild(parent, this.bubbleContainer_);\n  goog.style.setStyle(this.bubbleContainer_, 'zIndex', zIndex);\n\n  /**\n   * Container element for the bubble panels - this should be some inner element\n   * within (or equal to) bubbleContainer.\n   * @type {Element}\n   * @private\n   */\n  this.bubbleContents_ = this.createBubbleDom(this.dom_, this.bubbleContainer_);\n\n  /**\n   * Element showing the close box.\n   * @type {!Element}\n   * @private\n   */\n  this.closeBox_ = this.dom_.createDom(goog.dom.TagName.DIV, {\n    'className': goog.getCssName('tr_bubble_closebox'),\n    'innerHTML': '&nbsp;'\n  });\n  this.bubbleContents_.appendChild(this.closeBox_);\n\n  // We make bubbles unselectable so that clicking on them does not steal focus\n  // or move the cursor away from the element the bubble is attached to.\n  goog.editor.style.makeUnselectable(this.bubbleContainer_, this.eventHandler_);\n\n  /**\n   * Popup that controls showing and hiding the bubble at the appropriate\n   * position.\n   * @type {goog.ui.PopupBase}\n   * @private\n   */\n  this.popup_ = new goog.ui.PopupBase(this.bubbleContainer_);\n};\ngoog.inherits(goog.ui.editor.Bubble, goog.events.EventTarget);\n\n\n/**\n * The css class name of the bubble container element.\n * @type {string}\n */\ngoog.ui.editor.Bubble.BUBBLE_CLASSNAME = goog.getCssName('tr_bubble');\n\n\n/**\n * Creates and adds DOM for the bubble UI to the given container.  This default\n * implementation just returns the container itself.\n * @param {!goog.dom.DomHelper} dom DOM helper to use.\n * @param {!Element} container Element to add the new elements to.\n * @return {!Element} The element where bubble content should be added.\n * @protected\n */\ngoog.ui.editor.Bubble.prototype.createBubbleDom = function(dom, container) {\n  return container;\n};\n\n\n/**\n * A logger for goog.ui.editor.Bubble.\n * @type {goog.log.Logger}\n * @protected\n */\ngoog.ui.editor.Bubble.prototype.logger =\n    goog.log.getLogger('goog.ui.editor.Bubble');\n\n\n/** @override */\ngoog.ui.editor.Bubble.prototype.disposeInternal = function() {\n  goog.ui.editor.Bubble.base(this, 'disposeInternal');\n\n  goog.dom.removeNode(this.bubbleContainer_);\n  this.bubbleContainer_ = null;\n\n  this.eventHandler_.dispose();\n  this.eventHandler_ = null;\n\n  this.viewPortSizeMonitor_.dispose();\n  this.viewPortSizeMonitor_ = null;\n};\n\n\n/**\n * @return {Element} The element that where the bubble's contents go.\n */\ngoog.ui.editor.Bubble.prototype.getContentElement = function() {\n  return this.bubbleContents_;\n};\n\n\n/**\n * @return {Element} The element that contains the bubble.\n * @protected\n */\ngoog.ui.editor.Bubble.prototype.getContainerElement = function() {\n  return this.bubbleContainer_;\n};\n\n\n/**\n * @return {goog.events.EventHandler<T>} The event handler.\n * @protected\n * @this {T}\n * @template T\n */\ngoog.ui.editor.Bubble.prototype.getEventHandler = function() {\n  return this.eventHandler_;\n};\n\n\n/**\n * Handles user resizing of window.\n * @private\n */\ngoog.ui.editor.Bubble.prototype.handleWindowResize_ = function() {\n  if (this.isVisible()) {\n    this.reposition();\n  }\n};\n\n\n/**\n * Sets whether the bubble dismisses itself when the user clicks outside of it.\n * @param {boolean} autoHide Whether to autohide on an external click.\n */\ngoog.ui.editor.Bubble.prototype.setAutoHide = function(autoHide) {\n  this.popup_.setAutoHide(autoHide);\n};\n\n\n/**\n * Returns whether there is already a panel of the given type.\n * @param {string} type Type of panel to check.\n * @return {boolean} Whether there is already a panel of the given type.\n */\ngoog.ui.editor.Bubble.prototype.hasPanelOfType = function(type) {\n  return goog.object.some(\n      this.panels_, function(panel) { return panel.type == type; });\n};\n\n\n/**\n * Adds a panel to the bubble.\n * @param {string} type The type of bubble panel this is.  Should usually be\n *     the same as the tagName of the targetElement.  This ensures multiple\n *     bubble panels don't appear for the same element.\n * @param {string} title The title of the panel.\n * @param {Element} targetElement The target element of the bubble.\n * @param {function(Element): void} contentFn Function that when called with\n *     a container element, will add relevant panel content to it.\n * @param {boolean=} opt_preferTopPosition Whether to prefer placing the bubble\n *     above the element instead of below it.  Defaults to preferring below.\n *     If any panel prefers the top position, the top position is used.\n * @return {string} The id of the panel.\n */\ngoog.ui.editor.Bubble.prototype.addPanel = function(\n    type, title, targetElement, contentFn, opt_preferTopPosition) {\n  var id = goog.string.createUniqueString();\n  var panel = new goog.ui.editor.Bubble.Panel_(\n      this.dom_, id, type, title, targetElement, !opt_preferTopPosition);\n  this.panels_[id] = panel;\n\n  // Insert the panel in string order of type.  Technically we could use binary\n  // search here but n is really small (probably 0 - 2) so it's not worth it.\n  // The last child of bubbleContents_ is the close box so we take care not\n  // to treat it as a panel element, and we also ensure it stays as the last\n  // element.  The intention here is not to create any artificial order, but\n  // just to ensure that it is always consistent.\n  var nextElement;\n  for (var i = 0, len = this.bubbleContents_.childNodes.length - 1; i < len;\n       i++) {\n    var otherChild = this.bubbleContents_.childNodes[i];\n    var otherPanel = this.panels_[otherChild.id];\n    if (otherPanel.type > type) {\n      nextElement = otherChild;\n      break;\n    }\n  }\n  goog.dom.insertSiblingBefore(\n      panel.element, nextElement || this.bubbleContents_.lastChild);\n\n  contentFn(panel.getContentElement());\n  goog.editor.style.makeUnselectable(panel.element, this.eventHandler_);\n\n  var numPanels = goog.object.getCount(this.panels_);\n  if (numPanels == 1) {\n    this.openBubble_();\n  } else if (numPanels == 2) {\n    goog.dom.classlist.add(\n        goog.asserts.assert(this.bubbleContainer_),\n        goog.getCssName('tr_multi_bubble'));\n  }\n  this.reposition();\n\n  return id;\n};\n\n\n/**\n * Removes the panel with the given id.\n * @param {string} id The id of the panel.\n */\ngoog.ui.editor.Bubble.prototype.removePanel = function(id) {\n  var panel = this.panels_[id];\n  goog.dom.removeNode(panel.element);\n  delete this.panels_[id];\n\n  var numPanels = goog.object.getCount(this.panels_);\n  if (numPanels <= 1) {\n    goog.dom.classlist.remove(\n        goog.asserts.assert(this.bubbleContainer_),\n        goog.getCssName('tr_multi_bubble'));\n  }\n\n  if (numPanels == 0) {\n    this.closeBubble_();\n  } else {\n    this.reposition();\n  }\n};\n\n\n/**\n * Opens the bubble.\n * @private\n */\ngoog.ui.editor.Bubble.prototype.openBubble_ = function() {\n  this.eventHandler_\n      .listen(this.closeBox_, goog.events.EventType.CLICK, this.closeBubble_)\n      .listen(\n          this.viewPortSizeMonitor_, goog.events.EventType.RESIZE,\n          this.handleWindowResize_)\n      .listen(\n          this.popup_, goog.ui.PopupBase.EventType.HIDE, this.handlePopupHide);\n\n  this.popup_.setVisible(true);\n  this.reposition();\n};\n\n\n/**\n * Closes the bubble.\n * @private\n */\ngoog.ui.editor.Bubble.prototype.closeBubble_ = function() {\n  this.popup_.setVisible(false);\n};\n\n\n/**\n * Handles the popup's hide event by removing all panels and dispatching a\n * HIDE event.\n * @protected\n */\ngoog.ui.editor.Bubble.prototype.handlePopupHide = function() {\n  // Remove the panel elements.\n  for (var panelId in this.panels_) {\n    goog.dom.removeNode(this.panels_[panelId].element);\n  }\n\n  // Update the state to reflect no panels.\n  this.panels_ = {};\n  goog.dom.classlist.remove(\n      goog.asserts.assert(this.bubbleContainer_),\n      goog.getCssName('tr_multi_bubble'));\n\n  this.eventHandler_.removeAll();\n  this.dispatchEvent(goog.ui.Component.EventType.HIDE);\n};\n\n\n/**\n * Returns the visibility of the bubble.\n * @return {boolean} True if visible false if not.\n */\ngoog.ui.editor.Bubble.prototype.isVisible = function() {\n  return this.popup_.isVisible();\n};\n\n\n/**\n * The vertical clearance in pixels between the bottom of the targetElement\n * and the edge of the bubble.\n * @type {number}\n * @private\n */\ngoog.ui.editor.Bubble.VERTICAL_CLEARANCE_ = goog.userAgent.IE ? 4 : 2;\n\n\n/**\n * Bubble's margin box to be passed to goog.positioning.\n * @type {goog.math.Box}\n * @private\n */\ngoog.ui.editor.Bubble.MARGIN_BOX_ = new goog.math.Box(\n    goog.ui.editor.Bubble.VERTICAL_CLEARANCE_, 0,\n    goog.ui.editor.Bubble.VERTICAL_CLEARANCE_, 0);\n\n\n/**\n * Returns the margin box.\n * @return {goog.math.Box}\n * @protected\n */\ngoog.ui.editor.Bubble.prototype.getMarginBox = function() {\n  return goog.ui.editor.Bubble.MARGIN_BOX_;\n};\n\n\n/**\n * Positions and displays this bubble below its targetElement. Assumes that\n * the bubbleContainer is already contained in the document object it applies\n * to.\n */\ngoog.ui.editor.Bubble.prototype.reposition = function() {\n  var targetElement = null;\n  var preferBottomPosition = true;\n  for (var panelId in this.panels_) {\n    var panel = this.panels_[panelId];\n    // We don't care which targetElement we get, so we just take the last one.\n    targetElement = panel.targetElement;\n    preferBottomPosition = preferBottomPosition && panel.preferBottomPosition;\n  }\n  var status = goog.positioning.OverflowStatus.FAILED;\n\n  // Fix for bug when bubbleContainer and targetElement have\n  // opposite directionality, the bubble should anchor to the END of\n  // the targetElement instead of START.\n  var reverseLayout =\n      (goog.style.isRightToLeft(this.bubbleContainer_) !=\n       goog.style.isRightToLeft(targetElement));\n\n  // Try to put the bubble at the bottom of the target unless the plugin has\n  // requested otherwise.\n  if (preferBottomPosition) {\n    status = this.positionAtAnchor_(\n        reverseLayout ? goog.positioning.Corner.BOTTOM_END :\n                        goog.positioning.Corner.BOTTOM_START,\n        goog.positioning.Corner.TOP_START,\n        goog.positioning.Overflow.ADJUST_X | goog.positioning.Overflow.FAIL_Y);\n  }\n\n  if (status & goog.positioning.OverflowStatus.FAILED) {\n    // Try to put it at the top of the target if there is not enough\n    // space at the bottom.\n    status = this.positionAtAnchor_(\n        reverseLayout ? goog.positioning.Corner.TOP_END :\n                        goog.positioning.Corner.TOP_START,\n        goog.positioning.Corner.BOTTOM_START,\n        goog.positioning.Overflow.ADJUST_X | goog.positioning.Overflow.FAIL_Y);\n  }\n\n  if (status & goog.positioning.OverflowStatus.FAILED) {\n    // Put it at the bottom again with adjustment if there is no\n    // enough space at the top.\n    status = this.positionAtAnchor_(\n        reverseLayout ? goog.positioning.Corner.BOTTOM_END :\n                        goog.positioning.Corner.BOTTOM_START,\n        goog.positioning.Corner.TOP_START, goog.positioning.Overflow.ADJUST_X |\n            goog.positioning.Overflow.ADJUST_Y);\n    if (status & goog.positioning.OverflowStatus.FAILED) {\n      goog.log.warning(\n          this.logger,\n          'reposition(): positionAtAnchor() failed with ' + status);\n    }\n  }\n};\n\n\n/**\n * A helper for reposition() - positions the bubble in regards to the position\n * of the elements the bubble is attached to.\n * @param {goog.positioning.Corner} targetCorner The corner of\n *     the target element.\n * @param {goog.positioning.Corner} bubbleCorner The corner of the bubble.\n * @param {number} overflow Overflow handling mode bitmap,\n *     {@see goog.positioning.Overflow}.\n * @return {number} Status bitmap, {@see goog.positioning.OverflowStatus}.\n * @private\n */\ngoog.ui.editor.Bubble.prototype.positionAtAnchor_ = function(\n    targetCorner, bubbleCorner, overflow) {\n  var targetElement = null;\n  for (var panelId in this.panels_) {\n    // For now, we use the outermost element.  This assumes the multiple\n    // elements this panel is showing for contain each other - in the event\n    // that is not generally the case this may need to be updated to pick\n    // the lowest or highest element depending on targetCorner.\n    var candidate = this.panels_[panelId].targetElement;\n    if (!targetElement || goog.dom.contains(candidate, targetElement)) {\n      targetElement = this.panels_[panelId].targetElement;\n    }\n  }\n  return goog.positioning.positionAtAnchor(\n      targetElement, targetCorner, this.bubbleContainer_, bubbleCorner, null,\n      this.getMarginBox(), overflow, null, this.getViewportBox());\n};\n\n\n/**\n * Returns the viewport box to use when positioning the bubble.\n * @return {goog.math.Box}\n * @protected\n */\ngoog.ui.editor.Bubble.prototype.getViewportBox = goog.functions.NULL;\n\n\n\n/**\n * Private class used to describe a bubble panel.\n * @param {goog.dom.DomHelper} dom DOM helper used to create the panel.\n * @param {string} id ID of the panel.\n * @param {string} type Type of the panel.\n * @param {string} title Title of the panel.\n * @param {Element} targetElement Element the panel is showing for.\n * @param {boolean} preferBottomPosition Whether this panel prefers to show\n *     below the target element.\n * @constructor\n * @private\n */\ngoog.ui.editor.Bubble.Panel_ = function(\n    dom, id, type, title, targetElement, preferBottomPosition) {\n  /**\n   * The type of bubble panel.\n   * @type {string}\n   */\n  this.type = type;\n\n  /**\n   * The target element of this bubble panel.\n   * @type {Element}\n   */\n  this.targetElement = targetElement;\n\n  /**\n   * Whether the panel prefers to be placed below the target element.\n   * @type {boolean}\n   */\n  this.preferBottomPosition = preferBottomPosition;\n\n  /**\n   * The element containing this panel.\n   * @type {!Element}\n   */\n  this.element = dom.createDom(\n      goog.dom.TagName.DIV,\n      {className: goog.getCssName('tr_bubble_panel'), id: id},\n      dom.createDom(\n          goog.dom.TagName.DIV,\n          {className: goog.getCssName('tr_bubble_panel_title')},\n          title ? title + ':' : ''),  // TODO(robbyw): Does this work in bidi?\n      dom.createDom(\n          goog.dom.TagName.DIV,\n          {className: goog.getCssName('tr_bubble_panel_content')}));\n};\n\n\n/**\n * @return {Element} The element in the panel where content should go.\n */\ngoog.ui.editor.Bubble.Panel_.prototype.getContentElement = function() {\n  return /** @type {Element} */ (this.element.lastChild);\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^:G","^>;","^;<","^:;","^<=","^9L","^A4","^:=","~$goog.dom.ViewportSizeMonitor","^9>","^;P","^:L","^:S","^;Q","^<?","^:I","^A5","^A6","^<3","~$goog.editor.style","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/editor/bubble.js"],"^:1",["^9K",["~$goog.ui.editor.Bubble"]],"^9<",true,"^9=",["^9>","^:E","^;;","^;=","^JK","^:;","^JL","^>;","^:L","^:I","^;<","^;Q","^<?","^;P","^A4","^:G","^A5","^A6","^9L","^<3","^:=","^<=","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.html.trustedresourceurl.js","^9C",["^9D","goog/html/trustedresourceurl.js"],"^9E","goog/html/trustedresourceurl.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The TrustedResourceUrl type and its builders.\n *\n * TODO(xtof): Link to document stating type contract.\n */\n\ngoog.provide('goog.html.TrustedResourceUrl');\n\ngoog.require('goog.asserts');\ngoog.require('goog.html.trustedtypes');\ngoog.require('goog.i18n.bidi.Dir');\ngoog.require('goog.i18n.bidi.DirectionalString');\ngoog.require('goog.string.Const');\ngoog.require('goog.string.TypedString');\n\n\n\n/**\n * A URL which is under application control and from which script, CSS, and\n * other resources that represent executable code, can be fetched.\n *\n * Given that the URL can only be constructed from strings under application\n * control and is used to load resources, bugs resulting in a malformed URL\n * should not have a security impact and are likely to be easily detectable\n * during testing. Given the wide number of non-RFC compliant URLs in use,\n * stricter validation could prevent some applications from being able to use\n * this type.\n *\n * Instances of this type must be created via the factory method,\n * (`fromConstant`, `fromConstants`, `format` or\n * `formatWithParams`), and not by invoking its constructor. The constructor\n * is organized in a way that only methods from that file can call it and\n * initialize with non-empty values. Anyone else calling constructor will\n * get default instance with empty value.\n *\n * @see goog.html.TrustedResourceUrl#fromConstant\n * @constructor\n * @final\n * @struct\n * @implements {goog.i18n.bidi.DirectionalString}\n * @implements {goog.string.TypedString}\n * @param {!Object=} opt_token package-internal implementation detail.\n * @param {!TrustedScriptURL|string=} opt_content package-internal\n *     implementation detail.\n */\ngoog.html.TrustedResourceUrl = function(opt_token, opt_content) {\n  /**\n   * The contained value of this TrustedResourceUrl.  The field has a purposely\n   * ugly name to make (non-compiled) code that attempts to directly access this\n   * field stand out.\n   * @const\n   * @private {!TrustedScriptURL|string}\n   */\n  this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_ =\n      ((opt_token ===\n        goog.html.TrustedResourceUrl.CONSTRUCTOR_TOKEN_PRIVATE_) &&\n       opt_content) ||\n      '';\n\n  /**\n   * A type marker used to implement additional run-time type checking.\n   * @see goog.html.TrustedResourceUrl#unwrap\n   * @const {!Object}\n   * @private\n   */\n  this.TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =\n      goog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;\n};\n\n\n/**\n * @override\n * @const\n */\ngoog.html.TrustedResourceUrl.prototype.implementsGoogStringTypedString = true;\n\n\n/**\n * Returns this TrustedResourceUrl's value as a string.\n *\n * IMPORTANT: In code where it is security relevant that an object's type is\n * indeed `TrustedResourceUrl`, use\n * `goog.html.TrustedResourceUrl.unwrap` instead of this method. If in\n * doubt, assume that it's security relevant. In particular, note that\n * goog.html functions which return a goog.html type do not guarantee that\n * the returned instance is of the right type. For example:\n *\n * <pre>\n * var fakeSafeHtml = new String('fake');\n * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;\n * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);\n * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by\n * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml instanceof\n * // goog.html.SafeHtml.\n * </pre>\n *\n * @see goog.html.TrustedResourceUrl#unwrap\n * @override\n */\ngoog.html.TrustedResourceUrl.prototype.getTypedStringValue = function() {\n  return this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_\n      .toString();\n};\n\n\n/**\n * @override\n * @const\n */\ngoog.html.TrustedResourceUrl.prototype.implementsGoogI18nBidiDirectionalString =\n    true;\n\n\n/**\n * Returns this URLs directionality, which is always `LTR`.\n * @override\n */\ngoog.html.TrustedResourceUrl.prototype.getDirection = function() {\n  return goog.i18n.bidi.Dir.LTR;\n};\n\n\n/**\n * Creates a new TrustedResourceUrl with params added to URL. Both search and\n * hash params can be specified.\n *\n * @param {string|?Object<string, *>|undefined} searchParams Search parameters\n *     to add to URL. See goog.html.TrustedResourceUrl.stringifyParams_ for\n *     exact format definition.\n * @param {(string|?Object<string, *>)=} opt_hashParams Hash parameters to add\n *     to URL. See goog.html.TrustedResourceUrl.stringifyParams_ for exact\n *     format definition.\n * @return {!goog.html.TrustedResourceUrl} New TrustedResourceUrl with params.\n */\ngoog.html.TrustedResourceUrl.prototype.cloneWithParams = function(\n    searchParams, opt_hashParams) {\n  var url = goog.html.TrustedResourceUrl.unwrap(this);\n  var parts = goog.html.TrustedResourceUrl.URL_PARAM_PARSER_.exec(url);\n  var urlBase = parts[1];\n  var urlSearch = parts[2] || '';\n  var urlHash = parts[3] || '';\n\n  return goog.html.TrustedResourceUrl\n      .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(\n          urlBase +\n          goog.html.TrustedResourceUrl.stringifyParams_(\n              '?', urlSearch, searchParams) +\n          goog.html.TrustedResourceUrl.stringifyParams_(\n              '#', urlHash, opt_hashParams));\n};\n\n\nif (goog.DEBUG) {\n  /**\n   * Returns a debug string-representation of this value.\n   *\n   * To obtain the actual string value wrapped in a TrustedResourceUrl, use\n   * `goog.html.TrustedResourceUrl.unwrap`.\n   *\n   * @see goog.html.TrustedResourceUrl#unwrap\n   * @override\n   */\n  goog.html.TrustedResourceUrl.prototype.toString = function() {\n    return 'TrustedResourceUrl{' +\n        this.privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_ + '}';\n  };\n}\n\n\n/**\n * Performs a runtime check that the provided object is indeed a\n * TrustedResourceUrl object, and returns its value.\n *\n * @param {!goog.html.TrustedResourceUrl} trustedResourceUrl The object to\n *     extract from.\n * @return {string} The trustedResourceUrl object's contained string, unless\n *     the run-time type check fails. In that case, `unwrap` returns an\n *     innocuous string, or, if assertions are enabled, throws\n *     `goog.asserts.AssertionError`.\n */\ngoog.html.TrustedResourceUrl.unwrap = function(trustedResourceUrl) {\n  return goog.html.TrustedResourceUrl.unwrapTrustedScriptURL(trustedResourceUrl)\n      .toString();\n};\n\n\n/**\n * Unwraps value as TrustedScriptURL if supported or as a string if not.\n * @param {!goog.html.TrustedResourceUrl} trustedResourceUrl\n * @return {!TrustedScriptURL|string}\n * @see goog.html.TrustedResourceUrl.unwrap\n */\ngoog.html.TrustedResourceUrl.unwrapTrustedScriptURL = function(\n    trustedResourceUrl) {\n  // Perform additional Run-time type-checking to ensure that\n  // trustedResourceUrl is indeed an instance of the expected type.  This\n  // provides some additional protection against security bugs due to\n  // application code that disables type checks.\n  // Specifically, the following checks are performed:\n  // 1. The object is an instance of the expected type.\n  // 2. The object is not an instance of a subclass.\n  // 3. The object carries a type marker for the expected type. \"Faking\" an\n  // object requires a reference to the type marker, which has names intended\n  // to stand out in code reviews.\n  if (trustedResourceUrl instanceof goog.html.TrustedResourceUrl &&\n      trustedResourceUrl.constructor === goog.html.TrustedResourceUrl &&\n      trustedResourceUrl\n              .TRUSTED_RESOURCE_URL_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===\n          goog.html.TrustedResourceUrl\n              .TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {\n    return trustedResourceUrl\n        .privateDoNotAccessOrElseTrustedResourceUrlWrappedValue_;\n  } else {\n    goog.asserts.fail('expected object of type TrustedResourceUrl, got \\'' +\n        trustedResourceUrl + '\\' of type ' + goog.typeOf(trustedResourceUrl));\n    return 'type_error:TrustedResourceUrl';\n  }\n};\n\n\n/**\n * Creates a TrustedResourceUrl from a format string and arguments.\n *\n * The arguments for interpolation into the format string map labels to values.\n * Values of type `goog.string.Const` are interpolated without modifcation.\n * Values of other types are cast to string and encoded with\n * encodeURIComponent.\n *\n * `%{<label>}` markers are used in the format string to indicate locations\n * to be interpolated with the valued mapped to the given label. `<label>`\n * must contain only alphanumeric and `_` characters.\n *\n * The format string must match goog.html.TrustedResourceUrl.BASE_URL_.\n *\n * Example usage:\n *\n *    var url = goog.html.TrustedResourceUrl.format(goog.string.Const.from(\n *        'https://www.google.com/search?q=%{query}'), {'query': searchTerm});\n *\n *    var url = goog.html.TrustedResourceUrl.format(goog.string.Const.from(\n *        '//www.youtube.com/v/%{videoId}?hl=en&fs=1%{autoplay}'), {\n *        'videoId': videoId,\n *        'autoplay': opt_autoplay ?\n *            goog.string.Const.from('&autoplay=1') : goog.string.Const.EMPTY\n *    });\n *\n * While this function can be used to create a TrustedResourceUrl from only\n * constants, fromConstant() and fromConstants() are generally preferable for\n * that purpose.\n *\n * @param {!goog.string.Const} format The format string.\n * @param {!Object<string, (string|number|!goog.string.Const)>} args Mapping\n *     of labels to values to be interpolated into the format string.\n *     goog.string.Const values are interpolated without encoding.\n * @return {!goog.html.TrustedResourceUrl}\n * @throws {!Error} On an invalid format string or if a label used in the\n *     the format string is not present in args.\n */\ngoog.html.TrustedResourceUrl.format = function(format, args) {\n  var formatStr = goog.string.Const.unwrap(format);\n  if (!goog.html.TrustedResourceUrl.BASE_URL_.test(formatStr)) {\n    throw new Error('Invalid TrustedResourceUrl format: ' + formatStr);\n  }\n  var result = formatStr.replace(\n      goog.html.TrustedResourceUrl.FORMAT_MARKER_, function(match, id) {\n        if (!Object.prototype.hasOwnProperty.call(args, id)) {\n          throw new Error(\n              'Found marker, \"' + id + '\", in format string, \"' + formatStr +\n              '\", but no valid label mapping found ' +\n              'in args: ' + JSON.stringify(args));\n        }\n        var arg = args[id];\n        if (arg instanceof goog.string.Const) {\n          return goog.string.Const.unwrap(arg);\n        } else {\n          return encodeURIComponent(String(arg));\n        }\n      });\n  return goog.html.TrustedResourceUrl\n      .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(result);\n};\n\n\n/**\n * @private @const {!RegExp}\n */\ngoog.html.TrustedResourceUrl.FORMAT_MARKER_ = /%{(\\w+)}/g;\n\n\n/**\n * The URL must be absolute, scheme-relative or path-absolute. So it must\n * start with:\n * - https:// followed by allowed origin characters.\n * - // followed by allowed origin characters.\n * - Any absolute or relative path.\n *\n * Based on\n * https://url.spec.whatwg.org/commit-snapshots/56b74ce7cca8883eab62e9a12666e2fac665d03d/#url-parsing\n * an initial / which is not followed by another / or \\ will end up in the \"path\n * state\" and from there it can only go to \"fragment state\" and \"query state\".\n *\n * We don't enforce a well-formed domain name. So '.' or '1.2' are valid.\n * That's ok because the origin comes from a compile-time constant.\n *\n * A regular expression is used instead of goog.uri for several reasons:\n * - Strictness. E.g. we don't want any userinfo component and we don't\n *   want '/./, nor \\' in the first path component.\n * - Small trusted base. goog.uri is generic and might need to change,\n *   reasoning about all the ways it can parse a URL now and in the future\n *   is error-prone.\n * - Code size. We expect many calls to .format(), many of which might\n *   not be using goog.uri.\n * - Simplicity. Using goog.uri would likely not result in simpler nor shorter\n *   code.\n * @private @const {!RegExp}\n */\ngoog.html.TrustedResourceUrl.BASE_URL_ = new RegExp(\n    '^((https:)?//[0-9a-z.:[\\\\]-]+/'  // Origin.\n        + '|/[^/\\\\\\\\]'                // Absolute path.\n        + '|[^:/\\\\\\\\%]+/'             // Relative path.\n        + '|[^:/\\\\\\\\%]*[?#]'          // Query string or fragment.\n        + '|about:blank#'             // about:blank with fragment.\n        + ')',\n    'i');\n\n/**\n * RegExp for splitting a URL into the base, search field, and hash field.\n *\n * @private @const {!RegExp}\n */\ngoog.html.TrustedResourceUrl.URL_PARAM_PARSER_ =\n    /^([^?#]*)(\\?[^#]*)?(#[\\s\\S]*)?/;\n\n\n/**\n * Formats the URL same as TrustedResourceUrl.format and then adds extra URL\n * parameters.\n *\n * Example usage:\n *\n *     // Creates '//www.youtube.com/v/abc?autoplay=1' for videoId='abc' and\n *     // opt_autoplay=1. Creates '//www.youtube.com/v/abc' for videoId='abc'\n *     // and opt_autoplay=undefined.\n *     var url = goog.html.TrustedResourceUrl.formatWithParams(\n *         goog.string.Const.from('//www.youtube.com/v/%{videoId}'),\n *         {'videoId': videoId},\n *         {'autoplay': opt_autoplay});\n *\n * @param {!goog.string.Const} format The format string.\n * @param {!Object<string, (string|number|!goog.string.Const)>} args Mapping\n *     of labels to values to be interpolated into the format string.\n *     goog.string.Const values are interpolated without encoding.\n * @param {string|?Object<string, *>|undefined} searchParams Parameters to add\n *     to URL. See goog.html.TrustedResourceUrl.stringifyParams_ for exact\n *     format definition.\n * @param {(string|?Object<string, *>)=} opt_hashParams Hash parameters to add\n *     to URL. See goog.html.TrustedResourceUrl.stringifyParams_ for exact\n *     format definition.\n * @return {!goog.html.TrustedResourceUrl}\n * @throws {!Error} On an invalid format string or if a label used in the\n *     the format string is not present in args.\n */\ngoog.html.TrustedResourceUrl.formatWithParams = function(\n    format, args, searchParams, opt_hashParams) {\n  var url = goog.html.TrustedResourceUrl.format(format, args);\n  return url.cloneWithParams(searchParams, opt_hashParams);\n};\n\n\n/**\n * Creates a TrustedResourceUrl object from a compile-time constant string.\n *\n * Compile-time constant strings are inherently program-controlled and hence\n * trusted.\n *\n * @param {!goog.string.Const} url A compile-time-constant string from which to\n *     create a TrustedResourceUrl.\n * @return {!goog.html.TrustedResourceUrl} A TrustedResourceUrl object\n *     initialized to `url`.\n */\ngoog.html.TrustedResourceUrl.fromConstant = function(url) {\n  return goog.html.TrustedResourceUrl\n      .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(\n          goog.string.Const.unwrap(url));\n};\n\n\n/**\n * Creates a TrustedResourceUrl object from a compile-time constant strings.\n *\n * Compile-time constant strings are inherently program-controlled and hence\n * trusted.\n *\n * @param {!Array<!goog.string.Const>} parts Compile-time-constant strings from\n *     which to create a TrustedResourceUrl.\n * @return {!goog.html.TrustedResourceUrl} A TrustedResourceUrl object\n *     initialized to concatenation of `parts`.\n */\ngoog.html.TrustedResourceUrl.fromConstants = function(parts) {\n  var unwrapped = '';\n  for (var i = 0; i < parts.length; i++) {\n    unwrapped += goog.string.Const.unwrap(parts[i]);\n  }\n  return goog.html.TrustedResourceUrl\n      .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(unwrapped);\n};\n\n\n/**\n * Type marker for the TrustedResourceUrl type, used to implement additional\n * run-time type checking.\n * @const {!Object}\n * @private\n */\ngoog.html.TrustedResourceUrl.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};\n\n\n/**\n * Package-internal utility method to create TrustedResourceUrl instances.\n *\n * @param {string} url The string to initialize the TrustedResourceUrl object\n *     with.\n * @return {!goog.html.TrustedResourceUrl} The initialized TrustedResourceUrl\n *     object.\n * @package\n */\ngoog.html.TrustedResourceUrl\n    .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse = function(url) {\n  var value = goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY ?\n      goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY\n          .createScriptURL(url) :\n      url;\n  return new goog.html.TrustedResourceUrl(\n      goog.html.TrustedResourceUrl.CONSTRUCTOR_TOKEN_PRIVATE_, value);\n};\n\n\n/**\n * Stringifies the passed params to be used as either a search or hash field of\n * a URL.\n *\n * @param {string} prefix The prefix character for the given field ('?' or '#').\n * @param {string} currentString The existing field value (including the prefix\n *     character, if the field is present).\n * @param {string|?Object<string, *>|undefined} params The params to set or\n *     append to the field.\n * - If `undefined` or `null`, the field remains unchanged.\n * - If a string, then the string will be escaped and the field will be\n *   overwritten with that value.\n * - If an Object, that object is treated as a set of key-value pairs to be\n *   appended to the current field. Note that JavaScript doesn't guarantee the\n *   order of values in an object which might result in non-deterministic order\n *   of the parameters. However, browsers currently preserve the order. The\n *   rules for each entry:\n *   - If an array, it will be processed as if each entry were an additional\n *     parameter with exactly the same key, following the same logic below.\n *   - If `undefined` or `null`, it will be skipped.\n *   - Otherwise, it will be turned into a string, escaped, and appended.\n * @return {string}\n * @private\n */\ngoog.html.TrustedResourceUrl.stringifyParams_ = function(\n    prefix, currentString, params) {\n  if (params == null) {\n    // Do not modify the field.\n    return currentString;\n  }\n  if (typeof params === 'string') {\n    // Set field to the passed string.\n    return params ? prefix + encodeURIComponent(params) : '';\n  }\n  // Add on parameters to field from key-value object.\n  for (var key in params) {\n    var value = params[key];\n    var outputValues = goog.isArray(value) ? value : [value];\n    for (var i = 0; i < outputValues.length; i++) {\n      var outputValue = outputValues[i];\n      if (outputValue != null) {\n        if (!currentString) {\n          currentString = prefix;\n        }\n        currentString += (currentString.length > prefix.length ? '&' : '') +\n            encodeURIComponent(key) + '=' +\n            encodeURIComponent(String(outputValue));\n      }\n    }\n  }\n  return currentString;\n};\n\n/**\n * Token used to ensure that object is created only from this file. No code\n * outside of this file can access this token.\n * @private {!Object}\n * @const\n */\ngoog.html.TrustedResourceUrl.CONSTRUCTOR_TOKEN_PRIVATE_ = {};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^GS","^9>","^=M","^GT","^GY","^GZ"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/trustedresourceurl.js"],"^:1",["^9K",["^=I"]],"^9<",true,"^9=",["^9>","^:E","^GZ","^GT","^GY","^=M","^GS"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.i18n.dateintervalsymbols.js","^9C",["^9D","goog/i18n/dateintervalsymbols.js"],"^9E","goog/i18n/dateintervalsymbols.js","^9F","^9G","^9H","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Date interval formatting symbols for all locales.\n *\n * File generated from CLDR ver. 35.1\n *\n * To reduce the file size (which may cause issues in some JS\n * developing environments), this file will only contain locales\n * that are frequently used by web applications. This is defined as\n * proto/closure_locales_data.txt and will change (most likely addition)\n * over time.  Rest of the data can be found in another file named\n * \"dateintervalsymbolsext.js\", which will be generated at\n * the same time together with this file.\n */\n\n// clang-format off\n\ngoog.module('goog.i18n.dateIntervalSymbols');\n\n/**\n * Map containing the interval pattern for every calendar field.\n * @typedef {!Object<string, string>}\n */\nlet DateIntervalPatternMap;\n\n/** @typedef {!DateIntervalPatternMap} */\nexports.DateIntervalPatternMap;\n\n/**\n * Collection of date interval symbols.\n * @typedef {{\n *   FULL_DATE: !DateIntervalPatternMap,\n *   LONG_DATE: !DateIntervalPatternMap,\n *   MEDIUM_DATE: !DateIntervalPatternMap,\n *   SHORT_DATE: !DateIntervalPatternMap,\n *   FULL_TIME: !DateIntervalPatternMap,\n *   LONG_TIME: !DateIntervalPatternMap,\n *   MEDIUM_TIME: !DateIntervalPatternMap,\n *   SHORT_TIME: !DateIntervalPatternMap,\n *   FULL_DATETIME: !DateIntervalPatternMap,\n *   LONG_DATETIME: !DateIntervalPatternMap,\n *   MEDIUM_DATETIME: !DateIntervalPatternMap,\n *   SHORT_DATETIME: !DateIntervalPatternMap,\n *   FALLBACK: string\n * }}\n */\nlet DateIntervalSymbols;\n\n/** @typedef {!DateIntervalSymbols} */\nexports.DateIntervalSymbols;\n\n/** @type {!DateIntervalSymbols} */\nlet defaultSymbols;\n\n/**\n * Returns the default DateIntervalSymbols.\n * @return {!DateIntervalSymbols}\n */\nexports.getDateIntervalSymbols = function() {\n  return defaultSymbols;\n};\n\n/**\n * Sets the default DateIntervalSymbols.\n * @param {!DateIntervalSymbols} symbols\n */\nexports.setDateIntervalSymbols = function(symbols) {\n  defaultSymbols = symbols;\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_af = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G – EEEE d MMMM y G',\n    'Md': 'EEEE d MMMM – EEEE d MMMM y',\n    'y': 'EEEE d MMMM y – EEEE d MMMM y',\n    '_': 'EEEE dd MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'y-M-d GGGGG – y-M-d GGGGG',\n    'Mdy': 'd/M/y – d/M/y',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE dd MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_am = {\n  FULL_DATE: {\n    'G': 'G EEEE፣ MMMM d፣ y – G EEEE፣ MMMM d፣ y',\n    'Md': 'EEEE MMMM d – EEEE MMMM d፣ y',\n    'y': 'EEEE፣ MMMM d፣ y – EEEE፣ MMMM d፣ y',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G MMMM d፣ y – G MMMM d፣ y',\n    'M': 'MMMM d – MMMM d፣ y',\n    'd': 'MMMM d–d፣ y',\n    'y': 'MMMM d፣ y – MMMM d፣ y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G MMM d፣ y – G MMM d፣ y',\n    'M': 'MMM d – MMM d፣ y',\n    'd': 'MMM d–d፣ y',\n    'y': 'MMM d፣ y – MMM d፣ y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG d/M/y – GGGGG d/M/y',\n    'Mdy': 'd/M/y – d/M/y',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y h:mm a – h:mm a',\n    'hm': 'dd/MM/y h:mm – h:mm a',\n    '_': 'dd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE، d MMMM – EEEE، d MMMM، y',\n    'd': 'EEEE، d – EEEE، d MMMM، y',\n    'y': 'EEEE، d MMMM، y – EEEE، d MMMM، y',\n    '_': 'EEEE، d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM، y',\n    'd': 'd–d MMMM، y',\n    'y': 'd MMMM، y – d MMMM، y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd‏/M‏/y – d‏/M‏/y',\n    '_': 'dd‏/MM‏/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'd‏/M‏/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd‏/M‏/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd‏/M‏/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd‏/M‏/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd‏/M‏/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE، d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd‏/MM‏/y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd‏/M‏/y h:mm a – h:mm a',\n    'hm': 'd‏/M‏/y h:mm–h:mm a',\n    '_': 'd‏/M‏/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_DZ = exports.DateIntervalSymbols_ar;\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_EG = exports.DateIntervalSymbols_ar;\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_az = {\n  FULL_DATE: {\n    'G': 'G d MMMM y, EEEE – d MMMM y, EEEE',\n    'Md': 'd MMMM y, EEEE – d MMMM, EEEE',\n    '_': 'd MMMM y, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G d MMMM y – G d MMMM y',\n    'M': 'd MMMM y – d MMMM',\n    'd': 'y MMMM d–d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G d MMM y – G d MMM y',\n    'M': 'd MMM y – d MMM',\n    'd': 'y MMM d–d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd.MM.yy – GGGGG dd.MM.yy',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'd MMMM y, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy HH:mm–HH:mm',\n    '_': 'dd.MM.yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_be = {\n  FULL_DATE: {\n    'G': 'EEEE, d MMMM, y G – EEEE, d MMMM, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y \\'г\\'.'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM, y G – d MMMM, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM y \\'г\\'.'\n  },\n  MEDIUM_DATE: {\n    'G': 'd.M.y GGGGG – d.M.y GGGGG',\n    'Mdy': 'd.M.y – d.M.y',\n    '_': 'd.MM.y'\n  },\n  SHORT_DATE: {\n    'G': 'd.M.yy GGGGG – d.M.yy GGGGG',\n    'Mdy': 'd.M.yy – d.M.yy',\n    '_': 'd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss, zzzz',\n    '_': 'HH:mm:ss, zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss, z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y, HH:mm',\n    'ahm': 'HH.mm–HH.mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'г\\'. \\'у\\' HH:mm:ss, zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'г\\'. \\'у\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd.MM.y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.MM.yy, HH.mm–HH.mm',\n    '_': 'd.MM.yy, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_bg = {\n  FULL_DATE: {\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM y \\'г\\'.',\n    '_': 'EEEE, d MMMM y \\'г\\'.'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM y \\'г\\'.',\n    'd': 'd – d MMMM y \\'г\\'.',\n    '_': 'd MMMM y \\'г\\'.'\n  },\n  MEDIUM_DATE: {\n    'G': 'dd.MM.y GGGGG – dd.MM.y GGGGG',\n    'Md': 'd.MM – d.MM.y \\'г\\'.',\n    '_': 'd.MM.y \\'г\\'.'\n  },\n  SHORT_DATE: {\n    'G': 'dd.MM.yy GGGGG – dd.MM.yy GGGGG',\n    'Md': 'd.MM – d.MM.yy \\'г\\'.',\n    '_': 'd.MM.yy \\'г\\'.'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.MM.y \\'г\\'., H:mm:ss \\'ч\\'. zzzz',\n    '_': 'H:mm:ss \\'ч\\'. zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.MM.y \\'г\\'., H:mm:ss \\'ч\\'. z',\n    '_': 'H:mm:ss \\'ч\\'. z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.MM.y \\'г\\'., H:mm:ss \\'ч\\'.',\n    '_': 'H:mm:ss \\'ч\\'.'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.MM.y \\'г\\'., H:mm \\'ч\\'.',\n    '_': 'H:mm \\'ч\\'.'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'г\\'., H:mm:ss \\'ч\\'. zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'г\\'., H:mm:ss \\'ч\\'. z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd.MM.y \\'г\\'., H:mm:ss \\'ч\\'.'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.MM.yy \\'г\\'., H:mm \\'ч\\'. – H:mm \\'ч\\'.',\n    '_': 'd.MM.yy \\'г\\'., H:mm \\'ч\\'.'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_bn = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM, y',\n    '_': 'EEEE, d MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM, y',\n    'd': 'd–d MMMM, y',\n    '_': 'd MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd–d MMM, y',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM, y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy h:mm a – h:mm a',\n    'hm': 'd/M/yy h:mm–h:mm a',\n    '_': 'd/M/yy h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_br = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE d MMMM – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'da\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'da\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_bs = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, d. MMMM – EEEE, d. MMMM y.',\n    'd': 'EEEE, d. – EEEE, d. MMMM y.',\n    'y': 'EEEE, d. MMMM y. – EEEE, d. MMMM y.',\n    '_': 'EEEE, d. MMMM y.'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd. MMMM – d. MMMM y.',\n    'd': 'd. – d. MMMM y.',\n    'y': 'd. MMMM y. – d. MMMM y.',\n    '_': 'd. MMMM y.'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd. MMM – d. MMM y.',\n    'd': 'd. – d. MMM y.',\n    'y': 'd. MMM y. – d. MMM y.',\n    '_': 'd. MMM y.'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd.M.y. – d.M.y.',\n    '_': 'd. M. y.'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y. HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y. HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y. HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y. HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d. MMMM y. \\'u\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y. \\'u\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd. MMM y. HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.M.y. HH:mm – HH:mm',\n    '_': 'd. M. y. HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ca = {\n  FULL_DATE: {\n    'M': 'EEEE, d MMMM – EEEE, d MMMM \\'de\\' y',\n    'd': 'EEEE, d – EEEE, d MMMM \\'de\\' y',\n    'y': 'EEEE, d MMMM \\'de\\' y – EEEE, d MMMM \\'de\\' y',\n    '_': 'EEEE, d MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM, y G – d MMMM, y G',\n    'M': 'd MMMM – d MMMM \\'de\\' y',\n    'd': 'd–d MMMM \\'de\\' y',\n    'y': 'd MMMM \\'de\\' y – d MMMM \\'de\\' y',\n    '_': 'd MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM, y G – d MMM, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/yy GGGGG – d/M/yy GGGGG',\n    'Mdy': 'd/M/yy – d/M/yy',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, H:mm:ss zzzz',\n    '_': 'H:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, H:mm:ss z',\n    '_': 'H:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, H:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM \\'de\\' y \\'a\\' \\'les\\' H:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM \\'de\\' y \\'a\\' \\'les\\' H:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy, H:mm–H:mm',\n    '_': 'd/M/yy H:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_chr = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'Md': 'EEEE, MMMM d – EEEE, MMMM d, y',\n    '_': 'EEEE, MMMM d, y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'MMMM d – MMMM d, y',\n    'd': 'MMMM d – d, y',\n    '_': 'MMMM d, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'MMM d – MMM d, y',\n    'd': 'MMM d – d, y',\n    '_': 'MMM d, y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    '_': 'M/d/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM d, y ᎤᎾᎢ h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'MMMM d, y ᎤᎾᎢ h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MMM d, y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'M/d/yy, h:mm a – h:mm a',\n    'hm': 'M/d/yy, h:mm – h:mm a',\n    '_': 'M/d/yy, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_cs = {\n  FULL_DATE: {\n    'G': 'EEEE d. M. y G – EEEE d. M. y G',\n    'Md': 'EEEE d. M. – EEEE d. M. y',\n    'y': 'EEEE d. M. y – EEEE d. M. y',\n    '_': 'EEEE d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd. M. y G – d. M. y G',\n    'M': 'd. M. – d. M. y',\n    'd': 'd.–d. M. y',\n    'y': 'd. M. y – d. M. y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd. M. y GGGGG – d. M. y GGGGG',\n    'Mdy': 'dd.MM.y – dd.MM.y',\n    '_': 'd. M. y'\n  },\n  SHORT_DATE: {\n    'G': 'd. M. yy GGGGG – d. M. yy GGGGG',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd. M. y H:mm:ss zzzz',\n    '_': 'H:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd. M. y H:mm:ss z',\n    '_': 'H:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd. M. y H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd. M. y H:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d. MMMM y H:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y H:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd. M. y H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd. MM. yy H:mm–H:mm',\n    '_': 'dd.MM.yy H:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_cy = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    'y': 'd MMMM, y – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM, y – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'd/M/yy – d/M/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'am\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'am\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy HH:mm – HH:mm',\n    '_': 'dd/MM/yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_da = {\n  FULL_DATE: {\n    'G': 'G EEEE d. MMMM y–G EEEE d. MMMM y',\n    'M': 'EEEE d. MMMM–EEEE d. MMMM y',\n    'd': 'EEEE d.–EEEE d. MMMM y',\n    'y': 'EEEE d. MMMM y–EEEE d. MMMM y',\n    '_': 'EEEE \\'den\\' d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G d. MMMM y–G d. MMMM y',\n    'M': 'd. MMMM–d. MMMM y',\n    'd': 'd.–d. MMMM y',\n    'y': 'd. MMMM y–d. MMMM y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G d. MMM y–G d. MMM y',\n    'M': 'd. MMM–d. MMM y',\n    'd': 'd.–d. MMM y',\n    'y': 'd. MMM y–d. MMM y',\n    '_': 'd. MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd.MM.y–GGGGG dd.MM.y',\n    'Mdy': 'dd.MM.y–dd.MM.y',\n    '_': 'dd.MM.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y HH.mm.ss zzzz',\n    '_': 'HH.mm.ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y HH.mm.ss z',\n    '_': 'HH.mm.ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y HH.mm.ss',\n    '_': 'HH.mm.ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y HH.mm',\n    'ahm': 'HH.mm–HH.mm',\n    '_': 'HH.mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE \\'den\\' d. MMMM y \\'kl\\'. HH.mm.ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y \\'kl\\'. HH.mm.ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd. MMM y HH.mm.ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.y HH.mm–HH.mm',\n    '_': 'dd.MM.y HH.mm'\n  },\n  FALLBACK: '{0}-{1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_de = {\n  FULL_DATE: {\n    'G': 'EEEE, d. MMMM y G – EEEE EEEE, d. MMMM y G',\n    'M': 'EEEE, d. MMMM – EEEE, d. MMMM y',\n    'd': 'EEEE, d. – EEEE, d. MMMM y',\n    '_': 'EEEE, d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd. MMMM y G – d. MMMM y G',\n    'M': 'd. MMMM – d. MMMM y',\n    'd': 'd.–d. MMMM y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'dd.MM.y GGGGG – dd.MM.y GGGGG',\n    'M': 'dd.MM. – dd.MM.y',\n    'd': 'dd.–dd.MM.y',\n    '_': 'dd.MM.y'\n  },\n  SHORT_DATE: {\n    'G': 'dd.MM.yy GGGGG – dd.MM.yy GGGGG',\n    'M': 'dd.MM. – dd.MM.yy',\n    'd': 'dd.–dd.MM.yy',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y, HH:mm',\n    'ahm': 'HH:mm–HH:mm \\'Uhr\\'',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d. MMMM y \\'um\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y \\'um\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd.MM.y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy, HH:mm–HH:mm \\'Uhr\\'',\n    '_': 'dd.MM.yy, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_de_AT = exports.DateIntervalSymbols_de;\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_de_CH = exports.DateIntervalSymbols_de;\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_el = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G – EEEE d MMMM y G',\n    'Md': 'EEEE, dd MMMM – EEEE, dd MMMM y',\n    'y': 'EEEE, dd MMMM y – EEEE, dd MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'dd MMMM – dd MMMM y',\n    'd': 'dd–dd MMMM y',\n    'y': 'dd MMMM y – dd MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'dd MMM – dd MMM y',\n    'd': 'dd–dd MMM y',\n    'y': 'dd MMM y – dd MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd-MM-yy GGGGG – dd-MM-yy GGGGG',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, h:mm a',\n    'a': 'h:mm a – h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y - h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y - h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy, h:mm a – h:mm a',\n    'hm': 'd/M/yy, h:mm–h:mm a',\n    '_': 'd/M/yy, h:mm a'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_en = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'Md': 'EEEE, MMMM d – EEEE, MMMM d, y',\n    '_': 'EEEE, MMMM d, y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'MMMM d – MMMM d, y',\n    'd': 'MMMM d – d, y',\n    '_': 'MMMM d, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'MMM d – MMM d, y',\n    'd': 'MMM d – d, y',\n    '_': 'MMM d, y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    '_': 'M/d/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM d, y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'MMMM d, y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MMM d, y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'M/d/yy, h:mm a – h:mm a',\n    'hm': 'M/d/yy, h:mm – h:mm a',\n    '_': 'M/d/yy, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_AU = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy, h:mm a – h:mm a',\n    'hm': 'd/M/yy, h:mm – h:mm a',\n    '_': 'd/M/yy, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_CA = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'Md': 'EEEE, MMMM d – EEEE, MMMM d, y',\n    '_': 'EEEE, MMMM d, y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'MMMM d – MMMM d, y',\n    'd': 'MMMM d – d, y',\n    '_': 'MMMM d, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'MMM d – MMM d, y',\n    'd': 'MMM d – d, y',\n    '_': 'MMM d, y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM d, y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'MMMM d, y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MMM d, y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'y-MM-dd, h:mm a – h:mm a',\n    'hm': 'y-MM-dd, h:mm – h:mm a',\n    '_': 'y-MM-dd, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_GB = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm–HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_IE = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_IN = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd-MMM-y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM, y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd-MMM-y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/yy, h:mm a – h:mm a',\n    'hm': 'dd/MM/yy, h:mm – h:mm a',\n    '_': 'dd/MM/yy, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_SG = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy, h:mm a – h:mm a',\n    'hm': 'd/M/yy, h:mm – h:mm a',\n    '_': 'd/M/yy, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_US = exports.DateIntervalSymbols_en;\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_ZA = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE, dd MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'y/MM/dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y/MM/dd, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y/MM/dd, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y/MM/dd, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y/MM/dd, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y/MM/dd, HH:mm – HH:mm',\n    '_': 'y/MM/dd, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_es = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d y G – MMMM d y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d y G – MMM d y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'yy-MM-dd GGGGG – yy-MM-dd GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y H:mm:ss (zzzz)',\n    '_': 'H:mm:ss (zzzz)'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y H:mm:ss (z)',\n    '_': 'H:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y H:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, H:mm:ss (zzzz)'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, H:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy H:mm–H:mm',\n    '_': 'd/M/yy H:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_419 = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy H:mm–H:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_ES = exports.DateIntervalSymbols_es;\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_MX = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd \\'de\\' MMMM \\'de\\' y G – d \\'de\\' MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd \\'de\\' MMM \\'de\\' y G – d \\'de\\' MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM y',\n    'd': 'd–d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    'Mdy': 'd/M/yy – d/M/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y H:mm:ss zzzz',\n    '_': 'H:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y H:mm:ss z',\n    '_': 'H:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y H:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, H:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, H:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy HH:mm–HH:mm',\n    '_': 'dd/MM/yy H:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_US = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM y',\n    'd': 'd–d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/y GGGGG – dd/MM/y GGGGG',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'a': 'h:mm a – h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/y h:mm a – h:mm a',\n    'hm': 'd/M/y h:mm–h:mm a',\n    '_': 'd/M/y h:mm a'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_et = {\n  FULL_DATE: {\n    'G': 'EEEE, d. MMMM y G – EEEE, d. MMMM y G',\n    'Md': 'EEEE, d. MMMM – EEEE, d. MMMM y',\n    '_': 'EEEE, d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd. MMMM y G – d. MMMM y G',\n    'M': 'd. MMMM – d. MMMM y',\n    'd': 'd.–d. MMMM y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd. MMM y G – d. MMM y G',\n    'M': 'd. MMM – d. MMM y',\n    'd': 'd.–d. MMM y',\n    '_': 'd. MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'dd.MM.yy–dd.MM.yy',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d. MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd. MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy HH:mm–HH:mm',\n    '_': 'dd.MM.yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_eu = {\n  FULL_DATE: {\n    'G': 'G y, MMMM d, EEEE – G y, MMMM d, EEEE',\n    'M': 'y(\\'e\\')\\'ko\\' MMMM d, EEEE – MMMM d, EEEE',\n    'dy': 'y(\\'e\\')\\'ko\\' MMMM d, EEEE – y(\\'e\\')\\'ko\\' MMMM d, EEEE',\n    '_': 'y(\\'e\\')\\'ko\\' MMMM\\'ren\\' d(\\'a\\'), EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y, MMMM d – G y, MMMM d',\n    'M': 'y(\\'e\\')\\'ko\\' MMMM d – MMMM d',\n    'd': 'y(\\'e\\')\\'ko\\' MMMM d–d',\n    'y': 'y(\\'e\\')\\'ko\\' MMMM d – y(\\'e\\')\\'ko\\' MMMM d',\n    '_': 'y(\\'e\\')\\'ko\\' MMMM\\'ren\\' d(\\'a\\')'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y, MMM d – G y, MMM d',\n    'M': 'y(\\'e\\')\\'ko\\' MMM d – MMM d',\n    'd': 'y(\\'e\\')\\'ko\\' MMM d–d',\n    'y': 'y(\\'e\\')\\'ko\\' MMM d – y(\\'e\\')\\'ko\\' MMM d',\n    '_': 'y(\\'e\\')\\'ko\\' MMM d(\\'a\\')'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'yy/M/d'\n  },\n  FULL_TIME: {\n    'Mdy': 'y/M/d HH:mm:ss (zzzz)',\n    '_': 'HH:mm:ss (zzzz)'\n  },\n  LONG_TIME: {\n    'Mdy': 'y/M/d HH:mm:ss (z)',\n    '_': 'HH:mm:ss (z)'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y/M/d HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y/M/d HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y(\\'e\\')\\'ko\\' MMMM\\'ren\\' d(\\'a\\'), EEEE HH:mm:ss (zzzz)'\n  },\n  LONG_DATETIME: {\n    '_': 'y(\\'e\\')\\'ko\\' MMMM\\'ren\\' d(\\'a\\') HH:mm:ss (z)'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y(\\'e\\')\\'ko\\' MMM d(\\'a\\') HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'yy/M/d HH:mm–HH:mm',\n    '_': 'yy/M/d HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_fa = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE d LLLL تا EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd LLLL تا d MMMM y',\n    'd': 'd تا d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd LLL تا d MMM y',\n    'd': 'd تا d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y/M/d'\n  },\n  FULL_TIME: {\n    'Mdy': 'y/M/d،‏ H:mm:ss (zzzz)',\n    '_': 'H:mm:ss (zzzz)'\n  },\n  LONG_TIME: {\n    'Mdy': 'y/M/d،‏ H:mm:ss (z)',\n    '_': 'H:mm:ss (z)'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y/M/d،‏ H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y/M/d،‏ H:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y، ساعت H:mm:ss (zzzz)'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y، ساعت H:mm:ss (z)'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y،‏ H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y/M/d،‏ H:mm تا H:mm',\n    '_': 'y/M/d،‏ H:mm'\n  },\n  FALLBACK: '{0} تا {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_fi = {\n  FULL_DATE: {\n    '_': 'cccc d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd.–d. MMMM, y G',\n    'M': 'd. MMMM – d. MMMM y',\n    'd': 'd.–d. MMMM y',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd.M.y GGGGG – d.M.y GGGGG',\n    'M': 'd.M.–d.M.y',\n    'd': 'd.–d.M.y',\n    '_': 'd.M.y'\n  },\n  SHORT_DATE: {\n    'G': 'd.M.y GGGGG – d.M.y GGGGG',\n    'M': 'd.M.–d.M.y',\n    'd': 'd.–d.M.y',\n    '_': 'd.M.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y \\'klo\\' H.mm.ss zzzz',\n    '_': 'H.mm.ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y \\'klo\\' H.mm.ss z',\n    '_': 'H.mm.ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y \\'klo\\' H.mm.ss',\n    '_': 'H.mm.ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y \\'klo\\' H.mm',\n    '_': 'H.mm'\n  },\n  FULL_DATETIME: {\n    '_': 'cccc d. MMMM y \\'klo\\' H.mm.ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y \\'klo\\' H.mm.ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd.M.y \\'klo\\' H.mm.ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.M.y \\'klo\\' H.mm–H.mm',\n    '_': 'd.M.y H.mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_fil = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'Md': 'EEEE, MMMM d – EEEE, MMMM d, y',\n    '_': 'EEEE, MMMM d, y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'MMMM d – MMMM d, y',\n    'd': 'MMMM d–d, y',\n    '_': 'MMMM d, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'MMM d – MMM d, y',\n    'd': 'MMM d–d, y',\n    '_': 'MMM d, y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    '_': 'M/d/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y, h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM d, y \\'nang\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'MMMM d, y \\'nang\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MMM d, y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'M/d/yy, h:mm a – h:mm a',\n    'hm': 'M/d/yy, h:mm–h:mm a',\n    '_': 'M/d/yy, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G \\'à\\' EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G \\'à\\' d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G \\'à\\' d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/y G \\'à\\' d/M/y G',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'à\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'à\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y \\'à\\' HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y \\'à\\' HH:mm – HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_CA = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G – EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'yy-MM-dd GGGGG – yy-MM-dd GGGGG',\n    '_': 'yy-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd HH \\'h\\' mm \\'min\\' ss \\'s\\' zzzz',\n    '_': 'HH \\'h\\' mm \\'min\\' ss \\'s\\' zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd HH \\'h\\' mm \\'min\\' ss \\'s\\' z',\n    '_': 'HH \\'h\\' mm \\'min\\' ss \\'s\\' z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH \\'h\\' mm \\'min\\' ss \\'s\\'',\n    '_': 'HH \\'h\\' mm \\'min\\' ss \\'s\\''\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH \\'h\\' mm',\n    'ahm': 'H \\'h\\' mm – H \\'h\\' mm',\n    '_': 'HH \\'h\\' mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'à\\' HH \\'h\\' mm \\'min\\' ss \\'s\\' zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'à\\' HH \\'h\\' mm \\'min\\' ss \\'s\\' z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH \\'h\\' mm \\'min\\' ss \\'s\\''\n  },\n  SHORT_DATETIME: {\n    'ahm': 'yy-MM-dd H \\'h\\' mm – H \\'h\\' mm',\n    '_': 'yy-MM-dd HH \\'h\\' mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ga = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE d MMMM – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm – HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_gl = {\n  FULL_DATE: {\n    'G': 'EEEE, d \\'de\\' MMMM \\'de\\' y G – EEEE, d \\'de\\' MMMM \\'de\\' y G',\n    'M': 'EEEE, d \\'de\\' MMMM – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'd': 'EEEE, d MMMM – EEEE, d MMMM y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd \\'de\\' MMMM \\'de\\' y G – d \\'de\\' MMMM \\'de\\' y G',\n    'M': 'd MMMM – d MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd \\'de\\' MMM \\'de\\' y G – d \\'de\\' MMM \\'de\\' y G',\n    'M': 'd MMM – d MMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd \\'de\\' MMM \\'de\\' y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    'Md': 'd/M/yy – d/M/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'HH:mm:ss zzzz, d/M/y',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'HH:mm:ss z, d/M/y',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'HH:mm:ss, d/M/y',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'HH:mm, d/M/y',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'HH:mm:ss zzzz \\'do\\' EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATETIME: {\n    '_': 'HH:mm:ss z \\'do\\' d \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'HH:mm:ss, d \\'de\\' MMM \\'de\\' y'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'HH:mm–HH:mm, dd/MM/yy',\n    '_': 'HH:mm, dd/MM/yy'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_gsw = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, d. MMMM – EEEE, d. MMMM y',\n    'd': 'EEEE, d. – EEEE, d. MMMM y',\n    '_': 'EEEE, d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd. MMMM – d. MMMM y',\n    'd': 'd.–d. MMMM y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'dd.MM.y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d. MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd.MM.y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy HH:mm–HH:mm',\n    '_': 'dd.MM.yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_gu = {\n  FULL_DATE: {\n    'G': 'G y d MMMM, EEEE – G y d MMMM, EEEE',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM, y',\n    '_': 'EEEE, d MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'G y d MMMM – G y d MMMM',\n    'M': 'd MMMM – d MMMM, y',\n    'd': 'd–d MMMM, y',\n    '_': 'd MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y d MMM – G y d MMM',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd–d MMM, y',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-dd-MM – GGGGG yy-dd-MM',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y hh:mm:ss a zzzz',\n    '_': 'hh:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y hh:mm:ss a z',\n    '_': 'hh:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y hh:mm:ss a',\n    '_': 'hh:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y hh:mm a',\n    'a': 'h:mm a – h:mm a',\n    'h': 'h:mm – h:mm a',\n    'm': 'h:mm–h:mm a',\n    '_': 'hh:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM, y એ hh:mm:ss a zzzz વાગ્યે'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y એ hh:mm:ss a z વાગ્યે'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y hh:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy h:mm a – h:mm a',\n    'h': 'd/M/yy h:mm – h:mm a',\n    'm': 'd/M/yy h:mm–h:mm a',\n    '_': 'd/M/yy hh:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_haw = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy h:mm a – h:mm a',\n    'hm': 'd/M/yy h:mm–h:mm a',\n    '_': 'd/M/yy h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_he = {\n  FULL_DATE: {\n    'G': 'EEEE, d בMMMM y G – EEEE, d בMMMM y G',\n    'Md': 'EEEE d MMMM – EEEE d MMMM y',\n    'y': 'EEEE d MMMM y – EEEE d MMMM y',\n    '_': 'EEEE, d בMMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd בMMMM y G – d בMMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d בMMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd בMMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd בMMM y G – d בMMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d בMMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd בMMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd.M.y GGGGG – d.M.y GGGGG',\n    'd': 'dd.M.y – dd.M.y',\n    '_': 'd.M.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y, H:mm:ss zzzz',\n    '_': 'H:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y, H:mm:ss z',\n    '_': 'H:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y, H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y, H:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d בMMMM y בשעה H:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd בMMMM y בשעה H:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd בMMM y, H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.M.y, H:mm–H:mm',\n    '_': 'd.M.y, H:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_hi = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y को h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y को h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy, h:mm a – h:mm a',\n    'hm': 'd/M/yy, h:mm–h:mm a',\n    '_': 'd/M/yy, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_hr = {\n  FULL_DATE: {\n    'G': 'EEEE, dd. MMMM y. G – EEEE, dd. MMMM y. G',\n    'M': 'EEEE, dd. MMMM – EEEE, dd. MMMM y.',\n    'd': 'EEEE, dd. – EEEE, dd. MMMM y.',\n    'y': 'EEEE, dd. MMMM y. – EEEE, dd. MMMM y.',\n    '_': 'EEEE, d. MMMM y.'\n  },\n  LONG_DATE: {\n    'G': 'dd. MMMM y. G – dd. MMMM y. G',\n    'M': 'dd. MMMM – dd. MMMM y.',\n    'd': 'dd. – dd. MMMM y.',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'd. MMMM y.'\n  },\n  MEDIUM_DATE: {\n    'G': 'dd. MMM y. G – dd. MMM y. G',\n    'M': 'dd. MMM – dd. MMM y.',\n    'd': 'dd. – dd. MMM y.',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'd. MMM y.'\n  },\n  SHORT_DATE: {\n    'G': 'dd. MM. y. GGGGG – dd. MM. y. GGGGG',\n    '_': 'dd. MM. y.'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd. MM. y. HH:mm:ss (zzzz)',\n    '_': 'HH:mm:ss (zzzz)'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd. MM. y. HH:mm:ss (z)',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd. MM. y. HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd. MM. y. HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d. MMMM y. \\'u\\' HH:mm:ss (zzzz)'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y. \\'u\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd. MMM y. HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd. MM. y. HH:mm – HH:mm',\n    '_': 'dd. MM. y. HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_hu = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'y. MMMM d., EEEE – MMMM d., EEEE',\n    'd': 'y. MMMM d., EEEE – d., EEEE',\n    '_': 'y. MMMM d., EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y. MMMM d. – MMMM d.',\n    'd': 'y. MMMM d–d.',\n    '_': 'y. MMMM d.'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y. MMM d. – MMM d.',\n    'd': 'y. MMM d–d.',\n    '_': 'y. MMM d.'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'M': 'y. MM. dd. – MM. dd.',\n    'd': 'y. MM. dd–dd.',\n    '_': 'y. MM. dd.'\n  },\n  FULL_TIME: {\n    'Mdy': 'y. MM. dd. H:mm:ss zzzz',\n    '_': 'H:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y. MM. dd. H:mm:ss z',\n    '_': 'H:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y. MM. dd. H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y. MM. dd. H:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y. MMMM d., EEEE H:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y. MMMM d. H:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y. MMM d. H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y. MM. dd. H:mm–H:mm',\n    '_': 'y. MM. dd. H:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_hy = {\n  FULL_DATE: {\n    'G': 'G EEEE, d MMMM – G EEEE, d MMMM, y թ.',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM, y թ.',\n    'y': 'EEEE, d MMMM, y – EEEE, d MMMM, y թ.',\n    '_': 'y թ. MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G dd MMMM, y թ․ – G dd MMMM, y թ.',\n    'M': 'dd MMMM – dd MMMM, y թ.',\n    'd': 'dd–dd MMMM, y թ.',\n    'y': 'dd MMMM, y թ․ – dd MMMM, y թ.',\n    '_': 'dd MMMM, y թ.'\n  },\n  MEDIUM_DATE: {\n    'G': 'G dd MMM, y թ․ – G dd MMM, y թ.',\n    'M': 'dd MMM – dd MMM, y թ.',\n    'd': 'dd–dd MMM, y թ.',\n    'y': 'dd MMM, y թ․ – dd MMM, y թ.',\n    '_': 'dd MMM, y թ.'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd.MM.yy – GGGGG dd.MM.yy',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y թ. MMMM d, EEEE, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd MMMM, y թ., HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd MMM, y թ., HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy, H:mm–H:mm',\n    '_': 'dd.MM.yy, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_id = {\n  FULL_DATE: {\n    'G': 'EEEE, d MMMM y G – EEEE, d MMMM y G',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE, dd MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/yy GGGGG – d/M/yy GGGGG',\n    'Mdy': 'd/M/yy – d/M/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH.mm.ss zzzz',\n    '_': 'HH.mm.ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH.mm.ss z',\n    '_': 'HH.mm.ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH.mm.ss',\n    '_': 'HH.mm.ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH.mm',\n    'ahm': 'HH.mm–HH.mm',\n    '_': 'HH.mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd MMMM y HH.mm.ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH.mm.ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH.mm.ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy HH.mm–HH.mm',\n    '_': 'dd/MM/yy HH.mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_in = {\n  FULL_DATE: {\n    'G': 'EEEE, d MMMM y G – EEEE, d MMMM y G',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE, dd MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/yy GGGGG – d/M/yy GGGGG',\n    'Mdy': 'd/M/yy – d/M/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH.mm.ss zzzz',\n    '_': 'HH.mm.ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH.mm.ss z',\n    '_': 'HH.mm.ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH.mm.ss',\n    '_': 'HH.mm.ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH.mm',\n    'ahm': 'HH.mm–HH.mm',\n    '_': 'HH.mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd MMMM y HH.mm.ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH.mm.ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH.mm.ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy HH.mm–HH.mm',\n    '_': 'dd/MM/yy HH.mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_is = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, d. MMMM – EEEE, d. MMMM y',\n    'd': 'EEEE, d. – EEEE, d. MMMM y',\n    '_': 'EEEE, d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd. MMMM – d. MMMM y',\n    'd': 'd.–d. MMMM y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd. MMM – d. MMM y',\n    'd': 'd.–d. MMM y',\n    '_': 'd. MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'd.M.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d. MMMM y \\'kl\\'. HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y \\'kl\\'. HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd. MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.M.y, HH:mm–HH:mm',\n    '_': 'd.M.y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_it = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G – EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    'y': 'EEEE d MMMM y – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'dd MMMM – dd MMMM y',\n    'd': 'dd–dd MMMM y',\n    'y': 'dd MMMM y – dd MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'dd MMM – dd MMM y',\n    'd': 'dd–dd MMM y',\n    'y': 'dd MMM y – dd MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/yy GGGGG – d/M/yy GGGGG',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm–HH:mm',\n    '_': 'dd/MM/yy, HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_iw = {\n  FULL_DATE: {\n    'G': 'EEEE, d בMMMM y G – EEEE, d בMMMM y G',\n    'Md': 'EEEE d MMMM – EEEE d MMMM y',\n    'y': 'EEEE d MMMM y – EEEE d MMMM y',\n    '_': 'EEEE, d בMMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd בMMMM y G – d בMMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d בMMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd בMMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd בMMM y G – d בMMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d בMMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd בMMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd.M.y GGGGG – d.M.y GGGGG',\n    'd': 'dd.M.y – dd.M.y',\n    '_': 'd.M.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y, H:mm:ss zzzz',\n    '_': 'H:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y, H:mm:ss z',\n    '_': 'H:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y, H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y, H:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d בMMMM y בשעה H:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd בMMMM y בשעה H:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd בMMM y, H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.M.y, H:mm–H:mm',\n    '_': 'd.M.y, H:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ja = {\n  FULL_DATE: {\n    'G': 'Gy/MM/dd(EEEE)～Gy/MM/dd(EEEE)',\n    'Mdy': 'y/MM/dd(EEEE)～y/MM/dd(EEEE)',\n    '_': 'y年M月d日EEEE'\n  },\n  LONG_DATE: {\n    'G': 'Gy/MM/dd～Gy/MM/dd',\n    'Mdy': 'y/MM/dd～y/MM/dd',\n    '_': 'y年M月d日'\n  },\n  MEDIUM_DATE: {\n    'G': 'Gy/MM/dd～Gy/MM/dd',\n    '_': 'y/MM/dd'\n  },\n  SHORT_DATE: {\n    'G': 'Gy/MM/dd～Gy/MM/dd',\n    '_': 'y/MM/dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y/M/d H時mm分ss秒 zzzz',\n    '_': 'H時mm分ss秒 zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y/M/d H時mm分ss秒 z',\n    '_': 'H:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y/M/d H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y/M/d H:mm',\n    'ahm': 'H時mm分～H時mm分',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y年M月d日EEEE H時mm分ss秒 zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y年M月d日 H:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y/MM/dd H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y/MM/dd H時mm分～H時mm分',\n    '_': 'y/MM/dd H:mm'\n  },\n  FALLBACK: '{0}～{1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ka = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, d MMMM. – EEEE, d MMMM. y',\n    'y': 'EEEE, d MMMM. y – EEEE, d MMMM. y',\n    '_': 'EEEE, dd MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'dd MMMM. – dd MMMM. y',\n    'd': 'd–d MMMM, y',\n    'y': 'dd MMMM. y – d MMMM. y',\n    '_': 'd MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'dd MMM. – dd MMM. y',\n    'd': 'd–d MMM, y',\n    'y': 'dd MMM. y – d MMM. y',\n    '_': 'd MMM. y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd MMMM, y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM. y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy, HH:mm–HH:mm',\n    '_': 'dd.MM.yy, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_kk = {\n  FULL_DATE: {\n    'G': 'G y \\'ж\\'. d MMMM, EEEE – G y \\'ж\\'. d MMMM, EEEE',\n    'M': 'y \\'ж\\'. d MMMM, EEEE – d MMMM, EEEE',\n    'dy': 'y \\'ж\\'. d MMMM, EEEE – y \\'ж\\'. d MMMM, EEEE',\n    '_': 'y \\'ж\\'. d MMMM, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y \\'ж\\'. d MMMM – G y \\'ж\\'. d MMMM',\n    'M': 'y \\'ж\\'. d MMMM – d MMMM',\n    'd': 'y \\'ж\\'. d–d MMMM',\n    'y': 'y \\'ж\\'. d MMMM – y \\'ж\\'. d MMMM',\n    '_': 'y \\'ж\\'. d MMMM'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y \\'ж\\'. d MMM – G y \\'ж\\'. d MMM',\n    'M': 'y \\'ж\\'. d MMM – d MMM',\n    'd': 'y \\'ж\\'. d–d MMM',\n    'y': 'y \\'ж\\'. d MMM – y \\'ж\\'. d MMM',\n    '_': 'y \\'ж\\'. dd MMM'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'dd.MM.yy – dd.MM.yy',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y \\'ж\\'. d MMMM, EEEE, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y \\'ж\\'. d MMMM, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y \\'ж\\'. dd MMM, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy, HH:mm–HH:mm',\n    '_': 'dd.MM.yy, HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_km = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE dd MMMM y – EEEE dd MMMM y',\n    'y': 'EEEE dd-MM-y – EEEE dd MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'd/M/yy – d/M/yy',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, h:mm a',\n    'a': 'h:mm a – h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y នៅ​ម៉ោង h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y នៅ​ម៉ោង h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy, h:mm a – h:mm a',\n    'hm': 'd/M/yy, h:mm – h:mm a',\n    '_': 'd/M/yy, h:mm a'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_kn = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, MMMM d – EEEE, MMMM d, y',\n    'd': 'EEEE, MMMM d – EEEE, MMMM d,y',\n    'y': 'd MMMM, y EEEE – d MMMM, y EEEE',\n    '_': 'EEEE, MMMM d, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM, y',\n    'd': 'MMMM d–d,y',\n    'y': 'd, MMMM, y – d, MMMM, y',\n    '_': 'MMMM d, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y',\n    'd': 'MMM d–d,y',\n    'y': 'd, MMM, y – d, MMM, y',\n    '_': 'MMM d, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'M/d/yy – M/d/yy',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y hh:mm:ss a zzzz',\n    '_': 'hh:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y hh:mm:ss a z',\n    '_': 'hh:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y hh:mm:ss a',\n    '_': 'hh:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y hh:mm a',\n    'a': 'h:mm a – h:mm a',\n    'h': 'h:mm–h:mm a',\n    'm': 'h:mm – h:mm a',\n    '_': 'hh:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM d, y hh:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'MMMM d, y hh:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MMM d, y hh:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy h:mm a – h:mm a',\n    'h': 'd/M/yy h:mm–h:mm a',\n    'm': 'd/M/yy h:mm – h:mm a',\n    '_': 'd/M/yy hh:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ko = {\n  FULL_DATE: {\n    'G': 'GGGGG y년 M월 d일 EEEE요일 ~ GGGGG y년 M월 d일 EEEE요일',\n    'Mdy': 'y. M. d. (EEEE) ~ y. M. d. (EEEE)',\n    '_': 'y년 M월 d일 EEEE'\n  },\n  LONG_DATE: {\n    'G': 'GGGGG y년 M월 d일 ~ GGGGG y년 M월 d일',\n    'Mdy': 'y. M. d. ~ y. M. d.',\n    '_': 'y년 M월 d일'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y년 M월 d일 ~ GGGGG y년 M월 d일',\n    '_': 'y. M. d.'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy년 M월 d일 ~ GGGGG yy년 M월 d일',\n    '_': 'yy. M. d.'\n  },\n  FULL_TIME: {\n    'Mdy': 'y. M. d. a h시 m분 s초 zzzz',\n    '_': 'a h시 m분 s초 zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y. M. d. a h시 m분 s초 z',\n    '_': 'a h시 m분 s초 z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y. M. d. a h:mm:ss',\n    '_': 'a h:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y. M. d. a h:mm',\n    'hm': 'a h:mm~h:mm',\n    '_': 'a h:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y년 M월 d일 EEEE a h시 m분 s초 zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y년 M월 d일 a h시 m분 s초 z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y. M. d. a h:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'yy. M. d. a h:mm ~ a h:mm',\n    'hm': 'yy. M. d. a h:mm~h:mm',\n    '_': 'yy. M. d. a h:mm'\n  },\n  FALLBACK: '{0} ~ {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ky = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'y-\\'ж\\'., d-MMMM, EEEE – d-MMMM EEEE',\n    'd': 'y-\\'ж\\'., d-MMMM, EEEE – d-MMMM, EEEE',\n    'y': 'y-\\'ж\\'., d-MMMM, EEEE – y-\\'ж\\'., d-MMMM, EEEE',\n    '_': 'y-\\'ж\\'., d-MMMM, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd-MMMM – d-MMMM y-\\'ж\\'.',\n    'd': 'd–d-MMMM y-\\'ж\\'.',\n    'y': 'd-MMMM y-\\'ж\\'. - d-MMMM y-\\'ж\\'.',\n    '_': 'y-\\'ж\\'., d-MMMM'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd-MMM – d-MMM y-\\'ж\\'.',\n    'd': 'd–d-MMM y-\\'ж\\'.',\n    'y': 'd-MMM y-\\'ж\\'. - d-MMM y-\\'ж\\'.',\n    '_': 'y-\\'ж\\'., d-MMM'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'dd.MM.yy – dd.MM.yy',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-dd-MM HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-dd-MM HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-dd-MM HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-dd-MM HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y-\\'ж\\'., d-MMMM, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y-\\'ж\\'., d-MMMM HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y-\\'ж\\'., d-MMM HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy HH:mm–HH:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ln = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_lo = {\n  FULL_DATE: {\n    'G': 'G EEEE, dd/MM/y – G EEEE, dd/MM/y',\n    'Mdy': 'G EEEE, dd/MM/y – EEEE, dd/MM/y',\n    '_': 'EEEE ທີ d MMMM G y'\n  },\n  LONG_DATE: {\n    'G': 'G dd/MM/y– G dd/MM/y',\n    'M': 'd/MM/y – d/MM',\n    'd': 'd/MM/y – d/MM/y',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G dd/MM/y– G dd/MM/y',\n    'M': 'd/MM/y – d/MM',\n    'd': 'd/MM/y – d/MM/y',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd/MM/y – GGGGG dd/MM/y',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, H ໂມງ m ນາທີ ss ວິນາທີ zzzz',\n    '_': 'H ໂມງ m ນາທີ ss ວິນາທີ zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, H ໂມງ m ນາທີ ss ວິນາທີ z',\n    '_': 'H ໂມງ m ນາທີ ss ວິນາທີ z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, H:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE ທີ d MMMM G y, H ໂມງ m ນາທີ ss ວິນາທີ zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y, H ໂມງ m ນາທີ ss ວິນາທີ z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y, HH:mm–HH:mm',\n    '_': 'd/M/y, H:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_lt = {\n  FULL_DATE: {\n    'M': 'y MMMM d, EEEE. – MMMM d, EEEE.',\n    'd': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE. – y MMMM d, EEEE.',\n    '_': 'y \\'m\\'. MMMM d \\'d\\'., EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'y \\'m\\'. MMMM d \\'d\\'.'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y \\'m\\'. MMMM d \\'d\\'., EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y \\'m\\'. MMMM d \\'d\\'. HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y-MM-dd HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_lv = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, y. \\'gada\\' d. MMMM – EEEE, y. \\'gada\\' d. MMMM',\n    'y': 'EEEE, y. \\'gada\\' d. MMMM – EEEE, y. \\'gada\\' d. MMMM',\n    '_': 'EEEE, y. \\'gada\\' d. MMMM'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y. \\'gada\\' d. MMMM – d. MMMM',\n    'd': 'y. \\'gada\\' d.–d. MMMM',\n    'y': 'y. \\'gada\\' d. MMMM – y. \\'gada\\' d. MMMM',\n    '_': 'y. \\'gada\\' d. MMMM'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y. \\'gada\\' d. MMM – d. MMM',\n    'd': 'y. \\'gada\\' d.–d. MMM',\n    'y': 'y. \\'gada\\' d. MMM – y. \\'gada\\' d. MMM',\n    '_': 'y. \\'gada\\' d. MMM'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'dd.MM.yy.–dd.MM.yy.',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'y.MM.d. HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y.MM.d. HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y.MM.d. HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y.MM.d. HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, y. \\'gada\\' d. MMMM HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y. \\'gada\\' d. MMMM HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y. \\'gada\\' d. MMM HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy HH:mm–HH:mm',\n    '_': 'dd.MM.yy HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_mk = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, dd MMMM – EEEE, dd MMMM y',\n    'd': 'EEEE, dd – EEEE, dd MMMM y',\n    'y': 'EEEE, dd MMMM y – EEEE, dd MMMM y',\n    '_': 'EEEE, dd MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'dd MMMM – dd MMMM y',\n    'd': 'dd – dd MMMM y',\n    'y': 'dd MMMM y – dd MMMM y',\n    '_': 'dd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'dd.M.y – dd.M.y',\n    '_': 'dd.M.y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'dd.M.yy – dd.M.yy',\n    '_': 'dd.M.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd.M.y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.M.yy HH:mm – HH:mm',\n    '_': 'dd.M.yy HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ml = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'y, MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d – d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'y, MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d – d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'y, MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'd/M/yy – d/M/yy',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'a': 'h:mm a – h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'y, MMMM d, EEEE h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y, MMMM d h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y, MMM d h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy h:mm a – h:mm a',\n    'hm': 'd/M/yy h:mm – h:mm a',\n    '_': 'd/M/yy h:mm a'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_mn = {\n  FULL_DATE: {\n    'G': 'GGGGG y-MM-dd, EEEE – GGGGG y-MM-dd, EEEE',\n    'Md': 'y \\'оны\\' MMMMM/dd EEEE – MMMMM/dd EEEE',\n    'y': 'y \\'оны\\' MMMMM/dd EEEE – y \\'оны\\' MMMMM/dd EEEE',\n    '_': 'y.MM.dd, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Md': 'y \\'оны\\' MMMMM/dd – MMMMM/dd',\n    'y': 'y \\'оны\\' MMMMM/dd – y \\'оны\\' MMMMM/dd',\n    '_': 'y.MM.dd'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y \\'оны\\' MMMMM/dd – MMMMM/dd',\n    'd': 'y \\'оны\\' MMMMM/dd – dd',\n    'y': 'y \\'оны\\' MMMMM/dd – y \\'оны\\' MMMMM/dd',\n    '_': 'y \\'оны\\' MMM\\'ын\\' d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Md': 'y \\'оны\\' MMMMM/dd – MMMMM/dd',\n    'y': 'y \\'оны\\' MMMMM/dd – y \\'оны\\' MMMMM/dd',\n    '_': 'y.MM.dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y.MM.dd HH:mm:ss (zzzz)',\n    '_': 'HH:mm:ss (zzzz)'\n  },\n  LONG_TIME: {\n    'Mdy': 'y.MM.dd HH:mm:ss (z)',\n    '_': 'HH:mm:ss (z)'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y.MM.dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y.MM.dd HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y.MM.dd, EEEE HH:mm:ss (zzzz)'\n  },\n  LONG_DATETIME: {\n    '_': 'y.MM.dd HH:mm:ss (z)'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y \\'оны\\' MMM\\'ын\\' d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y.MM.dd HH:mm – HH:mm',\n    '_': 'y.MM.dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_mo = {\n  FULL_DATE: {\n    'G': 'EEEE, d MMMM y G – EEEE, d MMMM y G',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd.MM.y GGGGG – dd.MM.y GGGGG',\n    '_': 'dd.MM.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.y, HH:mm–HH:mm',\n    '_': 'dd.MM.y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_mr = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM, y',\n    'd': 'EEEE, d MMMM y – EEEE, d MMMM, y',\n    '_': 'EEEE, d MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM, y',\n    'd': 'd – d MMMM, y',\n    '_': 'd MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd – d MMM, y',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM, y रोजी h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y रोजी h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy, h:mm a – h:mm a',\n    'hm': 'd/M/yy, h:mm – h:mm a',\n    '_': 'd/M/yy, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ms = {\n  FULL_DATE: {\n    'G': 'EEEE, d MMMM y G – EEEE, d MMMM y G',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM, y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/yy GGGGG – d/M/yy GGGGG',\n    'Mdy': 'd/M/yy – d/M/yy',\n    '_': 'd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/MM/yy, h:mm a – h:mm a',\n    'hm': 'd/MM/yy, h:mm–h:mm a',\n    '_': 'd/MM/yy, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_mt = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, d \\'ta\\'’ MMMM – EEEE, d \\'ta\\'’ MMMM y',\n    'd': 'EEEE, d MMMM – EEEE, d MMMM, y',\n    '_': 'EEEE, d \\'ta\\'’ MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'd – d MMMM y',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'd \\'ta\\'’ MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'd – d MMM y',\n    'y': 'd MMM, y – d MMM, y',\n    '_': 'dd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'ta\\'’ MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'ta\\'’ MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_my = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y၊ MMMM d၊ EEEE – MMMM d၊ EEEE',\n    '_': 'y၊ MMMM d၊ EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d   ',\n    'M': 'y၊ MMMM d – MMMM d',\n    'd': 'y၊ MMMM d – d',\n    'y': 'y၊ MMMM d – y၊ MMMM d',\n    '_': 'y၊ d MMMM'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d   ',\n    'M': 'y၊ MMM d – MMM d',\n    'd': 'y၊ MMM d – d',\n    '_': 'y၊ MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'd/M/yy – d/M/yy',\n    '_': 'dd-MM-yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd-MM-y zzzz HH:mm:ss',\n    '_': 'zzzz HH:mm:ss'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd-MM-y z HH:mm:ss',\n    '_': 'z HH:mm:ss'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd-MM-y B HH:mm:ss',\n    '_': 'B HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd-MM-y B H:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'B H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y၊ MMMM d၊ EEEE zzzz HH:mm:ss'\n  },\n  LONG_DATETIME: {\n    '_': 'y၊ d MMMM z HH:mm:ss'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y၊ MMM d B HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd-MM-yy HH:mm – HH:mm',\n    '_': 'dd-MM-yy B H:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_nb = {\n  FULL_DATE: {\n    'G': 'EEEE d. MMMM y G–EEEE d. MMMM y G',\n    'M': 'EEEE d. MMMM–EEEE d. MMMM y',\n    'd': 'EEEE d.–EEEE d. MMMM y',\n    '_': 'EEEE d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd. MMMM y G–d. MMMM y G',\n    'M': 'd. MMMM–d. MMMM y',\n    'd': 'd.–d. MMMM y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd. MMM y G–d. MMM y G',\n    'M': 'd. MMM–d. MMM y',\n    'd': 'd.–d. MMM y',\n    '_': 'd. MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd.MM.y GGGGG–dd.MM.y GGGGG',\n    '_': 'dd.MM.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d. MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y \\'kl\\'. HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd. MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.y, HH:mm–HH:mm',\n    '_': 'dd.MM.y, HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ne = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'yy/M/d'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'yy/M/d, HH:mm–HH:mm',\n    '_': 'yy/M/d, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_nl = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G – EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    'y': 'EEEE d MMMM y – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd-M-y GGGGG – d-M-y GGGGG',\n    'Mdy': 'dd-MM-y – dd-MM-y',\n    '_': 'dd-MM-y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd-M-y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd-M-y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd-M-y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd-M-y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'om\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'om\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd-MM-y HH:mm–HH:mm',\n    '_': 'dd-MM-y HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_no = {\n  FULL_DATE: {\n    'G': 'EEEE d. MMMM y G–EEEE d. MMMM y G',\n    'M': 'EEEE d. MMMM–EEEE d. MMMM y',\n    'd': 'EEEE d.–EEEE d. MMMM y',\n    '_': 'EEEE d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd. MMMM y G–d. MMMM y G',\n    'M': 'd. MMMM–d. MMMM y',\n    'd': 'd.–d. MMMM y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd. MMM y G–d. MMM y G',\n    'M': 'd. MMM–d. MMM y',\n    'd': 'd.–d. MMM y',\n    '_': 'd. MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd.MM.y GGGGG–dd.MM.y GGGGG',\n    '_': 'dd.MM.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d. MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y \\'kl\\'. HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd. MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.y, HH:mm–HH:mm',\n    '_': 'dd.MM.y, HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_no_NO = exports.DateIntervalSymbols_no;\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_or = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, MMMM d, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'M/d/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y, h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'h:mm:ss a zzzz ଠାରେ EEEE, MMMM d, y'\n  },\n  LONG_DATETIME: {\n    '_': 'h:mm:ss a z ଠାରେ MMMM d, y'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MMM d, y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'M/d/yy, h:mm a – h:mm a',\n    'hm': 'M/d/yy, h:mm–h:mm a',\n    '_': 'M/d/yy, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_pa = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy, h:mm a – h:mm a',\n    'hm': 'd/M/yy, h:mm–h:mm a',\n    '_': 'd/M/yy, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_pl = {\n  FULL_DATE: {\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM–d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd.M.y GGGGG – d.M.y GGGGG',\n    'M': 'dd.MM–dd.MM.y',\n    'd': 'dd–dd.MM.y',\n    '_': 'dd.MM.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.MM.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.MM.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.MM.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.MM.y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.y, HH:mm–HH:mm',\n    '_': 'dd.MM.y, HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_pt = {\n  FULL_DATE: {\n    'G': 'G EEEE, d \\'de\\' MMMM y – G EEEE, d \\'de\\' MMMM y',\n    'M': 'EEEE, d \\'de\\' MMMM – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'd': 'EEEE, d – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G d \\'de\\' MMMM y – G d \\'de\\' MMMM y',\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G d \\'de\\' MMM y – G d \\'de\\' MMM y',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMM \\'de\\' y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd/MM/y – GGGGG dd/MM/y',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd \\'de\\' MMM \\'de\\' y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm – HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_pt_BR = exports.DateIntervalSymbols_pt;\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_pt_PT = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G d \\'de\\' MMMM y – G d \\'de\\' MMMM y',\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG dd/MM/y – GGGGG dd/MM/y',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd/MM/yy – GGGGG dd/MM/yy',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd/MM/y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm – HH:mm',\n    '_': 'dd/MM/yy, HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ro = {\n  FULL_DATE: {\n    'G': 'EEEE, d MMMM y G – EEEE, d MMMM y G',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd.MM.y GGGGG – dd.MM.y GGGGG',\n    '_': 'dd.MM.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.y, HH:mm–HH:mm',\n    '_': 'dd.MM.y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ru = {\n  FULL_DATE: {\n    'G': 'ccc, d MMMM y \\'г\\'. G – ccc, d MMMM y \\'г\\'. G',\n    'M': 'ccc, d MMMM – ccc, d MMMM y \\'г\\'.',\n    'd': 'ccc, d – ccc, d MMMM y \\'г\\'.',\n    'y': 'ccc, d MMMM y \\'г\\'. – ccc, d MMMM y \\'г\\'.',\n    '_': 'EEEE, d MMMM y \\'г\\'.'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y \\'г\\'. G – d MMMM y \\'г\\'. G',\n    'M': 'd MMMM – d MMMM y \\'г\\'.',\n    'd': 'd–d MMMM y \\'г\\'.',\n    '_': 'd MMMM y \\'г\\'.'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y \\'г\\'. G – d MMM y \\'г\\'. G',\n    'M': 'd MMM – d MMM y \\'г\\'.',\n    'd': 'd–d MMM y \\'г\\'.',\n    '_': 'd MMM y \\'г\\'.'\n  },\n  SHORT_DATE: {\n    'G': 'dd.MM.y G – dd.MM.y G',\n    '_': 'dd.MM.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'г\\'., HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'г\\'., HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y \\'г\\'., HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.y, HH:mm–HH:mm',\n    '_': 'dd.MM.y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_sh = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, dd. MMMM – EEEE, dd. MMMM y.',\n    'd': 'EEEE, dd. – EEEE, dd. MMMM y.',\n    '_': 'EEEE, dd. MMMM y.'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'dd. MMMM – dd. MMMM y.',\n    'd': 'dd.–dd. MMMM y.',\n    '_': 'dd. MMMM y.'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd.M.y. – d.M.y.',\n    '_': 'dd.MM.y.'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'd.M.yy.'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y. HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y. HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y. HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y. HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd. MMMM y. HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd. MMMM y. HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd.MM.y. HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.M.yy. HH:mm–HH:mm',\n    '_': 'd.M.yy. HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_si = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d – d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d – d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    'Mdy': 'y-M-d – y-M-d',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d HH.mm.ss zzzz',\n    '_': 'HH.mm.ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d HH.mm.ss z',\n    '_': 'HH.mm.ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d HH.mm.ss',\n    '_': 'HH.mm.ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d HH.mm',\n    'ahm': 'HH.mm–HH.mm',\n    '_': 'HH.mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH.mm.ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH.mm.ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH.mm.ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH.mm–HH.mm',\n    '_': 'y-MM-dd HH.mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_sk = {\n  FULL_DATE: {\n    'G': 'EEEE d. M. y G – EEEE d. M. y G',\n    'M': 'EEEE d. M. – EEEE d. M. y',\n    'd': 'EEEE d. – EEEE d. M. y',\n    'y': 'EEEE d. M. y – EEEE d. M. y',\n    '_': 'EEEE d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd. M. y G – d. M. y G',\n    'M': 'd. M. – d. M. y',\n    'd': 'd. – d. M. y',\n    'y': 'd. M. y – d. M. y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd. M. y GGGGG – d. M. y GGGGG',\n    '_': 'd. M. y'\n  },\n  SHORT_DATE: {\n    'G': 'd. M. y GGGGG – d. M. y GGGGG',\n    '_': 'd. M. y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd. M. y, H:mm:ss zzzz',\n    '_': 'H:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd. M. y, H:mm:ss z',\n    '_': 'H:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd. M. y, H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd. M. y, H:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d. MMMM y, H:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y, H:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd. M. y, H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd. M. y, H:mm – H:mm',\n    '_': 'd. M. y H:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_sl = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, d. MMMM–EEEE, d. MMMM y',\n    'y': 'EEEE, d. MMMM y–EEEE, d. MMMM y',\n    '_': 'EEEE, dd. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd. MMMM–d. MMMM y',\n    'd': 'd.–d. MMMM y',\n    'y': 'd. MMMM y–d. MMMM y',\n    '_': 'dd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd. MMM–d. MMM y',\n    'd': 'd.–d. MMM y',\n    '_': 'd. MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'M': 'd. M.–d. M. yy',\n    'dy': 'd. M. yy–d. M. yy',\n    '_': 'd. MM. yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd. M. y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd. M. y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd. M. y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd. M. y HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd. MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd. MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd. MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd. MM. yy HH:mm–HH:mm',\n    '_': 'd. MM. yy HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_sq = {\n  FULL_DATE: {\n    'G': 'EEEE, d MMMM y G – EEEE, d MMMM y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd.M.yy GGGGG – d.M.yy GGGGG',\n    'Mdy': 'd.M.yy – d.M.yy',\n    '_': 'd.M.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y, h:mm:ss a, zzzz',\n    '_': 'h:mm:ss a, zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y, h:mm:ss a, z',\n    '_': 'h:mm:ss a, z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y, h:mm a',\n    'a': 'h:mm a – h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'në\\' h:mm:ss a, zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'në\\' h:mm:ss a, z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd.M.yy, h:mm a – h:mm a',\n    'hm': 'd.M.yy, h:mm – h:mm a',\n    '_': 'd.M.yy, h:mm a'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_sr = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, dd. MMMM – EEEE, dd. MMMM y.',\n    'd': 'EEEE, dd. – EEEE, dd. MMMM y.',\n    '_': 'EEEE, dd. MMMM y.'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'dd. MMMM – dd. MMMM y.',\n    'd': 'dd.–dd. MMMM y.',\n    '_': 'dd. MMMM y.'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd.M.y. – d.M.y.',\n    '_': 'dd.MM.y.'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'd.M.yy.'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y. HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y. HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y. HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y. HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd. MMMM y. HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd. MMMM y. HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd.MM.y. HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.M.yy. HH:mm–HH:mm',\n    '_': 'd.M.yy. HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_sr_Latn = exports.DateIntervalSymbols_sr;\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_sv = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE dd MMMM–EEEE dd MMMM y',\n    'y': 'EEEE dd MMMM y–EEEE dd MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM–d MMMM y',\n    'd': 'd–d MMMM y',\n    'y': 'd MMMM y–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM–d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'M': 'y-MM-dd – MM-dd',\n    'd': 'y-MM-dd – dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd \\'kl\\'. HH:mm:ss zzzz',\n    '_': '\\'kl\\'. HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd \\'kl\\'. HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'kl\\'. HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_sw = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, MMMM d– EEEE, MMMM d y',\n    'd': 'EEEE, MMMM d – EEEE, MMMM d y',\n    'y': 'EEEE, MMMM d y – EEEE, MMMM d y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'Md': 'MMMM d – d, y',\n    'y': 'MMMM d y – MMMM d y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'Md': 'MMM d – d, y',\n    'y': 'MMM d y – MMM d y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/y GGGGG – d/M/y GGGGG',\n    'Mdy': 'd/M/y – d/M/y',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm – HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ta = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM, y',\n    '_': 'EEEE, d MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM, y',\n    'd': 'd – d MMMM, y',\n    '_': 'd MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd – d MMM, y',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, a h:mm:ss zzzz',\n    '_': 'a h:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, a h:mm:ss z',\n    '_': 'a h:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, a h:mm:ss',\n    '_': 'a h:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, a h:mm',\n    'hm': 'a h:mm–h:mm',\n    '_': 'a h:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM, y ’அன்று’ a h:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y ’அன்று’ a h:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y, a h:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy, a h:mm – a h:mm',\n    'hm': 'd/M/yy, a h:mm–h:mm',\n    '_': 'd/M/yy, a h:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_te = {\n  FULL_DATE: {\n    'G': 'G d MMMM, y, EEEE – G d MMMM, y, EEEE',\n    'Md': 'd MMMM, EEEE – d MMMM, y, EEEE',\n    'y': 'd MMMM, y, EEEE – d MMMM, y, EEEE',\n    '_': 'd, MMMM y, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G d MMMM y – G d MMMM y',\n    'M': 'd MMMM – d MMMM, y',\n    'd': 'd–d MMMM, y',\n    '_': 'd MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G d MMM y – G d MMM y',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd–d MMM, y',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG d/M/yy – GGGGG d/M/yy',\n    'Mdy': 'd/M/yy – d/M/yy',\n    '_': 'dd-MM-yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'd, MMMM y, EEEE h:mm:ss a zzzzకి'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y h:mm:ss a zకి'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd-MM-yy h:mm a – h:mm a',\n    'hm': 'dd-MM-yy h:mm–h:mm a',\n    '_': 'dd-MM-yy h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_th = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'G y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'G y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEEที่ d MMMM G y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'G y MMMM d – MMMM d',\n    'd': 'G y MMMM d–d',\n    'y': 'G y MMMM d – y MMMM d',\n    '_': 'd MMMM G y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y H นาฬิกา mm นาที ss วินาที zzzz',\n    '_': 'H นาฬิกา mm นาที ss วินาที zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y H นาฬิกา mm นาที ss วินาที z',\n    '_': 'H นาฬิกา mm นาที ss วินาที z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm น. – HH:mm น.',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEEที่ d MMMM G y H นาฬิกา mm นาที ss วินาที zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM G y H นาฬิกา mm นาที ss วินาที z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy HH:mm น. – HH:mm น.',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_tl = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'Md': 'EEEE, MMMM d – EEEE, MMMM d, y',\n    '_': 'EEEE, MMMM d, y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'MMMM d – MMMM d, y',\n    'd': 'MMMM d–d, y',\n    '_': 'MMMM d, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'MMM d – MMM d, y',\n    'd': 'MMM d–d, y',\n    '_': 'MMM d, y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    '_': 'M/d/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y, h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM d, y \\'nang\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'MMMM d, y \\'nang\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MMM d, y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'M/d/yy, h:mm a – h:mm a',\n    'hm': 'M/d/yy, h:mm–h:mm a',\n    '_': 'M/d/yy, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_tr = {\n  FULL_DATE: {\n    'G': 'G d MMMM y EEEE – G d MMMM y EEEE',\n    '_': 'd MMMM y EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G d MMMM y – G d MMMM y',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G d MMM y – G d MMM y',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd.MM.y – GGGGG dd.MM.y',\n    'Mdy': 'dd.MM.y – dd.MM.y',\n    '_': 'd.MM.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'd MMMM y EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.MM.y HH:mm–HH:mm',\n    '_': 'd.MM.y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_uk = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y \\'р\\'.'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM y \\'р\\'.'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y \\'р\\'.'\n  },\n  SHORT_DATE: {\n    'G': 'dd.MM.yy G – dd.MM.yy G',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'р\\'. \\'о\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'р\\'. \\'о\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y \\'р\\'., HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy, HH:mm–HH:mm',\n    '_': 'dd.MM.yy, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_ur = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'Md': 'EEEE، d MMMM – EEEE، d MMMM، y',\n    '_': 'EEEE، d MMMM، y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM، y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM، y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM، y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM، y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE، d MMMM، y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM، y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM، y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy h:mm a – h:mm a',\n    'hm': 'd/M/yy h:mm–h:mm a',\n    '_': 'd/M/yy h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_uz = {\n  FULL_DATE: {\n    'G': 'EEEE, d-MMMM, G y – EEEE, d-MMMM, G y',\n    'Md': 'EEEE, d-MMMM – EEEE, d-MMMM, y',\n    '_': 'EEEE, d-MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'd-MMMM, G y – d-MMMM, G y',\n    'M': 'd-MMMM – d-MMMM, y',\n    'd': 'd – d-MMMM, y',\n    '_': 'd-MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd-MMM, G y – d-MMM, G y',\n    'M': 'd-MMM – d-MMM, y',\n    'd': 'd – d-MMM, y',\n    '_': 'd-MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/yy (GGGGG) – d/M/yy (GGGGG)',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, H:mm:ss (zzzz)',\n    '_': 'H:mm:ss (zzzz)'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, H:mm:ss (z)',\n    '_': 'H:mm:ss (z)'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d-MMMM, y, H:mm:ss (zzzz)'\n  },\n  LONG_DATETIME: {\n    '_': 'd-MMMM, y, H:mm:ss (z)'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd-MMM, y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm–HH:mm',\n    '_': 'dd/MM/yy, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_vi = {\n  FULL_DATE: {\n    'G': 'EEEE, d MMMM y G – EEEE, d MMMM y G',\n    'M': 'EEEE, dd \\'tháng\\' M – EEEE, dd \\'tháng\\' M, y',\n    'd': 'EEEE, \\'ngày\\' dd MMMM – EEEE, \\'ngày\\' dd MMMM \\'năm\\' y',\n    'y': 'EEEE, dd \\'tháng\\' M, y – EEEE, dd \\'tháng\\' M, y',\n    '_': 'EEEE, d MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM, y',\n    'd': 'd – d MMMM, y',\n    'y': '\\'Ngày\\' dd \\'tháng\\' M \\'năm\\' y - \\'Ngày\\' dd \\'tháng\\' M \\'năm\\' y',\n    '_': 'd MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd – d MMM, y',\n    'y': '\\'Ngày\\' dd \\'tháng\\' M \\'năm\\' y - \\'Ngày\\' dd \\'tháng\\' M \\'năm\\' y',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'dd-MM-y GGGGG – dd-MM-y GGGGG',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'HH:mm:ss zzzz, d/M/y',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'HH:mm:ss z, d/M/y',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'HH:mm:ss, d/M/y',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'HH:mm, d/M/y',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'HH:mm:ss zzzz EEEE, d MMMM, y'\n  },\n  LONG_DATETIME: {\n    '_': 'HH:mm:ss z d MMMM, y'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'HH:mm:ss, d MMM, y'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'HH:mm–HH:mm, dd/MM/y',\n    '_': 'HH:mm, dd/MM/y'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_zh = {\n  FULL_DATE: {\n    'G': 'GGGGG y-MM-dd, EEEE – GGGGG y-MM-dd, EEEE',\n    'Mdy': 'y/M/dEEEE至y/M/dEEEE',\n    '_': 'y年M月d日EEEE'\n  },\n  LONG_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d – y/M/d',\n    '_': 'y年M月d日'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d – y/M/d',\n    '_': 'y年M月d日'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y/M/d'\n  },\n  FULL_TIME: {\n    'Mdy': 'y/M/d zzzz ah:mm:ss',\n    '_': 'zzzz ah:mm:ss'\n  },\n  LONG_TIME: {\n    'Mdy': 'y/M/d z ah:mm:ss',\n    '_': 'z ah:mm:ss'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y/M/d ah:mm:ss',\n    '_': 'ah:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y/M/d ah:mm',\n    'a': 'ah:mm至ah:mm',\n    'hm': 'ah:mm至h:mm',\n    '_': 'ah:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y年M月d日EEEE zzzz ah:mm:ss'\n  },\n  LONG_DATETIME: {\n    '_': 'y年M月d日 z ah:mm:ss'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'y/M/d ah:mm至ah:mm',\n    'hm': 'y/M/d ah:mm至h:mm',\n    '_': 'y/M/d ah:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_zh_CN = exports.DateIntervalSymbols_zh;\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_zh_HK = {\n  FULL_DATE: {\n    'G': 'GGGGG y-MM-dd, EEEE – GGGGG y-MM-dd, EEEE',\n    'Mdy': 'd/M/y（EEEE） 至 d/M/y（EEEE）',\n    '_': 'y年M月d日EEEE'\n  },\n  LONG_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y 至 d/M/y',\n    '_': 'y年M月d日'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y 至 d/M/y',\n    '_': 'y年M月d日'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y 至 d/M/y',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y ah:mm:ss [zzzz]',\n    '_': 'ah:mm:ss [zzzz]'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y ah:mm:ss [z]',\n    '_': 'ah:mm:ss [z]'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y ah:mm:ss',\n    '_': 'ah:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y ah:mm',\n    'a': 'ah:mm至ah:mm',\n    'hm': 'ah:mm至h:mm',\n    '_': 'ah:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y年M月d日EEEE ah:mm:ss [zzzz]'\n  },\n  LONG_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss [z]'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/y ah:mm至ah:mm',\n    'hm': 'd/M/y ah:mm至h:mm',\n    '_': 'd/M/y ah:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_zh_TW = {\n  FULL_DATE: {\n    'G': 'GGGGG y-MM-dd, EEEE – GGGGG y-MM-dd, EEEE',\n    'Mdy': 'y/M/dEEEE至y/M/dEEEE',\n    '_': 'y年M月d日 EEEE'\n  },\n  LONG_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d至y/M/d',\n    '_': 'y年M月d日'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d至y/M/d',\n    '_': 'y年M月d日'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d至y/M/d',\n    '_': 'y/M/d'\n  },\n  FULL_TIME: {\n    'Mdy': 'y/M/d ah:mm:ss [zzzz]',\n    '_': 'ah:mm:ss [zzzz]'\n  },\n  LONG_TIME: {\n    'Mdy': 'y/M/d ah:mm:ss [z]',\n    '_': 'ah:mm:ss [z]'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y/M/d ah:mm:ss',\n    '_': 'ah:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y/M/d ah:mm',\n    'a': 'ah:mm至ah:mm',\n    'hm': 'ah:mm至h:mm',\n    '_': 'ah:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y年M月d日 EEEE ah:mm:ss [zzzz]'\n  },\n  LONG_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss [z]'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'y/M/d ah:mm至ah:mm',\n    'hm': 'y/M/d ah:mm至h:mm',\n    '_': 'y/M/d ah:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!DateIntervalSymbols} */\nexports.DateIntervalSymbols_zu = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, MMMM d – EEEE, MMMM d, y',\n    '_': 'EEEE, MMMM d, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'MMMM d – MMMM d, y',\n    'd': 'MMMM d – d, y',\n    '_': 'MMMM d, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'MMM d – MMM d, y',\n    'd': 'MMM d – d, y',\n    '_': 'MMM d, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'M/d/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM d, y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'MMMM d, y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MMM d, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'M/d/yy HH:mm – HH:mm',\n    '_': 'M/d/yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\nswitch (goog.LOCALE) {\n  case 'af':\n    defaultSymbols = exports.DateIntervalSymbols_af;\n    break;\n  case 'am':\n    defaultSymbols = exports.DateIntervalSymbols_am;\n    break;\n  case 'ar':\n    defaultSymbols = exports.DateIntervalSymbols_ar;\n    break;\n  case 'ar_DZ':\n  case 'ar-DZ':\n    defaultSymbols = exports.DateIntervalSymbols_ar_DZ;\n    break;\n  case 'ar_EG':\n  case 'ar-EG':\n    defaultSymbols = exports.DateIntervalSymbols_ar_EG;\n    break;\n  case 'az':\n    defaultSymbols = exports.DateIntervalSymbols_az;\n    break;\n  case 'be':\n    defaultSymbols = exports.DateIntervalSymbols_be;\n    break;\n  case 'bg':\n    defaultSymbols = exports.DateIntervalSymbols_bg;\n    break;\n  case 'bn':\n    defaultSymbols = exports.DateIntervalSymbols_bn;\n    break;\n  case 'br':\n    defaultSymbols = exports.DateIntervalSymbols_br;\n    break;\n  case 'bs':\n    defaultSymbols = exports.DateIntervalSymbols_bs;\n    break;\n  case 'ca':\n    defaultSymbols = exports.DateIntervalSymbols_ca;\n    break;\n  case 'chr':\n    defaultSymbols = exports.DateIntervalSymbols_chr;\n    break;\n  case 'cs':\n    defaultSymbols = exports.DateIntervalSymbols_cs;\n    break;\n  case 'cy':\n    defaultSymbols = exports.DateIntervalSymbols_cy;\n    break;\n  case 'da':\n    defaultSymbols = exports.DateIntervalSymbols_da;\n    break;\n  case 'de':\n    defaultSymbols = exports.DateIntervalSymbols_de;\n    break;\n  case 'de_AT':\n  case 'de-AT':\n    defaultSymbols = exports.DateIntervalSymbols_de_AT;\n    break;\n  case 'de_CH':\n  case 'de-CH':\n    defaultSymbols = exports.DateIntervalSymbols_de_CH;\n    break;\n  case 'el':\n    defaultSymbols = exports.DateIntervalSymbols_el;\n    break;\n  case 'en':\n    defaultSymbols = exports.DateIntervalSymbols_en;\n    break;\n  case 'en_AU':\n  case 'en-AU':\n    defaultSymbols = exports.DateIntervalSymbols_en_AU;\n    break;\n  case 'en_CA':\n  case 'en-CA':\n    defaultSymbols = exports.DateIntervalSymbols_en_CA;\n    break;\n  case 'en_GB':\n  case 'en-GB':\n    defaultSymbols = exports.DateIntervalSymbols_en_GB;\n    break;\n  case 'en_IE':\n  case 'en-IE':\n    defaultSymbols = exports.DateIntervalSymbols_en_IE;\n    break;\n  case 'en_IN':\n  case 'en-IN':\n    defaultSymbols = exports.DateIntervalSymbols_en_IN;\n    break;\n  case 'en_SG':\n  case 'en-SG':\n    defaultSymbols = exports.DateIntervalSymbols_en_SG;\n    break;\n  case 'en_US':\n  case 'en-US':\n    defaultSymbols = exports.DateIntervalSymbols_en_US;\n    break;\n  case 'en_ZA':\n  case 'en-ZA':\n    defaultSymbols = exports.DateIntervalSymbols_en_ZA;\n    break;\n  case 'es':\n    defaultSymbols = exports.DateIntervalSymbols_es;\n    break;\n  case 'es_419':\n  case 'es-419':\n    defaultSymbols = exports.DateIntervalSymbols_es_419;\n    break;\n  case 'es_ES':\n  case 'es-ES':\n    defaultSymbols = exports.DateIntervalSymbols_es_ES;\n    break;\n  case 'es_MX':\n  case 'es-MX':\n    defaultSymbols = exports.DateIntervalSymbols_es_MX;\n    break;\n  case 'es_US':\n  case 'es-US':\n    defaultSymbols = exports.DateIntervalSymbols_es_US;\n    break;\n  case 'et':\n    defaultSymbols = exports.DateIntervalSymbols_et;\n    break;\n  case 'eu':\n    defaultSymbols = exports.DateIntervalSymbols_eu;\n    break;\n  case 'fa':\n    defaultSymbols = exports.DateIntervalSymbols_fa;\n    break;\n  case 'fi':\n    defaultSymbols = exports.DateIntervalSymbols_fi;\n    break;\n  case 'fil':\n    defaultSymbols = exports.DateIntervalSymbols_fil;\n    break;\n  case 'fr':\n    defaultSymbols = exports.DateIntervalSymbols_fr;\n    break;\n  case 'fr_CA':\n  case 'fr-CA':\n    defaultSymbols = exports.DateIntervalSymbols_fr_CA;\n    break;\n  case 'ga':\n    defaultSymbols = exports.DateIntervalSymbols_ga;\n    break;\n  case 'gl':\n    defaultSymbols = exports.DateIntervalSymbols_gl;\n    break;\n  case 'gsw':\n    defaultSymbols = exports.DateIntervalSymbols_gsw;\n    break;\n  case 'gu':\n    defaultSymbols = exports.DateIntervalSymbols_gu;\n    break;\n  case 'haw':\n    defaultSymbols = exports.DateIntervalSymbols_haw;\n    break;\n  case 'he':\n    defaultSymbols = exports.DateIntervalSymbols_he;\n    break;\n  case 'hi':\n    defaultSymbols = exports.DateIntervalSymbols_hi;\n    break;\n  case 'hr':\n    defaultSymbols = exports.DateIntervalSymbols_hr;\n    break;\n  case 'hu':\n    defaultSymbols = exports.DateIntervalSymbols_hu;\n    break;\n  case 'hy':\n    defaultSymbols = exports.DateIntervalSymbols_hy;\n    break;\n  case 'id':\n    defaultSymbols = exports.DateIntervalSymbols_id;\n    break;\n  case 'in':\n    defaultSymbols = exports.DateIntervalSymbols_in;\n    break;\n  case 'is':\n    defaultSymbols = exports.DateIntervalSymbols_is;\n    break;\n  case 'it':\n    defaultSymbols = exports.DateIntervalSymbols_it;\n    break;\n  case 'iw':\n    defaultSymbols = exports.DateIntervalSymbols_iw;\n    break;\n  case 'ja':\n    defaultSymbols = exports.DateIntervalSymbols_ja;\n    break;\n  case 'ka':\n    defaultSymbols = exports.DateIntervalSymbols_ka;\n    break;\n  case 'kk':\n    defaultSymbols = exports.DateIntervalSymbols_kk;\n    break;\n  case 'km':\n    defaultSymbols = exports.DateIntervalSymbols_km;\n    break;\n  case 'kn':\n    defaultSymbols = exports.DateIntervalSymbols_kn;\n    break;\n  case 'ko':\n    defaultSymbols = exports.DateIntervalSymbols_ko;\n    break;\n  case 'ky':\n    defaultSymbols = exports.DateIntervalSymbols_ky;\n    break;\n  case 'ln':\n    defaultSymbols = exports.DateIntervalSymbols_ln;\n    break;\n  case 'lo':\n    defaultSymbols = exports.DateIntervalSymbols_lo;\n    break;\n  case 'lt':\n    defaultSymbols = exports.DateIntervalSymbols_lt;\n    break;\n  case 'lv':\n    defaultSymbols = exports.DateIntervalSymbols_lv;\n    break;\n  case 'mk':\n    defaultSymbols = exports.DateIntervalSymbols_mk;\n    break;\n  case 'ml':\n    defaultSymbols = exports.DateIntervalSymbols_ml;\n    break;\n  case 'mn':\n    defaultSymbols = exports.DateIntervalSymbols_mn;\n    break;\n  case 'mo':\n    defaultSymbols = exports.DateIntervalSymbols_mo;\n    break;\n  case 'mr':\n    defaultSymbols = exports.DateIntervalSymbols_mr;\n    break;\n  case 'ms':\n    defaultSymbols = exports.DateIntervalSymbols_ms;\n    break;\n  case 'mt':\n    defaultSymbols = exports.DateIntervalSymbols_mt;\n    break;\n  case 'my':\n    defaultSymbols = exports.DateIntervalSymbols_my;\n    break;\n  case 'nb':\n    defaultSymbols = exports.DateIntervalSymbols_nb;\n    break;\n  case 'ne':\n    defaultSymbols = exports.DateIntervalSymbols_ne;\n    break;\n  case 'nl':\n    defaultSymbols = exports.DateIntervalSymbols_nl;\n    break;\n  case 'no':\n    defaultSymbols = exports.DateIntervalSymbols_no;\n    break;\n  case 'no_NO':\n  case 'no-NO':\n    defaultSymbols = exports.DateIntervalSymbols_no_NO;\n    break;\n  case 'or':\n    defaultSymbols = exports.DateIntervalSymbols_or;\n    break;\n  case 'pa':\n    defaultSymbols = exports.DateIntervalSymbols_pa;\n    break;\n  case 'pl':\n    defaultSymbols = exports.DateIntervalSymbols_pl;\n    break;\n  case 'pt':\n    defaultSymbols = exports.DateIntervalSymbols_pt;\n    break;\n  case 'pt_BR':\n  case 'pt-BR':\n    defaultSymbols = exports.DateIntervalSymbols_pt_BR;\n    break;\n  case 'pt_PT':\n  case 'pt-PT':\n    defaultSymbols = exports.DateIntervalSymbols_pt_PT;\n    break;\n  case 'ro':\n    defaultSymbols = exports.DateIntervalSymbols_ro;\n    break;\n  case 'ru':\n    defaultSymbols = exports.DateIntervalSymbols_ru;\n    break;\n  case 'sh':\n    defaultSymbols = exports.DateIntervalSymbols_sh;\n    break;\n  case 'si':\n    defaultSymbols = exports.DateIntervalSymbols_si;\n    break;\n  case 'sk':\n    defaultSymbols = exports.DateIntervalSymbols_sk;\n    break;\n  case 'sl':\n    defaultSymbols = exports.DateIntervalSymbols_sl;\n    break;\n  case 'sq':\n    defaultSymbols = exports.DateIntervalSymbols_sq;\n    break;\n  case 'sr':\n    defaultSymbols = exports.DateIntervalSymbols_sr;\n    break;\n  case 'sr_Latn':\n  case 'sr-Latn':\n    defaultSymbols = exports.DateIntervalSymbols_sr_Latn;\n    break;\n  case 'sv':\n    defaultSymbols = exports.DateIntervalSymbols_sv;\n    break;\n  case 'sw':\n    defaultSymbols = exports.DateIntervalSymbols_sw;\n    break;\n  case 'ta':\n    defaultSymbols = exports.DateIntervalSymbols_ta;\n    break;\n  case 'te':\n    defaultSymbols = exports.DateIntervalSymbols_te;\n    break;\n  case 'th':\n    defaultSymbols = exports.DateIntervalSymbols_th;\n    break;\n  case 'tl':\n    defaultSymbols = exports.DateIntervalSymbols_tl;\n    break;\n  case 'tr':\n    defaultSymbols = exports.DateIntervalSymbols_tr;\n    break;\n  case 'uk':\n    defaultSymbols = exports.DateIntervalSymbols_uk;\n    break;\n  case 'ur':\n    defaultSymbols = exports.DateIntervalSymbols_ur;\n    break;\n  case 'uz':\n    defaultSymbols = exports.DateIntervalSymbols_uz;\n    break;\n  case 'vi':\n    defaultSymbols = exports.DateIntervalSymbols_vi;\n    break;\n  case 'zh':\n    defaultSymbols = exports.DateIntervalSymbols_zh;\n    break;\n  case 'zh_CN':\n  case 'zh-CN':\n    defaultSymbols = exports.DateIntervalSymbols_zh_CN;\n    break;\n  case 'zh_HK':\n  case 'zh-HK':\n    defaultSymbols = exports.DateIntervalSymbols_zh_HK;\n    break;\n  case 'zh_TW':\n  case 'zh-TW':\n    defaultSymbols = exports.DateIntervalSymbols_zh_TW;\n    break;\n  case 'zu':\n    defaultSymbols = exports.DateIntervalSymbols_zu;\n    break;\n  default:\n    defaultSymbols = exports.DateIntervalSymbols_en;\n}\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/dateintervalsymbols.js"],"^:1",["^9K",["~$goog.i18n.dateIntervalSymbols"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.structs.collection.js","^9C",["^9D","goog/structs/collection.js"],"^9E","goog/structs/collection.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines the collection interface.\n *\n * @author nnaze@google.com (Nathan Naze)\n */\n\ngoog.provide('goog.structs.Collection');\n\n\n\n/**\n * An interface for a collection of values.\n * @interface\n * @template T\n */\ngoog.structs.Collection = function() {};\n\n\n/**\n * @param {T} value Value to add to the collection.\n */\ngoog.structs.Collection.prototype.add;\n\n\n/**\n * @param {T} value Value to remove from the collection.\n */\ngoog.structs.Collection.prototype.remove;\n\n\n/**\n * @param {T} value Value to find in the collection.\n * @return {boolean} Whether the collection contains the specified value.\n */\ngoog.structs.Collection.prototype.contains;\n\n\n/**\n * @return {number} The number of values stored in the collection.\n */\ngoog.structs.Collection.prototype.getCount;\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/collection.js"],"^:1",["^9K",["~$goog.structs.Collection"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.style.transition.js","^9C",["^9D","goog/style/transition.js"],"^9E","goog/style/transition.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility methods to deal with CSS3 transitions\n * programmatically.\n * @author chrishenry@google.com (Chris Henry)\n */\n\ngoog.provide('goog.style.transition');\ngoog.provide('goog.style.transition.Css3Property');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.dom.vendor');\ngoog.require('goog.functions');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.style');\ngoog.require('goog.userAgent');\n\n\n/**\n * A typedef to represent a CSS3 transition property. Duration and delay\n * are both in seconds. Timing is CSS3 timing function string, such as\n * 'easein', 'linear'.\n *\n * Alternatively, specifying string in the form of '[property] [duration]\n * [timing] [delay]' as specified in CSS3 transition is fine too.\n *\n * @typedef { {\n *   property: string,\n *   duration: number,\n *   timing: string,\n *   delay: number\n * } | string }\n */\ngoog.style.transition.Css3Property;\n\n\n/**\n * Sets the element CSS3 transition to properties.\n * @param {Element} element The element to set transition on.\n * @param {goog.style.transition.Css3Property|\n *     Array<goog.style.transition.Css3Property>} properties A single CSS3\n *     transition property or array of properties.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.style.transition.set = function(element, properties) {\n  if (!goog.isArray(properties)) {\n    properties = [properties];\n  }\n  goog.asserts.assert(\n      properties.length > 0, 'At least one Css3Property should be specified.');\n\n  var values = goog.array.map(properties, function(p) {\n    if (typeof p === 'string') {\n      return p;\n    } else {\n      goog.asserts.assertObject(p, 'Expected css3 property to be an object.');\n      var propString =\n          p.property + ' ' + p.duration + 's ' + p.timing + ' ' + p.delay + 's';\n      goog.asserts.assert(\n          p.property && typeof p.duration === 'number' && p.timing &&\n              typeof p.delay === 'number',\n          'Unexpected css3 property value: %s', propString);\n      return propString;\n    }\n  });\n  goog.style.transition.setPropertyValue_(element, values.join(','));\n};\n\n\n/**\n * Removes any programmatically-added CSS3 transition in the given element.\n * @param {Element} element The element to remove transition from.\n */\ngoog.style.transition.removeAll = function(element) {\n  goog.style.transition.setPropertyValue_(element, '');\n};\n\n\n/**\n * @return {boolean} Whether CSS3 transition is supported.\n */\ngoog.style.transition.isSupported = goog.functions.cacheReturnValue(function() {\n  // Since IE would allow any attribute, we need to explicitly check the\n  // browser version here instead.\n  if (goog.userAgent.IE) {\n    return goog.userAgent.isVersionOrHigher('10.0');\n  }\n\n  // We create a test element with style=-vendor-transition\n  // We then detect whether those style properties are recognized and\n  // available from js.\n  var el = goog.dom.createElement(goog.dom.TagName.DIV);\n  var transition = 'opacity 1s linear';\n  var vendorPrefix = goog.dom.vendor.getVendorPrefix();\n  var style = {'transition': transition};\n  if (vendorPrefix) {\n    style[vendorPrefix + '-transition'] = transition;\n  }\n  goog.dom.safe.setInnerHtml(\n      el, goog.html.SafeHtml.create('div', {'style': style}));\n\n  var testElement = /** @type {Element} */ (el.firstChild);\n  goog.asserts.assert(testElement.nodeType == Node.ELEMENT_NODE);\n\n  return goog.style.getStyle(testElement, 'transition') != '';\n});\n\n\n/**\n * Sets CSS3 transition property value to the given value.\n * @param {Element} element The element to set transition on.\n * @param {string} transitionValue The CSS3 transition property value.\n * @private\n */\ngoog.style.transition.setPropertyValue_ = function(element, transitionValue) {\n  goog.style.setStyle(element, 'transition', transitionValue);\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^;<","^9>","^:S","^@B","^<3","~$goog.dom.vendor","^;9","^@C","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/style/transition.js"],"^:1",["^9K",["~$goog.style.transition","~$goog.style.transition.Css3Property"]],"^9<",true,"^9=",["^9>","^;9","^:E","^;;","^;=","^@B","^JP","^;<","^@C","^<3","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.selection.js","^9C",["^9D","goog/dom/selection.js"],"^9E","goog/dom/selection.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for working with selections in input boxes and text\n * areas.\n *\n * @author arv@google.com (Erik Arvidsson)\n * @see ../demos/dom_selection.html\n */\n\n\ngoog.provide('goog.dom.selection');\n\ngoog.require('goog.dom.InputType');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n/**\n * Sets the place where the selection should start inside a textarea or a text\n * input\n * @param {Element} textfield A textarea or text input.\n * @param {number} pos The position to set the start of the selection at.\n */\ngoog.dom.selection.setStart = function(textfield, pos) {\n  if (goog.dom.selection.useSelectionProperties_(textfield)) {\n    textfield.selectionStart = pos;\n  } else if (goog.dom.selection.isLegacyIe_()) {\n    // destructuring assignment would have been sweet\n    var tmp = goog.dom.selection.getRangeIe_(textfield);\n    var range = tmp[0];\n    var selectionRange = tmp[1];\n\n    if (range.inRange(selectionRange)) {\n      pos = goog.dom.selection.canonicalizePositionIe_(textfield, pos);\n\n      range.collapse(true);\n      range.move('character', pos);\n      range.select();\n    }\n  }\n};\n\n\n/**\n * Return the place where the selection starts inside a textarea or a text\n * input\n * @param {Element} textfield A textarea or text input.\n * @return {number} The position where the selection starts or 0 if it was\n *     unable to find the position or no selection exists. Note that we can't\n *     reliably tell the difference between an element that has no selection and\n *     one where it starts at 0.\n */\ngoog.dom.selection.getStart = function(textfield) {\n  return goog.dom.selection.getEndPoints_(textfield, true)[0];\n};\n\n\n/**\n * Returns the start and end points of the selection within a textarea in IE.\n * IE treats newline characters as \\r\\n characters, and we need to check for\n * these characters at the edge of our selection, to ensure that we return the\n * right cursor position.\n * @param {TextRange} range Complete range object, e.g., \"Hello\\r\\n\".\n * @param {TextRange} selRange Selected range object.\n * @param {boolean} getOnlyStart Value indicating if only start\n *     cursor position is to be returned. In IE, obtaining the end position\n *     involves extra work, hence we have this parameter for calls which need\n *     only start position.\n * @return {!Array<number>} An array with the start and end positions where the\n *     selection starts and ends or [0,0] if it was unable to find the\n *     positions or no selection exists. Note that we can't reliably tell the\n *     difference between an element that has no selection and one where\n *     it starts and ends at 0. If getOnlyStart was true, we return\n *     -1 as end offset.\n * @private\n */\ngoog.dom.selection.getEndPointsTextareaIe_ = function(\n    range, selRange, getOnlyStart) {\n  // Create a duplicate of the selected range object to perform our actions\n  // against. Example of selectionRange = \"\" (assuming that the cursor is\n  // just after the \\r\\n combination)\n  var selectionRange = selRange.duplicate();\n\n  // Text before the selection start, e.g.,\"Hello\" (notice how range.text\n  // excludes the \\r\\n sequence)\n  var beforeSelectionText = range.text;\n  // Text before the selection start, e.g., \"Hello\" (this will later include\n  // the \\r\\n sequences also)\n  var untrimmedBeforeSelectionText = beforeSelectionText;\n  // Text within the selection , e.g. \"\" assuming that the cursor is just after\n  // the \\r\\n combination.\n  var selectionText = selectionRange.text;\n  // Text within the selection, e.g.,  \"\" (this will later include the \\r\\n\n  // sequences also)\n  var untrimmedSelectionText = selectionText;\n\n  // Boolean indicating whether we are done dealing with the text before the\n  // selection's beginning.\n  var isRangeEndTrimmed = false;\n  // Go over the range until it becomes a 0-lengthed range or until the range\n  // text starts changing when we move the end back by one character.\n  // If after moving the end back by one character, the text remains the same,\n  // then we need to add a \"\\r\\n\" at the end to get the actual text.\n  while (!isRangeEndTrimmed) {\n    if (range.compareEndPoints('StartToEnd', range) == 0) {\n      isRangeEndTrimmed = true;\n    } else {\n      range.moveEnd('character', -1);\n      if (range.text == beforeSelectionText) {\n        // If the start position of the cursor was after a \\r\\n string,\n        // we would skip over it in one go with the moveEnd call, but\n        // range.text will still show \"Hello\" (because of the IE range.text\n        // bug) - this implies that we should add a \\r\\n to our\n        // untrimmedBeforeSelectionText string.\n        untrimmedBeforeSelectionText += '\\r\\n';\n      } else {\n        isRangeEndTrimmed = true;\n      }\n    }\n  }\n\n  if (getOnlyStart) {\n    // We return -1 as end, since the caller is only interested in the start\n    // value.\n    return [untrimmedBeforeSelectionText.length, -1];\n  }\n  // Boolean indicating whether we are done dealing with the text inside the\n  // selection.\n  var isSelectionRangeEndTrimmed = false;\n  // Go over the selected range until it becomes a 0-lengthed range or until\n  // the range text starts changing when we move the end back by one character.\n  // If after moving the end back by one character, the text remains the same,\n  // then we need to add a \"\\r\\n\" at the end to get the actual text.\n  while (!isSelectionRangeEndTrimmed) {\n    if (selectionRange.compareEndPoints('StartToEnd', selectionRange) == 0) {\n      isSelectionRangeEndTrimmed = true;\n    } else {\n      selectionRange.moveEnd('character', -1);\n      if (selectionRange.text == selectionText) {\n        // If the selection was not empty, and the end point of the selection\n        // was just after a \\r\\n, we would have skipped it in one go with the\n        // moveEnd call, and this implies that we should add a \\r\\n to the\n        // untrimmedSelectionText string.\n        untrimmedSelectionText += '\\r\\n';\n      } else {\n        isSelectionRangeEndTrimmed = true;\n      }\n    }\n  }\n  return [\n    untrimmedBeforeSelectionText.length,\n    untrimmedBeforeSelectionText.length + untrimmedSelectionText.length\n  ];\n};\n\n\n/**\n * Returns the start and end points of the selection inside a textarea or a\n * text input.\n * @param {Element} textfield A textarea or text input.\n * @return {!Array<number>} An array with the start and end positions where the\n *     selection starts and ends or [0,0] if it was unable to find the\n *     positions or no selection exists. Note that we can't reliably tell the\n *     difference between an element that has no selection and one where\n *     it starts and ends at 0.\n */\ngoog.dom.selection.getEndPoints = function(textfield) {\n  return goog.dom.selection.getEndPoints_(textfield, false);\n};\n\n\n/**\n * Returns the start and end points of the selection inside a textarea or a\n * text input.\n * @param {Element} textfield A textarea or text input.\n * @param {boolean} getOnlyStart Value indicating if only start\n *     cursor position is to be returned. In IE, obtaining the end position\n *     involves extra work, hence we have this parameter. In FF, there is not\n *     much extra effort involved.\n * @return {!Array<number>} An array with the start and end positions where the\n *     selection starts and ends or [0,0] if it was unable to find the\n *     positions or no selection exists. Note that we can't reliably tell the\n *     difference between an element that has no selection and one where\n *     it starts and ends at 0. If getOnlyStart was true, we return\n *     -1 as end offset.\n * @private\n */\ngoog.dom.selection.getEndPoints_ = function(textfield, getOnlyStart) {\n  textfield = /** @type {!HTMLInputElement|!HTMLTextAreaElement} */ (textfield);\n  var startPos = 0;\n  var endPos = 0;\n  if (goog.dom.selection.useSelectionProperties_(textfield)) {\n    startPos = textfield.selectionStart;\n    endPos = getOnlyStart ? -1 : textfield.selectionEnd;\n  } else if (goog.dom.selection.isLegacyIe_()) {\n    var tmp = goog.dom.selection.getRangeIe_(textfield);\n    var range = tmp[0];\n    var selectionRange = tmp[1];\n\n    if (range.inRange(selectionRange)) {\n      range.setEndPoint('EndToStart', selectionRange);\n      if (textfield.type == goog.dom.InputType.TEXTAREA) {\n        return goog.dom.selection.getEndPointsTextareaIe_(\n            range, selectionRange, getOnlyStart);\n      }\n      startPos = range.text.length;\n      if (!getOnlyStart) {\n        endPos = range.text.length + selectionRange.text.length;\n      } else {\n        endPos = -1;  // caller did not ask for end position\n      }\n    }\n  }\n  return [startPos, endPos];\n};\n\n\n/**\n * Sets the place where the selection should end inside a text area or a text\n * input\n * @param {Element} textfield A textarea or text input.\n * @param {number} pos The position to end the selection at.\n */\ngoog.dom.selection.setEnd = function(textfield, pos) {\n  if (goog.dom.selection.useSelectionProperties_(textfield)) {\n    textfield.selectionEnd = pos;\n  } else if (goog.dom.selection.isLegacyIe_()) {\n    var tmp = goog.dom.selection.getRangeIe_(textfield);\n    var range = tmp[0];\n    var selectionRange = tmp[1];\n\n    if (range.inRange(selectionRange)) {\n      // Both the current position and the start cursor position need\n      // to be canonicalized to take care of possible \\r\\n miscounts.\n      pos = goog.dom.selection.canonicalizePositionIe_(textfield, pos);\n      var startCursorPos = goog.dom.selection.canonicalizePositionIe_(\n          textfield, goog.dom.selection.getStart(textfield));\n\n      selectionRange.collapse(true);\n      selectionRange.moveEnd('character', pos - startCursorPos);\n      selectionRange.select();\n    }\n  }\n};\n\n\n/**\n * Returns the place where the selection ends inside a textarea or a text input\n * @param {Element} textfield A textarea or text input.\n * @return {number} The position where the selection ends or 0 if it was\n *     unable to find the position or no selection exists.\n */\ngoog.dom.selection.getEnd = function(textfield) {\n  return goog.dom.selection.getEndPoints_(textfield, false)[1];\n};\n\n\n/**\n * Sets the cursor position within a textfield.\n * @param {Element} textfield A textarea or text input.\n * @param {number} pos The position within the text field.\n */\ngoog.dom.selection.setCursorPosition = function(textfield, pos) {\n  if (goog.dom.selection.useSelectionProperties_(textfield)) {\n    // Mozilla directly supports this\n    textfield.selectionStart = pos;\n    textfield.selectionEnd = pos;\n\n  } else if (goog.dom.selection.isLegacyIe_()) {\n    pos = goog.dom.selection.canonicalizePositionIe_(textfield, pos);\n\n    // IE has textranges. A textfield's textrange encompasses the\n    // entire textfield's text by default\n    var sel = textfield.createTextRange();\n\n    sel.collapse(true);\n    sel.move('character', pos);\n    sel.select();\n  }\n};\n\n\n/**\n * Sets the selected text inside a textarea or a text input\n * @param {Element} textfield A textarea or text input.\n * @param {string} text The text to change the selection to.\n */\ngoog.dom.selection.setText = function(textfield, text) {\n  textfield = /** @type {!HTMLInputElement|!HTMLTextAreaElement} */ (textfield);\n  if (goog.dom.selection.useSelectionProperties_(textfield)) {\n    var value = textfield.value;\n    var oldSelectionStart = textfield.selectionStart;\n    var before = value.substr(0, oldSelectionStart);\n    var after = value.substr(textfield.selectionEnd);\n    textfield.value = before + text + after;\n    textfield.selectionStart = oldSelectionStart;\n    textfield.selectionEnd = oldSelectionStart + text.length;\n  } else if (goog.dom.selection.isLegacyIe_()) {\n    var tmp = goog.dom.selection.getRangeIe_(textfield);\n    var range = tmp[0];\n    var selectionRange = tmp[1];\n\n    if (!range.inRange(selectionRange)) {\n      return;\n    }\n    // When we set the selection text the selection range is collapsed to the\n    // end. We therefore duplicate the current selection so we know where it\n    // started. Once we've set the selection text we move the start of the\n    // selection range to the old start\n    var range2 = selectionRange.duplicate();\n    selectionRange.text = text;\n    selectionRange.setEndPoint('StartToStart', range2);\n    selectionRange.select();\n  } else {\n    throw new Error('Cannot set the selection end');\n  }\n};\n\n\n/**\n * Returns the selected text inside a textarea or a text input\n * @param {Element} textfield A textarea or text input.\n * @return {string} The selected text.\n */\ngoog.dom.selection.getText = function(textfield) {\n  textfield = /** @type {!HTMLInputElement|!HTMLTextAreaElement} */ (textfield);\n  if (goog.dom.selection.useSelectionProperties_(textfield)) {\n    var s = textfield.value;\n    return s.substring(textfield.selectionStart, textfield.selectionEnd);\n  }\n\n  if (goog.dom.selection.isLegacyIe_()) {\n    var tmp = goog.dom.selection.getRangeIe_(textfield);\n    var range = tmp[0];\n    var selectionRange = tmp[1];\n\n    if (!range.inRange(selectionRange)) {\n      return '';\n    } else if (textfield.type == goog.dom.InputType.TEXTAREA) {\n      return goog.dom.selection.getSelectionRangeText_(selectionRange);\n    }\n    return selectionRange.text;\n  }\n\n  throw new Error('Cannot get the selection text');\n};\n\n\n/**\n * Returns the selected text within a textarea in IE.\n * IE treats newline characters as \\r\\n characters, and we need to check for\n * these characters at the edge of our selection, to ensure that we return the\n * right string.\n * @param {TextRange} selRange Selected range object.\n * @return {string} Selected text in the textarea.\n * @private\n */\ngoog.dom.selection.getSelectionRangeText_ = function(selRange) {\n  // Create a duplicate of the selected range object to perform our actions\n  // against. Suppose the text in the textarea is \"Hello\\r\\nWorld\" and the\n  // selection encompasses the \"o\\r\\n\" bit, initial selectionRange will be \"o\"\n  // (assuming that the cursor is just after the \\r\\n combination)\n  var selectionRange = selRange.duplicate();\n\n  // Text within the selection , e.g. \"o\" assuming that the cursor is just after\n  // the \\r\\n combination.\n  var selectionText = selectionRange.text;\n  // Text within the selection, e.g.,  \"o\" (this will later include the \\r\\n\n  // sequences also)\n  var untrimmedSelectionText = selectionText;\n\n  // Boolean indicating whether we are done dealing with the text inside the\n  // selection.\n  var isSelectionRangeEndTrimmed = false;\n  // Go over the selected range until it becomes a 0-lengthed range or until\n  // the range text starts changing when we move the end back by one character.\n  // If after moving the end back by one character, the text remains the same,\n  // then we need to add a \"\\r\\n\" at the end to get the actual text.\n  while (!isSelectionRangeEndTrimmed) {\n    if (selectionRange.compareEndPoints('StartToEnd', selectionRange) == 0) {\n      isSelectionRangeEndTrimmed = true;\n    } else {\n      selectionRange.moveEnd('character', -1);\n      if (selectionRange.text == selectionText) {\n        // If the selection was not empty, and the end point of the selection\n        // was just after a \\r\\n, we would have skipped it in one go with the\n        // moveEnd call, and this implies that we should add a \\r\\n to the\n        // untrimmedSelectionText string.\n        untrimmedSelectionText += '\\r\\n';\n      } else {\n        isSelectionRangeEndTrimmed = true;\n      }\n    }\n  }\n  return untrimmedSelectionText;\n};\n\n\n/**\n * Helper function for returning the range for an object as well as the\n * selection range\n * @private\n * @param {Element} el The element to get the range for.\n * @return {!Array<TextRange>} Range of object and selection range in two\n *     element array.\n */\ngoog.dom.selection.getRangeIe_ = function(el) {\n  var doc = el.ownerDocument || el.document;\n\n  var selectionRange = doc.selection.createRange();\n  // el.createTextRange() doesn't work on textareas\n  var range;\n\n  if (/** @type {?} */ (el).type == goog.dom.InputType.TEXTAREA) {\n    range = doc.body.createTextRange();\n    range.moveToElementText(el);\n  } else {\n    range = el.createTextRange();\n  }\n\n  return [range, selectionRange];\n};\n\n\n/**\n * Helper function for canonicalizing a position inside a textfield in IE.\n * Deals with the issue that \\r\\n counts as 2 characters, but\n * move('character', n) passes over both characters in one move.\n * @private\n * @param {Element} textfield The text element.\n * @param {number} pos The position desired in that element.\n * @return {number} The canonicalized position that will work properly with\n *     move('character', pos).\n */\ngoog.dom.selection.canonicalizePositionIe_ = function(textfield, pos) {\n  textfield = /** @type {!HTMLTextAreaElement} */ (textfield);\n  if (textfield.type == goog.dom.InputType.TEXTAREA) {\n    // We do this only for textarea because it is the only one which can\n    // have a \\r\\n (input cannot have this).\n    var value = textfield.value.substring(0, pos);\n    pos = goog.string.canonicalizeNewlines(value).length;\n  }\n  return pos;\n};\n\n\n/**\n * Helper function to determine whether it's okay to use\n * selectionStart/selectionEnd.\n *\n * @param {Element} el The element to check for.\n * @return {boolean} Whether it's okay to use the selectionStart and\n *     selectionEnd properties on `el`.\n * @private\n */\ngoog.dom.selection.useSelectionProperties_ = function(el) {\n  try {\n    return typeof el.selectionStart == 'number';\n  } catch (e) {\n    // Firefox throws an exception if you try to access selectionStart\n    // on an element with display: none.\n    return false;\n  }\n};\n\n\n/**\n * Whether the client is legacy IE which does not support\n * selectionStart/selectionEnd properties of a text input element.\n *\n * @see https://msdn.microsoft.com/en-us/library/ff974768(v=vs.85).aspx\n *\n * @return {boolean} Whether the client is a legacy version of IE.\n * @private\n */\ngoog.dom.selection.isLegacyIe_ = function() {\n  return goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9');\n};\n","^9I",1579837703000,"^9J",["^9K",["^9L","^GL","^9>","^:S"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/selection.js"],"^:1",["^9K",["~$goog.dom.selection"]],"^9<",true,"^9=",["^9>","^GL","^9L","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.style.cursor.js","^9C",["^9D","goog/style/cursor.js"],"^9E","goog/style/cursor.js","^9F","^9G","^9H","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions to create special cursor styles, like \"draggable\"\n * (open hand) or \"dragging\" (closed hand).\n *\n * @author dgajda@google.com (Damian Gajda) Ported to closure.\n */\n\ngoog.provide('goog.style.cursor');\n\ngoog.require('goog.userAgent');\n\n\n/**\n * The file name for the open-hand (draggable) cursor.\n * @type {string}\n */\ngoog.style.cursor.OPENHAND_FILE = 'openhand.cur';\n\n\n/**\n * The file name for the close-hand (dragging) cursor.\n * @type {string}\n */\ngoog.style.cursor.CLOSEDHAND_FILE = 'closedhand.cur';\n\n\n/**\n * Create the style for the draggable cursor based on browser and OS.\n * The value can be extended to be '!important' if needed.\n *\n * @param {string} absoluteDotCurFilePath The absolute base path of\n *     'openhand.cur' file to be used if the browser supports it.\n * @param {boolean=} opt_obsolete Just for compiler backward compatibility.\n * @return {string} The \"draggable\" mouse cursor style value.\n */\ngoog.style.cursor.getDraggableCursorStyle = function(\n    absoluteDotCurFilePath, opt_obsolete) {\n  return goog.style.cursor.getCursorStyle_(\n      '-moz-grab', absoluteDotCurFilePath + goog.style.cursor.OPENHAND_FILE,\n      'default');\n};\n\n\n/**\n * Create the style for the dragging cursor based on browser and OS.\n * The value can be extended to be '!important' if needed.\n *\n * @param {string} absoluteDotCurFilePath The absolute base path of\n *     'closedhand.cur' file to be used if the browser supports it.\n * @param {boolean=} opt_obsolete Just for compiler backward compatibility.\n * @return {string} The \"dragging\" mouse cursor style value.\n */\ngoog.style.cursor.getDraggingCursorStyle = function(\n    absoluteDotCurFilePath, opt_obsolete) {\n  return goog.style.cursor.getCursorStyle_(\n      '-moz-grabbing',\n      absoluteDotCurFilePath + goog.style.cursor.CLOSEDHAND_FILE, 'move');\n};\n\n\n/**\n * Create the style for the cursor based on browser and OS.\n *\n * @param {string} geckoNonWinBuiltInStyleValue The Gecko on non-Windows OS,\n *     built in cursor style.\n * @param {string} absoluteDotCurFilePath The .cur file absolute file to be\n *     used if the browser supports it.\n * @param {string} defaultStyle The default fallback cursor style.\n * @return {string} The computed mouse cursor style value.\n * @private\n */\ngoog.style.cursor.getCursorStyle_ = function(\n    geckoNonWinBuiltInStyleValue, absoluteDotCurFilePath, defaultStyle) {\n  // Use built in cursors for Gecko on non Windows OS.\n  // We prefer our custom cursor, but Firefox Mac and Firefox Linux\n  // cannot do custom cursors. They do have a built-in hand, so use it:\n  if (goog.userAgent.GECKO && !goog.userAgent.WINDOWS) {\n    return geckoNonWinBuiltInStyleValue;\n  }\n\n  // Use the custom cursor file.\n  var cursorStyleValue = 'url(\"' + absoluteDotCurFilePath + '\")';\n  // Change hot-spot for Safari.\n  if (goog.userAgent.WEBKIT) {\n    // Safari seems to ignore the hotspot specified in the .cur file (it uses\n    // 0,0 instead).  This causes the cursor to jump as it transitions between\n    // openhand and pointer which is especially annoying when trying to hover\n    // over the route for draggable routes.  We specify the hotspot here as 7,5\n    // in the css - unfortunately ie6 can't understand this and falls back to\n    // the builtin cursors so we just do this for safari (but ie DOES correctly\n    // use the hotspot specified in the file so this is ok).  The appropriate\n    // coordinates were determined by looking at a hex dump and the format\n    // description from wikipedia.\n    cursorStyleValue += ' 7 5';\n  }\n  // Add default cursor fallback.\n  cursorStyleValue += ', ' + defaultStyle;\n  return cursorStyleValue;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:S"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/style/cursor.js"],"^:1",["^9K",["~$goog.style.cursor"]],"^9<",true,"^9=",["^9>","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.style.app.buttonrenderer.js","^9C",["^9D","goog/ui/style/app/buttonrenderer.js"],"^9E","goog/ui/style/app/buttonrenderer.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for {@link goog.ui.Button}s in App style.\n *\n * Based on ImagelessButtonRender. Uses even more CSS voodoo than the default\n * implementation to render custom buttons with fake rounded corners and\n * dimensionality (via a subtle flat shadow on the bottom half of the button)\n * without the use of images.\n *\n * Based on the Custom Buttons 3.1 visual specification, see\n * http://go/custombuttons\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.ui.style.app.ButtonRenderer');\n\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.ui.Button');\ngoog.require('goog.ui.CustomButtonRenderer');\ngoog.require('goog.ui.INLINE_BLOCK_CLASSNAME');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Custom renderer for {@link goog.ui.Button}s. Imageless buttons can contain\n * almost arbitrary HTML content, will flow like inline elements, but can be\n * styled like block-level elements.\n *\n * @constructor\n * @extends {goog.ui.CustomButtonRenderer}\n */\ngoog.ui.style.app.ButtonRenderer = function() {\n  goog.ui.CustomButtonRenderer.call(this);\n};\ngoog.inherits(goog.ui.style.app.ButtonRenderer, goog.ui.CustomButtonRenderer);\ngoog.addSingletonGetter(goog.ui.style.app.ButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.style.app.ButtonRenderer.CSS_CLASS = goog.getCssName('goog-button');\n\n\n/**\n * Array of arrays of CSS classes that we want composite classes added and\n * removed for in IE6 and lower as a workaround for lack of multi-class CSS\n * selector support.\n * @type {Array<Array<string>>}\n */\ngoog.ui.style.app.ButtonRenderer.IE6_CLASS_COMBINATIONS = [];\n\n\n/**\n * Returns the button's contents wrapped in the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-button-base goog-button\">\n *      <div class=\"goog-inline-block goog-button-base-outer-box\">\n *        <div class=\"goog-button-base-inner-box\">\n *          <div class=\"goog-button-base-pos\">\n *            <div class=\"goog-button-base-top-shadow\">&nbsp;</div>\n *            <div class=\"goog-button-base-content\">Contents...</div>\n *          </div>\n *        </div>\n *      </div>\n *    </div>\n * @override\n */\ngoog.ui.style.app.ButtonRenderer.prototype.createDom;\n\n\n/** @override */\ngoog.ui.style.app.ButtonRenderer.prototype.getContentElement = function(\n    element) {\n  return element && /** @type {Element} */ (\n                        element.firstChild.firstChild.firstChild.lastChild);\n};\n\n\n/**\n * Takes a text caption or existing DOM structure, and returns the content\n * wrapped in a pseudo-rounded-corner box.  Creates the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-button-base-outer-box\">\n *      <div class=\"goog-inline-block goog-button-base-inner-box\">\n *        <div class=\"goog-button-base-pos\">\n *          <div class=\"goog-button-base-top-shadow\">&nbsp;</div>\n *          <div class=\"goog-button-base-content\">Contents...</div>\n *        </div>\n *      </div>\n *    </div>\n *\n * Used by both {@link #createDom} and {@link #decorate}.  To be overridden\n * by subclasses.\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to wrap\n *     in a box.\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {Element} Pseudo-rounded-corner box containing the content.\n * @override\n */\ngoog.ui.style.app.ButtonRenderer.prototype.createButton = function(\n    content, dom) {\n  var baseClass = this.getStructuralCssClass();\n  var inlineBlock = goog.ui.INLINE_BLOCK_CLASSNAME + ' ';\n  return dom.createDom(\n      goog.dom.TagName.DIV,\n      inlineBlock + goog.getCssName(baseClass, 'outer-box'),\n      dom.createDom(\n          goog.dom.TagName.DIV,\n          inlineBlock + goog.getCssName(baseClass, 'inner-box'),\n          dom.createDom(\n              goog.dom.TagName.DIV, goog.getCssName(baseClass, 'pos'),\n              dom.createDom(\n                  goog.dom.TagName.DIV,\n                  goog.getCssName(baseClass, 'top-shadow'), '\\u00A0'),\n              dom.createDom(\n                  goog.dom.TagName.DIV, goog.getCssName(baseClass, 'content'),\n                  content))));\n};\n\n\n/**\n * Check if the button's element has a box structure.\n * @param {goog.ui.Button} button Button instance whose structure is being\n *     checked.\n * @param {Element} element Element of the button.\n * @return {boolean} Whether the element has a box structure.\n * @protected\n * @override\n */\ngoog.ui.style.app.ButtonRenderer.prototype.hasBoxStructure = function(\n    button, element) {\n\n  var baseClass = this.getStructuralCssClass();\n  var outer = button.getDomHelper().getFirstElementChild(element);\n  var outerClassName = goog.getCssName(baseClass, 'outer-box');\n  if (outer && goog.dom.classlist.contains(outer, outerClassName)) {\n    var inner = button.getDomHelper().getFirstElementChild(outer);\n    var innerClassName = goog.getCssName(baseClass, 'inner-box');\n    if (inner && goog.dom.classlist.contains(inner, innerClassName)) {\n      var pos = button.getDomHelper().getFirstElementChild(inner);\n      var posClassName = goog.getCssName(baseClass, 'pos');\n      if (pos && goog.dom.classlist.contains(pos, posClassName)) {\n        var shadow = button.getDomHelper().getFirstElementChild(pos);\n        var shadowClassName = goog.getCssName(baseClass, 'top-shadow');\n        if (shadow && goog.dom.classlist.contains(shadow, shadowClassName)) {\n          var content = button.getDomHelper().getNextElementSibling(shadow);\n          var contentClassName = goog.getCssName(baseClass, 'content');\n          if (content &&\n              goog.dom.classlist.contains(content, contentClassName)) {\n            // We have a proper box structure.\n            return true;\n          }\n        }\n      }\n    }\n  }\n  return false;\n};\n\n\n/** @override */\ngoog.ui.style.app.ButtonRenderer.prototype.getCssClass = function() {\n  return goog.ui.style.app.ButtonRenderer.CSS_CLASS;\n};\n\n\n/** @override */\ngoog.ui.style.app.ButtonRenderer.prototype.getStructuralCssClass = function() {\n  // TODO(user): extract to a constant.\n  return goog.getCssName('goog-button-base');\n};\n\n\n/** @override */\ngoog.ui.style.app.ButtonRenderer.prototype.getIe6ClassCombinations =\n    function() {\n  return goog.ui.style.app.ButtonRenderer.IE6_CLASS_COMBINATIONS;\n};\n\n\n\n// Register a decorator factory function for goog.ui.style.app.ButtonRenderer.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.style.app.ButtonRenderer.CSS_CLASS, function() {\n      return new goog.ui.Button(\n          null, goog.ui.style.app.ButtonRenderer.getInstance());\n    });\n","^9I",1579837703000,"^9J",["^9K",["^:;","^9>","^:>","^GG","~$goog.ui.Button","^GH","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/style/app/buttonrenderer.js"],"^:1",["^9K",["~$goog.ui.style.app.ButtonRenderer"]],"^9<",true,"^9=",["^9>","^;=","^:;","^JU","^GG","^GH","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.module.moduleinfo.js","^9C",["^9D","goog/module/moduleinfo.js"],"^9E","goog/module/moduleinfo.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines the goog.module.ModuleInfo class.\n *\n */\n\ngoog.provide('goog.module.ModuleInfo');\n\ngoog.forwardDeclare('goog.loader.AbstractModuleManager.FailureType');\ngoog.require('goog.Disposable');\ngoog.require('goog.async.throwException');\ngoog.require('goog.functions');\ngoog.require('goog.html.TrustedResourceUrl');\n/** @suppress {extraRequire} */\ngoog.require('goog.module');\ngoog.require('goog.module.BaseModule');\ngoog.require('goog.module.ModuleLoadCallback');\n\n\n\n/**\n * A ModuleInfo object is used by the ModuleManager to hold information about a\n * module of js code that may or may not yet be loaded into the environment.\n *\n * @param {Array<string>} deps Ids of the modules that must be loaded before\n *     this one. The ids must be in dependency order (i.e. if the ith module\n *     depends on the jth module, then i > j).\n * @param {string} id The module's ID.\n * @constructor\n * @extends {goog.Disposable}\n * @final\n */\ngoog.module.ModuleInfo = function(deps, id) {\n  goog.Disposable.call(this);\n\n  /**\n   * A list of the ids of the modules that must be loaded before this module.\n   * @type {Array<string>}\n   * @private\n   */\n  this.deps_ = deps;\n\n  /**\n   * The module's ID.\n   * @type {string}\n   * @private\n   */\n  this.id_ = id;\n\n  /**\n   * Callbacks to execute once this module is loaded.\n   * @type {Array<goog.module.ModuleLoadCallback>}\n   * @private\n   */\n  this.onloadCallbacks_ = [];\n\n  /**\n   * Callbacks to execute if the module load errors.\n   * @type {Array<goog.module.ModuleLoadCallback>}\n   * @private\n   */\n  this.onErrorCallbacks_ = [];\n\n  /**\n   * Early callbacks to execute once this module is loaded. Called after\n   * module initialization but before regular onload callbacks.\n   * @type {Array<goog.module.ModuleLoadCallback>}\n   * @private\n   */\n  this.earlyOnloadCallbacks_ = [];\n};\ngoog.inherits(goog.module.ModuleInfo, goog.Disposable);\n\n\n/**\n * The uris that can be used to retrieve this module's code.\n * @type {?Array<!goog.html.TrustedResourceUrl>}\n * @private\n */\ngoog.module.ModuleInfo.prototype.uris_ = null;\n\n\n/**\n * The constructor to use to instantiate the module object after the module\n * code is loaded. This must be either goog.module.BaseModule or a subclass of\n * it.\n * @type {Function}\n * @private\n */\ngoog.module.ModuleInfo.prototype.moduleConstructor_ = goog.module.BaseModule;\n\n\n/**\n * The module object. This will be null until the module is loaded.\n * @type {goog.module.BaseModule?}\n * @private\n */\ngoog.module.ModuleInfo.prototype.module_ = null;\n\n\n/**\n * Gets the dependencies of this module.\n * @return {Array<string>} The ids of the modules that this module depends on.\n */\ngoog.module.ModuleInfo.prototype.getDependencies = function() {\n  return this.deps_;\n};\n\n\n/**\n * Gets the ID of this module.\n * @return {string} The ID.\n */\ngoog.module.ModuleInfo.prototype.getId = function() {\n  return this.id_;\n};\n\n\n/**\n * Sets the uris of this module.\n * @param {!Array<!goog.html.TrustedResourceUrl>} uris Uris for this module's\n *     code.\n */\ngoog.module.ModuleInfo.prototype.setTrustedUris = function(uris) {\n  this.uris_ = uris;\n};\n\n\n/**\n * Gets the uris of this module.\n * @return {!Array<!goog.html.TrustedResourceUrl>} Uris for this module's code.\n */\ngoog.module.ModuleInfo.prototype.getUris = function() {\n  if (!this.uris_) {\n    this.uris_ = [];\n  }\n  return this.uris_;\n};\n\n\n/**\n * Sets the constructor to use to instantiate the module object after the\n * module code is loaded.\n * @param {Function} constructor The constructor of a goog.module.BaseModule\n *     subclass.\n */\ngoog.module.ModuleInfo.prototype.setModuleConstructor = function(constructor) {\n  if (this.moduleConstructor_ === goog.module.BaseModule) {\n    this.moduleConstructor_ = constructor;\n  } else {\n    throw new Error('Cannot set module constructor more than once.');\n  }\n};\n\n\n/**\n * Registers a function that should be called after the module is loaded. These\n * early callbacks are called after {@link Module#initialize} is called but\n * before the other callbacks are called.\n * @param {Function} fn A callback function that takes a single argument which\n *    is the module context.\n * @param {Object=} opt_handler Optional handler under whose scope to execute\n *     the callback.\n * @return {!goog.module.ModuleLoadCallback} Reference to the callback\n *     object.\n */\ngoog.module.ModuleInfo.prototype.registerEarlyCallback = function(\n    fn, opt_handler) {\n  return this.registerCallback_(this.earlyOnloadCallbacks_, fn, opt_handler);\n};\n\n\n/**\n * Registers a function that should be called after the module is loaded.\n * @param {Function} fn A callback function that takes a single argument which\n *    is the module context.\n * @param {Object=} opt_handler Optional handler under whose scope to execute\n *     the callback.\n * @return {!goog.module.ModuleLoadCallback} Reference to the callback\n *     object.\n */\ngoog.module.ModuleInfo.prototype.registerCallback = function(fn, opt_handler) {\n  return this.registerCallback_(this.onloadCallbacks_, fn, opt_handler);\n};\n\n\n/**\n * Registers a function that should be called if the module load fails.\n * @param {Function} fn A callback function that takes a single argument which\n *    is the failure type.\n * @param {Object=} opt_handler Optional handler under whose scope to execute\n *     the callback.\n * @return {!goog.module.ModuleLoadCallback} Reference to the callback\n *     object.\n */\ngoog.module.ModuleInfo.prototype.registerErrback = function(fn, opt_handler) {\n  return this.registerCallback_(this.onErrorCallbacks_, fn, opt_handler);\n};\n\n\n/**\n * Registers a function that should be called after the module is loaded.\n * @param {Array<goog.module.ModuleLoadCallback>} callbacks The array to\n *     add the callback to.\n * @param {Function} fn A callback function that takes a single argument which\n *     is the module context.\n * @param {Object=} opt_handler Optional handler under whose scope to execute\n *     the callback.\n * @return {!goog.module.ModuleLoadCallback} Reference to the callback\n *     object.\n * @private\n */\ngoog.module.ModuleInfo.prototype.registerCallback_ = function(\n    callbacks, fn, opt_handler) {\n  var callback = new goog.module.ModuleLoadCallback(fn, opt_handler);\n  callbacks.push(callback);\n  return callback;\n};\n\n\n/**\n * Determines whether the module has been loaded.\n * @return {boolean} Whether the module has been loaded.\n */\ngoog.module.ModuleInfo.prototype.isLoaded = function() {\n  return !!this.module_;\n};\n\n\n/**\n * Marks the current module as loaded. This is useful for subtractive module\n * loading, where occasionally we need to fallback to normal module loading,\n * and re-fetch the module graph. In this case, we need a way to tell the module\n * manager to mark all modules that are already loaded.\n */\ngoog.module.ModuleInfo.prototype.setLoaded = function() {\n  this.module_ = new goog.module.BaseModule();\n};\n\n\n/**\n * Gets the module.\n * @return {goog.module.BaseModule?} The module if it has been loaded.\n *     Otherwise, null.\n */\ngoog.module.ModuleInfo.prototype.getModule = function() {\n  return this.module_;\n};\n\n\n/**\n * Sets this module as loaded.\n * @param {function() : Object} contextProvider A function that provides the\n *     module context.\n * @return {boolean} Whether any errors occurred while executing the onload\n *     callbacks.\n */\ngoog.module.ModuleInfo.prototype.onLoad = function(contextProvider) {\n  // Instantiate and initialize the module object.\n  var module = new this.moduleConstructor_;\n  module.initialize(contextProvider());\n\n  // Keep an internal reference to the module.\n  this.module_ = module;\n\n  // Fire any early callbacks that were waiting for the module to be loaded.\n  var errors =\n      !!this.callCallbacks_(this.earlyOnloadCallbacks_, contextProvider());\n\n  // Fire any callbacks that were waiting for the module to be loaded.\n  errors =\n      errors || !!this.callCallbacks_(this.onloadCallbacks_, contextProvider());\n\n  if (!errors) {\n    // Clear the errbacks.\n    this.onErrorCallbacks_.length = 0;\n  }\n\n  return errors;\n};\n\n\n/**\n * Calls the error callbacks for the module.\n * @param {goog.loader.AbstractModuleManager.FailureType} cause What caused the\n *     error.\n */\ngoog.module.ModuleInfo.prototype.onError = function(cause) {\n  var result = this.callCallbacks_(this.onErrorCallbacks_, cause);\n  if (result) {\n    // Throw an exception asynchronously. Do not let the exception leak\n    // up to the caller, or it will blow up the module loading framework.\n    window.setTimeout(\n        goog.functions.error('Module errback failures: ' + result), 0);\n  }\n  this.earlyOnloadCallbacks_.length = 0;\n  this.onloadCallbacks_.length = 0;\n};\n\n\n/**\n * Helper to call the callbacks after module load.\n * @param {Array<goog.module.ModuleLoadCallback>} callbacks The callbacks\n *     to call and then clear.\n * @param {*} context The module context.\n * @return {Array<*>} Any errors encountered while calling the callbacks,\n *     or null if there were no errors.\n * @private\n */\ngoog.module.ModuleInfo.prototype.callCallbacks_ = function(callbacks, context) {\n  // NOTE(nicksantos):\n  // In practice, there are two error-handling scenarios:\n  // 1) The callback does some mandatory initialization of the module.\n  // 2) The callback is for completion of some optional UI event.\n  // There's no good way to handle both scenarios.\n  //\n  // Our strategy here is to protect module manager from exceptions, so that\n  // the failure of one module doesn't affect the loading of other modules.\n  // Errors are thrown outside of the current stack frame, so they still\n  // get reported but don't interrupt execution.\n\n  // Call each callback in the order they were registered\n  var errors = [];\n  for (var i = 0; i < callbacks.length; i++) {\n    try {\n      callbacks[i].execute(context);\n    } catch (e) {\n      goog.async.throwException(e);\n      errors.push(e);\n    }\n  }\n\n  // Clear the list of callbacks.\n  callbacks.length = 0;\n  return errors.length ? errors : null;\n};\n\n\n/** @override */\ngoog.module.ModuleInfo.prototype.disposeInternal = function() {\n  goog.module.ModuleInfo.superClass_.disposeInternal.call(this);\n  goog.dispose(this.module_);\n};\n","^9I",1579837703000,"^9J",["^9K",["^=I","^;<","^?:","^?;","^J0","^9>","~$goog.module.BaseModule","^:7"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/module/moduleinfo.js"],"^:1",["^9K",["^H6"]],"^9<",true,"^9=",["^9>","^:7","^J0","^;<","^=I","^?:","^JW","^?;"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.button.js","^9C",["^9D","goog/ui/button.js"],"^9E","goog/ui/button.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A button control. This implementation extends {@link\n * goog.ui.Control}.\n *\n * @author attila@google.com (Attila Bodis)\n * @see ../demos/button.html\n */\n\ngoog.provide('goog.ui.Button');\ngoog.provide('goog.ui.Button.Side');\n\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.events.KeyHandler');\ngoog.require('goog.ui.ButtonRenderer');\ngoog.require('goog.ui.ButtonSide');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Control');\ngoog.require('goog.ui.NativeButtonRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * A button control, rendered as a native browser button by default.\n *\n * @param {goog.ui.ControlContent=} opt_content Text caption or existing DOM\n *     structure to display as the button's caption (if any).\n * @param {goog.ui.ButtonRenderer=} opt_renderer Renderer used to render or\n *     decorate the button; defaults to {@link goog.ui.NativeButtonRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.Control}\n */\ngoog.ui.Button = function(opt_content, opt_renderer, opt_domHelper) {\n  goog.ui.Control.call(\n      this, opt_content,\n      opt_renderer || goog.ui.NativeButtonRenderer.getInstance(),\n      opt_domHelper);\n};\ngoog.inherits(goog.ui.Button, goog.ui.Control);\ngoog.tagUnsealableClass(goog.ui.Button);\n\n\n/**\n * Constants for button sides, see {@link goog.ui.Button.prototype.setCollapsed}\n * for details. Aliased from goog.ui.ButtonSide to support legacy users without\n * creating a circular dependency in {@link goog.ui.ButtonRenderer}.\n * @enum {number}\n * @deprecated use {@link goog.ui.ButtonSide} instead.\n */\ngoog.ui.Button.Side = goog.ui.ButtonSide;\n\n\n/**\n * Value associated with the button.\n * @type {*}\n * @private\n */\ngoog.ui.Button.prototype.value_;\n\n\n/**\n * Tooltip text for the button, displayed on hover.\n * @type {string|undefined}\n * @private\n */\ngoog.ui.Button.prototype.tooltip_;\n\n\n// goog.ui.Button API implementation.\n\n\n/**\n * Returns the value associated with the button.\n * @return {*} Button value (undefined if none).\n */\ngoog.ui.Button.prototype.getValue = function() {\n  return this.value_;\n};\n\n\n/**\n * Sets the value associated with the button, and updates its DOM.\n * @param {*} value New button value.\n */\ngoog.ui.Button.prototype.setValue = function(value) {\n  this.value_ = value;\n  var renderer = /** @type {!goog.ui.ButtonRenderer} */ (this.getRenderer());\n  renderer.setValue(this.getElement(), /** @type {string} */ (value));\n};\n\n\n/**\n * Sets the value associated with the button.  Unlike {@link #setValue},\n * doesn't update the button's DOM.  Considered protected; to be called only\n * by renderer code during element decoration.\n * @param {*} value New button value.\n * @protected\n */\ngoog.ui.Button.prototype.setValueInternal = function(value) {\n  this.value_ = value;\n};\n\n\n/**\n * Returns the tooltip for the button.\n * @return {string|undefined} Tooltip text (undefined if none).\n */\ngoog.ui.Button.prototype.getTooltip = function() {\n  return this.tooltip_;\n};\n\n\n/**\n * Sets the tooltip for the button, and updates its DOM.\n * @param {string} tooltip New tooltip text.\n */\ngoog.ui.Button.prototype.setTooltip = function(tooltip) {\n  this.tooltip_ = tooltip;\n  this.getRenderer().setTooltip(this.getElement(), tooltip);\n};\n\n\n/**\n * Sets the tooltip for the button.  Unlike {@link #setTooltip}, doesn't update\n * the button's DOM.  Considered protected; to be called only by renderer code\n * during element decoration.\n * @param {string} tooltip New tooltip text.\n * @protected\n */\ngoog.ui.Button.prototype.setTooltipInternal = function(tooltip) {\n  this.tooltip_ = tooltip;\n};\n\n\n/**\n * Collapses the border on one or both sides of the button, allowing it to be\n * combined with the adjancent button(s), forming a single UI componenet with\n * multiple targets.\n * @param {number} sides Bitmap of one or more {@link goog.ui.ButtonSide}s for\n *     which borders should be collapsed.\n */\ngoog.ui.Button.prototype.setCollapsed = function(sides) {\n  this.getRenderer().setCollapsed(this, sides);\n};\n\n\n// goog.ui.Control & goog.ui.Component API implementation.\n\n\n/** @override */\ngoog.ui.Button.prototype.disposeInternal = function() {\n  goog.ui.Button.superClass_.disposeInternal.call(this);\n  delete this.value_;\n  delete this.tooltip_;\n};\n\n\n/** @override */\ngoog.ui.Button.prototype.enterDocument = function() {\n  goog.ui.Button.superClass_.enterDocument.call(this);\n  if (this.isSupportedState(goog.ui.Component.State.FOCUSED)) {\n    var keyTarget = this.getKeyEventTarget();\n    if (keyTarget) {\n      this.getHandler().listen(\n          keyTarget, goog.events.EventType.KEYUP, this.handleKeyEventInternal);\n    }\n  }\n};\n\n\n/**\n * Attempts to handle a keyboard event; returns true if the event was handled,\n * false otherwise.  If the button is enabled and the Enter/Space key was\n * pressed, handles the event by dispatching an `ACTION` event,\n * and returns true. Overrides {@link goog.ui.Control#handleKeyEventInternal}.\n * @param {goog.events.KeyEvent} e Key event to handle.\n * @return {boolean} Whether the key event was handled.\n * @protected\n * @override\n */\ngoog.ui.Button.prototype.handleKeyEventInternal = function(e) {\n  if (e.keyCode == goog.events.KeyCodes.ENTER &&\n          e.type == goog.events.KeyHandler.EventType.KEY ||\n      e.keyCode == goog.events.KeyCodes.SPACE &&\n          e.type == goog.events.EventType.KEYUP) {\n    return this.performActionInternal(e);\n  }\n  // Return true for space keypress (even though the event is handled on keyup)\n  // as preventDefault needs to be called up keypress to take effect in IE and\n  // WebKit.\n  return e.keyCode == goog.events.KeyCodes.SPACE;\n};\n\n\n// Register a decorator factory function for goog.ui.Buttons.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.ButtonRenderer.CSS_CLASS,\n    function() { return new goog.ui.Button(null); });\n","^9I",1579837703000,"^9J",["^9K",["~$goog.ui.ButtonSide","^:=","^?I","^9>","^:>","~$goog.ui.NativeButtonRenderer","^:I","~$goog.ui.ButtonRenderer","^=T","^>R"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/button.js"],"^:1",["^9K",["~$goog.ui.Button.Side","^JU"]],"^9<",true,"^9=",["^9>","^:I","^>R","^?I","^JZ","^JX","^:=","^=T","^JY","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.storage.mechanism.html5webstorage.js","^9C",["^9D","goog/storage/mechanism/html5webstorage.js"],"^9E","goog/storage/mechanism/html5webstorage.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Base class that implements functionality common\n * across both session and local web storage mechanisms.\n *\n */\n\ngoog.provide('goog.storage.mechanism.HTML5WebStorage');\n\ngoog.require('goog.asserts');\ngoog.require('goog.iter.Iterator');\ngoog.require('goog.iter.StopIteration');\ngoog.require('goog.storage.mechanism.ErrorCode');\ngoog.require('goog.storage.mechanism.IterableMechanism');\n\n\n\n/**\n * Provides a storage mechanism that uses HTML5 Web storage.\n *\n * @param {Storage} storage The Web storage object.\n * @constructor\n * @struct\n * @extends {goog.storage.mechanism.IterableMechanism}\n */\ngoog.storage.mechanism.HTML5WebStorage = function(storage) {\n  goog.storage.mechanism.HTML5WebStorage.base(this, 'constructor');\n\n  /**\n   * The web storage object (window.localStorage or window.sessionStorage).\n   * @private {Storage}\n   */\n  this.storage_ = storage;\n};\ngoog.inherits(\n    goog.storage.mechanism.HTML5WebStorage,\n    goog.storage.mechanism.IterableMechanism);\n\n\n/**\n * The key used to check if the storage instance is available.\n * @private {string}\n * @const\n */\ngoog.storage.mechanism.HTML5WebStorage.STORAGE_AVAILABLE_KEY_ = '__sak';\n\n\n/**\n * Determines whether or not the mechanism is available.\n * It works only if the provided web storage object exists and is enabled.\n *\n * @return {boolean} True if the mechanism is available.\n */\ngoog.storage.mechanism.HTML5WebStorage.prototype.isAvailable = function() {\n  if (!this.storage_) {\n    return false;\n  }\n\n  try {\n    // setItem will throw an exception if we cannot access WebStorage (e.g.,\n    // Safari in private mode).\n    this.storage_.setItem(\n        goog.storage.mechanism.HTML5WebStorage.STORAGE_AVAILABLE_KEY_, '1');\n    this.storage_.removeItem(\n        goog.storage.mechanism.HTML5WebStorage.STORAGE_AVAILABLE_KEY_);\n    return true;\n  } catch (e) {\n    return false;\n  }\n};\n\n\n/** @override */\ngoog.storage.mechanism.HTML5WebStorage.prototype.set = function(key, value) {\n\n  try {\n    // May throw an exception if storage quota is exceeded.\n    this.storage_.setItem(key, value);\n  } catch (e) {\n    // In Safari Private mode, conforming to the W3C spec, invoking\n    // Storage.prototype.setItem will allways throw a QUOTA_EXCEEDED_ERR\n    // exception.  Since it's impossible to verify if we're in private browsing\n    // mode, we throw a different exception if the storage is empty.\n    if (this.storage_.length == 0) {\n      throw goog.storage.mechanism.ErrorCode.STORAGE_DISABLED;\n    } else {\n      throw goog.storage.mechanism.ErrorCode.QUOTA_EXCEEDED;\n    }\n  }\n};\n\n\n/** @override */\ngoog.storage.mechanism.HTML5WebStorage.prototype.get = function(key) {\n  // According to W3C specs, values can be of any type. Since we only save\n  // strings, any other type is a storage error. If we returned nulls for\n  // such keys, i.e., treated them as non-existent, this would lead to a\n  // paradox where a key exists, but it does not when it is retrieved.\n  // http://www.w3.org/TR/2009/WD-webstorage-20091029/#the-storage-interface\n  var value = this.storage_.getItem(key);\n  if (typeof value !== 'string' && value !== null) {\n    throw goog.storage.mechanism.ErrorCode.INVALID_VALUE;\n  }\n  return value;\n};\n\n\n/** @override */\ngoog.storage.mechanism.HTML5WebStorage.prototype.remove = function(key) {\n  this.storage_.removeItem(key);\n};\n\n\n/** @override */\ngoog.storage.mechanism.HTML5WebStorage.prototype.getCount = function() {\n  return this.storage_.length;\n};\n\n\n/** @override */\ngoog.storage.mechanism.HTML5WebStorage.prototype.__iterator__ = function(\n    opt_keys) {\n  var i = 0;\n  var storage = this.storage_;\n  var newIter = new goog.iter.Iterator();\n  newIter.next = function() {\n    if (i >= storage.length) {\n      throw goog.iter.StopIteration;\n    }\n    var key = goog.asserts.assertString(storage.key(i++));\n    if (opt_keys) {\n      return key;\n    }\n    var value = storage.getItem(key);\n    // The value must exist and be a string, otherwise it is a storage error.\n    if (typeof value !== 'string') {\n      throw goog.storage.mechanism.ErrorCode.INVALID_VALUE;\n    }\n    return value;\n  };\n  return newIter;\n};\n\n\n/** @override */\ngoog.storage.mechanism.HTML5WebStorage.prototype.clear = function() {\n  this.storage_.clear();\n};\n\n\n/**\n * Gets the key for a given key index. If an index outside of\n * [0..this.getCount()) is specified, this function returns null.\n * @param {number} index A key index.\n * @return {?string} A storage key, or null if the specified index is out of\n *     range.\n */\ngoog.storage.mechanism.HTML5WebStorage.prototype.key = function(index) {\n  return this.storage_.key(index);\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.storage.mechanism.IterableMechanism","^9>","^;J","^;K","~$goog.storage.mechanism.ErrorCode"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/mechanism/html5webstorage.js"],"^:1",["^9K",["~$goog.storage.mechanism.HTML5WebStorage"]],"^9<",true,"^9=",["^9>","^:E","^;K","^;J","^K1","^K0"]],["^ ","~:js-str-offsets",[],"~:classpath",true,"~:js-esm",false,"^9A",[1579837703000],"~:js-imports",[],"~:js-invalid-requires",[],"~:goog-provides",[],"~:js-language","es3","^;I",null,"~:ns","~$module$goog$deps","^9B","module$goog$deps.js","^9C",["^9D","goog/deps.js"],"^9E","goog/deps.js","^9F","~:js","~:js-requires",[],"^9H","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n//\n// This file has been auto-generated by GenJsDeps, please do not edit.\n\n// Disable Clang formatter for this file.\n// See http://goo.gl/SdiwZH\n// clang-format off\n\ngoog.addDependency('collections/sets.js', ['goog.collections.sets'], ['goog.labs.collections.iterables'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('collections/sets_test.js', ['goog.collections.setsTest'], ['goog.collections.sets', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('mochikit/async/deferred.js', ['goog.async.Deferred', 'goog.async.Deferred.AlreadyCalledError', 'goog.async.Deferred.CanceledError'], ['goog.Promise', 'goog.Thenable', 'goog.array', 'goog.asserts', 'goog.debug.Error'], {});\ngoog.addDependency('mochikit/async/deferred_async_test.js', ['goog.async.deferredAsyncTest'], ['goog.async.Deferred', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('mochikit/async/deferred_test.js', ['goog.async.deferredTest'], ['goog.Promise', 'goog.Thenable', 'goog.async.Deferred', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('mochikit/async/deferredlist.js', ['goog.async.DeferredList'], ['goog.async.Deferred'], {});\ngoog.addDependency('mochikit/async/deferredlist_test.js', ['goog.async.deferredListTest'], ['goog.array', 'goog.async.Deferred', 'goog.async.DeferredList', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('proto/proto.js', ['goog.proto'], ['goog.proto.Serializer'], {});\ngoog.addDependency('proto/serializer.js', ['goog.proto.Serializer'], ['goog.json.Serializer', 'goog.string'], {});\ngoog.addDependency('proto/serializer_test.js', ['goog.protoTest'], ['goog.proto', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('a11y/aria/announcer.js', ['goog.a11y.aria.Announcer'], ['goog.Disposable', 'goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.LivePriority', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.object'], {});\ngoog.addDependency('a11y/aria/announcer_test.js', ['goog.a11y.aria.AnnouncerTest'], ['goog.a11y.aria', 'goog.a11y.aria.Announcer', 'goog.a11y.aria.LivePriority', 'goog.a11y.aria.State', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.iframe', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('a11y/aria/aria.js', ['goog.a11y.aria'], ['goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.a11y.aria.datatables', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.object', 'goog.string'], {});\ngoog.addDependency('a11y/aria/aria_test.js', ['goog.a11y.ariaTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('a11y/aria/attributes.js', ['goog.a11y.aria.AutoCompleteValues', 'goog.a11y.aria.CheckedValues', 'goog.a11y.aria.DropEffectValues', 'goog.a11y.aria.ExpandedValues', 'goog.a11y.aria.GrabbedValues', 'goog.a11y.aria.InvalidValues', 'goog.a11y.aria.LivePriority', 'goog.a11y.aria.OrientationValues', 'goog.a11y.aria.PressedValues', 'goog.a11y.aria.RelevantValues', 'goog.a11y.aria.SelectedValues', 'goog.a11y.aria.SortValues', 'goog.a11y.aria.State'], [], {});\ngoog.addDependency('a11y/aria/datatables.js', ['goog.a11y.aria.datatables'], ['goog.a11y.aria.State', 'goog.object'], {});\ngoog.addDependency('a11y/aria/roles.js', ['goog.a11y.aria.Role'], [], {});\ngoog.addDependency('array/array.js', ['goog.array'], ['goog.asserts'], {});\ngoog.addDependency('array/array_test.js', ['goog.arrayTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.testing.PropertyReplacer', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es7', 'module': 'goog'});\ngoog.addDependency('asserts/asserts.js', ['goog.asserts', 'goog.asserts.AssertionError'], ['goog.debug.Error', 'goog.dom.NodeType'], {});\ngoog.addDependency('asserts/asserts_test.js', ['goog.assertsTest'], ['goog.asserts', 'goog.asserts.AssertionError', 'goog.dom', 'goog.dom.TagName', 'goog.reflect', 'goog.string', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('async/animationdelay.js', ['goog.async.AnimationDelay'], ['goog.Disposable', 'goog.events', 'goog.functions'], {});\ngoog.addDependency('async/animationdelay_test.js', ['goog.async.AnimationDelayTest'], ['goog.Promise', 'goog.Timer', 'goog.async.AnimationDelay', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('async/conditionaldelay.js', ['goog.async.ConditionalDelay'], ['goog.Disposable', 'goog.async.Delay'], {});\ngoog.addDependency('async/conditionaldelay_test.js', ['goog.async.ConditionalDelayTest'], ['goog.async.ConditionalDelay', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('async/debouncer.js', ['goog.async.Debouncer'], ['goog.Disposable', 'goog.Timer'], {});\ngoog.addDependency('async/debouncer_test.js', ['goog.async.DebouncerTest'], ['goog.array', 'goog.async.Debouncer', 'goog.testing.MockClock', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('async/delay.js', ['goog.Delay', 'goog.async.Delay'], ['goog.Disposable', 'goog.Timer'], {});\ngoog.addDependency('async/delay_test.js', ['goog.async.DelayTest'], ['goog.async.Delay', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('async/freelist.js', ['goog.async.FreeList'], [], {'lang': 'es6'});\ngoog.addDependency('async/freelist_test.js', ['goog.async.FreeListTest'], ['goog.async.FreeList', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('async/nexttick.js', ['goog.async.nextTick', 'goog.async.throwException'], ['goog.debug.entryPointRegistry', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.functions', 'goog.html.SafeHtml', 'goog.html.TrustedResourceUrl', 'goog.labs.userAgent.browser', 'goog.labs.userAgent.engine', 'goog.string.Const'], {});\ngoog.addDependency('async/nexttick_test.js', ['goog.async.nextTickTest'], ['goog.Promise', 'goog.async.nextTick', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.dom', 'goog.dom.TagName', 'goog.labs.userAgent.browser', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('async/run.js', ['goog.async.run'], ['goog.async.WorkQueue', 'goog.async.nextTick', 'goog.async.throwException'], {});\ngoog.addDependency('async/run_next_tick_test.js', ['goog.async.runNextTickTest'], ['goog.async.run', 'goog.testing.MockClock', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('async/run_test.js', ['goog.async.runTest'], ['goog.async.run', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('async/throttle.js', ['goog.Throttle', 'goog.async.Throttle'], ['goog.Disposable', 'goog.Timer'], {});\ngoog.addDependency('async/throttle_test.js', ['goog.async.ThrottleTest'], ['goog.async.Throttle', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('async/workqueue.js', ['goog.async.WorkItem', 'goog.async.WorkQueue'], ['goog.asserts', 'goog.async.FreeList'], {});\ngoog.addDependency('async/workqueue_test.js', ['goog.async.WorkQueueTest'], ['goog.async.WorkQueue', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('base.js', ['goog'], [], {});\ngoog.addDependency('base_module_test.js', ['goog.baseModuleTest'], ['goog.Timer', 'goog.test_module', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('base_test.js', ['goog.baseTest'], ['goog.Promise', 'goog.Timer', 'goog.Uri', 'goog.dom', 'goog.dom.TagName', 'goog.object', 'goog.test_module', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.userAgent'], {'lang': 'es6'});\ngoog.addDependency('color/alpha.js', ['goog.color.alpha'], ['goog.color'], {});\ngoog.addDependency('color/alpha_test.js', ['goog.color.alphaTest'], ['goog.array', 'goog.color.alpha', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('color/color.js', ['goog.color', 'goog.color.Hsl', 'goog.color.Hsv', 'goog.color.Rgb'], ['goog.color.names', 'goog.math'], {});\ngoog.addDependency('color/color_test.js', ['goog.colorTest'], ['goog.array', 'goog.color', 'goog.color.names', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('color/names.js', ['goog.color.names'], [], {});\ngoog.addDependency('crypt/aes.js', ['goog.crypt.Aes'], ['goog.asserts', 'goog.crypt.BlockCipher'], {});\ngoog.addDependency('crypt/aes_test.js', ['goog.crypt.AesTest'], ['goog.crypt', 'goog.crypt.Aes', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('crypt/arc4.js', ['goog.crypt.Arc4'], ['goog.asserts'], {});\ngoog.addDependency('crypt/arc4_test.js', ['goog.crypt.Arc4Test'], ['goog.array', 'goog.crypt.Arc4', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('crypt/base64.js', ['goog.crypt.base64'], ['goog.asserts', 'goog.crypt', 'goog.string', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es5'});\ngoog.addDependency('crypt/base64_test.js', ['goog.crypt.base64Test'], ['goog.crypt', 'goog.crypt.base64', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('crypt/basen.js', ['goog.crypt.baseN'], [], {'lang': 'es6'});\ngoog.addDependency('crypt/basen_test.js', ['goog.crypt.baseNTest'], ['goog.crypt.baseN', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('crypt/blobhasher.js', ['goog.crypt.BlobHasher', 'goog.crypt.BlobHasher.EventType'], ['goog.asserts', 'goog.events.EventTarget', 'goog.fs', 'goog.log'], {});\ngoog.addDependency('crypt/blobhasher_test.js', ['goog.crypt.BlobHasherTest'], ['goog.crypt', 'goog.crypt.BlobHasher', 'goog.crypt.Md5', 'goog.events', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('crypt/blockcipher.js', ['goog.crypt.BlockCipher'], [], {});\ngoog.addDependency('crypt/bytestring_perf.js', ['goog.crypt.byteArrayToStringPerf'], ['goog.array', 'goog.dom', 'goog.testing.PerformanceTable'], {});\ngoog.addDependency('crypt/cbc.js', ['goog.crypt.Cbc'], ['goog.array', 'goog.asserts', 'goog.crypt', 'goog.crypt.BlockCipher'], {});\ngoog.addDependency('crypt/cbc_test.js', ['goog.crypt.CbcTest'], ['goog.crypt', 'goog.crypt.Aes', 'goog.crypt.Cbc', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('crypt/crypt.js', ['goog.crypt'], ['goog.array', 'goog.asserts'], {});\ngoog.addDependency('crypt/crypt_test.js', ['goog.cryptTest'], ['goog.crypt', 'goog.string', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('crypt/ctr.js', ['goog.crypt.Ctr'], ['goog.array', 'goog.asserts', 'goog.crypt'], {});\ngoog.addDependency('crypt/ctr_test.js', ['goog.crypt.CtrTest'], ['goog.crypt', 'goog.crypt.Aes', 'goog.crypt.Ctr', 'goog.testing.jsunit'], {'lang': 'es6'});\ngoog.addDependency('crypt/hash.js', ['goog.crypt.Hash'], [], {});\ngoog.addDependency('crypt/hash32.js', ['goog.crypt.hash32'], ['goog.crypt'], {});\ngoog.addDependency('crypt/hash32_test.js', ['goog.crypt.hash32Test'], ['goog.crypt.hash32', 'goog.testing.TestCase', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('crypt/hashtester.js', ['goog.crypt.hashTester'], ['goog.array', 'goog.crypt', 'goog.dom', 'goog.dom.TagName', 'goog.reflect', 'goog.testing.PerformanceTable', 'goog.testing.PseudoRandom', 'goog.testing.asserts'], {});\ngoog.addDependency('crypt/hmac.js', ['goog.crypt.Hmac'], ['goog.crypt.Hash'], {});\ngoog.addDependency('crypt/hmac_test.js', ['goog.crypt.HmacTest'], ['goog.crypt.Hmac', 'goog.crypt.Sha1', 'goog.crypt.hashTester', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('crypt/md5.js', ['goog.crypt.Md5'], ['goog.crypt.Hash'], {});\ngoog.addDependency('crypt/md5_test.js', ['goog.crypt.Md5Test'], ['goog.crypt', 'goog.crypt.Md5', 'goog.crypt.hashTester', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('crypt/pbkdf2.js', ['goog.crypt.pbkdf2'], ['goog.array', 'goog.asserts', 'goog.crypt', 'goog.crypt.Hmac', 'goog.crypt.Sha1'], {});\ngoog.addDependency('crypt/pbkdf2_test.js', ['goog.crypt.pbkdf2Test'], ['goog.crypt', 'goog.crypt.pbkdf2', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('crypt/sha1.js', ['goog.crypt.Sha1'], ['goog.crypt.Hash'], {});\ngoog.addDependency('crypt/sha1_test.js', ['goog.crypt.Sha1Test'], ['goog.crypt', 'goog.crypt.Sha1', 'goog.crypt.hashTester', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('crypt/sha2.js', ['goog.crypt.Sha2'], ['goog.array', 'goog.asserts', 'goog.crypt.Hash'], {});\ngoog.addDependency('crypt/sha224.js', ['goog.crypt.Sha224'], ['goog.crypt.Sha2'], {});\ngoog.addDependency('crypt/sha224_test.js', ['goog.crypt.Sha224Test'], ['goog.crypt', 'goog.crypt.Sha224', 'goog.crypt.hashTester', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('crypt/sha256.js', ['goog.crypt.Sha256'], ['goog.crypt.Sha2'], {});\ngoog.addDependency('crypt/sha256_test.js', ['goog.crypt.Sha256Test'], ['goog.crypt', 'goog.crypt.Sha256', 'goog.crypt.hashTester', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('crypt/sha2_64bit.js', ['goog.crypt.Sha2_64bit'], ['goog.array', 'goog.asserts', 'goog.crypt.Hash', 'goog.math.Long'], {});\ngoog.addDependency('crypt/sha2_64bit_test.js', ['goog.crypt.Sha2_64bit_test'], ['goog.array', 'goog.crypt', 'goog.crypt.Sha384', 'goog.crypt.Sha512', 'goog.crypt.Sha512_256', 'goog.crypt.hashTester', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('crypt/sha384.js', ['goog.crypt.Sha384'], ['goog.crypt.Sha2_64bit'], {});\ngoog.addDependency('crypt/sha512.js', ['goog.crypt.Sha512'], ['goog.crypt.Sha2_64bit'], {});\ngoog.addDependency('crypt/sha512_256.js', ['goog.crypt.Sha512_256'], ['goog.crypt.Sha2_64bit'], {});\ngoog.addDependency('cssom/cssom.js', ['goog.cssom', 'goog.cssom.CssRuleType'], ['goog.array', 'goog.dom', 'goog.dom.TagName'], {});\ngoog.addDependency('cssom/cssom_test.js', ['goog.cssomTest'], ['goog.array', 'goog.cssom', 'goog.cssom.CssRuleType', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('cssom/iframe/style.js', ['goog.cssom.iframe.style'], ['goog.asserts', 'goog.cssom', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.string', 'goog.style', 'goog.userAgent'], {});\ngoog.addDependency('cssom/iframe/style_test.js', ['goog.cssom.iframe.styleTest'], ['goog.cssom', 'goog.cssom.iframe.style', 'goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('datasource/datamanager.js', ['goog.ds.DataManager'], ['goog.ds.BasicNodeList', 'goog.ds.DataNode', 'goog.ds.Expr', 'goog.object', 'goog.string', 'goog.structs', 'goog.structs.Map'], {});\ngoog.addDependency('datasource/datasource.js', ['goog.ds.BaseDataNode', 'goog.ds.BasicNodeList', 'goog.ds.DataNode', 'goog.ds.DataNodeList', 'goog.ds.EmptyNodeList', 'goog.ds.LoadState', 'goog.ds.SortedNodeList', 'goog.ds.Util', 'goog.ds.logger'], ['goog.array', 'goog.log'], {});\ngoog.addDependency('datasource/datasource_test.js', ['goog.ds.JsDataSourceTest'], ['goog.dom.xml', 'goog.ds.DataManager', 'goog.ds.JsDataSource', 'goog.ds.SortedNodeList', 'goog.ds.XmlDataSource', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('datasource/expr.js', ['goog.ds.Expr'], ['goog.ds.BasicNodeList', 'goog.ds.EmptyNodeList', 'goog.string'], {});\ngoog.addDependency('datasource/expr_test.js', ['goog.ds.ExprTest'], ['goog.ds.DataManager', 'goog.ds.Expr', 'goog.ds.JsDataSource', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('datasource/fastdatanode.js', ['goog.ds.AbstractFastDataNode', 'goog.ds.FastDataNode', 'goog.ds.FastListNode', 'goog.ds.PrimitiveFastDataNode'], ['goog.ds.DataManager', 'goog.ds.DataNodeList', 'goog.ds.EmptyNodeList', 'goog.string'], {});\ngoog.addDependency('datasource/fastdatanode_test.js', ['goog.ds.FastDataNodeTest'], ['goog.array', 'goog.ds.DataManager', 'goog.ds.Expr', 'goog.ds.FastDataNode', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('datasource/jsdatasource.js', ['goog.ds.JsDataSource', 'goog.ds.JsPropertyDataSource'], ['goog.ds.BaseDataNode', 'goog.ds.BasicNodeList', 'goog.ds.DataManager', 'goog.ds.DataNode', 'goog.ds.EmptyNodeList', 'goog.ds.LoadState'], {});\ngoog.addDependency('datasource/jsondatasource.js', ['goog.ds.JsonDataSource'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.ds.DataManager', 'goog.ds.JsDataSource', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.log'], {});\ngoog.addDependency('datasource/jsxmlhttpdatasource.js', ['goog.ds.JsXmlHttpDataSource'], ['goog.Uri', 'goog.ds.DataManager', 'goog.ds.FastDataNode', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.events', 'goog.log', 'goog.net.EventType', 'goog.net.XhrIo'], {});\ngoog.addDependency('datasource/jsxmlhttpdatasource_test.js', ['goog.ds.JsXmlHttpDataSourceTest'], ['goog.ds.JsXmlHttpDataSource', 'goog.testing.TestQueue', 'goog.testing.net.XhrIo', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('datasource/xmldatasource.js', ['goog.ds.XmlDataSource', 'goog.ds.XmlHttpDataSource'], ['goog.Uri', 'goog.dom.NodeType', 'goog.dom.xml', 'goog.ds.BasicNodeList', 'goog.ds.DataManager', 'goog.ds.DataNode', 'goog.ds.LoadState', 'goog.ds.logger', 'goog.log', 'goog.net.XhrIo', 'goog.string'], {});\ngoog.addDependency('date/date.js', ['goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval', 'goog.date.month', 'goog.date.weekDay'], ['goog.asserts', 'goog.date.DateLike', 'goog.i18n.DateTimeSymbols', 'goog.string'], {});\ngoog.addDependency('date/date_test.js', ['goog.dateTest'], ['goog.array', 'goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval', 'goog.date.month', 'goog.date.weekDay', 'goog.i18n.DateTimeSymbols', 'goog.testing.ExpectedFailures', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.platform', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('date/datelike.js', ['goog.date.DateLike'], [], {});\ngoog.addDependency('date/daterange.js', ['goog.date.DateRange', 'goog.date.DateRange.Iterator', 'goog.date.DateRange.StandardDateRangeKeys'], ['goog.date.Date', 'goog.date.Interval', 'goog.iter.Iterator', 'goog.iter.StopIteration'], {});\ngoog.addDependency('date/daterange_test.js', ['goog.date.DateRangeTest'], ['goog.date.Date', 'goog.date.DateRange', 'goog.date.Interval', 'goog.i18n.DateTimeSymbols', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('date/duration.js', ['goog.date.duration'], ['goog.i18n.DateTimeFormat', 'goog.i18n.MessageFormat'], {});\ngoog.addDependency('date/duration_test.js', ['goog.date.durationTest'], ['goog.date.duration', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_fa', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('date/relative.js', ['goog.date.relative', 'goog.date.relative.TimeDeltaFormatter', 'goog.date.relative.Unit'], ['goog.i18n.DateTimeFormat', 'goog.i18n.DateTimePatterns', 'goog.i18n.RelativeDateTimeFormat'], {});\ngoog.addDependency('date/relative_test.js', ['goog.date.relativeTest'], ['goog.date.relativeCommonTests'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('date/relativecommontests.js', ['goog.date.relativeCommonTests'], ['goog.date.DateTime', 'goog.date.relative', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimePatterns_ar', 'goog.i18n.DateTimePatterns_bn', 'goog.i18n.DateTimePatterns_es', 'goog.i18n.DateTimePatterns_fa', 'goog.i18n.DateTimePatterns_fr', 'goog.i18n.DateTimePatterns_no', 'goog.i18n.DateTimeSymbols_ar', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_es', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_no', 'goog.i18n.NumberFormatSymbols_bn', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_fa', 'goog.i18n.NumberFormatSymbols_no', 'goog.i18n.relativeDateTimeSymbols', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {'lang': 'es6'});\ngoog.addDependency('date/utcdatetime.js', ['goog.date.UtcDateTime'], ['goog.date', 'goog.date.Date', 'goog.date.DateTime', 'goog.date.Interval'], {});\ngoog.addDependency('date/utcdatetime_test.js', ['goog.date.UtcDateTimeTest'], ['goog.date.Interval', 'goog.date.UtcDateTime', 'goog.date.month', 'goog.date.weekDay', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('db/cursor.js', ['goog.db.Cursor'], ['goog.async.Deferred', 'goog.db.Error', 'goog.db.KeyRange', 'goog.debug', 'goog.events.EventTarget'], {});\ngoog.addDependency('db/db.js', ['goog.db', 'goog.db.BlockedCallback', 'goog.db.UpgradeNeededCallback'], ['goog.asserts', 'goog.async.Deferred', 'goog.db.Error', 'goog.db.IndexedDb', 'goog.db.Transaction'], {});\ngoog.addDependency('db/db_test.js', ['goog.dbTest'], ['goog.Promise', 'goog.array', 'goog.db', 'goog.db.Cursor', 'goog.db.Error', 'goog.db.IndexedDb', 'goog.db.KeyRange', 'goog.db.Transaction', 'goog.events', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.testSuite', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('db/error.js', ['goog.db.DomErrorLike', 'goog.db.Error', 'goog.db.Error.ErrorCode', 'goog.db.Error.ErrorName', 'goog.db.Error.VersionChangeBlockedError'], ['goog.asserts', 'goog.debug.Error'], {});\ngoog.addDependency('db/index.js', ['goog.db.Index'], ['goog.async.Deferred', 'goog.db.Cursor', 'goog.db.Error', 'goog.db.KeyRange', 'goog.debug'], {});\ngoog.addDependency('db/indexeddb.js', ['goog.db.IndexedDb'], ['goog.db.Error', 'goog.db.ObjectStore', 'goog.db.Transaction', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget'], {'lang': 'es6'});\ngoog.addDependency('db/keyrange.js', ['goog.db.KeyRange'], [], {});\ngoog.addDependency('db/objectstore.js', ['goog.db.ObjectStore'], ['goog.async.Deferred', 'goog.db.Cursor', 'goog.db.Error', 'goog.db.Index', 'goog.db.KeyRange', 'goog.debug'], {});\ngoog.addDependency('db/transaction.js', ['goog.db.Transaction', 'goog.db.Transaction.TransactionMode'], ['goog.async.Deferred', 'goog.db.Error', 'goog.db.ObjectStore', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget'], {});\ngoog.addDependency('debug/console.js', ['goog.debug.Console'], ['goog.debug.LogManager', 'goog.debug.Logger', 'goog.debug.TextFormatter'], {});\ngoog.addDependency('debug/console_test.js', ['goog.debug.ConsoleTest'], ['goog.debug.Console', 'goog.debug.LogRecord', 'goog.debug.Logger', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('debug/debug.js', ['goog.debug'], ['goog.array', 'goog.debug.errorcontext', 'goog.userAgent'], {});\ngoog.addDependency('debug/debug_test.js', ['goog.debugTest'], ['goog.debug', 'goog.debug.errorcontext', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('debug/debugwindow.js', ['goog.debug.DebugWindow'], ['goog.debug.HtmlFormatter', 'goog.debug.LogManager', 'goog.debug.Logger', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.SafeStyleSheet', 'goog.string.Const', 'goog.structs.CircularBuffer', 'goog.userAgent'], {});\ngoog.addDependency('debug/debugwindow_test.js', ['goog.debug.DebugWindowTest'], ['goog.debug.DebugWindow', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('debug/devcss/devcss.js', ['goog.debug.DevCss', 'goog.debug.DevCss.UserAgent'], ['goog.asserts', 'goog.cssom', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.string', 'goog.userAgent'], {});\ngoog.addDependency('debug/devcss/devcss_test.js', ['goog.debug.DevCssTest'], ['goog.debug.DevCss', 'goog.style', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('debug/devcss/devcssrunner.js', ['goog.debug.devCssRunner'], ['goog.debug.DevCss'], {});\ngoog.addDependency('debug/divconsole.js', ['goog.debug.DivConsole'], ['goog.debug.HtmlFormatter', 'goog.debug.LogManager', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.SafeStyleSheet', 'goog.string.Const', 'goog.style'], {});\ngoog.addDependency('debug/enhanceerror_test.js', ['goog.debugEnhanceErrorTest'], ['goog.debug', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('debug/entrypointregistry.js', ['goog.debug.EntryPointMonitor', 'goog.debug.entryPointRegistry'], ['goog.asserts'], {});\ngoog.addDependency('debug/entrypointregistry_test.js', ['goog.debug.entryPointRegistryTest'], ['goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('debug/error.js', ['goog.debug.Error'], [], {'lang': 'es6'});\ngoog.addDependency('debug/error_test.js', ['goog.debug.ErrorTest'], ['goog.debug.Error', 'goog.testing.ExpectedFailures', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('debug/errorcontext.js', ['goog.debug.errorcontext'], [], {});\ngoog.addDependency('debug/errorcontext_test.js', ['goog.debug.errorcontextTest'], ['goog.debug.errorcontext', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('debug/errorhandler.js', ['goog.debug.ErrorHandler', 'goog.debug.ErrorHandler.ProtectedFunctionError'], ['goog.Disposable', 'goog.asserts', 'goog.debug', 'goog.debug.EntryPointMonitor', 'goog.debug.Error', 'goog.debug.Trace'], {'lang': 'es6'});\ngoog.addDependency('debug/errorhandler_async_test.js', ['goog.debug.ErrorHandlerAsyncTest'], ['goog.Promise', 'goog.debug.ErrorHandler', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es8', 'module': 'goog'});\ngoog.addDependency('debug/errorhandler_test.js', ['goog.debug.ErrorHandlerTest'], ['goog.debug.ErrorHandler', 'goog.testing.MockControl', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('debug/errorhandlerweakdep.js', ['goog.debug.errorHandlerWeakDep'], [], {});\ngoog.addDependency('debug/errorreporter.js', ['goog.debug.ErrorReporter', 'goog.debug.ErrorReporter.ExceptionEvent'], ['goog.asserts', 'goog.debug', 'goog.debug.Error', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.debug.errorcontext', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.log', 'goog.net.XhrIo', 'goog.object', 'goog.string', 'goog.uri.utils', 'goog.userAgent'], {});\ngoog.addDependency('debug/errorreporter_test.js', ['goog.debug.ErrorReporterTest'], ['goog.debug.Error', 'goog.debug.ErrorReporter', 'goog.debug.errorcontext', 'goog.events', 'goog.functions', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('debug/fancywindow.js', ['goog.debug.FancyWindow'], ['goog.array', 'goog.asserts', 'goog.debug.DebugWindow', 'goog.debug.LogManager', 'goog.debug.Logger', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.SafeStyleSheet', 'goog.object', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});\ngoog.addDependency('debug/formatter.js', ['goog.debug.Formatter', 'goog.debug.HtmlFormatter', 'goog.debug.TextFormatter'], ['goog.debug', 'goog.debug.Logger', 'goog.debug.RelativeTimeProvider', 'goog.html.SafeHtml', 'goog.html.SafeUrl', 'goog.html.uncheckedconversions', 'goog.string.Const'], {});\ngoog.addDependency('debug/formatter_test.js', ['goog.debug.FormatterTest'], ['goog.debug.HtmlFormatter', 'goog.debug.LogRecord', 'goog.debug.Logger', 'goog.html.SafeHtml', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('debug/fpsdisplay.js', ['goog.debug.FpsDisplay'], ['goog.asserts', 'goog.async.AnimationDelay', 'goog.dom', 'goog.dom.TagName', 'goog.ui.Component'], {});\ngoog.addDependency('debug/fpsdisplay_test.js', ['goog.debug.FpsDisplayTest'], ['goog.Timer', 'goog.debug.FpsDisplay', 'goog.testing.TestCase', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('debug/logbuffer.js', ['goog.debug.LogBuffer'], ['goog.asserts', 'goog.debug.LogRecord'], {});\ngoog.addDependency('debug/logbuffer_test.js', ['goog.debug.LogBufferTest'], ['goog.debug.LogBuffer', 'goog.debug.Logger', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('debug/logger.js', ['goog.debug.LogManager', 'goog.debug.Loggable', 'goog.debug.Logger', 'goog.debug.Logger.Level'], ['goog.array', 'goog.asserts', 'goog.debug', 'goog.debug.LogBuffer', 'goog.debug.LogRecord'], {});\ngoog.addDependency('debug/logger_test.js', ['goog.debug.LoggerTest'], ['goog.debug.LogManager', 'goog.debug.Logger', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('debug/logrecord.js', ['goog.debug.LogRecord'], [], {});\ngoog.addDependency('debug/logrecordserializer.js', ['goog.debug.logRecordSerializer'], ['goog.debug.LogRecord', 'goog.debug.Logger', 'goog.json', 'goog.object'], {});\ngoog.addDependency('debug/logrecordserializer_test.js', ['goog.debug.logRecordSerializerTest'], ['goog.debug.LogRecord', 'goog.debug.Logger', 'goog.debug.logRecordSerializer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('debug/relativetimeprovider.js', ['goog.debug.RelativeTimeProvider'], [], {});\ngoog.addDependency('debug/tracer.js', ['goog.debug.StopTraceDetail', 'goog.debug.Trace'], ['goog.array', 'goog.asserts', 'goog.debug.Logger', 'goog.iter', 'goog.log', 'goog.structs.Map', 'goog.structs.SimplePool'], {});\ngoog.addDependency('debug/tracer_test.js', ['goog.debug.TraceTest'], ['goog.array', 'goog.debug.Trace', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('defineclass_test.js', ['goog.defineClassTest'], ['goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('delegate/delegateregistry.js', ['goog.delegate.DelegateRegistry'], ['goog.array', 'goog.asserts', 'goog.debug'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('delegate/delegateregistry_test.js', ['goog.delegate.DelegateRegistryTest'], ['goog.array', 'goog.delegate.DelegateRegistry', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('delegate/delegates.js', ['goog.delegate.delegates'], [], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('delegate/delegates_test.js', ['goog.delegate.delegatesTest'], ['goog.delegate.delegates', 'goog.testing.jsunit', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('disposable/disposable.js', ['goog.Disposable', 'goog.dispose', 'goog.disposeAll'], ['goog.disposable.IDisposable'], {});\ngoog.addDependency('disposable/disposable_test.js', ['goog.DisposableTest'], ['goog.Disposable', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('disposable/idisposable.js', ['goog.disposable.IDisposable'], [], {});\ngoog.addDependency('dom/abstractmultirange.js', ['goog.dom.AbstractMultiRange'], ['goog.array', 'goog.dom', 'goog.dom.AbstractRange', 'goog.dom.TextRange'], {});\ngoog.addDependency('dom/abstractrange.js', ['goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.SavedCaretRange', 'goog.dom.TagIterator', 'goog.userAgent'], {});\ngoog.addDependency('dom/abstractrange_test.js', ['goog.dom.AbstractRangeTest'], ['goog.dom', 'goog.dom.AbstractRange', 'goog.dom.Range', 'goog.dom.TagName', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/animationframe/animationframe.js', ['goog.dom.animationFrame', 'goog.dom.animationFrame.Spec', 'goog.dom.animationFrame.State'], ['goog.dom.animationFrame.polyfill'], {});\ngoog.addDependency('dom/animationframe/animationframe_test.js', ['goog.dom.AnimationFrameTest'], ['goog.dom.animationFrame', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/animationframe/polyfill.js', ['goog.dom.animationFrame.polyfill'], [], {'lang': 'es6'});\ngoog.addDependency('dom/annotate.js', ['goog.dom.annotate', 'goog.dom.annotate.AnnotateFn'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.object'], {});\ngoog.addDependency('dom/annotate_test.js', ['goog.dom.annotateTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.annotate', 'goog.html.SafeHtml', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/asserts.js', ['goog.dom.asserts'], ['goog.asserts'], {});\ngoog.addDependency('dom/asserts_test.js', ['goog.dom.assertsTest'], ['goog.dom.asserts', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/attr.js', ['goog.dom.Attr'], [], {});\ngoog.addDependency('dom/browserfeature.js', ['goog.dom.BrowserFeature'], ['goog.userAgent'], {});\ngoog.addDependency('dom/browserfeature_test.js', ['goog.dom.BrowserFeatureTest'], ['goog.dom', 'goog.dom.BrowserFeature', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/browserrange/abstractrange.js', ['goog.dom.browserrange.AbstractRange'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.TextRangeIterator', 'goog.iter', 'goog.math.Coordinate', 'goog.string', 'goog.string.StringBuffer', 'goog.userAgent'], {});\ngoog.addDependency('dom/browserrange/browserrange.js', ['goog.dom.browserrange', 'goog.dom.browserrange.Error'], ['goog.dom', 'goog.dom.BrowserFeature', 'goog.dom.NodeType', 'goog.dom.browserrange.GeckoRange', 'goog.dom.browserrange.IeRange', 'goog.dom.browserrange.OperaRange', 'goog.dom.browserrange.W3cRange', 'goog.dom.browserrange.WebKitRange', 'goog.userAgent'], {});\ngoog.addDependency('dom/browserrange/browserrange_test.js', ['goog.dom.browserrangeTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.browserrange', 'goog.html.testing', 'goog.testing.dom', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/browserrange/geckorange.js', ['goog.dom.browserrange.GeckoRange'], ['goog.dom.browserrange.W3cRange'], {});\ngoog.addDependency('dom/browserrange/ierange.js', ['goog.dom.browserrange.IeRange'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.browserrange.AbstractRange', 'goog.dom.safe', 'goog.html.uncheckedconversions', 'goog.log', 'goog.string'], {});\ngoog.addDependency('dom/browserrange/operarange.js', ['goog.dom.browserrange.OperaRange'], ['goog.dom.browserrange.W3cRange'], {});\ngoog.addDependency('dom/browserrange/w3crange.js', ['goog.dom.browserrange.W3cRange'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeEndpoint', 'goog.dom.TagName', 'goog.dom.browserrange.AbstractRange', 'goog.string', 'goog.userAgent'], {});\ngoog.addDependency('dom/browserrange/webkitrange.js', ['goog.dom.browserrange.WebKitRange'], ['goog.dom.RangeEndpoint', 'goog.dom.browserrange.W3cRange', 'goog.userAgent'], {});\ngoog.addDependency('dom/bufferedviewportsizemonitor.js', ['goog.dom.BufferedViewportSizeMonitor'], ['goog.asserts', 'goog.async.Delay', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType'], {});\ngoog.addDependency('dom/bufferedviewportsizemonitor_test.js', ['goog.dom.BufferedViewportSizeMonitorTest'], ['goog.dom.BufferedViewportSizeMonitor', 'goog.dom.ViewportSizeMonitor', 'goog.events', 'goog.events.EventType', 'goog.math.Size', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/classes.js', ['goog.dom.classes'], ['goog.array'], {});\ngoog.addDependency('dom/classes_test.js', ['goog.dom.classes_test'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classes', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/classlist.js', ['goog.dom.classlist'], ['goog.array'], {});\ngoog.addDependency('dom/classlist_test.js', ['goog.dom.classlist_test'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.ExpectedFailures', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/controlrange.js', ['goog.dom.ControlRange', 'goog.dom.ControlRangeIterator'], ['goog.array', 'goog.dom', 'goog.dom.AbstractMultiRange', 'goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TagWalkType', 'goog.dom.TextRange', 'goog.iter.StopIteration', 'goog.userAgent'], {});\ngoog.addDependency('dom/controlrange_test.js', ['goog.dom.ControlRangeTest'], ['goog.dom', 'goog.dom.ControlRange', 'goog.dom.RangeType', 'goog.dom.TagName', 'goog.dom.TextRange', 'goog.testing.dom', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/dataset.js', ['goog.dom.dataset'], ['goog.labs.userAgent.browser', 'goog.string', 'goog.userAgent.product'], {});\ngoog.addDependency('dom/dataset_test.js', ['goog.dom.datasetTest'], ['goog.dom', 'goog.dom.dataset', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/dom.js', ['goog.dom', 'goog.dom.Appendable', 'goog.dom.DomHelper'], ['goog.array', 'goog.asserts', 'goog.dom.BrowserFeature', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.uncheckedconversions', 'goog.math.Coordinate', 'goog.math.Size', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.userAgent'], {});\ngoog.addDependency('dom/dom_compile_test.js', ['goog.dom.DomCompileTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/dom_test.js', ['goog.dom.dom_test'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.BrowserFeature', 'goog.dom.DomHelper', 'goog.dom.InputType', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.functions', 'goog.html.SafeUrl', 'goog.html.testing', 'goog.object', 'goog.string.Const', 'goog.string.Unicode', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product.isVersion'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/fontsizemonitor.js', ['goog.dom.FontSizeMonitor', 'goog.dom.FontSizeMonitor.EventType'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.userAgent'], {});\ngoog.addDependency('dom/fontsizemonitor_test.js', ['goog.dom.FontSizeMonitorTest'], ['goog.dom', 'goog.dom.FontSizeMonitor', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/forms.js', ['goog.dom.forms'], ['goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.structs.Map', 'goog.window'], {});\ngoog.addDependency('dom/forms_test.js', ['goog.dom.formsTest'], ['goog.dom', 'goog.dom.forms', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/fullscreen.js', ['goog.dom.fullscreen', 'goog.dom.fullscreen.EventType'], ['goog.dom'], {});\ngoog.addDependency('dom/fullscreen_test.js', ['goog.dom.fullscreen_test'], ['goog.dom.DomHelper', 'goog.dom.fullscreen', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/htmlelement.js', ['goog.dom.HtmlElement'], [], {});\ngoog.addDependency('dom/iframe.js', ['goog.dom.iframe'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.html.TrustedResourceUrl', 'goog.string.Const', 'goog.userAgent'], {});\ngoog.addDependency('dom/iframe_test.js', ['goog.dom.iframeTest'], ['goog.dom', 'goog.dom.iframe', 'goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.string.Const', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/inputtype.js', ['goog.dom.InputType'], [], {});\ngoog.addDependency('dom/inputtype_test.js', ['goog.dom.InputTypeTest'], ['goog.dom.InputType', 'goog.object', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/iter.js', ['goog.dom.iter.AncestorIterator', 'goog.dom.iter.ChildIterator', 'goog.dom.iter.SiblingIterator'], ['goog.iter.Iterator', 'goog.iter.StopIteration'], {});\ngoog.addDependency('dom/iter_test.js', ['goog.dom.iterTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.iter.AncestorIterator', 'goog.dom.iter.ChildIterator', 'goog.dom.iter.SiblingIterator', 'goog.testing.dom', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/multirange.js', ['goog.dom.MultiRange', 'goog.dom.MultiRangeIterator'], ['goog.array', 'goog.dom', 'goog.dom.AbstractMultiRange', 'goog.dom.AbstractRange', 'goog.dom.RangeIterator', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TextRange', 'goog.iter', 'goog.iter.StopIteration', 'goog.log'], {});\ngoog.addDependency('dom/multirange_test.js', ['goog.dom.MultiRangeTest'], ['goog.dom', 'goog.dom.MultiRange', 'goog.dom.Range', 'goog.iter', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/nodeiterator.js', ['goog.dom.NodeIterator'], ['goog.dom.TagIterator'], {});\ngoog.addDependency('dom/nodeiterator_test.js', ['goog.dom.NodeIteratorTest'], ['goog.dom', 'goog.dom.NodeIterator', 'goog.testing.dom', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/nodeoffset.js', ['goog.dom.NodeOffset'], ['goog.Disposable', 'goog.dom.TagName'], {});\ngoog.addDependency('dom/nodeoffset_test.js', ['goog.dom.NodeOffsetTest'], ['goog.dom', 'goog.dom.NodeOffset', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/nodetype.js', ['goog.dom.NodeType'], [], {});\ngoog.addDependency('dom/pattern/abstractpattern.js', ['goog.dom.pattern.AbstractPattern'], ['goog.dom.TagWalkType', 'goog.dom.pattern.MatchType'], {});\ngoog.addDependency('dom/pattern/allchildren.js', ['goog.dom.pattern.AllChildren'], ['goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType'], {});\ngoog.addDependency('dom/pattern/callback/callback.js', ['goog.dom.pattern.callback'], ['goog.dom', 'goog.dom.TagWalkType', 'goog.iter'], {});\ngoog.addDependency('dom/pattern/callback/counter.js', ['goog.dom.pattern.callback.Counter'], [], {});\ngoog.addDependency('dom/pattern/callback/test.js', ['goog.dom.pattern.callback.Test'], ['goog.iter.StopIteration'], {});\ngoog.addDependency('dom/pattern/childmatches.js', ['goog.dom.pattern.ChildMatches'], ['goog.dom.pattern.AllChildren', 'goog.dom.pattern.MatchType'], {});\ngoog.addDependency('dom/pattern/endtag.js', ['goog.dom.pattern.EndTag'], ['goog.dom.TagWalkType', 'goog.dom.pattern.Tag'], {});\ngoog.addDependency('dom/pattern/fulltag.js', ['goog.dom.pattern.FullTag'], ['goog.dom.pattern.MatchType', 'goog.dom.pattern.StartTag', 'goog.dom.pattern.Tag'], {});\ngoog.addDependency('dom/pattern/matcher.js', ['goog.dom.pattern.Matcher'], ['goog.dom.TagIterator', 'goog.dom.pattern.MatchType', 'goog.iter'], {});\ngoog.addDependency('dom/pattern/matcher_test.js', ['goog.dom.pattern.matcherTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.pattern.EndTag', 'goog.dom.pattern.FullTag', 'goog.dom.pattern.Matcher', 'goog.dom.pattern.Repeat', 'goog.dom.pattern.Sequence', 'goog.dom.pattern.StartTag', 'goog.dom.pattern.callback.Counter', 'goog.dom.pattern.callback.Test', 'goog.iter.StopIteration', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/pattern/nodetype.js', ['goog.dom.pattern.NodeType'], ['goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType'], {});\ngoog.addDependency('dom/pattern/pattern.js', ['goog.dom.pattern', 'goog.dom.pattern.MatchType'], [], {});\ngoog.addDependency('dom/pattern/pattern_test.js', ['goog.dom.patternTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagWalkType', 'goog.dom.pattern.AllChildren', 'goog.dom.pattern.ChildMatches', 'goog.dom.pattern.EndTag', 'goog.dom.pattern.FullTag', 'goog.dom.pattern.MatchType', 'goog.dom.pattern.NodeType', 'goog.dom.pattern.Repeat', 'goog.dom.pattern.Sequence', 'goog.dom.pattern.StartTag', 'goog.dom.pattern.Text', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/pattern/repeat.js', ['goog.dom.pattern.Repeat'], ['goog.dom.NodeType', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType'], {});\ngoog.addDependency('dom/pattern/sequence.js', ['goog.dom.pattern.Sequence'], ['goog.dom.NodeType', 'goog.dom.pattern', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType'], {});\ngoog.addDependency('dom/pattern/starttag.js', ['goog.dom.pattern.StartTag'], ['goog.dom.TagWalkType', 'goog.dom.pattern.Tag'], {});\ngoog.addDependency('dom/pattern/tag.js', ['goog.dom.pattern.Tag'], ['goog.dom.pattern', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType', 'goog.object'], {});\ngoog.addDependency('dom/pattern/text.js', ['goog.dom.pattern.Text'], ['goog.dom.NodeType', 'goog.dom.pattern', 'goog.dom.pattern.AbstractPattern', 'goog.dom.pattern.MatchType'], {});\ngoog.addDependency('dom/range.js', ['goog.dom.Range'], ['goog.dom', 'goog.dom.AbstractRange', 'goog.dom.BrowserFeature', 'goog.dom.ControlRange', 'goog.dom.MultiRange', 'goog.dom.NodeType', 'goog.dom.TextRange'], {});\ngoog.addDependency('dom/range_test.js', ['goog.dom.RangeTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.RangeType', 'goog.dom.TagName', 'goog.dom.TextRange', 'goog.dom.browserrange', 'goog.testing.dom', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/rangeendpoint.js', ['goog.dom.RangeEndpoint'], [], {});\ngoog.addDependency('dom/safe.js', ['goog.dom.safe', 'goog.dom.safe.InsertAdjacentHtmlPosition'], ['goog.asserts', 'goog.dom.asserts', 'goog.functions', 'goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.uncheckedconversions', 'goog.string.Const', 'goog.string.internal'], {});\ngoog.addDependency('dom/safe_test.js', ['goog.dom.safeTest'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.dom.safe.InsertAdjacentHtmlPosition', 'goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.testing', 'goog.string', 'goog.string.Const', 'goog.testing', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/savedcaretrange.js', ['goog.dom.SavedCaretRange'], ['goog.array', 'goog.dom', 'goog.dom.SavedRange', 'goog.dom.TagName', 'goog.string'], {});\ngoog.addDependency('dom/savedcaretrange_test.js', ['goog.dom.SavedCaretRangeTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.SavedCaretRange', 'goog.testing.dom', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/savedrange.js', ['goog.dom.SavedRange'], ['goog.Disposable', 'goog.log'], {});\ngoog.addDependency('dom/savedrange_test.js', ['goog.dom.SavedRangeTest'], ['goog.dom', 'goog.dom.Range', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/selection.js', ['goog.dom.selection'], ['goog.dom.InputType', 'goog.string', 'goog.userAgent'], {});\ngoog.addDependency('dom/selection_test.js', ['goog.dom.selectionTest'], ['goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.selection', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/tagiterator.js', ['goog.dom.TagIterator', 'goog.dom.TagWalkType'], ['goog.dom', 'goog.dom.NodeType', 'goog.iter.Iterator', 'goog.iter.StopIteration'], {});\ngoog.addDependency('dom/tagiterator_test.js', ['goog.dom.TagIteratorTest'], ['goog.dom', 'goog.dom.TagIterator', 'goog.dom.TagName', 'goog.dom.TagWalkType', 'goog.iter', 'goog.iter.StopIteration', 'goog.testing.dom', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/tagname.js', ['goog.dom.TagName'], ['goog.dom.HtmlElement'], {});\ngoog.addDependency('dom/tagname_test.js', ['goog.dom.TagNameTest'], ['goog.dom.TagName', 'goog.object', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/tags.js', ['goog.dom.tags'], ['goog.object'], {});\ngoog.addDependency('dom/tags_test.js', ['goog.dom.tagsTest'], ['goog.dom.tags', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/textassert.js', ['goog.dom.textAssert'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName'], {});\ngoog.addDependency('dom/textassert_test.js', ['goog.dom.textassert_test'], ['goog.dom.textAssert', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/textrange.js', ['goog.dom.TextRange'], ['goog.array', 'goog.dom', 'goog.dom.AbstractRange', 'goog.dom.RangeType', 'goog.dom.SavedRange', 'goog.dom.TagName', 'goog.dom.TextRangeIterator', 'goog.dom.browserrange', 'goog.string', 'goog.userAgent'], {});\ngoog.addDependency('dom/textrange_test.js', ['goog.dom.TextRangeTest'], ['goog.dom', 'goog.dom.ControlRange', 'goog.dom.Range', 'goog.dom.TextRange', 'goog.math.Coordinate', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/textrangeiterator.js', ['goog.dom.TextRangeIterator'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.RangeIterator', 'goog.dom.TagName', 'goog.iter.StopIteration'], {});\ngoog.addDependency('dom/textrangeiterator_test.js', ['goog.dom.TextRangeIteratorTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.TextRangeIterator', 'goog.iter.StopIteration', 'goog.testing.dom', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/uri.js', ['goog.dom.uri'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.uncheckedconversions', 'goog.string.Const'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/uri_test.js', ['goog.dom.uriTest'], ['goog.dom.uri', 'goog.testing.testSuite', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/vendor.js', ['goog.dom.vendor'], ['goog.string', 'goog.userAgent'], {});\ngoog.addDependency('dom/vendor_test.js', ['goog.dom.vendorTest'], ['goog.array', 'goog.dom.vendor', 'goog.labs.userAgent.util', 'goog.testing.MockUserAgent', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgentTestUtil'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/viewportsizemonitor.js', ['goog.dom.ViewportSizeMonitor'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Size'], {});\ngoog.addDependency('dom/viewportsizemonitor_test.js', ['goog.dom.ViewportSizeMonitorTest'], ['goog.dom.ViewportSizeMonitor', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Size', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('dom/xml.js', ['goog.dom.xml'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.safe', 'goog.html.legacyconversions', 'goog.userAgent'], {});\ngoog.addDependency('dom/xml_test.js', ['goog.dom.xmlTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.xml', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/browserfeature.js', ['goog.editor.BrowserFeature'], ['goog.editor.defines', 'goog.labs.userAgent.browser', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});\ngoog.addDependency('editor/browserfeature_test.js', ['goog.editor.BrowserFeatureTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.testing.ExpectedFailures', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/clicktoeditwrapper.js', ['goog.editor.ClickToEditWrapper'], ['goog.Disposable', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.range', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventType'], {});\ngoog.addDependency('editor/clicktoeditwrapper_test.js', ['goog.editor.ClickToEditWrapperTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.ClickToEditWrapper', 'goog.editor.SeamlessField', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/command.js', ['goog.editor.Command'], [], {});\ngoog.addDependency('editor/contenteditablefield.js', ['goog.editor.ContentEditableField'], ['goog.asserts', 'goog.editor.Field', 'goog.log'], {});\ngoog.addDependency('editor/contenteditablefield_test.js', ['goog.editor.ContentEditableFieldTest'], ['goog.dom', 'goog.editor.ContentEditableField', 'goog.html.SafeHtml', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/defines.js', ['goog.editor.defines'], [], {});\ngoog.addDependency('editor/field.js', ['goog.editor.Field', 'goog.editor.Field.EventType'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.array', 'goog.asserts', 'goog.async.Delay', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.dom.safe', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.PluginImpl', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.editor.node', 'goog.editor.range', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.functions', 'goog.html.SafeHtml', 'goog.html.SafeStyleSheet', 'goog.log', 'goog.log.Level', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.userAgent', 'goog.userAgent.product'], {});\ngoog.addDependency('editor/field_test.js', ['goog.editor.field_test'], ['goog.array', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.range', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.functions', 'goog.html.SafeHtml', 'goog.testing.LooseMock', 'goog.testing.MockClock', 'goog.testing.dom', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/focus.js', ['goog.editor.focus'], ['goog.dom.selection'], {});\ngoog.addDependency('editor/focus_test.js', ['goog.editor.focusTest'], ['goog.dom.selection', 'goog.editor.BrowserFeature', 'goog.editor.focus', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/icontent.js', ['goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo'], ['goog.dom', 'goog.editor.BrowserFeature', 'goog.style', 'goog.userAgent'], {});\ngoog.addDependency('editor/icontent_test.js', ['goog.editor.icontentTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/link.js', ['goog.editor.Link'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.node', 'goog.editor.range', 'goog.string', 'goog.string.Unicode', 'goog.uri.utils', 'goog.uri.utils.ComponentIndex'], {});\ngoog.addDependency('editor/link_test.js', ['goog.editor.LinkTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Link', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/node.js', ['goog.editor.node'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.iter.ChildIterator', 'goog.dom.iter.SiblingIterator', 'goog.iter', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.userAgent'], {});\ngoog.addDependency('editor/node_test.js', ['goog.editor.nodeTest'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.editor.node', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.dom', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugin.js', ['goog.editor.Plugin'], ['goog.editor.Field', 'goog.editor.PluginImpl'], {});\ngoog.addDependency('editor/plugin_impl.js', ['goog.editor.PluginImpl'], ['goog.events.EventTarget', 'goog.functions', 'goog.log', 'goog.object', 'goog.reflect', 'goog.userAgent'], {});\ngoog.addDependency('editor/plugin_test.js', ['goog.editor.PluginTest'], ['goog.editor.Field', 'goog.editor.Plugin', 'goog.functions', 'goog.testing.StrictMock', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/abstractbubbleplugin.js', ['goog.editor.plugins.AbstractBubblePlugin'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.editor.Plugin', 'goog.editor.style', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.actionEventWrapper', 'goog.functions', 'goog.string.Unicode', 'goog.ui.Component', 'goog.ui.editor.Bubble', 'goog.userAgent'], {});\ngoog.addDependency('editor/plugins/abstractbubbleplugin_test.js', ['goog.editor.plugins.AbstractBubblePluginTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.plugins.AbstractBubblePlugin', 'goog.events.BrowserEvent', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.functions', 'goog.style', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.testSuite', 'goog.ui.editor.Bubble', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/abstractdialogplugin.js', ['goog.editor.plugins.AbstractDialogPlugin', 'goog.editor.plugins.AbstractDialogPlugin.EventType'], ['goog.dom', 'goog.dom.Range', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.range', 'goog.events', 'goog.ui.editor.AbstractDialog'], {});\ngoog.addDependency('editor/plugins/abstractdialogplugin_test.js', ['goog.editor.plugins.AbstractDialogPluginTest'], ['goog.dom', 'goog.dom.SavedRange', 'goog.dom.TagName', 'goog.editor.Field', 'goog.editor.plugins.AbstractDialogPlugin', 'goog.events.Event', 'goog.events.EventHandler', 'goog.functions', 'goog.html.SafeHtml', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.testing.testSuite', 'goog.ui.editor.AbstractDialog', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/abstracttabhandler.js', ['goog.editor.plugins.AbstractTabHandler'], ['goog.editor.Plugin', 'goog.events.KeyCodes', 'goog.userAgent'], {});\ngoog.addDependency('editor/plugins/abstracttabhandler_test.js', ['goog.editor.plugins.AbstractTabHandlerTest'], ['goog.editor.Field', 'goog.editor.plugins.AbstractTabHandler', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.testing.StrictMock', 'goog.testing.editor.FieldMock', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/basictextformatter.js', ['goog.editor.plugins.BasicTextFormatter', 'goog.editor.plugins.BasicTextFormatter.COMMAND'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Link', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.range', 'goog.editor.style', 'goog.iter', 'goog.iter.StopIteration', 'goog.log', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.ui.editor.messages', 'goog.userAgent'], {});\ngoog.addDependency('editor/plugins/basictextformatter_test.js', ['goog.editor.plugins.BasicTextFormatterTest'], ['goog.array', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.plugins.BasicTextFormatter', 'goog.html.SafeHtml', 'goog.object', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.LooseMock', 'goog.testing.PropertyReplacer', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.mockmatchers', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/blockquote.js', ['goog.editor.plugins.Blockquote'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Plugin', 'goog.editor.node', 'goog.functions', 'goog.log'], {});\ngoog.addDependency('editor/plugins/blockquote_test.js', ['goog.editor.plugins.BlockquoteTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.plugins.Blockquote', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/emoticons.js', ['goog.editor.plugins.Emoticons'], ['goog.dom.TagName', 'goog.editor.Plugin', 'goog.editor.range', 'goog.functions', 'goog.ui.emoji.Emoji', 'goog.userAgent'], {});\ngoog.addDependency('editor/plugins/emoticons_test.js', ['goog.editor.plugins.EmoticonsTest'], ['goog.Uri', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.editor.Field', 'goog.editor.plugins.Emoticons', 'goog.testing.testSuite', 'goog.ui.emoji.Emoji', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/enterhandler.js', ['goog.editor.plugins.EnterHandler'], ['goog.dom', 'goog.dom.NodeOffset', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.plugins.Blockquote', 'goog.editor.range', 'goog.editor.style', 'goog.events.KeyCodes', 'goog.functions', 'goog.object', 'goog.string', 'goog.userAgent'], {});\ngoog.addDependency('editor/plugins/enterhandler_test.js', ['goog.editor.plugins.EnterHandlerTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.plugins.Blockquote', 'goog.editor.plugins.EnterHandler', 'goog.editor.range', 'goog.events', 'goog.events.KeyCodes', 'goog.html.testing', 'goog.testing.ExpectedFailures', 'goog.testing.MockClock', 'goog.testing.dom', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/firststrong.js', ['goog.editor.plugins.FirstStrong'], ['goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.range', 'goog.i18n.bidi', 'goog.i18n.uChar', 'goog.iter', 'goog.userAgent'], {});\ngoog.addDependency('editor/plugins/firststrong_test.js', ['goog.editor.plugins.FirstStrongTest'], ['goog.dom.Range', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.plugins.FirstStrong', 'goog.editor.range', 'goog.events.KeyCodes', 'goog.html.testing', 'goog.testing.MockClock', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/headerformatter.js', ['goog.editor.plugins.HeaderFormatter'], ['goog.editor.Command', 'goog.editor.Plugin', 'goog.userAgent'], {});\ngoog.addDependency('editor/plugins/headerformatter_test.js', ['goog.editor.plugins.HeaderFormatterTest'], ['goog.dom', 'goog.editor.Command', 'goog.editor.plugins.BasicTextFormatter', 'goog.editor.plugins.HeaderFormatter', 'goog.events.BrowserEvent', 'goog.testing.LooseMock', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/linkbubble.js', ['goog.editor.plugins.LinkBubble', 'goog.editor.plugins.LinkBubble.Action'], ['goog.array', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.Link', 'goog.editor.plugins.AbstractBubblePlugin', 'goog.functions', 'goog.string', 'goog.style', 'goog.ui.editor.messages', 'goog.uri.utils', 'goog.window'], {});\ngoog.addDependency('editor/plugins/linkbubble_test.js', ['goog.editor.plugins.LinkBubbleTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.Link', 'goog.editor.plugins.LinkBubble', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.string', 'goog.style', 'goog.testing.FunctionMock', 'goog.testing.PropertyReplacer', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/linkdialogplugin.js', ['goog.editor.plugins.LinkDialogPlugin'], ['goog.array', 'goog.dom', 'goog.editor.Command', 'goog.editor.plugins.AbstractDialogPlugin', 'goog.events.EventHandler', 'goog.functions', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.LinkDialog', 'goog.uri.utils'], {});\ngoog.addDependency('editor/plugins/linkdialogplugin_test.js', ['goog.ui.editor.plugins.LinkDialogTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Link', 'goog.editor.plugins.LinkDialogPlugin', 'goog.html.SafeHtml', 'goog.string', 'goog.string.Unicode', 'goog.testing.MockControl', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.editor.dom', 'goog.testing.events', 'goog.testing.mockmatchers', 'goog.testing.testSuite', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.LinkDialog', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/linkshortcutplugin.js', ['goog.editor.plugins.LinkShortcutPlugin'], ['goog.editor.Command', 'goog.editor.Plugin'], {});\ngoog.addDependency('editor/plugins/linkshortcutplugin_test.js', ['goog.editor.plugins.LinkShortcutPluginTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.Field', 'goog.editor.plugins.BasicTextFormatter', 'goog.editor.plugins.LinkBubble', 'goog.editor.plugins.LinkShortcutPlugin', 'goog.events.KeyCodes', 'goog.testing.PropertyReplacer', 'goog.testing.dom', 'goog.testing.events', 'goog.testing.testSuite', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/listtabhandler.js', ['goog.editor.plugins.ListTabHandler'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.plugins.AbstractTabHandler', 'goog.iter'], {});\ngoog.addDependency('editor/plugins/listtabhandler_test.js', ['goog.editor.plugins.ListTabHandlerTest'], ['goog.dom', 'goog.editor.Command', 'goog.editor.plugins.ListTabHandler', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.functions', 'goog.testing.StrictMock', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/loremipsum.js', ['goog.editor.plugins.LoremIpsum'], ['goog.asserts', 'goog.dom', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.node', 'goog.functions', 'goog.html.SafeHtml', 'goog.userAgent'], {});\ngoog.addDependency('editor/plugins/loremipsum_test.js', ['goog.editor.plugins.LoremIpsumTest'], ['goog.dom', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.plugins.LoremIpsum', 'goog.html.SafeHtml', 'goog.string.Unicode', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/removeformatting.js', ['goog.editor.plugins.RemoveFormatting'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.range', 'goog.string', 'goog.userAgent'], {});\ngoog.addDependency('editor/plugins/removeformatting_test.js', ['goog.editor.plugins.RemoveFormattingTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.plugins.RemoveFormatting', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.dom', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/spacestabhandler.js', ['goog.editor.plugins.SpacesTabHandler'], ['goog.dom.TagName', 'goog.editor.plugins.AbstractTabHandler', 'goog.editor.range'], {});\ngoog.addDependency('editor/plugins/spacestabhandler_test.js', ['goog.editor.plugins.SpacesTabHandlerTest'], ['goog.dom', 'goog.dom.Range', 'goog.editor.plugins.SpacesTabHandler', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.functions', 'goog.testing.StrictMock', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/tableeditor.js', ['goog.editor.plugins.TableEditor'], ['goog.array', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Plugin', 'goog.editor.Table', 'goog.editor.node', 'goog.editor.range', 'goog.object', 'goog.userAgent'], {});\ngoog.addDependency('editor/plugins/tableeditor_test.js', ['goog.editor.plugins.TableEditorTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.plugins.TableEditor', 'goog.object', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.TestCase', 'goog.testing.editor.FieldMock', 'goog.testing.editor.TestHelper', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/tagonenterhandler.js', ['goog.editor.plugins.TagOnEnterHandler'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.Command', 'goog.editor.node', 'goog.editor.plugins.EnterHandler', 'goog.editor.range', 'goog.editor.style', 'goog.events.KeyCodes', 'goog.functions', 'goog.string.Unicode', 'goog.style', 'goog.userAgent'], {});\ngoog.addDependency('editor/plugins/tagonenterhandler_test.js', ['goog.editor.plugins.TagOnEnterHandlerTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.plugins.TagOnEnterHandler', 'goog.events.KeyCodes', 'goog.html.SafeHtml', 'goog.string.Unicode', 'goog.testing.dom', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/undoredo.js', ['goog.editor.plugins.UndoRedo'], ['goog.dom', 'goog.dom.NodeOffset', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.editor.Command', 'goog.editor.Field', 'goog.editor.Plugin', 'goog.editor.node', 'goog.editor.plugins.UndoRedoManager', 'goog.editor.plugins.UndoRedoState', 'goog.events', 'goog.events.EventHandler', 'goog.log', 'goog.object'], {});\ngoog.addDependency('editor/plugins/undoredo_test.js', ['goog.editor.plugins.UndoRedoTest'], ['goog.array', 'goog.dom', 'goog.dom.browserrange', 'goog.editor.Field', 'goog.editor.plugins.LoremIpsum', 'goog.editor.plugins.UndoRedo', 'goog.events', 'goog.functions', 'goog.html.SafeHtml', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/undoredomanager.js', ['goog.editor.plugins.UndoRedoManager', 'goog.editor.plugins.UndoRedoManager.EventType'], ['goog.editor.plugins.UndoRedoState', 'goog.events', 'goog.events.EventTarget'], {});\ngoog.addDependency('editor/plugins/undoredomanager_test.js', ['goog.editor.plugins.UndoRedoManagerTest'], ['goog.editor.plugins.UndoRedoManager', 'goog.editor.plugins.UndoRedoState', 'goog.events', 'goog.testing.StrictMock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/plugins/undoredostate.js', ['goog.editor.plugins.UndoRedoState'], ['goog.events.EventTarget'], {});\ngoog.addDependency('editor/plugins/undoredostate_test.js', ['goog.editor.plugins.UndoRedoStateTest'], ['goog.editor.plugins.UndoRedoState', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/range.js', ['goog.editor.range', 'goog.editor.range.Point'], ['goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.dom.RangeEndpoint', 'goog.dom.SavedCaretRange', 'goog.editor.node', 'goog.editor.style', 'goog.iter', 'goog.userAgent'], {});\ngoog.addDependency('editor/range_test.js', ['goog.editor.rangeTest'], ['goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.range', 'goog.editor.range.Point', 'goog.string', 'goog.testing.dom', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/seamlessfield.js', ['goog.editor.SeamlessField'], ['goog.cssom.iframe.style', 'goog.dom', 'goog.dom.Range', 'goog.dom.TagName', 'goog.dom.safe', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.icontent', 'goog.editor.icontent.FieldFormatInfo', 'goog.editor.icontent.FieldStyleInfo', 'goog.editor.node', 'goog.events', 'goog.events.EventType', 'goog.html.SafeHtml', 'goog.log', 'goog.style'], {});\ngoog.addDependency('editor/seamlessfield_test.js', ['goog.editor.seamlessfield_test'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.Range', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Field', 'goog.editor.SeamlessField', 'goog.events', 'goog.functions', 'goog.html.SafeHtml', 'goog.style', 'goog.testing.MockClock', 'goog.testing.MockRange', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/style.js', ['goog.editor.style'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.object', 'goog.style', 'goog.userAgent'], {});\ngoog.addDependency('editor/style_test.js', ['goog.editor.styleTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.style', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.style', 'goog.testing.LooseMock', 'goog.testing.mockmatchers', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('editor/table.js', ['goog.editor.Table', 'goog.editor.TableCell', 'goog.editor.TableRow'], ['goog.asserts', 'goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.log', 'goog.string.Unicode', 'goog.style'], {});\ngoog.addDependency('editor/table_test.js', ['goog.editor.TableTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.Table', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/actioneventwrapper.js', ['goog.events.actionEventWrapper'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.EventWrapper', 'goog.events.KeyCodes'], {});\ngoog.addDependency('events/actioneventwrapper_test.js', ['goog.events.actionEventWrapperTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.events', 'goog.events.EventHandler', 'goog.events.KeyCodes', 'goog.events.actionEventWrapper', 'goog.testing.events', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/actionhandler.js', ['goog.events.ActionEvent', 'goog.events.ActionHandler', 'goog.events.ActionHandler.EventType', 'goog.events.BeforeActionEvent'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent'], {});\ngoog.addDependency('events/actionhandler_test.js', ['goog.events.ActionHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.ActionHandler', 'goog.testing.events', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/browserevent.js', ['goog.events.BrowserEvent', 'goog.events.BrowserEvent.MouseButton', 'goog.events.BrowserEvent.PointerType'], ['goog.debug', 'goog.events.BrowserFeature', 'goog.events.Event', 'goog.events.EventType', 'goog.reflect', 'goog.userAgent'], {});\ngoog.addDependency('events/browserevent_test.js', ['goog.events.BrowserEventTest'], ['goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.math.Coordinate', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/browserfeature.js', ['goog.events.BrowserFeature'], ['goog.userAgent'], {});\ngoog.addDependency('events/event.js', ['goog.events.Event', 'goog.events.EventLike'], ['goog.Disposable', 'goog.events.EventId'], {});\ngoog.addDependency('events/event_test.js', ['goog.events.EventTest'], ['goog.events.Event', 'goog.events.EventId', 'goog.events.EventTarget', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/eventhandler.js', ['goog.events.EventHandler'], ['goog.Disposable', 'goog.events', 'goog.object'], {});\ngoog.addDependency('events/eventhandler_test.js', ['goog.events.EventHandlerTest'], ['goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.testing.PropertyReplacer', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/eventid.js', ['goog.events.EventId'], [], {});\ngoog.addDependency('events/events.js', ['goog.events', 'goog.events.CaptureSimulationMode', 'goog.events.Key', 'goog.events.ListenableType'], ['goog.asserts', 'goog.debug.entryPointRegistry', 'goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.events.Listenable', 'goog.events.ListenerMap'], {});\ngoog.addDependency('events/events_test.js', ['goog.eventsTest'], ['goog.asserts.AssertionError', 'goog.debug.EntryPointMonitor', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.BrowserFeature', 'goog.events.CaptureSimulationMode', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.Listener', 'goog.functions', 'goog.testing.PropertyReplacer', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/eventtarget.js', ['goog.events.EventTarget'], ['goog.Disposable', 'goog.asserts', 'goog.events', 'goog.events.Event', 'goog.events.Listenable', 'goog.events.ListenerMap', 'goog.object'], {});\ngoog.addDependency('events/eventtarget_test.js', ['goog.events.EventTargetTest'], ['goog.events.EventTarget', 'goog.events.Listenable', 'goog.events.eventTargetTester', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/eventtarget_via_googevents_test.js', ['goog.events.EventTargetGoogEventsTest'], ['goog.events', 'goog.events.EventTarget', 'goog.events.eventTargetTester', 'goog.testing', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/eventtarget_via_w3cinterface_test.js', ['goog.events.EventTargetW3CTest'], ['goog.events.EventTarget', 'goog.events.eventTargetTester', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/eventtargettester.js', ['goog.events.eventTargetTester'], ['goog.array', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.Listenable', 'goog.testing.asserts', 'goog.testing.recordFunction'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/eventtype.js', ['goog.events.EventType', 'goog.events.MouseAsMouseEventType', 'goog.events.MouseEvents', 'goog.events.PointerAsMouseEventType', 'goog.events.PointerAsTouchEventType', 'goog.events.PointerFallbackEventType', 'goog.events.PointerTouchFallbackEventType'], ['goog.events.BrowserFeature', 'goog.userAgent'], {});\ngoog.addDependency('events/eventtype_test.js', ['goog.events.EventTypeTest'], ['goog.events.BrowserFeature', 'goog.events.EventType', 'goog.events.PointerFallbackEventType', 'goog.events.PointerTouchFallbackEventType', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/eventwrapper.js', ['goog.events.EventWrapper'], [], {});\ngoog.addDependency('events/filedrophandler.js', ['goog.events.FileDropHandler', 'goog.events.FileDropHandler.EventType'], ['goog.array', 'goog.dom', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.log', 'goog.log.Level'], {});\ngoog.addDependency('events/filedrophandler_test.js', ['goog.events.FileDropHandlerTest'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.FileDropHandler', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/focushandler.js', ['goog.events.FocusHandler', 'goog.events.FocusHandler.EventType'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.userAgent'], {});\ngoog.addDependency('events/imehandler.js', ['goog.events.ImeHandler', 'goog.events.ImeHandler.Event', 'goog.events.ImeHandler.EventType'], ['goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent'], {});\ngoog.addDependency('events/imehandler_test.js', ['goog.events.ImeHandlerTest'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.ImeHandler', 'goog.events.KeyCodes', 'goog.object', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/inputhandler.js', ['goog.events.InputHandler', 'goog.events.InputHandler.EventType'], ['goog.Timer', 'goog.dom.TagName', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.KeyCodes', 'goog.userAgent'], {});\ngoog.addDependency('events/inputhandler_test.js', ['goog.events.InputHandlerTest'], ['goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/keycodes.js', ['goog.events.KeyCodes'], ['goog.userAgent'], {});\ngoog.addDependency('events/keycodes_test.js', ['goog.events.KeyCodesTest'], ['goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.userAgent'], {'lang': 'es6'});\ngoog.addDependency('events/keyhandler.js', ['goog.events.KeyEvent', 'goog.events.KeyHandler', 'goog.events.KeyHandler.EventType'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.userAgent'], {});\ngoog.addDependency('events/keyhandler_test.js', ['goog.events.KeyEventTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.testing.events', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/keynames.js', ['goog.events.KeyNames'], [], {});\ngoog.addDependency('events/keys.js', ['goog.events.Keys'], [], {'lang': 'es5'});\ngoog.addDependency('events/listenable.js', ['goog.events.Listenable', 'goog.events.ListenableKey'], ['goog.events.EventId'], {});\ngoog.addDependency('events/listenable_test.js', ['goog.events.ListenableTest'], ['goog.events.Listenable', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/listener.js', ['goog.events.Listener'], ['goog.events.ListenableKey'], {});\ngoog.addDependency('events/listenermap.js', ['goog.events.ListenerMap'], ['goog.array', 'goog.events.Listener', 'goog.object'], {});\ngoog.addDependency('events/listenermap_test.js', ['goog.events.ListenerMapTest'], ['goog.dispose', 'goog.events', 'goog.events.EventId', 'goog.events.EventTarget', 'goog.events.ListenerMap', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/mousewheelhandler.js', ['goog.events.MouseWheelEvent', 'goog.events.MouseWheelHandler', 'goog.events.MouseWheelHandler.EventType'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.math', 'goog.style', 'goog.userAgent'], {});\ngoog.addDependency('events/mousewheelhandler_test.js', ['goog.events.MouseWheelHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.MouseWheelEvent', 'goog.events.MouseWheelHandler', 'goog.functions', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/onlinehandler.js', ['goog.events.OnlineHandler', 'goog.events.OnlineHandler.EventType'], ['goog.Timer', 'goog.events.BrowserFeature', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.net.NetworkStatusMonitor'], {});\ngoog.addDependency('events/onlinelistener_test.js', ['goog.events.OnlineHandlerTest'], ['goog.events', 'goog.events.BrowserFeature', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.OnlineHandler', 'goog.net.NetworkStatusMonitor', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/pastehandler.js', ['goog.events.PasteHandler', 'goog.events.PasteHandler.EventType', 'goog.events.PasteHandler.State'], ['goog.Timer', 'goog.async.ConditionalDelay', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.log', 'goog.userAgent'], {});\ngoog.addDependency('events/pastehandler_test.js', ['goog.events.PasteHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.PasteHandler', 'goog.testing.MockClock', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('events/wheelevent.js', ['goog.events.WheelEvent'], ['goog.asserts', 'goog.events.BrowserEvent'], {});\ngoog.addDependency('events/wheelhandler.js', ['goog.events.WheelHandler'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.WheelEvent', 'goog.style', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});\ngoog.addDependency('events/wheelhandler_test.js', ['goog.events.WheelHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.WheelEvent', 'goog.events.WheelHandler', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('format/emailaddress.js', ['goog.format.EmailAddress'], ['goog.string'], {});\ngoog.addDependency('format/emailaddress_test.js', ['goog.format.EmailAddressTest'], ['goog.array', 'goog.format.EmailAddress', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('format/format.js', ['goog.format'], ['goog.i18n.GraphemeBreak', 'goog.string', 'goog.userAgent'], {});\ngoog.addDependency('format/format_test.js', ['goog.formatTest'], ['goog.dom', 'goog.dom.TagName', 'goog.format', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('format/htmlprettyprinter.js', ['goog.format.HtmlPrettyPrinter', 'goog.format.HtmlPrettyPrinter.Buffer'], ['goog.dom.TagName', 'goog.object', 'goog.string.StringBuffer'], {});\ngoog.addDependency('format/htmlprettyprinter_test.js', ['goog.format.HtmlPrettyPrinterTest'], ['goog.format.HtmlPrettyPrinter', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('format/internationalizedemailaddress.js', ['goog.format.InternationalizedEmailAddress'], ['goog.format.EmailAddress', 'goog.string'], {});\ngoog.addDependency('format/internationalizedemailaddress_test.js', ['goog.format.InternationalizedEmailAddressTest'], ['goog.array', 'goog.format.InternationalizedEmailAddress', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('format/jsonprettyprinter.js', ['goog.format.JsonPrettyPrinter', 'goog.format.JsonPrettyPrinter.SafeHtmlDelimiters', 'goog.format.JsonPrettyPrinter.TextDelimiters'], ['goog.html.SafeHtml', 'goog.json', 'goog.json.Serializer', 'goog.string', 'goog.string.format'], {});\ngoog.addDependency('format/jsonprettyprinter_test.js', ['goog.format.JsonPrettyPrinterTest'], ['goog.format.JsonPrettyPrinter', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('fs/entry.js', ['goog.fs.DirectoryEntry', 'goog.fs.DirectoryEntry.Behavior', 'goog.fs.Entry', 'goog.fs.FileEntry'], [], {});\ngoog.addDependency('fs/entryimpl.js', ['goog.fs.DirectoryEntryImpl', 'goog.fs.EntryImpl', 'goog.fs.FileEntryImpl'], ['goog.array', 'goog.async.Deferred', 'goog.fs.DirectoryEntry', 'goog.fs.Entry', 'goog.fs.Error', 'goog.fs.FileEntry', 'goog.fs.FileWriter', 'goog.functions', 'goog.string'], {});\ngoog.addDependency('fs/error.js', ['goog.fs.DOMErrorLike', 'goog.fs.Error', 'goog.fs.Error.ErrorCode'], ['goog.asserts', 'goog.debug.Error', 'goog.object', 'goog.string'], {});\ngoog.addDependency('fs/filereader.js', ['goog.fs.FileReader', 'goog.fs.FileReader.EventType', 'goog.fs.FileReader.ReadyState'], ['goog.async.Deferred', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.ProgressEvent'], {});\ngoog.addDependency('fs/filesaver.js', ['goog.fs.FileSaver', 'goog.fs.FileSaver.EventType', 'goog.fs.FileSaver.ReadyState'], ['goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.ProgressEvent'], {});\ngoog.addDependency('fs/filesystem.js', ['goog.fs.FileSystem'], [], {});\ngoog.addDependency('fs/filesystemimpl.js', ['goog.fs.FileSystemImpl'], ['goog.fs.DirectoryEntryImpl', 'goog.fs.FileSystem'], {});\ngoog.addDependency('fs/filewriter.js', ['goog.fs.FileWriter'], ['goog.fs.Error', 'goog.fs.FileSaver'], {});\ngoog.addDependency('fs/fs.js', ['goog.fs'], ['goog.array', 'goog.async.Deferred', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.fs.FileSystemImpl', 'goog.fs.url', 'goog.userAgent'], {});\ngoog.addDependency('fs/fs_test.js', ['goog.fsTest'], ['goog.Promise', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.fs', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.fs.FileSaver', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('fs/progressevent.js', ['goog.fs.ProgressEvent'], ['goog.events.Event'], {});\ngoog.addDependency('fs/url.js', ['goog.fs.url'], [], {'lang': 'es6'});\ngoog.addDependency('fs/url_test.js', ['goog.urlTest'], ['goog.fs.url', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('functions/functions.js', ['goog.functions'], [], {'lang': 'es6'});\ngoog.addDependency('functions/functions_test.js', ['goog.functionsTest'], ['goog.array', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('fx/abstractdragdrop.js', ['goog.fx.AbstractDragDrop', 'goog.fx.AbstractDragDrop.EventType', 'goog.fx.DragDropEvent', 'goog.fx.DragDropItem'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style'], {});\ngoog.addDependency('fx/abstractdragdrop_test.js', ['goog.fx.AbstractDragDropTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.functions', 'goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit'], {'lang': 'es6'});\ngoog.addDependency('fx/anim/anim.js', ['goog.fx.anim', 'goog.fx.anim.Animated'], ['goog.async.AnimationDelay', 'goog.async.Delay', 'goog.object'], {});\ngoog.addDependency('fx/anim/anim_test.js', ['goog.fx.animTest'], ['goog.async.AnimationDelay', 'goog.async.Delay', 'goog.events', 'goog.functions', 'goog.fx.Animation', 'goog.fx.anim', 'goog.object', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('fx/animation.js', ['goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.fx.Animation.State', 'goog.fx.AnimationEvent'], ['goog.array', 'goog.asserts', 'goog.events.Event', 'goog.fx.Transition', 'goog.fx.TransitionBase', 'goog.fx.anim', 'goog.fx.anim.Animated'], {});\ngoog.addDependency('fx/animation_test.js', ['goog.fx.AnimationTest'], ['goog.events', 'goog.fx.Animation', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('fx/animationqueue.js', ['goog.fx.AnimationParallelQueue', 'goog.fx.AnimationQueue', 'goog.fx.AnimationSerialQueue'], ['goog.array', 'goog.asserts', 'goog.events', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.fx.TransitionBase'], {});\ngoog.addDependency('fx/animationqueue_test.js', ['goog.fx.AnimationQueueTest'], ['goog.events', 'goog.fx.Animation', 'goog.fx.AnimationParallelQueue', 'goog.fx.AnimationSerialQueue', 'goog.fx.Transition', 'goog.fx.anim', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('fx/css3/fx.js', ['goog.fx.css3'], ['goog.fx.css3.Transition'], {});\ngoog.addDependency('fx/css3/transition.js', ['goog.fx.css3.Transition'], ['goog.Timer', 'goog.asserts', 'goog.fx.TransitionBase', 'goog.style', 'goog.style.transition'], {});\ngoog.addDependency('fx/css3/transition_test.js', ['goog.fx.css3.TransitionTest'], ['goog.dispose', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.fx.Transition', 'goog.fx.css3.Transition', 'goog.style.transition', 'goog.testing.MockClock', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('fx/cssspriteanimation.js', ['goog.fx.CssSpriteAnimation'], ['goog.fx.Animation'], {});\ngoog.addDependency('fx/cssspriteanimation_test.js', ['goog.fx.CssSpriteAnimationTest'], ['goog.fx.CssSpriteAnimation', 'goog.math.Box', 'goog.math.Size', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('fx/dom.js', ['goog.fx.dom', 'goog.fx.dom.BgColorTransform', 'goog.fx.dom.ColorTransform', 'goog.fx.dom.Fade', 'goog.fx.dom.FadeIn', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOut', 'goog.fx.dom.FadeOutAndHide', 'goog.fx.dom.PredefinedEffect', 'goog.fx.dom.Resize', 'goog.fx.dom.ResizeHeight', 'goog.fx.dom.ResizeWidth', 'goog.fx.dom.Scroll', 'goog.fx.dom.Slide', 'goog.fx.dom.SlideFrom', 'goog.fx.dom.Swipe'], ['goog.color', 'goog.events', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.style', 'goog.style.bidi'], {});\ngoog.addDependency('fx/dragdrop.js', ['goog.fx.DragDrop'], ['goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem'], {});\ngoog.addDependency('fx/dragdropgroup.js', ['goog.fx.DragDropGroup'], ['goog.dom', 'goog.fx.AbstractDragDrop', 'goog.fx.DragDropItem'], {});\ngoog.addDependency('fx/dragdropgroup_test.js', ['goog.fx.DragDropGroupTest'], ['goog.events', 'goog.fx.DragDropGroup', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('fx/dragger.js', ['goog.fx.DragEvent', 'goog.fx.Dragger', 'goog.fx.Dragger.EventType'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.style', 'goog.style.bidi', 'goog.userAgent'], {});\ngoog.addDependency('fx/dragger_test.js', ['goog.fx.DraggerTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Rect', 'goog.style.bidi', 'goog.testing.StrictMock', 'goog.testing.events', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('fx/draglistgroup.js', ['goog.fx.DragListDirection', 'goog.fx.DragListGroup', 'goog.fx.DragListGroup.EventType', 'goog.fx.DragListGroupEvent', 'goog.fx.DragListPermission'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventId', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Coordinate', 'goog.string', 'goog.style'], {});\ngoog.addDependency('fx/draglistgroup_test.js', ['goog.fx.DragListGroupTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.events.Event', 'goog.events.EventType', 'goog.fx.DragEvent', 'goog.fx.DragListDirection', 'goog.fx.DragListGroup', 'goog.fx.DragListPermission', 'goog.fx.Dragger', 'goog.math.Coordinate', 'goog.object', 'goog.style', 'goog.testing.events', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('fx/dragscrollsupport.js', ['goog.fx.DragScrollSupport'], ['goog.Disposable', 'goog.Timer', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.style'], {});\ngoog.addDependency('fx/dragscrollsupport_test.js', ['goog.fx.DragScrollSupportTest'], ['goog.fx.DragScrollSupport', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('fx/easing.js', ['goog.fx.easing'], [], {});\ngoog.addDependency('fx/easing_test.js', ['goog.fx.easingTest'], ['goog.fx.easing', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('fx/fx.js', ['goog.fx'], ['goog.asserts', 'goog.fx.Animation', 'goog.fx.Animation.EventType', 'goog.fx.Animation.State', 'goog.fx.AnimationEvent', 'goog.fx.Transition.EventType', 'goog.fx.easing'], {});\ngoog.addDependency('fx/fx_test.js', ['goog.fxTest'], ['goog.fx.Animation', 'goog.object', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('fx/transition.js', ['goog.fx.Transition', 'goog.fx.Transition.EventType'], [], {});\ngoog.addDependency('fx/transitionbase.js', ['goog.fx.TransitionBase', 'goog.fx.TransitionBase.State'], ['goog.events.EventTarget', 'goog.fx.Transition'], {});\ngoog.addDependency('goog.js', [], [], {'lang': 'es6', 'module': 'es6'});\ngoog.addDependency('graphics/abstractgraphics.js', ['goog.graphics.AbstractGraphics'], ['goog.dom', 'goog.graphics.AffineTransform', 'goog.graphics.Element', 'goog.graphics.EllipseElement', 'goog.graphics.Fill', 'goog.graphics.Font', 'goog.graphics.GroupElement', 'goog.graphics.Path', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.Stroke', 'goog.graphics.StrokeAndFillElement', 'goog.graphics.TextElement', 'goog.math.Coordinate', 'goog.math.Size', 'goog.style', 'goog.ui.Component'], {});\ngoog.addDependency('graphics/affinetransform.js', ['goog.graphics.AffineTransform'], [], {'lang': 'es6'});\ngoog.addDependency('graphics/affinetransform_test.js', ['goog.graphics.AffineTransformTest'], ['goog.array', 'goog.graphics', 'goog.graphics.AffineTransform', 'goog.math', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('graphics/canvaselement.js', ['goog.graphics.CanvasEllipseElement', 'goog.graphics.CanvasGroupElement', 'goog.graphics.CanvasImageElement', 'goog.graphics.CanvasPathElement', 'goog.graphics.CanvasRectElement', 'goog.graphics.CanvasTextElement'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.graphics.EllipseElement', 'goog.graphics.Font', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.Path', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement', 'goog.html.SafeHtml', 'goog.html.uncheckedconversions', 'goog.math', 'goog.string', 'goog.string.Const'], {});\ngoog.addDependency('graphics/canvasgraphics.js', ['goog.graphics.CanvasGraphics'], ['goog.dom.TagName', 'goog.events.EventType', 'goog.graphics.AbstractGraphics', 'goog.graphics.CanvasEllipseElement', 'goog.graphics.CanvasGroupElement', 'goog.graphics.CanvasImageElement', 'goog.graphics.CanvasPathElement', 'goog.graphics.CanvasRectElement', 'goog.graphics.CanvasTextElement', 'goog.graphics.Font', 'goog.graphics.SolidFill', 'goog.math.Size', 'goog.style'], {});\ngoog.addDependency('graphics/canvasgraphics_test.js', ['goog.graphics.CanvasGraphicsTest'], ['goog.dom', 'goog.graphics.CanvasGraphics', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('graphics/element.js', ['goog.graphics.Element'], ['goog.asserts', 'goog.events', 'goog.events.EventTarget', 'goog.events.Listenable', 'goog.graphics.AffineTransform', 'goog.math'], {});\ngoog.addDependency('graphics/ellipseelement.js', ['goog.graphics.EllipseElement'], ['goog.graphics.StrokeAndFillElement'], {});\ngoog.addDependency('graphics/ext/coordinates.js', ['goog.graphics.ext.coordinates'], ['goog.string'], {});\ngoog.addDependency('graphics/ext/coordinates_test.js', ['goog.graphics.ext.coordinatesTest'], ['goog.graphics', 'goog.graphics.ext.coordinates', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('graphics/ext/element.js', ['goog.graphics.ext.Element'], ['goog.events.EventTarget', 'goog.functions', 'goog.graphics.ext.coordinates'], {});\ngoog.addDependency('graphics/ext/element_test.js', ['goog.graphics.ext.ElementTest'], ['goog.graphics', 'goog.graphics.ext', 'goog.testing.StrictMock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('graphics/ext/ellipse.js', ['goog.graphics.ext.Ellipse'], ['goog.graphics.ext.StrokeAndFillElement'], {});\ngoog.addDependency('graphics/ext/ext.js', ['goog.graphics.ext'], ['goog.graphics.ext.Ellipse', 'goog.graphics.ext.Graphics', 'goog.graphics.ext.Group', 'goog.graphics.ext.Image', 'goog.graphics.ext.Rectangle', 'goog.graphics.ext.Shape', 'goog.graphics.ext.coordinates'], {});\ngoog.addDependency('graphics/ext/graphics.js', ['goog.graphics.ext.Graphics'], ['goog.events', 'goog.events.EventType', 'goog.graphics', 'goog.graphics.ext.Group'], {});\ngoog.addDependency('graphics/ext/group.js', ['goog.graphics.ext.Group'], ['goog.array', 'goog.graphics.ext.Element'], {});\ngoog.addDependency('graphics/ext/image.js', ['goog.graphics.ext.Image'], ['goog.graphics.ext.Element'], {});\ngoog.addDependency('graphics/ext/path.js', ['goog.graphics.ext.Path'], ['goog.graphics.AffineTransform', 'goog.graphics.Path', 'goog.math.Rect'], {});\ngoog.addDependency('graphics/ext/path_test.js', ['goog.graphics.ext.PathTest'], ['goog.graphics', 'goog.graphics.ext.Path', 'goog.math.Rect', 'goog.testing.graphics', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('graphics/ext/rectangle.js', ['goog.graphics.ext.Rectangle'], ['goog.graphics.ext.StrokeAndFillElement'], {});\ngoog.addDependency('graphics/ext/shape.js', ['goog.graphics.ext.Shape'], ['goog.graphics.ext.StrokeAndFillElement'], {});\ngoog.addDependency('graphics/ext/strokeandfillelement.js', ['goog.graphics.ext.StrokeAndFillElement'], ['goog.graphics.ext.Element'], {});\ngoog.addDependency('graphics/fill.js', ['goog.graphics.Fill'], [], {});\ngoog.addDependency('graphics/font.js', ['goog.graphics.Font'], [], {});\ngoog.addDependency('graphics/graphics.js', ['goog.graphics'], ['goog.dom', 'goog.graphics.CanvasGraphics', 'goog.graphics.SvgGraphics', 'goog.graphics.VmlGraphics', 'goog.userAgent'], {});\ngoog.addDependency('graphics/groupelement.js', ['goog.graphics.GroupElement'], ['goog.graphics.Element'], {});\ngoog.addDependency('graphics/imageelement.js', ['goog.graphics.ImageElement'], ['goog.graphics.Element'], {});\ngoog.addDependency('graphics/lineargradient.js', ['goog.graphics.LinearGradient'], ['goog.asserts', 'goog.graphics.Fill'], {});\ngoog.addDependency('graphics/path.js', ['goog.graphics.Path', 'goog.graphics.Path.Segment'], ['goog.array', 'goog.graphics.AffineTransform', 'goog.math'], {});\ngoog.addDependency('graphics/path_test.js', ['goog.graphics.PathTest'], ['goog.array', 'goog.graphics.AffineTransform', 'goog.graphics.Path', 'goog.testing.graphics', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('graphics/pathelement.js', ['goog.graphics.PathElement'], ['goog.graphics.StrokeAndFillElement'], {});\ngoog.addDependency('graphics/paths.js', ['goog.graphics.paths'], ['goog.graphics.Path', 'goog.math.Coordinate'], {});\ngoog.addDependency('graphics/paths_test.js', ['goog.graphics.pathsTest'], ['goog.dom', 'goog.graphics', 'goog.graphics.paths', 'goog.math.Coordinate', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('graphics/rectelement.js', ['goog.graphics.RectElement'], ['goog.graphics.StrokeAndFillElement'], {});\ngoog.addDependency('graphics/solidfill.js', ['goog.graphics.SolidFill'], ['goog.graphics.Fill'], {});\ngoog.addDependency('graphics/solidfill_test.js', ['goog.graphics.SolidFillTest'], ['goog.graphics.SolidFill', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('graphics/stroke.js', ['goog.graphics.Stroke'], [], {});\ngoog.addDependency('graphics/strokeandfillelement.js', ['goog.graphics.StrokeAndFillElement'], ['goog.graphics.Element'], {});\ngoog.addDependency('graphics/svgelement.js', ['goog.graphics.SvgEllipseElement', 'goog.graphics.SvgGroupElement', 'goog.graphics.SvgImageElement', 'goog.graphics.SvgPathElement', 'goog.graphics.SvgRectElement', 'goog.graphics.SvgTextElement'], ['goog.dom', 'goog.graphics.EllipseElement', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement'], {});\ngoog.addDependency('graphics/svggraphics.js', ['goog.graphics.SvgGraphics'], ['goog.Timer', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.graphics.AbstractGraphics', 'goog.graphics.Font', 'goog.graphics.LinearGradient', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.graphics.SvgEllipseElement', 'goog.graphics.SvgGroupElement', 'goog.graphics.SvgImageElement', 'goog.graphics.SvgPathElement', 'goog.graphics.SvgRectElement', 'goog.graphics.SvgTextElement', 'goog.math', 'goog.math.Size', 'goog.style', 'goog.userAgent'], {});\ngoog.addDependency('graphics/svggraphics_test.js', ['goog.graphics.SvgGraphicsTest'], ['goog.dom', 'goog.graphics.AffineTransform', 'goog.graphics.SolidFill', 'goog.graphics.SvgGraphics', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('graphics/textelement.js', ['goog.graphics.TextElement'], ['goog.graphics.StrokeAndFillElement'], {});\ngoog.addDependency('graphics/vmlelement.js', ['goog.graphics.VmlEllipseElement', 'goog.graphics.VmlGroupElement', 'goog.graphics.VmlImageElement', 'goog.graphics.VmlPathElement', 'goog.graphics.VmlRectElement', 'goog.graphics.VmlTextElement'], ['goog.dom', 'goog.graphics.EllipseElement', 'goog.graphics.GroupElement', 'goog.graphics.ImageElement', 'goog.graphics.PathElement', 'goog.graphics.RectElement', 'goog.graphics.TextElement'], {});\ngoog.addDependency('graphics/vmlgraphics.js', ['goog.graphics.VmlGraphics'], ['goog.array', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.graphics.AbstractGraphics', 'goog.graphics.Font', 'goog.graphics.LinearGradient', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.graphics.VmlEllipseElement', 'goog.graphics.VmlGroupElement', 'goog.graphics.VmlImageElement', 'goog.graphics.VmlPathElement', 'goog.graphics.VmlRectElement', 'goog.graphics.VmlTextElement', 'goog.html.uncheckedconversions', 'goog.math', 'goog.math.Size', 'goog.reflect', 'goog.string', 'goog.string.Const', 'goog.style', 'goog.userAgent'], {});\ngoog.addDependency('history/event.js', ['goog.history.Event'], ['goog.events.Event', 'goog.history.EventType'], {});\ngoog.addDependency('history/eventtype.js', ['goog.history.EventType'], [], {});\ngoog.addDependency('history/history.js', ['goog.History', 'goog.History.Event', 'goog.History.EventType'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.safe', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.history.Event', 'goog.history.EventType', 'goog.html.SafeHtml', 'goog.html.TrustedResourceUrl', 'goog.html.uncheckedconversions', 'goog.labs.userAgent.device', 'goog.memoize', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});\ngoog.addDependency('history/history_test.js', ['goog.HistoryTest'], ['goog.History', 'goog.dispose', 'goog.dom', 'goog.html.TrustedResourceUrl', 'goog.string.Const', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('history/html5history.js', ['goog.history.Html5History', 'goog.history.Html5History.TokenTransformer'], ['goog.asserts', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.history.Event'], {});\ngoog.addDependency('history/html5history_test.js', ['goog.history.Html5HistoryTest'], ['goog.Timer', 'goog.events', 'goog.events.EventType', 'goog.history.EventType', 'goog.history.Html5History', 'goog.testing.MockControl', 'goog.testing.mockmatchers', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/cssspecificity.js', ['goog.html.CssSpecificity'], ['goog.userAgent', 'goog.userAgent.product'], {'module': 'goog'});\ngoog.addDependency('html/cssspecificity_test.js', ['goog.html.CssSpecificityTest'], ['goog.html.CssSpecificity', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/flash.js', ['goog.html.flash'], ['goog.asserts', 'goog.html.SafeHtml'], {});\ngoog.addDependency('html/flash_test.js', ['goog.html.flashTest'], ['goog.html.SafeHtml', 'goog.html.TrustedResourceUrl', 'goog.html.flash', 'goog.string.Const', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/legacyconversions.js', ['goog.html.legacyconversions'], ['goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl'], {});\ngoog.addDependency('html/legacyconversions_test.js', ['goog.html.legacyconversionsTest'], ['goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.legacyconversions', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/safehtml.js', ['goog.html.SafeHtml'], ['goog.array', 'goog.asserts', 'goog.dom.TagName', 'goog.dom.tags', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.trustedtypes', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.labs.userAgent.browser', 'goog.object', 'goog.string.Const', 'goog.string.TypedString', 'goog.string.internal'], {});\ngoog.addDependency('html/safehtml_test.js', ['goog.html.safeHtmlTest'], ['goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.testing', 'goog.html.trustedtypes', 'goog.i18n.bidi.Dir', 'goog.labs.userAgent.browser', 'goog.object', 'goog.string.Const', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/safehtmlformatter.js', ['goog.html.SafeHtmlFormatter'], ['goog.asserts', 'goog.dom.tags', 'goog.html.SafeHtml', 'goog.string'], {});\ngoog.addDependency('html/safehtmlformatter_test.js', ['goog.html.safeHtmlFormatterTest'], ['goog.html.SafeHtml', 'goog.html.SafeHtmlFormatter', 'goog.html.SafeUrl', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/safescript.js', ['goog.html.SafeScript'], ['goog.asserts', 'goog.html.trustedtypes', 'goog.string.Const', 'goog.string.TypedString'], {});\ngoog.addDependency('html/safescript_test.js', ['goog.html.safeScriptTest'], ['goog.html.SafeScript', 'goog.html.trustedtypes', 'goog.object', 'goog.string.Const', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/safestyle.js', ['goog.html.SafeStyle'], ['goog.array', 'goog.asserts', 'goog.html.SafeUrl', 'goog.string.Const', 'goog.string.TypedString', 'goog.string.internal'], {'lang': 'es5'});\ngoog.addDependency('html/safestyle_test.js', ['goog.html.safeStyleTest'], ['goog.html.SafeStyle', 'goog.html.SafeUrl', 'goog.object', 'goog.string.Const', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/safestylesheet.js', ['goog.html.SafeStyleSheet'], ['goog.array', 'goog.asserts', 'goog.html.SafeStyle', 'goog.object', 'goog.string.Const', 'goog.string.TypedString', 'goog.string.internal'], {});\ngoog.addDependency('html/safestylesheet_test.js', ['goog.html.safeStyleSheetTest'], ['goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.object', 'goog.string.Const', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/safeurl.js', ['goog.html.SafeUrl'], ['goog.asserts', 'goog.fs.url', 'goog.html.TrustedResourceUrl', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.string.Const', 'goog.string.TypedString', 'goog.string.internal'], {});\ngoog.addDependency('html/safeurl_test.js', ['goog.html.safeUrlTest'], ['goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.safeUrlTestVectors', 'goog.i18n.bidi.Dir', 'goog.object', 'goog.string.Const', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/safeurl_test_vectors.js', ['goog.html.safeUrlTestVectors'], [], {});\ngoog.addDependency('html/sanitizer/attributewhitelist.js', ['goog.html.sanitizer.AttributeSanitizedWhitelist', 'goog.html.sanitizer.AttributeWhitelist'], [], {});\ngoog.addDependency('html/sanitizer/csspropertysanitizer.js', ['goog.html.sanitizer.CssPropertySanitizer'], ['goog.asserts', 'goog.html.SafeUrl', 'goog.object', 'goog.string'], {'module': 'goog'});\ngoog.addDependency('html/sanitizer/csspropertysanitizer_test.js', ['goog.html.sanitizer.CssPropertySanitizerTest'], ['goog.functions', 'goog.html.SafeUrl', 'goog.html.sanitizer.CssPropertySanitizer', 'goog.html.sanitizer.noclobber', 'goog.testing.testSuite', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/sanitizer/csssanitizer.js', ['goog.html.sanitizer.CssSanitizer'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.CssSpecificity', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.sanitizer.CssPropertySanitizer', 'goog.html.sanitizer.noclobber', 'goog.html.uncheckedconversions', 'goog.object', 'goog.string', 'goog.string.Const', 'goog.userAgent', 'goog.userAgent.product'], {});\ngoog.addDependency('html/sanitizer/csssanitizer_test.js', ['goog.html.CssSanitizerTest'], ['goog.array', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.sanitizer.CssSanitizer', 'goog.html.testing', 'goog.string', 'goog.testing.dom', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/sanitizer/elementweakmap.js', ['goog.html.sanitizer.ElementWeakMap'], ['goog.html.sanitizer.noclobber'], {'module': 'goog'});\ngoog.addDependency('html/sanitizer/elementweakmap_test.js', ['goog.html.sanitizer.ElementWeakMapTest'], ['goog.html.sanitizer.ElementWeakMap', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/sanitizer/html_test_vectors.js', ['goog.html.htmlTestVectors'], [], {'lang': 'es5'});\ngoog.addDependency('html/sanitizer/htmlsanitizer.js', ['goog.html.sanitizer.HtmlSanitizer', 'goog.html.sanitizer.HtmlSanitizer.Builder', 'goog.html.sanitizer.HtmlSanitizerAttributePolicy', 'goog.html.sanitizer.HtmlSanitizerPolicy', 'goog.html.sanitizer.HtmlSanitizerPolicyContext', 'goog.html.sanitizer.HtmlSanitizerPolicyHints', 'goog.html.sanitizer.HtmlSanitizerUrlPolicy'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.functions', 'goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.sanitizer.AttributeSanitizedWhitelist', 'goog.html.sanitizer.AttributeWhitelist', 'goog.html.sanitizer.CssSanitizer', 'goog.html.sanitizer.SafeDomTreeProcessor', 'goog.html.sanitizer.TagBlacklist', 'goog.html.sanitizer.TagWhitelist', 'goog.html.sanitizer.noclobber', 'goog.html.uncheckedconversions', 'goog.object', 'goog.string', 'goog.string.Const'], {'lang': 'es5'});\ngoog.addDependency('html/sanitizer/htmlsanitizer_test.js', ['goog.html.HtmlSanitizerTest'], ['goog.array', 'goog.dom', 'goog.functions', 'goog.html.SafeHtml', 'goog.html.SafeUrl', 'goog.html.sanitizer.HtmlSanitizer', 'goog.html.sanitizer.HtmlSanitizer.Builder', 'goog.html.sanitizer.TagWhitelist', 'goog.html.testing', 'goog.object', 'goog.string.Const', 'goog.testing.dom', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/sanitizer/htmlsanitizer_unified_test.js', ['goog.html.HtmlSanitizerUnifiedTest'], ['goog.html.SafeHtml', 'goog.html.htmlTestVectors', 'goog.html.sanitizer.HtmlSanitizer.Builder', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/sanitizer/noclobber.js', ['goog.html.sanitizer.noclobber'], ['goog.asserts', 'goog.dom.NodeType', 'goog.userAgent.product'], {'lang': 'es5', 'module': 'goog'});\ngoog.addDependency('html/sanitizer/noclobber_test.js', ['goog.html.sanitizer.noclobberTest'], ['goog.dom.NodeType', 'goog.html.sanitizer.noclobber', 'goog.testing.PropertyReplacer', 'goog.testing.dom', 'goog.testing.testSuite', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/sanitizer/safedomtreeprocessor.js', ['goog.html.sanitizer.SafeDomTreeProcessor'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.sanitizer.ElementWeakMap', 'goog.html.sanitizer.noclobber', 'goog.html.uncheckedconversions', 'goog.log', 'goog.string.Const', 'goog.userAgent'], {'module': 'goog'});\ngoog.addDependency('html/sanitizer/safedomtreeprocessor_test.js', ['goog.html.sanitizer.SafeDomTreeProcessorTest'], ['goog.html.sanitizer.SafeDomTreeProcessor', 'goog.html.sanitizer.noclobber', 'goog.testing.dom', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/sanitizer/tagblacklist.js', ['goog.html.sanitizer.TagBlacklist'], [], {});\ngoog.addDependency('html/sanitizer/tagwhitelist.js', ['goog.html.sanitizer.TagWhitelist'], [], {});\ngoog.addDependency('html/sanitizer/unsafe.js', ['goog.html.sanitizer.unsafe'], ['goog.asserts', 'goog.html.sanitizer.HtmlSanitizer.Builder', 'goog.string', 'goog.string.Const'], {});\ngoog.addDependency('html/sanitizer/unsafe_test.js', ['goog.html.UnsafeTest'], ['goog.html.SafeHtml', 'goog.html.sanitizer.AttributeWhitelist', 'goog.html.sanitizer.HtmlSanitizer', 'goog.html.sanitizer.TagWhitelist', 'goog.html.sanitizer.unsafe', 'goog.string.Const', 'goog.testing.dom', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/silverlight.js', ['goog.html.silverlight'], ['goog.html.SafeHtml', 'goog.html.TrustedResourceUrl', 'goog.html.flash', 'goog.string.Const'], {});\ngoog.addDependency('html/silverlight_test.js', ['goog.html.silverlightTest'], ['goog.html.SafeHtml', 'goog.html.TrustedResourceUrl', 'goog.html.silverlight', 'goog.string.Const', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/testing.js', ['goog.html.testing'], ['goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.testing.mockmatchers.ArgumentMatcher'], {});\ngoog.addDependency('html/textextractor.js', ['goog.html.textExtractor'], ['goog.array', 'goog.dom.TagName', 'goog.html.sanitizer.HtmlSanitizer', 'goog.object', 'goog.userAgent'], {});\ngoog.addDependency('html/textextractor_test.js', ['goog.html.textExtractorTest'], ['goog.html.textExtractor', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/trustedresourceurl.js', ['goog.html.TrustedResourceUrl'], ['goog.asserts', 'goog.html.trustedtypes', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.string.Const', 'goog.string.TypedString'], {});\ngoog.addDependency('html/trustedresourceurl_test.js', ['goog.html.trustedResourceUrlTest'], ['goog.html.TrustedResourceUrl', 'goog.html.trustedtypes', 'goog.i18n.bidi.Dir', 'goog.object', 'goog.string.Const', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/trustedtypes.js', ['goog.html.trustedtypes'], [], {});\ngoog.addDependency('html/uncheckedconversions.js', ['goog.html.uncheckedconversions'], ['goog.asserts', 'goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.string.Const', 'goog.string.internal'], {});\ngoog.addDependency('html/uncheckedconversions_test.js', ['goog.html.uncheckedconversionsTest'], ['goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.uncheckedconversions', 'goog.i18n.bidi.Dir', 'goog.string.Const', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('html/utils.js', ['goog.html.utils'], ['goog.string'], {});\ngoog.addDependency('html/utils_test.js', ['goog.html.UtilsTest'], ['goog.array', 'goog.dom.TagName', 'goog.html.utils', 'goog.object', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/bidi.js', ['goog.i18n.bidi', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.DirectionalString', 'goog.i18n.bidi.Format'], [], {'lang': 'es6'});\ngoog.addDependency('i18n/bidi_test.js', ['goog.i18n.bidiTest'], ['goog.i18n.bidi', 'goog.i18n.bidi.Dir', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/bidiformatter.js', ['goog.i18n.BidiFormatter'], ['goog.html.SafeHtml', 'goog.i18n.bidi', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.Format'], {});\ngoog.addDependency('i18n/bidiformatter_test.js', ['goog.i18n.BidiFormatterTest'], ['goog.html.SafeHtml', 'goog.html.testing', 'goog.i18n.BidiFormatter', 'goog.i18n.bidi.Dir', 'goog.i18n.bidi.Format', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/charlistdecompressor.js', ['goog.i18n.CharListDecompressor'], ['goog.array', 'goog.i18n.uChar'], {});\ngoog.addDependency('i18n/charlistdecompressor_test.js', ['goog.i18n.CharListDecompressorTest'], ['goog.i18n.CharListDecompressor', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/charpickerdata.js', ['goog.i18n.CharPickerData'], [], {});\ngoog.addDependency('i18n/collation.js', ['goog.i18n.collation'], [], {'lang': 'es6'});\ngoog.addDependency('i18n/collation_test.js', ['goog.i18n.collationTest'], ['goog.i18n.collation', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/compactnumberformatsymbols.js', ['goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.CompactNumberFormatSymbols_af', 'goog.i18n.CompactNumberFormatSymbols_am', 'goog.i18n.CompactNumberFormatSymbols_ar', 'goog.i18n.CompactNumberFormatSymbols_ar_DZ', 'goog.i18n.CompactNumberFormatSymbols_ar_EG', 'goog.i18n.CompactNumberFormatSymbols_az', 'goog.i18n.CompactNumberFormatSymbols_be', 'goog.i18n.CompactNumberFormatSymbols_bg', 'goog.i18n.CompactNumberFormatSymbols_bn', 'goog.i18n.CompactNumberFormatSymbols_br', 'goog.i18n.CompactNumberFormatSymbols_bs', 'goog.i18n.CompactNumberFormatSymbols_ca', 'goog.i18n.CompactNumberFormatSymbols_chr', 'goog.i18n.CompactNumberFormatSymbols_cs', 'goog.i18n.CompactNumberFormatSymbols_cy', 'goog.i18n.CompactNumberFormatSymbols_da', 'goog.i18n.CompactNumberFormatSymbols_de', 'goog.i18n.CompactNumberFormatSymbols_de_AT', 'goog.i18n.CompactNumberFormatSymbols_de_CH', 'goog.i18n.CompactNumberFormatSymbols_el', 'goog.i18n.CompactNumberFormatSymbols_en', 'goog.i18n.CompactNumberFormatSymbols_en_AU', 'goog.i18n.CompactNumberFormatSymbols_en_CA', 'goog.i18n.CompactNumberFormatSymbols_en_GB', 'goog.i18n.CompactNumberFormatSymbols_en_IE', 'goog.i18n.CompactNumberFormatSymbols_en_IN', 'goog.i18n.CompactNumberFormatSymbols_en_SG', 'goog.i18n.CompactNumberFormatSymbols_en_US', 'goog.i18n.CompactNumberFormatSymbols_en_ZA', 'goog.i18n.CompactNumberFormatSymbols_es', 'goog.i18n.CompactNumberFormatSymbols_es_419', 'goog.i18n.CompactNumberFormatSymbols_es_ES', 'goog.i18n.CompactNumberFormatSymbols_es_MX', 'goog.i18n.CompactNumberFormatSymbols_es_US', 'goog.i18n.CompactNumberFormatSymbols_et', 'goog.i18n.CompactNumberFormatSymbols_eu', 'goog.i18n.CompactNumberFormatSymbols_fa', 'goog.i18n.CompactNumberFormatSymbols_fi', 'goog.i18n.CompactNumberFormatSymbols_fil', 'goog.i18n.CompactNumberFormatSymbols_fr', 'goog.i18n.CompactNumberFormatSymbols_fr_CA', 'goog.i18n.CompactNumberFormatSymbols_ga', 'goog.i18n.CompactNumberFormatSymbols_gl', 'goog.i18n.CompactNumberFormatSymbols_gsw', 'goog.i18n.CompactNumberFormatSymbols_gu', 'goog.i18n.CompactNumberFormatSymbols_haw', 'goog.i18n.CompactNumberFormatSymbols_he', 'goog.i18n.CompactNumberFormatSymbols_hi', 'goog.i18n.CompactNumberFormatSymbols_hr', 'goog.i18n.CompactNumberFormatSymbols_hu', 'goog.i18n.CompactNumberFormatSymbols_hy', 'goog.i18n.CompactNumberFormatSymbols_id', 'goog.i18n.CompactNumberFormatSymbols_in', 'goog.i18n.CompactNumberFormatSymbols_is', 'goog.i18n.CompactNumberFormatSymbols_it', 'goog.i18n.CompactNumberFormatSymbols_iw', 'goog.i18n.CompactNumberFormatSymbols_ja', 'goog.i18n.CompactNumberFormatSymbols_ka', 'goog.i18n.CompactNumberFormatSymbols_kk', 'goog.i18n.CompactNumberFormatSymbols_km', 'goog.i18n.CompactNumberFormatSymbols_kn', 'goog.i18n.CompactNumberFormatSymbols_ko', 'goog.i18n.CompactNumberFormatSymbols_ky', 'goog.i18n.CompactNumberFormatSymbols_ln', 'goog.i18n.CompactNumberFormatSymbols_lo', 'goog.i18n.CompactNumberFormatSymbols_lt', 'goog.i18n.CompactNumberFormatSymbols_lv', 'goog.i18n.CompactNumberFormatSymbols_mk', 'goog.i18n.CompactNumberFormatSymbols_ml', 'goog.i18n.CompactNumberFormatSymbols_mn', 'goog.i18n.CompactNumberFormatSymbols_mo', 'goog.i18n.CompactNumberFormatSymbols_mr', 'goog.i18n.CompactNumberFormatSymbols_ms', 'goog.i18n.CompactNumberFormatSymbols_mt', 'goog.i18n.CompactNumberFormatSymbols_my', 'goog.i18n.CompactNumberFormatSymbols_nb', 'goog.i18n.CompactNumberFormatSymbols_ne', 'goog.i18n.CompactNumberFormatSymbols_nl', 'goog.i18n.CompactNumberFormatSymbols_no', 'goog.i18n.CompactNumberFormatSymbols_no_NO', 'goog.i18n.CompactNumberFormatSymbols_or', 'goog.i18n.CompactNumberFormatSymbols_pa', 'goog.i18n.CompactNumberFormatSymbols_pl', 'goog.i18n.CompactNumberFormatSymbols_pt', 'goog.i18n.CompactNumberFormatSymbols_pt_BR', 'goog.i18n.CompactNumberFormatSymbols_pt_PT', 'goog.i18n.CompactNumberFormatSymbols_ro', 'goog.i18n.CompactNumberFormatSymbols_ru', 'goog.i18n.CompactNumberFormatSymbols_sh', 'goog.i18n.CompactNumberFormatSymbols_si', 'goog.i18n.CompactNumberFormatSymbols_sk', 'goog.i18n.CompactNumberFormatSymbols_sl', 'goog.i18n.CompactNumberFormatSymbols_sq', 'goog.i18n.CompactNumberFormatSymbols_sr', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn', 'goog.i18n.CompactNumberFormatSymbols_sv', 'goog.i18n.CompactNumberFormatSymbols_sw', 'goog.i18n.CompactNumberFormatSymbols_ta', 'goog.i18n.CompactNumberFormatSymbols_te', 'goog.i18n.CompactNumberFormatSymbols_th', 'goog.i18n.CompactNumberFormatSymbols_tl', 'goog.i18n.CompactNumberFormatSymbols_tr', 'goog.i18n.CompactNumberFormatSymbols_uk', 'goog.i18n.CompactNumberFormatSymbols_ur', 'goog.i18n.CompactNumberFormatSymbols_uz', 'goog.i18n.CompactNumberFormatSymbols_vi', 'goog.i18n.CompactNumberFormatSymbols_zh', 'goog.i18n.CompactNumberFormatSymbols_zh_CN', 'goog.i18n.CompactNumberFormatSymbols_zh_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_TW', 'goog.i18n.CompactNumberFormatSymbols_zu'], [], {});\ngoog.addDependency('i18n/compactnumberformatsymbolsext.js', ['goog.i18n.CompactNumberFormatSymbolsExt', 'goog.i18n.CompactNumberFormatSymbols_af_NA', 'goog.i18n.CompactNumberFormatSymbols_af_ZA', 'goog.i18n.CompactNumberFormatSymbols_agq', 'goog.i18n.CompactNumberFormatSymbols_agq_CM', 'goog.i18n.CompactNumberFormatSymbols_ak', 'goog.i18n.CompactNumberFormatSymbols_ak_GH', 'goog.i18n.CompactNumberFormatSymbols_am_ET', 'goog.i18n.CompactNumberFormatSymbols_ar_001', 'goog.i18n.CompactNumberFormatSymbols_ar_AE', 'goog.i18n.CompactNumberFormatSymbols_ar_BH', 'goog.i18n.CompactNumberFormatSymbols_ar_DJ', 'goog.i18n.CompactNumberFormatSymbols_ar_EH', 'goog.i18n.CompactNumberFormatSymbols_ar_ER', 'goog.i18n.CompactNumberFormatSymbols_ar_IL', 'goog.i18n.CompactNumberFormatSymbols_ar_IQ', 'goog.i18n.CompactNumberFormatSymbols_ar_JO', 'goog.i18n.CompactNumberFormatSymbols_ar_KM', 'goog.i18n.CompactNumberFormatSymbols_ar_KW', 'goog.i18n.CompactNumberFormatSymbols_ar_LB', 'goog.i18n.CompactNumberFormatSymbols_ar_LY', 'goog.i18n.CompactNumberFormatSymbols_ar_MA', 'goog.i18n.CompactNumberFormatSymbols_ar_MR', 'goog.i18n.CompactNumberFormatSymbols_ar_OM', 'goog.i18n.CompactNumberFormatSymbols_ar_PS', 'goog.i18n.CompactNumberFormatSymbols_ar_QA', 'goog.i18n.CompactNumberFormatSymbols_ar_SA', 'goog.i18n.CompactNumberFormatSymbols_ar_SD', 'goog.i18n.CompactNumberFormatSymbols_ar_SO', 'goog.i18n.CompactNumberFormatSymbols_ar_SS', 'goog.i18n.CompactNumberFormatSymbols_ar_SY', 'goog.i18n.CompactNumberFormatSymbols_ar_TD', 'goog.i18n.CompactNumberFormatSymbols_ar_TN', 'goog.i18n.CompactNumberFormatSymbols_ar_XB', 'goog.i18n.CompactNumberFormatSymbols_ar_YE', 'goog.i18n.CompactNumberFormatSymbols_as', 'goog.i18n.CompactNumberFormatSymbols_as_IN', 'goog.i18n.CompactNumberFormatSymbols_asa', 'goog.i18n.CompactNumberFormatSymbols_asa_TZ', 'goog.i18n.CompactNumberFormatSymbols_ast', 'goog.i18n.CompactNumberFormatSymbols_ast_ES', 'goog.i18n.CompactNumberFormatSymbols_az_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.CompactNumberFormatSymbols_az_Latn', 'goog.i18n.CompactNumberFormatSymbols_az_Latn_AZ', 'goog.i18n.CompactNumberFormatSymbols_bas', 'goog.i18n.CompactNumberFormatSymbols_bas_CM', 'goog.i18n.CompactNumberFormatSymbols_be_BY', 'goog.i18n.CompactNumberFormatSymbols_bem', 'goog.i18n.CompactNumberFormatSymbols_bem_ZM', 'goog.i18n.CompactNumberFormatSymbols_bez', 'goog.i18n.CompactNumberFormatSymbols_bez_TZ', 'goog.i18n.CompactNumberFormatSymbols_bg_BG', 'goog.i18n.CompactNumberFormatSymbols_bm', 'goog.i18n.CompactNumberFormatSymbols_bm_ML', 'goog.i18n.CompactNumberFormatSymbols_bn_BD', 'goog.i18n.CompactNumberFormatSymbols_bn_IN', 'goog.i18n.CompactNumberFormatSymbols_bo', 'goog.i18n.CompactNumberFormatSymbols_bo_CN', 'goog.i18n.CompactNumberFormatSymbols_bo_IN', 'goog.i18n.CompactNumberFormatSymbols_br_FR', 'goog.i18n.CompactNumberFormatSymbols_brx', 'goog.i18n.CompactNumberFormatSymbols_brx_IN', 'goog.i18n.CompactNumberFormatSymbols_bs_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_bs_Cyrl_BA', 'goog.i18n.CompactNumberFormatSymbols_bs_Latn', 'goog.i18n.CompactNumberFormatSymbols_bs_Latn_BA', 'goog.i18n.CompactNumberFormatSymbols_ca_AD', 'goog.i18n.CompactNumberFormatSymbols_ca_ES', 'goog.i18n.CompactNumberFormatSymbols_ca_FR', 'goog.i18n.CompactNumberFormatSymbols_ca_IT', 'goog.i18n.CompactNumberFormatSymbols_ccp', 'goog.i18n.CompactNumberFormatSymbols_ccp_BD', 'goog.i18n.CompactNumberFormatSymbols_ccp_IN', 'goog.i18n.CompactNumberFormatSymbols_ce', 'goog.i18n.CompactNumberFormatSymbols_ce_RU', 'goog.i18n.CompactNumberFormatSymbols_ceb', 'goog.i18n.CompactNumberFormatSymbols_ceb_PH', 'goog.i18n.CompactNumberFormatSymbols_cgg', 'goog.i18n.CompactNumberFormatSymbols_cgg_UG', 'goog.i18n.CompactNumberFormatSymbols_chr_US', 'goog.i18n.CompactNumberFormatSymbols_ckb', 'goog.i18n.CompactNumberFormatSymbols_ckb_IQ', 'goog.i18n.CompactNumberFormatSymbols_ckb_IR', 'goog.i18n.CompactNumberFormatSymbols_cs_CZ', 'goog.i18n.CompactNumberFormatSymbols_cy_GB', 'goog.i18n.CompactNumberFormatSymbols_da_DK', 'goog.i18n.CompactNumberFormatSymbols_da_GL', 'goog.i18n.CompactNumberFormatSymbols_dav', 'goog.i18n.CompactNumberFormatSymbols_dav_KE', 'goog.i18n.CompactNumberFormatSymbols_de_BE', 'goog.i18n.CompactNumberFormatSymbols_de_DE', 'goog.i18n.CompactNumberFormatSymbols_de_IT', 'goog.i18n.CompactNumberFormatSymbols_de_LI', 'goog.i18n.CompactNumberFormatSymbols_de_LU', 'goog.i18n.CompactNumberFormatSymbols_dje', 'goog.i18n.CompactNumberFormatSymbols_dje_NE', 'goog.i18n.CompactNumberFormatSymbols_dsb', 'goog.i18n.CompactNumberFormatSymbols_dsb_DE', 'goog.i18n.CompactNumberFormatSymbols_dua', 'goog.i18n.CompactNumberFormatSymbols_dua_CM', 'goog.i18n.CompactNumberFormatSymbols_dyo', 'goog.i18n.CompactNumberFormatSymbols_dyo_SN', 'goog.i18n.CompactNumberFormatSymbols_dz', 'goog.i18n.CompactNumberFormatSymbols_dz_BT', 'goog.i18n.CompactNumberFormatSymbols_ebu', 'goog.i18n.CompactNumberFormatSymbols_ebu_KE', 'goog.i18n.CompactNumberFormatSymbols_ee', 'goog.i18n.CompactNumberFormatSymbols_ee_GH', 'goog.i18n.CompactNumberFormatSymbols_ee_TG', 'goog.i18n.CompactNumberFormatSymbols_el_CY', 'goog.i18n.CompactNumberFormatSymbols_el_GR', 'goog.i18n.CompactNumberFormatSymbols_en_001', 'goog.i18n.CompactNumberFormatSymbols_en_150', 'goog.i18n.CompactNumberFormatSymbols_en_AE', 'goog.i18n.CompactNumberFormatSymbols_en_AG', 'goog.i18n.CompactNumberFormatSymbols_en_AI', 'goog.i18n.CompactNumberFormatSymbols_en_AS', 'goog.i18n.CompactNumberFormatSymbols_en_AT', 'goog.i18n.CompactNumberFormatSymbols_en_BB', 'goog.i18n.CompactNumberFormatSymbols_en_BE', 'goog.i18n.CompactNumberFormatSymbols_en_BI', 'goog.i18n.CompactNumberFormatSymbols_en_BM', 'goog.i18n.CompactNumberFormatSymbols_en_BS', 'goog.i18n.CompactNumberFormatSymbols_en_BW', 'goog.i18n.CompactNumberFormatSymbols_en_BZ', 'goog.i18n.CompactNumberFormatSymbols_en_CC', 'goog.i18n.CompactNumberFormatSymbols_en_CH', 'goog.i18n.CompactNumberFormatSymbols_en_CK', 'goog.i18n.CompactNumberFormatSymbols_en_CM', 'goog.i18n.CompactNumberFormatSymbols_en_CX', 'goog.i18n.CompactNumberFormatSymbols_en_CY', 'goog.i18n.CompactNumberFormatSymbols_en_DE', 'goog.i18n.CompactNumberFormatSymbols_en_DG', 'goog.i18n.CompactNumberFormatSymbols_en_DK', 'goog.i18n.CompactNumberFormatSymbols_en_DM', 'goog.i18n.CompactNumberFormatSymbols_en_ER', 'goog.i18n.CompactNumberFormatSymbols_en_FI', 'goog.i18n.CompactNumberFormatSymbols_en_FJ', 'goog.i18n.CompactNumberFormatSymbols_en_FK', 'goog.i18n.CompactNumberFormatSymbols_en_FM', 'goog.i18n.CompactNumberFormatSymbols_en_GD', 'goog.i18n.CompactNumberFormatSymbols_en_GG', 'goog.i18n.CompactNumberFormatSymbols_en_GH', 'goog.i18n.CompactNumberFormatSymbols_en_GI', 'goog.i18n.CompactNumberFormatSymbols_en_GM', 'goog.i18n.CompactNumberFormatSymbols_en_GU', 'goog.i18n.CompactNumberFormatSymbols_en_GY', 'goog.i18n.CompactNumberFormatSymbols_en_HK', 'goog.i18n.CompactNumberFormatSymbols_en_IL', 'goog.i18n.CompactNumberFormatSymbols_en_IM', 'goog.i18n.CompactNumberFormatSymbols_en_IO', 'goog.i18n.CompactNumberFormatSymbols_en_JE', 'goog.i18n.CompactNumberFormatSymbols_en_JM', 'goog.i18n.CompactNumberFormatSymbols_en_KE', 'goog.i18n.CompactNumberFormatSymbols_en_KI', 'goog.i18n.CompactNumberFormatSymbols_en_KN', 'goog.i18n.CompactNumberFormatSymbols_en_KY', 'goog.i18n.CompactNumberFormatSymbols_en_LC', 'goog.i18n.CompactNumberFormatSymbols_en_LR', 'goog.i18n.CompactNumberFormatSymbols_en_LS', 'goog.i18n.CompactNumberFormatSymbols_en_MG', 'goog.i18n.CompactNumberFormatSymbols_en_MH', 'goog.i18n.CompactNumberFormatSymbols_en_MO', 'goog.i18n.CompactNumberFormatSymbols_en_MP', 'goog.i18n.CompactNumberFormatSymbols_en_MS', 'goog.i18n.CompactNumberFormatSymbols_en_MT', 'goog.i18n.CompactNumberFormatSymbols_en_MU', 'goog.i18n.CompactNumberFormatSymbols_en_MW', 'goog.i18n.CompactNumberFormatSymbols_en_MY', 'goog.i18n.CompactNumberFormatSymbols_en_NA', 'goog.i18n.CompactNumberFormatSymbols_en_NF', 'goog.i18n.CompactNumberFormatSymbols_en_NG', 'goog.i18n.CompactNumberFormatSymbols_en_NL', 'goog.i18n.CompactNumberFormatSymbols_en_NR', 'goog.i18n.CompactNumberFormatSymbols_en_NU', 'goog.i18n.CompactNumberFormatSymbols_en_NZ', 'goog.i18n.CompactNumberFormatSymbols_en_PG', 'goog.i18n.CompactNumberFormatSymbols_en_PH', 'goog.i18n.CompactNumberFormatSymbols_en_PK', 'goog.i18n.CompactNumberFormatSymbols_en_PN', 'goog.i18n.CompactNumberFormatSymbols_en_PR', 'goog.i18n.CompactNumberFormatSymbols_en_PW', 'goog.i18n.CompactNumberFormatSymbols_en_RW', 'goog.i18n.CompactNumberFormatSymbols_en_SB', 'goog.i18n.CompactNumberFormatSymbols_en_SC', 'goog.i18n.CompactNumberFormatSymbols_en_SD', 'goog.i18n.CompactNumberFormatSymbols_en_SE', 'goog.i18n.CompactNumberFormatSymbols_en_SH', 'goog.i18n.CompactNumberFormatSymbols_en_SI', 'goog.i18n.CompactNumberFormatSymbols_en_SL', 'goog.i18n.CompactNumberFormatSymbols_en_SS', 'goog.i18n.CompactNumberFormatSymbols_en_SX', 'goog.i18n.CompactNumberFormatSymbols_en_SZ', 'goog.i18n.CompactNumberFormatSymbols_en_TC', 'goog.i18n.CompactNumberFormatSymbols_en_TK', 'goog.i18n.CompactNumberFormatSymbols_en_TO', 'goog.i18n.CompactNumberFormatSymbols_en_TT', 'goog.i18n.CompactNumberFormatSymbols_en_TV', 'goog.i18n.CompactNumberFormatSymbols_en_TZ', 'goog.i18n.CompactNumberFormatSymbols_en_UG', 'goog.i18n.CompactNumberFormatSymbols_en_UM', 'goog.i18n.CompactNumberFormatSymbols_en_US_POSIX', 'goog.i18n.CompactNumberFormatSymbols_en_VC', 'goog.i18n.CompactNumberFormatSymbols_en_VG', 'goog.i18n.CompactNumberFormatSymbols_en_VI', 'goog.i18n.CompactNumberFormatSymbols_en_VU', 'goog.i18n.CompactNumberFormatSymbols_en_WS', 'goog.i18n.CompactNumberFormatSymbols_en_XA', 'goog.i18n.CompactNumberFormatSymbols_en_ZM', 'goog.i18n.CompactNumberFormatSymbols_en_ZW', 'goog.i18n.CompactNumberFormatSymbols_eo', 'goog.i18n.CompactNumberFormatSymbols_eo_001', 'goog.i18n.CompactNumberFormatSymbols_es_AR', 'goog.i18n.CompactNumberFormatSymbols_es_BO', 'goog.i18n.CompactNumberFormatSymbols_es_BR', 'goog.i18n.CompactNumberFormatSymbols_es_BZ', 'goog.i18n.CompactNumberFormatSymbols_es_CL', 'goog.i18n.CompactNumberFormatSymbols_es_CO', 'goog.i18n.CompactNumberFormatSymbols_es_CR', 'goog.i18n.CompactNumberFormatSymbols_es_CU', 'goog.i18n.CompactNumberFormatSymbols_es_DO', 'goog.i18n.CompactNumberFormatSymbols_es_EA', 'goog.i18n.CompactNumberFormatSymbols_es_EC', 'goog.i18n.CompactNumberFormatSymbols_es_GQ', 'goog.i18n.CompactNumberFormatSymbols_es_GT', 'goog.i18n.CompactNumberFormatSymbols_es_HN', 'goog.i18n.CompactNumberFormatSymbols_es_IC', 'goog.i18n.CompactNumberFormatSymbols_es_NI', 'goog.i18n.CompactNumberFormatSymbols_es_PA', 'goog.i18n.CompactNumberFormatSymbols_es_PE', 'goog.i18n.CompactNumberFormatSymbols_es_PH', 'goog.i18n.CompactNumberFormatSymbols_es_PR', 'goog.i18n.CompactNumberFormatSymbols_es_PY', 'goog.i18n.CompactNumberFormatSymbols_es_SV', 'goog.i18n.CompactNumberFormatSymbols_es_UY', 'goog.i18n.CompactNumberFormatSymbols_es_VE', 'goog.i18n.CompactNumberFormatSymbols_et_EE', 'goog.i18n.CompactNumberFormatSymbols_eu_ES', 'goog.i18n.CompactNumberFormatSymbols_ewo', 'goog.i18n.CompactNumberFormatSymbols_ewo_CM', 'goog.i18n.CompactNumberFormatSymbols_fa_AF', 'goog.i18n.CompactNumberFormatSymbols_fa_IR', 'goog.i18n.CompactNumberFormatSymbols_ff', 'goog.i18n.CompactNumberFormatSymbols_ff_Latn', 'goog.i18n.CompactNumberFormatSymbols_ff_Latn_BF', 'goog.i18n.CompactNumberFormatSymbols_ff_Latn_CM', 'goog.i18n.CompactNumberFormatSymbols_ff_Latn_GH', 'goog.i18n.CompactNumberFormatSymbols_ff_Latn_GM', 'goog.i18n.CompactNumberFormatSymbols_ff_Latn_GN', 'goog.i18n.CompactNumberFormatSymbols_ff_Latn_GW', 'goog.i18n.CompactNumberFormatSymbols_ff_Latn_LR', 'goog.i18n.CompactNumberFormatSymbols_ff_Latn_MR', 'goog.i18n.CompactNumberFormatSymbols_ff_Latn_NE', 'goog.i18n.CompactNumberFormatSymbols_ff_Latn_NG', 'goog.i18n.CompactNumberFormatSymbols_ff_Latn_SL', 'goog.i18n.CompactNumberFormatSymbols_ff_Latn_SN', 'goog.i18n.CompactNumberFormatSymbols_fi_FI', 'goog.i18n.CompactNumberFormatSymbols_fil_PH', 'goog.i18n.CompactNumberFormatSymbols_fo', 'goog.i18n.CompactNumberFormatSymbols_fo_DK', 'goog.i18n.CompactNumberFormatSymbols_fo_FO', 'goog.i18n.CompactNumberFormatSymbols_fr_BE', 'goog.i18n.CompactNumberFormatSymbols_fr_BF', 'goog.i18n.CompactNumberFormatSymbols_fr_BI', 'goog.i18n.CompactNumberFormatSymbols_fr_BJ', 'goog.i18n.CompactNumberFormatSymbols_fr_BL', 'goog.i18n.CompactNumberFormatSymbols_fr_CD', 'goog.i18n.CompactNumberFormatSymbols_fr_CF', 'goog.i18n.CompactNumberFormatSymbols_fr_CG', 'goog.i18n.CompactNumberFormatSymbols_fr_CH', 'goog.i18n.CompactNumberFormatSymbols_fr_CI', 'goog.i18n.CompactNumberFormatSymbols_fr_CM', 'goog.i18n.CompactNumberFormatSymbols_fr_DJ', 'goog.i18n.CompactNumberFormatSymbols_fr_DZ', 'goog.i18n.CompactNumberFormatSymbols_fr_FR', 'goog.i18n.CompactNumberFormatSymbols_fr_GA', 'goog.i18n.CompactNumberFormatSymbols_fr_GF', 'goog.i18n.CompactNumberFormatSymbols_fr_GN', 'goog.i18n.CompactNumberFormatSymbols_fr_GP', 'goog.i18n.CompactNumberFormatSymbols_fr_GQ', 'goog.i18n.CompactNumberFormatSymbols_fr_HT', 'goog.i18n.CompactNumberFormatSymbols_fr_KM', 'goog.i18n.CompactNumberFormatSymbols_fr_LU', 'goog.i18n.CompactNumberFormatSymbols_fr_MA', 'goog.i18n.CompactNumberFormatSymbols_fr_MC', 'goog.i18n.CompactNumberFormatSymbols_fr_MF', 'goog.i18n.CompactNumberFormatSymbols_fr_MG', 'goog.i18n.CompactNumberFormatSymbols_fr_ML', 'goog.i18n.CompactNumberFormatSymbols_fr_MQ', 'goog.i18n.CompactNumberFormatSymbols_fr_MR', 'goog.i18n.CompactNumberFormatSymbols_fr_MU', 'goog.i18n.CompactNumberFormatSymbols_fr_NC', 'goog.i18n.CompactNumberFormatSymbols_fr_NE', 'goog.i18n.CompactNumberFormatSymbols_fr_PF', 'goog.i18n.CompactNumberFormatSymbols_fr_PM', 'goog.i18n.CompactNumberFormatSymbols_fr_RE', 'goog.i18n.CompactNumberFormatSymbols_fr_RW', 'goog.i18n.CompactNumberFormatSymbols_fr_SC', 'goog.i18n.CompactNumberFormatSymbols_fr_SN', 'goog.i18n.CompactNumberFormatSymbols_fr_SY', 'goog.i18n.CompactNumberFormatSymbols_fr_TD', 'goog.i18n.CompactNumberFormatSymbols_fr_TG', 'goog.i18n.CompactNumberFormatSymbols_fr_TN', 'goog.i18n.CompactNumberFormatSymbols_fr_VU', 'goog.i18n.CompactNumberFormatSymbols_fr_WF', 'goog.i18n.CompactNumberFormatSymbols_fr_YT', 'goog.i18n.CompactNumberFormatSymbols_fur', 'goog.i18n.CompactNumberFormatSymbols_fur_IT', 'goog.i18n.CompactNumberFormatSymbols_fy', 'goog.i18n.CompactNumberFormatSymbols_fy_NL', 'goog.i18n.CompactNumberFormatSymbols_ga_IE', 'goog.i18n.CompactNumberFormatSymbols_gd', 'goog.i18n.CompactNumberFormatSymbols_gd_GB', 'goog.i18n.CompactNumberFormatSymbols_gl_ES', 'goog.i18n.CompactNumberFormatSymbols_gsw_CH', 'goog.i18n.CompactNumberFormatSymbols_gsw_FR', 'goog.i18n.CompactNumberFormatSymbols_gsw_LI', 'goog.i18n.CompactNumberFormatSymbols_gu_IN', 'goog.i18n.CompactNumberFormatSymbols_guz', 'goog.i18n.CompactNumberFormatSymbols_guz_KE', 'goog.i18n.CompactNumberFormatSymbols_gv', 'goog.i18n.CompactNumberFormatSymbols_gv_IM', 'goog.i18n.CompactNumberFormatSymbols_ha', 'goog.i18n.CompactNumberFormatSymbols_ha_GH', 'goog.i18n.CompactNumberFormatSymbols_ha_NE', 'goog.i18n.CompactNumberFormatSymbols_ha_NG', 'goog.i18n.CompactNumberFormatSymbols_haw_US', 'goog.i18n.CompactNumberFormatSymbols_he_IL', 'goog.i18n.CompactNumberFormatSymbols_hi_IN', 'goog.i18n.CompactNumberFormatSymbols_hr_BA', 'goog.i18n.CompactNumberFormatSymbols_hr_HR', 'goog.i18n.CompactNumberFormatSymbols_hsb', 'goog.i18n.CompactNumberFormatSymbols_hsb_DE', 'goog.i18n.CompactNumberFormatSymbols_hu_HU', 'goog.i18n.CompactNumberFormatSymbols_hy_AM', 'goog.i18n.CompactNumberFormatSymbols_ia', 'goog.i18n.CompactNumberFormatSymbols_ia_001', 'goog.i18n.CompactNumberFormatSymbols_id_ID', 'goog.i18n.CompactNumberFormatSymbols_ig', 'goog.i18n.CompactNumberFormatSymbols_ig_NG', 'goog.i18n.CompactNumberFormatSymbols_ii', 'goog.i18n.CompactNumberFormatSymbols_ii_CN', 'goog.i18n.CompactNumberFormatSymbols_is_IS', 'goog.i18n.CompactNumberFormatSymbols_it_CH', 'goog.i18n.CompactNumberFormatSymbols_it_IT', 'goog.i18n.CompactNumberFormatSymbols_it_SM', 'goog.i18n.CompactNumberFormatSymbols_it_VA', 'goog.i18n.CompactNumberFormatSymbols_ja_JP', 'goog.i18n.CompactNumberFormatSymbols_jgo', 'goog.i18n.CompactNumberFormatSymbols_jgo_CM', 'goog.i18n.CompactNumberFormatSymbols_jmc', 'goog.i18n.CompactNumberFormatSymbols_jmc_TZ', 'goog.i18n.CompactNumberFormatSymbols_jv', 'goog.i18n.CompactNumberFormatSymbols_jv_ID', 'goog.i18n.CompactNumberFormatSymbols_ka_GE', 'goog.i18n.CompactNumberFormatSymbols_kab', 'goog.i18n.CompactNumberFormatSymbols_kab_DZ', 'goog.i18n.CompactNumberFormatSymbols_kam', 'goog.i18n.CompactNumberFormatSymbols_kam_KE', 'goog.i18n.CompactNumberFormatSymbols_kde', 'goog.i18n.CompactNumberFormatSymbols_kde_TZ', 'goog.i18n.CompactNumberFormatSymbols_kea', 'goog.i18n.CompactNumberFormatSymbols_kea_CV', 'goog.i18n.CompactNumberFormatSymbols_khq', 'goog.i18n.CompactNumberFormatSymbols_khq_ML', 'goog.i18n.CompactNumberFormatSymbols_ki', 'goog.i18n.CompactNumberFormatSymbols_ki_KE', 'goog.i18n.CompactNumberFormatSymbols_kk_KZ', 'goog.i18n.CompactNumberFormatSymbols_kkj', 'goog.i18n.CompactNumberFormatSymbols_kkj_CM', 'goog.i18n.CompactNumberFormatSymbols_kl', 'goog.i18n.CompactNumberFormatSymbols_kl_GL', 'goog.i18n.CompactNumberFormatSymbols_kln', 'goog.i18n.CompactNumberFormatSymbols_kln_KE', 'goog.i18n.CompactNumberFormatSymbols_km_KH', 'goog.i18n.CompactNumberFormatSymbols_kn_IN', 'goog.i18n.CompactNumberFormatSymbols_ko_KP', 'goog.i18n.CompactNumberFormatSymbols_ko_KR', 'goog.i18n.CompactNumberFormatSymbols_kok', 'goog.i18n.CompactNumberFormatSymbols_kok_IN', 'goog.i18n.CompactNumberFormatSymbols_ks', 'goog.i18n.CompactNumberFormatSymbols_ks_IN', 'goog.i18n.CompactNumberFormatSymbols_ksb', 'goog.i18n.CompactNumberFormatSymbols_ksb_TZ', 'goog.i18n.CompactNumberFormatSymbols_ksf', 'goog.i18n.CompactNumberFormatSymbols_ksf_CM', 'goog.i18n.CompactNumberFormatSymbols_ksh', 'goog.i18n.CompactNumberFormatSymbols_ksh_DE', 'goog.i18n.CompactNumberFormatSymbols_ku', 'goog.i18n.CompactNumberFormatSymbols_ku_TR', 'goog.i18n.CompactNumberFormatSymbols_kw', 'goog.i18n.CompactNumberFormatSymbols_kw_GB', 'goog.i18n.CompactNumberFormatSymbols_ky_KG', 'goog.i18n.CompactNumberFormatSymbols_lag', 'goog.i18n.CompactNumberFormatSymbols_lag_TZ', 'goog.i18n.CompactNumberFormatSymbols_lb', 'goog.i18n.CompactNumberFormatSymbols_lb_LU', 'goog.i18n.CompactNumberFormatSymbols_lg', 'goog.i18n.CompactNumberFormatSymbols_lg_UG', 'goog.i18n.CompactNumberFormatSymbols_lkt', 'goog.i18n.CompactNumberFormatSymbols_lkt_US', 'goog.i18n.CompactNumberFormatSymbols_ln_AO', 'goog.i18n.CompactNumberFormatSymbols_ln_CD', 'goog.i18n.CompactNumberFormatSymbols_ln_CF', 'goog.i18n.CompactNumberFormatSymbols_ln_CG', 'goog.i18n.CompactNumberFormatSymbols_lo_LA', 'goog.i18n.CompactNumberFormatSymbols_lrc', 'goog.i18n.CompactNumberFormatSymbols_lrc_IQ', 'goog.i18n.CompactNumberFormatSymbols_lrc_IR', 'goog.i18n.CompactNumberFormatSymbols_lt_LT', 'goog.i18n.CompactNumberFormatSymbols_lu', 'goog.i18n.CompactNumberFormatSymbols_lu_CD', 'goog.i18n.CompactNumberFormatSymbols_luo', 'goog.i18n.CompactNumberFormatSymbols_luo_KE', 'goog.i18n.CompactNumberFormatSymbols_luy', 'goog.i18n.CompactNumberFormatSymbols_luy_KE', 'goog.i18n.CompactNumberFormatSymbols_lv_LV', 'goog.i18n.CompactNumberFormatSymbols_mas', 'goog.i18n.CompactNumberFormatSymbols_mas_KE', 'goog.i18n.CompactNumberFormatSymbols_mas_TZ', 'goog.i18n.CompactNumberFormatSymbols_mer', 'goog.i18n.CompactNumberFormatSymbols_mer_KE', 'goog.i18n.CompactNumberFormatSymbols_mfe', 'goog.i18n.CompactNumberFormatSymbols_mfe_MU', 'goog.i18n.CompactNumberFormatSymbols_mg', 'goog.i18n.CompactNumberFormatSymbols_mg_MG', 'goog.i18n.CompactNumberFormatSymbols_mgh', 'goog.i18n.CompactNumberFormatSymbols_mgh_MZ', 'goog.i18n.CompactNumberFormatSymbols_mgo', 'goog.i18n.CompactNumberFormatSymbols_mgo_CM', 'goog.i18n.CompactNumberFormatSymbols_mi', 'goog.i18n.CompactNumberFormatSymbols_mi_NZ', 'goog.i18n.CompactNumberFormatSymbols_mk_MK', 'goog.i18n.CompactNumberFormatSymbols_ml_IN', 'goog.i18n.CompactNumberFormatSymbols_mn_MN', 'goog.i18n.CompactNumberFormatSymbols_mr_IN', 'goog.i18n.CompactNumberFormatSymbols_ms_BN', 'goog.i18n.CompactNumberFormatSymbols_ms_MY', 'goog.i18n.CompactNumberFormatSymbols_ms_SG', 'goog.i18n.CompactNumberFormatSymbols_mt_MT', 'goog.i18n.CompactNumberFormatSymbols_mua', 'goog.i18n.CompactNumberFormatSymbols_mua_CM', 'goog.i18n.CompactNumberFormatSymbols_my_MM', 'goog.i18n.CompactNumberFormatSymbols_mzn', 'goog.i18n.CompactNumberFormatSymbols_mzn_IR', 'goog.i18n.CompactNumberFormatSymbols_naq', 'goog.i18n.CompactNumberFormatSymbols_naq_NA', 'goog.i18n.CompactNumberFormatSymbols_nb_NO', 'goog.i18n.CompactNumberFormatSymbols_nb_SJ', 'goog.i18n.CompactNumberFormatSymbols_nd', 'goog.i18n.CompactNumberFormatSymbols_nd_ZW', 'goog.i18n.CompactNumberFormatSymbols_nds', 'goog.i18n.CompactNumberFormatSymbols_nds_DE', 'goog.i18n.CompactNumberFormatSymbols_nds_NL', 'goog.i18n.CompactNumberFormatSymbols_ne_IN', 'goog.i18n.CompactNumberFormatSymbols_ne_NP', 'goog.i18n.CompactNumberFormatSymbols_nl_AW', 'goog.i18n.CompactNumberFormatSymbols_nl_BE', 'goog.i18n.CompactNumberFormatSymbols_nl_BQ', 'goog.i18n.CompactNumberFormatSymbols_nl_CW', 'goog.i18n.CompactNumberFormatSymbols_nl_NL', 'goog.i18n.CompactNumberFormatSymbols_nl_SR', 'goog.i18n.CompactNumberFormatSymbols_nl_SX', 'goog.i18n.CompactNumberFormatSymbols_nmg', 'goog.i18n.CompactNumberFormatSymbols_nmg_CM', 'goog.i18n.CompactNumberFormatSymbols_nn', 'goog.i18n.CompactNumberFormatSymbols_nn_NO', 'goog.i18n.CompactNumberFormatSymbols_nnh', 'goog.i18n.CompactNumberFormatSymbols_nnh_CM', 'goog.i18n.CompactNumberFormatSymbols_nus', 'goog.i18n.CompactNumberFormatSymbols_nus_SS', 'goog.i18n.CompactNumberFormatSymbols_nyn', 'goog.i18n.CompactNumberFormatSymbols_nyn_UG', 'goog.i18n.CompactNumberFormatSymbols_om', 'goog.i18n.CompactNumberFormatSymbols_om_ET', 'goog.i18n.CompactNumberFormatSymbols_om_KE', 'goog.i18n.CompactNumberFormatSymbols_or_IN', 'goog.i18n.CompactNumberFormatSymbols_os', 'goog.i18n.CompactNumberFormatSymbols_os_GE', 'goog.i18n.CompactNumberFormatSymbols_os_RU', 'goog.i18n.CompactNumberFormatSymbols_pa_Arab', 'goog.i18n.CompactNumberFormatSymbols_pa_Arab_PK', 'goog.i18n.CompactNumberFormatSymbols_pa_Guru', 'goog.i18n.CompactNumberFormatSymbols_pa_Guru_IN', 'goog.i18n.CompactNumberFormatSymbols_pl_PL', 'goog.i18n.CompactNumberFormatSymbols_ps', 'goog.i18n.CompactNumberFormatSymbols_ps_AF', 'goog.i18n.CompactNumberFormatSymbols_ps_PK', 'goog.i18n.CompactNumberFormatSymbols_pt_AO', 'goog.i18n.CompactNumberFormatSymbols_pt_CH', 'goog.i18n.CompactNumberFormatSymbols_pt_CV', 'goog.i18n.CompactNumberFormatSymbols_pt_GQ', 'goog.i18n.CompactNumberFormatSymbols_pt_GW', 'goog.i18n.CompactNumberFormatSymbols_pt_LU', 'goog.i18n.CompactNumberFormatSymbols_pt_MO', 'goog.i18n.CompactNumberFormatSymbols_pt_MZ', 'goog.i18n.CompactNumberFormatSymbols_pt_ST', 'goog.i18n.CompactNumberFormatSymbols_pt_TL', 'goog.i18n.CompactNumberFormatSymbols_qu', 'goog.i18n.CompactNumberFormatSymbols_qu_BO', 'goog.i18n.CompactNumberFormatSymbols_qu_EC', 'goog.i18n.CompactNumberFormatSymbols_qu_PE', 'goog.i18n.CompactNumberFormatSymbols_rm', 'goog.i18n.CompactNumberFormatSymbols_rm_CH', 'goog.i18n.CompactNumberFormatSymbols_rn', 'goog.i18n.CompactNumberFormatSymbols_rn_BI', 'goog.i18n.CompactNumberFormatSymbols_ro_MD', 'goog.i18n.CompactNumberFormatSymbols_ro_RO', 'goog.i18n.CompactNumberFormatSymbols_rof', 'goog.i18n.CompactNumberFormatSymbols_rof_TZ', 'goog.i18n.CompactNumberFormatSymbols_ru_BY', 'goog.i18n.CompactNumberFormatSymbols_ru_KG', 'goog.i18n.CompactNumberFormatSymbols_ru_KZ', 'goog.i18n.CompactNumberFormatSymbols_ru_MD', 'goog.i18n.CompactNumberFormatSymbols_ru_RU', 'goog.i18n.CompactNumberFormatSymbols_ru_UA', 'goog.i18n.CompactNumberFormatSymbols_rw', 'goog.i18n.CompactNumberFormatSymbols_rw_RW', 'goog.i18n.CompactNumberFormatSymbols_rwk', 'goog.i18n.CompactNumberFormatSymbols_rwk_TZ', 'goog.i18n.CompactNumberFormatSymbols_sah', 'goog.i18n.CompactNumberFormatSymbols_sah_RU', 'goog.i18n.CompactNumberFormatSymbols_saq', 'goog.i18n.CompactNumberFormatSymbols_saq_KE', 'goog.i18n.CompactNumberFormatSymbols_sbp', 'goog.i18n.CompactNumberFormatSymbols_sbp_TZ', 'goog.i18n.CompactNumberFormatSymbols_sd', 'goog.i18n.CompactNumberFormatSymbols_sd_PK', 'goog.i18n.CompactNumberFormatSymbols_se', 'goog.i18n.CompactNumberFormatSymbols_se_FI', 'goog.i18n.CompactNumberFormatSymbols_se_NO', 'goog.i18n.CompactNumberFormatSymbols_se_SE', 'goog.i18n.CompactNumberFormatSymbols_seh', 'goog.i18n.CompactNumberFormatSymbols_seh_MZ', 'goog.i18n.CompactNumberFormatSymbols_ses', 'goog.i18n.CompactNumberFormatSymbols_ses_ML', 'goog.i18n.CompactNumberFormatSymbols_sg', 'goog.i18n.CompactNumberFormatSymbols_sg_CF', 'goog.i18n.CompactNumberFormatSymbols_shi', 'goog.i18n.CompactNumberFormatSymbols_shi_Latn', 'goog.i18n.CompactNumberFormatSymbols_shi_Latn_MA', 'goog.i18n.CompactNumberFormatSymbols_shi_Tfng', 'goog.i18n.CompactNumberFormatSymbols_shi_Tfng_MA', 'goog.i18n.CompactNumberFormatSymbols_si_LK', 'goog.i18n.CompactNumberFormatSymbols_sk_SK', 'goog.i18n.CompactNumberFormatSymbols_sl_SI', 'goog.i18n.CompactNumberFormatSymbols_smn', 'goog.i18n.CompactNumberFormatSymbols_smn_FI', 'goog.i18n.CompactNumberFormatSymbols_sn', 'goog.i18n.CompactNumberFormatSymbols_sn_ZW', 'goog.i18n.CompactNumberFormatSymbols_so', 'goog.i18n.CompactNumberFormatSymbols_so_DJ', 'goog.i18n.CompactNumberFormatSymbols_so_ET', 'goog.i18n.CompactNumberFormatSymbols_so_KE', 'goog.i18n.CompactNumberFormatSymbols_so_SO', 'goog.i18n.CompactNumberFormatSymbols_sq_AL', 'goog.i18n.CompactNumberFormatSymbols_sq_MK', 'goog.i18n.CompactNumberFormatSymbols_sq_XK', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_XK', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_BA', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_ME', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_RS', 'goog.i18n.CompactNumberFormatSymbols_sr_Latn_XK', 'goog.i18n.CompactNumberFormatSymbols_sv_AX', 'goog.i18n.CompactNumberFormatSymbols_sv_FI', 'goog.i18n.CompactNumberFormatSymbols_sv_SE', 'goog.i18n.CompactNumberFormatSymbols_sw_CD', 'goog.i18n.CompactNumberFormatSymbols_sw_KE', 'goog.i18n.CompactNumberFormatSymbols_sw_TZ', 'goog.i18n.CompactNumberFormatSymbols_sw_UG', 'goog.i18n.CompactNumberFormatSymbols_ta_IN', 'goog.i18n.CompactNumberFormatSymbols_ta_LK', 'goog.i18n.CompactNumberFormatSymbols_ta_MY', 'goog.i18n.CompactNumberFormatSymbols_ta_SG', 'goog.i18n.CompactNumberFormatSymbols_te_IN', 'goog.i18n.CompactNumberFormatSymbols_teo', 'goog.i18n.CompactNumberFormatSymbols_teo_KE', 'goog.i18n.CompactNumberFormatSymbols_teo_UG', 'goog.i18n.CompactNumberFormatSymbols_tg', 'goog.i18n.CompactNumberFormatSymbols_tg_TJ', 'goog.i18n.CompactNumberFormatSymbols_th_TH', 'goog.i18n.CompactNumberFormatSymbols_ti', 'goog.i18n.CompactNumberFormatSymbols_ti_ER', 'goog.i18n.CompactNumberFormatSymbols_ti_ET', 'goog.i18n.CompactNumberFormatSymbols_tk', 'goog.i18n.CompactNumberFormatSymbols_tk_TM', 'goog.i18n.CompactNumberFormatSymbols_to', 'goog.i18n.CompactNumberFormatSymbols_to_TO', 'goog.i18n.CompactNumberFormatSymbols_tr_CY', 'goog.i18n.CompactNumberFormatSymbols_tr_TR', 'goog.i18n.CompactNumberFormatSymbols_tt', 'goog.i18n.CompactNumberFormatSymbols_tt_RU', 'goog.i18n.CompactNumberFormatSymbols_twq', 'goog.i18n.CompactNumberFormatSymbols_twq_NE', 'goog.i18n.CompactNumberFormatSymbols_tzm', 'goog.i18n.CompactNumberFormatSymbols_tzm_MA', 'goog.i18n.CompactNumberFormatSymbols_ug', 'goog.i18n.CompactNumberFormatSymbols_ug_CN', 'goog.i18n.CompactNumberFormatSymbols_uk_UA', 'goog.i18n.CompactNumberFormatSymbols_ur_IN', 'goog.i18n.CompactNumberFormatSymbols_ur_PK', 'goog.i18n.CompactNumberFormatSymbols_uz_Arab', 'goog.i18n.CompactNumberFormatSymbols_uz_Arab_AF', 'goog.i18n.CompactNumberFormatSymbols_uz_Cyrl', 'goog.i18n.CompactNumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.CompactNumberFormatSymbols_uz_Latn', 'goog.i18n.CompactNumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.CompactNumberFormatSymbols_vai', 'goog.i18n.CompactNumberFormatSymbols_vai_Latn', 'goog.i18n.CompactNumberFormatSymbols_vai_Latn_LR', 'goog.i18n.CompactNumberFormatSymbols_vai_Vaii', 'goog.i18n.CompactNumberFormatSymbols_vai_Vaii_LR', 'goog.i18n.CompactNumberFormatSymbols_vi_VN', 'goog.i18n.CompactNumberFormatSymbols_vun', 'goog.i18n.CompactNumberFormatSymbols_vun_TZ', 'goog.i18n.CompactNumberFormatSymbols_wae', 'goog.i18n.CompactNumberFormatSymbols_wae_CH', 'goog.i18n.CompactNumberFormatSymbols_wo', 'goog.i18n.CompactNumberFormatSymbols_wo_SN', 'goog.i18n.CompactNumberFormatSymbols_xh', 'goog.i18n.CompactNumberFormatSymbols_xh_ZA', 'goog.i18n.CompactNumberFormatSymbols_xog', 'goog.i18n.CompactNumberFormatSymbols_xog_UG', 'goog.i18n.CompactNumberFormatSymbols_yav', 'goog.i18n.CompactNumberFormatSymbols_yav_CM', 'goog.i18n.CompactNumberFormatSymbols_yi', 'goog.i18n.CompactNumberFormatSymbols_yi_001', 'goog.i18n.CompactNumberFormatSymbols_yo', 'goog.i18n.CompactNumberFormatSymbols_yo_BJ', 'goog.i18n.CompactNumberFormatSymbols_yo_NG', 'goog.i18n.CompactNumberFormatSymbols_yue', 'goog.i18n.CompactNumberFormatSymbols_yue_Hans', 'goog.i18n.CompactNumberFormatSymbols_yue_Hans_CN', 'goog.i18n.CompactNumberFormatSymbols_yue_Hant', 'goog.i18n.CompactNumberFormatSymbols_yue_Hant_HK', 'goog.i18n.CompactNumberFormatSymbols_zgh', 'goog.i18n.CompactNumberFormatSymbols_zgh_MA', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_CN', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_MO', 'goog.i18n.CompactNumberFormatSymbols_zh_Hans_SG', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_HK', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_MO', 'goog.i18n.CompactNumberFormatSymbols_zh_Hant_TW', 'goog.i18n.CompactNumberFormatSymbols_zu_ZA'], ['goog.i18n.CompactNumberFormatSymbols'], {});\ngoog.addDependency('i18n/currency.js', ['goog.i18n.currency', 'goog.i18n.currency.CurrencyInfo', 'goog.i18n.currency.CurrencyInfoTier2'], [], {'lang': 'es6'});\ngoog.addDependency('i18n/currency_test.js', ['goog.i18n.currencyTest'], ['goog.i18n.NumberFormat', 'goog.i18n.currency', 'goog.i18n.currency.CurrencyInfo', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/currencycodemap.js', ['goog.i18n.currencyCodeMap', 'goog.i18n.currencyCodeMapTier2'], [], {});\ngoog.addDependency('i18n/dateintervalformat.js', ['goog.i18n.DateIntervalFormat'], ['goog.array', 'goog.asserts', 'goog.date.DateLike', 'goog.date.DateRange', 'goog.date.DateTime', 'goog.date.Interval', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbolsType', 'goog.i18n.TimeZone', 'goog.i18n.dateIntervalSymbols', 'goog.object'], {'lang': 'es5', 'module': 'goog'});\ngoog.addDependency('i18n/dateintervalformat_test.js', ['goog.i18n.DateIntervalFormatTest'], ['goog.date.Date', 'goog.date.DateRange', 'goog.date.DateTime', 'goog.date.Interval', 'goog.i18n.DateIntervalFormat', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols_ar_EG', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_fr_CA', 'goog.i18n.DateTimeSymbols_gl', 'goog.i18n.DateTimeSymbols_hi', 'goog.i18n.DateTimeSymbols_zh', 'goog.i18n.TimeZone', 'goog.i18n.dateIntervalPatterns', 'goog.i18n.dateIntervalSymbols', 'goog.object', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/dateintervalpatterns.js', ['goog.i18n.dateIntervalPatterns'], ['goog.i18n.dateIntervalSymbols'], {'module': 'goog'});\ngoog.addDependency('i18n/dateintervalpatternsext.js', ['goog.i18n.dateIntervalPatternsExt'], ['goog.i18n.dateIntervalPatterns'], {'module': 'goog'});\ngoog.addDependency('i18n/dateintervalsymbols.js', ['goog.i18n.dateIntervalSymbols'], [], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/dateintervalsymbolsext.js', ['goog.i18n.dateIntervalSymbolsExt'], ['goog.i18n.dateIntervalSymbols'], {'module': 'goog'});\ngoog.addDependency('i18n/datetimeformat.js', ['goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeFormat.Format'], ['goog.asserts', 'goog.date', 'goog.i18n.DateTimeSymbols', 'goog.i18n.TimeZone', 'goog.string'], {});\ngoog.addDependency('i18n/datetimeformat_test.js', ['goog.i18n.DateTimeFormatTest'], ['goog.date.Date', 'goog.date.DateTime', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimePatterns', 'goog.i18n.DateTimePatterns_ar_EG', 'goog.i18n.DateTimePatterns_bg', 'goog.i18n.DateTimePatterns_de', 'goog.i18n.DateTimePatterns_en', 'goog.i18n.DateTimePatterns_en_XA', 'goog.i18n.DateTimePatterns_fa', 'goog.i18n.DateTimePatterns_fr', 'goog.i18n.DateTimePatterns_ja', 'goog.i18n.DateTimePatterns_sv', 'goog.i18n.DateTimePatterns_zh_HK', 'goog.i18n.DateTimePatterns_zh_Hant_TW', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_ar_AE', 'goog.i18n.DateTimeSymbols_ar_EG', 'goog.i18n.DateTimeSymbols_ar_SA', 'goog.i18n.DateTimeSymbols_bn_BD', 'goog.i18n.DateTimeSymbols_de', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_en_GB', 'goog.i18n.DateTimeSymbols_en_IE', 'goog.i18n.DateTimeSymbols_en_IN', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_fr_DJ', 'goog.i18n.DateTimeSymbols_he_IL', 'goog.i18n.DateTimeSymbols_ja', 'goog.i18n.DateTimeSymbols_ro_RO', 'goog.i18n.DateTimeSymbols_sv', 'goog.i18n.TimeZone', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/datetimeparse.js', ['goog.i18n.DateTimeParse'], ['goog.asserts', 'goog.date', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeSymbols'], {});\ngoog.addDependency('i18n/datetimeparse_test.js', ['goog.i18n.DateTimeParseTest'], ['goog.date.Date', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeParse', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_pl', 'goog.i18n.DateTimeSymbols_zh', 'goog.testing.ExpectedFailures', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/datetimepatterns.js', ['goog.i18n.DateTimePatterns', 'goog.i18n.DateTimePatterns_af', 'goog.i18n.DateTimePatterns_am', 'goog.i18n.DateTimePatterns_ar', 'goog.i18n.DateTimePatterns_ar_DZ', 'goog.i18n.DateTimePatterns_ar_EG', 'goog.i18n.DateTimePatterns_az', 'goog.i18n.DateTimePatterns_be', 'goog.i18n.DateTimePatterns_bg', 'goog.i18n.DateTimePatterns_bn', 'goog.i18n.DateTimePatterns_br', 'goog.i18n.DateTimePatterns_bs', 'goog.i18n.DateTimePatterns_ca', 'goog.i18n.DateTimePatterns_chr', 'goog.i18n.DateTimePatterns_cs', 'goog.i18n.DateTimePatterns_cy', 'goog.i18n.DateTimePatterns_da', 'goog.i18n.DateTimePatterns_de', 'goog.i18n.DateTimePatterns_de_AT', 'goog.i18n.DateTimePatterns_de_CH', 'goog.i18n.DateTimePatterns_el', 'goog.i18n.DateTimePatterns_en', 'goog.i18n.DateTimePatterns_en_AU', 'goog.i18n.DateTimePatterns_en_CA', 'goog.i18n.DateTimePatterns_en_GB', 'goog.i18n.DateTimePatterns_en_IE', 'goog.i18n.DateTimePatterns_en_IN', 'goog.i18n.DateTimePatterns_en_SG', 'goog.i18n.DateTimePatterns_en_US', 'goog.i18n.DateTimePatterns_en_ZA', 'goog.i18n.DateTimePatterns_es', 'goog.i18n.DateTimePatterns_es_419', 'goog.i18n.DateTimePatterns_es_ES', 'goog.i18n.DateTimePatterns_es_MX', 'goog.i18n.DateTimePatterns_es_US', 'goog.i18n.DateTimePatterns_et', 'goog.i18n.DateTimePatterns_eu', 'goog.i18n.DateTimePatterns_fa', 'goog.i18n.DateTimePatterns_fi', 'goog.i18n.DateTimePatterns_fil', 'goog.i18n.DateTimePatterns_fr', 'goog.i18n.DateTimePatterns_fr_CA', 'goog.i18n.DateTimePatterns_ga', 'goog.i18n.DateTimePatterns_gl', 'goog.i18n.DateTimePatterns_gsw', 'goog.i18n.DateTimePatterns_gu', 'goog.i18n.DateTimePatterns_haw', 'goog.i18n.DateTimePatterns_he', 'goog.i18n.DateTimePatterns_hi', 'goog.i18n.DateTimePatterns_hr', 'goog.i18n.DateTimePatterns_hu', 'goog.i18n.DateTimePatterns_hy', 'goog.i18n.DateTimePatterns_id', 'goog.i18n.DateTimePatterns_in', 'goog.i18n.DateTimePatterns_is', 'goog.i18n.DateTimePatterns_it', 'goog.i18n.DateTimePatterns_iw', 'goog.i18n.DateTimePatterns_ja', 'goog.i18n.DateTimePatterns_ka', 'goog.i18n.DateTimePatterns_kk', 'goog.i18n.DateTimePatterns_km', 'goog.i18n.DateTimePatterns_kn', 'goog.i18n.DateTimePatterns_ko', 'goog.i18n.DateTimePatterns_ky', 'goog.i18n.DateTimePatterns_ln', 'goog.i18n.DateTimePatterns_lo', 'goog.i18n.DateTimePatterns_lt', 'goog.i18n.DateTimePatterns_lv', 'goog.i18n.DateTimePatterns_mk', 'goog.i18n.DateTimePatterns_ml', 'goog.i18n.DateTimePatterns_mn', 'goog.i18n.DateTimePatterns_mo', 'goog.i18n.DateTimePatterns_mr', 'goog.i18n.DateTimePatterns_ms', 'goog.i18n.DateTimePatterns_mt', 'goog.i18n.DateTimePatterns_my', 'goog.i18n.DateTimePatterns_nb', 'goog.i18n.DateTimePatterns_ne', 'goog.i18n.DateTimePatterns_nl', 'goog.i18n.DateTimePatterns_no', 'goog.i18n.DateTimePatterns_no_NO', 'goog.i18n.DateTimePatterns_or', 'goog.i18n.DateTimePatterns_pa', 'goog.i18n.DateTimePatterns_pl', 'goog.i18n.DateTimePatterns_pt', 'goog.i18n.DateTimePatterns_pt_BR', 'goog.i18n.DateTimePatterns_pt_PT', 'goog.i18n.DateTimePatterns_ro', 'goog.i18n.DateTimePatterns_ru', 'goog.i18n.DateTimePatterns_sh', 'goog.i18n.DateTimePatterns_si', 'goog.i18n.DateTimePatterns_sk', 'goog.i18n.DateTimePatterns_sl', 'goog.i18n.DateTimePatterns_sq', 'goog.i18n.DateTimePatterns_sr', 'goog.i18n.DateTimePatterns_sr_Latn', 'goog.i18n.DateTimePatterns_sv', 'goog.i18n.DateTimePatterns_sw', 'goog.i18n.DateTimePatterns_ta', 'goog.i18n.DateTimePatterns_te', 'goog.i18n.DateTimePatterns_th', 'goog.i18n.DateTimePatterns_tl', 'goog.i18n.DateTimePatterns_tr', 'goog.i18n.DateTimePatterns_uk', 'goog.i18n.DateTimePatterns_ur', 'goog.i18n.DateTimePatterns_uz', 'goog.i18n.DateTimePatterns_vi', 'goog.i18n.DateTimePatterns_zh', 'goog.i18n.DateTimePatterns_zh_CN', 'goog.i18n.DateTimePatterns_zh_HK', 'goog.i18n.DateTimePatterns_zh_TW', 'goog.i18n.DateTimePatterns_zu'], [], {});\ngoog.addDependency('i18n/datetimepatternsext.js', ['goog.i18n.DateTimePatternsExt', 'goog.i18n.DateTimePatterns_af_NA', 'goog.i18n.DateTimePatterns_af_ZA', 'goog.i18n.DateTimePatterns_agq', 'goog.i18n.DateTimePatterns_agq_CM', 'goog.i18n.DateTimePatterns_ak', 'goog.i18n.DateTimePatterns_ak_GH', 'goog.i18n.DateTimePatterns_am_ET', 'goog.i18n.DateTimePatterns_ar_001', 'goog.i18n.DateTimePatterns_ar_AE', 'goog.i18n.DateTimePatterns_ar_BH', 'goog.i18n.DateTimePatterns_ar_DJ', 'goog.i18n.DateTimePatterns_ar_EH', 'goog.i18n.DateTimePatterns_ar_ER', 'goog.i18n.DateTimePatterns_ar_IL', 'goog.i18n.DateTimePatterns_ar_IQ', 'goog.i18n.DateTimePatterns_ar_JO', 'goog.i18n.DateTimePatterns_ar_KM', 'goog.i18n.DateTimePatterns_ar_KW', 'goog.i18n.DateTimePatterns_ar_LB', 'goog.i18n.DateTimePatterns_ar_LY', 'goog.i18n.DateTimePatterns_ar_MA', 'goog.i18n.DateTimePatterns_ar_MR', 'goog.i18n.DateTimePatterns_ar_OM', 'goog.i18n.DateTimePatterns_ar_PS', 'goog.i18n.DateTimePatterns_ar_QA', 'goog.i18n.DateTimePatterns_ar_SA', 'goog.i18n.DateTimePatterns_ar_SD', 'goog.i18n.DateTimePatterns_ar_SO', 'goog.i18n.DateTimePatterns_ar_SS', 'goog.i18n.DateTimePatterns_ar_SY', 'goog.i18n.DateTimePatterns_ar_TD', 'goog.i18n.DateTimePatterns_ar_TN', 'goog.i18n.DateTimePatterns_ar_XB', 'goog.i18n.DateTimePatterns_ar_YE', 'goog.i18n.DateTimePatterns_as', 'goog.i18n.DateTimePatterns_as_IN', 'goog.i18n.DateTimePatterns_asa', 'goog.i18n.DateTimePatterns_asa_TZ', 'goog.i18n.DateTimePatterns_ast', 'goog.i18n.DateTimePatterns_ast_ES', 'goog.i18n.DateTimePatterns_az_Cyrl', 'goog.i18n.DateTimePatterns_az_Cyrl_AZ', 'goog.i18n.DateTimePatterns_az_Latn', 'goog.i18n.DateTimePatterns_az_Latn_AZ', 'goog.i18n.DateTimePatterns_bas', 'goog.i18n.DateTimePatterns_bas_CM', 'goog.i18n.DateTimePatterns_be_BY', 'goog.i18n.DateTimePatterns_bem', 'goog.i18n.DateTimePatterns_bem_ZM', 'goog.i18n.DateTimePatterns_bez', 'goog.i18n.DateTimePatterns_bez_TZ', 'goog.i18n.DateTimePatterns_bg_BG', 'goog.i18n.DateTimePatterns_bm', 'goog.i18n.DateTimePatterns_bm_ML', 'goog.i18n.DateTimePatterns_bn_BD', 'goog.i18n.DateTimePatterns_bn_IN', 'goog.i18n.DateTimePatterns_bo', 'goog.i18n.DateTimePatterns_bo_CN', 'goog.i18n.DateTimePatterns_bo_IN', 'goog.i18n.DateTimePatterns_br_FR', 'goog.i18n.DateTimePatterns_brx', 'goog.i18n.DateTimePatterns_brx_IN', 'goog.i18n.DateTimePatterns_bs_Cyrl', 'goog.i18n.DateTimePatterns_bs_Cyrl_BA', 'goog.i18n.DateTimePatterns_bs_Latn', 'goog.i18n.DateTimePatterns_bs_Latn_BA', 'goog.i18n.DateTimePatterns_ca_AD', 'goog.i18n.DateTimePatterns_ca_ES', 'goog.i18n.DateTimePatterns_ca_FR', 'goog.i18n.DateTimePatterns_ca_IT', 'goog.i18n.DateTimePatterns_ccp', 'goog.i18n.DateTimePatterns_ccp_BD', 'goog.i18n.DateTimePatterns_ccp_IN', 'goog.i18n.DateTimePatterns_ce', 'goog.i18n.DateTimePatterns_ce_RU', 'goog.i18n.DateTimePatterns_ceb', 'goog.i18n.DateTimePatterns_ceb_PH', 'goog.i18n.DateTimePatterns_cgg', 'goog.i18n.DateTimePatterns_cgg_UG', 'goog.i18n.DateTimePatterns_chr_US', 'goog.i18n.DateTimePatterns_ckb', 'goog.i18n.DateTimePatterns_ckb_IQ', 'goog.i18n.DateTimePatterns_ckb_IR', 'goog.i18n.DateTimePatterns_cs_CZ', 'goog.i18n.DateTimePatterns_cy_GB', 'goog.i18n.DateTimePatterns_da_DK', 'goog.i18n.DateTimePatterns_da_GL', 'goog.i18n.DateTimePatterns_dav', 'goog.i18n.DateTimePatterns_dav_KE', 'goog.i18n.DateTimePatterns_de_BE', 'goog.i18n.DateTimePatterns_de_DE', 'goog.i18n.DateTimePatterns_de_IT', 'goog.i18n.DateTimePatterns_de_LI', 'goog.i18n.DateTimePatterns_de_LU', 'goog.i18n.DateTimePatterns_dje', 'goog.i18n.DateTimePatterns_dje_NE', 'goog.i18n.DateTimePatterns_dsb', 'goog.i18n.DateTimePatterns_dsb_DE', 'goog.i18n.DateTimePatterns_dua', 'goog.i18n.DateTimePatterns_dua_CM', 'goog.i18n.DateTimePatterns_dyo', 'goog.i18n.DateTimePatterns_dyo_SN', 'goog.i18n.DateTimePatterns_dz', 'goog.i18n.DateTimePatterns_dz_BT', 'goog.i18n.DateTimePatterns_ebu', 'goog.i18n.DateTimePatterns_ebu_KE', 'goog.i18n.DateTimePatterns_ee', 'goog.i18n.DateTimePatterns_ee_GH', 'goog.i18n.DateTimePatterns_ee_TG', 'goog.i18n.DateTimePatterns_el_CY', 'goog.i18n.DateTimePatterns_el_GR', 'goog.i18n.DateTimePatterns_en_001', 'goog.i18n.DateTimePatterns_en_150', 'goog.i18n.DateTimePatterns_en_AE', 'goog.i18n.DateTimePatterns_en_AG', 'goog.i18n.DateTimePatterns_en_AI', 'goog.i18n.DateTimePatterns_en_AS', 'goog.i18n.DateTimePatterns_en_AT', 'goog.i18n.DateTimePatterns_en_BB', 'goog.i18n.DateTimePatterns_en_BE', 'goog.i18n.DateTimePatterns_en_BI', 'goog.i18n.DateTimePatterns_en_BM', 'goog.i18n.DateTimePatterns_en_BS', 'goog.i18n.DateTimePatterns_en_BW', 'goog.i18n.DateTimePatterns_en_BZ', 'goog.i18n.DateTimePatterns_en_CC', 'goog.i18n.DateTimePatterns_en_CH', 'goog.i18n.DateTimePatterns_en_CK', 'goog.i18n.DateTimePatterns_en_CM', 'goog.i18n.DateTimePatterns_en_CX', 'goog.i18n.DateTimePatterns_en_CY', 'goog.i18n.DateTimePatterns_en_DE', 'goog.i18n.DateTimePatterns_en_DG', 'goog.i18n.DateTimePatterns_en_DK', 'goog.i18n.DateTimePatterns_en_DM', 'goog.i18n.DateTimePatterns_en_ER', 'goog.i18n.DateTimePatterns_en_FI', 'goog.i18n.DateTimePatterns_en_FJ', 'goog.i18n.DateTimePatterns_en_FK', 'goog.i18n.DateTimePatterns_en_FM', 'goog.i18n.DateTimePatterns_en_GD', 'goog.i18n.DateTimePatterns_en_GG', 'goog.i18n.DateTimePatterns_en_GH', 'goog.i18n.DateTimePatterns_en_GI', 'goog.i18n.DateTimePatterns_en_GM', 'goog.i18n.DateTimePatterns_en_GU', 'goog.i18n.DateTimePatterns_en_GY', 'goog.i18n.DateTimePatterns_en_HK', 'goog.i18n.DateTimePatterns_en_IL', 'goog.i18n.DateTimePatterns_en_IM', 'goog.i18n.DateTimePatterns_en_IO', 'goog.i18n.DateTimePatterns_en_JE', 'goog.i18n.DateTimePatterns_en_JM', 'goog.i18n.DateTimePatterns_en_KE', 'goog.i18n.DateTimePatterns_en_KI', 'goog.i18n.DateTimePatterns_en_KN', 'goog.i18n.DateTimePatterns_en_KY', 'goog.i18n.DateTimePatterns_en_LC', 'goog.i18n.DateTimePatterns_en_LR', 'goog.i18n.DateTimePatterns_en_LS', 'goog.i18n.DateTimePatterns_en_MG', 'goog.i18n.DateTimePatterns_en_MH', 'goog.i18n.DateTimePatterns_en_MO', 'goog.i18n.DateTimePatterns_en_MP', 'goog.i18n.DateTimePatterns_en_MS', 'goog.i18n.DateTimePatterns_en_MT', 'goog.i18n.DateTimePatterns_en_MU', 'goog.i18n.DateTimePatterns_en_MW', 'goog.i18n.DateTimePatterns_en_MY', 'goog.i18n.DateTimePatterns_en_NA', 'goog.i18n.DateTimePatterns_en_NF', 'goog.i18n.DateTimePatterns_en_NG', 'goog.i18n.DateTimePatterns_en_NL', 'goog.i18n.DateTimePatterns_en_NR', 'goog.i18n.DateTimePatterns_en_NU', 'goog.i18n.DateTimePatterns_en_NZ', 'goog.i18n.DateTimePatterns_en_PG', 'goog.i18n.DateTimePatterns_en_PH', 'goog.i18n.DateTimePatterns_en_PK', 'goog.i18n.DateTimePatterns_en_PN', 'goog.i18n.DateTimePatterns_en_PR', 'goog.i18n.DateTimePatterns_en_PW', 'goog.i18n.DateTimePatterns_en_RW', 'goog.i18n.DateTimePatterns_en_SB', 'goog.i18n.DateTimePatterns_en_SC', 'goog.i18n.DateTimePatterns_en_SD', 'goog.i18n.DateTimePatterns_en_SE', 'goog.i18n.DateTimePatterns_en_SH', 'goog.i18n.DateTimePatterns_en_SI', 'goog.i18n.DateTimePatterns_en_SL', 'goog.i18n.DateTimePatterns_en_SS', 'goog.i18n.DateTimePatterns_en_SX', 'goog.i18n.DateTimePatterns_en_SZ', 'goog.i18n.DateTimePatterns_en_TC', 'goog.i18n.DateTimePatterns_en_TK', 'goog.i18n.DateTimePatterns_en_TO', 'goog.i18n.DateTimePatterns_en_TT', 'goog.i18n.DateTimePatterns_en_TV', 'goog.i18n.DateTimePatterns_en_TZ', 'goog.i18n.DateTimePatterns_en_UG', 'goog.i18n.DateTimePatterns_en_UM', 'goog.i18n.DateTimePatterns_en_US_POSIX', 'goog.i18n.DateTimePatterns_en_VC', 'goog.i18n.DateTimePatterns_en_VG', 'goog.i18n.DateTimePatterns_en_VI', 'goog.i18n.DateTimePatterns_en_VU', 'goog.i18n.DateTimePatterns_en_WS', 'goog.i18n.DateTimePatterns_en_XA', 'goog.i18n.DateTimePatterns_en_ZM', 'goog.i18n.DateTimePatterns_en_ZW', 'goog.i18n.DateTimePatterns_eo', 'goog.i18n.DateTimePatterns_eo_001', 'goog.i18n.DateTimePatterns_es_AR', 'goog.i18n.DateTimePatterns_es_BO', 'goog.i18n.DateTimePatterns_es_BR', 'goog.i18n.DateTimePatterns_es_BZ', 'goog.i18n.DateTimePatterns_es_CL', 'goog.i18n.DateTimePatterns_es_CO', 'goog.i18n.DateTimePatterns_es_CR', 'goog.i18n.DateTimePatterns_es_CU', 'goog.i18n.DateTimePatterns_es_DO', 'goog.i18n.DateTimePatterns_es_EA', 'goog.i18n.DateTimePatterns_es_EC', 'goog.i18n.DateTimePatterns_es_GQ', 'goog.i18n.DateTimePatterns_es_GT', 'goog.i18n.DateTimePatterns_es_HN', 'goog.i18n.DateTimePatterns_es_IC', 'goog.i18n.DateTimePatterns_es_NI', 'goog.i18n.DateTimePatterns_es_PA', 'goog.i18n.DateTimePatterns_es_PE', 'goog.i18n.DateTimePatterns_es_PH', 'goog.i18n.DateTimePatterns_es_PR', 'goog.i18n.DateTimePatterns_es_PY', 'goog.i18n.DateTimePatterns_es_SV', 'goog.i18n.DateTimePatterns_es_UY', 'goog.i18n.DateTimePatterns_es_VE', 'goog.i18n.DateTimePatterns_et_EE', 'goog.i18n.DateTimePatterns_eu_ES', 'goog.i18n.DateTimePatterns_ewo', 'goog.i18n.DateTimePatterns_ewo_CM', 'goog.i18n.DateTimePatterns_fa_AF', 'goog.i18n.DateTimePatterns_fa_IR', 'goog.i18n.DateTimePatterns_ff', 'goog.i18n.DateTimePatterns_ff_Latn', 'goog.i18n.DateTimePatterns_ff_Latn_BF', 'goog.i18n.DateTimePatterns_ff_Latn_CM', 'goog.i18n.DateTimePatterns_ff_Latn_GH', 'goog.i18n.DateTimePatterns_ff_Latn_GM', 'goog.i18n.DateTimePatterns_ff_Latn_GN', 'goog.i18n.DateTimePatterns_ff_Latn_GW', 'goog.i18n.DateTimePatterns_ff_Latn_LR', 'goog.i18n.DateTimePatterns_ff_Latn_MR', 'goog.i18n.DateTimePatterns_ff_Latn_NE', 'goog.i18n.DateTimePatterns_ff_Latn_NG', 'goog.i18n.DateTimePatterns_ff_Latn_SL', 'goog.i18n.DateTimePatterns_ff_Latn_SN', 'goog.i18n.DateTimePatterns_fi_FI', 'goog.i18n.DateTimePatterns_fil_PH', 'goog.i18n.DateTimePatterns_fo', 'goog.i18n.DateTimePatterns_fo_DK', 'goog.i18n.DateTimePatterns_fo_FO', 'goog.i18n.DateTimePatterns_fr_BE', 'goog.i18n.DateTimePatterns_fr_BF', 'goog.i18n.DateTimePatterns_fr_BI', 'goog.i18n.DateTimePatterns_fr_BJ', 'goog.i18n.DateTimePatterns_fr_BL', 'goog.i18n.DateTimePatterns_fr_CD', 'goog.i18n.DateTimePatterns_fr_CF', 'goog.i18n.DateTimePatterns_fr_CG', 'goog.i18n.DateTimePatterns_fr_CH', 'goog.i18n.DateTimePatterns_fr_CI', 'goog.i18n.DateTimePatterns_fr_CM', 'goog.i18n.DateTimePatterns_fr_DJ', 'goog.i18n.DateTimePatterns_fr_DZ', 'goog.i18n.DateTimePatterns_fr_FR', 'goog.i18n.DateTimePatterns_fr_GA', 'goog.i18n.DateTimePatterns_fr_GF', 'goog.i18n.DateTimePatterns_fr_GN', 'goog.i18n.DateTimePatterns_fr_GP', 'goog.i18n.DateTimePatterns_fr_GQ', 'goog.i18n.DateTimePatterns_fr_HT', 'goog.i18n.DateTimePatterns_fr_KM', 'goog.i18n.DateTimePatterns_fr_LU', 'goog.i18n.DateTimePatterns_fr_MA', 'goog.i18n.DateTimePatterns_fr_MC', 'goog.i18n.DateTimePatterns_fr_MF', 'goog.i18n.DateTimePatterns_fr_MG', 'goog.i18n.DateTimePatterns_fr_ML', 'goog.i18n.DateTimePatterns_fr_MQ', 'goog.i18n.DateTimePatterns_fr_MR', 'goog.i18n.DateTimePatterns_fr_MU', 'goog.i18n.DateTimePatterns_fr_NC', 'goog.i18n.DateTimePatterns_fr_NE', 'goog.i18n.DateTimePatterns_fr_PF', 'goog.i18n.DateTimePatterns_fr_PM', 'goog.i18n.DateTimePatterns_fr_RE', 'goog.i18n.DateTimePatterns_fr_RW', 'goog.i18n.DateTimePatterns_fr_SC', 'goog.i18n.DateTimePatterns_fr_SN', 'goog.i18n.DateTimePatterns_fr_SY', 'goog.i18n.DateTimePatterns_fr_TD', 'goog.i18n.DateTimePatterns_fr_TG', 'goog.i18n.DateTimePatterns_fr_TN', 'goog.i18n.DateTimePatterns_fr_VU', 'goog.i18n.DateTimePatterns_fr_WF', 'goog.i18n.DateTimePatterns_fr_YT', 'goog.i18n.DateTimePatterns_fur', 'goog.i18n.DateTimePatterns_fur_IT', 'goog.i18n.DateTimePatterns_fy', 'goog.i18n.DateTimePatterns_fy_NL', 'goog.i18n.DateTimePatterns_ga_IE', 'goog.i18n.DateTimePatterns_gd', 'goog.i18n.DateTimePatterns_gd_GB', 'goog.i18n.DateTimePatterns_gl_ES', 'goog.i18n.DateTimePatterns_gsw_CH', 'goog.i18n.DateTimePatterns_gsw_FR', 'goog.i18n.DateTimePatterns_gsw_LI', 'goog.i18n.DateTimePatterns_gu_IN', 'goog.i18n.DateTimePatterns_guz', 'goog.i18n.DateTimePatterns_guz_KE', 'goog.i18n.DateTimePatterns_gv', 'goog.i18n.DateTimePatterns_gv_IM', 'goog.i18n.DateTimePatterns_ha', 'goog.i18n.DateTimePatterns_ha_GH', 'goog.i18n.DateTimePatterns_ha_NE', 'goog.i18n.DateTimePatterns_ha_NG', 'goog.i18n.DateTimePatterns_haw_US', 'goog.i18n.DateTimePatterns_he_IL', 'goog.i18n.DateTimePatterns_hi_IN', 'goog.i18n.DateTimePatterns_hr_BA', 'goog.i18n.DateTimePatterns_hr_HR', 'goog.i18n.DateTimePatterns_hsb', 'goog.i18n.DateTimePatterns_hsb_DE', 'goog.i18n.DateTimePatterns_hu_HU', 'goog.i18n.DateTimePatterns_hy_AM', 'goog.i18n.DateTimePatterns_ia', 'goog.i18n.DateTimePatterns_ia_001', 'goog.i18n.DateTimePatterns_id_ID', 'goog.i18n.DateTimePatterns_ig', 'goog.i18n.DateTimePatterns_ig_NG', 'goog.i18n.DateTimePatterns_ii', 'goog.i18n.DateTimePatterns_ii_CN', 'goog.i18n.DateTimePatterns_is_IS', 'goog.i18n.DateTimePatterns_it_CH', 'goog.i18n.DateTimePatterns_it_IT', 'goog.i18n.DateTimePatterns_it_SM', 'goog.i18n.DateTimePatterns_it_VA', 'goog.i18n.DateTimePatterns_ja_JP', 'goog.i18n.DateTimePatterns_jgo', 'goog.i18n.DateTimePatterns_jgo_CM', 'goog.i18n.DateTimePatterns_jmc', 'goog.i18n.DateTimePatterns_jmc_TZ', 'goog.i18n.DateTimePatterns_jv', 'goog.i18n.DateTimePatterns_jv_ID', 'goog.i18n.DateTimePatterns_ka_GE', 'goog.i18n.DateTimePatterns_kab', 'goog.i18n.DateTimePatterns_kab_DZ', 'goog.i18n.DateTimePatterns_kam', 'goog.i18n.DateTimePatterns_kam_KE', 'goog.i18n.DateTimePatterns_kde', 'goog.i18n.DateTimePatterns_kde_TZ', 'goog.i18n.DateTimePatterns_kea', 'goog.i18n.DateTimePatterns_kea_CV', 'goog.i18n.DateTimePatterns_khq', 'goog.i18n.DateTimePatterns_khq_ML', 'goog.i18n.DateTimePatterns_ki', 'goog.i18n.DateTimePatterns_ki_KE', 'goog.i18n.DateTimePatterns_kk_KZ', 'goog.i18n.DateTimePatterns_kkj', 'goog.i18n.DateTimePatterns_kkj_CM', 'goog.i18n.DateTimePatterns_kl', 'goog.i18n.DateTimePatterns_kl_GL', 'goog.i18n.DateTimePatterns_kln', 'goog.i18n.DateTimePatterns_kln_KE', 'goog.i18n.DateTimePatterns_km_KH', 'goog.i18n.DateTimePatterns_kn_IN', 'goog.i18n.DateTimePatterns_ko_KP', 'goog.i18n.DateTimePatterns_ko_KR', 'goog.i18n.DateTimePatterns_kok', 'goog.i18n.DateTimePatterns_kok_IN', 'goog.i18n.DateTimePatterns_ks', 'goog.i18n.DateTimePatterns_ks_IN', 'goog.i18n.DateTimePatterns_ksb', 'goog.i18n.DateTimePatterns_ksb_TZ', 'goog.i18n.DateTimePatterns_ksf', 'goog.i18n.DateTimePatterns_ksf_CM', 'goog.i18n.DateTimePatterns_ksh', 'goog.i18n.DateTimePatterns_ksh_DE', 'goog.i18n.DateTimePatterns_ku', 'goog.i18n.DateTimePatterns_ku_TR', 'goog.i18n.DateTimePatterns_kw', 'goog.i18n.DateTimePatterns_kw_GB', 'goog.i18n.DateTimePatterns_ky_KG', 'goog.i18n.DateTimePatterns_lag', 'goog.i18n.DateTimePatterns_lag_TZ', 'goog.i18n.DateTimePatterns_lb', 'goog.i18n.DateTimePatterns_lb_LU', 'goog.i18n.DateTimePatterns_lg', 'goog.i18n.DateTimePatterns_lg_UG', 'goog.i18n.DateTimePatterns_lkt', 'goog.i18n.DateTimePatterns_lkt_US', 'goog.i18n.DateTimePatterns_ln_AO', 'goog.i18n.DateTimePatterns_ln_CD', 'goog.i18n.DateTimePatterns_ln_CF', 'goog.i18n.DateTimePatterns_ln_CG', 'goog.i18n.DateTimePatterns_lo_LA', 'goog.i18n.DateTimePatterns_lrc', 'goog.i18n.DateTimePatterns_lrc_IQ', 'goog.i18n.DateTimePatterns_lrc_IR', 'goog.i18n.DateTimePatterns_lt_LT', 'goog.i18n.DateTimePatterns_lu', 'goog.i18n.DateTimePatterns_lu_CD', 'goog.i18n.DateTimePatterns_luo', 'goog.i18n.DateTimePatterns_luo_KE', 'goog.i18n.DateTimePatterns_luy', 'goog.i18n.DateTimePatterns_luy_KE', 'goog.i18n.DateTimePatterns_lv_LV', 'goog.i18n.DateTimePatterns_mas', 'goog.i18n.DateTimePatterns_mas_KE', 'goog.i18n.DateTimePatterns_mas_TZ', 'goog.i18n.DateTimePatterns_mer', 'goog.i18n.DateTimePatterns_mer_KE', 'goog.i18n.DateTimePatterns_mfe', 'goog.i18n.DateTimePatterns_mfe_MU', 'goog.i18n.DateTimePatterns_mg', 'goog.i18n.DateTimePatterns_mg_MG', 'goog.i18n.DateTimePatterns_mgh', 'goog.i18n.DateTimePatterns_mgh_MZ', 'goog.i18n.DateTimePatterns_mgo', 'goog.i18n.DateTimePatterns_mgo_CM', 'goog.i18n.DateTimePatterns_mi', 'goog.i18n.DateTimePatterns_mi_NZ', 'goog.i18n.DateTimePatterns_mk_MK', 'goog.i18n.DateTimePatterns_ml_IN', 'goog.i18n.DateTimePatterns_mn_MN', 'goog.i18n.DateTimePatterns_mr_IN', 'goog.i18n.DateTimePatterns_ms_BN', 'goog.i18n.DateTimePatterns_ms_MY', 'goog.i18n.DateTimePatterns_ms_SG', 'goog.i18n.DateTimePatterns_mt_MT', 'goog.i18n.DateTimePatterns_mua', 'goog.i18n.DateTimePatterns_mua_CM', 'goog.i18n.DateTimePatterns_my_MM', 'goog.i18n.DateTimePatterns_mzn', 'goog.i18n.DateTimePatterns_mzn_IR', 'goog.i18n.DateTimePatterns_naq', 'goog.i18n.DateTimePatterns_naq_NA', 'goog.i18n.DateTimePatterns_nb_NO', 'goog.i18n.DateTimePatterns_nb_SJ', 'goog.i18n.DateTimePatterns_nd', 'goog.i18n.DateTimePatterns_nd_ZW', 'goog.i18n.DateTimePatterns_nds', 'goog.i18n.DateTimePatterns_nds_DE', 'goog.i18n.DateTimePatterns_nds_NL', 'goog.i18n.DateTimePatterns_ne_IN', 'goog.i18n.DateTimePatterns_ne_NP', 'goog.i18n.DateTimePatterns_nl_AW', 'goog.i18n.DateTimePatterns_nl_BE', 'goog.i18n.DateTimePatterns_nl_BQ', 'goog.i18n.DateTimePatterns_nl_CW', 'goog.i18n.DateTimePatterns_nl_NL', 'goog.i18n.DateTimePatterns_nl_SR', 'goog.i18n.DateTimePatterns_nl_SX', 'goog.i18n.DateTimePatterns_nmg', 'goog.i18n.DateTimePatterns_nmg_CM', 'goog.i18n.DateTimePatterns_nn', 'goog.i18n.DateTimePatterns_nn_NO', 'goog.i18n.DateTimePatterns_nnh', 'goog.i18n.DateTimePatterns_nnh_CM', 'goog.i18n.DateTimePatterns_nus', 'goog.i18n.DateTimePatterns_nus_SS', 'goog.i18n.DateTimePatterns_nyn', 'goog.i18n.DateTimePatterns_nyn_UG', 'goog.i18n.DateTimePatterns_om', 'goog.i18n.DateTimePatterns_om_ET', 'goog.i18n.DateTimePatterns_om_KE', 'goog.i18n.DateTimePatterns_or_IN', 'goog.i18n.DateTimePatterns_os', 'goog.i18n.DateTimePatterns_os_GE', 'goog.i18n.DateTimePatterns_os_RU', 'goog.i18n.DateTimePatterns_pa_Arab', 'goog.i18n.DateTimePatterns_pa_Arab_PK', 'goog.i18n.DateTimePatterns_pa_Guru', 'goog.i18n.DateTimePatterns_pa_Guru_IN', 'goog.i18n.DateTimePatterns_pl_PL', 'goog.i18n.DateTimePatterns_ps', 'goog.i18n.DateTimePatterns_ps_AF', 'goog.i18n.DateTimePatterns_ps_PK', 'goog.i18n.DateTimePatterns_pt_AO', 'goog.i18n.DateTimePatterns_pt_CH', 'goog.i18n.DateTimePatterns_pt_CV', 'goog.i18n.DateTimePatterns_pt_GQ', 'goog.i18n.DateTimePatterns_pt_GW', 'goog.i18n.DateTimePatterns_pt_LU', 'goog.i18n.DateTimePatterns_pt_MO', 'goog.i18n.DateTimePatterns_pt_MZ', 'goog.i18n.DateTimePatterns_pt_ST', 'goog.i18n.DateTimePatterns_pt_TL', 'goog.i18n.DateTimePatterns_qu', 'goog.i18n.DateTimePatterns_qu_BO', 'goog.i18n.DateTimePatterns_qu_EC', 'goog.i18n.DateTimePatterns_qu_PE', 'goog.i18n.DateTimePatterns_rm', 'goog.i18n.DateTimePatterns_rm_CH', 'goog.i18n.DateTimePatterns_rn', 'goog.i18n.DateTimePatterns_rn_BI', 'goog.i18n.DateTimePatterns_ro_MD', 'goog.i18n.DateTimePatterns_ro_RO', 'goog.i18n.DateTimePatterns_rof', 'goog.i18n.DateTimePatterns_rof_TZ', 'goog.i18n.DateTimePatterns_ru_BY', 'goog.i18n.DateTimePatterns_ru_KG', 'goog.i18n.DateTimePatterns_ru_KZ', 'goog.i18n.DateTimePatterns_ru_MD', 'goog.i18n.DateTimePatterns_ru_RU', 'goog.i18n.DateTimePatterns_ru_UA', 'goog.i18n.DateTimePatterns_rw', 'goog.i18n.DateTimePatterns_rw_RW', 'goog.i18n.DateTimePatterns_rwk', 'goog.i18n.DateTimePatterns_rwk_TZ', 'goog.i18n.DateTimePatterns_sah', 'goog.i18n.DateTimePatterns_sah_RU', 'goog.i18n.DateTimePatterns_saq', 'goog.i18n.DateTimePatterns_saq_KE', 'goog.i18n.DateTimePatterns_sbp', 'goog.i18n.DateTimePatterns_sbp_TZ', 'goog.i18n.DateTimePatterns_sd', 'goog.i18n.DateTimePatterns_sd_PK', 'goog.i18n.DateTimePatterns_se', 'goog.i18n.DateTimePatterns_se_FI', 'goog.i18n.DateTimePatterns_se_NO', 'goog.i18n.DateTimePatterns_se_SE', 'goog.i18n.DateTimePatterns_seh', 'goog.i18n.DateTimePatterns_seh_MZ', 'goog.i18n.DateTimePatterns_ses', 'goog.i18n.DateTimePatterns_ses_ML', 'goog.i18n.DateTimePatterns_sg', 'goog.i18n.DateTimePatterns_sg_CF', 'goog.i18n.DateTimePatterns_shi', 'goog.i18n.DateTimePatterns_shi_Latn', 'goog.i18n.DateTimePatterns_shi_Latn_MA', 'goog.i18n.DateTimePatterns_shi_Tfng', 'goog.i18n.DateTimePatterns_shi_Tfng_MA', 'goog.i18n.DateTimePatterns_si_LK', 'goog.i18n.DateTimePatterns_sk_SK', 'goog.i18n.DateTimePatterns_sl_SI', 'goog.i18n.DateTimePatterns_smn', 'goog.i18n.DateTimePatterns_smn_FI', 'goog.i18n.DateTimePatterns_sn', 'goog.i18n.DateTimePatterns_sn_ZW', 'goog.i18n.DateTimePatterns_so', 'goog.i18n.DateTimePatterns_so_DJ', 'goog.i18n.DateTimePatterns_so_ET', 'goog.i18n.DateTimePatterns_so_KE', 'goog.i18n.DateTimePatterns_so_SO', 'goog.i18n.DateTimePatterns_sq_AL', 'goog.i18n.DateTimePatterns_sq_MK', 'goog.i18n.DateTimePatterns_sq_XK', 'goog.i18n.DateTimePatterns_sr_Cyrl', 'goog.i18n.DateTimePatterns_sr_Cyrl_BA', 'goog.i18n.DateTimePatterns_sr_Cyrl_ME', 'goog.i18n.DateTimePatterns_sr_Cyrl_RS', 'goog.i18n.DateTimePatterns_sr_Cyrl_XK', 'goog.i18n.DateTimePatterns_sr_Latn_BA', 'goog.i18n.DateTimePatterns_sr_Latn_ME', 'goog.i18n.DateTimePatterns_sr_Latn_RS', 'goog.i18n.DateTimePatterns_sr_Latn_XK', 'goog.i18n.DateTimePatterns_sv_AX', 'goog.i18n.DateTimePatterns_sv_FI', 'goog.i18n.DateTimePatterns_sv_SE', 'goog.i18n.DateTimePatterns_sw_CD', 'goog.i18n.DateTimePatterns_sw_KE', 'goog.i18n.DateTimePatterns_sw_TZ', 'goog.i18n.DateTimePatterns_sw_UG', 'goog.i18n.DateTimePatterns_ta_IN', 'goog.i18n.DateTimePatterns_ta_LK', 'goog.i18n.DateTimePatterns_ta_MY', 'goog.i18n.DateTimePatterns_ta_SG', 'goog.i18n.DateTimePatterns_te_IN', 'goog.i18n.DateTimePatterns_teo', 'goog.i18n.DateTimePatterns_teo_KE', 'goog.i18n.DateTimePatterns_teo_UG', 'goog.i18n.DateTimePatterns_tg', 'goog.i18n.DateTimePatterns_tg_TJ', 'goog.i18n.DateTimePatterns_th_TH', 'goog.i18n.DateTimePatterns_ti', 'goog.i18n.DateTimePatterns_ti_ER', 'goog.i18n.DateTimePatterns_ti_ET', 'goog.i18n.DateTimePatterns_tk', 'goog.i18n.DateTimePatterns_tk_TM', 'goog.i18n.DateTimePatterns_to', 'goog.i18n.DateTimePatterns_to_TO', 'goog.i18n.DateTimePatterns_tr_CY', 'goog.i18n.DateTimePatterns_tr_TR', 'goog.i18n.DateTimePatterns_tt', 'goog.i18n.DateTimePatterns_tt_RU', 'goog.i18n.DateTimePatterns_twq', 'goog.i18n.DateTimePatterns_twq_NE', 'goog.i18n.DateTimePatterns_tzm', 'goog.i18n.DateTimePatterns_tzm_MA', 'goog.i18n.DateTimePatterns_ug', 'goog.i18n.DateTimePatterns_ug_CN', 'goog.i18n.DateTimePatterns_uk_UA', 'goog.i18n.DateTimePatterns_ur_IN', 'goog.i18n.DateTimePatterns_ur_PK', 'goog.i18n.DateTimePatterns_uz_Arab', 'goog.i18n.DateTimePatterns_uz_Arab_AF', 'goog.i18n.DateTimePatterns_uz_Cyrl', 'goog.i18n.DateTimePatterns_uz_Cyrl_UZ', 'goog.i18n.DateTimePatterns_uz_Latn', 'goog.i18n.DateTimePatterns_uz_Latn_UZ', 'goog.i18n.DateTimePatterns_vai', 'goog.i18n.DateTimePatterns_vai_Latn', 'goog.i18n.DateTimePatterns_vai_Latn_LR', 'goog.i18n.DateTimePatterns_vai_Vaii', 'goog.i18n.DateTimePatterns_vai_Vaii_LR', 'goog.i18n.DateTimePatterns_vi_VN', 'goog.i18n.DateTimePatterns_vun', 'goog.i18n.DateTimePatterns_vun_TZ', 'goog.i18n.DateTimePatterns_wae', 'goog.i18n.DateTimePatterns_wae_CH', 'goog.i18n.DateTimePatterns_wo', 'goog.i18n.DateTimePatterns_wo_SN', 'goog.i18n.DateTimePatterns_xh', 'goog.i18n.DateTimePatterns_xh_ZA', 'goog.i18n.DateTimePatterns_xog', 'goog.i18n.DateTimePatterns_xog_UG', 'goog.i18n.DateTimePatterns_yav', 'goog.i18n.DateTimePatterns_yav_CM', 'goog.i18n.DateTimePatterns_yi', 'goog.i18n.DateTimePatterns_yi_001', 'goog.i18n.DateTimePatterns_yo', 'goog.i18n.DateTimePatterns_yo_BJ', 'goog.i18n.DateTimePatterns_yo_NG', 'goog.i18n.DateTimePatterns_yue', 'goog.i18n.DateTimePatterns_yue_Hans', 'goog.i18n.DateTimePatterns_yue_Hans_CN', 'goog.i18n.DateTimePatterns_yue_Hant', 'goog.i18n.DateTimePatterns_yue_Hant_HK', 'goog.i18n.DateTimePatterns_zgh', 'goog.i18n.DateTimePatterns_zgh_MA', 'goog.i18n.DateTimePatterns_zh_Hans', 'goog.i18n.DateTimePatterns_zh_Hans_CN', 'goog.i18n.DateTimePatterns_zh_Hans_HK', 'goog.i18n.DateTimePatterns_zh_Hans_MO', 'goog.i18n.DateTimePatterns_zh_Hans_SG', 'goog.i18n.DateTimePatterns_zh_Hant', 'goog.i18n.DateTimePatterns_zh_Hant_HK', 'goog.i18n.DateTimePatterns_zh_Hant_MO', 'goog.i18n.DateTimePatterns_zh_Hant_TW', 'goog.i18n.DateTimePatterns_zu_ZA'], ['goog.i18n.DateTimePatterns'], {});\ngoog.addDependency('i18n/datetimesymbols.js', ['goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbolsType', 'goog.i18n.DateTimeSymbols_af', 'goog.i18n.DateTimeSymbols_am', 'goog.i18n.DateTimeSymbols_ar', 'goog.i18n.DateTimeSymbols_ar_DZ', 'goog.i18n.DateTimeSymbols_ar_EG', 'goog.i18n.DateTimeSymbols_az', 'goog.i18n.DateTimeSymbols_be', 'goog.i18n.DateTimeSymbols_bg', 'goog.i18n.DateTimeSymbols_bn', 'goog.i18n.DateTimeSymbols_br', 'goog.i18n.DateTimeSymbols_bs', 'goog.i18n.DateTimeSymbols_ca', 'goog.i18n.DateTimeSymbols_chr', 'goog.i18n.DateTimeSymbols_cs', 'goog.i18n.DateTimeSymbols_cy', 'goog.i18n.DateTimeSymbols_da', 'goog.i18n.DateTimeSymbols_de', 'goog.i18n.DateTimeSymbols_de_AT', 'goog.i18n.DateTimeSymbols_de_CH', 'goog.i18n.DateTimeSymbols_el', 'goog.i18n.DateTimeSymbols_en', 'goog.i18n.DateTimeSymbols_en_AU', 'goog.i18n.DateTimeSymbols_en_CA', 'goog.i18n.DateTimeSymbols_en_GB', 'goog.i18n.DateTimeSymbols_en_IE', 'goog.i18n.DateTimeSymbols_en_IN', 'goog.i18n.DateTimeSymbols_en_ISO', 'goog.i18n.DateTimeSymbols_en_SG', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_en_ZA', 'goog.i18n.DateTimeSymbols_es', 'goog.i18n.DateTimeSymbols_es_419', 'goog.i18n.DateTimeSymbols_es_ES', 'goog.i18n.DateTimeSymbols_es_MX', 'goog.i18n.DateTimeSymbols_es_US', 'goog.i18n.DateTimeSymbols_et', 'goog.i18n.DateTimeSymbols_eu', 'goog.i18n.DateTimeSymbols_fa', 'goog.i18n.DateTimeSymbols_fi', 'goog.i18n.DateTimeSymbols_fil', 'goog.i18n.DateTimeSymbols_fr', 'goog.i18n.DateTimeSymbols_fr_CA', 'goog.i18n.DateTimeSymbols_ga', 'goog.i18n.DateTimeSymbols_gl', 'goog.i18n.DateTimeSymbols_gsw', 'goog.i18n.DateTimeSymbols_gu', 'goog.i18n.DateTimeSymbols_haw', 'goog.i18n.DateTimeSymbols_he', 'goog.i18n.DateTimeSymbols_hi', 'goog.i18n.DateTimeSymbols_hr', 'goog.i18n.DateTimeSymbols_hu', 'goog.i18n.DateTimeSymbols_hy', 'goog.i18n.DateTimeSymbols_id', 'goog.i18n.DateTimeSymbols_in', 'goog.i18n.DateTimeSymbols_is', 'goog.i18n.DateTimeSymbols_it', 'goog.i18n.DateTimeSymbols_iw', 'goog.i18n.DateTimeSymbols_ja', 'goog.i18n.DateTimeSymbols_ka', 'goog.i18n.DateTimeSymbols_kk', 'goog.i18n.DateTimeSymbols_km', 'goog.i18n.DateTimeSymbols_kn', 'goog.i18n.DateTimeSymbols_ko', 'goog.i18n.DateTimeSymbols_ky', 'goog.i18n.DateTimeSymbols_ln', 'goog.i18n.DateTimeSymbols_lo', 'goog.i18n.DateTimeSymbols_lt', 'goog.i18n.DateTimeSymbols_lv', 'goog.i18n.DateTimeSymbols_mk', 'goog.i18n.DateTimeSymbols_ml', 'goog.i18n.DateTimeSymbols_mn', 'goog.i18n.DateTimeSymbols_mo', 'goog.i18n.DateTimeSymbols_mr', 'goog.i18n.DateTimeSymbols_ms', 'goog.i18n.DateTimeSymbols_mt', 'goog.i18n.DateTimeSymbols_my', 'goog.i18n.DateTimeSymbols_nb', 'goog.i18n.DateTimeSymbols_ne', 'goog.i18n.DateTimeSymbols_nl', 'goog.i18n.DateTimeSymbols_no', 'goog.i18n.DateTimeSymbols_no_NO', 'goog.i18n.DateTimeSymbols_or', 'goog.i18n.DateTimeSymbols_pa', 'goog.i18n.DateTimeSymbols_pl', 'goog.i18n.DateTimeSymbols_pt', 'goog.i18n.DateTimeSymbols_pt_BR', 'goog.i18n.DateTimeSymbols_pt_PT', 'goog.i18n.DateTimeSymbols_ro', 'goog.i18n.DateTimeSymbols_ru', 'goog.i18n.DateTimeSymbols_sh', 'goog.i18n.DateTimeSymbols_si', 'goog.i18n.DateTimeSymbols_sk', 'goog.i18n.DateTimeSymbols_sl', 'goog.i18n.DateTimeSymbols_sq', 'goog.i18n.DateTimeSymbols_sr', 'goog.i18n.DateTimeSymbols_sr_Latn', 'goog.i18n.DateTimeSymbols_sv', 'goog.i18n.DateTimeSymbols_sw', 'goog.i18n.DateTimeSymbols_ta', 'goog.i18n.DateTimeSymbols_te', 'goog.i18n.DateTimeSymbols_th', 'goog.i18n.DateTimeSymbols_tl', 'goog.i18n.DateTimeSymbols_tr', 'goog.i18n.DateTimeSymbols_uk', 'goog.i18n.DateTimeSymbols_ur', 'goog.i18n.DateTimeSymbols_uz', 'goog.i18n.DateTimeSymbols_vi', 'goog.i18n.DateTimeSymbols_zh', 'goog.i18n.DateTimeSymbols_zh_CN', 'goog.i18n.DateTimeSymbols_zh_HK', 'goog.i18n.DateTimeSymbols_zh_TW', 'goog.i18n.DateTimeSymbols_zu'], [], {});\ngoog.addDependency('i18n/datetimesymbolsext.js', ['goog.i18n.DateTimeSymbolsExt', 'goog.i18n.DateTimeSymbols_af_NA', 'goog.i18n.DateTimeSymbols_af_ZA', 'goog.i18n.DateTimeSymbols_agq', 'goog.i18n.DateTimeSymbols_agq_CM', 'goog.i18n.DateTimeSymbols_ak', 'goog.i18n.DateTimeSymbols_ak_GH', 'goog.i18n.DateTimeSymbols_am_ET', 'goog.i18n.DateTimeSymbols_ar_001', 'goog.i18n.DateTimeSymbols_ar_AE', 'goog.i18n.DateTimeSymbols_ar_BH', 'goog.i18n.DateTimeSymbols_ar_DJ', 'goog.i18n.DateTimeSymbols_ar_EH', 'goog.i18n.DateTimeSymbols_ar_ER', 'goog.i18n.DateTimeSymbols_ar_IL', 'goog.i18n.DateTimeSymbols_ar_IQ', 'goog.i18n.DateTimeSymbols_ar_JO', 'goog.i18n.DateTimeSymbols_ar_KM', 'goog.i18n.DateTimeSymbols_ar_KW', 'goog.i18n.DateTimeSymbols_ar_LB', 'goog.i18n.DateTimeSymbols_ar_LY', 'goog.i18n.DateTimeSymbols_ar_MA', 'goog.i18n.DateTimeSymbols_ar_MR', 'goog.i18n.DateTimeSymbols_ar_OM', 'goog.i18n.DateTimeSymbols_ar_PS', 'goog.i18n.DateTimeSymbols_ar_QA', 'goog.i18n.DateTimeSymbols_ar_SA', 'goog.i18n.DateTimeSymbols_ar_SD', 'goog.i18n.DateTimeSymbols_ar_SO', 'goog.i18n.DateTimeSymbols_ar_SS', 'goog.i18n.DateTimeSymbols_ar_SY', 'goog.i18n.DateTimeSymbols_ar_TD', 'goog.i18n.DateTimeSymbols_ar_TN', 'goog.i18n.DateTimeSymbols_ar_XB', 'goog.i18n.DateTimeSymbols_ar_YE', 'goog.i18n.DateTimeSymbols_as', 'goog.i18n.DateTimeSymbols_as_IN', 'goog.i18n.DateTimeSymbols_asa', 'goog.i18n.DateTimeSymbols_asa_TZ', 'goog.i18n.DateTimeSymbols_ast', 'goog.i18n.DateTimeSymbols_ast_ES', 'goog.i18n.DateTimeSymbols_az_Cyrl', 'goog.i18n.DateTimeSymbols_az_Cyrl_AZ', 'goog.i18n.DateTimeSymbols_az_Latn', 'goog.i18n.DateTimeSymbols_az_Latn_AZ', 'goog.i18n.DateTimeSymbols_bas', 'goog.i18n.DateTimeSymbols_bas_CM', 'goog.i18n.DateTimeSymbols_be_BY', 'goog.i18n.DateTimeSymbols_bem', 'goog.i18n.DateTimeSymbols_bem_ZM', 'goog.i18n.DateTimeSymbols_bez', 'goog.i18n.DateTimeSymbols_bez_TZ', 'goog.i18n.DateTimeSymbols_bg_BG', 'goog.i18n.DateTimeSymbols_bm', 'goog.i18n.DateTimeSymbols_bm_ML', 'goog.i18n.DateTimeSymbols_bn_BD', 'goog.i18n.DateTimeSymbols_bn_IN', 'goog.i18n.DateTimeSymbols_bo', 'goog.i18n.DateTimeSymbols_bo_CN', 'goog.i18n.DateTimeSymbols_bo_IN', 'goog.i18n.DateTimeSymbols_br_FR', 'goog.i18n.DateTimeSymbols_brx', 'goog.i18n.DateTimeSymbols_brx_IN', 'goog.i18n.DateTimeSymbols_bs_Cyrl', 'goog.i18n.DateTimeSymbols_bs_Cyrl_BA', 'goog.i18n.DateTimeSymbols_bs_Latn', 'goog.i18n.DateTimeSymbols_bs_Latn_BA', 'goog.i18n.DateTimeSymbols_ca_AD', 'goog.i18n.DateTimeSymbols_ca_ES', 'goog.i18n.DateTimeSymbols_ca_FR', 'goog.i18n.DateTimeSymbols_ca_IT', 'goog.i18n.DateTimeSymbols_ccp', 'goog.i18n.DateTimeSymbols_ccp_BD', 'goog.i18n.DateTimeSymbols_ccp_IN', 'goog.i18n.DateTimeSymbols_ce', 'goog.i18n.DateTimeSymbols_ce_RU', 'goog.i18n.DateTimeSymbols_ceb', 'goog.i18n.DateTimeSymbols_ceb_PH', 'goog.i18n.DateTimeSymbols_cgg', 'goog.i18n.DateTimeSymbols_cgg_UG', 'goog.i18n.DateTimeSymbols_chr_US', 'goog.i18n.DateTimeSymbols_ckb', 'goog.i18n.DateTimeSymbols_ckb_IQ', 'goog.i18n.DateTimeSymbols_ckb_IR', 'goog.i18n.DateTimeSymbols_cs_CZ', 'goog.i18n.DateTimeSymbols_cy_GB', 'goog.i18n.DateTimeSymbols_da_DK', 'goog.i18n.DateTimeSymbols_da_GL', 'goog.i18n.DateTimeSymbols_dav', 'goog.i18n.DateTimeSymbols_dav_KE', 'goog.i18n.DateTimeSymbols_de_BE', 'goog.i18n.DateTimeSymbols_de_DE', 'goog.i18n.DateTimeSymbols_de_IT', 'goog.i18n.DateTimeSymbols_de_LI', 'goog.i18n.DateTimeSymbols_de_LU', 'goog.i18n.DateTimeSymbols_dje', 'goog.i18n.DateTimeSymbols_dje_NE', 'goog.i18n.DateTimeSymbols_dsb', 'goog.i18n.DateTimeSymbols_dsb_DE', 'goog.i18n.DateTimeSymbols_dua', 'goog.i18n.DateTimeSymbols_dua_CM', 'goog.i18n.DateTimeSymbols_dyo', 'goog.i18n.DateTimeSymbols_dyo_SN', 'goog.i18n.DateTimeSymbols_dz', 'goog.i18n.DateTimeSymbols_dz_BT', 'goog.i18n.DateTimeSymbols_ebu', 'goog.i18n.DateTimeSymbols_ebu_KE', 'goog.i18n.DateTimeSymbols_ee', 'goog.i18n.DateTimeSymbols_ee_GH', 'goog.i18n.DateTimeSymbols_ee_TG', 'goog.i18n.DateTimeSymbols_el_CY', 'goog.i18n.DateTimeSymbols_el_GR', 'goog.i18n.DateTimeSymbols_en_001', 'goog.i18n.DateTimeSymbols_en_150', 'goog.i18n.DateTimeSymbols_en_AE', 'goog.i18n.DateTimeSymbols_en_AG', 'goog.i18n.DateTimeSymbols_en_AI', 'goog.i18n.DateTimeSymbols_en_AS', 'goog.i18n.DateTimeSymbols_en_AT', 'goog.i18n.DateTimeSymbols_en_BB', 'goog.i18n.DateTimeSymbols_en_BE', 'goog.i18n.DateTimeSymbols_en_BI', 'goog.i18n.DateTimeSymbols_en_BM', 'goog.i18n.DateTimeSymbols_en_BS', 'goog.i18n.DateTimeSymbols_en_BW', 'goog.i18n.DateTimeSymbols_en_BZ', 'goog.i18n.DateTimeSymbols_en_CC', 'goog.i18n.DateTimeSymbols_en_CH', 'goog.i18n.DateTimeSymbols_en_CK', 'goog.i18n.DateTimeSymbols_en_CM', 'goog.i18n.DateTimeSymbols_en_CX', 'goog.i18n.DateTimeSymbols_en_CY', 'goog.i18n.DateTimeSymbols_en_DE', 'goog.i18n.DateTimeSymbols_en_DG', 'goog.i18n.DateTimeSymbols_en_DK', 'goog.i18n.DateTimeSymbols_en_DM', 'goog.i18n.DateTimeSymbols_en_ER', 'goog.i18n.DateTimeSymbols_en_FI', 'goog.i18n.DateTimeSymbols_en_FJ', 'goog.i18n.DateTimeSymbols_en_FK', 'goog.i18n.DateTimeSymbols_en_FM', 'goog.i18n.DateTimeSymbols_en_GD', 'goog.i18n.DateTimeSymbols_en_GG', 'goog.i18n.DateTimeSymbols_en_GH', 'goog.i18n.DateTimeSymbols_en_GI', 'goog.i18n.DateTimeSymbols_en_GM', 'goog.i18n.DateTimeSymbols_en_GU', 'goog.i18n.DateTimeSymbols_en_GY', 'goog.i18n.DateTimeSymbols_en_HK', 'goog.i18n.DateTimeSymbols_en_IL', 'goog.i18n.DateTimeSymbols_en_IM', 'goog.i18n.DateTimeSymbols_en_IO', 'goog.i18n.DateTimeSymbols_en_JE', 'goog.i18n.DateTimeSymbols_en_JM', 'goog.i18n.DateTimeSymbols_en_KE', 'goog.i18n.DateTimeSymbols_en_KI', 'goog.i18n.DateTimeSymbols_en_KN', 'goog.i18n.DateTimeSymbols_en_KY', 'goog.i18n.DateTimeSymbols_en_LC', 'goog.i18n.DateTimeSymbols_en_LR', 'goog.i18n.DateTimeSymbols_en_LS', 'goog.i18n.DateTimeSymbols_en_MG', 'goog.i18n.DateTimeSymbols_en_MH', 'goog.i18n.DateTimeSymbols_en_MO', 'goog.i18n.DateTimeSymbols_en_MP', 'goog.i18n.DateTimeSymbols_en_MS', 'goog.i18n.DateTimeSymbols_en_MT', 'goog.i18n.DateTimeSymbols_en_MU', 'goog.i18n.DateTimeSymbols_en_MW', 'goog.i18n.DateTimeSymbols_en_MY', 'goog.i18n.DateTimeSymbols_en_NA', 'goog.i18n.DateTimeSymbols_en_NF', 'goog.i18n.DateTimeSymbols_en_NG', 'goog.i18n.DateTimeSymbols_en_NL', 'goog.i18n.DateTimeSymbols_en_NR', 'goog.i18n.DateTimeSymbols_en_NU', 'goog.i18n.DateTimeSymbols_en_NZ', 'goog.i18n.DateTimeSymbols_en_PG', 'goog.i18n.DateTimeSymbols_en_PH', 'goog.i18n.DateTimeSymbols_en_PK', 'goog.i18n.DateTimeSymbols_en_PN', 'goog.i18n.DateTimeSymbols_en_PR', 'goog.i18n.DateTimeSymbols_en_PW', 'goog.i18n.DateTimeSymbols_en_RW', 'goog.i18n.DateTimeSymbols_en_SB', 'goog.i18n.DateTimeSymbols_en_SC', 'goog.i18n.DateTimeSymbols_en_SD', 'goog.i18n.DateTimeSymbols_en_SE', 'goog.i18n.DateTimeSymbols_en_SH', 'goog.i18n.DateTimeSymbols_en_SI', 'goog.i18n.DateTimeSymbols_en_SL', 'goog.i18n.DateTimeSymbols_en_SS', 'goog.i18n.DateTimeSymbols_en_SX', 'goog.i18n.DateTimeSymbols_en_SZ', 'goog.i18n.DateTimeSymbols_en_TC', 'goog.i18n.DateTimeSymbols_en_TK', 'goog.i18n.DateTimeSymbols_en_TO', 'goog.i18n.DateTimeSymbols_en_TT', 'goog.i18n.DateTimeSymbols_en_TV', 'goog.i18n.DateTimeSymbols_en_TZ', 'goog.i18n.DateTimeSymbols_en_UG', 'goog.i18n.DateTimeSymbols_en_UM', 'goog.i18n.DateTimeSymbols_en_US_POSIX', 'goog.i18n.DateTimeSymbols_en_VC', 'goog.i18n.DateTimeSymbols_en_VG', 'goog.i18n.DateTimeSymbols_en_VI', 'goog.i18n.DateTimeSymbols_en_VU', 'goog.i18n.DateTimeSymbols_en_WS', 'goog.i18n.DateTimeSymbols_en_XA', 'goog.i18n.DateTimeSymbols_en_ZM', 'goog.i18n.DateTimeSymbols_en_ZW', 'goog.i18n.DateTimeSymbols_eo', 'goog.i18n.DateTimeSymbols_eo_001', 'goog.i18n.DateTimeSymbols_es_AR', 'goog.i18n.DateTimeSymbols_es_BO', 'goog.i18n.DateTimeSymbols_es_BR', 'goog.i18n.DateTimeSymbols_es_BZ', 'goog.i18n.DateTimeSymbols_es_CL', 'goog.i18n.DateTimeSymbols_es_CO', 'goog.i18n.DateTimeSymbols_es_CR', 'goog.i18n.DateTimeSymbols_es_CU', 'goog.i18n.DateTimeSymbols_es_DO', 'goog.i18n.DateTimeSymbols_es_EA', 'goog.i18n.DateTimeSymbols_es_EC', 'goog.i18n.DateTimeSymbols_es_GQ', 'goog.i18n.DateTimeSymbols_es_GT', 'goog.i18n.DateTimeSymbols_es_HN', 'goog.i18n.DateTimeSymbols_es_IC', 'goog.i18n.DateTimeSymbols_es_NI', 'goog.i18n.DateTimeSymbols_es_PA', 'goog.i18n.DateTimeSymbols_es_PE', 'goog.i18n.DateTimeSymbols_es_PH', 'goog.i18n.DateTimeSymbols_es_PR', 'goog.i18n.DateTimeSymbols_es_PY', 'goog.i18n.DateTimeSymbols_es_SV', 'goog.i18n.DateTimeSymbols_es_UY', 'goog.i18n.DateTimeSymbols_es_VE', 'goog.i18n.DateTimeSymbols_et_EE', 'goog.i18n.DateTimeSymbols_eu_ES', 'goog.i18n.DateTimeSymbols_ewo', 'goog.i18n.DateTimeSymbols_ewo_CM', 'goog.i18n.DateTimeSymbols_fa_AF', 'goog.i18n.DateTimeSymbols_fa_IR', 'goog.i18n.DateTimeSymbols_ff', 'goog.i18n.DateTimeSymbols_ff_Latn', 'goog.i18n.DateTimeSymbols_ff_Latn_BF', 'goog.i18n.DateTimeSymbols_ff_Latn_CM', 'goog.i18n.DateTimeSymbols_ff_Latn_GH', 'goog.i18n.DateTimeSymbols_ff_Latn_GM', 'goog.i18n.DateTimeSymbols_ff_Latn_GN', 'goog.i18n.DateTimeSymbols_ff_Latn_GW', 'goog.i18n.DateTimeSymbols_ff_Latn_LR', 'goog.i18n.DateTimeSymbols_ff_Latn_MR', 'goog.i18n.DateTimeSymbols_ff_Latn_NE', 'goog.i18n.DateTimeSymbols_ff_Latn_NG', 'goog.i18n.DateTimeSymbols_ff_Latn_SL', 'goog.i18n.DateTimeSymbols_ff_Latn_SN', 'goog.i18n.DateTimeSymbols_fi_FI', 'goog.i18n.DateTimeSymbols_fil_PH', 'goog.i18n.DateTimeSymbols_fo', 'goog.i18n.DateTimeSymbols_fo_DK', 'goog.i18n.DateTimeSymbols_fo_FO', 'goog.i18n.DateTimeSymbols_fr_BE', 'goog.i18n.DateTimeSymbols_fr_BF', 'goog.i18n.DateTimeSymbols_fr_BI', 'goog.i18n.DateTimeSymbols_fr_BJ', 'goog.i18n.DateTimeSymbols_fr_BL', 'goog.i18n.DateTimeSymbols_fr_CD', 'goog.i18n.DateTimeSymbols_fr_CF', 'goog.i18n.DateTimeSymbols_fr_CG', 'goog.i18n.DateTimeSymbols_fr_CH', 'goog.i18n.DateTimeSymbols_fr_CI', 'goog.i18n.DateTimeSymbols_fr_CM', 'goog.i18n.DateTimeSymbols_fr_DJ', 'goog.i18n.DateTimeSymbols_fr_DZ', 'goog.i18n.DateTimeSymbols_fr_FR', 'goog.i18n.DateTimeSymbols_fr_GA', 'goog.i18n.DateTimeSymbols_fr_GF', 'goog.i18n.DateTimeSymbols_fr_GN', 'goog.i18n.DateTimeSymbols_fr_GP', 'goog.i18n.DateTimeSymbols_fr_GQ', 'goog.i18n.DateTimeSymbols_fr_HT', 'goog.i18n.DateTimeSymbols_fr_KM', 'goog.i18n.DateTimeSymbols_fr_LU', 'goog.i18n.DateTimeSymbols_fr_MA', 'goog.i18n.DateTimeSymbols_fr_MC', 'goog.i18n.DateTimeSymbols_fr_MF', 'goog.i18n.DateTimeSymbols_fr_MG', 'goog.i18n.DateTimeSymbols_fr_ML', 'goog.i18n.DateTimeSymbols_fr_MQ', 'goog.i18n.DateTimeSymbols_fr_MR', 'goog.i18n.DateTimeSymbols_fr_MU', 'goog.i18n.DateTimeSymbols_fr_NC', 'goog.i18n.DateTimeSymbols_fr_NE', 'goog.i18n.DateTimeSymbols_fr_PF', 'goog.i18n.DateTimeSymbols_fr_PM', 'goog.i18n.DateTimeSymbols_fr_RE', 'goog.i18n.DateTimeSymbols_fr_RW', 'goog.i18n.DateTimeSymbols_fr_SC', 'goog.i18n.DateTimeSymbols_fr_SN', 'goog.i18n.DateTimeSymbols_fr_SY', 'goog.i18n.DateTimeSymbols_fr_TD', 'goog.i18n.DateTimeSymbols_fr_TG', 'goog.i18n.DateTimeSymbols_fr_TN', 'goog.i18n.DateTimeSymbols_fr_VU', 'goog.i18n.DateTimeSymbols_fr_WF', 'goog.i18n.DateTimeSymbols_fr_YT', 'goog.i18n.DateTimeSymbols_fur', 'goog.i18n.DateTimeSymbols_fur_IT', 'goog.i18n.DateTimeSymbols_fy', 'goog.i18n.DateTimeSymbols_fy_NL', 'goog.i18n.DateTimeSymbols_ga_IE', 'goog.i18n.DateTimeSymbols_gd', 'goog.i18n.DateTimeSymbols_gd_GB', 'goog.i18n.DateTimeSymbols_gl_ES', 'goog.i18n.DateTimeSymbols_gsw_CH', 'goog.i18n.DateTimeSymbols_gsw_FR', 'goog.i18n.DateTimeSymbols_gsw_LI', 'goog.i18n.DateTimeSymbols_gu_IN', 'goog.i18n.DateTimeSymbols_guz', 'goog.i18n.DateTimeSymbols_guz_KE', 'goog.i18n.DateTimeSymbols_gv', 'goog.i18n.DateTimeSymbols_gv_IM', 'goog.i18n.DateTimeSymbols_ha', 'goog.i18n.DateTimeSymbols_ha_GH', 'goog.i18n.DateTimeSymbols_ha_NE', 'goog.i18n.DateTimeSymbols_ha_NG', 'goog.i18n.DateTimeSymbols_haw_US', 'goog.i18n.DateTimeSymbols_he_IL', 'goog.i18n.DateTimeSymbols_hi_IN', 'goog.i18n.DateTimeSymbols_hr_BA', 'goog.i18n.DateTimeSymbols_hr_HR', 'goog.i18n.DateTimeSymbols_hsb', 'goog.i18n.DateTimeSymbols_hsb_DE', 'goog.i18n.DateTimeSymbols_hu_HU', 'goog.i18n.DateTimeSymbols_hy_AM', 'goog.i18n.DateTimeSymbols_ia', 'goog.i18n.DateTimeSymbols_ia_001', 'goog.i18n.DateTimeSymbols_id_ID', 'goog.i18n.DateTimeSymbols_ig', 'goog.i18n.DateTimeSymbols_ig_NG', 'goog.i18n.DateTimeSymbols_ii', 'goog.i18n.DateTimeSymbols_ii_CN', 'goog.i18n.DateTimeSymbols_is_IS', 'goog.i18n.DateTimeSymbols_it_CH', 'goog.i18n.DateTimeSymbols_it_IT', 'goog.i18n.DateTimeSymbols_it_SM', 'goog.i18n.DateTimeSymbols_it_VA', 'goog.i18n.DateTimeSymbols_ja_JP', 'goog.i18n.DateTimeSymbols_jgo', 'goog.i18n.DateTimeSymbols_jgo_CM', 'goog.i18n.DateTimeSymbols_jmc', 'goog.i18n.DateTimeSymbols_jmc_TZ', 'goog.i18n.DateTimeSymbols_jv', 'goog.i18n.DateTimeSymbols_jv_ID', 'goog.i18n.DateTimeSymbols_ka_GE', 'goog.i18n.DateTimeSymbols_kab', 'goog.i18n.DateTimeSymbols_kab_DZ', 'goog.i18n.DateTimeSymbols_kam', 'goog.i18n.DateTimeSymbols_kam_KE', 'goog.i18n.DateTimeSymbols_kde', 'goog.i18n.DateTimeSymbols_kde_TZ', 'goog.i18n.DateTimeSymbols_kea', 'goog.i18n.DateTimeSymbols_kea_CV', 'goog.i18n.DateTimeSymbols_khq', 'goog.i18n.DateTimeSymbols_khq_ML', 'goog.i18n.DateTimeSymbols_ki', 'goog.i18n.DateTimeSymbols_ki_KE', 'goog.i18n.DateTimeSymbols_kk_KZ', 'goog.i18n.DateTimeSymbols_kkj', 'goog.i18n.DateTimeSymbols_kkj_CM', 'goog.i18n.DateTimeSymbols_kl', 'goog.i18n.DateTimeSymbols_kl_GL', 'goog.i18n.DateTimeSymbols_kln', 'goog.i18n.DateTimeSymbols_kln_KE', 'goog.i18n.DateTimeSymbols_km_KH', 'goog.i18n.DateTimeSymbols_kn_IN', 'goog.i18n.DateTimeSymbols_ko_KP', 'goog.i18n.DateTimeSymbols_ko_KR', 'goog.i18n.DateTimeSymbols_kok', 'goog.i18n.DateTimeSymbols_kok_IN', 'goog.i18n.DateTimeSymbols_ks', 'goog.i18n.DateTimeSymbols_ks_IN', 'goog.i18n.DateTimeSymbols_ksb', 'goog.i18n.DateTimeSymbols_ksb_TZ', 'goog.i18n.DateTimeSymbols_ksf', 'goog.i18n.DateTimeSymbols_ksf_CM', 'goog.i18n.DateTimeSymbols_ksh', 'goog.i18n.DateTimeSymbols_ksh_DE', 'goog.i18n.DateTimeSymbols_ku', 'goog.i18n.DateTimeSymbols_ku_TR', 'goog.i18n.DateTimeSymbols_kw', 'goog.i18n.DateTimeSymbols_kw_GB', 'goog.i18n.DateTimeSymbols_ky_KG', 'goog.i18n.DateTimeSymbols_lag', 'goog.i18n.DateTimeSymbols_lag_TZ', 'goog.i18n.DateTimeSymbols_lb', 'goog.i18n.DateTimeSymbols_lb_LU', 'goog.i18n.DateTimeSymbols_lg', 'goog.i18n.DateTimeSymbols_lg_UG', 'goog.i18n.DateTimeSymbols_lkt', 'goog.i18n.DateTimeSymbols_lkt_US', 'goog.i18n.DateTimeSymbols_ln_AO', 'goog.i18n.DateTimeSymbols_ln_CD', 'goog.i18n.DateTimeSymbols_ln_CF', 'goog.i18n.DateTimeSymbols_ln_CG', 'goog.i18n.DateTimeSymbols_lo_LA', 'goog.i18n.DateTimeSymbols_lrc', 'goog.i18n.DateTimeSymbols_lrc_IQ', 'goog.i18n.DateTimeSymbols_lrc_IR', 'goog.i18n.DateTimeSymbols_lt_LT', 'goog.i18n.DateTimeSymbols_lu', 'goog.i18n.DateTimeSymbols_lu_CD', 'goog.i18n.DateTimeSymbols_luo', 'goog.i18n.DateTimeSymbols_luo_KE', 'goog.i18n.DateTimeSymbols_luy', 'goog.i18n.DateTimeSymbols_luy_KE', 'goog.i18n.DateTimeSymbols_lv_LV', 'goog.i18n.DateTimeSymbols_mas', 'goog.i18n.DateTimeSymbols_mas_KE', 'goog.i18n.DateTimeSymbols_mas_TZ', 'goog.i18n.DateTimeSymbols_mer', 'goog.i18n.DateTimeSymbols_mer_KE', 'goog.i18n.DateTimeSymbols_mfe', 'goog.i18n.DateTimeSymbols_mfe_MU', 'goog.i18n.DateTimeSymbols_mg', 'goog.i18n.DateTimeSymbols_mg_MG', 'goog.i18n.DateTimeSymbols_mgh', 'goog.i18n.DateTimeSymbols_mgh_MZ', 'goog.i18n.DateTimeSymbols_mgo', 'goog.i18n.DateTimeSymbols_mgo_CM', 'goog.i18n.DateTimeSymbols_mi', 'goog.i18n.DateTimeSymbols_mi_NZ', 'goog.i18n.DateTimeSymbols_mk_MK', 'goog.i18n.DateTimeSymbols_ml_IN', 'goog.i18n.DateTimeSymbols_mn_MN', 'goog.i18n.DateTimeSymbols_mr_IN', 'goog.i18n.DateTimeSymbols_ms_BN', 'goog.i18n.DateTimeSymbols_ms_MY', 'goog.i18n.DateTimeSymbols_ms_SG', 'goog.i18n.DateTimeSymbols_mt_MT', 'goog.i18n.DateTimeSymbols_mua', 'goog.i18n.DateTimeSymbols_mua_CM', 'goog.i18n.DateTimeSymbols_my_MM', 'goog.i18n.DateTimeSymbols_mzn', 'goog.i18n.DateTimeSymbols_mzn_IR', 'goog.i18n.DateTimeSymbols_naq', 'goog.i18n.DateTimeSymbols_naq_NA', 'goog.i18n.DateTimeSymbols_nb_NO', 'goog.i18n.DateTimeSymbols_nb_SJ', 'goog.i18n.DateTimeSymbols_nd', 'goog.i18n.DateTimeSymbols_nd_ZW', 'goog.i18n.DateTimeSymbols_nds', 'goog.i18n.DateTimeSymbols_nds_DE', 'goog.i18n.DateTimeSymbols_nds_NL', 'goog.i18n.DateTimeSymbols_ne_IN', 'goog.i18n.DateTimeSymbols_ne_NP', 'goog.i18n.DateTimeSymbols_nl_AW', 'goog.i18n.DateTimeSymbols_nl_BE', 'goog.i18n.DateTimeSymbols_nl_BQ', 'goog.i18n.DateTimeSymbols_nl_CW', 'goog.i18n.DateTimeSymbols_nl_NL', 'goog.i18n.DateTimeSymbols_nl_SR', 'goog.i18n.DateTimeSymbols_nl_SX', 'goog.i18n.DateTimeSymbols_nmg', 'goog.i18n.DateTimeSymbols_nmg_CM', 'goog.i18n.DateTimeSymbols_nn', 'goog.i18n.DateTimeSymbols_nn_NO', 'goog.i18n.DateTimeSymbols_nnh', 'goog.i18n.DateTimeSymbols_nnh_CM', 'goog.i18n.DateTimeSymbols_nus', 'goog.i18n.DateTimeSymbols_nus_SS', 'goog.i18n.DateTimeSymbols_nyn', 'goog.i18n.DateTimeSymbols_nyn_UG', 'goog.i18n.DateTimeSymbols_om', 'goog.i18n.DateTimeSymbols_om_ET', 'goog.i18n.DateTimeSymbols_om_KE', 'goog.i18n.DateTimeSymbols_or_IN', 'goog.i18n.DateTimeSymbols_os', 'goog.i18n.DateTimeSymbols_os_GE', 'goog.i18n.DateTimeSymbols_os_RU', 'goog.i18n.DateTimeSymbols_pa_Arab', 'goog.i18n.DateTimeSymbols_pa_Arab_PK', 'goog.i18n.DateTimeSymbols_pa_Guru', 'goog.i18n.DateTimeSymbols_pa_Guru_IN', 'goog.i18n.DateTimeSymbols_pl_PL', 'goog.i18n.DateTimeSymbols_ps', 'goog.i18n.DateTimeSymbols_ps_AF', 'goog.i18n.DateTimeSymbols_ps_PK', 'goog.i18n.DateTimeSymbols_pt_AO', 'goog.i18n.DateTimeSymbols_pt_CH', 'goog.i18n.DateTimeSymbols_pt_CV', 'goog.i18n.DateTimeSymbols_pt_GQ', 'goog.i18n.DateTimeSymbols_pt_GW', 'goog.i18n.DateTimeSymbols_pt_LU', 'goog.i18n.DateTimeSymbols_pt_MO', 'goog.i18n.DateTimeSymbols_pt_MZ', 'goog.i18n.DateTimeSymbols_pt_ST', 'goog.i18n.DateTimeSymbols_pt_TL', 'goog.i18n.DateTimeSymbols_qu', 'goog.i18n.DateTimeSymbols_qu_BO', 'goog.i18n.DateTimeSymbols_qu_EC', 'goog.i18n.DateTimeSymbols_qu_PE', 'goog.i18n.DateTimeSymbols_rm', 'goog.i18n.DateTimeSymbols_rm_CH', 'goog.i18n.DateTimeSymbols_rn', 'goog.i18n.DateTimeSymbols_rn_BI', 'goog.i18n.DateTimeSymbols_ro_MD', 'goog.i18n.DateTimeSymbols_ro_RO', 'goog.i18n.DateTimeSymbols_rof', 'goog.i18n.DateTimeSymbols_rof_TZ', 'goog.i18n.DateTimeSymbols_ru_BY', 'goog.i18n.DateTimeSymbols_ru_KG', 'goog.i18n.DateTimeSymbols_ru_KZ', 'goog.i18n.DateTimeSymbols_ru_MD', 'goog.i18n.DateTimeSymbols_ru_RU', 'goog.i18n.DateTimeSymbols_ru_UA', 'goog.i18n.DateTimeSymbols_rw', 'goog.i18n.DateTimeSymbols_rw_RW', 'goog.i18n.DateTimeSymbols_rwk', 'goog.i18n.DateTimeSymbols_rwk_TZ', 'goog.i18n.DateTimeSymbols_sah', 'goog.i18n.DateTimeSymbols_sah_RU', 'goog.i18n.DateTimeSymbols_saq', 'goog.i18n.DateTimeSymbols_saq_KE', 'goog.i18n.DateTimeSymbols_sbp', 'goog.i18n.DateTimeSymbols_sbp_TZ', 'goog.i18n.DateTimeSymbols_sd', 'goog.i18n.DateTimeSymbols_sd_PK', 'goog.i18n.DateTimeSymbols_se', 'goog.i18n.DateTimeSymbols_se_FI', 'goog.i18n.DateTimeSymbols_se_NO', 'goog.i18n.DateTimeSymbols_se_SE', 'goog.i18n.DateTimeSymbols_seh', 'goog.i18n.DateTimeSymbols_seh_MZ', 'goog.i18n.DateTimeSymbols_ses', 'goog.i18n.DateTimeSymbols_ses_ML', 'goog.i18n.DateTimeSymbols_sg', 'goog.i18n.DateTimeSymbols_sg_CF', 'goog.i18n.DateTimeSymbols_shi', 'goog.i18n.DateTimeSymbols_shi_Latn', 'goog.i18n.DateTimeSymbols_shi_Latn_MA', 'goog.i18n.DateTimeSymbols_shi_Tfng', 'goog.i18n.DateTimeSymbols_shi_Tfng_MA', 'goog.i18n.DateTimeSymbols_si_LK', 'goog.i18n.DateTimeSymbols_sk_SK', 'goog.i18n.DateTimeSymbols_sl_SI', 'goog.i18n.DateTimeSymbols_smn', 'goog.i18n.DateTimeSymbols_smn_FI', 'goog.i18n.DateTimeSymbols_sn', 'goog.i18n.DateTimeSymbols_sn_ZW', 'goog.i18n.DateTimeSymbols_so', 'goog.i18n.DateTimeSymbols_so_DJ', 'goog.i18n.DateTimeSymbols_so_ET', 'goog.i18n.DateTimeSymbols_so_KE', 'goog.i18n.DateTimeSymbols_so_SO', 'goog.i18n.DateTimeSymbols_sq_AL', 'goog.i18n.DateTimeSymbols_sq_MK', 'goog.i18n.DateTimeSymbols_sq_XK', 'goog.i18n.DateTimeSymbols_sr_Cyrl', 'goog.i18n.DateTimeSymbols_sr_Cyrl_BA', 'goog.i18n.DateTimeSymbols_sr_Cyrl_ME', 'goog.i18n.DateTimeSymbols_sr_Cyrl_RS', 'goog.i18n.DateTimeSymbols_sr_Cyrl_XK', 'goog.i18n.DateTimeSymbols_sr_Latn_BA', 'goog.i18n.DateTimeSymbols_sr_Latn_ME', 'goog.i18n.DateTimeSymbols_sr_Latn_RS', 'goog.i18n.DateTimeSymbols_sr_Latn_XK', 'goog.i18n.DateTimeSymbols_sv_AX', 'goog.i18n.DateTimeSymbols_sv_FI', 'goog.i18n.DateTimeSymbols_sv_SE', 'goog.i18n.DateTimeSymbols_sw_CD', 'goog.i18n.DateTimeSymbols_sw_KE', 'goog.i18n.DateTimeSymbols_sw_TZ', 'goog.i18n.DateTimeSymbols_sw_UG', 'goog.i18n.DateTimeSymbols_ta_IN', 'goog.i18n.DateTimeSymbols_ta_LK', 'goog.i18n.DateTimeSymbols_ta_MY', 'goog.i18n.DateTimeSymbols_ta_SG', 'goog.i18n.DateTimeSymbols_te_IN', 'goog.i18n.DateTimeSymbols_teo', 'goog.i18n.DateTimeSymbols_teo_KE', 'goog.i18n.DateTimeSymbols_teo_UG', 'goog.i18n.DateTimeSymbols_tg', 'goog.i18n.DateTimeSymbols_tg_TJ', 'goog.i18n.DateTimeSymbols_th_TH', 'goog.i18n.DateTimeSymbols_ti', 'goog.i18n.DateTimeSymbols_ti_ER', 'goog.i18n.DateTimeSymbols_ti_ET', 'goog.i18n.DateTimeSymbols_tk', 'goog.i18n.DateTimeSymbols_tk_TM', 'goog.i18n.DateTimeSymbols_to', 'goog.i18n.DateTimeSymbols_to_TO', 'goog.i18n.DateTimeSymbols_tr_CY', 'goog.i18n.DateTimeSymbols_tr_TR', 'goog.i18n.DateTimeSymbols_tt', 'goog.i18n.DateTimeSymbols_tt_RU', 'goog.i18n.DateTimeSymbols_twq', 'goog.i18n.DateTimeSymbols_twq_NE', 'goog.i18n.DateTimeSymbols_tzm', 'goog.i18n.DateTimeSymbols_tzm_MA', 'goog.i18n.DateTimeSymbols_ug', 'goog.i18n.DateTimeSymbols_ug_CN', 'goog.i18n.DateTimeSymbols_uk_UA', 'goog.i18n.DateTimeSymbols_ur_IN', 'goog.i18n.DateTimeSymbols_ur_PK', 'goog.i18n.DateTimeSymbols_uz_Arab', 'goog.i18n.DateTimeSymbols_uz_Arab_AF', 'goog.i18n.DateTimeSymbols_uz_Cyrl', 'goog.i18n.DateTimeSymbols_uz_Cyrl_UZ', 'goog.i18n.DateTimeSymbols_uz_Latn', 'goog.i18n.DateTimeSymbols_uz_Latn_UZ', 'goog.i18n.DateTimeSymbols_vai', 'goog.i18n.DateTimeSymbols_vai_Latn', 'goog.i18n.DateTimeSymbols_vai_Latn_LR', 'goog.i18n.DateTimeSymbols_vai_Vaii', 'goog.i18n.DateTimeSymbols_vai_Vaii_LR', 'goog.i18n.DateTimeSymbols_vi_VN', 'goog.i18n.DateTimeSymbols_vun', 'goog.i18n.DateTimeSymbols_vun_TZ', 'goog.i18n.DateTimeSymbols_wae', 'goog.i18n.DateTimeSymbols_wae_CH', 'goog.i18n.DateTimeSymbols_wo', 'goog.i18n.DateTimeSymbols_wo_SN', 'goog.i18n.DateTimeSymbols_xh', 'goog.i18n.DateTimeSymbols_xh_ZA', 'goog.i18n.DateTimeSymbols_xog', 'goog.i18n.DateTimeSymbols_xog_UG', 'goog.i18n.DateTimeSymbols_yav', 'goog.i18n.DateTimeSymbols_yav_CM', 'goog.i18n.DateTimeSymbols_yi', 'goog.i18n.DateTimeSymbols_yi_001', 'goog.i18n.DateTimeSymbols_yo', 'goog.i18n.DateTimeSymbols_yo_BJ', 'goog.i18n.DateTimeSymbols_yo_NG', 'goog.i18n.DateTimeSymbols_yue', 'goog.i18n.DateTimeSymbols_yue_Hans', 'goog.i18n.DateTimeSymbols_yue_Hans_CN', 'goog.i18n.DateTimeSymbols_yue_Hant', 'goog.i18n.DateTimeSymbols_yue_Hant_HK', 'goog.i18n.DateTimeSymbols_zgh', 'goog.i18n.DateTimeSymbols_zgh_MA', 'goog.i18n.DateTimeSymbols_zh_Hans', 'goog.i18n.DateTimeSymbols_zh_Hans_CN', 'goog.i18n.DateTimeSymbols_zh_Hans_HK', 'goog.i18n.DateTimeSymbols_zh_Hans_MO', 'goog.i18n.DateTimeSymbols_zh_Hans_SG', 'goog.i18n.DateTimeSymbols_zh_Hant', 'goog.i18n.DateTimeSymbols_zh_Hant_HK', 'goog.i18n.DateTimeSymbols_zh_Hant_MO', 'goog.i18n.DateTimeSymbols_zh_Hant_TW', 'goog.i18n.DateTimeSymbols_zu_ZA'], ['goog.i18n.DateTimeSymbols'], {});\ngoog.addDependency('i18n/graphemebreak.js', ['goog.i18n.GraphemeBreak'], ['goog.asserts', 'goog.i18n.uChar', 'goog.structs.InversionMap'], {});\ngoog.addDependency('i18n/graphemebreak_test.js', ['goog.i18n.GraphemeBreakTest'], ['goog.i18n.GraphemeBreak', 'goog.i18n.uChar', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/localefeature.js', ['goog.i18n.LocaleFeature'], [], {'module': 'goog'});\ngoog.addDependency('i18n/localefeature_test.js', ['goog.i18n.LocaleFeatureTest'], ['goog.i18n.LocaleFeature', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/messageformat.js', ['goog.i18n.MessageFormat'], ['goog.array', 'goog.asserts', 'goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.NumberFormat', 'goog.i18n.NumberFormatSymbols', 'goog.i18n.ordinalRules', 'goog.i18n.pluralRules'], {});\ngoog.addDependency('i18n/messageformat_test.js', ['goog.i18n.MessageFormatTest'], ['goog.i18n.MessageFormat', 'goog.i18n.NumberFormatSymbols_hr', 'goog.i18n.pluralRules', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/mime.js', ['goog.i18n.mime', 'goog.i18n.mime.encode'], ['goog.array', 'goog.i18n.uChar'], {});\ngoog.addDependency('i18n/mime_test.js', ['goog.i18n.mime.encodeTest'], ['goog.i18n.mime.encode', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/numberformat.js', ['goog.i18n.NumberFormat', 'goog.i18n.NumberFormat.CurrencyStyle', 'goog.i18n.NumberFormat.Format'], ['goog.asserts', 'goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_u_nu_latn', 'goog.i18n.currency', 'goog.math', 'goog.string'], {});\ngoog.addDependency('i18n/numberformat_test.js', ['goog.i18n.NumberFormatTest'], ['goog.i18n.CompactNumberFormatSymbols', 'goog.i18n.CompactNumberFormatSymbols_de', 'goog.i18n.CompactNumberFormatSymbols_en', 'goog.i18n.CompactNumberFormatSymbols_fr', 'goog.i18n.NumberFormat', 'goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_ar_EG', 'goog.i18n.NumberFormatSymbols_ar_EG_u_nu_latn', 'goog.i18n.NumberFormatSymbols_de', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_en_AU', 'goog.i18n.NumberFormatSymbols_en_US', 'goog.i18n.NumberFormatSymbols_fi', 'goog.i18n.NumberFormatSymbols_fr', 'goog.i18n.NumberFormatSymbols_pl', 'goog.i18n.NumberFormatSymbols_ro', 'goog.i18n.NumberFormatSymbols_u_nu_latn', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/numberformatsymbols.js', ['goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_af', 'goog.i18n.NumberFormatSymbols_am', 'goog.i18n.NumberFormatSymbols_ar', 'goog.i18n.NumberFormatSymbols_ar_DZ', 'goog.i18n.NumberFormatSymbols_ar_EG', 'goog.i18n.NumberFormatSymbols_ar_EG_u_nu_latn', 'goog.i18n.NumberFormatSymbols_az', 'goog.i18n.NumberFormatSymbols_be', 'goog.i18n.NumberFormatSymbols_bg', 'goog.i18n.NumberFormatSymbols_bn', 'goog.i18n.NumberFormatSymbols_bn_u_nu_latn', 'goog.i18n.NumberFormatSymbols_br', 'goog.i18n.NumberFormatSymbols_bs', 'goog.i18n.NumberFormatSymbols_ca', 'goog.i18n.NumberFormatSymbols_chr', 'goog.i18n.NumberFormatSymbols_cs', 'goog.i18n.NumberFormatSymbols_cy', 'goog.i18n.NumberFormatSymbols_da', 'goog.i18n.NumberFormatSymbols_de', 'goog.i18n.NumberFormatSymbols_de_AT', 'goog.i18n.NumberFormatSymbols_de_CH', 'goog.i18n.NumberFormatSymbols_el', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_en_AU', 'goog.i18n.NumberFormatSymbols_en_CA', 'goog.i18n.NumberFormatSymbols_en_GB', 'goog.i18n.NumberFormatSymbols_en_IE', 'goog.i18n.NumberFormatSymbols_en_IN', 'goog.i18n.NumberFormatSymbols_en_SG', 'goog.i18n.NumberFormatSymbols_en_US', 'goog.i18n.NumberFormatSymbols_en_ZA', 'goog.i18n.NumberFormatSymbols_es', 'goog.i18n.NumberFormatSymbols_es_419', 'goog.i18n.NumberFormatSymbols_es_ES', 'goog.i18n.NumberFormatSymbols_es_MX', 'goog.i18n.NumberFormatSymbols_es_US', 'goog.i18n.NumberFormatSymbols_et', 'goog.i18n.NumberFormatSymbols_eu', 'goog.i18n.NumberFormatSymbols_fa', 'goog.i18n.NumberFormatSymbols_fa_u_nu_latn', 'goog.i18n.NumberFormatSymbols_fi', 'goog.i18n.NumberFormatSymbols_fil', 'goog.i18n.NumberFormatSymbols_fr', 'goog.i18n.NumberFormatSymbols_fr_CA', 'goog.i18n.NumberFormatSymbols_ga', 'goog.i18n.NumberFormatSymbols_gl', 'goog.i18n.NumberFormatSymbols_gsw', 'goog.i18n.NumberFormatSymbols_gu', 'goog.i18n.NumberFormatSymbols_haw', 'goog.i18n.NumberFormatSymbols_he', 'goog.i18n.NumberFormatSymbols_hi', 'goog.i18n.NumberFormatSymbols_hr', 'goog.i18n.NumberFormatSymbols_hu', 'goog.i18n.NumberFormatSymbols_hy', 'goog.i18n.NumberFormatSymbols_id', 'goog.i18n.NumberFormatSymbols_in', 'goog.i18n.NumberFormatSymbols_is', 'goog.i18n.NumberFormatSymbols_it', 'goog.i18n.NumberFormatSymbols_iw', 'goog.i18n.NumberFormatSymbols_ja', 'goog.i18n.NumberFormatSymbols_ka', 'goog.i18n.NumberFormatSymbols_kk', 'goog.i18n.NumberFormatSymbols_km', 'goog.i18n.NumberFormatSymbols_kn', 'goog.i18n.NumberFormatSymbols_ko', 'goog.i18n.NumberFormatSymbols_ky', 'goog.i18n.NumberFormatSymbols_ln', 'goog.i18n.NumberFormatSymbols_lo', 'goog.i18n.NumberFormatSymbols_lt', 'goog.i18n.NumberFormatSymbols_lv', 'goog.i18n.NumberFormatSymbols_mk', 'goog.i18n.NumberFormatSymbols_ml', 'goog.i18n.NumberFormatSymbols_mn', 'goog.i18n.NumberFormatSymbols_mo', 'goog.i18n.NumberFormatSymbols_mr', 'goog.i18n.NumberFormatSymbols_mr_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ms', 'goog.i18n.NumberFormatSymbols_mt', 'goog.i18n.NumberFormatSymbols_my', 'goog.i18n.NumberFormatSymbols_my_u_nu_latn', 'goog.i18n.NumberFormatSymbols_nb', 'goog.i18n.NumberFormatSymbols_ne', 'goog.i18n.NumberFormatSymbols_ne_u_nu_latn', 'goog.i18n.NumberFormatSymbols_nl', 'goog.i18n.NumberFormatSymbols_no', 'goog.i18n.NumberFormatSymbols_no_NO', 'goog.i18n.NumberFormatSymbols_or', 'goog.i18n.NumberFormatSymbols_pa', 'goog.i18n.NumberFormatSymbols_pl', 'goog.i18n.NumberFormatSymbols_pt', 'goog.i18n.NumberFormatSymbols_pt_BR', 'goog.i18n.NumberFormatSymbols_pt_PT', 'goog.i18n.NumberFormatSymbols_ro', 'goog.i18n.NumberFormatSymbols_ru', 'goog.i18n.NumberFormatSymbols_sh', 'goog.i18n.NumberFormatSymbols_si', 'goog.i18n.NumberFormatSymbols_sk', 'goog.i18n.NumberFormatSymbols_sl', 'goog.i18n.NumberFormatSymbols_sq', 'goog.i18n.NumberFormatSymbols_sr', 'goog.i18n.NumberFormatSymbols_sr_Latn', 'goog.i18n.NumberFormatSymbols_sv', 'goog.i18n.NumberFormatSymbols_sw', 'goog.i18n.NumberFormatSymbols_ta', 'goog.i18n.NumberFormatSymbols_te', 'goog.i18n.NumberFormatSymbols_th', 'goog.i18n.NumberFormatSymbols_tl', 'goog.i18n.NumberFormatSymbols_tr', 'goog.i18n.NumberFormatSymbols_u_nu_latn', 'goog.i18n.NumberFormatSymbols_uk', 'goog.i18n.NumberFormatSymbols_ur', 'goog.i18n.NumberFormatSymbols_uz', 'goog.i18n.NumberFormatSymbols_vi', 'goog.i18n.NumberFormatSymbols_zh', 'goog.i18n.NumberFormatSymbols_zh_CN', 'goog.i18n.NumberFormatSymbols_zh_HK', 'goog.i18n.NumberFormatSymbols_zh_TW', 'goog.i18n.NumberFormatSymbols_zu'], [], {});\ngoog.addDependency('i18n/numberformatsymbolsext.js', ['goog.i18n.NumberFormatSymbolsExt', 'goog.i18n.NumberFormatSymbols_af_NA', 'goog.i18n.NumberFormatSymbols_af_ZA', 'goog.i18n.NumberFormatSymbols_agq', 'goog.i18n.NumberFormatSymbols_agq_CM', 'goog.i18n.NumberFormatSymbols_ak', 'goog.i18n.NumberFormatSymbols_ak_GH', 'goog.i18n.NumberFormatSymbols_am_ET', 'goog.i18n.NumberFormatSymbols_ar_001', 'goog.i18n.NumberFormatSymbols_ar_AE', 'goog.i18n.NumberFormatSymbols_ar_AE_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_BH', 'goog.i18n.NumberFormatSymbols_ar_BH_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_DJ', 'goog.i18n.NumberFormatSymbols_ar_DJ_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_EH', 'goog.i18n.NumberFormatSymbols_ar_ER', 'goog.i18n.NumberFormatSymbols_ar_ER_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_IL', 'goog.i18n.NumberFormatSymbols_ar_IL_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_IQ', 'goog.i18n.NumberFormatSymbols_ar_IQ_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_JO', 'goog.i18n.NumberFormatSymbols_ar_JO_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_KM', 'goog.i18n.NumberFormatSymbols_ar_KM_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_KW', 'goog.i18n.NumberFormatSymbols_ar_KW_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_LB', 'goog.i18n.NumberFormatSymbols_ar_LB_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_LY', 'goog.i18n.NumberFormatSymbols_ar_MA', 'goog.i18n.NumberFormatSymbols_ar_MR', 'goog.i18n.NumberFormatSymbols_ar_MR_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_OM', 'goog.i18n.NumberFormatSymbols_ar_OM_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_PS', 'goog.i18n.NumberFormatSymbols_ar_PS_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_QA', 'goog.i18n.NumberFormatSymbols_ar_QA_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_SA', 'goog.i18n.NumberFormatSymbols_ar_SA_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_SD', 'goog.i18n.NumberFormatSymbols_ar_SD_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_SO', 'goog.i18n.NumberFormatSymbols_ar_SO_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_SS', 'goog.i18n.NumberFormatSymbols_ar_SS_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_SY', 'goog.i18n.NumberFormatSymbols_ar_SY_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_TD', 'goog.i18n.NumberFormatSymbols_ar_TD_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ar_TN', 'goog.i18n.NumberFormatSymbols_ar_XB', 'goog.i18n.NumberFormatSymbols_ar_YE', 'goog.i18n.NumberFormatSymbols_ar_YE_u_nu_latn', 'goog.i18n.NumberFormatSymbols_as', 'goog.i18n.NumberFormatSymbols_as_IN', 'goog.i18n.NumberFormatSymbols_as_IN_u_nu_latn', 'goog.i18n.NumberFormatSymbols_as_u_nu_latn', 'goog.i18n.NumberFormatSymbols_asa', 'goog.i18n.NumberFormatSymbols_asa_TZ', 'goog.i18n.NumberFormatSymbols_ast', 'goog.i18n.NumberFormatSymbols_ast_ES', 'goog.i18n.NumberFormatSymbols_az_Cyrl', 'goog.i18n.NumberFormatSymbols_az_Cyrl_AZ', 'goog.i18n.NumberFormatSymbols_az_Latn', 'goog.i18n.NumberFormatSymbols_az_Latn_AZ', 'goog.i18n.NumberFormatSymbols_bas', 'goog.i18n.NumberFormatSymbols_bas_CM', 'goog.i18n.NumberFormatSymbols_be_BY', 'goog.i18n.NumberFormatSymbols_bem', 'goog.i18n.NumberFormatSymbols_bem_ZM', 'goog.i18n.NumberFormatSymbols_bez', 'goog.i18n.NumberFormatSymbols_bez_TZ', 'goog.i18n.NumberFormatSymbols_bg_BG', 'goog.i18n.NumberFormatSymbols_bm', 'goog.i18n.NumberFormatSymbols_bm_ML', 'goog.i18n.NumberFormatSymbols_bn_BD', 'goog.i18n.NumberFormatSymbols_bn_BD_u_nu_latn', 'goog.i18n.NumberFormatSymbols_bn_IN', 'goog.i18n.NumberFormatSymbols_bn_IN_u_nu_latn', 'goog.i18n.NumberFormatSymbols_bo', 'goog.i18n.NumberFormatSymbols_bo_CN', 'goog.i18n.NumberFormatSymbols_bo_IN', 'goog.i18n.NumberFormatSymbols_br_FR', 'goog.i18n.NumberFormatSymbols_brx', 'goog.i18n.NumberFormatSymbols_brx_IN', 'goog.i18n.NumberFormatSymbols_bs_Cyrl', 'goog.i18n.NumberFormatSymbols_bs_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_bs_Latn', 'goog.i18n.NumberFormatSymbols_bs_Latn_BA', 'goog.i18n.NumberFormatSymbols_ca_AD', 'goog.i18n.NumberFormatSymbols_ca_ES', 'goog.i18n.NumberFormatSymbols_ca_FR', 'goog.i18n.NumberFormatSymbols_ca_IT', 'goog.i18n.NumberFormatSymbols_ccp', 'goog.i18n.NumberFormatSymbols_ccp_BD', 'goog.i18n.NumberFormatSymbols_ccp_BD_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ccp_IN', 'goog.i18n.NumberFormatSymbols_ccp_IN_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ccp_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ce', 'goog.i18n.NumberFormatSymbols_ce_RU', 'goog.i18n.NumberFormatSymbols_ceb', 'goog.i18n.NumberFormatSymbols_ceb_PH', 'goog.i18n.NumberFormatSymbols_cgg', 'goog.i18n.NumberFormatSymbols_cgg_UG', 'goog.i18n.NumberFormatSymbols_chr_US', 'goog.i18n.NumberFormatSymbols_ckb', 'goog.i18n.NumberFormatSymbols_ckb_IQ', 'goog.i18n.NumberFormatSymbols_ckb_IQ_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ckb_IR', 'goog.i18n.NumberFormatSymbols_ckb_IR_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ckb_u_nu_latn', 'goog.i18n.NumberFormatSymbols_cs_CZ', 'goog.i18n.NumberFormatSymbols_cy_GB', 'goog.i18n.NumberFormatSymbols_da_DK', 'goog.i18n.NumberFormatSymbols_da_GL', 'goog.i18n.NumberFormatSymbols_dav', 'goog.i18n.NumberFormatSymbols_dav_KE', 'goog.i18n.NumberFormatSymbols_de_BE', 'goog.i18n.NumberFormatSymbols_de_DE', 'goog.i18n.NumberFormatSymbols_de_IT', 'goog.i18n.NumberFormatSymbols_de_LI', 'goog.i18n.NumberFormatSymbols_de_LU', 'goog.i18n.NumberFormatSymbols_dje', 'goog.i18n.NumberFormatSymbols_dje_NE', 'goog.i18n.NumberFormatSymbols_dsb', 'goog.i18n.NumberFormatSymbols_dsb_DE', 'goog.i18n.NumberFormatSymbols_dua', 'goog.i18n.NumberFormatSymbols_dua_CM', 'goog.i18n.NumberFormatSymbols_dyo', 'goog.i18n.NumberFormatSymbols_dyo_SN', 'goog.i18n.NumberFormatSymbols_dz', 'goog.i18n.NumberFormatSymbols_dz_BT', 'goog.i18n.NumberFormatSymbols_dz_BT_u_nu_latn', 'goog.i18n.NumberFormatSymbols_dz_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ebu', 'goog.i18n.NumberFormatSymbols_ebu_KE', 'goog.i18n.NumberFormatSymbols_ee', 'goog.i18n.NumberFormatSymbols_ee_GH', 'goog.i18n.NumberFormatSymbols_ee_TG', 'goog.i18n.NumberFormatSymbols_el_CY', 'goog.i18n.NumberFormatSymbols_el_GR', 'goog.i18n.NumberFormatSymbols_en_001', 'goog.i18n.NumberFormatSymbols_en_150', 'goog.i18n.NumberFormatSymbols_en_AE', 'goog.i18n.NumberFormatSymbols_en_AG', 'goog.i18n.NumberFormatSymbols_en_AI', 'goog.i18n.NumberFormatSymbols_en_AS', 'goog.i18n.NumberFormatSymbols_en_AT', 'goog.i18n.NumberFormatSymbols_en_BB', 'goog.i18n.NumberFormatSymbols_en_BE', 'goog.i18n.NumberFormatSymbols_en_BI', 'goog.i18n.NumberFormatSymbols_en_BM', 'goog.i18n.NumberFormatSymbols_en_BS', 'goog.i18n.NumberFormatSymbols_en_BW', 'goog.i18n.NumberFormatSymbols_en_BZ', 'goog.i18n.NumberFormatSymbols_en_CC', 'goog.i18n.NumberFormatSymbols_en_CH', 'goog.i18n.NumberFormatSymbols_en_CK', 'goog.i18n.NumberFormatSymbols_en_CM', 'goog.i18n.NumberFormatSymbols_en_CX', 'goog.i18n.NumberFormatSymbols_en_CY', 'goog.i18n.NumberFormatSymbols_en_DE', 'goog.i18n.NumberFormatSymbols_en_DG', 'goog.i18n.NumberFormatSymbols_en_DK', 'goog.i18n.NumberFormatSymbols_en_DM', 'goog.i18n.NumberFormatSymbols_en_ER', 'goog.i18n.NumberFormatSymbols_en_FI', 'goog.i18n.NumberFormatSymbols_en_FJ', 'goog.i18n.NumberFormatSymbols_en_FK', 'goog.i18n.NumberFormatSymbols_en_FM', 'goog.i18n.NumberFormatSymbols_en_GD', 'goog.i18n.NumberFormatSymbols_en_GG', 'goog.i18n.NumberFormatSymbols_en_GH', 'goog.i18n.NumberFormatSymbols_en_GI', 'goog.i18n.NumberFormatSymbols_en_GM', 'goog.i18n.NumberFormatSymbols_en_GU', 'goog.i18n.NumberFormatSymbols_en_GY', 'goog.i18n.NumberFormatSymbols_en_HK', 'goog.i18n.NumberFormatSymbols_en_IL', 'goog.i18n.NumberFormatSymbols_en_IM', 'goog.i18n.NumberFormatSymbols_en_IO', 'goog.i18n.NumberFormatSymbols_en_JE', 'goog.i18n.NumberFormatSymbols_en_JM', 'goog.i18n.NumberFormatSymbols_en_KE', 'goog.i18n.NumberFormatSymbols_en_KI', 'goog.i18n.NumberFormatSymbols_en_KN', 'goog.i18n.NumberFormatSymbols_en_KY', 'goog.i18n.NumberFormatSymbols_en_LC', 'goog.i18n.NumberFormatSymbols_en_LR', 'goog.i18n.NumberFormatSymbols_en_LS', 'goog.i18n.NumberFormatSymbols_en_MG', 'goog.i18n.NumberFormatSymbols_en_MH', 'goog.i18n.NumberFormatSymbols_en_MO', 'goog.i18n.NumberFormatSymbols_en_MP', 'goog.i18n.NumberFormatSymbols_en_MS', 'goog.i18n.NumberFormatSymbols_en_MT', 'goog.i18n.NumberFormatSymbols_en_MU', 'goog.i18n.NumberFormatSymbols_en_MW', 'goog.i18n.NumberFormatSymbols_en_MY', 'goog.i18n.NumberFormatSymbols_en_NA', 'goog.i18n.NumberFormatSymbols_en_NF', 'goog.i18n.NumberFormatSymbols_en_NG', 'goog.i18n.NumberFormatSymbols_en_NL', 'goog.i18n.NumberFormatSymbols_en_NR', 'goog.i18n.NumberFormatSymbols_en_NU', 'goog.i18n.NumberFormatSymbols_en_NZ', 'goog.i18n.NumberFormatSymbols_en_PG', 'goog.i18n.NumberFormatSymbols_en_PH', 'goog.i18n.NumberFormatSymbols_en_PK', 'goog.i18n.NumberFormatSymbols_en_PN', 'goog.i18n.NumberFormatSymbols_en_PR', 'goog.i18n.NumberFormatSymbols_en_PW', 'goog.i18n.NumberFormatSymbols_en_RW', 'goog.i18n.NumberFormatSymbols_en_SB', 'goog.i18n.NumberFormatSymbols_en_SC', 'goog.i18n.NumberFormatSymbols_en_SD', 'goog.i18n.NumberFormatSymbols_en_SE', 'goog.i18n.NumberFormatSymbols_en_SH', 'goog.i18n.NumberFormatSymbols_en_SI', 'goog.i18n.NumberFormatSymbols_en_SL', 'goog.i18n.NumberFormatSymbols_en_SS', 'goog.i18n.NumberFormatSymbols_en_SX', 'goog.i18n.NumberFormatSymbols_en_SZ', 'goog.i18n.NumberFormatSymbols_en_TC', 'goog.i18n.NumberFormatSymbols_en_TK', 'goog.i18n.NumberFormatSymbols_en_TO', 'goog.i18n.NumberFormatSymbols_en_TT', 'goog.i18n.NumberFormatSymbols_en_TV', 'goog.i18n.NumberFormatSymbols_en_TZ', 'goog.i18n.NumberFormatSymbols_en_UG', 'goog.i18n.NumberFormatSymbols_en_UM', 'goog.i18n.NumberFormatSymbols_en_US_POSIX', 'goog.i18n.NumberFormatSymbols_en_VC', 'goog.i18n.NumberFormatSymbols_en_VG', 'goog.i18n.NumberFormatSymbols_en_VI', 'goog.i18n.NumberFormatSymbols_en_VU', 'goog.i18n.NumberFormatSymbols_en_WS', 'goog.i18n.NumberFormatSymbols_en_XA', 'goog.i18n.NumberFormatSymbols_en_ZM', 'goog.i18n.NumberFormatSymbols_en_ZW', 'goog.i18n.NumberFormatSymbols_eo', 'goog.i18n.NumberFormatSymbols_eo_001', 'goog.i18n.NumberFormatSymbols_es_AR', 'goog.i18n.NumberFormatSymbols_es_BO', 'goog.i18n.NumberFormatSymbols_es_BR', 'goog.i18n.NumberFormatSymbols_es_BZ', 'goog.i18n.NumberFormatSymbols_es_CL', 'goog.i18n.NumberFormatSymbols_es_CO', 'goog.i18n.NumberFormatSymbols_es_CR', 'goog.i18n.NumberFormatSymbols_es_CU', 'goog.i18n.NumberFormatSymbols_es_DO', 'goog.i18n.NumberFormatSymbols_es_EA', 'goog.i18n.NumberFormatSymbols_es_EC', 'goog.i18n.NumberFormatSymbols_es_GQ', 'goog.i18n.NumberFormatSymbols_es_GT', 'goog.i18n.NumberFormatSymbols_es_HN', 'goog.i18n.NumberFormatSymbols_es_IC', 'goog.i18n.NumberFormatSymbols_es_NI', 'goog.i18n.NumberFormatSymbols_es_PA', 'goog.i18n.NumberFormatSymbols_es_PE', 'goog.i18n.NumberFormatSymbols_es_PH', 'goog.i18n.NumberFormatSymbols_es_PR', 'goog.i18n.NumberFormatSymbols_es_PY', 'goog.i18n.NumberFormatSymbols_es_SV', 'goog.i18n.NumberFormatSymbols_es_UY', 'goog.i18n.NumberFormatSymbols_es_VE', 'goog.i18n.NumberFormatSymbols_et_EE', 'goog.i18n.NumberFormatSymbols_eu_ES', 'goog.i18n.NumberFormatSymbols_ewo', 'goog.i18n.NumberFormatSymbols_ewo_CM', 'goog.i18n.NumberFormatSymbols_fa_AF', 'goog.i18n.NumberFormatSymbols_fa_AF_u_nu_latn', 'goog.i18n.NumberFormatSymbols_fa_IR', 'goog.i18n.NumberFormatSymbols_fa_IR_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ff', 'goog.i18n.NumberFormatSymbols_ff_Latn', 'goog.i18n.NumberFormatSymbols_ff_Latn_BF', 'goog.i18n.NumberFormatSymbols_ff_Latn_CM', 'goog.i18n.NumberFormatSymbols_ff_Latn_GH', 'goog.i18n.NumberFormatSymbols_ff_Latn_GM', 'goog.i18n.NumberFormatSymbols_ff_Latn_GN', 'goog.i18n.NumberFormatSymbols_ff_Latn_GW', 'goog.i18n.NumberFormatSymbols_ff_Latn_LR', 'goog.i18n.NumberFormatSymbols_ff_Latn_MR', 'goog.i18n.NumberFormatSymbols_ff_Latn_NE', 'goog.i18n.NumberFormatSymbols_ff_Latn_NG', 'goog.i18n.NumberFormatSymbols_ff_Latn_SL', 'goog.i18n.NumberFormatSymbols_ff_Latn_SN', 'goog.i18n.NumberFormatSymbols_fi_FI', 'goog.i18n.NumberFormatSymbols_fil_PH', 'goog.i18n.NumberFormatSymbols_fo', 'goog.i18n.NumberFormatSymbols_fo_DK', 'goog.i18n.NumberFormatSymbols_fo_FO', 'goog.i18n.NumberFormatSymbols_fr_BE', 'goog.i18n.NumberFormatSymbols_fr_BF', 'goog.i18n.NumberFormatSymbols_fr_BI', 'goog.i18n.NumberFormatSymbols_fr_BJ', 'goog.i18n.NumberFormatSymbols_fr_BL', 'goog.i18n.NumberFormatSymbols_fr_CD', 'goog.i18n.NumberFormatSymbols_fr_CF', 'goog.i18n.NumberFormatSymbols_fr_CG', 'goog.i18n.NumberFormatSymbols_fr_CH', 'goog.i18n.NumberFormatSymbols_fr_CI', 'goog.i18n.NumberFormatSymbols_fr_CM', 'goog.i18n.NumberFormatSymbols_fr_DJ', 'goog.i18n.NumberFormatSymbols_fr_DZ', 'goog.i18n.NumberFormatSymbols_fr_FR', 'goog.i18n.NumberFormatSymbols_fr_GA', 'goog.i18n.NumberFormatSymbols_fr_GF', 'goog.i18n.NumberFormatSymbols_fr_GN', 'goog.i18n.NumberFormatSymbols_fr_GP', 'goog.i18n.NumberFormatSymbols_fr_GQ', 'goog.i18n.NumberFormatSymbols_fr_HT', 'goog.i18n.NumberFormatSymbols_fr_KM', 'goog.i18n.NumberFormatSymbols_fr_LU', 'goog.i18n.NumberFormatSymbols_fr_MA', 'goog.i18n.NumberFormatSymbols_fr_MC', 'goog.i18n.NumberFormatSymbols_fr_MF', 'goog.i18n.NumberFormatSymbols_fr_MG', 'goog.i18n.NumberFormatSymbols_fr_ML', 'goog.i18n.NumberFormatSymbols_fr_MQ', 'goog.i18n.NumberFormatSymbols_fr_MR', 'goog.i18n.NumberFormatSymbols_fr_MU', 'goog.i18n.NumberFormatSymbols_fr_NC', 'goog.i18n.NumberFormatSymbols_fr_NE', 'goog.i18n.NumberFormatSymbols_fr_PF', 'goog.i18n.NumberFormatSymbols_fr_PM', 'goog.i18n.NumberFormatSymbols_fr_RE', 'goog.i18n.NumberFormatSymbols_fr_RW', 'goog.i18n.NumberFormatSymbols_fr_SC', 'goog.i18n.NumberFormatSymbols_fr_SN', 'goog.i18n.NumberFormatSymbols_fr_SY', 'goog.i18n.NumberFormatSymbols_fr_TD', 'goog.i18n.NumberFormatSymbols_fr_TG', 'goog.i18n.NumberFormatSymbols_fr_TN', 'goog.i18n.NumberFormatSymbols_fr_VU', 'goog.i18n.NumberFormatSymbols_fr_WF', 'goog.i18n.NumberFormatSymbols_fr_YT', 'goog.i18n.NumberFormatSymbols_fur', 'goog.i18n.NumberFormatSymbols_fur_IT', 'goog.i18n.NumberFormatSymbols_fy', 'goog.i18n.NumberFormatSymbols_fy_NL', 'goog.i18n.NumberFormatSymbols_ga_IE', 'goog.i18n.NumberFormatSymbols_gd', 'goog.i18n.NumberFormatSymbols_gd_GB', 'goog.i18n.NumberFormatSymbols_gl_ES', 'goog.i18n.NumberFormatSymbols_gsw_CH', 'goog.i18n.NumberFormatSymbols_gsw_FR', 'goog.i18n.NumberFormatSymbols_gsw_LI', 'goog.i18n.NumberFormatSymbols_gu_IN', 'goog.i18n.NumberFormatSymbols_guz', 'goog.i18n.NumberFormatSymbols_guz_KE', 'goog.i18n.NumberFormatSymbols_gv', 'goog.i18n.NumberFormatSymbols_gv_IM', 'goog.i18n.NumberFormatSymbols_ha', 'goog.i18n.NumberFormatSymbols_ha_GH', 'goog.i18n.NumberFormatSymbols_ha_NE', 'goog.i18n.NumberFormatSymbols_ha_NG', 'goog.i18n.NumberFormatSymbols_haw_US', 'goog.i18n.NumberFormatSymbols_he_IL', 'goog.i18n.NumberFormatSymbols_hi_IN', 'goog.i18n.NumberFormatSymbols_hr_BA', 'goog.i18n.NumberFormatSymbols_hr_HR', 'goog.i18n.NumberFormatSymbols_hsb', 'goog.i18n.NumberFormatSymbols_hsb_DE', 'goog.i18n.NumberFormatSymbols_hu_HU', 'goog.i18n.NumberFormatSymbols_hy_AM', 'goog.i18n.NumberFormatSymbols_ia', 'goog.i18n.NumberFormatSymbols_ia_001', 'goog.i18n.NumberFormatSymbols_id_ID', 'goog.i18n.NumberFormatSymbols_ig', 'goog.i18n.NumberFormatSymbols_ig_NG', 'goog.i18n.NumberFormatSymbols_ii', 'goog.i18n.NumberFormatSymbols_ii_CN', 'goog.i18n.NumberFormatSymbols_is_IS', 'goog.i18n.NumberFormatSymbols_it_CH', 'goog.i18n.NumberFormatSymbols_it_IT', 'goog.i18n.NumberFormatSymbols_it_SM', 'goog.i18n.NumberFormatSymbols_it_VA', 'goog.i18n.NumberFormatSymbols_ja_JP', 'goog.i18n.NumberFormatSymbols_jgo', 'goog.i18n.NumberFormatSymbols_jgo_CM', 'goog.i18n.NumberFormatSymbols_jmc', 'goog.i18n.NumberFormatSymbols_jmc_TZ', 'goog.i18n.NumberFormatSymbols_jv', 'goog.i18n.NumberFormatSymbols_jv_ID', 'goog.i18n.NumberFormatSymbols_ka_GE', 'goog.i18n.NumberFormatSymbols_kab', 'goog.i18n.NumberFormatSymbols_kab_DZ', 'goog.i18n.NumberFormatSymbols_kam', 'goog.i18n.NumberFormatSymbols_kam_KE', 'goog.i18n.NumberFormatSymbols_kde', 'goog.i18n.NumberFormatSymbols_kde_TZ', 'goog.i18n.NumberFormatSymbols_kea', 'goog.i18n.NumberFormatSymbols_kea_CV', 'goog.i18n.NumberFormatSymbols_khq', 'goog.i18n.NumberFormatSymbols_khq_ML', 'goog.i18n.NumberFormatSymbols_ki', 'goog.i18n.NumberFormatSymbols_ki_KE', 'goog.i18n.NumberFormatSymbols_kk_KZ', 'goog.i18n.NumberFormatSymbols_kkj', 'goog.i18n.NumberFormatSymbols_kkj_CM', 'goog.i18n.NumberFormatSymbols_kl', 'goog.i18n.NumberFormatSymbols_kl_GL', 'goog.i18n.NumberFormatSymbols_kln', 'goog.i18n.NumberFormatSymbols_kln_KE', 'goog.i18n.NumberFormatSymbols_km_KH', 'goog.i18n.NumberFormatSymbols_kn_IN', 'goog.i18n.NumberFormatSymbols_ko_KP', 'goog.i18n.NumberFormatSymbols_ko_KR', 'goog.i18n.NumberFormatSymbols_kok', 'goog.i18n.NumberFormatSymbols_kok_IN', 'goog.i18n.NumberFormatSymbols_ks', 'goog.i18n.NumberFormatSymbols_ks_IN', 'goog.i18n.NumberFormatSymbols_ks_IN_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ks_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ksb', 'goog.i18n.NumberFormatSymbols_ksb_TZ', 'goog.i18n.NumberFormatSymbols_ksf', 'goog.i18n.NumberFormatSymbols_ksf_CM', 'goog.i18n.NumberFormatSymbols_ksh', 'goog.i18n.NumberFormatSymbols_ksh_DE', 'goog.i18n.NumberFormatSymbols_ku', 'goog.i18n.NumberFormatSymbols_ku_TR', 'goog.i18n.NumberFormatSymbols_kw', 'goog.i18n.NumberFormatSymbols_kw_GB', 'goog.i18n.NumberFormatSymbols_ky_KG', 'goog.i18n.NumberFormatSymbols_lag', 'goog.i18n.NumberFormatSymbols_lag_TZ', 'goog.i18n.NumberFormatSymbols_lb', 'goog.i18n.NumberFormatSymbols_lb_LU', 'goog.i18n.NumberFormatSymbols_lg', 'goog.i18n.NumberFormatSymbols_lg_UG', 'goog.i18n.NumberFormatSymbols_lkt', 'goog.i18n.NumberFormatSymbols_lkt_US', 'goog.i18n.NumberFormatSymbols_ln_AO', 'goog.i18n.NumberFormatSymbols_ln_CD', 'goog.i18n.NumberFormatSymbols_ln_CF', 'goog.i18n.NumberFormatSymbols_ln_CG', 'goog.i18n.NumberFormatSymbols_lo_LA', 'goog.i18n.NumberFormatSymbols_lrc', 'goog.i18n.NumberFormatSymbols_lrc_IQ', 'goog.i18n.NumberFormatSymbols_lrc_IQ_u_nu_latn', 'goog.i18n.NumberFormatSymbols_lrc_IR', 'goog.i18n.NumberFormatSymbols_lrc_IR_u_nu_latn', 'goog.i18n.NumberFormatSymbols_lrc_u_nu_latn', 'goog.i18n.NumberFormatSymbols_lt_LT', 'goog.i18n.NumberFormatSymbols_lu', 'goog.i18n.NumberFormatSymbols_lu_CD', 'goog.i18n.NumberFormatSymbols_luo', 'goog.i18n.NumberFormatSymbols_luo_KE', 'goog.i18n.NumberFormatSymbols_luy', 'goog.i18n.NumberFormatSymbols_luy_KE', 'goog.i18n.NumberFormatSymbols_lv_LV', 'goog.i18n.NumberFormatSymbols_mas', 'goog.i18n.NumberFormatSymbols_mas_KE', 'goog.i18n.NumberFormatSymbols_mas_TZ', 'goog.i18n.NumberFormatSymbols_mer', 'goog.i18n.NumberFormatSymbols_mer_KE', 'goog.i18n.NumberFormatSymbols_mfe', 'goog.i18n.NumberFormatSymbols_mfe_MU', 'goog.i18n.NumberFormatSymbols_mg', 'goog.i18n.NumberFormatSymbols_mg_MG', 'goog.i18n.NumberFormatSymbols_mgh', 'goog.i18n.NumberFormatSymbols_mgh_MZ', 'goog.i18n.NumberFormatSymbols_mgo', 'goog.i18n.NumberFormatSymbols_mgo_CM', 'goog.i18n.NumberFormatSymbols_mi', 'goog.i18n.NumberFormatSymbols_mi_NZ', 'goog.i18n.NumberFormatSymbols_mk_MK', 'goog.i18n.NumberFormatSymbols_ml_IN', 'goog.i18n.NumberFormatSymbols_mn_MN', 'goog.i18n.NumberFormatSymbols_mr_IN', 'goog.i18n.NumberFormatSymbols_mr_IN_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ms_BN', 'goog.i18n.NumberFormatSymbols_ms_MY', 'goog.i18n.NumberFormatSymbols_ms_SG', 'goog.i18n.NumberFormatSymbols_mt_MT', 'goog.i18n.NumberFormatSymbols_mua', 'goog.i18n.NumberFormatSymbols_mua_CM', 'goog.i18n.NumberFormatSymbols_my_MM', 'goog.i18n.NumberFormatSymbols_my_MM_u_nu_latn', 'goog.i18n.NumberFormatSymbols_mzn', 'goog.i18n.NumberFormatSymbols_mzn_IR', 'goog.i18n.NumberFormatSymbols_mzn_IR_u_nu_latn', 'goog.i18n.NumberFormatSymbols_mzn_u_nu_latn', 'goog.i18n.NumberFormatSymbols_naq', 'goog.i18n.NumberFormatSymbols_naq_NA', 'goog.i18n.NumberFormatSymbols_nb_NO', 'goog.i18n.NumberFormatSymbols_nb_SJ', 'goog.i18n.NumberFormatSymbols_nd', 'goog.i18n.NumberFormatSymbols_nd_ZW', 'goog.i18n.NumberFormatSymbols_nds', 'goog.i18n.NumberFormatSymbols_nds_DE', 'goog.i18n.NumberFormatSymbols_nds_NL', 'goog.i18n.NumberFormatSymbols_ne_IN', 'goog.i18n.NumberFormatSymbols_ne_IN_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ne_NP', 'goog.i18n.NumberFormatSymbols_ne_NP_u_nu_latn', 'goog.i18n.NumberFormatSymbols_nl_AW', 'goog.i18n.NumberFormatSymbols_nl_BE', 'goog.i18n.NumberFormatSymbols_nl_BQ', 'goog.i18n.NumberFormatSymbols_nl_CW', 'goog.i18n.NumberFormatSymbols_nl_NL', 'goog.i18n.NumberFormatSymbols_nl_SR', 'goog.i18n.NumberFormatSymbols_nl_SX', 'goog.i18n.NumberFormatSymbols_nmg', 'goog.i18n.NumberFormatSymbols_nmg_CM', 'goog.i18n.NumberFormatSymbols_nn', 'goog.i18n.NumberFormatSymbols_nn_NO', 'goog.i18n.NumberFormatSymbols_nnh', 'goog.i18n.NumberFormatSymbols_nnh_CM', 'goog.i18n.NumberFormatSymbols_nus', 'goog.i18n.NumberFormatSymbols_nus_SS', 'goog.i18n.NumberFormatSymbols_nyn', 'goog.i18n.NumberFormatSymbols_nyn_UG', 'goog.i18n.NumberFormatSymbols_om', 'goog.i18n.NumberFormatSymbols_om_ET', 'goog.i18n.NumberFormatSymbols_om_KE', 'goog.i18n.NumberFormatSymbols_or_IN', 'goog.i18n.NumberFormatSymbols_os', 'goog.i18n.NumberFormatSymbols_os_GE', 'goog.i18n.NumberFormatSymbols_os_RU', 'goog.i18n.NumberFormatSymbols_pa_Arab', 'goog.i18n.NumberFormatSymbols_pa_Arab_PK', 'goog.i18n.NumberFormatSymbols_pa_Arab_PK_u_nu_latn', 'goog.i18n.NumberFormatSymbols_pa_Arab_u_nu_latn', 'goog.i18n.NumberFormatSymbols_pa_Guru', 'goog.i18n.NumberFormatSymbols_pa_Guru_IN', 'goog.i18n.NumberFormatSymbols_pl_PL', 'goog.i18n.NumberFormatSymbols_ps', 'goog.i18n.NumberFormatSymbols_ps_AF', 'goog.i18n.NumberFormatSymbols_ps_AF_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ps_PK', 'goog.i18n.NumberFormatSymbols_ps_PK_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ps_u_nu_latn', 'goog.i18n.NumberFormatSymbols_pt_AO', 'goog.i18n.NumberFormatSymbols_pt_CH', 'goog.i18n.NumberFormatSymbols_pt_CV', 'goog.i18n.NumberFormatSymbols_pt_GQ', 'goog.i18n.NumberFormatSymbols_pt_GW', 'goog.i18n.NumberFormatSymbols_pt_LU', 'goog.i18n.NumberFormatSymbols_pt_MO', 'goog.i18n.NumberFormatSymbols_pt_MZ', 'goog.i18n.NumberFormatSymbols_pt_ST', 'goog.i18n.NumberFormatSymbols_pt_TL', 'goog.i18n.NumberFormatSymbols_qu', 'goog.i18n.NumberFormatSymbols_qu_BO', 'goog.i18n.NumberFormatSymbols_qu_EC', 'goog.i18n.NumberFormatSymbols_qu_PE', 'goog.i18n.NumberFormatSymbols_rm', 'goog.i18n.NumberFormatSymbols_rm_CH', 'goog.i18n.NumberFormatSymbols_rn', 'goog.i18n.NumberFormatSymbols_rn_BI', 'goog.i18n.NumberFormatSymbols_ro_MD', 'goog.i18n.NumberFormatSymbols_ro_RO', 'goog.i18n.NumberFormatSymbols_rof', 'goog.i18n.NumberFormatSymbols_rof_TZ', 'goog.i18n.NumberFormatSymbols_ru_BY', 'goog.i18n.NumberFormatSymbols_ru_KG', 'goog.i18n.NumberFormatSymbols_ru_KZ', 'goog.i18n.NumberFormatSymbols_ru_MD', 'goog.i18n.NumberFormatSymbols_ru_RU', 'goog.i18n.NumberFormatSymbols_ru_UA', 'goog.i18n.NumberFormatSymbols_rw', 'goog.i18n.NumberFormatSymbols_rw_RW', 'goog.i18n.NumberFormatSymbols_rwk', 'goog.i18n.NumberFormatSymbols_rwk_TZ', 'goog.i18n.NumberFormatSymbols_sah', 'goog.i18n.NumberFormatSymbols_sah_RU', 'goog.i18n.NumberFormatSymbols_saq', 'goog.i18n.NumberFormatSymbols_saq_KE', 'goog.i18n.NumberFormatSymbols_sbp', 'goog.i18n.NumberFormatSymbols_sbp_TZ', 'goog.i18n.NumberFormatSymbols_sd', 'goog.i18n.NumberFormatSymbols_sd_PK', 'goog.i18n.NumberFormatSymbols_sd_PK_u_nu_latn', 'goog.i18n.NumberFormatSymbols_sd_u_nu_latn', 'goog.i18n.NumberFormatSymbols_se', 'goog.i18n.NumberFormatSymbols_se_FI', 'goog.i18n.NumberFormatSymbols_se_NO', 'goog.i18n.NumberFormatSymbols_se_SE', 'goog.i18n.NumberFormatSymbols_seh', 'goog.i18n.NumberFormatSymbols_seh_MZ', 'goog.i18n.NumberFormatSymbols_ses', 'goog.i18n.NumberFormatSymbols_ses_ML', 'goog.i18n.NumberFormatSymbols_sg', 'goog.i18n.NumberFormatSymbols_sg_CF', 'goog.i18n.NumberFormatSymbols_shi', 'goog.i18n.NumberFormatSymbols_shi_Latn', 'goog.i18n.NumberFormatSymbols_shi_Latn_MA', 'goog.i18n.NumberFormatSymbols_shi_Tfng', 'goog.i18n.NumberFormatSymbols_shi_Tfng_MA', 'goog.i18n.NumberFormatSymbols_si_LK', 'goog.i18n.NumberFormatSymbols_sk_SK', 'goog.i18n.NumberFormatSymbols_sl_SI', 'goog.i18n.NumberFormatSymbols_smn', 'goog.i18n.NumberFormatSymbols_smn_FI', 'goog.i18n.NumberFormatSymbols_sn', 'goog.i18n.NumberFormatSymbols_sn_ZW', 'goog.i18n.NumberFormatSymbols_so', 'goog.i18n.NumberFormatSymbols_so_DJ', 'goog.i18n.NumberFormatSymbols_so_ET', 'goog.i18n.NumberFormatSymbols_so_KE', 'goog.i18n.NumberFormatSymbols_so_SO', 'goog.i18n.NumberFormatSymbols_sq_AL', 'goog.i18n.NumberFormatSymbols_sq_MK', 'goog.i18n.NumberFormatSymbols_sq_XK', 'goog.i18n.NumberFormatSymbols_sr_Cyrl', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_BA', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_ME', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_RS', 'goog.i18n.NumberFormatSymbols_sr_Cyrl_XK', 'goog.i18n.NumberFormatSymbols_sr_Latn_BA', 'goog.i18n.NumberFormatSymbols_sr_Latn_ME', 'goog.i18n.NumberFormatSymbols_sr_Latn_RS', 'goog.i18n.NumberFormatSymbols_sr_Latn_XK', 'goog.i18n.NumberFormatSymbols_sv_AX', 'goog.i18n.NumberFormatSymbols_sv_FI', 'goog.i18n.NumberFormatSymbols_sv_SE', 'goog.i18n.NumberFormatSymbols_sw_CD', 'goog.i18n.NumberFormatSymbols_sw_KE', 'goog.i18n.NumberFormatSymbols_sw_TZ', 'goog.i18n.NumberFormatSymbols_sw_UG', 'goog.i18n.NumberFormatSymbols_ta_IN', 'goog.i18n.NumberFormatSymbols_ta_LK', 'goog.i18n.NumberFormatSymbols_ta_MY', 'goog.i18n.NumberFormatSymbols_ta_SG', 'goog.i18n.NumberFormatSymbols_te_IN', 'goog.i18n.NumberFormatSymbols_teo', 'goog.i18n.NumberFormatSymbols_teo_KE', 'goog.i18n.NumberFormatSymbols_teo_UG', 'goog.i18n.NumberFormatSymbols_tg', 'goog.i18n.NumberFormatSymbols_tg_TJ', 'goog.i18n.NumberFormatSymbols_th_TH', 'goog.i18n.NumberFormatSymbols_ti', 'goog.i18n.NumberFormatSymbols_ti_ER', 'goog.i18n.NumberFormatSymbols_ti_ET', 'goog.i18n.NumberFormatSymbols_tk', 'goog.i18n.NumberFormatSymbols_tk_TM', 'goog.i18n.NumberFormatSymbols_to', 'goog.i18n.NumberFormatSymbols_to_TO', 'goog.i18n.NumberFormatSymbols_tr_CY', 'goog.i18n.NumberFormatSymbols_tr_TR', 'goog.i18n.NumberFormatSymbols_tt', 'goog.i18n.NumberFormatSymbols_tt_RU', 'goog.i18n.NumberFormatSymbols_twq', 'goog.i18n.NumberFormatSymbols_twq_NE', 'goog.i18n.NumberFormatSymbols_tzm', 'goog.i18n.NumberFormatSymbols_tzm_MA', 'goog.i18n.NumberFormatSymbols_ug', 'goog.i18n.NumberFormatSymbols_ug_CN', 'goog.i18n.NumberFormatSymbols_uk_UA', 'goog.i18n.NumberFormatSymbols_ur_IN', 'goog.i18n.NumberFormatSymbols_ur_IN_u_nu_latn', 'goog.i18n.NumberFormatSymbols_ur_PK', 'goog.i18n.NumberFormatSymbols_uz_Arab', 'goog.i18n.NumberFormatSymbols_uz_Arab_AF', 'goog.i18n.NumberFormatSymbols_uz_Arab_AF_u_nu_latn', 'goog.i18n.NumberFormatSymbols_uz_Arab_u_nu_latn', 'goog.i18n.NumberFormatSymbols_uz_Cyrl', 'goog.i18n.NumberFormatSymbols_uz_Cyrl_UZ', 'goog.i18n.NumberFormatSymbols_uz_Latn', 'goog.i18n.NumberFormatSymbols_uz_Latn_UZ', 'goog.i18n.NumberFormatSymbols_vai', 'goog.i18n.NumberFormatSymbols_vai_Latn', 'goog.i18n.NumberFormatSymbols_vai_Latn_LR', 'goog.i18n.NumberFormatSymbols_vai_Vaii', 'goog.i18n.NumberFormatSymbols_vai_Vaii_LR', 'goog.i18n.NumberFormatSymbols_vi_VN', 'goog.i18n.NumberFormatSymbols_vun', 'goog.i18n.NumberFormatSymbols_vun_TZ', 'goog.i18n.NumberFormatSymbols_wae', 'goog.i18n.NumberFormatSymbols_wae_CH', 'goog.i18n.NumberFormatSymbols_wo', 'goog.i18n.NumberFormatSymbols_wo_SN', 'goog.i18n.NumberFormatSymbols_xh', 'goog.i18n.NumberFormatSymbols_xh_ZA', 'goog.i18n.NumberFormatSymbols_xog', 'goog.i18n.NumberFormatSymbols_xog_UG', 'goog.i18n.NumberFormatSymbols_yav', 'goog.i18n.NumberFormatSymbols_yav_CM', 'goog.i18n.NumberFormatSymbols_yi', 'goog.i18n.NumberFormatSymbols_yi_001', 'goog.i18n.NumberFormatSymbols_yo', 'goog.i18n.NumberFormatSymbols_yo_BJ', 'goog.i18n.NumberFormatSymbols_yo_NG', 'goog.i18n.NumberFormatSymbols_yue', 'goog.i18n.NumberFormatSymbols_yue_Hans', 'goog.i18n.NumberFormatSymbols_yue_Hans_CN', 'goog.i18n.NumberFormatSymbols_yue_Hant', 'goog.i18n.NumberFormatSymbols_yue_Hant_HK', 'goog.i18n.NumberFormatSymbols_zgh', 'goog.i18n.NumberFormatSymbols_zgh_MA', 'goog.i18n.NumberFormatSymbols_zh_Hans', 'goog.i18n.NumberFormatSymbols_zh_Hans_CN', 'goog.i18n.NumberFormatSymbols_zh_Hans_HK', 'goog.i18n.NumberFormatSymbols_zh_Hans_MO', 'goog.i18n.NumberFormatSymbols_zh_Hans_SG', 'goog.i18n.NumberFormatSymbols_zh_Hant', 'goog.i18n.NumberFormatSymbols_zh_Hant_HK', 'goog.i18n.NumberFormatSymbols_zh_Hant_MO', 'goog.i18n.NumberFormatSymbols_zh_Hant_TW', 'goog.i18n.NumberFormatSymbols_zu_ZA'], ['goog.i18n.NumberFormatSymbols', 'goog.i18n.NumberFormatSymbols_u_nu_latn'], {});\ngoog.addDependency('i18n/ordinalrules.js', ['goog.i18n.ordinalRules'], [], {'lang': 'es6'});\ngoog.addDependency('i18n/pluralrules.js', ['goog.i18n.pluralRules'], [], {'lang': 'es6'});\ngoog.addDependency('i18n/pluralrules_test.js', ['goog.i18n.pluralRulesTest'], ['goog.i18n.pluralRules', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/relativedatetimeformat.js', ['goog.i18n.RelativeDateTimeFormat'], ['goog.asserts', 'goog.i18n.LocaleFeature', 'goog.i18n.MessageFormat', 'goog.i18n.relativeDateTimeSymbols'], {'lang': 'es5', 'module': 'goog'});\ngoog.addDependency('i18n/relativedatetimeformat_test.js', ['goog.i18n.RelativeDateTimeFormatTest'], ['goog.i18n.LocaleFeature', 'goog.i18n.NumberFormatSymbols_ar_EG', 'goog.i18n.NumberFormatSymbols_en', 'goog.i18n.NumberFormatSymbols_es', 'goog.i18n.NumberFormatSymbols_fa', 'goog.i18n.RelativeDateTimeFormat', 'goog.i18n.relativeDateTimeSymbols', 'goog.i18n.relativeDateTimeSymbolsExt', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/relativedatetimesymbols.js', ['goog.i18n.relativeDateTimeSymbols'], [], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/relativedatetimesymbolsext.js', ['goog.i18n.relativeDateTimeSymbolsExt'], ['goog.i18n.relativeDateTimeSymbols'], {'lang': 'es5', 'module': 'goog'});\ngoog.addDependency('i18n/timezone.js', ['goog.i18n.TimeZone'], ['goog.array', 'goog.date.DateLike', 'goog.object', 'goog.string'], {});\ngoog.addDependency('i18n/timezone_test.js', ['goog.i18n.TimeZoneTest'], ['goog.i18n.TimeZone', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/uchar.js', ['goog.i18n.uChar'], [], {'lang': 'es6'});\ngoog.addDependency('i18n/uchar/localnamefetcher.js', ['goog.i18n.uChar.LocalNameFetcher'], ['goog.i18n.uChar.NameFetcher', 'goog.i18n.uCharNames', 'goog.log'], {});\ngoog.addDependency('i18n/uchar/localnamefetcher_test.js', ['goog.i18n.uChar.LocalNameFetcherTest'], ['goog.i18n.uChar.LocalNameFetcher', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/uchar/namefetcher.js', ['goog.i18n.uChar.NameFetcher'], [], {});\ngoog.addDependency('i18n/uchar/remotenamefetcher.js', ['goog.i18n.uChar.RemoteNameFetcher'], ['goog.Disposable', 'goog.Uri', 'goog.events', 'goog.i18n.uChar', 'goog.i18n.uChar.NameFetcher', 'goog.log', 'goog.net.EventType', 'goog.net.XhrIo'], {});\ngoog.addDependency('i18n/uchar/remotenamefetcher_test.js', ['goog.i18n.uChar.RemoteNameFetcherTest'], ['goog.i18n.uChar.RemoteNameFetcher', 'goog.net.XhrIo', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/uchar_test.js', ['goog.i18n.uCharTest'], ['goog.i18n.uChar', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('i18n/ucharnames.js', ['goog.i18n.uCharNames'], ['goog.i18n.uChar'], {});\ngoog.addDependency('i18n/ucharnames_test.js', ['goog.i18n.uCharNamesTest'], ['goog.i18n.uCharNames', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('iter/es6.js', ['goog.iter.es6'], ['goog.iter.Iterable', 'goog.iter.Iterator', 'goog.iter.StopIteration'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('iter/es6_test.js', ['goog.iter.es6Test'], ['goog.iter', 'goog.iter.es6', 'goog.testing.jsunit', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('iter/iter.js', ['goog.iter', 'goog.iter.Iterable', 'goog.iter.Iterator', 'goog.iter.StopIteration'], ['goog.array', 'goog.asserts', 'goog.functions', 'goog.math'], {});\ngoog.addDependency('iter/iter_test.js', ['goog.iterTest'], ['goog.iter', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('json/hybrid.js', ['goog.json.hybrid'], ['goog.asserts', 'goog.json'], {});\ngoog.addDependency('json/hybrid_test.js', ['goog.json.hybridTest'], ['goog.json', 'goog.json.hybrid', 'goog.testing.PropertyReplacer', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('json/json.js', ['goog.json', 'goog.json.Replacer', 'goog.json.Reviver', 'goog.json.Serializer'], [], {'lang': 'es6'});\ngoog.addDependency('json/json_perf.js', ['goog.jsonPerf'], ['goog.dom', 'goog.json', 'goog.math', 'goog.string', 'goog.testing.PerformanceTable', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit'], {});\ngoog.addDependency('json/json_test.js', ['goog.jsonTest'], ['goog.functions', 'goog.json', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('json/jsonable.js', ['goog.json.Jsonable'], [], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('json/nativejsonprocessor.js', ['goog.json.NativeJsonProcessor'], ['goog.asserts', 'goog.json.Processor'], {});\ngoog.addDependency('json/processor.js', ['goog.json.Processor'], ['goog.string.Parser', 'goog.string.Stringifier'], {});\ngoog.addDependency('json/processor_test.js', ['goog.json.processorTest'], ['goog.json.NativeJsonProcessor', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/collections/iterables.js', ['goog.labs.collections.iterables'], [], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/collections/iterables_test.js', ['goog.labs.iterableTest'], ['goog.labs.collections.iterables', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/dom/pagevisibilitymonitor.js', ['goog.labs.dom.PageVisibilityEvent', 'goog.labs.dom.PageVisibilityMonitor', 'goog.labs.dom.PageVisibilityState'], ['goog.dom', 'goog.dom.vendor', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.memoize'], {});\ngoog.addDependency('labs/dom/pagevisibilitymonitor_test.js', ['goog.labs.dom.PageVisibilityMonitorTest'], ['goog.events', 'goog.functions', 'goog.labs.dom.PageVisibilityMonitor', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/events/nondisposableeventtarget.js', ['goog.labs.events.NonDisposableEventTarget'], ['goog.array', 'goog.asserts', 'goog.events.Event', 'goog.events.Listenable', 'goog.events.ListenerMap', 'goog.object'], {});\ngoog.addDependency('labs/events/nondisposableeventtarget_test.js', ['goog.labs.events.NonDisposableEventTargetTest'], ['goog.events.Listenable', 'goog.events.eventTargetTester', 'goog.labs.events.NonDisposableEventTarget', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/events/nondisposableeventtarget_via_googevents_test.js', ['goog.labs.events.NonDisposableEventTargetGoogEventsTest'], ['goog.events', 'goog.events.eventTargetTester', 'goog.labs.events.NonDisposableEventTarget', 'goog.testing', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/events/touch.js', ['goog.labs.events.touch', 'goog.labs.events.touch.TouchData'], ['goog.array', 'goog.asserts', 'goog.events.EventType', 'goog.string'], {});\ngoog.addDependency('labs/events/touch_test.js', ['goog.labs.events.touchTest'], ['goog.labs.events.touch', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/format/csv.js', ['goog.labs.format.csv', 'goog.labs.format.csv.ParseError', 'goog.labs.format.csv.Token'], ['goog.array', 'goog.asserts', 'goog.debug.Error', 'goog.object', 'goog.string', 'goog.string.newlines'], {});\ngoog.addDependency('labs/format/csv_test.js', ['goog.labs.format.csvTest'], ['goog.labs.format.csv', 'goog.labs.format.csv.ParseError', 'goog.object', 'goog.testing.asserts', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/i18n/listformat.js', ['goog.labs.i18n.GenderInfo', 'goog.labs.i18n.GenderInfo.Gender', 'goog.labs.i18n.ListFormat'], ['goog.asserts', 'goog.labs.i18n.ListFormatSymbols'], {});\ngoog.addDependency('labs/i18n/listformat_test.js', ['goog.labs.i18n.ListFormatTest'], ['goog.labs.i18n.GenderInfo', 'goog.labs.i18n.ListFormat', 'goog.labs.i18n.ListFormatSymbols', 'goog.labs.i18n.ListFormatSymbols_el', 'goog.labs.i18n.ListFormatSymbols_en', 'goog.labs.i18n.ListFormatSymbols_fr', 'goog.labs.i18n.ListFormatSymbols_ml', 'goog.labs.i18n.ListFormatSymbols_zu', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/i18n/listsymbols.js', ['goog.labs.i18n.ListFormatSymbols', 'goog.labs.i18n.ListFormatSymbols_af', 'goog.labs.i18n.ListFormatSymbols_am', 'goog.labs.i18n.ListFormatSymbols_ar', 'goog.labs.i18n.ListFormatSymbols_ar_DZ', 'goog.labs.i18n.ListFormatSymbols_ar_EG', 'goog.labs.i18n.ListFormatSymbols_az', 'goog.labs.i18n.ListFormatSymbols_be', 'goog.labs.i18n.ListFormatSymbols_bg', 'goog.labs.i18n.ListFormatSymbols_bn', 'goog.labs.i18n.ListFormatSymbols_br', 'goog.labs.i18n.ListFormatSymbols_bs', 'goog.labs.i18n.ListFormatSymbols_ca', 'goog.labs.i18n.ListFormatSymbols_chr', 'goog.labs.i18n.ListFormatSymbols_cs', 'goog.labs.i18n.ListFormatSymbols_cy', 'goog.labs.i18n.ListFormatSymbols_da', 'goog.labs.i18n.ListFormatSymbols_de', 'goog.labs.i18n.ListFormatSymbols_de_AT', 'goog.labs.i18n.ListFormatSymbols_de_CH', 'goog.labs.i18n.ListFormatSymbols_el', 'goog.labs.i18n.ListFormatSymbols_en', 'goog.labs.i18n.ListFormatSymbols_en_AU', 'goog.labs.i18n.ListFormatSymbols_en_CA', 'goog.labs.i18n.ListFormatSymbols_en_GB', 'goog.labs.i18n.ListFormatSymbols_en_IE', 'goog.labs.i18n.ListFormatSymbols_en_IN', 'goog.labs.i18n.ListFormatSymbols_en_SG', 'goog.labs.i18n.ListFormatSymbols_en_US', 'goog.labs.i18n.ListFormatSymbols_en_ZA', 'goog.labs.i18n.ListFormatSymbols_es', 'goog.labs.i18n.ListFormatSymbols_es_419', 'goog.labs.i18n.ListFormatSymbols_es_ES', 'goog.labs.i18n.ListFormatSymbols_es_MX', 'goog.labs.i18n.ListFormatSymbols_es_US', 'goog.labs.i18n.ListFormatSymbols_et', 'goog.labs.i18n.ListFormatSymbols_eu', 'goog.labs.i18n.ListFormatSymbols_fa', 'goog.labs.i18n.ListFormatSymbols_fi', 'goog.labs.i18n.ListFormatSymbols_fil', 'goog.labs.i18n.ListFormatSymbols_fr', 'goog.labs.i18n.ListFormatSymbols_fr_CA', 'goog.labs.i18n.ListFormatSymbols_ga', 'goog.labs.i18n.ListFormatSymbols_gl', 'goog.labs.i18n.ListFormatSymbols_gsw', 'goog.labs.i18n.ListFormatSymbols_gu', 'goog.labs.i18n.ListFormatSymbols_haw', 'goog.labs.i18n.ListFormatSymbols_he', 'goog.labs.i18n.ListFormatSymbols_hi', 'goog.labs.i18n.ListFormatSymbols_hr', 'goog.labs.i18n.ListFormatSymbols_hu', 'goog.labs.i18n.ListFormatSymbols_hy', 'goog.labs.i18n.ListFormatSymbols_id', 'goog.labs.i18n.ListFormatSymbols_in', 'goog.labs.i18n.ListFormatSymbols_is', 'goog.labs.i18n.ListFormatSymbols_it', 'goog.labs.i18n.ListFormatSymbols_iw', 'goog.labs.i18n.ListFormatSymbols_ja', 'goog.labs.i18n.ListFormatSymbols_ka', 'goog.labs.i18n.ListFormatSymbols_kk', 'goog.labs.i18n.ListFormatSymbols_km', 'goog.labs.i18n.ListFormatSymbols_kn', 'goog.labs.i18n.ListFormatSymbols_ko', 'goog.labs.i18n.ListFormatSymbols_ky', 'goog.labs.i18n.ListFormatSymbols_ln', 'goog.labs.i18n.ListFormatSymbols_lo', 'goog.labs.i18n.ListFormatSymbols_lt', 'goog.labs.i18n.ListFormatSymbols_lv', 'goog.labs.i18n.ListFormatSymbols_mk', 'goog.labs.i18n.ListFormatSymbols_ml', 'goog.labs.i18n.ListFormatSymbols_mn', 'goog.labs.i18n.ListFormatSymbols_mo', 'goog.labs.i18n.ListFormatSymbols_mr', 'goog.labs.i18n.ListFormatSymbols_ms', 'goog.labs.i18n.ListFormatSymbols_mt', 'goog.labs.i18n.ListFormatSymbols_my', 'goog.labs.i18n.ListFormatSymbols_nb', 'goog.labs.i18n.ListFormatSymbols_ne', 'goog.labs.i18n.ListFormatSymbols_nl', 'goog.labs.i18n.ListFormatSymbols_no', 'goog.labs.i18n.ListFormatSymbols_no_NO', 'goog.labs.i18n.ListFormatSymbols_or', 'goog.labs.i18n.ListFormatSymbols_pa', 'goog.labs.i18n.ListFormatSymbols_pl', 'goog.labs.i18n.ListFormatSymbols_pt', 'goog.labs.i18n.ListFormatSymbols_pt_BR', 'goog.labs.i18n.ListFormatSymbols_pt_PT', 'goog.labs.i18n.ListFormatSymbols_ro', 'goog.labs.i18n.ListFormatSymbols_ru', 'goog.labs.i18n.ListFormatSymbols_sh', 'goog.labs.i18n.ListFormatSymbols_si', 'goog.labs.i18n.ListFormatSymbols_sk', 'goog.labs.i18n.ListFormatSymbols_sl', 'goog.labs.i18n.ListFormatSymbols_sq', 'goog.labs.i18n.ListFormatSymbols_sr', 'goog.labs.i18n.ListFormatSymbols_sr_Latn', 'goog.labs.i18n.ListFormatSymbols_sv', 'goog.labs.i18n.ListFormatSymbols_sw', 'goog.labs.i18n.ListFormatSymbols_ta', 'goog.labs.i18n.ListFormatSymbols_te', 'goog.labs.i18n.ListFormatSymbols_th', 'goog.labs.i18n.ListFormatSymbols_tl', 'goog.labs.i18n.ListFormatSymbols_tr', 'goog.labs.i18n.ListFormatSymbols_uk', 'goog.labs.i18n.ListFormatSymbols_ur', 'goog.labs.i18n.ListFormatSymbols_uz', 'goog.labs.i18n.ListFormatSymbols_vi', 'goog.labs.i18n.ListFormatSymbols_zh', 'goog.labs.i18n.ListFormatSymbols_zh_CN', 'goog.labs.i18n.ListFormatSymbols_zh_HK', 'goog.labs.i18n.ListFormatSymbols_zh_TW', 'goog.labs.i18n.ListFormatSymbols_zu'], [], {});\ngoog.addDependency('labs/i18n/listsymbolsext.js', ['goog.labs.i18n.ListFormatSymbolsExt', 'goog.labs.i18n.ListFormatSymbols_af_NA', 'goog.labs.i18n.ListFormatSymbols_af_ZA', 'goog.labs.i18n.ListFormatSymbols_agq', 'goog.labs.i18n.ListFormatSymbols_agq_CM', 'goog.labs.i18n.ListFormatSymbols_ak', 'goog.labs.i18n.ListFormatSymbols_ak_GH', 'goog.labs.i18n.ListFormatSymbols_am_ET', 'goog.labs.i18n.ListFormatSymbols_ar_001', 'goog.labs.i18n.ListFormatSymbols_ar_AE', 'goog.labs.i18n.ListFormatSymbols_ar_BH', 'goog.labs.i18n.ListFormatSymbols_ar_DJ', 'goog.labs.i18n.ListFormatSymbols_ar_EH', 'goog.labs.i18n.ListFormatSymbols_ar_ER', 'goog.labs.i18n.ListFormatSymbols_ar_IL', 'goog.labs.i18n.ListFormatSymbols_ar_IQ', 'goog.labs.i18n.ListFormatSymbols_ar_JO', 'goog.labs.i18n.ListFormatSymbols_ar_KM', 'goog.labs.i18n.ListFormatSymbols_ar_KW', 'goog.labs.i18n.ListFormatSymbols_ar_LB', 'goog.labs.i18n.ListFormatSymbols_ar_LY', 'goog.labs.i18n.ListFormatSymbols_ar_MA', 'goog.labs.i18n.ListFormatSymbols_ar_MR', 'goog.labs.i18n.ListFormatSymbols_ar_OM', 'goog.labs.i18n.ListFormatSymbols_ar_PS', 'goog.labs.i18n.ListFormatSymbols_ar_QA', 'goog.labs.i18n.ListFormatSymbols_ar_SA', 'goog.labs.i18n.ListFormatSymbols_ar_SD', 'goog.labs.i18n.ListFormatSymbols_ar_SO', 'goog.labs.i18n.ListFormatSymbols_ar_SS', 'goog.labs.i18n.ListFormatSymbols_ar_SY', 'goog.labs.i18n.ListFormatSymbols_ar_TD', 'goog.labs.i18n.ListFormatSymbols_ar_TN', 'goog.labs.i18n.ListFormatSymbols_ar_XB', 'goog.labs.i18n.ListFormatSymbols_ar_YE', 'goog.labs.i18n.ListFormatSymbols_as', 'goog.labs.i18n.ListFormatSymbols_as_IN', 'goog.labs.i18n.ListFormatSymbols_asa', 'goog.labs.i18n.ListFormatSymbols_asa_TZ', 'goog.labs.i18n.ListFormatSymbols_ast', 'goog.labs.i18n.ListFormatSymbols_ast_ES', 'goog.labs.i18n.ListFormatSymbols_az_Cyrl', 'goog.labs.i18n.ListFormatSymbols_az_Cyrl_AZ', 'goog.labs.i18n.ListFormatSymbols_az_Latn', 'goog.labs.i18n.ListFormatSymbols_az_Latn_AZ', 'goog.labs.i18n.ListFormatSymbols_bas', 'goog.labs.i18n.ListFormatSymbols_bas_CM', 'goog.labs.i18n.ListFormatSymbols_be_BY', 'goog.labs.i18n.ListFormatSymbols_bem', 'goog.labs.i18n.ListFormatSymbols_bem_ZM', 'goog.labs.i18n.ListFormatSymbols_bez', 'goog.labs.i18n.ListFormatSymbols_bez_TZ', 'goog.labs.i18n.ListFormatSymbols_bg_BG', 'goog.labs.i18n.ListFormatSymbols_bm', 'goog.labs.i18n.ListFormatSymbols_bm_ML', 'goog.labs.i18n.ListFormatSymbols_bn_BD', 'goog.labs.i18n.ListFormatSymbols_bn_IN', 'goog.labs.i18n.ListFormatSymbols_bo', 'goog.labs.i18n.ListFormatSymbols_bo_CN', 'goog.labs.i18n.ListFormatSymbols_bo_IN', 'goog.labs.i18n.ListFormatSymbols_br_FR', 'goog.labs.i18n.ListFormatSymbols_brx', 'goog.labs.i18n.ListFormatSymbols_brx_IN', 'goog.labs.i18n.ListFormatSymbols_bs_Cyrl', 'goog.labs.i18n.ListFormatSymbols_bs_Cyrl_BA', 'goog.labs.i18n.ListFormatSymbols_bs_Latn', 'goog.labs.i18n.ListFormatSymbols_bs_Latn_BA', 'goog.labs.i18n.ListFormatSymbols_ca_AD', 'goog.labs.i18n.ListFormatSymbols_ca_ES', 'goog.labs.i18n.ListFormatSymbols_ca_FR', 'goog.labs.i18n.ListFormatSymbols_ca_IT', 'goog.labs.i18n.ListFormatSymbols_ccp', 'goog.labs.i18n.ListFormatSymbols_ccp_BD', 'goog.labs.i18n.ListFormatSymbols_ccp_IN', 'goog.labs.i18n.ListFormatSymbols_ce', 'goog.labs.i18n.ListFormatSymbols_ce_RU', 'goog.labs.i18n.ListFormatSymbols_ceb', 'goog.labs.i18n.ListFormatSymbols_ceb_PH', 'goog.labs.i18n.ListFormatSymbols_cgg', 'goog.labs.i18n.ListFormatSymbols_cgg_UG', 'goog.labs.i18n.ListFormatSymbols_chr_US', 'goog.labs.i18n.ListFormatSymbols_ckb', 'goog.labs.i18n.ListFormatSymbols_ckb_IQ', 'goog.labs.i18n.ListFormatSymbols_ckb_IR', 'goog.labs.i18n.ListFormatSymbols_cs_CZ', 'goog.labs.i18n.ListFormatSymbols_cy_GB', 'goog.labs.i18n.ListFormatSymbols_da_DK', 'goog.labs.i18n.ListFormatSymbols_da_GL', 'goog.labs.i18n.ListFormatSymbols_dav', 'goog.labs.i18n.ListFormatSymbols_dav_KE', 'goog.labs.i18n.ListFormatSymbols_de_BE', 'goog.labs.i18n.ListFormatSymbols_de_DE', 'goog.labs.i18n.ListFormatSymbols_de_IT', 'goog.labs.i18n.ListFormatSymbols_de_LI', 'goog.labs.i18n.ListFormatSymbols_de_LU', 'goog.labs.i18n.ListFormatSymbols_dje', 'goog.labs.i18n.ListFormatSymbols_dje_NE', 'goog.labs.i18n.ListFormatSymbols_dsb', 'goog.labs.i18n.ListFormatSymbols_dsb_DE', 'goog.labs.i18n.ListFormatSymbols_dua', 'goog.labs.i18n.ListFormatSymbols_dua_CM', 'goog.labs.i18n.ListFormatSymbols_dyo', 'goog.labs.i18n.ListFormatSymbols_dyo_SN', 'goog.labs.i18n.ListFormatSymbols_dz', 'goog.labs.i18n.ListFormatSymbols_dz_BT', 'goog.labs.i18n.ListFormatSymbols_ebu', 'goog.labs.i18n.ListFormatSymbols_ebu_KE', 'goog.labs.i18n.ListFormatSymbols_ee', 'goog.labs.i18n.ListFormatSymbols_ee_GH', 'goog.labs.i18n.ListFormatSymbols_ee_TG', 'goog.labs.i18n.ListFormatSymbols_el_CY', 'goog.labs.i18n.ListFormatSymbols_el_GR', 'goog.labs.i18n.ListFormatSymbols_en_001', 'goog.labs.i18n.ListFormatSymbols_en_150', 'goog.labs.i18n.ListFormatSymbols_en_AE', 'goog.labs.i18n.ListFormatSymbols_en_AG', 'goog.labs.i18n.ListFormatSymbols_en_AI', 'goog.labs.i18n.ListFormatSymbols_en_AS', 'goog.labs.i18n.ListFormatSymbols_en_AT', 'goog.labs.i18n.ListFormatSymbols_en_BB', 'goog.labs.i18n.ListFormatSymbols_en_BE', 'goog.labs.i18n.ListFormatSymbols_en_BI', 'goog.labs.i18n.ListFormatSymbols_en_BM', 'goog.labs.i18n.ListFormatSymbols_en_BS', 'goog.labs.i18n.ListFormatSymbols_en_BW', 'goog.labs.i18n.ListFormatSymbols_en_BZ', 'goog.labs.i18n.ListFormatSymbols_en_CC', 'goog.labs.i18n.ListFormatSymbols_en_CH', 'goog.labs.i18n.ListFormatSymbols_en_CK', 'goog.labs.i18n.ListFormatSymbols_en_CM', 'goog.labs.i18n.ListFormatSymbols_en_CX', 'goog.labs.i18n.ListFormatSymbols_en_CY', 'goog.labs.i18n.ListFormatSymbols_en_DE', 'goog.labs.i18n.ListFormatSymbols_en_DG', 'goog.labs.i18n.ListFormatSymbols_en_DK', 'goog.labs.i18n.ListFormatSymbols_en_DM', 'goog.labs.i18n.ListFormatSymbols_en_ER', 'goog.labs.i18n.ListFormatSymbols_en_FI', 'goog.labs.i18n.ListFormatSymbols_en_FJ', 'goog.labs.i18n.ListFormatSymbols_en_FK', 'goog.labs.i18n.ListFormatSymbols_en_FM', 'goog.labs.i18n.ListFormatSymbols_en_GD', 'goog.labs.i18n.ListFormatSymbols_en_GG', 'goog.labs.i18n.ListFormatSymbols_en_GH', 'goog.labs.i18n.ListFormatSymbols_en_GI', 'goog.labs.i18n.ListFormatSymbols_en_GM', 'goog.labs.i18n.ListFormatSymbols_en_GU', 'goog.labs.i18n.ListFormatSymbols_en_GY', 'goog.labs.i18n.ListFormatSymbols_en_HK', 'goog.labs.i18n.ListFormatSymbols_en_IL', 'goog.labs.i18n.ListFormatSymbols_en_IM', 'goog.labs.i18n.ListFormatSymbols_en_IO', 'goog.labs.i18n.ListFormatSymbols_en_JE', 'goog.labs.i18n.ListFormatSymbols_en_JM', 'goog.labs.i18n.ListFormatSymbols_en_KE', 'goog.labs.i18n.ListFormatSymbols_en_KI', 'goog.labs.i18n.ListFormatSymbols_en_KN', 'goog.labs.i18n.ListFormatSymbols_en_KY', 'goog.labs.i18n.ListFormatSymbols_en_LC', 'goog.labs.i18n.ListFormatSymbols_en_LR', 'goog.labs.i18n.ListFormatSymbols_en_LS', 'goog.labs.i18n.ListFormatSymbols_en_MG', 'goog.labs.i18n.ListFormatSymbols_en_MH', 'goog.labs.i18n.ListFormatSymbols_en_MO', 'goog.labs.i18n.ListFormatSymbols_en_MP', 'goog.labs.i18n.ListFormatSymbols_en_MS', 'goog.labs.i18n.ListFormatSymbols_en_MT', 'goog.labs.i18n.ListFormatSymbols_en_MU', 'goog.labs.i18n.ListFormatSymbols_en_MW', 'goog.labs.i18n.ListFormatSymbols_en_MY', 'goog.labs.i18n.ListFormatSymbols_en_NA', 'goog.labs.i18n.ListFormatSymbols_en_NF', 'goog.labs.i18n.ListFormatSymbols_en_NG', 'goog.labs.i18n.ListFormatSymbols_en_NL', 'goog.labs.i18n.ListFormatSymbols_en_NR', 'goog.labs.i18n.ListFormatSymbols_en_NU', 'goog.labs.i18n.ListFormatSymbols_en_NZ', 'goog.labs.i18n.ListFormatSymbols_en_PG', 'goog.labs.i18n.ListFormatSymbols_en_PH', 'goog.labs.i18n.ListFormatSymbols_en_PK', 'goog.labs.i18n.ListFormatSymbols_en_PN', 'goog.labs.i18n.ListFormatSymbols_en_PR', 'goog.labs.i18n.ListFormatSymbols_en_PW', 'goog.labs.i18n.ListFormatSymbols_en_RW', 'goog.labs.i18n.ListFormatSymbols_en_SB', 'goog.labs.i18n.ListFormatSymbols_en_SC', 'goog.labs.i18n.ListFormatSymbols_en_SD', 'goog.labs.i18n.ListFormatSymbols_en_SE', 'goog.labs.i18n.ListFormatSymbols_en_SH', 'goog.labs.i18n.ListFormatSymbols_en_SI', 'goog.labs.i18n.ListFormatSymbols_en_SL', 'goog.labs.i18n.ListFormatSymbols_en_SS', 'goog.labs.i18n.ListFormatSymbols_en_SX', 'goog.labs.i18n.ListFormatSymbols_en_SZ', 'goog.labs.i18n.ListFormatSymbols_en_TC', 'goog.labs.i18n.ListFormatSymbols_en_TK', 'goog.labs.i18n.ListFormatSymbols_en_TO', 'goog.labs.i18n.ListFormatSymbols_en_TT', 'goog.labs.i18n.ListFormatSymbols_en_TV', 'goog.labs.i18n.ListFormatSymbols_en_TZ', 'goog.labs.i18n.ListFormatSymbols_en_UG', 'goog.labs.i18n.ListFormatSymbols_en_UM', 'goog.labs.i18n.ListFormatSymbols_en_US_POSIX', 'goog.labs.i18n.ListFormatSymbols_en_VC', 'goog.labs.i18n.ListFormatSymbols_en_VG', 'goog.labs.i18n.ListFormatSymbols_en_VI', 'goog.labs.i18n.ListFormatSymbols_en_VU', 'goog.labs.i18n.ListFormatSymbols_en_WS', 'goog.labs.i18n.ListFormatSymbols_en_XA', 'goog.labs.i18n.ListFormatSymbols_en_ZM', 'goog.labs.i18n.ListFormatSymbols_en_ZW', 'goog.labs.i18n.ListFormatSymbols_eo', 'goog.labs.i18n.ListFormatSymbols_eo_001', 'goog.labs.i18n.ListFormatSymbols_es_AR', 'goog.labs.i18n.ListFormatSymbols_es_BO', 'goog.labs.i18n.ListFormatSymbols_es_BR', 'goog.labs.i18n.ListFormatSymbols_es_BZ', 'goog.labs.i18n.ListFormatSymbols_es_CL', 'goog.labs.i18n.ListFormatSymbols_es_CO', 'goog.labs.i18n.ListFormatSymbols_es_CR', 'goog.labs.i18n.ListFormatSymbols_es_CU', 'goog.labs.i18n.ListFormatSymbols_es_DO', 'goog.labs.i18n.ListFormatSymbols_es_EA', 'goog.labs.i18n.ListFormatSymbols_es_EC', 'goog.labs.i18n.ListFormatSymbols_es_GQ', 'goog.labs.i18n.ListFormatSymbols_es_GT', 'goog.labs.i18n.ListFormatSymbols_es_HN', 'goog.labs.i18n.ListFormatSymbols_es_IC', 'goog.labs.i18n.ListFormatSymbols_es_NI', 'goog.labs.i18n.ListFormatSymbols_es_PA', 'goog.labs.i18n.ListFormatSymbols_es_PE', 'goog.labs.i18n.ListFormatSymbols_es_PH', 'goog.labs.i18n.ListFormatSymbols_es_PR', 'goog.labs.i18n.ListFormatSymbols_es_PY', 'goog.labs.i18n.ListFormatSymbols_es_SV', 'goog.labs.i18n.ListFormatSymbols_es_UY', 'goog.labs.i18n.ListFormatSymbols_es_VE', 'goog.labs.i18n.ListFormatSymbols_et_EE', 'goog.labs.i18n.ListFormatSymbols_eu_ES', 'goog.labs.i18n.ListFormatSymbols_ewo', 'goog.labs.i18n.ListFormatSymbols_ewo_CM', 'goog.labs.i18n.ListFormatSymbols_fa_AF', 'goog.labs.i18n.ListFormatSymbols_fa_IR', 'goog.labs.i18n.ListFormatSymbols_ff', 'goog.labs.i18n.ListFormatSymbols_ff_Latn', 'goog.labs.i18n.ListFormatSymbols_ff_Latn_BF', 'goog.labs.i18n.ListFormatSymbols_ff_Latn_CM', 'goog.labs.i18n.ListFormatSymbols_ff_Latn_GH', 'goog.labs.i18n.ListFormatSymbols_ff_Latn_GM', 'goog.labs.i18n.ListFormatSymbols_ff_Latn_GN', 'goog.labs.i18n.ListFormatSymbols_ff_Latn_GW', 'goog.labs.i18n.ListFormatSymbols_ff_Latn_LR', 'goog.labs.i18n.ListFormatSymbols_ff_Latn_MR', 'goog.labs.i18n.ListFormatSymbols_ff_Latn_NE', 'goog.labs.i18n.ListFormatSymbols_ff_Latn_NG', 'goog.labs.i18n.ListFormatSymbols_ff_Latn_SL', 'goog.labs.i18n.ListFormatSymbols_ff_Latn_SN', 'goog.labs.i18n.ListFormatSymbols_fi_FI', 'goog.labs.i18n.ListFormatSymbols_fil_PH', 'goog.labs.i18n.ListFormatSymbols_fo', 'goog.labs.i18n.ListFormatSymbols_fo_DK', 'goog.labs.i18n.ListFormatSymbols_fo_FO', 'goog.labs.i18n.ListFormatSymbols_fr_BE', 'goog.labs.i18n.ListFormatSymbols_fr_BF', 'goog.labs.i18n.ListFormatSymbols_fr_BI', 'goog.labs.i18n.ListFormatSymbols_fr_BJ', 'goog.labs.i18n.ListFormatSymbols_fr_BL', 'goog.labs.i18n.ListFormatSymbols_fr_CD', 'goog.labs.i18n.ListFormatSymbols_fr_CF', 'goog.labs.i18n.ListFormatSymbols_fr_CG', 'goog.labs.i18n.ListFormatSymbols_fr_CH', 'goog.labs.i18n.ListFormatSymbols_fr_CI', 'goog.labs.i18n.ListFormatSymbols_fr_CM', 'goog.labs.i18n.ListFormatSymbols_fr_DJ', 'goog.labs.i18n.ListFormatSymbols_fr_DZ', 'goog.labs.i18n.ListFormatSymbols_fr_FR', 'goog.labs.i18n.ListFormatSymbols_fr_GA', 'goog.labs.i18n.ListFormatSymbols_fr_GF', 'goog.labs.i18n.ListFormatSymbols_fr_GN', 'goog.labs.i18n.ListFormatSymbols_fr_GP', 'goog.labs.i18n.ListFormatSymbols_fr_GQ', 'goog.labs.i18n.ListFormatSymbols_fr_HT', 'goog.labs.i18n.ListFormatSymbols_fr_KM', 'goog.labs.i18n.ListFormatSymbols_fr_LU', 'goog.labs.i18n.ListFormatSymbols_fr_MA', 'goog.labs.i18n.ListFormatSymbols_fr_MC', 'goog.labs.i18n.ListFormatSymbols_fr_MF', 'goog.labs.i18n.ListFormatSymbols_fr_MG', 'goog.labs.i18n.ListFormatSymbols_fr_ML', 'goog.labs.i18n.ListFormatSymbols_fr_MQ', 'goog.labs.i18n.ListFormatSymbols_fr_MR', 'goog.labs.i18n.ListFormatSymbols_fr_MU', 'goog.labs.i18n.ListFormatSymbols_fr_NC', 'goog.labs.i18n.ListFormatSymbols_fr_NE', 'goog.labs.i18n.ListFormatSymbols_fr_PF', 'goog.labs.i18n.ListFormatSymbols_fr_PM', 'goog.labs.i18n.ListFormatSymbols_fr_RE', 'goog.labs.i18n.ListFormatSymbols_fr_RW', 'goog.labs.i18n.ListFormatSymbols_fr_SC', 'goog.labs.i18n.ListFormatSymbols_fr_SN', 'goog.labs.i18n.ListFormatSymbols_fr_SY', 'goog.labs.i18n.ListFormatSymbols_fr_TD', 'goog.labs.i18n.ListFormatSymbols_fr_TG', 'goog.labs.i18n.ListFormatSymbols_fr_TN', 'goog.labs.i18n.ListFormatSymbols_fr_VU', 'goog.labs.i18n.ListFormatSymbols_fr_WF', 'goog.labs.i18n.ListFormatSymbols_fr_YT', 'goog.labs.i18n.ListFormatSymbols_fur', 'goog.labs.i18n.ListFormatSymbols_fur_IT', 'goog.labs.i18n.ListFormatSymbols_fy', 'goog.labs.i18n.ListFormatSymbols_fy_NL', 'goog.labs.i18n.ListFormatSymbols_ga_IE', 'goog.labs.i18n.ListFormatSymbols_gd', 'goog.labs.i18n.ListFormatSymbols_gd_GB', 'goog.labs.i18n.ListFormatSymbols_gl_ES', 'goog.labs.i18n.ListFormatSymbols_gsw_CH', 'goog.labs.i18n.ListFormatSymbols_gsw_FR', 'goog.labs.i18n.ListFormatSymbols_gsw_LI', 'goog.labs.i18n.ListFormatSymbols_gu_IN', 'goog.labs.i18n.ListFormatSymbols_guz', 'goog.labs.i18n.ListFormatSymbols_guz_KE', 'goog.labs.i18n.ListFormatSymbols_gv', 'goog.labs.i18n.ListFormatSymbols_gv_IM', 'goog.labs.i18n.ListFormatSymbols_ha', 'goog.labs.i18n.ListFormatSymbols_ha_GH', 'goog.labs.i18n.ListFormatSymbols_ha_NE', 'goog.labs.i18n.ListFormatSymbols_ha_NG', 'goog.labs.i18n.ListFormatSymbols_haw_US', 'goog.labs.i18n.ListFormatSymbols_he_IL', 'goog.labs.i18n.ListFormatSymbols_hi_IN', 'goog.labs.i18n.ListFormatSymbols_hr_BA', 'goog.labs.i18n.ListFormatSymbols_hr_HR', 'goog.labs.i18n.ListFormatSymbols_hsb', 'goog.labs.i18n.ListFormatSymbols_hsb_DE', 'goog.labs.i18n.ListFormatSymbols_hu_HU', 'goog.labs.i18n.ListFormatSymbols_hy_AM', 'goog.labs.i18n.ListFormatSymbols_ia', 'goog.labs.i18n.ListFormatSymbols_ia_001', 'goog.labs.i18n.ListFormatSymbols_id_ID', 'goog.labs.i18n.ListFormatSymbols_ig', 'goog.labs.i18n.ListFormatSymbols_ig_NG', 'goog.labs.i18n.ListFormatSymbols_ii', 'goog.labs.i18n.ListFormatSymbols_ii_CN', 'goog.labs.i18n.ListFormatSymbols_is_IS', 'goog.labs.i18n.ListFormatSymbols_it_CH', 'goog.labs.i18n.ListFormatSymbols_it_IT', 'goog.labs.i18n.ListFormatSymbols_it_SM', 'goog.labs.i18n.ListFormatSymbols_it_VA', 'goog.labs.i18n.ListFormatSymbols_ja_JP', 'goog.labs.i18n.ListFormatSymbols_jgo', 'goog.labs.i18n.ListFormatSymbols_jgo_CM', 'goog.labs.i18n.ListFormatSymbols_jmc', 'goog.labs.i18n.ListFormatSymbols_jmc_TZ', 'goog.labs.i18n.ListFormatSymbols_jv', 'goog.labs.i18n.ListFormatSymbols_jv_ID', 'goog.labs.i18n.ListFormatSymbols_ka_GE', 'goog.labs.i18n.ListFormatSymbols_kab', 'goog.labs.i18n.ListFormatSymbols_kab_DZ', 'goog.labs.i18n.ListFormatSymbols_kam', 'goog.labs.i18n.ListFormatSymbols_kam_KE', 'goog.labs.i18n.ListFormatSymbols_kde', 'goog.labs.i18n.ListFormatSymbols_kde_TZ', 'goog.labs.i18n.ListFormatSymbols_kea', 'goog.labs.i18n.ListFormatSymbols_kea_CV', 'goog.labs.i18n.ListFormatSymbols_khq', 'goog.labs.i18n.ListFormatSymbols_khq_ML', 'goog.labs.i18n.ListFormatSymbols_ki', 'goog.labs.i18n.ListFormatSymbols_ki_KE', 'goog.labs.i18n.ListFormatSymbols_kk_KZ', 'goog.labs.i18n.ListFormatSymbols_kkj', 'goog.labs.i18n.ListFormatSymbols_kkj_CM', 'goog.labs.i18n.ListFormatSymbols_kl', 'goog.labs.i18n.ListFormatSymbols_kl_GL', 'goog.labs.i18n.ListFormatSymbols_kln', 'goog.labs.i18n.ListFormatSymbols_kln_KE', 'goog.labs.i18n.ListFormatSymbols_km_KH', 'goog.labs.i18n.ListFormatSymbols_kn_IN', 'goog.labs.i18n.ListFormatSymbols_ko_KP', 'goog.labs.i18n.ListFormatSymbols_ko_KR', 'goog.labs.i18n.ListFormatSymbols_kok', 'goog.labs.i18n.ListFormatSymbols_kok_IN', 'goog.labs.i18n.ListFormatSymbols_ks', 'goog.labs.i18n.ListFormatSymbols_ks_IN', 'goog.labs.i18n.ListFormatSymbols_ksb', 'goog.labs.i18n.ListFormatSymbols_ksb_TZ', 'goog.labs.i18n.ListFormatSymbols_ksf', 'goog.labs.i18n.ListFormatSymbols_ksf_CM', 'goog.labs.i18n.ListFormatSymbols_ksh', 'goog.labs.i18n.ListFormatSymbols_ksh_DE', 'goog.labs.i18n.ListFormatSymbols_ku', 'goog.labs.i18n.ListFormatSymbols_ku_TR', 'goog.labs.i18n.ListFormatSymbols_kw', 'goog.labs.i18n.ListFormatSymbols_kw_GB', 'goog.labs.i18n.ListFormatSymbols_ky_KG', 'goog.labs.i18n.ListFormatSymbols_lag', 'goog.labs.i18n.ListFormatSymbols_lag_TZ', 'goog.labs.i18n.ListFormatSymbols_lb', 'goog.labs.i18n.ListFormatSymbols_lb_LU', 'goog.labs.i18n.ListFormatSymbols_lg', 'goog.labs.i18n.ListFormatSymbols_lg_UG', 'goog.labs.i18n.ListFormatSymbols_lkt', 'goog.labs.i18n.ListFormatSymbols_lkt_US', 'goog.labs.i18n.ListFormatSymbols_ln_AO', 'goog.labs.i18n.ListFormatSymbols_ln_CD', 'goog.labs.i18n.ListFormatSymbols_ln_CF', 'goog.labs.i18n.ListFormatSymbols_ln_CG', 'goog.labs.i18n.ListFormatSymbols_lo_LA', 'goog.labs.i18n.ListFormatSymbols_lrc', 'goog.labs.i18n.ListFormatSymbols_lrc_IQ', 'goog.labs.i18n.ListFormatSymbols_lrc_IR', 'goog.labs.i18n.ListFormatSymbols_lt_LT', 'goog.labs.i18n.ListFormatSymbols_lu', 'goog.labs.i18n.ListFormatSymbols_lu_CD', 'goog.labs.i18n.ListFormatSymbols_luo', 'goog.labs.i18n.ListFormatSymbols_luo_KE', 'goog.labs.i18n.ListFormatSymbols_luy', 'goog.labs.i18n.ListFormatSymbols_luy_KE', 'goog.labs.i18n.ListFormatSymbols_lv_LV', 'goog.labs.i18n.ListFormatSymbols_mas', 'goog.labs.i18n.ListFormatSymbols_mas_KE', 'goog.labs.i18n.ListFormatSymbols_mas_TZ', 'goog.labs.i18n.ListFormatSymbols_mer', 'goog.labs.i18n.ListFormatSymbols_mer_KE', 'goog.labs.i18n.ListFormatSymbols_mfe', 'goog.labs.i18n.ListFormatSymbols_mfe_MU', 'goog.labs.i18n.ListFormatSymbols_mg', 'goog.labs.i18n.ListFormatSymbols_mg_MG', 'goog.labs.i18n.ListFormatSymbols_mgh', 'goog.labs.i18n.ListFormatSymbols_mgh_MZ', 'goog.labs.i18n.ListFormatSymbols_mgo', 'goog.labs.i18n.ListFormatSymbols_mgo_CM', 'goog.labs.i18n.ListFormatSymbols_mi', 'goog.labs.i18n.ListFormatSymbols_mi_NZ', 'goog.labs.i18n.ListFormatSymbols_mk_MK', 'goog.labs.i18n.ListFormatSymbols_ml_IN', 'goog.labs.i18n.ListFormatSymbols_mn_MN', 'goog.labs.i18n.ListFormatSymbols_mr_IN', 'goog.labs.i18n.ListFormatSymbols_ms_BN', 'goog.labs.i18n.ListFormatSymbols_ms_MY', 'goog.labs.i18n.ListFormatSymbols_ms_SG', 'goog.labs.i18n.ListFormatSymbols_mt_MT', 'goog.labs.i18n.ListFormatSymbols_mua', 'goog.labs.i18n.ListFormatSymbols_mua_CM', 'goog.labs.i18n.ListFormatSymbols_my_MM', 'goog.labs.i18n.ListFormatSymbols_mzn', 'goog.labs.i18n.ListFormatSymbols_mzn_IR', 'goog.labs.i18n.ListFormatSymbols_naq', 'goog.labs.i18n.ListFormatSymbols_naq_NA', 'goog.labs.i18n.ListFormatSymbols_nb_NO', 'goog.labs.i18n.ListFormatSymbols_nb_SJ', 'goog.labs.i18n.ListFormatSymbols_nd', 'goog.labs.i18n.ListFormatSymbols_nd_ZW', 'goog.labs.i18n.ListFormatSymbols_nds', 'goog.labs.i18n.ListFormatSymbols_nds_DE', 'goog.labs.i18n.ListFormatSymbols_nds_NL', 'goog.labs.i18n.ListFormatSymbols_ne_IN', 'goog.labs.i18n.ListFormatSymbols_ne_NP', 'goog.labs.i18n.ListFormatSymbols_nl_AW', 'goog.labs.i18n.ListFormatSymbols_nl_BE', 'goog.labs.i18n.ListFormatSymbols_nl_BQ', 'goog.labs.i18n.ListFormatSymbols_nl_CW', 'goog.labs.i18n.ListFormatSymbols_nl_NL', 'goog.labs.i18n.ListFormatSymbols_nl_SR', 'goog.labs.i18n.ListFormatSymbols_nl_SX', 'goog.labs.i18n.ListFormatSymbols_nmg', 'goog.labs.i18n.ListFormatSymbols_nmg_CM', 'goog.labs.i18n.ListFormatSymbols_nn', 'goog.labs.i18n.ListFormatSymbols_nn_NO', 'goog.labs.i18n.ListFormatSymbols_nnh', 'goog.labs.i18n.ListFormatSymbols_nnh_CM', 'goog.labs.i18n.ListFormatSymbols_nus', 'goog.labs.i18n.ListFormatSymbols_nus_SS', 'goog.labs.i18n.ListFormatSymbols_nyn', 'goog.labs.i18n.ListFormatSymbols_nyn_UG', 'goog.labs.i18n.ListFormatSymbols_om', 'goog.labs.i18n.ListFormatSymbols_om_ET', 'goog.labs.i18n.ListFormatSymbols_om_KE', 'goog.labs.i18n.ListFormatSymbols_or_IN', 'goog.labs.i18n.ListFormatSymbols_os', 'goog.labs.i18n.ListFormatSymbols_os_GE', 'goog.labs.i18n.ListFormatSymbols_os_RU', 'goog.labs.i18n.ListFormatSymbols_pa_Arab', 'goog.labs.i18n.ListFormatSymbols_pa_Arab_PK', 'goog.labs.i18n.ListFormatSymbols_pa_Guru', 'goog.labs.i18n.ListFormatSymbols_pa_Guru_IN', 'goog.labs.i18n.ListFormatSymbols_pl_PL', 'goog.labs.i18n.ListFormatSymbols_ps', 'goog.labs.i18n.ListFormatSymbols_ps_AF', 'goog.labs.i18n.ListFormatSymbols_ps_PK', 'goog.labs.i18n.ListFormatSymbols_pt_AO', 'goog.labs.i18n.ListFormatSymbols_pt_CH', 'goog.labs.i18n.ListFormatSymbols_pt_CV', 'goog.labs.i18n.ListFormatSymbols_pt_GQ', 'goog.labs.i18n.ListFormatSymbols_pt_GW', 'goog.labs.i18n.ListFormatSymbols_pt_LU', 'goog.labs.i18n.ListFormatSymbols_pt_MO', 'goog.labs.i18n.ListFormatSymbols_pt_MZ', 'goog.labs.i18n.ListFormatSymbols_pt_ST', 'goog.labs.i18n.ListFormatSymbols_pt_TL', 'goog.labs.i18n.ListFormatSymbols_qu', 'goog.labs.i18n.ListFormatSymbols_qu_BO', 'goog.labs.i18n.ListFormatSymbols_qu_EC', 'goog.labs.i18n.ListFormatSymbols_qu_PE', 'goog.labs.i18n.ListFormatSymbols_rm', 'goog.labs.i18n.ListFormatSymbols_rm_CH', 'goog.labs.i18n.ListFormatSymbols_rn', 'goog.labs.i18n.ListFormatSymbols_rn_BI', 'goog.labs.i18n.ListFormatSymbols_ro_MD', 'goog.labs.i18n.ListFormatSymbols_ro_RO', 'goog.labs.i18n.ListFormatSymbols_rof', 'goog.labs.i18n.ListFormatSymbols_rof_TZ', 'goog.labs.i18n.ListFormatSymbols_ru_BY', 'goog.labs.i18n.ListFormatSymbols_ru_KG', 'goog.labs.i18n.ListFormatSymbols_ru_KZ', 'goog.labs.i18n.ListFormatSymbols_ru_MD', 'goog.labs.i18n.ListFormatSymbols_ru_RU', 'goog.labs.i18n.ListFormatSymbols_ru_UA', 'goog.labs.i18n.ListFormatSymbols_rw', 'goog.labs.i18n.ListFormatSymbols_rw_RW', 'goog.labs.i18n.ListFormatSymbols_rwk', 'goog.labs.i18n.ListFormatSymbols_rwk_TZ', 'goog.labs.i18n.ListFormatSymbols_sah', 'goog.labs.i18n.ListFormatSymbols_sah_RU', 'goog.labs.i18n.ListFormatSymbols_saq', 'goog.labs.i18n.ListFormatSymbols_saq_KE', 'goog.labs.i18n.ListFormatSymbols_sbp', 'goog.labs.i18n.ListFormatSymbols_sbp_TZ', 'goog.labs.i18n.ListFormatSymbols_sd', 'goog.labs.i18n.ListFormatSymbols_sd_PK', 'goog.labs.i18n.ListFormatSymbols_se', 'goog.labs.i18n.ListFormatSymbols_se_FI', 'goog.labs.i18n.ListFormatSymbols_se_NO', 'goog.labs.i18n.ListFormatSymbols_se_SE', 'goog.labs.i18n.ListFormatSymbols_seh', 'goog.labs.i18n.ListFormatSymbols_seh_MZ', 'goog.labs.i18n.ListFormatSymbols_ses', 'goog.labs.i18n.ListFormatSymbols_ses_ML', 'goog.labs.i18n.ListFormatSymbols_sg', 'goog.labs.i18n.ListFormatSymbols_sg_CF', 'goog.labs.i18n.ListFormatSymbols_shi', 'goog.labs.i18n.ListFormatSymbols_shi_Latn', 'goog.labs.i18n.ListFormatSymbols_shi_Latn_MA', 'goog.labs.i18n.ListFormatSymbols_shi_Tfng', 'goog.labs.i18n.ListFormatSymbols_shi_Tfng_MA', 'goog.labs.i18n.ListFormatSymbols_si_LK', 'goog.labs.i18n.ListFormatSymbols_sk_SK', 'goog.labs.i18n.ListFormatSymbols_sl_SI', 'goog.labs.i18n.ListFormatSymbols_smn', 'goog.labs.i18n.ListFormatSymbols_smn_FI', 'goog.labs.i18n.ListFormatSymbols_sn', 'goog.labs.i18n.ListFormatSymbols_sn_ZW', 'goog.labs.i18n.ListFormatSymbols_so', 'goog.labs.i18n.ListFormatSymbols_so_DJ', 'goog.labs.i18n.ListFormatSymbols_so_ET', 'goog.labs.i18n.ListFormatSymbols_so_KE', 'goog.labs.i18n.ListFormatSymbols_so_SO', 'goog.labs.i18n.ListFormatSymbols_sq_AL', 'goog.labs.i18n.ListFormatSymbols_sq_MK', 'goog.labs.i18n.ListFormatSymbols_sq_XK', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_BA', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_ME', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_RS', 'goog.labs.i18n.ListFormatSymbols_sr_Cyrl_XK', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_BA', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_ME', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_RS', 'goog.labs.i18n.ListFormatSymbols_sr_Latn_XK', 'goog.labs.i18n.ListFormatSymbols_sv_AX', 'goog.labs.i18n.ListFormatSymbols_sv_FI', 'goog.labs.i18n.ListFormatSymbols_sv_SE', 'goog.labs.i18n.ListFormatSymbols_sw_CD', 'goog.labs.i18n.ListFormatSymbols_sw_KE', 'goog.labs.i18n.ListFormatSymbols_sw_TZ', 'goog.labs.i18n.ListFormatSymbols_sw_UG', 'goog.labs.i18n.ListFormatSymbols_ta_IN', 'goog.labs.i18n.ListFormatSymbols_ta_LK', 'goog.labs.i18n.ListFormatSymbols_ta_MY', 'goog.labs.i18n.ListFormatSymbols_ta_SG', 'goog.labs.i18n.ListFormatSymbols_te_IN', 'goog.labs.i18n.ListFormatSymbols_teo', 'goog.labs.i18n.ListFormatSymbols_teo_KE', 'goog.labs.i18n.ListFormatSymbols_teo_UG', 'goog.labs.i18n.ListFormatSymbols_tg', 'goog.labs.i18n.ListFormatSymbols_tg_TJ', 'goog.labs.i18n.ListFormatSymbols_th_TH', 'goog.labs.i18n.ListFormatSymbols_ti', 'goog.labs.i18n.ListFormatSymbols_ti_ER', 'goog.labs.i18n.ListFormatSymbols_ti_ET', 'goog.labs.i18n.ListFormatSymbols_tk', 'goog.labs.i18n.ListFormatSymbols_tk_TM', 'goog.labs.i18n.ListFormatSymbols_to', 'goog.labs.i18n.ListFormatSymbols_to_TO', 'goog.labs.i18n.ListFormatSymbols_tr_CY', 'goog.labs.i18n.ListFormatSymbols_tr_TR', 'goog.labs.i18n.ListFormatSymbols_tt', 'goog.labs.i18n.ListFormatSymbols_tt_RU', 'goog.labs.i18n.ListFormatSymbols_twq', 'goog.labs.i18n.ListFormatSymbols_twq_NE', 'goog.labs.i18n.ListFormatSymbols_tzm', 'goog.labs.i18n.ListFormatSymbols_tzm_MA', 'goog.labs.i18n.ListFormatSymbols_ug', 'goog.labs.i18n.ListFormatSymbols_ug_CN', 'goog.labs.i18n.ListFormatSymbols_uk_UA', 'goog.labs.i18n.ListFormatSymbols_ur_IN', 'goog.labs.i18n.ListFormatSymbols_ur_PK', 'goog.labs.i18n.ListFormatSymbols_uz_Arab', 'goog.labs.i18n.ListFormatSymbols_uz_Arab_AF', 'goog.labs.i18n.ListFormatSymbols_uz_Cyrl', 'goog.labs.i18n.ListFormatSymbols_uz_Cyrl_UZ', 'goog.labs.i18n.ListFormatSymbols_uz_Latn', 'goog.labs.i18n.ListFormatSymbols_uz_Latn_UZ', 'goog.labs.i18n.ListFormatSymbols_vai', 'goog.labs.i18n.ListFormatSymbols_vai_Latn', 'goog.labs.i18n.ListFormatSymbols_vai_Latn_LR', 'goog.labs.i18n.ListFormatSymbols_vai_Vaii', 'goog.labs.i18n.ListFormatSymbols_vai_Vaii_LR', 'goog.labs.i18n.ListFormatSymbols_vi_VN', 'goog.labs.i18n.ListFormatSymbols_vun', 'goog.labs.i18n.ListFormatSymbols_vun_TZ', 'goog.labs.i18n.ListFormatSymbols_wae', 'goog.labs.i18n.ListFormatSymbols_wae_CH', 'goog.labs.i18n.ListFormatSymbols_wo', 'goog.labs.i18n.ListFormatSymbols_wo_SN', 'goog.labs.i18n.ListFormatSymbols_xh', 'goog.labs.i18n.ListFormatSymbols_xh_ZA', 'goog.labs.i18n.ListFormatSymbols_xog', 'goog.labs.i18n.ListFormatSymbols_xog_UG', 'goog.labs.i18n.ListFormatSymbols_yav', 'goog.labs.i18n.ListFormatSymbols_yav_CM', 'goog.labs.i18n.ListFormatSymbols_yi', 'goog.labs.i18n.ListFormatSymbols_yi_001', 'goog.labs.i18n.ListFormatSymbols_yo', 'goog.labs.i18n.ListFormatSymbols_yo_BJ', 'goog.labs.i18n.ListFormatSymbols_yo_NG', 'goog.labs.i18n.ListFormatSymbols_yue', 'goog.labs.i18n.ListFormatSymbols_yue_Hans', 'goog.labs.i18n.ListFormatSymbols_yue_Hans_CN', 'goog.labs.i18n.ListFormatSymbols_yue_Hant', 'goog.labs.i18n.ListFormatSymbols_yue_Hant_HK', 'goog.labs.i18n.ListFormatSymbols_zgh', 'goog.labs.i18n.ListFormatSymbols_zgh_MA', 'goog.labs.i18n.ListFormatSymbols_zh_Hans', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_CN', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_HK', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_MO', 'goog.labs.i18n.ListFormatSymbols_zh_Hans_SG', 'goog.labs.i18n.ListFormatSymbols_zh_Hant', 'goog.labs.i18n.ListFormatSymbols_zh_Hant_HK', 'goog.labs.i18n.ListFormatSymbols_zh_Hant_MO', 'goog.labs.i18n.ListFormatSymbols_zh_Hant_TW', 'goog.labs.i18n.ListFormatSymbols_zu_ZA'], ['goog.labs.i18n.ListFormatSymbols'], {});\ngoog.addDependency('labs/mock/mock.js', ['goog.labs.mock', 'goog.labs.mock.TimeoutError', 'goog.labs.mock.VerificationError'], ['goog.array', 'goog.asserts', 'goog.debug', 'goog.debug.Error', 'goog.functions', 'goog.labs.mock.timeout', 'goog.labs.mock.timeout.TimeoutMode', 'goog.labs.mock.verification', 'goog.labs.mock.verification.BaseVerificationMode', 'goog.labs.mock.verification.VerificationMode', 'goog.object'], {'lang': 'es6'});\ngoog.addDependency('labs/mock/mock_test.js', ['goog.labs.mockTest'], ['goog.array', 'goog.labs.mock', 'goog.labs.mock.TimeoutError', 'goog.labs.mock.VerificationError', 'goog.labs.mock.timeout', 'goog.labs.mock.verification', 'goog.labs.testing.AnythingMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.string', 'goog.testing.jsunit'], {'lang': 'es8'});\ngoog.addDependency('labs/mock/timeoutmode.js', ['goog.labs.mock.timeout', 'goog.labs.mock.timeout.TimeoutMode'], [], {'lang': 'es6'});\ngoog.addDependency('labs/mock/verificationmode.js', ['goog.labs.mock.verification', 'goog.labs.mock.verification.BaseVerificationMode', 'goog.labs.mock.verification.VerificationMode'], [], {'lang': 'es6'});\ngoog.addDependency('labs/mock/verificationmode_test.js', ['goog.labs.mock.VerificationModeTest'], ['goog.labs.mock.verification', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/net/image.js', ['goog.labs.net.image'], ['goog.Promise', 'goog.dom.safe', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.html.SafeUrl', 'goog.net.EventType', 'goog.userAgent'], {});\ngoog.addDependency('labs/net/image_test.js', ['goog.labs.net.imageTest'], ['goog.labs.net.image', 'goog.string', 'goog.testing.TestCase', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/net/webchannel.js', ['goog.net.WebChannel'], ['goog.events', 'goog.events.Event', 'goog.events.Listenable', 'goog.net.XmlHttpFactory'], {});\ngoog.addDependency('labs/net/webchannel/basetestchannel.js', ['goog.labs.net.webChannel.BaseTestChannel'], ['goog.labs.net.webChannel.Channel', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.requestStats', 'goog.net.WebChannel'], {});\ngoog.addDependency('labs/net/webchannel/channel.js', ['goog.labs.net.webChannel.Channel'], [], {'lang': 'es6'});\ngoog.addDependency('labs/net/webchannel/channelrequest.js', ['goog.labs.net.webChannel.ChannelRequest'], ['goog.Timer', 'goog.async.Throttle', 'goog.events.EventHandler', 'goog.labs.net.webChannel.Channel', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.environment', 'goog.labs.net.webChannel.requestStats', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.WebChannel', 'goog.net.XmlHttp', 'goog.object', 'goog.string', 'goog.userAgent'], {});\ngoog.addDependency('labs/net/webchannel/channelrequest_test.js', ['goog.labs.net.webChannel.channelRequestTest'], ['goog.Uri', 'goog.functions', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.ServerReachability', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/net/webchannel/connectionstate.js', ['goog.labs.net.webChannel.ConnectionState'], [], {});\ngoog.addDependency('labs/net/webchannel/environment.js', ['goog.labs.net.webChannel.environment'], ['goog.userAgent'], {'module': 'goog'});\ngoog.addDependency('labs/net/webchannel/environment_test.js', ['goog.labs.net.webChannel.EnvironmentTest'], ['goog.labs.net.webChannel.environment', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/net/webchannel/forwardchannelrequestpool.js', ['goog.labs.net.webChannel.ForwardChannelRequestPool'], ['goog.array', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.Wire', 'goog.string', 'goog.structs.Set'], {'module': 'goog'});\ngoog.addDependency('labs/net/webchannel/forwardchannelrequestpool_test.js', ['goog.labs.net.webChannel.ForwardChannelRequestPoolTest'], ['goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.ForwardChannelRequestPool', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/net/webchannel/netutils.js', ['goog.labs.net.webChannel.netUtils'], ['goog.Uri', 'goog.labs.net.webChannel.WebChannelDebug'], {});\ngoog.addDependency('labs/net/webchannel/requeststats.js', ['goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.Event', 'goog.labs.net.webChannel.requestStats.ServerReachability', 'goog.labs.net.webChannel.requestStats.ServerReachabilityEvent', 'goog.labs.net.webChannel.requestStats.Stat', 'goog.labs.net.webChannel.requestStats.StatEvent', 'goog.labs.net.webChannel.requestStats.TimingEvent'], ['goog.events.Event', 'goog.events.EventTarget'], {});\ngoog.addDependency('labs/net/webchannel/webchannelbase.js', ['goog.labs.net.webChannel.WebChannelBase'], ['goog.Uri', 'goog.array', 'goog.asserts', 'goog.async.run', 'goog.json', 'goog.labs.net.webChannel.BaseTestChannel', 'goog.labs.net.webChannel.Channel', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.ConnectionState', 'goog.labs.net.webChannel.ForwardChannelRequestPool', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.Wire', 'goog.labs.net.webChannel.WireV8', 'goog.labs.net.webChannel.netUtils', 'goog.labs.net.webChannel.requestStats', 'goog.net.WebChannel', 'goog.net.XhrIo', 'goog.net.XmlHttpFactory', 'goog.net.rpc.HttpCors', 'goog.object', 'goog.string', 'goog.structs'], {});\ngoog.addDependency('labs/net/webchannel/webchannelbase_test.js', ['goog.labs.net.webChannel.webChannelBaseTest'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.functions', 'goog.json', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.ForwardChannelRequestPool', 'goog.labs.net.webChannel.WebChannelBase', 'goog.labs.net.webChannel.WebChannelBaseTransport', 'goog.labs.net.webChannel.WebChannelDebug', 'goog.labs.net.webChannel.Wire', 'goog.labs.net.webChannel.netUtils', 'goog.labs.net.webChannel.requestStats', 'goog.labs.net.webChannel.requestStats.Stat', 'goog.structs.Map', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/net/webchannel/webchannelbasetransport.js', ['goog.labs.net.webChannel.WebChannelBaseTransport'], ['goog.asserts', 'goog.events.EventTarget', 'goog.json', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.WebChannelBase', 'goog.labs.net.webChannel.Wire', 'goog.log', 'goog.net.WebChannel', 'goog.net.WebChannelTransport', 'goog.object', 'goog.string', 'goog.string.path'], {});\ngoog.addDependency('labs/net/webchannel/webchannelbasetransport_test.js', ['goog.labs.net.webChannel.webChannelBaseTransportTest'], ['goog.events', 'goog.functions', 'goog.json', 'goog.labs.net.webChannel.ChannelRequest', 'goog.labs.net.webChannel.WebChannelBase', 'goog.labs.net.webChannel.WebChannelBaseTransport', 'goog.labs.net.webChannel.Wire', 'goog.net.WebChannel', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/net/webchannel/webchanneldebug.js', ['goog.labs.net.webChannel.WebChannelDebug'], ['goog.json', 'goog.log'], {});\ngoog.addDependency('labs/net/webchannel/wire.js', ['goog.labs.net.webChannel.Wire'], [], {'lang': 'es6'});\ngoog.addDependency('labs/net/webchannel/wirev8.js', ['goog.labs.net.webChannel.WireV8'], ['goog.asserts', 'goog.json', 'goog.json.NativeJsonProcessor', 'goog.labs.net.webChannel.Wire', 'goog.structs'], {});\ngoog.addDependency('labs/net/webchannel/wirev8_test.js', ['goog.labs.net.webChannel.WireV8Test'], ['goog.labs.net.webChannel.WireV8', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/net/webchanneltransport.js', ['goog.net.WebChannelTransport'], [], {});\ngoog.addDependency('labs/net/webchanneltransportfactory.js', ['goog.net.createWebChannelTransport'], ['goog.functions', 'goog.labs.net.webChannel.WebChannelBaseTransport'], {});\ngoog.addDependency('labs/net/xhr.js', ['goog.labs.net.xhr', 'goog.labs.net.xhr.Error', 'goog.labs.net.xhr.HttpError', 'goog.labs.net.xhr.Options', 'goog.labs.net.xhr.PostData', 'goog.labs.net.xhr.ResponseType', 'goog.labs.net.xhr.TimeoutError'], ['goog.Promise', 'goog.asserts', 'goog.debug.Error', 'goog.net.HttpStatus', 'goog.net.XmlHttp', 'goog.object', 'goog.string', 'goog.uri.utils', 'goog.userAgent'], {});\ngoog.addDependency('labs/net/xhr_test.js', ['goog.labs.net.xhrTest'], ['goog.Promise', 'goog.events', 'goog.events.EventType', 'goog.labs.net.xhr', 'goog.net.WrapperXmlHttpFactory', 'goog.net.XhrLike', 'goog.net.XmlHttp', 'goog.testing.MockClock', 'goog.testing.TestCase', 'goog.testing.jsunit', 'goog.userAgent'], {'lang': 'es6'});\ngoog.addDependency('labs/pubsub/broadcastpubsub.js', ['goog.labs.pubsub.BroadcastPubSub'], ['goog.Disposable', 'goog.Timer', 'goog.array', 'goog.async.run', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.log', 'goog.math', 'goog.pubsub.PubSub', 'goog.storage.Storage', 'goog.storage.mechanism.HTML5LocalStorage', 'goog.string', 'goog.userAgent'], {});\ngoog.addDependency('labs/pubsub/broadcastpubsub_test.js', ['goog.labs.pubsub.BroadcastPubSubTest'], ['goog.array', 'goog.debug.Logger', 'goog.json', 'goog.labs.pubsub.BroadcastPubSub', 'goog.storage.Storage', 'goog.structs.Map', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/storage/boundedcollectablestorage.js', ['goog.labs.storage.BoundedCollectableStorage'], ['goog.array', 'goog.asserts', 'goog.iter', 'goog.storage.CollectableStorage', 'goog.storage.ErrorCode', 'goog.storage.ExpiringStorage'], {});\ngoog.addDependency('labs/storage/boundedcollectablestorage_test.js', ['goog.labs.storage.BoundedCollectableStorageTest'], ['goog.labs.storage.BoundedCollectableStorage', 'goog.storage.collectableStorageTester', 'goog.storage.storageTester', 'goog.testing.MockClock', 'goog.testing.storage.FakeMechanism', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/structs/multimap.js', ['goog.labs.structs.Multimap'], ['goog.array', 'goog.object'], {'lang': 'es6'});\ngoog.addDependency('labs/structs/multimap_test.js', ['goog.labs.structs.MultimapTest'], ['goog.labs.structs.Multimap', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/style/pixeldensitymonitor.js', ['goog.labs.style.PixelDensityMonitor', 'goog.labs.style.PixelDensityMonitor.Density', 'goog.labs.style.PixelDensityMonitor.EventType'], ['goog.events', 'goog.events.EventTarget'], {});\ngoog.addDependency('labs/style/pixeldensitymonitor_test.js', ['goog.labs.style.PixelDensityMonitorTest'], ['goog.array', 'goog.dom.DomHelper', 'goog.events', 'goog.labs.style.PixelDensityMonitor', 'goog.testing.MockControl', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/testing/assertthat.js', ['goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat'], ['goog.debug.Error'], {});\ngoog.addDependency('labs/testing/assertthat_test.js', ['goog.labs.testing.assertThatTest'], ['goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/testing/decoratormatcher.js', ['goog.labs.testing.AnythingMatcher'], ['goog.labs.testing.Matcher'], {});\ngoog.addDependency('labs/testing/decoratormatcher_test.js', ['goog.labs.testing.decoratorMatcherTest'], ['goog.labs.testing.AnythingMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/testing/dictionarymatcher.js', ['goog.labs.testing.HasEntriesMatcher', 'goog.labs.testing.HasEntryMatcher', 'goog.labs.testing.HasKeyMatcher', 'goog.labs.testing.HasValueMatcher'], ['goog.asserts', 'goog.labs.testing.Matcher', 'goog.object'], {});\ngoog.addDependency('labs/testing/dictionarymatcher_test.js', ['goog.labs.testing.dictionaryMatcherTest'], ['goog.labs.testing.HasEntryMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/testing/environment.js', ['goog.labs.testing.Environment'], ['goog.Thenable', 'goog.array', 'goog.asserts', 'goog.debug.Console', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit'], {'lang': 'es6'});\ngoog.addDependency('labs/testing/environment_test.js', ['goog.labs.testing.environmentTest'], ['goog.asserts', 'goog.labs.testing.Environment', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.testSuite'], {'lang': 'es8', 'module': 'goog'});\ngoog.addDependency('labs/testing/environment_usage_test.js', ['goog.labs.testing.environmentUsageTest'], ['goog.labs.testing.Environment', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/testing/json_fuzzing.js', ['goog.labs.testing.JsonFuzzing'], ['goog.string', 'goog.testing.PseudoRandom'], {});\ngoog.addDependency('labs/testing/json_fuzzing_test.js', ['goog.labs.testing.JsonFuzzingTest'], ['goog.json', 'goog.labs.testing.JsonFuzzing', 'goog.testing.asserts', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/testing/logicmatcher.js', ['goog.labs.testing.AllOfMatcher', 'goog.labs.testing.AnyOfMatcher', 'goog.labs.testing.IsNotMatcher', 'goog.labs.testing.logicMatchers'], ['goog.array', 'goog.labs.testing.Matcher'], {});\ngoog.addDependency('labs/testing/logicmatcher_test.js', ['goog.labs.testing.logicMatcherTest'], ['goog.labs.testing.AllOfMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/testing/matcher.js', ['goog.labs.testing.Matcher'], [], {'lang': 'es6'});\ngoog.addDependency('labs/testing/numbermatcher.js', ['goog.labs.testing.AnyNumberMatcher', 'goog.labs.testing.CloseToMatcher', 'goog.labs.testing.EqualToMatcher', 'goog.labs.testing.GreaterThanEqualToMatcher', 'goog.labs.testing.GreaterThanMatcher', 'goog.labs.testing.LessThanEqualToMatcher', 'goog.labs.testing.LessThanMatcher'], ['goog.asserts', 'goog.labs.testing.Matcher'], {});\ngoog.addDependency('labs/testing/numbermatcher_test.js', ['goog.labs.testing.numberMatcherTest'], ['goog.labs.testing.LessThanMatcher', 'goog.labs.testing.MatcherError', 'goog.labs.testing.assertThat', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/testing/objectmatcher.js', ['goog.labs.testing.AnyObjectMatcher', 'goog.labs.testing.HasPropertyMatcher', 'goog.labs.testing.InstanceOfMatcher', 'goog.labs.testing.IsNullMatcher', 'goog.labs.testing.IsNullOrUndefinedMatcher', 'goog.labs.testing.IsUndefinedMatcher', 'goog.labs.testing.ObjectEqualsMatcher'], ['goog.labs.testing.Matcher'], {});\ngoog.addDependency('labs/testing/objectmatcher_test.js', ['goog.labs.testing.objectMatcherTest'], ['goog.labs.testing.MatcherError', 'goog.labs.testing.ObjectEqualsMatcher', 'goog.labs.testing.assertThat', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/testing/stringmatcher.js', ['goog.labs.testing.AnyStringMatcher', 'goog.labs.testing.ContainsStringMatcher', 'goog.labs.testing.EndsWithMatcher', 'goog.labs.testing.EqualToIgnoringWhitespaceMatcher', 'goog.labs.testing.EqualsMatcher', 'goog.labs.testing.RegexMatcher', 'goog.labs.testing.StartsWithMatcher', 'goog.labs.testing.StringContainsInOrderMatcher'], ['goog.asserts', 'goog.labs.testing.Matcher', 'goog.string'], {});\ngoog.addDependency('labs/testing/stringmatcher_test.js', ['goog.labs.testing.stringMatcherTest'], ['goog.labs.testing.MatcherError', 'goog.labs.testing.StringContainsInOrderMatcher', 'goog.labs.testing.assertThat', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/useragent/browser.js', ['goog.labs.userAgent.browser'], ['goog.array', 'goog.labs.userAgent.util', 'goog.object', 'goog.string.internal'], {});\ngoog.addDependency('labs/useragent/browser_test.js', ['goog.labs.userAgent.browserTest'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.object', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/useragent/device.js', ['goog.labs.userAgent.device'], ['goog.labs.userAgent.util'], {});\ngoog.addDependency('labs/useragent/device_test.js', ['goog.labs.userAgent.deviceTest'], ['goog.labs.userAgent.device', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/useragent/engine.js', ['goog.labs.userAgent.engine'], ['goog.array', 'goog.labs.userAgent.util', 'goog.string'], {});\ngoog.addDependency('labs/useragent/engine_test.js', ['goog.labs.userAgent.engineTest'], ['goog.labs.userAgent.engine', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/useragent/extra.js', ['goog.labs.userAgent.extra'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.platform'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/useragent/extra_test.js', ['goog.labs.userAgent.extraTest'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.extra', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/useragent/platform.js', ['goog.labs.userAgent.platform'], ['goog.labs.userAgent.util', 'goog.string'], {});\ngoog.addDependency('labs/useragent/platform_test.js', ['goog.labs.userAgent.platformTest'], ['goog.labs.userAgent.platform', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/useragent/test_agents.js', ['goog.labs.userAgent.testAgents'], [], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/useragent/util.js', ['goog.labs.userAgent.util'], ['goog.string.internal'], {});\ngoog.addDependency('labs/useragent/util_test.js', ['goog.labs.userAgent.utilTest'], ['goog.functions', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('labs/useragent/verifier.js', ['goog.labs.useragent.verifier'], [], {'lang': 'es6'});\ngoog.addDependency('labs/useragent/verifier_test.js', ['goog.labs.useragent.verifierTest'], ['goog.labs.userAgent.browser', 'goog.labs.useragent.verifier', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('loader/abstractmodulemanager.js', ['goog.loader.AbstractModuleManager', 'goog.loader.AbstractModuleManager.CallbackType', 'goog.loader.AbstractModuleManager.FailureType'], ['goog.module.AbstractModuleLoader', 'goog.module.ModuleInfo', 'goog.module.ModuleLoadCallback'], {});\ngoog.addDependency('loader/activemodulemanager.js', ['goog.loader.activeModuleManager'], ['goog.asserts', 'goog.loader.AbstractModuleManager'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('locale/countries.js', ['goog.locale.countries'], [], {});\ngoog.addDependency('locale/countrylanguagenames_test.js', ['goog.locale.countryLanguageNamesTest'], ['goog.locale', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('locale/defaultlocalenameconstants.js', ['goog.locale.defaultLocaleNameConstants'], [], {});\ngoog.addDependency('locale/genericfontnames.js', ['goog.locale.genericFontNames'], [], {});\ngoog.addDependency('locale/genericfontnames_test.js', ['goog.locale.genericFontNamesTest'], ['goog.locale.genericFontNames', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('locale/genericfontnamesdata.js', ['goog.locale.genericFontNamesData'], [], {});\ngoog.addDependency('locale/locale.js', ['goog.locale'], ['goog.locale.nativeNameConstants'], {});\ngoog.addDependency('locale/nativenameconstants.js', ['goog.locale.nativeNameConstants'], [], {});\ngoog.addDependency('locale/scriptToLanguages.js', ['goog.locale.scriptToLanguages'], ['goog.locale'], {});\ngoog.addDependency('locale/timezonedetection.js', ['goog.locale.timeZoneDetection'], ['goog.locale.TimeZoneFingerprint'], {});\ngoog.addDependency('locale/timezonedetection_test.js', ['goog.locale.timeZoneDetectionTest'], ['goog.locale.timeZoneDetection', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('locale/timezonefingerprint.js', ['goog.locale.TimeZoneFingerprint'], [], {});\ngoog.addDependency('locale/timezonelist.js', ['goog.locale.TimeZoneList', 'goog.locale.getTimeZoneAllLongNames', 'goog.locale.getTimeZoneSelectedLongNames', 'goog.locale.getTimeZoneSelectedShortNames'], ['goog.locale'], {});\ngoog.addDependency('locale/timezonelist_test.js', ['goog.locale.TimeZoneListTest'], ['goog.locale', 'goog.locale.TimeZoneList', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('log/log.js', ['goog.log', 'goog.log.Level', 'goog.log.LogRecord', 'goog.log.Logger'], ['goog.debug', 'goog.debug.LogManager', 'goog.debug.LogRecord', 'goog.debug.Logger'], {});\ngoog.addDependency('log/log_test.js', ['goog.logTest'], ['goog.debug.LogManager', 'goog.log', 'goog.log.Level', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/affinetransform.js', ['goog.math.AffineTransform'], [], {'lang': 'es6'});\ngoog.addDependency('math/affinetransform_test.js', ['goog.math.AffineTransformTest'], ['goog.array', 'goog.math', 'goog.math.AffineTransform', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/bezier.js', ['goog.math.Bezier'], ['goog.math', 'goog.math.Coordinate'], {});\ngoog.addDependency('math/bezier_test.js', ['goog.math.BezierTest'], ['goog.math', 'goog.math.Bezier', 'goog.math.Coordinate', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/box.js', ['goog.math.Box'], ['goog.asserts', 'goog.math.Coordinate'], {});\ngoog.addDependency('math/box_test.js', ['goog.math.BoxTest'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/coordinate.js', ['goog.math.Coordinate'], ['goog.math'], {});\ngoog.addDependency('math/coordinate3.js', ['goog.math.Coordinate3'], [], {'lang': 'es6'});\ngoog.addDependency('math/coordinate3_test.js', ['goog.math.Coordinate3Test'], ['goog.math.Coordinate3', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/coordinate_test.js', ['goog.math.CoordinateTest'], ['goog.math.Coordinate', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/exponentialbackoff.js', ['goog.math.ExponentialBackoff'], ['goog.asserts'], {});\ngoog.addDependency('math/exponentialbackoff_test.js', ['goog.math.ExponentialBackoffTest'], ['goog.math.ExponentialBackoff', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/integer.js', ['goog.math.Integer'], ['goog.reflect'], {});\ngoog.addDependency('math/integer_test.js', ['goog.math.IntegerTest'], ['goog.math.Integer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/interpolator/interpolator1.js', ['goog.math.interpolator.Interpolator1'], [], {});\ngoog.addDependency('math/interpolator/linear1.js', ['goog.math.interpolator.Linear1'], ['goog.array', 'goog.asserts', 'goog.math', 'goog.math.interpolator.Interpolator1'], {});\ngoog.addDependency('math/interpolator/linear1_test.js', ['goog.math.interpolator.Linear1Test'], ['goog.math.interpolator.Linear1', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/interpolator/pchip1.js', ['goog.math.interpolator.Pchip1'], ['goog.math', 'goog.math.interpolator.Spline1'], {});\ngoog.addDependency('math/interpolator/pchip1_test.js', ['goog.math.interpolator.Pchip1Test'], ['goog.math.interpolator.Pchip1', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/interpolator/spline1.js', ['goog.math.interpolator.Spline1'], ['goog.array', 'goog.asserts', 'goog.math', 'goog.math.interpolator.Interpolator1', 'goog.math.tdma'], {});\ngoog.addDependency('math/interpolator/spline1_test.js', ['goog.math.interpolator.Spline1Test'], ['goog.math.interpolator.Spline1', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/irect.js', ['goog.math.IRect'], [], {});\ngoog.addDependency('math/line.js', ['goog.math.Line'], ['goog.math', 'goog.math.Coordinate'], {});\ngoog.addDependency('math/line_test.js', ['goog.math.LineTest'], ['goog.math.Coordinate', 'goog.math.Line', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/long.js', ['goog.math.Long'], ['goog.asserts', 'goog.reflect'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/long_test.js', ['goog.math.LongTest'], ['goog.asserts', 'goog.math.Long', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/math.js', ['goog.math'], ['goog.array', 'goog.asserts'], {});\ngoog.addDependency('math/math_test.js', ['goog.mathTest'], ['goog.math', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/matrix.js', ['goog.math.Matrix'], ['goog.array', 'goog.asserts', 'goog.math', 'goog.math.Size', 'goog.string'], {});\ngoog.addDependency('math/matrix_test.js', ['goog.math.MatrixTest'], ['goog.math.Matrix', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/path.js', ['goog.math.Path', 'goog.math.Path.Segment'], ['goog.array', 'goog.math', 'goog.math.AffineTransform'], {});\ngoog.addDependency('math/path_test.js', ['goog.math.PathTest'], ['goog.array', 'goog.math.AffineTransform', 'goog.math.Path', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/paths.js', ['goog.math.paths'], ['goog.math.Coordinate', 'goog.math.Path'], {});\ngoog.addDependency('math/paths_test.js', ['goog.math.pathsTest'], ['goog.math.Coordinate', 'goog.math.paths', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/range.js', ['goog.math.Range'], ['goog.asserts'], {});\ngoog.addDependency('math/range_test.js', ['goog.math.RangeTest'], ['goog.math.Range', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/rangeset.js', ['goog.math.RangeSet'], ['goog.array', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.math.Range'], {});\ngoog.addDependency('math/rangeset_test.js', ['goog.math.RangeSetTest'], ['goog.iter', 'goog.math.Range', 'goog.math.RangeSet', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/rect.js', ['goog.math.Rect'], ['goog.asserts', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.IRect', 'goog.math.Size'], {});\ngoog.addDependency('math/rect_test.js', ['goog.math.RectTest'], ['goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/size.js', ['goog.math.Size'], [], {'lang': 'es6'});\ngoog.addDependency('math/size_test.js', ['goog.math.SizeTest'], ['goog.math.Size', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/tdma.js', ['goog.math.tdma'], [], {'lang': 'es6'});\ngoog.addDependency('math/tdma_test.js', ['goog.math.tdmaTest'], ['goog.math.tdma', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/vec2.js', ['goog.math.Vec2'], ['goog.math', 'goog.math.Coordinate'], {'lang': 'es6'});\ngoog.addDependency('math/vec2_test.js', ['goog.math.Vec2Test'], ['goog.math.Vec2', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('math/vec3.js', ['goog.math.Vec3'], ['goog.math', 'goog.math.Coordinate3'], {});\ngoog.addDependency('math/vec3_test.js', ['goog.math.Vec3Test'], ['goog.math.Coordinate3', 'goog.math.Vec3', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('memoize/memoize.js', ['goog.memoize'], [], {'lang': 'es6'});\ngoog.addDependency('memoize/memoize_test.js', ['goog.memoizeTest'], ['goog.memoize', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('messaging/abstractchannel.js', ['goog.messaging.AbstractChannel'], ['goog.Disposable', 'goog.json', 'goog.log', 'goog.messaging.MessageChannel'], {});\ngoog.addDependency('messaging/abstractchannel_test.js', ['goog.messaging.AbstractChannelTest'], ['goog.messaging.AbstractChannel', 'goog.testing.MockControl', 'goog.testing.async.MockControl', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('messaging/bufferedchannel.js', ['goog.messaging.BufferedChannel'], ['goog.Disposable', 'goog.Timer', 'goog.events', 'goog.log', 'goog.messaging.MessageChannel', 'goog.messaging.MultiChannel'], {});\ngoog.addDependency('messaging/bufferedchannel_test.js', ['goog.messaging.BufferedChannelTest'], ['goog.debug.Console', 'goog.dom', 'goog.dom.TagName', 'goog.log', 'goog.log.Level', 'goog.messaging.BufferedChannel', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.async.MockControl', 'goog.testing.messaging.MockMessageChannel', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('messaging/deferredchannel.js', ['goog.messaging.DeferredChannel'], ['goog.Disposable', 'goog.messaging.MessageChannel'], {});\ngoog.addDependency('messaging/deferredchannel_test.js', ['goog.messaging.DeferredChannelTest'], ['goog.async.Deferred', 'goog.messaging.DeferredChannel', 'goog.testing.MockControl', 'goog.testing.async.MockControl', 'goog.testing.messaging.MockMessageChannel', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('messaging/loggerclient.js', ['goog.messaging.LoggerClient'], ['goog.Disposable', 'goog.debug', 'goog.debug.LogManager', 'goog.debug.Logger'], {});\ngoog.addDependency('messaging/loggerclient_test.js', ['goog.messaging.LoggerClientTest'], ['goog.debug', 'goog.debug.Logger', 'goog.messaging.LoggerClient', 'goog.testing.MockControl', 'goog.testing.messaging.MockMessageChannel', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('messaging/loggerserver.js', ['goog.messaging.LoggerServer'], ['goog.Disposable', 'goog.log', 'goog.log.Level'], {});\ngoog.addDependency('messaging/loggerserver_test.js', ['goog.messaging.LoggerServerTest'], ['goog.debug.LogManager', 'goog.debug.Logger', 'goog.log', 'goog.log.Level', 'goog.messaging.LoggerServer', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.messaging.MockMessageChannel', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('messaging/messagechannel.js', ['goog.messaging.MessageChannel'], [], {});\ngoog.addDependency('messaging/messaging.js', ['goog.messaging'], [], {});\ngoog.addDependency('messaging/messaging_test.js', ['goog.testing.messaging.MockMessageChannelTest'], ['goog.messaging', 'goog.testing.MockControl', 'goog.testing.messaging.MockMessageChannel', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('messaging/multichannel.js', ['goog.messaging.MultiChannel', 'goog.messaging.MultiChannel.VirtualChannel'], ['goog.Disposable', 'goog.log', 'goog.messaging.MessageChannel', 'goog.object'], {});\ngoog.addDependency('messaging/multichannel_test.js', ['goog.messaging.MultiChannelTest'], ['goog.messaging.MultiChannel', 'goog.testing.MockControl', 'goog.testing.messaging.MockMessageChannel', 'goog.testing.mockmatchers.IgnoreArgument', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('messaging/portcaller.js', ['goog.messaging.PortCaller'], ['goog.Disposable', 'goog.async.Deferred', 'goog.messaging.DeferredChannel', 'goog.messaging.PortChannel', 'goog.messaging.PortNetwork', 'goog.object'], {});\ngoog.addDependency('messaging/portcaller_test.js', ['goog.messaging.PortCallerTest'], ['goog.events.EventTarget', 'goog.messaging.PortCaller', 'goog.messaging.PortNetwork', 'goog.testing.MockControl', 'goog.testing.messaging.MockMessageChannel', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('messaging/portchannel.js', ['goog.messaging.PortChannel'], ['goog.Timer', 'goog.array', 'goog.async.Deferred', 'goog.debug', 'goog.events', 'goog.events.EventType', 'goog.json', 'goog.log', 'goog.messaging.AbstractChannel', 'goog.messaging.DeferredChannel', 'goog.object', 'goog.string', 'goog.userAgent'], {});\ngoog.addDependency('messaging/portchannel_test.js', ['goog.messaging.PortChannelTest'], ['goog.Promise', 'goog.Timer', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.json', 'goog.messaging.PortChannel', 'goog.testing.MockControl', 'goog.testing.TestCase', 'goog.testing.messaging.MockMessageEvent', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('messaging/portnetwork.js', ['goog.messaging.PortNetwork'], [], {});\ngoog.addDependency('messaging/portnetwork_test.js', ['goog.messaging.PortNetworkTest'], ['goog.Promise', 'goog.Timer', 'goog.labs.userAgent.browser', 'goog.messaging.PortChannel', 'goog.messaging.PortOperator', 'goog.testing.TestCase', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('messaging/portoperator.js', ['goog.messaging.PortOperator'], ['goog.Disposable', 'goog.asserts', 'goog.log', 'goog.messaging.PortChannel', 'goog.messaging.PortNetwork', 'goog.object'], {});\ngoog.addDependency('messaging/portoperator_test.js', ['goog.messaging.PortOperatorTest'], ['goog.messaging.PortNetwork', 'goog.messaging.PortOperator', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.messaging.MockMessageChannel', 'goog.testing.messaging.MockMessagePort', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('messaging/respondingchannel.js', ['goog.messaging.RespondingChannel'], ['goog.Disposable', 'goog.Promise', 'goog.log', 'goog.messaging.MultiChannel'], {});\ngoog.addDependency('messaging/respondingchannel_test.js', ['goog.messaging.RespondingChannelTest'], ['goog.Promise', 'goog.messaging.RespondingChannel', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.messaging.MockMessageChannel', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('messaging/testdata/portchannel_worker.js', ['goog.messaging.testdata.portchannel_worker'], ['goog.messaging.PortChannel'], {});\ngoog.addDependency('messaging/testdata/portnetwork_worker1.js', ['goog.messaging.testdata.portnetwork_worker1'], ['goog.messaging.PortCaller', 'goog.messaging.PortChannel'], {});\ngoog.addDependency('messaging/testdata/portnetwork_worker2.js', ['goog.messaging.testdata.portnetwork_worker2'], ['goog.messaging.PortCaller', 'goog.messaging.PortChannel'], {});\ngoog.addDependency('module/abstractmoduleloader.js', ['goog.module.AbstractModuleLoader'], ['goog.module', 'goog.module.ModuleInfo'], {});\ngoog.addDependency('module/basemodule.js', ['goog.module.BaseModule'], ['goog.Disposable', 'goog.module'], {});\ngoog.addDependency('module/loader.js', ['goog.module.Loader'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.legacyconversions', 'goog.module', 'goog.object'], {});\ngoog.addDependency('module/module.js', ['goog.module'], [], {});\ngoog.addDependency('module/moduleinfo.js', ['goog.module.ModuleInfo'], ['goog.Disposable', 'goog.async.throwException', 'goog.functions', 'goog.html.TrustedResourceUrl', 'goog.module', 'goog.module.BaseModule', 'goog.module.ModuleLoadCallback'], {});\ngoog.addDependency('module/moduleinfo_test.js', ['goog.module.ModuleInfoTest'], ['goog.module.BaseModule', 'goog.module.ModuleInfo', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('module/moduleloadcallback.js', ['goog.module.ModuleLoadCallback'], ['goog.debug.entryPointRegistry', 'goog.module'], {});\ngoog.addDependency('module/moduleloadcallback_test.js', ['goog.module.ModuleLoadCallbackTest'], ['goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.functions', 'goog.module.ModuleLoadCallback', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('module/moduleloader.js', ['goog.module.ModuleLoader'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.safe', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventId', 'goog.events.EventTarget', 'goog.functions', 'goog.html.TrustedResourceUrl', 'goog.labs.userAgent.browser', 'goog.log', 'goog.module.AbstractModuleLoader', 'goog.net.BulkLoader', 'goog.net.EventType', 'goog.net.jsloader', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es6'});\ngoog.addDependency('module/moduleloader_test.js', ['goog.module.ModuleLoaderTest'], ['goog.Promise', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.functions', 'goog.html.TrustedResourceUrl', 'goog.loader.activeModuleManager', 'goog.module.ModuleLoader', 'goog.module.ModuleManager', 'goog.net.BulkLoader', 'goog.net.XmlHttp', 'goog.object', 'goog.string.Const', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.events.EventObserver', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('module/modulemanager.js', ['goog.module.ModuleManager', 'goog.module.ModuleManager.CallbackType', 'goog.module.ModuleManager.FailureType'], ['goog.array', 'goog.asserts', 'goog.async.Deferred', 'goog.debug.Trace', 'goog.disposable.IDisposable', 'goog.disposeAll', 'goog.loader.AbstractModuleManager', 'goog.loader.activeModuleManager', 'goog.log', 'goog.module', 'goog.module.ModuleInfo', 'goog.module.ModuleLoadCallback', 'goog.object'], {'lang': 'es6'});\ngoog.addDependency('module/modulemanager_test.js', ['goog.module.ModuleManagerTest'], ['goog.array', 'goog.functions', 'goog.module.BaseModule', 'goog.module.ModuleManager', 'goog.testing', 'goog.testing.MockClock', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('module/testdata/modA_1.js', ['goog.module.testdata.modA_1'], [], {});\ngoog.addDependency('module/testdata/modA_2.js', ['goog.module.testdata.modA_2'], ['goog.module.ModuleManager'], {});\ngoog.addDependency('module/testdata/modB_1.js', ['goog.module.testdata.modB_1'], ['goog.module.ModuleManager'], {});\ngoog.addDependency('net/browserchannel.js', ['goog.net.BrowserChannel', 'goog.net.BrowserChannel.Error', 'goog.net.BrowserChannel.Event', 'goog.net.BrowserChannel.Handler', 'goog.net.BrowserChannel.LogSaver', 'goog.net.BrowserChannel.QueuedMap', 'goog.net.BrowserChannel.ServerReachability', 'goog.net.BrowserChannel.ServerReachabilityEvent', 'goog.net.BrowserChannel.Stat', 'goog.net.BrowserChannel.StatEvent', 'goog.net.BrowserChannel.State', 'goog.net.BrowserChannel.TimingEvent'], ['goog.Uri', 'goog.array', 'goog.asserts', 'goog.debug.TextFormatter', 'goog.events.Event', 'goog.events.EventTarget', 'goog.json', 'goog.json.NativeJsonProcessor', 'goog.log', 'goog.net.BrowserTestChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.net.XhrIo', 'goog.net.tmpnetwork', 'goog.object', 'goog.string', 'goog.structs', 'goog.structs.CircularBuffer'], {});\ngoog.addDependency('net/browserchannel_test.js', ['goog.net.BrowserChannelTest'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.functions', 'goog.json', 'goog.net.BrowserChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.net.tmpnetwork', 'goog.structs.Map', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/browsertestchannel.js', ['goog.net.BrowserTestChannel'], ['goog.json.NativeJsonProcessor', 'goog.net.ChannelRequest', 'goog.net.ChannelRequest.Error', 'goog.net.tmpnetwork', 'goog.string.Parser'], {});\ngoog.addDependency('net/bulkloader.js', ['goog.net.BulkLoader'], ['goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.log', 'goog.net.BulkLoaderHelper', 'goog.net.EventType', 'goog.net.XhrIo'], {});\ngoog.addDependency('net/bulkloader_test.js', ['goog.net.BulkLoaderTest'], ['goog.events.Event', 'goog.events.EventHandler', 'goog.net.BulkLoader', 'goog.net.EventType', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/bulkloaderhelper.js', ['goog.net.BulkLoaderHelper'], ['goog.Disposable'], {});\ngoog.addDependency('net/channeldebug.js', ['goog.net.ChannelDebug'], ['goog.json', 'goog.log'], {'lang': 'es6'});\ngoog.addDependency('net/channelrequest.js', ['goog.net.ChannelRequest', 'goog.net.ChannelRequest.Error'], ['goog.Timer', 'goog.async.Throttle', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events.EventHandler', 'goog.html.SafeUrl', 'goog.html.uncheckedconversions', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.object', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});\ngoog.addDependency('net/channelrequest_test.js', ['goog.net.ChannelRequestTest'], ['goog.Uri', 'goog.functions', 'goog.net.BrowserChannel', 'goog.net.ChannelDebug', 'goog.net.ChannelRequest', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/cookies.js', ['goog.net.Cookies', 'goog.net.cookies'], ['goog.asserts', 'goog.string'], {'lang': 'es5'});\ngoog.addDependency('net/cookies_test.js', ['goog.net.cookiesTest'], ['goog.array', 'goog.net.Cookies', 'goog.net.cookies', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/corsxmlhttpfactory.js', ['goog.net.CorsXmlHttpFactory', 'goog.net.IeCorsXhrAdapter'], ['goog.net.HttpStatus', 'goog.net.XhrLike', 'goog.net.XmlHttp', 'goog.net.XmlHttpFactory'], {});\ngoog.addDependency('net/corsxmlhttpfactory_test.js', ['goog.net.CorsXmlHttpFactoryTest'], ['goog.net.CorsXmlHttpFactory', 'goog.net.IeCorsXhrAdapter', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/crossdomainrpc.js', ['goog.net.CrossDomainRpc'], ['goog.Uri', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.html.SafeHtml', 'goog.log', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.string', 'goog.userAgent'], {});\ngoog.addDependency('net/crossdomainrpc_test.js', ['goog.net.CrossDomainRpcTest'], ['goog.Promise', 'goog.log', 'goog.net.CrossDomainRpc', 'goog.testing.TestCase', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/errorcode.js', ['goog.net.ErrorCode'], [], {});\ngoog.addDependency('net/eventtype.js', ['goog.net.EventType'], [], {});\ngoog.addDependency('net/fetchxmlhttpfactory.js', ['goog.net.FetchXmlHttp', 'goog.net.FetchXmlHttpFactory'], ['goog.asserts', 'goog.events.EventTarget', 'goog.functions', 'goog.log', 'goog.net.XhrLike', 'goog.net.XmlHttpFactory'], {'lang': 'es5'});\ngoog.addDependency('net/fetchxmlhttpfactory_test.js', ['goog.net.FetchXmlHttpFactoryTest'], ['goog.net.FetchXmlHttp', 'goog.net.FetchXmlHttpFactory', 'goog.testing.MockControl', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/filedownloader.js', ['goog.net.FileDownloader', 'goog.net.FileDownloader.Error'], ['goog.Disposable', 'goog.asserts', 'goog.async.Deferred', 'goog.crypt.hash32', 'goog.debug.Error', 'goog.events', 'goog.events.EventHandler', 'goog.fs', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.net.EventType', 'goog.net.XhrIo', 'goog.net.XhrIoPool', 'goog.object'], {});\ngoog.addDependency('net/filedownloader_test.js', ['goog.net.FileDownloaderTest'], ['goog.fs.Error', 'goog.net.ErrorCode', 'goog.net.FileDownloader', 'goog.net.XhrIo', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.fs', 'goog.testing.fs.FileSystem', 'goog.testing.net.XhrIoPool', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/httpstatus.js', ['goog.net.HttpStatus'], [], {});\ngoog.addDependency('net/httpstatusname.js', ['goog.net.HttpStatusName'], [], {});\ngoog.addDependency('net/iframeio.js', ['goog.net.IframeIo', 'goog.net.IframeIo.IncrementalDataEvent'], ['goog.Timer', 'goog.Uri', 'goog.array', 'goog.asserts', 'goog.debug.HtmlFormatter', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.html.SafeUrl', 'goog.html.legacyconversions', 'goog.html.uncheckedconversions', 'goog.json', 'goog.log', 'goog.log.Level', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.reflect', 'goog.string', 'goog.string.Const', 'goog.structs', 'goog.userAgent'], {});\ngoog.addDependency('net/iframeio_test.js', ['goog.net.IframeIoTest'], ['goog.debug', 'goog.debug.DivConsole', 'goog.debug.LogManager', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.log', 'goog.log.Level', 'goog.net.IframeIo', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.jsunit', 'goog.userAgent'], {'lang': 'es6'});\ngoog.addDependency('net/iframeloadmonitor.js', ['goog.net.IframeLoadMonitor'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.userAgent'], {});\ngoog.addDependency('net/iframeloadmonitor_test.js', ['goog.net.IframeLoadMonitorTest'], ['goog.Promise', 'goog.Timer', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.net.IframeLoadMonitor', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/imageloader.js', ['goog.net.ImageLoader'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.net.EventType', 'goog.object', 'goog.userAgent'], {});\ngoog.addDependency('net/imageloader_test.js', ['goog.net.ImageLoaderTest'], ['goog.Promise', 'goog.Timer', 'goog.array', 'goog.dispose', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.net.EventType', 'goog.net.ImageLoader', 'goog.object', 'goog.string', 'goog.testing.TestCase', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/ipaddress.js', ['goog.net.IpAddress', 'goog.net.Ipv4Address', 'goog.net.Ipv6Address'], ['goog.array', 'goog.math.Integer', 'goog.object', 'goog.string'], {});\ngoog.addDependency('net/ipaddress_test.js', ['goog.net.IpAddressTest'], ['goog.array', 'goog.math.Integer', 'goog.net.IpAddress', 'goog.net.Ipv4Address', 'goog.net.Ipv6Address', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/jsloader.js', ['goog.net.jsloader', 'goog.net.jsloader.Error', 'goog.net.jsloader.ErrorCode', 'goog.net.jsloader.Options'], ['goog.array', 'goog.async.Deferred', 'goog.debug.Error', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.TrustedResourceUrl', 'goog.object'], {});\ngoog.addDependency('net/jsloader_test.js', ['goog.net.jsloaderTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.html.TrustedResourceUrl', 'goog.net.jsloader', 'goog.net.jsloader.ErrorCode', 'goog.string.Const', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/jsonp.js', ['goog.net.Jsonp'], ['goog.html.TrustedResourceUrl', 'goog.net.jsloader', 'goog.object'], {});\ngoog.addDependency('net/jsonp_test.js', ['goog.net.JsonpTest'], ['goog.html.TrustedResourceUrl', 'goog.net.Jsonp', 'goog.string.Const', 'goog.testing.PropertyReplacer', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/mockiframeio.js', ['goog.net.MockIFrameIo'], ['goog.events.EventTarget', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.IframeIo'], {});\ngoog.addDependency('net/multiiframeloadmonitor.js', ['goog.net.MultiIframeLoadMonitor'], ['goog.events', 'goog.net.IframeLoadMonitor'], {});\ngoog.addDependency('net/multiiframeloadmonitor_test.js', ['goog.net.MultiIframeLoadMonitorTest'], ['goog.Promise', 'goog.Timer', 'goog.dom', 'goog.dom.TagName', 'goog.net.MultiIframeLoadMonitor', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/networkstatusmonitor.js', ['goog.net.NetworkStatusMonitor'], ['goog.events.Listenable'], {});\ngoog.addDependency('net/networktester.js', ['goog.net.NetworkTester'], ['goog.Timer', 'goog.Uri', 'goog.dom.safe', 'goog.log'], {});\ngoog.addDependency('net/networktester_test.js', ['goog.net.NetworkTesterTest'], ['goog.Uri', 'goog.net.NetworkTester', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/rpc/httpcors.js', ['goog.net.rpc.HttpCors'], ['goog.Uri', 'goog.object', 'goog.string', 'goog.uri.utils'], {'module': 'goog'});\ngoog.addDependency('net/rpc/httpcors_test.js', ['goog.net.rpc.HttpCorsTest'], ['goog.Uri', 'goog.net.rpc.HttpCors', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/streams/base64pbstreamparser.js', ['goog.net.streams.Base64PbStreamParser'], ['goog.asserts', 'goog.net.streams.Base64StreamDecoder', 'goog.net.streams.PbStreamParser', 'goog.net.streams.StreamParser'], {'module': 'goog'});\ngoog.addDependency('net/streams/base64pbstreamparser_test.js', ['goog.net.streams.Base64PbStreamParserTest'], ['goog.crypt.base64', 'goog.net.streams.Base64PbStreamParser', 'goog.object', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/streams/base64streamdecoder.js', ['goog.net.streams.Base64StreamDecoder'], ['goog.asserts', 'goog.crypt.base64'], {});\ngoog.addDependency('net/streams/base64streamdecoder_test.js', ['goog.net.streams.Base64StreamDecoderTest'], ['goog.net.streams.Base64StreamDecoder', 'goog.testing.asserts', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/streams/jsonstreamparser.js', ['goog.net.streams.JsonStreamParser', 'goog.net.streams.JsonStreamParser.Options'], ['goog.asserts', 'goog.net.streams.StreamParser', 'goog.net.streams.utils'], {});\ngoog.addDependency('net/streams/jsonstreamparser_test.js', ['goog.net.streams.JsonStreamParserTest'], ['goog.array', 'goog.json', 'goog.labs.testing.JsonFuzzing', 'goog.net.streams.JsonStreamParser', 'goog.testing.asserts', 'goog.testing.testSuite', 'goog.uri.utils'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/streams/nodereadablestream.js', ['goog.net.streams.NodeReadableStream'], [], {});\ngoog.addDependency('net/streams/pbjsonstreamparser.js', ['goog.net.streams.PbJsonStreamParser'], ['goog.asserts', 'goog.net.streams.JsonStreamParser', 'goog.net.streams.StreamParser', 'goog.net.streams.utils'], {'module': 'goog'});\ngoog.addDependency('net/streams/pbjsonstreamparser_test.js', ['goog.net.streams.PbJsonStreamParserTest'], ['goog.net.streams.PbJsonStreamParser', 'goog.object', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/streams/pbstreamparser.js', ['goog.net.streams.PbStreamParser'], ['goog.asserts', 'goog.net.streams.StreamParser'], {});\ngoog.addDependency('net/streams/pbstreamparser_test.js', ['goog.net.streams.PbStreamParserTest'], ['goog.net.streams.PbStreamParser', 'goog.object', 'goog.testing.asserts', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/streams/streamfactory.js', ['goog.net.streams.createXhrNodeReadableStream'], ['goog.asserts', 'goog.net.streams.XhrNodeReadableStream', 'goog.net.streams.XhrStreamReader'], {});\ngoog.addDependency('net/streams/streamparser.js', ['goog.net.streams.StreamParser'], [], {});\ngoog.addDependency('net/streams/utils.js', ['goog.net.streams.utils'], [], {'module': 'goog'});\ngoog.addDependency('net/streams/xhrnodereadablestream.js', ['goog.net.streams.XhrNodeReadableStream'], ['goog.array', 'goog.log', 'goog.net.streams.NodeReadableStream', 'goog.net.streams.XhrStreamReader'], {});\ngoog.addDependency('net/streams/xhrnodereadablestream_test.js', ['goog.net.streams.XhrNodeReadableStreamTest'], ['goog.net.streams.NodeReadableStream', 'goog.net.streams.XhrNodeReadableStream', 'goog.net.streams.XhrStreamReader', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/streams/xhrstreamreader.js', ['goog.net.streams.XhrStreamReader'], ['goog.events.EventHandler', 'goog.log', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.net.XhrIo', 'goog.net.XmlHttp', 'goog.net.streams.Base64PbStreamParser', 'goog.net.streams.JsonStreamParser', 'goog.net.streams.PbJsonStreamParser', 'goog.net.streams.PbStreamParser', 'goog.string', 'goog.userAgent'], {});\ngoog.addDependency('net/streams/xhrstreamreader_test.js', ['goog.net.streams.XhrStreamReaderTest'], ['goog.net.ErrorCode', 'goog.net.HttpStatus', 'goog.net.XhrIo', 'goog.net.XmlHttp', 'goog.net.streams.Base64PbStreamParser', 'goog.net.streams.JsonStreamParser', 'goog.net.streams.PbJsonStreamParser', 'goog.net.streams.PbStreamParser', 'goog.net.streams.XhrStreamReader', 'goog.object', 'goog.testing.asserts', 'goog.testing.jsunit', 'goog.testing.net.XhrIo'], {'lang': 'es6'});\ngoog.addDependency('net/testdata/jsloader_test1.js', ['goog.net.testdata.jsloader_test1'], [], {});\ngoog.addDependency('net/testdata/jsloader_test2.js', ['goog.net.testdata.jsloader_test2'], [], {});\ngoog.addDependency('net/testdata/jsloader_test3.js', ['goog.net.testdata.jsloader_test3'], [], {});\ngoog.addDependency('net/testdata/jsloader_test4.js', ['goog.net.testdata.jsloader_test4'], [], {});\ngoog.addDependency('net/tmpnetwork.js', ['goog.net.tmpnetwork'], ['goog.Uri', 'goog.dom.safe', 'goog.net.ChannelDebug'], {});\ngoog.addDependency('net/websocket.js', ['goog.net.WebSocket', 'goog.net.WebSocket.ErrorEvent', 'goog.net.WebSocket.EventType', 'goog.net.WebSocket.MessageEvent'], ['goog.Timer', 'goog.asserts', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.log'], {'lang': 'es5'});\ngoog.addDependency('net/websocket_test.js', ['goog.net.WebSocketTest'], ['goog.debug.EntryPointMonitor', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.functions', 'goog.net.WebSocket', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/wrapperxmlhttpfactory.js', ['goog.net.WrapperXmlHttpFactory'], ['goog.net.XhrLike', 'goog.net.XmlHttpFactory'], {});\ngoog.addDependency('net/xhrio.js', ['goog.net.XhrIo', 'goog.net.XhrIo.ResponseType'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.debug.entryPointRegistry', 'goog.events.EventTarget', 'goog.json.hybrid', 'goog.log', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.net.XmlHttp', 'goog.object', 'goog.string', 'goog.structs', 'goog.structs.Map', 'goog.uri.utils', 'goog.userAgent'], {});\ngoog.addDependency('net/xhrio_test.js', ['goog.net.XhrIoTest'], ['goog.Uri', 'goog.debug.EntryPointMonitor', 'goog.debug.ErrorHandler', 'goog.debug.entryPointRegistry', 'goog.events', 'goog.functions', 'goog.net.EventType', 'goog.net.WrapperXmlHttpFactory', 'goog.net.XhrIo', 'goog.net.XmlHttp', 'goog.object', 'goog.string', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.jsunit', 'goog.testing.net.XhrIo', 'goog.testing.recordFunction', 'goog.userAgent.product'], {'lang': 'es6'});\ngoog.addDependency('net/xhriopool.js', ['goog.net.XhrIoPool'], ['goog.net.XhrIo', 'goog.structs.PriorityPool'], {});\ngoog.addDependency('net/xhriopool_test.js', ['goog.net.XhrIoPoolTest'], ['goog.net.XhrIoPool', 'goog.structs.Map', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/xhrlike.js', ['goog.net.XhrLike'], [], {});\ngoog.addDependency('net/xhrmanager.js', ['goog.net.XhrManager', 'goog.net.XhrManager.Event', 'goog.net.XhrManager.Request'], ['goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XhrIo', 'goog.net.XhrIoPool', 'goog.structs.Map'], {});\ngoog.addDependency('net/xhrmanager_test.js', ['goog.net.XhrManagerTest'], ['goog.events', 'goog.net.EventType', 'goog.net.XhrIo', 'goog.net.XhrManager', 'goog.testing.net.XhrIoPool', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/xmlhttp.js', ['goog.net.DefaultXmlHttpFactory', 'goog.net.XmlHttp', 'goog.net.XmlHttp.OptionType', 'goog.net.XmlHttp.ReadyState', 'goog.net.XmlHttpDefines'], ['goog.asserts', 'goog.net.WrapperXmlHttpFactory', 'goog.net.XmlHttpFactory'], {});\ngoog.addDependency('net/xmlhttpfactory.js', ['goog.net.XmlHttpFactory'], ['goog.net.XhrLike'], {});\ngoog.addDependency('net/xpc/crosspagechannel.js', ['goog.net.xpc.CrossPageChannel'], ['goog.Uri', 'goog.async.Deferred', 'goog.async.Delay', 'goog.dispose', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.html.legacyconversions', 'goog.json', 'goog.log', 'goog.messaging.AbstractChannel', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.ChannelStates', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.DirectTransport', 'goog.net.xpc.NativeMessagingTransport', 'goog.net.xpc.TransportTypes', 'goog.net.xpc.UriCfgFields', 'goog.string', 'goog.uri.utils', 'goog.userAgent'], {});\ngoog.addDependency('net/xpc/crosspagechannel_test.js', ['goog.net.xpc.CrossPageChannelTest'], ['goog.Disposable', 'goog.Promise', 'goog.Timer', 'goog.Uri', 'goog.dom', 'goog.dom.TagName', 'goog.labs.userAgent.browser', 'goog.log', 'goog.log.Level', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.TransportTypes', 'goog.object', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit'], {'lang': 'es8'});\ngoog.addDependency('net/xpc/crosspagechannelrole.js', ['goog.net.xpc.CrossPageChannelRole'], [], {});\ngoog.addDependency('net/xpc/directtransport.js', ['goog.net.xpc.DirectTransport'], ['goog.Timer', 'goog.async.Deferred', 'goog.events.EventHandler', 'goog.log', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes', 'goog.object'], {});\ngoog.addDependency('net/xpc/directtransport_test.js', ['goog.net.xpc.DirectTransportTest'], ['goog.Promise', 'goog.dom', 'goog.dom.TagName', 'goog.labs.userAgent.browser', 'goog.log', 'goog.log.Level', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.TransportTypes', 'goog.testing.TestCase', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/xpc/iframepollingtransport.js', ['goog.net.xpc.IframePollingTransport', 'goog.net.xpc.IframePollingTransport.Receiver', 'goog.net.xpc.IframePollingTransport.Sender'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.log', 'goog.log.Level', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes', 'goog.userAgent'], {});\ngoog.addDependency('net/xpc/iframepollingtransport_test.js', ['goog.net.xpc.IframePollingTransportTest'], ['goog.Timer', 'goog.dom', 'goog.dom.TagName', 'goog.functions', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.IframePollingTransport', 'goog.object', 'goog.testing.MockClock', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/xpc/nativemessagingtransport.js', ['goog.net.xpc.NativeMessagingTransport'], ['goog.Timer', 'goog.asserts', 'goog.async.Deferred', 'goog.events', 'goog.events.EventHandler', 'goog.log', 'goog.net.xpc', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.Transport', 'goog.net.xpc.TransportTypes'], {});\ngoog.addDependency('net/xpc/nativemessagingtransport_test.js', ['goog.net.xpc.NativeMessagingTransportTest'], ['goog.dom', 'goog.events', 'goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.CrossPageChannel', 'goog.net.xpc.CrossPageChannelRole', 'goog.net.xpc.NativeMessagingTransport', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('net/xpc/relay.js', ['goog.net.xpc.relay'], [], {'lang': 'es6'});\ngoog.addDependency('net/xpc/transport.js', ['goog.net.xpc.Transport'], ['goog.Disposable', 'goog.dom', 'goog.net.xpc.TransportNames'], {});\ngoog.addDependency('net/xpc/xpc.js', ['goog.net.xpc', 'goog.net.xpc.CfgFields', 'goog.net.xpc.ChannelStates', 'goog.net.xpc.TransportNames', 'goog.net.xpc.TransportTypes', 'goog.net.xpc.UriCfgFields'], ['goog.log'], {});\ngoog.addDependency('object/object.js', ['goog.object'], [], {'lang': 'es6'});\ngoog.addDependency('object/object_test.js', ['goog.objectTest'], ['goog.array', 'goog.functions', 'goog.object', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('positioning/absoluteposition.js', ['goog.positioning.AbsolutePosition'], ['goog.math.Coordinate', 'goog.positioning', 'goog.positioning.AbstractPosition'], {});\ngoog.addDependency('positioning/abstractposition.js', ['goog.positioning.AbstractPosition'], [], {});\ngoog.addDependency('positioning/anchoredposition.js', ['goog.positioning.AnchoredPosition'], ['goog.positioning', 'goog.positioning.AbstractPosition'], {});\ngoog.addDependency('positioning/anchoredposition_test.js', ['goog.positioning.AnchoredPositionTest'], ['goog.dom', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.style', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('positioning/anchoredviewportposition.js', ['goog.positioning.AnchoredViewportPosition'], ['goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus'], {});\ngoog.addDependency('positioning/anchoredviewportposition_test.js', ['goog.positioning.AnchoredViewportPositionTest'], ['goog.dom', 'goog.math.Box', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.positioning.OverflowStatus', 'goog.style', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('positioning/clientposition.js', ['goog.positioning.ClientPosition'], ['goog.asserts', 'goog.dom', 'goog.math.Coordinate', 'goog.positioning', 'goog.positioning.AbstractPosition', 'goog.style'], {});\ngoog.addDependency('positioning/clientposition_test.js', ['goog.positioning.clientPositionTest'], ['goog.dom', 'goog.dom.TagName', 'goog.positioning.ClientPosition', 'goog.positioning.Corner', 'goog.style', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('positioning/menuanchoredposition.js', ['goog.positioning.MenuAnchoredPosition'], ['goog.positioning.AnchoredViewportPosition', 'goog.positioning.Overflow'], {});\ngoog.addDependency('positioning/menuanchoredposition_test.js', ['goog.positioning.MenuAnchoredPositionTest'], ['goog.dom', 'goog.dom.TagName', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('positioning/positioning.js', ['goog.positioning', 'goog.positioning.Corner', 'goog.positioning.CornerBit', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.style', 'goog.style.bidi'], {});\ngoog.addDependency('positioning/positioning_test.js', ['goog.positioningTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.labs.userAgent.browser', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Size', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('positioning/viewportclientposition.js', ['goog.positioning.ViewportClientPosition'], ['goog.dom', 'goog.math.Coordinate', 'goog.positioning', 'goog.positioning.ClientPosition', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.style'], {});\ngoog.addDependency('positioning/viewportclientposition_test.js', ['goog.positioning.ViewportClientPositionTest'], ['goog.dom', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.ViewportClientPosition', 'goog.style', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('positioning/viewportposition.js', ['goog.positioning.ViewportPosition'], ['goog.math.Coordinate', 'goog.positioning', 'goog.positioning.AbstractPosition', 'goog.positioning.Corner', 'goog.style'], {});\ngoog.addDependency('promise/nativeresolver.js', ['goog.promise.NativeResolver'], [], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('promise/nativeresolver_test.js', ['goog.promise.nativeResolverTest'], ['goog.promise.NativeResolver', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('promise/promise.js', ['goog.Promise'], ['goog.Thenable', 'goog.asserts', 'goog.async.FreeList', 'goog.async.run', 'goog.async.throwException', 'goog.debug.Error', 'goog.promise.Resolver'], {});\ngoog.addDependency('promise/promise_test.js', ['goog.PromiseTest'], ['goog.Promise', 'goog.Thenable', 'goog.Timer', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es8', 'module': 'goog'});\ngoog.addDependency('promise/resolver.js', ['goog.promise.Resolver'], [], {});\ngoog.addDependency('promise/testsuiteadapter.js', ['goog.promise.testSuiteAdapter'], ['goog.Promise'], {});\ngoog.addDependency('promise/thenable.js', ['goog.Thenable'], [], {});\ngoog.addDependency('proto2/descriptor.js', ['goog.proto2.Descriptor', 'goog.proto2.Metadata'], ['goog.array', 'goog.asserts', 'goog.object', 'goog.string'], {});\ngoog.addDependency('proto2/descriptor_test.js', ['goog.proto2.DescriptorTest'], ['goog.proto2.Descriptor', 'goog.proto2.Message', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('proto2/fielddescriptor.js', ['goog.proto2.FieldDescriptor'], ['goog.asserts', 'goog.string'], {});\ngoog.addDependency('proto2/fielddescriptor_test.js', ['goog.proto2.FieldDescriptorTest'], ['goog.proto2.FieldDescriptor', 'goog.proto2.Message', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('proto2/lazydeserializer.js', ['goog.proto2.LazyDeserializer'], ['goog.asserts', 'goog.proto2.Message', 'goog.proto2.Serializer'], {});\ngoog.addDependency('proto2/message.js', ['goog.proto2.Message'], ['goog.asserts', 'goog.proto2.Descriptor', 'goog.proto2.FieldDescriptor'], {});\ngoog.addDependency('proto2/message_test.js', ['goog.proto2.MessageTest'], ['goog.testing.testSuite', 'proto2.TestAllTypes', 'proto2.TestAllTypes.NestedEnum', 'proto2.TestAllTypes.NestedMessage', 'proto2.TestAllTypes.OptionalGroup', 'proto2.TestAllTypes.RepeatedGroup'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('proto2/objectserializer.js', ['goog.proto2.ObjectSerializer'], ['goog.asserts', 'goog.proto2.FieldDescriptor', 'goog.proto2.Serializer', 'goog.string'], {});\ngoog.addDependency('proto2/objectserializer_test.js', ['goog.proto2.ObjectSerializerTest'], ['goog.proto2.ObjectSerializer', 'goog.proto2.Serializer', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'proto2.TestAllTypes'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('proto2/package_test.pb.js', ['someprotopackage.TestPackageTypes'], ['goog.proto2.Message', 'proto2.TestAllTypes'], {'lang': 'es6'});\ngoog.addDependency('proto2/pbliteserializer.js', ['goog.proto2.PbLiteSerializer'], ['goog.asserts', 'goog.proto2.FieldDescriptor', 'goog.proto2.LazyDeserializer', 'goog.proto2.Serializer'], {});\ngoog.addDependency('proto2/pbliteserializer_test.js', ['goog.proto2.PbLiteSerializerTest'], ['goog.proto2.PbLiteSerializer', 'goog.testing.testSuite', 'proto2.TestAllTypes'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('proto2/proto_test.js', ['goog.proto2.messageTest'], ['goog.proto2.FieldDescriptor', 'goog.testing.testSuite', 'proto2.TestAllTypes', 'proto2.TestDefaultParent', 'someprotopackage.TestPackageTypes'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('proto2/serializer.js', ['goog.proto2.Serializer'], ['goog.asserts', 'goog.proto2.FieldDescriptor', 'goog.proto2.Message'], {});\ngoog.addDependency('proto2/test.pb.js', ['proto2.TestAllTypes', 'proto2.TestAllTypes.NestedEnum', 'proto2.TestAllTypes.NestedMessage', 'proto2.TestAllTypes.OptionalGroup', 'proto2.TestAllTypes.RepeatedGroup', 'proto2.TestDefaultChild', 'proto2.TestDefaultParent'], ['goog.proto2.Message'], {});\ngoog.addDependency('proto2/textformatserializer.js', ['goog.proto2.TextFormatSerializer'], ['goog.array', 'goog.asserts', 'goog.math', 'goog.object', 'goog.proto2.FieldDescriptor', 'goog.proto2.Message', 'goog.proto2.Serializer', 'goog.string'], {});\ngoog.addDependency('proto2/textformatserializer_test.js', ['goog.proto2.TextFormatSerializerTest'], ['goog.proto2.ObjectSerializer', 'goog.proto2.TextFormatSerializer', 'goog.testing.testSuite', 'proto2.TestAllTypes'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('proto2/util.js', ['goog.proto2.Util'], ['goog.asserts'], {});\ngoog.addDependency('pubsub/pubsub.js', ['goog.pubsub.PubSub'], ['goog.Disposable', 'goog.array', 'goog.async.run'], {});\ngoog.addDependency('pubsub/pubsub_test.js', ['goog.pubsub.PubSubTest'], ['goog.array', 'goog.pubsub.PubSub', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('pubsub/topicid.js', ['goog.pubsub.TopicId'], [], {});\ngoog.addDependency('pubsub/typedpubsub.js', ['goog.pubsub.TypedPubSub'], ['goog.Disposable', 'goog.pubsub.PubSub'], {});\ngoog.addDependency('pubsub/typedpubsub_test.js', ['goog.pubsub.TypedPubSubTest'], ['goog.array', 'goog.pubsub.TopicId', 'goog.pubsub.TypedPubSub', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('reflect/reflect.js', ['goog.reflect'], [], {'lang': 'es6'});\ngoog.addDependency('reflect/reflect_test.js', ['goog.reflectTest'], ['goog.object', 'goog.reflect', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('result/chain_test.js', ['goog.result.chainTest'], ['goog.Timer', 'goog.result', 'goog.testing.MockClock', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('result/combine_test.js', ['goog.result.combineTest'], ['goog.Timer', 'goog.array', 'goog.result', 'goog.testing.MockClock', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('result/deferredadaptor.js', ['goog.result.DeferredAdaptor'], ['goog.async.Deferred', 'goog.result', 'goog.result.Result'], {});\ngoog.addDependency('result/deferredadaptor_test.js', ['goog.result.DeferredAdaptorTest'], ['goog.async.Deferred', 'goog.result', 'goog.result.DeferredAdaptor', 'goog.result.SimpleResult', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('result/dependentresult.js', ['goog.result.DependentResult'], ['goog.result.Result'], {});\ngoog.addDependency('result/result_interface.js', ['goog.result.Result'], ['goog.Thenable'], {});\ngoog.addDependency('result/resultutil.js', ['goog.result'], ['goog.array', 'goog.result.DependentResult', 'goog.result.Result', 'goog.result.SimpleResult'], {});\ngoog.addDependency('result/resultutil_test.js', ['goog.resultTest'], ['goog.result', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('result/simpleresult.js', ['goog.result.SimpleResult', 'goog.result.SimpleResult.StateError'], ['goog.Promise', 'goog.Thenable', 'goog.debug.Error', 'goog.result.Result'], {});\ngoog.addDependency('result/simpleresult_test.js', ['goog.result.SimpleResultTest'], ['goog.Promise', 'goog.Thenable', 'goog.Timer', 'goog.result', 'goog.testing.MockClock', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('result/transform_test.js', ['goog.result.transformTest'], ['goog.Timer', 'goog.result', 'goog.result.SimpleResult', 'goog.testing.MockClock', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('result/wait_test.js', ['goog.result.waitTest'], ['goog.Timer', 'goog.result', 'goog.result.SimpleResult', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('soy/data.js', ['goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind', 'goog.soy.data.SanitizedCss', 'goog.soy.data.SanitizedHtml', 'goog.soy.data.SanitizedHtmlAttribute', 'goog.soy.data.SanitizedJs', 'goog.soy.data.SanitizedTrustedResourceUri', 'goog.soy.data.SanitizedUri'], ['goog.Uri', 'goog.asserts', 'goog.html.SafeHtml', 'goog.html.SafeScript', 'goog.html.SafeStyle', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.html.uncheckedconversions', 'goog.i18n.bidi.Dir', 'goog.string.Const'], {});\ngoog.addDependency('soy/data_test.js', ['goog.soy.dataTest'], ['goog.html.SafeHtml', 'goog.html.SafeStyleSheet', 'goog.html.SafeUrl', 'goog.html.TrustedResourceUrl', 'goog.soy.testHelper', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('soy/renderer.js', ['goog.soy.InjectedDataSupplier', 'goog.soy.Renderer'], ['goog.asserts', 'goog.dom', 'goog.soy', 'goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind'], {});\ngoog.addDependency('soy/renderer_test.js', ['goog.soy.RendererTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.html.SafeHtml', 'goog.i18n.bidi.Dir', 'goog.soy.Renderer', 'goog.soy.data.SanitizedContentKind', 'goog.soy.testHelper', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('soy/soy.js', ['goog.soy'], ['goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.soy.data.SanitizedContent'], {});\ngoog.addDependency('soy/soy_test.js', ['goog.soyTest'], ['goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.functions', 'goog.soy', 'goog.soy.testHelper', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('soy/soy_testhelper.js', ['goog.soy.testHelper'], ['goog.dom', 'goog.dom.TagName', 'goog.i18n.bidi.Dir', 'goog.soy.data.SanitizedContent', 'goog.soy.data.SanitizedContentKind', 'goog.soy.data.SanitizedCss', 'goog.soy.data.SanitizedTrustedResourceUri', 'goog.string', 'goog.userAgent'], {'lang': 'es6'});\ngoog.addDependency('spell/spellcheck.js', ['goog.spell.SpellCheck', 'goog.spell.SpellCheck.WordChangedEvent'], ['goog.Timer', 'goog.events.Event', 'goog.events.EventTarget', 'goog.structs.Set'], {});\ngoog.addDependency('spell/spellcheck_test.js', ['goog.spell.SpellCheckTest'], ['goog.spell.SpellCheck', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('stats/basicstat.js', ['goog.stats.BasicStat'], ['goog.asserts', 'goog.log', 'goog.string.format', 'goog.structs.CircularBuffer'], {});\ngoog.addDependency('stats/basicstat_test.js', ['goog.stats.BasicStatTest'], ['goog.array', 'goog.stats.BasicStat', 'goog.string.format', 'goog.testing.PseudoRandom', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('storage/collectablestorage.js', ['goog.storage.CollectableStorage'], ['goog.array', 'goog.iter', 'goog.storage.ErrorCode', 'goog.storage.ExpiringStorage', 'goog.storage.RichStorage'], {});\ngoog.addDependency('storage/collectablestorage_test.js', ['goog.storage.CollectableStorageTest'], ['goog.storage.CollectableStorage', 'goog.storage.collectableStorageTester', 'goog.storage.storageTester', 'goog.testing.MockClock', 'goog.testing.storage.FakeMechanism', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('storage/collectablestoragetester.js', ['goog.storage.collectableStorageTester'], ['goog.testing.asserts'], {});\ngoog.addDependency('storage/encryptedstorage.js', ['goog.storage.EncryptedStorage'], ['goog.crypt', 'goog.crypt.Arc4', 'goog.crypt.Sha1', 'goog.crypt.base64', 'goog.json', 'goog.json.Serializer', 'goog.storage.CollectableStorage', 'goog.storage.ErrorCode', 'goog.storage.RichStorage'], {});\ngoog.addDependency('storage/encryptedstorage_test.js', ['goog.storage.EncryptedStorageTest'], ['goog.json', 'goog.storage.EncryptedStorage', 'goog.storage.ErrorCode', 'goog.storage.RichStorage', 'goog.storage.collectableStorageTester', 'goog.storage.storageTester', 'goog.testing.MockClock', 'goog.testing.PseudoRandom', 'goog.testing.storage.FakeMechanism', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('storage/errorcode.js', ['goog.storage.ErrorCode'], [], {});\ngoog.addDependency('storage/expiringstorage.js', ['goog.storage.ExpiringStorage'], ['goog.storage.RichStorage'], {});\ngoog.addDependency('storage/expiringstorage_test.js', ['goog.storage.ExpiringStorageTest'], ['goog.storage.ExpiringStorage', 'goog.storage.storageTester', 'goog.testing.MockClock', 'goog.testing.storage.FakeMechanism', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('storage/mechanism/errorcode.js', ['goog.storage.mechanism.ErrorCode'], [], {});\ngoog.addDependency('storage/mechanism/errorhandlingmechanism.js', ['goog.storage.mechanism.ErrorHandlingMechanism'], ['goog.storage.mechanism.Mechanism'], {});\ngoog.addDependency('storage/mechanism/errorhandlingmechanism_test.js', ['goog.storage.mechanism.ErrorHandlingMechanismTest'], ['goog.storage.mechanism.ErrorHandlingMechanism', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('storage/mechanism/html5localstorage.js', ['goog.storage.mechanism.HTML5LocalStorage'], ['goog.storage.mechanism.HTML5WebStorage'], {});\ngoog.addDependency('storage/mechanism/html5localstorage_test.js', ['goog.storage.mechanism.HTML5LocalStorageTest'], ['goog.storage.mechanism.HTML5LocalStorage', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.storage.mechanism.mechanismTestDefinition', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('storage/mechanism/html5sessionstorage.js', ['goog.storage.mechanism.HTML5SessionStorage'], ['goog.storage.mechanism.HTML5WebStorage'], {});\ngoog.addDependency('storage/mechanism/html5sessionstorage_test.js', ['goog.storage.mechanism.HTML5SessionStorageTest'], ['goog.storage.mechanism.HTML5SessionStorage', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.storage.mechanism.mechanismTestDefinition', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('storage/mechanism/html5webstorage.js', ['goog.storage.mechanism.HTML5WebStorage'], ['goog.asserts', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.IterableMechanism'], {});\ngoog.addDependency('storage/mechanism/html5webstorage_test.js', ['goog.storage.mechanism.HTML5MockStorage', 'goog.storage.mechanism.HTML5WebStorageTest', 'goog.storage.mechanism.MockThrowableStorage'], ['goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.HTML5WebStorage', 'goog.testing.jsunit'], {'lang': 'es6'});\ngoog.addDependency('storage/mechanism/ieuserdata.js', ['goog.storage.mechanism.IEUserData'], ['goog.asserts', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.storage.mechanism.ErrorCode', 'goog.storage.mechanism.IterableMechanism', 'goog.structs.Map', 'goog.userAgent'], {});\ngoog.addDependency('storage/mechanism/ieuserdata_test.js', ['goog.storage.mechanism.IEUserDataTest'], ['goog.storage.mechanism.IEUserData', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.storage.mechanism.mechanismTestDefinition', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('storage/mechanism/iterablemechanism.js', ['goog.storage.mechanism.IterableMechanism'], ['goog.array', 'goog.asserts', 'goog.iter', 'goog.storage.mechanism.Mechanism'], {});\ngoog.addDependency('storage/mechanism/iterablemechanismtester.js', ['goog.storage.mechanism.iterableMechanismTester'], ['goog.iter', 'goog.iter.StopIteration', 'goog.testing.asserts'], {});\ngoog.addDependency('storage/mechanism/mechanism.js', ['goog.storage.mechanism.Mechanism'], [], {});\ngoog.addDependency('storage/mechanism/mechanismfactory.js', ['goog.storage.mechanism.mechanismfactory'], ['goog.storage.mechanism.HTML5LocalStorage', 'goog.storage.mechanism.HTML5SessionStorage', 'goog.storage.mechanism.IEUserData', 'goog.storage.mechanism.PrefixedMechanism'], {});\ngoog.addDependency('storage/mechanism/mechanismfactory_test.js', ['goog.storage.mechanism.mechanismfactoryTest'], ['goog.storage.mechanism.mechanismfactory', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('storage/mechanism/mechanismseparationtester.js', ['goog.storage.mechanism.mechanismSeparationTester'], ['goog.iter.StopIteration', 'goog.storage.mechanism.mechanismTestDefinition', 'goog.testing.asserts'], {});\ngoog.addDependency('storage/mechanism/mechanismsharingtester.js', ['goog.storage.mechanism.mechanismSharingTester'], ['goog.iter.StopIteration', 'goog.storage.mechanism.mechanismTestDefinition', 'goog.testing.asserts'], {});\ngoog.addDependency('storage/mechanism/mechanismtestdefinition.js', ['goog.storage.mechanism.mechanismTestDefinition'], [], {});\ngoog.addDependency('storage/mechanism/mechanismtester.js', ['goog.storage.mechanism.mechanismTester'], ['goog.storage.mechanism.ErrorCode', 'goog.testing.asserts', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});\ngoog.addDependency('storage/mechanism/prefixedmechanism.js', ['goog.storage.mechanism.PrefixedMechanism'], ['goog.iter.Iterator', 'goog.storage.mechanism.IterableMechanism'], {});\ngoog.addDependency('storage/mechanism/prefixedmechanism_test.js', ['goog.storage.mechanism.PrefixedMechanismTest'], ['goog.storage.mechanism.HTML5LocalStorage', 'goog.storage.mechanism.PrefixedMechanism', 'goog.storage.mechanism.mechanismSeparationTester', 'goog.storage.mechanism.mechanismSharingTester', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('storage/richstorage.js', ['goog.storage.RichStorage', 'goog.storage.RichStorage.Wrapper'], ['goog.storage.ErrorCode', 'goog.storage.Storage'], {});\ngoog.addDependency('storage/richstorage_test.js', ['goog.storage.RichStorageTest'], ['goog.storage.ErrorCode', 'goog.storage.RichStorage', 'goog.storage.storageTester', 'goog.testing.storage.FakeMechanism', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('storage/storage.js', ['goog.storage.Storage'], ['goog.json', 'goog.storage.ErrorCode'], {});\ngoog.addDependency('storage/storage_test.js', ['goog.storage.storage_test'], ['goog.functions', 'goog.storage.ErrorCode', 'goog.storage.Storage', 'goog.storage.storageTester', 'goog.testing.asserts', 'goog.testing.storage.FakeMechanism', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('storage/storagetester.js', ['goog.storage.storageTester'], ['goog.storage.Storage', 'goog.structs.Map', 'goog.testing.asserts'], {});\ngoog.addDependency('streams/defines.js', ['goog.streams.defines'], [], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('streams/full.js', ['goog.streams.full'], ['goog.streams.defines', 'goog.streams.fullImpl', 'goog.streams.fullNativeImpl', 'goog.streams.fullTypes'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('streams/full_impl.js', ['goog.streams.fullImpl'], ['goog.asserts', 'goog.promise.NativeResolver', 'goog.streams.fullTypes', 'goog.streams.liteImpl'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('streams/full_impl_test.js', ['goog.streams.fullImplTest'], ['goog.streams.fullImpl', 'goog.streams.fullTestCases', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('streams/full_native_impl.js', ['goog.streams.fullNativeImpl'], ['goog.streams.fullTypes', 'goog.streams.liteNativeImpl'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('streams/full_native_impl_test.js', ['goog.streams.fullNativeImplTest'], ['goog.streams.fullNativeImpl', 'goog.streams.fullTestCases', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('streams/full_test_cases.js', ['goog.streams.fullTestCases'], ['goog.streams.fullTypes', 'goog.streams.liteTestCases', 'goog.testing.recordFunction'], {'lang': 'es9', 'module': 'goog'});\ngoog.addDependency('streams/full_types.js', ['goog.streams.fullTypes'], ['goog.streams.liteTypes'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('streams/lite.js', ['goog.streams.lite'], ['goog.streams.defines', 'goog.streams.liteImpl', 'goog.streams.liteNativeImpl', 'goog.streams.liteTypes'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('streams/lite_impl.js', ['goog.streams.liteImpl'], ['goog.asserts', 'goog.promise.NativeResolver', 'goog.streams.liteTypes'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('streams/lite_impl_test.js', ['goog.streams.liteImplTest'], ['goog.streams.liteImpl', 'goog.streams.liteTestCases', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('streams/lite_native_impl.js', ['goog.streams.liteNativeImpl'], ['goog.streams.liteTypes'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('streams/lite_native_impl_test.js', ['goog.streams.liteNativeImplTest'], ['goog.streams.liteNativeImpl', 'goog.streams.liteTestCases', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('streams/lite_test_cases.js', ['goog.streams.liteTestCases'], ['goog.streams.liteTypes', 'goog.testing.jsunit'], {'lang': 'es8', 'module': 'goog'});\ngoog.addDependency('streams/lite_types.js', ['goog.streams.liteTypes'], [], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('string/const.js', ['goog.string.Const'], ['goog.asserts', 'goog.string.TypedString'], {});\ngoog.addDependency('string/const_test.js', ['goog.string.constTest'], ['goog.string.Const', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('string/internal.js', ['goog.string.internal'], [], {'lang': 'es6'});\ngoog.addDependency('string/linkify.js', ['goog.string.linkify'], ['goog.html.SafeHtml', 'goog.string'], {});\ngoog.addDependency('string/linkify_test.js', ['goog.string.linkifyTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.string', 'goog.string.linkify', 'goog.testing.dom', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('string/newlines.js', ['goog.string.newlines', 'goog.string.newlines.Line'], ['goog.array'], {});\ngoog.addDependency('string/newlines_test.js', ['goog.string.newlinesTest'], ['goog.string.newlines', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('string/parser.js', ['goog.string.Parser'], [], {});\ngoog.addDependency('string/path.js', ['goog.string.path'], ['goog.array', 'goog.string'], {});\ngoog.addDependency('string/path_test.js', ['goog.string.pathTest'], ['goog.string.path', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('string/string.js', ['goog.string', 'goog.string.Unicode'], ['goog.dom.safe', 'goog.html.uncheckedconversions', 'goog.string.Const', 'goog.string.internal'], {});\ngoog.addDependency('string/string_test.js', ['goog.stringTest'], ['goog.dom', 'goog.dom.TagName', 'goog.functions', 'goog.object', 'goog.string', 'goog.string.Unicode', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('string/stringbuffer.js', ['goog.string.StringBuffer'], [], {'lang': 'es6'});\ngoog.addDependency('string/stringbuffer_test.js', ['goog.string.StringBufferTest'], ['goog.string.StringBuffer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('string/stringformat.js', ['goog.string.format'], ['goog.string'], {});\ngoog.addDependency('string/stringformat_test.js', ['goog.string.formatTest'], ['goog.string.format', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('string/stringifier.js', ['goog.string.Stringifier'], [], {});\ngoog.addDependency('string/typedstring.js', ['goog.string.TypedString'], [], {});\ngoog.addDependency('structs/avltree.js', ['goog.structs.AvlTree'], ['goog.asserts', 'goog.structs.Collection'], {'module': 'goog'});\ngoog.addDependency('structs/avltree_test.js', ['goog.structs.AvlTreeTest'], ['goog.array', 'goog.structs.AvlTree', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/circularbuffer.js', ['goog.structs.CircularBuffer'], [], {'lang': 'es6'});\ngoog.addDependency('structs/circularbuffer_test.js', ['goog.structs.CircularBufferTest'], ['goog.structs.CircularBuffer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/collection.js', ['goog.structs.Collection'], [], {});\ngoog.addDependency('structs/collection_test.js', ['goog.structs.CollectionTest'], ['goog.structs.AvlTree', 'goog.structs.Set', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/heap.js', ['goog.structs.Heap'], ['goog.array', 'goog.object', 'goog.structs.Node'], {});\ngoog.addDependency('structs/heap_test.js', ['goog.structs.HeapTest'], ['goog.structs', 'goog.structs.Heap', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/inversionmap.js', ['goog.structs.InversionMap'], ['goog.array', 'goog.asserts'], {});\ngoog.addDependency('structs/inversionmap_test.js', ['goog.structs.InversionMapTest'], ['goog.structs.InversionMap', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/linkedmap.js', ['goog.structs.LinkedMap'], ['goog.structs.Map'], {});\ngoog.addDependency('structs/linkedmap_test.js', ['goog.structs.LinkedMapTest'], ['goog.structs.LinkedMap', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/map.js', ['goog.structs.Map'], ['goog.iter.Iterator', 'goog.iter.StopIteration'], {});\ngoog.addDependency('structs/map_test.js', ['goog.structs.MapTest'], ['goog.iter', 'goog.structs', 'goog.structs.Map', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/node.js', ['goog.structs.Node'], [], {});\ngoog.addDependency('structs/pool.js', ['goog.structs.Pool'], ['goog.Disposable', 'goog.structs.Queue', 'goog.structs.Set'], {});\ngoog.addDependency('structs/pool_test.js', ['goog.structs.PoolTest'], ['goog.structs.Pool', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/prioritypool.js', ['goog.structs.PriorityPool'], ['goog.structs.Pool', 'goog.structs.PriorityQueue'], {});\ngoog.addDependency('structs/prioritypool_test.js', ['goog.structs.PriorityPoolTest'], ['goog.structs.PriorityPool', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/priorityqueue.js', ['goog.structs.PriorityQueue'], ['goog.structs.Heap'], {});\ngoog.addDependency('structs/priorityqueue_test.js', ['goog.structs.PriorityQueueTest'], ['goog.structs', 'goog.structs.PriorityQueue', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/quadtree.js', ['goog.structs.QuadTree', 'goog.structs.QuadTree.Node', 'goog.structs.QuadTree.Point'], ['goog.math.Coordinate'], {});\ngoog.addDependency('structs/quadtree_test.js', ['goog.structs.QuadTreeTest'], ['goog.structs', 'goog.structs.QuadTree', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/queue.js', ['goog.structs.Queue'], ['goog.array'], {});\ngoog.addDependency('structs/queue_test.js', ['goog.structs.QueueTest'], ['goog.structs.Queue', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/set.js', ['goog.structs.Set'], ['goog.structs', 'goog.structs.Collection', 'goog.structs.Map'], {});\ngoog.addDependency('structs/set_test.js', ['goog.structs.SetTest'], ['goog.iter', 'goog.structs', 'goog.structs.Set', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/simplepool.js', ['goog.structs.SimplePool'], ['goog.Disposable'], {});\ngoog.addDependency('structs/stringset.js', ['goog.structs.StringSet'], ['goog.asserts', 'goog.iter'], {});\ngoog.addDependency('structs/stringset_test.js', ['goog.structs.StringSetTest'], ['goog.array', 'goog.iter', 'goog.structs.StringSet', 'goog.testing.asserts', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/structs.js', ['goog.structs'], ['goog.array', 'goog.object'], {});\ngoog.addDependency('structs/structs_test.js', ['goog.structsTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.structs', 'goog.structs.Map', 'goog.structs.Set', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/treenode.js', ['goog.structs.TreeNode'], ['goog.array', 'goog.asserts', 'goog.structs.Node'], {});\ngoog.addDependency('structs/treenode_test.js', ['goog.structs.TreeNodeTest'], ['goog.structs.TreeNode', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('structs/trie.js', ['goog.structs.Trie'], ['goog.object', 'goog.structs'], {});\ngoog.addDependency('structs/trie_test.js', ['goog.structs.TrieTest'], ['goog.object', 'goog.structs', 'goog.structs.Trie', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('style/bidi.js', ['goog.style.bidi'], ['goog.dom', 'goog.style', 'goog.userAgent', 'goog.userAgent.platform', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});\ngoog.addDependency('style/bidi_test.js', ['goog.style.bidiTest'], ['goog.dom', 'goog.style', 'goog.style.bidi', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('style/cursor.js', ['goog.style.cursor'], ['goog.userAgent'], {});\ngoog.addDependency('style/cursor_test.js', ['goog.style.cursorTest'], ['goog.style.cursor', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('style/style.js', ['goog.style'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.vendor', 'goog.html.SafeStyleSheet', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.object', 'goog.reflect', 'goog.string', 'goog.userAgent'], {});\ngoog.addDependency('style/style_document_scroll_test.js', ['goog.style.style_document_scroll_test'], ['goog.dom', 'goog.style', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('style/style_test.js', ['goog.style_test'], ['goog.array', 'goog.color', 'goog.dom', 'goog.dom.TagName', 'goog.events.BrowserEvent', 'goog.html.testing', 'goog.labs.userAgent.util', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.math.Size', 'goog.object', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.MockUserAgent', 'goog.testing.asserts', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgentTestUtil', 'goog.userAgentTestUtil.UserAgents'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('style/style_webkit_scrollbars_test.js', ['goog.style.webkitScrollbarsTest'], ['goog.asserts', 'goog.style', 'goog.styleScrollbarTester', 'goog.testing.ExpectedFailures', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('style/stylescrollbartester.js', ['goog.styleScrollbarTester'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.testing.asserts'], {});\ngoog.addDependency('style/transform.js', ['goog.style.transform'], ['goog.functions', 'goog.math.Coordinate', 'goog.math.Coordinate3', 'goog.style', 'goog.userAgent', 'goog.userAgent.product.isVersion'], {});\ngoog.addDependency('style/transform_test.js', ['goog.style.transformTest'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.style.transform', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product.isVersion'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('style/transition.js', ['goog.style.transition', 'goog.style.transition.Css3Property'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.dom.vendor', 'goog.functions', 'goog.html.SafeHtml', 'goog.style', 'goog.userAgent'], {});\ngoog.addDependency('style/transition_test.js', ['goog.style.transitionTest'], ['goog.style', 'goog.style.transition', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('test_module.js', ['goog.test_module'], ['goog.test_module_dep'], {'module': 'goog'});\ngoog.addDependency('test_module_dep.js', ['goog.test_module_dep'], [], {'module': 'goog'});\ngoog.addDependency('testing/assertionfailure.js', ['goog.testing.safe.assertionFailure'], ['goog.asserts', 'goog.testing.asserts'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/asserts.js', ['goog.testing.asserts'], ['goog.testing.JsUnitException'], {});\ngoog.addDependency('testing/asserts_test.js', ['goog.testing.assertsTest'], ['goog.Promise', 'goog.array', 'goog.async.Deferred', 'goog.dom', 'goog.iter.Iterator', 'goog.iter.StopIteration', 'goog.structs.Map', 'goog.structs.Set', 'goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es8', 'module': 'goog'});\ngoog.addDependency('testing/async/mockcontrol.js', ['goog.testing.async.MockControl'], ['goog.asserts', 'goog.async.Deferred', 'goog.debug', 'goog.testing.MockControl', 'goog.testing.asserts', 'goog.testing.mockmatchers.IgnoreArgument'], {});\ngoog.addDependency('testing/async/mockcontrol_test.js', ['goog.testing.async.MockControlTest'], ['goog.async.Deferred', 'goog.testing.MockControl', 'goog.testing.asserts', 'goog.testing.async.MockControl', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/asynctestcase.js', ['goog.testing.AsyncTestCase', 'goog.testing.AsyncTestCase.ControlBreakingException'], ['goog.asserts', 'goog.testing.TestCase', 'goog.testing.asserts'], {});\ngoog.addDependency('testing/asynctestcase_async_test.js', ['goog.testing.AsyncTestCaseAsyncTest'], ['goog.testing.AsyncTestCase', 'goog.testing.TestCase', 'goog.testing.jsunit'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/asynctestcase_noasync_test.js', ['goog.testing.AsyncTestCaseSyncTest'], ['goog.testing.AsyncTestCase', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/asynctestcase_test.js', ['goog.testing.AsyncTestCaseTest'], ['goog.debug.Error', 'goog.testing.AsyncTestCase', 'goog.testing.asserts', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/benchmark.js', ['goog.testing.benchmark'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.PerformanceTable', 'goog.testing.PerformanceTimer', 'goog.testing.TestCase'], {});\ngoog.addDependency('testing/continuationtestcase.js', ['goog.testing.ContinuationTestCase', 'goog.testing.ContinuationTestCase.ContinuationTest', 'goog.testing.ContinuationTestCase.Step'], ['goog.array', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.testing.TestCase', 'goog.testing.asserts'], {});\ngoog.addDependency('testing/continuationtestcase_test.js', ['goog.testing.ContinuationTestCaseTest'], ['goog.events', 'goog.events.EventTarget', 'goog.testing.ContinuationTestCase', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.jsunit'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/deferredtestcase.js', ['goog.testing.DeferredTestCase'], ['goog.async.Deferred', 'goog.testing.AsyncTestCase', 'goog.testing.TestCase'], {});\ngoog.addDependency('testing/deferredtestcase_test.js', ['goog.testing.DeferredTestCaseTest'], ['goog.async.Deferred', 'goog.testing.DeferredTestCase', 'goog.testing.TestCase', 'goog.testing.TestRunner', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/dom.js', ['goog.testing.dom'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.AbstractRange', 'goog.dom.InputType', 'goog.dom.NodeIterator', 'goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.iter', 'goog.object', 'goog.string', 'goog.style', 'goog.testing.asserts', 'goog.userAgent'], {});\ngoog.addDependency('testing/dom_test.js', ['goog.testing.domTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.dom', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/editor/dom.js', ['goog.testing.editor.dom'], ['goog.dom.AbstractRange', 'goog.dom.NodeType', 'goog.dom.TagIterator', 'goog.dom.TagWalkType', 'goog.iter', 'goog.string', 'goog.testing.asserts'], {});\ngoog.addDependency('testing/editor/dom_test.js', ['goog.testing.editor.domTest'], ['goog.dom', 'goog.dom.TagName', 'goog.functions', 'goog.testing.editor.dom', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/editor/fieldmock.js', ['goog.testing.editor.FieldMock'], ['goog.dom', 'goog.dom.Range', 'goog.editor.Field', 'goog.testing.LooseMock', 'goog.testing.mockmatchers'], {});\ngoog.addDependency('testing/editor/testhelper.js', ['goog.testing.editor.TestHelper'], ['goog.Disposable', 'goog.dom', 'goog.dom.Range', 'goog.editor.BrowserFeature', 'goog.editor.node', 'goog.editor.plugins.AbstractBubblePlugin', 'goog.testing.dom'], {});\ngoog.addDependency('testing/editor/testhelper_test.js', ['goog.testing.editor.TestHelperTest'], ['goog.dom', 'goog.dom.TagName', 'goog.editor.node', 'goog.testing.editor.TestHelper', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/events/eventobserver.js', ['goog.testing.events.EventObserver'], ['goog.array', 'goog.events.Event'], {});\ngoog.addDependency('testing/events/eventobserver_test.js', ['goog.testing.events.EventObserverTest'], ['goog.array', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.testing.events.EventObserver', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/events/events.js', ['goog.testing.events', 'goog.testing.events.Event'], ['goog.Disposable', 'goog.asserts', 'goog.dom.NodeType', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.BrowserFeature', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.object', 'goog.style', 'goog.userAgent'], {});\ngoog.addDependency('testing/events/events_test.js', ['goog.testing.eventsTest'], ['goog.array', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Coordinate', 'goog.string', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/events/matchers.js', ['goog.testing.events.EventMatcher'], ['goog.events.Event', 'goog.testing.mockmatchers.ArgumentMatcher'], {});\ngoog.addDependency('testing/events/matchers_test.js', ['goog.testing.events.EventMatcherTest'], ['goog.events.Event', 'goog.testing.events.EventMatcher', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/events/onlinehandler.js', ['goog.testing.events.OnlineHandler'], ['goog.events.EventTarget', 'goog.net.NetworkStatusMonitor'], {});\ngoog.addDependency('testing/events/onlinehandler_test.js', ['goog.testing.events.OnlineHandlerTest'], ['goog.events', 'goog.net.NetworkStatusMonitor', 'goog.testing.events.EventObserver', 'goog.testing.events.OnlineHandler', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/expectedfailures.js', ['goog.testing.ExpectedFailures'], ['goog.asserts', 'goog.debug.DivConsole', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.log', 'goog.style', 'goog.testing.JsUnitException', 'goog.testing.TestCase', 'goog.testing.asserts'], {});\ngoog.addDependency('testing/expectedfailures_test.js', ['goog.testing.ExpectedFailuresTest'], ['goog.debug.Logger', 'goog.testing.ExpectedFailures', 'goog.testing.JsUnitException', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/fs/blob.js', ['goog.testing.fs.Blob'], ['goog.crypt', 'goog.crypt.base64'], {});\ngoog.addDependency('testing/fs/blob_test.js', ['goog.testing.fs.BlobTest'], ['goog.dom', 'goog.testing.fs.Blob', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/fs/directoryentry_test.js', ['goog.testing.fs.DirectoryEntryTest'], ['goog.array', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.testing.MockClock', 'goog.testing.TestCase', 'goog.testing.fs.FileSystem', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/fs/entry.js', ['goog.testing.fs.DirectoryEntry', 'goog.testing.fs.Entry', 'goog.testing.fs.FileEntry'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.async.Deferred', 'goog.fs.DirectoryEntry', 'goog.fs.DirectoryEntryImpl', 'goog.fs.Entry', 'goog.fs.Error', 'goog.fs.FileEntry', 'goog.functions', 'goog.object', 'goog.string', 'goog.testing.fs.File', 'goog.testing.fs.FileWriter'], {});\ngoog.addDependency('testing/fs/entry_test.js', ['goog.testing.fs.EntryTest'], ['goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.testing.MockClock', 'goog.testing.TestCase', 'goog.testing.fs.FileSystem', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/fs/file.js', ['goog.testing.fs.File'], ['goog.testing.fs.Blob'], {});\ngoog.addDependency('testing/fs/fileentry_test.js', ['goog.testing.fs.FileEntryTest'], ['goog.testing.MockClock', 'goog.testing.fs.FileEntry', 'goog.testing.fs.FileSystem', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/fs/filereader.js', ['goog.testing.fs.FileReader'], ['goog.Timer', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.testing.fs.Blob', 'goog.testing.fs.ProgressEvent'], {});\ngoog.addDependency('testing/fs/filereader_test.js', ['goog.testing.fs.FileReaderTest'], ['goog.Promise', 'goog.array', 'goog.events', 'goog.fs.Error', 'goog.fs.FileReader', 'goog.object', 'goog.testing.events.EventObserver', 'goog.testing.fs.FileReader', 'goog.testing.fs.FileSystem', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/fs/filesystem.js', ['goog.testing.fs.FileSystem'], ['goog.fs.FileSystem', 'goog.testing.fs.DirectoryEntry'], {});\ngoog.addDependency('testing/fs/filewriter.js', ['goog.testing.fs.FileWriter'], ['goog.Timer', 'goog.events.EventTarget', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.string', 'goog.testing.fs.Blob', 'goog.testing.fs.File', 'goog.testing.fs.ProgressEvent'], {});\ngoog.addDependency('testing/fs/filewriter_test.js', ['goog.testing.fs.FileWriterTest'], ['goog.Promise', 'goog.array', 'goog.events', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.object', 'goog.testing.MockClock', 'goog.testing.events.EventObserver', 'goog.testing.fs.Blob', 'goog.testing.fs.FileSystem', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/fs/fs.js', ['goog.testing.fs'], ['goog.Timer', 'goog.array', 'goog.async.Deferred', 'goog.fs', 'goog.testing.PropertyReplacer', 'goog.testing.fs.Blob', 'goog.testing.fs.FileSystem'], {});\ngoog.addDependency('testing/fs/fs_test.js', ['goog.testing.fsTest'], ['goog.testing.fs', 'goog.testing.fs.Blob', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/fs/integration_test.js', ['goog.testing.fs.integrationTest'], ['goog.Promise', 'goog.events', 'goog.fs', 'goog.fs.DirectoryEntry', 'goog.fs.Error', 'goog.fs.FileSaver', 'goog.testing.PropertyReplacer', 'goog.testing.fs', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/fs/progressevent.js', ['goog.testing.fs.ProgressEvent'], ['goog.events.Event'], {});\ngoog.addDependency('testing/functionmock.js', ['goog.testing', 'goog.testing.FunctionMock', 'goog.testing.GlobalFunctionMock', 'goog.testing.MethodMock'], ['goog.object', 'goog.testing.LooseMock', 'goog.testing.Mock', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock'], {});\ngoog.addDependency('testing/functionmock_test.js', ['goog.testing.FunctionMockTest'], ['goog.array', 'goog.string', 'goog.testing', 'goog.testing.FunctionMock', 'goog.testing.Mock', 'goog.testing.StrictMock', 'goog.testing.asserts', 'goog.testing.mockmatchers', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/graphics.js', ['goog.testing.graphics'], ['goog.graphics.Path', 'goog.testing.asserts'], {});\ngoog.addDependency('testing/i18n/asserts.js', ['goog.testing.i18n.asserts'], ['goog.testing.jsunit'], {'lang': 'es6'});\ngoog.addDependency('testing/i18n/asserts_test.js', ['goog.testing.i18n.assertsTest'], ['goog.testing.ExpectedFailures', 'goog.testing.i18n.asserts', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/jstdasyncwrapper.js', ['goog.testing.JsTdAsyncWrapper'], ['goog.Promise'], {});\ngoog.addDependency('testing/jstdtestcaseadapter.js', ['goog.testing.JsTdTestCaseAdapter'], ['goog.async.run', 'goog.functions', 'goog.testing.JsTdAsyncWrapper', 'goog.testing.TestCase', 'goog.testing.jsunit'], {});\ngoog.addDependency('testing/jsunit.js', ['goog.testing.jsunit'], ['goog.dom.TagName', 'goog.testing.TestCase', 'goog.testing.TestRunner', 'goog.userAgent'], {});\ngoog.addDependency('testing/jsunitexception.js', ['goog.testing.JsUnitException'], ['goog.testing.stacktrace'], {});\ngoog.addDependency('testing/loosemock.js', ['goog.testing.LooseExpectationCollection', 'goog.testing.LooseMock'], ['goog.array', 'goog.asserts', 'goog.structs.Map', 'goog.structs.Set', 'goog.testing.Mock'], {});\ngoog.addDependency('testing/loosemock_test.js', ['goog.testing.LooseMockTest'], ['goog.testing.LooseMock', 'goog.testing.mockmatchers', 'goog.testing.testSuite'], {'lang': 'es8', 'module': 'goog'});\ngoog.addDependency('testing/messaging/mockmessagechannel.js', ['goog.testing.messaging.MockMessageChannel'], ['goog.messaging.AbstractChannel', 'goog.testing.MockControl', 'goog.testing.asserts'], {});\ngoog.addDependency('testing/messaging/mockmessageevent.js', ['goog.testing.messaging.MockMessageEvent'], ['goog.events.BrowserEvent', 'goog.events.EventType', 'goog.testing.events.Event'], {});\ngoog.addDependency('testing/messaging/mockmessageport.js', ['goog.testing.messaging.MockMessagePort'], ['goog.events.EventTarget', 'goog.testing.MockControl'], {});\ngoog.addDependency('testing/messaging/mockportnetwork.js', ['goog.testing.messaging.MockPortNetwork'], ['goog.messaging.PortNetwork', 'goog.testing.messaging.MockMessageChannel'], {});\ngoog.addDependency('testing/mock.js', ['goog.testing.Mock', 'goog.testing.MockExpectation'], ['goog.Promise', 'goog.array', 'goog.asserts', 'goog.object', 'goog.promise.Resolver', 'goog.testing.JsUnitException', 'goog.testing.MockInterface', 'goog.testing.mockmatchers'], {});\ngoog.addDependency('testing/mock_test.js', ['goog.testing.MockTest'], ['goog.array', 'goog.testing', 'goog.testing.Mock', 'goog.testing.MockControl', 'goog.testing.MockExpectation', 'goog.testing.testSuite'], {'lang': 'es8', 'module': 'goog'});\ngoog.addDependency('testing/mockclassfactory.js', ['goog.testing.MockClassFactory', 'goog.testing.MockClassRecord'], ['goog.array', 'goog.object', 'goog.testing.LooseMock', 'goog.testing.StrictMock', 'goog.testing.TestCase', 'goog.testing.mockmatchers'], {});\ngoog.addDependency('testing/mockclassfactory_test.js', ['fake.BaseClass', 'fake.ChildClass', 'goog.testing.MockClassFactoryTest'], ['goog.testing', 'goog.testing.MockClassFactory', 'goog.testing.jsunit'], {'lang': 'es6'});\ngoog.addDependency('testing/mockclock.js', ['goog.testing.MockClock'], ['goog.Disposable', 'goog.Promise', 'goog.Thenable', 'goog.async.run', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.events.Event'], {});\ngoog.addDependency('testing/mockclock_test.js', ['goog.testing.MockClockTest'], ['goog.Promise', 'goog.Timer', 'goog.events', 'goog.functions', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/mockcontrol.js', ['goog.testing.MockControl'], ['goog.Promise', 'goog.array', 'goog.testing', 'goog.testing.LooseMock', 'goog.testing.StrictMock'], {});\ngoog.addDependency('testing/mockcontrol_test.js', ['goog.testing.MockControlTest'], ['goog.testing.Mock', 'goog.testing.MockControl', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/mockinterface.js', ['goog.testing.MockInterface'], ['goog.Promise'], {});\ngoog.addDependency('testing/mockmatchers.js', ['goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.testing.mockmatchers.IgnoreArgument', 'goog.testing.mockmatchers.InstanceOf', 'goog.testing.mockmatchers.ObjectEquals', 'goog.testing.mockmatchers.RegexpMatch', 'goog.testing.mockmatchers.SaveArgument', 'goog.testing.mockmatchers.TypeOf'], ['goog.array', 'goog.dom', 'goog.testing.asserts'], {});\ngoog.addDependency('testing/mockmatchers_test.js', ['goog.testing.mockmatchersTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.jsunit', 'goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher'], {'lang': 'es6'});\ngoog.addDependency('testing/mockrandom.js', ['goog.testing.MockRandom'], ['goog.Disposable'], {});\ngoog.addDependency('testing/mockrandom_test.js', ['goog.testing.MockRandomTest'], ['goog.testing.MockRandom', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/mockrange.js', ['goog.testing.MockRange'], ['goog.dom.AbstractRange', 'goog.testing.LooseMock'], {});\ngoog.addDependency('testing/mockrange_test.js', ['goog.testing.MockRangeTest'], ['goog.testing.MockRange', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/mockstorage.js', ['goog.testing.MockStorage'], ['goog.structs.Map'], {});\ngoog.addDependency('testing/mockstorage_test.js', ['goog.testing.MockStorageTest'], ['goog.testing.MockStorage', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/mockuseragent.js', ['goog.testing.MockUserAgent'], ['goog.Disposable', 'goog.labs.userAgent.util', 'goog.testing.PropertyReplacer', 'goog.userAgent'], {});\ngoog.addDependency('testing/mockuseragent_test.js', ['goog.testing.MockUserAgentTest'], ['goog.dispose', 'goog.testing.MockUserAgent', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/multitestrunner.js', ['goog.testing.MultiTestRunner', 'goog.testing.MultiTestRunner.TestFrame'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.functions', 'goog.object', 'goog.string', 'goog.testing.TestCase', 'goog.ui.Component', 'goog.ui.ServerChart', 'goog.ui.TableSorter'], {});\ngoog.addDependency('testing/multitestrunner_test.js', ['goog.testing.MultiTestRunnerTest'], ['goog.Promise', 'goog.array', 'goog.events', 'goog.testing.MockControl', 'goog.testing.MultiTestRunner', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.events', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/net/mockiframeio.js', ['goog.testing.net.MockIFrameIo'], ['goog.events.EventTarget', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.IframeIo', 'goog.testing.TestQueue'], {});\ngoog.addDependency('testing/net/xhrio.js', ['goog.testing.net.XhrIo'], ['goog.Uri', 'goog.array', 'goog.dom.xml', 'goog.events', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.HttpStatus', 'goog.net.XhrIo', 'goog.net.XmlHttp', 'goog.object', 'goog.structs', 'goog.structs.Map', 'goog.testing.TestQueue', 'goog.uri.utils'], {});\ngoog.addDependency('testing/net/xhrio_test.js', ['goog.testing.net.XhrIoTest'], ['goog.dom.xml', 'goog.events', 'goog.events.Event', 'goog.net.ErrorCode', 'goog.net.EventType', 'goog.net.XmlHttp', 'goog.object', 'goog.testing.MockControl', 'goog.testing.asserts', 'goog.testing.mockmatchers.InstanceOf', 'goog.testing.net.XhrIo', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/net/xhriopool.js', ['goog.testing.net.XhrIoPool'], ['goog.net.XhrIoPool', 'goog.testing.net.XhrIo'], {});\ngoog.addDependency('testing/objectpropertystring.js', ['goog.testing.ObjectPropertyString'], [], {});\ngoog.addDependency('testing/parallel_closure_test_suite.js', ['goog.testing.parallelClosureTestSuite'], ['goog.Promise', 'goog.asserts', 'goog.events', 'goog.json', 'goog.testing.MultiTestRunner', 'goog.testing.TestCase', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/parallel_closure_test_suite_test.js', ['goog.testing.parallelClosureTestSuiteTest'], ['goog.dom', 'goog.testing.MockControl', 'goog.testing.MultiTestRunner', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.testing.parallelClosureTestSuite', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/performancetable.js', ['goog.testing.PerformanceTable'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.testing.PerformanceTimer'], {});\ngoog.addDependency('testing/performancetimer.js', ['goog.testing.PerformanceTimer', 'goog.testing.PerformanceTimer.Task'], ['goog.array', 'goog.async.Deferred', 'goog.math'], {'lang': 'es6'});\ngoog.addDependency('testing/performancetimer_test.js', ['goog.testing.PerformanceTimerTest'], ['goog.async.Deferred', 'goog.dom', 'goog.math', 'goog.testing.MockClock', 'goog.testing.PerformanceTimer', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/propertyreplacer.js', ['goog.testing.PropertyReplacer'], ['goog.asserts', 'goog.userAgent'], {});\ngoog.addDependency('testing/propertyreplacer_test.js', ['goog.testing.PropertyReplacerTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.testSuite', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/proto2/proto2.js', ['goog.testing.proto2'], ['goog.proto2.Message', 'goog.proto2.ObjectSerializer', 'goog.testing.asserts'], {});\ngoog.addDependency('testing/proto2/proto2_test.js', ['goog.testing.proto2Test'], ['goog.testing.proto2', 'goog.testing.testSuite', 'proto2.TestAllTypes'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/pseudorandom.js', ['goog.testing.PseudoRandom'], ['goog.Disposable'], {});\ngoog.addDependency('testing/pseudorandom_test.js', ['goog.testing.PseudoRandomTest'], ['goog.testing.PseudoRandom', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/recordfunction.js', ['goog.testing.FunctionCall', 'goog.testing.recordConstructor', 'goog.testing.recordFunction'], ['goog.Promise', 'goog.promise.Resolver', 'goog.testing.asserts'], {});\ngoog.addDependency('testing/recordfunction_test.js', ['goog.testing.recordFunctionTest'], ['goog.functions', 'goog.testing.PropertyReplacer', 'goog.testing.recordConstructor', 'goog.testing.recordFunction', 'goog.testing.testSuite'], {'lang': 'es8', 'module': 'goog'});\ngoog.addDependency('testing/shardingtestcase.js', ['goog.testing.ShardingTestCase'], ['goog.asserts', 'goog.testing.TestCase'], {});\ngoog.addDependency('testing/shardingtestcase_test.js', ['goog.testing.ShardingTestCaseTest'], ['goog.testing.ShardingTestCase', 'goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.jsunit'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/singleton.js', ['goog.testing.singleton'], [], {'lang': 'es6'});\ngoog.addDependency('testing/singleton_test.js', ['goog.testing.singletonTest'], ['goog.testing.asserts', 'goog.testing.singleton', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/stacktrace.js', ['goog.testing.stacktrace', 'goog.testing.stacktrace.Frame'], [], {'lang': 'es6'});\ngoog.addDependency('testing/stacktrace_test.js', ['goog.testing.stacktraceTest'], ['goog.functions', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock', 'goog.testing.asserts', 'goog.testing.stacktrace', 'goog.testing.stacktrace.Frame', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/storage/fakemechanism.js', ['goog.testing.storage.FakeMechanism'], ['goog.storage.mechanism.IterableMechanism', 'goog.structs.Map'], {});\ngoog.addDependency('testing/strictmock.js', ['goog.testing.StrictMock'], ['goog.array', 'goog.asserts', 'goog.structs.Set', 'goog.testing.Mock'], {});\ngoog.addDependency('testing/strictmock_test.js', ['goog.testing.StrictMockTest'], ['goog.testing.StrictMock', 'goog.testing.testSuite'], {'lang': 'es8', 'module': 'goog'});\ngoog.addDependency('testing/style/layoutasserts.js', ['goog.testing.style.layoutasserts'], ['goog.style', 'goog.testing.asserts', 'goog.testing.style'], {});\ngoog.addDependency('testing/style/layoutasserts_test.js', ['goog.testing.style.layoutassertsTest'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.testing.style.layoutasserts', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/style/style.js', ['goog.testing.style'], ['goog.dom', 'goog.math.Rect', 'goog.style'], {});\ngoog.addDependency('testing/style/style_test.js', ['goog.testing.styleTest'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.testing.style', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/testcase.js', ['goog.testing.TestCase', 'goog.testing.TestCase.Error', 'goog.testing.TestCase.Order', 'goog.testing.TestCase.Result', 'goog.testing.TestCase.Test'], ['goog.Promise', 'goog.Thenable', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.object', 'goog.testing.JsUnitException', 'goog.testing.asserts'], {});\ngoog.addDependency('testing/testcase_test.js', ['goog.testing.TestCaseTest'], ['goog.Promise', 'goog.Timer', 'goog.functions', 'goog.string', 'goog.testing.ExpectedFailures', 'goog.testing.FunctionMock', 'goog.testing.JsUnitException', 'goog.testing.MethodMock', 'goog.testing.MockRandom', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es8', 'module': 'goog'});\ngoog.addDependency('testing/testqueue.js', ['goog.testing.TestQueue'], [], {});\ngoog.addDependency('testing/testrunner.js', ['goog.testing.TestRunner'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.json', 'goog.testing.TestCase', 'goog.userAgent'], {});\ngoog.addDependency('testing/testrunner_test.js', ['goog.testing.TestRunnerTest'], ['goog.testing.TestCase', 'goog.testing.TestRunner', 'goog.testing.asserts', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/testsuite.js', ['goog.testing.testSuite'], ['goog.labs.testing.Environment', 'goog.testing.TestCase'], {});\ngoog.addDependency('testing/testsuite_test.js', ['goog.testing.testSuiteTest'], ['goog.testing.TestCase', 'goog.testing.asserts', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/ui/rendererasserts.js', ['goog.testing.ui.rendererasserts'], ['goog.testing.asserts', 'goog.ui.ControlRenderer'], {});\ngoog.addDependency('testing/ui/rendererasserts_test.js', ['goog.testing.ui.rendererassertsTest'], ['goog.testing.asserts', 'goog.testing.testSuite', 'goog.testing.ui.rendererasserts', 'goog.ui.ControlRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('testing/ui/rendererharness.js', ['goog.testing.ui.RendererHarness'], ['goog.Disposable', 'goog.dom.NodeType', 'goog.testing.asserts', 'goog.testing.dom', 'goog.ui.Control', 'goog.ui.ControlRenderer'], {});\ngoog.addDependency('testing/ui/style.js', ['goog.testing.ui.style'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.testing.asserts'], {});\ngoog.addDependency('testing/ui/style_test.js', ['goog.testing.ui.styleTest'], ['goog.dom', 'goog.testing.testSuite', 'goog.testing.ui.style'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('timer/timer.js', ['goog.Timer'], ['goog.Promise', 'goog.events.EventTarget'], {});\ngoog.addDependency('timer/timer_test.js', ['goog.TimerTest'], ['goog.Promise', 'goog.Timer', 'goog.events', 'goog.testing.MockClock', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('tweak/entries.js', ['goog.tweak.BaseEntry', 'goog.tweak.BasePrimitiveSetting', 'goog.tweak.BaseSetting', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.StringSetting'], ['goog.array', 'goog.asserts', 'goog.log', 'goog.object'], {});\ngoog.addDependency('tweak/entries_test.js', ['goog.tweak.BaseEntryTest'], ['goog.testing.MockControl', 'goog.testing.testSuite', 'goog.tweak.testhelpers'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('tweak/registry.js', ['goog.tweak.Registry'], ['goog.array', 'goog.asserts', 'goog.log', 'goog.string', 'goog.tweak.BasePrimitiveSetting', 'goog.tweak.BaseSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.NumericSetting', 'goog.tweak.StringSetting', 'goog.uri.utils'], {});\ngoog.addDependency('tweak/registry_test.js', ['goog.tweak.RegistryTest'], ['goog.asserts.AssertionError', 'goog.testing.testSuite', 'goog.tweak', 'goog.tweak.testhelpers'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('tweak/testhelpers.js', ['goog.tweak.testhelpers'], ['goog.tweak', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.Registry', 'goog.tweak.StringSetting'], {});\ngoog.addDependency('tweak/tweak.js', ['goog.tweak', 'goog.tweak.ConfigParams'], ['goog.asserts', 'goog.tweak.BaseSetting', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.Registry', 'goog.tweak.StringSetting'], {});\ngoog.addDependency('tweak/tweakui.js', ['goog.tweak.EntriesPanel', 'goog.tweak.TweakUi'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.html.SafeStyleSheet', 'goog.object', 'goog.string.Const', 'goog.style', 'goog.tweak', 'goog.tweak.BaseEntry', 'goog.tweak.BooleanGroup', 'goog.tweak.BooleanInGroupSetting', 'goog.tweak.BooleanSetting', 'goog.tweak.ButtonAction', 'goog.tweak.NumericSetting', 'goog.tweak.StringSetting', 'goog.ui.Zippy', 'goog.userAgent'], {});\ngoog.addDependency('tweak/tweakui_test.js', ['goog.tweak.TweakUiTest'], ['goog.dom', 'goog.dom.TagName', 'goog.string', 'goog.testing.testSuite', 'goog.tweak', 'goog.tweak.TweakUi', 'goog.tweak.testhelpers'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/abstractspellchecker.js', ['goog.ui.AbstractSpellChecker', 'goog.ui.AbstractSpellChecker.AsyncResult'], ['goog.a11y.aria', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.dom.selection', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.spell.SpellCheck', 'goog.structs.Set', 'goog.style', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.MenuSeparator', 'goog.ui.PopupMenu'], {});\ngoog.addDependency('ui/ac/ac.js', ['goog.ui.ac'], ['goog.ui.ac.ArrayMatcher', 'goog.ui.ac.AutoComplete', 'goog.ui.ac.InputHandler', 'goog.ui.ac.Renderer'], {});\ngoog.addDependency('ui/ac/ac_test.js', ['goog.ui.acTest'], ['goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.classlist', 'goog.dom.selection', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.ac', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/ac/arraymatcher.js', ['goog.ui.ac.ArrayMatcher'], ['goog.string'], {});\ngoog.addDependency('ui/ac/arraymatcher_test.js', ['goog.ui.ac.ArrayMatcherTest'], ['goog.testing.testSuite', 'goog.ui.ac.ArrayMatcher'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/ac/autocomplete.js', ['goog.ui.ac.AutoComplete', 'goog.ui.ac.AutoComplete.EventType'], ['goog.array', 'goog.asserts', 'goog.events', 'goog.events.EventTarget', 'goog.object', 'goog.ui.ac.RenderOptions'], {});\ngoog.addDependency('ui/ac/autocomplete_test.js', ['goog.ui.ac.AutoCompleteTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.string', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.mockmatchers', 'goog.testing.testSuite', 'goog.ui.ac.AutoComplete', 'goog.ui.ac.InputHandler', 'goog.ui.ac.RenderOptions', 'goog.ui.ac.Renderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/ac/cachingmatcher.js', ['goog.ui.ac.CachingMatcher'], ['goog.array', 'goog.async.Throttle', 'goog.ui.ac.ArrayMatcher', 'goog.ui.ac.RenderOptions'], {});\ngoog.addDependency('ui/ac/cachingmatcher_test.js', ['goog.ui.ac.CachingMatcherTest'], ['goog.testing.MockControl', 'goog.testing.mockmatchers', 'goog.testing.testSuite', 'goog.ui.ac.CachingMatcher'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/ac/inputhandler.js', ['goog.ui.ac.InputHandler'], ['goog.Disposable', 'goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.selection', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.string', 'goog.userAgent', 'goog.userAgent.product'], {});\ngoog.addDependency('ui/ac/inputhandler_test.js', ['goog.ui.ac.InputHandlerTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.selection', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.functions', 'goog.object', 'goog.testing.MockClock', 'goog.testing.testSuite', 'goog.ui.ac.InputHandler', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/ac/remote.js', ['goog.ui.ac.Remote'], ['goog.ui.ac.AutoComplete', 'goog.ui.ac.InputHandler', 'goog.ui.ac.RemoteArrayMatcher', 'goog.ui.ac.Renderer'], {});\ngoog.addDependency('ui/ac/remotearraymatcher.js', ['goog.ui.ac.RemoteArrayMatcher'], ['goog.Disposable', 'goog.Uri', 'goog.events', 'goog.net.EventType', 'goog.net.XhrIo'], {});\ngoog.addDependency('ui/ac/remotearraymatcher_test.js', ['goog.ui.ac.RemoteArrayMatcherTest'], ['goog.net.XhrIo', 'goog.testing.MockControl', 'goog.testing.net.XhrIo', 'goog.testing.testSuite', 'goog.ui.ac.RemoteArrayMatcher'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/ac/renderer.js', ['goog.ui.ac.Renderer', 'goog.ui.ac.Renderer.CustomRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dispose', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOutAndHide', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.string', 'goog.style', 'goog.ui.IdGenerator', 'goog.ui.ac.AutoComplete'], {'lang': 'es6'});\ngoog.addDependency('ui/ac/renderer_test.js', ['goog.ui.ac.RendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.fx.dom.FadeInAndShow', 'goog.fx.dom.FadeOutAndHide', 'goog.string', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'goog.ui.ac.AutoComplete', 'goog.ui.ac.Renderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/ac/renderoptions.js', ['goog.ui.ac.RenderOptions'], [], {});\ngoog.addDependency('ui/ac/richinputhandler.js', ['goog.ui.ac.RichInputHandler'], ['goog.ui.ac.InputHandler'], {});\ngoog.addDependency('ui/ac/richremote.js', ['goog.ui.ac.RichRemote'], ['goog.ui.ac.AutoComplete', 'goog.ui.ac.Remote', 'goog.ui.ac.Renderer', 'goog.ui.ac.RichInputHandler', 'goog.ui.ac.RichRemoteArrayMatcher'], {});\ngoog.addDependency('ui/ac/richremotearraymatcher.js', ['goog.ui.ac.RichRemoteArrayMatcher'], ['goog.dom', 'goog.ui.ac.RemoteArrayMatcher'], {});\ngoog.addDependency('ui/ac/richremotearraymatcher_test.js', ['goog.ui.ac.RichRemoteArrayMatcherTest'], ['goog.net.XhrIo', 'goog.testing.MockControl', 'goog.testing.net.XhrIo', 'goog.testing.testSuite', 'goog.ui.ac.RichRemoteArrayMatcher'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/activitymonitor.js', ['goog.ui.ActivityMonitor'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType'], {});\ngoog.addDependency('ui/activitymonitor_test.js', ['goog.ui.ActivityMonitorTest'], ['goog.dom', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.ui.ActivityMonitor'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/advancedtooltip.js', ['goog.ui.AdvancedTooltip'], ['goog.events', 'goog.events.EventType', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style', 'goog.ui.Tooltip', 'goog.userAgent'], {});\ngoog.addDependency('ui/advancedtooltip_test.js', ['goog.ui.AdvancedTooltipTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events.Event', 'goog.events.EventType', 'goog.math.Box', 'goog.math.Coordinate', 'goog.style', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.AdvancedTooltip', 'goog.ui.Tooltip', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/animatedzippy.js', ['goog.ui.AnimatedZippy'], ['goog.a11y.aria.Role', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.fx.easing', 'goog.ui.Zippy', 'goog.ui.ZippyEvent'], {});\ngoog.addDependency('ui/animatedzippy_test.js', ['goog.ui.AnimatedZippyTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.events', 'goog.functions', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.testing.PropertyReplacer', 'goog.testing.asserts', 'goog.testing.testSuite', 'goog.ui.AnimatedZippy', 'goog.ui.Zippy'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/attachablemenu.js', ['goog.ui.AttachableMenu'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.Event', 'goog.events.KeyCodes', 'goog.string', 'goog.style', 'goog.ui.ItemEvent', 'goog.ui.MenuBase', 'goog.ui.PopupBase', 'goog.userAgent'], {});\ngoog.addDependency('ui/bidiinput.js', ['goog.ui.BidiInput'], ['goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events', 'goog.events.InputHandler', 'goog.i18n.bidi', 'goog.ui.Component'], {});\ngoog.addDependency('ui/bidiinput_test.js', ['goog.ui.BidiInputTest'], ['goog.dom', 'goog.testing.testSuite', 'goog.ui.BidiInput'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/bubble.js', ['goog.ui.Bubble'], ['goog.Timer', 'goog.dom.safe', 'goog.events', 'goog.events.EventType', 'goog.html.SafeHtml', 'goog.math.Box', 'goog.positioning', 'goog.positioning.AbsolutePosition', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.CornerBit', 'goog.string.Const', 'goog.style', 'goog.ui.Component', 'goog.ui.Popup'], {});\ngoog.addDependency('ui/button.js', ['goog.ui.Button', 'goog.ui.Button.Side'], ['goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.ui.ButtonRenderer', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.NativeButtonRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/button_test.js', ['goog.ui.ButtonTest'], ['goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.NativeButtonRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/buttonrenderer.js', ['goog.ui.ButtonRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.ControlRenderer'], {});\ngoog.addDependency('ui/buttonrenderer_test.js', ['goog.ui.ButtonRendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.ExpectedFailures', 'goog.testing.testSuite', 'goog.testing.ui.rendererasserts', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.ButtonSide', 'goog.ui.Component', 'goog.ui.ControlRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/buttonside.js', ['goog.ui.ButtonSide'], [], {});\ngoog.addDependency('ui/charcounter.js', ['goog.ui.CharCounter', 'goog.ui.CharCounter.Display'], ['goog.dom', 'goog.events', 'goog.events.EventTarget', 'goog.events.InputHandler'], {});\ngoog.addDependency('ui/charcounter_test.js', ['goog.ui.CharCounterTest'], ['goog.dom', 'goog.testing.asserts', 'goog.testing.testSuite', 'goog.ui.CharCounter', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/charpicker.js', ['goog.ui.CharPicker'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.i18n.CharListDecompressor', 'goog.i18n.CharPickerData', 'goog.i18n.uChar', 'goog.i18n.uChar.NameFetcher', 'goog.structs.Set', 'goog.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.ContainerScroller', 'goog.ui.FlatButtonRenderer', 'goog.ui.HoverCard', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.Tooltip'], {});\ngoog.addDependency('ui/charpicker_test.js', ['goog.ui.CharPickerTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dispose', 'goog.dom', 'goog.events.Event', 'goog.events.EventType', 'goog.i18n.CharPickerData', 'goog.i18n.uChar.NameFetcher', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.mockmatchers', 'goog.testing.testSuite', 'goog.ui.CharPicker', 'goog.ui.FlatButtonRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/checkbox.js', ['goog.ui.Checkbox', 'goog.ui.Checkbox.State'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.string', 'goog.ui.CheckboxRenderer', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.registry'], {});\ngoog.addDependency('ui/checkbox_test.js', ['goog.ui.CheckboxTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.KeyCodes', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.Checkbox', 'goog.ui.CheckboxRenderer', 'goog.ui.Component', 'goog.ui.ControlRenderer', 'goog.ui.decorate'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/checkboxmenuitem.js', ['goog.ui.CheckBoxMenuItem'], ['goog.ui.MenuItem', 'goog.ui.registry'], {});\ngoog.addDependency('ui/checkboxrenderer.js', ['goog.ui.CheckboxRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.object', 'goog.ui.ControlRenderer'], {});\ngoog.addDependency('ui/colormenubutton.js', ['goog.ui.ColorMenuButton'], ['goog.array', 'goog.object', 'goog.ui.ColorMenuButtonRenderer', 'goog.ui.ColorPalette', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.registry'], {});\ngoog.addDependency('ui/colormenubuttonrenderer.js', ['goog.ui.ColorMenuButtonRenderer'], ['goog.asserts', 'goog.color', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.MenuButtonRenderer', 'goog.userAgent'], {});\ngoog.addDependency('ui/colormenubuttonrenderer_test.js', ['goog.ui.ColorMenuButtonTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.testSuite', 'goog.testing.ui.RendererHarness', 'goog.testing.ui.rendererasserts', 'goog.ui.ColorMenuButton', 'goog.ui.ColorMenuButtonRenderer', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/colorpalette.js', ['goog.ui.ColorPalette'], ['goog.array', 'goog.color', 'goog.dom.TagName', 'goog.style', 'goog.ui.Palette', 'goog.ui.PaletteRenderer'], {});\ngoog.addDependency('ui/colorpalette_test.js', ['goog.ui.ColorPaletteTest'], ['goog.color', 'goog.dom.TagName', 'goog.testing.testSuite', 'goog.ui.ColorPalette'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/colorpicker.js', ['goog.ui.ColorPicker', 'goog.ui.ColorPicker.EventType'], ['goog.ui.ColorPalette', 'goog.ui.Component'], {});\ngoog.addDependency('ui/combobox.js', ['goog.ui.ComboBox', 'goog.ui.ComboBoxItem'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.log', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.ItemEvent', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.MenuSeparator', 'goog.ui.registry', 'goog.userAgent'], {});\ngoog.addDependency('ui/combobox_test.js', ['goog.ui.ComboBoxTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.KeyCodes', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.ComboBox', 'goog.ui.ComboBoxItem', 'goog.ui.Component', 'goog.ui.ControlRenderer', 'goog.ui.LabelInput', 'goog.ui.Menu', 'goog.ui.MenuItem'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/component.js', ['goog.ui.Component', 'goog.ui.Component.Error', 'goog.ui.Component.EventType', 'goog.ui.Component.State'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.object', 'goog.style', 'goog.ui.IdGenerator'], {});\ngoog.addDependency('ui/component_test.js', ['goog.ui.ComponentTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.events.EventTarget', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'goog.ui.Component'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/componentutil.js', ['goog.ui.ComponentUtil'], ['goog.events.MouseAsMouseEventType', 'goog.events.MouseEvents', 'goog.events.PointerAsMouseEventType'], {});\ngoog.addDependency('ui/componentutil_test.js', ['goog.ui.ComponentUtilTest'], ['goog.events.MouseAsMouseEventType', 'goog.events.PointerAsMouseEventType', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.ComponentUtil'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/container.js', ['goog.ui.Container', 'goog.ui.Container.EventType', 'goog.ui.Container.Orientation'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.object', 'goog.style', 'goog.ui.Component', 'goog.ui.ComponentUtil', 'goog.ui.ContainerRenderer', 'goog.ui.Control'], {});\ngoog.addDependency('ui/container_test.js', ['goog.ui.ContainerTest'], ['goog.a11y.aria', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.KeyCodes', 'goog.events.KeyEvent', 'goog.events.PointerFallbackEventType', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.Container', 'goog.ui.Control'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/containerrenderer.js', ['goog.ui.ContainerRenderer'], ['goog.a11y.aria', 'goog.array', 'goog.asserts', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.string', 'goog.style', 'goog.ui.registry', 'goog.userAgent'], {});\ngoog.addDependency('ui/containerrenderer_test.js', ['goog.ui.ContainerRendererTest'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'goog.testing.ui.rendererasserts', 'goog.ui.Container', 'goog.ui.ContainerRenderer', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/containerscroller.js', ['goog.ui.ContainerScroller'], ['goog.Disposable', 'goog.Timer', 'goog.events.EventHandler', 'goog.style', 'goog.ui.Component', 'goog.ui.Container'], {});\ngoog.addDependency('ui/containerscroller_test.js', ['goog.ui.ContainerScrollerTest'], ['goog.dom', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.Container', 'goog.ui.ContainerScroller'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/control.js', ['goog.ui.Control'], ['goog.Disposable', 'goog.array', 'goog.dom', 'goog.events.BrowserEvent', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.string', 'goog.ui.Component', 'goog.ui.ComponentUtil', 'goog.ui.ControlContent', 'goog.ui.ControlRenderer', 'goog.ui.registry', 'goog.userAgent'], {});\ngoog.addDependency('ui/control_test.js', ['goog.ui.ControlTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.events.PointerFallbackEventType', 'goog.html.testing', 'goog.object', 'goog.string', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.ControlRenderer', 'goog.ui.registry', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/controlcontent.js', ['goog.ui.ControlContent'], [], {});\ngoog.addDependency('ui/controlrenderer.js', ['goog.ui.ControlRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.object', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.ControlContent', 'goog.userAgent'], {});\ngoog.addDependency('ui/controlrenderer_test.js', ['goog.ui.ControlRendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.object', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.ControlRenderer', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/cookieeditor.js', ['goog.ui.CookieEditor'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.events.EventType', 'goog.net.cookies', 'goog.string', 'goog.style', 'goog.ui.Component'], {});\ngoog.addDependency('ui/cookieeditor_test.js', ['goog.ui.CookieEditorTest'], ['goog.dom', 'goog.events.Event', 'goog.events.EventType', 'goog.net.cookies', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.CookieEditor'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/css3buttonrenderer.js', ['goog.ui.Css3ButtonRenderer'], ['goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.Component', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry'], {});\ngoog.addDependency('ui/css3menubuttonrenderer.js', ['goog.ui.Css3MenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuButton', 'goog.ui.MenuButtonRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/cssnames.js', ['goog.ui.INLINE_BLOCK_CLASSNAME'], [], {});\ngoog.addDependency('ui/custombutton.js', ['goog.ui.CustomButton'], ['goog.ui.Button', 'goog.ui.CustomButtonRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/custombuttonrenderer.js', ['goog.ui.CustomButtonRenderer'], ['goog.a11y.aria.Role', 'goog.asserts', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.string', 'goog.ui.ButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME'], {});\ngoog.addDependency('ui/customcolorpalette.js', ['goog.ui.CustomColorPalette'], ['goog.color', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.ColorPalette', 'goog.ui.Component'], {});\ngoog.addDependency('ui/customcolorpalette_test.js', ['goog.ui.CustomColorPaletteTest'], ['goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.testSuite', 'goog.ui.CustomColorPalette'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/datepicker.js', ['goog.ui.DatePicker', 'goog.ui.DatePicker.Events', 'goog.ui.DatePickerEvent'], ['goog.a11y.aria', 'goog.asserts', 'goog.date.Date', 'goog.date.DateRange', 'goog.date.Interval', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyHandler', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimePatterns', 'goog.i18n.DateTimeSymbols', 'goog.style', 'goog.ui.Component', 'goog.ui.DefaultDatePickerRenderer', 'goog.ui.IdGenerator'], {});\ngoog.addDependency('ui/datepicker_test.js', ['goog.ui.DatePickerTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.date.Date', 'goog.date.DateRange', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.KeyCodes', 'goog.i18n.DateTimeSymbols', 'goog.i18n.DateTimeSymbols_en_US', 'goog.i18n.DateTimeSymbols_zh_HK', 'goog.style', 'goog.testing.events', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.ui.DatePicker'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/datepickerrenderer.js', ['goog.ui.DatePickerRenderer'], [], {});\ngoog.addDependency('ui/decorate.js', ['goog.ui.decorate'], ['goog.ui.registry'], {});\ngoog.addDependency('ui/decorate_test.js', ['goog.ui.decorateTest'], ['goog.testing.testSuite', 'goog.ui.decorate', 'goog.ui.registry'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/defaultdatepickerrenderer.js', ['goog.ui.DefaultDatePickerRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.ui.DatePickerRenderer'], {});\ngoog.addDependency('ui/dialog.js', ['goog.ui.Dialog', 'goog.ui.Dialog.ButtonSet', 'goog.ui.Dialog.ButtonSet.DefaultButtons', 'goog.ui.Dialog.DefaultButtonCaptions', 'goog.ui.Dialog.DefaultButtonKeys', 'goog.ui.Dialog.Event', 'goog.ui.Dialog.EventType'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.dom.safe', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.Keys', 'goog.fx.Dragger', 'goog.html.SafeHtml', 'goog.math.Rect', 'goog.string', 'goog.structs.Map', 'goog.style', 'goog.ui.ModalPopup'], {});\ngoog.addDependency('ui/dialog_test.js', ['goog.ui.DialogTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.css3', 'goog.html.SafeHtml', 'goog.html.testing', 'goog.style', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.ui.Dialog', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/dimensionpicker.js', ['goog.ui.DimensionPicker'], ['goog.events.BrowserEvent.PointerType', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Size', 'goog.ui.Component', 'goog.ui.ComponentUtil', 'goog.ui.Control', 'goog.ui.DimensionPickerRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/dimensionpicker_test.js', ['goog.ui.DimensionPickerTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.math.Size', 'goog.testing.testSuite', 'goog.testing.ui.rendererasserts', 'goog.ui.DimensionPicker', 'goog.ui.DimensionPickerRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/dimensionpickerrenderer.js', ['goog.ui.DimensionPickerRenderer'], ['goog.a11y.aria.Announcer', 'goog.a11y.aria.LivePriority', 'goog.dom', 'goog.dom.TagName', 'goog.i18n.bidi', 'goog.style', 'goog.ui.ControlRenderer', 'goog.userAgent'], {});\ngoog.addDependency('ui/dimensionpickerrenderer_test.js', ['goog.ui.DimensionPickerRendererTest'], ['goog.a11y.aria.LivePriority', 'goog.array', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.ui.DimensionPicker', 'goog.ui.DimensionPickerRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/dragdropdetector.js', ['goog.ui.DragDropDetector', 'goog.ui.DragDropDetector.EventType', 'goog.ui.DragDropDetector.ImageDropEvent', 'goog.ui.DragDropDetector.LinkDropEvent'], ['goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.math.Coordinate', 'goog.string', 'goog.style', 'goog.userAgent'], {});\ngoog.addDependency('ui/drilldownrow.js', ['goog.ui.DrilldownRow'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.string.Unicode', 'goog.ui.Component'], {});\ngoog.addDependency('ui/drilldownrow_test.js', ['goog.ui.DrilldownRowTest'], ['goog.dom', 'goog.dom.TagName', 'goog.html.SafeHtml', 'goog.testing.testSuite', 'goog.ui.DrilldownRow'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/editor/abstractdialog.js', ['goog.ui.editor.AbstractDialog', 'goog.ui.editor.AbstractDialog.Builder', 'goog.ui.editor.AbstractDialog.EventType'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventTarget', 'goog.string', 'goog.ui.Dialog', 'goog.ui.PopupBase'], {});\ngoog.addDependency('ui/editor/abstractdialog_test.js', ['goog.ui.editor.AbstractDialogTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.KeyCodes', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.testing.testSuite', 'goog.ui.editor.AbstractDialog', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/editor/bubble.js', ['goog.ui.editor.Bubble'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.ViewportSizeMonitor', 'goog.dom.classlist', 'goog.editor.style', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.functions', 'goog.log', 'goog.math.Box', 'goog.object', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.PopupBase', 'goog.userAgent'], {});\ngoog.addDependency('ui/editor/bubble_test.js', ['goog.ui.editor.BubbleTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.positioning.Corner', 'goog.positioning.OverflowStatus', 'goog.string', 'goog.style', 'goog.testing.editor.TestHelper', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.editor.Bubble', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/editor/defaulttoolbar.js', ['goog.ui.editor.ButtonDescriptor', 'goog.ui.editor.DefaultToolbar'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.editor.Command', 'goog.style', 'goog.ui.editor.ToolbarFactory', 'goog.ui.editor.messages', 'goog.userAgent'], {});\ngoog.addDependency('ui/editor/linkdialog.js', ['goog.ui.editor.LinkDialog', 'goog.ui.editor.LinkDialog.BeforeTestLinkEvent', 'goog.ui.editor.LinkDialog.EventType', 'goog.ui.editor.LinkDialog.OkEvent'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.editor.BrowserFeature', 'goog.editor.Link', 'goog.editor.focus', 'goog.editor.node', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.InputHandler', 'goog.html.SafeHtml', 'goog.html.SafeHtmlFormatter', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.LinkButtonRenderer', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.TabPane', 'goog.ui.editor.messages', 'goog.userAgent', 'goog.window'], {});\ngoog.addDependency('ui/editor/linkdialog_test.js', ['goog.ui.editor.LinkDialogTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.editor.BrowserFeature', 'goog.editor.Link', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.style', 'goog.testing.MockControl', 'goog.testing.PropertyReplacer', 'goog.testing.dom', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.mockmatchers', 'goog.testing.mockmatchers.ArgumentMatcher', 'goog.testing.testSuite', 'goog.ui.editor.AbstractDialog', 'goog.ui.editor.LinkDialog', 'goog.ui.editor.messages', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/editor/messages.js', ['goog.ui.editor.messages'], ['goog.html.SafeHtmlFormatter'], {});\ngoog.addDependency('ui/editor/tabpane.js', ['goog.ui.editor.TabPane'], ['goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.Tab', 'goog.ui.TabBar'], {});\ngoog.addDependency('ui/editor/toolbarcontroller.js', ['goog.ui.editor.ToolbarController'], ['goog.editor.Field', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.ui.Component'], {});\ngoog.addDependency('ui/editor/toolbarfactory.js', ['goog.ui.editor.ToolbarFactory'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.string', 'goog.string.Unicode', 'goog.style', 'goog.ui.Component', 'goog.ui.Container', 'goog.ui.Option', 'goog.ui.Toolbar', 'goog.ui.ToolbarButton', 'goog.ui.ToolbarColorMenuButton', 'goog.ui.ToolbarMenuButton', 'goog.ui.ToolbarRenderer', 'goog.ui.ToolbarSelect', 'goog.userAgent'], {});\ngoog.addDependency('ui/editor/toolbarfactory_test.js', ['goog.ui.editor.ToolbarFactoryTest'], ['goog.dom', 'goog.testing.ExpectedFailures', 'goog.testing.editor.TestHelper', 'goog.testing.testSuite', 'goog.ui.editor.ToolbarFactory', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/emoji/emoji.js', ['goog.ui.emoji.Emoji'], [], {});\ngoog.addDependency('ui/emoji/emojipalette.js', ['goog.ui.emoji.EmojiPalette'], ['goog.events.EventType', 'goog.net.ImageLoader', 'goog.ui.Palette', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPaletteRenderer'], {});\ngoog.addDependency('ui/emoji/emojipaletterenderer.js', ['goog.ui.emoji.EmojiPaletteRenderer'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.style', 'goog.ui.PaletteRenderer', 'goog.ui.emoji.Emoji'], {});\ngoog.addDependency('ui/emoji/emojipicker.js', ['goog.ui.emoji.EmojiPicker'], ['goog.dom.TagName', 'goog.style', 'goog.ui.Component', 'goog.ui.TabPane', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPalette', 'goog.ui.emoji.EmojiPaletteRenderer', 'goog.ui.emoji.ProgressiveEmojiPaletteRenderer'], {});\ngoog.addDependency('ui/emoji/emojipicker_test.js', ['goog.ui.emoji.EmojiPickerTest'], ['goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.style', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPicker', 'goog.ui.emoji.SpriteInfo'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/emoji/fast_nonprogressive_emojipicker_test.js', ['goog.ui.emoji.FastNonProgressiveEmojiPickerTest'], ['goog.Promise', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.net.EventType', 'goog.style', 'goog.testing.TestCase', 'goog.testing.testSuite', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPicker', 'goog.ui.emoji.SpriteInfo'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/emoji/fast_progressive_emojipicker_test.js', ['goog.ui.emoji.FastProgressiveEmojiPickerTest'], ['goog.Promise', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.net.EventType', 'goog.style', 'goog.testing.testSuite', 'goog.ui.emoji.Emoji', 'goog.ui.emoji.EmojiPicker', 'goog.ui.emoji.SpriteInfo'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/emoji/popupemojipicker.js', ['goog.ui.emoji.PopupEmojiPicker'], ['goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.ui.Component', 'goog.ui.Popup', 'goog.ui.emoji.EmojiPicker'], {});\ngoog.addDependency('ui/emoji/popupemojipicker_test.js', ['goog.ui.emoji.PopupEmojiPickerTest'], ['goog.dom', 'goog.testing.testSuite', 'goog.ui.emoji.PopupEmojiPicker'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/emoji/progressiveemojipaletterenderer.js', ['goog.ui.emoji.ProgressiveEmojiPaletteRenderer'], ['goog.dom.TagName', 'goog.style', 'goog.ui.emoji.EmojiPaletteRenderer'], {});\ngoog.addDependency('ui/emoji/spriteinfo.js', ['goog.ui.emoji.SpriteInfo'], [], {'lang': 'es6'});\ngoog.addDependency('ui/emoji/spriteinfo_test.js', ['goog.ui.emoji.SpriteInfoTest'], ['goog.testing.testSuite', 'goog.ui.emoji.SpriteInfo'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/filteredmenu.js', ['goog.ui.FilteredMenu'], ['goog.a11y.aria', 'goog.a11y.aria.AutoCompleteValues', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.FilterObservingMenuItem', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.userAgent'], {});\ngoog.addDependency('ui/filteredmenu_test.js', ['goog.ui.FilteredMenuTest'], ['goog.a11y.aria', 'goog.a11y.aria.AutoCompleteValues', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Rect', 'goog.style', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.FilteredMenu', 'goog.ui.MenuItem'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/filterobservingmenuitem.js', ['goog.ui.FilterObservingMenuItem'], ['goog.ui.FilterObservingMenuItemRenderer', 'goog.ui.MenuItem', 'goog.ui.registry'], {});\ngoog.addDependency('ui/filterobservingmenuitemrenderer.js', ['goog.ui.FilterObservingMenuItemRenderer'], ['goog.ui.MenuItemRenderer'], {});\ngoog.addDependency('ui/flatbuttonrenderer.js', ['goog.ui.FlatButtonRenderer'], ['goog.a11y.aria.Role', 'goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Button', 'goog.ui.ButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry'], {});\ngoog.addDependency('ui/flatmenubuttonrenderer.js', ['goog.ui.FlatMenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.ui.FlatButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/formpost.js', ['goog.ui.FormPost'], ['goog.array', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeHtml', 'goog.ui.Component'], {});\ngoog.addDependency('ui/formpost_test.js', ['goog.ui.FormPostTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.object', 'goog.testing.testSuite', 'goog.ui.FormPost', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/gauge.js', ['goog.ui.Gauge', 'goog.ui.GaugeColoredRange'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom.TagName', 'goog.events', 'goog.fx.Animation', 'goog.fx.Transition', 'goog.fx.easing', 'goog.graphics', 'goog.graphics.Font', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.math', 'goog.ui.Component', 'goog.ui.GaugeTheme'], {});\ngoog.addDependency('ui/gaugetheme.js', ['goog.ui.GaugeTheme'], ['goog.graphics.LinearGradient', 'goog.graphics.SolidFill', 'goog.graphics.Stroke'], {});\ngoog.addDependency('ui/hovercard.js', ['goog.ui.HoverCard', 'goog.ui.HoverCard.EventType', 'goog.ui.HoverCard.TriggerEvent'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.ui.AdvancedTooltip', 'goog.ui.PopupBase', 'goog.ui.Tooltip'], {});\ngoog.addDependency('ui/hovercard_test.js', ['goog.ui.HoverCardTest'], ['goog.dom', 'goog.events', 'goog.math.Coordinate', 'goog.style', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.testSuite', 'goog.ui.HoverCard'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/hsvapalette.js', ['goog.ui.HsvaPalette'], ['goog.array', 'goog.color.alpha', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.ui.HsvPalette'], {});\ngoog.addDependency('ui/hsvapalette_test.js', ['goog.ui.HsvaPaletteTest'], ['goog.color.alpha', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.Event', 'goog.math.Coordinate', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'goog.ui.HsvaPalette', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/hsvpalette.js', ['goog.ui.HsvPalette'], ['goog.color', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.events.InputHandler', 'goog.style', 'goog.style.bidi', 'goog.ui.Component', 'goog.userAgent'], {});\ngoog.addDependency('ui/hsvpalette_test.js', ['goog.ui.HsvPaletteTest'], ['goog.color', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.math.Coordinate', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.HsvPalette', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/idgenerator.js', ['goog.ui.IdGenerator'], [], {});\ngoog.addDependency('ui/idletimer.js', ['goog.ui.IdleTimer'], ['goog.Timer', 'goog.events', 'goog.events.EventTarget', 'goog.structs.Set', 'goog.ui.ActivityMonitor'], {});\ngoog.addDependency('ui/idletimer_test.js', ['goog.ui.IdleTimerTest'], ['goog.events', 'goog.testing.MockClock', 'goog.testing.testSuite', 'goog.ui.IdleTimer', 'goog.ui.MockActivityMonitor'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/iframemask.js', ['goog.ui.IframeMask'], ['goog.Disposable', 'goog.Timer', 'goog.dom', 'goog.dom.iframe', 'goog.events.EventHandler', 'goog.structs.Pool', 'goog.style'], {});\ngoog.addDependency('ui/iframemask_test.js', ['goog.ui.IframeMaskTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.iframe', 'goog.structs.Pool', 'goog.style', 'goog.testing.MockClock', 'goog.testing.StrictMock', 'goog.testing.testSuite', 'goog.ui.IframeMask', 'goog.ui.Popup', 'goog.ui.PopupBase', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/imagelessbuttonrenderer.js', ['goog.ui.ImagelessButtonRenderer'], ['goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry'], {});\ngoog.addDependency('ui/imagelessmenubuttonrenderer.js', ['goog.ui.ImagelessMenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuButton', 'goog.ui.MenuButtonRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/inputdatepicker.js', ['goog.ui.InputDatePicker'], ['goog.date.DateTime', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.i18n.DateTimeParse', 'goog.string', 'goog.ui.Component', 'goog.ui.DatePicker', 'goog.ui.LabelInput', 'goog.ui.PopupBase', 'goog.ui.PopupDatePicker'], {});\ngoog.addDependency('ui/inputdatepicker_test.js', ['goog.ui.InputDatePickerTest'], ['goog.dom', 'goog.i18n.DateTimeFormat', 'goog.i18n.DateTimeParse', 'goog.testing.testSuite', 'goog.ui.InputDatePicker'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/itemevent.js', ['goog.ui.ItemEvent'], ['goog.events.Event'], {});\ngoog.addDependency('ui/keyboardeventdata.js', ['goog.ui.KeyboardEventData'], ['goog.asserts', 'goog.events.BrowserEvent'], {'lang': 'es6'});\ngoog.addDependency('ui/keyboardshortcuthandler.js', ['goog.ui.KeyboardShortcutEvent', 'goog.ui.KeyboardShortcutHandler', 'goog.ui.KeyboardShortcutHandler.EventType', 'goog.ui.KeyboardShortcutHandler.Modifiers'], ['goog.array', 'goog.asserts', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyNames', 'goog.events.Keys', 'goog.object', 'goog.ui.KeyboardEventData', 'goog.ui.SyntheticKeyboardEvent', 'goog.userAgent'], {});\ngoog.addDependency('ui/keyboardshortcuthandler_test.js', ['goog.ui.KeyboardShortcutHandlerTest'], ['goog.dom', 'goog.events', 'goog.events.BrowserEvent', 'goog.events.KeyCodes', 'goog.testing.MockClock', 'goog.testing.PropertyReplacer', 'goog.testing.StrictMock', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.KeyboardShortcutHandler', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/labelinput.js', ['goog.ui.LabelInput'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.ui.Component', 'goog.userAgent'], {});\ngoog.addDependency('ui/labelinput_test.js', ['goog.ui.LabelInputTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventType', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.testSuite', 'goog.ui.LabelInput', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/linkbuttonrenderer.js', ['goog.ui.LinkButtonRenderer'], ['goog.ui.Button', 'goog.ui.FlatButtonRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/media/flashobject.js', ['goog.ui.media.FlashObject', 'goog.ui.media.FlashObject.ScriptAccessLevel', 'goog.ui.media.FlashObject.Wmodes'], ['goog.asserts', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.html.TrustedResourceUrl', 'goog.html.flash', 'goog.log', 'goog.object', 'goog.string', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.userAgent', 'goog.userAgent.flash'], {});\ngoog.addDependency('ui/media/flashobject_test.js', ['goog.ui.media.FlashObjectTest'], ['goog.dom', 'goog.dom.DomHelper', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.html.testing', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.media.FlashObject', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/media/flickr.js', ['goog.ui.media.FlickrSet', 'goog.ui.media.FlickrSetModel'], ['goog.html.TrustedResourceUrl', 'goog.string.Const', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});\ngoog.addDependency('ui/media/flickr_test.js', ['goog.ui.media.FlickrSetTest'], ['goog.dom', 'goog.dom.TagName', 'goog.html.testing', 'goog.testing.testSuite', 'goog.ui.media.FlashObject', 'goog.ui.media.FlickrSet', 'goog.ui.media.FlickrSetModel', 'goog.ui.media.Media'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/media/googlevideo.js', ['goog.ui.media.GoogleVideo', 'goog.ui.media.GoogleVideoModel'], ['goog.html.TrustedResourceUrl', 'goog.string', 'goog.string.Const', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});\ngoog.addDependency('ui/media/googlevideo_test.js', ['goog.ui.media.GoogleVideoTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.testSuite', 'goog.ui.media.FlashObject', 'goog.ui.media.GoogleVideo', 'goog.ui.media.GoogleVideoModel', 'goog.ui.media.Media'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/media/media.js', ['goog.ui.media.Media', 'goog.ui.media.MediaRenderer'], ['goog.asserts', 'goog.dom.TagName', 'goog.style', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.ControlRenderer'], {});\ngoog.addDependency('ui/media/media_test.js', ['goog.ui.media.MediaTest'], ['goog.dom', 'goog.dom.TagName', 'goog.html.testing', 'goog.math.Size', 'goog.testing.testSuite', 'goog.ui.ControlRenderer', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/media/mediamodel.js', ['goog.ui.media.MediaModel', 'goog.ui.media.MediaModel.Category', 'goog.ui.media.MediaModel.Credit', 'goog.ui.media.MediaModel.Credit.Role', 'goog.ui.media.MediaModel.Credit.Scheme', 'goog.ui.media.MediaModel.Medium', 'goog.ui.media.MediaModel.MimeType', 'goog.ui.media.MediaModel.Player', 'goog.ui.media.MediaModel.SubTitle', 'goog.ui.media.MediaModel.Thumbnail'], ['goog.array', 'goog.html.TrustedResourceUrl'], {});\ngoog.addDependency('ui/media/mediamodel_test.js', ['goog.ui.media.MediaModelTest'], ['goog.testing.testSuite', 'goog.ui.media.MediaModel'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/media/mp3.js', ['goog.ui.media.Mp3'], ['goog.string', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaRenderer'], {});\ngoog.addDependency('ui/media/mp3_test.js', ['goog.ui.media.Mp3Test'], ['goog.dom', 'goog.dom.TagName', 'goog.html.testing', 'goog.testing.testSuite', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.Mp3'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/media/photo.js', ['goog.ui.media.Photo'], ['goog.dom.TagName', 'goog.ui.media.Media', 'goog.ui.media.MediaRenderer'], {});\ngoog.addDependency('ui/media/photo_test.js', ['goog.ui.media.PhotoTest'], ['goog.dom', 'goog.dom.TagName', 'goog.html.testing', 'goog.testing.testSuite', 'goog.ui.media.MediaModel', 'goog.ui.media.Photo'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/media/picasa.js', ['goog.ui.media.PicasaAlbum', 'goog.ui.media.PicasaAlbumModel'], ['goog.html.TrustedResourceUrl', 'goog.string.Const', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});\ngoog.addDependency('ui/media/picasa_test.js', ['goog.ui.media.PicasaTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.testSuite', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.PicasaAlbum', 'goog.ui.media.PicasaAlbumModel'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/media/vimeo.js', ['goog.ui.media.Vimeo', 'goog.ui.media.VimeoModel'], ['goog.html.TrustedResourceUrl', 'goog.string', 'goog.string.Const', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});\ngoog.addDependency('ui/media/vimeo_test.js', ['goog.ui.media.VimeoTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.testSuite', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.Vimeo', 'goog.ui.media.VimeoModel'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/media/youtube.js', ['goog.ui.media.Youtube', 'goog.ui.media.YoutubeModel'], ['goog.dom.TagName', 'goog.html.TrustedResourceUrl', 'goog.string', 'goog.string.Const', 'goog.ui.Component', 'goog.ui.media.FlashObject', 'goog.ui.media.Media', 'goog.ui.media.MediaModel', 'goog.ui.media.MediaRenderer'], {});\ngoog.addDependency('ui/media/youtube_test.js', ['goog.ui.media.YoutubeTest'], ['goog.dom', 'goog.dom.TagName', 'goog.testing.testSuite', 'goog.ui.media.FlashObject', 'goog.ui.media.Youtube', 'goog.ui.media.YoutubeModel'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/menu.js', ['goog.ui.Menu', 'goog.ui.Menu.EventType'], ['goog.dom.TagName', 'goog.math.Coordinate', 'goog.string', 'goog.style', 'goog.ui.Component.EventType', 'goog.ui.Component.State', 'goog.ui.Container', 'goog.ui.Container.Orientation', 'goog.ui.MenuHeader', 'goog.ui.MenuItem', 'goog.ui.MenuRenderer', 'goog.ui.MenuSeparator'], {});\ngoog.addDependency('ui/menu_test.js', ['goog.ui.MenuTest'], ['goog.dom', 'goog.events', 'goog.math.Coordinate', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.Menu'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/menubar.js', ['goog.ui.menuBar'], ['goog.ui.Container', 'goog.ui.MenuBarRenderer'], {});\ngoog.addDependency('ui/menubardecorator.js', ['goog.ui.menuBarDecorator'], ['goog.ui.MenuBarRenderer', 'goog.ui.menuBar', 'goog.ui.registry'], {});\ngoog.addDependency('ui/menubarrenderer.js', ['goog.ui.MenuBarRenderer'], ['goog.a11y.aria.Role', 'goog.ui.Container', 'goog.ui.ContainerRenderer'], {});\ngoog.addDependency('ui/menubase.js', ['goog.ui.MenuBase'], ['goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyHandler', 'goog.ui.Popup'], {});\ngoog.addDependency('ui/menubutton.js', ['goog.ui.MenuButton'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.math.Box', 'goog.math.Coordinate', 'goog.math.Rect', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.positioning.Overflow', 'goog.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.IdGenerator', 'goog.ui.Menu', 'goog.ui.MenuButtonRenderer', 'goog.ui.MenuItem', 'goog.ui.MenuRenderer', 'goog.ui.SubMenu', 'goog.ui.registry', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es6'});\ngoog.addDependency('ui/menubutton_test.js', ['goog.ui.MenuButtonTest'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.positioning', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.positioning.Overflow', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.PropertyReplacer', 'goog.testing.events', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.SubMenu', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/menubuttonrenderer.js', ['goog.ui.MenuButtonRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.Menu', 'goog.ui.MenuRenderer'], {});\ngoog.addDependency('ui/menubuttonrenderer_test.js', ['goog.ui.MenuButtonRendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.testSuite', 'goog.testing.ui.rendererasserts', 'goog.ui.MenuButton', 'goog.ui.MenuButtonRenderer', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/menuheader.js', ['goog.ui.MenuHeader'], ['goog.ui.Component', 'goog.ui.Control', 'goog.ui.MenuHeaderRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/menuheaderrenderer.js', ['goog.ui.MenuHeaderRenderer'], ['goog.ui.ControlRenderer'], {});\ngoog.addDependency('ui/menuitem.js', ['goog.ui.MenuItem'], ['goog.a11y.aria.Role', 'goog.array', 'goog.dom', 'goog.dom.classlist', 'goog.math.Coordinate', 'goog.string', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.MenuItemRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/menuitem_test.js', ['goog.ui.MenuItemTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.array', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.KeyCodes', 'goog.html.testing', 'goog.math.Coordinate', 'goog.testing.events', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.MenuItemRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/menuitemrenderer.js', ['goog.ui.MenuItemRenderer'], ['goog.a11y.aria.Role', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Component', 'goog.ui.ControlRenderer'], {});\ngoog.addDependency('ui/menuitemrenderer_test.js', ['goog.ui.MenuItemRendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.classlist', 'goog.testing.testSuite', 'goog.testing.ui.rendererasserts', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.MenuItemRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/menurenderer.js', ['goog.ui.MenuRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.ui.ContainerRenderer', 'goog.ui.Separator'], {});\ngoog.addDependency('ui/menuseparator.js', ['goog.ui.MenuSeparator'], ['goog.ui.MenuSeparatorRenderer', 'goog.ui.Separator', 'goog.ui.registry'], {});\ngoog.addDependency('ui/menuseparatorrenderer.js', ['goog.ui.MenuSeparatorRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.ControlRenderer'], {});\ngoog.addDependency('ui/menuseparatorrenderer_test.js', ['goog.ui.MenuSeparatorRendererTest'], ['goog.dom', 'goog.testing.testSuite', 'goog.ui.MenuSeparator', 'goog.ui.MenuSeparatorRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/mockactivitymonitor.js', ['goog.ui.MockActivityMonitor'], ['goog.events.EventType', 'goog.ui.ActivityMonitor'], {});\ngoog.addDependency('ui/mockactivitymonitor_test.js', ['goog.ui.MockActivityMonitorTest'], ['goog.events', 'goog.functions', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.ui.ActivityMonitor', 'goog.ui.MockActivityMonitor'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/modalariavisibilityhelper.js', ['goog.ui.ModalAriaVisibilityHelper'], ['goog.a11y.aria', 'goog.a11y.aria.State'], {});\ngoog.addDependency('ui/modalariavisibilityhelper_test.js', ['goog.ui.ModalAriaVisibilityHelperTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.string', 'goog.testing.testSuite', 'goog.ui.ModalAriaVisibilityHelper'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/modalpopup.js', ['goog.ui.ModalPopup'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.animationFrame', 'goog.dom.classlist', 'goog.dom.iframe', 'goog.events', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.fx.Transition', 'goog.string', 'goog.style', 'goog.ui.Component', 'goog.ui.ModalAriaVisibilityHelper', 'goog.ui.PopupBase', 'goog.userAgent'], {});\ngoog.addDependency('ui/modalpopup_test.js', ['goog.ui.ModalPopupTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dispose', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.fx.Transition', 'goog.fx.css3', 'goog.string', 'goog.style', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.ModalPopup', 'goog.ui.PopupBase'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/nativebuttonrenderer.js', ['goog.ui.NativeButtonRenderer'], ['goog.asserts', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.ui.ButtonRenderer', 'goog.ui.Component'], {});\ngoog.addDependency('ui/nativebuttonrenderer_test.js', ['goog.ui.NativeButtonRendererTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.testing.ExpectedFailures', 'goog.testing.events', 'goog.testing.testSuite', 'goog.testing.ui.rendererasserts', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.NativeButtonRenderer', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/option.js', ['goog.ui.Option'], ['goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.registry'], {});\ngoog.addDependency('ui/palette.js', ['goog.ui.Palette'], ['goog.array', 'goog.dom', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Size', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.PaletteRenderer', 'goog.ui.SelectionModel'], {});\ngoog.addDependency('ui/palette_test.js', ['goog.ui.PaletteTest'], ['goog.a11y.aria', 'goog.dom', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyEvent', 'goog.testing.events.Event', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.Container', 'goog.ui.Palette'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/paletterenderer.js', ['goog.ui.PaletteRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.NodeIterator', 'goog.dom.NodeType', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.dom.dataset', 'goog.iter', 'goog.style', 'goog.ui.ControlRenderer', 'goog.userAgent'], {});\ngoog.addDependency('ui/paletterenderer_test.js', ['goog.ui.PaletteRendererTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.html.testing', 'goog.testing.testSuite', 'goog.ui.Palette', 'goog.ui.PaletteRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/plaintextspellchecker.js', ['goog.ui.PlainTextSpellChecker'], ['goog.Timer', 'goog.a11y.aria', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.spell.SpellCheck', 'goog.style', 'goog.ui.AbstractSpellChecker', 'goog.ui.Component', 'goog.userAgent'], {});\ngoog.addDependency('ui/plaintextspellchecker_test.js', ['goog.ui.PlainTextSpellCheckerTest'], ['goog.Timer', 'goog.dom', 'goog.events.KeyCodes', 'goog.spell.SpellCheck', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.AbstractSpellChecker', 'goog.ui.PlainTextSpellChecker'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/popup.js', ['goog.ui.Popup'], ['goog.math.Box', 'goog.positioning.AbstractPosition', 'goog.positioning.Corner', 'goog.style', 'goog.ui.PopupBase'], {});\ngoog.addDependency('ui/popup_test.js', ['goog.ui.PopupTest'], ['goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.style', 'goog.testing.testSuite', 'goog.ui.Popup', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/popupbase.js', ['goog.ui.PopupBase', 'goog.ui.PopupBase.EventType', 'goog.ui.PopupBase.Type'], ['goog.Timer', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Transition', 'goog.style', 'goog.userAgent'], {});\ngoog.addDependency('ui/popupbase_test.js', ['goog.ui.PopupBaseTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Transition', 'goog.fx.css3', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.testSuite', 'goog.ui.PopupBase'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/popupcolorpicker.js', ['goog.ui.PopupColorPicker'], ['goog.asserts', 'goog.dom.classlist', 'goog.events.EventType', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.ui.ColorPicker', 'goog.ui.Component', 'goog.ui.Popup'], {});\ngoog.addDependency('ui/popupcolorpicker_test.js', ['goog.ui.PopupColorPickerTest'], ['goog.dom', 'goog.events', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.ColorPicker', 'goog.ui.PopupColorPicker'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/popupdatepicker.js', ['goog.ui.PopupDatePicker'], ['goog.events.EventType', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.style', 'goog.ui.Component', 'goog.ui.DatePicker', 'goog.ui.Popup', 'goog.ui.PopupBase'], {});\ngoog.addDependency('ui/popupdatepicker_test.js', ['goog.ui.PopupDatePickerTest'], ['goog.date.Date', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.style', 'goog.testing.MockControl', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.ui.DatePicker', 'goog.ui.PopupBase', 'goog.ui.PopupDatePicker'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/popupmenu.js', ['goog.ui.PopupMenu'], ['goog.events', 'goog.events.BrowserEvent', 'goog.events.BrowserEvent.MouseButton', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.positioning.MenuAnchoredPosition', 'goog.positioning.Overflow', 'goog.positioning.ViewportClientPosition', 'goog.structs.Map', 'goog.style', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.PopupBase'], {});\ngoog.addDependency('ui/popupmenu_test.js', ['goog.ui.PopupMenuTest'], ['goog.dom', 'goog.events.BrowserEvent', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.math.Box', 'goog.math.Coordinate', 'goog.positioning.Corner', 'goog.style', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.PopupMenu'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/progressbar.js', ['goog.ui.ProgressBar', 'goog.ui.ProgressBar.Orientation'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.ui.Component', 'goog.ui.RangeModel', 'goog.userAgent'], {});\ngoog.addDependency('ui/prompt.js', ['goog.ui.Prompt'], ['goog.Timer', 'goog.dom', 'goog.dom.InputType', 'goog.dom.TagName', 'goog.events', 'goog.events.EventType', 'goog.functions', 'goog.html.SafeHtml', 'goog.ui.Component', 'goog.ui.Dialog', 'goog.userAgent'], {});\ngoog.addDependency('ui/prompt_test.js', ['goog.ui.PromptTest'], ['goog.dom.selection', 'goog.events.InputHandler', 'goog.events.KeyCodes', 'goog.functions', 'goog.string', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.BidiInput', 'goog.ui.Dialog', 'goog.ui.Prompt', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/rangemodel.js', ['goog.ui.RangeModel'], ['goog.events.EventTarget', 'goog.ui.Component'], {});\ngoog.addDependency('ui/rangemodel_test.js', ['goog.ui.RangeModelTest'], ['goog.testing.testSuite', 'goog.ui.RangeModel'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/ratings.js', ['goog.ui.Ratings', 'goog.ui.Ratings.EventType'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.ui.Component'], {});\ngoog.addDependency('ui/registry.js', ['goog.ui.registry'], ['goog.asserts', 'goog.dom.classlist'], {});\ngoog.addDependency('ui/registry_test.js', ['goog.ui.registryTest'], ['goog.object', 'goog.testing.testSuite', 'goog.ui.registry'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/richtextspellchecker.js', ['goog.ui.RichTextSpellChecker'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.NodeType', 'goog.dom.Range', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.math.Coordinate', 'goog.spell.SpellCheck', 'goog.string.StringBuffer', 'goog.style', 'goog.ui.AbstractSpellChecker', 'goog.ui.Component', 'goog.ui.PopupMenu'], {});\ngoog.addDependency('ui/richtextspellchecker_test.js', ['goog.ui.RichTextSpellCheckerTest'], ['goog.dom.Range', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.KeyCodes', 'goog.object', 'goog.spell.SpellCheck', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.RichTextSpellChecker'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/roundedpanel.js', ['goog.ui.BaseRoundedPanel', 'goog.ui.CssRoundedPanel', 'goog.ui.GraphicsRoundedPanel', 'goog.ui.RoundedPanel', 'goog.ui.RoundedPanel.Corner'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.graphics', 'goog.graphics.Path', 'goog.graphics.SolidFill', 'goog.graphics.Stroke', 'goog.math', 'goog.math.Coordinate', 'goog.style', 'goog.ui.Component', 'goog.userAgent'], {});\ngoog.addDependency('ui/roundedpanel_test.js', ['goog.ui.RoundedPanelTest'], ['goog.testing.testSuite', 'goog.ui.CssRoundedPanel', 'goog.ui.GraphicsRoundedPanel', 'goog.ui.RoundedPanel', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/roundedtabrenderer.js', ['goog.ui.RoundedTabRenderer'], ['goog.dom', 'goog.dom.TagName', 'goog.ui.Tab', 'goog.ui.TabBar', 'goog.ui.TabRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/scrollfloater.js', ['goog.ui.ScrollFloater', 'goog.ui.ScrollFloater.EventType'], ['goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.userAgent'], {});\ngoog.addDependency('ui/scrollfloater_test.js', ['goog.ui.ScrollFloaterTest'], ['goog.dom', 'goog.events', 'goog.style', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'goog.ui.ScrollFloater'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/select.js', ['goog.ui.Select'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.events.EventType', 'goog.ui.Component', 'goog.ui.IdGenerator', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.MenuRenderer', 'goog.ui.SelectionModel', 'goog.ui.registry'], {});\ngoog.addDependency('ui/select_test.js', ['goog.ui.SelectTest'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.events', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.CustomButtonRenderer', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.Select', 'goog.ui.Separator'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/selectionmenubutton.js', ['goog.ui.SelectionMenuButton', 'goog.ui.SelectionMenuButton.SelectionState'], ['goog.dom.InputType', 'goog.dom.TagName', 'goog.events.EventType', 'goog.style', 'goog.ui.Component', 'goog.ui.MenuButton', 'goog.ui.MenuItem', 'goog.ui.registry'], {});\ngoog.addDependency('ui/selectionmenubutton_test.js', ['goog.ui.SelectionMenuButtonTest'], ['goog.dom', 'goog.events', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.SelectionMenuButton'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/selectionmodel.js', ['goog.ui.SelectionModel'], ['goog.array', 'goog.events.EventTarget', 'goog.events.EventType'], {});\ngoog.addDependency('ui/selectionmodel_test.js', ['goog.ui.SelectionModelTest'], ['goog.array', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.ui.SelectionModel'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/separator.js', ['goog.ui.Separator'], ['goog.a11y.aria', 'goog.asserts', 'goog.ui.Component', 'goog.ui.Control', 'goog.ui.MenuSeparatorRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/serverchart.js', ['goog.ui.ServerChart', 'goog.ui.ServerChart.AxisDisplayType', 'goog.ui.ServerChart.ChartType', 'goog.ui.ServerChart.EncodingType', 'goog.ui.ServerChart.Event', 'goog.ui.ServerChart.LegendPosition', 'goog.ui.ServerChart.MaximumValue', 'goog.ui.ServerChart.MultiAxisAlignment', 'goog.ui.ServerChart.MultiAxisType', 'goog.ui.ServerChart.UriParam', 'goog.ui.ServerChart.UriTooLongEvent'], ['goog.Uri', 'goog.array', 'goog.asserts', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events.Event', 'goog.string', 'goog.ui.Component'], {});\ngoog.addDependency('ui/serverchart_test.js', ['goog.ui.ServerChartTest'], ['goog.Uri', 'goog.events', 'goog.testing.testSuite', 'goog.ui.ServerChart'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/slider.js', ['goog.ui.Slider', 'goog.ui.Slider.Orientation'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.dom.TagName', 'goog.ui.SliderBase'], {});\ngoog.addDependency('ui/sliderbase.js', ['goog.ui.SliderBase', 'goog.ui.SliderBase.AnimationFactory', 'goog.ui.SliderBase.Orientation'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.events.MouseWheelHandler', 'goog.functions', 'goog.fx.AnimationParallelQueue', 'goog.fx.Dragger', 'goog.fx.Transition', 'goog.fx.dom.ResizeHeight', 'goog.fx.dom.ResizeWidth', 'goog.fx.dom.Slide', 'goog.math', 'goog.math.Coordinate', 'goog.style', 'goog.style.bidi', 'goog.ui.Component', 'goog.ui.RangeModel'], {});\ngoog.addDependency('ui/sliderbase_test.js', ['goog.ui.SliderBaseTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.fx.Animation', 'goog.math.Coordinate', 'goog.style', 'goog.style.bidi', 'goog.testing.MockClock', 'goog.testing.MockControl', 'goog.testing.events', 'goog.testing.mockmatchers', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.SliderBase', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/splitpane.js', ['goog.ui.SplitPane', 'goog.ui.SplitPane.Orientation'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.fx.Dragger', 'goog.math.Rect', 'goog.math.Size', 'goog.style', 'goog.ui.Component', 'goog.userAgent'], {});\ngoog.addDependency('ui/splitpane_test.js', ['goog.ui.SplitPaneTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.math.Size', 'goog.style', 'goog.testing.events', 'goog.testing.recordFunction', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.SplitPane'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/style/app/buttonrenderer.js', ['goog.ui.style.app.ButtonRenderer'], ['goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.Button', 'goog.ui.CustomButtonRenderer', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.registry'], {});\ngoog.addDependency('ui/style/app/buttonrenderer_test.js', ['goog.ui.style.app.ButtonRendererTest'], ['goog.dom', 'goog.testing.testSuite', 'goog.testing.ui.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.style.app.ButtonRenderer', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/style/app/menubuttonrenderer.js', ['goog.ui.style.app.MenuButtonRenderer'], ['goog.a11y.aria.Role', 'goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.style', 'goog.ui.Menu', 'goog.ui.MenuRenderer', 'goog.ui.style.app.ButtonRenderer'], {});\ngoog.addDependency('ui/style/app/menubuttonrenderer_test.js', ['goog.ui.style.app.MenuButtonRendererTest'], ['goog.dom', 'goog.testing.testSuite', 'goog.testing.ui.style', 'goog.ui.Component', 'goog.ui.MenuButton', 'goog.ui.style.app.MenuButtonRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/style/app/primaryactionbuttonrenderer.js', ['goog.ui.style.app.PrimaryActionButtonRenderer'], ['goog.ui.Button', 'goog.ui.registry', 'goog.ui.style.app.ButtonRenderer'], {});\ngoog.addDependency('ui/style/app/primaryactionbuttonrenderer_test.js', ['goog.ui.style.app.PrimaryActionButtonRendererTest'], ['goog.dom', 'goog.testing.testSuite', 'goog.testing.ui.style', 'goog.ui.Button', 'goog.ui.Component', 'goog.ui.style.app.PrimaryActionButtonRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/submenu.js', ['goog.ui.SubMenu'], ['goog.Timer', 'goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.KeyCodes', 'goog.positioning.AnchoredViewportPosition', 'goog.positioning.Corner', 'goog.style', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.SubMenuRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/submenu_test.js', ['goog.ui.SubMenuTest'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.functions', 'goog.positioning', 'goog.positioning.Overflow', 'goog.style', 'goog.testing.MockClock', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.Menu', 'goog.ui.MenuItem', 'goog.ui.SubMenu', 'goog.ui.SubMenuRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/submenurenderer.js', ['goog.ui.SubMenuRenderer'], ['goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.style', 'goog.ui.Menu', 'goog.ui.MenuItemRenderer'], {});\ngoog.addDependency('ui/synthetickeyboardevent.js', ['goog.ui.SyntheticKeyboardEvent'], ['goog.events.Event', 'goog.ui.KeyboardEventData'], {});\ngoog.addDependency('ui/tab.js', ['goog.ui.Tab'], ['goog.ui.Component', 'goog.ui.Control', 'goog.ui.TabRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/tab_test.js', ['goog.ui.TabTest'], ['goog.dom', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.Tab', 'goog.ui.TabRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/tabbar.js', ['goog.ui.TabBar', 'goog.ui.TabBar.Location'], ['goog.ui.Component.EventType', 'goog.ui.Container', 'goog.ui.Container.Orientation', 'goog.ui.Tab', 'goog.ui.TabBarRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/tabbar_test.js', ['goog.ui.TabBarTest'], ['goog.dom', 'goog.events', 'goog.events.Event', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.Container', 'goog.ui.Tab', 'goog.ui.TabBar', 'goog.ui.TabBarRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/tabbarrenderer.js', ['goog.ui.TabBarRenderer'], ['goog.a11y.aria.Role', 'goog.object', 'goog.ui.ContainerRenderer'], {});\ngoog.addDependency('ui/tabbarrenderer_test.js', ['goog.ui.TabBarRendererTest'], ['goog.a11y.aria.Role', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.testSuite', 'goog.testing.ui.rendererasserts', 'goog.ui.Container', 'goog.ui.TabBar', 'goog.ui.TabBarRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/tablesorter.js', ['goog.ui.TableSorter', 'goog.ui.TableSorter.EventType'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events.EventType', 'goog.functions', 'goog.ui.Component'], {});\ngoog.addDependency('ui/tablesorter_test.js', ['goog.ui.TableSorterTest'], ['goog.array', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.TableSorter'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/tabpane.js', ['goog.ui.TabPane', 'goog.ui.TabPane.Events', 'goog.ui.TabPane.TabLocation', 'goog.ui.TabPane.TabPage', 'goog.ui.TabPaneEvent'], ['goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.Event', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.html.SafeStyleSheet', 'goog.style'], {});\ngoog.addDependency('ui/tabpane_test.js', ['goog.ui.TabPaneTest'], ['goog.dom', 'goog.testing.testSuite', 'goog.ui.TabPane'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/tabrenderer.js', ['goog.ui.TabRenderer'], ['goog.a11y.aria.Role', 'goog.ui.Component', 'goog.ui.ControlRenderer'], {});\ngoog.addDependency('ui/tabrenderer_test.js', ['goog.ui.TabRendererTest'], ['goog.a11y.aria.Role', 'goog.dom', 'goog.dom.classlist', 'goog.testing.dom', 'goog.testing.testSuite', 'goog.testing.ui.rendererasserts', 'goog.ui.Tab', 'goog.ui.TabRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/textarea.js', ['goog.ui.Textarea', 'goog.ui.Textarea.EventType'], ['goog.asserts', 'goog.dom', 'goog.dom.classlist', 'goog.events.EventType', 'goog.style', 'goog.ui.Control', 'goog.ui.TextareaRenderer', 'goog.userAgent'], {});\ngoog.addDependency('ui/textarea_test.js', ['goog.ui.TextareaTest'], ['goog.dom', 'goog.dom.classlist', 'goog.events', 'goog.style', 'goog.testing.ExpectedFailures', 'goog.testing.events.EventObserver', 'goog.testing.testSuite', 'goog.ui.Textarea', 'goog.ui.TextareaRenderer', 'goog.userAgent', 'goog.userAgent.product'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/textarearenderer.js', ['goog.ui.TextareaRenderer'], ['goog.dom.TagName', 'goog.ui.Component', 'goog.ui.ControlRenderer'], {});\ngoog.addDependency('ui/togglebutton.js', ['goog.ui.ToggleButton'], ['goog.ui.Button', 'goog.ui.Component', 'goog.ui.CustomButtonRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/toolbar.js', ['goog.ui.Toolbar'], ['goog.ui.Container', 'goog.ui.ToolbarRenderer'], {});\ngoog.addDependency('ui/toolbar_test.js', ['goog.ui.ToolbarTest'], ['goog.a11y.aria', 'goog.dom', 'goog.events.EventType', 'goog.testing.events', 'goog.testing.events.Event', 'goog.testing.testSuite', 'goog.ui.Toolbar', 'goog.ui.ToolbarMenuButton'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/toolbarbutton.js', ['goog.ui.ToolbarButton'], ['goog.ui.Button', 'goog.ui.ToolbarButtonRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/toolbarbuttonrenderer.js', ['goog.ui.ToolbarButtonRenderer'], ['goog.ui.CustomButtonRenderer'], {});\ngoog.addDependency('ui/toolbarcolormenubutton.js', ['goog.ui.ToolbarColorMenuButton'], ['goog.ui.ColorMenuButton', 'goog.ui.ToolbarColorMenuButtonRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/toolbarcolormenubuttonrenderer.js', ['goog.ui.ToolbarColorMenuButtonRenderer'], ['goog.asserts', 'goog.dom.classlist', 'goog.ui.ColorMenuButtonRenderer', 'goog.ui.MenuButtonRenderer', 'goog.ui.ToolbarMenuButtonRenderer'], {});\ngoog.addDependency('ui/toolbarcolormenubuttonrenderer_test.js', ['goog.ui.ToolbarColorMenuButtonRendererTest'], ['goog.dom', 'goog.testing.testSuite', 'goog.testing.ui.RendererHarness', 'goog.testing.ui.rendererasserts', 'goog.ui.ToolbarColorMenuButton', 'goog.ui.ToolbarColorMenuButtonRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/toolbarmenubutton.js', ['goog.ui.ToolbarMenuButton'], ['goog.ui.MenuButton', 'goog.ui.ToolbarMenuButtonRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/toolbarmenubuttonrenderer.js', ['goog.ui.ToolbarMenuButtonRenderer'], ['goog.ui.MenuButtonRenderer'], {});\ngoog.addDependency('ui/toolbarrenderer.js', ['goog.ui.ToolbarRenderer'], ['goog.a11y.aria.Role', 'goog.dom.TagName', 'goog.ui.Container', 'goog.ui.ContainerRenderer', 'goog.ui.Separator', 'goog.ui.ToolbarSeparatorRenderer'], {});\ngoog.addDependency('ui/toolbarselect.js', ['goog.ui.ToolbarSelect'], ['goog.ui.Select', 'goog.ui.ToolbarMenuButtonRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/toolbarseparator.js', ['goog.ui.ToolbarSeparator'], ['goog.ui.Separator', 'goog.ui.ToolbarSeparatorRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/toolbarseparatorrenderer.js', ['goog.ui.ToolbarSeparatorRenderer'], ['goog.asserts', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.MenuSeparatorRenderer'], {});\ngoog.addDependency('ui/toolbarseparatorrenderer_test.js', ['goog.ui.ToolbarSeparatorRendererTest'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.INLINE_BLOCK_CLASSNAME', 'goog.ui.ToolbarSeparator', 'goog.ui.ToolbarSeparatorRenderer'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/toolbartogglebutton.js', ['goog.ui.ToolbarToggleButton'], ['goog.ui.ToggleButton', 'goog.ui.ToolbarButtonRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/tooltip.js', ['goog.ui.Tooltip', 'goog.ui.Tooltip.CursorTooltipPosition', 'goog.ui.Tooltip.ElementTooltipPosition', 'goog.ui.Tooltip.State'], ['goog.Timer', 'goog.array', 'goog.asserts', 'goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.events', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.math.Box', 'goog.math.Coordinate', 'goog.positioning', 'goog.positioning.AnchoredPosition', 'goog.positioning.Corner', 'goog.positioning.Overflow', 'goog.positioning.OverflowStatus', 'goog.positioning.ViewportPosition', 'goog.structs.Set', 'goog.style', 'goog.ui.Popup', 'goog.ui.PopupBase'], {});\ngoog.addDependency('ui/tooltip_test.js', ['goog.ui.TooltipTest'], ['goog.dom', 'goog.dom.TagName', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.html.testing', 'goog.math.Coordinate', 'goog.positioning.AbsolutePosition', 'goog.style', 'goog.testing.MockClock', 'goog.testing.TestQueue', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.PopupBase', 'goog.ui.Tooltip', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/tree/basenode.js', ['goog.ui.tree.BaseNode', 'goog.ui.tree.BaseNode.EventType'], ['goog.Timer', 'goog.a11y.aria', 'goog.a11y.aria.State', 'goog.asserts', 'goog.dom.safe', 'goog.events.Event', 'goog.events.KeyCodes', 'goog.html.SafeHtml', 'goog.html.SafeStyle', 'goog.string', 'goog.string.StringBuffer', 'goog.style', 'goog.ui.Component'], {});\ngoog.addDependency('ui/tree/basenode_test.js', ['goog.ui.tree.BaseNodeTest'], ['goog.a11y.aria', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.html.testing', 'goog.testing.testSuite', 'goog.ui.Component', 'goog.ui.tree.BaseNode', 'goog.ui.tree.TreeControl', 'goog.ui.tree.TreeNode'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/tree/treecontrol.js', ['goog.ui.tree.TreeControl'], ['goog.a11y.aria', 'goog.asserts', 'goog.dom.classlist', 'goog.events.EventType', 'goog.events.FocusHandler', 'goog.events.KeyHandler', 'goog.html.SafeHtml', 'goog.log', 'goog.ui.tree.BaseNode', 'goog.ui.tree.TreeNode', 'goog.ui.tree.TypeAhead', 'goog.userAgent'], {});\ngoog.addDependency('ui/tree/treecontrol_test.js', ['goog.ui.tree.TreeControlTest'], ['goog.dom', 'goog.testing.testSuite', 'goog.ui.tree.TreeControl'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/tree/treenode.js', ['goog.ui.tree.TreeNode'], ['goog.ui.tree.BaseNode'], {});\ngoog.addDependency('ui/tree/typeahead.js', ['goog.ui.tree.TypeAhead', 'goog.ui.tree.TypeAhead.Offset'], ['goog.array', 'goog.events.KeyCodes', 'goog.string', 'goog.structs.Trie'], {});\ngoog.addDependency('ui/tree/typeahead_test.js', ['goog.ui.tree.TypeAheadTest'], ['goog.dom', 'goog.events.KeyCodes', 'goog.testing.testSuite', 'goog.ui.tree.TreeControl', 'goog.ui.tree.TypeAhead'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/tristatemenuitem.js', ['goog.ui.TriStateMenuItem', 'goog.ui.TriStateMenuItem.State'], ['goog.dom.classlist', 'goog.ui.Component', 'goog.ui.MenuItem', 'goog.ui.TriStateMenuItemRenderer', 'goog.ui.registry'], {});\ngoog.addDependency('ui/tristatemenuitemrenderer.js', ['goog.ui.TriStateMenuItemRenderer'], ['goog.asserts', 'goog.dom.classlist', 'goog.ui.MenuItemRenderer'], {});\ngoog.addDependency('ui/twothumbslider.js', ['goog.ui.TwoThumbSlider'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.dom', 'goog.dom.TagName', 'goog.ui.SliderBase'], {});\ngoog.addDependency('ui/twothumbslider_test.js', ['goog.ui.TwoThumbSliderTest'], ['goog.testing.testSuite', 'goog.ui.SliderBase', 'goog.ui.TwoThumbSlider'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('ui/zippy.js', ['goog.ui.Zippy', 'goog.ui.Zippy.Events', 'goog.ui.ZippyEvent'], ['goog.a11y.aria', 'goog.a11y.aria.Role', 'goog.a11y.aria.State', 'goog.dom', 'goog.dom.classlist', 'goog.events.Event', 'goog.events.EventHandler', 'goog.events.EventTarget', 'goog.events.EventType', 'goog.events.KeyCodes', 'goog.events.KeyHandler', 'goog.style'], {});\ngoog.addDependency('ui/zippy_test.js', ['goog.ui.ZippyTest'], ['goog.a11y.aria', 'goog.dom', 'goog.dom.TagName', 'goog.dom.classlist', 'goog.events', 'goog.events.KeyCodes', 'goog.object', 'goog.testing.events', 'goog.testing.testSuite', 'goog.ui.Zippy'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('uri/uri.js', ['goog.Uri', 'goog.Uri.QueryData'], ['goog.array', 'goog.asserts', 'goog.string', 'goog.structs', 'goog.structs.Map', 'goog.uri.utils', 'goog.uri.utils.ComponentIndex', 'goog.uri.utils.StandardQueryParam'], {});\ngoog.addDependency('uri/uri_test.js', ['goog.UriTest'], ['goog.Uri', 'goog.testing.testSuite'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('uri/utils.js', ['goog.uri.utils', 'goog.uri.utils.ComponentIndex', 'goog.uri.utils.QueryArray', 'goog.uri.utils.QueryValue', 'goog.uri.utils.StandardQueryParam'], ['goog.array', 'goog.asserts', 'goog.string'], {});\ngoog.addDependency('uri/utils_test.js', ['goog.uri.utilsTest'], ['goog.functions', 'goog.string', 'goog.testing.testSuite', 'goog.uri.utils'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('useragent/adobereader.js', ['goog.userAgent.adobeReader'], ['goog.string', 'goog.userAgent'], {'module': 'goog'});\ngoog.addDependency('useragent/adobereader_test.js', ['goog.userAgent.adobeReaderTest'], ['goog.testing.testSuite', 'goog.userAgent.adobeReader'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('useragent/flash.js', ['goog.userAgent.flash'], ['goog.string'], {});\ngoog.addDependency('useragent/flash_test.js', ['goog.userAgent.flashTest'], ['goog.testing.testSuite', 'goog.userAgent.flash'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('useragent/iphoto.js', ['goog.userAgent.iphoto'], ['goog.string', 'goog.userAgent'], {});\ngoog.addDependency('useragent/jscript.js', ['goog.userAgent.jscript'], ['goog.string'], {});\ngoog.addDependency('useragent/jscript_test.js', ['goog.userAgent.jscriptTest'], ['goog.testing.testSuite', 'goog.userAgent.jscript'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('useragent/keyboard.js', ['goog.userAgent.keyboard'], ['goog.labs.userAgent.platform'], {});\ngoog.addDependency('useragent/keyboard_test.js', ['goog.userAgent.keyboardTest'], ['goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.MockUserAgent', 'goog.testing.testSuite', 'goog.userAgent.keyboard', 'goog.userAgentTestUtil'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('useragent/platform.js', ['goog.userAgent.platform'], ['goog.string', 'goog.userAgent'], {});\ngoog.addDependency('useragent/platform_test.js', ['goog.userAgent.platformTest'], ['goog.testing.MockUserAgent', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.platform', 'goog.userAgentTestUtil'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('useragent/product.js', ['goog.userAgent.product'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.platform', 'goog.userAgent'], {});\ngoog.addDependency('useragent/product_isversion.js', ['goog.userAgent.product.isVersion'], ['goog.labs.userAgent.platform', 'goog.string', 'goog.userAgent', 'goog.userAgent.product'], {});\ngoog.addDependency('useragent/product_test.js', ['goog.userAgent.productTest'], ['goog.array', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.MockUserAgent', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgent.product', 'goog.userAgent.product.isVersion', 'goog.userAgentTestUtil'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('useragent/useragent.js', ['goog.userAgent'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.engine', 'goog.labs.userAgent.platform', 'goog.labs.userAgent.util', 'goog.reflect', 'goog.string'], {});\ngoog.addDependency('useragent/useragent_quirks_test.js', ['goog.userAgentQuirksTest'], ['goog.testing.testSuite', 'goog.userAgent'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('useragent/useragent_test.js', ['goog.userAgentTest'], ['goog.array', 'goog.labs.userAgent.platform', 'goog.labs.userAgent.testAgents', 'goog.labs.userAgent.util', 'goog.testing.PropertyReplacer', 'goog.testing.testSuite', 'goog.userAgent', 'goog.userAgentTestUtil'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('useragent/useragenttestutil.js', ['goog.userAgentTestUtil', 'goog.userAgentTestUtil.UserAgents'], ['goog.labs.userAgent.browser', 'goog.labs.userAgent.engine', 'goog.labs.userAgent.platform', 'goog.object', 'goog.userAgent', 'goog.userAgent.keyboard', 'goog.userAgent.platform', 'goog.userAgent.product', 'goog.userAgent.product.isVersion'], {});\ngoog.addDependency('vec/float32array.js', ['goog.vec.Float32Array'], [], {'lang': 'es6'});\ngoog.addDependency('vec/float32array_test.js', ['goog.vec.Float32ArrayTest'], ['goog.testing.testSuite', 'goog.vec.Float32Array'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/float64array.js', ['goog.vec.Float64Array'], [], {'lang': 'es6'});\ngoog.addDependency('vec/float64array_test.js', ['goog.vec.Float64ArrayTest'], ['goog.testing.testSuite', 'goog.vec.Float64Array'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/mat3.js', ['goog.vec.Mat3'], ['goog.vec'], {});\ngoog.addDependency('vec/mat3_test.js', ['goog.vec.Mat3Test'], ['goog.testing.testSuite', 'goog.vec.Mat3'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/mat3d.js', ['goog.vec.mat3d', 'goog.vec.mat3d.Type'], ['goog.vec', 'goog.vec.vec3d.Type'], {});\ngoog.addDependency('vec/mat3d_test.js', ['goog.vec.mat3dTest'], ['goog.testing.testSuite', 'goog.vec.mat3d'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/mat3f.js', ['goog.vec.mat3f', 'goog.vec.mat3f.Type'], ['goog.vec', 'goog.vec.vec3f.Type'], {});\ngoog.addDependency('vec/mat3f_test.js', ['goog.vec.mat3fTest'], ['goog.testing.testSuite', 'goog.vec.mat3f'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/mat4.js', ['goog.vec.Mat4'], ['goog.vec', 'goog.vec.Vec3', 'goog.vec.Vec4'], {});\ngoog.addDependency('vec/mat4_test.js', ['goog.vec.Mat4Test'], ['goog.testing.testSuite', 'goog.vec.Mat4', 'goog.vec.Vec3', 'goog.vec.Vec4'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/mat4d.js', ['goog.vec.mat4d', 'goog.vec.mat4d.Type'], ['goog.vec', 'goog.vec.Quaternion', 'goog.vec.vec3d', 'goog.vec.vec4d'], {});\ngoog.addDependency('vec/mat4d_test.js', ['goog.vec.mat4dTest'], ['goog.testing.testSuite', 'goog.vec.Quaternion', 'goog.vec.mat4d', 'goog.vec.vec3d', 'goog.vec.vec4d'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/mat4f.js', ['goog.vec.mat4f', 'goog.vec.mat4f.Type'], ['goog.vec', 'goog.vec.Quaternion', 'goog.vec.vec3f', 'goog.vec.vec4f'], {});\ngoog.addDependency('vec/mat4f_test.js', ['goog.vec.mat4fTest'], ['goog.testing.testSuite', 'goog.vec.Quaternion', 'goog.vec.mat4f', 'goog.vec.vec3f', 'goog.vec.vec4f'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/quaternion.js', ['goog.vec.Quaternion', 'goog.vec.Quaternion.AnyType'], ['goog.vec', 'goog.vec.Vec3', 'goog.vec.Vec4'], {});\ngoog.addDependency('vec/quaternion_test.js', ['goog.vec.QuaternionTest'], ['goog.testing.testSuite', 'goog.vec.Mat3', 'goog.vec.Mat4', 'goog.vec.Quaternion', 'goog.vec.Vec3', 'goog.vec.vec3f'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/ray.js', ['goog.vec.Ray'], ['goog.vec.Vec3'], {});\ngoog.addDependency('vec/ray_test.js', ['goog.vec.RayTest'], ['goog.testing.testSuite', 'goog.vec.Ray'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/vec.js', ['goog.vec', 'goog.vec.AnyType', 'goog.vec.ArrayType', 'goog.vec.Float32', 'goog.vec.Float64', 'goog.vec.Number'], ['goog.vec.Float32Array', 'goog.vec.Float64Array'], {});\ngoog.addDependency('vec/vec2.js', ['goog.vec.Vec2'], ['goog.vec'], {});\ngoog.addDependency('vec/vec2_test.js', ['goog.vec.Vec2Test'], ['goog.testing.testSuite', 'goog.vec.Vec2'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/vec2d.js', ['goog.vec.vec2d', 'goog.vec.vec2d.Type'], ['goog.vec'], {});\ngoog.addDependency('vec/vec2d_test.js', ['goog.vec.vec2dTest'], ['goog.testing.testSuite', 'goog.vec.vec2d'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/vec2f.js', ['goog.vec.vec2f', 'goog.vec.vec2f.Type'], ['goog.vec'], {});\ngoog.addDependency('vec/vec2f_test.js', ['goog.vec.vec2fTest'], ['goog.testing.testSuite', 'goog.vec.vec2f'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/vec3.js', ['goog.vec.Vec3'], ['goog.vec'], {});\ngoog.addDependency('vec/vec3_test.js', ['goog.vec.Vec3Test'], ['goog.testing.testSuite', 'goog.vec.Vec3'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/vec3d.js', ['goog.vec.vec3d', 'goog.vec.vec3d.Type'], ['goog.vec'], {});\ngoog.addDependency('vec/vec3d_test.js', ['goog.vec.vec3dTest'], ['goog.testing.testSuite', 'goog.vec.vec3d'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/vec3f.js', ['goog.vec.vec3f', 'goog.vec.vec3f.Type'], ['goog.vec'], {});\ngoog.addDependency('vec/vec3f_test.js', ['goog.vec.vec3fTest'], ['goog.testing.testSuite', 'goog.vec.vec3f'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/vec4.js', ['goog.vec.Vec4'], ['goog.vec'], {});\ngoog.addDependency('vec/vec4_test.js', ['goog.vec.Vec4Test'], ['goog.testing.testSuite', 'goog.vec.Vec4'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/vec4d.js', ['goog.vec.vec4d', 'goog.vec.vec4d.Type'], ['goog.vec'], {});\ngoog.addDependency('vec/vec4d_test.js', ['goog.vec.vec4dTest'], ['goog.testing.testSuite', 'goog.vec.vec4d'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('vec/vec4f.js', ['goog.vec.vec4f', 'goog.vec.vec4f.Type'], ['goog.vec'], {});\ngoog.addDependency('vec/vec4f_test.js', ['goog.vec.vec4fTest'], ['goog.testing.testSuite', 'goog.vec.vec4f'], {'lang': 'es6', 'module': 'goog'});\ngoog.addDependency('webgl/webgl.js', ['goog.webgl'], [], {});\ngoog.addDependency('window/window.js', ['goog.window'], ['goog.dom', 'goog.dom.TagName', 'goog.dom.safe', 'goog.html.SafeUrl', 'goog.html.uncheckedconversions', 'goog.labs.userAgent.platform', 'goog.string', 'goog.string.Const', 'goog.userAgent'], {});\ngoog.addDependency('window/window_test.js', ['goog.windowTest'], ['goog.Promise', 'goog.dom', 'goog.dom.TagName', 'goog.events', 'goog.functions', 'goog.html.SafeUrl', 'goog.labs.userAgent.browser', 'goog.labs.userAgent.engine', 'goog.labs.userAgent.platform', 'goog.string', 'goog.testing.PropertyReplacer', 'goog.testing.TestCase', 'goog.testing.testSuite', 'goog.window'], {'lang': 'es6', 'module': 'goog'});\n","^9I",1579837703000,"^9J",["^9K",[]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"~:goog-requires",[],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/deps.js"],"^:1",["^9K",["^K;"]],"~:uses-global-buffer",false,"^9<",true,"^9=",[],"~:uses-global-process",false],["^ ","^K3",[["^ ","~:string","fs","~:offset",1324,"~:import",false],["^ ","^KA","path","^KB",1350,"^KC",false],["^ ","^KA","vm","^KB",1376,"^KC",false]],"^K4",true,"^K5",false,"^9A",[1579837703000],"^K6",[],"^K7",[["^ ","~:line",65,"~:column",4]],"^K8",[],"^K9","es3","^;I",null,"^K:","~$module$goog$bootstrap$nodejs","^9B","module$goog$bootstrap$nodejs.js","^9C",["^9D","goog/bootstrap/nodejs.js"],"^9E","goog/bootstrap/nodejs.js","^9F","^K<","^K=",["fs","path","vm"],"^9H","// Copyright 2013 The Closure Library Authors.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A nodejs script for dynamically requiring Closure within\n * nodejs.\n *\n * Example of usage:\n * <code>\n * require('./bootstrap/nodejs')\n * goog.require('goog.ui.Component')\n * </code>\n *\n * This loads goog.ui.Component in the global scope.\n *\n * If you want to load custom libraries, you can require the custom deps file\n * directly. If your custom libraries introduce new globals, you may\n * need to run goog.nodeGlobalRequire to get them to load correctly.\n *\n * <code>\n * require('./path/to/my/deps.js')\n * goog.bootstrap.nodeJs.nodeGlobalRequire('./path/to/my/base.js')\n * goog.require('my.Class')\n * </code>\n *\n * @author nick@medium.com (Nick Santos)\n *\n * @nocompile\n */\n\n\nvar fs = require('fs');\nvar path = require('path');\nvar vm = require('vm');\n\n\n/**\n * The goog namespace in the global scope.\n */\nglobal.goog = {};\n\n\n/**\n * Imports a script using Node's require() API.\n *\n * @param {string} src The script source.\n * @param {string=} opt_sourceText The optional source text to evaluate.\n * @return {boolean} True if the script was imported, false otherwise.\n */\nglobal.CLOSURE_IMPORT_SCRIPT = function(src, opt_sourceText) {\n  // Sources are always expressed relative to closure's base.js, but\n  // require() is always relative to the current source.\n  if (opt_sourceText === undefined) {\n    require('./../' + src);\n  } else {\n    eval(opt_sourceText);\n  }\n  return true;\n};\n\n\n/**\n * Loads a file when using Closure's goog.require() API with goog.modules.\n *\n * @param {string} src The file source.\n * @return {string} The file contents.\n */\nglobal.CLOSURE_LOAD_FILE_SYNC = function(src) {\n  return fs.readFileSync(\n      path.resolve(__dirname, '..', src), {encoding: 'utf-8'});\n};\n\n\n// Declared here so it can be used to require base.js\nfunction nodeGlobalRequire(file) {\n  vm.runInThisContext.call(global, fs.readFileSync(file), file);\n}\n\n\n// Load Closure's base.js into memory.  It is assumed base.js is in the\n// directory above this directory given this script's location in\n// bootstrap/nodejs.js.\nnodeGlobalRequire(path.resolve(__dirname, '..', 'base.js'));\n\n\n/**\n * Bootstraps a file into the global scope.\n *\n * This is strictly for cases where normal require() won't work,\n * because the file declares global symbols with 'var' that need to\n * be added to the global scope.\n * @suppress {missingProvide}\n *\n * @param {string} file The path to the file.\n */\ngoog.nodeGlobalRequire = nodeGlobalRequire;\n","^9I",1579837703000,"^9J",["^9K",[]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^K>",[],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/bootstrap/nodejs.js"],"^:1",["^9K",["^KF"]],"^K?",false,"^9<",true,"^9=",["fs","path","vm"],"^K@",false],["^ ","^9A",[1579837703000],"^9B","goog.net.xpc.relay.js","^9C",["^9D","goog/net/xpc/relay.js"],"^9E","goog/net/xpc/relay.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Standalone script to be included in the relay-document\n * used by goog.net.xpc.IframeRelayTransport. This script will decode the\n * fragment identifier, determine the target window object and deliver\n * the data to it.\n *\n */\n\ngoog.provide('goog.net.xpc.relay');\n\n(function() {\n  // Decode the fragement identifier.\n  // location.href is expected to be structured as follows:\n  // <url>#<channel_name>[,<iframe_id>]|<data>\n\n  // Get the fragment identifier.\n  let raw = window.location.hash;\n  if (!raw) {\n    return;\n  }\n  if (raw.charAt(0) == '#') {\n    raw = raw.substring(1);\n  }\n  const pos = raw.indexOf('|');\n  const head = raw.substring(0, pos).split(',');\n  const channelName = head[0];\n  const iframeId = head.length == 2 ? head[1] : null;\n  const frame = raw.substring(pos + 1);\n\n  // Find the window object of the peer.\n  //\n  // The general structure of the frames looks like this:\n  // - peer1\n  //   - relay2\n  //   - peer2\n  //     - relay1\n  //\n  // We are either relay1 or relay2.\n\n  let win;\n  if (iframeId) {\n    // We are relay2 and need to deliver the data to peer2.\n    win = window.parent.frames[iframeId];\n  } else {\n    // We are relay1 and need to deliver the data to peer1.\n    win = window.parent.parent;\n  }\n\n  // Deliver the data.\n  try {\n    win['xpcRelay'](channelName, frame);\n  } catch (e) {\n    // Nothing useful can be done here.\n    // It would be great to inform the sender the delivery of this message\n    // failed, but this is not possible because we are already in the receiver's\n    // domain at this point.\n  }\n})();\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/xpc/relay.js"],"^:1",["^9K",["~$goog.net.xpc.relay"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.i18n.dateintervalpatternsext.js","^9C",["^9D","goog/i18n/dateintervalpatternsext.js"],"^9E","goog/i18n/dateintervalpatternsext.js","^9F","^9G","^9H","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Date interval formatting patterns for all locales.\n *\n * File generated from CLDR ver. 35.1\n *\n * This file covers those locales that are not covered in\n * \"dateintervalpatterns.js\".\n */\n\n// clang-format off\n\ngoog.module('goog.i18n.dateIntervalPatternsExt');\n\nvar dateIntervalPatterns = goog.require('goog.i18n.dateIntervalPatterns');\n\n/** @type {!dateIntervalPatterns.DateIntervalPatterns} */\nvar defaultPatterns;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_af_NA = dateIntervalPatterns.DateIntervalPatterns_af;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_af_ZA = dateIntervalPatterns.DateIntervalPatterns_af;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_agq = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_agq_CM = exports.DateIntervalPatterns_agq;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ak = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ak_GH = exports.DateIntervalPatterns_ak;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_am_ET = dateIntervalPatterns.DateIntervalPatterns_am;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_001 = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_AE = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_BH = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_DJ = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_EH = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_ER = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_IL = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_IQ = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_JO = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_KM = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_KW = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_LB = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_LY = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_MA = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_MR = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_OM = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_PS = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_QA = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_SA = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_SD = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_SO = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_SS = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_SY = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_TD = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_TN = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_XB = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_YE = dateIntervalPatterns.DateIntervalPatterns_ar;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_as = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y – y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG M/y – GGGGG M/y',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd-MM-y – dd-MM-y',\n    '_': 'dd-MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d MMM, y – G d MMM, y',\n    'M': 'd MMM y – d MMM',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM y – d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E, d MMM, y – G E, d MMM, y',\n    'Md': 'E, d MMM y – E, d MMM',\n    'y': 'E, d MMM y – d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd-MM – dd-MM',\n    'd': 'd–d',\n    'y': 'dd-MM-y – dd-MM-y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_as_IN = exports.DateIntervalPatterns_as;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_asa = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_asa_TZ = exports.DateIntervalPatterns_asa;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ast = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'LLLL – LLLL \\'de\\' y',\n    '_': 'LLLL \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'MM – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd/MM – d/MM',\n    'd': 'd – d MMM',\n    'y': 'd MMM \\'de\\' y – d MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd/MM – d/MM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM \\'de\\' y – d MMMM \\'de\\' y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'dd – dd/MM',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd/MM – d/MM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM \\'de\\' y – d MMMM \\'de\\' y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM \\'de\\' y',\n    'd': 'd – d MMM \\'de\\' y',\n    'y': 'd MMM \\'de\\' y – d MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM \\'de\\' y – E, d MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, d MMM – E, d MMM \\'de\\' y',\n    'y': 'E, d MMM \\'de\\' y – E, d MMM \\'de\\' y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ast_ES = exports.DateIntervalPatterns_ast;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_az_Cyrl = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM, y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'dd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM y – d MMM',\n    'd': 'y MMM d–d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'd MMM, E – d MMM, E',\n    'y': 'd MMM y, E – d MMM y, E',\n    '_': 'd MMM, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'd MMM y, E – d MMM, E',\n    'y': 'd MMM y, E – d MMM y, E',\n    '_': 'd MMM y, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM – dd.MM',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_az_Cyrl_AZ = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM, y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'dd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM y – d MMM',\n    'd': 'y MMM d–d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'd MMM, E – d MMM, E',\n    'y': 'd MMM y, E – d MMM y, E',\n    '_': 'd MMM, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'd MMM y, E – d MMM, E',\n    'y': 'd MMM y, E – d MMM y, E',\n    '_': 'd MMM y, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM – dd.MM',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_az_Latn = dateIntervalPatterns.DateIntervalPatterns_az;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_az_Latn_AZ = dateIntervalPatterns.DateIntervalPatterns_az;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bas = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bas_CM = exports.DateIntervalPatterns_bas;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_be_BY = dateIntervalPatterns.DateIntervalPatterns_be;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bem = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bem_ZM = exports.DateIntervalPatterns_bem;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bez = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bez_TZ = exports.DateIntervalPatterns_bez;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bg_BG = dateIntervalPatterns.DateIntervalPatterns_bg;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bm = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bm_ML = exports.DateIntervalPatterns_bm;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bn_BD = dateIntervalPatterns.DateIntervalPatterns_bn;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bn_IN = dateIntervalPatterns.DateIntervalPatterns_bn;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bo = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'y LLL'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMMཚེས་d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMMའི་ཚེས་dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMMའི་ཚེས་d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'y ལོའི་MMMཚེས་d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMMཚེས་d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bo_CN = exports.DateIntervalPatterns_bo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bo_IN = exports.DateIntervalPatterns_bo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_br_FR = dateIntervalPatterns.DateIntervalPatterns_br;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_brx = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd-MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_brx_IN = exports.DateIntervalPatterns_brx;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bs_Cyrl = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y.'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y. G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y.',\n    'y': 'MMM y. – MMM y.',\n    '_': 'MMM y.'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM–MMMM y.',\n    'y': 'MMMM y. – MMMM y.',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'MM.–MM. y.',\n    'y': 'MM.y. – MM.y.',\n    '_': 'MM.y.'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'dd. MMM – dd. MMM',\n    'd': 'dd.–dd. MMM',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'dd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'dd. MMMM – dd. MMMM',\n    'd': 'dd.–dd. MMMM',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd.M – d.M',\n    'y': 'd.M.y. – d.M.y.',\n    '_': 'dd.MM.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'dd. MMMM – dd. MMMM',\n    'd': 'dd.–dd. MMMM',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'dd. MMM – dd. MMM y.',\n    'd': 'dd.–dd. MMM y.',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'dd. MMM y.'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, dd. MMM – E, dd. MMM',\n    'd': 'E, dd. – E, dd. MMM',\n    'y': 'E, dd. MMM y. – E, dd. MMM y.',\n    '_': 'EEE, dd. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, dd. MMM – E, dd. MMM y.',\n    'd': 'E, dd. – E, dd. MMM y.',\n    'y': 'E, dd. MMM y. – E, dd. MMM y.',\n    '_': 'EEE, dd. MMM y.'\n  },\n  DAY_ABBR: {\n    'M': 'd.M – d.M',\n    'd': 'd–d',\n    'y': 'd.M.y. – d.M.y.',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bs_Cyrl_BA = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y.'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y. G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y.',\n    'y': 'MMM y. – MMM y.',\n    '_': 'MMM y.'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM–MMMM y.',\n    'y': 'MMMM y. – MMMM y.',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'MM.–MM. y.',\n    'y': 'MM.y. – MM.y.',\n    '_': 'MM.y.'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'dd. MMM – dd. MMM',\n    'd': 'dd.–dd. MMM',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'dd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'dd. MMMM – dd. MMMM',\n    'd': 'dd.–dd. MMMM',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd.M – d.M',\n    'y': 'd.M.y. – d.M.y.',\n    '_': 'dd.MM.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'dd. MMMM – dd. MMMM',\n    'd': 'dd.–dd. MMMM',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'dd. MMM – dd. MMM y.',\n    'd': 'dd.–dd. MMM y.',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'dd. MMM y.'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, dd. MMM – E, dd. MMM',\n    'd': 'E, dd. – E, dd. MMM',\n    'y': 'E, dd. MMM y. – E, dd. MMM y.',\n    '_': 'EEE, dd. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, dd. MMM – E, dd. MMM y.',\n    'd': 'E, dd. – E, dd. MMM y.',\n    'y': 'E, dd. MMM y. – E, dd. MMM y.',\n    '_': 'EEE, dd. MMM y.'\n  },\n  DAY_ABBR: {\n    'M': 'd.M – d.M',\n    'd': 'd–d',\n    'y': 'd.M.y. – d.M.y.',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bs_Latn = dateIntervalPatterns.DateIntervalPatterns_bs;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_bs_Latn_BA = dateIntervalPatterns.DateIntervalPatterns_bs;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ca_AD = dateIntervalPatterns.DateIntervalPatterns_ca;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ca_ES = dateIntervalPatterns.DateIntervalPatterns_ca;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ca_FR = dateIntervalPatterns.DateIntervalPatterns_ca;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ca_IT = dateIntervalPatterns.DateIntervalPatterns_ca;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ccp = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM, y – d MMM, y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd–d MMM, y',\n    '_': 'd MMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, d MMM – E, d MMM, y',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'EEE, d MMM, y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ccp_BD = exports.DateIntervalPatterns_ccp;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ccp_IN = exports.DateIntervalPatterns_ccp;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ce = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ce_RU = exports.DateIntervalPatterns_ce;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ceb = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ceb_PH = exports.DateIntervalPatterns_ceb;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_cgg = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_cgg_UG = exports.DateIntervalPatterns_cgg;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_chr_US = dateIntervalPatterns.DateIntervalPatterns_chr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ckb = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMMی y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'dی MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'dی MMMی y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE، dی MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE، dی MMMی y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ckb_IQ = exports.DateIntervalPatterns_ckb;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ckb_IR = exports.DateIntervalPatterns_ckb;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_cs_CZ = dateIntervalPatterns.DateIntervalPatterns_cs;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_cy_GB = dateIntervalPatterns.DateIntervalPatterns_cy;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_da_DK = dateIntervalPatterns.DateIntervalPatterns_da;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_da_GL = dateIntervalPatterns.DateIntervalPatterns_da;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_dav = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_dav_KE = exports.DateIntervalPatterns_dav;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_de_BE = dateIntervalPatterns.DateIntervalPatterns_de;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_de_DE = dateIntervalPatterns.DateIntervalPatterns_de;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_de_IT = dateIntervalPatterns.DateIntervalPatterns_de;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_de_LI = dateIntervalPatterns.DateIntervalPatterns_de;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_de_LU = dateIntervalPatterns.DateIntervalPatterns_de;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_dje = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_dje_NE = exports.DateIntervalPatterns_dje;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_dsb = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'LLL – LLL y',\n    'y': 'LLL y – LLL y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'LLLL – LLLL y',\n    'y': 'LLLL y – LLLL y',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M.y – M.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd. – d. MMM',\n    'y': 'd. MMM y – d. MMM y',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd. – d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd.M.y – d.M.y',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd. – d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd. MMM – d. MMM y',\n    'd': 'd. – d. MMM y',\n    '_': 'd. MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d. MMM – E, d. MMM',\n    'd': 'E, d. – E, d. MMM',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE, d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, d. MMM – E, d. MMM y',\n    'd': 'E, d. – E, d. MMM y',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE, d. MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd.M. – d.M.',\n    'd': 'd. – d.',\n    'y': 'd.M.y – d.M.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_dsb_DE = exports.DateIntervalPatterns_dsb;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_dua = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_dua_CM = exports.DateIntervalPatterns_dua;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_dyo = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_dyo_SN = exports.DateIntervalPatterns_dyo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_dz = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'སྤྱི་ཟླ་MMM/MMM, y',\n    'y': 'y-MM – y-MM',\n    '_': 'y སྤྱི་ཟླ་MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y-སྤྱི་ཟླ་MM – MM',\n    'y': 'y-MM – y-MM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'y-MM – MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'སྤྱི་ཟླ་MM ཚེས་d–ཟླ་MM ཚེས་d',\n    'd': 'སྤྱི་ཟླ་MM ཚེས་d–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'སྤྱི་LLL ཚེ་d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'སྤྱི་ཟླ་MM ཚེས་d–ཟླ་MM ཚེས་d',\n    'd': 'སྤྱི་ཟླ་MM ཚེས་d–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'M': 'སྤྱི་ཟླ་MM ཚེས་dd–ཟླ་MM ཚེས་dd',\n    'd': 'སྤྱི་ཟླ་M ཚེས་dd/dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M-d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'སྤྱི་ཟླ་MM ཚེས་d–ཟླ་MM ཚེས་d',\n    'd': 'སྤྱི་ཟླ་MM ཚེས་d–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y-MM-dd – MM-d',\n    'd': 'y-MM-d – d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, སྤྱི་ཟླ་MM ཚེས་d – E, ཟླ་MM ཚེས་d',\n    'y': 'E, y-MM-dd – E, y-MM-dd',\n    '_': 'EEE, སྤྱི་LLL ཚེ་d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Mdy': 'E, y-MM-dd – E, y-MM-dd',\n    '_': 'གཟའ་EEE, ལོy ཟླ་MMM ཚེ་d'\n  },\n  DAY_ABBR: {\n    'M': 'སྤྱི་ཟླ་MM ཚེས་dd–ཟླ་MM ཚེས་dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_dz_BT = exports.DateIntervalPatterns_dz;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ebu = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ebu_KE = exports.DateIntervalPatterns_ebu;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ee = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM–MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d \\'lia\\' – MMM d \\'lia\\'',\n    'd': 'MMM d \\'lia\\' – d \\'lia\\'',\n    'y': 'MMM d \\'lia\\' , y – MMM d \\'lia\\', y',\n    '_': 'MMM d \\'lia\\''\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d \\'lia\\' – MMMM d \\'lia\\'',\n    'd': 'MMMM d \\'lia\\' – d \\'lia\\'',\n    'y': 'MMMM d \\'lia\\' , y – MMMM d \\'lia\\', y',\n    '_': 'MMMM dd \\'lia\\''\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'M/d – M/d',\n    'y': 'M/d/y – M/d/y',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d \\'lia\\' – MMMM d \\'lia\\'',\n    'd': 'MMMM d \\'lia\\' – d \\'lia\\'',\n    'y': 'MMMM d \\'lia\\' , y – MMMM d \\'lia\\', y',\n    '_': 'MMMM d \\'lia\\''\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'MMM d \\'lia\\' – MMM d \\'lia\\', y',\n    'd': 'MMM d \\'lia\\' – d \\'lia\\' , y',\n    'y': 'MMM d \\'lia\\' , y – MMM d \\'lia\\', y',\n    '_': 'MMM d \\'lia\\', y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, MMM d \\'lia\\' – E, MMM d \\'lia\\'',\n    'y': 'E, MMM d \\'lia\\', y – E, MMM d \\'lia\\', y',\n    '_': 'EEE, MMM d \\'lia\\''\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, MMM d \\'lia\\' – E, MMM d \\'lia\\', y',\n    'y': 'E, MMM d \\'lia\\', y – E, MMM d \\'lia\\', y',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'M/d – M/d',\n    'd': 'd–d',\n    'y': 'M/d/y – M/d/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ee_GH = exports.DateIntervalPatterns_ee;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ee_TG = exports.DateIntervalPatterns_ee;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_el_CY = dateIntervalPatterns.DateIntervalPatterns_el;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_el_GR = dateIntervalPatterns.DateIntervalPatterns_el;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_001 = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_150 = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_AE = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_AG = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_AI = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_AS = dateIntervalPatterns.DateIntervalPatterns_en;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_AT = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_BB = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_BE = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_BI = dateIntervalPatterns.DateIntervalPatterns_en;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_BM = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_BS = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_BW = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, dd MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, dd MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_BZ = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, dd MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, dd MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_CC = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_CH = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_CK = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_CM = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_CX = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_CY = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_DE = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_DG = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_DK = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_DM = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_ER = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_FI = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_FJ = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_FK = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_FM = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_GD = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_GG = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_GH = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_GI = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_GM = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_GU = dateIntervalPatterns.DateIntervalPatterns_en;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_GY = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_HK = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/M – d/M',\n    'y': 'd/M/y – d/M/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_IL = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_IM = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_IO = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_JE = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_JM = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_KE = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_KI = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_KN = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_KY = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_LC = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_LR = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_LS = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_MG = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_MH = dateIntervalPatterns.DateIntervalPatterns_en;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_MO = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_MP = dateIntervalPatterns.DateIntervalPatterns_en;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_MS = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_MT = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, dd MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_MU = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_MW = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_MY = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_NA = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_NF = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_NG = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_NL = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_NR = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_NU = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_NZ = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/MM – d/MM',\n    'y': 'd/MM/y – d/MM/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d MMM – E, d MMM',\n    'd': 'E, d – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/MM – d/MM',\n    'y': 'd/MM/y – d/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_PG = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_PH = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_PK = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_PN = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_PR = dateIntervalPatterns.DateIntervalPatterns_en;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_PW = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_RW = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_SB = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_SC = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_SD = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_SE = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'MM/y – MM/y',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_SH = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_SI = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_SL = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_SS = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_SX = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_SZ = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_TC = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_TK = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_TO = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_TT = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_TV = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_TZ = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_UG = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_UM = dateIntervalPatterns.DateIntervalPatterns_en;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_US_POSIX = dateIntervalPatterns.DateIntervalPatterns_en;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_VC = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_VG = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_VI = dateIntervalPatterns.DateIntervalPatterns_en;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_VU = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_WS = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_XA = {\n  YEAR_FULL: {\n    'G': '[y G – y G]',\n    'y': '[y – y]',\n    '_': '[y]'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': '[y G – y G]',\n    'y': '[y – y G]',\n    '_': '[y G]'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': '[MMM y G – MMM y G]',\n    'M': '[MMM – MMM y]',\n    'y': '[MMM y – MMM y]',\n    '_': '[MMM y]'\n  },\n  YEAR_MONTH_FULL: {\n    'G': '[MMMM y G – MMMM y G]',\n    'M': '[MMMM – MMMM y]',\n    'y': '[MMMM y – MMMM y]',\n    '_': '[MMMM y]'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': '[M/y GGGGG – M/y GGGGG]',\n    'My': '[M/y – M/y]',\n    '_': '[MM/y]'\n  },\n  MONTH_DAY_ABBR: {\n    'M': '[MMM d – MMM d]',\n    'd': '[MMM d – d]',\n    'y': '[MMM d, y – MMM d, y]',\n    '_': '[MMM d]'\n  },\n  MONTH_DAY_FULL: {\n    'M': '[MMMM d – MMMM d]',\n    'd': '[MMMM d – d]',\n    'y': '[MMMM d, y – MMMM d, y]',\n    '_': '[MMMM dd]'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': '[M/d – M/d]',\n    'y': '[M/d/y – M/d/y]',\n    '_': '[M/d]'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': '[MMMM d – MMMM d]',\n    'd': '[MMMM d – d]',\n    'y': '[MMMM d, y – MMMM d, y]',\n    '_': '[MMMM d]'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': '[MMM d, y G – MMM d, y G]',\n    'M': '[MMM d – MMM d, y]',\n    'd': '[MMM d – d, y]',\n    'y': '[MMM d, y – MMM d, y]',\n    '_': '[MMM d, y]'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': '[E, MMM d – E, MMM d]',\n    'y': '[E, MMM d, y – E, MMM d, y]',\n    '_': '[EEE, MMM d]'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': '[E, MMM d, y G – E, MMM d, y G]',\n    'Md': '[E, MMM d – E, MMM d, y]',\n    'y': '[E, MMM d, y – E, MMM d, y]',\n    '_': '[EEE, MMM d, y]'\n  },\n  DAY_ABBR: {\n    'M': '[M/d – M/d]',\n    'd': '[d – d]',\n    'y': '[M/d/y – M/d/y]',\n    '_': '[d]'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_ZM = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_ZW = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, dd MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, dd MMM, y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_eo = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'y-MMM-d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_eo_001 = exports.DateIntervalPatterns_eo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_AR = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y \\'a\\' MMM \\'de\\' y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM \\'al\\' MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y \\'al\\' MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    'My': 'MM/y – MM/y',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM \\'al\\' d \\'de\\' MMM',\n    'd': 'dd – dd \\'de\\' MM',\n    'y': 'd \\'de\\' MMM \\'de\\' y \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d \\'de\\' MMM \\'al\\' E d \\'de\\' MMM',\n    'd': 'E d \\'al\\' E d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y \\'al\\' E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'M': 'E, d \\'de\\' MMM \\'al\\' E, d \\'de\\' MMM \\'de\\' y',\n    'd': 'E, d \\'al\\' E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y \\'al\\' E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_BO = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_BR = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_BZ = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_CL = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y \\'a\\' MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    'My': 'MM-y – MM-y',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM \\'al\\' d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd-MM – dd-MM',\n    'y': 'dd-MM-y – dd-MM-y',\n    '_': 'dd-MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d \\'de\\' MMM \\'al\\' E d \\'de\\' MMM',\n    'd': 'E d \\'al\\' E d \\'de\\' MMM',\n    'y': 'E d \\'de\\' MMM \\'de\\' y \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'M': 'E d \\'de\\' MMM \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    'd': 'E d \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    'y': 'E d \\'de\\' MMM \\'de\\' y \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'dd-MM – dd-MM',\n    'd': 'd–d',\n    'y': 'dd-MM-y – dd-MM-y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_CO = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y \\'a\\' y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM \\'a\\' MMM \\'de\\' y',\n    'y': 'MMM \\'de\\' y \\'a\\' MMM \\'de\\' y',\n    '_': 'MMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM \\'a\\' MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y \\'a\\' MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    'M': 'MM/y \\'a\\' MM/y',\n    'y': 'MM/y \\'al\\' MM/y',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM \\'al\\' d \\'de\\' MMM',\n    'd': 'd \\'a\\' d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'M': 'd/MM \\'al\\' d/MM',\n    'd': 'd/MM \\'a\\' d/MM',\n    'y': 'd/MM/y \\'al\\' d/MM/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    'd': 'd \\'a\\' d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d \\'de\\' MMM \\'al\\' E d \\'de\\' MMM',\n    'd': 'E d \\'al\\' E d \\'de\\' MMM',\n    'y': 'E d \\'de\\' MMM \\'de\\' y \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'M': 'E d \\'de\\' MMM \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    'd': 'E d \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    'y': 'E d \\'de\\' MMM \\'de\\' y \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/MM \\'al\\' d/MM',\n    'd': 'd \\'a\\' d',\n    'y': 'd/MM/y \\'al\\' d/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_CR = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_CU = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_DO = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_EA = dateIntervalPatterns.DateIntervalPatterns_es;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_EC = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_GQ = dateIntervalPatterns.DateIntervalPatterns_es;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_GT = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y \\'al\\' y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y \\'a\\' MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    'My': 'MM/y – MM/y',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM \\'al\\' d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/MM – d/MM',\n    'y': 'd/MM/y – d/MM/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d \\'de\\' MMM \\'al\\' E d \\'de\\' MMM',\n    'd': 'E d \\'al\\' E d \\'de\\' MMM',\n    'y': 'E d \\'de\\' MMM \\'de\\' y \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'M': 'E d \\'de\\' MMM \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    'd': 'E d \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    'y': 'E d \\'de\\' MMM \\'de\\' y \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/MM – d/MM',\n    'y': 'd/MM/y – d/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_HN = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_IC = dateIntervalPatterns.DateIntervalPatterns_es;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_NI = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_PA = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y \\'a\\' MMM \\'de\\' y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    'My': 'MM/y – MM/y',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM \\'al\\' d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'MM/dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d \\'de\\' MMM \\'al\\' E d \\'de\\' MMM',\n    'd': 'E d \\'al\\' E d \\'de\\' MMM',\n    'y': 'E d \\'de\\' MMM \\'de\\' y \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'M': 'E d \\'de\\' MMM \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    'd': 'E d \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    'y': 'E d \\'de\\' MMM \\'de\\' y \\'al\\' E d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_PE = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_PH = dateIntervalPatterns.DateIntervalPatterns_es;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_PR = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'MM/dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_PY = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM \\'a\\' MMM y',\n    'y': 'MMM \\'de\\' y \\'a\\' MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM \\'a\\' MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y \\'a\\' MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/M \\'al\\' d/M',\n    'y': 'd/M/y \\'al\\' d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M \\'al\\' d/M',\n    'y': 'd/M/y \\'al\\' d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_SV = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_UY = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_VE = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_et_EE = dateIntervalPatterns.DateIntervalPatterns_et;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_eu_ES = dateIntervalPatterns.DateIntervalPatterns_eu;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ewo = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ewo_CM = exports.DateIntervalPatterns_ewo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fa_AF = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'LLL تا MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'LLLL تا MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y/M تا y/M',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd LLL تا d LLL',\n    'd': 'd تا d LLL',\n    'y': 'd MMM y تا d MMM y',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd LLLL تا d LLLL',\n    'd': 'd تا d LLLL',\n    'y': 'd MMMM y تا d MMMM y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y/M/d تا y/M/d',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd LLLL تا d LLLL',\n    'd': 'd تا d LLLL',\n    'y': 'd MMMM y تا d MMMM y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd LLL تا d MMM y',\n    'd': 'd تا d MMM y',\n    'y': 'd MMM y تا d MMM y',\n    '_': 'MMM d, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E d LLL تا E d LLL',\n    'y': 'E d MMM y تا E d MMM y',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E d LLL تا E d MMM y',\n    'y': 'E d MMM y تا E d MMM y',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'M/d تا M/d',\n    'y': 'y/M/d تا y/M/d',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fa_IR = dateIntervalPatterns.DateIntervalPatterns_fa;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ff = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ff_Latn = exports.DateIntervalPatterns_ff;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ff_Latn_BF = exports.DateIntervalPatterns_ff;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ff_Latn_CM = exports.DateIntervalPatterns_ff;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ff_Latn_GH = exports.DateIntervalPatterns_ff;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ff_Latn_GM = exports.DateIntervalPatterns_ff;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ff_Latn_GN = exports.DateIntervalPatterns_ff;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ff_Latn_GW = exports.DateIntervalPatterns_ff;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ff_Latn_LR = exports.DateIntervalPatterns_ff;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ff_Latn_MR = exports.DateIntervalPatterns_ff;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ff_Latn_NE = exports.DateIntervalPatterns_ff;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ff_Latn_NG = exports.DateIntervalPatterns_ff;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ff_Latn_SL = exports.DateIntervalPatterns_ff;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ff_Latn_SN = exports.DateIntervalPatterns_ff;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fi_FI = dateIntervalPatterns.DateIntervalPatterns_fi;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fil_PH = dateIntervalPatterns.DateIntervalPatterns_fil;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fo = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM–MMMM y',\n    'y': 'MMMM y–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'MM.y–MM.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd. MMM–d. MMM',\n    'd': 'd.–d. MMM',\n    'y': 'dd. MMM y–dd. MMM y',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM–d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'dd. MMMM y–dd. MMMM y',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.MM–dd.MM',\n    'y': 'dd.MM.y–dd.MM.y',\n    '_': 'dd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd. MMMM–d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'dd. MMMM y–dd. MMMM y',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'dd. MMM–dd. MMM y',\n    'd': 'd.–d. MMM y',\n    'y': 'dd. MMM y–dd. MMM y',\n    '_': 'd. MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E d. MMM–E d. MMM',\n    'y': 'E dd. MMM y–E dd. MMM y',\n    '_': 'EEE d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E dd. MMM–E dd. MMM y',\n    'y': 'E dd. MMM y–E dd. MMM y',\n    '_': 'EEE d. MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM–dd.MM',\n    'd': 'd.–d.',\n    'y': 'dd.MM.y–dd.MM.y',\n    '_': 'd.'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fo_DK = exports.DateIntervalPatterns_fo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fo_FO = exports.DateIntervalPatterns_fo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_BE = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_BF = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_BI = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_BJ = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_BL = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_CD = {\n  YEAR_FULL: {\n    'G': 'y G \\'à\\' y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G \\'à\\' y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G \\'à\\' MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G \\'à\\' MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y G \\'à\\' M/y G',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G \\'à\\' d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM y G \\'à\\' E d MMM y G',\n    'M': 'E d MMM – E d MMM y',\n    'd': 'E d – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_CF = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_CG = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_CH = {\n  YEAR_FULL: {\n    'G': 'y G \\'à\\' y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G \\'à\\' y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G \\'à\\' MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G \\'à\\' MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y G \\'à\\' M/y G',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.MM – dd.MM',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'dd.MM.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G \\'à\\' d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM y G \\'à\\' E d MMM y G',\n    'M': 'E d MMM – E d MMM y',\n    'd': 'E d – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM – dd.MM',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_CI = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_CM = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_DJ = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_DZ = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_FR = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_GA = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_GF = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_GN = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_GP = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_GQ = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_HT = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_KM = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_LU = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_MA = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_MC = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_MF = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_MG = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_ML = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_MQ = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_MR = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_MU = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_NC = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_NE = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_PF = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_PM = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_RE = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_RW = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_SC = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_SN = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_SY = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_TD = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_TG = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_TN = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_VU = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_WF = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_YT = dateIntervalPatterns.DateIntervalPatterns_fr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fur = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MM – MM/y',\n    'y': 'MM/y – MM/y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MM – MM/y',\n    'y': 'MM/y – MM/y',\n    '_': 'LLLL \\'dal\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'di\\' MMM – d \\'di\\' MMM',\n    'd': 'd–d \\'di\\' MMM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'di\\' MMMM – d \\'di\\' MMMM',\n    'd': 'd–d \\'di\\' MMMM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd \\'di\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'di\\' MMMM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd \\'di\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'dd/MM/y – d/MM',\n    'd': 'd – d/MM/y',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d \\'di\\' MMM – E d \\'di\\' MMM',\n    'd': 'E d – E d \\'di\\' MMM',\n    'y': 'E dd/MM/y – E dd/MM/y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Mdy': 'E dd/MM/y – E dd/MM/y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fur_IT = exports.DateIntervalPatterns_fur;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fy = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM–MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'MM-y – MM-y',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd-MM – dd-MM',\n    'y': 'dd-MM-y – dd-MM-y',\n    '_': 'd-M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E d MMM – E d MMM y',\n    'd': 'E d – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd-MM – dd-MM',\n    'd': 'd–d',\n    'y': 'dd-MM-y – dd-MM-y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_fy_NL = exports.DateIntervalPatterns_fy;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ga_IE = dateIntervalPatterns.DateIntervalPatterns_ga;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_gd = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'LLL y G – LLL y G',\n    'M': 'LLL – LLL y',\n    'y': 'LLL y – LLL y',\n    '_': 'LLL Y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'LLLL y G – LLLL y G',\n    'M': 'LLLL – LLLL y',\n    '_': 'LLLL y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'L/y GGGGG – L/y GGGGG',\n    'My': 'L/y – L/y',\n    '_': 'LL/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd\\'mh\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd\\'mh\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d MMM – E, d MMM',\n    'd': 'E, d – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d MMM y G – E, d MMM y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_gd_GB = exports.DateIntervalPatterns_gd;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_gl_ES = dateIntervalPatterns.DateIntervalPatterns_gl;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_gsw_CH = dateIntervalPatterns.DateIntervalPatterns_gsw;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_gsw_FR = dateIntervalPatterns.DateIntervalPatterns_gsw;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_gsw_LI = dateIntervalPatterns.DateIntervalPatterns_gsw;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_gu_IN = dateIntervalPatterns.DateIntervalPatterns_gu;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_guz = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_guz_KE = exports.DateIntervalPatterns_guz;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_gv = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_gv_IM = exports.DateIntervalPatterns_gv;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ha = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ha_GH = exports.DateIntervalPatterns_ha;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ha_NE = exports.DateIntervalPatterns_ha;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ha_NG = exports.DateIntervalPatterns_ha;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_haw_US = dateIntervalPatterns.DateIntervalPatterns_haw;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_he_IL = dateIntervalPatterns.DateIntervalPatterns_he;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_hi_IN = dateIntervalPatterns.DateIntervalPatterns_hi;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_hr_BA = dateIntervalPatterns.DateIntervalPatterns_hr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_hr_HR = dateIntervalPatterns.DateIntervalPatterns_hr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_hsb = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'LLL – LLL y',\n    'y': 'LLL y – LLL y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'LLLL – LLLL y',\n    'y': 'LLLL y – LLLL y',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M.y – M.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd. – d. MMM',\n    'y': 'd. MMM y – d. MMM y',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd. – d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd.M.y – d.M.y',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd. – d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd. MMM – d. MMM y',\n    'd': 'd. – d. MMM y',\n    '_': 'd. MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d. MMM – E, d. MMM',\n    'd': 'E, d. – E, d. MMM',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE, d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, d. MMM – E, d. MMM y',\n    'd': 'E, d. – E, d. MMM y',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE, d. MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd.M. – d.M.',\n    'd': 'd. – d.',\n    'y': 'd.M.y – d.M.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_hsb_DE = exports.DateIntervalPatterns_hsb;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_hu_HU = dateIntervalPatterns.DateIntervalPatterns_hu;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_hy_AM = dateIntervalPatterns.DateIntervalPatterns_hy;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ia = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'dd-MM-y – dd-MM-y',\n    '_': 'dd-MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E d MMM – E d MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E d MMM – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'y': 'dd-MM-y – dd-MM-y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ia_001 = exports.DateIntervalPatterns_ia;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_id_ID = dateIntervalPatterns.DateIntervalPatterns_id;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ig = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'y': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM/dd – MM/dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM/dd – MM/dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ig_NG = exports.DateIntervalPatterns_ig;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ii = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ii_CN = exports.DateIntervalPatterns_ii;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_is_IS = dateIntervalPatterns.DateIntervalPatterns_is;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_it_CH = dateIntervalPatterns.DateIntervalPatterns_it;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_it_IT = dateIntervalPatterns.DateIntervalPatterns_it;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_it_SM = dateIntervalPatterns.DateIntervalPatterns_it;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_it_VA = dateIntervalPatterns.DateIntervalPatterns_it;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ja_JP = dateIntervalPatterns.DateIntervalPatterns_ja;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_jgo = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd.M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_jgo_CM = exports.DateIntervalPatterns_jgo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_jmc = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_jmc_TZ = exports.DateIntervalPatterns_jmc;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_jv = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'MMMM d–d',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd-MM-y – dd-MM-y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, d MMM – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd-MM-y – dd-MM-y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_jv_ID = exports.DateIntervalPatterns_jv;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ka_GE = dateIntervalPatterns.DateIntervalPatterns_ka;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kab = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kab_DZ = exports.DateIntervalPatterns_kab;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kam = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kam_KE = exports.DateIntervalPatterns_kam;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kde = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kde_TZ = exports.DateIntervalPatterns_kde;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kea = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM \\'di\\' y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'MMMM \\'di\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd \\'di\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd \\'di\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, dd/MM – E, dd/MM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, d MMM – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kea_CV = exports.DateIntervalPatterns_kea;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_khq = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_khq_ML = exports.DateIntervalPatterns_khq;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ki = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ki_KE = exports.DateIntervalPatterns_ki;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kk_KZ = dateIntervalPatterns.DateIntervalPatterns_kk;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kkj = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kkj_CM = exports.DateIntervalPatterns_kkj;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kl = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kl_GL = exports.DateIntervalPatterns_kl;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kln = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kln_KE = exports.DateIntervalPatterns_kln;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_km_KH = dateIntervalPatterns.DateIntervalPatterns_km;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kn_IN = dateIntervalPatterns.DateIntervalPatterns_kn;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ko_KP = dateIntervalPatterns.DateIntervalPatterns_ko;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ko_KR = dateIntervalPatterns.DateIntervalPatterns_ko;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kok = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y– MMM y',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'MM-y – MM-y',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'd MMM y – d MMM y',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd-MM –dd-MM',\n    'y': 'dd-MM-y – dd-MM-y',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d MMM –E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'dd-MM –dd-MM',\n    'd': 'd–d',\n    'y': 'dd-MM-y – dd-MM-y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kok_IN = exports.DateIntervalPatterns_kok;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ks = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'Gy'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd-MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ks_IN = exports.DateIntervalPatterns_ks;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ksb = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ksb_TZ = exports.DateIntervalPatterns_ksb;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ksf = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ksf_CM = exports.DateIntervalPatterns_ksf;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ksh = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    'y': 'MMM. y – MMM. y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'Y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'd': 'dd. – dd. MM.',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'd.–d. MMMM y',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd. MMM. y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'E y-MM-dd – E y-MM-dd',\n    '_': 'EEE d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Mdy': 'E y-MM-dd – E y-MM-dd',\n    '_': 'EEE d. MMM. y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ksh_DE = exports.DateIntervalPatterns_ksh;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ku = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ku_TR = exports.DateIntervalPatterns_ku;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kw = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_kw_GB = exports.DateIntervalPatterns_kw;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ky_KG = dateIntervalPatterns.DateIntervalPatterns_ky;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lag = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lag_TZ = exports.DateIntervalPatterns_lag;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lb = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM–MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'MM.y – MM.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd. MMM – d. MMM',\n    'd': 'd.–d. MMM',\n    'y': 'd. MMM y – d. MMM y',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.MM. – dd.MM.',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd. MMM – d. MMM y',\n    'd': 'd.–d. MMM y',\n    'y': 'd. MMM y – d. MMM y',\n    '_': 'd. MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d. MMM – E, d. MMM',\n    'd': 'E, d. – E, d. MMM',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE, d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, d. MMM – E, d. MMM y',\n    'd': 'E, d. – E, d. MMM y',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE, d. MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM. – dd.MM.',\n    'd': 'd.–d.',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lb_LU = exports.DateIntervalPatterns_lb;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lg = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lg_UG = exports.DateIntervalPatterns_lg;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lkt = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lkt_US = exports.DateIntervalPatterns_lkt;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ln_AO = dateIntervalPatterns.DateIntervalPatterns_ln;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ln_CD = dateIntervalPatterns.DateIntervalPatterns_ln;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ln_CF = dateIntervalPatterns.DateIntervalPatterns_ln;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ln_CG = dateIntervalPatterns.DateIntervalPatterns_ln;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lo_LA = dateIntervalPatterns.DateIntervalPatterns_lo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lrc = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lrc_IQ = exports.DateIntervalPatterns_lrc;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lrc_IR = exports.DateIntervalPatterns_lrc;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lt_LT = dateIntervalPatterns.DateIntervalPatterns_lt;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lu = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lu_CD = exports.DateIntervalPatterns_lu;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_luo = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_luo_KE = exports.DateIntervalPatterns_luo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_luy = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_luy_KE = exports.DateIntervalPatterns_luy;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_lv_LV = dateIntervalPatterns.DateIntervalPatterns_lv;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mas = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mas_KE = exports.DateIntervalPatterns_mas;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mas_TZ = exports.DateIntervalPatterns_mas;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mer = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mer_KE = exports.DateIntervalPatterns_mer;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mfe = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mfe_MU = exports.DateIntervalPatterns_mfe;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mg = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mg_MG = exports.DateIntervalPatterns_mg;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mgh = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mgh_MZ = exports.DateIntervalPatterns_mgh;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mgo = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mgo_CM = exports.DateIntervalPatterns_mgo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mi = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mi_NZ = exports.DateIntervalPatterns_mi;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mk_MK = dateIntervalPatterns.DateIntervalPatterns_mk;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ml_IN = dateIntervalPatterns.DateIntervalPatterns_ml;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mn_MN = dateIntervalPatterns.DateIntervalPatterns_mn;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mr_IN = dateIntervalPatterns.DateIntervalPatterns_mr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ms_BN = dateIntervalPatterns.DateIntervalPatterns_ms;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ms_MY = dateIntervalPatterns.DateIntervalPatterns_ms;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ms_SG = dateIntervalPatterns.DateIntervalPatterns_ms;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mt_MT = dateIntervalPatterns.DateIntervalPatterns_mt;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mua = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mua_CM = exports.DateIntervalPatterns_mua;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_my_MM = dateIntervalPatterns.DateIntervalPatterns_my;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mzn = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_mzn_IR = exports.DateIntervalPatterns_mzn;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_naq = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_naq_NA = exports.DateIntervalPatterns_naq;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nb_NO = dateIntervalPatterns.DateIntervalPatterns_nb;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nb_SJ = dateIntervalPatterns.DateIntervalPatterns_nb;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nd = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nd_ZW = exports.DateIntervalPatterns_nd;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nds = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nds_DE = exports.DateIntervalPatterns_nds;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nds_NL = exports.DateIntervalPatterns_nds;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ne_IN = dateIntervalPatterns.DateIntervalPatterns_ne;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ne_NP = dateIntervalPatterns.DateIntervalPatterns_ne;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nl_AW = dateIntervalPatterns.DateIntervalPatterns_nl;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nl_BE = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M-y GGGGG – M-y GGGGG',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/MM – d/MM',\n    'y': 'd/MM/y – d/MM/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM y G – E d MMM y G',\n    'M': 'E d MMM – E d MMM y',\n    'd': 'E d – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/MM – d/MM',\n    'd': 'd–d',\n    'y': 'd/MM/y – d/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nl_BQ = dateIntervalPatterns.DateIntervalPatterns_nl;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nl_CW = dateIntervalPatterns.DateIntervalPatterns_nl;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nl_NL = dateIntervalPatterns.DateIntervalPatterns_nl;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nl_SR = dateIntervalPatterns.DateIntervalPatterns_nl;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nl_SX = dateIntervalPatterns.DateIntervalPatterns_nl;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nmg = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nmg_CM = exports.DateIntervalPatterns_nmg;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nn = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM–MMMM y',\n    'y': 'MMMM y–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'MM.y–MM.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd. MMM–d. MMM',\n    'd': 'd.–d. MMM',\n    'y': 'd. MMM y–d. MMM y',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM–d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y–d. MMMM y',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.MM–dd.MM',\n    'y': 'dd.MM.y–dd.MM.y',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd. MMMM–d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y–d. MMMM y',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd. MMM–d. MMM y',\n    'd': 'd.–d. MMM y',\n    'y': 'd. MMM y–d. MMM y',\n    '_': 'd. MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d. MMM–E d. MMM',\n    'd': 'E d.–E d. MMM',\n    'y': 'E d. MMM y–E d. MMM y',\n    '_': 'EEE d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E d. MMM–E d. MMM y',\n    'd': 'E d.–E d. MMM y',\n    'y': 'E d. MMM y–E d. MMM y',\n    '_': 'EEE d. MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM–dd.MM',\n    'd': 'd.–d.',\n    'y': 'dd.MM.y–dd.MM.y',\n    '_': 'd.'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nn_NO = exports.DateIntervalPatterns_nn;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nnh = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': '\\'lyɛ\\'̌ʼ d \\'na\\' MMMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE , \\'lyɛ\\'̌ʼ d \\'na\\' MMM, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nnh_CM = exports.DateIntervalPatterns_nnh;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nus = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE، d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nus_SS = exports.DateIntervalPatterns_nus;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nyn = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_nyn_UG = exports.DateIntervalPatterns_nyn;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_om = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_om_ET = exports.DateIntervalPatterns_om;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_om_KE = exports.DateIntervalPatterns_om;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_or_IN = dateIntervalPatterns.DateIntervalPatterns_or;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_os = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'LLL y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'dd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y \\'аз\\''\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'ccc, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM – dd.MM',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_os_GE = exports.DateIntervalPatterns_os;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_os_RU = exports.DateIntervalPatterns_os;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_pa_Arab = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_pa_Arab_PK = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_pa_Guru = dateIntervalPatterns.DateIntervalPatterns_pa;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_pa_Guru_IN = dateIntervalPatterns.DateIntervalPatterns_pa;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_pl_PL = dateIntervalPatterns.DateIntervalPatterns_pl;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ps = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ps_AF = exports.DateIntervalPatterns_ps;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ps_PK = exports.DateIntervalPatterns_ps;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_pt_AO = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y – y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM \\'de\\' y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MM/y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM – MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y – MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM/y – GGGGG MM/y',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd–d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d \\'de\\' MMM y – G d \\'de\\' MMM y',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM/y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'ccc, dd/MM – ccc, dd/MM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E, d \\'de\\' MMM y – G E, d \\'de\\' MMM y',\n    'M': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'd': 'E, dd/MM – E, dd/MM/y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM/y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_pt_CH = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y – y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM \\'de\\' y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MM/y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM – MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y – MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM/y – GGGGG MM/y',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd–d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d \\'de\\' MMM y – G d \\'de\\' MMM y',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM/y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'ccc, dd/MM – ccc, dd/MM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E, d \\'de\\' MMM y – G E, d \\'de\\' MMM y',\n    'M': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'd': 'E, dd/MM – E, dd/MM/y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM/y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_pt_CV = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y – y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM \\'de\\' y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MM/y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM – MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y – MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM/y – GGGGG MM/y',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd–d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d \\'de\\' MMM y – G d \\'de\\' MMM y',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM/y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'ccc, dd/MM – ccc, dd/MM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E, d \\'de\\' MMM y – G E, d \\'de\\' MMM y',\n    'M': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'd': 'E, dd/MM – E, dd/MM/y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM/y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_pt_GQ = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y – y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM \\'de\\' y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MM/y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM – MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y – MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM/y – GGGGG MM/y',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd–d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d \\'de\\' MMM y – G d \\'de\\' MMM y',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM/y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'ccc, dd/MM – ccc, dd/MM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E, d \\'de\\' MMM y – G E, d \\'de\\' MMM y',\n    'M': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'd': 'E, dd/MM – E, dd/MM/y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM/y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_pt_GW = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y – y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM \\'de\\' y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MM/y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM – MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y – MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM/y – GGGGG MM/y',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd–d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d \\'de\\' MMM y – G d \\'de\\' MMM y',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM/y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'ccc, dd/MM – ccc, dd/MM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E, d \\'de\\' MMM y – G E, d \\'de\\' MMM y',\n    'M': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'd': 'E, dd/MM – E, dd/MM/y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM/y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_pt_LU = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y – y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM \\'de\\' y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MM/y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM – MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y – MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM/y – GGGGG MM/y',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd–d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d \\'de\\' MMM y – G d \\'de\\' MMM y',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM/y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'ccc, dd/MM – ccc, dd/MM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E, d \\'de\\' MMM y – G E, d \\'de\\' MMM y',\n    'M': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'd': 'E, dd/MM – E, dd/MM/y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM/y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_pt_MO = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y – y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM \\'de\\' y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MM/y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM – MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y – MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM/y – GGGGG MM/y',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd–d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d \\'de\\' MMM y – G d \\'de\\' MMM y',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM/y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'ccc, dd/MM – ccc, dd/MM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E, d \\'de\\' MMM y – G E, d \\'de\\' MMM y',\n    'M': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'd': 'E, dd/MM – E, dd/MM/y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM/y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_pt_MZ = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y – y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM \\'de\\' y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MM/y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM – MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y – MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM/y – GGGGG MM/y',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd–d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d \\'de\\' MMM y – G d \\'de\\' MMM y',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM/y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'ccc, dd/MM – ccc, dd/MM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E, d \\'de\\' MMM y – G E, d \\'de\\' MMM y',\n    'M': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'd': 'E, dd/MM – E, dd/MM/y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM/y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_pt_ST = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y – y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM \\'de\\' y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MM/y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM – MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y – MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM/y – GGGGG MM/y',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd–d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d \\'de\\' MMM y – G d \\'de\\' MMM y',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM/y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'ccc, dd/MM – ccc, dd/MM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E, d \\'de\\' MMM y – G E, d \\'de\\' MMM y',\n    'M': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'd': 'E, dd/MM – E, dd/MM/y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM/y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_pt_TL = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y – y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM \\'de\\' y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MM/y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM – MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y – MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM/y – GGGGG MM/y',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd–d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d \\'de\\' MMM y – G d \\'de\\' MMM y',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM/y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'ccc, dd/MM – ccc, dd/MM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E, d \\'de\\' MMM y – G E, d \\'de\\' MMM y',\n    'M': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'd': 'E, dd/MM – E, dd/MM/y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM/y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_qu = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM, y – d MMM, y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/M – d/M',\n    'y': 'd/M/y – d/M/y',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd – d MMM, y',\n    'y': 'd MMM, y – d MMM, y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, d MMM – E, d MMM, y',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'EEE, d MMM, y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_qu_BO = exports.DateIntervalPatterns_qu;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_qu_EC = exports.DateIntervalPatterns_qu;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_qu_PE = exports.DateIntervalPatterns_qu;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_rm = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_rm_CH = exports.DateIntervalPatterns_rm;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_rn = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_rn_BI = exports.DateIntervalPatterns_rn;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ro_MD = dateIntervalPatterns.DateIntervalPatterns_ro;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ro_RO = dateIntervalPatterns.DateIntervalPatterns_ro;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_rof = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_rof_TZ = exports.DateIntervalPatterns_rof;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ru_BY = dateIntervalPatterns.DateIntervalPatterns_ru;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ru_KG = dateIntervalPatterns.DateIntervalPatterns_ru;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ru_KZ = dateIntervalPatterns.DateIntervalPatterns_ru;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ru_MD = dateIntervalPatterns.DateIntervalPatterns_ru;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ru_RU = dateIntervalPatterns.DateIntervalPatterns_ru;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ru_UA = {\n  YEAR_FULL: {\n    'G': 'y \\'г\\'. G – y \\'г\\'. G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y–y \\'гг\\'. G',\n    '_': 'y \\'г\\'. G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'LLL y \\'г\\'. G – LLL y \\'г\\'. G',\n    'M': 'LLL – LLL y \\'г\\'.',\n    'y': 'LLL y – LLL y',\n    '_': 'LLL y \\'г\\'.'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'LLLL y \\'г\\'. G – LLLL y \\'г\\'. G',\n    'M': 'LLLL – LLLL y \\'г\\'.',\n    'y': 'LLLL y – LLLL y',\n    '_': 'LLLL y \\'г\\'.'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM.y G – MM.y G',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'dd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y \\'г\\'. G – d MMM y \\'г\\'. G',\n    'M': 'd MMM – d MMM y \\'г\\'.',\n    'd': 'd–d MMM y \\'г\\'.',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y \\'г\\'.'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'ccc, d MMM y – ccc, d MMM y',\n    '_': 'ccc, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'ccc, d MMM y \\'г\\'. G – ccc, d MMM y \\'г\\'. G',\n    'M': 'ccc, d MMM – ccc, d MMM y \\'г\\'.',\n    'd': 'ccc, d – ccc, d MMM y \\'г\\'.',\n    'y': 'ccc, d MMM y – ccc, d MMM y',\n    '_': 'EEE, d MMM y \\'г\\'.'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM – dd.MM',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_rw = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_rw_RW = exports.DateIntervalPatterns_rw;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_rwk = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_rwk_TZ = exports.DateIntervalPatterns_rwk;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sah = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y \\'с\\'. G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'MM.y – MM.y',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sah_RU = exports.DateIntervalPatterns_sah;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_saq = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_saq_KE = exports.DateIntervalPatterns_saq;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sbp = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sbp_TZ = exports.DateIntervalPatterns_sbp;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sd = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y – y G',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sd_PK = exports.DateIntervalPatterns_sd;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_se = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_se_FI = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'M.y–M.y',\n    'y': 'M.y – M.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM–d MMM',\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM–d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd.M.–d.M.',\n    'y': 'd.M.y – d.M.y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM–d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E d.MMM–E d.MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E d MMM – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd.M.–d.M.',\n    'd': 'd–d',\n    'y': 'd.M.y – d.M.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_se_NO = exports.DateIntervalPatterns_se;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_se_SE = exports.DateIntervalPatterns_se;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_seh = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd \\'de\\' MMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_seh_MZ = exports.DateIntervalPatterns_seh;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ses = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ses_ML = exports.DateIntervalPatterns_ses;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sg = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sg_CF = exports.DateIntervalPatterns_sg;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_shi = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_shi_Latn = exports.DateIntervalPatterns_shi;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_shi_Latn_MA = exports.DateIntervalPatterns_shi;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_shi_Tfng = exports.DateIntervalPatterns_shi;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_shi_Tfng_MA = exports.DateIntervalPatterns_shi;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_si_LK = dateIntervalPatterns.DateIntervalPatterns_si;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sk_SK = dateIntervalPatterns.DateIntervalPatterns_sk;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sl_SI = dateIntervalPatterns.DateIntervalPatterns_sl;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_smn = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'LLL–LLLL y',\n    'y': 'LLLL y – LLLL y',\n    '_': 'LLL y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'LLL–LLLL y',\n    'y': 'LLLL y – LLLL y',\n    '_': 'LLLL y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'LLL–LLLL y',\n    'y': 'LLLL y – LLLL y',\n    '_': 'LL.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d. – MMM d.',\n    'd': 'MMM d.–d.',\n    'y': 'MMMM d. y – MMMM d. y',\n    '_': 'MMM d.'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d. – MMMM d.',\n    'd': 'MMMM d.–d.',\n    'y': 'MMMM d. y – MMMM d. y',\n    '_': 'MMMM dd.'\n  },\n  MONTH_DAY_SHORT: {\n    'd': 'd.–d.M.',\n    'y': 'd.M.y–d.M.y',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d. – MMMM d.',\n    'd': 'MMMM d.–d.',\n    'y': 'MMMM d. y – MMMM d. y',\n    '_': 'MMMM d.'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'MMMM d. – MMMM d. y',\n    'd': 'MMMM d.–d. y',\n    'y': 'MMMM d. y – MMMM d. y',\n    '_': 'MMM d. y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'MMMM E d. – MMMM E d.',\n    'd': 'MMMM E d. – E d.',\n    'y': 'MMMM E d. y – MMMM E d. y',\n    '_': 'EEE, MMM d.'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'MMMM E d. – MMMM E d. y',\n    'd': 'MMMM E d. – E d. y',\n    'y': 'MMMM E d. y – MMMM E d. y',\n    '_': 'ccc, MMM d. y'\n  },\n  DAY_ABBR: {\n    'M': 'd.M.–d.M.',\n    'd': 'd.–d.',\n    'y': 'd.M.y–d.M.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_smn_FI = exports.DateIntervalPatterns_smn;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sn = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sn_ZW = exports.DateIntervalPatterns_sn;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_so = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'dd MMM – dd MMM',\n    'd': 'dd–dd MMM',\n    'y': 'dd MMM y – dd MMM y',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'dd MMMM – dd MMMM',\n    'd': 'dd–dd MMMM',\n    'y': 'dd MMMM y – dd MMMM y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'dd MMMM – dd MMMM',\n    'd': 'dd–dd MMMM',\n    'y': 'dd MMMM y – dd MMMM y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'dd MMM – dd MMM y',\n    'd': 'dd–dd MMM y',\n    'y': 'dd MMM y – dd MMM y',\n    '_': 'MMM d, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, dd MMM – E, dd MMM',\n    'd': 'E, MMM d – E, MMM d',\n    'y': 'E, MMM dd, y – E, MMM dd, y',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'Md': 'E, MMM dd – E, MMM dd, y',\n    'y': 'E, MMM dd, y – E, MMM dd, y',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_so_DJ = exports.DateIntervalPatterns_so;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_so_ET = exports.DateIntervalPatterns_so;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_so_KE = exports.DateIntervalPatterns_so;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_so_SO = exports.DateIntervalPatterns_so;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sq_AL = dateIntervalPatterns.DateIntervalPatterns_sq;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sq_MK = dateIntervalPatterns.DateIntervalPatterns_sq;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sq_XK = dateIntervalPatterns.DateIntervalPatterns_sq;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sr_Cyrl = dateIntervalPatterns.DateIntervalPatterns_sr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sr_Cyrl_BA = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y.'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y. G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y.',\n    '_': 'MMM y.'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y.',\n    '_': 'MMMM y.'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM.y.'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'dd. MMM – dd. MMM',\n    'd': 'dd.–dd. MMM',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'd': 'dd.–dd. MMMM',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'dd. MMMM – dd. MMMM',\n    'd': 'dd.–dd. MMMM',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'dd. MMM – dd. MMM y.',\n    'd': 'dd.–dd. MMM y.',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'd. MMM y.'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, dd. MMM – E, dd. MMM',\n    'd': 'E, dd. – E, dd. MMM',\n    'y': 'E, dd. MMM y. – E, dd. MMM y.',\n    '_': 'EEE d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, dd. MMM – E, dd. MMM y.',\n    'd': 'E, dd. – E, dd. MMM y.',\n    'y': 'E, dd. MMM y. – E, dd. MMM y.',\n    '_': 'EEE, d. MMM y.'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sr_Cyrl_ME = dateIntervalPatterns.DateIntervalPatterns_sr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sr_Cyrl_RS = dateIntervalPatterns.DateIntervalPatterns_sr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sr_Cyrl_XK = dateIntervalPatterns.DateIntervalPatterns_sr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sr_Latn_BA = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y.'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y. G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y.',\n    '_': 'MMM y.'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y.',\n    '_': 'MMMM y.'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM.y.'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'dd. MMM – dd. MMM',\n    'd': 'dd.–dd. MMM',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'd': 'dd.–dd. MMMM',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'dd. MMMM – dd. MMMM',\n    'd': 'dd.–dd. MMMM',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'dd. MMM – dd. MMM y.',\n    'd': 'dd.–dd. MMM y.',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'd. MMM y.'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, dd. MMM – E, dd. MMM',\n    'd': 'E, dd. – E, dd. MMM',\n    'y': 'E, dd. MMM y. – E, dd. MMM y.',\n    '_': 'EEE d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, dd. MMM – E, dd. MMM y.',\n    'd': 'E, dd. – E, dd. MMM y.',\n    'y': 'E, dd. MMM y. – E, dd. MMM y.',\n    '_': 'EEE, d. MMM y.'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sr_Latn_ME = dateIntervalPatterns.DateIntervalPatterns_sr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sr_Latn_RS = dateIntervalPatterns.DateIntervalPatterns_sr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sr_Latn_XK = dateIntervalPatterns.DateIntervalPatterns_sr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sv_AX = dateIntervalPatterns.DateIntervalPatterns_sv;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sv_FI = dateIntervalPatterns.DateIntervalPatterns_sv;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sv_SE = dateIntervalPatterns.DateIntervalPatterns_sv;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sw_CD = dateIntervalPatterns.DateIntervalPatterns_sw;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sw_KE = dateIntervalPatterns.DateIntervalPatterns_sw;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sw_TZ = dateIntervalPatterns.DateIntervalPatterns_sw;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_sw_UG = dateIntervalPatterns.DateIntervalPatterns_sw;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ta_IN = dateIntervalPatterns.DateIntervalPatterns_ta;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ta_LK = dateIntervalPatterns.DateIntervalPatterns_ta;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ta_MY = dateIntervalPatterns.DateIntervalPatterns_ta;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ta_SG = dateIntervalPatterns.DateIntervalPatterns_ta;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_te_IN = dateIntervalPatterns.DateIntervalPatterns_te;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_teo = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_teo_KE = exports.DateIntervalPatterns_teo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_teo_UG = exports.DateIntervalPatterns_teo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_tg = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'dd-MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, d MMM, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_tg_TJ = exports.DateIntervalPatterns_tg;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_th_TH = dateIntervalPatterns.DateIntervalPatterns_th;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ti = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ti_ER = exports.DateIntervalPatterns_ti;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ti_ET = exports.DateIntervalPatterns_ti;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_tk = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM–MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG M/y – GGGGG M/y',\n    'My': 'MM.y – MM.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.MM – dd.MM',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'dd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d MMM y – G d MMM y',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'd MMM E – d MMM E',\n    'y': 'd MMM y E – d MMM y E',\n    '_': 'd MMM EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d MMM y, E – G d MMM y, E',\n    'Mdy': 'd MMM y E – d MMM y E',\n    '_': 'd MMM y EEE'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM – dd.MM',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_tk_TM = exports.DateIntervalPatterns_tk;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_to = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E d MMM – E d MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E d MMM – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_to_TO = exports.DateIntervalPatterns_to;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_tr_CY = dateIntervalPatterns.DateIntervalPatterns_tr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_tr_TR = dateIntervalPatterns.DateIntervalPatterns_tr;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_tt = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'G y \\'ел\\''\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM, y \\'ел\\'',\n    'y': 'MMM, y \\'ел\\' - MMM, y \\'ел\\'',\n    '_': 'MMM, y \\'ел\\''\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM, y \\'ел\\'',\n    '_': 'MMMM, y \\'ел\\''\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM, y \\'ел\\' – d MMM, y \\'ел\\'',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM, y \\'ел\\' – d MMMM, y \\'ел\\'',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'dd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM, y \\'ел\\' – d MMMM, y \\'ел\\'',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y \\'ел\\'',\n    'd': 'd–d MMM, y \\'ел\\'',\n    '_': 'd MMM, y \\'ел\\''\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM, y \\'ел\\' – E, d MMM, y \\'ел\\'',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, d MMM – E, d MMM, y \\'ел\\'',\n    'y': 'E, d MMM, y \\'ел\\' – E, d MMM, y \\'ел\\'',\n    '_': 'EEE, d MMM, y \\'ел\\''\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM – dd.MM',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_tt_RU = exports.DateIntervalPatterns_tt;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_twq = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_twq_NE = exports.DateIntervalPatterns_twq;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_tzm = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_tzm_MA = exports.DateIntervalPatterns_tzm;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ug = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d – d',\n    'y': 'MMM d، y – MMM d، y',\n    '_': 'd-MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d – d',\n    'y': 'MMMM d، y – MMMM d، y',\n    '_': 'dd-MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'M/d – M/d',\n    'y': 'M/d/y – M/d/y',\n    '_': 'd-M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d – d',\n    'y': 'MMMM d، y – MMMM d، y',\n    '_': 'd-MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'MMM d – MMM d، y',\n    'd': 'MMM d – d، y',\n    'y': 'MMM d، y – MMM d، y',\n    '_': 'y d-MMM'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E، MMM d – E، MMM d',\n    'y': 'E، MMM d، y – E، MMM d، y',\n    '_': 'd-MMM، EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E، MMM d – E، MMM d، y',\n    'y': 'E، MMM d، y – E، MMM d، y',\n    '_': 'y d-MMM، EEE'\n  },\n  DAY_ABBR: {\n    'M': 'M/d – M/d',\n    'y': 'M/d/y – M/d/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ug_CN = exports.DateIntervalPatterns_ug;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_uk_UA = dateIntervalPatterns.DateIntervalPatterns_uk;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ur_IN = dateIntervalPatterns.DateIntervalPatterns_ur;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_ur_PK = dateIntervalPatterns.DateIntervalPatterns_ur;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_uz_Arab = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_uz_Arab_AF = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_uz_Cyrl = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM, y',\n    '_': 'MMM, y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM, y',\n    '_': 'MMMM, y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM, y – d MMM, y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd – d MMM, y',\n    '_': 'd MMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, d MMM – E, d MMM, y',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'EEE, d-MMM, y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_uz_Cyrl_UZ = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM, y',\n    '_': 'MMM, y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM, y',\n    '_': 'MMMM, y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM, y – d MMM, y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd – d MMM, y',\n    '_': 'd MMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, d MMM – E, d MMM, y',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'EEE, d-MMM, y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_uz_Latn = dateIntervalPatterns.DateIntervalPatterns_uz;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_uz_Latn_UZ = dateIntervalPatterns.DateIntervalPatterns_uz;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_vai = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_vai_Latn = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_vai_Latn_LR = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_vai_Vaii = exports.DateIntervalPatterns_vai;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_vai_Vaii_LR = exports.DateIntervalPatterns_vai;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_vi_VN = dateIntervalPatterns.DateIntervalPatterns_vi;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_vun = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_vun_TZ = exports.DateIntervalPatterns_vun;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_wae = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y – y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'Md': 'd. – d. MMM',\n    'y': 'd. MMM y – d. MMM y',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'Md': 'd. – d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd. MMM – d. MMM',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'Md': 'd. – d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd. MMM – d. MMM y',\n    'd': 'd. – d. MMM y',\n    'y': 'd. MMM y – d. MMM y',\n    '_': 'd. MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d. MMM – E, d. MMM',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE, d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, d. MMM – E, d. MMM y',\n    'd': 'E, d. – E, d. MMM y',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE, d. MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd. MMM – d. MMM',\n    'd': 'd – d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_wae_CH = exports.DateIntervalPatterns_wae;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_wo = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'dd-MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_wo_SN = exports.DateIntervalPatterns_wo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_xh = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_xh_ZA = exports.DateIntervalPatterns_xh;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_xog = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_xog_UG = exports.DateIntervalPatterns_xog;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_yav = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_yav_CM = exports.DateIntervalPatterns_yav;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_yi = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM–MMMM y',\n    'y': 'MMMM y–MMMM y',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dטן MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'EEEE d MMM – EEEE d MMM',\n    'y': 'EEEE d MMM y – EEEE d MMM y',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'EEEE d MMM – EEEE d MMM y',\n    'y': 'EEEE d MMM y – EEEE d MMM y',\n    '_': 'EEE, dטן MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_yi_001 = exports.DateIntervalPatterns_yi;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_yo = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM–MMMM y',\n    'y': 'MMMM – y MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'MM-y – MM-y',\n    'y': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'MMM d – MMM d y',\n    'd': 'MMM d–d y',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d y, E – MMM d, E y',\n    '_': 'd MMM, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'MMM d, E – MMM d, E y',\n    'y': 'y MMM d y, E – MMM d, E y',\n    '_': 'EEE, d MMM , y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_yo_BJ = exports.DateIntervalPatterns_yo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_yo_NG = exports.DateIntervalPatterns_yo;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_yue = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y至y',\n    '_': 'y年'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'Gy年'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y年M月至M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y年M月至M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y/M至y/M',\n    '_': 'y/MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月dd日'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y/M/d至y/M/d',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y年M月d日至M月d日',\n    'd': 'y年M月d日至d日',\n    '_': 'y年M月d日'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'M月d日E至M月d日E',\n    'd': 'M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'M月d日 EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'y年M月d日E至M月d日E',\n    'd': 'y年M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'y年M月d日 EEE'\n  },\n  DAY_ABBR: {\n    'M': 'M/d至M/d',\n    'y': 'y/M/d至y/M/d',\n    '_': 'd日'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_yue_Hans = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y年',\n    '_': 'y年'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'Gy年'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月dd日'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y/M/d – y/M/d',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y年M月d日至M月d日',\n    'd': 'y年M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'y年M月d日'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'M月d日E至M月d日E',\n    'd': 'M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'M月d日EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'y年M月d日E至M月d日E',\n    'd': 'y年M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'y年M月d日EEE'\n  },\n  DAY_ABBR: {\n    'M': 'M/d – M/d',\n    'd': 'd–d日',\n    'y': 'y/M/d – y/M/d',\n    '_': 'd日'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_yue_Hans_CN = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y年',\n    '_': 'y年'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'Gy年'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月dd日'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y/M/d – y/M/d',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y年M月d日至M月d日',\n    'd': 'y年M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'y年M月d日'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'M月d日E至M月d日E',\n    'd': 'M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'M月d日EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'y年M月d日E至M月d日E',\n    'd': 'y年M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'y年M月d日EEE'\n  },\n  DAY_ABBR: {\n    'M': 'M/d – M/d',\n    'd': 'd–d日',\n    'y': 'y/M/d – y/M/d',\n    '_': 'd日'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_yue_Hant = exports.DateIntervalPatterns_yue;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_yue_Hant_HK = exports.DateIntervalPatterns_yue;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_zgh = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_zgh_MA = exports.DateIntervalPatterns_zgh;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_zh_Hans = dateIntervalPatterns.DateIntervalPatterns_zh;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_zh_Hans_CN = dateIntervalPatterns.DateIntervalPatterns_zh;\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_zh_Hans_HK = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y年',\n    '_': 'y年'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'Gy年'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y年M月至y年M月',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'M/d – M/d',\n    'y': 'd/M/y至d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y年M月d日至M月d日',\n    'd': 'y年M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'y年M月d日'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'M月d日E至M月d日E',\n    'd': 'M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'M月d日EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y年M月d日E至M月d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'y年M月d日EEE'\n  },\n  DAY_ABBR: {\n    'M': 'M/d – M/d',\n    'd': 'd–d日',\n    'y': 'd/M/y至d/M/y',\n    '_': 'd日'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_zh_Hans_MO = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y年',\n    '_': 'y年'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'Gy年'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'M-d至M-d',\n    'y': 'd/M/y至d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y年M月d日至M月d日',\n    'd': 'y年M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'y年M月d日'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'M月d日E至M月d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'M月d日EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y年M月d日E至M月d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'y年M月d日EEE'\n  },\n  DAY_ABBR: {\n    'M': 'M-d至M-d',\n    'd': 'd日至d日',\n    'y': 'd/M/y至d/M/y',\n    '_': 'd日'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_zh_Hans_SG = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y年',\n    '_': 'y年'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'Gy年'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y年M月至M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y年M月至M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y年M月'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_FULL: {\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y至d/M/y',\n    '_': 'M-d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y年M月d日至M月d日',\n    'd': 'y年M月d日至d日',\n    '_': 'y年M月d日'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'M月d日E至M月d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'M月d日EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'y年M月d日E至M月d日E',\n    'd': 'y年M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'y年M月d日EEE'\n  },\n  DAY_ABBR: {\n    'M': 'M-d至M-d',\n    'y': 'd/M/y至d/M/y',\n    '_': 'd日'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_zh_Hant = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y至y',\n    '_': 'y年'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'Gy年'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y/M至y/M',\n    '_': 'y/MM'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月dd日'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'M/d至M/d',\n    'y': 'y/M/d至y/M/d',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y年M月d日至M月d日',\n    'd': 'y年M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'y年M月d日'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'M月d日E至M月d日E',\n    'd': 'M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'M月d日 EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y年M月d日E至M月d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'y年M月d日 EEE'\n  },\n  DAY_ABBR: {\n    'M': 'M/d至M/d',\n    'd': 'd日至d日',\n    'y': 'y/M/d至y/M/d',\n    '_': 'd日'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_zh_Hant_HK = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y至y',\n    '_': 'y年'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'Gy年'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y 至 M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月dd日'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/M 至 d/M',\n    'y': 'd/M/y 至 d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y年M月d日至M月d日',\n    'd': 'y年M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'y年M月d日'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'M月d日E至M月d日E',\n    'd': 'M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'M月d日EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y年M月d日E至M月d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'y年M月d日EEE'\n  },\n  DAY_ABBR: {\n    'M': 'd/M 至 d/M',\n    'd': 'd日至d日',\n    'y': 'd/M/y 至 d/M/y',\n    '_': 'd日'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_zh_Hant_MO = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y至y',\n    '_': 'y年'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'Gy年'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y 至 M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月dd日'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/M 至 d/M',\n    'y': 'd/M/y 至 d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y年M月d日至M月d日',\n    'd': 'y年M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'y年M月d日'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'M月d日E至M月d日E',\n    'd': 'M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'M月d日EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y年M月d日E至M月d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'y年M月d日EEE'\n  },\n  DAY_ABBR: {\n    'M': 'd/M 至 d/M',\n    'd': 'd日至d日',\n    'y': 'd/M/y 至 d/M/y',\n    '_': 'd日'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_zh_Hant_TW = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y至y',\n    '_': 'y年'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'Gy年'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y/M至y/M',\n    '_': 'y/MM'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月dd日'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'M/d至M/d',\n    'y': 'y/M/d至y/M/d',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y年M月d日至M月d日',\n    'd': 'y年M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'y年M月d日'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'M月d日E至M月d日E',\n    'd': 'M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'M月d日 EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y年M月d日E至M月d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'y年M月d日 EEE'\n  },\n  DAY_ABBR: {\n    'M': 'M/d至M/d',\n    'd': 'd日至d日',\n    'y': 'y/M/d至y/M/d',\n    '_': 'd日'\n  }\n};\n\n/** @const {!dateIntervalPatterns.DateIntervalPatterns} */\nexports.DateIntervalPatterns_zu_ZA = dateIntervalPatterns.DateIntervalPatterns_zu;\n\nswitch (goog.LOCALE) {\n  case 'af_NA':\n  case 'af-NA':\n    defaultPatterns = exports.DateIntervalPatterns_af_NA;\n    break;\n  case 'af_ZA':\n  case 'af-ZA':\n    defaultPatterns = exports.DateIntervalPatterns_af_ZA;\n    break;\n  case 'agq':\n    defaultPatterns = exports.DateIntervalPatterns_agq;\n    break;\n  case 'agq_CM':\n  case 'agq-CM':\n    defaultPatterns = exports.DateIntervalPatterns_agq_CM;\n    break;\n  case 'ak':\n    defaultPatterns = exports.DateIntervalPatterns_ak;\n    break;\n  case 'ak_GH':\n  case 'ak-GH':\n    defaultPatterns = exports.DateIntervalPatterns_ak_GH;\n    break;\n  case 'am_ET':\n  case 'am-ET':\n    defaultPatterns = exports.DateIntervalPatterns_am_ET;\n    break;\n  case 'ar_001':\n  case 'ar-001':\n    defaultPatterns = exports.DateIntervalPatterns_ar_001;\n    break;\n  case 'ar_AE':\n  case 'ar-AE':\n    defaultPatterns = exports.DateIntervalPatterns_ar_AE;\n    break;\n  case 'ar_BH':\n  case 'ar-BH':\n    defaultPatterns = exports.DateIntervalPatterns_ar_BH;\n    break;\n  case 'ar_DJ':\n  case 'ar-DJ':\n    defaultPatterns = exports.DateIntervalPatterns_ar_DJ;\n    break;\n  case 'ar_EH':\n  case 'ar-EH':\n    defaultPatterns = exports.DateIntervalPatterns_ar_EH;\n    break;\n  case 'ar_ER':\n  case 'ar-ER':\n    defaultPatterns = exports.DateIntervalPatterns_ar_ER;\n    break;\n  case 'ar_IL':\n  case 'ar-IL':\n    defaultPatterns = exports.DateIntervalPatterns_ar_IL;\n    break;\n  case 'ar_IQ':\n  case 'ar-IQ':\n    defaultPatterns = exports.DateIntervalPatterns_ar_IQ;\n    break;\n  case 'ar_JO':\n  case 'ar-JO':\n    defaultPatterns = exports.DateIntervalPatterns_ar_JO;\n    break;\n  case 'ar_KM':\n  case 'ar-KM':\n    defaultPatterns = exports.DateIntervalPatterns_ar_KM;\n    break;\n  case 'ar_KW':\n  case 'ar-KW':\n    defaultPatterns = exports.DateIntervalPatterns_ar_KW;\n    break;\n  case 'ar_LB':\n  case 'ar-LB':\n    defaultPatterns = exports.DateIntervalPatterns_ar_LB;\n    break;\n  case 'ar_LY':\n  case 'ar-LY':\n    defaultPatterns = exports.DateIntervalPatterns_ar_LY;\n    break;\n  case 'ar_MA':\n  case 'ar-MA':\n    defaultPatterns = exports.DateIntervalPatterns_ar_MA;\n    break;\n  case 'ar_MR':\n  case 'ar-MR':\n    defaultPatterns = exports.DateIntervalPatterns_ar_MR;\n    break;\n  case 'ar_OM':\n  case 'ar-OM':\n    defaultPatterns = exports.DateIntervalPatterns_ar_OM;\n    break;\n  case 'ar_PS':\n  case 'ar-PS':\n    defaultPatterns = exports.DateIntervalPatterns_ar_PS;\n    break;\n  case 'ar_QA':\n  case 'ar-QA':\n    defaultPatterns = exports.DateIntervalPatterns_ar_QA;\n    break;\n  case 'ar_SA':\n  case 'ar-SA':\n    defaultPatterns = exports.DateIntervalPatterns_ar_SA;\n    break;\n  case 'ar_SD':\n  case 'ar-SD':\n    defaultPatterns = exports.DateIntervalPatterns_ar_SD;\n    break;\n  case 'ar_SO':\n  case 'ar-SO':\n    defaultPatterns = exports.DateIntervalPatterns_ar_SO;\n    break;\n  case 'ar_SS':\n  case 'ar-SS':\n    defaultPatterns = exports.DateIntervalPatterns_ar_SS;\n    break;\n  case 'ar_SY':\n  case 'ar-SY':\n    defaultPatterns = exports.DateIntervalPatterns_ar_SY;\n    break;\n  case 'ar_TD':\n  case 'ar-TD':\n    defaultPatterns = exports.DateIntervalPatterns_ar_TD;\n    break;\n  case 'ar_TN':\n  case 'ar-TN':\n    defaultPatterns = exports.DateIntervalPatterns_ar_TN;\n    break;\n  case 'ar_XB':\n  case 'ar-XB':\n    defaultPatterns = exports.DateIntervalPatterns_ar_XB;\n    break;\n  case 'ar_YE':\n  case 'ar-YE':\n    defaultPatterns = exports.DateIntervalPatterns_ar_YE;\n    break;\n  case 'as':\n    defaultPatterns = exports.DateIntervalPatterns_as;\n    break;\n  case 'as_IN':\n  case 'as-IN':\n    defaultPatterns = exports.DateIntervalPatterns_as_IN;\n    break;\n  case 'asa':\n    defaultPatterns = exports.DateIntervalPatterns_asa;\n    break;\n  case 'asa_TZ':\n  case 'asa-TZ':\n    defaultPatterns = exports.DateIntervalPatterns_asa_TZ;\n    break;\n  case 'ast':\n    defaultPatterns = exports.DateIntervalPatterns_ast;\n    break;\n  case 'ast_ES':\n  case 'ast-ES':\n    defaultPatterns = exports.DateIntervalPatterns_ast_ES;\n    break;\n  case 'az_Cyrl':\n  case 'az-Cyrl':\n    defaultPatterns = exports.DateIntervalPatterns_az_Cyrl;\n    break;\n  case 'az_Cyrl_AZ':\n  case 'az-Cyrl-AZ':\n    defaultPatterns = exports.DateIntervalPatterns_az_Cyrl_AZ;\n    break;\n  case 'az_Latn':\n  case 'az-Latn':\n    defaultPatterns = exports.DateIntervalPatterns_az_Latn;\n    break;\n  case 'az_Latn_AZ':\n  case 'az-Latn-AZ':\n    defaultPatterns = exports.DateIntervalPatterns_az_Latn_AZ;\n    break;\n  case 'bas':\n    defaultPatterns = exports.DateIntervalPatterns_bas;\n    break;\n  case 'bas_CM':\n  case 'bas-CM':\n    defaultPatterns = exports.DateIntervalPatterns_bas_CM;\n    break;\n  case 'be_BY':\n  case 'be-BY':\n    defaultPatterns = exports.DateIntervalPatterns_be_BY;\n    break;\n  case 'bem':\n    defaultPatterns = exports.DateIntervalPatterns_bem;\n    break;\n  case 'bem_ZM':\n  case 'bem-ZM':\n    defaultPatterns = exports.DateIntervalPatterns_bem_ZM;\n    break;\n  case 'bez':\n    defaultPatterns = exports.DateIntervalPatterns_bez;\n    break;\n  case 'bez_TZ':\n  case 'bez-TZ':\n    defaultPatterns = exports.DateIntervalPatterns_bez_TZ;\n    break;\n  case 'bg_BG':\n  case 'bg-BG':\n    defaultPatterns = exports.DateIntervalPatterns_bg_BG;\n    break;\n  case 'bm':\n    defaultPatterns = exports.DateIntervalPatterns_bm;\n    break;\n  case 'bm_ML':\n  case 'bm-ML':\n    defaultPatterns = exports.DateIntervalPatterns_bm_ML;\n    break;\n  case 'bn_BD':\n  case 'bn-BD':\n    defaultPatterns = exports.DateIntervalPatterns_bn_BD;\n    break;\n  case 'bn_IN':\n  case 'bn-IN':\n    defaultPatterns = exports.DateIntervalPatterns_bn_IN;\n    break;\n  case 'bo':\n    defaultPatterns = exports.DateIntervalPatterns_bo;\n    break;\n  case 'bo_CN':\n  case 'bo-CN':\n    defaultPatterns = exports.DateIntervalPatterns_bo_CN;\n    break;\n  case 'bo_IN':\n  case 'bo-IN':\n    defaultPatterns = exports.DateIntervalPatterns_bo_IN;\n    break;\n  case 'br_FR':\n  case 'br-FR':\n    defaultPatterns = exports.DateIntervalPatterns_br_FR;\n    break;\n  case 'brx':\n    defaultPatterns = exports.DateIntervalPatterns_brx;\n    break;\n  case 'brx_IN':\n  case 'brx-IN':\n    defaultPatterns = exports.DateIntervalPatterns_brx_IN;\n    break;\n  case 'bs_Cyrl':\n  case 'bs-Cyrl':\n    defaultPatterns = exports.DateIntervalPatterns_bs_Cyrl;\n    break;\n  case 'bs_Cyrl_BA':\n  case 'bs-Cyrl-BA':\n    defaultPatterns = exports.DateIntervalPatterns_bs_Cyrl_BA;\n    break;\n  case 'bs_Latn':\n  case 'bs-Latn':\n    defaultPatterns = exports.DateIntervalPatterns_bs_Latn;\n    break;\n  case 'bs_Latn_BA':\n  case 'bs-Latn-BA':\n    defaultPatterns = exports.DateIntervalPatterns_bs_Latn_BA;\n    break;\n  case 'ca_AD':\n  case 'ca-AD':\n    defaultPatterns = exports.DateIntervalPatterns_ca_AD;\n    break;\n  case 'ca_ES':\n  case 'ca-ES':\n    defaultPatterns = exports.DateIntervalPatterns_ca_ES;\n    break;\n  case 'ca_FR':\n  case 'ca-FR':\n    defaultPatterns = exports.DateIntervalPatterns_ca_FR;\n    break;\n  case 'ca_IT':\n  case 'ca-IT':\n    defaultPatterns = exports.DateIntervalPatterns_ca_IT;\n    break;\n  case 'ccp':\n    defaultPatterns = exports.DateIntervalPatterns_ccp;\n    break;\n  case 'ccp_BD':\n  case 'ccp-BD':\n    defaultPatterns = exports.DateIntervalPatterns_ccp_BD;\n    break;\n  case 'ccp_IN':\n  case 'ccp-IN':\n    defaultPatterns = exports.DateIntervalPatterns_ccp_IN;\n    break;\n  case 'ce':\n    defaultPatterns = exports.DateIntervalPatterns_ce;\n    break;\n  case 'ce_RU':\n  case 'ce-RU':\n    defaultPatterns = exports.DateIntervalPatterns_ce_RU;\n    break;\n  case 'ceb':\n    defaultPatterns = exports.DateIntervalPatterns_ceb;\n    break;\n  case 'ceb_PH':\n  case 'ceb-PH':\n    defaultPatterns = exports.DateIntervalPatterns_ceb_PH;\n    break;\n  case 'cgg':\n    defaultPatterns = exports.DateIntervalPatterns_cgg;\n    break;\n  case 'cgg_UG':\n  case 'cgg-UG':\n    defaultPatterns = exports.DateIntervalPatterns_cgg_UG;\n    break;\n  case 'chr_US':\n  case 'chr-US':\n    defaultPatterns = exports.DateIntervalPatterns_chr_US;\n    break;\n  case 'ckb':\n    defaultPatterns = exports.DateIntervalPatterns_ckb;\n    break;\n  case 'ckb_IQ':\n  case 'ckb-IQ':\n    defaultPatterns = exports.DateIntervalPatterns_ckb_IQ;\n    break;\n  case 'ckb_IR':\n  case 'ckb-IR':\n    defaultPatterns = exports.DateIntervalPatterns_ckb_IR;\n    break;\n  case 'cs_CZ':\n  case 'cs-CZ':\n    defaultPatterns = exports.DateIntervalPatterns_cs_CZ;\n    break;\n  case 'cy_GB':\n  case 'cy-GB':\n    defaultPatterns = exports.DateIntervalPatterns_cy_GB;\n    break;\n  case 'da_DK':\n  case 'da-DK':\n    defaultPatterns = exports.DateIntervalPatterns_da_DK;\n    break;\n  case 'da_GL':\n  case 'da-GL':\n    defaultPatterns = exports.DateIntervalPatterns_da_GL;\n    break;\n  case 'dav':\n    defaultPatterns = exports.DateIntervalPatterns_dav;\n    break;\n  case 'dav_KE':\n  case 'dav-KE':\n    defaultPatterns = exports.DateIntervalPatterns_dav_KE;\n    break;\n  case 'de_BE':\n  case 'de-BE':\n    defaultPatterns = exports.DateIntervalPatterns_de_BE;\n    break;\n  case 'de_DE':\n  case 'de-DE':\n    defaultPatterns = exports.DateIntervalPatterns_de_DE;\n    break;\n  case 'de_IT':\n  case 'de-IT':\n    defaultPatterns = exports.DateIntervalPatterns_de_IT;\n    break;\n  case 'de_LI':\n  case 'de-LI':\n    defaultPatterns = exports.DateIntervalPatterns_de_LI;\n    break;\n  case 'de_LU':\n  case 'de-LU':\n    defaultPatterns = exports.DateIntervalPatterns_de_LU;\n    break;\n  case 'dje':\n    defaultPatterns = exports.DateIntervalPatterns_dje;\n    break;\n  case 'dje_NE':\n  case 'dje-NE':\n    defaultPatterns = exports.DateIntervalPatterns_dje_NE;\n    break;\n  case 'dsb':\n    defaultPatterns = exports.DateIntervalPatterns_dsb;\n    break;\n  case 'dsb_DE':\n  case 'dsb-DE':\n    defaultPatterns = exports.DateIntervalPatterns_dsb_DE;\n    break;\n  case 'dua':\n    defaultPatterns = exports.DateIntervalPatterns_dua;\n    break;\n  case 'dua_CM':\n  case 'dua-CM':\n    defaultPatterns = exports.DateIntervalPatterns_dua_CM;\n    break;\n  case 'dyo':\n    defaultPatterns = exports.DateIntervalPatterns_dyo;\n    break;\n  case 'dyo_SN':\n  case 'dyo-SN':\n    defaultPatterns = exports.DateIntervalPatterns_dyo_SN;\n    break;\n  case 'dz':\n    defaultPatterns = exports.DateIntervalPatterns_dz;\n    break;\n  case 'dz_BT':\n  case 'dz-BT':\n    defaultPatterns = exports.DateIntervalPatterns_dz_BT;\n    break;\n  case 'ebu':\n    defaultPatterns = exports.DateIntervalPatterns_ebu;\n    break;\n  case 'ebu_KE':\n  case 'ebu-KE':\n    defaultPatterns = exports.DateIntervalPatterns_ebu_KE;\n    break;\n  case 'ee':\n    defaultPatterns = exports.DateIntervalPatterns_ee;\n    break;\n  case 'ee_GH':\n  case 'ee-GH':\n    defaultPatterns = exports.DateIntervalPatterns_ee_GH;\n    break;\n  case 'ee_TG':\n  case 'ee-TG':\n    defaultPatterns = exports.DateIntervalPatterns_ee_TG;\n    break;\n  case 'el_CY':\n  case 'el-CY':\n    defaultPatterns = exports.DateIntervalPatterns_el_CY;\n    break;\n  case 'el_GR':\n  case 'el-GR':\n    defaultPatterns = exports.DateIntervalPatterns_el_GR;\n    break;\n  case 'en_001':\n  case 'en-001':\n    defaultPatterns = exports.DateIntervalPatterns_en_001;\n    break;\n  case 'en_150':\n  case 'en-150':\n    defaultPatterns = exports.DateIntervalPatterns_en_150;\n    break;\n  case 'en_AE':\n  case 'en-AE':\n    defaultPatterns = exports.DateIntervalPatterns_en_AE;\n    break;\n  case 'en_AG':\n  case 'en-AG':\n    defaultPatterns = exports.DateIntervalPatterns_en_AG;\n    break;\n  case 'en_AI':\n  case 'en-AI':\n    defaultPatterns = exports.DateIntervalPatterns_en_AI;\n    break;\n  case 'en_AS':\n  case 'en-AS':\n    defaultPatterns = exports.DateIntervalPatterns_en_AS;\n    break;\n  case 'en_AT':\n  case 'en-AT':\n    defaultPatterns = exports.DateIntervalPatterns_en_AT;\n    break;\n  case 'en_BB':\n  case 'en-BB':\n    defaultPatterns = exports.DateIntervalPatterns_en_BB;\n    break;\n  case 'en_BE':\n  case 'en-BE':\n    defaultPatterns = exports.DateIntervalPatterns_en_BE;\n    break;\n  case 'en_BI':\n  case 'en-BI':\n    defaultPatterns = exports.DateIntervalPatterns_en_BI;\n    break;\n  case 'en_BM':\n  case 'en-BM':\n    defaultPatterns = exports.DateIntervalPatterns_en_BM;\n    break;\n  case 'en_BS':\n  case 'en-BS':\n    defaultPatterns = exports.DateIntervalPatterns_en_BS;\n    break;\n  case 'en_BW':\n  case 'en-BW':\n    defaultPatterns = exports.DateIntervalPatterns_en_BW;\n    break;\n  case 'en_BZ':\n  case 'en-BZ':\n    defaultPatterns = exports.DateIntervalPatterns_en_BZ;\n    break;\n  case 'en_CC':\n  case 'en-CC':\n    defaultPatterns = exports.DateIntervalPatterns_en_CC;\n    break;\n  case 'en_CH':\n  case 'en-CH':\n    defaultPatterns = exports.DateIntervalPatterns_en_CH;\n    break;\n  case 'en_CK':\n  case 'en-CK':\n    defaultPatterns = exports.DateIntervalPatterns_en_CK;\n    break;\n  case 'en_CM':\n  case 'en-CM':\n    defaultPatterns = exports.DateIntervalPatterns_en_CM;\n    break;\n  case 'en_CX':\n  case 'en-CX':\n    defaultPatterns = exports.DateIntervalPatterns_en_CX;\n    break;\n  case 'en_CY':\n  case 'en-CY':\n    defaultPatterns = exports.DateIntervalPatterns_en_CY;\n    break;\n  case 'en_DE':\n  case 'en-DE':\n    defaultPatterns = exports.DateIntervalPatterns_en_DE;\n    break;\n  case 'en_DG':\n  case 'en-DG':\n    defaultPatterns = exports.DateIntervalPatterns_en_DG;\n    break;\n  case 'en_DK':\n  case 'en-DK':\n    defaultPatterns = exports.DateIntervalPatterns_en_DK;\n    break;\n  case 'en_DM':\n  case 'en-DM':\n    defaultPatterns = exports.DateIntervalPatterns_en_DM;\n    break;\n  case 'en_ER':\n  case 'en-ER':\n    defaultPatterns = exports.DateIntervalPatterns_en_ER;\n    break;\n  case 'en_FI':\n  case 'en-FI':\n    defaultPatterns = exports.DateIntervalPatterns_en_FI;\n    break;\n  case 'en_FJ':\n  case 'en-FJ':\n    defaultPatterns = exports.DateIntervalPatterns_en_FJ;\n    break;\n  case 'en_FK':\n  case 'en-FK':\n    defaultPatterns = exports.DateIntervalPatterns_en_FK;\n    break;\n  case 'en_FM':\n  case 'en-FM':\n    defaultPatterns = exports.DateIntervalPatterns_en_FM;\n    break;\n  case 'en_GD':\n  case 'en-GD':\n    defaultPatterns = exports.DateIntervalPatterns_en_GD;\n    break;\n  case 'en_GG':\n  case 'en-GG':\n    defaultPatterns = exports.DateIntervalPatterns_en_GG;\n    break;\n  case 'en_GH':\n  case 'en-GH':\n    defaultPatterns = exports.DateIntervalPatterns_en_GH;\n    break;\n  case 'en_GI':\n  case 'en-GI':\n    defaultPatterns = exports.DateIntervalPatterns_en_GI;\n    break;\n  case 'en_GM':\n  case 'en-GM':\n    defaultPatterns = exports.DateIntervalPatterns_en_GM;\n    break;\n  case 'en_GU':\n  case 'en-GU':\n    defaultPatterns = exports.DateIntervalPatterns_en_GU;\n    break;\n  case 'en_GY':\n  case 'en-GY':\n    defaultPatterns = exports.DateIntervalPatterns_en_GY;\n    break;\n  case 'en_HK':\n  case 'en-HK':\n    defaultPatterns = exports.DateIntervalPatterns_en_HK;\n    break;\n  case 'en_IL':\n  case 'en-IL':\n    defaultPatterns = exports.DateIntervalPatterns_en_IL;\n    break;\n  case 'en_IM':\n  case 'en-IM':\n    defaultPatterns = exports.DateIntervalPatterns_en_IM;\n    break;\n  case 'en_IO':\n  case 'en-IO':\n    defaultPatterns = exports.DateIntervalPatterns_en_IO;\n    break;\n  case 'en_JE':\n  case 'en-JE':\n    defaultPatterns = exports.DateIntervalPatterns_en_JE;\n    break;\n  case 'en_JM':\n  case 'en-JM':\n    defaultPatterns = exports.DateIntervalPatterns_en_JM;\n    break;\n  case 'en_KE':\n  case 'en-KE':\n    defaultPatterns = exports.DateIntervalPatterns_en_KE;\n    break;\n  case 'en_KI':\n  case 'en-KI':\n    defaultPatterns = exports.DateIntervalPatterns_en_KI;\n    break;\n  case 'en_KN':\n  case 'en-KN':\n    defaultPatterns = exports.DateIntervalPatterns_en_KN;\n    break;\n  case 'en_KY':\n  case 'en-KY':\n    defaultPatterns = exports.DateIntervalPatterns_en_KY;\n    break;\n  case 'en_LC':\n  case 'en-LC':\n    defaultPatterns = exports.DateIntervalPatterns_en_LC;\n    break;\n  case 'en_LR':\n  case 'en-LR':\n    defaultPatterns = exports.DateIntervalPatterns_en_LR;\n    break;\n  case 'en_LS':\n  case 'en-LS':\n    defaultPatterns = exports.DateIntervalPatterns_en_LS;\n    break;\n  case 'en_MG':\n  case 'en-MG':\n    defaultPatterns = exports.DateIntervalPatterns_en_MG;\n    break;\n  case 'en_MH':\n  case 'en-MH':\n    defaultPatterns = exports.DateIntervalPatterns_en_MH;\n    break;\n  case 'en_MO':\n  case 'en-MO':\n    defaultPatterns = exports.DateIntervalPatterns_en_MO;\n    break;\n  case 'en_MP':\n  case 'en-MP':\n    defaultPatterns = exports.DateIntervalPatterns_en_MP;\n    break;\n  case 'en_MS':\n  case 'en-MS':\n    defaultPatterns = exports.DateIntervalPatterns_en_MS;\n    break;\n  case 'en_MT':\n  case 'en-MT':\n    defaultPatterns = exports.DateIntervalPatterns_en_MT;\n    break;\n  case 'en_MU':\n  case 'en-MU':\n    defaultPatterns = exports.DateIntervalPatterns_en_MU;\n    break;\n  case 'en_MW':\n  case 'en-MW':\n    defaultPatterns = exports.DateIntervalPatterns_en_MW;\n    break;\n  case 'en_MY':\n  case 'en-MY':\n    defaultPatterns = exports.DateIntervalPatterns_en_MY;\n    break;\n  case 'en_NA':\n  case 'en-NA':\n    defaultPatterns = exports.DateIntervalPatterns_en_NA;\n    break;\n  case 'en_NF':\n  case 'en-NF':\n    defaultPatterns = exports.DateIntervalPatterns_en_NF;\n    break;\n  case 'en_NG':\n  case 'en-NG':\n    defaultPatterns = exports.DateIntervalPatterns_en_NG;\n    break;\n  case 'en_NL':\n  case 'en-NL':\n    defaultPatterns = exports.DateIntervalPatterns_en_NL;\n    break;\n  case 'en_NR':\n  case 'en-NR':\n    defaultPatterns = exports.DateIntervalPatterns_en_NR;\n    break;\n  case 'en_NU':\n  case 'en-NU':\n    defaultPatterns = exports.DateIntervalPatterns_en_NU;\n    break;\n  case 'en_NZ':\n  case 'en-NZ':\n    defaultPatterns = exports.DateIntervalPatterns_en_NZ;\n    break;\n  case 'en_PG':\n  case 'en-PG':\n    defaultPatterns = exports.DateIntervalPatterns_en_PG;\n    break;\n  case 'en_PH':\n  case 'en-PH':\n    defaultPatterns = exports.DateIntervalPatterns_en_PH;\n    break;\n  case 'en_PK':\n  case 'en-PK':\n    defaultPatterns = exports.DateIntervalPatterns_en_PK;\n    break;\n  case 'en_PN':\n  case 'en-PN':\n    defaultPatterns = exports.DateIntervalPatterns_en_PN;\n    break;\n  case 'en_PR':\n  case 'en-PR':\n    defaultPatterns = exports.DateIntervalPatterns_en_PR;\n    break;\n  case 'en_PW':\n  case 'en-PW':\n    defaultPatterns = exports.DateIntervalPatterns_en_PW;\n    break;\n  case 'en_RW':\n  case 'en-RW':\n    defaultPatterns = exports.DateIntervalPatterns_en_RW;\n    break;\n  case 'en_SB':\n  case 'en-SB':\n    defaultPatterns = exports.DateIntervalPatterns_en_SB;\n    break;\n  case 'en_SC':\n  case 'en-SC':\n    defaultPatterns = exports.DateIntervalPatterns_en_SC;\n    break;\n  case 'en_SD':\n  case 'en-SD':\n    defaultPatterns = exports.DateIntervalPatterns_en_SD;\n    break;\n  case 'en_SE':\n  case 'en-SE':\n    defaultPatterns = exports.DateIntervalPatterns_en_SE;\n    break;\n  case 'en_SH':\n  case 'en-SH':\n    defaultPatterns = exports.DateIntervalPatterns_en_SH;\n    break;\n  case 'en_SI':\n  case 'en-SI':\n    defaultPatterns = exports.DateIntervalPatterns_en_SI;\n    break;\n  case 'en_SL':\n  case 'en-SL':\n    defaultPatterns = exports.DateIntervalPatterns_en_SL;\n    break;\n  case 'en_SS':\n  case 'en-SS':\n    defaultPatterns = exports.DateIntervalPatterns_en_SS;\n    break;\n  case 'en_SX':\n  case 'en-SX':\n    defaultPatterns = exports.DateIntervalPatterns_en_SX;\n    break;\n  case 'en_SZ':\n  case 'en-SZ':\n    defaultPatterns = exports.DateIntervalPatterns_en_SZ;\n    break;\n  case 'en_TC':\n  case 'en-TC':\n    defaultPatterns = exports.DateIntervalPatterns_en_TC;\n    break;\n  case 'en_TK':\n  case 'en-TK':\n    defaultPatterns = exports.DateIntervalPatterns_en_TK;\n    break;\n  case 'en_TO':\n  case 'en-TO':\n    defaultPatterns = exports.DateIntervalPatterns_en_TO;\n    break;\n  case 'en_TT':\n  case 'en-TT':\n    defaultPatterns = exports.DateIntervalPatterns_en_TT;\n    break;\n  case 'en_TV':\n  case 'en-TV':\n    defaultPatterns = exports.DateIntervalPatterns_en_TV;\n    break;\n  case 'en_TZ':\n  case 'en-TZ':\n    defaultPatterns = exports.DateIntervalPatterns_en_TZ;\n    break;\n  case 'en_UG':\n  case 'en-UG':\n    defaultPatterns = exports.DateIntervalPatterns_en_UG;\n    break;\n  case 'en_UM':\n  case 'en-UM':\n    defaultPatterns = exports.DateIntervalPatterns_en_UM;\n    break;\n  case 'en_US_POSIX':\n  case 'en-US-POSIX':\n    defaultPatterns = exports.DateIntervalPatterns_en_US_POSIX;\n    break;\n  case 'en_VC':\n  case 'en-VC':\n    defaultPatterns = exports.DateIntervalPatterns_en_VC;\n    break;\n  case 'en_VG':\n  case 'en-VG':\n    defaultPatterns = exports.DateIntervalPatterns_en_VG;\n    break;\n  case 'en_VI':\n  case 'en-VI':\n    defaultPatterns = exports.DateIntervalPatterns_en_VI;\n    break;\n  case 'en_VU':\n  case 'en-VU':\n    defaultPatterns = exports.DateIntervalPatterns_en_VU;\n    break;\n  case 'en_WS':\n  case 'en-WS':\n    defaultPatterns = exports.DateIntervalPatterns_en_WS;\n    break;\n  case 'en_XA':\n  case 'en-XA':\n    defaultPatterns = exports.DateIntervalPatterns_en_XA;\n    break;\n  case 'en_ZM':\n  case 'en-ZM':\n    defaultPatterns = exports.DateIntervalPatterns_en_ZM;\n    break;\n  case 'en_ZW':\n  case 'en-ZW':\n    defaultPatterns = exports.DateIntervalPatterns_en_ZW;\n    break;\n  case 'eo':\n    defaultPatterns = exports.DateIntervalPatterns_eo;\n    break;\n  case 'eo_001':\n  case 'eo-001':\n    defaultPatterns = exports.DateIntervalPatterns_eo_001;\n    break;\n  case 'es_AR':\n  case 'es-AR':\n    defaultPatterns = exports.DateIntervalPatterns_es_AR;\n    break;\n  case 'es_BO':\n  case 'es-BO':\n    defaultPatterns = exports.DateIntervalPatterns_es_BO;\n    break;\n  case 'es_BR':\n  case 'es-BR':\n    defaultPatterns = exports.DateIntervalPatterns_es_BR;\n    break;\n  case 'es_BZ':\n  case 'es-BZ':\n    defaultPatterns = exports.DateIntervalPatterns_es_BZ;\n    break;\n  case 'es_CL':\n  case 'es-CL':\n    defaultPatterns = exports.DateIntervalPatterns_es_CL;\n    break;\n  case 'es_CO':\n  case 'es-CO':\n    defaultPatterns = exports.DateIntervalPatterns_es_CO;\n    break;\n  case 'es_CR':\n  case 'es-CR':\n    defaultPatterns = exports.DateIntervalPatterns_es_CR;\n    break;\n  case 'es_CU':\n  case 'es-CU':\n    defaultPatterns = exports.DateIntervalPatterns_es_CU;\n    break;\n  case 'es_DO':\n  case 'es-DO':\n    defaultPatterns = exports.DateIntervalPatterns_es_DO;\n    break;\n  case 'es_EA':\n  case 'es-EA':\n    defaultPatterns = exports.DateIntervalPatterns_es_EA;\n    break;\n  case 'es_EC':\n  case 'es-EC':\n    defaultPatterns = exports.DateIntervalPatterns_es_EC;\n    break;\n  case 'es_GQ':\n  case 'es-GQ':\n    defaultPatterns = exports.DateIntervalPatterns_es_GQ;\n    break;\n  case 'es_GT':\n  case 'es-GT':\n    defaultPatterns = exports.DateIntervalPatterns_es_GT;\n    break;\n  case 'es_HN':\n  case 'es-HN':\n    defaultPatterns = exports.DateIntervalPatterns_es_HN;\n    break;\n  case 'es_IC':\n  case 'es-IC':\n    defaultPatterns = exports.DateIntervalPatterns_es_IC;\n    break;\n  case 'es_NI':\n  case 'es-NI':\n    defaultPatterns = exports.DateIntervalPatterns_es_NI;\n    break;\n  case 'es_PA':\n  case 'es-PA':\n    defaultPatterns = exports.DateIntervalPatterns_es_PA;\n    break;\n  case 'es_PE':\n  case 'es-PE':\n    defaultPatterns = exports.DateIntervalPatterns_es_PE;\n    break;\n  case 'es_PH':\n  case 'es-PH':\n    defaultPatterns = exports.DateIntervalPatterns_es_PH;\n    break;\n  case 'es_PR':\n  case 'es-PR':\n    defaultPatterns = exports.DateIntervalPatterns_es_PR;\n    break;\n  case 'es_PY':\n  case 'es-PY':\n    defaultPatterns = exports.DateIntervalPatterns_es_PY;\n    break;\n  case 'es_SV':\n  case 'es-SV':\n    defaultPatterns = exports.DateIntervalPatterns_es_SV;\n    break;\n  case 'es_UY':\n  case 'es-UY':\n    defaultPatterns = exports.DateIntervalPatterns_es_UY;\n    break;\n  case 'es_VE':\n  case 'es-VE':\n    defaultPatterns = exports.DateIntervalPatterns_es_VE;\n    break;\n  case 'et_EE':\n  case 'et-EE':\n    defaultPatterns = exports.DateIntervalPatterns_et_EE;\n    break;\n  case 'eu_ES':\n  case 'eu-ES':\n    defaultPatterns = exports.DateIntervalPatterns_eu_ES;\n    break;\n  case 'ewo':\n    defaultPatterns = exports.DateIntervalPatterns_ewo;\n    break;\n  case 'ewo_CM':\n  case 'ewo-CM':\n    defaultPatterns = exports.DateIntervalPatterns_ewo_CM;\n    break;\n  case 'fa_AF':\n  case 'fa-AF':\n    defaultPatterns = exports.DateIntervalPatterns_fa_AF;\n    break;\n  case 'fa_IR':\n  case 'fa-IR':\n    defaultPatterns = exports.DateIntervalPatterns_fa_IR;\n    break;\n  case 'ff':\n    defaultPatterns = exports.DateIntervalPatterns_ff;\n    break;\n  case 'ff_Latn':\n  case 'ff-Latn':\n    defaultPatterns = exports.DateIntervalPatterns_ff_Latn;\n    break;\n  case 'ff_Latn_BF':\n  case 'ff-Latn-BF':\n    defaultPatterns = exports.DateIntervalPatterns_ff_Latn_BF;\n    break;\n  case 'ff_Latn_CM':\n  case 'ff-Latn-CM':\n    defaultPatterns = exports.DateIntervalPatterns_ff_Latn_CM;\n    break;\n  case 'ff_Latn_GH':\n  case 'ff-Latn-GH':\n    defaultPatterns = exports.DateIntervalPatterns_ff_Latn_GH;\n    break;\n  case 'ff_Latn_GM':\n  case 'ff-Latn-GM':\n    defaultPatterns = exports.DateIntervalPatterns_ff_Latn_GM;\n    break;\n  case 'ff_Latn_GN':\n  case 'ff-Latn-GN':\n    defaultPatterns = exports.DateIntervalPatterns_ff_Latn_GN;\n    break;\n  case 'ff_Latn_GW':\n  case 'ff-Latn-GW':\n    defaultPatterns = exports.DateIntervalPatterns_ff_Latn_GW;\n    break;\n  case 'ff_Latn_LR':\n  case 'ff-Latn-LR':\n    defaultPatterns = exports.DateIntervalPatterns_ff_Latn_LR;\n    break;\n  case 'ff_Latn_MR':\n  case 'ff-Latn-MR':\n    defaultPatterns = exports.DateIntervalPatterns_ff_Latn_MR;\n    break;\n  case 'ff_Latn_NE':\n  case 'ff-Latn-NE':\n    defaultPatterns = exports.DateIntervalPatterns_ff_Latn_NE;\n    break;\n  case 'ff_Latn_NG':\n  case 'ff-Latn-NG':\n    defaultPatterns = exports.DateIntervalPatterns_ff_Latn_NG;\n    break;\n  case 'ff_Latn_SL':\n  case 'ff-Latn-SL':\n    defaultPatterns = exports.DateIntervalPatterns_ff_Latn_SL;\n    break;\n  case 'ff_Latn_SN':\n  case 'ff-Latn-SN':\n    defaultPatterns = exports.DateIntervalPatterns_ff_Latn_SN;\n    break;\n  case 'fi_FI':\n  case 'fi-FI':\n    defaultPatterns = exports.DateIntervalPatterns_fi_FI;\n    break;\n  case 'fil_PH':\n  case 'fil-PH':\n    defaultPatterns = exports.DateIntervalPatterns_fil_PH;\n    break;\n  case 'fo':\n    defaultPatterns = exports.DateIntervalPatterns_fo;\n    break;\n  case 'fo_DK':\n  case 'fo-DK':\n    defaultPatterns = exports.DateIntervalPatterns_fo_DK;\n    break;\n  case 'fo_FO':\n  case 'fo-FO':\n    defaultPatterns = exports.DateIntervalPatterns_fo_FO;\n    break;\n  case 'fr_BE':\n  case 'fr-BE':\n    defaultPatterns = exports.DateIntervalPatterns_fr_BE;\n    break;\n  case 'fr_BF':\n  case 'fr-BF':\n    defaultPatterns = exports.DateIntervalPatterns_fr_BF;\n    break;\n  case 'fr_BI':\n  case 'fr-BI':\n    defaultPatterns = exports.DateIntervalPatterns_fr_BI;\n    break;\n  case 'fr_BJ':\n  case 'fr-BJ':\n    defaultPatterns = exports.DateIntervalPatterns_fr_BJ;\n    break;\n  case 'fr_BL':\n  case 'fr-BL':\n    defaultPatterns = exports.DateIntervalPatterns_fr_BL;\n    break;\n  case 'fr_CD':\n  case 'fr-CD':\n    defaultPatterns = exports.DateIntervalPatterns_fr_CD;\n    break;\n  case 'fr_CF':\n  case 'fr-CF':\n    defaultPatterns = exports.DateIntervalPatterns_fr_CF;\n    break;\n  case 'fr_CG':\n  case 'fr-CG':\n    defaultPatterns = exports.DateIntervalPatterns_fr_CG;\n    break;\n  case 'fr_CH':\n  case 'fr-CH':\n    defaultPatterns = exports.DateIntervalPatterns_fr_CH;\n    break;\n  case 'fr_CI':\n  case 'fr-CI':\n    defaultPatterns = exports.DateIntervalPatterns_fr_CI;\n    break;\n  case 'fr_CM':\n  case 'fr-CM':\n    defaultPatterns = exports.DateIntervalPatterns_fr_CM;\n    break;\n  case 'fr_DJ':\n  case 'fr-DJ':\n    defaultPatterns = exports.DateIntervalPatterns_fr_DJ;\n    break;\n  case 'fr_DZ':\n  case 'fr-DZ':\n    defaultPatterns = exports.DateIntervalPatterns_fr_DZ;\n    break;\n  case 'fr_FR':\n  case 'fr-FR':\n    defaultPatterns = exports.DateIntervalPatterns_fr_FR;\n    break;\n  case 'fr_GA':\n  case 'fr-GA':\n    defaultPatterns = exports.DateIntervalPatterns_fr_GA;\n    break;\n  case 'fr_GF':\n  case 'fr-GF':\n    defaultPatterns = exports.DateIntervalPatterns_fr_GF;\n    break;\n  case 'fr_GN':\n  case 'fr-GN':\n    defaultPatterns = exports.DateIntervalPatterns_fr_GN;\n    break;\n  case 'fr_GP':\n  case 'fr-GP':\n    defaultPatterns = exports.DateIntervalPatterns_fr_GP;\n    break;\n  case 'fr_GQ':\n  case 'fr-GQ':\n    defaultPatterns = exports.DateIntervalPatterns_fr_GQ;\n    break;\n  case 'fr_HT':\n  case 'fr-HT':\n    defaultPatterns = exports.DateIntervalPatterns_fr_HT;\n    break;\n  case 'fr_KM':\n  case 'fr-KM':\n    defaultPatterns = exports.DateIntervalPatterns_fr_KM;\n    break;\n  case 'fr_LU':\n  case 'fr-LU':\n    defaultPatterns = exports.DateIntervalPatterns_fr_LU;\n    break;\n  case 'fr_MA':\n  case 'fr-MA':\n    defaultPatterns = exports.DateIntervalPatterns_fr_MA;\n    break;\n  case 'fr_MC':\n  case 'fr-MC':\n    defaultPatterns = exports.DateIntervalPatterns_fr_MC;\n    break;\n  case 'fr_MF':\n  case 'fr-MF':\n    defaultPatterns = exports.DateIntervalPatterns_fr_MF;\n    break;\n  case 'fr_MG':\n  case 'fr-MG':\n    defaultPatterns = exports.DateIntervalPatterns_fr_MG;\n    break;\n  case 'fr_ML':\n  case 'fr-ML':\n    defaultPatterns = exports.DateIntervalPatterns_fr_ML;\n    break;\n  case 'fr_MQ':\n  case 'fr-MQ':\n    defaultPatterns = exports.DateIntervalPatterns_fr_MQ;\n    break;\n  case 'fr_MR':\n  case 'fr-MR':\n    defaultPatterns = exports.DateIntervalPatterns_fr_MR;\n    break;\n  case 'fr_MU':\n  case 'fr-MU':\n    defaultPatterns = exports.DateIntervalPatterns_fr_MU;\n    break;\n  case 'fr_NC':\n  case 'fr-NC':\n    defaultPatterns = exports.DateIntervalPatterns_fr_NC;\n    break;\n  case 'fr_NE':\n  case 'fr-NE':\n    defaultPatterns = exports.DateIntervalPatterns_fr_NE;\n    break;\n  case 'fr_PF':\n  case 'fr-PF':\n    defaultPatterns = exports.DateIntervalPatterns_fr_PF;\n    break;\n  case 'fr_PM':\n  case 'fr-PM':\n    defaultPatterns = exports.DateIntervalPatterns_fr_PM;\n    break;\n  case 'fr_RE':\n  case 'fr-RE':\n    defaultPatterns = exports.DateIntervalPatterns_fr_RE;\n    break;\n  case 'fr_RW':\n  case 'fr-RW':\n    defaultPatterns = exports.DateIntervalPatterns_fr_RW;\n    break;\n  case 'fr_SC':\n  case 'fr-SC':\n    defaultPatterns = exports.DateIntervalPatterns_fr_SC;\n    break;\n  case 'fr_SN':\n  case 'fr-SN':\n    defaultPatterns = exports.DateIntervalPatterns_fr_SN;\n    break;\n  case 'fr_SY':\n  case 'fr-SY':\n    defaultPatterns = exports.DateIntervalPatterns_fr_SY;\n    break;\n  case 'fr_TD':\n  case 'fr-TD':\n    defaultPatterns = exports.DateIntervalPatterns_fr_TD;\n    break;\n  case 'fr_TG':\n  case 'fr-TG':\n    defaultPatterns = exports.DateIntervalPatterns_fr_TG;\n    break;\n  case 'fr_TN':\n  case 'fr-TN':\n    defaultPatterns = exports.DateIntervalPatterns_fr_TN;\n    break;\n  case 'fr_VU':\n  case 'fr-VU':\n    defaultPatterns = exports.DateIntervalPatterns_fr_VU;\n    break;\n  case 'fr_WF':\n  case 'fr-WF':\n    defaultPatterns = exports.DateIntervalPatterns_fr_WF;\n    break;\n  case 'fr_YT':\n  case 'fr-YT':\n    defaultPatterns = exports.DateIntervalPatterns_fr_YT;\n    break;\n  case 'fur':\n    defaultPatterns = exports.DateIntervalPatterns_fur;\n    break;\n  case 'fur_IT':\n  case 'fur-IT':\n    defaultPatterns = exports.DateIntervalPatterns_fur_IT;\n    break;\n  case 'fy':\n    defaultPatterns = exports.DateIntervalPatterns_fy;\n    break;\n  case 'fy_NL':\n  case 'fy-NL':\n    defaultPatterns = exports.DateIntervalPatterns_fy_NL;\n    break;\n  case 'ga_IE':\n  case 'ga-IE':\n    defaultPatterns = exports.DateIntervalPatterns_ga_IE;\n    break;\n  case 'gd':\n    defaultPatterns = exports.DateIntervalPatterns_gd;\n    break;\n  case 'gd_GB':\n  case 'gd-GB':\n    defaultPatterns = exports.DateIntervalPatterns_gd_GB;\n    break;\n  case 'gl_ES':\n  case 'gl-ES':\n    defaultPatterns = exports.DateIntervalPatterns_gl_ES;\n    break;\n  case 'gsw_CH':\n  case 'gsw-CH':\n    defaultPatterns = exports.DateIntervalPatterns_gsw_CH;\n    break;\n  case 'gsw_FR':\n  case 'gsw-FR':\n    defaultPatterns = exports.DateIntervalPatterns_gsw_FR;\n    break;\n  case 'gsw_LI':\n  case 'gsw-LI':\n    defaultPatterns = exports.DateIntervalPatterns_gsw_LI;\n    break;\n  case 'gu_IN':\n  case 'gu-IN':\n    defaultPatterns = exports.DateIntervalPatterns_gu_IN;\n    break;\n  case 'guz':\n    defaultPatterns = exports.DateIntervalPatterns_guz;\n    break;\n  case 'guz_KE':\n  case 'guz-KE':\n    defaultPatterns = exports.DateIntervalPatterns_guz_KE;\n    break;\n  case 'gv':\n    defaultPatterns = exports.DateIntervalPatterns_gv;\n    break;\n  case 'gv_IM':\n  case 'gv-IM':\n    defaultPatterns = exports.DateIntervalPatterns_gv_IM;\n    break;\n  case 'ha':\n    defaultPatterns = exports.DateIntervalPatterns_ha;\n    break;\n  case 'ha_GH':\n  case 'ha-GH':\n    defaultPatterns = exports.DateIntervalPatterns_ha_GH;\n    break;\n  case 'ha_NE':\n  case 'ha-NE':\n    defaultPatterns = exports.DateIntervalPatterns_ha_NE;\n    break;\n  case 'ha_NG':\n  case 'ha-NG':\n    defaultPatterns = exports.DateIntervalPatterns_ha_NG;\n    break;\n  case 'haw_US':\n  case 'haw-US':\n    defaultPatterns = exports.DateIntervalPatterns_haw_US;\n    break;\n  case 'he_IL':\n  case 'he-IL':\n    defaultPatterns = exports.DateIntervalPatterns_he_IL;\n    break;\n  case 'hi_IN':\n  case 'hi-IN':\n    defaultPatterns = exports.DateIntervalPatterns_hi_IN;\n    break;\n  case 'hr_BA':\n  case 'hr-BA':\n    defaultPatterns = exports.DateIntervalPatterns_hr_BA;\n    break;\n  case 'hr_HR':\n  case 'hr-HR':\n    defaultPatterns = exports.DateIntervalPatterns_hr_HR;\n    break;\n  case 'hsb':\n    defaultPatterns = exports.DateIntervalPatterns_hsb;\n    break;\n  case 'hsb_DE':\n  case 'hsb-DE':\n    defaultPatterns = exports.DateIntervalPatterns_hsb_DE;\n    break;\n  case 'hu_HU':\n  case 'hu-HU':\n    defaultPatterns = exports.DateIntervalPatterns_hu_HU;\n    break;\n  case 'hy_AM':\n  case 'hy-AM':\n    defaultPatterns = exports.DateIntervalPatterns_hy_AM;\n    break;\n  case 'ia':\n    defaultPatterns = exports.DateIntervalPatterns_ia;\n    break;\n  case 'ia_001':\n  case 'ia-001':\n    defaultPatterns = exports.DateIntervalPatterns_ia_001;\n    break;\n  case 'id_ID':\n  case 'id-ID':\n    defaultPatterns = exports.DateIntervalPatterns_id_ID;\n    break;\n  case 'ig':\n    defaultPatterns = exports.DateIntervalPatterns_ig;\n    break;\n  case 'ig_NG':\n  case 'ig-NG':\n    defaultPatterns = exports.DateIntervalPatterns_ig_NG;\n    break;\n  case 'ii':\n    defaultPatterns = exports.DateIntervalPatterns_ii;\n    break;\n  case 'ii_CN':\n  case 'ii-CN':\n    defaultPatterns = exports.DateIntervalPatterns_ii_CN;\n    break;\n  case 'is_IS':\n  case 'is-IS':\n    defaultPatterns = exports.DateIntervalPatterns_is_IS;\n    break;\n  case 'it_CH':\n  case 'it-CH':\n    defaultPatterns = exports.DateIntervalPatterns_it_CH;\n    break;\n  case 'it_IT':\n  case 'it-IT':\n    defaultPatterns = exports.DateIntervalPatterns_it_IT;\n    break;\n  case 'it_SM':\n  case 'it-SM':\n    defaultPatterns = exports.DateIntervalPatterns_it_SM;\n    break;\n  case 'it_VA':\n  case 'it-VA':\n    defaultPatterns = exports.DateIntervalPatterns_it_VA;\n    break;\n  case 'ja_JP':\n  case 'ja-JP':\n    defaultPatterns = exports.DateIntervalPatterns_ja_JP;\n    break;\n  case 'jgo':\n    defaultPatterns = exports.DateIntervalPatterns_jgo;\n    break;\n  case 'jgo_CM':\n  case 'jgo-CM':\n    defaultPatterns = exports.DateIntervalPatterns_jgo_CM;\n    break;\n  case 'jmc':\n    defaultPatterns = exports.DateIntervalPatterns_jmc;\n    break;\n  case 'jmc_TZ':\n  case 'jmc-TZ':\n    defaultPatterns = exports.DateIntervalPatterns_jmc_TZ;\n    break;\n  case 'jv':\n    defaultPatterns = exports.DateIntervalPatterns_jv;\n    break;\n  case 'jv_ID':\n  case 'jv-ID':\n    defaultPatterns = exports.DateIntervalPatterns_jv_ID;\n    break;\n  case 'ka_GE':\n  case 'ka-GE':\n    defaultPatterns = exports.DateIntervalPatterns_ka_GE;\n    break;\n  case 'kab':\n    defaultPatterns = exports.DateIntervalPatterns_kab;\n    break;\n  case 'kab_DZ':\n  case 'kab-DZ':\n    defaultPatterns = exports.DateIntervalPatterns_kab_DZ;\n    break;\n  case 'kam':\n    defaultPatterns = exports.DateIntervalPatterns_kam;\n    break;\n  case 'kam_KE':\n  case 'kam-KE':\n    defaultPatterns = exports.DateIntervalPatterns_kam_KE;\n    break;\n  case 'kde':\n    defaultPatterns = exports.DateIntervalPatterns_kde;\n    break;\n  case 'kde_TZ':\n  case 'kde-TZ':\n    defaultPatterns = exports.DateIntervalPatterns_kde_TZ;\n    break;\n  case 'kea':\n    defaultPatterns = exports.DateIntervalPatterns_kea;\n    break;\n  case 'kea_CV':\n  case 'kea-CV':\n    defaultPatterns = exports.DateIntervalPatterns_kea_CV;\n    break;\n  case 'khq':\n    defaultPatterns = exports.DateIntervalPatterns_khq;\n    break;\n  case 'khq_ML':\n  case 'khq-ML':\n    defaultPatterns = exports.DateIntervalPatterns_khq_ML;\n    break;\n  case 'ki':\n    defaultPatterns = exports.DateIntervalPatterns_ki;\n    break;\n  case 'ki_KE':\n  case 'ki-KE':\n    defaultPatterns = exports.DateIntervalPatterns_ki_KE;\n    break;\n  case 'kk_KZ':\n  case 'kk-KZ':\n    defaultPatterns = exports.DateIntervalPatterns_kk_KZ;\n    break;\n  case 'kkj':\n    defaultPatterns = exports.DateIntervalPatterns_kkj;\n    break;\n  case 'kkj_CM':\n  case 'kkj-CM':\n    defaultPatterns = exports.DateIntervalPatterns_kkj_CM;\n    break;\n  case 'kl':\n    defaultPatterns = exports.DateIntervalPatterns_kl;\n    break;\n  case 'kl_GL':\n  case 'kl-GL':\n    defaultPatterns = exports.DateIntervalPatterns_kl_GL;\n    break;\n  case 'kln':\n    defaultPatterns = exports.DateIntervalPatterns_kln;\n    break;\n  case 'kln_KE':\n  case 'kln-KE':\n    defaultPatterns = exports.DateIntervalPatterns_kln_KE;\n    break;\n  case 'km_KH':\n  case 'km-KH':\n    defaultPatterns = exports.DateIntervalPatterns_km_KH;\n    break;\n  case 'kn_IN':\n  case 'kn-IN':\n    defaultPatterns = exports.DateIntervalPatterns_kn_IN;\n    break;\n  case 'ko_KP':\n  case 'ko-KP':\n    defaultPatterns = exports.DateIntervalPatterns_ko_KP;\n    break;\n  case 'ko_KR':\n  case 'ko-KR':\n    defaultPatterns = exports.DateIntervalPatterns_ko_KR;\n    break;\n  case 'kok':\n    defaultPatterns = exports.DateIntervalPatterns_kok;\n    break;\n  case 'kok_IN':\n  case 'kok-IN':\n    defaultPatterns = exports.DateIntervalPatterns_kok_IN;\n    break;\n  case 'ks':\n    defaultPatterns = exports.DateIntervalPatterns_ks;\n    break;\n  case 'ks_IN':\n  case 'ks-IN':\n    defaultPatterns = exports.DateIntervalPatterns_ks_IN;\n    break;\n  case 'ksb':\n    defaultPatterns = exports.DateIntervalPatterns_ksb;\n    break;\n  case 'ksb_TZ':\n  case 'ksb-TZ':\n    defaultPatterns = exports.DateIntervalPatterns_ksb_TZ;\n    break;\n  case 'ksf':\n    defaultPatterns = exports.DateIntervalPatterns_ksf;\n    break;\n  case 'ksf_CM':\n  case 'ksf-CM':\n    defaultPatterns = exports.DateIntervalPatterns_ksf_CM;\n    break;\n  case 'ksh':\n    defaultPatterns = exports.DateIntervalPatterns_ksh;\n    break;\n  case 'ksh_DE':\n  case 'ksh-DE':\n    defaultPatterns = exports.DateIntervalPatterns_ksh_DE;\n    break;\n  case 'ku':\n    defaultPatterns = exports.DateIntervalPatterns_ku;\n    break;\n  case 'ku_TR':\n  case 'ku-TR':\n    defaultPatterns = exports.DateIntervalPatterns_ku_TR;\n    break;\n  case 'kw':\n    defaultPatterns = exports.DateIntervalPatterns_kw;\n    break;\n  case 'kw_GB':\n  case 'kw-GB':\n    defaultPatterns = exports.DateIntervalPatterns_kw_GB;\n    break;\n  case 'ky_KG':\n  case 'ky-KG':\n    defaultPatterns = exports.DateIntervalPatterns_ky_KG;\n    break;\n  case 'lag':\n    defaultPatterns = exports.DateIntervalPatterns_lag;\n    break;\n  case 'lag_TZ':\n  case 'lag-TZ':\n    defaultPatterns = exports.DateIntervalPatterns_lag_TZ;\n    break;\n  case 'lb':\n    defaultPatterns = exports.DateIntervalPatterns_lb;\n    break;\n  case 'lb_LU':\n  case 'lb-LU':\n    defaultPatterns = exports.DateIntervalPatterns_lb_LU;\n    break;\n  case 'lg':\n    defaultPatterns = exports.DateIntervalPatterns_lg;\n    break;\n  case 'lg_UG':\n  case 'lg-UG':\n    defaultPatterns = exports.DateIntervalPatterns_lg_UG;\n    break;\n  case 'lkt':\n    defaultPatterns = exports.DateIntervalPatterns_lkt;\n    break;\n  case 'lkt_US':\n  case 'lkt-US':\n    defaultPatterns = exports.DateIntervalPatterns_lkt_US;\n    break;\n  case 'ln_AO':\n  case 'ln-AO':\n    defaultPatterns = exports.DateIntervalPatterns_ln_AO;\n    break;\n  case 'ln_CD':\n  case 'ln-CD':\n    defaultPatterns = exports.DateIntervalPatterns_ln_CD;\n    break;\n  case 'ln_CF':\n  case 'ln-CF':\n    defaultPatterns = exports.DateIntervalPatterns_ln_CF;\n    break;\n  case 'ln_CG':\n  case 'ln-CG':\n    defaultPatterns = exports.DateIntervalPatterns_ln_CG;\n    break;\n  case 'lo_LA':\n  case 'lo-LA':\n    defaultPatterns = exports.DateIntervalPatterns_lo_LA;\n    break;\n  case 'lrc':\n    defaultPatterns = exports.DateIntervalPatterns_lrc;\n    break;\n  case 'lrc_IQ':\n  case 'lrc-IQ':\n    defaultPatterns = exports.DateIntervalPatterns_lrc_IQ;\n    break;\n  case 'lrc_IR':\n  case 'lrc-IR':\n    defaultPatterns = exports.DateIntervalPatterns_lrc_IR;\n    break;\n  case 'lt_LT':\n  case 'lt-LT':\n    defaultPatterns = exports.DateIntervalPatterns_lt_LT;\n    break;\n  case 'lu':\n    defaultPatterns = exports.DateIntervalPatterns_lu;\n    break;\n  case 'lu_CD':\n  case 'lu-CD':\n    defaultPatterns = exports.DateIntervalPatterns_lu_CD;\n    break;\n  case 'luo':\n    defaultPatterns = exports.DateIntervalPatterns_luo;\n    break;\n  case 'luo_KE':\n  case 'luo-KE':\n    defaultPatterns = exports.DateIntervalPatterns_luo_KE;\n    break;\n  case 'luy':\n    defaultPatterns = exports.DateIntervalPatterns_luy;\n    break;\n  case 'luy_KE':\n  case 'luy-KE':\n    defaultPatterns = exports.DateIntervalPatterns_luy_KE;\n    break;\n  case 'lv_LV':\n  case 'lv-LV':\n    defaultPatterns = exports.DateIntervalPatterns_lv_LV;\n    break;\n  case 'mas':\n    defaultPatterns = exports.DateIntervalPatterns_mas;\n    break;\n  case 'mas_KE':\n  case 'mas-KE':\n    defaultPatterns = exports.DateIntervalPatterns_mas_KE;\n    break;\n  case 'mas_TZ':\n  case 'mas-TZ':\n    defaultPatterns = exports.DateIntervalPatterns_mas_TZ;\n    break;\n  case 'mer':\n    defaultPatterns = exports.DateIntervalPatterns_mer;\n    break;\n  case 'mer_KE':\n  case 'mer-KE':\n    defaultPatterns = exports.DateIntervalPatterns_mer_KE;\n    break;\n  case 'mfe':\n    defaultPatterns = exports.DateIntervalPatterns_mfe;\n    break;\n  case 'mfe_MU':\n  case 'mfe-MU':\n    defaultPatterns = exports.DateIntervalPatterns_mfe_MU;\n    break;\n  case 'mg':\n    defaultPatterns = exports.DateIntervalPatterns_mg;\n    break;\n  case 'mg_MG':\n  case 'mg-MG':\n    defaultPatterns = exports.DateIntervalPatterns_mg_MG;\n    break;\n  case 'mgh':\n    defaultPatterns = exports.DateIntervalPatterns_mgh;\n    break;\n  case 'mgh_MZ':\n  case 'mgh-MZ':\n    defaultPatterns = exports.DateIntervalPatterns_mgh_MZ;\n    break;\n  case 'mgo':\n    defaultPatterns = exports.DateIntervalPatterns_mgo;\n    break;\n  case 'mgo_CM':\n  case 'mgo-CM':\n    defaultPatterns = exports.DateIntervalPatterns_mgo_CM;\n    break;\n  case 'mi':\n    defaultPatterns = exports.DateIntervalPatterns_mi;\n    break;\n  case 'mi_NZ':\n  case 'mi-NZ':\n    defaultPatterns = exports.DateIntervalPatterns_mi_NZ;\n    break;\n  case 'mk_MK':\n  case 'mk-MK':\n    defaultPatterns = exports.DateIntervalPatterns_mk_MK;\n    break;\n  case 'ml_IN':\n  case 'ml-IN':\n    defaultPatterns = exports.DateIntervalPatterns_ml_IN;\n    break;\n  case 'mn_MN':\n  case 'mn-MN':\n    defaultPatterns = exports.DateIntervalPatterns_mn_MN;\n    break;\n  case 'mr_IN':\n  case 'mr-IN':\n    defaultPatterns = exports.DateIntervalPatterns_mr_IN;\n    break;\n  case 'ms_BN':\n  case 'ms-BN':\n    defaultPatterns = exports.DateIntervalPatterns_ms_BN;\n    break;\n  case 'ms_MY':\n  case 'ms-MY':\n    defaultPatterns = exports.DateIntervalPatterns_ms_MY;\n    break;\n  case 'ms_SG':\n  case 'ms-SG':\n    defaultPatterns = exports.DateIntervalPatterns_ms_SG;\n    break;\n  case 'mt_MT':\n  case 'mt-MT':\n    defaultPatterns = exports.DateIntervalPatterns_mt_MT;\n    break;\n  case 'mua':\n    defaultPatterns = exports.DateIntervalPatterns_mua;\n    break;\n  case 'mua_CM':\n  case 'mua-CM':\n    defaultPatterns = exports.DateIntervalPatterns_mua_CM;\n    break;\n  case 'my_MM':\n  case 'my-MM':\n    defaultPatterns = exports.DateIntervalPatterns_my_MM;\n    break;\n  case 'mzn':\n    defaultPatterns = exports.DateIntervalPatterns_mzn;\n    break;\n  case 'mzn_IR':\n  case 'mzn-IR':\n    defaultPatterns = exports.DateIntervalPatterns_mzn_IR;\n    break;\n  case 'naq':\n    defaultPatterns = exports.DateIntervalPatterns_naq;\n    break;\n  case 'naq_NA':\n  case 'naq-NA':\n    defaultPatterns = exports.DateIntervalPatterns_naq_NA;\n    break;\n  case 'nb_NO':\n  case 'nb-NO':\n    defaultPatterns = exports.DateIntervalPatterns_nb_NO;\n    break;\n  case 'nb_SJ':\n  case 'nb-SJ':\n    defaultPatterns = exports.DateIntervalPatterns_nb_SJ;\n    break;\n  case 'nd':\n    defaultPatterns = exports.DateIntervalPatterns_nd;\n    break;\n  case 'nd_ZW':\n  case 'nd-ZW':\n    defaultPatterns = exports.DateIntervalPatterns_nd_ZW;\n    break;\n  case 'nds':\n    defaultPatterns = exports.DateIntervalPatterns_nds;\n    break;\n  case 'nds_DE':\n  case 'nds-DE':\n    defaultPatterns = exports.DateIntervalPatterns_nds_DE;\n    break;\n  case 'nds_NL':\n  case 'nds-NL':\n    defaultPatterns = exports.DateIntervalPatterns_nds_NL;\n    break;\n  case 'ne_IN':\n  case 'ne-IN':\n    defaultPatterns = exports.DateIntervalPatterns_ne_IN;\n    break;\n  case 'ne_NP':\n  case 'ne-NP':\n    defaultPatterns = exports.DateIntervalPatterns_ne_NP;\n    break;\n  case 'nl_AW':\n  case 'nl-AW':\n    defaultPatterns = exports.DateIntervalPatterns_nl_AW;\n    break;\n  case 'nl_BE':\n  case 'nl-BE':\n    defaultPatterns = exports.DateIntervalPatterns_nl_BE;\n    break;\n  case 'nl_BQ':\n  case 'nl-BQ':\n    defaultPatterns = exports.DateIntervalPatterns_nl_BQ;\n    break;\n  case 'nl_CW':\n  case 'nl-CW':\n    defaultPatterns = exports.DateIntervalPatterns_nl_CW;\n    break;\n  case 'nl_NL':\n  case 'nl-NL':\n    defaultPatterns = exports.DateIntervalPatterns_nl_NL;\n    break;\n  case 'nl_SR':\n  case 'nl-SR':\n    defaultPatterns = exports.DateIntervalPatterns_nl_SR;\n    break;\n  case 'nl_SX':\n  case 'nl-SX':\n    defaultPatterns = exports.DateIntervalPatterns_nl_SX;\n    break;\n  case 'nmg':\n    defaultPatterns = exports.DateIntervalPatterns_nmg;\n    break;\n  case 'nmg_CM':\n  case 'nmg-CM':\n    defaultPatterns = exports.DateIntervalPatterns_nmg_CM;\n    break;\n  case 'nn':\n    defaultPatterns = exports.DateIntervalPatterns_nn;\n    break;\n  case 'nn_NO':\n  case 'nn-NO':\n    defaultPatterns = exports.DateIntervalPatterns_nn_NO;\n    break;\n  case 'nnh':\n    defaultPatterns = exports.DateIntervalPatterns_nnh;\n    break;\n  case 'nnh_CM':\n  case 'nnh-CM':\n    defaultPatterns = exports.DateIntervalPatterns_nnh_CM;\n    break;\n  case 'nus':\n    defaultPatterns = exports.DateIntervalPatterns_nus;\n    break;\n  case 'nus_SS':\n  case 'nus-SS':\n    defaultPatterns = exports.DateIntervalPatterns_nus_SS;\n    break;\n  case 'nyn':\n    defaultPatterns = exports.DateIntervalPatterns_nyn;\n    break;\n  case 'nyn_UG':\n  case 'nyn-UG':\n    defaultPatterns = exports.DateIntervalPatterns_nyn_UG;\n    break;\n  case 'om':\n    defaultPatterns = exports.DateIntervalPatterns_om;\n    break;\n  case 'om_ET':\n  case 'om-ET':\n    defaultPatterns = exports.DateIntervalPatterns_om_ET;\n    break;\n  case 'om_KE':\n  case 'om-KE':\n    defaultPatterns = exports.DateIntervalPatterns_om_KE;\n    break;\n  case 'or_IN':\n  case 'or-IN':\n    defaultPatterns = exports.DateIntervalPatterns_or_IN;\n    break;\n  case 'os':\n    defaultPatterns = exports.DateIntervalPatterns_os;\n    break;\n  case 'os_GE':\n  case 'os-GE':\n    defaultPatterns = exports.DateIntervalPatterns_os_GE;\n    break;\n  case 'os_RU':\n  case 'os-RU':\n    defaultPatterns = exports.DateIntervalPatterns_os_RU;\n    break;\n  case 'pa_Arab':\n  case 'pa-Arab':\n    defaultPatterns = exports.DateIntervalPatterns_pa_Arab;\n    break;\n  case 'pa_Arab_PK':\n  case 'pa-Arab-PK':\n    defaultPatterns = exports.DateIntervalPatterns_pa_Arab_PK;\n    break;\n  case 'pa_Guru':\n  case 'pa-Guru':\n    defaultPatterns = exports.DateIntervalPatterns_pa_Guru;\n    break;\n  case 'pa_Guru_IN':\n  case 'pa-Guru-IN':\n    defaultPatterns = exports.DateIntervalPatterns_pa_Guru_IN;\n    break;\n  case 'pl_PL':\n  case 'pl-PL':\n    defaultPatterns = exports.DateIntervalPatterns_pl_PL;\n    break;\n  case 'ps':\n    defaultPatterns = exports.DateIntervalPatterns_ps;\n    break;\n  case 'ps_AF':\n  case 'ps-AF':\n    defaultPatterns = exports.DateIntervalPatterns_ps_AF;\n    break;\n  case 'ps_PK':\n  case 'ps-PK':\n    defaultPatterns = exports.DateIntervalPatterns_ps_PK;\n    break;\n  case 'pt_AO':\n  case 'pt-AO':\n    defaultPatterns = exports.DateIntervalPatterns_pt_AO;\n    break;\n  case 'pt_CH':\n  case 'pt-CH':\n    defaultPatterns = exports.DateIntervalPatterns_pt_CH;\n    break;\n  case 'pt_CV':\n  case 'pt-CV':\n    defaultPatterns = exports.DateIntervalPatterns_pt_CV;\n    break;\n  case 'pt_GQ':\n  case 'pt-GQ':\n    defaultPatterns = exports.DateIntervalPatterns_pt_GQ;\n    break;\n  case 'pt_GW':\n  case 'pt-GW':\n    defaultPatterns = exports.DateIntervalPatterns_pt_GW;\n    break;\n  case 'pt_LU':\n  case 'pt-LU':\n    defaultPatterns = exports.DateIntervalPatterns_pt_LU;\n    break;\n  case 'pt_MO':\n  case 'pt-MO':\n    defaultPatterns = exports.DateIntervalPatterns_pt_MO;\n    break;\n  case 'pt_MZ':\n  case 'pt-MZ':\n    defaultPatterns = exports.DateIntervalPatterns_pt_MZ;\n    break;\n  case 'pt_ST':\n  case 'pt-ST':\n    defaultPatterns = exports.DateIntervalPatterns_pt_ST;\n    break;\n  case 'pt_TL':\n  case 'pt-TL':\n    defaultPatterns = exports.DateIntervalPatterns_pt_TL;\n    break;\n  case 'qu':\n    defaultPatterns = exports.DateIntervalPatterns_qu;\n    break;\n  case 'qu_BO':\n  case 'qu-BO':\n    defaultPatterns = exports.DateIntervalPatterns_qu_BO;\n    break;\n  case 'qu_EC':\n  case 'qu-EC':\n    defaultPatterns = exports.DateIntervalPatterns_qu_EC;\n    break;\n  case 'qu_PE':\n  case 'qu-PE':\n    defaultPatterns = exports.DateIntervalPatterns_qu_PE;\n    break;\n  case 'rm':\n    defaultPatterns = exports.DateIntervalPatterns_rm;\n    break;\n  case 'rm_CH':\n  case 'rm-CH':\n    defaultPatterns = exports.DateIntervalPatterns_rm_CH;\n    break;\n  case 'rn':\n    defaultPatterns = exports.DateIntervalPatterns_rn;\n    break;\n  case 'rn_BI':\n  case 'rn-BI':\n    defaultPatterns = exports.DateIntervalPatterns_rn_BI;\n    break;\n  case 'ro_MD':\n  case 'ro-MD':\n    defaultPatterns = exports.DateIntervalPatterns_ro_MD;\n    break;\n  case 'ro_RO':\n  case 'ro-RO':\n    defaultPatterns = exports.DateIntervalPatterns_ro_RO;\n    break;\n  case 'rof':\n    defaultPatterns = exports.DateIntervalPatterns_rof;\n    break;\n  case 'rof_TZ':\n  case 'rof-TZ':\n    defaultPatterns = exports.DateIntervalPatterns_rof_TZ;\n    break;\n  case 'ru_BY':\n  case 'ru-BY':\n    defaultPatterns = exports.DateIntervalPatterns_ru_BY;\n    break;\n  case 'ru_KG':\n  case 'ru-KG':\n    defaultPatterns = exports.DateIntervalPatterns_ru_KG;\n    break;\n  case 'ru_KZ':\n  case 'ru-KZ':\n    defaultPatterns = exports.DateIntervalPatterns_ru_KZ;\n    break;\n  case 'ru_MD':\n  case 'ru-MD':\n    defaultPatterns = exports.DateIntervalPatterns_ru_MD;\n    break;\n  case 'ru_RU':\n  case 'ru-RU':\n    defaultPatterns = exports.DateIntervalPatterns_ru_RU;\n    break;\n  case 'ru_UA':\n  case 'ru-UA':\n    defaultPatterns = exports.DateIntervalPatterns_ru_UA;\n    break;\n  case 'rw':\n    defaultPatterns = exports.DateIntervalPatterns_rw;\n    break;\n  case 'rw_RW':\n  case 'rw-RW':\n    defaultPatterns = exports.DateIntervalPatterns_rw_RW;\n    break;\n  case 'rwk':\n    defaultPatterns = exports.DateIntervalPatterns_rwk;\n    break;\n  case 'rwk_TZ':\n  case 'rwk-TZ':\n    defaultPatterns = exports.DateIntervalPatterns_rwk_TZ;\n    break;\n  case 'sah':\n    defaultPatterns = exports.DateIntervalPatterns_sah;\n    break;\n  case 'sah_RU':\n  case 'sah-RU':\n    defaultPatterns = exports.DateIntervalPatterns_sah_RU;\n    break;\n  case 'saq':\n    defaultPatterns = exports.DateIntervalPatterns_saq;\n    break;\n  case 'saq_KE':\n  case 'saq-KE':\n    defaultPatterns = exports.DateIntervalPatterns_saq_KE;\n    break;\n  case 'sbp':\n    defaultPatterns = exports.DateIntervalPatterns_sbp;\n    break;\n  case 'sbp_TZ':\n  case 'sbp-TZ':\n    defaultPatterns = exports.DateIntervalPatterns_sbp_TZ;\n    break;\n  case 'sd':\n    defaultPatterns = exports.DateIntervalPatterns_sd;\n    break;\n  case 'sd_PK':\n  case 'sd-PK':\n    defaultPatterns = exports.DateIntervalPatterns_sd_PK;\n    break;\n  case 'se':\n    defaultPatterns = exports.DateIntervalPatterns_se;\n    break;\n  case 'se_FI':\n  case 'se-FI':\n    defaultPatterns = exports.DateIntervalPatterns_se_FI;\n    break;\n  case 'se_NO':\n  case 'se-NO':\n    defaultPatterns = exports.DateIntervalPatterns_se_NO;\n    break;\n  case 'se_SE':\n  case 'se-SE':\n    defaultPatterns = exports.DateIntervalPatterns_se_SE;\n    break;\n  case 'seh':\n    defaultPatterns = exports.DateIntervalPatterns_seh;\n    break;\n  case 'seh_MZ':\n  case 'seh-MZ':\n    defaultPatterns = exports.DateIntervalPatterns_seh_MZ;\n    break;\n  case 'ses':\n    defaultPatterns = exports.DateIntervalPatterns_ses;\n    break;\n  case 'ses_ML':\n  case 'ses-ML':\n    defaultPatterns = exports.DateIntervalPatterns_ses_ML;\n    break;\n  case 'sg':\n    defaultPatterns = exports.DateIntervalPatterns_sg;\n    break;\n  case 'sg_CF':\n  case 'sg-CF':\n    defaultPatterns = exports.DateIntervalPatterns_sg_CF;\n    break;\n  case 'shi':\n    defaultPatterns = exports.DateIntervalPatterns_shi;\n    break;\n  case 'shi_Latn':\n  case 'shi-Latn':\n    defaultPatterns = exports.DateIntervalPatterns_shi_Latn;\n    break;\n  case 'shi_Latn_MA':\n  case 'shi-Latn-MA':\n    defaultPatterns = exports.DateIntervalPatterns_shi_Latn_MA;\n    break;\n  case 'shi_Tfng':\n  case 'shi-Tfng':\n    defaultPatterns = exports.DateIntervalPatterns_shi_Tfng;\n    break;\n  case 'shi_Tfng_MA':\n  case 'shi-Tfng-MA':\n    defaultPatterns = exports.DateIntervalPatterns_shi_Tfng_MA;\n    break;\n  case 'si_LK':\n  case 'si-LK':\n    defaultPatterns = exports.DateIntervalPatterns_si_LK;\n    break;\n  case 'sk_SK':\n  case 'sk-SK':\n    defaultPatterns = exports.DateIntervalPatterns_sk_SK;\n    break;\n  case 'sl_SI':\n  case 'sl-SI':\n    defaultPatterns = exports.DateIntervalPatterns_sl_SI;\n    break;\n  case 'smn':\n    defaultPatterns = exports.DateIntervalPatterns_smn;\n    break;\n  case 'smn_FI':\n  case 'smn-FI':\n    defaultPatterns = exports.DateIntervalPatterns_smn_FI;\n    break;\n  case 'sn':\n    defaultPatterns = exports.DateIntervalPatterns_sn;\n    break;\n  case 'sn_ZW':\n  case 'sn-ZW':\n    defaultPatterns = exports.DateIntervalPatterns_sn_ZW;\n    break;\n  case 'so':\n    defaultPatterns = exports.DateIntervalPatterns_so;\n    break;\n  case 'so_DJ':\n  case 'so-DJ':\n    defaultPatterns = exports.DateIntervalPatterns_so_DJ;\n    break;\n  case 'so_ET':\n  case 'so-ET':\n    defaultPatterns = exports.DateIntervalPatterns_so_ET;\n    break;\n  case 'so_KE':\n  case 'so-KE':\n    defaultPatterns = exports.DateIntervalPatterns_so_KE;\n    break;\n  case 'so_SO':\n  case 'so-SO':\n    defaultPatterns = exports.DateIntervalPatterns_so_SO;\n    break;\n  case 'sq_AL':\n  case 'sq-AL':\n    defaultPatterns = exports.DateIntervalPatterns_sq_AL;\n    break;\n  case 'sq_MK':\n  case 'sq-MK':\n    defaultPatterns = exports.DateIntervalPatterns_sq_MK;\n    break;\n  case 'sq_XK':\n  case 'sq-XK':\n    defaultPatterns = exports.DateIntervalPatterns_sq_XK;\n    break;\n  case 'sr_Cyrl':\n  case 'sr-Cyrl':\n    defaultPatterns = exports.DateIntervalPatterns_sr_Cyrl;\n    break;\n  case 'sr_Cyrl_BA':\n  case 'sr-Cyrl-BA':\n    defaultPatterns = exports.DateIntervalPatterns_sr_Cyrl_BA;\n    break;\n  case 'sr_Cyrl_ME':\n  case 'sr-Cyrl-ME':\n    defaultPatterns = exports.DateIntervalPatterns_sr_Cyrl_ME;\n    break;\n  case 'sr_Cyrl_RS':\n  case 'sr-Cyrl-RS':\n    defaultPatterns = exports.DateIntervalPatterns_sr_Cyrl_RS;\n    break;\n  case 'sr_Cyrl_XK':\n  case 'sr-Cyrl-XK':\n    defaultPatterns = exports.DateIntervalPatterns_sr_Cyrl_XK;\n    break;\n  case 'sr_Latn_BA':\n  case 'sr-Latn-BA':\n    defaultPatterns = exports.DateIntervalPatterns_sr_Latn_BA;\n    break;\n  case 'sr_Latn_ME':\n  case 'sr-Latn-ME':\n    defaultPatterns = exports.DateIntervalPatterns_sr_Latn_ME;\n    break;\n  case 'sr_Latn_RS':\n  case 'sr-Latn-RS':\n    defaultPatterns = exports.DateIntervalPatterns_sr_Latn_RS;\n    break;\n  case 'sr_Latn_XK':\n  case 'sr-Latn-XK':\n    defaultPatterns = exports.DateIntervalPatterns_sr_Latn_XK;\n    break;\n  case 'sv_AX':\n  case 'sv-AX':\n    defaultPatterns = exports.DateIntervalPatterns_sv_AX;\n    break;\n  case 'sv_FI':\n  case 'sv-FI':\n    defaultPatterns = exports.DateIntervalPatterns_sv_FI;\n    break;\n  case 'sv_SE':\n  case 'sv-SE':\n    defaultPatterns = exports.DateIntervalPatterns_sv_SE;\n    break;\n  case 'sw_CD':\n  case 'sw-CD':\n    defaultPatterns = exports.DateIntervalPatterns_sw_CD;\n    break;\n  case 'sw_KE':\n  case 'sw-KE':\n    defaultPatterns = exports.DateIntervalPatterns_sw_KE;\n    break;\n  case 'sw_TZ':\n  case 'sw-TZ':\n    defaultPatterns = exports.DateIntervalPatterns_sw_TZ;\n    break;\n  case 'sw_UG':\n  case 'sw-UG':\n    defaultPatterns = exports.DateIntervalPatterns_sw_UG;\n    break;\n  case 'ta_IN':\n  case 'ta-IN':\n    defaultPatterns = exports.DateIntervalPatterns_ta_IN;\n    break;\n  case 'ta_LK':\n  case 'ta-LK':\n    defaultPatterns = exports.DateIntervalPatterns_ta_LK;\n    break;\n  case 'ta_MY':\n  case 'ta-MY':\n    defaultPatterns = exports.DateIntervalPatterns_ta_MY;\n    break;\n  case 'ta_SG':\n  case 'ta-SG':\n    defaultPatterns = exports.DateIntervalPatterns_ta_SG;\n    break;\n  case 'te_IN':\n  case 'te-IN':\n    defaultPatterns = exports.DateIntervalPatterns_te_IN;\n    break;\n  case 'teo':\n    defaultPatterns = exports.DateIntervalPatterns_teo;\n    break;\n  case 'teo_KE':\n  case 'teo-KE':\n    defaultPatterns = exports.DateIntervalPatterns_teo_KE;\n    break;\n  case 'teo_UG':\n  case 'teo-UG':\n    defaultPatterns = exports.DateIntervalPatterns_teo_UG;\n    break;\n  case 'tg':\n    defaultPatterns = exports.DateIntervalPatterns_tg;\n    break;\n  case 'tg_TJ':\n  case 'tg-TJ':\n    defaultPatterns = exports.DateIntervalPatterns_tg_TJ;\n    break;\n  case 'th_TH':\n  case 'th-TH':\n    defaultPatterns = exports.DateIntervalPatterns_th_TH;\n    break;\n  case 'ti':\n    defaultPatterns = exports.DateIntervalPatterns_ti;\n    break;\n  case 'ti_ER':\n  case 'ti-ER':\n    defaultPatterns = exports.DateIntervalPatterns_ti_ER;\n    break;\n  case 'ti_ET':\n  case 'ti-ET':\n    defaultPatterns = exports.DateIntervalPatterns_ti_ET;\n    break;\n  case 'tk':\n    defaultPatterns = exports.DateIntervalPatterns_tk;\n    break;\n  case 'tk_TM':\n  case 'tk-TM':\n    defaultPatterns = exports.DateIntervalPatterns_tk_TM;\n    break;\n  case 'to':\n    defaultPatterns = exports.DateIntervalPatterns_to;\n    break;\n  case 'to_TO':\n  case 'to-TO':\n    defaultPatterns = exports.DateIntervalPatterns_to_TO;\n    break;\n  case 'tr_CY':\n  case 'tr-CY':\n    defaultPatterns = exports.DateIntervalPatterns_tr_CY;\n    break;\n  case 'tr_TR':\n  case 'tr-TR':\n    defaultPatterns = exports.DateIntervalPatterns_tr_TR;\n    break;\n  case 'tt':\n    defaultPatterns = exports.DateIntervalPatterns_tt;\n    break;\n  case 'tt_RU':\n  case 'tt-RU':\n    defaultPatterns = exports.DateIntervalPatterns_tt_RU;\n    break;\n  case 'twq':\n    defaultPatterns = exports.DateIntervalPatterns_twq;\n    break;\n  case 'twq_NE':\n  case 'twq-NE':\n    defaultPatterns = exports.DateIntervalPatterns_twq_NE;\n    break;\n  case 'tzm':\n    defaultPatterns = exports.DateIntervalPatterns_tzm;\n    break;\n  case 'tzm_MA':\n  case 'tzm-MA':\n    defaultPatterns = exports.DateIntervalPatterns_tzm_MA;\n    break;\n  case 'ug':\n    defaultPatterns = exports.DateIntervalPatterns_ug;\n    break;\n  case 'ug_CN':\n  case 'ug-CN':\n    defaultPatterns = exports.DateIntervalPatterns_ug_CN;\n    break;\n  case 'uk_UA':\n  case 'uk-UA':\n    defaultPatterns = exports.DateIntervalPatterns_uk_UA;\n    break;\n  case 'ur_IN':\n  case 'ur-IN':\n    defaultPatterns = exports.DateIntervalPatterns_ur_IN;\n    break;\n  case 'ur_PK':\n  case 'ur-PK':\n    defaultPatterns = exports.DateIntervalPatterns_ur_PK;\n    break;\n  case 'uz_Arab':\n  case 'uz-Arab':\n    defaultPatterns = exports.DateIntervalPatterns_uz_Arab;\n    break;\n  case 'uz_Arab_AF':\n  case 'uz-Arab-AF':\n    defaultPatterns = exports.DateIntervalPatterns_uz_Arab_AF;\n    break;\n  case 'uz_Cyrl':\n  case 'uz-Cyrl':\n    defaultPatterns = exports.DateIntervalPatterns_uz_Cyrl;\n    break;\n  case 'uz_Cyrl_UZ':\n  case 'uz-Cyrl-UZ':\n    defaultPatterns = exports.DateIntervalPatterns_uz_Cyrl_UZ;\n    break;\n  case 'uz_Latn':\n  case 'uz-Latn':\n    defaultPatterns = exports.DateIntervalPatterns_uz_Latn;\n    break;\n  case 'uz_Latn_UZ':\n  case 'uz-Latn-UZ':\n    defaultPatterns = exports.DateIntervalPatterns_uz_Latn_UZ;\n    break;\n  case 'vai':\n    defaultPatterns = exports.DateIntervalPatterns_vai;\n    break;\n  case 'vai_Latn':\n  case 'vai-Latn':\n    defaultPatterns = exports.DateIntervalPatterns_vai_Latn;\n    break;\n  case 'vai_Latn_LR':\n  case 'vai-Latn-LR':\n    defaultPatterns = exports.DateIntervalPatterns_vai_Latn_LR;\n    break;\n  case 'vai_Vaii':\n  case 'vai-Vaii':\n    defaultPatterns = exports.DateIntervalPatterns_vai_Vaii;\n    break;\n  case 'vai_Vaii_LR':\n  case 'vai-Vaii-LR':\n    defaultPatterns = exports.DateIntervalPatterns_vai_Vaii_LR;\n    break;\n  case 'vi_VN':\n  case 'vi-VN':\n    defaultPatterns = exports.DateIntervalPatterns_vi_VN;\n    break;\n  case 'vun':\n    defaultPatterns = exports.DateIntervalPatterns_vun;\n    break;\n  case 'vun_TZ':\n  case 'vun-TZ':\n    defaultPatterns = exports.DateIntervalPatterns_vun_TZ;\n    break;\n  case 'wae':\n    defaultPatterns = exports.DateIntervalPatterns_wae;\n    break;\n  case 'wae_CH':\n  case 'wae-CH':\n    defaultPatterns = exports.DateIntervalPatterns_wae_CH;\n    break;\n  case 'wo':\n    defaultPatterns = exports.DateIntervalPatterns_wo;\n    break;\n  case 'wo_SN':\n  case 'wo-SN':\n    defaultPatterns = exports.DateIntervalPatterns_wo_SN;\n    break;\n  case 'xh':\n    defaultPatterns = exports.DateIntervalPatterns_xh;\n    break;\n  case 'xh_ZA':\n  case 'xh-ZA':\n    defaultPatterns = exports.DateIntervalPatterns_xh_ZA;\n    break;\n  case 'xog':\n    defaultPatterns = exports.DateIntervalPatterns_xog;\n    break;\n  case 'xog_UG':\n  case 'xog-UG':\n    defaultPatterns = exports.DateIntervalPatterns_xog_UG;\n    break;\n  case 'yav':\n    defaultPatterns = exports.DateIntervalPatterns_yav;\n    break;\n  case 'yav_CM':\n  case 'yav-CM':\n    defaultPatterns = exports.DateIntervalPatterns_yav_CM;\n    break;\n  case 'yi':\n    defaultPatterns = exports.DateIntervalPatterns_yi;\n    break;\n  case 'yi_001':\n  case 'yi-001':\n    defaultPatterns = exports.DateIntervalPatterns_yi_001;\n    break;\n  case 'yo':\n    defaultPatterns = exports.DateIntervalPatterns_yo;\n    break;\n  case 'yo_BJ':\n  case 'yo-BJ':\n    defaultPatterns = exports.DateIntervalPatterns_yo_BJ;\n    break;\n  case 'yo_NG':\n  case 'yo-NG':\n    defaultPatterns = exports.DateIntervalPatterns_yo_NG;\n    break;\n  case 'yue':\n    defaultPatterns = exports.DateIntervalPatterns_yue;\n    break;\n  case 'yue_Hans':\n  case 'yue-Hans':\n    defaultPatterns = exports.DateIntervalPatterns_yue_Hans;\n    break;\n  case 'yue_Hans_CN':\n  case 'yue-Hans-CN':\n    defaultPatterns = exports.DateIntervalPatterns_yue_Hans_CN;\n    break;\n  case 'yue_Hant':\n  case 'yue-Hant':\n    defaultPatterns = exports.DateIntervalPatterns_yue_Hant;\n    break;\n  case 'yue_Hant_HK':\n  case 'yue-Hant-HK':\n    defaultPatterns = exports.DateIntervalPatterns_yue_Hant_HK;\n    break;\n  case 'zgh':\n    defaultPatterns = exports.DateIntervalPatterns_zgh;\n    break;\n  case 'zgh_MA':\n  case 'zgh-MA':\n    defaultPatterns = exports.DateIntervalPatterns_zgh_MA;\n    break;\n  case 'zh_Hans':\n  case 'zh-Hans':\n    defaultPatterns = exports.DateIntervalPatterns_zh_Hans;\n    break;\n  case 'zh_Hans_CN':\n  case 'zh-Hans-CN':\n    defaultPatterns = exports.DateIntervalPatterns_zh_Hans_CN;\n    break;\n  case 'zh_Hans_HK':\n  case 'zh-Hans-HK':\n    defaultPatterns = exports.DateIntervalPatterns_zh_Hans_HK;\n    break;\n  case 'zh_Hans_MO':\n  case 'zh-Hans-MO':\n    defaultPatterns = exports.DateIntervalPatterns_zh_Hans_MO;\n    break;\n  case 'zh_Hans_SG':\n  case 'zh-Hans-SG':\n    defaultPatterns = exports.DateIntervalPatterns_zh_Hans_SG;\n    break;\n  case 'zh_Hant':\n  case 'zh-Hant':\n    defaultPatterns = exports.DateIntervalPatterns_zh_Hant;\n    break;\n  case 'zh_Hant_HK':\n  case 'zh-Hant-HK':\n    defaultPatterns = exports.DateIntervalPatterns_zh_Hant_HK;\n    break;\n  case 'zh_Hant_MO':\n  case 'zh-Hant-MO':\n    defaultPatterns = exports.DateIntervalPatterns_zh_Hant_MO;\n    break;\n  case 'zh_Hant_TW':\n  case 'zh-Hant-TW':\n    defaultPatterns = exports.DateIntervalPatterns_zh_Hant_TW;\n    break;\n  case 'zu_ZA':\n  case 'zu-ZA':\n    defaultPatterns = exports.DateIntervalPatterns_zu_ZA;\n    break;\n}\n\nif (defaultPatterns != null) {\n  dateIntervalPatterns.setDateIntervalPatterns(defaultPatterns);\n}\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.i18n.dateIntervalPatterns"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/dateintervalpatternsext.js"],"^:1",["^9K",["~$goog.i18n.dateIntervalPatternsExt"]],"^9<",true,"^9=",["^9>","^KH"]],["^ ","^9A",[1579837703000],"^9B","goog.graphics.pathelement.js","^9C",["^9D","goog/graphics/pathelement.js"],"^9E","goog/graphics/pathelement.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A thin wrapper around the DOM element for paths.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.graphics.PathElement');\n\ngoog.require('goog.graphics.StrokeAndFillElement');\n\n\n\n/**\n * Interface for a graphics path element.\n * You should not construct objects from this constructor. The graphics\n * will return an implementation of this interface for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.AbstractGraphics} graphics The graphics creating\n *     this element.\n * @param {goog.graphics.Stroke?} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill?} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.StrokeAndFillElement}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n */\ngoog.graphics.PathElement = function(element, graphics, stroke, fill) {\n  goog.graphics.StrokeAndFillElement.call(\n      this, element, graphics, stroke, fill);\n};\ngoog.inherits(goog.graphics.PathElement, goog.graphics.StrokeAndFillElement);\n\n\n/**\n * Update the underlying path.\n * @param {!goog.graphics.Path} path The path object to draw.\n */\ngoog.graphics.PathElement.prototype.setPath = goog.abstractMethod;\n","^9I",1579837703000,"^9J",["^9K",["^9>","^;A"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/pathelement.js"],"^:1",["^9K",["^@?"]],"^9<",true,"^9=",["^9>","^;A"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.linkbuttonrenderer.js","^9C",["^9D","goog/ui/linkbuttonrenderer.js"],"^9E","goog/ui/linkbuttonrenderer.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Similar to {@link goog.ui.FlatButtonRenderer},\n * but underlines text instead of adds borders.\n *\n * For accessibility reasons, it is best to use this with a goog.ui.Button\n * instead of an A element for links that perform actions in the page.  Links\n * that have an href and open a new page can and should remain as A elements.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.ui.LinkButtonRenderer');\n\ngoog.require('goog.ui.Button');\ngoog.require('goog.ui.FlatButtonRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Link renderer for {@link goog.ui.Button}s.  Link buttons can contain\n * almost arbitrary HTML content, will flow like inline elements, but can be\n * styled like block-level elements.\n * @constructor\n * @extends {goog.ui.FlatButtonRenderer}\n */\ngoog.ui.LinkButtonRenderer = function() {\n  goog.ui.FlatButtonRenderer.call(this);\n};\ngoog.inherits(goog.ui.LinkButtonRenderer, goog.ui.FlatButtonRenderer);\ngoog.addSingletonGetter(goog.ui.LinkButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.LinkButtonRenderer.CSS_CLASS = goog.getCssName('goog-link-button');\n\n\n/** @override */\ngoog.ui.LinkButtonRenderer.prototype.getCssClass = function() {\n  return goog.ui.LinkButtonRenderer.CSS_CLASS;\n};\n\n\n// Register a decorator factory function for Link Buttons.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.LinkButtonRenderer.CSS_CLASS, function() {\n      // Uses goog.ui.Button, but with LinkButtonRenderer.\n      return new goog.ui.Button(null, goog.ui.LinkButtonRenderer.getInstance());\n    });\n","^9I",1579837703000,"^9J",["^9K",["~$goog.ui.FlatButtonRenderer","^9>","^:>","^JU"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/linkbuttonrenderer.js"],"^:1",["^9K",["~$goog.ui.LinkButtonRenderer"]],"^9<",true,"^9=",["^9>","^JU","^KJ","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.editor.plugins.tagonenterhandler.js","^9C",["^9D","goog/editor/plugins/tagonenterhandler.js"],"^9E","goog/editor/plugins/tagonenterhandler.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview TrogEdit plugin to handle enter keys by inserting the\n * specified block level tag.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.editor.plugins.TagOnEnterHandler');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.Range');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.editor.Command');\ngoog.require('goog.editor.node');\ngoog.require('goog.editor.plugins.EnterHandler');\ngoog.require('goog.editor.range');\ngoog.require('goog.editor.style');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.functions');\ngoog.require('goog.string.Unicode');\ngoog.require('goog.style');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Plugin to handle enter keys. This subclass normalizes all browsers to use\n * the given block tag on enter.\n * @param {!goog.dom.TagName} tag The type of tag to add on enter.\n * @constructor\n * @extends {goog.editor.plugins.EnterHandler}\n */\ngoog.editor.plugins.TagOnEnterHandler = function(tag) {\n  this.tag = tag;\n\n  goog.editor.plugins.EnterHandler.call(this);\n};\ngoog.inherits(\n    goog.editor.plugins.TagOnEnterHandler, goog.editor.plugins.EnterHandler);\n\n\n/** @override */\ngoog.editor.plugins.TagOnEnterHandler.prototype.getTrogClassId = function() {\n  return 'TagOnEnterHandler';\n};\n\n\n/** @override */\ngoog.editor.plugins.TagOnEnterHandler.prototype.getNonCollapsingBlankHtml =\n    function() {\n  if (this.tag == goog.dom.TagName.P) {\n    return '<p>&nbsp;</p>';\n  } else if (this.tag == goog.dom.TagName.DIV) {\n    return '<div><br></div>';\n  }\n  return '<br>';\n};\n\n\n/**\n * This plugin is active on uneditable fields so it can provide a value for\n * queryCommandValue calls asking for goog.editor.Command.BLOCKQUOTE.\n * @return {boolean} True.\n * @override\n */\ngoog.editor.plugins.TagOnEnterHandler.prototype.activeOnUneditableFields =\n    goog.functions.TRUE;\n\n\n/** @override */\ngoog.editor.plugins.TagOnEnterHandler.prototype.isSupportedCommand = function(\n    command) {\n  return command == goog.editor.Command.DEFAULT_TAG;\n};\n\n\n/** @override */\ngoog.editor.plugins.TagOnEnterHandler.prototype.queryCommandValue = function(\n    command) {\n  return command == goog.editor.Command.DEFAULT_TAG ? String(this.tag) : null;\n};\n\n\n/** @override */\ngoog.editor.plugins.TagOnEnterHandler.prototype.handleBackspaceInternal =\n    function(e, range) {\n  goog.editor.plugins.TagOnEnterHandler.superClass_.handleBackspaceInternal\n      .call(this, e, range);\n\n  if (goog.userAgent.GECKO) {\n    this.markBrToNotBeRemoved_(range, true);\n  }\n};\n\n\n/** @override */\ngoog.editor.plugins.TagOnEnterHandler.prototype.processParagraphTagsInternal =\n    function(e, split) {\n  if ((goog.userAgent.OPERA || goog.userAgent.IE) &&\n      this.tag != goog.dom.TagName.P) {\n    this.ensureBlockIeOpera(this.tag);\n  }\n};\n\n\n/** @override */\ngoog.editor.plugins.TagOnEnterHandler.prototype.handleDeleteGecko = function(\n    e) {\n  var range = this.getFieldObject().getRange();\n  var container =\n      goog.editor.style.getContainer(range && range.getContainerElement());\n  if (this.getFieldObject().getElement().lastChild == container &&\n      goog.editor.plugins.EnterHandler.isBrElem(container)) {\n    // Don't delete if it's the last node in the field and just has a BR.\n    e.preventDefault();\n    // TODO(user): I think we probably don't need to stopPropagation here\n    e.stopPropagation();\n  } else {\n    // Go ahead with deletion.\n    // Prevent an existing BR immediately following the selection being deleted\n    // from being removed in the keyup stage (as opposed to a BR added by FF\n    // after deletion, which we do remove).\n    this.markBrToNotBeRemoved_(range, false);\n    // Manually delete the selection if it's at a BR.\n    this.deleteBrGecko(e);\n  }\n};\n\n\n/** @override */\ngoog.editor.plugins.TagOnEnterHandler.prototype.handleKeyUpInternal = function(\n    e) {\n  if (goog.userAgent.GECKO) {\n    if (e.keyCode == goog.events.KeyCodes.DELETE) {\n      this.removeBrIfNecessary_(false);\n    } else if (e.keyCode == goog.events.KeyCodes.BACKSPACE) {\n      this.removeBrIfNecessary_(true);\n    }\n  } else if (\n      (goog.userAgent.IE || goog.userAgent.OPERA) &&\n      e.keyCode == goog.events.KeyCodes.ENTER) {\n    this.ensureBlockIeOpera(this.tag, true);\n  }\n  // Safari uses DIVs by default.\n};\n\n\n/**\n * String that matches a single BR tag or NBSP surrounded by non-breaking\n * whitespace\n * @type {string}\n * @private\n */\ngoog.editor.plugins.TagOnEnterHandler.BrOrNbspSurroundedWithWhiteSpace_ =\n    '[\\t\\n\\r ]*(<br[^>]*\\/?>|&nbsp;)[\\t\\n\\r ]*';\n\n\n/**\n * String that matches a single BR tag or NBSP surrounded by non-breaking\n * whitespace\n * @type {RegExp}\n * @private\n */\ngoog.editor.plugins.TagOnEnterHandler.emptyLiRegExp_ = new RegExp(\n    '^' +\n    goog.editor.plugins.TagOnEnterHandler.BrOrNbspSurroundedWithWhiteSpace_ +\n    '$');\n\n\n/**\n * Ensures the current node is wrapped in the tag.\n * @param {Node} node The node to ensure gets wrapped.\n * @param {Element} container Element containing the selection.\n * @return {Element} Element containing the selection, after the wrapping.\n  * @private\n */\ngoog.editor.plugins.TagOnEnterHandler.prototype.ensureNodeIsWrappedW3c_ =\n    function(node, container) {\n  if (container == this.getFieldObject().getElement()) {\n    // If the first block-level ancestor of cursor is the field,\n    // don't split the tree. Find all the text from the cursor\n    // to both block-level elements surrounding it (if they exist)\n    // and split the text into two elements.\n    // This is the IE contentEditable behavior.\n\n    // The easy way to do this is to wrap all the text in an element\n    // and then split the element as if the user had hit enter\n    // in the paragraph\n\n    // However, simply wrapping the text into an element creates problems\n    // if the text was already wrapped using some other element such as an\n    // anchor.  For example, wrapping the text of\n    //   <a href=\"\">Text</a>\n    // would produce\n    //   <a href=\"\"><p>Text</p></a>\n    // which is not what we want.  What we really want is\n    //   <p><a href=\"\">Text</a></p>\n    // So we need to search for an ancestor of position.node to be wrapped.\n    // We do this by iterating up the hierarchy of postiion.node until we've\n    // reached the node that's just under the container.\n    var isChildOfFn = function(child) { return container == child.parentNode; };\n    var nodeToWrap = goog.dom.getAncestor(node, isChildOfFn, true);\n    container = goog.editor.plugins.TagOnEnterHandler.wrapInContainerW3c_(\n        String(this.tag), {node: nodeToWrap, offset: 0}, container);\n  }\n  return container;\n};\n\n\n/** @override */\ngoog.editor.plugins.TagOnEnterHandler.prototype.handleEnterWebkitInternal =\n    function(e) {\n  if (this.tag == goog.dom.TagName.DIV) {\n    var range = this.getFieldObject().getRange();\n    var container = goog.editor.style.getContainer(range.getContainerElement());\n\n    var position = goog.editor.range.getDeepEndPoint(range, true);\n    container = this.ensureNodeIsWrappedW3c_(position.node, container);\n    goog.dom.Range.createCaret(position.node, position.offset).select();\n  }\n};\n\n\n/** @override */\ngoog.editor.plugins.TagOnEnterHandler.prototype\n    .handleEnterAtCursorGeckoInternal = function(e, wasCollapsed, range) {\n  // We use this because there are a few cases where FF default\n  // implementation doesn't follow IE's:\n  //   -Inserts BRs into empty elements instead of NBSP which has nasty\n  //    side effects w/ making/deleting selections\n  //   -Hitting enter when your cursor is in the field itself. IE will\n  //    create two elements. FF just inserts a BR.\n  //   -Hitting enter inside an empty list-item doesn't create a block\n  //    tag. It just splits the list and puts your cursor in the middle.\n  var li = null;\n  if (wasCollapsed) {\n    // Only break out of lists for collapsed selections.\n    li = goog.dom.getAncestorByTagNameAndClass(\n        range && range.getContainerElement(), goog.dom.TagName.LI);\n  }\n  var isEmptyLi =\n      (li &&\n       li.innerHTML.match(\n           goog.editor.plugins.TagOnEnterHandler.emptyLiRegExp_));\n  var elementAfterCursor = isEmptyLi ? this.breakOutOfEmptyListItemGecko_(li) :\n                                       this.handleRegularEnterGecko_();\n\n  // Move the cursor in front of \"nodeAfterCursor\", and make sure it\n  // is visible\n  this.scrollCursorIntoViewGecko_(elementAfterCursor);\n\n  // Fix for http://b/1991234 :\n  if (goog.editor.plugins.EnterHandler.isBrElem(elementAfterCursor)) {\n    // The first element in the new line is a line with just a BR and maybe some\n    // whitespace.\n    // Calling normalize() is needed because there might be empty text nodes\n    // before BR and empty text nodes cause the cursor position bug in Firefox.\n    // See http://b/5220858\n    elementAfterCursor.normalize();\n    var br = goog.dom.getElementsByTagName(\n        goog.dom.TagName.BR, elementAfterCursor)[0];\n    if (br.previousSibling &&\n        br.previousSibling.nodeType == goog.dom.NodeType.TEXT) {\n      // If there is some whitespace before the BR, don't put the selection on\n      // the BR, put it in the text node that's there, otherwise when you type\n      // it will create adjacent text nodes.\n      elementAfterCursor = br.previousSibling;\n    }\n  }\n\n  goog.editor.range.selectNodeStart(elementAfterCursor);\n\n  e.preventDefault();\n  // TODO(user): I think we probably don't need to stopPropagation here\n  e.stopPropagation();\n};\n\n\n/**\n * If The cursor is in an empty LI then break out of the list like in IE\n * @param {Node} li LI to break out of.\n * @return {!Element} Element to put the cursor after.\n * @private\n */\ngoog.editor.plugins.TagOnEnterHandler.prototype.breakOutOfEmptyListItemGecko_ =\n    function(li) {\n  // Do this as follows:\n  // 1. <ul>...<li>&nbsp;</li>...</ul>\n  // 2. <ul id='foo1'>...<li id='foo2'>&nbsp;</li>...</ul>\n  // 3. <ul id='foo1'>...</ul><p id='foo3'>&nbsp;</p><ul id='foo2'>...</ul>\n  // 4. <ul>...</ul><p>&nbsp;</p><ul>...</ul>\n  //\n  // There are a couple caveats to the above. If the UL is contained in\n  // a list, then the new node inserted is an LI, not a P.\n  // For an OL, it's all the same, except the tagname of course.\n  // Finally, it's possible that with the LI at the beginning or the end\n  // of the list that we'll end up with an empty list. So we special case\n  // those cases.\n\n  var listNode = li.parentNode;\n  var grandparent = listNode.parentNode;\n  var inSubList = grandparent.tagName == goog.dom.TagName.OL ||\n      grandparent.tagName == goog.dom.TagName.UL;\n\n  // TODO(robbyw): Should we apply the list or list item styles to the new node?\n  var newNode = goog.dom.getDomHelper(li).createElement(\n      inSubList ? goog.dom.TagName.LI : this.tag);\n\n  if (!li.previousSibling) {\n    goog.dom.insertSiblingBefore(newNode, listNode);\n  } else {\n    if (li.nextSibling) {\n      var listClone = listNode.cloneNode(false);\n      while (li.nextSibling) {\n        listClone.appendChild(li.nextSibling);\n      }\n      goog.dom.insertSiblingAfter(listClone, listNode);\n    }\n    goog.dom.insertSiblingAfter(newNode, listNode);\n  }\n  if (goog.editor.node.isEmpty(listNode)) {\n    goog.dom.removeNode(listNode);\n  }\n  goog.dom.removeNode(li);\n  newNode.innerHTML = '&nbsp;';\n\n  return newNode;\n};\n\n\n/**\n * Wrap the text indicated by \"position\" in an HTML container of type\n * \"nodeName\".\n * @param {string} nodeName Type of container, e.g. \"p\" (paragraph).\n * @param {Object} position The W3C cursor position object\n *     (from getCursorPositionW3c).\n * @param {Node} container The field containing position.\n * @return {!Element} The container element that holds the contents from\n *     position.\n * @private\n */\ngoog.editor.plugins.TagOnEnterHandler.wrapInContainerW3c_ = function(\n    nodeName, position, container) {\n  var start = position.node;\n  while (start.previousSibling &&\n         !goog.editor.style.isContainer(start.previousSibling)) {\n    start = start.previousSibling;\n  }\n\n  var end = position.node;\n  while (end.nextSibling && !goog.editor.style.isContainer(end.nextSibling)) {\n    end = end.nextSibling;\n  }\n\n  var para = container.ownerDocument.createElement(nodeName);\n  while (start != end) {\n    var newStart = start.nextSibling;\n    goog.dom.appendChild(para, start);\n    start = newStart;\n  }\n  var nextSibling = end.nextSibling;\n  goog.dom.appendChild(para, end);\n  container.insertBefore(para, nextSibling);\n\n  return para;\n};\n\n\n/**\n * When we delete an element, FF inserts a BR. We want to strip that\n * BR after the fact, but in the case where your cursor is at a character\n * right before a BR and you delete that character, we don't want to\n * strip it. So we detect this case on keydown and mark the BR as not needing\n * removal.\n * @param {goog.dom.AbstractRange} range The closure range object.\n * @param {boolean} isBackspace Whether this is handling the backspace key.\n * @private\n */\ngoog.editor.plugins.TagOnEnterHandler.prototype.markBrToNotBeRemoved_ =\n    function(range, isBackspace) {\n  var focusNode = range.getFocusNode();\n  var focusOffset = range.getFocusOffset();\n  var newEndOffset = isBackspace ? focusOffset : focusOffset + 1;\n\n  if (goog.editor.node.getLength(focusNode) == newEndOffset) {\n    var sibling = focusNode.nextSibling;\n    if (sibling && sibling.tagName == goog.dom.TagName.BR) {\n      this.brToKeep_ = sibling;\n    }\n  }\n};\n\n\n/**\n * If we hit delete/backspace to merge elements, FF inserts a BR.\n * We want to strip that BR. In markBrToNotBeRemoved, we detect if\n * there was already a BR there before the delete/backspace so that\n * we don't accidentally remove a user-inserted BR.\n * @param {boolean} isBackSpace Whether this is handling the backspace key.\n * @private\n */\ngoog.editor.plugins.TagOnEnterHandler.prototype.removeBrIfNecessary_ = function(\n    isBackSpace) {\n  var range = this.getFieldObject().getRange();\n  var focusNode = range.getFocusNode();\n  var focusOffset = range.getFocusOffset();\n\n  var sibling;\n  if (isBackSpace && focusNode.data == '') {\n    // nasty hack. sometimes firefox will backspace a paragraph and put\n    // the cursor before the BR. when it does this, the focusNode is\n    // an empty textnode.\n    sibling = focusNode.nextSibling;\n  } else if (isBackSpace && focusOffset == 0) {\n    var node = focusNode;\n    while (node && !node.previousSibling &&\n           node.parentNode != this.getFieldObject().getElement()) {\n      node = node.parentNode;\n    }\n    sibling = node.previousSibling;\n  } else if (focusNode.length == focusOffset) {\n    sibling = focusNode.nextSibling;\n  }\n\n  if (!sibling || sibling.tagName != goog.dom.TagName.BR ||\n      this.brToKeep_ == sibling) {\n    return;\n  }\n\n  goog.dom.removeNode(sibling);\n  if (focusNode.nodeType == goog.dom.NodeType.TEXT) {\n    // Sometimes firefox inserts extra whitespace. Do our best to deal.\n    // This is buggy though.\n    /** @type {!Text} */ (focusNode).data =\n        goog.editor.plugins.TagOnEnterHandler.trimTabsAndLineBreaks_(\n            focusNode.data);\n    // When we strip whitespace, make sure that our cursor is still at\n    // the end of the textnode.\n    goog.dom.Range\n        .createCaret(focusNode, Math.min(focusOffset, focusNode.length))\n        .select();\n  }\n};\n\n\n/**\n * Trim the tabs and line breaks from a string.\n * @param {string} string String to trim.\n * @return {string} Trimmed string.\n * @private\n */\ngoog.editor.plugins.TagOnEnterHandler.trimTabsAndLineBreaks_ = function(\n    string) {\n  return string.replace(/^[\\t\\n\\r]|[\\t\\n\\r]$/g, '');\n};\n\n\n/**\n * Called in response to a normal enter keystroke. It has the action of\n * splitting elements.\n * @return {Element} The node that the cursor should be before.\n * @private\n */\ngoog.editor.plugins.TagOnEnterHandler.prototype.handleRegularEnterGecko_ =\n    function() {\n  var range = this.getFieldObject().getRange();\n  var container = goog.editor.style.getContainer(range.getContainerElement());\n  var newNode;\n  if (goog.editor.plugins.EnterHandler.isBrElem(container)) {\n    if (container.tagName == goog.dom.TagName.BODY) {\n      // If the field contains only a single BR, this code ensures we don't\n      // try to clone the body tag.\n      container = this.ensureNodeIsWrappedW3c_(\n          goog.dom.getElementsByTagName(goog.dom.TagName.BR, container)[0],\n          container);\n    }\n\n    newNode = container.cloneNode(true);\n    goog.dom.insertSiblingAfter(newNode, container);\n  } else {\n    if (!container.firstChild) {\n      container.innerHTML = '&nbsp;';\n    }\n\n    var position = goog.editor.range.getDeepEndPoint(range, true);\n    container = this.ensureNodeIsWrappedW3c_(position.node, container);\n\n    newNode = goog.editor.plugins.TagOnEnterHandler.splitDomAndAppend_(\n        position.node, position.offset, container);\n\n    // If the left half and right half of the splitted node are anchors then\n    // that means the user pressed enter while the caret was inside\n    // an anchor tag and split it.  The left half is the first anchor\n    // found while traversing the right branch of container.  The right half\n    // is the first anchor found while traversing the left branch of newNode.\n    var leftAnchor =\n        goog.editor.plugins.TagOnEnterHandler.findAnchorInTraversal_(container);\n    var rightAnchor =\n        goog.editor.plugins.TagOnEnterHandler.findAnchorInTraversal_(\n            newNode, true);\n    if (leftAnchor && rightAnchor && leftAnchor.tagName == goog.dom.TagName.A &&\n        rightAnchor.tagName == goog.dom.TagName.A) {\n      // If the original anchor (left anchor) is now empty, that means\n      // the user pressed [Enter] at the beginning of the anchor,\n      // in which case we we\n      // want to replace that anchor with its child nodes\n      // Otherwise, we take the second half of the splitted text and break\n      // it out of the anchor.\n      var anchorToRemove = goog.editor.node.isEmpty(leftAnchor, false) ?\n          leftAnchor :\n          rightAnchor;\n      goog.dom.flattenElement(/** @type {!Element} */ (anchorToRemove));\n    }\n  }\n  return /** @type {!Element} */ (newNode);\n};\n\n\n/**\n * Scroll the cursor into view, resulting from splitting the paragraph/adding\n * a br. It behaves differently than scrollIntoView\n * @param {Element} element The element immediately following the cursor. Will\n *     be used to determine how to scroll in order to make the cursor visible.\n *     CANNOT be a BR, as they do not have offsetHeight/offsetTop.\n * @private\n */\ngoog.editor.plugins.TagOnEnterHandler.prototype.scrollCursorIntoViewGecko_ =\n    function(element) {\n  if (!this.getFieldObject().isFixedHeight()) {\n    return;  // Only need to scroll fixed height fields.\n  }\n\n  var field = this.getFieldObject().getElement();\n\n  // Get the y position of the element we want to scroll to\n  var elementY = goog.style.getPageOffsetTop(element);\n\n  // Determine the height of that element, since we want the bottom of the\n  // element to be in view.\n  var bottomOfNode = elementY +\n      /** @type {!HTMLElement} */ (element).offsetHeight;\n\n  var dom = this.getFieldDomHelper();\n  var win = this.getFieldDomHelper().getWindow();\n  var scrollY = dom.getDocumentScroll().y;\n  var viewportHeight = goog.dom.getViewportSize(win).height;\n\n  // If the botom of the element is outside the viewport, move it into view\n  if (bottomOfNode > viewportHeight + scrollY) {\n    // In standards mode, use the html element and not the body\n    if (field.tagName == goog.dom.TagName.BODY &&\n        goog.editor.node.isStandardsMode(field)) {\n      field = field.parentNode;\n    }\n    field.scrollTop = bottomOfNode - viewportHeight;\n  }\n};\n\n\n/**\n * Splits the DOM tree around the given node and returns the node\n * containing the second half of the tree. The first half of the tree\n * is modified, but not removed from the DOM.\n * @param {Node} positionNode Node to split at.\n * @param {number} positionOffset Offset into positionNode to split at.  If\n *     positionNode is a text node, this offset is an offset in to the text\n *     content of that node.  Otherwise, positionOffset is an offset in to\n *     the childNodes array.  All elements with child index of  positionOffset\n *     or greater will be moved to the second half.  If positionNode is an\n *     empty element, the dom will be split at that element, with positionNode\n *     ending up in the second half.  positionOffset must be 0 in this case.\n * @param {Node=} opt_root Node at which to stop splitting the dom (the root\n *     is also split).\n * @return {!Node} The node containing the second half of the tree.\n * @private\n */\ngoog.editor.plugins.TagOnEnterHandler.splitDom_ = function(\n    positionNode, positionOffset, opt_root) {\n  if (!opt_root) opt_root = positionNode.ownerDocument.body;\n\n  // Split the node.\n  var textSplit = positionNode.nodeType == goog.dom.NodeType.TEXT;\n  /** @type {?Node} */\n  var secondHalfOfSplitNode = null;\n  if (textSplit) {\n    if (goog.userAgent.IE && positionOffset == positionNode.nodeValue.length) {\n      // Since splitText fails in IE at the end of a node, we split it manually.\n      secondHalfOfSplitNode =\n          goog.dom.getDomHelper(positionNode).createTextNode('');\n      goog.dom.insertSiblingAfter(secondHalfOfSplitNode, positionNode);\n    } else {\n      secondHalfOfSplitNode = positionNode.splitText(positionOffset);\n    }\n  } else {\n    // Here we ensure positionNode is the last node in the first half of the\n    // resulting tree.\n    if (positionOffset) {\n      // Use offset as an index in to childNodes.\n      positionNode = positionNode.childNodes[positionOffset - 1];\n    } else {\n      // In this case, positionNode would be the last node in the first half\n      // of the tree, but we actually want to move it to the second half.\n      // Therefore we set secondHalfOfSplitNode to the same node.\n      positionNode = secondHalfOfSplitNode =\n          positionNode.firstChild || positionNode;\n    }\n  }\n\n  // Create second half of the tree.\n  var secondHalf = goog.editor.node.splitDomTreeAt(\n      positionNode, secondHalfOfSplitNode, opt_root);\n\n  if (textSplit) {\n    // Join secondHalfOfSplitNode and its right text siblings together and\n    // then replace leading NonNbspWhiteSpace with a Nbsp.  If\n    // secondHalfOfSplitNode has a right sibling that isn't a text node,\n    // then we can leave secondHalfOfSplitNode empty.\n    secondHalfOfSplitNode =\n        goog.editor.plugins.TagOnEnterHandler.joinTextNodes_(\n            secondHalfOfSplitNode, true);\n    goog.editor.plugins.TagOnEnterHandler.replaceWhiteSpaceWithNbsp_(\n        secondHalfOfSplitNode, true, !!secondHalfOfSplitNode.nextSibling);\n\n    // Join positionNode and its left text siblings together and then replace\n    // trailing NonNbspWhiteSpace with a Nbsp.\n    var firstHalf = goog.editor.plugins.TagOnEnterHandler.joinTextNodes_(\n        positionNode, false);\n    goog.editor.plugins.TagOnEnterHandler.replaceWhiteSpaceWithNbsp_(\n        firstHalf, false, false);\n  }\n\n  return secondHalf;\n};\n\n\n/**\n * Splits the DOM tree around the given node and returns the node containing\n * second half of the tree, which is appended after the old node.  The first\n * half of the tree is modified, but not removed from the DOM.\n * @param {Node} positionNode Node to split at.\n * @param {number} positionOffset Offset into positionNode to split at.  If\n *     positionNode is a text node, this offset is an offset in to the text\n *     content of that node.  Otherwise, positionOffset is an offset in to\n *     the childNodes array.  All elements with child index of  positionOffset\n *     or greater will be moved to the second half.  If positionNode is an\n *     empty element, the dom will be split at that element, with positionNode\n *     ending up in the second half.  positionOffset must be 0 in this case.\n * @param {Node} node Node to split.\n * @return {!Node} The node containing the second half of the tree.\n * @private\n */\ngoog.editor.plugins.TagOnEnterHandler.splitDomAndAppend_ = function(\n    positionNode, positionOffset, node) {\n  var newNode = goog.editor.plugins.TagOnEnterHandler.splitDom_(\n      positionNode, positionOffset, node);\n  goog.dom.insertSiblingAfter(newNode, node);\n  return newNode;\n};\n\n\n/**\n * Joins node and its adjacent text nodes together.\n * @param {Node} node The node to start joining.\n * @param {boolean} moveForward Determines whether to join left siblings (false)\n *     or right siblings (true).\n * @return {Node} The joined text node.\n * @private\n */\ngoog.editor.plugins.TagOnEnterHandler.joinTextNodes_ = function(\n    node, moveForward) {\n  if (node && node.nodeName == '#text') {\n    var nextNodeFn = moveForward ? 'nextSibling' : 'previousSibling';\n    var prevNodeFn = moveForward ? 'previousSibling' : 'nextSibling';\n    var nodeValues = [node.nodeValue];\n    while (node[nextNodeFn] &&\n           node[nextNodeFn].nodeType == goog.dom.NodeType.TEXT) {\n      node = node[nextNodeFn];\n      nodeValues.push(node.nodeValue);\n      goog.dom.removeNode(node[prevNodeFn]);\n    }\n    if (!moveForward) {\n      nodeValues.reverse();\n    }\n    node.nodeValue = nodeValues.join('');\n  }\n  return node;\n};\n\n\n/**\n * Replaces leading or trailing spaces of a text node to a single Nbsp.\n * @param {Node} textNode The text node to search and replace white spaces.\n * @param {boolean} fromStart Set to true to replace leading spaces, false to\n *     replace trailing spaces.\n * @param {boolean} isLeaveEmpty Set to true to leave the node empty if the\n *     text node was empty in the first place, otherwise put a Nbsp into the\n *     text node.\n * @private\n */\ngoog.editor.plugins.TagOnEnterHandler.replaceWhiteSpaceWithNbsp_ = function(\n    textNode, fromStart, isLeaveEmpty) {\n  var regExp = fromStart ? /^[ \\t\\r\\n]+/ : /[ \\t\\r\\n]+$/;\n  textNode.nodeValue =\n      textNode.nodeValue.replace(regExp, goog.string.Unicode.NBSP);\n\n  if (!isLeaveEmpty && textNode.nodeValue == '') {\n    textNode.nodeValue = goog.string.Unicode.NBSP;\n  }\n};\n\n\n/**\n * Finds the first A element in a traversal from the input node.  The input\n * node itself is not included in the search.\n * @param {Node} node The node to start searching from.\n * @param {boolean=} opt_useFirstChild Whether to traverse along the first child\n *     (true) or last child (false).\n * @return {Node} The first anchor node found in the search, or null if none\n *     was found.\n * @private\n */\ngoog.editor.plugins.TagOnEnterHandler.findAnchorInTraversal_ = function(\n    node, opt_useFirstChild) {\n  while ((node = opt_useFirstChild ? node.firstChild : node.lastChild) &&\n         node.tagName != goog.dom.TagName.A) {\n    // Do nothing - advancement is handled in the condition.\n  }\n  return node;\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","~$goog.editor.plugins.EnterHandler","^;<","^=B","^@Z","~$goog.editor.range","^9>","^:S","^<3","^??","^>M","^JL","^=F","^>R","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/tagonenterhandler.js"],"^:1",["^9K",["~$goog.editor.plugins.TagOnEnterHandler"]],"^9<",true,"^9=",["^9>","^;;","^=B","^=F","^;=","^@Z","^??","^KL","^KM","^JL","^>R","^;<","^>M","^<3","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.media.youtube.js","^9C",["^9D","goog/ui/media/youtube.js"],"^9E","goog/ui/media/youtube.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview provides a reusable youtube UI component given a youtube data\n * model.\n *\n * goog.ui.media.Youtube is actually a {@link goog.ui.ControlRenderer}, a\n * stateless class - that could/should be used as a Singleton with the static\n * method `goog.ui.media.Youtube.getInstance` -, that knows how to render\n * youtube videos. It is designed to be used with a {@link goog.ui.Control},\n * which will actually control the media renderer and provide the\n * {@link goog.ui.Component} base. This design guarantees that all different\n * types of medias will behave alike but will look different.\n *\n * goog.ui.media.Youtube expects `goog.ui.media.YoutubeModel` on\n * `goog.ui.Control.getModel` as data models, and render a flash object\n * that will play that URL.\n *\n * Example of usage:\n *\n * <pre>\n *   var video = goog.ui.media.YoutubeModel.newInstance(\n *       'https://www.youtube.com/watch?v=ddl5f44spwQ');\n *   goog.ui.media.Youtube.newControl(video).render();\n * </pre>\n *\n * youtube medias currently support the following states:\n *\n * <ul>\n *   <li> {@link goog.ui.Component.State.DISABLED}: shows 'flash not available'\n *   <li> {@link goog.ui.Component.State.HOVER}: mouse cursor is over the video\n *   <li> {@link !goog.ui.Component.State.SELECTED}: a static thumbnail is shown\n *   <li> {@link goog.ui.Component.State.SELECTED}: video is playing\n * </ul>\n *\n * Which can be accessed by\n * <pre>\n *   youtube.setEnabled(true);\n *   youtube.setHighlighted(true);\n *   youtube.setSelected(true);\n * </pre>\n *\n * This package also provides a few static auxiliary methods, such as:\n *\n * <pre>\n * var videoId = goog.ui.media.Youtube.parseUrl(\n *     'https://www.youtube.com/watch?v=ddl5f44spwQ');\n * </pre>\n *\n * Requires flash to actually work.\n *\n */\n\n\ngoog.provide('goog.ui.media.Youtube');\ngoog.provide('goog.ui.media.YoutubeModel');\n\ngoog.require('goog.dom.TagName');\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.string');\ngoog.require('goog.string.Const');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.media.FlashObject');\ngoog.require('goog.ui.media.Media');\ngoog.require('goog.ui.media.MediaModel');\ngoog.require('goog.ui.media.MediaRenderer');\n\n\n\n/**\n * Subclasses a goog.ui.media.MediaRenderer to provide a Youtube specific media\n * renderer.\n *\n * This class knows how to parse youtube urls, and render the DOM structure\n * of youtube video players and previews. This class is meant to be used as a\n * singleton static stateless class, that takes `goog.ui.media.Media`\n * instances and renders it. It expects `goog.ui.media.Media.getModel` to\n * return a well formed, previously constructed, youtube video id, which is the\n * data model this renderer will use to construct the DOM structure.\n * {@see goog.ui.media.Youtube.newControl} for a example of constructing a\n * control with this renderer.\n *\n * goog.ui.media.Youtube currently supports all {@link goog.ui.Component.State}.\n * It will change its DOM structure between SELECTED and !SELECTED, and rely on\n * CSS definitions on the others. On !SELECTED, the renderer will render a\n * youtube static `<img>`, with a thumbnail of the video. On SELECTED, the\n * renderer will append to the DOM a flash object, that contains the youtube\n * video.\n *\n * This design is patterned after http://go/closure_control_subclassing\n *\n * It uses {@link goog.ui.media.FlashObject} to embed the flash object.\n *\n * @constructor\n * @extends {goog.ui.media.MediaRenderer}\n * @final\n */\ngoog.ui.media.Youtube = function() {\n  goog.ui.media.MediaRenderer.call(this);\n};\ngoog.inherits(goog.ui.media.Youtube, goog.ui.media.MediaRenderer);\ngoog.addSingletonGetter(goog.ui.media.Youtube);\n\n\n/**\n * A static convenient method to construct a goog.ui.media.Media control out of\n * a youtube model. It sets it as the data model goog.ui.media.Youtube renderer\n * uses, sets the states supported by the renderer, and returns a Control that\n * binds everything together. This is what you should be using for constructing\n * Youtube videos, except if you need finer control over the configuration.\n *\n * @param {goog.ui.media.YoutubeModel} youtubeModel The youtube data model.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @return {!goog.ui.media.Media} A Control binded to the youtube renderer.\n */\ngoog.ui.media.Youtube.newControl = function(youtubeModel, opt_domHelper) {\n  var control = new goog.ui.media.Media(\n      youtubeModel, goog.ui.media.Youtube.getInstance(), opt_domHelper);\n  control.setStateInternal(goog.ui.Component.State.ACTIVE);\n  return control;\n};\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.media.Youtube.CSS_CLASS = goog.getCssName('goog-ui-media-youtube');\n\n\n/**\n * Changes the state of a `control`. Currently only changes the DOM\n * structure when the youtube movie is SELECTED (by default fired by a MOUSEUP\n * on the thumbnail), which means we have to embed the youtube flash video and\n * play it.\n *\n * @param {goog.ui.Control} c The media control.\n * @param {goog.ui.Component.State} state The state to be set or cleared.\n * @param {boolean} enable Whether the state is enabled or disabled.\n * @override\n */\ngoog.ui.media.Youtube.prototype.setState = function(c, state, enable) {\n  var control = /** @type {goog.ui.media.Media} */ (c);\n  goog.ui.media.Youtube.superClass_.setState.call(this, control, state, enable);\n\n  // control.createDom has to be called before any state is set.\n  // Use control.setStateInternal if you need to set states\n  if (!control.getElement()) {\n    throw new Error(goog.ui.Component.Error.STATE_INVALID);\n  }\n\n  var domHelper = control.getDomHelper();\n  var dataModel =\n      /** @type {goog.ui.media.YoutubeModel} */ (control.getDataModel());\n\n  if (!!(state & goog.ui.Component.State.SELECTED) && enable) {\n    var flashEls = domHelper.getElementsByTagNameAndClass(\n        goog.dom.TagName.DIV, goog.ui.media.FlashObject.CSS_CLASS,\n        control.getElement());\n    if (flashEls.length > 0) {\n      return;\n    }\n    var youtubeFlash = new goog.ui.media.FlashObject(\n        dataModel.getPlayer().getTrustedResourceUrl(), domHelper);\n    control.addChild(youtubeFlash, true);\n  }\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n *\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.media.Youtube.prototype.getCssClass = function() {\n  return goog.ui.media.Youtube.CSS_CLASS;\n};\n\n\n\n/**\n * The `goog.ui.media.Youtube` media data model. It stores a required\n * `videoId` field, sets the youtube URL, and allows a few optional\n * parameters.\n *\n * @param {string} videoId The youtube video id.\n * @param {string=} opt_caption An optional caption of the youtube video.\n * @param {string=} opt_description An optional description of the youtube\n *     video.\n * @constructor\n * @extends {goog.ui.media.MediaModel}\n * @final\n */\ngoog.ui.media.YoutubeModel = function(videoId, opt_caption, opt_description) {\n  goog.ui.media.MediaModel.call(\n      this, goog.ui.media.YoutubeModel.buildUrl(videoId), opt_caption,\n      opt_description, goog.ui.media.MediaModel.MimeType.FLASH);\n\n  /**\n   * The Youtube video id.\n   * @type {string}\n   * @private\n   */\n  this.videoId_ = videoId;\n\n  this.setThumbnails([new goog.ui.media.MediaModel.Thumbnail(\n      goog.ui.media.YoutubeModel.getThumbnailUrl(videoId))]);\n\n  this.setPlayer(\n      new goog.ui.media.MediaModel.Player(\n          goog.ui.media.YoutubeModel.getFlashUrl(videoId, true)));\n};\ngoog.inherits(goog.ui.media.YoutubeModel, goog.ui.media.MediaModel);\n\n\n/**\n * A youtube regular expression matcher. It matches the VIDEOID of URLs like\n * https://www.youtube.com/watch?v=VIDEOID. Based on:\n * googledata/contentonebox/opencob/specs/common/YTPublicExtractorCard.xml\n * @type {RegExp}\n * @private\n * @const\n */\n// Be careful about the placement of the dashes in the character classes. Eg,\n// use \"[\\\\w=-]\" instead of \"[\\\\w-=]\" if you mean to include the dash as a\n// character and not create a character range like \"[a-f]\".\ngoog.ui.media.YoutubeModel.MATCHER_ = new RegExp(\n    // Lead in.\n    'https?://(?:[a-zA-Z]{1,3}\\\\.)?' +\n        // Watch short URL prefix and /embed/ URLs. This should handle URLs\n        // like:\n        // https://youtu.be/jqxENMKaeCU?cgiparam=value\n        // https://youtube.com/embed/jqxENMKaeCU?cgiparam=value\n        // https://youtube-nocookie.com/jqxENMKaeCU?cgiparam=value\n        '(?:(?:(?:youtu\\\\.be|youtube(?:-nocookie)?\\\\.com/embed)/([\\\\w-]+)(?:\\\\?[\\\\w=&-]+)?)|' +\n        // Watch URL prefix.  This should handle new URLs of the form:\n        // https://www.youtube.com/watch#!v=jqxENMKaeCU&feature=related\n        // https://www.youtube-nocookie.com/watch#!v=jqxENMKaeCU&feature=related\n        // where the parameters appear after \"#!\" instead of \"?\".\n        '(?:youtube(?:-nocookie)?\\\\.com/watch)' +\n        // Get the video id:\n        // The video ID is a parameter v=[videoid] either right after the \"?\"\n        // or after some other parameters.\n        '(?:\\\\?(?:[\\\\w=-]+&(?:amp;)?)*v=([\\\\w-]+)' +\n        '(?:&(?:amp;)?[\\\\w=-]+)*)?' +\n        // Get any extra arguments in the URL's hash part.\n        '(?:#[!]?(?:' +\n        // Video ID from the v=[videoid] parameter, optionally surrounded by\n        // other\n        // & separated parameters.\n        '(?:(?:[\\\\w=-]+&(?:amp;)?)*(?:v=([\\\\w-]+))' +\n        '(?:&(?:amp;)?[\\\\w=-]+)*)' +\n        '|' +\n        // Continue supporting \"?\" for the video ID\n        // and \"#\" for other hash parameters.\n        '(?:[\\\\w=&-]+)' +\n        '))?)' +\n        // Should terminate with a non-word, non-dash (-) character.\n        '[^\\\\w-]?',\n    'i');\n\n\n/**\n * A auxiliary static method that parses a youtube URL, extracting the ID of the\n * video, and builds a YoutubeModel.\n *\n * @param {string} youtubeUrl A youtube URL.\n * @param {string=} opt_caption An optional caption of the youtube video.\n * @param {string=} opt_description An optional description of the youtube\n *     video.\n * @return {!goog.ui.media.YoutubeModel} The data model that represents the\n *     youtube URL.\n * @see goog.ui.media.YoutubeModel.getVideoId()\n * @throws Error in case the parsing fails.\n */\ngoog.ui.media.YoutubeModel.newInstance = function(\n    youtubeUrl, opt_caption, opt_description) {\n  var extract = goog.ui.media.YoutubeModel.MATCHER_.exec(youtubeUrl);\n  if (extract) {\n    var videoId = extract[1] || extract[2] || extract[3];\n    return new goog.ui.media.YoutubeModel(\n        videoId, opt_caption, opt_description);\n  }\n\n  throw new Error('failed to parse video id from youtube url: ' + youtubeUrl);\n};\n\n\n/**\n * The opposite of `goog.ui.media.Youtube.newInstance`: it takes a videoId\n * and returns a youtube URL.\n *\n * @param {string} videoId The youtube video ID.\n * @return {string} The youtube URL.\n */\ngoog.ui.media.YoutubeModel.buildUrl = function(videoId) {\n  return 'https://www.youtube.com/watch?v=' + goog.string.urlEncode(videoId);\n};\n\n\n/**\n * A static auxiliary method that builds a static image URL with a preview of\n * the youtube video.\n *\n * NOTE(user): patterned after Gmail's gadgets/youtube,\n *\n * TODO(user): how do I specify the width/height of the resulting image on the\n * url ? is there an official API for https://ytimg.com ?\n *\n * @param {string} youtubeId The youtube video ID.\n * @return {string} An URL that contains an image with a preview of the youtube\n *     movie.\n */\ngoog.ui.media.YoutubeModel.getThumbnailUrl = function(youtubeId) {\n  return 'https://i.ytimg.com/vi/' + youtubeId + '/default.jpg';\n};\n\n\n/**\n * A static auxiliary method that builds URL of the flash movie to be embedded,\n * out of the youtube video id.\n *\n * @param {string} videoId The youtube video ID.\n * @param {boolean=} opt_autoplay Whether the flash movie should start playing\n *     as soon as it is shown, or if it should show a 'play' button.\n * @return {!goog.html.TrustedResourceUrl} The flash URL to be embedded on the\n *     page.\n */\ngoog.ui.media.YoutubeModel.getFlashUrl = function(videoId, opt_autoplay) {\n  // YouTube video ids are extracted from youtube URLs, which are user\n  // generated input. The video id is later used to embed a flash object,\n  // which is generated through HTML construction.\n  return goog.html.TrustedResourceUrl.format(\n      goog.string.Const.from(\n          'https://www.youtube.com/v/%{v}&hl=en&fs=1%{autoplay}'),\n      {\n        'v': videoId,\n        'autoplay': opt_autoplay ? goog.string.Const.from('&autoplay=1') : ''\n      });\n};\n\n\n/**\n * Gets the Youtube video id.\n * @return {string} The Youtube video id.\n */\ngoog.ui.media.YoutubeModel.prototype.getVideoId = function() {\n  return this.videoId_;\n};\n","^9I",1579837703000,"^9J",["^9K",["^=I","^9L","^:=","^=J","^=K","^=L","^9>","^=M","^;=","^=N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/media/youtube.js"],"^:1",["^9K",["~$goog.ui.media.Youtube","~$goog.ui.media.YoutubeModel"]],"^9<",true,"^9=",["^9>","^;=","^=I","^9L","^=M","^:=","^=N","^=K","^=J","^=L"]],["^ ","^9A",[1579837703000],"^9B","goog.history.eventtype.js","^9C",["^9D","goog/history/eventtype.js"],"^9E","goog/history/eventtype.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Event types for goog.history.\n *\n */\n\n\ngoog.provide('goog.history.EventType');\n\n\n/**\n * Event types for goog.history.\n * @enum {string}\n */\ngoog.history.EventType = {\n  NAVIGATE: 'navigate'\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/history/eventtype.js"],"^:1",["^9K",["~$goog.history.EventType"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.storage.mechanism.html5sessionstorage.js","^9C",["^9D","goog/storage/mechanism/html5sessionstorage.js"],"^9E","goog/storage/mechanism/html5sessionstorage.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides data persistence using HTML5 session storage\n * mechanism. Session storage must be available under window.sessionStorage,\n * see: http://www.w3.org/TR/webstorage/#the-sessionstorage-attribute.\n *\n */\n\ngoog.provide('goog.storage.mechanism.HTML5SessionStorage');\n\ngoog.require('goog.storage.mechanism.HTML5WebStorage');\n\n\n\n/**\n * Provides a storage mechanism that uses HTML5 session storage.\n *\n * @constructor\n * @struct\n * @extends {goog.storage.mechanism.HTML5WebStorage}\n */\ngoog.storage.mechanism.HTML5SessionStorage = function() {\n  var storage = null;\n\n  try {\n    // May throw an exception in cases where the session storage object is\n    // visible but access to it is disabled. For example, accessing the file\n    // in local mode in Firefox throws 'Operation is not supported' exception.\n    storage = window.sessionStorage || null;\n  } catch (e) {\n  }\n  goog.storage.mechanism.HTML5SessionStorage.base(this, 'constructor', storage);\n};\ngoog.inherits(\n    goog.storage.mechanism.HTML5SessionStorage,\n    goog.storage.mechanism.HTML5WebStorage);\n","^9I",1579837703000,"^9J",["^9K",["^9>","^K2"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/mechanism/html5sessionstorage.js"],"^:1",["^9K",["~$goog.storage.mechanism.HTML5SessionStorage"]],"^9<",true,"^9=",["^9>","^K2"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.streams.lite.js","^9C",["^9D","goog/streams/lite.js"],"^9E","goog/streams/lite.js","^9F","^9G","^9H","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A lite polyfill of the ReadableStream native API with a subset\n * of methods supported.\n */\ngoog.module('goog.streams.lite');\n\nconst liteImpl = goog.require('goog.streams.liteImpl');\nconst liteNativeImpl = goog.require('goog.streams.liteNativeImpl');\nconst {ReadableStream, ReadableStreamDefaultController, ReadableStreamDefaultReader, ReadableStreamUnderlyingSource} = goog.require('goog.streams.liteTypes');\nconst {USE_NATIVE_IMPLEMENTATION} = goog.require('goog.streams.defines');\n\n/**\n * Creates and returns a new ReadableStream.\n *\n * The underlying source should only have a start() method, and no other\n * properties.\n * @param {!ReadableStreamUnderlyingSource<T>} underlyingSource\n * @return {!ReadableStream<T>}\n * @suppress {strictMissingProperties}\n * @template T\n */\nfunction newReadableStream(underlyingSource) {\n  if (USE_NATIVE_IMPLEMENTATION === 'true' ||\n      (USE_NATIVE_IMPLEMENTATION === 'detect' && goog.global.ReadableStream)) {\n    return liteNativeImpl.newReadableStream(underlyingSource);\n  } else {\n    return liteImpl.newReadableStream(underlyingSource);\n  }\n}\n\nexports = {\n  ReadableStream,\n  ReadableStreamDefaultController,\n  ReadableStreamDefaultReader,\n  ReadableStreamUnderlyingSource,\n  newReadableStream,\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^>5","^<K","~$goog.streams.defines","~$goog.streams.liteNativeImpl"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/streams/lite.js"],"^:1",["^9K",["~$goog.streams.lite"]],"^9<",true,"^9=",["^9>","^<K","^KT","^>5","^KS"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.textassert.js","^9C",["^9D","goog/dom/textassert.js"],"^9E","goog/dom/textassert.js","^9F","^9G","^9H","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * Utilities intended for refactoring legacy code; allows classifying strings\n * into plain text that does not contain HTML and HTML. Please do NOT use in new\n * code.\n */\n\ngoog.provide('goog.dom.textAssert');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\n\n/**\n * Assert that the string is plain text that does not have HTML, i.e. not\n * affected by HTML escaping. Otherwise, this raises an error if assertions are\n * enabled. It does NOT sanitize nor make any change to the input string. It\n * should only be used when the assertion failure is benign, such as printing\n * spurious tags. DO NOT count on this to remove unsafe HTML. It is only meant\n * for legacy refactoring. Please do NOT use in new code.\n * @param {string} text\n * @return {string}\n */\ngoog.dom.textAssert.assertHtmlFree = function(text) {\n  if (goog.asserts.ENABLE_ASSERTS) {\n    var elmt = goog.dom.createElement(goog.dom.TagName.BODY);\n    elmt.textContent = text;\n    goog.asserts.assert(\n        elmt.innerHTML == elmt.textContent,\n        'String has HTML original: %s, escaped: %s', text, elmt.innerHTML);\n  }\n  return text;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^9>","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/textassert.js"],"^:1",["^9K",["~$goog.dom.textAssert"]],"^9<",true,"^9=",["^9>","^:E","^;;","^;="]],["^ ","^9A",[1579837703000],"^9B","goog.ui.mockactivitymonitor.js","^9C",["^9D","goog/ui/mockactivitymonitor.js"],"^9E","goog/ui/mockactivitymonitor.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of goog.ui.MockActivityMonitor.\n */\n\ngoog.provide('goog.ui.MockActivityMonitor');\n\ngoog.require('goog.events.EventType');\ngoog.require('goog.ui.ActivityMonitor');\n\n\n\n/**\n * A mock implementation of goog.ui.ActivityMonitor for unit testing. Clients\n * of this class should override goog.now to return a synthetic time from\n * the unit test.\n * @constructor\n * @extends {goog.ui.ActivityMonitor}\n * @final\n */\ngoog.ui.MockActivityMonitor = function() {\n  goog.ui.MockActivityMonitor.base(this, 'constructor');\n\n  /**\n   * Tracks whether an event has been fired. Used by simulateEvent.\n   * @type {boolean}\n   * @private\n   */\n  this.eventFired_ = false;\n};\ngoog.inherits(goog.ui.MockActivityMonitor, goog.ui.ActivityMonitor);\n\n\n/**\n * Simulates an event that updates the user to being non-idle.\n * @param {goog.events.EventType=} opt_type The type of event that made the user\n *     not idle. If not specified, defaults to MOUSEMOVE.\n */\ngoog.ui.MockActivityMonitor.prototype.simulateEvent = function(opt_type) {\n  var eventTime = goog.now();\n  var eventType = opt_type || goog.events.EventType.MOUSEMOVE;\n\n  this.eventFired_ = false;\n  this.updateIdleTime(eventTime, eventType);\n\n  if (!this.eventFired_) {\n    this.dispatchEvent(goog.ui.ActivityMonitor.Event.ACTIVITY);\n  }\n};\n\n\n/**\n * @override\n */\ngoog.ui.MockActivityMonitor.prototype.dispatchEvent = function(e) {\n  var rv = goog.ui.MockActivityMonitor.base(this, 'dispatchEvent', e);\n  this.eventFired_ = true;\n  return rv;\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.ui.ActivityMonitor","^9>","^:I"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/mockactivitymonitor.js"],"^:1",["^9K",["~$goog.ui.MockActivityMonitor"]],"^9<",true,"^9=",["^9>","^:I","^KW"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.fs.filewriter.js","^9C",["^9D","goog/testing/fs/filewriter.js"],"^9E","goog/testing/fs/filewriter.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Mock FileWriter object.\n *\n */\n\ngoog.setTestOnly('goog.testing.fs.FileWriter');\ngoog.provide('goog.testing.fs.FileWriter');\n\ngoog.forwardDeclare('goog.testing.fs.FileEntry');\ngoog.require('goog.Timer');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.fs.Error');\ngoog.require('goog.fs.FileSaver');\ngoog.require('goog.string');\ngoog.require('goog.testing.fs.Blob');\ngoog.require('goog.testing.fs.File');\ngoog.require('goog.testing.fs.ProgressEvent');\n\n\n\n/**\n * A mock FileWriter object. This emits the same events as\n * {@link goog.fs.FileSaver} and {@link goog.fs.FileWriter}.\n *\n * @param {!goog.testing.fs.FileEntry} fileEntry The file entry to write to.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.testing.fs.FileWriter = function(fileEntry) {\n  goog.testing.fs.FileWriter.base(this, 'constructor');\n\n  /**\n   * The file entry to which to write.\n   * @type {!goog.testing.fs.FileEntry}\n   * @private\n   */\n  this.fileEntry_ = fileEntry;\n\n  /**\n   * The file blob to write to.\n   * @type {!goog.testing.fs.File}\n   * @private\n   */\n  this.file_ = fileEntry.fileSync();\n\n  /**\n   * The current state of the writer.\n   * @type {goog.fs.FileSaver.ReadyState}\n   * @private\n   */\n  this.readyState_ = goog.fs.FileSaver.ReadyState.INIT;\n};\ngoog.inherits(goog.testing.fs.FileWriter, goog.events.EventTarget);\n\n\n/**\n * The most recent error experienced by this writer.\n * @type {goog.fs.Error}\n * @private\n */\ngoog.testing.fs.FileWriter.prototype.error_;\n\n\n/**\n * Whether the current operation has been aborted.\n * @type {boolean}\n * @private\n */\ngoog.testing.fs.FileWriter.prototype.aborted_ = false;\n\n\n/**\n * The current position in the file.\n * @type {number}\n * @private\n */\ngoog.testing.fs.FileWriter.prototype.position_ = 0;\n\n\n/**\n * @see {goog.fs.FileSaver#getReadyState}\n * @return {goog.fs.FileSaver.ReadyState} The ready state.\n */\ngoog.testing.fs.FileWriter.prototype.getReadyState = function() {\n  return this.readyState_;\n};\n\n\n/**\n * @see {goog.fs.FileSaver#getError}\n * @return {goog.fs.Error} The error.\n */\ngoog.testing.fs.FileWriter.prototype.getError = function() {\n  return this.error_;\n};\n\n\n/**\n * @see {goog.fs.FileWriter#getPosition}\n * @return {number} The position.\n */\ngoog.testing.fs.FileWriter.prototype.getPosition = function() {\n  return this.position_;\n};\n\n\n/**\n * @see {goog.fs.FileWriter#getLength}\n * @return {number} The length.\n */\ngoog.testing.fs.FileWriter.prototype.getLength = function() {\n  return this.file_.size;\n};\n\n\n/**\n * @see {goog.fs.FileSaver#abort}\n */\ngoog.testing.fs.FileWriter.prototype.abort = function() {\n  if (this.readyState_ != goog.fs.FileSaver.ReadyState.WRITING) {\n    var msg = 'aborting save of ' + this.fileEntry_.getFullPath();\n    throw new goog.fs.Error({'name': 'InvalidStateError'}, msg);\n  }\n\n  this.aborted_ = true;\n};\n\n\n/**\n * @see {goog.fs.FileWriter#write}\n * @param {!goog.testing.fs.Blob} blob The blob to write.\n */\ngoog.testing.fs.FileWriter.prototype.write = function(blob) {\n  if (this.readyState_ == goog.fs.FileSaver.ReadyState.WRITING) {\n    var msg = 'writing to ' + this.fileEntry_.getFullPath();\n    throw new goog.fs.Error({'name': 'InvalidStateError'}, msg);\n  }\n\n  this.readyState_ = goog.fs.FileSaver.ReadyState.WRITING;\n  goog.Timer.callOnce(function() {\n    if (this.aborted_) {\n      this.abort_(blob.size);\n      return;\n    }\n\n    this.progressEvent_(goog.fs.FileSaver.EventType.WRITE_START, 0, blob.size);\n    var fileString = this.file_.toString();\n    this.file_.setDataInternal(\n        fileString.substring(0, this.position_) + blob.toString() +\n        fileString.substring(this.position_ + blob.size, fileString.length));\n    this.position_ += blob.size;\n\n    this.progressEvent_(\n        goog.fs.FileSaver.EventType.WRITE, blob.size, blob.size);\n    this.readyState_ = goog.fs.FileSaver.ReadyState.DONE;\n    this.progressEvent_(\n        goog.fs.FileSaver.EventType.WRITE_END, blob.size, blob.size);\n  }, 0, this);\n};\n\n\n/**\n * @see {goog.fs.FileWriter#truncate}\n * @param {number} size The size to truncate to.\n */\ngoog.testing.fs.FileWriter.prototype.truncate = function(size) {\n  if (this.readyState_ == goog.fs.FileSaver.ReadyState.WRITING) {\n    var msg = 'truncating ' + this.fileEntry_.getFullPath();\n    throw new goog.fs.Error({'name': 'InvalidStateError'}, msg);\n  }\n\n  this.readyState_ = goog.fs.FileSaver.ReadyState.WRITING;\n  goog.Timer.callOnce(function() {\n    if (this.aborted_) {\n      this.abort_(size);\n      return;\n    }\n\n    this.progressEvent_(goog.fs.FileSaver.EventType.WRITE_START, 0, size);\n\n    var fileString = this.file_.toString();\n    if (size > fileString.length) {\n      this.file_.setDataInternal(\n          fileString + goog.string.repeat('\\0', size - fileString.length));\n    } else {\n      this.file_.setDataInternal(fileString.substring(0, size));\n    }\n    this.position_ = Math.min(this.position_, size);\n\n    this.progressEvent_(goog.fs.FileSaver.EventType.WRITE, size, size);\n    this.readyState_ = goog.fs.FileSaver.ReadyState.DONE;\n    this.progressEvent_(goog.fs.FileSaver.EventType.WRITE_END, size, size);\n  }, 0, this);\n};\n\n\n/**\n * @see {goog.fs.FileWriter#seek}\n * @param {number} offset The offset to seek to.\n */\ngoog.testing.fs.FileWriter.prototype.seek = function(offset) {\n  if (this.readyState_ == goog.fs.FileSaver.ReadyState.WRITING) {\n    var msg = 'truncating ' + this.fileEntry_.getFullPath();\n    throw new goog.fs.Error({name: 'InvalidStateError'}, msg);\n  }\n\n  if (offset < 0) {\n    this.position_ = Math.max(0, this.file_.size + offset);\n  } else {\n    this.position_ = Math.min(offset, this.file_.size);\n  }\n};\n\n\n/**\n * Abort the current action and emit appropriate events.\n *\n * @param {number} total The total data that was to be processed, in bytes.\n * @private\n */\ngoog.testing.fs.FileWriter.prototype.abort_ = function(total) {\n  this.error_ = new goog.fs.Error(\n      {'name': 'AbortError'}, 'saving ' + this.fileEntry_.getFullPath());\n  this.progressEvent_(goog.fs.FileSaver.EventType.ERROR, 0, total);\n  this.progressEvent_(goog.fs.FileSaver.EventType.ABORT, 0, total);\n  this.readyState_ = goog.fs.FileSaver.ReadyState.DONE;\n  this.progressEvent_(goog.fs.FileSaver.EventType.WRITE_END, 0, total);\n  this.aborted_ = false;\n};\n\n\n/**\n * Dispatch a progress event.\n *\n * @param {goog.fs.FileSaver.EventType} type The type of the event.\n * @param {number} loaded The number of bytes processed.\n * @param {number} total The total data that was to be processed, in bytes.\n * @private\n */\ngoog.testing.fs.FileWriter.prototype.progressEvent_ = function(\n    type, loaded, total) {\n  // On write, update the last modified date to the current (real or mock) time.\n  if (type == goog.fs.FileSaver.EventType.WRITE) {\n    this.file_.lastModifiedDate = new Date(goog.now());\n  }\n\n  this.dispatchEvent(new goog.testing.fs.ProgressEvent(type, loaded, total));\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.fs.FileSaver","^><","~$goog.testing.fs.File","^9L","^IE","^9>","^:L","~$goog.testing.fs.ProgressEvent","~$goog.testing.fs.Blob"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/fs/filewriter.js"],"^:1",["^9K",["~$goog.testing.fs.FileWriter"]],"^9<",true,"^9=",["^9>","^><","^:L","^IE","^KY","^9L","^L0","^KZ","^K["]],["^ ","^9A",[1579837703000],"^9B","goog.fs.filesystemimpl.js","^9C",["^9D","goog/fs/filesystemimpl.js"],"^9E","goog/fs/filesystemimpl.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Concrete implementation of the goog.fs.FileSystem interface\n *     using an HTML FileSystem object.\n */\ngoog.provide('goog.fs.FileSystemImpl');\n\ngoog.require('goog.fs.DirectoryEntryImpl');\ngoog.require('goog.fs.FileSystem');\n\n\n\n/**\n * A local filesystem.\n *\n * This shouldn't be instantiated directly. Instead, it should be accessed via\n * {@link goog.fs.getTemporary} or {@link goog.fs.getPersistent}.\n *\n * @param {!FileSystem} fs The underlying FileSystem object.\n * @constructor\n * @implements {goog.fs.FileSystem}\n * @final\n */\ngoog.fs.FileSystemImpl = function(fs) {\n  /**\n   * The underlying FileSystem object.\n   *\n   * @type {!FileSystem}\n   * @private\n   */\n  this.fs_ = fs;\n};\n\n\n/** @override */\ngoog.fs.FileSystemImpl.prototype.getName = function() {\n  return this.fs_.name;\n};\n\n\n/** @override */\ngoog.fs.FileSystemImpl.prototype.getRoot = function() {\n  return new goog.fs.DirectoryEntryImpl(this, this.fs_.root);\n};\n\n\n/**\n * @return {!FileSystem} The underlying FileSystem object.\n */\ngoog.fs.FileSystemImpl.prototype.getBrowserFileSystem = function() {\n  return this.fs_;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^<8","^IZ"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fs/filesystemimpl.js"],"^:1",["^9K",["~$goog.fs.FileSystemImpl"]],"^9<",true,"^9=",["^9>","^IZ","^<8"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.menubarrenderer.js","^9C",["^9D","goog/ui/menubarrenderer.js"],"^9E","goog/ui/menubarrenderer.js","^9F","^9G","^9H","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for {@link goog.ui.menuBar}.\n *\n */\n\ngoog.provide('goog.ui.MenuBarRenderer');\n\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.ui.Container');\ngoog.require('goog.ui.ContainerRenderer');\n\n\n\n/**\n * Default renderer for {@link goog.ui.menuBar}s, based on {@link\n * goog.ui.ContainerRenderer}.\n * @constructor\n * @extends {goog.ui.ContainerRenderer}\n * @final\n */\ngoog.ui.MenuBarRenderer = function() {\n  goog.ui.MenuBarRenderer.base(\n      this, 'constructor', goog.a11y.aria.Role.MENUBAR);\n};\ngoog.inherits(goog.ui.MenuBarRenderer, goog.ui.ContainerRenderer);\ngoog.addSingletonGetter(goog.ui.MenuBarRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of elements rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.MenuBarRenderer.CSS_CLASS = goog.getCssName('goog-menubar');\n\n\n/**\n * @override\n */\ngoog.ui.MenuBarRenderer.prototype.getCssClass = function() {\n  return goog.ui.MenuBarRenderer.CSS_CLASS;\n};\n\n\n/**\n * Returns the default orientation of containers rendered or decorated by this\n * renderer.  This implementation returns `HORIZONTAL`.\n * @return {goog.ui.Container.Orientation} Default orientation for containers\n *     created or decorated by this renderer.\n * @override\n */\ngoog.ui.MenuBarRenderer.prototype.getDefaultOrientation = function() {\n  return goog.ui.Container.Orientation.HORIZONTAL;\n};\n","^9I",1579837703000,"^9J",["^9K",["^I[","^;G","^9>","^>K"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/menubarrenderer.js"],"^:1",["^9K",["~$goog.ui.MenuBarRenderer"]],"^9<",true,"^9=",["^9>","^;G","^>K","^I["]],["^ ","^9A",[1579837703000],"^9B","goog.editor.style.js","^9C",["^9D","goog/editor/style.js"],"^9E","goog/editor/style.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilties for working with the styles of DOM nodes, and\n * related to rich text editing.\n *\n * Many of these are not general enough to go into goog.style, and use\n * constructs (like \"isContainer\") that only really make sense inside\n * of an HTML editor.\n *\n * The API has been optimized for iterating over large, irregular DOM\n * structures (with lots of text nodes), and so the API tends to be a bit\n * more permissive than the goog.style API should be. For example,\n * goog.style.getComputedStyle will throw an exception if you give it a\n * text node.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.provide('goog.editor.style');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.editor.BrowserFeature');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.object');\ngoog.require('goog.style');\ngoog.require('goog.userAgent');\n\n\n/**\n * Gets the computed or cascaded style.\n *\n * This is different than goog.style.getStyle_ because it returns null\n * for text nodes (instead of throwing an exception), and never reads\n * inline style. These two functions may need to be reconciled.\n *\n * @param {!Node} node Node to get style of.\n * @param {string} stylePropertyName Property to get (must be camelCase,\n *     not css-style).\n * @return {?string} Style value, or null if this is not an element node.\n * @private\n */\ngoog.editor.style.getComputedOrCascadedStyle_ = function(\n    node, stylePropertyName) {\n  if (node.nodeType != goog.dom.NodeType.ELEMENT) {\n    // Only element nodes have style.\n    return null;\n  }\n  return goog.userAgent.IE ?\n      goog.style.getCascadedStyle(\n          /** @type {!Element} */ (node), stylePropertyName) :\n      goog.style.getComputedStyle(\n          /** @type {!Element} */ (node), stylePropertyName);\n};\n\n\n/**\n * Checks whether the given element inherits display: block.\n * @param {!Node} node The Node to check.\n * @return {boolean} Whether the element inherits CSS display: block.\n */\ngoog.editor.style.isDisplayBlock = function(node) {\n  return goog.editor.style.getComputedOrCascadedStyle_(node, 'display') ==\n      'block';\n};\n\n\n/**\n * Returns true if the element is a container of other non-inline HTML\n * Note that span, strong and em tags, being inline can only contain\n * other inline elements and are thus, not containers. Containers are elements\n * that should not be broken up when wrapping selections with a node of an\n * inline block styling.\n * @param {Node} element The element to check.\n * @return {boolean} Whether the element is a container.\n */\ngoog.editor.style.isContainer = function(element) {\n  var nodeName = element && element.nodeName;\n  return !!(\n      element &&\n      (goog.editor.style.isDisplayBlock(element) ||\n       nodeName == goog.dom.TagName.TD || nodeName == goog.dom.TagName.TABLE ||\n       nodeName == goog.dom.TagName.LI));\n};\n\n\n/**\n * Return the first ancestor of this node that is a container, inclusive.\n * @see isContainer\n * @param {Node} node Node to find the container of.\n * @return {Element} The element which contains node.\n */\ngoog.editor.style.getContainer = function(node) {\n  // We assume that every node must have a container.\n  return /** @type {Element} */ (\n      goog.dom.getAncestor(node, goog.editor.style.isContainer, true));\n};\n\n\n/**\n * Set of input types that should be kept selectable even when their ancestors\n * are made unselectable.\n * @type {Object}\n * @private\n */\ngoog.editor.style.SELECTABLE_INPUT_TYPES_ =\n    goog.object.createSet('text', 'file', 'url');\n\n\n/**\n * Prevent the default action on mousedown events.\n * @param {goog.events.Event} e The mouse down event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.editor.style.cancelMouseDownHelper_ = function(e) {\n  var targetTagName = e.target.tagName;\n  if (targetTagName != goog.dom.TagName.TEXTAREA &&\n      targetTagName != goog.dom.TagName.INPUT) {\n    e.preventDefault();\n  }\n};\n\n\n/**\n * Makes the given element unselectable, as well as all of its children, except\n * for text areas, text, file and url inputs.\n * @param {Element} element The element to make unselectable.\n * @param {goog.events.EventHandler} eventHandler An EventHandler to register\n *     the event with. Assumes when the node is destroyed, the eventHandler's\n *     listeners are destroyed as well.\n */\ngoog.editor.style.makeUnselectable = function(element, eventHandler) {\n  if (goog.editor.BrowserFeature.HAS_UNSELECTABLE_STYLE) {\n    // The mousing down on a node should not blur the focused node.\n    // This is consistent with how IE works.\n    // TODO: Consider using just the mousedown handler and not the css property.\n    eventHandler.listen(\n        element, goog.events.EventType.MOUSEDOWN,\n        goog.editor.style.cancelMouseDownHelper_, true);\n  }\n\n  goog.style.setUnselectable(element, true);\n\n  // Make inputs and text areas selectable.\n  var inputs = goog.dom.getElementsByTagName(\n      goog.dom.TagName.INPUT, goog.asserts.assert(element));\n  for (var i = 0, len = inputs.length; i < len; i++) {\n    var input = inputs[i];\n    if (input.type in goog.editor.style.SELECTABLE_INPUT_TYPES_) {\n      goog.editor.style.makeSelectable(input);\n    }\n  }\n  goog.array.forEach(\n      goog.dom.getElementsByTagName(\n          goog.dom.TagName.TEXTAREA, goog.asserts.assert(element)),\n      goog.editor.style.makeSelectable);\n};\n\n\n/**\n * Make the given element selectable.\n *\n * For IE this simply turns off the \"unselectable\" property.\n *\n * Under FF no descendant of an unselectable node can be selectable:\n *\n * https://bugzilla.mozilla.org/show_bug.cgi?id=203291\n *\n * So we make each ancestor of node selectable, while trying to preserve the\n * unselectability of other nodes along that path\n *\n * This may cause certain text nodes which should be unselectable, to become\n * selectable. For example:\n *\n *    <div id=div1 style=\"-moz-user-select: none\">\n *      Text1\n *      <span id=span1>Text2</span>\n *    </div>\n *\n * If we call makeSelectable on span1, then it will cause \"Text1\" to become\n * selectable, since it had to make div1 selectable in order for span1 to be\n * selectable.\n *\n * If \"Text1\" were enclosed within a `<p>` or `<span>`, then this problem would\n * not arise.  Text nodes do not have styles, so its style can't be set to\n * unselectable.\n *\n * @param {!Element} element The element to make selectable.\n */\ngoog.editor.style.makeSelectable = function(element) {\n  goog.style.setUnselectable(element, false);\n  if (goog.editor.BrowserFeature.HAS_UNSELECTABLE_STYLE) {\n    // Go up ancestor chain, searching for nodes that are unselectable.\n    // If such a node exists, mark it as selectable but mark its other children\n    // as unselectable so the minimum set of nodes is changed.\n    var child = element;\n    var current = /** @type {Element} */ (element.parentNode);\n    while (current && current.tagName != goog.dom.TagName.HTML) {\n      if (goog.style.isUnselectable(current)) {\n        goog.style.setUnselectable(current, false, true);\n\n        for (var i = 0, len = current.childNodes.length; i < len; i++) {\n          var node = current.childNodes[i];\n          if (node != child && node.nodeType == goog.dom.NodeType.ELEMENT) {\n            goog.style.setUnselectable(\n                /** @type {!Element} */ (current.childNodes[i]), true);\n          }\n        }\n      }\n\n      child = current;\n      current = /** @type {Element} */ (current.parentNode);\n    }\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^>;","^=B","^?=","^9>","^;P","^:S","^:I","^<3","^;9","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/style.js"],"^:1",["^9K",["^JL"]],"^9<",true,"^9=",["^9>","^;9","^:E","^;;","^=B","^;=","^?=","^>;","^:I","^;P","^<3","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.roundedpanel.js","^9C",["^9D","goog/ui/roundedpanel.js"],"^9E","goog/ui/roundedpanel.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class definition for a rounded corner panel.\n * @supported IE 6.0+, Safari 2.0+, Firefox 1.5+, Opera 9.2+.\n * @see ../demos/roundedpanel.html\n */\n\ngoog.provide('goog.ui.BaseRoundedPanel');\ngoog.provide('goog.ui.CssRoundedPanel');\ngoog.provide('goog.ui.GraphicsRoundedPanel');\ngoog.provide('goog.ui.RoundedPanel');\ngoog.provide('goog.ui.RoundedPanel.Corner');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.graphics');\ngoog.require('goog.graphics.Path');\ngoog.require('goog.graphics.SolidFill');\ngoog.require('goog.graphics.Stroke');\ngoog.require('goog.math');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.userAgent');\n\n\n/**\n * Factory method that returns an instance of a BaseRoundedPanel.\n * @param {number} radius The radius of the rounded corner(s), in pixels.\n * @param {number} borderWidth The thickness of the border, in pixels.\n * @param {string} borderColor The border color of the panel.\n * @param {string=} opt_backgroundColor The background color of the panel.\n * @param {number=} opt_corners The corners of the panel to be rounded. Any\n *     corners not specified will be rendered as square corners. Will default\n *     to all square corners if not specified.\n * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper object for the\n *     document we want to render in.\n * @return {!goog.ui.BaseRoundedPanel} An instance of a\n *     goog.ui.BaseRoundedPanel subclass.\n * TODO(sdh): deprecate this class, which has <5 usages and only really\n *            matters for IE8, and then only stylistically.\n */\ngoog.ui.RoundedPanel.create = function(\n    radius, borderWidth, borderColor, opt_backgroundColor, opt_corners,\n    opt_domHelper) {\n  // This variable checks for the presence of Safari 3.0+ or Gecko 1.9+,\n  // which can leverage special CSS styles to create rounded corners.\n  var isCssReady =\n      (goog.userAgent.WEBKIT && goog.userAgent.isVersionOrHigher('500')) ||\n      (goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9a')) ||\n      goog.userAgent.EDGE;\n\n  if (isCssReady) {\n    // Safari 3.0+ and Firefox 3.0+ support this instance.\n    return new goog.ui.CssRoundedPanel(\n        radius, borderWidth, borderColor, opt_backgroundColor, opt_corners,\n        opt_domHelper);\n  } else {\n    return new goog.ui.GraphicsRoundedPanel(\n        radius, borderWidth, borderColor, opt_backgroundColor, opt_corners,\n        opt_domHelper);\n  }\n};\n\n\n/**\n * Enum for specifying which corners to render.\n * @enum {number}\n */\ngoog.ui.RoundedPanel.Corner = {\n  NONE: 0,\n  BOTTOM_LEFT: 2,\n  TOP_LEFT: 4,\n  LEFT: 6,  // BOTTOM_LEFT | TOP_LEFT\n  TOP_RIGHT: 8,\n  TOP: 12,  // TOP_LEFT | TOP_RIGHT\n  BOTTOM_RIGHT: 1,\n  BOTTOM: 3,  // BOTTOM_LEFT | BOTTOM_RIGHT\n  RIGHT: 9,   // TOP_RIGHT | BOTTOM_RIGHT\n  ALL: 15     // TOP | BOTTOM\n};\n\n\n/**\n * CSS class name suffixes for the elements comprising the RoundedPanel.\n * @enum {string}\n * @private\n */\ngoog.ui.RoundedPanel.Classes_ = {\n  BACKGROUND: goog.getCssName('goog-roundedpanel-background'),\n  PANEL: goog.getCssName('goog-roundedpanel'),\n  CONTENT: goog.getCssName('goog-roundedpanel-content')\n};\n\n\n\n/**\n * Base class for the hierarchy of RoundedPanel classes. Do not\n * instantiate directly. Instead, call goog.ui.RoundedPanel.create().\n * The HTML structure for the RoundedPanel is:\n * <pre>\n * - div (Contains the background and content. Class name: goog-roundedpanel)\n *   - div (Contains the background/rounded corners. Class name:\n *       goog-roundedpanel-bg)\n *   - div (Contains the content. Class name: goog-roundedpanel-content)\n * </pre>\n * @param {number} radius The radius of the rounded corner(s), in pixels.\n * @param {number} borderWidth The thickness of the border, in pixels.\n * @param {string} borderColor The border color of the panel.\n * @param {string=} opt_backgroundColor The background color of the panel.\n * @param {number=} opt_corners The corners of the panel to be rounded. Any\n *     corners not specified will be rendered as square corners. Will default\n *     to all square corners if not specified.\n * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper object for the\n *     document we want to render in.\n * @extends {goog.ui.Component}\n * @constructor\n */\ngoog.ui.BaseRoundedPanel = function(\n    radius, borderWidth, borderColor, opt_backgroundColor, opt_corners,\n    opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * The radius of the rounded corner(s), in pixels.\n   * @type {number}\n   * @private\n   */\n  this.radius_ = radius;\n\n  /**\n   * The thickness of the border, in pixels.\n   * @type {number}\n   * @private\n   */\n  this.borderWidth_ = borderWidth;\n\n  /**\n   * The border color of the panel.\n   * @type {string}\n   * @private\n   */\n  this.borderColor_ = borderColor;\n\n  /**\n   * The background color of the panel.\n   * @type {?string}\n   * @private\n   */\n  this.backgroundColor_ = opt_backgroundColor || null;\n\n  /**\n   * The corners of the panel to be rounded; defaults to\n   * goog.ui.RoundedPanel.Corner.NONE\n   * @type {number}\n   * @private\n   */\n  this.corners_ = opt_corners || goog.ui.RoundedPanel.Corner.NONE;\n};\ngoog.inherits(goog.ui.BaseRoundedPanel, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.BaseRoundedPanel);\n\n\n/**\n * The element containing the rounded corners and background.\n * @type {Element}\n * @private\n */\ngoog.ui.BaseRoundedPanel.prototype.backgroundElement_;\n\n\n/**\n * The element containing the actual content.\n * @type {Element}\n * @private\n */\ngoog.ui.BaseRoundedPanel.prototype.contentElement_;\n\n\n/**\n * This method performs all the necessary DOM manipulation to create the panel.\n * Overrides {@link goog.ui.Component#decorateInternal}.\n * @param {Element} element The element to decorate.\n * @protected\n * @override\n */\ngoog.ui.BaseRoundedPanel.prototype.decorateInternal = function(element) {\n  goog.ui.BaseRoundedPanel.superClass_.decorateInternal.call(this, element);\n  goog.dom.classlist.add(\n      goog.asserts.assert(this.getElement()),\n      goog.ui.RoundedPanel.Classes_.PANEL);\n\n  // Create backgroundElement_, and add it to the DOM.\n  this.backgroundElement_ =\n      this.getDomHelper().createElement(goog.dom.TagName.DIV);\n  this.backgroundElement_.className = goog.ui.RoundedPanel.Classes_.BACKGROUND;\n  this.getElement().appendChild(this.backgroundElement_);\n\n  // Set contentElement_ by finding a child node within element_ with the\n  // proper class name. If none exists, create it and add it to the DOM.\n  this.contentElement_ = goog.dom.getElementsByTagNameAndClass(\n      null, goog.ui.RoundedPanel.Classes_.CONTENT, this.getElement())[0];\n  if (!this.contentElement_) {\n    this.contentElement_ = this.getDomHelper().createDom(goog.dom.TagName.DIV);\n    this.contentElement_.className = goog.ui.RoundedPanel.Classes_.CONTENT;\n    this.getElement().appendChild(this.contentElement_);\n  }\n};\n\n\n/** @override */\ngoog.ui.BaseRoundedPanel.prototype.disposeInternal = function() {\n  if (this.backgroundElement_) {\n    this.getDomHelper().removeNode(this.backgroundElement_);\n    this.backgroundElement_ = null;\n  }\n  this.contentElement_ = null;\n  goog.ui.BaseRoundedPanel.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * Returns the DOM element containing the actual content.\n * @return {Element} The element containing the actual content (null if none).\n * @override\n */\ngoog.ui.BaseRoundedPanel.prototype.getContentElement = function() {\n  return this.contentElement_;\n};\n\n\n\n/**\n * RoundedPanel class specifically for browsers that support CSS attributes\n * for elements with rounded borders (ex. Safari 3.0+, Firefox 3.0+). Do not\n * instantiate directly. Instead, call goog.ui.RoundedPanel.create().\n * @param {number} radius The radius of the rounded corner(s), in pixels.\n * @param {number} borderWidth The thickness of the border, in pixels.\n * @param {string} borderColor The border color of the panel.\n * @param {string=} opt_backgroundColor The background color of the panel.\n * @param {number=} opt_corners The corners of the panel to be rounded. Any\n *     corners not specified will be rendered as square corners. Will\n *     default to all square corners if not specified.\n * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper object for the\n *     document we want to render in.\n * @extends {goog.ui.BaseRoundedPanel}\n * @constructor\n * @final\n */\ngoog.ui.CssRoundedPanel = function(\n    radius, borderWidth, borderColor, opt_backgroundColor, opt_corners,\n    opt_domHelper) {\n  goog.ui.BaseRoundedPanel.call(\n      this, radius, borderWidth, borderColor, opt_backgroundColor, opt_corners,\n      opt_domHelper);\n};\ngoog.inherits(goog.ui.CssRoundedPanel, goog.ui.BaseRoundedPanel);\n\n\n/**\n * This method performs all the necessary DOM manipulation to create the panel.\n * Overrides {@link goog.ui.Component#decorateInternal}.\n * @param {Element} element The element to decorate.\n * @protected\n * @override\n */\ngoog.ui.CssRoundedPanel.prototype.decorateInternal = function(element) {\n  goog.ui.CssRoundedPanel.superClass_.decorateInternal.call(this, element);\n\n  // Set the border width and background color, if needed.\n  this.backgroundElement_.style.border =\n      this.borderWidth_ + 'px solid ' + this.borderColor_;\n  if (this.backgroundColor_) {\n    this.backgroundElement_.style.backgroundColor = this.backgroundColor_;\n  }\n\n  // Set radii of the appropriate rounded corners.\n  if (this.corners_ == goog.ui.RoundedPanel.Corner.ALL) {\n    var styleName = this.getStyle_(goog.ui.RoundedPanel.Corner.ALL);\n    this.backgroundElement_.style[styleName] = this.radius_ + 'px';\n  } else {\n    var topLeftRadius =\n        this.corners_ & goog.ui.RoundedPanel.Corner.TOP_LEFT ? this.radius_ : 0;\n    var cornerStyle = this.getStyle_(goog.ui.RoundedPanel.Corner.TOP_LEFT);\n    this.backgroundElement_.style[cornerStyle] = topLeftRadius + 'px';\n    var topRightRadius = this.corners_ & goog.ui.RoundedPanel.Corner.TOP_RIGHT ?\n        this.radius_ :\n        0;\n    cornerStyle = this.getStyle_(goog.ui.RoundedPanel.Corner.TOP_RIGHT);\n    this.backgroundElement_.style[cornerStyle] = topRightRadius + 'px';\n    var bottomRightRadius =\n        this.corners_ & goog.ui.RoundedPanel.Corner.BOTTOM_RIGHT ?\n        this.radius_ :\n        0;\n    cornerStyle = this.getStyle_(goog.ui.RoundedPanel.Corner.BOTTOM_RIGHT);\n    this.backgroundElement_.style[cornerStyle] = bottomRightRadius + 'px';\n    var bottomLeftRadius =\n        this.corners_ & goog.ui.RoundedPanel.Corner.BOTTOM_LEFT ? this.radius_ :\n                                                                  0;\n    cornerStyle = this.getStyle_(goog.ui.RoundedPanel.Corner.BOTTOM_LEFT);\n    this.backgroundElement_.style[cornerStyle] = bottomLeftRadius + 'px';\n  }\n};\n\n\n/**\n * This method returns the CSS style based on the corner of the panel, and the\n * user-agent.\n * @param {number} corner The corner whose style name to retrieve.\n * @private\n * @return {string} The CSS style based on the specified corner.\n */\ngoog.ui.CssRoundedPanel.prototype.getStyle_ = function(corner) {\n  // Determine the proper corner to work with.\n  var cssCorner, suffixLeft, suffixRight;\n  if (goog.userAgent.WEBKIT) {\n    suffixLeft = 'Left';\n    suffixRight = 'Right';\n  } else {\n    suffixLeft = 'left';\n    suffixRight = 'right';\n  }\n  switch (corner) {\n    case goog.ui.RoundedPanel.Corner.ALL:\n      cssCorner = '';\n      break;\n    case goog.ui.RoundedPanel.Corner.TOP_LEFT:\n      cssCorner = 'Top' + suffixLeft;\n      break;\n    case goog.ui.RoundedPanel.Corner.TOP_RIGHT:\n      cssCorner = 'Top' + suffixRight;\n      break;\n    case goog.ui.RoundedPanel.Corner.BOTTOM_LEFT:\n      cssCorner = 'Bottom' + suffixLeft;\n      break;\n    case goog.ui.RoundedPanel.Corner.BOTTOM_RIGHT:\n      cssCorner = 'Bottom' + suffixRight;\n      break;\n  }\n\n  return goog.userAgent.WEBKIT ? 'WebkitBorder' + cssCorner + 'Radius' :\n                                 'MozBorderRadius' + cssCorner;\n};\n\n\n\n/**\n * RoundedPanel class that uses goog.graphics to create the rounded corners.\n * Do not instantiate directly. Instead, call goog.ui.RoundedPanel.create().\n * @param {number} radius The radius of the rounded corner(s), in pixels.\n * @param {number} borderWidth The thickness of the border, in pixels.\n * @param {string} borderColor The border color of the panel.\n * @param {string=} opt_backgroundColor The background color of the panel.\n * @param {number=} opt_corners The corners of the panel to be rounded. Any\n *     corners not specified will be rendered as square corners. Will\n *     default to all square corners if not specified.\n * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper object for the\n *     document we want to render in.\n * @extends {goog.ui.BaseRoundedPanel}\n * @constructor\n * @final\n */\ngoog.ui.GraphicsRoundedPanel = function(\n    radius, borderWidth, borderColor, opt_backgroundColor, opt_corners,\n    opt_domHelper) {\n  goog.ui.BaseRoundedPanel.call(\n      this, radius, borderWidth, borderColor, opt_backgroundColor, opt_corners,\n      opt_domHelper);\n};\ngoog.inherits(goog.ui.GraphicsRoundedPanel, goog.ui.BaseRoundedPanel);\n\n\n/**\n * A 4-element array containing the circle centers for the arcs in the\n * bottom-left, top-left, top-right, and bottom-right corners, respectively.\n * @type {Array<goog.math.Coordinate>}\n * @private\n */\ngoog.ui.GraphicsRoundedPanel.prototype.arcCenters_;\n\n\n/**\n * A 4-element array containing the start coordinates for rendering the arcs\n * in the bottom-left, top-left, top-right, and bottom-right corners,\n * respectively.\n * @type {Array<goog.math.Coordinate>}\n * @private\n */\ngoog.ui.GraphicsRoundedPanel.prototype.cornerStarts_;\n\n\n/**\n * A 4-element array containing the arc end angles for the bottom-left,\n * top-left, top-right, and bottom-right corners, respectively.\n * @type {Array<number>}\n * @private\n */\ngoog.ui.GraphicsRoundedPanel.prototype.endAngles_;\n\n\n/**\n * Graphics object for rendering the background.\n * @type {goog.graphics.AbstractGraphics}\n * @private\n */\ngoog.ui.GraphicsRoundedPanel.prototype.graphics_;\n\n\n/**\n * A 4-element array containing the rounded corner radii for the bottom-left,\n * top-left, top-right, and bottom-right corners, respectively.\n * @type {Array<number>}\n * @private\n */\ngoog.ui.GraphicsRoundedPanel.prototype.radii_;\n\n\n/**\n * A 4-element array containing the arc start angles for the bottom-left,\n * top-left, top-right, and bottom-right corners, respectively.\n * @type {Array<number>}\n * @private\n */\ngoog.ui.GraphicsRoundedPanel.prototype.startAngles_;\n\n\n/**\n * Thickness constant used as an offset to help determine where to start\n * rendering.\n * @type {number}\n * @private\n */\ngoog.ui.GraphicsRoundedPanel.BORDER_WIDTH_FACTOR_ = 1 / 2;\n\n\n/**\n * This method performs all the necessary DOM manipulation to create the panel.\n * Overrides {@link goog.ui.Component#decorateInternal}.\n * @param {Element} element The element to decorate.\n * @protected\n * @override\n */\ngoog.ui.GraphicsRoundedPanel.prototype.decorateInternal = function(element) {\n  goog.ui.GraphicsRoundedPanel.superClass_.decorateInternal.call(this, element);\n\n  // Calculate the points and angles for creating the rounded corners. Then\n  // instantiate a Graphics object for drawing purposes.\n  var elementSize = goog.style.getSize(this.getElement());\n  this.calculateArcParameters_(elementSize);\n  this.graphics_ = goog.graphics.createGraphics(\n      /** @type {number} */ (elementSize.width),\n      /** @type {number} */ (elementSize.height),\n      /** @type {number} */ (elementSize.width),\n      /** @type {number} */ (elementSize.height), this.getDomHelper());\n  this.graphics_.createDom();\n\n  // Create the path, starting from the bottom-right corner, moving clockwise.\n  // End with the top-right corner.\n  var path = new goog.graphics.Path();\n  for (var i = 0; i < 4; i++) {\n    if (this.radii_[i]) {\n      // If radius > 0, draw an arc, moving to the first point and drawing\n      // a line to the others.\n      var cx = this.arcCenters_[i].x;\n      var cy = this.arcCenters_[i].y;\n      var rx = this.radii_[i];\n      var ry = rx;\n      var fromAngle = this.startAngles_[i];\n      var extent = this.endAngles_[i] - fromAngle;\n      var startX = cx + goog.math.angleDx(fromAngle, rx);\n      var startY = cy + goog.math.angleDy(fromAngle, ry);\n      if (i > 0) {\n        var currentPoint = path.getCurrentPoint();\n        if (!currentPoint || startX != currentPoint[0] ||\n            startY != currentPoint[1]) {\n          path.lineTo(startX, startY);\n        }\n      } else {\n        path.moveTo(startX, startY);\n      }\n      path.arcTo(rx, ry, fromAngle, extent);\n    } else if (i == 0) {\n      // If we're just starting out (ie. i == 0), move to the starting point.\n      path.moveTo(this.cornerStarts_[i].x, this.cornerStarts_[i].y);\n    } else {\n      // Otherwise, draw a line to the starting point.\n      path.lineTo(this.cornerStarts_[i].x, this.cornerStarts_[i].y);\n    }\n  }\n\n  // Close the path, create a stroke object, and fill the enclosed area, if\n  // needed. Then render the path.\n  path.close();\n  var stroke = this.borderWidth_ ?\n      new goog.graphics.Stroke(this.borderWidth_, this.borderColor_) :\n      null;\n  var fill = this.backgroundColor_ ?\n      new goog.graphics.SolidFill(this.backgroundColor_, 1) :\n      null;\n  this.graphics_.drawPath(path, stroke, fill);\n  this.graphics_.render(this.backgroundElement_);\n};\n\n\n/** @override */\ngoog.ui.GraphicsRoundedPanel.prototype.disposeInternal = function() {\n  goog.ui.GraphicsRoundedPanel.superClass_.disposeInternal.call(this);\n  this.graphics_.dispose();\n  delete this.graphics_;\n  delete this.radii_;\n  delete this.cornerStarts_;\n  delete this.arcCenters_;\n  delete this.startAngles_;\n  delete this.endAngles_;\n};\n\n\n/**\n * Calculates the start coordinates, circle centers, and angles, for the rounded\n * corners at each corner of the panel.\n * @param {goog.math.Size} elementSize The size of element_.\n * @private\n */\ngoog.ui.GraphicsRoundedPanel.prototype.calculateArcParameters_ = function(\n    elementSize) {\n  // Initialize the arrays containing the key points and angles.\n  this.radii_ = [];\n  this.cornerStarts_ = [];\n  this.arcCenters_ = [];\n  this.startAngles_ = [];\n  this.endAngles_ = [];\n\n  // Set the start points, circle centers, and angles for the bottom-right,\n  // bottom-left, top-left and top-right corners, in that order.\n  var angleInterval = 90;\n  var borderWidthOffset =\n      this.borderWidth_ * goog.ui.GraphicsRoundedPanel.BORDER_WIDTH_FACTOR_;\n  var radius, xStart, yStart, xCenter, yCenter, startAngle, endAngle;\n  for (var i = 0; i < 4; i++) {\n    var corner = Math.pow(2, i);  // Determines which corner we're dealing with.\n    var isLeft = corner & goog.ui.RoundedPanel.Corner.LEFT;\n    var isTop = corner & goog.ui.RoundedPanel.Corner.TOP;\n\n    // Calculate the radius and the start coordinates.\n    radius = corner & this.corners_ ? this.radius_ : 0;\n    switch (corner) {\n      case goog.ui.RoundedPanel.Corner.BOTTOM_LEFT:\n        xStart = borderWidthOffset + radius;\n        yStart = elementSize.height - borderWidthOffset;\n        break;\n      case goog.ui.RoundedPanel.Corner.TOP_LEFT:\n        xStart = borderWidthOffset;\n        yStart = radius + borderWidthOffset;\n        break;\n      case goog.ui.RoundedPanel.Corner.TOP_RIGHT:\n        xStart = elementSize.width - radius - borderWidthOffset;\n        yStart = borderWidthOffset;\n        break;\n      case goog.ui.RoundedPanel.Corner.BOTTOM_RIGHT:\n        xStart = elementSize.width - borderWidthOffset;\n        yStart = elementSize.height - radius - borderWidthOffset;\n        break;\n    }\n\n    // Calculate the circle centers and start/end angles.\n    xCenter = isLeft ? radius + borderWidthOffset :\n                       elementSize.width - radius - borderWidthOffset;\n    yCenter = isTop ? radius + borderWidthOffset :\n                      elementSize.height - radius - borderWidthOffset;\n    startAngle = angleInterval * i;\n    endAngle = startAngle + angleInterval;\n\n    // Append the radius, angles, and coordinates to their arrays.\n    this.radii_[i] = radius;\n    this.cornerStarts_[i] = new goog.math.Coordinate(xStart, yStart);\n    this.arcCenters_[i] = new goog.math.Coordinate(xCenter, yCenter);\n    this.startAngles_[i] = startAngle;\n    this.endAngles_[i] = endAngle;\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^:;","^:=","^9>","^:S","^@>","^>8","^<2","^<3","^;5","^H;","^;=","^H5"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/roundedpanel.js"],"^:1",["^9K",["~$goog.ui.CssRoundedPanel","~$goog.ui.BaseRoundedPanel","~$goog.ui.RoundedPanel","~$goog.ui.RoundedPanel.Corner","~$goog.ui.GraphicsRoundedPanel"]],"^9<",true,"^9=",["^9>","^:E","^;;","^;=","^:;","^H;","^@>","^H5","^;5","^<2","^>8","^<3","^:=","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.math.paths.js","^9C",["^9D","goog/math/paths.js"],"^9E","goog/math/paths.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Factories for common path types.\n * @author nicksantos@google.com (Nick Santos)\n */\n\n\ngoog.provide('goog.math.paths');\n\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.math.Path');\n\n\n/**\n * Defines a regular n-gon by specifing the center, a vertex, and the total\n * number of vertices.\n * @param {goog.math.Coordinate} center The center point.\n * @param {goog.math.Coordinate} vertex The vertex, which implicitly defines\n *     a radius as well.\n * @param {number} n The number of vertices.\n * @return {!goog.math.Path} The path.\n */\ngoog.math.paths.createRegularNGon = function(center, vertex, n) {\n  var path = new goog.math.Path();\n  path.moveTo(vertex.x, vertex.y);\n\n  var startAngle = Math.atan2(vertex.y - center.y, vertex.x - center.x);\n  var radius = goog.math.Coordinate.distance(center, vertex);\n  for (var i = 1; i < n; i++) {\n    var angle = startAngle + 2 * Math.PI * (i / n);\n    path.lineTo(\n        center.x + radius * Math.cos(angle),\n        center.y + radius * Math.sin(angle));\n  }\n  path.close();\n  return path;\n};\n\n\n/**\n * Defines an arrow.\n * @param {goog.math.Coordinate} a Point A.\n * @param {goog.math.Coordinate} b Point B.\n * @param {?number} aHead The size of the arrow head at point A.\n *     0 omits the head.\n * @param {?number} bHead The size of the arrow head at point B.\n *     0 omits the head.\n * @return {!goog.math.Path} The path.\n */\ngoog.math.paths.createArrow = function(a, b, aHead, bHead) {\n  var path = new goog.math.Path();\n  path.moveTo(a.x, a.y);\n  path.lineTo(b.x, b.y);\n\n  var angle = Math.atan2(b.y - a.y, b.x - a.x);\n  if (aHead) {\n    path.appendPath(\n        goog.math.paths.createRegularNGon(\n            new goog.math.Coordinate(\n                a.x + aHead * Math.cos(angle), a.y + aHead * Math.sin(angle)),\n            a, 3));\n  }\n  if (bHead) {\n    path.appendPath(\n        goog.math.paths.createRegularNGon(\n            new goog.math.Coordinate(\n                b.x + bHead * Math.cos(angle + Math.PI),\n                b.y + bHead * Math.sin(angle + Math.PI)),\n            b, 3));\n  }\n  return path;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.math.Path","^>8"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/paths.js"],"^:1",["^9K",["~$goog.math.paths"]],"^9<",true,"^9=",["^9>","^>8","^L9"]],["^ ","^9A",[1579837703000],"^9B","goog.events.actionhandler.js","^9C",["^9D","goog/events/actionhandler.js"],"^9E","goog/events/actionhandler.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This file contains a class to provide a unified mechanism for\n * CLICK and enter KEYDOWN events. This provides better accessibility by\n * providing the given functionality to a keyboard user which is otherwise\n * would be available only via a mouse click.\n *\n * If there is an existing CLICK listener or planning to be added as below -\n *\n * <code>this.eventHandler_.listen(el, CLICK, this.onClick_);<code>\n *\n * it can be replaced with an ACTION listener as follows:\n *\n * <code>this.eventHandler_.listen(\n *    new goog.events.ActionHandler(el),\n *    ACTION,\n *    this.onAction_);<code>\n *\n */\n\ngoog.provide('goog.events.ActionEvent');\ngoog.provide('goog.events.ActionHandler');\ngoog.provide('goog.events.ActionHandler.EventType');\ngoog.provide('goog.events.BeforeActionEvent');\n\ngoog.require('goog.events');\ngoog.require('goog.events.BrowserEvent');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A wrapper around an element that you want to listen to ACTION events on.\n * @param {Element|Document} element The element or document to listen on.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.events.ActionHandler = function(element) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * This is the element that we will listen to events on.\n   * @type {Element|Document}\n   * @private\n   */\n  this.element_ = element;\n\n  goog.events.listen(\n      element, goog.events.EventType.KEYDOWN, this.handleKeyDown_, false, this);\n  goog.events.listen(\n      element, goog.events.EventType.CLICK, this.handleClick_, false, this);\n};\ngoog.inherits(goog.events.ActionHandler, goog.events.EventTarget);\n\n\n/**\n * Enum type for the events fired by the action handler\n * @enum {string}\n */\ngoog.events.ActionHandler.EventType = {\n  ACTION: 'action',\n  BEFOREACTION: 'beforeaction'\n};\n\n\n/**\n * Handles key press events.\n * @param {!goog.events.BrowserEvent} e The key press event.\n * @private\n */\ngoog.events.ActionHandler.prototype.handleKeyDown_ = function(e) {\n  if (e.keyCode == goog.events.KeyCodes.ENTER ||\n      goog.userAgent.WEBKIT && e.keyCode == goog.events.KeyCodes.MAC_ENTER) {\n    this.dispatchEvents_(e);\n  }\n};\n\n\n/**\n * Handles mouse events.\n * @param {!goog.events.BrowserEvent} e The click event.\n * @private\n */\ngoog.events.ActionHandler.prototype.handleClick_ = function(e) {\n  this.dispatchEvents_(e);\n};\n\n\n/**\n * Dispatches BeforeAction and Action events to the element\n * @param {!goog.events.BrowserEvent} e The event causing dispatches.\n * @private\n */\ngoog.events.ActionHandler.prototype.dispatchEvents_ = function(e) {\n  var beforeActionEvent = new goog.events.BeforeActionEvent(e);\n\n  // Allow application specific logic here before the ACTION event.\n  // For example, Gmail uses this event to restore keyboard focus\n  if (!this.dispatchEvent(beforeActionEvent)) {\n    // If the listener swallowed the BEFOREACTION event, don't dispatch the\n    // ACTION event.\n    return;\n  }\n\n\n  // Wrap up original event and send it off\n  var actionEvent = new goog.events.ActionEvent(e);\n  try {\n    this.dispatchEvent(actionEvent);\n  } finally {\n    // Stop propagating the event\n    e.stopPropagation();\n  }\n};\n\n\n/** @override */\ngoog.events.ActionHandler.prototype.disposeInternal = function() {\n  goog.events.ActionHandler.superClass_.disposeInternal.call(this);\n  goog.events.unlisten(\n      this.element_, goog.events.EventType.KEYDOWN, this.handleKeyDown_, false,\n      this);\n  goog.events.unlisten(\n      this.element_, goog.events.EventType.CLICK, this.handleClick_, false,\n      this);\n  delete this.element_;\n};\n\n\n\n/**\n * This class is used for the goog.events.ActionHandler.EventType.ACTION event.\n * @param {!goog.events.BrowserEvent} browserEvent Browser event object.\n * @constructor\n * @extends {goog.events.BrowserEvent}\n * @final\n */\ngoog.events.ActionEvent = function(browserEvent) {\n  goog.events.BrowserEvent.call(this, browserEvent.getBrowserEvent());\n  this.type = goog.events.ActionHandler.EventType.ACTION;\n};\ngoog.inherits(goog.events.ActionEvent, goog.events.BrowserEvent);\n\n\n\n/**\n * This class is used for the goog.events.ActionHandler.EventType.BEFOREACTION\n * event. BEFOREACTION gives a chance to the application so the keyboard focus\n * can be restored back, if required.\n * @param {!goog.events.BrowserEvent} browserEvent Browser event object.\n * @constructor\n * @extends {goog.events.BrowserEvent}\n * @final\n */\ngoog.events.BeforeActionEvent = function(browserEvent) {\n  goog.events.BrowserEvent.call(this, browserEvent.getBrowserEvent());\n  this.type = goog.events.ActionHandler.EventType.BEFOREACTION;\n};\ngoog.inherits(goog.events.BeforeActionEvent, goog.events.BrowserEvent);\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:L","^:S","^:I","^<4","^>R","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/actionhandler.js"],"^:1",["^9K",["~$goog.events.ActionHandler.EventType","~$goog.events.ActionHandler","~$goog.events.ActionEvent","~$goog.events.BeforeActionEvent"]],"^9<",true,"^9=",["^9>","^:N","^<4","^:L","^:I","^>R","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.proto2.pbliteserializer.js","^9C",["^9D","goog/proto2/pbliteserializer.js"],"^9E","goog/proto2/pbliteserializer.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Protocol Buffer 2 Serializer which serializes messages\n *  into PB-Lite (\"JsPbLite\") format.\n *\n * PB-Lite format is an array where each index corresponds to the associated tag\n * number. For example, a message like so:\n *\n * message Foo {\n *   optional int bar = 1;\n *   optional int baz = 2;\n *   optional int bop = 4;\n * }\n *\n * would be represented as such:\n *\n * [, (bar data), (baz data), (nothing), (bop data)]\n *\n * Note that since the array index is used to represent the tag number, sparsely\n * populated messages with tag numbers that are not continuous (and/or are very\n * large) will have many (empty) spots and thus, are inefficient.\n *\n *\n */\n\ngoog.provide('goog.proto2.PbLiteSerializer');\n\ngoog.require('goog.asserts');\ngoog.require('goog.proto2.FieldDescriptor');\ngoog.require('goog.proto2.LazyDeserializer');\ngoog.require('goog.proto2.Serializer');\n\n\n\n/**\n * PB-Lite serializer.\n *\n * @constructor\n * @extends {goog.proto2.LazyDeserializer}\n */\ngoog.proto2.PbLiteSerializer = function() {};\ngoog.inherits(goog.proto2.PbLiteSerializer, goog.proto2.LazyDeserializer);\n\n\n/**\n * If true, fields will be serialized with 0-indexed tags (i.e., the proto\n * field with tag id 1 will have index 0 in the array).\n * @type {boolean}\n * @private\n */\ngoog.proto2.PbLiteSerializer.prototype.zeroIndexing_ = false;\n\n\n/**\n * By default, the proto tag with id 1 will have index 1 in the serialized\n * array.\n *\n * If the serializer is set to use zero-indexing, the tag with id 1 will have\n * index 0.\n *\n * @param {boolean} zeroIndexing Whether this serializer should deal with\n *     0-indexed protos.\n */\ngoog.proto2.PbLiteSerializer.prototype.setZeroIndexed = function(zeroIndexing) {\n  this.zeroIndexing_ = zeroIndexing;\n};\n\n\n/**\n * Serializes a message to a PB-Lite object.\n *\n * @param {goog.proto2.Message} message The message to be serialized.\n * @return {!Array<?>} The serialized form of the message.\n * @override\n */\ngoog.proto2.PbLiteSerializer.prototype.serialize = function(message) {\n  var descriptor = message.getDescriptor();\n  var fields = descriptor.getFields();\n\n  var serialized = [];\n  var zeroIndexing = this.zeroIndexing_;\n\n  // Add the known fields.\n  for (var i = 0; i < fields.length; i++) {\n    var field = fields[i];\n\n    if (!message.has(field)) {\n      continue;\n    }\n\n    var tag = field.getTag();\n    var index = zeroIndexing ? tag - 1 : tag;\n\n    if (field.isRepeated()) {\n      serialized[index] = [];\n\n      for (var j = 0; j < message.countOf(field); j++) {\n        serialized[index][j] =\n            this.getSerializedValue(field, message.get(field, j));\n      }\n    } else {\n      serialized[index] = this.getSerializedValue(field, message.get(field));\n    }\n  }\n\n  // Add any unknown fields.\n  message.forEachUnknown(function(tag, value) {\n    var index = zeroIndexing ? tag - 1 : tag;\n    serialized[index] = value;\n  });\n\n  return serialized;\n};\n\n\n/** @override */\ngoog.proto2.PbLiteSerializer.prototype.deserializeField = function(\n    message, field, value) {\n\n  if (value == null) {\n    // Since value double-equals null, it may be either null or undefined.\n    // Ensure we return the same one, since they have different meanings.\n    // TODO(user): If the field is repeated, this method should probably\n    // return [] instead of null.\n    return value;\n  }\n\n  if (field.isRepeated()) {\n    var data = [];\n\n    goog.asserts.assert(goog.isArray(value), 'Value must be array: %s', value);\n\n    for (var i = 0; i < value.length; i++) {\n      data[i] = this.getDeserializedValue(field, value[i]);\n    }\n\n    return data;\n  } else {\n    return this.getDeserializedValue(field, value);\n  }\n};\n\n\n/** @override */\ngoog.proto2.PbLiteSerializer.prototype.getSerializedValue = function(\n    field, value) {\n  if (field.getFieldType() == goog.proto2.FieldDescriptor.FieldType.BOOL) {\n    // Booleans are serialized in numeric form.\n    return value ? 1 : 0;\n  }\n\n  return goog.proto2.Serializer.prototype.getSerializedValue.apply(\n      this, arguments);\n};\n\n\n/** @override */\ngoog.proto2.PbLiteSerializer.prototype.getDeserializedValue = function(\n    field, value) {\n\n  if (field.getFieldType() == goog.proto2.FieldDescriptor.FieldType.BOOL) {\n    goog.asserts.assert(\n        typeof value === 'number' || typeof value === 'boolean',\n        'Value is expected to be a number or boolean');\n    return !!value;\n  }\n\n  return goog.proto2.Serializer.prototype.getDeserializedValue.apply(\n      this, arguments);\n};\n\n\n/** @override */\ngoog.proto2.PbLiteSerializer.prototype.deserialize = function(\n    descriptor, data) {\n  var toConvert = data;\n  if (this.zeroIndexing_) {\n    // Make the data align with tag-IDs (1-indexed) by shifting everything\n    // up one.\n    toConvert = [];\n    for (var key in data) {\n      toConvert[parseInt(key, 10) + 1] = data[key];\n    }\n  }\n  return goog.proto2.PbLiteSerializer.base(\n      this, 'deserialize', descriptor, toConvert);\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.proto2.LazyDeserializer","~$goog.proto2.Serializer","^9>","^I7"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/proto2/pbliteserializer.js"],"^:1",["^9K",["~$goog.proto2.PbLiteSerializer"]],"^9<",true,"^9=",["^9>","^:E","^I7","^L?","^L@"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.dimensionpicker.js","^9C",["^9D","goog/ui/dimensionpicker.js"],"^9E","goog/ui/dimensionpicker.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A dimension picker control.  A dimension picker allows the\n * user to visually select a row and column count.\n *\n * @author robbyw@google.com (Robby Walker)\n * @see ../demos/dimensionpicker.html\n * @see ../demos/dimensionpicker_rtl.html\n */\n\ngoog.provide('goog.ui.DimensionPicker');\n\ngoog.require('goog.events.BrowserEvent.PointerType');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.math.Size');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.ComponentUtil');\ngoog.require('goog.ui.Control');\ngoog.require('goog.ui.DimensionPickerRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * A dimension picker allows the user to visually select a row and column\n * count using their mouse and keyboard.\n *\n * The currently selected dimension is controlled by an ACTION event.  Event\n * listeners may retrieve the selected item using the\n * {@link #getValue} method.\n *\n * @param {goog.ui.DimensionPickerRenderer=} opt_renderer Renderer used to\n *     render or decorate the palette; defaults to\n *     {@link goog.ui.DimensionPickerRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.Control}\n * @final\n */\ngoog.ui.DimensionPicker = function(opt_renderer, opt_domHelper) {\n  goog.ui.Control.call(\n      this, null, opt_renderer || goog.ui.DimensionPickerRenderer.getInstance(),\n      opt_domHelper);\n\n  this.size_ = new goog.math.Size(this.minColumns, this.minRows);\n};\ngoog.inherits(goog.ui.DimensionPicker, goog.ui.Control);\n\n\n/**\n * Minimum number of columns to show in the grid.\n * @type {number}\n */\ngoog.ui.DimensionPicker.prototype.minColumns = 5;\n\n\n/**\n * Minimum number of rows to show in the grid.\n * @type {number}\n */\ngoog.ui.DimensionPicker.prototype.minRows = 5;\n\n\n/**\n * Maximum number of columns to show in the grid.\n * @type {number}\n */\ngoog.ui.DimensionPicker.prototype.maxColumns = 20;\n\n\n/**\n * Maximum number of rows to show in the grid.\n * @type {number}\n */\ngoog.ui.DimensionPicker.prototype.maxRows = 20;\n\n\n/**\n * Palette dimensions (columns x rows).\n * @type {goog.math.Size}\n * @private\n */\ngoog.ui.DimensionPicker.prototype.size_;\n\n\n/**\n * Currently highlighted row count.\n * @type {number}\n * @private\n */\ngoog.ui.DimensionPicker.prototype.highlightedRows_ = 1;\n\n\n/**\n * Currently highlighted column count.\n * @type {number}\n * @private\n */\ngoog.ui.DimensionPicker.prototype.highlightedColumns_ = 1;\n\n\n/** @override */\ngoog.ui.DimensionPicker.prototype.enterDocument = function() {\n  goog.ui.DimensionPicker.superClass_.enterDocument.call(this);\n\n  var MouseEventType = goog.ui.ComponentUtil.getMouseEventType(this);\n\n  var handler = this.getHandler();\n  handler\n      .listen(\n          this.getRenderer().getMouseMoveElement(this),\n          MouseEventType.MOUSEMOVE, this.handleMouseMove)\n      .listen(\n          this.getDomHelper().getWindow(), goog.events.EventType.RESIZE,\n          this.handleWindowResize);\n\n  var parent = this.getParent();\n  if (parent) {\n    handler.listen(parent, goog.ui.Component.EventType.SHOW, this.handleShow_);\n  }\n};\n\n\n/** @override */\ngoog.ui.DimensionPicker.prototype.exitDocument = function() {\n  goog.ui.DimensionPicker.superClass_.exitDocument.call(this);\n\n  var MouseEventType = goog.ui.ComponentUtil.getMouseEventType(this);\n\n  var handler = this.getHandler();\n  handler\n      .unlisten(\n          this.getRenderer().getMouseMoveElement(this),\n          MouseEventType.MOUSEMOVE, this.handleMouseMove)\n      .unlisten(\n          this.getDomHelper().getWindow(), goog.events.EventType.RESIZE,\n          this.handleWindowResize);\n\n  var parent = this.getParent();\n  if (parent) {\n    handler.unlisten(\n        parent, goog.ui.Component.EventType.SHOW, this.handleShow_);\n  }\n};\n\n\n/**\n * Resets the highlighted size when the picker is shown.\n * @private\n */\ngoog.ui.DimensionPicker.prototype.handleShow_ = function() {\n  if (this.isVisible()) {\n    this.setValue(1, 1);\n  }\n};\n\n\n/** @override */\ngoog.ui.DimensionPicker.prototype.disposeInternal = function() {\n  goog.ui.DimensionPicker.superClass_.disposeInternal.call(this);\n  delete this.size_;\n};\n\n\n// Palette event handling.\n\n\n/**\n * Handles mousemove events. Determines which palette size was moused over and\n * highlights it.\n * @param {goog.events.BrowserEvent} e Mouse event to handle.\n * @protected\n */\ngoog.ui.DimensionPicker.prototype.handleMouseMove = function(e) {\n  var highlightedSizeX = this.getRenderer().getGridOffsetX(\n      this, this.isRightToLeft() ?\n          /** @type {!HTMLElement} */ (e.target).offsetWidth - e.offsetX :\n          e.offsetX);\n  var highlightedSizeY = this.getRenderer().getGridOffsetY(this, e.offsetY);\n\n  this.setValue(highlightedSizeX, highlightedSizeY);\n};\n\n\n/**\n * Override `handleMouseDown` for pointer events.\n * @override\n */\ngoog.ui.DimensionPicker.prototype.handleMouseDown = function(e) {\n  // For touch events, check for intersection with the grid element to prevent\n  // taps on the invisible mouse catcher element from performing an action.\n  if (goog.ui.DimensionPicker.isTouchEvent_(e) && !this.isEventOnGrid_(e)) {\n    return;\n  }\n\n  goog.ui.DimensionPicker.base(this, 'handleMouseDown', e);\n\n  // For touch events, delegate to `handleMouseMove` to update the highlight\n  // state immediately. Not needed for mouse since we assume hover mousemove\n  // events have already taken care of this.\n  if (goog.ui.DimensionPicker.isTouchEvent_(e)) {\n    this.handleMouseMove(/** @type {?goog.events.BrowserEvent} */ (e));\n  }\n};\n\n\n/**\n * Override `handleMouseUp` for pointer events.\n * @override\n */\ngoog.ui.DimensionPicker.prototype.handleMouseUp = function(e) {\n  // For touch events, check for intersection with the grid element to prevent\n  // taps on the invisible mouse catcher element from performing an action.\n  if (goog.ui.DimensionPicker.isTouchEvent_(e) && !this.isEventOnGrid_(e)) {\n    return;\n  }\n\n  goog.ui.DimensionPicker.base(this, 'handleMouseUp', e);\n};\n\n\n/**\n * Handles window resize events.  Ensures no scrollbars are introduced by the\n * renderer's mouse catcher.\n * @param {goog.events.Event} e Resize event to handle.\n * @protected\n */\ngoog.ui.DimensionPicker.prototype.handleWindowResize = function(e) {\n  this.getRenderer().positionMouseCatcher(this);\n};\n\n\n/**\n * Handle key events if supported, so the user can use the keyboard to\n * manipulate the highlighted rows and columns.\n * @param {goog.events.KeyEvent} e The key event object.\n * @return {boolean} Whether the key event was handled.\n * @override\n */\ngoog.ui.DimensionPicker.prototype.handleKeyEvent = function(e) {\n  var rows = this.highlightedRows_;\n  var columns = this.highlightedColumns_;\n  switch (e.keyCode) {\n    case goog.events.KeyCodes.DOWN:\n      rows++;\n      break;\n    case goog.events.KeyCodes.UP:\n      rows--;\n      break;\n    case goog.events.KeyCodes.LEFT:\n      if (this.isRightToLeft()) {\n        columns++;\n      } else {\n        if (columns == 1) {\n          // Delegate to parent.\n          return false;\n        } else {\n          columns--;\n        }\n      }\n      break;\n    case goog.events.KeyCodes.RIGHT:\n      if (this.isRightToLeft()) {\n        if (columns == 1) {\n          // Delegate to parent.\n          return false;\n        } else {\n          columns--;\n        }\n      } else {\n        columns++;\n      }\n      break;\n    default:\n      return goog.ui.DimensionPicker.superClass_.handleKeyEvent.call(this, e);\n  }\n  this.setValue(columns, rows);\n  return true;\n};\n\n\n// Palette management.\n\n\n/**\n * @return {goog.math.Size} Current table size shown (columns x rows).\n */\ngoog.ui.DimensionPicker.prototype.getSize = function() {\n  return this.size_;\n};\n\n\n/**\n * @return {!goog.math.Size} size The currently highlighted dimensions.\n */\ngoog.ui.DimensionPicker.prototype.getValue = function() {\n  return new goog.math.Size(this.highlightedColumns_, this.highlightedRows_);\n};\n\n\n/**\n * Sets the currently highlighted dimensions. If the dimensions are not valid\n * (not between 1 and the maximum number of columns/rows to show), they will\n * be changed to the closest valid value.\n * @param {(number|!goog.math.Size)} columns The number of columns to highlight,\n *     or a goog.math.Size object containing both.\n * @param {number=} opt_rows The number of rows to highlight.  Can be\n *     omitted when columns is a good.math.Size object.\n */\ngoog.ui.DimensionPicker.prototype.setValue = function(columns, opt_rows) {\n  if (opt_rows === undefined) {\n    columns = /** @type {!goog.math.Size} */ (columns);\n    opt_rows = columns.height;\n    columns = columns.width;\n  } else {\n    columns = /** @type {number} */ (columns);\n  }\n\n  // Ensure that the row and column values are within the minimum value (1) and\n  // maxmimum values.\n  columns = Math.max(1, columns);\n  opt_rows = Math.max(1, opt_rows);\n  columns = Math.min(this.maxColumns, columns);\n  opt_rows = Math.min(this.maxRows, opt_rows);\n\n  if (this.highlightedColumns_ != columns ||\n      this.highlightedRows_ != opt_rows) {\n    var renderer = this.getRenderer();\n    // Show one more row/column than highlighted so the user understands the\n    // palette can grow.\n    this.size_.width =\n        Math.max(Math.min(columns + 1, this.maxColumns), this.minColumns);\n    this.size_.height =\n        Math.max(Math.min(opt_rows + 1, this.maxRows), this.minRows);\n    renderer.updateSize(this, this.getElement());\n\n    this.highlightedColumns_ = columns;\n    this.highlightedRows_ = opt_rows;\n    renderer.setHighlightedSize(this, columns, opt_rows);\n  }\n};\n\n\n/**\n * Returns whether the given event intersects the grid element.\n * @param {?goog.events.Event} e Mouse event to handle.\n * @return {boolean}\n * @private\n */\ngoog.ui.DimensionPicker.prototype.isEventOnGrid_ = function(e) {\n  var gridEl = this.getRenderer().getMouseMoveElement(this);\n  var gridBounds = gridEl.getBoundingClientRect();\n  return e.clientX >= gridBounds.left && e.clientX <= gridBounds.right &&\n      e.clientY >= gridBounds.top && e.clientY <= gridBounds.bottom;\n};\n\n\n/**\n * @param {?goog.events.Event} e Mouse or pointer event to handle.\n * @return {boolean}\n * @private\n */\ngoog.ui.DimensionPicker.isTouchEvent_ = function(e) {\n  return e.pointerType &&\n      e.pointerType != goog.events.BrowserEvent.PointerType.MOUSE;\n};\n\n\n/**\n * Register this control so it can be created from markup\n */\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.DimensionPickerRenderer.CSS_CLASS,\n    function() { return new goog.ui.DimensionPicker(); });\n","^9I",1579837703000,"^9J",["^9K",["~$goog.ui.DimensionPickerRenderer","^:=","^G4","^J4","^9>","^:>","^:I","^=T","~$goog.events.BrowserEvent.PointerType","^>R"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/dimensionpicker.js"],"^:1",["^9K",["~$goog.ui.DimensionPicker"]],"^9<",true,"^9=",["^9>","^LC","^:I","^>R","^G4","^:=","^J4","^=T","^LB","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.tagname.js","^9C",["^9D","goog/dom/tagname.js"],"^9E","goog/dom/tagname.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines the goog.dom.TagName class. Its constants enumerate\n * all HTML tag names specified in either the W3C HTML 4.01 index of elements\n * or the HTML5.1 specification.\n *\n * References:\n * https://www.w3.org/TR/html401/index/elements.html\n * https://www.w3.org/TR/html51/dom.html#elements\n */\ngoog.provide('goog.dom.TagName');\n\ngoog.require('goog.dom.HtmlElement');\n\n\n/**\n * A tag name with the type of the element stored in the generic.\n * @param {string} tagName\n * @constructor\n * @template T\n */\ngoog.dom.TagName = function(tagName) {\n  /** @private {string} */\n  this.tagName_ = tagName;\n};\n\n\n/**\n * Returns the tag name.\n * @return {string}\n * @override\n */\ngoog.dom.TagName.prototype.toString = function() {\n  return this.tagName_;\n};\n\n\n// Closure Compiler unconditionally converts the following constants to their\n// string value (goog.dom.TagName.A -> 'A'). These are the consequences:\n// 1. Don't add any members or static members to goog.dom.TagName as they\n//    couldn't be accessed after this optimization.\n// 2. Keep the constant name and its string value the same:\n//    goog.dom.TagName.X = new goog.dom.TagName('Y');\n//    is converted to 'X', not 'Y'.\n\n\n/** @type {!goog.dom.TagName<!HTMLAnchorElement>} */\ngoog.dom.TagName.A = new goog.dom.TagName('A');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.ABBR = new goog.dom.TagName('ABBR');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.ACRONYM = new goog.dom.TagName('ACRONYM');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.ADDRESS = new goog.dom.TagName('ADDRESS');\n\n\n/** @type {!goog.dom.TagName<!HTMLAppletElement>} */\ngoog.dom.TagName.APPLET = new goog.dom.TagName('APPLET');\n\n\n/** @type {!goog.dom.TagName<!HTMLAreaElement>} */\ngoog.dom.TagName.AREA = new goog.dom.TagName('AREA');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.ARTICLE = new goog.dom.TagName('ARTICLE');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.ASIDE = new goog.dom.TagName('ASIDE');\n\n\n/** @type {!goog.dom.TagName<!HTMLAudioElement>} */\ngoog.dom.TagName.AUDIO = new goog.dom.TagName('AUDIO');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.B = new goog.dom.TagName('B');\n\n\n/** @type {!goog.dom.TagName<!HTMLBaseElement>} */\ngoog.dom.TagName.BASE = new goog.dom.TagName('BASE');\n\n\n/** @type {!goog.dom.TagName<!HTMLBaseFontElement>} */\ngoog.dom.TagName.BASEFONT = new goog.dom.TagName('BASEFONT');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.BDI = new goog.dom.TagName('BDI');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.BDO = new goog.dom.TagName('BDO');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.BIG = new goog.dom.TagName('BIG');\n\n\n/** @type {!goog.dom.TagName<!HTMLQuoteElement>} */\ngoog.dom.TagName.BLOCKQUOTE = new goog.dom.TagName('BLOCKQUOTE');\n\n\n/** @type {!goog.dom.TagName<!HTMLBodyElement>} */\ngoog.dom.TagName.BODY = new goog.dom.TagName('BODY');\n\n\n/** @type {!goog.dom.TagName<!HTMLBRElement>} */\ngoog.dom.TagName.BR = new goog.dom.TagName('BR');\n\n\n/** @type {!goog.dom.TagName<!HTMLButtonElement>} */\ngoog.dom.TagName.BUTTON = new goog.dom.TagName('BUTTON');\n\n\n/** @type {!goog.dom.TagName<!HTMLCanvasElement>} */\ngoog.dom.TagName.CANVAS = new goog.dom.TagName('CANVAS');\n\n\n/** @type {!goog.dom.TagName<!HTMLTableCaptionElement>} */\ngoog.dom.TagName.CAPTION = new goog.dom.TagName('CAPTION');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.CENTER = new goog.dom.TagName('CENTER');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.CITE = new goog.dom.TagName('CITE');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.CODE = new goog.dom.TagName('CODE');\n\n\n/** @type {!goog.dom.TagName<!HTMLTableColElement>} */\ngoog.dom.TagName.COL = new goog.dom.TagName('COL');\n\n\n/** @type {!goog.dom.TagName<!HTMLTableColElement>} */\ngoog.dom.TagName.COLGROUP = new goog.dom.TagName('COLGROUP');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.COMMAND = new goog.dom.TagName('COMMAND');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.DATA = new goog.dom.TagName('DATA');\n\n\n/** @type {!goog.dom.TagName<!HTMLDataListElement>} */\ngoog.dom.TagName.DATALIST = new goog.dom.TagName('DATALIST');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.DD = new goog.dom.TagName('DD');\n\n\n/** @type {!goog.dom.TagName<!HTMLModElement>} */\ngoog.dom.TagName.DEL = new goog.dom.TagName('DEL');\n\n\n/** @type {!goog.dom.TagName<!HTMLDetailsElement>} */\ngoog.dom.TagName.DETAILS = new goog.dom.TagName('DETAILS');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.DFN = new goog.dom.TagName('DFN');\n\n\n/** @type {!goog.dom.TagName<!HTMLDialogElement>} */\ngoog.dom.TagName.DIALOG = new goog.dom.TagName('DIALOG');\n\n\n/** @type {!goog.dom.TagName<!HTMLDirectoryElement>} */\ngoog.dom.TagName.DIR = new goog.dom.TagName('DIR');\n\n\n/** @type {!goog.dom.TagName<!HTMLDivElement>} */\ngoog.dom.TagName.DIV = new goog.dom.TagName('DIV');\n\n\n/** @type {!goog.dom.TagName<!HTMLDListElement>} */\ngoog.dom.TagName.DL = new goog.dom.TagName('DL');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.DT = new goog.dom.TagName('DT');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.EM = new goog.dom.TagName('EM');\n\n\n/** @type {!goog.dom.TagName<!HTMLEmbedElement>} */\ngoog.dom.TagName.EMBED = new goog.dom.TagName('EMBED');\n\n\n/** @type {!goog.dom.TagName<!HTMLFieldSetElement>} */\ngoog.dom.TagName.FIELDSET = new goog.dom.TagName('FIELDSET');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.FIGCAPTION = new goog.dom.TagName('FIGCAPTION');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.FIGURE = new goog.dom.TagName('FIGURE');\n\n\n/** @type {!goog.dom.TagName<!HTMLFontElement>} */\ngoog.dom.TagName.FONT = new goog.dom.TagName('FONT');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.FOOTER = new goog.dom.TagName('FOOTER');\n\n\n/** @type {!goog.dom.TagName<!HTMLFormElement>} */\ngoog.dom.TagName.FORM = new goog.dom.TagName('FORM');\n\n\n/** @type {!goog.dom.TagName<!HTMLFrameElement>} */\ngoog.dom.TagName.FRAME = new goog.dom.TagName('FRAME');\n\n\n/** @type {!goog.dom.TagName<!HTMLFrameSetElement>} */\ngoog.dom.TagName.FRAMESET = new goog.dom.TagName('FRAMESET');\n\n\n/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */\ngoog.dom.TagName.H1 = new goog.dom.TagName('H1');\n\n\n/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */\ngoog.dom.TagName.H2 = new goog.dom.TagName('H2');\n\n\n/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */\ngoog.dom.TagName.H3 = new goog.dom.TagName('H3');\n\n\n/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */\ngoog.dom.TagName.H4 = new goog.dom.TagName('H4');\n\n\n/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */\ngoog.dom.TagName.H5 = new goog.dom.TagName('H5');\n\n\n/** @type {!goog.dom.TagName<!HTMLHeadingElement>} */\ngoog.dom.TagName.H6 = new goog.dom.TagName('H6');\n\n\n/** @type {!goog.dom.TagName<!HTMLHeadElement>} */\ngoog.dom.TagName.HEAD = new goog.dom.TagName('HEAD');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.HEADER = new goog.dom.TagName('HEADER');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.HGROUP = new goog.dom.TagName('HGROUP');\n\n\n/** @type {!goog.dom.TagName<!HTMLHRElement>} */\ngoog.dom.TagName.HR = new goog.dom.TagName('HR');\n\n\n/** @type {!goog.dom.TagName<!HTMLHtmlElement>} */\ngoog.dom.TagName.HTML = new goog.dom.TagName('HTML');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.I = new goog.dom.TagName('I');\n\n\n/** @type {!goog.dom.TagName<!HTMLIFrameElement>} */\ngoog.dom.TagName.IFRAME = new goog.dom.TagName('IFRAME');\n\n\n/** @type {!goog.dom.TagName<!HTMLImageElement>} */\ngoog.dom.TagName.IMG = new goog.dom.TagName('IMG');\n\n\n/** @type {!goog.dom.TagName<!HTMLInputElement>} */\ngoog.dom.TagName.INPUT = new goog.dom.TagName('INPUT');\n\n\n/** @type {!goog.dom.TagName<!HTMLModElement>} */\ngoog.dom.TagName.INS = new goog.dom.TagName('INS');\n\n\n/** @type {!goog.dom.TagName<!HTMLIsIndexElement>} */\ngoog.dom.TagName.ISINDEX = new goog.dom.TagName('ISINDEX');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.KBD = new goog.dom.TagName('KBD');\n\n\n// HTMLKeygenElement is deprecated.\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.KEYGEN = new goog.dom.TagName('KEYGEN');\n\n\n/** @type {!goog.dom.TagName<!HTMLLabelElement>} */\ngoog.dom.TagName.LABEL = new goog.dom.TagName('LABEL');\n\n\n/** @type {!goog.dom.TagName<!HTMLLegendElement>} */\ngoog.dom.TagName.LEGEND = new goog.dom.TagName('LEGEND');\n\n\n/** @type {!goog.dom.TagName<!HTMLLIElement>} */\ngoog.dom.TagName.LI = new goog.dom.TagName('LI');\n\n\n/** @type {!goog.dom.TagName<!HTMLLinkElement>} */\ngoog.dom.TagName.LINK = new goog.dom.TagName('LINK');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.MAIN = new goog.dom.TagName('MAIN');\n\n\n/** @type {!goog.dom.TagName<!HTMLMapElement>} */\ngoog.dom.TagName.MAP = new goog.dom.TagName('MAP');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.MARK = new goog.dom.TagName('MARK');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.MATH = new goog.dom.TagName('MATH');\n\n\n/** @type {!goog.dom.TagName<!HTMLMenuElement>} */\ngoog.dom.TagName.MENU = new goog.dom.TagName('MENU');\n\n\n/** @type {!goog.dom.TagName<!HTMLMenuItemElement>} */\ngoog.dom.TagName.MENUITEM = new goog.dom.TagName('MENUITEM');\n\n\n/** @type {!goog.dom.TagName<!HTMLMetaElement>} */\ngoog.dom.TagName.META = new goog.dom.TagName('META');\n\n\n/** @type {!goog.dom.TagName<!HTMLMeterElement>} */\ngoog.dom.TagName.METER = new goog.dom.TagName('METER');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.NAV = new goog.dom.TagName('NAV');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.NOFRAMES = new goog.dom.TagName('NOFRAMES');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.NOSCRIPT = new goog.dom.TagName('NOSCRIPT');\n\n\n/** @type {!goog.dom.TagName<!HTMLObjectElement>} */\ngoog.dom.TagName.OBJECT = new goog.dom.TagName('OBJECT');\n\n\n/** @type {!goog.dom.TagName<!HTMLOListElement>} */\ngoog.dom.TagName.OL = new goog.dom.TagName('OL');\n\n\n/** @type {!goog.dom.TagName<!HTMLOptGroupElement>} */\ngoog.dom.TagName.OPTGROUP = new goog.dom.TagName('OPTGROUP');\n\n\n/** @type {!goog.dom.TagName<!HTMLOptionElement>} */\ngoog.dom.TagName.OPTION = new goog.dom.TagName('OPTION');\n\n\n/** @type {!goog.dom.TagName<!HTMLOutputElement>} */\ngoog.dom.TagName.OUTPUT = new goog.dom.TagName('OUTPUT');\n\n\n/** @type {!goog.dom.TagName<!HTMLParagraphElement>} */\ngoog.dom.TagName.P = new goog.dom.TagName('P');\n\n\n/** @type {!goog.dom.TagName<!HTMLParamElement>} */\ngoog.dom.TagName.PARAM = new goog.dom.TagName('PARAM');\n\n\n/** @type {!goog.dom.TagName<!HTMLPictureElement>} */\ngoog.dom.TagName.PICTURE = new goog.dom.TagName('PICTURE');\n\n\n/** @type {!goog.dom.TagName<!HTMLPreElement>} */\ngoog.dom.TagName.PRE = new goog.dom.TagName('PRE');\n\n\n/** @type {!goog.dom.TagName<!HTMLProgressElement>} */\ngoog.dom.TagName.PROGRESS = new goog.dom.TagName('PROGRESS');\n\n\n/** @type {!goog.dom.TagName<!HTMLQuoteElement>} */\ngoog.dom.TagName.Q = new goog.dom.TagName('Q');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.RP = new goog.dom.TagName('RP');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.RT = new goog.dom.TagName('RT');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.RTC = new goog.dom.TagName('RTC');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.RUBY = new goog.dom.TagName('RUBY');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.S = new goog.dom.TagName('S');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.SAMP = new goog.dom.TagName('SAMP');\n\n\n/** @type {!goog.dom.TagName<!HTMLScriptElement>} */\ngoog.dom.TagName.SCRIPT = new goog.dom.TagName('SCRIPT');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.SECTION = new goog.dom.TagName('SECTION');\n\n\n/** @type {!goog.dom.TagName<!HTMLSelectElement>} */\ngoog.dom.TagName.SELECT = new goog.dom.TagName('SELECT');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.SMALL = new goog.dom.TagName('SMALL');\n\n\n/** @type {!goog.dom.TagName<!HTMLSourceElement>} */\ngoog.dom.TagName.SOURCE = new goog.dom.TagName('SOURCE');\n\n\n/** @type {!goog.dom.TagName<!HTMLSpanElement>} */\ngoog.dom.TagName.SPAN = new goog.dom.TagName('SPAN');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.STRIKE = new goog.dom.TagName('STRIKE');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.STRONG = new goog.dom.TagName('STRONG');\n\n\n/** @type {!goog.dom.TagName<!HTMLStyleElement>} */\ngoog.dom.TagName.STYLE = new goog.dom.TagName('STYLE');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.SUB = new goog.dom.TagName('SUB');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.SUMMARY = new goog.dom.TagName('SUMMARY');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.SUP = new goog.dom.TagName('SUP');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.SVG = new goog.dom.TagName('SVG');\n\n\n/** @type {!goog.dom.TagName<!HTMLTableElement>} */\ngoog.dom.TagName.TABLE = new goog.dom.TagName('TABLE');\n\n\n/** @type {!goog.dom.TagName<!HTMLTableSectionElement>} */\ngoog.dom.TagName.TBODY = new goog.dom.TagName('TBODY');\n\n\n/** @type {!goog.dom.TagName<!HTMLTableCellElement>} */\ngoog.dom.TagName.TD = new goog.dom.TagName('TD');\n\n\n/** @type {!goog.dom.TagName<!HTMLTemplateElement>} */\ngoog.dom.TagName.TEMPLATE = new goog.dom.TagName('TEMPLATE');\n\n\n/** @type {!goog.dom.TagName<!HTMLTextAreaElement>} */\ngoog.dom.TagName.TEXTAREA = new goog.dom.TagName('TEXTAREA');\n\n\n/** @type {!goog.dom.TagName<!HTMLTableSectionElement>} */\ngoog.dom.TagName.TFOOT = new goog.dom.TagName('TFOOT');\n\n\n/** @type {!goog.dom.TagName<!HTMLTableCellElement>} */\ngoog.dom.TagName.TH = new goog.dom.TagName('TH');\n\n\n/** @type {!goog.dom.TagName<!HTMLTableSectionElement>} */\ngoog.dom.TagName.THEAD = new goog.dom.TagName('THEAD');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.TIME = new goog.dom.TagName('TIME');\n\n\n/** @type {!goog.dom.TagName<!HTMLTitleElement>} */\ngoog.dom.TagName.TITLE = new goog.dom.TagName('TITLE');\n\n\n/** @type {!goog.dom.TagName<!HTMLTableRowElement>} */\ngoog.dom.TagName.TR = new goog.dom.TagName('TR');\n\n\n/** @type {!goog.dom.TagName<!HTMLTrackElement>} */\ngoog.dom.TagName.TRACK = new goog.dom.TagName('TRACK');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.TT = new goog.dom.TagName('TT');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.U = new goog.dom.TagName('U');\n\n\n/** @type {!goog.dom.TagName<!HTMLUListElement>} */\ngoog.dom.TagName.UL = new goog.dom.TagName('UL');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.VAR = new goog.dom.TagName('VAR');\n\n\n/** @type {!goog.dom.TagName<!HTMLVideoElement>} */\ngoog.dom.TagName.VIDEO = new goog.dom.TagName('VIDEO');\n\n\n/** @type {!goog.dom.TagName<!goog.dom.HtmlElement>} */\ngoog.dom.TagName.WBR = new goog.dom.TagName('WBR');\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.dom.HtmlElement"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/tagname.js"],"^:1",["^9K",["^;="]],"^9<",true,"^9=",["^9>","^LE"]],["^ ","^9A",[1579837703000],"^9B","goog.fx.animation.js","^9C",["^9D","goog/fx/animation.js"],"^9E","goog/fx/animation.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Classes for doing animations and visual effects.\n *\n * (Based loosly on my animation code for 13thparallel.org, with extra\n * inspiration from the DojoToolkit's modifications to my code)\n * @author arv@google.com (Erik Arvidsson)\n */\n\ngoog.provide('goog.fx.Animation');\ngoog.provide('goog.fx.Animation.EventType');\ngoog.provide('goog.fx.Animation.State');\ngoog.provide('goog.fx.AnimationEvent');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.events.Event');\ngoog.require('goog.fx.Transition');\ngoog.require('goog.fx.TransitionBase');\ngoog.require('goog.fx.anim');\ngoog.require('goog.fx.anim.Animated');\n\n\n\n/**\n * Constructor for an animation object.\n * @param {Array<number>} start Array for start coordinates.\n * @param {Array<number>} end Array for end coordinates.\n * @param {number} duration Length of animation in milliseconds.\n * @param {Function=} opt_acc Acceleration function, returns 0-1 for inputs 0-1.\n * @constructor\n * @struct\n * @implements {goog.fx.anim.Animated}\n * @implements {goog.fx.Transition}\n * @extends {goog.fx.TransitionBase}\n */\ngoog.fx.Animation = function(start, end, duration, opt_acc) {\n  goog.fx.Animation.base(this, 'constructor');\n\n  if (!goog.isArray(start) || !goog.isArray(end)) {\n    throw new Error('Start and end parameters must be arrays');\n  }\n\n  if (start.length != end.length) {\n    throw new Error('Start and end points must be the same length');\n  }\n\n  /**\n   * Start point.\n   * @type {Array<number>}\n   * @protected\n   */\n  this.startPoint = start;\n\n  /**\n   * End point.\n   * @type {Array<number>}\n   * @protected\n   */\n  this.endPoint = end;\n\n  /**\n   * Duration of animation in milliseconds.\n   * @type {number}\n   * @protected\n   */\n  this.duration = duration;\n\n  /**\n   * Acceleration function, which must return a number between 0 and 1 for\n   * inputs between 0 and 1.\n   * @type {Function|undefined}\n   * @private\n   */\n  this.accel_ = opt_acc;\n\n  /**\n   * Current coordinate for animation.\n   * @type {Array<number>}\n   * @protected\n   */\n  this.coords = [];\n\n  /**\n   * Whether the animation should use \"right\" rather than \"left\" to position\n   * elements in RTL.  This is a temporary flag to allow clients to transition\n   * to the new behavior at their convenience.  At some point it will be the\n   * default.\n   * @type {boolean}\n   * @private\n   */\n  this.useRightPositioningForRtl_ = false;\n\n  /**\n   * Current frame rate.\n   * @private {number}\n   */\n  this.fps_ = 0;\n\n  /**\n   * Percent of the way through the animation.\n   * @protected {number}\n   */\n  this.progress = 0;\n\n  /**\n   * Timestamp for when last frame was run.\n   * @protected {?number}\n   */\n  this.lastFrame = null;\n};\ngoog.inherits(goog.fx.Animation, goog.fx.TransitionBase);\n\n\n/**\n * @return {number} The duration of this animation in milliseconds.\n */\ngoog.fx.Animation.prototype.getDuration = function() {\n  return this.duration;\n};\n\n\n/**\n * Sets whether the animation should use \"right\" rather than \"left\" to position\n * elements.  This is a temporary flag to allow clients to transition\n * to the new component at their convenience.  At some point \"right\" will be\n * used for RTL elements by default.\n * @param {boolean} useRightPositioningForRtl True if \"right\" should be used for\n *     positioning, false if \"left\" should be used for positioning.\n */\ngoog.fx.Animation.prototype.enableRightPositioningForRtl = function(\n    useRightPositioningForRtl) {\n  this.useRightPositioningForRtl_ = useRightPositioningForRtl;\n};\n\n\n/**\n * Whether the animation should use \"right\" rather than \"left\" to position\n * elements.  This is a temporary flag to allow clients to transition\n * to the new component at their convenience.  At some point \"right\" will be\n * used for RTL elements by default.\n * @return {boolean} True if \"right\" should be used for positioning, false if\n *     \"left\" should be used for positioning.\n */\ngoog.fx.Animation.prototype.isRightPositioningForRtlEnabled = function() {\n  return this.useRightPositioningForRtl_;\n};\n\n\n/**\n * Events fired by the animation.\n * @enum {string}\n */\ngoog.fx.Animation.EventType = {\n  /**\n   * Dispatched when played for the first time OR when it is resumed.\n   * @deprecated Use goog.fx.Transition.EventType.PLAY.\n   */\n  PLAY: goog.fx.Transition.EventType.PLAY,\n\n  /**\n   * Dispatched only when the animation starts from the beginning.\n   * @deprecated Use goog.fx.Transition.EventType.BEGIN.\n   */\n  BEGIN: goog.fx.Transition.EventType.BEGIN,\n\n  /**\n   * Dispatched only when animation is restarted after a pause.\n   * @deprecated Use goog.fx.Transition.EventType.RESUME.\n   */\n  RESUME: goog.fx.Transition.EventType.RESUME,\n\n  /**\n   * Dispatched when animation comes to the end of its duration OR stop\n   * is called.\n   * @deprecated Use goog.fx.Transition.EventType.END.\n   */\n  END: goog.fx.Transition.EventType.END,\n\n  /**\n   * Dispatched only when stop is called.\n   * @deprecated Use goog.fx.Transition.EventType.STOP.\n   */\n  STOP: goog.fx.Transition.EventType.STOP,\n\n  /**\n   * Dispatched only when animation comes to its end naturally.\n   * @deprecated Use goog.fx.Transition.EventType.FINISH.\n   */\n  FINISH: goog.fx.Transition.EventType.FINISH,\n\n  /**\n   * Dispatched when an animation is paused.\n   * @deprecated Use goog.fx.Transition.EventType.PAUSE.\n   */\n  PAUSE: goog.fx.Transition.EventType.PAUSE,\n\n  /**\n   * Dispatched each frame of the animation.  This is where the actual animator\n   * will listen.\n   */\n  ANIMATE: 'animate',\n\n  /**\n   * Dispatched when the animation is destroyed.\n   */\n  DESTROY: 'destroy'\n};\n\n\n/**\n * @deprecated Use goog.fx.anim.TIMEOUT.\n */\ngoog.fx.Animation.TIMEOUT = goog.fx.anim.TIMEOUT;\n\n\n/**\n * Enum for the possible states of an animation.\n * @deprecated Use goog.fx.Transition.State instead.\n * @enum {number}\n */\ngoog.fx.Animation.State = goog.fx.TransitionBase.State;\n\n\n/**\n * @deprecated Use goog.fx.anim.setAnimationWindow.\n * @param {Window} animationWindow The window in which to animate elements.\n */\ngoog.fx.Animation.setAnimationWindow = function(animationWindow) {\n  goog.fx.anim.setAnimationWindow(animationWindow);\n};\n\n\n/**\n * Starts or resumes an animation.\n * @param {boolean=} opt_restart Whether to restart the\n *     animation from the beginning if it has been paused.\n * @return {boolean} Whether animation was started.\n * @override\n */\ngoog.fx.Animation.prototype.play = function(opt_restart) {\n  if (opt_restart || this.isStopped()) {\n    this.progress = 0;\n    this.coords = this.startPoint;\n  } else if (this.isPlaying()) {\n    return false;\n  }\n\n  goog.fx.anim.unregisterAnimation(this);\n\n  var now = /** @type {number} */ (goog.now());\n\n  this.startTime = now;\n  if (this.isPaused()) {\n    this.startTime -= this.duration * this.progress;\n  }\n\n  this.endTime = this.startTime + this.duration;\n  this.lastFrame = this.startTime;\n\n  if (!this.progress) {\n    this.onBegin();\n  }\n\n  this.onPlay();\n\n  if (this.isPaused()) {\n    this.onResume();\n  }\n\n  this.setStatePlaying();\n\n  goog.fx.anim.registerAnimation(this);\n  this.cycle(now);\n\n  return true;\n};\n\n\n/**\n * Stops the animation.\n * @param {boolean=} opt_gotoEnd If true the animation will move to the\n *     end coords.\n * @override\n */\ngoog.fx.Animation.prototype.stop = function(opt_gotoEnd) {\n  goog.fx.anim.unregisterAnimation(this);\n  this.setStateStopped();\n\n  if (opt_gotoEnd) {\n    this.progress = 1;\n  }\n\n  this.updateCoords_(this.progress);\n\n  this.onStop();\n  this.onEnd();\n};\n\n\n/**\n * Pauses the animation (iff it's playing).\n * @override\n */\ngoog.fx.Animation.prototype.pause = function() {\n  if (this.isPlaying()) {\n    goog.fx.anim.unregisterAnimation(this);\n    this.setStatePaused();\n    this.onPause();\n  }\n};\n\n\n/**\n * @return {number} The current progress of the animation, the number\n *     is between 0 and 1 inclusive.\n */\ngoog.fx.Animation.prototype.getProgress = function() {\n  return this.progress;\n};\n\n\n/**\n * Sets the progress of the animation.\n * @param {number} progress The new progress of the animation.\n */\ngoog.fx.Animation.prototype.setProgress = function(progress) {\n  this.progress = progress;\n  if (this.isPlaying()) {\n    var now = goog.now();\n    // If the animation is already playing, we recompute startTime and endTime\n    // such that the animation plays consistently, that is:\n    // now = startTime + progress * duration.\n    this.startTime = now - this.duration * this.progress;\n    this.endTime = this.startTime + this.duration;\n  }\n};\n\n\n/**\n * Disposes of the animation.  Stops an animation, fires a 'destroy' event and\n * then removes all the event handlers to clean up memory.\n * @override\n * @protected\n */\ngoog.fx.Animation.prototype.disposeInternal = function() {\n  if (!this.isStopped()) {\n    this.stop(false);\n  }\n  this.onDestroy();\n  goog.fx.Animation.base(this, 'disposeInternal');\n};\n\n\n/**\n * Stops an animation, fires a 'destroy' event and then removes all the event\n * handlers to clean up memory.\n * @deprecated Use dispose() instead.\n */\ngoog.fx.Animation.prototype.destroy = function() {\n  this.dispose();\n};\n\n\n/** @override */\ngoog.fx.Animation.prototype.onAnimationFrame = function(now) {\n  this.cycle(now);\n};\n\n\n/**\n * Handles the actual iteration of the animation in a timeout\n * @param {number} now The current time.\n */\ngoog.fx.Animation.prototype.cycle = function(now) {\n  goog.asserts.assertNumber(this.startTime);\n  goog.asserts.assertNumber(this.endTime);\n  goog.asserts.assertNumber(this.lastFrame);\n  // Happens in rare system clock reset.\n  if (now < this.startTime) {\n    this.endTime = now + this.endTime - this.startTime;\n    this.startTime = now;\n  }\n  this.progress = (now - this.startTime) / (this.endTime - this.startTime);\n\n  if (this.progress > 1) {\n    this.progress = 1;\n  }\n\n  this.fps_ = 1000 / (now - this.lastFrame);\n  this.lastFrame = now;\n\n  this.updateCoords_(this.progress);\n\n  // Animation has finished.\n  if (this.progress == 1) {\n    this.setStateStopped();\n    goog.fx.anim.unregisterAnimation(this);\n\n    this.onFinish();\n    this.onEnd();\n\n    // Animation is still under way.\n  } else if (this.isPlaying()) {\n    this.onAnimate();\n  }\n};\n\n\n/**\n * Calculates current coordinates, based on the current state.  Applies\n * the acceleration function if it exists.\n * @param {number} t Percentage of the way through the animation as a decimal.\n * @private\n */\ngoog.fx.Animation.prototype.updateCoords_ = function(t) {\n  if (goog.isFunction(this.accel_)) {\n    t = this.accel_(t);\n  }\n  this.coords = new Array(this.startPoint.length);\n  for (var i = 0; i < this.startPoint.length; i++) {\n    this.coords[i] =\n        (this.endPoint[i] - this.startPoint[i]) * t + this.startPoint[i];\n  }\n};\n\n\n/**\n * Dispatches the ANIMATE event. Sub classes should override this instead\n * of listening to the event.\n * @protected\n */\ngoog.fx.Animation.prototype.onAnimate = function() {\n  this.dispatchAnimationEvent(goog.fx.Animation.EventType.ANIMATE);\n};\n\n\n/**\n * Dispatches the DESTROY event. Sub classes should override this instead\n * of listening to the event.\n * @protected\n */\ngoog.fx.Animation.prototype.onDestroy = function() {\n  this.dispatchAnimationEvent(goog.fx.Animation.EventType.DESTROY);\n};\n\n\n/** @override */\ngoog.fx.Animation.prototype.dispatchAnimationEvent = function(type) {\n  this.dispatchEvent(new goog.fx.AnimationEvent(type, this));\n};\n\n\n\n/**\n * Class for an animation event object.\n * @param {string} type Event type.\n * @param {goog.fx.Animation} anim An animation object.\n * @constructor\n * @struct\n * @extends {goog.events.Event}\n */\ngoog.fx.AnimationEvent = function(type, anim) {\n  goog.fx.AnimationEvent.base(this, 'constructor', type);\n\n  /**\n   * The current coordinates.\n   * @type {Array<number>}\n   */\n  this.coords = anim.coords;\n\n  /**\n   * The x coordinate.\n   * @type {number}\n   */\n  this.x = anim.coords[0];\n\n  /**\n   * The y coordinate.\n   * @type {number}\n   */\n  this.y = anim.coords[1];\n\n  /**\n   * The z coordinate.\n   * @type {number}\n   */\n  this.z = anim.coords[2];\n\n  /**\n   * The current duration.\n   * @type {number}\n   */\n  this.duration = anim.duration;\n\n  /**\n   * The current progress.\n   * @type {number}\n   */\n  this.progress = anim.getProgress();\n\n  /**\n   * Frames per second so far.\n   */\n  this.fps = anim.fps_;\n\n  /**\n   * The state of the animation.\n   * @type {number}\n   */\n  this.state = anim.getStateInternal();\n\n  /**\n   * The animation object.\n   * @type {goog.fx.Animation}\n   */\n  // TODO(arv): This can be removed as this is the same as the target\n  this.anim = anim;\n};\ngoog.inherits(goog.fx.AnimationEvent, goog.events.Event);\n\n\n/**\n * Returns the coordinates as integers (rounded to nearest integer).\n * @return {!Array<number>} An array of the coordinates rounded to\n *     the nearest integer.\n */\ngoog.fx.AnimationEvent.prototype.coordsAsInts = function() {\n  return goog.array.map(this.coords, Math.round);\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.fx.anim.Animated","^9>","~$goog.fx.anim","^>Q","^H0","^;8","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/animation.js"],"^:1",["^9K",["~$goog.fx.Animation.State","~$goog.fx.Animation.EventType","^G7","~$goog.fx.AnimationEvent"]],"^9<",true,"^9=",["^9>","^;9","^:E","^;8","^>Q","^H0","^LG","^LF"]],["^ ","^9A",[1579837703000],"^9B","goog.editor.plugins.linkbubble.js","^9C",["^9D","goog/editor/plugins/linkbubble.js"],"^9E","goog/editor/plugins/linkbubble.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Base class for bubble plugins.\n *\n */\n\ngoog.provide('goog.editor.plugins.LinkBubble');\ngoog.provide('goog.editor.plugins.LinkBubble.Action');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.Range');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.editor.Command');\ngoog.require('goog.editor.Link');\ngoog.require('goog.editor.plugins.AbstractBubblePlugin');\ngoog.require('goog.functions');\ngoog.require('goog.string');\ngoog.require('goog.style');\ngoog.require('goog.ui.editor.messages');\ngoog.require('goog.uri.utils');\ngoog.require('goog.window');\n\n\n\n/**\n * Property bubble plugin for links.\n * @param {...!goog.editor.plugins.LinkBubble.Action} var_args List of\n *     extra actions supported by the bubble.\n * @constructor\n * @extends {goog.editor.plugins.AbstractBubblePlugin}\n */\ngoog.editor.plugins.LinkBubble = function(var_args) {\n  goog.editor.plugins.LinkBubble.base(this, 'constructor');\n\n  /**\n   * List of extra actions supported by the bubble.\n   * @type {Array<!goog.editor.plugins.LinkBubble.Action>}\n   * @private\n   */\n  this.extraActions_ = goog.array.toArray(arguments);\n\n  /**\n   * List of spans corresponding to the extra actions.\n   * @type {Array<!Element>}\n   * @private\n   */\n  this.actionSpans_ = [];\n\n  /**\n   * A list of whitelisted URL schemes which are safe to open.\n   * @type {Array<string>}\n   * @private\n   */\n  this.safeToOpenSchemes_ = ['http', 'https', 'ftp'];\n};\ngoog.inherits(\n    goog.editor.plugins.LinkBubble, goog.editor.plugins.AbstractBubblePlugin);\n\n\n/** @const @private {string} */\ngoog.editor.plugins.LinkBubble.DISABLE_LINK_BUBBLE_DATA_ATTRIBUTE_ = 'data-dlb';\n\n\n/**\n * Element id for the link text.\n * type {string}\n * @private\n */\ngoog.editor.plugins.LinkBubble.LINK_TEXT_ID_ = 'tr_link-text';\n\n\n/**\n * Element id for the test link span.\n * type {string}\n * @private\n */\ngoog.editor.plugins.LinkBubble.TEST_LINK_SPAN_ID_ = 'tr_test-link-span';\n\n\n/**\n * Element id for the test link.\n * type {string}\n * @private\n */\ngoog.editor.plugins.LinkBubble.TEST_LINK_ID_ = 'tr_test-link';\n\n\n/**\n * Element id for the change link span.\n * type {string}\n * @private\n */\ngoog.editor.plugins.LinkBubble.CHANGE_LINK_SPAN_ID_ = 'tr_change-link-span';\n\n\n/**\n * Element id for the link.\n * type {string}\n * @private\n */\ngoog.editor.plugins.LinkBubble.CHANGE_LINK_ID_ = 'tr_change-link';\n\n\n/**\n * Element id for the delete link span.\n * type {string}\n * @private\n */\ngoog.editor.plugins.LinkBubble.DELETE_LINK_SPAN_ID_ = 'tr_delete-link-span';\n\n\n/**\n * Element id for the delete link.\n * type {string}\n * @private\n */\ngoog.editor.plugins.LinkBubble.DELETE_LINK_ID_ = 'tr_delete-link';\n\n\n/**\n * Element id for the link bubble wrapper div.\n * type {string}\n * @private\n */\ngoog.editor.plugins.LinkBubble.LINK_DIV_ID_ = 'tr_link-div';\n\n\n/**\n * @desc Text label for link that lets the user click it to see where the link\n *     this bubble is for point to.\n */\ngoog.editor.plugins.LinkBubble.MSG_LINK_BUBBLE_TEST_LINK =\n    goog.getMsg('Go to link: ');\n\n\n/**\n * @desc Label that pops up a dialog to change the link.\n */\ngoog.editor.plugins.LinkBubble.MSG_LINK_BUBBLE_CHANGE = goog.getMsg('Change');\n\n\n/**\n * @desc Label that allow the user to remove this link.\n */\ngoog.editor.plugins.LinkBubble.MSG_LINK_BUBBLE_REMOVE = goog.getMsg('Remove');\n\n\n/**\n * @desc Message shown in a link bubble when the link is not a valid url.\n */\ngoog.editor.plugins.LinkBubble.MSG_INVALID_URL_LINK_BUBBLE =\n    goog.getMsg('invalid url');\n\n\n/**\n * @param {!Element} targetElement\n * @return {boolean}\n * @private\n */\ngoog.editor.plugins.LinkBubble.shouldShowLinkBubble_ = function(targetElement) {\n  return !targetElement.hasAttribute(\n      goog.editor.plugins.LinkBubble.DISABLE_LINK_BUBBLE_DATA_ATTRIBUTE_);\n};\n\n\n/**\n * Whether to stop leaking the page's url via the referrer header when the\n * link text link is clicked.\n * @type {boolean}\n * @private\n */\ngoog.editor.plugins.LinkBubble.prototype.stopReferrerLeaks_ = false;\n\n\n/**\n * Whether to block opening links with a non-whitelisted URL scheme.\n * @type {boolean}\n * @private\n */\ngoog.editor.plugins.LinkBubble.prototype.blockOpeningUnsafeSchemes_ = true;\n\n\n/**\n * Tells the plugin to stop leaking the page's url via the referrer header when\n * the link text link is clicked. When the user clicks on a link, the\n * browser makes a request for the link url, passing the url of the current page\n * in the request headers. If the user wants the current url to be kept secret\n * (e.g. an unpublished document), the owner of the url that was clicked will\n * see the secret url in the request headers, and it will no longer be a secret.\n * Calling this method will not send a referrer header in the request, just as\n * if the user had opened a blank window and typed the url in themselves.\n */\ngoog.editor.plugins.LinkBubble.prototype.stopReferrerLeaks = function() {\n  // TODO(user): Right now only 2 plugins have this API to stop\n  // referrer leaks. If more plugins need to do this, come up with a way to\n  // enable the functionality in all plugins at once. Same thing for\n  // setBlockOpeningUnsafeSchemes and associated functionality.\n  this.stopReferrerLeaks_ = true;\n};\n\n\n/**\n * Tells the plugin whether to block URLs with schemes not in the whitelist.\n * If blocking is enabled, this plugin will not linkify the link in the bubble\n * popup.\n * @param {boolean} blockOpeningUnsafeSchemes Whether to block non-whitelisted\n *     schemes.\n */\ngoog.editor.plugins.LinkBubble.prototype.setBlockOpeningUnsafeSchemes =\n    function(blockOpeningUnsafeSchemes) {\n  this.blockOpeningUnsafeSchemes_ = blockOpeningUnsafeSchemes;\n};\n\n\n/**\n * Sets a whitelist of allowed URL schemes that are safe to open.\n * Schemes should all be in lowercase. If the plugin is set to block opening\n * unsafe schemes, user-entered URLs will be converted to lowercase and checked\n * against this list. The whitelist has no effect if blocking is not enabled.\n * @param {Array<string>} schemes String array of URL schemes to allow (http,\n *     https, etc.).\n */\ngoog.editor.plugins.LinkBubble.prototype.setSafeToOpenSchemes = function(\n    schemes) {\n  this.safeToOpenSchemes_ = schemes;\n};\n\n\n/** @override */\ngoog.editor.plugins.LinkBubble.prototype.getTrogClassId = function() {\n  return 'LinkBubble';\n};\n\n\n/** @override */\ngoog.editor.plugins.LinkBubble.prototype.isSupportedCommand = function(\n    command) {\n  return command == goog.editor.Command.UPDATE_LINK_BUBBLE;\n};\n\n\n/** @override */\ngoog.editor.plugins.LinkBubble.prototype.execCommandInternal = function(\n    command, var_args) {\n  if (command == goog.editor.Command.UPDATE_LINK_BUBBLE) {\n    this.updateLink_();\n  }\n};\n\n\n/**\n * Updates the href in the link bubble with a new link.\n * @private\n */\ngoog.editor.plugins.LinkBubble.prototype.updateLink_ = function() {\n  var targetEl = this.getTargetElement();\n  if (targetEl) {\n    this.closeBubble();\n    this.createBubble(targetEl);\n  }\n};\n\n\n/** @override */\ngoog.editor.plugins.LinkBubble.prototype.getBubbleTargetFromSelection =\n    function(selectedElement) {\n  var bubbleTarget = goog.dom.getAncestorByTagNameAndClass(\n      selectedElement, goog.dom.TagName.A);\n\n  if (!bubbleTarget) {\n    // See if the selection is touching the right side of a link, and if so,\n    // show a bubble for that link.  The check for \"touching\" is very brittle,\n    // and currently only guarantees that it will pop up a bubble at the\n    // position the cursor is placed at after the link dialog is closed.\n    // NOTE(robbyw): This assumes this method is always called with\n    // selected element = range.getContainerElement().  Right now this is true,\n    // but attempts to re-use this method for other purposes could cause issues.\n    // TODO(robbyw): Refactor this method to also take a range, and use that.\n    var range = this.getFieldObject().getRange();\n    if (range && range.isCollapsed() && range.getStartOffset() == 0) {\n      var startNode = range.getStartNode();\n      var previous = startNode.previousSibling;\n      if (previous && previous.tagName == goog.dom.TagName.A) {\n        bubbleTarget = previous;\n      }\n    }\n  }\n\n  return /** @type {Element} */ (bubbleTarget);\n};\n\n\n/**\n * Set the optional function for getting the \"test\" link of a url.\n * @param {function(string) : string} func The function to use.\n */\ngoog.editor.plugins.LinkBubble.prototype.setTestLinkUrlFn = function(func) {\n  this.testLinkUrlFn_ = func;\n};\n\n\n/**\n * Returns the target element url for the bubble.\n * @return {string} The url href.\n * @protected\n */\ngoog.editor.plugins.LinkBubble.prototype.getTargetUrl = function() {\n  // Get the href-attribute through getAttribute() rather than the href property\n  // because Google-Toolbar on Firefox with \"Send with Gmail\" turned on\n  // modifies the href-property of 'mailto:' links but leaves the attribute\n  // untouched.\n  return this.getTargetElement().getAttribute('href') || '';\n};\n\n\n/** @override */\ngoog.editor.plugins.LinkBubble.prototype.getBubbleType = function() {\n  return String(goog.dom.TagName.A);\n};\n\n\n/** @override */\ngoog.editor.plugins.LinkBubble.prototype.getBubbleTitle = function() {\n  return goog.ui.editor.messages.MSG_LINK_CAPTION;\n};\n\n\n/**\n * Returns the message to display for testing a link.\n * @return {string} The message for testing a link.\n * @protected\n */\ngoog.editor.plugins.LinkBubble.prototype.getTestLinkMessage = function() {\n  return goog.editor.plugins.LinkBubble.MSG_LINK_BUBBLE_TEST_LINK;\n};\n\n/** @override */\ngoog.editor.plugins.LinkBubble.prototype.handleSelectionChangeInternal =\n    function(selectedElement) {\n  if (selectedElement) {\n    var bubbleTarget = this.getBubbleTargetFromSelection(selectedElement);\n    if (bubbleTarget &&\n        !goog.editor.plugins.LinkBubble.shouldShowLinkBubble_(bubbleTarget)) {\n      return false;\n    }\n  }\n\n  return goog.editor.plugins.LinkBubble.base(\n      this, 'handleSelectionChangeInternal', selectedElement);\n};\n\n\n/** @override */\ngoog.editor.plugins.LinkBubble.prototype.createBubbleContents = function(\n    bubbleContainer) {\n  var linkObj = this.getLinkToTextObj_();\n\n  // Create linkTextSpan, show plain text for e-mail address or truncate the\n  // text to <= 48 characters so that property bubbles don't grow too wide and\n  // create a link if URL.  Only linkify valid links.\n  // TODO(robbyw): Repalce this color with a CSS class.\n  var color = linkObj.valid ? 'black' : 'red';\n  var shouldOpenUrl = this.shouldOpenUrl(linkObj.linkText);\n  var linkTextSpan;\n  if (goog.editor.Link.isLikelyEmailAddress(linkObj.linkText) ||\n      !linkObj.valid || !shouldOpenUrl) {\n    linkTextSpan = this.dom_.createDom(\n        goog.dom.TagName.SPAN, {\n          id: goog.editor.plugins.LinkBubble.LINK_TEXT_ID_,\n          style: 'color:' + color\n        },\n        this.dom_.createTextNode(linkObj.linkText));\n  } else {\n    var testMsgSpan = this.dom_.createDom(\n        goog.dom.TagName.SPAN,\n        {id: goog.editor.plugins.LinkBubble.TEST_LINK_SPAN_ID_},\n        this.getTestLinkMessage());\n    linkTextSpan = this.dom_.createDom(\n        goog.dom.TagName.SPAN, {\n          id: goog.editor.plugins.LinkBubble.LINK_TEXT_ID_,\n          style: 'color:' + color\n        },\n        '');\n    var linkText = goog.string.truncateMiddle(linkObj.linkText, 48);\n    // Actually creates a pseudo-link that can't be right-clicked to open in a\n    // new tab, because that would avoid the logic to stop referrer leaks.\n    this.createLink(\n        goog.editor.plugins.LinkBubble.TEST_LINK_ID_,\n        this.dom_.createTextNode(linkText).data, this.testLink, linkTextSpan);\n  }\n\n  var changeLinkSpan = this.createLinkOption(\n      goog.editor.plugins.LinkBubble.CHANGE_LINK_SPAN_ID_);\n  this.createLink(\n      goog.editor.plugins.LinkBubble.CHANGE_LINK_ID_,\n      goog.editor.plugins.LinkBubble.MSG_LINK_BUBBLE_CHANGE,\n      this.showLinkDialog_, changeLinkSpan);\n\n  // This function is called multiple times - we have to reset the array.\n  this.actionSpans_ = [];\n  for (var i = 0; i < this.extraActions_.length; i++) {\n    var action = this.extraActions_[i];\n    var actionSpan = this.createLinkOption(action.spanId_);\n    this.actionSpans_.push(actionSpan);\n    this.createLink(action.linkId_, action.message_, function() {\n      action.actionFn_(this.getTargetUrl());\n    }, actionSpan);\n  }\n\n  var removeLinkSpan = this.createLinkOption(\n      goog.editor.plugins.LinkBubble.DELETE_LINK_SPAN_ID_);\n  this.createLink(\n      goog.editor.plugins.LinkBubble.DELETE_LINK_ID_,\n      goog.editor.plugins.LinkBubble.MSG_LINK_BUBBLE_REMOVE, this.deleteLink_,\n      removeLinkSpan);\n\n  this.onShow();\n\n  var bubbleContents = this.dom_.createDom(\n      goog.dom.TagName.DIV, {id: goog.editor.plugins.LinkBubble.LINK_DIV_ID_},\n      testMsgSpan || '', linkTextSpan, changeLinkSpan);\n\n  for (i = 0; i < this.actionSpans_.length; i++) {\n    bubbleContents.appendChild(this.actionSpans_[i]);\n  }\n  bubbleContents.appendChild(removeLinkSpan);\n\n  goog.dom.appendChild(bubbleContainer, bubbleContents);\n};\n\n\n/**\n * Tests the link by opening it in a new tab/window. Should be used as the\n * click event handler for the test pseudo-link.\n * @param {!Event=} opt_event If passed in, the event will be stopped.\n * @protected\n */\ngoog.editor.plugins.LinkBubble.prototype.testLink = function(opt_event) {\n  goog.window.open(\n      this.getTestLinkAction_(),\n      {'target': '_blank', 'noreferrer': this.stopReferrerLeaks_},\n      this.getFieldObject().getAppWindow());\n  if (opt_event) {\n    opt_event.stopPropagation();\n    opt_event.preventDefault();\n  }\n};\n\n\n/**\n * Returns whether the URL should be considered invalid.  This always returns\n * false in the base class, and should be overridden by subclasses that wish\n * to impose validity rules on URLs.\n * @param {string} url The url to check.\n * @return {boolean} Whether the URL should be considered invalid.\n */\ngoog.editor.plugins.LinkBubble.prototype.isInvalidUrl = goog.functions.FALSE;\n\n\n/**\n * Gets the text to display for a link, based on the type of link\n * @return {!Object} Returns an object of the form:\n *     {linkText: displayTextForLinkTarget, valid: ifTheLinkIsValid}.\n * @private\n */\ngoog.editor.plugins.LinkBubble.prototype.getLinkToTextObj_ = function() {\n  var isError;\n  var targetUrl = this.getTargetUrl();\n\n  if (this.isInvalidUrl(targetUrl)) {\n    targetUrl = goog.editor.plugins.LinkBubble.MSG_INVALID_URL_LINK_BUBBLE;\n    isError = true;\n  } else if (goog.editor.Link.isMailto(targetUrl)) {\n    targetUrl = targetUrl.substring(7);  // 7 == \"mailto:\".length\n  }\n\n  return {linkText: targetUrl, valid: !isError};\n};\n\n\n/**\n * Shows the link dialog.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.editor.plugins.LinkBubble.prototype.showLinkDialog_ = function(e) {\n  // Needed when this occurs due to an ENTER key event, else the newly created\n  // dialog manages to have its OK button pressed, causing it to disappear.\n  e.preventDefault();\n\n  this.getFieldObject().execCommand(\n      goog.editor.Command.MODAL_LINK_EDITOR,\n      new goog.editor.Link(\n          /** @type {HTMLAnchorElement} */ (this.getTargetElement()), false));\n  this.closeBubble();\n};\n\n\n/**\n * Deletes the link associated with the bubble\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.editor.plugins.LinkBubble.prototype.deleteLink_ = function(e) {\n  // Needed when this occurs due to an ENTER key event, else the editor receives\n  // the key press and inserts a newline.\n  e.preventDefault();\n\n  this.getFieldObject().dispatchBeforeChange();\n\n  var link = this.getTargetElement();\n  var child = link.lastChild;\n  goog.dom.flattenElement(link);\n\n  var restoreScrollPosition = this.saveScrollPosition();\n  var range = goog.dom.Range.createFromNodeContents(child);\n  range.collapse(false);\n  range.select();\n\n  this.closeBubble();\n\n  this.getFieldObject().dispatchChange();\n  this.getFieldObject().focus();\n  restoreScrollPosition();\n};\n\n\n/**\n * Sets the proper state for the action links.\n * @protected\n * @override\n */\ngoog.editor.plugins.LinkBubble.prototype.onShow = function() {\n  var linkDiv =\n      this.dom_.getElement(goog.editor.plugins.LinkBubble.LINK_DIV_ID_);\n  if (linkDiv) {\n    var testLinkSpan =\n        this.dom_.getElement(goog.editor.plugins.LinkBubble.TEST_LINK_SPAN_ID_);\n    if (testLinkSpan) {\n      var url = this.getTargetUrl();\n      goog.style.setElementShown(testLinkSpan, !goog.editor.Link.isMailto(url));\n    }\n\n    for (var i = 0; i < this.extraActions_.length; i++) {\n      var action = this.extraActions_[i];\n      var actionSpan = this.dom_.getElement(action.spanId_);\n      if (actionSpan) {\n        goog.style.setElementShown(\n            actionSpan, action.toShowFn_(this.getTargetUrl()));\n      }\n    }\n  }\n};\n\n\n/**\n * Gets the url for the bubble test link.  The test link is the link in the\n * bubble the user can click on to make sure the link they entered is correct.\n * @return {string} The url for the bubble link href.\n * @private\n */\ngoog.editor.plugins.LinkBubble.prototype.getTestLinkAction_ = function() {\n  var targetUrl = this.getTargetUrl();\n  return this.testLinkUrlFn_ ? this.testLinkUrlFn_(targetUrl) : targetUrl;\n};\n\n\n/**\n * Checks whether the plugin should open the given url in a new window.\n * @param {string} url The url to check.\n * @return {boolean} If the plugin should open the given url in a new window.\n * @protected\n */\ngoog.editor.plugins.LinkBubble.prototype.shouldOpenUrl = function(url) {\n  return !this.blockOpeningUnsafeSchemes_ || this.isSafeSchemeToOpen_(url);\n};\n\n\n/**\n * Determines whether or not a url has a scheme which is safe to open.\n * Schemes like javascript are unsafe due to the possibility of XSS.\n * @param {string} url A url.\n * @return {boolean} Whether the url has a safe scheme.\n * @private\n */\ngoog.editor.plugins.LinkBubble.prototype.isSafeSchemeToOpen_ = function(url) {\n  var scheme = goog.uri.utils.getScheme(url) || 'http';\n  return goog.array.contains(this.safeToOpenSchemes_, scheme.toLowerCase());\n};\n\n\n\n/**\n * Constructor for extra actions that can be added to the link bubble.\n * @param {string} spanId The ID for the span showing the action.\n * @param {string} linkId The ID for the link showing the action.\n * @param {string} message The text for the link showing the action.\n * @param {function(string):boolean} toShowFn Test function to determine whether\n *     to show the action for the given URL.\n * @param {function(string):void} actionFn Action function to run when the\n *     action is clicked.  Takes the current target URL as a parameter.\n * @constructor\n * @final\n */\ngoog.editor.plugins.LinkBubble.Action = function(\n    spanId, linkId, message, toShowFn, actionFn) {\n  this.spanId_ = spanId;\n  this.linkId_ = linkId;\n  this.message_ = message;\n  this.toShowFn_ = toShowFn;\n  this.actionFn_ = actionFn;\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","^;<","^?<","^;O","^@Z","^9L","^9>","~$goog.ui.editor.messages","~$goog.window","~$goog.editor.Link","^<3","^=F","^;9","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/linkbubble.js"],"^:1",["^9K",["~$goog.editor.plugins.LinkBubble.Action","~$goog.editor.plugins.LinkBubble"]],"^9<",true,"^9=",["^9>","^;9","^;;","^=F","^;=","^@Z","^LM","^?<","^;<","^9L","^<3","^LK","^;O","^LL"]],["^ ","^9A",[1579837703000],"^9B","goog.async.throttle.js","^9C",["^9D","goog/async/throttle.js"],"^9E","goog/async/throttle.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the goog.async.Throttle class.\n *\n * @see ../demos/timers.html\n */\n\ngoog.provide('goog.Throttle');\ngoog.provide('goog.async.Throttle');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.Timer');\n\n\n\n/**\n * Throttle will perform an action that is passed in no more than once\n * per interval (specified in milliseconds). If it gets multiple signals\n * to perform the action while it is waiting, it will only perform the action\n * once at the end of the interval.\n * @param {function(this: T, ...?)} listener Function to callback when the\n *     action is triggered.\n * @param {number} interval Interval over which to throttle. The listener can\n *     only be called once per interval.\n * @param {T=} opt_handler Object in whose scope to call the listener.\n * @constructor\n * @struct\n * @extends {goog.Disposable}\n * @final\n * @template T\n */\ngoog.async.Throttle = function(listener, interval, opt_handler) {\n  goog.async.Throttle.base(this, 'constructor');\n\n  /**\n   * Function to callback\n   * @type {function(this: T, ...?)}\n   * @private\n   */\n  this.listener_ =\n      opt_handler != null ? goog.bind(listener, opt_handler) : listener;\n\n  /**\n   * Interval for the throttle time\n   * @type {number}\n   * @private\n   */\n  this.interval_ = interval;\n\n  /**\n   * Cached callback function invoked after the throttle timeout completes\n   * @type {Function}\n   * @private\n   */\n  this.callback_ = goog.bind(this.onTimer_, this);\n\n  /**\n   * The last arguments passed into `fire`.\n   * @private {!IArrayLike}\n   */\n  this.args_ = [];\n};\ngoog.inherits(goog.async.Throttle, goog.Disposable);\n\n\n\n/**\n * A deprecated alias.\n * @deprecated Use goog.async.Throttle instead.\n * @constructor\n * @final\n */\ngoog.Throttle = goog.async.Throttle;\n\n\n/**\n * Indicates that the action is pending and needs to be fired.\n * @type {boolean}\n * @private\n */\ngoog.async.Throttle.prototype.shouldFire_ = false;\n\n\n/**\n * Indicates the count of nested pauses currently in effect on the throttle.\n * When this count is not zero, fired actions will be postponed until the\n * throttle is resumed enough times to drop the pause count to zero.\n * @type {number}\n * @private\n */\ngoog.async.Throttle.prototype.pauseCount_ = 0;\n\n\n/**\n * Timer for scheduling the next callback\n * @type {?number}\n * @private\n */\ngoog.async.Throttle.prototype.timer_ = null;\n\n\n/**\n * Notifies the throttle that the action has happened. It will throttle the call\n * so that the callback is not called too often according to the interval\n * parameter passed to the constructor, passing the arguments from the last call\n * of this function into the throttled function.\n * @param {...?} var_args Arguments to pass on to the throttled function.\n */\ngoog.async.Throttle.prototype.fire = function(var_args) {\n  this.args_ = arguments;\n  if (!this.timer_ && !this.pauseCount_) {\n    this.doAction_();\n  } else {\n    this.shouldFire_ = true;\n  }\n};\n\n\n/**\n * Cancels any pending action callback. The throttle can be restarted by\n * calling {@link #fire}.\n */\ngoog.async.Throttle.prototype.stop = function() {\n  if (this.timer_) {\n    goog.Timer.clear(this.timer_);\n    this.timer_ = null;\n    this.shouldFire_ = false;\n    this.args_ = [];\n  }\n};\n\n\n/**\n * Pauses the throttle.  All pending and future action callbacks will be\n * delayed until the throttle is resumed.  Pauses can be nested.\n */\ngoog.async.Throttle.prototype.pause = function() {\n  this.pauseCount_++;\n};\n\n\n/**\n * Resumes the throttle.  If doing so drops the pausing count to zero, pending\n * action callbacks will be executed as soon as possible, but still no sooner\n * than an interval's delay after the previous call.  Future action callbacks\n * will be executed as normal.\n */\ngoog.async.Throttle.prototype.resume = function() {\n  this.pauseCount_--;\n  if (!this.pauseCount_ && this.shouldFire_ && !this.timer_) {\n    this.shouldFire_ = false;\n    this.doAction_();\n  }\n};\n\n\n/** @override */\ngoog.async.Throttle.prototype.disposeInternal = function() {\n  goog.async.Throttle.base(this, 'disposeInternal');\n  this.stop();\n};\n\n\n/**\n * Handler for the timer to fire the throttle\n * @private\n */\ngoog.async.Throttle.prototype.onTimer_ = function() {\n  this.timer_ = null;\n\n  if (this.shouldFire_ && !this.pauseCount_) {\n    this.shouldFire_ = false;\n    this.doAction_();\n  }\n};\n\n\n/**\n * Calls the callback\n * @private\n */\ngoog.async.Throttle.prototype.doAction_ = function() {\n  this.timer_ = goog.Timer.callOnce(this.callback_, this.interval_);\n  this.listener_.apply(null, this.args_);\n};\n","^9I",1579837703000,"^9J",["^9K",["^><","^9>","^:7"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/async/throttle.js"],"^:1",["^9K",["~$goog.Throttle","^>Z"]],"^9<",true,"^9=",["^9>","^:7","^><"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.textarearenderer.js","^9C",["^9D","goog/ui/textarearenderer.js"],"^9E","goog/ui/textarearenderer.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Native browser textarea renderer for {@link goog.ui.Textarea}s.\n */\n\ngoog.provide('goog.ui.TextareaRenderer');\n\ngoog.require('goog.dom.TagName');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.ControlRenderer');\n\n\n\n/**\n * Renderer for {@link goog.ui.Textarea}s.  Renders and decorates native HTML\n * textarea elements.  Since native HTML textareas have built-in support for\n * many features, overrides many expensive (and redundant) superclass methods to\n * be no-ops.\n * @constructor\n * @extends {goog.ui.ControlRenderer}\n */\ngoog.ui.TextareaRenderer = function() {\n  goog.ui.ControlRenderer.call(this);\n};\ngoog.inherits(goog.ui.TextareaRenderer, goog.ui.ControlRenderer);\ngoog.addSingletonGetter(goog.ui.TextareaRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.TextareaRenderer.CSS_CLASS = goog.getCssName('goog-textarea');\n\n\n/** @override */\ngoog.ui.TextareaRenderer.prototype.getAriaRole = function() {\n  // textareas don't need ARIA roles to be recognized by screen readers.\n  return undefined;\n};\n\n\n/** @override */\ngoog.ui.TextareaRenderer.prototype.decorate = function(control, element) {\n  this.setUpTextarea_(control);\n  goog.ui.TextareaRenderer.superClass_.decorate.call(this, control, element);\n  control.setContent(element.value);\n  return element;\n};\n\n\n/**\n * Returns the textarea's contents wrapped in an HTML textarea element.  Sets\n * the textarea's disabled attribute as needed.\n * @param {goog.ui.Control} textarea Textarea to render.\n * @return {!Element} Root element for the Textarea control (an HTML textarea\n *     element).\n * @override\n */\ngoog.ui.TextareaRenderer.prototype.createDom = function(textarea) {\n  this.setUpTextarea_(textarea);\n  var element = textarea.getDomHelper().createDom(\n      goog.dom.TagName.TEXTAREA, {\n        'class': this.getClassNames(textarea).join(' '),\n        'disabled': !textarea.isEnabled()\n      },\n      textarea.getContent() || '');\n  return element;\n};\n\n\n/**\n * Overrides {@link goog.ui.TextareaRenderer#canDecorate} by returning true only\n * if the element is an HTML textarea.\n * @param {Element} element Element to decorate.\n * @return {boolean} Whether the renderer can decorate the element.\n * @override\n */\ngoog.ui.TextareaRenderer.prototype.canDecorate = function(element) {\n  return element.tagName == goog.dom.TagName.TEXTAREA;\n};\n\n\n/**\n * Textareas natively support right-to-left rendering.\n * @override\n */\ngoog.ui.TextareaRenderer.prototype.setRightToLeft = goog.nullFunction;\n\n\n/**\n * Textareas are always focusable as long as they are enabled.\n * @override\n */\ngoog.ui.TextareaRenderer.prototype.isFocusable = function(textarea) {\n  return textarea.isEnabled();\n};\n\n\n/**\n * Textareas natively support keyboard focus.\n * @override\n */\ngoog.ui.TextareaRenderer.prototype.setFocusable = goog.nullFunction;\n\n\n/**\n * Textareas also expose the DISABLED state in the HTML textarea's\n * `disabled` attribute.\n * @override\n */\ngoog.ui.TextareaRenderer.prototype.setState = function(\n    textarea, state, enable) {\n  goog.ui.TextareaRenderer.superClass_.setState.call(\n      this, textarea, state, enable);\n  var element = textarea.getElement();\n  if (element && state == goog.ui.Component.State.DISABLED) {\n    element.disabled = enable;\n  }\n};\n\n\n/**\n * Textareas don't need ARIA states to support accessibility, so this is\n * a no-op.\n * @override\n */\ngoog.ui.TextareaRenderer.prototype.updateAriaState = goog.nullFunction;\n\n\n/**\n * Sets up the textarea control such that it doesn't waste time adding\n * functionality that is already natively supported by browser\n * textareas.\n * @param {goog.ui.Control} textarea Textarea control to configure.\n * @private\n */\ngoog.ui.TextareaRenderer.prototype.setUpTextarea_ = function(textarea) {\n  textarea.setHandleMouseEvents(false);\n  textarea.setAutoStates(goog.ui.Component.State.ALL, false);\n  textarea.setSupportedState(goog.ui.Component.State.FOCUSED, false);\n};\n\n\n/** @override **/\ngoog.ui.TextareaRenderer.prototype.setContent = function(element, value) {\n  if (element) {\n    element.value = value;\n  }\n};\n\n\n/** @override **/\ngoog.ui.TextareaRenderer.prototype.getCssClass = function() {\n  return goog.ui.TextareaRenderer.CSS_CLASS;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:=","^9>","^G[","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/textarearenderer.js"],"^:1",["^9K",["^=S"]],"^9<",true,"^9=",["^9>","^;=","^:=","^G["]],["^ ","^9A",[1579837703000],"^9B","goog.testing.fs.file.js","^9C",["^9D","goog/testing/fs/file.js"],"^9E","goog/testing/fs/file.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Mock file object.\n *\n */\n\ngoog.setTestOnly('goog.testing.fs.File');\ngoog.provide('goog.testing.fs.File');\n\ngoog.require('goog.testing.fs.Blob');\n\n\n\n/**\n * A mock file object.\n *\n * @param {string} name The name of the file.\n * @param {Date=} opt_lastModified The last modified date for this file. May be\n *     null if file modification dates are not supported.\n * @param {string=} opt_data The string data encapsulated by the blob.\n * @param {string=} opt_type The mime type of the blob.\n * @constructor\n * @extends {goog.testing.fs.Blob}\n * @final\n */\ngoog.testing.fs.File = function(name, opt_lastModified, opt_data, opt_type) {\n  goog.testing.fs.File.base(this, 'constructor', opt_data, opt_type);\n\n  /**\n   * @see http://www.w3.org/TR/FileAPI/#dfn-name\n   * @type {string}\n   */\n  this.name = name;\n\n  /**\n   * @see http://www.w3.org/TR/FileAPI/#dfn-lastModifiedDate\n   * @type {Date}\n   */\n  this.lastModifiedDate = opt_lastModified || null;\n};\ngoog.inherits(goog.testing.fs.File, goog.testing.fs.Blob);\n","^9I",1579837703000,"^9J",["^9K",["^9>","^L0"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/fs/file.js"],"^:1",["^9K",["^KZ"]],"^9<",true,"^9=",["^9>","^L0"]],["^ ","^9A",[1579837703000],"^9B","goog.labs.net.webchanneltransport.js","^9C",["^9D","goog/labs/net/webchanneltransport.js"],"^9E","goog/labs/net/webchanneltransport.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Transport support for WebChannel.\n *\n * The <code>WebChannelTransport</code> implementation serves as the factory\n * for <code>WebChannel</code>, which offers an abstraction for\n * point-to-point socket-like communication similar to what BrowserChannel\n * or HTML5 WebSocket offers.\n *\n */\n\ngoog.provide('goog.net.WebChannelTransport');\n\ngoog.forwardDeclare('goog.net.WebChannel');\ngoog.forwardDeclare('goog.net.WebChannel.Options');\n\n\n\n/**\n * A WebChannelTransport instance represents a shared context of logical\n * connectivity between a browser client and a remote origin.\n *\n * Over a single WebChannelTransport instance, multiple WebChannels may be\n * created against different URLs, which may all share the same\n * underlying connectivity (i.e. TCP connection) whenever possible.\n *\n * When multi-domains are supported, such as CORS, multiple origins may be\n * supported over a single WebChannelTransport instance at the same time.\n *\n * Sharing between different window contexts such as tabs is not addressed\n * by WebChannelTransport. Applications may choose HTML5 shared workers\n * or other techniques to access the same transport instance\n * across different window contexts.\n *\n * @interface\n */\ngoog.net.WebChannelTransport = function() {};\n\n\n/**\n * The client version. This integer value will be passed to the server\n * when a channel is opened to inform the server the client \"capabilities\".\n *\n * Wire protocol version is a different concept and is internal to the\n * transport implementation.\n *\n * @const\n * @type {number}\n */\ngoog.net.WebChannelTransport.CLIENT_VERSION = 22;\n\n\n/**\n * Create a new WebChannel instance.\n *\n * The new WebChannel is to be opened against the server-side resource\n * as specified by the given URL. See {@link goog.net.WebChannel} for detailed\n * semantics.\n *\n * @param {string} url The URL path for the new WebChannel instance.\n * @param {!goog.net.WebChannel.Options=} opt_options Configuration for the\n *     new WebChannel instance. The configuration object is reusable after\n *     the new channel instance is created.\n * @return {!goog.net.WebChannel} the newly created WebChannel instance.\n */\ngoog.net.WebChannelTransport.prototype.createWebChannel = goog.abstractMethod;\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchanneltransport.js"],"^:1",["^9K",["^<E"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.serverchart.js","^9C",["^9D","goog/ui/serverchart.js"],"^9E","goog/ui/serverchart.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Component for generating chart PNGs using Google Chart Server.\n *\n * @deprecated Google Chart Images service (the server-side component of this\n *     class) has been deprecated. See\n *     https://developers.google.com/chart/ for alternatives.\n *\n * @see ../demos/serverchart.html\n */\n\n\n/**\n * Namespace for chart functions\n */\ngoog.provide('goog.ui.ServerChart');\ngoog.provide('goog.ui.ServerChart.AxisDisplayType');\ngoog.provide('goog.ui.ServerChart.ChartType');\ngoog.provide('goog.ui.ServerChart.EncodingType');\ngoog.provide('goog.ui.ServerChart.Event');\ngoog.provide('goog.ui.ServerChart.LegendPosition');\ngoog.provide('goog.ui.ServerChart.MaximumValue');\ngoog.provide('goog.ui.ServerChart.MultiAxisAlignment');\ngoog.provide('goog.ui.ServerChart.MultiAxisType');\ngoog.provide('goog.ui.ServerChart.UriParam');\ngoog.provide('goog.ui.ServerChart.UriTooLongEvent');\n\ngoog.require('goog.Uri');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.events.Event');\ngoog.require('goog.string');\ngoog.require('goog.ui.Component');\n\n\n\n/**\n * Will construct a chart using Google's chartserver.\n *\n * @param {goog.ui.ServerChart.ChartType} type The chart type.\n * @param {number=} opt_width The width of the chart.\n * @param {number=} opt_height The height of the chart.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM Helper.\n * @param {string=} opt_uri Optional uri used to connect to the chart server, if\n *     different than goog.ui.ServerChart.CHART_SERVER_SCHEME_INDEPENDENT_URI.\n * @constructor\n * @extends {goog.ui.Component}\n *\n * @deprecated Google Chart Server has been deprecated. See\n *     https://developers.google.com/chart/image/ for details.\n * @final\n */\ngoog.ui.ServerChart = function(\n    type, opt_width, opt_height, opt_domHelper, opt_uri) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * Image URI.\n   * @type {goog.Uri}\n   * @private\n   */\n  this.uri_ = new goog.Uri(\n      opt_uri || goog.ui.ServerChart.CHART_SERVER_SCHEME_INDEPENDENT_URI);\n\n  /**\n   * Encoding method for the URI data format.\n   * @type {goog.ui.ServerChart.EncodingType}\n   * @private\n   */\n  this.encodingType_ = goog.ui.ServerChart.EncodingType.AUTOMATIC;\n\n  /**\n   * Two-dimensional array of the data sets on the chart.\n   * @type {Array<Array<number>>}\n   * @private\n   */\n  this.dataSets_ = [];\n\n  /**\n   * Colors for each data set.\n   * @type {Array<string>}\n   * @private\n   */\n  this.setColors_ = [];\n\n  /**\n   * Legend texts for each data set.\n   * @type {Array<string>}\n   * @private\n   */\n  this.setLegendTexts_ = [];\n\n  /**\n   * Labels on the X-axis.\n   * @type {Array<string>}\n   * @private\n   */\n  this.xLabels_ = [];\n\n  /**\n   * Labels on the left along the Y-axis.\n   * @type {Array<string>}\n   * @private\n   */\n  this.leftLabels_ = [];\n\n  /**\n   * Labels on the right along the Y-axis.\n   * @type {Array<string>}\n   * @private\n   */\n  this.rightLabels_ = [];\n\n  /**\n   * Axis type for each multi-axis in the chart. The indices into this array\n   * also work as the reference index for all other multi-axis properties.\n   * @type {Array<goog.ui.ServerChart.MultiAxisType>}\n   * @private\n   */\n  this.multiAxisType_ = [];\n\n  /**\n   * Axis text for each multi-axis in the chart, indexed by the indices from\n   * multiAxisType_ in a sparse array.\n   * @type {Object}\n   * @private\n   */\n  this.multiAxisLabelText_ = {};\n\n\n  /**\n   * Axis position for each multi-axis in the chart, indexed by the indices\n   * from multiAxisType_ in a sparse array.\n   * @type {Object}\n   * @private\n   */\n  this.multiAxisLabelPosition_ = {};\n\n  /**\n   * Axis range for each multi-axis in the chart, indexed by the indices from\n   * multiAxisType_ in a sparse array.\n   * @type {Object}\n   * @private\n   */\n  this.multiAxisRange_ = {};\n\n  /**\n   * Axis style for each multi-axis in the chart, indexed by the indices from\n   * multiAxisType_ in a sparse array.\n   * @type {Object}\n   * @private\n   */\n  this.multiAxisLabelStyle_ = {};\n\n  this.setType(type);\n  this.setSize(opt_width, opt_height);\n\n  /**\n   * Minimum value for the chart (used for normalization). By default,\n   * this is set to infinity, and is eventually updated to the lowest given\n   * value in the data. The minimum value is then subtracted from all other\n   * values. For a pie chart, subtracting the minimum value does not make\n   * sense, so minValue_ is set to zero because 0 is the additive identity.\n   * @type {number}\n   * @private\n   */\n  this.minValue_ = this.isPieChart() ? 0 : Infinity;\n};\ngoog.inherits(goog.ui.ServerChart, goog.ui.Component);\n\n\n/**\n * Base scheme-independent URI for the chart renderer.\n * @type {string}\n */\ngoog.ui.ServerChart.CHART_SERVER_SCHEME_INDEPENDENT_URI =\n    '//chart.googleapis.com/chart';\n\n\n/**\n * Base HTTP URI for the chart renderer.\n * @type {string}\n */\ngoog.ui.ServerChart.CHART_SERVER_HTTP_URI = 'http://chart.googleapis.com/chart';\n\n\n/**\n * Base HTTPS URI for the chart renderer.\n * @type {string}\n */\ngoog.ui.ServerChart.CHART_SERVER_HTTPS_URI =\n    'https://chart.googleapis.com/chart';\n\n\n/**\n * Base URI for the chart renderer.\n * @type {string}\n * @deprecated Use\n *     {@link goog.ui.ServerChart.CHART_SERVER_SCHEME_INDEPENDENT_URI},\n *     {@link goog.ui.ServerChart.CHART_SERVER_HTTP_URI} or\n *     {@link goog.ui.ServerChart.CHART_SERVER_HTTPS_URI} instead.\n */\ngoog.ui.ServerChart.CHART_SERVER_URI =\n    goog.ui.ServerChart.CHART_SERVER_HTTP_URI;\n\n\n/**\n * The 0 - 1.0 (\"fraction of the range\") value to use when getMinValue() ==\n * getMaxValue(). This determines, for example, the vertical position\n * of the line in a flat line-chart.\n * @type {number}\n */\ngoog.ui.ServerChart.DEFAULT_NORMALIZATION = 0.5;\n\n\n/**\n * The upper limit on the length of the chart image URI, after encoding.\n * If the URI's length equals or exceeds it, goog.ui.ServerChart.UriTooLongEvent\n * is dispatched on the goog.ui.ServerChart object.\n * @type {number}\n * @private\n */\ngoog.ui.ServerChart.prototype.uriLengthLimit_ = 2048;\n\n\n/**\n * Number of gridlines along the X-axis.\n * @type {number}\n * @private\n */\ngoog.ui.ServerChart.prototype.gridX_ = 0;\n\n\n/**\n * Number of gridlines along the Y-axis.\n * @type {number}\n * @private\n */\ngoog.ui.ServerChart.prototype.gridY_ = 0;\n\n\n/**\n * Maximum value for the chart (used for normalization). The minimum is\n * declared in the constructor.\n * @type {number}\n * @private\n */\ngoog.ui.ServerChart.prototype.maxValue_ = -Infinity;\n\n\n/**\n * Chart title.\n * @type {?string}\n * @private\n */\ngoog.ui.ServerChart.prototype.title_ = null;\n\n\n/**\n * Chart title size.\n * @type {number}\n * @private\n */\ngoog.ui.ServerChart.prototype.titleSize_ = 13.5;\n\n\n/**\n * Chart title color.\n * @type {string}\n * @private\n */\ngoog.ui.ServerChart.prototype.titleColor_ = '333333';\n\n\n/**\n * Chart legend.\n * @type {Array<string>?}\n * @private\n */\ngoog.ui.ServerChart.prototype.legend_ = null;\n\n\n/**\n * ChartServer supports using data sets to position markers. A data set\n * that is being used for positioning only can be made \"invisible\", in other\n * words, the caller can indicate to ChartServer that ordinary chart elements\n * (e.g. bars in a bar chart) should not be drawn on the data points of the\n * invisible data set. Such data sets must be provided at the end of the\n * chd parameter, and if invisible data sets are being used, the chd\n * parameter must indicate the number of visible data sets.\n * @type {?number}\n * @private\n */\ngoog.ui.ServerChart.prototype.numVisibleDataSets_ = null;\n\n\n/**\n * Creates the DOM node (image) needed for the Chart\n * @override\n */\ngoog.ui.ServerChart.prototype.createDom = function() {\n  var size = this.getSize();\n  this.setElementInternal(this.getDomHelper().createDom(goog.dom.TagName.IMG, {\n    'src': this.getUri(),\n    'class': goog.getCssName('goog-serverchart-image'),\n    'width': size[0],\n    'height': size[1]\n  }));\n};\n\n\n/**\n * Decorate an image already in the DOM.\n * Expects the following structure:\n * <pre>\n *   - img\n * </pre>\n *\n * @param {Element} img Image to decorate.\n * @override\n */\ngoog.ui.ServerChart.prototype.decorateInternal = function(img) {\n  goog.dom.safe.setImageSrc(\n      /** @type {!HTMLImageElement} */ (img), this.getUri().toString());\n  this.setElementInternal(img);\n};\n\n\n/**\n * Updates the image if any of the data or settings have changed.\n */\ngoog.ui.ServerChart.prototype.updateChart = function() {\n  if (this.getElement()) {\n    goog.dom.safe.setImageSrc(\n        /** @type {!HTMLImageElement} */ (this.getElement()),\n        this.getUri().toString());\n  }\n};\n\n\n/**\n * Sets the URI of the chart.\n *\n * @param {goog.Uri} uri The chart URI.\n */\ngoog.ui.ServerChart.prototype.setUri = function(uri) {\n  this.uri_ = uri;\n};\n\n\n/**\n * Returns the URI of the chart.\n *\n * @return {goog.Uri} The chart URI.\n */\ngoog.ui.ServerChart.prototype.getUri = function() {\n  this.computeDataString_();\n  return this.uri_;\n};\n\n\n/**\n * Returns the upper limit on the length of the chart image URI, after encoding.\n * If the URI's length equals or exceeds it, goog.ui.ServerChart.UriTooLongEvent\n * is dispatched on the goog.ui.ServerChart object.\n *\n * @return {number} The chart URI length limit.\n */\ngoog.ui.ServerChart.prototype.getUriLengthLimit = function() {\n  return this.uriLengthLimit_;\n};\n\n\n/**\n * Sets the upper limit on the length of the chart image URI, after encoding.\n * If the URI's length equals or exceeds it, goog.ui.ServerChart.UriTooLongEvent\n * is dispatched on the goog.ui.ServerChart object.\n *\n * @param {number} uriLengthLimit The chart URI length limit.\n */\ngoog.ui.ServerChart.prototype.setUriLengthLimit = function(uriLengthLimit) {\n  this.uriLengthLimit_ = uriLengthLimit;\n};\n\n\n/**\n * Sets the 'chg' parameter of the chart Uri.\n * This is used by various types of charts to specify Grids.\n *\n * @param {string} value Value for the 'chg' parameter in the chart Uri.\n */\ngoog.ui.ServerChart.prototype.setGridParameter = function(value) {\n  this.uri_.setParameterValue(goog.ui.ServerChart.UriParam.GRID, value);\n};\n\n\n/**\n * Returns the 'chg' parameter of the chart Uri.\n * This is used by various types of charts to specify Grids.\n *\n * @return {string|undefined} The 'chg' parameter of the chart Uri.\n */\ngoog.ui.ServerChart.prototype.getGridParameter = function() {\n  return /** @type {string} */ (\n      this.uri_.getParameterValue(goog.ui.ServerChart.UriParam.GRID));\n};\n\n\n/**\n * Sets the 'chm' parameter of the chart Uri.\n * This is used by various types of charts to specify Markers.\n *\n * @param {string} value Value for the 'chm' parameter in the chart Uri.\n */\ngoog.ui.ServerChart.prototype.setMarkerParameter = function(value) {\n  this.uri_.setParameterValue(goog.ui.ServerChart.UriParam.MARKERS, value);\n};\n\n\n/**\n * Returns the 'chm' parameter of the chart Uri.\n * This is used by various types of charts to specify Markers.\n *\n * @return {string|undefined} The 'chm' parameter of the chart Uri.\n */\ngoog.ui.ServerChart.prototype.getMarkerParameter = function() {\n  return /** @type {string} */ (\n      this.uri_.getParameterValue(goog.ui.ServerChart.UriParam.MARKERS));\n};\n\n\n/**\n * Sets the 'chp' parameter of the chart Uri.\n * This is used by various types of charts to specify certain options.\n * e.g., finance charts use this to designate which line is the 0 axis.\n *\n * @param {string|number} value Value for the 'chp' parameter in the chart Uri.\n */\ngoog.ui.ServerChart.prototype.setMiscParameter = function(value) {\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.MISC_PARAMS, String(value));\n};\n\n\n/**\n * Returns the 'chp' parameter of the chart Uri.\n * This is used by various types of charts to specify certain options.\n * e.g., finance charts use this to designate which line is the 0 axis.\n *\n * @return {string|undefined} The 'chp' parameter of the chart Uri.\n */\ngoog.ui.ServerChart.prototype.getMiscParameter = function() {\n  return /** @type {string} */ (\n      this.uri_.getParameterValue(goog.ui.ServerChart.UriParam.MISC_PARAMS));\n};\n\n\n/**\n * Enum of chart data encoding types\n *\n * @enum {string}\n */\ngoog.ui.ServerChart.EncodingType = {\n  AUTOMATIC: '',\n  EXTENDED: 'e',\n  SIMPLE: 's',\n  TEXT: 't'\n};\n\n\n/**\n * Enum of chart types with their short names used by the chartserver.\n *\n * @enum {string}\n */\ngoog.ui.ServerChart.ChartType = {\n  BAR: 'br',\n  CLOCK: 'cf',\n  CONCENTRIC_PIE: 'pc',\n  FILLEDLINE: 'lr',\n  FINANCE: 'lfi',\n  GOOGLEOMETER: 'gom',\n  HORIZONTAL_GROUPED_BAR: 'bhg',\n  HORIZONTAL_STACKED_BAR: 'bhs',\n  LINE: 'lc',\n  MAP: 't',\n  MAPUSA: 'tuss',\n  MAPWORLD: 'twoc',\n  PIE: 'p',\n  PIE3D: 'p3',\n  RADAR: 'rs',\n  SCATTER: 's',\n  SPARKLINE: 'ls',\n  VENN: 'v',\n  VERTICAL_GROUPED_BAR: 'bvg',\n  VERTICAL_STACKED_BAR: 'bvs',\n  XYLINE: 'lxy'\n};\n\n\n/**\n * Enum of multi-axis types.\n *\n * @enum {string}\n */\ngoog.ui.ServerChart.MultiAxisType = {\n  X_AXIS: 'x',\n  LEFT_Y_AXIS: 'y',\n  RIGHT_Y_AXIS: 'r',\n  TOP_AXIS: 't'\n};\n\n\n/**\n * Enum of multi-axis alignments.\n *\n * @enum {number}\n */\ngoog.ui.ServerChart.MultiAxisAlignment = {\n  ALIGN_LEFT: -1,\n  ALIGN_CENTER: 0,\n  ALIGN_RIGHT: 1\n};\n\n\n/**\n * Enum of legend positions.\n *\n * @enum {string}\n */\ngoog.ui.ServerChart.LegendPosition = {\n  TOP: 't',\n  BOTTOM: 'b',\n  LEFT: 'l',\n  RIGHT: 'r'\n};\n\n\n/**\n * Enum of line and tick options for an axis.\n *\n * @enum {string}\n */\ngoog.ui.ServerChart.AxisDisplayType = {\n  LINE_AND_TICKS: 'lt',\n  LINE: 'l',\n  TICKS: 't'\n};\n\n\n/**\n * Enum of chart maximum values in pixels, as listed at:\n * http://code.google.com/apis/chart/basics.html\n *\n * @enum {number}\n */\ngoog.ui.ServerChart.MaximumValue = {\n  WIDTH: 1000,\n  HEIGHT: 1000,\n  MAP_WIDTH: 440,\n  MAP_HEIGHT: 220,\n  TOTAL_AREA: 300000\n};\n\n\n/**\n * Enum of ChartServer URI parameters.\n *\n * @enum {string}\n */\ngoog.ui.ServerChart.UriParam = {\n  BACKGROUND_FILL: 'chf',\n  BAR_HEIGHT: 'chbh',\n  DATA: 'chd',\n  DATA_COLORS: 'chco',\n  DATA_LABELS: 'chld',\n  DATA_SCALING: 'chds',\n  DIGITAL_SIGNATURE: 'sig',\n  GEOGRAPHICAL_REGION: 'chtm',\n  GRID: 'chg',\n  LABEL_COLORS: 'chlc',\n  LEFT_Y_LABELS: 'chly',\n  LEGEND: 'chdl',\n  LEGEND_POSITION: 'chdlp',\n  LEGEND_TEXTS: 'chdl',\n  LINE_STYLES: 'chls',\n  MARGINS: 'chma',\n  MARKERS: 'chm',\n  MISC_PARAMS: 'chp',\n  MULTI_AXIS_LABEL_POSITION: 'chxp',\n  MULTI_AXIS_LABEL_TEXT: 'chxl',\n  MULTI_AXIS_RANGE: 'chxr',\n  MULTI_AXIS_STYLE: 'chxs',\n  MULTI_AXIS_TYPES: 'chxt',\n  RIGHT_LABELS: 'chlr',\n  RIGHT_LABEL_POSITIONS: 'chlrp',\n  SIZE: 'chs',\n  TITLE: 'chtt',\n  TITLE_FORMAT: 'chts',\n  TYPE: 'cht',\n  X_AXIS_STYLE: 'chx',\n  X_LABELS: 'chl'\n};\n\n\n/**\n * Sets the background fill.\n *\n * @param {Array<Object>} fill An array of background fill specification\n *     objects. Each object may have the following properties:\n *     {string} area The area to fill, either 'bg' for background or 'c' for\n *         chart area.  The default is 'bg'.\n *     {string} color (required) The color of the background fill.\n *     // TODO(user): Add support for gradient/stripes, which requires\n *     // a different object structure.\n */\ngoog.ui.ServerChart.prototype.setBackgroundFill = function(fill) {\n  var value = [];\n  goog.array.forEach(fill, function(spec) {\n    spec.area = spec.area || 'bg';\n    spec.effect = spec.effect || 's';\n    value.push([spec.area, spec.effect, spec.color].join(','));\n  });\n  value = value.join('|');\n  this.setParameterValue(goog.ui.ServerChart.UriParam.BACKGROUND_FILL, value);\n};\n\n\n/**\n * Returns the background fill.\n *\n * @return {!Array<Object>} An array of background fill specifications.\n *     If the fill specification string is in an unsupported format, the method\n *    returns an empty array.\n */\ngoog.ui.ServerChart.prototype.getBackgroundFill = function() {\n  var value =\n      this.uri_.getParameterValue(goog.ui.ServerChart.UriParam.BACKGROUND_FILL);\n  var result = [];\n  if (value != null) {\n    var fillSpecifications = value.split('|');\n    var valid = true;\n    goog.array.forEach(fillSpecifications, function(spec) {\n      var parts = spec.split(',');\n      if (valid && parts[1] == 's') {\n        result.push({area: parts[0], effect: parts[1], color: parts[2]});\n      } else {\n        // If the format is unsupported, return an empty array.\n        result = [];\n        valid = false;\n      }\n    });\n  }\n  return result;\n};\n\n\n/**\n * Sets the encoding type.\n *\n * @param {goog.ui.ServerChart.EncodingType} type Desired data encoding type.\n */\ngoog.ui.ServerChart.prototype.setEncodingType = function(type) {\n  this.encodingType_ = type;\n};\n\n\n/**\n * Gets the encoding type.\n *\n * @return {goog.ui.ServerChart.EncodingType} The encoding type.\n */\ngoog.ui.ServerChart.prototype.getEncodingType = function() {\n  return this.encodingType_;\n};\n\n\n/**\n * Sets the chart type.\n *\n * @param {goog.ui.ServerChart.ChartType} type The desired chart type.\n */\ngoog.ui.ServerChart.prototype.setType = function(type) {\n  this.uri_.setParameterValue(goog.ui.ServerChart.UriParam.TYPE, type);\n};\n\n\n/**\n * Returns the chart type.\n *\n * @return {goog.ui.ServerChart.ChartType} The chart type.\n */\ngoog.ui.ServerChart.prototype.getType = function() {\n  return /** @type {goog.ui.ServerChart.ChartType} */ (\n      this.uri_.getParameterValue(goog.ui.ServerChart.UriParam.TYPE));\n};\n\n\n/**\n * Sets the chart size.\n *\n * @param {number=} opt_width Optional chart width, defaults to 300.\n * @param {number=} opt_height Optional chart height, defaults to 150.\n */\ngoog.ui.ServerChart.prototype.setSize = function(opt_width, opt_height) {\n  var sizeString = [opt_width || 300, opt_height || 150].join('x');\n  this.uri_.setParameterValue(goog.ui.ServerChart.UriParam.SIZE, sizeString);\n};\n\n\n/**\n * Returns the chart size.\n *\n * @return {!Array<string>} [Width, Height].\n */\ngoog.ui.ServerChart.prototype.getSize = function() {\n  var sizeStr = this.uri_.getParameterValue(goog.ui.ServerChart.UriParam.SIZE);\n  return sizeStr.split('x');\n};\n\n\n/**\n * Sets the minimum value of the chart.\n *\n * @param {number} minValue The minimum value of the chart.\n */\ngoog.ui.ServerChart.prototype.setMinValue = function(minValue) {\n  this.minValue_ = minValue;\n};\n\n\n/**\n * @return {number} The minimum value of the chart.\n */\ngoog.ui.ServerChart.prototype.getMinValue = function() {\n  return this.minValue_;\n};\n\n\n/**\n * Sets the maximum value of the chart.\n *\n * @param {number} maxValue The maximum value of the chart.\n */\ngoog.ui.ServerChart.prototype.setMaxValue = function(maxValue) {\n  this.maxValue_ = maxValue;\n};\n\n\n/**\n * @return {number} The maximum value of the chart.\n */\ngoog.ui.ServerChart.prototype.getMaxValue = function() {\n  return this.maxValue_;\n};\n\n\n/**\n * Sets the chart margins.\n *\n * @param {number} leftMargin The size in pixels of the left margin.\n * @param {number} rightMargin The size in pixels of the right margin.\n * @param {number} topMargin The size in pixels of the top margin.\n * @param {number} bottomMargin The size in pixels of the bottom margin.\n */\ngoog.ui.ServerChart.prototype.setMargins = function(\n    leftMargin, rightMargin, topMargin, bottomMargin) {\n  var margins = [leftMargin, rightMargin, topMargin, bottomMargin].join(',');\n  var UriParam = goog.ui.ServerChart.UriParam;\n  this.uri_.setParameterValue(UriParam.MARGINS, margins);\n};\n\n\n/**\n * Sets the number of grid lines along the X-axis.\n *\n * @param {number} gridlines The number of X-axis grid lines.\n */\ngoog.ui.ServerChart.prototype.setGridX = function(gridlines) {\n  // Need data for this to work.\n  this.gridX_ = gridlines;\n  this.setGrids_(this.gridX_, this.gridY_);\n};\n\n\n/**\n * @return {number} The number of gridlines along the X-axis.\n */\ngoog.ui.ServerChart.prototype.getGridX = function() {\n  return this.gridX_;\n};\n\n\n/**\n * Sets the number of grid lines along the Y-axis.\n *\n * @param {number} gridlines The number of Y-axis grid lines.\n */\ngoog.ui.ServerChart.prototype.setGridY = function(gridlines) {\n  // Need data for this to work.\n  this.gridY_ = gridlines;\n  this.setGrids_(this.gridX_, this.gridY_);\n};\n\n\n/**\n * @return {number} The number of gridlines along the Y-axis.\n */\ngoog.ui.ServerChart.prototype.getGridY = function() {\n  return this.gridY_;\n};\n\n\n/**\n * Sets the grids for the chart\n *\n * @private\n * @param {number} x The number of grid lines along the x-axis.\n * @param {number} y The number of grid lines along the y-axis.\n */\ngoog.ui.ServerChart.prototype.setGrids_ = function(x, y) {\n  var gridArray = [x == 0 ? 0 : 100 / x, y == 0 ? 0 : 100 / y];\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.GRID, gridArray.join(','));\n};\n\n\n/**\n * Sets the X Labels for the chart.\n *\n * @param {Array<string>} labels The X Labels for the chart.\n */\ngoog.ui.ServerChart.prototype.setXLabels = function(labels) {\n  this.xLabels_ = labels;\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.X_LABELS, this.xLabels_.join('|'));\n};\n\n\n/**\n * @return {Array<string>} The X Labels for the chart.\n */\ngoog.ui.ServerChart.prototype.getXLabels = function() {\n  return this.xLabels_;\n};\n\n\n/**\n * @return {boolean} Whether the chart is a bar chart.\n */\ngoog.ui.ServerChart.prototype.isBarChart = function() {\n  var type = this.getType();\n  return type == goog.ui.ServerChart.ChartType.BAR ||\n      type == goog.ui.ServerChart.ChartType.HORIZONTAL_GROUPED_BAR ||\n      type == goog.ui.ServerChart.ChartType.HORIZONTAL_STACKED_BAR ||\n      type == goog.ui.ServerChart.ChartType.VERTICAL_GROUPED_BAR ||\n      type == goog.ui.ServerChart.ChartType.VERTICAL_STACKED_BAR;\n};\n\n\n/**\n * @return {boolean} Whether the chart is a pie chart.\n */\ngoog.ui.ServerChart.prototype.isPieChart = function() {\n  var type = this.getType();\n  return type == goog.ui.ServerChart.ChartType.PIE ||\n      type == goog.ui.ServerChart.ChartType.PIE3D ||\n      type == goog.ui.ServerChart.ChartType.CONCENTRIC_PIE;\n};\n\n\n/**\n * @return {boolean} Whether the chart is a grouped bar chart.\n */\ngoog.ui.ServerChart.prototype.isGroupedBarChart = function() {\n  var type = this.getType();\n  return type == goog.ui.ServerChart.ChartType.HORIZONTAL_GROUPED_BAR ||\n      type == goog.ui.ServerChart.ChartType.VERTICAL_GROUPED_BAR;\n};\n\n\n/**\n * @return {boolean} Whether the chart is a horizontal bar chart.\n */\ngoog.ui.ServerChart.prototype.isHorizontalBarChart = function() {\n  var type = this.getType();\n  return type == goog.ui.ServerChart.ChartType.BAR ||\n      type == goog.ui.ServerChart.ChartType.HORIZONTAL_GROUPED_BAR ||\n      type == goog.ui.ServerChart.ChartType.HORIZONTAL_STACKED_BAR;\n};\n\n\n/**\n * @return {boolean} Whether the chart is a line chart.\n */\ngoog.ui.ServerChart.prototype.isLineChart = function() {\n  var type = this.getType();\n  return type == goog.ui.ServerChart.ChartType.FILLEDLINE ||\n      type == goog.ui.ServerChart.ChartType.LINE ||\n      type == goog.ui.ServerChart.ChartType.SPARKLINE ||\n      type == goog.ui.ServerChart.ChartType.XYLINE;\n};\n\n\n/**\n * @return {boolean} Whether the chart is a map.\n */\ngoog.ui.ServerChart.prototype.isMap = function() {\n  var type = this.getType();\n  return type == goog.ui.ServerChart.ChartType.MAP ||\n      type == goog.ui.ServerChart.ChartType.MAPUSA ||\n      type == goog.ui.ServerChart.ChartType.MAPWORLD;\n};\n\n\n/**\n * @return {boolean} Whether the chart is a stacked bar chart.\n */\ngoog.ui.ServerChart.prototype.isStackedBarChart = function() {\n  var type = this.getType();\n  return type == goog.ui.ServerChart.ChartType.BAR ||\n      type == goog.ui.ServerChart.ChartType.HORIZONTAL_STACKED_BAR ||\n      type == goog.ui.ServerChart.ChartType.VERTICAL_STACKED_BAR;\n};\n\n\n/**\n * @return {boolean} Whether the chart is a vertical bar chart.\n */\ngoog.ui.ServerChart.prototype.isVerticalBarChart = function() {\n  var type = this.getType();\n  return type == goog.ui.ServerChart.ChartType.VERTICAL_GROUPED_BAR ||\n      type == goog.ui.ServerChart.ChartType.VERTICAL_STACKED_BAR;\n};\n\n\n/**\n * Sets the Left Labels for the chart.\n * NOTE: The array should start with the lowest value, and then\n *       move progessively up the axis. So if you want labels\n *       from 0 to 100 with 0 at bottom of the graph, then you would\n *       want to pass something like [0,25,50,75,100].\n *\n * @param {Array<string>} labels The Left Labels for the chart.\n */\ngoog.ui.ServerChart.prototype.setLeftLabels = function(labels) {\n  this.leftLabels_ = labels;\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.LEFT_Y_LABELS,\n      this.leftLabels_.reverse().join('|'));\n};\n\n\n/**\n * @return {Array<string>} The Left Labels for the chart.\n */\ngoog.ui.ServerChart.prototype.getLeftLabels = function() {\n  return this.leftLabels_;\n};\n\n\n/**\n * Sets the given ChartServer parameter.\n *\n * @param {goog.ui.ServerChart.UriParam} key The ChartServer parameter to set.\n * @param {string} value The value to set for the ChartServer parameter.\n */\ngoog.ui.ServerChart.prototype.setParameterValue = function(key, value) {\n  this.uri_.setParameterValue(key, value);\n};\n\n\n/**\n * Removes the given ChartServer parameter.\n *\n * @param {goog.ui.ServerChart.UriParam} key The ChartServer parameter to\n *     remove.\n */\ngoog.ui.ServerChart.prototype.removeParameter = function(key) {\n  this.uri_.removeParameter(key);\n};\n\n\n/**\n * Sets the Right Labels for the chart.\n * NOTE: The array should start with the lowest value, and then\n *       move progessively up the axis. So if you want labels\n *       from 0 to 100 with 0 at bottom of the graph, then you would\n *       want to pass something like [0,25,50,75,100].\n *\n * @param {Array<string>} labels The Right Labels for the chart.\n */\ngoog.ui.ServerChart.prototype.setRightLabels = function(labels) {\n  this.rightLabels_ = labels;\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.RIGHT_LABELS,\n      this.rightLabels_.reverse().join('|'));\n};\n\n\n/**\n * @return {Array<string>} The Right Labels for the chart.\n */\ngoog.ui.ServerChart.prototype.getRightLabels = function() {\n  return this.rightLabels_;\n};\n\n\n/**\n * Sets the position relative to the chart where the legend is to be displayed.\n *\n * @param {goog.ui.ServerChart.LegendPosition} value Legend position.\n */\ngoog.ui.ServerChart.prototype.setLegendPosition = function(value) {\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.LEGEND_POSITION, value);\n};\n\n\n/**\n * Returns the position relative to the chart where the legend is to be\n * displayed.\n *\n * @return {goog.ui.ServerChart.LegendPosition} Legend position.\n */\ngoog.ui.ServerChart.prototype.getLegendPosition = function() {\n  return /** @type {goog.ui.ServerChart.LegendPosition} */ (\n      this.uri_.getParameterValue(\n          goog.ui.ServerChart.UriParam.LEGEND_POSITION));\n};\n\n\n/**\n * Sets the number of \"visible\" data sets. All data sets that come after\n * the visible data set are not drawn as part of the chart. Instead, they\n * are available for positioning markers.\n\n * @param {?number} n The number of visible data sets, or null if all data\n * sets are to be visible.\n */\ngoog.ui.ServerChart.prototype.setNumVisibleDataSets = function(n) {\n  this.numVisibleDataSets_ = n;\n};\n\n\n/**\n * Returns the number of \"visible\" data sets. All data sets that come after\n * the visible data set are not drawn as part of the chart. Instead, they\n * are available for positioning markers.\n *\n * @return {?number} The number of visible data sets, or null if all data\n * sets are visible.\n */\ngoog.ui.ServerChart.prototype.getNumVisibleDataSets = function() {\n  return this.numVisibleDataSets_;\n};\n\n\n/**\n * Sets the weight function for a Venn Diagram along with the associated\n *     colors and legend text. Weights are assigned as follows:\n *     weights[0] is relative area of circle A.\n *     weights[1] is relative area of circle B.\n *     weights[2] is relative area of circle C.\n *     weights[3] is relative area of overlap of circles A and B.\n *     weights[4] is relative area of overlap of circles A and C.\n *     weights[5] is relative area of overlap of circles B and C.\n *     weights[6] is relative area of overlap of circles A, B and C.\n * For a two circle Venn Diagram the weights are assigned as follows:\n *     weights[0] is relative area of circle A.\n *     weights[1] is relative area of circle B.\n *     weights[2] is relative area of overlap of circles A and B.\n *\n * @param {Array<number>} weights The relative weights of the circles.\n * @param {Array<string>=} opt_legendText The legend labels for the circles.\n * @param {Array<string>=} opt_colors The colors for the circles.\n */\ngoog.ui.ServerChart.prototype.setVennSeries = function(\n    weights, opt_legendText, opt_colors) {\n  if (this.getType() != goog.ui.ServerChart.ChartType.VENN) {\n    throw new Error('Can only set a weight function for a Venn diagram.');\n  }\n  var dataMin = this.arrayMin_(weights);\n  if (dataMin < this.minValue_) {\n    this.minValue_ = dataMin;\n  }\n  var dataMax = this.arrayMax_(weights);\n  if (dataMax > this.maxValue_) {\n    this.maxValue_ = dataMax;\n  }\n  if (opt_legendText !== undefined) {\n    goog.array.forEach(opt_legendText, goog.bind(function(legend) {\n      this.setLegendTexts_.push(legend);\n    }, this));\n    this.uri_.setParameterValue(\n        goog.ui.ServerChart.UriParam.LEGEND_TEXTS,\n        this.setLegendTexts_.join('|'));\n  }\n  // If the caller only gave three weights, then they wanted a two circle\n  // Venn Diagram. Create a 3 circle weight function where circle C has\n  // area zero.\n  if (weights.length == 3) {\n    weights[3] = weights[2];\n    weights[2] = 0.0;\n  }\n  this.dataSets_.push(weights);\n  if (opt_colors !== undefined) {\n    goog.array.forEach(opt_colors, goog.bind(function(color) {\n      this.setColors_.push(color);\n    }, this));\n    this.uri_.setParameterValue(\n        goog.ui.ServerChart.UriParam.DATA_COLORS, this.setColors_.join(','));\n  }\n};\n\n\n/**\n * Sets the title of the chart.\n *\n * @param {string} title The chart title.\n */\ngoog.ui.ServerChart.prototype.setTitle = function(title) {\n  this.title_ = title;\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.TITLE, this.title_.replace(/\\n/g, '|'));\n};\n\n\n/**\n * Sets the size of the chart title.\n *\n * @param {number} size The title size, in points.\n */\ngoog.ui.ServerChart.prototype.setTitleSize = function(size) {\n  this.titleSize_ = size;\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.TITLE_FORMAT,\n      this.titleColor_ + ',' + this.titleSize_);\n};\n\n\n/**\n * @return {number} size The title size, in points.\n */\ngoog.ui.ServerChart.prototype.getTitleSize = function() {\n  return this.titleSize_;\n};\n\n\n/**\n * Sets the color of the chart title.\n *\n * NOTE: The color string should NOT have a '#' at the beginning of it.\n *\n * @param {string} color The hex value for the title color.\n */\ngoog.ui.ServerChart.prototype.setTitleColor = function(color) {\n  this.titleColor_ = color;\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.TITLE_FORMAT,\n      this.titleColor_ + ',' + this.titleSize_);\n};\n\n\n/**\n * @return {string} color The hex value for the title color.\n */\ngoog.ui.ServerChart.prototype.getTitleColor = function() {\n  return this.titleColor_;\n};\n\n\n/**\n * Adds a legend to the chart.\n *\n * @param {Array<string>} legend The legend to add.\n */\ngoog.ui.ServerChart.prototype.setLegend = function(legend) {\n  this.legend_ = legend;\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.LEGEND, this.legend_.join('|'));\n};\n\n\n/**\n * Sets the data scaling.\n * NOTE: This also changes the encoding type because data scaling will\n *     only work with `goog.ui.ServerChart.EncodingType.TEXT`\n *     encoding.\n * @param {number} minimum The lowest number to apply to the data.\n * @param {number} maximum The highest number to apply to the data.\n */\ngoog.ui.ServerChart.prototype.setDataScaling = function(minimum, maximum) {\n  this.encodingType_ = goog.ui.ServerChart.EncodingType.TEXT;\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.DATA_SCALING, minimum + ',' + maximum);\n};\n\n\n/**\n * Sets the widths of the bars and the spaces between the bars in a bar\n * chart.\n * NOTE: If the space between groups is specified but the space between\n *     bars is left undefined, the space between groups will be interpreted\n *     as the space between bars because this is the behavior exposed\n *     in the external developers guide.\n * @param {number} barWidth The width of a bar in pixels.\n * @param {number=} opt_spaceBars The width of the space between\n *     bars in a group in pixels.\n * @param {number=} opt_spaceGroups The width of the space between\n *     groups.\n */\ngoog.ui.ServerChart.prototype.setBarSpaceWidths = function(\n    barWidth, opt_spaceBars, opt_spaceGroups) {\n  var widths = [barWidth];\n  if (opt_spaceBars !== undefined) {\n    widths.push(opt_spaceBars);\n  }\n  if (opt_spaceGroups !== undefined) {\n    widths.push(opt_spaceGroups);\n  }\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.BAR_HEIGHT, widths.join(','));\n};\n\n\n/**\n * Specifies that the bar width in a bar chart should be calculated\n * automatically given the space available in the chart, while optionally\n * setting the spaces between the bars.\n * NOTE: If the space between groups is specified but the space between\n *     bars is left undefined, the space between groups will be interpreted\n *     as the space between bars because this is the behavior exposed\n *     in the external developers guide.\n * @param {number=} opt_spaceBars The width of the space between\n *     bars in a group in pixels.\n * @param {number=} opt_spaceGroups The width of the space between\n *     groups.\n */\ngoog.ui.ServerChart.prototype.setAutomaticBarWidth = function(\n    opt_spaceBars, opt_spaceGroups) {\n  var widths = ['a'];\n  if (opt_spaceBars !== undefined) {\n    widths.push(opt_spaceBars);\n  }\n  if (opt_spaceGroups !== undefined) {\n    widths.push(opt_spaceGroups);\n  }\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.BAR_HEIGHT, widths.join(','));\n};\n\n\n/**\n * Adds a multi-axis to the chart, and sets its type. Multiple axes of the same\n * type can be added.\n *\n * @param {goog.ui.ServerChart.MultiAxisType} axisType The desired axis type.\n * @return {number} The index of the newly inserted axis, suitable for feeding\n *     to the setMultiAxis*() functions.\n */\ngoog.ui.ServerChart.prototype.addMultiAxis = function(axisType) {\n  this.multiAxisType_.push(axisType);\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.MULTI_AXIS_TYPES,\n      this.multiAxisType_.join(','));\n  return this.multiAxisType_.length - 1;\n};\n\n\n/**\n * Returns the axis type for the given axis, or all of them in an array if the\n * axis number is not given.\n *\n * @param {number=} opt_axisNumber The axis index, as returned by addMultiAxis.\n * @return {goog.ui.ServerChart.MultiAxisType|\n *     Array<goog.ui.ServerChart.MultiAxisType>}\n *     The axis type for the given axis, or all of them in an array if the\n *     axis number is not given.\n */\ngoog.ui.ServerChart.prototype.getMultiAxisType = function(opt_axisNumber) {\n  if (opt_axisNumber !== undefined) {\n    return this.multiAxisType_[opt_axisNumber];\n  }\n  return this.multiAxisType_;\n};\n\n\n/**\n * Sets the label text (usually multiple values) for a given axis, overwriting\n * any existing values.\n *\n * @param {number} axisNumber The axis index, as returned by addMultiAxis.\n * @param {Array<string>} labelText The actual label text to be added.\n */\ngoog.ui.ServerChart.prototype.setMultiAxisLabelText = function(\n    axisNumber, labelText) {\n  this.multiAxisLabelText_[axisNumber] = labelText;\n\n  var axisString = this.computeMultiAxisDataString_(\n      this.multiAxisLabelText_, ':|', '|', '|');\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.MULTI_AXIS_LABEL_TEXT, axisString);\n};\n\n\n/**\n * Returns the label text, or all of them in a two-dimensional array if the\n * axis number is not given.\n *\n * @param {number=} opt_axisNumber The axis index, as returned by addMultiAxis.\n * @return {Object|Array<string>} The label text, or all of them in a\n *     two-dimensional array if the axis number is not given.\n */\ngoog.ui.ServerChart.prototype.getMultiAxisLabelText = function(opt_axisNumber) {\n  if (opt_axisNumber !== undefined) {\n    return this.multiAxisLabelText_[opt_axisNumber];\n  }\n  return this.multiAxisLabelText_;\n};\n\n\n/**\n * Sets the label positions for a given axis, overwriting any existing values.\n * The label positions are assumed to be floating-point numbers within the\n * range of the axis.\n *\n * @param {number} axisNumber The axis index, as returned by addMultiAxis.\n * @param {Array<number>} labelPosition The actual label positions to be added.\n */\ngoog.ui.ServerChart.prototype.setMultiAxisLabelPosition = function(\n    axisNumber, labelPosition) {\n  this.multiAxisLabelPosition_[axisNumber] = labelPosition;\n\n  var positionString = this.computeMultiAxisDataString_(\n      this.multiAxisLabelPosition_, ',', ',', '|');\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.MULTI_AXIS_LABEL_POSITION, positionString);\n};\n\n\n/**\n * Returns the label positions for a given axis number, or all of them in a\n * two-dimensional array if the axis number is not given.\n *\n * @param {number=} opt_axisNumber The axis index, as returned by addMultiAxis.\n * @return {Object|Array<number>} The label positions for a given axis number,\n *     or all of them in a two-dimensional array if the axis number is not\n *     given.\n */\ngoog.ui.ServerChart.prototype.getMultiAxisLabelPosition = function(\n    opt_axisNumber) {\n  if (opt_axisNumber !== undefined) {\n    return this.multiAxisLabelPosition_[opt_axisNumber];\n  }\n  return this.multiAxisLabelPosition_;\n};\n\n\n/**\n * Sets the label range for a given axis, overwriting any existing range.\n * The default range is from 0 to 100. If the start value is larger than the\n * end value, the axis direction is reversed.  rangeStart and rangeEnd must\n * be two different finite numbers.\n *\n * @param {number} axisNumber The axis index, as returned by addMultiAxis.\n * @param {number} rangeStart The new start of the range.\n * @param {number} rangeEnd The new end of the range.\n * @param {number=} opt_interval The interval between axis labels.\n */\ngoog.ui.ServerChart.prototype.setMultiAxisRange = function(\n    axisNumber, rangeStart, rangeEnd, opt_interval) {\n  goog.asserts.assert(\n      rangeStart != rangeEnd, 'Range start and end cannot be the same value.');\n  goog.asserts.assert(\n      isFinite(rangeStart) && isFinite(rangeEnd),\n      'Range start and end must be finite numbers.');\n  this.multiAxisRange_[axisNumber] = [rangeStart, rangeEnd];\n  if (opt_interval !== undefined) {\n    this.multiAxisRange_[axisNumber].push(opt_interval);\n  }\n  var rangeString =\n      this.computeMultiAxisDataString_(this.multiAxisRange_, ',', ',', '|');\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.MULTI_AXIS_RANGE, rangeString);\n};\n\n\n/**\n * Returns the label range for a given axis number as a two-element array of\n * (range start, range end), or all of them in a two-dimensional array if the\n * axis number is not given.\n *\n * @param {number=} opt_axisNumber The axis index, as returned by addMultiAxis.\n * @return {Object|Array<number>} The label range for a given axis number as a\n *     two-element array of (range start, range end), or all of them in a\n *     two-dimensional array if the axis number is not given.\n */\ngoog.ui.ServerChart.prototype.getMultiAxisRange = function(opt_axisNumber) {\n  if (opt_axisNumber !== undefined) {\n    return this.multiAxisRange_[opt_axisNumber];\n  }\n  return this.multiAxisRange_;\n};\n\n\n/**\n * Sets the label style for a given axis, overwriting any existing style.\n * The default style is as follows: Default is x-axis labels are centered, left\n * hand y-axis labels are right aligned, right hand y-axis labels are left\n * aligned. The font size and alignment are optional parameters.\n *\n * NOTE: The color string should NOT have a '#' at the beginning of it.\n *\n * @param {number} axisNumber The axis index, as returned by addMultiAxis.\n * @param {string} color The hex value for this label's color.\n * @param {number=} opt_fontSize The label font size, in pixels.\n * @param {goog.ui.ServerChart.MultiAxisAlignment=} opt_alignment The label\n *     alignment.\n * @param {goog.ui.ServerChart.AxisDisplayType=} opt_axisDisplay The axis\n *     line and ticks.\n */\ngoog.ui.ServerChart.prototype.setMultiAxisLabelStyle = function(\n    axisNumber, color, opt_fontSize, opt_alignment, opt_axisDisplay) {\n  var style = [color];\n  if (opt_fontSize !== undefined || opt_alignment !== undefined) {\n    style.push(opt_fontSize || '');\n  }\n  if (opt_alignment !== undefined) {\n    style.push(opt_alignment);\n  }\n  if (opt_axisDisplay) {\n    style.push(opt_axisDisplay);\n  }\n  this.multiAxisLabelStyle_[axisNumber] = style;\n  var styleString = this.computeMultiAxisDataString_(\n      this.multiAxisLabelStyle_, ',', ',', '|');\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.MULTI_AXIS_STYLE, styleString);\n};\n\n\n/**\n * Returns the label style for a given axis number as a one- to three-element\n * array, or all of them in a two-dimensional array if the axis number is not\n * given.\n *\n * @param {number=} opt_axisNumber The axis index, as returned by addMultiAxis.\n * @return {Object|Array<number>} The label style for a given axis number as a\n *     one- to three-element array, or all of them in a two-dimensional array if\n *     the axis number is not given.\n */\ngoog.ui.ServerChart.prototype.getMultiAxisLabelStyle = function(\n    opt_axisNumber) {\n  if (opt_axisNumber !== undefined) {\n    return this.multiAxisLabelStyle_[opt_axisNumber];\n  }\n  return this.multiAxisLabelStyle_;\n};\n\n\n/**\n * Adds a data set.\n * NOTE: The color string should NOT have a '#' at the beginning of it.\n *\n * @param {Array<?number>} data An array of numbers (values can be\n *     NaN or null).\n * @param {string} color The hex value for this data set's color.\n * @param {string=} opt_legendText The legend text, if any, for this data\n *     series. NOTE: If specified, all previously added data sets must also\n *     have a legend text.\n */\ngoog.ui.ServerChart.prototype.addDataSet = function(\n    data, color, opt_legendText) {\n  var dataMin = this.arrayMin_(data);\n  if (dataMin < this.minValue_) {\n    this.minValue_ = dataMin;\n  }\n\n  var dataMax = this.arrayMax_(data);\n  if (dataMax > this.maxValue_) {\n    this.maxValue_ = dataMax;\n  }\n\n  if (opt_legendText !== undefined) {\n    if (this.setLegendTexts_.length < this.dataSets_.length) {\n      throw new Error('Cannot start adding legends text after first element.');\n    }\n    this.setLegendTexts_.push(opt_legendText);\n    this.uri_.setParameterValue(\n        goog.ui.ServerChart.UriParam.LEGEND_TEXTS,\n        this.setLegendTexts_.join('|'));\n  }\n\n  this.dataSets_.push(data);\n  this.setColors_.push(color);\n\n  this.uri_.setParameterValue(\n      goog.ui.ServerChart.UriParam.DATA_COLORS, this.setColors_.join(','));\n};\n\n\n/**\n * Clears the data sets from the graph. All data, including the colors and\n * legend text, is cleared.\n */\ngoog.ui.ServerChart.prototype.clearDataSets = function() {\n  var queryData = this.uri_.getQueryData();\n  queryData.remove(goog.ui.ServerChart.UriParam.LEGEND_TEXTS);\n  queryData.remove(goog.ui.ServerChart.UriParam.DATA_COLORS);\n  queryData.remove(goog.ui.ServerChart.UriParam.DATA);\n  this.setLegendTexts_.length = 0;\n  this.setColors_.length = 0;\n  this.dataSets_.length = 0;\n};\n\n\n/**\n * Returns the given data set or all of them in a two-dimensional array if\n * the set number is not given.\n *\n * @param {number=} opt_setNumber Optional data set number to get.\n * @return {Array<?>} The given data set or all of them in a two-dimensional\n *     array if the set number is not given.\n */\ngoog.ui.ServerChart.prototype.getData = function(opt_setNumber) {\n  if (opt_setNumber !== undefined) {\n    return this.dataSets_[opt_setNumber];\n  }\n  return this.dataSets_;\n};\n\n\n/**\n * Computes the data string using the data in this.dataSets_ and sets\n * the object's URI accordingly. If the URI's length equals or exceeds the\n * limit, goog.ui.ServerChart.UriTooLongEvent is dispatched on the\n * goog.ui.ServerChart object.\n * @private\n */\ngoog.ui.ServerChart.prototype.computeDataString_ = function() {\n  var ok;\n  if (this.encodingType_ != goog.ui.ServerChart.EncodingType.AUTOMATIC) {\n    ok = this.computeDataStringForEncoding_(this.encodingType_);\n  } else {\n    ok = this.computeDataStringForEncoding_(\n        goog.ui.ServerChart.EncodingType.EXTENDED);\n    if (!ok) {\n      ok = this.computeDataStringForEncoding_(\n          goog.ui.ServerChart.EncodingType.SIMPLE);\n    }\n  }\n  if (!ok) {\n    this.dispatchEvent(\n        new goog.ui.ServerChart.UriTooLongEvent(this.uri_.toString()));\n  }\n};\n\n\n/**\n * Computes the data string using the data in this.dataSets_ and the encoding\n * specified by the encoding parameter, which must not be AUTOMATIC, and sets\n * the object's URI accordingly.\n * @param {goog.ui.ServerChart.EncodingType} encoding The data encoding to use;\n *     must not be AUTOMATIC.\n * @return {boolean} False if the resulting URI is too long.\n * @private\n */\ngoog.ui.ServerChart.prototype.computeDataStringForEncoding_ = function(\n    encoding) {\n  var dataStrings = [];\n  for (var i = 0, setLen = this.dataSets_.length; i < setLen; ++i) {\n    dataStrings[i] = this.getChartServerValues_(\n        this.dataSets_[i], this.minValue_, this.maxValue_, encoding);\n  }\n  var delimiter = encoding == goog.ui.ServerChart.EncodingType.TEXT ? '|' : ',';\n  dataStrings = dataStrings.join(delimiter);\n  var data;\n  if (this.numVisibleDataSets_ == null) {\n    data = goog.string.buildString(encoding, ':', dataStrings);\n  } else {\n    data = goog.string.buildString(\n        encoding, this.numVisibleDataSets_, ':', dataStrings);\n  }\n  this.uri_.setParameterValue(goog.ui.ServerChart.UriParam.DATA, data);\n  return this.uri_.toString().length < this.uriLengthLimit_;\n};\n\n\n/**\n * Computes a multi-axis data string from the given data and separators. The\n * general data format for each index/element in the array will be\n * \"<arrayIndex><indexSeparator><arrayElement.join(elementSeparator)>\", with\n * axisSeparator used between multiple elements.\n * @param {Object} data The data to compute the data string for, as a\n *     sparse array of arrays. NOTE: The function uses the length of\n *     multiAxisType_ to determine the upper bound for the outer array.\n * @param {string} indexSeparator The separator string inserted between each\n *     index and the data itself, commonly a comma (,).\n * @param {string} elementSeparator The separator string inserted between each\n *     element inside each sub-array in the data, if there are more than one;\n *     commonly a comma (,).\n * @param {string} axisSeparator The separator string inserted between each\n *     axis specification, if there are more than one; usually a pipe sign (|).\n * @return {string} The multi-axis data string.\n * @private\n */\ngoog.ui.ServerChart.prototype.computeMultiAxisDataString_ = function(\n    data, indexSeparator, elementSeparator, axisSeparator) {\n  var elementStrings = [];\n  for (var i = 0, setLen = this.multiAxisType_.length; i < setLen; ++i) {\n    if (data[i]) {\n      elementStrings.push(i + indexSeparator + data[i].join(elementSeparator));\n    }\n  }\n  return elementStrings.join(axisSeparator);\n};\n\n\n/**\n * Array of possible ChartServer data values\n * @type {string}\n */\ngoog.ui.ServerChart.CHART_VALUES = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +\n    'abcdefghijklmnopqrstuvwxyz' +\n    '0123456789';\n\n\n/**\n * Array of extended ChartServer data values\n * @type {string}\n */\ngoog.ui.ServerChart.CHART_VALUES_EXTENDED =\n    goog.ui.ServerChart.CHART_VALUES + '-.';\n\n\n/**\n * Upper bound for extended values\n */\ngoog.ui.ServerChart.EXTENDED_UPPER_BOUND =\n    Math.pow(goog.ui.ServerChart.CHART_VALUES_EXTENDED.length, 2) - 1;\n\n\n/**\n * Converts a single number to an encoded data value suitable for ChartServer.\n * The TEXT encoding is the number in decimal; the SIMPLE encoding is a single\n * character, and the EXTENDED encoding is two characters.  See\n * https://developers.google.com/chart/image/docs/data_formats for the detailed\n * specification of these encoding formats.\n *\n * @private\n * @param {?number} value The value to convert (null for a missing data point).\n * @param {number} minValue The minimum value (used for normalization).\n * @param {number} maxValue The maximum value (used for normalization).\n * @param {goog.ui.ServerChart.EncodingType} encoding The data encoding to use;\n *     must not be AUTOMATIC.\n * @return {string} The encoded data value.\n */\ngoog.ui.ServerChart.prototype.getConvertedValue_ = function(\n    value, minValue, maxValue, encoding) {\n  goog.asserts.assert(\n      minValue <= maxValue,\n      'minValue should be less than or equal to maxValue');\n  var isExtended = (encoding == goog.ui.ServerChart.EncodingType.EXTENDED);\n\n  if (value === null || value === undefined || isNaN(value) ||\n      value < minValue || value > maxValue) {\n    return isExtended ? '__' : '_';\n  }\n\n  if (encoding == goog.ui.ServerChart.EncodingType.TEXT) {\n    return String(value);\n  }\n\n  var frac = goog.ui.ServerChart.DEFAULT_NORMALIZATION;\n  if (maxValue > minValue) {\n    frac = (value - minValue) / (maxValue - minValue);\n    // Previous checks of value ensure that 0 <= frac <= 1 at this point.\n  }\n\n  if (isExtended) {\n    var maxIndex = goog.ui.ServerChart.CHART_VALUES_EXTENDED.length;\n    var upperBound = goog.ui.ServerChart.EXTENDED_UPPER_BOUND;\n    var index1 = Math.floor(frac * upperBound / maxIndex);\n    var index2 = Math.floor((frac * upperBound) % maxIndex);\n    var extendedVals = goog.ui.ServerChart.CHART_VALUES_EXTENDED;\n    return extendedVals.charAt(index1) + extendedVals.charAt(index2);\n  }\n\n  var index = Math.round(frac * (goog.ui.ServerChart.CHART_VALUES.length - 1));\n  return goog.ui.ServerChart.CHART_VALUES.charAt(index);\n};\n\n\n/**\n * Creates the chd string for chartserver.\n *\n * @private\n * @param {Array<number>} values An array of numbers to graph.\n * @param {number} minValue The minimum value (used for normalization).\n * @param {number} maxValue The maximum value (used for normalization).\n * @param {goog.ui.ServerChart.EncodingType} encoding The data encoding to use;\n *     must not be AUTOMATIC.\n * @return {string} The chd string for chartserver.\n */\ngoog.ui.ServerChart.prototype.getChartServerValues_ = function(\n    values, minValue, maxValue, encoding) {\n  var s = [];\n  for (var i = 0, valuesLen = values.length; i < valuesLen; ++i) {\n    s.push(this.getConvertedValue_(values[i], minValue, maxValue, encoding));\n  }\n  return s.join(\n      this.encodingType_ == goog.ui.ServerChart.EncodingType.TEXT ? ',' : '');\n};\n\n\n/**\n * Finds the minimum value in an array and returns it.\n * Needed because Math.min does not handle sparse arrays the way we want.\n *\n * @param {Array<number?>} ary An array of values.\n * @return {number} The minimum value.\n * @private\n */\ngoog.ui.ServerChart.prototype.arrayMin_ = function(ary) {\n  var min = Infinity;\n  for (var i = 0, aryLen = ary.length; i < aryLen; ++i) {\n    var value = ary[i];\n    if (value != null && value < min) {\n      min = value;\n    }\n  }\n  return min;\n};\n\n\n/**\n * Finds the maximum value in an array and returns it.\n * Needed because Math.max does not handle sparse arrays the way we want.\n *\n * @param {Array<number?>} ary An array of values.\n * @return {number} The maximum value.\n * @private\n */\ngoog.ui.ServerChart.prototype.arrayMax_ = function(ary) {\n  var max = -Infinity;\n  for (var i = 0, aryLen = ary.length; i < aryLen; ++i) {\n    var value = ary[i];\n    if (value != null && value > max) {\n      max = value;\n    }\n  }\n  return max;\n};\n\n\n/** @override */\ngoog.ui.ServerChart.prototype.disposeInternal = function() {\n  goog.ui.ServerChart.superClass_.disposeInternal.call(this);\n  delete this.xLabels_;\n  delete this.leftLabels_;\n  delete this.rightLabels_;\n  delete this.gridX_;\n  delete this.gridY_;\n  delete this.setColors_;\n  delete this.setLegendTexts_;\n  delete this.dataSets_;\n  this.uri_ = null;\n  delete this.minValue_;\n  delete this.maxValue_;\n  this.title_ = null;\n  delete this.multiAxisType_;\n  delete this.multiAxisLabelText_;\n  delete this.multiAxisLabelPosition_;\n  delete this.multiAxisRange_;\n  delete this.multiAxisLabelStyle_;\n  this.legend_ = null;\n};\n\n\n/**\n * Event types dispatched by the ServerChart object\n * @enum {string}\n */\ngoog.ui.ServerChart.Event = {\n  /**\n   * Dispatched when the resulting URI reaches or exceeds the URI length limit.\n   */\n  URI_TOO_LONG: 'uritoolong'\n};\n\n\n\n/**\n * Class for the event dispatched on the ServerChart when the resulting URI\n * exceeds the URI length limit.\n * @constructor\n * @param {string} uri The overly-long URI string.\n * @extends {goog.events.Event}\n * @final\n */\ngoog.ui.ServerChart.UriTooLongEvent = function(uri) {\n  goog.events.Event.call(this, goog.ui.ServerChart.Event.URI_TOO_LONG);\n\n  /**\n   * The overly-long URI string.\n   * @type {string}\n   */\n  this.uri = uri;\n};\ngoog.inherits(goog.ui.ServerChart.UriTooLongEvent, goog.events.Event);\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9L","^:=","^<S","^9>","^@B","^;8","^;9","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/serverchart.js"],"^:1",["^9K",["~$goog.ui.ServerChart.EncodingType","~$goog.ui.ServerChart.Event","~$goog.ui.ServerChart.MultiAxisAlignment","~$goog.ui.ServerChart.MaximumValue","~$goog.ui.ServerChart.LegendPosition","~$goog.ui.ServerChart.AxisDisplayType","~$goog.ui.ServerChart.MultiAxisType","~$goog.ui.ServerChart.UriParam","~$goog.ui.ServerChart.ChartType","~$goog.ui.ServerChart.UriTooLongEvent","~$goog.ui.ServerChart"]],"^9<",true,"^9=",["^9>","^<S","^;9","^:E","^;=","^@B","^;8","^9L","^:="]],["^ ","^9A",[1579837703000],"^9B","goog.html.sanitizer.htmlsanitizer.js","^9C",["^9D","goog/html/sanitizer/htmlsanitizer.js"],"^9E","goog/html/sanitizer/htmlsanitizer.js","^9F","^9G","^9H","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview An HTML sanitizer that can satisfy a variety of security\n * policies.\n *\n * This package provides html sanitizing functions. It does not enforce string\n * to string conversion, instead returning a dom-like element when possible.\n *\n * Examples of usage of the static `HtmlSanitizer.sanitize`:\n * <pre>\n *   var safeHtml = HtmlSanitizer.sanitize('<script src=\"xss.js\" />');\n *   goog.dom.safe.setInnerHtml(el, safeHtml);\n * </pre>\n *\n * @supported IE 10+, Chrome 26+, Firefox 22+, Safari 7.1+, Opera 15+\n */\n\ngoog.provide('goog.html.sanitizer.HtmlSanitizer');\ngoog.provide('goog.html.sanitizer.HtmlSanitizer.Builder');\ngoog.provide('goog.html.sanitizer.HtmlSanitizerAttributePolicy');\ngoog.provide('goog.html.sanitizer.HtmlSanitizerPolicy');\ngoog.provide('goog.html.sanitizer.HtmlSanitizerPolicyContext');\ngoog.provide('goog.html.sanitizer.HtmlSanitizerPolicyHints');\ngoog.provide('goog.html.sanitizer.HtmlSanitizerUrlPolicy');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.functions');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.SafeStyle');\ngoog.require('goog.html.SafeStyleSheet');\ngoog.require('goog.html.SafeUrl');\ngoog.require('goog.html.sanitizer.AttributeSanitizedWhitelist');\ngoog.require('goog.html.sanitizer.AttributeWhitelist');\ngoog.require('goog.html.sanitizer.CssSanitizer');\ngoog.require('goog.html.sanitizer.SafeDomTreeProcessor');\ngoog.require('goog.html.sanitizer.TagBlacklist');\ngoog.require('goog.html.sanitizer.TagWhitelist');\ngoog.require('goog.html.sanitizer.noclobber');\ngoog.require('goog.html.uncheckedconversions');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.string.Const');\n\n\n/**\n * Type for optional hints to policy handler functions.\n * @typedef {{\n *     tagName: (string|undefined),\n *     attributeName: (string|undefined),\n *     cssProperty: (string|undefined)\n *     }}\n */\ngoog.html.sanitizer.HtmlSanitizerPolicyHints;\n\n\n/**\n * Type for optional context objects to the policy handler functions.\n * @typedef {{\n *     cssStyle: (?CSSStyleDeclaration|undefined)\n *     }}\n */\ngoog.html.sanitizer.HtmlSanitizerPolicyContext;\n\n\n/**\n * Type for a policy function.\n * @typedef {function(string, goog.html.sanitizer.HtmlSanitizerPolicyHints=,\n *     goog.html.sanitizer.HtmlSanitizerPolicyContext=,\n *     (function(string, ?=, ?=, ?=):?string)=):?string}\n */\ngoog.html.sanitizer.HtmlSanitizerPolicy;\n\n\n/**\n * Type for a URL policy function.\n *\n * @typedef {function(string, !goog.html.sanitizer.HtmlSanitizerPolicyHints=):\n *     ?goog.html.SafeUrl}\n */\ngoog.html.sanitizer.HtmlSanitizerUrlPolicy;\n\n\n/**\n * Type for attribute policy configuration.\n * @typedef {{\n *     tagName: string,\n *     attributeName: string,\n *     policy: ?goog.html.sanitizer.HtmlSanitizerPolicy\n * }}\n */\ngoog.html.sanitizer.HtmlSanitizerAttributePolicy;\n\n\n/**\n * Prefix used by all internal html sanitizer booking properties.\n * @private @const {string}\n */\ngoog.html.sanitizer.HTML_SANITIZER_BOOKKEEPING_PREFIX_ = 'data-sanitizer-';\n\n\n/**\n * Attribute name added to span tags that replace unknown tags. The value of\n * this attribute is the name of the tag before the sanitization occurred.\n * @private @const {string}\n */\ngoog.html.sanitizer.HTML_SANITIZER_SANITIZED_ATTR_NAME_ =\n    goog.html.sanitizer.HTML_SANITIZER_BOOKKEEPING_PREFIX_ + 'original-tag';\n\n/**\n * A list of tags that contain '-' but are invalid custom element tags.\n * @private @const @dict {boolean}\n */\ngoog.html.sanitizer.HTML_SANITIZER_INVALID_CUSTOM_TAGS_ = {\n  'ANNOTATION-XML': true,\n  'COLOR-PROFILE': true,\n  'FONT-FACE': true,\n  'FONT-FACE-SRC': true,\n  'FONT-FACE-URI': true,\n  'FONT-FACE-FORMAT': true,\n  'FONT-FACE-NAME': true,\n  'MISSING-GLYPH': true,\n};\n\n\n/**\n * Special value for the STYLE container ID, which makes the sanitizer choose\n * a new random ID on each call to {@link sanitize}.\n * @private @const {string}\n */\ngoog.html.sanitizer.RANDOM_CONTAINER_ = '*';\n\n\n\n/**\n * Creates an HTML sanitizer.\n * @param {!goog.html.sanitizer.HtmlSanitizer.Builder=} opt_builder\n * @final @constructor @struct\n * @extends {goog.html.sanitizer.SafeDomTreeProcessor}\n */\ngoog.html.sanitizer.HtmlSanitizer = function(opt_builder) {\n  goog.html.sanitizer.SafeDomTreeProcessor.call(this);\n\n  var builder = opt_builder || new goog.html.sanitizer.HtmlSanitizer.Builder();\n\n  builder.installPolicies_();\n\n  /**\n   * @private @const {!Object<string, !goog.html.sanitizer.HtmlSanitizerPolicy>}\n   */\n  this.attributeHandlers_ = goog.object.clone(builder.attributeWhitelist_);\n\n  /** @private @const {!Object<string, boolean>} */\n  this.tagBlacklist_ = goog.object.clone(builder.tagBlacklist_);\n\n  /** @private @const {!Object<string, boolean>} */\n  this.tagWhitelist_ = goog.object.clone(builder.tagWhitelist_);\n\n  /** @private @const {boolean} */\n  this.shouldAddOriginalTagNames_ = builder.shouldAddOriginalTagNames_;\n\n  // Add whitelist data-* attributes from the builder to the attributeHandlers\n  // with a default cleanUpAttribute function. data-* attributes are inert as\n  // per HTML5 specs, so not much sanitization needed.\n  goog.array.forEach(builder.dataAttributeWhitelist_, function(dataAttr) {\n    if (!goog.string.startsWith(dataAttr, 'data-')) {\n      throw new goog.asserts.AssertionError(\n          'Only \"data-\" attributes allowed, got: %s.', [dataAttr]);\n    }\n    if (goog.string.startsWith(\n            dataAttr, goog.html.sanitizer.HTML_SANITIZER_BOOKKEEPING_PREFIX_)) {\n      throw new goog.asserts.AssertionError(\n          'Attributes with \"%s\" prefix are not allowed, got: %s.',\n          [goog.html.sanitizer.HTML_SANITIZER_BOOKKEEPING_PREFIX_, dataAttr]);\n    }\n\n    this.attributeHandlers_['* ' + dataAttr.toUpperCase()] =\n        /** @type {!goog.html.sanitizer.HtmlSanitizerPolicy} */ (\n            goog.html.sanitizer.HtmlSanitizer.cleanUpAttribute_);\n  }, this);\n\n  // Add whitelist custom element tags, ensures that they contains at least one\n  // '-' and that they are not part of the reserved names.\n  goog.array.forEach(builder.customElementTagWhitelist_, function(customTag) {\n    customTag = customTag.toUpperCase();\n\n    if (!goog.string.contains(customTag, '-') ||\n        goog.html.sanitizer.HTML_SANITIZER_INVALID_CUSTOM_TAGS_[customTag]) {\n      throw new goog.asserts.AssertionError(\n          'Only valid custom element tag names allowed, got: %s.', [customTag]);\n    }\n\n    this.tagWhitelist_[customTag] = true;\n  }, this);\n\n  /** @private @const {!goog.html.sanitizer.HtmlSanitizerUrlPolicy} */\n  this.networkRequestUrlPolicy_ = builder.networkRequestUrlPolicy_;\n\n  /** @private @const {?string} */\n  this.styleContainerId_ = builder.styleContainerId_;\n\n  /** @private {?string} */\n  this.currentStyleContainerId_ = null;\n\n  /** @private @const {boolean} */\n  this.inlineStyleRules_ = builder.inlineStyleRules_;\n};\ngoog.inherits(\n    goog.html.sanitizer.HtmlSanitizer,\n    goog.html.sanitizer.SafeDomTreeProcessor);\n\n\n/**\n * Transforms a {@link HtmlSanitizerUrlPolicy} into a\n * {@link HtmlSanitizerPolicy} by returning a wrapper that calls the {@link\n * HtmlSanitizerUrlPolicy} with the required arguments and unwraps the returned\n * {@link SafeUrl}. This is necessary because internally the sanitizer works\n * with {@HtmlSanitizerPolicy} to sanitize attributes, but its public API must\n * use {@HtmlSanitizerUrlPolicy} to ensure that callers do not violate SafeHtml\n * invariants in their custom handlers.\n * @param {!goog.html.sanitizer.HtmlSanitizerUrlPolicy} urlPolicy\n * @return {!goog.html.sanitizer.HtmlSanitizerPolicy}\n * @private\n */\ngoog.html.sanitizer.HtmlSanitizer.wrapUrlPolicy_ = function(urlPolicy) {\n  return /** @type {!goog.html.sanitizer.HtmlSanitizerPolicy} */ (function(\n      url, policyHints) {\n    var trimmed = goog.html.sanitizer.HtmlSanitizer.cleanUpAttribute_(url);\n    var safeUrl = urlPolicy(trimmed, policyHints);\n    if (safeUrl &&\n        goog.html.SafeUrl.unwrap(safeUrl) !=\n            goog.html.SafeUrl.INNOCUOUS_STRING) {\n      return goog.html.SafeUrl.unwrap(safeUrl);\n    } else {\n      return null;\n    }\n  });\n};\n\n\n\n/**\n * The builder for the HTML Sanitizer. All methods except build return\n * `this`.\n * @final @constructor @struct\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder = function() {\n  /**\n   * A set of attribute sanitization functions. Default built-in handlers are\n   * all tag-agnostic by design. Note that some attributes behave differently\n   * when attached to different nodes (for example, the href attribute will\n   * generally not make a network request, but &lt;link href=\"\"&gt; does), and\n   * so when necessary a tag-specific handler can be used to override a\n   * tag-agnostic one.\n   * @private {!Object<string, !goog.html.sanitizer.HtmlSanitizerPolicy>}\n   */\n  this.attributeWhitelist_ = {};\n  goog.array.forEach(\n      [\n        goog.html.sanitizer.AttributeWhitelist,\n        goog.html.sanitizer.AttributeSanitizedWhitelist\n      ],\n      function(wl) {\n        goog.array.forEach(goog.object.getKeys(wl), function(attr) {\n          this.attributeWhitelist_[attr] =\n              /** @type {!goog.html.sanitizer.HtmlSanitizerPolicy} */\n              (goog.html.sanitizer.HtmlSanitizer.cleanUpAttribute_);\n        }, this);\n      },\n      this);\n\n  /**\n   * A set of attribute handlers that should not inherit their default policy\n   * during build().\n   * @private @const {!Object<string, boolean>}\n   */\n  this.attributeOverrideList_ = {};\n\n  /**\n   * List of data attributes to whitelist. Data-attributes are inert and don't\n   * require sanitization.\n   * @private @const {!Array<string>}\n   */\n  this.dataAttributeWhitelist_ = [];\n\n  /**\n   * List of custom element tags to whitelist. Custom elements are inert on\n   * their own and require code to actually be dangerous, so the risk is similar\n   * to data-attributes.\n   * @private @const {!Array<string>}\n   */\n  this.customElementTagWhitelist_ = [];\n\n  /**\n   * A tag blacklist, to effectively remove an element and its children from the\n   * dom.\n   * @private @const {!Object<string, boolean>}\n   */\n  this.tagBlacklist_ = goog.object.clone(goog.html.sanitizer.TagBlacklist);\n\n  /**\n   * A tag whitelist, to effectively allow an element and its children from the\n   * dom.\n   * @private {!Object<string, boolean>}\n   */\n  this.tagWhitelist_ = goog.object.clone(goog.html.sanitizer.TagWhitelist);\n\n  /**\n   * Whether non-whitelisted and non-blacklisted tags that have been converted\n   * to &lt;span&rt; tags will contain the original tag in a data attribute.\n   * @private {boolean}\n   */\n  this.shouldAddOriginalTagNames_ = false;\n\n  /**\n   * A function to be applied to URLs found on the parsing process which do not\n   * trigger requests.\n   * @private {!goog.html.sanitizer.HtmlSanitizerUrlPolicy}\n   */\n  this.urlPolicy_ = goog.html.sanitizer.HtmlSanitizer.defaultUrlPolicy_;\n\n  /**\n   * A function to be applied to urls found on the parsing process which may\n   * trigger requests.\n   * @private {!goog.html.sanitizer.HtmlSanitizerUrlPolicy}\n   */\n  this.networkRequestUrlPolicy_ =\n      goog.html.sanitizer.HtmlSanitizer.defaultNetworkRequestUrlPolicy_;\n\n  /**\n   * A function to be applied to names found on the parsing process.\n   * @private {!goog.html.sanitizer.HtmlSanitizerPolicy}\n   */\n  this.namePolicy_ = goog.html.sanitizer.HtmlSanitizer.defaultNamePolicy_;\n\n  /**\n   * A function to be applied to other tokens (i.e. classes and IDs) found on\n   * the parsing process.\n   * @private {!goog.html.sanitizer.HtmlSanitizerPolicy}\n   */\n  this.tokenPolicy_ = goog.html.sanitizer.HtmlSanitizer.defaultTokenPolicy_;\n\n  /**\n   * A function to sanitize inline CSS styles. Defaults to deny all.\n   * @private {function(\n   *     !goog.html.sanitizer.HtmlSanitizerPolicy,\n   *     string,\n   *     !goog.html.sanitizer.HtmlSanitizerPolicyHints,\n   *     !goog.html.sanitizer.HtmlSanitizerPolicyContext):?string}\n   */\n  this.sanitizeInlineCssPolicy_ = goog.functions.NULL;\n\n  /**\n   * An optional ID to restrict the scope of CSS rules when STYLE tags are\n   * allowed.\n   * @private {?string}\n   */\n  this.styleContainerId_ = null;\n\n  /**\n   * Whether rules in STYLE tags should be inlined into style attributes.\n   * @private {boolean}\n   */\n  this.inlineStyleRules_ = false;\n\n  /**\n   * True iff policies have been installed for the instance.\n   * @private {boolean}\n   */\n  this.policiesInstalled_ = false;\n};\n\n\n/**\n * Extends the list of allowed data attributes.\n * @param {!Array<string>} dataAttributeWhitelist\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype.allowDataAttributes =\n    function(dataAttributeWhitelist) {\n  goog.array.extend(this.dataAttributeWhitelist_, dataAttributeWhitelist);\n  return this;\n};\n\n/**\n * Extends the list of allowed custom element tags.\n * @param {!Array<string>} customElementTagWhitelist\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype.allowCustomElementTags =\n    function(customElementTagWhitelist) {\n  goog.array.extend(this.customElementTagWhitelist_, customElementTagWhitelist);\n  return this;\n};\n\n\n/**\n * Allows form tags in the HTML. Without this all form tags and content will be\n * dropped.\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype.allowFormTag = function() {\n  delete this.tagBlacklist_['FORM'];\n  return this;\n};\n\n\n/**\n * Allows STYLE tags. Note that the sanitizer wraps the output of each call to\n * {@link sanitize} with a SPAN tag, give it a random ID unique across multiple\n * calls, and then restrict all CSS rules found inside STYLE tags to only apply\n * to children of the SPAN tag. This means that CSS rules in STYLE tags will\n * only apply to content provided in the same call to {@link sanitize}. This\n * feature is not compatible with {@link inlineStyleRules}.\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype.allowStyleTag = function() {\n  if (this.inlineStyleRules_) {\n    throw new Error('Rules from STYLE tags are already being inlined.');\n  }\n  delete this.tagBlacklist_['STYLE'];\n  this.styleContainerId_ = goog.html.sanitizer.RANDOM_CONTAINER_;\n  return this;\n};\n\n\n/**\n * Fixes the ID of the style container used for CSS rules found in STYLE tags,\n * and disables automatic wrapping with the container. This allows multiple\n * calls to {@link sanitize} to share STYLE rules. If opt_styleContainer is\n * missing, the sanitizer will stop restricting the scope of CSS rules\n * altogether. Requires {@link allowStyleTag} to be called first.\n * @param {string=} opt_styleContainer An optional container ID to restrict the\n *     scope of any CSS rule found in STYLE tags.\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype.withStyleContainer =\n    function(opt_styleContainer) {\n  if ('STYLE' in this.tagBlacklist_) {\n    throw new Error('STYLE tags must first be allowed through allowStyleTag.');\n  }\n  if (opt_styleContainer != undefined) {\n    if (!/^[a-zA-Z][\\w-:\\.]*$/.test(opt_styleContainer)) {\n      throw new Error('Invalid ID.');\n    }\n    this.styleContainerId_ = opt_styleContainer;\n  } else {\n    this.styleContainerId_ = null;\n  }\n  return this;\n};\n\n\n/**\n * Converts rules in STYLE tags into style attributes on the tags they apply to.\n * This feature is not compatible with {@link withStyleContainer} and {@link\n * allowStyleTag}. This method requires {@link allowCssStyles} (otherwise rules\n * would be deleted after being inlined), and is not compatible with {@link\n * allowStyleTag}.\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype.inlineStyleRules =\n    function() {\n  if (this.sanitizeInlineCssPolicy_ == goog.functions.NULL) {\n    throw new Error(\n        'Inlining style rules requires allowing STYLE attributes ' +\n        'first.');\n  }\n  if (!('STYLE' in this.tagBlacklist_)) {\n    throw new Error(\n        'You have already configured the builder to allow STYLE tags in the ' +\n        'output. Inlining style rules would prevent STYLE tags from ' +\n        'appearing in the output and conflict with such directive.');\n  }\n  this.inlineStyleRules_ = true;\n  return this;\n};\n\n\n/**\n * Allows inline CSS styles.\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype.allowCssStyles =\n    function() {\n  this.sanitizeInlineCssPolicy_ =\n      goog.html.sanitizer.HtmlSanitizer.sanitizeCssDeclarationList_;\n  return this;\n};\n\n\n/**\n * Extends the tag whitelist (Package-internal utility method only).\n * @param {!Array<string>} tags The list of tags to be added to the whitelist.\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n * @package\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype\n    .alsoAllowTagsPrivateDoNotAccessOrElse = function(tags) {\n  goog.array.forEach(tags, function(tag) {\n    this.tagWhitelist_[tag.toUpperCase()] = true;\n    delete this.tagBlacklist_[tag.toUpperCase()];\n  }, this);\n  return this;\n};\n\n\n/**\n * Extends the attribute whitelist (Package-internal utility method only).\n * @param {!Array<(string|!goog.html.sanitizer.HtmlSanitizerAttributePolicy)>}\n *     attrs The list of attributes to be added to the whitelist.\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n * @package\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype\n    .alsoAllowAttributesPrivateDoNotAccessOrElse = function(attrs) {\n  goog.array.forEach(attrs, function(attr) {\n    if (typeof attr === 'string') {\n      attr = {tagName: '*', attributeName: attr, policy: null};\n    }\n    var handlerName = goog.html.sanitizer.HtmlSanitizer.attrIdentifier_(\n        attr.tagName, attr.attributeName);\n    this.attributeWhitelist_[handlerName] = attr.policy ?\n        attr.policy :\n        /** @type {!goog.html.sanitizer.HtmlSanitizerPolicy} */ (\n            goog.html.sanitizer.HtmlSanitizer.cleanUpAttribute_);\n    this.attributeOverrideList_[handlerName] = true;\n  }, this);\n  return this;\n};\n\n\n/**\n * Allows only the provided whitelist of tags. Tags still need to be in the\n * TagWhitelist to be allowed.\n * <p>\n * SPAN tags are ALWAYS ALLOWED as part of the mechanism required to preserve\n * the HTML tree structure (when removing non-blacklisted tags and\n * non-whitelisted tags).\n * @param {!Array<string>} tagWhitelist\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n * @throws {Error} Thrown if an attempt is made to allow a non-whitelisted tag.\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype.onlyAllowTags = function(\n    tagWhitelist) {\n  this.tagWhitelist_ = {'SPAN': true};\n  goog.array.forEach(tagWhitelist, function(tag) {\n    tag = tag.toUpperCase();\n    if (goog.html.sanitizer.TagWhitelist[tag]) {\n      this.tagWhitelist_[tag] = true;\n    } else {\n      throw new Error(\n          'Only whitelisted tags can be allowed. See ' +\n          'goog.html.sanitizer.TagWhitelist.');\n    }\n  }, this);\n  return this;\n};\n\n\n/**\n * Allows only the provided whitelist of attributes, possibly setting a custom\n * policy for them. The set of tag/attribute combinations need to be a subset of\n * the currently allowed combinations.\n * <p>\n * Note that you cannot define a generic handler for an attribute if only a\n * tag-specific one is present, and vice versa. To configure the sanitizer to\n * accept an attribute only for a specific tag when only a generic handler is\n * whitelisted, use the goog.html.sanitizer.HtmlSanitizerPolicyHints parameter\n * and simply reject the attribute in unwanted tags.\n * <p>\n * Also note that the sanitizer's policy is still called after the provided one,\n * to ensure that supplying misconfigured policy cannot introduce\n * vulnerabilities. To completely override an existing attribute policy or to\n * allow new attributes, see the goog.html.sanitizer.unsafe package.\n * @param {!Array<(string|!goog.html.sanitizer.HtmlSanitizerAttributePolicy)>}\n *     attrWhitelist The subset of attributes that the sanitizer will accept.\n *     Attributes can come in of two forms:\n *     - string: allow all values for this attribute on all tags.\n *     - HtmlSanitizerAttributePolicy: allows specifying a policy for a\n *         particular tag. The tagName can be \"*\", which means all tags. If no\n *         policy is passed, the default is to allow all values.\n *     The tag and attribute names are case-insensitive.\n *     Note that the policy for id, URLs, names etc is controlled separately\n *     (using withCustom* methods).\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n * @throws {Error} Thrown if an attempt is made to allow a non-whitelisted\n *     attribute.\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype.onlyAllowAttributes =\n    function(attrWhitelist) {\n  var oldWhitelist = this.attributeWhitelist_;\n  this.attributeWhitelist_ = {};\n  goog.array.forEach(attrWhitelist, function(attr) {\n    if (goog.typeOf(attr) === 'string') {\n      attr = {tagName: '*', attributeName: attr.toUpperCase(), policy: null};\n    }\n    var handlerName = goog.html.sanitizer.HtmlSanitizer.attrIdentifier_(\n        attr.tagName, attr.attributeName);\n    if (!oldWhitelist[handlerName]) {\n      throw new Error('Only whitelisted attributes can be allowed.');\n    }\n    this.attributeWhitelist_[handlerName] = attr.policy ?\n        attr.policy :\n        /** @type {goog.html.sanitizer.HtmlSanitizerPolicy} */ (\n            goog.html.sanitizer.HtmlSanitizer.cleanUpAttribute_);\n  }, this);\n  return this;\n};\n\n\n/**\n * Adds the original tag name in the data attribute 'original-tag' when unknown\n * tags are sanitized to &lt;span&rt;, so that caller can distinguish them from\n * actual &lt;span&rt; tags.\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype.addOriginalTagNames =\n    function() {\n  this.shouldAddOriginalTagNames_ = true;\n  return this;\n};\n\n\n/**\n * Sets a custom network URL policy.\n * @param {!goog.html.sanitizer.HtmlSanitizerUrlPolicy}\n *     customNetworkReqUrlPolicy\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype\n    .withCustomNetworkRequestUrlPolicy = function(customNetworkReqUrlPolicy) {\n  this.networkRequestUrlPolicy_ = customNetworkReqUrlPolicy;\n  return this;\n};\n\n\n/**\n * Sets a custom non-network URL policy.\n * @param {!goog.html.sanitizer.HtmlSanitizerUrlPolicy} customUrlPolicy\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype.withCustomUrlPolicy =\n    function(customUrlPolicy) {\n  this.urlPolicy_ = customUrlPolicy;\n  return this;\n};\n\n\n/**\n * Sets a custom name policy.\n * @param {!goog.html.sanitizer.HtmlSanitizerPolicy} customNamePolicy\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype.withCustomNamePolicy =\n    function(customNamePolicy) {\n  this.namePolicy_ = customNamePolicy;\n  return this;\n};\n\n\n/**\n * Sets a custom token policy.\n * @param {!goog.html.sanitizer.HtmlSanitizerPolicy} customTokenPolicy\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype.withCustomTokenPolicy =\n    function(customTokenPolicy) {\n  this.tokenPolicy_ = customTokenPolicy;\n  return this;\n};\n\n\n/**\n * Wraps a custom policy function with the sanitizer's default policy.\n * @param {?goog.html.sanitizer.HtmlSanitizerPolicy} customPolicy The custom\n *     policy for the tag/attribute combination.\n * @param {!goog.html.sanitizer.HtmlSanitizerPolicy} defaultPolicy The\n *     sanitizer's policy that is always called after the custom policy.\n * @return {!goog.html.sanitizer.HtmlSanitizerPolicy}\n * @private\n */\ngoog.html.sanitizer.HtmlSanitizer.wrapPolicy_ = function(\n    customPolicy, defaultPolicy) {\n  return /** @type {!goog.html.sanitizer.HtmlSanitizerPolicy} */ (function(\n      value, hints, ctx, policy) {\n    var result = customPolicy(value, hints, ctx, policy);\n    return result == null ? null : defaultPolicy(result, hints, ctx, policy);\n  });\n};\n\n\n/**\n * Installs the sanitizer's default policy for a specific tag/attribute\n * combination on the provided whitelist, but only if a policy already exists.\n * @param {!Object<string, !goog.html.sanitizer.HtmlSanitizerPolicy>}\n *     whitelist The whitelist to modify.\n * @param {!Object<string, boolean>} overrideList The set of attributes handlers\n *     that should not be wrapped with a default policy.\n * @param {string} key The tag/attribute combination\n * @param {!goog.html.sanitizer.HtmlSanitizerPolicy} defaultPolicy The\n *     sanitizer's policy.\n * @private\n */\ngoog.html.sanitizer.HtmlSanitizer.installDefaultPolicy_ = function(\n    whitelist, overrideList, key, defaultPolicy) {\n  if (whitelist[key] && !overrideList[key]) {\n    whitelist[key] = goog.html.sanitizer.HtmlSanitizer.wrapPolicy_(\n        whitelist[key], defaultPolicy);\n  }\n};\n\n\n/**\n * Builds and returns a goog.html.sanitizer.HtmlSanitizer object.\n * @return {!goog.html.sanitizer.HtmlSanitizer}\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype.build = function() {\n  return new goog.html.sanitizer.HtmlSanitizer(this);\n};\n\n\n/**\n * Installs the sanitization policies for the attributes.\n * May only be called once.\n * @private\n */\ngoog.html.sanitizer.HtmlSanitizer.Builder.prototype.installPolicies_ =\n    function() {\n  if (this.policiesInstalled_) {\n    throw new Error('HtmlSanitizer.Builder.build() can only be used once.');\n  }\n\n  var installPolicy = goog.html.sanitizer.HtmlSanitizer.installDefaultPolicy_;\n\n  // Binding all the non-trivial attribute sanitizers to the appropriate,\n  // potentially customizable, handling functions at build().\n  installPolicy(\n      this.attributeWhitelist_, this.attributeOverrideList_, '* USEMAP',\n      /** @type {!goog.html.sanitizer.HtmlSanitizerPolicy} */ (\n          goog.html.sanitizer.HtmlSanitizer.sanitizeUrlFragment_));\n\n  var urlAttributes = ['* ACTION', '* CITE', '* HREF'];\n  var urlPolicy =\n      goog.html.sanitizer.HtmlSanitizer.wrapUrlPolicy_(this.urlPolicy_);\n  goog.array.forEach(urlAttributes, function(attribute) {\n    installPolicy(\n        this.attributeWhitelist_, this.attributeOverrideList_, attribute,\n        urlPolicy);\n  }, this);\n\n  var networkUrlAttributes = [\n    // LONGDESC can result in a network request. See b/23381636.\n    '* LONGDESC', '* SRC', 'LINK HREF'\n  ];\n  var networkRequestUrlPolicy =\n      goog.html.sanitizer.HtmlSanitizer.wrapUrlPolicy_(\n          this.networkRequestUrlPolicy_);\n  goog.array.forEach(networkUrlAttributes, function(attribute) {\n    installPolicy(\n        this.attributeWhitelist_, this.attributeOverrideList_, attribute,\n        networkRequestUrlPolicy);\n  }, this);\n\n  var nameAttributes = ['* FOR', '* HEADERS', '* NAME'];\n  goog.array.forEach(nameAttributes, function(attribute) {\n    installPolicy(\n        this.attributeWhitelist_, this.attributeOverrideList_, attribute,\n        /** @type {!goog.html.sanitizer.HtmlSanitizerPolicy} */ (goog.partial(\n            goog.html.sanitizer.HtmlSanitizer.sanitizeName_,\n            this.namePolicy_)));\n  }, this);\n\n  installPolicy(\n      this.attributeWhitelist_, this.attributeOverrideList_, 'A TARGET',\n      /** @type {!goog.html.sanitizer.HtmlSanitizerPolicy} */ (goog.partial(\n          goog.html.sanitizer.HtmlSanitizer.allowedAttributeValues_,\n          ['_blank', '_self'])));\n\n  installPolicy(\n      this.attributeWhitelist_, this.attributeOverrideList_, '* CLASS',\n      /** @type {!goog.html.sanitizer.HtmlSanitizerPolicy} */ (goog.partial(\n          goog.html.sanitizer.HtmlSanitizer.sanitizeClasses_,\n          this.tokenPolicy_)));\n\n  installPolicy(\n      this.attributeWhitelist_, this.attributeOverrideList_, '* ID',\n      /** @type {!goog.html.sanitizer.HtmlSanitizerPolicy} */ (goog.partial(\n          goog.html.sanitizer.HtmlSanitizer.sanitizeId_, this.tokenPolicy_)));\n\n  installPolicy(\n      this.attributeWhitelist_, this.attributeOverrideList_, '* STYLE',\n      /** @type {!goog.html.sanitizer.HtmlSanitizerPolicy} */\n      (goog.partial(this.sanitizeInlineCssPolicy_, networkRequestUrlPolicy)));\n\n  this.policiesInstalled_ = true;\n};\n\n\n/**\n * The default policy for URLs: allow any.\n * @private @const {!goog.html.sanitizer.HtmlSanitizerUrlPolicy}\n */\ngoog.html.sanitizer.HtmlSanitizer.defaultUrlPolicy_ =\n    goog.html.SafeUrl.sanitize;\n\n\n/**\n * The default policy for URLs which cause network requests: drop all.\n * @private @const {!goog.html.sanitizer.HtmlSanitizerUrlPolicy}\n */\ngoog.html.sanitizer.HtmlSanitizer.defaultNetworkRequestUrlPolicy_ =\n    goog.functions.NULL;\n\n\n/**\n * The default policy for attribute names: drop all.\n * @private @const {!goog.html.sanitizer.HtmlSanitizerPolicy}\n */\ngoog.html.sanitizer.HtmlSanitizer.defaultNamePolicy_ = goog.functions.NULL;\n\n\n/**\n * The default policy for other tokens (i.e. class names and IDs): drop all.\n * @private @const {!goog.html.sanitizer.HtmlSanitizerPolicy}\n */\ngoog.html.sanitizer.HtmlSanitizer.defaultTokenPolicy_ = goog.functions.NULL;\n\n\n\n/**\n * Returns a key into the attribute handlers dictionary given a node name and\n * an attribute name. If no node name is given, returns a key applying to all\n * nodes.\n * @param {?string} nodeName\n * @param {string} attributeName\n * @return {string} key into attribute handlers dict\n * @private\n */\ngoog.html.sanitizer.HtmlSanitizer.attrIdentifier_ = function(\n    nodeName, attributeName) {\n  if (!nodeName) {\n    nodeName = '*';\n  }\n  return (nodeName + ' ' + attributeName).toUpperCase();\n};\n\n\n/**\n * Sanitizes a list of CSS declarations.\n * @param {goog.html.sanitizer.HtmlSanitizerPolicy} policySanitizeUrl\n * @param {string} attrValue\n * @param {goog.html.sanitizer.HtmlSanitizerPolicyHints} policyHints\n * @param {goog.html.sanitizer.HtmlSanitizerPolicyContext} policyContext\n * @return {?string} sanitizedCss from the policyContext\n * @private\n */\ngoog.html.sanitizer.HtmlSanitizer.sanitizeCssDeclarationList_ = function(\n    policySanitizeUrl, attrValue, policyHints, policyContext) {\n  if (!policyContext.cssStyle) {\n    return null;\n  }\n  var naiveUriRewriter = function(uri, prop) {\n    policyHints.cssProperty = prop;\n    var sanitizedUrl = policySanitizeUrl(uri, policyHints);\n    if (sanitizedUrl == null) {\n      return null;\n    }\n    return goog.html.uncheckedconversions\n        .safeUrlFromStringKnownToSatisfyTypeContract(\n            goog.string.Const.from(\n                'HtmlSanitizerPolicy created with networkRequestUrlPolicy_ ' +\n                'when installing \\'* STYLE\\' handler.'),\n            sanitizedUrl);\n  };\n  var sanitizedStyle = goog.html.SafeStyle.unwrap(\n      goog.html.sanitizer.CssSanitizer.sanitizeInlineStyle(\n          policyContext.cssStyle, naiveUriRewriter));\n  return sanitizedStyle == '' ? null : sanitizedStyle;\n};\n\n\n/**\n * Cleans up an attribute value that we don't particularly want to do anything\n * to. At the moment we just trim the whitespace.\n * @param {string} attrValue\n * @return {string} sanitizedAttrValue\n * @private\n */\ngoog.html.sanitizer.HtmlSanitizer.cleanUpAttribute_ = function(attrValue) {\n  return goog.string.trim(attrValue);\n};\n\n\n/**\n * Allows a set of attribute values.\n * @param {!Array<string>} allowedValues Set of allowed values lowercased.\n * @param {string} attrValue\n * @param {goog.html.sanitizer.HtmlSanitizerPolicyHints} policyHints\n * @return {?string} sanitizedAttrValue\n * @private\n */\ngoog.html.sanitizer.HtmlSanitizer.allowedAttributeValues_ = function(\n    allowedValues, attrValue, policyHints) {\n  var trimmed = goog.string.trim(attrValue);\n  return goog.array.contains(allowedValues, trimmed.toLowerCase()) ? trimmed :\n                                                                     null;\n};\n\n\n/**\n * Sanitizes URL fragments.\n * @param {string} urlFragment\n * @param {goog.html.sanitizer.HtmlSanitizerPolicyHints} policyHints\n * @return {?string} sanitizedAttrValue\n * @private\n */\ngoog.html.sanitizer.HtmlSanitizer.sanitizeUrlFragment_ = function(\n    urlFragment, policyHints) {\n  var trimmed = goog.string.trim(urlFragment);\n  if (trimmed && trimmed.charAt(0) == '#') {\n    // We do not apply the name or token policy to Url Fragments by design.\n    return trimmed;\n  }\n  return null;\n};\n\n\n/**\n * Runs an attribute name through a name policy.\n * @param {goog.html.sanitizer.HtmlSanitizerPolicy} namePolicy\n * @param {string} attrName\n * @param {goog.html.sanitizer.HtmlSanitizerPolicyHints} policyHints\n * @return {?string} sanitizedAttrValue\n * @private\n */\ngoog.html.sanitizer.HtmlSanitizer.sanitizeName_ = function(\n    namePolicy, attrName, policyHints) {\n  var trimmed = goog.string.trim(attrName);\n  /* NOTE(user):\n   * There are two cases to be concerned about - escaped quotes in attribute\n   * values which is the responsibility of the serializer and illegal\n   * characters.  The latter does violate the spec but I do not believe it has\n   * a security consequence.\n   */\n  return namePolicy(trimmed, policyHints);\n};\n\n\n/**\n * Ensures that the class prefix is present on all space-separated tokens\n * (i.e. all class names).\n * @param {goog.html.sanitizer.HtmlSanitizerPolicy} tokenPolicy\n * @param {string} attrValue\n * @param {goog.html.sanitizer.HtmlSanitizerPolicyHints} policyHints\n * @return {?string} sanitizedAttrValue\n * @private\n */\ngoog.html.sanitizer.HtmlSanitizer.sanitizeClasses_ = function(\n    tokenPolicy, attrValue, policyHints) {\n  var classes = attrValue.split(/(?:\\s+)/);\n  var sanitizedClasses = [];\n  for (var i = 0; i < classes.length; i++) {\n    var sanitizedClass = tokenPolicy(classes[i], policyHints);\n    if (sanitizedClass) {\n      sanitizedClasses.push(sanitizedClass);\n    }\n  }\n  return sanitizedClasses.length == 0 ? null : sanitizedClasses.join(' ');\n};\n\n\n/**\n * Ensures that the id prefix is present.\n * @param {goog.html.sanitizer.HtmlSanitizerPolicy} tokenPolicy\n * @param {string} attrValue\n * @param {goog.html.sanitizer.HtmlSanitizerPolicyHints} policyHints\n * @return {?string} sanitizedAttrValue\n * @private\n */\ngoog.html.sanitizer.HtmlSanitizer.sanitizeId_ = function(\n    tokenPolicy, attrValue, policyHints) {\n  var trimmed = goog.string.trim(attrValue);\n  return tokenPolicy(trimmed, policyHints);\n};\n\n\n/**\n * Retrieves a HtmlSanitizerPolicyContext from a dirty node given an attribute\n * name.\n * @param {string} attributeName\n * @param {!Element} dirtyElement\n * @return {!goog.html.sanitizer.HtmlSanitizerPolicyContext}\n * @private\n */\ngoog.html.sanitizer.HtmlSanitizer.getContext_ = function(\n    attributeName, dirtyElement) {\n  var policyContext = {cssStyle: undefined};\n  if (attributeName == 'style') {\n    policyContext.cssStyle =\n        goog.html.sanitizer.noclobber.getElementStyle(dirtyElement);\n  }\n  return policyContext;\n};\n\n\n/**\n * Parses the DOM tree of a given HTML string, then walks the tree. For each\n * element, it creates a new sanitized version, applies sanitized attributes,\n * and returns a SafeHtml object representing the sanitized tree.\n * @param {string} unsanitizedHtml\n * @return {!goog.html.SafeHtml} Sanitized HTML\n */\ngoog.html.sanitizer.HtmlSanitizer.prototype.sanitize = function(\n    unsanitizedHtml) {\n  this.currentStyleContainerId_ = this.getStyleContainerId_();\n  var sanitizedString = this.processToString(unsanitizedHtml);\n  return goog.html.uncheckedconversions\n      .safeHtmlFromStringKnownToSatisfyTypeContract(\n          goog.string.Const.from('Output of HTML sanitizer'), sanitizedString);\n};\n\n\n/**\n * Parses the DOM tree of a given HTML string, then walks the tree. For each\n * element, it creates a new sanitized version, applies sanitized attributes,\n * and returns a span element containing the sanitized content. The root element\n * might define a class name to restrict the visibility of CSS rules contained\n * in tree.\n * @param {string} unsanitizedHtml\n * @return {!HTMLSpanElement} Sanitized HTML\n */\ngoog.html.sanitizer.HtmlSanitizer.prototype.sanitizeToDomNode = function(\n    unsanitizedHtml) {\n  this.currentStyleContainerId_ = this.getStyleContainerId_();\n  return goog.html.sanitizer.SafeDomTreeProcessor.prototype.processToTree.call(\n      this, unsanitizedHtml);\n};\n\n\n/** @override */\ngoog.html.sanitizer.HtmlSanitizer.prototype.processRoot = function(newRoot) {\n  // If the container ID was manually specified, we let the caller add the\n  // ancestor to activate the rules.\n  if (this.currentStyleContainerId_ &&\n      this.styleContainerId_ == goog.html.sanitizer.RANDOM_CONTAINER_) {\n    newRoot.id = this.currentStyleContainerId_;\n  }\n};\n\n\n/** @override */\ngoog.html.sanitizer.HtmlSanitizer.prototype.preProcessHtml = function(\n    unsanitizedHtml) {\n  if (!this.inlineStyleRules_) {\n    return unsanitizedHtml;\n  }\n  // Inline style rules on the unsanitized input, so that we don't have to\n  // worry about customTokenPolicy and customNamePolicy interferring with\n  // selectors.\n  // TODO(pelizzi): To generate an inert document tree to walk on, we are going\n  // to parse the document into a DOM tree twice --\n  // first with DOMParser here, and then by setting innerHTML on a new TEMPLATE\n  // element in the main sanitization loop (see getDomTreeWalker in\n  // safedomtreeprocessor.js). It would be best if we used one technique\n  // consistently, parsing the input string once and passing a single inert tree\n  // from one phase to another, but the decision to use TEMPLATE rather than\n  // DomParser or document.createHtmlImplementation as the inert HTML container\n  // for the main sanitization logic predates the work on supporting STYLE tags,\n  // and we later found on that TEMPLATE inert documents do not have computed\n  // stylesheet information on STYLE tags.\n  var inertUnsanitizedDom =\n      goog.html.sanitizer.CssSanitizer.safeParseHtmlAndGetInertElement(\n          '<div>' + unsanitizedHtml + '</div>');\n  goog.asserts.assert(\n      inertUnsanitizedDom,\n      'Older browsers that don\\'t support inert ' +\n          'parsing should not get to this branch');\n  goog.html.sanitizer.CssSanitizer.inlineStyleRules(inertUnsanitizedDom);\n  return inertUnsanitizedDom.innerHTML;\n};\n\n\n/**\n * Gets the style container ID for the sanitized output, or creates a new random\n * one. If no style container is necessary or style containment is disabled,\n * returns null.\n * @return {?string}\n * @private\n */\ngoog.html.sanitizer.HtmlSanitizer.prototype.getStyleContainerId_ = function() {\n  var randomStyleContainmentEnabled =\n      this.styleContainerId_ == goog.html.sanitizer.RANDOM_CONTAINER_;\n  var randomStyleContainmentNecessary =\n      !('STYLE' in this.tagBlacklist_) && 'STYLE' in this.tagWhitelist_;\n  // If the builder was configured to create a random unique ID, create one, but\n  // do so only if STYLE is allowed to begin with.\n  return randomStyleContainmentEnabled && randomStyleContainmentNecessary ?\n      'sanitizer-' + goog.string.getRandomString() :\n      this.styleContainerId_;\n};\n\n\n/** @override */\ngoog.html.sanitizer.HtmlSanitizer.prototype.createTextNode = function(\n    dirtyNode) {\n  // Text nodes don't need to be sanitized, unless they are children of STYLE\n  // and STYLE tags are allowed.\n  var textContent = dirtyNode.data;\n  // If STYLE is allowed, apply a policy to its text content. Ideally\n  // sanitizing text content of tags shouldn't be hardcoded for STYLE, but we\n  // have no plans to support sanitizing the text content of other nodes for\n  // now.\n  var dirtyParent = goog.html.sanitizer.noclobber.getParentNode(dirtyNode);\n  if (dirtyParent &&\n      goog.html.sanitizer.noclobber.getNodeName(dirtyParent).toLowerCase() ==\n          'style' &&\n      !('STYLE' in this.tagBlacklist_) && 'STYLE' in this.tagWhitelist_) {\n    // Note that we don't have access to the parsed CSS declarations inside a\n    // TEMPLATE tag, so the CSS sanitizer accepts a string and parses it\n    // on its own using DOMParser.\n    textContent = goog.html.SafeStyleSheet.unwrap(\n        goog.html.sanitizer.CssSanitizer.sanitizeStyleSheetString(\n            textContent, this.currentStyleContainerId_,\n            goog.bind(function(uri, propName) {\n              return this.networkRequestUrlPolicy_(\n                  uri, {cssProperty: propName});\n            }, this)));\n  }\n  return document.createTextNode(textContent);\n};\n\n\n/** @override */\ngoog.html.sanitizer.HtmlSanitizer.prototype.createElementWithoutAttributes =\n    function(dirtyElement) {\n  var dirtyName =\n      goog.html.sanitizer.noclobber.getNodeName(dirtyElement).toUpperCase();\n  if (dirtyName in this.tagBlacklist_) {\n    // If it's blacklisted, completely remove the tag and its descendants.\n    return null;\n  }\n  if (this.tagWhitelist_[dirtyName]) {\n    // If it's whitelisted, keep as is.\n    return document.createElement(dirtyName);\n  }\n  // If it's neither blacklisted nor whitelisted, replace with span. If the\n  // relevant builder option is enabled, the tag will bear the original tag\n  // name in a data attribute.\n  var spanElement = goog.dom.createElement(goog.dom.TagName.SPAN);\n  if (this.shouldAddOriginalTagNames_) {\n    goog.html.sanitizer.noclobber.setElementAttribute(\n        spanElement, goog.html.sanitizer.HTML_SANITIZER_SANITIZED_ATTR_NAME_,\n        dirtyName.toLowerCase());\n  }\n  return spanElement;\n};\n\n\n/** @override */\ngoog.html.sanitizer.HtmlSanitizer.prototype.processElementAttribute = function(\n    dirtyElement, attribute) {\n  var attributeName = attribute.name;\n  if (goog.string.startsWith(\n          attributeName,\n          goog.html.sanitizer.HTML_SANITIZER_BOOKKEEPING_PREFIX_)) {\n    // This is the namespace for the data attributes added by the sanitizer. We\n    // prevent untrusted content from setting them in the output.\n    return null;\n  }\n\n  var elementName = goog.html.sanitizer.noclobber.getNodeName(dirtyElement);\n  var unsanitizedAttrValue = attribute.value;\n\n  // Create policy hints object\n  var policyHints = {\n    tagName: goog.string.trim(elementName).toLowerCase(),\n    attributeName: goog.string.trim(attributeName).toLowerCase()\n  };\n  var policyContext = goog.html.sanitizer.HtmlSanitizer.getContext_(\n      policyHints.attributeName, dirtyElement);\n\n  // Prefer attribute handler for this specific tag.\n  var tagHandlerIndex = goog.html.sanitizer.HtmlSanitizer.attrIdentifier_(\n      elementName, attributeName);\n  if (tagHandlerIndex in this.attributeHandlers_) {\n    var handler = this.attributeHandlers_[tagHandlerIndex];\n    return handler(unsanitizedAttrValue, policyHints, policyContext);\n  }\n  // Fall back on attribute handler for wildcard tag.\n  var genericHandlerIndex =\n      goog.html.sanitizer.HtmlSanitizer.attrIdentifier_(null, attributeName);\n  if (genericHandlerIndex in this.attributeHandlers_) {\n    var handler = this.attributeHandlers_[genericHandlerIndex];\n    return handler(unsanitizedAttrValue, policyHints, policyContext);\n  }\n  return null;\n};\n\n\n/**\n * Sanitizes a HTML string using a sanitizer with default options.\n * @param {string} unsanitizedHtml\n * @return {!goog.html.SafeHtml} sanitizedHtml\n */\ngoog.html.sanitizer.HtmlSanitizer.sanitize = function(unsanitizedHtml) {\n  var sanitizer = new goog.html.sanitizer.HtmlSanitizer.Builder().build();\n  return sanitizer.sanitize(unsanitizedHtml);\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^;<","^GR","^;6","^9L","^9>","^;P","^@=","~$goog.html.sanitizer.SafeDomTreeProcessor","^;7","^=M","~$goog.html.sanitizer.TagBlacklist","^G3","~$goog.html.sanitizer.TagWhitelist","~$goog.html.sanitizer.noclobber","^GW","^;9","^@C","^;=","~$goog.html.sanitizer.CssSanitizer"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/sanitizer/htmlsanitizer.js"],"^:1",["^9K",["~$goog.html.sanitizer.HtmlSanitizerUrlPolicy","~$goog.html.sanitizer.HtmlSanitizerPolicyHints","~$goog.html.sanitizer.HtmlSanitizer","~$goog.html.sanitizer.HtmlSanitizer.Builder","~$goog.html.sanitizer.HtmlSanitizerPolicy","~$goog.html.sanitizer.HtmlSanitizerAttributePolicy","~$goog.html.sanitizer.HtmlSanitizerPolicyContext"]],"^9<",true,"^9=",["^9>","^;9","^:E","^;;","^;=","^;<","^@C","^G3","^GW","^GR","^;6","^;7","^M4","^M0","^M1","^M2","^M3","^@=","^;P","^9L","^=M"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.i18n.dateintervalsymbolsext.js","^9C",["^9D","goog/i18n/dateintervalsymbolsext.js"],"^9E","goog/i18n/dateintervalsymbolsext.js","^9F","^9G","^9H","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Date interval formatting symbols for all locales.\n *\n * File generated from CLDR ver. 35.1\n *\n * This file covers those locales that are not covered in\n * \"dateintervalsymbols.js\".\n */\n\n// clang-format off\n\ngoog.module('goog.i18n.dateIntervalSymbolsExt');\n\nvar dateIntervalSymbols = goog.require('goog.i18n.dateIntervalSymbols');\n\n/** @type {!dateIntervalSymbols.DateIntervalSymbols} */\nvar defaultSymbols;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_af_NA = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G – EEEE d MMMM y G',\n    'Md': 'EEEE d MMMM – EEEE d MMMM y',\n    'y': 'EEEE d MMMM y – EEEE d MMMM y',\n    '_': 'EEEE dd MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'y-M-d GGGGG – y-M-d GGGGG',\n    'Mdy': 'd/M/y – d/M/y',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE dd MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'y-MM-dd h:mm a – h:mm a',\n    'hm': 'y-MM-dd h:mm – h:mm a',\n    '_': 'y-MM-dd h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_af_ZA = dateIntervalSymbols.DateIntervalSymbols_af;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_agq = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_agq_CM = exports.DateIntervalSymbols_agq;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ak = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, y MMMM dd'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'yy/MM/dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y/M/d h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y/M/d h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y/M/d h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y/M/d h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, y MMMM dd h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'yy/MM/dd h:mm a – h:mm a',\n    'hm': 'yy/MM/dd h:mm–h:mm a',\n    '_': 'yy/MM/dd h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ak_GH = exports.DateIntervalSymbols_ak;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_am_ET = dateIntervalSymbols.DateIntervalSymbols_am;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_001 = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_AE = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_BH = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_DJ = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_EH = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_ER = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_IL = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE، d MMMM – EEEE، d MMMM، y',\n    'd': 'EEEE، d – EEEE، d MMMM، y',\n    'y': 'EEEE، d MMMM، y – EEEE، d MMMM، y',\n    '_': 'EEEE، d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM، y',\n    'd': 'd–d MMMM، y',\n    'y': 'd MMMM، y – d MMMM، y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd‏/M‏/y – d‏/M‏/y',\n    '_': 'dd‏/MM‏/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'd‏/M‏/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd‏/M‏/y H:mm:ss zzzz',\n    '_': 'H:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd‏/M‏/y H:mm:ss z',\n    '_': 'H:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd‏/M‏/y H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd‏/M‏/y H:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE، d MMMM y H:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y H:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd‏/MM‏/y H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd‏/M‏/y HH:mm–HH:mm',\n    '_': 'd‏/M‏/y H:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_IQ = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_JO = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_KM = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE، d MMMM – EEEE، d MMMM، y',\n    'd': 'EEEE، d – EEEE، d MMMM، y',\n    'y': 'EEEE، d MMMM، y – EEEE، d MMMM، y',\n    '_': 'EEEE، d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM، y',\n    'd': 'd–d MMMM، y',\n    'y': 'd MMMM، y – d MMMM، y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd‏/M‏/y – d‏/M‏/y',\n    '_': 'dd‏/MM‏/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'd‏/M‏/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd‏/M‏/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd‏/M‏/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd‏/M‏/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd‏/M‏/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE، d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd‏/MM‏/y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd‏/M‏/y HH:mm–HH:mm',\n    '_': 'd‏/M‏/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_KW = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_LB = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_LY = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_MA = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE، d MMMM – EEEE، d MMMM، y',\n    'd': 'EEEE، d – EEEE، d MMMM، y',\n    'y': 'EEEE، d MMMM، y – EEEE، d MMMM، y',\n    '_': 'EEEE، d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM، y',\n    'd': 'd–d MMMM، y',\n    'y': 'd MMMM، y – d MMMM، y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd‏/M‏/y – d‏/M‏/y',\n    '_': 'dd‏/MM‏/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'd‏/M‏/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd‏/M‏/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd‏/M‏/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd‏/M‏/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd‏/M‏/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE، d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd‏/MM‏/y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd‏/M‏/y HH:mm–HH:mm',\n    '_': 'd‏/M‏/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_MR = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_OM = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_PS = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_QA = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_SA = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_SD = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_SO = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_SS = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_SY = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_TD = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_TN = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_XB = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE، d MMMM – EEEE، d MMMM، y',\n    'd': 'EEEE، d – EEEE، d MMMM، y',\n    'y': 'EEEE، d MMMM، y – EEEE، d MMMM، y',\n    '_': 'EEEE، d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM، y',\n    'd': 'd–d MMMM، y',\n    'y': 'd MMMM، y – d MMMM، y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd‏/M‏/y – d‏/M‏/y',\n    '_': 'dd‏/MM‏/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'd‏/M‏/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd‏/M‏/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd‏/M‏/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd‏/M‏/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd‏/M‏/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE، d MMMM y \\'؜‮at‬؜\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'؜‮at‬؜\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd‏/MM‏/y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd‏/M‏/y h:mm a – h:mm a',\n    'hm': 'd‏/M‏/y h:mm–h:mm a',\n    '_': 'd‏/M‏/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ar_YE = dateIntervalSymbols.DateIntervalSymbols_ar;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_as = {\n  FULL_DATE: {\n    'G': 'G EEEE, d MMMM, y – G EEEE, d MMMM, y',\n    'Md': 'EEEE, d MMMM y – EEEE, d MMMM',\n    'y': 'EEEE, d MMMM y – d MMMM y',\n    '_': 'EEEE, d MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'G d MMMM, y – G d MMMM, y',\n    'M': 'd MMMM y – d MMMM',\n    'd': 'd–d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG d/M/y – GGGGG d/M/y',\n    '_': 'dd-MM-y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG d/M/y – GGGGG d/M/y',\n    'Mdy': 'dd-MM-y – dd-MM-y',\n    '_': 'd-M-y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd-MM-y a h.mm.ss zzzz',\n    '_': 'a h.mm.ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd-MM-y a h.mm.ss z',\n    '_': 'a h.mm.ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd-MM-y a h.mm.ss',\n    '_': 'a h.mm.ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd-MM-y a h.mm',\n    'a': 'a h:mm – a h:mm',\n    'hm': 'a h:mm–h:mm',\n    '_': 'a h.mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM, y a h.mm.ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y a h.mm.ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd-MM-y a h.mm.ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd-MM-y a h:mm – a h:mm',\n    'hm': 'dd-MM-y a h:mm–h:mm',\n    '_': 'd-M-y a h.mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_as_IN = exports.DateIntervalSymbols_as;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_asa = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_asa_TZ = exports.DateIntervalSymbols_asa;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ast = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM \\'de\\' y',\n    '_': 'EEEE, d MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM \\'de\\' y',\n    'd': 'd – d MMMM \\'de\\' y',\n    '_': 'd MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM \\'de\\' y',\n    'd': 'd – d MMM \\'de\\' y',\n    'y': 'd MMM \\'de\\' y – d MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM \\'de\\' y \\'a\\' \\'les\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM \\'de\\' y \\'a\\' \\'les\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy, HH:mm – HH:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ast_ES = exports.DateIntervalSymbols_ast;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_az_Cyrl = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'd MMMM y, EEEE – d MMMM, EEEE',\n    '_': 'd MMMM y, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM y – d MMMM',\n    'd': 'y MMMM d–d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM y – d MMM',\n    'd': 'y MMM d–d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'd MMMM y, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy HH:mm–HH:mm',\n    '_': 'dd.MM.yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_az_Cyrl_AZ = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'd MMMM y, EEEE – d MMMM, EEEE',\n    '_': 'd MMMM y, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM y – d MMMM',\n    'd': 'y MMMM d–d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM y – d MMM',\n    'd': 'y MMM d–d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'd MMMM y, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy HH:mm–HH:mm',\n    '_': 'dd.MM.yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_az_Latn = dateIntervalSymbols.DateIntervalSymbols_az;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_az_Latn_AZ = dateIntervalSymbols.DateIntervalSymbols_az;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bas = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bas_CM = exports.DateIntervalSymbols_bas;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_be_BY = dateIntervalSymbols.DateIntervalSymbols_be;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bem = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y h:mm a – h:mm a',\n    'hm': 'dd/MM/y h:mm–h:mm a',\n    '_': 'dd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bem_ZM = exports.DateIntervalSymbols_bem;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bez = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bez_TZ = exports.DateIntervalSymbols_bez;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bg_BG = dateIntervalSymbols.DateIntervalSymbols_bg;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bm = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bm_ML = exports.DateIntervalSymbols_bm;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bn_BD = dateIntervalSymbols.DateIntervalSymbols_bn;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bn_IN = dateIntervalSymbols.DateIntervalSymbols_bn;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bo = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'y MMMMའི་ཚེས་d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'སྤྱི་ལོ་y MMMMའི་ཚེས་d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'y ལོའི་MMMཚེས་d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMMའི་ཚེས་d, EEEE h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'སྤྱི་ལོ་y MMMMའི་ཚེས་d h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y ལོའི་MMMཚེས་d h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'y-MM-dd h:mm a – h:mm a',\n    'hm': 'y-MM-dd h:mm–h:mm a',\n    '_': 'y-MM-dd h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bo_CN = exports.DateIntervalSymbols_bo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bo_IN = exports.DateIntervalSymbols_bo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_br_FR = dateIntervalSymbols.DateIntervalSymbols_br;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_brx = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, MMMM d, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'M/d/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM d, y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'MMMM d, y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MMM d, y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'M/d/yy h:mm a – h:mm a',\n    'hm': 'M/d/yy h:mm–h:mm a',\n    '_': 'M/d/yy h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_brx_IN = exports.DateIntervalSymbols_brx;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bs_Cyrl = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, dd. MMMM – EEEE, dd. MMMM y.',\n    'd': 'EEEE, dd. – EEEE, dd. MMMM y.',\n    'y': 'EEEE, dd. MMMM y. – EEEE, dd. MMMM y.',\n    '_': 'EEEE, dd. MMMM y.'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'dd. MMMM – dd. MMMM y.',\n    'd': 'dd.–dd. MMMM y.',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'dd. MMMM y.'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd.M.y. – d.M.y.',\n    '_': 'dd.MM.y.'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'd.M.yy. – d.M.yy.',\n    '_': 'd.M.yy.'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y. HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y. HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y. HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y. HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd. MMMM y. HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd. MMMM y. HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd.MM.y. HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy. HH:mm–HH:mm',\n    '_': 'd.M.yy. HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bs_Cyrl_BA = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, dd. MMMM – EEEE, dd. MMMM y.',\n    'd': 'EEEE, dd. – EEEE, dd. MMMM y.',\n    'y': 'EEEE, dd. MMMM y. – EEEE, dd. MMMM y.',\n    '_': 'EEEE, dd. MMMM y.'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'dd. MMMM – dd. MMMM y.',\n    'd': 'dd.–dd. MMMM y.',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'dd. MMMM y.'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd.M.y. – d.M.y.',\n    '_': 'dd.MM.y.'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'd.M.yy. – d.M.yy.',\n    '_': 'd.M.yy.'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y. HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y. HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y. HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y. HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd. MMMM y. HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd. MMMM y. HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd.MM.y. HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy. HH:mm–HH:mm',\n    '_': 'd.M.yy. HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bs_Latn = dateIntervalSymbols.DateIntervalSymbols_bs;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_bs_Latn_BA = dateIntervalSymbols.DateIntervalSymbols_bs;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ca_AD = dateIntervalSymbols.DateIntervalSymbols_ca;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ca_ES = dateIntervalSymbols.DateIntervalSymbols_ca;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ca_FR = dateIntervalSymbols.DateIntervalSymbols_ca;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ca_IT = dateIntervalSymbols.DateIntervalSymbols_ca;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ccp = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM, y',\n    '_': 'EEEE, d MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM, y',\n    'd': 'd–d MMMM, y',\n    '_': 'd MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd–d MMM, y',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM, y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy h:mm a – h:mm a',\n    'hm': 'd/M/yy h:mm–h:mm a',\n    '_': 'd/M/yy h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ccp_BD = exports.DateIntervalSymbols_ccp;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ccp_IN = exports.DateIntervalSymbols_ccp;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ce = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ce_RU = exports.DateIntervalSymbols_ce;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ceb = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, MMMM d, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'M/d/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y, h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM d, y \\'sa\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'MMMM d, y \\'sa\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MMM d, y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'M/d/yy, h:mm a – h:mm a',\n    'hm': 'M/d/yy, h:mm–h:mm a',\n    '_': 'M/d/yy, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ceb_PH = exports.DateIntervalSymbols_ceb;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_cgg = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_cgg_UG = exports.DateIntervalSymbols_cgg;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_chr_US = dateIntervalSymbols.DateIntervalSymbols_chr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ckb = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dی MMMMی y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dی MMMMی y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'y-MM-dd h:mm a – h:mm a',\n    'hm': 'y-MM-dd h:mm–h:mm a',\n    '_': 'y-MM-dd h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ckb_IQ = exports.DateIntervalSymbols_ckb;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ckb_IR = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dی MMMMی y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dی MMMMی y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_cs_CZ = dateIntervalSymbols.DateIntervalSymbols_cs;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_cy_GB = dateIntervalSymbols.DateIntervalSymbols_cy;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_da_DK = dateIntervalSymbols.DateIntervalSymbols_da;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_da_GL = dateIntervalSymbols.DateIntervalSymbols_da;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_dav = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_dav_KE = exports.DateIntervalSymbols_dav;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_de_BE = dateIntervalSymbols.DateIntervalSymbols_de;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_de_DE = dateIntervalSymbols.DateIntervalSymbols_de;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_de_IT = dateIntervalSymbols.DateIntervalSymbols_de;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_de_LI = dateIntervalSymbols.DateIntervalSymbols_de;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_de_LU = dateIntervalSymbols.DateIntervalSymbols_de;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_dje = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_dje_NE = exports.DateIntervalSymbols_dje;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_dsb = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, d. MMMM – EEEE, d. MMMM y',\n    'd': 'EEEE, d. – EEEE, d. MMMM y',\n    '_': 'EEEE, d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd. MMMM – d. MMMM y',\n    'd': 'd. – d. MMMM y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'd.M.y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'd.M.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y H:mm:ss zzzz',\n    '_': 'H:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y H:mm:ss z',\n    '_': 'H:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y H:mm',\n    'ahm': '\\'zeg\\'. H:mm – H:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d. MMMM y H:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y H:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd.M.y H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.M.yy \\'zeg\\'. H:mm – H:mm',\n    '_': 'd.M.yy H:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_dsb_DE = exports.DateIntervalSymbols_dsb;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_dua = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_dua_CM = exports.DateIntervalSymbols_dua;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_dyo = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_dyo_SN = exports.DateIntervalSymbols_dyo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_dz = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Mdy': 'EEEE, y-MM-dd – EEEE, y-MM-dd',\n    '_': 'EEEE, སྤྱི་ལོ་y MMMM ཚེས་dd'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y-MM-dd – MM-d',\n    'd': 'y-MM-d – d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'སྤྱི་ལོ་y MMMM ཚེས་ dd'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y-MM-dd – MM-d',\n    'd': 'y-MM-d – d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'སྤྱི་ལོ་y ཟླ་MMM ཚེས་dd'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'M': 'y-MM-dd – MM-dd',\n    'd': 'y-MM-dd – dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d ཆུ་ཚོད་ h སྐར་མ་ mm:ss a zzzz',\n    '_': 'ཆུ་ཚོད་ h སྐར་མ་ mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d ཆུ་ཚོད་ h སྐར་མ་ mm:ss a z',\n    '_': 'ཆུ་ཚོད་ h སྐར་མ་ mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d ཆུ་ཚོད་h:mm:ss a',\n    '_': 'ཆུ་ཚོད་h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d ཆུ་ཚོད་ h སྐར་མ་ mm a',\n    'a': 'h:mm a – h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'ཆུ་ཚོད་ h སྐར་མ་ mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, སྤྱི་ལོ་y MMMM ཚེས་dd ཆུ་ཚོད་ h སྐར་མ་ mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'སྤྱི་ལོ་y MMMM ཚེས་ dd ཆུ་ཚོད་ h སྐར་མ་ mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'སྤྱི་ལོ་y ཟླ་MMM ཚེས་dd ཆུ་ཚོད་h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'y-MM-dd h:mm a – h:mm a',\n    'hm': 'y-MM-dd h:mm–h:mm a',\n    '_': 'y-MM-dd ཆུ་ཚོད་ h སྐར་མ་ mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_dz_BT = exports.DateIntervalSymbols_dz;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ebu = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ebu_KE = exports.DateIntervalSymbols_ebu;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ee = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, MMMM d \\'lia\\' – EEEE, MMMM d \\'lia\\', y',\n    'y': 'EEEE, MMMM d \\'lia\\', y – EEEE, MMMM d \\'lia\\', y',\n    '_': 'EEEE, MMMM d \\'lia\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'MMMM d \\'lia\\' – MMMM d \\'lia\\', y',\n    'd': 'MMMM d \\'lia\\' – d \\'lia\\' , y',\n    'y': 'MMMM d \\'lia\\' , y – MMMM d \\'lia\\', y',\n    '_': 'MMMM d \\'lia\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'MMM d \\'lia\\' – MMM d \\'lia\\', y',\n    'd': 'MMM d \\'lia\\' – d \\'lia\\' , y',\n    'y': 'MMM d \\'lia\\' , y – MMM d \\'lia\\', y',\n    '_': 'MMM d \\'lia\\', y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'M/d/yy – M/d/yy',\n    '_': 'M/d/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'a \\'ga\\' h:mm:ss zzzz M/d/y',\n    '_': 'a \\'ga\\' h:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'a \\'ga\\' h:mm:ss z M/d/y',\n    '_': 'a \\'ga\\' h:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'a \\'ga\\' h:mm:ss M/d/y',\n    '_': 'a \\'ga\\' h:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'a \\'ga\\' h:mm M/d/y',\n    'a': 'a \\'ga\\' h:mm – a \\'ga\\' h:mm',\n    'h': 'a \\'ga\\' h:mm - \\'ga\\' h:mm',\n    'm': 'a \\'ga\\' h:mm – \\'ga\\' h:mm',\n    '_': 'a \\'ga\\' h:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'a \\'ga\\' h:mm:ss zzzz EEEE, MMMM d \\'lia\\' y'\n  },\n  LONG_DATETIME: {\n    '_': 'a \\'ga\\' h:mm:ss z MMMM d \\'lia\\' y'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'a \\'ga\\' h:mm:ss MMM d \\'lia\\', y'\n  },\n  SHORT_DATETIME: {\n    'a': 'a \\'ga\\' h:mm – a \\'ga\\' h:mm M/d/yy',\n    'h': 'a \\'ga\\' h:mm - \\'ga\\' h:mm M/d/yy',\n    'm': 'a \\'ga\\' h:mm – \\'ga\\' h:mm M/d/yy',\n    '_': 'a \\'ga\\' h:mm M/d/yy'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ee_GH = exports.DateIntervalSymbols_ee;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ee_TG = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, MMMM d \\'lia\\' – EEEE, MMMM d \\'lia\\', y',\n    'y': 'EEEE, MMMM d \\'lia\\', y – EEEE, MMMM d \\'lia\\', y',\n    '_': 'EEEE, MMMM d \\'lia\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'MMMM d \\'lia\\' – MMMM d \\'lia\\', y',\n    'd': 'MMMM d \\'lia\\' – d \\'lia\\' , y',\n    'y': 'MMMM d \\'lia\\' , y – MMMM d \\'lia\\', y',\n    '_': 'MMMM d \\'lia\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'MMM d \\'lia\\' – MMM d \\'lia\\', y',\n    'd': 'MMM d \\'lia\\' – d \\'lia\\' , y',\n    'y': 'MMM d \\'lia\\' , y – MMM d \\'lia\\', y',\n    '_': 'MMM d \\'lia\\', y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'M/d/yy – M/d/yy',\n    '_': 'M/d/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'HH:mm:ss zzzz M/d/y',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'HH:mm:ss z M/d/y',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'HH:mm:ss M/d/y',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'HH:mm M/d/y',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'HH:mm:ss zzzz EEEE, MMMM d \\'lia\\' y'\n  },\n  LONG_DATETIME: {\n    '_': 'HH:mm:ss z MMMM d \\'lia\\' y'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'HH:mm:ss MMM d \\'lia\\', y'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'HH:mm–HH:mm M/d/yy',\n    '_': 'HH:mm M/d/yy'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_el_CY = dateIntervalSymbols.DateIntervalSymbols_el;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_el_GR = dateIntervalSymbols.DateIntervalSymbols_el;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_001 = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_150 = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_AE = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_AG = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_AI = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_AS = dateIntervalSymbols.DateIntervalSymbols_en;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_AT = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_BB = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_BE = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm – HH:mm',\n    '_': 'dd/MM/yy, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_BI = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'Md': 'EEEE, MMMM d – EEEE, MMMM d, y',\n    '_': 'EEEE, MMMM d, y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'MMMM d – MMMM d, y',\n    'd': 'MMMM d – d, y',\n    '_': 'MMMM d, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'MMM d – MMM d, y',\n    'd': 'MMM d – d, y',\n    '_': 'MMM d, y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    '_': 'M/d/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM d, y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'MMMM d, y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MMM d, y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'M/d/yy, HH:mm – HH:mm',\n    '_': 'M/d/yy, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_BM = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_BS = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_BW = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE, dd MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm – HH:mm',\n    '_': 'dd/MM/yy, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_BZ = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE, dd MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd-MMM-y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd-MMM-y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm – HH:mm',\n    '_': 'dd/MM/yy, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_CC = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_CH = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_CK = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_CM = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_CX = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_CY = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_DE = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_DG = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_DK = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH.mm.ss zzzz',\n    '_': 'HH.mm.ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH.mm.ss z',\n    '_': 'HH.mm.ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH.mm.ss',\n    '_': 'HH.mm.ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH.mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH.mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH.mm.ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH.mm.ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH.mm.ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH.mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_DM = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_ER = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_FI = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, H.mm.ss zzzz',\n    '_': 'H.mm.ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, H.mm.ss z',\n    '_': 'H.mm.ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, H.mm.ss',\n    '_': 'H.mm.ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, H.mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'H.mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' H.mm.ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' H.mm.ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, H.mm.ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, H.mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_FJ = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_FK = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_FM = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_GD = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_GG = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_GH = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_GI = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_GM = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_GU = dateIntervalSymbols.DateIntervalSymbols_en;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_GY = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_HK = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/y, h:mm a – h:mm a',\n    'hm': 'd/M/y, h:mm – h:mm a',\n    '_': 'd/M/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_IL = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, H:mm:ss zzzz',\n    '_': 'H:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, H:mm:ss z',\n    '_': 'H:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, H:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' H:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' H:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, H:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_IM = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_IO = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_JE = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_JM = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_KE = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_KI = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_KN = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_KY = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_LC = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_LR = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_LS = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_MG = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_MH = dateIntervalSymbols.DateIntervalSymbols_en;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_MO = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_MP = dateIntervalSymbols.DateIntervalSymbols_en;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_MS = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_MT = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_MU = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_MW = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_MY = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_NA = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_NF = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_NG = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_NL = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_NR = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_NU = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_NZ = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'd/MM/y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    '_': 'd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd/MM/y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/MM/yy, h:mm a – h:mm a',\n    'hm': 'd/MM/yy, h:mm – h:mm a',\n    '_': 'd/MM/yy, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_PG = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_PH = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_PK = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd-MMM-y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd-MMM-y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_PN = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_PR = dateIntervalSymbols.DateIntervalSymbols_en;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_PW = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_RW = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_SB = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_SC = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_SD = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_SE = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd, HH:mm – HH:mm',\n    '_': 'y-MM-dd, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_SH = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_SI = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_SL = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_SS = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_SX = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_SZ = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_TC = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_TK = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_TO = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_TT = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_TV = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_TZ = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_UG = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_UM = dateIntervalSymbols.DateIntervalSymbols_en;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_US_POSIX = dateIntervalSymbols.DateIntervalSymbols_en;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_VC = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_VG = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_VI = dateIntervalSymbols.DateIntervalSymbols_en;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_VU = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_WS = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_XA = {\n  FULL_DATE: {\n    'G': '[EEEE, MMMM d, y G – EEEE, MMMM d, y G]',\n    'Md': '[EEEE, MMMM d – EEEE, MMMM d, y]',\n    'y': '[EEEE, MMMM d, y – EEEE, MMMM d, y]',\n    '_': '[EEEE, MMMM d, y]'\n  },\n  LONG_DATE: {\n    'G': '[MMMM d, y G – MMMM d, y G]',\n    'M': '[MMMM d – MMMM d, y]',\n    'd': '[MMMM d – d, y]',\n    'y': '[MMMM d, y – MMMM d, y]',\n    '_': '[MMMM d, y]'\n  },\n  MEDIUM_DATE: {\n    'G': '[MMM d, y G – MMM d, y G]',\n    'M': '[MMM d – MMM d, y]',\n    'd': '[MMM d – d, y]',\n    'y': '[MMM d, y – MMM d, y]',\n    '_': '[MMM d, y]'\n  },\n  SHORT_DATE: {\n    'G': '[M/d/yy GGGGG – M/d/yy GGGGG]',\n    'Mdy': '[M/d/yy – M/d/yy]',\n    '_': '[M/d/yy]'\n  },\n  FULL_TIME: {\n    'Mdy': '[[M/d/y], [h:mm:ss a zzzz]]',\n    '_': '[h:mm:ss a zzzz]'\n  },\n  LONG_TIME: {\n    'Mdy': '[[M/d/y], [h:mm:ss a z]]',\n    '_': '[h:mm:ss a z]'\n  },\n  MEDIUM_TIME: {\n    'Mdy': '[[M/d/y], [h:mm:ss a]]',\n    '_': '[h:mm:ss a]'\n  },\n  SHORT_TIME: {\n    'Mdy': '[[M/d/y], [h:mm a]]',\n    'a': '[h:mm a – h:mm a]',\n    'hm': '[h:mm – h:mm a]',\n    '_': '[h:mm a]'\n  },\n  FULL_DATETIME: {\n    '_': '[[EEEE, MMMM d, y] \\'åţ\\' [h:mm:ss a zzzz] \\'one\\']'\n  },\n  LONG_DATETIME: {\n    '_': '[[MMMM d, y] \\'åţ\\' [h:mm:ss a z] \\'one\\']'\n  },\n  MEDIUM_DATETIME: {\n    '_': '[[MMM d, y], [h:mm:ss a]]'\n  },\n  SHORT_DATETIME: {\n    'a': '[[M/d/yy], [h:mm a – h:mm a]]',\n    'hm': '[[M/d/yy], [h:mm – h:mm a]]',\n    '_': '[[M/d/yy], [h:mm a]]'\n  },\n  FALLBACK: '[{0} – {1} one]'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_ZM = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'at\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'at\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y, h:mm a – h:mm a',\n    'hm': 'dd/MM/y, h:mm – h:mm a',\n    '_': 'dd/MM/y, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_en_ZW = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE, dd MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM,y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd MMMM y \\'at\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd MMMM y \\'at\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd MMM,y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y, HH:mm – HH:mm',\n    '_': 'd/M/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_eo = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d-\\'a\\' \\'de\\' MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'y-MMMM-dd'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'y-MMM-dd'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'yy-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d H-\\'a\\' \\'horo\\' \\'kaj\\' m:ss zzzz',\n    '_': 'H-\\'a\\' \\'horo\\' \\'kaj\\' m:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d H-\\'a\\' \\'horo\\' \\'kaj\\' m:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d-\\'a\\' \\'de\\' MMMM y H-\\'a\\' \\'horo\\' \\'kaj\\' m:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y-MMMM-dd HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y-MMM-dd HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'yy-MM-dd HH:mm–HH:mm',\n    '_': 'yy-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_eo_001 = exports.DateIntervalSymbols_eo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_AR = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy HH:mm–HH:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0} a el {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_BO = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM \\'de\\' y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM \\'de\\' y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy H:mm–H:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_BR = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy H:mm–H:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_BZ = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy H:mm–H:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_CL = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'dd/MM/y GGGGG – dd/MM/y GGGGG',\n    'Mdy': 'dd-MM-y – dd-MM-y',\n    '_': 'dd-MM-y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    'Mdy': 'dd-MM-yy – dd-MM-yy',\n    '_': 'dd-MM-yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd-MM-y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd-MM-y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd-MM-y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd-MM-y HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd-MM-y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd-MM-yy H:mm–H:mm',\n    '_': 'dd-MM-yy HH:mm'\n  },\n  FALLBACK: '{0} a el {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_CO = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'dd/MM/y GGGGG – dd/MM/y GGGGG',\n    'My': 'd/MM/y \\'al\\' d/MM/y',\n    'd': 'd/MM/y \\'a\\' d/MM/y',\n    '_': 'd/MM/y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    'My': 'd/MM/yy \\'al\\' d/MM/yy',\n    'd': 'd/MM/yy \\'a\\' d/MM/yy',\n    '_': 'd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, h:mm a',\n    'a': 'h:mm a \\'a\\' h:mm a',\n    'hm': 'h:mm \\'a\\' h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd/MM/y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/MM/yy, h:mm a \\'a\\' h:mm a',\n    'hm': 'd/MM/yy, h:mm \\'a\\' h:mm a',\n    '_': 'd/MM/yy, h:mm a'\n  },\n  FALLBACK: '{0} ‘al’ {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_CR = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy H:mm–H:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_CU = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy H:mm–H:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_DO = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'a': 'h:mm a – h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy h:mm a – h:mm a',\n    'hm': 'd/M/yy h:mm – h:mm a',\n    '_': 'd/M/yy h:mm a'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_EA = dateIntervalSymbols.DateIntervalSymbols_es;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_EC = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy H:mm–H:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_GQ = dateIntervalSymbols.DateIntervalSymbols_es;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_GT = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'dd/MM/y GGGGG – dd/MM/y GGGGG',\n    'Mdy': 'd/MM/y – d/MM/y',\n    '_': 'd/MM/y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    'Mdy': 'd/MM/yy – d/MM/yy',\n    '_': 'd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd/MM/y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/MM/yy H:mm–H:mm',\n    '_': 'd/MM/yy HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_HN = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE dd \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE dd \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy H:mm–H:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_IC = dateIntervalSymbols.DateIntervalSymbols_es;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_NI = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy H:mm–H:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_PA = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'dd/MM/y GGGGG – dd/MM/y GGGGG',\n    'Mdy': 'd/M/y–d/M/y',\n    '_': 'MM/dd/y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    'Mdy': 'd/M/yy–d/M/yy',\n    '_': 'MM/dd/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'MM/dd/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'MM/dd/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'MM/dd/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'MM/dd/y h:mm a',\n    'a': 'h:mm a – h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MM/dd/y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'MM/dd/yy h:mm a – h:mm a',\n    'hm': 'MM/dd/yy h:mm – h:mm a',\n    '_': 'MM/dd/yy h:mm a'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_PE = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    'Mdy': 'd/M/yy–d/M/yy',\n    '_': 'd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/MM/yy H:mm–H:mm',\n    '_': 'd/MM/yy HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_PH = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d y G – MMMM d y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d y G – MMM d y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'yy-MM-dd GGGGG – yy-MM-dd GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'a': 'h:mm a – h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy h:mm a – h:mm a',\n    'hm': 'd/M/yy h:mm – h:mm a',\n    '_': 'd/M/yy h:mm a'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_PR = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'dd/MM/y GGGGG – dd/MM/y GGGGG',\n    'Mdy': 'd/M/y–d/M/y',\n    '_': 'MM/dd/y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    'Mdy': 'd/M/yy–d/M/yy',\n    '_': 'MM/dd/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'MM/dd/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'MM/dd/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'MM/dd/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'MM/dd/y h:mm a',\n    'a': 'h:mm a – h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MM/dd/y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'MM/dd/yy h:mm a – h:mm a',\n    'hm': 'MM/dd/yy h:mm – h:mm a',\n    '_': 'MM/dd/yy h:mm a'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_PY = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM \\'al\\' d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    'Mdy': 'd/M/yy \\'al\\' d/M/yy',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy H:mm–H:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_SV = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy H:mm–H:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_UY = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'H:mm–H:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy H:mm–H:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_es_VE = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM–EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM \\'de\\' y G – d MMMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'dd/MM/yy GGGGG – dd/MM/yy GGGGG',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'a': 'h:mm a – h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y, h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y, h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy h:mm a – h:mm a',\n    'hm': 'd/M/yy h:mm – h:mm a',\n    '_': 'd/M/yy h:mm a'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_et_EE = dateIntervalSymbols.DateIntervalSymbols_et;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_eu_ES = dateIntervalSymbols.DateIntervalSymbols_eu;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ewo = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ewo_CM = exports.DateIntervalSymbols_ewo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fa_AF = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE d LLLL تا EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd LLLL تا d MMMM y',\n    'd': 'd تا d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd LLL تا d MMM y',\n    'd': 'd تا d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y/M/d'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y،‏ H:mm:ss (zzzz)',\n    '_': 'H:mm:ss (zzzz)'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y،‏ H:mm:ss (z)',\n    '_': 'H:mm:ss (z)'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y،‏ H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y،‏ H:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y، ساعت H:mm:ss (zzzz)'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y، ساعت H:mm:ss (z)'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y،‏ H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'M/d/y،‏ H:mm تا H:mm',\n    '_': 'y/M/d،‏ H:mm'\n  },\n  FALLBACK: '{0} تا {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fa_IR = dateIntervalSymbols.DateIntervalSymbols_fa;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ff = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ff_Latn = exports.DateIntervalSymbols_ff;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ff_Latn_BF = exports.DateIntervalSymbols_ff;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ff_Latn_CM = exports.DateIntervalSymbols_ff;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ff_Latn_GH = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/y h:mm a – h:mm a',\n    'hm': 'd/M/y h:mm–h:mm a',\n    '_': 'd/M/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ff_Latn_GM = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/y h:mm a – h:mm a',\n    'hm': 'd/M/y h:mm–h:mm a',\n    '_': 'd/M/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ff_Latn_GN = exports.DateIntervalSymbols_ff;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ff_Latn_GW = exports.DateIntervalSymbols_ff;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ff_Latn_LR = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/y h:mm a – h:mm a',\n    'hm': 'd/M/y h:mm–h:mm a',\n    '_': 'd/M/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ff_Latn_MR = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/y h:mm a – h:mm a',\n    'hm': 'd/M/y h:mm–h:mm a',\n    '_': 'd/M/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ff_Latn_NE = exports.DateIntervalSymbols_ff;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ff_Latn_NG = exports.DateIntervalSymbols_ff;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ff_Latn_SL = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/y h:mm a – h:mm a',\n    'hm': 'd/M/y h:mm–h:mm a',\n    '_': 'd/M/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ff_Latn_SN = exports.DateIntervalSymbols_ff;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fi_FI = dateIntervalSymbols.DateIntervalSymbols_fi;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fil_PH = dateIntervalSymbols.DateIntervalSymbols_fil;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fo = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE dd. MMMM–EEEE dd. MMMM y',\n    'y': 'EEEE dd. MMMM y–EEEE dd. MMMM y',\n    '_': 'EEEE, d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'dd. MMMM–dd. MMMM y',\n    'd': 'd.–d. MMMM y',\n    'y': 'dd. MMMM y–dd. MMMM y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'dd.MM.y–dd.MM.y',\n    '_': 'dd.MM.y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'dd.MM.yy–dd.MM.yy',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d. MMMM y \\'kl\\'. HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y \\'kl\\'. HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd.MM.y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy, HH:mm–HH:mm',\n    '_': 'dd.MM.yy, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fo_DK = exports.DateIntervalSymbols_fo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fo_FO = exports.DateIntervalSymbols_fo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_BE = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G \\'à\\' EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G \\'à\\' d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G \\'à\\' d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/yy G \\'à\\' d/M/yy G',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' H \\'h\\' mm \\'min\\' ss \\'s\\' zzzz',\n    '_': 'H \\'h\\' mm \\'min\\' ss \\'s\\' zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' H \\'h\\' mm \\'min\\' ss \\'s\\' z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'à\\' H \\'h\\' mm \\'min\\' ss \\'s\\' zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'à\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y \\'à\\' HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/MM/yy \\'à\\' HH:mm – HH:mm',\n    '_': 'd/MM/yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_BF = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_BI = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_BJ = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_BL = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_CD = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_CF = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_CG = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_CH = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G \\'à\\' EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    'y': 'EEEE d MMMM y – EEEE d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G \\'à\\' d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G \\'à\\' d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/yy G \\'à\\' d/M/yy G',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y \\'à\\' HH.mm:ss \\'h\\' zzzz',\n    '_': 'HH.mm:ss \\'h\\' zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y \\'à\\' HH.mm:ss \\'h\\' z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y \\'à\\' HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y \\'à\\' HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'à\\' HH.mm:ss \\'h\\' zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'à\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y \\'à\\' HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy \\'à\\' HH:mm – HH:mm',\n    '_': 'dd.MM.yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_CI = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_CM = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_DJ = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G \\'à\\' EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G \\'à\\' d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G \\'à\\' d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/y G \\'à\\' d/M/y G',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'à\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'à\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y \\'à\\' h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y \\'à\\' h:mm a – h:mm a',\n    'hm': 'dd/MM/y \\'à\\' h:mm – h:mm a',\n    '_': 'dd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_DZ = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G \\'à\\' EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G \\'à\\' d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G \\'à\\' d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/y G \\'à\\' d/M/y G',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'à\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'à\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y \\'à\\' h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y \\'à\\' h:mm a – h:mm a',\n    'hm': 'dd/MM/y \\'à\\' h:mm – h:mm a',\n    '_': 'dd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_FR = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_GA = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_GF = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_GN = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_GP = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_GQ = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_HT = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_KM = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_LU = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_MA = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_MC = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_MF = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_MG = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_ML = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G \\'à\\' EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G \\'à\\' d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G \\'à\\' d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/y G \\'à\\' d/M/y G',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'à\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'à\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_MQ = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_MR = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G \\'à\\' EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G \\'à\\' d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G \\'à\\' d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/y G \\'à\\' d/M/y G',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'à\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'à\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y \\'à\\' h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y \\'à\\' h:mm a – h:mm a',\n    'hm': 'dd/MM/y \\'à\\' h:mm – h:mm a',\n    '_': 'dd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_MU = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_NC = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_NE = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_PF = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_PM = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_RE = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_RW = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_SC = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_SN = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_SY = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G \\'à\\' EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G \\'à\\' d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G \\'à\\' d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/y G \\'à\\' d/M/y G',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'à\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'à\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y \\'à\\' h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y \\'à\\' h:mm a – h:mm a',\n    'hm': 'dd/MM/y \\'à\\' h:mm – h:mm a',\n    '_': 'dd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_TD = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G \\'à\\' EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G \\'à\\' d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G \\'à\\' d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/y G \\'à\\' d/M/y G',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'à\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'à\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y \\'à\\' h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y \\'à\\' h:mm a – h:mm a',\n    'hm': 'dd/MM/y \\'à\\' h:mm – h:mm a',\n    '_': 'dd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_TG = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_TN = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G \\'à\\' EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G \\'à\\' d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G \\'à\\' d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/y G \\'à\\' d/M/y G',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'à\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'à\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y \\'à\\' h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y \\'à\\' h:mm a – h:mm a',\n    'hm': 'dd/MM/y \\'à\\' h:mm – h:mm a',\n    '_': 'dd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_VU = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G \\'à\\' EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G \\'à\\' d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G \\'à\\' d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/y G \\'à\\' d/M/y G',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y \\'à\\' h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'à\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'à\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y \\'à\\' h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y \\'à\\' h:mm a – h:mm a',\n    'hm': 'dd/MM/y \\'à\\' h:mm – h:mm a',\n    '_': 'dd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_WF = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fr_YT = dateIntervalSymbols.DateIntervalSymbols_fr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fur = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Mdy': 'EEEE dd/MM/y – EEEE dd/MM/y',\n    '_': 'EEEE d \\'di\\' MMMM \\'dal\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'dd/MM/y – d/MM',\n    'd': 'd – d/MM/y',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd \\'di\\' MMMM \\'dal\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d \\'di\\' MMMM \\'dal\\' y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'di\\' MMMM \\'dal\\' y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd/MM/y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy HH:mm–HH:mm',\n    '_': 'dd/MM/yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fur_IT = exports.DateIntervalSymbols_fur;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fy = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    'y': 'EEEE d MMMM y – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'dd-MM-yy – dd-MM-yy',\n    '_': 'dd-MM-yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd-M-y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd-M-y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd-M-y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd-M-y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'om\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'om\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd-MM-yy HH:mm–HH:mm',\n    '_': 'dd-MM-yy HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_fy_NL = exports.DateIntervalSymbols_fy;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ga_IE = dateIntervalSymbols.DateIntervalSymbols_ga;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_gd = {\n  FULL_DATE: {\n    'G': 'EEEE, d MMMM y G – EEEE, d MMMM y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE, d\\'mh\\' MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd\\'mh\\' MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/y GGGGG – d/M/y GGGGG',\n    'Mdy': 'd/M/y – d/M/y',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d\\'mh\\' MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd\\'mh\\' MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm – HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_gd_GB = exports.DateIntervalSymbols_gd;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_gl_ES = dateIntervalSymbols.DateIntervalSymbols_gl;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_gsw_CH = dateIntervalSymbols.DateIntervalSymbols_gsw;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_gsw_FR = dateIntervalSymbols.DateIntervalSymbols_gsw;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_gsw_LI = dateIntervalSymbols.DateIntervalSymbols_gsw;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_gu_IN = dateIntervalSymbols.DateIntervalSymbols_gu;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_guz = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_guz_KE = exports.DateIntervalSymbols_guz;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_gv = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_gv_IM = exports.DateIntervalSymbols_gv;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ha = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Md': 'dd/MM/yy – dd/MM/yy',\n    'y': 'yy-MM-dd – yy-MM-dd',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM, y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy HH:mm–HH:mm',\n    '_': 'd/M/yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ha_GH = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Md': 'dd/MM/yy – dd/MM/yy',\n    'y': 'yy-MM-dd – yy-MM-dd',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM, y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy h:mm a – h:mm a',\n    'hm': 'd/M/yy h:mm–h:mm a',\n    '_': 'd/M/yy h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ha_NE = exports.DateIntervalSymbols_ha;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ha_NG = exports.DateIntervalSymbols_ha;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_haw_US = dateIntervalSymbols.DateIntervalSymbols_haw;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_he_IL = dateIntervalSymbols.DateIntervalSymbols_he;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_hi_IN = dateIntervalSymbols.DateIntervalSymbols_hi;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_hr_BA = {\n  FULL_DATE: {\n    'G': 'EEEE, dd. MMMM y. G – EEEE, dd. MMMM y. G',\n    'M': 'EEEE, dd. MMMM – EEEE, dd. MMMM y.',\n    'd': 'EEEE, dd. – EEEE, dd. MMMM y.',\n    'y': 'EEEE, dd. MMMM y. – EEEE, dd. MMMM y.',\n    '_': 'EEEE, d. MMMM y.'\n  },\n  LONG_DATE: {\n    'G': 'dd. MMMM y. G – dd. MMMM y. G',\n    'M': 'dd. MMMM – dd. MMMM y.',\n    'd': 'dd. – dd. MMMM y.',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'd. MMMM y.'\n  },\n  MEDIUM_DATE: {\n    'G': 'dd. MMM y. G – dd. MMM y. G',\n    'M': 'dd. MMM – dd. MMM y.',\n    'd': 'dd. – dd. MMM y.',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'd. MMM y.'\n  },\n  SHORT_DATE: {\n    'G': 'dd. MM. yy. GGGGG – dd. MM. yy. GGGGG',\n    'Mdy': 'dd. MM. yy. – dd. MM. yy.',\n    '_': 'd. M. yy.'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd. MM. y. HH:mm:ss (zzzz)',\n    '_': 'HH:mm:ss (zzzz)'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd. MM. y. HH:mm:ss (z)',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd. MM. y. HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd. MM. y. HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d. MMMM y. \\'u\\' HH:mm:ss (zzzz)'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y. \\'u\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd. MMM y. HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd. M. yy. HH:mm – HH:mm',\n    '_': 'd. M. yy. HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_hr_HR = dateIntervalSymbols.DateIntervalSymbols_hr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_hsb = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, d. MMMM – EEEE, d. MMMM y',\n    'd': 'EEEE, d. – EEEE, d. MMMM y',\n    '_': 'EEEE, d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd. MMMM – d. MMMM y',\n    'd': 'd. – d. MMMM y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'd.M.y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'd.M.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y H:mm:ss zzzz',\n    '_': 'H:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y H:mm:ss z',\n    '_': 'H:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y H:mm \\'hodź\\'.',\n    'ahm': 'H:mm – H:mm \\'hodź\\'.',\n    '_': 'H:mm \\'hodź\\'.'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d. MMMM y H:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y H:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd.M.y H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.M.yy H:mm – H:mm \\'hodź\\'.',\n    '_': 'd.M.yy H:mm \\'hodź\\'.'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_hsb_DE = exports.DateIntervalSymbols_hsb;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_hu_HU = dateIntervalSymbols.DateIntervalSymbols_hu;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_hy_AM = dateIntervalSymbols.DateIntervalSymbols_hy;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ia = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE d MMMM – EEEE d MMMM y',\n    'y': 'EEEE d MMMM y – EEEE d MMMM y',\n    '_': 'EEEE \\'le\\' d \\'de\\' MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd \\'de\\' MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'dd-MM-y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd-MM-y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd-MM-y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd-MM-y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd-MM-y HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE \\'le\\' d \\'de\\' MMMM y \\'a\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM y \\'a\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd-MM-y HH:mm – HH:mm',\n    '_': 'dd-MM-y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ia_001 = exports.DateIntervalSymbols_ia;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_id_ID = dateIntervalSymbols.DateIntervalSymbols_id;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ig = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'na\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'na\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy, HH:mm–HH:mm',\n    '_': 'd/M/yy, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ig_NG = exports.DateIntervalSymbols_ig;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ii = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'y-MM-dd h:mm a – h:mm a',\n    'hm': 'y-MM-dd h:mm–h:mm a',\n    '_': 'y-MM-dd h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ii_CN = exports.DateIntervalSymbols_ii;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_is_IS = dateIntervalSymbols.DateIntervalSymbols_is;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_it_CH = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G – EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    'y': 'EEEE d MMMM y – EEEE d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'dd MMMM – dd MMMM y',\n    'd': 'dd–dd MMMM y',\n    'y': 'dd MMMM y – dd MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'dd MMM – dd MMM y',\n    'd': 'dd–dd MMM y',\n    'y': 'dd MMM y – dd MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/yy GGGGG – d/M/yy GGGGG',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy, HH:mm–HH:mm',\n    '_': 'dd.MM.yy, HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_it_IT = dateIntervalSymbols.DateIntervalSymbols_it;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_it_SM = dateIntervalSymbols.DateIntervalSymbols_it;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_it_VA = dateIntervalSymbols.DateIntervalSymbols_it;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ja_JP = dateIntervalSymbols.DateIntervalSymbols_ja;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_jgo = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, y MMMM dd'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'M.d.y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M.d.y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M.d.y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M.d.y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, y MMMM dd HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_jgo_CM = exports.DateIntervalSymbols_jgo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_jmc = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_jmc_TZ = exports.DateIntervalSymbols_jmc;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_jv = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'dd-MM-y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd-MM-y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd-MM-y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd-MM-y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd-MM-y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd-MM-y, HH:mm – HH:mm',\n    '_': 'dd-MM-y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_jv_ID = exports.DateIntervalSymbols_jv;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ka_GE = dateIntervalSymbols.DateIntervalSymbols_ka;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kab = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/y h:mm a – h:mm a',\n    'hm': 'd/M/y h:mm–h:mm a',\n    '_': 'd/M/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kab_DZ = exports.DateIntervalSymbols_kab;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kam = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kam_KE = exports.DateIntervalSymbols_kam;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kde = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kde_TZ = exports.DateIntervalSymbols_kde;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kea = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE, d \\'di\\' MMMM \\'di\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd \\'di\\' MMMM \\'di\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'di\\' MMMM \\'di\\' y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'di\\' MMMM \\'di\\' y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm – HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kea_CV = exports.DateIntervalSymbols_kea;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_khq = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_khq_ML = exports.DateIntervalSymbols_khq;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ki = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ki_KE = exports.DateIntervalSymbols_ki;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kk_KZ = dateIntervalSymbols.DateIntervalSymbols_kk;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kkj = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE dd MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE dd MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM y HH:mm–HH:mm',\n    '_': 'dd/MM y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kkj_CM = exports.DateIntervalSymbols_kkj;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kl = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d HH.mm.ss zzzz',\n    '_': 'HH.mm.ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d HH.mm.ss z',\n    '_': 'HH.mm.ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d HH.mm.ss',\n    '_': 'HH.mm.ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d HH.mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH.mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH.mm.ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH.mm.ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH.mm.ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH.mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kl_GL = exports.DateIntervalSymbols_kl;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kln = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kln_KE = exports.DateIntervalSymbols_kln;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_km_KH = dateIntervalSymbols.DateIntervalSymbols_km;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kn_IN = dateIntervalSymbols.DateIntervalSymbols_kn;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ko_KP = dateIntervalSymbols.DateIntervalSymbols_ko;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ko_KR = dateIntervalSymbols.DateIntervalSymbols_ko;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kok = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d MMMM –EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'dd-MM-y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'dd-MM-yy – dd-MM-yy',\n    '_': 'd-M-yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd-MM-y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'yy-MM-dd h:mm a – h:mm a',\n    'hm': 'yy-MM-dd h:mm–h:mm a',\n    '_': 'd-M-yy h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kok_IN = exports.DateIntervalSymbols_kok;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ks = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, MMMM d, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'M/d/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM d, y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'MMMM d, y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MMM d, y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'M/d/yy h:mm a – h:mm a',\n    'hm': 'M/d/yy h:mm–h:mm a',\n    '_': 'M/d/yy h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ks_IN = exports.DateIntervalSymbols_ks;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ksb = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ksb_TZ = exports.DateIntervalSymbols_ksb;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ksf = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ksf_CM = exports.DateIntervalSymbols_ksf;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ksh = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Mdy': 'EEEE y-MM-dd – EEEE y-MM-dd',\n    '_': 'EEEE, \\'dä\\' d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'd.–d. MMMM y',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'd.–d. MMMM y',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd. MMM. y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd. M. y'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, \\'dä\\' d. MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd. MMM. y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'd. M. y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ksh_DE = exports.DateIntervalSymbols_ksh;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ku = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ku_TR = exports.DateIntervalSymbols_ku;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kw = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_kw_GB = exports.DateIntervalSymbols_kw;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ky_KG = dateIntervalSymbols.DateIntervalSymbols_ky;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lag = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lag_TZ = exports.DateIntervalSymbols_lag;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lb = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, d. MMMM – EEEE, d. MMMM y',\n    'd': 'EEEE, d. – EEEE, d. MMMM y',\n    'y': 'EEEE, d. MMMM y – EEEE, d. MMMM y',\n    '_': 'EEEE, d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd. MMMM – d. MMMM y',\n    'd': 'd.–d. MMMM y',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd. MMM – d. MMM y',\n    'd': 'd.–d. MMM y',\n    'y': 'd. MMM y – d. MMM y',\n    '_': 'd. MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'dd.MM.yy – dd.MM.yy',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d. MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd. MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy HH:mm–HH:mm',\n    '_': 'dd.MM.yy HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lb_LU = exports.DateIntervalSymbols_lb;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lg = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lg_UG = exports.DateIntervalSymbols_lg;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lkt = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, MMMM d, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'M/d/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM d, y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'MMMM d, y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MMM d, y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'M/d/yy h:mm a – h:mm a',\n    'hm': 'M/d/yy h:mm–h:mm a',\n    '_': 'M/d/yy h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lkt_US = exports.DateIntervalSymbols_lkt;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ln_AO = dateIntervalSymbols.DateIntervalSymbols_ln;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ln_CD = dateIntervalSymbols.DateIntervalSymbols_ln;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ln_CF = dateIntervalSymbols.DateIntervalSymbols_ln;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ln_CG = dateIntervalSymbols.DateIntervalSymbols_ln;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lo_LA = dateIntervalSymbols.DateIntervalSymbols_lo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lrc = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lrc_IQ = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'y-MM-dd h:mm a – h:mm a',\n    'hm': 'y-MM-dd h:mm–h:mm a',\n    '_': 'y-MM-dd h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lrc_IR = exports.DateIntervalSymbols_lrc;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lt_LT = dateIntervalSymbols.DateIntervalSymbols_lt;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lu = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lu_CD = exports.DateIntervalSymbols_lu;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_luo = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_luo_KE = exports.DateIntervalSymbols_luo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_luy = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_luy_KE = exports.DateIntervalSymbols_luy;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_lv_LV = dateIntervalSymbols.DateIntervalSymbols_lv;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mas = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mas_KE = exports.DateIntervalSymbols_mas;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mas_TZ = exports.DateIntervalSymbols_mas;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mer = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mer_KE = exports.DateIntervalSymbols_mer;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mfe = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mfe_MU = exports.DateIntervalSymbols_mfe;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mg = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mg_MG = exports.DateIntervalSymbols_mg;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mgh = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mgh_MZ = exports.DateIntervalSymbols_mgh;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mgo = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, y MMMM dd'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, y MMMM dd HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mgo_CM = exports.DateIntervalSymbols_mgo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mi = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d h:mm:ss',\n    '_': 'h:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d h:mm',\n    'a': 'h:mm a – h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d h:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'y-MM-dd h:mm a – h:mm a',\n    'hm': 'y-MM-dd h:mm–h:mm a',\n    '_': 'y-MM-dd h:mm'\n  },\n  FALLBACK: '{0} ki te {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mi_NZ = exports.DateIntervalSymbols_mi;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mk_MK = dateIntervalSymbols.DateIntervalSymbols_mk;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ml_IN = dateIntervalSymbols.DateIntervalSymbols_ml;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mn_MN = dateIntervalSymbols.DateIntervalSymbols_mn;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mr_IN = dateIntervalSymbols.DateIntervalSymbols_mr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ms_BN = {\n  FULL_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM, y',\n    'd': 'd–d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM, y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/yy GGGGG – d/M/yy GGGGG',\n    'Mdy': 'd/M/yy – d/M/yy',\n    '_': 'd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'dd MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/MM/yy, h:mm a – h:mm a',\n    'hm': 'd/MM/yy, h:mm–h:mm a',\n    '_': 'd/MM/yy, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ms_MY = dateIntervalSymbols.DateIntervalSymbols_ms;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ms_SG = dateIntervalSymbols.DateIntervalSymbols_ms;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mt_MT = dateIntervalSymbols.DateIntervalSymbols_mt;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mua = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mua_CM = exports.DateIntervalSymbols_mua;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_my_MM = dateIntervalSymbols.DateIntervalSymbols_my;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mzn = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_mzn_IR = exports.DateIntervalSymbols_mzn;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_naq = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y h:mm a – h:mm a',\n    'hm': 'dd/MM/y h:mm–h:mm a',\n    '_': 'dd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_naq_NA = exports.DateIntervalSymbols_naq;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nb_NO = dateIntervalSymbols.DateIntervalSymbols_nb;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nb_SJ = dateIntervalSymbols.DateIntervalSymbols_nb;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nd = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nd_ZW = exports.DateIntervalSymbols_nd;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nds = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nds_DE = exports.DateIntervalSymbols_nds;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nds_NL = exports.DateIntervalSymbols_nds;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ne_IN = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'yy/M/d'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd, h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'yy/M/d, h:mm a – h:mm a',\n    'hm': 'yy/M/d, h:mm–h:mm a',\n    '_': 'yy/M/d, h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ne_NP = dateIntervalSymbols.DateIntervalSymbols_ne;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nl_AW = dateIntervalSymbols.DateIntervalSymbols_nl;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nl_BE = {\n  FULL_DATE: {\n    'G': 'EEEE d MMMM y G – EEEE d MMMM y G',\n    'M': 'EEEE d MMMM – EEEE d MMMM y',\n    'd': 'EEEE d – EEEE d MMMM y',\n    'y': 'EEEE d MMMM y – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd-M-y GGGGG – d-M-y GGGGG',\n    'Mdy': 'd/MM/y – d/MM/y',\n    '_': 'd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'om\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'om\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/MM/y HH:mm–HH:mm',\n    '_': 'd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nl_BQ = dateIntervalSymbols.DateIntervalSymbols_nl;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nl_CW = dateIntervalSymbols.DateIntervalSymbols_nl;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nl_NL = dateIntervalSymbols.DateIntervalSymbols_nl;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nl_SR = dateIntervalSymbols.DateIntervalSymbols_nl;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nl_SX = dateIntervalSymbols.DateIntervalSymbols_nl;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nmg = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nmg_CM = exports.DateIntervalSymbols_nmg;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nn = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE d. MMMM–EEEE d. MMMM y',\n    'd': 'EEEE d.–EEEE d. MMMM y',\n    'y': 'EEEE d. MMMM y–EEEE d. MMMM y',\n    '_': 'EEEE d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd. MMMM–d. MMMM y',\n    'd': 'd.–d. MMMM y',\n    'y': 'd. MMMM y–d. MMMM y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd. MMM–d. MMM y',\n    'd': 'd.–d. MMM y',\n    'y': 'd. MMM y–d. MMM y',\n    '_': 'd. MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'dd.MM.y–dd.MM.y',\n    '_': 'dd.MM.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y, \\'kl\\'. HH:mm:ss zzzz',\n    '_': '\\'kl\\'. HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y, \\'kl\\'. HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d. MMMM y \\'kl\\'. HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y \\'kl\\'. HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd. MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.y, HH:mm–HH:mm',\n    '_': 'dd.MM.y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nn_NO = exports.DateIntervalSymbols_nn;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nnh = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE , \\'lyɛ\\'̌ʼ d \\'na\\' MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': '\\'lyɛ\\'̌ʼ d \\'na\\' MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE , \\'lyɛ\\'̌ʼ d \\'na\\' MMMM, y,HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': '\\'lyɛ\\'̌ʼ d \\'na\\' MMMM, y, HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy HH:mm–HH:mm',\n    '_': 'dd/MM/yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nnh_CM = exports.DateIntervalSymbols_nnh;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nus = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y zzzz h:mm:ss a',\n    '_': 'zzzz h:mm:ss a'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y z h:mm:ss a',\n    '_': 'z h:mm:ss a'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y zzzz h:mm:ss a'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y z h:mm:ss a'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/MM/y h:mm a – h:mm a',\n    'hm': 'd/MM/y h:mm–h:mm a',\n    '_': 'd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nus_SS = exports.DateIntervalSymbols_nus;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nyn = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_nyn_UG = exports.DateIntervalSymbols_nyn;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_om = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, MMMM d, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'dd-MMM-y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM d, y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd-MMM-y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/yy h:mm a – h:mm a',\n    'hm': 'dd/MM/yy h:mm–h:mm a',\n    '_': 'dd/MM/yy h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_om_ET = exports.DateIntervalSymbols_om;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_om_KE = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, MMMM d, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'dd-MMM-y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM d, y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd-MMM-y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy HH:mm–HH:mm',\n    '_': 'dd/MM/yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_or_IN = dateIntervalSymbols.DateIntervalSymbols_or;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_os = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM, y \\'аз\\''\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM, y \\'аз\\''\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'dd MMM y \\'аз\\''\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'dd.MM.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM, y \\'аз\\', HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y \\'аз\\', HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd MMM y \\'аз\\', HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy, HH:mm–HH:mm',\n    '_': 'dd.MM.yy, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_os_GE = exports.DateIntervalSymbols_os;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_os_RU = exports.DateIntervalSymbols_os;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_pa_Arab = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, dd MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y h:mm a – h:mm a',\n    'hm': 'dd/MM/y h:mm–h:mm a',\n    '_': 'dd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_pa_Arab_PK = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, dd MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y h:mm a – h:mm a',\n    'hm': 'dd/MM/y h:mm–h:mm a',\n    '_': 'dd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_pa_Guru = dateIntervalSymbols.DateIntervalSymbols_pa;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_pa_Guru_IN = dateIntervalSymbols.DateIntervalSymbols_pa;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_pl_PL = dateIntervalSymbols.DateIntervalSymbols_pl;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ps = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE د y د MMMM d'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'د y د MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'y/M/d'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd H:mm:ss (zzzz)',\n    '_': 'H:mm:ss (zzzz)'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd H:mm:ss (z)',\n    '_': 'H:mm:ss (z)'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd H:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE د y د MMMM d H:mm:ss (zzzz)'\n  },\n  LONG_DATETIME: {\n    '_': 'د y د MMMM d H:mm:ss (z)'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y/M/d H:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ps_AF = exports.DateIntervalSymbols_ps;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ps_PK = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE د y د MMMM d'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'د y د MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'y/M/d'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE د y د MMMM d h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'د y د MMMM d h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'y-MM-dd h:mm a – h:mm a',\n    'hm': 'y-MM-dd h:mm–h:mm a',\n    '_': 'y/M/d h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_pt_AO = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G d \\'de\\' MMMM y – G d \\'de\\' MMMM y',\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG dd/MM/y – GGGGG dd/MM/y',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd/MM/yy – GGGGG dd/MM/yy',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd/MM/y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm – HH:mm',\n    '_': 'dd/MM/yy, HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_pt_CH = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G d \\'de\\' MMMM y – G d \\'de\\' MMMM y',\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG dd/MM/y – GGGGG dd/MM/y',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd/MM/yy – GGGGG dd/MM/yy',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd/MM/y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm – HH:mm',\n    '_': 'dd/MM/yy, HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_pt_CV = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G d \\'de\\' MMMM y – G d \\'de\\' MMMM y',\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG dd/MM/y – GGGGG dd/MM/y',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd/MM/yy – GGGGG dd/MM/yy',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd/MM/y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm – HH:mm',\n    '_': 'dd/MM/yy, HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_pt_GQ = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G d \\'de\\' MMMM y – G d \\'de\\' MMMM y',\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG dd/MM/y – GGGGG dd/MM/y',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd/MM/yy – GGGGG dd/MM/yy',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd/MM/y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm – HH:mm',\n    '_': 'dd/MM/yy, HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_pt_GW = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G d \\'de\\' MMMM y – G d \\'de\\' MMMM y',\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG dd/MM/y – GGGGG dd/MM/y',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd/MM/yy – GGGGG dd/MM/yy',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd/MM/y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm – HH:mm',\n    '_': 'dd/MM/yy, HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_pt_LU = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G d \\'de\\' MMMM y – G d \\'de\\' MMMM y',\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG dd/MM/y – GGGGG dd/MM/y',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd/MM/yy – GGGGG dd/MM/yy',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd/MM/y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm – HH:mm',\n    '_': 'dd/MM/yy, HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_pt_MO = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G d \\'de\\' MMMM y – G d \\'de\\' MMMM y',\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG dd/MM/y – GGGGG dd/MM/y',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd/MM/yy – GGGGG dd/MM/yy',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, h:mm a',\n    'a': 'h:mm a – h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y \\'às\\' h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y \\'às\\' h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd/MM/y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/yy, h:mm a – h:mm a',\n    'hm': 'dd/MM/yy, h:mm – h:mm a',\n    '_': 'dd/MM/yy, h:mm a'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_pt_MZ = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G d \\'de\\' MMMM y – G d \\'de\\' MMMM y',\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG dd/MM/y – GGGGG dd/MM/y',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd/MM/yy – GGGGG dd/MM/yy',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd/MM/y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm – HH:mm',\n    '_': 'dd/MM/yy, HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_pt_ST = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G d \\'de\\' MMMM y – G d \\'de\\' MMMM y',\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG dd/MM/y – GGGGG dd/MM/y',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd/MM/yy – GGGGG dd/MM/yy',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd/MM/y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm – HH:mm',\n    '_': 'dd/MM/yy, HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_pt_TL = {\n  FULL_DATE: {\n    'Md': 'EEEE, d \\'de\\' MMMM – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    'y': 'EEEE, d \\'de\\' MMMM \\'de\\' y – EEEE, d \\'de\\' MMMM \\'de\\' y',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G d \\'de\\' MMMM y – G d \\'de\\' MMMM y',\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG dd/MM/y – GGGGG dd/MM/y',\n    'Mdy': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM/y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd/MM/yy – GGGGG dd/MM/yy',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y, HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y \\'às\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd/MM/y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm – HH:mm',\n    '_': 'dd/MM/yy, HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_qu = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM, y',\n    '_': 'EEEE, d MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM, y',\n    'd': 'd – d MMMM, y',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd – d MMM, y',\n    'y': 'd MMM, y – d MMM, y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y – d/M/y',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd-MM-y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd-MM-y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd-MM-y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd-MM-y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM, y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'HH:mm:ss z d MMMM y'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_qu_BO = exports.DateIntervalSymbols_qu;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_qu_EC = exports.DateIntervalSymbols_qu;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_qu_PE = exports.DateIntervalSymbols_qu;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_rm = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, \\'ils\\' d \\'da\\' MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd \\'da\\' MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd-MM-y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'dd-MM-yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, \\'ils\\' d \\'da\\' MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'da\\' MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd-MM-y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.yy HH:mm–HH:mm',\n    '_': 'dd-MM-yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_rm_CH = exports.DateIntervalSymbols_rm;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_rn = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_rn_BI = exports.DateIntervalSymbols_rn;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ro_MD = dateIntervalSymbols.DateIntervalSymbols_ro;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ro_RO = dateIntervalSymbols.DateIntervalSymbols_ro;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_rof = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_rof_TZ = exports.DateIntervalSymbols_rof;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ru_BY = dateIntervalSymbols.DateIntervalSymbols_ru;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ru_KG = dateIntervalSymbols.DateIntervalSymbols_ru;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ru_KZ = dateIntervalSymbols.DateIntervalSymbols_ru;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ru_MD = dateIntervalSymbols.DateIntervalSymbols_ru;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ru_RU = dateIntervalSymbols.DateIntervalSymbols_ru;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ru_UA = {\n  FULL_DATE: {\n    'G': 'ccc, d MMMM y \\'г\\'. G – ccc, d MMMM y \\'г\\'. G',\n    'M': 'ccc, d MMMM – ccc, d MMMM y \\'г\\'.',\n    'd': 'ccc, d – ccc, d MMMM y \\'г\\'.',\n    'y': 'ccc, d MMMM y – ccc, d MMMM y',\n    '_': 'EEEE, d MMMM y \\'г\\'.'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y \\'г\\'. G – d MMMM y \\'г\\'. G',\n    'M': 'd MMMM – d MMMM y \\'г\\'.',\n    'd': 'd–d MMMM y \\'г\\'.',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM y \\'г\\'.'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y \\'г\\'. G – d MMM y \\'г\\'. G',\n    'M': 'd MMM – d MMM y \\'г\\'.',\n    'd': 'd–d MMM y \\'г\\'.',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y \\'г\\'.'\n  },\n  SHORT_DATE: {\n    'G': 'dd.MM.y G – dd.MM.y G',\n    '_': 'dd.MM.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'г\\'., HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'г\\'., HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y \\'г\\'., HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.y, HH:mm–HH:mm',\n    '_': 'dd.MM.y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_rw = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_rw_RW = exports.DateIntervalSymbols_rw;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_rwk = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_rwk_TZ = exports.DateIntervalSymbols_rwk;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sah = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'y \\'сыл\\' MMMM d \\'күнэ\\', EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'y, MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'y, MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'My': 'yy-MM-dd – yy-MM-dd',\n    'd': 'dd.MM.yy – dd.MM.yy',\n    '_': 'yy/M/d'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y \\'сыл\\' MMMM d \\'күнэ\\', EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y, MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y, MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'yy/M/d HH:mm–HH:mm',\n    '_': 'yy/M/d HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sah_RU = exports.DateIntervalSymbols_sah;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_saq = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_saq_KE = exports.DateIntervalSymbols_saq;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sbp = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sbp_TZ = exports.DateIntervalSymbols_sbp;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sd = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/y GGGGG – M/d/y GGGGG',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'y-MM-dd h:mm a – h:mm a',\n    'hm': 'y-MM-dd h:mm–h:mm a',\n    '_': 'y-MM-dd h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sd_PK = exports.DateIntervalSymbols_sd;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_se = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_se_FI = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE d MMMM – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd.M.y – d.M.y',\n    '_': 'dd.MM.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.y HH:mm–HH:mm',\n    '_': 'dd.MM.y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_se_NO = exports.DateIntervalSymbols_se;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_se_SE = exports.DateIntervalSymbols_se;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_seh = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd \\'de\\' MMM \\'de\\' y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d \\'de\\' MMMM \\'de\\' y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd \\'de\\' MMMM \\'de\\' y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd \\'de\\' MMM \\'de\\' y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_seh_MZ = exports.DateIntervalSymbols_seh;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ses = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ses_ML = exports.DateIntervalSymbols_ses;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sg = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sg_CF = exports.DateIntervalSymbols_sg;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_shi = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_shi_Latn = exports.DateIntervalSymbols_shi;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_shi_Latn_MA = exports.DateIntervalSymbols_shi;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_shi_Tfng = exports.DateIntervalSymbols_shi;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_shi_Tfng_MA = exports.DateIntervalSymbols_shi;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_si_LK = dateIntervalSymbols.DateIntervalSymbols_si;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sk_SK = dateIntervalSymbols.DateIntervalSymbols_sk;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sl_SI = dateIntervalSymbols.DateIntervalSymbols_sl;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_smn = {\n  FULL_DATE: {\n    '_': 'cccc, MMMM d. y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'MMMM d. – MMMM d. y',\n    'd': 'MMMM d.–d. y',\n    'y': 'MMMM d. y – MMMM d. y',\n    '_': 'MMMM d. y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'MMMM d. – MMMM d. y',\n    'd': 'MMMM d.–d. y',\n    'y': 'MMMM d. y – MMMM d. y',\n    '_': 'MMM d. y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'M': 'd.M.–d.M.y',\n    'd': 'd. – d.M.y',\n    '_': 'd.M.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y \\'tme\\' H.mm.ss zzzz',\n    '_': 'H.mm.ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y \\'tme\\' H.mm.ss z',\n    '_': 'H.mm.ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y \\'tme\\' H.mm.ss',\n    '_': 'H.mm.ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y \\'tme\\' H.mm',\n    '_': 'H.mm'\n  },\n  FULL_DATETIME: {\n    '_': 'cccc, MMMM d. y \\'tme\\' H.mm.ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'MMMM d. y \\'tme\\' H.mm.ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'MMM d. y \\'tme\\' H.mm.ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.M.y \\'tme\\' H.mm–H.mm',\n    '_': 'd.M.y H.mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_smn_FI = exports.DateIntervalSymbols_smn;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sn = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sn_ZW = exports.DateIntervalSymbols_sn;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_so = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'Md': 'EEEE, MMMM dd – EEEE, MMMM dd, y',\n    'y': 'EEEE, MMMM dd, y – EEEE, MMMM dd, y',\n    '_': 'EEEE, MMMM dd, y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'dd MMMM – dd MMMM y',\n    'd': 'dd–dd MMMM y',\n    'y': 'dd MMMM y – dd MMMM y',\n    '_': 'dd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'dd MMM – dd MMM y',\n    'd': 'dd–dd MMM y',\n    'y': 'dd MMM y – dd MMM y',\n    '_': 'dd-MMM-y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y h:mm a',\n    'a': 'h:mm a – h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM dd, y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd-MMM-y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/yy h:mm a – h:mm a',\n    'hm': 'dd/MM/yy h:mm–h:mm a',\n    '_': 'dd/MM/yy h:mm a'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_so_DJ = exports.DateIntervalSymbols_so;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_so_ET = exports.DateIntervalSymbols_so;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_so_KE = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'Md': 'EEEE, MMMM dd – EEEE, MMMM dd, y',\n    'y': 'EEEE, MMMM dd, y – EEEE, MMMM dd, y',\n    '_': 'EEEE, MMMM dd, y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'M': 'dd MMMM – dd MMMM y',\n    'd': 'dd–dd MMMM y',\n    'y': 'dd MMMM y – dd MMMM y',\n    '_': 'dd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'dd MMM – dd MMM y',\n    'd': 'dd–dd MMM y',\n    'y': 'dd MMM y – dd MMM y',\n    '_': 'dd-MMM-y'\n  },\n  SHORT_DATE: {\n    'G': 'M/d/yy GGGGG – M/d/yy GGGGG',\n    'Mdy': 'dd/MM/yy – dd/MM/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, MMMM dd, y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd-MMM-y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy HH:mm–HH:mm',\n    '_': 'dd/MM/yy HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_so_SO = exports.DateIntervalSymbols_so;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sq_AL = dateIntervalSymbols.DateIntervalSymbols_sq;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sq_MK = {\n  FULL_DATE: {\n    'G': 'EEEE, d MMMM y G – EEEE, d MMMM y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd.M.yy GGGGG – d.M.yy GGGGG',\n    'Mdy': 'd.M.yy – d.M.yy',\n    '_': 'd.M.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y, HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'në\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'në\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.M.yy, HH:mm – HH:mm',\n    '_': 'd.M.yy, HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sq_XK = {\n  FULL_DATE: {\n    'G': 'EEEE, d MMMM y G – EEEE, d MMMM y G',\n    'M': 'EEEE, d MMMM – EEEE, d MMMM y',\n    'd': 'EEEE, d – EEEE, d MMMM y',\n    'y': 'EEEE, d MMMM y – EEEE, d MMMM y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'd MMMM y G – d MMMM y G',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd.M.yy GGGGG – d.M.yy GGGGG',\n    'Mdy': 'd.M.yy – d.M.yy',\n    '_': 'd.M.yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y, HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'në\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'në\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.M.yy, HH:mm – HH:mm',\n    '_': 'd.M.yy, HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sr_Cyrl = dateIntervalSymbols.DateIntervalSymbols_sr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sr_Cyrl_BA = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, dd. MMMM – EEEE, dd. MMMM y.',\n    'd': 'EEEE, dd. – EEEE, dd. MMMM y.',\n    '_': 'EEEE, dd. MMMM y.'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'dd. MMMM – dd. MMMM y.',\n    'd': 'dd.–dd. MMMM y.',\n    '_': 'dd. MMMM y.'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd.MM.y.'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'd.M.yy.'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y. HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y. HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y. HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y. HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd. MMMM y. HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd. MMMM y. HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd.MM.y. HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.M.yy. HH:mm–HH:mm',\n    '_': 'd.M.yy. HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sr_Cyrl_ME = dateIntervalSymbols.DateIntervalSymbols_sr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sr_Cyrl_RS = dateIntervalSymbols.DateIntervalSymbols_sr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sr_Cyrl_XK = dateIntervalSymbols.DateIntervalSymbols_sr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sr_Latn_BA = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, dd. MMMM – EEEE, dd. MMMM y.',\n    'd': 'EEEE, dd. – EEEE, dd. MMMM y.',\n    '_': 'EEEE, dd. MMMM y.'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'dd. MMMM – dd. MMMM y.',\n    'd': 'dd.–dd. MMMM y.',\n    '_': 'dd. MMMM y.'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd.MM.y.'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'd.M.yy.'\n  },\n  FULL_TIME: {\n    'Mdy': 'd.M.y. HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd.M.y. HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd.M.y. HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd.M.y. HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd. MMMM y. HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd. MMMM y. HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd.MM.y. HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd.M.yy. HH:mm–HH:mm',\n    '_': 'd.M.yy. HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sr_Latn_ME = dateIntervalSymbols.DateIntervalSymbols_sr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sr_Latn_RS = dateIntervalSymbols.DateIntervalSymbols_sr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sr_Latn_XK = dateIntervalSymbols.DateIntervalSymbols_sr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sv_AX = dateIntervalSymbols.DateIntervalSymbols_sv;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sv_FI = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE dd MMMM–EEEE dd MMMM y',\n    'y': 'EEEE dd MMMM y–EEEE dd MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM–d MMMM y',\n    'd': 'd–d MMMM y',\n    'y': 'd MMMM y–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM–d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'M': 'y-MM-dd – MM-dd',\n    'd': 'y-MM-dd – dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'dd-MM-y'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd \\'kl\\'. HH:mm:ss zzzz',\n    '_': '\\'kl\\'. HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd \\'kl\\'. HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y \\'kl\\'. HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd-MM-y HH:mm–HH:mm',\n    '_': 'dd-MM-y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sv_SE = dateIntervalSymbols.DateIntervalSymbols_sv;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sw_CD = dateIntervalSymbols.DateIntervalSymbols_sw;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sw_KE = {\n  FULL_DATE: {\n    'G': 'EEEE, MMMM d, y G – EEEE, MMMM d, y G',\n    'M': 'EEEE, MMMM d– EEEE, MMMM d y',\n    'd': 'EEEE, MMMM d – EEEE, MMMM d y',\n    'y': 'EEEE, MMMM d y – EEEE, MMMM d y',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'MMMM d, y G – MMMM d, y G',\n    'Md': 'MMMM d – d, y',\n    'y': 'MMMM d y – MMMM d y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'Md': 'MMM d – d, y',\n    'y': 'MMM d y – MMM d y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'd/M/y GGGGG – d/M/y GGGGG',\n    'Mdy': 'd/M/y – d/M/y',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y \\'saa\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y \\'saa\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y, HH:mm – HH:mm',\n    '_': 'dd/MM/y, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sw_TZ = dateIntervalSymbols.DateIntervalSymbols_sw;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_sw_UG = dateIntervalSymbols.DateIntervalSymbols_sw;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ta_IN = dateIntervalSymbols.DateIntervalSymbols_ta;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ta_LK = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM, y',\n    '_': 'EEEE, d MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM, y',\n    'd': 'd – d MMMM, y',\n    '_': 'd MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd – d MMM, y',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM, y ’அன்று’ HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y ’அன்று’ HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/yy, HH:mm – HH:mm',\n    '_': 'd/M/yy, HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ta_MY = dateIntervalSymbols.DateIntervalSymbols_ta;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ta_SG = dateIntervalSymbols.DateIntervalSymbols_ta;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_te_IN = dateIntervalSymbols.DateIntervalSymbols_te;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_teo = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_teo_KE = exports.DateIntervalSymbols_teo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_teo_UG = exports.DateIntervalSymbols_teo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_tg = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, dd MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'dd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy HH:mm–HH:mm',\n    '_': 'dd/MM/yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_tg_TJ = exports.DateIntervalSymbols_tg;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_th_TH = dateIntervalSymbols.DateIntervalSymbols_th;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ti = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'G y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'G y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE፣ dd MMMM መዓልቲ y G'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'dd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'dd-MMM-y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'yy-MM-dd – yy-MM-dd',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE፣ dd MMMM መዓልቲ y G h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dd-MMM-y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/yy h:mm a – h:mm a',\n    'hm': 'dd/MM/yy h:mm–h:mm a',\n    '_': 'dd/MM/yy h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ti_ER = exports.DateIntervalSymbols_ti;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ti_ET = exports.DateIntervalSymbols_ti;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_tk = {\n  FULL_DATE: {\n    'G': 'G d MMMM y, EEEE – G d MMMM y, EEEE',\n    'Mdy': 'd MMMM y EEEE – d MMMM y EEEE',\n    '_': 'd MMMM y EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G d MMMM y – G d MMMM y',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd – d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G d MMM y – G d MMM y',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd.MM.y – GGGGG dd.MM.y',\n    'Mdy': 'dd.MM.y – dd.MM.y',\n    '_': 'dd.MM.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'd MMMM y EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.y HH:mm–HH:mm',\n    '_': 'dd.MM.y HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_tk_TM = exports.DateIntervalSymbols_tk;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_to = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE d MMMM – EEEE d MMMM y',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y, h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y, h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y, h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y, h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y, h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy, h:mm a – h:mm a',\n    'hm': 'd/M/yy, h:mm – h:mm a',\n    '_': 'd/M/yy h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_to_TO = exports.DateIntervalSymbols_to;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_tr_CY = {\n  FULL_DATE: {\n    'G': 'G d MMMM y EEEE – G d MMMM y EEEE',\n    '_': 'd MMMM y EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G d MMMM y – G d MMMM y',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G d MMM y – G d MMM y',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG dd.MM.y – GGGGG dd.MM.y',\n    'Mdy': 'dd.MM.y – dd.MM.y',\n    '_': 'd.MM.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y h:mm a',\n    'a': 'a h:mm – a h:mm',\n    'hm': 'a h:mm–h:mm',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'd MMMM y EEEE h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'd.MM.y a h:mm – a h:mm',\n    'hm': 'd.MM.y a h:mm–h:mm',\n    '_': 'd.MM.y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_tr_TR = dateIntervalSymbols.DateIntervalSymbols_tr;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_tt = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM, y \\'ел\\'',\n    'y': 'EEEE, d MMMM, y \\'ел\\' – EEEE, d MMMM, y \\'ел\\'',\n    '_': 'd MMMM, y \\'ел\\', EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM, y \\'ел\\'',\n    'd': 'd–d MMMM, y \\'ел\\'',\n    '_': 'd MMMM, y \\'ел\\''\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y \\'ел\\'',\n    'd': 'd–d MMM, y \\'ел\\'',\n    '_': 'd MMM, y \\'ел\\''\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'dd.MM.y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd.MM.y, H:mm:ss zzzz',\n    '_': 'H:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd.MM.y, H:mm:ss z',\n    '_': 'H:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd.MM.y, H:mm:ss',\n    '_': 'H:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd.MM.y, H:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'H:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'd MMMM, y \\'ел\\', EEEE, H:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y \\'ел\\', H:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y \\'ел\\', H:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd.MM.y, HH:mm–HH:mm',\n    '_': 'dd.MM.y, H:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_tt_RU = exports.DateIntervalSymbols_tt;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_twq = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_twq_NE = exports.DateIntervalSymbols_twq;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_tzm = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_tzm_MA = exports.DateIntervalSymbols_tzm;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ug = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE، MMMM d – EEEE، MMMM d، y',\n    'y': 'EEEE، MMMM d، y – EEEE، MMMM d، y',\n    '_': 'y d-MMMM، EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'MMMM d – MMMM d، y',\n    'd': 'MMMM d – d، y',\n    'y': 'MMMM d، y – MMMM d، y',\n    '_': 'd-MMMM، y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'MMM d – MMM d، y',\n    'd': 'MMM d – d، y',\n    'y': 'MMM d، y – MMM d، y',\n    '_': 'd-MMM، y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'M/d/y – M/d/y',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-d-M، h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-d-M، h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-d-M، h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-d-M، h:mm a',\n    'hm': 'h:mm – h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'y d-MMMM، EEEE h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd-MMMM، y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd-MMM، y، h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'y-MM-dd، h:mm a – h:mm a',\n    'hm': 'y-MM-dd، h:mm – h:mm a',\n    '_': 'y-MM-dd، h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ug_CN = exports.DateIntervalSymbols_ug;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_uk_UA = dateIntervalSymbols.DateIntervalSymbols_uk;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ur_IN = dateIntervalSymbols.DateIntervalSymbols_ur;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_ur_PK = dateIntervalSymbols.DateIntervalSymbols_ur;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_uz_Arab = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_uz_Arab_AF = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_uz_Cyrl = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM, y',\n    'y': 'EEEE, d MMMM, y – EEEE, d MMMM, y',\n    '_': 'EEEE, dd MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM, y',\n    'd': 'd – d MMMM, y',\n    '_': 'd MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd – d MMM, y',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y HH:mm:ss (zzzz)',\n    '_': 'HH:mm:ss (zzzz)'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y HH:mm:ss (z)',\n    '_': 'HH:mm:ss (z)'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd MMMM, y HH:mm:ss (zzzz)'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y HH:mm:ss (z)'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy HH:mm–HH:mm',\n    '_': 'dd/MM/yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_uz_Cyrl_UZ = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE, d MMMM – EEEE, d MMMM, y',\n    'y': 'EEEE, d MMMM, y – EEEE, d MMMM, y',\n    '_': 'EEEE, dd MMMM, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM, y',\n    'd': 'd – d MMMM, y',\n    '_': 'd MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd – d MMM, y',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd/MM/y HH:mm:ss (zzzz)',\n    '_': 'HH:mm:ss (zzzz)'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd/MM/y HH:mm:ss (z)',\n    '_': 'HH:mm:ss (z)'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd/MM/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd/MM/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dd MMMM, y HH:mm:ss (zzzz)'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y HH:mm:ss (z)'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy HH:mm–HH:mm',\n    '_': 'dd/MM/yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_uz_Latn = dateIntervalSymbols.DateIntervalSymbols_uz;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_uz_Latn_UZ = dateIntervalSymbols.DateIntervalSymbols_uz;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_vai = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y h:mm a – h:mm a',\n    'hm': 'dd/MM/y h:mm–h:mm a',\n    '_': 'dd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_vai_Latn = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y h:mm a – h:mm a',\n    'hm': 'dd/MM/y h:mm–h:mm a',\n    '_': 'dd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_vai_Latn_LR = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a zzzz',\n    '_': 'h:mm:ss a zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a z',\n    '_': 'h:mm:ss a z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'M/d/y h:mm:ss a',\n    '_': 'h:mm:ss a'\n  },\n  SHORT_TIME: {\n    'Mdy': 'M/d/y h:mm a',\n    'hm': 'h:mm–h:mm a',\n    '_': 'h:mm a'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y h:mm:ss a zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y h:mm:ss a z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y h:mm:ss a'\n  },\n  SHORT_DATETIME: {\n    'a': 'dd/MM/y h:mm a – h:mm a',\n    'hm': 'dd/MM/y h:mm–h:mm a',\n    '_': 'dd/MM/y h:mm a'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_vai_Vaii = exports.DateIntervalSymbols_vai;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_vai_Vaii_LR = exports.DateIntervalSymbols_vai;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_vi_VN = dateIntervalSymbols.DateIntervalSymbols_vi;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_vun = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_vun_TZ = exports.DateIntervalSymbols_vun;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_wae = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'M': 'EEEE, d. MMMM – EEEE, d. MMMM y',\n    'd': 'EEEE, d. – EEEE, d. MMMM y',\n    'y': 'EEEE, d. MMMM y – EEEE, d. MMMM y',\n    '_': 'EEEE, d. MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd. MMMM – d. MMMM y',\n    'd': 'd. – d. MMMM y',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'd. MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd. MMM – d. MMM y',\n    'd': 'd. – d. MMM y',\n    'y': 'd. MMM y – d. MMM y',\n    '_': 'd. MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-M-d HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-M-d HH:mm',\n    'ahm': 'HH:mm – HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d. MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd. MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd. MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm – HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} - {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_wae_CH = exports.DateIntervalSymbols_wae;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_wo = {\n  FULL_DATE: {\n    'G': 'G y MMM d, EEEE – G y MMM d, EEEE',\n    'Md': 'y MMM d, EEEE – MMM d, EEEE',\n    'y': 'y MMM d, EEEE – y MMM d, EEEE',\n    '_': 'EEEE, d MMM, y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM, y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd-MM-y'\n  },\n  FULL_TIME: {\n    'Mdy': 'dd-MM-y - HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'dd-MM-y - HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'dd-MM-y - HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'dd-MM-y - HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMM, y \\'ci\\' HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM, y \\'ci\\' HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y - HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd-MM-y - HH:mm–HH:mm',\n    '_': 'dd-MM-y - HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_wo_SN = exports.DateIntervalSymbols_wo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_xh = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    '_': 'y MMMM d, EEEE'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    '_': 'y MMMM d'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y-MM-dd'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y MMMM d, EEEE HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'y MMMM d HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y MMM d HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'y-MM-dd HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_xh_ZA = exports.DateIntervalSymbols_xh;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_xog = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE, d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'dd/MM/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/y HH:mm–HH:mm',\n    '_': 'dd/MM/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_xog_UG = exports.DateIntervalSymbols_xog;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_yav = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_yav_CM = exports.DateIntervalSymbols_yav;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_yi = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'EEEE d MMMM – EEEE d MMMM y',\n    'y': 'EEEE d MMMM y – EEEE d MMMM y',\n    '_': 'EEEE, dטן MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'd MMMM – d MMMM y',\n    'd': 'd–d MMMM y',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dטן MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dטן MMM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'd': 'yy-MM-dd – yy-MM-dd',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd-M-y, HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd-M-y, HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd-M-y, HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd-M-y, HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, dטן MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'dטן MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'dטן MMM y, HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'dd/MM/yy, HH:mm–HH:mm',\n    '_': 'dd/MM/yy HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_yi_001 = exports.DateIntervalSymbols_yi;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_yo = {\n  FULL_DATE: {\n    'G': 'G y MMM d, EEEE – G y MMM d, EEEE',\n    'Md': 'MMM d, EEEE – MMM d, EEEE y',\n    'y': 'y MMM d y, EEEE – MMM d, EEEE y',\n    '_': 'EEEE, d MMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'MMM d – MMM d y',\n    'd': 'MMM d–d y',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd MM y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss z',\n    '_': 'H:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y HH:mm:ss',\n    '_': 'H:m:s'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'H:m'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE, d MMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMM y H:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MM y H:m:s'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'd/M/y HH:mm–HH:mm',\n    '_': 'd/M/y H:m'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_yo_BJ = exports.DateIntervalSymbols_yo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_yo_NG = exports.DateIntervalSymbols_yo;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_yue = {\n  FULL_DATE: {\n    'G': 'GGGGG y-MM-dd, EEEE – GGGGG y-MM-dd, EEEE',\n    'Mdy': 'd/M/y (EEEE) 至 d/M/y (EEEE)',\n    '_': 'y年M月d日 EEEE'\n  },\n  LONG_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d至y/M/d',\n    '_': 'y年M月d日'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d至y/M/d',\n    '_': 'y年M月d日'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y/M/d'\n  },\n  FULL_TIME: {\n    'Mdy': 'y/M/d ah:mm:ss [zzzz]',\n    '_': 'ah:mm:ss [zzzz]'\n  },\n  LONG_TIME: {\n    'Mdy': 'y/M/d ah:mm:ss [z]',\n    '_': 'ah:mm:ss [z]'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y/M/d ah:mm:ss',\n    '_': 'ah:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y/M/d ah:mm',\n    'hm': 'ah:mm至h:mm',\n    '_': 'ah:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y年M月d日 EEEE ah:mm:ss [zzzz]'\n  },\n  LONG_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss [z]'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'y/M/d ah:mm至ah:mm',\n    'hm': 'y/M/d ah:mm至h:mm',\n    '_': 'y/M/d ah:mm'\n  },\n  FALLBACK: '{0}至{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_yue_Hans = {\n  FULL_DATE: {\n    'G': 'GGGGG y-MM-dd, EEEE – GGGGG y-MM-dd, EEEE',\n    'Mdy': 'y/M/dEEEE至y/M/dEEEE',\n    '_': 'y年M月d日EEEE'\n  },\n  LONG_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d – y/M/d',\n    '_': 'y年M月d日'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d – y/M/d',\n    '_': 'y年M月d日'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y/M/d'\n  },\n  FULL_TIME: {\n    'Mdy': 'y/M/d zzzz ah:mm:ss',\n    '_': 'zzzz ah:mm:ss'\n  },\n  LONG_TIME: {\n    'Mdy': 'y/M/d z ah:mm:ss',\n    '_': 'z ah:mm:ss'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y/M/d ah:mm:ss',\n    '_': 'ah:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y/M/d ah:mm',\n    'a': 'ah:mm至ah:mm',\n    'hm': 'ah:mm至h:mm',\n    '_': 'ah:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y年M月d日EEEE zzzz ah:mm:ss'\n  },\n  LONG_DATETIME: {\n    '_': 'y年M月d日 z ah:mm:ss'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'y/M/d ah:mm至ah:mm',\n    'hm': 'y/M/d ah:mm至h:mm',\n    '_': 'y/M/d ah:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_yue_Hans_CN = {\n  FULL_DATE: {\n    'G': 'GGGGG y-MM-dd, EEEE – GGGGG y-MM-dd, EEEE',\n    'Mdy': 'y/M/dEEEE至y/M/dEEEE',\n    '_': 'y年M月d日EEEE'\n  },\n  LONG_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d – y/M/d',\n    '_': 'y年M月d日'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d – y/M/d',\n    '_': 'y年M月d日'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    '_': 'y/M/d'\n  },\n  FULL_TIME: {\n    'Mdy': 'y/M/d zzzz ah:mm:ss',\n    '_': 'zzzz ah:mm:ss'\n  },\n  LONG_TIME: {\n    'Mdy': 'y/M/d z ah:mm:ss',\n    '_': 'z ah:mm:ss'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y/M/d ah:mm:ss',\n    '_': 'ah:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y/M/d ah:mm',\n    'a': 'ah:mm至ah:mm',\n    'hm': 'ah:mm至h:mm',\n    '_': 'ah:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y年M月d日EEEE zzzz ah:mm:ss'\n  },\n  LONG_DATETIME: {\n    '_': 'y年M月d日 z ah:mm:ss'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'y/M/d ah:mm至ah:mm',\n    'hm': 'y/M/d ah:mm至h:mm',\n    '_': 'y/M/d ah:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_yue_Hant = exports.DateIntervalSymbols_yue;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_yue_Hant_HK = exports.DateIntervalSymbols_yue;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_zgh = {\n  FULL_DATE: {\n    'G': 'G y MMMM d, EEEE – G y MMMM d, EEEE',\n    'Md': 'y MMMM d, EEEE – MMMM d, EEEE',\n    'y': 'y MMMM d, EEEE – y MMMM d, EEEE',\n    '_': 'EEEE d MMMM y'\n  },\n  LONG_DATE: {\n    'G': 'G y MMMM d – G y MMMM d',\n    'M': 'y MMMM d – MMMM d',\n    'd': 'y MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'd MMMM y'\n  },\n  MEDIUM_DATE: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM, y'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss zzzz',\n    '_': 'HH:mm:ss zzzz'\n  },\n  LONG_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss z',\n    '_': 'HH:mm:ss z'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y-MM-dd HH:mm:ss',\n    '_': 'HH:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y-MM-dd HH:mm',\n    'ahm': 'HH:mm–HH:mm',\n    '_': 'HH:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'EEEE d MMMM y HH:mm:ss zzzz'\n  },\n  LONG_DATETIME: {\n    '_': 'd MMMM y HH:mm:ss z'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'd MMM, y HH:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'ahm': 'y-MM-dd HH:mm–HH:mm',\n    '_': 'd/M/y HH:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_zgh_MA = exports.DateIntervalSymbols_zgh;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_zh_Hans = dateIntervalSymbols.DateIntervalSymbols_zh;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_zh_Hans_CN = dateIntervalSymbols.DateIntervalSymbols_zh;\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_zh_Hans_HK = {\n  FULL_DATE: {\n    'G': 'GGGGG y-MM-dd, EEEE – GGGGG y-MM-dd, EEEE',\n    'Mdy': 'd/M/yEEEE至d/M/yEEEE',\n    '_': 'y年M月d日EEEE'\n  },\n  LONG_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y至d/M/y',\n    '_': 'y年M月d日'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y至d/M/y',\n    '_': 'y年M月d日'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'd/M/yy至d/M/yy',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y zzzz ah:mm:ss',\n    '_': 'zzzz ah:mm:ss'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y z ah:mm:ss',\n    '_': 'z ah:mm:ss'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y ah:mm:ss',\n    '_': 'ah:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y ah:mm',\n    'a': 'ah:mm至ah:mm',\n    'hm': 'ah:mm至h:mm',\n    '_': 'ah:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y年M月d日EEEE zzzz ah:mm:ss'\n  },\n  LONG_DATETIME: {\n    '_': 'y年M月d日 z ah:mm:ss'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/yy ah:mm至ah:mm',\n    'hm': 'd/M/yy ah:mm至h:mm',\n    '_': 'd/M/yy ah:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_zh_Hans_MO = {\n  FULL_DATE: {\n    'G': 'GGGGG y-MM-dd, EEEE – GGGGG y-MM-dd, EEEE',\n    'Mdy': 'd/M/yEEEE至d/M/yEEEE',\n    '_': 'y年M月d日EEEE'\n  },\n  LONG_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y至d/M/y',\n    '_': 'y年M月d日'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y至d/M/y',\n    '_': 'y年M月d日'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'd/M/yy至d/M/yy',\n    '_': 'd/M/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'y年M月d日 zzzz ah:mm:ss',\n    '_': 'zzzz ah:mm:ss'\n  },\n  LONG_TIME: {\n    'Mdy': 'y年M月d日 z ah:mm:ss',\n    '_': 'z ah:mm:ss'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y年M月d日 ah:mm:ss',\n    '_': 'ah:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y年M月d日 ah:mm',\n    'a': 'ah:mm至ah:mm',\n    'hm': 'ah:mm至h:mm',\n    '_': 'ah:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y年M月d日EEEE zzzz ah:mm:ss'\n  },\n  LONG_DATETIME: {\n    '_': 'y年M月d日 z ah:mm:ss'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'yy年M月d日 ah:mm至ah:mm',\n    'hm': 'yy年M月d日 ah:mm至h:mm',\n    '_': 'd/M/yy ah:mm'\n  },\n  FALLBACK: '{0}–{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_zh_Hans_SG = {\n  FULL_DATE: {\n    'G': 'GGGGG y-MM-dd, EEEE – GGGGG y-MM-dd, EEEE',\n    'Mdy': 'd/M/yEEEE至d/M/yEEEE',\n    '_': 'y年M月d日EEEE'\n  },\n  LONG_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y至d/M/y',\n    '_': 'y年M月d日'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y至d/M/y',\n    '_': 'y年M月d日'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG yy-MM-dd – GGGGG yy-MM-dd',\n    'Mdy': 'd/M/yy至d/M/yy',\n    '_': 'dd/MM/yy'\n  },\n  FULL_TIME: {\n    'Mdy': 'y年M月d日 zzzz ah:mm:ss',\n    '_': 'zzzz ah:mm:ss'\n  },\n  LONG_TIME: {\n    'Mdy': 'y年M月d日 z ah:mm:ss',\n    '_': 'z ah:mm:ss'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y年M月d日 ah:mm:ss',\n    '_': 'ah:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y年M月d日 ah:mm',\n    'hm': 'ah:mm至h:mm',\n    '_': 'ah:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y年M月d日EEEE zzzz ah:mm:ss'\n  },\n  LONG_DATETIME: {\n    '_': 'y年M月d日 z ah:mm:ss'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'yy年MM月dd日 ah:mm至ah:mm',\n    'hm': 'yy年MM月dd日 ah:mm至h:mm',\n    '_': 'dd/MM/yy ah:mm'\n  },\n  FALLBACK: '{0}至{1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_zh_Hant = {\n  FULL_DATE: {\n    'G': 'GGGGG y-MM-dd, EEEE – GGGGG y-MM-dd, EEEE',\n    'Mdy': 'y/M/dEEEE至y/M/dEEEE',\n    '_': 'y年M月d日 EEEE'\n  },\n  LONG_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d至y/M/d',\n    '_': 'y年M月d日'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d至y/M/d',\n    '_': 'y年M月d日'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d至y/M/d',\n    '_': 'y/M/d'\n  },\n  FULL_TIME: {\n    'Mdy': 'y/M/d ah:mm:ss [zzzz]',\n    '_': 'ah:mm:ss [zzzz]'\n  },\n  LONG_TIME: {\n    'Mdy': 'y/M/d ah:mm:ss [z]',\n    '_': 'ah:mm:ss [z]'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y/M/d ah:mm:ss',\n    '_': 'ah:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y/M/d ah:mm',\n    'a': 'ah:mm至ah:mm',\n    'hm': 'ah:mm至h:mm',\n    '_': 'ah:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y年M月d日 EEEE ah:mm:ss [zzzz]'\n  },\n  LONG_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss [z]'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'y/M/d ah:mm至ah:mm',\n    'hm': 'y/M/d ah:mm至h:mm',\n    '_': 'y/M/d ah:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_zh_Hant_HK = {\n  FULL_DATE: {\n    'G': 'GGGGG y-MM-dd, EEEE – GGGGG y-MM-dd, EEEE',\n    'Mdy': 'd/M/y（EEEE） 至 d/M/y（EEEE）',\n    '_': 'y年M月d日EEEE'\n  },\n  LONG_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y 至 d/M/y',\n    '_': 'y年M月d日'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y 至 d/M/y',\n    '_': 'y年M月d日'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y 至 d/M/y',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y ah:mm:ss [zzzz]',\n    '_': 'ah:mm:ss [zzzz]'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y ah:mm:ss [z]',\n    '_': 'ah:mm:ss [z]'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y ah:mm:ss',\n    '_': 'ah:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y ah:mm',\n    'a': 'ah:mm至ah:mm',\n    'hm': 'ah:mm至h:mm',\n    '_': 'ah:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y年M月d日EEEE ah:mm:ss [zzzz]'\n  },\n  LONG_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss [z]'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/y ah:mm至ah:mm',\n    'hm': 'd/M/y ah:mm至h:mm',\n    '_': 'd/M/y ah:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_zh_Hant_MO = {\n  FULL_DATE: {\n    'G': 'GGGGG y-MM-dd, EEEE – GGGGG y-MM-dd, EEEE',\n    'Mdy': 'd/M/y（EEEE） 至 d/M/y（EEEE）',\n    '_': 'y年M月d日EEEE'\n  },\n  LONG_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y 至 d/M/y',\n    '_': 'y年M月d日'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y 至 d/M/y',\n    '_': 'y年M月d日'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'd/M/y 至 d/M/y',\n    '_': 'd/M/y'\n  },\n  FULL_TIME: {\n    'Mdy': 'd/M/y ah:mm:ss [zzzz]',\n    '_': 'ah:mm:ss [zzzz]'\n  },\n  LONG_TIME: {\n    'Mdy': 'd/M/y ah:mm:ss [z]',\n    '_': 'ah:mm:ss [z]'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'd/M/y ah:mm:ss',\n    '_': 'ah:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'd/M/y ah:mm',\n    'a': 'ah:mm至ah:mm',\n    'hm': 'ah:mm至h:mm',\n    '_': 'ah:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y年M月d日EEEE ah:mm:ss [zzzz]'\n  },\n  LONG_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss [z]'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'd/M/y ah:mm至ah:mm',\n    'hm': 'd/M/y ah:mm至h:mm',\n    '_': 'd/M/y ah:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_zh_Hant_TW = {\n  FULL_DATE: {\n    'G': 'GGGGG y-MM-dd, EEEE – GGGGG y-MM-dd, EEEE',\n    'Mdy': 'y/M/dEEEE至y/M/dEEEE',\n    '_': 'y年M月d日 EEEE'\n  },\n  LONG_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d至y/M/d',\n    '_': 'y年M月d日'\n  },\n  MEDIUM_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d至y/M/d',\n    '_': 'y年M月d日'\n  },\n  SHORT_DATE: {\n    'G': 'GGGGG y-MM-dd – GGGGG y-MM-dd',\n    'Mdy': 'y/M/d至y/M/d',\n    '_': 'y/M/d'\n  },\n  FULL_TIME: {\n    'Mdy': 'y/M/d ah:mm:ss [zzzz]',\n    '_': 'ah:mm:ss [zzzz]'\n  },\n  LONG_TIME: {\n    'Mdy': 'y/M/d ah:mm:ss [z]',\n    '_': 'ah:mm:ss [z]'\n  },\n  MEDIUM_TIME: {\n    'Mdy': 'y/M/d ah:mm:ss',\n    '_': 'ah:mm:ss'\n  },\n  SHORT_TIME: {\n    'Mdy': 'y/M/d ah:mm',\n    'a': 'ah:mm至ah:mm',\n    'hm': 'ah:mm至h:mm',\n    '_': 'ah:mm'\n  },\n  FULL_DATETIME: {\n    '_': 'y年M月d日 EEEE ah:mm:ss [zzzz]'\n  },\n  LONG_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss [z]'\n  },\n  MEDIUM_DATETIME: {\n    '_': 'y年M月d日 ah:mm:ss'\n  },\n  SHORT_DATETIME: {\n    'a': 'y/M/d ah:mm至ah:mm',\n    'hm': 'y/M/d ah:mm至h:mm',\n    '_': 'y/M/d ah:mm'\n  },\n  FALLBACK: '{0} – {1}'\n};\n\n/** @const {!dateIntervalSymbols.DateIntervalSymbols} */\nexports.DateIntervalSymbols_zu_ZA = dateIntervalSymbols.DateIntervalSymbols_zu;\n\nswitch (goog.LOCALE) {\n  case 'af_NA':\n  case 'af-NA':\n    defaultSymbols = exports.DateIntervalSymbols_af_NA;\n    break;\n  case 'af_ZA':\n  case 'af-ZA':\n    defaultSymbols = exports.DateIntervalSymbols_af_ZA;\n    break;\n  case 'agq':\n    defaultSymbols = exports.DateIntervalSymbols_agq;\n    break;\n  case 'agq_CM':\n  case 'agq-CM':\n    defaultSymbols = exports.DateIntervalSymbols_agq_CM;\n    break;\n  case 'ak':\n    defaultSymbols = exports.DateIntervalSymbols_ak;\n    break;\n  case 'ak_GH':\n  case 'ak-GH':\n    defaultSymbols = exports.DateIntervalSymbols_ak_GH;\n    break;\n  case 'am_ET':\n  case 'am-ET':\n    defaultSymbols = exports.DateIntervalSymbols_am_ET;\n    break;\n  case 'ar_001':\n  case 'ar-001':\n    defaultSymbols = exports.DateIntervalSymbols_ar_001;\n    break;\n  case 'ar_AE':\n  case 'ar-AE':\n    defaultSymbols = exports.DateIntervalSymbols_ar_AE;\n    break;\n  case 'ar_BH':\n  case 'ar-BH':\n    defaultSymbols = exports.DateIntervalSymbols_ar_BH;\n    break;\n  case 'ar_DJ':\n  case 'ar-DJ':\n    defaultSymbols = exports.DateIntervalSymbols_ar_DJ;\n    break;\n  case 'ar_EH':\n  case 'ar-EH':\n    defaultSymbols = exports.DateIntervalSymbols_ar_EH;\n    break;\n  case 'ar_ER':\n  case 'ar-ER':\n    defaultSymbols = exports.DateIntervalSymbols_ar_ER;\n    break;\n  case 'ar_IL':\n  case 'ar-IL':\n    defaultSymbols = exports.DateIntervalSymbols_ar_IL;\n    break;\n  case 'ar_IQ':\n  case 'ar-IQ':\n    defaultSymbols = exports.DateIntervalSymbols_ar_IQ;\n    break;\n  case 'ar_JO':\n  case 'ar-JO':\n    defaultSymbols = exports.DateIntervalSymbols_ar_JO;\n    break;\n  case 'ar_KM':\n  case 'ar-KM':\n    defaultSymbols = exports.DateIntervalSymbols_ar_KM;\n    break;\n  case 'ar_KW':\n  case 'ar-KW':\n    defaultSymbols = exports.DateIntervalSymbols_ar_KW;\n    break;\n  case 'ar_LB':\n  case 'ar-LB':\n    defaultSymbols = exports.DateIntervalSymbols_ar_LB;\n    break;\n  case 'ar_LY':\n  case 'ar-LY':\n    defaultSymbols = exports.DateIntervalSymbols_ar_LY;\n    break;\n  case 'ar_MA':\n  case 'ar-MA':\n    defaultSymbols = exports.DateIntervalSymbols_ar_MA;\n    break;\n  case 'ar_MR':\n  case 'ar-MR':\n    defaultSymbols = exports.DateIntervalSymbols_ar_MR;\n    break;\n  case 'ar_OM':\n  case 'ar-OM':\n    defaultSymbols = exports.DateIntervalSymbols_ar_OM;\n    break;\n  case 'ar_PS':\n  case 'ar-PS':\n    defaultSymbols = exports.DateIntervalSymbols_ar_PS;\n    break;\n  case 'ar_QA':\n  case 'ar-QA':\n    defaultSymbols = exports.DateIntervalSymbols_ar_QA;\n    break;\n  case 'ar_SA':\n  case 'ar-SA':\n    defaultSymbols = exports.DateIntervalSymbols_ar_SA;\n    break;\n  case 'ar_SD':\n  case 'ar-SD':\n    defaultSymbols = exports.DateIntervalSymbols_ar_SD;\n    break;\n  case 'ar_SO':\n  case 'ar-SO':\n    defaultSymbols = exports.DateIntervalSymbols_ar_SO;\n    break;\n  case 'ar_SS':\n  case 'ar-SS':\n    defaultSymbols = exports.DateIntervalSymbols_ar_SS;\n    break;\n  case 'ar_SY':\n  case 'ar-SY':\n    defaultSymbols = exports.DateIntervalSymbols_ar_SY;\n    break;\n  case 'ar_TD':\n  case 'ar-TD':\n    defaultSymbols = exports.DateIntervalSymbols_ar_TD;\n    break;\n  case 'ar_TN':\n  case 'ar-TN':\n    defaultSymbols = exports.DateIntervalSymbols_ar_TN;\n    break;\n  case 'ar_XB':\n  case 'ar-XB':\n    defaultSymbols = exports.DateIntervalSymbols_ar_XB;\n    break;\n  case 'ar_YE':\n  case 'ar-YE':\n    defaultSymbols = exports.DateIntervalSymbols_ar_YE;\n    break;\n  case 'as':\n    defaultSymbols = exports.DateIntervalSymbols_as;\n    break;\n  case 'as_IN':\n  case 'as-IN':\n    defaultSymbols = exports.DateIntervalSymbols_as_IN;\n    break;\n  case 'asa':\n    defaultSymbols = exports.DateIntervalSymbols_asa;\n    break;\n  case 'asa_TZ':\n  case 'asa-TZ':\n    defaultSymbols = exports.DateIntervalSymbols_asa_TZ;\n    break;\n  case 'ast':\n    defaultSymbols = exports.DateIntervalSymbols_ast;\n    break;\n  case 'ast_ES':\n  case 'ast-ES':\n    defaultSymbols = exports.DateIntervalSymbols_ast_ES;\n    break;\n  case 'az_Cyrl':\n  case 'az-Cyrl':\n    defaultSymbols = exports.DateIntervalSymbols_az_Cyrl;\n    break;\n  case 'az_Cyrl_AZ':\n  case 'az-Cyrl-AZ':\n    defaultSymbols = exports.DateIntervalSymbols_az_Cyrl_AZ;\n    break;\n  case 'az_Latn':\n  case 'az-Latn':\n    defaultSymbols = exports.DateIntervalSymbols_az_Latn;\n    break;\n  case 'az_Latn_AZ':\n  case 'az-Latn-AZ':\n    defaultSymbols = exports.DateIntervalSymbols_az_Latn_AZ;\n    break;\n  case 'bas':\n    defaultSymbols = exports.DateIntervalSymbols_bas;\n    break;\n  case 'bas_CM':\n  case 'bas-CM':\n    defaultSymbols = exports.DateIntervalSymbols_bas_CM;\n    break;\n  case 'be_BY':\n  case 'be-BY':\n    defaultSymbols = exports.DateIntervalSymbols_be_BY;\n    break;\n  case 'bem':\n    defaultSymbols = exports.DateIntervalSymbols_bem;\n    break;\n  case 'bem_ZM':\n  case 'bem-ZM':\n    defaultSymbols = exports.DateIntervalSymbols_bem_ZM;\n    break;\n  case 'bez':\n    defaultSymbols = exports.DateIntervalSymbols_bez;\n    break;\n  case 'bez_TZ':\n  case 'bez-TZ':\n    defaultSymbols = exports.DateIntervalSymbols_bez_TZ;\n    break;\n  case 'bg_BG':\n  case 'bg-BG':\n    defaultSymbols = exports.DateIntervalSymbols_bg_BG;\n    break;\n  case 'bm':\n    defaultSymbols = exports.DateIntervalSymbols_bm;\n    break;\n  case 'bm_ML':\n  case 'bm-ML':\n    defaultSymbols = exports.DateIntervalSymbols_bm_ML;\n    break;\n  case 'bn_BD':\n  case 'bn-BD':\n    defaultSymbols = exports.DateIntervalSymbols_bn_BD;\n    break;\n  case 'bn_IN':\n  case 'bn-IN':\n    defaultSymbols = exports.DateIntervalSymbols_bn_IN;\n    break;\n  case 'bo':\n    defaultSymbols = exports.DateIntervalSymbols_bo;\n    break;\n  case 'bo_CN':\n  case 'bo-CN':\n    defaultSymbols = exports.DateIntervalSymbols_bo_CN;\n    break;\n  case 'bo_IN':\n  case 'bo-IN':\n    defaultSymbols = exports.DateIntervalSymbols_bo_IN;\n    break;\n  case 'br_FR':\n  case 'br-FR':\n    defaultSymbols = exports.DateIntervalSymbols_br_FR;\n    break;\n  case 'brx':\n    defaultSymbols = exports.DateIntervalSymbols_brx;\n    break;\n  case 'brx_IN':\n  case 'brx-IN':\n    defaultSymbols = exports.DateIntervalSymbols_brx_IN;\n    break;\n  case 'bs_Cyrl':\n  case 'bs-Cyrl':\n    defaultSymbols = exports.DateIntervalSymbols_bs_Cyrl;\n    break;\n  case 'bs_Cyrl_BA':\n  case 'bs-Cyrl-BA':\n    defaultSymbols = exports.DateIntervalSymbols_bs_Cyrl_BA;\n    break;\n  case 'bs_Latn':\n  case 'bs-Latn':\n    defaultSymbols = exports.DateIntervalSymbols_bs_Latn;\n    break;\n  case 'bs_Latn_BA':\n  case 'bs-Latn-BA':\n    defaultSymbols = exports.DateIntervalSymbols_bs_Latn_BA;\n    break;\n  case 'ca_AD':\n  case 'ca-AD':\n    defaultSymbols = exports.DateIntervalSymbols_ca_AD;\n    break;\n  case 'ca_ES':\n  case 'ca-ES':\n    defaultSymbols = exports.DateIntervalSymbols_ca_ES;\n    break;\n  case 'ca_FR':\n  case 'ca-FR':\n    defaultSymbols = exports.DateIntervalSymbols_ca_FR;\n    break;\n  case 'ca_IT':\n  case 'ca-IT':\n    defaultSymbols = exports.DateIntervalSymbols_ca_IT;\n    break;\n  case 'ccp':\n    defaultSymbols = exports.DateIntervalSymbols_ccp;\n    break;\n  case 'ccp_BD':\n  case 'ccp-BD':\n    defaultSymbols = exports.DateIntervalSymbols_ccp_BD;\n    break;\n  case 'ccp_IN':\n  case 'ccp-IN':\n    defaultSymbols = exports.DateIntervalSymbols_ccp_IN;\n    break;\n  case 'ce':\n    defaultSymbols = exports.DateIntervalSymbols_ce;\n    break;\n  case 'ce_RU':\n  case 'ce-RU':\n    defaultSymbols = exports.DateIntervalSymbols_ce_RU;\n    break;\n  case 'ceb':\n    defaultSymbols = exports.DateIntervalSymbols_ceb;\n    break;\n  case 'ceb_PH':\n  case 'ceb-PH':\n    defaultSymbols = exports.DateIntervalSymbols_ceb_PH;\n    break;\n  case 'cgg':\n    defaultSymbols = exports.DateIntervalSymbols_cgg;\n    break;\n  case 'cgg_UG':\n  case 'cgg-UG':\n    defaultSymbols = exports.DateIntervalSymbols_cgg_UG;\n    break;\n  case 'chr_US':\n  case 'chr-US':\n    defaultSymbols = exports.DateIntervalSymbols_chr_US;\n    break;\n  case 'ckb':\n    defaultSymbols = exports.DateIntervalSymbols_ckb;\n    break;\n  case 'ckb_IQ':\n  case 'ckb-IQ':\n    defaultSymbols = exports.DateIntervalSymbols_ckb_IQ;\n    break;\n  case 'ckb_IR':\n  case 'ckb-IR':\n    defaultSymbols = exports.DateIntervalSymbols_ckb_IR;\n    break;\n  case 'cs_CZ':\n  case 'cs-CZ':\n    defaultSymbols = exports.DateIntervalSymbols_cs_CZ;\n    break;\n  case 'cy_GB':\n  case 'cy-GB':\n    defaultSymbols = exports.DateIntervalSymbols_cy_GB;\n    break;\n  case 'da_DK':\n  case 'da-DK':\n    defaultSymbols = exports.DateIntervalSymbols_da_DK;\n    break;\n  case 'da_GL':\n  case 'da-GL':\n    defaultSymbols = exports.DateIntervalSymbols_da_GL;\n    break;\n  case 'dav':\n    defaultSymbols = exports.DateIntervalSymbols_dav;\n    break;\n  case 'dav_KE':\n  case 'dav-KE':\n    defaultSymbols = exports.DateIntervalSymbols_dav_KE;\n    break;\n  case 'de_BE':\n  case 'de-BE':\n    defaultSymbols = exports.DateIntervalSymbols_de_BE;\n    break;\n  case 'de_DE':\n  case 'de-DE':\n    defaultSymbols = exports.DateIntervalSymbols_de_DE;\n    break;\n  case 'de_IT':\n  case 'de-IT':\n    defaultSymbols = exports.DateIntervalSymbols_de_IT;\n    break;\n  case 'de_LI':\n  case 'de-LI':\n    defaultSymbols = exports.DateIntervalSymbols_de_LI;\n    break;\n  case 'de_LU':\n  case 'de-LU':\n    defaultSymbols = exports.DateIntervalSymbols_de_LU;\n    break;\n  case 'dje':\n    defaultSymbols = exports.DateIntervalSymbols_dje;\n    break;\n  case 'dje_NE':\n  case 'dje-NE':\n    defaultSymbols = exports.DateIntervalSymbols_dje_NE;\n    break;\n  case 'dsb':\n    defaultSymbols = exports.DateIntervalSymbols_dsb;\n    break;\n  case 'dsb_DE':\n  case 'dsb-DE':\n    defaultSymbols = exports.DateIntervalSymbols_dsb_DE;\n    break;\n  case 'dua':\n    defaultSymbols = exports.DateIntervalSymbols_dua;\n    break;\n  case 'dua_CM':\n  case 'dua-CM':\n    defaultSymbols = exports.DateIntervalSymbols_dua_CM;\n    break;\n  case 'dyo':\n    defaultSymbols = exports.DateIntervalSymbols_dyo;\n    break;\n  case 'dyo_SN':\n  case 'dyo-SN':\n    defaultSymbols = exports.DateIntervalSymbols_dyo_SN;\n    break;\n  case 'dz':\n    defaultSymbols = exports.DateIntervalSymbols_dz;\n    break;\n  case 'dz_BT':\n  case 'dz-BT':\n    defaultSymbols = exports.DateIntervalSymbols_dz_BT;\n    break;\n  case 'ebu':\n    defaultSymbols = exports.DateIntervalSymbols_ebu;\n    break;\n  case 'ebu_KE':\n  case 'ebu-KE':\n    defaultSymbols = exports.DateIntervalSymbols_ebu_KE;\n    break;\n  case 'ee':\n    defaultSymbols = exports.DateIntervalSymbols_ee;\n    break;\n  case 'ee_GH':\n  case 'ee-GH':\n    defaultSymbols = exports.DateIntervalSymbols_ee_GH;\n    break;\n  case 'ee_TG':\n  case 'ee-TG':\n    defaultSymbols = exports.DateIntervalSymbols_ee_TG;\n    break;\n  case 'el_CY':\n  case 'el-CY':\n    defaultSymbols = exports.DateIntervalSymbols_el_CY;\n    break;\n  case 'el_GR':\n  case 'el-GR':\n    defaultSymbols = exports.DateIntervalSymbols_el_GR;\n    break;\n  case 'en_001':\n  case 'en-001':\n    defaultSymbols = exports.DateIntervalSymbols_en_001;\n    break;\n  case 'en_150':\n  case 'en-150':\n    defaultSymbols = exports.DateIntervalSymbols_en_150;\n    break;\n  case 'en_AE':\n  case 'en-AE':\n    defaultSymbols = exports.DateIntervalSymbols_en_AE;\n    break;\n  case 'en_AG':\n  case 'en-AG':\n    defaultSymbols = exports.DateIntervalSymbols_en_AG;\n    break;\n  case 'en_AI':\n  case 'en-AI':\n    defaultSymbols = exports.DateIntervalSymbols_en_AI;\n    break;\n  case 'en_AS':\n  case 'en-AS':\n    defaultSymbols = exports.DateIntervalSymbols_en_AS;\n    break;\n  case 'en_AT':\n  case 'en-AT':\n    defaultSymbols = exports.DateIntervalSymbols_en_AT;\n    break;\n  case 'en_BB':\n  case 'en-BB':\n    defaultSymbols = exports.DateIntervalSymbols_en_BB;\n    break;\n  case 'en_BE':\n  case 'en-BE':\n    defaultSymbols = exports.DateIntervalSymbols_en_BE;\n    break;\n  case 'en_BI':\n  case 'en-BI':\n    defaultSymbols = exports.DateIntervalSymbols_en_BI;\n    break;\n  case 'en_BM':\n  case 'en-BM':\n    defaultSymbols = exports.DateIntervalSymbols_en_BM;\n    break;\n  case 'en_BS':\n  case 'en-BS':\n    defaultSymbols = exports.DateIntervalSymbols_en_BS;\n    break;\n  case 'en_BW':\n  case 'en-BW':\n    defaultSymbols = exports.DateIntervalSymbols_en_BW;\n    break;\n  case 'en_BZ':\n  case 'en-BZ':\n    defaultSymbols = exports.DateIntervalSymbols_en_BZ;\n    break;\n  case 'en_CC':\n  case 'en-CC':\n    defaultSymbols = exports.DateIntervalSymbols_en_CC;\n    break;\n  case 'en_CH':\n  case 'en-CH':\n    defaultSymbols = exports.DateIntervalSymbols_en_CH;\n    break;\n  case 'en_CK':\n  case 'en-CK':\n    defaultSymbols = exports.DateIntervalSymbols_en_CK;\n    break;\n  case 'en_CM':\n  case 'en-CM':\n    defaultSymbols = exports.DateIntervalSymbols_en_CM;\n    break;\n  case 'en_CX':\n  case 'en-CX':\n    defaultSymbols = exports.DateIntervalSymbols_en_CX;\n    break;\n  case 'en_CY':\n  case 'en-CY':\n    defaultSymbols = exports.DateIntervalSymbols_en_CY;\n    break;\n  case 'en_DE':\n  case 'en-DE':\n    defaultSymbols = exports.DateIntervalSymbols_en_DE;\n    break;\n  case 'en_DG':\n  case 'en-DG':\n    defaultSymbols = exports.DateIntervalSymbols_en_DG;\n    break;\n  case 'en_DK':\n  case 'en-DK':\n    defaultSymbols = exports.DateIntervalSymbols_en_DK;\n    break;\n  case 'en_DM':\n  case 'en-DM':\n    defaultSymbols = exports.DateIntervalSymbols_en_DM;\n    break;\n  case 'en_ER':\n  case 'en-ER':\n    defaultSymbols = exports.DateIntervalSymbols_en_ER;\n    break;\n  case 'en_FI':\n  case 'en-FI':\n    defaultSymbols = exports.DateIntervalSymbols_en_FI;\n    break;\n  case 'en_FJ':\n  case 'en-FJ':\n    defaultSymbols = exports.DateIntervalSymbols_en_FJ;\n    break;\n  case 'en_FK':\n  case 'en-FK':\n    defaultSymbols = exports.DateIntervalSymbols_en_FK;\n    break;\n  case 'en_FM':\n  case 'en-FM':\n    defaultSymbols = exports.DateIntervalSymbols_en_FM;\n    break;\n  case 'en_GD':\n  case 'en-GD':\n    defaultSymbols = exports.DateIntervalSymbols_en_GD;\n    break;\n  case 'en_GG':\n  case 'en-GG':\n    defaultSymbols = exports.DateIntervalSymbols_en_GG;\n    break;\n  case 'en_GH':\n  case 'en-GH':\n    defaultSymbols = exports.DateIntervalSymbols_en_GH;\n    break;\n  case 'en_GI':\n  case 'en-GI':\n    defaultSymbols = exports.DateIntervalSymbols_en_GI;\n    break;\n  case 'en_GM':\n  case 'en-GM':\n    defaultSymbols = exports.DateIntervalSymbols_en_GM;\n    break;\n  case 'en_GU':\n  case 'en-GU':\n    defaultSymbols = exports.DateIntervalSymbols_en_GU;\n    break;\n  case 'en_GY':\n  case 'en-GY':\n    defaultSymbols = exports.DateIntervalSymbols_en_GY;\n    break;\n  case 'en_HK':\n  case 'en-HK':\n    defaultSymbols = exports.DateIntervalSymbols_en_HK;\n    break;\n  case 'en_IL':\n  case 'en-IL':\n    defaultSymbols = exports.DateIntervalSymbols_en_IL;\n    break;\n  case 'en_IM':\n  case 'en-IM':\n    defaultSymbols = exports.DateIntervalSymbols_en_IM;\n    break;\n  case 'en_IO':\n  case 'en-IO':\n    defaultSymbols = exports.DateIntervalSymbols_en_IO;\n    break;\n  case 'en_JE':\n  case 'en-JE':\n    defaultSymbols = exports.DateIntervalSymbols_en_JE;\n    break;\n  case 'en_JM':\n  case 'en-JM':\n    defaultSymbols = exports.DateIntervalSymbols_en_JM;\n    break;\n  case 'en_KE':\n  case 'en-KE':\n    defaultSymbols = exports.DateIntervalSymbols_en_KE;\n    break;\n  case 'en_KI':\n  case 'en-KI':\n    defaultSymbols = exports.DateIntervalSymbols_en_KI;\n    break;\n  case 'en_KN':\n  case 'en-KN':\n    defaultSymbols = exports.DateIntervalSymbols_en_KN;\n    break;\n  case 'en_KY':\n  case 'en-KY':\n    defaultSymbols = exports.DateIntervalSymbols_en_KY;\n    break;\n  case 'en_LC':\n  case 'en-LC':\n    defaultSymbols = exports.DateIntervalSymbols_en_LC;\n    break;\n  case 'en_LR':\n  case 'en-LR':\n    defaultSymbols = exports.DateIntervalSymbols_en_LR;\n    break;\n  case 'en_LS':\n  case 'en-LS':\n    defaultSymbols = exports.DateIntervalSymbols_en_LS;\n    break;\n  case 'en_MG':\n  case 'en-MG':\n    defaultSymbols = exports.DateIntervalSymbols_en_MG;\n    break;\n  case 'en_MH':\n  case 'en-MH':\n    defaultSymbols = exports.DateIntervalSymbols_en_MH;\n    break;\n  case 'en_MO':\n  case 'en-MO':\n    defaultSymbols = exports.DateIntervalSymbols_en_MO;\n    break;\n  case 'en_MP':\n  case 'en-MP':\n    defaultSymbols = exports.DateIntervalSymbols_en_MP;\n    break;\n  case 'en_MS':\n  case 'en-MS':\n    defaultSymbols = exports.DateIntervalSymbols_en_MS;\n    break;\n  case 'en_MT':\n  case 'en-MT':\n    defaultSymbols = exports.DateIntervalSymbols_en_MT;\n    break;\n  case 'en_MU':\n  case 'en-MU':\n    defaultSymbols = exports.DateIntervalSymbols_en_MU;\n    break;\n  case 'en_MW':\n  case 'en-MW':\n    defaultSymbols = exports.DateIntervalSymbols_en_MW;\n    break;\n  case 'en_MY':\n  case 'en-MY':\n    defaultSymbols = exports.DateIntervalSymbols_en_MY;\n    break;\n  case 'en_NA':\n  case 'en-NA':\n    defaultSymbols = exports.DateIntervalSymbols_en_NA;\n    break;\n  case 'en_NF':\n  case 'en-NF':\n    defaultSymbols = exports.DateIntervalSymbols_en_NF;\n    break;\n  case 'en_NG':\n  case 'en-NG':\n    defaultSymbols = exports.DateIntervalSymbols_en_NG;\n    break;\n  case 'en_NL':\n  case 'en-NL':\n    defaultSymbols = exports.DateIntervalSymbols_en_NL;\n    break;\n  case 'en_NR':\n  case 'en-NR':\n    defaultSymbols = exports.DateIntervalSymbols_en_NR;\n    break;\n  case 'en_NU':\n  case 'en-NU':\n    defaultSymbols = exports.DateIntervalSymbols_en_NU;\n    break;\n  case 'en_NZ':\n  case 'en-NZ':\n    defaultSymbols = exports.DateIntervalSymbols_en_NZ;\n    break;\n  case 'en_PG':\n  case 'en-PG':\n    defaultSymbols = exports.DateIntervalSymbols_en_PG;\n    break;\n  case 'en_PH':\n  case 'en-PH':\n    defaultSymbols = exports.DateIntervalSymbols_en_PH;\n    break;\n  case 'en_PK':\n  case 'en-PK':\n    defaultSymbols = exports.DateIntervalSymbols_en_PK;\n    break;\n  case 'en_PN':\n  case 'en-PN':\n    defaultSymbols = exports.DateIntervalSymbols_en_PN;\n    break;\n  case 'en_PR':\n  case 'en-PR':\n    defaultSymbols = exports.DateIntervalSymbols_en_PR;\n    break;\n  case 'en_PW':\n  case 'en-PW':\n    defaultSymbols = exports.DateIntervalSymbols_en_PW;\n    break;\n  case 'en_RW':\n  case 'en-RW':\n    defaultSymbols = exports.DateIntervalSymbols_en_RW;\n    break;\n  case 'en_SB':\n  case 'en-SB':\n    defaultSymbols = exports.DateIntervalSymbols_en_SB;\n    break;\n  case 'en_SC':\n  case 'en-SC':\n    defaultSymbols = exports.DateIntervalSymbols_en_SC;\n    break;\n  case 'en_SD':\n  case 'en-SD':\n    defaultSymbols = exports.DateIntervalSymbols_en_SD;\n    break;\n  case 'en_SE':\n  case 'en-SE':\n    defaultSymbols = exports.DateIntervalSymbols_en_SE;\n    break;\n  case 'en_SH':\n  case 'en-SH':\n    defaultSymbols = exports.DateIntervalSymbols_en_SH;\n    break;\n  case 'en_SI':\n  case 'en-SI':\n    defaultSymbols = exports.DateIntervalSymbols_en_SI;\n    break;\n  case 'en_SL':\n  case 'en-SL':\n    defaultSymbols = exports.DateIntervalSymbols_en_SL;\n    break;\n  case 'en_SS':\n  case 'en-SS':\n    defaultSymbols = exports.DateIntervalSymbols_en_SS;\n    break;\n  case 'en_SX':\n  case 'en-SX':\n    defaultSymbols = exports.DateIntervalSymbols_en_SX;\n    break;\n  case 'en_SZ':\n  case 'en-SZ':\n    defaultSymbols = exports.DateIntervalSymbols_en_SZ;\n    break;\n  case 'en_TC':\n  case 'en-TC':\n    defaultSymbols = exports.DateIntervalSymbols_en_TC;\n    break;\n  case 'en_TK':\n  case 'en-TK':\n    defaultSymbols = exports.DateIntervalSymbols_en_TK;\n    break;\n  case 'en_TO':\n  case 'en-TO':\n    defaultSymbols = exports.DateIntervalSymbols_en_TO;\n    break;\n  case 'en_TT':\n  case 'en-TT':\n    defaultSymbols = exports.DateIntervalSymbols_en_TT;\n    break;\n  case 'en_TV':\n  case 'en-TV':\n    defaultSymbols = exports.DateIntervalSymbols_en_TV;\n    break;\n  case 'en_TZ':\n  case 'en-TZ':\n    defaultSymbols = exports.DateIntervalSymbols_en_TZ;\n    break;\n  case 'en_UG':\n  case 'en-UG':\n    defaultSymbols = exports.DateIntervalSymbols_en_UG;\n    break;\n  case 'en_UM':\n  case 'en-UM':\n    defaultSymbols = exports.DateIntervalSymbols_en_UM;\n    break;\n  case 'en_US_POSIX':\n  case 'en-US-POSIX':\n    defaultSymbols = exports.DateIntervalSymbols_en_US_POSIX;\n    break;\n  case 'en_VC':\n  case 'en-VC':\n    defaultSymbols = exports.DateIntervalSymbols_en_VC;\n    break;\n  case 'en_VG':\n  case 'en-VG':\n    defaultSymbols = exports.DateIntervalSymbols_en_VG;\n    break;\n  case 'en_VI':\n  case 'en-VI':\n    defaultSymbols = exports.DateIntervalSymbols_en_VI;\n    break;\n  case 'en_VU':\n  case 'en-VU':\n    defaultSymbols = exports.DateIntervalSymbols_en_VU;\n    break;\n  case 'en_WS':\n  case 'en-WS':\n    defaultSymbols = exports.DateIntervalSymbols_en_WS;\n    break;\n  case 'en_XA':\n  case 'en-XA':\n    defaultSymbols = exports.DateIntervalSymbols_en_XA;\n    break;\n  case 'en_ZM':\n  case 'en-ZM':\n    defaultSymbols = exports.DateIntervalSymbols_en_ZM;\n    break;\n  case 'en_ZW':\n  case 'en-ZW':\n    defaultSymbols = exports.DateIntervalSymbols_en_ZW;\n    break;\n  case 'eo':\n    defaultSymbols = exports.DateIntervalSymbols_eo;\n    break;\n  case 'eo_001':\n  case 'eo-001':\n    defaultSymbols = exports.DateIntervalSymbols_eo_001;\n    break;\n  case 'es_AR':\n  case 'es-AR':\n    defaultSymbols = exports.DateIntervalSymbols_es_AR;\n    break;\n  case 'es_BO':\n  case 'es-BO':\n    defaultSymbols = exports.DateIntervalSymbols_es_BO;\n    break;\n  case 'es_BR':\n  case 'es-BR':\n    defaultSymbols = exports.DateIntervalSymbols_es_BR;\n    break;\n  case 'es_BZ':\n  case 'es-BZ':\n    defaultSymbols = exports.DateIntervalSymbols_es_BZ;\n    break;\n  case 'es_CL':\n  case 'es-CL':\n    defaultSymbols = exports.DateIntervalSymbols_es_CL;\n    break;\n  case 'es_CO':\n  case 'es-CO':\n    defaultSymbols = exports.DateIntervalSymbols_es_CO;\n    break;\n  case 'es_CR':\n  case 'es-CR':\n    defaultSymbols = exports.DateIntervalSymbols_es_CR;\n    break;\n  case 'es_CU':\n  case 'es-CU':\n    defaultSymbols = exports.DateIntervalSymbols_es_CU;\n    break;\n  case 'es_DO':\n  case 'es-DO':\n    defaultSymbols = exports.DateIntervalSymbols_es_DO;\n    break;\n  case 'es_EA':\n  case 'es-EA':\n    defaultSymbols = exports.DateIntervalSymbols_es_EA;\n    break;\n  case 'es_EC':\n  case 'es-EC':\n    defaultSymbols = exports.DateIntervalSymbols_es_EC;\n    break;\n  case 'es_GQ':\n  case 'es-GQ':\n    defaultSymbols = exports.DateIntervalSymbols_es_GQ;\n    break;\n  case 'es_GT':\n  case 'es-GT':\n    defaultSymbols = exports.DateIntervalSymbols_es_GT;\n    break;\n  case 'es_HN':\n  case 'es-HN':\n    defaultSymbols = exports.DateIntervalSymbols_es_HN;\n    break;\n  case 'es_IC':\n  case 'es-IC':\n    defaultSymbols = exports.DateIntervalSymbols_es_IC;\n    break;\n  case 'es_NI':\n  case 'es-NI':\n    defaultSymbols = exports.DateIntervalSymbols_es_NI;\n    break;\n  case 'es_PA':\n  case 'es-PA':\n    defaultSymbols = exports.DateIntervalSymbols_es_PA;\n    break;\n  case 'es_PE':\n  case 'es-PE':\n    defaultSymbols = exports.DateIntervalSymbols_es_PE;\n    break;\n  case 'es_PH':\n  case 'es-PH':\n    defaultSymbols = exports.DateIntervalSymbols_es_PH;\n    break;\n  case 'es_PR':\n  case 'es-PR':\n    defaultSymbols = exports.DateIntervalSymbols_es_PR;\n    break;\n  case 'es_PY':\n  case 'es-PY':\n    defaultSymbols = exports.DateIntervalSymbols_es_PY;\n    break;\n  case 'es_SV':\n  case 'es-SV':\n    defaultSymbols = exports.DateIntervalSymbols_es_SV;\n    break;\n  case 'es_UY':\n  case 'es-UY':\n    defaultSymbols = exports.DateIntervalSymbols_es_UY;\n    break;\n  case 'es_VE':\n  case 'es-VE':\n    defaultSymbols = exports.DateIntervalSymbols_es_VE;\n    break;\n  case 'et_EE':\n  case 'et-EE':\n    defaultSymbols = exports.DateIntervalSymbols_et_EE;\n    break;\n  case 'eu_ES':\n  case 'eu-ES':\n    defaultSymbols = exports.DateIntervalSymbols_eu_ES;\n    break;\n  case 'ewo':\n    defaultSymbols = exports.DateIntervalSymbols_ewo;\n    break;\n  case 'ewo_CM':\n  case 'ewo-CM':\n    defaultSymbols = exports.DateIntervalSymbols_ewo_CM;\n    break;\n  case 'fa_AF':\n  case 'fa-AF':\n    defaultSymbols = exports.DateIntervalSymbols_fa_AF;\n    break;\n  case 'fa_IR':\n  case 'fa-IR':\n    defaultSymbols = exports.DateIntervalSymbols_fa_IR;\n    break;\n  case 'ff':\n    defaultSymbols = exports.DateIntervalSymbols_ff;\n    break;\n  case 'ff_Latn':\n  case 'ff-Latn':\n    defaultSymbols = exports.DateIntervalSymbols_ff_Latn;\n    break;\n  case 'ff_Latn_BF':\n  case 'ff-Latn-BF':\n    defaultSymbols = exports.DateIntervalSymbols_ff_Latn_BF;\n    break;\n  case 'ff_Latn_CM':\n  case 'ff-Latn-CM':\n    defaultSymbols = exports.DateIntervalSymbols_ff_Latn_CM;\n    break;\n  case 'ff_Latn_GH':\n  case 'ff-Latn-GH':\n    defaultSymbols = exports.DateIntervalSymbols_ff_Latn_GH;\n    break;\n  case 'ff_Latn_GM':\n  case 'ff-Latn-GM':\n    defaultSymbols = exports.DateIntervalSymbols_ff_Latn_GM;\n    break;\n  case 'ff_Latn_GN':\n  case 'ff-Latn-GN':\n    defaultSymbols = exports.DateIntervalSymbols_ff_Latn_GN;\n    break;\n  case 'ff_Latn_GW':\n  case 'ff-Latn-GW':\n    defaultSymbols = exports.DateIntervalSymbols_ff_Latn_GW;\n    break;\n  case 'ff_Latn_LR':\n  case 'ff-Latn-LR':\n    defaultSymbols = exports.DateIntervalSymbols_ff_Latn_LR;\n    break;\n  case 'ff_Latn_MR':\n  case 'ff-Latn-MR':\n    defaultSymbols = exports.DateIntervalSymbols_ff_Latn_MR;\n    break;\n  case 'ff_Latn_NE':\n  case 'ff-Latn-NE':\n    defaultSymbols = exports.DateIntervalSymbols_ff_Latn_NE;\n    break;\n  case 'ff_Latn_NG':\n  case 'ff-Latn-NG':\n    defaultSymbols = exports.DateIntervalSymbols_ff_Latn_NG;\n    break;\n  case 'ff_Latn_SL':\n  case 'ff-Latn-SL':\n    defaultSymbols = exports.DateIntervalSymbols_ff_Latn_SL;\n    break;\n  case 'ff_Latn_SN':\n  case 'ff-Latn-SN':\n    defaultSymbols = exports.DateIntervalSymbols_ff_Latn_SN;\n    break;\n  case 'fi_FI':\n  case 'fi-FI':\n    defaultSymbols = exports.DateIntervalSymbols_fi_FI;\n    break;\n  case 'fil_PH':\n  case 'fil-PH':\n    defaultSymbols = exports.DateIntervalSymbols_fil_PH;\n    break;\n  case 'fo':\n    defaultSymbols = exports.DateIntervalSymbols_fo;\n    break;\n  case 'fo_DK':\n  case 'fo-DK':\n    defaultSymbols = exports.DateIntervalSymbols_fo_DK;\n    break;\n  case 'fo_FO':\n  case 'fo-FO':\n    defaultSymbols = exports.DateIntervalSymbols_fo_FO;\n    break;\n  case 'fr_BE':\n  case 'fr-BE':\n    defaultSymbols = exports.DateIntervalSymbols_fr_BE;\n    break;\n  case 'fr_BF':\n  case 'fr-BF':\n    defaultSymbols = exports.DateIntervalSymbols_fr_BF;\n    break;\n  case 'fr_BI':\n  case 'fr-BI':\n    defaultSymbols = exports.DateIntervalSymbols_fr_BI;\n    break;\n  case 'fr_BJ':\n  case 'fr-BJ':\n    defaultSymbols = exports.DateIntervalSymbols_fr_BJ;\n    break;\n  case 'fr_BL':\n  case 'fr-BL':\n    defaultSymbols = exports.DateIntervalSymbols_fr_BL;\n    break;\n  case 'fr_CD':\n  case 'fr-CD':\n    defaultSymbols = exports.DateIntervalSymbols_fr_CD;\n    break;\n  case 'fr_CF':\n  case 'fr-CF':\n    defaultSymbols = exports.DateIntervalSymbols_fr_CF;\n    break;\n  case 'fr_CG':\n  case 'fr-CG':\n    defaultSymbols = exports.DateIntervalSymbols_fr_CG;\n    break;\n  case 'fr_CH':\n  case 'fr-CH':\n    defaultSymbols = exports.DateIntervalSymbols_fr_CH;\n    break;\n  case 'fr_CI':\n  case 'fr-CI':\n    defaultSymbols = exports.DateIntervalSymbols_fr_CI;\n    break;\n  case 'fr_CM':\n  case 'fr-CM':\n    defaultSymbols = exports.DateIntervalSymbols_fr_CM;\n    break;\n  case 'fr_DJ':\n  case 'fr-DJ':\n    defaultSymbols = exports.DateIntervalSymbols_fr_DJ;\n    break;\n  case 'fr_DZ':\n  case 'fr-DZ':\n    defaultSymbols = exports.DateIntervalSymbols_fr_DZ;\n    break;\n  case 'fr_FR':\n  case 'fr-FR':\n    defaultSymbols = exports.DateIntervalSymbols_fr_FR;\n    break;\n  case 'fr_GA':\n  case 'fr-GA':\n    defaultSymbols = exports.DateIntervalSymbols_fr_GA;\n    break;\n  case 'fr_GF':\n  case 'fr-GF':\n    defaultSymbols = exports.DateIntervalSymbols_fr_GF;\n    break;\n  case 'fr_GN':\n  case 'fr-GN':\n    defaultSymbols = exports.DateIntervalSymbols_fr_GN;\n    break;\n  case 'fr_GP':\n  case 'fr-GP':\n    defaultSymbols = exports.DateIntervalSymbols_fr_GP;\n    break;\n  case 'fr_GQ':\n  case 'fr-GQ':\n    defaultSymbols = exports.DateIntervalSymbols_fr_GQ;\n    break;\n  case 'fr_HT':\n  case 'fr-HT':\n    defaultSymbols = exports.DateIntervalSymbols_fr_HT;\n    break;\n  case 'fr_KM':\n  case 'fr-KM':\n    defaultSymbols = exports.DateIntervalSymbols_fr_KM;\n    break;\n  case 'fr_LU':\n  case 'fr-LU':\n    defaultSymbols = exports.DateIntervalSymbols_fr_LU;\n    break;\n  case 'fr_MA':\n  case 'fr-MA':\n    defaultSymbols = exports.DateIntervalSymbols_fr_MA;\n    break;\n  case 'fr_MC':\n  case 'fr-MC':\n    defaultSymbols = exports.DateIntervalSymbols_fr_MC;\n    break;\n  case 'fr_MF':\n  case 'fr-MF':\n    defaultSymbols = exports.DateIntervalSymbols_fr_MF;\n    break;\n  case 'fr_MG':\n  case 'fr-MG':\n    defaultSymbols = exports.DateIntervalSymbols_fr_MG;\n    break;\n  case 'fr_ML':\n  case 'fr-ML':\n    defaultSymbols = exports.DateIntervalSymbols_fr_ML;\n    break;\n  case 'fr_MQ':\n  case 'fr-MQ':\n    defaultSymbols = exports.DateIntervalSymbols_fr_MQ;\n    break;\n  case 'fr_MR':\n  case 'fr-MR':\n    defaultSymbols = exports.DateIntervalSymbols_fr_MR;\n    break;\n  case 'fr_MU':\n  case 'fr-MU':\n    defaultSymbols = exports.DateIntervalSymbols_fr_MU;\n    break;\n  case 'fr_NC':\n  case 'fr-NC':\n    defaultSymbols = exports.DateIntervalSymbols_fr_NC;\n    break;\n  case 'fr_NE':\n  case 'fr-NE':\n    defaultSymbols = exports.DateIntervalSymbols_fr_NE;\n    break;\n  case 'fr_PF':\n  case 'fr-PF':\n    defaultSymbols = exports.DateIntervalSymbols_fr_PF;\n    break;\n  case 'fr_PM':\n  case 'fr-PM':\n    defaultSymbols = exports.DateIntervalSymbols_fr_PM;\n    break;\n  case 'fr_RE':\n  case 'fr-RE':\n    defaultSymbols = exports.DateIntervalSymbols_fr_RE;\n    break;\n  case 'fr_RW':\n  case 'fr-RW':\n    defaultSymbols = exports.DateIntervalSymbols_fr_RW;\n    break;\n  case 'fr_SC':\n  case 'fr-SC':\n    defaultSymbols = exports.DateIntervalSymbols_fr_SC;\n    break;\n  case 'fr_SN':\n  case 'fr-SN':\n    defaultSymbols = exports.DateIntervalSymbols_fr_SN;\n    break;\n  case 'fr_SY':\n  case 'fr-SY':\n    defaultSymbols = exports.DateIntervalSymbols_fr_SY;\n    break;\n  case 'fr_TD':\n  case 'fr-TD':\n    defaultSymbols = exports.DateIntervalSymbols_fr_TD;\n    break;\n  case 'fr_TG':\n  case 'fr-TG':\n    defaultSymbols = exports.DateIntervalSymbols_fr_TG;\n    break;\n  case 'fr_TN':\n  case 'fr-TN':\n    defaultSymbols = exports.DateIntervalSymbols_fr_TN;\n    break;\n  case 'fr_VU':\n  case 'fr-VU':\n    defaultSymbols = exports.DateIntervalSymbols_fr_VU;\n    break;\n  case 'fr_WF':\n  case 'fr-WF':\n    defaultSymbols = exports.DateIntervalSymbols_fr_WF;\n    break;\n  case 'fr_YT':\n  case 'fr-YT':\n    defaultSymbols = exports.DateIntervalSymbols_fr_YT;\n    break;\n  case 'fur':\n    defaultSymbols = exports.DateIntervalSymbols_fur;\n    break;\n  case 'fur_IT':\n  case 'fur-IT':\n    defaultSymbols = exports.DateIntervalSymbols_fur_IT;\n    break;\n  case 'fy':\n    defaultSymbols = exports.DateIntervalSymbols_fy;\n    break;\n  case 'fy_NL':\n  case 'fy-NL':\n    defaultSymbols = exports.DateIntervalSymbols_fy_NL;\n    break;\n  case 'ga_IE':\n  case 'ga-IE':\n    defaultSymbols = exports.DateIntervalSymbols_ga_IE;\n    break;\n  case 'gd':\n    defaultSymbols = exports.DateIntervalSymbols_gd;\n    break;\n  case 'gd_GB':\n  case 'gd-GB':\n    defaultSymbols = exports.DateIntervalSymbols_gd_GB;\n    break;\n  case 'gl_ES':\n  case 'gl-ES':\n    defaultSymbols = exports.DateIntervalSymbols_gl_ES;\n    break;\n  case 'gsw_CH':\n  case 'gsw-CH':\n    defaultSymbols = exports.DateIntervalSymbols_gsw_CH;\n    break;\n  case 'gsw_FR':\n  case 'gsw-FR':\n    defaultSymbols = exports.DateIntervalSymbols_gsw_FR;\n    break;\n  case 'gsw_LI':\n  case 'gsw-LI':\n    defaultSymbols = exports.DateIntervalSymbols_gsw_LI;\n    break;\n  case 'gu_IN':\n  case 'gu-IN':\n    defaultSymbols = exports.DateIntervalSymbols_gu_IN;\n    break;\n  case 'guz':\n    defaultSymbols = exports.DateIntervalSymbols_guz;\n    break;\n  case 'guz_KE':\n  case 'guz-KE':\n    defaultSymbols = exports.DateIntervalSymbols_guz_KE;\n    break;\n  case 'gv':\n    defaultSymbols = exports.DateIntervalSymbols_gv;\n    break;\n  case 'gv_IM':\n  case 'gv-IM':\n    defaultSymbols = exports.DateIntervalSymbols_gv_IM;\n    break;\n  case 'ha':\n    defaultSymbols = exports.DateIntervalSymbols_ha;\n    break;\n  case 'ha_GH':\n  case 'ha-GH':\n    defaultSymbols = exports.DateIntervalSymbols_ha_GH;\n    break;\n  case 'ha_NE':\n  case 'ha-NE':\n    defaultSymbols = exports.DateIntervalSymbols_ha_NE;\n    break;\n  case 'ha_NG':\n  case 'ha-NG':\n    defaultSymbols = exports.DateIntervalSymbols_ha_NG;\n    break;\n  case 'haw_US':\n  case 'haw-US':\n    defaultSymbols = exports.DateIntervalSymbols_haw_US;\n    break;\n  case 'he_IL':\n  case 'he-IL':\n    defaultSymbols = exports.DateIntervalSymbols_he_IL;\n    break;\n  case 'hi_IN':\n  case 'hi-IN':\n    defaultSymbols = exports.DateIntervalSymbols_hi_IN;\n    break;\n  case 'hr_BA':\n  case 'hr-BA':\n    defaultSymbols = exports.DateIntervalSymbols_hr_BA;\n    break;\n  case 'hr_HR':\n  case 'hr-HR':\n    defaultSymbols = exports.DateIntervalSymbols_hr_HR;\n    break;\n  case 'hsb':\n    defaultSymbols = exports.DateIntervalSymbols_hsb;\n    break;\n  case 'hsb_DE':\n  case 'hsb-DE':\n    defaultSymbols = exports.DateIntervalSymbols_hsb_DE;\n    break;\n  case 'hu_HU':\n  case 'hu-HU':\n    defaultSymbols = exports.DateIntervalSymbols_hu_HU;\n    break;\n  case 'hy_AM':\n  case 'hy-AM':\n    defaultSymbols = exports.DateIntervalSymbols_hy_AM;\n    break;\n  case 'ia':\n    defaultSymbols = exports.DateIntervalSymbols_ia;\n    break;\n  case 'ia_001':\n  case 'ia-001':\n    defaultSymbols = exports.DateIntervalSymbols_ia_001;\n    break;\n  case 'id_ID':\n  case 'id-ID':\n    defaultSymbols = exports.DateIntervalSymbols_id_ID;\n    break;\n  case 'ig':\n    defaultSymbols = exports.DateIntervalSymbols_ig;\n    break;\n  case 'ig_NG':\n  case 'ig-NG':\n    defaultSymbols = exports.DateIntervalSymbols_ig_NG;\n    break;\n  case 'ii':\n    defaultSymbols = exports.DateIntervalSymbols_ii;\n    break;\n  case 'ii_CN':\n  case 'ii-CN':\n    defaultSymbols = exports.DateIntervalSymbols_ii_CN;\n    break;\n  case 'is_IS':\n  case 'is-IS':\n    defaultSymbols = exports.DateIntervalSymbols_is_IS;\n    break;\n  case 'it_CH':\n  case 'it-CH':\n    defaultSymbols = exports.DateIntervalSymbols_it_CH;\n    break;\n  case 'it_IT':\n  case 'it-IT':\n    defaultSymbols = exports.DateIntervalSymbols_it_IT;\n    break;\n  case 'it_SM':\n  case 'it-SM':\n    defaultSymbols = exports.DateIntervalSymbols_it_SM;\n    break;\n  case 'it_VA':\n  case 'it-VA':\n    defaultSymbols = exports.DateIntervalSymbols_it_VA;\n    break;\n  case 'ja_JP':\n  case 'ja-JP':\n    defaultSymbols = exports.DateIntervalSymbols_ja_JP;\n    break;\n  case 'jgo':\n    defaultSymbols = exports.DateIntervalSymbols_jgo;\n    break;\n  case 'jgo_CM':\n  case 'jgo-CM':\n    defaultSymbols = exports.DateIntervalSymbols_jgo_CM;\n    break;\n  case 'jmc':\n    defaultSymbols = exports.DateIntervalSymbols_jmc;\n    break;\n  case 'jmc_TZ':\n  case 'jmc-TZ':\n    defaultSymbols = exports.DateIntervalSymbols_jmc_TZ;\n    break;\n  case 'jv':\n    defaultSymbols = exports.DateIntervalSymbols_jv;\n    break;\n  case 'jv_ID':\n  case 'jv-ID':\n    defaultSymbols = exports.DateIntervalSymbols_jv_ID;\n    break;\n  case 'ka_GE':\n  case 'ka-GE':\n    defaultSymbols = exports.DateIntervalSymbols_ka_GE;\n    break;\n  case 'kab':\n    defaultSymbols = exports.DateIntervalSymbols_kab;\n    break;\n  case 'kab_DZ':\n  case 'kab-DZ':\n    defaultSymbols = exports.DateIntervalSymbols_kab_DZ;\n    break;\n  case 'kam':\n    defaultSymbols = exports.DateIntervalSymbols_kam;\n    break;\n  case 'kam_KE':\n  case 'kam-KE':\n    defaultSymbols = exports.DateIntervalSymbols_kam_KE;\n    break;\n  case 'kde':\n    defaultSymbols = exports.DateIntervalSymbols_kde;\n    break;\n  case 'kde_TZ':\n  case 'kde-TZ':\n    defaultSymbols = exports.DateIntervalSymbols_kde_TZ;\n    break;\n  case 'kea':\n    defaultSymbols = exports.DateIntervalSymbols_kea;\n    break;\n  case 'kea_CV':\n  case 'kea-CV':\n    defaultSymbols = exports.DateIntervalSymbols_kea_CV;\n    break;\n  case 'khq':\n    defaultSymbols = exports.DateIntervalSymbols_khq;\n    break;\n  case 'khq_ML':\n  case 'khq-ML':\n    defaultSymbols = exports.DateIntervalSymbols_khq_ML;\n    break;\n  case 'ki':\n    defaultSymbols = exports.DateIntervalSymbols_ki;\n    break;\n  case 'ki_KE':\n  case 'ki-KE':\n    defaultSymbols = exports.DateIntervalSymbols_ki_KE;\n    break;\n  case 'kk_KZ':\n  case 'kk-KZ':\n    defaultSymbols = exports.DateIntervalSymbols_kk_KZ;\n    break;\n  case 'kkj':\n    defaultSymbols = exports.DateIntervalSymbols_kkj;\n    break;\n  case 'kkj_CM':\n  case 'kkj-CM':\n    defaultSymbols = exports.DateIntervalSymbols_kkj_CM;\n    break;\n  case 'kl':\n    defaultSymbols = exports.DateIntervalSymbols_kl;\n    break;\n  case 'kl_GL':\n  case 'kl-GL':\n    defaultSymbols = exports.DateIntervalSymbols_kl_GL;\n    break;\n  case 'kln':\n    defaultSymbols = exports.DateIntervalSymbols_kln;\n    break;\n  case 'kln_KE':\n  case 'kln-KE':\n    defaultSymbols = exports.DateIntervalSymbols_kln_KE;\n    break;\n  case 'km_KH':\n  case 'km-KH':\n    defaultSymbols = exports.DateIntervalSymbols_km_KH;\n    break;\n  case 'kn_IN':\n  case 'kn-IN':\n    defaultSymbols = exports.DateIntervalSymbols_kn_IN;\n    break;\n  case 'ko_KP':\n  case 'ko-KP':\n    defaultSymbols = exports.DateIntervalSymbols_ko_KP;\n    break;\n  case 'ko_KR':\n  case 'ko-KR':\n    defaultSymbols = exports.DateIntervalSymbols_ko_KR;\n    break;\n  case 'kok':\n    defaultSymbols = exports.DateIntervalSymbols_kok;\n    break;\n  case 'kok_IN':\n  case 'kok-IN':\n    defaultSymbols = exports.DateIntervalSymbols_kok_IN;\n    break;\n  case 'ks':\n    defaultSymbols = exports.DateIntervalSymbols_ks;\n    break;\n  case 'ks_IN':\n  case 'ks-IN':\n    defaultSymbols = exports.DateIntervalSymbols_ks_IN;\n    break;\n  case 'ksb':\n    defaultSymbols = exports.DateIntervalSymbols_ksb;\n    break;\n  case 'ksb_TZ':\n  case 'ksb-TZ':\n    defaultSymbols = exports.DateIntervalSymbols_ksb_TZ;\n    break;\n  case 'ksf':\n    defaultSymbols = exports.DateIntervalSymbols_ksf;\n    break;\n  case 'ksf_CM':\n  case 'ksf-CM':\n    defaultSymbols = exports.DateIntervalSymbols_ksf_CM;\n    break;\n  case 'ksh':\n    defaultSymbols = exports.DateIntervalSymbols_ksh;\n    break;\n  case 'ksh_DE':\n  case 'ksh-DE':\n    defaultSymbols = exports.DateIntervalSymbols_ksh_DE;\n    break;\n  case 'ku':\n    defaultSymbols = exports.DateIntervalSymbols_ku;\n    break;\n  case 'ku_TR':\n  case 'ku-TR':\n    defaultSymbols = exports.DateIntervalSymbols_ku_TR;\n    break;\n  case 'kw':\n    defaultSymbols = exports.DateIntervalSymbols_kw;\n    break;\n  case 'kw_GB':\n  case 'kw-GB':\n    defaultSymbols = exports.DateIntervalSymbols_kw_GB;\n    break;\n  case 'ky_KG':\n  case 'ky-KG':\n    defaultSymbols = exports.DateIntervalSymbols_ky_KG;\n    break;\n  case 'lag':\n    defaultSymbols = exports.DateIntervalSymbols_lag;\n    break;\n  case 'lag_TZ':\n  case 'lag-TZ':\n    defaultSymbols = exports.DateIntervalSymbols_lag_TZ;\n    break;\n  case 'lb':\n    defaultSymbols = exports.DateIntervalSymbols_lb;\n    break;\n  case 'lb_LU':\n  case 'lb-LU':\n    defaultSymbols = exports.DateIntervalSymbols_lb_LU;\n    break;\n  case 'lg':\n    defaultSymbols = exports.DateIntervalSymbols_lg;\n    break;\n  case 'lg_UG':\n  case 'lg-UG':\n    defaultSymbols = exports.DateIntervalSymbols_lg_UG;\n    break;\n  case 'lkt':\n    defaultSymbols = exports.DateIntervalSymbols_lkt;\n    break;\n  case 'lkt_US':\n  case 'lkt-US':\n    defaultSymbols = exports.DateIntervalSymbols_lkt_US;\n    break;\n  case 'ln_AO':\n  case 'ln-AO':\n    defaultSymbols = exports.DateIntervalSymbols_ln_AO;\n    break;\n  case 'ln_CD':\n  case 'ln-CD':\n    defaultSymbols = exports.DateIntervalSymbols_ln_CD;\n    break;\n  case 'ln_CF':\n  case 'ln-CF':\n    defaultSymbols = exports.DateIntervalSymbols_ln_CF;\n    break;\n  case 'ln_CG':\n  case 'ln-CG':\n    defaultSymbols = exports.DateIntervalSymbols_ln_CG;\n    break;\n  case 'lo_LA':\n  case 'lo-LA':\n    defaultSymbols = exports.DateIntervalSymbols_lo_LA;\n    break;\n  case 'lrc':\n    defaultSymbols = exports.DateIntervalSymbols_lrc;\n    break;\n  case 'lrc_IQ':\n  case 'lrc-IQ':\n    defaultSymbols = exports.DateIntervalSymbols_lrc_IQ;\n    break;\n  case 'lrc_IR':\n  case 'lrc-IR':\n    defaultSymbols = exports.DateIntervalSymbols_lrc_IR;\n    break;\n  case 'lt_LT':\n  case 'lt-LT':\n    defaultSymbols = exports.DateIntervalSymbols_lt_LT;\n    break;\n  case 'lu':\n    defaultSymbols = exports.DateIntervalSymbols_lu;\n    break;\n  case 'lu_CD':\n  case 'lu-CD':\n    defaultSymbols = exports.DateIntervalSymbols_lu_CD;\n    break;\n  case 'luo':\n    defaultSymbols = exports.DateIntervalSymbols_luo;\n    break;\n  case 'luo_KE':\n  case 'luo-KE':\n    defaultSymbols = exports.DateIntervalSymbols_luo_KE;\n    break;\n  case 'luy':\n    defaultSymbols = exports.DateIntervalSymbols_luy;\n    break;\n  case 'luy_KE':\n  case 'luy-KE':\n    defaultSymbols = exports.DateIntervalSymbols_luy_KE;\n    break;\n  case 'lv_LV':\n  case 'lv-LV':\n    defaultSymbols = exports.DateIntervalSymbols_lv_LV;\n    break;\n  case 'mas':\n    defaultSymbols = exports.DateIntervalSymbols_mas;\n    break;\n  case 'mas_KE':\n  case 'mas-KE':\n    defaultSymbols = exports.DateIntervalSymbols_mas_KE;\n    break;\n  case 'mas_TZ':\n  case 'mas-TZ':\n    defaultSymbols = exports.DateIntervalSymbols_mas_TZ;\n    break;\n  case 'mer':\n    defaultSymbols = exports.DateIntervalSymbols_mer;\n    break;\n  case 'mer_KE':\n  case 'mer-KE':\n    defaultSymbols = exports.DateIntervalSymbols_mer_KE;\n    break;\n  case 'mfe':\n    defaultSymbols = exports.DateIntervalSymbols_mfe;\n    break;\n  case 'mfe_MU':\n  case 'mfe-MU':\n    defaultSymbols = exports.DateIntervalSymbols_mfe_MU;\n    break;\n  case 'mg':\n    defaultSymbols = exports.DateIntervalSymbols_mg;\n    break;\n  case 'mg_MG':\n  case 'mg-MG':\n    defaultSymbols = exports.DateIntervalSymbols_mg_MG;\n    break;\n  case 'mgh':\n    defaultSymbols = exports.DateIntervalSymbols_mgh;\n    break;\n  case 'mgh_MZ':\n  case 'mgh-MZ':\n    defaultSymbols = exports.DateIntervalSymbols_mgh_MZ;\n    break;\n  case 'mgo':\n    defaultSymbols = exports.DateIntervalSymbols_mgo;\n    break;\n  case 'mgo_CM':\n  case 'mgo-CM':\n    defaultSymbols = exports.DateIntervalSymbols_mgo_CM;\n    break;\n  case 'mi':\n    defaultSymbols = exports.DateIntervalSymbols_mi;\n    break;\n  case 'mi_NZ':\n  case 'mi-NZ':\n    defaultSymbols = exports.DateIntervalSymbols_mi_NZ;\n    break;\n  case 'mk_MK':\n  case 'mk-MK':\n    defaultSymbols = exports.DateIntervalSymbols_mk_MK;\n    break;\n  case 'ml_IN':\n  case 'ml-IN':\n    defaultSymbols = exports.DateIntervalSymbols_ml_IN;\n    break;\n  case 'mn_MN':\n  case 'mn-MN':\n    defaultSymbols = exports.DateIntervalSymbols_mn_MN;\n    break;\n  case 'mr_IN':\n  case 'mr-IN':\n    defaultSymbols = exports.DateIntervalSymbols_mr_IN;\n    break;\n  case 'ms_BN':\n  case 'ms-BN':\n    defaultSymbols = exports.DateIntervalSymbols_ms_BN;\n    break;\n  case 'ms_MY':\n  case 'ms-MY':\n    defaultSymbols = exports.DateIntervalSymbols_ms_MY;\n    break;\n  case 'ms_SG':\n  case 'ms-SG':\n    defaultSymbols = exports.DateIntervalSymbols_ms_SG;\n    break;\n  case 'mt_MT':\n  case 'mt-MT':\n    defaultSymbols = exports.DateIntervalSymbols_mt_MT;\n    break;\n  case 'mua':\n    defaultSymbols = exports.DateIntervalSymbols_mua;\n    break;\n  case 'mua_CM':\n  case 'mua-CM':\n    defaultSymbols = exports.DateIntervalSymbols_mua_CM;\n    break;\n  case 'my_MM':\n  case 'my-MM':\n    defaultSymbols = exports.DateIntervalSymbols_my_MM;\n    break;\n  case 'mzn':\n    defaultSymbols = exports.DateIntervalSymbols_mzn;\n    break;\n  case 'mzn_IR':\n  case 'mzn-IR':\n    defaultSymbols = exports.DateIntervalSymbols_mzn_IR;\n    break;\n  case 'naq':\n    defaultSymbols = exports.DateIntervalSymbols_naq;\n    break;\n  case 'naq_NA':\n  case 'naq-NA':\n    defaultSymbols = exports.DateIntervalSymbols_naq_NA;\n    break;\n  case 'nb_NO':\n  case 'nb-NO':\n    defaultSymbols = exports.DateIntervalSymbols_nb_NO;\n    break;\n  case 'nb_SJ':\n  case 'nb-SJ':\n    defaultSymbols = exports.DateIntervalSymbols_nb_SJ;\n    break;\n  case 'nd':\n    defaultSymbols = exports.DateIntervalSymbols_nd;\n    break;\n  case 'nd_ZW':\n  case 'nd-ZW':\n    defaultSymbols = exports.DateIntervalSymbols_nd_ZW;\n    break;\n  case 'nds':\n    defaultSymbols = exports.DateIntervalSymbols_nds;\n    break;\n  case 'nds_DE':\n  case 'nds-DE':\n    defaultSymbols = exports.DateIntervalSymbols_nds_DE;\n    break;\n  case 'nds_NL':\n  case 'nds-NL':\n    defaultSymbols = exports.DateIntervalSymbols_nds_NL;\n    break;\n  case 'ne_IN':\n  case 'ne-IN':\n    defaultSymbols = exports.DateIntervalSymbols_ne_IN;\n    break;\n  case 'ne_NP':\n  case 'ne-NP':\n    defaultSymbols = exports.DateIntervalSymbols_ne_NP;\n    break;\n  case 'nl_AW':\n  case 'nl-AW':\n    defaultSymbols = exports.DateIntervalSymbols_nl_AW;\n    break;\n  case 'nl_BE':\n  case 'nl-BE':\n    defaultSymbols = exports.DateIntervalSymbols_nl_BE;\n    break;\n  case 'nl_BQ':\n  case 'nl-BQ':\n    defaultSymbols = exports.DateIntervalSymbols_nl_BQ;\n    break;\n  case 'nl_CW':\n  case 'nl-CW':\n    defaultSymbols = exports.DateIntervalSymbols_nl_CW;\n    break;\n  case 'nl_NL':\n  case 'nl-NL':\n    defaultSymbols = exports.DateIntervalSymbols_nl_NL;\n    break;\n  case 'nl_SR':\n  case 'nl-SR':\n    defaultSymbols = exports.DateIntervalSymbols_nl_SR;\n    break;\n  case 'nl_SX':\n  case 'nl-SX':\n    defaultSymbols = exports.DateIntervalSymbols_nl_SX;\n    break;\n  case 'nmg':\n    defaultSymbols = exports.DateIntervalSymbols_nmg;\n    break;\n  case 'nmg_CM':\n  case 'nmg-CM':\n    defaultSymbols = exports.DateIntervalSymbols_nmg_CM;\n    break;\n  case 'nn':\n    defaultSymbols = exports.DateIntervalSymbols_nn;\n    break;\n  case 'nn_NO':\n  case 'nn-NO':\n    defaultSymbols = exports.DateIntervalSymbols_nn_NO;\n    break;\n  case 'nnh':\n    defaultSymbols = exports.DateIntervalSymbols_nnh;\n    break;\n  case 'nnh_CM':\n  case 'nnh-CM':\n    defaultSymbols = exports.DateIntervalSymbols_nnh_CM;\n    break;\n  case 'nus':\n    defaultSymbols = exports.DateIntervalSymbols_nus;\n    break;\n  case 'nus_SS':\n  case 'nus-SS':\n    defaultSymbols = exports.DateIntervalSymbols_nus_SS;\n    break;\n  case 'nyn':\n    defaultSymbols = exports.DateIntervalSymbols_nyn;\n    break;\n  case 'nyn_UG':\n  case 'nyn-UG':\n    defaultSymbols = exports.DateIntervalSymbols_nyn_UG;\n    break;\n  case 'om':\n    defaultSymbols = exports.DateIntervalSymbols_om;\n    break;\n  case 'om_ET':\n  case 'om-ET':\n    defaultSymbols = exports.DateIntervalSymbols_om_ET;\n    break;\n  case 'om_KE':\n  case 'om-KE':\n    defaultSymbols = exports.DateIntervalSymbols_om_KE;\n    break;\n  case 'or_IN':\n  case 'or-IN':\n    defaultSymbols = exports.DateIntervalSymbols_or_IN;\n    break;\n  case 'os':\n    defaultSymbols = exports.DateIntervalSymbols_os;\n    break;\n  case 'os_GE':\n  case 'os-GE':\n    defaultSymbols = exports.DateIntervalSymbols_os_GE;\n    break;\n  case 'os_RU':\n  case 'os-RU':\n    defaultSymbols = exports.DateIntervalSymbols_os_RU;\n    break;\n  case 'pa_Arab':\n  case 'pa-Arab':\n    defaultSymbols = exports.DateIntervalSymbols_pa_Arab;\n    break;\n  case 'pa_Arab_PK':\n  case 'pa-Arab-PK':\n    defaultSymbols = exports.DateIntervalSymbols_pa_Arab_PK;\n    break;\n  case 'pa_Guru':\n  case 'pa-Guru':\n    defaultSymbols = exports.DateIntervalSymbols_pa_Guru;\n    break;\n  case 'pa_Guru_IN':\n  case 'pa-Guru-IN':\n    defaultSymbols = exports.DateIntervalSymbols_pa_Guru_IN;\n    break;\n  case 'pl_PL':\n  case 'pl-PL':\n    defaultSymbols = exports.DateIntervalSymbols_pl_PL;\n    break;\n  case 'ps':\n    defaultSymbols = exports.DateIntervalSymbols_ps;\n    break;\n  case 'ps_AF':\n  case 'ps-AF':\n    defaultSymbols = exports.DateIntervalSymbols_ps_AF;\n    break;\n  case 'ps_PK':\n  case 'ps-PK':\n    defaultSymbols = exports.DateIntervalSymbols_ps_PK;\n    break;\n  case 'pt_AO':\n  case 'pt-AO':\n    defaultSymbols = exports.DateIntervalSymbols_pt_AO;\n    break;\n  case 'pt_CH':\n  case 'pt-CH':\n    defaultSymbols = exports.DateIntervalSymbols_pt_CH;\n    break;\n  case 'pt_CV':\n  case 'pt-CV':\n    defaultSymbols = exports.DateIntervalSymbols_pt_CV;\n    break;\n  case 'pt_GQ':\n  case 'pt-GQ':\n    defaultSymbols = exports.DateIntervalSymbols_pt_GQ;\n    break;\n  case 'pt_GW':\n  case 'pt-GW':\n    defaultSymbols = exports.DateIntervalSymbols_pt_GW;\n    break;\n  case 'pt_LU':\n  case 'pt-LU':\n    defaultSymbols = exports.DateIntervalSymbols_pt_LU;\n    break;\n  case 'pt_MO':\n  case 'pt-MO':\n    defaultSymbols = exports.DateIntervalSymbols_pt_MO;\n    break;\n  case 'pt_MZ':\n  case 'pt-MZ':\n    defaultSymbols = exports.DateIntervalSymbols_pt_MZ;\n    break;\n  case 'pt_ST':\n  case 'pt-ST':\n    defaultSymbols = exports.DateIntervalSymbols_pt_ST;\n    break;\n  case 'pt_TL':\n  case 'pt-TL':\n    defaultSymbols = exports.DateIntervalSymbols_pt_TL;\n    break;\n  case 'qu':\n    defaultSymbols = exports.DateIntervalSymbols_qu;\n    break;\n  case 'qu_BO':\n  case 'qu-BO':\n    defaultSymbols = exports.DateIntervalSymbols_qu_BO;\n    break;\n  case 'qu_EC':\n  case 'qu-EC':\n    defaultSymbols = exports.DateIntervalSymbols_qu_EC;\n    break;\n  case 'qu_PE':\n  case 'qu-PE':\n    defaultSymbols = exports.DateIntervalSymbols_qu_PE;\n    break;\n  case 'rm':\n    defaultSymbols = exports.DateIntervalSymbols_rm;\n    break;\n  case 'rm_CH':\n  case 'rm-CH':\n    defaultSymbols = exports.DateIntervalSymbols_rm_CH;\n    break;\n  case 'rn':\n    defaultSymbols = exports.DateIntervalSymbols_rn;\n    break;\n  case 'rn_BI':\n  case 'rn-BI':\n    defaultSymbols = exports.DateIntervalSymbols_rn_BI;\n    break;\n  case 'ro_MD':\n  case 'ro-MD':\n    defaultSymbols = exports.DateIntervalSymbols_ro_MD;\n    break;\n  case 'ro_RO':\n  case 'ro-RO':\n    defaultSymbols = exports.DateIntervalSymbols_ro_RO;\n    break;\n  case 'rof':\n    defaultSymbols = exports.DateIntervalSymbols_rof;\n    break;\n  case 'rof_TZ':\n  case 'rof-TZ':\n    defaultSymbols = exports.DateIntervalSymbols_rof_TZ;\n    break;\n  case 'ru_BY':\n  case 'ru-BY':\n    defaultSymbols = exports.DateIntervalSymbols_ru_BY;\n    break;\n  case 'ru_KG':\n  case 'ru-KG':\n    defaultSymbols = exports.DateIntervalSymbols_ru_KG;\n    break;\n  case 'ru_KZ':\n  case 'ru-KZ':\n    defaultSymbols = exports.DateIntervalSymbols_ru_KZ;\n    break;\n  case 'ru_MD':\n  case 'ru-MD':\n    defaultSymbols = exports.DateIntervalSymbols_ru_MD;\n    break;\n  case 'ru_RU':\n  case 'ru-RU':\n    defaultSymbols = exports.DateIntervalSymbols_ru_RU;\n    break;\n  case 'ru_UA':\n  case 'ru-UA':\n    defaultSymbols = exports.DateIntervalSymbols_ru_UA;\n    break;\n  case 'rw':\n    defaultSymbols = exports.DateIntervalSymbols_rw;\n    break;\n  case 'rw_RW':\n  case 'rw-RW':\n    defaultSymbols = exports.DateIntervalSymbols_rw_RW;\n    break;\n  case 'rwk':\n    defaultSymbols = exports.DateIntervalSymbols_rwk;\n    break;\n  case 'rwk_TZ':\n  case 'rwk-TZ':\n    defaultSymbols = exports.DateIntervalSymbols_rwk_TZ;\n    break;\n  case 'sah':\n    defaultSymbols = exports.DateIntervalSymbols_sah;\n    break;\n  case 'sah_RU':\n  case 'sah-RU':\n    defaultSymbols = exports.DateIntervalSymbols_sah_RU;\n    break;\n  case 'saq':\n    defaultSymbols = exports.DateIntervalSymbols_saq;\n    break;\n  case 'saq_KE':\n  case 'saq-KE':\n    defaultSymbols = exports.DateIntervalSymbols_saq_KE;\n    break;\n  case 'sbp':\n    defaultSymbols = exports.DateIntervalSymbols_sbp;\n    break;\n  case 'sbp_TZ':\n  case 'sbp-TZ':\n    defaultSymbols = exports.DateIntervalSymbols_sbp_TZ;\n    break;\n  case 'sd':\n    defaultSymbols = exports.DateIntervalSymbols_sd;\n    break;\n  case 'sd_PK':\n  case 'sd-PK':\n    defaultSymbols = exports.DateIntervalSymbols_sd_PK;\n    break;\n  case 'se':\n    defaultSymbols = exports.DateIntervalSymbols_se;\n    break;\n  case 'se_FI':\n  case 'se-FI':\n    defaultSymbols = exports.DateIntervalSymbols_se_FI;\n    break;\n  case 'se_NO':\n  case 'se-NO':\n    defaultSymbols = exports.DateIntervalSymbols_se_NO;\n    break;\n  case 'se_SE':\n  case 'se-SE':\n    defaultSymbols = exports.DateIntervalSymbols_se_SE;\n    break;\n  case 'seh':\n    defaultSymbols = exports.DateIntervalSymbols_seh;\n    break;\n  case 'seh_MZ':\n  case 'seh-MZ':\n    defaultSymbols = exports.DateIntervalSymbols_seh_MZ;\n    break;\n  case 'ses':\n    defaultSymbols = exports.DateIntervalSymbols_ses;\n    break;\n  case 'ses_ML':\n  case 'ses-ML':\n    defaultSymbols = exports.DateIntervalSymbols_ses_ML;\n    break;\n  case 'sg':\n    defaultSymbols = exports.DateIntervalSymbols_sg;\n    break;\n  case 'sg_CF':\n  case 'sg-CF':\n    defaultSymbols = exports.DateIntervalSymbols_sg_CF;\n    break;\n  case 'shi':\n    defaultSymbols = exports.DateIntervalSymbols_shi;\n    break;\n  case 'shi_Latn':\n  case 'shi-Latn':\n    defaultSymbols = exports.DateIntervalSymbols_shi_Latn;\n    break;\n  case 'shi_Latn_MA':\n  case 'shi-Latn-MA':\n    defaultSymbols = exports.DateIntervalSymbols_shi_Latn_MA;\n    break;\n  case 'shi_Tfng':\n  case 'shi-Tfng':\n    defaultSymbols = exports.DateIntervalSymbols_shi_Tfng;\n    break;\n  case 'shi_Tfng_MA':\n  case 'shi-Tfng-MA':\n    defaultSymbols = exports.DateIntervalSymbols_shi_Tfng_MA;\n    break;\n  case 'si_LK':\n  case 'si-LK':\n    defaultSymbols = exports.DateIntervalSymbols_si_LK;\n    break;\n  case 'sk_SK':\n  case 'sk-SK':\n    defaultSymbols = exports.DateIntervalSymbols_sk_SK;\n    break;\n  case 'sl_SI':\n  case 'sl-SI':\n    defaultSymbols = exports.DateIntervalSymbols_sl_SI;\n    break;\n  case 'smn':\n    defaultSymbols = exports.DateIntervalSymbols_smn;\n    break;\n  case 'smn_FI':\n  case 'smn-FI':\n    defaultSymbols = exports.DateIntervalSymbols_smn_FI;\n    break;\n  case 'sn':\n    defaultSymbols = exports.DateIntervalSymbols_sn;\n    break;\n  case 'sn_ZW':\n  case 'sn-ZW':\n    defaultSymbols = exports.DateIntervalSymbols_sn_ZW;\n    break;\n  case 'so':\n    defaultSymbols = exports.DateIntervalSymbols_so;\n    break;\n  case 'so_DJ':\n  case 'so-DJ':\n    defaultSymbols = exports.DateIntervalSymbols_so_DJ;\n    break;\n  case 'so_ET':\n  case 'so-ET':\n    defaultSymbols = exports.DateIntervalSymbols_so_ET;\n    break;\n  case 'so_KE':\n  case 'so-KE':\n    defaultSymbols = exports.DateIntervalSymbols_so_KE;\n    break;\n  case 'so_SO':\n  case 'so-SO':\n    defaultSymbols = exports.DateIntervalSymbols_so_SO;\n    break;\n  case 'sq_AL':\n  case 'sq-AL':\n    defaultSymbols = exports.DateIntervalSymbols_sq_AL;\n    break;\n  case 'sq_MK':\n  case 'sq-MK':\n    defaultSymbols = exports.DateIntervalSymbols_sq_MK;\n    break;\n  case 'sq_XK':\n  case 'sq-XK':\n    defaultSymbols = exports.DateIntervalSymbols_sq_XK;\n    break;\n  case 'sr_Cyrl':\n  case 'sr-Cyrl':\n    defaultSymbols = exports.DateIntervalSymbols_sr_Cyrl;\n    break;\n  case 'sr_Cyrl_BA':\n  case 'sr-Cyrl-BA':\n    defaultSymbols = exports.DateIntervalSymbols_sr_Cyrl_BA;\n    break;\n  case 'sr_Cyrl_ME':\n  case 'sr-Cyrl-ME':\n    defaultSymbols = exports.DateIntervalSymbols_sr_Cyrl_ME;\n    break;\n  case 'sr_Cyrl_RS':\n  case 'sr-Cyrl-RS':\n    defaultSymbols = exports.DateIntervalSymbols_sr_Cyrl_RS;\n    break;\n  case 'sr_Cyrl_XK':\n  case 'sr-Cyrl-XK':\n    defaultSymbols = exports.DateIntervalSymbols_sr_Cyrl_XK;\n    break;\n  case 'sr_Latn_BA':\n  case 'sr-Latn-BA':\n    defaultSymbols = exports.DateIntervalSymbols_sr_Latn_BA;\n    break;\n  case 'sr_Latn_ME':\n  case 'sr-Latn-ME':\n    defaultSymbols = exports.DateIntervalSymbols_sr_Latn_ME;\n    break;\n  case 'sr_Latn_RS':\n  case 'sr-Latn-RS':\n    defaultSymbols = exports.DateIntervalSymbols_sr_Latn_RS;\n    break;\n  case 'sr_Latn_XK':\n  case 'sr-Latn-XK':\n    defaultSymbols = exports.DateIntervalSymbols_sr_Latn_XK;\n    break;\n  case 'sv_AX':\n  case 'sv-AX':\n    defaultSymbols = exports.DateIntervalSymbols_sv_AX;\n    break;\n  case 'sv_FI':\n  case 'sv-FI':\n    defaultSymbols = exports.DateIntervalSymbols_sv_FI;\n    break;\n  case 'sv_SE':\n  case 'sv-SE':\n    defaultSymbols = exports.DateIntervalSymbols_sv_SE;\n    break;\n  case 'sw_CD':\n  case 'sw-CD':\n    defaultSymbols = exports.DateIntervalSymbols_sw_CD;\n    break;\n  case 'sw_KE':\n  case 'sw-KE':\n    defaultSymbols = exports.DateIntervalSymbols_sw_KE;\n    break;\n  case 'sw_TZ':\n  case 'sw-TZ':\n    defaultSymbols = exports.DateIntervalSymbols_sw_TZ;\n    break;\n  case 'sw_UG':\n  case 'sw-UG':\n    defaultSymbols = exports.DateIntervalSymbols_sw_UG;\n    break;\n  case 'ta_IN':\n  case 'ta-IN':\n    defaultSymbols = exports.DateIntervalSymbols_ta_IN;\n    break;\n  case 'ta_LK':\n  case 'ta-LK':\n    defaultSymbols = exports.DateIntervalSymbols_ta_LK;\n    break;\n  case 'ta_MY':\n  case 'ta-MY':\n    defaultSymbols = exports.DateIntervalSymbols_ta_MY;\n    break;\n  case 'ta_SG':\n  case 'ta-SG':\n    defaultSymbols = exports.DateIntervalSymbols_ta_SG;\n    break;\n  case 'te_IN':\n  case 'te-IN':\n    defaultSymbols = exports.DateIntervalSymbols_te_IN;\n    break;\n  case 'teo':\n    defaultSymbols = exports.DateIntervalSymbols_teo;\n    break;\n  case 'teo_KE':\n  case 'teo-KE':\n    defaultSymbols = exports.DateIntervalSymbols_teo_KE;\n    break;\n  case 'teo_UG':\n  case 'teo-UG':\n    defaultSymbols = exports.DateIntervalSymbols_teo_UG;\n    break;\n  case 'tg':\n    defaultSymbols = exports.DateIntervalSymbols_tg;\n    break;\n  case 'tg_TJ':\n  case 'tg-TJ':\n    defaultSymbols = exports.DateIntervalSymbols_tg_TJ;\n    break;\n  case 'th_TH':\n  case 'th-TH':\n    defaultSymbols = exports.DateIntervalSymbols_th_TH;\n    break;\n  case 'ti':\n    defaultSymbols = exports.DateIntervalSymbols_ti;\n    break;\n  case 'ti_ER':\n  case 'ti-ER':\n    defaultSymbols = exports.DateIntervalSymbols_ti_ER;\n    break;\n  case 'ti_ET':\n  case 'ti-ET':\n    defaultSymbols = exports.DateIntervalSymbols_ti_ET;\n    break;\n  case 'tk':\n    defaultSymbols = exports.DateIntervalSymbols_tk;\n    break;\n  case 'tk_TM':\n  case 'tk-TM':\n    defaultSymbols = exports.DateIntervalSymbols_tk_TM;\n    break;\n  case 'to':\n    defaultSymbols = exports.DateIntervalSymbols_to;\n    break;\n  case 'to_TO':\n  case 'to-TO':\n    defaultSymbols = exports.DateIntervalSymbols_to_TO;\n    break;\n  case 'tr_CY':\n  case 'tr-CY':\n    defaultSymbols = exports.DateIntervalSymbols_tr_CY;\n    break;\n  case 'tr_TR':\n  case 'tr-TR':\n    defaultSymbols = exports.DateIntervalSymbols_tr_TR;\n    break;\n  case 'tt':\n    defaultSymbols = exports.DateIntervalSymbols_tt;\n    break;\n  case 'tt_RU':\n  case 'tt-RU':\n    defaultSymbols = exports.DateIntervalSymbols_tt_RU;\n    break;\n  case 'twq':\n    defaultSymbols = exports.DateIntervalSymbols_twq;\n    break;\n  case 'twq_NE':\n  case 'twq-NE':\n    defaultSymbols = exports.DateIntervalSymbols_twq_NE;\n    break;\n  case 'tzm':\n    defaultSymbols = exports.DateIntervalSymbols_tzm;\n    break;\n  case 'tzm_MA':\n  case 'tzm-MA':\n    defaultSymbols = exports.DateIntervalSymbols_tzm_MA;\n    break;\n  case 'ug':\n    defaultSymbols = exports.DateIntervalSymbols_ug;\n    break;\n  case 'ug_CN':\n  case 'ug-CN':\n    defaultSymbols = exports.DateIntervalSymbols_ug_CN;\n    break;\n  case 'uk_UA':\n  case 'uk-UA':\n    defaultSymbols = exports.DateIntervalSymbols_uk_UA;\n    break;\n  case 'ur_IN':\n  case 'ur-IN':\n    defaultSymbols = exports.DateIntervalSymbols_ur_IN;\n    break;\n  case 'ur_PK':\n  case 'ur-PK':\n    defaultSymbols = exports.DateIntervalSymbols_ur_PK;\n    break;\n  case 'uz_Arab':\n  case 'uz-Arab':\n    defaultSymbols = exports.DateIntervalSymbols_uz_Arab;\n    break;\n  case 'uz_Arab_AF':\n  case 'uz-Arab-AF':\n    defaultSymbols = exports.DateIntervalSymbols_uz_Arab_AF;\n    break;\n  case 'uz_Cyrl':\n  case 'uz-Cyrl':\n    defaultSymbols = exports.DateIntervalSymbols_uz_Cyrl;\n    break;\n  case 'uz_Cyrl_UZ':\n  case 'uz-Cyrl-UZ':\n    defaultSymbols = exports.DateIntervalSymbols_uz_Cyrl_UZ;\n    break;\n  case 'uz_Latn':\n  case 'uz-Latn':\n    defaultSymbols = exports.DateIntervalSymbols_uz_Latn;\n    break;\n  case 'uz_Latn_UZ':\n  case 'uz-Latn-UZ':\n    defaultSymbols = exports.DateIntervalSymbols_uz_Latn_UZ;\n    break;\n  case 'vai':\n    defaultSymbols = exports.DateIntervalSymbols_vai;\n    break;\n  case 'vai_Latn':\n  case 'vai-Latn':\n    defaultSymbols = exports.DateIntervalSymbols_vai_Latn;\n    break;\n  case 'vai_Latn_LR':\n  case 'vai-Latn-LR':\n    defaultSymbols = exports.DateIntervalSymbols_vai_Latn_LR;\n    break;\n  case 'vai_Vaii':\n  case 'vai-Vaii':\n    defaultSymbols = exports.DateIntervalSymbols_vai_Vaii;\n    break;\n  case 'vai_Vaii_LR':\n  case 'vai-Vaii-LR':\n    defaultSymbols = exports.DateIntervalSymbols_vai_Vaii_LR;\n    break;\n  case 'vi_VN':\n  case 'vi-VN':\n    defaultSymbols = exports.DateIntervalSymbols_vi_VN;\n    break;\n  case 'vun':\n    defaultSymbols = exports.DateIntervalSymbols_vun;\n    break;\n  case 'vun_TZ':\n  case 'vun-TZ':\n    defaultSymbols = exports.DateIntervalSymbols_vun_TZ;\n    break;\n  case 'wae':\n    defaultSymbols = exports.DateIntervalSymbols_wae;\n    break;\n  case 'wae_CH':\n  case 'wae-CH':\n    defaultSymbols = exports.DateIntervalSymbols_wae_CH;\n    break;\n  case 'wo':\n    defaultSymbols = exports.DateIntervalSymbols_wo;\n    break;\n  case 'wo_SN':\n  case 'wo-SN':\n    defaultSymbols = exports.DateIntervalSymbols_wo_SN;\n    break;\n  case 'xh':\n    defaultSymbols = exports.DateIntervalSymbols_xh;\n    break;\n  case 'xh_ZA':\n  case 'xh-ZA':\n    defaultSymbols = exports.DateIntervalSymbols_xh_ZA;\n    break;\n  case 'xog':\n    defaultSymbols = exports.DateIntervalSymbols_xog;\n    break;\n  case 'xog_UG':\n  case 'xog-UG':\n    defaultSymbols = exports.DateIntervalSymbols_xog_UG;\n    break;\n  case 'yav':\n    defaultSymbols = exports.DateIntervalSymbols_yav;\n    break;\n  case 'yav_CM':\n  case 'yav-CM':\n    defaultSymbols = exports.DateIntervalSymbols_yav_CM;\n    break;\n  case 'yi':\n    defaultSymbols = exports.DateIntervalSymbols_yi;\n    break;\n  case 'yi_001':\n  case 'yi-001':\n    defaultSymbols = exports.DateIntervalSymbols_yi_001;\n    break;\n  case 'yo':\n    defaultSymbols = exports.DateIntervalSymbols_yo;\n    break;\n  case 'yo_BJ':\n  case 'yo-BJ':\n    defaultSymbols = exports.DateIntervalSymbols_yo_BJ;\n    break;\n  case 'yo_NG':\n  case 'yo-NG':\n    defaultSymbols = exports.DateIntervalSymbols_yo_NG;\n    break;\n  case 'yue':\n    defaultSymbols = exports.DateIntervalSymbols_yue;\n    break;\n  case 'yue_Hans':\n  case 'yue-Hans':\n    defaultSymbols = exports.DateIntervalSymbols_yue_Hans;\n    break;\n  case 'yue_Hans_CN':\n  case 'yue-Hans-CN':\n    defaultSymbols = exports.DateIntervalSymbols_yue_Hans_CN;\n    break;\n  case 'yue_Hant':\n  case 'yue-Hant':\n    defaultSymbols = exports.DateIntervalSymbols_yue_Hant;\n    break;\n  case 'yue_Hant_HK':\n  case 'yue-Hant-HK':\n    defaultSymbols = exports.DateIntervalSymbols_yue_Hant_HK;\n    break;\n  case 'zgh':\n    defaultSymbols = exports.DateIntervalSymbols_zgh;\n    break;\n  case 'zgh_MA':\n  case 'zgh-MA':\n    defaultSymbols = exports.DateIntervalSymbols_zgh_MA;\n    break;\n  case 'zh_Hans':\n  case 'zh-Hans':\n    defaultSymbols = exports.DateIntervalSymbols_zh_Hans;\n    break;\n  case 'zh_Hans_CN':\n  case 'zh-Hans-CN':\n    defaultSymbols = exports.DateIntervalSymbols_zh_Hans_CN;\n    break;\n  case 'zh_Hans_HK':\n  case 'zh-Hans-HK':\n    defaultSymbols = exports.DateIntervalSymbols_zh_Hans_HK;\n    break;\n  case 'zh_Hans_MO':\n  case 'zh-Hans-MO':\n    defaultSymbols = exports.DateIntervalSymbols_zh_Hans_MO;\n    break;\n  case 'zh_Hans_SG':\n  case 'zh-Hans-SG':\n    defaultSymbols = exports.DateIntervalSymbols_zh_Hans_SG;\n    break;\n  case 'zh_Hant':\n  case 'zh-Hant':\n    defaultSymbols = exports.DateIntervalSymbols_zh_Hant;\n    break;\n  case 'zh_Hant_HK':\n  case 'zh-Hant-HK':\n    defaultSymbols = exports.DateIntervalSymbols_zh_Hant_HK;\n    break;\n  case 'zh_Hant_MO':\n  case 'zh-Hant-MO':\n    defaultSymbols = exports.DateIntervalSymbols_zh_Hant_MO;\n    break;\n  case 'zh_Hant_TW':\n  case 'zh-Hant-TW':\n    defaultSymbols = exports.DateIntervalSymbols_zh_Hant_TW;\n    break;\n  case 'zu_ZA':\n  case 'zu-ZA':\n    defaultSymbols = exports.DateIntervalSymbols_zu_ZA;\n    break;\n}\n\nif (defaultSymbols != null) {\n  dateIntervalSymbols.setDateIntervalSymbols(defaultSymbols);\n}\n","^9I",1579837703000,"^9J",["^9K",["^JN","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/dateintervalsymbolsext.js"],"^:1",["^9K",["~$goog.i18n.dateIntervalSymbolsExt"]],"^9<",true,"^9=",["^9>","^JN"]],["^ ","^9A",[1579837703000],"^9B","goog.debug.logrecordserializer.js","^9C",["^9D","goog/debug/logrecordserializer.js"],"^9E","goog/debug/logrecordserializer.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Static methods for serializing and deserializing log\n * messages.  These methods are deliberately kept separate from logrecord.js\n * and logger.js because they add dependencies on goog.json and goog.object.\n *\n */\n\ngoog.provide('goog.debug.logRecordSerializer');\n\ngoog.require('goog.debug.LogRecord');\ngoog.require('goog.debug.Logger');\ngoog.require('goog.json');\ngoog.require('goog.object');\n\n\n/**\n * Enumeration of object keys used when serializing a log message.\n * @enum {string}\n * @private\n */\ngoog.debug.logRecordSerializer.Param_ = {\n  TIME: 't',\n  LEVEL_NAME: 'ln',\n  LEVEL_VALUE: 'lv',\n  MSG: 'm',\n  LOGGER_NAME: 'n',\n  SEQUENCE_NUMBER: 's',\n  EXCEPTION: 'e'\n};\n\n\n/**\n * Serializes a LogRecord to a JSON string.  Note that any associated\n * exception is likely to be lost.\n * @param {goog.debug.LogRecord} record The record to serialize.\n * @return {string} Serialized JSON string of the log message.\n * @suppress {strictMissingProperties} message is not defined on Object\n */\ngoog.debug.logRecordSerializer.serialize = function(record) {\n  var param = goog.debug.logRecordSerializer.Param_;\n  return goog.json.serialize(\n      goog.object.create(\n          param.TIME, record.getMillis(), param.LEVEL_NAME,\n          record.getLevel().name, param.LEVEL_VALUE, record.getLevel().value,\n          param.MSG, record.getMessage(), param.LOGGER_NAME,\n          record.getLoggerName(), param.SEQUENCE_NUMBER,\n          record.getSequenceNumber(), param.EXCEPTION,\n          record.getException() && record.getException().message));\n};\n\n\n/**\n * Deserializes a JSON-serialized LogRecord.\n * @param {string} s The JSON serialized record.\n * @return {!goog.debug.LogRecord} The deserialized record.\n */\ngoog.debug.logRecordSerializer.parse = function(s) {\n  return goog.debug.logRecordSerializer.reconstitute_(\n      /** @type {!Object} */ (JSON.parse(s)));\n};\n\n\n/**\n * Reconstitutes LogRecord from the JSON object.\n * @param {Object} o The JSON object.\n * @return {!goog.debug.LogRecord} The reconstituted record.\n * @private\n */\ngoog.debug.logRecordSerializer.reconstitute_ = function(o) {\n  var param = goog.debug.logRecordSerializer.Param_;\n  var level = goog.debug.logRecordSerializer.getLevel_(\n      o[param.LEVEL_NAME], o[param.LEVEL_VALUE]);\n\n  var ret = new goog.debug.LogRecord(\n      level, o[param.MSG], o[param.LOGGER_NAME], o[param.TIME],\n      o[param.SEQUENCE_NUMBER]);\n  var exceptionMessage = o[param.EXCEPTION];\n  if (exceptionMessage != null) {\n    ret.setException(new Error(exceptionMessage));\n  }\n  return ret;\n};\n\n\n/**\n * @param {string} name The name of the log level to return.\n * @param {number} value The numeric value of the log level to return.\n * @return {!goog.debug.Logger.Level} Returns a goog.debug.Logger.Level with\n *     the specified name and value.  If the name and value match a predefined\n *     log level, that instance will be returned, otherwise a new one will be\n *     created.\n * @private\n */\ngoog.debug.logRecordSerializer.getLevel_ = function(name, value) {\n  var level = goog.debug.Logger.Level.getPredefinedLevel(name);\n  return level && level.value == value ? level : new goog.debug.Logger.Level(\n                                                     name, value);\n};\n","^9I",1579837703000,"^9J",["^9K",["^<A","^9>","^IL","^;P","^IM"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/logrecordserializer.js"],"^:1",["^9K",["~$goog.debug.logRecordSerializer"]],"^9<",true,"^9=",["^9>","^IM","^IL","^<A","^;P"]],["^ ","^9A",[1579837703000],"^9B","goog.labs.dom.pagevisibilitymonitor.js","^9C",["^9D","goog/labs/dom/pagevisibilitymonitor.js"],"^9E","goog/labs/dom/pagevisibilitymonitor.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This event monitor wraps the Page Visibility API.\n * @see http://www.w3.org/TR/page-visibility/\n */\n\ngoog.provide('goog.labs.dom.PageVisibilityEvent');\ngoog.provide('goog.labs.dom.PageVisibilityMonitor');\ngoog.provide('goog.labs.dom.PageVisibilityState');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.vendor');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.memoize');\n\n\n/**\n * The different visibility states.\n * @enum {string}\n */\ngoog.labs.dom.PageVisibilityState = {\n  HIDDEN: 'hidden',\n  VISIBLE: 'visible',\n  PRERENDER: 'prerender',\n  UNLOADED: 'unloaded'\n};\n\n\n\n/**\n * This event handler allows you to catch page visibility change events.\n * @param {!goog.dom.DomHelper=} opt_domHelper\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.labs.dom.PageVisibilityMonitor = function(opt_domHelper) {\n  goog.labs.dom.PageVisibilityMonitor.base(this, 'constructor');\n\n  /**\n   * @private {!goog.dom.DomHelper}\n   */\n  this.domHelper_ = opt_domHelper || goog.dom.getDomHelper();\n\n  /**\n   * @private {?string}\n   */\n  this.eventType_ = this.getBrowserEventType_();\n\n  // Some browsers do not support visibilityChange and therefore we don't bother\n  // setting up events.\n  if (this.eventType_) {\n    /**\n     * @private {goog.events.Key}\n     */\n    this.eventKey_ = goog.events.listen(\n        this.domHelper_.getDocument(), this.eventType_,\n        goog.bind(this.handleChange_, this));\n  }\n};\ngoog.inherits(goog.labs.dom.PageVisibilityMonitor, goog.events.EventTarget);\n\n\n/**\n * @return {?string} The visibility change event type, or null if not supported.\n *     Memoized for performance.\n * @private\n */\ngoog.labs.dom.PageVisibilityMonitor.prototype\n    .getBrowserEventType_ = goog.memoize(function() {\n  var isSupported =\n      /** @type {!goog.labs.dom.PageVisibilityMonitor} */ (this).isSupported();\n  var isPrefixed =\n      /** @type {!goog.labs.dom.PageVisibilityMonitor} */ (this).isPrefixed_();\n\n  if (isSupported) {\n    return isPrefixed ?\n        goog.dom.vendor.getPrefixedEventType(\n            goog.events.EventType.VISIBILITYCHANGE) :\n        goog.events.EventType.VISIBILITYCHANGE;\n  } else {\n    return null;\n  }\n});\n\n\n/**\n * @return {?string} The browser-specific document.hidden property.  Memoized\n *     for performance.\n * @private\n */\ngoog.labs.dom.PageVisibilityMonitor.prototype.getHiddenPropertyName_ =\n    goog.memoize(function() {\n      return goog.dom.vendor.getPrefixedPropertyName(\n          'hidden',\n          /** @type {!goog.labs.dom.PageVisibilityMonitor} */\n          (this).domHelper_.getDocument());\n    });\n\n\n/**\n * @return {boolean} Whether the visibility API is prefixed.\n * @private\n */\ngoog.labs.dom.PageVisibilityMonitor.prototype.isPrefixed_ = function() {\n  return this.getHiddenPropertyName_() != 'hidden';\n};\n\n\n/**\n * @return {?string} The browser-specific document.visibilityState property.\n *     Memoized for performance.\n * @private\n */\ngoog.labs.dom.PageVisibilityMonitor.prototype.getVisibilityStatePropertyName_ =\n    goog.memoize(function() {\n      return goog.dom.vendor.getPrefixedPropertyName(\n          'visibilityState',\n          /** @type {!goog.labs.dom.PageVisibilityMonitor} */\n          (this).domHelper_.getDocument());\n    });\n\n\n/**\n * @return {boolean} Whether the visibility API is supported.\n */\ngoog.labs.dom.PageVisibilityMonitor.prototype.isSupported = function() {\n  return !!this.getHiddenPropertyName_();\n};\n\n\n/**\n * @return {boolean} Whether the page is visible.\n */\ngoog.labs.dom.PageVisibilityMonitor.prototype.isHidden = function() {\n  return !!this.domHelper_.getDocument()[this.getHiddenPropertyName_()];\n};\n\n\n/**\n * @return {?goog.labs.dom.PageVisibilityState} The page visibility state, or\n *     null if not supported.\n */\ngoog.labs.dom.PageVisibilityMonitor.prototype.getVisibilityState = function() {\n  if (!this.isSupported()) {\n    return null;\n  }\n  return this.domHelper_.getDocument()[this.getVisibilityStatePropertyName_()];\n};\n\n\n/**\n * Handles the events on the element.\n * @param {goog.events.BrowserEvent} e The underlying browser event.\n * @private\n */\ngoog.labs.dom.PageVisibilityMonitor.prototype.handleChange_ = function(e) {\n  var state = this.getVisibilityState();\n  var visibilityEvent = new goog.labs.dom.PageVisibilityEvent(\n      this.isHidden(),\n      /** @type {goog.labs.dom.PageVisibilityState} */ (state));\n  this.dispatchEvent(visibilityEvent);\n};\n\n\n/** @override */\ngoog.labs.dom.PageVisibilityMonitor.prototype.disposeInternal = function() {\n  goog.events.unlistenByKey(this.eventKey_);\n  goog.labs.dom.PageVisibilityMonitor.base(this, 'disposeInternal');\n};\n\n\n\n/**\n * A page visibility change event.\n * @param {boolean} hidden Whether the page is hidden.\n * @param {goog.labs.dom.PageVisibilityState} visibilityState A more detailed\n *     visibility state.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.labs.dom.PageVisibilityEvent = function(hidden, visibilityState) {\n  goog.labs.dom.PageVisibilityEvent.base(\n      this, 'constructor', goog.events.EventType.VISIBILITYCHANGE);\n\n  /**\n   * Whether the page is hidden.\n   * @type {boolean}\n   */\n  this.hidden = hidden;\n\n  /**\n   * A more detailed visibility state.\n   * @type {goog.labs.dom.PageVisibilityState}\n   */\n  this.visibilityState = visibilityState;\n};\ngoog.inherits(goog.labs.dom.PageVisibilityEvent, goog.events.Event);\n","^9I",1579837703000,"^9J",["^9K",["^;;","^9>","^:L","^:I","^JP","^;8","^:N","~$goog.memoize"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/dom/pagevisibilitymonitor.js"],"^:1",["^9K",["~$goog.labs.dom.PageVisibilityState","~$goog.labs.dom.PageVisibilityEvent","~$goog.labs.dom.PageVisibilityMonitor"]],"^9<",true,"^9=",["^9>","^;;","^JP","^:N","^;8","^:L","^:I","^M>"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.dataset.js","^9C",["^9D","goog/dom/dataset.js"],"^9E","goog/dom/dataset.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for adding, removing and setting values in\n * an Element's dataset.\n * See {@link http://www.w3.org/TR/html5/Overview.html#dom-dataset}.\n *\n * @author nicksay@google.com (Alex Nicksay)\n */\n\ngoog.provide('goog.dom.dataset');\n\ngoog.require('goog.labs.userAgent.browser');\ngoog.require('goog.string');\ngoog.require('goog.userAgent.product');\n\n\n/**\n * Whether using the dataset property is allowed.\n *\n * In IE (up to and including IE 11), setting element.dataset in JS does not\n * propagate values to CSS, breaking expressions such as\n * `content: attr(data-content)` that would otherwise work.\n * See {@link https://github.com/google/closure-library/issues/396}.\n *\n * In Safari >= 9, reading from element.dataset sometimes returns\n * undefined, even though the corresponding data- attribute has a value.\n * See {@link https://bugs.webkit.org/show_bug.cgi?id=161454}.\n * @const\n * @private\n */\ngoog.dom.dataset.ALLOWED_ =\n    !goog.userAgent.product.IE && !goog.labs.userAgent.browser.isSafari();\n\n\n/**\n * The DOM attribute name prefix that must be present for it to be considered\n * for a dataset.\n * @type {string}\n * @const\n * @private\n */\ngoog.dom.dataset.PREFIX_ = 'data-';\n\n\n/**\n * Returns whether a string is a valid dataset property name.\n * @param {string} key Property name for the custom data attribute.\n * @return {boolean} Whether the string is a valid dataset property name.\n * @private\n */\ngoog.dom.dataset.isValidProperty_ = function(key) {\n  return !/-[a-z]/.test(key);\n};\n\n\n/**\n * Sets a custom data attribute on an element. The key should be\n * in camelCase format (e.g \"keyName\" for the \"data-key-name\" attribute).\n * @param {Element} element DOM node to set the custom data attribute on.\n * @param {string} key Key for the custom data attribute.\n * @param {string} value Value for the custom data attribute.\n */\ngoog.dom.dataset.set = function(element, key, value) {\n  var htmlElement = /** @type {HTMLElement} */ (element);\n  if (goog.dom.dataset.ALLOWED_ && htmlElement.dataset) {\n    htmlElement.dataset[key] = value;\n  } else if (!goog.dom.dataset.isValidProperty_(key)) {\n    throw new Error(\n        goog.DEBUG ? '\"' + key + '\" is not a valid dataset property name.' :\n                     '');\n  } else {\n    element.setAttribute(\n        goog.dom.dataset.PREFIX_ + goog.string.toSelectorCase(key), value);\n  }\n};\n\n\n/**\n * Gets a custom data attribute from an element. The key should be\n * in camelCase format (e.g \"keyName\" for the \"data-key-name\" attribute).\n * @param {Element} element DOM node to get the custom data attribute from.\n * @param {string} key Key for the custom data attribute.\n * @return {?string} The attribute value, if it exists.\n */\ngoog.dom.dataset.get = function(element, key) {\n  // Edge, unlike other browsers, will do camel-case conversion when retrieving\n  // \"dash-case\" properties.\n  if (!goog.dom.dataset.isValidProperty_(key)) {\n    return null;\n  }\n  var htmlElement = /** @type {HTMLElement} */ (element);\n  if (goog.dom.dataset.ALLOWED_ && htmlElement.dataset) {\n    // Android browser (non-chrome) returns the empty string for\n    // element.dataset['doesNotExist'].\n    if (goog.labs.userAgent.browser.isAndroidBrowser() &&\n        !(key in htmlElement.dataset)) {\n      return null;\n    }\n    var value = htmlElement.dataset[key];\n    return value === undefined ? null : value;\n  } else {\n    return htmlElement.getAttribute(\n        goog.dom.dataset.PREFIX_ + goog.string.toSelectorCase(key));\n  }\n};\n\n\n/**\n * Removes a custom data attribute from an element. The key should be\n  * in camelCase format (e.g \"keyName\" for the \"data-key-name\" attribute).\n * @param {Element} element DOM node to get the custom data attribute from.\n * @param {string} key Key for the custom data attribute.\n */\ngoog.dom.dataset.remove = function(element, key) {\n  // Edge, unlike other browsers, will do camel-case conversion when removing\n  // \"dash-case\" properties.\n  if (!goog.dom.dataset.isValidProperty_(key)) {\n    return;\n  }\n  var htmlElement = /** @type {HTMLElement} */ (element);\n  if (goog.dom.dataset.ALLOWED_ && htmlElement.dataset) {\n    // In strict mode Safari will trigger an error when trying to delete a\n    // property which does not exist.\n    if (goog.dom.dataset.has(element, key)) {\n      delete htmlElement.dataset[key];\n    }\n  } else {\n    element.removeAttribute(\n        goog.dom.dataset.PREFIX_ + goog.string.toSelectorCase(key));\n  }\n};\n\n\n/**\n * Checks whether custom data attribute exists on an element. The key should be\n * in camelCase format (e.g \"keyName\" for the \"data-key-name\" attribute).\n *\n * @param {Element} element DOM node to get the custom data attribute from.\n * @param {string} key Key for the custom data attribute.\n * @return {boolean} Whether the attribute exists.\n */\ngoog.dom.dataset.has = function(element, key) {\n  // Edge, unlike other browsers, will do camel-case conversion when retrieving\n  // \"dash-case\" properties.\n  if (!goog.dom.dataset.isValidProperty_(key)) {\n    return false;\n  }\n  var htmlElement = /** @type {HTMLElement} */ (element);\n  if (goog.dom.dataset.ALLOWED_ && htmlElement.dataset) {\n    return key in htmlElement.dataset;\n  } else if (htmlElement.hasAttribute) {\n    return htmlElement.hasAttribute(\n        goog.dom.dataset.PREFIX_ + goog.string.toSelectorCase(key));\n  } else {\n    return !!(htmlElement.getAttribute(\n        goog.dom.dataset.PREFIX_ + goog.string.toSelectorCase(key)));\n  }\n};\n\n\n/**\n * Gets all custom data attributes as a string map.  The attribute names will be\n * camel cased (e.g., data-foo-bar -> dataset['fooBar']).  This operation is not\n * safe for attributes having camel-cased names clashing with already existing\n * properties (e.g., data-to-string -> dataset['toString']).\n * @param {!Element} element DOM node to get the data attributes from.\n * @return {!Object} The string map containing data attributes and their\n *     respective values.\n */\ngoog.dom.dataset.getAll = function(element) {\n  var htmlElement = /** @type {HTMLElement} */ (element);\n  if (goog.dom.dataset.ALLOWED_ && htmlElement.dataset) {\n    return htmlElement.dataset;\n  } else {\n    var dataset = {};\n    var attributes = element.attributes;\n    for (var i = 0; i < attributes.length; ++i) {\n      var attribute = attributes[i];\n      if (goog.string.startsWith(attribute.name, goog.dom.dataset.PREFIX_)) {\n        // We use substr(5), since it's faster than replacing 'data-' with ''.\n        var key = goog.string.toCamelCase(attribute.name.substr(5));\n        dataset[key] = attribute.value;\n      }\n    }\n    return dataset;\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.userAgent.product","^9L","^9>","^GU"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/dataset.js"],"^:1",["^9K",["~$goog.dom.dataset"]],"^9<",true,"^9=",["^9>","^GU","^9L","^MB"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.classes.js","^9C",["^9D","goog/dom/classes.js"],"^9E","goog/dom/classes.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for adding, removing and setting classes.  Prefer\n * {@link goog.dom.classlist} over these utilities since goog.dom.classlist\n * conforms closer to the semantics of Element.classList, is faster (uses\n * native methods rather than parsing strings on every call) and compiles\n * to smaller code as a result.\n *\n * Note: these utilities are meant to operate on HTMLElements and\n * will not work on elements with differing interfaces (such as SVGElements).\n *\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.dom.classes');\n\ngoog.require('goog.array');\n\n\n/**\n * Sets the entire class name of an element.\n * @param {Node} element DOM node to set class of.\n * @param {string} className Class name(s) to apply to element.\n * @deprecated Use goog.dom.classlist.set instead.\n */\ngoog.dom.classes.set = function(element, className) {\n  /** @type {!HTMLElement} */ (element).className = className;\n};\n\n\n/**\n * Gets an array of class names on an element\n * @param {Node} element DOM node to get class of.\n * @return {!Array<?>} Class names on `element`. Some browsers add extra\n *     properties to the array. Do not depend on any of these!\n * @deprecated Use goog.dom.classlist.get instead.\n */\ngoog.dom.classes.get = function(element) {\n  var className = /** @type {!Element} */ (element).className;\n  // Some types of elements don't have a className in IE (e.g. iframes).\n  // Furthermore, in Firefox, className is not a string when the element is\n  // an SVG element.\n  return typeof className === 'string' && className.match(/\\S+/g) || [];\n};\n\n\n/**\n * Adds a class or classes to an element. Does not add multiples of class names.\n * @param {Node} element DOM node to add class to.\n * @param {...string} var_args Class names to add.\n * @return {boolean} Whether class was added (or all classes were added).\n * @deprecated Use goog.dom.classlist.add or goog.dom.classlist.addAll instead.\n */\ngoog.dom.classes.add = function(element, var_args) {\n  var classes = goog.dom.classes.get(element);\n  var args = goog.array.slice(arguments, 1);\n  var expectedCount = classes.length + args.length;\n  goog.dom.classes.add_(classes, args);\n  goog.dom.classes.set(element, classes.join(' '));\n  return classes.length == expectedCount;\n};\n\n\n/**\n * Removes a class or classes from an element.\n * @param {Node} element DOM node to remove class from.\n * @param {...string} var_args Class name(s) to remove.\n * @return {boolean} Whether all classes in `var_args` were found and\n *     removed.\n * @deprecated Use goog.dom.classlist.remove or goog.dom.classlist.removeAll\n *     instead.\n */\ngoog.dom.classes.remove = function(element, var_args) {\n  var classes = goog.dom.classes.get(element);\n  var args = goog.array.slice(arguments, 1);\n  var newClasses = goog.dom.classes.getDifference_(classes, args);\n  goog.dom.classes.set(element, newClasses.join(' '));\n  return newClasses.length == classes.length - args.length;\n};\n\n\n/**\n * Helper method for {@link goog.dom.classes.add} and\n * {@link goog.dom.classes.addRemove}. Adds one or more classes to the supplied\n * classes array.\n * @param {Array<string>} classes All class names for the element, will be\n *     updated to have the classes supplied in `args` added.\n * @param {Array<string>} args Class names to add.\n * @private\n */\ngoog.dom.classes.add_ = function(classes, args) {\n  for (var i = 0; i < args.length; i++) {\n    if (!goog.array.contains(classes, args[i])) {\n      classes.push(args[i]);\n    }\n  }\n};\n\n\n/**\n * Helper method for {@link goog.dom.classes.remove} and\n * {@link goog.dom.classes.addRemove}. Calculates the difference of two arrays.\n * @param {!Array<string>} arr1 First array.\n * @param {!Array<string>} arr2 Second array.\n * @return {!Array<string>} The first array without the elements of the second\n *     array.\n * @private\n */\ngoog.dom.classes.getDifference_ = function(arr1, arr2) {\n  return goog.array.filter(\n      arr1, function(item) { return !goog.array.contains(arr2, item); });\n};\n\n\n/**\n * Switches a class on an element from one to another without disturbing other\n * classes. If the fromClass isn't removed, the toClass won't be added.\n * @param {Node} element DOM node to swap classes on.\n * @param {string} fromClass Class to remove.\n * @param {string} toClass Class to add.\n * @return {boolean} Whether classes were switched.\n * @deprecated Use goog.dom.classlist.swap instead.\n */\ngoog.dom.classes.swap = function(element, fromClass, toClass) {\n  var classes = goog.dom.classes.get(element);\n\n  var removed = false;\n  for (var i = 0; i < classes.length; i++) {\n    if (classes[i] == fromClass) {\n      goog.array.splice(classes, i--, 1);\n      removed = true;\n    }\n  }\n\n  if (removed) {\n    classes.push(toClass);\n    goog.dom.classes.set(element, classes.join(' '));\n  }\n\n  return removed;\n};\n\n\n/**\n * Adds zero or more classes to an element and removes zero or more as a single\n * operation. Unlike calling {@link goog.dom.classes.add} and\n * {@link goog.dom.classes.remove} separately, this is more efficient as it only\n * parses the class property once.\n *\n * If a class is in both the remove and add lists, it will be added. Thus,\n * you can use this instead of {@link goog.dom.classes.swap} when you have\n * more than two class names that you want to swap.\n *\n * @param {Node} element DOM node to swap classes on.\n * @param {?(string|Array<string>)} classesToRemove Class or classes to\n *     remove, if null no classes are removed.\n * @param {?(string|Array<string>)} classesToAdd Class or classes to add, if\n *     null no classes are added.\n * @deprecated Use goog.dom.classlist.addRemove instead.\n */\ngoog.dom.classes.addRemove = function(element, classesToRemove, classesToAdd) {\n  var classes = goog.dom.classes.get(element);\n  if (typeof classesToRemove === 'string') {\n    goog.array.remove(classes, classesToRemove);\n  } else if (goog.isArray(classesToRemove)) {\n    classes = goog.dom.classes.getDifference_(classes, classesToRemove);\n  }\n\n  if (typeof classesToAdd === 'string' &&\n      !goog.array.contains(classes, classesToAdd)) {\n    classes.push(classesToAdd);\n  } else if (goog.isArray(classesToAdd)) {\n    goog.dom.classes.add_(classes, classesToAdd);\n  }\n\n  goog.dom.classes.set(element, classes.join(' '));\n};\n\n\n/**\n * Returns true if an element has a class.\n * @param {Node} element DOM node to test.\n * @param {string} className Class name to test for.\n * @return {boolean} Whether element has the class.\n * @deprecated Use goog.dom.classlist.contains instead.\n */\ngoog.dom.classes.has = function(element, className) {\n  return goog.array.contains(goog.dom.classes.get(element), className);\n};\n\n\n/**\n * Adds or removes a class depending on the enabled argument.\n * @param {Node} element DOM node to add or remove the class on.\n * @param {string} className Class name to add or remove.\n * @param {boolean} enabled Whether to add or remove the class (true adds,\n *     false removes).\n * @deprecated Use goog.dom.classlist.enable or goog.dom.classlist.enableAll\n *     instead.\n */\ngoog.dom.classes.enable = function(element, className, enabled) {\n  if (enabled) {\n    goog.dom.classes.add(element, className);\n  } else {\n    goog.dom.classes.remove(element, className);\n  }\n};\n\n\n/**\n * Removes a class if an element has it, and adds it the element doesn't have\n * it.  Won't affect other classes on the node.\n * @param {Node} element DOM node to toggle class on.\n * @param {string} className Class to toggle.\n * @return {boolean} True if class was added, false if it was removed\n *     (in other words, whether element has the class after this function has\n *     been called).\n * @deprecated Use goog.dom.classlist.toggle instead.\n */\ngoog.dom.classes.toggle = function(element, className) {\n  var add = !goog.dom.classes.has(element, className);\n  goog.dom.classes.enable(element, className, add);\n  return add;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/classes.js"],"^:1",["^9K",["~$goog.dom.classes"]],"^9<",true,"^9=",["^9>","^;9"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.emoji.emojipalette.js","^9C",["^9D","goog/ui/emoji/emojipalette.js"],"^9E","goog/ui/emoji/emojipalette.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Emoji Palette implementation. This provides a UI widget for\n * choosing an emoji from a palette of possible choices. EmojiPalettes are\n * contained within EmojiPickers.\n *\n * See ../demos/popupemojipicker.html for an example of how to instantiate\n * an emoji picker.\n *\n * Based on goog.ui.ColorPicker (colorpicker.js).\n *\n */\n\ngoog.provide('goog.ui.emoji.EmojiPalette');\n\ngoog.require('goog.events.EventType');\ngoog.require('goog.net.ImageLoader');\ngoog.require('goog.ui.Palette');\ngoog.require('goog.ui.emoji.Emoji');\ngoog.require('goog.ui.emoji.EmojiPaletteRenderer');\n\n\n\n/**\n * A page of emoji to be displayed in an EmojiPicker.\n *\n * @param {Array<Array<?>>} emoji List of emoji for this page.\n  * @param {?string=} opt_urlPrefix Prefix that should be prepended to all URL.\n * @param {goog.ui.PaletteRenderer=} opt_renderer Renderer used to render or\n *     decorate the palette; defaults to {@link goog.ui.PaletteRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @extends {goog.ui.Palette}\n * @constructor\n * @final\n */\ngoog.ui.emoji.EmojiPalette = function(\n    emoji, opt_urlPrefix, opt_renderer, opt_domHelper) {\n  goog.ui.Palette.call(\n      this, null, opt_renderer || new goog.ui.emoji.EmojiPaletteRenderer(null),\n      opt_domHelper);\n  /**\n   * All the different emoji that this palette can display. Maps emoji ids\n   * (string) to the goog.ui.emoji.Emoji for that id.\n   *\n   * @type {Object}\n   * @private\n   */\n  this.emojiCells_ = {};\n\n  /**\n   * Map of emoji id to index into this.emojiCells_.\n   *\n   * @type {Object}\n   * @private\n   */\n  this.emojiMap_ = {};\n\n  /**\n   * List of the animated emoji in this palette. Each internal array is of type\n   * [HTMLDivElement, goog.ui.emoji.Emoji], and represents the palette item\n   * for that animated emoji, and the Emoji object.\n   *\n   * @type {Array<Array<(HTMLDivElement|goog.ui.emoji.Emoji)>>}\n   * @private\n   */\n  this.animatedEmoji_ = [];\n\n  this.urlPrefix_ = opt_urlPrefix || '';\n\n  /**\n   * Palette items that are displayed on this page of the emoji picker. Each\n   * item is a div wrapped around a div or an img.\n   *\n   * @type {Array<HTMLDivElement>}\n   * @private\n   */\n  this.emoji_ = this.getEmojiArrayFromProperties_(emoji);\n\n  this.setContent(this.emoji_);\n};\ngoog.inherits(goog.ui.emoji.EmojiPalette, goog.ui.Palette);\n\n\n/**\n * Indicates a prefix that should be prepended to all URLs of images in this\n * emojipalette. This provides an optimization if the URLs are long, so that\n * the client does not have to send a long string for each emoji.\n *\n * @type {string}\n * @private\n */\ngoog.ui.emoji.EmojiPalette.prototype.urlPrefix_ = '';\n\n\n/**\n * Whether the emoji images have been loaded.\n *\n * @type {boolean}\n * @private\n */\ngoog.ui.emoji.EmojiPalette.prototype.imagesLoaded_ = false;\n\n\n/**\n * Image loader for loading animated emoji.\n *\n * @type {goog.net.ImageLoader}\n * @private\n */\ngoog.ui.emoji.EmojiPalette.prototype.imageLoader_;\n\n\n/**\n * Helps create an array of emoji palette items from an array of emoji\n * properties. Each element will be either a div with background-image set to\n * a sprite, or an img element pointing directly to an emoji, and all elements\n * are wrapped with an outer div for alignment issues (i.e., this allows\n * centering the inner div).\n *\n * @param {Object} emojiGroup The group of emoji for this page.\n * @return {!Array<!HTMLDivElement>} The emoji items.\n * @private\n */\ngoog.ui.emoji.EmojiPalette.prototype.getEmojiArrayFromProperties_ = function(\n    emojiGroup) {\n  var emojiItems = [];\n\n  for (var i = 0; i < emojiGroup.length; i++) {\n    var url = emojiGroup[i][0];\n    var id = emojiGroup[i][1];\n    var spriteInfo = emojiGroup[i][2];\n    var displayUrl = spriteInfo ? spriteInfo.getUrl() : this.urlPrefix_ + url;\n\n    var item = this.getRenderer().createPaletteItem(\n        this.getDomHelper(), id, spriteInfo, displayUrl);\n    emojiItems.push(item);\n\n    var emoji = new goog.ui.emoji.Emoji(url, id);\n    this.emojiCells_[id] = emoji;\n    this.emojiMap_[id] = i;\n\n    // Keep track of sprited emoji that are animated, for later loading.\n    if (spriteInfo && spriteInfo.isAnimated()) {\n      this.animatedEmoji_.push([item, emoji]);\n    }\n  }\n\n  // Create the image loader now so that tests can access it before it has\n  // started loading images.\n  if (this.animatedEmoji_.length > 0) {\n    this.imageLoader_ = new goog.net.ImageLoader();\n  }\n\n  this.imagesLoaded_ = true;\n  return emojiItems;\n};\n\n\n/**\n * Sends off requests for all the animated emoji and replaces their static\n * sprites when the images are done downloading.\n */\ngoog.ui.emoji.EmojiPalette.prototype.loadAnimatedEmoji = function() {\n  if (this.animatedEmoji_.length > 0) {\n    for (var i = 0; i < this.animatedEmoji_.length; i++) {\n      var emoji =\n          /** @type {goog.ui.emoji.Emoji} */ (this.animatedEmoji_[i][1]);\n      var url = this.urlPrefix_ + emoji.getUrl();\n\n      this.imageLoader_.addImage(emoji.getId(), url);\n    }\n\n    this.getHandler().listen(\n        this.imageLoader_, goog.events.EventType.LOAD, this.handleImageLoad_);\n    this.imageLoader_.start();\n  }\n};\n\n\n/**\n * Handles image load events from the ImageLoader.\n *\n * @param {goog.events.Event} e The event object.\n * @private\n */\ngoog.ui.emoji.EmojiPalette.prototype.handleImageLoad_ = function(e) {\n  var id = e.target.id;\n  var url = e.target.src;\n  // Just to be safe, we check to make sure we have an id and src url from\n  // the event target, which the ImageLoader sets to an Image object.\n  if (id && url) {\n    var item = this.emoji_[this.emojiMap_[id]];\n    if (item) {\n      this.getRenderer().updateAnimatedPaletteItem(item, e.target);\n    }\n  }\n};\n\n\n/**\n * Returns the image loader that this palette uses. Used for testing.\n *\n * @return {goog.net.ImageLoader} the image loader.\n */\ngoog.ui.emoji.EmojiPalette.prototype.getImageLoader = function() {\n  return this.imageLoader_;\n};\n\n\n/** @override */\ngoog.ui.emoji.EmojiPalette.prototype.disposeInternal = function() {\n  goog.ui.emoji.EmojiPalette.superClass_.disposeInternal.call(this);\n\n  if (this.imageLoader_) {\n    this.imageLoader_.dispose();\n    this.imageLoader_ = null;\n  }\n  this.animatedEmoji_ = null;\n  this.emojiCells_ = null;\n  this.emojiMap_ = null;\n  this.emoji_ = null;\n};\n\n\n/**\n * Returns a goomoji id from an img or the containing td, or null if none\n * exists for that element.\n *\n * @param {Element} el The element to get the Goomoji id from.\n * @return {?string} A goomoji id from an img or the containing td, or null if\n *     none exists for that element.\n * @private\n */\ngoog.ui.emoji.EmojiPalette.prototype.getGoomojiIdFromElement_ = function(el) {\n  if (!el) {\n    return null;\n  }\n\n  var item = this.getRenderer().getContainingItem(this, el);\n  if (item) {\n    return item.getAttribute(goog.ui.emoji.Emoji.ATTRIBUTE) != '' ?\n        item.getAttribute(goog.ui.emoji.Emoji.ATTRIBUTE) :\n        item.getAttribute(goog.ui.emoji.Emoji.DATA_ATTRIBUTE);\n  }\n  return null;\n};\n\n\n/**\n * @return {goog.ui.emoji.Emoji} The currently selected emoji from this palette.\n */\ngoog.ui.emoji.EmojiPalette.prototype.getSelectedEmoji = function() {\n  var elem = /** @type {Element} */ (this.getSelectedItem());\n  var goomojiId = this.getGoomojiIdFromElement_(elem);\n  return this.emojiCells_[goomojiId];\n};\n\n\n/**\n * @return {number} The number of emoji managed by this palette.\n */\ngoog.ui.emoji.EmojiPalette.prototype.getNumberOfEmoji = function() {\n  return this.emojiCells_.length;\n};\n\n\n/**\n * Returns the index of the specified emoji within this palette.\n *\n * @param {string} id Id of the emoji to look up.\n * @return {number} The index of the specified emoji within this palette.\n */\ngoog.ui.emoji.EmojiPalette.prototype.getEmojiIndex = function(id) {\n  return this.emojiMap_[id];\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.ui.emoji.EmojiPaletteRenderer","^9>","^:I","~$goog.ui.emoji.Emoji","~$goog.ui.Palette","~$goog.net.ImageLoader"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/emoji/emojipalette.js"],"^:1",["^9K",["~$goog.ui.emoji.EmojiPalette"]],"^9<",true,"^9=",["^9>","^:I","^MH","^MG","^MF","^ME"]],["^ ","^9A",[1579837703000],"^9B","goog.i18n.compactnumberformatsymbols.js","^9C",["^9D","goog/i18n/compactnumberformatsymbols.js"],"^9E","goog/i18n/compactnumberformatsymbols.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Compact number formatting symbols.\n *\n * File generated from CLDR ver. 35\n *\n * To reduce the file size (which may cause issues in some JS\n * developing environments), this file will only contain locales\n * that are frequently used by web applications. This is defined as\n * proto/closure_locales_data.txt and will change (most likely addition)\n * over time.  Rest of the data can be found in another file named\n * \"compactnumberformatsymbolsext.js\", which will be generated at\n * the same time together with this file.\n *\n * @suppress {const}\n */\n\n// clang-format off\n\ngoog.provide('goog.i18n.CompactNumberFormatSymbols');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_af');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_am');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_DZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_EG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_az');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_be');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bg');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_br');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bs');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ca');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_chr');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_cs');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_cy');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_da');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_de');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_de_AT');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_de_CH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_el');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_AU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_CA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_GB');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_IE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_SG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_US');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_ZA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_419');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_ES');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_MX');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_US');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_et');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_eu');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fa');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fi');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fil');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_CA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ga');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_gl');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_gsw');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_gu');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_haw');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_he');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_hi');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_hr');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_hu');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_hy');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_id');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_in');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_is');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_it');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_iw');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ja');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ka');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kk');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_km');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ko');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ky');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ln');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lo');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lt');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lv');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mk');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ml');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mo');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mr');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ms');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mt');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_my');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nb');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ne');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nl');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_no');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_no_NO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_or');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pa');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pl');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pt');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pt_BR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pt_PT');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ro');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ru');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sh');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_si');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sk');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sl');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sq');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sr');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sr_Latn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sv');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sw');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ta');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_te');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_th');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_tl');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_tr');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_uk');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ur');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_uz');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_vi');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zh');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zh_CN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zh_HK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zh_TW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zu');\n\n\n/**\n * Compact number formatting symbols for locale af.\n */\ngoog.i18n.CompactNumberFormatSymbols_af = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 k'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000': {\n      'other': '0 m'\n    },\n    '10000000': {\n      'other': '00 m'\n    },\n    '100000000': {\n      'other': '000 m'\n    },\n    '1000000000': {\n      'other': '0 mjd'\n    },\n    '10000000000': {\n      'other': '00 mjd'\n    },\n    '100000000000': {\n      'other': '000 mjd'\n    },\n    '1000000000000': {\n      'other': '0 bn'\n    },\n    '10000000000000': {\n      'other': '00 bn'\n    },\n    '100000000000000': {\n      'other': '000 bn'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 duisend'\n    },\n    '10000': {\n      'other': '00 duisend'\n    },\n    '100000': {\n      'other': '000 duisend'\n    },\n    '1000000': {\n      'other': '0 miljoen'\n    },\n    '10000000': {\n      'other': '00 miljoen'\n    },\n    '100000000': {\n      'other': '000 miljoen'\n    },\n    '1000000000': {\n      'other': '0 miljard'\n    },\n    '10000000000': {\n      'other': '00 miljard'\n    },\n    '100000000000': {\n      'other': '000 miljard'\n    },\n    '1000000000000': {\n      'other': '0 biljoen'\n    },\n    '10000000000000': {\n      'other': '00 biljoen'\n    },\n    '100000000000000': {\n      'other': '000 biljoen'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale am.\n */\ngoog.i18n.CompactNumberFormatSymbols_am = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 ሺ'\n    },\n    '10000': {\n      'other': '00 ሺ'\n    },\n    '100000': {\n      'other': '000 ሺ'\n    },\n    '1000000': {\n      'other': '0 ሜትር'\n    },\n    '10000000': {\n      'other': '00 ሜትር'\n    },\n    '100000000': {\n      'other': '000ሜ'\n    },\n    '1000000000': {\n      'other': '0 ቢ'\n    },\n    '10000000000': {\n      'other': '00 ቢ'\n    },\n    '100000000000': {\n      'other': '000 ቢ'\n    },\n    '1000000000000': {\n      'other': '0 ት'\n    },\n    '10000000000000': {\n      'other': '00 ት'\n    },\n    '100000000000000': {\n      'other': '000 ት'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ሺ'\n    },\n    '10000': {\n      'other': '00 ሺ'\n    },\n    '100000': {\n      'other': '000 ሺ'\n    },\n    '1000000': {\n      'other': '0 ሚሊዮን'\n    },\n    '10000000': {\n      'other': '00 ሚሊዮን'\n    },\n    '100000000': {\n      'other': '000 ሚሊዮን'\n    },\n    '1000000000': {\n      'other': '0 ቢሊዮን'\n    },\n    '10000000000': {\n      'other': '00 ቢሊዮን'\n    },\n    '100000000000': {\n      'other': '000 ቢሊዮን'\n    },\n    '1000000000000': {\n      'other': '0 ትሪሊዮን'\n    },\n    '10000000000000': {\n      'other': '00 ትሪሊዮን'\n    },\n    '100000000000000': {\n      'other': '000 ትሪሊዮን'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ar.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 ألف'\n    },\n    '10000': {\n      'other': '00 ألف'\n    },\n    '100000': {\n      'other': '000 ألف'\n    },\n    '1000000': {\n      'other': '0 مليون'\n    },\n    '10000000': {\n      'other': '00 مليون'\n    },\n    '100000000': {\n      'other': '000 مليون'\n    },\n    '1000000000': {\n      'other': '0 مليار'\n    },\n    '10000000000': {\n      'other': '00 مليار'\n    },\n    '100000000000': {\n      'other': '000 مليار'\n    },\n    '1000000000000': {\n      'other': '0 ترليون'\n    },\n    '10000000000000': {\n      'other': '00 ترليون'\n    },\n    '100000000000000': {\n      'other': '000 ترليون'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ألف'\n    },\n    '10000': {\n      'other': '00 ألف'\n    },\n    '100000': {\n      'other': '000 ألف'\n    },\n    '1000000': {\n      'other': '0 مليون'\n    },\n    '10000000': {\n      'other': '00 مليون'\n    },\n    '100000000': {\n      'other': '000 مليون'\n    },\n    '1000000000': {\n      'other': '0 مليار'\n    },\n    '10000000000': {\n      'other': '00 مليار'\n    },\n    '100000000000': {\n      'other': '000 مليار'\n    },\n    '1000000000000': {\n      'other': '0 ترليون'\n    },\n    '10000000000000': {\n      'other': '00 ترليون'\n    },\n    '100000000000000': {\n      'other': '000 ترليون'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ar_DZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_DZ = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_EG.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_EG = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale az.\n */\ngoog.i18n.CompactNumberFormatSymbols_az = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 min'\n    },\n    '10000': {\n      'other': '00 min'\n    },\n    '100000': {\n      'other': '000 min'\n    },\n    '1000000': {\n      'other': '0 milyon'\n    },\n    '10000000': {\n      'other': '00 milyon'\n    },\n    '100000000': {\n      'other': '000 milyon'\n    },\n    '1000000000': {\n      'other': '0 milyard'\n    },\n    '10000000000': {\n      'other': '00 milyard'\n    },\n    '100000000000': {\n      'other': '000 milyard'\n    },\n    '1000000000000': {\n      'other': '0 trilyon'\n    },\n    '10000000000000': {\n      'other': '00 trilyon'\n    },\n    '100000000000000': {\n      'other': '000 trilyon'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale be.\n */\ngoog.i18n.CompactNumberFormatSymbols_be = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 тыс.'\n    },\n    '10000': {\n      'other': '00 тыс.'\n    },\n    '100000': {\n      'other': '000 тыс.'\n    },\n    '1000000': {\n      'other': '0 млн'\n    },\n    '10000000': {\n      'other': '00 млн'\n    },\n    '100000000': {\n      'other': '000 млн'\n    },\n    '1000000000': {\n      'other': '0 млрд'\n    },\n    '10000000000': {\n      'other': '00 млрд'\n    },\n    '100000000000': {\n      'other': '000 млрд'\n    },\n    '1000000000000': {\n      'other': '0 трлн'\n    },\n    '10000000000000': {\n      'other': '00 трлн'\n    },\n    '100000000000000': {\n      'other': '000 трлн'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 тысячы'\n    },\n    '10000': {\n      'other': '00 тысячы'\n    },\n    '100000': {\n      'other': '000 тысячы'\n    },\n    '1000000': {\n      'other': '0 мільёна'\n    },\n    '10000000': {\n      'other': '00 мільёна'\n    },\n    '100000000': {\n      'other': '000 мільёна'\n    },\n    '1000000000': {\n      'other': '0 мільярда'\n    },\n    '10000000000': {\n      'other': '00 мільярда'\n    },\n    '100000000000': {\n      'other': '000 мільярда'\n    },\n    '1000000000000': {\n      'other': '0 трыльёна'\n    },\n    '10000000000000': {\n      'other': '00 трыльёна'\n    },\n    '100000000000000': {\n      'other': '000 трыльёна'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale bg.\n */\ngoog.i18n.CompactNumberFormatSymbols_bg = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 хил.'\n    },\n    '10000': {\n      'other': '00 хил.'\n    },\n    '100000': {\n      'other': '000 хил.'\n    },\n    '1000000': {\n      'other': '0 млн.'\n    },\n    '10000000': {\n      'other': '00 млн.'\n    },\n    '100000000': {\n      'other': '000 млн.'\n    },\n    '1000000000': {\n      'other': '0 млрд.'\n    },\n    '10000000000': {\n      'other': '00 млрд.'\n    },\n    '100000000000': {\n      'other': '000 млрд.'\n    },\n    '1000000000000': {\n      'other': '0 трлн.'\n    },\n    '10000000000000': {\n      'other': '00 трлн.'\n    },\n    '100000000000000': {\n      'other': '000 трлн.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 хиляди'\n    },\n    '10000': {\n      'other': '00 хиляди'\n    },\n    '100000': {\n      'other': '000 хиляди'\n    },\n    '1000000': {\n      'other': '0 милиона'\n    },\n    '10000000': {\n      'other': '00 милиона'\n    },\n    '100000000': {\n      'other': '000 милиона'\n    },\n    '1000000000': {\n      'other': '0 милиарда'\n    },\n    '10000000000': {\n      'other': '00 милиарда'\n    },\n    '100000000000': {\n      'other': '000 милиарда'\n    },\n    '1000000000000': {\n      'other': '0 трилиона'\n    },\n    '10000000000000': {\n      'other': '00 трилиона'\n    },\n    '100000000000000': {\n      'other': '000 трилиона'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale bn.\n */\ngoog.i18n.CompactNumberFormatSymbols_bn = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 হা'\n    },\n    '10000': {\n      'other': '00 হা'\n    },\n    '100000': {\n      'other': '0 লা'\n    },\n    '1000000': {\n      'other': '00 লা'\n    },\n    '10000000': {\n      'other': '0 কো'\n    },\n    '100000000': {\n      'other': '00 কো'\n    },\n    '1000000000': {\n      'other': '000 কো'\n    },\n    '10000000000': {\n      'other': '0000 কো'\n    },\n    '100000000000': {\n      'other': '00000 কো'\n    },\n    '1000000000000': {\n      'other': '0 লা.কো.'\n    },\n    '10000000000000': {\n      'other': '00 লা.কো.'\n    },\n    '100000000000000': {\n      'other': '000 লা.কো.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 হাজার'\n    },\n    '10000': {\n      'other': '00 হাজার'\n    },\n    '100000': {\n      'other': '0 লাখ'\n    },\n    '1000000': {\n      'other': '00 লাখ'\n    },\n    '10000000': {\n      'other': '0 কোটি'\n    },\n    '100000000': {\n      'other': '00 কোটি'\n    },\n    '1000000000': {\n      'other': '000 কোটি'\n    },\n    '10000000000': {\n      'other': '0000 কোটি'\n    },\n    '100000000000': {\n      'other': '00000 কোটি'\n    },\n    '1000000000000': {\n      'other': '0 লাখ কোটি'\n    },\n    '10000000000000': {\n      'other': '00 লাখ কোটি'\n    },\n    '100000000000000': {\n      'other': '000 লাখ কোটি'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale br.\n */\ngoog.i18n.CompactNumberFormatSymbols_br = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0k'\n    },\n    '10000': {\n      'other': '00k'\n    },\n    '100000': {\n      'other': '000k'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 miliad'\n    },\n    '10000': {\n      'other': '00 miliad'\n    },\n    '100000': {\n      'other': '000 miliad'\n    },\n    '1000000': {\n      'other': '0 milion'\n    },\n    '10000000': {\n      'other': '00 milion'\n    },\n    '100000000': {\n      'other': '000 milion'\n    },\n    '1000000000': {\n      'other': '0 miliard'\n    },\n    '10000000000': {\n      'other': '00 miliard'\n    },\n    '100000000000': {\n      'other': '000 miliard'\n    },\n    '1000000000000': {\n      'other': '0 bilion'\n    },\n    '10000000000000': {\n      'other': '00 bilion'\n    },\n    '100000000000000': {\n      'other': '000 bilion'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale bs.\n */\ngoog.i18n.CompactNumberFormatSymbols_bs = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 hilj.'\n    },\n    '10000': {\n      'other': '00 hilj.'\n    },\n    '100000': {\n      'other': '000 hilj.'\n    },\n    '1000000': {\n      'other': '0 mil.'\n    },\n    '10000000': {\n      'other': '00 mil.'\n    },\n    '100000000': {\n      'other': '000 mil.'\n    },\n    '1000000000': {\n      'other': '0 mlr.'\n    },\n    '10000000000': {\n      'other': '00 mlr.'\n    },\n    '100000000000': {\n      'other': '000 mlr.'\n    },\n    '1000000000000': {\n      'other': '0 bil.'\n    },\n    '10000000000000': {\n      'other': '00 bil.'\n    },\n    '100000000000000': {\n      'other': '000 bil.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 hiljada'\n    },\n    '10000': {\n      'other': '00 hiljada'\n    },\n    '100000': {\n      'other': '000 hiljada'\n    },\n    '1000000': {\n      'other': '0 miliona'\n    },\n    '10000000': {\n      'other': '00 miliona'\n    },\n    '100000000': {\n      'other': '000 miliona'\n    },\n    '1000000000': {\n      'other': '0 milijardi'\n    },\n    '10000000000': {\n      'other': '00 milijardi'\n    },\n    '100000000000': {\n      'other': '000 milijardi'\n    },\n    '1000000000000': {\n      'other': '0 biliona'\n    },\n    '10000000000000': {\n      'other': '00 biliona'\n    },\n    '100000000000000': {\n      'other': '000 biliona'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ca.\n */\ngoog.i18n.CompactNumberFormatSymbols_ca = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0m'\n    },\n    '10000': {\n      'other': '00m'\n    },\n    '100000': {\n      'other': '000m'\n    },\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0000 M'\n    },\n    '10000000000': {\n      'other': '00mM'\n    },\n    '100000000000': {\n      'other': '000mM'\n    },\n    '1000000000000': {\n      'other': '0 B'\n    },\n    '10000000000000': {\n      'other': '00 B'\n    },\n    '100000000000000': {\n      'other': '000 B'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 milers'\n    },\n    '10000': {\n      'other': '00 milers'\n    },\n    '100000': {\n      'other': '000 milers'\n    },\n    '1000000': {\n      'other': '0 milions'\n    },\n    '10000000': {\n      'other': '00 milions'\n    },\n    '100000000': {\n      'other': '000 milions'\n    },\n    '1000000000': {\n      'other': '0 milers de milions'\n    },\n    '10000000000': {\n      'other': '00 milers de milions'\n    },\n    '100000000000': {\n      'other': '000 milers de milions'\n    },\n    '1000000000000': {\n      'other': '0 bilions'\n    },\n    '10000000000000': {\n      'other': '00 bilions'\n    },\n    '100000000000000': {\n      'other': '000 bilions'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale chr.\n */\ngoog.i18n.CompactNumberFormatSymbols_chr = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ᎢᏯᎦᏴᎵ'\n    },\n    '10000': {\n      'other': '00 ᎢᏯᎦᏴᎵ'\n    },\n    '100000': {\n      'other': '000 ᎢᏯᎦᏴᎵ'\n    },\n    '1000000': {\n      'other': '0 ᎢᏳᏆᏗᏅᏛ'\n    },\n    '10000000': {\n      'other': '00 ᎢᏳᏆᏗᏅᏛ'\n    },\n    '100000000': {\n      'other': '000 ᎢᏳᏆᏗᏅᏛ'\n    },\n    '1000000000': {\n      'other': '0 ᎢᏯᏔᎳᏗᏅᏛ'\n    },\n    '10000000000': {\n      'other': '00 ᎢᏯᏔᎳᏗᏅᏛ'\n    },\n    '100000000000': {\n      'other': '000 ᎢᏯᏔᎳᏗᏅᏛ'\n    },\n    '1000000000000': {\n      'other': '0 ᎢᏯᏦᎠᏗᏅᏛ'\n    },\n    '10000000000000': {\n      'other': '00 ᎢᏯᏦᎠᏗᏅᏛ'\n    },\n    '100000000000000': {\n      'other': '000 ᎢᏯᏦᎠᏗᏅᏛ'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale cs.\n */\ngoog.i18n.CompactNumberFormatSymbols_cs = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 tis.'\n    },\n    '10000': {\n      'other': '00 tis.'\n    },\n    '100000': {\n      'other': '000 tis.'\n    },\n    '1000000': {\n      'other': '0 mil.'\n    },\n    '10000000': {\n      'other': '00 mil.'\n    },\n    '100000000': {\n      'other': '000 mil.'\n    },\n    '1000000000': {\n      'other': '0 mld.'\n    },\n    '10000000000': {\n      'other': '00 mld.'\n    },\n    '100000000000': {\n      'other': '000 mld.'\n    },\n    '1000000000000': {\n      'other': '0 bil.'\n    },\n    '10000000000000': {\n      'other': '00 bil.'\n    },\n    '100000000000000': {\n      'other': '000 bil.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tisíc'\n    },\n    '10000': {\n      'other': '00 tisíc'\n    },\n    '100000': {\n      'other': '000 tisíc'\n    },\n    '1000000': {\n      'other': '0 milionů'\n    },\n    '10000000': {\n      'other': '00 milionů'\n    },\n    '100000000': {\n      'other': '000 milionů'\n    },\n    '1000000000': {\n      'other': '0 miliard'\n    },\n    '10000000000': {\n      'other': '00 miliard'\n    },\n    '100000000000': {\n      'other': '000 miliard'\n    },\n    '1000000000000': {\n      'other': '0 bilionů'\n    },\n    '10000000000000': {\n      'other': '00 bilionů'\n    },\n    '100000000000000': {\n      'other': '000 bilionů'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale cy.\n */\ngoog.i18n.CompactNumberFormatSymbols_cy = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 mil'\n    },\n    '10000': {\n      'other': '00 mil'\n    },\n    '100000': {\n      'other': '000 mil'\n    },\n    '1000000': {\n      'other': '0 miliwn'\n    },\n    '10000000': {\n      'other': '00 miliwn'\n    },\n    '100000000': {\n      'other': '000 miliwn'\n    },\n    '1000000000': {\n      'other': '0 biliwn'\n    },\n    '10000000000': {\n      'other': '00 biliwn'\n    },\n    '100000000000': {\n      'other': '000 biliwn'\n    },\n    '1000000000000': {\n      'other': '0 triliwn'\n    },\n    '10000000000000': {\n      'other': '00 triliwn'\n    },\n    '100000000000000': {\n      'other': '000 triliwn'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale da.\n */\ngoog.i18n.CompactNumberFormatSymbols_da = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 t'\n    },\n    '10000': {\n      'other': '00 t'\n    },\n    '100000': {\n      'other': '000 t'\n    },\n    '1000000': {\n      'other': '0 mio.'\n    },\n    '10000000': {\n      'other': '00 mio.'\n    },\n    '100000000': {\n      'other': '000 mio.'\n    },\n    '1000000000': {\n      'other': '0 mia.'\n    },\n    '10000000000': {\n      'other': '00 mia.'\n    },\n    '100000000000': {\n      'other': '000 mia.'\n    },\n    '1000000000000': {\n      'other': '0 bio.'\n    },\n    '10000000000000': {\n      'other': '00 bio.'\n    },\n    '100000000000000': {\n      'other': '000 bio.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tusind'\n    },\n    '10000': {\n      'other': '00 tusind'\n    },\n    '100000': {\n      'other': '000 tusind'\n    },\n    '1000000': {\n      'other': '0 millioner'\n    },\n    '10000000': {\n      'other': '00 millioner'\n    },\n    '100000000': {\n      'other': '000 millioner'\n    },\n    '1000000000': {\n      'other': '0 milliarder'\n    },\n    '10000000000': {\n      'other': '00 milliarder'\n    },\n    '100000000000': {\n      'other': '000 milliarder'\n    },\n    '1000000000000': {\n      'other': '0 billioner'\n    },\n    '10000000000000': {\n      'other': '00 billioner'\n    },\n    '100000000000000': {\n      'other': '000 billioner'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale de.\n */\ngoog.i18n.CompactNumberFormatSymbols_de = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0'\n    },\n    '100000': {\n      'other': '0'\n    },\n    '1000000': {\n      'other': '0 Mio.'\n    },\n    '10000000': {\n      'other': '00 Mio.'\n    },\n    '100000000': {\n      'other': '000 Mio.'\n    },\n    '1000000000': {\n      'other': '0 Mrd.'\n    },\n    '10000000000': {\n      'other': '00 Mrd.'\n    },\n    '100000000000': {\n      'other': '000 Mrd.'\n    },\n    '1000000000000': {\n      'other': '0 Bio.'\n    },\n    '10000000000000': {\n      'other': '00 Bio.'\n    },\n    '100000000000000': {\n      'other': '000 Bio.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 Tausend'\n    },\n    '10000': {\n      'other': '00 Tausend'\n    },\n    '100000': {\n      'other': '000 Tausend'\n    },\n    '1000000': {\n      'other': '0 Millionen'\n    },\n    '10000000': {\n      'other': '00 Millionen'\n    },\n    '100000000': {\n      'other': '000 Millionen'\n    },\n    '1000000000': {\n      'other': '0 Milliarden'\n    },\n    '10000000000': {\n      'other': '00 Milliarden'\n    },\n    '100000000000': {\n      'other': '000 Milliarden'\n    },\n    '1000000000000': {\n      'other': '0 Billionen'\n    },\n    '10000000000000': {\n      'other': '00 Billionen'\n    },\n    '100000000000000': {\n      'other': '000 Billionen'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale de_AT.\n */\ngoog.i18n.CompactNumberFormatSymbols_de_AT = goog.i18n.CompactNumberFormatSymbols_de;\n\n\n/**\n * Compact number formatting symbols for locale de_CH.\n */\ngoog.i18n.CompactNumberFormatSymbols_de_CH = goog.i18n.CompactNumberFormatSymbols_de;\n\n\n/**\n * Compact number formatting symbols for locale el.\n */\ngoog.i18n.CompactNumberFormatSymbols_el = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 χιλ.'\n    },\n    '10000': {\n      'other': '00 χιλ.'\n    },\n    '100000': {\n      'other': '000 χιλ.'\n    },\n    '1000000': {\n      'other': '0 εκ.'\n    },\n    '10000000': {\n      'other': '00 εκ.'\n    },\n    '100000000': {\n      'other': '000 εκ.'\n    },\n    '1000000000': {\n      'other': '0 δισ.'\n    },\n    '10000000000': {\n      'other': '00 δισ.'\n    },\n    '100000000000': {\n      'other': '000 δισ.'\n    },\n    '1000000000000': {\n      'other': '0 τρισ.'\n    },\n    '10000000000000': {\n      'other': '00 τρισ.'\n    },\n    '100000000000000': {\n      'other': '000 τρισ.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 χιλιάδες'\n    },\n    '10000': {\n      'other': '00 χιλιάδες'\n    },\n    '100000': {\n      'other': '000 χιλιάδες'\n    },\n    '1000000': {\n      'other': '0 εκατομμύρια'\n    },\n    '10000000': {\n      'other': '00 εκατομμύρια'\n    },\n    '100000000': {\n      'other': '000 εκατομμύρια'\n    },\n    '1000000000': {\n      'other': '0 δισεκατομμύρια'\n    },\n    '10000000000': {\n      'other': '00 δισεκατομμύρια'\n    },\n    '100000000000': {\n      'other': '000 δισεκατομμύρια'\n    },\n    '1000000000000': {\n      'other': '0 τρισεκατομμύρια'\n    },\n    '10000000000000': {\n      'other': '00 τρισεκατομμύρια'\n    },\n    '100000000000000': {\n      'other': '000 τρισεκατομμύρια'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale en.\n */\ngoog.i18n.CompactNumberFormatSymbols_en = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 thousand'\n    },\n    '10000': {\n      'other': '00 thousand'\n    },\n    '100000': {\n      'other': '000 thousand'\n    },\n    '1000000': {\n      'other': '0 million'\n    },\n    '10000000': {\n      'other': '00 million'\n    },\n    '100000000': {\n      'other': '000 million'\n    },\n    '1000000000': {\n      'other': '0 billion'\n    },\n    '10000000000': {\n      'other': '00 billion'\n    },\n    '100000000000': {\n      'other': '000 billion'\n    },\n    '1000000000000': {\n      'other': '0 trillion'\n    },\n    '10000000000000': {\n      'other': '00 trillion'\n    },\n    '100000000000000': {\n      'other': '000 trillion'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale en_AU.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_AU = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_CA.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_CA = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_GB.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_GB = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_IE.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_IE = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_IN = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_SG.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_SG = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_US.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_US = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_ZA.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_ZA = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale es.\n */\ngoog.i18n.CompactNumberFormatSymbols_es = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 mil'\n    },\n    '10000': {\n      'other': '00 mil'\n    },\n    '100000': {\n      'other': '000 mil'\n    },\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0000 M'\n    },\n    '10000000000': {\n      'other': '00 mil M'\n    },\n    '100000000000': {\n      'other': '000 mil M'\n    },\n    '1000000000000': {\n      'other': '0 B'\n    },\n    '10000000000000': {\n      'other': '00 B'\n    },\n    '100000000000000': {\n      'other': '000 B'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 mil'\n    },\n    '10000': {\n      'other': '00 mil'\n    },\n    '100000': {\n      'other': '000 mil'\n    },\n    '1000000': {\n      'other': '0 millones'\n    },\n    '10000000': {\n      'other': '00 millones'\n    },\n    '100000000': {\n      'other': '000 millones'\n    },\n    '1000000000': {\n      'other': '0 mil millones'\n    },\n    '10000000000': {\n      'other': '00 mil millones'\n    },\n    '100000000000': {\n      'other': '000 mil millones'\n    },\n    '1000000000000': {\n      'other': '0 billones'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_419.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_419 = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_ES.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_ES = goog.i18n.CompactNumberFormatSymbols_es;\n\n\n/**\n * Compact number formatting symbols for locale es_MX.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_MX = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 k'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0000 M'\n    },\n    '10000000000': {\n      'other': '00 mil M'\n    },\n    '100000000000': {\n      'other': '000 mil M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_US.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_US = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '10000': {\n      'other': '00 K'\n    },\n    '100000': {\n      'other': '000 K'\n    },\n    '1000000000': {\n      'other': '0 B'\n    },\n    '10000000000': {\n      'other': '00 B'\n    },\n    '100000000000': {\n      'other': '000 B'\n    },\n    '1000000000000': {\n      'other': '0 T'\n    },\n    '10000000000000': {\n      'other': '00 T'\n    },\n    '100000000000000': {\n      'other': '000 T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000': {\n      'other': '0 billones'\n    },\n    '10000000000': {\n      'other': '00 billones'\n    },\n    '100000000000': {\n      'other': '000 billones'\n    },\n    '1000000000000': {\n      'other': '0 trillones'\n    },\n    '10000000000000': {\n      'other': '00 trillones'\n    },\n    '100000000000000': {\n      'other': '000 trillones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale et.\n */\ngoog.i18n.CompactNumberFormatSymbols_et = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 tuh'\n    },\n    '10000': {\n      'other': '00 tuh'\n    },\n    '100000': {\n      'other': '000 tuh'\n    },\n    '1000000': {\n      'other': '0 mln'\n    },\n    '10000000': {\n      'other': '00 mln'\n    },\n    '100000000': {\n      'other': '000 mln'\n    },\n    '1000000000': {\n      'other': '0 mld'\n    },\n    '10000000000': {\n      'other': '00 mld'\n    },\n    '100000000000': {\n      'other': '000 mld'\n    },\n    '1000000000000': {\n      'other': '0 trl'\n    },\n    '10000000000000': {\n      'other': '00 trl'\n    },\n    '100000000000000': {\n      'other': '000 trl'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tuhat'\n    },\n    '10000': {\n      'other': '00 tuhat'\n    },\n    '100000': {\n      'other': '000 tuhat'\n    },\n    '1000000': {\n      'other': '0 miljonit'\n    },\n    '10000000': {\n      'other': '00 miljonit'\n    },\n    '100000000': {\n      'other': '000 miljonit'\n    },\n    '1000000000': {\n      'other': '0 miljardit'\n    },\n    '10000000000': {\n      'other': '00 miljardit'\n    },\n    '100000000000': {\n      'other': '000 miljardit'\n    },\n    '1000000000000': {\n      'other': '0 triljonit'\n    },\n    '10000000000000': {\n      'other': '00 triljonit'\n    },\n    '100000000000000': {\n      'other': '000 triljonit'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale eu.\n */\ngoog.i18n.CompactNumberFormatSymbols_eu = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0000'\n    },\n    '10000': {\n      'other': '00000'\n    },\n    '100000': {\n      'other': '000000'\n    },\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0000 M'\n    },\n    '10000000000': {\n      'other': '00000 M'\n    },\n    '100000000000': {\n      'other': '000000 M'\n    },\n    '1000000000000': {\n      'other': '0 B'\n    },\n    '10000000000000': {\n      'other': '00 B'\n    },\n    '100000000000000': {\n      'other': '000 B'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0000'\n    },\n    '10000': {\n      'other': '00000'\n    },\n    '100000': {\n      'other': '000000'\n    },\n    '1000000': {\n      'other': '0 milioi'\n    },\n    '10000000': {\n      'other': '00 milioi'\n    },\n    '100000000': {\n      'other': '000 milioi'\n    },\n    '1000000000': {\n      'other': '0000 milioi'\n    },\n    '10000000000': {\n      'other': '00000 milioi'\n    },\n    '100000000000': {\n      'other': '000000 milioi'\n    },\n    '1000000000000': {\n      'other': '0 bilioi'\n    },\n    '10000000000000': {\n      'other': '00 bilioi'\n    },\n    '100000000000000': {\n      'other': '000 bilioi'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale fa.\n */\ngoog.i18n.CompactNumberFormatSymbols_fa = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 هزار'\n    },\n    '10000': {\n      'other': '00 هزار'\n    },\n    '100000': {\n      'other': '000 هزار'\n    },\n    '1000000': {\n      'other': '0 میلیون'\n    },\n    '10000000': {\n      'other': '00 میلیون'\n    },\n    '100000000': {\n      'other': '000 م'\n    },\n    '1000000000': {\n      'other': '0 م'\n    },\n    '10000000000': {\n      'other': '00 م'\n    },\n    '100000000000': {\n      'other': '000 میلیارد'\n    },\n    '1000000000000': {\n      'other': '0 تریلیون'\n    },\n    '10000000000000': {\n      'other': '00 ت'\n    },\n    '100000000000000': {\n      'other': '000 ت'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 هزار'\n    },\n    '10000': {\n      'other': '00 هزار'\n    },\n    '100000': {\n      'other': '000 هزار'\n    },\n    '1000000': {\n      'other': '0 میلیون'\n    },\n    '10000000': {\n      'other': '00 میلیون'\n    },\n    '100000000': {\n      'other': '000 میلیون'\n    },\n    '1000000000': {\n      'other': '0 میلیارد'\n    },\n    '10000000000': {\n      'other': '00 میلیارد'\n    },\n    '100000000000': {\n      'other': '000 میلیارد'\n    },\n    '1000000000000': {\n      'other': '0 هزارمیلیارد'\n    },\n    '10000000000000': {\n      'other': '00 هزارمیلیارد'\n    },\n    '100000000000000': {\n      'other': '000 هزارمیلیارد'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale fi.\n */\ngoog.i18n.CompactNumberFormatSymbols_fi = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 t.'\n    },\n    '10000': {\n      'other': '00 t.'\n    },\n    '100000': {\n      'other': '000 t.'\n    },\n    '1000000': {\n      'other': '0 milj.'\n    },\n    '10000000': {\n      'other': '00 milj.'\n    },\n    '100000000': {\n      'other': '000 milj.'\n    },\n    '1000000000': {\n      'other': '0 mrd.'\n    },\n    '10000000000': {\n      'other': '00 mrd.'\n    },\n    '100000000000': {\n      'other': '000 mrd.'\n    },\n    '1000000000000': {\n      'other': '0 bilj.'\n    },\n    '10000000000000': {\n      'other': '00 bilj.'\n    },\n    '100000000000000': {\n      'other': '000 bilj.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tuhatta'\n    },\n    '10000': {\n      'other': '00 tuhatta'\n    },\n    '100000': {\n      'other': '000 tuhatta'\n    },\n    '1000000': {\n      'other': '0 miljoonaa'\n    },\n    '10000000': {\n      'other': '00 miljoonaa'\n    },\n    '100000000': {\n      'other': '000 miljoonaa'\n    },\n    '1000000000': {\n      'other': '0 miljardia'\n    },\n    '10000000000': {\n      'other': '00 miljardia'\n    },\n    '100000000000': {\n      'other': '000 miljardia'\n    },\n    '1000000000000': {\n      'other': '0 biljoonaa'\n    },\n    '10000000000000': {\n      'other': '00 biljoonaa'\n    },\n    '100000000000000': {\n      'other': '000 biljoonaa'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale fil.\n */\ngoog.i18n.CompactNumberFormatSymbols_fil = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 na libo'\n    },\n    '10000': {\n      'other': '00 na libo'\n    },\n    '100000': {\n      'other': '000 na libo'\n    },\n    '1000000': {\n      'other': '0 na milyon'\n    },\n    '10000000': {\n      'other': '00 na milyon'\n    },\n    '100000000': {\n      'other': '000 na milyon'\n    },\n    '1000000000': {\n      'other': '0 na bilyon'\n    },\n    '10000000000': {\n      'other': '00 na bilyon'\n    },\n    '100000000000': {\n      'other': '000 na bilyon'\n    },\n    '1000000000000': {\n      'other': '0 na trilyon'\n    },\n    '10000000000000': {\n      'other': '00 na trilyon'\n    },\n    '100000000000000': {\n      'other': '000 na trilyon'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale fr.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 k'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0 Md'\n    },\n    '10000000000': {\n      'other': '00 Md'\n    },\n    '100000000000': {\n      'other': '000 Md'\n    },\n    '1000000000000': {\n      'other': '0 Bn'\n    },\n    '10000000000000': {\n      'other': '00 Bn'\n    },\n    '100000000000000': {\n      'other': '000 Bn'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 mille'\n    },\n    '10000': {\n      'other': '00 mille'\n    },\n    '100000': {\n      'other': '000 mille'\n    },\n    '1000000': {\n      'other': '0 millions'\n    },\n    '10000000': {\n      'other': '00 millions'\n    },\n    '100000000': {\n      'other': '000 millions'\n    },\n    '1000000000': {\n      'other': '0 milliards'\n    },\n    '10000000000': {\n      'other': '00 milliards'\n    },\n    '100000000000': {\n      'other': '000 milliards'\n    },\n    '1000000000000': {\n      'other': '0 billions'\n    },\n    '10000000000000': {\n      'other': '00 billions'\n    },\n    '100000000000000': {\n      'other': '000 billions'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale fr_CA.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_CA = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 k'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0 G'\n    },\n    '10000000000': {\n      'other': '00 G'\n    },\n    '100000000000': {\n      'other': '000 G'\n    },\n    '1000000000000': {\n      'other': '0 T'\n    },\n    '10000000000000': {\n      'other': '00 T'\n    },\n    '100000000000000': {\n      'other': '000 T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 mille'\n    },\n    '10000': {\n      'other': '00 mille'\n    },\n    '100000': {\n      'other': '000 mille'\n    },\n    '1000000': {\n      'other': '0 millions'\n    },\n    '10000000': {\n      'other': '00 millions'\n    },\n    '100000000': {\n      'other': '000 millions'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ga.\n */\ngoog.i18n.CompactNumberFormatSymbols_ga = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0k'\n    },\n    '10000': {\n      'other': '00k'\n    },\n    '100000': {\n      'other': '000k'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 míle'\n    },\n    '10000': {\n      'other': '00 míle'\n    },\n    '100000': {\n      'other': '000 míle'\n    },\n    '1000000': {\n      'other': '0 milliún'\n    },\n    '10000000': {\n      'other': '00 milliún'\n    },\n    '100000000': {\n      'other': '000 milliún'\n    },\n    '1000000000': {\n      'other': '0 billiún'\n    },\n    '10000000000': {\n      'other': '00 billiún'\n    },\n    '100000000000': {\n      'other': '000 billiún'\n    },\n    '1000000000000': {\n      'other': '0 trilliún'\n    },\n    '10000000000000': {\n      'other': '00 trilliún'\n    },\n    '100000000000000': {\n      'other': '000 trilliún'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale gl.\n */\ngoog.i18n.CompactNumberFormatSymbols_gl = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0'\n    },\n    '100000': {\n      'other': '0'\n    },\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0'\n    },\n    '10000000000': {\n      'other': '0'\n    },\n    '100000000000': {\n      'other': '0'\n    },\n    '1000000000000': {\n      'other': '0 B'\n    },\n    '10000000000000': {\n      'other': '00 B'\n    },\n    '100000000000000': {\n      'other': '000 B'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0'\n    },\n    '100000': {\n      'other': '0'\n    },\n    '1000000': {\n      'other': '0 millóns'\n    },\n    '10000000': {\n      'other': '00 millóns'\n    },\n    '100000000': {\n      'other': '000 millóns'\n    },\n    '1000000000': {\n      'other': '0'\n    },\n    '10000000000': {\n      'other': '0'\n    },\n    '100000000000': {\n      'other': '0'\n    },\n    '1000000000000': {\n      'other': '0 billóns'\n    },\n    '10000000000000': {\n      'other': '00 billóns'\n    },\n    '100000000000000': {\n      'other': '000 billóns'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale gsw.\n */\ngoog.i18n.CompactNumberFormatSymbols_gsw = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 Tsg.'\n    },\n    '10000': {\n      'other': '00 Tsg.'\n    },\n    '100000': {\n      'other': '000 Tsg.'\n    },\n    '1000000': {\n      'other': '0 Mio.'\n    },\n    '10000000': {\n      'other': '00 Mio.'\n    },\n    '100000000': {\n      'other': '000 Mio.'\n    },\n    '1000000000': {\n      'other': '0 Mrd.'\n    },\n    '10000000000': {\n      'other': '00 Mrd.'\n    },\n    '100000000000': {\n      'other': '000 Mrd.'\n    },\n    '1000000000000': {\n      'other': '0 Bio.'\n    },\n    '10000000000000': {\n      'other': '00 Bio.'\n    },\n    '100000000000000': {\n      'other': '000 Bio.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 Tuusig'\n    },\n    '10000': {\n      'other': '00 Tuusig'\n    },\n    '100000': {\n      'other': '000 Tuusig'\n    },\n    '1000000': {\n      'other': '0 Millioone'\n    },\n    '10000000': {\n      'other': '00 Millioone'\n    },\n    '100000000': {\n      'other': '000 Millioone'\n    },\n    '1000000000': {\n      'other': '0 Milliarde'\n    },\n    '10000000000': {\n      'other': '00 Milliarde'\n    },\n    '100000000000': {\n      'other': '000 Milliarde'\n    },\n    '1000000000000': {\n      'other': '0 Billioone'\n    },\n    '10000000000000': {\n      'other': '00 Billioone'\n    },\n    '100000000000000': {\n      'other': '000 Billioone'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale gu.\n */\ngoog.i18n.CompactNumberFormatSymbols_gu = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 હજાર'\n    },\n    '10000': {\n      'other': '00 હજાર'\n    },\n    '100000': {\n      'other': '0 લાખ'\n    },\n    '1000000': {\n      'other': '00 લાખ'\n    },\n    '10000000': {\n      'other': '0 કરોડ'\n    },\n    '100000000': {\n      'other': '00 કરોડ'\n    },\n    '1000000000': {\n      'other': '0 અબજ'\n    },\n    '10000000000': {\n      'other': '00 અબજ'\n    },\n    '100000000000': {\n      'other': '0 નિખર્વ'\n    },\n    '1000000000000': {\n      'other': '0 મહાપદ્મ'\n    },\n    '10000000000000': {\n      'other': '0 શંકુ'\n    },\n    '100000000000000': {\n      'other': '0 જલધિ'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 હજાર'\n    },\n    '10000': {\n      'other': '00 હજાર'\n    },\n    '100000': {\n      'other': '0 લાખ'\n    },\n    '1000000': {\n      'other': '00 લાખ'\n    },\n    '10000000': {\n      'other': '0 કરોડ'\n    },\n    '100000000': {\n      'other': '00 કરોડ'\n    },\n    '1000000000': {\n      'other': '0 અબજ'\n    },\n    '10000000000': {\n      'other': '00 અબજ'\n    },\n    '100000000000': {\n      'other': '0 નિખર્વ'\n    },\n    '1000000000000': {\n      'other': '0 મહાપદ્મ'\n    },\n    '10000000000000': {\n      'other': '0 શંકુ'\n    },\n    '100000000000000': {\n      'other': '0 જલધિ'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale haw.\n */\ngoog.i18n.CompactNumberFormatSymbols_haw = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale he.\n */\ngoog.i18n.CompactNumberFormatSymbols_he = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '‏0 אלף'\n    },\n    '10000': {\n      'other': '‏00 אלף'\n    },\n    '100000': {\n      'other': '‏000 אלף'\n    },\n    '1000000': {\n      'other': '‏0 מיליון'\n    },\n    '10000000': {\n      'other': '‏00 מיליון'\n    },\n    '100000000': {\n      'other': '‏000 מיליון'\n    },\n    '1000000000': {\n      'other': '‏0 מיליארד'\n    },\n    '10000000000': {\n      'other': '‏00 מיליארד'\n    },\n    '100000000000': {\n      'other': '‏000 מיליארד'\n    },\n    '1000000000000': {\n      'other': '‏0 טריליון'\n    },\n    '10000000000000': {\n      'other': '‏00 טריליון'\n    },\n    '100000000000000': {\n      'other': '‏000 טריליון'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale hi.\n */\ngoog.i18n.CompactNumberFormatSymbols_hi = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 हज़ार'\n    },\n    '10000': {\n      'other': '00 हज़ार'\n    },\n    '100000': {\n      'other': '0 लाख'\n    },\n    '1000000': {\n      'other': '00 लाख'\n    },\n    '10000000': {\n      'other': '0 क॰'\n    },\n    '100000000': {\n      'other': '00 क॰'\n    },\n    '1000000000': {\n      'other': '0 अ॰'\n    },\n    '10000000000': {\n      'other': '00 अ॰'\n    },\n    '100000000000': {\n      'other': '0 ख॰'\n    },\n    '1000000000000': {\n      'other': '00 ख॰'\n    },\n    '10000000000000': {\n      'other': '0 नील'\n    },\n    '100000000000000': {\n      'other': '00 नील'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 हज़ार'\n    },\n    '10000': {\n      'other': '00 हज़ार'\n    },\n    '100000': {\n      'other': '0 लाख'\n    },\n    '1000000': {\n      'other': '00 लाख'\n    },\n    '10000000': {\n      'other': '0 करोड़'\n    },\n    '100000000': {\n      'other': '00 करोड़'\n    },\n    '1000000000': {\n      'other': '0 अरब'\n    },\n    '10000000000': {\n      'other': '00 अरब'\n    },\n    '100000000000': {\n      'other': '0 खरब'\n    },\n    '1000000000000': {\n      'other': '00 खरब'\n    },\n    '10000000000000': {\n      'other': '000 खरब'\n    },\n    '100000000000000': {\n      'other': '0000 खरब'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale hr.\n */\ngoog.i18n.CompactNumberFormatSymbols_hr = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 tis.'\n    },\n    '10000': {\n      'other': '00 tis.'\n    },\n    '100000': {\n      'other': '000 tis.'\n    },\n    '1000000': {\n      'other': '0 mil.'\n    },\n    '10000000': {\n      'other': '00 mil.'\n    },\n    '100000000': {\n      'other': '000 mil.'\n    },\n    '1000000000': {\n      'other': '0 mlr.'\n    },\n    '10000000000': {\n      'other': '00 mlr.'\n    },\n    '100000000000': {\n      'other': '000 mlr.'\n    },\n    '1000000000000': {\n      'other': '0 bil.'\n    },\n    '10000000000000': {\n      'other': '00 bil.'\n    },\n    '100000000000000': {\n      'other': '000 bil.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tisuća'\n    },\n    '10000': {\n      'other': '00 tisuća'\n    },\n    '100000': {\n      'other': '000 tisuća'\n    },\n    '1000000': {\n      'other': '0 milijuna'\n    },\n    '10000000': {\n      'other': '00 milijuna'\n    },\n    '100000000': {\n      'other': '000 milijuna'\n    },\n    '1000000000': {\n      'other': '0 milijardi'\n    },\n    '10000000000': {\n      'other': '00 milijardi'\n    },\n    '100000000000': {\n      'other': '000 milijardi'\n    },\n    '1000000000000': {\n      'other': '0 bilijuna'\n    },\n    '10000000000000': {\n      'other': '00 bilijuna'\n    },\n    '100000000000000': {\n      'other': '000 bilijuna'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale hu.\n */\ngoog.i18n.CompactNumberFormatSymbols_hu = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 E'\n    },\n    '10000': {\n      'other': '00 E'\n    },\n    '100000': {\n      'other': '000 E'\n    },\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0 Mrd'\n    },\n    '10000000000': {\n      'other': '00 Mrd'\n    },\n    '100000000000': {\n      'other': '000 Mrd'\n    },\n    '1000000000000': {\n      'other': '0 B'\n    },\n    '10000000000000': {\n      'other': '00 B'\n    },\n    '100000000000000': {\n      'other': '000 B'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ezer'\n    },\n    '10000': {\n      'other': '00 ezer'\n    },\n    '100000': {\n      'other': '000 ezer'\n    },\n    '1000000': {\n      'other': '0 millió'\n    },\n    '10000000': {\n      'other': '00 millió'\n    },\n    '100000000': {\n      'other': '000 millió'\n    },\n    '1000000000': {\n      'other': '0 milliárd'\n    },\n    '10000000000': {\n      'other': '00 milliárd'\n    },\n    '100000000000': {\n      'other': '000 milliárd'\n    },\n    '1000000000000': {\n      'other': '0 billió'\n    },\n    '10000000000000': {\n      'other': '00 billió'\n    },\n    '100000000000000': {\n      'other': '000 billió'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale hy.\n */\ngoog.i18n.CompactNumberFormatSymbols_hy = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 հզր'\n    },\n    '10000': {\n      'other': '00 հզր'\n    },\n    '100000': {\n      'other': '000 հզր'\n    },\n    '1000000': {\n      'other': '0 մլն'\n    },\n    '10000000': {\n      'other': '00 մլն'\n    },\n    '100000000': {\n      'other': '000 մլն'\n    },\n    '1000000000': {\n      'other': '0 մլրդ'\n    },\n    '10000000000': {\n      'other': '00 մլրդ'\n    },\n    '100000000000': {\n      'other': '000 մլրդ'\n    },\n    '1000000000000': {\n      'other': '0 տրլն'\n    },\n    '10000000000000': {\n      'other': '00 տրլն'\n    },\n    '100000000000000': {\n      'other': '000 տրլն'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 հազար'\n    },\n    '10000': {\n      'other': '00 հազար'\n    },\n    '100000': {\n      'other': '000 հազար'\n    },\n    '1000000': {\n      'other': '0 միլիոն'\n    },\n    '10000000': {\n      'other': '00 միլիոն'\n    },\n    '100000000': {\n      'other': '000 միլիոն'\n    },\n    '1000000000': {\n      'other': '0 միլիարդ'\n    },\n    '10000000000': {\n      'other': '00 միլիարդ'\n    },\n    '100000000000': {\n      'other': '000 միլիարդ'\n    },\n    '1000000000000': {\n      'other': '0 տրիլիոն'\n    },\n    '10000000000000': {\n      'other': '00 տրիլիոն'\n    },\n    '100000000000000': {\n      'other': '000 տրիլիոն'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale id.\n */\ngoog.i18n.CompactNumberFormatSymbols_id = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 rb'\n    },\n    '10000': {\n      'other': '00 rb'\n    },\n    '100000': {\n      'other': '000 rb'\n    },\n    '1000000': {\n      'other': '0 jt'\n    },\n    '10000000': {\n      'other': '00 jt'\n    },\n    '100000000': {\n      'other': '000 jt'\n    },\n    '1000000000': {\n      'other': '0 M'\n    },\n    '10000000000': {\n      'other': '00 M'\n    },\n    '100000000000': {\n      'other': '000 M'\n    },\n    '1000000000000': {\n      'other': '0 T'\n    },\n    '10000000000000': {\n      'other': '00 T'\n    },\n    '100000000000000': {\n      'other': '000 T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ribu'\n    },\n    '10000': {\n      'other': '00 ribu'\n    },\n    '100000': {\n      'other': '000 ribu'\n    },\n    '1000000': {\n      'other': '0 juta'\n    },\n    '10000000': {\n      'other': '00 juta'\n    },\n    '100000000': {\n      'other': '000 juta'\n    },\n    '1000000000': {\n      'other': '0 miliar'\n    },\n    '10000000000': {\n      'other': '00 miliar'\n    },\n    '100000000000': {\n      'other': '000 miliar'\n    },\n    '1000000000000': {\n      'other': '0 triliun'\n    },\n    '10000000000000': {\n      'other': '00 triliun'\n    },\n    '100000000000000': {\n      'other': '000 triliun'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale in.\n */\ngoog.i18n.CompactNumberFormatSymbols_in = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 rb'\n    },\n    '10000': {\n      'other': '00 rb'\n    },\n    '100000': {\n      'other': '000 rb'\n    },\n    '1000000': {\n      'other': '0 jt'\n    },\n    '10000000': {\n      'other': '00 jt'\n    },\n    '100000000': {\n      'other': '000 jt'\n    },\n    '1000000000': {\n      'other': '0 M'\n    },\n    '10000000000': {\n      'other': '00 M'\n    },\n    '100000000000': {\n      'other': '000 M'\n    },\n    '1000000000000': {\n      'other': '0 T'\n    },\n    '10000000000000': {\n      'other': '00 T'\n    },\n    '100000000000000': {\n      'other': '000 T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ribu'\n    },\n    '10000': {\n      'other': '00 ribu'\n    },\n    '100000': {\n      'other': '000 ribu'\n    },\n    '1000000': {\n      'other': '0 juta'\n    },\n    '10000000': {\n      'other': '00 juta'\n    },\n    '100000000': {\n      'other': '000 juta'\n    },\n    '1000000000': {\n      'other': '0 miliar'\n    },\n    '10000000000': {\n      'other': '00 miliar'\n    },\n    '100000000000': {\n      'other': '000 miliar'\n    },\n    '1000000000000': {\n      'other': '0 triliun'\n    },\n    '10000000000000': {\n      'other': '00 triliun'\n    },\n    '100000000000000': {\n      'other': '000 triliun'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale is.\n */\ngoog.i18n.CompactNumberFormatSymbols_is = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 þ.'\n    },\n    '10000': {\n      'other': '00 þ.'\n    },\n    '100000': {\n      'other': '000 þ.'\n    },\n    '1000000': {\n      'other': '0 m.'\n    },\n    '10000000': {\n      'other': '00 m.'\n    },\n    '100000000': {\n      'other': '000 m.'\n    },\n    '1000000000': {\n      'other': '0 ma.'\n    },\n    '10000000000': {\n      'other': '00 ma.'\n    },\n    '100000000000': {\n      'other': '000 ma.'\n    },\n    '1000000000000': {\n      'other': '0 bn'\n    },\n    '10000000000000': {\n      'other': '00 bn'\n    },\n    '100000000000000': {\n      'other': '000 bn'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 þúsund'\n    },\n    '10000': {\n      'other': '00 þúsund'\n    },\n    '100000': {\n      'other': '000 þúsund'\n    },\n    '1000000': {\n      'other': '0 milljónir'\n    },\n    '10000000': {\n      'other': '00 milljónir'\n    },\n    '100000000': {\n      'other': '000 milljónir'\n    },\n    '1000000000': {\n      'other': '0 milljarðar'\n    },\n    '10000000000': {\n      'other': '00 milljarðar'\n    },\n    '100000000000': {\n      'other': '000 milljarðar'\n    },\n    '1000000000000': {\n      'other': '0 billjónir'\n    },\n    '10000000000000': {\n      'other': '00 billjónir'\n    },\n    '100000000000000': {\n      'other': '000 billjónir'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale it.\n */\ngoog.i18n.CompactNumberFormatSymbols_it = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0'\n    },\n    '100000': {\n      'other': '0'\n    },\n    '1000000': {\n      'other': '0 Mln'\n    },\n    '10000000': {\n      'other': '00 Mln'\n    },\n    '100000000': {\n      'other': '000 Mln'\n    },\n    '1000000000': {\n      'other': '0 Mrd'\n    },\n    '10000000000': {\n      'other': '00 Mrd'\n    },\n    '100000000000': {\n      'other': '000 Mrd'\n    },\n    '1000000000000': {\n      'other': '0 Bln'\n    },\n    '10000000000000': {\n      'other': '00 Bln'\n    },\n    '100000000000000': {\n      'other': '000 Bln'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 mila'\n    },\n    '10000': {\n      'other': '00 mila'\n    },\n    '100000': {\n      'other': '000 mila'\n    },\n    '1000000': {\n      'other': '0 milioni'\n    },\n    '10000000': {\n      'other': '00 milioni'\n    },\n    '100000000': {\n      'other': '000 milioni'\n    },\n    '1000000000': {\n      'other': '0 miliardi'\n    },\n    '10000000000': {\n      'other': '00 miliardi'\n    },\n    '100000000000': {\n      'other': '000 miliardi'\n    },\n    '1000000000000': {\n      'other': '0 mila miliardi'\n    },\n    '10000000000000': {\n      'other': '00 mila miliardi'\n    },\n    '100000000000000': {\n      'other': '000 mila miliardi'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale iw.\n */\ngoog.i18n.CompactNumberFormatSymbols_iw = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '‏0 אלף'\n    },\n    '10000': {\n      'other': '‏00 אלף'\n    },\n    '100000': {\n      'other': '‏000 אלף'\n    },\n    '1000000': {\n      'other': '‏0 מיליון'\n    },\n    '10000000': {\n      'other': '‏00 מיליון'\n    },\n    '100000000': {\n      'other': '‏000 מיליון'\n    },\n    '1000000000': {\n      'other': '‏0 מיליארד'\n    },\n    '10000000000': {\n      'other': '‏00 מיליארד'\n    },\n    '100000000000': {\n      'other': '‏000 מיליארד'\n    },\n    '1000000000000': {\n      'other': '‏0 טריליון'\n    },\n    '10000000000000': {\n      'other': '‏00 טריליון'\n    },\n    '100000000000000': {\n      'other': '‏000 טריליון'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ja.\n */\ngoog.i18n.CompactNumberFormatSymbols_ja = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0万'\n    },\n    '100000': {\n      'other': '00万'\n    },\n    '1000000': {\n      'other': '000万'\n    },\n    '10000000': {\n      'other': '0000万'\n    },\n    '100000000': {\n      'other': '0億'\n    },\n    '1000000000': {\n      'other': '00億'\n    },\n    '10000000000': {\n      'other': '000億'\n    },\n    '100000000000': {\n      'other': '0000億'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0万'\n    },\n    '100000': {\n      'other': '00万'\n    },\n    '1000000': {\n      'other': '000万'\n    },\n    '10000000': {\n      'other': '0000万'\n    },\n    '100000000': {\n      'other': '0億'\n    },\n    '1000000000': {\n      'other': '00億'\n    },\n    '10000000000': {\n      'other': '000億'\n    },\n    '100000000000': {\n      'other': '0000億'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ka.\n */\ngoog.i18n.CompactNumberFormatSymbols_ka = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 ათ.'\n    },\n    '10000': {\n      'other': '00 ათ.'\n    },\n    '100000': {\n      'other': '000 ათ.'\n    },\n    '1000000': {\n      'other': '0 მლნ.'\n    },\n    '10000000': {\n      'other': '00 მლნ.'\n    },\n    '100000000': {\n      'other': '000 მლნ.'\n    },\n    '1000000000': {\n      'other': '0 მლრდ.'\n    },\n    '10000000000': {\n      'other': '00 მლრდ.'\n    },\n    '100000000000': {\n      'other': '000 მლრ.'\n    },\n    '1000000000000': {\n      'other': '0 ტრლ.'\n    },\n    '10000000000000': {\n      'other': '00 ტრლ.'\n    },\n    '100000000000000': {\n      'other': '000 ტრლ.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ათასი'\n    },\n    '10000': {\n      'other': '00 ათასი'\n    },\n    '100000': {\n      'other': '000 ათასი'\n    },\n    '1000000': {\n      'other': '0 მილიონი'\n    },\n    '10000000': {\n      'other': '00 მილიონი'\n    },\n    '100000000': {\n      'other': '000 მილიონი'\n    },\n    '1000000000': {\n      'other': '0 მილიარდი'\n    },\n    '10000000000': {\n      'other': '00 მილიარდი'\n    },\n    '100000000000': {\n      'other': '000 მილიარდი'\n    },\n    '1000000000000': {\n      'other': '0 ტრილიონი'\n    },\n    '10000000000000': {\n      'other': '00 ტრილიონი'\n    },\n    '100000000000000': {\n      'other': '000 ტრილიონი'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale kk.\n */\ngoog.i18n.CompactNumberFormatSymbols_kk = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 мың'\n    },\n    '10000': {\n      'other': '00 мың'\n    },\n    '100000': {\n      'other': '000 м.'\n    },\n    '1000000': {\n      'other': '0 млн'\n    },\n    '10000000': {\n      'other': '00 млн'\n    },\n    '100000000': {\n      'other': '000 млн'\n    },\n    '1000000000': {\n      'other': '0 млрд'\n    },\n    '10000000000': {\n      'other': '00 млрд'\n    },\n    '100000000000': {\n      'other': '000 млрд'\n    },\n    '1000000000000': {\n      'other': '0 трлн'\n    },\n    '10000000000000': {\n      'other': '00 трлн'\n    },\n    '100000000000000': {\n      'other': '000 трлн'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 мың'\n    },\n    '10000': {\n      'other': '00 мың'\n    },\n    '100000': {\n      'other': '000 мың'\n    },\n    '1000000': {\n      'other': '0 миллион'\n    },\n    '10000000': {\n      'other': '00 миллион'\n    },\n    '100000000': {\n      'other': '000 миллион'\n    },\n    '1000000000': {\n      'other': '0 миллиард'\n    },\n    '10000000000': {\n      'other': '00 миллиард'\n    },\n    '100000000000': {\n      'other': '000 миллиард'\n    },\n    '1000000000000': {\n      'other': '0 триллион'\n    },\n    '10000000000000': {\n      'other': '00 триллион'\n    },\n    '100000000000000': {\n      'other': '000 триллион'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale km.\n */\ngoog.i18n.CompactNumberFormatSymbols_km = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0ពាន់'\n    },\n    '10000': {\n      'other': '00 ពាន់'\n    },\n    '100000': {\n      'other': '000 ពាន់'\n    },\n    '1000000': {\n      'other': '0 លាន'\n    },\n    '10000000': {\n      'other': '00 លាន'\n    },\n    '100000000': {\n      'other': '000 លាន'\n    },\n    '1000000000': {\n      'other': '0 ប៊ីលាន'\n    },\n    '10000000000': {\n      'other': '00 ប៊ីលាន'\n    },\n    '100000000000': {\n      'other': '000 ប៊ីលាន'\n    },\n    '1000000000000': {\n      'other': '0 ទ្រីលាន'\n    },\n    '10000000000000': {\n      'other': '00 ទ្រីលាន'\n    },\n    '100000000000000': {\n      'other': '000 ទ្រីលាន'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ពាន់'\n    },\n    '10000': {\n      'other': '00 ពាន់'\n    },\n    '100000': {\n      'other': '000ពាន់'\n    },\n    '1000000': {\n      'other': '0 លាន'\n    },\n    '10000000': {\n      'other': '00 លាន'\n    },\n    '100000000': {\n      'other': '000 លាន'\n    },\n    '1000000000': {\n      'other': '0 ប៊ីលាន'\n    },\n    '10000000000': {\n      'other': '00 ប៊ីលាន'\n    },\n    '100000000000': {\n      'other': '000 ប៊ីលាន'\n    },\n    '1000000000000': {\n      'other': '0 ទ្រីលាន'\n    },\n    '10000000000000': {\n      'other': '00 ទ្រីលាន'\n    },\n    '100000000000000': {\n      'other': '000 ទ្រីលាន'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale kn.\n */\ngoog.i18n.CompactNumberFormatSymbols_kn = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0ಸಾ'\n    },\n    '10000': {\n      'other': '00ಸಾ'\n    },\n    '100000': {\n      'other': '000ಸಾ'\n    },\n    '1000000': {\n      'other': '0ಮಿ'\n    },\n    '10000000': {\n      'other': '00ಮಿ'\n    },\n    '100000000': {\n      'other': '000ಮಿ'\n    },\n    '1000000000': {\n      'other': '0ಬಿ'\n    },\n    '10000000000': {\n      'other': '00ಬಿ'\n    },\n    '100000000000': {\n      'other': '000ಬಿ'\n    },\n    '1000000000000': {\n      'other': '0ಟ್ರಿ'\n    },\n    '10000000000000': {\n      'other': '00ಟ್ರಿ'\n    },\n    '100000000000000': {\n      'other': '000ಟ್ರಿ'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ಸಾವಿರ'\n    },\n    '10000': {\n      'other': '00 ಸಾವಿರ'\n    },\n    '100000': {\n      'other': '000 ಸಾವಿರ'\n    },\n    '1000000': {\n      'other': '0 ಮಿಲಿಯನ್'\n    },\n    '10000000': {\n      'other': '00 ಮಿಲಿಯನ್'\n    },\n    '100000000': {\n      'other': '000 ಮಿಲಿಯನ್'\n    },\n    '1000000000': {\n      'other': '0 ಬಿಲಿಯನ್'\n    },\n    '10000000000': {\n      'other': '00 ಬಿಲಿಯನ್'\n    },\n    '100000000000': {\n      'other': '000 ಬಿಲಿಯನ್'\n    },\n    '1000000000000': {\n      'other': '0 ಟ್ರಿಲಿಯನ್‌'\n    },\n    '10000000000000': {\n      'other': '00 ಟ್ರಿಲಿಯನ್‌'\n    },\n    '100000000000000': {\n      'other': '000 ಟ್ರಿಲಿಯನ್‌'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ko.\n */\ngoog.i18n.CompactNumberFormatSymbols_ko = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0천'\n    },\n    '10000': {\n      'other': '0만'\n    },\n    '100000': {\n      'other': '00만'\n    },\n    '1000000': {\n      'other': '000만'\n    },\n    '10000000': {\n      'other': '0000만'\n    },\n    '100000000': {\n      'other': '0억'\n    },\n    '1000000000': {\n      'other': '00억'\n    },\n    '10000000000': {\n      'other': '000억'\n    },\n    '100000000000': {\n      'other': '0000억'\n    },\n    '1000000000000': {\n      'other': '0조'\n    },\n    '10000000000000': {\n      'other': '00조'\n    },\n    '100000000000000': {\n      'other': '000조'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0천'\n    },\n    '10000': {\n      'other': '0만'\n    },\n    '100000': {\n      'other': '00만'\n    },\n    '1000000': {\n      'other': '000만'\n    },\n    '10000000': {\n      'other': '0000만'\n    },\n    '100000000': {\n      'other': '0억'\n    },\n    '1000000000': {\n      'other': '00억'\n    },\n    '10000000000': {\n      'other': '000억'\n    },\n    '100000000000': {\n      'other': '0000억'\n    },\n    '1000000000000': {\n      'other': '0조'\n    },\n    '10000000000000': {\n      'other': '00조'\n    },\n    '100000000000000': {\n      'other': '000조'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ky.\n */\ngoog.i18n.CompactNumberFormatSymbols_ky = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 миң'\n    },\n    '10000': {\n      'other': '00 миң'\n    },\n    '100000': {\n      'other': '000 миң'\n    },\n    '1000000': {\n      'other': '0 млн'\n    },\n    '10000000': {\n      'other': '00 млн'\n    },\n    '100000000': {\n      'other': '000 млн'\n    },\n    '1000000000': {\n      'other': '0 млд'\n    },\n    '10000000000': {\n      'other': '00 млд'\n    },\n    '100000000000': {\n      'other': '000 млд'\n    },\n    '1000000000000': {\n      'other': '0 трлн'\n    },\n    '10000000000000': {\n      'other': '00 трлн'\n    },\n    '100000000000000': {\n      'other': '000 трлн'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 миң'\n    },\n    '10000': {\n      'other': '00 миң'\n    },\n    '100000': {\n      'other': '000 миң'\n    },\n    '1000000': {\n      'other': '0 миллион'\n    },\n    '10000000': {\n      'other': '00 миллион'\n    },\n    '100000000': {\n      'other': '000 миллион'\n    },\n    '1000000000': {\n      'other': '0 миллиард'\n    },\n    '10000000000': {\n      'other': '00 миллиард'\n    },\n    '100000000000': {\n      'other': '000 миллиард'\n    },\n    '1000000000000': {\n      'other': '0 триллион'\n    },\n    '10000000000000': {\n      'other': '00 триллион'\n    },\n    '100000000000000': {\n      'other': '000 триллион'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ln.\n */\ngoog.i18n.CompactNumberFormatSymbols_ln = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale lo.\n */\ngoog.i18n.CompactNumberFormatSymbols_lo = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 ພັນ'\n    },\n    '10000': {\n      'other': '00 ພັນ'\n    },\n    '100000': {\n      'other': '000 ກີບ'\n    },\n    '1000000': {\n      'other': '0 ລ້ານ'\n    },\n    '10000000': {\n      'other': '00 ລ້ານ'\n    },\n    '100000000': {\n      'other': '000 ລ້ານ'\n    },\n    '1000000000': {\n      'other': '0 ຕື້'\n    },\n    '10000000000': {\n      'other': '00 ຕື້'\n    },\n    '100000000000': {\n      'other': '000 ຕື້'\n    },\n    '1000000000000': {\n      'other': '0 ລ້ານລ້ານ'\n    },\n    '10000000000000': {\n      'other': '00ລລ'\n    },\n    '100000000000000': {\n      'other': '000ລລ'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ພັນ'\n    },\n    '10000': {\n      'other': '00 ພັນ'\n    },\n    '100000': {\n      'other': '0 ແສນ'\n    },\n    '1000000': {\n      'other': '0 ລ້ານ'\n    },\n    '10000000': {\n      'other': '00 ລ້ານ'\n    },\n    '100000000': {\n      'other': '000 ລ້ານ'\n    },\n    '1000000000': {\n      'other': '0 ຕື້'\n    },\n    '10000000000': {\n      'other': '00 ຕື້'\n    },\n    '100000000000': {\n      'other': '000 ຕື້'\n    },\n    '1000000000000': {\n      'other': '0 ລ້ານລ້ານ'\n    },\n    '10000000000000': {\n      'other': '00 ລ້ານລ້ານ'\n    },\n    '100000000000000': {\n      'other': '000 ລ້ານລ້ານ'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale lt.\n */\ngoog.i18n.CompactNumberFormatSymbols_lt = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 tūkst.'\n    },\n    '10000': {\n      'other': '00 tūkst.'\n    },\n    '100000': {\n      'other': '000 tūkst.'\n    },\n    '1000000': {\n      'other': '0 mln.'\n    },\n    '10000000': {\n      'other': '00 mln.'\n    },\n    '100000000': {\n      'other': '000 mln.'\n    },\n    '1000000000': {\n      'other': '0 mlrd.'\n    },\n    '10000000000': {\n      'other': '00 mlrd.'\n    },\n    '100000000000': {\n      'other': '000 mlrd.'\n    },\n    '1000000000000': {\n      'other': '0 trln.'\n    },\n    '10000000000000': {\n      'other': '00 trln.'\n    },\n    '100000000000000': {\n      'other': '000 trln.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tūkstančių'\n    },\n    '10000': {\n      'other': '00 tūkstančių'\n    },\n    '100000': {\n      'other': '000 tūkstančių'\n    },\n    '1000000': {\n      'other': '0 milijonų'\n    },\n    '10000000': {\n      'other': '00 milijonų'\n    },\n    '100000000': {\n      'other': '000 milijonų'\n    },\n    '1000000000': {\n      'other': '0 milijardų'\n    },\n    '10000000000': {\n      'other': '00 milijardų'\n    },\n    '100000000000': {\n      'other': '000 milijardų'\n    },\n    '1000000000000': {\n      'other': '0 trilijonų'\n    },\n    '10000000000000': {\n      'other': '00 trilijonų'\n    },\n    '100000000000000': {\n      'other': '000 trilijonų'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale lv.\n */\ngoog.i18n.CompactNumberFormatSymbols_lv = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 tūkst.'\n    },\n    '10000': {\n      'other': '00 tūkst.'\n    },\n    '100000': {\n      'other': '000 tūkst.'\n    },\n    '1000000': {\n      'other': '0 milj.'\n    },\n    '10000000': {\n      'other': '00 milj.'\n    },\n    '100000000': {\n      'other': '000 milj.'\n    },\n    '1000000000': {\n      'other': '0 mljrd.'\n    },\n    '10000000000': {\n      'other': '00 mljrd.'\n    },\n    '100000000000': {\n      'other': '000 mljrd.'\n    },\n    '1000000000000': {\n      'other': '0 trilj.'\n    },\n    '10000000000000': {\n      'other': '00 trilj.'\n    },\n    '100000000000000': {\n      'other': '000 trilj.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tūkstoši'\n    },\n    '10000': {\n      'other': '00 tūkstoši'\n    },\n    '100000': {\n      'other': '000 tūkstoši'\n    },\n    '1000000': {\n      'other': '0 miljoni'\n    },\n    '10000000': {\n      'other': '00 miljoni'\n    },\n    '100000000': {\n      'other': '000 miljoni'\n    },\n    '1000000000': {\n      'other': '0 miljardi'\n    },\n    '10000000000': {\n      'other': '00 miljardi'\n    },\n    '100000000000': {\n      'other': '000 miljardi'\n    },\n    '1000000000000': {\n      'other': '0 triljoni'\n    },\n    '10000000000000': {\n      'other': '00 triljoni'\n    },\n    '100000000000000': {\n      'other': '000 triljoni'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale mk.\n */\ngoog.i18n.CompactNumberFormatSymbols_mk = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 илј.'\n    },\n    '10000': {\n      'other': '00 илј.'\n    },\n    '100000': {\n      'other': '000 илј.'\n    },\n    '1000000': {\n      'other': '0 мил.'\n    },\n    '10000000': {\n      'other': '00 мил.'\n    },\n    '100000000': {\n      'other': '000 М'\n    },\n    '1000000000': {\n      'other': '0 милј.'\n    },\n    '10000000000': {\n      'other': '00 милј.'\n    },\n    '100000000000': {\n      'other': '000 ми.'\n    },\n    '1000000000000': {\n      'other': '0 бил.'\n    },\n    '10000000000000': {\n      'other': '00 бил.'\n    },\n    '100000000000000': {\n      'other': '000 бил.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 илјади'\n    },\n    '10000': {\n      'other': '00 илјади'\n    },\n    '100000': {\n      'other': '000 илјади'\n    },\n    '1000000': {\n      'other': '0 милиони'\n    },\n    '10000000': {\n      'other': '00 милиони'\n    },\n    '100000000': {\n      'other': '000 милиони'\n    },\n    '1000000000': {\n      'other': '0 милијарди'\n    },\n    '10000000000': {\n      'other': '00 милијарди'\n    },\n    '100000000000': {\n      'other': '000 милијарди'\n    },\n    '1000000000000': {\n      'other': '0 билиони'\n    },\n    '10000000000000': {\n      'other': '00 билиони'\n    },\n    '100000000000000': {\n      'other': '000 билиони'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ml.\n */\ngoog.i18n.CompactNumberFormatSymbols_ml = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ആയിരം'\n    },\n    '10000': {\n      'other': '00 ആയിരം'\n    },\n    '100000': {\n      'other': '000 ആയിരം'\n    },\n    '1000000': {\n      'other': '0 ദശലക്ഷം'\n    },\n    '10000000': {\n      'other': '00 ദശലക്ഷം'\n    },\n    '100000000': {\n      'other': '000 ദശലക്ഷം'\n    },\n    '1000000000': {\n      'other': '0 ലക്ഷം കോടി'\n    },\n    '10000000000': {\n      'other': '00 ലക്ഷം കോടി'\n    },\n    '100000000000': {\n      'other': '000 ലക്ഷം കോടി'\n    },\n    '1000000000000': {\n      'other': '0 ട്രില്യൺ'\n    },\n    '10000000000000': {\n      'other': '00 ട്രില്യൺ'\n    },\n    '100000000000000': {\n      'other': '000 ട്രില്യൺ'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale mn.\n */\ngoog.i18n.CompactNumberFormatSymbols_mn = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 мянга'\n    },\n    '10000': {\n      'other': '00 мянга'\n    },\n    '100000': {\n      'other': '000 мянга'\n    },\n    '1000000': {\n      'other': '0 сая'\n    },\n    '10000000': {\n      'other': '00 сая'\n    },\n    '100000000': {\n      'other': '000 сая'\n    },\n    '1000000000': {\n      'other': '0 тэрбум'\n    },\n    '10000000000': {\n      'other': '00 тэрбум'\n    },\n    '100000000000': {\n      'other': '000Т'\n    },\n    '1000000000000': {\n      'other': '0ИН'\n    },\n    '10000000000000': {\n      'other': '00ИН'\n    },\n    '100000000000000': {\n      'other': '000ИН'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 мянга'\n    },\n    '10000': {\n      'other': '00 мянга'\n    },\n    '100000': {\n      'other': '000 мянга'\n    },\n    '1000000': {\n      'other': '0 сая'\n    },\n    '10000000': {\n      'other': '00 сая'\n    },\n    '100000000': {\n      'other': '000 сая'\n    },\n    '1000000000': {\n      'other': '0 тэрбум'\n    },\n    '10000000000': {\n      'other': '00 тэрбум'\n    },\n    '100000000000': {\n      'other': '000 тэрбум'\n    },\n    '1000000000000': {\n      'other': '0 их наяд'\n    },\n    '10000000000000': {\n      'other': '00 их наяд'\n    },\n    '100000000000000': {\n      'other': '000 их наяд'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale mo.\n */\ngoog.i18n.CompactNumberFormatSymbols_mo = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 K'\n    },\n    '100000': {\n      'other': '000 K'\n    },\n    '1000000': {\n      'other': '0 mil.'\n    },\n    '10000000': {\n      'other': '00 mil.'\n    },\n    '100000000': {\n      'other': '000 mil.'\n    },\n    '1000000000': {\n      'other': '0 mld.'\n    },\n    '10000000000': {\n      'other': '00 mld.'\n    },\n    '100000000000': {\n      'other': '000 mld.'\n    },\n    '1000000000000': {\n      'other': '0 tril.'\n    },\n    '10000000000000': {\n      'other': '00 tril.'\n    },\n    '100000000000000': {\n      'other': '000 tril.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 de mii'\n    },\n    '10000': {\n      'other': '00 de mii'\n    },\n    '100000': {\n      'other': '000 de mii'\n    },\n    '1000000': {\n      'other': '0 de milioane'\n    },\n    '10000000': {\n      'other': '00 de milioane'\n    },\n    '100000000': {\n      'other': '000 de milioane'\n    },\n    '1000000000': {\n      'other': '0 de miliarde'\n    },\n    '10000000000': {\n      'other': '00 de miliarde'\n    },\n    '100000000000': {\n      'other': '000 de miliarde'\n    },\n    '1000000000000': {\n      'other': '0 de trilioane'\n    },\n    '10000000000000': {\n      'other': '00 de trilioane'\n    },\n    '100000000000000': {\n      'other': '000 de trilioane'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale mr.\n */\ngoog.i18n.CompactNumberFormatSymbols_mr = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 ह'\n    },\n    '10000': {\n      'other': '00 ह'\n    },\n    '100000': {\n      'other': '0 लाख'\n    },\n    '1000000': {\n      'other': '00 लाख'\n    },\n    '10000000': {\n      'other': '0 कोटी'\n    },\n    '100000000': {\n      'other': '00 कोटी'\n    },\n    '1000000000': {\n      'other': '0 अब्ज'\n    },\n    '10000000000': {\n      'other': '00 अब्ज'\n    },\n    '100000000000': {\n      'other': '0 खर्व'\n    },\n    '1000000000000': {\n      'other': '00 खर्व'\n    },\n    '10000000000000': {\n      'other': '0 पद्म'\n    },\n    '100000000000000': {\n      'other': '00 पद्म'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 हजार'\n    },\n    '10000': {\n      'other': '00 हजार'\n    },\n    '100000': {\n      'other': '0 लाख'\n    },\n    '1000000': {\n      'other': '00 लाख'\n    },\n    '10000000': {\n      'other': '0 कोटी'\n    },\n    '100000000': {\n      'other': '00 कोटी'\n    },\n    '1000000000': {\n      'other': '0 अब्ज'\n    },\n    '10000000000': {\n      'other': '00 अब्ज'\n    },\n    '100000000000': {\n      'other': '0 खर्व'\n    },\n    '1000000000000': {\n      'other': '00 खर्व'\n    },\n    '10000000000000': {\n      'other': '0 पद्म'\n    },\n    '100000000000000': {\n      'other': '00 पद्म'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ms.\n */\ngoog.i18n.CompactNumberFormatSymbols_ms = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0J'\n    },\n    '10000000': {\n      'other': '00J'\n    },\n    '100000000': {\n      'other': '000J'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ribu'\n    },\n    '10000': {\n      'other': '00 ribu'\n    },\n    '100000': {\n      'other': '000 ribu'\n    },\n    '1000000': {\n      'other': '0 juta'\n    },\n    '10000000': {\n      'other': '00 juta'\n    },\n    '100000000': {\n      'other': '000 juta'\n    },\n    '1000000000': {\n      'other': '0 bilion'\n    },\n    '10000000000': {\n      'other': '00 bilion'\n    },\n    '100000000000': {\n      'other': '000 bilion'\n    },\n    '1000000000000': {\n      'other': '0 trilion'\n    },\n    '10000000000000': {\n      'other': '00 trilion'\n    },\n    '100000000000000': {\n      'other': '000 trilion'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale mt.\n */\ngoog.i18n.CompactNumberFormatSymbols_mt = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale my.\n */\ngoog.i18n.CompactNumberFormatSymbols_my = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0ထောင်'\n    },\n    '10000': {\n      'other': '0သောင်း'\n    },\n    '100000': {\n      'other': '0သိန်း'\n    },\n    '1000000': {\n      'other': '0သန်း'\n    },\n    '10000000': {\n      'other': '0ကုဋေ'\n    },\n    '100000000': {\n      'other': '00ကုဋေ'\n    },\n    '1000000000': {\n      'other': 'ကုဋေ000'\n    },\n    '10000000000': {\n      'other': 'ကုဋေ0ထ'\n    },\n    '100000000000': {\n      'other': 'ကုဋေ0သ'\n    },\n    '1000000000000': {\n      'other': 'ဋေ0သိန်း'\n    },\n    '10000000000000': {\n      'other': 'ဋေ0သန်း'\n    },\n    '100000000000000': {\n      'other': '0ကောဋိ'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0ထောင်'\n    },\n    '10000': {\n      'other': '0သောင်း'\n    },\n    '100000': {\n      'other': '0သိန်း'\n    },\n    '1000000': {\n      'other': '0သန်း'\n    },\n    '10000000': {\n      'other': '0ကုဋေ'\n    },\n    '100000000': {\n      'other': '00ကုဋေ'\n    },\n    '1000000000': {\n      'other': 'ကုဋေ000'\n    },\n    '10000000000': {\n      'other': 'ကုဋေ0000'\n    },\n    '100000000000': {\n      'other': 'ကုဋေ0သောင်း'\n    },\n    '1000000000000': {\n      'other': 'ကုဋေ0သိန်း'\n    },\n    '10000000000000': {\n      'other': 'ကုဋေ0သန်း'\n    },\n    '100000000000000': {\n      'other': '0ကောဋိ'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale nb.\n */\ngoog.i18n.CompactNumberFormatSymbols_nb = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0k'\n    },\n    '10000': {\n      'other': '00k'\n    },\n    '100000': {\n      'other': '000k'\n    },\n    '1000000': {\n      'other': '0 mill.'\n    },\n    '10000000': {\n      'other': '00 mill.'\n    },\n    '100000000': {\n      'other': '000 mill.'\n    },\n    '1000000000': {\n      'other': '0 mrd.'\n    },\n    '10000000000': {\n      'other': '00 mrd.'\n    },\n    '100000000000': {\n      'other': '000 mrd.'\n    },\n    '1000000000000': {\n      'other': '0 bill.'\n    },\n    '10000000000000': {\n      'other': '00 bill.'\n    },\n    '100000000000000': {\n      'other': '000 bill.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tusen'\n    },\n    '10000': {\n      'other': '00 tusen'\n    },\n    '100000': {\n      'other': '000 tusen'\n    },\n    '1000000': {\n      'other': '0 millioner'\n    },\n    '10000000': {\n      'other': '00 millioner'\n    },\n    '100000000': {\n      'other': '000 millioner'\n    },\n    '1000000000': {\n      'other': '0 milliarder'\n    },\n    '10000000000': {\n      'other': '00 milliarder'\n    },\n    '100000000000': {\n      'other': '000 milliarder'\n    },\n    '1000000000000': {\n      'other': '0 billioner'\n    },\n    '10000000000000': {\n      'other': '00 billioner'\n    },\n    '100000000000000': {\n      'other': '000 billioner'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ne.\n */\ngoog.i18n.CompactNumberFormatSymbols_ne = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 हजार'\n    },\n    '10000': {\n      'other': '00 हजार'\n    },\n    '100000': {\n      'other': '0 लाख'\n    },\n    '1000000': {\n      'other': '00 लाख'\n    },\n    '10000000': {\n      'other': '0 करोड'\n    },\n    '100000000': {\n      'other': '00 करोड'\n    },\n    '1000000000': {\n      'other': '0 अरब'\n    },\n    '10000000000': {\n      'other': '00 अरब'\n    },\n    '100000000000': {\n      'other': '0 खरब'\n    },\n    '1000000000000': {\n      'other': '00 खरब'\n    },\n    '10000000000000': {\n      'other': '0 शंख'\n    },\n    '100000000000000': {\n      'other': '00 शंख'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 हजार'\n    },\n    '10000': {\n      'other': '00 हजार'\n    },\n    '100000': {\n      'other': '0 लाख'\n    },\n    '1000000': {\n      'other': '0 करोड'\n    },\n    '10000000': {\n      'other': '00 करोड'\n    },\n    '100000000': {\n      'other': '000 करोड'\n    },\n    '1000000000': {\n      'other': '0 अरब'\n    },\n    '10000000000': {\n      'other': '00 अरब'\n    },\n    '100000000000': {\n      'other': '000 अरब'\n    },\n    '1000000000000': {\n      'other': '00 खरब'\n    },\n    '10000000000000': {\n      'other': '0 शंख'\n    },\n    '100000000000000': {\n      'other': '00 शंख'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale nl.\n */\ngoog.i18n.CompactNumberFormatSymbols_nl = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0 mln.'\n    },\n    '10000000': {\n      'other': '00 mln.'\n    },\n    '100000000': {\n      'other': '000 mln.'\n    },\n    '1000000000': {\n      'other': '0 mld.'\n    },\n    '10000000000': {\n      'other': '00 mld.'\n    },\n    '100000000000': {\n      'other': '000 mld.'\n    },\n    '1000000000000': {\n      'other': '0 bln.'\n    },\n    '10000000000000': {\n      'other': '00 bln.'\n    },\n    '100000000000000': {\n      'other': '000 bln.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 duizend'\n    },\n    '10000': {\n      'other': '00 duizend'\n    },\n    '100000': {\n      'other': '000 duizend'\n    },\n    '1000000': {\n      'other': '0 miljoen'\n    },\n    '10000000': {\n      'other': '00 miljoen'\n    },\n    '100000000': {\n      'other': '000 miljoen'\n    },\n    '1000000000': {\n      'other': '0 miljard'\n    },\n    '10000000000': {\n      'other': '00 miljard'\n    },\n    '100000000000': {\n      'other': '000 miljard'\n    },\n    '1000000000000': {\n      'other': '0 biljoen'\n    },\n    '10000000000000': {\n      'other': '00 biljoen'\n    },\n    '100000000000000': {\n      'other': '000 biljoen'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale no.\n */\ngoog.i18n.CompactNumberFormatSymbols_no = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0k'\n    },\n    '10000': {\n      'other': '00k'\n    },\n    '100000': {\n      'other': '000k'\n    },\n    '1000000': {\n      'other': '0 mill.'\n    },\n    '10000000': {\n      'other': '00 mill.'\n    },\n    '100000000': {\n      'other': '000 mill.'\n    },\n    '1000000000': {\n      'other': '0 mrd.'\n    },\n    '10000000000': {\n      'other': '00 mrd.'\n    },\n    '100000000000': {\n      'other': '000 mrd.'\n    },\n    '1000000000000': {\n      'other': '0 bill.'\n    },\n    '10000000000000': {\n      'other': '00 bill.'\n    },\n    '100000000000000': {\n      'other': '000 bill.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tusen'\n    },\n    '10000': {\n      'other': '00 tusen'\n    },\n    '100000': {\n      'other': '000 tusen'\n    },\n    '1000000': {\n      'other': '0 millioner'\n    },\n    '10000000': {\n      'other': '00 millioner'\n    },\n    '100000000': {\n      'other': '000 millioner'\n    },\n    '1000000000': {\n      'other': '0 milliarder'\n    },\n    '10000000000': {\n      'other': '00 milliarder'\n    },\n    '100000000000': {\n      'other': '000 milliarder'\n    },\n    '1000000000000': {\n      'other': '0 billioner'\n    },\n    '10000000000000': {\n      'other': '00 billioner'\n    },\n    '100000000000000': {\n      'other': '000 billioner'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale no_NO.\n */\ngoog.i18n.CompactNumberFormatSymbols_no_NO = goog.i18n.CompactNumberFormatSymbols_no;\n\n\n/**\n * Compact number formatting symbols for locale or.\n */\ngoog.i18n.CompactNumberFormatSymbols_or = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0ହ'\n    },\n    '10000': {\n      'other': '00ହ'\n    },\n    '100000': {\n      'other': '000ହ'\n    },\n    '1000000': {\n      'other': '0ନି'\n    },\n    '10000000': {\n      'other': '00ନି'\n    },\n    '100000000': {\n      'other': '000ନି'\n    },\n    '1000000000': {\n      'other': '0ବି'\n    },\n    '10000000000': {\n      'other': '00ବି'\n    },\n    '100000000000': {\n      'other': '000ବି'\n    },\n    '1000000000000': {\n      'other': '0ଟ୍ରି'\n    },\n    '10000000000000': {\n      'other': '00ଟ୍ରି'\n    },\n    '100000000000000': {\n      'other': '000ଟ୍ରି'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ହଜାର'\n    },\n    '10000': {\n      'other': '00 ହଜାର'\n    },\n    '100000': {\n      'other': '000 ହଜାର'\n    },\n    '1000000': {\n      'other': '0 ନିୟୁତ'\n    },\n    '10000000': {\n      'other': '00 ନିୟୁତ'\n    },\n    '100000000': {\n      'other': '000 ନିୟୁତ'\n    },\n    '1000000000': {\n      'other': '0 ଶହକୋଟି'\n    },\n    '10000000000': {\n      'other': '00 ଶହକୋଟି'\n    },\n    '100000000000': {\n      'other': '000 ଶହକୋଟି'\n    },\n    '1000000000000': {\n      'other': '0 ଲକ୍ଷକୋଟି'\n    },\n    '10000000000000': {\n      'other': '00 ଲକ୍ଷକୋଟି'\n    },\n    '100000000000000': {\n      'other': '000 ଲକ୍ଷକୋଟି'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale pa.\n */\ngoog.i18n.CompactNumberFormatSymbols_pa = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 ਹਜ਼ਾਰ'\n    },\n    '10000': {\n      'other': '00 ਹਜ਼ਾਰ'\n    },\n    '100000': {\n      'other': '0 ਲੱਖ'\n    },\n    '1000000': {\n      'other': '00 ਲੱਖ'\n    },\n    '10000000': {\n      'other': '0 ਕਰੋੜ'\n    },\n    '100000000': {\n      'other': '00 ਕਰੋੜ'\n    },\n    '1000000000': {\n      'other': '0 ਅਰਬ'\n    },\n    '10000000000': {\n      'other': '00 ਅਰਬ'\n    },\n    '100000000000': {\n      'other': '0 ਖਰਬ'\n    },\n    '1000000000000': {\n      'other': '00 ਖਰਬ'\n    },\n    '10000000000000': {\n      'other': '0 ਨੀਲ'\n    },\n    '100000000000000': {\n      'other': '00 ਨੀਲ'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ਹਜ਼ਾਰ'\n    },\n    '10000': {\n      'other': '00 ਹਜ਼ਾਰ'\n    },\n    '100000': {\n      'other': '0 ਲੱਖ'\n    },\n    '1000000': {\n      'other': '00 ਲੱਖ'\n    },\n    '10000000': {\n      'other': '0 ਕਰੋੜ'\n    },\n    '100000000': {\n      'other': '00 ਕਰੋੜ'\n    },\n    '1000000000': {\n      'other': '0 ਅਰਬ'\n    },\n    '10000000000': {\n      'other': '00 ਅਰਬ'\n    },\n    '100000000000': {\n      'other': '0 ਖਰਬ'\n    },\n    '1000000000000': {\n      'other': '00 ਖਰਬ'\n    },\n    '10000000000000': {\n      'other': '0 ਨੀਲ'\n    },\n    '100000000000000': {\n      'other': '00 ਨੀਲ'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale pl.\n */\ngoog.i18n.CompactNumberFormatSymbols_pl = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 tys.'\n    },\n    '10000': {\n      'other': '00 tys.'\n    },\n    '100000': {\n      'other': '000 tys.'\n    },\n    '1000000': {\n      'other': '0 mln'\n    },\n    '10000000': {\n      'other': '00 mln'\n    },\n    '100000000': {\n      'other': '000 mln'\n    },\n    '1000000000': {\n      'other': '0 mld'\n    },\n    '10000000000': {\n      'other': '00 mld'\n    },\n    '100000000000': {\n      'other': '000 mld'\n    },\n    '1000000000000': {\n      'other': '0 bln'\n    },\n    '10000000000000': {\n      'other': '00 bln'\n    },\n    '100000000000000': {\n      'other': '000 bln'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tysiąca'\n    },\n    '10000': {\n      'other': '00 tysiąca'\n    },\n    '100000': {\n      'other': '000 tysiąca'\n    },\n    '1000000': {\n      'other': '0 miliona'\n    },\n    '10000000': {\n      'other': '00 miliona'\n    },\n    '100000000': {\n      'other': '000 miliona'\n    },\n    '1000000000': {\n      'other': '0 miliarda'\n    },\n    '10000000000': {\n      'other': '00 miliarda'\n    },\n    '100000000000': {\n      'other': '000 miliarda'\n    },\n    '1000000000000': {\n      'other': '0 biliona'\n    },\n    '10000000000000': {\n      'other': '00 biliona'\n    },\n    '100000000000000': {\n      'other': '000 biliona'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale pt.\n */\ngoog.i18n.CompactNumberFormatSymbols_pt = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 mil'\n    },\n    '10000': {\n      'other': '00 mil'\n    },\n    '100000': {\n      'other': '000 mil'\n    },\n    '1000000': {\n      'other': '0 mi'\n    },\n    '10000000': {\n      'other': '00 mi'\n    },\n    '100000000': {\n      'other': '000 mi'\n    },\n    '1000000000': {\n      'other': '0 bi'\n    },\n    '10000000000': {\n      'other': '00 bi'\n    },\n    '100000000000': {\n      'other': '000 bi'\n    },\n    '1000000000000': {\n      'other': '0 tri'\n    },\n    '10000000000000': {\n      'other': '00 tri'\n    },\n    '100000000000000': {\n      'other': '000 tri'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 mil'\n    },\n    '10000': {\n      'other': '00 mil'\n    },\n    '100000': {\n      'other': '000 mil'\n    },\n    '1000000': {\n      'other': '0 milhões'\n    },\n    '10000000': {\n      'other': '00 milhões'\n    },\n    '100000000': {\n      'other': '000 milhões'\n    },\n    '1000000000': {\n      'other': '0 bilhões'\n    },\n    '10000000000': {\n      'other': '00 bilhões'\n    },\n    '100000000000': {\n      'other': '000 bilhões'\n    },\n    '1000000000000': {\n      'other': '0 trilhões'\n    },\n    '10000000000000': {\n      'other': '00 trilhões'\n    },\n    '100000000000000': {\n      'other': '000 trilhões'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale pt_BR.\n */\ngoog.i18n.CompactNumberFormatSymbols_pt_BR = goog.i18n.CompactNumberFormatSymbols_pt;\n\n\n/**\n * Compact number formatting symbols for locale pt_PT.\n */\ngoog.i18n.CompactNumberFormatSymbols_pt_PT = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0 mM'\n    },\n    '10000000000': {\n      'other': '00 mM'\n    },\n    '100000000000': {\n      'other': '000 mM'\n    },\n    '1000000000000': {\n      'other': '0 Bi'\n    },\n    '10000000000000': {\n      'other': '00 Bi'\n    },\n    '100000000000000': {\n      'other': '000 Bi'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000': {\n      'other': '0 milhões'\n    },\n    '10000000': {\n      'other': '00 milhões'\n    },\n    '100000000': {\n      'other': '000 milhões'\n    },\n    '1000000000': {\n      'other': '0 mil milhões'\n    },\n    '10000000000': {\n      'other': '00 mil milhões'\n    },\n    '100000000000': {\n      'other': '000 mil milhões'\n    },\n    '1000000000000': {\n      'other': '0 biliões'\n    },\n    '10000000000000': {\n      'other': '00 biliões'\n    },\n    '100000000000000': {\n      'other': '000 biliões'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ro.\n */\ngoog.i18n.CompactNumberFormatSymbols_ro = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 K'\n    },\n    '100000': {\n      'other': '000 K'\n    },\n    '1000000': {\n      'other': '0 mil.'\n    },\n    '10000000': {\n      'other': '00 mil.'\n    },\n    '100000000': {\n      'other': '000 mil.'\n    },\n    '1000000000': {\n      'other': '0 mld.'\n    },\n    '10000000000': {\n      'other': '00 mld.'\n    },\n    '100000000000': {\n      'other': '000 mld.'\n    },\n    '1000000000000': {\n      'other': '0 tril.'\n    },\n    '10000000000000': {\n      'other': '00 tril.'\n    },\n    '100000000000000': {\n      'other': '000 tril.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 de mii'\n    },\n    '10000': {\n      'other': '00 de mii'\n    },\n    '100000': {\n      'other': '000 de mii'\n    },\n    '1000000': {\n      'other': '0 de milioane'\n    },\n    '10000000': {\n      'other': '00 de milioane'\n    },\n    '100000000': {\n      'other': '000 de milioane'\n    },\n    '1000000000': {\n      'other': '0 de miliarde'\n    },\n    '10000000000': {\n      'other': '00 de miliarde'\n    },\n    '100000000000': {\n      'other': '000 de miliarde'\n    },\n    '1000000000000': {\n      'other': '0 de trilioane'\n    },\n    '10000000000000': {\n      'other': '00 de trilioane'\n    },\n    '100000000000000': {\n      'other': '000 de trilioane'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ru.\n */\ngoog.i18n.CompactNumberFormatSymbols_ru = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 тыс.'\n    },\n    '10000': {\n      'other': '00 тыс.'\n    },\n    '100000': {\n      'other': '000 тыс.'\n    },\n    '1000000': {\n      'other': '0 млн'\n    },\n    '10000000': {\n      'other': '00 млн'\n    },\n    '100000000': {\n      'other': '000 млн'\n    },\n    '1000000000': {\n      'other': '0 млрд'\n    },\n    '10000000000': {\n      'other': '00 млрд'\n    },\n    '100000000000': {\n      'other': '000 млрд'\n    },\n    '1000000000000': {\n      'other': '0 трлн'\n    },\n    '10000000000000': {\n      'other': '00 трлн'\n    },\n    '100000000000000': {\n      'other': '000 трлн'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 тысячи'\n    },\n    '10000': {\n      'other': '00 тысячи'\n    },\n    '100000': {\n      'other': '000 тысячи'\n    },\n    '1000000': {\n      'other': '0 миллиона'\n    },\n    '10000000': {\n      'other': '00 миллиона'\n    },\n    '100000000': {\n      'other': '000 миллиона'\n    },\n    '1000000000': {\n      'other': '0 миллиарда'\n    },\n    '10000000000': {\n      'other': '00 миллиарда'\n    },\n    '100000000000': {\n      'other': '000 миллиарда'\n    },\n    '1000000000000': {\n      'other': '0 триллиона'\n    },\n    '10000000000000': {\n      'other': '00 триллиона'\n    },\n    '100000000000000': {\n      'other': '000 триллиона'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sh.\n */\ngoog.i18n.CompactNumberFormatSymbols_sh = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 hilj.'\n    },\n    '10000': {\n      'other': '00 hilj.'\n    },\n    '100000': {\n      'other': '000 hilj.'\n    },\n    '1000000': {\n      'other': '0 mil.'\n    },\n    '10000000': {\n      'other': '00 mil.'\n    },\n    '100000000': {\n      'other': '000 mil.'\n    },\n    '1000000000': {\n      'other': '0 mlrd.'\n    },\n    '10000000000': {\n      'other': '00 mlrd.'\n    },\n    '100000000000': {\n      'other': '000 mlrd.'\n    },\n    '1000000000000': {\n      'other': '0 bil.'\n    },\n    '10000000000000': {\n      'other': '00 bil.'\n    },\n    '100000000000000': {\n      'other': '000 bil.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 hiljada'\n    },\n    '10000': {\n      'other': '00 hiljada'\n    },\n    '100000': {\n      'other': '000 hiljada'\n    },\n    '1000000': {\n      'other': '0 miliona'\n    },\n    '10000000': {\n      'other': '00 miliona'\n    },\n    '100000000': {\n      'other': '000 miliona'\n    },\n    '1000000000': {\n      'other': '0 milijardi'\n    },\n    '10000000000': {\n      'other': '00 milijardi'\n    },\n    '100000000000': {\n      'other': '000 milijardi'\n    },\n    '1000000000000': {\n      'other': '0 biliona'\n    },\n    '10000000000000': {\n      'other': '00 biliona'\n    },\n    '100000000000000': {\n      'other': '000 biliona'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale si.\n */\ngoog.i18n.CompactNumberFormatSymbols_si = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': 'ද0'\n    },\n    '10000': {\n      'other': 'ද00'\n    },\n    '100000': {\n      'other': 'ද000'\n    },\n    '1000000': {\n      'other': 'මි0'\n    },\n    '10000000': {\n      'other': 'මි00'\n    },\n    '100000000': {\n      'other': 'මි000'\n    },\n    '1000000000': {\n      'other': 'බි0'\n    },\n    '10000000000': {\n      'other': 'බි00'\n    },\n    '100000000000': {\n      'other': 'බි000'\n    },\n    '1000000000000': {\n      'other': 'ට්‍රි0'\n    },\n    '10000000000000': {\n      'other': 'ට්‍රි00'\n    },\n    '100000000000000': {\n      'other': 'ට්‍රි000'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': 'දහස 0'\n    },\n    '10000': {\n      'other': 'දහස 00'\n    },\n    '100000': {\n      'other': 'දහස 000'\n    },\n    '1000000': {\n      'other': 'මිලියන 0'\n    },\n    '10000000': {\n      'other': 'මිලියන 00'\n    },\n    '100000000': {\n      'other': 'මිලියන 000'\n    },\n    '1000000000': {\n      'other': 'බිලියන 0'\n    },\n    '10000000000': {\n      'other': 'බිලියන 00'\n    },\n    '100000000000': {\n      'other': 'බිලියන 000'\n    },\n    '1000000000000': {\n      'other': 'ට්‍රිලියන 0'\n    },\n    '10000000000000': {\n      'other': 'ට්‍රිලියන 00'\n    },\n    '100000000000000': {\n      'other': 'ට්‍රිලියන 000'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sk.\n */\ngoog.i18n.CompactNumberFormatSymbols_sk = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 tis.'\n    },\n    '10000': {\n      'other': '00 tis.'\n    },\n    '100000': {\n      'other': '000 tis.'\n    },\n    '1000000': {\n      'other': '0 mil.'\n    },\n    '10000000': {\n      'other': '00 mil.'\n    },\n    '100000000': {\n      'other': '000 mil.'\n    },\n    '1000000000': {\n      'other': '0 mld.'\n    },\n    '10000000000': {\n      'other': '00 mld.'\n    },\n    '100000000000': {\n      'other': '000 mld.'\n    },\n    '1000000000000': {\n      'other': '0 bil.'\n    },\n    '10000000000000': {\n      'other': '00 bil.'\n    },\n    '100000000000000': {\n      'other': '000 bil.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tisíc'\n    },\n    '10000': {\n      'other': '00 tisíc'\n    },\n    '100000': {\n      'other': '000 tisíc'\n    },\n    '1000000': {\n      'other': '0 miliónov'\n    },\n    '10000000': {\n      'other': '00 miliónov'\n    },\n    '100000000': {\n      'other': '000 miliónov'\n    },\n    '1000000000': {\n      'other': '0 miliárd'\n    },\n    '10000000000': {\n      'other': '00 miliárd'\n    },\n    '100000000000': {\n      'other': '000 miliárd'\n    },\n    '1000000000000': {\n      'other': '0 biliónov'\n    },\n    '10000000000000': {\n      'other': '00 biliónov'\n    },\n    '100000000000000': {\n      'other': '000 biliónov'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sl.\n */\ngoog.i18n.CompactNumberFormatSymbols_sl = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 tis.'\n    },\n    '10000': {\n      'other': '00 tis.'\n    },\n    '100000': {\n      'other': '000 tis.'\n    },\n    '1000000': {\n      'other': '0 mio.'\n    },\n    '10000000': {\n      'other': '00 mio.'\n    },\n    '100000000': {\n      'other': '000 mio.'\n    },\n    '1000000000': {\n      'other': '0 mrd.'\n    },\n    '10000000000': {\n      'other': '00 mrd.'\n    },\n    '100000000000': {\n      'other': '000 mrd.'\n    },\n    '1000000000000': {\n      'other': '0 bil.'\n    },\n    '10000000000000': {\n      'other': '00 bil.'\n    },\n    '100000000000000': {\n      'other': '000 bil.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tisoč'\n    },\n    '10000': {\n      'other': '00 tisoč'\n    },\n    '100000': {\n      'other': '000 tisoč'\n    },\n    '1000000': {\n      'other': '0 milijonov'\n    },\n    '10000000': {\n      'other': '00 milijonov'\n    },\n    '100000000': {\n      'other': '000 milijonov'\n    },\n    '1000000000': {\n      'other': '0 milijard'\n    },\n    '10000000000': {\n      'other': '00 milijard'\n    },\n    '100000000000': {\n      'other': '000 milijard'\n    },\n    '1000000000000': {\n      'other': '0 bilijonov'\n    },\n    '10000000000000': {\n      'other': '00 bilijonov'\n    },\n    '100000000000000': {\n      'other': '000 bilijonov'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sq.\n */\ngoog.i18n.CompactNumberFormatSymbols_sq = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 mijë'\n    },\n    '10000': {\n      'other': '00 mijë'\n    },\n    '100000': {\n      'other': '000 mijë'\n    },\n    '1000000': {\n      'other': '0 mln'\n    },\n    '10000000': {\n      'other': '00 mln'\n    },\n    '100000000': {\n      'other': '000 mln'\n    },\n    '1000000000': {\n      'other': '0 mld'\n    },\n    '10000000000': {\n      'other': '00 mld'\n    },\n    '100000000000': {\n      'other': '000 mld'\n    },\n    '1000000000000': {\n      'other': '0 bln'\n    },\n    '10000000000000': {\n      'other': '00 bln'\n    },\n    '100000000000000': {\n      'other': '000 bln'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 mijë'\n    },\n    '10000': {\n      'other': '00 mijë'\n    },\n    '100000': {\n      'other': '000 mijë'\n    },\n    '1000000': {\n      'other': '0 milion'\n    },\n    '10000000': {\n      'other': '00 milion'\n    },\n    '100000000': {\n      'other': '000 milion'\n    },\n    '1000000000': {\n      'other': '0 miliard'\n    },\n    '10000000000': {\n      'other': '00 miliard'\n    },\n    '100000000000': {\n      'other': '000 miliard'\n    },\n    '1000000000000': {\n      'other': '0 bilion'\n    },\n    '10000000000000': {\n      'other': '00 bilion'\n    },\n    '100000000000000': {\n      'other': '000 bilion'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sr.\n */\ngoog.i18n.CompactNumberFormatSymbols_sr = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 хиљ.'\n    },\n    '10000': {\n      'other': '00 хиљ.'\n    },\n    '100000': {\n      'other': '000 хиљ.'\n    },\n    '1000000': {\n      'other': '0 мил.'\n    },\n    '10000000': {\n      'other': '00 мил.'\n    },\n    '100000000': {\n      'other': '000 мил.'\n    },\n    '1000000000': {\n      'other': '0 млрд.'\n    },\n    '10000000000': {\n      'other': '00 млрд.'\n    },\n    '100000000000': {\n      'other': '000 млрд.'\n    },\n    '1000000000000': {\n      'other': '0 бил.'\n    },\n    '10000000000000': {\n      'other': '00 бил.'\n    },\n    '100000000000000': {\n      'other': '000 бил.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 хиљада'\n    },\n    '10000': {\n      'other': '00 хиљада'\n    },\n    '100000': {\n      'other': '000 хиљада'\n    },\n    '1000000': {\n      'other': '0 милиона'\n    },\n    '10000000': {\n      'other': '00 милиона'\n    },\n    '100000000': {\n      'other': '000 милиона'\n    },\n    '1000000000': {\n      'other': '0 милијарди'\n    },\n    '10000000000': {\n      'other': '00 милијарди'\n    },\n    '100000000000': {\n      'other': '000 милијарди'\n    },\n    '1000000000000': {\n      'other': '0 билиона'\n    },\n    '10000000000000': {\n      'other': '00 билиона'\n    },\n    '100000000000000': {\n      'other': '000 билиона'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sr_Latn.\n */\ngoog.i18n.CompactNumberFormatSymbols_sr_Latn = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 hilj.'\n    },\n    '10000': {\n      'other': '00 hilj.'\n    },\n    '100000': {\n      'other': '000 hilj.'\n    },\n    '1000000': {\n      'other': '0 mil.'\n    },\n    '10000000': {\n      'other': '00 mil.'\n    },\n    '100000000': {\n      'other': '000 mil.'\n    },\n    '1000000000': {\n      'other': '0 mlrd.'\n    },\n    '10000000000': {\n      'other': '00 mlrd.'\n    },\n    '100000000000': {\n      'other': '000 mlrd.'\n    },\n    '1000000000000': {\n      'other': '0 bil.'\n    },\n    '10000000000000': {\n      'other': '00 bil.'\n    },\n    '100000000000000': {\n      'other': '000 bil.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 hiljada'\n    },\n    '10000': {\n      'other': '00 hiljada'\n    },\n    '100000': {\n      'other': '000 hiljada'\n    },\n    '1000000': {\n      'other': '0 miliona'\n    },\n    '10000000': {\n      'other': '00 miliona'\n    },\n    '100000000': {\n      'other': '000 miliona'\n    },\n    '1000000000': {\n      'other': '0 milijardi'\n    },\n    '10000000000': {\n      'other': '00 milijardi'\n    },\n    '100000000000': {\n      'other': '000 milijardi'\n    },\n    '1000000000000': {\n      'other': '0 biliona'\n    },\n    '10000000000000': {\n      'other': '00 biliona'\n    },\n    '100000000000000': {\n      'other': '000 biliona'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sv.\n */\ngoog.i18n.CompactNumberFormatSymbols_sv = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 tn'\n    },\n    '10000': {\n      'other': '00 tn'\n    },\n    '100000': {\n      'other': '000 tn'\n    },\n    '1000000': {\n      'other': '0 mn'\n    },\n    '10000000': {\n      'other': '00 mn'\n    },\n    '100000000': {\n      'other': '000 mn'\n    },\n    '1000000000': {\n      'other': '0 md'\n    },\n    '10000000000': {\n      'other': '00 md'\n    },\n    '100000000000': {\n      'other': '000 md'\n    },\n    '1000000000000': {\n      'other': '0 bn'\n    },\n    '10000000000000': {\n      'other': '00 bn'\n    },\n    '100000000000000': {\n      'other': '000 bn'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tusen'\n    },\n    '10000': {\n      'other': '00 tusen'\n    },\n    '100000': {\n      'other': '000 tusen'\n    },\n    '1000000': {\n      'other': '0 miljoner'\n    },\n    '10000000': {\n      'other': '00 miljoner'\n    },\n    '100000000': {\n      'other': '000 miljoner'\n    },\n    '1000000000': {\n      'other': '0 miljarder'\n    },\n    '10000000000': {\n      'other': '00 miljarder'\n    },\n    '100000000000': {\n      'other': '000 miljarder'\n    },\n    '1000000000000': {\n      'other': '0 biljoner'\n    },\n    '10000000000000': {\n      'other': '00 biljoner'\n    },\n    '100000000000000': {\n      'other': '000 biljoner'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sw.\n */\ngoog.i18n.CompactNumberFormatSymbols_sw = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': 'elfu 0;elfu -0'\n    },\n    '10000': {\n      'other': 'elfu 00;elfu -00'\n    },\n    '100000': {\n      'other': 'elfu 000;elfu -000'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B;-0B'\n    },\n    '10000000000': {\n      'other': '00B;-00B'\n    },\n    '100000000000': {\n      'other': '000B;-000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': 'elfu 0;elfu -0'\n    },\n    '10000': {\n      'other': 'elfu 00;elfu -00'\n    },\n    '100000': {\n      'other': 'elfu 000;elfu -000'\n    },\n    '1000000': {\n      'other': 'milioni 0;milioni -0'\n    },\n    '10000000': {\n      'other': 'milioni 00;milioni -00'\n    },\n    '100000000': {\n      'other': 'milioni 000;milioni -000'\n    },\n    '1000000000': {\n      'other': 'bilioni 0;bilioni -0'\n    },\n    '10000000000': {\n      'other': 'bilioni 00;bilioni -00'\n    },\n    '100000000000': {\n      'other': 'bilioni 000;bilioni -000'\n    },\n    '1000000000000': {\n      'other': 'trilioni 0;trilioni -0'\n    },\n    '10000000000000': {\n      'other': 'trilioni 00;trilioni -00'\n    },\n    '100000000000000': {\n      'other': 'trilioni 000;trilioni -000'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ta.\n */\ngoog.i18n.CompactNumberFormatSymbols_ta = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0ஆ'\n    },\n    '10000': {\n      'other': '00ஆ'\n    },\n    '100000': {\n      'other': '000ஆ'\n    },\n    '1000000': {\n      'other': '0மி'\n    },\n    '10000000': {\n      'other': '00மி'\n    },\n    '100000000': {\n      'other': '000மி'\n    },\n    '1000000000': {\n      'other': '0பி'\n    },\n    '10000000000': {\n      'other': '00பி'\n    },\n    '100000000000': {\n      'other': '000பி'\n    },\n    '1000000000000': {\n      'other': '0டி'\n    },\n    '10000000000000': {\n      'other': '00டி'\n    },\n    '100000000000000': {\n      'other': '000டி'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ஆயிரம்'\n    },\n    '10000': {\n      'other': '00 ஆயிரம்'\n    },\n    '100000': {\n      'other': '000 ஆயிரம்'\n    },\n    '1000000': {\n      'other': '0 மில்லியன்'\n    },\n    '10000000': {\n      'other': '00 மில்லியன்'\n    },\n    '100000000': {\n      'other': '000 மில்லியன்'\n    },\n    '1000000000': {\n      'other': '0 பில்லியன்'\n    },\n    '10000000000': {\n      'other': '00 பில்லியன்'\n    },\n    '100000000000': {\n      'other': '000 பில்லியன்'\n    },\n    '1000000000000': {\n      'other': '0 டிரில்லியன்'\n    },\n    '10000000000000': {\n      'other': '00 டிரில்லியன்'\n    },\n    '100000000000000': {\n      'other': '000 டிரில்லியன்'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale te.\n */\ngoog.i18n.CompactNumberFormatSymbols_te = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0వే'\n    },\n    '10000': {\n      'other': '00వే'\n    },\n    '100000': {\n      'other': '000వే'\n    },\n    '1000000': {\n      'other': '0మి'\n    },\n    '10000000': {\n      'other': '00మి'\n    },\n    '100000000': {\n      'other': '000మి'\n    },\n    '1000000000': {\n      'other': '0బి'\n    },\n    '10000000000': {\n      'other': '00బి'\n    },\n    '100000000000': {\n      'other': '000బి'\n    },\n    '1000000000000': {\n      'other': '0ట్రి'\n    },\n    '10000000000000': {\n      'other': '00ట్రి'\n    },\n    '100000000000000': {\n      'other': '000ట్రి'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 వేలు'\n    },\n    '10000': {\n      'other': '00 వేలు'\n    },\n    '100000': {\n      'other': '000 వేలు'\n    },\n    '1000000': {\n      'other': '0 మిలియన్లు'\n    },\n    '10000000': {\n      'other': '00 మిలియన్లు'\n    },\n    '100000000': {\n      'other': '000 మిలియన్లు'\n    },\n    '1000000000': {\n      'other': '0 బిలియన్లు'\n    },\n    '10000000000': {\n      'other': '00 బిలియన్లు'\n    },\n    '100000000000': {\n      'other': '000 బిలియన్లు'\n    },\n    '1000000000000': {\n      'other': '0 ట్రిలియన్లు'\n    },\n    '10000000000000': {\n      'other': '00 ట్రిలియన్లు'\n    },\n    '100000000000000': {\n      'other': '000 ట్రిలియన్లు'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale th.\n */\ngoog.i18n.CompactNumberFormatSymbols_th = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 พัน'\n    },\n    '10000': {\n      'other': '0 หมื่น'\n    },\n    '100000': {\n      'other': '0 แสน'\n    },\n    '1000000': {\n      'other': '0 ล้าน'\n    },\n    '10000000': {\n      'other': '00 ล้าน'\n    },\n    '100000000': {\n      'other': '000 ล้าน'\n    },\n    '1000000000': {\n      'other': '0 พันล้าน'\n    },\n    '10000000000': {\n      'other': '0 หมื่นล้าน'\n    },\n    '100000000000': {\n      'other': '0 แสนล้าน'\n    },\n    '1000000000000': {\n      'other': '0 ล้านล้าน'\n    },\n    '10000000000000': {\n      'other': '00 ล้านล้าน'\n    },\n    '100000000000000': {\n      'other': '000 ล้านล้าน'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale tl.\n */\ngoog.i18n.CompactNumberFormatSymbols_tl = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 na libo'\n    },\n    '10000': {\n      'other': '00 na libo'\n    },\n    '100000': {\n      'other': '000 na libo'\n    },\n    '1000000': {\n      'other': '0 na milyon'\n    },\n    '10000000': {\n      'other': '00 na milyon'\n    },\n    '100000000': {\n      'other': '000 na milyon'\n    },\n    '1000000000': {\n      'other': '0 na bilyon'\n    },\n    '10000000000': {\n      'other': '00 na bilyon'\n    },\n    '100000000000': {\n      'other': '000 na bilyon'\n    },\n    '1000000000000': {\n      'other': '0 na trilyon'\n    },\n    '10000000000000': {\n      'other': '00 na trilyon'\n    },\n    '100000000000000': {\n      'other': '000 na trilyon'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale tr.\n */\ngoog.i18n.CompactNumberFormatSymbols_tr = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 B'\n    },\n    '10000': {\n      'other': '00 B'\n    },\n    '100000': {\n      'other': '000 B'\n    },\n    '1000000': {\n      'other': '0 Mn'\n    },\n    '10000000': {\n      'other': '00 Mn'\n    },\n    '100000000': {\n      'other': '000 Mn'\n    },\n    '1000000000': {\n      'other': '0 Mr'\n    },\n    '10000000000': {\n      'other': '00 Mr'\n    },\n    '100000000000': {\n      'other': '000 Mr'\n    },\n    '1000000000000': {\n      'other': '0 Tn'\n    },\n    '10000000000000': {\n      'other': '00 Tn'\n    },\n    '100000000000000': {\n      'other': '000 Tn'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 bin'\n    },\n    '10000': {\n      'other': '00 bin'\n    },\n    '100000': {\n      'other': '000 bin'\n    },\n    '1000000': {\n      'other': '0 milyon'\n    },\n    '10000000': {\n      'other': '00 milyon'\n    },\n    '100000000': {\n      'other': '000 milyon'\n    },\n    '1000000000': {\n      'other': '0 milyar'\n    },\n    '10000000000': {\n      'other': '00 milyar'\n    },\n    '100000000000': {\n      'other': '000 milyar'\n    },\n    '1000000000000': {\n      'other': '0 trilyon'\n    },\n    '10000000000000': {\n      'other': '00 trilyon'\n    },\n    '100000000000000': {\n      'other': '000 trilyon'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale uk.\n */\ngoog.i18n.CompactNumberFormatSymbols_uk = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 тис.'\n    },\n    '10000': {\n      'other': '00 тис.'\n    },\n    '100000': {\n      'other': '000 тис.'\n    },\n    '1000000': {\n      'other': '0 млн'\n    },\n    '10000000': {\n      'other': '00 млн'\n    },\n    '100000000': {\n      'other': '000 млн'\n    },\n    '1000000000': {\n      'other': '0 млрд'\n    },\n    '10000000000': {\n      'other': '00 млрд'\n    },\n    '100000000000': {\n      'other': '000 млрд'\n    },\n    '1000000000000': {\n      'other': '0 трлн'\n    },\n    '10000000000000': {\n      'other': '00 трлн'\n    },\n    '100000000000000': {\n      'other': '000 трлн'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 тисячі'\n    },\n    '10000': {\n      'other': '00 тисячі'\n    },\n    '100000': {\n      'other': '000 тисячі'\n    },\n    '1000000': {\n      'other': '0 мільйона'\n    },\n    '10000000': {\n      'other': '00 мільйона'\n    },\n    '100000000': {\n      'other': '000 мільйона'\n    },\n    '1000000000': {\n      'other': '0 мільярда'\n    },\n    '10000000000': {\n      'other': '00 мільярда'\n    },\n    '100000000000': {\n      'other': '000 мільярда'\n    },\n    '1000000000000': {\n      'other': '0 трильйона'\n    },\n    '10000000000000': {\n      'other': '00 трильйона'\n    },\n    '100000000000000': {\n      'other': '000 трильйона'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ur.\n */\ngoog.i18n.CompactNumberFormatSymbols_ur = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 ہزار'\n    },\n    '10000': {\n      'other': '00 ہزار'\n    },\n    '100000': {\n      'other': '0 لاکھ'\n    },\n    '1000000': {\n      'other': '00 لاکھ'\n    },\n    '10000000': {\n      'other': '0 کروڑ'\n    },\n    '100000000': {\n      'other': '00 کروڑ'\n    },\n    '1000000000': {\n      'other': '0 ارب'\n    },\n    '10000000000': {\n      'other': '00 ارب'\n    },\n    '100000000000': {\n      'other': '0 کھرب'\n    },\n    '1000000000000': {\n      'other': '00 کھرب'\n    },\n    '10000000000000': {\n      'other': '00 ٹریلین'\n    },\n    '100000000000000': {\n      'other': '000 ٹریلین'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ہزار'\n    },\n    '10000': {\n      'other': '00 ہزار'\n    },\n    '100000': {\n      'other': '0 لاکھ'\n    },\n    '1000000': {\n      'other': '00 لاکھ'\n    },\n    '10000000': {\n      'other': '0 کروڑ'\n    },\n    '100000000': {\n      'other': '00 کروڑ'\n    },\n    '1000000000': {\n      'other': '0 ارب'\n    },\n    '10000000000': {\n      'other': '00 ارب'\n    },\n    '100000000000': {\n      'other': '0 کھرب'\n    },\n    '1000000000000': {\n      'other': '00 کھرب'\n    },\n    '10000000000000': {\n      'other': '00 ٹریلین'\n    },\n    '100000000000000': {\n      'other': '000 ٹریلین'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale uz.\n */\ngoog.i18n.CompactNumberFormatSymbols_uz = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 ming'\n    },\n    '10000': {\n      'other': '00 ming'\n    },\n    '100000': {\n      'other': '000 ming'\n    },\n    '1000000': {\n      'other': '0 mln'\n    },\n    '10000000': {\n      'other': '00 mln'\n    },\n    '100000000': {\n      'other': '000 mln'\n    },\n    '1000000000': {\n      'other': '0 mlrd'\n    },\n    '10000000000': {\n      'other': '00 mlrd'\n    },\n    '100000000000': {\n      'other': '000 mlrd'\n    },\n    '1000000000000': {\n      'other': '0 trln'\n    },\n    '10000000000000': {\n      'other': '00 trln'\n    },\n    '100000000000000': {\n      'other': '000 trln'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ming'\n    },\n    '10000': {\n      'other': '00 ming'\n    },\n    '100000': {\n      'other': '000 ming'\n    },\n    '1000000': {\n      'other': '0 million'\n    },\n    '10000000': {\n      'other': '00 million'\n    },\n    '100000000': {\n      'other': '000 million'\n    },\n    '1000000000': {\n      'other': '0 milliard'\n    },\n    '10000000000': {\n      'other': '00 milliard'\n    },\n    '100000000000': {\n      'other': '000 milliard'\n    },\n    '1000000000000': {\n      'other': '0 trillion'\n    },\n    '10000000000000': {\n      'other': '00 trillion'\n    },\n    '100000000000000': {\n      'other': '000 trillion'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale vi.\n */\ngoog.i18n.CompactNumberFormatSymbols_vi = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 N'\n    },\n    '10000': {\n      'other': '00 N'\n    },\n    '100000': {\n      'other': '000 N'\n    },\n    '1000000': {\n      'other': '0 Tr'\n    },\n    '10000000': {\n      'other': '00 Tr'\n    },\n    '100000000': {\n      'other': '000 Tr'\n    },\n    '1000000000': {\n      'other': '0 T'\n    },\n    '10000000000': {\n      'other': '00 T'\n    },\n    '100000000000': {\n      'other': '000 T'\n    },\n    '1000000000000': {\n      'other': '0 NT'\n    },\n    '10000000000000': {\n      'other': '00 NT'\n    },\n    '100000000000000': {\n      'other': '000 NT'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 nghìn'\n    },\n    '10000': {\n      'other': '00 nghìn'\n    },\n    '100000': {\n      'other': '000 nghìn'\n    },\n    '1000000': {\n      'other': '0 triệu'\n    },\n    '10000000': {\n      'other': '00 triệu'\n    },\n    '100000000': {\n      'other': '000 triệu'\n    },\n    '1000000000': {\n      'other': '0 tỷ'\n    },\n    '10000000000': {\n      'other': '00 tỷ'\n    },\n    '100000000000': {\n      'other': '000 tỷ'\n    },\n    '1000000000000': {\n      'other': '0 nghìn tỷ'\n    },\n    '10000000000000': {\n      'other': '00 nghìn tỷ'\n    },\n    '100000000000000': {\n      'other': '000 nghìn tỷ'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale zh.\n */\ngoog.i18n.CompactNumberFormatSymbols_zh = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0万'\n    },\n    '100000': {\n      'other': '00万'\n    },\n    '1000000': {\n      'other': '000万'\n    },\n    '10000000': {\n      'other': '0000万'\n    },\n    '100000000': {\n      'other': '0亿'\n    },\n    '1000000000': {\n      'other': '00亿'\n    },\n    '10000000000': {\n      'other': '000亿'\n    },\n    '100000000000': {\n      'other': '0000亿'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0万'\n    },\n    '100000': {\n      'other': '00万'\n    },\n    '1000000': {\n      'other': '000万'\n    },\n    '10000000': {\n      'other': '0000万'\n    },\n    '100000000': {\n      'other': '0亿'\n    },\n    '1000000000': {\n      'other': '00亿'\n    },\n    '10000000000': {\n      'other': '000亿'\n    },\n    '100000000000': {\n      'other': '0000亿'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale zh_CN.\n */\ngoog.i18n.CompactNumberFormatSymbols_zh_CN = goog.i18n.CompactNumberFormatSymbols_zh;\n\n\n/**\n * Compact number formatting symbols for locale zh_HK.\n */\ngoog.i18n.CompactNumberFormatSymbols_zh_HK = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0萬'\n    },\n    '100000': {\n      'other': '00萬'\n    },\n    '1000000': {\n      'other': '000萬'\n    },\n    '10000000': {\n      'other': '0000萬'\n    },\n    '100000000': {\n      'other': '0億'\n    },\n    '1000000000': {\n      'other': '00億'\n    },\n    '10000000000': {\n      'other': '000億'\n    },\n    '100000000000': {\n      'other': '0000億'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale zh_TW.\n */\ngoog.i18n.CompactNumberFormatSymbols_zh_TW = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0萬'\n    },\n    '100000': {\n      'other': '00萬'\n    },\n    '1000000': {\n      'other': '000萬'\n    },\n    '10000000': {\n      'other': '0000萬'\n    },\n    '100000000': {\n      'other': '0億'\n    },\n    '1000000000': {\n      'other': '00億'\n    },\n    '10000000000': {\n      'other': '000億'\n    },\n    '100000000000': {\n      'other': '0000億'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0萬'\n    },\n    '100000': {\n      'other': '00萬'\n    },\n    '1000000': {\n      'other': '000萬'\n    },\n    '10000000': {\n      'other': '0000萬'\n    },\n    '100000000': {\n      'other': '0億'\n    },\n    '1000000000': {\n      'other': '00億'\n    },\n    '10000000000': {\n      'other': '000億'\n    },\n    '100000000000': {\n      'other': '0000億'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale zu.\n */\ngoog.i18n.CompactNumberFormatSymbols_zu = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 inkulungwane'\n    },\n    '10000': {\n      'other': '00 inkulungwane'\n    },\n    '100000': {\n      'other': '000 inkulungwane'\n    },\n    '1000000': {\n      'other': '0 isigidi'\n    },\n    '10000000': {\n      'other': '00 isigidi'\n    },\n    '100000000': {\n      'other': '000 isigidi'\n    },\n    '1000000000': {\n      'other': '0 isigidi sezigidi'\n    },\n    '10000000000': {\n      'other': '00 isigidi sezigidi'\n    },\n    '100000000000': {\n      'other': '000 isigidi sezigidi'\n    },\n    '1000000000000': {\n      'other': '0 isigidintathu'\n    },\n    '10000000000000': {\n      'other': '00 isigidintathu'\n    },\n    '100000000000000': {\n      'other': '000 isigidintathu'\n    }\n  }\n};\n\n\n/**\n * Select compact number formatting symbols by locale.\n */\ngoog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en;\n\nswitch (goog.LOCALE) {\n  case 'af':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_af;\n    break;\n  case 'am':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_am;\n    break;\n  case 'ar':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar;\n    break;\n  case 'ar_DZ':\n  case 'ar-DZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_DZ;\n    break;\n  case 'ar_EG':\n  case 'ar-EG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_EG;\n    break;\n  case 'az':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_az;\n    break;\n  case 'be':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_be;\n    break;\n  case 'bg':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bg;\n    break;\n  case 'bn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bn;\n    break;\n  case 'br':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_br;\n    break;\n  case 'bs':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bs;\n    break;\n  case 'ca':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ca;\n    break;\n  case 'chr':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_chr;\n    break;\n  case 'cs':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_cs;\n    break;\n  case 'cy':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_cy;\n    break;\n  case 'da':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_da;\n    break;\n  case 'de':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_de;\n    break;\n  case 'de_AT':\n  case 'de-AT':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_de_AT;\n    break;\n  case 'de_CH':\n  case 'de-CH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_de_CH;\n    break;\n  case 'el':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_el;\n    break;\n  case 'en':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en;\n    break;\n  case 'en_AU':\n  case 'en-AU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_AU;\n    break;\n  case 'en_CA':\n  case 'en-CA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_CA;\n    break;\n  case 'en_GB':\n  case 'en-GB':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_GB;\n    break;\n  case 'en_IE':\n  case 'en-IE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_IE;\n    break;\n  case 'en_IN':\n  case 'en-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_IN;\n    break;\n  case 'en_SG':\n  case 'en-SG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_SG;\n    break;\n  case 'en_US':\n  case 'en-US':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_US;\n    break;\n  case 'en_ZA':\n  case 'en-ZA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_ZA;\n    break;\n  case 'es':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es;\n    break;\n  case 'es_419':\n  case 'es-419':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_419;\n    break;\n  case 'es_ES':\n  case 'es-ES':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_ES;\n    break;\n  case 'es_MX':\n  case 'es-MX':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_MX;\n    break;\n  case 'es_US':\n  case 'es-US':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_US;\n    break;\n  case 'et':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_et;\n    break;\n  case 'eu':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_eu;\n    break;\n  case 'fa':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fa;\n    break;\n  case 'fi':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fi;\n    break;\n  case 'fil':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fil;\n    break;\n  case 'fr':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr;\n    break;\n  case 'fr_CA':\n  case 'fr-CA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_CA;\n    break;\n  case 'ga':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ga;\n    break;\n  case 'gl':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_gl;\n    break;\n  case 'gsw':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_gsw;\n    break;\n  case 'gu':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_gu;\n    break;\n  case 'haw':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_haw;\n    break;\n  case 'he':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_he;\n    break;\n  case 'hi':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_hi;\n    break;\n  case 'hr':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_hr;\n    break;\n  case 'hu':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_hu;\n    break;\n  case 'hy':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_hy;\n    break;\n  case 'id':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_id;\n    break;\n  case 'in':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_in;\n    break;\n  case 'is':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_is;\n    break;\n  case 'it':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_it;\n    break;\n  case 'iw':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_iw;\n    break;\n  case 'ja':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ja;\n    break;\n  case 'ka':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ka;\n    break;\n  case 'kk':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kk;\n    break;\n  case 'km':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_km;\n    break;\n  case 'kn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kn;\n    break;\n  case 'ko':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ko;\n    break;\n  case 'ky':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ky;\n    break;\n  case 'ln':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ln;\n    break;\n  case 'lo':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lo;\n    break;\n  case 'lt':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lt;\n    break;\n  case 'lv':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lv;\n    break;\n  case 'mk':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mk;\n    break;\n  case 'ml':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ml;\n    break;\n  case 'mn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mn;\n    break;\n  case 'mo':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mo;\n    break;\n  case 'mr':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mr;\n    break;\n  case 'ms':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ms;\n    break;\n  case 'mt':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mt;\n    break;\n  case 'my':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_my;\n    break;\n  case 'nb':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nb;\n    break;\n  case 'ne':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ne;\n    break;\n  case 'nl':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nl;\n    break;\n  case 'no':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_no;\n    break;\n  case 'no_NO':\n  case 'no-NO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_no_NO;\n    break;\n  case 'or':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_or;\n    break;\n  case 'pa':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pa;\n    break;\n  case 'pl':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pl;\n    break;\n  case 'pt':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pt;\n    break;\n  case 'pt_BR':\n  case 'pt-BR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pt_BR;\n    break;\n  case 'pt_PT':\n  case 'pt-PT':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pt_PT;\n    break;\n  case 'ro':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ro;\n    break;\n  case 'ru':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ru;\n    break;\n  case 'sh':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sh;\n    break;\n  case 'si':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_si;\n    break;\n  case 'sk':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sk;\n    break;\n  case 'sl':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sl;\n    break;\n  case 'sq':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sq;\n    break;\n  case 'sr':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sr;\n    break;\n  case 'sr_Latn':\n  case 'sr-Latn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sr_Latn;\n    break;\n  case 'sv':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sv;\n    break;\n  case 'sw':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sw;\n    break;\n  case 'ta':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ta;\n    break;\n  case 'te':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_te;\n    break;\n  case 'th':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_th;\n    break;\n  case 'tl':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_tl;\n    break;\n  case 'tr':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_tr;\n    break;\n  case 'uk':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_uk;\n    break;\n  case 'ur':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ur;\n    break;\n  case 'uz':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_uz;\n    break;\n  case 'vi':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_vi;\n    break;\n  case 'zh':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zh;\n    break;\n  case 'zh_CN':\n  case 'zh-CN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zh_CN;\n    break;\n  case 'zh_HK':\n  case 'zh-HK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zh_HK;\n    break;\n  case 'zh_TW':\n  case 'zh-TW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zh_TW;\n    break;\n  case 'zu':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zu;\n    break;\n}\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/compactnumberformatsymbols.js"],"^:1",["^9K",["~$goog.i18n.CompactNumberFormatSymbols_sh","~$goog.i18n.CompactNumberFormatSymbols-ar","~$goog.i18n.CompactNumberFormatSymbols-kn","~$goog.i18n.CompactNumberFormatSymbols-kk","~$goog.i18n.CompactNumberFormatSymbols_kn","~$goog.i18n.CompactNumberFormatSymbols_es_US","~$goog.i18n.CompactNumberFormatSymbols-ta","~$goog.i18n.CompactNumberFormatSymbols-en-CA","~$goog.i18n.CompactNumberFormatSymbols-sq","~$goog.i18n.CompactNumberFormatSymbols_hi","~$goog.i18n.CompactNumberFormatSymbols_he","~$goog.i18n.CompactNumberFormatSymbols_ro","~$goog.i18n.CompactNumberFormatSymbols_no","~$goog.i18n.CompactNumberFormatSymbols_pt_BR","~$goog.i18n.CompactNumberFormatSymbols-si","~$goog.i18n.CompactNumberFormatSymbols_fr","~$goog.i18n.CompactNumberFormatSymbols-am","~$goog.i18n.CompactNumberFormatSymbols-ln","~$goog.i18n.CompactNumberFormatSymbols_fil","~$goog.i18n.CompactNumberFormatSymbols-de","~$goog.i18n.CompactNumberFormatSymbols-ms","~$goog.i18n.CompactNumberFormatSymbols_sr","~$goog.i18n.CompactNumberFormatSymbols_tr","~$goog.i18n.CompactNumberFormatSymbols-hu","~$goog.i18n.CompactNumberFormatSymbols_mr","~$goog.i18n.CompactNumberFormatSymbols_bn","~$goog.i18n.CompactNumberFormatSymbols-mk","~$goog.i18n.CompactNumberFormatSymbols-nl","~$goog.i18n.CompactNumberFormatSymbols-uz","~$goog.i18n.CompactNumberFormatSymbols_hr","~$goog.i18n.CompactNumberFormatSymbols-en-US","~$goog.i18n.CompactNumberFormatSymbols_ky","~$goog.i18n.CompactNumberFormatSymbols_si","~$goog.i18n.CompactNumberFormatSymbols-vi","~$goog.i18n.CompactNumberFormatSymbols-zh","~$goog.i18n.CompactNumberFormatSymbols_sr_Latn","~$goog.i18n.CompactNumberFormatSymbols-bg","~$goog.i18n.CompactNumberFormatSymbols_da","~$goog.i18n.CompactNumberFormatSymbols_en","~$goog.i18n.CompactNumberFormatSymbols_mo","~$goog.i18n.CompactNumberFormatSymbols-is","~$goog.i18n.CompactNumberFormatSymbols-fil","~$goog.i18n.CompactNumberFormatSymbols_km","~$goog.i18n.CompactNumberFormatSymbols-hi","~$goog.i18n.CompactNumberFormatSymbols_gu","~$goog.i18n.CompactNumberFormatSymbols-ky","~$goog.i18n.CompactNumberFormatSymbols-lo","~$goog.i18n.CompactNumberFormatSymbols-de-AT","~$goog.i18n.CompactNumberFormatSymbols_chr","~$goog.i18n.CompactNumberFormatSymbols_id","~$goog.i18n.CompactNumberFormatSymbols-en-ZA","~$goog.i18n.CompactNumberFormatSymbols-en-AU","~$goog.i18n.CompactNumberFormatSymbols_ta","~$goog.i18n.CompactNumberFormatSymbols_en_IE","~$goog.i18n.CompactNumberFormatSymbols-sl","~$goog.i18n.CompactNumberFormatSymbols_pt","~$goog.i18n.CompactNumberFormatSymbols_ja","~$goog.i18n.CompactNumberFormatSymbols-en","~$goog.i18n.CompactNumberFormatSymbols-km","~$goog.i18n.CompactNumberFormatSymbols-sr-Latn","~$goog.i18n.CompactNumberFormatSymbols_am","~$goog.i18n.CompactNumberFormatSymbols_el","~$goog.i18n.CompactNumberFormatSymbols_zu","~$goog.i18n.CompactNumberFormatSymbols_en_IN","~$goog.i18n.CompactNumberFormatSymbols_it","~$goog.i18n.CompactNumberFormatSymbols_zh","~$goog.i18n.CompactNumberFormatSymbols_hu","~$goog.i18n.CompactNumberFormatSymbols-ko","~$goog.i18n.CompactNumberFormatSymbols_is","~$goog.i18n.CompactNumberFormatSymbols_fr_CA","~$goog.i18n.CompactNumberFormatSymbols_gsw","~$goog.i18n.CompactNumberFormatSymbols_eu","~$goog.i18n.CompactNumberFormatSymbols_ca","~$goog.i18n.CompactNumberFormatSymbols_ga","~$goog.i18n.CompactNumberFormatSymbols-gu","~$goog.i18n.CompactNumberFormatSymbols-bn","~$goog.i18n.CompactNumberFormatSymbols-fa","~$goog.i18n.CompactNumberFormatSymbols-pt-BR","~$goog.i18n.CompactNumberFormatSymbols_pt_PT","~$goog.i18n.CompactNumberFormatSymbols-bs","~$goog.i18n.CompactNumberFormatSymbols_en_GB","~$goog.i18n.CompactNumberFormatSymbols_ml","~$goog.i18n.CompactNumberFormatSymbols-tl","~$goog.i18n.CompactNumberFormatSymbols_es_419","~$goog.i18n.CompactNumberFormatSymbols-my","~$goog.i18n.CompactNumberFormatSymbols-no-NO","~$goog.i18n.CompactNumberFormatSymbols_lv","~$goog.i18n.CompactNumberFormatSymbols-haw","~$goog.i18n.CompactNumberFormatSymbols-az","~$goog.i18n.CompactNumberFormatSymbols_es_MX","~$goog.i18n.CompactNumberFormatSymbols-mn","~$goog.i18n.CompactNumberFormatSymbols_iw","~$goog.i18n.CompactNumberFormatSymbols_be","~$goog.i18n.CompactNumberFormatSymbols_ar_EG","~$goog.i18n.CompactNumberFormatSymbols-nb","~$goog.i18n.CompactNumberFormatSymbols_mn","~$goog.i18n.CompactNumberFormatSymbols_es_ES","~$goog.i18n.CompactNumberFormatSymbols_en_SG","~$goog.i18n.CompactNumberFormatSymbols-ro","~$goog.i18n.CompactNumberFormatSymbols-mr","~$goog.i18n.CompactNumberFormatSymbols_te","~$goog.i18n.CompactNumberFormatSymbols-ru","~$goog.i18n.CompactNumberFormatSymbols-lt","~$goog.i18n.CompactNumberFormatSymbols-th","~$goog.i18n.CompactNumberFormatSymbols_en_CA","~$goog.i18n.CompactNumberFormatSymbols_sl","~$goog.i18n.CompactNumberFormatSymbols_cy","~$goog.i18n.CompactNumberFormatSymbols-ga","~$goog.i18n.CompactNumberFormatSymbols_fi","~$goog.i18n.CompactNumberFormatSymbols-en-SG","~$goog.i18n.CompactNumberFormatSymbols-ar-EG","~$goog.i18n.CompactNumberFormatSymbols_vi","~$goog.i18n.CompactNumberFormatSymbols-te","~$goog.i18n.CompactNumberFormatSymbols_or","~$goog.i18n.CompactNumberFormatSymbols_mt","~$goog.i18n.CompactNumberFormatSymbols-ne","~$goog.i18n.CompactNumberFormatSymbols_lo","~$goog.i18n.CompactNumberFormatSymbols_br","~$goog.i18n.CompactNumberFormatSymbols-ar-DZ","~$goog.i18n.CompactNumberFormatSymbols-zh-TW","~$goog.i18n.CompactNumberFormatSymbols_hy","~$goog.i18n.CompactNumberFormatSymbols_de_CH","~$goog.i18n.CompactNumberFormatSymbols-el","~$goog.i18n.CompactNumberFormatSymbols_th","~$goog.i18n.CompactNumberFormatSymbols-pl","~$goog.i18n.CompactNumberFormatSymbols_fa","~$goog.i18n.CompactNumberFormatSymbols-ka","~$goog.i18n.CompactNumberFormatSymbols-it","~$goog.i18n.CompactNumberFormatSymbols-hr","~$goog.i18n.CompactNumberFormatSymbols_pl","~$goog.i18n.CompactNumberFormatSymbols_en_AU","~$goog.i18n.CompactNumberFormatSymbols_sv","~$goog.i18n.CompactNumberFormatSymbols_ka","~$goog.i18n.CompactNumberFormatSymbols_zh_TW","~$goog.i18n.CompactNumberFormatSymbols-sw","~$goog.i18n.CompactNumberFormatSymbols-es-US","~$goog.i18n.CompactNumberFormatSymbols-cs","~$goog.i18n.CompactNumberFormatSymbols_en_US","~$goog.i18n.CompactNumberFormatSymbols_de_AT","~$goog.i18n.CompactNumberFormatSymbols-sh","~$goog.i18n.CompactNumberFormatSymbols_lt","~$goog.i18n.CompactNumberFormatSymbols_sk","~$goog.i18n.CompactNumberFormatSymbols-es-MX","~$goog.i18n.CompactNumberFormatSymbols_zh_HK","~$goog.i18n.CompactNumberFormatSymbols-sk","~$goog.i18n.CompactNumberFormatSymbols_es","~$goog.i18n.CompactNumberFormatSymbols_de","~$goog.i18n.CompactNumberFormatSymbols_haw","~$goog.i18n.CompactNumberFormatSymbols_az","~$goog.i18n.CompactNumberFormatSymbols-no","~$goog.i18n.CompactNumberFormatSymbols_af","~$goog.i18n.CompactNumberFormatSymbols-fr-CA","~$goog.i18n.CompactNumberFormatSymbols_ln","~$goog.i18n.CompactNumberFormatSymbols-de-CH","~$goog.i18n.CompactNumberFormatSymbols-ur","~$goog.i18n.CompactNumberFormatSymbols_ar","~$goog.i18n.CompactNumberFormatSymbols_my","~$goog.i18n.CompactNumberFormatSymbols_gl","~$goog.i18n.CompactNumberFormatSymbols_nb","~$goog.i18n.CompactNumberFormatSymbols-pt-PT","~$goog.i18n.CompactNumberFormatSymbols-mt","~$goog.i18n.CompactNumberFormatSymbols_in","~$goog.i18n.CompactNumberFormatSymbols-hy","~$goog.i18n.CompactNumberFormatSymbols_uk","~$goog.i18n.CompactNumberFormatSymbols-ja","~$goog.i18n.CompactNumberFormatSymbols-es-ES","~$goog.i18n.CompactNumberFormatSymbols_tl","~$goog.i18n.CompactNumberFormatSymbols_ur","~$goog.i18n.CompactNumberFormatSymbols_bg","~$goog.i18n.CompactNumberFormatSymbols_kk","~$goog.i18n.CompactNumberFormatSymbols-id","~$goog.i18n.CompactNumberFormatSymbols-zh-HK","~$goog.i18n.CompactNumberFormatSymbols_ko","~$goog.i18n.CompactNumberFormatSymbols-ml","~$goog.i18n.CompactNumberFormatSymbols_cs","~$goog.i18n.CompactNumberFormatSymbols-ca","~$goog.i18n.CompactNumberFormatSymbols-lv","~$goog.i18n.CompactNumberFormatSymbols_mk","~$goog.i18n.CompactNumberFormatSymbols_nl","~$goog.i18n.CompactNumberFormatSymbols-da","~$goog.i18n.CompactNumberFormatSymbols_sq","~$goog.i18n.CompactNumberFormatSymbols-en-IN","~$goog.i18n.CompactNumberFormatSymbols-zu","~$goog.i18n.CompactNumberFormatSymbols-af","~$goog.i18n.CompactNumberFormatSymbols-pt","~$goog.i18n.CompactNumberFormatSymbols-eu","~$goog.i18n.CompactNumberFormatSymbols-br","~$goog.i18n.CompactNumberFormatSymbols-mo","~$goog.i18n.CompactNumberFormatSymbols-gl","~$goog.i18n.CompactNumberFormatSymbols-pa","~$goog.i18n.CompactNumberFormatSymbols-en-IE","~$goog.i18n.CompactNumberFormatSymbols-chr","~$goog.i18n.CompactNumberFormatSymbols_ru","~$goog.i18n.CompactNumberFormatSymbols-iw","~$goog.i18n.CompactNumberFormatSymbols-sr","~$goog.i18n.CompactNumberFormatSymbols-tr","~$goog.i18n.CompactNumberFormatSymbols_sw","~$goog.i18n.CompactNumberFormatSymbols_pa","~$goog.i18n.CompactNumberFormatSymbols-be","~$goog.i18n.CompactNumberFormatSymbols_bs","~$goog.i18n.CompactNumberFormatSymbols-he","~$goog.i18n.CompactNumberFormatSymbols-uk","~$goog.i18n.CompactNumberFormatSymbols_en_ZA","^@L","~$goog.i18n.CompactNumberFormatSymbols_ne","~$goog.i18n.CompactNumberFormatSymbols_no_NO","~$goog.i18n.CompactNumberFormatSymbols-et","~$goog.i18n.CompactNumberFormatSymbols-cy","~$goog.i18n.CompactNumberFormatSymbols-gsw","~$goog.i18n.CompactNumberFormatSymbols-es","~$goog.i18n.CompactNumberFormatSymbols-sv","~$goog.i18n.CompactNumberFormatSymbols-in","~$goog.i18n.CompactNumberFormatSymbols_uz","~$goog.i18n.CompactNumberFormatSymbols-fi","~$goog.i18n.CompactNumberFormatSymbols_zh_CN","~$goog.i18n.CompactNumberFormatSymbols_et","~$goog.i18n.CompactNumberFormatSymbols-zh-CN","~$goog.i18n.CompactNumberFormatSymbols_ar_DZ","~$goog.i18n.CompactNumberFormatSymbols-en-GB","~$goog.i18n.CompactNumberFormatSymbols-es-419","~$goog.i18n.CompactNumberFormatSymbols_ms","~$goog.i18n.CompactNumberFormatSymbols-fr","~$goog.i18n.CompactNumberFormatSymbols-or"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.math.interpolator.pchip1.js","^9C",["^9D","goog/math/interpolator/pchip1.js"],"^9E","goog/math/interpolator/pchip1.js","^9F","^9G","^9H","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A one dimensional monotone cubic spline interpolator.\n *\n * See http://en.wikipedia.org/wiki/Monotone_cubic_interpolation.\n *\n */\n\ngoog.provide('goog.math.interpolator.Pchip1');\n\ngoog.require('goog.math');\ngoog.require('goog.math.interpolator.Spline1');\n\n\n\n/**\n * A one dimensional monotone cubic spline interpolator.\n * @extends {goog.math.interpolator.Spline1}\n * @constructor\n * @final\n */\ngoog.math.interpolator.Pchip1 = function() {\n  goog.math.interpolator.Pchip1.base(this, 'constructor');\n};\ngoog.inherits(goog.math.interpolator.Pchip1, goog.math.interpolator.Spline1);\n\n\n/** @override */\ngoog.math.interpolator.Pchip1.prototype.computeDerivatives = function(\n    dx, slope) {\n  var len = dx.length;\n  var deriv = new Array(len + 1);\n  for (var i = 1; i < len; ++i) {\n    if (goog.math.sign(slope[i - 1]) * goog.math.sign(slope[i]) <= 0) {\n      deriv[i] = 0;\n    } else {\n      var w1 = 2 * dx[i] + dx[i - 1];\n      var w2 = dx[i] + 2 * dx[i - 1];\n      deriv[i] = (w1 + w2) / (w1 / slope[i - 1] + w2 / slope[i]);\n    }\n  }\n  deriv[0] =\n      this.computeDerivativeAtBoundary_(dx[0], dx[1], slope[0], slope[1]);\n  deriv[len] = this.computeDerivativeAtBoundary_(\n      dx[len - 1], dx[len - 2], slope[len - 1], slope[len - 2]);\n  return deriv;\n};\n\n\n/**\n * Computes the derivative of a data point at a boundary.\n * @param {number} dx0 The spacing of the 1st data point.\n * @param {number} dx1 The spacing of the 2nd data point.\n * @param {number} slope0 The slope of the 1st data point.\n * @param {number} slope1 The slope of the 2nd data point.\n * @return {number} The derivative at the 1st data point.\n * @private\n */\ngoog.math.interpolator.Pchip1.prototype.computeDerivativeAtBoundary_ = function(\n    dx0, dx1, slope0, slope1) {\n  var deriv = ((2 * dx0 + dx1) * slope0 - dx0 * slope1) / (dx0 + dx1);\n  if (goog.math.sign(deriv) != goog.math.sign(slope0)) {\n    deriv = 0;\n  } else if (\n      goog.math.sign(slope0) != goog.math.sign(slope1) &&\n      Math.abs(deriv) > Math.abs(3 * slope0)) {\n    deriv = 3 * slope0;\n  }\n  return deriv;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","~$goog.math.interpolator.Spline1","^<2"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/interpolator/pchip1.js"],"^:1",["^9K",["~$goog.math.interpolator.Pchip1"]],"^9<",true,"^9=",["^9>","^<2","^RL"]],["^ ","^9A",[1579837703000],"^9B","goog.stats.basicstat.js","^9C",["^9D","goog/stats/basicstat.js"],"^9E","goog/stats/basicstat.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A basic statistics tracker.\n *\n */\n\ngoog.provide('goog.stats.BasicStat');\n\ngoog.require('goog.asserts');\ngoog.require('goog.log');\ngoog.require('goog.string.format');\ngoog.require('goog.structs.CircularBuffer');\n\n\n\n/**\n * Tracks basic statistics over a specified time interval.\n *\n * Statistics are kept in a fixed number of slots, each representing\n * an equal portion of the time interval.\n *\n * Most methods optionally allow passing in the current time, so that\n * higher level stats can synchronize operations on multiple child\n * objects.  Under normal usage, the default of goog.now() should be\n * sufficient.\n *\n * @param {number} interval The stat interval, in milliseconds.\n * @constructor\n * @final\n */\ngoog.stats.BasicStat = function(interval) {\n  goog.asserts.assert(interval > 50);\n\n  /**\n   * The time interval that this statistic aggregates over.\n   * @type {number}\n   * @private\n   */\n  this.interval_ = interval;\n\n  /**\n   * The number of milliseconds in each slot.\n   * @type {number}\n   * @private\n   */\n  this.slotInterval_ = Math.floor(interval / goog.stats.BasicStat.NUM_SLOTS_);\n\n  /**\n   * The array of slots.\n   * @type {goog.structs.CircularBuffer}\n   * @private\n   */\n  this.slots_ =\n      new goog.structs.CircularBuffer(goog.stats.BasicStat.NUM_SLOTS_);\n};\n\n\n/**\n * The number of slots. This value limits the accuracy of the get()\n * method to (this.interval_ / NUM_SLOTS).  A 1-minute statistic would\n * be accurate to within 2 seconds.\n * @type {number}\n * @private\n */\ngoog.stats.BasicStat.NUM_SLOTS_ = 50;\n\n\n/**\n * @type {goog.log.Logger}\n * @private\n */\ngoog.stats.BasicStat.prototype.logger_ =\n    goog.log.getLogger('goog.stats.BasicStat');\n\n\n/**\n * @return {number} The interval which over statistics are being\n *     accumulated, in milliseconds.\n */\ngoog.stats.BasicStat.prototype.getInterval = function() {\n  return this.interval_;\n};\n\n\n/**\n * Increments the count of this statistic by the specified amount.\n *\n * @param {number} amt The amount to increase the count by.\n * @param {number=} opt_now The time, in milliseconds, to be treated\n *     as the \"current\" time.  The current time must always be greater\n *     than or equal to the last time recorded by this stat tracker.\n */\ngoog.stats.BasicStat.prototype.incBy = function(amt, opt_now) {\n  var now = opt_now ? opt_now : goog.now();\n  this.checkForTimeTravel_(now);\n  var slot = /** @type {goog.stats.BasicStat.Slot_} */ (this.slots_.getLast());\n  if (!slot || now >= slot.end) {\n    slot = new goog.stats.BasicStat.Slot_(this.getSlotBoundary_(now));\n    this.slots_.add(slot);\n  }\n  slot.count += amt;\n  slot.min = Math.min(amt, slot.min);\n  slot.max = Math.max(amt, slot.max);\n};\n\n\n/**\n * Returns the count of the statistic over its configured time\n * interval.\n * @param {number=} opt_now The time, in milliseconds, to be treated\n *     as the \"current\" time.  The current time must always be greater\n *     than or equal to the last time recorded by this stat tracker.\n * @return {number} The total count over the tracked interval.\n */\ngoog.stats.BasicStat.prototype.get = function(opt_now) {\n  return this.reduceSlots_(\n      opt_now, function(sum, slot) { return sum + slot.count; }, 0);\n};\n\n\n/**\n * Returns the magnitute of the largest atomic increment that occurred\n * during the watched time interval.\n * @param {number=} opt_now The time, in milliseconds, to be treated\n *     as the \"current\" time.  The current time must always be greater\n *     than or equal to the last time recorded by this stat tracker.\n * @return {number} The maximum count of this statistic.\n */\ngoog.stats.BasicStat.prototype.getMax = function(opt_now) {\n  return this.reduceSlots_(opt_now, function(max, slot) {\n    return Math.max(max, slot.max);\n  }, Number.MIN_VALUE);\n};\n\n\n/**\n * Returns the magnitute of the smallest atomic increment that\n * occurred during the watched time interval.\n * @param {number=} opt_now The time, in milliseconds, to be treated\n *     as the \"current\" time.  The current time must always be greater\n *     than or equal to the last time recorded by this stat tracker.\n * @return {number} The minimum count of this statistic.\n */\ngoog.stats.BasicStat.prototype.getMin = function(opt_now) {\n  return this.reduceSlots_(opt_now, function(min, slot) {\n    return Math.min(min, slot.min);\n  }, Number.MAX_VALUE);\n};\n\n\n/**\n * Passes each active slot into a function and accumulates the result.\n *\n * @param {number|undefined} now The current time, in milliseconds.\n * @param {function(number, goog.stats.BasicStat.Slot_): number} func\n *     The function to call for every active slot.  This function\n *     takes two arguments: the previous result and the new slot to\n *     include in the reduction.\n * @param {number} val The initial value for the reduction.\n * @return {number} The result of the reduction.\n * @private\n */\ngoog.stats.BasicStat.prototype.reduceSlots_ = function(now, func, val) {\n  now = now || goog.now();\n  this.checkForTimeTravel_(now);\n  var rval = val;\n  var start = this.getSlotBoundary_(now) - this.interval_;\n  for (var i = this.slots_.getCount() - 1; i >= 0; --i) {\n    var slot = /** @type {goog.stats.BasicStat.Slot_} */ (this.slots_.get(i));\n    if (slot.end <= start) {\n      break;\n    }\n    rval = func(rval, slot);\n  }\n  return rval;\n};\n\n\n/**\n * Computes the end time for the slot that should contain the count\n * around the given time.  This method ensures that every bucket is\n * aligned on a \"this.slotInterval_\" millisecond boundary.\n * @param {number} time The time to compute a boundary for.\n * @return {number} The computed boundary.\n * @private\n */\ngoog.stats.BasicStat.prototype.getSlotBoundary_ = function(time) {\n  return this.slotInterval_ * (Math.floor(time / this.slotInterval_) + 1);\n};\n\n\n/**\n * Checks that time never goes backwards.  If it does (for example,\n * the user changes their system clock), the object state is cleared.\n * @param {number} now The current time, in milliseconds.\n * @private\n */\ngoog.stats.BasicStat.prototype.checkForTimeTravel_ = function(now) {\n  var slot = /** @type {goog.stats.BasicStat.Slot_} */ (this.slots_.getLast());\n  if (slot) {\n    var slotStart = slot.end - this.slotInterval_;\n    if (now < slotStart) {\n      goog.log.warning(\n          this.logger_,\n          goog.string.format(\n              'Went backwards in time: now=%d, slotStart=%d.  Resetting state.',\n              now, slotStart));\n      this.reset_();\n    }\n  }\n};\n\n\n/**\n * Clears any statistics tracked by this object, as though it were\n * freshly created.\n * @private\n */\ngoog.stats.BasicStat.prototype.reset_ = function() {\n  this.slots_.clear();\n};\n\n\n\n/**\n * A struct containing information for each sub-interval.\n * @param {number} end The end time for this slot, in milliseconds.\n * @constructor\n * @private\n */\ngoog.stats.BasicStat.Slot_ = function(end) {\n  /**\n   * End time of this slot, exclusive.\n   * @type {number}\n   */\n  this.end = end;\n};\n\n\n/**\n * Aggregated count within this slot.\n * @type {number}\n */\ngoog.stats.BasicStat.Slot_.prototype.count = 0;\n\n\n/**\n * The smallest atomic increment of the count within this slot.\n * @type {number}\n */\ngoog.stats.BasicStat.Slot_.prototype.min = Number.MAX_VALUE;\n\n\n/**\n * The largest atomic increment of the count within this slot.\n * @type {number}\n */\ngoog.stats.BasicStat.Slot_.prototype.max = Number.MIN_VALUE;\n","^9I",1579837703000,"^9J",["^9K",["^:E","^<R","^9>","^;Q","~$goog.string.format"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/stats/basicstat.js"],"^:1",["^9K",["~$goog.stats.BasicStat"]],"^9<",true,"^9=",["^9>","^:E","^;Q","^RN","^<R"]],["^ ","^9A",[1579837703000],"^9B","goog.async.delay.js","^9C",["^9D","goog/async/delay.js"],"^9E","goog/async/delay.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines a class useful for handling functions that must be\n * invoked after a delay, especially when that delay is frequently restarted.\n * Examples include delaying before displaying a tooltip, menu hysteresis,\n * idle timers, etc.\n * @author brenneman@google.com (Shawn Brenneman)\n * @see ../demos/timers.html\n */\n\n\ngoog.provide('goog.Delay');\ngoog.provide('goog.async.Delay');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.Timer');\n\n\n\n/**\n * A Delay object invokes the associated function after a specified delay. The\n * interval duration can be specified once in the constructor, or can be defined\n * each time the delay is started. Calling start on an active delay will reset\n * the timer.\n *\n * @param {function(this:THIS)} listener Function to call when the\n *     delay completes.\n * @param {number=} opt_interval The default length of the invocation delay (in\n *     milliseconds).\n * @param {THIS=} opt_handler The object scope to invoke the function in.\n * @template THIS\n * @constructor\n * @struct\n * @extends {goog.Disposable}\n * @final\n */\ngoog.async.Delay = function(listener, opt_interval, opt_handler) {\n  goog.async.Delay.base(this, 'constructor');\n\n  /**\n   * The function that will be invoked after a delay.\n   * @private {function(this:THIS)}\n   */\n  this.listener_ = listener;\n\n  /**\n   * The default amount of time to delay before invoking the callback.\n   * @type {number}\n   * @private\n   */\n  this.interval_ = opt_interval || 0;\n\n  /**\n   * The object context to invoke the callback in.\n   * @type {Object|undefined}\n   * @private\n   */\n  this.handler_ = opt_handler;\n\n\n  /**\n   * Cached callback function invoked when the delay finishes.\n   * @type {Function}\n   * @private\n   */\n  this.callback_ = goog.bind(this.doAction_, this);\n};\ngoog.inherits(goog.async.Delay, goog.Disposable);\n\n\n\n/**\n * A deprecated alias.\n * @deprecated Use goog.async.Delay instead.\n * @constructor\n * @final\n */\ngoog.Delay = goog.async.Delay;\n\n\n/**\n * Identifier of the active delay timeout, or 0 when inactive.\n * @type {number}\n * @private\n */\ngoog.async.Delay.prototype.id_ = 0;\n\n\n/**\n * Disposes of the object, cancelling the timeout if it is still outstanding and\n * removing all object references.\n * @override\n * @protected\n */\ngoog.async.Delay.prototype.disposeInternal = function() {\n  goog.async.Delay.base(this, 'disposeInternal');\n  this.stop();\n  delete this.listener_;\n  delete this.handler_;\n};\n\n\n/**\n * Starts the delay timer. The provided listener function will be called after\n * the specified interval. Calling start on an active timer will reset the\n * delay interval.\n * @param {number=} opt_interval If specified, overrides the object's default\n *     interval with this one (in milliseconds).\n */\ngoog.async.Delay.prototype.start = function(opt_interval) {\n  this.stop();\n  this.id_ = goog.Timer.callOnce(\n      this.callback_,\n      opt_interval !== undefined ? opt_interval : this.interval_);\n};\n\n\n/**\n * Starts the delay timer if it's not already active.\n * @param {number=} opt_interval If specified and the timer is not already\n *     active, overrides the object's default interval with this one (in\n *     milliseconds).\n */\ngoog.async.Delay.prototype.startIfNotActive = function(opt_interval) {\n  if (!this.isActive()) {\n    this.start(opt_interval);\n  }\n};\n\n\n/**\n * Stops the delay timer if it is active. No action is taken if the timer is not\n * in use.\n */\ngoog.async.Delay.prototype.stop = function() {\n  if (this.isActive()) {\n    goog.Timer.clear(this.id_);\n  }\n  this.id_ = 0;\n};\n\n\n/**\n * Fires delay's action even if timer has already gone off or has not been\n * started yet; guarantees action firing. Stops the delay timer.\n */\ngoog.async.Delay.prototype.fire = function() {\n  this.stop();\n  this.doAction_();\n};\n\n\n/**\n * Fires delay's action only if timer is currently active. Stops the delay\n * timer.\n */\ngoog.async.Delay.prototype.fireIfActive = function() {\n  if (this.isActive()) {\n    this.fire();\n  }\n};\n\n\n/**\n * @return {boolean} True if the delay is currently active, false otherwise.\n */\ngoog.async.Delay.prototype.isActive = function() {\n  return this.id_ != 0;\n};\n\n\n/**\n * Invokes the callback function after the delay successfully completes.\n * @private\n */\ngoog.async.Delay.prototype.doAction_ = function() {\n  this.id_ = 0;\n  if (this.listener_) {\n    this.listener_.call(this.handler_);\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^><","^9>","^:7"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/async/delay.js"],"^:1",["^9K",["~$goog.Delay","~$goog.async.Delay"]],"^9<",true,"^9=",["^9>","^:7","^><"]],["^ ","^9A",[1579837703000],"^9B","goog.structs.prioritypool.js","^9C",["^9D","goog/structs/prioritypool.js"],"^9E","goog/structs/prioritypool.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Datastructure: Priority Pool.\n *\n *\n * An extending of Pool that handles queueing and prioritization.\n */\n\n\ngoog.provide('goog.structs.PriorityPool');\n\ngoog.require('goog.structs.Pool');\ngoog.require('goog.structs.PriorityQueue');\n\n\n\n/**\n * A generic pool class. If min is greater than max, an error is thrown.\n * @param {number=} opt_minCount Min. number of objects (Default: 0).\n * @param {number=} opt_maxCount Max. number of objects (Default: 10).\n * @constructor\n * @extends {goog.structs.Pool<VALUE>}\n * @template VALUE\n */\ngoog.structs.PriorityPool = function(opt_minCount, opt_maxCount) {\n  /**\n   * The key for the most recent timeout created.\n   * @private {number|undefined}\n   */\n  this.delayTimeout_ = undefined;\n\n  /**\n   * Queue of requests for pool objects.\n   * @private {goog.structs.PriorityQueue<VALUE>}\n   */\n  this.requestQueue_ = new goog.structs.PriorityQueue();\n\n  // Must break convention of putting the super-class's constructor first. This\n  // is because the super-class constructor calls adjustForMinMax, which this\n  // class overrides. In this class's implementation, it assumes that there\n  // is a requestQueue_, and will error if not present.\n  goog.structs.Pool.call(this, opt_minCount, opt_maxCount);\n};\ngoog.inherits(goog.structs.PriorityPool, goog.structs.Pool);\n\n\n/**\n * Default priority for pool objects requests.\n * @type {number}\n * @private\n */\ngoog.structs.PriorityPool.DEFAULT_PRIORITY_ = 100;\n\n\n/** @override */\ngoog.structs.PriorityPool.prototype.setDelay = function(delay) {\n  goog.structs.PriorityPool.base(this, 'setDelay', delay);\n\n  // If the pool hasn't been accessed yet, no need to do anything.\n  if (this.lastAccess == null) {\n    return;\n  }\n\n  goog.global.clearTimeout(this.delayTimeout_);\n  this.delayTimeout_ = goog.global.setTimeout(\n      goog.bind(this.handleQueueRequests_, this),\n      this.delay + this.lastAccess - goog.now());\n\n  // Handle all requests.\n  this.handleQueueRequests_();\n};\n\n\n/**\n * Get a new object from the the pool, if there is one available, otherwise\n * return undefined.\n * @param {Function=} opt_callback The function to callback when an object is\n *     available. This could be immediately. If this is not present, then an\n *     object is immediately returned if available, or undefined if not.\n * @param {number=} opt_priority The priority of the request. A smaller value\n *     means a higher priority.\n * @return {VALUE|undefined} The new object from the pool if there is one\n *     available and a callback is not given. Otherwise, undefined.\n * @override\n */\ngoog.structs.PriorityPool.prototype.getObject = function(\n    opt_callback, opt_priority) {\n  if (!opt_callback) {\n    var result = goog.structs.PriorityPool.base(this, 'getObject');\n    if (result && this.delay) {\n      this.delayTimeout_ = goog.global.setTimeout(\n          goog.bind(this.handleQueueRequests_, this), this.delay);\n    }\n    return result;\n  }\n\n  var priority = (opt_priority !== undefined) ?\n      opt_priority :\n      goog.structs.PriorityPool.DEFAULT_PRIORITY_;\n  this.requestQueue_.enqueue(priority, opt_callback);\n\n  // Handle all requests.\n  this.handleQueueRequests_();\n\n  return undefined;\n};\n\n\n/**\n * Handles the request queue. Tries to fires off as many queued requests as\n * possible.\n * @private\n */\ngoog.structs.PriorityPool.prototype.handleQueueRequests_ = function() {\n  var requestQueue = this.requestQueue_;\n  while (requestQueue.getCount() > 0) {\n    var obj = this.getObject();\n\n    if (!obj) {\n      return;\n    } else {\n      var requestCallback = requestQueue.dequeue();\n      requestCallback.apply(this, [obj]);\n    }\n  }\n};\n\n\n/**\n * Adds an object to the collection of objects that are free. If the object can\n * not be added, then it is disposed.\n *\n * NOTE: This method does not remove the object from the in use collection.\n *\n * @param {VALUE} obj The object to add to the collection of free objects.\n * @override\n */\ngoog.structs.PriorityPool.prototype.addFreeObject = function(obj) {\n  goog.structs.PriorityPool.superClass_.addFreeObject.call(this, obj);\n\n  // Handle all requests.\n  this.handleQueueRequests_();\n};\n\n\n/**\n * Adjusts the objects held in the pool to be within the min/max constraints.\n *\n * NOTE: It is possible that the number of objects in the pool will still be\n * greater than the maximum count of objects allowed. This will be the case\n * if no more free objects can be disposed of to get below the minimum count\n * (i.e., all objects are in use).\n * @override\n */\ngoog.structs.PriorityPool.prototype.adjustForMinMax = function() {\n  goog.structs.PriorityPool.superClass_.adjustForMinMax.call(this);\n\n  // Handle all requests.\n  this.handleQueueRequests_();\n};\n\n\n/** @override */\ngoog.structs.PriorityPool.prototype.disposeInternal = function() {\n  goog.structs.PriorityPool.superClass_.disposeInternal.call(this);\n  goog.global.clearTimeout(this.delayTimeout_);\n  this.requestQueue_.clear();\n  this.requestQueue_ = null;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^>=","^>F"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/prioritypool.js"],"^:1",["^9K",["~$goog.structs.PriorityPool"]],"^9<",true,"^9=",["^9>","^>=","^>F"]],["^ ","^9A",[1579837703000],"^9B","goog.labs.testing.environment.js","^9C",["^9D","goog/labs/testing/environment.js"],"^9E","goog/labs/testing/environment.js","^9F","^9G","^9H","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.labs.testing.Environment');\n\ngoog.require('goog.Thenable');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.debug.Console');\ngoog.require('goog.testing.MockClock');\ngoog.require('goog.testing.MockControl');\ngoog.require('goog.testing.PropertyReplacer');\ngoog.require('goog.testing.TestCase');\ngoog.require('goog.testing.jsunit');\n\n\n/**\n * JsUnit environments allow developers to customize the existing testing\n * lifecycle by hitching additional setUp and tearDown behaviors to tests.\n *\n * Environments will run their setUp steps in the order in which they\n * are instantiated and registered. During tearDown, the environments will\n * unwind the setUp and execute in reverse order.\n *\n * See http://go/jsunit-env for more information.\n */\ngoog.labs.testing.Environment = goog.defineClass(null, {\n  /** @constructor */\n  constructor: function() {\n    var testcase = goog.labs.testing.EnvironmentTestCase_.getInstance();\n    testcase.registerEnvironment_(this);\n\n    // Record the active test case, in normal usage this is a singleton,\n    // but while testing this case it is reset.\n    goog.labs.testing.Environment.activeTestCase_ = testcase;\n\n    /**\n     * Mocks are not type-checkable. To reduce burden on tests that are type\n     * checked, this is typed as \"?\" to turn off JSCompiler checking.\n     * TODO(b/69851971): Enable a type-checked mocking library.\n     * @type {?}\n     */\n    this.mockControl = null;\n\n    /** @type {?goog.testing.MockClock} */\n    this.mockClock = null;\n\n    /** @private {boolean} */\n    this.shouldMakeMockControl_ = false;\n\n    /** @protected {boolean} */\n    this.mockClockOn = false;\n\n    /** @const {!goog.debug.Console} */\n    this.console = goog.labs.testing.Environment.console_;\n\n    /** @const {!goog.testing.PropertyReplacer} */\n    this.replacer = new goog.testing.PropertyReplacer();\n  },\n\n\n  /**\n   * Runs immediately before the setUpPage phase of JsUnit tests.\n   * @return {!IThenable<*>|undefined} An optional Promise which must be\n   *     resolved before the test is executed.\n   */\n  setUpPage: function() {\n    if (this.mockClockOn && !this.hasMockClock()) {\n      this.mockClock = new goog.testing.MockClock(true);\n    }\n  },\n\n\n  /** Runs immediately after the tearDownPage phase of JsUnit tests. */\n  tearDownPage: function() {\n    // If we created the mockClock, we'll also dispose it.\n    if (this.hasMockClock()) {\n      this.mockClock.dispose();\n    }\n  },\n\n  /**\n   * Runs immediately before the setUp phase of JsUnit tests.\n   * @return {!IThenable<*>|undefined} An optional Promise which must be\n   *     resolved before the test case is executed.\n   */\n  setUp: goog.nullFunction,\n\n  /**\n   * Runs immediately after the tearDown phase of JsUnit tests.\n   * @return {!IThenable<*>|undefined} An optional Promise which must be\n   *     resolved before the next test case is executed.\n   */\n  tearDown: function() {\n    // Make sure promises and other stuff that may still be scheduled, get a\n    // chance to run (and throw errors).\n    if (this.mockClock) {\n      for (var i = 0; i < 100; i++) {\n        this.mockClock.tick(1000);\n      }\n      // If we created the mockClock, we'll also reset it.\n      if (this.hasMockClock()) {\n        this.mockClock.reset();\n      }\n    }\n    // Reset all changes made by the PropertyReplacer.\n    this.replacer.reset();\n    // Make sure the user did not forget to call $replayAll & $verifyAll in\n    // their test. This is a noop if they did.\n    // This is important because:\n    // - Engineers thinks that not all their tests need to replay and verify.\n    //   That lets tests sneak in that call mocks but never replay those calls.\n    // - Then some well meaning maintenance engineer wants to update the test\n    //   with some new mock, adds a replayAll and BOOM the test fails\n    //   because completely unrelated mocks now get replayed.\n    if (this.mockControl) {\n      try {\n        this.mockControl.$verifyAll();\n        this.mockControl.$replayAll();\n        this.mockControl.$verifyAll();\n      } finally {\n        this.mockControl.$resetAll();\n        if (this.shouldMakeMockControl_) {\n          // If we created the mockControl, we'll also tear it down.\n          this.mockControl.$tearDown();\n        }\n      }\n    }\n    // Verifying the mockControl may throw, so if cleanup needs to happen,\n    // add it further up in the function.\n  },\n\n\n  /**\n   * Create a new {@see goog.testing.MockControl} accessible via\n   * `env.mockControl` for each test. If your test has more than one\n   * testing environment, don't call this on more than one of them.\n   * @return {!goog.labs.testing.Environment} For chaining.\n   */\n  withMockControl: function() {\n    if (!this.shouldMakeMockControl_) {\n      this.shouldMakeMockControl_ = true;\n      this.mockControl = new goog.testing.MockControl();\n    }\n    return this;\n  },\n\n\n  /**\n   * Create a {@see goog.testing.MockClock} for each test. The clock will be\n   * installed (override i.e. setTimeout) by default. It can be accessed\n   * using `env.mockClock`. If your test has more than one testing\n   * environment, don't call this on more than one of them.\n   * @return {!goog.labs.testing.Environment} For chaining.\n   */\n  withMockClock: function() {\n    if (!this.hasMockClock()) {\n      this.mockClockOn = true;\n      this.mockClock = new goog.testing.MockClock(true);\n    }\n    return this;\n  },\n\n  /**\n   * @return {boolean}\n   * @protected\n   */\n  hasMockClock: function() {\n    return this.mockClockOn && !!this.mockClock && !this.mockClock.isDisposed();\n  },\n\n  /**\n   * Creates a basic strict mock of a `toMock`. For more advanced mocking,\n   * please use the MockControl directly.\n   * @param {?Function|?Object} toMock\n   * @return {?}\n   */\n  mock: function(toMock) {\n    if (!this.shouldMakeMockControl_) {\n      throw new Error(\n          'MockControl not available on this environment. ' +\n          'Call withMockControl if this environment is expected ' +\n          'to contain a MockControl.');\n    }\n    var mock = this.mockControl.createStrictMock(toMock);\n    // Mocks are not type-checkable. To reduce burden on tests that are type\n    // checked, this is typed as \"?\" to turn off JSCompiler checking.\n    // TODO(b/69851971): Enable a type-checked mocking library.\n    return /** @type {?} */ (mock);\n  },\n\n  /**\n   * Creates a basic loose mock of a `toMock`. For more advanced mocking, please\n   * use the MockControl directly.\n   * @param {?Function|?Object} toMock\n   * @param {boolean=} ignoreUnexpectedCalls Defaults to false.\n   * @return {?}\n   */\n  looseMock: function(toMock, ignoreUnexpectedCalls = false) {\n    if (!this.shouldMakeMockControl_) {\n      throw new Error(\n          'MockControl not available on this environment. ' +\n          'Call withMockControl if this environment is expected ' +\n          'to contain a MockControl.');\n    }\n    var mock = this.mockControl.createLooseMock(toMock, ignoreUnexpectedCalls);\n    // Mocks are not type-checkable. To reduce burden on tests that are type\n    // checked, this is typed as \"?\" to turn off JSCompiler checking.\n    // TODO(b/69851971): Enable a type-checked mocking library.\n    return /** @type {?} */ (mock);\n  },\n});\n\n\n/**\n * @private {?goog.testing.TestCase}\n */\ngoog.labs.testing.Environment.activeTestCase_ = null;\n\n\n// TODO(johnlenz): make this package private when it moves out of labs.\n/**\n * @return {?goog.testing.TestCase}\n */\ngoog.labs.testing.Environment.getTestCaseIfActive = function() {\n  return goog.labs.testing.Environment.activeTestCase_;\n};\n\n\n/** @private @const {!goog.debug.Console} */\ngoog.labs.testing.Environment.console_ = new goog.debug.Console();\n\n\n// Activate logging to the browser's console by default.\ngoog.labs.testing.Environment.console_.setCapturing(true);\n\n\n\n/**\n * An internal TestCase used to hook environments into the JsUnit test runner.\n * Environments cannot be used in conjunction with custom TestCases for JsUnit.\n * @private @final @constructor\n * @extends {goog.testing.TestCase}\n */\ngoog.labs.testing.EnvironmentTestCase_ = function() {\n  goog.labs.testing.EnvironmentTestCase_.base(\n      this, 'constructor', document.title);\n\n  /** @private {!Array<!goog.labs.testing.Environment>}> */\n  this.environments_ = [];\n\n  /** @private {!Object} */\n  this.testobj_ = goog.global;  // default\n\n  // Automatically install this TestCase when any environment is used in a test.\n  goog.testing.TestCase.initializeTestRunner(this);\n};\ngoog.inherits(goog.labs.testing.EnvironmentTestCase_, goog.testing.TestCase);\ngoog.addSingletonGetter(goog.labs.testing.EnvironmentTestCase_);\n\n\n/**\n * Override setLifecycleObj to allow incoming test object to provide only\n * runTests and shouldRunTests. The other lifecycle methods are controlled by\n * this environment.\n * @override\n */\ngoog.labs.testing.EnvironmentTestCase_.prototype.setLifecycleObj = function(\n    obj) {\n  goog.asserts.assert(\n      this.testobj_ == goog.global,\n      'A test method object has already been provided ' +\n          'and only one is supported.');\n\n  // Store the test object so we can call lifecyle methods when needed.\n  this.testobj_ = obj;\n\n  if (this.testobj_['runTests']) {\n    this.runTests = goog.bind(this.testobj_['runTests'], this.testobj_);\n  }\n  if (this.testobj_['shouldRunTests']) {\n    this.shouldRunTests =\n        goog.bind(this.testobj_['shouldRunTests'], this.testobj_);\n  }\n};\n\n/**\n * @override\n */\ngoog.labs.testing.EnvironmentTestCase_.prototype.createTest = function(\n    name, ref, scope, objChain) {\n  return new goog.labs.testing.EnvironmentTest_(name, ref, scope, objChain);\n};\n\n\n/**\n * Adds an environment to the JsUnit test.\n * @param {!goog.labs.testing.Environment} env\n * @private\n */\ngoog.labs.testing.EnvironmentTestCase_.prototype.registerEnvironment_ =\n    function(env) {\n  this.environments_.push(env);\n};\n\n\n/** @override */\ngoog.labs.testing.EnvironmentTestCase_.prototype.setUpPage = function() {\n  var setUpPageFns = goog.array.map(this.environments_, function(env) {\n    return () => env.setUpPage();\n  });\n\n  // User defined setUpPage method.\n  if (this.testobj_['setUpPage']) {\n    setUpPageFns.push(() => this.testobj_['setUpPage']());\n  }\n  return this.callAndChainPromises_(setUpPageFns);\n};\n\n\n/** @override */\ngoog.labs.testing.EnvironmentTestCase_.prototype.setUp = function() {\n  var setUpFns = [];\n  // User defined configure method.\n  if (this.testobj_['configureEnvironment']) {\n    setUpFns.push(() => this.testobj_['configureEnvironment']());\n  }\n  var test = this.getCurrentTest();\n  if (test instanceof goog.labs.testing.EnvironmentTest_) {\n    goog.array.extend(setUpFns, test.configureEnvironments);\n  }\n\n  goog.array.forEach(this.environments_, function(env) {\n    setUpFns.push(() => env.setUp());\n  }, this);\n\n  // User defined setUp method.\n  if (this.testobj_['setUp']) {\n    setUpFns.push(() => this.testobj_['setUp']());\n  }\n  return this.callAndChainPromises_(setUpFns);\n};\n\n\n/**\n * Calls a chain of methods and makes sure to properly chain them if any of the\n * methods returns a thenable.\n * @param {!Array<function()>} fns\n * @param {boolean=} ensureAllFnsCalled If true, this method calls each function\n *     even if one of them throws an Error or returns a rejected Promise. If\n *     there were any Errors thrown (or Promises rejected), the first Error will\n *     be rethrown after all of the functions are called.\n * @return {!IThenable<*>|undefined}\n * @private\n */\ngoog.labs.testing.EnvironmentTestCase_.prototype.callAndChainPromises_ =\n    function(fns, ensureAllFnsCalled) {\n  // Using await here (and making callAndChainPromises_ an async method)\n  // causes many tests across google3 to start failing with errors like this:\n  // \"Timed out while waiting for a promise returned from setUp to resolve\".\n\n  const isThenable = (v) => goog.Thenable.isImplementedBy(v) ||\n      (typeof goog.global['Promise'] === 'function' &&\n       v instanceof goog.global['Promise']);\n\n  // Record the first error that occurs so that it can be rethrown in the case\n  // where ensureAllFnsCalled is set.\n  let firstError;\n  const recordFirstError = (e) => {\n    if (!firstError) {\n      firstError = e instanceof Error ? e : new Error(e);\n    }\n  };\n\n  // Call the fns, chaining results that are Promises.\n  let lastFnResult;\n  for (const fn of fns) {\n    if (isThenable(lastFnResult)) {\n      // The previous fn was async, so chain the next fn.\n      const rejectedHandler = ensureAllFnsCalled ? (e) => {\n        recordFirstError(e);\n        return fn();\n      } : undefined;\n      lastFnResult = lastFnResult.then(() => fn(), rejectedHandler);\n    } else {\n      // The previous fn was not async, so simply call the next fn.\n      try {\n        lastFnResult = fn();\n      } catch (e) {\n        if (!ensureAllFnsCalled) {\n          throw e;\n        }\n        recordFirstError(e);\n      }\n    }\n  }\n\n  // After all of the fns have been called, either throw the first error if\n  // there was one, or otherwise return the result of the last fn.\n  const resultFn = () => {\n    if (firstError) {\n      throw firstError;\n    }\n    return lastFnResult;\n  };\n  return isThenable(lastFnResult) ? lastFnResult.then(resultFn, resultFn) :\n                                    resultFn();\n};\n\n\n/** @override */\ngoog.labs.testing.EnvironmentTestCase_.prototype.tearDown = function() {\n  var tearDownFns = [];\n  // User defined tearDown method.\n  if (this.testobj_['tearDown']) {\n    tearDownFns.push(() => this.testobj_['tearDown']());\n  }\n\n  // Execute the tearDown methods for the environment in the reverse order\n  // in which they were registered to \"unfold\" the setUp.\n  goog.array.forEachRight(this.environments_, function(env) {\n    tearDownFns.push(() => env.tearDown());\n  });\n  // For tearDowns between tests make sure they run as much as possible to avoid\n  // interference between tests.\n  return this.callAndChainPromises_(\n      tearDownFns, /* ensureAllFnsCalled= */ true);\n};\n\n\n/** @override */\ngoog.labs.testing.EnvironmentTestCase_.prototype.tearDownPage = function() {\n  // User defined tearDownPage method.\n  if (this.testobj_['tearDownPage']) {\n    this.testobj_['tearDownPage']();\n  }\n\n  goog.array.forEachRight(\n      this.environments_, function(env) { env.tearDownPage(); });\n};\n\n/**\n * An internal Test used to hook environments into the JsUnit test runner.\n * @param {string} name The test name.\n * @param {function()} ref Reference to the test function or test object.\n * @param {?Object=} scope Optional scope that the test function should be\n *     called in.\n * @param {!Array<!Object>=} objChain A chain of objects used to populate setUps\n *     and tearDowns.\n * @private\n * @final\n * @constructor\n * @extends {goog.testing.TestCase.Test}\n */\ngoog.labs.testing.EnvironmentTest_ = function(name, ref, scope, objChain) {\n  goog.labs.testing.EnvironmentTest_.base(\n      this, 'constructor', name, ref, scope, objChain);\n\n  /**\n   * @type {!Array<function()>}\n   */\n  this.configureEnvironments = goog.array.map(\n      goog.array.filter(\n          objChain || [],\n          function(obj) {\n            return goog.isFunction(obj.configureEnvironment);\n          }), /**\n               * @param  {{configureEnvironment: function()}} obj\n               * @return {function()}\n               */\n      function(obj) {\n        return goog.bind(obj.configureEnvironment, obj);\n      });\n};\ngoog.inherits(goog.labs.testing.EnvironmentTest_, goog.testing.TestCase.Test);\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.debug.Console","^9>","^:5","^J8","~$goog.testing.TestCase","^::","^;9","^:9","^JA"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/testing/environment.js"],"^:1",["^9K",["~$goog.labs.testing.Environment"]],"^9<",true,"^9=",["^9>","^:9","^;9","^:E","^RS","^::","^JA","^:5","^RT","^J8"]],["^ ","^9A",[1579837703000],"^9B","goog.useragent.jscript.js","^9C",["^9D","goog/useragent/jscript.js"],"^9E","goog/useragent/jscript.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Detection of JScript version.\n *\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.userAgent.jscript');\n\ngoog.require('goog.string');\n\n\n/**\n * @define {boolean} True if it is known at compile time that the runtime\n *     environment will not be using JScript.\n */\ngoog.userAgent.jscript.ASSUME_NO_JSCRIPT =\n    goog.define('goog.userAgent.jscript.ASSUME_NO_JSCRIPT', false);\n\n\n/**\n * Whether we detect that the user agent is using Microsoft JScript.\n * @type {boolean}\n */\ngoog.userAgent.jscript.HAS_JSCRIPT = false;\n\n\n/**\n * The installed version of JScript.\n * @type {string}\n */\ngoog.userAgent.jscript.VERSION = '0';\n\n\n/**\n * Initializer for goog.userAgent.jscript.  Detects if the user agent is using\n * Microsoft JScript and which version of it.\n *\n * This is a named function so that it can be stripped via the jscompiler\n * option for stripping types.\n * @package\n */\ngoog.userAgent.jscript.init = function() {\n  var hasScriptEngine = 'ScriptEngine' in goog.global;\n  goog.userAgent.jscript.HAS_JSCRIPT =\n      hasScriptEngine && goog.global['ScriptEngine']() == 'JScript';\n  if (goog.userAgent.jscript.HAS_JSCRIPT) {\n    goog.userAgent.jscript.VERSION = goog.global['ScriptEngineMajorVersion']() +\n        '.' + goog.global['ScriptEngineMinorVersion']() + '.' +\n        goog.global['ScriptEngineBuildVersion']();\n  }\n};\n\nif (!goog.userAgent.jscript.ASSUME_NO_JSCRIPT) {\n  goog.userAgent.jscript.init();\n}\n\n/**\n * Whether the installed version of JScript is as new or newer than a given\n * version.\n * @param {string} version The version to check.\n * @return {boolean} Whether the installed version of JScript is as new or\n *     newer than the given version.\n */\ngoog.userAgent.jscript.isVersion = function(version) {\n  return goog.string.compareVersions(goog.userAgent.jscript.VERSION, version) >=\n      0;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9L","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/useragent/jscript.js"],"^:1",["^9K",["~$goog.userAgent.jscript"]],"^9<",true,"^9=",["^9>","^9L"]],["^ ","^9A",[1579837703000],"^9B","goog.html.trustedtypes.js","^9C",["^9D","goog/html/trustedtypes.js"],"^9E","goog/html/trustedtypes.js","^9F","^9G","^9H","// Copyright 2018 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Policy to convert strings to Trusted Types. See\n * https://github.com/WICG/trusted-types for details.\n */\n\ngoog.provide('goog.html.trustedtypes');\n\n/** @package @const {?TrustedTypePolicy} */\ngoog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY =\n    goog.TRUSTED_TYPES_POLICY_NAME ?\n    goog.createTrustedTypesPolicy(goog.TRUSTED_TYPES_POLICY_NAME + '#html') :\n    null;\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/trustedtypes.js"],"^:1",["^9K",["^GZ"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.crypt.sha224.js","^9C",["^9D","goog/crypt/sha224.js"],"^9E","goog/crypt/sha224.js","^9F","^9G","^9H","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview SHA-224 cryptographic hash.\n *\n * Usage:\n *   var sha224 = new goog.crypt.Sha224();\n *   sha224.update(bytes);\n *   var hash = sha224.digest();\n *\n */\n\ngoog.provide('goog.crypt.Sha224');\n\ngoog.require('goog.crypt.Sha2');\n\n\n\n/**\n * SHA-224 cryptographic hash constructor.\n *\n * @constructor\n * @extends {goog.crypt.Sha2}\n * @final\n * @struct\n */\ngoog.crypt.Sha224 = function() {\n  goog.crypt.Sha224.base(\n      this, 'constructor', 7, goog.crypt.Sha224.INIT_HASH_BLOCK_);\n};\ngoog.inherits(goog.crypt.Sha224, goog.crypt.Sha2);\n\n\n/** @private {!Array<number>} */\ngoog.crypt.Sha224.INIT_HASH_BLOCK_ = [\n  0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511,\n  0x64f98fa7, 0xbefa4fa4\n];\n","^9I",1579837703000,"^9J",["^9K",["~$goog.crypt.Sha2","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/sha224.js"],"^:1",["^9K",["~$goog.crypt.Sha224"]],"^9<",true,"^9=",["^9>","^RW"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.itemevent.js","^9C",["^9D","goog/ui/itemevent.js"],"^9E","goog/ui/itemevent.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the goog.ui.ItemEvent class.\n *\n */\n\ngoog.provide('goog.ui.ItemEvent');\n\n\ngoog.require('goog.events.Event');\n\n\n\n/**\n * Generic ui event class for events that take a single item like a menu click\n * event.\n *\n * @constructor\n * @extends {goog.events.Event}\n * @param {string} type Event Type.\n * @param {Object} target Reference to the object that is the target\n *                        of this event.\n * @param {Object} item The item that was clicked.\n * @final\n */\ngoog.ui.ItemEvent = function(type, target, item) {\n  goog.events.Event.call(this, type, target);\n\n  /**\n   * Item for the event. The type of this object is specific to the type\n   * of event. For a menu, it would be the menu item that was clicked. For a\n   * listbox selection, it would be the listitem that was selected.\n   *\n   * @type {Object}\n   */\n  this.item = item;\n};\ngoog.inherits(goog.ui.ItemEvent, goog.events.Event);\n","^9I",1579837703000,"^9J",["^9K",["^9>","^;8"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/itemevent.js"],"^:1",["^9K",["~$goog.ui.ItemEvent"]],"^9<",true,"^9=",["^9>","^;8"]],["^ ","^9A",[1579837703000],"^9B","goog.vec.vec3f.js","^9C",["^9D","goog/vec/vec3f.js"],"^9E","goog/vec/vec3f.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n//                                                                           //\n// Any edits to this file must be applied to vec3d.js by running:            //\n//   swap_type.sh vec3f.js > vec3d.js                                        //\n//                                                                           //\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n\n\n/**\n * @fileoverview Provides functions for operating on 3 element float (32bit)\n * vectors.\n *\n * The last parameter will typically be the output object and an object\n * can be both an input and output parameter to all methods except where\n * noted.\n *\n * See the README for notes about the design and structure of the API\n * (especially related to performance).\n *\n */\ngoog.provide('goog.vec.vec3f');\ngoog.provide('goog.vec.vec3f.Type');\n\n/** @suppress {extraRequire} */\ngoog.require('goog.vec');\n\n/** @typedef {!goog.vec.Float32} */ goog.vec.vec3f.Type;\n\n\n/**\n * Creates a vec3f with all elements initialized to zero.\n *\n * @return {!goog.vec.vec3f.Type} The new vec3f.\n */\ngoog.vec.vec3f.create = function() {\n  return new Float32Array(3);\n};\n\n\n/**\n * Creates a new vec3f initialized with the value from the given array.\n *\n * @param {!Array<number>} vec The source 3 element array.\n * @return {!goog.vec.vec3f.Type} The new vec3f.\n */\ngoog.vec.vec3f.createFromArray = function(vec) {\n  var newVec = goog.vec.vec3f.create();\n  goog.vec.vec3f.setFromArray(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Creates a new vec3f initialized with the supplied values.\n *\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @return {!goog.vec.vec3f.Type} The new vector.\n */\ngoog.vec.vec3f.createFromValues = function(v0, v1, v2) {\n  var vec = goog.vec.vec3f.create();\n  goog.vec.vec3f.setFromValues(vec, v0, v1, v2);\n  return vec;\n};\n\n\n/**\n * Creates a clone of the given vec3f.\n *\n * @param {!goog.vec.vec3f.Type} vec The source vec3f.\n * @return {!goog.vec.vec3f.Type} The new cloned vec3f.\n */\ngoog.vec.vec3f.clone = function(vec) {\n  var newVec = goog.vec.vec3f.create();\n  goog.vec.vec3f.setFromVec3f(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Initializes the vector with the given values.\n *\n * @param {!goog.vec.vec3f.Type} vec The vector to receive the values.\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @return {!goog.vec.vec3f.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.setFromValues = function(vec, v0, v1, v2) {\n  vec[0] = v0;\n  vec[1] = v1;\n  vec[2] = v2;\n  return vec;\n};\n\n\n/**\n * Initializes vec3f vec from vec3f src.\n *\n * @param {!goog.vec.vec3f.Type} vec The destination vector.\n * @param {!goog.vec.vec3f.Type} src The source vector.\n * @return {!goog.vec.vec3f.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.setFromVec3f = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  vec[2] = src[2];\n  return vec;\n};\n\n\n/**\n * Initializes vec3f vec from vec3d src (typed as a Float64Array to\n * avoid circular goog.requires).\n *\n * @param {!goog.vec.vec3f.Type} vec The destination vector.\n * @param {Float64Array} src The source vector.\n * @return {!goog.vec.vec3f.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.setFromVec3d = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  vec[2] = src[2];\n  return vec;\n};\n\n\n/**\n * Initializes vec3f vec from Array src.\n *\n * @param {!goog.vec.vec3f.Type} vec The destination vector.\n * @param {Array<number>} src The source vector.\n * @return {!goog.vec.vec3f.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.setFromArray = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  vec[2] = src[2];\n  return vec;\n};\n\n\n/**\n * Performs a component-wise addition of vec0 and vec1 together storing the\n * result into resultVec.\n *\n * @param {!goog.vec.vec3f.Type} vec0 The first addend.\n * @param {!goog.vec.vec3f.Type} vec1 The second addend.\n * @param {!goog.vec.vec3f.Type} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.vec3f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.add = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] + vec1[0];\n  resultVec[1] = vec0[1] + vec1[1];\n  resultVec[2] = vec0[2] + vec1[2];\n  return resultVec;\n};\n\n\n/**\n * Performs a component-wise subtraction of vec1 from vec0 storing the\n * result into resultVec.\n *\n * @param {!goog.vec.vec3f.Type} vec0 The minuend.\n * @param {!goog.vec.vec3f.Type} vec1 The subtrahend.\n * @param {!goog.vec.vec3f.Type} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.vec3f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.subtract = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] - vec1[0];\n  resultVec[1] = vec0[1] - vec1[1];\n  resultVec[2] = vec0[2] - vec1[2];\n  return resultVec;\n};\n\n\n/**\n * Negates vec0, storing the result into resultVec.\n *\n * @param {!goog.vec.vec3f.Type} vec0 The vector to negate.\n * @param {!goog.vec.vec3f.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec3f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.negate = function(vec0, resultVec) {\n  resultVec[0] = -vec0[0];\n  resultVec[1] = -vec0[1];\n  resultVec[2] = -vec0[2];\n  return resultVec;\n};\n\n\n/**\n * Takes the absolute value of each component of vec0 storing the result in\n * resultVec.\n *\n * @param {!goog.vec.vec3f.Type} vec0 The source vector.\n * @param {!goog.vec.vec3f.Type} resultVec The vector to receive the result.\n *     May be vec0.\n * @return {!goog.vec.vec3f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.abs = function(vec0, resultVec) {\n  resultVec[0] = Math.abs(vec0[0]);\n  resultVec[1] = Math.abs(vec0[1]);\n  resultVec[2] = Math.abs(vec0[2]);\n  return resultVec;\n};\n\n\n/**\n * Multiplies each component of vec0 with scalar storing the product into\n * resultVec.\n *\n * @param {!goog.vec.vec3f.Type} vec0 The source vector.\n * @param {number} scalar The value to multiply with each component of vec0.\n * @param {!goog.vec.vec3f.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec3f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.scale = function(vec0, scalar, resultVec) {\n  resultVec[0] = vec0[0] * scalar;\n  resultVec[1] = vec0[1] * scalar;\n  resultVec[2] = vec0[2] * scalar;\n  return resultVec;\n};\n\n\n/**\n * Returns the magnitudeSquared of the given vector.\n *\n * @param {!goog.vec.vec3f.Type} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.vec3f.magnitudeSquared = function(vec0) {\n  var x = vec0[0], y = vec0[1], z = vec0[2];\n  return x * x + y * y + z * z;\n};\n\n\n/**\n * Returns the magnitude of the given vector.\n *\n * @param {!goog.vec.vec3f.Type} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.vec3f.magnitude = function(vec0) {\n  var x = vec0[0], y = vec0[1], z = vec0[2];\n  return Math.sqrt(x * x + y * y + z * z);\n};\n\n\n/**\n * Normalizes the given vector storing the result into resultVec.\n *\n * @param {!goog.vec.vec3f.Type} vec0 The vector to normalize.\n * @param {!goog.vec.vec3f.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec3f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.normalize = function(vec0, resultVec) {\n  var x = vec0[0], y = vec0[1], z = vec0[2];\n  var ilen = 1 / Math.sqrt(x * x + y * y + z * z);\n  resultVec[0] = x * ilen;\n  resultVec[1] = y * ilen;\n  resultVec[2] = z * ilen;\n  return resultVec;\n};\n\n\n/**\n * Returns the scalar product of vectors v0 and v1.\n *\n * @param {!goog.vec.vec3f.Type} v0 The first vector.\n * @param {!goog.vec.vec3f.Type} v1 The second vector.\n * @return {number} The scalar product.\n */\ngoog.vec.vec3f.dot = function(v0, v1) {\n  return v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2];\n};\n\n\n/**\n * Computes the vector (cross) product of v0 and v1 storing the result into\n * resultVec.\n *\n * @param {!goog.vec.vec3f.Type} v0 The first vector.\n * @param {!goog.vec.vec3f.Type} v1 The second vector.\n * @param {!goog.vec.vec3f.Type} resultVec The vector to receive the\n *     results. May be either v0 or v1.\n * @return {!goog.vec.vec3f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.cross = function(v0, v1, resultVec) {\n  var x0 = v0[0], y0 = v0[1], z0 = v0[2];\n  var x1 = v1[0], y1 = v1[1], z1 = v1[2];\n  resultVec[0] = y0 * z1 - z0 * y1;\n  resultVec[1] = z0 * x1 - x0 * z1;\n  resultVec[2] = x0 * y1 - y0 * x1;\n  return resultVec;\n};\n\n\n/**\n * Returns the squared distance between two points.\n *\n * @param {!goog.vec.vec3f.Type} vec0 First point.\n * @param {!goog.vec.vec3f.Type} vec1 Second point.\n * @return {number} The squared distance between the points.\n */\ngoog.vec.vec3f.distanceSquared = function(vec0, vec1) {\n  var x = vec0[0] - vec1[0];\n  var y = vec0[1] - vec1[1];\n  var z = vec0[2] - vec1[2];\n  return x * x + y * y + z * z;\n};\n\n\n/**\n * Returns the distance between two points.\n *\n * @param {!goog.vec.vec3f.Type} vec0 First point.\n * @param {!goog.vec.vec3f.Type} vec1 Second point.\n * @return {number} The distance between the points.\n */\ngoog.vec.vec3f.distance = function(vec0, vec1) {\n  return Math.sqrt(goog.vec.vec3f.distanceSquared(vec0, vec1));\n};\n\n\n/**\n * Returns a unit vector pointing from one point to another.\n * If the input points are equal then the result will be all zeros.\n *\n * @param {!goog.vec.vec3f.Type} vec0 Origin point.\n * @param {!goog.vec.vec3f.Type} vec1 Target point.\n * @param {!goog.vec.vec3f.Type} resultVec The vector to receive the\n *     results (may be vec0 or vec1).\n * @return {!goog.vec.vec3f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.direction = function(vec0, vec1, resultVec) {\n  var x = vec1[0] - vec0[0];\n  var y = vec1[1] - vec0[1];\n  var z = vec1[2] - vec0[2];\n  var d = Math.sqrt(x * x + y * y + z * z);\n  if (d) {\n    d = 1 / d;\n    resultVec[0] = x * d;\n    resultVec[1] = y * d;\n    resultVec[2] = z * d;\n  } else {\n    resultVec[0] = resultVec[1] = resultVec[2] = 0;\n  }\n  return resultVec;\n};\n\n\n/**\n * Linearly interpolate from vec0 to v1 according to f. The value of f should be\n * in the range [0..1] otherwise the results are undefined.\n *\n * @param {!goog.vec.vec3f.Type} v0 The first vector.\n * @param {!goog.vec.vec3f.Type} v1 The second vector.\n * @param {number} f The interpolation factor.\n * @param {!goog.vec.vec3f.Type} resultVec The vector to receive the\n *     results (may be v0 or v1).\n * @return {!goog.vec.vec3f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.lerp = function(v0, v1, f, resultVec) {\n  var x = v0[0], y = v0[1], z = v0[2];\n  resultVec[0] = (v1[0] - x) * f + x;\n  resultVec[1] = (v1[1] - y) * f + y;\n  resultVec[2] = (v1[2] - z) * f + z;\n  return resultVec;\n};\n\n\n/**\n * Perform a spherical linear interpolation from v0 to v1 according to f. The\n * value of f should be in the range [0..1] otherwise the results are undefined.\n *\n * Slerp is normally used to interpolate quaternions, but there is a geometric\n * formula for interpolating vectors directly, see \"Geometric Slerp\" in:\n * https://en.wikipedia.org/wiki/Slerp.\n *\n * This interpolates the vectors' directions via slerp, but linearly\n * interpolates the vectors' magnitudes.\n *\n * Results are undefined if v0 or v1 are of zero magnitude.\n *\n * @param {!goog.vec.vec3f.Type} v0 The first vector.\n * @param {!goog.vec.vec3f.Type} v1 The second vector.\n * @param {number} f The interpolation factor.\n * @param {!goog.vec.vec3f.Type} resultVec The vector to receive the\n *     results (may be v0 or v1).\n * @return {!goog.vec.vec3f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.slerp = function(v0, v1, f, resultVec) {\n  var v0Magnitude = goog.vec.vec3f.magnitude(v0);\n  var v1Magnitude = goog.vec.vec3f.magnitude(v1);\n\n  var cosAngle = goog.vec.vec3f.dot(v0, v1) / (v0Magnitude * v1Magnitude);\n\n  // If v0 and v1 are almost the same direction, fall back on a straight lerp.\n  if (cosAngle > 1 - goog.vec.EPSILON) {\n    return goog.vec.vec3f.lerp(v0, v1, f, resultVec);\n  }\n\n  var angle = 0;\n  var sinAngle = 0;\n\n  // If v0 and v1 are opposite directions, pick an arbitrary 'mid' vector that\n  // is perpendicular to both, and slerp from v0 -> mid -> v1.\n  if (cosAngle < -1 + goog.vec.EPSILON) {\n    var mid = goog.vec.vec3f.create();\n    var magnitudeFactor = (v0Magnitude + v1Magnitude) / 2;\n    if (v0[0]) {  // v0 not parallel to [0,0,1].\n      magnitudeFactor /= Math.sqrt(v0[0] * v0[0] + v0[1] + v0[1]);\n      mid[0] = -v0[1] * magnitudeFactor;\n      mid[1] = v0[0] * magnitudeFactor;\n      mid[2] = 0;\n    } else {  // v0 not parallel to [1,0,0].\n      magnitudeFactor /= Math.sqrt(v0[2] * v0[2] + v0[1] + v0[1]);\n      mid[0] = 0;\n      mid[1] = -v0[2] * magnitudeFactor;\n      mid[2] = v0[1] * magnitudeFactor;\n    }\n\n    // Depending on f, slerp between either v0 and mid, or mid and v1.\n    if (f <= 0.5) {\n      v1Magnitude = v0Magnitude;\n      v1 = mid;\n      f *= 2;\n    } else {\n      v0 = mid;\n      f = 2 * f - 1;\n    }\n\n    angle = Math.PI / 2;\n    cosAngle = 0;\n    sinAngle = 1;\n  } else {\n    angle = Math.acos(cosAngle);\n    sinAngle = Math.sqrt(1 - cosAngle * cosAngle);\n  }\n\n  var coeff0 = (Math.sin((1 - f) * angle) / sinAngle) / v0Magnitude;\n  var coeff1 = (Math.sin(f * angle) / sinAngle) / v1Magnitude;\n  var magnitude = (1 - f) * v0Magnitude + f * v1Magnitude;\n\n  resultVec[0] = (v0[0] * coeff0 + v1[0] * coeff1) * magnitude;\n  resultVec[1] = (v0[1] * coeff0 + v1[1] * coeff1) * magnitude;\n  resultVec[2] = (v0[2] * coeff0 + v1[2] * coeff1) * magnitude;\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the larger values in resultVec.\n *\n * @param {!goog.vec.vec3f.Type} vec0 The source vector.\n * @param {!goog.vec.vec3f.Type|number} limit The limit vector or scalar.\n * @param {!goog.vec.vec3f.Type} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.vec3f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.max = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.max(vec0[0], limit);\n    resultVec[1] = Math.max(vec0[1], limit);\n    resultVec[2] = Math.max(vec0[2], limit);\n  } else {\n    resultVec[0] = Math.max(vec0[0], limit[0]);\n    resultVec[1] = Math.max(vec0[1], limit[1]);\n    resultVec[2] = Math.max(vec0[2], limit[2]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the smaller values in resultVec.\n *\n * @param {!goog.vec.vec3f.Type} vec0 The source vector.\n * @param {!goog.vec.vec3f.Type|number} limit The limit vector or scalar.\n * @param {!goog.vec.vec3f.Type} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.vec3f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec3f.min = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.min(vec0[0], limit);\n    resultVec[1] = Math.min(vec0[1], limit);\n    resultVec[2] = Math.min(vec0[2], limit);\n  } else {\n    resultVec[0] = Math.min(vec0[0], limit[0]);\n    resultVec[1] = Math.min(vec0[1], limit[1]);\n    resultVec[2] = Math.min(vec0[2], limit[2]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Returns true if the components of v0 are equal to the components of v1.\n *\n * @param {!goog.vec.vec3f.Type} v0 The first vector.\n * @param {!goog.vec.vec3f.Type} v1 The second vector.\n * @return {boolean} True if the vectors are equal, false otherwise.\n */\ngoog.vec.vec3f.equals = function(v0, v1) {\n  return v0.length == v1.length && v0[0] == v1[0] && v0[1] == v1[1] &&\n      v0[2] == v1[2];\n};\n","^9I",1579837703000,"^9J",["^9K",["^;2","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/vec3f.js"],"^:1",["^9K",["~$goog.vec.vec3f.Type","~$goog.vec.vec3f"]],"^9<",true,"^9=",["^9>","^;2"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.imagelessbuttonrenderer.js","^9C",["^9D","goog/ui/imagelessbuttonrenderer.js"],"^9E","goog/ui/imagelessbuttonrenderer.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An alternative custom button renderer that uses even more CSS\n * voodoo than the default implementation to render custom buttons with fake\n * rounded corners and dimensionality (via a subtle flat shadow on the bottom\n * half of the button) without the use of images.\n *\n * Based on the Custom Buttons 3.1 visual specification, see\n * http://go/custombuttons\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/imagelessbutton.html\n */\n\ngoog.provide('goog.ui.ImagelessButtonRenderer');\n\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.ui.Button');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.CustomButtonRenderer');\ngoog.require('goog.ui.INLINE_BLOCK_CLASSNAME');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Custom renderer for {@link goog.ui.Button}s. Imageless buttons can contain\n * almost arbitrary HTML content, will flow like inline elements, but can be\n * styled like block-level elements.\n *\n * @deprecated These contain a lot of unnecessary DOM for modern user agents.\n *     Please use a simpler button renderer like css3buttonrenderer.\n * @constructor\n * @extends {goog.ui.CustomButtonRenderer}\n */\ngoog.ui.ImagelessButtonRenderer = function() {\n  goog.ui.CustomButtonRenderer.call(this);\n};\ngoog.inherits(goog.ui.ImagelessButtonRenderer, goog.ui.CustomButtonRenderer);\ngoog.addSingletonGetter(goog.ui.ImagelessButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.ImagelessButtonRenderer.CSS_CLASS =\n    goog.getCssName('goog-imageless-button');\n\n\n/**\n * Returns the button's contents wrapped in the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-imageless-button\">\n *      <div class=\"goog-inline-block goog-imageless-button-outer-box\">\n *        <div class=\"goog-imageless-button-inner-box\">\n *          <div class=\"goog-imageless-button-pos-box\">\n *            <div class=\"goog-imageless-button-top-shadow\">&nbsp;</div>\n *            <div class=\"goog-imageless-button-content\">Contents...</div>\n *          </div>\n *        </div>\n *      </div>\n *    </div>\n * @override\n */\ngoog.ui.ImagelessButtonRenderer.prototype.createDom;\n\n\n/** @override */\ngoog.ui.ImagelessButtonRenderer.prototype.getContentElement = function(\n    element) {\n  return /** @type {Element} */ (\n      element && element.firstChild && element.firstChild.firstChild &&\n      element.firstChild.firstChild.firstChild.lastChild);\n};\n\n\n/**\n * Takes a text caption or existing DOM structure, and returns the content\n * wrapped in a pseudo-rounded-corner box.  Creates the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-imageless-button-outer-box\">\n *      <div class=\"goog-inline-block goog-imageless-button-inner-box\">\n *        <div class=\"goog-imageless-button-pos\">\n *          <div class=\"goog-imageless-button-top-shadow\">&nbsp;</div>\n *          <div class=\"goog-imageless-button-content\">Contents...</div>\n *        </div>\n *      </div>\n *    </div>\n *\n * Used by both {@link #createDom} and {@link #decorate}.  To be overridden\n * by subclasses.\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to wrap\n *     in a box.\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {Element} Pseudo-rounded-corner box containing the content.\n * @override\n */\ngoog.ui.ImagelessButtonRenderer.prototype.createButton = function(\n    content, dom) {\n  var baseClass = this.getCssClass();\n  var inlineBlock = goog.ui.INLINE_BLOCK_CLASSNAME + ' ';\n  return dom.createDom(\n      goog.dom.TagName.DIV,\n      inlineBlock + goog.getCssName(baseClass, 'outer-box'),\n      dom.createDom(\n          goog.dom.TagName.DIV,\n          inlineBlock + goog.getCssName(baseClass, 'inner-box'),\n          dom.createDom(\n              goog.dom.TagName.DIV, goog.getCssName(baseClass, 'pos'),\n              dom.createDom(\n                  goog.dom.TagName.DIV,\n                  goog.getCssName(baseClass, 'top-shadow'), '\\u00A0'),\n              dom.createDom(\n                  goog.dom.TagName.DIV, goog.getCssName(baseClass, 'content'),\n                  content))));\n};\n\n\n/**\n * Check if the button's element has a box structure.\n * @param {goog.ui.Button} button Button instance whose structure is being\n *     checked.\n * @param {Element} element Element of the button.\n * @return {boolean} Whether the element has a box structure.\n * @protected\n * @override\n */\ngoog.ui.ImagelessButtonRenderer.prototype.hasBoxStructure = function(\n    button, element) {\n  var outer = button.getDomHelper().getFirstElementChild(element);\n  var outerClassName = goog.getCssName(this.getCssClass(), 'outer-box');\n  if (outer && goog.dom.classlist.contains(outer, outerClassName)) {\n    var inner = button.getDomHelper().getFirstElementChild(outer);\n    var innerClassName = goog.getCssName(this.getCssClass(), 'inner-box');\n    if (inner && goog.dom.classlist.contains(inner, innerClassName)) {\n      var pos = button.getDomHelper().getFirstElementChild(inner);\n      var posClassName = goog.getCssName(this.getCssClass(), 'pos');\n      if (pos && goog.dom.classlist.contains(pos, posClassName)) {\n        var shadow = button.getDomHelper().getFirstElementChild(pos);\n        var shadowClassName = goog.getCssName(this.getCssClass(), 'top-shadow');\n        if (shadow && goog.dom.classlist.contains(shadow, shadowClassName)) {\n          var content = button.getDomHelper().getNextElementSibling(shadow);\n          var contentClassName = goog.getCssName(this.getCssClass(), 'content');\n          if (content &&\n              goog.dom.classlist.contains(content, contentClassName)) {\n            // We have a proper box structure.\n            return true;\n          }\n        }\n      }\n    }\n  }\n  return false;\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.ImagelessButtonRenderer.prototype.getCssClass = function() {\n  return goog.ui.ImagelessButtonRenderer.CSS_CLASS;\n};\n\n\n// Register a decorator factory function for goog.ui.ImagelessButtonRenderer.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.ImagelessButtonRenderer.CSS_CLASS, function() {\n      return new goog.ui.Button(\n          null, goog.ui.ImagelessButtonRenderer.getInstance());\n    });\n\n\n// Register a decorator factory function for toggle buttons using the\n// goog.ui.ImagelessButtonRenderer.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.getCssName('goog-imageless-toggle-button'), function() {\n      var button = new goog.ui.Button(\n          null, goog.ui.ImagelessButtonRenderer.getInstance());\n      button.setSupportedState(goog.ui.Component.State.CHECKED, true);\n      return button;\n    });\n","^9I",1579837703000,"^9J",["^9K",["^:;","^:=","^9>","^:>","^GG","^JU","^GH","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/imagelessbuttonrenderer.js"],"^:1",["^9K",["~$goog.ui.ImagelessButtonRenderer"]],"^9<",true,"^9=",["^9>","^;=","^:;","^JU","^:=","^GG","^GH","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.useragent.useragent.js","^9C",["^9D","goog/useragent/useragent.js"],"^9E","goog/useragent/useragent.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Rendering engine detection.\n * @see <a href=\"http://www.useragentstring.com/\">User agent strings</a>\n * For information on the browser brand (such as Safari versus Chrome), see\n * goog.userAgent.product.\n * @author arv@google.com (Erik Arvidsson)\n * @see ../demos/useragent.html\n */\n\ngoog.provide('goog.userAgent');\n\ngoog.require('goog.labs.userAgent.browser');\ngoog.require('goog.labs.userAgent.engine');\ngoog.require('goog.labs.userAgent.platform');\ngoog.require('goog.labs.userAgent.util');\ngoog.require('goog.reflect');\ngoog.require('goog.string');\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the browser is IE.\n */\ngoog.userAgent.ASSUME_IE = goog.define('goog.userAgent.ASSUME_IE', false);\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the browser is EDGE,\n * referring to EdgeHTML based Edge.\n */\ngoog.userAgent.ASSUME_EDGE = goog.define('goog.userAgent.ASSUME_EDGE', false);\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the browser is GECKO.\n */\ngoog.userAgent.ASSUME_GECKO = goog.define('goog.userAgent.ASSUME_GECKO', false);\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the browser is WEBKIT.\n */\ngoog.userAgent.ASSUME_WEBKIT =\n    goog.define('goog.userAgent.ASSUME_WEBKIT', false);\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the browser is a\n *     mobile device running WebKit e.g. iPhone or Android.\n */\ngoog.userAgent.ASSUME_MOBILE_WEBKIT =\n    goog.define('goog.userAgent.ASSUME_MOBILE_WEBKIT', false);\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the browser is OPERA,\n * referring to Presto-based Opera.\n */\ngoog.userAgent.ASSUME_OPERA = goog.define('goog.userAgent.ASSUME_OPERA', false);\n\n\n/**\n * @define {boolean} Whether the\n *     `goog.userAgent.isVersionOrHigher`\n *     function will return true for any version.\n */\ngoog.userAgent.ASSUME_ANY_VERSION =\n    goog.define('goog.userAgent.ASSUME_ANY_VERSION', false);\n\n\n/**\n * Whether we know the browser engine at compile-time.\n * @type {boolean}\n * @private\n */\ngoog.userAgent.BROWSER_KNOWN_ = goog.userAgent.ASSUME_IE ||\n    goog.userAgent.ASSUME_EDGE || goog.userAgent.ASSUME_GECKO ||\n    goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.ASSUME_WEBKIT ||\n    goog.userAgent.ASSUME_OPERA;\n\n\n/**\n * Returns the userAgent string for the current browser.\n *\n * @return {string} The userAgent string.\n */\ngoog.userAgent.getUserAgentString = function() {\n  return goog.labs.userAgent.util.getUserAgent();\n};\n\n\n/**\n * @return {?Navigator} The native navigator object.\n */\ngoog.userAgent.getNavigatorTyped = function() {\n  // Need a local navigator reference instead of using the global one,\n  // to avoid the rare case where they reference different objects.\n  // (in a WorkerPool, for example).\n  return goog.global['navigator'] || null;\n};\n\n\n/**\n * TODO(nnaze): Change type to \"Navigator\" and update compilation targets.\n * @return {?Object} The native navigator object.\n */\ngoog.userAgent.getNavigator = function() {\n  return goog.userAgent.getNavigatorTyped();\n};\n\n\n/**\n * Whether the user agent is Presto-based Opera.\n * @type {boolean}\n */\ngoog.userAgent.OPERA = goog.userAgent.BROWSER_KNOWN_ ?\n    goog.userAgent.ASSUME_OPERA :\n    goog.labs.userAgent.browser.isOpera();\n\n\n/**\n * Whether the user agent is Internet Explorer.\n * @type {boolean}\n */\ngoog.userAgent.IE = goog.userAgent.BROWSER_KNOWN_ ?\n    goog.userAgent.ASSUME_IE :\n    goog.labs.userAgent.browser.isIE();\n\n\n/**\n * Whether the user agent is Microsoft Edge (EdgeHTML based).\n * @type {boolean}\n */\ngoog.userAgent.EDGE = goog.userAgent.BROWSER_KNOWN_ ?\n    goog.userAgent.ASSUME_EDGE :\n    goog.labs.userAgent.engine.isEdge();\n\n\n/**\n * Whether the user agent is MS Internet Explorer or MS Edge (EdgeHTML based).\n * @type {boolean}\n */\ngoog.userAgent.EDGE_OR_IE = goog.userAgent.EDGE || goog.userAgent.IE;\n\n\n/**\n * Whether the user agent is Gecko. Gecko is the rendering engine used by\n * Mozilla, Firefox, and others.\n * @type {boolean}\n */\ngoog.userAgent.GECKO = goog.userAgent.BROWSER_KNOWN_ ?\n    goog.userAgent.ASSUME_GECKO :\n    goog.labs.userAgent.engine.isGecko();\n\n\n/**\n * Whether the user agent is WebKit. WebKit is the rendering engine that\n * Safari, Edge Chromium, Opera Chromium, Android and others use.\n * @type {boolean}\n */\ngoog.userAgent.WEBKIT = goog.userAgent.BROWSER_KNOWN_ ?\n    goog.userAgent.ASSUME_WEBKIT || goog.userAgent.ASSUME_MOBILE_WEBKIT :\n    goog.labs.userAgent.engine.isWebKit();\n\n\n/**\n * Whether the user agent is running on a mobile device.\n *\n * This is a separate function so that the logic can be tested.\n *\n * TODO(nnaze): Investigate swapping in goog.labs.userAgent.device.isMobile().\n *\n * @return {boolean} Whether the user agent is running on a mobile device.\n * @private\n */\ngoog.userAgent.isMobile_ = function() {\n  return goog.userAgent.WEBKIT &&\n      goog.labs.userAgent.util.matchUserAgent('Mobile');\n};\n\n\n/**\n * Whether the user agent is running on a mobile device.\n *\n * TODO(nnaze): Consider deprecating MOBILE when labs.userAgent\n *   is promoted as the gecko/webkit logic is likely inaccurate.\n *\n * @type {boolean}\n */\ngoog.userAgent.MOBILE =\n    goog.userAgent.ASSUME_MOBILE_WEBKIT || goog.userAgent.isMobile_();\n\n\n/**\n * Used while transitioning code to use WEBKIT instead.\n * @type {boolean}\n * @deprecated Use {@link goog.userAgent.product.SAFARI} instead.\n * TODO(nicksantos): Delete this from goog.userAgent.\n */\ngoog.userAgent.SAFARI = goog.userAgent.WEBKIT;\n\n\n/**\n * @return {string} the platform (operating system) the user agent is running\n *     on. Default to empty string because navigator.platform may not be defined\n *     (on Rhino, for example).\n * @private\n */\ngoog.userAgent.determinePlatform_ = function() {\n  var navigator = goog.userAgent.getNavigatorTyped();\n  return navigator && navigator.platform || '';\n};\n\n\n/**\n * The platform (operating system) the user agent is running on. Default to\n * empty string because navigator.platform may not be defined (on Rhino, for\n * example).\n * @type {string}\n */\ngoog.userAgent.PLATFORM = goog.userAgent.determinePlatform_();\n\n\n/**\n * @define {boolean} Whether the user agent is running on a Macintosh operating\n *     system.\n */\ngoog.userAgent.ASSUME_MAC = goog.define('goog.userAgent.ASSUME_MAC', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on a Windows operating\n *     system.\n */\ngoog.userAgent.ASSUME_WINDOWS =\n    goog.define('goog.userAgent.ASSUME_WINDOWS', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on a Linux operating\n *     system.\n */\ngoog.userAgent.ASSUME_LINUX = goog.define('goog.userAgent.ASSUME_LINUX', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on a X11 windowing\n *     system.\n */\ngoog.userAgent.ASSUME_X11 = goog.define('goog.userAgent.ASSUME_X11', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on Android.\n */\ngoog.userAgent.ASSUME_ANDROID =\n    goog.define('goog.userAgent.ASSUME_ANDROID', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on an iPhone.\n */\ngoog.userAgent.ASSUME_IPHONE =\n    goog.define('goog.userAgent.ASSUME_IPHONE', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on an iPad.\n */\ngoog.userAgent.ASSUME_IPAD = goog.define('goog.userAgent.ASSUME_IPAD', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on an iPod.\n */\ngoog.userAgent.ASSUME_IPOD = goog.define('goog.userAgent.ASSUME_IPOD', false);\n\n\n/**\n * @define {boolean} Whether the user agent is running on KaiOS.\n */\ngoog.userAgent.ASSUME_KAIOS = goog.define('goog.userAgent.ASSUME_KAIOS', false);\n\n/**\n * @define {boolean} Whether the user agent is running on Go2Phone.\n */\ngoog.userAgent.ASSUME_GO2PHONE =\n    goog.define('goog.userAgent.ASSUME_GO2PHONE', false);\n\n\n/**\n * @type {boolean}\n * @private\n */\ngoog.userAgent.PLATFORM_KNOWN_ = goog.userAgent.ASSUME_MAC ||\n    goog.userAgent.ASSUME_WINDOWS || goog.userAgent.ASSUME_LINUX ||\n    goog.userAgent.ASSUME_X11 || goog.userAgent.ASSUME_ANDROID ||\n    goog.userAgent.ASSUME_IPHONE || goog.userAgent.ASSUME_IPAD ||\n    goog.userAgent.ASSUME_IPOD;\n\n\n/**\n * Whether the user agent is running on a Macintosh operating system.\n * @type {boolean}\n */\ngoog.userAgent.MAC = goog.userAgent.PLATFORM_KNOWN_ ?\n    goog.userAgent.ASSUME_MAC :\n    goog.labs.userAgent.platform.isMacintosh();\n\n\n/**\n * Whether the user agent is running on a Windows operating system.\n * @type {boolean}\n */\ngoog.userAgent.WINDOWS = goog.userAgent.PLATFORM_KNOWN_ ?\n    goog.userAgent.ASSUME_WINDOWS :\n    goog.labs.userAgent.platform.isWindows();\n\n\n/**\n * Whether the user agent is Linux per the legacy behavior of\n * goog.userAgent.LINUX, which considered ChromeOS to also be\n * Linux.\n * @return {boolean}\n * @private\n */\ngoog.userAgent.isLegacyLinux_ = function() {\n  return goog.labs.userAgent.platform.isLinux() ||\n      goog.labs.userAgent.platform.isChromeOS();\n};\n\n\n/**\n * Whether the user agent is running on a Linux operating system.\n *\n * Note that goog.userAgent.LINUX considers ChromeOS to be Linux,\n * while goog.labs.userAgent.platform considers ChromeOS and\n * Linux to be different OSes.\n *\n * @type {boolean}\n */\ngoog.userAgent.LINUX = goog.userAgent.PLATFORM_KNOWN_ ?\n    goog.userAgent.ASSUME_LINUX :\n    goog.userAgent.isLegacyLinux_();\n\n\n/**\n * @return {boolean} Whether the user agent is an X11 windowing system.\n * @private\n */\ngoog.userAgent.isX11_ = function() {\n  var navigator = goog.userAgent.getNavigatorTyped();\n  return !!navigator &&\n      goog.string.contains(navigator['appVersion'] || '', 'X11');\n};\n\n\n/**\n * Whether the user agent is running on a X11 windowing system.\n * @type {boolean}\n */\ngoog.userAgent.X11 = goog.userAgent.PLATFORM_KNOWN_ ?\n    goog.userAgent.ASSUME_X11 :\n    goog.userAgent.isX11_();\n\n\n/**\n * Whether the user agent is running on Android.\n * @type {boolean}\n */\ngoog.userAgent.ANDROID = goog.userAgent.PLATFORM_KNOWN_ ?\n    goog.userAgent.ASSUME_ANDROID :\n    goog.labs.userAgent.platform.isAndroid();\n\n\n/**\n * Whether the user agent is running on an iPhone.\n * @type {boolean}\n */\ngoog.userAgent.IPHONE = goog.userAgent.PLATFORM_KNOWN_ ?\n    goog.userAgent.ASSUME_IPHONE :\n    goog.labs.userAgent.platform.isIphone();\n\n\n/**\n * Whether the user agent is running on an iPad.\n * @type {boolean}\n */\ngoog.userAgent.IPAD = goog.userAgent.PLATFORM_KNOWN_ ?\n    goog.userAgent.ASSUME_IPAD :\n    goog.labs.userAgent.platform.isIpad();\n\n\n/**\n * Whether the user agent is running on an iPod.\n * @type {boolean}\n */\ngoog.userAgent.IPOD = goog.userAgent.PLATFORM_KNOWN_ ?\n    goog.userAgent.ASSUME_IPOD :\n    goog.labs.userAgent.platform.isIpod();\n\n\n/**\n * Whether the user agent is running on iOS.\n * @type {boolean}\n */\ngoog.userAgent.IOS = goog.userAgent.PLATFORM_KNOWN_ ?\n    (goog.userAgent.ASSUME_IPHONE || goog.userAgent.ASSUME_IPAD ||\n     goog.userAgent.ASSUME_IPOD) :\n    goog.labs.userAgent.platform.isIos();\n\n/**\n * Whether the user agent is running on KaiOS.\n * @type {boolean}\n */\ngoog.userAgent.KAIOS = goog.userAgent.PLATFORM_KNOWN_ ?\n    goog.userAgent.ASSUME_KAIOS :\n    goog.labs.userAgent.platform.isKaiOS();\n\n/**\n * Whether the user agent is running on Go2Phone.\n * @type {boolean}\n */\ngoog.userAgent.GO2PHONE = goog.userAgent.PLATFORM_KNOWN_ ?\n    goog.userAgent.ASSUME_GO2PHONE :\n    goog.labs.userAgent.platform.isGo2Phone();\n\n\n/**\n * @return {string} The string that describes the version number of the user\n *     agent.\n * @private\n */\ngoog.userAgent.determineVersion_ = function() {\n  // All browsers have different ways to detect the version and they all have\n  // different naming schemes.\n  // version is a string rather than a number because it may contain 'b', 'a',\n  // and so on.\n  var version = '';\n  var arr = goog.userAgent.getVersionRegexResult_();\n  if (arr) {\n    version = arr ? arr[1] : '';\n  }\n\n  if (goog.userAgent.IE) {\n    // IE9 can be in document mode 9 but be reporting an inconsistent user agent\n    // version.  If it is identifying as a version lower than 9 we take the\n    // documentMode as the version instead.  IE8 has similar behavior.\n    // It is recommended to set the X-UA-Compatible header to ensure that IE9\n    // uses documentMode 9.\n    var docMode = goog.userAgent.getDocumentMode_();\n    if (docMode != null && docMode > parseFloat(version)) {\n      return String(docMode);\n    }\n  }\n\n  return version;\n};\n\n\n/**\n * @return {?IArrayLike<string>|undefined} The version regex matches from\n *     parsing the user\n *     agent string. These regex statements must be executed inline so they can\n *     be compiled out by the closure compiler with the rest of the useragent\n *     detection logic when ASSUME_* is specified.\n * @private\n */\ngoog.userAgent.getVersionRegexResult_ = function() {\n  var userAgent = goog.userAgent.getUserAgentString();\n  if (goog.userAgent.GECKO) {\n    return /rv\\:([^\\);]+)(\\)|;)/.exec(userAgent);\n  }\n  if (goog.userAgent.EDGE) {\n    return /Edge\\/([\\d\\.]+)/.exec(userAgent);\n  }\n  if (goog.userAgent.IE) {\n    return /\\b(?:MSIE|rv)[: ]([^\\);]+)(\\)|;)/.exec(userAgent);\n  }\n  if (goog.userAgent.WEBKIT) {\n    // WebKit/125.4\n    return /WebKit\\/(\\S+)/.exec(userAgent);\n  }\n  if (goog.userAgent.OPERA) {\n    // If none of the above browsers were detected but the browser is Opera, the\n    // only string that is of interest is 'Version/<number>'.\n    return /(?:Version)[ \\/]?(\\S+)/.exec(userAgent);\n  }\n  return undefined;\n};\n\n\n/**\n * @return {number|undefined} Returns the document mode (for testing).\n * @private\n */\ngoog.userAgent.getDocumentMode_ = function() {\n  // NOTE(user): goog.userAgent may be used in context where there is no DOM.\n  var doc = goog.global['document'];\n  return doc ? doc['documentMode'] : undefined;\n};\n\n\n/**\n * The version of the user agent. This is a string because it might contain\n * 'b' (as in beta) as well as multiple dots.\n * @type {string}\n */\ngoog.userAgent.VERSION = goog.userAgent.determineVersion_();\n\n\n/**\n * Compares two version numbers.\n *\n * @param {string} v1 Version of first item.\n * @param {string} v2 Version of second item.\n *\n * @return {number}  1 if first argument is higher\n *                   0 if arguments are equal\n *                  -1 if second argument is higher.\n * @deprecated Use goog.string.compareVersions.\n */\ngoog.userAgent.compare = function(v1, v2) {\n  return goog.string.compareVersions(v1, v2);\n};\n\n\n/**\n * Cache for {@link goog.userAgent.isVersionOrHigher}.\n * Calls to compareVersions are surprisingly expensive and, as a browser's\n * version number is unlikely to change during a session, we cache the results.\n * @const\n * @private\n */\ngoog.userAgent.isVersionOrHigherCache_ = {};\n\n\n/**\n * Whether the user agent version is higher or the same as the given version.\n * NOTE: When checking the version numbers for Firefox and Safari, be sure to\n * use the engine's version, not the browser's version number.  For example,\n * Firefox 3.0 corresponds to Gecko 1.9 and Safari 3.0 to Webkit 522.11.\n * Opera and Internet Explorer versions match the product release number.<br>\n * @see <a href=\"http://en.wikipedia.org/wiki/Safari_version_history\">\n *     Webkit</a>\n * @see <a href=\"http://en.wikipedia.org/wiki/Gecko_engine\">Gecko</a>\n *\n * @param {string|number} version The version to check.\n * @return {boolean} Whether the user agent version is higher or the same as\n *     the given version.\n */\ngoog.userAgent.isVersionOrHigher = function(version) {\n  return goog.userAgent.ASSUME_ANY_VERSION ||\n      goog.reflect.cache(\n          goog.userAgent.isVersionOrHigherCache_, version, function() {\n            return goog.string.compareVersions(\n                       goog.userAgent.VERSION, version) >= 0;\n          });\n};\n\n\n/**\n * Deprecated alias to `goog.userAgent.isVersionOrHigher`.\n * @param {string|number} version The version to check.\n * @return {boolean} Whether the user agent version is higher or the same as\n *     the given version.\n * @deprecated Use goog.userAgent.isVersionOrHigher().\n */\ngoog.userAgent.isVersion = goog.userAgent.isVersionOrHigher;\n\n\n/**\n * Whether the IE effective document mode is higher or the same as the given\n * document mode version.\n * NOTE: Only for IE, return false for another browser.\n *\n * @param {number} documentMode The document mode version to check.\n * @return {boolean} Whether the IE effective document mode is higher or the\n *     same as the given version.\n */\ngoog.userAgent.isDocumentModeOrHigher = function(documentMode) {\n  return Number(goog.userAgent.DOCUMENT_MODE) >= documentMode;\n};\n\n\n/**\n * Deprecated alias to `goog.userAgent.isDocumentModeOrHigher`.\n * @param {number} version The version to check.\n * @return {boolean} Whether the IE effective document mode is higher or the\n *      same as the given version.\n * @deprecated Use goog.userAgent.isDocumentModeOrHigher().\n */\ngoog.userAgent.isDocumentMode = goog.userAgent.isDocumentModeOrHigher;\n\n\n/**\n * For IE version < 7, documentMode is undefined, so attempt to use the\n * CSS1Compat property to see if we are in standards mode. If we are in\n * standards mode, treat the browser version as the document mode. Otherwise,\n * IE is emulating version 5.\n *\n * NOTE(2019/05/31): Support for IE < 7 is long gone, so this is now simplified.\n * It returns document.documentMode for IE and undefined for everything else.\n *\n * @type {number|undefined}\n * @const\n */\ngoog.userAgent.DOCUMENT_MODE = (function() {\n  var doc = goog.global['document'];\n  if (!doc || !goog.userAgent.IE) {\n    return undefined;\n  }\n  return goog.userAgent.getDocumentMode_();\n})();\n","^9I",1579837703000,"^9J",["^9K",["^;E","^9L","^9>","~$goog.labs.userAgent.platform","~$goog.labs.userAgent.engine","^GU","~$goog.labs.userAgent.util"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/useragent/useragent.js"],"^:1",["^9K",["^:S"]],"^9<",true,"^9=",["^9>","^GU","^S2","^S1","^S3","^;E","^9L"]],["^ ","^9A",[1579837703000],"^9B","goog.structs.quadtree.js","^9C",["^9D","goog/structs/quadtree.js"],"^9E","goog/structs/quadtree.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Datastructure: A point Quad Tree for representing 2D data. Each\n * region has the same ratio as the bounds for the tree.\n *\n * The implementation currently requires pre-determined bounds for data as it\n * can not rebalance itself to that degree.\n *\n * @see ../demos/quadtree.html\n */\n\n\ngoog.provide('goog.structs.QuadTree');\ngoog.provide('goog.structs.QuadTree.Node');\ngoog.provide('goog.structs.QuadTree.Point');\n\ngoog.require('goog.math.Coordinate');\n\n\n\n/**\n * Constructs a new quad tree.\n * @param {number} minX Minimum x-value that can be held in tree.\n * @param {number} minY Minimum y-value that can be held in tree.\n * @param {number} maxX Maximum x-value that can be held in tree.\n * @param {number} maxY Maximum y-value that can be held in tree.\n * @constructor\n * @final\n */\ngoog.structs.QuadTree = function(minX, minY, maxX, maxY) {\n  /**\n   * Count of the number of items in the tree.\n   * @private {number}\n   */\n  this.count_ = 0;\n\n  /**\n   * The root node for the quad tree.\n   * @private {goog.structs.QuadTree.Node}\n   */\n  this.root_ =\n      new goog.structs.QuadTree.Node(minX, minY, maxX - minX, maxY - minY);\n};\n\n\n/**\n * Returns a reference to the tree's root node.  Callers shouldn't modify nodes,\n * directly.  This is a convenience for visualization and debugging purposes.\n * @return {goog.structs.QuadTree.Node} The root node.\n */\ngoog.structs.QuadTree.prototype.getRootNode = function() {\n  return this.root_;\n};\n\n\n/**\n * Sets the value of an (x, y) point within the quad-tree.\n * @param {number} x The x-coordinate.\n * @param {number} y The y-coordinate.\n * @param {*} value The value associated with the point.\n */\ngoog.structs.QuadTree.prototype.set = function(x, y, value) {\n  var root = this.root_;\n  if (x < root.x || y < root.y || x > root.x + root.w || y > root.y + root.h) {\n    throw new Error('Out of bounds : (' + x + ', ' + y + ')');\n  }\n  if (this.insert_(root, new goog.structs.QuadTree.Point(x, y, value))) {\n    this.count_++;\n  }\n};\n\n\n/**\n * Gets the value of the point at (x, y) or null if the point is empty.\n * @param {number} x The x-coordinate.\n * @param {number} y The y-coordinate.\n * @param {*=} opt_default The default value to return if the node doesn't\n *     exist.\n * @return {*} The value of the node, the default value if the node\n *     doesn't exist, or undefined if the node doesn't exist and no default\n *     has been provided.\n */\ngoog.structs.QuadTree.prototype.get = function(x, y, opt_default) {\n  var node = this.find_(this.root_, x, y);\n  return node ? node.point.value : opt_default;\n};\n\n\n/**\n * Removes a point from (x, y) if it exists.\n * @param {number} x The x-coordinate.\n * @param {number} y The y-coordinate.\n * @return {*} The value of the node that was removed, or null if the\n *     node doesn't exist.\n */\ngoog.structs.QuadTree.prototype.remove = function(x, y) {\n  var node = this.find_(this.root_, x, y);\n  if (node) {\n    var value = node.point.value;\n    node.point = null;\n    node.nodeType = goog.structs.QuadTree.NodeType.EMPTY;\n    this.balance_(node);\n    this.count_--;\n    return value;\n  } else {\n    return null;\n  }\n};\n\n\n/**\n * Returns true if the point at (x, y) exists in the tree.\n * @param {number} x The x-coordinate.\n * @param {number} y The y-coordinate.\n * @return {boolean} Whether the tree contains a point at (x, y).\n */\ngoog.structs.QuadTree.prototype.contains = function(x, y) {\n  return this.get(x, y) != null;\n};\n\n\n/**\n * @return {boolean} Whether the tree is empty.\n */\ngoog.structs.QuadTree.prototype.isEmpty = function() {\n  return this.root_.nodeType == goog.structs.QuadTree.NodeType.EMPTY;\n};\n\n\n/**\n * @return {number} The number of items in the tree.\n */\ngoog.structs.QuadTree.prototype.getCount = function() {\n  return this.count_;\n};\n\n\n/**\n * Removes all items from the tree.\n */\ngoog.structs.QuadTree.prototype.clear = function() {\n  this.root_.nw = this.root_.ne = this.root_.sw = this.root_.se = null;\n  this.root_.nodeType = goog.structs.QuadTree.NodeType.EMPTY;\n  this.root_.point = null;\n  this.count_ = 0;\n};\n\n\n/**\n * Returns an array containing the coordinates of each point stored in the tree.\n * @return {!Array<goog.math.Coordinate?>} Array of coordinates.\n */\ngoog.structs.QuadTree.prototype.getKeys = function() {\n  var arr = [];\n  this.traverse_(this.root_, function(node) {\n    arr.push(new goog.math.Coordinate(node.point.x, node.point.y));\n  });\n  return arr;\n};\n\n\n/**\n * Returns an array containing all values stored within the tree.\n * @return {!Array<Object>} The values stored within the tree.\n */\ngoog.structs.QuadTree.prototype.getValues = function() {\n  var arr = [];\n  this.traverse_(this.root_, function(node) {\n    // Must have a point because it's a leaf.\n    arr.push(node.point.value);\n  });\n  return arr;\n};\n\n\n/**\n * Clones the quad-tree and returns the new instance.\n * @return {!goog.structs.QuadTree} A clone of the tree.\n */\ngoog.structs.QuadTree.prototype.clone = function() {\n  var x1 = this.root_.x;\n  var y1 = this.root_.y;\n  var x2 = x1 + this.root_.w;\n  var y2 = y1 + this.root_.h;\n  var clone = new goog.structs.QuadTree(x1, y1, x2, y2);\n  // This is inefficient as the clone needs to recalculate the structure of the\n  // tree, even though we know it already.  But this is easier and can be\n  // optimized when/if needed.\n  this.traverse_(this.root_, function(node) {\n    clone.set(node.point.x, node.point.y, node.point.value);\n  });\n  return clone;\n};\n\n\n/**\n * Traverses the tree and calls a function on each node.\n * @param {function(?, goog.math.Coordinate, goog.structs.QuadTree)} fn\n *     The function to call for every value. This function takes 3 arguments\n *     (the value, the coordinate, and the tree itself) and the return value is\n *     irrelevant.\n * @param {Object=} opt_obj The object to be used as the value of 'this'\n *     within {@ code fn}.\n */\ngoog.structs.QuadTree.prototype.forEach = function(fn, opt_obj) {\n  this.traverse_(this.root_, function(node) {\n    var coord = new goog.math.Coordinate(node.point.x, node.point.y);\n    fn.call(opt_obj, node.point.value, coord, this);\n  });\n};\n\n\n/**\n * Traverses the tree depth-first, with quadrants being traversed in clockwise\n * order (NE, SE, SW, NW).  The provided function will be called for each\n * leaf node that is encountered.\n * @param {goog.structs.QuadTree.Node} node The current node.\n * @param {function(this:goog.structs.QuadTree, goog.structs.QuadTree.Node)} fn\n *     The function to call for each leaf node. This function takes the node as\n *     an argument, and its return value is irrelevant.\n * @private\n */\ngoog.structs.QuadTree.prototype.traverse_ = function(node, fn) {\n  switch (node.nodeType) {\n    case goog.structs.QuadTree.NodeType.LEAF:\n      fn.call(this, node);\n      break;\n\n    case goog.structs.QuadTree.NodeType.POINTER:\n      this.traverse_(node.ne, fn);\n      this.traverse_(node.se, fn);\n      this.traverse_(node.sw, fn);\n      this.traverse_(node.nw, fn);\n      break;\n  }\n};\n\n\n/**\n * Finds a leaf node with the same (x, y) coordinates as the target point, or\n * null if no point exists.\n * @param {goog.structs.QuadTree.Node} node The node to search in.\n * @param {number} x The x-coordinate of the point to search for.\n * @param {number} y The y-coordinate of the point to search for.\n * @return {goog.structs.QuadTree.Node} The leaf node that matches the target,\n *     or null if it doesn't exist.\n * @private\n */\ngoog.structs.QuadTree.prototype.find_ = function(node, x, y) {\n  switch (node.nodeType) {\n    case goog.structs.QuadTree.NodeType.EMPTY:\n      return null;\n\n    case goog.structs.QuadTree.NodeType.LEAF:\n      return node.point.x == x && node.point.y == y ? node : null;\n\n    case goog.structs.QuadTree.NodeType.POINTER:\n      return this.find_(this.getQuadrantForPoint_(node, x, y), x, y);\n\n    default:\n      throw new Error('Invalid nodeType');\n  }\n};\n\n\n/**\n * Inserts a point into the tree, updating the tree's structure if necessary.\n * @param {goog.structs.QuadTree.Node} parent The parent to insert the point\n *     into.\n * @param {goog.structs.QuadTree.Point} point The point to insert.\n * @return {boolean} True if a new node was added to the tree; False if a node\n *     already existed with the correpsonding coordinates and had its value\n *     reset.\n * @private\n */\ngoog.structs.QuadTree.prototype.insert_ = function(parent, point) {\n  switch (parent.nodeType) {\n    case goog.structs.QuadTree.NodeType.EMPTY:\n      this.setPointForNode_(parent, point);\n      return true;\n\n    case goog.structs.QuadTree.NodeType.LEAF:\n      if (parent.point.x == point.x && parent.point.y == point.y) {\n        this.setPointForNode_(parent, point);\n        return false;\n      } else {\n        this.split_(parent);\n        return this.insert_(parent, point);\n      }\n\n    case goog.structs.QuadTree.NodeType.POINTER:\n      return this.insert_(\n          this.getQuadrantForPoint_(parent, point.x, point.y), point);\n\n    default:\n      throw new Error('Invalid nodeType in parent');\n  }\n};\n\n\n/**\n * Converts a leaf node to a pointer node and reinserts the node's point into\n * the correct child.\n * @param {goog.structs.QuadTree.Node} node The node to split.\n * @private\n */\ngoog.structs.QuadTree.prototype.split_ = function(node) {\n  var oldPoint = node.point;\n  node.point = null;\n\n  node.nodeType = goog.structs.QuadTree.NodeType.POINTER;\n\n  var x = node.x;\n  var y = node.y;\n  var hw = node.w / 2;\n  var hh = node.h / 2;\n\n  node.nw = new goog.structs.QuadTree.Node(x, y, hw, hh, node);\n  node.ne = new goog.structs.QuadTree.Node(x + hw, y, hw, hh, node);\n  node.sw = new goog.structs.QuadTree.Node(x, y + hh, hw, hh, node);\n  node.se = new goog.structs.QuadTree.Node(x + hw, y + hh, hw, hh, node);\n\n  this.insert_(node, oldPoint);\n};\n\n\n/**\n * Attempts to balance a node. A node will need balancing if all its children\n * are empty or it contains just one leaf.\n * @param {goog.structs.QuadTree.Node} node The node to balance.\n * @private\n */\ngoog.structs.QuadTree.prototype.balance_ = function(node) {\n  switch (node.nodeType) {\n    case goog.structs.QuadTree.NodeType.EMPTY:\n    case goog.structs.QuadTree.NodeType.LEAF:\n      if (node.parent) {\n        this.balance_(node.parent);\n      }\n      break;\n\n    case goog.structs.QuadTree.NodeType.POINTER:\n      var nw = node.nw, ne = node.ne, sw = node.sw, se = node.se;\n      var firstLeaf = null;\n\n      // Look for the first non-empty child, if there is more than one then we\n      // break as this node can't be balanced.\n      if (nw.nodeType != goog.structs.QuadTree.NodeType.EMPTY) {\n        firstLeaf = nw;\n      }\n      if (ne.nodeType != goog.structs.QuadTree.NodeType.EMPTY) {\n        if (firstLeaf) {\n          break;\n        }\n        firstLeaf = ne;\n      }\n      if (sw.nodeType != goog.structs.QuadTree.NodeType.EMPTY) {\n        if (firstLeaf) {\n          break;\n        }\n        firstLeaf = sw;\n      }\n      if (se.nodeType != goog.structs.QuadTree.NodeType.EMPTY) {\n        if (firstLeaf) {\n          break;\n        }\n        firstLeaf = se;\n      }\n\n      if (!firstLeaf) {\n        // All child nodes are empty: so make this node empty.\n        node.nodeType = goog.structs.QuadTree.NodeType.EMPTY;\n        node.nw = node.ne = node.sw = node.se = null;\n\n      } else if (firstLeaf.nodeType == goog.structs.QuadTree.NodeType.POINTER) {\n        // Only child was a pointer, therefore we can't rebalance.\n        break;\n\n      } else {\n        // Only child was a leaf: so update node's point and make it a leaf.\n        node.nodeType = goog.structs.QuadTree.NodeType.LEAF;\n        node.nw = node.ne = node.sw = node.se = null;\n        node.point = firstLeaf.point;\n      }\n\n      // Try and balance the parent as well.\n      if (node.parent) {\n        this.balance_(node.parent);\n      }\n\n      break;\n  }\n};\n\n\n/**\n * Returns the child quadrant within a node that contains the given (x, y)\n * coordinate.\n * @param {goog.structs.QuadTree.Node} parent The node.\n * @param {number} x The x-coordinate to look for.\n * @param {number} y The y-coordinate to look for.\n * @return {goog.structs.QuadTree.Node} The child quadrant that contains the\n *     point.\n * @private\n */\ngoog.structs.QuadTree.prototype.getQuadrantForPoint_ = function(parent, x, y) {\n  var mx = parent.x + parent.w / 2;\n  var my = parent.y + parent.h / 2;\n  if (x < mx) {\n    return y < my ? parent.nw : parent.sw;\n  } else {\n    return y < my ? parent.ne : parent.se;\n  }\n};\n\n\n/**\n * Sets the point for a node, as long as the node is a leaf or empty.\n * @param {goog.structs.QuadTree.Node} node The node to set the point for.\n * @param {goog.structs.QuadTree.Point} point The point to set.\n * @private\n */\ngoog.structs.QuadTree.prototype.setPointForNode_ = function(node, point) {\n  if (node.nodeType == goog.structs.QuadTree.NodeType.POINTER) {\n    throw new Error('Can not set point for node of type POINTER');\n  }\n  node.nodeType = goog.structs.QuadTree.NodeType.LEAF;\n  node.point = point;\n};\n\n\n/**\n * Enumeration of node types.\n * @enum {number}\n */\ngoog.structs.QuadTree.NodeType = {\n  EMPTY: 0,\n  LEAF: 1,\n  POINTER: 2\n};\n\n\n\n/**\n * Constructs a new quad tree node.\n * @param {number} x X-coordiate of node.\n * @param {number} y Y-coordinate of node.\n * @param {number} w Width of node.\n * @param {number} h Height of node.\n * @param {goog.structs.QuadTree.Node=} opt_parent Optional parent node.\n * @constructor\n * @final\n */\ngoog.structs.QuadTree.Node = function(x, y, w, h, opt_parent) {\n  /**\n   * The x-coordinate of the node.\n   * @type {number}\n   */\n  this.x = x;\n\n  /**\n   * The y-coordinate of the node.\n   * @type {number}\n   */\n  this.y = y;\n\n  /**\n   * The width of the node.\n   * @type {number}\n   */\n  this.w = w;\n\n  /**\n   * The height of the node.\n   * @type {number}\n   */\n  this.h = h;\n\n  /**\n   * The parent node.\n   * @type {goog.structs.QuadTree.Node?}\n   */\n  this.parent = opt_parent || null;\n};\n\n\n/**\n * The node's type.\n * @type {goog.structs.QuadTree.NodeType}\n */\ngoog.structs.QuadTree.Node.prototype.nodeType =\n    goog.structs.QuadTree.NodeType.EMPTY;\n\n\n/**\n * The child node in the North-West quadrant.\n * @type {goog.structs.QuadTree.Node?}\n */\ngoog.structs.QuadTree.Node.prototype.nw = null;\n\n\n/**\n * The child node in the North-East quadrant.\n * @type {goog.structs.QuadTree.Node?}\n */\ngoog.structs.QuadTree.Node.prototype.ne = null;\n\n\n/**\n * The child node in the South-West quadrant.\n * @type {goog.structs.QuadTree.Node?}\n */\ngoog.structs.QuadTree.Node.prototype.sw = null;\n\n\n/**\n * The child node in the South-East quadrant.\n * @type {goog.structs.QuadTree.Node?}\n */\ngoog.structs.QuadTree.Node.prototype.se = null;\n\n\n/**\n * The point for the node, if it is a leaf node.\n * @type {goog.structs.QuadTree.Point?}\n */\ngoog.structs.QuadTree.Node.prototype.point = null;\n\n\n\n/**\n * Creates a new point object.\n * @param {number} x The x-coordinate of the point.\n * @param {number} y The y-coordinate of the point.\n * @param {*=} opt_value Optional value associated with the point.\n * @constructor\n * @final\n */\ngoog.structs.QuadTree.Point = function(x, y, opt_value) {\n  /**\n   * The x-coordinate for the point.\n   * @type {number}\n   */\n  this.x = x;\n\n  /**\n   * The y-coordinate for the point.\n   * @type {number}\n   */\n  this.y = y;\n\n  /**\n   * Optional value associated with the point.\n   * @type {*}\n   */\n  this.value = (opt_value !== undefined) ? opt_value : null;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^>8"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/quadtree.js"],"^:1",["^9K",["~$goog.structs.QuadTree.Node","~$goog.structs.QuadTree","~$goog.structs.QuadTree.Point"]],"^9<",true,"^9=",["^9>","^>8"]],["^ ","^9A",[1579837703000],"^9B","goog.storage.mechanism.ieuserdata.js","^9C",["^9D","goog/storage/mechanism/ieuserdata.js"],"^9E","goog/storage/mechanism/ieuserdata.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides data persistence using IE userData mechanism.\n * UserData uses proprietary Element.addBehavior(), Element.load(),\n * Element.save(), and Element.XMLDocument() methods, see:\n * http://msdn.microsoft.com/en-us/library/ms531424(v=vs.85).aspx.\n *\n */\n\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.storage.mechanism.IEUserData');\n\ngoog.require('goog.asserts');\ngoog.require('goog.iter.Iterator');\ngoog.require('goog.iter.StopIteration');\ngoog.require('goog.storage.mechanism.ErrorCode');\ngoog.require('goog.storage.mechanism.IterableMechanism');\ngoog.require('goog.structs.Map');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Provides a storage mechanism using IE userData.\n *\n * @param {string} storageKey The key (store name) to store the data under.\n * @param {string=} opt_storageNodeId The ID of the associated HTML element,\n *     one will be created if not provided.\n * @constructor\n * @extends {goog.storage.mechanism.IterableMechanism}\n * @final\n */\ngoog.storage.mechanism.IEUserData = function(storageKey, opt_storageNodeId) {\n  /**\n   * The key to store the data under.\n   *\n   * @private {string}\n   */\n  this.storageKey_ = storageKey;\n\n  /**\n   * The document element used for storing data.\n   *\n   * @private {?Element}\n   */\n  this.storageNode_ = null;\n\n  goog.storage.mechanism.IEUserData.base(this, 'constructor');\n\n  // Tested on IE6, IE7 and IE8. It seems that IE9 introduces some security\n  // features which make persistent (loaded) node attributes invisible from\n  // JavaScript.\n  if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) {\n    if (!goog.storage.mechanism.IEUserData.storageMap_) {\n      goog.storage.mechanism.IEUserData.storageMap_ = new goog.structs.Map();\n    }\n    this.storageNode_ = /** @type {Element} */ (\n        goog.storage.mechanism.IEUserData.storageMap_.get(storageKey));\n    if (!this.storageNode_) {\n      if (opt_storageNodeId) {\n        this.storageNode_ = document.getElementById(opt_storageNodeId);\n      } else {\n        this.storageNode_ = document.createElement('userdata');\n        // This is a special IE-only method letting us persist data.\n        this.storageNode_['addBehavior']('#default#userData');\n        document.body.appendChild(this.storageNode_);\n      }\n      goog.storage.mechanism.IEUserData.storageMap_.set(\n          storageKey, this.storageNode_);\n    }\n\n\n    try {\n      // Availability check.\n      this.loadNode_();\n    } catch (e) {\n      this.storageNode_ = null;\n    }\n  }\n};\ngoog.inherits(\n    goog.storage.mechanism.IEUserData,\n    goog.storage.mechanism.IterableMechanism);\n\n\n/**\n * Encoding map for characters which are not encoded by encodeURIComponent().\n * See encodeKey_ documentation for encoding details.\n *\n * @type {!Object}\n * @const\n */\ngoog.storage.mechanism.IEUserData.ENCODE_MAP = {\n  '.': '.2E',\n  '!': '.21',\n  '~': '.7E',\n  '*': '.2A',\n  '\\'': '.27',\n  '(': '.28',\n  ')': '.29',\n  '%': '.'\n};\n\n\n/**\n * Global storageKey to storageNode map, so we save on reloading the storage.\n *\n * @type {?goog.structs.Map}\n * @private\n */\ngoog.storage.mechanism.IEUserData.storageMap_ = null;\n\n\n/**\n * Encodes anything other than [-a-zA-Z0-9_] using a dot followed by hex,\n * and prefixes with underscore to form a valid and safe HTML attribute name.\n *\n * We use URI encoding to do the initial heavy lifting, then escape the\n * remaining characters that we can't use. Since a valid attribute name can't\n * contain the percent sign (%), we use a dot (.) as an escape character.\n *\n * @param {string} key The key to be encoded.\n * @return {string} The encoded key.\n * @private\n */\ngoog.storage.mechanism.IEUserData.encodeKey_ = function(key) {\n  // encodeURIComponent leaves - _ . ! ~ * ' ( ) unencoded.\n  return '_' + encodeURIComponent(key).replace(/[.!~*'()%]/g, function(c) {\n    return goog.storage.mechanism.IEUserData.ENCODE_MAP[c];\n  });\n};\n\n\n/**\n * Decodes a dot-encoded and character-prefixed key.\n * See encodeKey_ documentation for encoding details.\n *\n * @param {string} key The key to be decoded.\n * @return {string} The decoded key.\n * @private\n */\ngoog.storage.mechanism.IEUserData.decodeKey_ = function(key) {\n  return decodeURIComponent(key.replace(/\\./g, '%')).substr(1);\n};\n\n\n/**\n * Determines whether or not the mechanism is available.\n *\n * @return {boolean} True if the mechanism is available.\n */\ngoog.storage.mechanism.IEUserData.prototype.isAvailable = function() {\n  return !!this.storageNode_;\n};\n\n\n/** @override */\ngoog.storage.mechanism.IEUserData.prototype.set = function(key, value) {\n  this.storageNode_.setAttribute(\n      goog.storage.mechanism.IEUserData.encodeKey_(key), value);\n  this.saveNode_();\n};\n\n\n/** @override */\ngoog.storage.mechanism.IEUserData.prototype.get = function(key) {\n  // According to Microsoft, values can be strings, numbers or booleans. Since\n  // we only save strings, any other type is a storage error. If we returned\n  // nulls for such keys, i.e., treated them as non-existent, this would lead\n  // to a paradox where a key exists, but it does not when it is retrieved.\n  // http://msdn.microsoft.com/en-us/library/ms531348(v=vs.85).aspx\n  var value = this.storageNode_.getAttribute(\n      goog.storage.mechanism.IEUserData.encodeKey_(key));\n  if (typeof value !== 'string' && value !== null) {\n    throw goog.storage.mechanism.ErrorCode.INVALID_VALUE;\n  }\n  return value;\n};\n\n\n/** @override */\ngoog.storage.mechanism.IEUserData.prototype.remove = function(key) {\n  this.storageNode_.removeAttribute(\n      goog.storage.mechanism.IEUserData.encodeKey_(key));\n  this.saveNode_();\n};\n\n\n/** @override */\ngoog.storage.mechanism.IEUserData.prototype.getCount = function() {\n  return this.getNode_().attributes.length;\n};\n\n\n/** @override */\ngoog.storage.mechanism.IEUserData.prototype.__iterator__ = function(opt_keys) {\n  var i = 0;\n  var attributes = this.getNode_().attributes;\n  var newIter = new goog.iter.Iterator();\n  newIter.next = function() {\n    if (i >= attributes.length) {\n      throw goog.iter.StopIteration;\n    }\n    var item = goog.asserts.assert(attributes[i++]);\n    if (opt_keys) {\n      return goog.storage.mechanism.IEUserData.decodeKey_(item.nodeName);\n    }\n    var value = item.nodeValue;\n    // The value must exist and be a string, otherwise it is a storage error.\n    if (typeof value !== 'string') {\n      throw goog.storage.mechanism.ErrorCode.INVALID_VALUE;\n    }\n    return value;\n  };\n  return newIter;\n};\n\n\n/** @override */\ngoog.storage.mechanism.IEUserData.prototype.clear = function() {\n  var node = this.getNode_();\n  for (var left = node.attributes.length; left > 0; left--) {\n    node.removeAttribute(node.attributes[left - 1].nodeName);\n  }\n  this.saveNode_();\n};\n\n\n/**\n * Loads the underlying storage node to the state we saved it to before.\n *\n * @private\n */\ngoog.storage.mechanism.IEUserData.prototype.loadNode_ = function() {\n  // This is a special IE-only method on Elements letting us persist data.\n  this.storageNode_['load'](this.storageKey_);\n};\n\n\n/**\n * Saves the underlying storage node.\n *\n * @private\n */\ngoog.storage.mechanism.IEUserData.prototype.saveNode_ = function() {\n\n  try {\n    // This is a special IE-only method on Elements letting us persist data.\n    // Do not try to assign this.storageNode_['save'] to a variable, it does\n    // not work. May throw an exception when the quota is exceeded.\n    this.storageNode_['save'](this.storageKey_);\n  } catch (e) {\n    throw goog.storage.mechanism.ErrorCode.QUOTA_EXCEEDED;\n  }\n};\n\n\n/**\n * Returns the storage node.\n *\n * @return {!Element} Storage DOM Element.\n * @private\n */\ngoog.storage.mechanism.IEUserData.prototype.getNode_ = function() {\n  // This is a special IE-only property letting us browse persistent data.\n  var doc = /** @type {Document} */ (this.storageNode_['XMLDocument']);\n  return doc.documentElement;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^K0","^=[","^9>","^:S","^;J","^;K","^K1"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/mechanism/ieuserdata.js"],"^:1",["^9K",["~$goog.storage.mechanism.IEUserData"]],"^9<",true,"^9=",["^9>","^:E","^;K","^;J","^K1","^K0","^=[","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.fx.css3.fx.js","^9C",["^9D","goog/fx/css3/fx.js"],"^9E","goog/fx/css3/fx.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A collection of CSS3 targeted animation, based on\n * `goog.fx.css3.Transition`.\n *\n * @author chrishenry@google.com (Chris Henry)\n */\n\ngoog.provide('goog.fx.css3');\n\ngoog.require('goog.fx.css3.Transition');\n\n\n/**\n * Creates a transition to fade the element.\n * @param {Element} element The element to fade.\n * @param {number} duration Duration in seconds.\n * @param {string} timing The CSS3 timing function.\n * @param {number} startOpacity Starting opacity.\n * @param {number} endOpacity Ending opacity.\n * @return {!goog.fx.css3.Transition} The transition object.\n */\ngoog.fx.css3.fade = function(\n    element, duration, timing, startOpacity, endOpacity) {\n  return new goog.fx.css3.Transition(\n      element, duration, {'opacity': startOpacity}, {'opacity': endOpacity},\n      {property: 'opacity', duration: duration, timing: timing, delay: 0});\n};\n\n\n/**\n * Creates a transition to fade in the element.\n * @param {Element} element The element to fade in.\n * @param {number} duration Duration in seconds.\n * @return {!goog.fx.css3.Transition} The transition object.\n */\ngoog.fx.css3.fadeIn = function(element, duration) {\n  return goog.fx.css3.fade(element, duration, 'ease-out', 0, 1);\n};\n\n\n/**\n * Creates a transition to fade out the element.\n * @param {Element} element The element to fade out.\n * @param {number} duration Duration in seconds.\n * @return {!goog.fx.css3.Transition} The transition object.\n */\ngoog.fx.css3.fadeOut = function(element, duration) {\n  return goog.fx.css3.fade(element, duration, 'ease-in', 1, 0);\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.fx.css3.Transition","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/css3/fx.js"],"^:1",["^9K",["~$goog.fx.css3"]],"^9<",true,"^9=",["^9>","^S8"]],["^ ","^9A",[1579837703000],"^9B","goog.result.simpleresult.js","^9C",["^9D","goog/result/simpleresult.js"],"^9E","goog/result/simpleresult.js","^9F","^9G","^9H","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A SimpleResult object that implements goog.result.Result.\n * See below for a more detailed description.\n */\n\ngoog.provide('goog.result.SimpleResult');\ngoog.provide('goog.result.SimpleResult.StateError');\n\ngoog.require('goog.Promise');\ngoog.require('goog.Thenable');\ngoog.require('goog.debug.Error');\ngoog.require('goog.result.Result');\n\n\n\n/**\n * A SimpleResult object is a basic implementation of the\n * goog.result.Result interface. This could be subclassed(e.g. XHRResult)\n * or instantiated and returned by another class as a form of result. The caller\n * receiving the result could then attach handlers to be called when the result\n * is resolved(success or error).\n *\n * @constructor\n * @implements {goog.result.Result}\n * @deprecated Use {@link goog.Promise} instead - http://go/promisemigration\n */\ngoog.result.SimpleResult = function() {\n  /**\n   * The current state of this Result.\n   * @type {goog.result.Result.State}\n   * @private\n   */\n  this.state_ = goog.result.Result.State.PENDING;\n\n  /**\n   * The list of handlers to call when this Result is resolved.\n   * @type {!Array<!goog.result.SimpleResult.HandlerEntry_>}\n   * @private\n   */\n  this.handlers_ = [];\n\n  // The value_ and error_ properties are initialized in the constructor to\n  // ensure that all SimpleResult instances share the same hidden class in\n  // modern JavaScript engines.\n\n  /**\n   * The 'value' of this Result.\n   * @type {*}\n   * @private\n   */\n  this.value_ = undefined;\n\n  /**\n   * The error slug for this Result.\n   * @type {*}\n   * @private\n   */\n  this.error_ = undefined;\n};\ngoog.Thenable.addImplementation(goog.result.SimpleResult);\n\n\n/**\n * A waiting handler entry.\n * @typedef {{\n *   callback: function(!goog.result.SimpleResult),\n *   scope: Object\n * }}\n * @private\n */\ngoog.result.SimpleResult.HandlerEntry_;\n\n\n\n/**\n * Error thrown if there is an attempt to set the value or error for this result\n * more than once.\n *\n * @constructor\n * @extends {goog.debug.Error}\n * @final\n * @deprecated Use {@link goog.Promise} instead - http://go/promisemigration\n */\ngoog.result.SimpleResult.StateError = function() {\n  goog.result.SimpleResult.StateError.base(\n      this, 'constructor', 'Multiple attempts to set the state of this Result');\n};\ngoog.inherits(goog.result.SimpleResult.StateError, goog.debug.Error);\n\n\n/** @override */\ngoog.result.SimpleResult.prototype.getState = function() {\n  return this.state_;\n};\n\n\n/** @override */\ngoog.result.SimpleResult.prototype.getValue = function() {\n  return this.value_;\n};\n\n\n/** @override */\ngoog.result.SimpleResult.prototype.getError = function() {\n  return this.error_;\n};\n\n\n/**\n * Attaches handlers to be called when the value of this Result is available.\n *\n * @param {function(this:T, !goog.result.SimpleResult)} handler The function\n *     called when the value is available. The function is passed the Result\n *     object as the only argument.\n * @param {T=} opt_scope Optional scope for the handler.\n * @template T\n * @override\n */\ngoog.result.SimpleResult.prototype.wait = function(handler, opt_scope) {\n  if (this.isPending_()) {\n    this.handlers_.push({callback: handler, scope: opt_scope || null});\n  } else {\n    handler.call(opt_scope, this);\n  }\n};\n\n\n/**\n * Sets the value of this Result, changing the state.\n *\n * @param {*} value The value to set for this Result.\n */\ngoog.result.SimpleResult.prototype.setValue = function(value) {\n  if (this.isPending_()) {\n    this.value_ = value;\n    this.state_ = goog.result.Result.State.SUCCESS;\n    this.callHandlers_();\n  } else if (!this.isCanceled()) {\n    // setValue is a no-op if this Result has been canceled.\n    throw new goog.result.SimpleResult.StateError();\n  }\n};\n\n\n/**\n * Sets the Result to be an error Result.\n *\n * @param {*=} opt_error Optional error slug to set for this Result.\n */\ngoog.result.SimpleResult.prototype.setError = function(opt_error) {\n  if (this.isPending_()) {\n    this.error_ = opt_error;\n    this.state_ = goog.result.Result.State.ERROR;\n    this.callHandlers_();\n  } else if (!this.isCanceled()) {\n    // setError is a no-op if this Result has been canceled.\n    throw new goog.result.SimpleResult.StateError();\n  }\n};\n\n\n/**\n * Calls the handlers registered for this Result.\n *\n * @private\n */\ngoog.result.SimpleResult.prototype.callHandlers_ = function() {\n  var handlers = this.handlers_;\n  this.handlers_ = [];\n  for (var n = 0; n < handlers.length; n++) {\n    var handlerEntry = handlers[n];\n    handlerEntry.callback.call(handlerEntry.scope, this);\n  }\n};\n\n\n/**\n * @return {boolean} Whether the Result is pending.\n * @private\n */\ngoog.result.SimpleResult.prototype.isPending_ = function() {\n  return this.state_ == goog.result.Result.State.PENDING;\n};\n\n\n/**\n * Cancels the Result.\n *\n * @return {boolean} Whether the result was canceled. It will not be canceled if\n *    the result was already canceled or has already resolved.\n * @override\n */\ngoog.result.SimpleResult.prototype.cancel = function() {\n  // cancel is a no-op if the result has been resolved.\n  if (this.isPending_()) {\n    this.setError(new goog.result.Result.CancelError());\n    return true;\n  }\n  return false;\n};\n\n\n/** @override */\ngoog.result.SimpleResult.prototype.isCanceled = function() {\n  return this.state_ == goog.result.Result.State.ERROR &&\n      this.error_ instanceof goog.result.Result.CancelError;\n};\n\n\n/** @override */\ngoog.result.SimpleResult.prototype.then = function(\n    opt_onFulfilled, opt_onRejected, opt_context) {\n  var resolve, reject;\n  // Copy the resolvers to outer scope, so that they are available\n  // when the callback to wait() fires (which may be synchronous).\n  var promise = new goog.Promise(function(res, rej) {\n    resolve = res;\n    reject = rej;\n  });\n  this.wait(function(result) {\n    if (result.isCanceled()) {\n      promise.cancel();\n    } else if (result.getState() == goog.result.Result.State.SUCCESS) {\n      resolve(result.getValue());\n    } else if (result.getState() == goog.result.Result.State.ERROR) {\n      reject(result.getError());\n    }\n  });\n  return promise.then(opt_onFulfilled, opt_onRejected, opt_context);\n};\n\n\n/**\n * Creates a SimpleResult that fires when the given promise resolves.\n * Use only during migration to Promises.\n * @param {!goog.Promise<?>} promise\n * @return {!goog.result.Result}\n */\ngoog.result.SimpleResult.fromPromise = function(promise) {\n  var result = new goog.result.SimpleResult();\n  promise.then(result.setValue, result.setError, result);\n  return result;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^;R","^:4","~$goog.result.Result","^:9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/result/simpleresult.js"],"^:1",["^9K",["~$goog.result.SimpleResult.StateError","~$goog.result.SimpleResult"]],"^9<",true,"^9=",["^9>","^:4","^:9","^;R","^S:"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.formpost.js","^9C",["^9D","goog/ui/formpost.js"],"^9E","goog/ui/formpost.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility for making the browser submit a hidden form, which can\n * be used to effect a POST from JavaScript.\n *\n * @author dpb@google.com (David P. Baker)\n */\n\ngoog.provide('goog.ui.FormPost');\n\ngoog.require('goog.array');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.ui.Component');\n\n\n\n/**\n * Creates a formpost object.\n * @constructor\n * @extends {goog.ui.Component}\n * @param {goog.dom.DomHelper=} opt_dom The DOM helper.\n * @final\n */\ngoog.ui.FormPost = function(opt_dom) {\n  goog.ui.Component.call(this, opt_dom);\n};\ngoog.inherits(goog.ui.FormPost, goog.ui.Component);\n\n\n/** @override */\ngoog.ui.FormPost.prototype.createDom = function() {\n  this.setElementInternal(\n      this.getDomHelper().createDom(\n          goog.dom.TagName.FORM, {'method': 'POST', 'style': 'display:none'}));\n};\n\n\n/**\n * Constructs a POST request and directs the browser as if a form were\n * submitted.\n * @param {Object} parameters Object with parameter values. Values can be\n *     strings, numbers, or arrays of strings or numbers.\n * @param {string=} opt_url The destination URL. If not specified, uses the\n *     current URL for window for the DOM specified in the constructor.\n * @param {string=} opt_target An optional name of a window in which to open the\n *     URL. If not specified, uses the window for the DOM specified in the\n *     constructor.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.FormPost.prototype.post = function(parameters, opt_url, opt_target) {\n  var form = this.getElement();\n  if (!form) {\n    this.render();\n    form = this.getElement();\n  }\n  form.action = opt_url || '';\n  form.target = opt_target || '';\n  this.setParameters_(form, parameters);\n  form.submit();\n};\n\n\n/**\n * Creates hidden inputs in a form to match parameters.\n * @param {!Element} form The form element.\n * @param {Object} parameters Object with parameter values. Values can be\n *     strings, numbers, or arrays of strings or numbers.\n * @private\n */\ngoog.ui.FormPost.prototype.setParameters_ = function(form, parameters) {\n  var name, value, html = [];\n  for (name in parameters) {\n    value = parameters[name];\n    if (goog.isArrayLike(value)) {\n      goog.array.forEach(value, goog.bind(function(innerValue) {\n        html.push(this.createInput_(name, String(innerValue)));\n      }, this));\n    } else {\n      html.push(this.createInput_(name, String(value)));\n    }\n  }\n  goog.dom.safe.setInnerHtml(form, goog.html.SafeHtml.concat(html));\n};\n\n\n/**\n * Creates a hidden <input> tag.\n * @param {string} name The name of the input.\n * @param {string} value The value of the input.\n * @return {!goog.html.SafeHtml}\n * @private\n */\ngoog.ui.FormPost.prototype.createInput_ = function(name, value) {\n  return goog.html.SafeHtml.create(\n      'input',\n      {'type': goog.dom.InputType.HIDDEN, 'name': name, 'value': value});\n};\n","^9I",1579837703000,"^9J",["^9K",["^:=","^GL","^9>","^@B","^;9","^@C","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/formpost.js"],"^:1",["^9K",["~$goog.ui.FormPost"]],"^9<",true,"^9=",["^9>","^;9","^GL","^;=","^@B","^@C","^:="]],["^ ","^9A",[1579837703000],"^9B","goog.dom.controlrange.js","^9C",["^9D","goog/dom/controlrange.js"],"^9E","goog/dom/controlrange.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for working with IE control ranges.\n *\n * @author robbyw@google.com (Robby Walker)\n * @suppress {strictMissingProperties}\n */\n\n\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.dom.ControlRange');\ngoog.provide('goog.dom.ControlRangeIterator');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.AbstractMultiRange');\ngoog.require('goog.dom.AbstractRange');\ngoog.require('goog.dom.RangeIterator');\ngoog.require('goog.dom.RangeType');\ngoog.require('goog.dom.SavedRange');\ngoog.require('goog.dom.TagWalkType');\ngoog.require('goog.dom.TextRange');\ngoog.require('goog.iter.StopIteration');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Create a new control selection with no properties.  Do not use this\n * constructor: use one of the goog.dom.Range.createFrom* methods instead.\n * @constructor\n * @extends {goog.dom.AbstractMultiRange}\n * @final\n */\ngoog.dom.ControlRange = function() {\n  /**\n   * The IE control range obejct.\n   * @private {?Object}\n   */\n  this.range_ = null;\n\n  /**\n   * Cached list of elements.\n   * @private {?Array<?Element>}\n   */\n  this.elements_ = null;\n\n  /**\n   * Cached sorted list of elements.\n   * @private {?Array<?Element>}\n   */\n  this.sortedElements_ = null;\n};\ngoog.inherits(goog.dom.ControlRange, goog.dom.AbstractMultiRange);\n\n\n/**\n * Create a new range wrapper from the given browser range object.  Do not use\n * this method directly - please use goog.dom.Range.createFrom* instead.\n * @param {Object} controlRange The browser range object.\n * @return {!goog.dom.ControlRange} A range wrapper object.\n */\ngoog.dom.ControlRange.createFromBrowserRange = function(controlRange) {\n  var range = new goog.dom.ControlRange();\n  range.range_ = controlRange;\n  return range;\n};\n\n\n/**\n * Create a new range wrapper that selects the given element.  Do not use\n * this method directly - please use goog.dom.Range.createFrom* instead.\n * @param {...Element} var_args The element(s) to select.\n * @return {!goog.dom.ControlRange} A range wrapper object.\n */\ngoog.dom.ControlRange.createFromElements = function(var_args) {\n  var range = goog.dom.getOwnerDocument(arguments[0]).body.createControlRange();\n  for (var i = 0, len = arguments.length; i < len; i++) {\n    range.addElement(arguments[i]);\n  }\n  return goog.dom.ControlRange.createFromBrowserRange(range);\n};\n\n\n// Method implementations\n\n\n/**\n * Clear cached values.\n * @private\n */\ngoog.dom.ControlRange.prototype.clearCachedValues_ = function() {\n  this.elements_ = null;\n  this.sortedElements_ = null;\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.clone = function() {\n  return goog.dom.ControlRange.createFromElements.apply(\n      this, this.getElements());\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.getType = function() {\n  return goog.dom.RangeType.CONTROL;\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.getBrowserRangeObject = function() {\n  return this.range_ || document.body.createControlRange();\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.setBrowserRangeObject = function(nativeRange) {\n  if (!goog.dom.AbstractRange.isNativeControlRange(nativeRange)) {\n    return false;\n  }\n  this.range_ = nativeRange;\n  return true;\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.getTextRangeCount = function() {\n  return this.range_ ? this.range_.length : 0;\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.getTextRange = function(i) {\n  return goog.dom.TextRange.createFromNodeContents(this.range_.item(i));\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.getContainer = function() {\n  return goog.dom.findCommonAncestor.apply(null, this.getElements());\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.getStartNode = function() {\n  return this.getSortedElements()[0];\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.getStartOffset = function() {\n  return 0;\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.getEndNode = function() {\n  var sorted = this.getSortedElements();\n  var startsLast = /** @type {Node} */ (goog.array.peek(sorted));\n  return /** @type {Node} */ (goog.array.find(sorted, function(el) {\n    return goog.dom.contains(el, startsLast);\n  }));\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.getEndOffset = function() {\n  return this.getEndNode().childNodes.length;\n};\n\n\n// TODO(robbyw): Figure out how to unify getElements with TextRange API.\n/**\n * @return {!Array<Element>} Array of elements in the control range.\n */\ngoog.dom.ControlRange.prototype.getElements = function() {\n  if (!this.elements_) {\n    this.elements_ = [];\n    if (this.range_) {\n      for (var i = 0; i < this.range_.length; i++) {\n        this.elements_.push(this.range_.item(i));\n      }\n    }\n  }\n\n  return this.elements_;\n};\n\n\n/**\n * @return {!Array<Element>} Array of elements comprising the control range,\n *     sorted by document order.\n */\ngoog.dom.ControlRange.prototype.getSortedElements = function() {\n  if (!this.sortedElements_) {\n    this.sortedElements_ = this.getElements().concat();\n    this.sortedElements_.sort(function(a, b) {\n      return a.sourceIndex - b.sourceIndex;\n    });\n  }\n\n  return this.sortedElements_;\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.isRangeInDocument = function() {\n  var returnValue = false;\n\n  try {\n    returnValue = goog.array.every(this.getElements(), function(element) {\n      // On IE, this throws an exception when the range is detached.\n      return goog.userAgent.IE ?\n          !!element.parentNode :\n          goog.dom.contains(element.ownerDocument.body, element);\n    });\n  } catch (e) {\n    // IE sometimes throws Invalid Argument errors for detached elements.\n    // Note: trying to return a value from the above try block can cause IE\n    // to crash.  It is necessary to use the local returnValue.\n  }\n\n  return returnValue;\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.isCollapsed = function() {\n  return !this.range_ || !this.range_.length;\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.getText = function() {\n  // TODO(robbyw): What about for table selections?  Should those have text?\n  return '';\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.getHtmlFragment = function() {\n  return goog.array.map(this.getSortedElements(), goog.dom.getOuterHtml)\n      .join('');\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.getValidHtml = function() {\n  return this.getHtmlFragment();\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.getPastableHtml =\n    goog.dom.ControlRange.prototype.getValidHtml;\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.__iterator__ = function(opt_keys) {\n  return new goog.dom.ControlRangeIterator(this);\n};\n\n\n// RANGE ACTIONS\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.select = function() {\n  if (this.range_) {\n    this.range_.select();\n  }\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.removeContents = function() {\n  // TODO(robbyw): Test implementing with execCommand('Delete')\n  if (this.range_) {\n    var nodes = [];\n    for (var i = 0, len = this.range_.length; i < len; i++) {\n      nodes.push(this.range_.item(i));\n    }\n    goog.array.forEach(nodes, goog.dom.removeNode);\n\n    this.collapse(false);\n  }\n};\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.replaceContentsWithNode = function(node) {\n  // Control selections have to have the node inserted before removing the\n  // selection contents because a collapsed control range doesn't have start or\n  // end nodes.\n  var result = this.insertNode(node, true);\n\n  if (!this.isCollapsed()) {\n    this.removeContents();\n  }\n\n  return result;\n};\n\n\n// SAVE/RESTORE\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.saveUsingDom = function() {\n  return new goog.dom.DomSavedControlRange_(this);\n};\n\n\n// RANGE MODIFICATION\n\n\n/** @override */\ngoog.dom.ControlRange.prototype.collapse = function(toAnchor) {\n  // TODO(robbyw): Should this return a text range?  If so, API needs to change.\n  this.range_ = null;\n  this.clearCachedValues_();\n};\n\n\n// SAVED RANGE OBJECTS\n\n\n\n/**\n * A SavedRange implementation using DOM endpoints.\n * @param {goog.dom.ControlRange} range The range to save.\n * @constructor\n * @extends {goog.dom.SavedRange}\n * @private\n */\ngoog.dom.DomSavedControlRange_ = function(range) {\n  /**\n   * The element list.\n   * @type {Array<Element>}\n   * @private\n   */\n  this.elements_ = range.getElements();\n};\ngoog.inherits(goog.dom.DomSavedControlRange_, goog.dom.SavedRange);\n\n\n/** @override */\ngoog.dom.DomSavedControlRange_.prototype.restoreInternal = function() {\n  var doc = this.elements_.length ?\n      goog.dom.getOwnerDocument(this.elements_[0]) :\n      document;\n  var controlRange = doc.body.createControlRange();\n  for (var i = 0, len = this.elements_.length; i < len; i++) {\n    controlRange.addElement(this.elements_[i]);\n  }\n  return goog.dom.ControlRange.createFromBrowserRange(controlRange);\n};\n\n\n/** @override */\ngoog.dom.DomSavedControlRange_.prototype.disposeInternal = function() {\n  goog.dom.DomSavedControlRange_.superClass_.disposeInternal.call(this);\n  delete this.elements_;\n};\n\n\n// RANGE ITERATION\n\n\n\n/**\n * Subclass of goog.dom.TagIterator that iterates over a DOM range.  It\n * adds functions to determine the portion of each text node that is selected.\n *\n * @param {goog.dom.ControlRange?} range The range to traverse.\n * @constructor\n * @extends {goog.dom.RangeIterator}\n * @final\n */\ngoog.dom.ControlRangeIterator = function(range) {\n  /**\n   * The first node in the selection.\n   * @private {?Node}\n   */\n  this.startNode_ = null;\n\n  /**\n   * The last node in the selection.\n   * @private {?Node}\n   */\n  this.endNode_ = null;\n\n  /**\n   * The list of elements left to traverse.\n   * @private {Array<?Element>?}\n   */\n  this.elements_ = null;\n\n  if (range) {\n    this.elements_ = range.getSortedElements();\n    this.startNode_ = this.elements_.shift();\n    this.endNode_ = /** @type {Node} */ (goog.array.peek(this.elements_)) ||\n        this.startNode_;\n  }\n\n  goog.dom.ControlRangeIterator.base(\n      this, 'constructor', this.startNode_, false);\n};\ngoog.inherits(goog.dom.ControlRangeIterator, goog.dom.RangeIterator);\n\n\n/** @override */\ngoog.dom.ControlRangeIterator.prototype.getStartTextOffset = function() {\n  return 0;\n};\n\n\n/** @override */\ngoog.dom.ControlRangeIterator.prototype.getEndTextOffset = function() {\n  return 0;\n};\n\n\n/** @override */\ngoog.dom.ControlRangeIterator.prototype.getStartNode = function() {\n  return this.startNode_;\n};\n\n\n/** @override */\ngoog.dom.ControlRangeIterator.prototype.getEndNode = function() {\n  return this.endNode_;\n};\n\n\n/** @override */\ngoog.dom.ControlRangeIterator.prototype.isLast = function() {\n  return !this.depth && !this.elements_.length;\n};\n\n\n/**\n * Move to the next position in the selection.\n * Throws `goog.iter.StopIteration` when it passes the end of the range.\n * @return {Node} The node at the next position.\n * @override\n */\ngoog.dom.ControlRangeIterator.prototype.next = function() {\n  // Iterate over each element in the range, and all of its children.\n  if (this.isLast()) {\n    throw goog.iter.StopIteration;\n  } else if (!this.depth) {\n    var el = this.elements_.shift();\n    this.setPosition(\n        el, goog.dom.TagWalkType.START_TAG, goog.dom.TagWalkType.START_TAG);\n    return el;\n  }\n\n  // Call the super function.\n  return goog.dom.ControlRangeIterator.superClass_.next.call(this);\n};\n\n\n/** @override */\ngoog.dom.ControlRangeIterator.prototype.copyFrom = function(other) {\n  var that = /** @type {!goog.dom.ControlRangeIterator} */ (other);\n  this.elements_ = that.elements_;\n  this.startNode_ = that.startNode_;\n  this.endNode_ = that.endNode_;\n\n  goog.dom.ControlRangeIterator.superClass_.copyFrom.call(this, that);\n};\n\n\n/**\n * @return {!goog.dom.ControlRangeIterator} An identical iterator.\n * @override\n */\ngoog.dom.ControlRangeIterator.prototype.clone = function() {\n  var copy = new goog.dom.ControlRangeIterator(null);\n  copy.copyFrom(this);\n  return copy;\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","^:B","~$goog.dom.SavedRange","~$goog.dom.TagWalkType","^9>","^:S","~$goog.dom.AbstractMultiRange","^=D","^;J","~$goog.dom.RangeType","^;9","~$goog.dom.RangeIterator"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/controlrange.js"],"^:1",["^9K",["^=C","~$goog.dom.ControlRangeIterator"]],"^9<",true,"^9=",["^9>","^;9","^;;","^S@","^:B","^SB","^SA","^S>","^S?","^=D","^;J","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.format.format.js","^9C",["^9D","goog/format/format.js"],"^9E","goog/format/format.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides utility functions for formatting strings, numbers etc.\n *\n */\n\ngoog.provide('goog.format');\n\ngoog.require('goog.i18n.GraphemeBreak');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n/**\n * Formats a number of bytes in human readable form.\n * 54, 450K, 1.3M, 5G etc.\n * @param {number} bytes The number of bytes to show.\n * @param {number=} opt_decimals The number of decimals to use.  Defaults to 2.\n * @return {string} The human readable form of the byte size.\n */\ngoog.format.fileSize = function(bytes, opt_decimals) {\n  return goog.format.numBytesToString(bytes, opt_decimals, false);\n};\n\n\n/**\n * Checks whether string value containing scaling units (K, M, G, T, P, m,\n * u, n) can be converted to a number.\n *\n * Where there is a decimal, there must be a digit to the left of the\n * decimal point.\n *\n * Negative numbers are valid.\n *\n * Examples:\n *   0, 1, 1.0, 10.4K, 2.3M, -0.3P, 1.2m\n *\n * @param {string} val String value to check.\n * @return {boolean} True if string could be converted to a numeric value.\n */\ngoog.format.isConvertableScaledNumber = function(val) {\n  return goog.format.SCALED_NUMERIC_RE_.test(val);\n};\n\n\n/**\n * Converts a string to numeric value, taking into account the units.\n * If string ends in 'B', use binary conversion.\n * @param {string} stringValue String to be converted to numeric value.\n * @return {number} Numeric value for string.\n */\ngoog.format.stringToNumericValue = function(stringValue) {\n  if (goog.string.endsWith(stringValue, 'B')) {\n    return goog.format.stringToNumericValue_(\n        stringValue, goog.format.NUMERIC_SCALES_BINARY_);\n  }\n  return goog.format.stringToNumericValue_(\n      stringValue, goog.format.NUMERIC_SCALES_SI_);\n};\n\n\n/**\n * Converts a string to number of bytes, taking into account the units.\n * Binary conversion.\n * @param {string} stringValue String to be converted to numeric value.\n * @return {number} Numeric value for string.\n */\ngoog.format.stringToNumBytes = function(stringValue) {\n  return goog.format.stringToNumericValue_(\n      stringValue, goog.format.NUMERIC_SCALES_BINARY_);\n};\n\n\n/**\n * Converts a numeric value to string representation. SI conversion.\n * @param {number} val Value to be converted.\n * @param {number=} opt_decimals The number of decimals to use.  Defaults to 2.\n * @return {string} String representation of number.\n */\ngoog.format.numericValueToString = function(val, opt_decimals) {\n  return goog.format.numericValueToString_(\n      val, goog.format.NUMERIC_SCALES_SI_, opt_decimals);\n};\n\n\n/**\n * Converts number of bytes to string representation. Binary conversion.\n * Default is to return the additional 'B' suffix only for scales greater than\n * 1K, e.g. '10.5KB' to minimize confusion with counts that are scaled by powers\n * of 1000. Otherwise, suffix is empty string.\n * @param {number} val Value to be converted.\n * @param {number=} opt_decimals The number of decimals to use.  Defaults to 2.\n * @param {boolean=} opt_suffix If true, include trailing 'B' in returned\n *     string.  Default is true.\n * @param {boolean=} opt_useSeparator If true, number and scale will be\n *     separated by a no break space. Default is false.\n * @return {string} String representation of number of bytes.\n */\ngoog.format.numBytesToString = function(\n    val, opt_decimals, opt_suffix, opt_useSeparator) {\n  var suffix = '';\n  if (opt_suffix === undefined || opt_suffix) {\n    suffix = 'B';\n  }\n  return goog.format.numericValueToString_(\n      val, goog.format.NUMERIC_SCALES_BINARY_, opt_decimals, suffix,\n      opt_useSeparator);\n};\n\n\n/**\n * Converts a string to numeric value, taking into account the units.\n * @param {string} stringValue String to be converted to numeric value.\n * @param {Object} conversion Dictionary of conversion scales.\n * @return {number} Numeric value for string.  If it cannot be converted,\n *    returns NaN.\n * @private\n */\ngoog.format.stringToNumericValue_ = function(stringValue, conversion) {\n  var match = stringValue.match(goog.format.SCALED_NUMERIC_RE_);\n  if (!match) {\n    return NaN;\n  }\n  var val = Number(match[1]) * conversion[match[2]];\n  return val;\n};\n\n\n/**\n * Converts a numeric value to string, using specified conversion\n * scales.\n * @param {number} val Value to be converted.\n * @param {Object} conversion Dictionary of scaling factors.\n * @param {number=} opt_decimals The number of decimals to use.  Default is 2.\n * @param {string=} opt_suffix Optional suffix to append.\n * @param {boolean=} opt_useSeparator If true, number and scale will be\n *     separated by a space. Default is false.\n * @return {string} The human readable form of the byte size.\n * @private\n */\ngoog.format.numericValueToString_ = function(\n    val, conversion, opt_decimals, opt_suffix, opt_useSeparator) {\n  var prefixes = goog.format.NUMERIC_SCALE_PREFIXES_;\n  var orig_val = val;\n  var symbol = '';\n  var separator = '';\n  var scale = 1;\n  if (val < 0) {\n    val = -val;\n  }\n  for (var i = 0; i < prefixes.length; i++) {\n    var unit = prefixes[i];\n    scale = conversion[unit];\n    if (val >= scale || (scale <= 1 && val > 0.1 * scale)) {\n      // Treat values less than 1 differently, allowing 0.5 to be \"0.5\" rather\n      // than \"500m\"\n      symbol = unit;\n      break;\n    }\n  }\n  if (!symbol) {\n    scale = 1;\n  } else {\n    if (opt_suffix) {\n      symbol += opt_suffix;\n    }\n    if (opt_useSeparator) {\n      separator = ' ';\n    }\n  }\n  var ex = Math.pow(10, opt_decimals !== undefined ? opt_decimals : 2);\n  return Math.round(orig_val / scale * ex) / ex + separator + symbol;\n};\n\n\n/**\n * Regular expression for detecting scaling units, such as K, M, G, etc. for\n * converting a string representation to a numeric value.\n *\n * Also allow 'k' to be aliased to 'K'.  These could be used for SI (powers\n * of 1000) or Binary (powers of 1024) conversions.\n *\n * Also allow final 'B' to be interpreted as byte-count, implicitly triggering\n * binary conversion (e.g., '10.2MB').\n *\n * @type {RegExp}\n * @private\n */\ngoog.format.SCALED_NUMERIC_RE_ =\n    /^([-]?\\d+\\.?\\d*)([K,M,G,T,P,E,Z,Y,k,m,u,n]?)[B]?$/;\n\n\n/**\n * Ordered list of scaling prefixes in decreasing order.\n * @private {Array<string>}\n */\ngoog.format.NUMERIC_SCALE_PREFIXES_ =\n    ['Y', 'Z', 'E', 'P', 'T', 'G', 'M', 'K', '', 'm', 'u', 'n'];\n\n\n/**\n * Scaling factors for conversion of numeric value to string.  SI conversion.\n * @type {Object}\n * @private\n */\ngoog.format.NUMERIC_SCALES_SI_ = {\n  '': 1,\n  'n': 1e-9,\n  'u': 1e-6,\n  'm': 1e-3,\n  'k': 1e3,\n  'K': 1e3,\n  'M': 1e6,\n  'G': 1e9,\n  'T': 1e12,\n  'P': 1e15,\n  'E': 1e18,\n  'Z': 1e21,\n  'Y': 1e24\n};\n\n\n/**\n * Scaling factors for conversion of numeric value to string.  Binary\n * conversion.\n * @type {Object}\n * @private\n */\ngoog.format.NUMERIC_SCALES_BINARY_ = {\n  '': 1,\n  'n': Math.pow(1024, -3),\n  'u': Math.pow(1024, -2),\n  'm': 1.0 / 1024,\n  'k': 1024,\n  'K': 1024,\n  'M': Math.pow(1024, 2),\n  'G': Math.pow(1024, 3),\n  'T': Math.pow(1024, 4),\n  'P': Math.pow(1024, 5),\n  'E': Math.pow(1024, 6),\n  'Z': Math.pow(1024, 7),\n  'Y': Math.pow(1024, 8)\n};\n\n\n/**\n * First Unicode code point that has the Mark property.\n * @type {number}\n * @private\n */\ngoog.format.FIRST_GRAPHEME_EXTEND_ = 0x300;\n\n\n/**\n * Returns true if and only if given character should be treated as a breaking\n * space. All ASCII control characters, the main Unicode range of spacing\n * characters (U+2000 to U+200B inclusive except for U+2007), and several other\n * Unicode space characters are treated as breaking spaces.\n * @param {number} charCode The character code under consideration.\n * @return {boolean} True if the character is a breaking space.\n * @private\n */\ngoog.format.isTreatedAsBreakingSpace_ = function(charCode) {\n  return (charCode <= goog.format.WbrToken_.SPACE) ||\n      (charCode >= 0x1000 &&\n       ((charCode >= 0x2000 && charCode <= 0x2006) ||\n        (charCode >= 0x2008 && charCode <= 0x200B) || charCode == 0x1680 ||\n        charCode == 0x180E || charCode == 0x2028 || charCode == 0x2029 ||\n        charCode == 0x205f || charCode == 0x3000));\n};\n\n\n/**\n * Returns true if and only if given character is an invisible formatting\n * character.\n * @param {number} charCode The character code under consideration.\n * @return {boolean} True if the character is an invisible formatting character.\n * @private\n */\ngoog.format.isInvisibleFormattingCharacter_ = function(charCode) {\n  // See: http://unicode.org/charts/PDF/U2000.pdf\n  return (charCode >= 0x200C && charCode <= 0x200F) ||\n      (charCode >= 0x202A && charCode <= 0x202E);\n};\n\n\n/**\n * Inserts word breaks into an HTML string at a given interval.  The counter is\n * reset if a space or a character which behaves like a space is encountered,\n * but it isn't incremented if an invisible formatting character is encountered.\n * WBRs aren't inserted into HTML tags or entities.  Entities count towards the\n * character count, HTML tags do not.\n *\n * With common strings aliased, objects allocations are constant based on the\n * length of the string: N + 3. This guarantee does not hold if the string\n * contains an element >= U+0300 and hasGraphemeBreak is non-trivial.\n *\n * @param {string} str HTML to insert word breaks into.\n * @param {function(number, number, boolean): boolean} hasGraphemeBreak A\n *     function determining if there is a grapheme break between two characters,\n *     in the same signature as goog.i18n.GraphemeBreak.hasGraphemeBreak.\n * @param {number=} opt_maxlen Maximum length after which to ensure\n *     there is a break.  Default is 10 characters.\n * @return {string} The string including word breaks.\n * @private\n */\ngoog.format.insertWordBreaksGeneric_ = function(\n    str, hasGraphemeBreak, opt_maxlen) {\n  var maxlen = opt_maxlen || 10;\n  if (maxlen > str.length) return str;\n\n  var rv = [];\n  var n = 0;  // The length of the current token\n\n  // This will contain the ampersand or less-than character if one of the\n  // two has been seen; otherwise, the value is zero.\n  var nestingCharCode = 0;\n\n  // First character position from input string that has not been outputted.\n  var lastDumpPosition = 0;\n\n  var charCode = 0;\n  for (var i = 0; i < str.length; i++) {\n    // Using charCodeAt versus charAt avoids allocating new string objects.\n    var lastCharCode = charCode;\n    charCode = str.charCodeAt(i);\n\n    // Don't add a WBR before characters that might be grapheme extending.\n    var isPotentiallyGraphemeExtending =\n        charCode >= goog.format.FIRST_GRAPHEME_EXTEND_ &&\n        !hasGraphemeBreak(lastCharCode, charCode, true);\n\n    // Don't add a WBR at the end of a word. For the purposes of determining\n    // work breaks, all ASCII control characters and some commonly encountered\n    // Unicode spacing characters are treated as breaking spaces.\n    if (n >= maxlen && !goog.format.isTreatedAsBreakingSpace_(charCode) &&\n        !isPotentiallyGraphemeExtending) {\n      // Flush everything seen so far, and append a word break.\n      rv.push(str.substring(lastDumpPosition, i), goog.format.WORD_BREAK_HTML);\n      lastDumpPosition = i;\n      n = 0;\n    }\n\n    if (!nestingCharCode) {\n      // Not currently within an HTML tag or entity\n\n      if (charCode == goog.format.WbrToken_.LT ||\n          charCode == goog.format.WbrToken_.AMP) {\n        // Entering an HTML Entity '&' or open tag '<'\n        nestingCharCode = charCode;\n      } else if (goog.format.isTreatedAsBreakingSpace_(charCode)) {\n        // A space or control character -- reset the token length\n        n = 0;\n      } else if (!goog.format.isInvisibleFormattingCharacter_(charCode)) {\n        // A normal flow character - increment.  For grapheme extending\n        // characters, this is not *technically* a new character.  However,\n        // since the grapheme break detector might be overly conservative,\n        // we have to continue incrementing, or else we won't even be able\n        // to add breaks when we get to things like punctuation.  For the\n        // case where we have a full grapheme break detector, it is okay if\n        // we occasionally break slightly early.\n        n++;\n      }\n    } else if (\n        charCode == goog.format.WbrToken_.GT &&\n        nestingCharCode == goog.format.WbrToken_.LT) {\n      // Leaving an HTML tag, treat the tag as zero-length\n      nestingCharCode = 0;\n    } else if (\n        charCode == goog.format.WbrToken_.SEMI_COLON &&\n        nestingCharCode == goog.format.WbrToken_.AMP) {\n      // Leaving an HTML entity, treat it as length one\n      nestingCharCode = 0;\n      n++;\n    }\n  }\n\n  // Take care of anything we haven't flushed so far.\n  rv.push(str.substr(lastDumpPosition));\n\n  return rv.join('');\n};\n\n\n/**\n * Inserts word breaks into an HTML string at a given interval.\n *\n * This method is as aggressive as possible, using a full table of Unicode\n * characters where it is legal to insert word breaks; however, this table\n * comes at a 2.5k pre-gzip (~1k post-gzip) size cost.  Consider using\n * insertWordBreaksBasic to minimize the size impact.\n *\n * @param {string} str HTML to insert word breaks into.\n * @param {number=} opt_maxlen Maximum length after which to ensure there is a\n *     break.  Default is 10 characters.\n * @return {string} The string including word breaks.\n * @deprecated Prefer wrapping with CSS word-wrap: break-word.\n */\ngoog.format.insertWordBreaks = function(str, opt_maxlen) {\n  return goog.format.insertWordBreaksGeneric_(\n      str, goog.i18n.GraphemeBreak.hasGraphemeBreak, opt_maxlen);\n};\n\n\n/**\n * Determines conservatively if a character has a Grapheme break.\n *\n * Conforms to a similar signature as goog.i18n.GraphemeBreak, but is overly\n * conservative, returning true only for characters in common scripts that\n * are simple to account for.\n *\n * @param {number} lastCharCode The previous character code.  Ignored.\n * @param {number} charCode The character code under consideration.  It must be\n *     at least \\u0300 as a precondition -- this case is covered by\n *     insertWordBreaksGeneric_.\n * @param {boolean=} opt_extended Ignored, to conform with the interface.\n * @return {boolean} Whether it is one of the recognized subsets of characters\n *     with a grapheme break.\n * @private\n */\ngoog.format.conservativelyHasGraphemeBreak_ = function(\n    lastCharCode, charCode, opt_extended) {\n  // Return false for everything except the most common Cyrillic characters.\n  // Don't worry about Latin characters, because insertWordBreaksGeneric_\n  // itself already handles those.\n  // TODO(gboyer): Also account for Greek, Armenian, and Georgian if it is\n  // simple to do so.\n  return charCode >= 0x400 && charCode < 0x523;\n};\n\n\n// TODO(gboyer): Consider using a compile-time flag to switch implementations\n// rather than relying on the developers to toggle implementations.\n/**\n * Inserts word breaks into an HTML string at a given interval.\n *\n * This method is less aggressive than insertWordBreaks, only inserting\n * breaks next to punctuation and between Latin or Cyrillic characters.\n * However, this is good enough for the common case of URLs.  It also\n * works for all Latin and Cyrillic languages, plus CJK has no need for word\n * breaks.  When this method is used, goog.i18n.GraphemeBreak may be dead\n * code eliminated.\n *\n * @param {string} str HTML to insert word breaks into.\n * @param {number=} opt_maxlen Maximum length after which to ensure there is a\n *     break.  Default is 10 characters.\n * @return {string} The string including word breaks.\n * @deprecated Prefer wrapping with CSS word-wrap: break-word.\n */\ngoog.format.insertWordBreaksBasic = function(str, opt_maxlen) {\n  return goog.format.insertWordBreaksGeneric_(\n      str, goog.format.conservativelyHasGraphemeBreak_, opt_maxlen);\n};\n\n\n/**\n * True iff the current userAgent is IE8 or above.\n * @type {boolean}\n * @private\n */\ngoog.format.IS_IE8_OR_ABOVE_ =\n    goog.userAgent.IE && goog.userAgent.isVersionOrHigher(8);\n\n\n/**\n * Constant for the WBR replacement used by insertWordBreaks.  Safari requires\n * &lt;wbr&gt;&lt;/wbr&gt;, Opera needs the &shy; entity, though this will give\n * a visible hyphen at breaks.  IE8 uses a zero width space. Other browsers just\n * use &lt;wbr&gt;.\n * @type {string}\n */\ngoog.format.WORD_BREAK_HTML =\n    goog.userAgent.WEBKIT ? '<wbr></wbr>' : goog.userAgent.OPERA ?\n                            '&shy;' :\n                            goog.format.IS_IE8_OR_ABOVE_ ? '&#8203;' : '<wbr>';\n\n\n/**\n * Tokens used within insertWordBreaks.\n * @private\n * @enum {number}\n */\ngoog.format.WbrToken_ = {\n  LT: 60,          // '<'.charCodeAt(0)\n  GT: 62,          // '>'.charCodeAt(0)\n  AMP: 38,         // '&'.charCodeAt(0)\n  SEMI_COLON: 59,  // ';'.charCodeAt(0)\n  SPACE: 32        // ' '.charCodeAt(0)\n};\n","^9I",1579837703000,"^9J",["^9K",["^9L","~$goog.i18n.GraphemeBreak","^9>","^:S"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/format/format.js"],"^:1",["^9K",["~$goog.format"]],"^9<",true,"^9=",["^9>","^SD","^9L","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.vec.vec3.js","^9C",["^9D","goog/vec/vec3.js"],"^9E","goog/vec/vec3.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Supplies 3 element vectors that are compatible with WebGL.\n * Each element is a float32 since that is typically the desired size of a\n * 3-vector in the GPU.  The API is structured to avoid unnecessary memory\n * allocations.  The last parameter will typically be the output vector and\n * an object can be both an input and output parameter to all methods except\n * where noted.\n *\n */\ngoog.provide('goog.vec.Vec3');\n\n/** @suppress {extraRequire} */\ngoog.require('goog.vec');\n\n/** @typedef {!goog.vec.Float32} */ goog.vec.Vec3.Float32;\n/** @typedef {!goog.vec.Float64} */ goog.vec.Vec3.Float64;\n/** @typedef {!goog.vec.Number} */ goog.vec.Vec3.Number;\n/** @typedef {!goog.vec.AnyType} */ goog.vec.Vec3.AnyType;\n\n// The following two types are deprecated - use the above types instead.\n/** @typedef {!Float32Array} */ goog.vec.Vec3.Type;\n/** @typedef {!goog.vec.ArrayType} */ goog.vec.Vec3.Vec3Like;\n\n\n/**\n * Creates a 3 element vector of Float32. The array is initialized to zero.\n *\n * @return {!goog.vec.Vec3.Float32} The new 3 element array.\n */\ngoog.vec.Vec3.createFloat32 = function() {\n  return new Float32Array(3);\n};\n\n\n/**\n * Creates a 3 element vector of Float64. The array is initialized to zero.\n *\n * @return {!goog.vec.Vec3.Float64} The new 3 element array.\n */\ngoog.vec.Vec3.createFloat64 = function() {\n  return new Float64Array(3);\n};\n\n\n/**\n * Creates a 3 element vector of Number. The array is initialized to zero.\n *\n * @return {!goog.vec.Vec3.Number} The new 3 element array.\n */\ngoog.vec.Vec3.createNumber = function() {\n  var a = new Array(3);\n  goog.vec.Vec3.setFromValues(a, 0, 0, 0);\n  return a;\n};\n\n\n/**\n * Creates a 3 element vector of Float32Array. The array is initialized to zero.\n *\n * @deprecated Use createFloat32.\n * @return {!goog.vec.Vec3.Type} The new 3 element array.\n */\ngoog.vec.Vec3.create = function() {\n  return new Float32Array(3);\n};\n\n\n/**\n * Creates a new 3 element Float32 vector initialized with the value from the\n * given array.\n *\n * @param {goog.vec.Vec3.AnyType} vec The source 3 element array.\n * @return {!goog.vec.Vec3.Float32} The new 3 element array.\n */\ngoog.vec.Vec3.createFloat32FromArray = function(vec) {\n  var newVec = goog.vec.Vec3.createFloat32();\n  goog.vec.Vec3.setFromArray(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Creates a new 3 element Float32 vector initialized with the supplied values.\n *\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @return {!goog.vec.Vec3.Float32} The new vector.\n */\ngoog.vec.Vec3.createFloat32FromValues = function(v0, v1, v2) {\n  var a = goog.vec.Vec3.createFloat32();\n  goog.vec.Vec3.setFromValues(a, v0, v1, v2);\n  return a;\n};\n\n\n/**\n * Creates a clone of the given 3 element Float32 vector.\n *\n * @param {goog.vec.Vec3.Float32} vec The source 3 element vector.\n * @return {!goog.vec.Vec3.Float32} The new cloned vector.\n */\ngoog.vec.Vec3.cloneFloat32 = goog.vec.Vec3.createFloat32FromArray;\n\n\n/**\n * Creates a new 3 element Float64 vector initialized with the value from the\n * given array.\n *\n * @param {goog.vec.Vec3.AnyType} vec The source 3 element array.\n * @return {!goog.vec.Vec3.Float64} The new 3 element array.\n */\ngoog.vec.Vec3.createFloat64FromArray = function(vec) {\n  var newVec = goog.vec.Vec3.createFloat64();\n  goog.vec.Vec3.setFromArray(newVec, vec);\n  return newVec;\n};\n\n\n/**\n* Creates a new 3 element Float64 vector initialized with the supplied values.\n*\n* @param {number} v0 The value for element at index 0.\n* @param {number} v1 The value for element at index 1.\n* @param {number} v2 The value for element at index 2.\n* @return {!goog.vec.Vec3.Float64} The new vector.\n*/\ngoog.vec.Vec3.createFloat64FromValues = function(v0, v1, v2) {\n  var vec = goog.vec.Vec3.createFloat64();\n  goog.vec.Vec3.setFromValues(vec, v0, v1, v2);\n  return vec;\n};\n\n\n/**\n * Creates a clone of the given 3 element vector.\n *\n * @param {goog.vec.Vec3.Float64} vec The source 3 element vector.\n * @return {!goog.vec.Vec3.Float64} The new cloned vector.\n */\ngoog.vec.Vec3.cloneFloat64 = goog.vec.Vec3.createFloat64FromArray;\n\n\n/**\n * Creates a new 3 element vector initialized with the value from the given\n * array.\n *\n * @deprecated Use createFloat32FromArray.\n * @param {goog.vec.Vec3.Vec3Like} vec The source 3 element array.\n * @return {!goog.vec.Vec3.Type} The new 3 element array.\n */\ngoog.vec.Vec3.createFromArray = function(vec) {\n  var newVec = goog.vec.Vec3.create();\n  goog.vec.Vec3.setFromArray(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Creates a new 3 element vector initialized with the supplied values.\n *\n * @deprecated Use createFloat32FromValues.\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @return {!goog.vec.Vec3.Type} The new vector.\n */\ngoog.vec.Vec3.createFromValues = function(v0, v1, v2) {\n  var vec = goog.vec.Vec3.create();\n  goog.vec.Vec3.setFromValues(vec, v0, v1, v2);\n  return vec;\n};\n\n\n/**\n * Creates a clone of the given 3 element vector.\n *\n * @deprecated Use cloneFloat32.\n * @param {goog.vec.Vec3.Vec3Like} vec The source 3 element vector.\n * @return {!goog.vec.Vec3.Type} The new cloned vector.\n */\ngoog.vec.Vec3.clone = function(vec) {\n  var newVec = goog.vec.Vec3.create();\n  goog.vec.Vec3.setFromArray(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Initializes the vector with the given values.\n *\n * @param {goog.vec.Vec3.AnyType} vec The vector to receive the values.\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @return {!goog.vec.Vec3.AnyType} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec3.setFromValues = function(vec, v0, v1, v2) {\n  vec[0] = v0;\n  vec[1] = v1;\n  vec[2] = v2;\n  return vec;\n};\n\n\n/**\n * Initializes the vector with the given array of values.\n *\n * @param {goog.vec.Vec3.AnyType} vec The vector to receive the\n *     values.\n * @param {goog.vec.Vec3.AnyType} values The array of values.\n * @return {!goog.vec.Vec3.AnyType} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec3.setFromArray = function(vec, values) {\n  vec[0] = values[0];\n  vec[1] = values[1];\n  vec[2] = values[2];\n  return vec;\n};\n\n\n/**\n * Performs a component-wise addition of vec0 and vec1 together storing the\n * result into resultVec.\n *\n * @param {goog.vec.Vec3.AnyType} vec0 The first addend.\n * @param {goog.vec.Vec3.AnyType} vec1 The second addend.\n * @param {goog.vec.Vec3.AnyType} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.Vec3.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec3.add = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] + vec1[0];\n  resultVec[1] = vec0[1] + vec1[1];\n  resultVec[2] = vec0[2] + vec1[2];\n  return resultVec;\n};\n\n\n/**\n * Performs a component-wise subtraction of vec1 from vec0 storing the\n * result into resultVec.\n *\n * @param {goog.vec.Vec3.AnyType} vec0 The minuend.\n * @param {goog.vec.Vec3.AnyType} vec1 The subtrahend.\n * @param {goog.vec.Vec3.AnyType} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.Vec3.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec3.subtract = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] - vec1[0];\n  resultVec[1] = vec0[1] - vec1[1];\n  resultVec[2] = vec0[2] - vec1[2];\n  return resultVec;\n};\n\n\n/**\n * Negates vec0, storing the result into resultVec.\n *\n * @param {goog.vec.Vec3.AnyType} vec0 The vector to negate.\n * @param {goog.vec.Vec3.AnyType} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.Vec3.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec3.negate = function(vec0, resultVec) {\n  resultVec[0] = -vec0[0];\n  resultVec[1] = -vec0[1];\n  resultVec[2] = -vec0[2];\n  return resultVec;\n};\n\n\n/**\n * Takes the absolute value of each component of vec0 storing the result in\n * resultVec.\n *\n * @param {goog.vec.Vec3.AnyType} vec0 The source vector.\n * @param {goog.vec.Vec3.AnyType} resultVec The vector to receive the result.\n *     May be vec0.\n * @return {!goog.vec.Vec3.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec3.abs = function(vec0, resultVec) {\n  resultVec[0] = Math.abs(vec0[0]);\n  resultVec[1] = Math.abs(vec0[1]);\n  resultVec[2] = Math.abs(vec0[2]);\n  return resultVec;\n};\n\n\n/**\n * Multiplies each component of vec0 with scalar storing the product into\n * resultVec.\n *\n * @param {goog.vec.Vec3.AnyType} vec0 The source vector.\n * @param {number} scalar The value to multiply with each component of vec0.\n * @param {goog.vec.Vec3.AnyType} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.Vec3.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec3.scale = function(vec0, scalar, resultVec) {\n  resultVec[0] = vec0[0] * scalar;\n  resultVec[1] = vec0[1] * scalar;\n  resultVec[2] = vec0[2] * scalar;\n  return resultVec;\n};\n\n\n/**\n * Returns the magnitudeSquared of the given vector.\n *\n * @param {goog.vec.Vec3.AnyType} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.Vec3.magnitudeSquared = function(vec0) {\n  var x = vec0[0], y = vec0[1], z = vec0[2];\n  return x * x + y * y + z * z;\n};\n\n\n/**\n * Returns the magnitude of the given vector.\n *\n * @param {goog.vec.Vec3.AnyType} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.Vec3.magnitude = function(vec0) {\n  var x = vec0[0], y = vec0[1], z = vec0[2];\n  return Math.sqrt(x * x + y * y + z * z);\n};\n\n\n/**\n * Normalizes the given vector storing the result into resultVec.\n *\n * @param {goog.vec.Vec3.AnyType} vec0 The vector to normalize.\n * @param {goog.vec.Vec3.AnyType} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.Vec3.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec3.normalize = function(vec0, resultVec) {\n  var ilen = 1 / goog.vec.Vec3.magnitude(vec0);\n  resultVec[0] = vec0[0] * ilen;\n  resultVec[1] = vec0[1] * ilen;\n  resultVec[2] = vec0[2] * ilen;\n  return resultVec;\n};\n\n\n/**\n * Returns the scalar product of vectors v0 and v1.\n *\n * @param {goog.vec.Vec3.AnyType} v0 The first vector.\n * @param {goog.vec.Vec3.AnyType} v1 The second vector.\n * @return {number} The scalar product.\n */\ngoog.vec.Vec3.dot = function(v0, v1) {\n  return v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2];\n};\n\n\n/**\n * Computes the vector (cross) product of v0 and v1 storing the result into\n * resultVec.\n *\n * @param {goog.vec.Vec3.AnyType} v0 The first vector.\n * @param {goog.vec.Vec3.AnyType} v1 The second vector.\n * @param {goog.vec.Vec3.AnyType} resultVec The vector to receive the\n *     results. May be either v0 or v1.\n * @return {!goog.vec.Vec3.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec3.cross = function(v0, v1, resultVec) {\n  var x0 = v0[0], y0 = v0[1], z0 = v0[2];\n  var x1 = v1[0], y1 = v1[1], z1 = v1[2];\n  resultVec[0] = y0 * z1 - z0 * y1;\n  resultVec[1] = z0 * x1 - x0 * z1;\n  resultVec[2] = x0 * y1 - y0 * x1;\n  return resultVec;\n};\n\n\n/**\n * Returns the squared distance between two points.\n *\n * @param {goog.vec.Vec3.AnyType} vec0 First point.\n * @param {goog.vec.Vec3.AnyType} vec1 Second point.\n * @return {number} The squared distance between the points.\n */\ngoog.vec.Vec3.distanceSquared = function(vec0, vec1) {\n  var x = vec0[0] - vec1[0];\n  var y = vec0[1] - vec1[1];\n  var z = vec0[2] - vec1[2];\n  return x * x + y * y + z * z;\n};\n\n\n/**\n * Returns the distance between two points.\n *\n * @param {goog.vec.Vec3.AnyType} vec0 First point.\n * @param {goog.vec.Vec3.AnyType} vec1 Second point.\n * @return {number} The distance between the points.\n */\ngoog.vec.Vec3.distance = function(vec0, vec1) {\n  return Math.sqrt(goog.vec.Vec3.distanceSquared(vec0, vec1));\n};\n\n\n/**\n * Returns a unit vector pointing from one point to another.\n * If the input points are equal then the result will be all zeros.\n *\n * @param {goog.vec.Vec3.AnyType} vec0 Origin point.\n * @param {goog.vec.Vec3.AnyType} vec1 Target point.\n * @param {goog.vec.Vec3.AnyType} resultVec The vector to receive the\n *     results (may be vec0 or vec1).\n * @return {!goog.vec.Vec3.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec3.direction = function(vec0, vec1, resultVec) {\n  var x = vec1[0] - vec0[0];\n  var y = vec1[1] - vec0[1];\n  var z = vec1[2] - vec0[2];\n  var d = Math.sqrt(x * x + y * y + z * z);\n  if (d) {\n    d = 1 / d;\n    resultVec[0] = x * d;\n    resultVec[1] = y * d;\n    resultVec[2] = z * d;\n  } else {\n    resultVec[0] = resultVec[1] = resultVec[2] = 0;\n  }\n  return resultVec;\n};\n\n\n/**\n * Linearly interpolate from vec0 to v1 according to f. The value of f should be\n * in the range [0..1] otherwise the results are undefined.\n *\n * @param {goog.vec.Vec3.AnyType} v0 The first vector.\n * @param {goog.vec.Vec3.AnyType} v1 The second vector.\n * @param {number} f The interpolation factor.\n * @param {goog.vec.Vec3.AnyType} resultVec The vector to receive the\n *     results (may be v0 or v1).\n * @return {!goog.vec.Vec3.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec3.lerp = function(v0, v1, f, resultVec) {\n  var x = v0[0], y = v0[1], z = v0[2];\n  resultVec[0] = (v1[0] - x) * f + x;\n  resultVec[1] = (v1[1] - y) * f + y;\n  resultVec[2] = (v1[2] - z) * f + z;\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the larger values in resultVec.\n *\n * @param {goog.vec.Vec3.AnyType} vec0 The source vector.\n * @param {goog.vec.Vec3.AnyType|number} limit The limit vector or scalar.\n * @param {goog.vec.Vec3.AnyType} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.Vec3.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec3.max = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.max(vec0[0], limit);\n    resultVec[1] = Math.max(vec0[1], limit);\n    resultVec[2] = Math.max(vec0[2], limit);\n  } else {\n    resultVec[0] = Math.max(vec0[0], limit[0]);\n    resultVec[1] = Math.max(vec0[1], limit[1]);\n    resultVec[2] = Math.max(vec0[2], limit[2]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the smaller values in resultVec.\n *\n * @param {goog.vec.Vec3.AnyType} vec0 The source vector.\n * @param {goog.vec.Vec3.AnyType|number} limit The limit vector or scalar.\n * @param {goog.vec.Vec3.AnyType} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.Vec3.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec3.min = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.min(vec0[0], limit);\n    resultVec[1] = Math.min(vec0[1], limit);\n    resultVec[2] = Math.min(vec0[2], limit);\n  } else {\n    resultVec[0] = Math.min(vec0[0], limit[0]);\n    resultVec[1] = Math.min(vec0[1], limit[1]);\n    resultVec[2] = Math.min(vec0[2], limit[2]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Returns true if the components of v0 are equal to the components of v1.\n *\n * @param {goog.vec.Vec3.AnyType} v0 The first vector.\n * @param {goog.vec.Vec3.AnyType} v1 The second vector.\n * @return {boolean} True if the vectors are equal, false otherwise.\n */\ngoog.vec.Vec3.equals = function(v0, v1) {\n  return v0.length == v1.length && v0[0] == v1[0] && v0[1] == v1[1] &&\n      v0[2] == v1[2];\n};\n","^9I",1579837703000,"^9J",["^9K",["^;2","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/vec3.js"],"^:1",["^9K",["~$goog.vec.Vec3"]],"^9<",true,"^9=",["^9>","^;2"]],["^ ","^9A",[1579837703000],"^9B","goog.net.tmpnetwork.js","^9C",["^9D","goog/net/tmpnetwork.js"],"^9E","goog/net/tmpnetwork.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview tmpnetwork.js contains some temporary networking functions\n * for browserchannel which will be moved at a later date.\n */\n\n\n/**\n * Namespace for BrowserChannel\n */\ngoog.provide('goog.net.tmpnetwork');\n\ngoog.require('goog.Uri');\ngoog.require('goog.dom.safe');\ngoog.require('goog.net.ChannelDebug');\n\n\n/**\n * Default timeout to allow for google.com pings.\n * @type {number}\n */\ngoog.net.tmpnetwork.GOOGLECOM_TIMEOUT = 10000;\n\n\n/**\n * @define {string} url to use to test for internet connectivity.\n * Use protocol-relative URLs to avoid insecure content warnings in IE.\n */\ngoog.net.tmpnetwork.TEST_URL = goog.define(\n    'goog.net.tmpnetwork.TEST_URL', '//www.google.com/images/cleardot.gif');\n\n\n/**\n * Pings the network to check if an error is a server error or user's network\n * error.\n *\n * @param {Function} callback The function to call back with results.\n * @param {goog.Uri?=} opt_imageUri The URI of an image to use for the network\n *     test. You *must* provide an image URI; the default behavior is provided\n *     for compatibility with existing code, but the search team does not want\n *     people using images served off of google.com for this purpose. The\n *     default will go away when all usages have been changed.\n * @param {number=} opt_timeout Milliseconds before giving up.\n */\ngoog.net.tmpnetwork.testGoogleCom = function(\n    callback, opt_imageUri, opt_timeout) {\n  // We need to add a 'rand' to make sure the response is not fulfilled\n  // by browser cache.\n  var uri = opt_imageUri;\n  if (!uri) {\n    uri = new goog.Uri(goog.net.tmpnetwork.TEST_URL);\n    uri.makeUnique();\n  }\n  goog.net.tmpnetwork.testLoadImage(\n      uri.toString(), opt_timeout || goog.net.tmpnetwork.GOOGLECOM_TIMEOUT,\n      callback);\n};\n\n\n/**\n * Test loading the given image, retrying if necessary.\n * @param {string} url URL to the iamge.\n * @param {number} timeout Milliseconds before giving up.\n * @param {Function} callback Function to call with results.\n * @param {number} retries The number of times to retry.\n * @param {number=} opt_pauseBetweenRetriesMS Optional number of milliseconds\n *     between retries - defaults to 0.\n */\ngoog.net.tmpnetwork.testLoadImageWithRetries = function(\n    url, timeout, callback, retries, opt_pauseBetweenRetriesMS) {\n  var channelDebug = new goog.net.ChannelDebug();\n  channelDebug.debug('TestLoadImageWithRetries: ' + opt_pauseBetweenRetriesMS);\n  if (retries == 0) {\n    // no more retries, give up\n    callback(false);\n    return;\n  }\n\n  var pauseBetweenRetries = opt_pauseBetweenRetriesMS || 0;\n  retries--;\n  goog.net.tmpnetwork.testLoadImage(url, timeout, function(succeeded) {\n    if (succeeded) {\n      callback(true);\n    } else {\n      // try again\n      goog.global.setTimeout(function() {\n        goog.net.tmpnetwork.testLoadImageWithRetries(\n            url, timeout, callback, retries, pauseBetweenRetries);\n      }, pauseBetweenRetries);\n    }\n  });\n};\n\n\n/**\n * Test loading the given image.\n * @param {string} url URL to the image.\n * @param {number} timeout Milliseconds before giving up.\n * @param {Function} callback Function to call with results.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.net.tmpnetwork.testLoadImage = function(url, timeout, callback) {\n  var channelDebug = new goog.net.ChannelDebug();\n  channelDebug.debug('TestLoadImage: loading ' + url);\n  var img = new Image();\n  img.onload = function() {\n    try {\n      channelDebug.debug('TestLoadImage: loaded');\n      goog.net.tmpnetwork.clearImageCallbacks_(img);\n      callback(true);\n    } catch (e) {\n      channelDebug.dumpException(e);\n    }\n  };\n  img.onerror = function() {\n    try {\n      channelDebug.debug('TestLoadImage: error');\n      goog.net.tmpnetwork.clearImageCallbacks_(img);\n      callback(false);\n    } catch (e) {\n      channelDebug.dumpException(e);\n    }\n  };\n  img.onabort = function() {\n    try {\n      channelDebug.debug('TestLoadImage: abort');\n      goog.net.tmpnetwork.clearImageCallbacks_(img);\n      callback(false);\n    } catch (e) {\n      channelDebug.dumpException(e);\n    }\n  };\n  img.ontimeout = function() {\n    try {\n      channelDebug.debug('TestLoadImage: timeout');\n      goog.net.tmpnetwork.clearImageCallbacks_(img);\n      callback(false);\n    } catch (e) {\n      channelDebug.dumpException(e);\n    }\n  };\n\n  goog.global.setTimeout(function() {\n    if (img.ontimeout) {\n      img.ontimeout();\n    }\n  }, timeout);\n  goog.dom.safe.setImageSrc(img, url);\n};\n\n\n/**\n * Clear handlers to avoid memory leaks.\n * @param {Image} img The image to clear handlers from.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.net.tmpnetwork.clearImageCallbacks_ = function(img) {\n  // NOTE(user): Nullified individually to avoid compiler warnings\n  // (BUG 658126)\n  img.onload = null;\n  img.onerror = null;\n  img.onabort = null;\n  img.ontimeout = null;\n};\n","^9I",1579837703000,"^9J",["^9K",["^<Q","^<S","^9>","^@B"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/tmpnetwork.js"],"^:1",["^9K",["^<T"]],"^9<",true,"^9=",["^9>","^<S","^@B","^<Q"]],["^ ","^9A",[1579837703000],"^9B","goog.a11y.aria.attributes.js","^9C",["^9D","goog/a11y/aria/attributes.js"],"^9E","goog/a11y/aria/attributes.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview The file contains generated enumerations for ARIA states\n * and properties as defined by W3C ARIA standard:\n * http://www.w3.org/TR/wai-aria/.\n *\n * This is auto-generated code. Do not manually edit! For more details\n * about how to edit it via the generator check go/closure-ariagen.\n */\n\ngoog.provide('goog.a11y.aria.AutoCompleteValues');\ngoog.provide('goog.a11y.aria.CheckedValues');\ngoog.provide('goog.a11y.aria.DropEffectValues');\ngoog.provide('goog.a11y.aria.ExpandedValues');\ngoog.provide('goog.a11y.aria.GrabbedValues');\ngoog.provide('goog.a11y.aria.InvalidValues');\ngoog.provide('goog.a11y.aria.LivePriority');\ngoog.provide('goog.a11y.aria.OrientationValues');\ngoog.provide('goog.a11y.aria.PressedValues');\ngoog.provide('goog.a11y.aria.RelevantValues');\ngoog.provide('goog.a11y.aria.SelectedValues');\ngoog.provide('goog.a11y.aria.SortValues');\ngoog.provide('goog.a11y.aria.State');\n\n\n/**\n * ARIA states and properties.\n * @enum {string}\n */\ngoog.a11y.aria.State = {\n  // ARIA property for setting the currently active descendant of an element,\n  // for example the selected item in a list box. Value: ID of an element.\n  ACTIVEDESCENDANT: 'activedescendant',\n\n  // ARIA property that, if true, indicates that all of a changed region should\n  // be presented, instead of only parts. Value: one of {true, false}.\n  ATOMIC: 'atomic',\n\n  // ARIA property to specify that input completion is provided. Value:\n  // one of {'inline', 'list', 'both', 'none'}.\n  AUTOCOMPLETE: 'autocomplete',\n\n  // ARIA state to indicate that an element and its subtree are being updated.\n  // Value: one of {true, false}.\n  BUSY: 'busy',\n\n  // ARIA state for a checked item. Value: one of {'true', 'false', 'mixed',\n  // undefined}.\n  CHECKED: 'checked',\n\n  // ARIA state that defines an element's column index or position with respect\n  // to the total number of columns within a table, grid, or treegrid.\n  // Value: number.\n  COLINDEX: 'colindex',\n\n  // ARIA property that identifies the element or elements whose contents or\n  // presence are controlled by this element.\n  // Value: space-separated IDs of other elements.\n  CONTROLS: 'controls',\n\n  // ARIA property that identifies the element or elements that describe\n  // this element. Value: space-separated IDs of other elements.\n  DESCRIBEDBY: 'describedby',\n\n  // ARIA state for a disabled item. Value: one of {true, false}.\n  DISABLED: 'disabled',\n\n  // ARIA property that indicates what functions can be performed when a\n  // dragged object is released on the drop target.  Value: one of\n  // {'copy', 'move', 'link', 'execute', 'popup', 'none'}.\n  DROPEFFECT: 'dropeffect',\n\n  // ARIA state for setting whether the element like a tree node is expanded.\n  // Value: one of {true, false, undefined}.\n  EXPANDED: 'expanded',\n\n  // ARIA property that identifies the next element (or elements) in the\n  // recommended reading order of content. Value: space-separated ids of\n  // elements to flow to.\n  FLOWTO: 'flowto',\n\n  // ARIA state that indicates an element's \"grabbed\" state in drag-and-drop.\n  // Value: one of {true, false, undefined}.\n  GRABBED: 'grabbed',\n\n  // ARIA property indicating whether the element has a popup.\n  // Value: one of {true, false}.\n  HASPOPUP: 'haspopup',\n\n  // ARIA state indicating that the element is not visible or perceivable\n  // to any user. Value: one of {true, false}.\n  HIDDEN: 'hidden',\n\n  // ARIA state indicating that the entered value does not conform. Value:\n  // one of {false, true, 'grammar', 'spelling'}\n  INVALID: 'invalid',\n\n  // ARIA property that provides a label to override any other text, value, or\n  // contents used to describe this element. Value: string.\n  LABEL: 'label',\n\n  // ARIA property for setting the element which labels another element.\n  // Value: space-separated IDs of elements.\n  LABELLEDBY: 'labelledby',\n\n  // ARIA property for setting the level of an element in the hierarchy.\n  // Value: integer.\n  LEVEL: 'level',\n\n  // ARIA property indicating that an element will be updated, and\n  // describes the types of updates the user agents, assistive technologies,\n  // and user can expect from the live region. Value: one of {'off', 'polite',\n  // 'assertive'}.\n  LIVE: 'live',\n\n  // ARIA property indicating whether a text box can accept multiline input.\n  // Value: one of {true, false}.\n  MULTILINE: 'multiline',\n\n  // ARIA property indicating if the user may select more than one item.\n  // Value: one of {true, false}.\n  MULTISELECTABLE: 'multiselectable',\n\n  // ARIA property indicating if the element is horizontal or vertical.\n  // Value: one of {'vertical', 'horizontal'}.\n  ORIENTATION: 'orientation',\n\n  // ARIA property creating a visual, functional, or contextual parent/child\n  // relationship when the DOM hierarchy can't be used to represent it.\n  // Value: Space-separated IDs of elements.\n  OWNS: 'owns',\n\n  // ARIA property that defines an element's number of position in a list.\n  // Value: integer.\n  POSINSET: 'posinset',\n\n  // ARIA state for a pressed item.\n  // Value: one of {true, false, undefined, 'mixed'}.\n  PRESSED: 'pressed',\n\n  // ARIA property indicating that an element is not editable.\n  // Value: one of {true, false}.\n  READONLY: 'readonly',\n\n  // ARIA property indicating that change notifications within this subtree\n  // of a live region should be announced. Value: one of {'additions',\n  // 'removals', 'text', 'all', 'additions text'}.\n  RELEVANT: 'relevant',\n\n  // ARIA property indicating that user input is required on this element\n  // before a form may be submitted. Value: one of {true, false}.\n  REQUIRED: 'required',\n\n  // ARIA state that defines an element's row index or position with respect\n  // to the total number of rows within a table, grid, or treegrid.\n  // Value: number.\n  ROWINDEX: 'rowindex',\n\n  // ARIA state for setting the currently selected item in the list.\n  // Value: one of {true, false, undefined}.\n  SELECTED: 'selected',\n\n  // ARIA property defining the number of items in a list. Value: integer.\n  SETSIZE: 'setsize',\n\n  // ARIA property indicating if items are sorted. Value: one of {'ascending',\n  // 'descending', 'none', 'other'}.\n  SORT: 'sort',\n\n  // ARIA property for slider maximum value. Value: number.\n  VALUEMAX: 'valuemax',\n\n  // ARIA property for slider minimum value. Value: number.\n  VALUEMIN: 'valuemin',\n\n  // ARIA property for slider active value. Value: number.\n  VALUENOW: 'valuenow',\n\n  // ARIA property for slider active value represented as text.\n  // Value: string.\n  VALUETEXT: 'valuetext'\n};\n\n\n/**\n * ARIA state values for AutoCompleteValues.\n * @enum {string}\n */\ngoog.a11y.aria.AutoCompleteValues = {\n  // The system provides text after the caret as a suggestion\n  // for how to complete the field.\n  INLINE: 'inline',\n  // A list of choices appears from which the user can choose,\n  // but the edit box retains focus.\n  LIST: 'list',\n  // A list of choices appears and the currently selected suggestion\n  // also appears inline.\n  BOTH: 'both',\n  // No input completion suggestions are provided.\n  NONE: 'none'\n};\n\n\n/**\n * ARIA state values for DropEffectValues.\n * @enum {string}\n */\ngoog.a11y.aria.DropEffectValues = {\n  // A duplicate of the source object will be dropped into the target.\n  COPY: 'copy',\n  // The source object will be removed from its current location\n  // and dropped into the target.\n  MOVE: 'move',\n  // A reference or shortcut to the dragged object\n  // will be created in the target object.\n  LINK: 'link',\n  // A function supported by the drop target is\n  // executed, using the drag source as an input.\n  EXECUTE: 'execute',\n  // There is a popup menu or dialog that allows the user to choose\n  // one of the drag operations (copy, move, link, execute) and any other\n  // drag functionality, such as cancel.\n  POPUP: 'popup',\n  // No operation can be performed; effectively\n  // cancels the drag operation if an attempt is made to drop on this object.\n  NONE: 'none'\n};\n\n\n/**\n * ARIA state values for LivePriority.\n * @enum {string}\n */\ngoog.a11y.aria.LivePriority = {\n  // Updates to the region will not be presented to the user\n  // unless the assitive technology is currently focused on that region.\n  OFF: 'off',\n  // (Background change) Assistive technologies SHOULD announce\n  // updates at the next graceful opportunity, such as at the end of\n  // speaking the current sentence or when the user pauses typing.\n  POLITE: 'polite',\n  // This information has the highest priority and assistive\n  // technologies SHOULD notify the user immediately.\n  // Because an interruption may disorient users or cause them to not complete\n  // their current task, authors SHOULD NOT use the assertive value unless the\n  // interruption is imperative.\n  ASSERTIVE: 'assertive'\n};\n\n\n/**\n * ARIA state values for OrientationValues.\n * @enum {string}\n */\ngoog.a11y.aria.OrientationValues = {\n  // The element is oriented vertically.\n  VERTICAL: 'vertical',\n  // The element is oriented horizontally.\n  HORIZONTAL: 'horizontal'\n};\n\n\n/**\n * ARIA state values for RelevantValues.\n * @enum {string}\n */\ngoog.a11y.aria.RelevantValues = {\n  // Element nodes are added to the DOM within the live region.\n  ADDITIONS: 'additions',\n  // Text or element nodes within the live region are removed from the DOM.\n  REMOVALS: 'removals',\n  // Text is added to any DOM descendant nodes of the live region.\n  TEXT: 'text',\n  // Equivalent to the combination of all values, \"additions removals text\".\n  ALL: 'all'\n};\n\n\n/**\n * ARIA state values for SortValues.\n * @enum {string}\n */\ngoog.a11y.aria.SortValues = {\n  // Items are sorted in ascending order by this column.\n  ASCENDING: 'ascending',\n  // Items are sorted in descending order by this column.\n  DESCENDING: 'descending',\n  // There is no defined sort applied to the column.\n  NONE: 'none',\n  // A sort algorithm other than ascending or descending has been applied.\n  OTHER: 'other'\n};\n\n\n/**\n * ARIA state values for CheckedValues.\n * @enum {string}\n */\ngoog.a11y.aria.CheckedValues = {\n  // The selectable element is checked.\n  TRUE: 'true',\n  // The selectable element is not checked.\n  FALSE: 'false',\n  // Indicates a mixed mode value for a tri-state\n  // checkbox or menuitemcheckbox.\n  MIXED: 'mixed',\n  // The element does not support being checked.\n  UNDEFINED: 'undefined'\n};\n\n\n/**\n * ARIA state values for ExpandedValues.\n * @enum {string}\n */\ngoog.a11y.aria.ExpandedValues = {\n  // The element, or another grouping element it controls, is expanded.\n  TRUE: 'true',\n  // The element, or another grouping element it controls, is collapsed.\n  FALSE: 'false',\n  // The element, or another grouping element\n  // it controls, is neither expandable nor collapsible; all its\n  // child elements are shown or there are no child elements.\n  UNDEFINED: 'undefined'\n};\n\n\n/**\n * ARIA state values for GrabbedValues.\n * @enum {string}\n */\ngoog.a11y.aria.GrabbedValues = {\n  // Indicates that the element has been \"grabbed\" for dragging.\n  TRUE: 'true',\n  // Indicates that the element supports being dragged.\n  FALSE: 'false',\n  // Indicates that the element does not support being dragged.\n  UNDEFINED: 'undefined'\n};\n\n\n/**\n * ARIA state values for InvalidValues.\n * @enum {string}\n */\ngoog.a11y.aria.InvalidValues = {\n  // There are no detected errors in the value.\n  FALSE: 'false',\n  // The value entered by the user has failed validation.\n  TRUE: 'true',\n  // A grammatical error was detected.\n  GRAMMAR: 'grammar',\n  // A spelling error was detected.\n  SPELLING: 'spelling'\n};\n\n\n/**\n * ARIA state values for PressedValues.\n * @enum {string}\n */\ngoog.a11y.aria.PressedValues = {\n  // The element is pressed.\n  TRUE: 'true',\n  // The element supports being pressed but is not currently pressed.\n  FALSE: 'false',\n  // Indicates a mixed mode value for a tri-state toggle button.\n  MIXED: 'mixed',\n  // The element does not support being pressed.\n  UNDEFINED: 'undefined'\n};\n\n\n/**\n * ARIA state values for SelectedValues.\n * @enum {string}\n */\ngoog.a11y.aria.SelectedValues = {\n  // The selectable element is selected.\n  TRUE: 'true',\n  // The selectable element is not selected.\n  FALSE: 'false',\n  // The element is not selectable.\n  UNDEFINED: 'undefined'\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/a11y/aria/attributes.js"],"^:1",["^9K",["~$goog.a11y.aria.DropEffectValues","~$goog.a11y.aria.LivePriority","~$goog.a11y.aria.InvalidValues","~$goog.a11y.aria.ExpandedValues","~$goog.a11y.aria.OrientationValues","~$goog.a11y.aria.RelevantValues","~$goog.a11y.aria.GrabbedValues","~$goog.a11y.aria.AutoCompleteValues","~$goog.a11y.aria.SelectedValues","~$goog.a11y.aria.CheckedValues","~$goog.a11y.aria.PressedValues","^?M","~$goog.a11y.aria.SortValues"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.asynctestcase.js","^9C",["^9D","goog/testing/asynctestcase.js"],"^9E","goog/testing/asynctestcase.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved.\n\n/**\n * @fileoverview A class representing a set of test functions that use\n * asynchronous functions that cannot be meaningfully mocked.\n *\n * To create a Google-compatible JsUnit test using this test case, put the\n * following snippet in your test:\n *\n *   var asyncTestCase = goog.testing.AsyncTestCase.createAndInstall();\n *\n * To make the test runner wait for your asynchronous behaviour, use:\n *\n *   asyncTestCase.waitForAsync('Waiting for xhr to respond');\n *\n * The next test will not start until the following call is made, or a\n * timeout occurs:\n *\n *   asyncTestCase.continueTesting();\n *\n * There does NOT need to be a 1:1 mapping of waitForAsync calls and\n * continueTesting calls. The next test will be run after a single call to\n * continueTesting is made, as long as there is no subsequent call to\n * waitForAsync in the same thread.\n *\n * Example:\n *   // Returning here would cause the next test to be run.\n *   asyncTestCase.waitForAsync('description 1');\n *   // Returning here would *not* cause the next test to be run.\n *   // Only effect of additional waitForAsync() calls is an updated\n *   // description in the case of a timeout.\n *   asyncTestCase.waitForAsync('updated description');\n *   asyncTestCase.continueTesting();\n *   // Returning here would cause the next test to be run.\n *   asyncTestCase.waitForAsync('just kidding, still running.');\n *   // Returning here would *not* cause the next test to be run.\n *\n * The test runner can also be made to wait for more than one asynchronous\n * event with:\n *\n *   asyncTestCase.waitForSignals(n);\n *\n * The next test will not start until asyncTestCase.signal() is called n times,\n * or the test step timeout is exceeded.\n *\n * This class supports asynchronous behaviour in all test functions except for\n * tearDownPage. If such support is needed, it can be added.\n *\n * Example Usage:\n *\n *   var asyncTestCase = goog.testing.AsyncTestCase.createAndInstall();\n *   // Optionally, set a longer-than-normal step timeout.\n *   asyncTestCase.stepTimeout = 30 * 1000;\n *\n *   function testSetTimeout() {\n *     var step = 0;\n *     function stepCallback() {\n *       step++;\n *       switch (step) {\n *         case 1:\n *           var startTime = goog.now();\n *           asyncTestCase.waitForAsync('step 1');\n *           window.setTimeout(stepCallback, 100);\n *           break;\n *         case 2:\n *           assertTrue('Timeout fired too soon',\n *               goog.now() - startTime >= 100);\n *           asyncTestCase.waitForAsync('step 2');\n *           window.setTimeout(stepCallback, 100);\n *           break;\n *         case 3:\n *           assertTrue('Timeout fired too soon',\n *               goog.now() - startTime >= 200);\n *           asyncTestCase.continueTesting();\n *           break;\n *         default:\n *           fail('Unexpected call to stepCallback');\n *       }\n *     }\n *     stepCallback();\n *   }\n *\n * Known Issues:\n *   IE7 Exceptions:\n *     As the failingtest.html will show, it appears as though ie7 does not\n *     propagate an exception past a function called using the func.call()\n *     syntax. This causes case 3 of the failing tests (exceptions) to show up\n *     as timeouts in IE.\n *   window.onerror:\n *     This seems to catch errors only in ff2/ff3. It does not work in Safari or\n *     IE7. The consequence of this is that exceptions that would have been\n *     caught by window.onerror show up as timeouts.\n *\n * @author agrieve@google.com (Andrew Grieve)\n */\n\ngoog.setTestOnly('goog.testing.AsyncTestCase');\ngoog.provide('goog.testing.AsyncTestCase');\ngoog.provide('goog.testing.AsyncTestCase.ControlBreakingException');\n\ngoog.require('goog.asserts');\ngoog.require('goog.testing.TestCase');\ngoog.require('goog.testing.asserts');\n\n\n\n/**\n * A test case that is capable of running tests that contain asynchronous logic.\n * @param {string=} opt_name A descriptive name for the test case.\n * @extends {goog.testing.TestCase}\n * @constructor\n * @deprecated Use goog.testing.TestCase instead. goog.testing.TestCase now\n *    supports async testing using promises.\n */\ngoog.testing.AsyncTestCase = function(opt_name) {\n  goog.testing.TestCase.call(this, opt_name);\n};\ngoog.inherits(goog.testing.AsyncTestCase, goog.testing.TestCase);\n\n\n/**\n * Represents result of top stack function call.\n * @typedef {{controlBreakingExceptionThrown: boolean, message: string}}\n * @private\n */\ngoog.testing.AsyncTestCase.TopStackFuncResult_;\n\n\n\n/**\n * An exception class used solely for control flow.\n * @param {string=} opt_message Error message.\n * @constructor\n * @extends {Error}\n * @final\n */\ngoog.testing.AsyncTestCase.ControlBreakingException = function(opt_message) {\n  goog.testing.AsyncTestCase.ControlBreakingException.base(\n      this, 'constructor', opt_message);\n\n  /**\n   * The exception message.\n   * @type {string}\n   */\n  this.message = opt_message || '';\n};\ngoog.inherits(goog.testing.AsyncTestCase.ControlBreakingException, Error);\n\n\n/**\n * Return value for .toString().\n * @type {string}\n */\ngoog.testing.AsyncTestCase.ControlBreakingException.TO_STRING =\n    '[AsyncTestCase.ControlBreakingException]';\n\n\n/**\n * Marks this object as a ControlBreakingException\n * @type {boolean}\n */\ngoog.testing.AsyncTestCase.ControlBreakingException.prototype\n    .isControlBreakingException = true;\n\n\n/** @override */\ngoog.testing.AsyncTestCase.ControlBreakingException.prototype.toString =\n    function() {\n  // This shows up in the console when the exception is not caught.\n  return goog.testing.AsyncTestCase.ControlBreakingException.TO_STRING;\n};\n\n\n/**\n * How long to wait for a single step of a test to complete in milliseconds.\n * A step starts when a call to waitForAsync() is made.\n * @type {number}\n */\ngoog.testing.AsyncTestCase.prototype.stepTimeout = 1000;\n\n\n/**\n * How long to wait after a failed test before moving onto the next one.\n * The purpose of this is to allow any pending async callbacks from the failing\n * test to finish up and not cause the next test to fail.\n * @type {number}\n */\ngoog.testing.AsyncTestCase.prototype.timeToSleepAfterFailure = 500;\n\n\n/**\n * Turn on extra logging to help debug failing async. tests.\n * @type {boolean}\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.enableDebugLogs_ = false;\n\n\n/**\n * A reference to the original asserts.js assert_() function.\n * @private {?function(?, ?, ?):?}\n */\ngoog.testing.AsyncTestCase.prototype.origAssert_;\n\n\n/**\n * A reference to the original asserts.js fail() function.\n * @private {?function(?)}\n */\ngoog.testing.AsyncTestCase.prototype.origFail_ = null;\n\n\n/**\n * A reference to the original window.onerror function.\n * @type {?Function|undefined}\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.origOnError_;\n\n\n/**\n * The stage of the test we are currently on.\n * @type {?Function|undefined}}\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.curStepFunc_;\n\n\n/**\n * The name of the stage of the test we are currently on.\n * @type {string}\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.curStepName_ = '';\n\n\n/**\n * The stage of the test we should run next.\n * @type {?function(this:goog.testing.AsyncTestCase, ...?):?}\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.nextStepFunc_ = null;\n\n\n/**\n * The name of the stage of the test we should run next.\n * @type {string}\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.nextStepName_ = '';\n\n\n/**\n * The handle to the current setTimeout timer.\n * @type {number}\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.timeoutHandle_ = 0;\n\n\n/**\n * Marks if the cleanUp() function has been called for the currently running\n * test.\n * @type {boolean}\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.cleanedUp_ = false;\n\n\n/**\n * The currently active test.\n * @type {goog.testing.TestCase.Test|undefined}\n * @protected\n */\ngoog.testing.AsyncTestCase.prototype.activeTest;\n\n\n/**\n * A flag to prevent recursive exception handling.\n * @type {boolean}\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.inException_ = false;\n\n\n/**\n * Flag used to determine if we can move to the next step in the testing loop.\n * @type {boolean}\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.isReady_ = true;\n\n\n/**\n * Number of signals to wait for before continuing testing when waitForSignals\n * is used.\n * @type {number}\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.expectedSignalCount_ = 0;\n\n\n/**\n * Number of signals received.\n * @type {number}\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.receivedSignalCount_ = 0;\n\n\n/**\n * Flag that tells us if there is a function in the call stack that will make\n * a call to pump_().\n * @type {boolean}\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.returnWillPump_ = false;\n\n\n/**\n * The number of times we have thrown a ControlBreakingException so that we\n * know not to complain in our window.onerror handler. In Webkit, window.onerror\n * is not supported, and so this counter will keep going up but we won't care\n * about it.\n * @type {number}\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.numControlExceptionsExpected_ = 0;\n\n\n/**\n * The current step name.\n * @return {string} Step name.\n * @protected\n */\ngoog.testing.AsyncTestCase.prototype.getCurrentStepName = function() {\n  return this.curStepName_;\n};\n\n\n/**\n * Preferred way of creating an AsyncTestCase. Creates one and initializes it\n * with the G_testRunner.\n * @param {string=} opt_name A descriptive name for the test case.\n * @return {!goog.testing.AsyncTestCase} The created AsyncTestCase.\n */\ngoog.testing.AsyncTestCase.createAndInstall = function(opt_name) {\n  var asyncTestCase = new goog.testing.AsyncTestCase(opt_name);\n  goog.testing.TestCase.initializeTestRunner(asyncTestCase);\n  return asyncTestCase;\n};\n\n\n/**\n * Informs the testcase not to continue to the next step in the test cycle\n * until continueTesting is called.\n * @param {string=} opt_name A description of what we are waiting for.\n */\ngoog.testing.AsyncTestCase.prototype.waitForAsync = function(opt_name) {\n  this.isReady_ = false;\n  this.curStepName_ = opt_name || this.curStepName_;\n\n  // Reset the timer that tracks if the async test takes too long.\n  this.stopTimeoutTimer_();\n  this.startTimeoutTimer_();\n};\n\n\n/**\n * Continue with the next step in the test cycle.\n */\ngoog.testing.AsyncTestCase.prototype.continueTesting = function() {\n  if (this.receivedSignalCount_ < this.expectedSignalCount_) {\n    var remaining = this.expectedSignalCount_ - this.receivedSignalCount_;\n    throw new Error('Still waiting for ' + remaining + ' signals.');\n  }\n  this.endCurrentStep_();\n};\n\n\n/**\n * Ends the current test step and queues the next test step to run.\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.endCurrentStep_ = function() {\n  if (!this.isReady_) {\n    // We are a potential entry point, so we pump.\n    this.isReady_ = true;\n    this.stopTimeoutTimer_();\n    // Run this in a setTimeout so that the caller has a chance to call\n    // waitForAsync() again before we continue.\n    this.timeout(goog.bind(this.pump_, this, null), 0);\n  }\n};\n\n\n/**\n * Informs the testcase not to continue to the next step in the test cycle\n * until signal is called the specified number of times. Within a test, this\n * function behaves additively if called multiple times; the number of signals\n * to wait for will be the sum of all expected number of signals this function\n * was called with.\n * @param {number} times The number of signals to receive before\n *    continuing testing.\n * @param {string=} opt_name A description of what we are waiting for.\n */\ngoog.testing.AsyncTestCase.prototype.waitForSignals = function(\n    times, opt_name) {\n  this.expectedSignalCount_ += times;\n  if (this.receivedSignalCount_ < this.expectedSignalCount_) {\n    this.waitForAsync(opt_name);\n  }\n};\n\n\n/**\n * Signals once to continue with the test. If this is the last signal that the\n * test was waiting on, call continueTesting.\n */\ngoog.testing.AsyncTestCase.prototype.signal = function() {\n  if (++this.receivedSignalCount_ === this.expectedSignalCount_ &&\n      this.expectedSignalCount_ > 0) {\n    this.endCurrentStep_();\n  }\n};\n\n\n/**\n * Handles an exception thrown by a test.\n * @param {?=} opt_e The exception object associated with the failure\n *     or a string.\n * @throws Always throws a ControlBreakingException.\n */\ngoog.testing.AsyncTestCase.prototype.doAsyncError = function(opt_e) {\n  // If we've caught an exception that we threw, then just pass it along. This\n  // can happen if doAsyncError() was called from a call to assert and then\n  // again by pump_().\n  if (opt_e && opt_e.isControlBreakingException) {\n    throw opt_e;\n  }\n\n  // Prevent another timeout error from triggering for this test step.\n  this.stopTimeoutTimer_();\n\n  // doError() uses test.name. Here, we create a dummy test and give it a more\n  // helpful name based on the step we're currently on.\n  var fakeTestObj =\n      new goog.testing.TestCase.Test(this.curStepName_, goog.nullFunction);\n  if (this.activeTest) {\n    fakeTestObj.name = this.activeTest.name + ' [' + fakeTestObj.name + ']';\n  }\n\n  if (this.activeTest) {\n    // Log the error, then fail the test.\n    this.recordError(fakeTestObj.name, opt_e);\n    this.doError(fakeTestObj);\n  } else {\n    this.exceptionBeforeTest = opt_e;\n  }\n\n  // This is a potential entry point, so we pump. We also add in a bit of a\n  // delay to try and prevent any async behavior from the failed test from\n  // causing the next test to fail.\n  this.timeout(\n      goog.bind(this.pump_, this, this.doAsyncErrorTearDown_),\n      this.timeToSleepAfterFailure);\n\n  // We just caught an exception, so we do not want the code above us on the\n  // stack to continue executing. If pump_ is in our call-stack, then it will\n  // batch together multiple errors, so we only increment the count if pump_ is\n  // not in the stack and let pump_ increment the count when it batches them.\n  if (!this.returnWillPump_) {\n    this.numControlExceptionsExpected_ += 1;\n    this.dbgLog_(\n        'doAsynError: numControlExceptionsExpected_ = ' +\n        this.numControlExceptionsExpected_ + ' and throwing exception.');\n  }\n\n  // Copy the error message to ControlBreakingException.\n  var message = '';\n  if (typeof opt_e == 'string') {\n    message = opt_e;\n  } else if (opt_e && opt_e.message) {\n    message = opt_e.message;\n  }\n  throw new goog.testing.AsyncTestCase.ControlBreakingException(message);\n};\n\n\n/**\n * Sets up the test page and then waits until the test case has been marked\n * as ready before executing the tests.\n * @override\n */\ngoog.testing.AsyncTestCase.prototype.runTests = function() {\n  this.hookAssert_();\n  this.hookOnError_();\n\n  goog.testing.TestCase.currentTestName = null;\n  this.setNextStep_(this.doSetUpPage_, 'setUpPage');\n  // We are an entry point, so we pump.\n  this.pump_();\n};\n\n\n/**\n * Starts the tests.\n * @override\n */\ngoog.testing.AsyncTestCase.prototype.cycleTests = function() {\n  // We are an entry point, so we pump.\n  this.saveMessage('Start');\n  this.setNextStep_(this.doIteration_, 'doIteration');\n  this.pump_();\n};\n\n\n/**\n * Finalizes the test case, called when the tests have finished executing.\n * @override\n */\ngoog.testing.AsyncTestCase.prototype.finalize = function() {\n  this.unhookAll_();\n  this.setNextStep_(null, 'finalized');\n  goog.testing.AsyncTestCase.superClass_.finalize.call(this);\n};\n\n\n/**\n * Enables verbose logging of what is happening inside of the AsyncTestCase.\n */\ngoog.testing.AsyncTestCase.prototype.enableDebugLogging = function() {\n  this.enableDebugLogs_ = true;\n};\n\n\n/**\n * Logs the given debug message to the console (when enabled).\n * @param {string} message The message to log.\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.dbgLog_ = function(message) {\n  if (this.enableDebugLogs_) {\n    this.log('AsyncTestCase - ' + message);\n  }\n};\n\n\n/**\n * Wraps doAsyncError() for when we are sure that the test runner has no user\n * code above it in the stack.\n * @param {string|Error=} opt_e The exception object associated with the\n *     failure or a string.\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.doTopOfStackAsyncError_ = function(opt_e) {\n\n  try {\n    this.doAsyncError(opt_e);\n  } catch (e) {\n    // We know that we are on the top of the stack, so there is no need to\n    // throw this exception in this case.\n    if (e.isControlBreakingException) {\n      this.numControlExceptionsExpected_ -= 1;\n      this.dbgLog_(\n          'doTopOfStackAsyncError_: numControlExceptionsExpected_ = ' +\n          this.numControlExceptionsExpected_ + ' and catching exception.');\n    } else {\n      throw e;\n    }\n  }\n};\n\n\n/**\n * Calls the tearDown function, catching any errors, and then moves on to\n * the next step in the testing cycle.\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.doAsyncErrorTearDown_ = function() {\n  if (this.inException_) {\n    // We get here if tearDown is throwing the error.\n    // Upon calling continueTesting, the inline function 'doAsyncError' (set\n    // below) is run.\n    this.endCurrentStep_();\n  } else {\n    this.inException_ = true;\n    this.isReady_ = true;\n\n    // The continue point is different depending on if the error happened in\n    // setUpPage() or in setUp()/test*()/tearDown().\n    var stepFuncAfterError = this.nextStepFunc_;\n    var stepNameAfterError = 'TestCase.execute (after error)';\n    if (this.activeTest) {\n      stepFuncAfterError = this.doIteration_;\n      stepNameAfterError = 'doIteration (after error)';\n    }\n\n    // We must set the next step before calling tearDown.\n    this.setNextStep_(function() {\n      this.inException_ = false;\n      // This is null when an error happens in setUpPage.\n      this.setNextStep_(stepFuncAfterError, stepNameAfterError);\n    }, 'doAsyncError');\n\n    // Call the test's tearDown().\n    if (!this.cleanedUp_) {\n      this.cleanedUp_ = true;\n      this.tearDown();\n    }\n  }\n};\n\n\n/**\n * Replaces the asserts.js assert_() and fail() functions with a wrappers to\n * catch the exceptions.\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.hookAssert_ = function() {\n  if (!this.origAssert_) {\n    this.origAssert_ = _assert;\n    this.origFail_ = fail;\n    var self = this;\n\n    _assert = function() {\n      var expectedUnknownThis = /** @type {?} */ (this);\n      try {\n        self.origAssert_.apply(expectedUnknownThis, arguments);\n      } catch (e) {\n        self.dbgLog_('Wrapping failed assert()');\n        self.doAsyncError(e);\n      }\n    };\n\n    /** @suppress {const} */\n    fail = function() {\n      var expectedUnknownThis = /** @type {?} */ (this);\n      try {\n        self.origFail_.apply(expectedUnknownThis, arguments);\n      } catch (e) {\n        self.dbgLog_('Wrapping fail()');\n        self.doAsyncError(e);\n      }\n    };\n  }\n};\n\n\n/**\n * Sets a window.onerror handler for catching exceptions that happen in async\n * callbacks. Note that as of Safari 3.1, Safari does not support this.\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.hookOnError_ = function() {\n  if (!this.origOnError_) {\n    this.origOnError_ = window.onerror;\n    var self = this;\n    window.onerror = function(error, url, line) {\n      // Ignore exceptions that we threw on purpose.\n      var cbe = goog.testing.AsyncTestCase.ControlBreakingException.TO_STRING;\n      if (String(error).indexOf(cbe) != -1 &&\n          self.numControlExceptionsExpected_) {\n        self.numControlExceptionsExpected_ -= 1;\n        self.dbgLog_(\n            'window.onerror: numControlExceptionsExpected_ = ' +\n            self.numControlExceptionsExpected_ + ' and ignoring exception. ' +\n            error);\n        // Tell the browser not to compain about the error.\n        return true;\n      } else {\n        self.dbgLog_('window.onerror caught exception.');\n        var message = error + '\\nURL: ' + url + '\\nLine: ' + line;\n        self.doTopOfStackAsyncError_(message);\n        // Tell the browser to complain about the error.\n        return false;\n      }\n    };\n  }\n};\n\n\n/**\n * Unhooks window.onerror and _assert.\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.unhookAll_ = function() {\n  if (this.origOnError_) {\n    window.onerror = this.origOnError_;\n    this.origOnError_ = null;\n\n    _assert = goog.asserts.assert(this.origAssert_);\n    this.origAssert_ = null;\n\n    /** @suppress {const} */\n    fail = goog.asserts.assert(this.origFail_);\n    this.origFail_ = null;\n  }\n};\n\n\n/**\n * Enables the timeout timer. This timer fires unless continueTesting is\n * called.\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.startTimeoutTimer_ = function() {\n  if (!this.timeoutHandle_ && this.stepTimeout > 0) {\n    this.timeoutHandle_ = this.timeout(goog.bind(function() {\n      this.dbgLog_('Timeout timer fired with id ' + this.timeoutHandle_);\n      this.timeoutHandle_ = 0;\n\n      this.doTopOfStackAsyncError_(\n          'Timed out while waiting for ' +\n          'continueTesting() to be called.');\n    }, this), this.stepTimeout);\n    this.dbgLog_('Started timeout timer with id ' + this.timeoutHandle_);\n  }\n};\n\n\n/**\n * Disables the timeout timer.\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.stopTimeoutTimer_ = function() {\n  if (this.timeoutHandle_) {\n    this.dbgLog_('Clearing timeout timer with id ' + this.timeoutHandle_);\n    this.clearTimeout(this.timeoutHandle_);\n    this.timeoutHandle_ = 0;\n  }\n};\n\n\n/**\n * Sets the next function to call in our sequence of async callbacks.\n * @param {?function(this:goog.testing.AsyncTestCase, ...?)} func\n *     The function that executes the next step.\n * @param {string} name A description of the next step.\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.setNextStep_ = function(func, name) {\n  this.nextStepFunc_ = func && goog.bind(func, this);\n  this.nextStepName_ = name;\n};\n\n\n/**\n * Calls the given function, redirecting any exceptions to doAsyncError.\n * @param {Function} func The function to call.\n * @return {!goog.testing.AsyncTestCase.TopStackFuncResult_} Returns a\n * TopStackFuncResult_.\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.callTopOfStackFunc_ = function(func) {\n\n  try {\n    func.call(this);\n    return {controlBreakingExceptionThrown: false, message: ''};\n  } catch (e) {\n    this.dbgLog_('Caught exception in callTopOfStackFunc_');\n\n    try {\n      this.doAsyncError(e);\n      return {controlBreakingExceptionThrown: false, message: ''};\n    } catch (e2) {\n      if (!e2.isControlBreakingException) {\n        throw e2;\n      }\n      return {controlBreakingExceptionThrown: true, message: e2.message};\n    }\n  }\n};\n\n\n/**\n * Calls the next callback when the isReady_ flag is true.\n * @param {Function=} opt_doFirst A function to call before pumping.\n * @private\n * @throws Throws a ControlBreakingException if there were any failing steps.\n */\ngoog.testing.AsyncTestCase.prototype.pump_ = function(opt_doFirst) {\n  // If this function is already above us in the call-stack, then we should\n  // return rather than pumping in order to minimize call-stack depth.\n  if (!this.returnWillPump_) {\n    this.setBatchTime(this.now());\n    this.returnWillPump_ = true;\n    var topFuncResult = {};\n\n    if (opt_doFirst) {\n      topFuncResult = this.callTopOfStackFunc_(opt_doFirst);\n    }\n    // Note: we don't check for this.running here because it is not set to true\n    // while executing setUpPage and tearDownPage.\n    // Also, if isReady_ is false, then one of two things will happen:\n    // 1. Our timeout callback will be called.\n    // 2. The tests will call continueTesting(), which will call pump_() again.\n    while (this.isReady_ && this.nextStepFunc_ &&\n           !topFuncResult.controlBreakingExceptionThrown) {\n      this.curStepFunc_ = this.nextStepFunc_;\n      this.curStepName_ = this.nextStepName_;\n      this.nextStepFunc_ = null;\n      this.nextStepName_ = '';\n\n      this.dbgLog_('Performing step: ' + this.curStepName_);\n      topFuncResult =\n          this.callTopOfStackFunc_(/** @type {Function} */ (this.curStepFunc_));\n\n      // If the max run time is exceeded call this function again async so as\n      // not to block the browser.\n      var delta = this.now() - this.getBatchTime();\n      if (delta > goog.testing.TestCase.maxRunTime &&\n          !topFuncResult.controlBreakingExceptionThrown) {\n        this.saveMessage('Breaking async');\n        var self = this;\n        this.timeout(function() { self.pump_(); }, 100);\n        break;\n      }\n    }\n    this.returnWillPump_ = false;\n  } else if (opt_doFirst) {\n    opt_doFirst.call(this);\n  }\n};\n\n\n/**\n * Sets up the test page and then waits until the test case has been marked\n * as ready before executing the tests.\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.doSetUpPage_ = function() {\n  this.setNextStep_(this.execute, 'TestCase.execute');\n  this.setUpPage();\n};\n\n\n/**\n * Step 1: Move to the next test.\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.doIteration_ = function() {\n  this.expectedSignalCount_ = 0;\n  this.receivedSignalCount_ = 0;\n  this.activeTest = this.next();\n  goog.testing.TestCase.currentTestName =\n      this.activeTest ? this.activeTest.name : null;\n  if (this.activeTest && this.running) {\n    this.result_.runCount++;\n    // If this test should be marked as having failed, doIteration will go\n    // straight to the next test.\n    if (this.maybeFailTestEarly(this.activeTest)) {\n      this.setNextStep_(this.doIteration_, 'doIteration');\n    } else {\n      this.setNextStep_(this.doSetUp_, 'setUp');\n    }\n  } else {\n    // All tests done.\n    this.finalize();\n  }\n};\n\n\n/**\n * Step 2: Call setUp().\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.doSetUp_ = function() {\n  this.log('Running test: ' + this.activeTest.name);\n  this.cleanedUp_ = false;\n  this.setNextStep_(this.doExecute_, this.activeTest.name);\n  this.setUp();\n};\n\n\n/**\n * Step 3: Call test.execute().\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.doExecute_ = function() {\n  this.setNextStep_(this.doTearDown_, 'tearDown');\n  this.activeTest.execute();\n};\n\n\n/**\n * Step 4: Call tearDown().\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.doTearDown_ = function() {\n  this.cleanedUp_ = true;\n  this.setNextStep_(this.doNext_, 'doNext');\n  this.tearDown();\n};\n\n\n/**\n * Step 5: Call doSuccess()\n * @private\n */\ngoog.testing.AsyncTestCase.prototype.doNext_ = function() {\n  this.setNextStep_(this.doIteration_, 'doIteration');\n  this.doSuccess(/** @type {goog.testing.TestCase.Test} */ (this.activeTest));\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^>X","^9>","^RT"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/asynctestcase.js"],"^:1",["^9K",["~$goog.testing.AsyncTestCase","~$goog.testing.AsyncTestCase.ControlBreakingException"]],"^9<",true,"^9=",["^9>","^:E","^RT","^>X"]],["^ ","^9A",[1579837703000],"^9B","goog.graphics.textelement.js","^9C",["^9D","goog/graphics/textelement.js"],"^9E","goog/graphics/textelement.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A thin wrapper around the DOM element for text elements.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.graphics.TextElement');\n\ngoog.require('goog.graphics.StrokeAndFillElement');\n\n\n\n/**\n * Interface for a graphics text element.\n * You should not construct objects from this constructor. The graphics\n * will return an implementation of this interface for you.\n *\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.AbstractGraphics} graphics The graphics creating\n *     this element.\n * @param {goog.graphics.Stroke?} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill?} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.StrokeAndFillElement}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n */\ngoog.graphics.TextElement = function(element, graphics, stroke, fill) {\n  goog.graphics.StrokeAndFillElement.call(\n      this, element, graphics, stroke, fill);\n};\ngoog.inherits(goog.graphics.TextElement, goog.graphics.StrokeAndFillElement);\n\n\n/**\n * Update the displayed text of the element.\n * @param {string} text The text to draw.\n */\ngoog.graphics.TextElement.prototype.setText = goog.abstractMethod;\n","^9I",1579837703000,"^9J",["^9K",["^9>","^;A"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/textelement.js"],"^:1",["^9K",["^@A"]],"^9<",true,"^9=",["^9>","^;A"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.dragdropdetector.js","^9C",["^9D","goog/ui/dragdropdetector.js"],"^9E","goog/ui/dragdropdetector.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Detects images dragged and dropped on to the window.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.ui.DragDropDetector');\ngoog.provide('goog.ui.DragDropDetector.EventType');\ngoog.provide('goog.ui.DragDropDetector.ImageDropEvent');\ngoog.provide('goog.ui.DragDropDetector.LinkDropEvent');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.string');\ngoog.require('goog.style');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Creates a new drag and drop detector.\n * @param {string=} opt_filePath The URL of the page to use for the detector.\n *     It should contain the same contents as dragdropdetector_target.html in\n *     the demos directory.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.ui.DragDropDetector = function(opt_filePath) {\n  goog.ui.DragDropDetector.base(this, 'constructor');\n\n  var iframe = goog.dom.createDom(goog.dom.TagName.IFRAME, {'frameborder': 0});\n  // In Firefox, we do all drop detection with an IFRAME.  In IE, we only use\n  // the IFRAME to capture copied, non-linked images.  (When we don't need it,\n  // we put a text INPUT before it and push it off screen.)\n  iframe.className = goog.userAgent.IE ?\n      goog.getCssName(\n          goog.ui.DragDropDetector.BASE_CSS_NAME_, 'ie-editable-iframe') :\n      goog.getCssName(\n          goog.ui.DragDropDetector.BASE_CSS_NAME_, 'w3c-editable-iframe');\n  iframe.src = opt_filePath || goog.ui.DragDropDetector.DEFAULT_FILE_PATH_;\n\n  this.element_ = /** @type {!HTMLIFrameElement} */ (iframe);\n\n  this.handler_ = new goog.events.EventHandler(this);\n  this.handler_.listen(iframe, goog.events.EventType.LOAD, this.initIframe_);\n\n  if (goog.userAgent.IE) {\n    // In IE, we have to bounce between an INPUT for catching links and an\n    // IFRAME for catching images.\n    this.textInput_ = goog.dom.createDom(goog.dom.TagName.INPUT, {\n      'type': goog.dom.InputType.TEXT,\n      'className':\n          goog.getCssName(goog.ui.DragDropDetector.BASE_CSS_NAME_, 'ie-input')\n    });\n\n    this.root_ = goog.dom.createDom(\n        goog.dom.TagName.DIV,\n        goog.getCssName(goog.ui.DragDropDetector.BASE_CSS_NAME_, 'ie-div'),\n        this.textInput_, iframe);\n  } else {\n    this.root_ = iframe;\n  }\n\n  document.body.appendChild(this.root_);\n};\ngoog.inherits(goog.ui.DragDropDetector, goog.events.EventTarget);\n\n\n/**\n * Drag and drop event types.\n * @enum {string}\n */\ngoog.ui.DragDropDetector.EventType = {\n  IMAGE_DROPPED: 'onimagedrop',\n  LINK_DROPPED: 'onlinkdrop'\n};\n\n\n/**\n * Browser specific drop event type.\n * @type {string}\n * @private\n */\ngoog.ui.DragDropDetector.DROP_EVENT_TYPE_ =\n    goog.userAgent.IE ? goog.events.EventType.DROP : 'dragdrop';\n\n\n/**\n * Initial value for clientX and clientY indicating that the location has\n * never been updated.\n */\ngoog.ui.DragDropDetector.INIT_POSITION = -10000;\n\n\n/**\n * Prefix for all CSS names.\n * @type {string}\n * @private\n */\ngoog.ui.DragDropDetector.BASE_CSS_NAME_ = goog.getCssName('goog-dragdrop');\n\n\n/**\n * @desc Message shown to users to inform them that they can't drag and drop\n *     local files.\n */\ngoog.ui.DragDropDetector.MSG_DRAG_DROP_LOCAL_FILE_ERROR = goog.getMsg(\n    'It is not possible to drag ' +\n    'and drop image files at this time.\\nPlease drag an image from your web ' +\n    'browser.');\n\n\n/**\n * @desc Message shown to users trying to drag and drop protected images from\n *     Flickr, etc.\n */\ngoog.ui.DragDropDetector.MSG_DRAG_DROP_PROTECTED_FILE_ERROR = goog.getMsg(\n    'The image you are ' +\n    'trying to drag has been blocked by the hosting site.');\n\n\n/**\n * A map of special case information for URLs that cannot be dropped.  Each\n * entry is of the form:\n *     regex: url regex\n *     message: user visible message about this special case\n * @type {Array<{regex: RegExp, message: string}>}\n * @private\n */\ngoog.ui.DragDropDetector.SPECIAL_CASE_URLS_ = [\n  {\n    regex: /^file:\\/\\/\\//,\n    message: goog.ui.DragDropDetector.MSG_DRAG_DROP_LOCAL_FILE_ERROR\n  },\n  {\n    regex: /flickr(.*)spaceball.gif$/,\n    message: goog.ui.DragDropDetector.MSG_DRAG_DROP_PROTECTED_FILE_ERROR\n  }\n];\n\n\n/**\n * Regex that matches anything that looks kind of like a URL.  It matches\n * nonspacechars://nonspacechars\n * @type {RegExp}\n * @private\n */\ngoog.ui.DragDropDetector.URL_LIKE_REGEX_ = /^\\S+:\\/\\/\\S*$/;\n\n\n/**\n * Path to the dragdrop.html file.\n * @type {string}\n * @private\n */\ngoog.ui.DragDropDetector.DEFAULT_FILE_PATH_ = 'dragdropdetector_target.html';\n\n\n/**\n * Our event handler object.\n * @type {goog.events.EventHandler<!goog.ui.DragDropDetector>}\n * @private\n */\ngoog.ui.DragDropDetector.prototype.handler_;\n\n\n/**\n * The root element (the IFRAME on most browsers, the DIV on IE).\n * @type {Element}\n * @private\n */\ngoog.ui.DragDropDetector.prototype.root_;\n\n\n/**\n * The text INPUT element used to detect link drops on IE.  null on Firefox.\n * @type {Element}\n * @private\n */\ngoog.ui.DragDropDetector.prototype.textInput_;\n\n\n/**\n * The iframe element.\n * @type {HTMLIFrameElement}\n * @private\n */\ngoog.ui.DragDropDetector.prototype.element_;\n\n\n/**\n * The iframe's window, null if the iframe hasn't loaded yet.\n * @type {?Window}\n * @private\n */\ngoog.ui.DragDropDetector.prototype.window_ = null;\n\n\n/**\n * The iframe's document, null if the iframe hasn't loaded yet.\n * @type {?Document}\n * @private\n */\ngoog.ui.DragDropDetector.prototype.document_ = null;\n\n\n/**\n * The iframe's body, null if the iframe hasn't loaded yet.\n * @type {?HTMLBodyElement}\n * @private\n */\ngoog.ui.DragDropDetector.prototype.body_ = null;\n\n\n/**\n * Whether we are in \"screen cover\" mode in which the iframe or div is\n * covering the entire screen.\n * @type {boolean}\n * @private\n */\ngoog.ui.DragDropDetector.prototype.isCoveringScreen_ = false;\n\n\n/**\n * The last position of the mouse while dragging.\n * @type {?goog.math.Coordinate}\n * @private\n */\ngoog.ui.DragDropDetector.prototype.mousePosition_ = null;\n\n\n/**\n * Initialize the iframe after it has loaded.\n * @private\n */\ngoog.ui.DragDropDetector.prototype.initIframe_ = function() {\n  // Set up a holder for position data.\n  this.mousePosition_ = new goog.math.Coordinate(\n      goog.ui.DragDropDetector.INIT_POSITION,\n      goog.ui.DragDropDetector.INIT_POSITION);\n\n  // Set up pointers to the important parts of the IFrame.\n  this.window_ = this.element_.contentWindow;\n  this.document_ = this.window_.document;\n  this.body_ = this.document_.body;\n\n  if (goog.userAgent.GECKO) {\n    this.document_.designMode = 'on';\n  } else if (!goog.userAgent.IE) {\n    // Bug 1667110\n    // In IE, we only set the IFrame body as content-editable when we bring it\n    // into view at the top of the page.  Otherwise it may take focus when the\n    // page is loaded, scrolling the user far offscreen.\n    // Note that this isn't easily unit-testable, since it depends on a\n    // browser-specific behavior with content-editable areas.\n    this.body_.contentEditable = true;\n  }\n\n  this.handler_.listen(\n      document.body, goog.events.EventType.DRAGENTER, this.coverScreen_);\n\n  if (goog.userAgent.IE) {\n    // IE only events.\n    // Set up events on the IFrame.\n    this.handler_\n        .listen(\n            this.body_,\n            [goog.events.EventType.DRAGENTER, goog.events.EventType.DRAGOVER],\n            goog.ui.DragDropDetector.enforceCopyEffect_)\n        .listen(this.body_, goog.events.EventType.MOUSEOUT, this.switchToInput_)\n        .listen(\n            this.body_, goog.events.EventType.DRAGLEAVE, this.uncoverScreen_)\n        .listen(\n            this.body_, goog.ui.DragDropDetector.DROP_EVENT_TYPE_,\n            function(e) {\n              this.trackMouse_(e);\n\n              // The drop event occurs before the content is added to the\n              // iframe.  We setTimeout so that handleNodeInserted_ is called\n              //  after the content is in the document.\n              goog.global.setTimeout(\n                  goog.bind(this.handleNodeInserted_, this, e), 0);\n              return true;\n            })\n        .\n\n        // Set up events on the DIV.\n        listen(\n            this.root_,\n            [goog.events.EventType.DRAGENTER, goog.events.EventType.DRAGOVER],\n            this.handleNewDrag_)\n        .listen(\n            this.root_,\n            [goog.events.EventType.MOUSEMOVE, goog.events.EventType.KEYPRESS],\n            this.uncoverScreen_)\n        .\n\n        // Set up events on the text INPUT.\n        listen(\n            this.textInput_, goog.events.EventType.DRAGOVER,\n            goog.events.Event.preventDefault)\n        .listen(\n            this.textInput_, goog.ui.DragDropDetector.DROP_EVENT_TYPE_,\n            this.handleInputDrop_);\n  } else {\n    // W3C events.\n    this.handler_\n        .listen(\n            this.body_, goog.ui.DragDropDetector.DROP_EVENT_TYPE_,\n            function(e) {\n              this.trackMouse_(e);\n              this.uncoverScreen_();\n            })\n        .listen(\n            this.body_,\n            [goog.events.EventType.MOUSEMOVE, goog.events.EventType.KEYPRESS],\n            this.uncoverScreen_)\n        // Detect content insertion.\n        .listen(this.document_, 'DOMNodeInserted', this.handleNodeInserted_);\n  }\n};\n\n\n/**\n * Enforce that anything dragged over the IFRAME is copied in to it, rather\n * than making it navigate to a different URL.\n * @param {goog.events.BrowserEvent} e The event to enforce copying on.\n * @private\n */\ngoog.ui.DragDropDetector.enforceCopyEffect_ = function(e) {\n  var event = e.getBrowserEvent();\n  // This function is only called on IE.\n  if (event.dataTransfer.dropEffect.toLowerCase() != 'copy') {\n    event.dataTransfer.dropEffect = 'copy';\n  }\n};\n\n\n/**\n * Cover the screen with the iframe.\n * @param {goog.events.BrowserEvent} e The event that caused this function call.\n * @private\n */\ngoog.ui.DragDropDetector.prototype.coverScreen_ = function(e) {\n  // Don't do anything if the drop effect is 'none' and we are in IE.\n  // It is set to 'none' in cases like dragging text inside a text area.\n  if (goog.userAgent.IE &&\n      e.getBrowserEvent().dataTransfer.dropEffect == 'none') {\n    return;\n  }\n\n  if (!this.isCoveringScreen_) {\n    this.isCoveringScreen_ = true;\n    if (goog.userAgent.IE) {\n      goog.style.setStyle(this.root_, 'top', '0');\n      this.body_.contentEditable = true;\n      this.switchToInput_(e);\n    } else {\n      goog.style.setStyle(this.root_, 'height', '5000px');\n    }\n  }\n};\n\n\n/**\n * Uncover the screen.\n * @private\n */\ngoog.ui.DragDropDetector.prototype.uncoverScreen_ = function() {\n  if (this.isCoveringScreen_) {\n    this.isCoveringScreen_ = false;\n    if (goog.userAgent.IE) {\n      this.body_.contentEditable = false;\n      goog.style.setStyle(this.root_, 'top', '-5000px');\n    } else {\n      goog.style.setStyle(this.root_, 'height', '10px');\n    }\n  }\n};\n\n\n/**\n * Re-insert the INPUT into the DIV.  Does nothing when the DIV is off screen.\n * @param {goog.events.BrowserEvent} e The event that caused this function call.\n * @private\n */\ngoog.ui.DragDropDetector.prototype.switchToInput_ = function(e) {\n  // This is only called on IE.\n  if (this.isCoveringScreen_) {\n    goog.style.setElementShown(this.textInput_, true);\n  }\n};\n\n\n/**\n * Remove the text INPUT so the IFRAME is showing.  Does nothing when the DIV is\n * off screen.\n * @param {goog.events.BrowserEvent} e The event that caused this function call.\n * @private\n */\ngoog.ui.DragDropDetector.prototype.switchToIframe_ = function(e) {\n  // This is only called on IE.\n  if (this.isCoveringScreen_) {\n    goog.style.setElementShown(this.textInput_, false);\n  }\n};\n\n\n/**\n * Handle a new drag event.\n * @param {goog.events.BrowserEvent} e The event object.\n * @return {boolean|undefined} Returns false in IE to cancel the event.\n * @private\n */\ngoog.ui.DragDropDetector.prototype.handleNewDrag_ = function(e) {\n  var event = e.getBrowserEvent();\n\n  // This is only called on IE.\n  if (event.dataTransfer.dropEffect == 'link') {\n    this.switchToInput_(e);\n    e.preventDefault();\n    return false;\n  }\n\n  // Things that aren't links can be placed in the contentEditable iframe.\n  this.switchToIframe_(e);\n\n  // No need to return true since for events return true is the same as no\n  // return.\n};\n\n\n/**\n * Handle mouse tracking.\n * @param {goog.events.BrowserEvent} e The event object.\n * @private\n */\ngoog.ui.DragDropDetector.prototype.trackMouse_ = function(e) {\n  this.mousePosition_.x = e.clientX;\n  this.mousePosition_.y = e.clientY;\n\n  // Check if the event is coming from within the iframe.\n  if (goog.dom.getOwnerDocument(/** @type {Node} */ (e.target)) != document) {\n    var iframePosition = goog.style.getClientPosition(this.element_);\n    this.mousePosition_.x += iframePosition.x;\n    this.mousePosition_.y += iframePosition.y;\n  }\n};\n\n\n/**\n * Handle a drop on the IE text INPUT.\n * @param {goog.events.BrowserEvent} e The event object.\n * @private\n */\ngoog.ui.DragDropDetector.prototype.handleInputDrop_ = function(e) {\n  this.dispatchEvent(\n      new goog.ui.DragDropDetector.LinkDropEvent(\n          e.getBrowserEvent().dataTransfer.getData('Text')));\n  this.uncoverScreen_();\n  e.preventDefault();\n};\n\n\n/**\n * Clear the contents of the iframe.\n * @private\n */\ngoog.ui.DragDropDetector.prototype.clearContents_ = function() {\n  if (goog.userAgent.WEBKIT) {\n    // Since this is called on a mutation event for the nodes we are going to\n    // clear, calling this right away crashes some versions of WebKit.  Wait\n    // until the events are finished.\n    goog.global.setTimeout(goog.bind(function() {\n      goog.dom.setTextContent(this, '');\n    }, this.body_), 0);\n  } else {\n    this.document_.execCommand('selectAll', false, null);\n    this.document_.execCommand('delete', false, null);\n    this.document_.execCommand('selectAll', false, null);\n  }\n};\n\n\n/**\n * Event handler called when the content of the iframe changes.\n * @param {goog.events.BrowserEvent} e The event that caused this function call.\n * @private\n */\ngoog.ui.DragDropDetector.prototype.handleNodeInserted_ = function(e) {\n  var uri;\n\n  if (this.body_.innerHTML.indexOf('<') == -1) {\n    // If the document contains no tags (i.e. is just text), try it out.\n    uri = goog.string.trim(goog.dom.getTextContent(this.body_));\n\n    // See if it looks kind of like a url.\n    if (!uri.match(goog.ui.DragDropDetector.URL_LIKE_REGEX_)) {\n      uri = null;\n    }\n  }\n\n  if (!uri) {\n    var imgs = goog.dom.getElementsByTagName(goog.dom.TagName.IMG, this.body_);\n    if (imgs && imgs.length) {\n      // TODO(robbyw): Grab all the images, instead of just the first.\n      var img = imgs[0];\n      uri = img.src;\n    }\n  }\n\n  if (uri) {\n    var specialCases = goog.ui.DragDropDetector.SPECIAL_CASE_URLS_;\n    var len = specialCases.length;\n    for (var i = 0; i < len; i++) {\n      var specialCase = specialCases[i];\n      if (uri.match(specialCase.regex)) {\n        alert(specialCase.message);\n        break;\n      }\n    }\n\n    // If no special cases matched, add the image.\n    if (i == len) {\n      this.dispatchEvent(\n          new goog.ui.DragDropDetector.ImageDropEvent(\n              uri, this.mousePosition_));\n      return;\n    }\n  }\n\n  var links = goog.dom.getElementsByTagName(goog.dom.TagName.A, this.body_);\n  if (links) {\n    for (i = 0, len = links.length; i < len; i++) {\n      this.dispatchEvent(\n          new goog.ui.DragDropDetector.LinkDropEvent(links[i].href));\n    }\n  }\n\n  this.clearContents_();\n  this.uncoverScreen_();\n};\n\n\n/** @override */\ngoog.ui.DragDropDetector.prototype.disposeInternal = function() {\n  goog.ui.DragDropDetector.base(this, 'disposeInternal');\n  this.handler_.dispose();\n  this.handler_ = null;\n};\n\n\n\n/**\n * Creates a new image drop event object.\n * @param {string} url The url of the dropped image.\n * @param {goog.math.Coordinate} position The screen position where the drop\n *     occurred.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.ui.DragDropDetector.ImageDropEvent = function(url, position) {\n  goog.ui.DragDropDetector.ImageDropEvent.base(\n      this, 'constructor', goog.ui.DragDropDetector.EventType.IMAGE_DROPPED);\n\n  /**\n   * The url of the image that was dropped.\n   * @type {string}\n   * @private\n   */\n  this.url_ = url;\n\n  /**\n   * The screen position where the drop occurred.\n   * @type {goog.math.Coordinate}\n   * @private\n   */\n  this.position_ = position;\n};\ngoog.inherits(goog.ui.DragDropDetector.ImageDropEvent, goog.events.Event);\n\n\n/**\n * @return {string} The url of the image that was dropped.\n */\ngoog.ui.DragDropDetector.ImageDropEvent.prototype.getUrl = function() {\n  return this.url_;\n};\n\n\n/**\n * @return {goog.math.Coordinate} The screen position where the drop occurred.\n *     This may be have x and y of goog.ui.DragDropDetector.INIT_POSITION,\n *     indicating the drop position is unknown.\n */\ngoog.ui.DragDropDetector.ImageDropEvent.prototype.getPosition = function() {\n  return this.position_;\n};\n\n\n\n/**\n * Creates a new link drop event object.\n * @param {string} url The url of the dropped link.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.ui.DragDropDetector.LinkDropEvent = function(url) {\n  goog.ui.DragDropDetector.LinkDropEvent.base(\n      this, 'constructor', goog.ui.DragDropDetector.EventType.LINK_DROPPED);\n\n  /**\n   * The url of the link that was dropped.\n   * @type {string}\n   * @private\n   */\n  this.url_ = url;\n};\ngoog.inherits(goog.ui.DragDropDetector.LinkDropEvent, goog.events.Event);\n\n\n/**\n * @return {string} The url of the link that was dropped.\n */\ngoog.ui.DragDropDetector.LinkDropEvent.prototype.getUrl = function() {\n  return this.url_;\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","^>;","^9L","^GL","^9>","^:L","^:S","^:I","^>8","^<3","^;8","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/dragdropdetector.js"],"^:1",["^9K",["~$goog.ui.DragDropDetector.LinkDropEvent","~$goog.ui.DragDropDetector.ImageDropEvent","~$goog.ui.DragDropDetector.EventType","~$goog.ui.DragDropDetector"]],"^9<",true,"^9=",["^9>","^;;","^GL","^;=","^;8","^>;","^:L","^:I","^>8","^9L","^<3","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.plaintextspellchecker.js","^9C",["^9D","goog/ui/plaintextspellchecker.js"],"^9E","goog/ui/plaintextspellchecker.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Plain text spell checker implementation.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/plaintextspellchecker.html\n */\n\ngoog.provide('goog.ui.PlainTextSpellChecker');\n\ngoog.require('goog.Timer');\ngoog.require('goog.a11y.aria');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.events.KeyHandler');\ngoog.require('goog.spell.SpellCheck');\ngoog.require('goog.style');\ngoog.require('goog.ui.AbstractSpellChecker');\ngoog.require('goog.ui.Component');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Plain text spell checker implementation.\n *\n * @param {goog.spell.SpellCheck} handler Instance of the SpellCheckHandler\n *     support object to use. A single instance can be shared by multiple\n *     editor components.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.AbstractSpellChecker}\n * @final\n */\ngoog.ui.PlainTextSpellChecker = function(handler, opt_domHelper) {\n  goog.ui.AbstractSpellChecker.call(this, handler, opt_domHelper);\n\n  /**\n   * Correction UI container.\n   * @private {!HTMLDivElement}\n   */\n  this.overlay_ = this.getDomHelper().createDom(goog.dom.TagName.DIV);\n  goog.style.setPreWrap(this.overlay_);\n\n  /**\n   * Bound async function (to avoid rebinding it on every call).\n   * @type {Function}\n   * @private\n   */\n  this.boundContinueAsyncFn_ = goog.bind(this.continueAsync_, this);\n\n  /**\n   * Regular expression for matching line breaks.\n   * @type {RegExp}\n   * @private\n   */\n  this.endOfLineMatcher_ = new RegExp('(.*)(\\n|\\r\\n){0,1}', 'g');\n};\ngoog.inherits(goog.ui.PlainTextSpellChecker, goog.ui.AbstractSpellChecker);\n\n\n/**\n * Class name for invalid words.\n * @type {string}\n */\ngoog.ui.PlainTextSpellChecker.prototype.invalidWordClassName =\n    goog.getCssName('goog-spellcheck-invalidword');\n\n\n/**\n * Class name for corrected words.\n * @type {string}\n */\ngoog.ui.PlainTextSpellChecker.prototype.correctedWordClassName =\n    goog.getCssName('goog-spellcheck-correctedword');\n\n\n/**\n * Class name for correction pane.\n * @type {string}\n */\ngoog.ui.PlainTextSpellChecker.prototype.correctionPaneClassName =\n    goog.getCssName('goog-spellcheck-correctionpane');\n\n\n/**\n * Number of words to scan to precharge the dictionary.\n * @type {number}\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.dictionaryPreScanSize_ = 1000;\n\n\n/**\n * Size of window. Used to check if a resize operation actually changed the size\n * of the window.\n * @type {goog.math.Size|undefined}\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.winSize_;\n\n\n/**\n * Event handler for listening to events without leaking.\n * @type {goog.events.EventHandler|undefined}\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.eventHandler_;\n\n\n/**\n * The object handling keyboard events.\n * @type {goog.events.KeyHandler|undefined}\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.keyHandler_;\n\n\n/** @private {number} */\ngoog.ui.PlainTextSpellChecker.prototype.textArrayIndex_;\n\n\n/** @private {!Array<string>} */\ngoog.ui.PlainTextSpellChecker.prototype.textArray_;\n\n\n/** @private {!Array<boolean>} */\ngoog.ui.PlainTextSpellChecker.prototype.textArrayProcess_;\n\n\n/**\n * Creates the initial DOM representation for the component.\n * @override\n */\ngoog.ui.PlainTextSpellChecker.prototype.createDom = function() {\n  this.setElementInternal(\n      this.getDomHelper().createElement(goog.dom.TagName.TEXTAREA));\n};\n\n\n/** @override */\ngoog.ui.PlainTextSpellChecker.prototype.enterDocument = function() {\n  goog.ui.PlainTextSpellChecker.superClass_.enterDocument.call(this);\n\n  this.eventHandler_ = new goog.events.EventHandler(this);\n  this.keyHandler_ = new goog.events.KeyHandler(this.overlay_);\n\n  this.initSuggestionsMenu();\n  this.initAccessibility_();\n};\n\n\n/** @override */\ngoog.ui.PlainTextSpellChecker.prototype.exitDocument = function() {\n  goog.ui.PlainTextSpellChecker.superClass_.exitDocument.call(this);\n\n  if (this.eventHandler_) {\n    this.eventHandler_.dispose();\n    this.eventHandler_ = undefined;\n  }\n  if (this.keyHandler_) {\n    this.keyHandler_.dispose();\n    this.keyHandler_ = undefined;\n  }\n};\n\n\n/**\n * Initializes suggestions menu. Populates menu with separator and ignore option\n * that are always valid. Suggestions are later added above the separator.\n * @override\n */\ngoog.ui.PlainTextSpellChecker.prototype.initSuggestionsMenu = function() {\n  goog.ui.PlainTextSpellChecker.superClass_.initSuggestionsMenu.call(this);\n  this.eventHandler_.listen(\n      /** @type {goog.ui.PopupMenu} */ (this.getMenu()),\n      goog.ui.Component.EventType.HIDE, this.onCorrectionHide_);\n};\n\n\n/**\n * Checks spelling for all text and displays correction UI.\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.PlainTextSpellChecker.prototype.check = function() {\n  var text = this.getElement().value;\n  this.getElement().readOnly = true;\n\n  // Prepare and position correction UI.\n  goog.dom.removeChildren(this.overlay_);\n  this.overlay_.className = this.correctionPaneClassName;\n  if (this.getElement().parentNode != this.overlay_.parentNode) {\n    this.getElement().parentNode.appendChild(this.overlay_);\n  }\n  goog.style.setElementShown(this.overlay_, false);\n\n  this.preChargeDictionary_(text);\n};\n\n\n/**\n * Final stage of spell checking - displays the correction UI.\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.finishCheck_ = function() {\n  // Show correction UI.\n  this.positionOverlay_();\n  goog.style.setElementShown(this.getElement(), false);\n  goog.style.setElementShown(this.overlay_, true);\n\n  var eh = this.eventHandler_;\n  eh.listen(this.overlay_, goog.events.EventType.CLICK, this.onWordClick_);\n  eh.listen(\n      /** @type {goog.events.KeyHandler} */ (this.keyHandler_),\n      goog.events.KeyHandler.EventType.KEY, this.handleOverlayKeyEvent);\n\n  // The position and size of the overlay element needs to be recalculated if\n  // the browser window is resized.\n  var win = goog.dom.getWindow(this.getDomHelper().getDocument()) || window;\n  this.winSize_ = goog.dom.getViewportSize(win);\n  eh.listen(win, goog.events.EventType.RESIZE, this.onWindowResize_);\n\n  goog.ui.PlainTextSpellChecker.superClass_.check.call(this);\n};\n\n\n/**\n * Start the scan after the dictionary was loaded.\n *\n * @param {string} text text to process.\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.preChargeDictionary_ = function(text) {\n  this.eventHandler_.listen(\n      this.spellCheck, goog.spell.SpellCheck.EventType.READY,\n      this.onDictionaryCharged_, true);\n\n  this.populateDictionary(text, this.dictionaryPreScanSize_);\n};\n\n\n/**\n * Loads few initial dictionary words into the cache.\n * @param {goog.events.Event} e goog.spell.SpellCheck.EventType.READY event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.PlainTextSpellChecker.prototype.onDictionaryCharged_ = function(e) {\n  e.stopPropagation();\n  this.eventHandler_.unlisten(\n      this.spellCheck, goog.spell.SpellCheck.EventType.READY,\n      this.onDictionaryCharged_, true);\n  this.checkAsync_(this.getElement().value);\n};\n\n\n/**\n * Processes the included and skips the excluded text ranges.\n * @return {goog.ui.AbstractSpellChecker.AsyncResult} Whether the spell\n *     checking is pending or done.\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.spellCheckLoop_ = function() {\n  for (var i = this.textArrayIndex_; i < this.textArray_.length; ++i) {\n    var text = this.textArray_[i];\n    if (this.textArrayProcess_[i]) {\n      var result = this.processTextAsync(this.overlay_, text);\n      if (result == goog.ui.AbstractSpellChecker.AsyncResult.PENDING) {\n        this.textArrayIndex_ = i + 1;\n        goog.Timer.callOnce(this.boundContinueAsyncFn_);\n        return result;\n      }\n    } else {\n      this.processRange(this.overlay_, text);\n    }\n  }\n\n  this.textArray_ = [];\n  this.textArrayProcess_ = [];\n\n  return goog.ui.AbstractSpellChecker.AsyncResult.DONE;\n};\n\n\n/**\n * Breaks text into included and excluded ranges using the marker RegExp\n * supplied by the caller.\n *\n * @param {string} text text to process.\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.initTextArray_ = function(text) {\n  if (!this.excludeMarker) {\n    this.textArray_ = [text];\n    this.textArrayProcess_ = [true];\n    return;\n  }\n\n  this.textArray_ = [];\n  this.textArrayProcess_ = [];\n  this.excludeMarker.lastIndex = 0;\n  var stringSegmentStart = 0;\n  var result;\n  while (result = this.excludeMarker.exec(text)) {\n    if (result[0].length == 0) {\n      break;\n    }\n    var excludedRange = result[0];\n    var includedRange =\n        text.substr(stringSegmentStart, result.index - stringSegmentStart);\n    if (includedRange) {\n      this.textArray_.push(includedRange);\n      this.textArrayProcess_.push(true);\n    }\n    this.textArray_.push(excludedRange);\n    this.textArrayProcess_.push(false);\n    stringSegmentStart = this.excludeMarker.lastIndex;\n  }\n\n  var leftoverText = text.substr(stringSegmentStart);\n  if (leftoverText) {\n    this.textArray_.push(leftoverText);\n    this.textArrayProcess_.push(true);\n  }\n};\n\n\n/**\n * Starts asynchrnonous spell checking.\n *\n * @param {string} text text to process.\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.checkAsync_ = function(text) {\n  this.initializeAsyncMode();\n  this.initTextArray_(text);\n  this.textArrayIndex_ = 0;\n  if (this.spellCheckLoop_() ==\n      goog.ui.AbstractSpellChecker.AsyncResult.PENDING) {\n    return;\n  }\n  this.finishAsyncProcessing();\n  this.finishCheck_();\n};\n\n\n/**\n * Continues asynchrnonous spell checking.\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.continueAsync_ = function() {\n  // First finish with the current segment.\n  var result = this.continueAsyncProcessing();\n  if (result == goog.ui.AbstractSpellChecker.AsyncResult.PENDING) {\n    goog.Timer.callOnce(this.boundContinueAsyncFn_);\n    return;\n  }\n  if (this.spellCheckLoop_() ==\n      goog.ui.AbstractSpellChecker.AsyncResult.PENDING) {\n    return;\n  }\n  this.finishAsyncProcessing();\n  this.finishCheck_();\n};\n\n\n/**\n * Processes word.\n *\n * @param {Node} node Node containing word.\n * @param {string} word Word to process.\n * @param {goog.spell.SpellCheck.WordStatus} status Status of word.\n * @override\n */\ngoog.ui.PlainTextSpellChecker.prototype.processWord = function(\n    node, word, status) {\n  node.appendChild(this.createWordElement(word, status));\n};\n\n\n/**\n * Processes range of text - recognized words and separators.\n *\n * @param {Node} node Node containing separator.\n * @param {string} text text to process.\n * @override\n */\ngoog.ui.PlainTextSpellChecker.prototype.processRange = function(node, text) {\n  this.endOfLineMatcher_.lastIndex = 0;\n  var result;\n  while (result = this.endOfLineMatcher_.exec(text)) {\n    if (result[0].length == 0) {\n      break;\n    }\n    node.appendChild(this.getDomHelper().createTextNode(result[1]));\n    if (result[2]) {\n      node.appendChild(this.getDomHelper().createElement(goog.dom.TagName.BR));\n    }\n  }\n};\n\n\n/**\n * Hides correction UI.\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.PlainTextSpellChecker.prototype.resume = function() {\n  var wasVisible = this.isVisible();\n\n  goog.ui.PlainTextSpellChecker.superClass_.resume.call(this);\n\n  goog.style.setElementShown(this.overlay_, false);\n  goog.style.setElementShown(this.getElement(), true);\n  this.getElement().readOnly = false;\n\n  if (wasVisible) {\n    this.getElement().value = goog.dom.getRawTextContent(this.overlay_);\n    goog.dom.removeChildren(this.overlay_);\n\n    var eh = this.eventHandler_;\n    eh.unlisten(this.overlay_, goog.events.EventType.CLICK, this.onWordClick_);\n    eh.unlisten(\n        /** @type {goog.events.KeyHandler} */ (this.keyHandler_),\n        goog.events.KeyHandler.EventType.KEY, this.handleOverlayKeyEvent);\n\n    var win = goog.dom.getWindow(this.getDomHelper().getDocument()) || window;\n    eh.unlisten(win, goog.events.EventType.RESIZE, this.onWindowResize_);\n  }\n};\n\n\n/**\n * Returns desired element properties for the specified status.\n *\n * @param {goog.spell.SpellCheck.WordStatus} status Status of word.\n * @return {!Object} Properties to apply to word element.\n * @override\n */\ngoog.ui.PlainTextSpellChecker.prototype.getElementProperties = function(\n    status) {\n  if (status == goog.spell.SpellCheck.WordStatus.INVALID) {\n    return {'class': this.invalidWordClassName};\n  } else if (status == goog.spell.SpellCheck.WordStatus.CORRECTED) {\n    return {'class': this.correctedWordClassName};\n  }\n  return {'class': ''};\n};\n\n\n/**\n * Handles the click events.\n * @param {goog.events.BrowserEvent} event Event object.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.PlainTextSpellChecker.prototype.onWordClick_ = function(event) {\n  if (event.target.className == this.invalidWordClassName ||\n      event.target.className == this.correctedWordClassName) {\n    this.showSuggestionsMenu(/** @type {!Element} */ (event.target), event);\n\n    // Prevent document click handler from closing the menu.\n    event.stopPropagation();\n  }\n};\n\n\n/**\n * Handles window resize events.\n *\n * @param {goog.events.BrowserEvent} event Event object.\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.onWindowResize_ = function(event) {\n  var win = goog.dom.getWindow(this.getDomHelper().getDocument()) || window;\n  var size = goog.dom.getViewportSize(win);\n\n  if (size.width != this.winSize_.width ||\n      size.height != this.winSize_.height) {\n    goog.style.setElementShown(this.overlay_, false);\n    goog.style.setElementShown(this.getElement(), true);\n\n    // IE requires a slight delay, allowing the resize operation to take effect.\n    if (goog.userAgent.IE) {\n      goog.Timer.callOnce(this.resizeOverlay_, 100, this);\n    } else {\n      this.resizeOverlay_();\n    }\n    this.winSize_ = size;\n  }\n};\n\n\n/**\n * Resizes overlay to match the size of the bound element then displays the\n * overlay. Helper for {@link #onWindowResize_}.\n *\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.resizeOverlay_ = function() {\n  this.positionOverlay_();\n  goog.style.setElementShown(this.getElement(), false);\n  goog.style.setElementShown(this.overlay_, true);\n};\n\n\n/**\n * Updates the position and size of the overlay to match the original element.\n *\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.positionOverlay_ = function() {\n  goog.style.setPosition(\n      this.overlay_, goog.style.getPosition(this.getElement()));\n  goog.style.setSize(this.overlay_, goog.style.getSize(this.getElement()));\n};\n\n\n/** @override */\ngoog.ui.PlainTextSpellChecker.prototype.disposeInternal = function() {\n  this.getDomHelper().removeNode(this.overlay_);\n  delete this.overlay_;\n  delete this.boundContinueAsyncFn_;\n  delete this.endOfLineMatcher_;\n  goog.ui.PlainTextSpellChecker.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * Specify ARIA roles and states as appropriate.\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.initAccessibility_ = function() {\n  goog.asserts.assert(\n      this.overlay_,\n      'The plain text spell checker DOM element cannot be null.');\n  goog.a11y.aria.setRole(this.overlay_, 'region');\n  goog.a11y.aria.setState(this.overlay_, 'live', 'assertive');\n  this.overlay_.tabIndex = 0;\n\n  /** @desc Title for Spell Checker's overlay.*/\n  var MSG_SPELLCHECKER_OVERLAY_TITLE = goog.getMsg('Spell Checker');\n  this.overlay_.title = MSG_SPELLCHECKER_OVERLAY_TITLE;\n};\n\n\n/**\n * Handles key down for overlay.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @return {boolean} The handled value.\n */\ngoog.ui.PlainTextSpellChecker.prototype.handleOverlayKeyEvent = function(e) {\n  var handled = false;\n  switch (e.keyCode) {\n    case goog.events.KeyCodes.RIGHT:\n      if (e.ctrlKey) {\n        handled = this.navigate(goog.ui.AbstractSpellChecker.Direction.NEXT);\n      }\n      break;\n\n    case goog.events.KeyCodes.LEFT:\n      if (e.ctrlKey) {\n        handled =\n            this.navigate(goog.ui.AbstractSpellChecker.Direction.PREVIOUS);\n      }\n      break;\n\n    case goog.events.KeyCodes.DOWN:\n      if (this.getFocusedElementIndex()) {\n        var el = this.getDomHelper().getElement(\n            this.makeElementId(this.getFocusedElementIndex()));\n        if (el) {\n          var position = goog.style.getPosition(el);\n          var size = goog.style.getSize(el);\n          position.x += size.width / 2;\n          position.y += size.height / 2;\n          this.showSuggestionsMenu(el, position);\n          handled = true;\n        }\n      }\n      break;\n  }\n\n  if (handled) {\n    e.preventDefault();\n  }\n\n  return handled;\n};\n\n\n/**\n * Handles correction menu actions.\n *\n * @param {goog.events.Event} event Action event.\n * @override\n */\ngoog.ui.PlainTextSpellChecker.prototype.onCorrectionAction = function(event) {\n  goog.ui.PlainTextSpellChecker.superClass_.onCorrectionAction.call(\n      this, event);\n\n  // In case of editWord base class has already set the focus (on the input),\n  // otherwise set the focus back on the word.\n  if (event.target != this.getMenuEdit()) {\n    this.reFocus_();\n  }\n};\n\n\n/**\n * Restores focus when the suggestion menu is hidden.\n *\n * @param {goog.events.BrowserEvent} event Blur event.\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.onCorrectionHide_ = function(event) {\n  this.reFocus_();\n};\n\n\n/**\n * Sets the focus back on the previously focused word element.\n * @private\n */\ngoog.ui.PlainTextSpellChecker.prototype.reFocus_ = function() {\n  var el = this.getElementByIndex(this.getFocusedElementIndex());\n  if (el) {\n    el.focus();\n  } else {\n    this.overlay_.focus();\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","~$goog.ui.AbstractSpellChecker","^>;","^><","~$goog.spell.SpellCheck","^?H","^:=","^?I","^9>","^:S","^:I","^<3","^>R","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/plaintextspellchecker.js"],"^:1",["^9K",["~$goog.ui.PlainTextSpellChecker"]],"^9<",true,"^9=",["^9>","^><","^?H","^:E","^;;","^;=","^>;","^:I","^>R","^?I","^SZ","^<3","^SY","^:=","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.editor.plugins.enterhandler.js","^9C",["^9D","goog/editor/plugins/enterhandler.js"],"^9E","goog/editor/plugins/enterhandler.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Plugin to handle enter keys.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.editor.plugins.EnterHandler');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeOffset');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.Range');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.editor.BrowserFeature');\ngoog.require('goog.editor.Plugin');\ngoog.require('goog.editor.node');\ngoog.require('goog.editor.plugins.Blockquote');\ngoog.require('goog.editor.range');\ngoog.require('goog.editor.style');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.functions');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Plugin to handle enter keys. This does all the crazy to normalize (as much as\n * is reasonable) what happens when you hit enter. This also handles the\n * special casing of hitting enter in a blockquote.\n *\n * In IE, Webkit, and Opera, the resulting HTML uses one DIV tag per line. In\n * Firefox, the resulting HTML uses BR tags at the end of each line.\n *\n * @constructor\n * @extends {goog.editor.Plugin}\n */\ngoog.editor.plugins.EnterHandler = function() {\n  goog.editor.Plugin.call(this);\n};\ngoog.inherits(goog.editor.plugins.EnterHandler, goog.editor.Plugin);\n\n\n/**\n * The type of block level tag to add on enter, for browsers that support\n * specifying the default block-level tag. Can be overriden by subclasses; must\n * be either DIV or P.\n * @type {!goog.dom.TagName}\n * @protected\n */\ngoog.editor.plugins.EnterHandler.prototype.tag = goog.dom.TagName.DIV;\n\n\n/** @override */\ngoog.editor.plugins.EnterHandler.prototype.getTrogClassId = function() {\n  return 'EnterHandler';\n};\n\n\n/** @override */\ngoog.editor.plugins.EnterHandler.prototype.enable = function(fieldObject) {\n  goog.editor.plugins.EnterHandler.base(this, 'enable', fieldObject);\n\n  if (goog.editor.BrowserFeature.SUPPORTS_OPERA_DEFAULTBLOCK_COMMAND &&\n      (this.tag == goog.dom.TagName.P || this.tag == goog.dom.TagName.DIV)) {\n    var doc = this.getFieldDomHelper().getDocument();\n    doc.execCommand('opera-defaultBlock', false, this.tag);\n  }\n};\n\n\n/**\n * If the contents are empty, return the 'default' html for the field.\n * The 'default' contents depend on the enter handling mode, so it\n * makes the most sense in this plugin.\n * @param {string} html The html to prepare.\n * @return {string} The original HTML, or default contents if that\n *    html is empty.\n * @override\n */\ngoog.editor.plugins.EnterHandler.prototype.prepareContentsHtml = function(\n    html) {\n  if (!html || goog.string.isBreakingWhitespace(html)) {\n    return goog.editor.BrowserFeature.COLLAPSES_EMPTY_NODES ?\n        this.getNonCollapsingBlankHtml() :\n        '';\n  }\n  return html;\n};\n\n\n/**\n * Gets HTML with no contents that won't collapse, for browsers that\n * collapse the empty string.\n * @return {string} Blank html.\n * @protected\n */\ngoog.editor.plugins.EnterHandler.prototype.getNonCollapsingBlankHtml =\n    goog.functions.constant('<br>');\n\n\n/**\n * Internal backspace handler.\n * @param {goog.events.Event} e The keypress event.\n * @param {goog.dom.AbstractRange} range The closure range object.\n * @protected\n */\ngoog.editor.plugins.EnterHandler.prototype.handleBackspaceInternal = function(\n    e, range) {\n  var field = this.getFieldObject().getElement();\n  var container = range && range.getStartNode();\n\n  if (field.firstChild == container && goog.editor.node.isEmpty(container)) {\n    e.preventDefault();\n    // TODO(user): I think we probably don't need to stopPropagation here\n    e.stopPropagation();\n  }\n};\n\n\n/**\n * Fix paragraphs to be the correct type of node.\n * @param {goog.events.Event} e The `<enter>` key event.\n * @param {boolean} split Whether we already split up a blockquote by\n *     manually inserting elements.\n * @protected\n */\ngoog.editor.plugins.EnterHandler.prototype.processParagraphTagsInternal =\n    function(e, split) {\n  // Force IE to turn the node we are leaving into a DIV.  If we do turn\n  // it into a DIV, the node IE creates in response to ENTER will also be\n  // a DIV.  If we don't, it will be a P.  We handle that case\n  // in handleKeyUpIE_\n  if (goog.userAgent.IE || goog.userAgent.OPERA) {\n    this.ensureBlockIeOpera(goog.dom.TagName.DIV);\n  } else if (!split && goog.userAgent.WEBKIT) {\n    // WebKit duplicates a blockquote when the user hits enter. Let's cancel\n    // this and insert a BR instead, to make it more consistent with the other\n    // browsers.\n    var range = this.getFieldObject().getRange();\n    if (!range ||\n        !goog.editor.plugins.EnterHandler.isDirectlyInBlockquote(\n            range.getContainerElement())) {\n      return;\n    }\n\n    var dh = this.getFieldDomHelper();\n    var br = dh.createElement(goog.dom.TagName.BR);\n    range.insertNode(br, true);\n\n    // If the BR is at the end of a block element, Safari still thinks there is\n    // only one line instead of two, so we need to add another BR in that case.\n    if (goog.editor.node.isBlockTag(br.parentNode) &&\n        !goog.editor.node.skipEmptyTextNodes(br.nextSibling)) {\n      goog.dom.insertSiblingBefore(dh.createElement(goog.dom.TagName.BR), br);\n    }\n\n    goog.editor.range.placeCursorNextTo(br, false);\n    e.preventDefault();\n  }\n};\n\n\n/**\n * Determines whether the lowest containing block node is a blockquote.\n * @param {Node} n The node.\n * @return {boolean} Whether the deepest block ancestor of n is a blockquote.\n */\ngoog.editor.plugins.EnterHandler.isDirectlyInBlockquote = function(n) {\n  for (var current = n; current; current = current.parentNode) {\n    if (goog.editor.node.isBlockTag(current)) {\n      return /** @type {!Element} */ (current).tagName ==\n          goog.dom.TagName.BLOCKQUOTE;\n    }\n  }\n\n  return false;\n};\n\n\n/**\n * Internal delete key handler.\n * @param {goog.events.Event} e The keypress event.\n * @protected\n */\ngoog.editor.plugins.EnterHandler.prototype.handleDeleteGecko = function(e) {\n  this.deleteBrGecko(e);\n};\n\n\n/**\n * Deletes the element at the cursor if it is a BR node, and if it does, calls\n * e.preventDefault to stop the browser from deleting. Only necessary in Gecko\n * as a workaround for mozilla bug 205350 where deleting a BR that is followed\n * by a block element doesn't work (the BR gets immediately replaced). We also\n * need to account for an ill-formed cursor which occurs from us trying to\n * stop the browser from deleting.\n *\n * @param {goog.events.Event} e The DELETE keypress event.\n * @protected\n */\ngoog.editor.plugins.EnterHandler.prototype.deleteBrGecko = function(e) {\n  var range = this.getFieldObject().getRange();\n  if (range.isCollapsed()) {\n    var container = range.getEndNode();\n    if (container.nodeType == goog.dom.NodeType.ELEMENT) {\n      var nextNode = container.childNodes[range.getEndOffset()];\n      if (nextNode && nextNode.tagName == goog.dom.TagName.BR) {\n        // We want to retrieve the first non-whitespace previous sibling\n        // as we could have added an empty text node below and want to\n        // properly handle deleting a sequence of BR's.\n        var previousSibling = goog.editor.node.getPreviousSibling(nextNode);\n        var nextSibling = nextNode.nextSibling;\n\n        container.removeChild(nextNode);\n        e.preventDefault();\n\n        // When we delete a BR followed by a block level element, the cursor\n        // has a line-height which spans the height of the block level element.\n        // e.g. If we delete a BR followed by a UL, the resulting HTML will\n        // appear to the end user like:-\n        //\n        // |  * one\n        // |  * two\n        // |  * three\n        //\n        // There are a couple of cases that we have to account for in order to\n        // properly conform to what the user expects when DELETE is pressed.\n        //\n        // 1. If the BR has a previous sibling and the previous sibling is\n        //    not a block level element or a BR, we place the cursor at the\n        //    end of that.\n        // 2. If the BR doesn't have a previous sibling or the previous sibling\n        //    is a block level element or a BR, we place the cursor at the\n        //    beginning of the leftmost leaf of its next sibling.\n        if (nextSibling && goog.editor.node.isBlockTag(nextSibling)) {\n          if (previousSibling &&\n              !(previousSibling.tagName == goog.dom.TagName.BR ||\n                goog.editor.node.isBlockTag(previousSibling))) {\n            goog.dom.Range\n                .createCaret(\n                    previousSibling,\n                    goog.editor.node.getLength(previousSibling))\n                .select();\n          } else {\n            var leftMostLeaf = goog.editor.node.getLeftMostLeaf(nextSibling);\n            goog.dom.Range.createCaret(leftMostLeaf, 0).select();\n          }\n        }\n      }\n    }\n  }\n};\n\n\n/** @override */\ngoog.editor.plugins.EnterHandler.prototype.handleKeyDown = function(e) {\n  if (goog.userAgent.GECKO) {\n    // If a dialog doesn't have selectable field, Gecko grabs the event and\n    // performs actions in editor window. This solves that problem and allows\n    // the event to be passed on to proper handlers.\n    if (this.getFieldObject().inModalMode()) {\n      return false;\n    }\n\n    // Firefox will allow the first node in an iframe to be deleted\n    // on a backspace.  Disallow it if the node is empty.\n    if (e.keyCode == goog.events.KeyCodes.BACKSPACE) {\n      this.handleBackspaceInternal(e, this.getFieldObject().getRange());\n    } else if (e.keyCode == goog.events.KeyCodes.DELETE) {\n      this.handleDeleteGecko(e);\n    }\n  }\n\n  return false;\n};\n\n\n/** @override */\ngoog.editor.plugins.EnterHandler.prototype.handleKeyPress = function(e) {\n  // ENTER must be handled in keyPress as it requires a beforechange event,\n  // which is fired in between keydown and keyup.\n  if (e.keyCode == goog.events.KeyCodes.ENTER) {\n    if (goog.userAgent.GECKO) {\n      if (!e.shiftKey) {\n        // Behave similarly to IE's content editable return carriage:\n        // If the shift key is down or specified by the application, insert a\n        // BR, otherwise split paragraphs\n        this.handleEnterGecko_(e);\n      }\n    } else {\n      // In Gecko-based browsers, this is handled in the handleEnterGecko_\n      // method.\n      this.getFieldObject().dispatchBeforeChange();\n      var cursorPosition = this.deleteCursorSelection_();\n\n      var split = !!this.getFieldObject().execCommand(\n          goog.editor.plugins.Blockquote.SPLIT_COMMAND, cursorPosition);\n      if (split) {\n        // TODO(user): I think we probably don't need to stopPropagation here\n        e.preventDefault();\n        e.stopPropagation();\n      }\n\n      this.releasePositionObject_(cursorPosition);\n\n      if (goog.userAgent.WEBKIT) {\n        this.handleEnterWebkitInternal(e);\n      }\n\n      this.processParagraphTagsInternal(e, split);\n      this.getFieldObject().dispatchChange();\n    }\n  }\n\n  return false;\n};\n\n\n/** @override */\ngoog.editor.plugins.EnterHandler.prototype.handleKeyUp = function(e) {\n  // If a dialog doesn't have selectable field, Gecko grabs the event and\n  // performs actions in editor window. This solves that problem and allows\n  // the event to be passed on to proper handlers.\n  if (goog.userAgent.GECKO && this.getFieldObject().inModalMode()) {\n    return false;\n  }\n  this.handleKeyUpInternal(e);\n  return false;\n};\n\n\n/**\n * Internal handler for keyup events.\n * @param {goog.events.Event} e The key event.\n * @protected\n */\ngoog.editor.plugins.EnterHandler.prototype.handleKeyUpInternal = function(e) {\n  if ((goog.userAgent.IE || goog.userAgent.OPERA) &&\n      e.keyCode == goog.events.KeyCodes.ENTER) {\n    this.ensureBlockIeOpera(goog.dom.TagName.DIV, true);\n  }\n};\n\n\n/**\n * Handles an enter keypress event on fields in Gecko.\n * @param {goog.events.BrowserEvent} e The key event.\n * @private\n */\ngoog.editor.plugins.EnterHandler.prototype.handleEnterGecko_ = function(e) {\n  // Retrieve whether the selection is collapsed before we delete it.\n  var range = this.getFieldObject().getRange();\n  var wasCollapsed = !range || range.isCollapsed();\n  var cursorPosition = this.deleteCursorSelection_();\n\n  var handled = this.getFieldObject().execCommand(\n      goog.editor.plugins.Blockquote.SPLIT_COMMAND, cursorPosition);\n  if (handled) {\n    // TODO(user): I think we probably don't need to stopPropagation here\n    e.preventDefault();\n    e.stopPropagation();\n  }\n\n  this.releasePositionObject_(cursorPosition);\n  if (!handled) {\n    this.handleEnterAtCursorGeckoInternal(e, wasCollapsed, range);\n  }\n};\n\n\n/**\n * Handle an enter key press in WebKit.\n * @param {goog.events.BrowserEvent} e The key press event.\n * @protected\n */\ngoog.editor.plugins.EnterHandler.prototype.handleEnterWebkitInternal =\n    goog.nullFunction;\n\n\n/**\n * Handle an enter key press on collapsed selection.  handleEnterGecko_ ensures\n * the selection is collapsed by deleting its contents if it is not.  The\n * default implementation does nothing.\n * @param {goog.events.BrowserEvent} e The key press event.\n * @param {boolean} wasCollapsed Whether the selection was collapsed before\n *     the key press.  If it was not, code before this function has already\n *     cleared the contents of the selection.\n * @param {goog.dom.AbstractRange} range Object representing the selection.\n * @protected\n */\ngoog.editor.plugins.EnterHandler.prototype.handleEnterAtCursorGeckoInternal =\n    goog.nullFunction;\n\n\n/**\n * Names of all the nodes that we don't want to turn into block nodes in IE when\n * the user hits enter.\n * @type {Object}\n * @private\n */\ngoog.editor.plugins.EnterHandler.DO_NOT_ENSURE_BLOCK_NODES_ =\n    goog.object.createSet(\n        goog.dom.TagName.LI, goog.dom.TagName.DIV, goog.dom.TagName.H1,\n        goog.dom.TagName.H2, goog.dom.TagName.H3, goog.dom.TagName.H4,\n        goog.dom.TagName.H5, goog.dom.TagName.H6);\n\n\n/**\n * Whether this is a node that contains a single BR tag and non-nbsp\n * whitespace.\n * @param {Node} node Node to check.\n * @return {boolean} Whether this is an element that only contains a BR.\n * @protected\n */\ngoog.editor.plugins.EnterHandler.isBrElem = function(node) {\n  return goog.editor.node.isEmpty(node) &&\n      goog.dom.getElementsByTagName(\n          goog.dom.TagName.BR, /** @type {!Element} */ (node)).length == 1;\n};\n\n\n/**\n * Ensures all text in IE and Opera to be in the given tag in order to control\n * Enter spacing. Call this when Enter is pressed if desired.\n *\n * We want to make sure the user is always inside of a block (or other nodes\n * listed in goog.editor.plugins.EnterHandler.IGNORE_ENSURE_BLOCK_NODES_).  We\n * listen to keypress to force nodes that the user is leaving to turn into\n * blocks, but we also need to listen to keyup to force nodes that the user is\n * entering to turn into blocks.\n * Example:  html is: `<h2>foo[cursor]</h2>`, and the user hits enter.  We\n * don't want to format the h2, but we do want to format the P that is\n * created on enter.  The P node is not available until keyup.\n * @param {!goog.dom.TagName} tag The tag name to convert to.\n * @param {boolean=} opt_keyUp Whether the function is being called on key up.\n *     When called on key up, the cursor is in the newly created node, so the\n *     semantics for when to change it to a block are different.  Specifically,\n *     if the resulting node contains only a BR, it is converted to `<tag>`.\n * @protected\n */\ngoog.editor.plugins.EnterHandler.prototype.ensureBlockIeOpera = function(\n    tag, opt_keyUp) {\n  var range = this.getFieldObject().getRange();\n  var container = range.getContainer();\n  var field = this.getFieldObject().getElement();\n\n  /** @type {!Node|undefined} */\n  var paragraph = undefined;\n  while (container && container != field) {\n    // We don't need to ensure a block if we are already in the same block, or\n    // in another block level node that we don't want to change the format of\n    // (unless we're handling keyUp and that block node just contains a BR).\n    var nodeName = container.nodeName;\n    // Due to @bug 2455389, the call to isBrElem needs to be inlined in the if\n    // instead of done before and saved in a variable, so that it can be\n    // short-circuited and avoid a weird IE edge case.\n    if (nodeName == tag ||\n        (goog.editor.plugins.EnterHandler\n             .DO_NOT_ENSURE_BLOCK_NODES_[nodeName] &&\n         !(opt_keyUp &&\n           goog.editor.plugins.EnterHandler.isBrElem(container)))) {\n      // Opera can create a <p> inside of a <div> in some situations,\n      // such as when breaking out of a list that is contained in a <div>.\n      if (goog.userAgent.OPERA && paragraph) {\n        if (nodeName == tag && paragraph == container.lastChild &&\n            goog.editor.node.isEmpty(paragraph)) {\n          goog.dom.insertSiblingAfter(paragraph, container);\n          goog.dom.Range.createFromNodeContents(paragraph).select();\n        }\n        break;\n      }\n      return;\n    }\n    if (goog.userAgent.OPERA && opt_keyUp && nodeName == goog.dom.TagName.P &&\n        nodeName != tag) {\n      paragraph = container;\n    }\n\n    container = container.parentNode;\n  }\n\n\n  if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher(9)) {\n    // IE (before IE9) has a bug where if the cursor is directly before a block\n    // node (e.g., the content is \"foo[cursor]<blockquote>bar</blockquote>\"),\n    // the FormatBlock command actually formats the \"bar\" instead of the \"foo\".\n    // This is just wrong. To work-around this, we want to move the\n    // selection back one character, and then restore it to its prior position.\n    // NOTE: We use the following \"range math\" to detect this situation because\n    // using Closure ranges here triggers a bug in IE that causes a crash.\n    // parent2 != parent3 ensures moving the cursor forward one character\n    // crosses at least 1 element boundary, and therefore tests if the cursor is\n    // at such a boundary.  The second check, parent3 != range.parentElement()\n    // weeds out some cases where the elements are siblings instead of cousins.\n    var needsHelp = false;\n    range = range.getBrowserRangeObject();\n    var range2 = range.duplicate();\n    range2.moveEnd('character', 1);\n    // In whitebox mode, when the cursor is at the end of the field, trying to\n    // move the end of the range will do nothing, and hence the range's text\n    // will be empty.  In this case, the cursor clearly isn't sitting just\n    // before a block node, since it isn't before anything.\n    if (range2.text.length) {\n      var parent2 = range2.parentElement();\n\n      var range3 = range2.duplicate();\n      range3.collapse(false);\n      var parent3 = range3.parentElement();\n\n      if ((needsHelp =\n               parent2 != parent3 && parent3 != range.parentElement())) {\n        range.move('character', -1);\n        range.select();\n      }\n    }\n  }\n\n  this.getFieldObject().getEditableDomHelper().getDocument().execCommand(\n      'FormatBlock', false, '<' + tag + '>');\n\n  if (needsHelp) {\n    range.move('character', 1);\n    range.select();\n  }\n};\n\n\n/**\n * Deletes the content at the current cursor position.\n * @return {!Node|!Object} Something representing the current cursor position.\n *    See deleteCursorSelectionIE_ and deleteCursorSelectionW3C_ for details.\n *    Should be passed to releasePositionObject_ when no longer in use.\n * @private\n */\ngoog.editor.plugins.EnterHandler.prototype.deleteCursorSelection_ = function() {\n  return goog.editor.BrowserFeature.HAS_W3C_RANGES ?\n      this.deleteCursorSelectionW3C_() :\n      this.deleteCursorSelectionIE_();\n};\n\n\n/**\n * Releases the object returned by deleteCursorSelection_.\n * @param {Node|Object} position The object returned by deleteCursorSelection_.\n * @private\n */\ngoog.editor.plugins.EnterHandler.prototype.releasePositionObject_ = function(\n    position) {\n  if (!goog.editor.BrowserFeature.HAS_W3C_RANGES) {\n    (/** @type {Node} */ (position)).removeNode(true);\n  }\n};\n\n\n/**\n * Delete the selection at the current cursor position, then returns a temporary\n * node at the current position.\n * @return {!Node} A temporary node marking the current cursor position. This\n *     node should eventually be removed from the DOM.\n * @private\n */\ngoog.editor.plugins.EnterHandler.prototype.deleteCursorSelectionIE_ =\n    function() {\n  var doc = this.getFieldDomHelper().getDocument();\n  var range = doc.selection.createRange();\n\n  var id = goog.string.createUniqueString();\n  range.pasteHTML('<span id=\"' + id + '\"></span>');\n  var splitNode = doc.getElementById(id);\n  splitNode.id = '';\n  return splitNode;\n};\n\n\n/**\n * Delete the selection at the current cursor position, then returns the node\n * at the current position.\n * @return {!goog.editor.range.Point} The current cursor position. Note that\n *    unlike simulateEnterIE_, this should not be removed from the DOM.\n * @private\n */\ngoog.editor.plugins.EnterHandler.prototype.deleteCursorSelectionW3C_ =\n    function() {\n  var range = this.getFieldObject().getRange();\n\n  // Delete the current selection if it's is non-collapsed.\n  // Although this is redundant in FF, it's necessary for Safari\n  if (range && !range.isCollapsed()) {\n    var shouldDelete = true;\n    // Opera selects the <br> in an empty block if there is no text node\n    // preceding it. To preserve inline formatting when pressing [enter] inside\n    // an empty block, don't delete the selection if it only selects a <br> at\n    // the end of the block.\n    // TODO(user): Move this into goog.dom.Range. It should detect this state\n    // when creating a range from the window selection and fix it in the created\n    // range.\n    if (goog.userAgent.OPERA) {\n      var startNode = range.getStartNode();\n      var startOffset = range.getStartOffset();\n      if (startNode == range.getEndNode() &&\n          // This weeds out cases where startNode is a text node.\n          startNode.lastChild &&\n          /** @type {!Element} */ (startNode.lastChild).tagName ==\n              goog.dom.TagName.BR &&\n          // If this check is true, then endOffset is implied to be\n          // startOffset + 1, because the selection is not collapsed and\n          // it starts and ends within the same element.\n          startOffset == startNode.childNodes.length - 1) {\n        shouldDelete = false;\n      }\n    }\n    if (shouldDelete) {\n      goog.editor.plugins.EnterHandler.deleteW3cRange_(range);\n    }\n  }\n\n  return goog.editor.range.getDeepEndPoint(range, true);\n};\n\n\n/**\n * Deletes the contents of the selection from the DOM.\n * @param {goog.dom.AbstractRange} range The range to remove contents from.\n * @return {goog.dom.AbstractRange} The resulting range. Used for testing.\n * @private\n */\ngoog.editor.plugins.EnterHandler.deleteW3cRange_ = function(range) {\n  if (range && !range.isCollapsed()) {\n    var reselect = true;\n    var baseNode = range.getContainerElement();\n    var nodeOffset = new goog.dom.NodeOffset(range.getStartNode(), baseNode);\n    var rangeOffset = range.getStartOffset();\n\n    // Whether the selection crosses no container boundaries.\n    var isInOneContainer =\n        goog.editor.plugins.EnterHandler.isInOneContainerW3c_(range);\n\n    // Whether the selection ends in a container it doesn't fully select.\n    var isPartialEnd = !isInOneContainer &&\n        goog.editor.plugins.EnterHandler.isPartialEndW3c_(range);\n\n    // Remove The range contents, and ensure the correct content stays selected.\n    range.removeContents();\n    var node = nodeOffset.findTargetNode(baseNode);\n    if (node) {\n      range = goog.dom.Range.createCaret(node, rangeOffset);\n    } else {\n      // This occurs when the node that would have been referenced has now been\n      // deleted and there are no other nodes in the baseNode. Thus need to\n      // set the caret to the end of the base node.\n      range = goog.dom.Range.createCaret(baseNode, baseNode.childNodes.length);\n      reselect = false;\n    }\n    range.select();\n\n    // If we just deleted everything from the container, add an nbsp\n    // to the container, and leave the cursor inside of it\n    if (isInOneContainer) {\n      var container = goog.editor.style.getContainer(range.getStartNode());\n      if (goog.editor.node.isEmpty(container, true)) {\n        var html = '&nbsp;';\n        if (goog.userAgent.OPERA && container.tagName == goog.dom.TagName.LI) {\n          // Don't break Opera's native break-out-of-lists behavior.\n          html = '<br>';\n        }\n        goog.editor.node.replaceInnerHtml(container, html);\n        goog.editor.range.selectNodeStart(container.firstChild);\n        reselect = false;\n      }\n    }\n\n    if (isPartialEnd) {\n      /*\n       This code handles the following, where | is the cursor:\n         <div>a|b</div><div>c|d</div>\n       After removeContents, the remaining HTML is\n         <div>a</div><div>d</div>\n       which means the line break between the two divs remains.  This block\n       moves children of the second div in to the first div to get the correct\n       result:\n         <div>ad</div>\n\n       TODO(robbyw): Should we wrap the second div's contents in a span if they\n                     have inline style?\n      */\n      var rangeStart = goog.editor.style.getContainer(range.getStartNode());\n      var redundantContainer = goog.editor.node.getNextSibling(rangeStart);\n      if (rangeStart && redundantContainer) {\n        goog.dom.append(rangeStart, redundantContainer.childNodes);\n        goog.dom.removeNode(redundantContainer);\n      }\n    }\n\n    if (reselect) {\n      // The contents of the original range are gone, so restore the cursor\n      // position at the start of where the range once was.\n      range = goog.dom.Range.createCaret(\n          nodeOffset.findTargetNode(baseNode), rangeOffset);\n      range.select();\n    }\n  }\n\n  return range;\n};\n\n\n/**\n * Checks whether the whole range is in a single block-level element.\n * @param {goog.dom.AbstractRange} range The range to check.\n * @return {boolean} Whether the whole range is in a single block-level element.\n * @private\n */\ngoog.editor.plugins.EnterHandler.isInOneContainerW3c_ = function(range) {\n  // Find the block element containing the start of the selection.\n  var startContainer = range.getStartNode();\n  if (goog.editor.style.isContainer(startContainer)) {\n    startContainer =\n        startContainer.childNodes[range.getStartOffset()] || startContainer;\n  }\n  startContainer = goog.editor.style.getContainer(startContainer);\n\n  // Find the block element containing the end of the selection.\n  var endContainer = range.getEndNode();\n  if (goog.editor.style.isContainer(endContainer)) {\n    endContainer =\n        endContainer.childNodes[range.getEndOffset()] || endContainer;\n  }\n  endContainer = goog.editor.style.getContainer(endContainer);\n\n  // Compare the two.\n  return startContainer == endContainer;\n};\n\n\n/**\n * Checks whether the end of the range is not at the end of a block-level\n * element.\n * @param {goog.dom.AbstractRange} range The range to check.\n * @return {boolean} Whether the end of the range is not at the end of a\n *     block-level element.\n * @private\n */\ngoog.editor.plugins.EnterHandler.isPartialEndW3c_ = function(range) {\n  var endContainer = range.getEndNode();\n  var endOffset = range.getEndOffset();\n  var node = endContainer;\n  if (goog.editor.style.isContainer(node)) {\n    var child = node.childNodes[endOffset];\n    // Child is null when end offset is >= length, which indicates the entire\n    // container is selected.  Otherwise, we also know the entire container\n    // is selected if the selection ends at a new container.\n    if (!child ||\n        child.nodeType == goog.dom.NodeType.ELEMENT &&\n            goog.editor.style.isContainer(child)) {\n      return false;\n    }\n  }\n\n  var container = goog.editor.style.getContainer(node);\n  while (container != node) {\n    if (goog.editor.node.getNextSibling(node)) {\n      return true;\n    }\n    node = node.parentNode;\n  }\n\n  return endOffset != goog.editor.node.getLength(endContainer);\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","^;<","~$goog.editor.plugins.Blockquote","^=B","^9L","^KM","^?=","^9>","^;P","^:S","~$goog.dom.NodeOffset","^;D","^??","^JL","^=F","^>R","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/enterhandler.js"],"^:1",["^9K",["^KL"]],"^9<",true,"^9=",["^9>","^;;","^T1","^=B","^=F","^;=","^?=","^;D","^??","^T0","^KM","^JL","^>R","^;<","^;P","^9L","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.fx.fx.js","^9C",["^9D","goog/fx/fx.js"],"^9E","goog/fx/fx.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Legacy stub for the goog.fx namespace.  Requires the moved\n * namespaces. Animation and easing have been moved to animation.js and\n * easing.js.  Users of this stub should move off so we may remove it in the\n * future.\n *\n * @author nnaze@google.com (Nathan Naze)\n * @suppress {extraRequire} All the requires in this file are \"extra\"\n * because this file is not actually using them.\n */\n\ngoog.provide('goog.fx');\n\ngoog.require('goog.asserts');\ngoog.require('goog.fx.Animation');\ngoog.require('goog.fx.Animation.EventType');\ngoog.require('goog.fx.Animation.State');\ngoog.require('goog.fx.AnimationEvent');\ngoog.require('goog.fx.Transition.EventType');\ngoog.require('goog.fx.easing');\n","^9I",1579837703000,"^9J",["^9K",["^:E","^LH","^LI","~$goog.fx.Transition.EventType","^9>","^G7","^H:","^LJ"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/fx.js"],"^:1",["^9K",["~$goog.fx"]],"^9<",true,"^9=",["^9>","^:E","^G7","^LI","^LH","^LJ","^T2","^H:"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.custombuttonrenderer.js","^9C",["^9D","goog/ui/custombuttonrenderer.js"],"^9E","goog/ui/custombuttonrenderer.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A custom button renderer that uses CSS voodoo to render a\n * button-like object with fake rounded corners.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.CustomButtonRenderer');\n\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.asserts');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.string');\ngoog.require('goog.ui.ButtonRenderer');\ngoog.require('goog.ui.INLINE_BLOCK_CLASSNAME');\n\n\n\n/**\n * Custom renderer for {@link goog.ui.Button}s.  Custom buttons can contain\n * almost arbitrary HTML content, will flow like inline elements, but can be\n * styled like block-level elements.\n *\n * @constructor\n * @extends {goog.ui.ButtonRenderer}\n */\ngoog.ui.CustomButtonRenderer = function() {\n  goog.ui.ButtonRenderer.call(this);\n};\ngoog.inherits(goog.ui.CustomButtonRenderer, goog.ui.ButtonRenderer);\ngoog.addSingletonGetter(goog.ui.CustomButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.CustomButtonRenderer.CSS_CLASS = goog.getCssName('goog-custom-button');\n\n\n/**\n * Returns the button's contents wrapped in the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-custom-button\">\n *      <div class=\"goog-inline-block goog-custom-button-outer-box\">\n *        <div class=\"goog-inline-block goog-custom-button-inner-box\">\n *          Contents...\n *        </div>\n *      </div>\n *    </div>\n *\n * Overrides {@link goog.ui.ButtonRenderer#createDom}.\n * @param {goog.ui.Control} control goog.ui.Button to render.\n * @return {!Element} Root element for the button.\n * @override\n */\ngoog.ui.CustomButtonRenderer.prototype.createDom = function(control) {\n  var button = /** @type {goog.ui.Button} */ (control);\n  var classNames = this.getClassNames(button);\n  var buttonElement = button.getDomHelper().createDom(\n      goog.dom.TagName.DIV,\n      goog.ui.INLINE_BLOCK_CLASSNAME + ' ' + classNames.join(' '),\n      this.createButton(button.getContent(), button.getDomHelper()));\n  this.setTooltip(buttonElement, /** @type {string}*/ (button.getTooltip()));\n\n  return buttonElement;\n};\n\n\n/**\n * Returns the ARIA role to be applied to custom buttons.\n * @return {goog.a11y.aria.Role|undefined} ARIA role.\n * @override\n */\ngoog.ui.CustomButtonRenderer.prototype.getAriaRole = function() {\n  return goog.a11y.aria.Role.BUTTON;\n};\n\n\n/**\n * Takes the button's root element and returns the parent element of the\n * button's contents.  Overrides the superclass implementation by taking\n * the nested DIV structure of custom buttons into account.\n * @param {Element} element Root element of the button whose content\n *     element is to be returned.\n * @return {Element} The button's content element (if any).\n * @override\n */\ngoog.ui.CustomButtonRenderer.prototype.getContentElement = function(element) {\n  return element && element.firstChild &&\n      /** @type {Element} */ (element.firstChild.firstChild);\n};\n\n\n/**\n * Takes a text caption or existing DOM structure, and returns the content\n * wrapped in a pseudo-rounded-corner box.  Creates the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-custom-button-outer-box\">\n *      <div class=\"goog-inline-block goog-custom-button-inner-box\">\n *        Contents...\n *      </div>\n *    </div>\n *\n * Used by both {@link #createDom} and {@link #decorate}.  To be overridden\n * by subclasses.\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to wrap\n *     in a box.\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {Element} Pseudo-rounded-corner box containing the content.\n */\ngoog.ui.CustomButtonRenderer.prototype.createButton = function(content, dom) {\n  return dom.createDom(\n      goog.dom.TagName.DIV, goog.ui.INLINE_BLOCK_CLASSNAME + ' ' +\n          goog.getCssName(this.getCssClass(), 'outer-box'),\n      dom.createDom(\n          goog.dom.TagName.DIV, goog.ui.INLINE_BLOCK_CLASSNAME + ' ' +\n              goog.getCssName(this.getCssClass(), 'inner-box'),\n          content));\n};\n\n\n/**\n * Returns true if this renderer can decorate the element.  Overrides\n * {@link goog.ui.ButtonRenderer#canDecorate} by returning true if the\n * element is a DIV, false otherwise.\n * @param {Element} element Element to decorate.\n * @return {boolean} Whether the renderer can decorate the element.\n * @override\n */\ngoog.ui.CustomButtonRenderer.prototype.canDecorate = function(element) {\n  return element.tagName == goog.dom.TagName.DIV;\n};\n\n\n/**\n * Check if the button's element has a box structure.\n * @param {goog.ui.Button} button Button instance whose structure is being\n *     checked.\n * @param {Element} element Element of the button.\n * @return {boolean} Whether the element has a box structure.\n * @protected\n */\ngoog.ui.CustomButtonRenderer.prototype.hasBoxStructure = function(\n    button, element) {\n  var outer = button.getDomHelper().getFirstElementChild(element);\n  var outerClassName = goog.getCssName(this.getCssClass(), 'outer-box');\n  if (outer && goog.dom.classlist.contains(outer, outerClassName)) {\n    var inner = button.getDomHelper().getFirstElementChild(outer);\n    var innerClassName = goog.getCssName(this.getCssClass(), 'inner-box');\n    if (inner && goog.dom.classlist.contains(inner, innerClassName)) {\n      // We have a proper box structure.\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Takes an existing element and decorates it with the custom button control.\n * Initializes the control's ID, content, tooltip, value, and state based\n * on the ID of the element, its child nodes, and its CSS classes, respectively.\n * Returns the element.  Overrides {@link goog.ui.ButtonRenderer#decorate}.\n * @param {goog.ui.Control} control Button instance to decorate the element.\n * @param {Element} element Element to decorate.\n * @return {Element} Decorated element.\n * @override\n */\ngoog.ui.CustomButtonRenderer.prototype.decorate = function(control, element) {\n  goog.asserts.assert(element);\n\n  var button = /** @type {goog.ui.Button} */ (control);\n  // Trim text nodes in the element's child node list; otherwise madness\n  // ensues (i.e. on Gecko, buttons will flicker and shift when moused over).\n  goog.ui.CustomButtonRenderer.trimTextNodes_(element, true);\n  goog.ui.CustomButtonRenderer.trimTextNodes_(element, false);\n\n  // Create the buttom dom if it has not been created.\n  if (!this.hasBoxStructure(button, element)) {\n    element.appendChild(\n        this.createButton(element.childNodes, button.getDomHelper()));\n  }\n\n  goog.dom.classlist.addAll(\n      element, [goog.ui.INLINE_BLOCK_CLASSNAME, this.getCssClass()]);\n  return goog.ui.CustomButtonRenderer.superClass_.decorate.call(\n      this, button, element);\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.CustomButtonRenderer.prototype.getCssClass = function() {\n  return goog.ui.CustomButtonRenderer.CSS_CLASS;\n};\n\n\n/**\n * Takes an element and removes leading or trailing whitespace from the start\n * or the end of its list of child nodes.  The Boolean argument determines\n * whether to trim from the start or the end of the node list.  Empty text\n * nodes are removed, and the first non-empty text node is trimmed from the\n * left or the right as appropriate.  For example,\n *\n *    <div class=\"goog-inline-block\">\n *      #text \"\"\n *      #text \"\\n    Hello \"\n *      <span>...</span>\n *      #text \" World!    \\n\"\n *      #text \"\"\n *    </div>\n *\n * becomes\n *\n *    <div class=\"goog-inline-block\">\n *      #text \"Hello \"\n *      <span>...</span>\n *      #text \" World!\"\n *    </div>\n *\n * This is essential for Gecko, where leading/trailing whitespace messes with\n * the layout of elements with -moz-inline-box (used in goog-inline-block), and\n * optional but harmless for non-Gecko.\n *\n * @param {Element} element Element whose child node list is to be trimmed.\n * @param {boolean} fromStart Whether to trim from the start or from the end.\n * @private\n */\ngoog.ui.CustomButtonRenderer.trimTextNodes_ = function(element, fromStart) {\n  if (element) {\n    var node = fromStart ? element.firstChild : element.lastChild, next;\n    // Tag soup HTML may result in a DOM where siblings have different parents.\n    while (node && node.parentNode == element) {\n      // Get the next/previous sibling here, since the node may be removed.\n      next = fromStart ? node.nextSibling : node.previousSibling;\n      if (node.nodeType == goog.dom.NodeType.TEXT) {\n        // Found a text node.\n        var text = node.nodeValue;\n        if (goog.string.trim(text) == '') {\n          // Found an empty text node; remove it.\n          element.removeChild(node);\n        } else {\n          // Found a non-empty text node; trim from the start/end, then exit.\n          node.nodeValue = fromStart ? goog.string.trimLeft(text) :\n                                       goog.string.trimRight(text);\n          break;\n        }\n      } else {\n        // Found a non-text node; done.\n        break;\n      }\n      node = next;\n    }\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^:;","^=B","^9L","^;G","^9>","^JZ","^GH","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/custombuttonrenderer.js"],"^:1",["^9K",["^GG"]],"^9<",true,"^9=",["^9>","^;G","^:E","^=B","^;=","^:;","^9L","^JZ","^GH"]],["^ ","^9A",[1579837703000],"^9B","goog.structs.trie.js","^9C",["^9D","goog/structs/trie.js"],"^9E","goog/structs/trie.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Datastructure: Trie.\n *\n *\n * This file provides the implementation of a trie data structure.  A trie is a\n * data structure that stores key/value pairs in a prefix tree.  See:\n *     http://en.wikipedia.org/wiki/Trie\n */\n\n\ngoog.provide('goog.structs.Trie');\n\ngoog.require('goog.object');\ngoog.require('goog.structs');\n\n\n\n/**\n * Class for a Trie datastructure.  Trie data structures are made out of trees\n * of Trie classes.\n *\n * @param {goog.structs.Trie<VALUE>|Object<string, VALUE>=} opt_trie Optional\n *     goog.structs.Trie or Object to initialize trie with.\n * @constructor\n * @template VALUE\n */\ngoog.structs.Trie = function(opt_trie) {\n  /**\n   * This trie's value.  For the base trie, this will be the value of the\n   * empty key, if defined.\n   * @private {VALUE}\n   */\n  this.value_ = undefined;\n\n  /**\n   * This trie's child nodes.\n   * @private {!Object<!goog.structs.Trie<VALUE>>}\n   */\n  this.childNodes_ = {};\n\n  if (opt_trie) {\n    this.setAll(opt_trie);\n  }\n};\n\n\n/**\n * Sets the given key/value pair in the trie.  O(L), where L is the length\n * of the key.\n * @param {string} key The key.\n * @param {VALUE} value The value.\n */\ngoog.structs.Trie.prototype.set = function(key, value) {\n  this.setOrAdd_(key, value, false);\n};\n\n\n/**\n * Adds the given key/value pair in the trie.  Throw an exception if the key\n * already exists in the trie.  O(L), where L is the length of the key.\n * @param {string} key The key.\n * @param {VALUE} value The value.\n */\ngoog.structs.Trie.prototype.add = function(key, value) {\n  this.setOrAdd_(key, value, true);\n};\n\n\n/**\n * Helper function for set and add.  Adds the given key/value pair to\n * the trie, or, if the key already exists, sets the value of the key. If\n * opt_add is true, then throws an exception if the key already has a value in\n * the trie.  O(L), where L is the length of the key.\n * @param {string} key The key.\n * @param {VALUE} value The value.\n * @param {boolean=} opt_add Throw exception if key is already in the trie.\n * @private\n */\ngoog.structs.Trie.prototype.setOrAdd_ = function(key, value, opt_add) {\n  var node = this;\n  for (var characterPosition = 0; characterPosition < key.length;\n       characterPosition++) {\n    var currentCharacter = key.charAt(characterPosition);\n    if (!node.childNodes_[currentCharacter]) {\n      node.childNodes_[currentCharacter] = new goog.structs.Trie();\n    }\n    node = node.childNodes_[currentCharacter];\n  }\n  if (opt_add && node.value_ !== undefined) {\n    throw new Error('The collection already contains the key \"' + key + '\"');\n  } else {\n    node.value_ = value;\n  }\n};\n\n\n/**\n * Adds multiple key/value pairs from another goog.structs.Trie or Object.\n * O(N) where N is the number of nodes in the trie.\n * @param {!Object<string, VALUE>|!goog.structs.Trie<VALUE>} trie Object\n *     containing the data to add.\n */\ngoog.structs.Trie.prototype.setAll = function(trie) {\n  var keys = goog.structs.getKeys(trie);\n  var values = goog.structs.getValues(trie);\n\n  for (var i = 0; i < keys.length; i++) {\n    this.set(keys[i], values[i]);\n  }\n};\n\n\n/**\n * Traverse along the given path, returns the child node at ending.\n * Returns undefined if node for the path doesn't exist.\n * @param {string} path The path to traverse.\n * @return {!goog.structs.Trie<VALUE>|undefined}\n * @private\n */\ngoog.structs.Trie.prototype.getChildNode_ = function(path) {\n  var node = this;\n  for (var characterPosition = 0; characterPosition < path.length;\n       characterPosition++) {\n    var currentCharacter = path.charAt(characterPosition);\n    node = node.childNodes_[currentCharacter];\n    if (!node) {\n      return undefined;\n    }\n  }\n  return node;\n};\n\n\n/**\n * Retrieves a value from the trie given a key.  O(L), where L is the length of\n * the key.\n * @param {string} key The key to retrieve from the trie.\n * @return {VALUE|undefined} The value of the key in the trie, or undefined if\n *     the trie does not contain this key.\n */\ngoog.structs.Trie.prototype.get = function(key) {\n  var node = this.getChildNode_(key);\n  return node ? node.value_ : undefined;\n};\n\n\n/**\n * Retrieves all values from the trie that correspond to prefixes of the given\n * input key. O(L), where L is the length of the key.\n *\n * @param {string} key The key to use for lookup. The given key as well as all\n *     prefixes of the key are retrieved.\n * @param {?number=} opt_keyStartIndex Optional position in key to start lookup\n *     from. Defaults to 0 if not specified.\n * @return {!Object<string, VALUE>} Map of end index of matching prefixes and\n *     corresponding values. Empty if no match found.\n */\ngoog.structs.Trie.prototype.getKeyAndPrefixes = function(\n    key, opt_keyStartIndex) {\n  /** @type {!goog.structs.Trie<VALUE>} */\n  var node = this;\n  var matches = {};\n  var characterPosition = opt_keyStartIndex || 0;\n\n  if (node.value_ !== undefined) {\n    matches[characterPosition] = node.value_;\n  }\n\n  for (; characterPosition < key.length; characterPosition++) {\n    var currentCharacter = key.charAt(characterPosition);\n    if (!(currentCharacter in node.childNodes_)) {\n      break;\n    }\n    node = node.childNodes_[currentCharacter];\n    if (/** @type {VALUE} */ (node.value_) !== undefined) {\n      matches[characterPosition] = node.value_;\n    }\n  }\n\n  return matches;\n};\n\n\n/**\n * Gets the values of the trie.  Not returned in any reliable order.  O(N) where\n * N is the number of nodes in the trie.  Calls getValuesInternal_.\n * @return {!Array<VALUE>} The values in the trie.\n */\ngoog.structs.Trie.prototype.getValues = function() {\n  var allValues = [];\n  this.getValuesInternal_(allValues);\n  return allValues;\n};\n\n\n/**\n * Gets the values of the trie.  Not returned in any reliable order.  O(N) where\n * N is the number of nodes in the trie.  Builds the values as it goes.\n * @param {!Array<VALUE>} allValues Array to place values into.\n * @private\n */\ngoog.structs.Trie.prototype.getValuesInternal_ = function(allValues) {\n  if (this.value_ !== undefined) {\n    allValues.push(this.value_);\n  }\n  for (var childNode in this.childNodes_) {\n    this.childNodes_[childNode].getValuesInternal_(allValues);\n  }\n};\n\n\n/**\n * Gets the keys of the trie.  Not returned in any reliable order.  O(N) where\n * N is the number of nodes in the trie (or prefix subtree).\n * @param {string=} opt_prefix Find only keys with this optional prefix.\n * @return {!Array<string>} The keys in the trie.\n */\ngoog.structs.Trie.prototype.getKeys = function(opt_prefix) {\n  var allKeys = [];\n  if (opt_prefix) {\n    // Traverse to the given prefix, then call getKeysInternal_ to dump the\n    // keys below that point.\n    var node = this;\n    for (var characterPosition = 0; characterPosition < opt_prefix.length;\n         characterPosition++) {\n      var currentCharacter = opt_prefix.charAt(characterPosition);\n      if (!node.childNodes_[currentCharacter]) {\n        return [];\n      }\n      node = node.childNodes_[currentCharacter];\n    }\n    node.getKeysInternal_(opt_prefix, allKeys);\n  } else {\n    this.getKeysInternal_('', allKeys);\n  }\n  return allKeys;\n};\n\n\n/**\n * Private method to get keys from the trie.  Builds the keys as it goes.\n * @param {string} keySoFar The partial key (prefix) traversed so far.\n * @param {!Array<string>} allKeys The partially built array of keys seen so\n *     far.\n * @private\n */\ngoog.structs.Trie.prototype.getKeysInternal_ = function(keySoFar, allKeys) {\n  if (this.value_ !== undefined) {\n    allKeys.push(keySoFar);\n  }\n  for (var childNode in this.childNodes_) {\n    this.childNodes_[childNode].getKeysInternal_(keySoFar + childNode, allKeys);\n  }\n};\n\n\n/**\n * Checks to see if a certain key is in the trie.  O(L), where L is the length\n * of the key.\n * @param {string} key A key that may be in the trie.\n * @return {boolean} Whether the trie contains key.\n */\ngoog.structs.Trie.prototype.containsKey = function(key) {\n  return this.get(key) !== undefined;\n};\n\n\n/**\n * Checks to see if a certain prefix is in the trie. O(L), where L is the length\n * of the prefix.\n * @param {string} prefix A prefix that may be in the trie.\n * @return {boolean} Whether any key of the trie has the prefix.\n */\ngoog.structs.Trie.prototype.containsPrefix = function(prefix) {\n  // Empty string is any key's prefix.\n  if (prefix.length == 0) {\n    return !this.isEmpty();\n  }\n  return !!this.getChildNode_(prefix);\n};\n\n\n/**\n * Checks to see if a certain value is in the trie.  Worst case is O(N) where\n * N is the number of nodes in the trie.\n * @param {VALUE} value A value that may be in the trie.\n * @return {boolean} Whether the trie contains the value.\n */\ngoog.structs.Trie.prototype.containsValue = function(value) {\n  if (this.value_ === value) {\n    return true;\n  }\n  for (var childNode in this.childNodes_) {\n    if (this.childNodes_[childNode].containsValue(value)) {\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Completely empties a trie of all keys and values.  ~O(1)\n */\ngoog.structs.Trie.prototype.clear = function() {\n  this.childNodes_ = {};\n  this.value_ = undefined;\n};\n\n\n/**\n * Removes a key from the trie or throws an exception if the key is not in the\n * trie.  O(L), where L is the length of the key.\n * @param {string} key A key that should be removed from the trie.\n * @return {VALUE} The value whose key was removed.\n */\ngoog.structs.Trie.prototype.remove = function(key) {\n  var node = this;\n  var parents = [];\n  for (var characterPosition = 0; characterPosition < key.length;\n       characterPosition++) {\n    var currentCharacter = key.charAt(characterPosition);\n    if (!node.childNodes_[currentCharacter]) {\n      throw new Error('The collection does not have the key \"' + key + '\"');\n    }\n\n    // Archive the current parent and child name (key in childNodes_) so that\n    // we may remove the following node and its parents if they are empty.\n    parents.push([node, currentCharacter]);\n\n    node = node.childNodes_[currentCharacter];\n  }\n  var oldValue = node.value_;\n  delete node.value_;\n\n  while (parents.length > 0) {\n    var currentParentAndCharacter = parents.pop();\n    var currentParent = currentParentAndCharacter[0];\n    var currentCharacter = currentParentAndCharacter[1];\n    if (currentParent.childNodes_[currentCharacter].isEmpty()) {\n      // If the child is empty, then remove it.\n      delete currentParent.childNodes_[currentCharacter];\n    } else {\n      // No point of traversing back any further, since we can't remove this\n      // path.\n      break;\n    }\n  }\n  return oldValue;\n};\n\n\n/**\n * Clones a trie and returns a new trie.  O(N), where N is the number of nodes\n * in the trie.\n * @return {!goog.structs.Trie<VALUE>} A new goog.structs.Trie with the same\n *     key value pairs.\n */\ngoog.structs.Trie.prototype.clone = function() {\n  return new goog.structs.Trie(this);\n};\n\n\n/**\n * Returns the number of key value pairs in the trie.  O(N), where N is the\n * number of nodes in the trie.\n * TODO: This could be optimized by storing a weight (count below) in every\n * node.\n * @return {number} The number of pairs.\n */\ngoog.structs.Trie.prototype.getCount = function() {\n  return goog.structs.getCount(this.getValues());\n};\n\n\n/**\n * Returns true if this trie contains no elements.  ~O(1).\n * @return {boolean} True iff this trie contains no elements.\n */\ngoog.structs.Trie.prototype.isEmpty = function() {\n  return this.value_ === undefined && goog.object.isEmpty(this.childNodes_);\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^;P","^<U"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/trie.js"],"^:1",["^9K",["~$goog.structs.Trie"]],"^9<",true,"^9=",["^9>","^;P","^<U"]],["^ ","^9A",[1579837703000],"^9B","goog.math.coordinate3.js","^9C",["^9D","goog/math/coordinate3.js"],"^9E","goog/math/coordinate3.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A utility class for representing three-dimensional points.\n *\n * Based heavily on coordinate.js by:\n */\n\ngoog.provide('goog.math.Coordinate3');\n\n\n\n/**\n * Class for representing coordinates and positions in 3 dimensions.\n *\n * @param {number=} opt_x X coordinate, defaults to 0.\n * @param {number=} opt_y Y coordinate, defaults to 0.\n * @param {number=} opt_z Z coordinate, defaults to 0.\n * @struct\n * @constructor\n */\ngoog.math.Coordinate3 = function(opt_x, opt_y, opt_z) {\n  /**\n   * X-value\n   * @type {number}\n   */\n  this.x = (opt_x !== undefined) ? opt_x : 0;\n\n  /**\n   * Y-value\n   * @type {number}\n   */\n  this.y = (opt_y !== undefined) ? opt_y : 0;\n\n  /**\n   * Z-value\n   * @type {number}\n   */\n  this.z = (opt_z !== undefined) ? opt_z : 0;\n};\n\n\n/**\n * Returns a new copy of the coordinate.\n *\n * @return {!goog.math.Coordinate3} A clone of this coordinate.\n */\ngoog.math.Coordinate3.prototype.clone = function() {\n  return new goog.math.Coordinate3(this.x, this.y, this.z);\n};\n\n\nif (goog.DEBUG) {\n  /**\n   * Returns a nice string representing the coordinate.\n   *\n   * @return {string} In the form (50, 73, 31).\n   * @override\n   */\n  goog.math.Coordinate3.prototype.toString = function() {\n    return '(' + this.x + ', ' + this.y + ', ' + this.z + ')';\n  };\n}\n\n\n/**\n * Compares coordinates for equality.\n *\n * @param {goog.math.Coordinate3} a A Coordinate3.\n * @param {goog.math.Coordinate3} b A Coordinate3.\n * @return {boolean} True iff the coordinates are equal, or if both are null.\n */\ngoog.math.Coordinate3.equals = function(a, b) {\n  if (a == b) {\n    return true;\n  }\n  if (!a || !b) {\n    return false;\n  }\n  return a.x == b.x && a.y == b.y && a.z == b.z;\n};\n\n\n/**\n * Returns the distance between two coordinates.\n *\n * @param {goog.math.Coordinate3} a A Coordinate3.\n * @param {goog.math.Coordinate3} b A Coordinate3.\n * @return {number} The distance between `a` and `b`.\n */\ngoog.math.Coordinate3.distance = function(a, b) {\n  const dx = a.x - b.x;\n  const dy = a.y - b.y;\n  const dz = a.z - b.z;\n  return Math.sqrt(dx * dx + dy * dy + dz * dz);\n};\n\n\n/**\n * Returns the squared distance between two coordinates. Squared distances can\n * be used for comparisons when the actual value is not required.\n *\n * Performance note: eliminating the square root is an optimization often used\n * in lower-level languages, but the speed difference is not nearly as\n * pronounced in JavaScript (only a few percent.)\n *\n * @param {goog.math.Coordinate3} a A Coordinate3.\n * @param {goog.math.Coordinate3} b A Coordinate3.\n * @return {number} The squared distance between `a` and `b`.\n */\ngoog.math.Coordinate3.squaredDistance = function(a, b) {\n  const dx = a.x - b.x;\n  const dy = a.y - b.y;\n  const dz = a.z - b.z;\n  return dx * dx + dy * dy + dz * dz;\n};\n\n\n/**\n * Returns the difference between two coordinates as a new\n * goog.math.Coordinate3.\n *\n * @param {goog.math.Coordinate3} a A Coordinate3.\n * @param {goog.math.Coordinate3} b A Coordinate3.\n * @return {!goog.math.Coordinate3} A Coordinate3 representing the difference\n *     between `a` and `b`.\n */\ngoog.math.Coordinate3.difference = function(a, b) {\n  return new goog.math.Coordinate3(a.x - b.x, a.y - b.y, a.z - b.z);\n};\n\n\n/**\n * Returns the contents of this coordinate as a 3 value Array.\n *\n * @return {!Array<number>} A new array.\n */\ngoog.math.Coordinate3.prototype.toArray = function() {\n  return [this.x, this.y, this.z];\n};\n\n\n/**\n * Converts a three element array into a Coordinate3 object.  If the value\n * passed in is not an array, not array-like, or not of the right length, an\n * error is thrown.\n *\n * @param {Array<number>} a Array of numbers to become a coordinate.\n * @return {!goog.math.Coordinate3} A new coordinate from the array values.\n * @throws {Error} When the oject passed in is not valid.\n */\ngoog.math.Coordinate3.fromArray = function(a) {\n  if (a.length <= 3) {\n    return new goog.math.Coordinate3(a[0], a[1], a[2]);\n  }\n\n  throw new Error('Conversion from an array requires an array of length 3');\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/coordinate3.js"],"^:1",["^9K",["^J?"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.graphics.js","^9C",["^9D","goog/testing/graphics.js"],"^9E","goog/testing/graphics.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Testing utilities for DOM related tests.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.setTestOnly('goog.testing.graphics');\ngoog.provide('goog.testing.graphics');\n\ngoog.require('goog.graphics.Path');\ngoog.require('goog.testing.asserts');\n\n\n/**\n * Array mapping numeric segment constant to a descriptive character.\n * @type {Array<string>}\n * @private\n */\ngoog.testing.graphics.SEGMENT_NAMES_ = function() {\n  var arr = [];\n  arr[goog.graphics.Path.Segment.MOVETO] = 'M';\n  arr[goog.graphics.Path.Segment.LINETO] = 'L';\n  arr[goog.graphics.Path.Segment.CURVETO] = 'C';\n  arr[goog.graphics.Path.Segment.ARCTO] = 'A';\n  arr[goog.graphics.Path.Segment.CLOSE] = 'X';\n  return arr;\n}();\n\n\n/**\n * Test if the given path matches the expected array of commands and parameters.\n * @param {Array<string|number>} expected The expected array of commands and\n *     parameters.\n * @param {goog.graphics.Path} path The path to test against.\n */\ngoog.testing.graphics.assertPathEquals = function(expected, path) {\n  var actual = [];\n  path.forEachSegment(function(seg, args) {\n    actual.push(goog.testing.graphics.SEGMENT_NAMES_[seg]);\n    Array.prototype.push.apply(actual, args);\n  });\n  assertEquals(expected.length, actual.length);\n  for (var i = 0; i < expected.length; i++) {\n    if (typeof expected[i] === 'number') {\n      assertTrue(typeof actual[i] === 'number');\n      assertRoughlyEquals(expected[i], actual[i], 0.01);\n    } else {\n      assertEquals(expected[i], actual[i]);\n    }\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^>X","^9>","^@>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/graphics.js"],"^:1",["^9K",["~$goog.testing.graphics"]],"^9<",true,"^9=",["^9>","^@>","^>X"]],["^ ","^9A",[1579837703000],"^9B","goog.datasource.jsondatasource.js","^9C",["^9D","goog/datasource/jsondatasource.js"],"^9E","goog/datasource/jsondatasource.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implementation of DataNode for wrapping JSON data.\n *\n */\n\n\ngoog.provide('goog.ds.JsonDataSource');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.ds.DataManager');\ngoog.require('goog.ds.JsDataSource');\ngoog.require('goog.ds.LoadState');\ngoog.require('goog.ds.logger');\ngoog.require('goog.log');\n\n\n\n/**\n * Data source whose backing is a JSON-like service, in which\n * retreiving the resource specified by URL with the additional parameter\n * callback. The resource retreived is executable JavaScript that\n * makes a call to the named function with a JavaScript object literal\n * as the only parameter.\n *\n * Example URI could be:\n * http://www.google.com/data/search?q=monkey&callback=mycb\n * which might return the JS:\n * mycb({searchresults:\n *   [{uri: 'http://www.monkey.com', title: 'Site About Monkeys'}]});\n *\n * TODO(user): Evaluate using goog.net.Jsonp here.\n *\n * A URI of an empty string will mean that no request is made\n * and the data source will be a data source with no child nodes\n *\n * @param {?goog.html.TrustedResourceUrl} uri URI for the request.\n * @param {string} name Name of the datasource.\n * @param {string=} opt_callbackParamName The parameter name that is used to\n *     specify the callback. Defaults to 'callback'.\n *\n * @extends {goog.ds.JsDataSource}\n * @constructor\n * @final\n */\ngoog.ds.JsonDataSource = function(uri, name, opt_callbackParamName) {\n  goog.ds.JsDataSource.call(this, null, name, null);\n  this.uri_ = uri;\n\n  /**\n   * This is the callback parameter name that is added to the uri.\n   * @type {string}\n   * @private\n   */\n  this.callbackParamName_ = opt_callbackParamName || 'callback';\n\n};\ngoog.inherits(goog.ds.JsonDataSource, goog.ds.JsDataSource);\n\n\n/**\n * Default load state is NOT_LOADED\n * @private\n */\ngoog.ds.JsonDataSource.prototype.loadState_ = goog.ds.LoadState.NOT_LOADED;\n\n\n/**\n * Map of all data sources, needed for callbacks\n * Doesn't work unless dataSources is exported (not renamed)\n */\ngoog.ds.JsonDataSource['dataSources'] = {};\n\n\n/**\n * Load or reload the backing data for this node.\n * Fires the JsonDataSource\n * @override\n */\ngoog.ds.JsonDataSource.prototype.load = function() {\n  if (this.uri_) {\n    // NOTE: \"dataSources\" is expose above by name so that it will not be\n    // renamed.  It should therefore be accessed via array notation here so\n    // that it also doesn't get renamed and stops the compiler from complaining\n    goog.ds.JsonDataSource['dataSources'][this.dataName_] = this;\n    goog.log.info(\n        goog.ds.logger,\n        'Sending JS request for DataSource ' + this.getDataName() + ' to ' +\n            this.uri_.getTypedStringValue());\n\n    this.loadState_ = goog.ds.LoadState.LOADING;\n\n    var params = {};\n    params[this.callbackParamName_] = 'JsonReceive.' + this.dataName_;\n    var uriToCall = this.uri_.cloneWithParams(params);\n\n    goog.global['JsonReceive'][this.dataName_] =\n        goog.bind(this.receiveData, this);\n\n    var scriptEl = goog.dom.createDom(goog.dom.TagName.SCRIPT);\n    goog.dom.safe.setScriptSrc(scriptEl, uriToCall);\n    goog.dom.getElementsByTagNameAndClass(goog.dom.TagName.HEAD)[0].appendChild(\n        scriptEl);\n  } else {\n    this.root_ = {};\n    this.loadState_ = goog.ds.LoadState.NOT_LOADED;\n  }\n};\n\n\n/**\n * Gets the state of the backing data for this node\n * @return {goog.ds.LoadState} The state.\n * @override\n */\ngoog.ds.JsonDataSource.prototype.getLoadState = function() {\n  return this.loadState_;\n};\n\n\n/**\n * Receives data from a Json request\n * @param {Object} obj The JSON data.\n */\ngoog.ds.JsonDataSource.prototype.receiveData = function(obj) {\n  this.setRoot(obj);\n  this.loadState_ = goog.ds.LoadState.LOADED;\n  goog.ds.DataManager.getInstance().fireDataChange(this.getDataName());\n};\n\n\n/**\n* Temp variable to hold callbacks\n* until BUILD supports multiple externs.js files\n*/\ngoog.global['JsonReceive'] = {};\n","^9I",1579837703000,"^9J",["^9K",["^AI","^;;","^9>","^;Q","^AK","^AL","^@B","~$goog.ds.JsDataSource","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/datasource/jsondatasource.js"],"^:1",["^9K",["~$goog.ds.JsonDataSource"]],"^9<",true,"^9=",["^9>","^;;","^;=","^@B","^AK","^T6","^AL","^AI","^;Q"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.streams.full_test_cases.js","^9C",["^9D","goog/streams/full_test_cases.js"],"^9E","goog/streams/full_test_cases.js","^9F","^9G","^9H","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.module('goog.streams.fullTestCases');\ngoog.setTestOnly();\n\nconst recordFunction = goog.require('goog.testing.recordFunction');\nconst {ReadableStream, ReadableStreamDefaultController, ReadableStreamStrategy, ReadableStreamUnderlyingSource} = goog.require('goog.streams.fullTypes');\nconst {TestCases: LiteTestCases} = goog.require('goog.streams.liteTestCases');\n\n/**\n * @return {number}\n */\nconst chunkSizeTwo = () => 2;\n\nclass TestCases extends LiteTestCases {\n  /**\n   * @param {function(!ReadableStreamUnderlyingSource=,\n   *     !ReadableStreamStrategy=): !ReadableStream} newReadableStream\n   */\n  constructor(newReadableStream) {\n    super(newReadableStream);\n\n    /**\n     * @type {function(!ReadableStreamUnderlyingSource=,\n     *     !ReadableStreamStrategy=): !ReadableStream}\n     * @override\n     */\n    this.newReadableStream;\n  }\n\n  /**\n   * @param {!ReadableStreamUnderlyingSource=} underlyingSource\n   * @param {!ReadableStreamStrategy=} strategy\n   * @return {{stream: !ReadableStream<string>, controller:\n   *     !ReadableStreamDefaultController<string>}}\n   * @override\n   */\n  newReadableStreamWithController(underlyingSource = {}, strategy = {}) {\n    let controller;\n    const start = underlyingSource.start;\n    underlyingSource = Object.assign({}, underlyingSource, {\n      start(ctlr) {\n        controller = ctlr;\n        return start && start(ctlr);\n      },\n    });\n    const stream = this.newReadableStream(underlyingSource, strategy);\n    return {stream, controller};\n  }\n\n  async testCancel() {\n    const stream = this.newReadableStream();\n    const cancelResult = await stream.cancel(new Error('error'));\n    assertUndefined(cancelResult);\n    const {done} = await stream.getReader().read();\n    assertTrue(done);\n  }\n\n  async testCancel_Closed() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    controller.close();\n    const cancelResult = await stream.cancel(new Error('error'));\n    assertUndefined(cancelResult);\n    const {done} = await stream.getReader().read();\n    assertTrue(done);\n  }\n\n  async testCancel_Errored() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const error = new Error('error');\n    controller.error(error);\n    const cancelError =\n        await assertRejects(stream.cancel(new Error('other-error')));\n    assertEquals(error, cancelError);\n  }\n\n  async testCancel_Locked() {\n    const stream = this.newReadableStream();\n    stream.getReader();\n    await assertRejects(stream.cancel(new Error('error')));\n  }\n\n  async testCancel_Source() {\n    const cancel = recordFunction();\n    const stream = this.newReadableStream({cancel});\n    const reason = new Error('error');\n    await stream.cancel(reason);\n    cancel.assertCallCount(1);\n    assertArrayEquals([reason], cancel.getLastCall().getArguments());\n  }\n\n  async testCancel_ThrowingSource() {\n    const thrownError = new Error('error');\n    const cancel = recordFunction(() => {\n      throw thrownError;\n    });\n    const stream = this.newReadableStream({cancel});\n    const cancelError =\n        await assertRejects(stream.cancel(new Error('other-error')));\n    assertEquals(thrownError, cancelError);\n  }\n\n  async testCancel_RejectingSource() {\n    const rejectedError = new Error('error');\n    const cancel = recordFunction(() => Promise.reject(rejectedError));\n    const stream = this.newReadableStream({cancel});\n    const cancelError =\n        await assertRejects(stream.cancel(new Error('other-error')));\n    assertEquals(rejectedError, cancelError);\n  }\n\n  async testReaderCancel() {\n    const stream = this.newReadableStream();\n    const reader = stream.getReader();\n    const cancelResult = await reader.cancel(new Error('error'));\n    assertUndefined(cancelResult);\n    const {done} = await reader.read();\n    assertTrue(done);\n  }\n\n  async testReaderCancel_Closed() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const reader = stream.getReader();\n    controller.close();\n    const cancelResult = await reader.cancel(new Error('error'));\n    assertUndefined(cancelResult);\n    const {done} = await reader.read();\n    assertTrue(done);\n  }\n\n  async testReaderCancel_Errored() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const error = new Error('error');\n    controller.error(error);\n    const cancelError = await assertRejects(\n        stream.getReader().cancel(new Error('other-error')));\n    assertEquals(error, cancelError);\n  }\n\n  async testReaderCancel_Source() {\n    const cancel = recordFunction();\n    const stream = this.newReadableStream({cancel});\n    const reason = new Error('error');\n    await stream.getReader().cancel(reason);\n    cancel.assertCallCount(1);\n    assertArrayEquals([reason], cancel.getLastCall().getArguments());\n  }\n\n  async testReaderCancel_ThrowingSource() {\n    const thrownError = new Error('error');\n    const cancel = recordFunction(() => {\n      throw thrownError;\n    });\n    const stream = this.newReadableStream({cancel});\n    const cancelError = await assertRejects(\n        stream.getReader().cancel(new Error('other-error')));\n    assertEquals(thrownError, cancelError);\n  }\n\n  async testReaderCancel_RejectingSource() {\n    const rejectedError = new Error('error');\n    const cancel = recordFunction(() => Promise.reject(rejectedError));\n    const stream = this.newReadableStream({cancel});\n    const cancelError = await assertRejects(\n        stream.getReader().cancel(new Error('other-error')));\n    assertEquals(rejectedError, cancelError);\n  }\n\n  async testReaderCancel_ReleasedReader() {\n    const stream = this.newReadableStream();\n    const reader = stream.getReader();\n    reader.releaseLock();\n    await assertRejects(reader.cancel(new Error('error')));\n  }\n\n  testDesiredSize_Default_Decreases() {\n    const {controller} = this.newReadableStreamWithController();\n    assertEquals(1, controller.desiredSize);\n    controller.enqueue('foo');\n    assertEquals(0, controller.desiredSize);\n    controller.enqueue('bar');\n    assertEquals(-1, controller.desiredSize);\n  }\n\n  async testDesiredSize_Default_Increases() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    controller.enqueue('foo');\n    controller.enqueue('bar');\n    controller.enqueue('baz');\n    assertEquals(-2, controller.desiredSize);\n    const reader = stream.getReader();\n    await reader.read();\n    assertEquals(-1, controller.desiredSize);\n    await reader.read();\n    assertEquals(0, controller.desiredSize);\n    await reader.read();\n    assertEquals(1, controller.desiredSize);\n  }\n\n  testDesiredSize_Default_Errored() {\n    const {controller} = this.newReadableStreamWithController();\n    controller.error(new Error('error'));\n    assertNull(controller.desiredSize);\n  }\n\n  testDesiredSize_Default_Closed() {\n    const {controller} = this.newReadableStreamWithController();\n    controller.close();\n    assertEquals(0, controller.desiredSize);\n  }\n\n  testDesiredSize_CustomSize_Decreases() {\n    const {controller} =\n        this.newReadableStreamWithController(/* underlyingSource */ undefined, {\n          size: chunkSizeTwo,\n        });\n    assertEquals(1, controller.desiredSize);\n    controller.enqueue('foo');\n    assertEquals(-1, controller.desiredSize);\n    controller.enqueue('bar');\n    assertEquals(-3, controller.desiredSize);\n  }\n\n  async testDesiredSize_CustomSize_Increases() {\n    const {stream, controller} =\n        this.newReadableStreamWithController(/* underlyingSource */ undefined, {\n          size: chunkSizeTwo,\n        });\n    controller.enqueue('foo');\n    controller.enqueue('bar');\n    controller.enqueue('baz');\n    assertEquals(-5, controller.desiredSize);\n    const reader = stream.getReader();\n    await reader.read();\n    assertEquals(-3, controller.desiredSize);\n    await reader.read();\n    assertEquals(-1, controller.desiredSize);\n    await reader.read();\n    assertEquals(1, controller.desiredSize);\n  }\n\n  testDesiredSize_CustomSize_Errored() {\n    const {controller} =\n        this.newReadableStreamWithController(/* underlyingSource */ undefined, {\n          size: chunkSizeTwo,\n        });\n    controller.error(new Error('error'));\n    assertNull(controller.desiredSize);\n  }\n\n  testDesiredSize_CustomSize_Closed() {\n    const {controller} =\n        this.newReadableStreamWithController(/* underlyingSource */ undefined, {\n          size: chunkSizeTwo,\n        });\n    controller.close();\n    assertEquals(0, controller.desiredSize);\n  }\n\n  testDesiredSize_CustomHighWaterMark_Decreases() {\n    const {controller} =\n        this.newReadableStreamWithController(/* underlyingSource */ undefined, {\n          highWaterMark: 4,\n        });\n    assertEquals(4, controller.desiredSize);\n    controller.enqueue('foo');\n    assertEquals(3, controller.desiredSize);\n    controller.enqueue('bar');\n    assertEquals(2, controller.desiredSize);\n  }\n\n  async testDesiredSize_CustomHighWaterMark_Increases() {\n    const {stream, controller} =\n        this.newReadableStreamWithController(/* underlyingSource */ undefined, {\n          highWaterMark: 4,\n        });\n    controller.enqueue('foo');\n    controller.enqueue('bar');\n    controller.enqueue('baz');\n    assertEquals(1, controller.desiredSize);\n    const reader = stream.getReader();\n    await reader.read();\n    assertEquals(2, controller.desiredSize);\n    await reader.read();\n    assertEquals(3, controller.desiredSize);\n    await reader.read();\n    assertEquals(4, controller.desiredSize);\n  }\n\n  testDesiredSize_CustomHighWaterMark_Errored() {\n    const {controller} =\n        this.newReadableStreamWithController(/* underlyingSource */ undefined, {\n          highWaterMark: 4,\n        });\n    controller.error(new Error('error'));\n    assertNull(controller.desiredSize);\n  }\n\n  testDesiredSize_CustomHighWaterMark_Closed() {\n    const {controller} =\n        this.newReadableStreamWithController(/* underlyingSource */ undefined, {\n          highWaterMark: 4,\n        });\n    controller.close();\n    assertEquals(0, controller.desiredSize);\n  }\n\n  testSize_Chunks() {\n    const size = recordFunction(() => 1);\n    const {controller} =\n        this.newReadableStreamWithController(/* underlyingSource */ undefined, {\n          size,\n        });\n    controller.enqueue('foo');\n    controller.enqueue('bar');\n    controller.enqueue('baz');\n    size.assertCallCount(3);\n    assertObjectEquals(\n        [['foo'], ['bar'], ['baz']],\n        size.getCalls().map((call) => call.getArguments()));\n  }\n\n  testSize_Negative() {\n    const {controller} =\n        this.newReadableStreamWithController(/* underlyingSource */ undefined, {\n          size: () => -1,\n        });\n    assertThrows(() => {\n      controller.enqueue('foo');\n    });\n  }\n\n  testSize_Infinity() {\n    const {controller} =\n        this.newReadableStreamWithController(/* underlyingSource */ undefined, {\n          size: () => Infinity,\n        });\n    assertThrows(() => {\n      controller.enqueue('foo');\n    });\n  }\n\n  testSize_NonNumber() {\n    const {controller} =\n        this.newReadableStreamWithController(/* underlyingSource */ undefined, {\n          size: () => 'bar',\n        });\n    assertThrows(() => {\n      controller.enqueue('foo');\n    });\n  }\n\n  testSize_Throws() {\n    const {controller} =\n        this.newReadableStreamWithController(/* underlyingSource */ undefined, {\n          size: () => {\n            throw new Error('error');\n          }\n        });\n    assertThrows(() => {\n      controller.enqueue('foo');\n    });\n  }\n\n  async testPull() {\n    const pull = recordFunction();\n    this.newReadableStreamWithController({pull});\n    // Pull is called once after start is resolved.\n    await undefined;\n    pull.assertCallCount(1);\n    await undefined;\n    pull.assertCallCount(1);\n  }\n\n  async testPull_StartEnqueue() {\n    const pull = recordFunction();\n    this.newReadableStreamWithController({\n      start(controller) {\n        controller.enqueue('foo');\n      },\n      pull,\n    });\n    await undefined;\n    // Pull is not called because the queue is full.\n    pull.assertCallCount(0);\n  }\n\n  async testPull_AfterAsyncStart() {\n    const pull = recordFunction();\n    let resolveStart;\n    const startPromise = new Promise((resolve) => {\n      resolveStart = resolve;\n    });\n    const start = recordFunction(() => startPromise);\n    this.newReadableStreamWithController({start, pull});\n    await undefined;\n    pull.assertCallCount(0);\n    resolveStart();\n    await startPromise;\n    // Pull is finally called after the start promise is resolved.\n    pull.assertCallCount(1);\n  }\n\n  async testPull_AfterAsyncStart_PreventsReadPulls() {\n    const pull = recordFunction();\n    let resolveStart;\n    const startPromise = new Promise((resolve) => {\n      resolveStart = resolve;\n    });\n    const start = recordFunction(() => startPromise);\n    const {stream} = this.newReadableStreamWithController({start, pull});\n    pull.assertCallCount(0);\n    stream.getReader().read();\n    pull.assertCallCount(0);\n    resolveStart();\n    await startPromise;\n    // Pull is called only once for the start.\n    pull.assertCallCount(1);\n  }\n\n  async testPull_AfterRead() {\n    const pull = recordFunction();\n    const {stream} = this.newReadableStreamWithController({pull});\n    // Wait for start to finish.\n    await pull.waitForCalls(1);\n    pull.reset();\n    stream.getReader().read();\n    // Synchronously calls pull.\n    pull.assertCallCount(1);\n  }\n\n  async testPull_AfterReadOnEmptyStream() {\n    const pull = recordFunction();\n    const {stream} = this.newReadableStreamWithController({pull});\n    // Wait for start to finish.\n    await pull.waitForCalls(1);\n    pull.reset();\n    stream.getReader().read();\n    // Synchronously calls pull.\n    pull.assertCallCount(1);\n  }\n\n  async testPull_AfterTwoReadsOnEmptyStream() {\n    const pull = recordFunction();\n    const {stream} = this.newReadableStreamWithController({pull});\n    // Wait for start to finish.\n    await pull.waitForCalls(1);\n    pull.reset();\n    const reader = stream.getReader();\n    reader.read();\n    // First call is synchronous.\n    pull.assertCallCount(1);\n    reader.read();\n    // Second call is deferred.\n    pull.assertCallCount(1);\n    await undefined;\n    pull.assertCallCount(2);\n  }\n\n  async testPull_AfterManyReadsOnEmptyStream() {\n    const pull = recordFunction();\n    const {stream} = this.newReadableStreamWithController({pull});\n    // Wait for start to finish.\n    await pull.waitForCalls(1);\n    pull.reset();\n    const reader = stream.getReader();\n    reader.read();\n    reader.read();\n    reader.read();\n    reader.read();\n    reader.read();\n    await 0;\n    // Only two calls to pull happen, no matter how many reads.\n    pull.assertCallCount(2);\n  }\n\n  async testPull_Asynchronous() {\n    let pullResolve;\n    const pullPromise = new Promise((resolve) => {\n      pullResolve = resolve;\n    });\n    const pull = recordFunction(() => pullPromise);\n    const {stream} = this.newReadableStreamWithController({pull});\n    // Called by start.\n    await pull.waitForCalls(1);\n    const reader = stream.getReader();\n    reader.read();\n    reader.read();\n    reader.read();\n    // No calls because pull is still resolving.\n    pull.assertCallCount(1);\n    pullResolve();\n    await pullPromise;\n    // Called once the first pull resolves.\n    pull.assertCallCount(2);\n  }\n\n  async testPull_Throws() {\n    const pull = recordFunction(() => {\n      throw new Error('error');\n    });\n    const {stream} = this.newReadableStreamWithController({pull});\n    const reader = stream.getReader();\n    await assertRejects(reader.read());\n  }\n\n  async testPull_Rejects() {\n    const pull = recordFunction(() => Promise.reject(new Error('error')));\n    const {stream} = this.newReadableStreamWithController({pull});\n    const reader = stream.getReader();\n    await assertRejects(reader.read());\n  }\n\n  async testTee() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    controller.enqueue('1');\n    controller.enqueue('2');\n    controller.enqueue('3');\n    controller.close();\n    const [stream1, stream2] = stream.tee();\n    const chunks1 = [];\n    const reader1 = stream1.getReader();\n    let result1 = await reader1.read();\n    while (!result1.done) {\n      chunks1.push(result1.value);\n      result1 = await reader1.read();\n    }\n    assertArrayEquals(['1', '2', '3'], chunks1);\n    const chunks2 = [];\n    const reader2 = stream2.getReader();\n    let result2 = await reader2.read();\n    while (!result2.done) {\n      chunks2.push(result2.value);\n      result2 = await reader2.read();\n    }\n    assertArrayEquals(['1', '2', '3'], chunks2);\n  }\n\n  async testTee_Cancel() {\n    const cancel = recordFunction();\n    const {stream, controller} = this.newReadableStreamWithController({\n      cancel,\n    });\n    const [stream1, stream2] = stream.tee();\n    const cancel1Result = stream1.cancel('reason1');\n    cancel.assertCallCount(0);\n    await 0;  // Just in case the cancel resolves on the next tick.\n    cancel.assertCallCount(0);\n    const cancel2Result = stream2.cancel('reason2');\n    cancel.assertCallCount(1);\n    assertArrayEquals(\n        ['reason1', 'reason2'], cancel.getLastCall().getArguments()[0]);\n    const cancel1Value = await cancel1Result;\n    const cancel2Value = await cancel2Result;\n    assertUndefined(cancel1Value);\n    assertUndefined(cancel2Value);\n  }\n\n  async testTee_Cancel_ReverseOrder() {\n    const cancel = recordFunction();\n    const {stream, controller} = this.newReadableStreamWithController({\n      cancel,\n    });\n    const [stream1, stream2] = stream.tee();\n    const cancel2Result = stream2.cancel('reason2');\n    cancel.assertCallCount(0);\n    await 0;  // Just in case the cancel resolves on the next tick.\n    cancel.assertCallCount(0);\n    const cancel1Result = stream1.cancel('reason1');\n    cancel.assertCallCount(1);\n    assertArrayEquals(\n        ['reason1', 'reason2'], cancel.getLastCall().getArguments()[0]);\n    const cancel1Value = await cancel1Result;\n    const cancel2Value = await cancel2Result;\n    assertUndefined(cancel1Value);\n    assertUndefined(cancel2Value);\n  }\n\n  async testTee_Cancel_NoCancelOnSource() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const [stream1, stream2] = stream.tee();\n    const cancel1Result = stream1.cancel('reason1');\n    const cancel2Result = stream2.cancel('reason2');\n    const cancel1Value = await cancel1Result;\n    const cancel2Value = await cancel2Result;\n    assertUndefined(cancel1Value);\n    assertUndefined(cancel2Value);\n  }\n\n  async testTee_Cancel_Rejects() {\n    const error = new Error('error');\n    const cancel = recordFunction(() => {\n      throw error;\n    });\n    const {stream, controller} = this.newReadableStreamWithController({\n      cancel,\n    });\n    const [stream1, stream2] = stream.tee();\n    const cancel1Result = stream1.cancel('reason1');\n    const cancel2Result = stream2.cancel('reason2');\n    const error1 = await assertRejects(cancel1Result);\n    const error2 = await assertRejects(cancel2Result);\n    assertEquals(error, error1);\n    assertEquals(error, error2);\n  }\n\n  async testTee_Locked() {\n    const stream = this.newReadableStream();\n    stream.getReader();\n    assertThrows(() => {\n      stream.tee();\n    });\n  }\n}\n\nclass TestCasesWithIterator extends TestCases {\n  async testAsyncIterator() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    controller.enqueue('foo');\n    controller.enqueue('bar');\n    controller.close();\n    const chunks = [];\n    for await (const chunk of stream) {\n      chunks.push(chunk);\n    }\n    assertArrayEquals(['foo', 'bar'], chunks);\n  }\n\n  async testAsyncIterator_Closed() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    controller.close();\n    const chunks = [];\n    for await (const chunk of stream) {\n      chunks.push(chunk);\n    }\n    assertArrayEquals([], chunks);\n  }\n\n  async testAsyncIterator_Error() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    controller.error(new Error('error'));\n    const itr = stream[Symbol.asyncIterator]();\n    assertRejects(itr.next());\n  }\n\n  async testAsyncIterator_Locked() {\n    const stream = this.newReadableStream();\n    stream.getReader();\n    assertThrows(() => {\n      stream[Symbol.asyncIterator]();\n    });\n  }\n\n  async testAsyncIterator_Partial() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    controller.enqueue('foo');\n    controller.enqueue('bar');\n    controller.close();\n    const reader = stream.getReader();\n    await reader.read();\n    reader.releaseLock();\n    const chunks = [];\n    for await (const chunk of stream) {\n      chunks.push(chunk);\n    }\n    assertArrayEquals(['bar'], chunks);\n  }\n\n  async testAsyncIterator_Released() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    controller.close();\n    const itr = stream[Symbol.asyncIterator]();\n    const {done} = await itr.next();\n    assertTrue(done);\n    assertRejects(itr.next());\n  }\n\n  async testAsyncIterator_Return() {\n    const cancel = recordFunction();\n    const {stream, controller} = this.newReadableStreamWithController({\n      cancel,\n    });\n    const itr = stream[Symbol.asyncIterator]();\n    const error = new Error('error');\n    const returnResult = await itr.return(error);\n    cancel.assertCallCount(1);\n    assertArrayEquals([error], cancel.getLastCall().getArguments());\n    assertEquals(error, returnResult.value);\n    assertTrue(returnResult.done);\n    const reader = stream.getReader();\n    const readResult = await reader.read();\n    assertUndefined(readResult.value);\n    assertTrue(readResult.done);\n  }\n\n  async testAsyncIterator_PreventCancel_Return() {\n    const cancel = recordFunction();\n    const {stream, controller} = this.newReadableStreamWithController({\n      cancel,\n    });\n    const itr = stream[Symbol.asyncIterator]({preventCancel: true});\n    const error = new Error('error');\n    const returnResult = await itr.return(error);\n    cancel.assertCallCount(0);\n    assertEquals(error, returnResult.value);\n    assertTrue(returnResult.done);\n    await assertRejects(itr.next());\n  }\n\n  testGetIterator() {\n    const stream = this.newReadableStream();\n    assertEquals(stream.getIterator, stream[Symbol.asyncIterator]);\n  }\n}\n\nexports = {\n  TestCases,\n  TestCasesWithIterator,\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.streams.liteTestCases","^9>","~$goog.testing.recordFunction","^<M"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/streams/full_test_cases.js"],"^:1",["^9K",["~$goog.streams.fullTestCases"]],"^9<",true,"^9=",["^9>","^T9","^<M","^T8"]],["^ ","^9A",[1579837703000],"^9B","goog.debug.errorcontext.js","^9C",["^9D","goog/debug/errorcontext.js"],"^9E","goog/debug/errorcontext.js","^9F","^9G","^9H","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides methods dealing with context on error objects.\n */\n\ngoog.provide('goog.debug.errorcontext');\n\n\n/**\n * Adds key-value context to the error.\n * @param {!Error} err The error to add context to.\n * @param {string} contextKey Key for the context to be added.\n * @param {string} contextValue Value for the context to be added.\n */\ngoog.debug.errorcontext.addErrorContext = function(\n    err, contextKey, contextValue) {\n  if (!err[goog.debug.errorcontext.CONTEXT_KEY_]) {\n    err[goog.debug.errorcontext.CONTEXT_KEY_] = {};\n  }\n  err[goog.debug.errorcontext.CONTEXT_KEY_][contextKey] = contextValue;\n};\n\n\n/**\n * @param {!Error} err The error to get context from.\n * @return {!Object<string, string>} The context of the provided error.\n */\ngoog.debug.errorcontext.getErrorContext = function(err) {\n  return err[goog.debug.errorcontext.CONTEXT_KEY_] || {};\n};\n\n\n// TODO(user): convert this to a Symbol once goog.debug.ErrorReporter is\n// able to use ES6.\n/** @private @const {string} */\ngoog.debug.errorcontext.CONTEXT_KEY_ = '__closure__error__context__984382';\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/errorcontext.js"],"^:1",["^9K",["^;S"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.attachablemenu.js","^9C",["^9D","goog/ui/attachablemenu.js"],"^9E","goog/ui/attachablemenu.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the AttachableMenu class.\n *\n */\n\ngoog.provide('goog.ui.AttachableMenu');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.string');\ngoog.require('goog.style');\ngoog.require('goog.ui.ItemEvent');\ngoog.require('goog.ui.MenuBase');\ngoog.require('goog.ui.PopupBase');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * An implementation of a menu that can attach itself to DOM element that\n * are annotated appropriately.\n *\n * The following attributes are used by the AttachableMenu\n *\n * menu-item - Should be set on DOM elements that function as items in the\n * menu that can be selected.\n * classNameSelected - A class that will be added to the element's class names\n * when the item is selected via keyboard or mouse.\n *\n * @param {Element=} opt_element A DOM element for the popup.\n * @constructor\n * @extends {goog.ui.MenuBase}\n * @deprecated Use goog.ui.PopupMenu.\n * @final\n */\ngoog.ui.AttachableMenu = function(opt_element) {\n  goog.ui.MenuBase.call(this, opt_element);\n};\ngoog.inherits(goog.ui.AttachableMenu, goog.ui.MenuBase);\ngoog.tagUnsealableClass(goog.ui.AttachableMenu);\n\n\n/**\n * The currently selected element (mouse was moved over it or keyboard arrows)\n * @type {?HTMLElement}\n * @private\n */\ngoog.ui.AttachableMenu.prototype.selectedElement_ = null;\n\n\n/**\n * Class name to append to a menu item's class when it's selected\n * @type {string}\n * @private\n */\ngoog.ui.AttachableMenu.prototype.itemClassName_ = 'menu-item';\n\n\n/**\n * Class name to append to a menu item's class when it's selected\n * @type {string}\n * @private\n */\ngoog.ui.AttachableMenu.prototype.selectedItemClassName_ = 'menu-item-selected';\n\n\n/**\n * Keep track of when the last key was pressed so that a keydown-scroll doesn't\n * trigger a mouseover event\n * @type {number}\n * @private\n */\ngoog.ui.AttachableMenu.prototype.lastKeyDown_ = goog.now();\n\n\n/** @override */\ngoog.ui.AttachableMenu.prototype.disposeInternal = function() {\n  goog.ui.AttachableMenu.superClass_.disposeInternal.call(this);\n  this.selectedElement_ = null;\n};\n\n\n/**\n * Sets the class name to use for menu items\n *\n * @return {string} The class name to use for items.\n */\ngoog.ui.AttachableMenu.prototype.getItemClassName = function() {\n  return this.itemClassName_;\n};\n\n\n/**\n * Sets the class name to use for menu items\n *\n * @param {string} name The class name to use for items.\n */\ngoog.ui.AttachableMenu.prototype.setItemClassName = function(name) {\n  this.itemClassName_ = name;\n};\n\n\n/**\n * Sets the class name to use for selected menu items\n * todo(user) - reevaluate if we can simulate pseudo classes in IE\n *\n * @return {string} The class name to use for selected items.\n */\ngoog.ui.AttachableMenu.prototype.getSelectedItemClassName = function() {\n  return this.selectedItemClassName_;\n};\n\n\n/**\n * Sets the class name to use for selected menu items\n * todo(user) - reevaluate if we can simulate pseudo classes in IE\n *\n * @param {string} name The class name to use for selected items.\n */\ngoog.ui.AttachableMenu.prototype.setSelectedItemClassName = function(name) {\n  this.selectedItemClassName_ = name;\n};\n\n\n/**\n * Returns the selected item\n *\n * @return {Element} The item selected or null if no item is selected.\n * @override\n */\ngoog.ui.AttachableMenu.prototype.getSelectedItem = function() {\n  return this.selectedElement_;\n};\n\n\n/** @override */\ngoog.ui.AttachableMenu.prototype.setSelectedItem = function(obj) {\n  var elt = /** @type {HTMLElement} */ (obj);\n  if (this.selectedElement_) {\n    goog.dom.classlist.remove(\n        this.selectedElement_, this.selectedItemClassName_);\n  }\n\n  this.selectedElement_ = elt;\n\n  var el = /** @type {HTMLElement} */ (this.getElement());\n  goog.asserts.assert(el, 'The attachable menu DOM element cannot be null.');\n  if (this.selectedElement_) {\n    goog.dom.classlist.add(this.selectedElement_, this.selectedItemClassName_);\n\n    if (elt.id) {\n      // Update activedescendant to reflect the new selection. ARIA roles for\n      // menu and menuitem can be set statically (through Soy templates, for\n      // example) whereas this needs to be updated as the selection changes.\n      goog.a11y.aria.setState(\n          el, goog.a11y.aria.State.ACTIVEDESCENDANT, elt.id);\n    }\n\n    var top = this.selectedElement_.offsetTop;\n    var height = this.selectedElement_.offsetHeight;\n    var scrollTop = el.scrollTop;\n    var scrollHeight = el.offsetHeight;\n\n    // If the menu is scrollable this scrolls the selected item into view\n    // (this has no effect when the menu doesn't scroll)\n    if (top < scrollTop) {\n      el.scrollTop = top;\n    } else if (top + height > scrollTop + scrollHeight) {\n      el.scrollTop = top + height - scrollHeight;\n    }\n  } else {\n    // Clear off activedescendant to reflect no selection.\n    goog.a11y.aria.setState(el, goog.a11y.aria.State.ACTIVEDESCENDANT, '');\n  }\n};\n\n\n/** @override */\ngoog.ui.AttachableMenu.prototype.showPopupElement = function() {\n  // The scroll position cannot be set for hidden (display: none) elements in\n  // gecko browsers.\n  var el = /** @type {Element} */ (this.getElement());\n  goog.style.setElementShown(el, true);\n  el.scrollTop = 0;\n  el.style.visibility = 'visible';\n};\n\n\n/**\n * Called after the menu is shown.\n * @override\n * @protected\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.AttachableMenu.prototype.onShow = function() {\n  goog.ui.AttachableMenu.superClass_.onShow.call(this);\n\n  // In IE, focusing the menu causes weird scrolling to happen. Focusing the\n  // first child makes the scroll behavior better, and the key handling still\n  // works. In FF, focusing the first child causes us to lose key events, so we\n  // still focus the menu.\n  var el = this.getElement();\n  goog.userAgent.IE ? el.firstChild.focus() : el.focus();\n};\n\n\n/**\n * Returns the next or previous item. Used for up/down arrows.\n *\n * @param {boolean} prev True to go to the previous element instead of next.\n * @return {Element} The next or previous element.\n * @protected\n */\ngoog.ui.AttachableMenu.prototype.getNextPrevItem = function(prev) {\n  // first find the index of the next element\n  var elements = this.getElement().getElementsByTagName('*');\n  var elementCount = elements.length;\n  var index;\n  // if there is a selected element, find its index and then inc/dec by one\n  if (this.selectedElement_) {\n    for (var i = 0; i < elementCount; i++) {\n      if (elements[i] == this.selectedElement_) {\n        index = prev ? i - 1 : i + 1;\n        break;\n      }\n    }\n  }\n\n  // if no selected element, start from beginning or end\n  if (index === undefined) {\n    index = prev ? elementCount - 1 : 0;\n  }\n\n  // iterate forward or backwards through the elements finding the next\n  // menu item\n  for (var i = 0; i < elementCount; i++) {\n    var multiplier = prev ? -1 : 1;\n    var nextIndex = index + (multiplier * i) % elementCount;\n\n    // if overflowed/underflowed, wrap around\n    if (nextIndex < 0) {\n      nextIndex += elementCount;\n    } else if (nextIndex >= elementCount) {\n      nextIndex -= elementCount;\n    }\n\n    if (this.isMenuItem_(elements[nextIndex])) {\n      return elements[nextIndex];\n    }\n  }\n  return null;\n};\n\n\n/**\n * Mouse over handler for the menu.\n * @param {goog.events.Event} e The event object.\n * @protected\n * @override\n */\ngoog.ui.AttachableMenu.prototype.onMouseOver = function(e) {\n  var eltItem = this.getAncestorMenuItem_(/** @type {Element} */ (e.target));\n  if (eltItem == null) {\n    return;\n  }\n\n  // Stop the keydown triggering a mouseover in FF.\n  if (goog.now() - this.lastKeyDown_ > goog.ui.PopupBase.DEBOUNCE_DELAY_MS) {\n    this.setSelectedItem(eltItem);\n  }\n};\n\n\n/**\n * Mouse out handler for the menu.\n * @param {goog.events.Event} e The event object.\n * @protected\n * @override\n */\ngoog.ui.AttachableMenu.prototype.onMouseOut = function(e) {\n  var eltItem = this.getAncestorMenuItem_(/** @type {Element} */ (e.target));\n  if (eltItem == null) {\n    return;\n  }\n\n  // Stop the keydown triggering a mouseout in FF.\n  if (goog.now() - this.lastKeyDown_ > goog.ui.PopupBase.DEBOUNCE_DELAY_MS) {\n    this.setSelectedItem(null);\n  }\n};\n\n\n/**\n * Mouse down handler for the menu. Prevents default to avoid text selection.\n * @param {!goog.events.Event} e The event object.\n * @protected\n * @override\n */\ngoog.ui.AttachableMenu.prototype.onMouseDown = goog.events.Event.preventDefault;\n\n\n/**\n * Mouse up handler for the menu.\n * @param {goog.events.Event} e The event object.\n * @protected\n * @override\n */\ngoog.ui.AttachableMenu.prototype.onMouseUp = function(e) {\n  var eltItem = this.getAncestorMenuItem_(/** @type {Element} */ (e.target));\n  if (eltItem == null) {\n    return;\n  }\n  this.setVisible(false);\n  this.onItemSelected_(eltItem);\n};\n\n\n/**\n * Key down handler for the menu.\n * @param {goog.events.KeyEvent} e The event object.\n * @protected\n * @override\n */\ngoog.ui.AttachableMenu.prototype.onKeyDown = function(e) {\n  switch (e.keyCode) {\n    case goog.events.KeyCodes.DOWN:\n      this.setSelectedItem(this.getNextPrevItem(false));\n      this.lastKeyDown_ = goog.now();\n      break;\n    case goog.events.KeyCodes.UP:\n      this.setSelectedItem(this.getNextPrevItem(true));\n      this.lastKeyDown_ = goog.now();\n      break;\n    case goog.events.KeyCodes.ENTER:\n      if (this.selectedElement_) {\n        this.onItemSelected_();\n        this.setVisible(false);\n      }\n      break;\n    case goog.events.KeyCodes.ESC:\n      this.setVisible(false);\n      break;\n    default:\n      if (e.charCode) {\n        var charStr = String.fromCharCode(e.charCode);\n        this.selectByName_(charStr, 1, true);\n      }\n      break;\n  }\n  // Prevent the browser's default keydown behaviour when the menu is open,\n  // e.g. keyboard scrolling.\n  e.preventDefault();\n\n  // Stop propagation to prevent application level keyboard shortcuts from\n  // firing.\n  e.stopPropagation();\n\n  this.dispatchEvent(e);\n};\n\n\n/**\n * Find an item that has the given prefix and select it.\n *\n * @param {string} prefix The entered prefix, so far.\n * @param {number=} opt_direction 1 to search forward from the selection\n *     (default), -1 to search backward (e.g. to go to the previous match).\n * @param {boolean=} opt_skip True if should skip the current selection,\n *     unless no other item has the given prefix.\n * @private\n */\ngoog.ui.AttachableMenu.prototype.selectByName_ = function(\n    prefix, opt_direction, opt_skip) {\n  var elements = this.getElement().getElementsByTagName('*');\n  var elementCount = elements.length;\n  var index;\n\n  if (elementCount == 0) {\n    return;\n  }\n\n  if (!this.selectedElement_ ||\n      (index = goog.array.indexOf(elements, this.selectedElement_)) == -1) {\n    // no selection or selection isn't known => start at the beginning\n    index = 0;\n  }\n\n  var start = index;\n  var re = new RegExp('^' + goog.string.regExpEscape(prefix), 'i');\n  var skip = opt_skip && this.selectedElement_;\n  var dir = opt_direction || 1;\n\n  do {\n    if (elements[index] != skip && this.isMenuItem_(elements[index])) {\n      var name = goog.dom.getTextContent(elements[index]);\n      if (name.match(re)) {\n        break;\n      }\n    }\n    index += dir;\n    if (index == elementCount) {\n      index = 0;\n    } else if (index < 0) {\n      index = elementCount - 1;\n    }\n  } while (index != start);\n\n  if (this.selectedElement_ != elements[index]) {\n    this.setSelectedItem(elements[index]);\n  }\n};\n\n\n/**\n * Dispatch an ITEM_ACTION event when an item is selected\n * @param {Object=} opt_item Item selected.\n * @private\n */\ngoog.ui.AttachableMenu.prototype.onItemSelected_ = function(opt_item) {\n  this.dispatchEvent(\n      new goog.ui.ItemEvent(\n          goog.ui.MenuBase.Events.ITEM_ACTION, this,\n          opt_item || this.selectedElement_));\n};\n\n\n/**\n * Returns whether the specified element is a menu item.\n * @param {Element} elt The element to find a menu item ancestor of.\n * @return {boolean} Whether the specified element is a menu item.\n * @private\n */\ngoog.ui.AttachableMenu.prototype.isMenuItem_ = function(elt) {\n  return !!elt && goog.dom.classlist.contains(elt, this.itemClassName_);\n};\n\n\n/**\n * Returns the menu-item scoping the specified element, or null if there is\n * none.\n * @param {Element|undefined} elt The element to find a menu item ancestor of.\n * @return {Element} The menu-item scoping the specified element, or null if\n *     there is none.\n * @private\n */\ngoog.ui.AttachableMenu.prototype.getAncestorMenuItem_ = function(elt) {\n  if (elt) {\n    var ownerDocumentBody = goog.dom.getOwnerDocument(elt).body;\n    while (elt != null && elt != ownerDocumentBody) {\n      if (this.isMenuItem_(elt)) {\n        return elt;\n      }\n      elt = /** @type {Element} */ (elt.parentNode);\n    }\n  }\n  return null;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.ui.MenuBase","^;;","^:;","^?H","^<=","^9L","^9>","^:S","^?M","^<3","^RY","^;8","^>R","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/attachablemenu.js"],"^:1",["^9K",["~$goog.ui.AttachableMenu"]],"^9<",true,"^9=",["^9>","^?H","^?M","^;9","^:E","^;;","^:;","^;8","^>R","^9L","^<3","^RY","^T;","^<=","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.fs.progressevent.js","^9C",["^9D","goog/fs/progressevent.js"],"^9E","goog/fs/progressevent.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A wrapper for the HTML5 File ProgressEvent objects.\n *\n */\ngoog.provide('goog.fs.ProgressEvent');\n\ngoog.require('goog.events.Event');\n\n\n\n/**\n * A wrapper for the progress events emitted by the File APIs.\n *\n * @param {!ProgressEvent} event The underlying event object.\n * @param {!Object} target The file access object emitting the event.\n * @extends {goog.events.Event}\n * @constructor\n * @final\n */\ngoog.fs.ProgressEvent = function(event, target) {\n  goog.fs.ProgressEvent.base(this, 'constructor', event.type, target);\n\n  /**\n   * The underlying event object.\n   * @type {!ProgressEvent}\n   * @private\n   */\n  this.event_ = event;\n};\ngoog.inherits(goog.fs.ProgressEvent, goog.events.Event);\n\n\n/**\n * @return {boolean} Whether or not the total size of the of the file being\n *     saved is known.\n */\ngoog.fs.ProgressEvent.prototype.isLengthComputable = function() {\n  return this.event_.lengthComputable;\n};\n\n\n/**\n * @return {number} The number of bytes saved so far.\n */\ngoog.fs.ProgressEvent.prototype.getLoaded = function() {\n  return this.event_.loaded;\n};\n\n\n/**\n * @return {number} The total number of bytes in the file being saved.\n */\ngoog.fs.ProgressEvent.prototype.getTotal = function() {\n  return this.event_.total;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^;8"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fs/progressevent.js"],"^:1",["^9K",["~$goog.fs.ProgressEvent"]],"^9<",true,"^9=",["^9>","^;8"]],["^ ","^9A",[1579837703000],"^9B","goog.debug.logger.js","^9C",["^9D","goog/debug/logger.js"],"^9E","goog/debug/logger.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the Logger class. Please minimize dependencies\n * this file has on other closure classes as any dependency it takes won't be\n * able to use the logging infrastructure.\n *\n * @see ../demos/debug.html\n */\n\ngoog.provide('goog.debug.LogManager');\ngoog.provide('goog.debug.Loggable');\ngoog.provide('goog.debug.Logger');\ngoog.provide('goog.debug.Logger.Level');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.debug');\ngoog.require('goog.debug.LogBuffer');\ngoog.require('goog.debug.LogRecord');\n\n\n/**\n * A message value that can be handled by a Logger.\n *\n * Functions are treated like callbacks, but are only called when the event's\n * log level is enabled. This is useful for logging messages that are expensive\n * to construct.\n *\n * @typedef {string|function(): string}\n */\ngoog.debug.Loggable;\n\n\n\n/**\n * The Logger is an object used for logging debug messages. Loggers are\n * normally named, using a hierarchical dot-separated namespace. Logger names\n * can be arbitrary strings, but they should normally be based on the package\n * name or class name of the logged component, such as goog.net.BrowserChannel.\n *\n * The Logger object is loosely based on the java class\n * java.util.logging.Logger. It supports different levels of filtering for\n * different loggers.\n *\n * The logger object should never be instantiated by application code. It\n * should always use the goog.debug.Logger.getLogger function.\n *\n * @constructor\n * @param {string} name The name of the Logger.\n * @final\n */\ngoog.debug.Logger = function(name) {\n  /**\n   * Name of the Logger. Generally a dot-separated namespace\n   * @private {string}\n   */\n  this.name_ = name;\n\n  /**\n   * Parent Logger.\n   * @private {?goog.debug.Logger}\n   */\n  this.parent_ = null;\n\n  /**\n   * Level that this logger only filters above. Null indicates it should\n   * inherit from the parent.\n   * @private {?goog.debug.Logger.Level}\n   */\n  this.level_ = null;\n\n  /**\n   * Map of children loggers. The keys are the leaf names of the children and\n   * the values are the child loggers.\n   * @private {?Object}\n   */\n  this.children_ = null;\n\n  /**\n   * Handlers that are listening to this logger.\n   * @private {?Array<?Function>}\n   */\n  this.handlers_ = null;\n};\n\n\n/** @const */\ngoog.debug.Logger.ROOT_LOGGER_NAME = '';\n\n\n/**\n * @define {boolean} Toggles whether loggers other than the root logger can have\n *     log handlers attached to them and whether they can have their log level\n *     set. Logging is a bit faster when this is set to false.\n */\ngoog.debug.Logger.ENABLE_HIERARCHY =\n    goog.define('goog.debug.Logger.ENABLE_HIERARCHY', true);\n\n\n/**\n * @define {boolean} Toggles whether active log statements are also recorded\n *     to the profiler.\n */\ngoog.debug.Logger.ENABLE_PROFILER_LOGGING =\n    goog.define('goog.debug.Logger.ENABLE_PROFILER_LOGGING', false);\n\n\nif (!goog.debug.Logger.ENABLE_HIERARCHY) {\n  /**\n   * @type {!Array<Function>}\n   * @private\n   */\n  goog.debug.Logger.rootHandlers_ = [];\n\n\n  /**\n   * @type {goog.debug.Logger.Level}\n   * @private\n   */\n  goog.debug.Logger.rootLevel_;\n}\n\n\n\n/**\n * The Level class defines a set of standard logging levels that\n * can be used to control logging output.  The logging Level objects\n * are ordered and are specified by ordered integers.  Enabling logging\n * at a given level also enables logging at all higher levels.\n * <p>\n * Clients should normally use the predefined Level constants such\n * as Level.SEVERE.\n * <p>\n * The levels in descending order are:\n * <ul>\n * <li>SEVERE (highest value)\n * <li>WARNING\n * <li>INFO\n * <li>CONFIG\n * <li>FINE\n * <li>FINER\n * <li>FINEST  (lowest value)\n * </ul>\n * In addition there is a level OFF that can be used to turn\n * off logging, and a level ALL that can be used to enable\n * logging of all messages.\n *\n * @param {string} name The name of the level.\n * @param {number} value The numeric value of the level.\n * @constructor\n * @final\n */\ngoog.debug.Logger.Level = function(name, value) {\n  /**\n   * The name of the level\n   * @type {string}\n   */\n  this.name = name;\n\n  /**\n   * The numeric value of the level\n   * @type {number}\n   */\n  this.value = value;\n};\n\n\n/**\n * @return {string} String representation of the logger level.\n * @override\n */\ngoog.debug.Logger.Level.prototype.toString = function() {\n  return this.name;\n};\n\n\n/**\n * OFF is a special level that can be used to turn off logging.\n * This level is initialized to <CODE>Infinity</CODE>.\n * @type {!goog.debug.Logger.Level}\n */\ngoog.debug.Logger.Level.OFF = new goog.debug.Logger.Level('OFF', Infinity);\n\n\n/**\n * SHOUT is a message level for extra debugging loudness.\n * This level is initialized to <CODE>1200</CODE>.\n * @type {!goog.debug.Logger.Level}\n */\ngoog.debug.Logger.Level.SHOUT = new goog.debug.Logger.Level('SHOUT', 1200);\n\n\n/**\n * SEVERE is a message level indicating a serious failure.\n * This level is initialized to <CODE>1000</CODE>.\n * @type {!goog.debug.Logger.Level}\n */\ngoog.debug.Logger.Level.SEVERE = new goog.debug.Logger.Level('SEVERE', 1000);\n\n\n/**\n * WARNING is a message level indicating a potential problem.\n * This level is initialized to <CODE>900</CODE>.\n * @type {!goog.debug.Logger.Level}\n */\ngoog.debug.Logger.Level.WARNING = new goog.debug.Logger.Level('WARNING', 900);\n\n\n/**\n * INFO is a message level for informational messages.\n * This level is initialized to <CODE>800</CODE>.\n * @type {!goog.debug.Logger.Level}\n */\ngoog.debug.Logger.Level.INFO = new goog.debug.Logger.Level('INFO', 800);\n\n\n/**\n * CONFIG is a message level for static configuration messages.\n * This level is initialized to <CODE>700</CODE>.\n * @type {!goog.debug.Logger.Level}\n */\ngoog.debug.Logger.Level.CONFIG = new goog.debug.Logger.Level('CONFIG', 700);\n\n\n/**\n * FINE is a message level providing tracing information.\n * This level is initialized to <CODE>500</CODE>.\n * @type {!goog.debug.Logger.Level}\n */\ngoog.debug.Logger.Level.FINE = new goog.debug.Logger.Level('FINE', 500);\n\n\n/**\n * FINER indicates a fairly detailed tracing message.\n * This level is initialized to <CODE>400</CODE>.\n * @type {!goog.debug.Logger.Level}\n */\ngoog.debug.Logger.Level.FINER = new goog.debug.Logger.Level('FINER', 400);\n\n/**\n * FINEST indicates a highly detailed tracing message.\n * This level is initialized to <CODE>300</CODE>.\n * @type {!goog.debug.Logger.Level}\n */\n\ngoog.debug.Logger.Level.FINEST = new goog.debug.Logger.Level('FINEST', 300);\n\n\n/**\n * ALL indicates that all messages should be logged.\n * This level is initialized to <CODE>0</CODE>.\n * @type {!goog.debug.Logger.Level}\n */\ngoog.debug.Logger.Level.ALL = new goog.debug.Logger.Level('ALL', 0);\n\n\n/**\n * The predefined levels.\n * @type {!Array<!goog.debug.Logger.Level>}\n * @final\n */\ngoog.debug.Logger.Level.PREDEFINED_LEVELS = [\n  goog.debug.Logger.Level.OFF, goog.debug.Logger.Level.SHOUT,\n  goog.debug.Logger.Level.SEVERE, goog.debug.Logger.Level.WARNING,\n  goog.debug.Logger.Level.INFO, goog.debug.Logger.Level.CONFIG,\n  goog.debug.Logger.Level.FINE, goog.debug.Logger.Level.FINER,\n  goog.debug.Logger.Level.FINEST, goog.debug.Logger.Level.ALL\n];\n\n\n/**\n * A lookup map used to find the level object based on the name or value of\n * the level object.\n * @type {?Object}\n * @private\n */\ngoog.debug.Logger.Level.predefinedLevelsCache_ = null;\n\n\n/**\n * Creates the predefined levels cache and populates it.\n * @private\n */\ngoog.debug.Logger.Level.createPredefinedLevelsCache_ = function() {\n  goog.debug.Logger.Level.predefinedLevelsCache_ = {};\n  for (var i = 0, level; level = goog.debug.Logger.Level.PREDEFINED_LEVELS[i];\n       i++) {\n    goog.debug.Logger.Level.predefinedLevelsCache_[level.value] = level;\n    goog.debug.Logger.Level.predefinedLevelsCache_[level.name] = level;\n  }\n};\n\n\n/**\n * Gets the predefined level with the given name.\n * @param {string} name The name of the level.\n * @return {goog.debug.Logger.Level} The level, or null if none found.\n */\ngoog.debug.Logger.Level.getPredefinedLevel = function(name) {\n  if (!goog.debug.Logger.Level.predefinedLevelsCache_) {\n    goog.debug.Logger.Level.createPredefinedLevelsCache_();\n  }\n\n  return goog.debug.Logger.Level.predefinedLevelsCache_[name] || null;\n};\n\n\n/**\n * Gets the highest predefined level <= #value.\n * @param {number} value Level value.\n * @return {goog.debug.Logger.Level} The level, or null if none found.\n */\ngoog.debug.Logger.Level.getPredefinedLevelByValue = function(value) {\n  if (!goog.debug.Logger.Level.predefinedLevelsCache_) {\n    goog.debug.Logger.Level.createPredefinedLevelsCache_();\n  }\n\n  if (value in /** @type {!Object} */ (\n          goog.debug.Logger.Level.predefinedLevelsCache_)) {\n    return goog.debug.Logger.Level.predefinedLevelsCache_[value];\n  }\n\n  for (var i = 0; i < goog.debug.Logger.Level.PREDEFINED_LEVELS.length; ++i) {\n    var level = goog.debug.Logger.Level.PREDEFINED_LEVELS[i];\n    if (level.value <= value) {\n      return level;\n    }\n  }\n  return null;\n};\n\n\n/**\n * Finds or creates a logger for a named subsystem. If a logger has already been\n * created with the given name it is returned. Otherwise a new logger is\n * created. If a new logger is created its log level will be configured based\n * on the LogManager configuration and it will configured to also send logging\n * output to its parent's handlers. It will be registered in the LogManager\n * global namespace.\n *\n * @param {string} name A name for the logger. This should be a dot-separated\n * name and should normally be based on the package name or class name of the\n * subsystem, such as goog.net.BrowserChannel.\n * @return {!goog.debug.Logger} The named logger.\n * @deprecated use {@link goog.log} instead.\n */\ngoog.debug.Logger.getLogger = function(name) {\n  return goog.debug.LogManager.getLogger(name);\n};\n\n\n/**\n * Logs a message to profiling tools, if available.\n * {@see https://developers.google.com/web-toolkit/speedtracer/logging-api}\n * {@see http://msdn.microsoft.com/en-us/library/dd433074(VS.85).aspx}\n * @param {string} msg The message to log.\n */\ngoog.debug.Logger.logToProfilers = function(msg) {\n  // Some browsers also log timeStamp calls to the console, only log\n  // if actually asked.\n  if (goog.debug.Logger.ENABLE_PROFILER_LOGGING) {\n    var msWriteProfilerMark = goog.global['msWriteProfilerMark'];\n    if (msWriteProfilerMark) {\n      // Logs a message to the Microsoft profiler\n      // On IE, console['timeStamp'] may output to console\n      msWriteProfilerMark(msg);\n      return;\n    }\n\n    // Using goog.global, as loggers might be used in window-less contexts.\n    var console = goog.global['console'];\n    if (console && console['timeStamp']) {\n      // Logs a message to Firebug, Web Inspector, SpeedTracer, etc.\n      console['timeStamp'](msg);\n    }\n  }\n};\n\n\n/**\n * Gets the name of this logger.\n * @return {string} The name of this logger.\n */\ngoog.debug.Logger.prototype.getName = function() {\n  return this.name_;\n};\n\n\n/**\n * Adds a handler to the logger. This doesn't use the event system because\n * we want to be able to add logging to the event system.\n * @param {Function} handler Handler function to add.\n */\ngoog.debug.Logger.prototype.addHandler = function(handler) {\n  if (goog.debug.LOGGING_ENABLED) {\n    if (goog.debug.Logger.ENABLE_HIERARCHY) {\n      if (!this.handlers_) {\n        this.handlers_ = [];\n      }\n      this.handlers_.push(handler);\n    } else {\n      goog.asserts.assert(\n          !this.name_, 'Cannot call addHandler on a non-root logger when ' +\n              'goog.debug.Logger.ENABLE_HIERARCHY is false.');\n      goog.debug.Logger.rootHandlers_.push(handler);\n    }\n  }\n};\n\n\n/**\n * Removes a handler from the logger. This doesn't use the event system because\n * we want to be able to add logging to the event system.\n * @param {Function} handler Handler function to remove.\n * @return {boolean} Whether the handler was removed.\n */\ngoog.debug.Logger.prototype.removeHandler = function(handler) {\n  if (goog.debug.LOGGING_ENABLED) {\n    var handlers = goog.debug.Logger.ENABLE_HIERARCHY ?\n        this.handlers_ :\n        goog.debug.Logger.rootHandlers_;\n    return !!handlers && goog.array.remove(handlers, handler);\n  } else {\n    return false;\n  }\n};\n\n\n/**\n * Returns the parent of this logger.\n * @return {goog.debug.Logger} The parent logger or null if this is the root.\n */\ngoog.debug.Logger.prototype.getParent = function() {\n  return this.parent_;\n};\n\n\n/**\n * Returns the children of this logger as a map of the child name to the logger.\n * @return {!Object} The map where the keys are the child leaf names and the\n *     values are the Logger objects.\n */\ngoog.debug.Logger.prototype.getChildren = function() {\n  if (!this.children_) {\n    this.children_ = {};\n  }\n  return this.children_;\n};\n\n\n/**\n * Set the log level specifying which message levels will be logged by this\n * logger. Message levels lower than this value will be discarded.\n * The level value Level.OFF can be used to turn off logging. If the new level\n * is null, it means that this node should inherit its level from its nearest\n * ancestor with a specific (non-null) level value.\n *\n * @param {goog.debug.Logger.Level} level The new level.\n */\ngoog.debug.Logger.prototype.setLevel = function(level) {\n  if (goog.debug.LOGGING_ENABLED) {\n    if (goog.debug.Logger.ENABLE_HIERARCHY) {\n      this.level_ = level;\n    } else {\n      goog.asserts.assert(\n          !this.name_, 'Cannot call setLevel() on a non-root logger when ' +\n              'goog.debug.Logger.ENABLE_HIERARCHY is false.');\n      goog.debug.Logger.rootLevel_ = level;\n    }\n  }\n};\n\n\n/**\n * Gets the log level specifying which message levels will be logged by this\n * logger. Message levels lower than this value will be discarded.\n * The level value Level.OFF can be used to turn off logging. If the level\n * is null, it means that this node should inherit its level from its nearest\n * ancestor with a specific (non-null) level value.\n *\n * @return {goog.debug.Logger.Level} The level.\n */\ngoog.debug.Logger.prototype.getLevel = function() {\n  return goog.debug.LOGGING_ENABLED ? this.level_ : goog.debug.Logger.Level.OFF;\n};\n\n\n/**\n * Returns the effective level of the logger based on its ancestors' levels.\n * @return {goog.debug.Logger.Level} The level.\n */\ngoog.debug.Logger.prototype.getEffectiveLevel = function() {\n  if (!goog.debug.LOGGING_ENABLED) {\n    return goog.debug.Logger.Level.OFF;\n  }\n\n  if (!goog.debug.Logger.ENABLE_HIERARCHY) {\n    return goog.debug.Logger.rootLevel_;\n  }\n  if (this.level_) {\n    return this.level_;\n  }\n  if (this.parent_) {\n    return this.parent_.getEffectiveLevel();\n  }\n  goog.asserts.fail('Root logger has no level set.');\n  return null;\n};\n\n\n/**\n * Checks if a message of the given level would actually be logged by this\n * logger. This check is based on the Loggers effective level, which may be\n * inherited from its parent.\n * @param {goog.debug.Logger.Level} level The level to check.\n * @return {boolean} Whether the message would be logged.\n */\ngoog.debug.Logger.prototype.isLoggable = function(level) {\n  return goog.debug.LOGGING_ENABLED &&\n      level.value >= this.getEffectiveLevel().value;\n};\n\n\n/**\n * Logs a message. If the logger is currently enabled for the\n * given message level then the given message is forwarded to all the\n * registered output Handler objects.\n * @param {goog.debug.Logger.Level} level One of the level identifiers.\n * @param {goog.debug.Loggable} msg The message to log.\n * @param {Error|Object=} opt_exception An exception associated with the\n *     message.\n */\ngoog.debug.Logger.prototype.log = function(level, msg, opt_exception) {\n  // java caches the effective level, not sure it's necessary here\n  if (goog.debug.LOGGING_ENABLED && this.isLoggable(level)) {\n    // Message callbacks can be useful when a log message is expensive to build.\n    if (goog.isFunction(msg)) {\n      msg = msg();\n    }\n\n    this.doLogRecord_(this.getLogRecord(level, msg, opt_exception));\n  }\n};\n\n\n/**\n * Creates a new log record and adds the exception (if present) to it.\n * @param {goog.debug.Logger.Level} level One of the level identifiers.\n * @param {string} msg The string message.\n * @param {Error|Object=} opt_exception An exception associated with the\n *     message.\n * @return {!goog.debug.LogRecord} A log record.\n * @suppress {es5Strict}\n */\ngoog.debug.Logger.prototype.getLogRecord = function(level, msg, opt_exception) {\n  if (goog.debug.LogBuffer.isBufferingEnabled()) {\n    var logRecord =\n        goog.debug.LogBuffer.getInstance().addRecord(level, msg, this.name_);\n  } else {\n    logRecord = new goog.debug.LogRecord(level, String(msg), this.name_);\n  }\n  if (opt_exception) {\n    logRecord.setException(opt_exception);\n  }\n  return logRecord;\n};\n\n\n/**\n * Logs a message at the Logger.Level.SHOUT level.\n * If the logger is currently enabled for the given message level then the\n * given message is forwarded to all the registered output Handler objects.\n * @param {goog.debug.Loggable} msg The message to log.\n * @param {Error=} opt_exception An exception associated with the message.\n */\ngoog.debug.Logger.prototype.shout = function(msg, opt_exception) {\n  if (goog.debug.LOGGING_ENABLED) {\n    this.log(goog.debug.Logger.Level.SHOUT, msg, opt_exception);\n  }\n};\n\n\n/**\n * Logs a message at the Logger.Level.SEVERE level.\n * If the logger is currently enabled for the given message level then the\n * given message is forwarded to all the registered output Handler objects.\n * @param {goog.debug.Loggable} msg The message to log.\n * @param {Error=} opt_exception An exception associated with the message.\n */\ngoog.debug.Logger.prototype.severe = function(msg, opt_exception) {\n  if (goog.debug.LOGGING_ENABLED) {\n    this.log(goog.debug.Logger.Level.SEVERE, msg, opt_exception);\n  }\n};\n\n\n/**\n * Logs a message at the Logger.Level.WARNING level.\n * If the logger is currently enabled for the given message level then the\n * given message is forwarded to all the registered output Handler objects.\n * @param {goog.debug.Loggable} msg The message to log.\n * @param {Error=} opt_exception An exception associated with the message.\n */\ngoog.debug.Logger.prototype.warning = function(msg, opt_exception) {\n  if (goog.debug.LOGGING_ENABLED) {\n    this.log(goog.debug.Logger.Level.WARNING, msg, opt_exception);\n  }\n};\n\n\n/**\n * Logs a message at the Logger.Level.INFO level.\n * If the logger is currently enabled for the given message level then the\n * given message is forwarded to all the registered output Handler objects.\n * @param {goog.debug.Loggable} msg The message to log.\n * @param {Error=} opt_exception An exception associated with the message.\n */\ngoog.debug.Logger.prototype.info = function(msg, opt_exception) {\n  if (goog.debug.LOGGING_ENABLED) {\n    this.log(goog.debug.Logger.Level.INFO, msg, opt_exception);\n  }\n};\n\n\n/**\n * Logs a message at the Logger.Level.CONFIG level.\n * If the logger is currently enabled for the given message level then the\n * given message is forwarded to all the registered output Handler objects.\n * @param {goog.debug.Loggable} msg The message to log.\n * @param {Error=} opt_exception An exception associated with the message.\n */\ngoog.debug.Logger.prototype.config = function(msg, opt_exception) {\n  if (goog.debug.LOGGING_ENABLED) {\n    this.log(goog.debug.Logger.Level.CONFIG, msg, opt_exception);\n  }\n};\n\n\n/**\n * Logs a message at the Logger.Level.FINE level.\n * If the logger is currently enabled for the given message level then the\n * given message is forwarded to all the registered output Handler objects.\n * @param {goog.debug.Loggable} msg The message to log.\n * @param {Error=} opt_exception An exception associated with the message.\n */\ngoog.debug.Logger.prototype.fine = function(msg, opt_exception) {\n  if (goog.debug.LOGGING_ENABLED) {\n    this.log(goog.debug.Logger.Level.FINE, msg, opt_exception);\n  }\n};\n\n\n/**\n * Logs a message at the Logger.Level.FINER level.\n * If the logger is currently enabled for the given message level then the\n * given message is forwarded to all the registered output Handler objects.\n * @param {goog.debug.Loggable} msg The message to log.\n * @param {Error=} opt_exception An exception associated with the message.\n */\ngoog.debug.Logger.prototype.finer = function(msg, opt_exception) {\n  if (goog.debug.LOGGING_ENABLED) {\n    this.log(goog.debug.Logger.Level.FINER, msg, opt_exception);\n  }\n};\n\n\n/**\n * Logs a message at the Logger.Level.FINEST level.\n * If the logger is currently enabled for the given message level then the\n * given message is forwarded to all the registered output Handler objects.\n * @param {goog.debug.Loggable} msg The message to log.\n * @param {Error=} opt_exception An exception associated with the message.\n */\ngoog.debug.Logger.prototype.finest = function(msg, opt_exception) {\n  if (goog.debug.LOGGING_ENABLED) {\n    this.log(goog.debug.Logger.Level.FINEST, msg, opt_exception);\n  }\n};\n\n\n/**\n * Logs a LogRecord. If the logger is currently enabled for the\n * given message level then the given message is forwarded to all the\n * registered output Handler objects.\n * @param {goog.debug.LogRecord} logRecord A log record to log.\n */\ngoog.debug.Logger.prototype.logRecord = function(logRecord) {\n  if (goog.debug.LOGGING_ENABLED && this.isLoggable(logRecord.getLevel())) {\n    this.doLogRecord_(logRecord);\n  }\n};\n\n\n/**\n * Logs a LogRecord.\n * @param {goog.debug.LogRecord} logRecord A log record to log.\n * @private\n */\ngoog.debug.Logger.prototype.doLogRecord_ = function(logRecord) {\n  if (goog.debug.Logger.ENABLE_PROFILER_LOGGING) {\n    goog.debug.Logger.logToProfilers('log:' + logRecord.getMessage());\n  }\n  if (goog.debug.Logger.ENABLE_HIERARCHY) {\n    var target = this;\n    while (target) {\n      target.callPublish_(logRecord);\n      target = target.getParent();\n    }\n  } else {\n    for (var i = 0, handler; handler = goog.debug.Logger.rootHandlers_[i++];) {\n      handler(logRecord);\n    }\n  }\n};\n\n\n/**\n * Calls the handlers for publish.\n * @param {goog.debug.LogRecord} logRecord The log record to publish.\n * @private\n */\ngoog.debug.Logger.prototype.callPublish_ = function(logRecord) {\n  if (this.handlers_) {\n    for (var i = 0, handler; handler = this.handlers_[i]; i++) {\n      handler(logRecord);\n    }\n  }\n};\n\n\n/**\n * Sets the parent of this logger. This is used for setting up the logger tree.\n * @param {goog.debug.Logger} parent The parent logger.\n * @private\n */\ngoog.debug.Logger.prototype.setParent_ = function(parent) {\n  this.parent_ = parent;\n};\n\n\n/**\n * Adds a child to this logger. This is used for setting up the logger tree.\n * @param {string} name The leaf name of the child.\n * @param {goog.debug.Logger} logger The child logger.\n * @private\n */\ngoog.debug.Logger.prototype.addChild_ = function(name, logger) {\n  this.getChildren()[name] = logger;\n};\n\n\n/**\n * There is a single global LogManager object that is used to maintain a set of\n * shared state about Loggers and log services. This is loosely based on the\n * java class java.util.logging.LogManager.\n * @const\n */\ngoog.debug.LogManager = {};\n\n\n/**\n * Map of logger names to logger objects.\n *\n * @type {!Object<string, !goog.debug.Logger>}\n * @private\n */\ngoog.debug.LogManager.loggers_ = {};\n\n\n/**\n * The root logger which is the root of the logger tree.\n * @type {?goog.debug.Logger}\n * @private\n */\ngoog.debug.LogManager.rootLogger_ = null;\n\n\n/**\n * Initializes the LogManager if not already initialized.\n */\ngoog.debug.LogManager.initialize = function() {\n  if (!goog.debug.LogManager.rootLogger_) {\n    goog.debug.LogManager.rootLogger_ =\n        new goog.debug.Logger(goog.debug.Logger.ROOT_LOGGER_NAME);\n    goog.debug.LogManager.loggers_[goog.debug.Logger.ROOT_LOGGER_NAME] =\n        goog.debug.LogManager.rootLogger_;\n    goog.debug.LogManager.rootLogger_.setLevel(goog.debug.Logger.Level.CONFIG);\n  }\n};\n\n\n/**\n * Returns all the loggers.\n * @return {!Object<string, !goog.debug.Logger>} Map of logger names to logger\n *     objects.\n */\ngoog.debug.LogManager.getLoggers = function() {\n  return goog.debug.LogManager.loggers_;\n};\n\n\n/**\n * Returns the root of the logger tree namespace, the logger with the empty\n * string as its name.\n *\n * @return {!goog.debug.Logger} The root logger.\n */\ngoog.debug.LogManager.getRoot = function() {\n  goog.debug.LogManager.initialize();\n  return /** @type {!goog.debug.Logger} */ (goog.debug.LogManager.rootLogger_);\n};\n\n\n/**\n * Finds a named logger.\n *\n * @param {string} name A name for the logger. This should be a dot-separated\n * name and should normally be based on the package name or class name of the\n * subsystem, such as goog.net.BrowserChannel.\n * @return {!goog.debug.Logger} The named logger.\n */\ngoog.debug.LogManager.getLogger = function(name) {\n  goog.debug.LogManager.initialize();\n  var ret = goog.debug.LogManager.loggers_[name];\n  return ret || goog.debug.LogManager.createLogger_(name);\n};\n\n\n/**\n * Creates a function that can be passed to goog.debug.catchErrors. The function\n * will log all reported errors using the given logger.\n * @param {goog.debug.Logger=} opt_logger The logger to log the errors to.\n *     Defaults to the root logger.\n * @return {function(Object)} The created function.\n */\ngoog.debug.LogManager.createFunctionForCatchErrors = function(opt_logger) {\n  return function(info) {\n    var logger = opt_logger || goog.debug.LogManager.getRoot();\n    logger.severe(\n        'Error: ' + info.message + ' (' + info.fileName + ' @ Line: ' +\n        info.line + ')');\n  };\n};\n\n\n/**\n * Creates the named logger. Will also create the parents of the named logger\n * if they don't yet exist.\n * @param {string} name The name of the logger.\n * @return {!goog.debug.Logger} The named logger.\n * @private\n */\ngoog.debug.LogManager.createLogger_ = function(name) {\n  // find parent logger\n  var logger = new goog.debug.Logger(name);\n  if (goog.debug.Logger.ENABLE_HIERARCHY) {\n    var lastDotIndex = name.lastIndexOf('.');\n    var parentName = name.substr(0, lastDotIndex);\n    var leafName = name.substr(lastDotIndex + 1);\n    var parentLogger = goog.debug.LogManager.getLogger(parentName);\n\n    // tell the parent about the child and the child about the parent\n    parentLogger.addChild_(leafName, logger);\n    logger.setParent_(parentLogger);\n  }\n\n  goog.debug.LogManager.loggers_[name] = logger;\n  return logger;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.debug.LogBuffer","^9>","^;T","^IM","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/logger.js"],"^:1",["^9K",["^IK","^IL","~$goog.debug.Loggable","~$goog.debug.Logger.Level"]],"^9<",true,"^9=",["^9>","^;9","^:E","^;T","^T>","^IM"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.nodetype.js","^9C",["^9D","goog/dom/nodetype.js"],"^9E","goog/dom/nodetype.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of goog.dom.NodeType.\n */\n\ngoog.provide('goog.dom.NodeType');\n\n\n/**\n * Constants for the nodeType attribute in the Node interface.\n *\n * These constants match those specified in the Node interface. These are\n * usually present on the Node object in recent browsers, but not in older\n * browsers (specifically, early IEs) and thus are given here.\n *\n * In some browsers (early IEs), these are not defined on the Node object,\n * so they are provided here.\n *\n * See http://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-1950641247\n * @enum {number}\n */\ngoog.dom.NodeType = {\n  ELEMENT: 1,\n  ATTRIBUTE: 2,\n  TEXT: 3,\n  CDATA_SECTION: 4,\n  ENTITY_REFERENCE: 5,\n  ENTITY: 6,\n  PROCESSING_INSTRUCTION: 7,\n  COMMENT: 8,\n  DOCUMENT: 9,\n  DOCUMENT_TYPE: 10,\n  DOCUMENT_FRAGMENT: 11,\n  NOTATION: 12\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/nodetype.js"],"^:1",["^9K",["^=B"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.storage.mechanism.mechanismtester.js","^9C",["^9D","goog/storage/mechanism/mechanismtester.js"],"^9E","goog/storage/mechanism/mechanismtester.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Unit tests for the abstract storage mechanism interface.\n *\n * These tests should be included in tests of any class extending\n * goog.storage.mechanism.Mechanism.\n *\n */\n\ngoog.provide('goog.storage.mechanism.mechanismTester');\ngoog.setTestOnly();\n\ngoog.require('goog.storage.mechanism.ErrorCode');\ngoog.require('goog.testing.asserts');\ngoog.require('goog.userAgent');\ngoog.require('goog.userAgent.product');\ngoog.require('goog.userAgent.product.isVersion');\n\n\n\nvar mechanism = null;\nvar minimumQuota = 0;\n\n\nfunction testSetGet() {\n  if (!mechanism) {\n    return;\n  }\n  mechanism.set('first', 'one');\n  assertEquals('one', mechanism.get('first'));\n}\n\n\nfunction testChange() {\n  if (!mechanism) {\n    return;\n  }\n  mechanism.set('first', 'one');\n  mechanism.set('first', 'two');\n  assertEquals('two', mechanism.get('first'));\n}\n\n\nfunction testRemove() {\n  if (!mechanism) {\n    return;\n  }\n  mechanism.set('first', 'one');\n  mechanism.remove('first');\n  assertNull(mechanism.get('first'));\n}\n\n\nfunction testSetRemoveSet() {\n  if (!mechanism) {\n    return;\n  }\n  mechanism.set('first', 'one');\n  mechanism.remove('first');\n  mechanism.set('first', 'one');\n  assertEquals('one', mechanism.get('first'));\n}\n\n\nfunction testRemoveRemove() {\n  if (!mechanism) {\n    return;\n  }\n  mechanism.remove('first');\n  mechanism.remove('first');\n  assertNull(mechanism.get('first'));\n}\n\n\nfunction testSetTwo() {\n  if (!mechanism) {\n    return;\n  }\n  mechanism.set('first', 'one');\n  mechanism.set('second', 'two');\n  assertEquals('one', mechanism.get('first'));\n  assertEquals('two', mechanism.get('second'));\n}\n\n\nfunction testChangeTwo() {\n  if (!mechanism) {\n    return;\n  }\n  mechanism.set('first', 'one');\n  mechanism.set('second', 'two');\n  mechanism.set('second', 'three');\n  mechanism.set('first', 'four');\n  assertEquals('four', mechanism.get('first'));\n  assertEquals('three', mechanism.get('second'));\n}\n\n\nfunction testSetRemoveThree() {\n  if (!mechanism) {\n    return;\n  }\n  mechanism.set('first', 'one');\n  mechanism.set('second', 'two');\n  mechanism.set('third', 'three');\n  mechanism.remove('second');\n  assertNull(mechanism.get('second'));\n  assertEquals('one', mechanism.get('first'));\n  assertEquals('three', mechanism.get('third'));\n  mechanism.remove('first');\n  assertNull(mechanism.get('first'));\n  assertEquals('three', mechanism.get('third'));\n  mechanism.remove('third');\n  assertNull(mechanism.get('third'));\n}\n\n\nfunction testEmptyValue() {\n  if (!mechanism) {\n    return;\n  }\n  mechanism.set('third', '');\n  assertEquals('', mechanism.get('third'));\n}\n\n\nfunction testWeirdKeys() {\n  if (!mechanism) {\n    return;\n  }\n  // Some weird keys. We leave out some tests for some browsers where they\n  // trigger browser bugs, and where the keys are too obscure to prepare a\n  // workaround.\n  mechanism.set(' ', 'space');\n  mechanism.set('=+!@#$%^&*()-_\\\\|;:\\'\",./<>?[]{}~`', 'control');\n  mechanism.set(\n      '\\u4e00\\u4e8c\\u4e09\\u56db\\u4e94\\u516d\\u4e03\\u516b\\u4e5d\\u5341', 'ten');\n  mechanism.set('\\0', 'null');\n  mechanism.set('\\0\\0', 'double null');\n  mechanism.set('\\0A', 'null A');\n  mechanism.set('', 'zero');\n  assertEquals('space', mechanism.get(' '));\n  assertEquals('control', mechanism.get('=+!@#$%^&*()-_\\\\|;:\\'\",./<>?[]{}~`'));\n  assertEquals(\n      'ten',\n      mechanism.get(\n          '\\u4e00\\u4e8c\\u4e09\\u56db\\u4e94\\u516d\\u4e03\\u516b\\u4e5d\\u5341'));\n  if (!goog.userAgent.IE) {\n    // IE does not properly handle nulls in HTML5 localStorage keys (IE8, IE9).\n    // https://connect.microsoft.com/IE/feedback/details/667799/\n    assertEquals('null', mechanism.get('\\0'));\n    assertEquals('double null', mechanism.get('\\0\\0'));\n    assertEquals('null A', mechanism.get('\\0A'));\n  }\n  if (!goog.userAgent.GECKO) {\n    // Firefox does not properly handle the empty key (FF 3.5, 3.6, 4.0).\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=510849\n    assertEquals('zero', mechanism.get(''));\n  }\n}\n\n\nfunction testQuota() {\n  if (!mechanism) {\n    return;\n  }\n  // This test might crash Safari 4, so it is disabled for this version.\n  // It works fine on Safari 3 and Safari 5.\n  if (goog.userAgent.product.SAFARI && goog.userAgent.product.isVersion(4) &&\n      !goog.userAgent.product.isVersion(5)) {\n    return;\n  }\n  var buffer = '\\u03ff';  // 2 bytes\n  var savedBytes = 0;\n  try {\n    while (buffer.length < minimumQuota) {\n      buffer = buffer + buffer;\n      mechanism.set('foo', buffer);\n      savedBytes = buffer.length;\n    }\n  } catch (ex) {\n    if (ex != goog.storage.mechanism.ErrorCode.QUOTA_EXCEEDED) {\n      throw ex;\n    }\n  }\n  mechanism.remove('foo');\n  assertTrue(savedBytes >= minimumQuota);\n}\n","^9I",1579837703000,"^9J",["^9K",["^MB","^>X","^9>","^:S","~$goog.userAgent.product.isVersion","^K1"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/mechanism/mechanismtester.js"],"^:1",["^9K",["~$goog.storage.mechanism.mechanismTester"]],"^9<",true,"^9=",["^9>","^K1","^>X","^:S","^MB","^TA"]],["^ ","^9A",[1579837703000],"^9B","goog.events.browserevent.js","^9C",["^9D","goog/events/browserevent.js"],"^9E","goog/events/browserevent.js","^9F","^9G","^9H","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A patched, standardized event object for browser events.\n *\n * <pre>\n * The patched event object contains the following members:\n * - type           {string}    Event type, e.g. 'click'\n * - target         {Object}    The element that actually triggered the event\n * - currentTarget  {Object}    The element the listener is attached to\n * - relatedTarget  {Object}    For mouseover and mouseout, the previous object\n * - offsetX        {number}    X-coordinate relative to target\n * - offsetY        {number}    Y-coordinate relative to target\n * - clientX        {number}    X-coordinate relative to viewport\n * - clientY        {number}    Y-coordinate relative to viewport\n * - screenX        {number}    X-coordinate relative to the edge of the screen\n * - screenY        {number}    Y-coordinate relative to the edge of the screen\n * - button         {number}    Mouse button. Use isButton() to test.\n * - keyCode        {number}    Key-code\n * - ctrlKey        {boolean}   Was ctrl key depressed\n * - altKey         {boolean}   Was alt key depressed\n * - shiftKey       {boolean}   Was shift key depressed\n * - metaKey        {boolean}   Was meta key depressed\n * - pointerId      {number}    Pointer ID\n * - pointerType    {string}    Pointer type, e.g. 'mouse', 'pen', or 'touch'\n * - defaultPrevented {boolean} Whether the default action has been prevented\n * - state          {Object}    History state object\n *\n * NOTE: The keyCode member contains the raw browser keyCode. For normalized\n * key and character code use {@link goog.events.KeyHandler}.\n * </pre>\n *\n * @author arv@google.com (Erik Arvidsson)\n */\n\ngoog.provide('goog.events.BrowserEvent');\ngoog.provide('goog.events.BrowserEvent.MouseButton');\ngoog.provide('goog.events.BrowserEvent.PointerType');\n\ngoog.require('goog.debug');\ngoog.require('goog.events.BrowserFeature');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventType');\ngoog.require('goog.reflect');\ngoog.require('goog.userAgent');\n\n/**\n * @define {boolean} If true, use the layerX and layerY properties of a native\n * browser event over the offsetX and offsetY properties, which cause expensive\n * reflow. If layerX or layerY is not defined, offsetX and offsetY will be used\n * as usual.\n */\ngoog.events.USE_LAYER_XY_AS_OFFSET_XY =\n    goog.define('goog.events.USE_LAYER_XY_AS_OFFSET_XY', false);\n\n/**\n * Accepts a browser event object and creates a patched, cross browser event\n * object.\n * The content of this object will not be initialized if no event object is\n * provided. If this is the case, init() needs to be invoked separately.\n * @param {Event=} opt_e Browser event object.\n * @param {EventTarget=} opt_currentTarget Current target for event.\n * @constructor\n * @extends {goog.events.Event}\n */\ngoog.events.BrowserEvent = function(opt_e, opt_currentTarget) {\n  goog.events.BrowserEvent.base(this, 'constructor', opt_e ? opt_e.type : '');\n\n  /**\n   * Target that fired the event.\n   * @override\n   * @type {?Node}\n   */\n  this.target = null;\n\n  /**\n   * Node that had the listener attached.\n   * @override\n   * @type {?Node|undefined}\n   */\n  this.currentTarget = null;\n\n  /**\n   * For mouseover and mouseout events, the related object for the event.\n   * @type {?Node}\n   */\n  this.relatedTarget = null;\n\n  /**\n   * X-coordinate relative to target.\n   * @type {number}\n   */\n  this.offsetX = 0;\n\n  /**\n   * Y-coordinate relative to target.\n   * @type {number}\n   */\n  this.offsetY = 0;\n\n  /**\n   * X-coordinate relative to the window.\n   * @type {number}\n   */\n  this.clientX = 0;\n\n  /**\n   * Y-coordinate relative to the window.\n   * @type {number}\n   */\n  this.clientY = 0;\n\n  /**\n   * X-coordinate relative to the monitor.\n   * @type {number}\n   */\n  this.screenX = 0;\n\n  /**\n   * Y-coordinate relative to the monitor.\n   * @type {number}\n   */\n  this.screenY = 0;\n\n  /**\n   * Which mouse button was pressed.\n   * @type {number}\n   */\n  this.button = 0;\n\n  /**\n   * Key of key press.\n   * @type {string}\n   */\n  this.key = '';\n\n  /**\n   * Keycode of key press.\n   * @type {number}\n   */\n  this.keyCode = 0;\n\n  /**\n   * Keycode of key press.\n   * @type {number}\n   */\n  this.charCode = 0;\n\n  /**\n   * Whether control was pressed at time of event.\n   * @type {boolean}\n   */\n  this.ctrlKey = false;\n\n  /**\n   * Whether alt was pressed at time of event.\n   * @type {boolean}\n   */\n  this.altKey = false;\n\n  /**\n   * Whether shift was pressed at time of event.\n   * @type {boolean}\n   */\n  this.shiftKey = false;\n\n  /**\n   * Whether the meta key was pressed at time of event.\n   * @type {boolean}\n   */\n  this.metaKey = false;\n\n  /**\n   * History state object, only set for PopState events where it's a copy of the\n   * state object provided to pushState or replaceState.\n   * @type {?Object}\n   */\n  this.state = null;\n\n  /**\n   * Whether the default platform modifier key was pressed at time of event.\n   * (This is control for all platforms except Mac, where it's Meta.)\n   * @type {boolean}\n   */\n  this.platformModifierKey = false;\n\n  /**\n   * @type {number}\n   */\n  this.pointerId = 0;\n\n  /**\n   * @type {string}\n   */\n  this.pointerType = '';\n\n  /**\n   * The browser event object.\n   * @private {?Event}\n   */\n  this.event_ = null;\n\n  if (opt_e) {\n    this.init(opt_e, opt_currentTarget);\n  }\n};\ngoog.inherits(goog.events.BrowserEvent, goog.events.Event);\n\n\n/**\n * Normalized button constants for the mouse.\n * @enum {number}\n */\ngoog.events.BrowserEvent.MouseButton = {\n  LEFT: 0,\n  MIDDLE: 1,\n  RIGHT: 2\n};\n\n\n/**\n * Normalized pointer type constants for pointer events.\n * @enum {string}\n */\ngoog.events.BrowserEvent.PointerType = {\n  MOUSE: 'mouse',\n  PEN: 'pen',\n  TOUCH: 'touch'\n};\n\n\n/**\n * Static data for mapping mouse buttons.\n * @type {!Array<number>}\n * @deprecated Use `goog.events.BrowserEvent.IE_BUTTON_MAP` instead.\n */\ngoog.events.BrowserEvent.IEButtonMap = goog.debug.freeze([\n  1,  // LEFT\n  4,  // MIDDLE\n  2   // RIGHT\n]);\n\n\n/**\n * Static data for mapping mouse buttons.\n * @const {!Array<number>}\n */\ngoog.events.BrowserEvent.IE_BUTTON_MAP = goog.events.BrowserEvent.IEButtonMap;\n\n\n/**\n * Static data for mapping MSPointerEvent types to PointerEvent types.\n * @const {!Object<number, goog.events.BrowserEvent.PointerType>}\n */\ngoog.events.BrowserEvent.IE_POINTER_TYPE_MAP = goog.debug.freeze({\n  2: goog.events.BrowserEvent.PointerType.TOUCH,\n  3: goog.events.BrowserEvent.PointerType.PEN,\n  4: goog.events.BrowserEvent.PointerType.MOUSE\n});\n\n\n/**\n * Accepts a browser event object and creates a patched, cross browser event\n * object.\n * @param {Event} e Browser event object.\n * @param {EventTarget=} opt_currentTarget Current target for event.\n */\ngoog.events.BrowserEvent.prototype.init = function(e, opt_currentTarget) {\n  var type = this.type = e.type;\n\n  /**\n   * On touch devices use the first \"changed touch\" as the relevant touch.\n   * @type {?Touch}\n   */\n  var relevantTouch =\n      e.changedTouches && e.changedTouches.length ? e.changedTouches[0] : null;\n\n  // TODO(nicksantos): Change this.target to type EventTarget.\n  this.target = /** @type {Node} */ (e.target) || e.srcElement;\n\n  // TODO(nicksantos): Change this.currentTarget to type EventTarget.\n  this.currentTarget = /** @type {Node} */ (opt_currentTarget);\n\n  var relatedTarget = /** @type {Node} */ (e.relatedTarget);\n  if (relatedTarget) {\n    // There's a bug in FireFox where sometimes, relatedTarget will be a\n    // chrome element, and accessing any property of it will get a permission\n    // denied exception. See:\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=497780\n    if (goog.userAgent.GECKO) {\n      if (!goog.reflect.canAccessProperty(relatedTarget, 'nodeName')) {\n        relatedTarget = null;\n      }\n    }\n  } else if (type == goog.events.EventType.MOUSEOVER) {\n    relatedTarget = e.fromElement;\n  } else if (type == goog.events.EventType.MOUSEOUT) {\n    relatedTarget = e.toElement;\n  }\n\n  this.relatedTarget = relatedTarget;\n\n  if (relevantTouch) {\n    this.clientX = relevantTouch.clientX !== undefined ? relevantTouch.clientX :\n                                                         relevantTouch.pageX;\n    this.clientY = relevantTouch.clientY !== undefined ? relevantTouch.clientY :\n                                                         relevantTouch.pageY;\n    this.screenX = relevantTouch.screenX || 0;\n    this.screenY = relevantTouch.screenY || 0;\n  } else {\n    if (goog.events.USE_LAYER_XY_AS_OFFSET_XY) {\n      this.offsetX = (e.layerX !== undefined) ? e.layerX : e.offsetX;\n      this.offsetY = (e.layerY !== undefined) ? e.layerY : e.offsetY;\n    } else {\n      // Webkit emits a lame warning whenever layerX/layerY is accessed.\n      // http://code.google.com/p/chromium/issues/detail?id=101733\n      this.offsetX = (goog.userAgent.WEBKIT || e.offsetX !== undefined) ?\n          e.offsetX :\n          e.layerX;\n      this.offsetY = (goog.userAgent.WEBKIT || e.offsetY !== undefined) ?\n          e.offsetY :\n          e.layerY;\n    }\n    this.clientX = e.clientX !== undefined ? e.clientX : e.pageX;\n    this.clientY = e.clientY !== undefined ? e.clientY : e.pageY;\n    this.screenX = e.screenX || 0;\n    this.screenY = e.screenY || 0;\n  }\n\n  this.button = e.button;\n\n  this.keyCode = e.keyCode || 0;\n  this.key = e.key || '';\n  this.charCode = e.charCode || (type == 'keypress' ? e.keyCode : 0);\n  this.ctrlKey = e.ctrlKey;\n  this.altKey = e.altKey;\n  this.shiftKey = e.shiftKey;\n  this.metaKey = e.metaKey;\n  this.platformModifierKey = goog.userAgent.MAC ? e.metaKey : e.ctrlKey;\n  this.pointerId = e.pointerId || 0;\n  this.pointerType = goog.events.BrowserEvent.getPointerType_(e);\n  this.state = e.state;\n  this.event_ = e;\n  if (e.defaultPrevented) {\n    this.preventDefault();\n  }\n};\n\n\n/**\n * Tests to see which button was pressed during the event. This is really only\n * useful in IE and Gecko browsers. And in IE, it's only useful for\n * mousedown/mouseup events, because click only fires for the left mouse button.\n *\n * Safari 2 only reports the left button being clicked, and uses the value '1'\n * instead of 0. Opera only reports a mousedown event for the middle button, and\n * no mouse events for the right button. Opera has default behavior for left and\n * middle click that can only be overridden via a configuration setting.\n *\n * There's a nice table of this mess at http://www.unixpapa.com/js/mouse.html.\n *\n * @param {goog.events.BrowserEvent.MouseButton} button The button\n *     to test for.\n * @return {boolean} True if button was pressed.\n */\ngoog.events.BrowserEvent.prototype.isButton = function(button) {\n  if (!goog.events.BrowserFeature.HAS_W3C_BUTTON) {\n    if (this.type == 'click') {\n      return button == goog.events.BrowserEvent.MouseButton.LEFT;\n    } else {\n      return !!(\n          this.event_.button & goog.events.BrowserEvent.IE_BUTTON_MAP[button]);\n    }\n  } else {\n    return this.event_.button == button;\n  }\n};\n\n\n/**\n * Whether this has an \"action\"-producing mouse button.\n *\n * By definition, this includes left-click on windows/linux, and left-click\n * without the ctrl key on Macs.\n *\n * @return {boolean} The result.\n */\ngoog.events.BrowserEvent.prototype.isMouseActionButton = function() {\n  // Webkit does not ctrl+click to be a right-click, so we\n  // normalize it to behave like Gecko and Opera.\n  return this.isButton(goog.events.BrowserEvent.MouseButton.LEFT) &&\n      !(goog.userAgent.WEBKIT && goog.userAgent.MAC && this.ctrlKey);\n};\n\n\n/**\n * @override\n */\ngoog.events.BrowserEvent.prototype.stopPropagation = function() {\n  goog.events.BrowserEvent.superClass_.stopPropagation.call(this);\n  if (this.event_.stopPropagation) {\n    this.event_.stopPropagation();\n  } else {\n    this.event_.cancelBubble = true;\n  }\n};\n\n\n/**\n * @override\n */\ngoog.events.BrowserEvent.prototype.preventDefault = function() {\n  goog.events.BrowserEvent.superClass_.preventDefault.call(this);\n  var be = this.event_;\n  if (!be.preventDefault) {\n    be.returnValue = false;\n    if (goog.events.BrowserFeature.SET_KEY_CODE_TO_PREVENT_DEFAULT) {\n\n      try {\n        // Most keys can be prevented using returnValue. Some special keys\n        // require setting the keyCode to -1 as well:\n        //\n        // In IE7:\n        // F3, F5, F10, F11, Ctrl+P, Crtl+O, Ctrl+F (these are taken from IE6)\n        //\n        // In IE8:\n        // Ctrl+P, Crtl+O, Ctrl+F (F1-F12 cannot be stopped through the event)\n        //\n        // We therefore do this for all function keys as well as when Ctrl key\n        // is pressed.\n        var VK_F1 = 112;\n        var VK_F12 = 123;\n        if (be.ctrlKey || be.keyCode >= VK_F1 && be.keyCode <= VK_F12) {\n          be.keyCode = -1;\n        }\n      } catch (ex) {\n        // IE throws an 'access denied' exception when trying to change\n        // keyCode in some situations (e.g. srcElement is input[type=file],\n        // or srcElement is an anchor tag rewritten by parent's innerHTML).\n        // Do nothing in this case.\n      }\n    }\n  } else {\n    be.preventDefault();\n  }\n};\n\n\n/**\n * @return {Event} The underlying browser event object.\n */\ngoog.events.BrowserEvent.prototype.getBrowserEvent = function() {\n  return this.event_;\n};\n\n\n/**\n * Extracts the pointer type from the given event.\n * @param {!Event} e\n * @return {string} The pointer type, e.g. 'mouse', 'pen', or 'touch'.\n * @private\n */\ngoog.events.BrowserEvent.getPointerType_ = function(e) {\n  if (typeof (e.pointerType) === 'string') {\n    return e.pointerType;\n  }\n  // IE10 uses integer codes for pointer type.\n  // https://msdn.microsoft.com/en-us/library/hh772359(v=vs.85).aspx\n  return goog.events.BrowserEvent.IE_POINTER_TYPE_MAP[e.pointerType] || '';\n};\n","^9I",1579837703000,"^9J",["^9K",["^;E","^9>","^:S","^:I","^;T","~$goog.events.BrowserFeature","^;8"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/browserevent.js"],"^:1",["^9K",["~$goog.events.BrowserEvent.MouseButton","^LC","^<4"]],"^9<",true,"^9=",["^9>","^;T","^TC","^;8","^:I","^;E","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.events.focushandler.js","^9C",["^9D","goog/events/focushandler.js"],"^9E","goog/events/focushandler.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This event handler allows you to catch focusin and focusout\n * events on  descendants. Unlike the \"focus\" and \"blur\" events which do not\n * propagate consistently, and therefore must be added to the element that is\n * focused, this allows you to attach one listener to an ancester and you will\n * be notified when the focus state changes of ony of its descendants.\n * @author arv@google.com (Erik Arvidsson)\n * @see ../demos/focushandler.html\n */\n\ngoog.provide('goog.events.FocusHandler');\ngoog.provide('goog.events.FocusHandler.EventType');\n\ngoog.require('goog.events');\ngoog.require('goog.events.BrowserEvent');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * This event handler allows you to catch focus events when descendants gain or\n * loses focus.\n * @param {Element|Document} element  The node to listen on.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.events.FocusHandler = function(element) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * This is the element that we will listen to the real focus events on.\n   * @type {Element|Document}\n   * @private\n   */\n  this.element_ = element;\n\n  // In IE we use focusin/focusout and in other browsers we use a capturing\n  // listner for focus/blur\n  var typeIn = goog.userAgent.IE ? 'focusin' : 'focus';\n  var typeOut = goog.userAgent.IE ? 'focusout' : 'blur';\n\n  /**\n   * Store the listen key so it easier to unlisten in dispose.\n   * @private\n   * @type {goog.events.Key}\n   */\n  this.listenKeyIn_ =\n      goog.events.listen(this.element_, typeIn, this, !goog.userAgent.IE);\n\n  /**\n   * Store the listen key so it easier to unlisten in dispose.\n   * @private\n   * @type {goog.events.Key}\n   */\n  this.listenKeyOut_ =\n      goog.events.listen(this.element_, typeOut, this, !goog.userAgent.IE);\n};\ngoog.inherits(goog.events.FocusHandler, goog.events.EventTarget);\n\n\n/**\n * Enum type for the events fired by the focus handler\n * @enum {string}\n */\ngoog.events.FocusHandler.EventType = {\n  FOCUSIN: 'focusin',\n  FOCUSOUT: 'focusout'\n};\n\n\n/**\n * This handles the underlying events and dispatches a new event.\n * @param {goog.events.BrowserEvent} e  The underlying browser event.\n */\ngoog.events.FocusHandler.prototype.handleEvent = function(e) {\n  var be = e.getBrowserEvent();\n  var event = new goog.events.BrowserEvent(be);\n  event.type = e.type == 'focusin' || e.type == 'focus' ?\n      goog.events.FocusHandler.EventType.FOCUSIN :\n      goog.events.FocusHandler.EventType.FOCUSOUT;\n  this.dispatchEvent(event);\n};\n\n\n/** @override */\ngoog.events.FocusHandler.prototype.disposeInternal = function() {\n  goog.events.FocusHandler.superClass_.disposeInternal.call(this);\n  goog.events.unlistenByKey(this.listenKeyIn_);\n  goog.events.unlistenByKey(this.listenKeyOut_);\n  delete this.element_;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:L","^:S","^<4","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/focushandler.js"],"^:1",["^9K",["~$goog.events.FocusHandler.EventType","^AA"]],"^9<",true,"^9=",["^9>","^:N","^<4","^:L","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.net.fetchxmlhttpfactory.js","^9C",["^9D","goog/net/fetchxmlhttpfactory.js"],"^9E","goog/net/fetchxmlhttpfactory.js","^9F","^9G","^9H","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.net.FetchXmlHttp');\ngoog.provide('goog.net.FetchXmlHttpFactory');\n\ngoog.require('goog.asserts');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.functions');\ngoog.require('goog.log');\ngoog.require('goog.net.XhrLike');\ngoog.require('goog.net.XmlHttpFactory');\n\n\n\n/**\n * Factory for creating Xhr objects that uses the native fetch() method.\n * https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API\n * Note that this factory is intended for use in Service Worker only.\n * @param {!WorkerGlobalScope} worker The Service Worker global scope.\n * @extends {goog.net.XmlHttpFactory}\n * @struct\n * @constructor\n */\ngoog.net.FetchXmlHttpFactory = function(worker) {\n  goog.net.FetchXmlHttpFactory.base(this, 'constructor');\n\n  /** @private @final {!WorkerGlobalScope} */\n  this.worker_ = worker;\n\n  /** @private {!RequestCredentials|undefined} */\n  this.credentialsMode_ = undefined;\n\n  /** @private {!RequestCache|undefined} */\n  this.cacheMode_ = undefined;\n};\ngoog.inherits(goog.net.FetchXmlHttpFactory, goog.net.XmlHttpFactory);\n\n\n/** @override */\ngoog.net.FetchXmlHttpFactory.prototype.createInstance = function() {\n  var instance = new goog.net.FetchXmlHttp(this.worker_);\n  if (this.credentialsMode_) {\n    instance.setCredentialsMode(this.credentialsMode_);\n  }\n  if (this.cacheMode_) {\n    instance.setCacheMode(this.cacheMode_);\n  }\n  return instance;\n};\n\n\n/** @override */\ngoog.net.FetchXmlHttpFactory.prototype.internalGetOptions =\n    goog.functions.constant({});\n\n\n/**\n * @param {!RequestCredentials} credentialsMode The credentials mode of the\n *     Service Worker fetch.\n */\ngoog.net.FetchXmlHttpFactory.prototype.setCredentialsMode = function(\n    credentialsMode) {\n  this.credentialsMode_ = credentialsMode;\n};\n\n\n/**\n * @param {!RequestCache} cacheMode The cache mode of the Service Worker fetch.\n */\ngoog.net.FetchXmlHttpFactory.prototype.setCacheMode = function(cacheMode) {\n  this.cacheMode_ = cacheMode;\n};\n\n\n\n/**\n * FetchXmlHttp object constructor.\n * @param {!WorkerGlobalScope} worker\n * @extends {goog.events.EventTarget}\n * @implements {goog.net.XhrLike}\n * @constructor\n * @struct\n */\ngoog.net.FetchXmlHttp = function(worker) {\n  goog.net.FetchXmlHttp.base(this, 'constructor');\n\n  /** @private @final {!WorkerGlobalScope} */\n  this.worker_ = worker;\n\n  /** @private {RequestCredentials|undefined} */\n  this.credentialsMode_ = undefined;\n\n  /** @private {RequestCache|undefined} */\n  this.cacheMode_ = undefined;\n\n  /**\n   * Request state.\n   * @type {goog.net.FetchXmlHttp.RequestState}\n   */\n  this.readyState = goog.net.FetchXmlHttp.RequestState.UNSENT;\n\n  /**\n   * HTTP status.\n   * @type {number}\n   */\n  this.status = 0;\n\n  /**\n   * HTTP status string.\n   * @type {string}\n   */\n  this.statusText = '';\n\n  /**\n   * Content of the response.\n   * @type {string|!ArrayBuffer}\n   */\n  this.response = '';\n\n  /**\n   * Content of the response.\n   * @type {string}\n   */\n  this.responseText = '';\n\n  /**\n   * The type of the response.  If this is set to 'arraybuffer' the request will\n   * be discrete, streaming is only supported for text encoded requests.\n   * @type {string}\n   */\n  this.responseType = '';\n\n  /**\n   * Document response entity body.\n   * NOTE: This is always null and not supported by this class.\n   * @final {null}\n   */\n  this.responseXML = null;\n\n  /**\n   * Method to call when the state changes.\n   * @type {?function()}\n   */\n  this.onreadystatechange = null;\n\n  /** @private {!Headers} */\n  this.requestHeaders_ = new Headers();\n\n  /** @private {?Headers} */\n  this.responseHeaders_ = null;\n\n  /**\n   * Request method (GET or POST).\n   * @private {string}\n   */\n  this.method_ = 'GET';\n\n  /**\n   * Request URL.\n   * @private {string}\n   */\n  this.url_ = '';\n\n  /**\n   * Whether the request is in progress.\n   * @private {boolean}\n   */\n  this.inProgress_ = false;\n\n  /** @private @final {?goog.log.Logger} */\n  this.logger_ = goog.log.getLogger('goog.net.FetchXmlHttp');\n\n  /** @private {?Response} */\n  this.fetchResponse_ = null;\n\n  /** @private {!ReadableStreamDefaultReader|null} */\n  this.currentReader_ = null;\n\n  /** @private {?TextDecoder} */\n  this.textDecoder_ = null;\n};\ngoog.inherits(goog.net.FetchXmlHttp, goog.events.EventTarget);\n\n\n/**\n * State of the requests.\n * @enum {number}\n */\ngoog.net.FetchXmlHttp.RequestState = {\n  UNSENT: 0,\n  OPENED: 1,\n  HEADER_RECEIVED: 2,\n  LOADING: 3,\n  DONE: 4\n};\n\n\n/** @override */\ngoog.net.FetchXmlHttp.prototype.open = function(method, url, opt_async) {\n  goog.asserts.assert(!!opt_async, 'Only async requests are supported.');\n  if (this.readyState != goog.net.FetchXmlHttp.RequestState.UNSENT) {\n    this.abort();\n    throw new Error('Error reopening a connection');\n  }\n\n  this.method_ = method;\n  this.url_ = url;\n\n  this.readyState = goog.net.FetchXmlHttp.RequestState.OPENED;\n  this.dispatchCallback_();\n};\n\n\n/** @override */\ngoog.net.FetchXmlHttp.prototype.send = function(opt_data) {\n  if (this.readyState != goog.net.FetchXmlHttp.RequestState.OPENED) {\n    this.abort();\n    throw new Error('need to call open() first. ');\n  }\n\n  this.inProgress_ = true;\n  var requestInit = {\n    headers: this.requestHeaders_,\n    method: this.method_,\n    credentials: this.credentialsMode_,\n    cache: this.cacheMode_\n  };\n  if (opt_data) {\n    requestInit['body'] = opt_data;\n  }\n  this.worker_\n      .fetch(new Request(this.url_, /** @type {!RequestInit} */ (requestInit)))\n      .then(\n          this.handleResponse_.bind(this), this.handleSendFailure_.bind(this));\n};\n\n\n/** @override */\ngoog.net.FetchXmlHttp.prototype.abort = function() {\n  this.response = this.responseText = '';\n  this.requestHeaders_ = new Headers();\n  this.status = 0;\n\n  if (!!this.currentReader_) {\n    this.currentReader_.cancel('Request was aborted.');\n  }\n\n  if (((this.readyState >= goog.net.FetchXmlHttp.RequestState.OPENED) &&\n       this.inProgress_) &&\n      (this.readyState != goog.net.FetchXmlHttp.RequestState.DONE)) {\n    this.inProgress_ = false;\n    this.requestDone_(false);\n  }\n\n  this.readyState = goog.net.FetchXmlHttp.RequestState.UNSENT;\n};\n\n\n/**\n * Handles the fetch response.\n * @param {!Response} response\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.handleResponse_ = function(response) {\n  if (!this.inProgress_) {\n    // The request was aborted, ignore.\n    return;\n  }\n\n  this.fetchResponse_ = response;\n\n  if (!this.responseHeaders_) {\n    this.responseHeaders_ = response.headers;\n    this.readyState = goog.net.FetchXmlHttp.RequestState.HEADER_RECEIVED;\n    this.dispatchCallback_();\n  }\n  // A callback may abort the request.\n  if (!this.inProgress_) {\n    // The request was aborted, ignore.\n    return;\n  }\n\n  this.readyState = goog.net.FetchXmlHttp.RequestState.LOADING;\n  this.dispatchCallback_();\n  // A callback may abort the request.\n  if (!this.inProgress_) {\n    // The request was aborted, ignore.\n    return;\n  }\n\n  if (this.responseType === 'arraybuffer') {\n    response.arrayBuffer().then(\n        this.handleResponseArrayBuffer_.bind(this),\n        this.handleSendFailure_.bind(this));\n  } else if (\n      typeof (goog.global.ReadableStream) !== 'undefined' &&\n      'body' in response) {\n    this.response = this.responseText = '';\n    this.currentReader_ =\n        /** @type {!ReadableStreamDefaultReader} */ (response.body.getReader());\n    this.textDecoder_ = new TextDecoder();\n    this.readInputFromFetch_();\n  } else {\n    response.text().then(\n        this.handleResponseText_.bind(this),\n        this.handleSendFailure_.bind(this));\n  }\n};\n\n\n/**\n * Reads the next chunk of data from the fetch response.\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.readInputFromFetch_ = function() {\n  this.currentReader_.read()\n      .then(this.handleDataFromStream_.bind(this))\n      .catch(this.handleSendFailure_.bind(this));\n};\n\n\n/**\n * Handles a chunk of data from the fetch response stream reader.\n * @param {!IteratorResult} result\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.handleDataFromStream_ = function(result) {\n  if (!this.inProgress_) {\n    // The request was aborted, ignore.\n    return;\n  }\n\n  var dataPacket = result.value ? /** @type {!Uint8Array} */ (result.value) :\n                                  new Uint8Array(0);\n  var newText = this.textDecoder_.decode(dataPacket, {stream: !result.done});\n  if (newText) {\n    this.responseText += newText;\n    this.response = this.responseText;\n  }\n\n  if (result.done) {\n    this.requestDone_(true);\n  } else {\n    this.dispatchCallback_();\n  }\n\n  if (this.readyState == goog.net.FetchXmlHttp.RequestState.LOADING) {\n    this.readInputFromFetch_();\n  }\n};\n\n\n/**\n * Handles the response text.\n * @param {string} responseText\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.handleResponseText_ = function(responseText) {\n  if (!this.inProgress_) {\n    // The request was aborted, ignore.\n    return;\n  }\n  this.response = this.responseText = responseText;\n  this.requestDone_(true);\n};\n\n\n/**\n * Handles the response text.\n * @param {!ArrayBuffer} responseArrayBuffer\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.handleResponseArrayBuffer_ = function(\n    responseArrayBuffer) {\n  if (!this.inProgress_) {\n    // The request was aborted, ignore.\n    return;\n  }\n  this.response = responseArrayBuffer;\n  this.requestDone_(true);\n};\n\n\n/**\n * Handles the send failure.\n * @param {*} error\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.handleSendFailure_ = function(error) {\n  var e = error instanceof Error ? error : Error(error);\n  goog.log.warning(this.logger_, 'Failed to fetch url ' + this.url_, e);\n  if (!this.inProgress_) {\n    // The request was aborted, ignore.\n    return;\n  }\n  this.requestDone_(true);\n};\n\n\n/**\n * Sets the request state to DONE and performs cleanup.\n * @param {boolean} setStatus whether to set the status and statusText fields,\n * this is not necessary when the request is aborted.\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.requestDone_ = function(setStatus) {\n  if (setStatus && this.fetchResponse_) {\n    this.status = this.fetchResponse_.status;\n    this.statusText = this.fetchResponse_.statusText;\n  }\n\n  this.readyState = goog.net.FetchXmlHttp.RequestState.DONE;\n\n  this.fetchResponse_ = null;\n  this.currentReader_ = null;\n  this.textDecoder_ = null;\n\n  this.dispatchCallback_();\n};\n\n\n/** @override */\ngoog.net.FetchXmlHttp.prototype.setRequestHeader = function(header, value) {\n  this.requestHeaders_.append(header, value);\n};\n\n\n/** @override */\ngoog.net.FetchXmlHttp.prototype.getResponseHeader = function(header) {\n  // TODO(b/70808323): This method should return null when the headers are not\n  // present or the specified header is missing. The externs need to be fixed.\n  if (!this.responseHeaders_) {\n    goog.log.warning(\n        this.logger_,\n        'Attempting to get response header but no headers have been received ' +\n            'for url: ' + this.url_);\n    return '';\n  }\n  return this.responseHeaders_.get(header.toLowerCase()) || '';\n};\n\n\n/** @override */\ngoog.net.FetchXmlHttp.prototype.getAllResponseHeaders = function() {\n  if (!this.responseHeaders_) {\n    goog.log.warning(\n        this.logger_,\n        'Attempting to get all response headers but no headers have been ' +\n            'received for url: ' + this.url_);\n    return '';\n  }\n  var lines = [];\n  var iter = this.responseHeaders_.entries();\n  var entry = iter.next();\n  while (!entry.done) {\n    var pair = entry.value;\n    lines.push(pair[0] + ': ' + pair[1]);\n    entry = iter.next();\n  }\n  return lines.join('\\r\\n');\n};\n\n\n/**\n * @param {!RequestCredentials} credentialsMode The credentials mode of the\n *     Service Worker fetch.\n */\ngoog.net.FetchXmlHttp.prototype.setCredentialsMode = function(credentialsMode) {\n  this.credentialsMode_ = credentialsMode;\n};\n\n\n/**\n * @param {!RequestCache} cacheMode The cache mode of the Service Worker fetch.\n */\ngoog.net.FetchXmlHttp.prototype.setCacheMode = function(cacheMode) {\n  this.cacheMode_ = cacheMode;\n};\n\n\n/**\n * Dispatches the callback, if the callback attribute is defined.\n * @private\n */\ngoog.net.FetchXmlHttp.prototype.dispatchCallback_ = function() {\n  if (this.onreadystatechange) {\n    this.onreadystatechange.call(this);\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;<","^9>","^:L","^;Q","^H>","^H?"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/fetchxmlhttpfactory.js"],"^:1",["^9K",["~$goog.net.FetchXmlHttp","~$goog.net.FetchXmlHttpFactory"]],"^9<",true,"^9=",["^9>","^:E","^:L","^;<","^;Q","^H>","^H?"]],["^ ","^9A",[1579837703000],"^9B","goog.vec.mat4f.js","^9C",["^9D","goog/vec/mat4f.js"],"^9E","goog/vec/mat4f.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n//                                                                           //\n// Any edits to this file must be applied to mat4d.js by running:            //\n//   swap_type.sh mat4f.js > mat4d.js                                        //\n//                                                                           //\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n\n\n/**\n * @fileoverview Provides functions for operating on 4x4 float (32bit)\n * matrices.  The matrices are stored in column-major order.\n *\n * The last parameter will typically be the output matrix and an\n * object can be both an input and output parameter to all methods except\n * where noted.\n *\n * See the README for notes about the design and structure of the API\n * (especially related to performance).\n *\n */\ngoog.provide('goog.vec.mat4f');\ngoog.provide('goog.vec.mat4f.Type');\n\ngoog.require('goog.vec');\n/** @suppress {extraRequire} */\ngoog.require('goog.vec.Quaternion');\ngoog.require('goog.vec.vec3f');\ngoog.require('goog.vec.vec4f');\n\n\n/** @typedef {!goog.vec.Float32} */ goog.vec.mat4f.Type;\n\n\n/**\n * Creates a mat4f with all elements initialized to zero.\n *\n * @return {!goog.vec.mat4f.Type} The new mat4f.\n */\ngoog.vec.mat4f.create = function() {\n  return new Float32Array(16);\n};\n\n\n/**\n * Creates a mat4f identity matrix.\n *\n * @return {!goog.vec.mat4f.Type} The new mat4f.\n */\ngoog.vec.mat4f.createIdentity = function() {\n  var mat = goog.vec.mat4f.create();\n  mat[0] = mat[5] = mat[10] = mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Initializes the matrix from the set of values. Note the values supplied are\n * in column major order.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix to receive the\n *     values.\n * @param {number} v00 The values at (0, 0).\n * @param {number} v10 The values at (1, 0).\n * @param {number} v20 The values at (2, 0).\n * @param {number} v30 The values at (3, 0).\n * @param {number} v01 The values at (0, 1).\n * @param {number} v11 The values at (1, 1).\n * @param {number} v21 The values at (2, 1).\n * @param {number} v31 The values at (3, 1).\n * @param {number} v02 The values at (0, 2).\n * @param {number} v12 The values at (1, 2).\n * @param {number} v22 The values at (2, 2).\n * @param {number} v32 The values at (3, 2).\n * @param {number} v03 The values at (0, 3).\n * @param {number} v13 The values at (1, 3).\n * @param {number} v23 The values at (2, 3).\n * @param {number} v33 The values at (3, 3).\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.setFromValues = function(\n    mat, v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13,\n    v23, v33) {\n  mat[0] = v00;\n  mat[1] = v10;\n  mat[2] = v20;\n  mat[3] = v30;\n  mat[4] = v01;\n  mat[5] = v11;\n  mat[6] = v21;\n  mat[7] = v31;\n  mat[8] = v02;\n  mat[9] = v12;\n  mat[10] = v22;\n  mat[11] = v32;\n  mat[12] = v03;\n  mat[13] = v13;\n  mat[14] = v23;\n  mat[15] = v33;\n  return mat;\n};\n\n\n/**\n * Initializes mat4f mat from mat4f src.\n *\n * @param {!goog.vec.mat4f.Type} mat The destination matrix.\n * @param {!goog.vec.mat4f.Type} src The source matrix.\n * @return {!goog.vec.mat4f.Type} Return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.setFromMat4f = function(mat, src) {\n  mat[0] = src[0];\n  mat[1] = src[1];\n  mat[2] = src[2];\n  mat[3] = src[3];\n  mat[4] = src[4];\n  mat[5] = src[5];\n  mat[6] = src[6];\n  mat[7] = src[7];\n  mat[8] = src[8];\n  mat[9] = src[9];\n  mat[10] = src[10];\n  mat[11] = src[11];\n  mat[12] = src[12];\n  mat[13] = src[13];\n  mat[14] = src[14];\n  mat[15] = src[15];\n  return mat;\n};\n\n\n/**\n * Initializes mat4f mat from mat4d src (typed as a Float64Array to\n * avoid circular goog.requires).\n *\n * @param {!goog.vec.mat4f.Type} mat The destination matrix.\n * @param {Float64Array} src The source matrix.\n * @return {!goog.vec.mat4f.Type} Return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.setFromMat4d = function(mat, src) {\n  mat[0] = src[0];\n  mat[1] = src[1];\n  mat[2] = src[2];\n  mat[3] = src[3];\n  mat[4] = src[4];\n  mat[5] = src[5];\n  mat[6] = src[6];\n  mat[7] = src[7];\n  mat[8] = src[8];\n  mat[9] = src[9];\n  mat[10] = src[10];\n  mat[11] = src[11];\n  mat[12] = src[12];\n  mat[13] = src[13];\n  mat[14] = src[14];\n  mat[15] = src[15];\n  return mat;\n};\n\n\n/**\n * Initializes mat4f mat from Array src.\n *\n * @param {!goog.vec.mat4f.Type} mat The destination matrix.\n * @param {Array<number>} src The source matrix.\n * @return {!goog.vec.mat4f.Type} Return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.setFromArray = function(mat, src) {\n  mat[0] = src[0];\n  mat[1] = src[1];\n  mat[2] = src[2];\n  mat[3] = src[3];\n  mat[4] = src[4];\n  mat[5] = src[5];\n  mat[6] = src[6];\n  mat[7] = src[7];\n  mat[8] = src[8];\n  mat[9] = src[9];\n  mat[10] = src[10];\n  mat[11] = src[11];\n  mat[12] = src[12];\n  mat[13] = src[13];\n  mat[14] = src[14];\n  mat[15] = src[15];\n  return mat;\n};\n\n\n/**\n * Retrieves the element at the requested row and column.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix containing the value to\n *     retrieve.\n * @param {number} row The row index.\n * @param {number} column The column index.\n * @return {number} The element value at the requested row, column indices.\n */\ngoog.vec.mat4f.getElement = function(mat, row, column) {\n  return mat[row + column * 4];\n};\n\n\n/**\n * Sets the element at the requested row and column.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix containing the value to\n *     retrieve.\n * @param {number} row The row index.\n * @param {number} column The column index.\n * @param {number} value The value to set at the requested row, column.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.setElement = function(mat, row, column, value) {\n  mat[row + column * 4] = value;\n  return mat;\n};\n\n\n/**\n * Sets the diagonal values of the matrix from the given values.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix to receive the values.\n * @param {number} v00 The values for (0, 0).\n * @param {number} v11 The values for (1, 1).\n * @param {number} v22 The values for (2, 2).\n * @param {number} v33 The values for (3, 3).\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.setDiagonalValues = function(mat, v00, v11, v22, v33) {\n  mat[0] = v00;\n  mat[5] = v11;\n  mat[10] = v22;\n  mat[15] = v33;\n  return mat;\n};\n\n\n/**\n * Sets the diagonal values of the matrix from the given vector.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix to receive the values.\n * @param {!goog.vec.vec4f.Type} vec The vector containing the values.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.setDiagonal = function(mat, vec) {\n  mat[0] = vec[0];\n  mat[5] = vec[1];\n  mat[10] = vec[2];\n  mat[15] = vec[3];\n  return mat;\n};\n\n\n/**\n * Gets the diagonal values of the matrix into the given vector.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix containing the values.\n * @param {!goog.vec.vec4f.Type} vec The vector to receive the values.\n * @param {number=} opt_diagonal Which diagonal to get. A value of 0 selects the\n *     main diagonal, a positive number selects a super diagonal and a negative\n *     number selects a sub diagonal.\n * @return {!goog.vec.vec4f.Type} return vec so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.getDiagonal = function(mat, vec, opt_diagonal) {\n  if (!opt_diagonal) {\n    // This is the most common case, so we avoid the for loop.\n    vec[0] = mat[0];\n    vec[1] = mat[5];\n    vec[2] = mat[10];\n    vec[3] = mat[15];\n  } else {\n    var offset = opt_diagonal > 0 ? 4 * opt_diagonal : -opt_diagonal;\n    for (var i = 0; i < 4 - Math.abs(opt_diagonal); i++) {\n      vec[i] = mat[offset + 5 * i];\n    }\n  }\n  return vec;\n};\n\n\n/**\n * Sets the specified column with the supplied values.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix to receive the values.\n * @param {number} column The column index to set the values on.\n * @param {number} v0 The value for row 0.\n * @param {number} v1 The value for row 1.\n * @param {number} v2 The value for row 2.\n * @param {number} v3 The value for row 3.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.setColumnValues = function(mat, column, v0, v1, v2, v3) {\n  var i = column * 4;\n  mat[i] = v0;\n  mat[i + 1] = v1;\n  mat[i + 2] = v2;\n  mat[i + 3] = v3;\n  return mat;\n};\n\n\n/**\n * Sets the specified column with the value from the supplied vector.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix to receive the values.\n * @param {number} column The column index to set the values on.\n * @param {!goog.vec.vec4f.Type} vec The vector of elements for the column.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.setColumn = function(mat, column, vec) {\n  var i = column * 4;\n  mat[i] = vec[0];\n  mat[i + 1] = vec[1];\n  mat[i + 2] = vec[2];\n  mat[i + 3] = vec[3];\n  return mat;\n};\n\n\n/**\n * Retrieves the specified column from the matrix into the given vector.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix supplying the values.\n * @param {number} column The column to get the values from.\n * @param {!goog.vec.vec4f.Type} vec The vector of elements to\n *     receive the column.\n * @return {!goog.vec.vec4f.Type} return vec so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.getColumn = function(mat, column, vec) {\n  var i = column * 4;\n  vec[0] = mat[i];\n  vec[1] = mat[i + 1];\n  vec[2] = mat[i + 2];\n  vec[3] = mat[i + 3];\n  return vec;\n};\n\n\n/**\n * Sets the columns of the matrix from the given vectors.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix to receive the values.\n * @param {!goog.vec.vec4f.Type} vec0 The values for column 0.\n * @param {!goog.vec.vec4f.Type} vec1 The values for column 1.\n * @param {!goog.vec.vec4f.Type} vec2 The values for column 2.\n * @param {!goog.vec.vec4f.Type} vec3 The values for column 3.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.setColumns = function(mat, vec0, vec1, vec2, vec3) {\n  mat[0] = vec0[0];\n  mat[1] = vec0[1];\n  mat[2] = vec0[2];\n  mat[3] = vec0[3];\n  mat[4] = vec1[0];\n  mat[5] = vec1[1];\n  mat[6] = vec1[2];\n  mat[7] = vec1[3];\n  mat[8] = vec2[0];\n  mat[9] = vec2[1];\n  mat[10] = vec2[2];\n  mat[11] = vec2[3];\n  mat[12] = vec3[0];\n  mat[13] = vec3[1];\n  mat[14] = vec3[2];\n  mat[15] = vec3[3];\n  return mat;\n};\n\n\n/**\n * Retrieves the column values from the given matrix into the given vectors.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix supplying the columns.\n * @param {!goog.vec.vec4f.Type} vec0 The vector to receive column 0.\n * @param {!goog.vec.vec4f.Type} vec1 The vector to receive column 1.\n * @param {!goog.vec.vec4f.Type} vec2 The vector to receive column 2.\n * @param {!goog.vec.vec4f.Type} vec3 The vector to receive column 3.\n */\ngoog.vec.mat4f.getColumns = function(mat, vec0, vec1, vec2, vec3) {\n  vec0[0] = mat[0];\n  vec0[1] = mat[1];\n  vec0[2] = mat[2];\n  vec0[3] = mat[3];\n  vec1[0] = mat[4];\n  vec1[1] = mat[5];\n  vec1[2] = mat[6];\n  vec1[3] = mat[7];\n  vec2[0] = mat[8];\n  vec2[1] = mat[9];\n  vec2[2] = mat[10];\n  vec2[3] = mat[11];\n  vec3[0] = mat[12];\n  vec3[1] = mat[13];\n  vec3[2] = mat[14];\n  vec3[3] = mat[15];\n};\n\n\n/**\n * Sets the row values from the supplied values.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix to receive the values.\n * @param {number} row The index of the row to receive the values.\n * @param {number} v0 The value for column 0.\n * @param {number} v1 The value for column 1.\n * @param {number} v2 The value for column 2.\n * @param {number} v3 The value for column 3.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.setRowValues = function(mat, row, v0, v1, v2, v3) {\n  mat[row] = v0;\n  mat[row + 4] = v1;\n  mat[row + 8] = v2;\n  mat[row + 12] = v3;\n  return mat;\n};\n\n\n/**\n * Sets the row values from the supplied vector.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix to receive the row values.\n * @param {number} row The index of the row.\n * @param {!goog.vec.vec4f.Type} vec The vector containing the values.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.setRow = function(mat, row, vec) {\n  mat[row] = vec[0];\n  mat[row + 4] = vec[1];\n  mat[row + 8] = vec[2];\n  mat[row + 12] = vec[3];\n  return mat;\n};\n\n\n/**\n * Retrieves the row values into the given vector.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix supplying the values.\n * @param {number} row The index of the row supplying the values.\n * @param {!goog.vec.vec4f.Type} vec The vector to receive the row.\n * @return {!goog.vec.vec4f.Type} return vec so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.getRow = function(mat, row, vec) {\n  vec[0] = mat[row];\n  vec[1] = mat[row + 4];\n  vec[2] = mat[row + 8];\n  vec[3] = mat[row + 12];\n  return vec;\n};\n\n\n/**\n * Sets the rows of the matrix from the supplied vectors.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix to receive the values.\n * @param {!goog.vec.vec4f.Type} vec0 The values for row 0.\n * @param {!goog.vec.vec4f.Type} vec1 The values for row 1.\n * @param {!goog.vec.vec4f.Type} vec2 The values for row 2.\n * @param {!goog.vec.vec4f.Type} vec3 The values for row 3.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.setRows = function(mat, vec0, vec1, vec2, vec3) {\n  mat[0] = vec0[0];\n  mat[1] = vec1[0];\n  mat[2] = vec2[0];\n  mat[3] = vec3[0];\n  mat[4] = vec0[1];\n  mat[5] = vec1[1];\n  mat[6] = vec2[1];\n  mat[7] = vec3[1];\n  mat[8] = vec0[2];\n  mat[9] = vec1[2];\n  mat[10] = vec2[2];\n  mat[11] = vec3[2];\n  mat[12] = vec0[3];\n  mat[13] = vec1[3];\n  mat[14] = vec2[3];\n  mat[15] = vec3[3];\n  return mat;\n};\n\n\n/**\n * Retrieves the rows of the matrix into the supplied vectors.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix to supply the values.\n * @param {!goog.vec.vec4f.Type} vec0 The vector to receive row 0.\n * @param {!goog.vec.vec4f.Type} vec1 The vector to receive row 1.\n * @param {!goog.vec.vec4f.Type} vec2 The vector to receive row 2.\n * @param {!goog.vec.vec4f.Type} vec3 The vector to receive row 3.\n */\ngoog.vec.mat4f.getRows = function(mat, vec0, vec1, vec2, vec3) {\n  vec0[0] = mat[0];\n  vec1[0] = mat[1];\n  vec2[0] = mat[2];\n  vec3[0] = mat[3];\n  vec0[1] = mat[4];\n  vec1[1] = mat[5];\n  vec2[1] = mat[6];\n  vec3[1] = mat[7];\n  vec0[2] = mat[8];\n  vec1[2] = mat[9];\n  vec2[2] = mat[10];\n  vec3[2] = mat[11];\n  vec0[3] = mat[12];\n  vec1[3] = mat[13];\n  vec2[3] = mat[14];\n  vec3[3] = mat[15];\n};\n\n\n/**\n * Makes the given 4x4 matrix the zero matrix.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @return {!goog.vec.mat4f.Type} return mat so operations can be chained.\n */\ngoog.vec.mat4f.makeZero = function(mat) {\n  mat[0] = 0;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = 0;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = 0;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 0;\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix the identity matrix.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @return {!goog.vec.mat4f.Type} return mat so operations can be chained.\n */\ngoog.vec.mat4f.makeIdentity = function(mat) {\n  mat[0] = 1;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = 1;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = 1;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Performs a per-component addition of the matrix mat0 and mat1, storing\n * the result into resultMat.\n *\n * @param {!goog.vec.mat4f.Type} mat0 The first addend.\n * @param {!goog.vec.mat4f.Type} mat1 The second addend.\n * @param {!goog.vec.mat4f.Type} resultMat The matrix to\n *     receive the results (may be either mat0 or mat1).\n * @return {!goog.vec.mat4f.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.addMat = function(mat0, mat1, resultMat) {\n  resultMat[0] = mat0[0] + mat1[0];\n  resultMat[1] = mat0[1] + mat1[1];\n  resultMat[2] = mat0[2] + mat1[2];\n  resultMat[3] = mat0[3] + mat1[3];\n  resultMat[4] = mat0[4] + mat1[4];\n  resultMat[5] = mat0[5] + mat1[5];\n  resultMat[6] = mat0[6] + mat1[6];\n  resultMat[7] = mat0[7] + mat1[7];\n  resultMat[8] = mat0[8] + mat1[8];\n  resultMat[9] = mat0[9] + mat1[9];\n  resultMat[10] = mat0[10] + mat1[10];\n  resultMat[11] = mat0[11] + mat1[11];\n  resultMat[12] = mat0[12] + mat1[12];\n  resultMat[13] = mat0[13] + mat1[13];\n  resultMat[14] = mat0[14] + mat1[14];\n  resultMat[15] = mat0[15] + mat1[15];\n  return resultMat;\n};\n\n\n/**\n * Performs a per-component subtraction of the matrix mat0 and mat1,\n * storing the result into resultMat.\n *\n * @param {!goog.vec.mat4f.Type} mat0 The minuend.\n * @param {!goog.vec.mat4f.Type} mat1 The subtrahend.\n * @param {!goog.vec.mat4f.Type} resultMat The matrix to receive\n *     the results (may be either mat0 or mat1).\n * @return {!goog.vec.mat4f.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.subMat = function(mat0, mat1, resultMat) {\n  resultMat[0] = mat0[0] - mat1[0];\n  resultMat[1] = mat0[1] - mat1[1];\n  resultMat[2] = mat0[2] - mat1[2];\n  resultMat[3] = mat0[3] - mat1[3];\n  resultMat[4] = mat0[4] - mat1[4];\n  resultMat[5] = mat0[5] - mat1[5];\n  resultMat[6] = mat0[6] - mat1[6];\n  resultMat[7] = mat0[7] - mat1[7];\n  resultMat[8] = mat0[8] - mat1[8];\n  resultMat[9] = mat0[9] - mat1[9];\n  resultMat[10] = mat0[10] - mat1[10];\n  resultMat[11] = mat0[11] - mat1[11];\n  resultMat[12] = mat0[12] - mat1[12];\n  resultMat[13] = mat0[13] - mat1[13];\n  resultMat[14] = mat0[14] - mat1[14];\n  resultMat[15] = mat0[15] - mat1[15];\n  return resultMat;\n};\n\n\n/**\n * Multiplies matrix mat with the given scalar, storing the result\n * into resultMat.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} scalar The scalar value to multiply to each element of mat.\n * @param {!goog.vec.mat4f.Type} resultMat The matrix to receive\n *     the results (may be mat).\n * @return {!goog.vec.mat4f.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.multScalar = function(mat, scalar, resultMat) {\n  resultMat[0] = mat[0] * scalar;\n  resultMat[1] = mat[1] * scalar;\n  resultMat[2] = mat[2] * scalar;\n  resultMat[3] = mat[3] * scalar;\n  resultMat[4] = mat[4] * scalar;\n  resultMat[5] = mat[5] * scalar;\n  resultMat[6] = mat[6] * scalar;\n  resultMat[7] = mat[7] * scalar;\n  resultMat[8] = mat[8] * scalar;\n  resultMat[9] = mat[9] * scalar;\n  resultMat[10] = mat[10] * scalar;\n  resultMat[11] = mat[11] * scalar;\n  resultMat[12] = mat[12] * scalar;\n  resultMat[13] = mat[13] * scalar;\n  resultMat[14] = mat[14] * scalar;\n  resultMat[15] = mat[15] * scalar;\n  return resultMat;\n};\n\n\n/**\n * Multiplies the two matrices mat0 and mat1 using matrix multiplication,\n * storing the result into resultMat.\n *\n * @param {!goog.vec.mat4f.Type} mat0 The first (left hand) matrix.\n * @param {!goog.vec.mat4f.Type} mat1 The second (right hand) matrix.\n * @param {!goog.vec.mat4f.Type} resultMat The matrix to receive\n *     the results (may be either mat0 or mat1).\n * @return {!goog.vec.mat4f.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.multMat = function(mat0, mat1, resultMat) {\n  var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2], a30 = mat0[3];\n  var a01 = mat0[4], a11 = mat0[5], a21 = mat0[6], a31 = mat0[7];\n  var a02 = mat0[8], a12 = mat0[9], a22 = mat0[10], a32 = mat0[11];\n  var a03 = mat0[12], a13 = mat0[13], a23 = mat0[14], a33 = mat0[15];\n\n  var b00 = mat1[0], b10 = mat1[1], b20 = mat1[2], b30 = mat1[3];\n  var b01 = mat1[4], b11 = mat1[5], b21 = mat1[6], b31 = mat1[7];\n  var b02 = mat1[8], b12 = mat1[9], b22 = mat1[10], b32 = mat1[11];\n  var b03 = mat1[12], b13 = mat1[13], b23 = mat1[14], b33 = mat1[15];\n\n  resultMat[0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30;\n  resultMat[1] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30;\n  resultMat[2] = a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30;\n  resultMat[3] = a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30;\n\n  resultMat[4] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31;\n  resultMat[5] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31;\n  resultMat[6] = a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31;\n  resultMat[7] = a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31;\n\n  resultMat[8] = a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32;\n  resultMat[9] = a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32;\n  resultMat[10] = a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32;\n  resultMat[11] = a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32;\n\n  resultMat[12] = a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33;\n  resultMat[13] = a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33;\n  resultMat[14] = a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33;\n  resultMat[15] = a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33;\n  return resultMat;\n};\n\n\n/**\n * Transposes the given matrix mat storing the result into resultMat.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix to transpose.\n * @param {!goog.vec.mat4f.Type} resultMat The matrix to receive\n *     the results (may be mat).\n * @return {!goog.vec.mat4f.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.transpose = function(mat, resultMat) {\n  if (resultMat == mat) {\n    var a10 = mat[1], a20 = mat[2], a30 = mat[3];\n    var a21 = mat[6], a31 = mat[7];\n    var a32 = mat[11];\n    resultMat[1] = mat[4];\n    resultMat[2] = mat[8];\n    resultMat[3] = mat[12];\n    resultMat[4] = a10;\n    resultMat[6] = mat[9];\n    resultMat[7] = mat[13];\n    resultMat[8] = a20;\n    resultMat[9] = a21;\n    resultMat[11] = mat[14];\n    resultMat[12] = a30;\n    resultMat[13] = a31;\n    resultMat[14] = a32;\n  } else {\n    resultMat[0] = mat[0];\n    resultMat[1] = mat[4];\n    resultMat[2] = mat[8];\n    resultMat[3] = mat[12];\n\n    resultMat[4] = mat[1];\n    resultMat[5] = mat[5];\n    resultMat[6] = mat[9];\n    resultMat[7] = mat[13];\n\n    resultMat[8] = mat[2];\n    resultMat[9] = mat[6];\n    resultMat[10] = mat[10];\n    resultMat[11] = mat[14];\n\n    resultMat[12] = mat[3];\n    resultMat[13] = mat[7];\n    resultMat[14] = mat[11];\n    resultMat[15] = mat[15];\n  }\n  return resultMat;\n};\n\n\n/**\n * Computes the determinant of the matrix.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix to compute the matrix for.\n * @return {number} The determinant of the matrix.\n */\ngoog.vec.mat4f.determinant = function(mat) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];\n  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];\n  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];\n  var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15];\n\n  var a0 = m00 * m11 - m10 * m01;\n  var a1 = m00 * m21 - m20 * m01;\n  var a2 = m00 * m31 - m30 * m01;\n  var a3 = m10 * m21 - m20 * m11;\n  var a4 = m10 * m31 - m30 * m11;\n  var a5 = m20 * m31 - m30 * m21;\n  var b0 = m02 * m13 - m12 * m03;\n  var b1 = m02 * m23 - m22 * m03;\n  var b2 = m02 * m33 - m32 * m03;\n  var b3 = m12 * m23 - m22 * m13;\n  var b4 = m12 * m33 - m32 * m13;\n  var b5 = m22 * m33 - m32 * m23;\n\n  return a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0;\n};\n\n\n/**\n * Computes the inverse of mat storing the result into resultMat. If the\n * inverse is defined, this function returns true, false otherwise.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix to invert.\n * @param {!goog.vec.mat4f.Type} resultMat The matrix to receive\n *     the result (may be mat).\n * @return {boolean} True if the inverse is defined. If false is returned,\n *     resultMat is not modified.\n */\ngoog.vec.mat4f.invert = function(mat, resultMat) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];\n  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];\n  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];\n  var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15];\n\n  var a0 = m00 * m11 - m10 * m01;\n  var a1 = m00 * m21 - m20 * m01;\n  var a2 = m00 * m31 - m30 * m01;\n  var a3 = m10 * m21 - m20 * m11;\n  var a4 = m10 * m31 - m30 * m11;\n  var a5 = m20 * m31 - m30 * m21;\n  var b0 = m02 * m13 - m12 * m03;\n  var b1 = m02 * m23 - m22 * m03;\n  var b2 = m02 * m33 - m32 * m03;\n  var b3 = m12 * m23 - m22 * m13;\n  var b4 = m12 * m33 - m32 * m13;\n  var b5 = m22 * m33 - m32 * m23;\n\n  var det = a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0;\n  if (det == 0) {\n    return false;\n  }\n\n  var idet = 1.0 / det;\n  resultMat[0] = (m11 * b5 - m21 * b4 + m31 * b3) * idet;\n  resultMat[1] = (-m10 * b5 + m20 * b4 - m30 * b3) * idet;\n  resultMat[2] = (m13 * a5 - m23 * a4 + m33 * a3) * idet;\n  resultMat[3] = (-m12 * a5 + m22 * a4 - m32 * a3) * idet;\n  resultMat[4] = (-m01 * b5 + m21 * b2 - m31 * b1) * idet;\n  resultMat[5] = (m00 * b5 - m20 * b2 + m30 * b1) * idet;\n  resultMat[6] = (-m03 * a5 + m23 * a2 - m33 * a1) * idet;\n  resultMat[7] = (m02 * a5 - m22 * a2 + m32 * a1) * idet;\n  resultMat[8] = (m01 * b4 - m11 * b2 + m31 * b0) * idet;\n  resultMat[9] = (-m00 * b4 + m10 * b2 - m30 * b0) * idet;\n  resultMat[10] = (m03 * a4 - m13 * a2 + m33 * a0) * idet;\n  resultMat[11] = (-m02 * a4 + m12 * a2 - m32 * a0) * idet;\n  resultMat[12] = (-m01 * b3 + m11 * b1 - m21 * b0) * idet;\n  resultMat[13] = (m00 * b3 - m10 * b1 + m20 * b0) * idet;\n  resultMat[14] = (-m03 * a3 + m13 * a1 - m23 * a0) * idet;\n  resultMat[15] = (m02 * a3 - m12 * a1 + m22 * a0) * idet;\n  return true;\n};\n\n\n/**\n * Returns true if the components of mat0 are equal to the components of mat1.\n *\n * @param {!goog.vec.mat4f.Type} mat0 The first matrix.\n * @param {!goog.vec.mat4f.Type} mat1 The second matrix.\n * @return {boolean} True if the the two matrices are equivalent.\n */\ngoog.vec.mat4f.equals = function(mat0, mat1) {\n  return mat0.length == mat1.length && mat0[0] == mat1[0] &&\n      mat0[1] == mat1[1] && mat0[2] == mat1[2] && mat0[3] == mat1[3] &&\n      mat0[4] == mat1[4] && mat0[5] == mat1[5] && mat0[6] == mat1[6] &&\n      mat0[7] == mat1[7] && mat0[8] == mat1[8] && mat0[9] == mat1[9] &&\n      mat0[10] == mat1[10] && mat0[11] == mat1[11] && mat0[12] == mat1[12] &&\n      mat0[13] == mat1[13] && mat0[14] == mat1[14] && mat0[15] == mat1[15];\n};\n\n\n/**\n * Transforms the given vector with the given matrix storing the resulting,\n * transformed vector into resultVec. The input vector is multiplied against the\n * upper 3x4 matrix omitting the projective component.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix supplying the transformation.\n * @param {!goog.vec.vec3f.Type} vec The 3 element vector to transform.\n * @param {!goog.vec.vec3f.Type} resultVec The 3 element vector to\n *     receive the results (may be vec).\n * @return {!goog.vec.vec3f.Type} return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.multVec3 = function(mat, vec, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2];\n  resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8] + mat[12];\n  resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9] + mat[13];\n  resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10] + mat[14];\n  return resultVec;\n};\n\n\n/**\n * Transforms the given vector with the given matrix storing the resulting,\n * transformed vector into resultVec. The input vector is multiplied against the\n * upper 3x3 matrix omitting the projective component and translation\n * components.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix supplying the transformation.\n * @param {!goog.vec.vec3f.Type} vec The 3 element vector to transform.\n * @param {!goog.vec.vec3f.Type} resultVec The 3 element vector to\n *     receive the results (may be vec).\n * @return {!goog.vec.vec3f.Type} return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.multVec3NoTranslate = function(mat, vec, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2];\n  resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8];\n  resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9];\n  resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10];\n  return resultVec;\n};\n\n\n/**\n * Transforms the given vector with the given matrix storing the resulting,\n * transformed vector into resultVec. The input vector is multiplied against the\n * full 4x4 matrix with the homogeneous divide applied to reduce the 4 element\n * vector to a 3 element vector.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix supplying the transformation.\n * @param {!goog.vec.vec3f.Type} vec The 3 element vector to transform.\n * @param {!goog.vec.vec3f.Type} resultVec The 3 element vector\n *     to receive the results (may be vec).\n * @return {!goog.vec.vec3f.Type} return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.multVec3Projective = function(mat, vec, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2];\n  var invw = 1 / (x * mat[3] + y * mat[7] + z * mat[11] + mat[15]);\n  resultVec[0] = (x * mat[0] + y * mat[4] + z * mat[8] + mat[12]) * invw;\n  resultVec[1] = (x * mat[1] + y * mat[5] + z * mat[9] + mat[13]) * invw;\n  resultVec[2] = (x * mat[2] + y * mat[6] + z * mat[10] + mat[14]) * invw;\n  return resultVec;\n};\n\n\n/**\n * Transforms the given vector with the given matrix storing the resulting,\n * transformed vector into resultVec.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix supplying the transformation.\n * @param {!goog.vec.vec4f.Type} vec The vector to transform.\n * @param {!goog.vec.vec4f.Type} resultVec The vector to\n *     receive the results (may be vec).\n * @return {!goog.vec.vec4f.Type} return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.multVec4 = function(mat, vec, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2], w = vec[3];\n  resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8] + w * mat[12];\n  resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9] + w * mat[13];\n  resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10] + w * mat[14];\n  resultVec[3] = x * mat[3] + y * mat[7] + z * mat[11] + w * mat[15];\n  return resultVec;\n};\n\n\n/**\n * Makes the given 4x4 matrix a translation matrix with x, y and z\n * translation factors.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} x The translation along the x axis.\n * @param {number} y The translation along the y axis.\n * @param {number} z The translation along the z axis.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.makeTranslate = function(mat, x, y, z) {\n  mat[0] = 1;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = 1;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = 1;\n  mat[11] = 0;\n  mat[12] = x;\n  mat[13] = y;\n  mat[14] = z;\n  mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix as a scale matrix with x, y and z scale factors.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} x The scale along the x axis.\n * @param {number} y The scale along the y axis.\n * @param {number} z The scale along the z axis.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.makeScale = function(mat, x, y, z) {\n  mat[0] = x;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = y;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = z;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix a rotation matrix with the given rotation\n * angle about the axis defined by the vector (ax, ay, az).\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @param {number} ax The x component of the rotation axis.\n * @param {number} ay The y component of the rotation axis.\n * @param {number} az The z component of the rotation axis.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.makeRotate = function(mat, angle, ax, ay, az) {\n  var c = Math.cos(angle);\n  var d = 1 - c;\n  var s = Math.sin(angle);\n\n  mat[0] = ax * ax * d + c;\n  mat[1] = ax * ay * d + az * s;\n  mat[2] = ax * az * d - ay * s;\n  mat[3] = 0;\n  mat[4] = ax * ay * d - az * s;\n  mat[5] = ay * ay * d + c;\n  mat[6] = ay * az * d + ax * s;\n  mat[7] = 0;\n  mat[8] = ax * az * d + ay * s;\n  mat[9] = ay * az * d - ax * s;\n  mat[10] = az * az * d + c;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix a rotation matrix with the given rotation\n * angle about the X axis.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.makeRotateX = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = 1;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = c;\n  mat[6] = s;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = -s;\n  mat[10] = c;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix a rotation matrix with the given rotation\n * angle about the Y axis.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.makeRotateY = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = c;\n  mat[1] = 0;\n  mat[2] = -s;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = 1;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = s;\n  mat[9] = 0;\n  mat[10] = c;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix a rotation matrix with the given rotation\n * angle about the Z axis.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.makeRotateZ = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = c;\n  mat[1] = s;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = -s;\n  mat[5] = c;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = 1;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n\n  return mat;\n};\n\n\n/**\n * Creates a matrix from a quaternion rotation and vector translation.\n *\n * This is a specialization of makeRotationTranslationScaleOrigin.\n *\n * This is equivalent to, but faster than:\n *     goog.vec.mat4f.makeIdentity(m);\n *     goog.vec.mat4f.translate(m, tx, ty, tz);\n *     goog.vec.mat4f.rotate(m, theta, rx, ry, rz);\n * and:\n *     goog.vec.Quaternion.toRotationMatrix4(rotation, mat);\n *     mat[12] = translation[0];\n *     mat[13] = translation[1];\n *     mat[14] = translation[2];\n * See http://jsperf.com/goog-vec-makerotationtranslation2 .\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {!goog.vec.Quaternion.AnyType} rotation The quaternion rotation.\n *     Note: this quaternion is assumed to already be normalized.\n * @param {!goog.vec.vec3f.Type} translation The vector translation.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.makeRotationTranslation = function(mat, rotation, translation) {\n  // Quaternion math\n  var x = rotation[0], y = rotation[1], z = rotation[2], w = rotation[3];\n  var x2 = 2 * x, y2 = 2 * y, z2 = 2 * z;\n  var xx = x * x2;\n  var xy = x * y2;\n  var xz = x * z2;\n  var yy = y * y2;\n  var yz = y * z2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n\n  mat[0] = 1 - (yy + zz);\n  mat[1] = xy + wz;\n  mat[2] = xz - wy;\n  mat[3] = 0;\n  mat[4] = xy - wz;\n  mat[5] = 1 - (xx + zz);\n  mat[6] = yz + wx;\n  mat[7] = 0;\n  mat[8] = xz + wy;\n  mat[9] = yz - wx;\n  mat[10] = 1 - (xx + yy);\n  mat[11] = 0;\n  mat[12] = translation[0];\n  mat[13] = translation[1];\n  mat[14] = translation[2];\n  mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation, and\n * vector scale.\n *\n * This is a specialization of makeRotationTranslationScaleOrigin.\n *\n * This is equivalent to, but faster than:\n *     goog.vec.mat4f.makeIdentity(m);\n *     goog.vec.mat4f.translate(m, tx, ty, tz);\n *     goog.vec.mat4f.rotate(m, theta, rx, ry, rz);\n *     goog.vec.mat4f.scale(m, sx, sy, sz);\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {!goog.vec.Quaternion.AnyType} rotation The quaternion rotation.\n *     Note: this quaternion is assumed to already be normalized.\n * @param {!goog.vec.vec3f.Type} translation The vector translation.\n * @param {!goog.vec.vec3f.Type} scale The vector scale.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.makeRotationTranslationScale = function(\n    mat, rotation, translation, scale) {\n  // Quaternion math\n  var x = rotation[0], y = rotation[1], z = rotation[2], w = rotation[3];\n  var x2 = 2 * x, y2 = 2 * y, z2 = 2 * z;\n  var xx = x * x2;\n  var xy = x * y2;\n  var xz = x * z2;\n  var yy = y * y2;\n  var yz = y * z2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n  var sx = scale[0];\n  var sy = scale[1];\n  var sz = scale[2];\n\n  mat[0] = (1 - (yy + zz)) * sx;\n  mat[1] = (xy + wz) * sx;\n  mat[2] = (xz - wy) * sx;\n  mat[3] = 0;\n  mat[4] = (xy - wz) * sy;\n  mat[5] = (1 - (xx + zz)) * sy;\n  mat[6] = (yz + wx) * sy;\n  mat[7] = 0;\n  mat[8] = (xz + wy) * sz;\n  mat[9] = (yz - wx) * sz;\n  mat[10] = (1 - (xx + yy)) * sz;\n  mat[11] = 0;\n  mat[12] = translation[0];\n  mat[13] = translation[1];\n  mat[14] = translation[2];\n  mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation, and\n * vector scale, rotating and scaling about the given origin.\n *\n * This is equivalent to, but faster than:\n *     goog.vec.mat4f.makeIdentity(m);\n *     goog.vec.mat4f.translate(m, tx, ty, tz);\n *     goog.vec.mat4f.translate(m, ox, oy, oz);\n *     goog.vec.mat4f.rotate(m, theta, rx, ry, rz);\n *     goog.vec.mat4f.scale(m, sx, sy, sz);\n *     goog.vec.mat4f.translate(m, -ox, -oy, -oz);\n * See http://jsperf.com/glmatrix-matrix-variant-test/3 for performance\n * results of a similar function in the glmatrix library.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {!goog.vec.Quaternion.AnyType} rotation The quaternion rotation.\n *     Note: this quaternion is assumed to already be normalized.\n * @param {!goog.vec.vec3f.Type} translation The vector translation.\n * @param {!goog.vec.vec3f.Type} scale The vector scale.\n * @param {!goog.vec.vec3f.Type} origin The origin about which to scale and\n *     rotate.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.makeRotationTranslationScaleOrigin = function(\n    mat, rotation, translation, scale, origin) {\n  // Quaternion math\n  var x = rotation[0], y = rotation[1], z = rotation[2], w = rotation[3];\n  var x2 = 2 * x, y2 = 2 * y, z2 = 2 * z;\n  var xx = x * x2;\n  var xy = x * y2;\n  var xz = x * z2;\n  var yy = y * y2;\n  var yz = y * z2;\n  var zz = z * z2;\n  var wx = w * x2;\n  var wy = w * y2;\n  var wz = w * z2;\n  var sx = scale[0];\n  var sy = scale[1];\n  var sz = scale[2];\n  var ox = origin[0];\n  var oy = origin[1];\n  var oz = origin[2];\n\n  mat[0] = (1 - (yy + zz)) * sx;\n  mat[1] = (xy + wz) * sx;\n  mat[2] = (xz - wy) * sx;\n  mat[3] = 0;\n  mat[4] = (xy - wz) * sy;\n  mat[5] = (1 - (xx + zz)) * sy;\n  mat[6] = (yz + wx) * sy;\n  mat[7] = 0;\n  mat[8] = (xz + wy) * sz;\n  mat[9] = (yz - wx) * sz;\n  mat[10] = (1 - (xx + yy)) * sz;\n  mat[11] = 0;\n  mat[12] = translation[0] + ox - (mat[0] * ox + mat[4] * oy + mat[8] * oz);\n  mat[13] = translation[1] + oy - (mat[1] * ox + mat[5] * oy + mat[9] * oz);\n  mat[14] = translation[2] + oz - (mat[2] * ox + mat[6] * oy + mat[10] * oz);\n  mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix a perspective projection matrix.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} left The coordinate of the left clipping plane.\n * @param {number} right The coordinate of the right clipping plane.\n * @param {number} bottom The coordinate of the bottom clipping plane.\n * @param {number} top The coordinate of the top clipping plane.\n * @param {number} near The distance to the near clipping plane.\n * @param {number} far The distance to the far clipping plane.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.makeFrustum = function(\n    mat, left, right, bottom, top, near, far) {\n  var x = (2 * near) / (right - left);\n  var y = (2 * near) / (top - bottom);\n  var a = (right + left) / (right - left);\n  var b = (top + bottom) / (top - bottom);\n  var c = -(far + near) / (far - near);\n  var d = -(2 * far * near) / (far - near);\n\n  mat[0] = x;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = y;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = a;\n  mat[9] = b;\n  mat[10] = c;\n  mat[11] = -1;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = d;\n  mat[15] = 0;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix  perspective projection matrix given a\n * field of view and aspect ratio.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} fovy The field of view along the y (vertical) axis in\n *     radians.\n * @param {number} aspect The x (width) to y (height) aspect ratio.\n * @param {number} near The distance to the near clipping plane.\n * @param {number} far The distance to the far clipping plane.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.makePerspective = function(mat, fovy, aspect, near, far) {\n  var angle = fovy / 2;\n  var dz = far - near;\n  var sinAngle = Math.sin(angle);\n  if (dz == 0 || sinAngle == 0 || aspect == 0) {\n    return mat;\n  }\n\n  var cot = Math.cos(angle) / sinAngle;\n\n  mat[0] = cot / aspect;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = cot;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = -(far + near) / dz;\n  mat[11] = -1;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = -(2 * near * far) / dz;\n  mat[15] = 0;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix an orthographic projection matrix.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} left The coordinate of the left clipping plane.\n * @param {number} right The coordinate of the right clipping plane.\n * @param {number} bottom The coordinate of the bottom clipping plane.\n * @param {number} top The coordinate of the top clipping plane.\n * @param {number} near The distance to the near clipping plane.\n * @param {number} far The distance to the far clipping plane.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.makeOrtho = function(mat, left, right, bottom, top, near, far) {\n  var x = 2 / (right - left);\n  var y = 2 / (top - bottom);\n  var z = -2 / (far - near);\n  var a = -(right + left) / (right - left);\n  var b = -(top + bottom) / (top - bottom);\n  var c = -(far + near) / (far - near);\n\n  mat[0] = x;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = y;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = z;\n  mat[11] = 0;\n  mat[12] = a;\n  mat[13] = b;\n  mat[14] = c;\n  mat[15] = 1;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix a modelview matrix of a camera so that\n * the camera is 'looking at' the given center point.\n *\n * Note that unlike most other goog.vec functions where we inline\n * everything, this function does not inline various goog.vec\n * functions.  This makes the code more readable, but somewhat\n * less efficient.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {!goog.vec.vec3f.Type} eyePt The position of the eye point\n *     (camera origin).\n * @param {!goog.vec.vec3f.Type} centerPt The point to aim the camera at.\n * @param {!goog.vec.vec3f.Type} worldUpVec The vector that identifies\n *     the up direction for the camera.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.makeLookAt = function(mat, eyePt, centerPt, worldUpVec) {\n  // Compute the direction vector from the eye point to the center point and\n  // normalize.\n  var fwdVec = goog.vec.mat4f.tmpvec4f_[0];\n  goog.vec.vec3f.subtract(centerPt, eyePt, fwdVec);\n  goog.vec.vec3f.normalize(fwdVec, fwdVec);\n  fwdVec[3] = 0;\n\n  // Compute the side vector from the forward vector and the input up vector.\n  var sideVec = goog.vec.mat4f.tmpvec4f_[1];\n  goog.vec.vec3f.cross(fwdVec, worldUpVec, sideVec);\n  goog.vec.vec3f.normalize(sideVec, sideVec);\n  sideVec[3] = 0;\n\n  // Now the up vector to form the orthonormal basis.\n  var upVec = goog.vec.mat4f.tmpvec4f_[2];\n  goog.vec.vec3f.cross(sideVec, fwdVec, upVec);\n  goog.vec.vec3f.normalize(upVec, upVec);\n  upVec[3] = 0;\n\n  // Update the view matrix with the new orthonormal basis and position the\n  // camera at the given eye point.\n  goog.vec.vec3f.negate(fwdVec, fwdVec);\n  goog.vec.mat4f.setRow(mat, 0, sideVec);\n  goog.vec.mat4f.setRow(mat, 1, upVec);\n  goog.vec.mat4f.setRow(mat, 2, fwdVec);\n  goog.vec.mat4f.setRowValues(mat, 3, 0, 0, 0, 1);\n  goog.vec.mat4f.translate(mat, -eyePt[0], -eyePt[1], -eyePt[2]);\n\n  return mat;\n};\n\n\n/**\n * Decomposes a matrix into the lookAt vectors eyePt, fwdVec and worldUpVec.\n * The matrix represents the modelview matrix of a camera. It is the inverse\n * of lookAt except for the output of the fwdVec instead of centerPt.\n * The centerPt itself cannot be recovered from a modelview matrix.\n *\n * Note that unlike most other goog.vec functions where we inline\n * everything, this function does not inline various goog.vec\n * functions.  This makes the code more readable, but somewhat\n * less efficient.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {!goog.vec.vec3f.Type} eyePt The position of the eye point\n *     (camera origin).\n * @param {!goog.vec.vec3f.Type} fwdVec The vector describing where\n *     the camera points to.\n * @param {!goog.vec.vec3f.Type} worldUpVec The vector that\n *     identifies the up direction for the camera.\n * @return {boolean} True if the method succeeds, false otherwise.\n *     The method can only fail if the inverse of viewMatrix is not defined.\n */\ngoog.vec.mat4f.toLookAt = function(mat, eyePt, fwdVec, worldUpVec) {\n  // Get eye of the camera.\n  var matInverse = goog.vec.mat4f.tmpmat4f_[0];\n  if (!goog.vec.mat4f.invert(mat, matInverse)) {\n    // The input matrix does not have a valid inverse.\n    return false;\n  }\n\n  if (eyePt) {\n    eyePt[0] = matInverse[12];\n    eyePt[1] = matInverse[13];\n    eyePt[2] = matInverse[14];\n  }\n\n  // Get forward vector from the definition of lookAt.\n  if (fwdVec || worldUpVec) {\n    if (!fwdVec) {\n      fwdVec = goog.vec.mat4f.tmpvec3f_[0];\n    }\n    fwdVec[0] = -mat[2];\n    fwdVec[1] = -mat[6];\n    fwdVec[2] = -mat[10];\n    // Normalize forward vector.\n    goog.vec.vec3f.normalize(fwdVec, fwdVec);\n  }\n\n  if (worldUpVec) {\n    // Get side vector from the definition of gluLookAt.\n    var side = goog.vec.mat4f.tmpvec3f_[1];\n    side[0] = mat[0];\n    side[1] = mat[4];\n    side[2] = mat[8];\n    // Compute up vector as a up = side x forward.\n    goog.vec.vec3f.cross(side, fwdVec, worldUpVec);\n    // Normalize up vector.\n    goog.vec.vec3f.normalize(worldUpVec, worldUpVec);\n  }\n  return true;\n};\n\n\n/**\n * Makes the given 4x4 matrix a rotation matrix given Euler angles using\n * the ZXZ convention.\n * Given the euler angles [theta1, theta2, theta3], the rotation is defined as\n * rotation = rotation_z(theta1) * rotation_x(theta2) * rotation_z(theta3),\n * with theta1 in [0, 2 * pi], theta2 in [0, pi] and theta3 in [0, 2 * pi].\n * rotation_x(theta) means rotation around the X axis of theta radians,\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} theta1 The angle of rotation around the Z axis in radians.\n * @param {number} theta2 The angle of rotation around the X axis in radians.\n * @param {number} theta3 The angle of rotation around the Z axis in radians.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.makeEulerZXZ = function(mat, theta1, theta2, theta3) {\n  var c1 = Math.cos(theta1);\n  var s1 = Math.sin(theta1);\n\n  var c2 = Math.cos(theta2);\n  var s2 = Math.sin(theta2);\n\n  var c3 = Math.cos(theta3);\n  var s3 = Math.sin(theta3);\n\n  mat[0] = c1 * c3 - c2 * s1 * s3;\n  mat[1] = c2 * c1 * s3 + c3 * s1;\n  mat[2] = s3 * s2;\n  mat[3] = 0;\n\n  mat[4] = -c1 * s3 - c3 * c2 * s1;\n  mat[5] = c1 * c2 * c3 - s1 * s3;\n  mat[6] = c3 * s2;\n  mat[7] = 0;\n\n  mat[8] = s2 * s1;\n  mat[9] = -c1 * s2;\n  mat[10] = c2;\n  mat[11] = 0;\n\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n\n  return mat;\n};\n\n\n/**\n * Decomposes a rotation matrix into Euler angles using the ZXZ convention so\n * that rotation = rotation_z(theta1) * rotation_x(theta2) * rotation_z(theta3),\n * with theta1 in [0, 2 * pi], theta2 in [0, pi] and theta3 in [0, 2 * pi].\n * rotation_x(theta) means rotation around the X axis of theta radians.\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {!goog.vec.vec3f.Type} euler The ZXZ Euler angles in\n *     radians as [theta1, theta2, theta3].\n * @param {boolean=} opt_theta2IsNegative Whether theta2 is in [-pi, 0] instead\n *     of the default [0, pi].\n * @return {!goog.vec.vec4f.Type} return euler so that operations can be\n *     chained together.\n */\ngoog.vec.mat4f.toEulerZXZ = function(mat, euler, opt_theta2IsNegative) {\n  // There is an ambiguity in the sign of sinTheta2 because of the sqrt.\n  var sinTheta2 = Math.sqrt(mat[2] * mat[2] + mat[6] * mat[6]);\n\n  // By default we explicitely constrain theta2 to be in [0, pi],\n  // so sinTheta2 is always positive. We can change the behavior and specify\n  // theta2 to be negative in [-pi, 0] with opt_Theta2IsNegative.\n  var signTheta2 = opt_theta2IsNegative ? -1 : 1;\n\n  if (sinTheta2 > goog.vec.EPSILON) {\n    euler[2] = Math.atan2(mat[2] * signTheta2, mat[6] * signTheta2);\n    euler[1] = Math.atan2(sinTheta2 * signTheta2, mat[10]);\n    euler[0] = Math.atan2(mat[8] * signTheta2, -mat[9] * signTheta2);\n  } else {\n    // There is also an arbitrary choice for theta1 = 0 or theta2 = 0 here.\n    // We assume theta1 = 0 as some applications do not allow the camera to roll\n    // (i.e. have theta1 != 0).\n    euler[0] = 0;\n    euler[1] = Math.atan2(sinTheta2 * signTheta2, mat[10]);\n    euler[2] = Math.atan2(mat[1], mat[0]);\n  }\n\n  // Atan2 outputs angles in [-pi, pi] so we bring them back to [0, 2 * pi].\n  euler[0] = (euler[0] + Math.PI * 2) % (Math.PI * 2);\n  euler[2] = (euler[2] + Math.PI * 2) % (Math.PI * 2);\n  // For theta2 we want the angle to be in [0, pi] or [-pi, 0] depending on\n  // signTheta2.\n  euler[1] =\n      ((euler[1] * signTheta2 + Math.PI * 2) % (Math.PI * 2)) * signTheta2;\n\n  return euler;\n};\n\n\n/**\n * Translates the given matrix by x,y,z.  Equvialent to:\n * goog.vec.mat4f.multMat(\n *     mat,\n *     goog.vec.mat4f.makeTranslate(goog.vec.mat4f.create(), x, y, z),\n *     mat);\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} x The translation along the x axis.\n * @param {number} y The translation along the y axis.\n * @param {number} z The translation along the z axis.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.translate = function(mat, x, y, z) {\n  mat[12] += mat[0] * x + mat[4] * y + mat[8] * z;\n  mat[13] += mat[1] * x + mat[5] * y + mat[9] * z;\n  mat[14] += mat[2] * x + mat[6] * y + mat[10] * z;\n  mat[15] += mat[3] * x + mat[7] * y + mat[11] * z;\n\n  return mat;\n};\n\n\n/**\n * Scales the given matrix by x,y,z.  Equivalent to:\n * goog.vec.mat4f.multMat(\n *     mat,\n *     goog.vec.mat4f.makeScale(goog.vec.mat4f.create(), x, y, z),\n *     mat);\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} x The x scale factor.\n * @param {number} y The y scale factor.\n * @param {number} z The z scale factor.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.scale = function(mat, x, y, z) {\n  mat[0] = mat[0] * x;\n  mat[1] = mat[1] * x;\n  mat[2] = mat[2] * x;\n  mat[3] = mat[3] * x;\n  mat[4] = mat[4] * y;\n  mat[5] = mat[5] * y;\n  mat[6] = mat[6] * y;\n  mat[7] = mat[7] * y;\n  mat[8] = mat[8] * z;\n  mat[9] = mat[9] * z;\n  mat[10] = mat[10] * z;\n  mat[11] = mat[11] * z;\n  mat[12] = mat[12];\n  mat[13] = mat[13];\n  mat[14] = mat[14];\n  mat[15] = mat[15];\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the x,y,z axis.  Equivalent to:\n * goog.vec.mat4f.multMat(\n *     mat,\n *     goog.vec.mat4f.makeRotate(goog.vec.mat4f.create(), angle, x, y, z),\n *     mat);\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @param {number} x The x component of the rotation axis.\n * @param {number} y The y component of the rotation axis.\n * @param {number} z The z component of the rotation axis.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.rotate = function(mat, angle, x, y, z) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];\n  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];\n  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];\n\n  var cosAngle = Math.cos(angle);\n  var sinAngle = Math.sin(angle);\n  var diffCosAngle = 1 - cosAngle;\n  var r00 = x * x * diffCosAngle + cosAngle;\n  var r10 = x * y * diffCosAngle + z * sinAngle;\n  var r20 = x * z * diffCosAngle - y * sinAngle;\n\n  var r01 = x * y * diffCosAngle - z * sinAngle;\n  var r11 = y * y * diffCosAngle + cosAngle;\n  var r21 = y * z * diffCosAngle + x * sinAngle;\n\n  var r02 = x * z * diffCosAngle + y * sinAngle;\n  var r12 = y * z * diffCosAngle - x * sinAngle;\n  var r22 = z * z * diffCosAngle + cosAngle;\n\n  mat[0] = m00 * r00 + m01 * r10 + m02 * r20;\n  mat[1] = m10 * r00 + m11 * r10 + m12 * r20;\n  mat[2] = m20 * r00 + m21 * r10 + m22 * r20;\n  mat[3] = m30 * r00 + m31 * r10 + m32 * r20;\n  mat[4] = m00 * r01 + m01 * r11 + m02 * r21;\n  mat[5] = m10 * r01 + m11 * r11 + m12 * r21;\n  mat[6] = m20 * r01 + m21 * r11 + m22 * r21;\n  mat[7] = m30 * r01 + m31 * r11 + m32 * r21;\n  mat[8] = m00 * r02 + m01 * r12 + m02 * r22;\n  mat[9] = m10 * r02 + m11 * r12 + m12 * r22;\n  mat[10] = m20 * r02 + m21 * r12 + m22 * r22;\n  mat[11] = m30 * r02 + m31 * r12 + m32 * r22;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the x axis.  Equivalent to:\n * goog.vec.mat4f.multMat(\n *     mat,\n *     goog.vec.mat4f.makeRotateX(goog.vec.mat4f.create(), angle),\n *     mat);\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.rotateX = function(mat, angle) {\n  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];\n  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[4] = m01 * c + m02 * s;\n  mat[5] = m11 * c + m12 * s;\n  mat[6] = m21 * c + m22 * s;\n  mat[7] = m31 * c + m32 * s;\n  mat[8] = m01 * -s + m02 * c;\n  mat[9] = m11 * -s + m12 * c;\n  mat[10] = m21 * -s + m22 * c;\n  mat[11] = m31 * -s + m32 * c;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the y axis.  Equivalent to:\n * goog.vec.mat4f.multMat(\n *     mat,\n *     goog.vec.mat4f.makeRotateY(goog.vec.mat4f.create(), angle),\n *     mat);\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.rotateY = function(mat, angle) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];\n  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = m00 * c + m02 * -s;\n  mat[1] = m10 * c + m12 * -s;\n  mat[2] = m20 * c + m22 * -s;\n  mat[3] = m30 * c + m32 * -s;\n  mat[8] = m00 * s + m02 * c;\n  mat[9] = m10 * s + m12 * c;\n  mat[10] = m20 * s + m22 * c;\n  mat[11] = m30 * s + m32 * c;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the z axis.  Equivalent to:\n * goog.vec.mat4f.multMat(\n *     mat,\n *     goog.vec.mat4f.makeRotateZ(goog.vec.mat4f.create(), angle),\n *     mat);\n *\n * @param {!goog.vec.mat4f.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {!goog.vec.mat4f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.rotateZ = function(mat, angle) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];\n  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = m00 * c + m01 * s;\n  mat[1] = m10 * c + m11 * s;\n  mat[2] = m20 * c + m21 * s;\n  mat[3] = m30 * c + m31 * s;\n  mat[4] = m00 * -s + m01 * c;\n  mat[5] = m10 * -s + m11 * c;\n  mat[6] = m20 * -s + m21 * c;\n  mat[7] = m30 * -s + m31 * c;\n\n  return mat;\n};\n\n\n/**\n * Retrieves the translation component of the transformation matrix.\n *\n * @param {!goog.vec.mat4f.Type} mat The transformation matrix.\n * @param {!goog.vec.vec3f.Type} translation The vector for storing the\n *     result.\n * @return {!goog.vec.vec3f.Type} return translation so that operations can be\n *     chained.\n */\ngoog.vec.mat4f.getTranslation = function(mat, translation) {\n  translation[0] = mat[12];\n  translation[1] = mat[13];\n  translation[2] = mat[14];\n  return translation;\n};\n\n\n/**\n * @type {Array<goog.vec.vec3f.Type>}\n * @private\n */\ngoog.vec.mat4f.tmpvec3f_ = [goog.vec.vec3f.create(), goog.vec.vec3f.create()];\n\n\n/**\n * @type {Array<goog.vec.vec4f.Type>}\n * @private\n */\ngoog.vec.mat4f.tmpvec4f_ =\n    [goog.vec.vec4f.create(), goog.vec.vec4f.create(), goog.vec.vec4f.create()];\n\n\n/**\n * @type {Array<goog.vec.mat4f.Type>}\n * @private\n */\ngoog.vec.mat4f.tmpmat4f_ = [goog.vec.mat4f.create()];\n","^9I",1579837703000,"^9J",["^9K",["^;2","^9>","^=8","^R[","~$goog.vec.vec4f"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/mat4f.js"],"^:1",["^9K",["~$goog.vec.mat4f","~$goog.vec.mat4f.Type"]],"^9<",true,"^9=",["^9>","^;2","^=8","^R[","^TH"]],["^ ","^9A",[1579837703000],"^9B","goog.useragent.flash.js","^9C",["^9D","goog/useragent/flash.js"],"^9E","goog/useragent/flash.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Flash detection.\n * @see ../demos/useragent.html\n */\n\ngoog.provide('goog.userAgent.flash');\n\ngoog.require('goog.string');\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the browser doesn't\n * have flash.\n */\ngoog.userAgent.flash.ASSUME_NO_FLASH =\n    goog.define('goog.userAgent.flash.ASSUME_NO_FLASH', false);\n\n\n/**\n * Whether we can detect that the browser has flash\n * @type {boolean}\n * @private\n */\ngoog.userAgent.flash.detectedFlash_ = false;\n\n\n/**\n * Full version information of flash installed, in form 7.0.61\n * @type {string}\n * @private\n */\ngoog.userAgent.flash.detectedFlashVersion_ = '';\n\n\n/**\n * Initializer for goog.userAgent.flash\n *\n * This is a named function so that it can be stripped via the jscompiler if\n * goog.userAgent.flash.ASSUME_NO_FLASH is true.\n * @private\n */\ngoog.userAgent.flash.init_ = function() {\n  if (navigator.plugins && navigator.plugins.length) {\n    var plugin = navigator.plugins['Shockwave Flash'];\n    if (plugin) {\n      goog.userAgent.flash.detectedFlash_ = true;\n      if (plugin.description) {\n        goog.userAgent.flash.detectedFlashVersion_ =\n            goog.userAgent.flash.getVersion_(plugin.description);\n        return;\n      }\n    }\n\n    if (navigator.plugins['Shockwave Flash 2.0']) {\n      goog.userAgent.flash.detectedFlash_ = true;\n      goog.userAgent.flash.detectedFlashVersion_ = '2.0.0.11';\n      return;\n    }\n  }\n\n  if (navigator.mimeTypes && navigator.mimeTypes.length) {\n    var mimeType = navigator.mimeTypes['application/x-shockwave-flash'];\n    goog.userAgent.flash.detectedFlash_ =\n        !!(mimeType && mimeType.enabledPlugin);\n    if (goog.userAgent.flash.detectedFlash_) {\n      goog.userAgent.flash.detectedFlashVersion_ =\n          goog.userAgent.flash.getVersion_(mimeType.enabledPlugin.description);\n      return;\n    }\n  }\n\n  if (typeof ActiveXObject != 'undefined') {\n    try {\n      // Try 7 first, since we know we can use GetVariable with it\n      var ax = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.7');\n      goog.userAgent.flash.detectedFlash_ = true;\n      goog.userAgent.flash.detectedFlashVersion_ =\n          goog.userAgent.flash.getVersion_(ax.GetVariable('$version'));\n      return;\n    } catch (e) {\n      /* Fall through */\n    }\n\n    // Try 6 next, some versions are known to crash with GetVariable calls\n\n    try {\n      var ax = new ActiveXObject('ShockwaveFlash.ShockwaveFlash.6');\n      goog.userAgent.flash.detectedFlash_ = true;\n      // First public version of Flash 6\n      goog.userAgent.flash.detectedFlashVersion_ = '6.0.21';\n      return;\n    } catch (e) {\n      /* Fall through */\n    }\n\n\n    try {\n      // Try the default activeX\n      var ax = new ActiveXObject('ShockwaveFlash.ShockwaveFlash');\n      goog.userAgent.flash.detectedFlash_ = true;\n      goog.userAgent.flash.detectedFlashVersion_ =\n          goog.userAgent.flash.getVersion_(ax.GetVariable('$version'));\n      return;\n    } catch (e) {\n      // No flash\n    }\n  }\n};\n\n\n/**\n * Derived from Apple's suggested sniffer.\n * @param {string} desc e.g. Shockwave Flash 7.0 r61.\n * @return {string} 7.0.61.\n * @private\n */\ngoog.userAgent.flash.getVersion_ = function(desc) {\n  var matches = desc.match(/[\\d]+/g);\n  if (!matches) {\n    return '';\n  }\n  matches.length = 3;  // To standardize IE vs FF\n  return matches.join('.');\n};\n\n\nif (!goog.userAgent.flash.ASSUME_NO_FLASH) {\n  goog.userAgent.flash.init_();\n}\n\n\n/**\n * Whether we can detect that the browser has flash\n * @type {boolean}\n */\ngoog.userAgent.flash.HAS_FLASH = goog.userAgent.flash.detectedFlash_;\n\n\n/**\n * Full version information of flash installed, in form 7.0.61\n * @type {string}\n */\ngoog.userAgent.flash.VERSION = goog.userAgent.flash.detectedFlashVersion_;\n\n\n/**\n * Whether the installed flash version is as new or newer than a given version.\n * @param {string} version The version to check.\n * @return {boolean} Whether the installed flash version is as new or newer\n *     than a given version.\n */\ngoog.userAgent.flash.isVersion = function(version) {\n  return goog.string.compareVersions(goog.userAgent.flash.VERSION, version) >=\n      0;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9L","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/useragent/flash.js"],"^:1",["^9K",["~$goog.userAgent.flash"]],"^9<",true,"^9=",["^9>","^9L"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.bidiinput.js","^9C",["^9D","goog/ui/bidiinput.js"],"^9E","goog/ui/bidiinput.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Component for an input field with bidi direction automatic\n * detection. The input element directionality is automatically set according\n * to the contents (value) of the element.\n *\n * @see ../demos/bidiinput.html\n */\n\n\ngoog.provide('goog.ui.BidiInput');\n\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events');\ngoog.require('goog.events.InputHandler');\ngoog.require('goog.i18n.bidi');\ngoog.require('goog.ui.Component');\n\n\n\n/**\n * Default implementation of BidiInput.\n *\n * @param {goog.dom.DomHelper=} opt_domHelper  Optional DOM helper.\n * @constructor\n * @extends {goog.ui.Component}\n */\ngoog.ui.BidiInput = function(opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n};\ngoog.inherits(goog.ui.BidiInput, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.BidiInput);\n\n\n/**\n * The input handler that provides the input event.\n * @type {goog.events.InputHandler?}\n * @private\n */\ngoog.ui.BidiInput.prototype.inputHandler_ = null;\n\n\n/**\n * Decorates the given HTML element as a BidiInput. The HTML element can be an\n * input element with type='text', a textarea element, or any contenteditable.\n * Overrides {@link goog.ui.Component#decorateInternal}.  Considered protected.\n * @param {Element} element  Element to decorate.\n * @protected\n * @override\n */\ngoog.ui.BidiInput.prototype.decorateInternal = function(element) {\n  goog.ui.BidiInput.superClass_.decorateInternal.call(this, element);\n  this.init_();\n};\n\n\n/**\n * Creates the element for the text input.\n * @protected\n * @override\n */\ngoog.ui.BidiInput.prototype.createDom = function() {\n  this.setElementInternal(\n      this.getDomHelper().createDom(\n          goog.dom.TagName.INPUT, {'type': goog.dom.InputType.TEXT}));\n  this.init_();\n};\n\n\n/**\n * Initializes the events and initial text direction.\n * Called from either decorate or createDom, after the input field has\n * been created.\n * @private\n */\ngoog.ui.BidiInput.prototype.init_ = function() {\n  // Set initial direction by current text\n  this.setDirection_();\n\n  // Listen to value change events\n  this.inputHandler_ = new goog.events.InputHandler(this.getElement());\n  goog.events.listen(\n      this.inputHandler_, goog.events.InputHandler.EventType.INPUT,\n      this.setDirection_, false, this);\n};\n\n\n/**\n * Set the direction of the input element based on the current value. If the\n * value does not have any strongly directional characters, remove the dir\n * attribute so that the direction is inherited instead.\n * This method is called when the user changes the input element value, or\n * when a program changes the value using\n * {@link goog.ui.BidiInput#setValue}\n * @private\n */\ngoog.ui.BidiInput.prototype.setDirection_ = function() {\n  var element = this.getElement();\n  if (element) {\n    var text = this.getValue();\n    goog.i18n.bidi.setElementDirByTextDirectionality(element, text);\n  }\n};\n\n\n/**\n * Returns the direction of the input element.\n * @return {?string} Return 'rtl' for right-to-left text,\n *     'ltr' for left-to-right text, or null if the value itself is not\n *     enough to determine directionality (e.g. an empty value), and the\n *     direction is inherited from a parent element (typically the body\n *     element).\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.BidiInput.prototype.getDirection = function() {\n  var dir = this.getElement().dir;\n  if (dir == '') {\n    dir = null;\n  }\n  return dir;\n};\n\n\n/**\n * Sets the value of the underlying input field, and sets the direction\n * according to the given value.\n * @param {string} value  The Value to set in the underlying input field.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.BidiInput.prototype.setValue = function(value) {\n  var element = this.getElement();\n  if (element.value != null) {\n    element.value = value;\n  } else {\n    goog.dom.setTextContent(element, value);\n  }\n  this.setDirection_();\n};\n\n\n/**\n * Returns the value of the underlying input field.\n * @return {string} Value of the underlying input field.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.BidiInput.prototype.getValue = function() {\n  var element = this.getElement();\n  return element.value != null ? element.value :\n                                 goog.dom.getRawTextContent(element);\n};\n\n\n/** @override */\ngoog.ui.BidiInput.prototype.disposeInternal = function() {\n  if (this.inputHandler_) {\n    goog.events.removeAll(this.inputHandler_);\n    this.inputHandler_.dispose();\n    this.inputHandler_ = null;\n  }\n  goog.ui.BidiInput.base(this, 'disposeInternal');\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","^:=","^GL","^9>","~$goog.i18n.bidi","~$goog.events.InputHandler","^:N","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/bidiinput.js"],"^:1",["^9K",["~$goog.ui.BidiInput"]],"^9<",true,"^9=",["^9>","^;;","^GL","^;=","^:N","^TM","^TL","^:="]],["^ ","^9A",[1579837703000],"^9B","goog.graphics.imageelement.js","^9C",["^9D","goog/graphics/imageelement.js"],"^9E","goog/graphics/imageelement.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A thin wrapper around the DOM element for images.\n */\n\n\ngoog.provide('goog.graphics.ImageElement');\n\ngoog.require('goog.graphics.Element');\n\n\n\n/**\n * Interface for a graphics image element.\n * You should not construct objects from this constructor. Instead,\n * you should use `goog.graphics.Graphics.drawImage` and it\n * will return an implementation of this interface for you.\n *\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.AbstractGraphics} graphics The graphics creating\n *     this element.\n * @constructor\n * @extends {goog.graphics.Element}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n */\ngoog.graphics.ImageElement = function(element, graphics) {\n  goog.graphics.Element.call(this, element, graphics);\n};\ngoog.inherits(goog.graphics.ImageElement, goog.graphics.Element);\n\n\n/**\n * Update the position of the image.\n *\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n */\ngoog.graphics.ImageElement.prototype.setPosition = goog.abstractMethod;\n\n\n/**\n * Update the size of the image.\n *\n * @param {number} width Width of image.\n * @param {number} height Height of image.\n */\ngoog.graphics.ImageElement.prototype.setSize = goog.abstractMethod;\n\n\n/**\n * Update the source of the image.\n * @param {string} src Source of the image.\n */\ngoog.graphics.ImageElement.prototype.setSource = goog.abstractMethod;\n","^9I",1579837703000,"^9J",["^9K",["^9>","^;@"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/imageelement.js"],"^:1",["^9K",["^@@"]],"^9<",true,"^9=",["^9>","^;@"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.expectedfailures.js","^9C",["^9D","goog/testing/expectedfailures.js"],"^9E","goog/testing/expectedfailures.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Helper class to allow for expected unit test failures.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.setTestOnly('goog.testing.ExpectedFailures');\ngoog.provide('goog.testing.ExpectedFailures');\n\ngoog.require('goog.asserts');\ngoog.require('goog.debug.DivConsole');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.log');\ngoog.require('goog.style');\ngoog.require('goog.testing.JsUnitException');\ngoog.require('goog.testing.TestCase');\ngoog.require('goog.testing.asserts');\n\n\n\n/**\n * Helper class for allowing some unit tests to fail, particularly designed to\n * mark tests that should be fixed on a given browser.\n *\n * <pre>\n * var expectedFailures = new goog.testing.ExpectedFailures();\n *\n * function tearDown() {\n *   expectedFailures.handleTearDown();\n * }\n *\n * function testSomethingThatBreaksInWebKit() {\n *   expectedFailures.expectFailureFor(goog.userAgent.WEBKIT);\n *\n *   try {\n *     ...\n *     assert(somethingThatFailsInWebKit);\n *     ...\n *   } catch (e) {\n *     expectedFailures.handleException(e);\n *   }\n * }\n * </pre>\n *\n * @constructor\n * @final\n */\ngoog.testing.ExpectedFailures = function() {\n  goog.testing.ExpectedFailures.setUpConsole_();\n  this.reset_();\n};\n\n\n/**\n * The lazily created debugging console.\n * @type {goog.debug.DivConsole?}\n * @private\n */\ngoog.testing.ExpectedFailures.console_ = null;\n\n\n/**\n * Logger for the expected failures.\n * @type {goog.log.Logger}\n * @private\n */\ngoog.testing.ExpectedFailures.prototype.logger_ =\n    goog.log.getLogger('goog.testing.ExpectedFailures');\n\n\n/**\n * Whether or not we are expecting failure.\n * @type {boolean}\n * @private\n */\ngoog.testing.ExpectedFailures.prototype.expectingFailure_;\n\n\n/**\n * The string to emit upon an expected failure.\n * @type {string}\n * @private\n */\ngoog.testing.ExpectedFailures.prototype.failureMessage_;\n\n\n/**\n * An array of suppressed failures.\n * @type {Array<!Error>}\n * @private\n */\ngoog.testing.ExpectedFailures.prototype.suppressedFailures_;\n\n\n/**\n * Sets up the debug console, if it isn't already set up.\n * @private\n */\ngoog.testing.ExpectedFailures.setUpConsole_ = function() {\n  if (!goog.testing.ExpectedFailures.console_) {\n    var xButton = goog.dom.createDom(\n        goog.dom.TagName.DIV, {\n          'style': 'position: absolute; border-left:1px solid #333;' +\n              'border-bottom:1px solid #333; right: 0; top: 0; width: 1em;' +\n              'height: 1em; cursor: pointer; background-color: #cde;' +\n              'text-align: center; color: black'\n        },\n        'X');\n    var div = goog.dom.createDom(\n        goog.dom.TagName.DIV, {\n          'style': 'position: absolute; border: 1px solid #333; right: 10px;' +\n              'top : 10px; width: 400px; display: none'\n        },\n        xButton);\n    document.body.appendChild(div);\n    goog.events.listen(xButton, goog.events.EventType.CLICK, function() {\n      goog.style.setElementShown(div, false);\n    });\n\n    goog.testing.ExpectedFailures.console_ = new goog.debug.DivConsole(div);\n    goog.log.addHandler(\n        goog.testing.ExpectedFailures.prototype.logger_,\n        goog.bind(goog.style.setElementShown, null, div, true));\n    goog.log.addHandler(\n        goog.testing.ExpectedFailures.prototype.logger_,\n        goog.bind(\n            goog.testing.ExpectedFailures.console_.addLogRecord,\n            goog.testing.ExpectedFailures.console_));\n  }\n};\n\n\n/**\n * Register to expect failure for the given condition.  Multiple calls to this\n * function act as a boolean OR.  The first applicable message will be used.\n * @param {boolean} condition Whether to expect failure.\n * @param {string=} opt_message Descriptive message of this expected failure.\n */\ngoog.testing.ExpectedFailures.prototype.expectFailureFor = function(\n    condition, opt_message) {\n  this.expectingFailure_ = this.expectingFailure_ || condition;\n  if (condition) {\n    this.failureMessage_ = this.failureMessage_ || opt_message || '';\n  }\n};\n\n\n/**\n * Determines if the given exception was expected.\n * @param {Object} ex The exception to check.\n * @return {boolean} Whether the exception was expected.\n */\ngoog.testing.ExpectedFailures.prototype.isExceptionExpected = function(ex) {\n  return this.expectingFailure_ && ex instanceof goog.testing.JsUnitException;\n};\n\n\n/**\n * Handle an exception, suppressing it if it is a unit test failure that we\n * expected.\n * @param {Error} ex The exception to handle.\n */\ngoog.testing.ExpectedFailures.prototype.handleException = function(ex) {\n  if (this.isExceptionExpected(ex)) {\n    goog.asserts.assertInstanceof(ex, goog.testing.JsUnitException);\n    goog.log.info(\n        this.logger_, 'Suppressing test failure in ' +\n            goog.testing.TestCase.currentTestName + ':' +\n            (this.failureMessage_ ? '\\n(' + this.failureMessage_ + ')' : ''),\n        ex);\n    this.suppressedFailures_.push(ex);\n    goog.testing.TestCase.invalidateAssertionException(ex);\n    return;\n  }\n\n  // Rethrow the exception if we weren't expecting it or if it is a normal\n  // exception.\n  throw ex;\n};\n\n\n/**\n * Run the given function, catching any expected failures.\n * @param {Function} func The function to run.\n * @param {boolean=} opt_lenient Whether to ignore if the expected failures\n *     didn't occur.  In this case a warning will be logged in handleTearDown.\n */\ngoog.testing.ExpectedFailures.prototype.run = function(func, opt_lenient) {\n  try {\n    func();\n  } catch (ex) {\n    this.handleException(ex);\n  }\n\n  if (!opt_lenient && this.expectingFailure_ &&\n      !this.suppressedFailures_.length) {\n    fail(this.getExpectationMessage_());\n  }\n};\n\n\n/**\n * @return {string} A warning describing an expected failure that didn't occur.\n * @private\n */\ngoog.testing.ExpectedFailures.prototype.getExpectationMessage_ = function() {\n  return 'Expected a test failure in \\'' +\n      goog.testing.TestCase.currentTestName + '\\' but the test passed.';\n};\n\n\n/**\n * Handle the tearDown phase of a test, alerting the user if an expected test\n * was not suppressed.\n */\ngoog.testing.ExpectedFailures.prototype.handleTearDown = function() {\n  if (this.expectingFailure_ && !this.suppressedFailures_.length) {\n    goog.log.warning(this.logger_, this.getExpectationMessage_());\n  }\n  this.reset_();\n};\n\n\n/**\n * Reset internal state.\n * @private\n */\ngoog.testing.ExpectedFailures.prototype.reset_ = function() {\n  this.expectingFailure_ = false;\n  this.failureMessage_ = '';\n  this.suppressedFailures_ = [];\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^>X","~$goog.testing.JsUnitException","^9>","~$goog.debug.DivConsole","^;Q","^:I","^RT","^<3","^:N","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/expectedfailures.js"],"^:1",["^9K",["~$goog.testing.ExpectedFailures"]],"^9<",true,"^9=",["^9>","^:E","^TP","^;;","^;=","^:N","^:I","^;Q","^<3","^TO","^RT","^>X"]],["^ ","^9A",[1579837703000],"^9B","goog.messaging.multichannel.js","^9C",["^9D","goog/messaging/multichannel.js"],"^9E","goog/messaging/multichannel.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of goog.messaging.MultiChannel, which uses a\n * single underlying MessageChannel to carry several independent virtual message\n * channels.\n *\n */\n\n\ngoog.provide('goog.messaging.MultiChannel');\ngoog.provide('goog.messaging.MultiChannel.VirtualChannel');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.log');\ngoog.require('goog.messaging.MessageChannel');  // interface\ngoog.require('goog.object');\n\n\n\n/**\n * Creates a new MultiChannel wrapping a single MessageChannel. The\n * underlying channel shouldn't have any other listeners registered, but it\n * should be connected.\n *\n * Note that the other side of the channel should also be connected to a\n * MultiChannel with the same number of virtual channels.\n *\n * @param {goog.messaging.MessageChannel} underlyingChannel The underlying\n *     channel to use as transport for the virtual channels.\n * @constructor\n * @extends {goog.Disposable}\n * @final\n */\ngoog.messaging.MultiChannel = function(underlyingChannel) {\n  goog.messaging.MultiChannel.base(this, 'constructor');\n\n  /**\n   * The underlying channel across which all requests are sent.\n   * @type {goog.messaging.MessageChannel}\n   * @private\n   */\n  this.underlyingChannel_ = underlyingChannel;\n\n  /**\n   * All the virtual channels that are registered for this MultiChannel.\n   * These are null if they've been disposed.\n   * @type {Object<?goog.messaging.MultiChannel.VirtualChannel>}\n   * @private\n   */\n  this.virtualChannels_ = {};\n\n  this.underlyingChannel_.registerDefaultService(\n      goog.bind(this.handleDefault_, this));\n};\ngoog.inherits(goog.messaging.MultiChannel, goog.Disposable);\n\n\n/**\n * Logger object for goog.messaging.MultiChannel.\n * @type {goog.log.Logger}\n * @private\n */\ngoog.messaging.MultiChannel.prototype.logger_ =\n    goog.log.getLogger('goog.messaging.MultiChannel');\n\n\n/**\n * Creates a new virtual channel that will communicate across the underlying\n * channel.\n * @param {string} name The name of the virtual channel. Must be unique for this\n *     MultiChannel. Cannot contain colons.\n * @return {!goog.messaging.MultiChannel.VirtualChannel} The new virtual\n *     channel.\n */\ngoog.messaging.MultiChannel.prototype.createVirtualChannel = function(name) {\n  if (name.indexOf(':') != -1) {\n    throw new Error(\n        'Virtual channel name \"' + name + '\" should not contain colons');\n  }\n\n  if (name in this.virtualChannels_) {\n    throw new Error(\n        'Virtual channel \"' + name + '\" was already created for ' +\n        'this multichannel.');\n  }\n\n  var channel = new goog.messaging.MultiChannel.VirtualChannel(this, name);\n  this.virtualChannels_[name] = channel;\n  return channel;\n};\n\n\n/**\n * Handles the default service for the underlying channel. This dispatches any\n * unrecognized services to the appropriate virtual channel.\n *\n * @param {string} serviceName The name of the service being called.\n * @param {string|!Object} payload The message payload.\n * @private\n */\ngoog.messaging.MultiChannel.prototype.handleDefault_ = function(\n    serviceName, payload) {\n  var match = serviceName.match(/^([^:]*):(.*)/);\n  if (!match) {\n    goog.log.warning(\n        this.logger_, 'Invalid service name \"' + serviceName + '\": no ' +\n            'virtual channel specified');\n    return;\n  }\n\n  var channelName = match[1];\n  serviceName = match[2];\n  if (!(channelName in this.virtualChannels_)) {\n    goog.log.warning(\n        this.logger_, 'Virtual channel \"' + channelName + ' does not ' +\n            'exist, but a message was received for it: \"' + serviceName + '\"');\n    return;\n  }\n\n  var virtualChannel = this.virtualChannels_[channelName];\n  if (!virtualChannel) {\n    goog.log.warning(\n        this.logger_, 'Virtual channel \"' + channelName + ' has been ' +\n            'disposed, but a message was received for it: \"' + serviceName +\n            '\"');\n    return;\n  }\n\n  if (!virtualChannel.defaultService_) {\n    goog.log.warning(\n        this.logger_, 'Service \"' + serviceName + '\" is not registered ' +\n            'on virtual channel \"' + channelName + '\"');\n    return;\n  }\n\n  virtualChannel.defaultService_(serviceName, payload);\n};\n\n\n/** @override */\ngoog.messaging.MultiChannel.prototype.disposeInternal = function() {\n  goog.object.forEach(\n      this.virtualChannels_, function(channel) { goog.dispose(channel); });\n  goog.dispose(this.underlyingChannel_);\n  delete this.virtualChannels_;\n  delete this.underlyingChannel_;\n};\n\n\n\n/**\n * A message channel that proxies its messages over another underlying channel.\n *\n * @param {goog.messaging.MultiChannel} parent The MultiChannel\n *     which created this channel, and which contains the underlying\n *     MessageChannel that's used as the transport.\n * @param {string} name The name of this virtual channel. Unique among the\n *     virtual channels in parent.\n * @constructor\n * @implements {goog.messaging.MessageChannel}\n * @extends {goog.Disposable}\n * @final\n */\ngoog.messaging.MultiChannel.VirtualChannel = function(parent, name) {\n  goog.messaging.MultiChannel.VirtualChannel.base(this, 'constructor');\n\n  /**\n   * The MultiChannel containing the underlying transport channel.\n   * @type {goog.messaging.MultiChannel}\n   * @private\n   */\n  this.parent_ = parent;\n\n  /**\n   * The name of this virtual channel.\n   * @type {string}\n   * @private\n   */\n  this.name_ = name;\n};\ngoog.inherits(goog.messaging.MultiChannel.VirtualChannel, goog.Disposable);\n\n\n/**\n * The default service to run if no other services match.\n * @type {?function(string, (string|!Object))}\n * @private\n */\ngoog.messaging.MultiChannel.VirtualChannel.prototype.defaultService_;\n\n\n/**\n * Logger object for goog.messaging.MultiChannel.VirtualChannel.\n * @type {goog.log.Logger}\n * @private\n */\ngoog.messaging.MultiChannel.VirtualChannel.prototype.logger_ =\n    goog.log.getLogger('goog.messaging.MultiChannel.VirtualChannel');\n\n\n/**\n * This is a no-op, since the underlying channel is expected to already be\n * initialized when it's passed in.\n *\n * @override\n */\ngoog.messaging.MultiChannel.VirtualChannel.prototype.connect = function(\n    opt_connectCb) {\n  if (opt_connectCb) {\n    opt_connectCb();\n  }\n};\n\n\n/**\n * This always returns true, since the underlying channel is expected to already\n * be initialized when it's passed in.\n *\n * @override\n */\ngoog.messaging.MultiChannel.VirtualChannel.prototype.isConnected = function() {\n  return true;\n};\n\n\n/**\n * @override\n */\ngoog.messaging.MultiChannel.VirtualChannel.prototype.registerService = function(\n    serviceName, callback, opt_objectPayload) {\n  this.parent_.underlyingChannel_.registerService(\n      this.name_ + ':' + serviceName,\n      goog.bind(this.doCallback_, this, callback), opt_objectPayload);\n};\n\n\n/**\n * @override\n */\ngoog.messaging.MultiChannel.VirtualChannel.prototype.registerDefaultService =\n    function(callback) {\n  this.defaultService_ = goog.bind(this.doCallback_, this, callback);\n};\n\n\n/**\n * @override\n */\ngoog.messaging.MultiChannel.VirtualChannel.prototype.send = function(\n    serviceName, payload) {\n  if (this.isDisposed()) {\n    throw new Error('#send called for disposed VirtualChannel.');\n  }\n\n  this.parent_.underlyingChannel_.send(this.name_ + ':' + serviceName, payload);\n};\n\n\n/**\n * Wraps a callback with a function that will log a warning and abort if it's\n * called when this channel is disposed.\n *\n * @param {!Function} callback The callback to wrap.\n * @param {...*} var_args Other arguments, passed to the callback.\n * @private\n */\ngoog.messaging.MultiChannel.VirtualChannel.prototype.doCallback_ = function(\n    callback, var_args) {\n  if (this.isDisposed()) {\n    goog.log.warning(\n        this.logger_, 'Virtual channel \"' + this.name_ + '\" received ' +\n            ' a message after being disposed.');\n    return;\n  }\n\n  callback.apply({}, Array.prototype.slice.call(arguments, 1));\n};\n\n\n/** @override */\ngoog.messaging.MultiChannel.VirtualChannel.prototype.disposeInternal =\n    function() {\n  this.parent_.virtualChannels_[this.name_] = null;\n  this.parent_ = null;\n};\n","^9I",1579837703000,"^9J",["^9K",["^IG","^9>","^;P","^;Q","^:7"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/multichannel.js"],"^:1",["^9K",["~$goog.messaging.MultiChannel.VirtualChannel","~$goog.messaging.MultiChannel"]],"^9<",true,"^9=",["^9>","^:7","^;Q","^IG","^;P"]],["^ ","^9A",[1579837703000],"^9B","goog.date.datelike.js","^9C",["^9D","goog/date/datelike.js"],"^9E","goog/date/datelike.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Typedefs for working with dates.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.provide('goog.date.DateLike');\n\ngoog.forwardDeclare('goog.date.Date');  // circular reference\n\n\n/**\n * @typedef {(Date|goog.date.Date)}\n */\ngoog.date.DateLike;\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/date/datelike.js"],"^:1",["^9K",["~$goog.date.DateLike"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.events.onlinehandler.js","^9C",["^9D","goog/testing/events/onlinehandler.js"],"^9E","goog/testing/events/onlinehandler.js","^9F","^9G","^9H","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview NetworkStatusMonitor test double.\n * @author dbk@google.com (David Barrett-Kahn)\n */\n\ngoog.setTestOnly('goog.testing.events.OnlineHandler');\ngoog.provide('goog.testing.events.OnlineHandler');\n\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.net.NetworkStatusMonitor');\n\n\n\n/**\n * NetworkStatusMonitor test double.\n * @param {boolean} initialState The initial online state of the mock.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @implements {goog.net.NetworkStatusMonitor}\n * @final\n */\ngoog.testing.events.OnlineHandler = function(initialState) {\n  goog.testing.events.OnlineHandler.base(this, 'constructor');\n\n  /**\n   * Whether the mock is online.\n   * @private {boolean}\n   */\n  this.online_ = initialState;\n};\ngoog.inherits(goog.testing.events.OnlineHandler, goog.events.EventTarget);\n\n\n/** @override */\ngoog.testing.events.OnlineHandler.prototype.isOnline = function() {\n  return this.online_;\n};\n\n\n/**\n * Sets the online state.\n * @param {boolean} newOnlineState The new online state.\n */\ngoog.testing.events.OnlineHandler.prototype.setOnline = function(\n    newOnlineState) {\n  if (newOnlineState != this.online_) {\n    this.online_ = newOnlineState;\n    this.dispatchEvent(\n        newOnlineState ? goog.net.NetworkStatusMonitor.EventType.ONLINE :\n                         goog.net.NetworkStatusMonitor.EventType.OFFLINE);\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:L","~$goog.net.NetworkStatusMonitor"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/events/onlinehandler.js"],"^:1",["^9K",["~$goog.testing.events.OnlineHandler"]],"^9<",true,"^9=",["^9>","^:L","^TU"]],["^ ","^9A",[1579837703000],"^9B","goog.timer.timer.js","^9C",["^9D","goog/timer/timer.js"],"^9E","goog/timer/timer.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A timer class to which other classes and objects can listen on.\n * This is only an abstraction above `setInterval`.\n *\n * @see ../demos/timers.html\n */\n\ngoog.provide('goog.Timer');\n\ngoog.require('goog.Promise');\ngoog.require('goog.events.EventTarget');\n\n\n\n/**\n * Class for handling timing events.\n *\n * @param {number=} opt_interval Number of ms between ticks (default: 1ms).\n * @param {Object=} opt_timerObject  An object that has `setTimeout`,\n *     `setInterval`, `clearTimeout` and `clearInterval`\n *     (e.g., `window`).\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.Timer = function(opt_interval, opt_timerObject) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * Number of ms between ticks\n   * @private {number}\n   */\n  this.interval_ = opt_interval || 1;\n\n  /**\n   * An object that implements `setTimeout`, `setInterval`,\n   * `clearTimeout` and `clearInterval`. We default to the window\n   * object. Changing this on {@link goog.Timer.prototype} changes the object\n   * for all timer instances which can be useful if your environment has some\n   * other implementation of timers than the `window` object.\n   * @private {{setTimeout:!Function, clearTimeout:!Function}}\n   */\n  this.timerObject_ = /** @type {{setTimeout, clearTimeout}} */ (\n      opt_timerObject || goog.Timer.defaultTimerObject);\n\n  /**\n   * Cached `tick_` bound to the object for later use in the timer.\n   * @private {Function}\n   * @const\n   */\n  this.boundTick_ = goog.bind(this.tick_, this);\n\n  /**\n   * Firefox browser often fires the timer event sooner (sometimes MUCH sooner)\n   * than the requested timeout. So we compare the time to when the event was\n   * last fired, and reschedule if appropriate. See also\n   * {@link goog.Timer.intervalScale}.\n   * @private {number}\n   */\n  this.last_ = goog.now();\n};\ngoog.inherits(goog.Timer, goog.events.EventTarget);\n\n\n/**\n * Maximum timeout value.\n *\n * Timeout values too big to fit into a signed 32-bit integer may cause overflow\n * in FF, Safari, and Chrome, resulting in the timeout being scheduled\n * immediately. It makes more sense simply not to schedule these timeouts, since\n * 24.8 days is beyond a reasonable expectation for the browser to stay open.\n *\n * @private {number}\n * @const\n */\ngoog.Timer.MAX_TIMEOUT_ = 2147483647;\n\n\n/**\n * A timer ID that cannot be returned by any known implementation of\n * `window.setTimeout`. Passing this value to `window.clearTimeout`\n * should therefore be a no-op.\n *\n * @private {number}\n * @const\n */\ngoog.Timer.INVALID_TIMEOUT_ID_ = -1;\n\n\n/**\n * Whether this timer is enabled\n * @type {boolean}\n */\ngoog.Timer.prototype.enabled = false;\n\n\n/**\n * An object that implements `setTimeout`, `setInterval`,\n * `clearTimeout` and `clearInterval`. We default to the global\n * object. Changing `goog.Timer.defaultTimerObject` changes the object for\n * all timer instances which can be useful if your environment has some other\n * implementation of timers you'd like to use.\n * @type {{setTimeout, clearTimeout}}\n */\ngoog.Timer.defaultTimerObject = goog.global;\n\n\n/**\n * Variable that controls the timer error correction. If the timer is called\n * before the requested interval times `intervalScale`, which often\n * happens on Mozilla, the timer is rescheduled.\n * @see {@link #last_}\n * @type {number}\n */\ngoog.Timer.intervalScale = 0.8;\n\n\n/**\n * Variable for storing the result of `setInterval`.\n * @private {?number}\n */\ngoog.Timer.prototype.timer_ = null;\n\n\n/**\n * Gets the interval of the timer.\n * @return {number} interval Number of ms between ticks.\n */\ngoog.Timer.prototype.getInterval = function() {\n  return this.interval_;\n};\n\n\n/**\n * Sets the interval of the timer.\n * @param {number} interval Number of ms between ticks.\n */\ngoog.Timer.prototype.setInterval = function(interval) {\n  this.interval_ = interval;\n  if (this.timer_ && this.enabled) {\n    // Stop and then start the timer to reset the interval.\n    this.stop();\n    this.start();\n  } else if (this.timer_) {\n    this.stop();\n  }\n};\n\n\n/**\n * Callback for the `setTimeout` used by the timer.\n * @private\n */\ngoog.Timer.prototype.tick_ = function() {\n  if (this.enabled) {\n    var elapsed = goog.now() - this.last_;\n    if (elapsed > 0 && elapsed < this.interval_ * goog.Timer.intervalScale) {\n      this.timer_ = this.timerObject_.setTimeout(\n          this.boundTick_, this.interval_ - elapsed);\n      return;\n    }\n\n    // Prevents setInterval from registering a duplicate timeout when called\n    // in the timer event handler.\n    if (this.timer_) {\n      this.timerObject_.clearTimeout(this.timer_);\n      this.timer_ = null;\n    }\n\n    this.dispatchTick();\n    // The timer could be stopped in the timer event handler.\n    if (this.enabled) {\n      // Stop and start to ensure there is always only one timeout even if\n      // start is called in the timer event handler.\n      this.stop();\n      this.start();\n    }\n  }\n};\n\n\n/**\n * Dispatches the TICK event. This is its own method so subclasses can override.\n */\ngoog.Timer.prototype.dispatchTick = function() {\n  this.dispatchEvent(goog.Timer.TICK);\n};\n\n\n/**\n * Starts the timer.\n */\ngoog.Timer.prototype.start = function() {\n  this.enabled = true;\n\n  // If there is no interval already registered, start it now\n  if (!this.timer_) {\n    // IMPORTANT!\n    // window.setInterval in FireFox has a bug - it fires based on\n    // absolute time, rather than on relative time. What this means\n    // is that if a computer is sleeping/hibernating for 24 hours\n    // and the timer interval was configured to fire every 1000ms,\n    // then after the PC wakes up the timer will fire, in rapid\n    // succession, 3600*24 times.\n    // This bug is described here and is already fixed, but it will\n    // take time to propagate, so for now I am switching this over\n    // to setTimeout logic.\n    //     https://bugzilla.mozilla.org/show_bug.cgi?id=376643\n    //\n    this.timer_ = this.timerObject_.setTimeout(this.boundTick_, this.interval_);\n    this.last_ = goog.now();\n  }\n};\n\n\n/**\n * Stops the timer.\n */\ngoog.Timer.prototype.stop = function() {\n  this.enabled = false;\n  if (this.timer_) {\n    this.timerObject_.clearTimeout(this.timer_);\n    this.timer_ = null;\n  }\n};\n\n\n/** @override */\ngoog.Timer.prototype.disposeInternal = function() {\n  goog.Timer.superClass_.disposeInternal.call(this);\n  this.stop();\n  delete this.timerObject_;\n};\n\n\n/**\n * Constant for the timer's event type.\n * @const\n */\ngoog.Timer.TICK = 'tick';\n\n\n/**\n * Calls the given function once, after the optional pause.\n * <p>\n * The function is always called asynchronously, even if the delay is 0. This\n * is a common trick to schedule a function to run after a batch of browser\n * event processing.\n *\n * @param {function(this:SCOPE)|{handleEvent:function()}|null} listener Function\n *     or object that has a handleEvent method.\n * @param {number=} opt_delay Milliseconds to wait; default is 0.\n * @param {SCOPE=} opt_handler Object in whose scope to call the listener.\n * @return {number} A handle to the timer ID.\n * @template SCOPE\n */\ngoog.Timer.callOnce = function(listener, opt_delay, opt_handler) {\n  if (goog.isFunction(listener)) {\n    if (opt_handler) {\n      listener = goog.bind(listener, opt_handler);\n    }\n  } else if (listener && typeof listener.handleEvent == 'function') {\n    // using typeof to prevent strict js warning\n    listener = goog.bind(listener.handleEvent, listener);\n  } else {\n    throw new Error('Invalid listener argument');\n  }\n\n  if (Number(opt_delay) > goog.Timer.MAX_TIMEOUT_) {\n    // Timeouts greater than MAX_INT return immediately due to integer\n    // overflow in many browsers.  Since MAX_INT is 24.8 days, just don't\n    // schedule anything at all.\n    return goog.Timer.INVALID_TIMEOUT_ID_;\n  } else {\n    return goog.Timer.defaultTimerObject.setTimeout(listener, opt_delay || 0);\n  }\n};\n\n\n/**\n * Clears a timeout initiated by {@link #callOnce}.\n * @param {?number} timerId A timer ID.\n */\ngoog.Timer.clear = function(timerId) {\n  goog.Timer.defaultTimerObject.clearTimeout(timerId);\n};\n\n\n/**\n * @param {number} delay Milliseconds to wait.\n * @param {(RESULT|goog.Thenable<RESULT>|Thenable)=} opt_result The value\n *     with which the promise will be resolved.\n * @return {!goog.Promise<RESULT>} A promise that will be resolved after\n *     the specified delay, unless it is canceled first.\n * @template RESULT\n */\ngoog.Timer.promise = function(delay, opt_result) {\n  var timerKey = null;\n  return new goog\n      .Promise(function(resolve, reject) {\n        timerKey =\n            goog.Timer.callOnce(function() { resolve(opt_result); }, delay);\n        if (timerKey == goog.Timer.INVALID_TIMEOUT_ID_) {\n          reject(new Error('Failed to schedule timer.'));\n        }\n      })\n      .thenCatch(function(error) {\n        // Clear the timer. The most likely reason is \"cancel\" signal.\n        goog.Timer.clear(timerKey);\n        throw error;\n      });\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:L","^:4"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/timer/timer.js"],"^:1",["^9K",["^><"]],"^9<",true,"^9=",["^9>","^:4","^:L"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.ratings.js","^9C",["^9D","goog/ui/ratings.js"],"^9E","goog/ui/ratings.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A base ratings widget that allows the user to select a rating,\n * like \"star video\" in Google Video. This fires a \"change\" event when the user\n * selects a rating.\n *\n * Keyboard:\n * ESC = Clear (if supported)\n * Home = 1 star\n * End = Full rating\n * Left arrow = Decrease rating\n * Right arrow = Increase rating\n * 0 = Clear (if supported)\n * 1 - 9 = nth star\n *\n * @see ../demos/ratings.html\n */\n\ngoog.provide('goog.ui.Ratings');\ngoog.provide('goog.ui.Ratings.EventType');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.EventType');\ngoog.require('goog.ui.Component');\n\n\n\n/**\n * A UI Control used for rating things, i.e. videos on Google Video.\n * @param {Array<string>=} opt_ratings Ratings. Default: [1,2,3,4,5].\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.Component}\n */\ngoog.ui.Ratings = function(opt_ratings, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * Ordered ratings that can be picked, Default: [1,2,3,4,5]\n   * @type {Array<string>}\n   * @private\n   */\n  this.ratings_ = opt_ratings || ['1', '2', '3', '4', '5'];\n\n  /**\n   * Array containing references to the star elements\n   * @type {Array<Element>}\n   * @private\n   */\n  this.stars_ = [];\n\n\n  // Awkward name because the obvious name is taken by subclasses already.\n  /**\n   * Whether the control is enabled.\n   * @type {boolean}\n   * @private\n   */\n  this.isEnabled_ = true;\n\n\n  /**\n   * The last index to be highlighted\n   * @type {number}\n   * @private\n   */\n  this.highlightedIndex_ = -1;\n\n\n  /**\n   * The currently selected index\n   * @type {number}\n   * @private\n   */\n  this.selectedIndex_ = -1;\n\n\n  /**\n   * An attached form field to set the value to\n   * @type {?HTMLInputElement|?HTMLSelectElement|null}\n   * @private\n   */\n  this.attachedFormField_ = null;\n};\ngoog.inherits(goog.ui.Ratings, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.Ratings);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.Ratings.CSS_CLASS = goog.getCssName('goog-ratings');\n\n\n/**\n * Enums for Ratings event type.\n * @enum {string}\n */\ngoog.ui.Ratings.EventType = {\n  CHANGE: 'change',\n  HIGHLIGHT_CHANGE: 'highlightchange',\n  HIGHLIGHT: 'highlight',\n  UNHIGHLIGHT: 'unhighlight'\n};\n\n\n/**\n * Decorate a HTML structure already in the document.  Expects the structure:\n * <pre>\n * - div\n *   - select\n *       - option 1 #text = 1 star\n *       - option 2 #text = 2 stars\n *       - option 3 #text = 3 stars\n *       - option N (where N is max number of ratings)\n * </pre>\n *\n * The div can contain other elements for graceful degredation, but they will be\n * hidden when the decoration occurs.\n *\n * @param {Element} el Div element to decorate.\n * @override\n */\ngoog.ui.Ratings.prototype.decorateInternal = function(el) {\n  var select = goog.dom.getElementsByTagName(\n      goog.dom.TagName.SELECT, goog.asserts.assert(el))[0];\n  if (!select) {\n    throw new Error(\n        'Can not decorate ' + el + ', with Ratings. Must ' +\n        'contain select box');\n  }\n  this.ratings_.length = 0;\n  for (var i = 0, n = select.options.length; i < n; i++) {\n    var option = select.options[i];\n    this.ratings_.push(option.text);\n  }\n  this.setSelectedIndex(select.selectedIndex);\n  select.style.display = 'none';\n  this.attachedFormField_ = /** @type {HTMLSelectElement} */ (select);\n  this.createDom();\n  el.insertBefore(this.getElement(), select);\n};\n\n\n/**\n * Render the rating widget inside the provided element. This will override the\n * current content of the element.\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Ratings.prototype.enterDocument = function() {\n  var el = this.getElement();\n  goog.asserts.assert(el, 'The DOM element for ratings cannot be null.');\n  goog.ui.Ratings.base(this, 'enterDocument');\n  el.tabIndex = 0;\n  goog.dom.classlist.add(el, this.getCssClass());\n  goog.a11y.aria.setRole(el, goog.a11y.aria.Role.SLIDER);\n  goog.a11y.aria.setState(el, goog.a11y.aria.State.VALUEMIN, 0);\n  var max = this.ratings_.length - 1;\n  goog.a11y.aria.setState(el, goog.a11y.aria.State.VALUEMAX, max);\n  var handler = this.getHandler();\n  handler.listen(el, 'keydown', this.onKeyDown_);\n\n  // Create the elements for the stars\n  for (var i = 0; i < this.ratings_.length; i++) {\n    var star = this.getDomHelper().createDom(goog.dom.TagName.SPAN, {\n      'title': this.ratings_[i],\n      'class': this.getClassName_(i, false),\n      'index': i\n    });\n    this.stars_.push(star);\n    el.appendChild(star);\n  }\n\n  handler.listen(el, goog.events.EventType.CLICK, this.onClick_);\n  handler.listen(el, goog.events.EventType.MOUSEOUT, this.onMouseOut_);\n  handler.listen(el, goog.events.EventType.MOUSEOVER, this.onMouseOver_);\n\n  this.highlightIndex_(this.selectedIndex_);\n};\n\n\n/**\n * Should be called when the widget is removed from the document but may be\n * reused.  This removes all the listeners the widget has attached and destroys\n * the DOM nodes it uses.\n * @override\n */\ngoog.ui.Ratings.prototype.exitDocument = function() {\n  goog.ui.Ratings.superClass_.exitDocument.call(this);\n  for (var i = 0; i < this.stars_.length; i++) {\n    this.getDomHelper().removeNode(this.stars_[i]);\n  }\n  this.stars_.length = 0;\n};\n\n\n/** @override */\ngoog.ui.Ratings.prototype.disposeInternal = function() {\n  goog.ui.Ratings.superClass_.disposeInternal.call(this);\n  this.ratings_.length = 0;\n};\n\n\n/**\n * Returns the base CSS class used by subcomponents of this component.\n * @return {string} Component-specific CSS class.\n */\ngoog.ui.Ratings.prototype.getCssClass = function() {\n  return goog.ui.Ratings.CSS_CLASS;\n};\n\n\n/**\n * Sets the selected index. If the provided index is greater than the number of\n * ratings then the max is set.  0 is the first item, -1 is no selection.\n * @param {number} index The index of the rating to select.\n */\ngoog.ui.Ratings.prototype.setSelectedIndex = function(index) {\n  index = Math.max(-1, Math.min(index, this.ratings_.length - 1));\n  if (index != this.selectedIndex_) {\n    this.selectedIndex_ = index;\n    this.highlightIndex_(this.selectedIndex_);\n    if (this.attachedFormField_) {\n      if (this.attachedFormField_.tagName == goog.dom.TagName.SELECT) {\n        this.attachedFormField_.selectedIndex = index;\n      } else {\n        this.attachedFormField_.value =\n            /** @type {string} */ (this.getValue());\n      }\n      var ratingsElement = this.getElement();\n      goog.asserts.assert(\n          ratingsElement, 'The DOM ratings element cannot be null.');\n      goog.a11y.aria.setState(\n          ratingsElement, goog.a11y.aria.State.VALUENOW, this.ratings_[index]);\n    }\n    this.dispatchEvent(goog.ui.Ratings.EventType.CHANGE);\n  }\n};\n\n\n/**\n * @return {number} The index of the currently selected rating.\n */\ngoog.ui.Ratings.prototype.getSelectedIndex = function() {\n  return this.selectedIndex_;\n};\n\n\n/**\n * Returns the rating value of the currently selected rating\n * @return {?string} The value of the currently selected rating (or null).\n */\ngoog.ui.Ratings.prototype.getValue = function() {\n  return this.selectedIndex_ == -1 ? null : this.ratings_[this.selectedIndex_];\n};\n\n\n/**\n * Returns the index of the currently highlighted rating, -1 if the mouse isn't\n * currently over the widget\n * @return {number} The index of the currently highlighted rating.\n */\ngoog.ui.Ratings.prototype.getHighlightedIndex = function() {\n  return this.highlightedIndex_;\n};\n\n\n/**\n * Returns the value of the currently highlighted rating, null if the mouse\n * isn't currently over the widget\n * @return {?string} The value of the currently highlighted rating, or null.\n */\ngoog.ui.Ratings.prototype.getHighlightedValue = function() {\n  return this.highlightedIndex_ == -1 ? null :\n                                        this.ratings_[this.highlightedIndex_];\n};\n\n\n/**\n * Sets the array of ratings that the comonent\n * @param {Array<string>} ratings Array of value to use as ratings.\n */\ngoog.ui.Ratings.prototype.setRatings = function(ratings) {\n  this.ratings_ = ratings;\n  // TODO(user): If rendered update stars\n};\n\n\n/**\n * Gets the array of ratings that the component\n * @return {Array<string>} Array of ratings.\n */\ngoog.ui.Ratings.prototype.getRatings = function() {\n  return this.ratings_;\n};\n\n\n/**\n * Attaches an input or select element to the ratings widget. The value or\n * index of the field will be updated along with the ratings widget.\n * @param {HTMLSelectElement|HTMLInputElement} field The field to attach to.\n */\ngoog.ui.Ratings.prototype.setAttachedFormField = function(field) {\n  this.attachedFormField_ = field;\n};\n\n\n/**\n * Returns the attached input or select element to the ratings widget.\n * @return {HTMLSelectElement|HTMLInputElement|null} The attached form field.\n */\ngoog.ui.Ratings.prototype.getAttachedFormField = function() {\n  return this.attachedFormField_;\n};\n\n\n/**\n * Enables or disables the ratings control.\n * @param {boolean} enable Whether to enable or disable the control.\n */\ngoog.ui.Ratings.prototype.setEnabled = function(enable) {\n  this.isEnabled_ = enable;\n  if (!enable) {\n    // Undo any highlighting done during mouseover when disabling the control\n    // and highlight the last selected rating.\n    this.resetHighlights_();\n  }\n};\n\n\n/**\n * @return {boolean} Whether the ratings control is enabled.\n */\ngoog.ui.Ratings.prototype.isEnabled = function() {\n  return this.isEnabled_;\n};\n\n\n/**\n * Handle the mouse moving over a star.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Ratings.prototype.onMouseOver_ = function(e) {\n  if (!this.isEnabled()) {\n    return;\n  }\n  if (e.target.index !== undefined) {\n    var n = e.target.index;\n    if (this.highlightedIndex_ != n) {\n      this.highlightIndex_(n);\n      this.highlightedIndex_ = n;\n      this.dispatchEvent(goog.ui.Ratings.EventType.HIGHLIGHT_CHANGE);\n      this.dispatchEvent(goog.ui.Ratings.EventType.HIGHLIGHT);\n    }\n  }\n};\n\n\n/**\n * Handle the mouse moving over a star.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Ratings.prototype.onMouseOut_ = function(e) {\n  // Only remove the highlight if the mouse is not moving to another star\n  if (e.relatedTarget && e.relatedTarget.index === undefined) {\n    this.resetHighlights_();\n  }\n};\n\n\n/**\n * Handle the mouse moving over a star.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Ratings.prototype.onClick_ = function(e) {\n  if (!this.isEnabled()) {\n    return;\n  }\n\n  if (e.target.index !== undefined) {\n    this.setSelectedIndex(e.target.index);\n  }\n};\n\n\n/**\n * Handle the key down event. 0 = unselected in this case, 1 = the first rating\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.ui.Ratings.prototype.onKeyDown_ = function(e) {\n  if (!this.isEnabled()) {\n    return;\n  }\n  switch (e.keyCode) {\n    case 27:  // esc\n      this.setSelectedIndex(-1);\n      break;\n    case 36:  // home\n      this.setSelectedIndex(0);\n      break;\n    case 35:  // end\n      this.setSelectedIndex(this.ratings_.length);\n      break;\n    case 37:  // left arrow\n      this.setSelectedIndex(this.getSelectedIndex() - 1);\n      break;\n    case 39:  // right arrow\n      this.setSelectedIndex(this.getSelectedIndex() + 1);\n      break;\n    default:\n      // Detected a numeric key stroke, such as 0 - 9.  0 clears, 1 is first\n      // star, 9 is 9th star or last if there are less than 9 stars.\n      var num = parseInt(String.fromCharCode(e.keyCode), 10);\n      if (!isNaN(num)) {\n        this.setSelectedIndex(num - 1);\n      }\n  }\n};\n\n\n/**\n * Resets the highlights to the selected rating to undo highlights due to hover\n * effects.\n * @private\n */\ngoog.ui.Ratings.prototype.resetHighlights_ = function() {\n  this.highlightIndex_(this.selectedIndex_);\n  this.highlightedIndex_ = -1;\n  this.dispatchEvent(goog.ui.Ratings.EventType.HIGHLIGHT_CHANGE);\n  this.dispatchEvent(goog.ui.Ratings.EventType.UNHIGHLIGHT);\n};\n\n\n/**\n * Highlights the ratings up to a specific index\n * @param {number} n Index to highlight.\n * @private\n */\ngoog.ui.Ratings.prototype.highlightIndex_ = function(n) {\n  for (var i = 0, star; star = this.stars_[i]; i++) {\n    goog.dom.classlist.set(star, this.getClassName_(i, i <= n));\n  }\n};\n\n\n/**\n * Get the class name for a given rating.  All stars have the class:\n * goog-ratings-star.\n * Other possible classnames dependent on position and state are:\n * goog-ratings-firststar-on\n * goog-ratings-firststar-off\n * goog-ratings-midstar-on\n * goog-ratings-midstar-off\n * goog-ratings-laststar-on\n * goog-ratings-laststar-off\n * @param {number} i Index to get class name for.\n * @param {boolean} on Whether it should be on.\n * @return {string} The class name.\n * @private\n */\ngoog.ui.Ratings.prototype.getClassName_ = function(i, on) {\n  var className;\n  var enabledClassName;\n  var baseClass = this.getCssClass();\n\n  if (i === 0) {\n    className = goog.getCssName(baseClass, 'firststar');\n  } else if (i == this.ratings_.length - 1) {\n    className = goog.getCssName(baseClass, 'laststar');\n  } else {\n    className = goog.getCssName(baseClass, 'midstar');\n  }\n\n  if (on) {\n    className = goog.getCssName(className, 'on');\n  } else {\n    className = goog.getCssName(className, 'off');\n  }\n\n  if (this.isEnabled_) {\n    enabledClassName = goog.getCssName(baseClass, 'enabled');\n  } else {\n    enabledClassName = goog.getCssName(baseClass, 'disabled');\n  }\n\n  return goog.getCssName(baseClass, 'star') + ' ' + className + ' ' +\n      enabledClassName;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^:;","^?H","^:=","^;G","^9>","^:I","^?M","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/ratings.js"],"^:1",["^9K",["~$goog.ui.Ratings.EventType","~$goog.ui.Ratings"]],"^9<",true,"^9=",["^9>","^?H","^;G","^?M","^:E","^;;","^;=","^:;","^:I","^:="]],["^ ","^9A",[1579837703000],"^9B","goog.labs.style.pixeldensitymonitor.js","^9C",["^9D","goog/labs/style/pixeldensitymonitor.js"],"^9E","goog/labs/style/pixeldensitymonitor.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility class that monitors pixel density ratio changes.\n *\n * @see ../demos/pixeldensitymonitor.html\n */\n\ngoog.provide('goog.labs.style.PixelDensityMonitor');\ngoog.provide('goog.labs.style.PixelDensityMonitor.Density');\ngoog.provide('goog.labs.style.PixelDensityMonitor.EventType');\n\ngoog.forwardDeclare('goog.dom.DomHelper');\ngoog.require('goog.events');\ngoog.require('goog.events.EventTarget');\n\n\n\n/**\n * Monitors the window for changes to the ratio between device and screen\n * pixels, e.g. when the user moves the window from a high density screen to a\n * screen with normal density. Dispatches\n * goog.labs.style.PixelDensityMonitor.EventType.CHANGE events when the density\n * changes between the two predefined values NORMAL and HIGH.\n *\n * This class uses the window.devicePixelRatio value which is supported in\n * WebKit and FF18. If the value does not exist, it will always return a\n * NORMAL density. It requires support for MediaQueryList to detect changes to\n * the devicePixelRatio.\n *\n * @param {!goog.dom.DomHelper=} opt_domHelper The DomHelper which contains the\n *     document associated with the window to listen to. Defaults to the one in\n *     which this code is executing.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.labs.style.PixelDensityMonitor = function(opt_domHelper) {\n  goog.labs.style.PixelDensityMonitor.base(this, 'constructor');\n\n  /**\n   * @type {Window}\n   * @private\n   */\n  this.window_ = opt_domHelper ? opt_domHelper.getWindow() : window;\n\n  /**\n   * The last density that was reported so that changes can be detected.\n   * @type {goog.labs.style.PixelDensityMonitor.Density}\n   * @private\n   */\n  this.lastDensity_ = this.getDensity();\n\n  /**\n   * @type {function (MediaQueryList)}\n   * @private\n   */\n  this.listener_ = goog.bind(this.handleMediaQueryChange_, this);\n\n  /**\n   * The media query list for a query that detects high density, if supported\n   * by the browser. Because matchMedia returns a new object for every call, it\n   * needs to be saved here so the listener can be removed when disposing.\n   * @type {?MediaQueryList}\n   * @private\n   */\n  this.mediaQueryList_ = this.window_.matchMedia ?\n      this.window_.matchMedia(\n          goog.labs.style.PixelDensityMonitor.HIGH_DENSITY_QUERY_) :\n      null;\n};\ngoog.inherits(goog.labs.style.PixelDensityMonitor, goog.events.EventTarget);\n\n\n/**\n * The two different pixel density modes on which the various ratios between\n * physical and device pixels are mapped.\n * @enum {number}\n */\ngoog.labs.style.PixelDensityMonitor.Density = {\n  /**\n   * Mode for older portable devices and desktop screens, defined as having a\n   * device pixel ratio of less than 1.5.\n   */\n  NORMAL: 1,\n\n  /**\n   * Mode for newer portable devices with a high resolution screen, defined as\n   * having a device pixel ratio of more than 1.5.\n   */\n  HIGH: 2\n};\n\n\n/**\n * The events fired by the PixelDensityMonitor.\n * @enum {string}\n */\ngoog.labs.style.PixelDensityMonitor.EventType = {\n  /**\n   * Dispatched when density changes between NORMAL and HIGH.\n   */\n  CHANGE: goog.events.getUniqueId('change')\n};\n\n\n/**\n * Minimum ratio between device and screen pixel needed for high density mode.\n * @type {number}\n * @private\n */\ngoog.labs.style.PixelDensityMonitor.HIGH_DENSITY_RATIO_ = 1.5;\n\n\n/**\n * Media query that matches for high density.\n * @type {string}\n * @private\n */\ngoog.labs.style.PixelDensityMonitor.HIGH_DENSITY_QUERY_ =\n    '(min-resolution: 1.5dppx), (-webkit-min-device-pixel-ratio: 1.5)';\n\n\n/**\n * Starts monitoring for changes in pixel density.\n */\ngoog.labs.style.PixelDensityMonitor.prototype.start = function() {\n  if (this.mediaQueryList_) {\n    this.mediaQueryList_.addListener(this.listener_);\n  }\n};\n\n\n/**\n * @return {goog.labs.style.PixelDensityMonitor.Density} The density for the\n *     window.\n */\ngoog.labs.style.PixelDensityMonitor.prototype.getDensity = function() {\n  if (this.window_.devicePixelRatio >=\n      goog.labs.style.PixelDensityMonitor.HIGH_DENSITY_RATIO_) {\n    return goog.labs.style.PixelDensityMonitor.Density.HIGH;\n  } else {\n    return goog.labs.style.PixelDensityMonitor.Density.NORMAL;\n  }\n};\n\n\n/**\n * Handles a change to the media query and checks whether the density has\n * changed since the last call.\n * @param {MediaQueryList} mql The list of changed media queries.\n * @private\n */\ngoog.labs.style.PixelDensityMonitor.prototype.handleMediaQueryChange_ =\n    function(mql) {\n  var newDensity = this.getDensity();\n  if (this.lastDensity_ != newDensity) {\n    this.lastDensity_ = newDensity;\n    this.dispatchEvent(goog.labs.style.PixelDensityMonitor.EventType.CHANGE);\n  }\n};\n\n\n/** @override */\ngoog.labs.style.PixelDensityMonitor.prototype.disposeInternal = function() {\n  if (this.mediaQueryList_) {\n    this.mediaQueryList_.removeListener(this.listener_);\n  }\n  goog.labs.style.PixelDensityMonitor.base(this, 'disposeInternal');\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:L","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/style/pixeldensitymonitor.js"],"^:1",["^9K",["~$goog.labs.style.PixelDensityMonitor.EventType","~$goog.labs.style.PixelDensityMonitor","~$goog.labs.style.PixelDensityMonitor.Density"]],"^9<",true,"^9=",["^9>","^:N","^:L"]],["^ ","^9A",[1579837703000],"^9B","goog.pubsub.pubsub.js","^9C",["^9D","goog/pubsub/pubsub.js"],"^9E","goog/pubsub/pubsub.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview  Topic-based publish/subscribe channel implementation.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.pubsub.PubSub');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.array');\ngoog.require('goog.async.run');\n\n\n\n/**\n * Topic-based publish/subscribe channel.  Maintains a map of topics to\n * subscriptions.  When a message is published to a topic, all functions\n * subscribed to that topic are invoked in the order they were added.\n * Uncaught errors abort publishing.\n *\n * Topics may be identified by any nonempty string, <strong>except</strong>\n * strings corresponding to native Object properties, e.g. \"constructor\",\n * \"toString\", \"hasOwnProperty\", etc.\n *\n * @constructor\n * @param {boolean=} opt_async Enable asynchronous behavior.  Recommended for\n *     new code.  See notes on the publish() method.\n * @extends {goog.Disposable}\n */\ngoog.pubsub.PubSub = function(opt_async) {\n  goog.pubsub.PubSub.base(this, 'constructor');\n\n  /**\n   * The next available subscription key.  Internally, this is an index into the\n   * sparse array of subscriptions.\n   *\n   * @private {number}\n   */\n  this.key_ = 1;\n\n  /**\n   * Array of subscription keys pending removal once publishing is done.\n   *\n   * @private {!Array<number>}\n   * @const\n   */\n  this.pendingKeys_ = [];\n\n  /**\n   * Lock to prevent the removal of subscriptions during publishing. Incremented\n   * at the beginning of {@link #publish}, and decremented at the end.\n   *\n   * @private {number}\n   */\n  this.publishDepth_ = 0;\n\n  /**\n   * Sparse array of subscriptions. Each subscription is represented by a tuple\n   * comprising a topic identifier, a function, and an optional context object.\n   * Each tuple occupies three consecutive positions in the array, with the\n   * topic identifier at index n, the function at index (n + 1), the context\n   * object at index (n + 2), the next topic at index (n + 3), etc. (This\n   * representation minimizes the number of object allocations and has been\n   * shown to be faster than an array of objects with three key-value pairs or\n   * three parallel arrays, especially on IE.) Once a subscription is removed\n   * via {@link #unsubscribe} or {@link #unsubscribeByKey}, the three\n   * corresponding array elements are deleted, and never reused. This means the\n   * total number of subscriptions during the lifetime of the pubsub channel is\n   * limited by the maximum length of a JavaScript array to (2^32 - 1) / 3 =\n   * 1,431,655,765 subscriptions, which should suffice for most applications.\n   *\n   * @private {!Array<?>}\n   * @const\n   */\n  this.subscriptions_ = [];\n\n  /**\n   * Map of topics to arrays of subscription keys.\n   *\n   * @private {!Object<!Array<number>>}\n   */\n  this.topics_ = {};\n\n  /**\n   * @private @const {boolean}\n   */\n  this.async_ = Boolean(opt_async);\n};\ngoog.inherits(goog.pubsub.PubSub, goog.Disposable);\n\n\n/**\n * Subscribes a function to a topic.  The function is invoked as a method on\n * the given `opt_context` object, or in the global scope if no context\n * is specified.  Subscribing the same function to the same topic multiple\n * times will result in multiple function invocations while publishing.\n * Returns a subscription key that can be used to unsubscribe the function from\n * the topic via {@link #unsubscribeByKey}.\n *\n * @param {string} topic Topic to subscribe to.\n * @param {Function} fn Function to be invoked when a message is published to\n *     the given topic.\n * @param {Object=} opt_context Object in whose context the function is to be\n *     called (the global scope if none).\n * @return {number} Subscription key.\n */\ngoog.pubsub.PubSub.prototype.subscribe = function(topic, fn, opt_context) {\n  var keys = this.topics_[topic];\n  if (!keys) {\n    // First subscription to this topic; initialize subscription key array.\n    keys = this.topics_[topic] = [];\n  }\n\n  // Push the tuple representing the subscription onto the subscription array.\n  var key = this.key_;\n  this.subscriptions_[key] = topic;\n  this.subscriptions_[key + 1] = fn;\n  this.subscriptions_[key + 2] = opt_context;\n  this.key_ = key + 3;\n\n  // Push the subscription key onto the list of subscriptions for the topic.\n  keys.push(key);\n\n  // Return the subscription key.\n  return key;\n};\n\n\n/**\n * Subscribes a single-use function to a topic.  The function is invoked as a\n * method on the given `opt_context` object, or in the global scope if\n * no context is specified, and is then unsubscribed.  Returns a subscription\n * key that can be used to unsubscribe the function from the topic via\n * {@link #unsubscribeByKey}.\n *\n * @param {string} topic Topic to subscribe to.\n * @param {Function} fn Function to be invoked once and then unsubscribed when\n *     a message is published to the given topic.\n * @param {Object=} opt_context Object in whose context the function is to be\n *     called (the global scope if none).\n * @return {number} Subscription key.\n */\ngoog.pubsub.PubSub.prototype.subscribeOnce = function(topic, fn, opt_context) {\n  // Keep track of whether the function was called.  This is necessary because\n  // in async mode, multiple calls could be scheduled before the function has\n  // the opportunity to unsubscribe itself.\n  var called = false;\n\n  // Behold the power of lexical closures!\n  var key = this.subscribe(topic, function(var_args) {\n    if (!called) {\n      called = true;\n\n      // Unsubuscribe before calling function so the function is unscubscribed\n      // even if it throws an exception.\n      this.unsubscribeByKey(key);\n\n      fn.apply(opt_context, arguments);\n    }\n  }, this);\n  return key;\n};\n\n\n/**\n * Unsubscribes a function from a topic.  Only deletes the first match found.\n * Returns a Boolean indicating whether a subscription was removed.\n *\n * @param {string} topic Topic to unsubscribe from.\n * @param {Function} fn Function to unsubscribe.\n * @param {Object=} opt_context Object in whose context the function was to be\n *     called (the global scope if none).\n * @return {boolean} Whether a matching subscription was removed.\n */\ngoog.pubsub.PubSub.prototype.unsubscribe = function(topic, fn, opt_context) {\n  var keys = this.topics_[topic];\n  if (keys) {\n    // Find the subscription key for the given combination of topic, function,\n    // and context object.\n    var subscriptions = this.subscriptions_;\n    var key = goog.array.find(keys, function(k) {\n      return subscriptions[k + 1] == fn && subscriptions[k + 2] == opt_context;\n    });\n    // Zero is not a valid key.\n    if (key) {\n      return this.unsubscribeByKey(key);\n    }\n  }\n\n  return false;\n};\n\n\n/**\n * Removes a subscription based on the key returned by {@link #subscribe}.\n * No-op if no matching subscription is found.  Returns a Boolean indicating\n * whether a subscription was removed.\n *\n * @param {number} key Subscription key.\n * @return {boolean} Whether a matching subscription was removed.\n */\ngoog.pubsub.PubSub.prototype.unsubscribeByKey = function(key) {\n  var topic = this.subscriptions_[key];\n  if (topic) {\n    // Subscription tuple found.\n    var keys = this.topics_[topic];\n\n    if (this.publishDepth_ != 0) {\n      // Defer removal until after publishing is complete, but replace the\n      // function with a no-op so it isn't called.\n      this.pendingKeys_.push(key);\n      this.subscriptions_[key + 1] = goog.nullFunction;\n    } else {\n      if (keys) {\n        goog.array.remove(keys, key);\n      }\n      delete this.subscriptions_[key];\n      delete this.subscriptions_[key + 1];\n      delete this.subscriptions_[key + 2];\n    }\n  }\n\n  return !!topic;\n};\n\n\n/**\n * Publishes a message to a topic.  Calls functions subscribed to the topic in\n * the order in which they were added, passing all arguments along.\n *\n * If this object was created with async=true, subscribed functions are called\n * via goog.async.run().  Otherwise, the functions are called directly, and if\n * any of them throw an uncaught error, publishing is aborted.\n *\n * @param {string} topic Topic to publish to.\n * @param {...*} var_args Arguments that are applied to each subscription\n *     function.\n * @return {boolean} Whether any subscriptions were called.\n */\ngoog.pubsub.PubSub.prototype.publish = function(topic, var_args) {\n  var keys = this.topics_[topic];\n  if (keys) {\n    // Copy var_args to a new array so they can be passed to subscribers.\n    // Note that we can't use Array.slice or goog.array.toArray for this for\n    // performance reasons. Using those with the arguments object will cause\n    // deoptimization.\n    var args = new Array(arguments.length - 1);\n    for (var i = 1, len = arguments.length; i < len; i++) {\n      args[i - 1] = arguments[i];\n    }\n\n    if (this.async_) {\n      // For each key in the list of subscription keys for the topic, schedule\n      // the function to be applied to the arguments in the appropriate context.\n      for (i = 0; i < keys.length; i++) {\n        var key = keys[i];\n        goog.pubsub.PubSub.runAsync_(\n            this.subscriptions_[key + 1], this.subscriptions_[key + 2], args);\n      }\n    } else {\n      // We must lock subscriptions and remove them at the end, so we don't\n      // adversely affect the performance of the common case by cloning the key\n      // array.\n      this.publishDepth_++;\n\n      try {\n        // For each key in the list of subscription keys for the topic, apply\n        // the function to the arguments in the appropriate context.  The length\n        // of the array must be fixed during the iteration, since subscribers\n        // may add new subscribers during publishing.\n        for (i = 0, len = keys.length; i < len; i++) {\n          var key = keys[i];\n          this.subscriptions_[key + 1].apply(\n              this.subscriptions_[key + 2], args);\n        }\n      } finally {\n        // Always unlock subscriptions, even if a subscribed method throws an\n        // uncaught exception. This makes it possible for users to catch\n        // exceptions themselves and unsubscribe remaining subscriptions.\n        this.publishDepth_--;\n\n        if (this.pendingKeys_.length > 0 && this.publishDepth_ == 0) {\n          var pendingKey;\n          while ((pendingKey = this.pendingKeys_.pop())) {\n            this.unsubscribeByKey(pendingKey);\n          }\n        }\n      }\n    }\n\n    // At least one subscriber was called.\n    return i != 0;\n  }\n\n  // No subscribers were found.\n  return false;\n};\n\n\n/**\n * Runs a function asynchronously with the given context and arguments.\n * @param {!Function} func The function to call.\n * @param {*} context The context in which to call `func`.\n * @param {!Array} args The arguments to pass to `func`.\n * @private\n */\ngoog.pubsub.PubSub.runAsync_ = function(func, context, args) {\n  goog.async.run(function() { func.apply(context, args); });\n};\n\n\n/**\n * Clears the subscription list for a topic, or all topics if unspecified.\n * @param {string=} opt_topic Topic to clear (all topics if unspecified).\n */\ngoog.pubsub.PubSub.prototype.clear = function(opt_topic) {\n  if (opt_topic) {\n    var keys = this.topics_[opt_topic];\n    if (keys) {\n      goog.array.forEach(keys, this.unsubscribeByKey, this);\n      delete this.topics_[opt_topic];\n    }\n  } else {\n    this.subscriptions_.length = 0;\n    this.topics_ = {};\n    // We don't reset key_ on purpose, because we want subscription keys to be\n    // unique throughout the lifetime of the application.  Reusing subscription\n    // keys could lead to subtle errors in client code.\n  }\n};\n\n\n/**\n * Returns the number of subscriptions to the given topic (or all topics if\n * unspecified). This number will not change while publishing any messages.\n * @param {string=} opt_topic The topic (all topics if unspecified).\n * @return {number} Number of subscriptions to the topic.\n */\ngoog.pubsub.PubSub.prototype.getCount = function(opt_topic) {\n  if (opt_topic) {\n    var keys = this.topics_[opt_topic];\n    return keys ? keys.length : 0;\n  }\n\n  var count = 0;\n  for (var topic in this.topics_) {\n    count += this.getCount(topic);\n  }\n\n  return count;\n};\n\n\n/** @override */\ngoog.pubsub.PubSub.prototype.disposeInternal = function() {\n  goog.pubsub.PubSub.base(this, 'disposeInternal');\n  this.clear();\n  this.pendingKeys_.length = 0;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:3","^9>","^:7","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/pubsub/pubsub.js"],"^:1",["^9K",["~$goog.pubsub.PubSub"]],"^9<",true,"^9=",["^9>","^:7","^;9","^:3"]],["^ ","^9A",[1579837703000],"^9B","goog.net.ipaddress.js","^9C",["^9D","goog/net/ipaddress.js"],"^9E","goog/net/ipaddress.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This file contains classes to handle IPv4 and IPv6 addresses.\n * This implementation is mostly based on Google's project:\n * http://code.google.com/p/ipaddr-py/.\n *\n */\n\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.net.IpAddress');\ngoog.provide('goog.net.Ipv4Address');\ngoog.provide('goog.net.Ipv6Address');\n\ngoog.require('goog.array');\ngoog.require('goog.math.Integer');\ngoog.require('goog.object');\ngoog.require('goog.string');\n\n\n\n/**\n * Abstract class defining an IP Address.\n *\n * Please use goog.net.IpAddress static methods or\n * goog.net.Ipv4Address/Ipv6Address classes.\n *\n * @param {!goog.math.Integer} address The Ip Address.\n * @param {number} version The version number (4, 6).\n * @constructor\n */\ngoog.net.IpAddress = function(address, version) {\n  /**\n   * The IP Address.\n   * @type {!goog.math.Integer}\n   * @private\n   */\n  this.ip_ = address;\n\n  /**\n   * The IP Address version.\n   * @type {number}\n   * @private\n   */\n  this.version_ = version;\n\n};\n\n\n/**\n * @return {number} The IP Address version.\n */\ngoog.net.IpAddress.prototype.getVersion = function() {\n  return this.version_;\n};\n\n\n/**\n * @param {!goog.net.IpAddress} other The other IP Address.\n * @return {boolean} true if the IP Addresses are equal.\n */\ngoog.net.IpAddress.prototype.equals = function(other) {\n  return (\n      this.version_ == other.getVersion() &&\n      this.ip_.equals(other.toInteger()));\n};\n\n\n/**\n * @return {!goog.math.Integer} The IP Address, as an Integer.\n */\ngoog.net.IpAddress.prototype.toInteger = function() {\n  return /** @type {!goog.math.Integer} */ (goog.object.clone(this.ip_));\n};\n\n\n/**\n * @return {string} The IP Address, as an URI string following RFC 3986.\n */\ngoog.net.IpAddress.prototype.toUriString = goog.abstractMethod;\n\n\n/**\n * @return {string} The IP Address, as a string.\n * @override\n */\ngoog.net.IpAddress.prototype.toString = goog.abstractMethod;\n\n\n/**\n * @return {boolean} Whether or not the address is site-local.\n */\ngoog.net.IpAddress.prototype.isSiteLocal = goog.abstractMethod;\n\n\n/**\n * @return {boolean} Whether or not the address is link-local.\n */\ngoog.net.IpAddress.prototype.isLinkLocal = goog.abstractMethod;\n\n\n/**\n * Parses an IP Address in a string.\n * If the string is malformed, the function will simply return null\n * instead of raising an exception.\n *\n * @param {string} address The IP Address.\n * @see {goog.net.Ipv4Address}\n * @see {goog.net.Ipv6Address}\n * @return {goog.net.IpAddress} The IP Address or null.\n */\ngoog.net.IpAddress.fromString = function(address) {\n  try {\n    if (address.indexOf(':') != -1) {\n      return new goog.net.Ipv6Address(address);\n    }\n\n    return new goog.net.Ipv4Address(address);\n  } catch (e) {\n    // Both constructors raise exception if the address is malformed (ie.\n    // invalid). The user of this function should not care about catching\n    // the exception, espcially if it's used to validate an user input.\n    return null;\n  }\n};\n\n\n/**\n * Tries to parse a string represented as a host portion of an URI.\n * See RFC 3986 for more details on IPv6 addresses inside URI.\n * If the string is malformed, the function will simply return null\n * instead of raising an exception.\n *\n * @param {string} address A RFC 3986 encoded IP address.\n * @see {goog.net.Ipv4Address}\n * @see {goog.net.Ipv6Address}\n * @return {goog.net.IpAddress} The IP Address.\n */\ngoog.net.IpAddress.fromUriString = function(address) {\n  try {\n    if (goog.string.startsWith(address, '[') &&\n        goog.string.endsWith(address, ']')) {\n      return new goog.net.Ipv6Address(address.substring(1, address.length - 1));\n    }\n\n    return new goog.net.Ipv4Address(address);\n  } catch (e) {\n    // Both constructors raise exception if the address is malformed (ie.\n    // invalid). The user of this function should not care about catching\n    // the exception, espcially if it's used to validate an user input.\n    return null;\n  }\n};\n\n\n\n/**\n * Takes a string or a number and returns a IPv4 Address.\n *\n * This constructor accepts strings and instance of goog.math.Integer.\n * If you pass a goog.math.Integer, make sure that its sign is set to positive.\n * @param {(string|!goog.math.Integer)} address The address to store.\n * @extends {goog.net.IpAddress}\n * @constructor\n * @final\n */\ngoog.net.Ipv4Address = function(address) {\n  /**\n   * The cached string representation of the IP Address.\n   * @type {?string}\n   * @private\n   */\n  this.ipStr_ = null;\n\n  var ip = goog.math.Integer.ZERO;\n  if (address instanceof goog.math.Integer) {\n    if (address.getSign() != 0 || address.lessThan(goog.math.Integer.ZERO) ||\n        address.greaterThan(goog.net.Ipv4Address.MAX_ADDRESS_)) {\n      throw new Error('The address does not look like an IPv4.');\n    } else {\n      ip = goog.object.clone(address);\n    }\n  } else {\n    if (!goog.net.Ipv4Address.REGEX_.test(address)) {\n      throw new Error(address + ' does not look like an IPv4 address.');\n    }\n\n    var octets = address.split('.');\n    if (octets.length != 4) {\n      throw new Error(address + ' does not look like an IPv4 address.');\n    }\n\n    for (var i = 0; i < octets.length; i++) {\n      var parsedOctet = goog.string.toNumber(octets[i]);\n      if (isNaN(parsedOctet) || parsedOctet < 0 || parsedOctet > 255 ||\n          (octets[i].length != 1 && goog.string.startsWith(octets[i], '0'))) {\n        throw new Error('In ' + address + ', octet ' + i + ' is not valid');\n      }\n      var intOctet = goog.math.Integer.fromNumber(parsedOctet);\n      ip = ip.shiftLeft(8).or(intOctet);\n    }\n  }\n  goog.net.Ipv4Address.base(\n      this, 'constructor', /** @type {!goog.math.Integer} */ (ip), 4);\n};\ngoog.inherits(goog.net.Ipv4Address, goog.net.IpAddress);\n\n\n/**\n * Regular expression matching all the allowed chars for IPv4.\n * @type {RegExp}\n * @private\n * @const\n */\ngoog.net.Ipv4Address.REGEX_ = /^[0-9.]*$/;\n\n\n/**\n * The Maximum length for a netmask (aka, the number of bits for IPv4).\n * @type {number}\n * @const\n */\ngoog.net.Ipv4Address.MAX_NETMASK_LENGTH = 32;\n\n\n/**\n * The Maximum address possible for IPv4.\n * @type {goog.math.Integer}\n * @private\n * @const\n */\ngoog.net.Ipv4Address.MAX_ADDRESS_ =\n    goog.math.Integer.ONE.shiftLeft(goog.net.Ipv4Address.MAX_NETMASK_LENGTH)\n        .subtract(goog.math.Integer.ONE);\n\n\n/**\n * @override\n */\ngoog.net.Ipv4Address.prototype.toString = function() {\n  if (this.ipStr_) {\n    return this.ipStr_;\n  }\n\n  var ip = this.ip_.getBitsUnsigned(0);\n  var octets = [];\n  for (var i = 3; i >= 0; i--) {\n    octets[i] = String((ip & 0xff));\n    ip = ip >>> 8;\n  }\n\n  this.ipStr_ = octets.join('.');\n\n  return this.ipStr_;\n};\n\n\n/**\n * @override\n */\ngoog.net.Ipv4Address.prototype.toUriString = function() {\n  return this.toString();\n};\n\n\n/**\n * @override\n */\ngoog.net.Ipv4Address.prototype.isSiteLocal = function() {\n  // Check for prefix 10/8, 172.16/12, or 192.168/16.\n  var ipInt = this.ip_.toInt();\n  return (((ipInt >>> 24) & 0xff) == 10) ||\n      ((((ipInt >>> 24) & 0xff) == 172) && (((ipInt >>> 16) & 0xf0) == 16)) ||\n      ((((ipInt >>> 24) & 0xff) == 192) && (((ipInt >>> 16) & 0xff) == 168));\n};\n\n\n/**\n * @override\n */\ngoog.net.Ipv4Address.prototype.isLinkLocal = function() {\n  // Check for prefix 169.254/16.\n  var ipInt = this.ip_.toInt();\n  return (((ipInt >>> 24) & 0xff) == 169) && (((ipInt >>> 16) & 0xff) == 254);\n};\n\n\n/**\n * Takes a string or a number and returns an IPv6 Address.\n *\n * This constructor accepts strings and instance of goog.math.Integer.\n * If you pass a goog.math.Integer, make sure that its sign is set to positive.\n * @param {(string|!goog.math.Integer)} address The address to store.\n * @constructor\n * @extends {goog.net.IpAddress}\n * @final\n */\ngoog.net.Ipv6Address = function(address) {\n  /**\n   * The cached string representation of the IP Address.\n   * @type {?string}\n   * @private\n   */\n  this.ipStr_ = null;\n\n  var ip = goog.math.Integer.ZERO;\n  if (address instanceof goog.math.Integer) {\n    if (address.getSign() != 0 || address.lessThan(goog.math.Integer.ZERO) ||\n        address.greaterThan(goog.net.Ipv6Address.MAX_ADDRESS_)) {\n      throw new Error('The address does not look like a valid IPv6.');\n    } else {\n      ip = goog.object.clone(address);\n    }\n  } else {\n    if (!goog.net.Ipv6Address.REGEX_.test(address)) {\n      throw new Error(address + ' is not a valid IPv6 address.');\n    }\n\n    var splitColon = address.split(':');\n    if (splitColon[splitColon.length - 1].indexOf('.') != -1) {\n      var newHextets = goog.net.Ipv6Address.dottedQuadtoHextets_(\n          splitColon[splitColon.length - 1]);\n      goog.array.removeAt(splitColon, splitColon.length - 1);\n      goog.array.extend(splitColon, newHextets);\n      address = splitColon.join(':');\n    }\n\n    var splitDoubleColon = address.split('::');\n    if (splitDoubleColon.length > 2 ||\n        (splitDoubleColon.length == 1 && splitColon.length != 8)) {\n      throw new Error(address + ' is not a valid IPv6 address.');\n    }\n\n    var ipArr;\n    if (splitDoubleColon.length > 1) {\n      ipArr = goog.net.Ipv6Address.explode_(splitDoubleColon);\n    } else {\n      ipArr = splitColon;\n    }\n\n    if (ipArr.length != 8) {\n      throw new Error(address + ' is not a valid IPv6 address');\n    }\n\n    for (var i = 0; i < ipArr.length; i++) {\n      var parsedHextet = goog.math.Integer.fromString(ipArr[i], 16);\n      if (parsedHextet.lessThan(goog.math.Integer.ZERO) ||\n          parsedHextet.greaterThan(goog.net.Ipv6Address.MAX_HEXTET_VALUE_)) {\n        throw new Error(\n            ipArr[i] + ' in ' + address + ' is not a valid hextet.');\n      }\n      ip = ip.shiftLeft(16).or(parsedHextet);\n    }\n  }\n  goog.net.Ipv6Address.base(\n      this, 'constructor', /** @type {!goog.math.Integer} */ (ip), 6);\n};\ngoog.inherits(goog.net.Ipv6Address, goog.net.IpAddress);\n\n\n/**\n * Regular expression matching all allowed chars for an IPv6.\n * @type {RegExp}\n * @private\n * @const\n */\ngoog.net.Ipv6Address.REGEX_ = /^([a-fA-F0-9]*:){2}[a-fA-F0-9:.]*$/;\n\n\n/**\n * The Maximum length for a netmask (aka, the number of bits for IPv6).\n * @type {number}\n * @const\n */\ngoog.net.Ipv6Address.MAX_NETMASK_LENGTH = 128;\n\n\n/**\n * The maximum value of a hextet.\n * @type {goog.math.Integer}\n * @private\n * @const\n */\ngoog.net.Ipv6Address.MAX_HEXTET_VALUE_ = goog.math.Integer.fromInt(65535);\n\n\n/**\n * The Maximum address possible for IPv6.\n * @type {goog.math.Integer}\n * @private\n * @const\n */\ngoog.net.Ipv6Address.MAX_ADDRESS_ =\n    goog.math.Integer.ONE.shiftLeft(goog.net.Ipv6Address.MAX_NETMASK_LENGTH)\n        .subtract(goog.math.Integer.ONE);\n\n\n/**\n * @override\n */\ngoog.net.Ipv6Address.prototype.toString = function() {\n  if (this.ipStr_) {\n    return this.ipStr_;\n  }\n\n  var outputArr = [];\n  for (var i = 3; i >= 0; i--) {\n    var bits = this.ip_.getBitsUnsigned(i);\n    var firstHextet = bits >>> 16;\n    var secondHextet = bits & 0xffff;\n    outputArr.push(firstHextet.toString(16));\n    outputArr.push(secondHextet.toString(16));\n  }\n\n  outputArr = goog.net.Ipv6Address.compress_(outputArr);\n  this.ipStr_ = outputArr.join(':');\n  return this.ipStr_;\n};\n\n\n/**\n * @override\n */\ngoog.net.Ipv6Address.prototype.toUriString = function() {\n  return '[' + this.toString() + ']';\n};\n\n\n/**\n * @override\n */\ngoog.net.Ipv6Address.prototype.isSiteLocal = function() {\n  // Check for prefix fd00::/8.\n  var firstDWord = this.ip_.getBitsUnsigned(3);\n  var firstHextet = firstDWord >>> 16;\n  return (firstHextet & 0xff00) == 0xfd00;\n};\n\n\n/**\n * @override\n */\ngoog.net.Ipv6Address.prototype.isLinkLocal = function() {\n  // Check for prefix fe80::/10.\n  var firstDWord = this.ip_.getBitsUnsigned(3);\n  var firstHextet = firstDWord >>> 16;\n  return (firstHextet & 0xffc0) == 0xfe80;\n};\n\n\n/**\n * This method is in charge of expanding/exploding an IPv6 string from its\n * compressed form.\n * @private\n * @param {!Array<string>} address An IPv6 address split around '::'.\n * @return {!Array<string>} The expanded version of the IPv6.\n */\ngoog.net.Ipv6Address.explode_ = function(address) {\n  var basePart = address[0].split(':');\n  var secondPart = address[1].split(':');\n\n  if (basePart.length == 1 && basePart[0] == '') {\n    basePart = [];\n  }\n  if (secondPart.length == 1 && secondPart[0] == '') {\n    secondPart = [];\n  }\n\n  // Now we fill the gap with 0.\n  var gap = 8 - (basePart.length + secondPart.length);\n\n  if (gap < 1) {\n    return [];\n  }\n\n  return goog.array.join(basePart, goog.array.repeat('0', gap), secondPart);\n};\n\n\n/**\n * This method is in charge of compressing an expanded IPv6 array of hextets.\n * @private\n * @param {!Array<string>} hextets The array of hextet.\n * @return {!Array<string>} The compressed version of this array.\n */\ngoog.net.Ipv6Address.compress_ = function(hextets) {\n  var bestStart = -1;\n  var start = -1;\n  var bestSize = 0;\n  var size = 0;\n  for (var i = 0; i < hextets.length; i++) {\n    if (hextets[i] == '0') {\n      size++;\n      if (start == -1) {\n        start = i;\n      }\n      if (size > bestSize) {\n        bestSize = size;\n        bestStart = start;\n      }\n    } else {\n      start = -1;\n      size = 0;\n    }\n  }\n\n  if (bestSize > 0) {\n    if ((bestStart + bestSize) == hextets.length) {\n      hextets.push('');\n    }\n    hextets.splice(bestStart, bestSize, '');\n\n    if (bestStart == 0) {\n      hextets = [''].concat(hextets);\n    }\n  }\n  return hextets;\n};\n\n\n/**\n * This method will convert an IPv4 to a list of 2 hextets.\n *\n * For instance, 1.2.3.4 will be converted to ['0102', '0304'].\n * @private\n * @param {string} quads An IPv4 as a string.\n * @return {!Array<string>} A list of 2 hextets.\n */\ngoog.net.Ipv6Address.dottedQuadtoHextets_ = function(quads) {\n  var ip4 = new goog.net.Ipv4Address(quads).toInteger();\n  var bits = ip4.getBitsUnsigned(0);\n  var hextets = [];\n\n  hextets.push(((bits >>> 16) & 0xffff).toString(16));\n  hextets.push((bits & 0xffff).toString(16));\n\n  return hextets;\n};\n\n\n/**\n * @return {boolean} true if the IPv6 contains a mapped IPv4.\n */\ngoog.net.Ipv6Address.prototype.isMappedIpv4Address = function() {\n  return (\n      this.ip_.getBitsUnsigned(3) == 0 && this.ip_.getBitsUnsigned(2) == 0 &&\n      this.ip_.getBitsUnsigned(1) == 0xffff);\n};\n\n\n/**\n * Will return the mapped IPv4 address in this IPv6 address.\n * @return {goog.net.Ipv4Address} an IPv4 or null.\n */\ngoog.net.Ipv6Address.prototype.getMappedIpv4Address = function() {\n  if (!this.isMappedIpv4Address()) {\n    return null;\n  }\n\n  var newIpv4 = new goog.math.Integer([this.ip_.getBitsUnsigned(0)], 0);\n  return new goog.net.Ipv4Address(newIpv4);\n};\n","^9I",1579837703000,"^9J",["^9K",["^9L","^9>","^;P","^;F","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/ipaddress.js"],"^:1",["^9K",["~$goog.net.IpAddress","~$goog.net.Ipv6Address","~$goog.net.Ipv4Address"]],"^9<",true,"^9=",["^9>","^;9","^;F","^;P","^9L"]],["^ ","^9A",[1579837703000],"^9B","goog.db.keyrange.js","^9C",["^9D","goog/db/keyrange.js"],"^9E","goog/db/keyrange.js","^9F","^9G","^9H","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Wrapper for a IndexedDB key range.\n *\n */\n\n\ngoog.provide('goog.db.KeyRange');\n\n\n\n/**\n * Creates a new IDBKeyRange wrapper object. Should not be created directly,\n * instead use one of the static factory methods. For example:\n * @see goog.db.KeyRange.bound\n * @see goog.db.KeyRange.lowerBound\n *\n * @param {!IDBKeyRange} range Underlying IDBKeyRange object.\n * @constructor\n * @final\n */\ngoog.db.KeyRange = function(range) {\n  /**\n   * Underlying IDBKeyRange object.\n   *\n   * @type {!IDBKeyRange}\n   * @private\n   */\n  this.range_ = range;\n};\n\n\n/**\n * The IDBKeyRange.\n * @type {!Object}\n * @private\n */\ngoog.db.KeyRange.IDB_KEY_RANGE_ =\n    goog.global.IDBKeyRange || goog.global.webkitIDBKeyRange;\n\n\n/**\n * Creates a new key range for a single value.\n * @param {IDBKeyType} key The single value in the range.\n * @return {!goog.db.KeyRange} The key range.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.db.KeyRange.only = function(key) {\n  return new goog.db.KeyRange(goog.db.KeyRange.IDB_KEY_RANGE_.only(key));\n};\n\n\n/**\n * Creates a key range with upper and lower bounds.\n * @param {IDBKeyType} lower The value of the lower bound.\n * @param {IDBKeyType} upper The value of the upper bound.\n * @param {boolean=} opt_lowerOpen If true, the range excludes the lower bound\n *     value.\n * @param {boolean=} opt_upperOpen If true, the range excludes the upper bound\n *     value.\n * @return {!goog.db.KeyRange} The key range.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.db.KeyRange.bound = function(lower, upper, opt_lowerOpen, opt_upperOpen) {\n  return new goog.db.KeyRange(\n      goog.db.KeyRange.IDB_KEY_RANGE_.bound(\n          lower, upper, opt_lowerOpen, opt_upperOpen));\n};\n\n\n/**\n * Creates a key range with a lower bound only, finishes at the last record.\n * @param {IDBKeyType} lower The value of the lower bound.\n * @param {boolean=} opt_lowerOpen If true, the range excludes the lower bound\n *     value.\n * @return {!goog.db.KeyRange} The key range.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.db.KeyRange.lowerBound = function(lower, opt_lowerOpen) {\n  return new goog.db.KeyRange(\n      goog.db.KeyRange.IDB_KEY_RANGE_.lowerBound(lower, opt_lowerOpen));\n};\n\n\n/**\n * Creates a key range with a upper bound only, starts at the first record.\n * @param {IDBKeyType} upper The value of the upper bound.\n * @param {boolean=} opt_upperOpen If true, the range excludes the upper bound\n *     value.\n * @return {!goog.db.KeyRange} The key range.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.db.KeyRange.upperBound = function(upper, opt_upperOpen) {\n  return new goog.db.KeyRange(\n      goog.db.KeyRange.IDB_KEY_RANGE_.upperBound(upper, opt_upperOpen));\n};\n\n\n/**\n * Returns underlying key range object. This is used in ObjectStore's openCursor\n * and count methods.\n * @return {!IDBKeyRange}\n */\ngoog.db.KeyRange.prototype.range = function() {\n  return this.range_;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/db/keyrange.js"],"^:1",["^9K",["~$goog.db.KeyRange"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.useragent.keyboard.js","^9C",["^9D","goog/useragent/keyboard.js"],"^9E","goog/useragent/keyboard.js","^9F","^9G","^9H","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Constants for determining keyboard support.\n */\n\ngoog.provide('goog.userAgent.keyboard');\n\ngoog.require('goog.labs.userAgent.platform');\n\n\n/**\n * @define {boolean} Whether the user agent is running with in an environment\n * that should use Mac-based keyboard shortcuts (Meta instead of Ctrl, etc.).\n */\ngoog.userAgent.keyboard.ASSUME_MAC_KEYBOARD =\n    goog.define('goog.userAgent.keyboard.ASSUME_MAC_KEYBOARD', false);\n\n\n/**\n * Determines whether Mac-based keyboard shortcuts should be used.\n * @return {boolean}\n * @private\n */\ngoog.userAgent.keyboard.determineMacKeyboard_ = function() {\n  return goog.labs.userAgent.platform.isMacintosh() ||\n      goog.labs.userAgent.platform.isIos();\n};\n\n\n/**\n * Whether the user agent is running in an environment that uses Mac-based\n * keyboard shortcuts.\n * @type {boolean}\n */\ngoog.userAgent.keyboard.MAC_KEYBOARD =\n    goog.userAgent.keyboard.ASSUME_MAC_KEYBOARD ||\n    goog.userAgent.keyboard.determineMacKeyboard_();\n","^9I",1579837703000,"^9J",["^9K",["^9>","^S1"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/useragent/keyboard.js"],"^:1",["^9K",["~$goog.userAgent.keyboard"]],"^9<",true,"^9=",["^9>","^S1"]],["^ ","^9A",[1579837703000],"^9B","goog.net.xhrmanager.js","^9C",["^9D","goog/net/xhrmanager.js"],"^9E","goog/net/xhrmanager.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Manages a pool of XhrIo's. This handles all the details of\n * dealing with the XhrPool and provides a simple interface for sending requests\n * and managing events.\n *\n * This class supports queueing & prioritization of requests (XhrIoPool\n * handles this) and retrying of requests.\n *\n * The events fired by the XhrManager are an aggregation of the events of\n * each of its XhrIo objects (with some filtering, i.e., ERROR only called\n * when there are no more retries left). For this reason, all send requests have\n * to have an id, so that the user of this object can know which event is for\n * which request.\n *\n */\n\ngoog.provide('goog.net.XhrManager');\ngoog.provide('goog.net.XhrManager.Event');\ngoog.provide('goog.net.XhrManager.Request');\n\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.net.ErrorCode');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.XhrIo');\ngoog.require('goog.net.XhrIoPool');\ngoog.require('goog.structs.Map');\n\n// TODO(user): Add some time in between retries.\n\n\n\n/**\n * A manager of an XhrIoPool.\n * @param {number=} opt_maxRetries Max. number of retries (Default: 1).\n * @param {goog.structs.Map=} opt_headers Map of default headers to add to every\n *     request.\n * @param {number=} opt_minCount Min. number of objects (Default: 0).\n * @param {number=} opt_maxCount Max. number of objects (Default: 10).\n * @param {number=} opt_timeoutInterval Timeout (in ms) before aborting an\n *     attempt (Default: 0ms).\n * @param {boolean=} opt_withCredentials Add credentials to every request\n *     (Default: false).\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.net.XhrManager = function(\n    opt_maxRetries, opt_headers, opt_minCount, opt_maxCount,\n    opt_timeoutInterval, opt_withCredentials) {\n  goog.net.XhrManager.base(this, 'constructor');\n\n  /**\n   * Maximum number of retries for a given request\n   * @type {number}\n   * @private\n   */\n  this.maxRetries_ = (opt_maxRetries !== undefined) ? opt_maxRetries : 1;\n\n  /**\n   * Timeout interval for an attempt of a given request.\n   * @type {number}\n   * @private\n   */\n  this.timeoutInterval_ = (opt_timeoutInterval !== undefined) ?\n      Math.max(0, opt_timeoutInterval) :\n      0;\n\n  /**\n   * Add credentials to every request.\n   * @private {boolean}\n   */\n  this.withCredentials_ = !!opt_withCredentials;\n\n  /**\n   * The pool of XhrIo's to use.\n   * @type {goog.net.XhrIoPool}\n   * @private\n   */\n  this.xhrPool_ = new goog.net.XhrIoPool(\n      opt_headers, opt_minCount, opt_maxCount, opt_withCredentials);\n\n  /**\n   * Map of ID's to requests.\n   * @type {goog.structs.Map<string, !goog.net.XhrManager.Request>}\n   * @private\n   */\n  this.requests_ = new goog.structs.Map();\n\n  /**\n   * The event handler.\n   * @type {goog.events.EventHandler<!goog.net.XhrManager>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n};\ngoog.inherits(goog.net.XhrManager, goog.events.EventTarget);\n\n\n/**\n * Error to throw when a send is attempted with an ID that the manager already\n * has registered for another request.\n * @type {string}\n * @private\n */\ngoog.net.XhrManager.ERROR_ID_IN_USE_ = '[goog.net.XhrManager] ID in use';\n\n\n/**\n * The goog.net.EventType's to listen/unlisten for on the XhrIo object.\n * @type {Array<goog.net.EventType>}\n * @private\n */\ngoog.net.XhrManager.XHR_EVENT_TYPES_ = [\n  goog.net.EventType.READY, goog.net.EventType.COMPLETE,\n  goog.net.EventType.SUCCESS, goog.net.EventType.ERROR,\n  goog.net.EventType.ABORT, goog.net.EventType.TIMEOUT\n];\n\n\n/**\n * Sets the number of milliseconds after which an incomplete request will be\n * aborted. Zero means no timeout is set.\n * @param {number} ms Timeout interval in milliseconds; 0 means none.\n */\ngoog.net.XhrManager.prototype.setTimeoutInterval = function(ms) {\n  this.timeoutInterval_ = Math.max(0, ms);\n};\n\n\n/**\n * Returns the number of requests either in flight, or waiting to be sent.\n * The count will include the current request if used within a COMPLETE event\n * handler or callback.\n * @return {number} The number of requests in flight or pending send.\n */\ngoog.net.XhrManager.prototype.getOutstandingCount = function() {\n  return this.requests_.getCount();\n};\n\n\n/**\n * Returns an array of request ids that are either in flight, or waiting to\n * be sent. The id of the current request will be included if used within a\n * COMPLETE event handler or callback.\n * @return {!Array<string>} Request ids in flight or pending send.\n */\ngoog.net.XhrManager.prototype.getOutstandingRequestIds = function() {\n  return this.requests_.getKeys();\n};\n\n\n/**\n * Registers the given request to be sent. Throws an error if a request\n * already exists with the given ID.\n * NOTE: It is not sent immediately. It is buffered and will be sent when an\n * XhrIo object becomes available, taking into account the request's\n * priority. Note also that requests of equal priority are sent in an\n * implementation specific order - to get FIFO queue semantics use a\n * monotonically increasing priority for successive requests.\n * @param {string} id The id of the request.\n * @param {string} url Uri to make the request to.\n * @param {string=} opt_method Send method, default: GET.\n * @param {ArrayBuffer|ArrayBufferView|Blob|Document|FormData|string=}\n *     opt_content Post data.\n * @param {Object|goog.structs.Map=} opt_headers Map of headers to add to the\n *     request.\n * @param {number=} opt_priority The priority of the request. A smaller value\n *     means a higher priority.\n * @param {Function=} opt_callback Callback function for when request is\n *     complete. The only param is the event object from the COMPLETE event.\n * @param {number=} opt_maxRetries The maximum number of times the request\n *     should be retried.\n * @param {goog.net.XhrIo.ResponseType=} opt_responseType The response type of\n *     this request; defaults to goog.net.XhrIo.ResponseType.DEFAULT.\n * @param {boolean=} opt_withCredentials Add credentials to this request,\n *     default: false.\n * @return {!goog.net.XhrManager.Request} The queued request object.\n */\ngoog.net.XhrManager.prototype.send = function(\n    id, url, opt_method, opt_content, opt_headers, opt_priority, opt_callback,\n    opt_maxRetries, opt_responseType, opt_withCredentials) {\n  var requests = this.requests_;\n  // Check if there is already a request with the given id.\n  if (requests.get(id)) {\n    throw new Error(goog.net.XhrManager.ERROR_ID_IN_USE_);\n  }\n\n  // Make the Request object.\n  var request = new goog.net.XhrManager.Request(\n      url, goog.bind(this.handleEvent_, this, id), opt_method, opt_content,\n      opt_headers, opt_callback,\n      opt_maxRetries !== undefined ? opt_maxRetries : this.maxRetries_,\n      opt_responseType,\n      opt_withCredentials !== undefined ? opt_withCredentials :\n                                          this.withCredentials_);\n  this.requests_.set(id, request);\n\n  // Setup the callback for the pool.\n  var callback = goog.bind(this.handleAvailableXhr_, this, id);\n  this.xhrPool_.getObject(callback, opt_priority);\n\n  return request;\n};\n\n\n/**\n * Aborts the request associated with id.\n * @param {string} id The id of the request to abort.\n * @param {boolean=} opt_force If true, remove the id now so it can be reused.\n *     No events are fired and the callback is not called when forced.\n */\ngoog.net.XhrManager.prototype.abort = function(id, opt_force) {\n  var request = this.requests_.get(id);\n  if (request) {\n    var xhrIo = request.xhrIo;\n    request.setAborted(true);\n    if (opt_force) {\n      if (xhrIo) {\n        // We remove listeners to make sure nothing gets called if a new request\n        // with the same id is made.\n        this.removeXhrListener_(xhrIo, request.getXhrEventCallback());\n        goog.events.listenOnce(xhrIo, goog.net.EventType.READY, function() {\n          this.xhrPool_.releaseObject(xhrIo);\n        }, false, this);\n      }\n      this.requests_.remove(id);\n    }\n    if (xhrIo) {\n      xhrIo.abort();\n    }\n  }\n};\n\n\n/**\n * Handles when an XhrIo object becomes available. Sets up the events, fires\n * the READY event, and starts the process to send the request.\n * @param {string} id The id of the request the XhrIo is for.\n * @param {goog.net.XhrIo} xhrIo The available XhrIo object.\n * @private\n */\ngoog.net.XhrManager.prototype.handleAvailableXhr_ = function(id, xhrIo) {\n  var request = this.requests_.get(id);\n  // Make sure the request doesn't already have an XhrIo attached. This can\n  // happen if a forced abort occurs before an XhrIo is available, and a new\n  // request with the same id is made.\n  if (request && !request.xhrIo) {\n    this.addXhrListener_(xhrIo, request.getXhrEventCallback());\n\n    // Set properties for the XhrIo.\n    xhrIo.setTimeoutInterval(this.timeoutInterval_);\n    xhrIo.setResponseType(request.getResponseType());\n    xhrIo.setWithCredentials(request.getWithCredentials());\n\n    // Add a reference to the XhrIo object to the request.\n    request.xhrIo = xhrIo;\n\n    // Notify the listeners.\n    this.dispatchEvent(\n        new goog.net.XhrManager.Event(\n            goog.net.EventType.READY, this, id, xhrIo));\n\n    // Send the request.\n    this.retry_(id, xhrIo);\n\n    // If the request was aborted before it got an XhrIo object, abort it now.\n    if (request.getAborted()) {\n      xhrIo.abort();\n    }\n  } else {\n    // If the request has an XhrIo object already, or no request exists, just\n    // return the XhrIo back to the pool.\n    this.xhrPool_.releaseObject(xhrIo);\n  }\n};\n\n\n/**\n * Handles all events fired by the XhrIo object for a given request.\n * @param {string} id The id of the request.\n * @param {goog.events.Event} e The event.\n * @return {Object} The return value from the handler, if any.\n * @private\n */\ngoog.net.XhrManager.prototype.handleEvent_ = function(id, e) {\n  var xhrIo = /** @type {goog.net.XhrIo} */ (e.target);\n  switch (e.type) {\n    case goog.net.EventType.READY:\n      this.retry_(id, xhrIo);\n      break;\n\n    case goog.net.EventType.COMPLETE:\n      return this.handleComplete_(id, xhrIo, e);\n\n    case goog.net.EventType.SUCCESS:\n      this.handleSuccess_(id, xhrIo);\n      break;\n\n    // A timeout is handled like an error.\n    case goog.net.EventType.TIMEOUT:\n    case goog.net.EventType.ERROR:\n      this.handleError_(id, xhrIo);\n      break;\n\n    case goog.net.EventType.ABORT:\n      this.handleAbort_(id, xhrIo);\n      break;\n  }\n  return null;\n};\n\n\n/**\n * Attempts to retry the given request. If the request has already attempted\n * the maximum number of retries, then it removes the request and releases\n * the XhrIo object back into the pool.\n * @param {string} id The id of the request.\n * @param {goog.net.XhrIo} xhrIo The XhrIo object.\n * @private\n */\ngoog.net.XhrManager.prototype.retry_ = function(id, xhrIo) {\n  var request = this.requests_.get(id);\n\n  // If the request has not completed and it is below its max. retries.\n  if (request && !request.getCompleted() && !request.hasReachedMaxRetries()) {\n    request.increaseAttemptCount();\n    xhrIo.send(\n        request.getUrl(), request.getMethod(), request.getContent(),\n        request.getHeaders());\n  } else {\n    if (request) {\n      // Remove the events on the XhrIo objects.\n      this.removeXhrListener_(xhrIo, request.getXhrEventCallback());\n\n      // Remove the request.\n      this.requests_.remove(id);\n    }\n    // Release the XhrIo object back into the pool.\n    this.xhrPool_.releaseObject(xhrIo);\n  }\n};\n\n\n/**\n * Handles the complete of a request. Dispatches the COMPLETE event and sets the\n * the request as completed if the request has succeeded, or is done retrying.\n * @param {string} id The id of the request.\n * @param {goog.net.XhrIo} xhrIo The XhrIo object.\n * @param {goog.events.Event} e The original event.\n * @return {Object} The return value from the callback, if any.\n * @private\n */\ngoog.net.XhrManager.prototype.handleComplete_ = function(id, xhrIo, e) {\n  // Only if the request is done processing should a COMPLETE event be fired.\n  var request = this.requests_.get(id);\n  if (xhrIo.getLastErrorCode() == goog.net.ErrorCode.ABORT ||\n      xhrIo.isSuccess() || request.hasReachedMaxRetries()) {\n    this.dispatchEvent(\n        new goog.net.XhrManager.Event(\n            goog.net.EventType.COMPLETE, this, id, xhrIo));\n\n    // If the request exists, we mark it as completed and call the callback\n    if (request) {\n      request.setCompleted(true);\n      // Call the complete callback as if it was set as a COMPLETE event on the\n      // XhrIo directly.\n      if (request.getCompleteCallback()) {\n        return request.getCompleteCallback().call(xhrIo, e);\n      }\n    }\n  }\n  return null;\n};\n\n\n/**\n * Handles the abort of an underlying XhrIo object.\n * @param {string} id The id of the request.\n * @param {goog.net.XhrIo} xhrIo The XhrIo object.\n * @private\n */\ngoog.net.XhrManager.prototype.handleAbort_ = function(id, xhrIo) {\n  // Fire event.\n  // NOTE: The complete event should always be fired before the abort event, so\n  // the bulk of the work is done in handleComplete.\n  this.dispatchEvent(\n      new goog.net.XhrManager.Event(goog.net.EventType.ABORT, this, id, xhrIo));\n};\n\n\n/**\n * Handles the success of a request. Dispatches the SUCCESS event and sets the\n * the request as completed.\n * @param {string} id The id of the request.\n * @param {goog.net.XhrIo} xhrIo The XhrIo object.\n * @private\n */\ngoog.net.XhrManager.prototype.handleSuccess_ = function(id, xhrIo) {\n  // Fire event.\n  // NOTE: We don't release the XhrIo object from the pool here.\n  // It is released in the retry method, when we know it is back in the\n  // ready state.\n  this.dispatchEvent(\n      new goog.net.XhrManager.Event(\n          goog.net.EventType.SUCCESS, this, id, xhrIo));\n};\n\n\n/**\n * Handles the error of a request. If the request has not reach its maximum\n * number of retries, then it lets the request retry naturally (will let the\n * request hit the READY state). Else, it dispatches the ERROR event.\n * @param {string} id The id of the request.\n * @param {goog.net.XhrIo} xhrIo The XhrIo object.\n * @private\n */\ngoog.net.XhrManager.prototype.handleError_ = function(id, xhrIo) {\n  var request = this.requests_.get(id);\n\n  // If the maximum number of retries has been reached.\n  if (request.hasReachedMaxRetries()) {\n    // Fire event.\n    // NOTE: We don't release the XhrIo object from the pool here.\n    // It is released in the retry method, when we know it is back in the\n    // ready state.\n    this.dispatchEvent(\n        new goog.net.XhrManager.Event(\n            goog.net.EventType.ERROR, this, id, xhrIo));\n  }\n};\n\n\n/**\n * Remove listeners for XHR events on an XhrIo object.\n * @param {goog.net.XhrIo} xhrIo The object to stop listenening to events on.\n * @param {Function} func The callback to remove from event handling.\n * @param {string|Array<string>=} opt_types Event types to remove listeners\n *     for. Defaults to XHR_EVENT_TYPES_.\n * @private\n */\ngoog.net.XhrManager.prototype.removeXhrListener_ = function(\n    xhrIo, func, opt_types) {\n  var types = opt_types || goog.net.XhrManager.XHR_EVENT_TYPES_;\n  this.eventHandler_.unlisten(xhrIo, types, func);\n};\n\n\n/**\n * Adds a listener for XHR events on an XhrIo object.\n * @param {goog.net.XhrIo} xhrIo The object listen to events on.\n * @param {Function} func The callback when the event occurs.\n * @param {string|Array<string>=} opt_types Event types to attach listeners to.\n *     Defaults to XHR_EVENT_TYPES_.\n * @private\n */\ngoog.net.XhrManager.prototype.addXhrListener_ = function(\n    xhrIo, func, opt_types) {\n  var types = opt_types || goog.net.XhrManager.XHR_EVENT_TYPES_;\n  this.eventHandler_.listen(xhrIo, types, func);\n};\n\n\n/** @override */\ngoog.net.XhrManager.prototype.disposeInternal = function() {\n  goog.net.XhrManager.superClass_.disposeInternal.call(this);\n\n  this.xhrPool_.dispose();\n  this.xhrPool_ = null;\n\n  this.eventHandler_.dispose();\n  this.eventHandler_ = null;\n\n  this.requests_.clear();\n  this.requests_ = null;\n};\n\n\n\n/**\n * An event dispatched by XhrManager.\n *\n * @param {goog.net.EventType} type Event Type.\n * @param {goog.net.XhrManager} target Reference to the object that is the\n *     target of this event.\n * @param {string} id The id of the request this event is for.\n * @param {goog.net.XhrIo} xhrIo The XhrIo object of the request.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.net.XhrManager.Event = function(type, target, id, xhrIo) {\n  goog.events.Event.call(this, type, target);\n\n  /**\n   * The id of the request this event is for.\n   * @type {string}\n   */\n  this.id = id;\n\n  /**\n   * The XhrIo object of the request.\n   * @type {goog.net.XhrIo}\n   */\n  this.xhrIo = xhrIo;\n};\ngoog.inherits(goog.net.XhrManager.Event, goog.events.Event);\n\n\n\n/**\n * An encapsulation of everything needed to make a Xhr request.\n * NOTE: This is used internal to the XhrManager.\n *\n * @param {string} url Uri to make the request too.\n * @param {Function} xhrEventCallback Callback attached to the events of the\n *     XhrIo object of the request.\n * @param {string=} opt_method Send method, default: GET.\n * @param {ArrayBuffer|ArrayBufferView|Blob|Document|FormData|string=}\n *     opt_content Post data.\n * @param {Object|goog.structs.Map=} opt_headers Map of headers to add to the\n *     request.\n * @param {Function=} opt_callback Callback function for when request is\n *     complete. NOTE: Only 1 callback supported across all events.\n * @param {number=} opt_maxRetries The maximum number of times the request\n *     should be retried (Default: 1).\n * @param {goog.net.XhrIo.ResponseType=} opt_responseType The response type of\n *     this request; defaults to goog.net.XhrIo.ResponseType.DEFAULT.\n * @param {boolean=} opt_withCredentials Add credentials to this request,\n *     default: false.\n *\n * @constructor\n * @final\n */\ngoog.net.XhrManager.Request = function(\n    url, xhrEventCallback, opt_method, opt_content, opt_headers, opt_callback,\n    opt_maxRetries, opt_responseType, opt_withCredentials) {\n  /**\n   * Uri to make the request too.\n   * @type {string}\n   * @private\n   */\n  this.url_ = url;\n\n  /**\n   * Send method.\n   * @type {string}\n   * @private\n   */\n  this.method_ = opt_method || 'GET';\n\n  /**\n   * Post data.\n   * @type {ArrayBuffer|ArrayBufferView|Blob|Document|FormData|string|undefined}\n   * @private\n   */\n  this.content_ = opt_content;\n\n  /**\n   *  Map of headers\n   * @type {Object|goog.structs.Map|null}\n   * @private\n   */\n  this.headers_ = opt_headers || null;\n\n  /**\n   * The maximum number of times the request should be retried.\n   * @type {number}\n   * @private\n   */\n  this.maxRetries_ = (opt_maxRetries !== undefined) ? opt_maxRetries : 1;\n\n  /**\n   * The number of attempts  so far.\n   * @type {number}\n   * @private\n   */\n  this.attemptCount_ = 0;\n\n  /**\n   * Whether the request has been completed.\n   * @type {boolean}\n   * @private\n   */\n  this.completed_ = false;\n\n  /**\n   * Whether the request has been aborted.\n   * @type {boolean}\n   * @private\n   */\n  this.aborted_ = false;\n\n  /**\n   * Callback attached to the events of the XhrIo object.\n   * @type {Function}\n   * @private\n   */\n  this.xhrEventCallback_ = xhrEventCallback;\n\n  /**\n   * Callback function called when request is complete.\n   * @type {Function|undefined}\n   * @private\n   */\n  this.completeCallback_ = opt_callback;\n\n  /**\n   * A response type to set on this.xhrIo when it's populated.\n   * @type {!goog.net.XhrIo.ResponseType}\n   * @private\n   */\n  this.responseType_ = opt_responseType || goog.net.XhrIo.ResponseType.DEFAULT;\n\n  /**\n   * Send credentials with this request, or not.\n   * @private {boolean}\n   */\n  this.withCredentials_ = !!opt_withCredentials;\n\n  /**\n   * The XhrIo instance handling this request. Set in handleAvailableXhr.\n   * @type {?goog.net.XhrIo}\n   */\n  this.xhrIo = null;\n\n};\n\n\n/**\n * Gets the uri.\n * @return {string} The uri to make the request to.\n */\ngoog.net.XhrManager.Request.prototype.getUrl = function() {\n  return this.url_;\n};\n\n\n/**\n * Gets the send method.\n * @return {string} The send method.\n */\ngoog.net.XhrManager.Request.prototype.getMethod = function() {\n  return this.method_;\n};\n\n\n/**\n * Gets the post data.\n * @return {ArrayBuffer|ArrayBufferView|Blob|Document|FormData|string|undefined}\n *     The post data.\n */\ngoog.net.XhrManager.Request.prototype.getContent = function() {\n  return this.content_;\n};\n\n\n/**\n * Gets the map of headers.\n * @return {Object|goog.structs.Map} The map of headers.\n */\ngoog.net.XhrManager.Request.prototype.getHeaders = function() {\n  return this.headers_;\n};\n\n\n/**\n * Gets the withCredentials flag.\n * @return {boolean} Add credentials, or not.\n */\ngoog.net.XhrManager.Request.prototype.getWithCredentials = function() {\n  return this.withCredentials_;\n};\n\n\n/**\n * Gets the maximum number of times the request should be retried.\n * @return {number} The maximum number of times the request should be retried.\n */\ngoog.net.XhrManager.Request.prototype.getMaxRetries = function() {\n  return this.maxRetries_;\n};\n\n\n/**\n * Gets the number of attempts so far.\n * @return {number} The number of attempts so far.\n */\ngoog.net.XhrManager.Request.prototype.getAttemptCount = function() {\n  return this.attemptCount_;\n};\n\n\n/**\n * Increases the number of attempts so far.\n */\ngoog.net.XhrManager.Request.prototype.increaseAttemptCount = function() {\n  this.attemptCount_++;\n};\n\n\n/**\n * Returns whether the request has reached the maximum number of retries.\n * @return {boolean} Whether the request has reached the maximum number of\n *     retries.\n */\ngoog.net.XhrManager.Request.prototype.hasReachedMaxRetries = function() {\n  return this.attemptCount_ > this.maxRetries_;\n};\n\n\n/**\n * Sets the completed status.\n * @param {boolean} complete The completed status.\n */\ngoog.net.XhrManager.Request.prototype.setCompleted = function(complete) {\n  this.completed_ = complete;\n};\n\n\n/**\n * Gets the completed status.\n * @return {boolean} The completed status.\n */\ngoog.net.XhrManager.Request.prototype.getCompleted = function() {\n  return this.completed_;\n};\n\n\n/**\n * Sets the aborted status.\n * @param {boolean} aborted True if the request was aborted, otherwise False.\n */\ngoog.net.XhrManager.Request.prototype.setAborted = function(aborted) {\n  this.aborted_ = aborted;\n};\n\n\n/**\n * Gets the aborted status.\n * @return {boolean} True if request was aborted, otherwise False.\n */\ngoog.net.XhrManager.Request.prototype.getAborted = function() {\n  return this.aborted_;\n};\n\n\n/**\n * Gets the callback attached to the events of the XhrIo object.\n * @return {Function} The callback attached to the events of the\n *     XhrIo object.\n */\ngoog.net.XhrManager.Request.prototype.getXhrEventCallback = function() {\n  return this.xhrEventCallback_;\n};\n\n\n/**\n * Gets the callback for when the request is complete.\n * @return {Function|undefined} The callback for when the request is complete.\n */\ngoog.net.XhrManager.Request.prototype.getCompleteCallback = function() {\n  return this.completeCallback_;\n};\n\n\n/**\n * Gets the response type that will be set on this request's XhrIo when it's\n * available.\n * @return {!goog.net.XhrIo.ResponseType} The response type to be set\n *     when an XhrIo becomes available to this request.\n */\ngoog.net.XhrManager.Request.prototype.getResponseType = function() {\n  return this.responseType_;\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.net.XhrIoPool","^>;","^;N","^=[","^9>","^:L","^>0","^;8","^:N","^>3"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/xhrmanager.js"],"^:1",["^9K",["~$goog.net.XhrManager","~$goog.net.XhrManager.Event","~$goog.net.XhrManager.Request"]],"^9<",true,"^9=",["^9>","^:N","^;8","^>;","^:L","^>3","^>0","^;N","^U6","^=["]],["^ ","^9A",[1579837703000],"^9B","goog.ui.charpicker.js","^9C",["^9D","goog/ui/charpicker.js"],"^9E","goog/ui/charpicker.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Character Picker widget for picking any Unicode character.\n *\n * @see ../demos/charpicker.html\n */\n\ngoog.provide('goog.ui.CharPicker');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.InputHandler');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.events.KeyHandler');\ngoog.require('goog.i18n.CharListDecompressor');\ngoog.require('goog.i18n.CharPickerData');\ngoog.require('goog.i18n.uChar');\ngoog.require('goog.i18n.uChar.NameFetcher');\ngoog.require('goog.structs.Set');\ngoog.require('goog.style');\ngoog.require('goog.ui.Button');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.ContainerScroller');\ngoog.require('goog.ui.FlatButtonRenderer');\ngoog.require('goog.ui.HoverCard');\ngoog.require('goog.ui.LabelInput');\ngoog.require('goog.ui.Menu');\ngoog.require('goog.ui.MenuButton');\ngoog.require('goog.ui.MenuItem');\ngoog.require('goog.ui.Tooltip');\n\n\n\n/**\n * Character Picker Class. This widget can be used to pick any Unicode\n * character by traversing a category-subcategory structure or by inputing its\n * hex value.\n *\n * See charpicker.html demo for example usage.\n * @param {goog.i18n.CharPickerData} charPickerData Category names and charlist.\n * @param {!goog.i18n.uChar.NameFetcher} charNameFetcher Object which fetches\n *     the names of the characters that are shown in the widget. These names\n *     may be stored locally or come from an external source.\n * @param {Array<string>=} opt_recents List of characters to be displayed in\n *     resently selected characters area.\n * @param {number=} opt_initCategory Sequence number of initial category.\n * @param {number=} opt_initSubcategory Sequence number of initial subcategory.\n * @param {number=} opt_rowCount Number of rows in the grid.\n * @param {number=} opt_columnCount Number of columns in the grid.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.Component}\n * @final\n */\ngoog.ui.CharPicker = function(\n    charPickerData, charNameFetcher, opt_recents, opt_initCategory,\n    opt_initSubcategory, opt_rowCount, opt_columnCount, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * Object used to retrieve character names.\n   * @type {!goog.i18n.uChar.NameFetcher}\n   * @private\n   */\n  this.charNameFetcher_ = charNameFetcher;\n\n  /**\n   * Object containing character lists and category names.\n   * @type {goog.i18n.CharPickerData}\n   * @private\n   */\n  this.data_ = charPickerData;\n\n  /**\n   * The category number to be used on widget init.\n   * @type {number}\n   * @private\n   */\n  this.initCategory_ = opt_initCategory || 0;\n\n  /**\n   * The subcategory number to be used on widget init.\n   * @type {number}\n   * @private\n   */\n  this.initSubcategory_ = opt_initSubcategory || 0;\n\n  /**\n   * Number of columns in the grid.\n   * @type {number}\n   * @private\n   */\n  this.columnCount_ = opt_columnCount || 10;\n\n  /**\n   * Number of entries to be added to the grid.\n   * @type {number}\n   * @private\n   */\n  this.gridsize_ = (opt_rowCount || 10) * this.columnCount_;\n\n  /**\n   * Number of the recently selected characters displayed.\n   * @type {number}\n   * @private\n   */\n  this.recentwidth_ = this.columnCount_ + 1;\n\n  /**\n   * List of recently used characters.\n   * @type {Array<string>}\n   * @private\n   */\n  this.recents_ = opt_recents || [];\n\n  /**\n   * Handler for events.\n   * @type {goog.events.EventHandler<!goog.ui.CharPicker>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  /**\n   * Decompressor used to get the list of characters from a base88 encoded\n   * character list.\n   * @type {Object}\n   * @private\n   */\n  this.decompressor_ = new goog.i18n.CharListDecompressor();\n};\ngoog.inherits(goog.ui.CharPicker, goog.ui.Component);\n\n\n/**\n * The last selected character.\n * @type {?string}\n * @private\n */\ngoog.ui.CharPicker.prototype.selectedChar_ = null;\n\n\n/**\n * Set of formatting characters whose display need to be swapped with nbsp\n * to prevent layout issues.\n * @type {?goog.structs.Set}\n * @private\n */\ngoog.ui.CharPicker.prototype.layoutAlteringChars_ = null;\n\n\n/**\n * The top category menu.\n * @type {?goog.ui.Menu}\n * @private\n */\ngoog.ui.CharPicker.prototype.menu_ = null;\n\n\n/**\n * The top category menu button.\n * @type {?goog.ui.MenuButton}\n * @private\n */\ngoog.ui.CharPicker.prototype.menubutton_ = null;\n\n\n/**\n * The subcategory menu.\n * @type {?goog.ui.Menu}\n * @private\n */\ngoog.ui.CharPicker.prototype.submenu_ = null;\n\n\n/**\n * The subcategory menu button.\n * @type {?goog.ui.MenuButton}\n * @private\n */\ngoog.ui.CharPicker.prototype.submenubutton_ = null;\n\n\n/** @type {number} */\ngoog.ui.CharPicker.prototype.itempos;\n\n\n/** @type {!Array<string>} */\ngoog.ui.CharPicker.prototype.items;\n\n\n/** @private {!goog.events.KeyHandler} */\ngoog.ui.CharPicker.prototype.keyHandler_;\n\n\n/**\n * Category index used to index the data tables.\n * @type {number}\n */\ngoog.ui.CharPicker.prototype.category;\n\n\n/** @private {?Element} */\ngoog.ui.CharPicker.prototype.stick_ = null;\n\n\n/**\n * The element representing the number of rows visible in the grid.\n * This along with goog.ui.CharPicker.stick_ would help to create a scrollbar\n * of right size.\n * @type {?HTMLElement}\n * @private\n */\ngoog.ui.CharPicker.prototype.stickwrap_ = null;\n\n\n/**\n * The component containing all the buttons for each character in display.\n * @type {?goog.ui.Component}\n * @private\n */\ngoog.ui.CharPicker.prototype.grid_ = null;\n\n\n/**\n * The component used for extra information about the character set displayed.\n * @type {?goog.ui.Component}\n * @private\n */\ngoog.ui.CharPicker.prototype.notice_ = null;\n\n\n/**\n * Grid displaying recently selected characters.\n * @type {?goog.ui.Component}\n * @private\n */\ngoog.ui.CharPicker.prototype.recentgrid_ = null;\n\n\n/**\n * Input field for entering the hex value of the character.\n * @type {?goog.ui.Component}\n * @private\n */\ngoog.ui.CharPicker.prototype.input_ = null;\n\n\n/**\n * OK button for entering hex value of the character.\n * @private {?goog.ui.Button}\n */\ngoog.ui.CharPicker.prototype.okbutton_ = null;\n\n\n/**\n * Element displaying character name in preview.\n * @type {?Element}\n * @private\n */\ngoog.ui.CharPicker.prototype.charNameEl_ = null;\n\n\n/**\n * Element displaying character in preview.\n * @type {?Element}\n * @private\n */\ngoog.ui.CharPicker.prototype.zoomEl_ = null;\n\n\n/**\n * Element displaying character number (codepoint) in preview.\n * @type {?Element}\n * @private\n */\ngoog.ui.CharPicker.prototype.unicodeEl_ = null;\n\n\n/**\n * Hover card for displaying the preview of a character.\n * Preview would contain character in large size and its U+ notation. It would\n * also display the name, if available.\n * @type {?goog.ui.HoverCard}\n * @private\n */\ngoog.ui.CharPicker.prototype.hc_ = null;\n\n\n/**\n * Gets the last selected character.\n * @return {?string} The last selected character.\n */\ngoog.ui.CharPicker.prototype.getSelectedChar = function() {\n  return this.selectedChar_;\n};\n\n\n/**\n * Gets the list of characters user selected recently.\n * @return {Array<string>} The recent character list.\n */\ngoog.ui.CharPicker.prototype.getRecentChars = function() {\n  return this.recents_;\n};\n\n\n/** @override */\ngoog.ui.CharPicker.prototype.createDom = function() {\n  goog.ui.CharPicker.superClass_.createDom.call(this);\n\n  this.decorateInternal(\n      this.getDomHelper().createElement(goog.dom.TagName.DIV));\n};\n\n\n/** @override */\ngoog.ui.CharPicker.prototype.disposeInternal = function() {\n  goog.dispose(this.hc_);\n  this.hc_ = null;\n  goog.dispose(this.eventHandler_);\n  this.eventHandler_ = null;\n  goog.ui.CharPicker.superClass_.disposeInternal.call(this);\n};\n\n\n/** @override */\ngoog.ui.CharPicker.prototype.decorateInternal = function(element) {\n  goog.ui.CharPicker.superClass_.decorateInternal.call(this, element);\n\n  // The chars below cause layout disruption or too narrow to hover:\n  // \\u0020, \\u00AD, \\u2000 - \\u200f, \\u2028 - \\u202f, \\u3000, \\ufeff\n  var chrs = this.decompressor_.toCharList(':2%C^O80V1H2s2G40Q%s0');\n  this.layoutAlteringChars_ = new goog.structs.Set(chrs);\n\n  this.menu_ = new goog.ui.Menu(this.getDomHelper());\n\n  var categories = this.data_.categories;\n  for (var i = 0; i < this.data_.categories.length; i++) {\n    this.menu_.addChild(this.createMenuItem_(i, categories[i]), true);\n  }\n\n  this.menubutton_ = new goog.ui.MenuButton(\n      'Category Menu', this.menu_,\n      /* opt_renderer */ undefined, this.getDomHelper());\n  this.addChild(this.menubutton_, true);\n\n  this.submenu_ = new goog.ui.Menu(this.getDomHelper());\n\n  this.submenubutton_ = new goog.ui.MenuButton(\n      'Subcategory Menu', this.submenu_, /* opt_renderer */ undefined,\n      this.getDomHelper());\n  this.addChild(this.submenubutton_, true);\n\n  // The containing component for grid component and the scroller.\n  var gridcontainer = new goog.ui.Component(this.getDomHelper());\n  this.addChild(gridcontainer, true);\n\n  var stickwrap = new goog.ui.Component(this.getDomHelper());\n  gridcontainer.addChild(stickwrap, true);\n  this.stickwrap_ = /** @type {!HTMLElement} */ (stickwrap.getElement());\n\n  var stick = new goog.ui.Component(this.getDomHelper());\n  stickwrap.addChild(stick, true);\n  this.stick_ = stick.getElement();\n\n  this.grid_ = new goog.ui.Component(this.getDomHelper());\n  gridcontainer.addChild(this.grid_, true);\n\n  this.notice_ = new goog.ui.Component(this.getDomHelper());\n  this.notice_.setElementInternal(\n      this.getDomHelper().createDom(goog.dom.TagName.DIV));\n  this.addChild(this.notice_, true);\n\n  // The component used for displaying 'Recent Selections' label.\n  /**\n   * @desc The text label above the list of recently selected characters.\n   */\n  var MSG_CHAR_PICKER_RECENT_SELECTIONS = goog.getMsg('Recent Selections:');\n  var recenttext = new goog.ui.Component(this.getDomHelper());\n  recenttext.setElementInternal(\n      this.getDomHelper().createDom(\n          goog.dom.TagName.SPAN, null, MSG_CHAR_PICKER_RECENT_SELECTIONS));\n  this.addChild(recenttext, true);\n\n  this.recentgrid_ = new goog.ui.Component(this.getDomHelper());\n  this.addChild(this.recentgrid_, true);\n\n  // The component used for displaying 'U+'.\n  var uplus = new goog.ui.Component(this.getDomHelper());\n  uplus.setElementInternal(\n      this.getDomHelper().createDom(goog.dom.TagName.SPAN, null, 'U+'));\n  this.addChild(uplus, true);\n\n  /**\n   * @desc The text inside the input box to specify the hex code of a character.\n   */\n  var MSG_CHAR_PICKER_HEX_INPUT = goog.getMsg('Hex Input');\n  this.input_ =\n      new goog.ui.LabelInput(MSG_CHAR_PICKER_HEX_INPUT, this.getDomHelper());\n  this.addChild(this.input_, true);\n\n  this.okbutton_ = new goog.ui.Button(\n      'OK', /* opt_renderer */ undefined, this.getDomHelper());\n  this.addChild(this.okbutton_, true);\n  this.okbutton_.setEnabled(false);\n\n  this.zoomEl_ = this.getDomHelper().createDom(\n      goog.dom.TagName.DIV,\n      {id: 'zoom', className: goog.getCssName('goog-char-picker-char-zoom')});\n\n  this.charNameEl_ = this.getDomHelper().createDom(\n      goog.dom.TagName.DIV,\n      {id: 'charName', className: goog.getCssName('goog-char-picker-name')});\n\n  this.unicodeEl_ = this.getDomHelper().createDom(\n      goog.dom.TagName.DIV,\n      {id: 'unicode', className: goog.getCssName('goog-char-picker-unicode')});\n\n  var card = this.getDomHelper().createDom(\n      goog.dom.TagName.DIV, {'id': 'preview'}, this.zoomEl_, this.charNameEl_,\n      this.unicodeEl_);\n  goog.style.setElementShown(card, false);\n  this.hc_ = new goog.ui.HoverCard(\n      {'DIV': 'char'},\n      /* opt_checkDescendants */ undefined, this.getDomHelper());\n  this.hc_.setElement(card);\n  var self = this;\n\n  /**\n   * Function called by hover card just before it is visible to collect data.\n   */\n  function onBeforeShow() {\n    var trigger = self.hc_.getAnchorElement();\n    var ch = self.getChar_(trigger);\n    if (ch) {\n      goog.dom.setTextContent(self.zoomEl_, self.displayChar_(ch));\n      goog.dom.setTextContent(self.unicodeEl_, goog.i18n.uChar.toHexString(ch));\n      // Clear the character name since we don't want to show old data because\n      // it is retrieved asynchronously and the DOM object is re-used\n      goog.dom.setTextContent(self.charNameEl_, '');\n      self.charNameFetcher_.getName(ch, function(charName) {\n        if (charName) {\n          goog.dom.setTextContent(self.charNameEl_, charName);\n        }\n      });\n    }\n  }\n\n  goog.events.listen(\n      this.hc_, goog.ui.HoverCard.EventType.BEFORE_SHOW, onBeforeShow);\n  goog.asserts.assert(element);\n  goog.dom.classlist.add(element, goog.getCssName('goog-char-picker'));\n  goog.dom.classlist.add(\n      goog.asserts.assert(this.stick_), goog.getCssName('goog-stick'));\n  goog.dom.classlist.add(\n      goog.asserts.assert(this.stickwrap_), goog.getCssName('goog-stickwrap'));\n  goog.dom.classlist.add(\n      goog.asserts.assert(gridcontainer.getElement()),\n      goog.getCssName('goog-char-picker-grid-container'));\n  goog.dom.classlist.add(\n      goog.asserts.assert(this.grid_.getElement()),\n      goog.getCssName('goog-char-picker-grid'));\n  goog.dom.classlist.add(\n      goog.asserts.assert(this.recentgrid_.getElement()),\n      goog.getCssName('goog-char-picker-grid'));\n  goog.dom.classlist.add(\n      goog.asserts.assert(this.recentgrid_.getElement()),\n      goog.getCssName('goog-char-picker-recents'));\n\n  goog.dom.classlist.add(\n      goog.asserts.assert(this.notice_.getElement()),\n      goog.getCssName('goog-char-picker-notice'));\n  goog.dom.classlist.add(\n      goog.asserts.assert(uplus.getElement()),\n      goog.getCssName('goog-char-picker-uplus'));\n  goog.dom.classlist.add(\n      goog.asserts.assert(this.input_.getElement()),\n      goog.getCssName('goog-char-picker-input-box'));\n  goog.dom.classlist.add(\n      goog.asserts.assert(this.okbutton_.getElement()),\n      goog.getCssName('goog-char-picker-okbutton'));\n  goog.dom.classlist.add(\n      goog.asserts.assert(card), goog.getCssName('goog-char-picker-hovercard'));\n\n  this.hc_.className = goog.getCssName('goog-char-picker-hovercard');\n\n  this.grid_.buttoncount = this.gridsize_;\n  this.recentgrid_.buttoncount = this.recentwidth_;\n  this.populateGridWithButtons_(this.grid_);\n  this.populateGridWithButtons_(this.recentgrid_);\n\n  this.updateGrid_(this.recentgrid_, this.recents_);\n  this.setSelectedCategory_(this.initCategory_, this.initSubcategory_);\n  new goog.ui.ContainerScroller(this.menu_);\n  new goog.ui.ContainerScroller(this.submenu_);\n\n  goog.dom.classlist.add(\n      goog.asserts.assert(this.menu_.getElement()),\n      goog.getCssName('goog-char-picker-menu'));\n  goog.dom.classlist.add(\n      goog.asserts.assert(this.submenu_.getElement()),\n      goog.getCssName('goog-char-picker-menu'));\n};\n\n\n/** @override */\ngoog.ui.CharPicker.prototype.enterDocument = function() {\n  goog.ui.CharPicker.superClass_.enterDocument.call(this);\n  var inputkh = new goog.events.InputHandler(this.input_.getElement());\n  this.keyHandler_ = new goog.events.KeyHandler(this.input_.getElement());\n\n  // Stop the propagation of ACTION events at menu and submenu buttons.\n  // If stopped at capture phase, the button will not be set to normal state.\n  // If not stopped, the user widget will receive the event, which is\n  // undesired. User widget should receive an event only on the character\n  // click.\n  this.eventHandler_\n      .listen(\n          this.menubutton_, goog.ui.Component.EventType.ACTION,\n          goog.events.Event.stopPropagation)\n      .listen(\n          this.submenubutton_, goog.ui.Component.EventType.ACTION,\n          goog.events.Event.stopPropagation)\n      .listen(\n          this, goog.ui.Component.EventType.ACTION, this.handleSelectedItem_,\n          true)\n      .listen(\n          inputkh, goog.events.InputHandler.EventType.INPUT, this.handleInput_)\n      .listen(\n          this.keyHandler_, goog.events.KeyHandler.EventType.KEY,\n          this.handleEnter_)\n      .listen(\n          this.recentgrid_, goog.ui.Component.EventType.FOCUS,\n          this.handleFocus_)\n      .listen(this.grid_, goog.ui.Component.EventType.FOCUS, this.handleFocus_);\n\n  goog.events.listen(\n      this.okbutton_.getElement(), goog.events.EventType.MOUSEDOWN,\n      this.handleOkClick_, true, this);\n\n  goog.events.listen(\n      this.stickwrap_, goog.events.EventType.SCROLL, this.handleScroll_, true,\n      this);\n};\n\n\n/**\n * Handles the button focus by updating the aria label with the character name\n * so it becomes possible to get spoken feedback while tabbing through the\n * visible symbols.\n * @param {goog.events.Event} e The focus event.\n * @private\n */\ngoog.ui.CharPicker.prototype.handleFocus_ = function(e) {\n  var button = e.target;\n  var element = /** @type {!Element} */ (button.getElement());\n  var ch = this.getChar_(element);\n\n  // Clear the aria label to avoid speaking the old value in case the button\n  // element has no char attribute or the character name cannot be retrieved.\n  goog.a11y.aria.setState(element, goog.a11y.aria.State.LABEL, '');\n\n  if (ch) {\n    // This is working with screen readers because the call to getName is\n    // synchronous once the values have been prefetched by the RemoteNameFetcher\n    // and because it is always synchronous when using the LocalNameFetcher.\n    // Also, the special character itself is not used as the label because some\n    // screen readers, notably ChromeVox, are not able to speak them.\n    // TODO(user): Consider changing the NameFetcher API to provide a\n    // method that lets the caller retrieve multiple character names at once\n    // so that this asynchronous gymnastic can be avoided.\n    this.charNameFetcher_.getName(ch, function(charName) {\n      if (charName) {\n        goog.a11y.aria.setState(element, goog.a11y.aria.State.LABEL, charName);\n      }\n    });\n  }\n};\n\n\n/**\n * On scroll, updates the grid with characters correct to the scroll position.\n * @param {goog.events.Event} e Scroll event to handle.\n * @private\n */\ngoog.ui.CharPicker.prototype.handleScroll_ = function(e) {\n  var height = e.target.scrollHeight;\n  var top = e.target.scrollTop;\n  var itempos =\n      Math.ceil(top * this.items.length / (this.columnCount_ * height)) *\n      this.columnCount_;\n  if (this.itempos != itempos) {\n    this.itempos = itempos;\n    this.modifyGridWithItems_(this.grid_, this.items, itempos);\n  }\n  e.stopPropagation();\n};\n\n\n/**\n * On a menu click, sets correct character set in the grid; on a grid click\n * accept the character as the selected one and adds to recent selection, if not\n * already present.\n * @param {goog.events.Event} e Event for the click on menus or grid.\n * @private\n */\ngoog.ui.CharPicker.prototype.handleSelectedItem_ = function(e) {\n  var parent = /** @type {goog.ui.Component} */ (e.target).getParent();\n  if (parent == this.menu_) {\n    this.menu_.setVisible(false);\n    this.setSelectedCategory_(e.target.getValue());\n  } else if (parent == this.submenu_) {\n    this.submenu_.setVisible(false);\n    this.setSelectedSubcategory_(e.target.getValue());\n  } else if (parent == this.grid_) {\n    var button = e.target.getElement();\n    this.selectedChar_ = this.getChar_(button);\n    this.updateRecents_(this.selectedChar_);\n  } else if (parent == this.recentgrid_) {\n    this.selectedChar_ = this.getChar_(e.target.getElement());\n  }\n};\n\n\n/**\n * When user types the characters displays the preview. Enables the OK button,\n * if the character is valid.\n * @param {goog.events.Event} e Event for typing in input field.\n * @private\n */\ngoog.ui.CharPicker.prototype.handleInput_ = function(e) {\n  var ch = this.getInputChar();\n  if (ch) {\n    goog.dom.setTextContent(this.zoomEl_, ch);\n    goog.dom.setTextContent(this.unicodeEl_, goog.i18n.uChar.toHexString(ch));\n    goog.dom.setTextContent(this.charNameEl_, '');\n    var coord =\n        new goog.ui.Tooltip.ElementTooltipPosition(this.input_.getElement());\n    this.hc_.setPosition(coord);\n    this.hc_.triggerForElement(this.input_.getElement());\n    this.okbutton_.setEnabled(true);\n  } else {\n    this.hc_.cancelTrigger();\n    this.hc_.setVisible(false);\n    this.okbutton_.setEnabled(false);\n  }\n};\n\n\n/**\n * On OK click accepts the character and updates the recent char list.\n * @param {goog.events.Event=} opt_event Event for click on OK button.\n * @return {boolean} Indicates whether to propagate event.\n * @private\n */\ngoog.ui.CharPicker.prototype.handleOkClick_ = function(opt_event) {\n  var ch = this.getInputChar();\n  if (ch && ch.charCodeAt(0)) {\n    this.selectedChar_ = ch;\n    this.updateRecents_(ch);\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Behaves exactly like the OK button on Enter key.\n * @param {goog.events.KeyEvent} e Event for enter on the input field.\n * @return {boolean} Indicates whether to propagate event.\n * @private\n */\ngoog.ui.CharPicker.prototype.handleEnter_ = function(e) {\n  if (e.keyCode == goog.events.KeyCodes.ENTER) {\n    return this.handleOkClick_() ?\n        this.dispatchEvent(goog.ui.Component.EventType.ACTION) :\n        false;\n  }\n  return false;\n};\n\n\n/**\n * Gets the character from the event target.\n * @param {Element} e Event target containing the 'char' attribute.\n * @return {string} The character specified in the event.\n * @private\n */\ngoog.ui.CharPicker.prototype.getChar_ = function(e) {\n  return e.getAttribute('char');\n};\n\n\n/**\n * Creates a menu entry for either the category listing or subcategory listing.\n * @param {number} id Id to be used for the entry.\n * @param {string} caption Text displayed for the menu item.\n * @return {!goog.ui.MenuItem} Menu item to be added to the menu listing.\n * @private\n */\ngoog.ui.CharPicker.prototype.createMenuItem_ = function(id, caption) {\n  var item = new goog.ui.MenuItem(caption, /* model */ id, this.getDomHelper());\n  item.setVisible(true);\n  return item;\n};\n\n\n/**\n * Sets the category and updates the submenu items and grid accordingly.\n * @param {number} category Category index used to index the data tables.\n * @param {number=} opt_subcategory Subcategory index used with category index.\n * @private\n */\ngoog.ui.CharPicker.prototype.setSelectedCategory_ = function(\n    category, opt_subcategory) {\n  this.category = category;\n  this.menubutton_.setCaption(this.data_.categories[category]);\n  while (this.submenu_.hasChildren()) {\n    this.submenu_.removeChildAt(0, true).dispose();\n  }\n\n  var subcategories = this.data_.subcategories[category];\n  for (var i = 0; i < subcategories.length; i++) {\n    var item = this.createMenuItem_(i, subcategories[i]);\n    this.submenu_.addChild(item, true);\n  }\n  this.setSelectedSubcategory_(opt_subcategory || 0);\n};\n\n\n/**\n * Sets the subcategory and updates the grid accordingly.\n * @param {number} subcategory Sub-category index used to index the data tables.\n * @private\n */\ngoog.ui.CharPicker.prototype.setSelectedSubcategory_ = function(subcategory) {\n  var subcategories = this.data_.subcategories;\n  var name = subcategories[this.category][subcategory];\n  this.submenubutton_.setCaption(name);\n  this.setSelectedGrid_(this.category, subcategory);\n};\n\n\n/**\n * Updates the grid according to a given category and subcategory.\n * @param {number} category Index to the category table.\n * @param {number} subcategory Index to the subcategory table.\n * @private\n */\ngoog.ui.CharPicker.prototype.setSelectedGrid_ = function(\n    category, subcategory) {\n  var charLists = this.data_.charList;\n  var charListStr = charLists[category][subcategory];\n  var content = this.decompressor_.toCharList(charListStr);\n  this.charNameFetcher_.prefetch(charListStr);\n  this.updateGrid_(this.grid_, content);\n};\n\n\n/**\n * Updates the grid with new character list.\n * @param {goog.ui.Component} grid The grid which is updated with a new set of\n *     characters.\n * @param {Array<string>} items Characters to be added to the grid.\n * @private\n */\ngoog.ui.CharPicker.prototype.updateGrid_ = function(grid, items) {\n  if (grid == this.grid_) {\n    /**\n     * @desc The message used when there are invisible characters like space\n     *     or format control characters.\n     */\n    var MSG_PLEASE_HOVER =\n        goog.getMsg('Please hover over each cell for the character name.');\n\n    goog.dom.setTextContent(\n        this.notice_.getElement(),\n        this.charNameFetcher_.isNameAvailable(items[0]) ? MSG_PLEASE_HOVER :\n                                                          '');\n    this.items = items;\n    if (this.stickwrap_.offsetHeight > 0) {\n      this.stick_.style.height =\n          this.stickwrap_.offsetHeight * items.length / this.gridsize_ + 'px';\n    } else {\n      // This is the last ditch effort if height is not avaialble.\n      // Maximum of 3em is assumed to the the cell height. Extra space after\n      // last character in the grid is OK.\n      this.stick_.style.height =\n          3 * this.columnCount_ * items.length / this.gridsize_ + 'em';\n    }\n    this.stickwrap_.scrollTop = 0;\n  }\n\n  this.modifyGridWithItems_(grid, items, 0);\n};\n\n\n/**\n * Updates the grid with new character list for a given starting point.\n * @param {goog.ui.Component} grid The grid which is updated with a new set of\n *     characters.\n * @param {Array<string>} items Characters to be added to the grid.\n * @param {number} start The index from which the characters should be\n *     displayed.\n * @private\n */\ngoog.ui.CharPicker.prototype.modifyGridWithItems_ = function(\n    grid, items, start) {\n  for (var buttonpos = 0, itempos = start;\n       buttonpos < grid.buttoncount && itempos < items.length;\n       buttonpos++, itempos++) {\n    this.modifyCharNode_(\n        /** @type {!goog.ui.Button} */ (grid.getChildAt(buttonpos)),\n        items[itempos]);\n  }\n\n  for (; buttonpos < grid.buttoncount; buttonpos++) {\n    grid.getChildAt(buttonpos).setVisible(false);\n  }\n};\n\n\n/**\n * Creates the grid for characters to displayed for selection.\n * @param {goog.ui.Component} grid The grid which is updated with a new set of\n *     characters.\n * @private\n */\ngoog.ui.CharPicker.prototype.populateGridWithButtons_ = function(grid) {\n  for (var i = 0; i < grid.buttoncount; i++) {\n    var button = new goog.ui.Button(\n        ' ', goog.ui.FlatButtonRenderer.getInstance(), this.getDomHelper());\n\n    // Dispatch the focus event so we can update the aria description while\n    // the user tabs through the cells.\n    button.setDispatchTransitionEvents(goog.ui.Component.State.FOCUSED, true);\n\n    grid.addChild(button, true);\n    button.setVisible(false);\n\n    var buttonEl = button.getElement();\n    goog.asserts.assert(buttonEl, 'The button DOM element cannot be null.');\n\n    // Override the button role so the user doesn't hear \"button\" each time he\n    // tabs through the cells.\n    goog.a11y.aria.removeRole(buttonEl);\n  }\n};\n\n\n/**\n * Updates the grid cell with new character.\n * @param {goog.ui.Button} button This button is popped up for new character.\n * @param {string} ch Character to be displayed by the button.\n * @private\n */\ngoog.ui.CharPicker.prototype.modifyCharNode_ = function(button, ch) {\n  var text = this.displayChar_(ch);\n  var buttonEl = button.getElement();\n  goog.dom.setTextContent(buttonEl, text);\n  buttonEl.setAttribute('char', ch);\n  button.setVisible(true);\n};\n\n\n/**\n * Adds a given character to the recent character list.\n * @param {string} character Character to be added to the recent list.\n * @private\n */\ngoog.ui.CharPicker.prototype.updateRecents_ = function(character) {\n  if (character && character.charCodeAt(0) &&\n      !goog.array.contains(this.recents_, character)) {\n    this.recents_.unshift(character);\n    if (this.recents_.length > this.recentwidth_) {\n      this.recents_.pop();\n    }\n    this.updateGrid_(this.recentgrid_, this.recents_);\n  }\n};\n\n\n/**\n * Gets the user inputed unicode character.\n * @return {string} Unicode character inputed by user.\n */\ngoog.ui.CharPicker.prototype.getInputChar = function() {\n  var text = this.input_.getValue();\n  var code = parseInt(text, 16);\n  return /** @type {string} */ (goog.i18n.uChar.fromCharCode(code));\n};\n\n\n/**\n * Gets the display character for the given character.\n * @param {string} ch Character whose display is fetched.\n * @return {string} The display of the given character.\n * @private\n */\ngoog.ui.CharPicker.prototype.displayChar_ = function(ch) {\n  return this.layoutAlteringChars_.contains(ch) ? '\\u00A0' : ch;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^>;","^:;","^KJ","^?H","^:=","^GM","^?I","^9>","~$goog.ui.ContainerScroller","^I1","^HY","^:I","^GF","^TM","~$goog.i18n.CharPickerData","~$goog.i18n.uChar.NameFetcher","^?M","^:?","^<3","^;8","^JU","~$goog.ui.LabelInput","^>R","^;9","^:N","^;=","~$goog.i18n.CharListDecompressor","^HR","^I0"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/charpicker.js"],"^:1",["^9K",["~$goog.ui.CharPicker"]],"^9<",true,"^9=",["^9>","^?H","^?M","^;9","^:E","^;;","^;=","^:;","^:N","^;8","^>;","^:I","^TM","^>R","^?I","^U>","^U;","^I1","^U<","^HR","^<3","^JU","^:=","^U:","^KJ","^I0","^U=","^GF","^GM","^:?","^HY"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.fs.filereader.js","^9C",["^9D","goog/testing/fs/filereader.js"],"^9E","goog/testing/fs/filereader.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Mock FileReader object.\n *\n */\n\ngoog.setTestOnly('goog.testing.fs.FileReader');\ngoog.provide('goog.testing.fs.FileReader');\n\ngoog.require('goog.Timer');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.fs.Error');\ngoog.require('goog.fs.FileReader');\ngoog.require('goog.testing.fs.Blob');\ngoog.require('goog.testing.fs.ProgressEvent');\n\n\n\n/**\n * A mock FileReader object. This emits the same events as\n * {@link goog.fs.FileReader}.\n *\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.testing.fs.FileReader = function() {\n  goog.testing.fs.FileReader.base(this, 'constructor');\n\n  /**\n   * The current state of the reader.\n   * @type {goog.fs.FileReader.ReadyState}\n   * @private\n   */\n  this.readyState_ = goog.fs.FileReader.ReadyState.INIT;\n};\ngoog.inherits(goog.testing.fs.FileReader, goog.events.EventTarget);\n\n\n/**\n * The most recent error experienced by this reader.\n * @type {goog.fs.Error}\n * @private\n */\ngoog.testing.fs.FileReader.prototype.error_;\n\n\n/**\n * Whether the current operation has been aborted.\n * @type {boolean}\n * @private\n */\ngoog.testing.fs.FileReader.prototype.aborted_ = false;\n\n\n/**\n * The blob this reader is reading from.\n * @type {goog.testing.fs.Blob}\n * @private\n */\ngoog.testing.fs.FileReader.prototype.blob_;\n\n\n/**\n * The possible return types.\n * @enum {number}\n */\ngoog.testing.fs.FileReader.ReturnType = {\n  /**\n   * Used when reading as text.\n   */\n  TEXT: 1,\n\n  /**\n   * Used when reading as binary string.\n   */\n  BINARY_STRING: 2,\n\n  /**\n   * Used when reading as array buffer.\n   */\n  ARRAY_BUFFER: 3,\n\n  /**\n   * Used when reading as data URL.\n   */\n  DATA_URL: 4\n};\n\n\n/**\n * The return type we're reading.\n * @type {goog.testing.fs.FileReader.ReturnType}\n * @private\n */\ngoog.testing.fs.FileReader.prototype.returnType_;\n\n\n/**\n * @see {goog.fs.FileReader#getReadyState}\n * @return {goog.fs.FileReader.ReadyState} The current ready state.\n */\ngoog.testing.fs.FileReader.prototype.getReadyState = function() {\n  return this.readyState_;\n};\n\n\n/**\n * @see {goog.fs.FileReader#getError}\n * @return {goog.fs.Error} The current error.\n */\ngoog.testing.fs.FileReader.prototype.getError = function() {\n  return this.error_;\n};\n\n\n/**\n * @see {goog.fs.FileReader#abort}\n */\ngoog.testing.fs.FileReader.prototype.abort = function() {\n  if (this.readyState_ != goog.fs.FileReader.ReadyState.LOADING) {\n    var msg = 'aborting read';\n    throw new goog.fs.Error({'name': 'InvalidStateError'}, msg);\n  }\n\n  this.aborted_ = true;\n};\n\n\n/**\n * @see {goog.fs.FileReader#getResult}\n * @return {*} The result of the file read.\n */\ngoog.testing.fs.FileReader.prototype.getResult = function() {\n  if (this.readyState_ != goog.fs.FileReader.ReadyState.DONE) {\n    return undefined;\n  }\n  if (this.error_) {\n    return undefined;\n  }\n  if (this.returnType_ == goog.testing.fs.FileReader.ReturnType.TEXT) {\n    return this.blob_.toString();\n  } else if (\n      this.returnType_ == goog.testing.fs.FileReader.ReturnType.ARRAY_BUFFER) {\n    return this.blob_.toArrayBuffer();\n  } else if (\n      this.returnType_ == goog.testing.fs.FileReader.ReturnType.BINARY_STRING) {\n    return this.blob_.toString();\n  } else if (\n      this.returnType_ == goog.testing.fs.FileReader.ReturnType.DATA_URL) {\n    return this.blob_.toDataUrl();\n  } else {\n    return undefined;\n  }\n};\n\n\n/**\n * Fires the read events.\n * @param {!goog.testing.fs.Blob} blob The blob to read from.\n * @private\n */\ngoog.testing.fs.FileReader.prototype.read_ = function(blob) {\n  this.blob_ = blob;\n  if (this.readyState_ == goog.fs.FileReader.ReadyState.LOADING) {\n    var msg = 'reading file';\n    throw new goog.fs.Error({'name': 'InvalidStateError'}, msg);\n  }\n\n  this.readyState_ = goog.fs.FileReader.ReadyState.LOADING;\n  goog.Timer.callOnce(function() {\n    if (this.aborted_) {\n      this.abort_(blob.size);\n      return;\n    }\n\n    this.progressEvent_(goog.fs.FileReader.EventType.LOAD_START, 0, blob.size);\n    this.progressEvent_(\n        goog.fs.FileReader.EventType.LOAD, blob.size / 2, blob.size);\n    this.progressEvent_(\n        goog.fs.FileReader.EventType.LOAD, blob.size, blob.size);\n    this.readyState_ = goog.fs.FileReader.ReadyState.DONE;\n    this.progressEvent_(\n        goog.fs.FileReader.EventType.LOAD, blob.size, blob.size);\n    this.progressEvent_(\n        goog.fs.FileReader.EventType.LOAD_END, blob.size, blob.size);\n  }, 0, this);\n};\n\n\n/**\n * @see {goog.fs.FileReader#readAsBinaryString}\n * @param {!goog.testing.fs.Blob} blob The blob to read.\n */\ngoog.testing.fs.FileReader.prototype.readAsBinaryString = function(blob) {\n  this.returnType_ = goog.testing.fs.FileReader.ReturnType.BINARY_STRING;\n  this.read_(blob);\n};\n\n\n/**\n * @see {goog.fs.FileReader#readAsArrayBuffer}\n * @param {!goog.testing.fs.Blob} blob The blob to read.\n */\ngoog.testing.fs.FileReader.prototype.readAsArrayBuffer = function(blob) {\n  this.returnType_ = goog.testing.fs.FileReader.ReturnType.ARRAY_BUFFER;\n  this.read_(blob);\n};\n\n\n/**\n * @see {goog.fs.FileReader#readAsText}\n * @param {!goog.testing.fs.Blob} blob The blob to read.\n * @param {string=} opt_encoding The name of the encoding to use.\n */\ngoog.testing.fs.FileReader.prototype.readAsText = function(blob, opt_encoding) {\n  this.returnType_ = goog.testing.fs.FileReader.ReturnType.TEXT;\n  this.read_(blob);\n};\n\n\n/**\n * @see {goog.fs.FileReader#readAsDataUrl}\n * @param {!goog.testing.fs.Blob} blob The blob to read.\n */\ngoog.testing.fs.FileReader.prototype.readAsDataUrl = function(blob) {\n  this.returnType_ = goog.testing.fs.FileReader.ReturnType.DATA_URL;\n  this.read_(blob);\n};\n\n\n/**\n * Abort the current action and emit appropriate events.\n *\n * @param {number} total The total data that was to be processed, in bytes.\n * @private\n */\ngoog.testing.fs.FileReader.prototype.abort_ = function(total) {\n  this.error_ = new goog.fs.Error({'name': 'AbortError'}, 'reading file');\n  this.progressEvent_(goog.fs.FileReader.EventType.ERROR, 0, total);\n  this.progressEvent_(goog.fs.FileReader.EventType.ABORT, 0, total);\n  this.readyState_ = goog.fs.FileReader.ReadyState.DONE;\n  this.progressEvent_(goog.fs.FileReader.EventType.LOAD_END, 0, total);\n  this.aborted_ = false;\n};\n\n\n/**\n * Dispatch a progress event.\n *\n * @param {goog.fs.FileReader.EventType} type The event type.\n * @param {number} loaded The number of bytes processed.\n * @param {number} total The total data that was to be processed, in bytes.\n * @private\n */\ngoog.testing.fs.FileReader.prototype.progressEvent_ = function(\n    type, loaded, total) {\n  this.dispatchEvent(new goog.testing.fs.ProgressEvent(type, loaded, total));\n};\n","^9I",1579837703000,"^9J",["^9K",["^><","^IE","^9>","^:L","^K[","~$goog.fs.FileReader","^L0"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/fs/filereader.js"],"^:1",["^9K",["~$goog.testing.fs.FileReader"]],"^9<",true,"^9=",["^9>","^><","^:L","^IE","^U@","^L0","^K["]],["^ ","^9A",[1579837703000],"^9B","goog.dom.pattern.repeat.js","^9C",["^9D","goog/dom/pattern/repeat.js"],"^9E","goog/dom/pattern/repeat.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview DOM pattern to match a tag and all of its children.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.pattern.Repeat');\n\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.pattern.AbstractPattern');\ngoog.require('goog.dom.pattern.MatchType');\n\n\n\n/**\n * Pattern object that matches a repetition of another pattern.\n * @param {goog.dom.pattern.AbstractPattern} pattern The pattern to\n *     repetitively match.\n * @param {number=} opt_minimum The minimum number of times to match.  Defaults\n *     to 0.\n * @param {number=} opt_maximum The maximum number of times to match.  Defaults\n *     to unlimited.\n * @constructor\n * @extends {goog.dom.pattern.AbstractPattern}\n * @final\n */\ngoog.dom.pattern.Repeat = function(pattern, opt_minimum, opt_maximum) {\n  /**\n   * Pattern to repetitively match.\n   *\n   * @private {goog.dom.pattern.AbstractPattern}\n   */\n  this.pattern_ = pattern;\n\n  /**\n   * Minimum number of times to match the pattern.\n   *\n   * @private {number}\n   */\n  this.minimum_ = opt_minimum || 0;\n\n  /**\n   * Optional maximum number of times to match the pattern. A `null` value\n   * will be treated as infinity.\n   *\n   * @private {?number}\n   */\n  this.maximum_ = opt_maximum || null;\n\n  /**\n   * The matched nodes.\n   *\n   * @type {Array<Node>}\n   */\n  this.matches = [];\n\n  /**\n   * Number of times the pattern has matched.\n   *\n   * @type {number}\n   */\n  this.count = 0;\n\n  /**\n   * Whether the pattern has recently matched or failed to match and will need\n   * to be reset when starting a new round of matches.\n   *\n   * @private {boolean}\n   */\n  this.needsReset_ = false;\n};\ngoog.inherits(goog.dom.pattern.Repeat, goog.dom.pattern.AbstractPattern);\n\n\n/**\n * Test whether the given token continues a repeated series of matches of the\n * pattern given in the constructor.\n *\n * @param {Node} token Token to match against.\n * @param {goog.dom.TagWalkType} type The type of token.\n * @return {goog.dom.pattern.MatchType} <code>MATCH</code> if the pattern\n *     matches, <code>BACKTRACK_MATCH</code> if the pattern does not match\n *     but already had accumulated matches, <code>MATCHING</code> if the pattern\n *     starts a match, and <code>NO_MATCH</code> if the pattern does not match.\n * @suppress {missingProperties} See the broken line below.\n * @override\n */\ngoog.dom.pattern.Repeat.prototype.matchToken = function(token, type) {\n  // Reset if we're starting a new match\n  if (this.needsReset_) {\n    this.reset();\n  }\n\n  // If the option is set, ignore any whitespace only text nodes\n  if (token.nodeType == goog.dom.NodeType.TEXT &&\n      token.nodeValue.match(/^\\s+$/)) {\n    return goog.dom.pattern.MatchType.MATCHING;\n  }\n\n  switch (this.pattern_.matchToken(token, type)) {\n    case goog.dom.pattern.MatchType.MATCH:\n      // Record the first token we match.\n      if (this.count == 0) {\n        this.matchedNode = token;\n      }\n\n      // Mark the match\n      this.count++;\n\n      // Add to the list\n      this.matches.push(this.pattern_.matchedNode);\n\n      // Check if this match hits our maximum\n      if (this.maximum_ !== null && this.count == this.maximum_) {\n        this.needsReset_ = true;\n        return goog.dom.pattern.MatchType.MATCH;\n      } else {\n        return goog.dom.pattern.MatchType.MATCHING;\n      }\n\n    case goog.dom.pattern.MatchType.MATCHING:\n      // This can happen when our child pattern is a sequence or a repetition.\n      return goog.dom.pattern.MatchType.MATCHING;\n\n    case goog.dom.pattern.MatchType.BACKTRACK_MATCH:\n      // This happens if our child pattern is repetitive too.\n      // TODO(robbyw): Backtrack further if necessary.\n      this.count++;\n\n      // NOTE(nicksantos): This line of code is broken. this.patterns_ doesn't\n      // exist, and this.currentPosition_ doesn't exist. When this is fixed,\n      // remove the missingProperties suppression above.\n      if (this.currentPosition_ == this.patterns_.length) {\n        this.needsReset_ = true;\n        return goog.dom.pattern.MatchType.BACKTRACK_MATCH;\n      } else {\n        // Retry the same token on the next iteration of the child pattern.\n        return this.matchToken(token, type);\n      }\n\n    default:\n      this.needsReset_ = true;\n      if (this.count >= this.minimum_) {\n        return goog.dom.pattern.MatchType.BACKTRACK_MATCH;\n      } else {\n        return goog.dom.pattern.MatchType.NO_MATCH;\n      }\n  }\n};\n\n\n/**\n * Reset any internal state this pattern keeps.\n * @override\n */\ngoog.dom.pattern.Repeat.prototype.reset = function() {\n  this.pattern_.reset();\n  this.count = 0;\n  this.needsReset_ = false;\n  this.matches.length = 0;\n};\n","^9I",1579837703000,"^9J",["^9K",["^==","^=B","^9>","^=?"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/repeat.js"],"^:1",["^9K",["~$goog.dom.pattern.Repeat"]],"^9<",true,"^9=",["^9>","^=B","^==","^=?"]],["^ ","^9A",[1579837703000],"^9B","goog.history.history.js","^9C",["^9D","goog/history/history.js"],"^9E","goog/history/history.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Browser history stack management class.\n *\n * The goog.History object allows a page to create history state without leaving\n * the current document. This allows users to, for example, hit the browser's\n * back button without leaving the current page.\n *\n * The history object can be instantiated in one of two modes. In user visible\n * mode, the current history state is shown in the browser address bar as a\n * document location fragment (the portion of the URL after the '#'). These\n * addresses can be bookmarked, copied and pasted into another browser, and\n * modified directly by the user like any other URL.\n *\n * If the history object is created in invisible mode, the user can still\n * affect the state using the browser forward and back buttons, but the current\n * state is not displayed in the browser address bar. These states are not\n * bookmarkable or editable.\n *\n * It is possible to use both types of history object on the same page, but not\n * currently recommended due to browser deficiencies.\n *\n * Tested to work in:\n * <ul>\n *   <li>Firefox 1.0-4.0\n *   <li>Internet Explorer 5.5-9.0\n *   <li>Opera 9+\n *   <li>Safari 4+\n * </ul>\n *\n * @author brenneman@google.com (Shawn Brenneman)\n * @see ../demos/history1.html\n * @see ../demos/history2.html\n */\n\n/* Some browser specific implementation notes:\n *\n * Firefox (through version 2.0.0.1):\n *\n * Ideally, navigating inside the hidden iframe could be done using\n * about:blank#state instead of a real page on the server. Setting the hash on\n * about:blank creates history entries, but the hash is not recorded and is lost\n * when the user hits the back button. This is true in Opera as well. A blank\n * HTML page must be provided for invisible states to be recorded in the iframe\n * hash.\n *\n * After leaving the page with the History object and returning to it (by\n * hitting the back button from another site), the last state of the iframe is\n * overwritten. The most recent state is saved in a hidden input field so the\n * previous state can be restored.\n *\n * Firefox does not store the previous value of dynamically generated input\n * elements. To save the state, the hidden element must be in the HTML document,\n * either in the original source or added with document.write. If a reference\n * to the input element is not provided as a constructor argument, then the\n * history object creates one using document.write, in which case the history\n * object must be created from a script in the body element of the page.\n *\n * Manually editing the address field to a different hash link prevents further\n * updates to the address bar. The page continues to work as normal, but the\n * address shown will be incorrect until the page is reloaded.\n *\n * NOTE(user): It should be noted that Firefox will URL encode any non-regular\n * ascii character, along with |space|, \", <, and >, when added to the fragment.\n * If you expect these characters in your tokens you should consider that\n * setToken('<b>') would result in the history fragment \"%3Cb%3E\", and\n * \"esp&eacute;re\" would show \"esp%E8re\".  (IE allows unicode characters in the\n * fragment)\n *\n * TODO(user): Should we encapsulate this escaping into the API for visible\n * history and encode all characters that aren't supported by Firefox?  It also\n * needs to be optional so apps can elect to handle the escaping themselves.\n *\n *\n * Internet Explorer (through version 7.0):\n *\n * IE does not modify the history stack when the document fragment is changed.\n * We create history entries instead by using document.open and document.write\n * into a hidden iframe.\n *\n * IE destroys the history stack when navigating from /foo.html#someFragment to\n * /foo.html. The workaround is to always append the # to the URL. This is\n * somewhat unfortunate when loading the page without any # specified, because\n * a second \"click\" sound will play on load as the fragment is automatically\n * appended. If the hash is always present, this can be avoided.\n *\n * Manually editing the hash in the address bar in IE6 and then hitting the back\n * button can replace the page with a blank page. This is a Bad User Experience,\n * but probably not preventable.\n *\n * IE also has a bug when the page is loaded via a server redirect, setting\n * a new hash value on the window location will force a page reload. This will\n * happen the first time setToken is called with a new token. The only known\n * workaround is to force a client reload early, for example by setting\n * window.location.hash = window.location.hash, which will otherwise be a no-op.\n *\n * Internet Explorer 8.0, Webkit 532.1 and Gecko 1.9.2:\n *\n * IE8 has introduced the support to the HTML5 onhashchange event, which means\n * we don't have to do any polling to detect fragment changes. Chrome and\n * Firefox have added it on their newer builds, wekbit 532.1 and gecko 1.9.2.\n * http://www.w3.org/TR/html5/history.html\n * NOTE(goto): it is important to note that the document needs to have the\n * <!DOCTYPE html> tag to enable the IE8 HTML5 mode. If the tag is not present,\n * IE8 will enter IE7 compatibility mode (which can also be enabled manually).\n *\n * Opera (through version 9.02):\n *\n * Navigating through pages at a rate faster than some threshold causes Opera\n * to cancel all outstanding timeouts and intervals, including the location\n * polling loop. Since this condition cannot be detected, common input events\n * are captured to cause the loop to restart.\n *\n * location.replace is adding a history entry inside setHash_, despite\n * documentation that suggests it should not.\n *\n *\n * Safari (through version 2.0.4):\n *\n * After hitting the back button, the location.hash property is no longer\n * readable from JavaScript. This is fixed in later WebKit builds, but not in\n * currently shipping Safari. For now, the only recourse is to disable history\n * states in Safari. Pages are still navigable via the History object, but the\n * back button cannot restore previous states.\n *\n * Safari sets history states on navigation to a hashlink, but doesn't allow\n * polling of the hash, so following actual anchor links in the page will create\n * useless history entries. Using location.replace does not seem to prevent\n * this. Not a terribly good user experience, but fixed in later Webkits.\n *\n *\n * WebKit (nightly version 420+):\n *\n * This almost works. Returning to a page with an invisible history object does\n * not restore the old state, however, and there is no pageshow event that fires\n * in this browser. Holding off on finding a solution for now.\n *\n *\n * HTML5 capable browsers (Firefox 4, Chrome, Safari 5)\n *\n * No known issues. The goog.history.Html5History class provides a simpler\n * implementation more suitable for recent browsers. These implementations\n * should be merged so the history class automatically invokes the correct\n * implementation.\n */\n\n\ngoog.provide('goog.History');\ngoog.provide('goog.History.Event');\ngoog.provide('goog.History.EventType');\n\ngoog.require('goog.Timer');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.safe');\n/** @suppress {extraRequire} */\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.history.Event');\ngoog.require('goog.history.EventType');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.html.uncheckedconversions');\ngoog.require('goog.labs.userAgent.device');\ngoog.require('goog.memoize');\ngoog.require('goog.string');\ngoog.require('goog.string.Const');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A history management object. Can be instantiated in user-visible mode (uses\n * the address fragment to manage state) or in hidden mode. This object should\n * be created from a script in the document body before the document has\n * finished loading.\n *\n * To store the hidden states in browsers other than IE, a hidden iframe is\n * used. It must point to a valid html page on the same domain (which can and\n * probably should be blank.)\n *\n * Sample instantiation and usage:\n *\n * <pre>\n * // Instantiate history to use the address bar for state.\n * var h = new goog.History();\n * goog.events.listen(h, goog.history.EventType.NAVIGATE, navCallback);\n * h.setEnabled(true);\n *\n * // Any changes to the location hash will call the following function.\n * function navCallback(e) {\n *   alert('Navigated to state \"' + e.token + '\"');\n * }\n *\n * // The history token can also be set from code directly.\n * h.setToken('foo');\n * </pre>\n *\n * @param {boolean=} opt_invisible True to use hidden history states instead of\n *     the user-visible location hash.\n * @param {!goog.html.TrustedResourceUrl=} opt_blankPageUrl A URL to a\n *     blank page on the same server. Required if opt_invisible is true.\n *     This URL is also used as the src for the iframe used to track history\n *     state in IE (if not specified the iframe is not given a src attribute).\n *     Access is Denied error may occur in IE7 if the window's URL's scheme\n *     is https, and this URL is not specified.\n * @param {HTMLInputElement=} opt_input The hidden input element to be used to\n *     store the history token.  If not provided, a hidden input element will\n *     be created using document.write.\n * @param {HTMLIFrameElement=} opt_iframe The hidden iframe that will be used by\n *     IE for pushing history state changes, or by all browsers if opt_invisible\n *     is true. If not provided, a hidden iframe element will be created using\n *     document.write.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.History = function(\n    opt_invisible, opt_blankPageUrl, opt_input, opt_iframe) {\n  goog.events.EventTarget.call(this);\n\n  if (opt_invisible && !opt_blankPageUrl) {\n    throw new Error(\n        'Can\\'t use invisible history without providing a blank page.');\n  }\n\n  var input;\n  if (opt_input) {\n    input = opt_input;\n  } else {\n    var inputId = 'history_state' + goog.History.historyCount_;\n    var inputHtml = goog.html.SafeHtml.create('input', {\n      type: goog.dom.InputType.TEXT,\n      name: inputId,\n      id: inputId,\n      style: goog.string.Const.from('display:none')\n    });\n    goog.dom.safe.documentWrite(document, inputHtml);\n    input = goog.dom.getElement(inputId);\n  }\n\n  /**\n   * An input element that stores the current iframe state. Used to restore\n   * the state when returning to the page on non-IE browsers.\n   * @type {HTMLInputElement}\n   * @private\n   */\n  this.hiddenInput_ = /** @type {HTMLInputElement} */ (input);\n\n  /**\n   * The window whose location contains the history token fragment. This is\n   * the window that contains the hidden input. It's typically the top window.\n   * It is not necessarily the same window that the js code is loaded in.\n   * @type {Window}\n   * @private\n   */\n  this.window_ = opt_input ?\n      goog.dom.getWindow(goog.dom.getOwnerDocument(opt_input)) :\n      window;\n\n  /**\n   * The base URL for the hidden iframe. Must refer to a document in the\n   * same domain as the main page.\n   * @type {!goog.html.TrustedResourceUrl|undefined}\n   * @private\n   */\n  this.iframeSrc_ = opt_blankPageUrl;\n\n  if (goog.userAgent.IE && !opt_blankPageUrl) {\n    if (window.location.protocol == 'https') {\n      this.iframeSrc_ = goog.html.TrustedResourceUrl.fromConstant(\n          goog.string.Const.from('https:///'));\n    } else {\n      this.iframeSrc_ = goog.html.TrustedResourceUrl.fromConstant(\n          goog.string.Const.from('javascript:\"\"'));\n    }\n  }\n\n  /**\n   * A timer for polling the current history state for changes.\n   * @type {goog.Timer}\n   * @private\n   */\n  this.timer_ = new goog.Timer(goog.History.PollingType.NORMAL);\n  this.registerDisposable(this.timer_);\n\n  /**\n   * True if the state tokens are displayed in the address bar, false for hidden\n   * history states.\n   * @type {boolean}\n   * @private\n   */\n  this.userVisible_ = !opt_invisible;\n\n  /**\n   * An object to keep track of the history event listeners.\n   * @type {goog.events.EventHandler<!goog.History>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  if (opt_invisible || goog.History.LEGACY_IE) {\n    var iframe;\n    if (opt_iframe) {\n      iframe = opt_iframe;\n    } else {\n      var iframeId = 'history_iframe' + goog.History.historyCount_;\n      // Using a \"sandbox\" attribute on the iframe might be possible, but\n      // this HTML didn't initially have it and when it was refactored\n      // to SafeHtml it was kept without it.\n      var iframeHtml = goog.html.SafeHtml.createIframe(this.iframeSrc_, null, {\n        id: iframeId,\n        style: goog.string.Const.from('display:none'),\n        sandbox: undefined\n      });\n      goog.dom.safe.documentWrite(document, iframeHtml);\n      iframe = goog.dom.getElement(iframeId);\n    }\n\n    /**\n     * Internet Explorer uses a hidden iframe for all history changes. Other\n     * browsers use the iframe only for pushing invisible states.\n     * @type {HTMLIFrameElement}\n     * @private\n     */\n    this.iframe_ = /** @type {HTMLIFrameElement} */ (iframe);\n\n    /**\n     * Whether the hidden iframe has had a document written to it yet in this\n     * session.\n     * @type {boolean}\n     * @private\n     */\n    this.unsetIframe_ = true;\n  }\n\n  if (goog.History.LEGACY_IE) {\n    // IE relies on the hidden input to restore the history state from previous\n    // sessions, but input values are only restored after window.onload. Set up\n    // a callback to poll the value after the onload event.\n    this.eventHandler_.listen(\n        this.window_, goog.events.EventType.LOAD, this.onDocumentLoaded);\n\n    /**\n     * IE-only variable for determining if the document has loaded.\n     * @type {boolean}\n     * @protected\n     */\n    this.documentLoaded = false;\n\n    /**\n     * IE-only variable for storing whether the history object should be enabled\n     * once the document finishes loading.\n     * @type {boolean}\n     * @private\n     */\n    this.shouldEnable_ = false;\n  }\n\n  // Set the initial history state.\n  if (this.userVisible_) {\n    this.setHash_(this.getToken(), true);\n  } else {\n    this.setIframeToken_(this.hiddenInput_.value);\n  }\n\n  goog.History.historyCount_++;\n};\ngoog.inherits(goog.History, goog.events.EventTarget);\n\n\n/**\n * Status of when the object is active and dispatching events.\n * @type {boolean}\n * @private\n */\ngoog.History.prototype.enabled_ = false;\n\n\n/**\n * Whether the object is performing polling with longer intervals. This can\n * occur for instance when setting the location of the iframe when in invisible\n * mode and the server that is hosting the blank html page is down. In FF, this\n * will cause the location of the iframe to no longer be accessible, with\n * permision denied exceptions being thrown on every access of the history\n * token. When this occurs, the polling interval is elongated. This causes\n * exceptions to be thrown at a lesser rate while allowing for the history\n * object to resurrect itself when the html page becomes accessible.\n * @type {boolean}\n * @private\n */\ngoog.History.prototype.longerPolling_ = false;\n\n\n/**\n * The last token set by the history object, used to poll for changes.\n * @type {?string}\n * @private\n */\ngoog.History.prototype.lastToken_ = null;\n\n\n/**\n * Whether the browser supports HTML5 history management's onhashchange event.\n * {@link http://www.w3.org/TR/html5/history.html}. IE 9 in compatibility mode\n * indicates that onhashchange is in window, but testing reveals the event\n * isn't actually fired.\n * @return {boolean} Whether onhashchange is supported.\n */\ngoog.History.isOnHashChangeSupported = goog.memoize(function() {\n  return goog.userAgent.IE ? goog.userAgent.isDocumentModeOrHigher(8) :\n                             'onhashchange' in goog.global;\n});\n\n\n/**\n * Whether the current browser is Internet Explorer prior to version 8. Many IE\n * specific workarounds developed before version 8 are unnecessary in more\n * current versions.\n * @type {boolean}\n */\ngoog.History.LEGACY_IE =\n    goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(8);\n\n\n/**\n * Whether the browser always requires the hash to be present. Internet Explorer\n * before version 8 will reload the HTML page if the hash is omitted.\n * @type {boolean}\n */\ngoog.History.HASH_ALWAYS_REQUIRED = goog.History.LEGACY_IE;\n\n\n/**\n * If not null, polling in the user invisible mode will be disabled until this\n * token is seen. This is used to prevent a race condition where the iframe\n * hangs temporarily while the location is changed.\n * @type {?string}\n * @private\n */\ngoog.History.prototype.lockedToken_ = null;\n\n\n/** @override */\ngoog.History.prototype.disposeInternal = function() {\n  goog.History.superClass_.disposeInternal.call(this);\n  this.eventHandler_.dispose();\n  this.setEnabled(false);\n};\n\n\n/**\n * Starts or stops the History polling loop. When enabled, the History object\n * will immediately fire an event for the current location. The caller can set\n * up event listeners between the call to the constructor and the call to\n * setEnabled.\n *\n * On IE, actual startup may be delayed until the iframe and hidden input\n * element have been loaded and can be polled. This behavior is transparent to\n * the caller.\n *\n * @param {boolean} enable Whether to enable the history polling loop.\n */\ngoog.History.prototype.setEnabled = function(enable) {\n\n  if (enable == this.enabled_) {\n    return;\n  }\n\n  if (goog.History.LEGACY_IE && !this.documentLoaded) {\n    // Wait until the document has actually loaded before enabling the\n    // object or any saved state from a previous session will be lost.\n    this.shouldEnable_ = enable;\n    return;\n  }\n\n  if (enable) {\n    if (goog.userAgent.OPERA) {\n      // Capture events for common user input so we can restart the timer in\n      // Opera if it fails. Yes, this is distasteful. See operaDefibrillator_.\n      this.eventHandler_.listen(\n          this.window_.document, goog.History.INPUT_EVENTS_,\n          this.operaDefibrillator_);\n    } else if (goog.userAgent.GECKO) {\n      // Firefox will not restore the correct state after navigating away from\n      // and then back to the page with the history object. This can be fixed\n      // by restarting the history object on the pageshow event.\n      this.eventHandler_.listen(this.window_, 'pageshow', this.onShow_);\n    }\n\n    // TODO(user): make HTML5 and invisible history work by listening to the\n    // iframe # changes instead of the window.\n    if (goog.History.isOnHashChangeSupported() && this.userVisible_) {\n      this.eventHandler_.listen(\n          this.window_, goog.events.EventType.HASHCHANGE, this.onHashChange_);\n      this.enabled_ = true;\n      this.dispatchEvent(new goog.history.Event(this.getToken(), false));\n    } else if (\n        !(goog.userAgent.IE && !goog.labs.userAgent.device.isMobile()) ||\n        this.documentLoaded) {\n      // Start dispatching history events if all necessary loading has\n      // completed (always true for browsers other than IE.)\n      this.eventHandler_.listen(\n          this.timer_, goog.Timer.TICK, goog.bind(this.check_, this, true));\n\n      this.enabled_ = true;\n\n      // Initialize last token at startup except on IE < 8, where the last token\n      // must only be set in conjunction with IFRAME updates, or the IFRAME will\n      // start out of sync and remove any pre-existing URI fragment.\n      if (!goog.History.LEGACY_IE) {\n        this.lastToken_ = this.getToken();\n        this.dispatchEvent(new goog.history.Event(this.getToken(), false));\n      }\n\n      this.timer_.start();\n    }\n\n  } else {\n    this.enabled_ = false;\n    this.eventHandler_.removeAll();\n    this.timer_.stop();\n  }\n};\n\n\n/**\n * Callback for the window onload event in IE. This is necessary to read the\n * value of the hidden input after restoring a history session. The value of\n * input elements is not viewable until after window onload for some reason (the\n * iframe state is similarly unavailable during the loading phase.)  If\n * setEnabled is called before the iframe has completed loading, the history\n * object will actually be enabled at this point.\n * @protected\n */\ngoog.History.prototype.onDocumentLoaded = function() {\n  this.documentLoaded = true;\n\n  if (this.hiddenInput_.value) {\n    // Any saved value in the hidden input can only be read after the document\n    // has been loaded due to an IE limitation. Restore the previous state if\n    // it has been set.\n    this.setIframeToken_(this.hiddenInput_.value, true);\n  }\n\n  this.setEnabled(this.shouldEnable_);\n};\n\n\n/**\n * Handler for the Gecko pageshow event. Restarts the history object so that the\n * correct state can be restored in the hash or iframe.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.History.prototype.onShow_ = function(e) {\n  // NOTE(user): persisted is a property passed in the pageshow event that\n  // indicates whether the page is being persisted from the cache or is being\n  // loaded for the first time.\n  if (e.getBrowserEvent()['persisted']) {\n    this.setEnabled(false);\n    this.setEnabled(true);\n  }\n};\n\n\n/**\n * Handles HTML5 onhashchange events on browsers where it is supported.\n * This is very similar to {@link #check_}, except that it is not executed\n * continuously. It is only used when\n * `goog.History.isOnHashChangeSupported()` is true.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.History.prototype.onHashChange_ = function(e) {\n  var hash = this.getLocationFragment_(this.window_);\n  if (hash != this.lastToken_) {\n    this.update_(hash, true);\n  }\n};\n\n\n/**\n * @return {string} The current token.\n */\ngoog.History.prototype.getToken = function() {\n  if (this.lockedToken_ != null) {\n    return this.lockedToken_;\n  } else if (this.userVisible_) {\n    return this.getLocationFragment_(this.window_);\n  } else {\n    return this.getIframeToken_() || '';\n  }\n};\n\n\n/**\n * Sets the history state. When user visible states are used, the URL fragment\n * will be set to the provided token.  Sometimes it is necessary to set the\n * history token before the document title has changed, in this case IE's\n * history drop down can be out of sync with the token.  To get around this\n * problem, the app can pass in a title to use with the hidden iframe.\n * @param {string} token The history state identifier.\n * @param {string=} opt_title Optional title used when setting the hidden iframe\n *     title in IE.\n */\ngoog.History.prototype.setToken = function(token, opt_title) {\n  this.setHistoryState_(token, false, opt_title);\n};\n\n\n/**\n * Replaces the current history state without affecting the rest of the history\n * stack.\n * @param {string} token The history state identifier.\n * @param {string=} opt_title Optional title used when setting the hidden iframe\n *     title in IE.\n */\ngoog.History.prototype.replaceToken = function(token, opt_title) {\n  this.setHistoryState_(token, true, opt_title);\n};\n\n\n/**\n * Gets the location fragment for the current URL.  We don't use location.hash\n * directly as the browser helpfully urlDecodes the string for us which can\n * corrupt the tokens.  For example, if we want to store: label/%2Froot it would\n * be returned as label//root.\n * @param {Window} win The window object to use.\n * @return {string} The fragment.\n * @private\n */\ngoog.History.prototype.getLocationFragment_ = function(win) {\n  var href = win.location.href;\n  var index = href.indexOf('#');\n  return index < 0 ? '' : href.substring(index + 1);\n};\n\n\n/**\n * Sets the history state. When user visible states are used, the URL fragment\n * will be set to the provided token. Setting opt_replace to true will cause the\n * navigation to occur, but will replace the current history entry without\n * affecting the length of the stack.\n *\n * @param {string} token The history state identifier.\n * @param {boolean} replace Set to replace the current history entry instead of\n *    appending a new history state.\n * @param {string=} opt_title Optional title used when setting the hidden iframe\n *     title in IE.\n * @private\n */\ngoog.History.prototype.setHistoryState_ = function(token, replace, opt_title) {\n  if (this.getToken() != token) {\n    if (this.userVisible_) {\n      this.setHash_(token, replace);\n\n      if (!goog.History.isOnHashChangeSupported()) {\n        if (goog.userAgent.IE && !goog.labs.userAgent.device.isMobile()) {\n          // IE must save state using the iframe.\n          this.setIframeToken_(token, replace, opt_title);\n        }\n      }\n\n      // This condition needs to be called even if\n      // goog.History.isOnHashChangeSupported() is true so the NAVIGATE event\n      // fires sychronously.\n      if (this.enabled_) {\n        this.check_(false);\n      }\n    } else {\n      // Fire the event immediately so that setting history is synchronous, but\n      // set a suspendToken so that polling doesn't trigger a 'back'.\n      this.setIframeToken_(token, replace);\n      this.lockedToken_ = this.lastToken_ = this.hiddenInput_.value = token;\n      this.dispatchEvent(new goog.history.Event(token, false));\n    }\n  }\n};\n\n\n/**\n * Sets or replaces the URL fragment. The token does not need to be URL encoded\n * according to the URL specification, though certain characters (like newline)\n * are automatically stripped.\n *\n * If opt_replace is not set, non-IE browsers will append a new entry to the\n * history list. Setting the hash does not affect the history stack in IE\n * (unless there is a pre-existing named anchor for that hash.)\n *\n * Older versions of Webkit cannot query the location hash, but it still can be\n * set. If we detect one of these versions, always replace instead of creating\n * new history entries.\n *\n * window.location.replace replaces the current state from the history stack.\n * http://www.whatwg.org/specs/web-apps/current-work/#dom-location-replace\n * http://www.whatwg.org/specs/web-apps/current-work/#replacement-enabled\n *\n * @param {string} token The new string to set.\n * @param {boolean=} opt_replace Set to true to replace the current token\n *    without appending a history entry.\n * @private\n */\ngoog.History.prototype.setHash_ = function(token, opt_replace) {\n  // If the page uses a BASE element, setting location.hash directly will\n  // navigate away from the current document. Also, the original URL path may\n  // possibly change from HTML5 history pushState. To account for these, the\n  // full path is always specified.\n  var loc = this.window_.location;\n  var url = loc.href.split('#')[0];\n\n  // If a hash has already been set, then removing it programmatically will\n  // reload the page. Once there is a hash, we won't remove it.\n  var hasHash = goog.string.contains(loc.href, '#');\n\n  if (goog.History.HASH_ALWAYS_REQUIRED || hasHash || token) {\n    url += '#' + token;\n  }\n\n  if (url != loc.href) {\n    var safeUrl =\n        goog.html.uncheckedconversions\n            .safeUrlFromStringKnownToSatisfyTypeContract(\n                goog.string.Const.from('URL taken from location.href.'), url);\n    if (opt_replace) {\n      goog.dom.safe.replaceLocation(loc, safeUrl);\n    } else {\n      goog.dom.safe.setLocationHref(loc, safeUrl);\n    }\n  }\n};\n\n\n/**\n * Sets the hidden iframe state. On IE, this is accomplished by writing a new\n * document into the iframe. In Firefox, the iframe's URL fragment stores the\n * state instead.\n *\n * Older versions of webkit cannot set the iframe, so ignore those browsers.\n *\n * @param {string} token The new string to set.\n * @param {boolean=} opt_replace Set to true to replace the current iframe state\n *     without appending a new history entry.\n * @param {string=} opt_title Optional title used when setting the hidden iframe\n *     title in IE.\n * @private\n */\ngoog.History.prototype.setIframeToken_ = function(\n    token, opt_replace, opt_title) {\n  if (this.unsetIframe_ || token != this.getIframeToken_()) {\n    this.unsetIframe_ = false;\n    token = goog.string.urlEncode(token);\n\n    if (goog.userAgent.IE) {\n      // Caching the iframe document results in document permission errors after\n      // leaving the page and returning. Access it anew each time instead.\n      var doc = goog.dom.getFrameContentDocument(this.iframe_);\n\n      doc.open('text/html', opt_replace ? 'replace' : undefined);\n      var iframeSourceHtml = goog.html.SafeHtml.concat(\n          goog.html.SafeHtml.create(\n              'title', {}, (opt_title || this.window_.document.title)),\n          goog.html.SafeHtml.create('body', {}, token));\n      goog.dom.safe.documentWrite(doc, iframeSourceHtml);\n      doc.close();\n    } else {\n      goog.asserts.assertInstanceof(\n          this.iframeSrc_, goog.html.TrustedResourceUrl,\n          'this.iframeSrc_ must be set on calls to setIframeToken_');\n      var url =\n          goog.html.TrustedResourceUrl.unwrap(\n              /** @type {!goog.html.TrustedResourceUrl} */ (this.iframeSrc_)) +\n          '#' + token;\n\n      // In Safari, it is possible for the contentWindow of the iframe to not\n      // be present when the page is loading after a reload.\n      var contentWindow = this.iframe_.contentWindow;\n      if (contentWindow) {\n        if (opt_replace) {\n          goog.dom.safe.replaceLocation(contentWindow.location, url);\n        } else {\n          goog.dom.safe.setLocationHref(contentWindow.location, url);\n        }\n      }\n    }\n  }\n};\n\n\n/**\n * Return the current state string from the hidden iframe. On internet explorer,\n * this is stored as a string in the document body. Other browsers use the\n * location hash of the hidden iframe.\n *\n * Older versions of webkit cannot access the iframe location, so always return\n * null in that case.\n *\n * @return {?string} The state token saved in the iframe (possibly null if the\n *     iframe has never loaded.).\n * @private\n */\ngoog.History.prototype.getIframeToken_ = function() {\n  if (goog.userAgent.IE) {\n    var doc = goog.dom.getFrameContentDocument(this.iframe_);\n    return doc.body ? goog.string.urlDecode(doc.body.innerHTML) : null;\n  } else {\n    // In Safari, it is possible for the contentWindow of the iframe to not\n    // be present when the page is loading after a reload.\n    var contentWindow = this.iframe_.contentWindow;\n    if (contentWindow) {\n      var hash;\n\n      try {\n        // Iframe tokens are urlEncoded\n        hash = goog.string.urlDecode(this.getLocationFragment_(contentWindow));\n      } catch (e) {\n        // An exception will be thrown if the location of the iframe can not be\n        // accessed (permission denied). This can occur in FF if the the server\n        // that is hosting the blank html page goes down and then a new history\n        // token is set. The iframe will navigate to an error page, and the\n        // location of the iframe can no longer be accessed. Due to the polling,\n        // this will cause constant exceptions to be thrown. In this case,\n        // we enable longer polling. We do not have to attempt to reset the\n        // iframe token because (a) we already fired the NAVIGATE event when\n        // setting the token, (b) we can rely on the locked token for current\n        // state, and (c) the token is still in the history and\n        // accesible on forward/back.\n        if (!this.longerPolling_) {\n          this.setLongerPolling_(true);\n        }\n\n        return null;\n      }\n\n      // There was no exception when getting the hash so turn off longer polling\n      // if it is on.\n      if (this.longerPolling_) {\n        this.setLongerPolling_(false);\n      }\n\n      return hash || null;\n    } else {\n      return null;\n    }\n  }\n};\n\n\n/**\n * Checks the state of the document fragment and the iframe title to detect\n * navigation changes. If `goog.HistoryisOnHashChangeSupported()` is\n * `false`, then this runs approximately twenty times per second.\n * @param {boolean} isNavigation True if the event was initiated by a browser\n *     action, false if it was caused by a setToken call. See\n *     {@link goog.history.Event}.\n * @private\n */\ngoog.History.prototype.check_ = function(isNavigation) {\n  if (this.userVisible_) {\n    var hash = this.getLocationFragment_(this.window_);\n    if (hash != this.lastToken_) {\n      this.update_(hash, isNavigation);\n    }\n  }\n\n  // Old IE uses the iframe for both visible and non-visible versions.\n  if (!this.userVisible_ || goog.History.LEGACY_IE) {\n    var token = this.getIframeToken_() || '';\n    if (this.lockedToken_ == null || token == this.lockedToken_) {\n      this.lockedToken_ = null;\n      if (token != this.lastToken_) {\n        this.update_(token, isNavigation);\n      }\n    }\n  }\n};\n\n\n/**\n * Updates the current history state with a given token. Called after a change\n * to the location or the iframe state is detected by poll_.\n *\n * @param {string} token The new history state.\n * @param {boolean} isNavigation True if the event was initiated by a browser\n *     action, false if it was caused by a setToken call. See\n *     {@link goog.history.Event}.\n * @private\n */\ngoog.History.prototype.update_ = function(token, isNavigation) {\n  this.lastToken_ = this.hiddenInput_.value = token;\n\n  if (this.userVisible_) {\n    if (goog.History.LEGACY_IE) {\n      this.setIframeToken_(token);\n    }\n\n    this.setHash_(token);\n  } else {\n    this.setIframeToken_(token);\n  }\n\n  this.dispatchEvent(new goog.history.Event(this.getToken(), isNavigation));\n};\n\n\n/**\n * Sets if the history oject should use longer intervals when polling.\n *\n * @param {boolean} longerPolling Whether to enable longer polling.\n * @private\n */\ngoog.History.prototype.setLongerPolling_ = function(longerPolling) {\n  if (this.longerPolling_ != longerPolling) {\n    this.timer_.setInterval(\n        longerPolling ? goog.History.PollingType.LONG :\n                        goog.History.PollingType.NORMAL);\n  }\n  this.longerPolling_ = longerPolling;\n};\n\n\n/**\n * Opera cancels all outstanding timeouts and intervals after any rapid\n * succession of navigation events, including the interval used to detect\n * navigation events. This function restarts the interval so that navigation can\n * continue. Ideally, only events which would be likely to cause a navigation\n * change (mousedown and keydown) would be bound to this function. Since Opera\n * seems to ignore keydown events while the alt key is pressed (such as\n * alt-left or right arrow), this function is also bound to the much more\n * frequent mousemove event. This way, when the update loop freezes, it will\n * unstick itself as the user wiggles the mouse in frustration.\n * @private\n */\ngoog.History.prototype.operaDefibrillator_ = function() {\n  this.timer_.stop();\n  this.timer_.start();\n};\n\n\n/**\n * List of user input event types registered in Opera to restart the history\n * timer (@see goog.History#operaDefibrillator_).\n * @type {Array<string>}\n * @private\n */\ngoog.History.INPUT_EVENTS_ = [\n  goog.events.EventType.MOUSEDOWN, goog.events.EventType.KEYDOWN,\n  goog.events.EventType.MOUSEMOVE\n];\n\n\n/**\n * Counter for the number of goog.History objects that have been instantiated.\n * Used to create unique IDs.\n * @type {number}\n * @private\n */\ngoog.History.historyCount_ = 0;\n\n\n/**\n * Types of polling. The values are in ms of the polling interval.\n * @enum {number}\n */\ngoog.History.PollingType = {\n  NORMAL: 150,\n  LONG: 10000\n};\n\n\n/**\n * Constant for the history change event type.\n * @enum {string}\n * @deprecated Use goog.history.EventType.\n */\ngoog.History.EventType = goog.history.EventType;\n\n\n\n/**\n * Constant for the history change event type.\n * @constructor\n * @deprecated Use goog.history.Event.\n * @final\n */\ngoog.History.Event = goog.history.Event;\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^=I","^>;","^><","^9L","^HU","^GL","^KQ","^9>","^@=","^:L","^:S","^=M","^:I","~$goog.labs.userAgent.device","^@B","^;8","^@C","^M>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/history/history.js"],"^:1",["^9K",["~$goog.History.EventType","~$goog.History","~$goog.History.Event"]],"^9<",true,"^9=",["^9>","^><","^:E","^;;","^GL","^@B","^;8","^>;","^:L","^:I","^HU","^KQ","^@C","^=I","^@=","^UC","^M>","^9L","^=M","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.fx.css3.transition.js","^9C",["^9D","goog/fx/css3/transition.js"],"^9E","goog/fx/css3/transition.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview CSS3 transition base library.\n *\n * @author chrishenry@google.com (Chris Henry)\n */\n\ngoog.provide('goog.fx.css3.Transition');\n\ngoog.require('goog.Timer');\ngoog.require('goog.asserts');\ngoog.require('goog.fx.TransitionBase');\ngoog.require('goog.style');\ngoog.require('goog.style.transition');\n\n\n\n/**\n * A class to handle targeted CSS3 transition. This class\n * handles common features required for targeted CSS3 transition.\n *\n * Browser that does not support CSS3 transition will still receive all\n * the events fired by the transition object, but will not have any transition\n * played. If the browser supports the final state as set in setFinalState\n * method, the element will ends in the final state.\n *\n * Transitioning multiple properties with the same setting is possible\n * by setting Css3Property's property to 'all'. Performing multiple\n * transitions can be done via setting multiple initialStyle,\n * finalStyle and transitions. Css3Property's delay can be used to\n * delay one of the transition. Here is an example for a transition\n * that expands on the width and then followed by the height:\n *\n * <pre>\n *   var animation = new goog.fx.css3.Transition(\n *     element,\n *     duration,\n *     {width: 10px, height: 10px},\n *     {width: 100px, height: 100px},\n *     [\n *       {property: width, duration: 1, timing: 'ease-in', delay: 0},\n *       {property: height, duration: 1, timing: 'ease-in', delay: 1}\n *     ]\n *   );\n * </pre>\n *\n * @param {Element} element The element to be transitioned.\n * @param {number} duration The duration of the transition in seconds.\n *     This should be the longest of all transitions, including any delay.\n * @param {Object} initialStyle Initial style properties of the element before\n *     animating. Set using `goog.style.setStyle`.\n * @param {Object} finalStyle Final style properties of the element after\n *     animating. Set using `goog.style.setStyle`.\n * @param {goog.style.transition.Css3Property|\n *     Array<goog.style.transition.Css3Property>} transitions A single CSS3\n *     transition property or an array of it.\n * @extends {goog.fx.TransitionBase}\n * @constructor\n * @struct\n */\ngoog.fx.css3.Transition = function(\n    element, duration, initialStyle, finalStyle, transitions) {\n  goog.fx.css3.Transition.base(this, 'constructor');\n\n  /**\n   * Timer id to be used to cancel animation part-way.\n   * @private {number}\n   */\n  this.timerId_;\n\n  /**\n   * @type {Element}\n   * @private\n   */\n  this.element_ = element;\n\n  /**\n   * @type {number}\n   * @private\n   */\n  this.duration_ = duration;\n\n  /**\n   * @type {Object}\n   * @private\n   */\n  this.initialStyle_ = initialStyle;\n\n  /**\n   * @type {Object}\n   * @private\n   */\n  this.finalStyle_ = finalStyle;\n\n  /**\n   * @type {Array<goog.style.transition.Css3Property>}\n   * @private\n   */\n  this.transitions_ = goog.isArray(transitions) ? transitions : [transitions];\n};\ngoog.inherits(goog.fx.css3.Transition, goog.fx.TransitionBase);\n\n\n/** @override */\ngoog.fx.css3.Transition.prototype.play = function() {\n  if (this.isPlaying()) {\n    return false;\n  }\n\n  this.onBegin();\n  this.onPlay();\n\n  this.startTime = goog.now();\n  this.setStatePlaying();\n\n  if (goog.style.transition.isSupported()) {\n    goog.style.setStyle(this.element_, this.initialStyle_);\n    // Allow element to get updated to its initial state before installing\n    // CSS3 transition.\n    this.timerId_ = goog.Timer.callOnce(this.play_, undefined, this);\n    return true;\n  } else {\n    this.stop_(false);\n    return false;\n  }\n};\n\n\n/**\n * Helper method for play method. This needs to be executed on a timer.\n * @private\n */\ngoog.fx.css3.Transition.prototype.play_ = function() {\n  // This measurement of the DOM element causes the browser to recalculate its\n  // initial state before the transition starts.\n  goog.style.getSize(this.element_);\n  goog.style.transition.set(this.element_, this.transitions_);\n  goog.style.setStyle(this.element_, this.finalStyle_);\n  this.timerId_ = goog.Timer.callOnce(\n      goog.bind(this.stop_, this, false), this.duration_ * 1000);\n};\n\n\n/** @override */\ngoog.fx.css3.Transition.prototype.stop = function() {\n  if (!this.isPlaying()) return;\n\n  this.stop_(true);\n};\n\n\n/**\n * Helper method for stop method.\n * @param {boolean} stopped If the transition was stopped.\n * @private\n */\ngoog.fx.css3.Transition.prototype.stop_ = function(stopped) {\n  goog.style.transition.removeAll(this.element_);\n\n  // Clear the timer.\n  goog.Timer.clear(this.timerId_);\n\n  // Make sure that we have reached the final style.\n  goog.style.setStyle(this.element_, this.finalStyle_);\n\n  this.endTime = goog.now();\n  this.setStateStopped();\n\n  if (stopped) {\n    this.onStop();\n  } else {\n    this.onFinish();\n  }\n  this.onEnd();\n};\n\n\n/** @override */\ngoog.fx.css3.Transition.prototype.disposeInternal = function() {\n  this.stop();\n  goog.fx.css3.Transition.base(this, 'disposeInternal');\n};\n\n\n/**\n * Pausing CSS3 Transitions in not supported.\n * @override\n */\ngoog.fx.css3.Transition.prototype.pause = function() {\n  goog.asserts.assert(false, 'Css3 transitions does not support pause action.');\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^><","^JQ","^9>","^H0","^<3"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/css3/transition.js"],"^:1",["^9K",["^S8"]],"^9<",true,"^9=",["^9>","^><","^:E","^H0","^<3","^JQ"]],["^ ","^9A",[1579837703000],"^9B","goog.graphics.canvasgraphics.js","^9C",["^9D","goog/graphics/canvasgraphics.js"],"^9E","goog/graphics/canvasgraphics.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview CanvasGraphics sub class that uses the canvas tag for drawing.\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.graphics.CanvasGraphics');\n\n\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events.EventType');\ngoog.require('goog.graphics.AbstractGraphics');\ngoog.require('goog.graphics.CanvasEllipseElement');\ngoog.require('goog.graphics.CanvasGroupElement');\ngoog.require('goog.graphics.CanvasImageElement');\ngoog.require('goog.graphics.CanvasPathElement');\ngoog.require('goog.graphics.CanvasRectElement');\ngoog.require('goog.graphics.CanvasTextElement');\ngoog.require('goog.graphics.Font');\ngoog.require('goog.graphics.SolidFill');\ngoog.require('goog.math.Size');\ngoog.require('goog.style');\n\n\n\n/**\n * A Graphics implementation for drawing using canvas.\n * @param {string|number} width The (non-zero) width in pixels.  Strings\n *     expressing percentages of parent with (e.g. '80%') are also accepted.\n * @param {string|number} height The (non-zero) height in pixels.  Strings\n *     expressing percentages of parent with (e.g. '80%') are also accepted.\n * @param {?number=} opt_coordWidth The coordinate width - if\n *     omitted or null, defaults to same as width.\n * @param {?number=} opt_coordHeight The coordinate height - if\n *     omitted or null, defaults to same as height.\n * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper object for the\n *     document we want to render in.\n * @constructor\n * @extends {goog.graphics.AbstractGraphics}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n */\ngoog.graphics.CanvasGraphics = function(\n    width, height, opt_coordWidth, opt_coordHeight, opt_domHelper) {\n  goog.graphics.AbstractGraphics.call(\n      this, width, height, opt_coordWidth, opt_coordHeight, opt_domHelper);\n};\ngoog.inherits(goog.graphics.CanvasGraphics, goog.graphics.AbstractGraphics);\n\n\n/**\n * Sets the fill for the given element.\n * @param {goog.graphics.StrokeAndFillElement} element The element\n *     wrapper.\n * @param {goog.graphics.Fill} fill The fill object.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.setElementFill = function(\n    element, fill) {\n  this.redraw();\n};\n\n\n/**\n * Sets the stroke for the given element.\n * @param {goog.graphics.StrokeAndFillElement} element The element\n *     wrapper.\n * @param {goog.graphics.Stroke} stroke The stroke object.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.setElementStroke = function(\n    element, stroke) {\n  this.redraw();\n};\n\n\n/**\n * Set the translation and rotation of an element.\n *\n * If a more general affine transform is needed than this provides\n * (e.g. skew and scale) then use setElementAffineTransform.\n * @param {goog.graphics.Element} element The element wrapper.\n * @param {number} x The x coordinate of the translation transform.\n * @param {number} y The y coordinate of the translation transform.\n * @param {number} angle The angle of the rotation transform.\n * @param {number} centerX The horizontal center of the rotation transform.\n * @param {number} centerY The vertical center of the rotation transform.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.setElementTransform = function(\n    element, x, y, angle, centerX, centerY) {\n  this.redraw();\n};\n\n\n/**\n * Set the transformation of an element.\n *\n * Note that in this implementation this method just calls this.redraw()\n * and the affineTransform param is unused.\n * @param {!goog.graphics.Element} element The element wrapper.\n * @param {!goog.graphics.AffineTransform} affineTransform The\n *     transformation applied to this element.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.setElementAffineTransform = function(\n    element, affineTransform) {\n  this.redraw();\n};\n\n\n/**\n * Push an element transform on to the transform stack.\n * @param {goog.graphics.Element} element The transformed element.\n */\ngoog.graphics.CanvasGraphics.prototype.pushElementTransform = function(\n    element) {\n  var ctx = this.getContext();\n  ctx.save();\n\n  var transform = element.getTransform();\n\n  // TODO(robbyw): Test for unsupported transforms i.e. skews.\n  var tx = transform.getTranslateX();\n  var ty = transform.getTranslateY();\n  if (tx || ty) {\n    ctx.translate(tx, ty);\n  }\n\n  var sinTheta = transform.getShearY();\n  if (sinTheta) {\n    ctx.rotate(Math.asin(sinTheta));\n  }\n};\n\n\n/**\n * Pop an element transform off of the transform stack.\n */\ngoog.graphics.CanvasGraphics.prototype.popElementTransform = function() {\n  this.getContext().restore();\n};\n\n\n/**\n * Creates the DOM representation of the graphics area.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.createDom = function() {\n  var element = this.dom_.createDom(\n      goog.dom.TagName.DIV, {'style': 'position:relative;overflow:hidden'});\n  this.setElementInternal(element);\n\n  this.canvas_ = this.dom_.createDom(goog.dom.TagName.CANVAS);\n  element.appendChild(this.canvas_);\n\n  /**\n   * The main canvas element.\n   * @type {goog.graphics.CanvasGroupElement}\n   */\n  this.canvasElement = new goog.graphics.CanvasGroupElement(this);\n\n  this.lastGroup_ = this.canvasElement;\n  this.redrawTimeout_ = 0;\n\n  this.updateSize();\n};\n\n\n/**\n * Clears the drawing context object in response to actions that make the old\n * context invalid - namely resize of the canvas element.\n * @private\n */\ngoog.graphics.CanvasGraphics.prototype.clearContext_ = function() {\n  this.context_ = null;\n};\n\n\n/**\n * Returns the drawing context.\n * @return {Object} The canvas element rendering context.\n */\ngoog.graphics.CanvasGraphics.prototype.getContext = function() {\n  if (!this.getElement()) {\n    this.createDom();\n  }\n  if (!this.context_) {\n    this.context_ = this.canvas_.getContext('2d');\n    this.context_.save();\n  }\n  return this.context_;\n};\n\n\n/**\n * Changes the coordinate system position.\n * @param {number} left The coordinate system left bound.\n * @param {number} top The coordinate system top bound.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.setCoordOrigin = function(left, top) {\n  this.coordLeft = left;\n  this.coordTop = top;\n  this.redraw();\n};\n\n\n/**\n * Changes the coordinate size.\n * @param {number} coordWidth The coordinate width.\n * @param {number} coordHeight The coordinate height.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.setCoordSize = function(\n    coordWidth, coordHeight) {\n  goog.graphics.CanvasGraphics.superClass_.setCoordSize.apply(this, arguments);\n  this.redraw();\n};\n\n\n/**\n * Change the size of the canvas.\n * @param {number} pixelWidth The width in pixels.\n * @param {number} pixelHeight The height in pixels.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.setSize = function(\n    pixelWidth, pixelHeight) {\n  this.width = pixelWidth;\n  this.height = pixelHeight;\n\n  this.updateSize();\n  this.redraw();\n};\n\n\n/** @override */\ngoog.graphics.CanvasGraphics.prototype.getPixelSize = function() {\n  // goog.style.getSize does not work for Canvas elements.  We\n  // have to compute the size manually if it is percentage based.\n  var width = this.width;\n  var height = this.height;\n  var computeWidth = (typeof width === 'string') && width.indexOf('%') != -1;\n  var computeHeight = (typeof height === 'string') && height.indexOf('%') != -1;\n\n  if (!this.isInDocument() && (computeWidth || computeHeight)) {\n    return null;\n  }\n\n  var parent;\n  var parentSize;\n\n  if (computeWidth) {\n    parent = /** @type {Element} */ (this.getElement().parentNode);\n    parentSize = goog.style.getSize(parent);\n    width = parseFloat(/** @type {string} */ (width)) * parentSize.width / 100;\n  }\n\n  if (computeHeight) {\n    parent = parent || /** @type {Element} */ (this.getElement().parentNode);\n    parentSize = parentSize || goog.style.getSize(parent);\n    height =\n        parseFloat(/** @type {string} */ (height)) * parentSize.height / 100;\n  }\n\n  return new goog.math.Size(\n      /** @type {number} */ (width),\n      /** @type {number} */ (height));\n};\n\n\n/**\n * Update the size of the canvas.\n */\ngoog.graphics.CanvasGraphics.prototype.updateSize = function() {\n  goog.style.setSize(this.getElement(), this.width, this.height);\n\n  var pixels = this.getPixelSize();\n  if (pixels) {\n    goog.style.setSize(\n        this.canvas_,\n        /** @type {number} */ (pixels.width),\n        /** @type {number} */ (pixels.height));\n    this.canvas_.width = pixels.width;\n    this.canvas_.height = pixels.height;\n    this.clearContext_();\n  }\n};\n\n\n/**\n * Reset the canvas.\n */\ngoog.graphics.CanvasGraphics.prototype.reset = function() {\n  var ctx = this.getContext();\n  ctx.restore();\n  var size = this.getPixelSize();\n  if (size.width && size.height) {\n    ctx.clearRect(0, 0, size.width, size.height);\n  }\n  ctx.save();\n};\n\n\n/**\n * Remove all drawing elements from the graphics.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.clear = function() {\n  this.reset();\n  this.canvasElement.clear();\n  var el = this.getElement();\n\n  // Remove all children (text nodes) except the canvas (which is at index 0)\n  while (el.childNodes.length > 1) {\n    el.removeChild(el.lastChild);\n  }\n};\n\n\n/**\n * Redraw the entire canvas.\n */\ngoog.graphics.CanvasGraphics.prototype.redraw = function() {\n  if (this.preventRedraw_) {\n    this.needsRedraw_ = true;\n    return;\n  }\n\n  if (this.isInDocument()) {\n    this.reset();\n\n    if (this.coordWidth) {\n      var pixels = this.getPixelSize();\n      this.getContext().scale(\n          pixels.width / this.coordWidth, pixels.height / this.coordHeight);\n    }\n    if (this.coordLeft || this.coordTop) {\n      this.getContext().translate(-this.coordLeft, -this.coordTop);\n    }\n    this.pushElementTransform(this.canvasElement);\n    this.canvasElement.draw(this.context_);\n    this.popElementTransform();\n  }\n};\n\n\n/**\n * Draw an element, including any stroke or fill.\n * @param {goog.graphics.Element} element The element to draw.\n */\ngoog.graphics.CanvasGraphics.prototype.drawElement = function(element) {\n  if (element instanceof goog.graphics.CanvasTextElement) {\n    // Don't draw text since that is not implemented using canvas.\n    return;\n  }\n\n  var ctx = this.getContext();\n  this.pushElementTransform(element);\n\n  if (!element.getFill || !element.getStroke) {\n    // Draw without stroke or fill (e.g. the element is an image or group).\n    element.draw(ctx);\n    this.popElementTransform();\n    return;\n  }\n\n  var fill = element.getFill();\n  if (fill) {\n    if (fill instanceof goog.graphics.SolidFill) {\n      if (fill.getOpacity() != 0) {\n        ctx.globalAlpha = fill.getOpacity();\n        ctx.fillStyle = fill.getColor();\n        element.draw(ctx);\n        ctx.fill();\n        ctx.globalAlpha = 1;\n      }\n    } else {  // (fill instanceof goog.graphics.LinearGradient)\n      var linearGradient = ctx.createLinearGradient(\n          fill.getX1(), fill.getY1(), fill.getX2(), fill.getY2());\n      linearGradient.addColorStop(0.0, fill.getColor1());\n      linearGradient.addColorStop(1.0, fill.getColor2());\n\n      ctx.fillStyle = linearGradient;\n      element.draw(ctx);\n      ctx.fill();\n    }\n  }\n\n  var stroke = element.getStroke();\n  if (stroke) {\n    element.draw(ctx);\n    ctx.strokeStyle = stroke.getColor();\n\n    var width = stroke.getWidth();\n    if (typeof width === 'string' && width.indexOf('px') != -1) {\n      width = parseFloat(width) / this.getPixelScaleX();\n    }\n    ctx.lineWidth = width;\n\n    ctx.stroke();\n  }\n\n  this.popElementTransform();\n};\n\n\n/**\n * Append an element.\n *\n * @param {goog.graphics.Element} element The element to draw.\n * @param {goog.graphics.GroupElement|undefined} group The group to draw\n *     it in. If null or undefined, defaults to the root group.\n * @protected\n */\ngoog.graphics.CanvasGraphics.prototype.append = function(element, group) {\n  group = group || this.canvasElement;\n  group.appendChild(element);\n\n  if (this.isDrawable(group)) {\n    this.drawElement(element);\n  }\n};\n\n\n/**\n * Draw an ellipse.\n *\n * @param {number} cx Center X coordinate.\n * @param {number} cy Center Y coordinate.\n * @param {number} rx Radius length for the x-axis.\n * @param {number} ry Radius length for the y-axis.\n * @param {goog.graphics.Stroke} stroke Stroke object describing the\n *    stroke.\n * @param {goog.graphics.Fill} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper\n *     element to append to.  If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.EllipseElement} The newly created element.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.drawEllipse = function(\n    cx, cy, rx, ry, stroke, fill, opt_group) {\n  var element = new goog.graphics.CanvasEllipseElement(\n      null, this, cx, cy, rx, ry, stroke, fill);\n  this.append(element, opt_group);\n  return element;\n};\n\n\n/**\n * Draw a rectangle.\n *\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @param {number} width Width of rectangle.\n * @param {number} height Height of rectangle.\n * @param {goog.graphics.Stroke} stroke Stroke object describing the\n *    stroke.\n * @param {goog.graphics.Fill} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper\n *     element to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.RectElement} The newly created element.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.drawRect = function(\n    x, y, width, height, stroke, fill, opt_group) {\n  var element = new goog.graphics.CanvasRectElement(\n      null, this, x, y, width, height, stroke, fill);\n  this.append(element, opt_group);\n  return element;\n};\n\n\n/**\n * Draw an image.\n *\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @param {number} width Width of image.\n * @param {number} height Height of image.\n * @param {string} src Source of the image.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper\n *     element to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.ImageElement} The newly created element.\n */\ngoog.graphics.CanvasGraphics.prototype.drawImage = function(\n    x, y, width, height, src, opt_group) {\n  var element = new goog.graphics.CanvasImageElement(\n      null, this, x, y, width, height, src);\n  this.append(element, opt_group);\n  return element;\n};\n\n\n/**\n * Draw a text string vertically centered on a given line.\n *\n * @param {string} text The text to draw.\n * @param {number} x1 X coordinate of start of line.\n * @param {number} y1 Y coordinate of start of line.\n * @param {number} x2 X coordinate of end of line.\n * @param {number} y2 Y coordinate of end of line.\n * @param {?string} align Horizontal alignment: left (default), center, right.\n * @param {goog.graphics.Font} font Font describing the font properties.\n * @param {goog.graphics.Stroke} stroke Stroke object describing the stroke.\n * @param {goog.graphics.Fill} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper\n *     element to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.TextElement} The newly created element.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.drawTextOnLine = function(\n    text, x1, y1, x2, y2, align, font, stroke, fill, opt_group) {\n  var element = new goog.graphics.CanvasTextElement(\n      this, text, x1, y1, x2, y2, align,\n      /** @type {!goog.graphics.Font} */ (font), stroke, fill);\n  this.append(element, opt_group);\n  return element;\n};\n\n\n/**\n * Draw a path.\n * @param {!goog.graphics.Path} path The path object to draw.\n * @param {goog.graphics.Stroke} stroke Stroke object describing the stroke.\n * @param {goog.graphics.Fill} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper\n *     element to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.PathElement} The newly created element.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.drawPath = function(\n    path, stroke, fill, opt_group) {\n  var element =\n      new goog.graphics.CanvasPathElement(null, this, path, stroke, fill);\n  this.append(element, opt_group);\n  return element;\n};\n\n\n/**\n * @param {goog.graphics.GroupElement} group The group to possibly\n *     draw to.\n * @return {boolean} Whether drawing can occur now.\n */\ngoog.graphics.CanvasGraphics.prototype.isDrawable = function(group) {\n  return this.isInDocument() && !this.redrawTimeout_ &&\n      !this.isRedrawRequired(group);\n};\n\n\n/**\n * Returns true if drawing to the given group means a redraw is required.\n * @param {goog.graphics.GroupElement} group The group to draw to.\n * @return {boolean} Whether drawing to this group should force a redraw.\n */\ngoog.graphics.CanvasGraphics.prototype.isRedrawRequired = function(group) {\n  // TODO(robbyw): Moving up to any parent of lastGroup should not force redraw.\n  return group != this.canvasElement && group != this.lastGroup_;\n};\n\n\n/**\n * Create an empty group of drawing elements.\n *\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper\n *     element to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.CanvasGroupElement} The newly created group.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.createGroup = function(opt_group) {\n  var group = new goog.graphics.CanvasGroupElement(this);\n\n  opt_group = opt_group || this.canvasElement;\n\n  // TODO(robbyw): Moving up to any parent group should not force redraw.\n  if (opt_group == this.canvasElement || opt_group == this.lastGroup_) {\n    this.lastGroup_ = group;\n  }\n\n  this.append(group, opt_group);\n\n  return group;\n};\n\n\n/**\n * Measure and return the width (in pixels) of a given text string.\n * Text measurement is needed to make sure a text can fit in the allocated\n * area. The way text length is measured is by writing it into a div that is\n * after the visible area, measure the div width, and immediately erase the\n * written value.\n *\n * @param {string} text The text string to measure.\n * @param {goog.graphics.Font} font The font object describing the font style.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.getTextWidth = goog.abstractMethod;\n\n\n/**\n * Disposes of the component by removing event handlers, detacing DOM nodes from\n * the document body, and removing references to them.\n * @override\n * @protected\n */\ngoog.graphics.CanvasGraphics.prototype.disposeInternal = function() {\n  this.context_ = null;\n  goog.graphics.CanvasGraphics.superClass_.disposeInternal.call(this);\n};\n\n\n/** @override */\ngoog.graphics.CanvasGraphics.prototype.enterDocument = function() {\n  var oldPixelSize = this.getPixelSize();\n  goog.graphics.CanvasGraphics.superClass_.enterDocument.call(this);\n  if (!oldPixelSize) {\n    this.updateSize();\n    this.dispatchEvent(goog.events.EventType.RESIZE);\n  }\n  this.redraw();\n};\n\n\n/**\n * Start preventing redraws - useful for chaining large numbers of changes\n * together.  Not guaranteed to do anything - i.e. only use this for\n * optimization of a single code path.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.suspend = function() {\n  this.preventRedraw_ = true;\n};\n\n\n/**\n * Stop preventing redraws.  If any redraws had been prevented, a redraw will\n * be done now.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.resume = function() {\n  this.preventRedraw_ = false;\n\n  if (this.needsRedraw_) {\n    this.redraw();\n    this.needsRedraw_ = false;\n  }\n};\n\n\n/**\n * Removes an element from the Canvas.\n * @param {goog.graphics.Element} elem the element to remove.\n * @override\n */\ngoog.graphics.CanvasGraphics.prototype.removeElement = function(elem) {\n  if (!elem) {\n    return;\n  }\n  this.canvasElement.removeElement(elem);\n  this.redraw();\n};\n","^9I",1579837703000,"^9J",["^9K",["^@:","~$goog.graphics.AbstractGraphics","^@D","^@E","^@F","^G4","^9>","^@G","^:I","^@H","^<3","^@I","^;=","^H5"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/canvasgraphics.js"],"^:1",["^9K",["~$goog.graphics.CanvasGraphics"]],"^9<",true,"^9=",["^9>","^;=","^:I","^UG","^@H","^@E","^@I","^@G","^@D","^@F","^@:","^H5","^G4","^<3"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.net.rpc.httpcors.js","^9C",["^9D","goog/net/rpc/httpcors.js"],"^9E","goog/net/rpc/httpcors.js","^9F","^9G","^9H","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides CORS support for HTTP based RPC requests.\n *\n * As part of net.rpc package, CORS features provided by this class\n * depend on the server support. Please check related specs to decide how\n * to enable any of the features provided by this class.\n *\n */\n\ngoog.module('goog.net.rpc.HttpCors');\n\nvar GoogUri = goog.require('goog.Uri');\nvar googObject = goog.require('goog.object');\nvar googString = goog.require('goog.string');\nvar googUriUtils = goog.require('goog.uri.utils');\n\n\n/**\n * The default URL parameter name to overwrite http headers with a URL param\n * to avoid CORS preflight.\n *\n * See https://github.com/whatwg/fetch/issues/210#issue-129531743 for the spec.\n *\n * @type {string}\n */\nexports.HTTP_HEADERS_PARAM_NAME = '$httpHeaders';\n\n\n/**\n * The default URL parameter name to overwrite http method with a URL param\n * to avoid CORS preflight.\n *\n * See https://github.com/whatwg/fetch/issues/210#issue-129531743 for the spec.\n *\n * @type {string}\n */\nexports.HTTP_METHOD_PARAM_NAME = '$httpMethod';\n\n\n/**\n * Generates the URL parameter value with custom headers encoded as\n * HTTP/1.1 headers block.\n *\n * @param {!Object<string, string>} headers The custom headers.\n * @return {string} The URL param to overwrite custom HTTP headers.\n */\nexports.generateHttpHeadersOverwriteParam = function(headers) {\n  var result = '';\n  googObject.forEach(headers, function(value, key) {\n    result += key;\n    result += ':';\n    result += value;\n    result += '\\r\\n';\n  });\n  return result;\n};\n\n\n/**\n * Generates the URL-encoded URL parameter value with custom headers encoded as\n * HTTP/1.1 headers block.\n *\n * @param {!Object<string, string>} headers The custom headers.\n * @return {string} The URL param to overwrite custom HTTP headers.\n */\nexports.generateEncodedHttpHeadersOverwriteParam = function(headers) {\n  return googString.urlEncode(\n      exports.generateHttpHeadersOverwriteParam(headers));\n};\n\n\n/**\n * Sets custom HTTP headers via an overwrite URL param.\n *\n * @param {!GoogUri|string} url The URI object or a string path.\n * @param {string} urlParam The URL param name.\n * @param {!Object<string, string>} extraHeaders The HTTP headers.\n * @return {!GoogUri|string} The URI object or a string path with headers\n * encoded as a url param.\n */\nexports.setHttpHeadersWithOverwriteParam = function(\n    url, urlParam, extraHeaders) {\n  if (googObject.isEmpty(extraHeaders)) {\n    return url;\n  }\n  var httpHeaders = exports.generateHttpHeadersOverwriteParam(extraHeaders);\n  if (typeof url === 'string') {\n    return googUriUtils.appendParam(\n        url, googString.urlEncode(urlParam), httpHeaders);\n  } else {\n    url.setParameterValue(urlParam, httpHeaders);  // duplicate removed!\n    return url;\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^;O","^9L","^<S","^9>","^;P"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/rpc/httpcors.js"],"^:1",["^9K",["~$goog.net.rpc.HttpCors"]],"^9<",true,"^9=",["^9>","^<S","^;P","^9L","^;O"]],["^ ","^9A",[1579837703000],"^9B","goog.graphics.graphics.js","^9C",["^9D","goog/graphics/graphics.js"],"^9E","goog/graphics/graphics.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Graphics utility functions and factory methods.\n * @author arv@google.com (Erik Arvidsson)\n * @see ../demos/graphics/advancedcoordinates.html\n * @see ../demos/graphics/advancedcoordinates2.html\n * @see ../demos/graphics/basicelements.html\n * @see ../demos/graphics/events.html\n * @see ../demos/graphics/modifyelements.html\n * @see ../demos/graphics/tiger.html\n */\n\n\ngoog.provide('goog.graphics');\n\ngoog.require('goog.dom');\ngoog.require('goog.graphics.CanvasGraphics');\ngoog.require('goog.graphics.SvgGraphics');\ngoog.require('goog.graphics.VmlGraphics');\ngoog.require('goog.userAgent');\n\n\n/**\n * Returns an instance of goog.graphics.AbstractGraphics that knows how to draw\n * for the current platform (A factory for the proper Graphics implementation)\n * @param {string|number} width The width in pixels.  Strings\n *     expressing percentages of parent with (e.g. '80%') are also accepted.\n * @param {string|number} height The height in pixels.  Strings\n *     expressing percentages of parent with (e.g. '80%') are also accepted.\n * @param {?number=} opt_coordWidth The optional coordinate width - if\n *     omitted or null, defaults to same as width.\n * @param {?number=} opt_coordHeight The optional coordinate height - if\n *     omitted or null, defaults to same as height.\n * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper object for the\n *     document we want to render in.\n * @return {!goog.graphics.AbstractGraphics} The created instance.\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n */\ngoog.graphics.createGraphics = function(\n    width, height, opt_coordWidth, opt_coordHeight, opt_domHelper) {\n  var graphics;\n  // On IE9 and above, SVG is available, except in compatibility mode.\n  // We check createElementNS on document object that is not exist in\n  // compatibility mode.\n  if (goog.userAgent.IE && (!goog.userAgent.isVersionOrHigher('9') ||\n                            !(opt_domHelper || goog.dom.getDomHelper())\n                                 .getDocument()\n                                 .createElementNS)) {\n    graphics = new goog.graphics.VmlGraphics(\n        width, height, opt_coordWidth, opt_coordHeight, opt_domHelper);\n  } else if (\n      goog.userAgent.WEBKIT &&\n      (!goog.userAgent.isVersionOrHigher('420') || goog.userAgent.MOBILE)) {\n    graphics = new goog.graphics.CanvasGraphics(\n        width, height, opt_coordWidth, opt_coordHeight, opt_domHelper);\n  } else {\n    graphics = new goog.graphics.SvgGraphics(\n        width, height, opt_coordWidth, opt_coordHeight, opt_domHelper);\n  }\n\n  // Create the dom now, because all drawing methods require that the\n  // main dom element (the canvas) has been already created.\n  graphics.createDom();\n\n  return graphics;\n};\n\n\n/**\n * Returns an instance of goog.graphics.AbstractGraphics that knows how to draw\n * for the current platform (A factory for the proper Graphics implementation)\n * @param {string|number} width The width in pixels.  Strings\n *     expressing percentages of parent with (e.g. '80%') are also accepted.\n * @param {string|number} height The height in pixels.   Strings\n *     expressing percentages of parent with (e.g. '80%') are also accepted.\n * @param {?number=} opt_coordWidth The optional coordinate width, defaults to\n *     same as width.\n * @param {?number=} opt_coordHeight The optional coordinate height, defaults to\n *     same as height.\n * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper object for the\n *     document we want to render in.\n * @return {!goog.graphics.AbstractGraphics} The created instance.\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n */\ngoog.graphics.createSimpleGraphics = function(\n    width, height, opt_coordWidth, opt_coordHeight, opt_domHelper) {\n  if (goog.userAgent.MAC && goog.userAgent.GECKO &&\n      !goog.userAgent.isVersionOrHigher('1.9a')) {\n    // Canvas is 6x faster than SVG on Mac FF 2.0\n    var graphics = new goog.graphics.CanvasGraphics(\n        width, height, opt_coordWidth, opt_coordHeight, opt_domHelper);\n    graphics.createDom();\n    return graphics;\n  }\n\n  // Otherwise, defer to normal graphics object creation.\n  return goog.graphics.createGraphics(\n      width, height, opt_coordWidth, opt_coordHeight, opt_domHelper);\n};\n\n\n/**\n * Static function to check if the current browser has Graphics support.\n * @return {boolean} True if the current browser has Graphics support.\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n */\ngoog.graphics.isBrowserSupported = function() {\n  if (goog.userAgent.IE) {\n    return goog.userAgent.isVersionOrHigher('5.5');\n  }\n  if (goog.userAgent.GECKO) {\n    return goog.userAgent.isVersionOrHigher('1.8');\n  }\n  if (goog.userAgent.OPERA) {\n    return goog.userAgent.isVersionOrHigher('9.0');\n  }\n  if (goog.userAgent.WEBKIT) {\n    return goog.userAgent.isVersionOrHigher('412');\n  }\n  return false;\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","~$goog.graphics.SvgGraphics","^9>","^:S","~$goog.graphics.VmlGraphics","^UH"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/graphics.js"],"^:1",["^9K",["^H;"]],"^9<",true,"^9=",["^9>","^;;","^UH","^UJ","^UK","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.custombutton.js","^9C",["^9D","goog/ui/custombutton.js"],"^9E","goog/ui/custombutton.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A button rendered via {@link goog.ui.CustomButtonRenderer}.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.CustomButton');\n\ngoog.require('goog.ui.Button');\ngoog.require('goog.ui.CustomButtonRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * A custom button control.  Identical to {@link goog.ui.Button}, except it\n * defaults its renderer to {@link goog.ui.CustomButtonRenderer}.  One could\n * just as easily pass `goog.ui.CustomButtonRenderer.getInstance()` to\n * the {@link goog.ui.Button} constructor and get the same result.  Provided\n * for convenience.\n *\n * @param {goog.ui.ControlContent} content Text caption or existing DOM\n *    structure to display as the button's caption.\n * @param {goog.ui.ButtonRenderer=} opt_renderer Optional renderer used to\n *    render or decorate the button; defaults to\n *    {@link goog.ui.CustomButtonRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *    document interaction.\n * @constructor\n * @extends {goog.ui.Button}\n */\ngoog.ui.CustomButton = function(content, opt_renderer, opt_domHelper) {\n  goog.ui.Button.call(\n      this, content, opt_renderer || goog.ui.CustomButtonRenderer.getInstance(),\n      opt_domHelper);\n};\ngoog.inherits(goog.ui.CustomButton, goog.ui.Button);\n\n\n// Register a decorator factory function for goog.ui.CustomButtons.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.CustomButtonRenderer.CSS_CLASS, function() {\n      // CustomButton defaults to using CustomButtonRenderer.\n      return new goog.ui.CustomButton(null);\n    });\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:>","^GG","^JU"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/custombutton.js"],"^:1",["^9K",["~$goog.ui.CustomButton"]],"^9<",true,"^9=",["^9>","^JU","^GG","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.vec.vec4f.js","^9C",["^9D","goog/vec/vec4f.js"],"^9E","goog/vec/vec4f.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n//                                                                           //\n// Any edits to this file must be applied to vec4d.js by running:            //\n//   swap_type.sh vec4f.js > vec4d.js                                        //\n//                                                                           //\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n\n\n/**\n * @fileoverview Provides functions for operating on 4 element float (32bit)\n * vectors.\n *\n * The last parameter will typically be the output object and an object\n * can be both an input and output parameter to all methods except where\n * noted.\n *\n * See the README for notes about the design and structure of the API\n * (especially related to performance).\n *\n */\ngoog.provide('goog.vec.vec4f');\ngoog.provide('goog.vec.vec4f.Type');\n\n/** @suppress {extraRequire} */\ngoog.require('goog.vec');\n\n/** @typedef {!goog.vec.Float32} */ goog.vec.vec4f.Type;\n\n\n/**\n * Creates a vec4f with all elements initialized to zero.\n *\n * @return {!goog.vec.vec4f.Type} The new vec4f.\n */\ngoog.vec.vec4f.create = function() {\n  return new Float32Array(4);\n};\n\n\n/**\n * Creates a new vec4f initialized with the value from the given array.\n *\n * @param {!Array<number>} vec The source 4 element array.\n * @return {!goog.vec.vec4f.Type} The new vec4f.\n */\ngoog.vec.vec4f.createFromArray = function(vec) {\n  var newVec = goog.vec.vec4f.create();\n  goog.vec.vec4f.setFromArray(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Creates a new vec4f initialized with the supplied values.\n *\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @param {number} v3 The value for element at index 3.\n * @return {!goog.vec.vec4f.Type} The new vector.\n */\ngoog.vec.vec4f.createFromValues = function(v0, v1, v2, v3) {\n  var vec = goog.vec.vec4f.create();\n  goog.vec.vec4f.setFromValues(vec, v0, v1, v2, v3);\n  return vec;\n};\n\n\n/**\n * Creates a clone of the given vec4f.\n *\n * @param {!goog.vec.vec4f.Type} vec The source vec4f.\n * @return {!goog.vec.vec4f.Type} The new cloned vec4f.\n */\ngoog.vec.vec4f.clone = function(vec) {\n  var newVec = goog.vec.vec4f.create();\n  goog.vec.vec4f.setFromVec4f(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Initializes the vector with the given values.\n *\n * @param {!goog.vec.vec4f.Type} vec The vector to receive the values.\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @param {number} v3 The value for element at index 3.\n * @return {!goog.vec.vec4f.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4f.setFromValues = function(vec, v0, v1, v2, v3) {\n  vec[0] = v0;\n  vec[1] = v1;\n  vec[2] = v2;\n  vec[3] = v3;\n  return vec;\n};\n\n\n/**\n * Initializes vec4f vec from vec4f src.\n *\n * @param {!goog.vec.vec4f.Type} vec The destination vector.\n * @param {!goog.vec.vec4f.Type} src The source vector.\n * @return {!goog.vec.vec4f.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4f.setFromVec4f = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  vec[2] = src[2];\n  vec[3] = src[3];\n  return vec;\n};\n\n\n/**\n * Initializes vec4f vec from vec4d src (typed as a Float64Array to\n * avoid circular goog.requires).\n *\n * @param {!goog.vec.vec4f.Type} vec The destination vector.\n * @param {Float64Array} src The source vector.\n * @return {!goog.vec.vec4f.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4f.setFromVec4d = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  vec[2] = src[2];\n  vec[3] = src[3];\n  return vec;\n};\n\n\n/**\n * Initializes vec4f vec from Array src.\n *\n * @param {!goog.vec.vec4f.Type} vec The destination vector.\n * @param {Array<number>} src The source vector.\n * @return {!goog.vec.vec4f.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4f.setFromArray = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  vec[2] = src[2];\n  vec[3] = src[3];\n  return vec;\n};\n\n\n/**\n * Performs a component-wise addition of vec0 and vec1 together storing the\n * result into resultVec.\n *\n * @param {!goog.vec.vec4f.Type} vec0 The first addend.\n * @param {!goog.vec.vec4f.Type} vec1 The second addend.\n * @param {!goog.vec.vec4f.Type} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.vec4f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4f.add = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] + vec1[0];\n  resultVec[1] = vec0[1] + vec1[1];\n  resultVec[2] = vec0[2] + vec1[2];\n  resultVec[3] = vec0[3] + vec1[3];\n  return resultVec;\n};\n\n\n/**\n * Performs a component-wise subtraction of vec1 from vec0 storing the\n * result into resultVec.\n *\n * @param {!goog.vec.vec4f.Type} vec0 The minuend.\n * @param {!goog.vec.vec4f.Type} vec1 The subtrahend.\n * @param {!goog.vec.vec4f.Type} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.vec4f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4f.subtract = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] - vec1[0];\n  resultVec[1] = vec0[1] - vec1[1];\n  resultVec[2] = vec0[2] - vec1[2];\n  resultVec[3] = vec0[3] - vec1[3];\n  return resultVec;\n};\n\n\n/**\n * Negates vec0, storing the result into resultVec.\n *\n * @param {!goog.vec.vec4f.Type} vec0 The vector to negate.\n * @param {!goog.vec.vec4f.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec4f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4f.negate = function(vec0, resultVec) {\n  resultVec[0] = -vec0[0];\n  resultVec[1] = -vec0[1];\n  resultVec[2] = -vec0[2];\n  resultVec[3] = -vec0[3];\n  return resultVec;\n};\n\n\n/**\n * Takes the absolute value of each component of vec0 storing the result in\n * resultVec.\n *\n * @param {!goog.vec.vec4f.Type} vec0 The source vector.\n * @param {!goog.vec.vec4f.Type} resultVec The vector to receive the result.\n *     May be vec0.\n * @return {!goog.vec.vec4f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4f.abs = function(vec0, resultVec) {\n  resultVec[0] = Math.abs(vec0[0]);\n  resultVec[1] = Math.abs(vec0[1]);\n  resultVec[2] = Math.abs(vec0[2]);\n  resultVec[3] = Math.abs(vec0[3]);\n  return resultVec;\n};\n\n\n/**\n * Multiplies each component of vec0 with scalar storing the product into\n * resultVec.\n *\n * @param {!goog.vec.vec4f.Type} vec0 The source vector.\n * @param {number} scalar The value to multiply with each component of vec0.\n * @param {!goog.vec.vec4f.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec4f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4f.scale = function(vec0, scalar, resultVec) {\n  resultVec[0] = vec0[0] * scalar;\n  resultVec[1] = vec0[1] * scalar;\n  resultVec[2] = vec0[2] * scalar;\n  resultVec[3] = vec0[3] * scalar;\n  return resultVec;\n};\n\n\n/**\n * Returns the magnitudeSquared of the given vector.\n *\n * @param {!goog.vec.vec4f.Type} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.vec4f.magnitudeSquared = function(vec0) {\n  var x = vec0[0], y = vec0[1], z = vec0[2], w = vec0[3];\n  return x * x + y * y + z * z + w * w;\n};\n\n\n/**\n * Returns the magnitude of the given vector.\n *\n * @param {!goog.vec.vec4f.Type} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.vec4f.magnitude = function(vec0) {\n  var x = vec0[0], y = vec0[1], z = vec0[2], w = vec0[3];\n  return Math.sqrt(x * x + y * y + z * z + w * w);\n};\n\n\n/**\n * Normalizes the given vector storing the result into resultVec.\n *\n * @param {!goog.vec.vec4f.Type} vec0 The vector to normalize.\n * @param {!goog.vec.vec4f.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec4f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4f.normalize = function(vec0, resultVec) {\n  var x = vec0[0], y = vec0[1], z = vec0[2], w = vec0[3];\n  var ilen = 1 / Math.sqrt(x * x + y * y + z * z + w * w);\n  resultVec[0] = x * ilen;\n  resultVec[1] = y * ilen;\n  resultVec[2] = z * ilen;\n  resultVec[3] = w * ilen;\n  return resultVec;\n};\n\n\n/**\n * Returns the scalar product of vectors v0 and v1.\n *\n * @param {!goog.vec.vec4f.Type} v0 The first vector.\n * @param {!goog.vec.vec4f.Type} v1 The second vector.\n * @return {number} The scalar product.\n */\ngoog.vec.vec4f.dot = function(v0, v1) {\n  return v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2] + v0[3] * v1[3];\n};\n\n\n/**\n * Linearly interpolate from v0 to v1 according to f. The value of f should be\n * in the range [0..1] otherwise the results are undefined.\n *\n * @param {!goog.vec.vec4f.Type} v0 The first vector.\n * @param {!goog.vec.vec4f.Type} v1 The second vector.\n * @param {number} f The interpolation factor.\n * @param {!goog.vec.vec4f.Type} resultVec The vector to receive the\n *     results (may be v0 or v1).\n * @return {!goog.vec.vec4f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4f.lerp = function(v0, v1, f, resultVec) {\n  var x = v0[0], y = v0[1], z = v0[2], w = v0[3];\n  resultVec[0] = (v1[0] - x) * f + x;\n  resultVec[1] = (v1[1] - y) * f + y;\n  resultVec[2] = (v1[2] - z) * f + z;\n  resultVec[3] = (v1[3] - w) * f + w;\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the larger values in resultVec.\n *\n * @param {!goog.vec.vec4f.Type} vec0 The source vector.\n * @param {!goog.vec.vec4f.Type|number} limit The limit vector or scalar.\n * @param {!goog.vec.vec4f.Type} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.vec4f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4f.max = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.max(vec0[0], limit);\n    resultVec[1] = Math.max(vec0[1], limit);\n    resultVec[2] = Math.max(vec0[2], limit);\n    resultVec[3] = Math.max(vec0[3], limit);\n  } else {\n    resultVec[0] = Math.max(vec0[0], limit[0]);\n    resultVec[1] = Math.max(vec0[1], limit[1]);\n    resultVec[2] = Math.max(vec0[2], limit[2]);\n    resultVec[3] = Math.max(vec0[3], limit[3]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the smaller values in resultVec.\n *\n * @param {!goog.vec.vec4f.Type} vec0 The source vector.\n * @param {!goog.vec.vec4f.Type|number} limit The limit vector or scalar.\n * @param {!goog.vec.vec4f.Type} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.vec4f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4f.min = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.min(vec0[0], limit);\n    resultVec[1] = Math.min(vec0[1], limit);\n    resultVec[2] = Math.min(vec0[2], limit);\n    resultVec[3] = Math.min(vec0[3], limit);\n  } else {\n    resultVec[0] = Math.min(vec0[0], limit[0]);\n    resultVec[1] = Math.min(vec0[1], limit[1]);\n    resultVec[2] = Math.min(vec0[2], limit[2]);\n    resultVec[3] = Math.min(vec0[3], limit[3]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Returns true if the components of v0 are equal to the components of v1.\n *\n * @param {!goog.vec.vec4f.Type} v0 The first vector.\n * @param {!goog.vec.vec4f.Type} v1 The second vector.\n * @return {boolean} True if the vectors are equal, false otherwise.\n */\ngoog.vec.vec4f.equals = function(v0, v1) {\n  return v0.length == v1.length && v0[0] == v1[0] && v0[1] == v1[1] &&\n      v0[2] == v1[2] && v0[3] == v1[3];\n};\n","^9I",1579837703000,"^9J",["^9K",["^;2","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/vec4f.js"],"^:1",["^9K",["~$goog.vec.vec4f.Type","^TH"]],"^9<",true,"^9=",["^9>","^;2"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.idletimer.js","^9C",["^9D","goog/ui/idletimer.js"],"^9E","goog/ui/idletimer.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Idle Timer.\n *\n * Keeps track of transitions between active and idle. This class is built on\n * top of ActivityMonitor. Whenever an active user becomes idle, this class\n * dispatches a BECOME_IDLE event. Whenever an idle user becomes active, this\n * class dispatches a BECOME_ACTIVE event. The amount of inactive time it\n * takes for a user to be considered idle is specified by the client, and\n * different instances of this class can all use different thresholds.\n *\n */\n\ngoog.provide('goog.ui.IdleTimer');\ngoog.require('goog.Timer');\ngoog.require('goog.events');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.structs.Set');\ngoog.require('goog.ui.ActivityMonitor');\n\n\n\n/**\n * Event target that will give notification of state changes between active and\n * idle. This class is designed to require few resources while the user is\n * active.\n * @param {number} idleThreshold Amount of time in ms at which we consider the\n *     user has gone idle.\n * @param {goog.ui.ActivityMonitor=} opt_activityMonitor The activity monitor\n *     keeping track of user interaction. Defaults to a default-constructed\n *     activity monitor. If a default activity monitor is used then this class\n *     will dispose of it. If an activity monitor is passed in then the caller\n *     remains responsible for disposing of it.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.ui.IdleTimer = function(idleThreshold, opt_activityMonitor) {\n  goog.events.EventTarget.call(this);\n\n  var activityMonitor =\n      opt_activityMonitor || this.getDefaultActivityMonitor_();\n\n  /**\n   * The amount of time in ms at which we consider the user has gone idle\n   * @type {number}\n   * @private\n   */\n  this.idleThreshold_ = idleThreshold;\n\n  /**\n   * The activity monitor keeping track of user interaction\n   * @type {goog.ui.ActivityMonitor}\n   * @private\n   */\n  this.activityMonitor_ = activityMonitor;\n\n  /**\n   * Cached onActivityTick_ bound to the object for later use\n   * @type {Function}\n   * @private\n   */\n  this.boundOnActivityTick_ = goog.bind(this.onActivityTick_, this);\n\n  // Decide whether the user is currently active or idle. This method will\n  // check whether it is correct to start with the user in the active state.\n  this.maybeStillActive_();\n};\ngoog.inherits(goog.ui.IdleTimer, goog.events.EventTarget);\n\n\n/**\n * Whether a listener is currently registered for an idle timer event. On\n * initialization, the user is assumed to be active.\n * @type {boolean}\n * @private\n */\ngoog.ui.IdleTimer.prototype.hasActivityListener_ = false;\n\n\n/**\n * Handle to the timer ID used for checking ongoing activity, or null\n * @type {?number}\n * @private\n */\ngoog.ui.IdleTimer.prototype.onActivityTimerId_ = null;\n\n\n/**\n * Whether the user is currently idle\n * @type {boolean}\n * @private\n */\ngoog.ui.IdleTimer.prototype.isIdle_ = false;\n\n\n/**\n * The default activity monitor created by this class, if any\n * @type {goog.ui.ActivityMonitor?}\n * @private\n */\ngoog.ui.IdleTimer.defaultActivityMonitor_ = null;\n\n\n/**\n * The idle timers that currently reference the default activity monitor\n * @type {goog.structs.Set}\n * @private\n */\ngoog.ui.IdleTimer.defaultActivityMonitorReferences_ = new goog.structs.Set();\n\n\n/**\n * Event constants for the idle timer event target\n * @enum {string}\n */\ngoog.ui.IdleTimer.Event = {\n  /** Event fired when an idle user transitions into the active state */\n  BECOME_ACTIVE: 'active',\n  /** Event fired when an active user transitions into the idle state */\n  BECOME_IDLE: 'idle'\n};\n\n\n/**\n * Gets the default activity monitor used by this class. If a default has not\n * been created yet, then a new one will be created.\n * @return {!goog.ui.ActivityMonitor} The default activity monitor.\n * @private\n */\ngoog.ui.IdleTimer.prototype.getDefaultActivityMonitor_ = function() {\n  goog.ui.IdleTimer.defaultActivityMonitorReferences_.add(this);\n  if (goog.ui.IdleTimer.defaultActivityMonitor_ == null) {\n    goog.ui.IdleTimer.defaultActivityMonitor_ = new goog.ui.ActivityMonitor();\n  }\n  return goog.ui.IdleTimer.defaultActivityMonitor_;\n};\n\n\n/**\n * Removes the reference to the default activity monitor. If there are no more\n * references then the default activity monitor gets disposed.\n * @private\n */\ngoog.ui.IdleTimer.prototype.maybeDisposeDefaultActivityMonitor_ = function() {\n  goog.ui.IdleTimer.defaultActivityMonitorReferences_.remove(this);\n  if (goog.ui.IdleTimer.defaultActivityMonitor_ != null &&\n      goog.ui.IdleTimer.defaultActivityMonitorReferences_.isEmpty()) {\n    goog.ui.IdleTimer.defaultActivityMonitor_.dispose();\n    goog.ui.IdleTimer.defaultActivityMonitor_ = null;\n  }\n};\n\n\n/**\n * Checks whether the user is active. If the user is still active, then a timer\n * is started to check again later.\n * @private\n */\ngoog.ui.IdleTimer.prototype.maybeStillActive_ = function() {\n  // See how long before the user would go idle. The user is considered idle\n  // after the idle time has passed, not exactly when the idle time arrives.\n  var remainingIdleThreshold = this.idleThreshold_ + 1 -\n      (goog.now() - this.activityMonitor_.getLastEventTime());\n  if (remainingIdleThreshold > 0) {\n    // The user is still active. Check again later.\n    this.onActivityTimerId_ =\n        goog.Timer.callOnce(this.boundOnActivityTick_, remainingIdleThreshold);\n  } else {\n    // The user has not been active recently.\n    this.becomeIdle_();\n  }\n};\n\n\n/**\n * Handler for the timeout used for checking ongoing activity\n * @private\n */\ngoog.ui.IdleTimer.prototype.onActivityTick_ = function() {\n  // The timer has fired.\n  this.onActivityTimerId_ = null;\n\n  // The maybeStillActive method will restart the timer, if appropriate.\n  this.maybeStillActive_();\n};\n\n\n/**\n * Transitions from the active state to the idle state\n * @private\n */\ngoog.ui.IdleTimer.prototype.becomeIdle_ = function() {\n  this.isIdle_ = true;\n\n  // The idle timer will send notification when the user does something\n  // interactive.\n  goog.events.listen(\n      this.activityMonitor_, goog.ui.ActivityMonitor.Event.ACTIVITY,\n      this.onActivity_, false, this);\n  this.hasActivityListener_ = true;\n\n  // Notify clients of the state change.\n  this.dispatchEvent(goog.ui.IdleTimer.Event.BECOME_IDLE);\n};\n\n\n/**\n * Handler for idle timer events when the user does something interactive\n * @param {goog.events.Event} e The event object.\n * @private\n */\ngoog.ui.IdleTimer.prototype.onActivity_ = function(e) {\n  this.becomeActive_();\n};\n\n\n/**\n * Transitions from the idle state to the active state\n * @private\n */\ngoog.ui.IdleTimer.prototype.becomeActive_ = function() {\n  this.isIdle_ = false;\n\n  // Stop listening to every interactive event.\n  this.removeActivityListener_();\n\n  // Notify clients of the state change.\n  this.dispatchEvent(goog.ui.IdleTimer.Event.BECOME_ACTIVE);\n\n  // Periodically check whether the user has gone inactive.\n  this.maybeStillActive_();\n};\n\n\n/**\n * Removes the activity listener, if necessary\n * @private\n */\ngoog.ui.IdleTimer.prototype.removeActivityListener_ = function() {\n  if (this.hasActivityListener_) {\n    goog.events.unlisten(\n        this.activityMonitor_, goog.ui.ActivityMonitor.Event.ACTIVITY,\n        this.onActivity_, false, this);\n    this.hasActivityListener_ = false;\n  }\n};\n\n\n/** @override */\ngoog.ui.IdleTimer.prototype.disposeInternal = function() {\n  this.removeActivityListener_();\n  if (this.onActivityTimerId_ != null) {\n    goog.global.clearTimeout(this.onActivityTimerId_);\n    this.onActivityTimerId_ = null;\n  }\n  this.maybeDisposeDefaultActivityMonitor_();\n  goog.ui.IdleTimer.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * @return {number} the amount of time at which we consider the user has gone\n *     idle in ms.\n */\ngoog.ui.IdleTimer.prototype.getIdleThreshold = function() {\n  return this.idleThreshold_;\n};\n\n\n/**\n * @return {goog.ui.ActivityMonitor} the activity monitor keeping track of user\n *     interaction.\n */\ngoog.ui.IdleTimer.prototype.getActivityMonitor = function() {\n  return this.activityMonitor_;\n};\n\n\n/**\n * Returns true if there has been no user action for at least the specified\n * interval, and false otherwise\n * @return {boolean} true if the user is idle, false otherwise.\n */\ngoog.ui.IdleTimer.prototype.isIdle = function() {\n  return this.isIdle_;\n};\n","^9I",1579837703000,"^9J",["^9K",["^><","^KW","^9>","^:L","^:N","^HR"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/idletimer.js"],"^:1",["^9K",["~$goog.ui.IdleTimer"]],"^9<",true,"^9=",["^9>","^><","^:N","^:L","^HR","^KW"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.savedcaretrange.js","^9C",["^9D","goog/dom/savedcaretrange.js"],"^9E","goog/dom/savedcaretrange.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An API for saving and restoring ranges as HTML carets.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\n\ngoog.provide('goog.dom.SavedCaretRange');\n\ngoog.forwardDeclare('goog.dom.AbstractRange');\ngoog.forwardDeclare('goog.dom.Range');\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.SavedRange');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.string');\n\n\n/**\n * A struct for holding context about saved selections.\n * This can be used to preserve the selection and restore while the DOM is\n * manipulated, or through an asynchronous call. Use goog.dom.Range factory\n * methods to obtain an {@see goog.dom.AbstractRange} instance, and use\n * {@see goog.dom.AbstractRange#saveUsingCarets} to obtain a SavedCaretRange.\n * For editor ranges under content-editable elements or design-mode iframes,\n * prefer using {@see goog.editor.range.saveUsingNormalizedCarets}.\n * @param {goog.dom.AbstractRange} range The range being saved.\n * @constructor\n * @extends {goog.dom.SavedRange}\n */\ngoog.dom.SavedCaretRange = function(range) {\n  goog.dom.SavedRange.call(this);\n\n  /**\n   * The DOM id of the caret at the start of the range.\n   * @type {string}\n   * @private\n   */\n  this.startCaretId_ = goog.string.createUniqueString();\n\n  /**\n   * The DOM id of the caret at the end of the range.\n   * @type {string}\n   * @private\n   */\n  this.endCaretId_ = goog.string.createUniqueString();\n\n  /**\n   * Whether the range is reversed (anchor at the end).\n   * @private {boolean}\n   */\n  this.reversed_ = range.isReversed();\n\n  /**\n   * A DOM helper for storing the current document context.\n   * @type {goog.dom.DomHelper}\n   * @private\n   */\n  this.dom_ = goog.dom.getDomHelper(range.getDocument());\n\n  range.surroundWithNodes(this.createCaret_(true), this.createCaret_(false));\n};\ngoog.inherits(goog.dom.SavedCaretRange, goog.dom.SavedRange);\n\n\n/**\n * Gets the range that this SavedCaretRage represents, without selecting it\n * or removing the carets from the DOM.\n * @return {goog.dom.AbstractRange?} An abstract range.\n * @suppress {missingRequire,undefinedNames} circular dependency\n */\ngoog.dom.SavedCaretRange.prototype.toAbstractRange = function() {\n  var range = null;\n  var startCaret = this.getCaret(true);\n  var endCaret = this.getCaret(false);\n  if (startCaret && endCaret) {\n    range = goog.dom.Range.createFromNodes(startCaret, 0, endCaret, 0);\n  }\n  return range;\n};\n\n\n/**\n * Gets carets.\n * @param {boolean} start If true, returns the start caret. Otherwise, get the\n *     end caret.\n * @return {Element} The start or end caret in the given document.\n */\ngoog.dom.SavedCaretRange.prototype.getCaret = function(start) {\n  return this.dom_.getElement(start ? this.startCaretId_ : this.endCaretId_);\n};\n\n\n/**\n * Removes the carets from the current restoration document.\n * @param {goog.dom.AbstractRange=} opt_range A range whose offsets have already\n *     been adjusted for caret removal; it will be adjusted if it is also\n *     affected by post-removal operations, such as text node normalization.\n * @return {goog.dom.AbstractRange|undefined} The adjusted range, if opt_range\n *     was provided.\n */\ngoog.dom.SavedCaretRange.prototype.removeCarets = function(opt_range) {\n  goog.dom.removeNode(this.getCaret(true));\n  goog.dom.removeNode(this.getCaret(false));\n  return opt_range;\n};\n\n\n/**\n * Sets the document where the range will be restored.\n * @param {!Document} doc An HTML document.\n */\ngoog.dom.SavedCaretRange.prototype.setRestorationDocument = function(doc) {\n  this.dom_.setDocument(doc);\n};\n\n\n/**\n * Reconstruct the selection from the given saved range. Removes carets after\n * restoring the selection. If restore does not dispose this saved range, it may\n * only be restored a second time if innerHTML or some other mechanism is used\n * to restore the carets to the dom.\n * @return {goog.dom.AbstractRange?} Restored selection.\n * @override\n * @protected\n */\ngoog.dom.SavedCaretRange.prototype.restoreInternal = function() {\n  var range = null;\n  var anchorCaret = this.getCaret(!this.reversed_);\n  var focusCaret = this.getCaret(this.reversed_);\n  if (anchorCaret && focusCaret) {\n    var anchorNode = anchorCaret.parentNode;\n    var anchorOffset = goog.array.indexOf(anchorNode.childNodes, anchorCaret);\n    var focusNode = focusCaret.parentNode;\n    var focusOffset = goog.array.indexOf(focusNode.childNodes, focusCaret);\n    if (focusNode == anchorNode) {\n      // Compensate for the start caret being removed.\n      if (this.reversed_) {\n        anchorOffset--;\n      } else {\n        focusOffset--;\n      }\n    }\n    /** @suppress {missingRequire,undefinedNames} circular dependency */\n    range = goog.dom.Range.createFromNodes(\n        anchorNode, anchorOffset, focusNode, focusOffset);\n    range = this.removeCarets(range);\n    range.select();\n  } else {\n    // If only one caret was found, remove it.\n    this.removeCarets();\n  }\n  return range;\n};\n\n\n/**\n * Dispose the saved range and remove the carets from the DOM.\n * @override\n */\ngoog.dom.SavedCaretRange.prototype.disposeInternal = function() {\n  this.removeCarets();\n  this.dom_ = null;\n};\n\n\n/**\n * Creates a caret element.\n * @param {boolean} start If true, creates the start caret. Otherwise,\n *     creates the end caret.\n * @return {!Element} The new caret element.\n * @private\n */\ngoog.dom.SavedCaretRange.prototype.createCaret_ = function(start) {\n  return this.dom_.createDom(\n      goog.dom.TagName.SPAN,\n      {'id': start ? this.startCaretId_ : this.endCaretId_});\n};\n\n\n/**\n * A regex that will match all saved range carets in a string.\n * @type {RegExp}\n */\ngoog.dom.SavedCaretRange.CARET_REGEX = /<span\\s+id=\"?goog_\\d+\"?><\\/span>/ig;\n\n\n/**\n * Returns whether two strings of html are equal, ignoring any saved carets.\n * Thus two strings of html whose only difference is the id of their saved\n * carets will be considered equal, since they represent html with the\n * same selection.\n * @param {string} str1 The first string.\n * @param {string} str2 The second string.\n * @return {boolean} Whether two strings of html are equal, ignoring any\n *     saved carets.\n */\ngoog.dom.SavedCaretRange.htmlEqual = function(str1, str2) {\n  return str1 == str2 ||\n      str1.replace(goog.dom.SavedCaretRange.CARET_REGEX, '') ==\n      str2.replace(goog.dom.SavedCaretRange.CARET_REGEX, '');\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","^S>","^9L","^9>","^;9","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/savedcaretrange.js"],"^:1",["^9K",["~$goog.dom.SavedCaretRange"]],"^9<",true,"^9=",["^9>","^;9","^;;","^S>","^;=","^9L"]],["^ ","^9A",[1579837703000],"^9B","goog.editor.plugins.tableeditor.js","^9C",["^9D","goog/editor/plugins/tableeditor.js"],"^9E","goog/editor/plugins/tableeditor.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Plugin that enables table editing.\n *\n * @see ../../demos/editor/tableeditor.html\n */\n\ngoog.provide('goog.editor.plugins.TableEditor');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.Range');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.editor.Plugin');\ngoog.require('goog.editor.Table');\ngoog.require('goog.editor.node');\ngoog.require('goog.editor.range');\ngoog.require('goog.object');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Plugin that adds support for table creation and editing commands.\n * @constructor\n * @extends {goog.editor.Plugin}\n * @final\n */\ngoog.editor.plugins.TableEditor = function() {\n  goog.editor.plugins.TableEditor.base(this, 'constructor');\n\n  /**\n   * The array of functions that decide whether a table element could be\n   * editable by the user or not.\n   * @type {Array<function(Element):boolean>}\n   * @private\n   */\n  this.isTableEditableFunctions_ = [];\n\n  /**\n   * The pre-bound function that decides whether a table element could be\n   * editable by the user or not overall.\n   * @type {function(Node):boolean}\n   * @private\n   */\n  this.isUserEditableTableBound_ = goog.bind(this.isUserEditableTable_, this);\n};\ngoog.inherits(goog.editor.plugins.TableEditor, goog.editor.Plugin);\n\n\n/** @override */\n// TODO(user): remove this once there's a sensible default\n// implementation in the base Plugin.\ngoog.editor.plugins.TableEditor.prototype.getTrogClassId = function() {\n  return String(goog.getUid(this.constructor));\n};\n\n\n/**\n * Commands supported by goog.editor.plugins.TableEditor.\n * @enum {string}\n */\ngoog.editor.plugins.TableEditor.COMMAND = {\n  TABLE: '+table',\n  INSERT_ROW_AFTER: '+insertRowAfter',\n  INSERT_ROW_BEFORE: '+insertRowBefore',\n  INSERT_COLUMN_AFTER: '+insertColumnAfter',\n  INSERT_COLUMN_BEFORE: '+insertColumnBefore',\n  REMOVE_ROWS: '+removeRows',\n  REMOVE_COLUMNS: '+removeColumns',\n  SPLIT_CELL: '+splitCell',\n  MERGE_CELLS: '+mergeCells',\n  REMOVE_TABLE: '+removeTable'\n};\n\n\n/**\n * Inverse map of execCommand strings to\n * {@link goog.editor.plugins.TableEditor.COMMAND} constants. Used to\n * determine whether a string corresponds to a command this plugin handles\n * in O(1) time.\n * @type {Object}\n * @private\n */\ngoog.editor.plugins.TableEditor.SUPPORTED_COMMANDS_ =\n    goog.object.transpose(goog.editor.plugins.TableEditor.COMMAND);\n\n\n/**\n * Whether the string corresponds to a command this plugin handles.\n * @param {string} command Command string to check.\n * @return {boolean} Whether the string corresponds to a command\n *     this plugin handles.\n * @override\n */\ngoog.editor.plugins.TableEditor.prototype.isSupportedCommand = function(\n    command) {\n  return command in goog.editor.plugins.TableEditor.SUPPORTED_COMMANDS_;\n};\n\n\n/** @override */\ngoog.editor.plugins.TableEditor.prototype.enable = function(fieldObject) {\n  goog.editor.plugins.TableEditor.base(this, 'enable', fieldObject);\n\n  // enableObjectResizing is supported only for Gecko.\n  // You can refer to http://qooxdoo.org/contrib/project/htmlarea/html_editing\n  // for a compatibility chart.\n  if (goog.userAgent.GECKO) {\n    var doc = this.getFieldDomHelper().getDocument();\n    doc.execCommand('enableObjectResizing', false, 'true');\n  }\n};\n\n\n/**\n * Returns the currently selected table.\n * @return {Element?} The table in which the current selection is\n *     contained, or null if there isn't such a table.\n * @private\n */\ngoog.editor.plugins.TableEditor.prototype.getCurrentTable_ = function() {\n  var selectedElement = this.getFieldObject().getRange().getContainer();\n  return this.getAncestorTable_(selectedElement);\n};\n\n\n/**\n * Finds the first user-editable table element in the input node's ancestors.\n * @param {Node?} node The node to start with.\n * @return {Element?} The table element that is closest ancestor of the node.\n * @private\n */\ngoog.editor.plugins.TableEditor.prototype.getAncestorTable_ = function(node) {\n  var ancestor =\n      goog.dom.getAncestor(node, this.isUserEditableTableBound_, true);\n  if (goog.editor.node.isEditable(ancestor)) {\n    return /** @type {Element?} */ (ancestor);\n  } else {\n    return null;\n  }\n};\n\n\n/**\n * Returns the current value of a given command. Currently this plugin\n * only returns a value for goog.editor.plugins.TableEditor.COMMAND.TABLE.\n * @override\n */\ngoog.editor.plugins.TableEditor.prototype.queryCommandValue = function(\n    command) {\n  if (command == goog.editor.plugins.TableEditor.COMMAND.TABLE) {\n    return !!this.getCurrentTable_();\n  }\n};\n\n\n/** @override */\ngoog.editor.plugins.TableEditor.prototype.execCommandInternal = function(\n    command, opt_arg) {\n  var result = null;\n  // TD/TH in which to place the cursor, if the command destroys the current\n  // cursor position.\n  var cursorCell = null;\n  var range = this.getFieldObject().getRange();\n  if (command == goog.editor.plugins.TableEditor.COMMAND.TABLE) {\n    // Don't create a table if the cursor isn't in an editable region.\n    if (!goog.editor.range.isEditable(range)) {\n      return null;\n    }\n    // Create the table.\n    var tableProps = opt_arg || {width: 4, height: 2};\n    var doc = this.getFieldDomHelper().getDocument();\n    var table = goog.editor.Table.createDomTable(\n        doc, tableProps.width, tableProps.height);\n    range.replaceContentsWithNode(table);\n    // In IE, replaceContentsWithNode uses pasteHTML, so we lose our reference\n    // to the inserted table.\n    // TODO(user): use the reference to the table element returned from\n    // replaceContentsWithNode.\n    if (!goog.userAgent.IE) {\n      cursorCell = goog.dom.getElementsByTagName(goog.dom.TagName.TD, table)[0];\n    }\n  } else {\n    var cellSelection = new goog.editor.plugins.TableEditor.CellSelection_(\n        range, goog.bind(this.getAncestorTable_, this));\n    var table = cellSelection.getTable();\n    if (!table) {\n      return null;\n    }\n    switch (command) {\n      case goog.editor.plugins.TableEditor.COMMAND.INSERT_ROW_BEFORE:\n        table.insertRow(cellSelection.getFirstRowIndex());\n        break;\n      case goog.editor.plugins.TableEditor.COMMAND.INSERT_ROW_AFTER:\n        table.insertRow(cellSelection.getLastRowIndex() + 1);\n        break;\n      case goog.editor.plugins.TableEditor.COMMAND.INSERT_COLUMN_BEFORE:\n        table.insertColumn(cellSelection.getFirstColumnIndex());\n        break;\n      case goog.editor.plugins.TableEditor.COMMAND.INSERT_COLUMN_AFTER:\n        table.insertColumn(cellSelection.getLastColumnIndex() + 1);\n        break;\n      case goog.editor.plugins.TableEditor.COMMAND.REMOVE_ROWS:\n        var startRow = cellSelection.getFirstRowIndex();\n        var endRow = cellSelection.getLastRowIndex();\n        if (startRow == 0 && endRow == (table.rows.length - 1)) {\n          // Instead of deleting all rows, delete the entire table.\n          return this.execCommandInternal(\n              goog.editor.plugins.TableEditor.COMMAND.REMOVE_TABLE);\n        }\n        var startColumn = cellSelection.getFirstColumnIndex();\n        var rowCount = (endRow - startRow) + 1;\n        for (var i = 0; i < rowCount; i++) {\n          table.removeRow(startRow);\n        }\n        if (table.rows.length > 0) {\n          // Place cursor in the previous/first row.\n          var closestRow = Math.min(startRow, table.rows.length - 1);\n          cursorCell = table.rows[closestRow].columns[startColumn].element;\n        }\n        break;\n      case goog.editor.plugins.TableEditor.COMMAND.REMOVE_COLUMNS:\n        var startCol = cellSelection.getFirstColumnIndex();\n        var endCol = cellSelection.getLastColumnIndex();\n        if (startCol == 0 && endCol == (table.rows[0].columns.length - 1)) {\n          // Instead of deleting all columns, delete the entire table.\n          return this.execCommandInternal(\n              goog.editor.plugins.TableEditor.COMMAND.REMOVE_TABLE);\n        }\n        var startRow = cellSelection.getFirstRowIndex();\n        var removeCount = (endCol - startCol) + 1;\n        for (var i = 0; i < removeCount; i++) {\n          table.removeColumn(startCol);\n        }\n        var currentRow = table.rows[startRow];\n        if (currentRow) {\n          // Place cursor in the previous/first column.\n          var closestCol = Math.min(startCol, currentRow.columns.length - 1);\n          cursorCell = currentRow.columns[closestCol].element;\n        }\n        break;\n      case goog.editor.plugins.TableEditor.COMMAND.MERGE_CELLS:\n        if (cellSelection.isRectangle()) {\n          table.mergeCells(\n              cellSelection.getFirstRowIndex(),\n              cellSelection.getFirstColumnIndex(),\n              cellSelection.getLastRowIndex(),\n              cellSelection.getLastColumnIndex());\n        }\n        break;\n      case goog.editor.plugins.TableEditor.COMMAND.SPLIT_CELL:\n        if (cellSelection.containsSingleCell()) {\n          table.splitCell(\n              cellSelection.getFirstRowIndex(),\n              cellSelection.getFirstColumnIndex());\n        }\n        break;\n      case goog.editor.plugins.TableEditor.COMMAND.REMOVE_TABLE:\n        table.element.parentNode.removeChild(table.element);\n        break;\n      default:\n    }\n  }\n  if (cursorCell) {\n    range = goog.dom.Range.createFromNodeContents(cursorCell);\n    range.collapse(false);\n    range.select();\n  }\n  return result;\n};\n\n\n/**\n * Checks whether the element is a table editable by the user.\n * @param {Node} element The element in question.\n * @return {boolean} Whether the element is a table editable by the user.\n * @private\n */\ngoog.editor.plugins.TableEditor.prototype.isUserEditableTable_ = function(\n    element) {\n  // Default implementation.\n  if (element.tagName != goog.dom.TagName.TABLE) {\n    return false;\n  }\n\n  // Check for extra user-editable filters.\n  return goog.array.every(this.isTableEditableFunctions_, function(func) {\n    return func(/** @type {Element} */ (element));\n  });\n};\n\n\n/**\n * Adds a function to filter out non-user-editable tables.\n * @param {function(Element):boolean} func A function to decide whether the\n *   table element could be editable by the user or not.\n */\ngoog.editor.plugins.TableEditor.prototype.addIsTableEditableFunction = function(\n    func) {\n  goog.array.insert(this.isTableEditableFunctions_, func);\n};\n\n\n\n/**\n * Class representing the selected cell objects within a single  table.\n * @param {goog.dom.AbstractRange} range Selected range from which to calculate\n *     selected cells.\n * @param {function(Element):Element?} getParentTableFunction A function that\n *     finds the user-editable table from a given element.\n * @constructor\n * @private\n */\ngoog.editor.plugins.TableEditor.CellSelection_ = function(\n    range, getParentTableFunction) {\n  this.cells_ = [];\n\n  // Mozilla lets users select groups of cells, with each cell showing\n  // up as a separate range in the selection. goog.dom.Range doesn't\n  // currently support this.\n  // TODO(user): support this case in range.js\n  var selectionContainer = range.getContainerElement();\n  var elementInSelection = function(node) {\n    // TODO(user): revert to the more liberal containsNode(node, true),\n    // which will match partially-selected cells. We're using\n    // containsNode(node, false) at the moment because otherwise it's\n    // broken in WebKit due to a closure range bug.\n    return selectionContainer == node ||\n        selectionContainer.parentNode == node ||\n        range.containsNode(node, false);\n  };\n\n  var parentTableElement =\n      selectionContainer && getParentTableFunction(selectionContainer);\n  if (!parentTableElement) {\n    return;\n  }\n\n  var parentTable = new goog.editor.Table(parentTableElement);\n  // It's probably not possible to select a table with no cells, but\n  // do a sanity check anyway.\n  if (!parentTable.rows.length || !parentTable.rows[0].columns.length) {\n    return;\n  }\n  // Loop through cells to calculate dimensions for this CellSelection.\n  for (var i = 0, row; row = parentTable.rows[i]; i++) {\n    for (var j = 0, cell; cell = row.columns[j]; j++) {\n      if (elementInSelection(cell.element)) {\n        // Update dimensions based on cell.\n        if (!this.cells_.length) {\n          this.firstRowIndex_ = cell.startRow;\n          this.lastRowIndex_ = cell.endRow;\n          this.firstColIndex_ = cell.startCol;\n          this.lastColIndex_ = cell.endCol;\n        } else {\n          this.firstRowIndex_ = Math.min(this.firstRowIndex_, cell.startRow);\n          this.lastRowIndex_ = Math.max(this.lastRowIndex_, cell.endRow);\n          this.firstColIndex_ = Math.min(this.firstColIndex_, cell.startCol);\n          this.lastColIndex_ = Math.max(this.lastColIndex_, cell.endCol);\n        }\n        this.cells_.push(cell);\n      }\n    }\n  }\n  this.parentTable_ = parentTable;\n};\n\n\n/**\n * Returns the EditableTable object of which this selection's cells are a\n * subset.\n * @return {!goog.editor.Table} the table.\n */\ngoog.editor.plugins.TableEditor.CellSelection_.prototype.getTable = function() {\n  return this.parentTable_;\n};\n\n\n/**\n * Returns the row index of the uppermost cell in this selection.\n * @return {number} The row index.\n */\ngoog.editor.plugins.TableEditor.CellSelection_.prototype.getFirstRowIndex =\n    function() {\n  return this.firstRowIndex_;\n};\n\n\n/**\n * Returns the row index of the lowermost cell in this selection.\n * @return {number} The row index.\n */\ngoog.editor.plugins.TableEditor.CellSelection_.prototype.getLastRowIndex =\n    function() {\n  return this.lastRowIndex_;\n};\n\n\n/**\n * Returns the column index of the farthest left cell in this selection.\n * @return {number} The column index.\n */\ngoog.editor.plugins.TableEditor.CellSelection_.prototype.getFirstColumnIndex =\n    function() {\n  return this.firstColIndex_;\n};\n\n\n/**\n * Returns the column index of the farthest right cell in this selection.\n * @return {number} The column index.\n */\ngoog.editor.plugins.TableEditor.CellSelection_.prototype.getLastColumnIndex =\n    function() {\n  return this.lastColIndex_;\n};\n\n\n/**\n * Returns the cells in this selection.\n * @return {!Array<Element>} Cells in this selection.\n */\ngoog.editor.plugins.TableEditor.CellSelection_.prototype.getCells = function() {\n  return this.cells_;\n};\n\n\n/**\n * Returns a boolean value indicating whether or not the cells in this\n * selection form a rectangle.\n * @return {boolean} Whether the selection forms a rectangle.\n */\ngoog.editor.plugins.TableEditor.CellSelection_.prototype.isRectangle =\n    function() {\n  // TODO(user): check for missing cells. Right now this returns\n  // whether all cells in the selection are in the rectangle, but doesn't\n  // verify that every expected cell is present.\n  if (!this.cells_.length) {\n    return false;\n  }\n  var firstCell = this.cells_[0];\n  var lastCell = this.cells_[this.cells_.length - 1];\n  return !(\n      this.firstRowIndex_ < firstCell.startRow ||\n      this.lastRowIndex_ > lastCell.endRow ||\n      this.firstColIndex_ < firstCell.startCol ||\n      this.lastColIndex_ > lastCell.endCol);\n};\n\n\n/**\n * Returns a boolean value indicating whether or not there is exactly\n * one cell in this selection. Note that this may not be the same as checking\n * whether getCells().length == 1; if there is a single cell with\n * rowSpan/colSpan set it will appear multiple times.\n * @return {boolean} Whether there is exatly one cell in this selection.\n */\ngoog.editor.plugins.TableEditor.CellSelection_.prototype.containsSingleCell =\n    function() {\n  var cellCount = this.cells_.length;\n  return cellCount > 0 && (this.cells_[0] == this.cells_[cellCount - 1]);\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","^KM","^9>","^;P","~$goog.editor.Table","^:S","^;D","^??","^=F","^;9","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/tableeditor.js"],"^:1",["^9K",["~$goog.editor.plugins.TableEditor"]],"^9<",true,"^9=",["^9>","^;9","^;;","^=F","^;=","^;D","^UP","^??","^KM","^;P","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.fs.entry.js","^9C",["^9D","goog/testing/fs/entry.js"],"^9E","goog/testing/fs/entry.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Mock filesystem objects. These are all in the same file to\n * avoid circular dependency issues.\n *\n */\n\ngoog.setTestOnly('goog.testing.fs.DirectoryEntry');\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.testing.fs.DirectoryEntry');\ngoog.provide('goog.testing.fs.Entry');\ngoog.provide('goog.testing.fs.FileEntry');\n\ngoog.forwardDeclare('goog.testing.fs.FileSystem');\ngoog.require('goog.Timer');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.async.Deferred');\ngoog.require('goog.fs.DirectoryEntry');\ngoog.require('goog.fs.DirectoryEntryImpl');\ngoog.require('goog.fs.Entry');\ngoog.require('goog.fs.Error');\ngoog.require('goog.fs.FileEntry');\ngoog.require('goog.functions');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.testing.fs.File');\ngoog.require('goog.testing.fs.FileWriter');\n\n\n\n/**\n * A mock filesystem entry object.\n *\n * @param {!goog.testing.fs.FileSystem} fs The filesystem containing this entry.\n * @param {!goog.testing.fs.DirectoryEntry} parent The directory entry directly\n *     containing this entry.\n * @param {string} name The name of this entry.\n * @constructor\n * @implements {goog.fs.Entry}\n */\ngoog.testing.fs.Entry = function(fs, parent, name) {\n  /**\n   * This entry's filesystem.\n   * @type {!goog.testing.fs.FileSystem}\n   * @private\n   */\n  this.fs_ = fs;\n\n  /**\n   * The name of this entry.\n   * @type {string}\n   * @private\n   */\n  this.name_ = name;\n\n  /**\n   * The parent of this entry.\n   * @type {!goog.testing.fs.DirectoryEntry}\n   */\n  this.parent = parent;\n};\n\n\n/**\n * Whether or not this entry has been deleted.\n * @type {boolean}\n */\ngoog.testing.fs.Entry.prototype.deleted = false;\n\n\n/** @override */\ngoog.testing.fs.Entry.prototype.isFile = goog.abstractMethod;\n\n\n/** @override */\ngoog.testing.fs.Entry.prototype.isDirectory = goog.abstractMethod;\n\n\n/** @override */\ngoog.testing.fs.Entry.prototype.getName = function() {\n  return this.name_;\n};\n\n\n/** @override */\ngoog.testing.fs.Entry.prototype.getFullPath = function() {\n  if (this.getName() == '' || this.parent.getName() == '') {\n    // The root directory has an empty name\n    return '/' + this.name_;\n  } else {\n    return this.parent.getFullPath() + '/' + this.name_;\n  }\n};\n\n\n/**\n * @return {!goog.testing.fs.FileSystem}\n * @override\n */\ngoog.testing.fs.Entry.prototype.getFileSystem = function() {\n  return this.fs_;\n};\n\n\n/** @override */\ngoog.testing.fs.Entry.prototype.getLastModified = goog.abstractMethod;\n\n\n/** @override */\ngoog.testing.fs.Entry.prototype.getMetadata = goog.abstractMethod;\n\n\n/** @override */\ngoog.testing.fs.Entry.prototype.moveTo = function(parent, opt_newName) {\n  var msg = 'moving ' + this.getFullPath() + ' into ' + parent.getFullPath() +\n      (opt_newName ? ', renaming to ' + opt_newName : '');\n  var newFile;\n  return this.checkNotDeleted(msg)\n      .addCallback(function() { return this.copyTo(parent, opt_newName); })\n      .addCallback(function(file) {\n        newFile = file;\n        return this.remove();\n      })\n      .addCallback(function() { return newFile; });\n};\n\n\n/** @override */\ngoog.testing.fs.Entry.prototype.copyTo = function(parent, opt_newName) {\n  goog.asserts.assert(parent instanceof goog.testing.fs.DirectoryEntry);\n  var msg = 'copying ' + this.getFullPath() + ' into ' + parent.getFullPath() +\n      (opt_newName ? ', renaming to ' + opt_newName : '');\n  var self = this;\n  return this.checkNotDeleted(msg).addCallback(function() {\n    goog.asserts.assert(parent instanceof goog.testing.fs.DirectoryEntry);\n    var name = opt_newName || self.getName();\n    var entry = self.clone();\n    /** @type {!goog.testing.fs.DirectoryEntry} */ (parent).children[name] =\n        entry;\n    parent.lastModifiedTimestamp_ = goog.now();\n    entry.name_ = name;\n    entry.parent = /** @type {!goog.testing.fs.DirectoryEntry} */ (parent);\n    return entry;\n  });\n};\n\n\n/**\n * @return {!goog.testing.fs.Entry} A shallow copy of this entry object.\n */\ngoog.testing.fs.Entry.prototype.clone = goog.abstractMethod;\n\n\n/** @override */\ngoog.testing.fs.Entry.prototype.toUrl = function(opt_mimetype) {\n  return 'fakefilesystem:' + this.getFullPath();\n};\n\n\n/** @override */\ngoog.testing.fs.Entry.prototype.toUri = goog.testing.fs.Entry.prototype.toUrl;\n\n\n/** @override */\ngoog.testing.fs.Entry.prototype.wrapEntry = goog.abstractMethod;\n\n\n/** @override */\ngoog.testing.fs.Entry.prototype.remove = function() {\n  var msg = 'removing ' + this.getFullPath();\n  var self = this;\n  return this.checkNotDeleted(msg).addCallback(function() {\n    delete this.parent.children[self.getName()];\n    self.parent.lastModifiedTimestamp_ = goog.now();\n    self.deleted = true;\n    return;\n  });\n};\n\n\n/** @override */\ngoog.testing.fs.Entry.prototype.getParent = function() {\n  var msg = 'getting parent of ' + this.getFullPath();\n  return this.checkNotDeleted(msg).addCallback(function() {\n    return this.parent;\n  });\n};\n\n\n/**\n * Return a deferred that will call its errback if this entry has been deleted.\n * In addition, the deferred will only run after a timeout of 0, and all its\n * callbacks will run with the entry as \"this\".\n *\n * @param {string} action The name of the action being performed. For error\n *     reporting.\n * @return {!goog.async.Deferred} The deferred that will be called after a\n *     timeout of 0.\n * @protected\n */\ngoog.testing.fs.Entry.prototype.checkNotDeleted = function(action) {\n  var d = new goog.async.Deferred(undefined, this);\n  goog.Timer.callOnce(function() {\n    if (this.deleted) {\n      var err = new goog.fs.Error({'name': 'NotFoundError'}, action);\n      d.errback(err);\n    } else {\n      d.callback();\n    }\n  }, 0, this);\n  return d;\n};\n\n\n\n/**\n * A mock directory entry object.\n *\n * @param {!goog.testing.fs.FileSystem} fs The filesystem containing this entry.\n * @param {goog.testing.fs.DirectoryEntry} parent The directory entry directly\n *     containing this entry. If this is null, that means this is the root\n *     directory and so is its own parent.\n * @param {string} name The name of this entry.\n * @param {!Object<!goog.testing.fs.Entry>} children The map of child names to\n *     entry objects.\n * @constructor\n * @extends {goog.testing.fs.Entry}\n * @implements {goog.fs.DirectoryEntry}\n * @final\n */\ngoog.testing.fs.DirectoryEntry = function(fs, parent, name, children) {\n  goog.testing.fs.DirectoryEntry.base(\n      this, 'constructor', fs, parent || this, name);\n\n  /**\n   * The map of child names to entry objects.\n   * @type {!Object<!goog.testing.fs.Entry>}\n   */\n  this.children = children;\n\n  /**\n   * The modification time of the directory. Measured using goog.now, which may\n   * be overridden with mock time providers.\n   * @type {number}\n   * @private\n   */\n  this.lastModifiedTimestamp_ = goog.now();\n};\ngoog.inherits(goog.testing.fs.DirectoryEntry, goog.testing.fs.Entry);\n\n\n/**\n * Constructs and returns the metadata object for this entry.\n * @return {{modificationTime: Date}} The metadata object.\n * @private\n */\ngoog.testing.fs.DirectoryEntry.prototype.getMetadata_ = function() {\n  return {'modificationTime': new Date(this.lastModifiedTimestamp_)};\n};\n\n\n/** @override */\ngoog.testing.fs.DirectoryEntry.prototype.isFile = function() {\n  return false;\n};\n\n\n/** @override */\ngoog.testing.fs.DirectoryEntry.prototype.isDirectory = function() {\n  return true;\n};\n\n\n/** @override */\ngoog.testing.fs.DirectoryEntry.prototype.getLastModified = function() {\n  var msg = 'reading last modified date for ' + this.getFullPath();\n  return this.checkNotDeleted(msg).addCallback(function() {\n    return new Date(this.lastModifiedTimestamp_);\n  });\n};\n\n\n/** @override */\ngoog.testing.fs.DirectoryEntry.prototype.getMetadata = function() {\n  var msg = 'reading metadata for ' + this.getFullPath();\n  return this.checkNotDeleted(msg).addCallback(function() {\n    return this.getMetadata_();\n  });\n};\n\n\n/** @override */\ngoog.testing.fs.DirectoryEntry.prototype.clone = function() {\n  return new goog.testing.fs.DirectoryEntry(\n      this.getFileSystem(), this.parent, this.getName(), this.children);\n};\n\n\n/** @override */\ngoog.testing.fs.DirectoryEntry.prototype.remove = function() {\n  if (!goog.object.isEmpty(this.children)) {\n    var d = new goog.async.Deferred();\n    goog.Timer.callOnce(function() {\n      d.errback(new goog.fs.Error(\n          {'name': 'InvalidModificationError'},\n          'removing ' + this.getFullPath()));\n    }, 0, this);\n    return d;\n  } else if (this != this.getFileSystem().getRoot()) {\n    return goog.testing.fs.DirectoryEntry.base(this, 'remove');\n  } else {\n    // Root directory, do nothing.\n    return goog.async.Deferred.succeed();\n  }\n};\n\n\n/** @override */\ngoog.testing.fs.DirectoryEntry.prototype.getFile = function(\n    path, opt_behavior) {\n  var msg = 'loading file ' + path + ' from ' + this.getFullPath();\n  opt_behavior = opt_behavior || goog.fs.DirectoryEntry.Behavior.DEFAULT;\n  return this.checkNotDeleted(msg).addCallback(function() {\n    try {\n      return goog.async.Deferred.succeed(this.getFileSync(path, opt_behavior));\n    } catch (e) {\n      return goog.async.Deferred.fail(e);\n    }\n  });\n};\n\n\n/** @override */\ngoog.testing.fs.DirectoryEntry.prototype.getDirectory = function(\n    path, opt_behavior) {\n  var msg = 'loading directory ' + path + ' from ' + this.getFullPath();\n  opt_behavior = opt_behavior || goog.fs.DirectoryEntry.Behavior.DEFAULT;\n  return this.checkNotDeleted(msg).addCallback(function() {\n    try {\n      return goog.async.Deferred.succeed(\n          this.getDirectorySync(path, opt_behavior));\n    } catch (e) {\n      return goog.async.Deferred.fail(e);\n    }\n  });\n};\n\n\n/**\n * Get a file entry synchronously, without waiting for a Deferred to resolve.\n *\n * @param {string} path The path to the file, relative to this directory.\n * @param {goog.fs.DirectoryEntry.Behavior=} opt_behavior The behavior for\n *     loading the file.\n * @param {string=} opt_data The string data encapsulated by the blob.\n * @param {string=} opt_type The mime type of the blob.\n * @return {!goog.testing.fs.FileEntry} The loaded file.\n */\ngoog.testing.fs.DirectoryEntry.prototype.getFileSync = function(\n    path, opt_behavior, opt_data, opt_type) {\n  opt_behavior = opt_behavior || goog.fs.DirectoryEntry.Behavior.DEFAULT;\n  return (\n      /** @type {!goog.testing.fs.FileEntry} */ (this.getEntry_(\n          path, opt_behavior, true /* isFile */,\n          goog.bind(function(parent, name) {\n            return new goog.testing.fs.FileEntry(\n                this.getFileSystem(), parent, name,\n                opt_data !== undefined ? opt_data : '', opt_type);\n          }, this))));\n};\n\n\n/**\n * Creates a file synchronously. This is a shorthand for getFileSync, useful for\n * setting up tests.\n *\n * @param {string} path The path to the file, relative to this directory.\n * @return {!goog.testing.fs.FileEntry} The created file.\n */\ngoog.testing.fs.DirectoryEntry.prototype.createFileSync = function(path) {\n  return this.getFileSync(path, goog.fs.DirectoryEntry.Behavior.CREATE);\n};\n\n\n/**\n * Get a directory synchronously, without waiting for a Deferred to resolve.\n *\n * @param {string} path The path to the directory, relative to this one.\n * @param {goog.fs.DirectoryEntry.Behavior=} opt_behavior The behavior for\n *     loading the directory.\n * @return {!goog.testing.fs.DirectoryEntry} The loaded directory.\n */\ngoog.testing.fs.DirectoryEntry.prototype.getDirectorySync = function(\n    path, opt_behavior) {\n  opt_behavior = opt_behavior || goog.fs.DirectoryEntry.Behavior.DEFAULT;\n  return (\n      /** @type {!goog.testing.fs.DirectoryEntry} */ (\n          this.getEntry_(\n              path, opt_behavior, false /* isFile */,\n              goog.bind(function(parent, name) {\n                return new goog.testing.fs.DirectoryEntry(\n                    this.getFileSystem(), parent, name, {});\n              }, this))));\n};\n\n\n/**\n * Creates a directory synchronously. This is a shorthand for getFileSync,\n * useful for setting up tests.\n *\n * @param {string} path The path to the directory, relative to this directory.\n * @return {!goog.testing.fs.DirectoryEntry} The created directory.\n */\ngoog.testing.fs.DirectoryEntry.prototype.createDirectorySync = function(path) {\n  return this.getDirectorySync(path, goog.fs.DirectoryEntry.Behavior.CREATE);\n};\n\n\n/**\n * Get a file or directory entry from a path. This handles parsing the path for\n * subdirectories and throwing appropriate errors should something go wrong.\n *\n * @param {string} path The path to the entry, relative to this directory.\n * @param {goog.fs.DirectoryEntry.Behavior} behavior The behavior for loading\n *     the entry.\n * @param {boolean} isFile Whether a file or directory is being loaded.\n * @param {function(!goog.testing.fs.DirectoryEntry, string) :\n *             !goog.testing.fs.Entry} createFn\n *     The function for creating the entry if it doesn't yet exist. This is\n *     passed the parent entry and the name of the new entry.\n * @return {!goog.testing.fs.Entry} The loaded entry.\n * @private\n */\ngoog.testing.fs.DirectoryEntry.prototype.getEntry_ = function(\n    path, behavior, isFile, createFn) {\n  // Filter out leading, trailing, and duplicate slashes.\n  var components = goog.array.filter(path.split('/'), goog.functions.identity);\n\n  var basename = /** @type {string} */ (goog.array.peek(components)) || '';\n  var dir =\n      goog.string.startsWith(path, '/') ? this.getFileSystem().getRoot() : this;\n\n  goog.array.forEach(components.slice(0, -1), function(p) {\n    var subdir = dir.children[p];\n    if (!subdir) {\n      throw new goog.fs.Error(\n          {'name': 'NotFoundError'},\n          'loading ' + path + ' from ' + this.getFullPath() + ' (directory ' +\n              dir.getFullPath() + '/' + p + ')');\n    }\n    dir = subdir;\n  }, this);\n\n  // If there is no basename, the path must resolve to the root directory.\n  var entry = basename ? dir.children[basename] : dir;\n\n  if (!entry) {\n    if (behavior == goog.fs.DirectoryEntry.Behavior.DEFAULT) {\n      throw new goog.fs.Error(\n          {'name': 'NotFoundError'},\n          'loading ' + path + ' from ' + this.getFullPath());\n    } else {\n      goog.asserts.assert(\n          behavior == goog.fs.DirectoryEntry.Behavior.CREATE ||\n          behavior == goog.fs.DirectoryEntry.Behavior.CREATE_EXCLUSIVE);\n      entry = createFn(dir, basename);\n      dir.children[basename] = entry;\n      this.lastModifiedTimestamp_ = goog.now();\n      return entry;\n    }\n  } else if (behavior == goog.fs.DirectoryEntry.Behavior.CREATE_EXCLUSIVE) {\n    throw new goog.fs.Error(\n        {'name': 'InvalidModificationError'},\n        'loading ' + path + ' from ' + this.getFullPath());\n  } else if (entry.isFile() != isFile) {\n    throw new goog.fs.Error(\n        {'name': 'TypeMismatchError'},\n        'loading ' + path + ' from ' + this.getFullPath());\n  } else {\n    if (behavior == goog.fs.DirectoryEntry.Behavior.CREATE) {\n      this.lastModifiedTimestamp_ = goog.now();\n    }\n    return entry;\n  }\n};\n\n\n/**\n * Returns whether this directory has a child with the given name.\n *\n * @param {string} name The name of the entry to check for.\n * @return {boolean} Whether or not this has a child with the given name.\n */\ngoog.testing.fs.DirectoryEntry.prototype.hasChild = function(name) {\n  return name in this.children;\n};\n\n\n/** @override */\ngoog.testing.fs.DirectoryEntry.prototype.removeRecursively = function() {\n  var msg = 'removing ' + this.getFullPath() + ' recursively';\n  return this.checkNotDeleted(msg).addCallback(function() {\n    var d = goog.async.Deferred.succeed(null);\n    goog.object.forEach(this.children, function(child) {\n      d.awaitDeferred(\n          child.isDirectory() ? child.removeRecursively() : child.remove());\n    });\n    d.addCallback(function() { return this.remove(); }, this);\n    return d;\n  });\n};\n\n\n/** @override */\ngoog.testing.fs.DirectoryEntry.prototype.listDirectory = function() {\n  var msg = 'listing ' + this.getFullPath();\n  return this.checkNotDeleted(msg).addCallback(function() {\n    return goog.object.getValues(this.children);\n  });\n};\n\n\n/** @override */\ngoog.testing.fs.DirectoryEntry.prototype.createPath =\n    // This isn't really type-safe.\n    /** @type {!Function} */ (goog.fs.DirectoryEntryImpl.prototype.createPath);\n\n\n\n/**\n * A mock file entry object.\n *\n * @param {!goog.testing.fs.FileSystem} fs The filesystem containing this entry.\n * @param {!goog.testing.fs.DirectoryEntry} parent The directory entry directly\n *     containing this entry.\n * @param {string} name The name of this entry.\n * @param {string} data The data initially contained in the file.\n * @param {string=} opt_type The mime type of the blob.\n * @constructor\n * @extends {goog.testing.fs.Entry}\n * @implements {goog.fs.FileEntry}\n * @final\n */\ngoog.testing.fs.FileEntry = function(fs, parent, name, data, opt_type) {\n  goog.testing.fs.FileEntry.base(this, 'constructor', fs, parent, name);\n\n  /**\n   * The internal file blob referenced by this file entry.\n   * @type {!goog.testing.fs.File}\n   * @private\n   */\n  this.file_ =\n      new goog.testing.fs.File(name, new Date(goog.now()), data, opt_type);\n\n  /**\n   * The metadata for file.\n   * @type {{modificationTime: Date}}\n   * @private\n   */\n  this.metadata_ = {'modificationTime': this.file_.lastModifiedDate};\n};\ngoog.inherits(goog.testing.fs.FileEntry, goog.testing.fs.Entry);\n\n\n/** @override */\ngoog.testing.fs.FileEntry.prototype.isFile = function() {\n  return true;\n};\n\n\n/** @override */\ngoog.testing.fs.FileEntry.prototype.isDirectory = function() {\n  return false;\n};\n\n\n/** @override */\ngoog.testing.fs.FileEntry.prototype.clone = function() {\n  return new goog.testing.fs.FileEntry(\n      this.getFileSystem(), this.parent, this.getName(),\n      this.fileSync().toString());\n};\n\n\n/** @override */\ngoog.testing.fs.FileEntry.prototype.getLastModified = function() {\n  return this.file().addCallback(function(file) {\n    return file.lastModifiedDate;\n  });\n};\n\n\n/** @override */\ngoog.testing.fs.FileEntry.prototype.getMetadata = function() {\n  var msg = 'getting metadata for ' + this.getFullPath();\n  return this.checkNotDeleted(msg).addCallback(function() {\n    return this.metadata_;\n  });\n};\n\n\n/** @override */\ngoog.testing.fs.FileEntry.prototype.createWriter = function() {\n  var d = new goog.async.Deferred();\n  goog.Timer.callOnce(\n      goog.bind(d.callback, d, new goog.testing.fs.FileWriter(this)));\n  return d;\n};\n\n\n/** @override */\ngoog.testing.fs.FileEntry.prototype.file = function() {\n  var msg = 'getting file for ' + this.getFullPath();\n  return this.checkNotDeleted(msg).addCallback(function() {\n    return this.fileSync();\n  });\n};\n\n\n/**\n * Get the internal file representation synchronously, without waiting for a\n * Deferred to resolve.\n *\n * @return {!goog.testing.fs.File} The internal file blob referenced by this\n *     FileEntry.\n */\ngoog.testing.fs.FileEntry.prototype.fileSync = function() {\n  return this.file_;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^><","^;<","^L1","^KZ","^9L","^IT","^IE","^9>","^;P","^IV","^IW","^?Z","^IZ","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/fs/entry.js"],"^:1",["^9K",["~$goog.testing.fs.Entry","~$goog.testing.fs.DirectoryEntry","~$goog.testing.fs.FileEntry"]],"^9<",true,"^9=",["^9>","^><","^;9","^:E","^?Z","^IW","^IZ","^IV","^IE","^IT","^;<","^;P","^9L","^KZ","^L1"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.events.events.js","^9C",["^9D","goog/testing/events/events.js"],"^9E","goog/testing/events/events.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Event Simulation.\n *\n * Utility functions for simulating events at the Closure level. All functions\n * in this package generate events by calling goog.events.fireListeners,\n * rather than interfacing with the browser directly. This is intended for\n * testing purposes, and should not be used in production code.\n *\n * The decision to use Closure events and dispatchers instead of the browser's\n * native events and dispatchers was conscious and deliberate. Native event\n * dispatchers have their own set of quirks and edge cases. Pure JS dispatchers\n * are more robust and transparent.\n *\n * If you think you need a testing mechanism that uses native Event objects,\n * please, please email closure-tech first to explain your use case before you\n * sink time into this.\n *\n * TODO(b/8933952): Migrate to explicitly non-nullable types. At present, many\n *     functions in this file expect non-null inputs but do not explicitly\n *     indicate this.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.setTestOnly('goog.testing.events');\ngoog.provide('goog.testing.events');\ngoog.provide('goog.testing.events.Event');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.asserts');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.events');\ngoog.require('goog.events.BrowserEvent');\ngoog.require('goog.events.BrowserFeature');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.object');\ngoog.require('goog.style');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * goog.events.BrowserEvent expects an Event so we provide one for JSCompiler.\n *\n * This clones a lot of the functionality of goog.events.Event. This used to\n * use a mixin, but the mixin results in confusing the two types when compiled.\n *\n * @param {string} type Event Type.\n * @param {Object=} opt_target Reference to the object that is the target of\n *     this event.\n * @constructor\n * @extends {Event}\n */\ngoog.testing.events.Event = function(type, opt_target) {\n  this.type = type;\n\n  this.target = /** @type {EventTarget} */ (opt_target || null);\n\n  this.currentTarget = this.target;\n};\n\n\n/**\n * Whether to cancel the event in internal capture/bubble processing for IE.\n * @type {boolean}\n * @public\n * @suppress {underscore|visibility} Technically public, but referencing this\n *     outside this package is strongly discouraged.\n */\ngoog.testing.events.Event.prototype.propagationStopped_ = false;\n\n\n/** @override */\ngoog.testing.events.Event.prototype.defaultPrevented = false;\n\n\n/**\n * Return value for in internal capture/bubble processing for IE.\n * @type {boolean}\n * @public\n * @suppress {underscore|visibility} Technically public, but referencing this\n *     outside this package is strongly discouraged.\n */\ngoog.testing.events.Event.prototype.returnValue_ = true;\n\n\n/** @override */\ngoog.testing.events.Event.prototype.stopPropagation = function() {\n  this.propagationStopped_ = true;\n};\n\n\n/** @override */\ngoog.testing.events.Event.prototype.preventDefault = function() {\n  this.defaultPrevented = true;\n  this.returnValue_ = false;\n};\n\n/**\n * Asserts an event target exists.  This will fail if target is not defined.\n *\n * TODO(nnaze): Gradually add this to the methods in this file, and eventually\n *     update the method signatures to not take nullables.  See\n * http://b/8961907\n *\n * @param {EventTarget} target A target to assert.\n * @return {!EventTarget} The target, guaranteed to exist.\n * @private\n */\ngoog.testing.events.assertEventTarget_ = function(target) {\n  return goog.asserts.assert(target, 'EventTarget should be defined.');\n};\n\n\n/**\n * A static helper function that sets the mouse position to the event.\n * @param {Event} event A simulated native event.\n * @param {goog.math.Coordinate=} opt_coords Mouse position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @private\n */\ngoog.testing.events.setEventClientXY_ = function(event, opt_coords) {\n  if (!opt_coords && event.target &&\n      /** @type {!Node} */ (event.target).nodeType ==\n          goog.dom.NodeType.ELEMENT) {\n    try {\n      opt_coords = goog.style.getClientPosition(\n          /** @type {!Element} **/ (event.target));\n    } catch (ex) {\n      // IE sometimes throws if it can't get the position.\n    }\n  }\n  event.clientX = opt_coords ? opt_coords.x : 0;\n  event.clientY = opt_coords ? opt_coords.y : 0;\n\n  // Pretend the browser window is at (0, 0).\n  event.screenX = event.clientX;\n  event.screenY = event.clientY;\n};\n\n\n/**\n * Simulates a mousedown, mouseup, and then click on the given event target,\n * with the left mouse button.\n * @param {EventTarget} target The target for the event.\n * @param {goog.events.BrowserEvent.MouseButton=} opt_button Mouse button;\n *     defaults to `goog.events.BrowserEvent.MouseButton.LEFT`.\n * @param {goog.math.Coordinate=} opt_coords Mouse position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @param {Object=} opt_eventProperties Event properties to be mixed into the\n *     BrowserEvent.\n * @return {boolean} The returnValue of the sequence: false if preventDefault()\n *     was called on any of the events, true otherwise.\n */\ngoog.testing.events.fireClickSequence = function(\n    target, opt_button, opt_coords, opt_eventProperties) {\n  // Fire mousedown, mouseup, and click. Then return the bitwise AND of the 3.\n  return goog.testing.events.eagerAnd_(\n      goog.testing.events.fireMouseDownEvent(\n          target, opt_button, opt_coords, opt_eventProperties),\n      goog.testing.events.fireMouseUpEvent(\n          target, opt_button, opt_coords, opt_eventProperties),\n      goog.testing.events.fireClickEvent(\n          target, opt_button, opt_coords, opt_eventProperties));\n};\n\n\n/**\n * Simulates the sequence of events fired by the browser when the user double-\n * clicks the given target.\n * @param {EventTarget} target The target for the event.\n * @param {goog.math.Coordinate=} opt_coords Mouse position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @param {Object=} opt_eventProperties Event properties to be mixed into the\n *     BrowserEvent.\n * @return {boolean} The returnValue of the sequence: false if preventDefault()\n *     was called on any of the events, true otherwise.\n */\ngoog.testing.events.fireDoubleClickSequence = function(\n    target, opt_coords, opt_eventProperties) {\n  // Fire mousedown, mouseup, click, mousedown, mouseup, click, dblclick.\n  // Then return the bitwise AND of the 7.\n  var btn = goog.events.BrowserEvent.MouseButton.LEFT;\n  return goog.testing.events.eagerAnd_(\n      goog.testing.events.fireMouseDownEvent(\n          target, btn, opt_coords, opt_eventProperties),\n      goog.testing.events.fireMouseUpEvent(\n          target, btn, opt_coords, opt_eventProperties),\n      goog.testing.events.fireClickEvent(\n          target, btn, opt_coords, opt_eventProperties),\n      // IE fires a selectstart instead of the second mousedown in a\n      // dblclick, but we don't care about selectstart.\n      (goog.userAgent.IE ||\n       goog.testing.events.fireMouseDownEvent(\n           target, btn, opt_coords, opt_eventProperties)),\n      goog.testing.events.fireMouseUpEvent(\n          target, btn, opt_coords, opt_eventProperties),\n      // IE doesn't fire the second click in a dblclick.\n      (goog.userAgent.IE ||\n       goog.testing.events.fireClickEvent(\n           target, btn, opt_coords, opt_eventProperties)),\n      goog.testing.events.fireDoubleClickEvent(\n          target, opt_coords, opt_eventProperties));\n};\n\n\n/**\n * A non-exhaustive mapping of keys to keyCode. These are not localized and\n * are specific to QWERTY keyboards, but are used to augment our testing key\n * events as much as possible in order to simulate real browser events. This\n * will be used to fill out the `keyCode` field for key events when the `key`\n * value is present in this map.\n * @private {!Object<number>}\n * @final\n */\ngoog.testing.events.KEY_TO_KEYCODE_MAPPING_ = {\n  '0': goog.events.KeyCodes.ZERO,\n  '1': goog.events.KeyCodes.ONE,\n  '2': goog.events.KeyCodes.TWO,\n  '3': goog.events.KeyCodes.THREE,\n  '4': goog.events.KeyCodes.FOUR,\n  '5': goog.events.KeyCodes.FIVE,\n  '6': goog.events.KeyCodes.SIX,\n  '7': goog.events.KeyCodes.SEVEN,\n  '8': goog.events.KeyCodes.EIGHT,\n  '9': goog.events.KeyCodes.NINE,\n  'a': goog.events.KeyCodes.A,\n  'b': goog.events.KeyCodes.B,\n  'c': goog.events.KeyCodes.C,\n  'd': goog.events.KeyCodes.D,\n  'e': goog.events.KeyCodes.E,\n  'f': goog.events.KeyCodes.F,\n  'g': goog.events.KeyCodes.G,\n  'h': goog.events.KeyCodes.H,\n  'i': goog.events.KeyCodes.I,\n  'j': goog.events.KeyCodes.J,\n  'k': goog.events.KeyCodes.K,\n  'l': goog.events.KeyCodes.L,\n  'm': goog.events.KeyCodes.M,\n  'n': goog.events.KeyCodes.N,\n  'o': goog.events.KeyCodes.O,\n  'p': goog.events.KeyCodes.P,\n  'q': goog.events.KeyCodes.Q,\n  'r': goog.events.KeyCodes.R,\n  's': goog.events.KeyCodes.S,\n  't': goog.events.KeyCodes.T,\n  'u': goog.events.KeyCodes.U,\n  'v': goog.events.KeyCodes.V,\n  'w': goog.events.KeyCodes.W,\n  'x': goog.events.KeyCodes.X,\n  'y': goog.events.KeyCodes.Y,\n  'z': goog.events.KeyCodes.Z\n};\n\n\n/**\n * Simulates a complete keystroke (keydown, keypress, and keyup). Note that\n * if preventDefault is called on the keydown, the keypress will not fire.\n *\n * @param {EventTarget} target The target for the event.\n * @param {string|number} keyOrKeyCode The key value or keycode of the key\n *     pressed.\n * @param {Object=} opt_eventProperties Event properties to be mixed into the\n *     BrowserEvent.\n * @return {boolean} The returnValue of the sequence: false if preventDefault()\n *     was called on any of the events, true otherwise.\n */\ngoog.testing.events.fireKeySequence = function(\n    target, keyOrKeyCode, opt_eventProperties) {\n  return goog.testing.events.fireNonAsciiKeySequence(\n      target, keyOrKeyCode, keyOrKeyCode, opt_eventProperties);\n};\n\n\n/**\n * Simulates a complete keystroke (keydown, keypress, and keyup) when typing\n * a non-ASCII character. Same as fireKeySequence, the keypress will not fire\n * if preventDefault is called on the keydown.\n *\n * @param {EventTarget} target The target for the event.\n * @param {string|number} keyOrKeyCode The key value or keycode of the keydown\n *     and keyup events.\n * @param {string|number} keyPressKeyOrKeyCode The key value or keycode of the\n *     keypress event.\n * @param {Object=} opt_eventProperties Event properties to be mixed into the\n *     BrowserEvent.\n * @return {boolean} The returnValue of the sequence: false if preventDefault()\n *     was called on any of the events, true otherwise.\n */\ngoog.testing.events.fireNonAsciiKeySequence = function(\n    target, keyOrKeyCode, keyPressKeyOrKeyCode, opt_eventProperties) {\n  var keydown =\n      /** @type {!KeyboardEvent} */ (\n          /** @type {!Event} */ (new goog.testing.events.Event(\n              goog.events.EventType.KEYDOWN, target)));\n  var keyup =  //\n      /** @type {!KeyboardEvent} */ (\n          /** @type {!Event} */ (new goog.testing.events.Event(\n              goog.events.EventType.KEYUP, target)));\n  var keypress =\n      /** @type {!KeyboardEvent} */ (\n          /** @type {!Event} */ (new goog.testing.events.Event(\n              goog.events.EventType.KEYPRESS, target)));\n\n  if (typeof keyOrKeyCode === 'string') {\n    keydown.key = keyup.key = /** @type {string} */ (keyOrKeyCode);\n    keypress.key = /** @type {string} */ (keyPressKeyOrKeyCode);\n\n    // Try to fill the keyCode field for the key events if we have a known key.\n    // This is to try and make these mock simulated event as close to real\n    // browser events as possible.\n    var mappedKeyCode =\n        goog.testing.events\n            .KEY_TO_KEYCODE_MAPPING_[/** @type {string} */ (keyOrKeyCode)\n                                         .toLowerCase()];\n    if (mappedKeyCode) {\n      keydown.keyCode = keyup.keyCode = mappedKeyCode;\n    }\n\n    var mappedKeyPressKeyCode =\n        goog.testing.events.KEY_TO_KEYCODE_MAPPING_[/** @type {string} */ (\n                                                        keyPressKeyOrKeyCode)\n                                                        .toLowerCase()];\n    if (mappedKeyPressKeyCode) {\n      keypress.keyCode = mappedKeyPressKeyCode;\n    }\n  } else {\n    keydown.keyCode = keyup.keyCode = /** @type {number} */ (keyOrKeyCode);\n    keypress.keyCode = /** @type {number} */ (keyPressKeyOrKeyCode);\n  }\n\n  if (opt_eventProperties) {\n    goog.object.extend(keydown, opt_eventProperties);\n    goog.object.extend(keyup, opt_eventProperties);\n    goog.object.extend(keypress, opt_eventProperties);\n  }\n\n  // Fire keydown, keypress, and keyup. Note that if the keydown is\n  // prevent-defaulted, then the keypress will not fire.\n  var result = goog.testing.events.fireBrowserEvent(keydown);\n  if (typeof keyOrKeyCode === 'string') {\n    if (/** @type {string} */ (keyPressKeyOrKeyCode) != '' && result) {\n      result = goog.testing.events.eagerAnd_(\n          result, goog.testing.events.fireBrowserEvent(keypress));\n    }\n  } else {\n    if (goog.events.KeyCodes.firesKeyPressEvent(\n            /** @type {number} */ (keyOrKeyCode), undefined, keydown.shiftKey,\n            keydown.ctrlKey, keydown.altKey, keydown.metaKey) &&\n        result) {\n      result = goog.testing.events.eagerAnd_(\n          result, goog.testing.events.fireBrowserEvent(keypress));\n    }\n  }\n  return goog.testing.events.eagerAnd_(\n      result, goog.testing.events.fireBrowserEvent(keyup));\n};\n\n\n/**\n * Simulates a mouseenter event on the given target.\n * @param {!EventTarget} target The target for the event.\n * @param {?EventTarget} relatedTarget The related target for the event (e.g.,\n *     the node that the mouse is being moved out of).\n * @param {!goog.math.Coordinate=} opt_coords Mouse position. Defaults to\n *     event's target's position (if available), otherwise (0, 0).\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n */\ngoog.testing.events.fireMouseEnterEvent = function(\n    target, relatedTarget, opt_coords) {\n  var mouseenter =\n      new goog.testing.events.Event(goog.events.EventType.MOUSEENTER, target);\n  mouseenter.relatedTarget = relatedTarget;\n  goog.testing.events.setEventClientXY_(mouseenter, opt_coords);\n  return goog.testing.events.fireBrowserEvent(mouseenter);\n};\n\n\n/**\n * Simulates a mouseleave event on the given target.\n * @param {!EventTarget} target The target for the event.\n * @param {?EventTarget} relatedTarget The related target for the event (e.g.,\n *     the node that the mouse is being moved into).\n * @param {!goog.math.Coordinate=} opt_coords Mouse position. Defaults to\n *     event's target's position (if available), otherwise (0, 0).\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n */\ngoog.testing.events.fireMouseLeaveEvent = function(\n    target, relatedTarget, opt_coords) {\n  var mouseleave =\n      new goog.testing.events.Event(goog.events.EventType.MOUSELEAVE, target);\n  mouseleave.relatedTarget = relatedTarget;\n  goog.testing.events.setEventClientXY_(mouseleave, opt_coords);\n  return goog.testing.events.fireBrowserEvent(mouseleave);\n};\n\n\n/**\n * Simulates a mouseover event on the given target.\n * @param {EventTarget} target The target for the event.\n * @param {EventTarget} relatedTarget The related target for the event (e.g.,\n *     the node that the mouse is being moved out of).\n * @param {goog.math.Coordinate=} opt_coords Mouse position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n */\ngoog.testing.events.fireMouseOverEvent = function(\n    target, relatedTarget, opt_coords) {\n  var mouseover =\n      new goog.testing.events.Event(goog.events.EventType.MOUSEOVER, target);\n  mouseover.relatedTarget = relatedTarget;\n  goog.testing.events.setEventClientXY_(mouseover, opt_coords);\n  return goog.testing.events.fireBrowserEvent(mouseover);\n};\n\n\n/**\n * Simulates a mousemove event on the given target.\n * @param {EventTarget} target The target for the event.\n * @param {goog.math.Coordinate=} opt_coords Mouse position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n */\ngoog.testing.events.fireMouseMoveEvent = function(target, opt_coords) {\n  var mousemove =\n      new goog.testing.events.Event(goog.events.EventType.MOUSEMOVE, target);\n\n  goog.testing.events.setEventClientXY_(mousemove, opt_coords);\n  return goog.testing.events.fireBrowserEvent(mousemove);\n};\n\n\n/**\n * Simulates a mouseout event on the given target.\n * @param {EventTarget} target The target for the event.\n * @param {EventTarget} relatedTarget The related target for the event (e.g.,\n *     the node that the mouse is being moved into).\n * @param {goog.math.Coordinate=} opt_coords Mouse position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n */\ngoog.testing.events.fireMouseOutEvent = function(\n    target, relatedTarget, opt_coords) {\n  var mouseout =\n      new goog.testing.events.Event(goog.events.EventType.MOUSEOUT, target);\n  mouseout.relatedTarget = relatedTarget;\n  goog.testing.events.setEventClientXY_(mouseout, opt_coords);\n  return goog.testing.events.fireBrowserEvent(mouseout);\n};\n\n\n/**\n * Simulates a mousedown event on the given target.\n * @param {EventTarget} target The target for the event.\n * @param {goog.events.BrowserEvent.MouseButton=} opt_button Mouse button;\n *     defaults to `goog.events.BrowserEvent.MouseButton.LEFT`.\n * @param {goog.math.Coordinate=} opt_coords Mouse position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @param {Object=} opt_eventProperties Event properties to be mixed into the\n *     BrowserEvent.\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n */\ngoog.testing.events.fireMouseDownEvent = function(\n    target, opt_button, opt_coords, opt_eventProperties) {\n  var button = opt_button || goog.events.BrowserEvent.MouseButton.LEFT;\n  button = !goog.events.BrowserFeature.HAS_W3C_BUTTON ?\n      goog.events.BrowserEvent.IE_BUTTON_MAP[button] :\n      button;\n  return goog.testing.events.fireMouseButtonEvent_(\n      goog.events.EventType.MOUSEDOWN, target, button, opt_coords,\n      opt_eventProperties);\n};\n\n\n/**\n * Simulates a mouseup event on the given target.\n * @param {EventTarget} target The target for the event.\n * @param {goog.events.BrowserEvent.MouseButton=} opt_button Mouse button;\n *     defaults to `goog.events.BrowserEvent.MouseButton.LEFT`.\n * @param {goog.math.Coordinate=} opt_coords Mouse position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @param {Object=} opt_eventProperties Event properties to be mixed into the\n *     BrowserEvent.\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n */\ngoog.testing.events.fireMouseUpEvent = function(\n    target, opt_button, opt_coords, opt_eventProperties) {\n  var button = opt_button || goog.events.BrowserEvent.MouseButton.LEFT;\n  button = !goog.events.BrowserFeature.HAS_W3C_BUTTON ?\n      goog.events.BrowserEvent.IE_BUTTON_MAP[button] :\n      button;\n  return goog.testing.events.fireMouseButtonEvent_(\n      goog.events.EventType.MOUSEUP, target, button, opt_coords,\n      opt_eventProperties);\n};\n\n\n/**\n * Simulates a click event on the given target. IE only supports click with\n * the left mouse button.\n * @param {EventTarget} target The target for the event.\n * @param {goog.events.BrowserEvent.MouseButton=} opt_button Mouse button;\n *     defaults to `goog.events.BrowserEvent.MouseButton.LEFT`.\n * @param {goog.math.Coordinate=} opt_coords Mouse position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @param {Object=} opt_eventProperties Event properties to be mixed into the\n *     BrowserEvent.\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n */\ngoog.testing.events.fireClickEvent = function(\n    target, opt_button, opt_coords, opt_eventProperties) {\n  return goog.testing.events.fireMouseButtonEvent_(\n      goog.events.EventType.CLICK, target, opt_button, opt_coords,\n      opt_eventProperties);\n};\n\n\n/**\n * Simulates a double-click event on the given target. Always double-clicks\n * with the left mouse button since no browser supports double-clicking with\n * any other buttons.\n * @param {EventTarget} target The target for the event.\n * @param {goog.math.Coordinate=} opt_coords Mouse position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @param {Object=} opt_eventProperties Event properties to be mixed into the\n *     BrowserEvent.\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n */\ngoog.testing.events.fireDoubleClickEvent = function(\n    target, opt_coords, opt_eventProperties) {\n  return goog.testing.events.fireMouseButtonEvent_(\n      goog.events.EventType.DBLCLICK, target,\n      goog.events.BrowserEvent.MouseButton.LEFT, opt_coords,\n      opt_eventProperties);\n};\n\n\n/**\n * Helper function to fire a mouse event.\n * with the left mouse button since no browser supports double-clicking with\n * any other buttons.\n * @param {string} type The event type.\n * @param {EventTarget} target The target for the event.\n * @param {number=} opt_button Mouse button; defaults to\n *     `goog.events.BrowserEvent.MouseButton.LEFT`.\n * @param {goog.math.Coordinate=} opt_coords Mouse position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @param {Object=} opt_eventProperties Event properties to be mixed into the\n *     BrowserEvent.\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n * @private\n */\ngoog.testing.events.fireMouseButtonEvent_ = function(\n    type, target, opt_button, opt_coords, opt_eventProperties) {\n  var e = new goog.testing.events.Event(type, target);\n  e.button = opt_button || goog.events.BrowserEvent.MouseButton.LEFT;\n  goog.testing.events.setEventClientXY_(e, opt_coords);\n  if (opt_eventProperties) {\n    goog.object.extend(e, opt_eventProperties);\n  }\n  return goog.testing.events.fireBrowserEvent(e);\n};\n\n\n/**\n * Simulates a contextmenu event on the given target.\n * @param {EventTarget} target The target for the event.\n * @param {goog.math.Coordinate=} opt_coords Mouse position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n */\ngoog.testing.events.fireContextMenuEvent = function(target, opt_coords) {\n  var button = (goog.userAgent.MAC && goog.userAgent.WEBKIT) ?\n      goog.events.BrowserEvent.MouseButton.LEFT :\n      goog.events.BrowserEvent.MouseButton.RIGHT;\n  var contextmenu =\n      new goog.testing.events.Event(goog.events.EventType.CONTEXTMENU, target);\n  contextmenu.button = !goog.events.BrowserFeature.HAS_W3C_BUTTON ?\n      goog.events.BrowserEvent.IE_BUTTON_MAP[button] :\n      button;\n  contextmenu.ctrlKey = goog.userAgent.MAC;\n  goog.testing.events.setEventClientXY_(contextmenu, opt_coords);\n  return goog.testing.events.fireBrowserEvent(contextmenu);\n};\n\n\n/**\n * Simulates a mousedown, contextmenu, and the mouseup on the given event\n * target, with the right mouse button.\n * @param {EventTarget} target The target for the event.\n * @param {goog.math.Coordinate=} opt_coords Mouse position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @return {boolean} The returnValue of the sequence: false if preventDefault()\n *     was called on any of the events, true otherwise.\n */\ngoog.testing.events.fireContextMenuSequence = function(target, opt_coords) {\n  var props = goog.userAgent.MAC ? {ctrlKey: true} : {};\n  var button = (goog.userAgent.MAC && goog.userAgent.WEBKIT) ?\n      goog.events.BrowserEvent.MouseButton.LEFT :\n      goog.events.BrowserEvent.MouseButton.RIGHT;\n\n  var result =\n      goog.testing.events.fireMouseDownEvent(target, button, opt_coords, props);\n  if (goog.userAgent.WINDOWS) {\n    // All browsers are consistent on Windows.\n    result = goog.testing.events.eagerAnd_(\n        result,\n        goog.testing.events.fireMouseUpEvent(target, button, opt_coords),\n        goog.testing.events.fireContextMenuEvent(target, opt_coords));\n  } else {\n    result = goog.testing.events.eagerAnd_(\n        result, goog.testing.events.fireContextMenuEvent(target, opt_coords));\n\n    // GECKO on Mac and Linux always fires the mouseup after the contextmenu.\n\n    // WEBKIT is really weird.\n    //\n    // On Linux, it sometimes fires mouseup, but most of the time doesn't.\n    // It's really hard to reproduce consistently. I think there's some\n    // internal race condition. If contextmenu is preventDefaulted, then\n    // mouseup always fires.\n    //\n    // On Mac, it always fires mouseup and then fires a click.\n    result = goog.testing.events.eagerAnd_(\n        result,\n        goog.testing.events.fireMouseUpEvent(\n            target, button, opt_coords, props));\n\n    if (goog.userAgent.WEBKIT && goog.userAgent.MAC) {\n      result = goog.testing.events.eagerAnd_(\n          result,\n          goog.testing.events.fireClickEvent(\n              target, button, opt_coords, props));\n    }\n  }\n  return result;\n};\n\n\n/**\n * Simulates a popstate event on the given target.\n * @param {EventTarget} target The target for the event.\n * @param {Object} state History state object.\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n */\ngoog.testing.events.firePopStateEvent = function(target, state) {\n  var e = /** @type {!PopStateEvent} */ (/** @type {!Event} */ (\n      new goog.testing.events.Event(goog.events.EventType.POPSTATE, target)));\n  e.state = state;\n  return goog.testing.events.fireBrowserEvent(e);\n};\n\n\n/**\n * Simulate a blur event on the given target.\n * @param {EventTarget} target The target for the event.\n * @return {boolean} The value returned by firing the blur browser event,\n *      which returns false iff 'preventDefault' was invoked.\n */\ngoog.testing.events.fireBlurEvent = function(target) {\n  var e = new goog.testing.events.Event(goog.events.EventType.BLUR, target);\n  return goog.testing.events.fireBrowserEvent(e);\n};\n\n\n/**\n * Simulate a focus event on the given target.\n * @param {EventTarget} target The target for the event.\n * @return {boolean} The value returned by firing the focus browser event,\n *     which returns false iff 'preventDefault' was invoked.\n */\ngoog.testing.events.fireFocusEvent = function(target) {\n  var e = new goog.testing.events.Event(goog.events.EventType.FOCUS, target);\n  return goog.testing.events.fireBrowserEvent(e);\n};\n\n\n/**\n * Simulate a focus-in event on the given target.\n * @param {!EventTarget} target The target for the event.\n * @return {boolean} The value returned by firing the focus-in browser event,\n *     which returns false iff 'preventDefault' was invoked.\n */\ngoog.testing.events.fireFocusInEvent = function(target) {\n  var e = new goog.testing.events.Event(goog.events.EventType.FOCUSIN, target);\n  return goog.testing.events.fireBrowserEvent(e);\n};\n\n\n/**\n * Simulates an event's capturing and bubbling phases.\n * @param {Event} event A simulated native event. It will be wrapped in a\n *     normalized BrowserEvent and dispatched to Closure listeners on all\n *     ancestors of its target (inclusive).\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n */\ngoog.testing.events.fireBrowserEvent = function(event) {\n  event = /** @type {!goog.testing.events.Event} */ (event);\n\n  event.returnValue_ = true;\n\n  // generate a list of ancestors\n  var ancestors = [];\n  for (var current = event.target; current; current = current.parentNode) {\n    ancestors.push(current);\n  }\n\n  // dispatch capturing listeners\n  for (var j = ancestors.length - 1; j >= 0 && !event.propagationStopped_;\n       j--) {\n    goog.events.fireListeners(\n        ancestors[j], event.type, true,\n        new goog.events.BrowserEvent(event, ancestors[j]));\n  }\n\n  // dispatch bubbling listeners\n  for (var j = 0; j < ancestors.length && !event.propagationStopped_; j++) {\n    goog.events.fireListeners(\n        ancestors[j], event.type, false,\n        new goog.events.BrowserEvent(event, ancestors[j]));\n  }\n\n  return event.returnValue_;\n};\n\n\n/**\n * Simulates a touchstart event on the given target.\n * @param {EventTarget} target The target for the event.\n * @param {goog.math.Coordinate=} opt_coords Touch position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @param {Object=} opt_eventProperties Event properties to be mixed into the\n *     BrowserEvent.\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n */\ngoog.testing.events.fireTouchStartEvent = function(\n    target, opt_coords, opt_eventProperties) {\n  // TODO: Support multi-touch events with array of coordinates.\n  var touchstart =\n      new goog.testing.events.Event(goog.events.EventType.TOUCHSTART, target);\n  goog.testing.events.setEventClientXY_(touchstart, opt_coords);\n  if (opt_eventProperties) {\n    goog.object.extend(touchstart, opt_eventProperties);\n  }\n  return goog.testing.events.fireBrowserEvent(touchstart);\n};\n\n\n/**\n * Simulates a touchmove event on the given target.\n * @param {EventTarget} target The target for the event.\n * @param {goog.math.Coordinate=} opt_coords Touch position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @param {Object=} opt_eventProperties Event properties to be mixed into the\n *     BrowserEvent.\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n */\ngoog.testing.events.fireTouchMoveEvent = function(\n    target, opt_coords, opt_eventProperties) {\n  // TODO: Support multi-touch events with array of coordinates.\n  var touchmove =\n      new goog.testing.events.Event(goog.events.EventType.TOUCHMOVE, target);\n  goog.testing.events.setEventClientXY_(touchmove, opt_coords);\n  if (opt_eventProperties) {\n    goog.object.extend(touchmove, opt_eventProperties);\n  }\n  return goog.testing.events.fireBrowserEvent(touchmove);\n};\n\n\n/**\n * Simulates a touchend event on the given target.\n * @param {EventTarget} target The target for the event.\n * @param {goog.math.Coordinate=} opt_coords Touch position. Defaults to event's\n *     target's position (if available), otherwise (0, 0).\n * @param {Object=} opt_eventProperties Event properties to be mixed into the\n *     BrowserEvent.\n * @return {boolean} The returnValue of the event: false if preventDefault() was\n *     called on it, true otherwise.\n */\ngoog.testing.events.fireTouchEndEvent = function(\n    target, opt_coords, opt_eventProperties) {\n  // TODO: Support multi-touch events with array of coordinates.\n  var touchend =\n      new goog.testing.events.Event(goog.events.EventType.TOUCHEND, target);\n  goog.testing.events.setEventClientXY_(touchend, opt_coords);\n  if (opt_eventProperties) {\n    goog.object.extend(touchend, opt_eventProperties);\n  }\n  return goog.testing.events.fireBrowserEvent(touchend);\n};\n\n\n/**\n * Simulates a simple touch sequence on the given target.\n * @param {EventTarget} target The target for the event.\n * @param {goog.math.Coordinate=} opt_coords Touch position. Defaults to event\n *     target's position (if available), otherwise (0, 0).\n * @param {Object=} opt_eventProperties Event properties to be mixed into the\n *     BrowserEvent.\n * @return {boolean} The returnValue of the sequence: false if preventDefault()\n *     was called on any of the events, true otherwise.\n */\ngoog.testing.events.fireTouchSequence = function(\n    target, opt_coords, opt_eventProperties) {\n  // TODO: Support multi-touch events with array of coordinates.\n  // Fire touchstart, touchmove, touchend then return the AND of the 2.\n  return goog.testing.events.eagerAnd_(\n      goog.testing.events.fireTouchStartEvent(\n          target, opt_coords, opt_eventProperties),\n      goog.testing.events.fireTouchEndEvent(\n          target, opt_coords, opt_eventProperties));\n};\n\n\n/**\n * Mixins a listenable into the given object. This turns the object\n * into a goog.events.Listenable. This is useful, for example, when\n * you need to mock a implementation of listenable and still want it\n * to work with goog.events.\n * @param {!Object} obj The object to mixin into.\n */\ngoog.testing.events.mixinListenable = function(obj) {\n  var listenable = new goog.events.EventTarget();\n\n  listenable.setTargetForTesting(obj);\n\n  var listenablePrototype = goog.events.EventTarget.prototype;\n  var disposablePrototype = goog.Disposable.prototype;\n  for (var key in listenablePrototype) {\n    if (listenablePrototype.hasOwnProperty(key) ||\n        disposablePrototype.hasOwnProperty(key)) {\n      var member = listenablePrototype[key];\n      if (goog.isFunction(member)) {\n        obj[key] = goog.bind(member, listenable);\n      } else {\n        obj[key] = member;\n      }\n    }\n  }\n};\n\n/**\n * Returns the boolean AND of all parameters.\n *\n * Unlike directly using `&&`, using this function cannot employ\n * short-circuiting; all side effects of resolving parameters will occur before\n * entering the function body.\n *\n * @param {boolean} first\n * @param {...boolean} rest\n * @return {boolean}\n * @private\n */\ngoog.testing.events.eagerAnd_ = function(first, rest) {\n  for (var i = 1; i < arguments.length; i++) {\n    first = first && arguments[i];\n  }\n  return first;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^=B","^9>","^;P","^:L","^:S","^:I","^TC","^:7","^<3","^<4","^>R","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/events/events.js"],"^:1",["^9K",["^:6","^:8"]],"^9<",true,"^9=",["^9>","^:7","^:E","^=B","^:N","^<4","^TC","^:L","^:I","^>R","^;P","^<3","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.fs.blob.js","^9C",["^9D","goog/testing/fs/blob.js"],"^9E","goog/testing/fs/blob.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Mock blob object.\n *\n */\n\ngoog.setTestOnly('goog.testing.fs.Blob');\ngoog.provide('goog.testing.fs.Blob');\n\ngoog.require('goog.crypt');\ngoog.require('goog.crypt.base64');\n\n\n\n/**\n * A mock Blob object. The data is stored as an Array of bytes, a \"byte\" being a\n * JS number in the range 0-255.\n *\n * This blob simplifies writing test code because it has the toString() method\n * that returns immediately, while the File API only provides asynchronous\n * reads.\n * @see https://www.w3.org/TR/FileAPI/#constructorBlob\n *\n * @param {(string|Array<(string|number|!Uint8Array)>)=} opt_data The data\n *     encapsulated by the blob.\n * @param {string=} opt_type The mime type of the blob.\n * @constructor\n */\ngoog.testing.fs.Blob = function(opt_data, opt_type) {\n  /**\n   * @see http://www.w3.org/TR/FileAPI/#dfn-type\n   * @type {string}\n   */\n  this.type = opt_type || '';\n\n  /**\n   * The data encapsulated by the blob as an Array of bytes, a \"byte\" being a\n   * JS number in the range 0-255.\n   * @private {!Array<number>}\n   */\n  this.data_ = [];\n\n  /**\n   * @see http://www.w3.org/TR/FileAPI/#dfn-size\n   * @type {number}\n   */\n  this.size = 0;\n\n  this.setDataInternal(opt_data || '');\n};\n\n\n/**\n * Creates a blob with bytes of a blob ranging from the optional start\n * parameter up to but not including the optional end parameter, and with a type\n * attribute that is the value of the optional contentType parameter.\n * @see http://www.w3.org/TR/FileAPI/#dfn-slice\n * @param {number=} opt_start The start byte offset.\n * @param {number=} opt_end The end point of a slice.\n * @param {string=} opt_contentType The type of the resulting Blob.\n * @return {!goog.testing.fs.Blob} The result blob of the slice operation.\n */\ngoog.testing.fs.Blob.prototype.slice = function(\n    opt_start, opt_end, opt_contentType) {\n  var relativeStart;\n  if (typeof opt_start === 'number') {\n    relativeStart = (opt_start < 0) ? Math.max(this.size + opt_start, 0) :\n                                      Math.min(opt_start, this.size);\n  } else {\n    relativeStart = 0;\n  }\n  var relativeEnd;\n  if (typeof opt_end === 'number') {\n    relativeEnd = (opt_end < 0) ? Math.max(this.size + opt_end, 0) :\n                                  Math.min(opt_end, this.size);\n  } else {\n    relativeEnd = this.size;\n  }\n  var span = Math.max(relativeEnd - relativeStart, 0);\n  var blob = new goog.testing.fs.Blob(\n      this.data_.slice(relativeStart, relativeStart + span), opt_contentType);\n  return blob;\n};\n\n\n/**\n * @return {string} The data encapsulated by the blob as an UTF-8 string.\n * @override\n */\ngoog.testing.fs.Blob.prototype.toString = function() {\n  return goog.crypt.utf8ByteArrayToString(this.data_);\n};\n\n\n/**\n * @return {!ArrayBuffer} The data encapsulated by the blob as an\n *     ArrayBuffer.\n */\ngoog.testing.fs.Blob.prototype.toArrayBuffer = function() {\n  var buf = new ArrayBuffer(this.data_.length);\n  var arr = new Uint8Array(buf);\n  for (var i = 0; i < this.data_.length; i++) {\n    arr[i] = this.data_[i];\n  }\n  return buf;\n};\n\n\n/**\n * @return {string} The string data encapsulated by the blob as a data: URI.\n */\ngoog.testing.fs.Blob.prototype.toDataUrl = function() {\n  return 'data:' + this.type + ';base64,' +\n      goog.crypt.base64.encodeByteArray(this.data_);\n};\n\n\n/**\n * Sets the internal contents of the blob to an Array of bytes. This should\n *     only be called by other functions inside the `goog.testing.fs`\n *     namespace.\n * @param {string|Array<string|number|!Uint8Array>} data The data to write\n *     into the blob.\n * @package\n */\ngoog.testing.fs.Blob.prototype.setDataInternal = function(data) {\n  this.data_ = [];\n  if (typeof data === 'string') {\n    this.appendString_(data);\n  } else if (data instanceof Array) {\n    for (var i = 0; i < data.length; i++) {\n      var value = data[i];\n      if (typeof value === 'string') {\n        this.appendString_(value);\n      } else if (typeof value === 'number') {  // Assume Bytes array.\n        this.appendByte_(value);\n      } else if (value instanceof Uint8Array) {\n        this.appendUint8_(value);\n      }\n    }\n  }\n  this.size = this.data_.length;\n};\n\n\n/**\n * Converts the data from string to Array of bytes and appends to the blob\n *     content.\n * @param {string} data The string to append to the blob content.\n * @private\n */\ngoog.testing.fs.Blob.prototype.appendString_ = function(data) {\n  Array.prototype.push.apply(\n      this.data_, goog.crypt.stringToUtf8ByteArray(data));\n};\n\n\n/**\n * Appends a byte (as a number between 0 to 255) to the blob content.\n * @param {number} data The byte to append.\n * @private\n */\ngoog.testing.fs.Blob.prototype.appendByte_ = function(data) {\n  this.data_.push(data);\n};\n\n\n/**\n * Converts the data from Uint8Array to Array of bytes and appends it to the\n *     blob content.\n * @param {!Uint8Array} data The array to append to the blob content.\n * @private\n */\ngoog.testing.fs.Blob.prototype.appendUint8_ = function(data) {\n  for (var i = 0; i < data.length; i++) {\n    this.data_.push(data[i]);\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^JE","~$goog.crypt.base64","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/fs/blob.js"],"^:1",["^9K",["^L0"]],"^9<",true,"^9=",["^9>","^JE","^UU"]],["^ ","^9A",[1579837703000],"^9B","goog.labs.testing.matcher.js","^9C",["^9D","goog/labs/testing/matcher.js"],"^9E","goog/labs/testing/matcher.js","^9F","^9G","^9H","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides the base Matcher interface. User code should use the\n * matchers through assertThat statements and not directly.\n */\n\n\ngoog.provide('goog.labs.testing.Matcher');\n\n\n\n/**\n * A matcher object to be used in assertThat statements.\n * @interface\n */\ngoog.labs.testing.Matcher = function() {};\n\n\n/**\n * Determines whether a value matches the constraints of the match.\n *\n * @param {*} value The object to match.\n * @return {boolean} Whether the input value matches this matcher.\n */\ngoog.labs.testing.Matcher.prototype.matches = function(value) {};\n\n\n/**\n * Describes why the matcher failed.\n *\n * @param {*} value The value that didn't match.\n * @param {string=} opt_description A partial description to which the reason\n *     will be appended.\n *\n * @return {string} Description of why the matcher failed.\n */\ngoog.labs.testing.Matcher.prototype.describe = function(\n    value, opt_description) {};\n\n\n/**\n * Generates a Matcher from the ‘matches’ and ‘describe’ functions passed in.\n *\n * @param {!Function} matchesFunction The ‘matches’ function.\n * @param {Function=} opt_describeFunction The ‘describe’ function.\n * @return {!Function} The custom matcher.\n */\ngoog.labs.testing.Matcher.makeMatcher = function(\n    matchesFunction, opt_describeFunction) {\n\n  /**\n   * @constructor\n   * @implements {goog.labs.testing.Matcher}\n   * @final\n   */\n  const matcherConstructor = function() {};\n\n  /** @override */\n  matcherConstructor.prototype.matches = matchesFunction;\n\n  if (opt_describeFunction) {\n    /** @override */\n    matcherConstructor.prototype.describe = opt_describeFunction;\n  }\n\n  return matcherConstructor;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/testing/matcher.js"],"^:1",["^9K",["^?2"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.editor.range.js","^9C",["^9D","goog/editor/range.js"],"^9E","goog/editor/range.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilties for working with ranges.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.provide('goog.editor.range');\ngoog.provide('goog.editor.range.Point');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.Range');\ngoog.require('goog.dom.RangeEndpoint');\ngoog.require('goog.dom.SavedCaretRange');\ngoog.require('goog.editor.node');\ngoog.require('goog.editor.style');\ngoog.require('goog.iter');\ngoog.require('goog.userAgent');\n\n\n/**\n * Given a range and an element, create a narrower range that is limited to the\n * boundaries of the element. If the range starts (or ends) outside the\n * element, the narrowed range's start point (or end point) will be the\n * leftmost (or rightmost) leaf of the element.\n * @param {goog.dom.AbstractRange} range The range.\n * @param {Element} el The element to limit the range to.\n * @return {goog.dom.AbstractRange} A new narrowed range, or null if the\n *     element does not contain any part of the given range.\n */\ngoog.editor.range.narrow = function(range, el) {\n  var startContainer = range.getStartNode();\n  var endContainer = range.getEndNode();\n\n  if (startContainer && endContainer) {\n    var isElement = function(node) { return node == el; };\n    var hasStart = goog.dom.getAncestor(startContainer, isElement, true);\n    var hasEnd = goog.dom.getAncestor(endContainer, isElement, true);\n\n    if (hasStart && hasEnd) {\n      // The range is contained entirely within this element.\n      return range.clone();\n    } else if (hasStart) {\n      // The range starts inside the element, but ends outside it.\n      var leaf = goog.editor.node.getRightMostLeaf(el);\n      return goog.dom.Range.createFromNodes(\n          range.getStartNode(), range.getStartOffset(), leaf,\n          goog.editor.node.getLength(leaf));\n    } else if (hasEnd) {\n      // The range starts outside the element, but ends inside it.\n      return goog.dom.Range.createFromNodes(\n          goog.editor.node.getLeftMostLeaf(el), 0, range.getEndNode(),\n          range.getEndOffset());\n    }\n  }\n\n  // The selection starts and ends outside the element.\n  return null;\n};\n\n\n/**\n * Given a range, expand the range to include outer tags if the full contents of\n * those tags are entirely selected.  This essentially changes the dom position,\n * but not the visible position of the range.\n * Ex. <code><li>foo</li></code> if \"foo\" is selected, instead of returning\n * start and end nodes as the foo text node, return the li.\n * @param {goog.dom.AbstractRange} range The range.\n * @param {Node=} opt_stopNode Optional node to stop expanding past.\n * @return {!goog.dom.AbstractRange} The expanded range.\n */\ngoog.editor.range.expand = function(range, opt_stopNode) {\n  // Expand the start out to the common container.\n  var expandedRange = goog.editor.range.expandEndPointToContainer_(\n      range, goog.dom.RangeEndpoint.START, opt_stopNode);\n  // Expand the end out to the common container.\n  expandedRange = goog.editor.range.expandEndPointToContainer_(\n      expandedRange, goog.dom.RangeEndpoint.END, opt_stopNode);\n\n  var startNode = expandedRange.getStartNode();\n  var endNode = expandedRange.getEndNode();\n  var startOffset = expandedRange.getStartOffset();\n  var endOffset = expandedRange.getEndOffset();\n\n  // If we have reached a common container, now expand out.\n  if (startNode == endNode) {\n    while (endNode != opt_stopNode && startOffset == 0 &&\n           endOffset == goog.editor.node.getLength(endNode)) {\n      // Select the parent instead.\n      var parentNode = endNode.parentNode;\n      startOffset = goog.array.indexOf(parentNode.childNodes, endNode);\n      endOffset = startOffset + 1;\n      endNode = parentNode;\n    }\n    startNode = endNode;\n  }\n\n  return goog.dom.Range.createFromNodes(\n      startNode, startOffset, endNode, endOffset);\n};\n\n\n/**\n * Given a range, expands the start or end points as far out towards the\n * range's common container (or stopNode, if provided) as possible, while\n * perserving the same visible position.\n *\n * @param {goog.dom.AbstractRange} range The range to expand.\n * @param {goog.dom.RangeEndpoint} endpoint The endpoint to expand.\n * @param {Node=} opt_stopNode Optional node to stop expanding past.\n * @return {!goog.dom.AbstractRange} The expanded range.\n * @private\n */\ngoog.editor.range.expandEndPointToContainer_ = function(\n    range, endpoint, opt_stopNode) {\n  var expandStart = endpoint == goog.dom.RangeEndpoint.START;\n  var node = expandStart ? range.getStartNode() : range.getEndNode();\n  var offset = expandStart ? range.getStartOffset() : range.getEndOffset();\n  var container = range.getContainerElement();\n\n  // Expand the node out until we reach the container or the stop node.\n  while (node != container && node != opt_stopNode) {\n    // It is only valid to expand the start if we are at the start of a node\n    // (offset 0) or expand the end if we are at the end of a node\n    // (offset length).\n    if (expandStart && offset != 0 ||\n        !expandStart && offset != goog.editor.node.getLength(node)) {\n      break;\n    }\n\n    var parentNode = node.parentNode;\n    var index = goog.array.indexOf(parentNode.childNodes, node);\n    offset = expandStart ? index : index + 1;\n    node = parentNode;\n  }\n\n  return goog.dom.Range.createFromNodes(\n      expandStart ? node : range.getStartNode(),\n      expandStart ? offset : range.getStartOffset(),\n      expandStart ? range.getEndNode() : node,\n      expandStart ? range.getEndOffset() : offset);\n};\n\n\n/**\n * Cause the window's selection to be the start of this node.\n * @param {Node} node The node to select the start of.\n */\ngoog.editor.range.selectNodeStart = function(node) {\n  goog.dom.Range.createCaret(goog.editor.node.getLeftMostLeaf(node), 0)\n      .select();\n};\n\n\n/**\n * Position the cursor immediately to the left or right of \"node\".\n * In Firefox, the selection parent is outside of \"node\", so the cursor can\n * effectively be moved to the end of a link node, without being considered\n * inside of it.\n * Note: This does not always work in WebKit. In particular, if you try to\n * place a cursor to the right of a link, typing still puts you in the link.\n * Bug: http://bugs.webkit.org/show_bug.cgi?id=17697\n * @param {Node} node The node to position the cursor relative to.\n * @param {boolean} toLeft True to place it to the left, false to the right.\n * @return {!goog.dom.AbstractRange} The newly selected range.\n */\ngoog.editor.range.placeCursorNextTo = function(node, toLeft) {\n  var parent = node.parentNode;\n  var offset = goog.array.indexOf(parent.childNodes, node) + (toLeft ? 0 : 1);\n  var point =\n      goog.editor.range.Point.createDeepestPoint(parent, offset, toLeft, true);\n  var range = goog.dom.Range.createCaret(point.node, point.offset);\n  range.select();\n  return range;\n};\n\n\n/**\n * Normalizes the node, preserving the selection of the document.\n *\n * May also normalize things outside the node, if it is more efficient to do so.\n *\n * @param {Node} node The node to normalize.\n */\ngoog.editor.range.selectionPreservingNormalize = function(node) {\n  var doc = goog.dom.getOwnerDocument(node);\n  var selection = goog.dom.Range.createFromWindow(goog.dom.getWindow(doc));\n  var normalizedRange =\n      goog.editor.range.rangePreservingNormalize(node, selection);\n  if (normalizedRange) {\n    normalizedRange.select();\n  }\n};\n\n\n/**\n * Manually normalizes the node in IE, since native normalize in IE causes\n * transient problems.\n * @param {Node} node The node to normalize.\n * @private\n */\ngoog.editor.range.normalizeNodeIe_ = function(node) {\n  var lastText = null;\n  var child = node.firstChild;\n  while (child) {\n    var next = child.nextSibling;\n    if (child.nodeType == goog.dom.NodeType.TEXT) {\n      if (child.nodeValue == '') {\n        node.removeChild(child);\n      } else if (lastText) {\n        lastText.nodeValue += child.nodeValue;\n        node.removeChild(child);\n      } else {\n        lastText = child;\n      }\n    } else {\n      goog.editor.range.normalizeNodeIe_(child);\n      lastText = null;\n    }\n    child = next;\n  }\n};\n\n\n/**\n * Normalizes the given node.\n * @param {Node} node The node to normalize.\n */\ngoog.editor.range.normalizeNode = function(node) {\n  if (goog.userAgent.IE) {\n    goog.editor.range.normalizeNodeIe_(node);\n  } else {\n    node.normalize();\n  }\n};\n\n\n/**\n * Normalizes the node, preserving a range of the document.\n *\n * May also normalize things outside the node, if it is more efficient to do so.\n *\n * @param {Node} node The node to normalize.\n * @param {goog.dom.AbstractRange?} range The range to normalize.\n * @return {goog.dom.AbstractRange?} The range, adjusted for normalization.\n */\ngoog.editor.range.rangePreservingNormalize = function(node, range) {\n  if (range) {\n    var rangeFactory = goog.editor.range.normalize(range);\n    // WebKit has broken selection affinity, so carets tend to jump out of the\n    // beginning of inline elements. This means that if we're doing the\n    // normalize as the result of a range that will later become the selection,\n    // we might not normalize something in the range after it is read back from\n    // the selection. We can't just normalize the parentNode here because WebKit\n    // can move the selection range out of multiple inline parents.\n    var container = goog.editor.style.getContainer(range.getContainerElement());\n  }\n\n  if (container) {\n    goog.editor.range.normalizeNode(\n        goog.dom.findCommonAncestor(container, node));\n  } else if (node) {\n    goog.editor.range.normalizeNode(node);\n  }\n\n  if (rangeFactory) {\n    return rangeFactory();\n  } else {\n    return null;\n  }\n};\n\n\n/**\n * Get the deepest point in the DOM that's equivalent to the endpoint of the\n * given range.\n *\n * @param {goog.dom.AbstractRange} range A range.\n * @param {boolean} atStart True for the start point, false for the end point.\n * @return {!goog.editor.range.Point} The end point, expressed as a node\n *    and an offset.\n */\ngoog.editor.range.getDeepEndPoint = function(range, atStart) {\n  return atStart ?\n      goog.editor.range.Point.createDeepestPoint(\n          range.getStartNode(), range.getStartOffset()) :\n      goog.editor.range.Point.createDeepestPoint(\n          range.getEndNode(), range.getEndOffset());\n};\n\n\n/**\n * Given a range in the current DOM, create a factory for a range that\n * represents the same selection in a normalized DOM. The factory function\n * should be invoked after the DOM is normalized.\n *\n * All browsers do a bad job preserving ranges across DOM normalization.\n * The issue is best described in this 5-year-old bug report:\n * https://bugzilla.mozilla.org/show_bug.cgi?id=191864\n * For most applications, this isn't a problem. The browsers do a good job\n * handling un-normalized text, so there's usually no reason to normalize.\n *\n * The exception to this rule is the rich text editing commands\n * execCommand and queryCommandValue, which will fail often if there are\n * un-normalized text nodes.\n *\n * The factory function creates new ranges so that we can normalize the DOM\n * without problems. It must be created before any normalization happens,\n * and invoked after normalization happens.\n *\n * @param {goog.dom.AbstractRange} range The range to normalize. It may\n *    become invalid after body.normalize() is called.\n * @return {function(): goog.dom.AbstractRange} A factory for a normalized\n *    range. Should be called after body.normalize() is called.\n */\ngoog.editor.range.normalize = function(range) {\n  var isReversed = range.isReversed();\n  var anchorPoint = goog.editor.range.normalizePoint_(\n      goog.editor.range.getDeepEndPoint(range, !isReversed));\n  var anchorParent = anchorPoint.getParentPoint();\n  var anchorPreviousSibling = anchorPoint.node.previousSibling;\n  if (anchorPoint.node.nodeType == goog.dom.NodeType.TEXT) {\n    anchorPoint.node = null;\n  }\n\n  var focusPoint = goog.editor.range.normalizePoint_(\n      goog.editor.range.getDeepEndPoint(range, isReversed));\n  var focusParent = focusPoint.getParentPoint();\n  var focusPreviousSibling = focusPoint.node.previousSibling;\n  if (focusPoint.node.nodeType == goog.dom.NodeType.TEXT) {\n    focusPoint.node = null;\n  }\n\n  return function() {\n    if (!anchorPoint.node && anchorPreviousSibling) {\n      // If anchorPoint.node was previously an empty text node with no siblings,\n      // anchorPreviousSibling may not have a nextSibling since that node will\n      // no longer exist.  Do our best and point to the end of the previous\n      // element.\n      anchorPoint.node = anchorPreviousSibling.nextSibling;\n      if (!anchorPoint.node) {\n        anchorPoint =\n            goog.editor.range.Point.getPointAtEndOfNode(anchorPreviousSibling);\n      }\n    }\n\n    if (!focusPoint.node && focusPreviousSibling) {\n      // If focusPoint.node was previously an empty text node with no siblings,\n      // focusPreviousSibling may not have a nextSibling since that node will no\n      // longer exist.  Do our best and point to the end of the previous\n      // element.\n      focusPoint.node = focusPreviousSibling.nextSibling;\n      if (!focusPoint.node) {\n        focusPoint =\n            goog.editor.range.Point.getPointAtEndOfNode(focusPreviousSibling);\n      }\n    }\n\n    return goog.dom.Range.createFromNodes(\n        anchorPoint.node || anchorParent.node.firstChild || anchorParent.node,\n        anchorPoint.offset,\n        focusPoint.node || focusParent.node.firstChild || focusParent.node,\n        focusPoint.offset);\n  };\n};\n\n\n/**\n * Given a point in the current DOM, adjust it to represent the same point in\n * a normalized DOM.\n *\n * See the comments on goog.editor.range.normalize for more context.\n *\n * @param {goog.editor.range.Point} point A point in the document.\n * @return {!goog.editor.range.Point} The same point, for easy chaining.\n * @private\n */\ngoog.editor.range.normalizePoint_ = function(point) {\n  var previous;\n  if (point.node.nodeType == goog.dom.NodeType.TEXT) {\n    // If the cursor position is in a text node,\n    // look at all the previous text siblings of the text node,\n    // and set the offset relative to the earliest text sibling.\n    for (var current = point.node.previousSibling;\n         current && current.nodeType == goog.dom.NodeType.TEXT;\n         current = current.previousSibling) {\n      point.offset += goog.editor.node.getLength(current);\n    }\n\n    previous = current;\n  } else {\n    previous = point.node.previousSibling;\n  }\n\n  var parent = point.node.parentNode;\n  point.node = previous ? previous.nextSibling : parent.firstChild;\n  return point;\n};\n\n\n/**\n * Checks if a range is completely inside an editable region.\n * @param {goog.dom.AbstractRange} range The range to test.\n * @return {boolean} Whether the range is completely inside an editable region.\n */\ngoog.editor.range.isEditable = function(range) {\n  var rangeContainer = range.getContainerElement();\n\n  // Closure's implementation of getContainerElement() is a little too\n  // smart in IE when exactly one element is contained in the range.\n  // It assumes that there's a user whose intent was actually to select\n  // all that element's children, so it returns the element itself as its\n  // own containing element.\n  // This little sanity check detects this condition so we can account for it.\n  var rangeContainerIsOutsideRange =\n      range.getStartNode() != rangeContainer.parentElement;\n\n  return (rangeContainerIsOutsideRange &&\n          goog.editor.node.isEditableContainer(rangeContainer)) ||\n      goog.editor.node.isEditable(rangeContainer);\n};\n\n\n/**\n * Returns whether the given range intersects with any instance of the given\n * tag.\n * @param {goog.dom.AbstractRange} range The range to check.\n * @param {!goog.dom.TagName} tagName The name of the tag.\n * @return {boolean} Whether the given range intersects with any instance of\n *     the given tag.\n */\ngoog.editor.range.intersectsTag = function(range, tagName) {\n  if (goog.dom.getAncestorByTagNameAndClass(\n          range.getContainerElement(), tagName)) {\n    return true;\n  }\n\n  return goog.iter.some(\n      range, function(node) { return node.tagName == tagName; });\n};\n\n\n\n/**\n * One endpoint of a range, represented as a Node and and offset.\n * @param {Node} node The node containing the point.\n * @param {number} offset The offset of the point into the node.\n * @constructor\n * @final\n */\ngoog.editor.range.Point = function(node, offset) {\n  /**\n   * The node containing the point.\n   * @type {Node}\n   */\n  this.node = node;\n\n  /**\n   * The offset of the point into the node.\n   * @type {number}\n   */\n  this.offset = offset;\n};\n\n\n/**\n * Gets the point of this point's node in the DOM.\n * @return {!goog.editor.range.Point} The node's point.\n */\ngoog.editor.range.Point.prototype.getParentPoint = function() {\n  var parent = this.node.parentNode;\n  return new goog.editor.range.Point(\n      parent, goog.array.indexOf(parent.childNodes, this.node));\n};\n\n\n/**\n * Construct the deepest possible point in the DOM that's equivalent\n * to the given point, expressed as a node and an offset.\n * @param {Node} node The node containing the point.\n * @param {number} offset The offset of the point from the node.\n * @param {boolean=} opt_trendLeft Notice that a (node, offset) pair may be\n *     equivalent to more than one descendant (node, offset) pair in the DOM.\n *     By default, we trend rightward. If this parameter is true, then we\n *     trend leftward. The tendency to fall rightward by default is for\n *     consistency with other range APIs (like placeCursorNextTo).\n * @param {boolean=} opt_stopOnChildlessElement If true, and we encounter\n *     a Node which is an Element that cannot have children, we return a Point\n *     based on its parent rather than that Node itself.\n * @return {!goog.editor.range.Point} A new point.\n */\ngoog.editor.range.Point.createDeepestPoint = function(\n    node, offset, opt_trendLeft, opt_stopOnChildlessElement) {\n  while (node.nodeType == goog.dom.NodeType.ELEMENT) {\n    var child = node.childNodes[offset];\n    if (!child && !node.lastChild) {\n      break;\n    } else if (child) {\n      var prevSibling = child.previousSibling;\n      if (opt_trendLeft && prevSibling) {\n        if (opt_stopOnChildlessElement &&\n            goog.editor.range.Point.isTerminalElement_(prevSibling)) {\n          break;\n        }\n        node = prevSibling;\n        offset = goog.editor.node.getLength(node);\n      } else {\n        if (opt_stopOnChildlessElement &&\n            goog.editor.range.Point.isTerminalElement_(child)) {\n          break;\n        }\n        node = child;\n        offset = 0;\n      }\n    } else {\n      if (opt_stopOnChildlessElement &&\n          goog.editor.range.Point.isTerminalElement_(node.lastChild)) {\n        break;\n      }\n      node = node.lastChild;\n      offset = goog.editor.node.getLength(node);\n    }\n  }\n\n  return new goog.editor.range.Point(node, offset);\n};\n\n\n/**\n * Return true if the specified node is an Element that is not expected to have\n * children. The createDeepestPoint() method should not traverse into\n * such elements.\n * @param {Node} node .\n * @return {boolean} True if the node is an Element that does not contain\n *     child nodes (e.g. BR, IMG).\n * @private\n */\ngoog.editor.range.Point.isTerminalElement_ = function(node) {\n  return (\n      node.nodeType == goog.dom.NodeType.ELEMENT &&\n      !goog.dom.canHaveChildren(node));\n};\n\n\n/**\n * Construct a point at the very end of the given node.\n * @param {Node} node The node to create a point for.\n * @return {!goog.editor.range.Point} A new point.\n */\ngoog.editor.range.Point.getPointAtEndOfNode = function(node) {\n  return new goog.editor.range.Point(node, goog.editor.node.getLength(node));\n};\n\n\n/**\n * Saves the range by inserting carets into the HTML.\n *\n * Unlike the regular saveUsingCarets, this SavedRange normalizes text nodes.\n * Browsers have other bugs where they don't handle split text nodes in\n * contentEditable regions right.\n *\n * @param {goog.dom.AbstractRange} range The abstract range object.\n * @return {!goog.dom.SavedCaretRange} A saved caret range that normalizes\n *     text nodes.\n */\ngoog.editor.range.saveUsingNormalizedCarets = function(range) {\n  return new goog.editor.range.NormalizedCaretRange_(range);\n};\n\n\n\n/**\n * Saves the range using carets, but normalizes text nodes when carets\n * are removed.\n * @see goog.editor.range.saveUsingNormalizedCarets\n * @param {goog.dom.AbstractRange} range The range being saved.\n * @constructor\n * @extends {goog.dom.SavedCaretRange}\n * @private\n */\ngoog.editor.range.NormalizedCaretRange_ = function(range) {\n  goog.dom.SavedCaretRange.call(this, range);\n};\ngoog.inherits(\n    goog.editor.range.NormalizedCaretRange_, goog.dom.SavedCaretRange);\n\n\n/**\n * Normalizes text nodes whenever carets are removed from the document.\n * @param {goog.dom.AbstractRange=} opt_range A range whose offsets have already\n *     been adjusted for caret removal; it will be adjusted and returned if it\n *     is also affected by post-removal operations, such as text node\n *     normalization.\n * @return {goog.dom.AbstractRange|undefined} The adjusted range, if opt_range\n *     was provided.\n * @override\n */\ngoog.editor.range.NormalizedCaretRange_.prototype.removeCarets = function(\n    opt_range) {\n  var startCaret = this.getCaret(true);\n  var endCaret = this.getCaret(false);\n  var node = startCaret && endCaret ?\n      goog.dom.findCommonAncestor(startCaret, endCaret) :\n      startCaret || endCaret;\n\n  goog.editor.range.NormalizedCaretRange_.superClass_.removeCarets.call(this);\n\n  if (opt_range) {\n    return goog.editor.range.rangePreservingNormalize(node, opt_range);\n  } else if (node) {\n    goog.editor.range.selectionPreservingNormalize(node);\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^>6","^;;","^=B","^UO","^9>","^:S","^??","^JL","^>9","^=F","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/range.js"],"^:1",["^9K",["^KM","~$goog.editor.range.Point"]],"^9<",true,"^9=",["^9>","^;9","^;;","^=B","^=F","^>9","^UO","^??","^JL","^>6","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.debug.logbuffer.js","^9C",["^9D","goog/debug/logbuffer.js"],"^9E","goog/debug/logbuffer.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A buffer for log records. The purpose of this is to improve\n * logging performance by re-using old objects when the buffer becomes full and\n * to eliminate the need for each app to implement their own log buffer. The\n * disadvantage to doing this is that log handlers cannot maintain references to\n * log records and expect that they are not overwriten at a later point.\n *\n * @author agrieve@google.com (Andrew Grieve)\n */\n\ngoog.provide('goog.debug.LogBuffer');\n\ngoog.require('goog.asserts');\ngoog.require('goog.debug.LogRecord');\n\n\n\n/**\n * Creates the log buffer.\n * @constructor\n * @final\n */\ngoog.debug.LogBuffer = function() {\n  goog.asserts.assert(\n      goog.debug.LogBuffer.isBufferingEnabled(),\n      'Cannot use goog.debug.LogBuffer without defining ' +\n          'goog.debug.LogBuffer.CAPACITY.');\n  this.clear();\n};\n\n\n/**\n * A static method that always returns the same instance of LogBuffer.\n * @return {!goog.debug.LogBuffer} The LogBuffer singleton instance.\n */\ngoog.debug.LogBuffer.getInstance = function() {\n  if (!goog.debug.LogBuffer.instance_) {\n    // This function is written with the return statement after the assignment\n    // to avoid the jscompiler StripCode bug described in http://b/2608064.\n    // After that bug is fixed this can be refactored.\n    goog.debug.LogBuffer.instance_ = new goog.debug.LogBuffer();\n  }\n  return goog.debug.LogBuffer.instance_;\n};\n\n\n/**\n * @define {number} The number of log records to buffer. 0 means disable\n * buffering.\n */\ngoog.debug.LogBuffer.CAPACITY = goog.define('goog.debug.LogBuffer.CAPACITY', 0);\n\n\n/**\n * The array to store the records.\n * @type {!Array<!goog.debug.LogRecord|undefined>}\n * @private\n */\ngoog.debug.LogBuffer.prototype.buffer_;\n\n\n/**\n * The index of the most recently added record or -1 if there are no records.\n * @type {number}\n * @private\n */\ngoog.debug.LogBuffer.prototype.curIndex_;\n\n\n/**\n * Whether the buffer is at capacity.\n * @type {boolean}\n * @private\n */\ngoog.debug.LogBuffer.prototype.isFull_;\n\n\n/**\n * Adds a log record to the buffer, possibly overwriting the oldest record.\n * @param {goog.debug.Logger.Level} level One of the level identifiers.\n * @param {string} msg The string message.\n * @param {string} loggerName The name of the source logger.\n * @return {!goog.debug.LogRecord} The log record.\n */\ngoog.debug.LogBuffer.prototype.addRecord = function(level, msg, loggerName) {\n  var curIndex = (this.curIndex_ + 1) % goog.debug.LogBuffer.CAPACITY;\n  this.curIndex_ = curIndex;\n  if (this.isFull_) {\n    var ret = this.buffer_[curIndex];\n    ret.reset(level, msg, loggerName);\n    return ret;\n  }\n  this.isFull_ = curIndex == goog.debug.LogBuffer.CAPACITY - 1;\n  return this.buffer_[curIndex] =\n             new goog.debug.LogRecord(level, msg, loggerName);\n};\n\n\n/**\n * @return {boolean} Whether the log buffer is enabled.\n */\ngoog.debug.LogBuffer.isBufferingEnabled = function() {\n  return goog.debug.LogBuffer.CAPACITY > 0;\n};\n\n\n/**\n * Removes all buffered log records.\n */\ngoog.debug.LogBuffer.prototype.clear = function() {\n  this.buffer_ = new Array(goog.debug.LogBuffer.CAPACITY);\n  this.curIndex_ = -1;\n  this.isFull_ = false;\n};\n\n\n/**\n * Calls the given function for each buffered log record, starting with the\n * oldest one.\n * @param {function(!goog.debug.LogRecord)} func The function to call.\n */\ngoog.debug.LogBuffer.prototype.forEachRecord = function(func) {\n  var buffer = this.buffer_;\n  // Corner case: no records.\n  if (!buffer[0]) {\n    return;\n  }\n  var curIndex = this.curIndex_;\n  var i = this.isFull_ ? curIndex : -1;\n  do {\n    i = (i + 1) % goog.debug.LogBuffer.CAPACITY;\n    func(/** @type {!goog.debug.LogRecord} */ (buffer[i]));\n  } while (i != curIndex);\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9>","^IM"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/logbuffer.js"],"^:1",["^9K",["^T>"]],"^9<",true,"^9=",["^9>","^:E","^IM"]],["^ ","^9A",[1579837703000],"^9B","goog.cssom.cssom.js","^9C",["^9D","goog/cssom/cssom.js"],"^9E","goog/cssom/cssom.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview CSS Object Model helper functions.\n * References:\n * - W3C: http://dev.w3.org/csswg/cssom/\n * - MSDN: http://msdn.microsoft.com/en-us/library/ms531209(VS.85).aspx.\n * TODO(user): Consider hacking page, media, etc.. to work.\n *     This would be pretty challenging. IE returns the text for any rule\n *     regardless of whether or not the media is correct or not. Firefox at\n *     least supports CSSRule.type to figure out if it's a media type and then\n *     we could do something interesting, but IE offers no way for us to tell.\n */\n\ngoog.provide('goog.cssom');\ngoog.provide('goog.cssom.CssRuleType');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\n\n\n/**\n * Enumeration of `CSSRule` types.\n * @enum {number}\n */\ngoog.cssom.CssRuleType = {\n  STYLE: 1,\n  IMPORT: 3,\n  MEDIA: 4,\n  FONT_FACE: 5,\n  PAGE: 6,\n  NAMESPACE: 7\n};\n\n\n/**\n * Recursively gets all CSS as text, optionally starting from a given\n * StyleSheet.\n * @param {(StyleSheet|StyleSheetList)=} opt_styleSheet\n * @return {string} css text.\n */\ngoog.cssom.getAllCssText = function(opt_styleSheet) {\n  var styleSheet = opt_styleSheet || document.styleSheets;\n  return /** @type {string} */ (goog.cssom.getAllCss_(styleSheet, true));\n};\n\n\n/**\n * Recursively gets all CSSStyleRules, optionally starting from a given\n * StyleSheet.\n * Note that this excludes any CSSImportRules, CSSMediaRules, etc..\n * @param {(StyleSheet|StyleSheetList)=} opt_styleSheet\n * @return {!Array<CSSStyleRule>} A list of CSSStyleRules.\n */\ngoog.cssom.getAllCssStyleRules = function(opt_styleSheet) {\n  var styleSheet = opt_styleSheet || document.styleSheets;\n  return /** @type {!Array<CSSStyleRule>} */ (\n      goog.cssom.getAllCss_(styleSheet, false));\n};\n\n\n/**\n * Returns the CSSRules from a styleSheet.\n * Worth noting here is that IE and FF differ in terms of what they will return.\n * Firefox will return styleSheet.cssRules, which includes ImportRules and\n * anything which implements the CSSRules interface. IE returns simply a list of\n * CSSRules.\n * @param {StyleSheet} styleSheet\n * @throws {Error} If we cannot access the rules on a stylesheet object - this\n *     can  happen if a stylesheet object's rules are accessed before the rules\n *     have been downloaded and parsed and are \"ready\".\n * @return {CSSRuleList} An array of CSSRules or null.\n * @suppress {strictMissingProperties} StyleSheet does not define cssRules\n */\ngoog.cssom.getCssRulesFromStyleSheet = function(styleSheet) {\n  var cssRuleList = null;\n  try {\n    // Select cssRules unless it isn't present.  For pre-IE9 IE, use the rules\n    // collection instead.\n    // It's important to be consistent in using only the W3C or IE apis on\n    // IE9+ where both are present to ensure that there is no indexing\n    // mismatches - the collections are subtly different in what the include or\n    // exclude which can lead to one collection being longer than the other\n    // depending on the page's construction.\n    cssRuleList = styleSheet.cssRules /* W3C */ || styleSheet.rules /* IE */;\n  } catch (e) {\n    // This can happen if we try to access the CSSOM before it's \"ready\".\n    if (e.code == 15) {\n      // Firefox throws an NS_ERROR_DOM_INVALID_ACCESS_ERR error if a stylesheet\n      // is read before it has been fully parsed. Let the caller know which\n      // stylesheet failed.\n      e.styleSheet = styleSheet;\n      throw e;\n    }\n  }\n  return cssRuleList;\n};\n\n\n/**\n * Gets all StyleSheet objects starting from some StyleSheet. Note that we\n * want to return the sheets in the order of the cascade, therefore if we\n * encounter an import, we will splice that StyleSheet object in front of\n * the StyleSheet that contains it in the returned array of StyleSheets.\n * @param {(StyleSheet|StyleSheetList)=} opt_styleSheet A StyleSheet.\n * @param {boolean=} opt_includeDisabled If true, includes disabled stylesheets,\n *    defaults to false.\n * @return {!Array<StyleSheet>} A list of StyleSheet objects.\n * @suppress {strictMissingProperties} StyleSheet does not define cssRules\n */\ngoog.cssom.getAllCssStyleSheets = function(\n    opt_styleSheet, opt_includeDisabled) {\n  var styleSheetsOutput = [];\n  var styleSheet = opt_styleSheet || document.styleSheets;\n  var includeDisabled =\n      (opt_includeDisabled !== undefined) ? opt_includeDisabled : false;\n\n  // Imports need to go first.\n  if (styleSheet.imports && styleSheet.imports.length) {\n    for (var i = 0, n = styleSheet.imports.length; i < n; i++) {\n      goog.array.extend(\n          styleSheetsOutput,\n          goog.cssom.getAllCssStyleSheets(styleSheet.imports[i]));\n    }\n\n  } else if (styleSheet.length) {\n    // In case we get a StyleSheetList object.\n    // http://dev.w3.org/csswg/cssom/#the-stylesheetlist\n    for (var i = 0, n = styleSheet.length; i < n; i++) {\n      goog.array.extend(\n          styleSheetsOutput,\n          goog.cssom.getAllCssStyleSheets(\n              /** @type {!StyleSheet} */ (styleSheet[i])));\n    }\n  } else {\n    // We need to walk through rules in browsers which implement .cssRules\n    // to see if there are styleSheets buried in there.\n    // If we have a StyleSheet within CssRules.\n    var cssRuleList = goog.cssom.getCssRulesFromStyleSheet(\n        /** @type {!StyleSheet} */ (styleSheet));\n    if (cssRuleList && cssRuleList.length) {\n      // Chrome does not evaluate cssRuleList[i] to undefined when i >=n;\n      // so we use a (i < n) check instead of cssRuleList[i] in the loop below\n      // and in other places where we iterate over a rules list.\n      // See issue # 5917 in Chromium.\n      for (var i = 0, n = cssRuleList.length, cssRule; i < n; i++) {\n        cssRule = cssRuleList[i];\n        // There are more stylesheets to get on this object..\n        if (cssRule.styleSheet) {\n          goog.array.extend(\n              styleSheetsOutput,\n              goog.cssom.getAllCssStyleSheets(cssRule.styleSheet));\n        }\n      }\n    }\n  }\n\n  // This is a StyleSheet. (IE uses .rules, W3c and Opera cssRules.)\n  if ((styleSheet.type || styleSheet.rules || styleSheet.cssRules) &&\n      (!styleSheet.disabled || includeDisabled)) {\n    styleSheetsOutput.push(styleSheet);\n  }\n\n  return styleSheetsOutput;\n};\n\n\n/**\n * Gets the cssText from a CSSRule object cross-browserly.\n * @param {CSSRule} cssRule A CSSRule.\n * @return {string} cssText The text for the rule, including the selector.\n */\ngoog.cssom.getCssTextFromCssRule = function(cssRule) {\n  var cssText = '';\n\n  // Per github.com/microsoft/ChakraCore/issues/6165, IE/Edge errors when\n  // referencing the cssText property in some cases.\n  try {\n    cssText = cssRule.cssText;\n  } catch (e) {\n    return '';\n  }\n\n  if (!cssText && cssRule.style && cssRule.style.cssText &&\n      cssRule.selectorText) {\n    // IE: The spacing here is intended to make the result consistent with\n    // FF and Webkit.\n    // We also remove the special properties that we may have added in\n    // getAllCssStyleRules since IE includes those in the cssText.\n    var styleCssText =\n        cssRule.style.cssText\n            .replace(/\\s*-closure-parent-stylesheet:\\s*\\[object\\];?\\s*/gi, '')\n            .replace(/\\s*-closure-rule-index:\\s*[\\d]+;?\\s*/gi, '');\n    var thisCssText = cssRule.selectorText + ' { ' + styleCssText + ' }';\n    cssText = thisCssText;\n  }\n\n  return cssText;\n};\n\n\n/**\n * Get the index of the CSSRule in it's StyleSheet.\n * @param {CSSRule} cssRule A CSSRule.\n * @param {StyleSheet=} opt_parentStyleSheet A reference to the stylesheet\n *     object this cssRule belongs to.\n * @throws {Error} When we cannot get the parentStyleSheet.\n * @return {number} The index of the CSSRule, or -1.\n */\ngoog.cssom.getCssRuleIndexInParentStyleSheet = function(\n    cssRule, opt_parentStyleSheet) {\n  // Look for our special style.ruleIndex property from getAllCss.\n  if (cssRule.style && /** @type {!Object} */ (cssRule.style)['-closure-rule-index']) {\n    return (/** @type {!Object} */ (cssRule.style))['-closure-rule-index'];\n  }\n\n  var parentStyleSheet =\n      opt_parentStyleSheet || goog.cssom.getParentStyleSheet(cssRule);\n\n  if (!parentStyleSheet) {\n    // We could call getAllCssStyleRules() here to get our special indexes on\n    // the style object, but that seems like it could be wasteful.\n    throw new Error('Cannot find a parentStyleSheet.');\n  }\n\n  var cssRuleList = goog.cssom.getCssRulesFromStyleSheet(parentStyleSheet);\n  if (cssRuleList && cssRuleList.length) {\n    for (var i = 0, n = cssRuleList.length, thisCssRule; i < n; i++) {\n      thisCssRule = cssRuleList[i];\n      if (thisCssRule == cssRule) {\n        return i;\n      }\n    }\n  }\n  return -1;\n};\n\n\n/**\n * We do some trickery in getAllCssStyleRules that hacks this in for IE.\n * If the cssRule object isn't coming from a result of that function call, this\n * method will return undefined in IE.\n * @param {CSSRule} cssRule The CSSRule.\n * @return {StyleSheet} A styleSheet object.\n */\ngoog.cssom.getParentStyleSheet = function(cssRule) {\n  return cssRule.parentStyleSheet ||\n      cssRule.style &&\n      (/** @type {!Object} */ (cssRule.style))['-closure-parent-stylesheet'];\n};\n\n\n/**\n * Replace a cssRule with some cssText for a new rule.\n * If the cssRule object is not one of objects returned by\n * getAllCssStyleRules, then you'll need to provide both the styleSheet and\n * possibly the index, since we can't infer them from the standard cssRule\n * object in IE. We do some trickery in getAllCssStyleRules to hack this in.\n * @param {CSSRule} cssRule A CSSRule.\n * @param {string} cssText The text for the new CSSRule.\n * @param {StyleSheet=} opt_parentStyleSheet A reference to the stylesheet\n *     object this cssRule belongs to.\n * @param {number=} opt_index The index of the cssRule in its parentStylesheet.\n * @throws {Error} If we cannot find a parentStyleSheet.\n * @throws {Error} If we cannot find a css rule index.\n */\ngoog.cssom.replaceCssRule = function(\n    cssRule, cssText, opt_parentStyleSheet, opt_index) {\n  var parentStyleSheet =\n      opt_parentStyleSheet || goog.cssom.getParentStyleSheet(cssRule);\n  if (parentStyleSheet) {\n    var index = Number(opt_index) >= 0 ?\n        Number(opt_index) :\n        goog.cssom.getCssRuleIndexInParentStyleSheet(cssRule, parentStyleSheet);\n    if (index >= 0) {\n      goog.cssom.removeCssRule(parentStyleSheet, index);\n      goog.cssom.addCssRule(parentStyleSheet, cssText, index);\n    } else {\n      throw new Error('Cannot proceed without the index of the cssRule.');\n    }\n  } else {\n    throw new Error('Cannot proceed without the parentStyleSheet.');\n  }\n};\n\n\n/**\n * Cross browser function to add a CSSRule into a StyleSheet, optionally\n * at a given index.\n * @param {StyleSheet} cssStyleSheet The CSSRule's parentStyleSheet.\n * @param {string} cssText The text for the new CSSRule.\n * @param {number=} opt_index The index of the cssRule in its parentStylesheet.\n * @throws {Error} If the css rule text appears to be ill-formatted.\n * TODO(bowdidge): Inserting at index 0 fails on Firefox 2 and 3 with an\n *     exception warning \"Node cannot be inserted at the specified point in\n *     the hierarchy.\"\n */\ngoog.cssom.addCssRule = function(cssStyleSheet, cssText, opt_index) {\n  var index = opt_index;\n  if (index == undefined || index < 0) {\n    // If no index specified, insert at the end of the current list\n    // of rules.\n    var rules = goog.cssom.getCssRulesFromStyleSheet(cssStyleSheet);\n    index = rules.length;\n  }\n  if (cssStyleSheet.insertRule) {\n    // W3C (including IE9+).\n    cssStyleSheet.insertRule(cssText, index);\n\n  } else {\n    // IE, pre 9: We have to parse the cssRule text to get the selector\n    // separated from the style text.\n    // aka Everything that isn't a colon, followed by a colon, then\n    // the rest is the style part.\n    var matches = /^([^\\{]+)\\{([^\\{]+)\\}/.exec(cssText);\n    if (matches.length == 3) {\n      var selector = matches[1];\n      var style = matches[2];\n      cssStyleSheet.addRule(selector, style, index);\n    } else {\n      throw new Error('Your CSSRule appears to be ill-formatted.');\n    }\n  }\n};\n\n\n/**\n * Cross browser function to remove a CSSRule in a StyleSheet at an index.\n * @param {StyleSheet} cssStyleSheet The CSSRule's parentStyleSheet.\n * @param {number} index The CSSRule's index in the parentStyleSheet.\n */\ngoog.cssom.removeCssRule = function(cssStyleSheet, index) {\n  if (cssStyleSheet.deleteRule) {\n    // W3C.\n    cssStyleSheet.deleteRule(index);\n\n  } else {\n    // IE.\n    cssStyleSheet.removeRule(index);\n  }\n};\n\n\n/**\n * Appends a DOM node to HEAD containing the css text that's passed in.\n * @param {string} cssText CSS to add to the end of the document.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper user for\n *     document interactions.\n * @return {!Element} The newly created STYLE element.\n */\ngoog.cssom.addCssText = function(cssText, opt_domHelper) {\n  var domHelper = opt_domHelper || goog.dom.getDomHelper();\n  var document = domHelper.getDocument();\n  var cssNode = domHelper.createElement(goog.dom.TagName.STYLE);\n  cssNode.type = 'text/css';\n  var head = domHelper.getElementsByTagName(goog.dom.TagName.HEAD)[0];\n  head.appendChild(cssNode);\n  if (cssNode.styleSheet) {\n    // IE.\n    cssNode.styleSheet.cssText = cssText;\n  } else {\n    // W3C.\n    var cssTextNode = document.createTextNode(cssText);\n    cssNode.appendChild(cssTextNode);\n  }\n  return cssNode;\n};\n\n\n/**\n * Cross browser method to get the filename from the StyleSheet's href.\n * Explorer only returns the filename in the href, while other agents return\n * the full path.\n * @param {!StyleSheet} styleSheet Any valid StyleSheet object with an href.\n * @throws {Error} When there's no href property found.\n * @return {?string} filename The filename, or null if not an external\n *    styleSheet.\n */\ngoog.cssom.getFileNameFromStyleSheet = function(styleSheet) {\n  var href = styleSheet.href;\n\n  // Another IE/FF difference. IE returns an empty string, while FF and others\n  // return null for StyleSheets not from an external file.\n  if (!href) {\n    return null;\n  }\n\n  // We need the regexp to ensure we get the filename minus any query params.\n  var matches = /([^\\/\\?]+)[^\\/]*$/.exec(href);\n  var filename = matches[1];\n  return filename;\n};\n\n\n/**\n * Recursively gets all CSS text or rules.\n * @param {StyleSheet|StyleSheetList} styleSheet\n * @param {boolean} isTextOutput If true, output is cssText, otherwise cssRules.\n * @return {string|!Array<CSSRule>} cssText or cssRules.\n * @private\n */\ngoog.cssom.getAllCss_ = function(styleSheet, isTextOutput) {\n  var cssOut = [];\n  var styleSheets = goog.cssom.getAllCssStyleSheets(styleSheet);\n\n  for (var i = 0; styleSheet = styleSheets[i]; i++) {\n    var cssRuleList = goog.cssom.getCssRulesFromStyleSheet(styleSheet);\n\n    if (cssRuleList && cssRuleList.length) {\n      var ruleIndex = 0;\n      for (var j = 0, n = cssRuleList.length, cssRule; j < n; j++) {\n        cssRule = cssRuleList[j];\n        // Gets cssText output, ignoring CSSImportRules.\n        if (isTextOutput && !cssRule.href) {\n          var res = goog.cssom.getCssTextFromCssRule(cssRule);\n          cssOut.push(res);\n\n        } else if (!cssRule.href) {\n          // Gets cssRules output, ignoring CSSImportRules.\n          if (cssRule.style) {\n            // This is a fun little hack to get parentStyleSheet into the rule\n            // object for IE since it failed to implement rule.parentStyleSheet.\n            // We can later read this property when doing things like hunting\n            // for indexes in order to delete a given CSSRule.\n            // Unfortunately we have to use the style object to store these\n            // pieces of info since the rule object is read-only.\n            if (!cssRule.parentStyleSheet) {\n              (/** @type {!Object} */ (cssRule.style))[\n                '-closure-parent-stylesheet'] = styleSheet;\n            }\n\n            // This is a hack to help with possible removal of the rule later,\n            // where we just append the rule's index in its parentStyleSheet\n            // onto the style object as a property.\n            // Unfortunately we have to use the style object to store these\n            // pieces of info since the rule object is read-only.\n            (/** @type {!Object} */ (cssRule.style))['-closure-rule-index'] =\n                isTextOutput ? undefined : ruleIndex;\n          }\n          cssOut.push(cssRule);\n        }\n        if (!isTextOutput) {\n          ruleIndex++;\n        }\n      }\n    }\n  }\n  return isTextOutput ? cssOut.join(' ') : cssOut;\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","^9>","^;9","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/cssom/cssom.js"],"^:1",["^9K",["~$goog.cssom.CssRuleType","^:T"]],"^9<",true,"^9=",["^9>","^;9","^;;","^;="]],["^ ","^9A",[1579837703000],"^9B","goog.uri.utils.js","^9C",["^9D","goog/uri/utils.js"],"^9E","goog/uri/utils.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Simple utilities for dealing with URI strings.\n *\n * This is intended to be a lightweight alternative to constructing goog.Uri\n * objects.  Whereas goog.Uri adds several kilobytes to the binary regardless\n * of how much of its functionality you use, this is designed to be a set of\n * mostly-independent utilities so that the compiler includes only what is\n * necessary for the task.  Estimated savings of porting is 5k pre-gzip and\n * 1.5k post-gzip.  To ensure the savings remain, future developers should\n * avoid adding new functionality to existing functions, but instead create\n * new ones and factor out shared code.\n *\n * Many of these utilities have limited functionality, tailored to common\n * cases.  The query parameter utilities assume that the parameter keys are\n * already encoded, since most keys are compile-time alphanumeric strings.  The\n * query parameter mutation utilities also do not tolerate fragment identifiers.\n *\n * By design, these functions can be slower than goog.Uri equivalents.\n * Repeated calls to some of functions may be quadratic in behavior for IE,\n * although the effect is somewhat limited given the 2kb limit.\n *\n * One advantage of the limited functionality here is that this approach is\n * less sensitive to differences in URI encodings than goog.Uri, since these\n * functions operate on strings directly, rather than decoding them and\n * then re-encoding.\n *\n * Uses features of RFC 3986 for parsing/formatting URIs:\n *   http://www.ietf.org/rfc/rfc3986.txt\n *\n * @author gboyer@google.com (Garrett Boyer) - The \"lightened\" design.\n * @author msamuel@google.com (Mike Samuel) - Domain knowledge and regexes.\n */\n\ngoog.provide('goog.uri.utils');\ngoog.provide('goog.uri.utils.ComponentIndex');\ngoog.provide('goog.uri.utils.QueryArray');\ngoog.provide('goog.uri.utils.QueryValue');\ngoog.provide('goog.uri.utils.StandardQueryParam');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.string');\n\n\n/**\n * Character codes inlined to avoid object allocations due to charCode.\n * @enum {number}\n * @private\n */\ngoog.uri.utils.CharCode_ = {\n  AMPERSAND: 38,\n  EQUAL: 61,\n  HASH: 35,\n  QUESTION: 63\n};\n\n\n/**\n * Builds a URI string from already-encoded parts.\n *\n * No encoding is performed.  Any component may be omitted as either null or\n * undefined.\n *\n * @param {?string=} opt_scheme The scheme such as 'http'.\n * @param {?string=} opt_userInfo The user name before the '@'.\n * @param {?string=} opt_domain The domain such as 'www.google.com', already\n *     URI-encoded.\n * @param {(string|number|null)=} opt_port The port number.\n * @param {?string=} opt_path The path, already URI-encoded.  If it is not\n *     empty, it must begin with a slash.\n * @param {?string=} opt_queryData The URI-encoded query data.\n * @param {?string=} opt_fragment The URI-encoded fragment identifier.\n * @return {string} The fully combined URI.\n */\ngoog.uri.utils.buildFromEncodedParts = function(\n    opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData,\n    opt_fragment) {\n  var out = '';\n\n  if (opt_scheme) {\n    out += opt_scheme + ':';\n  }\n\n  if (opt_domain) {\n    out += '//';\n\n    if (opt_userInfo) {\n      out += opt_userInfo + '@';\n    }\n\n    out += opt_domain;\n\n    if (opt_port) {\n      out += ':' + opt_port;\n    }\n  }\n\n  if (opt_path) {\n    out += opt_path;\n  }\n\n  if (opt_queryData) {\n    out += '?' + opt_queryData;\n  }\n\n  if (opt_fragment) {\n    out += '#' + opt_fragment;\n  }\n\n  return out;\n};\n\n\n/**\n * A regular expression for breaking a URI into its component parts.\n *\n * {@link http://www.ietf.org/rfc/rfc3986.txt} says in Appendix B\n * As the \"first-match-wins\" algorithm is identical to the \"greedy\"\n * disambiguation method used by POSIX regular expressions, it is natural and\n * commonplace to use a regular expression for parsing the potential five\n * components of a URI reference.\n *\n * The following line is the regular expression for breaking-down a\n * well-formed URI reference into its components.\n *\n * <pre>\n * ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?\n *  12            3  4          5       6  7        8 9\n * </pre>\n *\n * The numbers in the second line above are only to assist readability; they\n * indicate the reference points for each subexpression (i.e., each paired\n * parenthesis). We refer to the value matched for subexpression <n> as $<n>.\n * For example, matching the above expression to\n * <pre>\n *     http://www.ics.uci.edu/pub/ietf/uri/#Related\n * </pre>\n * results in the following subexpression matches:\n * <pre>\n *    $1 = http:\n *    $2 = http\n *    $3 = //www.ics.uci.edu\n *    $4 = www.ics.uci.edu\n *    $5 = /pub/ietf/uri/\n *    $6 = <undefined>\n *    $7 = <undefined>\n *    $8 = #Related\n *    $9 = Related\n * </pre>\n * where <undefined> indicates that the component is not present, as is the\n * case for the query component in the above example. Therefore, we can\n * determine the value of the five components as\n * <pre>\n *    scheme    = $2\n *    authority = $4\n *    path      = $5\n *    query     = $7\n *    fragment  = $9\n * </pre>\n *\n * The regular expression has been modified slightly to expose the\n * userInfo, domain, and port separately from the authority.\n * The modified version yields\n * <pre>\n *    $1 = http              scheme\n *    $2 = <undefined>       userInfo -\\\n *    $3 = www.ics.uci.edu   domain     | authority\n *    $4 = <undefined>       port     -/\n *    $5 = /pub/ietf/uri/    path\n *    $6 = <undefined>       query without ?\n *    $7 = Related           fragment without #\n * </pre>\n * @type {!RegExp}\n * @private\n */\ngoog.uri.utils.splitRe_ = new RegExp(\n    '^' +\n    '(?:' +\n    '([^:/?#.]+)' +  // scheme - ignore special characters\n                     // used by other URL parts such as :,\n                     // ?, /, #, and .\n    ':)?' +\n    '(?://' +\n    '(?:([^/?#]*)@)?' +  // userInfo\n    '([^/#?]*?)' +       // domain\n    '(?::([0-9]+))?' +   // port\n    '(?=[/#?]|$)' +      // authority-terminating character\n    ')?' +\n    '([^?#]+)?' +          // path\n    '(?:\\\\?([^#]*))?' +    // query\n    '(?:#([\\\\s\\\\S]*))?' +  // fragment\n    '$');\n\n\n/**\n * The index of each URI component in the return value of goog.uri.utils.split.\n * @enum {number}\n */\ngoog.uri.utils.ComponentIndex = {\n  SCHEME: 1,\n  USER_INFO: 2,\n  DOMAIN: 3,\n  PORT: 4,\n  PATH: 5,\n  QUERY_DATA: 6,\n  FRAGMENT: 7\n};\n\n\n/**\n * Splits a URI into its component parts.\n *\n * Each component can be accessed via the component indices; for example:\n * <pre>\n * goog.uri.utils.split(someStr)[goog.uri.utils.ComponentIndex.QUERY_DATA];\n * </pre>\n *\n * @param {string} uri The URI string to examine.\n * @return {!Array<string|undefined>} Each component still URI-encoded.\n *     Each component that is present will contain the encoded value, whereas\n *     components that are not present will be undefined or empty, depending\n *     on the browser's regular expression implementation.  Never null, since\n *     arbitrary strings may still look like path names.\n */\ngoog.uri.utils.split = function(uri) {\n  // See @return comment -- never null.\n  return /** @type {!Array<string|undefined>} */ (\n      uri.match(goog.uri.utils.splitRe_));\n};\n\n\n/**\n * @param {?string} uri A possibly null string.\n * @param {boolean=} opt_preserveReserved If true, percent-encoding of RFC-3986\n *     reserved characters will not be removed.\n * @return {?string} The string URI-decoded, or null if uri is null.\n * @private\n */\ngoog.uri.utils.decodeIfPossible_ = function(uri, opt_preserveReserved) {\n  if (!uri) {\n    return uri;\n  }\n\n  return opt_preserveReserved ? decodeURI(uri) : decodeURIComponent(uri);\n};\n\n\n/**\n * Gets a URI component by index.\n *\n * It is preferred to use the getPathEncoded() variety of functions ahead,\n * since they are more readable.\n *\n * @param {goog.uri.utils.ComponentIndex} componentIndex The component index.\n * @param {string} uri The URI to examine.\n * @return {?string} The still-encoded component, or null if the component\n *     is not present.\n * @private\n */\ngoog.uri.utils.getComponentByIndex_ = function(componentIndex, uri) {\n  // Convert undefined, null, and empty string into null.\n  return goog.uri.utils.split(uri)[componentIndex] || null;\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The protocol or scheme, or null if none.  Does not\n *     include trailing colons or slashes.\n */\ngoog.uri.utils.getScheme = function(uri) {\n  return goog.uri.utils.getComponentByIndex_(\n      goog.uri.utils.ComponentIndex.SCHEME, uri);\n};\n\n\n/**\n * Gets the effective scheme for the URL.  If the URL is relative then the\n * scheme is derived from the page's location.\n * @param {string} uri The URI to examine.\n * @return {string} The protocol or scheme, always lower case.\n */\ngoog.uri.utils.getEffectiveScheme = function(uri) {\n  var scheme = goog.uri.utils.getScheme(uri);\n  if (!scheme && goog.global.self && goog.global.self.location) {\n    var protocol = goog.global.self.location.protocol;\n    scheme = protocol.substr(0, protocol.length - 1);\n  }\n  // NOTE: When called from a web worker in Firefox 3.5, location may be null.\n  // All other browsers with web workers support self.location from the worker.\n  return scheme ? scheme.toLowerCase() : '';\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The user name still encoded, or null if none.\n */\ngoog.uri.utils.getUserInfoEncoded = function(uri) {\n  return goog.uri.utils.getComponentByIndex_(\n      goog.uri.utils.ComponentIndex.USER_INFO, uri);\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The decoded user info, or null if none.\n */\ngoog.uri.utils.getUserInfo = function(uri) {\n  return goog.uri.utils.decodeIfPossible_(\n      goog.uri.utils.getUserInfoEncoded(uri));\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The domain name still encoded, or null if none.\n */\ngoog.uri.utils.getDomainEncoded = function(uri) {\n  return goog.uri.utils.getComponentByIndex_(\n      goog.uri.utils.ComponentIndex.DOMAIN, uri);\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The decoded domain, or null if none.\n */\ngoog.uri.utils.getDomain = function(uri) {\n  return goog.uri.utils.decodeIfPossible_(\n      goog.uri.utils.getDomainEncoded(uri), true /* opt_preserveReserved */);\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?number} The port number, or null if none.\n */\ngoog.uri.utils.getPort = function(uri) {\n  // Coerce to a number.  If the result of getComponentByIndex_ is null or\n  // non-numeric, the number coersion yields NaN.  This will then return\n  // null for all non-numeric cases (though also zero, which isn't a relevant\n  // port number).\n  return Number(\n             goog.uri.utils.getComponentByIndex_(\n                 goog.uri.utils.ComponentIndex.PORT, uri)) ||\n      null;\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The path still encoded, or null if none. Includes the\n *     leading slash, if any.\n */\ngoog.uri.utils.getPathEncoded = function(uri) {\n  return goog.uri.utils.getComponentByIndex_(\n      goog.uri.utils.ComponentIndex.PATH, uri);\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The decoded path, or null if none.  Includes the leading\n *     slash, if any.\n */\ngoog.uri.utils.getPath = function(uri) {\n  return goog.uri.utils.decodeIfPossible_(\n      goog.uri.utils.getPathEncoded(uri), true /* opt_preserveReserved */);\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The query data still encoded, or null if none.  Does not\n *     include the question mark itself.\n */\ngoog.uri.utils.getQueryData = function(uri) {\n  return goog.uri.utils.getComponentByIndex_(\n      goog.uri.utils.ComponentIndex.QUERY_DATA, uri);\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The fragment identifier, or null if none.  Does not\n *     include the hash mark itself.\n */\ngoog.uri.utils.getFragmentEncoded = function(uri) {\n  // The hash mark may not appear in any other part of the URL.\n  var hashIndex = uri.indexOf('#');\n  return hashIndex < 0 ? null : uri.substr(hashIndex + 1);\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @param {?string} fragment The encoded fragment identifier, or null if none.\n *     Does not include the hash mark itself.\n * @return {string} The URI with the fragment set.\n */\ngoog.uri.utils.setFragmentEncoded = function(uri, fragment) {\n  return goog.uri.utils.removeFragment(uri) + (fragment ? '#' + fragment : '');\n};\n\n\n/**\n * @param {string} uri The URI to examine.\n * @return {?string} The decoded fragment identifier, or null if none.  Does\n *     not include the hash mark.\n */\ngoog.uri.utils.getFragment = function(uri) {\n  return goog.uri.utils.decodeIfPossible_(\n      goog.uri.utils.getFragmentEncoded(uri));\n};\n\n\n/**\n * Extracts everything up to the port of the URI.\n * @param {string} uri The URI string.\n * @return {string} Everything up to and including the port.\n */\ngoog.uri.utils.getHost = function(uri) {\n  var pieces = goog.uri.utils.split(uri);\n  return goog.uri.utils.buildFromEncodedParts(\n      pieces[goog.uri.utils.ComponentIndex.SCHEME],\n      pieces[goog.uri.utils.ComponentIndex.USER_INFO],\n      pieces[goog.uri.utils.ComponentIndex.DOMAIN],\n      pieces[goog.uri.utils.ComponentIndex.PORT]);\n};\n\n\n/**\n * Returns the origin for a given URL.\n * @param {string} uri The URI string.\n * @return {string} Everything up to and including the port.\n */\ngoog.uri.utils.getOrigin = function(uri) {\n  var pieces = goog.uri.utils.split(uri);\n  return goog.uri.utils.buildFromEncodedParts(\n      pieces[goog.uri.utils.ComponentIndex.SCHEME], null /* opt_userInfo */,\n      pieces[goog.uri.utils.ComponentIndex.DOMAIN],\n      pieces[goog.uri.utils.ComponentIndex.PORT]);\n};\n\n\n/**\n * Extracts the path of the URL and everything after.\n * @param {string} uri The URI string.\n * @return {string} The URI, starting at the path and including the query\n *     parameters and fragment identifier.\n */\ngoog.uri.utils.getPathAndAfter = function(uri) {\n  var pieces = goog.uri.utils.split(uri);\n  return goog.uri.utils.buildFromEncodedParts(\n      null, null, null, null, pieces[goog.uri.utils.ComponentIndex.PATH],\n      pieces[goog.uri.utils.ComponentIndex.QUERY_DATA],\n      pieces[goog.uri.utils.ComponentIndex.FRAGMENT]);\n};\n\n\n/**\n * Gets the URI with the fragment identifier removed.\n * @param {string} uri The URI to examine.\n * @return {string} Everything preceding the hash mark.\n */\ngoog.uri.utils.removeFragment = function(uri) {\n  // The hash mark may not appear in any other part of the URL.\n  var hashIndex = uri.indexOf('#');\n  return hashIndex < 0 ? uri : uri.substr(0, hashIndex);\n};\n\n\n/**\n * Ensures that two URI's have the exact same domain, scheme, and port.\n *\n * Unlike the version in goog.Uri, this checks protocol, and therefore is\n * suitable for checking against the browser's same-origin policy.\n *\n * @param {string} uri1 The first URI.\n * @param {string} uri2 The second URI.\n * @return {boolean} Whether they have the same scheme, domain and port.\n */\ngoog.uri.utils.haveSameDomain = function(uri1, uri2) {\n  var pieces1 = goog.uri.utils.split(uri1);\n  var pieces2 = goog.uri.utils.split(uri2);\n  return pieces1[goog.uri.utils.ComponentIndex.DOMAIN] ==\n      pieces2[goog.uri.utils.ComponentIndex.DOMAIN] &&\n      pieces1[goog.uri.utils.ComponentIndex.SCHEME] ==\n      pieces2[goog.uri.utils.ComponentIndex.SCHEME] &&\n      pieces1[goog.uri.utils.ComponentIndex.PORT] ==\n      pieces2[goog.uri.utils.ComponentIndex.PORT];\n};\n\n\n/**\n * Asserts that there are no fragment or query identifiers, only in uncompiled\n * mode.\n * @param {string} uri The URI to examine.\n * @private\n */\ngoog.uri.utils.assertNoFragmentsOrQueries_ = function(uri) {\n  goog.asserts.assert(\n      uri.indexOf('#') < 0 && uri.indexOf('?') < 0,\n      'goog.uri.utils: Fragment or query identifiers are not supported: [%s]',\n      uri);\n};\n\n\n/**\n * Supported query parameter values by the parameter serializing utilities.\n *\n * If a value is null or undefined, the key-value pair is skipped, as an easy\n * way to omit parameters conditionally.  Non-array parameters are converted\n * to a string and URI encoded.  Array values are expanded into multiple\n * &key=value pairs, with each element stringized and URI-encoded.\n *\n * @typedef {*}\n */\ngoog.uri.utils.QueryValue;\n\n\n/**\n * An array representing a set of query parameters with alternating keys\n * and values.\n *\n * Keys are assumed to be URI encoded already and live at even indices.  See\n * goog.uri.utils.QueryValue for details on how parameter values are encoded.\n *\n * Example:\n * <pre>\n * var data = [\n *   // Simple param: ?name=BobBarker\n *   'name', 'BobBarker',\n *   // Conditional param -- may be omitted entirely.\n *   'specialDietaryNeeds', hasDietaryNeeds() ? getDietaryNeeds() : null,\n *   // Multi-valued param: &house=LosAngeles&house=NewYork&house=null\n *   'house', ['LosAngeles', 'NewYork', null]\n * ];\n * </pre>\n *\n * @typedef {!Array<string|goog.uri.utils.QueryValue>}\n */\ngoog.uri.utils.QueryArray;\n\n\n/**\n * Parses encoded query parameters and calls callback function for every\n * parameter found in the string.\n *\n * Missing value of parameter (e.g. “…&key&…”) is treated as if the value was an\n * empty string.  Keys may be empty strings (e.g. “…&=value&…”) which also means\n * that “…&=&…” and “…&&…” will result in an empty key and value.\n *\n * @param {string} encodedQuery Encoded query string excluding question mark at\n *     the beginning.\n * @param {function(string, string)} callback Function called for every\n *     parameter found in query string.  The first argument (name) will not be\n *     urldecoded (so the function is consistent with buildQueryData), but the\n *     second will.  If the parameter has no value (i.e. “=” was not present)\n *     the second argument (value) will be an empty string.\n */\ngoog.uri.utils.parseQueryData = function(encodedQuery, callback) {\n  if (!encodedQuery) {\n    return;\n  }\n  var pairs = encodedQuery.split('&');\n  for (var i = 0; i < pairs.length; i++) {\n    var indexOfEquals = pairs[i].indexOf('=');\n    var name = null;\n    var value = null;\n    if (indexOfEquals >= 0) {\n      name = pairs[i].substring(0, indexOfEquals);\n      value = pairs[i].substring(indexOfEquals + 1);\n    } else {\n      name = pairs[i];\n    }\n    callback(name, value ? goog.string.urlDecode(value) : '');\n  }\n};\n\n\n/**\n * Split the URI into 3 parts where the [1] is the queryData without a leading\n * '?'. For example, the URI http://foo.com/bar?a=b#abc returns\n * ['http://foo.com/bar','a=b','#abc'].\n * @param {string} uri The URI to parse.\n * @return {!Array<string>} An array representation of uri of length 3 where the\n *     middle value is the queryData without a leading '?'.\n * @private\n */\ngoog.uri.utils.splitQueryData_ = function(uri) {\n  // Find the query data and hash.\n  var hashIndex = uri.indexOf('#');\n  if (hashIndex < 0) {\n    hashIndex = uri.length;\n  }\n  var questionIndex = uri.indexOf('?');\n  var queryData;\n  if (questionIndex < 0 || questionIndex > hashIndex) {\n    questionIndex = hashIndex;\n    queryData = '';\n  } else {\n    queryData = uri.substring(questionIndex + 1, hashIndex);\n  }\n  return [uri.substr(0, questionIndex), queryData, uri.substr(hashIndex)];\n};\n\n\n/**\n * Join an array created by splitQueryData_ back into a URI.\n * @param {!Array<string>} parts A URI in the form generated by splitQueryData_.\n * @return {string} The joined URI.\n * @private\n */\ngoog.uri.utils.joinQueryData_ = function(parts) {\n  return parts[0] + (parts[1] ? '?' + parts[1] : '') + parts[2];\n};\n\n\n/**\n * @param {string} queryData\n * @param {string} newData\n * @return {string}\n * @private\n */\ngoog.uri.utils.appendQueryData_ = function(queryData, newData) {\n  if (!newData) {\n    return queryData;\n  }\n  return queryData ? queryData + '&' + newData : newData;\n};\n\n\n/**\n * @param {string} uri\n * @param {string} queryData\n * @return {string}\n * @private\n */\ngoog.uri.utils.appendQueryDataToUri_ = function(uri, queryData) {\n  if (!queryData) {\n    return uri;\n  }\n  var parts = goog.uri.utils.splitQueryData_(uri);\n  parts[1] = goog.uri.utils.appendQueryData_(parts[1], queryData);\n  return goog.uri.utils.joinQueryData_(parts);\n};\n\n\n/**\n * Appends key=value pairs to an array, supporting multi-valued objects.\n * @param {*} key The key prefix.\n * @param {goog.uri.utils.QueryValue} value The value to serialize.\n * @param {!Array<string>} pairs The array to which the 'key=value' strings\n *     should be appended.\n * @private\n */\ngoog.uri.utils.appendKeyValuePairs_ = function(key, value, pairs) {\n  goog.asserts.assertString(key);\n  if (goog.isArray(value)) {\n    // Convince the compiler it's an array.\n    goog.asserts.assertArray(value);\n    for (var j = 0; j < value.length; j++) {\n      // Convert to string explicitly, to short circuit the null and array\n      // logic in this function -- this ensures that null and undefined get\n      // written as literal 'null' and 'undefined', and arrays don't get\n      // expanded out but instead encoded in the default way.\n      goog.uri.utils.appendKeyValuePairs_(key, String(value[j]), pairs);\n    }\n  } else if (value != null) {\n    // Skip a top-level null or undefined entirely.\n    pairs.push(\n        key +\n        // Check for empty string. Zero gets encoded into the url as literal\n        // strings.  For empty string, skip the equal sign, to be consistent\n        // with UriBuilder.java.\n        (value === '' ? '' : '=' + goog.string.urlEncode(value)));\n  }\n};\n\n\n/**\n * Builds a query data string from a sequence of alternating keys and values.\n * Currently generates \"&key&\" for empty args.\n *\n * @param {!IArrayLike<string|goog.uri.utils.QueryValue>} keysAndValues\n *     Alternating keys and values. See the QueryArray typedef.\n * @param {number=} opt_startIndex A start offset into the arary, defaults to 0.\n * @return {string} The encoded query string, in the form 'a=1&b=2'.\n */\ngoog.uri.utils.buildQueryData = function(keysAndValues, opt_startIndex) {\n  goog.asserts.assert(\n      Math.max(keysAndValues.length - (opt_startIndex || 0), 0) % 2 == 0,\n      'goog.uri.utils: Key/value lists must be even in length.');\n\n  var params = [];\n  for (var i = opt_startIndex || 0; i < keysAndValues.length; i += 2) {\n    var key = /** @type {string} */ (keysAndValues[i]);\n    goog.uri.utils.appendKeyValuePairs_(key, keysAndValues[i + 1], params);\n  }\n  return params.join('&');\n};\n\n\n/**\n * Builds a query data string from a map.\n * Currently generates \"&key&\" for empty args.\n *\n * @param {!Object<string, goog.uri.utils.QueryValue>} map An object where keys\n *     are URI-encoded parameter keys, and the values are arbitrary types\n *     or arrays. Keys with a null value are dropped.\n * @return {string} The encoded query string, in the form 'a=1&b=2'.\n */\ngoog.uri.utils.buildQueryDataFromMap = function(map) {\n  var params = [];\n  for (var key in map) {\n    goog.uri.utils.appendKeyValuePairs_(key, map[key], params);\n  }\n  return params.join('&');\n};\n\n\n/**\n * Appends URI parameters to an existing URI.\n *\n * The variable arguments may contain alternating keys and values.  Keys are\n * assumed to be already URI encoded.  The values should not be URI-encoded,\n * and will instead be encoded by this function.\n * <pre>\n * appendParams('http://www.foo.com?existing=true',\n *     'key1', 'value1',\n *     'key2', 'value?willBeEncoded',\n *     'key3', ['valueA', 'valueB', 'valueC'],\n *     'key4', null);\n * result: 'http://www.foo.com?existing=true&' +\n *     'key1=value1&' +\n *     'key2=value%3FwillBeEncoded&' +\n *     'key3=valueA&key3=valueB&key3=valueC'\n * </pre>\n *\n * A single call to this function will not exhibit quadratic behavior in IE,\n * whereas multiple repeated calls may, although the effect is limited by\n * fact that URL's generally can't exceed 2kb.\n *\n * @param {string} uri The original URI, which may already have query data.\n * @param {...(goog.uri.utils.QueryArray|goog.uri.utils.QueryValue)}\n * var_args\n *     An array or argument list conforming to goog.uri.utils.QueryArray.\n * @return {string} The URI with all query parameters added.\n */\ngoog.uri.utils.appendParams = function(uri, var_args) {\n  var queryData = arguments.length == 2 ?\n      goog.uri.utils.buildQueryData(arguments[1], 0) :\n      goog.uri.utils.buildQueryData(arguments, 1);\n  return goog.uri.utils.appendQueryDataToUri_(uri, queryData);\n};\n\n\n/**\n * Appends query parameters from a map.\n *\n * @param {string} uri The original URI, which may already have query data.\n * @param {!Object<goog.uri.utils.QueryValue>} map An object where keys are\n *     URI-encoded parameter keys, and the values are arbitrary types or arrays.\n *     Keys with a null value are dropped.\n * @return {string} The new parameters.\n */\ngoog.uri.utils.appendParamsFromMap = function(uri, map) {\n  var queryData = goog.uri.utils.buildQueryDataFromMap(map);\n  return goog.uri.utils.appendQueryDataToUri_(uri, queryData);\n};\n\n\n/**\n * Appends a single URI parameter.\n *\n * Repeated calls to this can exhibit quadratic behavior in IE6 due to the\n * way string append works, though it should be limited given the 2kb limit.\n *\n * @param {string} uri The original URI, which may already have query data.\n * @param {string} key The key, which must already be URI encoded.\n * @param {*=} opt_value The value, which will be stringized and encoded\n *     (assumed not already to be encoded).  If omitted, undefined, or null, the\n *     key will be added as a valueless parameter.\n * @return {string} The URI with the query parameter added.\n */\ngoog.uri.utils.appendParam = function(uri, key, opt_value) {\n  var value = (opt_value != null) ? '=' + goog.string.urlEncode(opt_value) : '';\n  return goog.uri.utils.appendQueryDataToUri_(uri, key + value);\n};\n\n\n/**\n * Finds the next instance of a query parameter with the specified name.\n *\n * Does not instantiate any objects.\n *\n * @param {string} uri The URI to search.  May contain a fragment identifier\n *     if opt_hashIndex is specified.\n * @param {number} startIndex The index to begin searching for the key at.  A\n *     match may be found even if this is one character after the ampersand.\n * @param {string} keyEncoded The URI-encoded key.\n * @param {number} hashOrEndIndex Index to stop looking at.  If a hash\n *     mark is present, it should be its index, otherwise it should be the\n *     length of the string.\n * @return {number} The position of the first character in the key's name,\n *     immediately after either a question mark or a dot.\n * @private\n */\ngoog.uri.utils.findParam_ = function(\n    uri, startIndex, keyEncoded, hashOrEndIndex) {\n  var index = startIndex;\n  var keyLength = keyEncoded.length;\n\n  // Search for the key itself and post-filter for surronuding punctuation,\n  // rather than expensively building a regexp.\n  while ((index = uri.indexOf(keyEncoded, index)) >= 0 &&\n         index < hashOrEndIndex) {\n    var precedingChar = uri.charCodeAt(index - 1);\n    // Ensure that the preceding character is '&' or '?'.\n    if (precedingChar == goog.uri.utils.CharCode_.AMPERSAND ||\n        precedingChar == goog.uri.utils.CharCode_.QUESTION) {\n      // Ensure the following character is '&', '=', '#', or NaN\n      // (end of string).\n      var followingChar = uri.charCodeAt(index + keyLength);\n      if (!followingChar || followingChar == goog.uri.utils.CharCode_.EQUAL ||\n          followingChar == goog.uri.utils.CharCode_.AMPERSAND ||\n          followingChar == goog.uri.utils.CharCode_.HASH) {\n        return index;\n      }\n    }\n    index += keyLength + 1;\n  }\n\n  return -1;\n};\n\n\n/**\n * Regular expression for finding a hash mark or end of string.\n * @type {RegExp}\n * @private\n */\ngoog.uri.utils.hashOrEndRe_ = /#|$/;\n\n\n/**\n * Determines if the URI contains a specific key.\n *\n * Performs no object instantiations.\n *\n * @param {string} uri The URI to process.  May contain a fragment\n *     identifier.\n * @param {string} keyEncoded The URI-encoded key.  Case-sensitive.\n * @return {boolean} Whether the key is present.\n */\ngoog.uri.utils.hasParam = function(uri, keyEncoded) {\n  return goog.uri.utils.findParam_(\n             uri, 0, keyEncoded, uri.search(goog.uri.utils.hashOrEndRe_)) >= 0;\n};\n\n\n/**\n * Gets the first value of a query parameter.\n * @param {string} uri The URI to process.  May contain a fragment.\n * @param {string} keyEncoded The URI-encoded key.  Case-sensitive.\n * @return {?string} The first value of the parameter (URI-decoded), or null\n *     if the parameter is not found.\n */\ngoog.uri.utils.getParamValue = function(uri, keyEncoded) {\n  var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_);\n  var foundIndex =\n      goog.uri.utils.findParam_(uri, 0, keyEncoded, hashOrEndIndex);\n\n  if (foundIndex < 0) {\n    return null;\n  } else {\n    var endPosition = uri.indexOf('&', foundIndex);\n    if (endPosition < 0 || endPosition > hashOrEndIndex) {\n      endPosition = hashOrEndIndex;\n    }\n    // Progress forth to the end of the \"key=\" or \"key&\" substring.\n    foundIndex += keyEncoded.length + 1;\n    // Use substr, because it (unlike substring) will return empty string\n    // if foundIndex > endPosition.\n    return goog.string.urlDecode(\n        uri.substr(foundIndex, endPosition - foundIndex));\n  }\n};\n\n\n/**\n * Gets all values of a query parameter.\n * @param {string} uri The URI to process.  May contain a fragment.\n * @param {string} keyEncoded The URI-encoded key.  Case-sensitive.\n * @return {!Array<string>} All URI-decoded values with the given key.\n *     If the key is not found, this will have length 0, but never be null.\n */\ngoog.uri.utils.getParamValues = function(uri, keyEncoded) {\n  var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_);\n  var position = 0;\n  var foundIndex;\n  var result = [];\n\n  while ((foundIndex = goog.uri.utils.findParam_(\n              uri, position, keyEncoded, hashOrEndIndex)) >= 0) {\n    // Find where this parameter ends, either the '&' or the end of the\n    // query parameters.\n    position = uri.indexOf('&', foundIndex);\n    if (position < 0 || position > hashOrEndIndex) {\n      position = hashOrEndIndex;\n    }\n\n    // Progress forth to the end of the \"key=\" or \"key&\" substring.\n    foundIndex += keyEncoded.length + 1;\n    // Use substr, because it (unlike substring) will return empty string\n    // if foundIndex > position.\n    result.push(\n        goog.string.urlDecode(uri.substr(foundIndex, position - foundIndex)));\n  }\n\n  return result;\n};\n\n\n/**\n * Regexp to find trailing question marks and ampersands.\n * @type {RegExp}\n * @private\n */\ngoog.uri.utils.trailingQueryPunctuationRe_ = /[?&]($|#)/;\n\n\n/**\n * Removes all instances of a query parameter.\n * @param {string} uri The URI to process.  Must not contain a fragment.\n * @param {string} keyEncoded The URI-encoded key.\n * @return {string} The URI with all instances of the parameter removed.\n */\ngoog.uri.utils.removeParam = function(uri, keyEncoded) {\n  var hashOrEndIndex = uri.search(goog.uri.utils.hashOrEndRe_);\n  var position = 0;\n  var foundIndex;\n  var buffer = [];\n\n  // Look for a query parameter.\n  while ((foundIndex = goog.uri.utils.findParam_(\n              uri, position, keyEncoded, hashOrEndIndex)) >= 0) {\n    // Get the portion of the query string up to, but not including, the ?\n    // or & starting the parameter.\n    buffer.push(uri.substring(position, foundIndex));\n    // Progress to immediately after the '&'.  If not found, go to the end.\n    // Avoid including the hash mark.\n    position = Math.min(\n        (uri.indexOf('&', foundIndex) + 1) || hashOrEndIndex, hashOrEndIndex);\n  }\n\n  // Append everything that is remaining.\n  buffer.push(uri.substr(position));\n\n  // Join the buffer, and remove trailing punctuation that remains.\n  return buffer.join('').replace(\n      goog.uri.utils.trailingQueryPunctuationRe_, '$1');\n};\n\n\n/**\n * Replaces all existing definitions of a parameter with a single definition.\n *\n * Repeated calls to this can exhibit quadratic behavior due to the need to\n * find existing instances and reconstruct the string, though it should be\n * limited given the 2kb limit.  Consider using appendParams or setParamsFromMap\n * to update multiple parameters in bulk.\n *\n * @param {string} uri The original URI, which may already have query data.\n * @param {string} keyEncoded The key, which must already be URI encoded.\n * @param {*} value The value, which will be stringized and encoded (assumed\n *     not already to be encoded).\n * @return {string} The URI with the query parameter added.\n */\ngoog.uri.utils.setParam = function(uri, keyEncoded, value) {\n  return goog.uri.utils.appendParam(\n      goog.uri.utils.removeParam(uri, keyEncoded), keyEncoded, value);\n};\n\n\n/**\n * Effeciently set or remove multiple query parameters in a URI. Order of\n * unchanged parameters will not be modified, all updated parameters will be\n * appended to the end of the query. Params with values of null or undefined are\n * removed.\n *\n * @param {string} uri The URI to process.\n * @param {!Object<string, goog.uri.utils.QueryValue>} params A list of\n *     parameters to update. If null or undefined, the param will be removed.\n * @return {string} An updated URI where the query data has been updated with\n *     the params.\n */\ngoog.uri.utils.setParamsFromMap = function(uri, params) {\n  var parts = goog.uri.utils.splitQueryData_(uri);\n  var queryData = parts[1];\n  var buffer = [];\n  if (queryData) {\n    goog.array.forEach(queryData.split('&'), function(pair) {\n      var indexOfEquals = pair.indexOf('=');\n      var name = indexOfEquals >= 0 ? pair.substr(0, indexOfEquals) : pair;\n      if (!params.hasOwnProperty(name)) {\n        buffer.push(pair);\n      }\n    });\n  }\n  parts[1] = goog.uri.utils.appendQueryData_(\n      buffer.join('&'), goog.uri.utils.buildQueryDataFromMap(params));\n  return goog.uri.utils.joinQueryData_(parts);\n};\n\n\n/**\n * Generates a URI path using a given URI and a path with checks to\n * prevent consecutive \"//\". The baseUri passed in must not contain\n * query or fragment identifiers. The path to append may not contain query or\n * fragment identifiers.\n *\n * @param {string} baseUri URI to use as the base.\n * @param {string} path Path to append.\n * @return {string} Updated URI.\n */\ngoog.uri.utils.appendPath = function(baseUri, path) {\n  goog.uri.utils.assertNoFragmentsOrQueries_(baseUri);\n\n  // Remove any trailing '/'\n  if (goog.string.endsWith(baseUri, '/')) {\n    baseUri = baseUri.substr(0, baseUri.length - 1);\n  }\n  // Remove any leading '/'\n  if (goog.string.startsWith(path, '/')) {\n    path = path.substr(1);\n  }\n  return goog.string.buildString(baseUri, '/', path);\n};\n\n\n/**\n * Replaces the path.\n * @param {string} uri URI to use as the base.\n * @param {string} path New path.\n * @return {string} Updated URI.\n */\ngoog.uri.utils.setPath = function(uri, path) {\n  // Add any missing '/'.\n  if (!goog.string.startsWith(path, '/')) {\n    path = '/' + path;\n  }\n  var parts = goog.uri.utils.split(uri);\n  return goog.uri.utils.buildFromEncodedParts(\n      parts[goog.uri.utils.ComponentIndex.SCHEME],\n      parts[goog.uri.utils.ComponentIndex.USER_INFO],\n      parts[goog.uri.utils.ComponentIndex.DOMAIN],\n      parts[goog.uri.utils.ComponentIndex.PORT], path,\n      parts[goog.uri.utils.ComponentIndex.QUERY_DATA],\n      parts[goog.uri.utils.ComponentIndex.FRAGMENT]);\n};\n\n\n/**\n * Standard supported query parameters.\n * @enum {string}\n */\ngoog.uri.utils.StandardQueryParam = {\n\n  /** Unused parameter for unique-ifying. */\n  RANDOM: 'zx'\n};\n\n\n/**\n * Sets the zx parameter of a URI to a random value.\n * @param {string} uri Any URI.\n * @return {string} That URI with the \"zx\" parameter added or replaced to\n *     contain a random string.\n */\ngoog.uri.utils.makeUnique = function(uri) {\n  return goog.uri.utils.setParam(\n      uri, goog.uri.utils.StandardQueryParam.RANDOM,\n      goog.string.getRandomString());\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9L","^9>","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/uri/utils.js"],"^:1",["^9K",["~$goog.uri.utils.QueryArray","^;O","~$goog.uri.utils.StandardQueryParam","~$goog.uri.utils.ComponentIndex","~$goog.uri.utils.QueryValue"]],"^9<",true,"^9=",["^9>","^;9","^:E","^9L"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.pattern.text.js","^9C",["^9D","goog/dom/pattern/text.js"],"^9E","goog/dom/pattern/text.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview DOM pattern to match a text node.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.pattern.Text');\n\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.pattern');\ngoog.require('goog.dom.pattern.AbstractPattern');\ngoog.require('goog.dom.pattern.MatchType');\n\n\n\n/**\n * Pattern object that matches text by exact matching or regular expressions.\n *\n * @param {string|RegExp} match String or regular expression to match against.\n * @constructor\n * @extends {goog.dom.pattern.AbstractPattern}\n * @final\n */\ngoog.dom.pattern.Text = function(match) {\n  /**\n   * The text or regular expression to match.\n   *\n   * @private {string|RegExp}\n   */\n  this.match_ = match;\n};\ngoog.inherits(goog.dom.pattern.Text, goog.dom.pattern.AbstractPattern);\n\n\n/**\n * Test whether the given token is a text token which matches the string or\n * regular expression provided in the constructor.\n *\n * @param {Node} token Token to match against.\n * @param {goog.dom.TagWalkType} type The type of token.\n * @return {goog.dom.pattern.MatchType} <code>MATCH</code> if the pattern\n *     matches, <code>NO_MATCH</code> otherwise.\n * @override\n */\ngoog.dom.pattern.Text.prototype.matchToken = function(token, type) {\n  if (token.nodeType == goog.dom.NodeType.TEXT &&\n      goog.dom.pattern.matchStringOrRegex(this.match_, token.nodeValue)) {\n    this.matchedNode = token;\n    return goog.dom.pattern.MatchType.MATCH;\n  }\n\n  return goog.dom.pattern.MatchType.NO_MATCH;\n};\n","^9I",1579837703000,"^9J",["^9K",["^==","^=B","^9>","^=>","^=?"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/text.js"],"^:1",["^9K",["~$goog.dom.pattern.Text"]],"^9<",true,"^9=",["^9>","^=B","^=>","^==","^=?"]],["^ ","^9A",[1579837703000],"^9B","goog.net.crossdomainrpc.js","^9C",["^9D","goog/net/crossdomainrpc.js"],"^9E","goog/net/crossdomainrpc.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Cross domain RPC library using the <a\n * href=\"http://go/xd2_design\" target=\"_top\">XD2 approach</a>.\n *\n * <h5>Protocol</h5>\n * Client sends a request across domain via a form submission.  Server\n * receives these parameters: \"xdpe:request-id\", \"xdpe:dummy-uri\" (\"xdpe\" for\n * \"cross domain parameter to echo back\") and other user parameters prefixed\n * with \"xdp\" (for \"cross domain parameter\").  Headers are passed as parameters\n * prefixed with \"xdh\" (for \"cross domain header\").  Only strings are supported\n * for parameters and headers.  A GET method is mapped to a form GET.  All\n * other methods are mapped to a POST.  Server is expected to produce a\n * HTML response such as the following:\n * <pre>\n * &lt;body&gt;\n * &lt;script type=\"text/javascript\"\n *     src=\"path-to-crossdomainrpc.js\"&gt;&lt;/script&gt;\n * var currentDirectory = location.href.substring(\n *     0, location.href.lastIndexOf('/')\n * );\n *\n * // echo all parameters prefixed with \"xdpe:\"\n * var echo = {};\n * echo[goog.net.CrossDomainRpc.PARAM_ECHO_REQUEST_ID] =\n *     &lt;value of parameter \"xdpe:request-id\"&gt;;\n * echo[goog.net.CrossDomainRpc.PARAM_ECHO_DUMMY_URI] =\n *     &lt;value of parameter \"xdpe:dummy-uri\"&gt;;\n *\n * goog.net.CrossDomainRpc.sendResponse(\n *     '({\"result\":\"&lt;responseInJSON\"})',\n *     true,    // is JSON\n *     echo,    // parameters to echo back\n *     status,  // response status code\n *     headers  // response headers\n * );\n * &lt;/script&gt;\n * &lt;/body&gt;\n * </pre>\n *\n * <h5>Server Side</h5>\n * For an example of the server side, refer to the following files:\n * <ul>\n * <li>http://go/xdservletfilter.java</li>\n * <li>http://go/xdservletrequest.java</li>\n * <li>http://go/xdservletresponse.java</li>\n * </ul>\n *\n * <h5>System Requirements</h5>\n * Tested on IE6, IE7, Firefox 2.0 and Safari nightly r23841.\n *\n */\n\ngoog.provide('goog.net.CrossDomainRpc');\n\ngoog.require('goog.Uri');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.events');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.log');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.HttpStatus');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Creates a new instance of cross domain RPC.\n *\n * @extends {goog.events.EventTarget}\n * @constructor\n * @final\n */\ngoog.net.CrossDomainRpc = function() {\n  goog.events.EventTarget.call(this);\n};\ngoog.inherits(goog.net.CrossDomainRpc, goog.events.EventTarget);\n\n\n/**\n * Cross-domain response iframe marker.\n * @type {string}\n * @private\n */\ngoog.net.CrossDomainRpc.RESPONSE_MARKER_ = 'xdrp';\n\n\n/**\n * Use a fallback dummy resource if none specified or detected.\n * @type {boolean}\n * @private\n */\ngoog.net.CrossDomainRpc.useFallBackDummyResource_ = true;\n\n\n/** @type {Object} */\ngoog.net.CrossDomainRpc.prototype.responseHeaders;\n\n\n/** @type {string} */\ngoog.net.CrossDomainRpc.prototype.responseText;\n\n\n/** @type {number} */\ngoog.net.CrossDomainRpc.prototype.status;\n\n\n/** @type {number} */\ngoog.net.CrossDomainRpc.prototype.timeWaitedAfterResponseReady_;\n\n\n/** @private {boolean} */\ngoog.net.CrossDomainRpc.prototype.responseTextIsJson_;\n\n\n/** @private {boolean} */\ngoog.net.CrossDomainRpc.prototype.responseReady_;\n\n\n/** @private {!HTMLIFrameElement} */\ngoog.net.CrossDomainRpc.prototype.requestFrame_;\n\n\n/** @private {goog.events.Key} */\ngoog.net.CrossDomainRpc.prototype.loadListenerKey_;\n\n\n/**\n * Checks to see if we are executing inside a response iframe.  This is the\n * case when this page is used as a dummy resource to gain caller's domain.\n * @return {*} True if we are executing inside a response iframe; false\n *     otherwise.\n * @private\n */\ngoog.net.CrossDomainRpc.isInResponseIframe_ = function() {\n  return window.location &&\n      (window.location.hash.indexOf(goog.net.CrossDomainRpc.RESPONSE_MARKER_) ==\n           1 ||\n       window.location.search.indexOf(\n           goog.net.CrossDomainRpc.RESPONSE_MARKER_) == 1);\n};\n\n\n/**\n * Stops execution of the rest of the page if this page is loaded inside a\n *    response iframe.\n */\nif (goog.net.CrossDomainRpc.isInResponseIframe_()) {\n  if (goog.userAgent.EDGE_OR_IE) {\n    document.execCommand('Stop');\n  } else if (goog.userAgent.GECKO) {\n    window.stop();\n  } else {\n    throw new Error('stopped');\n  }\n}\n\n\n/**\n * Sets the URI for a dummy resource on caller's domain.  This function is\n * used for specifying a particular resource to use rather than relying on\n * auto detection.\n * @param {string} dummyResourceUri URI to dummy resource on the same domain\n *    of caller's page.\n */\ngoog.net.CrossDomainRpc.setDummyResourceUri = function(dummyResourceUri) {\n  goog.net.CrossDomainRpc.dummyResourceUri_ = dummyResourceUri;\n};\n\n\n/**\n * Sets whether a fallback dummy resource (\"/robots.txt\" on Firefox and Safari\n * and current page on IE) should be used when a suitable dummy resource is\n * not available.\n * @param {boolean} useFallBack Whether to use fallback or not.\n */\ngoog.net.CrossDomainRpc.setUseFallBackDummyResource = function(useFallBack) {\n  goog.net.CrossDomainRpc.useFallBackDummyResource_ = useFallBack;\n};\n\n\n/**\n * Sends a request across domain.\n * @param {string} uri Uri to make request to.\n * @param {Function=} opt_continuation Continuation function to be called\n *     when request is completed.  Takes one argument of an event object\n *     whose target has the following properties: \"status\" is the HTTP\n *     response status code, \"responseText\" is the response text,\n *     and \"headers\" is an object with all response headers.  The event\n *     target's getResponseJson() method returns a JavaScript object evaluated\n *     from the JSON response or undefined if response is not JSON.\n * @param {string=} opt_method Method of request. Default is POST.\n * @param {Object=} opt_params Parameters. Each property is turned into a\n *     request parameter.\n * @param {Object=} opt_headers Map of headers of the request.\n */\ngoog.net.CrossDomainRpc.send = function(\n    uri, opt_continuation, opt_method, opt_params, opt_headers) {\n  var xdrpc = new goog.net.CrossDomainRpc();\n  if (opt_continuation) {\n    goog.events.listen(xdrpc, goog.net.EventType.COMPLETE, opt_continuation);\n  }\n  goog.events.listen(xdrpc, goog.net.EventType.READY, xdrpc.reset);\n  xdrpc.sendRequest(uri, opt_method, opt_params, opt_headers);\n};\n\n\n/**\n * Sets debug mode to true or false.  When debug mode is on, response iframes\n * are visible and left behind after their use is finished.\n * @param {boolean} flag Flag to indicate intention to turn debug model on\n *     (true) or off (false).\n */\ngoog.net.CrossDomainRpc.setDebugMode = function(flag) {\n  goog.net.CrossDomainRpc.debugMode_ = flag;\n};\n\n\n/**\n * Logger for goog.net.CrossDomainRpc\n * @type {goog.log.Logger}\n * @private\n */\ngoog.net.CrossDomainRpc.logger_ = goog.log.getLogger('goog.net.CrossDomainRpc');\n\n\n/**\n * Creates the HTML of an input element\n * @param {string} name Name of input element.\n * @param {*} value Value of input element.\n * @return {!goog.html.SafeHtml} HTML of input element with that name and value.\n * @private\n */\ngoog.net.CrossDomainRpc.createInputHtml_ = function(name, value) {\n  return goog.html.SafeHtml.create('textarea', {'name': name}, String(value));\n};\n\n\n/**\n * Finds a dummy resource that can be used by response to gain domain of\n * requester's page.\n * @return {string} URI of the resource to use.\n * @private\n */\ngoog.net.CrossDomainRpc.getDummyResourceUri_ = function() {\n  if (goog.net.CrossDomainRpc.dummyResourceUri_) {\n    return goog.net.CrossDomainRpc.dummyResourceUri_;\n  }\n\n  // find a style sheet if not on IE, which will attempt to save style sheet\n  if (goog.userAgent.GECKO) {\n    var links = goog.dom.getElementsByTagName(goog.dom.TagName.LINK);\n    for (var i = 0; i < links.length; i++) {\n      var link = links[i];\n      // find a link which is on the same domain as this page\n      // cannot use one with '?' or '#' in its URL as it will confuse\n      // goog.net.CrossDomainRpc.getFramePayload_()\n      if (link.rel == 'stylesheet' &&\n          goog.Uri.haveSameDomain(link.href, window.location.href) &&\n          link.href.indexOf('?') < 0) {\n        return goog.net.CrossDomainRpc.removeHash_(link.href);\n      }\n    }\n  }\n\n  var images = goog.dom.getElementsByTagName(goog.dom.TagName.IMG);\n  for (var i = 0; i < images.length; i++) {\n    var image = images[i];\n    // find a link which is on the same domain as this page\n    // cannot use one with '?' or '#' in its URL as it will confuse\n    // goog.net.CrossDomainRpc.getFramePayload_()\n    if (goog.Uri.haveSameDomain(image.src, window.location.href) &&\n        image.src.indexOf('?') < 0) {\n      return goog.net.CrossDomainRpc.removeHash_(image.src);\n    }\n  }\n\n  if (!goog.net.CrossDomainRpc.useFallBackDummyResource_) {\n    throw new Error(\n        'No suitable dummy resource specified or detected for this page');\n  }\n\n  if (goog.userAgent.EDGE_OR_IE) {\n    // use this page as the dummy resource; remove hash from URL if any\n    return goog.net.CrossDomainRpc.removeHash_(window.location.href);\n  } else {\n    /**\n     * Try to use \"http://<this-domain>/robots.txt\" which may exist.  Even if\n     * it does not, an error page is returned and is a good dummy resource to\n     * use on Firefox and Safari.  An existing resource is faster because it\n     * is cached.\n     */\n    var locationHref = window.location.href;\n    var rootSlash = locationHref.indexOf('/', locationHref.indexOf('//') + 2);\n    var rootHref = locationHref.substring(0, rootSlash);\n    return rootHref + '/robots.txt';\n  }\n};\n\n\n/**\n * Removes everything at and after hash from URI\n * @param {string} uri Uri to to remove hash.\n * @return {string} Uri with its hash and all characters after removed.\n * @private\n */\ngoog.net.CrossDomainRpc.removeHash_ = function(uri) {\n  return uri.split('#')[0];\n};\n\n\n// ------------\n// request side\n\n\n/**\n * next request id used to support multiple XD requests at the same time\n * @type {number}\n * @private\n */\ngoog.net.CrossDomainRpc.nextRequestId_ = 0;\n\n\n/**\n * Header prefix.\n * @type {string}\n */\ngoog.net.CrossDomainRpc.HEADER = 'xdh:';\n\n\n/**\n * Parameter prefix.\n * @type {string}\n */\ngoog.net.CrossDomainRpc.PARAM = 'xdp:';\n\n\n/**\n * Parameter to echo prefix.\n * @type {string}\n */\ngoog.net.CrossDomainRpc.PARAM_ECHO = 'xdpe:';\n\n\n/**\n * Parameter to echo: request id\n * @type {string}\n */\ngoog.net.CrossDomainRpc.PARAM_ECHO_REQUEST_ID =\n    goog.net.CrossDomainRpc.PARAM_ECHO + 'request-id';\n\n\n/**\n * Parameter to echo: dummy resource URI\n * @type {string}\n */\ngoog.net.CrossDomainRpc.PARAM_ECHO_DUMMY_URI =\n    goog.net.CrossDomainRpc.PARAM_ECHO + 'dummy-uri';\n\n\n/**\n * Cross-domain request marker.\n * @type {string}\n * @private\n */\ngoog.net.CrossDomainRpc.REQUEST_MARKER_ = 'xdrq';\n\n\n/**\n * Sends a request across domain.\n * @param {string} uri Uri to make request to.\n * @param {string=} opt_method Method of request, 'GET' or 'POST' (uppercase).\n *     Default is 'POST'.\n * @param {Object=} opt_params Parameters. Each property is turned into a\n *     request parameter.\n * @param {Object=} opt_headers Map of headers of the request.\n */\ngoog.net.CrossDomainRpc.prototype.sendRequest = function(\n    uri, opt_method, opt_params, opt_headers) {\n  // create request frame\n  var requestFrame = this.requestFrame_ =\n      goog.dom.createElement(goog.dom.TagName.IFRAME);\n  var requestId = goog.net.CrossDomainRpc.nextRequestId_++;\n  requestFrame.id = goog.net.CrossDomainRpc.REQUEST_MARKER_ + '-' + requestId;\n  if (!goog.net.CrossDomainRpc.debugMode_) {\n    requestFrame.style.position = 'absolute';\n    requestFrame.style.top = '-5000px';\n    requestFrame.style.left = '-5000px';\n  }\n  document.body.appendChild(requestFrame);\n\n  // build inputs\n  var inputs = [];\n\n  // add request id\n  inputs.push(\n      goog.net.CrossDomainRpc.createInputHtml_(\n          goog.net.CrossDomainRpc.PARAM_ECHO_REQUEST_ID, requestId));\n\n  // add dummy resource uri\n  var dummyUri = goog.net.CrossDomainRpc.getDummyResourceUri_();\n  goog.log.fine(goog.net.CrossDomainRpc.logger_, 'dummyUri: ' + dummyUri);\n  inputs.push(\n      goog.net.CrossDomainRpc.createInputHtml_(\n          goog.net.CrossDomainRpc.PARAM_ECHO_DUMMY_URI, dummyUri));\n\n  // add parameters\n  if (opt_params) {\n    for (var name in opt_params) {\n      var value = opt_params[name];\n      inputs.push(\n          goog.net.CrossDomainRpc.createInputHtml_(\n              goog.net.CrossDomainRpc.PARAM + name, value));\n    }\n  }\n\n  // add headers\n  if (opt_headers) {\n    for (var name in opt_headers) {\n      var value = opt_headers[name];\n      inputs.push(\n          goog.net.CrossDomainRpc.createInputHtml_(\n              goog.net.CrossDomainRpc.HEADER + name, value));\n    }\n  }\n\n  var requestFrameContentHtml = goog.html.SafeHtml.create(\n      'body', {},\n      goog.html.SafeHtml.create(\n          'form',\n          {'method': opt_method == 'GET' ? 'GET' : 'POST', 'action': uri},\n          inputs));\n  var requestFrameDoc = goog.dom.getFrameContentDocument(requestFrame);\n  requestFrameDoc.open();\n  goog.dom.safe.documentWrite(requestFrameDoc, requestFrameContentHtml);\n  requestFrameDoc.close();\n\n  requestFrameDoc.forms[0].submit();\n  requestFrameDoc = null;\n\n  this.loadListenerKey_ =\n      goog.events.listen(requestFrame, goog.events.EventType.LOAD, function() {\n        goog.log.fine(goog.net.CrossDomainRpc.logger_, 'response ready');\n        this.responseReady_ = true;\n      }, false, this);\n\n  this.receiveResponse_();\n};\n\n\n/**\n * period of response polling (ms)\n * @type {number}\n * @private\n */\ngoog.net.CrossDomainRpc.RESPONSE_POLLING_PERIOD_ = 50;\n\n\n/**\n * timeout from response comes back to sendResponse is called (ms)\n * @type {number}\n * @private\n */\ngoog.net.CrossDomainRpc.SEND_RESPONSE_TIME_OUT_ = 500;\n\n\n/**\n * Receives response by polling to check readiness of response and then\n *     reads response frames and assembles response data\n * @private\n */\ngoog.net.CrossDomainRpc.prototype.receiveResponse_ = function() {\n  this.timeWaitedAfterResponseReady_ = 0;\n  var responseDetectorHandle = window.setInterval(goog.bind(function() {\n    this.detectResponse_(responseDetectorHandle);\n  }, this), goog.net.CrossDomainRpc.RESPONSE_POLLING_PERIOD_);\n};\n\n\n/**\n * Detects response inside request frame\n * @param {number} responseDetectorHandle Handle of detector.\n * @private\n */\ngoog.net.CrossDomainRpc.prototype.detectResponse_ = function(\n    responseDetectorHandle) {\n  var requestFrameWindow = this.requestFrame_.contentWindow;\n  var grandChildrenLength = requestFrameWindow.frames.length;\n  var responseInfoFrame = null;\n  if (grandChildrenLength > 0 &&\n      goog.net.CrossDomainRpc.isResponseInfoFrame_(\n          responseInfoFrame =\n              requestFrameWindow.frames[grandChildrenLength - 1])) {\n    goog.log.fine(goog.net.CrossDomainRpc.logger_, 'xd response ready');\n\n    var responseInfoPayload =\n        goog.net.CrossDomainRpc.getFramePayload_(responseInfoFrame)\n            .substring(1);\n    var params = new goog.Uri.QueryData(responseInfoPayload);\n\n    var chunks = [];\n    var numChunks = Number(params.get('n'));\n    goog.log.fine(\n        goog.net.CrossDomainRpc.logger_,\n        'xd response number of chunks: ' + numChunks);\n    for (var i = 0; i < numChunks; i++) {\n      var responseFrame = requestFrameWindow.frames[i];\n      if (!responseFrame || !responseFrame.location ||\n          !responseFrame.location.href) {\n        // On Safari 3.0, it is sometimes the case that the\n        // iframe exists but doesn't have a same domain href yet.\n        goog.log.fine(\n            goog.net.CrossDomainRpc.logger_, 'xd response iframe not ready');\n        return;\n      }\n      var responseChunkPayload =\n          goog.net.CrossDomainRpc.getFramePayload_(responseFrame);\n      // go past \"chunk=\"\n      var chunkIndex =\n          responseChunkPayload.indexOf(goog.net.CrossDomainRpc.PARAM_CHUNK_) +\n          goog.net.CrossDomainRpc.PARAM_CHUNK_.length + 1;\n      var chunk = responseChunkPayload.substring(chunkIndex);\n      chunks.push(chunk);\n    }\n\n    window.clearInterval(responseDetectorHandle);\n\n    var responseData = chunks.join('');\n    // Payload is not encoded to begin with on IE. Decode in other cases only.\n    if (!goog.userAgent.EDGE_OR_IE) {\n      responseData = decodeURIComponent(responseData);\n    }\n\n    this.status = Number(params.get('status'));\n    this.responseText = responseData;\n    this.responseTextIsJson_ = params.get('isDataJson') == 'true';\n    this.responseHeaders = /** @type {?Object} */ (JSON.parse(\n        /** @type {string} */ (params.get('headers'))));\n\n    this.dispatchEvent(goog.net.EventType.READY);\n    this.dispatchEvent(goog.net.EventType.COMPLETE);\n  } else {\n    if (this.responseReady_) {\n      /* The response has come back. But the first response iframe has not\n       * been created yet. If this lasts long enough, it is an error.\n       */\n      this.timeWaitedAfterResponseReady_ +=\n          goog.net.CrossDomainRpc.RESPONSE_POLLING_PERIOD_;\n      if (this.timeWaitedAfterResponseReady_ >\n          goog.net.CrossDomainRpc.SEND_RESPONSE_TIME_OUT_) {\n        goog.log.fine(goog.net.CrossDomainRpc.logger_, 'xd response timed out');\n        window.clearInterval(responseDetectorHandle);\n\n        this.status = goog.net.HttpStatus.INTERNAL_SERVER_ERROR;\n        this.responseText = 'response timed out';\n\n        this.dispatchEvent(goog.net.EventType.READY);\n        this.dispatchEvent(goog.net.EventType.ERROR);\n        this.dispatchEvent(goog.net.EventType.COMPLETE);\n      }\n    }\n  }\n};\n\n\n/**\n * Checks whether a frame is response info frame.\n * @param {Object} frame Frame to check.\n * @return {boolean} True if frame is a response info frame; false otherwise.\n * @private\n */\ngoog.net.CrossDomainRpc.isResponseInfoFrame_ = function(frame) {\n\n  try {\n    return goog.net.CrossDomainRpc.getFramePayload_(frame).indexOf(\n               goog.net.CrossDomainRpc.RESPONSE_INFO_MARKER_) == 1;\n  } catch (e) {\n    // frame not ready for same-domain access yet\n    return false;\n  }\n};\n\n\n/**\n * Returns the payload of a frame (value after # or ? on the URL).  This value\n * is URL encoded except IE, where the value is not encoded to begin with.\n * @param {Object} frame Frame.\n * @return {string} Payload of that frame.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.net.CrossDomainRpc.getFramePayload_ = function(frame) {\n  var href = frame.location.href;\n  var question = href.indexOf('?');\n  var hash = href.indexOf('#');\n  // On IE, beucase the URL is not encoded, we can have a case where ?\n  // is the delimiter before payload and # in payload or # as the delimiter\n  // and ? in payload.  So here we treat whoever is the first as the delimiter.\n  var delimiter =\n      question < 0 ? hash : hash < 0 ? question : Math.min(question, hash);\n  return href.substring(delimiter);\n};\n\n\n/**\n * If response is JSON, evaluates it to a JavaScript object and\n * returns it; otherwise returns undefined.\n * @return {Object|undefined} JavaScript object if response is in JSON\n *     or undefined.\n */\ngoog.net.CrossDomainRpc.prototype.getResponseJson = function() {\n  return this.responseTextIsJson_ ?\n      /** @type {?Object} */ (JSON.parse(this.responseText)) :\n      undefined;\n};\n\n\n/**\n * @return {boolean} Whether the request completed with a success.\n */\ngoog.net.CrossDomainRpc.prototype.isSuccess = function() {\n  // Definition similar to goog.net.XhrIo.prototype.isSuccess.\n  switch (this.status) {\n    case goog.net.HttpStatus.OK:\n    case goog.net.HttpStatus.NOT_MODIFIED:\n      return true;\n\n    default:\n      return false;\n  }\n};\n\n\n/**\n * Removes request iframe used.\n */\ngoog.net.CrossDomainRpc.prototype.reset = function() {\n  if (!goog.net.CrossDomainRpc.debugMode_) {\n    goog.log.fine(\n        goog.net.CrossDomainRpc.logger_,\n        'request frame removed: ' + this.requestFrame_.id);\n    goog.events.unlistenByKey(this.loadListenerKey_);\n    this.requestFrame_.parentNode.removeChild(this.requestFrame_);\n  }\n  delete this.requestFrame_;\n};\n\n\n// -------------\n// response side\n\n\n/**\n * Name of response info iframe.\n * @type {string}\n * @private\n */\ngoog.net.CrossDomainRpc.RESPONSE_INFO_MARKER_ =\n    goog.net.CrossDomainRpc.RESPONSE_MARKER_ + '-info';\n\n\n/**\n * Maximal chunk size.  IE can only handle 4095 bytes on its URL.\n * 16MB has been tested on Firefox.  But 1MB is a practical size.\n * @type {number}\n * @private\n */\ngoog.net.CrossDomainRpc.MAX_CHUNK_SIZE_ =\n    goog.userAgent.EDGE_OR_IE ? 4095 : 1024 * 1024;\n\n\n/**\n * Query parameter 'chunk'.\n * @type {string}\n * @private\n */\ngoog.net.CrossDomainRpc.PARAM_CHUNK_ = 'chunk';\n\n\n/**\n * Prefix before data chunk for passing other parameters.\n * type String\n * @private\n */\ngoog.net.CrossDomainRpc.CHUNK_PREFIX_ =\n    goog.net.CrossDomainRpc.RESPONSE_MARKER_ + '=1&' +\n    goog.net.CrossDomainRpc.PARAM_CHUNK_ + '=';\n\n\n/**\n * Makes response available for grandparent (requester)'s receiveResponse\n * call to pick up by creating a series of iframes pointed to the dummy URI\n * with a payload (value after either ? or #) carrying a chunk of response\n * data and a response info iframe that tells the grandparent (requester) the\n * readiness of response.\n * @param {string} data Response data (string or JSON string).\n * @param {boolean} isDataJson true if data is a JSON string; false if just a\n *     string.\n * @param {Object} echo Parameters to echo back\n *     \"xdpe:request-id\": Server that produces the response needs to\n *     copy it here to support multiple current XD requests on the same page.\n *     \"xdpe:dummy-uri\": URI to a dummy resource that response\n *     iframes point to to gain the domain of the client.  This can be an\n *     image (IE) or a CSS file (FF) found on the requester's page.\n *     Server should copy value from request parameter \"xdpe:dummy-uri\".\n * @param {number} status HTTP response status code.\n * @param {string} headers Response headers in JSON format.\n */\ngoog.net.CrossDomainRpc.sendResponse = function(\n    data, isDataJson, echo, status, headers) {\n  var dummyUri = echo[goog.net.CrossDomainRpc.PARAM_ECHO_DUMMY_URI];\n\n  // since the dummy-uri can be specified by the user, verify that it doesn't\n  // use any other protocols. (Specifically we don't want users to use a\n  // dummy-uri beginning with \"javascript:\").\n  if (!goog.string.caseInsensitiveStartsWith(dummyUri, 'http://') &&\n      !goog.string.caseInsensitiveStartsWith(dummyUri, 'https://')) {\n    dummyUri = 'http://' + dummyUri;\n  }\n\n  // usable chunk size is max less dummy URI less chunk prefix length\n  // TODO(user): Figure out why we need to do \"- 1\" below\n  var chunkSize = goog.net.CrossDomainRpc.MAX_CHUNK_SIZE_ - dummyUri.length -\n      1 -  // payload delimiter ('#' or '?')\n      goog.net.CrossDomainRpc.CHUNK_PREFIX_.length - 1;\n\n  /*\n   * Here we used to do URI encoding of data before we divide it into chunks\n   * and decode on the receiving end.  We don't do this any more on IE for the\n   * following reasons.\n   *\n   * 1) On IE, calling decodeURIComponent on a relatively large string is\n   *   extremely slow (~22s for 160KB).  So even a moderate amount of data\n   *   makes this library pretty much useless.  Fortunately, we can actually\n   *   put unencoded data on IE's URL and get it back reliably.  So we are\n   *   completely skipping encoding and decoding on IE.  When we call\n   *   getFrameHash_ to get it back, the value is still intact(*) and unencoded.\n   * 2) On Firefox, we have to call decodeURIComponent because location.hash\n   *   does decoding by itself.  Fortunately, decodeURIComponent is not slow\n   *   on Firefox.\n   * 3) Safari automatically encodes everything you put on URL and it does not\n   *   automatically decode when you access it via location.hash or\n   *   location.href.  So we encode it here and decode it in detectResponse_().\n   *\n   * Note(*): IE actually does encode only space to %20 and decodes that\n   *   automatically when you do location.href or location.hash.\n   */\n  if (!goog.userAgent.EDGE_OR_IE) {\n    data = encodeURIComponent(data);\n  }\n\n  var numChunksToSend = Math.ceil(data.length / chunkSize);\n  if (numChunksToSend == 0) {\n    goog.net.CrossDomainRpc.createResponseInfo_(\n        dummyUri, numChunksToSend, isDataJson, status, headers);\n  } else {\n    var numChunksSent = 0;\n    var checkToCreateResponseInfo_ = function() {\n      if (++numChunksSent == numChunksToSend) {\n        goog.net.CrossDomainRpc.createResponseInfo_(\n            dummyUri, numChunksToSend, isDataJson, status, headers);\n      }\n    };\n\n    for (var i = 0; i < numChunksToSend; i++) {\n      var chunkStart = i * chunkSize;\n      var chunkEnd = chunkStart + chunkSize;\n      var chunk = chunkEnd > data.length ? data.substring(chunkStart) :\n                                           data.substring(chunkStart, chunkEnd);\n\n      var responseFrame = goog.dom.createElement(goog.dom.TagName.IFRAME);\n      responseFrame.src = dummyUri +\n          goog.net.CrossDomainRpc.getPayloadDelimiter_(dummyUri) +\n          goog.net.CrossDomainRpc.CHUNK_PREFIX_ + chunk;\n      document.body.appendChild(responseFrame);\n\n      // We used to call the function below when handling load event of\n      // responseFrame.  But that event does not fire on IE when current\n      // page is used as the dummy resource (because its loading is stopped?).\n      // It also does not fire sometimes on Firefox.  So now we call it\n      // directly.\n      checkToCreateResponseInfo_();\n    }\n  }\n};\n\n\n/**\n * Creates a response info iframe to indicate completion of sendResponse\n * @param {string} dummyUri URI to a dummy resource.\n * @param {number} numChunks Total number of chunks.\n * @param {boolean} isDataJson Whether response is a JSON string or just string.\n * @param {number} status HTTP response status code.\n * @param {string} headers Response headers in JSON format.\n * @private\n */\ngoog.net.CrossDomainRpc.createResponseInfo_ = function(\n    dummyUri, numChunks, isDataJson, status, headers) {\n  var responseInfoFrame = goog.dom.createElement(goog.dom.TagName.IFRAME);\n  document.body.appendChild(responseInfoFrame);\n  responseInfoFrame.src = dummyUri +\n      goog.net.CrossDomainRpc.getPayloadDelimiter_(dummyUri) +\n      goog.net.CrossDomainRpc.RESPONSE_INFO_MARKER_ + '=1&n=' + numChunks +\n      '&isDataJson=' + isDataJson + '&status=' + status + '&headers=' +\n      encodeURIComponent(headers);\n};\n\n\n/**\n * Returns payload delimiter, either \"#\" when caller's page is not used as\n * the dummy resource or \"?\" when it is, in which case caching issues prevent\n * response frames to gain the caller's domain.\n * @param {string} dummyUri URI to resource being used as dummy resource.\n * @return {string} Either \"?\" when caller's page is used as dummy resource or\n *     \"#\" if it is not.\n * @private\n */\ngoog.net.CrossDomainRpc.getPayloadDelimiter_ = function(dummyUri) {\n  return goog.net.CrossDomainRpc.REFERRER_ == dummyUri ? '?' : '#';\n};\n\n\n/**\n * Removes all parameters (after ? or #) from URI.\n * @param {string} uri URI to remove parameters from.\n * @return {string} URI with all parameters removed.\n * @private\n */\ngoog.net.CrossDomainRpc.removeUriParams_ = function(uri) {\n  // remove everything after question mark\n  var question = uri.indexOf('?');\n  if (question > 0) {\n    uri = uri.substring(0, question);\n  }\n\n  // remove everything after hash mark\n  var hash = uri.indexOf('#');\n  if (hash > 0) {\n    uri = uri.substring(0, hash);\n  }\n\n  return uri;\n};\n\n\n/**\n * Gets a response header.\n * @param {string} name Name of response header.\n * @return {string|undefined} Value of response header; undefined if not found.\n */\ngoog.net.CrossDomainRpc.prototype.getResponseHeader = function(name) {\n  return goog.isObject(this.responseHeaders) ? this.responseHeaders[name] :\n                                               undefined;\n};\n\n\n/**\n * Referrer of current document with all parameters after \"?\" and \"#\" stripped.\n * @type {string}\n * @private\n */\ngoog.net.CrossDomainRpc.REFERRER_ =\n    goog.net.CrossDomainRpc.removeUriParams_(document.referrer);\n","^9I",1579837703000,"^9J",["^9K",["^;;","^=Z","^9L","^<S","^9>","^:L","^:S","^;Q","^>0","^:I","^@B","^:N","^@C","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/crossdomainrpc.js"],"^:1",["^9K",["~$goog.net.CrossDomainRpc"]],"^9<",true,"^9=",["^9>","^<S","^;;","^;=","^@B","^:N","^:L","^:I","^@C","^;Q","^>0","^=Z","^9L","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.mock.js","^9C",["^9D","goog/testing/mock.js"],"^9E","goog/testing/mock.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This file defines base classes used for creating mocks in\n * JavaScript. The API was inspired by EasyMock.\n *\n * The basic API is:\n * <ul>\n *   <li>Create an object to be mocked\n *   <li>Create a mock object, passing in the above object to the constructor\n *   <li>Set expectations by calling methods on the mock object\n *   <li>Call $replay() on the mock object\n *   <li>Pass the mock to code that will make real calls on it\n *   <li>Call $verify() to make sure that expectations were met\n * </ul>\n *\n * For examples, please see the unit tests for LooseMock and StrictMock.\n *\n * Still TODO\n *   implement better (and pluggable) argument matching\n *   Have the exceptions for LooseMock show the number of expected/actual calls\n *   loose and strict mocks share a lot of code - move it to the base class\n *\n */\n\ngoog.setTestOnly('goog.testing.Mock');\ngoog.provide('goog.testing.Mock');\ngoog.provide('goog.testing.MockExpectation');\n\ngoog.require('goog.Promise');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.object');\ngoog.require('goog.promise.Resolver');\ngoog.require('goog.testing.JsUnitException');\ngoog.require('goog.testing.MockInterface');\ngoog.require('goog.testing.mockmatchers');\n\n\n\n/**\n * This is a class that represents an expectation.\n * @param {string} name The name of the method for this expectation.\n * @constructor\n * @final\n */\ngoog.testing.MockExpectation = function(name) {\n  /**\n   * The name of the method that is expected to be called.\n   * @type {string}\n   */\n  this.name = name;\n\n  /**\n   * An array of error messages for expectations not met.\n   * @type {Array<string>}\n   */\n  this.errorMessages = [];\n};\n\n\n/**\n * The minimum number of times this method should be called.\n * @type {number}\n */\ngoog.testing.MockExpectation.prototype.minCalls = 1;\n\n\n/**\n  * The maximum number of times this method should be called.\n  * @type {number}\n  */\ngoog.testing.MockExpectation.prototype.maxCalls = 1;\n\n\n/**\n * The value that this method should return.\n * @type {*}\n */\ngoog.testing.MockExpectation.prototype.returnValue;\n\n\n/**\n * The value that will be thrown when the method is called\n * @type {*}\n */\ngoog.testing.MockExpectation.prototype.exceptionToThrow;\n\n\n/**\n * The arguments that are expected to be passed to this function\n * @type {Array<*>}\n */\ngoog.testing.MockExpectation.prototype.argumentList;\n\n\n/**\n * The number of times this method is called by real code.\n * @type {number}\n */\ngoog.testing.MockExpectation.prototype.actualCalls = 0;\n\n\n/**\n * The number of times this method is called during the verification phase.\n * @type {number}\n */\ngoog.testing.MockExpectation.prototype.verificationCalls = 0;\n\n\n/**\n * The function which will be executed when this method is called.\n * Method arguments will be passed to this function, and return value\n * of this function will be returned by the method.\n * @type {Function}\n */\ngoog.testing.MockExpectation.prototype.toDo;\n\n\n/**\n * Allow expectation failures to include messages.\n * @param {string} message The failure message.\n */\ngoog.testing.MockExpectation.prototype.addErrorMessage = function(message) {\n  this.errorMessages.push(message);\n};\n\n\n/**\n * Get the error messages seen so far.\n * @return {string} Error messages separated by \\n.\n */\ngoog.testing.MockExpectation.prototype.getErrorMessage = function() {\n  return this.errorMessages.join('\\n');\n};\n\n\n/**\n * Get how many error messages have been seen so far.\n * @return {number} Count of error messages.\n */\ngoog.testing.MockExpectation.prototype.getErrorMessageCount = function() {\n  return this.errorMessages.length;\n};\n\n\n\n/**\n * The base class for a mock object.\n * @param {Object|Function} objectToMock The object that should be mocked, or\n *    the constructor of an object to mock.\n * @param {boolean=} opt_mockStaticMethods An optional argument denoting that\n *     a mock should be constructed from the static functions of a class.\n * @param {boolean=} opt_createProxy An optional argument denoting that\n *     a proxy for the target mock should be created.\n * @constructor\n * @implements {goog.testing.MockInterface}\n */\ngoog.testing.Mock = function(\n    objectToMock, opt_mockStaticMethods, opt_createProxy) {\n  if (!goog.isObject(objectToMock) && !goog.isFunction(objectToMock)) {\n    throw new Error('objectToMock must be an object or constructor.');\n  }\n  if (opt_createProxy && !opt_mockStaticMethods &&\n      goog.isFunction(objectToMock)) {\n    /**\n * @constructor\n * @final\n */\n    var tempCtor = function() {};\n    goog.inherits(tempCtor, objectToMock);\n    this.$proxy = new tempCtor();\n  } else if (\n      opt_createProxy && opt_mockStaticMethods &&\n      goog.isFunction(objectToMock)) {\n    throw new Error('Cannot create a proxy when opt_mockStaticMethods is true');\n  } else if (opt_createProxy && !goog.isFunction(objectToMock)) {\n    throw new Error('Must have a constructor to create a proxy');\n  }\n\n  if (goog.isFunction(objectToMock) && !opt_mockStaticMethods) {\n    this.$initializeFunctions_(objectToMock.prototype);\n  } else {\n    this.$initializeFunctions_(objectToMock);\n  }\n  this.$argumentListVerifiers_ = {};\n\n  /** @protected {?goog.promise.Resolver<undefined>} */\n  this.waitingForExpectations = null;\n};\n\n\n/**\n * Option that may be passed when constructing function, method, and\n * constructor mocks. Indicates that the expected calls should be accepted in\n * any order.\n * @const\n * @type {number}\n */\ngoog.testing.Mock.LOOSE = 1;\n\n\n/**\n * Option that may be passed when constructing function, method, and\n * constructor mocks. Indicates that the expected calls should be accepted in\n * the recorded order only.\n * @const\n * @type {number}\n */\ngoog.testing.Mock.STRICT = 0;\n\n\n/**\n * Asserts that a mock object is in record mode.  This avoids type system errors\n * from mock expectations.\n *\n * Usage:\n *\n * ```\n * const record = goog.require('goog.testing.Mock.record');\n *\n * record(mockObject).someMethod(ignoreArgument).$returns(42);\n * record(mockFunction)(ignoreArgument).$returns(42);\n * ```\n *\n * @param {?} obj A mock in record mode.\n * @return {?} The same object.\n */\ngoog.testing.Mock.record = function(obj) {\n  goog.asserts.assert(\n      obj.$recording_ !== undefined,\n      obj + ' is not a mock.  Did you pass a real object to record()?');\n  goog.asserts.assert(\n      obj.$recording_,\n      'Your mock is in replay mode.  You can only call record(mock) before mock.$replay()');\n  return obj;\n};\n\n\n/**\n * This array contains the name of the functions that are part of the base\n * Object prototype.\n * Basically a copy of goog.object.PROTOTYPE_FIELDS_.\n * @const\n * @type {!Array<string>}\n * @private\n */\ngoog.testing.Mock.OBJECT_PROTOTYPE_FIELDS_ = [\n  'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',\n  'toLocaleString', 'toString', 'valueOf'\n];\n\n\n/**\n * This array contains the name of the functions that are part of the base\n * Function prototype. The restricted field 'caller' and 'arguments' are\n * excluded.\n * @const\n * @type {!Array<string>}\n * @private\n */\ngoog.testing.Mock.FUNCTION_PROTOTYPE_FIELDS_ = ['apply', 'bind', 'call'];\n\n\n/**\n * A proxy for the mock.  This can be used for dependency injection in lieu of\n * the mock if the test requires a strict instanceof check.\n * @type {?Object}\n */\ngoog.testing.Mock.prototype.$proxy = null;\n\n\n/**\n * Map of argument name to optional argument list verifier function.\n * @type {Object}\n */\ngoog.testing.Mock.prototype.$argumentListVerifiers_;\n\n\n/**\n * Whether or not we are in recording mode.\n * @type {boolean}\n * @private\n */\ngoog.testing.Mock.prototype.$recording_ = true;\n\n\n/**\n * The expectation currently being created. All methods that modify the\n * current expectation return the Mock object for easy chaining, so this is\n * where we keep track of the expectation that's currently being modified.\n * @type {goog.testing.MockExpectation}\n * @protected\n */\ngoog.testing.Mock.prototype.$pendingExpectation;\n\n\n/**\n * First exception thrown by this mock; used in $verify.\n * @type {?Object}\n * @private\n */\ngoog.testing.Mock.prototype.$threwException_ = null;\n\n\n/**\n * Initializes the functions on the mock object.\n * @param {Object} objectToMock The object being mocked.\n * @private\n */\ngoog.testing.Mock.prototype.$initializeFunctions_ = function(objectToMock) {\n  // Gets the object properties.\n  var enumerableProperties = goog.object.getAllPropertyNames(\n      objectToMock, false /* opt_includeObjectPrototype */,\n      false /* opt_includeFunctionPrototype */);\n\n  if (goog.isFunction(objectToMock)) {\n    for (var i = 0; i < goog.testing.Mock.FUNCTION_PROTOTYPE_FIELDS_.length;\n         i++) {\n      var prop = goog.testing.Mock.FUNCTION_PROTOTYPE_FIELDS_[i];\n      // Look at b/6758711 if you're considering adding ALL properties to ALL\n      // mocks.\n      if (objectToMock[prop] !== Function.prototype[prop]) {\n        enumerableProperties.push(prop);\n      }\n    }\n  }\n\n  // The non enumerable properties are added if they override the ones in the\n  // Object prototype. This is due to the fact that IE8 does not enumerate any\n  // of the prototype Object functions even when overridden and mocking these is\n  // sometimes needed.\n  for (var i = 0; i < goog.testing.Mock.OBJECT_PROTOTYPE_FIELDS_.length; i++) {\n    var prop = goog.testing.Mock.OBJECT_PROTOTYPE_FIELDS_[i];\n    // Look at b/6758711 if you're considering adding ALL properties to ALL\n    // mocks.\n    if (objectToMock[prop] !== Object.prototype[prop]) {\n      enumerableProperties.push(prop);\n    }\n  }\n\n  // Adds the properties to the mock.\n  for (var i = 0; i < enumerableProperties.length; i++) {\n    var prop = enumerableProperties[i];\n    if (typeof objectToMock[prop] == 'function') {\n      this[prop] = goog.bind(this.$mockMethod, this, prop);\n      if (this.$proxy) {\n        this.$proxy[prop] = goog.bind(this.$mockMethod, this, prop);\n      }\n    }\n  }\n};\n\n\n/**\n * Registers a verifier function to use when verifying method argument lists.\n * @param {string} methodName The name of the method for which the verifierFn\n *     should be used.\n * @param {Function} fn Argument list verifier function.  Should take 2 argument\n *     arrays as arguments, and return true if they are considered equivalent.\n * @return {!goog.testing.Mock} This mock object.\n */\ngoog.testing.Mock.prototype.$registerArgumentListVerifier = function(\n    methodName, fn) {\n  this.$argumentListVerifiers_[methodName] = fn;\n  return this;\n};\n\n\n/**\n * The function that replaces all methods on the mock object.\n * @param {string} name The name of the method being mocked.\n * @return {*} In record mode, returns the mock object. In replay mode, returns\n *    whatever the creator of the mock set as the return value.\n */\ngoog.testing.Mock.prototype.$mockMethod = function(name) {\n  try {\n    // Shift off the name argument so that args contains the arguments to\n    // the mocked method.\n    var args = goog.array.slice(arguments, 1);\n    if (this.$recording_) {\n      this.$pendingExpectation = new goog.testing.MockExpectation(name);\n      this.$pendingExpectation.argumentList = args;\n      this.$recordExpectation();\n      return this;\n    } else {\n      return this.$recordCall(name, args);\n    }\n  } catch (ex) {\n    this.$recordAndThrow(ex, true /* rethrow */);\n  }\n};\n\n\n/**\n * Records the currently pending expectation, intended to be overridden by a\n * subclass.\n * @protected\n */\ngoog.testing.Mock.prototype.$recordExpectation = function() {};\n\n\n/**\n * Records an actual method call, intended to be overridden by a\n * subclass. The subclass must find the pending expectation and return the\n * correct value.\n * @param {string} name The name of the method being called.\n * @param {Array<?>} args The arguments to the method.\n * @return {*} The return expected by the mock.\n * @protected\n */\ngoog.testing.Mock.prototype.$recordCall = function(name, args) {\n  return undefined;\n};\n\n\n/**\n * If the expectation expects to throw, this method will throw.\n * @param {goog.testing.MockExpectation} expectation The expectation.\n */\ngoog.testing.Mock.prototype.$maybeThrow = function(expectation) {\n  if (typeof expectation.exceptionToThrow != 'undefined') {\n    throw expectation.exceptionToThrow;\n  }\n};\n\n\n/**\n * If this expectation defines a function to be called,\n * it will be called and its result will be returned.\n * Otherwise, if the expectation expects to throw, it will throw.\n * Otherwise, this method will return defined value.\n * @param {goog.testing.MockExpectation} expectation The expectation.\n * @param {Array<?>} args The arguments to the method.\n * @return {*} The return value expected by the mock.\n */\ngoog.testing.Mock.prototype.$do = function(expectation, args) {\n  if (typeof expectation.toDo == 'undefined') {\n    this.$maybeThrow(expectation);\n    return expectation.returnValue;\n  } else {\n    return expectation.toDo.apply(this, args);\n  }\n};\n\n\n/**\n * Specifies a return value for the currently pending expectation.\n * @param {*} val The return value.\n * @return {!goog.testing.Mock} This mock object.\n */\ngoog.testing.Mock.prototype.$returns = function(val) {\n  this.$pendingExpectation.returnValue = val;\n  return this;\n};\n\n\n/**\n * Specifies a value for the currently pending expectation to throw.\n * @param {*} val The value to throw.\n * @return {!goog.testing.Mock} This mock object.\n */\ngoog.testing.Mock.prototype.$throws = function(val) {\n  this.$pendingExpectation.exceptionToThrow = val;\n  return this;\n};\n\n\n/**\n * Specifies a function to call for currently pending expectation.\n * Note, that using this method overrides declarations made\n * using $returns() and $throws() methods.\n * @param {Function} func The function to call.\n * @return {!goog.testing.Mock} This mock object.\n */\ngoog.testing.Mock.prototype.$does = function(func) {\n  this.$pendingExpectation.toDo = func;\n  return this;\n};\n\n\n/**\n * Allows the expectation to be called 0 or 1 times.\n * @return {!goog.testing.Mock} This mock object.\n */\ngoog.testing.Mock.prototype.$atMostOnce = function() {\n  this.$pendingExpectation.minCalls = 0;\n  this.$pendingExpectation.maxCalls = 1;\n  return this;\n};\n\n\n/**\n * Allows the expectation to be called any number of times, as long as it's\n * called once.\n * @return {!goog.testing.Mock} This mock object.\n */\ngoog.testing.Mock.prototype.$atLeastOnce = function() {\n  this.$pendingExpectation.maxCalls = Infinity;\n  return this;\n};\n\n\n/**\n * Allows the expectation to be called exactly once.\n * @return {!goog.testing.Mock} This mock object.\n */\ngoog.testing.Mock.prototype.$once = function() {\n  this.$pendingExpectation.minCalls = 1;\n  this.$pendingExpectation.maxCalls = 1;\n  return this;\n};\n\n\n/**\n * Disallows the expectation from being called.\n * @return {!goog.testing.Mock} This mock object.\n */\ngoog.testing.Mock.prototype.$never = function() {\n  this.$pendingExpectation.minCalls = 0;\n  this.$pendingExpectation.maxCalls = 0;\n  return this;\n};\n\n\n/**\n * Allows the expectation to be called any number of times.\n * @return {!goog.testing.Mock} This mock object.\n */\ngoog.testing.Mock.prototype.$anyTimes = function() {\n  this.$pendingExpectation.minCalls = 0;\n  this.$pendingExpectation.maxCalls = Infinity;\n  return this;\n};\n\n\n/**\n * Specifies the number of times the expectation should be called.\n * @param {number} times The number of times this method will be called.\n * @return {!goog.testing.Mock} This mock object.\n */\ngoog.testing.Mock.prototype.$times = function(times) {\n  this.$pendingExpectation.minCalls = times;\n  this.$pendingExpectation.maxCalls = times;\n  return this;\n};\n\n\n/**\n * Switches from recording to replay mode.\n * @override\n */\ngoog.testing.Mock.prototype.$replay = function() {\n  this.$recording_ = false;\n};\n\n\n/**\n * Resets the state of this mock object. This clears all pending expectations\n * without verifying, and puts the mock in recording mode.\n * @override\n */\ngoog.testing.Mock.prototype.$reset = function() {\n  this.$recording_ = true;\n  this.$threwException_ = null;\n  delete this.$pendingExpectation;\n  if (this.waitingForExpectations) {\n    this.waitingForExpectations = null;\n  }\n};\n\n\n/**\n * Throws an exception and records that an exception was thrown.\n * @param {string} comment A short comment about the exception.\n * @param {?string=} opt_message A longer message about the exception.\n * @throws {Object} JsUnitException object.\n * @protected\n */\ngoog.testing.Mock.prototype.$throwException = function(comment, opt_message) {\n  this.$recordAndThrow(new goog.testing.JsUnitException(comment, opt_message));\n};\n\n\n/**\n * Throws an exception and records that an exception was thrown.\n * @param {Object} ex Exception.\n * @param {boolean=} rethrow True if this exception has already been thrown.  If\n *     so, we should not report it to TestCase (since it was already reported at\n *     the original throw). This is necessary to avoid logging it twice, because\n *     assertThrowsJsUnitException only removes one record.\n * @throws {Object} #ex.\n * @protected\n */\ngoog.testing.Mock.prototype.$recordAndThrow = function(ex, rethrow) {\n  if (this.waitingForExpectations) {\n    this.waitingForExpectations.resolve();\n  }\n  if (this.$recording_) {\n    ex = new goog.testing.JsUnitException(\n        'Threw an exception while in record mode, did you $replay?',\n        ex.toString());\n  }\n  // If it's an assert exception, record it.\n  if (ex['isJsUnitException']) {\n    if (!this.$threwException_) {\n      // Only remember first exception thrown.\n      this.$threwException_ = ex;\n    }\n\n    // Don't fail if JSUnit isn't loaded.  Instead, the test can catch the error\n    // normally. Other test frameworks won't get automatic failures if assertion\n    // errors are swallowed.\n    var getTestCase =\n        goog.getObjectByName('goog.testing.TestCase.getActiveTestCase');\n    var testCase = getTestCase && getTestCase();\n    if (testCase && !rethrow) {\n      testCase.raiseAssertionException(ex);\n    }\n  }\n  throw ex;\n};\n\n\n/** @override */\ngoog.testing.Mock.prototype.$waitAndVerify = function() {\n  goog.asserts.assert(\n      !this.$recording_,\n      '$waitAndVerify should be called after recording calls.');\n  this.waitingForExpectations = goog.Promise.withResolver();\n  var verify = goog.bind(this.$verify, this);\n  return this.waitingForExpectations.promise.then(function() {\n    return new goog.Promise(function(resolve, reject) {\n      setTimeout(function() {\n        try {\n          verify();\n        } catch (e) {\n          reject(e);\n        }\n        resolve();\n      }, 0);\n    });\n  });\n};\n\n\n/**\n * Verify that all of the expectations were met. Should be overridden by\n * subclasses.\n * @override\n */\ngoog.testing.Mock.prototype.$verify = function() {\n  if (this.$threwException_) {\n    throw this.$threwException_;\n  }\n};\n\n\n/**\n * Verifies that a method call matches an expectation.\n * @param {goog.testing.MockExpectation} expectation The expectation to check.\n * @param {string} name The name of the called method.\n * @param {Array<*>?} args The arguments passed to the mock.\n * @return {boolean} Whether the call matches the expectation.\n */\ngoog.testing.Mock.prototype.$verifyCall = function(expectation, name, args) {\n  if (expectation.name != name) {\n    return false;\n  }\n  var verifierFn =\n      this.$argumentListVerifiers_.hasOwnProperty(expectation.name) ?\n      this.$argumentListVerifiers_[expectation.name] :\n      goog.testing.mockmatchers.flexibleArrayMatcher;\n\n  return verifierFn(expectation.argumentList, args, expectation);\n};\n\n\n/**\n * Render the provided argument array to a string to help\n * clients with debugging tests.\n * @param {Array<*>?} args The arguments passed to the mock.\n * @return {string} Human-readable string.\n */\ngoog.testing.Mock.prototype.$argumentsAsString = function(args) {\n  var retVal = [];\n  for (var i = 0; i < args.length; i++) {\n    try {\n      retVal.push(goog.typeOf(args[i]));\n    } catch (e) {\n      retVal.push('[unknown]');\n    }\n  }\n  return '(' + retVal.join(', ') + ')';\n};\n\n\n/**\n * Throw an exception based on an incorrect method call.\n * @param {string} name Name of method called.\n * @param {Array<*>?} args Arguments passed to the mock.\n * @param {goog.testing.MockExpectation=} opt_expectation Expected next call,\n *     if any.\n */\ngoog.testing.Mock.prototype.$throwCallException = function(\n    name, args, opt_expectation) {\n  var errorStringBuffer = [];\n  var actualArgsString = this.$argumentsAsString(args);\n  var expectedArgsString = opt_expectation ?\n      this.$argumentsAsString(opt_expectation.argumentList) :\n      '';\n\n  if (opt_expectation && opt_expectation.name == name) {\n    errorStringBuffer.push(\n        'Bad arguments to ', name, '().\\n', 'Actual: ', actualArgsString, '\\n',\n        'Expected: ', expectedArgsString, '\\n',\n        opt_expectation.getErrorMessage());\n  } else {\n    errorStringBuffer.push(\n        'Unexpected call to ', name, actualArgsString, '.',\n        '\\nDid you forget to $replay?');\n    if (opt_expectation) {\n      errorStringBuffer.push(\n          '\\nNext expected call was to ', opt_expectation.name,\n          expectedArgsString);\n    }\n  }\n  this.$throwException(errorStringBuffer.join(''));\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.testing.MockInterface","^TO","^9>","^;P","^:4","~$goog.testing.mockmatchers","^;9","^>D"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/mock.js"],"^:1",["^9K",["~$goog.testing.MockExpectation","^HQ"]],"^9<",true,"^9=",["^9>","^:4","^;9","^:E","^;P","^>D","^TO","^V2","^V3"]],["^ ","^9A",[1579837703000],"^9B","goog.events.eventwrapper.js","^9C",["^9D","goog/events/eventwrapper.js"],"^9E","goog/events/eventwrapper.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the goog.events.EventWrapper interface.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.events.EventWrapper');\n\ngoog.forwardDeclare('goog.events.EventHandler');\ngoog.forwardDeclare('goog.events.ListenableType');\n\n\n\n/**\n * Interface for event wrappers.\n * @interface\n */\ngoog.events.EventWrapper = function() {};\n\n\n/**\n * Adds an event listener using the wrapper on a DOM Node or an object that has\n * implemented {@link goog.events.EventTarget}. A listener can only be added\n * once to an object.\n *\n * @param {goog.events.ListenableType} src The node to listen to events on.\n * @param {function(?):?|{handleEvent:function(?):?}|null} listener Callback\n *     method, or an object with a handleEvent function.\n * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to\n *     false).\n * @param {Object=} opt_scope Element in whose scope to call the listener.\n * @param {goog.events.EventHandler=} opt_eventHandler Event handler to add\n *     listener to.\n */\ngoog.events.EventWrapper.prototype.listen = function(\n    src, listener, opt_capt, opt_scope, opt_eventHandler) {};\n\n\n/**\n * Removes an event listener added using goog.events.EventWrapper.listen.\n *\n * @param {goog.events.ListenableType} src The node to remove listener from.\n * @param {function(?):?|{handleEvent:function(?):?}|null} listener Callback\n *     method, or an object with a handleEvent function.\n * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to\n *     false).\n * @param {Object=} opt_scope Element in whose scope to call the listener.\n * @param {goog.events.EventHandler=} opt_eventHandler Event handler to remove\n *     listener from.\n */\ngoog.events.EventWrapper.prototype.unlisten = function(\n    src, listener, opt_capt, opt_scope, opt_eventHandler) {};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/eventwrapper.js"],"^:1",["^9K",["~$goog.events.EventWrapper"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.editor.focus.js","^9C",["^9D","goog/editor/focus.js"],"^9E","goog/editor/focus.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilties to handle focusing related to rich text editing.\n *\n */\n\ngoog.provide('goog.editor.focus');\n\ngoog.require('goog.dom.selection');\n\n\n/**\n * Change focus to the given input field and set cursor to end of current text.\n * @param {Element} inputElem Input DOM element.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.editor.focus.focusInputField = function(inputElem) {\n  inputElem.focus();\n  goog.dom.selection.setCursorPosition(inputElem, inputElem.value.length);\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^JS"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/focus.js"],"^:1",["^9K",["~$goog.editor.focus"]],"^9<",true,"^9=",["^9>","^JS"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.async.mockcontrol.js","^9C",["^9D","goog/testing/async/mockcontrol.js"],"^9E","goog/testing/async/mockcontrol.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A wrapper for MockControl that provides mocks and assertions\n * for testing asynchronous code. All assertions will only be verified when\n * $verifyAll is called on the wrapped MockControl.\n *\n * This class is meant primarily for testing code that exposes asynchronous APIs\n * without being truly asynchronous (using asynchronous primitives like browser\n * events or timeouts). This is often the case when true asynchronous\n * depedencies have been mocked out. This means that it doesn't rely on\n * AsyncTestCase or DeferredTestCase, although it can be used with those as\n * well.\n *\n * Example usage:\n *\n * <pre>\n * var mockControl = new goog.testing.MockControl();\n * var asyncMockControl = new goog.testing.async.MockControl(mockControl);\n *\n * myAsyncObject.onSuccess(asyncMockControl.asyncAssertEquals(\n *     'callback should run and pass the correct value',\n *     'http://someurl.com');\n * asyncMockControl.assertDeferredEquals(\n *     'deferred object should be resolved with the correct value',\n *     'http://someurl.com',\n *     myAsyncObject.getDeferredUrl());\n * asyncMockControl.run();\n * mockControl.$verifyAll();\n * </pre>\n *\n */\n\n\ngoog.setTestOnly('goog.testing.async.MockControl');\ngoog.provide('goog.testing.async.MockControl');\n\ngoog.require('goog.asserts');\ngoog.require('goog.async.Deferred');\ngoog.require('goog.debug');\ngoog.require('goog.testing.MockControl');\ngoog.require('goog.testing.asserts');\ngoog.require('goog.testing.mockmatchers.IgnoreArgument');\n\n/**\n * Provides asynchronous mocks and assertions controlled by a parent\n * MockControl.\n *\n * @param {goog.testing.MockControl} mockControl The parent MockControl.\n * @constructor\n * @final\n */\ngoog.testing.async.MockControl = function(mockControl) {\n  /**\n   * The parent MockControl.\n   * @type {goog.testing.MockControl}\n   * @private\n   */\n  this.mockControl_ = mockControl;\n};\n\n\n/**\n * Returns a function that will assert that it will be called, and run the given\n * callback when it is.\n *\n * @template THIS\n * @param {string} name The name of the callback mock.\n * @param {function(this:THIS, ...*) : *} callback The wrapped callback. This will be\n *     called when the returned function is called.\n * @param {THIS=} opt_selfObj The object which this should point to when the\n *     callback is run.\n * @return {!Function} The mock callback.\n * @suppress {missingProperties} Mocks do not fit in the type system well.\n */\ngoog.testing.async.MockControl.prototype.createCallbackMock = function(\n    name, callback, opt_selfObj) {\n  goog.asserts.assert(\n      typeof name === 'string',\n      'name parameter ' + goog.debug.deepExpose(name) + ' should be a string');\n\n  var ignored = new goog.testing.mockmatchers.IgnoreArgument();\n\n  // Use everyone's favorite \"double-cast\" trick to subvert the type system.\n  var mock = this.mockControl_.createFunctionMock(name);\n  var mockAsFn = /** @type {Function} */ (/** @type {*} */ (mock));\n\n  mockAsFn(ignored).$does(function(args) {\n    return callback.apply(opt_selfObj || /** @type {?} */ (this), args);\n  });\n  mock.$replay();\n  return function() {\n    return mockAsFn(arguments);\n  };\n};\n\n\n/**\n * Returns a function that will assert that its arguments are equal to the\n * arguments given to asyncAssertEquals. In addition, the function also asserts\n * that it will be called.\n *\n * @param {string} message A message to print if the arguments are wrong.\n * @param {...*} var_args The arguments to assert.\n * @return {function(...*) : void} The mock callback.\n */\ngoog.testing.async.MockControl.prototype.asyncAssertEquals = function(\n    message, var_args) {\n  var expectedArgs = Array.prototype.slice.call(arguments, 1);\n  return this.createCallbackMock('asyncAssertEquals', function() {\n    assertObjectEquals(\n        message, expectedArgs, Array.prototype.slice.call(arguments));\n  });\n};\n\n\n/**\n * Asserts that a deferred object will have an error and call its errback\n * function.\n * @param {goog.async.Deferred} deferred The deferred object.\n * @param {function() : void} fn A function wrapping the code in which the error\n *     will occur.\n */\ngoog.testing.async.MockControl.prototype.assertDeferredError = function(\n    deferred, fn) {\n  deferred.addErrback(\n      this.createCallbackMock('assertDeferredError', function() {}));\n  fn();\n};\n\n\n/**\n * Asserts that a deferred object will call its callback with the given value.\n *\n * @param {string} message A message to print if the arguments are wrong.\n * @param {goog.async.Deferred|*} expected The expected value. If this is a\n *     deferred object, then the expected value is the deferred value.\n * @param {goog.async.Deferred|*} actual The actual value. If this is a deferred\n *     object, then the actual value is the deferred value. Either this or\n *     'expected' must be deferred.\n */\ngoog.testing.async.MockControl.prototype.assertDeferredEquals = function(\n    message, expected, actual) {\n  if (expected instanceof goog.async.Deferred) {\n    // Assert that the first deferred is resolved.\n    expected.addCallback(\n        this.createCallbackMock('assertDeferredEquals', function(exp) {\n          // Assert that the second deferred is resolved, and that the value is\n          // as expected.\n          if (actual instanceof goog.async.Deferred) {\n            actual.addCallback(this.asyncAssertEquals(message, exp));\n          } else {\n            assertObjectEquals(message, exp, actual);\n          }\n        }, this));\n  } else if (actual instanceof goog.async.Deferred) {\n    actual.addCallback(this.asyncAssertEquals(message, expected));\n  } else {\n    throw new Error('Either expected or actual must be deferred');\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","~$goog.testing.mockmatchers.IgnoreArgument","^>X","^9>","^;T","^?Z","^JA"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/async/mockcontrol.js"],"^:1",["^9K",["~$goog.testing.async.MockControl"]],"^9<",true,"^9=",["^9>","^:E","^?Z","^;T","^JA","^>X","^V7"]],["^ ","^9A",[1579837703000],"^9B","goog.fs.fs.js","^9C",["^9D","goog/fs/fs.js"],"^9E","goog/fs/fs.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Wrappers for the HTML5 File API. These wrappers closely mirror\n * the underlying APIs, but use Closure-style events and Deferred return values.\n * Their existence also makes it possible to mock the FileSystem API for testing\n * in browsers that don't support it natively.\n *\n * When adding public functions to anything under this namespace, be sure to add\n * its mock counterpart to goog.testing.fs.\n *\n */\n\ngoog.provide('goog.fs');\n\ngoog.require('goog.array');\ngoog.require('goog.async.Deferred');\ngoog.require('goog.fs.Error');\ngoog.require('goog.fs.FileReader');\ngoog.require('goog.fs.FileSystemImpl');\ngoog.require('goog.fs.url');\ngoog.require('goog.userAgent');\n\n\n/**\n * Get a wrapped FileSystem object.\n *\n * @param {goog.fs.FileSystemType_} type The type of the filesystem to get.\n * @param {number} size The size requested for the filesystem, in bytes.\n * @return {!goog.async.Deferred} The deferred {@link goog.fs.FileSystem}. If an\n *     error occurs, the errback is called with a {@link goog.fs.Error}.\n * @private\n */\ngoog.fs.get_ = function(type, size) {\n  var requestFileSystem =\n      goog.global.requestFileSystem || goog.global.webkitRequestFileSystem;\n\n  if (!goog.isFunction(requestFileSystem)) {\n    return goog.async.Deferred.fail(new Error('File API unsupported'));\n  }\n\n  var d = new goog.async.Deferred();\n  requestFileSystem(\n      type, size, function(fs) { d.callback(new goog.fs.FileSystemImpl(fs)); },\n      function(err) {\n        d.errback(new goog.fs.Error(err, 'requesting filesystem'));\n      });\n  return d;\n};\n\n\n/**\n * The two types of filesystem.\n *\n * @enum {number}\n * @private\n */\ngoog.fs.FileSystemType_ = {\n  /**\n   * A temporary filesystem may be deleted by the user agent at its discretion.\n   */\n  TEMPORARY: 0,\n  /**\n   * A persistent filesystem will never be deleted without the user's or\n   * application's authorization.\n   */\n  PERSISTENT: 1\n};\n\n\n/**\n * Returns a temporary FileSystem object. A temporary filesystem may be deleted\n * by the user agent at its discretion.\n *\n * @param {number} size The size requested for the filesystem, in bytes.\n * @return {!goog.async.Deferred} The deferred {@link goog.fs.FileSystem}. If an\n *     error occurs, the errback is called with a {@link goog.fs.Error}.\n */\ngoog.fs.getTemporary = function(size) {\n  return goog.fs.get_(goog.fs.FileSystemType_.TEMPORARY, size);\n};\n\n\n/**\n * Returns a persistent FileSystem object. A persistent filesystem will never be\n * deleted without the user's or application's authorization.\n *\n * @param {number} size The size requested for the filesystem, in bytes.\n * @return {!goog.async.Deferred} The deferred {@link goog.fs.FileSystem}. If an\n *     error occurs, the errback is called with a {@link goog.fs.Error}.\n */\ngoog.fs.getPersistent = function(size) {\n  return goog.fs.get_(goog.fs.FileSystemType_.PERSISTENT, size);\n};\n\n\n/**\n * Creates a blob URL for a blob object.\n * Throws an error if the browser does not support Object Urls.\n *\n * TODO(user): Update references to this method to use\n * goog.fs.url.createObjectUrl instead.\n *\n * @param {!Blob} blob The object for which to create the URL.\n * @return {string} The URL for the object.\n */\ngoog.fs.createObjectUrl = function(blob) {\n  return goog.fs.url.createObjectUrl(blob);\n};\n\n\n/**\n * Revokes a URL created by {@link goog.fs.createObjectUrl}.\n * Throws an error if the browser does not support Object Urls.\n *\n * TODO(user): Update references to this method to use\n * goog.fs.url.revokeObjectUrl instead.\n *\n * @param {string} url The URL to revoke.\n */\ngoog.fs.revokeObjectUrl = function(url) {\n  goog.fs.url.revokeObjectUrl(url);\n};\n\n\n/**\n * Checks whether this browser supports Object Urls. If not, calls to\n * createObjectUrl and revokeObjectUrl will result in an error.\n *\n * TODO(user): Update references to this method to use\n * goog.fs.url.browserSupportsObjectUrls instead.\n *\n * @return {boolean} True if this browser supports Object Urls.\n */\ngoog.fs.browserSupportsObjectUrls = function() {\n  return goog.fs.url.browserSupportsObjectUrls();\n};\n\n\n/**\n * Concatenates one or more values together and converts them to a Blob.\n *\n * @param {...(string|!Blob|!ArrayBuffer)} var_args The values that will make up\n *     the resulting blob.\n * @return {!Blob} The blob.\n */\ngoog.fs.getBlob = function(var_args) {\n  var BlobBuilder = goog.global.BlobBuilder || goog.global.WebKitBlobBuilder;\n\n  if (BlobBuilder !== undefined) {\n    var bb = new BlobBuilder();\n    for (var i = 0; i < arguments.length; i++) {\n      bb.append(arguments[i]);\n    }\n    return bb.getBlob();\n  } else {\n    return goog.fs.getBlobWithProperties(goog.array.toArray(arguments));\n  }\n};\n\n\n/**\n * Creates a blob with the given properties.\n * See https://developer.mozilla.org/en-US/docs/Web/API/Blob for more details.\n *\n * @param {Array<string|!Blob>} parts The values that will make up the\n *     resulting blob.\n * @param {string=} opt_type The MIME type of the Blob.\n * @param {string=} opt_endings Specifies how strings containing newlines are to\n *     be written out.\n * @return {!Blob} The blob.\n */\ngoog.fs.getBlobWithProperties = function(parts, opt_type, opt_endings) {\n  var BlobBuilder = goog.global.BlobBuilder || goog.global.WebKitBlobBuilder;\n\n  if (BlobBuilder !== undefined) {\n    var bb = new BlobBuilder();\n    for (var i = 0; i < parts.length; i++) {\n      bb.append(parts[i], opt_endings);\n    }\n    return bb.getBlob(opt_type);\n  } else if (goog.global.Blob !== undefined) {\n    var properties = {};\n    if (opt_type) {\n      properties['type'] = opt_type;\n    }\n    if (opt_endings) {\n      properties['endings'] = opt_endings;\n    }\n    return new Blob(parts, properties);\n  } else {\n    throw new Error('This browser doesn\\'t seem to support creating Blobs');\n  }\n};\n\n\n/**\n * Converts a Blob or a File into a string. This should only be used when the\n * blob is known to be small.\n *\n * @param {!Blob} blob The blob to convert.\n * @param {string=} opt_encoding The name of the encoding to use.\n * @return {!goog.async.Deferred} The deferred string. If an error occurrs, the\n *     errback is called with a {@link goog.fs.Error}.\n * @deprecated Use {@link goog.fs.FileReader.readAsText} instead.\n */\ngoog.fs.blobToString = function(blob, opt_encoding) {\n  return goog.fs.FileReader.readAsText(blob, opt_encoding);\n};\n\n\n/**\n * Slices the blob. The returned blob contains data from the start byte\n * (inclusive) till the end byte (exclusive). Negative indices can be used\n * to count bytes from the end of the blob (-1 == blob.size - 1). Indices\n * are always clamped to blob range. If end is omitted, all the data till\n * the end of the blob is taken.\n *\n * @param {!Blob} blob The blob to be sliced.\n * @param {number} start Index of the starting byte.\n * @param {number=} opt_end Index of the ending byte.\n * @return {Blob} The blob slice or null if not supported.\n */\ngoog.fs.sliceBlob = function(blob, start, opt_end) {\n  if (opt_end === undefined) {\n    opt_end = blob.size;\n  }\n  if (blob.webkitSlice) {\n    // Natively accepts negative indices, clamping to the blob range and\n    // range end is optional. See http://trac.webkit.org/changeset/83873\n    return blob.webkitSlice(start, opt_end);\n  } else if (blob.mozSlice) {\n    // Natively accepts negative indices, clamping to the blob range and\n    // range end is optional. See https://developer.mozilla.org/en/DOM/Blob\n    // and http://hg.mozilla.org/mozilla-central/rev/dae833f4d934\n    return blob.mozSlice(start, opt_end);\n  } else if (blob.slice) {\n    // Old versions of Firefox and Chrome use the original specification.\n    // Negative indices are not accepted, only range end is clamped and\n    // range end specification is obligatory.\n    // See http://www.w3.org/TR/2009/WD-FileAPI-20091117/\n    if ((goog.userAgent.GECKO && !goog.userAgent.isVersionOrHigher('13.0')) ||\n        (goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher('537.1'))) {\n      if (start < 0) {\n        start += blob.size;\n      }\n      if (start < 0) {\n        start = 0;\n      }\n      if (opt_end < 0) {\n        opt_end += blob.size;\n      }\n      if (opt_end < start) {\n        opt_end = start;\n      }\n      return blob.slice(start, opt_end - start);\n    }\n    // IE and the latest versions of Firefox and Chrome use the new\n    // specification. Natively accepts negative indices, clamping to the blob\n    // range and range end is optional.\n    // See http://dev.w3.org/2006/webapi/FileAPI/\n    return blob.slice(start, opt_end);\n  }\n  return null;\n};\n","^9I",1579837703000,"^9J",["^9K",["^IE","^9>","^:S","^L2","^?Z","~$goog.fs.url","^;9","^U@"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fs/fs.js"],"^:1",["^9K",["~$goog.fs"]],"^9<",true,"^9=",["^9>","^;9","^?Z","^IE","^U@","^L2","^V9","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.jsunit.js","^9C",["^9D","goog/testing/jsunit.js"],"^9E","goog/testing/jsunit.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for working with JsUnit.  Writes out the JsUnit file\n * that needs to be included in every unit test.\n *\n * Testing code should not have dependencies outside of goog.testing so as to\n * reduce the chance of masking missing dependencies.\n *\n */\n\ngoog.setTestOnly('goog.testing.jsunit');\ngoog.provide('goog.testing.jsunit');\n\ngoog.require('goog.dom.TagName');\ngoog.require('goog.testing.TestCase');\ngoog.require('goog.testing.TestRunner');\ngoog.require('goog.userAgent');\n\n\n/**\n * @define {boolean} If this code is being parsed by JsTestC, we let it disable\n * the onload handler to avoid running the test in JsTestC.\n */\ngoog.testing.jsunit.AUTO_RUN_ONLOAD =\n    goog.define('goog.testing.jsunit.AUTO_RUN_ONLOAD', true);\n\n\n/**\n * @define {number} Sets a delay in milliseconds after the window onload event\n * and running the tests. Used as a workaround for IE failing to report load\n * event if the page has iframes.  The appropriate value is zero;\n * maximum should be 500.  Do not use this value to support asynchronous tests.\n */\ngoog.testing.jsunit.AUTO_RUN_DELAY_IN_MS =\n    goog.define('goog.testing.jsunit.AUTO_RUN_DELAY_IN_MS', 0);\n\n\n(function() {\n  // Only allow one global test runner to be created on a page.\n  if (goog.global['G_testRunner'] instanceof goog.testing.TestRunner) {\n    return;\n  }\n\n  // Increases the maximum number of stack frames in Google Chrome from the\n  // default 10 to 50 to get more useful stack traces.\n  Error.stackTraceLimit = 50;\n\n  // Store a reference to the window's timeout so that it can't be overridden\n  // by tests.\n  /** @type {!Function} */\n  var realTimeout = window.setTimeout;\n\n  // Create a test runner.\n  var tr = new goog.testing.TestRunner();\n\n  // Export it so that it can be queried by Selenium and tests that use a\n  // compiled test runner.\n  goog.exportSymbol('G_testRunner', tr);\n  goog.exportSymbol('G_testRunner.initialize', tr.initialize);\n  goog.exportSymbol('G_testRunner.isInitialized', tr.isInitialized);\n  goog.exportSymbol('G_testRunner.isFinished', tr.isFinished);\n  goog.exportSymbol('G_testRunner.getUniqueId', tr.getUniqueId);\n  goog.exportSymbol('G_testRunner.isSuccess', tr.isSuccess);\n  goog.exportSymbol('G_testRunner.getReport', tr.getReport);\n  goog.exportSymbol('G_testRunner.getRunTime', tr.getRunTime);\n  goog.exportSymbol('G_testRunner.getNumFilesLoaded', tr.getNumFilesLoaded);\n  goog.exportSymbol('G_testRunner.setStrict', tr.setStrict);\n  goog.exportSymbol('G_testRunner.logTestFailure', tr.logTestFailure);\n  goog.exportSymbol('G_testRunner.getTestResults', tr.getTestResults);\n  goog.exportSymbol(\n      'G_testRunner.getTestResultsAsJson', tr.getTestResultsAsJson);\n\n  // Export debug as a global function for JSUnit compatibility.  This just\n  // calls log on the current test case.\n  if (!goog.global['debug']) {\n    goog.exportSymbol('debug', goog.bind(tr.log, tr));\n  }\n\n  // If the application has defined a global error filter, set it now.  This\n  // allows users who use a base test include to set the error filter before\n  // the testing code is loaded.\n  if (goog.global['G_errorFilter']) {\n    tr.setErrorFilter(goog.global['G_errorFilter']);\n  }\n\n  var maybeGetStack = function(error) {\n    var stack = error && error.stack;\n    return typeof stack === 'string' ? stack : '';\n  };\n\n  // Add an error handler to report errors that may occur during\n  // initialization of the page.\n  var onerror = window.onerror;\n  window.onerror = function(messageOrEvent, url, line) {\n    // TODO(johnlenz): fix this function parameters once the \"onerror\"\n    // definition has been corrected.\n    // colno and errObj were added later.\n    var colno = arguments[3];\n    var errObj = arguments[4];\n    // Call any existing onerror handlers, except our boot handler.\n    if (onerror && onerror != window[\"__onerror_at_boot\"]) {\n      onerror.apply(window, arguments);\n    }\n    var stack = maybeGetStack(errObj || messageOrEvent);\n    if (stack) {\n      tr.logError(String(messageOrEvent) + '\\n' + stack);\n    } else if (typeof messageOrEvent == 'object') {\n      var error = /** @type {{target: ?}} */ (messageOrEvent);\n      // Some older webkit browsers pass an event object as the only argument\n      // to window.onerror.  It doesn't contain an error message, url or line\n      // number.  We therefore log as much info as we can.\n      if (error.target && error.target.tagName == goog.dom.TagName.SCRIPT) {\n        tr.logError('UNKNOWN ERROR: Script ' + error.target.src);\n      } else {\n        tr.logError('UNKNOWN ERROR: No error information available.');\n      }\n    } else {\n      // Add the column if it is available, older browsers won't have it.\n      var colstr = colno != null ? '\\nColumn: ' + colno : '';\n      tr.logError(\n          'JS ERROR: ' + messageOrEvent + '\\nURL: ' + url + '\\nLine: ' + line +\n          colstr);\n    }\n  };\n\n  /**\n   * The onerror handler that may have been set by the test runner.\n   *  @type {?function(string, string=, number=, number=, Object=)}\n   */\n  window[\"__onerror_at_boot\"] = window[\"__onerror_at_boot\"] || null;\n  /**\n   * The arguments for any call to window.onerror occuring before this point.\n   * @type {Array<!Array<?>>} */\n  window[\"__errors_since_boot\"] = window[\"__errors_since_boot\"] || null;\n\n  if (window[\"__onerror_at_boot\"]) {\n    if (window['__errors_since_boot']) {\n      for (var i = 0; i < window['__errors_since_boot'].length; i++) {\n        var args = window['__errors_since_boot'][i];\n        window.onerror.apply(window, args);\n      }\n    }\n    // http://perfectionkills.com/understanding-delete/#ie_bugs\n    window[\"__onerror_at_boot\"] = null;\n  }\n\n  // Create an onload handler, if the test runner hasn't been initialized then\n  // no test has been registered with the test runner by the test file.  We\n  // then create a new test case and auto discover any tests in the global\n  // scope. If this code is being parsed by JsTestC, we let it disable the\n  // onload handler to avoid running the test in JsTestC.\n  if (goog.testing.jsunit.AUTO_RUN_ONLOAD) {\n    var onload = window.onload;\n    window.onload = function(e) {\n      // Call any existing onload handlers.\n      if (onload) {\n        onload(e);\n      }\n      // Execute the test on the next turn, to allow the WebDriver.get()\n      // operation to return to the test runner and begin polling.\n      var executionDelayAfterLoad = goog.testing.jsunit.AUTO_RUN_DELAY_IN_MS;\n      if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('11')) {\n        // Older IE Webdriver will not return onload if the page uses iframes.\n        executionDelayAfterLoad =\n            Math.max(goog.testing.jsunit.AUTO_RUN_DELAY_IN_MS, 500);\n      }\n\n      realTimeout(function() {\n        if (!tr.initialized) {\n          var testCase = new goog.testing.TestCase(document.title);\n          goog.testing.TestCase.initializeTestCase(testCase);\n          tr.initialize(testCase);\n        }\n        tr.execute();\n      }, executionDelayAfterLoad);\n      window.onload = null;\n    };\n  }\n})();\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:S","^RT","~$goog.testing.TestRunner","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/jsunit.js"],"^:1",["^9K",["^J8"]],"^9<",true,"^9=",["^9>","^;=","^RT","^V;","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.pattern.childmatches.js","^9C",["^9D","goog/dom/pattern/childmatches.js"],"^9E","goog/dom/pattern/childmatches.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview DOM pattern to match any children of a tag, and\n * specifically collect those that match a child pattern.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.dom.pattern.ChildMatches');\n\ngoog.require('goog.dom.pattern.AllChildren');\ngoog.require('goog.dom.pattern.MatchType');\n\n\n\n/**\n * Pattern object that matches any nodes at or below the current tree depth.\n *\n * @param {goog.dom.pattern.AbstractPattern} childPattern Pattern to collect\n *     child matches of.\n * @param {number=} opt_minimumMatches Enforce a minimum nuber of matches.\n *     Defaults to 0.\n * @constructor\n * @extends {goog.dom.pattern.AllChildren}\n * @final\n */\ngoog.dom.pattern.ChildMatches = function(childPattern, opt_minimumMatches) {\n  /**\n   * The child pattern to collect matches from.\n   *\n   * @private {goog.dom.pattern.AbstractPattern}\n   */\n  this.childPattern_ = childPattern;\n\n  /**\n   * Array of matched child nodes.\n   *\n   * @type {Array<Node>}\n   */\n  this.matches = [];\n\n  /**\n   * Minimum number of matches.\n   *\n   * @private {number}\n   */\n  this.minimumMatches_ = opt_minimumMatches || 0;\n\n  /**\n   * Whether the pattern has recently matched or failed to match and will need\n   * to be reset when starting a new round of matches.\n   *\n   * @private {boolean}\n   */\n  this.needsReset_ = false;\n\n  goog.dom.pattern.ChildMatches.base(this, 'constructor');\n};\ngoog.inherits(goog.dom.pattern.ChildMatches, goog.dom.pattern.AllChildren);\n\n\n/**\n * Test whether the given token is on the same level.\n *\n * @param {Node} token Token to match against.\n * @param {goog.dom.TagWalkType} type The type of token.\n * @return {goog.dom.pattern.MatchType} `MATCHING` if the token is on the\n *     same level or deeper and `BACKTRACK_MATCH` if not.\n * @override\n */\ngoog.dom.pattern.ChildMatches.prototype.matchToken = function(token, type) {\n  // Defer resets so we maintain our matches array until the last possible time.\n  if (this.needsReset_) {\n    this.reset();\n  }\n\n  // Call the super-method to ensure we stay in the child tree.\n  var status =\n      goog.dom.pattern.AllChildren.prototype.matchToken.apply(this, arguments);\n\n  switch (status) {\n    case goog.dom.pattern.MatchType.MATCHING:\n      var backtrack = false;\n\n      switch (this.childPattern_.matchToken(token, type)) {\n        case goog.dom.pattern.MatchType.BACKTRACK_MATCH:\n          backtrack = true;\n        case goog.dom.pattern.MatchType.MATCH:\n          // Collect the match.\n          this.matches.push(this.childPattern_.matchedNode);\n          break;\n\n        default:\n          // Keep trying if we haven't hit a terminal state.\n          break;\n      }\n\n      if (backtrack) {\n        // The only interesting result is a MATCH, since BACKTRACK_MATCH means\n        // we are hitting an infinite loop on something like a Repeat(0).\n        if (this.childPattern_.matchToken(token, type) ==\n            goog.dom.pattern.MatchType.MATCH) {\n          this.matches.push(this.childPattern_.matchedNode);\n        }\n      }\n      return goog.dom.pattern.MatchType.MATCHING;\n\n    case goog.dom.pattern.MatchType.BACKTRACK_MATCH:\n      // TODO(robbyw): this should return something like BACKTRACK_NO_MATCH\n      // when we don't meet our minimum.\n      this.needsReset_ = true;\n      return (this.matches.length >= this.minimumMatches_) ?\n          goog.dom.pattern.MatchType.BACKTRACK_MATCH :\n          goog.dom.pattern.MatchType.NO_MATCH;\n\n    default:\n      this.needsReset_ = true;\n      return status;\n  }\n};\n\n\n/**\n * Reset any internal state this pattern keeps.\n * @override\n */\ngoog.dom.pattern.ChildMatches.prototype.reset = function() {\n  this.needsReset_ = false;\n  this.matches.length = 0;\n  this.childPattern_.reset();\n  goog.dom.pattern.AllChildren.prototype.reset.call(this);\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.dom.pattern.AllChildren","^9>","^=?"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/childmatches.js"],"^:1",["^9K",["~$goog.dom.pattern.ChildMatches"]],"^9<",true,"^9=",["^9>","^V<","^=?"]],["^ ","^9A",[1579837703000],"^9B","goog.crypt.blobhasher.js","^9C",["^9D","goog/crypt/blobhasher.js"],"^9E","goog/crypt/blobhasher.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Asynchronous hash computer for the Blob interface.\n *\n * The Blob interface, part of the HTML5 File API, is supported on Chrome 7+,\n * Firefox 4.0 and Opera 11. No Blob interface implementation is expected on\n * Internet Explorer 10. Chrome 11, Firefox 5.0 and the subsequent release of\n * Opera are supposed to use vendor prefixes due to evolving API, see\n * http://dev.w3.org/2006/webapi/FileAPI/ for details.\n *\n * This implementation currently uses upcoming Chrome and Firefox prefixes,\n * plus the original Blob.slice specification, as implemented on Chrome 10\n * and Firefox 4.0.\n *\n */\n\ngoog.provide('goog.crypt.BlobHasher');\ngoog.provide('goog.crypt.BlobHasher.EventType');\n\ngoog.require('goog.asserts');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.fs');\ngoog.require('goog.log');\n\n\n\n/**\n * Construct the hash computer.\n *\n * @param {!goog.crypt.Hash} hashFn The hash function to use.\n * @param {number=} opt_blockSize Processing block size.\n * @constructor\n * @struct\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.crypt.BlobHasher = function(hashFn, opt_blockSize) {\n  goog.crypt.BlobHasher.base(this, 'constructor');\n\n  /**\n   * The actual hash function.\n   * @type {!goog.crypt.Hash}\n   * @private\n   */\n  this.hashFn_ = hashFn;\n\n  /**\n   * The blob being processed or null if no blob is being processed.\n   * @type {?Blob}\n   * @private\n   */\n  this.blob_ = null;\n\n  /**\n   * Computed hash value.\n   * @type {?Array<number>}\n   * @private\n   */\n  this.hashVal_ = null;\n\n  /**\n   * Number of bytes already processed.\n   * @type {number}\n   * @private\n   */\n  this.bytesProcessed_ = 0;\n\n  /**\n   * The number of bytes to hash or Infinity for no limit.\n   * @type {number}\n   * @private\n   */\n  this.hashingLimit_ = Infinity;\n\n  /**\n   * Processing block size.\n   * @type {number}\n   * @private\n   */\n  this.blockSize_ = opt_blockSize || 5000000;\n\n  /**\n   * File reader object. Will be null if no chunk is currently being read.\n   * @type {?FileReader}\n   * @private\n   */\n  this.fileReader_ = null;\n\n  /**\n   * The logger used by this object.\n   * @type {goog.log.Logger}\n   * @private\n   */\n  this.logger_ = goog.log.getLogger('goog.crypt.BlobHasher');\n};\ngoog.inherits(goog.crypt.BlobHasher, goog.events.EventTarget);\n\n\n/**\n * Event names for hash computation events\n * @enum {string}\n */\ngoog.crypt.BlobHasher.EventType = {\n  STARTED: 'started',\n  PROGRESS: 'progress',\n  THROTTLED: 'throttled',\n  COMPLETE: 'complete',\n  ABORT: 'abort',\n  ERROR: 'error'\n};\n\n\n/**\n * Start the hash computation.\n * @param {!Blob} blob The blob of data to compute the hash for.\n */\ngoog.crypt.BlobHasher.prototype.hash = function(blob) {\n  this.abort();\n  this.hashFn_.reset();\n  this.blob_ = blob;\n  this.hashVal_ = null;\n  this.bytesProcessed_ = 0;\n  this.dispatchEvent(goog.crypt.BlobHasher.EventType.STARTED);\n\n  this.processNextBlock_();\n};\n\n\n/**\n * Sets the maximum number of bytes to hash or Infinity for no limit. Can be\n * called before hash() to throttle the hash computation. The hash computation\n * can then be continued by repeatedly calling setHashingLimit() with greater\n * byte offsets. This is useful if you don't need the hash until some time in\n * the future, for example when uploading a file and you don't need the hash\n * until the transfer is complete.\n * @param {number} byteOffset The byte offset to compute the hash up to.\n *     Should be a non-negative integer or Infinity for no limit. Negative\n *     values are not allowed.\n */\ngoog.crypt.BlobHasher.prototype.setHashingLimit = function(byteOffset) {\n  goog.asserts.assert(byteOffset >= 0, 'Hashing limit must be non-negative.');\n  this.hashingLimit_ = byteOffset;\n\n  // Resume processing if a blob is currently being hashed, but no block read\n  // is currently in progress.\n  if (this.blob_ && !this.fileReader_) {\n    this.processNextBlock_();\n  }\n};\n\n\n/**\n * Abort hash computation.\n */\ngoog.crypt.BlobHasher.prototype.abort = function() {\n  if (this.fileReader_) {\n    this.fileReader_.abort();\n    this.fileReader_ = null;\n  }\n\n  if (this.blob_) {\n    this.blob_ = null;\n    this.dispatchEvent(goog.crypt.BlobHasher.EventType.ABORT);\n  }\n};\n\n\n/**\n * @return {number} Number of bytes processed so far.\n */\ngoog.crypt.BlobHasher.prototype.getBytesProcessed = function() {\n  return this.bytesProcessed_;\n};\n\n\n/**\n * @return {Array<number>} The computed hash value or null if not ready.\n */\ngoog.crypt.BlobHasher.prototype.getHash = function() {\n  return this.hashVal_;\n};\n\n\n/**\n * Helper function setting up the processing for the next block, or finalizing\n * the computation if all blocks were processed.\n * @private\n */\ngoog.crypt.BlobHasher.prototype.processNextBlock_ = function() {\n  goog.asserts.assert(this.blob_, 'A hash computation must be in progress.');\n\n  if (this.bytesProcessed_ < this.blob_.size) {\n    if (this.hashingLimit_ <= this.bytesProcessed_) {\n      // Throttle limit reached. Wait until we are allowed to hash more bytes.\n      this.dispatchEvent(goog.crypt.BlobHasher.EventType.THROTTLED);\n      return;\n    }\n\n    // We have to reset the FileReader every time, otherwise it fails on\n    // Chrome, including the latest Chrome 12 beta.\n    // http://code.google.com/p/chromium/issues/detail?id=82346\n    this.fileReader_ = new FileReader();\n    this.fileReader_.onload = goog.bind(this.onLoad_, this);\n    this.fileReader_.onerror = goog.bind(this.onError_, this);\n\n    var endOffset = Math.min(this.hashingLimit_, this.blob_.size);\n    var size = Math.min(endOffset - this.bytesProcessed_, this.blockSize_);\n    var chunk = goog.fs.sliceBlob(\n        this.blob_, this.bytesProcessed_, this.bytesProcessed_ + size);\n    if (!chunk || chunk.size != size) {\n      goog.log.error(this.logger_, 'Failed slicing the blob');\n      this.onError_();\n      return;\n    }\n\n    if (this.fileReader_.readAsArrayBuffer) {\n      this.fileReader_.readAsArrayBuffer(chunk);\n    } else if (this.fileReader_.readAsBinaryString) {\n      this.fileReader_.readAsBinaryString(chunk);\n    } else {\n      goog.log.error(this.logger_, 'Failed calling the chunk reader');\n      this.onError_();\n    }\n  } else {\n    this.hashVal_ = this.hashFn_.digest();\n    this.blob_ = null;\n    this.dispatchEvent(goog.crypt.BlobHasher.EventType.COMPLETE);\n  }\n};\n\n\n/**\n * Handle processing block loaded.\n * @private\n */\ngoog.crypt.BlobHasher.prototype.onLoad_ = function() {\n  goog.log.info(this.logger_, 'Successfully loaded a chunk');\n\n  var array = null;\n  if (this.fileReader_.result instanceof Array ||\n      typeof this.fileReader_.result === 'string') {\n    array = this.fileReader_.result;\n  } else if (\n      goog.global['ArrayBuffer'] && goog.global['Uint8Array'] &&\n      this.fileReader_.result instanceof ArrayBuffer) {\n    array = new Uint8Array(this.fileReader_.result);\n  }\n  if (!array) {\n    goog.log.error(this.logger_, 'Failed reading the chunk');\n    this.onError_();\n    return;\n  }\n\n  this.hashFn_.update(array);\n  this.bytesProcessed_ += array.length;\n  this.fileReader_ = null;\n  this.dispatchEvent(goog.crypt.BlobHasher.EventType.PROGRESS);\n\n  this.processNextBlock_();\n};\n\n\n/**\n * Handles error.\n * @private\n */\ngoog.crypt.BlobHasher.prototype.onError_ = function() {\n  this.fileReader_ = null;\n  this.blob_ = null;\n  this.dispatchEvent(goog.crypt.BlobHasher.EventType.ERROR);\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9>","^:L","^;Q","^V:"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/blobhasher.js"],"^:1",["^9K",["~$goog.crypt.BlobHasher.EventType","~$goog.crypt.BlobHasher"]],"^9<",true,"^9=",["^9>","^:E","^:L","^V:","^;Q"]],["^ ","^9A",[1579837703000],"^9B","goog.crypt.basen.js","^9C",["^9D","goog/crypt/basen.js"],"^9E","goog/crypt/basen.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Numeric base conversion library.  Works for arbitrary bases and\n * arbitrary length numbers.\n *\n * For base-64 conversion use base64.js because it is optimized for the specific\n * conversion to base-64 while this module is generic.  Base-64 is defined here\n * mostly for demonstration purpose.\n *\n * TODO: Make base64 and baseN classes that have common interface.  (Perhaps...)\n *\n */\n\ngoog.provide('goog.crypt.baseN');\n\n\n/**\n * Base-2, i.e. '01'.\n * @type {string}\n */\ngoog.crypt.baseN.BASE_BINARY = '01';\n\n\n/**\n * Base-8, i.e. '01234567'.\n * @type {string}\n */\ngoog.crypt.baseN.BASE_OCTAL = '01234567';\n\n\n/**\n * Base-10, i.e. '0123456789'.\n * @type {string}\n */\ngoog.crypt.baseN.BASE_DECIMAL = '0123456789';\n\n\n/**\n * Base-16 using lower case, i.e. '0123456789abcdef'.\n * @type {string}\n */\ngoog.crypt.baseN.BASE_LOWERCASE_HEXADECIMAL = '0123456789abcdef';\n\n\n/**\n * Base-16 using upper case, i.e. '0123456789ABCDEF'.\n * @type {string}\n */\ngoog.crypt.baseN.BASE_UPPERCASE_HEXADECIMAL = '0123456789ABCDEF';\n\n\n/**\n * The more-known version of the BASE-64 encoding.  Uses + and / characters.\n * @type {string}\n */\ngoog.crypt.baseN.BASE_64 =\n    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n\n/**\n * URL-safe version of the BASE-64 encoding.\n * @type {string}\n */\ngoog.crypt.baseN.BASE_64_URL_SAFE =\n    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n\n\n/**\n * Converts a number from one numeric base to another.\n *\n * The bases are represented as strings, which list allowed digits.  Each digit\n * should be unique.  The bases can either be user defined, or any of\n * goog.crypt.baseN.BASE_xxx.\n *\n * The number is in human-readable format, most significant digit first, and is\n * a non-negative integer.  Base designators such as $, 0x, d, b or h (at end)\n * will be interpreted as digits, so avoid them.  Leading zeros will be trimmed.\n *\n * Note: for huge bases the result may be inaccurate because of overflowing\n * 64-bit doubles used by JavaScript for integer calculus.  This may happen\n * if the product of the number of digits in the input and output bases comes\n * close to 10^16, which is VERY unlikely (100M digits in each base), but\n * may be possible in the future unicode world.  (Unicode 3.2 has less than 100K\n * characters.  However, it reserves some more, close to 1M.)\n *\n * @param {string} number The number to convert.\n * @param {string} inputBase The numeric base the number is in (all digits).\n * @param {string} outputBase Requested numeric base.\n * @return {string} The converted number.\n */\ngoog.crypt.baseN.recodeString = function(number, inputBase, outputBase) {\n  if (outputBase == '') {\n    throw new Error('Empty output base');\n  }\n\n  // Check if number is 0 (special case when we don't want to return '').\n  let isZero = true;\n  let n = number.length;\n  for (let i = 0; i < n; i++) {\n    if (number.charAt(i) != inputBase.charAt(0)) {\n      isZero = false;\n      break;\n    }\n  }\n  if (isZero) {\n    return outputBase.charAt(0);\n  }\n\n  const numberDigits = goog.crypt.baseN.stringToArray_(number, inputBase);\n\n  const inputBaseSize = inputBase.length;\n  const outputBaseSize = outputBase.length;\n\n  // result = 0.\n  const result = [];\n\n  // For all digits of number, starting with the most significant ...\n  for (let i = numberDigits.length - 1; i >= 0; i--) {\n    // result *= number.base.\n    let carry = 0;\n    const n = result.length;\n    for (let j = 0; j < n; j++) {\n      let digit = result[j];\n      // This may overflow for huge bases.  See function comment.\n      digit = digit * inputBaseSize + carry;\n      if (digit >= outputBaseSize) {\n        const remainder = digit % outputBaseSize;\n        carry = (digit - remainder) / outputBaseSize;\n        digit = remainder;\n      } else {\n        carry = 0;\n      }\n      result[j] = digit;\n    }\n    while (carry) {\n      const remainder = carry % outputBaseSize;\n      result.push(remainder);\n      carry = (carry - remainder) / outputBaseSize;\n    }\n\n    // result += number[i].\n    carry = numberDigits[i];\n    let j = 0;\n    while (carry) {\n      if (j >= result.length) {\n        // Extend result with a leading zero which will be overwritten below.\n        result.push(0);\n      }\n      let digit = result[j];\n      digit += carry;\n      if (digit >= outputBaseSize) {\n        const remainder = digit % outputBaseSize;\n        carry = (digit - remainder) / outputBaseSize;\n        digit = remainder;\n      } else {\n        carry = 0;\n      }\n      result[j] = digit;\n      j++;\n    }\n  }\n\n  return goog.crypt.baseN.arrayToString_(result, outputBase);\n};\n\n\n/**\n * Converts a string representation of a number to an array of digit values.\n *\n * More precisely, the digit values are indices into the number base, which\n * is represented as a string, which can either be user defined or one of the\n * BASE_xxx constants.\n *\n * Throws an Error if the number contains a digit not found in the base.\n *\n * @param {string} number The string to convert, most significant digit first.\n * @param {string} base Digits in the base.\n * @return {!Array<number>} Array of digit values, least significant digit\n *     first.\n * @private\n */\ngoog.crypt.baseN.stringToArray_ = function(number, base) {\n  const index = {};\n  const n = base.length;\n  for (let i = 0; i < n; i++) {\n    index[base.charAt(i)] = i;\n  }\n  const result = [];\n  for (let i = number.length - 1; i >= 0; i--) {\n    const character = number.charAt(i);\n    const digit = index[character];\n    if (typeof digit == 'undefined') {\n      throw new Error(\n          'Number ' + number + ' contains a character not found in base ' +\n          base + ', which is ' + character);\n    }\n    result.push(digit);\n  }\n  return result;\n};\n\n\n/**\n * Converts an array representation of a number to a string.\n *\n * More precisely, the elements of the input array are indices into the base,\n * which is represented as a string, which can either be user defined or one of\n * the BASE_xxx constants.\n *\n * Throws an Error if the number contains a digit which is outside the range\n * 0 ... base.length - 1.\n *\n * @param {Array<number>} number Array of digit values, least significant\n *     first.\n * @param {string} base Digits in the base.\n * @return {string} Number as a string, most significant digit first.\n * @private\n */\ngoog.crypt.baseN.arrayToString_ = function(number, base) {\n  const n = number.length;\n  const chars = [];\n  const baseSize = base.length;\n  for (let i = n - 1; i >= 0; i--) {\n    const digit = number[i];\n    if (digit >= baseSize || digit < 0) {\n      throw new Error(\n          'Number ' + number + ' contains an invalid digit: ' + digit);\n    }\n    chars.push(base.charAt(digit));\n  }\n  return chars.join('');\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/basen.js"],"^:1",["^9K",["~$goog.crypt.baseN"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.html.sanitizer.safedomtreeprocessor.js","^9C",["^9D","goog/html/sanitizer/safedomtreeprocessor.js"],"^9E","goog/html/sanitizer/safedomtreeprocessor.js","^9F","^9G","^9H","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A base class to safely parse and transform an HTML string\n * using an inert DOM, which avoids executing scripts and loading images. Note:\n * this class does *not* guarantee that the output does not contain scripts and\n * images that eventually execute once the output is inserted into an active DOM\n * document. If any subclass claims to produce SafeHtml output, it must be\n * reviewed separately.\n * @supported IE 10+, Chrome 26+, Firefox 22+, Safari 7.1+, Opera 15+\n */\n\ngoog.module('goog.html.sanitizer.SafeDomTreeProcessor');\ngoog.module.declareLegacyNamespace();\n\nvar Const = goog.require('goog.string.Const');\nvar ElementWeakMap = goog.require('goog.html.sanitizer.ElementWeakMap');\nvar NodeType = goog.require('goog.dom.NodeType');\nvar TagName = goog.require('goog.dom.TagName');\nvar googDom = goog.require('goog.dom');\nvar googLog = goog.require('goog.log');\nvar noclobber = goog.require('goog.html.sanitizer.noclobber');\nvar safe = goog.require('goog.dom.safe');\nvar uncheckedconversions = goog.require('goog.html.uncheckedconversions');\nvar userAgent = goog.require('goog.userAgent');\n\n/** @const {?googLog.Logger} */\nvar logger = googLog.getLogger('goog.html.sanitizer.SafeDomTreeProcessor');\n\n/**\n * Whether the HTML sanitizer is supported. For now mainly exclude\n * IE9 or below, for which we know the sanitizer is insecure or broken.\n * @const {boolean}\n */\nvar SAFE_PARSING_SUPPORTED =\n    !userAgent.IE || userAgent.isDocumentModeOrHigher(10);\n\n/**\n * Whether the template tag is supported.\n * @const {boolean}\n */\nvar HTML_SANITIZER_TEMPLATE_SUPPORTED =\n    !userAgent.IE || document.documentMode == null;\n\n/**\n * Parses a string of unsanitized HTML and provides an iterator over the\n * resulting DOM tree nodes. The parsing operation is inert (that is,\n * it does not cause execution of any active content or cause the browser to\n * issue any requests). The returned iterator is guaranteed to iterate over a\n * parent element before iterating over any of its children.\n * @param {string} html\n * @return {!TreeWalker}\n */\nfunction getDomTreeWalker(html) {\n  var iteratorParent;\n  var safeHtml =\n      uncheckedconversions.safeHtmlFromStringKnownToSatisfyTypeContract(\n          Const.from('Never attached to DOM.'), html);\n  var templateElement = document.createElement('template');\n  if (HTML_SANITIZER_TEMPLATE_SUPPORTED && 'content' in templateElement) {\n    safe.unsafeSetInnerHtmlDoNotUseOrElse(templateElement, safeHtml);\n    iteratorParent = templateElement.content;\n  } else {\n    // In browsers where <template> is not implemented, use an inert\n    // HTMLDocument.\n    var doc = document.implementation.createHTMLDocument('x');\n    iteratorParent = doc.body;\n    safe.unsafeSetInnerHtmlDoNotUseOrElse(doc.body, safeHtml);\n  }\n  return document.createTreeWalker(\n      iteratorParent, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\n      null /* filter */, false /* entityReferenceExpansion */);\n}\n\n/**\n * Constructs a {@link SafeDomTreeProcessor} object that safely parses an input\n * string into a DOM tree using an inert document, and creates a new tree based\n * on the original tree, optionally transforming it in the process. The\n * transformation is not specified in this abstract class; subclasses are\n * supposed to override its protected methods to define a transformation that\n * allows tags and attributes, drops entire subtrees, modifies tag names or\n * attributes, etc.\n * @constructor @struct @abstract\n */\nvar SafeDomTreeProcessor = function() {};\n\n/**\n * Parses an HTML string and walks the resulting DOM forest to apply the\n * transformation function and generate a new forest. Returns the string\n * representation of the forest.\n * @param {string} html\n * @return {string}\n * @protected @final\n */\nSafeDomTreeProcessor.prototype.processToString = function(html) {\n  if (!SAFE_PARSING_SUPPORTED) {\n    return '';\n  }\n\n  var newTree = this.processToTree(html);\n  if (noclobber.getElementAttributes(newTree).length > 0) {\n    // We want to preserve the outer SPAN tag, because the processor has\n    // attached attributes to it. To do so, we make a new SPAN tag the parent of\n    // the existing root span tag, so that the rest of the function will remove\n    // that one instead.\n    var newRoot = googDom.createElement(TagName.SPAN);\n    newRoot.appendChild(newTree);\n    newTree = newRoot;\n  }\n  // The XMLSerializer will add a spurious xmlns attribute to the root node.\n  var serializedNewTree = new XMLSerializer().serializeToString(newTree);\n  // Remove the outer span before returning the string representation of the\n  // processed copy.\n  return serializedNewTree.slice(\n      serializedNewTree.indexOf('>') + 1, serializedNewTree.lastIndexOf('</'));\n};\n\n/**\n * Parses an HTML string and walks the resulting DOM forest to apply the\n * transformation function and generate a copy of the forest. Returns the forest\n * wrapped in a common SPAN parent, so that the result is always a tree.\n * @param {string} html\n * @return {!HTMLSpanElement}\n * @protected @final\n */\nSafeDomTreeProcessor.prototype.processToTree = function(html) {\n  if (!SAFE_PARSING_SUPPORTED) {\n    return googDom.createElement(TagName.SPAN);\n  }\n  var newRoot = googDom.createElement(TagName.SPAN);\n  // Allow subclasses to attach properties to the root.\n  this.processRoot(newRoot);\n\n  // Allow subclasses to pre-process the HTML string before performing the main\n  // tree-based transformation.\n  html = this.preProcessHtml(html);\n  var originalTreeWalker = getDomTreeWalker(html);\n\n  // Mapping from original nodes to new nodes, used to find the parent to which\n  // a newly processed node should be attached.\n  var elementMap = ElementWeakMap.newWeakMap();\n\n  var originalNode;\n  while (originalNode = originalTreeWalker.nextNode()) {\n    // Make a copy of the node, potentially dropping it or changing its content,\n    // tag name, etc.\n    var newNode = this.createNode_(originalNode);\n    if (!newNode) {\n      // The transformation function chose not to copy over the node. We delete\n      // the children so that the current treeWalker will stop iterating on\n      // them.\n      googDom.removeChildren(originalNode);\n      continue;\n    }\n    if (noclobber.isNodeElement(newNode)) {\n      elementMap.set(originalNode, newNode);\n    }\n\n    // Finds the new parent to which newNode should be appended. The tree is\n    // copied top-down, so the parent of the current node has already been\n    // copied and placed into the new tree. The new parent is either the root\n    // of the new tree or a node found using originalToNewElementMap.\n    var originalParent = noclobber.getParentNode(originalNode);\n    var isParentRoot = false;\n    if (originalParent) {\n      var originalParentNodeType = noclobber.getNodeType(originalParent);\n      var originalParentNodeName =\n          noclobber.getNodeName(originalParent).toLowerCase();\n      var originalGrandParent = noclobber.getParentNode(originalParent);\n      // The following checks if newParent is an immediate child of the inert\n      // parent template element.\n      if (originalParentNodeType == NodeType.DOCUMENT_FRAGMENT &&\n          !originalGrandParent) {\n        isParentRoot = true;\n      } else if (originalParentNodeName == 'body' && originalGrandParent) {\n        // The following checks if newParent is an immediate child of the\n        // inert parent HtmlDocument.\n        var dirtyGreatGrandParent =\n            noclobber.getParentNode(originalGrandParent);\n        if (dirtyGreatGrandParent &&\n            !noclobber.getParentNode(dirtyGreatGrandParent)) {\n          isParentRoot = true;\n        }\n      }\n      var newParent = null;\n      if (isParentRoot || !originalParent) {\n        newParent = newRoot;\n      } else if (noclobber.isNodeElement(originalParent)) {\n        newParent = elementMap.get(originalParent);\n      }\n      if (newParent.content) {\n        newParent = newParent.content;\n      }\n      newParent.appendChild(newNode);\n    }\n  }\n  if (elementMap.clear) {\n    // Clear the map. On browsers that don't support WeakMap, entries are not\n    // automatically cleaned up.\n    elementMap.clear();\n  }\n  return newRoot;\n};\n\n/**\n * Creates the root SPAN element for the new tree. This function can be\n * overridden to add attributes to the tag. Note that if any attributes are\n * added to the element, then {@link processToString} will not strip it from the\n * generated string to preserve the attributes.\n * @param {!HTMLSpanElement} newRoot\n * @protected @abstract\n */\nSafeDomTreeProcessor.prototype.processRoot = function(newRoot) {};\n\n/**\n * Pre-processes the input html before the main tree-based transformation.\n * @param {string} html\n * @return {string}\n * @protected @abstract\n */\nSafeDomTreeProcessor.prototype.preProcessHtml = function(html) {};\n\n/**\n * Returns a new node based on the transformation of an original node, or null\n * if the node and all its children should not be copied over to the new tree.\n * @param {!Node} originalNode\n * @return {?Node}\n * @private\n */\nSafeDomTreeProcessor.prototype.createNode_ = function(originalNode) {\n  var nodeType = noclobber.getNodeType(originalNode);\n  switch (nodeType) {\n    case NodeType.TEXT:\n      return this.createTextNode(/** @type {!Text} */ (originalNode));\n    case NodeType.ELEMENT:\n      return this.createElement_(noclobber.assertNodeIsElement(originalNode));\n    default:\n      googLog.warning(logger, 'Dropping unknown node type: ' + nodeType);\n      return null;\n  }\n};\n\n/**\n * Creates a new text node from the original text node, or null if the node\n * should not be copied over to the new tree.\n * @param {!Text} originalNode\n * @return {?Text}\n * @protected @abstract\n */\nSafeDomTreeProcessor.prototype.createTextNode = function(originalNode) {};\n\n/**\n * Creates a new element from the original element, potentially applying\n * transformations to the element's tagname and attributes.\n * @param {!Element} originalElement\n * @return {?Element}\n * @private\n */\nSafeDomTreeProcessor.prototype.createElement_ = function(originalElement) {\n  if (noclobber.getNodeName(originalElement).toUpperCase() == 'TEMPLATE') {\n    // Processing TEMPLATE tags is not supported, they are automatically\n    // dropped.\n    return null;\n  }\n  var newElement = this.createElementWithoutAttributes(originalElement);\n  if (!newElement) {\n    return null;\n  }\n  // Copy over element attributes, applying a transformation on each attribute.\n  this.processElementAttributes_(originalElement, newElement);\n  return newElement;\n};\n\n/**\n * Creates a new element from the original element. This function should only\n * either create a new element (optionally changing the tag name from the\n * original element) or return null to prevent the entire subtree from appearing\n * in the output. Note that TEMPLATE tags and their contents are automatically\n * dropped, and this function is not called to decide whether to keep them or\n * not.\n * @param {!Element} originalElement\n * @return {?Element}\n * @protected @abstract\n */\nSafeDomTreeProcessor.prototype.createElementWithoutAttributes = function(\n    originalElement) {};\n\n/**\n * Copies over the attributes of an original node to its corresponding new node\n * generated with {@link processNode}.\n * @param {!Element} originalElement\n * @param {!Element} newElement\n * @private\n */\nSafeDomTreeProcessor.prototype.processElementAttributes_ = function(\n    originalElement, newElement) {\n  var attributes = noclobber.getElementAttributes(originalElement);\n  if (attributes == null) {\n    return;\n  }\n  for (var i = 0, attribute; attribute = attributes[i]; i++) {\n    if (attribute.specified) {\n      var newValue = this.processElementAttribute(originalElement, attribute);\n      if (newValue !== null) {\n        noclobber.setElementAttribute(newElement, attribute.name, newValue);\n      }\n    }\n  }\n};\n\n/**\n * Returns the new value for an attribute, or null if the attribute should be\n * dropped.\n * @param {!Element} element\n * @param {!Attr} attribute\n * @return {?string}\n * @protected @abstract\n */\nSafeDomTreeProcessor.prototype.processElementAttribute = function(\n    element, attribute) {};\n\n/** @const {boolean} */\nSafeDomTreeProcessor.SAFE_PARSING_SUPPORTED = SAFE_PARSING_SUPPORTED;\nexports = SafeDomTreeProcessor;\n","^9I",1579837703000,"^9J",["^9K",["^;;","^=B","^9>","^@=","^:S","^;Q","^=M","^@B","^M3","~$goog.html.sanitizer.ElementWeakMap","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/sanitizer/safedomtreeprocessor.js"],"^:1",["^9K",["^M0"]],"^9<",true,"^9=",["^9>","^=M","^VA","^=B","^;=","^;;","^;Q","^M3","^@B","^@=","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.fs.url.js","^9C",["^9D","goog/fs/url.js"],"^9E","goog/fs/url.js","^9F","^9G","^9H","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Wrapper for URL and its createObjectUrl and revokeObjectUrl\n * methods that are part of the HTML5 File API.\n */\n\ngoog.provide('goog.fs.url');\n\n\n/**\n * Creates a blob URL for a blob object.\n * Throws an error if the browser does not support Object Urls.\n *\n * @param {!Blob} blob The object for which to create the URL.\n * @return {string} The URL for the object.\n */\ngoog.fs.url.createObjectUrl = function(blob) {\n  return goog.fs.url.getUrlObject_().createObjectURL(blob);\n};\n\n\n/**\n * Revokes a URL created by {@link goog.fs.url.createObjectUrl}.\n * Throws an error if the browser does not support Object Urls.\n *\n * @param {string} url The URL to revoke.\n */\ngoog.fs.url.revokeObjectUrl = function(url) {\n  goog.fs.url.getUrlObject_().revokeObjectURL(url);\n};\n\n\n/**\n * @typedef {{createObjectURL: (function(!Blob): string),\n *            revokeObjectURL: function(string): void}}\n */\ngoog.fs.url.UrlObject_;\n\n\n/**\n * Get the object that has the createObjectURL and revokeObjectURL functions for\n * this browser.\n *\n * @return {goog.fs.url.UrlObject_} The object for this browser.\n * @private\n */\ngoog.fs.url.getUrlObject_ = function() {\n  const urlObject = goog.fs.url.findUrlObject_();\n  if (urlObject != null) {\n    return urlObject;\n  } else {\n    throw new Error('This browser doesn\\'t seem to support blob URLs');\n  }\n};\n\n\n/**\n * Finds the object that has the createObjectURL and revokeObjectURL functions\n * for this browser.\n *\n * @return {?goog.fs.url.UrlObject_} The object for this browser or null if the\n *     browser does not support Object Urls.\n * @private\n */\ngoog.fs.url.findUrlObject_ = function() {\n  // This is what the spec says to do\n  // http://dev.w3.org/2006/webapi/FileAPI/#dfn-createObjectURL\n  if (goog.global.URL !== undefined &&\n      goog.global.URL.createObjectURL !== undefined) {\n    return /** @type {goog.fs.url.UrlObject_} */ (goog.global.URL);\n    // This is what Chrome does (as of 10.0.648.6 dev)\n  } else if (\n      goog.global.webkitURL !== undefined &&\n      goog.global.webkitURL.createObjectURL !== undefined) {\n    return /** @type {goog.fs.url.UrlObject_} */ (goog.global.webkitURL);\n    // This is what the spec used to say to do\n  } else if (goog.global.createObjectURL !== undefined) {\n    return /** @type {goog.fs.url.UrlObject_} */ (goog.global);\n  } else {\n    return null;\n  }\n};\n\n\n/**\n * Checks whether this browser supports Object Urls. If not, calls to\n * createObjectUrl and revokeObjectUrl will result in an error.\n *\n * @return {boolean} True if this browser supports Object Urls.\n */\ngoog.fs.url.browserSupportsObjectUrls = function() {\n  return goog.fs.url.findUrlObject_() != null;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fs/url.js"],"^:1",["^9K",["^V9"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.labs.net.webchannel.webchannelbase.js","^9C",["^9D","goog/labs/net/webchannel/webchannelbase.js"],"^9E","goog/labs/net/webchannel/webchannelbase.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Base WebChannel implementation.\n *\n */\n\n\ngoog.provide('goog.labs.net.webChannel.WebChannelBase');\n\ngoog.require('goog.Uri');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.async.run');\ngoog.require('goog.json');\ngoog.require('goog.labs.net.webChannel.BaseTestChannel');\ngoog.require('goog.labs.net.webChannel.Channel');\ngoog.require('goog.labs.net.webChannel.ChannelRequest');\ngoog.require('goog.labs.net.webChannel.ConnectionState');\ngoog.require('goog.labs.net.webChannel.ForwardChannelRequestPool');\ngoog.require('goog.labs.net.webChannel.WebChannelDebug');\ngoog.require('goog.labs.net.webChannel.Wire');\ngoog.require('goog.labs.net.webChannel.WireV8');\ngoog.require('goog.labs.net.webChannel.netUtils');\ngoog.require('goog.labs.net.webChannel.requestStats');\ngoog.require('goog.net.WebChannel');\ngoog.require('goog.net.XhrIo');\ngoog.require('goog.net.XmlHttpFactory');\ngoog.require('goog.net.rpc.HttpCors');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.structs');\n\ngoog.scope(function() {\nvar WebChannel = goog.net.WebChannel;\nvar BaseTestChannel = goog.labs.net.webChannel.BaseTestChannel;\nvar ChannelRequest = goog.labs.net.webChannel.ChannelRequest;\nvar ConnectionState = goog.labs.net.webChannel.ConnectionState;\nvar ForwardChannelRequestPool =\n    goog.labs.net.webChannel.ForwardChannelRequestPool;\nvar WebChannelDebug = goog.labs.net.webChannel.WebChannelDebug;\nvar Wire = goog.labs.net.webChannel.Wire;\nvar WireV8 = goog.labs.net.webChannel.WireV8;\nvar netUtils = goog.labs.net.webChannel.netUtils;\nvar requestStats = goog.labs.net.webChannel.requestStats;\n\nvar httpCors = goog.module.get('goog.net.rpc.HttpCors');\n\n\n/**\n * This WebChannel implementation is branched off goog.net.BrowserChannel\n * for now. Ongoing changes to goog.net.BrowserChannel will be back\n * ported to this implementation as needed.\n *\n * @param {!goog.net.WebChannel.Options=} opt_options Configuration for the\n *        WebChannel instance.\n * @param {number=} opt_clientVersion An application-specific version number\n *        that is sent to the server when connected.\n * @param {!ConnectionState=} opt_conn Previously determined connection\n *        conditions.\n * @constructor\n * @struct\n * @implements {goog.labs.net.webChannel.Channel}\n */\ngoog.labs.net.webChannel.WebChannelBase = function(\n    opt_options, opt_clientVersion, opt_conn) {\n  /**\n   * The client library version (capabilities).\n   * @private {number}\n   */\n  this.clientVersion_ = opt_clientVersion || 0;\n\n  /**\n   * The server library version (capabilities).\n   * @private {number}\n   */\n  this.serverVersion_ = 0;\n\n\n  /**\n   * An array of queued maps that need to be sent to the server.\n   * @private {!Array<Wire.QueuedMap>}\n   */\n  this.outgoingMaps_ = [];\n\n  /**\n   * The channel debug used for logging\n   * @private {!WebChannelDebug}\n   */\n  this.channelDebug_ = new WebChannelDebug();\n\n  /**\n   * Previous connectivity test results.\n   * @private {!ConnectionState}\n   */\n  this.connState_ = opt_conn || new ConnectionState();\n\n  /**\n   * Extra HTTP headers to add to all the requests sent to the server.\n   * @private {?Object}\n   */\n  this.extraHeaders_ = null;\n\n  /**\n   * Extra HTTP headers to add to the init request(s) sent to the server.\n   * @private {?Object}\n   */\n  this.initHeaders_ = null;\n\n  /**\n   * @private {?string} The URL param name to overwrite custom HTTP headers\n   * to bypass CORS preflight.\n   */\n  this.httpHeadersOverwriteParam_ = null;\n\n  /**\n   * Extra parameters to add to all the requests sent to the server.\n   * @private {?Object}\n   */\n  this.extraParams_ = null;\n\n  /**\n   * Parameter name for the http session id.\n   * @private {?string}\n   */\n  this.httpSessionIdParam_ = null;\n\n  /**\n   * The http session id, to be sent with httpSessionIdParam_ with each\n   * request after the initial handshake.\n   * @private {?string}\n   */\n  this.httpSessionId_ = null;\n\n  /**\n   * The ChannelRequest object for the backchannel.\n   * @private {?ChannelRequest}\n   */\n  this.backChannelRequest_ = null;\n\n  /**\n   * The relative path (in the context of the the page hosting the browser\n   * channel) for making requests to the server.\n   * @private {?string}\n   */\n  this.path_ = null;\n\n  /**\n   * The absolute URI for the forwardchannel request.\n   * @private {?goog.Uri}\n   */\n  this.forwardChannelUri_ = null;\n\n  /**\n   * The absolute URI for the backchannel request.\n   * @private {?goog.Uri}\n   */\n  this.backChannelUri_ = null;\n\n  /**\n   * A subdomain prefix for using a subdomain in IE for the backchannel\n   * requests.\n   * @private {?string}\n   */\n  this.hostPrefix_ = null;\n\n  /**\n   * Whether we allow the use of a subdomain in IE for the backchannel requests.\n   * @private {boolean}\n   */\n  this.allowHostPrefix_ = true;\n\n  /**\n   * The next id to use for the RID (request identifier) parameter. This\n   * identifier uniquely identifies the forward channel request.\n   * @private {number}\n   */\n  this.nextRid_ = 0;\n\n  /**\n   * The id to use for the next outgoing map. This identifier uniquely\n   * identifies a sent map.\n   * @private {number}\n   */\n  this.nextMapId_ = 0;\n\n  /**\n   * Whether to fail forward-channel requests after one try or a few tries.\n   * @private {boolean}\n   */\n  this.failFast_ =\n      !!goog.getObjectByName('internalChannelParams.failFast', opt_options);\n\n  /**\n   * The handler that receive callbacks for state changes and data.\n   * @private {?goog.labs.net.webChannel.WebChannelBase.Handler}\n   */\n  this.handler_ = null;\n\n  /**\n   * Timer identifier for asynchronously making a forward channel request.\n   * This is set to true if the func is scheduled with async.run, which\n   * is equivalent to setTimeout(0).\n   * @private {?number|?boolean}\n   */\n  this.forwardChannelTimerId_ = null;\n\n  /**\n   * Timer identifier for asynchronously making a back channel request.\n   * @private {?number}\n   */\n  this.backChannelTimerId_ = null;\n\n  /**\n   * Timer identifier for the timer that waits for us to retry the backchannel\n   * in the case where it is dead and no longer receiving data.\n   * @private {?number}\n   */\n  this.deadBackChannelTimerId_ = null;\n\n  /**\n   * The TestChannel object which encapsulates the logic for determining\n   * interesting network conditions about the client.\n   * @private {?BaseTestChannel}\n   */\n  this.connectionTest_ = null;\n\n  /**\n   * Whether the client's network conditions can support chunked responses.\n   * @private {?boolean}\n   */\n  this.useChunked_ = null;\n\n  /**\n   * Whether chunked mode is allowed. In certain debugging situations, it's\n   * useful to disable this.\n   * @private {boolean}\n   */\n  this.allowChunkedMode_ = true;\n\n  /**\n   * The array identifier of the last array received from the server for the\n   * backchannel request.\n   * @private {number}\n   */\n  this.lastArrayId_ = -1;\n\n  /**\n   * The array id of the last array sent by the server that we know about.\n   * @private {number}\n   */\n  this.lastPostResponseArrayId_ = -1;\n\n  /**\n   * The last status code received.\n   * @private {number}\n   */\n  this.lastStatusCode_ = -1;\n\n  /**\n   * Number of times we have retried the current forward channel request.\n   * @private {number}\n   */\n  this.forwardChannelRetryCount_ = 0;\n\n  /**\n   * Number of times in a row that we have retried the current back channel\n   * request and received no data.\n   * @private {number}\n   */\n  this.backChannelRetryCount_ = 0;\n\n  /**\n   * The attempt id for the current back channel request. Starts at 1 and\n   * increments for each reconnect. The server uses this to log if our\n   * connection is flaky or not.\n   * @private {number}\n   */\n  this.backChannelAttemptId_ = 0;\n\n  /**\n   * The base part of the time before firing next retry request. Default is 5\n   * seconds. Note that a random delay is added (see {@link retryDelaySeedMs_})\n   * for all retries, and linear backoff is applied to the sum for subsequent\n   * retries.\n   * @private {number}\n   */\n  this.baseRetryDelayMs_ =\n      goog.getObjectByName(\n          'internalChannelParams.baseRetryDelayMs', opt_options) ||\n      5 * 1000;\n\n  /**\n   * A random time between 0 and this number of MS is added to the\n   * {@link baseRetryDelayMs_}. Default is 10 seconds.\n   * @private {number}\n   */\n  this.retryDelaySeedMs_ =\n      goog.getObjectByName(\n          'internalChannelParams.retryDelaySeedMs', opt_options) ||\n      10 * 1000;\n\n  /**\n   * Maximum number of attempts to connect to the server for forward channel\n   * requests. Defaults to 2.\n   * @private {number}\n   */\n  this.forwardChannelMaxRetries_ =\n      goog.getObjectByName(\n          'internalChannelParams.forwardChannelMaxRetries', opt_options) ||\n      2;\n\n  /**\n   * The timeout in milliseconds for a forward channel request. Defaults to 20\n   * seconds. Note that part of this timeout can be randomized.\n   * @private {number}\n   */\n  this.forwardChannelRequestTimeoutMs_ =\n      goog.getObjectByName(\n          'internalChannelParams.forwardChannelRequestTimeoutMs',\n          opt_options) ||\n      20 * 1000;\n\n  /**\n   * The custom factory used to create XMLHttpRequest objects.\n   * @private {!goog.net.XmlHttpFactory | undefined}\n   */\n  this.xmlHttpFactory_ =\n      (opt_options && opt_options.xmlHttpFactory) || undefined;\n\n  /**\n   * The timeout in milliseconds for a back channel request. Defaults to using\n   * the timeout configured in ChannelRequest (45s). If server-side\n   * keepaliveInterval is known to the client, set the backchannel request\n   * timeout to 1.5 * keepaliveInterval (ms).\n   *\n   * @private {number|undefined}\n   */\n  this.backChannelRequestTimeoutMs_ = undefined;\n\n  /**\n   * A throttle time in ms for readystatechange events for the backchannel.\n   * Useful for throttling when ready state is INTERACTIVE (partial data).\n   *\n   * This throttle is useful if the server sends large data chunks down the\n   * backchannel.  It prevents examining XHR partial data on every readystate\n   * change event.  This is useful because large chunks can trigger hundreds\n   * of readystatechange events, each of which takes ~5ms or so to handle,\n   * in turn making the UI unresponsive for a significant period.\n   *\n   * If set to zero no throttle is used.\n   * @private {number}\n   */\n  this.readyStateChangeThrottleMs_ = 0;\n\n  /**\n   * Whether cross origin requests are supported for the channel.\n   *\n   * See {@link goog.net.XhrIo#setWithCredentials}.\n   * @private {boolean}\n   */\n  this.supportsCrossDomainXhrs_ =\n      (opt_options && opt_options.supportsCrossDomainXhr) || false;\n\n  /**\n   * The current session id.\n   * @private {string}\n   */\n  this.sid_ = '';\n\n  /**\n   * The current ChannelRequest pool for the forward channel.\n   * @private {!ForwardChannelRequestPool}\n   */\n  this.forwardChannelRequestPool_ = new ForwardChannelRequestPool(\n      opt_options && opt_options.concurrentRequestLimit);\n\n  /**\n   * The V8 codec.\n   * @private {!WireV8}\n   */\n  this.wireCodec_ = new WireV8();\n\n  /**\n   * Whether to run the channel test as a background process to not block\n   * the OPEN event.\n   *\n   * @private {boolean}\n   */\n  this.backgroundChannelTest_ =\n      opt_options && opt_options.backgroundChannelTest !== undefined ?\n      opt_options.backgroundChannelTest :\n      true;\n\n  /**\n   * Whether to turn on the fast handshake behavior.\n   *\n   * @private {boolean}\n   */\n  this.fastHandshake_ = (opt_options && opt_options.fastHandshake) || false;\n\n  if (this.fastHandshake_ && !this.backgroundChannelTest_) {\n    this.channelDebug_.warning(\n        'Force backgroundChannelTest when fastHandshake is enabled.');\n    this.backgroundChannelTest_ = true;\n  }\n\n  if (opt_options && opt_options.disableRedact) {\n    this.channelDebug_.disableRedact();\n  }\n\n  if (opt_options && opt_options.forceLongPolling) {\n    this.allowChunkedMode_ = false;\n  }\n\n  /**\n   * Callback when all the pending client-sent messages have been flushed.\n   *\n   * @private {function()|undefined}\n   */\n  this.forwardChannelFlushedCallback_ = undefined;\n};\n\nvar WebChannelBase = goog.labs.net.webChannel.WebChannelBase;\n\n\n/**\n * The channel version that we negotiated with the server for this session.\n * Starts out as the version we request, and then is changed to the negotiated\n * version after the initial open.\n * @private {number}\n */\nWebChannelBase.prototype.channelVersion_ = Wire.LATEST_CHANNEL_VERSION;\n\n\n/**\n * Enum type for the channel state machine.\n * @enum {number}\n */\nWebChannelBase.State = {\n  /** The channel is closed. */\n  CLOSED: 0,\n\n  /** The channel has been initialized but hasn't yet initiated a connection. */\n  INIT: 1,\n\n  /** The channel is in the process of opening a connection to the server. */\n  OPENING: 2,\n\n  /** The channel is open. */\n  OPENED: 3\n};\n\n\n/**\n * The current state of the WebChannel.\n * @private {!WebChannelBase.State}\n */\nWebChannelBase.prototype.state_ = WebChannelBase.State.INIT;\n\n\n/**\n * The timeout in milliseconds for a forward channel request.\n * @type {number}\n */\nWebChannelBase.FORWARD_CHANNEL_RETRY_TIMEOUT = 20 * 1000;\n\n\n/**\n * Maximum number of attempts to connect to the server for back channel\n * requests.\n * @type {number}\n */\nWebChannelBase.BACK_CHANNEL_MAX_RETRIES = 3;\n\n\n/**\n * A number in MS of how long we guess the maxmium amount of time a round trip\n * to the server should take. In the future this could be substituted with a\n * real measurement of the RTT.\n * @type {number}\n */\nWebChannelBase.RTT_ESTIMATE = 3 * 1000;\n\n\n/**\n * When retrying for an inactive channel, we will multiply the total delay by\n * this number.\n * @type {number}\n */\nWebChannelBase.INACTIVE_CHANNEL_RETRY_FACTOR = 2;\n\n\n/**\n * Enum type for identifying an error.\n * @enum {number}\n */\nWebChannelBase.Error = {\n  /** Value that indicates no error has occurred. */\n  OK: 0,\n\n  /** An error due to a request failing. */\n  REQUEST_FAILED: 2,\n\n  /** An error due to the user being logged out. */\n  LOGGED_OUT: 4,\n\n  /** An error due to server response which contains no data. */\n  NO_DATA: 5,\n\n  /** An error due to a server response indicating an unknown session id */\n  UNKNOWN_SESSION_ID: 6,\n\n  /** An error due to a server response requesting to stop the channel. */\n  STOP: 7,\n\n  /** A general network error. */\n  NETWORK: 8,\n\n  /** An error due to bad data being returned from the server. */\n  BAD_DATA: 10,\n\n  /** An error due to a response that is not parsable. */\n  BAD_RESPONSE: 11\n};\n\n\n/**\n * Internal enum type for the two channel types.\n * @enum {number}\n * @private\n */\nWebChannelBase.ChannelType_ = {\n  FORWARD_CHANNEL: 1,\n\n  BACK_CHANNEL: 2\n};\n\n\n/**\n * The maximum number of maps that can be sent in one POST. Should match\n * MAX_MAPS_PER_REQUEST on the server code.\n * @type {number}\n * @private\n */\nWebChannelBase.MAX_MAPS_PER_REQUEST_ = 1000;\n\n\n/**\n * The maximum number of utf-8 chars that can be sent in one GET to enable 0-RTT\n * handshake.\n *\n *  @const @private {number}\n */\nWebChannelBase.MAX_CHARS_PER_GET_ = 4 * 1024;\n\n\n/**\n * A guess at a cutoff at which to no longer assume the backchannel is dead\n * when we are slow to receive data. Number in bytes.\n *\n * Assumption: The worst bandwidth we work on is 50 kilobits/sec\n * 50kbits/sec * (1 byte / 8 bits) * 6 sec dead backchannel timeout\n * @type {number}\n */\nWebChannelBase.OUTSTANDING_DATA_BACKCHANNEL_RETRY_CUTOFF = 37500;\n\n\n/**\n * @return {number} The server version or 0 if undefined\n */\nWebChannelBase.prototype.getServerVersion = function() {\n  return this.serverVersion_;\n};\n\n\n/**\n * @return {!ForwardChannelRequestPool} The forward channel request pool.\n */\nWebChannelBase.prototype.getForwardChannelRequestPool = function() {\n  return this.forwardChannelRequestPool_;\n};\n\n\n/**\n * @return {!Object} The codec object, to be used for the test channel.\n */\nWebChannelBase.prototype.getWireCodec = function() {\n  return this.wireCodec_;\n};\n\n\n/**\n * Returns the logger.\n *\n * @return {!WebChannelDebug} The channel debug object.\n */\nWebChannelBase.prototype.getChannelDebug = function() {\n  return this.channelDebug_;\n};\n\n\n/**\n * Sets the logger.\n *\n * @param {!WebChannelDebug} channelDebug The channel debug object.\n */\nWebChannelBase.prototype.setChannelDebug = function(channelDebug) {\n  this.channelDebug_ = channelDebug;\n};\n\n\n/**\n * Starts the channel. This initiates connections to the server.\n *\n * @param {string} testPath  The path for the test connection.\n * @param {string} channelPath  The path for the channel connection.\n * @param {!Object=} opt_extraParams Extra parameter keys and values to add to\n *     the requests.\n * @param {string=} opt_oldSessionId  Session ID from a previous session.\n * @param {number=} opt_oldArrayId  The last array ID from a previous session.\n */\nWebChannelBase.prototype.connect = function(\n    testPath, channelPath, opt_extraParams, opt_oldSessionId, opt_oldArrayId) {\n  this.channelDebug_.debug('connect()');\n\n  requestStats.notifyStatEvent(requestStats.Stat.CONNECT_ATTEMPT);\n\n  this.path_ = channelPath;\n  this.extraParams_ = opt_extraParams || {};\n\n  // Attach parameters about the previous session if reconnecting.\n  if (opt_oldSessionId && opt_oldArrayId !== undefined) {\n    this.extraParams_['OSID'] = opt_oldSessionId;\n    this.extraParams_['OAID'] = opt_oldArrayId;\n  }\n\n  if (this.backgroundChannelTest_) {\n    this.channelDebug_.debug('connect() bypassed channel-test.');\n    this.connState_.handshakeResult = [];\n    this.connState_.bufferingProxyResult = false;\n\n    // TODO(user): merge states with background channel test\n    // requestStats.setTimeout(goog.bind(this.connectTest_, this, testPath), 0);\n    //     this.connectChannel_();\n  }\n\n  this.connectTest_(testPath);\n};\n\n\n/**\n * Disconnects and closes the channel.\n */\nWebChannelBase.prototype.disconnect = function() {\n  this.channelDebug_.debug('disconnect()');\n\n  this.cancelRequests_();\n\n  if (this.state_ == WebChannelBase.State.OPENED) {\n    var rid = this.nextRid_++;\n    var uri = this.forwardChannelUri_.clone();\n    uri.setParameterValue('SID', this.sid_);\n    uri.setParameterValue('RID', rid);\n    uri.setParameterValue('TYPE', 'terminate');\n\n    // Add the reconnect parameters.\n    this.addAdditionalParams_(uri);\n\n    var request = ChannelRequest.createChannelRequest(\n        this, this.channelDebug_, this.sid_, rid);\n    request.sendCloseRequest(uri);\n  }\n\n  this.onClose_();\n};\n\n\n/**\n * Returns the session id of the channel. Only available after the\n * channel has been opened.\n * @return {string} Session ID.\n */\nWebChannelBase.prototype.getSessionId = function() {\n  return this.sid_;\n};\n\n\n/**\n * Starts the test channel to determine network conditions.\n *\n * @param {string} testPath  The relative PATH for the test connection.\n * @private\n */\nWebChannelBase.prototype.connectTest_ = function(testPath) {\n  this.channelDebug_.debug('connectTest_()');\n  if (!this.okToMakeRequest_()) {\n    return;  // channel is cancelled\n  }\n  this.connectionTest_ = new BaseTestChannel(this, this.channelDebug_);\n\n  if (this.httpHeadersOverwriteParam_ === null) {\n    this.connectionTest_.setExtraHeaders(this.extraHeaders_);\n  }\n\n  var urlPath = testPath;\n  if (this.httpHeadersOverwriteParam_ && this.extraHeaders_) {\n    urlPath = httpCors.setHttpHeadersWithOverwriteParam(\n        testPath, this.httpHeadersOverwriteParam_, this.extraHeaders_);\n  }\n\n  this.connectionTest_.connect(/** @type {string} */ (urlPath));\n};\n\n\n/**\n * Starts the regular channel which is run after the test channel is complete.\n * @private\n */\nWebChannelBase.prototype.connectChannel_ = function() {\n  this.channelDebug_.debug('connectChannel_()');\n  this.ensureInState_(WebChannelBase.State.INIT, WebChannelBase.State.CLOSED);\n  this.forwardChannelUri_ =\n      this.getForwardChannelUri(/** @type {string} */ (this.path_));\n  this.ensureForwardChannel_();\n};\n\n\n/**\n * Cancels all outstanding requests.\n * @private\n */\nWebChannelBase.prototype.cancelRequests_ = function() {\n  if (this.connectionTest_) {\n    this.connectionTest_.abort();\n    this.connectionTest_ = null;\n  }\n\n  if (this.backChannelRequest_) {\n    this.backChannelRequest_.cancel();\n    this.backChannelRequest_ = null;\n  }\n\n  if (this.backChannelTimerId_) {\n    goog.global.clearTimeout(this.backChannelTimerId_);\n    this.backChannelTimerId_ = null;\n  }\n\n  this.clearDeadBackchannelTimer_();\n\n  this.forwardChannelRequestPool_.cancel();\n\n  if (this.forwardChannelTimerId_) {\n    this.clearForwardChannelTimer_();\n  }\n};\n\n\n/**\n * Clears the forward channel timer.\n * @private\n */\nWebChannelBase.prototype.clearForwardChannelTimer_ = function() {\n  if (typeof this.forwardChannelTimerId_ === 'number') {\n    goog.global.clearTimeout(this.forwardChannelTimerId_);\n  }\n\n  this.forwardChannelTimerId_ = null;\n};\n\n\n/**\n * Returns the extra HTTP headers to add to all the requests sent to the server.\n *\n * @return {Object} The HTTP headers, or null.\n */\nWebChannelBase.prototype.getExtraHeaders = function() {\n  return this.extraHeaders_;\n};\n\n\n/**\n * Sets extra HTTP headers to add to all the requests sent to the server.\n *\n * @param {Object} extraHeaders The HTTP headers, or null.\n */\nWebChannelBase.prototype.setExtraHeaders = function(extraHeaders) {\n  this.extraHeaders_ = extraHeaders;\n};\n\n\n/**\n * Returns the extra HTTP headers to add to the init requests\n * sent to the server.\n *\n * @return {Object} The HTTP headers, or null.\n */\nWebChannelBase.prototype.getInitHeaders = function() {\n  return this.initHeaders_;\n};\n\n\n/**\n * Sets extra HTTP headers to add to the init requests sent to the server.\n *\n * @param {Object} initHeaders The HTTP headers, or null.\n */\nWebChannelBase.prototype.setInitHeaders = function(initHeaders) {\n  this.initHeaders_ = initHeaders;\n};\n\n\n/**\n * Sets the URL param name to overwrite custom HTTP headers.\n *\n * @param {string} httpHeadersOverwriteParam The URL param name.\n */\nWebChannelBase.prototype.setHttpHeadersOverwriteParam = function(\n    httpHeadersOverwriteParam) {\n  this.httpHeadersOverwriteParam_ = httpHeadersOverwriteParam;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.setHttpSessionIdParam = function(httpSessionIdParam) {\n  this.httpSessionIdParam_ = httpSessionIdParam;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.getHttpSessionIdParam = function() {\n  return this.httpSessionIdParam_;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.setHttpSessionId = function(httpSessionId) {\n  this.httpSessionId_ = httpSessionId;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.getHttpSessionId = function() {\n  return this.httpSessionId_;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.getBackgroundChannelTest = function() {\n  return this.backgroundChannelTest_;\n};\n\n\n/**\n * Sets the throttle for handling onreadystatechange events for the request.\n *\n * @param {number} throttle The throttle in ms.  A value of zero indicates\n *     no throttle.\n */\nWebChannelBase.prototype.setReadyStateChangeThrottle = function(throttle) {\n  this.readyStateChangeThrottleMs_ = throttle;\n};\n\n\n/**\n * Sets whether cross origin requests are supported for the channel.\n *\n * Setting this allows the creation of requests to secondary domains and\n * sends XHRs with the CORS withCredentials bit set to true.\n *\n * In order for cross-origin requests to work, the server will also need to set\n * CORS response headers as per:\n * https://developer.mozilla.org/en-US/docs/HTTP_access_control\n *\n * See {@link goog.net.XhrIo#setWithCredentials}.\n * @param {boolean} supportCrossDomain Whether cross domain XHRs are supported.\n */\nWebChannelBase.prototype.setSupportsCrossDomainXhrs = function(\n    supportCrossDomain) {\n  this.supportsCrossDomainXhrs_ = supportCrossDomain;\n};\n\n\n/**\n * Returns the handler used for channel callback events.\n *\n * @return {WebChannelBase.Handler} The handler.\n */\nWebChannelBase.prototype.getHandler = function() {\n  return this.handler_;\n};\n\n\n/**\n * Sets the handler used for channel callback events.\n * @param {WebChannelBase.Handler} handler The handler to set.\n */\nWebChannelBase.prototype.setHandler = function(handler) {\n  this.handler_ = handler;\n};\n\n\n/**\n * Returns whether the channel allows the use of a subdomain. There may be\n * cases where this isn't allowed.\n * @return {boolean} Whether a host prefix is allowed.\n */\nWebChannelBase.prototype.getAllowHostPrefix = function() {\n  return this.allowHostPrefix_;\n};\n\n\n/**\n * Sets whether the channel allows the use of a subdomain. There may be cases\n * where this isn't allowed, for example, logging in with troutboard where\n * using a subdomain causes Apache to force the user to authenticate twice.\n * @param {boolean} allowHostPrefix Whether a host prefix is allowed.\n */\nWebChannelBase.prototype.setAllowHostPrefix = function(allowHostPrefix) {\n  this.allowHostPrefix_ = allowHostPrefix;\n};\n\n\n/**\n * Returns whether the channel is buffered or not. This state is valid for\n * querying only after the test connection has completed. This may be\n * queried in the WebChannelBase.okToMakeRequest() callback.\n * A channel may be buffered if the test connection determines that\n * a chunked response could not be sent down within a suitable time.\n * @return {boolean} Whether the channel is buffered.\n */\nWebChannelBase.prototype.isBuffered = function() {\n  return !this.useChunked_;\n};\n\n\n/**\n * Returns whether chunked mode is allowed. In certain debugging situations,\n * it's useful for the application to have a way to disable chunked mode for a\n * user.\n\n * @return {boolean} Whether chunked mode is allowed.\n */\nWebChannelBase.prototype.getAllowChunkedMode = function() {\n  return this.allowChunkedMode_;\n};\n\n\n/**\n * Sets whether chunked mode is allowed. In certain debugging situations, it's\n * useful for the application to have a way to disable chunked mode for a user.\n * @param {boolean} allowChunkedMode  Whether chunked mode is allowed.\n */\nWebChannelBase.prototype.setAllowChunkedMode = function(allowChunkedMode) {\n  this.allowChunkedMode_ = allowChunkedMode;\n};\n\n\n/**\n * Sends a request to the server. The format of the request is a Map data\n * structure of key/value pairs. These maps are then encoded in a format\n * suitable for the wire and then reconstituted as a Map data structure that\n * the server can process.\n * @param {!Object|!goog.structs.Map} map The map to send.\n * @param {!Object=} opt_context The context associated with the map.\n */\nWebChannelBase.prototype.sendMap = function(map, opt_context) {\n  goog.asserts.assert(\n      this.state_ != WebChannelBase.State.CLOSED,\n      'Invalid operation: sending map when state is closed');\n\n  // We can only send 1000 maps per POST, but typically we should never have\n  // that much to send, so warn if we exceed that (we still send all the maps).\n  if (this.outgoingMaps_.length == WebChannelBase.MAX_MAPS_PER_REQUEST_) {\n    // severe() is temporary so that we get these uploaded and can figure out\n    // what's causing them. Afterwards can change to warning().\n    this.channelDebug_.severe(function() {\n      return 'Already have ' + WebChannelBase.MAX_MAPS_PER_REQUEST_ +\n          ' queued maps upon queueing ' + goog.json.serialize(map);\n    });\n  }\n\n  this.outgoingMaps_.push(\n      new Wire.QueuedMap(this.nextMapId_++, map, opt_context));\n\n  // Messages need be buffered during OPENING to avoid server-side race\n  if (this.state_ == WebChannelBase.State.OPENED) {\n    this.ensureForwardChannel_();\n  }\n};\n\n\n/**\n * When set to true, this changes the behavior of the forward channel so it\n * will not retry requests; it will fail after one network failure, and if\n * there was already one network failure, the request will fail immediately.\n * @param {boolean} failFast  Whether or not to fail fast.\n */\nWebChannelBase.prototype.setFailFast = function(failFast) {\n  this.failFast_ = failFast;\n  this.channelDebug_.info('setFailFast: ' + failFast);\n  if ((this.forwardChannelRequestPool_.hasPendingRequest() ||\n       this.forwardChannelTimerId_) &&\n      this.forwardChannelRetryCount_ > this.getForwardChannelMaxRetries()) {\n    var self = this;\n    this.channelDebug_.info(function() {\n      return 'Retry count ' + self.forwardChannelRetryCount_ +\n          ' > new maxRetries ' + self.getForwardChannelMaxRetries() +\n          '. Fail immediately!';\n    });\n\n    if (!this.forwardChannelRequestPool_.forceComplete(\n            goog.bind(this.onRequestComplete, this))) {\n      // i.e., this.forwardChannelTimerId_\n      this.clearForwardChannelTimer_();\n      // The error code from the last failed request is gone, so just use a\n      // generic one.\n      this.signalError_(WebChannelBase.Error.REQUEST_FAILED);\n    }\n  }\n};\n\n\n/**\n * @return {number} The max number of forward-channel retries, which will be 0\n * in fail-fast mode.\n */\nWebChannelBase.prototype.getForwardChannelMaxRetries = function() {\n  return this.failFast_ ? 0 : this.forwardChannelMaxRetries_;\n};\n\n\n/**\n * Sets the maximum number of attempts to connect to the server for forward\n * channel requests.\n * @param {number} retries The maximum number of attempts.\n */\nWebChannelBase.prototype.setForwardChannelMaxRetries = function(retries) {\n  this.forwardChannelMaxRetries_ = retries;\n};\n\n\n/**\n * Sets the timeout for a forward channel request.\n * @param {number} timeoutMs The timeout in milliseconds.\n */\nWebChannelBase.prototype.setForwardChannelRequestTimeout = function(timeoutMs) {\n  this.forwardChannelRequestTimeoutMs_ = timeoutMs;\n};\n\n\n/**\n * @return {number} The max number of back-channel retries, which is a constant.\n */\nWebChannelBase.prototype.getBackChannelMaxRetries = function() {\n  // Back-channel retries is a constant.\n  return WebChannelBase.BACK_CHANNEL_MAX_RETRIES;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.isClosed = function() {\n  return this.state_ == WebChannelBase.State.CLOSED;\n};\n\n\n/**\n * Returns the channel state.\n * @return {WebChannelBase.State} The current state of the channel.\n */\nWebChannelBase.prototype.getState = function() {\n  return this.state_;\n};\n\n\n/**\n * Return the last status code received for a request.\n * @return {number} The last status code received for a request.\n */\nWebChannelBase.prototype.getLastStatusCode = function() {\n  return this.lastStatusCode_;\n};\n\n\n/**\n * @return {number} The last array id received.\n */\nWebChannelBase.prototype.getLastArrayId = function() {\n  return this.lastArrayId_;\n};\n\n\n/**\n * Returns whether there are outstanding requests servicing the channel.\n * @return {boolean} true if there are outstanding requests.\n */\nWebChannelBase.prototype.hasOutstandingRequests = function() {\n  return this.getOutstandingRequests_() != 0;\n};\n\n\n/**\n * Returns the number of outstanding requests.\n * @return {number} The number of outstanding requests to the server.\n * @private\n */\nWebChannelBase.prototype.getOutstandingRequests_ = function() {\n  var count = 0;\n  if (this.backChannelRequest_) {\n    count++;\n  }\n  count += this.forwardChannelRequestPool_.getRequestCount();\n  return count;\n};\n\n\n/**\n * Ensures that a forward channel request is scheduled.\n * @private\n */\nWebChannelBase.prototype.ensureForwardChannel_ = function() {\n  if (this.forwardChannelRequestPool_.isFull()) {\n    // enough connection in process - no need to start a new request\n    return;\n  }\n\n  if (this.forwardChannelTimerId_) {\n    // no need to start a new request - one is already scheduled\n    return;\n  }\n\n  // Use async.run instead of setTimeout(0) to avoid the 1s message delay\n  // from chrome/firefox background tabs\n  this.forwardChannelTimerId_ = true;\n  goog.async.run(this.onStartForwardChannelTimer_, this);\n\n  this.forwardChannelRetryCount_ = 0;\n};\n\n\n/**\n * Schedules a forward-channel retry for the specified request, unless the max\n * retries has been reached.\n * @param {!ChannelRequest} request The failed request to retry.\n * @return {boolean} true iff a retry was scheduled.\n * @private\n */\nWebChannelBase.prototype.maybeRetryForwardChannel_ = function(request) {\n  if (this.forwardChannelRequestPool_.getRequestCount() >=\n      this.forwardChannelRequestPool_.getMaxSize() -\n          (this.forwardChannelTimerId_ ? 1 : 0)) {\n    // Should be impossible to be called in this state.\n    this.channelDebug_.severe('Unexpected retry request is scheduled.');\n    return false;\n  }\n\n  if (this.forwardChannelTimerId_) {\n    this.channelDebug_.debug(\n        'Use the retry request that is already scheduled.');\n    this.outgoingMaps_ =\n        request.getPendingMessages().concat(this.outgoingMaps_);\n    return true;\n  }\n\n  // No retry for open_() and fail-fast\n  if (this.state_ == WebChannelBase.State.INIT ||\n      this.state_ == WebChannelBase.State.OPENING ||\n      (this.forwardChannelRetryCount_ >= this.getForwardChannelMaxRetries())) {\n    return false;\n  }\n\n  this.channelDebug_.debug('Going to retry POST');\n\n  this.forwardChannelTimerId_ = requestStats.setTimeout(\n      goog.bind(this.onStartForwardChannelTimer_, this, request),\n      this.getRetryTime_(this.forwardChannelRetryCount_));\n  this.forwardChannelRetryCount_++;\n  return true;\n};\n\n\n/**\n * Timer callback for ensureForwardChannel\n * @param {ChannelRequest=} opt_retryRequest A failed request\n * to retry.\n * @private\n */\nWebChannelBase.prototype.onStartForwardChannelTimer_ = function(\n    opt_retryRequest) {\n  // null is possible if scheduled with async.run\n  if (this.forwardChannelTimerId_) {\n    this.forwardChannelTimerId_ = null;\n    this.startForwardChannel_(opt_retryRequest);\n  }\n};\n\n\n/**\n * Begins a new forward channel operation to the server.\n * @param {ChannelRequest=} opt_retryRequest A failed request to retry.\n * @private\n */\nWebChannelBase.prototype.startForwardChannel_ = function(opt_retryRequest) {\n  this.channelDebug_.debug('startForwardChannel_');\n  if (!this.okToMakeRequest_()) {\n    return;  // channel is cancelled\n  } else if (this.state_ == WebChannelBase.State.INIT) {\n    if (opt_retryRequest) {\n      this.channelDebug_.severe('Not supposed to retry the open');\n      return;\n    }\n    this.open_();\n    this.state_ = WebChannelBase.State.OPENING;\n  } else if (this.state_ == WebChannelBase.State.OPENED) {\n    if (opt_retryRequest) {\n      this.makeForwardChannelRequest_(opt_retryRequest);\n      return;\n    }\n\n    if (this.outgoingMaps_.length == 0) {\n      this.channelDebug_.debug(\n          'startForwardChannel_ returned: ' +\n          'nothing to send');\n      // no need to start a new forward channel request\n      return;\n    }\n\n    if (this.forwardChannelRequestPool_.isFull()) {\n      // Should be impossible to be called in this state.\n      this.channelDebug_.severe(\n          'startForwardChannel_ returned: ' +\n          'connection already in progress');\n      return;\n    }\n\n    this.makeForwardChannelRequest_();\n    this.channelDebug_.debug('startForwardChannel_ finished, sent request');\n  }\n};\n\n\n/**\n * Establishes a new channel session with the the server.\n * @private\n */\nWebChannelBase.prototype.open_ = function() {\n  this.channelDebug_.debug('open_()');\n  this.nextRid_ = Math.floor(Math.random() * 100000);\n\n  var rid = this.nextRid_++;\n  var request =\n      ChannelRequest.createChannelRequest(this, this.channelDebug_, '', rid);\n\n  // mix the init headers\n  var extraHeaders = this.extraHeaders_;\n  if (this.initHeaders_) {\n    if (extraHeaders) {\n      extraHeaders = goog.object.clone(extraHeaders);\n      goog.object.extend(extraHeaders, this.initHeaders_);\n    } else {\n      extraHeaders = this.initHeaders_;\n    }\n  }\n\n  if (this.httpHeadersOverwriteParam_ === null) {\n    request.setExtraHeaders(extraHeaders);\n  }\n\n  var requestText = this.dequeueOutgoingMaps_(\n      request,\n      this.fastHandshake_ ? this.getMaxNumMessagesForFastHandshake_() :\n                            WebChannelBase.MAX_MAPS_PER_REQUEST_);\n\n  var uri = this.forwardChannelUri_.clone();\n  uri.setParameterValue('RID', rid);\n\n  if (this.clientVersion_ > 0) {\n    uri.setParameterValue('CVER', this.clientVersion_);\n  }\n\n  // http-session-id to be generated as the response\n  if (this.getBackgroundChannelTest() && this.getHttpSessionIdParam()) {\n    uri.setParameterValue(\n        WebChannel.X_HTTP_SESSION_ID, this.getHttpSessionIdParam());\n  }\n\n  // Add the reconnect parameters.\n  this.addAdditionalParams_(uri);\n\n  if (this.httpHeadersOverwriteParam_ && extraHeaders) {\n    httpCors.setHttpHeadersWithOverwriteParam(\n        uri, this.httpHeadersOverwriteParam_, extraHeaders);\n  }\n\n  this.forwardChannelRequestPool_.addRequest(request);\n\n  // Check the option and use GET to enable QUIC 0-RTT\n  if (this.fastHandshake_) {\n    uri.setParameterValue('$req', requestText);\n\n    // enable handshake upgrade\n    uri.setParameterValue('SID', 'null');\n    request.setDecodeInitialResponse();\n\n    request.xmlHttpPost(uri, null, true);  // Send as a GET\n  } else {\n    request.xmlHttpPost(uri, requestText, true);\n  }\n};\n\n\n/**\n * @return {number} The number of raw JSON messages to be encoded\n * with the fast-handshake (GET) request, including zero. If messages are not\n * encoded as raw JSON data, return WebChannelBase.MAX_MAPS_PER_REQUEST_\n * @private\n */\nWebChannelBase.prototype.getMaxNumMessagesForFastHandshake_ = function() {\n  var total = 0;\n  for (var i = 0; i < this.outgoingMaps_.length; i++) {\n    var map = this.outgoingMaps_[i];\n    var size = map.getRawDataSize();\n    if (size === undefined) {\n      break;\n    }\n    total += size;\n\n    if (total > WebChannelBase.MAX_CHARS_PER_GET_) {\n      return i;\n    }\n\n    if (total === WebChannelBase.MAX_CHARS_PER_GET_ ||\n        i === this.outgoingMaps_.length - 1) {\n      return i + 1;\n    }\n  }\n\n  return WebChannelBase.MAX_MAPS_PER_REQUEST_;\n};\n\n\n\n/**\n * Makes a forward channel request using XMLHTTP.\n * @param {!ChannelRequest=} opt_retryRequest A failed request to retry.\n * @private\n */\nWebChannelBase.prototype.makeForwardChannelRequest_ = function(\n    opt_retryRequest) {\n  var rid;\n  if (opt_retryRequest) {\n    rid = opt_retryRequest.getRequestId();  // Reuse the same RID for a retry\n  } else {\n    rid = this.nextRid_++;\n  }\n\n  var uri = this.forwardChannelUri_.clone();\n  uri.setParameterValue('SID', this.sid_);\n  uri.setParameterValue('RID', rid);\n  uri.setParameterValue('AID', this.lastArrayId_);\n  // Add the additional reconnect parameters.\n  this.addAdditionalParams_(uri);\n\n  if (this.httpHeadersOverwriteParam_ && this.extraHeaders_) {\n    httpCors.setHttpHeadersWithOverwriteParam(\n        uri, this.httpHeadersOverwriteParam_, this.extraHeaders_);\n  }\n\n  var request = ChannelRequest.createChannelRequest(\n      this, this.channelDebug_, this.sid_, rid,\n      this.forwardChannelRetryCount_ + 1);\n\n  if (this.httpHeadersOverwriteParam_ === null) {\n    request.setExtraHeaders(this.extraHeaders_);\n  }\n\n  var requestText;\n  if (opt_retryRequest) {\n    this.requeuePendingMaps_(opt_retryRequest);\n  }\n  requestText =\n      this.dequeueOutgoingMaps_(request, WebChannelBase.MAX_MAPS_PER_REQUEST_);\n\n  // Randomize from 50%-100% of the forward channel timeout to avoid\n  // a big hit if servers happen to die at once.\n  request.setTimeout(\n      Math.round(this.forwardChannelRequestTimeoutMs_ * 0.50) +\n      Math.round(this.forwardChannelRequestTimeoutMs_ * 0.50 * Math.random()));\n  this.forwardChannelRequestPool_.addRequest(request);\n  request.xmlHttpPost(uri, requestText, true);\n};\n\n\n/**\n * Adds the additional parameters from the handler to the given URI.\n * @param {!goog.Uri} uri The URI to add the parameters to.\n * @private\n */\nWebChannelBase.prototype.addAdditionalParams_ = function(uri) {\n  // Add the additional reconnect parameters as needed.\n  if (this.handler_) {\n    var params = this.handler_.getAdditionalParams(this);\n    if (params) {\n      goog.structs.forEach(params, function(value, key, coll) {\n        uri.setParameterValue(key, value);\n      });\n    }\n  }\n};\n\n\n/**\n * Returns the request text from the outgoing maps and resets it.\n * @param {!ChannelRequest} request The new request for sending the messages.\n * @param {number} maxNum The maximum number of messages to be encoded\n * @return {string} The encoded request text created from all the currently\n *                  queued outgoing maps.\n * @private\n */\nWebChannelBase.prototype.dequeueOutgoingMaps_ = function(request, maxNum) {\n  var count = Math.min(this.outgoingMaps_.length, maxNum);\n\n  var badMapHandler = this.handler_ ?\n      goog.bind(this.handler_.badMapError, this.handler_, this) :\n      null;\n  var result = this.wireCodec_.encodeMessageQueue(\n      this.outgoingMaps_, count, badMapHandler);\n\n  request.setPendingMessages(this.outgoingMaps_.splice(0, count));\n\n  return result;\n};\n\n\n/**\n * Requeues unacknowledged sent arrays for retransmission in the next forward\n * channel request.\n * @param {!ChannelRequest} retryRequest A failed request to retry.\n * @private\n */\nWebChannelBase.prototype.requeuePendingMaps_ = function(retryRequest) {\n  this.outgoingMaps_ =\n      retryRequest.getPendingMessages().concat(this.outgoingMaps_);\n};\n\n\n/**\n * Ensures there is a backchannel request for receiving data from the server.\n * @private\n */\nWebChannelBase.prototype.ensureBackChannel_ = function() {\n  if (this.backChannelRequest_) {\n    // already have one\n    return;\n  }\n\n  if (this.backChannelTimerId_) {\n    // no need to start a new request - one is already scheduled\n    return;\n  }\n\n  this.backChannelAttemptId_ = 1;\n\n  // Use async.run instead of setTimeout(0) to avoid the 1s message delay\n  // from chrome/firefox background tabs\n  // backChannelTimerId_ stays unset, as with setTimeout(0)\n  goog.async.run(this.onStartBackChannelTimer_, this);\n\n  this.backChannelRetryCount_ = 0;\n};\n\n\n/**\n * Schedules a back-channel retry, unless the max retries has been reached.\n * @return {boolean} true iff a retry was scheduled.\n * @private\n */\nWebChannelBase.prototype.maybeRetryBackChannel_ = function() {\n  if (this.backChannelRequest_ || this.backChannelTimerId_) {\n    // Should be impossible to be called in this state.\n    this.channelDebug_.severe('Request already in progress');\n    return false;\n  }\n\n  if (this.backChannelRetryCount_ >= this.getBackChannelMaxRetries()) {\n    return false;\n  }\n\n  this.channelDebug_.debug('Going to retry GET');\n\n  this.backChannelAttemptId_++;\n  this.backChannelTimerId_ = requestStats.setTimeout(\n      goog.bind(this.onStartBackChannelTimer_, this),\n      this.getRetryTime_(this.backChannelRetryCount_));\n  this.backChannelRetryCount_++;\n  return true;\n};\n\n\n/**\n * Timer callback for ensureBackChannel_.\n * @private\n */\nWebChannelBase.prototype.onStartBackChannelTimer_ = function() {\n  this.backChannelTimerId_ = null;\n  this.startBackChannel_();\n};\n\n\n/**\n * Begins a new back channel operation to the server.\n * @private\n */\nWebChannelBase.prototype.startBackChannel_ = function() {\n  if (!this.okToMakeRequest_()) {\n    // channel is cancelled\n    return;\n  }\n\n  this.channelDebug_.debug('Creating new HttpRequest');\n  this.backChannelRequest_ = ChannelRequest.createChannelRequest(\n      this, this.channelDebug_, this.sid_, 'rpc', this.backChannelAttemptId_);\n\n  if (this.httpHeadersOverwriteParam_ === null) {\n    this.backChannelRequest_.setExtraHeaders(this.extraHeaders_);\n  }\n\n  this.backChannelRequest_.setReadyStateChangeThrottle(\n      this.readyStateChangeThrottleMs_);\n  var uri = this.backChannelUri_.clone();\n  uri.setParameterValue('RID', 'rpc');\n  uri.setParameterValue('SID', this.sid_);\n  uri.setParameterValue('CI', this.useChunked_ ? '0' : '1');\n  uri.setParameterValue('AID', this.lastArrayId_);\n\n  // Add the reconnect parameters.\n  this.addAdditionalParams_(uri);\n\n  uri.setParameterValue('TYPE', 'xmlhttp');\n\n  if (this.httpHeadersOverwriteParam_ && this.extraHeaders_) {\n    httpCors.setHttpHeadersWithOverwriteParam(\n        uri, this.httpHeadersOverwriteParam_, this.extraHeaders_);\n  }\n\n  if (this.backChannelRequestTimeoutMs_) {\n    this.backChannelRequest_.setTimeout(this.backChannelRequestTimeoutMs_);\n  }\n\n  this.backChannelRequest_.xmlHttpGet(\n      uri, true /* decodeChunks */, this.hostPrefix_);\n\n  this.channelDebug_.debug('New Request created');\n};\n\n\n/**\n * Gives the handler a chance to return an error code and stop channel\n * execution. A handler might want to do this to check that the user is still\n * logged in, for example.\n * @private\n * @return {boolean} If it's OK to make a request.\n */\nWebChannelBase.prototype.okToMakeRequest_ = function() {\n  if (this.handler_) {\n    var result = this.handler_.okToMakeRequest(this);\n    if (result != WebChannelBase.Error.OK) {\n      this.channelDebug_.debug(\n          'Handler returned error code from okToMakeRequest');\n      this.signalError_(result);\n      return false;\n    }\n  }\n  return true;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.testConnectionFinished = function(\n    testChannel, useChunked) {\n  this.channelDebug_.debug('Test Connection Finished');\n\n  // Forward channel will not be used prior to this method is called\n  var clientProtocol = testChannel.getClientProtocol();\n  if (clientProtocol) {\n    this.forwardChannelRequestPool_.applyClientProtocol(clientProtocol);\n  }\n\n  this.useChunked_ = this.allowChunkedMode_ && useChunked;\n  this.lastStatusCode_ = testChannel.getLastStatusCode();\n\n  this.connectChannel_();\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.testConnectionFailure = function(\n    testChannel, errorCode) {\n  this.channelDebug_.debug('Test Connection Failed');\n  this.lastStatusCode_ = testChannel.getLastStatusCode();\n  this.signalError_(WebChannelBase.Error.REQUEST_FAILED);\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.onRequestData = function(request, responseText) {\n  if (this.state_ == WebChannelBase.State.CLOSED ||\n      (this.backChannelRequest_ != request &&\n       !this.forwardChannelRequestPool_.hasRequest(request))) {\n    // either CLOSED or a request we don't know about (perhaps an old request)\n    return;\n  }\n  this.lastStatusCode_ = request.getLastStatusCode();\n\n  // first to check if request has been upgraded to backchannel\n  if (!request.isInitialResponseDecoded() &&\n      this.forwardChannelRequestPool_.hasRequest(request) &&\n      this.state_ == WebChannelBase.State.OPENED) {\n    var response;\n    try {\n      response = this.wireCodec_.decodeMessage(responseText);\n    } catch (ex) {\n      response = null;\n    }\n    if (goog.isArray(response) && response.length == 3) {\n      this.handlePostResponse_(/** @type {!Array<?>} */ (response), request);\n      this.onForwardChannelFlushed_();\n    } else {\n      this.channelDebug_.debug('Bad POST response data returned');\n      this.signalError_(WebChannelBase.Error.BAD_RESPONSE);\n    }\n  } else {\n    if (request.isInitialResponseDecoded() ||\n        this.backChannelRequest_ == request) {\n      this.clearDeadBackchannelTimer_();\n    }\n    if (!goog.string.isEmptyOrWhitespace(responseText)) {\n      var response = this.wireCodec_.decodeMessage(responseText);\n      this.onInput_(/** @type {!Array<?>} */ (response), request);\n    }\n  }\n};\n\n\n/**\n * Checks if we need call the flush callback.\n *\n * @private\n */\nWebChannelBase.prototype.onForwardChannelFlushed_ = function() {\n  if (this.forwardChannelRequestPool_.getRequestCount() <= 1) {\n    if (this.forwardChannelFlushedCallback_) {\n      try {\n        this.forwardChannelFlushedCallback_();\n      } catch (ex) {\n        this.channelDebug_.dumpException(\n            ex, 'Exception from forwardChannelFlushedCallback_ ');\n      }\n      // reset\n      this.forwardChannelFlushedCallback_ = undefined;\n    }\n  }\n};\n\n\n/**\n * Handles a POST response from the server.\n * @param {Array<number>} responseValues The key value pairs in\n *     the POST response.\n * @param {!ChannelRequest} forwardReq The forward channel request that\n * triggers this function call.\n * @private\n */\nWebChannelBase.prototype.handlePostResponse_ = function(\n    responseValues, forwardReq) {\n  // The first response value is set to 0 if server is missing backchannel.\n  if (responseValues[0] == 0) {\n    this.handleBackchannelMissing_(forwardReq);\n    return;\n  }\n  this.lastPostResponseArrayId_ = responseValues[1];\n  var outstandingArrays = this.lastPostResponseArrayId_ - this.lastArrayId_;\n  if (0 < outstandingArrays) {\n    var numOutstandingBackchannelBytes = responseValues[2];\n    this.channelDebug_.debug(\n        numOutstandingBackchannelBytes + ' bytes (in ' + outstandingArrays +\n        ' arrays) are outstanding on the BackChannel');\n    if (!this.shouldRetryBackChannel_(numOutstandingBackchannelBytes)) {\n      return;\n    }\n    if (!this.deadBackChannelTimerId_) {\n      // We expect to receive data within 2 RTTs or we retry the backchannel.\n      this.deadBackChannelTimerId_ = requestStats.setTimeout(\n          goog.bind(this.onBackChannelDead_, this),\n          2 * WebChannelBase.RTT_ESTIMATE);\n    }\n  }\n};\n\n\n/**\n * Handles a POST response from the server telling us that it has detected that\n * we have no hanging GET connection.\n * @param {!ChannelRequest} forwardReq The forward channel request that\n * triggers this function call.\n * @private\n */\nWebChannelBase.prototype.handleBackchannelMissing_ = function(forwardReq) {\n  // As long as the back channel was started before the POST was sent,\n  // we should retry the backchannel. We give a slight buffer of RTT_ESTIMATE\n  // so as not to excessively retry the backchannel\n  this.channelDebug_.debug('Server claims our backchannel is missing.');\n  if (this.backChannelTimerId_) {\n    this.channelDebug_.debug('But we are currently starting the request.');\n    return;\n  } else if (!this.backChannelRequest_) {\n    this.channelDebug_.warning('We do not have a BackChannel established');\n  } else if (\n      this.backChannelRequest_.getRequestStartTime() +\n          WebChannelBase.RTT_ESTIMATE <\n      forwardReq.getRequestStartTime()) {\n    this.clearDeadBackchannelTimer_();\n    this.backChannelRequest_.cancel();\n    this.backChannelRequest_ = null;\n  } else {\n    return;\n  }\n  this.maybeRetryBackChannel_();\n  requestStats.notifyStatEvent(requestStats.Stat.BACKCHANNEL_MISSING);\n};\n\n\n/**\n * Determines whether we should start the process of retrying a possibly\n * dead backchannel.\n * @param {number} outstandingBytes The number of bytes for which the server has\n *     not yet received acknowledgement.\n * @return {boolean} Whether to start the backchannel retry timer.\n * @private\n */\nWebChannelBase.prototype.shouldRetryBackChannel_ = function(outstandingBytes) {\n  // Not too many outstanding bytes, not buffered and not after a retry.\n  return outstandingBytes <\n      WebChannelBase.OUTSTANDING_DATA_BACKCHANNEL_RETRY_CUTOFF &&\n      !this.isBuffered() && this.backChannelRetryCount_ == 0;\n};\n\n\n/**\n * Decides which host prefix should be used, if any.  If there is a handler,\n * allows the handler to validate a host prefix provided by the server, and\n * optionally override it.\n * @param {?string} serverHostPrefix The host prefix provided by the server.\n * @return {?string} The host prefix to actually use, if any. Will return null\n *     if the use of host prefixes was disabled via setAllowHostPrefix().\n * @override\n */\nWebChannelBase.prototype.correctHostPrefix = function(serverHostPrefix) {\n  if (this.allowHostPrefix_) {\n    if (this.handler_) {\n      return this.handler_.correctHostPrefix(serverHostPrefix);\n    }\n    return serverHostPrefix;\n  }\n  return null;\n};\n\n\n/**\n * Handles the timer that indicates that our backchannel is no longer able to\n * successfully receive data from the server.\n * @private\n */\nWebChannelBase.prototype.onBackChannelDead_ = function() {\n  if (this.deadBackChannelTimerId_ != null) {\n    this.deadBackChannelTimerId_ = null;\n    this.backChannelRequest_.cancel();\n    this.backChannelRequest_ = null;\n    this.maybeRetryBackChannel_();\n    requestStats.notifyStatEvent(requestStats.Stat.BACKCHANNEL_DEAD);\n  }\n};\n\n\n/**\n * Clears the timer that indicates that our backchannel is no longer able to\n * successfully receive data from the server.\n * @private\n */\nWebChannelBase.prototype.clearDeadBackchannelTimer_ = function() {\n  if (this.deadBackChannelTimerId_ != null) {\n    goog.global.clearTimeout(this.deadBackChannelTimerId_);\n    this.deadBackChannelTimerId_ = null;\n  }\n};\n\n\n/**\n * Returns whether or not the given error/status combination is fatal or not.\n * On fatal errors we immediately close the session rather than retrying the\n * failed request.\n * @param {?ChannelRequest.Error} error The error code for the\n * failed request.\n * @param {number} statusCode The last HTTP status code.\n * @return {boolean} Whether or not the error is fatal.\n * @private\n */\nWebChannelBase.isFatalError_ = function(error, statusCode) {\n  return error == ChannelRequest.Error.UNKNOWN_SESSION_ID ||\n      (error == ChannelRequest.Error.STATUS && statusCode > 0);\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.onRequestComplete = function(request) {\n  this.channelDebug_.debug('Request complete');\n  var type;\n  var pendingMessages = null;\n  if (this.backChannelRequest_ == request) {\n    this.clearDeadBackchannelTimer_();\n    this.backChannelRequest_ = null;\n    type = WebChannelBase.ChannelType_.BACK_CHANNEL;\n  } else if (this.forwardChannelRequestPool_.hasRequest(request)) {\n    pendingMessages = request.getPendingMessages();\n    this.forwardChannelRequestPool_.removeRequest(request);\n    type = WebChannelBase.ChannelType_.FORWARD_CHANNEL;\n  } else {\n    // return if it was an old request from a previous session\n    return;\n  }\n\n  this.lastStatusCode_ = request.getLastStatusCode();\n\n  if (this.state_ == WebChannelBase.State.CLOSED) {\n    return;\n  }\n\n  if (request.getSuccess()) {\n    // Yay!\n    if (type == WebChannelBase.ChannelType_.FORWARD_CHANNEL) {\n      var size = request.getPostData() ? request.getPostData().length : 0;\n      requestStats.notifyTimingEvent(\n          size, goog.now() - request.getRequestStartTime(),\n          this.forwardChannelRetryCount_);\n      this.ensureForwardChannel_();\n      this.onSuccess_(request);\n    } else {  // i.e., back-channel\n      this.ensureBackChannel_();\n    }\n    return;\n  }\n  // Else unsuccessful. Fall through.\n\n  var lastError = request.getLastError();\n  if (!WebChannelBase.isFatalError_(lastError, this.lastStatusCode_)) {\n    // Maybe retry.\n    var self = this;\n    this.channelDebug_.debug(function() {\n      return 'Maybe retrying, last error: ' +\n          ChannelRequest.errorStringFromCode(lastError, self.lastStatusCode_);\n    });\n    if (type == WebChannelBase.ChannelType_.FORWARD_CHANNEL) {\n      if (this.maybeRetryForwardChannel_(request)) {\n        return;\n      }\n    }\n    if (type == WebChannelBase.ChannelType_.BACK_CHANNEL) {\n      if (this.maybeRetryBackChannel_()) {\n        return;\n      }\n    }\n    // Else exceeded max retries. Fall through.\n    this.channelDebug_.debug('Exceeded max number of retries');\n  } else {\n    // Else fatal error. Fall through and mark the pending maps as failed.\n    this.channelDebug_.debug('Not retrying due to error type');\n  }\n\n\n  // Abort the channel now\n\n  // Record pending messages from the failed request\n  if (pendingMessages && pendingMessages.length > 0) {\n    this.forwardChannelRequestPool_.addPendingMessages(pendingMessages);\n  }\n\n  this.channelDebug_.debug('Error: HTTP request failed');\n  switch (lastError) {\n    case ChannelRequest.Error.NO_DATA:\n      this.signalError_(WebChannelBase.Error.NO_DATA);\n      break;\n    case ChannelRequest.Error.BAD_DATA:\n      this.signalError_(WebChannelBase.Error.BAD_DATA);\n      break;\n    case ChannelRequest.Error.UNKNOWN_SESSION_ID:\n      this.signalError_(WebChannelBase.Error.UNKNOWN_SESSION_ID);\n      break;\n    default:\n      this.signalError_(WebChannelBase.Error.REQUEST_FAILED);\n      break;\n  }\n};\n\n\n/**\n * @param {number} retryCount Number of retries so far.\n * @return {number} Time in ms before firing next retry request.\n * @private\n */\nWebChannelBase.prototype.getRetryTime_ = function(retryCount) {\n  var retryTime = this.baseRetryDelayMs_ +\n      Math.floor(Math.random() * this.retryDelaySeedMs_);\n  if (!this.isActive()) {\n    this.channelDebug_.debug('Inactive channel');\n    retryTime = retryTime * WebChannelBase.INACTIVE_CHANNEL_RETRY_FACTOR;\n  }\n  // Backoff for subsequent retries\n  retryTime *= retryCount;\n  return retryTime;\n};\n\n\n/**\n * @param {number} baseDelayMs The base part of the retry delay, in ms.\n * @param {number} delaySeedMs A random delay between 0 and this is added to\n *     the base part.\n */\nWebChannelBase.prototype.setRetryDelay = function(baseDelayMs, delaySeedMs) {\n  this.baseRetryDelayMs_ = baseDelayMs;\n  this.retryDelaySeedMs_ = delaySeedMs;\n};\n\n\n/**\n * Apply any handshake control headers.\n * @param {!ChannelRequest} request The underlying request object\n * @private\n */\nWebChannelBase.prototype.applyControlHeaders_ = function(request) {\n  if (!this.backgroundChannelTest_) {\n    return;\n  }\n\n  var xhr = request.getXhr();\n  if (xhr) {\n    var clientProtocol =\n        xhr.getStreamingResponseHeader(WebChannel.X_CLIENT_WIRE_PROTOCOL);\n    if (clientProtocol) {\n      this.forwardChannelRequestPool_.applyClientProtocol(clientProtocol);\n    }\n\n    if (this.getHttpSessionIdParam()) {\n      var httpSessionIdHeader =\n          xhr.getStreamingResponseHeader(WebChannel.X_HTTP_SESSION_ID);\n      if (httpSessionIdHeader) {\n        this.setHttpSessionId(httpSessionIdHeader);\n        // update the cached uri\n        var httpSessionIdParam = this.getHttpSessionIdParam();\n\n        this.forwardChannelUri_.setParameterValue(\n            /** @type {string} */ (httpSessionIdParam),  // never null\n            httpSessionIdHeader);\n      } else {\n        this.channelDebug_.warning(\n            'Missing X_HTTP_SESSION_ID in the handshake response');\n      }\n    }\n  }\n};\n\n\n/**\n * Processes the data returned by the server.\n * @param {!Array<!Array<?>>} respArray The response array returned\n *     by the server.\n * @param {!ChannelRequest} request The underlying request object\n * @private\n */\nWebChannelBase.prototype.onInput_ = function(respArray, request) {\n  var batch =\n      this.handler_ && this.handler_.channelHandleMultipleArrays ? [] : null;\n  for (var i = 0; i < respArray.length; i++) {\n    var nextArray = respArray[i];\n    this.lastArrayId_ = nextArray[0];\n    nextArray = nextArray[1];\n    if (this.state_ == WebChannelBase.State.OPENING) {\n      if (nextArray[0] == 'c') {\n        this.sid_ = nextArray[1];\n        this.hostPrefix_ = this.correctHostPrefix(nextArray[2]);\n\n        var negotiatedVersion = nextArray[3];\n        if (negotiatedVersion != null) {\n          this.channelVersion_ = negotiatedVersion;\n          this.channelDebug_.info('VER=' + this.channelVersion_);\n        }\n\n        var negotiatedServerVersion = nextArray[4];\n        if (negotiatedServerVersion != null) {\n          this.serverVersion_ = negotiatedServerVersion;\n          this.channelDebug_.info('SVER=' + this.serverVersion_);\n        }\n\n        // CVER=22\n        var serverKeepaliveMs = nextArray[5];\n        if (serverKeepaliveMs != null &&\n            typeof serverKeepaliveMs === 'number' && serverKeepaliveMs > 0) {\n          var timeout = 1.5 * serverKeepaliveMs;\n          this.backChannelRequestTimeoutMs_ = timeout;\n          this.channelDebug_.info('backChannelRequestTimeoutMs_=' + timeout);\n        }\n\n        this.applyControlHeaders_(request);\n\n        this.state_ = WebChannelBase.State.OPENED;\n        if (this.handler_) {\n          this.handler_.channelOpened(this);\n        }\n\n        this.startBackchannelAfterHandshake_(request);\n\n        if (this.outgoingMaps_.length > 0) {\n          this.ensureForwardChannel_();\n        }\n      } else if (nextArray[0] == 'stop' || nextArray[0] == 'close') {\n        // treat close also as an abort\n        this.signalError_(WebChannelBase.Error.STOP);\n      }\n    } else if (this.state_ == WebChannelBase.State.OPENED) {\n      if (nextArray[0] == 'stop' || nextArray[0] == 'close') {\n        if (batch && !goog.array.isEmpty(batch)) {\n          this.handler_.channelHandleMultipleArrays(this, batch);\n          batch.length = 0;\n        }\n        if (nextArray[0] == 'stop') {\n          this.signalError_(WebChannelBase.Error.STOP);\n        } else {\n          this.disconnect();\n        }\n      } else if (nextArray[0] == 'noop') {\n        // ignore - noop to keep connection happy\n      } else {\n        if (batch) {\n          batch.push(nextArray);\n        } else if (this.handler_) {\n          this.handler_.channelHandleArray(this, nextArray);\n        }\n      }\n      // We have received useful data on the back-channel, so clear its retry\n      // count. We do this because back-channels by design do not complete\n      // quickly, so on a flaky connection we could have many fail to complete\n      // fully but still deliver a lot of data before they fail. We don't want\n      // to count such failures towards the retry limit, because we don't want\n      // to give up on a session if we can still receive data.\n      this.backChannelRetryCount_ = 0;\n    }\n  }\n  if (batch && !goog.array.isEmpty(batch)) {\n    this.handler_.channelHandleMultipleArrays(this, batch);\n  }\n};\n\n\n/**\n * Starts the backchannel after the handshake.\n *\n * @param {!ChannelRequest} request The underlying request object\n * @private\n */\nWebChannelBase.prototype.startBackchannelAfterHandshake_ = function(request) {\n  this.backChannelUri_ = this.getBackChannelUri(\n      this.hostPrefix_, /** @type {string} */ (this.path_));\n\n  if (request.isInitialResponseDecoded()) {\n    this.channelDebug_.debug('Upgrade the handshake request to a backchannel.');\n    this.forwardChannelRequestPool_.removeRequest(request);\n    request.resetTimeout(this.backChannelRequestTimeoutMs_);\n    this.backChannelRequest_ = request;\n  } else {\n    // Open connection to receive data\n    this.ensureBackChannel_();\n  }\n};\n\n\n/**\n * Helper to ensure the channel is in the expected state.\n * @param {...number} var_args The channel must be in one of the indicated\n *     states.\n * @private\n */\nWebChannelBase.prototype.ensureInState_ = function(var_args) {\n  goog.asserts.assert(\n      goog.array.contains(arguments, this.state_),\n      'Unexpected channel state: %s', this.state_);\n};\n\n\n/**\n * Signals an error has occurred.\n * @param {WebChannelBase.Error} error The error code for the failure.\n * @private\n */\nWebChannelBase.prototype.signalError_ = function(error) {\n  this.channelDebug_.info('Error code ' + error);\n  if (error == WebChannelBase.Error.REQUEST_FAILED) {\n    // Create a separate Internet connection to check\n    // if it's a server error or user's network error.\n    var imageUri = null;\n    if (this.handler_) {\n      imageUri = this.handler_.getNetworkTestImageUri(this);\n    }\n    netUtils.testNetwork(goog.bind(this.testNetworkCallback_, this), imageUri);\n  } else {\n    requestStats.notifyStatEvent(requestStats.Stat.ERROR_OTHER);\n  }\n  this.onError_(error);\n};\n\n\n/**\n * Callback for netUtils.testNetwork during error handling.\n * @param {boolean} networkUp Whether the network is up.\n * @private\n */\nWebChannelBase.prototype.testNetworkCallback_ = function(networkUp) {\n  if (networkUp) {\n    this.channelDebug_.info('Successfully pinged google.com');\n    requestStats.notifyStatEvent(requestStats.Stat.ERROR_OTHER);\n  } else {\n    this.channelDebug_.info('Failed to ping google.com');\n    requestStats.notifyStatEvent(requestStats.Stat.ERROR_NETWORK);\n    // Do not call onError_ again to eliminate duplicated Error events.\n  }\n};\n\n\n/**\n * Called when messages have been successfully sent from the queue.\n * @param {!ChannelRequest} request The request object\n * @private\n */\nWebChannelBase.prototype.onSuccess_ = function(request) {\n  if (this.handler_) {\n    this.handler_.channelSuccess(this, request);\n  }\n};\n\n\n/**\n * Called when we've determined the final error for a channel. It closes the\n * notifiers the handler of the error and closes the channel.\n * @param {WebChannelBase.Error} error  The error code for the failure.\n * @private\n */\nWebChannelBase.prototype.onError_ = function(error) {\n  this.channelDebug_.debug('HttpChannel: error - ' + error);\n  this.state_ = WebChannelBase.State.CLOSED;\n  if (this.handler_) {\n    this.handler_.channelError(this, error);\n  }\n  this.onClose_();\n  this.cancelRequests_();\n};\n\n\n/**\n * Called when the channel has been closed. It notifiers the handler of the\n * event, and reports any pending or undelivered maps.\n * @private\n */\nWebChannelBase.prototype.onClose_ = function() {\n  this.state_ = WebChannelBase.State.CLOSED;\n  this.lastStatusCode_ = -1;\n  if (this.handler_) {\n    var pendingMessages = this.forwardChannelRequestPool_.getPendingMessages();\n\n    if (pendingMessages.length == 0 && this.outgoingMaps_.length == 0) {\n      this.handler_.channelClosed(this);\n    } else {\n      var self = this;\n      this.channelDebug_.debug(function() {\n        return 'Number of undelivered maps' +\n            ', pending: ' + pendingMessages.length +\n            ', outgoing: ' + self.outgoingMaps_.length;\n      });\n\n      this.forwardChannelRequestPool_.clearPendingMessages();\n\n      var copyOfUndeliveredMaps = goog.array.clone(this.outgoingMaps_);\n      this.outgoingMaps_.length = 0;\n\n      this.handler_.channelClosed(this, pendingMessages, copyOfUndeliveredMaps);\n    }\n  }\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.getForwardChannelUri = function(path) {\n  var uri = this.createDataUri(null, path);\n  this.channelDebug_.debug('GetForwardChannelUri: ' + uri);\n  return uri;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.getConnectionState = function() {\n  return this.connState_;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.getBackChannelUri = function(hostPrefix, path) {\n  var uri = this.createDataUri(\n      this.shouldUseSecondaryDomains() ? hostPrefix : null, path);\n  this.channelDebug_.debug('GetBackChannelUri: ' + uri);\n  return uri;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.createDataUri = function(\n    hostPrefix, path, opt_overridePort) {\n  var uri = goog.Uri.parse(path);\n  var uriAbsolute = (uri.getDomain() != '');\n  if (uriAbsolute) {\n    if (hostPrefix) {\n      uri.setDomain(hostPrefix + '.' + uri.getDomain());\n    }\n\n    uri.setPort(opt_overridePort || uri.getPort());\n  } else {\n    var locationPage = goog.global.location;\n    var hostName;\n    if (hostPrefix) {\n      hostName = hostPrefix + '.' + locationPage.hostname;\n    } else {\n      hostName = locationPage.hostname;\n    }\n\n    var port = opt_overridePort || +locationPage.port;\n\n    uri = goog.Uri.create(locationPage.protocol, null, hostName, port, path);\n  }\n\n  if (this.extraParams_) {\n    goog.object.forEach(this.extraParams_, function(value, key) {\n      uri.setParameterValue(key, value);\n    });\n  }\n\n  var param = this.getHttpSessionIdParam();\n  var value = this.getHttpSessionId();\n  if (param && value) {\n    uri.setParameterValue(param, value);\n  }\n\n  // Add the protocol version to the URI.\n  uri.setParameterValue('VER', this.channelVersion_);\n\n  // Add the reconnect parameters.\n  this.addAdditionalParams_(uri);\n\n  return uri;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.createXhrIo = function(hostPrefix) {\n  if (hostPrefix && !this.supportsCrossDomainXhrs_) {\n    throw new Error('Can\\'t create secondary domain capable XhrIo object.');\n  }\n  var xhr = new goog.net.XhrIo(this.xmlHttpFactory_);\n  xhr.setWithCredentials(this.supportsCrossDomainXhrs_);\n  return xhr;\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.isActive = function() {\n  return !!this.handler_ && this.handler_.isActive(this);\n};\n\n\n/**\n * @override\n */\nWebChannelBase.prototype.shouldUseSecondaryDomains = function() {\n  return this.supportsCrossDomainXhrs_;\n};\n\n\n/**\n * Sets (overwrites) the forward channel flush callback.\n *\n * @param {function()} callback The callback to be invoked.\n */\nWebChannelBase.prototype.setForwardChannelFlushCallback = function(callback) {\n  this.forwardChannelFlushedCallback_ = callback;\n};\n\n\n/**\n * Abstract base class for the channel handler\n * @constructor\n * @struct\n */\nWebChannelBase.Handler = function() {};\n\n\n/**\n * Callback handler for when a batch of response arrays is received from the\n * server. When null, batched dispatching is disabled.\n * @type {?function(!WebChannelBase, !Array<!Array<?>>)}\n */\nWebChannelBase.Handler.prototype.channelHandleMultipleArrays = null;\n\n\n/**\n * Whether it's okay to make a request to the server. A handler can return\n * false if the channel should fail. For example, if the user has logged out,\n * the handler may want all requests to fail immediately.\n * @param {WebChannelBase} channel The channel.\n * @return {WebChannelBase.Error} An error code. The code should\n * return WebChannelBase.Error.OK to indicate it's okay. Any other\n * error code will cause a failure.\n */\nWebChannelBase.Handler.prototype.okToMakeRequest = function(channel) {\n  return WebChannelBase.Error.OK;\n};\n\n\n/**\n * Indicates the WebChannel has successfully negotiated with the server\n * and can now send and receive data.\n * @param {WebChannelBase} channel The channel.\n */\nWebChannelBase.Handler.prototype.channelOpened = function(channel) {};\n\n\n/**\n * New input is available for the application to process.\n *\n * @param {WebChannelBase} channel The channel.\n * @param {Array<?>} array The data array.\n */\nWebChannelBase.Handler.prototype.channelHandleArray = function(\n    channel, array) {};\n\n\n/**\n * Indicates messages that have been successfully sent on the channel.\n *\n * @param {WebChannelBase} channel The channel.\n * @param {!ChannelRequest} request The request object that contains\n *     the pending messages that have been successfully delivered to the server.\n */\nWebChannelBase.Handler.prototype.channelSuccess = function(channel, request) {};\n\n\n/**\n * Indicates an error occurred on the WebChannel.\n *\n * @param {WebChannelBase} channel The channel.\n * @param {WebChannelBase.Error} error The error code.\n */\nWebChannelBase.Handler.prototype.channelError = function(channel, error) {};\n\n\n/**\n * Indicates the WebChannel is closed. Also notifies about which maps,\n * if any, that may not have been delivered to the server.\n * @param {WebChannelBase} channel The channel.\n * @param {Array<Wire.QueuedMap>=} opt_pendingMaps The\n *     array of pending maps, which may or may not have been delivered to the\n *     server.\n * @param {Array<Wire.QueuedMap>=} opt_undeliveredMaps\n *     The array of undelivered maps, which have definitely not been delivered\n *     to the server.\n */\nWebChannelBase.Handler.prototype.channelClosed = function(\n    channel, opt_pendingMaps, opt_undeliveredMaps) {};\n\n\n/**\n * Gets any parameters that should be added at the time another connection is\n * made to the server.\n * @param {WebChannelBase} channel The channel.\n * @return {!Object} Extra parameter keys and values to add to the requests.\n */\nWebChannelBase.Handler.prototype.getAdditionalParams = function(channel) {\n  return {};\n};\n\n\n/**\n * Gets the URI of an image that can be used to test network connectivity.\n * @param {WebChannelBase} channel The channel.\n * @return {goog.Uri?} A custom URI to load for the network test.\n */\nWebChannelBase.Handler.prototype.getNetworkTestImageUri = function(channel) {\n  return null;\n};\n\n\n/**\n * Gets whether this channel is currently active. This is used to determine the\n * length of time to wait before retrying.\n * @param {WebChannelBase} channel The channel.\n * @return {boolean} Whether the channel is currently active.\n */\nWebChannelBase.Handler.prototype.isActive = function(channel) {\n  return true;\n};\n\n\n/**\n * Called by the channel if enumeration of the map throws an exception.\n * @param {WebChannelBase} channel The channel.\n * @param {Object} map The map that can't be enumerated.\n */\nWebChannelBase.Handler.prototype.badMapError = function(channel, map) {};\n\n\n/**\n * Allows the handler to override a host prefix provided by the server. Will\n * be called whenever the channel has received such a prefix and is considering\n * its use.\n * @param {?string} serverHostPrefix The host prefix provided by the server.\n * @return {?string} The host prefix the client should use.\n */\nWebChannelBase.Handler.prototype.correctHostPrefix = function(\n    serverHostPrefix) {\n  return serverHostPrefix;\n};\n});  // goog.scope\n","^9I",1579837703000,"^9J",["^9K",["^:E","^=X","^UI","~$goog.labs.net.webChannel.netUtils","^:3","^;N","~$goog.labs.net.webChannel.ForwardChannelRequestPool","^<A","^9L","^<B","^<S","^<C","^9>","~$goog.labs.net.webChannel.Channel","~$goog.labs.net.webChannel.ConnectionState","^;P","~$goog.labs.net.webChannel.WebChannelDebug","^<U","^<D","~$goog.labs.net.webChannel.requestStats","~$goog.labs.net.webChannel.BaseTestChannel","^H?","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchannel/webchannelbase.js"],"^:1",["^9K",["^<G"]],"^9<",true,"^9=",["^9>","^<S","^;9","^:E","^:3","^<A","^VH","^VD","^<C","^VE","^VC","^VF","^<B","^=X","^VB","^VG","^<D","^;N","^H?","^UI","^;P","^9L","^<U"]],["^ ","^9A",[1579837703000],"^9B","goog.labs.useragent.verifier.js","^9C",["^9D","goog/labs/useragent/verifier.js"],"^9E","goog/labs/useragent/verifier.js","^9F","^9G","^9H","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Methods to verify IE versions.\n * TODO(johnlenz): delete this remove this file on the experiment is complete.\n */\ngoog.provide('goog.labs.useragent.verifier');\n\n\n/** @const */\ngoog.labs.useragent.verifier.NOT_IE = 0;\n\n\n/**\n * Detect the the current IE version using runtime behavior, returns 0\n * if a version of IE is not detected.\n * @return {number}\n */\ngoog.labs.useragent.verifier.detectIeVersionByBehavior = function() {\n  if (document.all) {\n    if (!document.compatMode) {\n      return 5;\n    }\n    if (!window.XMLHttpRequest) {\n      return 6;\n    }\n    if (!document.querySelector) {\n      return 7;\n    }\n    if (!document.addEventListener) {\n      return 8;\n    }\n    if (!window.atob) {\n      return 9;\n    }\n\n    return 10;\n  }\n  if (!(window.ActiveXObject) && 'ActiveXObject' in window) {\n    return 11;\n  }\n\n  return goog.labs.useragent.verifier.NOT_IE;\n};\n\n\n/**\n * Detect the the current IE version using MSIE version presented in the\n * user agent string (This will not detected IE 11 which does not present a\n * MSIE version), or zero if IE is not detected.\n * @return {number}\n */\ngoog.labs.useragent.verifier.detectIeVersionByNavigator = function() {\n  const ua = navigator.userAgent.toLowerCase();\n  if (ua.indexOf('msie') != -1) {\n    const value = parseInt(ua.split('msie')[1], 10);\n    if (typeof value == 'number' && !isNaN(value)) {\n      return value;\n    }\n  }\n\n  return goog.labs.useragent.verifier.NOT_IE;\n};\n\n\n/**\n * Correct the actual IE version based on the Trident version in the user agent\n * string.  This adjusts for IE's \"compatiblity modes\".\n * @return {number}\n */\ngoog.labs.useragent.verifier.getCorrectedIEVersionByNavigator = function() {\n  const ua = navigator.userAgent;\n  if (/Trident/.test(ua) || /MSIE/.test(ua)) {\n    return goog.labs.useragent.verifier.getIEVersion_(ua);\n  } else {\n    return goog.labs.useragent.verifier.NOT_IE;\n  }\n};\n\n\n/**\n * Get corrected IE version, see goog.labs.userAgent.browser.getIEVersion_\n *\n * @param {string} userAgent the User-Agent.\n * @return {number}\n * @private\n */\ngoog.labs.useragent.verifier.getIEVersion_ = function(userAgent) {\n  // IE11 may identify itself as MSIE 9.0 or MSIE 10.0 due to an IE 11 upgrade\n  // bug. Example UA:\n  // Mozilla/5.0 (MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)\n  // like Gecko.\n  const rv = /rv: *([\\d\\.]*)/.exec(userAgent);\n  if (rv && rv[1]) {\n    return Number(rv[1]);\n  }\n\n  const msie = /MSIE +([\\d\\.]+)/.exec(userAgent);\n  if (msie && msie[1]) {\n    // IE in compatibility mode usually identifies itself as MSIE 7.0; in this\n    // case, use the Trident version to determine the version of IE. For more\n    // details, see the links above.\n    const tridentVersion = /Trident\\/(\\d.\\d)/.exec(userAgent);\n    if (msie[1] == '7.0') {\n      if (tridentVersion && tridentVersion[1]) {\n        switch (tridentVersion[1]) {\n          case '4.0':\n            return 8;\n          case '5.0':\n            return 9;\n          case '6.0':\n            return 10;\n          case '7.0':\n            return 11;\n        }\n      } else {\n        return 7;\n      }\n    } else {\n      return Number(msie[1]);\n    }\n  }\n  return goog.labs.useragent.verifier.NOT_IE;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/useragent/verifier.js"],"^:1",["^9K",["~$goog.labs.useragent.verifier"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.structs.queue.js","^9C",["^9D","goog/structs/queue.js"],"^9E","goog/structs/queue.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Datastructure: Queue.\n *\n *\n * This file provides the implementation of a FIFO Queue structure.\n * API is similar to that of com.google.common.collect.IntQueue\n *\n * The implementation is a classic 2-stack queue.\n * There's a \"front\" stack and a \"back\" stack.\n * Items are pushed onto \"back\" and popped from \"front\".\n * When \"front\" is empty, we replace \"front\" with reverse(back).\n *\n * Example:\n * front                         back            op\n * []                            []              enqueue 1\n * []                            [1]             enqueue 2\n * []                            [1,2]           enqueue 3\n * []                            [1,2,3]         dequeue -> ...\n * [3,2,1]                       []              ... -> 1\n * [3,2]                         []              enqueue 4\n * [3,2]                         [4]             dequeue -> 2\n * [3]                           [4]\n *\n * Front and back are simple javascript arrays. We rely on\n * Array.push and Array.pop being O(1) amortized.\n *\n * Note: In V8, queues, up to a certain size, can be implemented\n * just fine using Array.push and Array.shift, but other JavaScript\n * engines do not have the optimization of Array.shift.\n *\n */\n\ngoog.provide('goog.structs.Queue');\n\ngoog.require('goog.array');\n\n\n\n/**\n * Class for FIFO Queue data structure.\n *\n * @constructor\n * @template T\n */\ngoog.structs.Queue = function() {\n  /**\n   * @private {!Array<T>} Front stack. Items are pop()'ed from here.\n   */\n  this.front_ = [];\n  /**\n   * @private {!Array<T>} Back stack. Items are push()'ed here.\n   */\n  this.back_ = [];\n};\n\n\n/**\n * Flips the back stack onto the front stack if front is empty,\n * to prepare for peek() or dequeue().\n *\n * @private\n */\ngoog.structs.Queue.prototype.maybeFlip_ = function() {\n  if (goog.array.isEmpty(this.front_)) {\n    this.front_ = this.back_;\n    this.front_.reverse();\n    this.back_ = [];\n  }\n};\n\n\n/**\n * Puts the specified element on this queue.\n * @param {T} element The element to be added to the queue.\n */\ngoog.structs.Queue.prototype.enqueue = function(element) {\n  this.back_.push(element);\n};\n\n\n/**\n * Retrieves and removes the head of this queue.\n * @return {T} The element at the head of this queue. Returns undefined if the\n *     queue is empty.\n */\ngoog.structs.Queue.prototype.dequeue = function() {\n  this.maybeFlip_();\n  return this.front_.pop();\n};\n\n\n/**\n * Retrieves but does not remove the head of this queue.\n * @return {T} The element at the head of this queue. Returns undefined if the\n *     queue is empty.\n */\ngoog.structs.Queue.prototype.peek = function() {\n  this.maybeFlip_();\n  return goog.array.peek(this.front_);\n};\n\n\n/**\n * Returns the number of elements in this queue.\n * @return {number} The number of elements in this queue.\n */\ngoog.structs.Queue.prototype.getCount = function() {\n  return this.front_.length + this.back_.length;\n};\n\n\n/**\n * Returns true if this queue contains no elements.\n * @return {boolean} true if this queue contains no elements.\n */\ngoog.structs.Queue.prototype.isEmpty = function() {\n  return goog.array.isEmpty(this.front_) && goog.array.isEmpty(this.back_);\n};\n\n\n/**\n * Removes all elements from the queue.\n */\ngoog.structs.Queue.prototype.clear = function() {\n  this.front_ = [];\n  this.back_ = [];\n};\n\n\n/**\n * Returns true if the given value is in the queue.\n * @param {T} obj The value to look for.\n * @return {boolean} Whether the object is in the queue.\n */\ngoog.structs.Queue.prototype.contains = function(obj) {\n  return goog.array.contains(this.front_, obj) ||\n      goog.array.contains(this.back_, obj);\n};\n\n\n/**\n * Removes the first occurrence of a particular value from the queue.\n * @param {T} obj Object to remove.\n * @return {boolean} True if an element was removed.\n */\ngoog.structs.Queue.prototype.remove = function(obj) {\n  return goog.array.removeLast(this.front_, obj) ||\n      goog.array.remove(this.back_, obj);\n};\n\n\n/**\n * Returns all the values in the queue.\n * @return {!Array<T>} An array of the values in the queue.\n */\ngoog.structs.Queue.prototype.getValues = function() {\n  var res = [];\n  // Add the front array in reverse, then the back array.\n  for (var i = this.front_.length - 1; i >= 0; --i) {\n    res.push(this.front_[i]);\n  }\n  var len = this.back_.length;\n  for (var i = 0; i < len; ++i) {\n    res.push(this.back_[i]);\n  }\n  return res;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/queue.js"],"^:1",["^9K",["~$goog.structs.Queue"]],"^9<",true,"^9=",["^9>","^;9"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.flatbuttonrenderer.js","^9C",["^9D","goog/ui/flatbuttonrenderer.js"],"^9E","goog/ui/flatbuttonrenderer.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Similar functionality of {@link goog.ui.ButtonRenderer},\n * but uses a <div> element instead of a <button> or <input> element.\n *\n */\n\ngoog.provide('goog.ui.FlatButtonRenderer');\n\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.asserts');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.ui.Button');\ngoog.require('goog.ui.ButtonRenderer');\ngoog.require('goog.ui.INLINE_BLOCK_CLASSNAME');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Flat renderer for {@link goog.ui.Button}s.  Flat buttons can contain\n * almost arbitrary HTML content, will flow like inline elements, but can be\n * styled like block-level elements.\n * @constructor\n * @extends {goog.ui.ButtonRenderer}\n */\ngoog.ui.FlatButtonRenderer = function() {\n  goog.ui.ButtonRenderer.call(this);\n};\ngoog.inherits(goog.ui.FlatButtonRenderer, goog.ui.ButtonRenderer);\ngoog.addSingletonGetter(goog.ui.FlatButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.FlatButtonRenderer.CSS_CLASS = goog.getCssName('goog-flat-button');\n\n\n/**\n * Returns the control's contents wrapped in a div element, with\n * the renderer's own CSS class and additional state-specific classes applied\n * to it, and the button's disabled attribute set or cleared as needed.\n * Overrides {@link goog.ui.ButtonRenderer#createDom}.\n * @param {goog.ui.Control} button Button to render.\n * @return {!Element} Root element for the button.\n * @override\n */\ngoog.ui.FlatButtonRenderer.prototype.createDom = function(button) {\n  var classNames = this.getClassNames(button);\n  var element = button.getDomHelper().createDom(\n      goog.dom.TagName.DIV,\n      goog.ui.INLINE_BLOCK_CLASSNAME + ' ' + classNames.join(' '),\n      button.getContent());\n  this.setTooltip(element, button.getTooltip());\n  return element;\n};\n\n\n/**\n * Returns the ARIA role to be applied to flat buttons.\n * @return {goog.a11y.aria.Role|undefined} ARIA role.\n * @override\n */\ngoog.ui.FlatButtonRenderer.prototype.getAriaRole = function() {\n  return goog.a11y.aria.Role.BUTTON;\n};\n\n\n/**\n * Returns true if this renderer can decorate the element.  Overrides\n * {@link goog.ui.ButtonRenderer#canDecorate} by returning true if the\n * element is a DIV, false otherwise.\n * @param {Element} element Element to decorate.\n * @return {boolean} Whether the renderer can decorate the element.\n * @override\n */\ngoog.ui.FlatButtonRenderer.prototype.canDecorate = function(element) {\n  return element.tagName == goog.dom.TagName.DIV;\n};\n\n\n/**\n * Takes an existing element and decorates it with the flat button control.\n * Initializes the control's ID, content, tooltip, value, and state based\n * on the ID of the element, its child nodes, and its CSS classes, respectively.\n * Returns the element.  Overrides {@link goog.ui.ButtonRenderer#decorate}.\n * @param {goog.ui.Control} button Button instance to decorate the element.\n * @param {Element} element Element to decorate.\n * @return {Element} Decorated element.\n * @override\n */\ngoog.ui.FlatButtonRenderer.prototype.decorate = function(button, element) {\n  goog.asserts.assert(element);\n  goog.dom.classlist.add(element, goog.ui.INLINE_BLOCK_CLASSNAME);\n  return goog.ui.FlatButtonRenderer.superClass_.decorate.call(\n      this, button, element);\n};\n\n\n/**\n * Flat buttons can't use the value attribute since they are div elements.\n * Overrides {@link goog.ui.ButtonRenderer#getValue} to prevent trying to\n * access the element's value.\n * @param {Element} element The button control's root element.\n * @return {string} Value not valid for flat buttons.\n * @override\n */\ngoog.ui.FlatButtonRenderer.prototype.getValue = function(element) {\n  // Flat buttons don't store their value in the DOM.\n  return '';\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.FlatButtonRenderer.prototype.getCssClass = function() {\n  return goog.ui.FlatButtonRenderer.CSS_CLASS;\n};\n\n\n// Register a decorator factory function for Flat Buttons.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.FlatButtonRenderer.CSS_CLASS, function() {\n      // Uses goog.ui.Button, but with FlatButtonRenderer.\n      return new goog.ui.Button(null, goog.ui.FlatButtonRenderer.getInstance());\n    });\n","^9I",1579837703000,"^9J",["^9K",["^:E","^:;","^;G","^9>","^:>","^JZ","^JU","^GH","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/flatbuttonrenderer.js"],"^:1",["^9K",["^KJ"]],"^9<",true,"^9=",["^9>","^;G","^:E","^;=","^:;","^JU","^JZ","^GH","^:>"]],["^ ","^9A",[1579837703000],"^9B","goog.useragent.platform.js","^9C",["^9D","goog/useragent/platform.js"],"^9E","goog/useragent/platform.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for getting details about the user's platform.\n */\n\ngoog.provide('goog.userAgent.platform');\n\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n/**\n * Detects the version of the OS/platform the browser is running in. Not\n * supported for Linux, where an empty string is returned.\n *\n * @private\n * @return {string} The platform version.\n */\ngoog.userAgent.platform.determineVersion_ = function() {\n  var re;\n  if (goog.userAgent.WINDOWS) {\n    re = /Windows NT ([0-9.]+)/;\n    var match = re.exec(goog.userAgent.getUserAgentString());\n    if (match) {\n      return match[1];\n    } else {\n      return '0';\n    }\n  } else if (goog.userAgent.MAC) {\n    re = /10[_.][0-9_.]+/;\n    var match = re.exec(goog.userAgent.getUserAgentString());\n    // Note: some old versions of Camino do not report an OSX version.\n    // Default to 10.\n    return match ? match[0].replace(/_/g, '.') : '10';\n  } else if (goog.userAgent.ANDROID) {\n    re = /Android\\s+([^\\);]+)(\\)|;)/;\n    var match = re.exec(goog.userAgent.getUserAgentString());\n    return match ? match[1] : '';\n  } else if (\n      goog.userAgent.IPHONE || goog.userAgent.IPAD || goog.userAgent.IPOD) {\n    re = /(?:iPhone|CPU)\\s+OS\\s+(\\S+)/;\n    var match = re.exec(goog.userAgent.getUserAgentString());\n    // Report the version as x.y.z and not x_y_z\n    return match ? match[1].replace(/_/g, '.') : '';\n  }\n\n  return '';\n};\n\n\n/**\n * The version of the platform. We don't determine the version of Linux.\n * For Windows, we only look at the NT version. Non-NT-based versions\n * (e.g. 95, 98, etc.) are given version 0.0.\n * @type {string}\n */\ngoog.userAgent.platform.VERSION = goog.userAgent.platform.determineVersion_();\n\n\n/**\n * Whether the user agent platform version is higher or the same as the given\n * version.\n *\n * @param {string|number} version The version to check.\n * @return {boolean} Whether the user agent platform version is higher or the\n *     same as the given version.\n */\ngoog.userAgent.platform.isVersion = function(version) {\n  return goog.string.compareVersions(\n             goog.userAgent.platform.VERSION, version) >= 0;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9L","^9>","^:S"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/useragent/platform.js"],"^:1",["^9K",["~$goog.userAgent.platform"]],"^9<",true,"^9=",["^9>","^9L","^:S"]],["^ ","^9A",[1579837703000],"^9B","goog.storage.mechanism.html5localstorage.js","^9C",["^9D","goog/storage/mechanism/html5localstorage.js"],"^9E","goog/storage/mechanism/html5localstorage.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides data persistence using HTML5 local storage\n * mechanism. Local storage must be available under window.localStorage,\n * see: http://www.w3.org/TR/webstorage/#the-localstorage-attribute.\n *\n */\n\ngoog.provide('goog.storage.mechanism.HTML5LocalStorage');\n\ngoog.require('goog.storage.mechanism.HTML5WebStorage');\n\n\n\n/**\n * Provides a storage mechanism that uses HTML5 local storage.\n *\n * @constructor\n * @struct\n * @extends {goog.storage.mechanism.HTML5WebStorage}\n */\ngoog.storage.mechanism.HTML5LocalStorage = function() {\n  var storage = null;\n\n  try {\n    // May throw an exception in cases where the local storage object\n    // is visible but access to it is disabled.\n    storage = window.localStorage || null;\n  } catch (e) {\n  }\n  goog.storage.mechanism.HTML5LocalStorage.base(this, 'constructor', storage);\n};\ngoog.inherits(\n    goog.storage.mechanism.HTML5LocalStorage,\n    goog.storage.mechanism.HTML5WebStorage);\n","^9I",1579837703000,"^9J",["^9K",["^9>","^K2"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/mechanism/html5localstorage.js"],"^:1",["^9K",["~$goog.storage.mechanism.HTML5LocalStorage"]],"^9<",true,"^9=",["^9>","^K2"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.tree.basenode.js","^9C",["^9D","goog/ui/tree/basenode.js"],"^9E","goog/ui/tree/basenode.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the goog.ui.tree.BaseNode class.\n *\n * @author arv@google.com (Erik Arvidsson)\n * @author eae@google.com (Emil A Eklund)\n *\n * This is a based on the webfx tree control. It since been updated to add\n * typeahead support, as well as accessibility support using ARIA framework.\n * See file comment in treecontrol.js.\n */\n\ngoog.provide('goog.ui.tree.BaseNode');\ngoog.provide('goog.ui.tree.BaseNode.EventType');\n\ngoog.forwardDeclare('goog.ui.tree.TreeControl');\ngoog.require('goog.Timer');\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.asserts');\ngoog.require('goog.dom.safe');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.SafeStyle');\ngoog.require('goog.string');\ngoog.require('goog.string.StringBuffer');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');  // circular\n\n\n\n/**\n * An abstract base class for a node in the tree.\n *\n * @param {string|!goog.html.SafeHtml} content The content of the node label.\n *     Strings are treated as plain-text and will be HTML escaped.\n * @param {Object=} opt_config The configuration for the tree. See\n *    {@link goog.ui.tree.BaseNode.defaultConfig}. If not specified the\n *    default config will be used.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.Component}\n */\ngoog.ui.tree.BaseNode = function(content, opt_config, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * The configuration for the tree.\n   * @type {Object}\n   * @private\n   */\n  this.config_ = opt_config || goog.ui.tree.BaseNode.defaultConfig;\n\n  /**\n   * HTML content of the node label.\n   * @type {!goog.html.SafeHtml}\n   * @private\n   */\n  this.html_ = goog.html.SafeHtml.htmlEscapePreservingNewlines(content);\n\n  /** @private {string} */\n  this.iconClass_;\n\n  /** @private {string} */\n  this.expandedIconClass_;\n\n  /** @protected {goog.ui.tree.TreeControl} */\n  this.tree;\n\n  /** @private {goog.ui.tree.BaseNode} */\n  this.previousSibling_;\n\n  /** @private {goog.ui.tree.BaseNode} */\n  this.nextSibling_;\n\n  /** @private {goog.ui.tree.BaseNode} */\n  this.firstChild_;\n\n  /** @private {goog.ui.tree.BaseNode} */\n  this.lastChild_;\n\n  /**\n   * Whether the tree item is selected.\n   * @private {boolean}\n   */\n  this.selected_ = false;\n\n  /**\n   * Whether the tree node is expanded.\n   * @private {boolean}\n   */\n  this.expanded_ = false;\n\n  /**\n   * Tooltip for the tree item\n   * @private {?string}\n   */\n  this.toolTip_ = null;\n\n  /**\n   * HTML that can appear after the label (so not inside the anchor).\n   * @private {!goog.html.SafeHtml}\n   */\n  this.afterLabelHtml_ = goog.html.SafeHtml.EMPTY;\n\n  /**\n   * Whether to allow user to collapse this node.\n   * @private {boolean}\n   */\n  this.isUserCollapsible_ = true;\n\n  /**\n   * Nesting depth of this node; cached result of computeDepth_.\n   * -1 if value has not been cached.\n   * @private {number}\n   */\n  this.depth_ = -1;\n};\ngoog.inherits(goog.ui.tree.BaseNode, goog.ui.Component);\n\n\n/**\n * The event types dispatched by this class.\n * @enum {string}\n */\ngoog.ui.tree.BaseNode.EventType = {\n  BEFORE_EXPAND: 'beforeexpand',\n  EXPAND: 'expand',\n  BEFORE_COLLAPSE: 'beforecollapse',\n  COLLAPSE: 'collapse'\n};\n\n\n/**\n * Map of nodes in existence. Needed to route events to the appropriate nodes.\n * Nodes are added to the map at {@link #enterDocument} time and removed at\n * {@link #exitDocument} time.\n * @type {Object}\n * @protected\n */\ngoog.ui.tree.BaseNode.allNodes = {};\n\n\n/** @override */\ngoog.ui.tree.BaseNode.prototype.disposeInternal = function() {\n  goog.ui.tree.BaseNode.superClass_.disposeInternal.call(this);\n  if (this.tree) {\n    this.tree.removeNode(this);\n    this.tree = null;\n  }\n  this.setElementInternal(null);\n};\n\n\n/**\n * Adds roles and states.\n * @protected\n */\ngoog.ui.tree.BaseNode.prototype.initAccessibility = function() {\n  var el = this.getElement();\n  if (el) {\n    // Set an id for the label\n    var label = this.getLabelElement();\n    if (label && !label.id) {\n      label.id = this.getId() + '.label';\n    }\n\n    goog.a11y.aria.setRole(el, 'treeitem');\n    goog.a11y.aria.setState(el, 'selected', false);\n    goog.a11y.aria.setState(el, 'level', this.getDepth());\n    if (label) {\n      goog.a11y.aria.setState(el, 'labelledby', label.id);\n    }\n\n    var img = this.getIconElement();\n    if (img) {\n      goog.a11y.aria.setRole(img, 'presentation');\n    }\n    var ei = this.getExpandIconElement();\n    if (ei) {\n      goog.a11y.aria.setRole(ei, 'presentation');\n    }\n\n    var ce = this.getChildrenElement();\n    if (ce) {\n      goog.a11y.aria.setRole(ce, 'group');\n\n      // In case the children will be created lazily.\n      if (ce.hasChildNodes()) {\n        // Only set aria-expanded if the node has children (can be expanded).\n        goog.a11y.aria.setState(el, goog.a11y.aria.State.EXPANDED, false);\n\n        // do setsize for each child\n        var count = this.getChildCount();\n        for (var i = 1; i <= count; i++) {\n          var child = this.getChildAt(i - 1).getElement();\n          goog.asserts.assert(child, 'The child element cannot be null');\n          goog.a11y.aria.setState(child, 'setsize', count);\n          goog.a11y.aria.setState(child, 'posinset', i);\n        }\n      }\n    }\n  }\n};\n\n\n/** @override */\ngoog.ui.tree.BaseNode.prototype.createDom = function() {\n  var element = this.getDomHelper().safeHtmlToNode(this.toSafeHtml());\n  this.setElementInternal(/** @type {!Element} */ (element));\n};\n\n\n/** @override */\ngoog.ui.tree.BaseNode.prototype.enterDocument = function() {\n  goog.ui.tree.BaseNode.superClass_.enterDocument.call(this);\n  goog.ui.tree.BaseNode.allNodes[this.getId()] = this;\n  this.initAccessibility();\n};\n\n\n/** @override */\ngoog.ui.tree.BaseNode.prototype.exitDocument = function() {\n  goog.ui.tree.BaseNode.superClass_.exitDocument.call(this);\n  delete goog.ui.tree.BaseNode.allNodes[this.getId()];\n};\n\n\n/**\n * The method assumes that the child doesn't have parent node yet.\n * The `opt_render` argument is not used. If the parent node is expanded,\n * the child node's state will be the same as the parent's. Otherwise the\n * child's DOM tree won't be created.\n * @override\n */\ngoog.ui.tree.BaseNode.prototype.addChildAt = function(\n    child, index, opt_render) {\n  goog.asserts.assert(!child.getParent());\n  goog.asserts.assertInstanceof(child, goog.ui.tree.BaseNode);\n  var prevNode = this.getChildAt(index - 1);\n  var nextNode = this.getChildAt(index);\n\n  goog.ui.tree.BaseNode.superClass_.addChildAt.call(this, child, index);\n\n  child.previousSibling_ = prevNode;\n  child.nextSibling_ = nextNode;\n\n  if (prevNode) {\n    prevNode.nextSibling_ = child;\n  } else {\n    this.firstChild_ = child;\n  }\n  if (nextNode) {\n    nextNode.previousSibling_ = child;\n  } else {\n    this.lastChild_ = child;\n  }\n\n  var tree = this.getTree();\n  if (tree) {\n    child.setTreeInternal(tree);\n  }\n\n  child.setDepth_(this.getDepth() + 1);\n\n  var el = this.getElement();\n  if (el) {\n    this.updateExpandIcon();\n    goog.a11y.aria.setState(\n        el, goog.a11y.aria.State.EXPANDED, this.getExpanded());\n    if (this.getExpanded()) {\n      var childrenEl = this.getChildrenElement();\n      if (!child.getElement()) {\n        child.createDom();\n      }\n      var childElement = child.getElement();\n      var nextElement = nextNode && nextNode.getElement();\n      childrenEl.insertBefore(childElement, nextElement);\n\n      if (this.isInDocument()) {\n        child.enterDocument();\n      }\n\n      if (!nextNode) {\n        if (prevNode) {\n          prevNode.updateExpandIcon();\n        } else {\n          goog.style.setElementShown(childrenEl, true);\n          this.setExpanded(this.getExpanded());\n        }\n      }\n    }\n  }\n};\n\n\n/**\n * Adds a node as a child to the current node.\n * @param {goog.ui.tree.BaseNode} child The child to add.\n * @param {goog.ui.tree.BaseNode=} opt_before If specified, the new child is\n *    added as a child before this one. If not specified, it's appended to the\n *    end.\n * @return {!goog.ui.tree.BaseNode} The added child.\n */\ngoog.ui.tree.BaseNode.prototype.add = function(child, opt_before) {\n  goog.asserts.assert(\n      !opt_before || opt_before.getParent() == this,\n      'Can only add nodes before siblings');\n  if (child.getParent()) {\n    child.getParent().removeChild(child);\n  }\n  this.addChildAt(\n      child, opt_before ? this.indexOfChild(opt_before) : this.getChildCount());\n  return child;\n};\n\n\n/**\n * Removes a child. The caller is responsible for disposing the node.\n * @param {goog.ui.Component|string} childNode The child to remove. Must be a\n *     {@link goog.ui.tree.BaseNode}.\n * @param {boolean=} opt_unrender Unused. The child will always be unrendered.\n * @return {!goog.ui.tree.BaseNode} The child that was removed.\n * @override\n */\ngoog.ui.tree.BaseNode.prototype.removeChild = function(\n    childNode, opt_unrender) {\n  // In reality, this only accepts BaseNodes.\n  var child = /** @type {goog.ui.tree.BaseNode} */ (childNode);\n\n  // if we remove selected or tree with the selected we should select this\n  var tree = this.getTree();\n  var selectedNode = tree ? tree.getSelectedItem() : null;\n  if (selectedNode == child || child.contains(selectedNode)) {\n    if (tree.hasFocus()) {\n      this.select();\n      goog.Timer.callOnce(this.onTimeoutSelect_, 10, this);\n    } else {\n      this.select();\n    }\n  }\n\n  goog.ui.tree.BaseNode.superClass_.removeChild.call(this, child);\n\n  if (this.lastChild_ == child) {\n    this.lastChild_ = child.previousSibling_;\n  }\n  if (this.firstChild_ == child) {\n    this.firstChild_ = child.nextSibling_;\n  }\n  if (child.previousSibling_) {\n    child.previousSibling_.nextSibling_ = child.nextSibling_;\n  }\n  if (child.nextSibling_) {\n    child.nextSibling_.previousSibling_ = child.previousSibling_;\n  }\n\n  var wasLast = child.isLastSibling();\n\n  child.tree = null;\n  child.depth_ = -1;\n\n  if (tree) {\n    // Tell the tree control that the child node is now removed.\n    tree.removeNode(child);\n\n    if (this.isInDocument()) {\n      var childrenEl = this.getChildrenElement();\n\n      if (child.isInDocument()) {\n        var childEl = child.getElement();\n        childrenEl.removeChild(childEl);\n\n        child.exitDocument();\n      }\n\n      if (wasLast) {\n        var newLast = this.getLastChild();\n        if (newLast) {\n          newLast.updateExpandIcon();\n        }\n      }\n      if (!this.hasChildren()) {\n        childrenEl.style.display = 'none';\n        this.updateExpandIcon();\n        this.updateIcon_();\n\n        var el = this.getElement();\n        if (el) {\n          goog.a11y.aria.removeState(el, goog.a11y.aria.State.EXPANDED);\n        }\n      }\n    }\n  }\n\n  return child;\n};\n\n\n/**\n * @deprecated Use {@link #removeChild}.\n */\ngoog.ui.tree.BaseNode.prototype.remove =\n    goog.ui.tree.BaseNode.prototype.removeChild;\n\n\n/**\n * Handler for setting focus asynchronously.\n * @private\n */\ngoog.ui.tree.BaseNode.prototype.onTimeoutSelect_ = function() {\n  this.select();\n};\n\n\n/**\n * Returns the tree.\n * @return {?goog.ui.tree.TreeControl}\n */\ngoog.ui.tree.BaseNode.prototype.getTree = goog.abstractMethod;\n\n\n/**\n * Returns the depth of the node in the tree. Should not be overridden.\n * @return {number} The non-negative depth of this node (the root is zero).\n */\ngoog.ui.tree.BaseNode.prototype.getDepth = function() {\n  var depth = this.depth_;\n  if (depth < 0) {\n    depth = this.computeDepth_();\n    this.setDepth_(depth);\n  }\n  return depth;\n};\n\n\n/**\n * Computes the depth of the node in the tree.\n * Called only by getDepth, when the depth hasn't already been cached.\n * @return {number} The non-negative depth of this node (the root is zero).\n * @private\n */\ngoog.ui.tree.BaseNode.prototype.computeDepth_ = function() {\n  var parent = this.getParent();\n  if (parent) {\n    return parent.getDepth() + 1;\n  } else {\n    return 0;\n  }\n};\n\n\n/**\n * Changes the depth of a node (and all its descendants).\n * @param {number} depth The new nesting depth; must be non-negative.\n * @private\n */\ngoog.ui.tree.BaseNode.prototype.setDepth_ = function(depth) {\n  if (depth != this.depth_) {\n    this.depth_ = depth;\n    var row = this.getRowElement();\n    if (row) {\n      var indent = this.getPixelIndent_() + 'px';\n      if (this.isRightToLeft()) {\n        row.style.paddingRight = indent;\n      } else {\n        row.style.paddingLeft = indent;\n      }\n    }\n    this.forEachChild(function(child) { child.setDepth_(depth + 1); });\n  }\n};\n\n\n/**\n * Returns true if the node is a descendant of this node\n * @param {goog.ui.tree.BaseNode} node The node to check.\n * @return {boolean} True if the node is a descendant of this node, false\n *    otherwise.\n */\ngoog.ui.tree.BaseNode.prototype.contains = function(node) {\n  var current = node;\n  while (current) {\n    if (current == this) {\n      return true;\n    }\n    current = current.getParent();\n  }\n  return false;\n};\n\n\n/**\n * An array of empty children to return for nodes that have no children.\n * @type {!Array<!goog.ui.tree.BaseNode>}\n * @private\n */\ngoog.ui.tree.BaseNode.EMPTY_CHILDREN_ = [];\n\n\n/**\n * @param {number} index 0-based index.\n * @return {goog.ui.tree.BaseNode} The child at the given index; null if none.\n */\ngoog.ui.tree.BaseNode.prototype.getChildAt;\n\n\n/**\n * Returns the children of this node.\n * @return {!Array<!goog.ui.tree.BaseNode>} The children.\n */\ngoog.ui.tree.BaseNode.prototype.getChildren = function() {\n  var children = [];\n  this.forEachChild(function(child) { children.push(child); });\n  return children;\n};\n\n\n/**\n * @return {goog.ui.tree.BaseNode} The first child of this node.\n */\ngoog.ui.tree.BaseNode.prototype.getFirstChild = function() {\n  return this.getChildAt(0);\n};\n\n\n/**\n * @return {goog.ui.tree.BaseNode} The last child of this node.\n */\ngoog.ui.tree.BaseNode.prototype.getLastChild = function() {\n  return this.getChildAt(this.getChildCount() - 1);\n};\n\n\n/**\n * @return {goog.ui.tree.BaseNode} The previous sibling of this node.\n */\ngoog.ui.tree.BaseNode.prototype.getPreviousSibling = function() {\n  return this.previousSibling_;\n};\n\n\n/**\n * @return {goog.ui.tree.BaseNode} The next sibling of this node.\n */\ngoog.ui.tree.BaseNode.prototype.getNextSibling = function() {\n  return this.nextSibling_;\n};\n\n\n/**\n * @return {boolean} Whether the node is the last sibling.\n */\ngoog.ui.tree.BaseNode.prototype.isLastSibling = function() {\n  return !this.nextSibling_;\n};\n\n\n/**\n * @return {boolean} Whether the node is selected.\n */\ngoog.ui.tree.BaseNode.prototype.isSelected = function() {\n  return this.selected_;\n};\n\n\n/**\n * Selects the node.\n */\ngoog.ui.tree.BaseNode.prototype.select = function() {\n  var tree = this.getTree();\n  if (tree) {\n    tree.setSelectedItem(this);\n  }\n};\n\n\n/**\n * Originally it was intended to deselect the node but never worked.\n * @deprecated Use `tree.setSelectedItem(null)`.\n */\ngoog.ui.tree.BaseNode.prototype.deselect = goog.nullFunction;\n\n\n/**\n * Called from the tree to instruct the node change its selection state.\n * @param {boolean} selected The new selection state.\n * @protected\n */\ngoog.ui.tree.BaseNode.prototype.setSelectedInternal = function(selected) {\n  if (this.selected_ == selected) {\n    return;\n  }\n  this.selected_ = selected;\n\n  this.updateRow();\n\n  var el = this.getElement();\n  if (el) {\n    goog.a11y.aria.setState(el, 'selected', selected);\n    if (selected) {\n      var treeElement = this.getTree().getElement();\n      goog.asserts.assert(\n          treeElement, 'The DOM element for the tree cannot be null');\n      goog.a11y.aria.setState(treeElement, 'activedescendant', this.getId());\n    }\n  }\n};\n\n\n/**\n * @return {boolean} Whether the node is expanded.\n */\ngoog.ui.tree.BaseNode.prototype.getExpanded = function() {\n  return this.expanded_;\n};\n\n\n/**\n * Sets the node to be expanded internally, without state change events.\n * @param {boolean} expanded Whether to expand or close the node.\n */\ngoog.ui.tree.BaseNode.prototype.setExpandedInternal = function(expanded) {\n  this.expanded_ = expanded;\n};\n\n\n/**\n * Sets the node to be expanded.\n * @param {boolean} expanded Whether to expand or close the node.\n */\ngoog.ui.tree.BaseNode.prototype.setExpanded = function(expanded) {\n  var isStateChange = expanded != this.expanded_;\n  if (isStateChange) {\n    // Only fire events if the expanded state has actually changed.\n    var prevented = !this.dispatchEvent(\n        expanded ? goog.ui.tree.BaseNode.EventType.BEFORE_EXPAND :\n                   goog.ui.tree.BaseNode.EventType.BEFORE_COLLAPSE);\n    if (prevented) return;\n  }\n  var ce;\n  this.expanded_ = expanded;\n  var tree = this.getTree();\n  var el = this.getElement();\n\n  if (this.hasChildren()) {\n    if (!expanded && tree && this.contains(tree.getSelectedItem())) {\n      this.select();\n    }\n\n    if (el) {\n      ce = this.getChildrenElement();\n      if (ce) {\n        goog.style.setElementShown(ce, expanded);\n        goog.a11y.aria.setState(el, goog.a11y.aria.State.EXPANDED, expanded);\n\n        // Make sure we have the HTML for the children here.\n        if (expanded && this.isInDocument() && !ce.hasChildNodes()) {\n          var children = [];\n          this.forEachChild(function(child) {\n            children.push(child.toSafeHtml());\n          });\n          goog.dom.safe.setInnerHtml(ce, goog.html.SafeHtml.concat(children));\n          this.forEachChild(function(child) { child.enterDocument(); });\n        }\n      }\n      this.updateExpandIcon();\n    }\n  } else {\n    ce = this.getChildrenElement();\n    if (ce) {\n      goog.style.setElementShown(ce, false);\n    }\n  }\n  if (el) {\n    this.updateIcon_();\n  }\n\n  if (isStateChange) {\n    this.dispatchEvent(\n        expanded ? goog.ui.tree.BaseNode.EventType.EXPAND :\n                   goog.ui.tree.BaseNode.EventType.COLLAPSE);\n  }\n};\n\n\n/**\n * Toggles the expanded state of the node.\n */\ngoog.ui.tree.BaseNode.prototype.toggle = function() {\n  this.setExpanded(!this.getExpanded());\n};\n\n\n/**\n * Expands the node.\n */\ngoog.ui.tree.BaseNode.prototype.expand = function() {\n  this.setExpanded(true);\n};\n\n\n/**\n * Collapses the node.\n */\ngoog.ui.tree.BaseNode.prototype.collapse = function() {\n  this.setExpanded(false);\n};\n\n\n/**\n * Collapses the children of the node.\n */\ngoog.ui.tree.BaseNode.prototype.collapseChildren = function() {\n  this.forEachChild(function(child) { child.collapseAll(); });\n};\n\n\n/**\n * Collapses the children and the node.\n */\ngoog.ui.tree.BaseNode.prototype.collapseAll = function() {\n  this.collapseChildren();\n  this.collapse();\n};\n\n\n/**\n * Expands the children of the node.\n */\ngoog.ui.tree.BaseNode.prototype.expandChildren = function() {\n  this.forEachChild(function(child) { child.expandAll(); });\n};\n\n\n/**\n * Expands the children and the node.\n */\ngoog.ui.tree.BaseNode.prototype.expandAll = function() {\n  this.expandChildren();\n  this.expand();\n};\n\n\n/**\n * Expands the parent chain of this node so that it is visible.\n */\ngoog.ui.tree.BaseNode.prototype.reveal = function() {\n  var parent = this.getParent();\n  if (parent) {\n    parent.setExpanded(true);\n    parent.reveal();\n  }\n};\n\n\n/**\n * Sets whether the node will allow the user to collapse it.\n * @param {boolean} isCollapsible Whether to allow node collapse.\n */\ngoog.ui.tree.BaseNode.prototype.setIsUserCollapsible = function(isCollapsible) {\n  this.isUserCollapsible_ = isCollapsible;\n  if (!this.isUserCollapsible_) {\n    this.expand();\n  }\n  if (this.getElement()) {\n    this.updateExpandIcon();\n  }\n};\n\n\n/**\n * @return {boolean} Whether the node is collapsible by user actions.\n */\ngoog.ui.tree.BaseNode.prototype.isUserCollapsible = function() {\n  return this.isUserCollapsible_;\n};\n\n\n/**\n * Creates HTML for the node.\n * @return {!goog.html.SafeHtml}\n * @protected\n */\ngoog.ui.tree.BaseNode.prototype.toSafeHtml = function() {\n  var tree = this.getTree();\n  var hideLines = !tree.getShowLines() ||\n      tree == this.getParent() && !tree.getShowRootLines();\n\n  var childClass =\n      hideLines ? this.config_.cssChildrenNoLines : this.config_.cssChildren;\n\n  var nonEmptyAndExpanded = this.getExpanded() && this.hasChildren();\n\n  var attributes = {'class': childClass, 'style': this.getLineStyle()};\n\n  var content = [];\n  if (nonEmptyAndExpanded) {\n    // children\n    this.forEachChild(function(child) { content.push(child.toSafeHtml()); });\n  }\n\n  var children = goog.html.SafeHtml.create('div', attributes, content);\n\n  return goog.html.SafeHtml.create(\n      'div', {'class': this.config_.cssItem, 'id': this.getId()},\n      [this.getRowSafeHtml(), children]);\n};\n\n\n/**\n * @return {number} The pixel indent of the row.\n * @private\n */\ngoog.ui.tree.BaseNode.prototype.getPixelIndent_ = function() {\n  return Math.max(0, (this.getDepth() - 1) * this.config_.indentWidth);\n};\n\n\n/**\n * @return {!goog.html.SafeHtml} The html for the row.\n * @protected\n */\ngoog.ui.tree.BaseNode.prototype.getRowSafeHtml = function() {\n  var style = {};\n  style['padding-' + (this.isRightToLeft() ? 'right' : 'left')] =\n      this.getPixelIndent_() + 'px';\n  var attributes = {'class': this.getRowClassName(), 'style': style};\n  var content = [\n    this.getExpandIconSafeHtml(), this.getIconSafeHtml(),\n    this.getLabelSafeHtml()\n  ];\n  return goog.html.SafeHtml.create('div', attributes, content);\n};\n\n\n/**\n * @return {string} The class name for the row.\n * @protected\n */\ngoog.ui.tree.BaseNode.prototype.getRowClassName = function() {\n  var selectedClass;\n  if (this.isSelected()) {\n    selectedClass = ' ' + this.config_.cssSelectedRow;\n  } else {\n    selectedClass = '';\n  }\n  return this.config_.cssTreeRow + selectedClass;\n};\n\n\n/**\n * @return {!goog.html.SafeHtml} The html for the label.\n * @protected\n */\ngoog.ui.tree.BaseNode.prototype.getLabelSafeHtml = function() {\n  var html = goog.html.SafeHtml.create(\n      'span',\n      {'class': this.config_.cssItemLabel, 'title': this.getToolTip() || null},\n      this.getSafeHtml());\n  return goog.html.SafeHtml.concat(\n      html,\n      goog.html.SafeHtml.create('span', {}, this.getAfterLabelSafeHtml()));\n};\n\n\n/**\n * Returns the html that appears after the label. This is useful if you want to\n * put extra UI on the row of the label but not inside the anchor tag.\n * @return {string} The html.\n * @final\n */\ngoog.ui.tree.BaseNode.prototype.getAfterLabelHtml = function() {\n  return goog.html.SafeHtml.unwrap(this.getAfterLabelSafeHtml());\n};\n\n\n/**\n * Returns the html that appears after the label. This is useful if you want to\n * put extra UI on the row of the label but not inside the anchor tag.\n * @return {!goog.html.SafeHtml} The html.\n */\ngoog.ui.tree.BaseNode.prototype.getAfterLabelSafeHtml = function() {\n  return this.afterLabelHtml_;\n};\n\n\n/**\n * Sets the html that appears after the label. This is useful if you want to\n * put extra UI on the row of the label but not inside the anchor tag.\n * @param {!goog.html.SafeHtml} html The html.\n */\ngoog.ui.tree.BaseNode.prototype.setAfterLabelSafeHtml = function(html) {\n  this.afterLabelHtml_ = html;\n  var el = this.getAfterLabelElement();\n  if (el) {\n    goog.dom.safe.setInnerHtml(el, html);\n  }\n};\n\n\n/**\n * @return {!goog.html.SafeHtml} The html for the icon.\n * @protected\n */\ngoog.ui.tree.BaseNode.prototype.getIconSafeHtml = function() {\n  return goog.html.SafeHtml.create('span', {\n    'style': {'display': 'inline-block'},\n    'class': this.getCalculatedIconClass()\n  });\n};\n\n\n/**\n * Gets the calculated icon class.\n * @protected\n */\ngoog.ui.tree.BaseNode.prototype.getCalculatedIconClass = goog.abstractMethod;\n\n\n/**\n * @return {!goog.html.SafeHtml} The source for the icon.\n * @protected\n */\ngoog.ui.tree.BaseNode.prototype.getExpandIconSafeHtml = function() {\n  return goog.html.SafeHtml.create('span', {\n    'type': 'expand',\n    'style': {'display': 'inline-block'},\n    'class': this.getExpandIconClass()\n  });\n};\n\n\n/**\n * @return {string} The class names of the icon used for expanding the node.\n * @protected\n */\ngoog.ui.tree.BaseNode.prototype.getExpandIconClass = function() {\n  var tree = this.getTree();\n  var hideLines = !tree.getShowLines() ||\n      tree == this.getParent() && !tree.getShowRootLines();\n\n  var config = this.config_;\n  var sb = new goog.string.StringBuffer();\n  sb.append(config.cssTreeIcon, ' ', config.cssExpandTreeIcon, ' ');\n\n  if (this.hasChildren()) {\n    var bits = 0;\n    /*\n      Bitmap used to determine which icon to use\n      1  Plus\n      2  Minus\n      4  T Line\n      8  L Line\n    */\n\n    if (tree.getShowExpandIcons() && this.isUserCollapsible_) {\n      if (this.getExpanded()) {\n        bits = 2;\n      } else {\n        bits = 1;\n      }\n    }\n\n    if (!hideLines) {\n      if (this.isLastSibling()) {\n        bits += 4;\n      } else {\n        bits += 8;\n      }\n    }\n\n    switch (bits) {\n      case 1:\n        sb.append(config.cssExpandTreeIconPlus);\n        break;\n      case 2:\n        sb.append(config.cssExpandTreeIconMinus);\n        break;\n      case 4:\n        sb.append(config.cssExpandTreeIconL);\n        break;\n      case 5:\n        sb.append(config.cssExpandTreeIconLPlus);\n        break;\n      case 6:\n        sb.append(config.cssExpandTreeIconLMinus);\n        break;\n      case 8:\n        sb.append(config.cssExpandTreeIconT);\n        break;\n      case 9:\n        sb.append(config.cssExpandTreeIconTPlus);\n        break;\n      case 10:\n        sb.append(config.cssExpandTreeIconTMinus);\n        break;\n      default:  // 0\n        sb.append(config.cssExpandTreeIconBlank);\n    }\n  } else {\n    if (hideLines) {\n      sb.append(config.cssExpandTreeIconBlank);\n    } else if (this.isLastSibling()) {\n      sb.append(config.cssExpandTreeIconL);\n    } else {\n      sb.append(config.cssExpandTreeIconT);\n    }\n  }\n  return sb.toString();\n};\n\n\n/**\n * @return {!goog.html.SafeStyle} The line style.\n */\ngoog.ui.tree.BaseNode.prototype.getLineStyle = function() {\n  var nonEmptyAndExpanded = this.getExpanded() && this.hasChildren();\n  return goog.html.SafeStyle.create({\n    'background-position': this.getBackgroundPosition(),\n    'display': nonEmptyAndExpanded ? null : 'none'\n  });\n};\n\n\n/**\n * @return {string} The background position style value.\n */\ngoog.ui.tree.BaseNode.prototype.getBackgroundPosition = function() {\n  return (this.isLastSibling() ? '-100' : (this.getDepth() - 1) *\n                  this.config_.indentWidth) +\n      'px 0';\n};\n\n\n/**\n * @return {Element} The element for the tree node.\n * @override\n */\ngoog.ui.tree.BaseNode.prototype.getElement = function() {\n  var el = goog.ui.tree.BaseNode.superClass_.getElement.call(this);\n  if (!el) {\n    el = this.getDomHelper().getElement(this.getId());\n    this.setElementInternal(el);\n  }\n  return el;\n};\n\n\n/**\n * @return {Element} The row is the div that is used to draw the node without\n *     the children.\n */\ngoog.ui.tree.BaseNode.prototype.getRowElement = function() {\n  var el = this.getElement();\n  return el ? /** @type {Element} */ (el.firstChild) : null;\n};\n\n\n/**\n * @return {Element} The expanded icon element.\n * @protected\n */\ngoog.ui.tree.BaseNode.prototype.getExpandIconElement = function() {\n  var el = this.getRowElement();\n  return el ? /** @type {Element} */ (el.firstChild) : null;\n};\n\n\n/**\n * @return {Element} The icon element.\n * @protected\n */\ngoog.ui.tree.BaseNode.prototype.getIconElement = function() {\n  var el = this.getRowElement();\n  return el ? /** @type {Element} */ (el.childNodes[1]) : null;\n};\n\n\n/**\n * @return {Element} The label element.\n */\ngoog.ui.tree.BaseNode.prototype.getLabelElement = function() {\n  var el = this.getRowElement();\n  // TODO: find/fix race condition that requires us to add\n  // the lastChild check\n  return el && el.lastChild ?\n      /** @type {Element} */ (el.lastChild.previousSibling) :\n                             null;\n};\n\n\n/**\n * @return {Element} The element after the label.\n */\ngoog.ui.tree.BaseNode.prototype.getAfterLabelElement = function() {\n  var el = this.getRowElement();\n  return el ? /** @type {Element} */ (el.lastChild) : null;\n};\n\n\n/**\n * @return {Element} The div containing the children.\n * @protected\n */\ngoog.ui.tree.BaseNode.prototype.getChildrenElement = function() {\n  var el = this.getElement();\n  return el ? /** @type {Element} */ (el.lastChild) : null;\n};\n\n\n/**\n * Sets the icon class for the node.\n * @param {string} s The icon class.\n */\ngoog.ui.tree.BaseNode.prototype.setIconClass = function(s) {\n  this.iconClass_ = s;\n  if (this.isInDocument()) {\n    this.updateIcon_();\n  }\n};\n\n\n/**\n * Gets the icon class for the node.\n * @return {string} s The icon source.\n */\ngoog.ui.tree.BaseNode.prototype.getIconClass = function() {\n  return this.iconClass_;\n};\n\n\n/**\n * Sets the icon class for when the node is expanded.\n * @param {string} s The expanded icon class.\n */\ngoog.ui.tree.BaseNode.prototype.setExpandedIconClass = function(s) {\n  this.expandedIconClass_ = s;\n  if (this.isInDocument()) {\n    this.updateIcon_();\n  }\n};\n\n\n/**\n * Gets the icon class for when the node is expanded.\n * @return {string} The class.\n */\ngoog.ui.tree.BaseNode.prototype.getExpandedIconClass = function() {\n  return this.expandedIconClass_;\n};\n\n\n/**\n * Sets the text of the label.\n * @param {string} s The plain text of the label.\n */\ngoog.ui.tree.BaseNode.prototype.setText = function(s) {\n  this.setSafeHtml(goog.html.SafeHtml.htmlEscape(s));\n};\n\n\n/**\n * Returns the text of the label. If the text was originally set as HTML, the\n * return value is unspecified.\n * @return {string} The plain text of the label.\n */\ngoog.ui.tree.BaseNode.prototype.getText = function() {\n  return goog.string.unescapeEntities(goog.html.SafeHtml.unwrap(this.html_));\n};\n\n\n/**\n * Sets the HTML of the label.\n * @param {!goog.html.SafeHtml} html The HTML object for the label.\n */\ngoog.ui.tree.BaseNode.prototype.setSafeHtml = function(html) {\n  this.html_ = html;\n  var el = this.getLabelElement();\n  if (el) {\n    goog.dom.safe.setInnerHtml(el, html);\n  }\n  var tree = this.getTree();\n  if (tree) {\n    // Tell the tree control about the updated label text.\n    tree.setNode(this);\n  }\n};\n\n\n/**\n * Returns the html of the label.\n * @return {string} The html string of the label.\n * @final\n */\ngoog.ui.tree.BaseNode.prototype.getHtml = function() {\n  return goog.html.SafeHtml.unwrap(this.getSafeHtml());\n};\n\n\n/**\n * Returns the html of the label.\n * @return {!goog.html.SafeHtml} The html string of the label.\n */\ngoog.ui.tree.BaseNode.prototype.getSafeHtml = function() {\n  return this.html_;\n};\n\n\n/**\n * Sets the text of the tooltip.\n * @param {string} s The tooltip text to set.\n */\ngoog.ui.tree.BaseNode.prototype.setToolTip = function(s) {\n  this.toolTip_ = s;\n  var el = this.getLabelElement();\n  if (el) {\n    el.title = s;\n  }\n};\n\n\n/**\n * Returns the text of the tooltip.\n * @return {?string} The tooltip text.\n */\ngoog.ui.tree.BaseNode.prototype.getToolTip = function() {\n  return this.toolTip_;\n};\n\n\n/**\n * Updates the row styles.\n */\ngoog.ui.tree.BaseNode.prototype.updateRow = function() {\n  var rowEl = this.getRowElement();\n  if (rowEl) {\n    rowEl.className = this.getRowClassName();\n  }\n};\n\n\n/**\n * Updates the expand icon of the node.\n */\ngoog.ui.tree.BaseNode.prototype.updateExpandIcon = function() {\n  var img = this.getExpandIconElement();\n  if (img) {\n    img.className = this.getExpandIconClass();\n  }\n  var cel = this.getChildrenElement();\n  if (cel) {\n    cel.style.backgroundPosition = this.getBackgroundPosition();\n  }\n};\n\n\n/**\n * Updates the icon of the node. Assumes that this.getElement() is created.\n * @private\n */\ngoog.ui.tree.BaseNode.prototype.updateIcon_ = function() {\n  this.getIconElement().className = this.getCalculatedIconClass();\n};\n\n\n/**\n * Handles mouse down event.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @protected\n */\ngoog.ui.tree.BaseNode.prototype.onMouseDown = function(e) {\n  var el = e.target;\n  // expand icon\n  var type = el.getAttribute('type');\n  if (type == 'expand' && this.hasChildren()) {\n    if (this.isUserCollapsible_) {\n      this.toggle();\n    }\n    return;\n  }\n\n  this.select();\n  this.updateRow();\n};\n\n\n/**\n * Handles a click event.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @protected\n * @suppress {underscore|visibility}\n */\ngoog.ui.tree.BaseNode.prototype.onClick_ = goog.events.Event.preventDefault;\n\n\n/**\n * Handles a double click event.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @protected\n * @suppress {underscore|visibility}\n */\ngoog.ui.tree.BaseNode.prototype.onDoubleClick_ = function(e) {\n  var el = e.target;\n  // expand icon\n  var type = el.getAttribute('type');\n  if (type == 'expand' && this.hasChildren()) {\n    return;\n  }\n\n  if (this.isUserCollapsible_) {\n    this.toggle();\n  }\n};\n\n\n/**\n * Handles a key down event.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @return {boolean} The handled value.\n * @protected\n */\ngoog.ui.tree.BaseNode.prototype.onKeyDown = function(e) {\n  var handled = true;\n  switch (e.keyCode) {\n    case goog.events.KeyCodes.RIGHT:\n      if (e.altKey) {\n        break;\n      }\n      if (this.hasChildren()) {\n        if (!this.getExpanded()) {\n          this.setExpanded(true);\n        } else {\n          this.getFirstChild().select();\n        }\n      }\n      break;\n\n    case goog.events.KeyCodes.LEFT:\n      if (e.altKey) {\n        break;\n      }\n      if (this.hasChildren() && this.getExpanded() && this.isUserCollapsible_) {\n        this.setExpanded(false);\n      } else {\n        var parent = this.getParent();\n        var tree = this.getTree();\n        // don't go to root if hidden\n        if (parent && (tree.getShowRootNode() || parent != tree)) {\n          parent.select();\n        }\n      }\n      break;\n\n    case goog.events.KeyCodes.DOWN:\n      var nextNode = this.getNextShownNode();\n      if (nextNode) {\n        nextNode.select();\n      }\n      break;\n\n    case goog.events.KeyCodes.UP:\n      var previousNode = this.getPreviousShownNode();\n      if (previousNode) {\n        previousNode.select();\n      }\n      break;\n\n    default:\n      handled = false;\n  }\n\n  if (handled) {\n    e.preventDefault();\n    var tree = this.getTree();\n    if (tree) {\n      // clear type ahead buffer as user navigates with arrow keys\n      tree.clearTypeAhead();\n    }\n  }\n\n  return handled;\n};\n\n\n\n/**\n * @return {goog.ui.tree.BaseNode} The last shown descendant.\n */\ngoog.ui.tree.BaseNode.prototype.getLastShownDescendant = function() {\n  if (!this.getExpanded() || !this.hasChildren()) {\n    return this;\n  }\n  // we know there is at least 1 child\n  return this.getLastChild().getLastShownDescendant();\n};\n\n\n/**\n * @return {goog.ui.tree.BaseNode} The next node to show or null if there isn't\n *     a next node to show.\n */\ngoog.ui.tree.BaseNode.prototype.getNextShownNode = function() {\n  if (this.hasChildren() && this.getExpanded()) {\n    return this.getFirstChild();\n  } else {\n    var parent = this;\n    var next;\n    while (parent != this.getTree()) {\n      next = parent.getNextSibling();\n      if (next != null) {\n        return next;\n      }\n      parent = parent.getParent();\n    }\n    return null;\n  }\n};\n\n\n/**\n * @return {goog.ui.tree.BaseNode} The previous node to show.\n */\ngoog.ui.tree.BaseNode.prototype.getPreviousShownNode = function() {\n  var ps = this.getPreviousSibling();\n  if (ps != null) {\n    return ps.getLastShownDescendant();\n  }\n  var parent = this.getParent();\n  var tree = this.getTree();\n  if (!tree.getShowRootNode() && parent == tree) {\n    return null;\n  }\n  // The root is the first node.\n  if (this == tree) {\n    return null;\n  }\n  return /** @type {goog.ui.tree.BaseNode} */ (parent);\n};\n\n\n/**\n * @return {*} Data set by the client.\n * @deprecated Use {@link #getModel} instead.\n */\ngoog.ui.tree.BaseNode.prototype.getClientData =\n    goog.ui.tree.BaseNode.prototype.getModel;\n\n\n/**\n * Sets client data to associate with the node.\n * @param {*} data The client data to associate with the node.\n * @deprecated Use {@link #setModel} instead.\n */\ngoog.ui.tree.BaseNode.prototype.setClientData =\n    goog.ui.tree.BaseNode.prototype.setModel;\n\n\n/**\n * @return {Object} The configuration for the tree.\n */\ngoog.ui.tree.BaseNode.prototype.getConfig = function() {\n  return this.config_;\n};\n\n\n/**\n * Internal method that is used to set the tree control on the node.\n * @param {goog.ui.tree.TreeControl} tree The tree control.\n */\ngoog.ui.tree.BaseNode.prototype.setTreeInternal = function(tree) {\n  if (this.tree != tree) {\n    this.tree = tree;\n    // Add new node to the type ahead node map.\n    tree.setNode(this);\n    this.forEachChild(function(child) { child.setTreeInternal(tree); });\n  }\n};\n\n\n/**\n * A default configuration for the tree.\n */\ngoog.ui.tree.BaseNode.defaultConfig = {\n  indentWidth: 19,\n  cssRoot: goog.getCssName('goog-tree-root') + ' ' +\n      goog.getCssName('goog-tree-item'),\n  cssHideRoot: goog.getCssName('goog-tree-hide-root'),\n  cssItem: goog.getCssName('goog-tree-item'),\n  cssChildren: goog.getCssName('goog-tree-children'),\n  cssChildrenNoLines: goog.getCssName('goog-tree-children-nolines'),\n  cssTreeRow: goog.getCssName('goog-tree-row'),\n  cssItemLabel: goog.getCssName('goog-tree-item-label'),\n  cssTreeIcon: goog.getCssName('goog-tree-icon'),\n  cssExpandTreeIcon: goog.getCssName('goog-tree-expand-icon'),\n  cssExpandTreeIconPlus: goog.getCssName('goog-tree-expand-icon-plus'),\n  cssExpandTreeIconMinus: goog.getCssName('goog-tree-expand-icon-minus'),\n  cssExpandTreeIconTPlus: goog.getCssName('goog-tree-expand-icon-tplus'),\n  cssExpandTreeIconTMinus: goog.getCssName('goog-tree-expand-icon-tminus'),\n  cssExpandTreeIconLPlus: goog.getCssName('goog-tree-expand-icon-lplus'),\n  cssExpandTreeIconLMinus: goog.getCssName('goog-tree-expand-icon-lminus'),\n  cssExpandTreeIconT: goog.getCssName('goog-tree-expand-icon-t'),\n  cssExpandTreeIconL: goog.getCssName('goog-tree-expand-icon-l'),\n  cssExpandTreeIconBlank: goog.getCssName('goog-tree-expand-icon-blank'),\n  cssExpandedFolderIcon: goog.getCssName('goog-tree-expanded-folder-icon'),\n  cssCollapsedFolderIcon: goog.getCssName('goog-tree-collapsed-folder-icon'),\n  cssFileIcon: goog.getCssName('goog-tree-file-icon'),\n  cssExpandedRootIcon: goog.getCssName('goog-tree-expanded-folder-icon'),\n  cssCollapsedRootIcon: goog.getCssName('goog-tree-collapsed-folder-icon'),\n  cssSelectedRow: goog.getCssName('selected')\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^><","^?H","^9L","^:=","^9>","^<1","^G3","^@B","^?M","^<3","^;8","^>R","^@C"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/tree/basenode.js"],"^:1",["^9K",["~$goog.ui.tree.BaseNode.EventType","~$goog.ui.tree.BaseNode"]],"^9<",true,"^9=",["^9>","^><","^?H","^?M","^:E","^@B","^;8","^>R","^@C","^G3","^9L","^<1","^<3","^:="]],["^ ","^9A",[1579837703000],"^9B","goog.ui.buttonside.js","^9C",["^9D","goog/ui/buttonside.js"],"^9E","goog/ui/buttonside.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Enum for button side constants. In its own file so as to not\n * cause a circular dependency with {@link goog.ui.ButtonRenderer}.\n *\n * @author doughtie@google.com (Gavin Doughtie)\n */\n\ngoog.provide('goog.ui.ButtonSide');\n\n\n/**\n * Constants for button sides, see {@link goog.ui.Button.prototype.setCollapsed}\n * for details.\n * @enum {number}\n */\ngoog.ui.ButtonSide = {\n  /** Neither side. */\n  NONE: 0,\n  /** Left for LTR, right for RTL. */\n  START: 1,\n  /** Right for LTR, left for RTL. */\n  END: 2,\n  /** Both sides. */\n  BOTH: 3\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/buttonside.js"],"^:1",["^9K",["^JX"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.media.flashobject.js","^9C",["^9D","goog/ui/media/flashobject.js"],"^9E","goog/ui/media/flashobject.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Wrapper on a Flash object embedded in the HTML page.\n * This class contains routines for writing the HTML to create the Flash object\n * using a goog.ui.Component approach. Tested on Firefox 1.5, 2 and 3, IE6, 7,\n * Konqueror, Chrome and Safari.\n *\n * Based on http://go/flashobject.js\n *\n * Based on the following compatibility test suite:\n * http://www.bobbyvandersluis.com/flashembed/testsuite/\n *\n * TODO(user): take a look at swfobject, and maybe use it instead of the current\n * flash embedding method.\n *\n * Examples of usage:\n *\n * <pre>\n *   var url = goog.html.TrustedResourceUrl.fromConstant(\n *       goog.string.Const.from('https://hostname/flash.swf'))\n *   var flash = new goog.ui.media.FlashObject(url);\n *   flash.setFlashVar('myvar', 'foo');\n *   flash.render(goog.dom.getElement('parent'));\n * </pre>\n *\n * TODO(user, jessan): create a goog.ui.media.BrowserInterfaceFlashObject that\n * subclasses goog.ui.media.FlashObject to provide all the goodness of\n * http://go/browserinterface.as\n *\n */\n\ngoog.provide('goog.ui.media.FlashObject');\ngoog.provide('goog.ui.media.FlashObject.ScriptAccessLevel');\ngoog.provide('goog.ui.media.FlashObject.Wmodes');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.html.flash');\ngoog.require('goog.log');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.structs.Map');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.userAgent');\ngoog.require('goog.userAgent.flash');\n\n\n\n/**\n * A very simple flash wrapper, that allows you to create flash object\n * programmatically, instead of embedding your own HTML. It extends\n * {@link goog.ui.Component}, which makes it very easy to be embedded on the\n * page.\n *\n * @param {!goog.html.TrustedResourceUrl} flashUrl The Flash SWF URL.\n * @param {goog.dom.DomHelper=} opt_domHelper An optional DomHelper.\n * @extends {goog.ui.Component}\n * @constructor\n */\ngoog.ui.media.FlashObject = function(flashUrl, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * The URL of the flash movie to be embedded.\n   *\n   * @type {!goog.html.TrustedResourceUrl}\n   * @private\n   */\n  this.flashUrl_ = flashUrl;\n\n  /**\n   * An event handler used to handle events consistently between browsers.\n   * @type {goog.events.EventHandler<!goog.ui.media.FlashObject>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  /**\n   * A map of variables to be passed to the flash movie.\n   *\n   * @type {goog.structs.Map}\n   * @private\n   */\n  this.flashVars_ = new goog.structs.Map();\n};\ngoog.inherits(goog.ui.media.FlashObject, goog.ui.Component);\n\n\n/**\n * Different states of loaded-ness in which the SWF itself can be\n *\n * Talked about at:\n * http://kb.adobe.com/selfservice/viewContent.do?externalId=tn_12059&sliceId=1\n *\n * @enum {number}\n * @private\n */\ngoog.ui.media.FlashObject.SwfReadyStates_ = {\n  LOADING: 0,\n  UNINITIALIZED: 1,\n  LOADED: 2,\n  INTERACTIVE: 3,\n  COMPLETE: 4\n};\n\n\n/**\n * IE specific ready states.\n *\n * @see https://msdn.microsoft.com/en-us/library/ms534359(v=vs.85).aspx\n * @enum {string}\n * @private\n */\ngoog.ui.media.FlashObject.IeSwfReadyStates_ = {\n  LOADING: 'loading',\n  UNINITIALIZED: 'uninitialized',\n  LOADED: 'loaded',\n  INTERACTIVE: 'interactive',\n  COMPLETE: 'complete'\n};\n\n\n/**\n * The different modes for displaying a SWF. Note that different wmodes\n * can result in different bugs in different browsers and also that\n * both OPAQUE and TRANSPARENT will result in a performance hit.\n *\n * @enum {string}\n */\ngoog.ui.media.FlashObject.Wmodes = {\n  /**\n   * Allows for z-ordering of the SWF.\n   */\n  OPAQUE: 'opaque',\n\n  /**\n   * Allows for z-ordering of the SWF and plays the SWF with a transparent BG.\n   */\n  TRANSPARENT: 'transparent',\n\n  /**\n   * The default wmode. Does not allow for z-ordering of the SWF.\n   */\n  WINDOW: 'window'\n};\n\n\n/**\n * The different levels of allowScriptAccess.\n *\n * Talked about at:\n * http://kb2.adobe.com/cps/164/tn_16494.html\n *\n * @enum {string}\n */\ngoog.ui.media.FlashObject.ScriptAccessLevel = {\n  /*\n   * The flash object can always communicate with its container page.\n   */\n  ALWAYS: 'always',\n\n  /*\n   * The flash object can only communicate with its container page if they are\n   * hosted in the same domain.\n   */\n  SAME_DOMAIN: 'sameDomain',\n\n  /*\n   * The flash can not communicate with its container page.\n   */\n  NEVER: 'never'\n};\n\n\n/**\n * The component CSS namespace.\n *\n * @type {string}\n */\ngoog.ui.media.FlashObject.CSS_CLASS = goog.getCssName('goog-ui-media-flash');\n\n\n/**\n * The flash object CSS class.\n *\n * @type {string}\n */\ngoog.ui.media.FlashObject.FLASH_CSS_CLASS =\n    goog.getCssName('goog-ui-media-flash-object');\n\n\n/**\n * A logger used for debugging.\n *\n * @type {goog.log.Logger}\n * @private\n */\ngoog.ui.media.FlashObject.prototype.logger_ =\n    goog.log.getLogger('goog.ui.media.FlashObject');\n\n\n/**\n * The wmode for the SWF.\n *\n * @type {goog.ui.media.FlashObject.Wmodes}\n * @private\n */\ngoog.ui.media.FlashObject.prototype.wmode_ =\n    goog.ui.media.FlashObject.Wmodes.WINDOW;\n\n\n/**\n * The minimum required flash version.\n *\n * @type {?string}\n * @private\n */\ngoog.ui.media.FlashObject.prototype.requiredVersion_;\n\n\n/**\n * The flash movie width.\n *\n * @type {string}\n * @private\n */\ngoog.ui.media.FlashObject.prototype.width_;\n\n\n/**\n * The flash movie height.\n *\n * @type {string}\n * @private\n */\ngoog.ui.media.FlashObject.prototype.height_;\n\n\n/**\n * The flash movie background color.\n *\n * @type {string}\n * @private\n */\ngoog.ui.media.FlashObject.prototype.backgroundColor_ = '#000000';\n\n\n/**\n * The flash movie allowScriptAccess setting.\n *\n * @type {string}\n * @private\n */\ngoog.ui.media.FlashObject.prototype.allowScriptAccess_ =\n    goog.ui.media.FlashObject.ScriptAccessLevel.SAME_DOMAIN;\n\n\n/**\n * Sets the flash movie Wmode.\n *\n * @param {goog.ui.media.FlashObject.Wmodes} wmode the flash movie Wmode.\n * @return {!goog.ui.media.FlashObject} The flash object instance for chaining.\n */\ngoog.ui.media.FlashObject.prototype.setWmode = function(wmode) {\n  this.wmode_ = wmode;\n  return this;\n};\n\n\n/**\n * @return {string} Returns the flash movie wmode.\n */\ngoog.ui.media.FlashObject.prototype.getWmode = function() {\n  return this.wmode_;\n};\n\n\n/**\n * Adds flash variables.\n *\n * @param {goog.structs.Map|Object} map A key-value map of variables.\n * @return {!goog.ui.media.FlashObject} The flash object instance for chaining.\n */\ngoog.ui.media.FlashObject.prototype.addFlashVars = function(map) {\n  this.flashVars_.addAll(map);\n  return this;\n};\n\n\n/**\n * Sets a flash variable.\n *\n * @param {string} key The name of the flash variable.\n * @param {string} value The value of the flash variable.\n * @return {!goog.ui.media.FlashObject} The flash object instance for chaining.\n */\ngoog.ui.media.FlashObject.prototype.setFlashVar = function(key, value) {\n  this.flashVars_.set(key, value);\n  return this;\n};\n\n\n/**\n * Sets flash variables. You can either pass a Map of key->value pairs or you\n * can pass a key, value pair to set a specific variable.\n *\n * TODO(user, martino): Get rid of this method.\n *\n * @deprecated Use {@link #addFlashVars} or {@link #setFlashVar} instead.\n * @param {goog.structs.Map|Object|string} flashVar A map of variables (given\n *    as a goog.structs.Map or an Object literal) or a key to the optional\n *    `opt_value`.\n * @param {string=} opt_value The optional value for the flashVar key.\n * @return {!goog.ui.media.FlashObject} The flash object instance for chaining.\n */\ngoog.ui.media.FlashObject.prototype.setFlashVars = function(\n    flashVar, opt_value) {\n  if (flashVar instanceof goog.structs.Map ||\n      goog.typeOf(flashVar) == 'object') {\n    this.addFlashVars(/**@type {!goog.structs.Map|!Object}*/ (flashVar));\n  } else {\n    goog.asserts.assert(\n        typeof flashVar === 'string' && opt_value !== undefined,\n        'Invalid argument(s)');\n    this.setFlashVar(\n        /**@type {string}*/ (flashVar),\n        /**@type {string}*/ (opt_value));\n  }\n  return this;\n};\n\n\n/**\n * @return {goog.structs.Map} The current flash variables.\n */\ngoog.ui.media.FlashObject.prototype.getFlashVars = function() {\n  return this.flashVars_;\n};\n\n\n/**\n * Sets the background color of the movie.\n *\n * @param {string} color The new color to be set.\n * @return {!goog.ui.media.FlashObject} The flash object instance for chaining.\n */\ngoog.ui.media.FlashObject.prototype.setBackgroundColor = function(color) {\n  this.backgroundColor_ = color;\n  return this;\n};\n\n\n/**\n * @return {string} The background color of the movie.\n */\ngoog.ui.media.FlashObject.prototype.getBackgroundColor = function() {\n  return this.backgroundColor_;\n};\n\n\n/**\n * Sets the allowScriptAccess setting of the movie.\n *\n * @param {string} value The new value to be set.\n * @return {!goog.ui.media.FlashObject} The flash object instance for chaining.\n */\ngoog.ui.media.FlashObject.prototype.setAllowScriptAccess = function(value) {\n  this.allowScriptAccess_ = value;\n  return this;\n};\n\n\n/**\n * @return {string} The allowScriptAccess setting color of the movie.\n */\ngoog.ui.media.FlashObject.prototype.getAllowScriptAccess = function() {\n  return this.allowScriptAccess_;\n};\n\n\n/**\n * Sets the width and height of the movie.\n *\n * @param {number|string} width The width of the movie.\n * @param {number|string} height The height of the movie.\n * @return {!goog.ui.media.FlashObject} The flash object instance for chaining.\n */\ngoog.ui.media.FlashObject.prototype.setSize = function(width, height) {\n  this.width_ = (typeof width === 'string') ? width : Math.round(width) + 'px';\n  this.height_ =\n      (typeof height === 'string') ? height : Math.round(height) + 'px';\n  if (this.getElement()) {\n    goog.style.setSize(this.getFlashElement(), this.width_, this.height_);\n  }\n  return this;\n};\n\n\n/**\n * @return {?string} The flash required version.\n */\ngoog.ui.media.FlashObject.prototype.getRequiredVersion = function() {\n  return this.requiredVersion_;\n};\n\n\n/**\n * Sets the minimum flash required version.\n *\n * @param {?string} version The minimum required version for this movie to work,\n *     or null if you want to unset it.\n * @return {!goog.ui.media.FlashObject} The flash object instance for chaining.\n */\ngoog.ui.media.FlashObject.prototype.setRequiredVersion = function(version) {\n  this.requiredVersion_ = version;\n  return this;\n};\n\n\n/**\n * Returns whether this SWF has a minimum required flash version.\n *\n * @return {boolean} Whether a required version was set or not.\n */\ngoog.ui.media.FlashObject.prototype.hasRequiredVersion = function() {\n  return this.requiredVersion_ != null;\n};\n\n\n/**\n * Writes the Flash embedding `HTMLObjectElement` to this components root\n * element and adds listeners for all events to handle them consistently.\n * @override\n */\ngoog.ui.media.FlashObject.prototype.enterDocument = function() {\n  goog.ui.media.FlashObject.superClass_.enterDocument.call(this);\n\n  // The SWF tag must be written after this component's element is appended to\n  // the DOM. Otherwise Flash's ExternalInterface is broken in IE.\n  goog.dom.safe.setInnerHtml(\n      /** @type {!Element} */ (this.getElement()), this.createSwfTag_());\n  if (this.width_ && this.height_) {\n    this.setSize(this.width_, this.height_);\n  }\n\n  // Sinks all the events on the bubble phase.\n  //\n  // Flash plugins propagates events from/to the plugin to the browser\n  // inconsistently:\n  //\n  // 1) FF2 + linux: the flash plugin will stop the propagation of all events\n  // from the plugin to the browser.\n  // 2) FF3 + mac: the flash plugin will propagate events on the <embed> object\n  // but that will get propagated to its parents.\n  // 3) Safari 3.1.1 + mac: the flash plugin will propagate the event to the\n  // <object> tag that event will propagate to its parents.\n  // 4) IE7 + windows: the flash plugin  will eat all events, not propagating\n  // anything to the javascript.\n  // 5) Chrome + windows: the flash plugin will eat all events, not propagating\n  // anything to the javascript.\n  //\n  // To overcome this inconsistency, all events from/to the plugin are sinked,\n  // since you can't assume that the events will be propagated.\n  //\n  // NOTE(user): we only sink events on the bubbling phase, since there are no\n  // inexpensive/scalable way to stop events on the capturing phase unless we\n  // added an event listener on the document for each flash object.\n  this.eventHandler_.listen(\n      this.getElement(), goog.object.getValues(goog.events.EventType),\n      goog.events.Event.stopPropagation);\n};\n\n\n/**\n * Creates the DOM structure.\n *\n * @override\n */\ngoog.ui.media.FlashObject.prototype.createDom = function() {\n  if (this.hasRequiredVersion() &&\n      !goog.userAgent.flash.isVersion(\n          /** @type {string} */ (this.getRequiredVersion()))) {\n    goog.log.warning(\n        this.logger_,\n        'Required flash version not found:' + this.getRequiredVersion());\n    throw new Error(goog.ui.Component.Error.NOT_SUPPORTED);\n  }\n\n  var element = this.getDomHelper().createElement(goog.dom.TagName.DIV);\n  element.className = goog.ui.media.FlashObject.CSS_CLASS;\n  this.setElementInternal(element);\n};\n\n\n/**\n * Creates the HTML to embed the flash object.\n *\n * @return {!goog.html.SafeHtml} Browser appropriate HTML to add the SWF to the\n *     DOM.\n * @private\n */\ngoog.ui.media.FlashObject.prototype.createSwfTag_ = function() {\n  var keys = this.flashVars_.getKeys();\n  var values = this.flashVars_.getValues();\n  var flashVars = [];\n  for (var i = 0; i < keys.length; i++) {\n    var key = goog.string.urlEncode(keys[i]);\n    var value = goog.string.urlEncode(values[i]);\n    flashVars.push(key + '=' + value);\n  }\n  var flashVarsString = flashVars.join('&');\n  if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(11)) {\n    return this.createSwfTagOldIe_(flashVarsString);\n  } else {\n    return this.createSwfTagModern_(flashVarsString);\n  }\n};\n\n\n/**\n * Creates the HTML to embed the flash object for IE>=11 and other browsers.\n *\n * @param {string} flashVars The value of the FlashVars attribute.\n * @return {!goog.html.SafeHtml} Browser appropriate HTML to add the SWF to the\n *     DOM.\n * @private\n */\ngoog.ui.media.FlashObject.prototype.createSwfTagModern_ = function(flashVars) {\n  return goog.html.flash.createEmbed(this.flashUrl_, {\n    'AllowScriptAccess': this.allowScriptAccess_,\n    'allowFullScreen': 'true',\n    'allowNetworking': 'all',\n    'bgcolor': this.backgroundColor_,\n    'class': goog.ui.media.FlashObject.FLASH_CSS_CLASS,\n    'FlashVars': flashVars,\n    'id': this.getId(),\n    'name': this.getId(),\n    'quality': 'high',\n    'SeamlessTabbing': 'false',\n    'wmode': this.wmode_\n  });\n};\n\n\n/**\n * Creates the HTML to embed the flash object for IE<11.\n *\n * @param {string} flashVars The value of the FlashVars attribute.\n * @return {!goog.html.SafeHtml} Browser appropriate HTML to add the SWF to the\n *     DOM.\n * @private\n */\ngoog.ui.media.FlashObject.prototype.createSwfTagOldIe_ = function(flashVars) {\n  return goog.html.flash.createObjectForOldIe(\n      this.flashUrl_, {\n        'allowFullScreen': 'true',\n        'AllowScriptAccess': this.allowScriptAccess_,\n        'allowNetworking': 'all',\n        'bgcolor': this.backgroundColor_,\n        'FlashVars': flashVars,\n        'quality': 'high',\n        'SeamlessTabbing': 'false',\n        'wmode': this.wmode_\n      },\n      {\n        'class': goog.ui.media.FlashObject.FLASH_CSS_CLASS,\n        'id': this.getId(),\n        'name': this.getId()\n      });\n};\n\n\n/**\n * @return {HTMLObjectElement} The flash element or null if the element can't\n *     be found.\n */\ngoog.ui.media.FlashObject.prototype.getFlashElement = function() {\n  return /** @type {HTMLObjectElement} */ (\n      this.getElement() ? this.getElement().firstChild : null);\n};\n\n\n/** @override */\ngoog.ui.media.FlashObject.prototype.disposeInternal = function() {\n  goog.ui.media.FlashObject.superClass_.disposeInternal.call(this);\n  this.flashVars_ = null;\n\n  this.eventHandler_.dispose();\n  this.eventHandler_ = null;\n};\n\n\n/**\n * @return {boolean} whether the SWF has finished loading or not.\n */\ngoog.ui.media.FlashObject.prototype.isLoaded = function() {\n  if (!this.isInDocument() || !this.getElement()) {\n    return false;\n  }\n\n  // IE has different readyState values for elements.\n  if (goog.userAgent.EDGE_OR_IE && this.getFlashElement().readyState &&\n      this.getFlashElement().readyState ==\n          goog.ui.media.FlashObject.IeSwfReadyStates_.COMPLETE) {\n    return true;\n  }\n\n  if (this.getFlashElement().readyState &&\n      this.getFlashElement().readyState ==\n          goog.ui.media.FlashObject.SwfReadyStates_.COMPLETE) {\n    return true;\n  }\n\n  // Use \"in\" operator to check for PercentLoaded because IE8 throws when\n  // accessing directly. See:\n  // https://github.com/google/closure-library/pull/373.\n  if ('PercentLoaded' in this.getFlashElement() &&\n      this.getFlashElement().PercentLoaded() == 100) {\n    return true;\n  }\n\n  return false;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^=I","^>;","^TK","^9L","^=[","^:=","^9>","^;P","^:S","^;Q","^:I","~$goog.html.flash","^@B","^<3","^;8","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/media/flashobject.js"],"^:1",["^9K",["~$goog.ui.media.FlashObject.Wmodes","~$goog.ui.media.FlashObject.ScriptAccessLevel","^=N"]],"^9<",true,"^9=",["^9>","^:E","^;=","^@B","^;8","^>;","^:I","^=I","^VO","^;Q","^;P","^9L","^=[","^<3","^:=","^:S","^TK"]],["^ ","^9A",[1579837703000],"^9B","goog.proto2.fielddescriptor.js","^9C",["^9D","goog/proto2/fielddescriptor.js"],"^9E","goog/proto2/fielddescriptor.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Protocol Buffer Field Descriptor class.\n */\n\ngoog.provide('goog.proto2.FieldDescriptor');\n\ngoog.forwardDeclare('goog.proto2.Descriptor');\ngoog.forwardDeclare('goog.proto2.Message');\ngoog.require('goog.asserts');\ngoog.require('goog.string');\n\n\n\n/**\n * A class which describes a field in a Protocol Buffer 2 Message.\n *\n * @param {function(new:goog.proto2.Message)} messageType Constructor for the\n *     message class to which the field described by this class belongs.\n * @param {number|string} tag The field's tag index.\n * @param {{\n *       name: string,\n *       fieldType: !goog.proto2.FieldDescriptor.FieldType,\n *       type: !Function,\n *       repeated: (*|undefined),\n *       required: (*|undefined),\n *       packed: (*|undefined),\n *       defaultValue: (*|undefined)\n *     }} metadata The metadata about this field\n *     that will be used to construct this descriptor.\n *\n * @constructor\n * @final\n */\ngoog.proto2.FieldDescriptor = function(messageType, tag, metadata) {\n  /**\n   * The message type that contains the field that this\n   * descriptor describes.\n   * @private {function(new:goog.proto2.Message)}\n   */\n  this.parent_ = messageType;\n\n  // Ensure that the tag is numeric.\n  goog.asserts.assert(goog.string.isNumeric(tag));\n\n  /**\n   * The field's tag number.\n   * @private {number}\n   */\n  this.tag_ = /** @type {number} */ (tag);\n\n  /**\n   * The field's name.\n   * @private {string}\n   */\n  this.name_ = metadata.name;\n\n  /**\n   * If true, this field is a packed field.\n   * @private {boolean}\n   */\n  this.isPacked_ = !!metadata.packed;\n\n  /**\n   * If true, this field is a repeating field.\n   * @private {boolean}\n   */\n  this.isRepeated_ = !!metadata.repeated;\n\n  /**\n   * If true, this field is required.\n   * @private {boolean}\n   */\n  this.isRequired_ = !!metadata.required;\n\n  /**\n   * The field type of this field.\n   * @private {goog.proto2.FieldDescriptor.FieldType}\n   */\n  this.fieldType_ = metadata.fieldType;\n\n  /**\n   * If this field is a primitive: The native (ECMAScript) type of this field.\n   * If an enumeration: The enumeration object.\n   * If a message or group field: The Message function.\n   * @private {Function}\n   */\n  this.nativeType_ = metadata.type;\n\n  /**\n   * Is it permissible on deserialization to convert between numbers and\n   * well-formed strings?  Is true for 64-bit integral field types and float and\n   * double types, false for all other field types.\n   * @private {boolean}\n   */\n  this.deserializationConversionPermitted_ = false;\n\n  switch (this.fieldType_) {\n    case goog.proto2.FieldDescriptor.FieldType.INT64:\n    case goog.proto2.FieldDescriptor.FieldType.UINT64:\n    case goog.proto2.FieldDescriptor.FieldType.FIXED64:\n    case goog.proto2.FieldDescriptor.FieldType.SFIXED64:\n    case goog.proto2.FieldDescriptor.FieldType.SINT64:\n    case goog.proto2.FieldDescriptor.FieldType.FLOAT:\n    case goog.proto2.FieldDescriptor.FieldType.DOUBLE:\n      this.deserializationConversionPermitted_ = true;\n      break;\n  }\n\n  /**\n   * The default value of this field, if different from the default, default\n   * value.\n   * @private {*}\n   */\n  this.defaultValue_ = metadata.defaultValue;\n};\n\n\n/**\n * An enumeration defining the possible field types.\n * Should be a mirror of that defined in descriptor.h.\n *\n * @enum {number}\n */\ngoog.proto2.FieldDescriptor.FieldType = {\n  DOUBLE: 1,\n  FLOAT: 2,\n  INT64: 3,\n  UINT64: 4,\n  INT32: 5,\n  FIXED64: 6,\n  FIXED32: 7,\n  BOOL: 8,\n  STRING: 9,\n  GROUP: 10,\n  MESSAGE: 11,\n  BYTES: 12,\n  UINT32: 13,\n  ENUM: 14,\n  SFIXED32: 15,\n  SFIXED64: 16,\n  SINT32: 17,\n  SINT64: 18\n};\n\n\n/**\n * Returns the tag of the field that this descriptor represents.\n *\n * @return {number} The tag number.\n */\ngoog.proto2.FieldDescriptor.prototype.getTag = function() {\n  return this.tag_;\n};\n\n\n/**\n * Returns the descriptor describing the message that defined this field.\n * @return {!goog.proto2.Descriptor} The descriptor.\n */\ngoog.proto2.FieldDescriptor.prototype.getContainingType = function() {\n  // Generated JS proto_library messages have getDescriptor() method which can\n  // be called with or without an instance.\n  return this.parent_.prototype.getDescriptor();\n};\n\n\n/**\n * Returns the name of the field that this descriptor represents.\n * @return {string} The name.\n */\ngoog.proto2.FieldDescriptor.prototype.getName = function() {\n  return this.name_;\n};\n\n\n/**\n * Returns the default value of this field.\n * @return {*} The default value.\n */\ngoog.proto2.FieldDescriptor.prototype.getDefaultValue = function() {\n  if (this.defaultValue_ === undefined) {\n    // Set the default value based on a new instance of the native type.\n    // This will be (0, false, \"\") for (number, boolean, string) and will\n    // be a new instance of a group/message if the field is a message type.\n    var nativeType = this.nativeType_;\n    if (nativeType === Boolean) {\n      this.defaultValue_ = false;\n    } else if (nativeType === Number) {\n      this.defaultValue_ = 0;\n    } else if (nativeType === String) {\n      if (this.deserializationConversionPermitted_) {\n        // This field is a 64 bit integer represented as a string.\n        this.defaultValue_ = '0';\n      } else {\n        this.defaultValue_ = '';\n      }\n    } else {\n      return new nativeType;\n    }\n  }\n\n  return this.defaultValue_;\n};\n\n\n/**\n * Returns the field type of the field described by this descriptor.\n * @return {goog.proto2.FieldDescriptor.FieldType} The field type.\n */\ngoog.proto2.FieldDescriptor.prototype.getFieldType = function() {\n  return this.fieldType_;\n};\n\n\n/**\n * Returns the native (i.e. ECMAScript) type of the field described by this\n * descriptor.\n *\n * @return {Object} The native type.\n */\ngoog.proto2.FieldDescriptor.prototype.getNativeType = function() {\n  return this.nativeType_;\n};\n\n\n/**\n * Returns true if simple conversions between numbers and strings are permitted\n * during deserialization for this field.\n *\n * @return {boolean} Whether conversion is permitted.\n */\ngoog.proto2.FieldDescriptor.prototype.deserializationConversionPermitted =\n    function() {\n  return this.deserializationConversionPermitted_;\n};\n\n\n/**\n * Returns the descriptor of the message type of this field. Only valid\n * for fields of type GROUP and MESSAGE.\n *\n * @return {!goog.proto2.Descriptor} The message descriptor.\n */\ngoog.proto2.FieldDescriptor.prototype.getFieldMessageType = function() {\n  // Generated JS proto_library messages have getDescriptor() method which can\n  // be called with or without an instance.\n  var messageClass =\n      /** @type {function(new:goog.proto2.Message)} */ (this.nativeType_);\n  return messageClass.prototype.getDescriptor();\n};\n\n\n/**\n * @return {boolean} True if the field stores composite data or repeated\n *     composite data (message or group).\n */\ngoog.proto2.FieldDescriptor.prototype.isCompositeType = function() {\n  return this.fieldType_ == goog.proto2.FieldDescriptor.FieldType.MESSAGE ||\n      this.fieldType_ == goog.proto2.FieldDescriptor.FieldType.GROUP;\n};\n\n\n/**\n * Returns whether the field described by this descriptor is packed.\n * @return {boolean} Whether the field is packed.\n */\ngoog.proto2.FieldDescriptor.prototype.isPacked = function() {\n  return this.isPacked_;\n};\n\n\n/**\n * Returns whether the field described by this descriptor is repeating.\n * @return {boolean} Whether the field is repeated.\n */\ngoog.proto2.FieldDescriptor.prototype.isRepeated = function() {\n  return this.isRepeated_;\n};\n\n\n/**\n * Returns whether the field described by this descriptor is required.\n * @return {boolean} Whether the field is required.\n */\ngoog.proto2.FieldDescriptor.prototype.isRequired = function() {\n  return this.isRequired_;\n};\n\n\n/**\n * Returns whether the field described by this descriptor is optional.\n * @return {boolean} Whether the field is optional.\n */\ngoog.proto2.FieldDescriptor.prototype.isOptional = function() {\n  return !this.isRepeated_ && !this.isRequired_;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9L","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/proto2/fielddescriptor.js"],"^:1",["^9K",["^I7"]],"^9<",true,"^9=",["^9>","^:E","^9L"]],["^ ","^9A",[1579837703000],"^9B","goog.labs.net.webchannel.js","^9C",["^9D","goog/labs/net/webchannel.js"],"^9E","goog/labs/net/webchannel.js","^9F","^9G","^9H","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The API spec for the WebChannel messaging library.\n *\n * Similar to HTML5 WebSocket and Closure BrowserChannel, WebChannel\n * offers an abstraction for point-to-point socket-like communication between\n * a browser client and a remote origin.\n *\n * WebChannels are created via <code>WebChannel</code>. Multiple WebChannels\n * may be multiplexed over the same WebChannelTransport, which represents\n * the underlying physical connectivity over standard wire protocols\n * such as HTTP and SPDY.\n *\n * A WebChannels in turn represents a logical communication channel between\n * the client and server end point. A WebChannel remains open for\n * as long as the client or server end-point allows.\n *\n * Messages may be delivered in-order or out-of-order, reliably or unreliably\n * over the same WebChannel. Message delivery guarantees of a WebChannel is\n * to be specified by the application code; and the choice of the\n * underlying wire protocols is completely transparent to the API users.\n *\n * Client-to-client messaging via WebRTC based transport may also be support\n * via the same WebChannel API in future.\n *\n * Note that we have no immediate plan to move this API out of labs. While\n * the implementation is production ready, the API is subject to change\n * (addition only):\n * 1. Adopt new Web APIs (mainly whatwg streams) and goog.net.streams.\n * 2. New programming models for cloud (on the server-side) may require\n *    new APIs to be defined.\n * 3. WebRTC DataChannel alignment\n *\n */\n\ngoog.provide('goog.net.WebChannel');\n\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.Listenable');\ngoog.require('goog.net.XmlHttpFactory');\n\n\n\n/**\n * A WebChannel represents a logical bi-directional channel over which the\n * client communicates with a remote server that holds the other endpoint\n * of the channel. A WebChannel is always created in the context of a shared\n * {@link WebChannelTransport} instance. It is up to the underlying client-side\n * and server-side implementations to decide how or when multiplexing is\n * to be enabled.\n *\n * @interface\n * @extends {EventTarget}\n * @extends {goog.events.Listenable}\n */\ngoog.net.WebChannel = function() {};\n\n\n\n/**\n * This interface defines a pluggable API to allow WebChannel runtime to support\n * customized algorithms in order to recover from transient failures such as\n * those failures caused by network or proxies (intermediaries).\n *\n * The algorithm may also choose to fail-fast, e.g. switch the client to some\n * offline mode.\n *\n * Extra measurements and logging could also be implemented in the custom\n * module, which has the full knowledge of all the state transitions\n * (due to failures).\n *\n * A default algorithm will be provided by the webchannel library itself. Custom\n * algorithms are expected to be tailored to specific client platforms or\n * networking environments, e.g. mobile, cellular network.\n *\n * @interface\n */\ngoog.net.WebChannel.FailureRecovery = function() {};\n\n\n/**\n * Configuration spec for newly created WebChannel instances.\n *\n * WebChannels are configured in the context of the containing\n * {@link WebChannelTransport}. The configuration parameters are specified\n * when a new instance of WebChannel is created via {@link WebChannelTransport}.\n *\n * messageHeaders: custom headers to be added to every message sent to the\n * server. This object is mutable, and custom headers may be changed, removed,\n * or added during the runtime after a channel has been opened.\n *\n * initMessageHeaders: similar to messageHeaders, but any custom headers will\n * be sent only once when the channel is opened. Typical usage is to send\n * an auth header to the server, which only checks the auth header at the time\n * when the channel is opened.\n *\n * messageContentType: sent as initMessageHeaders via X-WebChannel-Content-Type,\n * to inform the server the MIME type of WebChannel messages.\n *\n * messageUrlParams: custom url query parameters to be added to every message\n * sent to the server. This object is mutable, and custom parameters may be\n * changed, removed or added during the runtime after a channel has been opened.\n *\n * clientProtocolHeaderRequired: whether a special header should be added to\n * each message so that the server can dispatch webchannel messages without\n * knowing the URL path prefix. Defaults to false.\n *\n * concurrentRequestLimit: the maximum number of in-flight HTTP requests allowed\n * when SPDY is enabled. Currently we only detect SPDY in Chrome.\n * This parameter defaults to 10. When SPDY is not enabled, this parameter\n * will have no effect.\n *\n * supportsCrossDomainXhr: setting this to true to allow the use of sub-domains\n * (as configured by the server) to send XHRs with the CORS withCredentials\n * bit set to true.\n *\n * testUrl: the test URL for detecting connectivity during the initial\n * handshake. This parameter defaults to \"/<channel_url>/test\".\n *\n * sendRawJson: whether to bypass v8 encoding of client-sent messages.\n * This defaults to false now due to legacy servers. New applications should\n * always configure this option to true.\n *\n * httpSessionIdParam: the URL parameter name that contains the session id (\n * for sticky routing of HTTP requests). When this param is specified, a server\n * that supports this option will respond with an opaque session id as part of\n * the initial handshake (via the X-HTTP-Session-Id header); and all the\n * subsequent requests will contain the httpSessionIdParam. This option will\n * take precedence over any duplicated parameter specified with\n * messageUrlParams, whose value will be ignored.\n *\n * httpHeadersOverwriteParam: the URL parameter name to allow custom HTTP\n * headers to be overwritten as a URL param to bypass CORS preflight.\n * goog.net.rpc.HttpCors is used to encode the HTTP headers.\n *\n * backgroundChannelTest: whether to run the channel test (detecting networking\n * conditions) as a background process so the OPEN event will be fired sooner\n * to reduce the initial handshake delay. This option defaults to true.\n * The actual background channel test is not fully implemented.\n *\n * forceLongPolling: whether to force long-polling from client to server.\n * This defaults to false. Long-polling may be necessary when a (MITM) proxy\n * is buffering data sent by the server.\n *\n * fastHandshake: enable true 0-RTT message delivery, including\n * leveraging QUIC 0-RTT (which requires GET to be used). This option\n * defaults to false. Note it is allowed to send messages before Open event is\n * received, after a channel has been opened. In order to enable 0-RTT,\n * messages will be encoded as part of URL and therefore there needs be a size\n * limit for those initial messages that are sent immediately as part of the\n * GET handshake request. With sendRawJson=true, this limit is currently set\n * to 4K chars and data beyond this limit will be buffered till the handshake\n * (1-RTT) finishes. With sendRawJson=false, it's up to the application\n * to limit the amount of data that is sent as part of the handshake.\n *\n * disableRedact: whether to disable logging redact. By default, redact is\n * enabled to remove any message payload or user-provided info\n * from closure logs.\n *\n * clientProfile: inform the server about the client profile to enable\n * customized configs that are optimized for certain clients or environments.\n * Currently this information is sent via X-WebChannel-Client-Profile header.\n *\n * internalChannelParams: the internal channel parameter name to allow\n * experimental channel configurations. Supported options include fastfail,\n * baseRetryDelayMs, retryDelaySeedMs, forwardChannelMaxRetries and\n * forwardChannelRequestTimeoutMs. Note that these options are subject to\n * change.\n *\n * xmlHttpFactory: allows the caller to override the factory used to create\n * XMLHttpRequest objects. This is introduced to disable CORS on firefox OS.\n *\n * requestRefreshThresholds: client-side thresholds that decide when to refresh\n * an underlying HTTP request, to limit memory consumption due to XHR buffering\n * or compression context. The client-side thresholds should be signficantly\n * smaller than the server-side thresholds. This allows the client to eliminate\n * any latency introduced by request refreshing, i.e. an RTT window during which\n * messages may be buffered on the server-side. Supported params include\n * totalBytesReceived, totalDurationMs.\n *\n * @typedef {{\n *   messageHeaders: (!Object<string, string>|undefined),\n *   initMessageHeaders: (!Object<string, string>|undefined),\n *   messageContentType: (string|undefined),\n *   messageUrlParams: (!Object<string, string>|undefined),\n *   clientProtocolHeaderRequired: (boolean|undefined),\n *   concurrentRequestLimit: (number|undefined),\n *   supportsCrossDomainXhr: (boolean|undefined),\n *   testUrl: (string|undefined),\n *   sendRawJson: (boolean|undefined),\n *   httpSessionIdParam: (string|undefined),\n *   httpHeadersOverwriteParam: (string|undefined),\n *   backgroundChannelTest: (boolean|undefined),\n *   forceLongPolling: (boolean|undefined),\n *   fastHandshake: (boolean|undefined),\n *   disableRedact: (boolean|undefined),\n *   clientProfile: (string|undefined),\n *   internalChannelParams: (!Object<string, boolean|number>|undefined),\n *   xmlHttpFactory: (!goog.net.XmlHttpFactory|undefined),\n *   requestRefreshThresholds: (!Object<string, number>|undefined),\n * }}\n */\ngoog.net.WebChannel.Options;\n\n\n/**\n * Types that are allowed as message data.\n *\n * Note that JS objects (sent by the client) can only have string encoded\n * values due to the limitation of the current wire protocol.\n *\n * Unicode strings (sent by the server) may or may not need be escaped, as\n * decided by the server.\n *\n * @typedef {(!ArrayBuffer|!Blob|!Object<string, !Object|string>|!Array|string)}\n */\ngoog.net.WebChannel.MessageData;\n\n\n/**\n * Open the WebChannel against the URI specified in the constructor.\n */\ngoog.net.WebChannel.prototype.open = goog.abstractMethod;\n\n\n/**\n * Close the WebChannel.\n *\n * This is a full close (shutdown) with no guarantee of FIFO delivery in respect\n * to any in-flight messages sent to the server.\n *\n * If you need such a guarantee, see the Half the halfClose() method.\n */\ngoog.net.WebChannel.prototype.close = goog.abstractMethod;\n\n\n/**\n * Half-close the WebChannel.\n *\n * Half-close semantics:\n * 1. delivered as a regular message in FIFO programming order\n * 2. the server is expected to return a half-close too (with or without\n *    application involved), which will trigger a full close (shutdown)\n *    on the client side\n * 3. for now, the half-close event defined for server-initiated\n *    half-close is not exposed to the client application\n * 4. a client-side half-close may be triggered internally when the client\n *    receives a half-close from the server; and the client is expected to\n *    do a full close after the half-close is acked and delivered\n *    on the server-side.\n * 5. Full close is always a forced one. See the close() method.\n *\n * New messages sent after halfClose() will be dropped.\n *\n * NOTE: This is not yet implemented, and will throw an exception if called.\n */\ngoog.net.WebChannel.prototype.halfClose = goog.abstractMethod;\n\n\n/**\n * Sends a message to the server that maintains the other end point of\n * the WebChannel.\n *\n * O-RTT behavior:\n * 1. messages sent before open() is called will always be delivered as\n *    part of the handshake, i.e. with 0-RTT\n * 2. messages sent after open() is called but before the OPEN event\n *    is received will be delivered as part of the handshake if\n *    send() is called from the same execution context as open().\n * 3. otherwise, those messages will be buffered till the handshake\n *    is completed (which will fire the OPEN event).\n *\n * @param {!goog.net.WebChannel.MessageData} message The message to send.\n */\ngoog.net.WebChannel.prototype.send = goog.abstractMethod;\n\n\n/**\n * Common events fired by WebChannels.\n * @enum {string}\n */\ngoog.net.WebChannel.EventType = {\n  /** Dispatched when the channel is opened. */\n  OPEN: goog.events.getUniqueId('open'),\n\n  /** Dispatched when the channel is closed. */\n  CLOSE: goog.events.getUniqueId('close'),\n\n  /**\n   * Dispatched when the channel is aborted due to errors.\n   *\n   * For backward compatibility reasons, a CLOSE event will also be\n   * dispatched, following the ERROR event, which indicates that the channel\n   * has been completely shutdown .\n   */\n  ERROR: goog.events.getUniqueId('error'),\n\n  /** Dispatched when the channel has received a new message. */\n  MESSAGE: goog.events.getUniqueId('message')\n};\n\n\n\n/**\n * The event interface for the MESSAGE event.\n *\n * @constructor\n * @extends {goog.events.Event}\n */\ngoog.net.WebChannel.MessageEvent = function() {\n  goog.net.WebChannel.MessageEvent.base(\n      this, 'constructor', goog.net.WebChannel.EventType.MESSAGE);\n};\ngoog.inherits(goog.net.WebChannel.MessageEvent, goog.events.Event);\n\n\n/**\n * The content of the message received from the server.\n *\n * @type {!goog.net.WebChannel.MessageData}\n */\ngoog.net.WebChannel.MessageEvent.prototype.data;\n\n\n/**\n * The metadata key when the MESSAGE event represents a metadata message.\n *\n * @type {string|undefined}\n */\ngoog.net.WebChannel.MessageEvent.prototype.metadataKey;\n\n\n/**\n * WebChannel level error conditions.\n *\n * Summary of error debugging and reporting in WebChannel:\n *\n * Network Error\n * 1. By default the webchannel library will set the error status to\n *    NETWORK_ERROR when a channel has to be aborted or closed. NETWORK_ERROR\n *    may be recovered by the application by retrying and opening a new channel.\n * 2. There may be lost messages (not acked by the server) when a channel is\n *    aborted. Currently we don't have a public API to retrieve messages that\n *    are waiting to be acked on the client side. File a bug if you think it\n *    is useful to expose such an API.\n * 3. Details of why a channel fails are available via closure debug logs,\n *    and stats events (see webchannel/requeststats.js). Those are internal\n *    stats and are subject to change. File a bug if you think it's useful to\n *    version and expose such stats as part of the WebChannel API.\n *\n * Server Error\n * 1. SERVER_ERROR is intended to indicate a non-recoverable condition, e.g.\n *    when auth fails.\n * 2. We don't currently generate any such errors, because most of the time\n *    it's the responsibility of upper-layer frameworks or the application\n *    itself to indicate to the client why a webchannel has been failed\n *    by the server.\n * 3. When a channel is failed by the server explicitly, we still signal\n *    NETWORK_ERROR to the client. Explicit server failure may happen when the\n *    server does a fail-over, or becomes overloaded, or conducts a forced\n *    shutdown etc.\n * 4. We use some heuristic to decide if the network (aka cloud) is down\n *    v.s. the actual server is down.\n *\n *  RuntimeProperties.getLastStatusCode is a useful state that we expose to\n *  the client to indicate the HTTP response status code of the last HTTP\n *  request initiated by the WebChannel client library, for debugging\n *  purposes only.\n *\n *  See WebChannel.Options.backChannelFailureRecovery and\n *  WebChannel.FailureRecovery to install a custom failure-recovery algorithm.\n *\n * @enum {number}\n */\ngoog.net.WebChannel.ErrorStatus = {\n  /** No error has occurred. */\n  OK: 0,\n\n  /** Communication to the server has failed. */\n  NETWORK_ERROR: 1,\n\n  /** The server fails to accept or process the WebChannel. */\n  SERVER_ERROR: 2\n};\n\n\n\n/**\n * The event interface for the ERROR event.\n *\n * @constructor\n * @extends {goog.events.Event}\n */\ngoog.net.WebChannel.ErrorEvent = function() {\n  goog.net.WebChannel.ErrorEvent.base(\n      this, 'constructor', goog.net.WebChannel.EventType.ERROR);\n};\ngoog.inherits(goog.net.WebChannel.ErrorEvent, goog.events.Event);\n\n\n/**\n * The error status.\n *\n * @type {!goog.net.WebChannel.ErrorStatus}\n */\ngoog.net.WebChannel.ErrorEvent.prototype.status;\n\n\n/**\n * @return {!goog.net.WebChannel.RuntimeProperties} The runtime properties\n * of the WebChannel instance.\n */\ngoog.net.WebChannel.prototype.getRuntimeProperties = goog.abstractMethod;\n\n\n\n/**\n * The runtime properties of the WebChannel instance.\n *\n * This class is defined for debugging and monitoring purposes, as well as for\n * runtime functions that the application may choose to manage by itself.\n *\n * @interface\n */\ngoog.net.WebChannel.RuntimeProperties = function() {};\n\n\n/**\n * @return {number} The effective limit for the number of concurrent HTTP\n * requests that are allowed to be made for sending messages from the client\n * to the server. When SPDY is not enabled, this limit will be one.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.getConcurrentRequestLimit =\n    goog.abstractMethod;\n\n\n/**\n * For applications that need support multiple channels (e.g. from\n * different tabs) to the same origin, use this method to decide if SPDY is\n * enabled and therefore it is safe to open multiple channels.\n *\n * If SPDY is disabled, the application may choose to limit the number of active\n * channels to one or use other means such as sub-domains to work around\n * the browser connection limit.\n *\n * @return {boolean} Whether SPDY is enabled for the origin against which\n * the channel is created.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.isSpdyEnabled =\n    goog.abstractMethod;\n\n\n/**\n * @return {number} The number of requests (for sending messages to the server)\n * that are pending. If this number is approaching the value of\n * getConcurrentRequestLimit(), client-to-server message delivery may experience\n * a higher latency.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.getPendingRequestCount =\n    goog.abstractMethod;\n\n\n/**\n * For applications to query the current HTTP session id, sent by the server\n * during the initial handshake.\n *\n * @return {?string} the HTTP session id or null if no HTTP session is in use.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.getHttpSessionId =\n    goog.abstractMethod;\n\n\n/**\n * Experimental API.\n *\n * This method generates an in-band commit request to the server, which will\n * ack the commit request as soon as all messages sent prior to this commit\n * request have been committed by the application.\n *\n * Committing a message has a stronger semantics than delivering a message\n * to the application. Detail spec:\n * https://github.com/bidiweb/webchannel/blob/master/commit.md\n *\n * Timeout or cancellation is not supported and the application is expected to\n * abort the channel if the commit-ack fails to arrive in time.\n *\n * ===\n *\n * This is currently implemented only in the client layer and the commit\n * callback will be invoked after all the pending client-sent messages have been\n * delivered by the server-side webchannel end-point. This semantics is\n * different and weaker than what's required for end-to-end ack which requires\n * the server application to ack the in-order delivery of messages that are sent\n * before the commit request is issued.\n *\n * Commit should only be called after the channel open event is received.\n * Duplicated commits are allowed and only the last callback is guaranteed.\n * Commit called after the channel has been closed will be ignored.\n *\n * @param {function()} callback The callback will be invoked once an\n * ack has been received for the current commit or any newly issued commit.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.commit = goog.abstractMethod;\n\n\n/**\n * This method may be used by the application to recover from a peer failure\n * or to enable sender-initiated flow-control.\n *\n * Detail spec: https://github.com/bidiweb/webchannel/blob/master/commit.md\n *\n * This is not yet implemented.\n *\n * @return {number} The total number of messages that have not received\n * commit-ack from the server; or if no commit has been issued, the number\n * of messages that have not been delivered to the server application.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.getNonAckedMessageCount =\n    goog.abstractMethod;\n\n\n/**\n * A low water-mark message count to notify the application when the\n * flow-control condition is cleared, that is, when the application is\n * able to send more messages.\n *\n * We expect the application to configure a high water-mark message count,\n * which is checked via getNonAckedMessageCount(). When the high water-mark\n * is exceeded, the application should install a callback via this method\n * to be notified when to start to send new messages.\n *\n * This is not yet implemented.\n *\n * @param {number} count The low water-mark count. It is an error to pass\n * a non-positive value.\n * @param {function()} callback The call back to notify the application\n * when NonAckedMessageCount is below the specified low water-mark count.\n * Any previously registered callback is cleared. This new callback will\n * be cleared once it has been fired, or when the channel is closed or aborted.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.notifyNonAckedMessageCount =\n    goog.abstractMethod;\n\n\n/**\n * Experimental API.\n *\n * This method registers a callback to handle the commit request sent\n * by the server. Commit protocol spec:\n * https://github.com/bidiweb/webchannel/blob/master/commit.md\n *\n * This is not yet implemented.\n *\n * @param {function(!Object)} callback The callback will take an opaque\n * commitId which needs be passed back to the server when an ack-commit\n * response is generated by the client application, via ackCommit().\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.onCommit = goog.abstractMethod;\n\n\n/**\n * Experimental API.\n *\n * This method is used by the application to generate an ack-commit response\n * for the given commitId. Commit protocol spec:\n * https://github.com/bidiweb/webchannel/blob/master/commit.md\n *\n * This is not yet implemented.\n *\n * @param {!Object} commitId The commitId which denotes the commit request\n * from the server that needs be ack'ed.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.ackCommit = goog.abstractMethod;\n\n\n/**\n * @return {number} The last HTTP status code received by the channel.\n */\ngoog.net.WebChannel.RuntimeProperties.prototype.getLastStatusCode =\n    goog.abstractMethod;\n\n\n/**\n * Enum to indicate the current recovery state.\n *\n * @enum {string}\n */\ngoog.net.WebChannel.FailureRecovery.State = {\n  /** Initial state. */\n  INIT: 'init',\n\n  /** Once a failure has been detected. */\n  FAILED: 'failed',\n\n  /**\n   * Once a recovery operation has been issued, e.g. a new request to resume\n   * communication.\n   */\n  RECOVERING: 'recovering',\n\n  /** The channel has been closed.  */\n  CLOSED: 'closed'\n};\n\n\n/**\n * Enum to indicate different failure conditions as detected by the webchannel\n * runtime.\n *\n * This enum is to be used only between the runtime and FailureRecovery module,\n * and new states are expected to be introduced in future.\n *\n * @enum {string}\n */\ngoog.net.WebChannel.FailureRecovery.FailureCondition = {\n  /**\n   * The HTTP response returned a non-successful http status code.\n   */\n  HTTP_ERROR: 'http_error',\n\n  /**\n   * The request was aborted.\n   */\n  ABORT: 'abort',\n\n  /**\n   * The request timed out.\n   */\n  TIMEOUT: 'timeout',\n\n  /**\n   * Exception was thrown while processing the request/response.\n   */\n  EXCEPTION: 'exception'\n};\n\n\n/**\n * @return {!goog.net.WebChannel.FailureRecovery.State} the current state,\n * mainly for debugging use.\n */\ngoog.net.WebChannel.FailureRecovery.prototype.getState = goog.abstractMethod;\n\n\n/**\n * This method is for WebChannel runtime to set the current failure condition\n * and to provide a callback for the algorithm to signal to the runtime\n * when it is time to issue a recovery operation, e.g. a new request to the\n * server.\n *\n * Supported transitions include:\n *   INIT->FAILED\n *   FAILED->FAILED (re-entry ok)\n *   RECOVERY->FAILED.\n *\n * Ignored if state == CLOSED.\n *\n * Advanced implementations are expected to track all the state transitions\n * and their timestamps for monitoring purposes.\n *\n * @param {!goog.net.WebChannel.FailureRecovery.FailureCondition} failure The\n * new failure condition generated by the WebChannel runtime.\n * @param {!Function} operation The callback function to the WebChannel\n * runtime to issue a recovery operation, e.g. a new request. E.g. the default\n * recovery algorithm will issue timeout-based recovery operations.\n * Post-condition for the callback: state transition to RECOVERING.\n *\n * @return {!goog.net.WebChannel.FailureRecovery.State} The updated state\n * as decided by the failure recovery module. Upon a recoverable failure event,\n * the state is transitioned to RECOVERING; or the state is transitioned to\n * FAILED which indicates a fail-fast decision for the runtime to execute.\n */\ngoog.net.WebChannel.FailureRecovery.prototype.setFailure = goog.abstractMethod;\n\n\n/**\n * The Webchannel runtime needs call this method when webchannel is closed or\n * aborted.\n *\n * Once the instance is closed, any access to the instance will be a no-op.\n */\ngoog.net.WebChannel.FailureRecovery.prototype.close = goog.abstractMethod;\n\n\n/**\n * A request header to indicate to the server the messaging protocol\n * each HTTP message is speaking.\n *\n * @type {string}\n */\ngoog.net.WebChannel.X_CLIENT_PROTOCOL = 'X-Client-Protocol';\n\n\n/**\n * The value for x-client-protocol when the messaging protocol is WebChannel.\n *\n * @type {string}\n */\ngoog.net.WebChannel.X_CLIENT_PROTOCOL_WEB_CHANNEL = 'webchannel';\n\n\n/**\n * A response header for the server to signal the wire-protocol that\n * the browser establishes with the server (or proxy), e.g. \"spdy\" (aka http/2)\n * \"quic\". This information avoids the need to use private APIs to decide if\n * HTTP requests are multiplexed etc.\n *\n * @type {string}\n */\ngoog.net.WebChannel.X_CLIENT_WIRE_PROTOCOL = 'X-Client-Wire-Protocol';\n\n\n/**\n * A response header for the server to send back the HTTP session id as part of\n * the initial handshake. The value of the HTTP session id is opaque to the\n * WebChannel protocol.\n *\n * @type {string}\n */\ngoog.net.WebChannel.X_HTTP_SESSION_ID = 'X-HTTP-Session-Id';\n\n\n/**\n * A response header for the server to send back any initial response data as a\n * header to avoid any possible buffering by an intermediary, which may\n * be undesired during the handshake.\n *\n * @type {string}\n */\ngoog.net.WebChannel.X_HTTP_INITIAL_RESPONSE = 'X-HTTP-Initial-Response';\n\n\n/**\n * A request header for specifying the content-type of WebChannel messages,\n * e.g. application-defined JSON encoding styles. Currently this header\n * is sent by the client via initMessageHeaders when the channel is opened.\n *\n * @type {string}\n */\ngoog.net.WebChannel.X_WEBCHANNEL_CONTENT_TYPE = 'X-WebChannel-Content-Type';\n\n\n/**\n * A request header for specifying the client profile in order to apply\n * customized config params on the server side, e.g. timeouts.\n *\n * @type {string}\n */\ngoog.net.WebChannel.X_WEBCHANNEL_CLIENT_PROFILE = 'X-WebChannel-Client-Profile';\n","^9I",1579837703000,"^9J",["^9K",["~$goog.events.Listenable","^9>","^H?","^;8","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchannel.js"],"^:1",["^9K",["^<D"]],"^9<",true,"^9=",["^9>","^:N","^;8","^VR","^H?"]],["^ ","^9A",[1579837703000],"^9B","goog.fx.cssspriteanimation.js","^9C",["^9D","goog/fx/cssspriteanimation.js"],"^9E","goog/fx/cssspriteanimation.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An animation class that animates CSS sprites by changing the\n * CSS background-position.\n *\n * @author arv@google.com (Erik Arvidsson)\n * @see ../demos/cssspriteanimation.html\n */\n\ngoog.provide('goog.fx.CssSpriteAnimation');\n\ngoog.forwardDeclare('goog.math.Box');\ngoog.forwardDeclare('goog.math.Size');\ngoog.require('goog.fx.Animation');\n\n\n\n/**\n * This animation class is used to animate a CSS sprite (moving a background\n * image).  This moves through a series of images in a single image sprite. By\n * default, the animation loops when done.  Looping can be disabled by setting\n * `opt_disableLoop` and results in the animation stopping on the last\n * image in the image sprite.  You should set up the {@code background-image}\n * and size in a CSS rule for the relevant element.\n *\n * @param {Element} element The HTML element to animate the background for.\n * @param {goog.math.Size} size The size of one image in the image sprite.\n * @param {goog.math.Box} box The box describing the layout of the sprites to\n *     use in the large image.  The sprites can be position horizontally or\n *     vertically and using a box here allows the implementation to know which\n *     way to go.\n * @param {number} time The duration in milliseconds for one iteration of the\n *     animation.  For example, if the sprite contains 4 images and the duration\n *     is set to 400ms then each sprite will be displayed for 100ms.\n * @param {function(number) : number=} opt_acc Acceleration function,\n *    returns 0-1 for inputs 0-1.  This can be used to make certain frames be\n *    shown for a longer period of time.\n * @param {boolean=} opt_disableLoop Whether the animation should be halted\n *    after a single loop of the images in the sprite.\n *\n * @constructor\n * @struct\n * @extends {goog.fx.Animation}\n * @final\n */\ngoog.fx.CssSpriteAnimation = function(\n    element, size, box, time, opt_acc, opt_disableLoop) {\n  var start = [box.left, box.top];\n  // We never draw for the end so we do not need to subtract for the size\n  var end = [box.right, box.bottom];\n  goog.fx.CssSpriteAnimation.base(\n      this, 'constructor', start, end, time, opt_acc);\n\n  /**\n   * HTML element that will be used in the animation.\n   * @type {Element}\n   * @private\n   */\n  this.element_ = element;\n\n  /**\n   * The size of an individual sprite in the image sprite.\n   * @type {goog.math.Size}\n   * @private\n   */\n  this.size_ = size;\n\n  /**\n   * Whether the animation should be halted after a single loop of the images\n   * in the sprite.\n   * @type {boolean}\n   * @private\n   */\n  this.disableLoop_ = !!opt_disableLoop;\n};\ngoog.inherits(goog.fx.CssSpriteAnimation, goog.fx.Animation);\n\n\n/** @override */\ngoog.fx.CssSpriteAnimation.prototype.onAnimate = function() {\n  // Round to nearest sprite.\n  var x = -Math.floor(this.coords[0] / this.size_.width) * this.size_.width;\n  var y = -Math.floor(this.coords[1] / this.size_.height) * this.size_.height;\n  this.element_.style.backgroundPosition = x + 'px ' + y + 'px';\n\n  goog.fx.CssSpriteAnimation.base(this, 'onAnimate');\n};\n\n\n/** @override */\ngoog.fx.CssSpriteAnimation.prototype.onFinish = function() {\n  if (!this.disableLoop_) {\n    this.play(true);\n  }\n  goog.fx.CssSpriteAnimation.base(this, 'onFinish');\n};\n\n\n/**\n * Clears the background position style set directly on the element\n * by the animation. Allows to apply CSS styling for background position on the\n * same element when the sprite animation is not runniing.\n */\ngoog.fx.CssSpriteAnimation.prototype.clearSpritePosition = function() {\n  var style = this.element_.style;\n  style.backgroundPosition = '';\n\n  if (typeof style.backgroundPositionX != 'undefined') {\n    // IE needs to clear x and y to actually clear the position\n    style.backgroundPositionX = '';\n    style.backgroundPositionY = '';\n  }\n};\n\n\n/** @override */\ngoog.fx.CssSpriteAnimation.prototype.disposeInternal = function() {\n  goog.fx.CssSpriteAnimation.superClass_.disposeInternal.call(this);\n  this.element_ = null;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^G7"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/cssspriteanimation.js"],"^:1",["^9K",["~$goog.fx.CssSpriteAnimation"]],"^9<",true,"^9=",["^9>","^G7"]],["^ ","^9A",[1579837703000],"^9B","goog.json.processor.js","^9C",["^9D","goog/json/processor.js"],"^9E","goog/json/processor.js","^9F","^9G","^9H","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Defines an interface for JSON parsing and serialization.\n */\n\ngoog.provide('goog.json.Processor');\n\ngoog.require('goog.string.Parser');\ngoog.require('goog.string.Stringifier');\n\n\n\n/**\n * An interface for JSON parsing and serialization.\n * @interface\n * @extends {goog.string.Parser}\n * @extends {goog.string.Stringifier}\n */\ngoog.json.Processor = function() {};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.string.Parser","~$goog.string.Stringifier","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/json/processor.js"],"^:1",["^9K",["~$goog.json.Processor"]],"^9<",true,"^9=",["^9>","^VT","^VU"]],["^ ","^9A",[1579837703000],"^9B","goog.debug.relativetimeprovider.js","^9C",["^9D","goog/debug/relativetimeprovider.js"],"^9E","goog/debug/relativetimeprovider.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition the goog.debug.RelativeTimeProvider class.\n *\n */\n\ngoog.provide('goog.debug.RelativeTimeProvider');\n\n\n\n/**\n * A simple object to keep track of a timestamp considered the start of\n * something. The main use is for the logger system to maintain a start time\n * that is occasionally reset. For example, in Gmail, we reset this relative\n * time at the start of a user action so that timings are offset from the\n * beginning of the action. This class also provides a singleton as the default\n * behavior for most use cases is to share the same start time.\n *\n * @constructor\n * @final\n */\ngoog.debug.RelativeTimeProvider = function() {\n  /**\n   * The start time.\n   * @type {number}\n   * @private\n   */\n  this.relativeTimeStart_ = goog.now();\n};\n\n\n/**\n * Default instance.\n * @type {?goog.debug.RelativeTimeProvider}\n * @private\n */\ngoog.debug.RelativeTimeProvider.defaultInstance_ = null;\n\n\n/**\n * Sets the start time to the specified time.\n * @param {number} timeStamp The start time.\n */\ngoog.debug.RelativeTimeProvider.prototype.set = function(timeStamp) {\n  this.relativeTimeStart_ = timeStamp;\n};\n\n\n/**\n * Resets the start time to now.\n */\ngoog.debug.RelativeTimeProvider.prototype.reset = function() {\n  this.set(goog.now());\n};\n\n\n/**\n * @return {number} The start time.\n */\ngoog.debug.RelativeTimeProvider.prototype.get = function() {\n  return this.relativeTimeStart_;\n};\n\n\n/**\n * @return {goog.debug.RelativeTimeProvider} The default instance.\n */\ngoog.debug.RelativeTimeProvider.getDefaultInstance = function() {\n  if (!goog.debug.RelativeTimeProvider.defaultInstance_) {\n    goog.debug.RelativeTimeProvider.defaultInstance_ =\n        new goog.debug.RelativeTimeProvider();\n  }\n  return goog.debug.RelativeTimeProvider.defaultInstance_;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/relativetimeprovider.js"],"^:1",["^9K",["~$goog.debug.RelativeTimeProvider"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.component.js","^9C",["^9D","goog/ui/component.js"],"^9E","goog/ui/component.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Abstract class for all UI components. This defines the standard\n * design pattern that all UI components should follow.\n *\n * @author attila@google.com (Attila Bodis)\n * @see ../demos/samplecomponent.html\n * @see http://code.google.com/p/closure-library/wiki/IntroToComponents\n */\n\ngoog.provide('goog.ui.Component');\ngoog.provide('goog.ui.Component.Error');\ngoog.provide('goog.ui.Component.EventType');\ngoog.provide('goog.ui.Component.State');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.object');\ngoog.require('goog.style');\ngoog.require('goog.ui.IdGenerator');\n\n\n\n/**\n * Default implementation of UI component.\n *\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @suppress {underscore}\n */\ngoog.ui.Component = function(opt_domHelper) {\n  goog.events.EventTarget.call(this);\n  /**\n   * DomHelper used to interact with the document, allowing components to be\n   * created in a different window.\n   * @protected {!goog.dom.DomHelper}\n   * @suppress {underscore|visibility}\n   */\n  this.dom_ = opt_domHelper || goog.dom.getDomHelper();\n\n  /**\n   * Whether the component is rendered right-to-left.  Right-to-left is set\n   * lazily when {@link #isRightToLeft} is called the first time, unless it has\n   * been set by calling {@link #setRightToLeft} explicitly.\n   * @private {?boolean}\n   */\n  this.rightToLeft_ = goog.ui.Component.defaultRightToLeft_;\n\n  /**\n   * Unique ID of the component, lazily initialized in {@link\n   * goog.ui.Component#getId} if needed.  This property is strictly private and\n   * must not be accessed directly outside of this class!\n   * @private {?string}\n   */\n  this.id_ = null;\n\n  /**\n   * Whether the component is in the document.\n   * @private {boolean}\n   */\n  this.inDocument_ = false;\n\n  // TODO(attila): Stop referring to this private field in subclasses.\n  /**\n   * The DOM element for the component.\n   * @private {?Element}\n   */\n  this.element_ = null;\n\n  /**\n   * Event handler.\n   * TODO(user): rename it to handler_ after all component subclasses in\n   * inside Google have been cleaned up.\n   * Code search: http://go/component_code_search\n   * @private {goog.events.EventHandler|undefined}\n   */\n  this.googUiComponentHandler_ = void 0;\n\n  /**\n   * Arbitrary data object associated with the component.  Such as meta-data.\n   * @private {*}\n   */\n  this.model_ = null;\n\n  /**\n   * Parent component to which events will be propagated.  This property is\n   * strictly private and must not be accessed directly outside of this class!\n   * @private {goog.ui.Component?}\n   */\n  this.parent_ = null;\n\n  /**\n   * Array of child components.  Lazily initialized on first use.  Must be kept\n   * in sync with `childIndex_`.  This property is strictly private and\n   * must not be accessed directly outside of this class!\n   * @private {?Array<?goog.ui.Component>}\n   */\n  this.children_ = null;\n\n  /**\n   * Map of child component IDs to child components.  Used for constant-time\n   * random access to child components by ID.  Lazily initialized on first use.\n   * Must be kept in sync with `children_`.  This property is strictly\n   * private and must not be accessed directly outside of this class!\n   *\n   * We use a plain Object, not a {@link goog.structs.Map}, for simplicity.\n   * This means components can't have children with IDs such as 'constructor' or\n   * 'valueOf', but this shouldn't really be an issue in practice, and if it is,\n   * we can always fix it later without changing the API.\n   *\n   * @private {?Object}\n   */\n  this.childIndex_ = null;\n\n  /**\n   * Flag used to keep track of whether a component decorated an already\n   * existing element or whether it created the DOM itself.\n   *\n   * If an element is decorated, dispose will leave the node in the document.\n   * It is up to the app to remove the node.\n   *\n   * If an element was rendered, dispose will remove the node automatically.\n   *\n   * @private {boolean}\n   */\n  this.wasDecorated_ = false;\n\n  /**\n   * If true, listen for PointerEvent types rather than MouseEvent types. This\n   * allows supporting drag gestures for touch/stylus input.\n   * @private {boolean}\n   */\n  this.pointerEventsEnabled_ = false;\n};\ngoog.inherits(goog.ui.Component, goog.events.EventTarget);\n\n\n/**\n * @define {boolean} Whether to support calling decorate with an element that is\n *     not yet in the document. If true, we check if the element is in the\n *     document, and avoid calling enterDocument if it isn't. If false, we\n *     maintain legacy behavior (always call enterDocument from decorate).\n */\ngoog.ui.Component.ALLOW_DETACHED_DECORATION =\n    goog.define('goog.ui.Component.ALLOW_DETACHED_DECORATION', false);\n\n\n/**\n * Generator for unique IDs.\n * @type {goog.ui.IdGenerator}\n * @private\n */\ngoog.ui.Component.prototype.idGenerator_ = goog.ui.IdGenerator.getInstance();\n\n\n// TODO(gboyer): See if we can remove this and just check goog.i18n.bidi.IS_RTL.\n/**\n * @define {number} Defines the default BIDI directionality.\n *     0: Unknown.\n *     1: Left-to-right.\n *     -1: Right-to-left.\n */\ngoog.ui.Component.DEFAULT_BIDI_DIR =\n    goog.define('goog.ui.Component.DEFAULT_BIDI_DIR', 0);\n\n\n/**\n * The default right to left value.\n * @type {?boolean}\n * @private\n */\ngoog.ui.Component.defaultRightToLeft_ =\n    (goog.ui.Component.DEFAULT_BIDI_DIR == 1) ?\n    false :\n    (goog.ui.Component.DEFAULT_BIDI_DIR == -1) ? true : null;\n\n\n/**\n * Common events fired by components so that event propagation is useful.  Not\n * all components are expected to dispatch or listen for all event types.\n * Events dispatched before a state transition should be cancelable to prevent\n * the corresponding state change.\n * @enum {string}\n */\ngoog.ui.Component.EventType = {\n  /** Dispatched before the component becomes visible. */\n  BEFORE_SHOW: 'beforeshow',\n\n  /**\n   * Dispatched after the component becomes visible.\n   * NOTE(user): For goog.ui.Container, this actually fires before containers\n   * are shown.  Use goog.ui.Container.EventType.AFTER_SHOW if you want an event\n   * that fires after a goog.ui.Container is shown.\n   */\n  SHOW: 'show',\n\n  /** Dispatched before the component becomes hidden. */\n  HIDE: 'hide',\n\n  /** Dispatched before the component becomes disabled. */\n  DISABLE: 'disable',\n\n  /** Dispatched before the component becomes enabled. */\n  ENABLE: 'enable',\n\n  /** Dispatched before the component becomes highlighted. */\n  HIGHLIGHT: 'highlight',\n\n  /** Dispatched before the component becomes un-highlighted. */\n  UNHIGHLIGHT: 'unhighlight',\n\n  /** Dispatched before the component becomes activated. */\n  ACTIVATE: 'activate',\n\n  /** Dispatched before the component becomes deactivated. */\n  DEACTIVATE: 'deactivate',\n\n  /** Dispatched before the component becomes selected. */\n  SELECT: 'select',\n\n  /** Dispatched before the component becomes un-selected. */\n  UNSELECT: 'unselect',\n\n  /** Dispatched before a component becomes checked. */\n  CHECK: 'check',\n\n  /** Dispatched before a component becomes un-checked. */\n  UNCHECK: 'uncheck',\n\n  /** Dispatched before a component becomes focused. */\n  FOCUS: 'focus',\n\n  /** Dispatched before a component becomes blurred. */\n  BLUR: 'blur',\n\n  /** Dispatched before a component is opened (expanded). */\n  OPEN: 'open',\n\n  /** Dispatched before a component is closed (collapsed). */\n  CLOSE: 'close',\n\n  /** Dispatched after a component is moused over. */\n  ENTER: 'enter',\n\n  /** Dispatched after a component is moused out of. */\n  LEAVE: 'leave',\n\n  /** Dispatched after the user activates the component. */\n  ACTION: 'action',\n\n  /** Dispatched after the external-facing state of a component is changed. */\n  CHANGE: 'change'\n};\n\n\n/**\n * Errors thrown by the component.\n * @enum {string}\n */\ngoog.ui.Component.Error = {\n  /**\n   * Error when a method is not supported.\n   */\n  NOT_SUPPORTED: 'Method not supported',\n\n  /**\n   * Error when the given element can not be decorated.\n   */\n  DECORATE_INVALID: 'Invalid element to decorate',\n\n  /**\n   * Error when the component is already rendered and another render attempt is\n   * made.\n   */\n  ALREADY_RENDERED: 'Component already rendered',\n\n  /**\n   * Error when an attempt is made to set the parent of a component in a way\n   * that would result in an inconsistent object graph.\n   */\n  PARENT_UNABLE_TO_BE_SET: 'Unable to set parent component',\n\n  /**\n   * Error when an attempt is made to add a child component at an out-of-bounds\n   * index.  We don't support sparse child arrays.\n   */\n  CHILD_INDEX_OUT_OF_BOUNDS: 'Child component index out of bounds',\n\n  /**\n   * Error when an attempt is made to remove a child component from a component\n   * other than its parent.\n   */\n  NOT_OUR_CHILD: 'Child is not in parent component',\n\n  /**\n   * Error when an operation requiring DOM interaction is made when the\n   * component is not in the document\n   */\n  NOT_IN_DOCUMENT: 'Operation not supported while component is not in document',\n\n  /**\n   * Error when an invalid component state is encountered.\n   */\n  STATE_INVALID: 'Invalid component state'\n};\n\n\n/**\n * Common component states.  Components may have distinct appearance depending\n * on what state(s) apply to them.  Not all components are expected to support\n * all states.\n * @enum {number}\n */\ngoog.ui.Component.State = {\n  /**\n   * Union of all supported component states.\n   */\n  ALL: 0xFF,\n\n  /**\n   * Component is disabled.\n   * @see goog.ui.Component.EventType.DISABLE\n   * @see goog.ui.Component.EventType.ENABLE\n   */\n  DISABLED: 0x01,\n\n  /**\n   * Component is highlighted.\n   * @see goog.ui.Component.EventType.HIGHLIGHT\n   * @see goog.ui.Component.EventType.UNHIGHLIGHT\n   */\n  HOVER: 0x02,\n\n  /**\n   * Component is active (or \"pressed\").\n   * @see goog.ui.Component.EventType.ACTIVATE\n   * @see goog.ui.Component.EventType.DEACTIVATE\n   */\n  ACTIVE: 0x04,\n\n  /**\n   * Component is selected.\n   * @see goog.ui.Component.EventType.SELECT\n   * @see goog.ui.Component.EventType.UNSELECT\n   */\n  SELECTED: 0x08,\n\n  /**\n   * Component is checked.\n   * @see goog.ui.Component.EventType.CHECK\n   * @see goog.ui.Component.EventType.UNCHECK\n   */\n  CHECKED: 0x10,\n\n  /**\n   * Component has focus.\n   * @see goog.ui.Component.EventType.FOCUS\n   * @see goog.ui.Component.EventType.BLUR\n   */\n  FOCUSED: 0x20,\n\n  /**\n   * Component is opened (expanded).  Applies to tree nodes, menu buttons,\n   * submenus, zippys (zippies?), etc.\n   * @see goog.ui.Component.EventType.OPEN\n   * @see goog.ui.Component.EventType.CLOSE\n   */\n  OPENED: 0x40\n};\n\n\n/**\n * Static helper method; returns the type of event components are expected to\n * dispatch when transitioning to or from the given state.\n * @param {goog.ui.Component.State} state State to/from which the component\n *     is transitioning.\n * @param {boolean} isEntering Whether the component is entering or leaving the\n *     state.\n * @return {goog.ui.Component.EventType} Event type to dispatch.\n */\ngoog.ui.Component.getStateTransitionEvent = function(state, isEntering) {\n  switch (state) {\n    case goog.ui.Component.State.DISABLED:\n      return isEntering ? goog.ui.Component.EventType.DISABLE :\n                          goog.ui.Component.EventType.ENABLE;\n    case goog.ui.Component.State.HOVER:\n      return isEntering ? goog.ui.Component.EventType.HIGHLIGHT :\n                          goog.ui.Component.EventType.UNHIGHLIGHT;\n    case goog.ui.Component.State.ACTIVE:\n      return isEntering ? goog.ui.Component.EventType.ACTIVATE :\n                          goog.ui.Component.EventType.DEACTIVATE;\n    case goog.ui.Component.State.SELECTED:\n      return isEntering ? goog.ui.Component.EventType.SELECT :\n                          goog.ui.Component.EventType.UNSELECT;\n    case goog.ui.Component.State.CHECKED:\n      return isEntering ? goog.ui.Component.EventType.CHECK :\n                          goog.ui.Component.EventType.UNCHECK;\n    case goog.ui.Component.State.FOCUSED:\n      return isEntering ? goog.ui.Component.EventType.FOCUS :\n                          goog.ui.Component.EventType.BLUR;\n    case goog.ui.Component.State.OPENED:\n      return isEntering ? goog.ui.Component.EventType.OPEN :\n                          goog.ui.Component.EventType.CLOSE;\n    default:\n      // Fall through.\n  }\n\n  // Invalid state.\n  throw new Error(goog.ui.Component.Error.STATE_INVALID);\n};\n\n\n/**\n * Set the default right-to-left value. This causes all component's created from\n * this point forward to have the given value. This is useful for cases where\n * a given page is always in one directionality, avoiding unnecessary\n * right to left determinations.\n * @param {?boolean} rightToLeft Whether the components should be rendered\n *     right-to-left. Null iff components should determine their directionality.\n */\ngoog.ui.Component.setDefaultRightToLeft = function(rightToLeft) {\n  goog.ui.Component.defaultRightToLeft_ = rightToLeft;\n};\n\n\n/**\n * Gets the unique ID for the instance of this component.  If the instance\n * doesn't already have an ID, generates one on the fly.\n * @return {string} Unique component ID.\n */\ngoog.ui.Component.prototype.getId = function() {\n  return this.id_ || (this.id_ = this.idGenerator_.getNextUniqueId());\n};\n\n\n/**\n * Assigns an ID to this component instance.  It is the caller's responsibility\n * to guarantee that the ID is unique.  If the component is a child of a parent\n * component, then the parent component's child index is updated to reflect the\n * new ID; this may throw an error if the parent already has a child with an ID\n * that conflicts with the new ID.\n * @param {string} id Unique component ID.\n */\ngoog.ui.Component.prototype.setId = function(id) {\n  if (this.parent_ && this.parent_.childIndex_) {\n    // Update the parent's child index.\n    goog.object.remove(this.parent_.childIndex_, this.id_);\n    goog.object.add(this.parent_.childIndex_, id, this);\n  }\n\n  // Update the component ID.\n  this.id_ = id;\n};\n\n\n/**\n * Gets the component's element.\n * @return {Element} The element for the component.\n */\ngoog.ui.Component.prototype.getElement = function() {\n  return this.element_;\n};\n\n\n/**\n * Gets the component's element. This differs from getElement in that\n * it assumes that the element exists (i.e. the component has been\n * rendered/decorated) and will cause an assertion error otherwise (if\n * assertion is enabled).\n * @return {!Element} The element for the component.\n */\ngoog.ui.Component.prototype.getElementStrict = function() {\n  var el = this.element_;\n  goog.asserts.assert(\n      el, 'Can not call getElementStrict before rendering/decorating.');\n  return el;\n};\n\n\n/**\n * Sets the component's root element to the given element.  Considered\n * protected and final.\n *\n * This should generally only be called during createDom. Setting the element\n * does not actually change which element is rendered, only the element that is\n * associated with this UI component.\n *\n * This should only be used by subclasses and its associated renderers.\n *\n * @param {Element} element Root element for the component.\n */\ngoog.ui.Component.prototype.setElementInternal = function(element) {\n  this.element_ = element;\n};\n\n\n/**\n * Returns an array of all the elements in this component's DOM with the\n * provided className.\n * @param {string} className The name of the class to look for.\n * @return {!IArrayLike<!Element>} The items found with the class name provided.\n */\ngoog.ui.Component.prototype.getElementsByClass = function(className) {\n  return this.element_ ?\n      this.dom_.getElementsByClass(className, this.element_) :\n      [];\n};\n\n\n/**\n * Returns the first element in this component's DOM with the provided\n * className.\n * @param {string} className The name of the class to look for.\n * @return {Element} The first item with the class name provided.\n */\ngoog.ui.Component.prototype.getElementByClass = function(className) {\n  return this.element_ ? this.dom_.getElementByClass(className, this.element_) :\n                         null;\n};\n\n\n/**\n * Similar to `getElementByClass` except that it expects the\n * element to be present in the dom thus returning a required value. Otherwise,\n * will assert.\n * @param {string} className The name of the class to look for.\n * @return {!Element} The first item with the class name provided.\n */\ngoog.ui.Component.prototype.getRequiredElementByClass = function(className) {\n  var el = this.getElementByClass(className);\n  goog.asserts.assert(\n      el, 'Expected element in component with class: %s', className);\n  return el;\n};\n\n\n/**\n * Returns the event handler for this component, lazily created the first time\n * this method is called.\n * @return {!goog.events.EventHandler<T>} Event handler for this component.\n * @protected\n * @this {T}\n * @template T\n */\ngoog.ui.Component.prototype.getHandler = function() {\n  // TODO(user): templated \"this\" values currently result in \"this\" being\n  // \"unknown\" in the body of the function.\n  var self = /** @type {goog.ui.Component} */ (this);\n  if (!self.googUiComponentHandler_) {\n    self.googUiComponentHandler_ = new goog.events.EventHandler(self);\n  }\n  return goog.asserts.assert(self.googUiComponentHandler_);\n};\n\n\n/**\n * Sets the parent of this component to use for event bubbling.  Throws an error\n * if the component already has a parent or if an attempt is made to add a\n * component to itself as a child.  Callers must use `removeChild`\n * or `removeChildAt` to remove components from their containers before\n * calling this method.\n * @see goog.ui.Component#removeChild\n * @see goog.ui.Component#removeChildAt\n * @param {goog.ui.Component} parent The parent component.\n */\ngoog.ui.Component.prototype.setParent = function(parent) {\n  if (this == parent) {\n    // Attempting to add a child to itself is an error.\n    throw new Error(goog.ui.Component.Error.PARENT_UNABLE_TO_BE_SET);\n  }\n\n  if (parent && this.parent_ && this.id_ && this.parent_.getChild(this.id_) &&\n      this.parent_ != parent) {\n    // This component is already the child of some parent, so it should be\n    // removed using removeChild/removeChildAt first.\n    throw new Error(goog.ui.Component.Error.PARENT_UNABLE_TO_BE_SET);\n  }\n\n  this.parent_ = parent;\n  goog.ui.Component.superClass_.setParentEventTarget.call(this, parent);\n};\n\n\n/**\n * Returns the component's parent, if any.\n * @return {goog.ui.Component?} The parent component.\n */\ngoog.ui.Component.prototype.getParent = function() {\n  return this.parent_;\n};\n\n\n/**\n * Overrides {@link goog.events.EventTarget#setParentEventTarget} to throw an\n * error if the parent component is set, and the argument is not the parent.\n * @override\n */\ngoog.ui.Component.prototype.setParentEventTarget = function(parent) {\n  if (this.parent_ && this.parent_ != parent) {\n    throw new Error(goog.ui.Component.Error.NOT_SUPPORTED);\n  }\n  goog.ui.Component.superClass_.setParentEventTarget.call(this, parent);\n};\n\n\n/**\n * Returns the dom helper that is being used on this component.\n * @return {!goog.dom.DomHelper} The dom helper used on this component.\n */\ngoog.ui.Component.prototype.getDomHelper = function() {\n  return this.dom_;\n};\n\n\n/**\n * Determines whether the component has been added to the document.\n * @return {boolean} TRUE if rendered. Otherwise, FALSE.\n */\ngoog.ui.Component.prototype.isInDocument = function() {\n  return this.inDocument_;\n};\n\n\n/**\n * Creates the initial DOM representation for the component.  The default\n * implementation is to set this.element_ = div.\n */\ngoog.ui.Component.prototype.createDom = function() {\n  this.element_ = this.dom_.createElement(goog.dom.TagName.DIV);\n};\n\n\n/**\n * Renders the component.  If a parent element is supplied, the component's\n * element will be appended to it.  If there is no optional parent element and\n * the element doesn't have a parentNode then it will be appended to the\n * document body.\n *\n * If this component has a parent component, and the parent component is\n * not in the document already, then this will not call `enterDocument`\n * on this component.\n *\n * Throws an Error if the component is already rendered.\n *\n * @param {Element=} opt_parentElement Optional parent element to render the\n *    component into.\n */\ngoog.ui.Component.prototype.render = function(opt_parentElement) {\n  this.render_(opt_parentElement);\n};\n\n\n/**\n * Renders the component before another element. The other element should be in\n * the document already.\n *\n * Throws an Error if the component is already rendered.\n *\n * @param {Node} sibling Node to render the component before.\n */\ngoog.ui.Component.prototype.renderBefore = function(sibling) {\n  this.render_(/** @type {Element} */ (sibling.parentNode), sibling);\n};\n\n\n/**\n * Renders the component.  If a parent element is supplied, the component's\n * element will be appended to it.  If there is no optional parent element and\n * the element doesn't have a parentNode then it will be appended to the\n * document body.\n *\n * If this component has a parent component, and the parent component is\n * not in the document already, then this will not call `enterDocument`\n * on this component.\n *\n * Throws an Error if the component is already rendered.\n *\n * @param {Element=} opt_parentElement Optional parent element to render the\n *    component into.\n * @param {Node=} opt_beforeNode Node before which the component is to\n *    be rendered.  If left out the node is appended to the parent element.\n * @private\n */\ngoog.ui.Component.prototype.render_ = function(\n    opt_parentElement, opt_beforeNode) {\n  if (this.inDocument_) {\n    throw new Error(goog.ui.Component.Error.ALREADY_RENDERED);\n  }\n\n  if (!this.element_) {\n    this.createDom();\n  }\n\n  if (opt_parentElement) {\n    opt_parentElement.insertBefore(this.element_, opt_beforeNode || null);\n  } else {\n    this.dom_.getDocument().body.appendChild(this.element_);\n  }\n\n  // If this component has a parent component that isn't in the document yet,\n  // we don't call enterDocument() here.  Instead, when the parent component\n  // enters the document, the enterDocument() call will propagate to its\n  // children, including this one.  If the component doesn't have a parent\n  // or if the parent is already in the document, we call enterDocument().\n  if (!this.parent_ || this.parent_.isInDocument()) {\n    this.enterDocument();\n  }\n};\n\n\n/**\n * Decorates the element for the UI component. If the element is in the\n * document, the enterDocument method will be called.\n *\n * If goog.ui.Component.ALLOW_DETACHED_DECORATION is false, the caller must\n * pass an element that is in the document.\n *\n * @param {Element} element Element to decorate.\n */\ngoog.ui.Component.prototype.decorate = function(element) {\n  if (this.inDocument_) {\n    throw new Error(goog.ui.Component.Error.ALREADY_RENDERED);\n  } else if (element && this.canDecorate(element)) {\n    this.wasDecorated_ = true;\n\n    // Set the DOM helper of the component to match the decorated element.\n    var doc = goog.dom.getOwnerDocument(element);\n    if (!this.dom_ || this.dom_.getDocument() != doc) {\n      this.dom_ = goog.dom.getDomHelper(element);\n    }\n\n    // Call specific component decorate logic.\n    this.decorateInternal(element);\n\n    // If supporting detached decoration, check that element is in doc.\n    if (!goog.ui.Component.ALLOW_DETACHED_DECORATION ||\n        goog.dom.contains(doc, element)) {\n      this.enterDocument();\n    }\n  } else {\n    throw new Error(goog.ui.Component.Error.DECORATE_INVALID);\n  }\n};\n\n\n/**\n * Determines if a given element can be decorated by this type of component.\n * This method should be overridden by inheriting objects.\n * @param {Element} element Element to decorate.\n * @return {boolean} True if the element can be decorated, false otherwise.\n */\ngoog.ui.Component.prototype.canDecorate = function(element) {\n  return true;\n};\n\n\n/**\n * @return {boolean} Whether the component was decorated.\n */\ngoog.ui.Component.prototype.wasDecorated = function() {\n  return this.wasDecorated_;\n};\n\n\n/**\n * Actually decorates the element. Should be overridden by inheriting objects.\n * This method can assume there are checks to ensure the component has not\n * already been rendered have occurred and that enter document will be called\n * afterwards. This method is considered protected.\n * @param {Element} element Element to decorate.\n * @protected\n */\ngoog.ui.Component.prototype.decorateInternal = function(element) {\n  this.element_ = element;\n};\n\n\n/**\n * Called when the component's element is known to be in the document. Anything\n * using document.getElementById etc. should be done at this stage.\n *\n * If the component contains child components, this call is propagated to its\n * children.\n */\ngoog.ui.Component.prototype.enterDocument = function() {\n  this.inDocument_ = true;\n\n  // Propagate enterDocument to child components that have a DOM, if any.\n  // If a child was decorated before entering the document (permitted when\n  // goog.ui.Component.ALLOW_DETACHED_DECORATION is true), its enterDocument\n  // will be called here.\n  this.forEachChild(function(child) {\n    if (!child.isInDocument() && child.getElement()) {\n      child.enterDocument();\n    }\n  });\n};\n\n\n/**\n * Called by dispose to clean up the elements and listeners created by a\n * component, or by a parent component/application who has removed the\n * component from the document but wants to reuse it later.\n *\n * If the component contains child components, this call is propagated to its\n * children.\n *\n * It should be possible for the component to be rendered again once this method\n * has been called.\n */\ngoog.ui.Component.prototype.exitDocument = function() {\n  // Propagate exitDocument to child components that have been rendered, if any.\n  this.forEachChild(function(child) {\n    if (child.isInDocument()) {\n      child.exitDocument();\n    }\n  });\n\n  if (this.googUiComponentHandler_) {\n    this.googUiComponentHandler_.removeAll();\n  }\n\n  this.inDocument_ = false;\n};\n\n\n/**\n * Disposes of the component.  Calls `exitDocument`, which is expected to\n * remove event handlers and clean up the component.  Propagates the call to\n * the component's children, if any. Removes the component's DOM from the\n * document unless it was decorated.\n * @override\n * @protected\n */\ngoog.ui.Component.prototype.disposeInternal = function() {\n  if (this.inDocument_) {\n    this.exitDocument();\n  }\n\n  if (this.googUiComponentHandler_) {\n    this.googUiComponentHandler_.dispose();\n    delete this.googUiComponentHandler_;\n  }\n\n  // Disposes of the component's children, if any.\n  this.forEachChild(function(child) { child.dispose(); });\n\n  // Detach the component's element from the DOM, unless it was decorated.\n  if (!this.wasDecorated_ && this.element_) {\n    goog.dom.removeNode(this.element_);\n  }\n\n  this.children_ = null;\n  this.childIndex_ = null;\n  this.element_ = null;\n  this.model_ = null;\n  this.parent_ = null;\n\n  goog.ui.Component.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * Helper function for subclasses that gets a unique id for a given fragment,\n * this can be used by components to generate unique string ids for DOM\n * elements.\n * @param {string} idFragment A partial id.\n * @return {string} Unique element id.\n */\ngoog.ui.Component.prototype.makeId = function(idFragment) {\n  return this.getId() + '.' + idFragment;\n};\n\n\n/**\n * Makes a collection of ids.  This is a convenience method for makeId.  The\n * object's values are the id fragments and the new values are the generated\n * ids.  The key will remain the same.\n * @param {Object} object The object that will be used to create the ids.\n * @return {!Object<string, string>} An object of id keys to generated ids.\n */\ngoog.ui.Component.prototype.makeIds = function(object) {\n  var ids = {};\n  for (var key in object) {\n    ids[key] = this.makeId(object[key]);\n  }\n  return ids;\n};\n\n\n/**\n * Returns the model associated with the UI component.\n * @return {*} The model.\n */\ngoog.ui.Component.prototype.getModel = function() {\n  return this.model_;\n};\n\n\n/**\n * Sets the model associated with the UI component.\n * @param {*} obj The model.\n */\ngoog.ui.Component.prototype.setModel = function(obj) {\n  this.model_ = obj;\n};\n\n\n/**\n * Helper function for returning the fragment portion of an id generated using\n * makeId().\n * @param {string} id Id generated with makeId().\n * @return {string} Fragment.\n */\ngoog.ui.Component.prototype.getFragmentFromId = function(id) {\n  return id.substring(this.getId().length + 1);\n};\n\n\n/**\n * Helper function for returning an element in the document with a unique id\n * generated using makeId().\n * @param {string} idFragment The partial id.\n * @return {Element} The element with the unique id, or null if it cannot be\n *     found.\n */\ngoog.ui.Component.prototype.getElementByFragment = function(idFragment) {\n  if (!this.inDocument_) {\n    throw new Error(goog.ui.Component.Error.NOT_IN_DOCUMENT);\n  }\n  return this.dom_.getElement(this.makeId(idFragment));\n};\n\n\n/**\n * Adds the specified component as the last child of this component.  See\n * {@link goog.ui.Component#addChildAt} for detailed semantics.\n *\n * @see goog.ui.Component#addChildAt\n * @param {goog.ui.Component} child The new child component.\n * @param {boolean=} opt_render If true, the child component will be rendered\n *    into the parent.\n */\ngoog.ui.Component.prototype.addChild = function(child, opt_render) {\n  // TODO(gboyer): addChildAt(child, this.getChildCount(), false) will\n  // reposition any already-rendered child to the end.  Instead, perhaps\n  // addChild(child, false) should never reposition the child; instead, clients\n  // that need the repositioning will use addChildAt explicitly.  Right now,\n  // clients can get around this by calling addChild before calling decorate.\n  this.addChildAt(child, this.getChildCount(), opt_render);\n};\n\n\n/**\n * Adds the specified component as a child of this component at the given\n * 0-based index.\n *\n * Both `addChild` and `addChildAt` assume the following contract\n * between parent and child components:\n *  <ul>\n *    <li>the child component's element must be a descendant of the parent\n *        component's element, and\n *    <li>the DOM state of the child component must be consistent with the DOM\n *        state of the parent component (see `isInDocument`) in the\n *        steady state -- the exception is to addChildAt(child, i, false) and\n *        then immediately decorate/render the child.\n *  </ul>\n *\n * In particular, `parent.addChild(child)` will throw an error if the\n * child component is already in the document, but the parent isn't.\n *\n * Clients of this API may call `addChild` and `addChildAt` with\n * `opt_render` set to true.  If `opt_render` is true, calling these\n * methods will automatically render the child component's element into the\n * parent component's element. If the parent does not yet have an element, then\n * `createDom` will automatically be invoked on the parent before\n * rendering the child.\n *\n * Invoking {@code parent.addChild(child, true)} will throw an error if the\n * child component is already in the document, regardless of the parent's DOM\n * state.\n *\n * If `opt_render` is true and the parent component is not already\n * in the document, `enterDocument` will not be called on this component\n * at this point.\n *\n * Finally, this method also throws an error if the new child already has a\n * different parent, or the given index is out of bounds.\n *\n * @see goog.ui.Component#addChild\n * @param {goog.ui.Component} child The new child component.\n * @param {number} index 0-based index at which the new child component is to be\n *    added; must be between 0 and the current child count (inclusive).\n * @param {boolean=} opt_render If true, the child component will be rendered\n *    into the parent.\n * @return {void} Nada.\n */\ngoog.ui.Component.prototype.addChildAt = function(child, index, opt_render) {\n  goog.asserts.assert(!!child, 'Provided element must not be null.');\n\n  if (child.inDocument_ && (opt_render || !this.inDocument_)) {\n    // Adding a child that's already in the document is an error, except if the\n    // parent is also in the document and opt_render is false (e.g. decorate()).\n    throw new Error(goog.ui.Component.Error.ALREADY_RENDERED);\n  }\n\n  if (index < 0 || index > this.getChildCount()) {\n    // Allowing sparse child arrays would lead to strange behavior, so we don't.\n    throw new Error(goog.ui.Component.Error.CHILD_INDEX_OUT_OF_BOUNDS);\n  }\n\n  // Create the index and the child array on first use.\n  if (!this.childIndex_ || !this.children_) {\n    this.childIndex_ = {};\n    this.children_ = [];\n  }\n\n  // Moving child within component, remove old reference.\n  if (child.getParent() == this) {\n    goog.object.set(this.childIndex_, child.getId(), child);\n    goog.array.remove(this.children_, child);\n\n    // Add the child to this component.  goog.object.add() throws an error if\n    // a child with the same ID already exists.\n  } else {\n    goog.object.add(this.childIndex_, child.getId(), child);\n  }\n\n  // Set the parent of the child to this component.  This throws an error if\n  // the child is already contained by another component.\n  child.setParent(this);\n  goog.array.insertAt(this.children_, child, index);\n\n  if (child.inDocument_ && this.inDocument_ && child.getParent() == this) {\n    // Changing the position of an existing child, move the DOM node (if\n    // necessary).\n    var contentElement = this.getContentElement();\n    var insertBeforeElement = contentElement.childNodes[index] || null;\n    if (insertBeforeElement != child.getElement()) {\n      contentElement.insertBefore(child.getElement(), insertBeforeElement);\n    }\n  } else if (opt_render) {\n    // If this (parent) component doesn't have a DOM yet, call createDom now\n    // to make sure we render the child component's element into the correct\n    // parent element (otherwise render_ with a null first argument would\n    // render the child into the document body, which is almost certainly not\n    // what we want).\n    if (!this.element_) {\n      this.createDom();\n    }\n    // Render the child into the parent at the appropriate location.  Note that\n    // getChildAt(index + 1) returns undefined if inserting at the end.\n    // TODO(attila): We should have a renderer with a renderChildAt API.\n    var sibling = this.getChildAt(index + 1);\n    // render_() calls enterDocument() if the parent is already in the document.\n    child.render_(this.getContentElement(), sibling ? sibling.element_ : null);\n  } else if (\n      this.inDocument_ && !child.inDocument_ && child.element_ &&\n      child.element_.parentNode &&\n      // Under some circumstances, IE8 implicitly creates a Document Fragment\n      // for detached nodes, so ensure the parent is an Element as it should be.\n      child.element_.parentNode.nodeType == goog.dom.NodeType.ELEMENT) {\n    // We don't touch the DOM, but if the parent is in the document, and the\n    // child element is in the document but not marked as such, then we call\n    // enterDocument on the child.\n    // TODO(gboyer): It would be nice to move this condition entirely, but\n    // there's a large risk of breaking existing applications that manually\n    // append the child to the DOM and then call addChild.\n    child.enterDocument();\n  }\n};\n\n\n/**\n * Returns the DOM element into which child components are to be rendered,\n * or null if the component itself hasn't been rendered yet.  This default\n * implementation returns the component's root element.  Subclasses with\n * complex DOM structures must override this method.\n * @return {Element} Element to contain child elements (null if none).\n */\ngoog.ui.Component.prototype.getContentElement = function() {\n  return this.element_;\n};\n\n\n/**\n * Returns true if the component is rendered right-to-left, false otherwise.\n * The first time this function is invoked, the right-to-left rendering property\n * is set if it has not been already.\n * @return {boolean} Whether the control is rendered right-to-left.\n */\ngoog.ui.Component.prototype.isRightToLeft = function() {\n  if (this.rightToLeft_ == null) {\n    this.rightToLeft_ = goog.style.isRightToLeft(\n        this.inDocument_ ? this.element_ : this.dom_.getDocument().body);\n  }\n  return this.rightToLeft_;\n};\n\n\n/**\n * Set is right-to-left. This function should be used if the component needs\n * to know the rendering direction during dom creation (i.e. before\n * {@link #enterDocument} is called and is right-to-left is set).\n * @param {boolean} rightToLeft Whether the component is rendered\n *     right-to-left.\n */\ngoog.ui.Component.prototype.setRightToLeft = function(rightToLeft) {\n  if (this.inDocument_) {\n    throw new Error(goog.ui.Component.Error.ALREADY_RENDERED);\n  }\n  this.rightToLeft_ = rightToLeft;\n};\n\n\n/**\n * Returns true if the component has children.\n * @return {boolean} True if the component has children.\n */\ngoog.ui.Component.prototype.hasChildren = function() {\n  return !!this.children_ && this.children_.length != 0;\n};\n\n\n/**\n * Returns the number of children of this component.\n * @return {number} The number of children.\n */\ngoog.ui.Component.prototype.getChildCount = function() {\n  return this.children_ ? this.children_.length : 0;\n};\n\n\n/**\n * Returns an array containing the IDs of the children of this component, or an\n * empty array if the component has no children.\n * @return {!Array<string>} Child component IDs.\n */\ngoog.ui.Component.prototype.getChildIds = function() {\n  var ids = [];\n\n  // We don't use goog.object.getKeys(this.childIndex_) because we want to\n  // return the IDs in the correct order as determined by this.children_.\n  this.forEachChild(function(child) {\n    // addChild()/addChildAt() guarantee that the child array isn't sparse.\n    ids.push(child.getId());\n  });\n\n  return ids;\n};\n\n\n/**\n * Returns the child with the given ID, or null if no such child exists.\n * @param {string} id Child component ID.\n * @return {goog.ui.Component?} The child with the given ID; null if none.\n */\ngoog.ui.Component.prototype.getChild = function(id) {\n  // Use childIndex_ for O(1) access by ID.\n  return (this.childIndex_ && id) ?\n      /** @type {goog.ui.Component} */ (\n          goog.object.get(this.childIndex_, id)) ||\n          null :\n      null;\n};\n\n\n/**\n * Returns the child at the given index, or null if the index is out of bounds.\n * @param {number} index 0-based index.\n * @return {goog.ui.Component?} The child at the given index; null if none.\n */\ngoog.ui.Component.prototype.getChildAt = function(index) {\n  // Use children_ for access by index.\n  return this.children_ ? this.children_[index] || null : null;\n};\n\n\n/**\n * Calls the given function on each of this component's children in order.  If\n * `opt_obj` is provided, it will be used as the 'this' object in the\n * function when called.  The function should take two arguments:  the child\n * component and its 0-based index.  The return value is ignored.\n * @param {function(this:T,?,number):?} f The function to call for every\n * child component; should take 2 arguments (the child and its index).\n * @param {T=} opt_obj Used as the 'this' object in f when called.\n * @template T\n */\ngoog.ui.Component.prototype.forEachChild = function(f, opt_obj) {\n  if (this.children_) {\n    goog.array.forEach(this.children_, f, opt_obj);\n  }\n};\n\n\n/**\n * Returns the 0-based index of the given child component, or -1 if no such\n * child is found.\n * @param {goog.ui.Component?} child The child component.\n * @return {number} 0-based index of the child component; -1 if not found.\n */\ngoog.ui.Component.prototype.indexOfChild = function(child) {\n  return (this.children_ && child) ? goog.array.indexOf(this.children_, child) :\n                                     -1;\n};\n\n\n/**\n * Removes the given child from this component, and returns it.  Throws an error\n * if the argument is invalid or if the specified child isn't found in the\n * parent component.  The argument can either be a string (interpreted as the\n * ID of the child component to remove) or the child component itself.\n *\n * If `opt_unrender` is true, calls {@link goog.ui.component#exitDocument}\n * on the removed child, and subsequently detaches the child's DOM from the\n * document.  Otherwise it is the caller's responsibility to clean up the child\n * component's DOM.\n *\n * @see goog.ui.Component#removeChildAt\n * @param {string|goog.ui.Component|null} child The ID of the child to remove,\n *    or the child component itself.\n * @param {boolean=} opt_unrender If true, calls `exitDocument` on the\n *    removed child component, and detaches its DOM from the document.\n * @return {goog.ui.Component} The removed component, if any.\n */\ngoog.ui.Component.prototype.removeChild = function(child, opt_unrender) {\n  if (child) {\n    // Normalize child to be the object and id to be the ID string.  This also\n    // ensures that the child is really ours.\n    var id = (typeof child === 'string') ? child : child.getId();\n    child = this.getChild(id);\n\n    if (id && child) {\n      goog.object.remove(this.childIndex_, id);\n      goog.array.remove(this.children_, child);\n\n      if (opt_unrender) {\n        // Remove the child component's DOM from the document.  We have to call\n        // exitDocument first (see documentation).\n        child.exitDocument();\n        if (child.element_) {\n          goog.dom.removeNode(child.element_);\n        }\n      }\n\n      // Child's parent must be set to null after exitDocument is called\n      // so that the child can unlisten to its parent if required.\n      child.setParent(null);\n    }\n  }\n\n  if (!child) {\n    throw new Error(goog.ui.Component.Error.NOT_OUR_CHILD);\n  }\n\n  return /** @type {!goog.ui.Component} */ (child);\n};\n\n\n/**\n * Removes the child at the given index from this component, and returns it.\n * Throws an error if the argument is out of bounds, or if the specified child\n * isn't found in the parent.  See {@link goog.ui.Component#removeChild} for\n * detailed semantics.\n *\n * @see goog.ui.Component#removeChild\n * @param {number} index 0-based index of the child to remove.\n * @param {boolean=} opt_unrender If true, calls `exitDocument` on the\n *    removed child component, and detaches its DOM from the document.\n * @return {goog.ui.Component} The removed component, if any.\n */\ngoog.ui.Component.prototype.removeChildAt = function(index, opt_unrender) {\n  // removeChild(null) will throw error.\n  return this.removeChild(this.getChildAt(index), opt_unrender);\n};\n\n\n/**\n * Removes every child component attached to this one and returns them.\n *\n * @see goog.ui.Component#removeChild\n * @param {boolean=} opt_unrender If true, calls {@link #exitDocument} on the\n *    removed child components, and detaches their DOM from the document.\n * @return {!Array<goog.ui.Component>} The removed components if any.\n */\ngoog.ui.Component.prototype.removeChildren = function(opt_unrender) {\n  var removedChildren = [];\n  while (this.hasChildren()) {\n    removedChildren.push(this.removeChildAt(0, opt_unrender));\n  }\n  return removedChildren;\n};\n\n\n/**\n * Returns whether this component should listen for PointerEvent types rather\n * than MouseEvent types. This allows supporting drag gestures for touch/stylus\n * input.\n * @return {boolean}\n */\ngoog.ui.Component.prototype.pointerEventsEnabled = function() {\n  return this.pointerEventsEnabled_;\n};\n\n\n/**\n * Indicates whether this component should listen for PointerEvent types rather\n * than MouseEvent types. This allows supporting drag gestures for touch/stylus\n * input. Must be called before enterDocument to listen for the correct event\n * types.\n * @param {boolean} enable\n */\ngoog.ui.Component.prototype.setPointerEventsEnabled = function(enable) {\n  if (this.inDocument_) {\n    throw new Error(goog.ui.Component.Error.ALREADY_RENDERED);\n  }\n  this.pointerEventsEnabled_ = enable;\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^>;","^=B","^9>","^;P","^:L","^<3","~$goog.ui.IdGenerator","^;9","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/component.js"],"^:1",["^9K",["~$goog.ui.Component.EventType","^:=","~$goog.ui.Component.State","~$goog.ui.Component.Error"]],"^9<",true,"^9=",["^9>","^;9","^:E","^;;","^=B","^;=","^>;","^:L","^;P","^<3","^VX"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.editor.abstractdialog.js","^9C",["^9D","goog/ui/editor/abstractdialog.js"],"^9E","goog/ui/editor/abstractdialog.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Wrapper around {@link goog.ui.Dialog}, to provide\n * dialogs that are smarter about interacting with a rich text editor.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.provide('goog.ui.editor.AbstractDialog');\ngoog.provide('goog.ui.editor.AbstractDialog.Builder');\ngoog.provide('goog.ui.editor.AbstractDialog.EventType');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.string');\ngoog.require('goog.ui.Dialog');\ngoog.require('goog.ui.PopupBase');\n\n\n// *** Public interface ***************************************************** //\n\n\n\n/**\n * Creates an object that represents a dialog box.\n * @param {goog.dom.DomHelper} domHelper DomHelper to be used to create the\n * dialog's dom structure.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.ui.editor.AbstractDialog = function(domHelper) {\n  goog.ui.editor.AbstractDialog.base(this, 'constructor');\n  this.dom = domHelper;\n\n  /** @private {?goog.ui.Dialog} */\n  this.dialogInternal_ = null;\n};\ngoog.inherits(goog.ui.editor.AbstractDialog, goog.events.EventTarget);\n\n\n/**\n * Causes the dialog box to appear, centered on the screen. Lazily creates the\n * dialog if needed.\n */\ngoog.ui.editor.AbstractDialog.prototype.show = function() {\n  // Lazily create the wrapped dialog to be shown.\n  if (!this.dialogInternal_) {\n    this.dialogInternal_ = this.createDialogControl();\n    this.dialogInternal_.listen(\n        goog.ui.PopupBase.EventType.HIDE, this.handleAfterHide_, false, this);\n  }\n\n  this.dialogInternal_.setVisible(true);\n};\n\n\n/**\n * Hides the dialog, causing AFTER_HIDE to fire.\n */\ngoog.ui.editor.AbstractDialog.prototype.hide = function() {\n  if (this.dialogInternal_) {\n    // This eventually fires the wrapped dialog's AFTER_HIDE event, calling our\n    // handleAfterHide_().\n    this.dialogInternal_.setVisible(false);\n  }\n};\n\n\n/**\n * @return {boolean} Whether the dialog is open.\n */\ngoog.ui.editor.AbstractDialog.prototype.isOpen = function() {\n  return !!this.dialogInternal_ && this.dialogInternal_.isVisible();\n};\n\n\n/**\n * Runs the handler registered on the OK button event and closes the dialog if\n * that handler succeeds.\n * This is useful in cases such as double-clicking an item in the dialog is\n * equivalent to selecting it and clicking the default button.\n * @protected\n */\ngoog.ui.editor.AbstractDialog.prototype.processOkAndClose = function() {\n  // Fake an OK event from the wrapped dialog control.\n  var evt = new goog.ui.Dialog.Event(goog.ui.Dialog.DefaultButtonKeys.OK, null);\n  if (this.handleOk(evt)) {\n    // handleOk calls dispatchEvent, so if any listener calls preventDefault it\n    // will return false and we won't hide the dialog.\n    this.hide();\n  }\n};\n\n\n// *** Dialog events ******************************************************** //\n\n\n/**\n * Event type constants for events the dialog fires.\n * @enum {string}\n */\ngoog.ui.editor.AbstractDialog.EventType = {\n  // This event is fired after the dialog is hidden, no matter if it was closed\n  // via OK or Cancel or is being disposed without being hidden first.\n  AFTER_HIDE: 'afterhide',\n  // Either the cancel or OK events can be canceled via preventDefault or by\n  // returning false from their handlers to stop the dialog from closing.\n  CANCEL: 'cancel',\n  OK: 'ok'\n};\n\n\n// *** Inner helper class *************************************************** //\n\n\n\n/**\n * A builder class for the dialog control. All methods except build return this.\n * @param {goog.ui.editor.AbstractDialog} editorDialog Editor dialog object\n *     that will wrap the wrapped dialog object this builder will create.\n * @constructor\n */\ngoog.ui.editor.AbstractDialog.Builder = function(editorDialog) {\n  // We require the editor dialog to be passed in so that the builder can set up\n  // ok/cancel listeners by default, making it easier for most dialogs.\n  this.editorDialog_ = editorDialog;\n  this.wrappedDialog_ = new goog.ui.Dialog('', true, this.editorDialog_.dom);\n  this.buttonSet_ = new goog.ui.Dialog.ButtonSet(this.editorDialog_.dom);\n  this.buttonHandlers_ = {};\n  this.addClassName(goog.getCssName('tr-dialog'));\n};\n\n\n/**\n * Sets the title of the dialog.\n * @param {string} title Title HTML (escaped).\n * @return {!goog.ui.editor.AbstractDialog.Builder} This.\n */\ngoog.ui.editor.AbstractDialog.Builder.prototype.setTitle = function(title) {\n  this.wrappedDialog_.setTitle(title);\n  return this;\n};\n\n\n/**\n * Adds an OK button to the dialog. Clicking this button will cause {@link\n * handleOk} to run, subsequently dispatching an OK event.\n * @param {string=} opt_label The caption for the button, if not \"OK\".\n * @return {!goog.ui.editor.AbstractDialog.Builder} This.\n */\ngoog.ui.editor.AbstractDialog.Builder.prototype.addOkButton = function(\n    opt_label) {\n  var key = goog.ui.Dialog.DefaultButtonKeys.OK;\n  /** @desc Label for an OK button in an editor dialog. */\n  var MSG_TR_DIALOG_OK = goog.getMsg('OK');\n  // True means this is the default/OK button.\n  this.buttonSet_.set(key, opt_label || MSG_TR_DIALOG_OK, true);\n  this.buttonHandlers_[key] =\n      goog.bind(this.editorDialog_.handleOk, this.editorDialog_);\n  return this;\n};\n\n\n/**\n * Adds a Cancel button to the dialog. Clicking this button will cause {@link\n * handleCancel} to run, subsequently dispatching a CANCEL event.\n * @param {string=} opt_label The caption for the button, if not \"Cancel\".\n * @return {!goog.ui.editor.AbstractDialog.Builder} This.\n */\ngoog.ui.editor.AbstractDialog.Builder.prototype.addCancelButton = function(\n    opt_label) {\n  var key = goog.ui.Dialog.DefaultButtonKeys.CANCEL;\n  /** @desc Label for a cancel button in an editor dialog. */\n  var MSG_TR_DIALOG_CANCEL = goog.getMsg('Cancel');\n  // False means it's not the OK button, true means it's the Cancel button.\n  this.buttonSet_.set(key, opt_label || MSG_TR_DIALOG_CANCEL, false, true);\n  this.buttonHandlers_[key] =\n      goog.bind(this.editorDialog_.handleCancel, this.editorDialog_);\n  return this;\n};\n\n\n/**\n * Adds a custom button to the dialog.\n * @param {string} label The caption for the button.\n * @param {function(goog.ui.Dialog.EventType):*} handler Function called when\n *     the button is clicked. It is recommended that this function be a method\n *     in the concrete subclass of AbstractDialog using this Builder, and that\n *     it dispatch an event (see {@link handleOk}).\n * @param {string=} opt_buttonId Identifier to be used to access the button when\n *     calling AbstractDialog.getButtonElement().\n * @return {!goog.ui.editor.AbstractDialog.Builder} This.\n */\ngoog.ui.editor.AbstractDialog.Builder.prototype.addButton = function(\n    label, handler, opt_buttonId) {\n  // We don't care what the key is, just that we can match the button with the\n  // handler function later.\n  var key = opt_buttonId || goog.string.createUniqueString();\n  this.buttonSet_.set(key, label);\n  this.buttonHandlers_[key] = handler;\n  return this;\n};\n\n\n/**\n * Puts a CSS class on the dialog's main element.\n * @param {string} className The class to add.\n * @return {!goog.ui.editor.AbstractDialog.Builder} This.\n */\ngoog.ui.editor.AbstractDialog.Builder.prototype.addClassName = function(\n    className) {\n  goog.dom.classlist.add(\n      goog.asserts.assert(this.wrappedDialog_.getDialogElement()), className);\n  return this;\n};\n\n\n/**\n * Sets the content element of the dialog.\n * @param {Element} contentElem An element for the main body.\n * @return {!goog.ui.editor.AbstractDialog.Builder} This.\n */\ngoog.ui.editor.AbstractDialog.Builder.prototype.setContent = function(\n    contentElem) {\n  goog.dom.appendChild(this.wrappedDialog_.getContentElement(), contentElem);\n  return this;\n};\n\n\n/**\n * Builds the wrapped dialog control. May only be called once, after which\n * no more methods may be called on this builder.\n * @return {!goog.ui.Dialog} The wrapped dialog control.\n */\ngoog.ui.editor.AbstractDialog.Builder.prototype.build = function() {\n  if (this.buttonSet_.isEmpty()) {\n    // If caller didn't set any buttons, add an OK and Cancel button by default.\n    this.addOkButton();\n    this.addCancelButton();\n  }\n  this.wrappedDialog_.setButtonSet(this.buttonSet_);\n\n  var handlers = this.buttonHandlers_;\n  this.buttonHandlers_ = null;\n  this.wrappedDialog_.listen(\n      goog.ui.Dialog.EventType.SELECT,\n      // Listen for the SELECT event, which means a button was clicked, and\n      // call the handler associated with that button via the key property.\n      function(e) {\n        if (handlers[e.key]) {\n          return handlers[e.key](e);\n        }\n      });\n\n  // All editor dialogs are modal.\n  this.wrappedDialog_.setModal(true);\n\n  var dialog = this.wrappedDialog_;\n  this.wrappedDialog_ = null;\n  return dialog;\n};\n\n\n/**\n * Editor dialog that will wrap the wrapped dialog this builder will create.\n * @type {goog.ui.editor.AbstractDialog}\n * @private\n */\ngoog.ui.editor.AbstractDialog.Builder.prototype.editorDialog_;\n\n\n/**\n * wrapped dialog control being built by this builder.\n * @type {goog.ui.Dialog}\n * @private\n */\ngoog.ui.editor.AbstractDialog.Builder.prototype.wrappedDialog_;\n\n\n/**\n * Set of buttons to be added to the wrapped dialog control.\n * @type {goog.ui.Dialog.ButtonSet}\n * @private\n */\ngoog.ui.editor.AbstractDialog.Builder.prototype.buttonSet_;\n\n\n/**\n * Map from keys that will be returned in the wrapped dialog SELECT events to\n * handler functions to be called to handle those events.\n * @type {Object}\n * @private\n */\ngoog.ui.editor.AbstractDialog.Builder.prototype.buttonHandlers_;\n\n\n// *** Protected interface ************************************************** //\n\n\n/**\n * The DOM helper for the parent document.\n * @type {goog.dom.DomHelper}\n * @protected\n */\ngoog.ui.editor.AbstractDialog.prototype.dom;\n\n\n/**\n * Creates and returns the goog.ui.Dialog control that is being wrapped\n * by this object.\n * @return {!goog.ui.Dialog} Created Dialog control.\n * @protected\n */\ngoog.ui.editor.AbstractDialog.prototype.createDialogControl =\n    goog.abstractMethod;\n\n\n/**\n * Returns the HTML Button element for the OK button in this dialog.\n * @return {Element} The button element if found, else null.\n * @protected\n */\ngoog.ui.editor.AbstractDialog.prototype.getOkButtonElement = function() {\n  return this.getButtonElement(goog.ui.Dialog.DefaultButtonKeys.OK);\n};\n\n\n/**\n * Returns the HTML Button element for the Cancel button in this dialog.\n * @return {Element} The button element if found, else null.\n * @protected\n */\ngoog.ui.editor.AbstractDialog.prototype.getCancelButtonElement = function() {\n  return this.getButtonElement(goog.ui.Dialog.DefaultButtonKeys.CANCEL);\n};\n\n\n/**\n * Returns the HTML Button element for the button added to this dialog with\n * the given button id.\n * @param {string} buttonId The id of the button to get.\n * @return {Element} The button element if found, else null.\n * @protected\n */\ngoog.ui.editor.AbstractDialog.prototype.getButtonElement = function(buttonId) {\n  return this.dialogInternal_.getButtonSet().getButton(buttonId);\n};\n\n\n/**\n * Creates and returns the event object to be used when dispatching the OK\n * event to listeners, or returns null to prevent the dialog from closing.\n * Subclasses should override this to return their own subclass of\n * goog.events.Event that includes all data a plugin would need from the dialog.\n * @param {goog.events.Event} e The event object dispatched by the wrapped\n *     dialog.\n * @return {goog.events.Event} The event object to be used when dispatching the\n *     OK event to listeners.\n * @protected\n */\ngoog.ui.editor.AbstractDialog.prototype.createOkEvent = goog.abstractMethod;\n\n\n/**\n * Handles the event dispatched by the wrapped dialog control when the user\n * clicks the OK button. Attempts to create the OK event object and dispatches\n * it if successful.\n * @param {goog.ui.Dialog.Event} e wrapped dialog OK event object.\n * @return {boolean} Whether the default action (closing the dialog) should\n *     still be executed. This will be false if the OK event could not be\n *     created to be dispatched, or if any listener to that event returs false\n *     or calls preventDefault.\n * @protected\n */\ngoog.ui.editor.AbstractDialog.prototype.handleOk = function(e) {\n  var eventObj = this.createOkEvent(e);\n  if (eventObj) {\n    return this.dispatchEvent(eventObj);\n  } else {\n    return false;\n  }\n};\n\n\n/**\n * Handles the event dispatched by the wrapped dialog control when the user\n * clicks the Cancel button. Simply dispatches a CANCEL event.\n * @return {boolean} Returns false if any of the handlers called prefentDefault\n *     on the event or returned false themselves.\n * @protected\n */\ngoog.ui.editor.AbstractDialog.prototype.handleCancel = function() {\n  return this.dispatchEvent(goog.ui.editor.AbstractDialog.EventType.CANCEL);\n};\n\n\n/**\n * Disposes of the dialog. If the dialog is open, it will be hidden and\n * AFTER_HIDE will be dispatched.\n * @override\n * @protected\n */\ngoog.ui.editor.AbstractDialog.prototype.disposeInternal = function() {\n  if (this.dialogInternal_) {\n    this.hide();\n\n    this.dialogInternal_.dispose();\n    this.dialogInternal_ = null;\n  }\n\n  goog.ui.editor.AbstractDialog.superClass_.disposeInternal.call(this);\n};\n\n\n// *** Private implementation *********************************************** //\n\n\n/**\n * Cleans up after the dialog is hidden and fires the AFTER_HIDE event. Should\n * be a listener for the wrapped dialog's AFTER_HIDE event.\n * @private\n */\ngoog.ui.editor.AbstractDialog.prototype.handleAfterHide_ = function() {\n  this.dispatchEvent(goog.ui.editor.AbstractDialog.EventType.AFTER_HIDE);\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^:;","^<=","^9L","^9>","^:L","~$goog.ui.Dialog"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/editor/abstractdialog.js"],"^:1",["^9K",["~$goog.ui.editor.AbstractDialog.Builder","~$goog.ui.editor.AbstractDialog.EventType","^A0"]],"^9<",true,"^9=",["^9>","^:E","^;;","^:;","^:L","^9L","^W0","^<="]],["^ ","^9A",[1579837703000],"^9B","goog.testing.recordfunction.js","^9C",["^9D","goog/testing/recordfunction.js"],"^9E","goog/testing/recordfunction.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Helper class for recording the calls of a function.\n *\n * Example:\n * <pre>\n * var stubs = new goog.testing.PropertyReplacer();\n *\n * function tearDown() {\n *   stubs.reset();\n * }\n *\n * function testShuffle() {\n *   stubs.replace(Math, 'random', goog.testing.recordFunction(Math.random));\n *   var arr = shuffle([1, 2, 3, 4, 5]);\n *   assertSameElements([1, 2, 3, 4, 5], arr);\n *   assertEquals(4, Math.random.getCallCount());\n * }\n *\n * function testOpenDialog() {\n *   stubs.replace(goog.ui, 'Dialog',\n *       goog.testing.recordConstructor(goog.ui.Dialog));\n *   openConfirmDialog();\n *   var lastDialogInstance = goog.ui.Dialog.getLastCall().getThis();\n *   assertEquals('confirm', lastDialogInstance.getTitle());\n * }\n * </pre>\n *\n */\n\ngoog.setTestOnly('goog.testing.FunctionCall');\ngoog.provide('goog.testing.FunctionCall');\ngoog.provide('goog.testing.recordConstructor');\ngoog.provide('goog.testing.recordFunction');\n\ngoog.require('goog.Promise');\ngoog.require('goog.promise.Resolver');\ngoog.require('goog.testing.asserts');\n\n\n/**\n * A function that represents the return type of recordFunction.\n * @private\n * @param {...?} var_args\n * @return {?}\n */\ngoog.testing.recordedFunction_ = function(var_args) {};\n\n/**\n * @return {number} Total number of calls.\n */\ngoog.testing.recordedFunction_.getCallCount = function() {};\n\n/**\n * Asserts that the function was called a certain number of times.\n * @param {number|string} a The expected number of calls (1 arg) or debug\n *     message (2 args).\n * @param {number=} opt_b The expected number of calls (2 args only).\n */\ngoog.testing.recordedFunction_.assertCallCount = function(a, opt_b) {};\n\n/**\n * @return {!Array<!goog.testing.FunctionCall>} All calls of the recorded\n *     function.\n */\ngoog.testing.recordedFunction_.getCalls = function() {};\n\n/**\n * @return {?goog.testing.FunctionCall} Last call of the recorded function or\n *     null if it hasn't been called.\n */\ngoog.testing.recordedFunction_.getLastCall = function() {};\n\n/**\n * Returns and removes the last call of the recorded function.\n * @return {?goog.testing.FunctionCall} Last call of the recorded function or\n *     null if it hasn't been called.\n */\ngoog.testing.recordedFunction_.popLastCall = function() {};\n\n/**\n * Returns a goog.Promise that resolves when the recorded function has equal\n * to or greater than the number of calls.\n * @param {number} num\n * @return {!goog.Promise<undefined>}\n */\ngoog.testing.recordedFunction_.waitForCalls = function(num) {};\n\n/**\n * Resets the recorded function and removes all calls.\n * @return {void}\n */\ngoog.testing.recordedFunction_.reset = function() {};\n\n/**\n * Wraps the function into another one which calls the inner function and\n * records its calls. The recorded function will have 3 static methods:\n * `getCallCount`, `getCalls` and `getLastCall` but won't\n * inherit the original function's prototype and static fields.\n *\n * @param {!Function=} opt_f The function to wrap and record. Defaults to\n *     {@link goog.nullFunction}.\n * @return {!goog.testing.recordFunction.Type} The wrapped function.\n */\ngoog.testing.recordFunction = function(opt_f) {\n  var f = opt_f || goog.nullFunction;\n  var calls = [];\n  /** @type {?goog.promise.Resolver} */\n  var waitForCallsResolver = null;\n  /** @type {number} */\n  var waitForCallsCount = 0;\n\n  function maybeResolveWaitForCalls() {\n    if (waitForCallsResolver && calls.length >= waitForCallsCount) {\n      waitForCallsResolver.resolve();\n      waitForCallsResolver = null;\n      waitForCallsCount = 0;\n    }\n  }\n\n  /** @type {!goog.testing.recordFunction.Type} */\n  function recordedFunction() {\n    var owner = /** @type {?} */ (this);\n    try {\n      var ret = f.apply(owner, arguments);\n      calls.push(new goog.testing.FunctionCall(f, owner, arguments, ret, null));\n      maybeResolveWaitForCalls();\n      return ret;\n    } catch (err) {\n      calls.push(\n          new goog.testing.FunctionCall(f, owner, arguments, undefined, err));\n      maybeResolveWaitForCalls();\n      throw err;\n    }\n  }\n\n  /**\n   * @return {number} Total number of calls.\n   */\n  recordedFunction.getCallCount = function() { return calls.length; };\n\n  /**\n   * Asserts that the function was called a certain number of times.\n   * @param {number|string} a The expected number of calls (1 arg) or debug\n   *     message (2 args).\n   * @param {number=} opt_b The expected number of calls (2 args only).\n   */\n  recordedFunction.assertCallCount = function(a, opt_b) {\n    var actual = calls.length;\n    var expected = arguments.length == 1 ? a : opt_b;\n    var message = arguments.length == 1 ? '' : ' ' + a;\n    assertEquals(\n        'Expected ' + expected + ' call(s), but was ' + actual + '.' + message,\n        expected, actual);\n  };\n\n  /**\n   * @return {!Array<!goog.testing.FunctionCall>} All calls of the recorded\n   *     function.\n   */\n  recordedFunction.getCalls = function() { return calls; };\n\n\n  /**\n   * @return {goog.testing.FunctionCall} Last call of the recorded function or\n   *     null if it hasn't been called.\n   */\n  recordedFunction.getLastCall = function() {\n    return calls[calls.length - 1] || null;\n  };\n\n  /**\n   * Returns and removes the last call of the recorded function.\n   * @return {goog.testing.FunctionCall} Last call of the recorded function or\n   *     null if it hasn't been called.\n   */\n  recordedFunction.popLastCall = function() { return calls.pop() || null; };\n\n  /**\n   * Returns a goog.Promise that resolves when the recorded function has equal\n   * to or greater than the number of calls.\n   * @param {number} num\n   * @return {!goog.Promise<undefined>}\n   */\n  recordedFunction.waitForCalls = function(num) {\n    waitForCallsCount = num;\n    waitForCallsResolver = goog.Promise.withResolver();\n    var promise = waitForCallsResolver.promise;\n    maybeResolveWaitForCalls();\n    return promise;\n  };\n\n  /**\n   * Resets the recorded function and removes all calls.\n   */\n  recordedFunction.reset = function() {\n    calls.length = 0;\n    waitForCallsResolver = null;\n    waitForCallsCount = 0;\n  };\n\n  return recordedFunction;\n};\n\n/** @typedef {typeof goog.testing.recordedFunction_} */\ngoog.testing.recordFunction.Type;\n\n\n/**\n * Same as {@link goog.testing.recordFunction} but the recorded function will\n * have the same prototype and static fields as the original one. It can be\n * used with constructors.\n *\n * @param {!Function} ctor The function to wrap and record.\n * @return {!Function} The wrapped function.\n */\ngoog.testing.recordConstructor = function(ctor) {\n  var recordedConstructor = goog.testing.recordFunction(ctor);\n  recordedConstructor.prototype = ctor.prototype;\n  goog.mixin(recordedConstructor, ctor);\n  return recordedConstructor;\n};\n\n\n\n/**\n * Struct for a single function call.\n * @param {!Function} func The called function.\n * @param {!Object} thisContext `this` context of called function.\n * @param {!Arguments} args Arguments of the called function.\n * @param {*} ret Return value of the function or undefined in case of error.\n * @param {*} error The error thrown by the function or null if none.\n * @constructor\n */\ngoog.testing.FunctionCall = function(func, thisContext, args, ret, error) {\n  this.function_ = func;\n  this.thisContext_ = thisContext;\n  this.arguments_ = Array.prototype.slice.call(args);\n  this.returnValue_ = ret;\n  this.error_ = error;\n};\n\n\n/**\n * @return {!Function} The called function.\n */\ngoog.testing.FunctionCall.prototype.getFunction = function() {\n  return this.function_;\n};\n\n\n/**\n * @return {!Object} `this` context of called function. It is the same as\n *     the created object if the function is a constructor.\n */\ngoog.testing.FunctionCall.prototype.getThis = function() {\n  return this.thisContext_;\n};\n\n\n/**\n * @return {!Array<?>} Arguments of the called function.\n */\ngoog.testing.FunctionCall.prototype.getArguments = function() {\n  return this.arguments_;\n};\n\n\n/**\n * Returns the nth argument of the called function.\n * @param {number} index 0-based index of the argument.\n * @return {*} The argument value or undefined if there is no such argument.\n */\ngoog.testing.FunctionCall.prototype.getArgument = function(index) {\n  return this.arguments_[index];\n};\n\n\n/**\n * @return {*} Return value of the function or undefined in case of error.\n */\ngoog.testing.FunctionCall.prototype.getReturnValue = function() {\n  return this.returnValue_;\n};\n\n\n/**\n * @return {*} The error thrown by the function or null if none.\n */\ngoog.testing.FunctionCall.prototype.getError = function() {\n  return this.error_;\n};\n","^9I",1579837703000,"^9J",["^9K",["^>X","^9>","^:4","^>D"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/recordfunction.js"],"^:1",["^9K",["~$goog.testing.FunctionCall","~$goog.testing.recordConstructor","^T9"]],"^9<",true,"^9=",["^9>","^:4","^>D","^>X"]],["^ ","^9A",[1579837703000],"^9B","goog.storage.collectablestoragetester.js","^9C",["^9D","goog/storage/collectablestoragetester.js"],"^9E","goog/storage/collectablestoragetester.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Unit tests for the collectable storage interface.\n *\n */\n\ngoog.provide('goog.storage.collectableStorageTester');\ngoog.setTestOnly();\n\ngoog.forwardDeclare('goog.storage.CollectableStorage');\ngoog.forwardDeclare('goog.storage.mechanism.IterableMechanism');\ngoog.forwardDeclare('goog.testing.MockClock');\ngoog.require('goog.testing.asserts');\n\n\n\n/**\n * Tests basic operation: expiration and collection of collectable storage.\n *\n * @param {goog.storage.mechanism.IterableMechanism} mechanism\n * @param {goog.testing.MockClock} clock\n * @param {goog.storage.CollectableStorage} storage\n  */\ngoog.storage.collectableStorageTester.runBasicTests = function(\n    mechanism, clock, storage) {\n  // No expiration.\n  storage.set('first', 'three seconds', 3000);\n  storage.set('second', 'one second', 1000);\n  storage.set('third', 'permanent');\n  storage.set('fourth', 'two seconds', 2000);\n  clock.tick(100);\n  storage.collect();\n  assertEquals('three seconds', storage.get('first'));\n  assertEquals('one second', storage.get('second'));\n  assertEquals('permanent', storage.get('third'));\n  assertEquals('two seconds', storage.get('fourth'));\n\n  // A key has expired.\n  clock.tick(1000);\n  storage.collect();\n  assertNull(mechanism.get('second'));\n  assertEquals('three seconds', storage.get('first'));\n  assertUndefined(storage.get('second'));\n  assertEquals('permanent', storage.get('third'));\n  assertEquals('two seconds', storage.get('fourth'));\n\n  // Another two keys have expired.\n  clock.tick(2000);\n  storage.collect();\n  assertNull(mechanism.get('first'));\n  assertNull(mechanism.get('fourth'));\n  assertUndefined(storage.get('first'));\n  assertEquals('permanent', storage.get('third'));\n  assertUndefined(storage.get('fourth'));\n\n  // Clean up.\n  storage.remove('third');\n  assertNull(mechanism.get('third'));\n  assertUndefined(storage.get('third'));\n  storage.collect();\n  clock.uninstall();\n};\n","^9I",1579837703000,"^9J",["^9K",["^>X","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/collectablestoragetester.js"],"^:1",["^9K",["~$goog.storage.collectableStorageTester"]],"^9<",true,"^9=",["^9>","^>X"]],["^ ","^9A",[1579837703000],"^9B","goog.messaging.respondingchannel.js","^9C",["^9D","goog/messaging/respondingchannel.js"],"^9E","goog/messaging/respondingchannel.js","^9F","^9G","^9H","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of goog.messaging.RespondingChannel, which wraps a\n * MessageChannel and allows the user to get the response from the services.\n *\n */\n\n\ngoog.provide('goog.messaging.RespondingChannel');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.Promise');\ngoog.require('goog.log');\ngoog.require('goog.messaging.MultiChannel');\n\n\n\n/**\n * Creates a new RespondingChannel wrapping a single MessageChannel.\n * @param {goog.messaging.MessageChannel} messageChannel The messageChannel to\n *     to wrap and allow for responses. This channel must not have any existing\n *     services registered. All service registration must be done through the\n *     {@link RespondingChannel#registerService} api instead. The other end of\n *     channel must also be a RespondingChannel.\n * @constructor\n * @extends {goog.Disposable}\n */\ngoog.messaging.RespondingChannel = function(messageChannel) {\n  goog.messaging.RespondingChannel.base(this, 'constructor');\n\n  /**\n   * The message channel wrapped in a MultiChannel so we can send private and\n   * public messages on it.\n   * @type {goog.messaging.MultiChannel}\n   * @private\n   */\n  this.messageChannel_ = new goog.messaging.MultiChannel(messageChannel);\n\n  /**\n   * Map of invocation signatures to function callbacks. These are used to keep\n   * track of the asyncronous service invocations so the result of a service\n   * call can be passed back to a callback in the calling frame.\n   * @type {Object<number, function(Object)>}\n   * @private\n   */\n  this.sigCallbackMap_ = {};\n\n  /**\n   * The virtual channel to send private messages on.\n   * @type {goog.messaging.MultiChannel.VirtualChannel}\n   * @private\n   */\n  this.privateChannel_ = this.messageChannel_.createVirtualChannel(\n      goog.messaging.RespondingChannel.PRIVATE_CHANNEL_);\n\n  /**\n   * The virtual channel to send public messages on.\n   * @type {goog.messaging.MultiChannel.VirtualChannel}\n   * @private\n   */\n  this.publicChannel_ = this.messageChannel_.createVirtualChannel(\n      goog.messaging.RespondingChannel.PUBLIC_CHANNEL_);\n\n  this.privateChannel_.registerService(\n      goog.messaging.RespondingChannel.CALLBACK_SERVICE_,\n      goog.bind(this.callbackServiceHandler_, this), true);\n};\ngoog.inherits(goog.messaging.RespondingChannel, goog.Disposable);\n\n\n/**\n * The name of the method invocation callback service (used internally).\n * @type {string}\n * @const\n * @private\n */\ngoog.messaging.RespondingChannel.CALLBACK_SERVICE_ = 'mics';\n\n\n/**\n * The name of the channel to send private control messages on.\n * @type {string}\n * @const\n * @private\n */\ngoog.messaging.RespondingChannel.PRIVATE_CHANNEL_ = 'private';\n\n\n/**\n * The name of the channel to send public messages on.\n * @type {string}\n * @const\n * @private\n */\ngoog.messaging.RespondingChannel.PUBLIC_CHANNEL_ = 'public';\n\n\n/**\n * The next signature index to save the callback against.\n * @type {number}\n * @private\n */\ngoog.messaging.RespondingChannel.prototype.nextSignatureIndex_ = 0;\n\n\n/**\n * Logger object for goog.messaging.RespondingChannel.\n * @type {goog.log.Logger}\n * @private\n */\ngoog.messaging.RespondingChannel.prototype.logger_ =\n    goog.log.getLogger('goog.messaging.RespondingChannel');\n\n\n/**\n * Gets a random number to use for method invocation results.\n * @return {number} A unique random signature.\n * @private\n */\ngoog.messaging.RespondingChannel.prototype.getNextSignature_ = function() {\n  return this.nextSignatureIndex_++;\n};\n\n\n/** @override */\ngoog.messaging.RespondingChannel.prototype.disposeInternal = function() {\n  goog.dispose(this.messageChannel_);\n  delete this.messageChannel_;\n  // Note: this.publicChannel_ and this.privateChannel_ get disposed by\n  //     this.messageChannel_\n  delete this.publicChannel_;\n  delete this.privateChannel_;\n};\n\n\n/**\n * Sends a message over the channel.\n * @param {string} serviceName The name of the service this message should be\n *     delivered to.\n * @param {string|!Object} payload The value of the message. If this is an\n *     Object, it is serialized to a string before sending if necessary.\n * @param {function(?Object)} callback The callback invoked with\n *     the result of the service call.\n */\ngoog.messaging.RespondingChannel.prototype.send = function(\n    serviceName, payload, callback) {\n\n  var signature = this.getNextSignature_();\n  this.sigCallbackMap_[signature] = callback;\n\n  var message = {};\n  message['signature'] = signature;\n  message['data'] = payload;\n\n  this.publicChannel_.send(serviceName, message);\n};\n\n\n/**\n * Receives the results of the peer's service results.\n * @param {!Object|string} message The results from the remote service\n *     invocation.\n * @private\n */\ngoog.messaging.RespondingChannel.prototype.callbackServiceHandler_ = function(\n    message) {\n\n  var signature = message['signature'];\n  var result = message['data'];\n\n  if (signature in this.sigCallbackMap_) {\n    var callback =\n        /** @type {function(Object)} */ (this.sigCallbackMap_[signature]);\n    callback(result);\n    delete this.sigCallbackMap_[signature];\n  } else {\n    goog.log.warning(this.logger_, 'Received signature is invalid');\n  }\n};\n\n\n/**\n * Registers a service to be called when a message is received.\n * @param {string} serviceName The name of the service.\n * @param {function(!Object)} callback The callback to process the\n *     incoming messages. Passed the payload.\n */\ngoog.messaging.RespondingChannel.prototype.registerService = function(\n    serviceName, callback) {\n  this.publicChannel_.registerService(\n      serviceName, goog.bind(this.callbackProxy_, this, callback), true);\n};\n\n\n/**\n * A intermediary proxy for service callbacks to be invoked and return their\n * their results to the remote caller's callback.\n * @param {function((string|!Object))} callback The callback to process the\n *     incoming messages. Passed the payload.\n * @param {!Object|string} message The message containing the signature and\n *     the data to invoke the service callback with.\n * @private\n */\ngoog.messaging.RespondingChannel.prototype.callbackProxy_ = function(\n    callback, message) {\n  var response = callback(message['data']);\n  var signature = message['signature'];\n  goog.Promise.resolve(response).then(goog.bind(function(result) {\n    this.sendResponse_(result, signature);\n  }, this));\n};\n\n\n/**\n * Sends the results of the service callback to the remote caller's callback.\n * @param {(string|!Object)} result The results of the service callback.\n * @param {string} signature The signature of the request to the service\n *     callback.\n * @private\n */\ngoog.messaging.RespondingChannel.prototype.sendResponse_ = function(\n    result, signature) {\n  var resultMessage = {};\n  resultMessage['data'] = result;\n  resultMessage['signature'] = signature;\n  // The callback invoked above may have disposed the channel so check if it\n  // exists.\n  if (this.privateChannel_) {\n    this.privateChannel_.send(\n        goog.messaging.RespondingChannel.CALLBACK_SERVICE_, resultMessage);\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^;Q","^:4","^:7","^TS"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/respondingchannel.js"],"^:1",["^9K",["~$goog.messaging.RespondingChannel"]],"^9<",true,"^9=",["^9>","^:7","^:4","^;Q","^TS"]],["^ ","^9A",[1579837703000],"^9B","goog.testing.events.matchers.js","^9C",["^9D","goog/testing/events/matchers.js"],"^9E","goog/testing/events/matchers.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Mock matchers for event related arguments.\n */\n\ngoog.setTestOnly('goog.testing.events.EventMatcher');\ngoog.provide('goog.testing.events.EventMatcher');\n\ngoog.require('goog.events.Event');\ngoog.require('goog.testing.mockmatchers.ArgumentMatcher');\n\n\n\n/**\n * A matcher that verifies that an argument is a `goog.events.Event` of a\n * particular type.\n * @param {string} type The single type the event argument must be of.\n * @constructor\n * @extends {goog.testing.mockmatchers.ArgumentMatcher}\n * @final\n */\ngoog.testing.events.EventMatcher = function(type) {\n  goog.testing.mockmatchers.ArgumentMatcher.call(this, function(obj) {\n    return obj instanceof goog.events.Event && obj.type == type;\n  }, 'isEventOfType(' + type + ')');\n};\ngoog.inherits(\n    goog.testing.events.EventMatcher,\n    goog.testing.mockmatchers.ArgumentMatcher);\n","^9I",1579837703000,"^9J",["^9K",["~$goog.testing.mockmatchers.ArgumentMatcher","^9>","^;8"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/events/matchers.js"],"^:1",["^9K",["~$goog.testing.events.EventMatcher"]],"^9<",true,"^9=",["^9>","^;8","^W7"]],["^ ","^9A",[1579837703000],"^9B","goog.fx.easing.js","^9C",["^9D","goog/fx/easing.js"],"^9E","goog/fx/easing.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Easing functions for animations.\n *\n * @author arv@google.com (Erik Arvidsson)\n */\n\ngoog.provide('goog.fx.easing');\n\n\n/**\n * Ease in - Start slow and speed up.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n */\ngoog.fx.easing.easeIn = function(t) {\n  return goog.fx.easing.easeInInternal_(t, 3);\n};\n\n\n/**\n * Ease in with specifiable exponent.\n * @param {number} t Input between 0 and 1.\n * @param {number} exp Ease exponent.\n * @return {number} Output between 0 and 1.\n * @private\n */\ngoog.fx.easing.easeInInternal_ = function(t, exp) {\n  return Math.pow(t, exp);\n};\n\n\n/**\n * Ease out - Start fastest and slows to a stop.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n */\ngoog.fx.easing.easeOut = function(t) {\n  return goog.fx.easing.easeOutInternal_(t, 3);\n};\n\n\n/**\n * Ease out with specifiable exponent.\n * @param {number} t Input between 0 and 1.\n * @param {number} exp Ease exponent.\n * @return {number} Output between 0 and 1.\n * @private\n */\ngoog.fx.easing.easeOutInternal_ = function(t, exp) {\n  return 1 - goog.fx.easing.easeInInternal_(1 - t, exp);\n};\n\n\n/**\n * Ease out long - Start fastest and slows to a stop with a long ease.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n */\ngoog.fx.easing.easeOutLong = function(t) {\n  return goog.fx.easing.easeOutInternal_(t, 4);\n};\n\n\n/**\n * Ease in and out - Start slow, speed up, then slow down.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n */\ngoog.fx.easing.inAndOut = function(t) {\n  return 3 * t * t - 2 * t * t * t;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/easing.js"],"^:1",["^9K",["^H:"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.result.deferredadaptor.js","^9C",["^9D","goog/result/deferredadaptor.js"],"^9E","goog/result/deferredadaptor.js","^9F","^9G","^9H","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An adaptor from a Result to a Deferred.\n *\n * TODO (vbhasin): cancel() support.\n * TODO (vbhasin): See if we can make this a static.\n * TODO (gboyer, vbhasin): Rename to \"Adapter\" once this graduates; this is the\n * proper programmer spelling.\n */\n\n\ngoog.provide('goog.result.DeferredAdaptor');\n\ngoog.require('goog.async.Deferred');\ngoog.require('goog.result');\ngoog.require('goog.result.Result');\n\n\n\n/**\n * An adaptor from Result to a Deferred, for use with existing Deferred chains.\n *\n * @param {!goog.result.Result} result A result.\n * @constructor\n * @extends {goog.async.Deferred}\n * @final\n * @deprecated Use {@link goog.Promise} instead - http://go/promisemigration\n */\ngoog.result.DeferredAdaptor = function(result) {\n  goog.result.DeferredAdaptor.base(this, 'constructor');\n  goog.result.wait(result, function(result) {\n    if (this.hasFired()) {\n      return;\n    }\n    if (result.getState() == goog.result.Result.State.SUCCESS) {\n      this.callback(result.getValue());\n    } else if (result.getState() == goog.result.Result.State.ERROR) {\n      if (result.getError() instanceof goog.result.Result.CancelError) {\n        this.cancel();\n      } else {\n        this.errback(result.getError());\n      }\n    }\n  }, this);\n};\ngoog.inherits(goog.result.DeferredAdaptor, goog.async.Deferred);\n","^9I",1579837703000,"^9J",["^9K",["~$goog.result","^9>","^?Z","^S:"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/result/deferredadaptor.js"],"^:1",["^9K",["~$goog.result.DeferredAdaptor"]],"^9<",true,"^9=",["^9>","^?Z","^W9","^S:"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.ac.renderer.js","^9C",["^9D","goog/ui/ac/renderer.js"],"^9E","goog/ui/ac/renderer.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class for rendering the results of an auto complete and\n * allow the user to select an row.\n *\n */\n\ngoog.provide('goog.ui.ac.Renderer');\ngoog.provide('goog.ui.ac.Renderer.CustomRenderer');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dispose');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.fx.dom.FadeInAndShow');\ngoog.require('goog.fx.dom.FadeOutAndHide');\ngoog.require('goog.positioning');\ngoog.require('goog.positioning.Corner');\ngoog.require('goog.positioning.Overflow');\ngoog.require('goog.string');\ngoog.require('goog.style');\ngoog.require('goog.ui.IdGenerator');\ngoog.require('goog.ui.ac.AutoComplete');\n\n\n\n/**\n * Class for rendering the results of an auto-complete in a drop down list.\n *\n * @constructor\n * @param {Element=} opt_parentNode optional reference to the parent element\n *     that will hold the autocomplete elements. goog.dom.getDocument().body\n *     will be used if this is null.\n * @param {?({renderRow}|{render})=} opt_customRenderer Custom full renderer to\n *     render each row. Should be something with a renderRow or render method.\n * @param {boolean=} opt_rightAlign Determines if the autocomplete will always\n *     be right aligned. False by default.\n * @param {boolean=} opt_useStandardHighlighting Determines if standard\n *     highlighting should be applied to each row of data. Standard highlighting\n *     bolds every matching substring for a given token in each row. True by\n *     default.\n * @extends {goog.events.EventTarget}\n * @suppress {underscore}\n */\ngoog.ui.ac.Renderer = function(\n    opt_parentNode, opt_customRenderer, opt_rightAlign,\n    opt_useStandardHighlighting) {\n  goog.ui.ac.Renderer.base(this, 'constructor');\n\n  /**\n   * Reference to the parent element that will hold the autocomplete elements\n   * @type {Element}\n   * @private\n   */\n  this.parent_ = opt_parentNode || goog.dom.getDocument().body;\n\n  /**\n   * Dom helper for the parent element's document.\n   * @type {goog.dom.DomHelper}\n   * @private\n   */\n  this.dom_ = goog.dom.getDomHelper(this.parent_);\n\n  /**\n   * Whether to reposition the autocomplete UI below the target node\n   * @type {boolean}\n   * @private\n   */\n  this.reposition_ = !opt_parentNode;\n\n  /**\n   * Reference to the main element that controls the rendered autocomplete\n   * @type {?Element}\n   * @private\n   */\n  this.element_ = null;\n\n  /**\n   * The current token that has been entered\n   * @type {string}\n   * @private\n   */\n  this.token_ = '';\n\n  /**\n   * Array used to store the current set of rows being displayed\n   * @type {Array<!Object>}\n   * @private\n   */\n  this.rows_ = [];\n\n  /**\n   * Array of the node divs that hold each result that is being displayed.\n   * @type {Array<Element>}\n   * @protected\n   * @suppress {underscore|visibility}\n   */\n  this.rowDivs_ = [];\n\n  /**\n   * The index of the currently highlighted row\n   * @type {number}\n   * @protected\n   * @suppress {underscore|visibility}\n   */\n  this.hilitedRow_ = -1;\n\n  /**\n   * The time that the rendering of the menu rows started\n   * @type {number}\n   * @protected\n   * @suppress {underscore|visibility}\n   */\n  this.startRenderingRows_ = -1;\n\n  /**\n   * Store the current state for the renderer\n   * @type {boolean}\n   * @private\n   */\n  this.visible_ = false;\n\n  /**\n   * Classname for the main element.  This must be a single valid class name.\n   * @type {string}\n   */\n  this.className = goog.getCssName('ac-renderer');\n\n  /**\n   * Classname for row divs.  This must be a single valid class name.\n   * @type {string}\n   */\n  this.rowClassName = goog.getCssName('ac-row');\n\n  // TODO(gboyer): Remove this as soon as we remove references and ensure that\n  // no groups are pushing javascript using this.\n  /**\n   * The old class name for active row.  This name is deprecated because its\n   * name is generic enough that a typical implementation would require a\n   * descendant selector.\n   * Active row will have rowClassName & activeClassName &\n   * legacyActiveClassName.\n   * @type {string}\n   * @private\n   */\n  this.legacyActiveClassName_ = goog.getCssName('active');\n\n  /**\n   * Class name for active row div.  This must be a single valid class name.\n   * Active row will have rowClassName & activeClassName &\n   * legacyActiveClassName.\n   * @type {string}\n   */\n  this.activeClassName = goog.getCssName('ac-active');\n\n  /**\n   * Class name for the bold tag highlighting the matched part of the text.\n   * @type {string}\n   */\n  this.highlightedClassName = goog.getCssName('ac-highlighted');\n\n  /**\n   * Custom full renderer\n   * @type {?({renderRow}|{render})}\n   * @private\n   */\n  this.customRenderer_ = opt_customRenderer || null;\n\n  /**\n   * Flag to indicate whether standard highlighting should be applied.\n   * this is set to true if left unspecified to retain existing\n   * behaviour for autocomplete clients\n   * @type {boolean}\n   * @private\n   */\n  this.useStandardHighlighting_ =\n      opt_useStandardHighlighting != null ? opt_useStandardHighlighting : true;\n\n  /**\n   * Flag to indicate whether matches should be done on whole words instead\n   * of any string.\n   * @type {boolean}\n   * @private\n   */\n  this.matchWordBoundary_ = true;\n\n  /**\n   * Flag to set all tokens as highlighted in the autocomplete row.\n   * @type {boolean}\n   * @private\n   */\n  this.highlightAllTokens_ = false;\n\n  /**\n   * Determines if the autocomplete will always be right aligned\n   * @type {boolean}\n   * @private\n   */\n  this.rightAlign_ = !!opt_rightAlign;\n\n  /**\n   * Whether to align with top of target field\n   * @type {boolean}\n   * @private\n   */\n  this.topAlign_ = false;\n\n  /**\n   * Duration (in msec) of fade animation when menu is shown/hidden.\n   * Setting to 0 (default) disables animation entirely.\n   * @type {number}\n   * @private\n   */\n  this.menuFadeDuration_ = 0;\n\n  /**\n   * Whether we should limit the dropdown from extending past the bottom of the\n   * screen and instead show a scrollbar on the dropdown.\n   * @type {boolean}\n   * @private\n   */\n  this.showScrollbarsIfTooLarge_ = false;\n\n  /**\n   * Animation in progress, if any.\n   * @type {goog.fx.Animation|undefined}\n   */\n  this.animation_;\n};\ngoog.inherits(goog.ui.ac.Renderer, goog.events.EventTarget);\n\n\n/**\n * The anchor element to position the rendered autocompleter against.\n * @type {Element}\n * @private\n */\ngoog.ui.ac.Renderer.prototype.anchorElement_;\n\n\n/**\n * The anchor element to position the rendered autocompleter against.\n * @protected {Element|undefined}\n */\ngoog.ui.ac.Renderer.prototype.target_;\n\n\n/**\n * The element on which to base the width of the autocomplete.\n * @protected {Node}\n */\ngoog.ui.ac.Renderer.prototype.widthProvider_;\n\n\n/**\n * The element on which to base the max width of the autocomplete.\n * @protected {!Node|undefined}\n */\ngoog.ui.ac.Renderer.prototype.maxWidthProvider_;\n\n\n/**\n * The border width of the autocomplete dropdown, only used in calculating the\n * dropdown width.\n * @private {number}\n */\ngoog.ui.ac.Renderer.prototype.borderWidth_ = 0;\n\n\n/**\n * A flag used to make sure we highlight only one match in the rendered row.\n * @private {boolean}\n */\ngoog.ui.ac.Renderer.prototype.wasHighlightedAtLeastOnce_;\n\n\n/**\n * The delay before mouseover events are registered, in milliseconds\n * @type {number}\n * @const\n */\ngoog.ui.ac.Renderer.DELAY_BEFORE_MOUSEOVER = 300;\n\n\n/**\n * Gets the renderer's element.\n * @return {Element} The  main element that controls the rendered autocomplete.\n */\ngoog.ui.ac.Renderer.prototype.getElement = function() {\n  return this.element_;\n};\n\n\n/**\n * Sets the width provider element. The provider is only used on redraw and as\n * such will not automatically update on resize.\n * @param {Node} widthProvider The element whose width should be mirrored.\n * @param {number=} opt_borderWidth The width of the border of the autocomplete,\n *     which will be subtracted from the width of the autocomplete dropdown.\n * @param {!Node=} maxWidthProvider The element whose width should be used\n *     as the autocomplete's max width.\n */\ngoog.ui.ac.Renderer.prototype.setWidthProvider = function(\n    widthProvider, opt_borderWidth, maxWidthProvider = undefined) {\n  this.widthProvider_ = widthProvider;\n  if (opt_borderWidth) {\n    this.borderWidth_ = opt_borderWidth;\n  }\n  if (maxWidthProvider) {\n    this.maxWidthProvider_ = maxWidthProvider;\n  }\n};\n\n\n/**\n * Set whether to align autocomplete to top of target element\n * @param {boolean} align If true, align to top.\n */\ngoog.ui.ac.Renderer.prototype.setTopAlign = function(align) {\n  this.topAlign_ = align;\n};\n\n\n/**\n * @return {boolean} Whether we should be aligning to the top of\n *     the target element.\n */\ngoog.ui.ac.Renderer.prototype.getTopAlign = function() {\n  return this.topAlign_;\n};\n\n\n/**\n * Set whether to align autocomplete to the right of the target element.\n * @param {boolean} align If true, align to right.\n */\ngoog.ui.ac.Renderer.prototype.setRightAlign = function(align) {\n  this.rightAlign_ = align;\n};\n\n\n/**\n * @return {boolean} Whether the autocomplete menu should be right aligned.\n */\ngoog.ui.ac.Renderer.prototype.getRightAlign = function() {\n  return this.rightAlign_;\n};\n\n\n/**\n * @param {boolean} show Whether we should limit the dropdown from extending\n *     past the bottom of the screen and instead show a scrollbar on the\n *     dropdown.\n */\ngoog.ui.ac.Renderer.prototype.setShowScrollbarsIfTooLarge = function(show) {\n  this.showScrollbarsIfTooLarge_ = show;\n};\n\n\n/**\n * Set whether or not standard highlighting should be used when rendering rows.\n * @param {boolean} useStandardHighlighting true if standard highlighting used.\n */\ngoog.ui.ac.Renderer.prototype.setUseStandardHighlighting = function(\n    useStandardHighlighting) {\n  this.useStandardHighlighting_ = useStandardHighlighting;\n};\n\n\n/**\n * @param {boolean} matchWordBoundary Determines whether matches should be\n *     higlighted only when the token matches text at a whole-word boundary.\n *     True by default.\n */\ngoog.ui.ac.Renderer.prototype.setMatchWordBoundary = function(\n    matchWordBoundary) {\n  this.matchWordBoundary_ = matchWordBoundary;\n};\n\n\n/**\n * Set whether or not to highlight all matching tokens rather than just the\n * first.\n * @param {boolean} highlightAllTokens Whether to highlight all matching tokens\n *     rather than just the first.\n */\ngoog.ui.ac.Renderer.prototype.setHighlightAllTokens = function(\n    highlightAllTokens) {\n  this.highlightAllTokens_ = highlightAllTokens;\n};\n\n\n/**\n * Sets the duration (in msec) of the fade animation when menu is shown/hidden.\n * Setting to 0 (default) disables animation entirely.\n * @param {number} duration Duration (in msec) of the fade animation (or 0 for\n *     no animation).\n */\ngoog.ui.ac.Renderer.prototype.setMenuFadeDuration = function(duration) {\n  this.menuFadeDuration_ = duration;\n};\n\n\n/**\n * Sets the anchor element for the subsequent call to renderRows.\n * @param {Element} anchor The anchor element.\n */\ngoog.ui.ac.Renderer.prototype.setAnchorElement = function(anchor) {\n  this.anchorElement_ = anchor;\n};\n\n\n/**\n * @return {Element} The anchor element.\n * @protected\n */\ngoog.ui.ac.Renderer.prototype.getAnchorElement = function() {\n  return this.anchorElement_;\n};\n\n\n/**\n * Render the autocomplete UI\n *\n * @param {Array<!Object>} rows Matching UI rows.\n * @param {string} token Token we are currently matching against.\n * @param {Element=} opt_target Current HTML node, will position popup beneath\n *     this node.\n */\ngoog.ui.ac.Renderer.prototype.renderRows = function(rows, token, opt_target) {\n  this.token_ = token;\n  this.rows_ = rows;\n  this.hilitedRow_ = -1;\n  this.startRenderingRows_ = goog.now();\n  this.target_ = opt_target;\n  this.rowDivs_ = [];\n  this.redraw();\n};\n\n\n/**\n * Hide the object.\n */\ngoog.ui.ac.Renderer.prototype.dismiss = function() {\n  if (this.visible_) {\n    this.visible_ = false;\n    this.toggleAriaMarkup_(false /* isShown */);\n\n    if (this.menuFadeDuration_ > 0) {\n      goog.dispose(this.animation_);\n      this.animation_ =\n          new goog.fx.dom.FadeOutAndHide(this.element_, this.menuFadeDuration_);\n      this.animation_.play();\n    } else {\n      goog.style.setElementShown(this.element_, false);\n    }\n  }\n};\n\n\n/**\n * Show the object.\n */\ngoog.ui.ac.Renderer.prototype.show = function() {\n  if (!this.visible_) {\n    this.visible_ = true;\n    this.toggleAriaMarkup_(true /* isShown */);\n\n    if (this.menuFadeDuration_ > 0) {\n      goog.dispose(this.animation_);\n      this.animation_ =\n          new goog.fx.dom.FadeInAndShow(this.element_, this.menuFadeDuration_);\n      this.animation_.play();\n    } else {\n      goog.style.setElementShown(this.element_, true);\n    }\n  }\n};\n\n\n/**\n * Toggle the ARIA markup to add popup semantics when the target is shown and\n * to remove them when it is hidden.\n * @param {boolean} isShown Whether the menu is being shown.\n * @private\n */\ngoog.ui.ac.Renderer.prototype.toggleAriaMarkup_ = function(isShown) {\n  if (!this.target_) {\n    return;\n  }\n\n  goog.a11y.aria.setState(this.target_, goog.a11y.aria.State.HASPOPUP, isShown);\n  goog.a11y.aria.setState(\n      goog.asserts.assert(this.element_), goog.a11y.aria.State.EXPANDED,\n      isShown);\n  goog.a11y.aria.setState(this.target_, goog.a11y.aria.State.EXPANDED, isShown);\n  if (isShown) {\n    goog.a11y.aria.setState(\n        this.target_, goog.a11y.aria.State.OWNS, this.element_.id);\n  } else {\n    goog.a11y.aria.removeState(this.target_, goog.a11y.aria.State.OWNS);\n    goog.a11y.aria.setActiveDescendant(this.target_, null);\n  }\n};\n\n\n/**\n * @return {boolean} True if the object is visible.\n */\ngoog.ui.ac.Renderer.prototype.isVisible = function() {\n  return this.visible_;\n};\n\n\n/**\n * Sets the 'active' class of the nth item.\n * @param {number} index Index of the item to highlight.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.ac.Renderer.prototype.hiliteRow = function(index) {\n  var row =\n      index >= 0 && index < this.rows_.length ? this.rows_[index] : undefined;\n  var rowDiv = index >= 0 && index < this.rowDivs_.length ?\n      this.rowDivs_[index] :\n      undefined;\n\n  var evtObj = /** @lends {goog.events.Event.prototype} */ ({\n    type: goog.ui.ac.AutoComplete.EventType.ROW_HILITE,\n    rowNode: rowDiv,\n    row: row ? row.data : null\n  });\n  if (this.dispatchEvent(evtObj)) {\n    this.hiliteNone();\n    this.hilitedRow_ = index;\n    if (rowDiv) {\n      goog.dom.classlist.addAll(\n          rowDiv, [this.activeClassName, this.legacyActiveClassName_]);\n      if (this.target_) {\n        goog.a11y.aria.setActiveDescendant(this.target_, rowDiv);\n      }\n      goog.style.scrollIntoContainerView(rowDiv, this.element_);\n    }\n  }\n};\n\n\n/**\n * Removes the 'active' class from the currently selected row.\n */\ngoog.ui.ac.Renderer.prototype.hiliteNone = function() {\n  if (this.hilitedRow_ >= 0) {\n    goog.dom.classlist.removeAll(\n        goog.asserts.assert(this.rowDivs_[this.hilitedRow_]),\n        [this.activeClassName, this.legacyActiveClassName_]);\n  }\n};\n\n\n/**\n * Sets the 'active' class of the item with a given id.\n * @param {number} id Id of the row to hilight. If id is -1 then no rows get\n *     hilited.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.ac.Renderer.prototype.hiliteId = function(id) {\n  if (id == -1) {\n    this.hiliteRow(-1);\n  } else {\n    for (var i = 0; i < this.rows_.length; i++) {\n      if (this.rows_[i].id == id) {\n        this.hiliteRow(i);\n        return;\n      }\n    }\n  }\n};\n\n\n/**\n * Sets CSS classes on autocomplete conatainer element.\n *\n * @param {Element} elem The container element.\n * @private\n */\ngoog.ui.ac.Renderer.prototype.setMenuClasses_ = function(elem) {\n  goog.asserts.assert(elem);\n  // Legacy clients may set the renderer's className to a space-separated list\n  // or even have a trailing space.\n  goog.dom.classlist.addAll(elem, goog.string.trim(this.className).split(' '));\n};\n\n\n/**\n * If the main HTML element hasn't been made yet, creates it and appends it\n * to the parent.\n * @private\n */\ngoog.ui.ac.Renderer.prototype.maybeCreateElement_ = function() {\n  if (!this.element_) {\n    // Make element and add it to the parent\n    var el = this.dom_.createDom(goog.dom.TagName.DIV, {style: 'display:none'});\n    if (this.showScrollbarsIfTooLarge_) {\n      // Make sure that the dropdown will get scrollbars if it isn't large\n      // enough to show all rows.\n      el.style.overflowY = 'auto';\n    }\n    this.element_ = el;\n    this.setMenuClasses_(el);\n    goog.a11y.aria.setRole(el, goog.a11y.aria.Role.LISTBOX);\n\n    el.id = goog.ui.IdGenerator.getInstance().getNextUniqueId();\n\n    this.dom_.appendChild(this.parent_, el);\n\n    // Add this object as an event handler\n    goog.events.listen(\n        el, goog.events.EventType.CLICK, this.handleClick_, false, this);\n    goog.events.listen(\n        el, goog.events.EventType.MOUSEDOWN, this.handleMouseDown_, false,\n        this);\n    goog.events.listen(\n        el, goog.events.EventType.MOUSEOVER, this.handleMouseOver_, false,\n        this);\n  }\n};\n\n\n/**\n * Redraw (or draw if this is the first call) the rendered auto-complete drop\n * down.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.ac.Renderer.prototype.redraw = function() {\n  // Create the element if it doesn't yet exist\n  this.maybeCreateElement_();\n\n  // For top aligned with target (= bottom aligned element),\n  // we need to hide and then add elements while hidden to prevent\n  // visible repositioning\n  if (this.topAlign_) {\n    this.element_.style.visibility = 'hidden';\n  }\n\n  if (this.widthProvider_) {\n    var width = this.widthProvider_.clientWidth - this.borderWidth_ + 'px';\n    this.element_.style.minWidth = width;\n  }\n  if (this.maxWidthProvider_) {\n    const maxWidth =\n        this.maxWidthProvider_.clientWidth - this.borderWidth_ + 'px';\n    this.element_.style.maxWidth = maxWidth;\n  }\n\n  // Remove the current child nodes\n  this.rowDivs_.length = 0;\n  this.dom_.removeChildren(this.element_);\n\n  // Generate the new rows (use forEach so we can change rows_ from an\n  // array to a different datastructure if required)\n  if (this.customRenderer_ && this.customRenderer_.render) {\n    this.customRenderer_.render(this, this.element_, this.rows_, this.token_);\n  } else {\n    var curRow = null;\n    goog.array.forEach(this.rows_, function(row) {\n      row = this.renderRowHtml(row, this.token_);\n      if (this.topAlign_) {\n        // Aligned with top of target = best match at bottom\n        this.element_.insertBefore(row, curRow);\n      } else {\n        this.dom_.appendChild(this.element_, row);\n      }\n      curRow = row;\n    }, this);\n  }\n\n  // Don't show empty result sets\n  if (this.rows_.length == 0) {\n    this.dismiss();\n    return;\n  } else {\n    this.show();\n  }\n\n  this.reposition();\n\n  // Make the autocompleter unselectable, so that it\n  // doesn't steal focus from the input field when clicked.\n  goog.style.setUnselectable(this.element_, true);\n};\n\n\n/**\n * @return {goog.positioning.Corner} The anchor corner to position the popup at.\n * @protected\n */\ngoog.ui.ac.Renderer.prototype.getAnchorCorner = function() {\n  var anchorCorner = this.rightAlign_ ? goog.positioning.Corner.BOTTOM_RIGHT :\n                                        goog.positioning.Corner.BOTTOM_LEFT;\n  if (this.topAlign_) {\n    anchorCorner = goog.positioning.flipCornerVertical(anchorCorner);\n  }\n  return anchorCorner;\n};\n\n\n/**\n * Repositions the auto complete popup relative to the location node, if it\n * exists and the auto position has been set.\n */\ngoog.ui.ac.Renderer.prototype.reposition = function() {\n  if (this.target_ && this.reposition_) {\n    var anchorElement = this.anchorElement_ || this.target_;\n    var anchorCorner = this.getAnchorCorner();\n\n    var overflowMode = goog.positioning.Overflow.ADJUST_X_EXCEPT_OFFSCREEN;\n    if (this.showScrollbarsIfTooLarge_) {\n      // positionAtAnchor will set the height of this.element_ when it runs\n      // (because of RESIZE_HEIGHT), and it will never increase it relative to\n      // its current value when it runs again. But if the user scrolls their\n      // page, then we might actually want a bigger height when the dropdown is\n      // displayed next time. So we clear the height before calling\n      // positionAtAnchor, so it is free to set the height as large as it\n      // chooses.\n      this.element_.style.height = '';\n      overflowMode |= goog.positioning.Overflow.RESIZE_HEIGHT;\n    }\n\n    goog.positioning.positionAtAnchor(\n        anchorElement, anchorCorner, this.element_,\n        goog.positioning.flipCornerVertical(anchorCorner), null, null,\n        overflowMode);\n\n    if (this.topAlign_) {\n      // This flickers, but is better than the alternative of positioning\n      // in the wrong place and then moving.\n      this.element_.style.visibility = 'visible';\n    }\n  }\n};\n\n\n/**\n * Sets whether the renderer should try to determine where to position the\n * drop down.\n * @param {boolean} auto Whether to autoposition the drop down.\n */\ngoog.ui.ac.Renderer.prototype.setAutoPosition = function(auto) {\n  this.reposition_ = auto;\n};\n\n\n/**\n * @return {boolean} Whether the drop down will be autopositioned.\n * @protected\n */\ngoog.ui.ac.Renderer.prototype.getAutoPosition = function() {\n  return this.reposition_;\n};\n\n\n/**\n * @return {Element} The target element.\n * @protected\n */\ngoog.ui.ac.Renderer.prototype.getTarget = function() {\n  return this.target_ || null;\n};\n\n\n/**\n * Disposes of the renderer and its associated HTML.\n * @override\n * @protected\n */\ngoog.ui.ac.Renderer.prototype.disposeInternal = function() {\n  if (this.element_) {\n    goog.events.unlisten(\n        this.element_, goog.events.EventType.CLICK, this.handleClick_, false,\n        this);\n    goog.events.unlisten(\n        this.element_, goog.events.EventType.MOUSEDOWN, this.handleMouseDown_,\n        false, this);\n    goog.events.unlisten(\n        this.element_, goog.events.EventType.MOUSEOVER, this.handleMouseOver_,\n        false, this);\n    this.dom_.removeNode(this.element_);\n    this.element_ = null;\n    this.visible_ = false;\n  }\n\n  goog.dispose(this.animation_);\n  this.parent_ = null;\n\n  goog.ui.ac.Renderer.base(this, 'disposeInternal');\n};\n\n\n/**\n * Generic function that takes a row and renders a DOM structure for that row.\n *\n * Normally this will only be matching a maximum of 20 or so items.  Even with\n * 40 rows, DOM this building is fine.\n * @param {Object} row Object representing row.\n * @param {string} token Token to highlight.\n * @param {Node} node The node to render into.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.ac.Renderer.prototype.renderRowContents_ = function(row, token, node) {\n  goog.dom.setTextContent(node, row.data.toString());\n};\n\n\n/**\n * Goes through a node and all of its child nodes, replacing HTML text that\n * matches a token with <b>token</b>.\n * The replacement will happen on the first match or all matches depending on\n * this.highlightAllTokens_ value.\n *\n * @param {Node} node Node to match.\n * @param {string|Array<string>} tokenOrArray Token to match or array of tokens\n *     to match.  By default, only the first match will be highlighted.  If\n *     highlightAllTokens is set, then all tokens appearing at the start of a\n *     word, in whatever order and however many times, will be highlighted.\n * @private\n */\ngoog.ui.ac.Renderer.prototype.startHiliteMatchingText_ = function(\n    node, tokenOrArray) {\n  this.wasHighlightedAtLeastOnce_ = false;\n  this.hiliteMatchingText_(node, tokenOrArray);\n};\n\n\n/**\n * @param {Node} node Node to match.\n * @param {string|Array<string>} tokenOrArray Token to match or array of tokens\n *     to match.\n * @private\n */\ngoog.ui.ac.Renderer.prototype.hiliteMatchingText_ = function(\n    node, tokenOrArray) {\n  if (!this.highlightAllTokens_ && this.wasHighlightedAtLeastOnce_) {\n    return;\n  }\n\n  if (node.nodeType == goog.dom.NodeType.TEXT) {\n    var rest = null;\n    if (goog.isArray(tokenOrArray) && tokenOrArray.length > 1 &&\n        !this.highlightAllTokens_) {\n      rest = goog.array.slice(tokenOrArray, 1);\n    }\n\n    var token = this.getTokenRegExp_(tokenOrArray);\n    if (token.length == 0) return;\n\n    var text = node.nodeValue;\n\n    // Create a regular expression to match a token at the beginning of a line\n    // or preceded by non-alpha-numeric characters. Note: token could have |\n    // operators in it, so we need to parenthesise it before adding \\b to it.\n    // or preceded by non-alpha-numeric characters\n    //\n    // NOTE(user): When using word matches, this used to have\n    // a (^|\\\\W+) clause where it now has \\\\b but it caused various\n    // browsers to hang on really long strings. The (^|\\\\W+) matcher was also\n    // unnecessary, because \\b already checks that the character before the\n    // is a non-word character, and ^ matches the start of the line or following\n    // a line terminator character, which is also \\W. The regexp also used to\n    // have a capturing match before the \\\\b, which would capture the\n    // non-highlighted content, but that caused the regexp matching to run much\n    // slower than the current version.\n    var re = this.matchWordBoundary_ ?\n        new RegExp('\\\\b(?:' + token + ')', 'gi') :\n        new RegExp(token, 'gi');\n    var textNodes = [];\n    var lastIndex = 0;\n\n    // Find all matches\n    // Note: text.split(re) has inconsistencies between IE and FF, so\n    // manually recreated the logic\n    var match = re.exec(text);\n    var numMatches = 0;\n    while (match) {\n      numMatches++;\n      textNodes.push(text.substring(lastIndex, match.index));\n      textNodes.push(text.substring(match.index, re.lastIndex));\n      lastIndex = re.lastIndex;\n      match = re.exec(text);\n    }\n    textNodes.push(text.substring(lastIndex));\n\n    // Replace the tokens with bolded text.  Each pair of textNodes\n    // (starting at index idx) includes a node of text before the bolded\n    // token, and a node (at idx + 1) consisting of what should be\n    // enclosed in bold tags.\n    if (textNodes.length > 1) {\n      var maxNumToBold = !this.highlightAllTokens_ ? 1 : numMatches;\n      for (var i = 0; i < maxNumToBold; i++) {\n        var idx = 2 * i;\n\n        node.nodeValue = textNodes[idx];\n        var boldTag = this.dom_.createElement(goog.dom.TagName.B);\n        boldTag.className = this.highlightedClassName;\n        this.dom_.appendChild(\n            boldTag, this.dom_.createTextNode(textNodes[idx + 1]));\n        boldTag = node.parentNode.insertBefore(boldTag, node.nextSibling);\n        node.parentNode.insertBefore(\n            this.dom_.createTextNode(''), boldTag.nextSibling);\n        node = boldTag.nextSibling;\n      }\n\n      // Append the remaining text nodes to the end.\n      var remainingTextNodes = goog.array.slice(textNodes, maxNumToBold * 2);\n      node.nodeValue = remainingTextNodes.join('');\n\n      this.wasHighlightedAtLeastOnce_ = true;\n    } else if (rest) {\n      this.hiliteMatchingText_(node, rest);\n    }\n  } else {\n    var child = node.firstChild;\n    while (child) {\n      var nextChild = child.nextSibling;\n      this.hiliteMatchingText_(child, tokenOrArray);\n      child = nextChild;\n    }\n  }\n};\n\n\n/**\n * Transforms a token into a string ready to be put into the regular expression\n * in hiliteMatchingText_.\n * @param {string|Array<string>} tokenOrArray The token or array to get the\n *     regex string from.\n * @return {string} The regex-ready token.\n * @private\n */\ngoog.ui.ac.Renderer.prototype.getTokenRegExp_ = function(tokenOrArray) {\n  var token = '';\n\n  if (!tokenOrArray) {\n    return token;\n  }\n\n  if (goog.isArray(tokenOrArray)) {\n    // Remove invalid tokens from the array, which may leave us with nothing.\n    tokenOrArray = goog.array.filter(tokenOrArray, function(str) {\n      return !goog.string.isEmptyOrWhitespace(goog.string.makeSafe(str));\n    });\n  }\n\n  // If highlighting all tokens, join them with '|' so the regular expression\n  // will match on any of them.\n  if (this.highlightAllTokens_) {\n    if (goog.isArray(tokenOrArray)) {\n      var tokenArray = goog.array.map(tokenOrArray, goog.string.regExpEscape);\n      token = tokenArray.join('|');\n    } else {\n      // Remove excess whitespace from the string so bars will separate valid\n      // tokens in the regular expression.\n      token = goog.string.collapseWhitespace(tokenOrArray);\n\n      token = goog.string.regExpEscape(token);\n      token = token.replace(/ /g, '|');\n    }\n  } else {\n    // Not highlighting all matching tokens.  If tokenOrArray is a string, use\n    // that as the token.  If it is an array, use the first element in the\n    // array.\n    // TODO(user): why is this this way?. We should match against all\n    // tokens in the array, but only accept the first match.\n    if (goog.isArray(tokenOrArray)) {\n      token = tokenOrArray.length > 0 ?\n          goog.string.regExpEscape(tokenOrArray[0]) :\n          '';\n    } else {\n      // For the single-match string token, we refuse to match anything if\n      // the string begins with a non-word character, as matches by definition\n      // can only occur at the start of a word. (This also handles the\n      // goog.string.isEmptyOrWhitespace(goog.string.makeSafe(tokenOrArray))\n      // case.)\n      if (!/^\\W/.test(tokenOrArray)) {\n        token = goog.string.regExpEscape(tokenOrArray);\n      }\n    }\n  }\n\n  return token;\n};\n\n\n/**\n * Render a row by creating a div and then calling row rendering callback or\n * default row handler\n *\n * @param {Object} row Object representing row.\n * @param {string} token Token to highlight.\n * @return {!Element} An element with the rendered HTML.\n */\ngoog.ui.ac.Renderer.prototype.renderRowHtml = function(row, token) {\n  // Create and return the element.\n  var elem = this.dom_.createDom(goog.dom.TagName.DIV, {\n    className: this.rowClassName,\n    id: goog.ui.IdGenerator.getInstance().getNextUniqueId()\n  });\n  goog.a11y.aria.setRole(elem, goog.a11y.aria.Role.OPTION);\n  if (this.customRenderer_ && this.customRenderer_.renderRow) {\n    this.customRenderer_.renderRow(row, token, elem);\n  } else {\n    this.renderRowContents_(row, token, elem);\n  }\n\n  if (token && this.useStandardHighlighting_) {\n    this.startHiliteMatchingText_(elem, token);\n  }\n\n  goog.dom.classlist.add(elem, this.rowClassName);\n  this.rowDivs_.push(elem);\n  return elem;\n};\n\n\n/**\n * Given an event target looks up through the parents till it finds a div.  Once\n * found it will then look to see if that is one of the childnodes, if it is\n * then the index is returned, otherwise -1 is returned.\n * @param {Element} et HtmlElement.\n * @return {number} Index corresponding to event target.\n * @private\n */\ngoog.ui.ac.Renderer.prototype.getRowFromEventTarget_ = function(et) {\n  while (et && et != this.element_ &&\n         !goog.dom.classlist.contains(et, this.rowClassName)) {\n    et = /** @type {Element} */ (et.parentNode);\n  }\n  return et ? goog.array.indexOf(this.rowDivs_, et) : -1;\n};\n\n\n/**\n * Handle the click events.  These are redirected to the AutoComplete object\n * which then makes a callback to select the correct row.\n * @param {goog.events.Event} e Browser event object.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.ac.Renderer.prototype.handleClick_ = function(e) {\n  var index = this.getRowFromEventTarget_(/** @type {Element} */ (e.target));\n  if (index >= 0) {\n    this.dispatchEvent(/** @lends {goog.events.Event.prototype} */ ({\n      type: goog.ui.ac.AutoComplete.EventType.SELECT,\n      row: this.rows_[index].id\n    }));\n  }\n  e.stopPropagation();\n};\n\n\n/**\n * Handle the mousedown event and prevent the AC from losing focus.\n * @param {goog.events.Event} e Browser event object.\n * @private\n */\ngoog.ui.ac.Renderer.prototype.handleMouseDown_ = function(e) {\n  e.stopPropagation();\n  e.preventDefault();\n};\n\n\n/**\n * Handle the mousing events.  These are redirected to the AutoComplete object\n * which then makes a callback to set the correctly highlighted row.  This is\n * because the AutoComplete can move the focus as well, and there is no sense\n * duplicating the code\n * @param {goog.events.Event} e Browser event object.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.ac.Renderer.prototype.handleMouseOver_ = function(e) {\n  var index = this.getRowFromEventTarget_(/** @type {Element} */ (e.target));\n  if (index >= 0) {\n    if ((goog.now() - this.startRenderingRows_) <\n        goog.ui.ac.Renderer.DELAY_BEFORE_MOUSEOVER) {\n      return;\n    }\n\n    this.dispatchEvent({\n      type: goog.ui.ac.AutoComplete.EventType.HILITE,\n      row: this.rows_[index].id\n    });\n  }\n};\n\n\n\n/**\n * Class allowing different implementations to custom render the autocomplete.\n * Extending classes should override the render function.\n * @constructor\n */\ngoog.ui.ac.Renderer.CustomRenderer = function() {};\n\n\n/**\n * Renders the autocomplete box. May be set to null.\n *\n * Because of the type, this function cannot be documented with param JSDoc.\n *\n * The function expects the following parameters:\n *\n * renderer, goog.ui.ac.Renderer: The autocomplete renderer.\n * element, Element: The main element that controls the rendered autocomplete.\n * rows, Array: The current set of rows being displayed.\n * token, string: The current token that has been entered. *\n *\n * @type {function(goog.ui.ac.Renderer, Element, Array, string)|\n *        null|undefined}\n */\ngoog.ui.ac.Renderer.CustomRenderer.prototype.render = function(\n    renderer, element, rows, token) {};\n\n\n/**\n * Generic function that takes a row and renders a DOM structure for that row.\n * @param {Object} row Object representing row.\n * @param {string} token Token to highlight.\n * @param {Node} node The node to render into.\n */\ngoog.ui.ac.Renderer.CustomRenderer.prototype.renderRow = function(\n    row, token, node) {};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^A;","^;;","^:G","^:;","^=B","^?H","^9L","^A4","^;G","^9>","^:L","^:I","^A5","^?M","^<3","^VX","^GA","~$goog.dispose","^GB","^;9","^:N","^;="]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/ac/renderer.js"],"^:1",["^9K",["~$goog.ui.ac.Renderer","~$goog.ui.ac.Renderer.CustomRenderer"]],"^9<",true,"^9=",["^9>","^?H","^;G","^?M","^;9","^:E","^W;","^;;","^=B","^;=","^:;","^:N","^:L","^:I","^GB","^GA","^A4","^:G","^A5","^9L","^<3","^VX","^A;"]],["^ ","^9A",[1579837703000],"^9B","goog.reflect.reflect.js","^9C",["^9D","goog/reflect/reflect.js"],"^9E","goog/reflect/reflect.js","^9F","^9G","^9H","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Useful compiler idioms.\n *\n * @author johnlenz@google.com (John Lenz)\n */\n\ngoog.provide('goog.reflect');\n\n\n/**\n * Syntax for object literal casts.\n * @see http://go/jscompiler-renaming\n * @see https://goo.gl/CRs09P\n *\n * Use this if you have an object literal whose keys need to have the same names\n * as the properties of some class even after they are renamed by the compiler.\n *\n * @param {!Function} type Type to cast to.\n * @param {Object} object Object literal to cast.\n * @return {Object} The object literal.\n */\ngoog.reflect.object = function(type, object) {\n  return object;\n};\n\n/**\n * Syntax for renaming property strings.\n * @see http://go/jscompiler-renaming\n * @see https://goo.gl/CRs09P\n *\n * Use this if you have an need to access a property as a string, but want\n * to also have the property renamed by the compiler. In contrast to\n * goog.reflect.object, this method takes an instance of an object.\n *\n * Properties must be simple names (not qualified names).\n *\n * @param {string} prop Name of the property\n * @param {!Object} object Instance of the object whose type will be used\n *     for renaming\n * @return {string} The renamed property.\n */\ngoog.reflect.objectProperty = function(prop, object) {\n  return prop;\n};\n\n/**\n * To assert to the compiler that an operation is needed when it would\n * otherwise be stripped. For example:\n * <code>\n *     // Force a layout\n *     goog.reflect.sinkValue(dialog.offsetHeight);\n * </code>\n * @param {T} x\n * @return {T}\n * @template T\n */\ngoog.reflect.sinkValue = function(x) {\n  goog.reflect.sinkValue[' '](x);\n  return x;\n};\n\n\n/**\n * The compiler should optimize this function away iff no one ever uses\n * goog.reflect.sinkValue.\n */\ngoog.reflect.sinkValue[' '] = goog.nullFunction;\n\n\n/**\n * Check if a property can be accessed without throwing an exception.\n * @param {Object} obj The owner of the property.\n * @param {string} prop The property name.\n * @return {boolean} Whether the property is accessible. Will also return true\n *     if obj is null.\n */\ngoog.reflect.canAccessProperty = function(obj, prop) {\n\n  try {\n    goog.reflect.sinkValue(obj[prop]);\n    return true;\n  } catch (e) {\n  }\n  return false;\n};\n\n\n/**\n * Retrieves a value from a cache given a key. The compiler provides special\n * consideration for this call such that it is generally considered side-effect\n * free. However, if the `opt_keyFn` or `valueFn` have side-effects\n * then the entire call is considered to have side-effects.\n *\n * Conventionally storing the value on the cache would be considered a\n * side-effect and preclude unused calls from being pruned, ie. even if\n * the value was never used, it would still always be stored in the cache.\n *\n * Providing a side-effect free `valueFn` and `opt_keyFn`\n * allows unused calls to `goog.reflect.cache` to be pruned.\n *\n * @param {!Object<K, V>} cacheObj The object that contains the cached values.\n * @param {?} key The key to lookup in the cache. If it is not string or number\n *     then a `opt_keyFn` should be provided. The key is also used as the\n *     parameter to the `valueFn`.\n * @param {function(?):V} valueFn The value provider to use to calculate the\n *     value to store in the cache. This function should be side-effect free\n *     to take advantage of the optimization.\n * @param {function(?):K=} opt_keyFn The key provider to determine the cache\n *     map key. This should be used if the given key is not a string or number.\n *     If not provided then the given key is used. This function should be\n *     side-effect free to take advantage of the optimization.\n * @return {V} The cached or calculated value.\n * @template K\n * @template V\n */\ngoog.reflect.cache = function(cacheObj, key, valueFn, opt_keyFn) {\n  const storedKey = opt_keyFn ? opt_keyFn(key) : key;\n\n  if (Object.prototype.hasOwnProperty.call(cacheObj, storedKey)) {\n    return cacheObj[storedKey];\n  }\n\n  return (cacheObj[storedKey] = valueFn(key));\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/reflect/reflect.js"],"^:1",["^9K",["^;E"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.fx.draglistgroup.js","^9C",["^9D","goog/fx/draglistgroup.js"],"^9E","goog/fx/draglistgroup.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A DragListGroup is a class representing a group of one or more\n * \"drag lists\" with items that can be dragged within them and between them.\n *\n * @see ../demos/draglistgroup.html\n */\n\n\ngoog.provide('goog.fx.DragListDirection');\ngoog.provide('goog.fx.DragListGroup');\ngoog.provide('goog.fx.DragListGroup.EventType');\ngoog.provide('goog.fx.DragListGroupEvent');\ngoog.provide('goog.fx.DragListPermission');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventId');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.fx.Dragger');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.string');\ngoog.require('goog.style');\n\n\n\n/**\n * A class representing a group of one or more \"drag lists\" with items that can\n * be dragged within them and between them.\n *\n * Example usage:\n *   var dragListGroup = new goog.fx.DragListGroup();\n *   dragListGroup.setDragItemHandleHoverClass(className1, className2);\n *   dragListGroup.setDraggerElClass(className3);\n *   dragListGroup.addDragList(vertList, goog.fx.DragListDirection.DOWN);\n *   dragListGroup.addDragList(horizList, goog.fx.DragListDirection.RIGHT);\n *   dragListGroup.init();\n *\n * @extends {goog.events.EventTarget}\n * @constructor\n * @struct\n */\ngoog.fx.DragListGroup = function() {\n  goog.fx.DragListGroup.base(this, 'constructor');\n\n  /**\n   * The user-supplied CSS classes to add to a drag item on hover (not during a\n   * drag action).\n   * @private {Array|undefined}\n   */\n  this.dragItemHoverClasses_;\n\n  /**\n   * The user-supplied CSS classes to add to a drag item handle on hover (not\n   * during a drag action).\n   * @private {Array|undefined}\n   */\n  this.dragItemHandleHoverClasses_;\n\n  /**\n   * The user-supplied CSS classes to add to the current drag item (during a\n   * drag action).\n   * @private {Array|undefined}\n   */\n  this.currDragItemClasses_;\n\n  /**\n   * The user-supplied CSS classes to add to the clone of the current drag item\n   * that's actually being dragged around (during a drag action).\n   * @private {Array<string>|undefined}\n   */\n  this.draggerElClasses_;\n\n  /**\n   * The current drag item being moved.\n   * Note: This is only defined while a drag action is happening.\n   * @private {Element}\n   */\n  this.currDragItem_;\n\n  /**\n   * The drag list that `this.currDragItem_` is currently hovering over,\n   * or null if it is not hovering over a list.\n   * @private {Element}\n   */\n  this.currHoverList_;\n\n  /**\n   * The original drag list that the current drag item came from. We need to\n   * remember this in case the user drops the item outside of any lists, in\n   * which case we return the item to its original location.\n   * Note: This is only defined while a drag action is happening.\n   * @private {Element}\n   */\n  this.origList_;\n\n  /**\n   * The original next item in the original list that the current drag item came\n   * from. We need to remember this in case the user drops the item outside of\n   * any lists, in which case we return the item to its original location.\n   * Note: This is only defined while a drag action is happening.\n   * @private {Element}\n   */\n  this.origNextItem_;\n\n  /**\n   * The current item in the list we are hovering over. We need to remember\n   * this in case we do not update the position of the current drag item while\n   * dragging (see `updateWhileDragging_`). In this case the current drag\n   * item will be inserted into the list before this element when the drag ends.\n   * @private {Element}\n   */\n  this.currHoverItem_;\n\n  /**\n   * The clone of the current drag item that's actually being dragged around.\n   * Note: This is only defined while a drag action is happening.\n   * @private {HTMLElement}\n   */\n  this.draggerEl_;\n\n  /**\n   * The dragger object.\n   * Note: This is only defined while a drag action is happening.\n   * @private {goog.fx.Dragger}\n   */\n  this.dragger_;\n\n  /**\n   * The amount of distance, in pixels, after which a mousedown or touchstart is\n   * considered a drag.\n   * @private {number}\n   */\n  this.hysteresisDistance_ = 0;\n\n\n  /**\n   * The drag lists.\n   * @private {Array<Element>}\n   */\n  this.dragLists_ = [];\n\n  /**\n   * All the drag items. Set by init().\n   * @private {Array<Element>}\n   */\n  this.dragItems_ = [];\n\n  /**\n   * Which drag item corresponds to a given handle.  Set by init().\n   * Specifically, this maps from the unique ID (as given by goog.getUid)\n   * of the handle to the drag item.\n   * @private {Object}\n   */\n  this.dragItemForHandle_ = {};\n\n  /**\n   * The event handler for this instance.\n   * @private {goog.events.EventHandler<!goog.fx.DragListGroup>}\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  /**\n   * Whether the setup has been done to make all items in all lists draggable.\n   * @private {boolean}\n   */\n  this.isInitialized_ = false;\n\n  /**\n   * Whether the currDragItem is always displayed. By default the list\n   * collapses, the currDragItem's display is set to none, when we do not\n   * hover over a draglist.\n   * @private {boolean}\n   */\n  this.isCurrDragItemAlwaysDisplayed_ = false;\n\n  /**\n   * Whether to update the position of the currDragItem as we drag, i.e.,\n   * insert the currDragItem each time to the position where it would land if\n   * we were to end the drag at that point. Defaults to true.\n   * @private {boolean}\n   */\n  this.updateWhileDragging_ = true;\n};\ngoog.inherits(goog.fx.DragListGroup, goog.events.EventTarget);\n\n\n/**\n * Enum to indicate the direction that a drag list grows.\n * @enum {number}\n */\ngoog.fx.DragListDirection = {\n  DOWN: 0,      // common\n  RIGHT: 2,     // common\n  LEFT: 3,      // uncommon (except perhaps for right-to-left interfaces)\n  RIGHT_2D: 4,  // common + handles multiple lines if items are wrapped\n  LEFT_2D: 5    // for rtl languages\n};\n\n\n/**\n * Enum to indicate the drag and drop permissions for a drag list. Default is\n * DRAG_OUT_AND_DROP.\n * @enum {number}\n */\ngoog.fx.DragListPermission = {\n  DRAG_OUT_AND_DROP: 0,  // default\n  ONLY_DRAG_OUT: 1,      // Prevents an item from being dropped into this drag\n                         // list.\n  ONLY_DROP: 2           // Prevents an item from being removed from this drag\n                         // list, but items can be dropped here.\n};\n\n\n/**\n * Events dispatched by this class.\n * @enum {!goog.events.EventId<!goog.fx.DragListGroupEvent>}\n */\ngoog.fx.DragListGroup.EventType = {\n  /**\n   * Raised on mouse down, when the dragger is first created.  Handle this event\n   * to customize the dragger element even if the drag never actually starts (if\n   * the mouse never moves beyond hysteresis).\n   */\n  DRAGGERCREATED:\n      new goog.events.EventId(goog.events.getUniqueId('draggercreated')),\n  BEFOREDRAGSTART: new goog.events.EventId('beforedragstart'),\n  DRAGSTART: new goog.events.EventId('dragstart'),\n  BEFOREDRAGMOVE: new goog.events.EventId('beforedragmove'),\n  DRAGMOVE: new goog.events.EventId('dragmove'),\n  BEFOREDRAGEND: new goog.events.EventId('beforedragend'),\n  /** Raised after the dragged item is moved to the new spot. */\n  DRAGEND: new goog.events.EventId('dragend'),\n  /**\n   * Raised whenever the dragger element is removed:\n   *  - When a drag completes successfully.\n   *  - If the drag never started due to mouseup within hysteresis.\n   *  - If the drag was cancelled by a BEFORE* event.\n   *  - If the drag was cancelled due to focus loss.\n   */\n  DRAGGERREMOVED:\n      new goog.events.EventId(goog.events.getUniqueId('draggerremoved'))\n};\n\n\n/**\n * Sets the property of the currDragItem that it is always displayed in the\n * list.\n */\ngoog.fx.DragListGroup.prototype.setIsCurrDragItemAlwaysDisplayed = function() {\n  this.isCurrDragItemAlwaysDisplayed_ = true;\n};\n\n\n/**\n * Sets the private property updateWhileDragging_ to false. This disables the\n * update of the position of the currDragItem while dragging. It will only be\n * placed to its new location once the drag ends.\n */\ngoog.fx.DragListGroup.prototype.setNoUpdateWhileDragging = function() {\n  this.updateWhileDragging_ = false;\n};\n\n\n/**\n * Sets the distance the user has to drag the element before a drag operation\n * is started.\n * @param {number} distance The number of pixels after which a mousedown and\n *     move is considered a drag.\n */\ngoog.fx.DragListGroup.prototype.setHysteresis = function(distance) {\n  this.hysteresisDistance_ = distance;\n};\n\n\n/**\n * @return {number} distance The number of pixels after which a mousedown and\n *     move is considered a drag.\n */\ngoog.fx.DragListGroup.prototype.getHysteresis = function() {\n  return this.hysteresisDistance_;\n};\n\n\n/** @return {boolean} true if the user is currently dragging an element. */\ngoog.fx.DragListGroup.prototype.isDragging = function() {\n  return !!this.dragger_;\n};\n\n\n/**\n * Adds a drag list to this DragListGroup.\n * All calls to this method must happen before the call to init().\n * Remember that all child nodes (except text nodes) will be made draggable to\n * any other drag list in this group.\n *\n * @param {Element} dragListElement Must be a container for a list of items\n *     that should all be made draggable.\n * @param {goog.fx.DragListDirection} growthDirection The direction that this\n *     drag list grows in (i.e. if an item is appended to the DOM, the list's\n *     bounding box expands in this direction).\n * @param {boolean=} opt_unused Unused argument.\n * @param {string=} opt_dragHoverClass CSS class to apply to this drag list when\n *     the draggerEl hovers over it during a drag action.  If present, must be a\n *     single, valid classname (not a string of space-separated classnames).\n * @param {!goog.fx.DragListPermission=} opt_dragListPermission Defaults\n *     to DRAG_OUT_AND_DROP but can be passed in to modify to prevent users from\n *     dragging an item out of a list or dropping an item into a list.\n */\ngoog.fx.DragListGroup.prototype.addDragList = function(\n    dragListElement, growthDirection, opt_unused, opt_dragHoverClass,\n    opt_dragListPermission) {\n  goog.asserts.assert(!this.isInitialized_);\n\n  dragListElement.dlgGrowthDirection_ = growthDirection;\n  dragListElement.dlgDragHoverClass_ = opt_dragHoverClass;\n  dragListElement.dlgDragPermission =\n      opt_dragListPermission || goog.fx.DragListPermission.DRAG_OUT_AND_DROP;\n  this.dragLists_.push(dragListElement);\n};\n\n\n/**\n * Sets a user-supplied function used to get the \"handle\" element for a drag\n * item. The function must accept exactly one argument. The argument may be\n * any drag item element.\n *\n * If not set, the default implementation uses the whole drag item as the\n * handle.\n *\n * @param {function(!Element): Element} getHandleForDragItemFn A function that,\n *     given any drag item, returns a reference to its \"handle\" element\n *     (which may be the drag item element itself).\n */\ngoog.fx.DragListGroup.prototype.setFunctionToGetHandleForDragItem = function(\n    getHandleForDragItemFn) {\n  goog.asserts.assert(!this.isInitialized_);\n  this.getHandleForDragItem_ = getHandleForDragItemFn;\n};\n\n\n/**\n * Sets a user-supplied CSS class to add to a drag item on hover (not during a\n * drag action).\n * @param {...string} var_args The CSS class or classes.\n */\ngoog.fx.DragListGroup.prototype.setDragItemHoverClass = function(var_args) {\n  goog.asserts.assert(!this.isInitialized_);\n  this.dragItemHoverClasses_ = goog.array.slice(arguments, 0);\n};\n\n\n/**\n * Sets a user-supplied CSS class to add to a drag item handle on hover (not\n * during a drag action).\n * @param {...string} var_args The CSS class or classes.\n */\ngoog.fx.DragListGroup.prototype.setDragItemHandleHoverClass = function(\n    var_args) {\n  goog.asserts.assert(!this.isInitialized_);\n  this.dragItemHandleHoverClasses_ = goog.array.slice(arguments, 0);\n};\n\n\n/**\n * Sets a user-supplied CSS class to add to the current drag item (during a\n * drag action).\n *\n * If not set, the default behavior adds visibility:hidden to the current drag\n * item so that it is a block of empty space in the hover drag list (if any).\n * If this class is set by the user, then the default behavior does not happen\n * (unless, of course, the class also contains visibility:hidden).\n *\n * @param {...string} var_args The CSS class or classes.\n */\ngoog.fx.DragListGroup.prototype.setCurrDragItemClass = function(var_args) {\n  goog.asserts.assert(!this.isInitialized_);\n  this.currDragItemClasses_ = goog.array.slice(arguments, 0);\n};\n\n\n/**\n * Sets a user-supplied CSS class to add to the clone of the current drag item\n * that's actually being dragged around (during a drag action).\n * @param {string} draggerElClass The CSS class.\n */\ngoog.fx.DragListGroup.prototype.setDraggerElClass = function(draggerElClass) {\n  goog.asserts.assert(!this.isInitialized_);\n  // Split space-separated classes up into an array.\n  this.draggerElClasses_ = goog.string.trim(draggerElClass).split(' ');\n};\n\n\n/**\n * Performs the initial setup to make all items in all lists draggable.\n */\ngoog.fx.DragListGroup.prototype.init = function() {\n  if (this.isInitialized_) {\n    return;\n  }\n\n  for (var i = 0, numLists = this.dragLists_.length; i < numLists; i++) {\n    var dragList = this.dragLists_[i];\n\n    var dragItems = goog.dom.getChildren(dragList);\n    for (var j = 0, numItems = dragItems.length; j < numItems; ++j) {\n      this.listenForDragEvents(dragItems[j]);\n    }\n  }\n\n  this.isInitialized_ = true;\n};\n\n\n/**\n * Adds a single item to the given drag list and sets up the drag listeners for\n * it.\n * If opt_index is specified the item is inserted at this index, otherwise the\n * item is added as the last child of the list.\n *\n * @param {!Element} list The drag list where to add item to.\n * @param {!Element} item The new element to add.\n * @param {number=} opt_index Index where to insert the item in the list. If not\n * specified item is inserted as the last child of list.\n */\ngoog.fx.DragListGroup.prototype.addItemToDragList = function(\n    list, item, opt_index) {\n  if (opt_index !== undefined) {\n    goog.dom.insertChildAt(list, item, opt_index);\n  } else {\n    goog.dom.appendChild(list, item);\n  }\n  this.listenForDragEvents(item);\n};\n\n\n/** @override */\ngoog.fx.DragListGroup.prototype.disposeInternal = function() {\n  this.eventHandler_.dispose();\n\n  for (var i = 0, n = this.dragLists_.length; i < n; i++) {\n    var dragList = this.dragLists_[i];\n    // Note: IE doesn't allow 'delete' for fields on HTML elements (because\n    // they're not real JS objects in IE), so we just set them to undefined.\n    dragList.dlgGrowthDirection_ = undefined;\n    dragList.dlgDragHoverClass_ = undefined;\n  }\n\n  this.dragLists_.length = 0;\n  this.dragItems_.length = 0;\n  this.dragItemForHandle_ = null;\n\n  // In the case where a drag event is currently in-progress and dispose is\n  // called, this cleans up the extra state.\n  this.cleanupDragDom_();\n\n  goog.fx.DragListGroup.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * Caches the heights of each drag list and drag item, except for the current\n * drag item.\n *\n */\ngoog.fx.DragListGroup.prototype.recacheListAndItemBounds = function() {\n  this.recacheListAndItemBounds_(this.currDragItem_);\n};\n\n\n/**\n * Caches the heights of each drag list and drag item, except for the current\n * drag item.\n *\n * @param {Element} currDragItem The item currently being dragged.\n * @private\n */\ngoog.fx.DragListGroup.prototype.recacheListAndItemBounds_ = function(\n    currDragItem) {\n  for (var i = 0, n = this.dragLists_.length; i < n; i++) {\n    var dragList = this.dragLists_[i];\n    dragList.dlgBounds_ = goog.style.getBounds(dragList);\n  }\n\n  for (var i = 0, n = this.dragItems_.length; i < n; i++) {\n    var dragItem = this.dragItems_[i];\n    if (dragItem != currDragItem) {\n      dragItem.dlgBounds_ = goog.style.getBounds(dragItem);\n    }\n  }\n};\n\n\n/**\n * Listens for drag events on the given drag item. This method is currently used\n * to initialize drag items.\n *\n * @param {!Element} dragItem the element to initialize. This element has to be\n * in one of the drag lists.\n * @protected\n */\ngoog.fx.DragListGroup.prototype.listenForDragEvents = function(dragItem) {\n  var dragItemHandle = this.getHandleForDragItem_(dragItem);\n  var uid = goog.getUid(dragItemHandle);\n  this.dragItemForHandle_[uid] = dragItem;\n\n  if (this.dragItemHoverClasses_) {\n    this.eventHandler_.listen(\n        dragItem, goog.events.EventType.MOUSEOVER,\n        this.handleDragItemMouseover_);\n    this.eventHandler_.listen(\n        dragItem, goog.events.EventType.MOUSEOUT, this.handleDragItemMouseout_);\n  }\n  if (this.dragItemHandleHoverClasses_) {\n    this.eventHandler_.listen(\n        dragItemHandle, goog.events.EventType.MOUSEOVER,\n        this.handleDragItemHandleMouseover_);\n    this.eventHandler_.listen(\n        dragItemHandle, goog.events.EventType.MOUSEOUT,\n        this.handleDragItemHandleMouseout_);\n  }\n\n  this.dragItems_.push(dragItem);\n\n  this.eventHandler_.listen(\n      dragItemHandle,\n      [goog.events.EventType.MOUSEDOWN, goog.events.EventType.TOUCHSTART],\n      this.handlePotentialDragStart_);\n};\n\n\n/**\n * Handles mouse and touch events which may start a drag action.\n * @param {!goog.events.BrowserEvent} e MOUSEDOWN or TOUCHSTART event.\n * @private\n */\ngoog.fx.DragListGroup.prototype.handlePotentialDragStart_ = function(e) {\n  var uid = goog.getUid(/** @type {Node} */ (e.currentTarget));\n  var potentialDragItem =\n      /** @type {!Element} */ (this.dragItemForHandle_[uid]);\n\n  if (potentialDragItem.parentElement.dlgDragPermission ==\n      goog.fx.DragListPermission.ONLY_DROP) {\n    return;\n  }\n\n  this.currDragItem_ = potentialDragItem;\n\n  this.draggerEl_ = /** @type {!HTMLElement} */ (\n      this.createDragElementInternal(this.currDragItem_));\n  if (this.draggerElClasses_) {\n    // Add CSS class for the clone, if any.\n    goog.dom.classlist.addAll(\n        goog.asserts.assert(this.draggerEl_), this.draggerElClasses_ || []);\n  }\n\n  // Place the clone (i.e. draggerEl) at the same position as the actual\n  // current drag item. This is a bit tricky since\n  //   goog.style.getPageOffset() gets the left-top pos of the border, but\n  //   goog.style.setPageOffset() sets the left-top pos of the margin.\n  // It's difficult to adjust for the margins of the clone because it's\n  // difficult to read it: goog.style.getComputedStyle() doesn't work for IE.\n  // Instead, our workaround is simply to set the clone's margins to 0px.\n  this.draggerEl_.style.margin = '0';\n  this.draggerEl_.style.position = 'absolute';\n  this.draggerEl_.style.visibility = 'hidden';\n  var doc = goog.dom.getOwnerDocument(this.currDragItem_);\n  doc.body.appendChild(this.draggerEl_);\n\n  // Important: goog.style.setPageOffset() only works correctly for IE when the\n  // element is already in the document.\n  var currDragItemPos = goog.style.getPageOffset(this.currDragItem_);\n  goog.style.setPageOffset(this.draggerEl_, currDragItemPos);\n\n  this.dragger_ = new goog.fx.Dragger(this.draggerEl_);\n  this.dragger_.setHysteresis(this.hysteresisDistance_);\n\n  // Listen to events on the dragger. These handlers will be unregistered at\n  // DRAGEND, when the dragger is disposed of. We can't use eventHandler_,\n  // because it creates new references to the handler functions at each\n  // dragging action, and keeps them until DragListGroup is disposed of.\n  goog.events.listen(\n      this.dragger_, goog.fx.Dragger.EventType.START, this.handleDragStart_,\n      false, this);\n  goog.events.listen(\n      this.dragger_, goog.fx.Dragger.EventType.END, this.handleDragEnd_, false,\n      this);\n  goog.events.listen(\n      this.dragger_, goog.fx.Dragger.EventType.EARLY_CANCEL, this.cleanup_,\n      false, this);\n  this.dispatchEvent(new goog.fx.DragListGroupEvent(\n      goog.fx.DragListGroup.EventType.DRAGGERCREATED, this, e,\n      this.currDragItem_, this.draggerEl_, this.dragger_));\n  this.dragger_.startDrag(e);\n};\n\n\n/**\n * Creates copy of node being dragged.\n *\n * @param {Element} sourceEl Element to copy.\n * @return {!Element} The clone of `sourceEl`.\n * @deprecated Use goog.fx.Dragger.cloneNode().\n * @private\n */\ngoog.fx.DragListGroup.prototype.cloneNode_ = function(sourceEl) {\n  return goog.fx.Dragger.cloneNode(sourceEl);\n};\n\n\n/**\n * Generates an element to follow the cursor during dragging, given a drag\n * source element.  The default behavior is simply to clone the source element,\n * but this may be overridden in subclasses.  This method is called by\n * `createDragElement()` before the drag class is added.\n *\n * @param {Element} sourceEl Drag source element.\n * @return {!Element} The new drag element.\n * @protected\n * @suppress {deprecated}\n */\ngoog.fx.DragListGroup.prototype.createDragElementInternal = function(sourceEl) {\n  return this.cloneNode_(sourceEl);\n};\n\n\n/**\n * Handles the start of a drag action.\n * @param {!goog.fx.DragEvent} e goog.fx.Dragger.EventType.START event.\n * @private\n */\ngoog.fx.DragListGroup.prototype.handleDragStart_ = function(e) {\n  if (!this.dispatchEvent(\n          new goog.fx.DragListGroupEvent(\n              goog.fx.DragListGroup.EventType.BEFOREDRAGSTART, this,\n              e.browserEvent, this.currDragItem_, null, null))) {\n    e.preventDefault();\n    this.cleanup_();\n    return;\n  }\n\n  // Record the original location of the current drag item.\n  // Note: this.origNextItem_ may be null.\n  this.origList_ = /** @type {Element} */ (this.currDragItem_.parentNode);\n  this.origNextItem_ = goog.dom.getNextElementSibling(this.currDragItem_);\n  this.currHoverItem_ = this.origNextItem_;\n  this.currHoverList_ = this.origList_;\n\n  // If there's a CSS class specified for the current drag item, add it.\n  // Otherwise, make the actual current drag item hidden (takes up space).\n  if (this.currDragItemClasses_) {\n    goog.dom.classlist.addAll(\n        goog.asserts.assert(this.currDragItem_),\n        this.currDragItemClasses_ || []);\n  } else {\n    this.currDragItem_.style.visibility = 'hidden';\n  }\n\n  // Precompute distances from top-left corner to center for efficiency.\n  var draggerElSize = goog.style.getSize(this.draggerEl_);\n  this.draggerEl_.halfWidth = draggerElSize.width / 2;\n  this.draggerEl_.halfHeight = draggerElSize.height / 2;\n\n  this.draggerEl_.style.visibility = '';\n\n  // Record the bounds of all the drag lists and all the other drag items. This\n  // caching is for efficiency, so that we don't have to recompute the bounds on\n  // each drag move. Do this in the state where the current drag item is not in\n  // any of the lists, except when update while dragging is disabled, as in this\n  // case the current drag item does not get removed until drag ends.\n  if (this.updateWhileDragging_) {\n    this.currDragItem_.style.display = 'none';\n  }\n  this.recacheListAndItemBounds_(this.currDragItem_);\n  this.currDragItem_.style.display = '';\n\n  // Listen to events on the dragger.\n  goog.events.listen(\n      this.dragger_, goog.fx.Dragger.EventType.DRAG, this.handleDragMove_,\n      false, this);\n\n  this.dispatchEvent(\n      new goog.fx.DragListGroupEvent(\n          goog.fx.DragListGroup.EventType.DRAGSTART, this, e.browserEvent,\n          this.currDragItem_, this.draggerEl_, this.dragger_));\n};\n\n\n/**\n * Handles a drag movement (i.e. DRAG event fired by the dragger).\n *\n * @param {goog.fx.DragEvent} dragEvent Event object fired by the dragger.\n * @return {boolean} The return value for the event.\n * @private\n */\ngoog.fx.DragListGroup.prototype.handleDragMove_ = function(dragEvent) {\n\n  // Compute the center of the dragger element (i.e. the cloned drag item).\n  var draggerElPos = goog.style.getPageOffset(this.draggerEl_);\n  var draggerElCenter = new goog.math.Coordinate(\n      draggerElPos.x + this.draggerEl_.halfWidth,\n      draggerElPos.y + this.draggerEl_.halfHeight);\n\n  // Check whether the center is hovering over one of the drag lists.\n  var hoverList = this.getHoverDragList_(draggerElCenter);\n\n  // If hovering over a list, find the next item (if drag were to end now).\n  var hoverNextItem =\n      hoverList ? this.getHoverNextItem_(hoverList, draggerElCenter) : null;\n\n  var rv = this.dispatchEvent(\n      new goog.fx.DragListGroupEvent(\n          goog.fx.DragListGroup.EventType.BEFOREDRAGMOVE, this, dragEvent,\n          this.currDragItem_, this.draggerEl_, this.dragger_, draggerElCenter,\n          hoverList, hoverNextItem));\n  if (!rv) {\n    return false;\n  }\n\n  if (hoverList &&\n      hoverList.dlgDragPermission != goog.fx.DragListPermission.ONLY_DRAG_OUT) {\n    if (this.updateWhileDragging_) {\n      this.insertCurrDragItem_(hoverList, hoverNextItem);\n    } else {\n      // If update while dragging is disabled do not insert\n      // the dragged item, but update the hovered item instead.\n      this.updateCurrHoverItem(hoverNextItem, draggerElCenter);\n    }\n    this.currDragItem_.style.display = '';\n    // Add drag list's hover class (if any).\n    if (hoverList.dlgDragHoverClass_) {\n      goog.dom.classlist.add(\n          goog.asserts.assert(hoverList), hoverList.dlgDragHoverClass_);\n    }\n\n  } else {\n    // Not hovering over a drag list, so remove the item altogether unless\n    // specified otherwise by the user.\n    if (!this.isCurrDragItemAlwaysDisplayed_) {\n      this.currDragItem_.style.display = 'none';\n    }\n\n    // Remove hover classes (if any) from all drag lists.\n    for (var i = 0, n = this.dragLists_.length; i < n; i++) {\n      var dragList = this.dragLists_[i];\n      if (dragList.dlgDragHoverClass_) {\n        goog.dom.classlist.remove(\n            goog.asserts.assert(dragList), dragList.dlgDragHoverClass_);\n      }\n    }\n  }\n\n  // If the current hover list is different than the last, the lists may have\n  // shrunk, so we should recache the bounds.\n  if (hoverList != this.currHoverList_) {\n    this.currHoverList_ = hoverList;\n    this.recacheListAndItemBounds_(this.currDragItem_);\n  }\n\n  this.dispatchEvent(\n      new goog.fx.DragListGroupEvent(\n          goog.fx.DragListGroup.EventType.DRAGMOVE, this, dragEvent,\n          /** @type {Element} */ (this.currDragItem_), this.draggerEl_,\n          this.dragger_, draggerElCenter, hoverList, hoverNextItem));\n\n  // Return false to prevent selection due to mouse drag.\n  return false;\n};\n\n\n/**\n * Clear all our temporary fields that are only defined while dragging, and\n * all the bounds info stored on the drag lists and drag elements.\n * @param {!goog.events.Event=} opt_e EARLY_CANCEL event from the dragger if\n *     cleanup_ was called as an event handler.\n * @private\n */\ngoog.fx.DragListGroup.prototype.cleanup_ = function(opt_e) {\n  this.cleanupDragDom_();\n\n  this.currDragItem_ = null;\n  this.currHoverList_ = null;\n  this.origList_ = null;\n  this.origNextItem_ = null;\n  this.draggerEl_ = null;\n  this.dragger_ = null;\n\n  // Note: IE doesn't allow 'delete' for fields on HTML elements (because\n  // they're not real JS objects in IE), so we just set them to null.\n  for (var i = 0, n = this.dragLists_.length; i < n; i++) {\n    this.dragLists_[i].dlgBounds_ = null;\n  }\n  for (var i = 0, n = this.dragItems_.length; i < n; i++) {\n    this.dragItems_[i].dlgBounds_ = null;\n  }\n};\n\n\n/**\n * Handles the end or the cancellation of a drag action, i.e. END or CLEANUP\n * event fired by the dragger.\n *\n * @param {!goog.fx.DragEvent} dragEvent Event object fired by the dragger.\n * @return {boolean} Whether the event was handled.\n * @private\n */\ngoog.fx.DragListGroup.prototype.handleDragEnd_ = function(dragEvent) {\n  var rv = this.dispatchEvent(\n      new goog.fx.DragListGroupEvent(\n          goog.fx.DragListGroup.EventType.BEFOREDRAGEND, this, dragEvent,\n          /** @type {Element} */ (this.currDragItem_), this.draggerEl_,\n          this.dragger_));\n  if (!rv) {\n    return false;\n  }\n\n  // If update while dragging is disabled insert the current drag item into\n  // its intended location.\n  if (!this.updateWhileDragging_) {\n    this.insertCurrHoverItem();\n  }\n\n  // The DRAGEND handler may need the new order of the list items. Clean up the\n  // garbage.\n  // TODO(user): Regression test.\n  this.cleanupDragDom_();\n\n  this.dispatchEvent(\n      new goog.fx.DragListGroupEvent(\n          goog.fx.DragListGroup.EventType.DRAGEND, this, dragEvent,\n          this.currDragItem_, this.draggerEl_, this.dragger_));\n\n  this.cleanup_();\n\n  return true;\n};\n\n\n/**\n * Cleans up DOM changes that are made by the {@code handleDrag*} methods.\n * @private\n */\ngoog.fx.DragListGroup.prototype.cleanupDragDom_ = function() {\n  // Disposes of the dragger and remove the cloned drag item.\n  goog.dispose(this.dragger_);\n  var hadDragger = this.draggerEl_ && this.draggerEl_.parentElement;\n  if (this.draggerEl_) {\n    goog.dom.removeNode(this.draggerEl_);\n  }\n\n  // If the current drag item is not in any list, put it back in its original\n  // location.\n  if (this.currDragItem_ && this.currDragItem_.style.display == 'none') {\n    // Note: this.origNextItem_ may be null, but insertBefore() still works.\n    this.origList_.insertBefore(this.currDragItem_, this.origNextItem_);\n    this.currDragItem_.style.display = '';\n  }\n\n  // If there's a CSS class specified for the current drag item, remove it.\n  // Otherwise, make the current drag item visible (instead of empty space).\n  if (this.currDragItemClasses_ && this.currDragItem_) {\n    goog.dom.classlist.removeAll(\n        goog.asserts.assert(this.currDragItem_),\n        this.currDragItemClasses_ || []);\n  } else if (this.currDragItem_) {\n    this.currDragItem_.style.visibility = '';\n  }\n\n  // Remove hover classes (if any) from all drag lists.\n  for (var i = 0, n = this.dragLists_.length; i < n; i++) {\n    var dragList = this.dragLists_[i];\n    if (dragList.dlgDragHoverClass_) {\n      goog.dom.classlist.remove(\n          goog.asserts.assert(dragList), dragList.dlgDragHoverClass_);\n    }\n  }\n  if (hadDragger) {\n    this.dispatchEvent(new goog.fx.DragListGroupEvent(\n        goog.fx.DragListGroup.EventType.DRAGGERREMOVED, this, null,\n        this.currDragItem_, this.draggerEl_, this.dragger_));\n  }\n};\n\n\n/**\n * Default implementation of the function to get the \"handle\" element for a\n * drag item. By default, we use the whole drag item as the handle. Users can\n * change this by calling setFunctionToGetHandleForDragItem().\n *\n * @param {!Element} dragItem The drag item to get the handle for.\n * @return {Element} The dragItem element itself.\n * @private\n */\ngoog.fx.DragListGroup.prototype.getHandleForDragItem_ = function(dragItem) {\n  return dragItem;\n};\n\n\n/**\n * Handles a MOUSEOVER event fired on a drag item.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.fx.DragListGroup.prototype.handleDragItemMouseover_ = function(e) {\n  var targetEl = goog.asserts.assertElement(e.currentTarget);\n  goog.dom.classlist.addAll(targetEl, this.dragItemHoverClasses_ || []);\n};\n\n\n/**\n * Handles a MOUSEOUT event fired on a drag item.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.fx.DragListGroup.prototype.handleDragItemMouseout_ = function(e) {\n  var targetEl = goog.asserts.assertElement(e.currentTarget);\n  goog.dom.classlist.removeAll(targetEl, this.dragItemHoverClasses_ || []);\n};\n\n\n/**\n * Handles a MOUSEOVER event fired on the handle element of a drag item.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.fx.DragListGroup.prototype.handleDragItemHandleMouseover_ = function(e) {\n  var targetEl = goog.asserts.assertElement(e.currentTarget);\n  goog.dom.classlist.addAll(targetEl, this.dragItemHandleHoverClasses_ || []);\n};\n\n\n/**\n * Handles a MOUSEOUT event fired on the handle element of a drag item.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.fx.DragListGroup.prototype.handleDragItemHandleMouseout_ = function(e) {\n  var targetEl = goog.asserts.assertElement(e.currentTarget);\n  goog.dom.classlist.removeAll(\n      targetEl, this.dragItemHandleHoverClasses_ || []);\n};\n\n\n/**\n * Helper for handleDragMove_().\n * Given the position of the center of the dragger element, figures out whether\n * it's currently hovering over any of the drag lists.\n *\n * @param {goog.math.Coordinate} draggerElCenter The center position of the\n *     dragger element.\n * @return {Element} If currently hovering over a drag list, returns the drag\n *     list element. Else returns null.\n * @private\n */\ngoog.fx.DragListGroup.prototype.getHoverDragList_ = function(draggerElCenter) {\n\n  // If the current drag item was in a list last time we did this, then check\n  // that same list first.\n  var prevHoverList = null;\n  if (this.currDragItem_.style.display != 'none') {\n    prevHoverList = /** @type {Element} */ (this.currDragItem_.parentNode);\n    // Important: We can't use the cached bounds for this list because the\n    // cached bounds are based on the case where the current drag item is not\n    // in the list. Since the current drag item is known to be in this list, we\n    // must recompute the list's bounds.\n    var prevHoverListBounds = goog.style.getBounds(prevHoverList);\n    if (this.isInRect_(draggerElCenter, prevHoverListBounds)) {\n      return prevHoverList;\n    }\n  }\n\n  for (var i = 0, n = this.dragLists_.length; i < n; i++) {\n    var dragList = this.dragLists_[i];\n    if (dragList == prevHoverList) {\n      continue;\n    }\n    if (this.isInRect_(draggerElCenter, dragList.dlgBounds_)) {\n      return dragList;\n    }\n  }\n\n  return null;\n};\n\n\n/**\n * Checks whether a coordinate position resides inside a rectangle.\n * @param {goog.math.Coordinate} pos The coordinate position.\n * @param {goog.math.Rect} rect The rectangle.\n * @return {boolean} True if 'pos' is within the bounds of 'rect'.\n * @private\n */\ngoog.fx.DragListGroup.prototype.isInRect_ = function(pos, rect) {\n  return pos.x > rect.left && pos.x < rect.left + rect.width &&\n      pos.y > rect.top && pos.y < rect.top + rect.height;\n};\n\n\n/**\n * Updates the value of currHoverItem_.\n *\n * This method is used for insertion only when updateWhileDragging_ is false.\n * The below implementation is the basic one. This method can be extended by\n * a subclass to support changes to hovered item (eg: highlighting). Parametr\n * opt_draggerElCenter can be used for more sophisticated effects.\n *\n * @param {Element} hoverNextItem element of the list that is hovered over.\n * @param {goog.math.Coordinate=} opt_draggerElCenter current position of\n *     the dragged element.\n * @protected\n */\ngoog.fx.DragListGroup.prototype.updateCurrHoverItem = function(\n    hoverNextItem, opt_draggerElCenter) {\n  if (hoverNextItem) {\n    this.currHoverItem_ = hoverNextItem;\n  }\n};\n\n\n/**\n * Inserts the currently dragged item in its new place.\n *\n * This method is used for insertion only when updateWhileDragging_ is false\n * (otherwise there is no need for that). In the basic implementation\n * the element is inserted before the currently hovered over item (this can\n * be changed by overriding the method in subclasses).\n *\n * @protected\n */\ngoog.fx.DragListGroup.prototype.insertCurrHoverItem = function() {\n  this.origList_.insertBefore(this.currDragItem_, this.currHoverItem_);\n};\n\n\n/**\n * Helper for handleDragMove_().\n * Given the position of the center of the dragger element, plus the drag list\n * that it's currently hovering over, figures out the next drag item in the\n * list that follows the current position of the dragger element. (I.e. if\n * the drag action ends right now, it would become the item after the current\n * drag item.)\n *\n * @param {Element} hoverList The drag list that we're hovering over.\n * @param {goog.math.Coordinate} draggerElCenter The center position of the\n *     dragger element.\n * @return {Element} Returns the earliest item in the hover list that belongs\n *     after the current position of the dragger element. If all items in the\n *     list should come before the current drag item, then returns null.\n * @private\n */\ngoog.fx.DragListGroup.prototype.getHoverNextItem_ = function(\n    hoverList, draggerElCenter) {\n  if (hoverList == null) {\n    throw new Error('getHoverNextItem_ called with null hoverList.');\n  }\n\n  // The definition of what it means for the draggerEl to be \"before\" a given\n  // item in the hover drag list is not always the same. It changes based on\n  // the growth direction of the hover drag list in question.\n  /** @type {number} */\n  var relevantCoord = 0;\n  var getRelevantBoundFn;\n  var isBeforeFn;\n  var pickClosestRow = false;\n  var distanceToClosestRow = undefined;\n  switch (hoverList.dlgGrowthDirection_) {\n    case goog.fx.DragListDirection.DOWN:\n      // \"Before\" means draggerElCenter.y is less than item's bottom y-value.\n      relevantCoord = draggerElCenter.y;\n      getRelevantBoundFn = goog.fx.DragListGroup.getBottomBound_;\n      isBeforeFn = goog.fx.DragListGroup.isLessThan_;\n      break;\n    case goog.fx.DragListDirection.RIGHT_2D:\n      pickClosestRow = true;\n    case goog.fx.DragListDirection.RIGHT:\n      // \"Before\" means draggerElCenter.x is less than item's right x-value.\n      relevantCoord = draggerElCenter.x;\n      getRelevantBoundFn = goog.fx.DragListGroup.getRightBound_;\n      isBeforeFn = goog.fx.DragListGroup.isLessThan_;\n      break;\n    case goog.fx.DragListDirection.LEFT_2D:\n      pickClosestRow = true;\n    case goog.fx.DragListDirection.LEFT:\n      // \"Before\" means draggerElCenter.x is greater than item's left x-value.\n      relevantCoord = draggerElCenter.x;\n      getRelevantBoundFn = goog.fx.DragListGroup.getLeftBound_;\n      isBeforeFn = goog.fx.DragListGroup.isGreaterThan_;\n      break;\n  }\n\n  // This holds the earliest drag item found so far that should come after\n  // this.currDragItem_ in the hover drag list (based on draggerElCenter).\n  var earliestAfterItem = null;\n  // This is the position of the relevant bound for the earliestAfterItem,\n  // where \"relevant\" is determined by the growth direction of hoverList.\n  var earliestAfterItemRelevantBound;\n\n  var hoverListItems = goog.dom.getChildren(hoverList);\n  for (var i = 0, n = hoverListItems.length; i < n; i++) {\n    var item = hoverListItems[i];\n    if (item == this.currDragItem_) {\n      continue;\n    }\n\n    var relevantBound = getRelevantBoundFn(item.dlgBounds_);\n    // When the hoverlist is broken into multiple rows (i.e., in the case of\n    // LEFT_2D and RIGHT_2D) it is no longer enough to only look at the\n    // x-coordinate alone in order to find the {@earliestAfterItem} in the\n    // hoverlist. Make sure it is chosen from the row closest to the\n    // `draggerElCenter`.\n    if (pickClosestRow) {\n      var distanceToRow = goog.fx.DragListGroup.verticalDistanceFromItem_(\n          item, draggerElCenter);\n      // Initialize the distance to the closest row to the current value if\n      // undefined.\n      if (distanceToClosestRow === undefined) {\n        distanceToClosestRow = distanceToRow;\n      }\n      if (isBeforeFn(relevantCoord, relevantBound) &&\n          (earliestAfterItemRelevantBound == undefined ||\n           (distanceToRow < distanceToClosestRow) ||\n           ((distanceToRow == distanceToClosestRow) &&\n            (isBeforeFn(relevantBound, earliestAfterItemRelevantBound) ||\n             relevantBound == earliestAfterItemRelevantBound)))) {\n        earliestAfterItem = item;\n        earliestAfterItemRelevantBound = relevantBound;\n      }\n      // Update distance to closest row.\n      if (distanceToRow < distanceToClosestRow) {\n        distanceToClosestRow = distanceToRow;\n      }\n    } else if (\n        isBeforeFn(relevantCoord, relevantBound) &&\n        (earliestAfterItemRelevantBound == undefined ||\n         isBeforeFn(relevantBound, earliestAfterItemRelevantBound))) {\n      earliestAfterItem = item;\n      earliestAfterItemRelevantBound = relevantBound;\n    }\n  }\n  // If we ended up picking an element that is not in the closest row it can\n  // only happen if we should have picked the last one in which case there is\n  // no consecutive element.\n  if (earliestAfterItem !== null &&\n      goog.fx.DragListGroup.verticalDistanceFromItem_(\n          earliestAfterItem, draggerElCenter) > distanceToClosestRow) {\n    return null;\n  } else {\n    return earliestAfterItem;\n  }\n};\n\n\n/**\n * Private helper for getHoverNextItem().\n * Given an item and a target determine the vertical distance from the item's\n * center to the target.\n * @param {Element} item The item to measure the distance from.\n * @param {goog.math.Coordinate} target The (x,y) coordinate of the target\n *     to measure the distance to.\n * @return {number} The vertical distance between the center of the item and\n *     the target.\n * @private\n */\ngoog.fx.DragListGroup.verticalDistanceFromItem_ = function(item, target) {\n  var itemBounds = item.dlgBounds_;\n  var itemCenterY = itemBounds.top + (itemBounds.height - 1) / 2;\n  return Math.abs(target.y - itemCenterY);\n};\n\n\n/**\n * Private helper for getHoverNextItem_().\n * Given the bounds of an item, computes the item's bottom y-value.\n * @param {goog.math.Rect} itemBounds The bounds of the item.\n * @return {number} The item's bottom y-value.\n * @private\n */\ngoog.fx.DragListGroup.getBottomBound_ = function(itemBounds) {\n  return itemBounds.top + itemBounds.height - 1;\n};\n\n\n/**\n * Private helper for getHoverNextItem_().\n * Given the bounds of an item, computes the item's right x-value.\n * @param {goog.math.Rect} itemBounds The bounds of the item.\n * @return {number} The item's right x-value.\n * @private\n */\ngoog.fx.DragListGroup.getRightBound_ = function(itemBounds) {\n  return itemBounds.left + itemBounds.width - 1;\n};\n\n\n/**\n * Private helper for getHoverNextItem_().\n * Given the bounds of an item, computes the item's left x-value.\n * @param {goog.math.Rect} itemBounds The bounds of the item.\n * @return {number} The item's left x-value.\n * @private\n */\ngoog.fx.DragListGroup.getLeftBound_ = function(itemBounds) {\n  return itemBounds.left || 0;\n};\n\n\n/**\n * Private helper for getHoverNextItem_().\n * @param {number} a Number to compare.\n * @param {number} b Number to compare.\n * @return {boolean} Whether a is less than b.\n * @private\n */\ngoog.fx.DragListGroup.isLessThan_ = function(a, b) {\n  return a < b;\n};\n\n\n/**\n * Private helper for getHoverNextItem_().\n * @param {number} a Number to compare.\n * @param {number} b Number to compare.\n * @return {boolean} Whether a is greater than b.\n * @private\n */\ngoog.fx.DragListGroup.isGreaterThan_ = function(a, b) {\n  return a > b;\n};\n\n\n/**\n * Inserts the current drag item to the appropriate location in the drag list\n * that we're hovering over (if the current drag item is not already there).\n *\n * @param {Element} hoverList The drag list we're hovering over.\n * @param {Element} hoverNextItem The next item in the hover drag list.\n * @private\n */\ngoog.fx.DragListGroup.prototype.insertCurrDragItem_ = function(\n    hoverList, hoverNextItem) {\n  if (this.currDragItem_.parentNode != hoverList ||\n      goog.dom.getNextElementSibling(this.currDragItem_) != hoverNextItem) {\n    // The current drag item is not in the correct location, so we move it.\n    // Note: hoverNextItem may be null, but insertBefore() still works.\n    hoverList.insertBefore(this.currDragItem_, hoverNextItem);\n  }\n};\n\n\n\n/**\n * The event object dispatched by DragListGroup.\n * The fields draggerElCenter, hoverList, and hoverNextItem are only available\n * for the BEFOREDRAGMOVE and DRAGMOVE events.\n *\n * @param {!goog.fx.DragListGroup.EventType} type\n * @param {goog.fx.DragListGroup} dragListGroup A reference to the associated\n *     DragListGroup object.\n * @param {goog.events.BrowserEvent|goog.fx.DragEvent} event The event fired\n *     by the browser or fired by the dragger.\n * @param {Element} currDragItem The current drag item being moved.\n * @param {Element} draggerEl The clone of the current drag item that's actually\n *     being dragged around.\n * @param {goog.fx.Dragger} dragger The dragger object.\n * @param {goog.math.Coordinate=} opt_draggerElCenter The current center\n *     position of the draggerEl.\n * @param {Element=} opt_hoverList The current drag list that's being hovered\n *     over, or null if the center of draggerEl is outside of any drag lists.\n *     If not null and the drag action ends right now, then currDragItem will\n *     end up in this list.\n * @param {Element=} opt_hoverNextItem The current next item in the hoverList\n *     that the draggerEl is hovering over. (I.e. If the drag action ends\n *     right now, then this item would become the next item after the new\n *     location of currDragItem.) May be null if not applicable or if\n *     currDragItem would be added to the end of hoverList.\n * @constructor\n * @struct\n * @extends {goog.events.Event}\n */\ngoog.fx.DragListGroupEvent = function(\n    type, dragListGroup, event, currDragItem, draggerEl, dragger,\n    opt_draggerElCenter, opt_hoverList, opt_hoverNextItem) {\n  goog.events.Event.call(this, type);\n\n  /**\n   * A reference to the associated DragListGroup object.\n   * @type {goog.fx.DragListGroup}\n   */\n  this.dragListGroup = dragListGroup;\n\n  /**\n   * The event fired by the browser or fired by the dragger.\n   * @type {goog.events.BrowserEvent|goog.fx.DragEvent}\n   */\n  this.event = event;\n\n  /**\n   * The current drag item being move.\n   * @type {Element}\n   */\n  this.currDragItem = currDragItem;\n\n  /**\n   * The clone of the current drag item that's actually being dragged around.\n   * @type {Element}\n   */\n  this.draggerEl = draggerEl;\n\n  /**\n   * The dragger object.\n   * @type {goog.fx.Dragger}\n   */\n  this.dragger = dragger;\n\n  /**\n   * The current center position of the draggerEl.\n   * @type {goog.math.Coordinate|undefined}\n   */\n  this.draggerElCenter = opt_draggerElCenter;\n\n  /**\n   * The current drag list that's being hovered over, or null if the center of\n   * draggerEl is outside of any drag lists. (I.e. If not null and the drag\n   * action ends right now, then currDragItem will end up in this list.)\n   * @type {Element|undefined}\n   */\n  this.hoverList = opt_hoverList;\n\n  /**\n   * The current next item in the hoverList that the draggerEl is hovering over.\n   * (I.e. If the drag action ends right now, then this item would become the\n   * next item after the new location of currDragItem.) May be null if not\n   * applicable or if currDragItem would be added to the end of hoverList.\n   * @type {Element|undefined}\n   */\n  this.hoverNextItem = opt_hoverNextItem;\n};\ngoog.inherits(goog.fx.DragListGroupEvent, goog.events.Event);\n","^9I",1579837703000,"^9J",["^9K",["^:E","^;;","^>;","^:;","~$goog.events.EventId","^9L","^9>","^:L","^?K","^:I","^>8","^<3","^;8","^;9","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/draglistgroup.js"],"^:1",["^9K",["~$goog.fx.DragListDirection","~$goog.fx.DragListPermission","~$goog.fx.DragListGroup","~$goog.fx.DragListGroupEvent","~$goog.fx.DragListGroup.EventType"]],"^9<",true,"^9=",["^9>","^;9","^:E","^;;","^:;","^:N","^;8","^>;","^W>","^:L","^:I","^?K","^>8","^9L","^<3"]],["^ ","^9A",[1579837703000],"^9B","goog.net.xpc.xpc.js","^9C",["^9D","goog/net/xpc/xpc.js"],"^9E","goog/net/xpc/xpc.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides the namesspace for client-side communication\n * between pages originating from different domains (it works also\n * with pages from the same domain, but doing that is kinda\n * pointless).\n *\n * The only publicly visible class is goog.net.xpc.CrossPageChannel.\n *\n * Note: The preferred name for the main class would have been\n * CrossDomainChannel.  But as there already is a class named like\n * that (which serves a different purpose) in the maps codebase,\n * CrossPageChannel was chosen to avoid confusion.\n *\n * CrossPageChannel abstracts the underlying transport mechanism to\n * provide a common interface in all browsers.\n *\n *\n * @suppress {underscore}\n */\n\ngoog.provide('goog.net.xpc');\ngoog.provide('goog.net.xpc.CfgFields');\ngoog.provide('goog.net.xpc.ChannelStates');\ngoog.provide('goog.net.xpc.TransportNames');\ngoog.provide('goog.net.xpc.TransportTypes');\ngoog.provide('goog.net.xpc.UriCfgFields');\n\ngoog.forwardDeclare('goog.net.xpc.CrossPageChannel');  // circular\ngoog.require('goog.log');\n\n\n/**\n * Enum used to identify transport types.\n * @enum {number}\n */\ngoog.net.xpc.TransportTypes = {\n  UNDEFINED: 0,\n  NATIVE_MESSAGING: 1,\n  IFRAME_POLLING: 2,\n  DIRECT: 3\n};\n\n\n/**\n * Enum containing transport names. These need to correspond to the\n * transport class names for createTransport_() to work.\n * @const {!Object<string,string>}\n */\ngoog.net.xpc.TransportNames = {\n  '1': 'NativeMessagingTransport',\n  '2': 'IframePollingTransport',\n  '3': 'DirectTransport'\n};\n\n\n// TODO(user): Add auth token support to other methods.\n\n\n/**\n * Field names used on configuration object.\n * @const\n */\ngoog.net.xpc.CfgFields = {\n  /**\n   * Channel name identifier.\n   * Both peers have to be initialized with\n   * the same channel name.  If not present, a channel name is\n   * generated (which then has to transferred to the peer somehow).\n   */\n  CHANNEL_NAME: 'cn',\n  /**\n   * Authorization token. If set, NIX will use this authorization token\n   * to validate the setup.\n   */\n  AUTH_TOKEN: 'at',\n  /**\n   * Remote party's authorization token. If set, NIX will validate this\n   * authorization token against that sent by the other party.\n   */\n  REMOTE_AUTH_TOKEN: 'rat',\n  /**\n   * The URI of the peer page.\n   */\n  PEER_URI: 'pu',\n  /**\n   * Ifame-ID identifier.\n   * The id of the iframe element the peer-document lives in.\n   */\n  IFRAME_ID: 'ifrid',\n  /**\n   * Transport type identifier.\n   * The transport type to use. Possible values are entries from\n   * goog.net.xpc.TransportTypes or a Transport constructor fuction. If not\n   * present, the transport is determined automatically based on the useragent's\n   * capabilities.\n   */\n  TRANSPORT: 'tp',\n  /**\n   * Local relay URI identifier (IframeRelayTransport-specific).\n   * The URI (can't contain a fragment identifier) used by the peer to\n   * relay data through.\n   */\n  LOCAL_RELAY_URI: 'lru',\n  /**\n   * Peer relay URI identifier (IframeRelayTransport-specific).\n   * The URI (can't contain a fragment identifier) used to relay data\n   * to the peer.\n   */\n  PEER_RELAY_URI: 'pru',\n  /**\n   * Local poll URI identifier (IframePollingTransport-specific).\n   * The URI  (can't contain a fragment identifier)which is polled\n   * to receive data from the peer.\n   */\n  LOCAL_POLL_URI: 'lpu',\n  /**\n   * Local poll URI identifier (IframePollingTransport-specific).\n   * The URI (can't contain a fragment identifier) used to send data\n   * to the peer.\n   */\n  PEER_POLL_URI: 'ppu',\n  /**\n   * The hostname of the peer window, including protocol, domain, and port\n   * (if specified). Used for security sensitive applications that make\n   * use of NativeMessagingTransport (i.e. most applications).\n   */\n  PEER_HOSTNAME: 'ph',\n  /**\n   * Usually both frames using a connection initially send a SETUP message to\n   * each other, and each responds with a SETUP_ACK.  A frame marks itself\n   * connected when it receives that SETUP_ACK.  If this parameter is true\n   * however, the channel it is passed to will not send a SETUP, but rather will\n   * wait for one from its peer and mark itself connected when that arrives.\n   * Peer iframes created using such a channel will send SETUP however, and will\n   * wait for SETUP_ACK before marking themselves connected.  The goal is to\n   * cope with a situation where the availability of the URL for the peer frame\n   * cannot be relied on, eg when the application is offline.  Without this\n   * setting, the primary frame will attempt to send its SETUP message every\n   * 100ms, forever.  This floods the javascript console with uncatchable\n   * security warnings, and fruitlessly burns CPU.  There is one scenario this\n   * mode will not support, and that is reconnection by the outer frame, ie the\n   * creation of a new channel object to connect to a peer iframe which was\n   * already communicating with a previous channel object of the same name.  If\n   * that behavior is needed, this mode should not be used.  Reconnection by\n   * inner frames is supported in this mode however.\n   */\n  ONE_SIDED_HANDSHAKE: 'osh',\n  /**\n   * The frame role (inner or outer). Used to explicitly indicate the role for\n   * each peer whenever the role cannot be reliably determined (e.g. the two\n   * peer windows are not parent/child frames). If unspecified, the role will\n   * be dynamically determined, assuming a parent/child frame setup.\n   */\n  ROLE: 'role',\n  /**\n   * Which version of the native transport startup protocol should be used, the\n   * default being '2'.  Version 1 had various timing vulnerabilities, which\n   * had to be compensated for by introducing delays, and is deprecated.  V1\n   * and V2 are broadly compatible, although the more robust timing and lack\n   * of delays is not gained unless both sides are using V2.  The only\n   * unsupported case of cross-protocol interoperation is where a connection\n   * starts out with V2 at both ends, and one of the ends reconnects as a V1.\n   * All other initial startup and reconnection scenarios are supported.\n   */\n  NATIVE_TRANSPORT_PROTOCOL_VERSION: 'nativeProtocolVersion',\n  /**\n   * Whether the direct transport runs in synchronous mode. The default is to\n   * emulate the other transports and run asyncronously but there are some\n   * circumstances where syncronous calls are required. If this property is\n   * set to true, the transport will send the messages synchronously.\n   */\n  DIRECT_TRANSPORT_SYNC_MODE: 'directSyncMode'\n};\n\n\n/**\n * Config properties that need to be URL sanitized.\n * @type {Array<string>}\n */\ngoog.net.xpc.UriCfgFields = [\n  goog.net.xpc.CfgFields.PEER_URI, goog.net.xpc.CfgFields.LOCAL_RELAY_URI,\n  goog.net.xpc.CfgFields.PEER_RELAY_URI, goog.net.xpc.CfgFields.LOCAL_POLL_URI,\n  goog.net.xpc.CfgFields.PEER_POLL_URI\n];\n\n\n/**\n * @enum {number}\n */\ngoog.net.xpc.ChannelStates = {\n  NOT_CONNECTED: 1,\n  CONNECTED: 2,\n  CLOSED: 3\n};\n\n\n/**\n * The name of the transport service (used for internal signalling).\n * @type {string}\n * @suppress {underscore|visibility}\n */\ngoog.net.xpc.TRANSPORT_SERVICE_ = 'tp';\n\n\n/**\n * Transport signaling message: setup.\n * @type {string}\n */\ngoog.net.xpc.SETUP = 'SETUP';\n\n\n/**\n * Transport signaling message: setup for native transport protocol v2.\n * @type {string}\n */\ngoog.net.xpc.SETUP_NTPV2 = 'SETUP_NTPV2';\n\n\n/**\n * Transport signaling message: setup acknowledgement.\n * @type {string}\n * @suppress {underscore|visibility}\n */\ngoog.net.xpc.SETUP_ACK_ = 'SETUP_ACK';\n\n\n/**\n * Transport signaling message: setup acknowledgement.\n * @type {string}\n */\ngoog.net.xpc.SETUP_ACK_NTPV2 = 'SETUP_ACK_NTPV2';\n\n\n/**\n * Object holding active channels.\n *\n * @package {Object<string, goog.net.xpc.CrossPageChannel>}\n */\ngoog.net.xpc.channels = {};\n\n\n/**\n * Returns a random string.\n * @param {number} length How many characters the string shall contain.\n * @param {string=} opt_characters The characters used.\n * @return {string} The random string.\n */\ngoog.net.xpc.getRandomString = function(length, opt_characters) {\n  var chars = opt_characters || goog.net.xpc.randomStringCharacters_;\n  var charsLength = chars.length;\n  var s = '';\n  while (length-- > 0) {\n    s += chars.charAt(Math.floor(Math.random() * charsLength));\n  }\n  return s;\n};\n\n\n/**\n * The default characters used for random string generation.\n * @type {string}\n * @private\n */\ngoog.net.xpc.randomStringCharacters_ =\n    'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\n\n\n/**\n * The logger.\n * @type {goog.log.Logger}\n */\ngoog.net.xpc.logger = goog.log.getLogger('goog.net.xpc');\n","^9I",1579837703000,"^9J",["^9K",["^9>","^;Q"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/xpc/xpc.js"],"^:1",["^9K",["^@Q","^@R","^@U","~$goog.net.xpc.TransportNames","~$goog.net.xpc.ChannelStates","~$goog.net.xpc.UriCfgFields"]],"^9<",true,"^9=",["^9>","^;Q"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.i18n.dateintervalformat.js","^9C",["^9D","goog/i18n/dateintervalformat.js"],"^9E","goog/i18n/dateintervalformat.js","^9F","^9G","^9H","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview DateIntervalFormat provides methods to format a date interval\n * into a string in a user friendly way and a locale sensitive manner.\n *\n * Similar to the ICU4J class com/ibm/icu/text/DateIntervalFormat:\n *  http://icu-project.org/apiref/icu4j/com/ibm/icu/text/DateIntervalFormat.html\n *\n * Example usage:\n * var DateIntervalFormat = goog.require('goog.i18n.DateIntervalFormat');\n * var DateRange = goog.require('goog.date.DateRange');\n * var DateTime = goog.require('goog.date.DateTime');\n * var DateTimeFormat = goog.require('goog.i18n.DateTimeFormat');\n * var GDate = goog.require('goog.date.Date');\n * var Interval = goog.require('goog.date.Interval');\n *\n * // Formatter.\n * var dtIntFmt = new DateIntervalFormat(DateTimeFormat.Format.MEDIUM_DATE);\n *\n * // Format a date range.\n * var dt1 = new GDate(2016, 8, 23);\n * var dt2 = new GDate(2016, 8, 24);\n * var dtRng = new DateRange(dt1, dt2);\n * dtIntFmt.formatRange(dtRng); // --> 'Sep 23 – 24, 2016'\n *\n * // Format two dates.\n * var dt3 = new DateTime(2016, 8, 23, 14, 53, 0);\n * var dt4 = new DateTime(2016, 8, 23, 14, 54, 0);\n * dtIntFmt.format(dt3, dt4); // --> 'Sep 23, 2016'\n *\n * // Format a date and an interval.\n * var dt5 = new DateTime(2016, 8, 23, 14, 53, 0);\n * var itv = new Interval(0, 1); // One month.\n * dtIntFmt.format(dt5, itv); // --> 'Sep 23 – Oct 23, 2016'\n *\n */\n\ngoog.module('goog.i18n.DateIntervalFormat');\n\nvar DateLike = goog.require('goog.date.DateLike');\nvar DateRange = goog.require('goog.date.DateRange');\nvar DateTime = goog.require('goog.date.DateTime');\nvar DateTimeFormat = goog.require('goog.i18n.DateTimeFormat');\nvar DateTimeSymbols = goog.require('goog.i18n.DateTimeSymbols');\nvar DateTimeSymbolsType = goog.require('goog.i18n.DateTimeSymbolsType');\nvar Interval = goog.require('goog.date.Interval');\nvar TimeZone = goog.require('goog.i18n.TimeZone');\nvar array = goog.require('goog.array');\nvar asserts = goog.require('goog.asserts');\nvar dateIntervalSymbols = goog.require('goog.i18n.dateIntervalSymbols');\nvar object = goog.require('goog.object');\n\n/**\n * Constructs a DateIntervalFormat object based on the current locale.\n *\n * @param {number|!dateIntervalSymbols.DateIntervalPatternMap} pattern Pattern\n *     specification or pattern object.\n * @param {!dateIntervalSymbols.DateIntervalSymbols=} opt_dateIntervalSymbols\n *     Optional DateIntervalSymbols to use for this instance rather than the\n *     global symbols.\n * @param {!DateTimeSymbolsType=} opt_dateTimeSymbols Optional DateTimeSymbols\n *     to use for this instance rather than the global symbols.\n * @constructor\n * @struct\n * @final\n */\nvar DateIntervalFormat = function(\n    pattern, opt_dateIntervalSymbols, opt_dateTimeSymbols) {\n  asserts.assert(pattern !== undefined, 'Pattern must be defined.');\n  asserts.assert(\n      opt_dateIntervalSymbols !== undefined ||\n          dateIntervalSymbols.getDateIntervalSymbols() !== undefined,\n      'goog.i18n.DateIntervalSymbols or explicit symbols must be defined');\n  asserts.assert(\n      opt_dateTimeSymbols !== undefined || DateTimeSymbols !== undefined,\n      'goog.i18n.DateTimeSymbols or explicit symbols must be defined');\n\n  /**\n   * DateIntervalSymbols object that contains locale data required by the\n   * formatter.\n   * @private @const {!dateIntervalSymbols.DateIntervalSymbols}\n   */\n  this.dateIntervalSymbols_ =\n      opt_dateIntervalSymbols || dateIntervalSymbols.getDateIntervalSymbols();\n\n  /**\n   * DateTimeSymbols object that contain locale data required by the formatter.\n   * @private @const {!DateTimeSymbolsType}\n   */\n  this.dateTimeSymbols_ = opt_dateTimeSymbols || DateTimeSymbols;\n\n  /**\n   * Date interval pattern to use.\n   * @private @const {!dateIntervalSymbols.DateIntervalPatternMap}\n   */\n  this.intervalPattern_ = this.getIntervalPattern_(pattern);\n\n  /**\n   * Keys of the available date interval patterns. Used to lookup the key that\n   * contains a specific pattern letter (e.g. for ['Myd', 'hms'], the key that\n   * contains 'y' is 'Myd').\n   * @private @const {!Array<string>}\n   */\n  this.intervalPatternKeys_ = object.getKeys(this.intervalPattern_);\n\n  // Remove the default pattern's key ('_') from intervalPatternKeys_. Is not\n  // necesary when looking up for a key: when no key is found it will always\n  // default to the default pattern.\n  array.remove(this.intervalPatternKeys_, DEFAULT_PATTERN_KEY_);\n\n  /**\n   * Default fallback pattern to use.\n   * @private @const {string}\n   */\n  this.fallbackPattern_ =\n      this.dateIntervalSymbols_.FALLBACK || DEFAULT_FALLBACK_PATTERN_;\n\n  // Determine which date should be used with each part of the interval\n  // pattern.\n  var indexOfFirstDate = this.fallbackPattern_.indexOf(FIRST_DATE_PLACEHOLDER_);\n  var indexOfSecondDate =\n      this.fallbackPattern_.indexOf(SECOND_DATE_PLACEHOLDER_);\n  if (indexOfFirstDate < 0 || indexOfSecondDate < 0) {\n    throw new Error('Malformed fallback interval pattern');\n  }\n\n  /**\n   * True if the first date provided should be formatted with the first pattern\n   * of the interval pattern.\n   * @private @const {boolean}\n   */\n  this.useFirstDateOnFirstPattern_ = indexOfFirstDate <= indexOfSecondDate;\n\n  /**\n   * Map that stores a Formatter_ object per calendar field. Formatters will be\n   * instanced on demand and stored on this map until required again.\n   * @private @const {!Object<string, !Formatter_>}\n   */\n  this.formatterMap_ = {};\n};\n\n/**\n * Default fallback interval pattern.\n * @private @const {string}\n */\nvar DEFAULT_FALLBACK_PATTERN_ = '{0} – {1}';\n\n/**\n * Interval pattern placeholder for the first date.\n * @private @const {string}\n */\nvar FIRST_DATE_PLACEHOLDER_ = '{0}';\n\n/**\n * Interval pattern placeholder for the second date.\n * @private @const {string}\n */\nvar SECOND_DATE_PLACEHOLDER_ = '{1}';\n\n/**\n * Key used by the default datetime pattern.\n * @private @const {string}\n */\nvar DEFAULT_PATTERN_KEY_ = '_';\n\n/**\n * Gregorian calendar Eras.\n * @private @enum {number}\n */\nvar Era_ = {BC: 0, AD: 1};\n\n/**\n * Am Pm markers.\n * @private @enum {number}\n */\nvar AmPm_ = {AM: 0, PM: 1};\n\n/**\n * String of all pattern letters representing the relevant calendar fields.\n * Sorted according to the length of the datetime unit they represent.\n * @private @const {string}\n */\nvar RELEVANT_CALENDAR_FIELDS_ = 'GyMdahms';\n\n/**\n * Regex that matches all possible pattern letters.\n * @private @const {!RegExp}\n */\nvar ALL_PATTERN_LETTERS_ = /[a-zA-Z]/;\n\n/**\n * Returns the interval pattern from a pattern specification or from the pattern\n * object.\n * @param {number|!dateIntervalSymbols.DateIntervalPatternMap} pattern Pattern\n *     specification or pattern object.\n * @return {!dateIntervalSymbols.DateIntervalPatternMap}\n * @private\n */\nDateIntervalFormat.prototype.getIntervalPattern_ = function(pattern) {\n  if (typeof pattern === 'number') {\n    switch (pattern) {\n      case DateTimeFormat.Format.FULL_DATE:\n        return this.dateIntervalSymbols_.FULL_DATE;\n      case DateTimeFormat.Format.LONG_DATE:\n        return this.dateIntervalSymbols_.LONG_DATE;\n      case DateTimeFormat.Format.MEDIUM_DATE:\n        return this.dateIntervalSymbols_.MEDIUM_DATE;\n      case DateTimeFormat.Format.SHORT_DATE:\n        return this.dateIntervalSymbols_.SHORT_DATE;\n      case DateTimeFormat.Format.FULL_TIME:\n        return this.dateIntervalSymbols_.FULL_TIME;\n      case DateTimeFormat.Format.LONG_TIME:\n        return this.dateIntervalSymbols_.LONG_TIME;\n      case DateTimeFormat.Format.MEDIUM_TIME:\n        return this.dateIntervalSymbols_.MEDIUM_TIME;\n      case DateTimeFormat.Format.SHORT_TIME:\n        return this.dateIntervalSymbols_.SHORT_TIME;\n      case DateTimeFormat.Format.FULL_DATETIME:\n        return this.dateIntervalSymbols_.FULL_DATETIME;\n      case DateTimeFormat.Format.LONG_DATETIME:\n        return this.dateIntervalSymbols_.LONG_DATETIME;\n      case DateTimeFormat.Format.MEDIUM_DATETIME:\n        return this.dateIntervalSymbols_.MEDIUM_DATETIME;\n      case DateTimeFormat.Format.SHORT_DATETIME:\n        return this.dateIntervalSymbols_.SHORT_DATETIME;\n      default:\n        return this.dateIntervalSymbols_.MEDIUM_DATETIME;\n    }\n  } else {\n    return pattern;\n  }\n};\n\n/**\n * Formats the given date or date interval objects according to the present\n * pattern and current locale.\n *\n * Parameter combinations:\n *  * StartDate: {@link goog.date.DateLike}, EndDate: {@link goog.date.DateLike}\n *  * StartDate: {@link goog.date.DateLike}, Interval: {@link goog.date.Interval}\n *\n * @param {!DateLike} startDate Start date of the date range.\n * @param {!DateLike|!Interval} endDate End date of the date range or an\n *     interval object.\n * @param {!TimeZone=} opt_timeZone Timezone to be used in the target\n *     representation.\n * @return {string} Formatted date interval.\n */\nDateIntervalFormat.prototype.format = function(\n    startDate, endDate, opt_timeZone) {\n  asserts.assert(\n      startDate != null,\n      'The startDate parameter should be defined and not-null.');\n  asserts.assert(\n      endDate != null, 'The endDate parameter should be defined and not-null.');\n\n  // Convert input to DateLike.\n  var endDt;\n  if (goog.isDateLike(endDate)) {\n    endDt = /** @type {!DateLike} */ (endDate);\n  } else {\n    asserts.assertInstanceof(\n        endDate, Interval,\n        'endDate parameter should be a goog.date.DateLike or ' +\n            'goog.date.Interval');\n    endDt = new DateTime(startDate);\n    endDt.add(endDate);\n  }\n\n  // Obtain the largest different calendar field between the two dates.\n  var largestDifferentCalendarField =\n      DateIntervalFormat.getLargestDifferentCalendarField_(\n          startDate, endDt, opt_timeZone);\n\n  // Get the Formatter_ required to format the specified calendar field and use\n  // it to format the dates.\n  var formatter =\n      this.getFormatterForCalendarField_(largestDifferentCalendarField);\n  return formatter.format(\n      startDate, endDt, largestDifferentCalendarField, opt_timeZone);\n};\n\n/**\n * Formats the given date range object according to the present pattern and\n * current locale.\n *\n * @param {!DateRange} dateRange\n * @param {!TimeZone=} opt_timeZone Timezone to be used in the target\n *     representation.\n * @return {string} Formatted date interval.\n */\nDateIntervalFormat.prototype.formatRange = function(dateRange, opt_timeZone) {\n  asserts.assert(\n      dateRange != null,\n      'The dateRange parameter should be defined and non-null.');\n  var startDate = dateRange.getStartDate();\n  var endDate = dateRange.getEndDate();\n  if (startDate == null) {\n    throw new Error(\n        'The dateRange\\'s startDate should be defined and non-null.');\n  }\n  if (endDate == null) {\n    throw new Error('The dateRange\\'s endDate should be defined and non-null.');\n  }\n  return this.format(startDate, endDate, opt_timeZone);\n};\n\n/**\n * Returns the Formatter_ to be used to format two dates for the given calendar\n * field.\n * @param {string} calendarField Pattern letter representing the calendar field.\n * @return {!Formatter_}\n * @private\n */\nDateIntervalFormat.prototype.getFormatterForCalendarField_ = function(\n    calendarField) {\n  if (calendarField != '') {\n    for (var i = 0; i < this.intervalPatternKeys_.length; i++) {\n      if (this.intervalPatternKeys_[i].indexOf(calendarField) >= 0) {\n        return this.getOrCreateFormatterForKey_(this.intervalPatternKeys_[i]);\n      }\n    }\n  }\n  return this.getOrCreateFormatterForKey_(DEFAULT_PATTERN_KEY_);\n};\n\n/**\n * Returns and creates (if necessary) a formatter for the specified key.\n * @param {string} key\n * @return {!Formatter_}\n * @private\n */\nDateIntervalFormat.prototype.getOrCreateFormatterForKey_ = function(key) {\n  var fmt = this;\n  return object.setWithReturnValueIfNotSet(this.formatterMap_, key, function() {\n    var patternParts =\n        DateIntervalFormat.divideIntervalPattern_(fmt.intervalPattern_[key]);\n    if (patternParts === null) {\n      return new DateTimeFormatter_(\n          fmt.intervalPattern_[key], fmt.fallbackPattern_,\n          fmt.dateTimeSymbols_);\n    }\n    return new IntervalFormatter_(\n        patternParts.firstPart, patternParts.secondPart, fmt.dateTimeSymbols_,\n        fmt.useFirstDateOnFirstPattern_);\n  });\n};\n\n/**\n * Divides the interval pattern string into its two parts. Will return null if\n * the pattern can't be divided (e.g. it's a datetime pattern).\n * @param {string} intervalPattern\n * @return {?{firstPart:string, secondPart:string}} Record containing the two\n *     parts of the interval pattern. Null if the pattern can't be divided.\n * @private\n */\nDateIntervalFormat.divideIntervalPattern_ = function(intervalPattern) {\n  var foundKeys = {};\n  var patternParts = null;\n  // Iterate over the pattern until a repeated calendar field is found.\n  DateIntervalFormat.executeForEveryCalendarField_(\n      intervalPattern, function(char, index) {\n        if (object.containsKey(foundKeys, char)) {\n          patternParts = {\n            firstPart: intervalPattern.substring(0, index),\n            secondPart: intervalPattern.substring(index)\n          };\n          return false;\n        }\n        object.set(foundKeys, char, true);\n        return true;\n      });\n\n  return patternParts;\n};\n\n/**\n * Iterates over a pattern string and executes a function for every\n * calendar field. The function will be executed once, independent of the width\n * of the calendar field (number of repeated pattern letters). It will ignore\n * all literal text (enclosed by quotes).\n *\n * For example, on: \"H 'h' mm – H 'h' mm\" it will call the function for:\n * H (pos:0), m (pos:6), H (pos:11), m (pos:17).\n *\n * @param {string} pattern\n * @param {function(string, number):boolean} func Function which accepts as\n *     parameters the current calendar field and the index of its first pattern\n *     letter; and returns a boolean which indicates if the iteration should\n *     continue.\n * @private\n */\nDateIntervalFormat.executeForEveryCalendarField_ = function(pattern, func) {\n  var inQuote = false;\n  var previousChar = '';\n  for (var i = 0; i < pattern.length; i++) {\n    var char = pattern.charAt(i);\n    if (inQuote) {\n      if (char == '\\'') {\n        if (i + 1 < pattern.length && pattern.charAt(i + 1) == '\\'') {\n          i++;  // Literal quotation mark: ignore and advance.\n        } else {\n          inQuote = false;\n        }\n      }\n    } else {\n      if (char == '\\'') {\n        inQuote = true;\n      } else if (char != previousChar && ALL_PATTERN_LETTERS_.test(char)) {\n        if (!func(char, i)) {\n          break;\n        }\n      }\n    }\n    previousChar = char;\n  }\n};\n\n/**\n * Returns a pattern letter representing the largest different calendar field\n * between the two dates. This is calculated using the timezone used in the\n * target representation.\n * @param {!DateLike} startDate Start date of the date range.\n * @param {!DateLike} endDate End date of the date range.\n * @param {!TimeZone=} opt_timeZone Timezone to be used in the target\n *     representation.\n * @return {string} Pattern letter representing the largest different calendar\n *     field or an empty string if all relevant fields for these dates are equal.\n * @private\n */\nDateIntervalFormat.getLargestDifferentCalendarField_ = function(\n    startDate, endDate, opt_timeZone) {\n  // Before comparing them, dates have to be adjusted by the target timezone's\n  // offset.\n  var startDiff = 0;\n  var endDiff = 0;\n  if (opt_timeZone != null) {\n    startDiff =\n        (startDate.getTimezoneOffset() - opt_timeZone.getOffset(startDate)) *\n        60000;\n    endDiff =\n        (endDate.getTimezoneOffset() - opt_timeZone.getOffset(endDate)) * 60000;\n  }\n  var startDt = new Date(startDate.getTime() + startDiff);\n  var endDt = new Date(endDate.getTime() + endDiff);\n\n  if (DateIntervalFormat.getEra_(startDt) !=\n      DateIntervalFormat.getEra_(endDt)) {\n    return 'G';\n  } else if (startDt.getFullYear() != endDt.getFullYear()) {\n    return 'y';\n  } else if (startDt.getMonth() != endDt.getMonth()) {\n    return 'M';\n  } else if (startDt.getDate() != endDt.getDate()) {\n    return 'd';\n  } else if (\n      DateIntervalFormat.getAmPm_(startDt) !=\n      DateIntervalFormat.getAmPm_(endDt)) {\n    return 'a';\n  } else if (startDt.getHours() != endDt.getHours()) {\n    return 'h';\n  } else if (startDt.getMinutes() != endDt.getMinutes()) {\n    return 'm';\n  } else if (startDt.getSeconds() != endDt.getSeconds()) {\n    return 's';\n  }\n  return '';\n};\n\n/**\n * Returns the Era of a given DateLike object.\n * @param {!Date} date\n * @return {number}\n * @private\n */\nDateIntervalFormat.getEra_ = function(date) {\n  return date.getFullYear() > 0 ? Era_.AD : Era_.BC;\n};\n\n/**\n * Returns if the given date is in AM or PM.\n * @param {!Date} date\n * @return {number}\n * @private\n */\nDateIntervalFormat.getAmPm_ = function(date) {\n  var hours = date.getHours();\n  return (12 <= hours && hours < 24) ? AmPm_.PM : AmPm_.AM;\n};\n\n/**\n * Returns true if the calendar field field1 is a larger or equal than field2.\n * Assumes that both string parameters have just one character. Field1 has to\n * be part of the relevant calendar fields set.\n * @param {string} field1\n * @param {string} field2\n * @return {boolean}\n * @private\n */\nDateIntervalFormat.isCalendarFieldLargerOrEqualThan_ = function(\n    field1, field2) {\n  return RELEVANT_CALENDAR_FIELDS_.indexOf(field1) <=\n      RELEVANT_CALENDAR_FIELDS_.indexOf(field2);\n};\n\n/**\n * Interface implemented by internal date interval formatters.\n * @interface\n * @private\n */\nvar Formatter_ = function() {};\n\n/**\n * Formats two dates with the two parts of the date interval and returns the\n * formatted string.\n * @param {!DateLike} firstDate\n * @param {!DateLike} secondDate\n * @param {string} largestDifferentCalendarField\n * @param {!TimeZone=} opt_timeZone Target timezone in which to format the\n *     dates.\n * @return {string} String with the formatted date interval.\n */\nFormatter_.prototype.format = function(\n    firstDate, secondDate, largestDifferentCalendarField, opt_timeZone) {};\n\n/**\n * Constructs an IntervalFormatter_ object which implements the Formatter_\n * interface.\n *\n * Internal object to construct and store a goog.i18n.DateTimeFormat for each\n * part of the date interval pattern.\n *\n * @param {string} firstPattern First part of the date interval pattern.\n * @param {string} secondPattern Second part of the date interval pattern.\n * @param {!DateTimeSymbolsType} dateTimeSymbols Symbols to use with the\n *     datetime formatters.\n * @param {boolean} useFirstDateOnFirstPattern Indicates if the first or the\n *     second date should be formatted with the first or second part of the date\n *     interval pattern.\n * @constructor\n * @implements {Formatter_}\n * @private\n */\nvar IntervalFormatter_ = function(\n    firstPattern, secondPattern, dateTimeSymbols, useFirstDateOnFirstPattern) {\n  /**\n   * Formatter_ to format the first part of the date interval.\n   * @private {!DateTimeFormat}\n   */\n  this.firstPartFormatter_ = new DateTimeFormat(firstPattern, dateTimeSymbols);\n\n  /**\n   * Formatter_ to format the second part of the date interval.\n   * @private {!DateTimeFormat}\n   */\n  this.secondPartFormatter_ =\n      new DateTimeFormat(secondPattern, dateTimeSymbols);\n\n  /**\n   * Specifies if the first or the second date should be formatted by the\n   * formatter of the first or second part of the date interval.\n   * @private {boolean}\n   */\n  this.useFirstDateOnFirstPattern_ = useFirstDateOnFirstPattern;\n};\n\n/** @override */\nIntervalFormatter_.prototype.format = function(\n    firstDate, secondDate, largestDifferentCalendarField, opt_timeZone) {\n  if (this.useFirstDateOnFirstPattern_) {\n    return this.firstPartFormatter_.format(firstDate, opt_timeZone) +\n        this.secondPartFormatter_.format(secondDate, opt_timeZone);\n  } else {\n    return this.firstPartFormatter_.format(secondDate, opt_timeZone) +\n        this.secondPartFormatter_.format(firstDate, opt_timeZone);\n  }\n};\n\n/**\n * Constructs a DateTimeFormatter_ object which implements the Formatter_\n * interface.\n *\n * Internal object to construct and store a goog.i18n.DateTimeFormat for the\n * a datetime pattern and formats dates using the fallback interval pattern\n * (e.g. '{0} – {1}').\n *\n * @param {string} dateTimePattern Datetime pattern used to format the dates.\n * @param {string} fallbackPattern Fallback interval pattern to be used with the\n *     datetime pattern.\n * @param {!DateTimeSymbolsType} dateTimeSymbols Symbols to use with\n *     the datetime format.\n * @constructor\n * @implements {Formatter_}\n * @private\n */\nvar DateTimeFormatter_ = function(\n    dateTimePattern, fallbackPattern, dateTimeSymbols) {\n  /**\n   * Date time pattern used to format the dates.\n   * @private {string}\n   */\n  this.dateTimePattern_ = dateTimePattern;\n\n  /**\n   * Date time formatter used to format the dates.\n   * @private {!DateTimeFormat}\n   */\n  this.dateTimeFormatter_ =\n      new DateTimeFormat(dateTimePattern, dateTimeSymbols);\n\n  /**\n   * Fallback interval pattern.\n   * @private {string}\n   */\n  this.fallbackPattern_ = fallbackPattern;\n};\n\n/** @override */\nDateTimeFormatter_.prototype.format = function(\n    firstDate, secondDate, largestDifferentCalendarField, opt_timeZone) {\n  // Check if the largest different calendar field between the two dates is\n  // larger or equal than any calendar field in the datetime pattern. If true,\n  // format the string using the datetime pattern and the fallback interval\n  // pattern.\n  var shouldFormatWithFallbackPattern = false;\n  if (largestDifferentCalendarField != '') {\n    DateIntervalFormat.executeForEveryCalendarField_(\n        this.dateTimePattern_, function(char, index) {\n          if (DateIntervalFormat.isCalendarFieldLargerOrEqualThan_(\n                  largestDifferentCalendarField, char)) {\n            shouldFormatWithFallbackPattern = true;\n            return false;\n          }\n          return true;\n        });\n  }\n\n  if (shouldFormatWithFallbackPattern) {\n    return this.fallbackPattern_\n        .replace(\n            FIRST_DATE_PLACEHOLDER_,\n            this.dateTimeFormatter_.format(firstDate, opt_timeZone))\n        .replace(\n            SECOND_DATE_PLACEHOLDER_,\n            this.dateTimeFormatter_.format(secondDate, opt_timeZone));\n  }\n  // If not, format the first date using the datetime pattern.\n  return this.dateTimeFormatter_.format(firstDate, opt_timeZone);\n};\n\nexports = DateIntervalFormat;\n","^9I",1579837703000,"^9J",["^9K",["^:E","^JN","~$goog.i18n.DateTimeSymbolsType","~$goog.i18n.DateTimeFormat","^9>","^;P","^:W","~$goog.date.DateRange","~$goog.i18n.TimeZone","^TT","~$goog.i18n.DateTimeSymbols","^:X","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/dateintervalformat.js"],"^:1",["^9K",["~$goog.i18n.DateIntervalFormat"]],"^9<",true,"^9=",["^9>","^TT","^WI","^:X","^WH","^WK","^WG","^:W","^WJ","^;9","^:E","^JN","^;P"]],["^ ","^9A",[1579837703000],"^9B","goog.ui.ac.richremotearraymatcher.js","^9C",["^9D","goog/ui/ac/richremotearraymatcher.js"],"^9E","goog/ui/ac/richremotearraymatcher.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class that retrieves rich autocomplete matches, represented as\n * a structured list of lists, via an ajax call.  The first element of each\n * sublist is the name of a client-side javascript function that converts the\n * remaining sublist elements into rich rows.\n *\n */\n\ngoog.provide('goog.ui.ac.RichRemoteArrayMatcher');\n\ngoog.require('goog.dom');\ngoog.require('goog.ui.ac.RemoteArrayMatcher');\n\n\n\n/**\n * An array matcher that requests rich matches via ajax and converts them into\n * rich rows.\n *\n * @param {string} url The Uri which generates the auto complete matches.  The\n *     search term is passed to the server as the 'token' query param.\n * @param {boolean=} opt_noSimilar If true, request that the server does not do\n *     similarity matches for the input token against the dictionary.\n *     The value is sent to the server as the 'use_similar' query param which is\n *     either \"1\" (opt_noSimilar==false) or \"0\" (opt_noSimilar==true).\n * @constructor\n * @extends {goog.ui.ac.RemoteArrayMatcher}\n */\ngoog.ui.ac.RichRemoteArrayMatcher = function(url, opt_noSimilar) {\n  goog.ui.ac.RemoteArrayMatcher.call(this, url, opt_noSimilar);\n\n  /**\n   * A function(rows) that is called before the array matches are returned.\n   * It runs client-side and filters the results given by the server before\n   * being rendered by the client.\n   * @type {?Function}\n   * @private\n   */\n  this.rowFilter_ = null;\n\n  /**\n   * A function(type, response) converting the type and the server response to\n   * an object with two methods: render(node, token) and select(target).\n   * @private {goog.ui.ac.RichRemoteArrayMatcher.RowBuilder}\n   */\n  this.rowBuilder_ = function(type, response) {\n    return /** @type {!Object} */ (response);\n  };\n};\ngoog.inherits(goog.ui.ac.RichRemoteArrayMatcher, goog.ui.ac.RemoteArrayMatcher);\n\n\n/**\n * Set the filter that is called before the array matches are returned.\n * @param {Function} rowFilter A function(rows) that returns an array of rows as\n *     a subset of the rows input array.\n */\ngoog.ui.ac.RichRemoteArrayMatcher.prototype.setRowFilter = function(rowFilter) {\n  this.rowFilter_ = rowFilter;\n};\n\n\n/**\n * @typedef {function(string, *): {\n *   render: (function(!Element, string)|undefined),\n *   select: (function(!Element)|undefined)\n * }}\n */\ngoog.ui.ac.RichRemoteArrayMatcher.RowBuilder;\n\n\n/**\n * Sets the function building the rows.\n * @param {goog.ui.ac.RichRemoteArrayMatcher.RowBuilder} rowBuilder\n *     A function(type, response) converting the type and the server response to\n *     an object with two methods: render(node, token) and select(target).\n */\ngoog.ui.ac.RichRemoteArrayMatcher.prototype.setRowBuilder = function(\n    rowBuilder) {\n  this.rowBuilder_ = rowBuilder;\n};\n\n\n/**\n * Retrieve a set of matching rows from the server via ajax and convert them\n * into rich rows.\n * @param {string} token The text that should be matched; passed to the server\n *     as the 'token' query param.\n * @param {number} maxMatches The maximum number of matches requested from the\n *     server; passed as the 'max_matches' query param. The server is\n *     responsible for limiting the number of matches that are returned.\n * @param {Function} matchHandler Callback to execute on the result after\n *     matching.\n * @override\n */\ngoog.ui.ac.RichRemoteArrayMatcher.prototype.requestMatchingRows = function(\n    token, maxMatches, matchHandler) {\n  // The RichRemoteArrayMatcher must map over the results and filter them\n  // before calling the request matchHandler.  This is done by passing\n  // myMatchHandler to RemoteArrayMatcher.requestMatchingRows which maps,\n  // filters, and then calls matchHandler.\n  var myMatchHandler = goog.bind(function(token, matches) {\n\n    try {\n      var rows = [];\n      for (var i = 0; i < matches.length; i++) {\n        for (var j = 1; j < matches[i].length; j++) {\n          var richRow = this.rowBuilder_(matches[i][0], matches[i][j]);\n          rows.push(richRow);\n\n          // If no render function was provided, set the node's textContent.\n          if (typeof richRow.render == 'undefined') {\n            richRow.render = function(node, token) {\n              goog.dom.setTextContent(node, richRow.toString());\n            };\n          }\n\n          // If no select function was provided, set the text of the input.\n          if (typeof richRow.select == 'undefined') {\n            richRow.select = function(target) {\n              target.value = richRow.toString();\n            };\n          }\n        }\n      }\n      if (this.rowFilter_) {\n        rows = this.rowFilter_(rows);\n      }\n      matchHandler(token, rows);\n    } catch (exception) {\n      // TODO(user): Is this what we want?\n      matchHandler(token, []);\n    }\n  }, this);\n\n  // Call the super's requestMatchingRows with myMatchHandler\n  goog.ui.ac.RichRemoteArrayMatcher.superClass_.requestMatchingRows.call(\n      this, token, maxMatches, myMatchHandler);\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","^9>","^I5"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/ac/richremotearraymatcher.js"],"^:1",["^9K",["~$goog.ui.ac.RichRemoteArrayMatcher"]],"^9<",true,"^9=",["^9>","^;;","^I5"]],["^ ","^9A",[1579837703000],"^9B","goog.html.safestyle.js","^9C",["^9D","goog/html/safestyle.js"],"^9E","goog/html/safestyle.js","^9F","^9G","^9H","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The SafeStyle type and its builders.\n *\n * TODO(xtof): Link to document stating type contract.\n */\n\ngoog.provide('goog.html.SafeStyle');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.html.SafeUrl');\ngoog.require('goog.string.Const');\ngoog.require('goog.string.TypedString');\ngoog.require('goog.string.internal');\n\n\n\n/**\n * A string-like object which represents a sequence of CSS declarations\n * ({@code propertyName1: propertyvalue1; propertyName2: propertyValue2; ...})\n * and that carries the security type contract that its value, as a string,\n * will not cause untrusted script execution (XSS) when evaluated as CSS in a\n * browser.\n *\n * Instances of this type must be created via the factory methods\n * (`goog.html.SafeStyle.create` or\n * `goog.html.SafeStyle.fromConstant`) and not by invoking its\n * constructor. The constructor intentionally takes no parameters and the type\n * is immutable; hence only a default instance corresponding to the empty string\n * can be obtained via constructor invocation.\n *\n * SafeStyle's string representation can safely be:\n * <ul>\n *   <li>Interpolated as the content of a *quoted* HTML style attribute.\n *       However, the SafeStyle string *must be HTML-attribute-escaped* before\n *       interpolation.\n *   <li>Interpolated as the content of a {}-wrapped block within a stylesheet.\n *       '<' characters in the SafeStyle string *must be CSS-escaped* before\n *       interpolation. The SafeStyle string is also guaranteed not to be able\n *       to introduce new properties or elide existing ones.\n *   <li>Interpolated as the content of a {}-wrapped block within an HTML\n *       &lt;style&gt; element. '<' characters in the SafeStyle string\n *       *must be CSS-escaped* before interpolation.\n *   <li>Assigned to the style property of a DOM node. The SafeStyle string\n *       should not be escaped before being assigned to the property.\n * </ul>\n *\n * A SafeStyle may never contain literal angle brackets. Otherwise, it could\n * be unsafe to place a SafeStyle into a &lt;style&gt; tag (where it can't\n * be HTML escaped). For example, if the SafeStyle containing\n * \"{@code font: 'foo &lt;style/&gt;&lt;script&gt;evil&lt;/script&gt;'}\" were\n * interpolated within a &lt;style&gt; tag, this would then break out of the\n * style context into HTML.\n *\n * A SafeStyle may contain literal single or double quotes, and as such the\n * entire style string must be escaped when used in a style attribute (if\n * this were not the case, the string could contain a matching quote that\n * would escape from the style attribute).\n *\n * Values of this type must be composable, i.e. for any two values\n * `style1` and `style2` of this type,\n * {@code goog.html.SafeStyle.unwrap(style1) +\n * goog.html.SafeStyle.unwrap(style2)} must itself be a value that satisfies\n * the SafeStyle type constraint. This requirement implies that for any value\n * `style` of this type, `goog.html.SafeStyle.unwrap(style)` must\n * not end in a \"property value\" or \"property name\" context. For example,\n * a value of {@code background:url(\"} or {@code font-} would not satisfy the\n * SafeStyle contract. This is because concatenating such strings with a\n * second value that itself does not contain unsafe CSS can result in an\n * overall string that does. For example, if {@code javascript:evil())\"} is\n * appended to {@code background:url(\"}, the resulting string may result in\n * the execution of a malicious script.\n *\n * TODO(mlourenco): Consider whether we should implement UTF-8 interchange\n * validity checks and blacklisting of newlines (including Unicode ones) and\n * other whitespace characters (\\t, \\f). Document here if so and also update\n * SafeStyle.fromConstant().\n *\n * The following example values comply with this type's contract:\n * <ul>\n *   <li><pre>width: 1em;</pre>\n *   <li><pre>height:1em;</pre>\n *   <li><pre>width: 1em;height: 1em;</pre>\n *   <li><pre>background:url('http://url');</pre>\n * </ul>\n * In addition, the empty string is safe for use in a CSS attribute.\n *\n * The following example values do NOT comply with this type's contract:\n * <ul>\n *   <li><pre>background: red</pre> (missing a trailing semi-colon)\n *   <li><pre>background:</pre> (missing a value and a trailing semi-colon)\n *   <li><pre>1em</pre> (missing an attribute name, which provides context for\n *       the value)\n * </ul>\n *\n * @see goog.html.SafeStyle#create\n * @see goog.html.SafeStyle#fromConstant\n * @see http://www.w3.org/TR/css3-syntax/\n * @constructor\n * @final\n * @struct\n * @implements {goog.string.TypedString}\n */\ngoog.html.SafeStyle = function() {\n  /**\n   * The contained value of this SafeStyle.  The field has a purposely\n   * ugly name to make (non-compiled) code that attempts to directly access this\n   * field stand out.\n   * @private {string}\n   */\n  this.privateDoNotAccessOrElseSafeStyleWrappedValue_ = '';\n\n  /**\n   * A type marker used to implement additional run-time type checking.\n   * @see goog.html.SafeStyle#unwrap\n   * @const {!Object}\n   * @private\n   */\n  this.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =\n      goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;\n};\n\n\n/**\n * @override\n * @const\n */\ngoog.html.SafeStyle.prototype.implementsGoogStringTypedString = true;\n\n\n/**\n * Type marker for the SafeStyle type, used to implement additional\n * run-time type checking.\n * @const {!Object}\n * @private\n */\ngoog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};\n\n\n/**\n * Creates a SafeStyle object from a compile-time constant string.\n *\n * `style` should be in the format\n * {@code name: value; [name: value; ...]} and must not have any < or >\n * characters in it. This is so that SafeStyle's contract is preserved,\n * allowing the SafeStyle to correctly be interpreted as a sequence of CSS\n * declarations and without affecting the syntactic structure of any\n * surrounding CSS and HTML.\n *\n * This method performs basic sanity checks on the format of `style`\n * but does not constrain the format of `name` and `value`, except\n * for disallowing tag characters.\n *\n * @param {!goog.string.Const} style A compile-time-constant string from which\n *     to create a SafeStyle.\n * @return {!goog.html.SafeStyle} A SafeStyle object initialized to\n *     `style`.\n */\ngoog.html.SafeStyle.fromConstant = function(style) {\n  var styleString = goog.string.Const.unwrap(style);\n  if (styleString.length === 0) {\n    return goog.html.SafeStyle.EMPTY;\n  }\n  goog.asserts.assert(\n      goog.string.internal.endsWith(styleString, ';'),\n      'Last character of style string is not \\';\\': ' + styleString);\n  goog.asserts.assert(\n      goog.string.internal.contains(styleString, ':'),\n      'Style string must contain at least one \\':\\', to ' +\n          'specify a \"name: value\" pair: ' + styleString);\n  return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(\n      styleString);\n};\n\n\n/**\n * Returns this SafeStyle's value as a string.\n *\n * IMPORTANT: In code where it is security relevant that an object's type is\n * indeed `SafeStyle`, use `goog.html.SafeStyle.unwrap` instead of\n * this method. If in doubt, assume that it's security relevant. In particular,\n * note that goog.html functions which return a goog.html type do not guarantee\n * the returned instance is of the right type. For example:\n *\n * <pre>\n * var fakeSafeHtml = new String('fake');\n * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;\n * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);\n * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by\n * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml\n * // instanceof goog.html.SafeHtml.\n * </pre>\n *\n * @see goog.html.SafeStyle#unwrap\n * @override\n */\ngoog.html.SafeStyle.prototype.getTypedStringValue = function() {\n  return this.privateDoNotAccessOrElseSafeStyleWrappedValue_;\n};\n\n\nif (goog.DEBUG) {\n  /**\n   * Returns a debug string-representation of this value.\n   *\n   * To obtain the actual string value wrapped in a SafeStyle, use\n   * `goog.html.SafeStyle.unwrap`.\n   *\n   * @see goog.html.SafeStyle#unwrap\n   * @override\n   */\n  goog.html.SafeStyle.prototype.toString = function() {\n    return 'SafeStyle{' + this.privateDoNotAccessOrElseSafeStyleWrappedValue_ +\n        '}';\n  };\n}\n\n\n/**\n * Performs a runtime check that the provided object is indeed a\n * SafeStyle object, and returns its value.\n *\n * @param {!goog.html.SafeStyle} safeStyle The object to extract from.\n * @return {string} The safeStyle object's contained string, unless\n *     the run-time type check fails. In that case, `unwrap` returns an\n *     innocuous string, or, if assertions are enabled, throws\n *     `goog.asserts.AssertionError`.\n */\ngoog.html.SafeStyle.unwrap = function(safeStyle) {\n  // Perform additional Run-time type-checking to ensure that\n  // safeStyle is indeed an instance of the expected type.  This\n  // provides some additional protection against security bugs due to\n  // application code that disables type checks.\n  // Specifically, the following checks are performed:\n  // 1. The object is an instance of the expected type.\n  // 2. The object is not an instance of a subclass.\n  // 3. The object carries a type marker for the expected type. \"Faking\" an\n  // object requires a reference to the type marker, which has names intended\n  // to stand out in code reviews.\n  if (safeStyle instanceof goog.html.SafeStyle &&\n      safeStyle.constructor === goog.html.SafeStyle &&\n      safeStyle.SAFE_STYLE_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===\n          goog.html.SafeStyle.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {\n    return safeStyle.privateDoNotAccessOrElseSafeStyleWrappedValue_;\n  } else {\n    goog.asserts.fail('expected object of type SafeStyle, got \\'' +\n        safeStyle + '\\' of type ' + goog.typeOf(safeStyle));\n    return 'type_error:SafeStyle';\n  }\n};\n\n\n/**\n * Package-internal utility method to create SafeStyle instances.\n *\n * @param {string} style The string to initialize the SafeStyle object with.\n * @return {!goog.html.SafeStyle} The initialized SafeStyle object.\n * @package\n */\ngoog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse = function(\n    style) {\n  return new goog.html.SafeStyle().initSecurityPrivateDoNotAccessOrElse_(style);\n};\n\n\n/**\n * Called from createSafeStyleSecurityPrivateDoNotAccessOrElse(). This\n * method exists only so that the compiler can dead code eliminate static\n * fields (like EMPTY) when they're not accessed.\n * @param {string} style\n * @return {!goog.html.SafeStyle}\n * @private\n */\ngoog.html.SafeStyle.prototype.initSecurityPrivateDoNotAccessOrElse_ = function(\n    style) {\n  this.privateDoNotAccessOrElseSafeStyleWrappedValue_ = style;\n  return this;\n};\n\n\n/**\n * A SafeStyle instance corresponding to the empty string.\n * @const {!goog.html.SafeStyle}\n */\ngoog.html.SafeStyle.EMPTY =\n    goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse('');\n\n\n/**\n * The innocuous string generated by goog.html.SafeStyle.create when passed\n * an unsafe value.\n * @const {string}\n */\ngoog.html.SafeStyle.INNOCUOUS_STRING = 'zClosurez';\n\n\n/**\n * A single property value.\n * @typedef {string|!goog.string.Const|!goog.html.SafeUrl}\n */\ngoog.html.SafeStyle.PropertyValue;\n\n\n/**\n * Mapping of property names to their values.\n * We don't support numbers even though some values might be numbers (e.g.\n * line-height or 0 for any length). The reason is that most numeric values need\n * units (e.g. '1px') and allowing numbers could cause users forgetting about\n * them.\n * @typedef {!Object<string, ?goog.html.SafeStyle.PropertyValue|\n *     ?Array<!goog.html.SafeStyle.PropertyValue>>}\n */\ngoog.html.SafeStyle.PropertyMap;\n\n\n/**\n * Creates a new SafeStyle object from the properties specified in the map.\n * @param {goog.html.SafeStyle.PropertyMap} map Mapping of property names to\n *     their values, for example {'margin': '1px'}. Names must consist of\n *     [-_a-zA-Z0-9]. Values might be strings consisting of\n *     [-,.'\"%_!# a-zA-Z0-9[\\]], where \", ', and [] must be properly balanced.\n *     We also allow simple functions like rgb() and url() which sanitizes its\n *     contents. Other values must be wrapped in goog.string.Const. URLs might\n *     be passed as goog.html.SafeUrl which will be wrapped into url(\"\"). We\n *     also support array whose elements are joined with ' '. Null value causes\n *     skipping the property.\n * @return {!goog.html.SafeStyle}\n * @throws {Error} If invalid name is provided.\n * @throws {goog.asserts.AssertionError} If invalid value is provided. With\n *     disabled assertions, invalid value is replaced by\n *     goog.html.SafeStyle.INNOCUOUS_STRING.\n */\ngoog.html.SafeStyle.create = function(map) {\n  var style = '';\n  for (var name in map) {\n    if (!/^[-_a-zA-Z0-9]+$/.test(name)) {\n      throw new Error('Name allows only [-_a-zA-Z0-9], got: ' + name);\n    }\n    var value = map[name];\n    if (value == null) {\n      continue;\n    }\n    if (goog.isArray(value)) {\n      value = goog.array.map(value, goog.html.SafeStyle.sanitizePropertyValue_)\n                  .join(' ');\n    } else {\n      value = goog.html.SafeStyle.sanitizePropertyValue_(value);\n    }\n    style += name + ':' + value + ';';\n  }\n  if (!style) {\n    return goog.html.SafeStyle.EMPTY;\n  }\n  return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(\n      style);\n};\n\n\n/**\n * Checks and converts value to string.\n * @param {!goog.html.SafeStyle.PropertyValue} value\n * @return {string}\n * @private\n */\ngoog.html.SafeStyle.sanitizePropertyValue_ = function(value) {\n  if (value instanceof goog.html.SafeUrl) {\n    var url = goog.html.SafeUrl.unwrap(value);\n    return 'url(\"' + url.replace(/</g, '%3c').replace(/[\\\\\"]/g, '\\\\$&') + '\")';\n  }\n  var result = value instanceof goog.string.Const ?\n      goog.string.Const.unwrap(value) :\n      goog.html.SafeStyle.sanitizePropertyValueString_(String(value));\n  // These characters can be used to change context and we don't want that even\n  // with const values.\n  if (/[{;}]/.test(result)) {\n    throw new goog.asserts.AssertionError(\n        'Value does not allow [{;}], got: %s.', [result]);\n  }\n  return result;\n};\n\n\n/**\n * Checks string value.\n * @param {string} value\n * @return {string}\n * @private\n */\ngoog.html.SafeStyle.sanitizePropertyValueString_ = function(value) {\n  // Some CSS property values permit nested functions. We allow one level of\n  // nesting, and all nested functions must also be in the FUNCTIONS_RE_ list.\n  var valueWithoutFunctions =\n      value.replace(goog.html.SafeStyle.FUNCTIONS_RE_, '$1')\n          .replace(goog.html.SafeStyle.FUNCTIONS_RE_, '$1')\n          .replace(goog.html.SafeStyle.URL_RE_, 'url');\n  if (!goog.html.SafeStyle.VALUE_RE_.test(valueWithoutFunctions)) {\n    goog.asserts.fail(\n        'String value allows only ' + goog.html.SafeStyle.VALUE_ALLOWED_CHARS_ +\n        ' and simple functions, got: ' + value);\n    return goog.html.SafeStyle.INNOCUOUS_STRING;\n  } else if (goog.html.SafeStyle.COMMENT_RE_.test(value)) {\n    goog.asserts.fail('String value disallows comments, got: ' + value);\n    return goog.html.SafeStyle.INNOCUOUS_STRING;\n  } else if (!goog.html.SafeStyle.hasBalancedQuotes_(value)) {\n    goog.asserts.fail('String value requires balanced quotes, got: ' + value);\n    return goog.html.SafeStyle.INNOCUOUS_STRING;\n  } else if (!goog.html.SafeStyle.hasBalancedSquareBrackets_(value)) {\n    goog.asserts.fail(\n        'String value requires balanced square brackets and one' +\n        ' identifier per pair of brackets, got: ' + value);\n    return goog.html.SafeStyle.INNOCUOUS_STRING;\n  }\n  return goog.html.SafeStyle.sanitizeUrl_(value);\n};\n\n\n/**\n * Checks that quotes (\" and ') are properly balanced inside a string. Assumes\n * that neither escape (\\) nor any other character that could result in\n * breaking out of a string parsing context are allowed;\n * see http://www.w3.org/TR/css3-syntax/#string-token-diagram.\n * @param {string} value Untrusted CSS property value.\n * @return {boolean} True if property value is safe with respect to quote\n *     balancedness.\n * @private\n */\ngoog.html.SafeStyle.hasBalancedQuotes_ = function(value) {\n  var outsideSingle = true;\n  var outsideDouble = true;\n  for (var i = 0; i < value.length; i++) {\n    var c = value.charAt(i);\n    if (c == \"'\" && outsideDouble) {\n      outsideSingle = !outsideSingle;\n    } else if (c == '\"' && outsideSingle) {\n      outsideDouble = !outsideDouble;\n    }\n  }\n  return outsideSingle && outsideDouble;\n};\n\n\n/**\n * Checks that square brackets ([ and ]) are properly balanced inside a string,\n * and that the content in the square brackets is one ident-token;\n * see https://www.w3.org/TR/css-syntax-3/#ident-token-diagram.\n * For practicality, and in line with other restrictions posed on SafeStyle\n * strings, we restrict the character set allowable in the ident-token to\n * [-_a-zA-Z0-9].\n * @param {string} value Untrusted CSS property value.\n * @return {boolean} True if property value is safe with respect to square\n *     bracket balancedness.\n * @private\n */\ngoog.html.SafeStyle.hasBalancedSquareBrackets_ = function(value) {\n  var outside = true;\n  var tokenRe = /^[-_a-zA-Z0-9]$/;\n  for (var i = 0; i < value.length; i++) {\n    var c = value.charAt(i);\n    if (c == ']') {\n      if (outside) return false;  // Unbalanced ].\n      outside = true;\n    } else if (c == '[') {\n      if (!outside) return false;  // No nesting.\n      outside = false;\n    } else if (!outside && !tokenRe.test(c)) {\n      return false;\n    }\n  }\n  return outside;\n};\n\n\n/**\n * Characters allowed in goog.html.SafeStyle.VALUE_RE_.\n * @private {string}\n */\ngoog.html.SafeStyle.VALUE_ALLOWED_CHARS_ = '[-,.\"\\'%_!# a-zA-Z0-9\\\\[\\\\]]';\n\n\n/**\n * Regular expression for safe values.\n *\n * Quotes (\" and ') are allowed, but a check must be done elsewhere to ensure\n * they're balanced.\n *\n * Square brackets ([ and ]) are allowed, but a check must be done elsewhere\n * to ensure they're balanced. The content inside a pair of square brackets must\n * be one alphanumeric identifier.\n *\n * ',' allows multiple values to be assigned to the same property\n * (e.g. background-attachment or font-family) and hence could allow\n * multiple values to get injected, but that should pose no risk of XSS.\n *\n * The expression checks only for XSS safety, not for CSS validity.\n * @const {!RegExp}\n * @private\n */\ngoog.html.SafeStyle.VALUE_RE_ =\n    new RegExp('^' + goog.html.SafeStyle.VALUE_ALLOWED_CHARS_ + '+$');\n\n\n/**\n * Regular expression for url(). We support URLs allowed by\n * https://www.w3.org/TR/css-syntax-3/#url-token-diagram without using escape\n * sequences. Use percent-encoding if you need to use special characters like\n * backslash.\n * @private @const {!RegExp}\n */\ngoog.html.SafeStyle.URL_RE_ = new RegExp(\n    '\\\\b(url\\\\([ \\t\\n]*)(' +\n        '\\'[ -&(-\\\\[\\\\]-~]*\\'' +  // Printable characters except ' and \\.\n        '|\"[ !#-\\\\[\\\\]-~]*\"' +    // Printable characters except \" and \\.\n        '|[!#-&*-\\\\[\\\\]-~]*' +    // Printable characters except [ \"'()\\\\].\n        ')([ \\t\\n]*\\\\))',\n    'g');\n\n/**\n * Names of functions allowed in FUNCTIONS_RE_.\n * @private @const {!Array<string>}\n */\ngoog.html.SafeStyle.ALLOWED_FUNCTIONS_ = [\n  'calc',\n  'cubic-bezier',\n  'fit-content',\n  'hsl',\n  'hsla',\n  'matrix',\n  'minmax',\n  'repeat',\n  'rgb',\n  'rgba',\n  '(rotate|scale|translate)(X|Y|Z|3d)?',\n];\n\n\n/**\n * Regular expression for simple functions.\n * @private @const {!RegExp}\n */\ngoog.html.SafeStyle.FUNCTIONS_RE_ = new RegExp(\n    '\\\\b(' + goog.html.SafeStyle.ALLOWED_FUNCTIONS_.join('|') + ')' +\n        '\\\\([-+*/0-9a-z.%\\\\[\\\\], ]+\\\\)',\n    'g');\n\n\n/**\n * Regular expression for comments. These are disallowed in CSS property values.\n * @private @const {!RegExp}\n */\ngoog.html.SafeStyle.COMMENT_RE_ = /\\/\\*/;\n\n\n/**\n * Sanitize URLs inside url().\n *\n * NOTE: We could also consider using CSS.escape once that's available in the\n * browsers. However, loosely matching URL e.g. with url\\(.*\\) and then escaping\n * the contents would result in a slightly different language than CSS leading\n * to confusion of users. E.g. url(\")\") is valid in CSS but it would be invalid\n * as seen by our parser. On the other hand, url(\\) is invalid in CSS but our\n * parser would be fine with it.\n *\n * @param {string} value Untrusted CSS property value.\n * @return {string}\n * @private\n */\ngoog.html.SafeStyle.sanitizeUrl_ = function(value) {\n  return value.replace(\n      goog.html.SafeStyle.URL_RE_, function(match, before, url, after) {\n        var quote = '';\n        url = url.replace(/^(['\"])(.*)\\1$/, function(match, start, inside) {\n          quote = start;\n          return inside;\n        });\n        var sanitized = goog.html.SafeUrl.sanitize(url).getTypedStringValue();\n        return before + quote + sanitized + quote + after;\n      });\n};\n\n\n/**\n * Creates a new SafeStyle object by concatenating the values.\n * @param {...(!goog.html.SafeStyle|!Array<!goog.html.SafeStyle>)} var_args\n *     SafeStyles to concatenate.\n * @return {!goog.html.SafeStyle}\n */\ngoog.html.SafeStyle.concat = function(var_args) {\n  var style = '';\n\n  /**\n   * @param {!goog.html.SafeStyle|!Array<!goog.html.SafeStyle>} argument\n   */\n  var addArgument = function(argument) {\n    if (goog.isArray(argument)) {\n      goog.array.forEach(argument, addArgument);\n    } else {\n      style += goog.html.SafeStyle.unwrap(argument);\n    }\n  };\n\n  goog.array.forEach(arguments, addArgument);\n  if (!style) {\n    return goog.html.SafeStyle.EMPTY;\n  }\n  return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(\n      style);\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^GR","^GS","^9>","^=M","^GX","^;9"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/safestyle.js"],"^:1",["^9K",["^G3"]],"^9<",true,"^9=",["^9>","^;9","^:E","^GR","^=M","^GS","^GX"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.tags.js","^9C",["^9D","goog/dom/tags.js"],"^9E","goog/dom/tags.js","^9F","^9G","^9H","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for HTML element tag names.\n */\ngoog.provide('goog.dom.tags');\n\ngoog.require('goog.object');\n\n\n/**\n * The void elements specified by\n * http://www.w3.org/TR/html-markup/syntax.html#void-elements.\n * @const @private {!Object<string, boolean>}\n */\ngoog.dom.tags.VOID_TAGS_ = goog.object.createSet(\n    'area', 'base', 'br', 'col', 'command', 'embed', 'hr', 'img', 'input',\n    'keygen', 'link', 'meta', 'param', 'source', 'track', 'wbr');\n\n\n/**\n * Checks whether the tag is void (with no contents allowed and no legal end\n * tag), for example 'br'.\n * @param {string} tagName The tag name in lower case.\n * @return {boolean}\n */\ngoog.dom.tags.isVoidTag = function(tagName) {\n  return goog.dom.tags.VOID_TAGS_[tagName] === true;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^;P"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/tags.js"],"^:1",["^9K",["^GV"]],"^9<",true,"^9=",["^9>","^;P"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.nodeiterator.js","^9C",["^9D","goog/dom/nodeiterator.js"],"^9E","goog/dom/nodeiterator.js","^9F","^9G","^9H","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Iterator subclass for DOM tree traversal.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.NodeIterator');\n\ngoog.require('goog.dom.TagIterator');\n\n\n\n/**\n * A DOM tree traversal iterator.\n *\n * Starting with the given node, the iterator walks the DOM in order, reporting\n * events for each node.  The iterator acts as a prefix iterator:\n *\n * <pre>\n * &lt;div&gt;1&lt;span&gt;2&lt;/span&gt;3&lt;/div&gt;\n * </pre>\n *\n * Will return the following nodes:\n *\n * <code>[div, 1, span, 2, 3]</code>\n *\n * With the following depths\n *\n * <code>[1, 1, 2, 2, 1]</code>\n *\n * Imagining <code>|</code> represents iterator position, the traversal stops at\n * each of the following locations:\n *\n * <pre>&lt;div&gt;|1|&lt;span&gt;|2|&lt;/span&gt;3|&lt;/div&gt;</pre>\n *\n * The iterator can also be used in reverse mode, which will return the nodes\n * and states in the opposite order.  The depths will be slightly different\n * since, like in normal mode, the depth is computed *after* the last move.\n *\n * Lastly, it is possible to create an iterator that is unconstrained, meaning\n * that it will continue iterating until the end of the document instead of\n * until exiting the start node.\n *\n * @param {Node=} opt_node The start node.  Defaults to an empty iterator.\n * @param {boolean=} opt_reversed Whether to traverse the tree in reverse.\n * @param {boolean=} opt_unconstrained Whether the iterator is not constrained\n *     to the starting node and its children.\n * @param {number=} opt_depth The starting tree depth.\n * @constructor\n * @extends {goog.dom.TagIterator}\n * @final\n */\ngoog.dom.NodeIterator = function(\n    opt_node, opt_reversed, opt_unconstrained, opt_depth) {\n  goog.dom.TagIterator.call(\n      this, opt_node, opt_reversed, opt_unconstrained, null, opt_depth);\n};\ngoog.inherits(goog.dom.NodeIterator, goog.dom.TagIterator);\n\n\n/**\n * Moves to the next position in the DOM tree.\n * @return {Node} Returns the next node, or throws a goog.iter.StopIteration\n *     exception if the end of the iterator's range has been reached.\n * @override\n */\ngoog.dom.NodeIterator.prototype.next = function() {\n  do {\n    goog.dom.NodeIterator.superClass_.next.call(this);\n  } while (this.isEndTag());\n\n  return this.node;\n};\n","^9I",1579837703000,"^9J",["^9K",["~$goog.dom.TagIterator","^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/nodeiterator.js"],"^:1",["^9K",["~$goog.dom.NodeIterator"]],"^9<",true,"^9=",["^9>","^WN"]],["^ ","^9A",[1579837703000],"^9B","goog.html.sanitizer.unsafe.js","^9C",["^9D","goog/html/sanitizer/unsafe.js"],"^9E","goog/html/sanitizer/unsafe.js","^9F","^9G","^9H","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Potentially unsafe API for the HTML sanitizer.\n *\n * The HTML sanitizer enforces a default a safe policy, and also limits how the\n * policy can be relaxed, so that developers cannot misconfigure it and\n * introduce vulnerabilities.\n *\n * This file extends the HTML sanitizer's capabilities with potentially unsafe\n * configuration options, such as the ability to extend the tag whitelist (e.g.\n * to support web components).\n *\n * @supported IE 10+, Chrome 26+, Firefox 22+, Safari 7.1+, Opera 15+\n */\n\ngoog.provide('goog.html.sanitizer.unsafe');\n\ngoog.require('goog.asserts');\ngoog.require('goog.html.sanitizer.HtmlSanitizer.Builder');\ngoog.require('goog.string');\ngoog.require('goog.string.Const');\n\n\n/**\n * Extends the tag whitelist with the list of tags provided. If the tag is\n * blacklisted, this method also removes it from the blacklist.\n *\n * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure\n * that the new tags do not introduce untrusted code execution or unsanctioned\n * network activity.\n *\n * @param {!goog.string.Const} justification A constant string explaining why\n *     the addition of these tags to the whitelist is safe. May include a\n *     security review ticket number.\n * @param {!goog.html.sanitizer.HtmlSanitizer.Builder} builder The builder\n *     whose tag whitelist should be extended.\n * @param {!Array<string>} tags A list of additional tags to allow through the\n *     sanitizer. The tag names are case-insensitive.\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n */\ngoog.html.sanitizer.unsafe.alsoAllowTags = function(\n    justification, builder, tags) {\n  goog.asserts.assertString(\n      goog.string.Const.unwrap(justification), 'must provide justification');\n  goog.asserts.assert(\n      !goog.string.isEmptyOrWhitespace(goog.string.Const.unwrap(justification)),\n      'must provide non-empty justification');\n  return builder.alsoAllowTagsPrivateDoNotAccessOrElse(tags);\n};\n\n/**\n * Installs custom attribute policies for the attributes provided in the list.\n * This can be used either on non-whitelisted attributes, effectively extending\n * the attribute whitelist, or on attributes that are whitelisted and already\n * have a policy, to override their policies.\n *\n * IMPORTANT: Uses of this method must be carefully security-reviewed to ensure\n * that the new tags do not introduce untrusted code execution or unsanctioned\n * network activity.\n *\n * @param {!goog.string.Const} justification A constant string explaining why\n *     the addition of these attributes to the whitelist is safe. May include a\n *     security review ticket number.\n * @param {!goog.html.sanitizer.HtmlSanitizer.Builder} builder The builder\n *     whose attribute whitelist should be extended.\n * @param {!Array<(string|!goog.html.sanitizer.HtmlSanitizerAttributePolicy)>}\n *     attrs A list of attributes whose policy should be overridden. Attributes\n *     can come in of two forms:\n *     - string: allow all values and just trim whitespaces for this attribute\n *         on all tags.\n *     - HtmlSanitizerAttributePolicy: allows specifying a policy for a\n *         particular tag. The tagName can be '*', which means all tags. If no\n *         policy is passed, the default is allow all values and just trim\n *         whitespaces.\n *     The tag and attribute names are case-insensitive.\n * @return {!goog.html.sanitizer.HtmlSanitizer.Builder}\n */\ngoog.html.sanitizer.unsafe.alsoAllowAttributes = function(\n    justification, builder, attrs) {\n  goog.asserts.assertString(\n      goog.string.Const.unwrap(justification), 'must provide justification');\n  goog.asserts.assert(\n      !goog.string.isEmptyOrWhitespace(goog.string.Const.unwrap(justification)),\n      'must provide non-empty justification');\n  return builder.alsoAllowAttributesPrivateDoNotAccessOrElse(attrs);\n};\n","^9I",1579837703000,"^9J",["^9K",["^:E","^9L","^9>","^=M","^M8"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/sanitizer/unsafe.js"],"^:1",["^9K",["~$goog.html.sanitizer.unsafe"]],"^9<",true,"^9=",["^9>","^:E","^M8","^9L","^=M"]],["^ ","^9A",[1579837703000],"^9B","goog.labs.net.webchannel.webchanneldebug.js","^9C",["^9D","goog/labs/net/webchannel/webchanneldebug.js"],"^9E","goog/labs/net/webchannel/webchanneldebug.js","^9F","^9G","^9H","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a utility for tracing and debugging WebChannel\n *     requests.\n */\n\n\ngoog.provide('goog.labs.net.webChannel.WebChannelDebug');\n\ngoog.forwardDeclare('goog.Uri');\ngoog.forwardDeclare('goog.net.XmlHttp.ReadyState');\ngoog.require('goog.json');\ngoog.require('goog.log');\n\n\n\n/**\n * Logs and keeps a buffer of debugging info for the Channel.\n *\n * @constructor\n * @struct\n * @final\n */\ngoog.labs.net.webChannel.WebChannelDebug = function() {\n  /**\n   * The logger instance.\n   * @const\n   * @private {?goog.log.Logger}\n   */\n  this.logger_ = goog.log.getLogger('goog.labs.net.webChannel.WebChannelDebug');\n\n  /**\n   * Whether to enable redact. Defaults to true.\n   * @private {boolean}\n   */\n  this.redactEnabled_ = true;\n};\n\n\ngoog.scope(function() {\nvar WebChannelDebug = goog.labs.net.webChannel.WebChannelDebug;\n\n\n/**\n * Turns off redact.\n */\nWebChannelDebug.prototype.disableRedact = function() {\n  this.redactEnabled_ = false;\n};\n\n\n/**\n * Logs that the browser went offline during the lifetime of a request.\n * @param {goog.Uri} url The URL being requested.\n */\nWebChannelDebug.prototype.browserOfflineResponse = function(url) {\n  this.info(function() {\n    return 'BROWSER_OFFLINE: ' + url;\n  });\n};\n\n\n/**\n * Logs an XmlHttp request..\n * @param {string} verb The request type (GET/POST).\n * @param {goog.Uri} uri The request destination.\n * @param {string|number|undefined} id The request id.\n * @param {number} attempt Which attempt # the request was.\n * @param {?string} postData The data posted in the request.\n */\nWebChannelDebug.prototype.xmlHttpChannelRequest = function(\n    verb, uri, id, attempt, postData) {\n  var self = this;\n  this.info(function() {\n    return 'XMLHTTP REQ (' + id + ') [attempt ' + attempt + ']: ' + verb +\n        '\\n' + uri + '\\n' + self.maybeRedactPostData_(postData);\n  });\n};\n\n\n/**\n * Logs the meta data received from an XmlHttp request.\n * @param {string} verb The request type (GET/POST).\n * @param {goog.Uri} uri The request destination.\n * @param {string|number|undefined} id The request id.\n * @param {number} attempt Which attempt # the request was.\n * @param {goog.net.XmlHttp.ReadyState} readyState The ready state.\n * @param {number} statusCode The HTTP status code.\n */\nWebChannelDebug.prototype.xmlHttpChannelResponseMetaData = function(\n    verb, uri, id, attempt, readyState, statusCode) {\n  this.info(function() {\n    return 'XMLHTTP RESP (' + id + ') [ attempt ' + attempt + ']: ' + verb +\n        '\\n' + uri + '\\n' + readyState + ' ' + statusCode;\n  });\n};\n\n\n/**\n * Logs the response data received from an XmlHttp request.\n * @param {string|number|undefined} id The request id.\n * @param {?string} responseText The response text.\n * @param {?string=} opt_desc Optional request description.\n */\nWebChannelDebug.prototype.xmlHttpChannelResponseText = function(\n    id, responseText, opt_desc) {\n  var self = this;\n  this.info(function() {\n    return 'XMLHTTP TEXT (' + id + '): ' + self.redactResponse_(responseText) +\n        (opt_desc ? ' ' + opt_desc : '');\n  });\n};\n\n\n/**\n * Logs a request timeout.\n * @param {goog.Uri} uri The uri that timed out.\n */\nWebChannelDebug.prototype.timeoutResponse = function(uri) {\n  this.info(function() {\n    return 'TIMEOUT: ' + uri;\n  });\n};\n\n\n/**\n * Logs a debug message.\n * @param {!goog.debug.Loggable} text The message.\n */\nWebChannelDebug.prototype.debug = function(text) {\n  goog.log.fine(this.logger_, text);\n};\n\n\n/**\n * Logs an exception\n * @param {Error} e The error or error event.\n * @param {goog.debug.Loggable=} opt_msg The optional message,\n *     defaults to 'Exception'.\n */\nWebChannelDebug.prototype.dumpException = function(e, opt_msg) {\n  goog.log.error(this.logger_, opt_msg || 'Exception', e);\n};\n\n\n/**\n * Logs an info message.\n * @param {!goog.debug.Loggable} text The message.\n */\nWebChannelDebug.prototype.info = function(text) {\n  goog.log.info(this.logger_, text);\n};\n\n\n/**\n * Logs a warning message.\n * @param {!goog.debug.Loggable} text The message.\n */\nWebChannelDebug.prototype.warning = function(text) {\n  goog.log.warning(this.logger_, text);\n};\n\n\n/**\n * Logs a severe message.\n * @param {!goog.debug.Loggable} text The message.\n */\nWebChannelDebug.prototype.severe = function(text) {\n  goog.log.error(this.logger_, text);\n};\n\n\n/**\n * Removes potentially private data from a response so that we don't\n * accidentally save private and personal data to the server logs.\n * @param {?string} responseText A JSON response to clean.\n * @return {?string} The cleaned response.\n * @private\n */\nWebChannelDebug.prototype.redactResponse_ = function(responseText) {\n  if (!this.redactEnabled_) {\n    return responseText;\n  }\n\n  if (!responseText) {\n    return null;\n  }\n\n  try {\n    var responseArray = JSON.parse(responseText);\n    if (responseArray) {\n      for (var i = 0; i < responseArray.length; i++) {\n        if (goog.isArray(responseArray[i])) {\n          this.maybeRedactArray_(responseArray[i]);\n        }\n      }\n    }\n\n    return goog.json.serialize(responseArray);\n  } catch (e) {\n    this.debug('Exception parsing expected JS array - probably was not JS');\n    return responseText;\n  }\n};\n\n\n/**\n * Removes data from a response array that may be sensitive.\n * @param {!Array<?>} array The array to clean.\n * @private\n */\nWebChannelDebug.prototype.maybeRedactArray_ = function(array) {\n  if (array.length < 2) {\n    return;\n  }\n  var dataPart = array[1];\n  if (!goog.isArray(dataPart)) {\n    return;\n  }\n  if (dataPart.length < 1) {\n    return;\n  }\n\n  var type = dataPart[0];\n  if (type != 'noop' && type != 'stop' && type != 'close') {\n    // redact all fields in the array\n    for (var i = 1; i < dataPart.length; i++) {\n      dataPart[i] = '';\n    }\n  }\n};\n\n\n/**\n * Removes potentially private data from a request POST body so that we don't\n * accidentally save private and personal data to the server logs.\n * @param {?string} data The data string to clean.\n * @return {?string} The data string with sensitive data replaced by 'redacted'.\n * @private\n */\nWebChannelDebug.prototype.maybeRedactPostData_ = function(data) {\n  if (!this.redactEnabled_) {\n    return data;\n  }\n\n  if (!data) {\n    return null;\n  }\n  var out = '';\n  var params = data.split('&');\n  for (var i = 0; i < params.length; i++) {\n    var param = params[i];\n    var keyValue = param.split('=');\n    if (keyValue.length > 1) {\n      var key = keyValue[0];\n      var value = keyValue[1];\n\n      var keyParts = key.split('_');\n      if (keyParts.length >= 2 && keyParts[1] == 'type') {\n        out += key + '=' + value + '&';\n      } else {\n        out += key + '=' +\n            'redacted' +\n            '&';\n      }\n    }\n  }\n  return out;\n};\n});  // goog.scope\n","^9I",1579837703000,"^9J",["^9K",["^<A","^9>","^;Q"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchannel/webchanneldebug.js"],"^:1",["^9K",["^VF"]],"^9<",true,"^9=",["^9>","^<A","^;Q"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.htmlelement.js","^9C",["^9D","goog/dom/htmlelement.js"],"^9E","goog/dom/htmlelement.js","^9F","^9G","^9H","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.dom.HtmlElement');\n\n\n\n/**\n * This subclass of HTMLElement is used when only a HTMLElement is possible and\n * not any of its subclasses. Normally, a type can refer to an instance of\n * itself or an instance of any subtype. More concretely, if HTMLElement is used\n * then the compiler must assume that it might still be e.g. HTMLScriptElement.\n * With this, the type check knows that it couldn't be any special element.\n *\n * @constructor\n * @extends {HTMLElement}\n */\ngoog.dom.HtmlElement = function() {};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/htmlelement.js"],"^:1",["^9K",["^LE"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.graphics.ext.element.js","^9C",["^9D","goog/graphics/ext/element.js"],"^9E","goog/graphics/ext/element.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A thicker wrapper around the DOM element returned from\n * the different draw methods of the graphics implementation, and\n * all interfaces that the various element types support.\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.graphics.ext.Element');\n\ngoog.forwardDeclare('goog.graphics.AbstractGraphics');\ngoog.forwardDeclare('goog.graphics.Element');\ngoog.forwardDeclare('goog.graphics.ext.Graphics');\ngoog.forwardDeclare('goog.graphics.ext.Group');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.functions');\ngoog.require('goog.graphics.ext.coordinates');\n\n\n\n/**\n * Base class for a wrapper around the goog.graphics wrapper that enables\n * more advanced functionality.\n * @param {goog.graphics.ext.Group?} group Parent for this element.\n * @param {goog.graphics.Element} wrapper The thin wrapper to wrap.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.graphics.ext.Element = function(group, wrapper) {\n  goog.events.EventTarget.call(this);\n  this.wrapper_ = wrapper;\n  this.graphics_ = group ? group.getGraphics() : this;\n\n  this.xPosition_ = new goog.graphics.ext.Element.Position_(this, true);\n  this.yPosition_ = new goog.graphics.ext.Element.Position_(this, false);\n\n  // Handle parent / child relationships.\n  if (group) {\n    this.parent_ = group;\n    this.parent_.addChild(this);\n  }\n};\ngoog.inherits(goog.graphics.ext.Element, goog.events.EventTarget);\n\n\n/**\n * The graphics object that contains this element.\n * @type {goog.graphics.ext.Graphics|goog.graphics.ext.Element}\n * @private\n */\ngoog.graphics.ext.Element.prototype.graphics_;\n\n\n/**\n * The goog.graphics wrapper this class wraps.\n * @type {goog.graphics.Element}\n * @private\n */\ngoog.graphics.ext.Element.prototype.wrapper_;\n\n\n/**\n * The group or surface containing this element.\n * @type {goog.graphics.ext.Group|undefined}\n * @private\n */\ngoog.graphics.ext.Element.prototype.parent_;\n\n\n/**\n * Whether or not computation of this element's position or size depends on its\n * parent's size.\n * @type {boolean}\n * @private\n */\ngoog.graphics.ext.Element.prototype.parentDependent_ = false;\n\n\n/**\n * Whether the element has pending transformations.\n * @type {boolean}\n * @private\n */\ngoog.graphics.ext.Element.prototype.needsTransform_ = false;\n\n\n/**\n * The current angle of rotation, expressed in degrees.\n * @type {number}\n * @private\n */\ngoog.graphics.ext.Element.prototype.rotation_ = 0;\n\n\n/**\n * Object representing the x position and size of the element.\n * @type {goog.graphics.ext.Element.Position_}\n * @private\n */\ngoog.graphics.ext.Element.prototype.xPosition_;\n\n\n/**\n * Object representing the y position and size of the element.\n * @type {goog.graphics.ext.Element.Position_}\n * @private\n */\ngoog.graphics.ext.Element.prototype.yPosition_;\n\n\n/** @return {goog.graphics.Element} The underlying thin wrapper. */\ngoog.graphics.ext.Element.prototype.getWrapper = function() {\n  return this.wrapper_;\n};\n\n\n/**\n * @return {goog.graphics.ext.Element|goog.graphics.ext.Graphics} The graphics\n *     surface the element is a part of.\n */\ngoog.graphics.ext.Element.prototype.getGraphics = function() {\n  return this.graphics_;\n};\n\n\n/**\n * Returns the graphics implementation.\n * @return {goog.graphics.AbstractGraphics} The underlying graphics\n *     implementation drawing this element's wrapper.\n * @protected\n */\ngoog.graphics.ext.Element.prototype.getGraphicsImplementation = function() {\n  return this.graphics_.getImplementation();\n};\n\n\n/**\n * @return {goog.graphics.ext.Group|undefined} The parent of this element.\n */\ngoog.graphics.ext.Element.prototype.getParent = function() {\n  return this.parent_;\n};\n\n\n// GENERAL POSITIONING\n\n\n/**\n * Internal convenience method for setting position - either as a left/top,\n * center/middle, or right/bottom value.  Only one should be specified.\n * @param {goog.graphics.ext.Element.Position_} position The position object to\n *     set the value on.\n * @param {number|string} value The value of the coordinate.\n * @param {goog.graphics.ext.Element.PositionType_} type The type of the\n *     coordinate.\n * @param {boolean=} opt_chain Optional flag to specify this function is part\n *     of a chain of calls and therefore transformations should be set as\n *     pending but not yet performed.\n * @private\n */\ngoog.graphics.ext.Element.prototype.setPosition_ = function(\n    position, value, type, opt_chain) {\n  position.setPosition(value, type);\n  this.computeIsParentDependent_(position);\n\n  this.needsTransform_ = true;\n  if (!opt_chain) {\n    this.transform();\n  }\n};\n\n\n/**\n * Sets the width/height of the element.\n * @param {goog.graphics.ext.Element.Position_} position The position object to\n *     set the value on.\n * @param {string|number} size The new width/height value.\n * @param {boolean=} opt_chain Optional flag to specify this function is part\n *     of a chain of calls and therefore transformations should be set as\n *     pending but not yet performed.\n * @private\n */\ngoog.graphics.ext.Element.prototype.setSize_ = function(\n    position, size, opt_chain) {\n  if (position.setSize(size)) {\n    this.needsTransform_ = true;\n\n    this.computeIsParentDependent_(position);\n\n    if (!opt_chain) {\n      this.reset();\n    }\n  } else if (!opt_chain && this.isPendingTransform()) {\n    this.reset();\n  }\n};\n\n\n/**\n * Sets the minimum width/height of the element.\n * @param {goog.graphics.ext.Element.Position_} position The position object to\n *     set the value on.\n * @param {string|number} minSize The minimum width/height of the element.\n * @private\n */\ngoog.graphics.ext.Element.prototype.setMinSize_ = function(position, minSize) {\n  position.setMinSize(minSize);\n  this.needsTransform_ = true;\n  this.computeIsParentDependent_(position);\n};\n\n\n// HORIZONTAL POSITIONING\n\n\n/**\n * @return {number} The distance from the left edge of this element to the left\n *     edge of its parent, specified in units of the parent's coordinate system.\n */\ngoog.graphics.ext.Element.prototype.getLeft = function() {\n  return this.xPosition_.getStart();\n};\n\n\n/**\n * Sets the left coordinate of the element.  Overwrites any previous value of\n * left, center, or right for this element.\n * @param {string|number} left The left coordinate.\n * @param {boolean=} opt_chain Optional flag to specify this function is part\n *     of a chain of calls and therefore transformations should be set as\n *     pending but not yet performed.\n */\ngoog.graphics.ext.Element.prototype.setLeft = function(left, opt_chain) {\n  this.setPosition_(\n      this.xPosition_, left, goog.graphics.ext.Element.PositionType_.START,\n      opt_chain);\n};\n\n\n/**\n * @return {number} The right coordinate of the element, in units of the\n *     parent's coordinate system.\n */\ngoog.graphics.ext.Element.prototype.getRight = function() {\n  return this.xPosition_.getEnd();\n};\n\n\n/**\n * Sets the right coordinate of the element.  Overwrites any previous value of\n * left, center, or right for this element.\n * @param {string|number} right The right coordinate.\n * @param {boolean=} opt_chain Optional flag to specify this function is part\n *     of a chain of calls and therefore transformations should be set as\n *     pending but not yet performed.\n */\ngoog.graphics.ext.Element.prototype.setRight = function(right, opt_chain) {\n  this.setPosition_(\n      this.xPosition_, right, goog.graphics.ext.Element.PositionType_.END,\n      opt_chain);\n};\n\n\n/**\n * @return {number} The center coordinate of the element, in units of the\n * parent's coordinate system.\n */\ngoog.graphics.ext.Element.prototype.getCenter = function() {\n  return this.xPosition_.getMiddle();\n};\n\n\n/**\n * Sets the center coordinate of the element.  Overwrites any previous value of\n * left, center, or right for this element.\n * @param {string|number} center The center coordinate.\n * @param {boolean=} opt_chain Optional flag to specify this function is part\n *     of a chain of calls and therefore transformations should be set as\n *     pending but not yet performed.\n */\ngoog.graphics.ext.Element.prototype.setCenter = function(center, opt_chain) {\n  this.setPosition_(\n      this.xPosition_, center, goog.graphics.ext.Element.PositionType_.MIDDLE,\n      opt_chain);\n};\n\n\n// VERTICAL POSITIONING\n\n\n/**\n * @return {number} The distance from the top edge of this element to the top\n *     edge of its parent, specified in units of the parent's coordinate system.\n */\ngoog.graphics.ext.Element.prototype.getTop = function() {\n  return this.yPosition_.getStart();\n};\n\n\n/**\n * Sets the top coordinate of the element.  Overwrites any previous value of\n * top, middle, or bottom for this element.\n * @param {string|number} top The top coordinate.\n * @param {boolean=} opt_chain Optional flag to specify this function is part\n *     of a chain of calls and therefore transformations should be set as\n *     pending but not yet performed.\n */\ngoog.graphics.ext.Element.prototype.setTop = function(top, opt_chain) {\n  this.setPosition_(\n      this.yPosition_, top, goog.graphics.ext.Element.PositionType_.START,\n      opt_chain);\n};\n\n\n/**\n * @return {number} The bottom coordinate of the element, in units of the\n *     parent's coordinate system.\n */\ngoog.graphics.ext.Element.prototype.getBottom = function() {\n  return this.yPosition_.getEnd();\n};\n\n\n/**\n * Sets the bottom coordinate of the element.  Overwrites any previous value of\n * top, middle, or bottom for this element.\n * @param {string|number} bottom The bottom coordinate.\n * @param {boolean=} opt_chain Optional flag to specify this function is part\n *     of a chain of calls and therefore transformations should be set as\n *     pending but not yet performed.\n */\ngoog.graphics.ext.Element.prototype.setBottom = function(bottom, opt_chain) {\n  this.setPosition_(\n      this.yPosition_, bottom, goog.graphics.ext.Element.PositionType_.END,\n      opt_chain);\n};\n\n\n/**\n * @return {number} The middle coordinate of the element, in units of the\n *     parent's coordinate system.\n */\ngoog.graphics.ext.Element.prototype.getMiddle = function() {\n  return this.yPosition_.getMiddle();\n};\n\n\n/**\n * Sets the middle coordinate of the element.  Overwrites any previous value of\n * top, middle, or bottom for this element\n * @param {string|number} middle The middle coordinate.\n * @param {boolean=} opt_chain Optional flag to specify this function is part\n *     of a chain of calls and therefore transformations should be set as\n *     pending but not yet performed.\n */\ngoog.graphics.ext.Element.prototype.setMiddle = function(middle, opt_chain) {\n  this.setPosition_(\n      this.yPosition_, middle, goog.graphics.ext.Element.PositionType_.MIDDLE,\n      opt_chain);\n};\n\n\n// DIMENSIONS\n\n\n/**\n * @return {number} The width of the element, in units of the parent's\n *     coordinate system.\n */\ngoog.graphics.ext.Element.prototype.getWidth = function() {\n  return this.xPosition_.getSize();\n};\n\n\n/**\n * Sets the width of the element.\n * @param {string|number} width The new width value.\n * @param {boolean=} opt_chain Optional flag to specify this function is part\n *     of a chain of calls and therefore transformations should be set as\n *     pending but not yet performed.\n */\ngoog.graphics.ext.Element.prototype.setWidth = function(width, opt_chain) {\n  this.setSize_(this.xPosition_, width, opt_chain);\n};\n\n\n/**\n * @return {number} The minimum width of the element, in units of the parent's\n *     coordinate system.\n */\ngoog.graphics.ext.Element.prototype.getMinWidth = function() {\n  return this.xPosition_.getMinSize();\n};\n\n\n/**\n * Sets the minimum width of the element.\n * @param {string|number} minWidth The minimum width of the element.\n */\ngoog.graphics.ext.Element.prototype.setMinWidth = function(minWidth) {\n  this.setMinSize_(this.xPosition_, minWidth);\n};\n\n\n/**\n * @return {number} The height of the element, in units of the parent's\n *     coordinate system.\n */\ngoog.graphics.ext.Element.prototype.getHeight = function() {\n  return this.yPosition_.getSize();\n};\n\n\n/**\n * Sets the height of the element.\n * @param {string|number} height The new height value.\n * @param {boolean=} opt_chain Optional flag to specify this function is part\n *     of a chain of calls and therefore transformations should be set as\n *     pending but not yet performed.\n */\ngoog.graphics.ext.Element.prototype.setHeight = function(height, opt_chain) {\n  this.setSize_(this.yPosition_, height, opt_chain);\n};\n\n\n/**\n * @return {number} The minimum height of the element, in units of the parent's\n *     coordinate system.\n */\ngoog.graphics.ext.Element.prototype.getMinHeight = function() {\n  return this.yPosition_.getMinSize();\n};\n\n\n/**\n * Sets the minimum height of the element.\n * @param {string|number} minHeight The minimum height of the element.\n */\ngoog.graphics.ext.Element.prototype.setMinHeight = function(minHeight) {\n  this.setMinSize_(this.yPosition_, minHeight);\n};\n\n\n// BOUNDS SHORTCUTS\n\n\n/**\n * Shortcut for setting the left and top position.\n * @param {string|number} left The left coordinate.\n * @param {string|number} top The top coordinate.\n * @param {boolean=} opt_chain Optional flag to specify this function is part\n *     of a chain of calls and therefore transformations should be set as\n *     pending but not yet performed.\n */\ngoog.graphics.ext.Element.prototype.setPosition = function(\n    left, top, opt_chain) {\n  this.setLeft(left, true);\n  this.setTop(top, opt_chain);\n};\n\n\n/**\n * Shortcut for setting the width and height.\n * @param {string|number} width The new width value.\n * @param {string|number} height The new height value.\n * @param {boolean=} opt_chain Optional flag to specify this function is part\n *     of a chain of calls and therefore transformations should be set as\n *     pending but not yet performed.\n */\ngoog.graphics.ext.Element.prototype.setSize = function(\n    width, height, opt_chain) {\n  this.setWidth(width, true);\n  this.setHeight(height, opt_chain);\n};\n\n\n/**\n * Shortcut for setting the left, top, width, and height.\n * @param {string|number} left The left coordinate.\n * @param {string|number} top The top coordinate.\n * @param {string|number} width The new width value.\n * @param {string|number} height The new height value.\n * @param {boolean=} opt_chain Optional flag to specify this function is part\n *     of a chain of calls and therefore transformations should be set as\n *     pending but not yet performed.\n */\ngoog.graphics.ext.Element.prototype.setBounds = function(\n    left, top, width, height, opt_chain) {\n  this.setLeft(left, true);\n  this.setTop(top, true);\n  this.setWidth(width, true);\n  this.setHeight(height, opt_chain);\n};\n\n\n// MAXIMUM BOUNDS\n\n\n/**\n * @return {number} An estimate of the maximum x extent this element would have\n *     in a parent of no width.\n */\ngoog.graphics.ext.Element.prototype.getMaxX = function() {\n  return this.xPosition_.getMaxPosition();\n};\n\n\n/**\n * @return {number} An estimate of the maximum y extent this element would have\n *     in a parent of no height.\n */\ngoog.graphics.ext.Element.prototype.getMaxY = function() {\n  return this.yPosition_.getMaxPosition();\n};\n\n\n// RESET\n\n\n/**\n * Reset the element.  This is called when the element changes size, or when\n * the coordinate system changes in a way that would affect pixel based\n * rendering\n */\ngoog.graphics.ext.Element.prototype.reset = function() {\n  this.xPosition_.resetCache();\n  this.yPosition_.resetCache();\n\n  this.redraw();\n\n  this.needsTransform_ = true;\n  this.transform();\n};\n\n\n/**\n * Overridable function for subclass specific reset.\n * @protected\n */\ngoog.graphics.ext.Element.prototype.redraw = goog.nullFunction;\n\n\n// PARENT DEPENDENCY\n\n\n/**\n * Computes whether the element is still parent dependent.\n * @param {goog.graphics.ext.Element.Position_} position The recently changed\n *     position object.\n * @private\n */\ngoog.graphics.ext.Element.prototype.computeIsParentDependent_ = function(\n    position) {\n  this.parentDependent_ = position.isParentDependent() ||\n      this.xPosition_.isParentDependent() ||\n      this.yPosition_.isParentDependent() || this.checkParentDependent();\n};\n\n\n/**\n * Returns whether this element's bounds depend on its parents.\n *\n * This function should be treated as if it has package scope.\n * @return {boolean} Whether this element's bounds depend on its parents.\n */\ngoog.graphics.ext.Element.prototype.isParentDependent = function() {\n  return this.parentDependent_;\n};\n\n\n/**\n * Overridable function for subclass specific parent dependency.\n * @return {boolean} Whether this shape's bounds depends on its parent's.\n * @protected\n */\ngoog.graphics.ext.Element.prototype.checkParentDependent = goog.functions.FALSE;\n\n\n// ROTATION\n\n\n/**\n * Set the rotation of this element.\n * @param {number} angle The angle of rotation, in degrees.\n */\ngoog.graphics.ext.Element.prototype.setRotation = function(angle) {\n  if (this.rotation_ != angle) {\n    this.rotation_ = angle;\n\n    this.needsTransform_ = true;\n    this.transform();\n  }\n};\n\n\n/**\n * @return {number} The angle of rotation of this element, in degrees.\n */\ngoog.graphics.ext.Element.prototype.getRotation = function() {\n  return this.rotation_;\n};\n\n\n// TRANSFORMS\n\n\n/**\n * Called by the parent when the parent has transformed.\n *\n * Should be treated as package scope.\n */\ngoog.graphics.ext.Element.prototype.parentTransform = function() {\n  this.needsTransform_ = this.needsTransform_ || this.parentDependent_;\n};\n\n\n/**\n * @return {boolean} Whether this element has pending transforms.\n */\ngoog.graphics.ext.Element.prototype.isPendingTransform = function() {\n  return this.needsTransform_;\n};\n\n\n/**\n * Performs a pending transform.\n * @protected\n */\ngoog.graphics.ext.Element.prototype.transform = function() {\n  if (this.isPendingTransform()) {\n    this.needsTransform_ = false;\n\n    this.wrapper_.setTransformation(\n        this.getLeft(), this.getTop(), this.rotation_,\n        (this.getWidth() || 1) / 2, (this.getHeight() || 1) / 2);\n\n    // TODO(robbyw): this._fireEvent('transform', [ this ]);\n  }\n};\n\n\n// PIXEL SCALE\n\n\n/**\n * @return {number} Returns the number of pixels per unit in the x direction.\n */\ngoog.graphics.ext.Element.prototype.getPixelScaleX = function() {\n  return this.getGraphics().getPixelScaleX();\n};\n\n\n/**\n * @return {number} Returns the number of pixels per unit in the y direction.\n */\ngoog.graphics.ext.Element.prototype.getPixelScaleY = function() {\n  return this.getGraphics().getPixelScaleY();\n};\n\n\n// EVENT HANDLING\n\n\n/** @override */\ngoog.graphics.ext.Element.prototype.disposeInternal = function() {\n  goog.graphics.ext.Element.superClass_.disposeInternal.call(this);\n  this.wrapper_.dispose();\n};\n\n\n// INTERNAL POSITION OBJECT\n\n\n/**\n * Position specification types.  Start corresponds to left/top, middle to\n * center/middle, and end to right/bottom.\n * @enum {number}\n * @private\n */\ngoog.graphics.ext.Element.PositionType_ = {\n  START: 0,\n  MIDDLE: 1,\n  END: 2\n};\n\n\n\n/**\n * Manages a position and size, either horizontal or vertical.\n * @param {goog.graphics.ext.Element} element The element the position applies\n *     to.\n * @param {boolean} horizontal Whether the position is horizontal or vertical.\n * @constructor\n * @private\n */\ngoog.graphics.ext.Element.Position_ = function(element, horizontal) {\n  this.element_ = element;\n  this.horizontal_ = horizontal;\n};\n\n\n/**\n * @return {!Object} The coordinate value computation cache.\n * @private\n */\ngoog.graphics.ext.Element.Position_.prototype.getCoordinateCache_ = function() {\n  return this.coordinateCache_ || (this.coordinateCache_ = {});\n};\n\n\n/**\n * @return {number} The size of the parent's coordinate space.\n * @private\n */\ngoog.graphics.ext.Element.Position_.prototype.getParentSize_ = function() {\n  var parent = this.element_.getParent();\n  return this.horizontal_ ? parent.getCoordinateWidth() :\n                            parent.getCoordinateHeight();\n};\n\n\n/**\n * @return {number} The minimum width/height of the element.\n */\ngoog.graphics.ext.Element.Position_.prototype.getMinSize = function() {\n  return this.getValue_(this.minSize_);\n};\n\n\n/**\n * Sets the minimum width/height of the element.\n * @param {string|number} minSize The minimum width/height of the element.\n */\ngoog.graphics.ext.Element.Position_.prototype.setMinSize = function(minSize) {\n  this.minSize_ = minSize;\n  this.resetCache();\n};\n\n\n/**\n * @return {number} The width/height of the element.\n */\ngoog.graphics.ext.Element.Position_.prototype.getSize = function() {\n  return Math.max(this.getValue_(this.size_), this.getMinSize());\n};\n\n\n/**\n * Sets the width/height of the element.\n * @param {string|number} size The width/height of the element.\n * @return {boolean} Whether the value was changed.\n */\ngoog.graphics.ext.Element.Position_.prototype.setSize = function(size) {\n  if (size != this.size_) {\n    this.size_ = size;\n    this.resetCache();\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Converts the given x coordinate to a number value in units.\n * @param {string|number} v The coordinate to retrieve the value for.\n * @param {boolean=} opt_forMaximum Whether we are computing the largest value\n *     this coordinate would be in a parent of no size.\n * @return {number} The correct number of coordinate space units.\n * @private\n */\ngoog.graphics.ext.Element.Position_.prototype.getValue_ = function(\n    v, opt_forMaximum) {\n  if (!goog.graphics.ext.coordinates.isSpecial(v)) {\n    return parseFloat(String(v));\n  }\n\n  var cache = this.getCoordinateCache_();\n  var scale = this.horizontal_ ? this.element_.getPixelScaleX() :\n                                 this.element_.getPixelScaleY();\n\n  var containerSize;\n  if (opt_forMaximum) {\n    containerSize =\n        goog.graphics.ext.coordinates.computeValue(this.size_ || 0, 0, scale);\n  } else {\n    var parent = this.element_.getParent();\n    containerSize = this.horizontal_ ? parent.getWidth() : parent.getHeight();\n  }\n\n  return goog.graphics.ext.coordinates.getValue(\n      v, opt_forMaximum, containerSize, scale, cache);\n};\n\n\n/**\n * @return {number} The distance from the left/top edge of this element to the\n *     left/top edge of its parent, specified in units of the parent's\n *     coordinate system.\n */\ngoog.graphics.ext.Element.Position_.prototype.getStart = function() {\n  if (this.cachedValue_ == null) {\n    var value = this.getValue_(this.distance_);\n    if (this.distanceType_ == goog.graphics.ext.Element.PositionType_.START) {\n      this.cachedValue_ = value;\n    } else if (\n        this.distanceType_ == goog.graphics.ext.Element.PositionType_.MIDDLE) {\n      this.cachedValue_ = value + (this.getParentSize_() - this.getSize()) / 2;\n    } else {\n      this.cachedValue_ = this.getParentSize_() - value - this.getSize();\n    }\n  }\n\n  return this.cachedValue_;\n};\n\n\n/**\n * @return {number} The middle coordinate of the element, in units of the\n *     parent's coordinate system.\n */\ngoog.graphics.ext.Element.Position_.prototype.getMiddle = function() {\n  return this.distanceType_ == goog.graphics.ext.Element.PositionType_.MIDDLE ?\n      this.getValue_(this.distance_) :\n      (this.getParentSize_() - this.getSize()) / 2 - this.getStart();\n};\n\n\n/**\n * @return {number} The end coordinate of the element, in units of the\n *     parent's coordinate system.\n */\ngoog.graphics.ext.Element.Position_.prototype.getEnd = function() {\n  return this.distanceType_ == goog.graphics.ext.Element.PositionType_.END ?\n      this.getValue_(this.distance_) :\n      this.getParentSize_() - this.getStart() - this.getSize();\n};\n\n\n/**\n * Sets the position, either as a left/top, center/middle, or right/bottom\n * value.\n * @param {number|string} value The value of the coordinate.\n * @param {goog.graphics.ext.Element.PositionType_} type The type of the\n *     coordinate.\n */\ngoog.graphics.ext.Element.Position_.prototype.setPosition = function(\n    value, type) {\n  this.distance_ = value;\n  this.distanceType_ = type;\n\n  // Clear cached value.\n  this.cachedValue_ = null;\n};\n\n\n/**\n * @return {number} An estimate of the maximum x/y extent this element would\n *     have in a parent of no width/height.\n */\ngoog.graphics.ext.Element.Position_.prototype.getMaxPosition = function() {\n  // TODO(robbyw): Handle transformed or rotated coordinates\n  // TODO(robbyw): Handle pixel based sizes?\n\n  return this.getValue_(this.distance_ || 0) +\n      (goog.graphics.ext.coordinates.isSpecial(this.size_) ? 0 :\n                                                             this.getSize());\n};\n\n\n/**\n * Resets the caches of position values and coordinate values.\n */\ngoog.graphics.ext.Element.Position_.prototype.resetCache = function() {\n  this.coordinateCache_ = null;\n  this.cachedValue_ = null;\n};\n\n\n/**\n * @return {boolean} Whether the size or position of this element depends on\n *     the size of the parent element.\n */\ngoog.graphics.ext.Element.Position_.prototype.isParentDependent = function() {\n  return this.distanceType_ != goog.graphics.ext.Element.PositionType_.START ||\n      goog.graphics.ext.coordinates.isSpecial(this.size_) ||\n      goog.graphics.ext.coordinates.isSpecial(this.minSize_) ||\n      goog.graphics.ext.coordinates.isSpecial(this.distance_);\n};\n\n\n/**\n * The lazy loaded distance from the parent's top/left edge to this element's\n * top/left edge expressed in the parent's coordinate system.  We cache this\n * because it is most freqeuently requested by the element and it is easy to\n * compute middle and end values from it.\n * @type {?number}\n * @private\n */\ngoog.graphics.ext.Element.Position_.prototype.cachedValue_ = null;\n\n\n/**\n * A cache of computed x coordinates.\n * @type {?Object}\n * @private\n */\ngoog.graphics.ext.Element.Position_.prototype.coordinateCache_ = null;\n\n\n/**\n * The minimum width/height of this element, as specified by the caller.\n * @type {string|number}\n * @private\n */\ngoog.graphics.ext.Element.Position_.prototype.minSize_ = 0;\n\n\n/**\n * The width/height of this object, as specified by the caller.\n * @type {string|number}\n * @private\n */\ngoog.graphics.ext.Element.Position_.prototype.size_ = 0;\n\n\n/**\n * The coordinate of this object, as specified by the caller.  The type of\n * coordinate is specified by distanceType_.\n * @type {string|number}\n * @private\n */\ngoog.graphics.ext.Element.Position_.prototype.distance_ = 0;\n\n\n/**\n * The coordinate type specified by distance_.\n * @type {goog.graphics.ext.Element.PositionType_}\n * @private\n */\ngoog.graphics.ext.Element.Position_.prototype.distanceType_ =\n    goog.graphics.ext.Element.PositionType_.START;\n","^9I",1579837703000,"^9J",["^9K",["^;<","^9>","^:L","~$goog.graphics.ext.coordinates"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/ext/element.js"],"^:1",["^9K",["^=Q"]],"^9<",true,"^9=",["^9>","^:L","^;<","^WQ"]],["^ ","^9A",[1579837703000],"^9B","goog.pubsub.topicid.js","^9C",["^9D","goog/pubsub/topicid.js"],"^9E","goog/pubsub/topicid.js","^9F","^9G","^9H","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.pubsub.TopicId');\n\n\n\n/**\n * A templated class that is used to register `goog.pubsub.PubSub`\n * subscribers.\n *\n * Typical usage for a publisher:\n * <code>\n *   /** @type {!goog.pubsub.TopicId<!zorg.State>}\n *   zorg.TopicId.STATE_CHANGE = new goog.pubsub.TopicId(\n *       goog.events.getUniqueId('state-change'));\n *\n *   // Compiler enforces that these types are correct.\n *   pubSub.publish(zorg.TopicId.STATE_CHANGE, zorg.State.STARTED);\n * </code>\n *\n * Typical usage for a subscriber:\n * <code>\n *   // Compiler enforces the callback parameter type.\n *   pubSub.subscribe(zorg.TopicId.STATE_CHANGE, function(state) {\n *     if (state == zorg.State.STARTED) {\n *       // Handle STARTED state.\n *     }\n *   });\n * </code>\n *\n * @param {string} topicId\n * @template PAYLOAD\n * @constructor\n * @final\n * @struct\n */\ngoog.pubsub.TopicId = function(topicId) {\n  /**\n   * @const\n   * @private\n   */\n  this.topicId_ = topicId;\n};\n\n\n/** @override */\ngoog.pubsub.TopicId.prototype.toString = function() {\n  return this.topicId_;\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/pubsub/topicid.js"],"^:1",["^9K",["~$goog.pubsub.TopicId"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.dom.viewportsizemonitor.js","^9C",["^9D","goog/dom/viewportsizemonitor.js"],"^9E","goog/dom/viewportsizemonitor.js","^9F","^9G","^9H","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility class that monitors viewport size changes.\n *\n * @author attila@google.com (Attila Bodis)\n * @see ../demos/viewportsizemonitor.html\n */\n\ngoog.provide('goog.dom.ViewportSizeMonitor');\n\ngoog.require('goog.dom');\ngoog.require('goog.events');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.math.Size');\n\n\n\n/**\n * This class can be used to monitor changes in the viewport size.  Instances\n * dispatch a {@link goog.events.EventType.RESIZE} event when the viewport size\n * changes.  Handlers can call {@link goog.dom.ViewportSizeMonitor#getSize} to\n * get the new viewport size.\n *\n * Use this class if you want to execute resize/reflow logic each time the\n * user resizes the browser window.  This class is guaranteed to only dispatch\n * `RESIZE` events when the pixel dimensions of the viewport change.\n * (Internet Explorer fires resize events if any element on the page is resized,\n * even if the viewport dimensions are unchanged, which can lead to infinite\n * resize loops.)\n *\n * Example usage:\n *  <pre>\n *    var vsm = new goog.dom.ViewportSizeMonitor();\n *    goog.events.listen(vsm, goog.events.EventType.RESIZE, function(e) {\n *      alert('Viewport size changed to ' + vsm.getSize());\n *    });\n *  </pre>\n *\n * Manually verified on IE6, IE7, FF2, Opera 11, Safari 4 and Chrome.\n *\n * @param {Window=} opt_window The window to monitor; defaults to the window in\n *    which this code is executing.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.dom.ViewportSizeMonitor = function(opt_window) {\n  goog.dom.ViewportSizeMonitor.base(this, 'constructor');\n\n  /**\n   * The window to monitor. Defaults to the window in which the code is running.\n   * @private {Window}\n   */\n  this.window_ = opt_window || window;\n\n  /**\n   * Event listener key for window the window resize handler, as returned by\n   * {@link goog.events.listen}.\n   * @private {goog.events.Key}\n   */\n  this.listenerKey_ = goog.events.listen(\n      this.window_, goog.events.EventType.RESIZE, this.handleResize_, false,\n      this);\n\n  /**\n   * The most recently recorded size of the viewport, in pixels.\n   * @private {goog.math.Size}\n   */\n  this.size_ = goog.dom.getViewportSize(this.window_);\n};\ngoog.inherits(goog.dom.ViewportSizeMonitor, goog.events.EventTarget);\n\n\n/**\n * Returns a viewport size monitor for the given window.  A new one is created\n * if it doesn't exist already.  This prevents the unnecessary creation of\n * multiple spooling monitors for a window.\n * @param {Window=} opt_window The window to monitor; defaults to the window in\n *     which this code is executing.\n * @return {!goog.dom.ViewportSizeMonitor} Monitor for the given window.\n */\ngoog.dom.ViewportSizeMonitor.getInstanceForWindow = function(opt_window) {\n  var currentWindow = opt_window || window;\n  var uid = goog.getUid(currentWindow);\n\n  return goog.dom.ViewportSizeMonitor.windowInstanceMap_[uid] =\n             goog.dom.ViewportSizeMonitor.windowInstanceMap_[uid] ||\n      new goog.dom.ViewportSizeMonitor(currentWindow);\n};\n\n\n/**\n * Removes and disposes a viewport size monitor for the given window if one\n * exists.\n * @param {Window=} opt_window The window whose monitor should be removed;\n *     defaults to the window in which this code is executing.\n */\ngoog.dom.ViewportSizeMonitor.removeInstanceForWindow = function(opt_window) {\n  var uid = goog.getUid(opt_window || window);\n\n  goog.dispose(goog.dom.ViewportSizeMonitor.windowInstanceMap_[uid]);\n  delete goog.dom.ViewportSizeMonitor.windowInstanceMap_[uid];\n};\n\n\n/**\n * Map of window hash code to viewport size monitor for that window, if\n * created.\n * @type {Object<number,goog.dom.ViewportSizeMonitor>}\n * @private\n */\ngoog.dom.ViewportSizeMonitor.windowInstanceMap_ = {};\n\n\n/**\n * Returns the most recently recorded size of the viewport, in pixels.  May\n * return null if no window resize event has been handled yet.\n * @return {goog.math.Size} The viewport dimensions, in pixels.\n */\ngoog.dom.ViewportSizeMonitor.prototype.getSize = function() {\n  // Return a clone instead of the original to preserve encapsulation.\n  return this.size_ ? this.size_.clone() : null;\n};\n\n\n/** @override */\ngoog.dom.ViewportSizeMonitor.prototype.disposeInternal = function() {\n  goog.dom.ViewportSizeMonitor.superClass_.disposeInternal.call(this);\n\n  if (this.listenerKey_) {\n    goog.events.unlistenByKey(this.listenerKey_);\n    this.listenerKey_ = null;\n  }\n\n  this.window_ = null;\n  this.size_ = null;\n};\n\n\n/**\n * Handles window resize events by measuring the dimensions of the\n * viewport and dispatching a {@link goog.events.EventType.RESIZE} event if the\n * current dimensions are different from the previous ones.\n * @param {goog.events.Event} event The window resize event to handle.\n * @private\n */\ngoog.dom.ViewportSizeMonitor.prototype.handleResize_ = function(event) {\n  var size = goog.dom.getViewportSize(this.window_);\n  if (!goog.math.Size.equals(size, this.size_)) {\n    this.size_ = size;\n    this.dispatchEvent(goog.events.EventType.RESIZE);\n  }\n};\n","^9I",1579837703000,"^9J",["^9K",["^;;","^G4","^9>","^:L","^:I","^:N"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/viewportsizemonitor.js"],"^:1",["^9K",["^JK"]],"^9<",true,"^9=",["^9>","^;;","^:N","^:L","^:I","^G4"]],["^ ","^9A",[1579837703000],"^9B","goog.pubsub.typedpubsub.js","^9C",["^9D","goog/pubsub/typedpubsub.js"],"^9E","goog/pubsub/typedpubsub.js","^9F","^9G","^9H","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.pubsub.TypedPubSub');\n\ngoog.forwardDeclare('goog.pubsub.TopicId');\ngoog.require('goog.Disposable');\ngoog.require('goog.pubsub.PubSub');\n\n\n\n/**\n * This object is a temporary shim that provides goog.pubsub.TopicId support\n * for goog.pubsub.PubSub.  See b/12477087 for more info.\n * @param {boolean=} opt_async Enable asynchronous behavior.  Recommended for\n *     new code.  See notes on `goog.pubsub.PubSub.publish`.\n * @constructor\n * @extends {goog.Disposable}\n */\ngoog.pubsub.TypedPubSub = function(opt_async) {\n  goog.pubsub.TypedPubSub.base(this, 'constructor');\n\n  this.pubSub_ = new goog.pubsub.PubSub(opt_async);\n  this.registerDisposable(this.pubSub_);\n};\ngoog.inherits(goog.pubsub.TypedPubSub, goog.Disposable);\n\n\n/**\n * See `goog.pubsub.PubSub.subscribe`.\n * @param {!goog.pubsub.TopicId<PAYLOAD>} topic Topic to subscribe to.\n * @param {function(this:CONTEXT, PAYLOAD)} fn Function to be invoked when a\n *     message is published to the given topic.\n * @param {CONTEXT=} opt_context Object in whose context the function is to be\n *     called (the global scope if none).\n * @return {number} Subscription key.\n * @template PAYLOAD, CONTEXT\n */\ngoog.pubsub.TypedPubSub.prototype.subscribe = function(topic, fn, opt_context) {\n  return this.pubSub_.subscribe(topic.toString(), fn, opt_context);\n};\n\n\n/**\n * See `goog.pubsub.PubSub.subscribeOnce`.\n * @param {!goog.pubsub.TopicId<PAYLOAD>} topic Topic to subscribe to.\n * @param {function(this:CONTEXT, PAYLOAD)} fn Function to be invoked once and\n *     then unsubscribed when a message is published to the given topic.\n * @param {CONTEXT=} opt_context Object in whose context the function is to be\n *     called (the global scope if none).\n * @return {number} Subscription key.\n * @template PAYLOAD, CONTEXT\n */\ngoog.pubsub.TypedPubSub.prototype.subscribeOnce = function(\n    topic, fn, opt_context) {\n  return this.pubSub_.subscribeOnce(topic.toString(), fn, opt_context);\n};\n\n\n/**\n * See `goog.pubsub.PubSub.unsubscribe`.\n * @param {!goog.pubsub.TopicId<PAYLOAD>} topic Topic to unsubscribe from.\n * @param {function(this:CONTEXT, PAYLOAD)} fn Function to unsubscribe.\n * @param {CONTEXT=} opt_context Object in whose context the function was to be\n *     called (the global scope if none).\n * @return {boolean} Whether a matching subscription was removed.\n * @template PAYLOAD, CONTEXT\n */\ngoog.pubsub.TypedPubSub.prototype.unsubscribe = function(\n    topic, fn, opt_context) {\n  return this.pubSub_.unsubscribe(topic.toString(), fn, opt_context);\n};\n\n\n/**\n * See `goog.pubsub.PubSub.unsubscribeByKey`.\n * @param {number} key Subscription key.\n * @return {boolean} Whether a matching subscription was removed.\n */\ngoog.pubsub.TypedPubSub.prototype.unsubscribeByKey = function(key) {\n  return this.pubSub_.unsubscribeByKey(key);\n};\n\n\n/**\n * See `goog.pubsub.PubSub.publish`.\n * @param {!goog.pubsub.TopicId<PAYLOAD>} topic Topic to publish to.\n * @param {PAYLOAD} payload Payload passed to each subscription function.\n * @return {boolean} Whether any subscriptions were called.\n * @template PAYLOAD\n */\ngoog.pubsub.TypedPubSub.prototype.publish = function(topic, payload) {\n  return this.pubSub_.publish(topic.toString(), payload);\n};\n\n\n/**\n * See `goog.pubsub.PubSub.clear`.\n * @param {!goog.pubsub.TopicId<PAYLOAD>=} opt_topic Topic to clear (all topics\n *     if unspecified).\n * @template PAYLOAD\n */\ngoog.pubsub.TypedPubSub.prototype.clear = function(opt_topic) {\n  this.pubSub_.clear(\n      opt_topic !== undefined ? opt_topic.toString() : undefined);\n};\n\n\n/**\n * See `goog.pubsub.PubSub.getCount`.\n * @param {!goog.pubsub.TopicId<PAYLOAD>=} opt_topic The topic (all topics if\n *     unspecified).\n * @return {number} Number of subscriptions to the topic.\n * @template PAYLOAD\n */\ngoog.pubsub.TypedPubSub.prototype.getCount = function(opt_topic) {\n  return this.pubSub_.getCount(\n      opt_topic !== undefined ? opt_topic.toString() : undefined);\n};\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:7","^U0"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/pubsub/typedpubsub.js"],"^:1",["^9K",["~$goog.pubsub.TypedPubSub"]],"^9<",true,"^9=",["^9>","^:7","^U0"]],["^ ","^9A",[1579837703000],"^9B","goog.html.safescript.js","^9C",["^9D","goog/html/safescript.js"],"^9E","goog/html/safescript.js","^9F","^9G","^9H","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The SafeScript type and its builders.\n *\n * TODO(xtof): Link to document stating type contract.\n */\n\ngoog.provide('goog.html.SafeScript');\n\ngoog.require('goog.asserts');\ngoog.require('goog.html.trustedtypes');\ngoog.require('goog.string.Const');\ngoog.require('goog.string.TypedString');\n\n\n\n/**\n * A string-like object which represents JavaScript code and that carries the\n * security type contract that its value, as a string, will not cause execution\n * of unconstrained attacker controlled code (XSS) when evaluated as JavaScript\n * in a browser.\n *\n * Instances of this type must be created via the factory method\n * `goog.html.SafeScript.fromConstant` and not by invoking its\n * constructor. The constructor intentionally takes no parameters and the type\n * is immutable; hence only a default instance corresponding to the empty string\n * can be obtained via constructor invocation.\n *\n * A SafeScript's string representation can safely be interpolated as the\n * content of a script element within HTML. The SafeScript string should not be\n * escaped before interpolation.\n *\n * Note that the SafeScript might contain text that is attacker-controlled but\n * that text should have been interpolated with appropriate escaping,\n * sanitization and/or validation into the right location in the script, such\n * that it is highly constrained in its effect (for example, it had to match a\n * set of whitelisted words).\n *\n * A SafeScript can be constructed via security-reviewed unchecked\n * conversions. In this case producers of SafeScript must ensure themselves that\n * the SafeScript does not contain unsafe script. Note in particular that\n * {@code &lt;} is dangerous, even when inside JavaScript strings, and so should\n * always be forbidden or JavaScript escaped in user controlled input. For\n * example, if {@code &lt;/script&gt;&lt;script&gt;evil&lt;/script&gt;\"} were\n * interpolated inside a JavaScript string, it would break out of the context\n * of the original script element and `evil` would execute. Also note\n * that within an HTML script (raw text) element, HTML character references,\n * such as \"&lt;\" are not allowed. See\n * http://www.w3.org/TR/html5/scripting-1.html#restrictions-for-contents-of-script-elements.\n *\n * @see goog.html.SafeScript#fromConstant\n * @constructor\n * @final\n * @struct\n * @implements {goog.string.TypedString}\n */\ngoog.html.SafeScript = function() {\n  /**\n   * The contained value of this SafeScript.  The field has a purposely\n   * ugly name to make (non-compiled) code that attempts to directly access this\n   * field stand out.\n   * @private {!TrustedScript|string}\n   */\n  this.privateDoNotAccessOrElseSafeScriptWrappedValue_ = '';\n\n  /**\n   * A type marker used to implement additional run-time type checking.\n   * @see goog.html.SafeScript#unwrap\n   * @const {!Object}\n   * @private\n   */\n  this.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ =\n      goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_;\n};\n\n\n/**\n * @override\n * @const\n */\ngoog.html.SafeScript.prototype.implementsGoogStringTypedString = true;\n\n\n/**\n * Type marker for the SafeScript type, used to implement additional\n * run-time type checking.\n * @const {!Object}\n * @private\n */\ngoog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ = {};\n\n\n/**\n * Creates a SafeScript object from a compile-time constant string.\n *\n * @param {!goog.string.Const} script A compile-time-constant string from which\n *     to create a SafeScript.\n * @return {!goog.html.SafeScript} A SafeScript object initialized to\n *     `script`.\n */\ngoog.html.SafeScript.fromConstant = function(script) {\n  var scriptString = goog.string.Const.unwrap(script);\n  if (scriptString.length === 0) {\n    return goog.html.SafeScript.EMPTY;\n  }\n  return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(\n      scriptString);\n};\n\n\n/**\n * Creates a SafeScript from a compile-time constant string but with arguments\n * that can vary at run-time. The code argument should be formatted as an\n * inline function (see example below). The arguments will be JSON-encoded and\n * provided as input to the function specified in code.\n *\n * Example Usage:\n *\n *     let safeScript = SafeScript.fromConstantAndArgs(\n *         Const.from('function(arg1, arg2) { doSomething(arg1, arg2); }'),\n *         arg1,\n *         arg2);\n *\n * This produces a SafeScript equivalent to the following:\n *\n *     (function(arg1, arg2) { doSomething(arg1, arg2); })(\"value1\", \"value2\");\n *\n * @param {!goog.string.Const} code\n * @param {...*} var_args\n * @return {!goog.html.SafeScript}\n */\ngoog.html.SafeScript.fromConstantAndArgs = function(code, var_args) {\n  var args = [];\n  for (var i = 1; i < arguments.length; i++) {\n    args.push(goog.html.SafeScript.stringify_(arguments[i]));\n  }\n  return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(\n      '(' + goog.string.Const.unwrap(code) + ')(' + args.join(', ') + ');');\n};\n\n\n/**\n * Creates a SafeScript JSON representation from anything that could be passed\n * to JSON.stringify.\n * @param {*} val\n * @return {!goog.html.SafeScript}\n */\ngoog.html.SafeScript.fromJson = function(val) {\n  return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(\n      goog.html.SafeScript.stringify_(val));\n};\n\n\n/**\n * Returns this SafeScript's value as a string.\n *\n * IMPORTANT: In code where it is security relevant that an object's type is\n * indeed `SafeScript`, use `goog.html.SafeScript.unwrap` instead of\n * this method. If in doubt, assume that it's security relevant. In particular,\n * note that goog.html functions which return a goog.html type do not guarantee\n * the returned instance is of the right type. For example:\n *\n * <pre>\n * var fakeSafeHtml = new String('fake');\n * fakeSafeHtml.__proto__ = goog.html.SafeHtml.prototype;\n * var newSafeHtml = goog.html.SafeHtml.htmlEscape(fakeSafeHtml);\n * // newSafeHtml is just an alias for fakeSafeHtml, it's passed through by\n * // goog.html.SafeHtml.htmlEscape() as fakeSafeHtml\n * // instanceof goog.html.SafeHtml.\n * </pre>\n *\n * @see goog.html.SafeScript#unwrap\n * @override\n */\ngoog.html.SafeScript.prototype.getTypedStringValue = function() {\n  return this.privateDoNotAccessOrElseSafeScriptWrappedValue_.toString();\n};\n\n\nif (goog.DEBUG) {\n  /**\n   * Returns a debug string-representation of this value.\n   *\n   * To obtain the actual string value wrapped in a SafeScript, use\n   * `goog.html.SafeScript.unwrap`.\n   *\n   * @see goog.html.SafeScript#unwrap\n   * @override\n   */\n  goog.html.SafeScript.prototype.toString = function() {\n    return 'SafeScript{' +\n        this.privateDoNotAccessOrElseSafeScriptWrappedValue_ + '}';\n  };\n}\n\n\n/**\n * Performs a runtime check that the provided object is indeed a\n * SafeScript object, and returns its value.\n *\n * @param {!goog.html.SafeScript} safeScript The object to extract from.\n * @return {string} The safeScript object's contained string, unless\n *     the run-time type check fails. In that case, `unwrap` returns an\n *     innocuous string, or, if assertions are enabled, throws\n *     `goog.asserts.AssertionError`.\n */\ngoog.html.SafeScript.unwrap = function(safeScript) {\n  return goog.html.SafeScript.unwrapTrustedScript(safeScript).toString();\n};\n\n\n/**\n * Unwraps value as TrustedScript if supported or as a string if not.\n * @param {!goog.html.SafeScript} safeScript\n * @return {!TrustedScript|string}\n * @see goog.html.SafeScript.unwrap\n */\ngoog.html.SafeScript.unwrapTrustedScript = function(safeScript) {\n  // Perform additional Run-time type-checking to ensure that\n  // safeScript is indeed an instance of the expected type.  This\n  // provides some additional protection against security bugs due to\n  // application code that disables type checks.\n  // Specifically, the following checks are performed:\n  // 1. The object is an instance of the expected type.\n  // 2. The object is not an instance of a subclass.\n  // 3. The object carries a type marker for the expected type. \"Faking\" an\n  // object requires a reference to the type marker, which has names intended\n  // to stand out in code reviews.\n  if (safeScript instanceof goog.html.SafeScript &&\n      safeScript.constructor === goog.html.SafeScript &&\n      safeScript.SAFE_SCRIPT_TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_ ===\n          goog.html.SafeScript.TYPE_MARKER_GOOG_HTML_SECURITY_PRIVATE_) {\n    return safeScript.privateDoNotAccessOrElseSafeScriptWrappedValue_;\n  } else {\n    goog.asserts.fail('expected object of type SafeScript, got \\'' +\n        safeScript + '\\' of type ' + goog.typeOf(safeScript));\n    return 'type_error:SafeScript';\n  }\n};\n\n\n/**\n * Converts the given value to a embeddabel JSON string and returns it. The\n * resulting string can be embedded in HTML because the '<' character is\n * encoded.\n *\n * @param {*} val\n * @return {string}\n * @private\n */\ngoog.html.SafeScript.stringify_ = function(val) {\n  var json = JSON.stringify(val);\n  return json.replace(/</g, '\\\\x3c');\n};\n\n/**\n * Package-internal utility method to create SafeScript instances.\n *\n * @param {string} script The string to initialize the SafeScript object with.\n * @return {!goog.html.SafeScript} The initialized SafeScript object.\n * @package\n */\ngoog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse =\n    function(script) {\n  return new goog.html.SafeScript().initSecurityPrivateDoNotAccessOrElse_(\n      script);\n};\n\n\n/**\n * Called from createSafeScriptSecurityPrivateDoNotAccessOrElse(). This\n * method exists only so that the compiler can dead code eliminate static\n * fields (like EMPTY) when they're not accessed.\n * @param {string} script\n * @return {!goog.html.SafeScript}\n * @private\n */\ngoog.html.SafeScript.prototype.initSecurityPrivateDoNotAccessOrElse_ = function(\n    script) {\n  this.privateDoNotAccessOrElseSafeScriptWrappedValue_ =\n      goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY ?\n      goog.html.trustedtypes.PRIVATE_DO_NOT_ACCESS_OR_ELSE_POLICY.createScript(\n          script) :\n      script;\n  return this;\n};\n\n\n/**\n * A SafeScript instance corresponding to the empty string.\n * @const {!goog.html.SafeScript}\n */\ngoog.html.SafeScript.EMPTY =\n    goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse('');\n","^9I",1579837703000,"^9J",["^9K",["^:E","^GS","^9>","^=M","^GZ"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/safescript.js"],"^:1",["^9K",["^GQ"]],"^9<",true,"^9=",["^9>","^:E","^GZ","^=M","^GS"]],["^ ","^9A",[1579837703000],"^9B","goog.events.browserfeature.js","^9C",["^9D","goog/events/browserfeature.js"],"^9E","goog/events/browserfeature.js","^9F","^9G","^9H","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Browser capability checks for the events package.\n *\n */\n\n\ngoog.provide('goog.events.BrowserFeature');\n\ngoog.require('goog.userAgent');\ngoog.scope(function() {\n\n\n\n/**\n * Enum of browser capabilities.\n * @enum {boolean}\n */\ngoog.events.BrowserFeature = {\n  /**\n   * Whether the button attribute of the event is W3C compliant.  False in\n   * Internet Explorer prior to version 9; document-version dependent.\n   */\n  HAS_W3C_BUTTON:\n      !goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9),\n\n  /**\n   * Whether the browser supports full W3C event model.\n   */\n  HAS_W3C_EVENT_SUPPORT:\n      !goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(9),\n\n  /**\n   * To prevent default in IE7-8 for certain keydown events we need set the\n   * keyCode to -1.\n   */\n  SET_KEY_CODE_TO_PREVENT_DEFAULT:\n      goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9'),\n\n  /**\n   * Whether the `navigator.onLine` property is supported.\n   */\n  HAS_NAVIGATOR_ONLINE_PROPERTY:\n      !goog.userAgent.WEBKIT || goog.userAgent.isVersionOrHigher('528'),\n\n  /**\n   * Whether HTML5 network online/offline events are supported.\n   */\n  HAS_HTML5_NETWORK_EVENT_SUPPORT:\n      goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9b') ||\n      goog.userAgent.IE && goog.userAgent.isVersionOrHigher('8') ||\n      goog.userAgent.OPERA && goog.userAgent.isVersionOrHigher('9.5') ||\n      goog.userAgent.WEBKIT && goog.userAgent.isVersionOrHigher('528'),\n\n  /**\n   * Whether HTML5 network events fire on document.body, or otherwise the\n   * window.\n   */\n  HTML5_NETWORK_EVENTS_FIRE_ON_BODY:\n      goog.userAgent.GECKO && !goog.userAgent.isVersionOrHigher('8') ||\n      goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9'),\n\n  /**\n   * Whether touch is enabled in the browser.\n   */\n  TOUCH_ENABLED:\n      ('ontouchstart' in goog.global ||\n       !!(goog.global['document'] && document.documentElement &&\n          'ontouchstart' in document.documentElement) ||\n       // IE10 uses non-standard touch events, so it has a different check.\n       !!(goog.global['navigator'] &&\n          (goog.global['navigator']['maxTouchPoints'] ||\n           goog.global['navigator']['msMaxTouchPoints']))),\n\n  /**\n   * Whether addEventListener supports W3C standard pointer events.\n   * http://www.w3.org/TR/pointerevents/\n   */\n  POINTER_EVENTS: ('PointerEvent' in goog.global),\n\n  /**\n   * Whether addEventListener supports MSPointer events (only used in IE10).\n   * http://msdn.microsoft.com/en-us/library/ie/hh772103(v=vs.85).aspx\n   * http://msdn.microsoft.com/library/hh673557(v=vs.85).aspx\n   */\n  MSPOINTER_EVENTS:\n      ('MSPointerEvent' in goog.global &&\n       !!(goog.global['navigator'] &&\n          goog.global['navigator']['msPointerEnabled'])),\n\n  /**\n   * Whether addEventListener supports {passive: true}.\n   * https://developers.google.com/web/updates/2016/06/passive-event-listeners\n   */\n  PASSIVE_EVENTS: purify(function() {\n    // If we're in a web worker or other custom environment, we can't tell.\n    if (!goog.global.addEventListener || !Object.defineProperty) {  // IE 8\n      return false;\n    }\n\n    var passive = false;\n    var options = Object.defineProperty({}, 'passive', {\n      get: function() {\n        passive = true;\n      }\n    });\n    try {\n      goog.global.addEventListener('test', goog.nullFunction, options);\n      goog.global.removeEventListener('test', goog.nullFunction, options);\n    } catch (e) {\n    }\n\n    return passive;\n  })\n};\n\n\n/**\n * Tricks Closure Compiler into believing that a function is pure.  The compiler\n * assumes that any `valueOf` function is pure, without analyzing its contents.\n *\n * @param {function(): T} fn\n * @return {T}\n * @template T\n */\nfunction purify(fn) {\n  return ({valueOf: fn}).valueOf();\n}\n});  // goog.scope\n","^9I",1579837703000,"^9J",["^9K",["^9>","^:S"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/browserfeature.js"],"^:1",["^9K",["^TC"]],"^9<",true,"^9=",["^9>","^:S"]],["^ ","^9A",[1579837703000],"^;I",true,"^9B","goog.promise.nativeresolver.js","^9C",["^9D","goog/promise/nativeresolver.js"],"^9E","goog/promise/nativeresolver.js","^9F","^9G","^9H","// Copyright 2018 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.module('goog.promise.NativeResolver');\n\n/**\n * Creates a new JavaScript native Promise and captures its resolve and reject\n * callbacks. The promise, resolve, and reject are available as properties\n * @final\n * @template T\n */\nclass NativeResolver {\n  constructor() {\n    /** @type {function((T|!IThenable<T>|!Thenable)=)} */\n    this.resolve;\n    /** @type {function(*=)} */\n    this.reject;\n\n    /** @type {!Promise<T>} */\n    this.promise = new Promise((resolve, reject) => {\n      this.resolve = resolve;\n      this.reject = reject;\n    });\n  }\n}\n\nexports = NativeResolver;\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/promise/nativeresolver.js"],"^:1",["^9K",["^<L"]],"^9<",true,"^9=",["^9>"]],["^ ","^9A",[1579837703000],"^9B","goog.i18n.datetimesymbols.js","^9C",["^9D","goog/i18n/datetimesymbols.js"],"^9E","goog/i18n/datetimesymbols.js","^9F","^9G","^9H","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Date/time formatting symbols for all locales.\n *\n * File generated from CLDR ver. 35\n *\n * To reduce the file size (which may cause issues in some JS\n * developing environments), this file will only contain locales\n * that are frequently used by web applications. This is defined as\n * proto/closure_locales_data.txt and will change (most likely addition)\n * over time.  Rest of the data can be found in another file named\n * \"datetimesymbolsext.js\", which will be generated at\n * the same time together with this file.\n *\n * @suppress {const}\n */\n\n// clang-format off\n\ngoog.provide('goog.i18n.DateTimeSymbols');\ngoog.provide('goog.i18n.DateTimeSymbolsType');\ngoog.provide('goog.i18n.DateTimeSymbols_af');\ngoog.provide('goog.i18n.DateTimeSymbols_am');\ngoog.provide('goog.i18n.DateTimeSymbols_ar');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_DZ');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_EG');\ngoog.provide('goog.i18n.DateTimeSymbols_az');\ngoog.provide('goog.i18n.DateTimeSymbols_be');\ngoog.provide('goog.i18n.DateTimeSymbols_bg');\ngoog.provide('goog.i18n.DateTimeSymbols_bn');\ngoog.provide('goog.i18n.DateTimeSymbols_br');\ngoog.provide('goog.i18n.DateTimeSymbols_bs');\ngoog.provide('goog.i18n.DateTimeSymbols_ca');\ngoog.provide('goog.i18n.DateTimeSymbols_chr');\ngoog.provide('goog.i18n.DateTimeSymbols_cs');\ngoog.provide('goog.i18n.DateTimeSymbols_cy');\ngoog.provide('goog.i18n.DateTimeSymbols_da');\ngoog.provide('goog.i18n.DateTimeSymbols_de');\ngoog.provide('goog.i18n.DateTimeSymbols_de_AT');\ngoog.provide('goog.i18n.DateTimeSymbols_de_CH');\ngoog.provide('goog.i18n.DateTimeSymbols_el');\ngoog.provide('goog.i18n.DateTimeSymbols_en');\ngoog.provide('goog.i18n.DateTimeSymbols_en_AU');\ngoog.provide('goog.i18n.DateTimeSymbols_en_CA');\ngoog.provide('goog.i18n.DateTimeSymbols_en_GB');\ngoog.provide('goog.i18n.DateTimeSymbols_en_IE');\ngoog.provide('goog.i18n.DateTimeSymbols_en_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_en_ISO');\ngoog.provide('goog.i18n.DateTimeSymbols_en_SG');\ngoog.provide('goog.i18n.DateTimeSymbols_en_US');\ngoog.provide('goog.i18n.DateTimeSymbols_en_ZA');\ngoog.provide('goog.i18n.DateTimeSymbols_es');\ngoog.provide('goog.i18n.DateTimeSymbols_es_419');\ngoog.provide('goog.i18n.DateTimeSymbols_es_ES');\ngoog.provide('goog.i18n.DateTimeSymbols_es_MX');\ngoog.provide('goog.i18n.DateTimeSymbols_es_US');\ngoog.provide('goog.i18n.DateTimeSymbols_et');\ngoog.provide('goog.i18n.DateTimeSymbols_eu');\ngoog.provide('goog.i18n.DateTimeSymbols_fa');\ngoog.provide('goog.i18n.DateTimeSymbols_fi');\ngoog.provide('goog.i18n.DateTimeSymbols_fil');\ngoog.provide('goog.i18n.DateTimeSymbols_fr');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_CA');\ngoog.provide('goog.i18n.DateTimeSymbols_ga');\ngoog.provide('goog.i18n.DateTimeSymbols_gl');\ngoog.provide('goog.i18n.DateTimeSymbols_gsw');\ngoog.provide('goog.i18n.DateTimeSymbols_gu');\ngoog.provide('goog.i18n.DateTimeSymbols_haw');\ngoog.provide('goog.i18n.DateTimeSymbols_he');\ngoog.provide('goog.i18n.DateTimeSymbols_hi');\ngoog.provide('goog.i18n.DateTimeSymbols_hr');\ngoog.provide('goog.i18n.DateTimeSymbols_hu');\ngoog.provide('goog.i18n.DateTimeSymbols_hy');\ngoog.provide('goog.i18n.DateTimeSymbols_id');\ngoog.provide('goog.i18n.DateTimeSymbols_in');\ngoog.provide('goog.i18n.DateTimeSymbols_is');\ngoog.provide('goog.i18n.DateTimeSymbols_it');\ngoog.provide('goog.i18n.DateTimeSymbols_iw');\ngoog.provide('goog.i18n.DateTimeSymbols_ja');\ngoog.provide('goog.i18n.DateTimeSymbols_ka');\ngoog.provide('goog.i18n.DateTimeSymbols_kk');\ngoog.provide('goog.i18n.DateTimeSymbols_km');\ngoog.provide('goog.i18n.DateTimeSymbols_kn');\ngoog.provide('goog.i18n.DateTimeSymbols_ko');\ngoog.provide('goog.i18n.DateTimeSymbols_ky');\ngoog.provide('goog.i18n.DateTimeSymbols_ln');\ngoog.provide('goog.i18n.DateTimeSymbols_lo');\ngoog.provide('goog.i18n.DateTimeSymbols_lt');\ngoog.provide('goog.i18n.DateTimeSymbols_lv');\ngoog.provide('goog.i18n.DateTimeSymbols_mk');\ngoog.provide('goog.i18n.DateTimeSymbols_ml');\ngoog.provide('goog.i18n.DateTimeSymbols_mn');\ngoog.provide('goog.i18n.DateTimeSymbols_mo');\ngoog.provide('goog.i18n.DateTimeSymbols_mr');\ngoog.provide('goog.i18n.DateTimeSymbols_ms');\ngoog.provide('goog.i18n.DateTimeSymbols_mt');\ngoog.provide('goog.i18n.DateTimeSymbols_my');\ngoog.provide('goog.i18n.DateTimeSymbols_nb');\ngoog.provide('goog.i18n.DateTimeSymbols_ne');\ngoog.provide('goog.i18n.DateTimeSymbols_nl');\ngoog.provide('goog.i18n.DateTimeSymbols_no');\ngoog.provide('goog.i18n.DateTimeSymbols_no_NO');\ngoog.provide('goog.i18n.DateTimeSymbols_or');\ngoog.provide('goog.i18n.DateTimeSymbols_pa');\ngoog.provide('goog.i18n.DateTimeSymbols_pl');\ngoog.provide('goog.i18n.DateTimeSymbols_pt');\ngoog.provide('goog.i18n.DateTimeSymbols_pt_BR');\ngoog.provide('goog.i18n.DateTimeSymbols_pt_PT');\ngoog.provide('goog.i18n.DateTimeSymbols_ro');\ngoog.provide('goog.i18n.DateTimeSymbols_ru');\ngoog.provide('goog.i18n.DateTimeSymbols_sh');\ngoog.provide('goog.i18n.DateTimeSymbols_si');\ngoog.provide('goog.i18n.DateTimeSymbols_sk');\ngoog.provide('goog.i18n.DateTimeSymbols_sl');\ngoog.provide('goog.i18n.DateTimeSymbols_sq');\ngoog.provide('goog.i18n.DateTimeSymbols_sr');\ngoog.provide('goog.i18n.DateTimeSymbols_sr_Latn');\ngoog.provide('goog.i18n.DateTimeSymbols_sv');\ngoog.provide('goog.i18n.DateTimeSymbols_sw');\ngoog.provide('goog.i18n.DateTimeSymbols_ta');\ngoog.provide('goog.i18n.DateTimeSymbols_te');\ngoog.provide('goog.i18n.DateTimeSymbols_th');\ngoog.provide('goog.i18n.DateTimeSymbols_tl');\ngoog.provide('goog.i18n.DateTimeSymbols_tr');\ngoog.provide('goog.i18n.DateTimeSymbols_uk');\ngoog.provide('goog.i18n.DateTimeSymbols_ur');\ngoog.provide('goog.i18n.DateTimeSymbols_uz');\ngoog.provide('goog.i18n.DateTimeSymbols_vi');\ngoog.provide('goog.i18n.DateTimeSymbols_zh');\ngoog.provide('goog.i18n.DateTimeSymbols_zh_CN');\ngoog.provide('goog.i18n.DateTimeSymbols_zh_HK');\ngoog.provide('goog.i18n.DateTimeSymbols_zh_TW');\ngoog.provide('goog.i18n.DateTimeSymbols_zu');\n/**\n * Date/time formatting symbols for locale en_ISO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_ISO = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, y MMMM dd', 'y MMMM d', 'y MMM d', 'yyyy-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss v', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  AVAILABLEFORMATS: {'Md': 'M/d', 'MMMMd': 'MMMM d', 'MMMd': 'MMM d'},\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n/**\n * Date/time formatting symbols for locale af.\n * @const\n */\ngoog.i18n.DateTimeSymbols_af = {\n  ERAS: ['v.C.', 'n.C.'],\n  ERANAMES: ['voor Christus', 'na Christus'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januarie', 'Februarie', 'Maart', 'April', 'Mei', 'Junie', 'Julie', 'Augustus', 'September', 'Oktober', 'November', 'Desember'],\n  STANDALONEMONTHS: ['Januarie', 'Februarie', 'Maart', 'April', 'Mei', 'Junie', 'Julie', 'Augustus', 'September', 'Oktober', 'November', 'Desember'],\n  SHORTMONTHS: ['Jan.', 'Feb.', 'Mrt.', 'Apr.', 'Mei', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Okt.', 'Nov.', 'Des.'],\n  STANDALONESHORTMONTHS: ['Jan.', 'Feb.', 'Mrt.', 'Apr.', 'Mei', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Okt.', 'Nov.', 'Des.'],\n  WEEKDAYS: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],\n  STANDALONEWEEKDAYS: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],\n  SHORTWEEKDAYS: ['So.', 'Ma.', 'Di.', 'Wo.', 'Do.', 'Vr.', 'Sa.'],\n  STANDALONESHORTWEEKDAYS: ['So.', 'Ma.', 'Di.', 'Wo.', 'Do.', 'Vr.', 'Sa.'],\n  NARROWWEEKDAYS: ['S', 'M', 'D', 'W', 'D', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'D', 'W', 'D', 'V', 'S'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1ste kwartaal', '2de kwartaal', '3de kwartaal', '4de kwartaal'],\n  AMPMS: ['vm.', 'nm.'],\n  DATEFORMATS: ['EEEE dd MMMM y', 'dd MMMM y', 'dd MMM y', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale am.\n * @const\n */\ngoog.i18n.DateTimeSymbols_am = {\n  ERAS: ['ዓ/ዓ', 'ዓ/ም'],\n  ERANAMES: ['ዓመተ ዓለም', 'ዓመተ ምሕረት'],\n  NARROWMONTHS: ['ጃ', 'ፌ', 'ማ', 'ኤ', 'ሜ', 'ጁ', 'ጁ', 'ኦ', 'ሴ', 'ኦ', 'ኖ', 'ዲ'],\n  STANDALONENARROWMONTHS: ['ጃ', 'ፌ', 'ማ', 'ኤ', 'ሜ', 'ጁ', 'ጁ', 'ኦ', 'ሴ', 'ኦ', 'ኖ', 'ዲ'],\n  MONTHS: ['ጃንዩወሪ', 'ፌብሩወሪ', 'ማርች', 'ኤፕሪል', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስት', 'ሴፕቴምበር', 'ኦክቶበር', 'ኖቬምበር', 'ዲሴምበር'],\n  STANDALONEMONTHS: ['ጃንዩወሪ', 'ፌብሩወሪ', 'ማርች', 'ኤፕሪል', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስት', 'ሴፕቴምበር', 'ኦክቶበር', 'ኖቬምበር', 'ዲሴምበር'],\n  SHORTMONTHS: ['ጃንዩ', 'ፌብሩ', 'ማርች', 'ኤፕሪ', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስ', 'ሴፕቴ', 'ኦክቶ', 'ኖቬም', 'ዲሴም'],\n  STANDALONESHORTMONTHS: ['ጃንዩ', 'ፌብሩ', 'ማርች', 'ኤፕሪ', 'ሜይ', 'ጁን', 'ጁላይ', 'ኦገስ', 'ሴፕቴ', 'ኦክቶ', 'ኖቬም', 'ዲሴም'],\n  WEEKDAYS: ['እሑድ', 'ሰኞ', 'ማክሰኞ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'],\n  STANDALONEWEEKDAYS: ['እሑድ', 'ሰኞ', 'ማክሰኞ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'],\n  SHORTWEEKDAYS: ['እሑድ', 'ሰኞ', 'ማክሰ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'],\n  STANDALONESHORTWEEKDAYS: ['እሑድ', 'ሰኞ', 'ማክሰ', 'ረቡዕ', 'ሐሙስ', 'ዓርብ', 'ቅዳሜ'],\n  NARROWWEEKDAYS: ['እ', 'ሰ', 'ማ', 'ረ', 'ሐ', 'ዓ', 'ቅ'],\n  STANDALONENARROWWEEKDAYS: ['እ', 'ሰ', 'ማ', 'ረ', 'ሐ', 'ዓ', 'ቅ'],\n  SHORTQUARTERS: ['ሩብ1', 'ሩብ2', 'ሩብ3', 'ሩብ4'],\n  QUARTERS: ['1ኛው ሩብ', '2ኛው ሩብ', '3ኛው ሩብ', '4ኛው ሩብ'],\n  AMPMS: ['ጥዋት', 'ከሰዓት'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ar.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar = {\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_DZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_DZ = {\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ج', 'ف', 'م', 'أ', 'م', 'ج', 'ج', 'أ', 'س', 'أ', 'ن', 'د'],\n  STANDALONENARROWMONTHS: ['ج', 'ف', 'م', 'أ', 'م', 'ج', 'ج', 'أ', 'س', 'أ', 'ن', 'د'],\n  MONTHS: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان', 'جويلية', 'أوت', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان', 'جويلية', 'أوت', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان', 'جويلية', 'أوت', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان', 'جويلية', 'أوت', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_EG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_EG = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale az.\n * @const\n */\ngoog.i18n.DateTimeSymbols_az = {\n  ERAS: ['e.ə.', 'y.e.'],\n  ERANAMES: ['eramızdan əvvəl', 'yeni era'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avqust', 'sentyabr', 'oktyabr', 'noyabr', 'dekabr'],\n  STANDALONEMONTHS: ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'İyun', 'İyul', 'Avqust', 'Sentyabr', 'Oktyabr', 'Noyabr', 'Dekabr'],\n  SHORTMONTHS: ['yan', 'fev', 'mar', 'apr', 'may', 'iyn', 'iyl', 'avq', 'sen', 'okt', 'noy', 'dek'],\n  STANDALONESHORTMONTHS: ['yan', 'fev', 'mar', 'apr', 'may', 'iyn', 'iyl', 'avq', 'sen', 'okt', 'noy', 'dek'],\n  WEEKDAYS: ['bazar', 'bazar ertəsi', 'çərşənbə axşamı', 'çərşənbə', 'cümə axşamı', 'cümə', 'şənbə'],\n  STANDALONEWEEKDAYS: ['bazar', 'bazar ertəsi', 'çərşənbə axşamı', 'çərşənbə', 'cümə axşamı', 'cümə', 'şənbə'],\n  SHORTWEEKDAYS: ['B.', 'B.E.', 'Ç.A.', 'Ç.', 'C.A.', 'C.', 'Ş.'],\n  STANDALONESHORTWEEKDAYS: ['B.', 'B.E.', 'Ç.A.', 'Ç.', 'C.A.', 'C.', 'Ş.'],\n  NARROWWEEKDAYS: ['7', '1', '2', '3', '4', '5', '6'],\n  STANDALONENARROWWEEKDAYS: ['7', '1', '2', '3', '4', '5', '6'],\n  SHORTQUARTERS: ['1-ci kv.', '2-ci kv.', '3-cü kv.', '4-cü kv.'],\n  QUARTERS: ['1-ci kvartal', '2-ci kvartal', '3-cü kvartal', '4-cü kvartal'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['d MMMM y, EEEE', 'd MMMM y', 'd MMM y', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale be.\n * @const\n */\ngoog.i18n.DateTimeSymbols_be = {\n  ERAS: ['да н.э.', 'н.э.'],\n  ERANAMES: ['да нараджэння Хрыстова', 'ад нараджэння Хрыстова'],\n  NARROWMONTHS: ['с', 'л', 'с', 'к', 'м', 'ч', 'л', 'ж', 'в', 'к', 'л', 'с'],\n  STANDALONENARROWMONTHS: ['с', 'л', 'с', 'к', 'м', 'ч', 'л', 'ж', 'в', 'к', 'л', 'с'],\n  MONTHS: ['студзеня', 'лютага', 'сакавіка', 'красавіка', 'мая', 'чэрвеня', 'ліпеня', 'жніўня', 'верасня', 'кастрычніка', 'лістапада', 'снежня'],\n  STANDALONEMONTHS: ['студзень', 'люты', 'сакавік', 'красавік', 'май', 'чэрвень', 'ліпень', 'жнівень', 'верасень', 'кастрычнік', 'лістапад', 'снежань'],\n  SHORTMONTHS: ['сту', 'лют', 'сак', 'кра', 'мая', 'чэр', 'ліп', 'жні', 'вер', 'кас', 'ліс', 'сне'],\n  STANDALONESHORTMONTHS: ['сту', 'лют', 'сак', 'кра', 'май', 'чэр', 'ліп', 'жні', 'вер', 'кас', 'ліс', 'сне'],\n  WEEKDAYS: ['нядзеля', 'панядзелак', 'аўторак', 'серада', 'чацвер', 'пятніца', 'субота'],\n  STANDALONEWEEKDAYS: ['нядзеля', 'панядзелак', 'аўторак', 'серада', 'чацвер', 'пятніца', 'субота'],\n  SHORTWEEKDAYS: ['нд', 'пн', 'аў', 'ср', 'чц', 'пт', 'сб'],\n  STANDALONESHORTWEEKDAYS: ['нд', 'пн', 'аў', 'ср', 'чц', 'пт', 'сб'],\n  NARROWWEEKDAYS: ['н', 'п', 'а', 'с', 'ч', 'п', 'с'],\n  STANDALONENARROWWEEKDAYS: ['н', 'п', 'а', 'с', 'ч', 'п', 'с'],\n  SHORTQUARTERS: ['1-шы кв.', '2-гі кв.', '3-ці кв.', '4-ты кв.'],\n  QUARTERS: ['1-шы квартал', '2-гі квартал', '3-ці квартал', '4-ты квартал'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y \\'г\\'.', 'd MMMM y \\'г\\'.', 'd.MM.y', 'd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss, zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'у\\' {0}', '{1} \\'у\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale bg.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bg = {\n  ERAS: ['пр.Хр.', 'сл.Хр.'],\n  ERANAMES: ['преди Христа', 'след Христа'],\n  NARROWMONTHS: ['я', 'ф', 'м', 'а', 'м', 'ю', 'ю', 'а', 'с', 'о', 'н', 'д'],\n  STANDALONENARROWMONTHS: ['я', 'ф', 'м', 'а', 'м', 'ю', 'ю', 'а', 'с', 'о', 'н', 'д'],\n  MONTHS: ['януари', 'февруари', 'март', 'април', 'май', 'юни', 'юли', 'август', 'септември', 'октомври', 'ноември', 'декември'],\n  STANDALONEMONTHS: ['януари', 'февруари', 'март', 'април', 'май', 'юни', 'юли', 'август', 'септември', 'октомври', 'ноември', 'декември'],\n  SHORTMONTHS: ['яну', 'фев', 'март', 'апр', 'май', 'юни', 'юли', 'авг', 'сеп', 'окт', 'ное', 'дек'],\n  STANDALONESHORTMONTHS: ['яну', 'фев', 'март', 'апр', 'май', 'юни', 'юли', 'авг', 'сеп', 'окт', 'ное', 'дек'],\n  WEEKDAYS: ['неделя', 'понеделник', 'вторник', 'сряда', 'четвъртък', 'петък', 'събота'],\n  STANDALONEWEEKDAYS: ['неделя', 'понеделник', 'вторник', 'сряда', 'четвъртък', 'петък', 'събота'],\n  SHORTWEEKDAYS: ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  STANDALONESHORTWEEKDAYS: ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  NARROWWEEKDAYS: ['н', 'п', 'в', 'с', 'ч', 'п', 'с'],\n  STANDALONENARROWWEEKDAYS: ['н', 'п', 'в', 'с', 'ч', 'п', 'с'],\n  SHORTQUARTERS: ['1. трим.', '2. трим.', '3. трим.', '4. трим.'],\n  QUARTERS: ['1. тримесечие', '2. тримесечие', '3. тримесечие', '4. тримесечие'],\n  AMPMS: ['пр.об.', 'сл.об.'],\n  DATEFORMATS: ['EEEE, d MMMM y \\'г\\'.', 'd MMMM y \\'г\\'.', 'd.MM.y \\'г\\'.', 'd.MM.yy \\'г\\'.'],\n  TIMEFORMATS: ['H:mm:ss \\'ч\\'. zzzz', 'H:mm:ss \\'ч\\'. z', 'H:mm:ss \\'ч\\'.', 'H:mm \\'ч\\'.'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale bn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bn = {\n  ZERODIGIT: 0x09E6,\n  ERAS: ['খ্রিস্টপূর্ব', 'খৃষ্টাব্দ'],\n  ERANAMES: ['খ্রিস্টপূর্ব', 'খ্রীষ্টাব্দ'],\n  NARROWMONTHS: ['জা', 'ফে', 'মা', 'এ', 'মে', 'জুন', 'জু', 'আ', 'সে', 'অ', 'ন', 'ডি'],\n  STANDALONENARROWMONTHS: ['জা', 'ফে', 'মা', 'এ', 'মে', 'জুন', 'জু', 'আ', 'সে', 'অ', 'ন', 'ডি'],\n  MONTHS: ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'],\n  STANDALONEMONTHS: ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'],\n  SHORTMONTHS: ['জানু', 'ফেব', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'],\n  STANDALONESHORTMONTHS: ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'],\n  WEEKDAYS: ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'],\n  STANDALONEWEEKDAYS: ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'],\n  SHORTWEEKDAYS: ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'],\n  STANDALONESHORTWEEKDAYS: ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'],\n  NARROWWEEKDAYS: ['র', 'সো', 'ম', 'বু', 'বৃ', 'শু', 'শ'],\n  STANDALONENARROWWEEKDAYS: ['র', 'সো', 'ম', 'বু', 'বৃ', 'শু', 'শ'],\n  SHORTQUARTERS: ['ত্রৈমাসিক', 'দ্বিতীয় ত্রৈমাসিক', 'তৃতীয় ত্রৈমাসিক', 'চতুর্থ ত্রৈমাসিক'],\n  QUARTERS: ['ত্রৈমাসিক', 'দ্বিতীয় ত্রৈমাসিক', 'তৃতীয় ত্রৈমাসিক', 'চতুর্থ ত্রৈমাসিক'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM, y', 'd MMM, y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale br.\n * @const\n */\ngoog.i18n.DateTimeSymbols_br = {\n  ERAS: ['a-raok J.K.', 'goude J.K.'],\n  ERANAMES: ['a-raok Jezuz-Krist', 'goude Jezuz-Krist'],\n  NARROWMONTHS: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'],\n  MONTHS: ['Genver', 'Cʼhwevrer', 'Meurzh', 'Ebrel', 'Mae', 'Mezheven', 'Gouere', 'Eost', 'Gwengolo', 'Here', 'Du', 'Kerzu'],\n  STANDALONEMONTHS: ['Genver', 'Cʼhwevrer', 'Meurzh', 'Ebrel', 'Mae', 'Mezheven', 'Gouere', 'Eost', 'Gwengolo', 'Here', 'Du', 'Kerzu'],\n  SHORTMONTHS: ['Gen.', 'Cʼhwe.', 'Meur.', 'Ebr.', 'Mae', 'Mezh.', 'Goue.', 'Eost', 'Gwen.', 'Here', 'Du', 'Kzu.'],\n  STANDALONESHORTMONTHS: ['Gen.', 'Cʼhwe.', 'Meur.', 'Ebr.', 'Mae', 'Mezh.', 'Goue.', 'Eost', 'Gwen.', 'Here', 'Du', 'Kzu.'],\n  WEEKDAYS: ['Sul', 'Lun', 'Meurzh', 'Mercʼher', 'Yaou', 'Gwener', 'Sadorn'],\n  STANDALONEWEEKDAYS: ['Sul', 'Lun', 'Meurzh', 'Mercʼher', 'Yaou', 'Gwener', 'Sadorn'],\n  SHORTWEEKDAYS: ['Sul', 'Lun', 'Meu.', 'Mer.', 'Yaou', 'Gwe.', 'Sad.'],\n  STANDALONESHORTWEEKDAYS: ['Sul', 'Lun', 'Meu.', 'Mer.', 'Yaou', 'Gwe.', 'Sad.'],\n  NARROWWEEKDAYS: ['Su', 'L', 'Mz', 'Mc', 'Y', 'G', 'Sa'],\n  STANDALONENARROWWEEKDAYS: ['Su', 'L', 'Mz', 'Mc', 'Y', 'G', 'Sa'],\n  SHORTQUARTERS: ['1añ trim.', '2l trim.', '3e trim.', '4e trim.'],\n  QUARTERS: ['1añ trimiziad', '2l trimiziad', '3e trimiziad', '4e trimiziad'],\n  AMPMS: ['A.M.', 'G.M.'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'da\\' {0}', '{1} \\'da\\' {0}', '{1}, {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale bs.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bs = {\n  ERAS: ['p. n. e.', 'n. e.'],\n  ERANAMES: ['prije nove ere', 'nove ere'],\n  NARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  MONTHS: ['januar', 'februar', 'mart', 'april', 'maj', 'juni', 'juli', 'august', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  STANDALONEMONTHS: ['januar', 'februar', 'mart', 'april', 'maj', 'juni', 'juli', 'august', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  SHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],\n  STANDALONESHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],\n  WEEKDAYS: ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'],\n  STANDALONEWEEKDAYS: ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'],\n  SHORTWEEKDAYS: ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub'],\n  STANDALONESHORTWEEKDAYS: ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub'],\n  NARROWWEEKDAYS: ['N', 'P', 'U', 'S', 'Č', 'P', 'S'],\n  STANDALONENARROWWEEKDAYS: ['n', 'p', 'u', 's', 'č', 'p', 's'],\n  SHORTQUARTERS: ['KV1', 'KV2', 'KV3', 'KV4'],\n  QUARTERS: ['Prvi kvartal', 'Drugi kvartal', 'Treći kvartal', 'Četvrti kvartal'],\n  AMPMS: ['prijepodne', 'popodne'],\n  DATEFORMATS: ['EEEE, d. MMMM y.', 'd. MMMM y.', 'd. MMM y.', 'd. M. y.'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'u\\' {0}', '{1} \\'u\\' {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ca.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ca = {\n  ERAS: ['aC', 'dC'],\n  ERANAMES: ['abans de Crist', 'després de Crist'],\n  NARROWMONTHS: ['GN', 'FB', 'MÇ', 'AB', 'MG', 'JN', 'JL', 'AG', 'ST', 'OC', 'NV', 'DS'],\n  STANDALONENARROWMONTHS: ['GN', 'FB', 'MÇ', 'AB', 'MG', 'JN', 'JL', 'AG', 'ST', 'OC', 'NV', 'DS'],\n  MONTHS: ['de gener', 'de febrer', 'de març', 'd’abril', 'de maig', 'de juny', 'de juliol', 'd’agost', 'de setembre', 'd’octubre', 'de novembre', 'de desembre'],\n  STANDALONEMONTHS: ['gener', 'febrer', 'març', 'abril', 'maig', 'juny', 'juliol', 'agost', 'setembre', 'octubre', 'novembre', 'desembre'],\n  SHORTMONTHS: ['de gen.', 'de febr.', 'de març', 'd’abr.', 'de maig', 'de juny', 'de jul.', 'd’ag.', 'de set.', 'd’oct.', 'de nov.', 'de des.'],\n  STANDALONESHORTMONTHS: ['gen.', 'febr.', 'març', 'abr.', 'maig', 'juny', 'jul.', 'ag.', 'set.', 'oct.', 'nov.', 'des.'],\n  WEEKDAYS: ['diumenge', 'dilluns', 'dimarts', 'dimecres', 'dijous', 'divendres', 'dissabte'],\n  STANDALONEWEEKDAYS: ['diumenge', 'dilluns', 'dimarts', 'dimecres', 'dijous', 'divendres', 'dissabte'],\n  SHORTWEEKDAYS: ['dg.', 'dl.', 'dt.', 'dc.', 'dj.', 'dv.', 'ds.'],\n  STANDALONESHORTWEEKDAYS: ['dg.', 'dl.', 'dt.', 'dc.', 'dj.', 'dv.', 'ds.'],\n  NARROWWEEKDAYS: ['dg', 'dl', 'dt', 'dc', 'dj', 'dv', 'ds'],\n  STANDALONENARROWWEEKDAYS: ['dg', 'dl', 'dt', 'dc', 'dj', 'dv', 'ds'],\n  SHORTQUARTERS: ['1T', '2T', '3T', '4T'],\n  QUARTERS: ['1r trimestre', '2n trimestre', '3r trimestre', '4t trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d MMMM \\'de\\' y', 'd MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1} \\'a\\' \\'les\\' {0}', '{1} \\'a\\' \\'les\\' {0}', '{1}, {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale chr.\n * @const\n */\ngoog.i18n.DateTimeSymbols_chr = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['ᏧᏓᎷᎸ ᎤᎷᎯᏍᏗ ᎦᎶᏁᏛ', 'ᎠᏃ ᏙᎻᏂ'],\n  NARROWMONTHS: ['Ꭴ', 'Ꭷ', 'Ꭰ', 'Ꭷ', 'Ꭰ', 'Ꮥ', 'Ꭻ', 'Ꭶ', 'Ꮪ', 'Ꮪ', 'Ꮕ', 'Ꭵ'],\n  STANDALONENARROWMONTHS: ['Ꭴ', 'Ꭷ', 'Ꭰ', 'Ꭷ', 'Ꭰ', 'Ꮥ', 'Ꭻ', 'Ꭶ', 'Ꮪ', 'Ꮪ', 'Ꮕ', 'Ꭵ'],\n  MONTHS: ['ᎤᏃᎸᏔᏅ', 'ᎧᎦᎵ', 'ᎠᏅᏱ', 'ᎧᏬᏂ', 'ᎠᏂᏍᎬᏘ', 'ᏕᎭᎷᏱ', 'ᎫᏰᏉᏂ', 'ᎦᎶᏂ', 'ᏚᎵᏍᏗ', 'ᏚᏂᏅᏗ', 'ᏅᏓᏕᏆ', 'ᎥᏍᎩᏱ'],\n  STANDALONEMONTHS: ['ᎤᏃᎸᏔᏅ', 'ᎧᎦᎵ', 'ᎠᏅᏱ', 'ᎧᏬᏂ', 'ᎠᏂᏍᎬᏘ', 'ᏕᎭᎷᏱ', 'ᎫᏰᏉᏂ', 'ᎦᎶᏂ', 'ᏚᎵᏍᏗ', 'ᏚᏂᏅᏗ', 'ᏅᏓᏕᏆ', 'ᎥᏍᎩᏱ'],\n  SHORTMONTHS: ['ᎤᏃ', 'ᎧᎦ', 'ᎠᏅ', 'ᎧᏬ', 'ᎠᏂ', 'ᏕᎭ', 'ᎫᏰ', 'ᎦᎶ', 'ᏚᎵ', 'ᏚᏂ', 'ᏅᏓ', 'ᎥᏍ'],\n  STANDALONESHORTMONTHS: ['ᎤᏃ', 'ᎧᎦ', 'ᎠᏅ', 'ᎧᏬ', 'ᎠᏂ', 'ᏕᎭ', 'ᎫᏰ', 'ᎦᎶ', 'ᏚᎵ', 'ᏚᏂ', 'ᏅᏓ', 'ᎥᏍ'],\n  WEEKDAYS: ['ᎤᎾᏙᏓᏆᏍᎬ', 'ᎤᎾᏙᏓᏉᏅᎯ', 'ᏔᎵᏁᎢᎦ', 'ᏦᎢᏁᎢᎦ', 'ᏅᎩᏁᎢᎦ', 'ᏧᎾᎩᎶᏍᏗ', 'ᎤᎾᏙᏓᏈᏕᎾ'],\n  STANDALONEWEEKDAYS: ['ᎤᎾᏙᏓᏆᏍᎬ', 'ᎤᎾᏙᏓᏉᏅᎯ', 'ᏔᎵᏁᎢᎦ', 'ᏦᎢᏁᎢᎦ', 'ᏅᎩᏁᎢᎦ', 'ᏧᎾᎩᎶᏍᏗ', 'ᎤᎾᏙᏓᏈᏕᎾ'],\n  SHORTWEEKDAYS: ['ᏆᏍᎬ', 'ᏉᏅᎯ', 'ᏔᎵᏁ', 'ᏦᎢᏁ', 'ᏅᎩᏁ', 'ᏧᎾᎩ', 'ᏈᏕᎾ'],\n  STANDALONESHORTWEEKDAYS: ['ᏆᏍᎬ', 'ᏉᏅᎯ', 'ᏔᎵᏁ', 'ᏦᎢᏁ', 'ᏅᎩᏁ', 'ᏧᎾᎩ', 'ᏈᏕᎾ'],\n  NARROWWEEKDAYS: ['Ꮖ', 'Ꮙ', 'Ꮤ', 'Ꮶ', 'Ꮕ', 'Ꮷ', 'Ꭴ'],\n  STANDALONENARROWWEEKDAYS: ['Ꮖ', 'Ꮙ', 'Ꮤ', 'Ꮶ', 'Ꮕ', 'Ꮷ', 'Ꭴ'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st ᎩᏄᏙᏗ', '2nd ᎩᏄᏙᏗ', '3rd ᎩᏄᏙᏗ', '4th ᎩᏄᏙᏗ'],\n  AMPMS: ['ᏌᎾᎴ', 'ᏒᎯᏱᎢᏗᏢ'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} ᎤᎾᎢ {0}', '{1} ᎤᎾᎢ {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale cs.\n * @const\n */\ngoog.i18n.DateTimeSymbols_cs = {\n  ERAS: ['př. n. l.', 'n. l.'],\n  ERANAMES: ['před naším letopočtem', 'našeho letopočtu'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['ledna', 'února', 'března', 'dubna', 'května', 'června', 'července', 'srpna', 'září', 'října', 'listopadu', 'prosince'],\n  STANDALONEMONTHS: ['leden', 'únor', 'březen', 'duben', 'květen', 'červen', 'červenec', 'srpen', 'září', 'říjen', 'listopad', 'prosinec'],\n  SHORTMONTHS: ['led', 'úno', 'bře', 'dub', 'kvě', 'čvn', 'čvc', 'srp', 'zář', 'říj', 'lis', 'pro'],\n  STANDALONESHORTMONTHS: ['led', 'úno', 'bře', 'dub', 'kvě', 'čvn', 'čvc', 'srp', 'zář', 'říj', 'lis', 'pro'],\n  WEEKDAYS: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],\n  STANDALONEWEEKDAYS: ['neděle', 'pondělí', 'úterý', 'středa', 'čtvrtek', 'pátek', 'sobota'],\n  SHORTWEEKDAYS: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],\n  STANDALONESHORTWEEKDAYS: ['ne', 'po', 'út', 'st', 'čt', 'pá', 'so'],\n  NARROWWEEKDAYS: ['N', 'P', 'Ú', 'S', 'Č', 'P', 'S'],\n  STANDALONENARROWWEEKDAYS: ['N', 'P', 'Ú', 'S', 'Č', 'P', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1. čtvrtletí', '2. čtvrtletí', '3. čtvrtletí', '4. čtvrtletí'],\n  AMPMS: ['dop.', 'odp.'],\n  DATEFORMATS: ['EEEE d. MMMM y', 'd. MMMM y', 'd. M. y', 'dd.MM.yy'],\n  TIMEFORMATS: ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale cy.\n * @const\n */\ngoog.i18n.DateTimeSymbols_cy = {\n  ERAS: ['CC', 'OC'],\n  ERANAMES: ['Cyn Crist', 'Oed Crist'],\n  NARROWMONTHS: ['I', 'Ch', 'M', 'E', 'M', 'M', 'G', 'A', 'M', 'H', 'T', 'Rh'],\n  STANDALONENARROWMONTHS: ['I', 'Ch', 'M', 'E', 'M', 'M', 'G', 'A', 'M', 'H', 'T', 'Rh'],\n  MONTHS: ['Ionawr', 'Chwefror', 'Mawrth', 'Ebrill', 'Mai', 'Mehefin', 'Gorffennaf', 'Awst', 'Medi', 'Hydref', 'Tachwedd', 'Rhagfyr'],\n  STANDALONEMONTHS: ['Ionawr', 'Chwefror', 'Mawrth', 'Ebrill', 'Mai', 'Mehefin', 'Gorffennaf', 'Awst', 'Medi', 'Hydref', 'Tachwedd', 'Rhagfyr'],\n  SHORTMONTHS: ['Ion', 'Chwef', 'Maw', 'Ebrill', 'Mai', 'Meh', 'Gorff', 'Awst', 'Medi', 'Hyd', 'Tach', 'Rhag'],\n  STANDALONESHORTMONTHS: ['Ion', 'Chw', 'Maw', 'Ebr', 'Mai', 'Meh', 'Gor', 'Awst', 'Medi', 'Hyd', 'Tach', 'Rhag'],\n  WEEKDAYS: ['Dydd Sul', 'Dydd Llun', 'Dydd Mawrth', 'Dydd Mercher', 'Dydd Iau', 'Dydd Gwener', 'Dydd Sadwrn'],\n  STANDALONEWEEKDAYS: ['Dydd Sul', 'Dydd Llun', 'Dydd Mawrth', 'Dydd Mercher', 'Dydd Iau', 'Dydd Gwener', 'Dydd Sadwrn'],\n  SHORTWEEKDAYS: ['Sul', 'Llun', 'Maw', 'Mer', 'Iau', 'Gwen', 'Sad'],\n  STANDALONESHORTWEEKDAYS: ['Sul', 'Llun', 'Maw', 'Mer', 'Iau', 'Gwe', 'Sad'],\n  NARROWWEEKDAYS: ['S', 'Ll', 'M', 'M', 'I', 'G', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'Ll', 'M', 'M', 'I', 'G', 'S'],\n  SHORTQUARTERS: ['Ch1', 'Ch2', 'Ch3', 'Ch4'],\n  QUARTERS: ['chwarter 1af', '2il chwarter', '3ydd chwarter', '4ydd chwarter'],\n  AMPMS: ['yb', 'yh'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'am\\' {0}', '{1} \\'am\\' {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale da.\n * @const\n */\ngoog.i18n.DateTimeSymbols_da = {\n  ERAS: ['f.Kr.', 'e.Kr.'],\n  ERANAMES: ['f.Kr.', 'e.Kr.'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december'],\n  STANDALONEMONTHS: ['januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],\n  STANDALONEWEEKDAYS: ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],\n  SHORTWEEKDAYS: ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'],\n  STANDALONESHORTWEEKDAYS: ['søn', 'man', 'tir', 'ons', 'tor', 'fre', 'lør'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'O', 'T', 'F', 'L'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'O', 'T', 'F', 'L'],\n  SHORTQUARTERS: ['1. kvt.', '2. kvt.', '3. kvt.', '4. kvt.'],\n  QUARTERS: ['1. kvartal', '2. kvartal', '3. kvartal', '4. kvartal'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE \\'den\\' d. MMMM y', 'd. MMMM y', 'd. MMM y', 'dd.MM.y'],\n  TIMEFORMATS: ['HH.mm.ss zzzz', 'HH.mm.ss z', 'HH.mm.ss', 'HH.mm'],\n  DATETIMEFORMATS: ['{1} \\'kl\\'. {0}', '{1} \\'kl\\'. {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale de.\n * @const\n */\ngoog.i18n.DateTimeSymbols_de = {\n  ERAS: ['v. Chr.', 'n. Chr.'],\n  ERANAMES: ['v. Chr.', 'n. Chr.'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],\n  STANDALONEMONTHS: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],\n  SHORTMONTHS: ['Jan.', 'Feb.', 'März', 'Apr.', 'Mai', 'Juni', 'Juli', 'Aug.', 'Sept.', 'Okt.', 'Nov.', 'Dez.'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],\n  WEEKDAYS: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],\n  STANDALONEWEEKDAYS: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],\n  SHORTWEEKDAYS: ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'],\n  STANDALONESHORTWEEKDAYS: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],\n  NARROWWEEKDAYS: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1. Quartal', '2. Quartal', '3. Quartal', '4. Quartal'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d. MMMM y', 'd. MMMM y', 'dd.MM.y', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'um\\' {0}', '{1} \\'um\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale de_AT.\n * @const\n */\ngoog.i18n.DateTimeSymbols_de_AT = {\n  ERAS: ['v. Chr.', 'n. Chr.'],\n  ERANAMES: ['v. Chr.', 'n. Chr.'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Jänner', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],\n  STANDALONEMONTHS: ['Jänner', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],\n  SHORTMONTHS: ['Jän.', 'Feb.', 'März', 'Apr.', 'Mai', 'Juni', 'Juli', 'Aug.', 'Sep.', 'Okt.', 'Nov.', 'Dez.'],\n  STANDALONESHORTMONTHS: ['Jän', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],\n  WEEKDAYS: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],\n  STANDALONEWEEKDAYS: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],\n  SHORTWEEKDAYS: ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'],\n  STANDALONESHORTWEEKDAYS: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],\n  NARROWWEEKDAYS: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1. Quartal', '2. Quartal', '3. Quartal', '4. Quartal'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d. MMMM y', 'd. MMMM y', 'dd.MM.y', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'um\\' {0}', '{1} \\'um\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale de_CH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_de_CH = goog.i18n.DateTimeSymbols_de;\n\n\n/**\n * Date/time formatting symbols for locale el.\n * @const\n */\ngoog.i18n.DateTimeSymbols_el = {\n  ERAS: ['π.Χ.', 'μ.Χ.'],\n  ERANAMES: ['προ Χριστού', 'μετά Χριστόν'],\n  NARROWMONTHS: ['Ι', 'Φ', 'Μ', 'Α', 'Μ', 'Ι', 'Ι', 'Α', 'Σ', 'Ο', 'Ν', 'Δ'],\n  STANDALONENARROWMONTHS: ['Ι', 'Φ', 'Μ', 'Α', 'Μ', 'Ι', 'Ι', 'Α', 'Σ', 'Ο', 'Ν', 'Δ'],\n  MONTHS: ['Ιανουαρίου', 'Φεβρουαρίου', 'Μαρτίου', 'Απριλίου', 'Μαΐου', 'Ιουνίου', 'Ιουλίου', 'Αυγούστου', 'Σεπτεμβρίου', 'Οκτωβρίου', 'Νοεμβρίου', 'Δεκεμβρίου'],\n  STANDALONEMONTHS: ['Ιανουάριος', 'Φεβρουάριος', 'Μάρτιος', 'Απρίλιος', 'Μάιος', 'Ιούνιος', 'Ιούλιος', 'Αύγουστος', 'Σεπτέμβριος', 'Οκτώβριος', 'Νοέμβριος', 'Δεκέμβριος'],\n  SHORTMONTHS: ['Ιαν', 'Φεβ', 'Μαρ', 'Απρ', 'Μαΐ', 'Ιουν', 'Ιουλ', 'Αυγ', 'Σεπ', 'Οκτ', 'Νοε', 'Δεκ'],\n  STANDALONESHORTMONTHS: ['Ιαν', 'Φεβ', 'Μάρ', 'Απρ', 'Μάι', 'Ιούν', 'Ιούλ', 'Αύγ', 'Σεπ', 'Οκτ', 'Νοέ', 'Δεκ'],\n  WEEKDAYS: ['Κυριακή', 'Δευτέρα', 'Τρίτη', 'Τετάρτη', 'Πέμπτη', 'Παρασκευή', 'Σάββατο'],\n  STANDALONEWEEKDAYS: ['Κυριακή', 'Δευτέρα', 'Τρίτη', 'Τετάρτη', 'Πέμπτη', 'Παρασκευή', 'Σάββατο'],\n  SHORTWEEKDAYS: ['Κυρ', 'Δευ', 'Τρί', 'Τετ', 'Πέμ', 'Παρ', 'Σάβ'],\n  STANDALONESHORTWEEKDAYS: ['Κυρ', 'Δευ', 'Τρί', 'Τετ', 'Πέμ', 'Παρ', 'Σάβ'],\n  NARROWWEEKDAYS: ['Κ', 'Δ', 'Τ', 'Τ', 'Π', 'Π', 'Σ'],\n  STANDALONENARROWWEEKDAYS: ['Κ', 'Δ', 'Τ', 'Τ', 'Π', 'Π', 'Σ'],\n  SHORTQUARTERS: ['Τ1', 'Τ2', 'Τ3', 'Τ4'],\n  QUARTERS: ['1ο τρίμηνο', '2ο τρίμηνο', '3ο τρίμηνο', '4ο τρίμηνο'],\n  AMPMS: ['π.μ.', 'μ.μ.'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} - {0}', '{1} - {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_AU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_AU = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['Su.', 'M.', 'Tu.', 'W.', 'Th.', 'F.', 'Sa.'],\n  STANDALONENARROWWEEKDAYS: ['Su.', 'M.', 'Tu.', 'W.', 'Th.', 'F.', 'Sa.'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_CA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_CA = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Oct.', 'Nov.', 'Dec.'],\n  STANDALONESHORTMONTHS: ['Jan.', 'Feb.', 'Mar.', 'Apr.', 'May', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Oct.', 'Nov.', 'Dec.'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun.', 'Mon.', 'Tue.', 'Wed.', 'Thu.', 'Fri.', 'Sat.'],\n  STANDALONESHORTWEEKDAYS: ['Sun.', 'Mon.', 'Tue.', 'Wed.', 'Thu.', 'Fri.', 'Sat.'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'y-MM-dd'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_GB.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_GB = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en_IE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_IE = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_IN = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM y', 'dd-MMM-y', 'dd/MM/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_SG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_SG = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_US.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_US = goog.i18n.DateTimeSymbols_en;\n\n\n/**\n * Date/time formatting symbols for locale en_ZA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_ZA = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, dd MMMM y', 'dd MMMM y', 'dd MMM y', 'y/MM/dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.er trimestre', '2.º trimestre', '3.er trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['H:mm:ss (zzzz)', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale es_419.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_419 = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale es_ES.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_ES = goog.i18n.DateTimeSymbols_es;\n\n\n/**\n * Date/time formatting symbols for locale es_MX.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_MX = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['1er. trim.', '2º. trim.', '3er. trim.', '4º trim.'],\n  QUARTERS: ['1.er trimestre', '2º. trimestre', '3.er trimestre', '4o. trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'dd/MM/yy'],\n  TIMEFORMATS: ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es_US.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_US = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.er trimestre', '2.º trimestre', '3.er trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale et.\n * @const\n */\ngoog.i18n.DateTimeSymbols_et = {\n  ERAS: ['eKr', 'pKr'],\n  ERANAMES: ['enne Kristust', 'pärast Kristust'],\n  NARROWMONTHS: ['J', 'V', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'V', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['jaanuar', 'veebruar', 'märts', 'aprill', 'mai', 'juuni', 'juuli', 'august', 'september', 'oktoober', 'november', 'detsember'],\n  STANDALONEMONTHS: ['jaanuar', 'veebruar', 'märts', 'aprill', 'mai', 'juuni', 'juuli', 'august', 'september', 'oktoober', 'november', 'detsember'],\n  SHORTMONTHS: ['jaan', 'veebr', 'märts', 'apr', 'mai', 'juuni', 'juuli', 'aug', 'sept', 'okt', 'nov', 'dets'],\n  STANDALONESHORTMONTHS: ['jaan', 'veebr', 'märts', 'apr', 'mai', 'juuni', 'juuli', 'aug', 'sept', 'okt', 'nov', 'dets'],\n  WEEKDAYS: ['pühapäev', 'esmaspäev', 'teisipäev', 'kolmapäev', 'neljapäev', 'reede', 'laupäev'],\n  STANDALONEWEEKDAYS: ['pühapäev', 'esmaspäev', 'teisipäev', 'kolmapäev', 'neljapäev', 'reede', 'laupäev'],\n  SHORTWEEKDAYS: ['P', 'E', 'T', 'K', 'N', 'R', 'L'],\n  STANDALONESHORTWEEKDAYS: ['P', 'E', 'T', 'K', 'N', 'R', 'L'],\n  NARROWWEEKDAYS: ['P', 'E', 'T', 'K', 'N', 'R', 'L'],\n  STANDALONENARROWWEEKDAYS: ['P', 'E', 'T', 'K', 'N', 'R', 'L'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1. kvartal', '2. kvartal', '3. kvartal', '4. kvartal'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d. MMMM y', 'd. MMMM y', 'd. MMM y', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale eu.\n * @const\n */\ngoog.i18n.DateTimeSymbols_eu = {\n  ERAS: ['K.a.', 'K.o.'],\n  ERANAMES: ['K.a.', 'Kristo ondoren'],\n  NARROWMONTHS: ['U', 'O', 'M', 'A', 'M', 'E', 'U', 'A', 'I', 'U', 'A', 'A'],\n  STANDALONENARROWMONTHS: ['U', 'O', 'M', 'A', 'M', 'E', 'U', 'A', 'I', 'U', 'A', 'A'],\n  MONTHS: ['urtarrila', 'otsaila', 'martxoa', 'apirila', 'maiatza', 'ekaina', 'uztaila', 'abuztua', 'iraila', 'urria', 'azaroa', 'abendua'],\n  STANDALONEMONTHS: ['urtarrila', 'otsaila', 'martxoa', 'apirila', 'maiatza', 'ekaina', 'uztaila', 'abuztua', 'iraila', 'urria', 'azaroa', 'abendua'],\n  SHORTMONTHS: ['urt.', 'ots.', 'mar.', 'api.', 'mai.', 'eka.', 'uzt.', 'abu.', 'ira.', 'urr.', 'aza.', 'abe.'],\n  STANDALONESHORTMONTHS: ['urt.', 'ots.', 'mar.', 'api.', 'mai.', 'eka.', 'uzt.', 'abu.', 'ira.', 'urr.', 'aza.', 'abe.'],\n  WEEKDAYS: ['igandea', 'astelehena', 'asteartea', 'asteazkena', 'osteguna', 'ostirala', 'larunbata'],\n  STANDALONEWEEKDAYS: ['igandea', 'astelehena', 'asteartea', 'asteazkena', 'osteguna', 'ostirala', 'larunbata'],\n  SHORTWEEKDAYS: ['ig.', 'al.', 'ar.', 'az.', 'og.', 'or.', 'lr.'],\n  STANDALONESHORTWEEKDAYS: ['ig.', 'al.', 'ar.', 'az.', 'og.', 'or.', 'lr.'],\n  NARROWWEEKDAYS: ['I', 'A', 'A', 'A', 'O', 'O', 'L'],\n  STANDALONENARROWWEEKDAYS: ['I', 'A', 'A', 'A', 'O', 'O', 'L'],\n  SHORTQUARTERS: ['1Hh', '2Hh', '3Hh', '4Hh'],\n  QUARTERS: ['1. hiruhilekoa', '2. hiruhilekoa', '3. hiruhilekoa', '4. hiruhilekoa'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y(\\'e\\')\\'ko\\' MMMM\\'ren\\' d(\\'a\\'), EEEE', 'y(\\'e\\')\\'ko\\' MMMM\\'ren\\' d(\\'a\\')', 'y(\\'e\\')\\'ko\\' MMM d(\\'a\\')', 'yy/M/d'],\n  TIMEFORMATS: ['HH:mm:ss (zzzz)', 'HH:mm:ss (z)', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale fa.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fa = {\n  ZERODIGIT: 0x06F0,\n  ERAS: ['ق.م.', 'م.'],\n  ERANAMES: ['قبل از میلاد', 'میلادی'],\n  NARROWMONTHS: ['ژ', 'ف', 'م', 'آ', 'م', 'ژ', 'ژ', 'ا', 'س', 'ا', 'ن', 'د'],\n  STANDALONENARROWMONTHS: ['ژ', 'ف', 'م', 'آ', 'م', 'ژ', 'ژ', 'ا', 'س', 'ا', 'ن', 'د'],\n  MONTHS: ['ژانویهٔ', 'فوریهٔ', 'مارس', 'آوریل', 'مهٔ', 'ژوئن', 'ژوئیهٔ', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'],\n  STANDALONEMONTHS: ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'],\n  SHORTMONTHS: ['ژانویهٔ', 'فوریهٔ', 'مارس', 'آوریل', 'مهٔ', 'ژوئن', 'ژوئیهٔ', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'],\n  STANDALONESHORTMONTHS: ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'],\n  WEEKDAYS: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  STANDALONEWEEKDAYS: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  SHORTWEEKDAYS: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  STANDALONESHORTWEEKDAYS: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  NARROWWEEKDAYS: ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],\n  STANDALONENARROWWEEKDAYS: ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],\n  SHORTQUARTERS: ['س‌م۱', 'س‌م۲', 'س‌م۳', 'س‌م۴'],\n  QUARTERS: ['سه‌ماههٔ اول', 'سه‌ماههٔ دوم', 'سه‌ماههٔ سوم', 'سه‌ماههٔ چهارم'],\n  AMPMS: ['قبل‌ازظهر', 'بعدازظهر'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'y/M/d'],\n  TIMEFORMATS: ['H:mm:ss (zzzz)', 'H:mm:ss (z)', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1}، ساعت {0}', '{1}، ساعت {0}', '{1}،‏ {0}', '{1}،‏ {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 4],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale fi.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fi = {\n  ERAS: ['eKr.', 'jKr.'],\n  ERANAMES: ['ennen Kristuksen syntymää', 'jälkeen Kristuksen syntymän'],\n  NARROWMONTHS: ['T', 'H', 'M', 'H', 'T', 'K', 'H', 'E', 'S', 'L', 'M', 'J'],\n  STANDALONENARROWMONTHS: ['T', 'H', 'M', 'H', 'T', 'K', 'H', 'E', 'S', 'L', 'M', 'J'],\n  MONTHS: ['tammikuuta', 'helmikuuta', 'maaliskuuta', 'huhtikuuta', 'toukokuuta', 'kesäkuuta', 'heinäkuuta', 'elokuuta', 'syyskuuta', 'lokakuuta', 'marraskuuta', 'joulukuuta'],\n  STANDALONEMONTHS: ['tammikuu', 'helmikuu', 'maaliskuu', 'huhtikuu', 'toukokuu', 'kesäkuu', 'heinäkuu', 'elokuu', 'syyskuu', 'lokakuu', 'marraskuu', 'joulukuu'],\n  SHORTMONTHS: ['tammik.', 'helmik.', 'maalisk.', 'huhtik.', 'toukok.', 'kesäk.', 'heinäk.', 'elok.', 'syysk.', 'lokak.', 'marrask.', 'jouluk.'],\n  STANDALONESHORTMONTHS: ['tammi', 'helmi', 'maalis', 'huhti', 'touko', 'kesä', 'heinä', 'elo', 'syys', 'loka', 'marras', 'joulu'],\n  WEEKDAYS: ['sunnuntaina', 'maanantaina', 'tiistaina', 'keskiviikkona', 'torstaina', 'perjantaina', 'lauantaina'],\n  STANDALONEWEEKDAYS: ['sunnuntai', 'maanantai', 'tiistai', 'keskiviikko', 'torstai', 'perjantai', 'lauantai'],\n  SHORTWEEKDAYS: ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'],\n  STANDALONESHORTWEEKDAYS: ['su', 'ma', 'ti', 'ke', 'to', 'pe', 'la'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'K', 'T', 'P', 'L'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'K', 'T', 'P', 'L'],\n  SHORTQUARTERS: ['1. nelj.', '2. nelj.', '3. nelj.', '4. nelj.'],\n  QUARTERS: ['1. neljännes', '2. neljännes', '3. neljännes', '4. neljännes'],\n  AMPMS: ['ap.', 'ip.'],\n  DATEFORMATS: ['cccc d. MMMM y', 'd. MMMM y', 'd.M.y', 'd.M.y'],\n  TIMEFORMATS: ['H.mm.ss zzzz', 'H.mm.ss z', 'H.mm.ss', 'H.mm'],\n  DATETIMEFORMATS: ['{1} \\'klo\\' {0}', '{1} \\'klo\\' {0}', '{1} \\'klo\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale fil.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fil = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['Ene', 'Peb', 'Mar', 'Abr', 'May', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'],\n  STANDALONENARROWMONTHS: ['E', 'P', 'M', 'A', 'M', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'],\n  MONTHS: ['Enero', 'Pebrero', 'Marso', 'Abril', 'Mayo', 'Hunyo', 'Hulyo', 'Agosto', 'Setyembre', 'Oktubre', 'Nobyembre', 'Disyembre'],\n  STANDALONEMONTHS: ['Enero', 'Pebrero', 'Marso', 'Abril', 'Mayo', 'Hunyo', 'Hulyo', 'Agosto', 'Setyembre', 'Oktubre', 'Nobyembre', 'Disyembre'],\n  SHORTMONTHS: ['Ene', 'Peb', 'Mar', 'Abr', 'May', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'],\n  STANDALONESHORTMONTHS: ['Ene', 'Peb', 'Mar', 'Abr', 'May', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'],\n  WEEKDAYS: ['Linggo', 'Lunes', 'Martes', 'Miyerkules', 'Huwebes', 'Biyernes', 'Sabado'],\n  STANDALONEWEEKDAYS: ['Linggo', 'Lunes', 'Martes', 'Miyerkules', 'Huwebes', 'Biyernes', 'Sabado'],\n  SHORTWEEKDAYS: ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'],\n  STANDALONESHORTWEEKDAYS: ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'],\n  NARROWWEEKDAYS: ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'],\n  STANDALONENARROWWEEKDAYS: ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['ika-1 quarter', 'ika-2 quarter', 'ika-3 quarter', 'ika-4 na quarter'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'nang\\' {0}', '{1} \\'nang\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale fr.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_CA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_CA = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juill.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juill.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'yy-MM-dd'],\n  TIMEFORMATS: ['HH \\'h\\' mm \\'min\\' ss \\'s\\' zzzz', 'HH \\'h\\' mm \\'min\\' ss \\'s\\' z', 'HH \\'h\\' mm \\'min\\' ss \\'s\\'', 'HH \\'h\\' mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ga.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ga = {\n  ERAS: ['RC', 'AD'],\n  ERANAMES: ['Roimh Chríost', 'Anno Domini'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'B', 'M', 'I', 'L', 'M', 'D', 'S', 'N'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'B', 'M', 'I', 'L', 'M', 'D', 'S', 'N'],\n  MONTHS: ['Eanáir', 'Feabhra', 'Márta', 'Aibreán', 'Bealtaine', 'Meitheamh', 'Iúil', 'Lúnasa', 'Meán Fómhair', 'Deireadh Fómhair', 'Samhain', 'Nollaig'],\n  STANDALONEMONTHS: ['Eanáir', 'Feabhra', 'Márta', 'Aibreán', 'Bealtaine', 'Meitheamh', 'Iúil', 'Lúnasa', 'Meán Fómhair', 'Deireadh Fómhair', 'Samhain', 'Nollaig'],\n  SHORTMONTHS: ['Ean', 'Feabh', 'Márta', 'Aib', 'Beal', 'Meith', 'Iúil', 'Lún', 'MFómh', 'DFómh', 'Samh', 'Noll'],\n  STANDALONESHORTMONTHS: ['Ean', 'Feabh', 'Márta', 'Aib', 'Beal', 'Meith', 'Iúil', 'Lún', 'MFómh', 'DFómh', 'Samh', 'Noll'],\n  WEEKDAYS: ['Dé Domhnaigh', 'Dé Luain', 'Dé Máirt', 'Dé Céadaoin', 'Déardaoin', 'Dé hAoine', 'Dé Sathairn'],\n  STANDALONEWEEKDAYS: ['Dé Domhnaigh', 'Dé Luain', 'Dé Máirt', 'Dé Céadaoin', 'Déardaoin', 'Dé hAoine', 'Dé Sathairn'],\n  SHORTWEEKDAYS: ['Domh', 'Luan', 'Máirt', 'Céad', 'Déar', 'Aoine', 'Sath'],\n  STANDALONESHORTWEEKDAYS: ['Domh', 'Luan', 'Máirt', 'Céad', 'Déar', 'Aoine', 'Sath'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'C', 'D', 'A', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'C', 'D', 'A', 'S'],\n  SHORTQUARTERS: ['R1', 'R2', 'R3', 'R4'],\n  QUARTERS: ['1ú ráithe', '2ú ráithe', '3ú ráithe', '4ú ráithe'],\n  AMPMS: ['r.n.', 'i.n.'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale gl.\n * @const\n */\ngoog.i18n.DateTimeSymbols_gl = {\n  ERAS: ['a.C.', 'd.C.'],\n  ERANAMES: ['antes de Cristo', 'despois de Cristo'],\n  NARROWMONTHS: ['x.', 'f.', 'm.', 'a.', 'm.', 'x.', 'x.', 'a.', 's.', 'o.', 'n.', 'd.'],\n  STANDALONENARROWMONTHS: ['X', 'F', 'M', 'A', 'M', 'X', 'X', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['xaneiro', 'febreiro', 'marzo', 'abril', 'maio', 'xuño', 'xullo', 'agosto', 'setembro', 'outubro', 'novembro', 'decembro'],\n  STANDALONEMONTHS: ['Xaneiro', 'Febreiro', 'Marzo', 'Abril', 'Maio', 'Xuño', 'Xullo', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Decembro'],\n  SHORTMONTHS: ['xan.', 'feb.', 'mar.', 'abr.', 'maio', 'xuño', 'xul.', 'ago.', 'set.', 'out.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['Xan.', 'Feb.', 'Mar.', 'Abr.', 'Maio', 'Xuño', 'Xul.', 'Ago.', 'Set.', 'Out.', 'Nov.', 'Dec.'],\n  WEEKDAYS: ['domingo', 'luns', 'martes', 'mércores', 'xoves', 'venres', 'sábado'],\n  STANDALONEWEEKDAYS: ['Domingo', 'Luns', 'Martes', 'Mércores', 'Xoves', 'Venres', 'Sábado'],\n  SHORTWEEKDAYS: ['dom.', 'luns', 'mar.', 'mér.', 'xov.', 'ven.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['Dom.', 'Luns', 'Mar.', 'Mér.', 'Xov.', 'Ven.', 'Sáb.'],\n  NARROWWEEKDAYS: ['d.', 'l.', 'm.', 'm.', 'x.', 'v.', 's.'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'X', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMM \\'de\\' y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{0} \\'do\\' {1}', '{0} \\'do\\' {1}', '{0}, {1}', '{0}, {1}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale gsw.\n * @const\n */\ngoog.i18n.DateTimeSymbols_gsw = {\n  ERAS: ['v. Chr.', 'n. Chr.'],\n  ERANAMES: ['v. Chr.', 'n. Chr.'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'Auguscht', 'Septämber', 'Oktoober', 'Novämber', 'Dezämber'],\n  STANDALONEMONTHS: ['Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'Auguscht', 'Septämber', 'Oktoober', 'Novämber', 'Dezämber'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],\n  WEEKDAYS: ['Sunntig', 'Määntig', 'Ziischtig', 'Mittwuch', 'Dunschtig', 'Friitig', 'Samschtig'],\n  STANDALONEWEEKDAYS: ['Sunntig', 'Määntig', 'Ziischtig', 'Mittwuch', 'Dunschtig', 'Friitig', 'Samschtig'],\n  SHORTWEEKDAYS: ['Su.', 'Mä.', 'Zi.', 'Mi.', 'Du.', 'Fr.', 'Sa.'],\n  STANDALONESHORTWEEKDAYS: ['Su.', 'Mä.', 'Zi.', 'Mi.', 'Du.', 'Fr.', 'Sa.'],\n  NARROWWEEKDAYS: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1. Quartal', '2. Quartal', '3. Quartal', '4. Quartal'],\n  AMPMS: ['am Vormittag', 'am Namittag'],\n  DATEFORMATS: ['EEEE, d. MMMM y', 'd. MMMM y', 'dd.MM.y', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale gu.\n * @const\n */\ngoog.i18n.DateTimeSymbols_gu = {\n  ERAS: ['ઈ.સ.પૂર્વે', 'ઈ.સ.'],\n  ERANAMES: ['ઈસવીસન પૂર્વે', 'ઇસવીસન'],\n  NARROWMONTHS: ['જા', 'ફે', 'મા', 'એ', 'મે', 'જૂ', 'જુ', 'ઑ', 'સ', 'ઑ', 'ન', 'ડિ'],\n  STANDALONENARROWMONTHS: ['જા', 'ફે', 'મા', 'એ', 'મે', 'જૂ', 'જુ', 'ઑ', 'સ', 'ઑ', 'ન', 'ડિ'],\n  MONTHS: ['જાન્યુઆરી', 'ફેબ્રુઆરી', 'માર્ચ', 'એપ્રિલ', 'મે', 'જૂન', 'જુલાઈ', 'ઑગસ્ટ', 'સપ્ટેમ્બર', 'ઑક્ટોબર', 'નવેમ્બર', 'ડિસેમ્બર'],\n  STANDALONEMONTHS: ['જાન્યુઆરી', 'ફેબ્રુઆરી', 'માર્ચ', 'એપ્રિલ', 'મે', 'જૂન', 'જુલાઈ', 'ઑગસ્ટ', 'સપ્ટેમ્બર', 'ઑક્ટોબર', 'નવેમ્બર', 'ડિસેમ્બર'],\n  SHORTMONTHS: ['જાન્યુ', 'ફેબ્રુ', 'માર્ચ', 'એપ્રિલ', 'મે', 'જૂન', 'જુલાઈ', 'ઑગસ્ટ', 'સપ્ટે', 'ઑક્ટો', 'નવે', 'ડિસે'],\n  STANDALONESHORTMONTHS: ['જાન્યુ', 'ફેબ્રુ', 'માર્ચ', 'એપ્રિલ', 'મે', 'જૂન', 'જુલાઈ', 'ઑગસ્ટ', 'સપ્ટે', 'ઑક્ટો', 'નવે', 'ડિસે'],\n  WEEKDAYS: ['રવિવાર', 'સોમવાર', 'મંગળવાર', 'બુધવાર', 'ગુરુવાર', 'શુક્રવાર', 'શનિવાર'],\n  STANDALONEWEEKDAYS: ['રવિવાર', 'સોમવાર', 'મંગળવાર', 'બુધવાર', 'ગુરુવાર', 'શુક્રવાર', 'શનિવાર'],\n  SHORTWEEKDAYS: ['રવિ', 'સોમ', 'મંગળ', 'બુધ', 'ગુરુ', 'શુક્ર', 'શનિ'],\n  STANDALONESHORTWEEKDAYS: ['રવિ', 'સોમ', 'મંગળ', 'બુધ', 'ગુરુ', 'શુક્ર', 'શનિ'],\n  NARROWWEEKDAYS: ['ર', 'સો', 'મં', 'બુ', 'ગુ', 'શુ', 'શ'],\n  STANDALONENARROWWEEKDAYS: ['ર', 'સો', 'મં', 'બુ', 'ગુ', 'શુ', 'શ'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1લો ત્રિમાસ', '2જો ત્રિમાસ', '3જો ત્રિમાસ', '4થો ત્રિમાસ'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM, y', 'd MMM, y', 'd/M/yy'],\n  TIMEFORMATS: ['hh:mm:ss a zzzz', 'hh:mm:ss a z', 'hh:mm:ss a', 'hh:mm a'],\n  DATETIMEFORMATS: ['{1} એ {0} વાગ્યે', '{1} એ {0} વાગ્યે', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale haw.\n * @const\n */\ngoog.i18n.DateTimeSymbols_haw = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['Ianuali', 'Pepeluali', 'Malaki', 'ʻApelila', 'Mei', 'Iune', 'Iulai', 'ʻAukake', 'Kepakemapa', 'ʻOkakopa', 'Nowemapa', 'Kekemapa'],\n  STANDALONEMONTHS: ['Ianuali', 'Pepeluali', 'Malaki', 'ʻApelila', 'Mei', 'Iune', 'Iulai', 'ʻAukake', 'Kepakemapa', 'ʻOkakopa', 'Nowemapa', 'Kekemapa'],\n  SHORTMONTHS: ['Ian.', 'Pep.', 'Mal.', 'ʻAp.', 'Mei', 'Iun.', 'Iul.', 'ʻAu.', 'Kep.', 'ʻOk.', 'Now.', 'Kek.'],\n  STANDALONESHORTMONTHS: ['Ian.', 'Pep.', 'Mal.', 'ʻAp.', 'Mei', 'Iun.', 'Iul.', 'ʻAu.', 'Kep.', 'ʻOk.', 'Now.', 'Kek.'],\n  WEEKDAYS: ['Lāpule', 'Poʻakahi', 'Poʻalua', 'Poʻakolu', 'Poʻahā', 'Poʻalima', 'Poʻaono'],\n  STANDALONEWEEKDAYS: ['Lāpule', 'Poʻakahi', 'Poʻalua', 'Poʻakolu', 'Poʻahā', 'Poʻalima', 'Poʻaono'],\n  SHORTWEEKDAYS: ['LP', 'P1', 'P2', 'P3', 'P4', 'P5', 'P6'],\n  STANDALONESHORTWEEKDAYS: ['LP', 'P1', 'P2', 'P3', 'P4', 'P5', 'P6'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale he.\n * @const\n */\ngoog.i18n.DateTimeSymbols_he = {\n  ERAS: ['לפנה״ס', 'לספירה'],\n  ERANAMES: ['לפני הספירה', 'לספירה'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'],\n  STANDALONEMONTHS: ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'],\n  SHORTMONTHS: ['ינו׳', 'פבר׳', 'מרץ', 'אפר׳', 'מאי', 'יוני', 'יולי', 'אוג׳', 'ספט׳', 'אוק׳', 'נוב׳', 'דצמ׳'],\n  STANDALONESHORTMONTHS: ['ינו׳', 'פבר׳', 'מרץ', 'אפר׳', 'מאי', 'יוני', 'יולי', 'אוג׳', 'ספט׳', 'אוק׳', 'נוב׳', 'דצמ׳'],\n  WEEKDAYS: ['יום ראשון', 'יום שני', 'יום שלישי', 'יום רביעי', 'יום חמישי', 'יום שישי', 'יום שבת'],\n  STANDALONEWEEKDAYS: ['יום ראשון', 'יום שני', 'יום שלישי', 'יום רביעי', 'יום חמישי', 'יום שישי', 'יום שבת'],\n  SHORTWEEKDAYS: ['יום א׳', 'יום ב׳', 'יום ג׳', 'יום ד׳', 'יום ה׳', 'יום ו׳', 'שבת'],\n  STANDALONESHORTWEEKDAYS: ['יום א׳', 'יום ב׳', 'יום ג׳', 'יום ד׳', 'יום ה׳', 'יום ו׳', 'שבת'],\n  NARROWWEEKDAYS: ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'],\n  STANDALONENARROWWEEKDAYS: ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['רבעון 1', 'רבעון 2', 'רבעון 3', 'רבעון 4'],\n  AMPMS: ['לפנה״צ', 'אחה״צ'],\n  DATEFORMATS: ['EEEE, d בMMMM y', 'd בMMMM y', 'd בMMM y', 'd.M.y'],\n  TIMEFORMATS: ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1} בשעה {0}', '{1} בשעה {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale hi.\n * @const\n */\ngoog.i18n.DateTimeSymbols_hi = {\n  ERAS: ['ईसा-पूर्व', 'ईस्वी'],\n  ERANAMES: ['ईसा-पूर्व', 'ईसवी सन'],\n  NARROWMONTHS: ['ज', 'फ़', 'मा', 'अ', 'म', 'जू', 'जु', 'अ', 'सि', 'अ', 'न', 'दि'],\n  STANDALONENARROWMONTHS: ['ज', 'फ़', 'मा', 'अ', 'म', 'जू', 'जु', 'अ', 'सि', 'अ', 'न', 'दि'],\n  MONTHS: ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितंबर', 'अक्तूबर', 'नवंबर', 'दिसंबर'],\n  STANDALONEMONTHS: ['जनवरी', 'फ़रवरी', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुलाई', 'अगस्त', 'सितंबर', 'अक्तूबर', 'नवंबर', 'दिसंबर'],\n  SHORTMONTHS: ['जन॰', 'फ़र॰', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुल॰', 'अग॰', 'सित॰', 'अक्तू॰', 'नव॰', 'दिस॰'],\n  STANDALONESHORTMONTHS: ['जन॰', 'फ़र॰', 'मार्च', 'अप्रैल', 'मई', 'जून', 'जुल॰', 'अग॰', 'सित॰', 'अक्तू॰', 'नव॰', 'दिस॰'],\n  WEEKDAYS: ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'],\n  STANDALONEWEEKDAYS: ['रविवार', 'सोमवार', 'मंगलवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'],\n  SHORTWEEKDAYS: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],\n  STANDALONESHORTWEEKDAYS: ['रवि', 'सोम', 'मंगल', 'बुध', 'गुरु', 'शुक्र', 'शनि'],\n  NARROWWEEKDAYS: ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'],\n  STANDALONENARROWWEEKDAYS: ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'],\n  SHORTQUARTERS: ['ति1', 'ति2', 'ति3', 'ति4'],\n  QUARTERS: ['पहली तिमाही', 'दूसरी तिमाही', 'तीसरी तिमाही', 'चौथी तिमाही'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} को {0}', '{1} को {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale hr.\n * @const\n */\ngoog.i18n.DateTimeSymbols_hr = {\n  ERAS: ['pr. Kr.', 'po. Kr.'],\n  ERANAMES: ['prije Krista', 'poslije Krista'],\n  NARROWMONTHS: ['1.', '2.', '3.', '4.', '5.', '6.', '7.', '8.', '9.', '10.', '11.', '12.'],\n  STANDALONENARROWMONTHS: ['1.', '2.', '3.', '4.', '5.', '6.', '7.', '8.', '9.', '10.', '11.', '12.'],\n  MONTHS: ['siječnja', 'veljače', 'ožujka', 'travnja', 'svibnja', 'lipnja', 'srpnja', 'kolovoza', 'rujna', 'listopada', 'studenoga', 'prosinca'],\n  STANDALONEMONTHS: ['siječanj', 'veljača', 'ožujak', 'travanj', 'svibanj', 'lipanj', 'srpanj', 'kolovoz', 'rujan', 'listopad', 'studeni', 'prosinac'],\n  SHORTMONTHS: ['sij', 'velj', 'ožu', 'tra', 'svi', 'lip', 'srp', 'kol', 'ruj', 'lis', 'stu', 'pro'],\n  STANDALONESHORTMONTHS: ['sij', 'velj', 'ožu', 'tra', 'svi', 'lip', 'srp', 'kol', 'ruj', 'lis', 'stu', 'pro'],\n  WEEKDAYS: ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'],\n  STANDALONEWEEKDAYS: ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'],\n  SHORTWEEKDAYS: ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub'],\n  STANDALONESHORTWEEKDAYS: ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub'],\n  NARROWWEEKDAYS: ['N', 'P', 'U', 'S', 'Č', 'P', 'S'],\n  STANDALONENARROWWEEKDAYS: ['n', 'p', 'u', 's', 'č', 'p', 's'],\n  SHORTQUARTERS: ['1kv', '2kv', '3kv', '4kv'],\n  QUARTERS: ['1. kvartal', '2. kvartal', '3. kvartal', '4. kvartal'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d. MMMM y.', 'd. MMMM y.', 'd. MMM y.', 'dd. MM. y.'],\n  TIMEFORMATS: ['HH:mm:ss (zzzz)', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'u\\' {0}', '{1} \\'u\\' {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale hu.\n * @const\n */\ngoog.i18n.DateTimeSymbols_hu = {\n  ERAS: ['i. e.', 'i. sz.'],\n  ERANAMES: ['Krisztus előtt', 'időszámításunk szerint'],\n  NARROWMONTHS: ['J', 'F', 'M', 'Á', 'M', 'J', 'J', 'A', 'Sz', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'Á', 'M', 'J', 'J', 'A', 'Sz', 'O', 'N', 'D'],\n  MONTHS: ['január', 'február', 'március', 'április', 'május', 'június', 'július', 'augusztus', 'szeptember', 'október', 'november', 'december'],\n  STANDALONEMONTHS: ['január', 'február', 'március', 'április', 'május', 'június', 'július', 'augusztus', 'szeptember', 'október', 'november', 'december'],\n  SHORTMONTHS: ['jan.', 'febr.', 'márc.', 'ápr.', 'máj.', 'jún.', 'júl.', 'aug.', 'szept.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan.', 'febr.', 'márc.', 'ápr.', 'máj.', 'jún.', 'júl.', 'aug.', 'szept.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['vasárnap', 'hétfő', 'kedd', 'szerda', 'csütörtök', 'péntek', 'szombat'],\n  STANDALONEWEEKDAYS: ['vasárnap', 'hétfő', 'kedd', 'szerda', 'csütörtök', 'péntek', 'szombat'],\n  SHORTWEEKDAYS: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],\n  STANDALONESHORTWEEKDAYS: ['V', 'H', 'K', 'Sze', 'Cs', 'P', 'Szo'],\n  NARROWWEEKDAYS: ['V', 'H', 'K', 'Sz', 'Cs', 'P', 'Sz'],\n  STANDALONENARROWWEEKDAYS: ['V', 'H', 'K', 'Sz', 'Cs', 'P', 'Sz'],\n  SHORTQUARTERS: ['I. n.év', 'II. n.év', 'III. n.év', 'IV. n.év'],\n  QUARTERS: ['I. negyedév', 'II. negyedév', 'III. negyedév', 'IV. negyedév'],\n  AMPMS: ['de.', 'du.'],\n  DATEFORMATS: ['y. MMMM d., EEEE', 'y. MMMM d.', 'y. MMM d.', 'y. MM. dd.'],\n  TIMEFORMATS: ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale hy.\n * @const\n */\ngoog.i18n.DateTimeSymbols_hy = {\n  ERAS: ['մ.թ.ա.', 'մ.թ.'],\n  ERANAMES: ['Քրիստոսից առաջ', 'Քրիստոսից հետո'],\n  NARROWMONTHS: ['Հ', 'Փ', 'Մ', 'Ա', 'Մ', 'Հ', 'Հ', 'Օ', 'Ս', 'Հ', 'Ն', 'Դ'],\n  STANDALONENARROWMONTHS: ['Հ', 'Փ', 'Մ', 'Ա', 'Մ', 'Հ', 'Հ', 'Օ', 'Ս', 'Հ', 'Ն', 'Դ'],\n  MONTHS: ['հունվարի', 'փետրվարի', 'մարտի', 'ապրիլի', 'մայիսի', 'հունիսի', 'հուլիսի', 'օգոստոսի', 'սեպտեմբերի', 'հոկտեմբերի', 'նոյեմբերի', 'դեկտեմբերի'],\n  STANDALONEMONTHS: ['հունվար', 'փետրվար', 'մարտ', 'ապրիլ', 'մայիս', 'հունիս', 'հուլիս', 'օգոստոս', 'սեպտեմբեր', 'հոկտեմբեր', 'նոյեմբեր', 'դեկտեմբեր'],\n  SHORTMONTHS: ['հնվ', 'փտվ', 'մրտ', 'ապր', 'մյս', 'հնս', 'հլս', 'օգս', 'սեպ', 'հոկ', 'նոյ', 'դեկ'],\n  STANDALONESHORTMONTHS: ['հնվ', 'փտվ', 'մրտ', 'ապր', 'մյս', 'հնս', 'հլս', 'օգս', 'սեպ', 'հոկ', 'նոյ', 'դեկ'],\n  WEEKDAYS: ['կիրակի', 'երկուշաբթի', 'երեքշաբթի', 'չորեքշաբթի', 'հինգշաբթի', 'ուրբաթ', 'շաբաթ'],\n  STANDALONEWEEKDAYS: ['կիրակի', 'երկուշաբթի', 'երեքշաբթի', 'չորեքշաբթի', 'հինգշաբթի', 'ուրբաթ', 'շաբաթ'],\n  SHORTWEEKDAYS: ['կիր', 'երկ', 'երք', 'չրք', 'հնգ', 'ուր', 'շբթ'],\n  STANDALONESHORTWEEKDAYS: ['կիր', 'երկ', 'երք', 'չրք', 'հնգ', 'ուր', 'շբթ'],\n  NARROWWEEKDAYS: ['Կ', 'Ե', 'Ե', 'Չ', 'Հ', 'Ո', 'Շ'],\n  STANDALONENARROWWEEKDAYS: ['Կ', 'Ե', 'Ե', 'Չ', 'Հ', 'Ո', 'Շ'],\n  SHORTQUARTERS: ['1-ին եռմս.', '2-րդ եռմս.', '3-րդ եռմս.', '4-րդ եռմս.'],\n  QUARTERS: ['1-ին եռամսյակ', '2-րդ եռամսյակ', '3-րդ եռամսյակ', '4-րդ եռամսյակ'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y թ. MMMM d, EEEE', 'dd MMMM, y թ.', 'dd MMM, y թ.', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale id.\n * @const\n */\ngoog.i18n.DateTimeSymbols_id = {\n  ERAS: ['SM', 'M'],\n  ERANAMES: ['Sebelum Masehi', 'Masehi'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'],\n  STANDALONEMONTHS: ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des'],\n  WEEKDAYS: ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'],\n  STANDALONEWEEKDAYS: ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'],\n  SHORTWEEKDAYS: ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'],\n  STANDALONESHORTWEEKDAYS: ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'],\n  NARROWWEEKDAYS: ['M', 'S', 'S', 'R', 'K', 'J', 'S'],\n  STANDALONENARROWWEEKDAYS: ['M', 'S', 'S', 'R', 'K', 'J', 'S'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['Kuartal ke-1', 'Kuartal ke-2', 'Kuartal ke-3', 'Kuartal ke-4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, dd MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH.mm.ss zzzz', 'HH.mm.ss z', 'HH.mm.ss', 'HH.mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale in.\n * @const\n */\ngoog.i18n.DateTimeSymbols_in = {\n  ERAS: ['SM', 'M'],\n  ERANAMES: ['Sebelum Masehi', 'Masehi'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'],\n  STANDALONEMONTHS: ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agu', 'Sep', 'Okt', 'Nov', 'Des'],\n  WEEKDAYS: ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'],\n  STANDALONEWEEKDAYS: ['Minggu', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'],\n  SHORTWEEKDAYS: ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'],\n  STANDALONESHORTWEEKDAYS: ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'],\n  NARROWWEEKDAYS: ['M', 'S', 'S', 'R', 'K', 'J', 'S'],\n  STANDALONENARROWWEEKDAYS: ['M', 'S', 'S', 'R', 'K', 'J', 'S'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['Kuartal ke-1', 'Kuartal ke-2', 'Kuartal ke-3', 'Kuartal ke-4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, dd MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH.mm.ss zzzz', 'HH.mm.ss z', 'HH.mm.ss', 'HH.mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale is.\n * @const\n */\ngoog.i18n.DateTimeSymbols_is = {\n  ERAS: ['f.Kr.', 'e.Kr.'],\n  ERANAMES: ['fyrir Krist', 'eftir Krist'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'Á', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'Á', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janúar', 'febrúar', 'mars', 'apríl', 'maí', 'júní', 'júlí', 'ágúst', 'september', 'október', 'nóvember', 'desember'],\n  STANDALONEMONTHS: ['janúar', 'febrúar', 'mars', 'apríl', 'maí', 'júní', 'júlí', 'ágúst', 'september', 'október', 'nóvember', 'desember'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mar.', 'apr.', 'maí', 'jún.', 'júl.', 'ágú.', 'sep.', 'okt.', 'nóv.', 'des.'],\n  STANDALONESHORTMONTHS: ['jan.', 'feb.', 'mar.', 'apr.', 'maí', 'jún.', 'júl.', 'ágú.', 'sep.', 'okt.', 'nóv.', 'des.'],\n  WEEKDAYS: ['sunnudagur', 'mánudagur', 'þriðjudagur', 'miðvikudagur', 'fimmtudagur', 'föstudagur', 'laugardagur'],\n  STANDALONEWEEKDAYS: ['sunnudagur', 'mánudagur', 'þriðjudagur', 'miðvikudagur', 'fimmtudagur', 'föstudagur', 'laugardagur'],\n  SHORTWEEKDAYS: ['sun.', 'mán.', 'þri.', 'mið.', 'fim.', 'fös.', 'lau.'],\n  STANDALONESHORTWEEKDAYS: ['sun.', 'mán.', 'þri.', 'mið.', 'fim.', 'fös.', 'lau.'],\n  NARROWWEEKDAYS: ['S', 'M', 'Þ', 'M', 'F', 'F', 'L'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'Þ', 'M', 'F', 'F', 'L'],\n  SHORTQUARTERS: ['F1', 'F2', 'F3', 'F4'],\n  QUARTERS: ['1. fjórðungur', '2. fjórðungur', '3. fjórðungur', '4. fjórðungur'],\n  AMPMS: ['f.h.', 'e.h.'],\n  DATEFORMATS: ['EEEE, d. MMMM y', 'd. MMMM y', 'd. MMM y', 'd.M.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'kl\\'. {0}', '{1} \\'kl\\'. {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale it.\n * @const\n */\ngoog.i18n.DateTimeSymbols_it = {\n  ERAS: ['a.C.', 'd.C.'],\n  ERANAMES: ['avanti Cristo', 'dopo Cristo'],\n  NARROWMONTHS: ['G', 'F', 'M', 'A', 'M', 'G', 'L', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['G', 'F', 'M', 'A', 'M', 'G', 'L', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'],\n  STANDALONEMONTHS: ['gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'],\n  SHORTMONTHS: ['gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic'],\n  STANDALONESHORTMONTHS: ['gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic'],\n  WEEKDAYS: ['domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato'],\n  STANDALONEWEEKDAYS: ['domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato'],\n  SHORTWEEKDAYS: ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'],\n  STANDALONESHORTWEEKDAYS: ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'G', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'G', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1º trimestre', '2º trimestre', '3º trimestre', '4º trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale iw.\n * @const\n */\ngoog.i18n.DateTimeSymbols_iw = {\n  ERAS: ['לפנה״ס', 'לספירה'],\n  ERANAMES: ['לפני הספירה', 'לספירה'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'],\n  STANDALONEMONTHS: ['ינואר', 'פברואר', 'מרץ', 'אפריל', 'מאי', 'יוני', 'יולי', 'אוגוסט', 'ספטמבר', 'אוקטובר', 'נובמבר', 'דצמבר'],\n  SHORTMONTHS: ['ינו׳', 'פבר׳', 'מרץ', 'אפר׳', 'מאי', 'יוני', 'יולי', 'אוג׳', 'ספט׳', 'אוק׳', 'נוב׳', 'דצמ׳'],\n  STANDALONESHORTMONTHS: ['ינו׳', 'פבר׳', 'מרץ', 'אפר׳', 'מאי', 'יוני', 'יולי', 'אוג׳', 'ספט׳', 'אוק׳', 'נוב׳', 'דצמ׳'],\n  WEEKDAYS: ['יום ראשון', 'יום שני', 'יום שלישי', 'יום רביעי', 'יום חמישי', 'יום שישי', 'יום שבת'],\n  STANDALONEWEEKDAYS: ['יום ראשון', 'יום שני', 'יום שלישי', 'יום רביעי', 'יום חמישי', 'יום שישי', 'יום שבת'],\n  SHORTWEEKDAYS: ['יום א׳', 'יום ב׳', 'יום ג׳', 'יום ד׳', 'יום ה׳', 'יום ו׳', 'שבת'],\n  STANDALONESHORTWEEKDAYS: ['יום א׳', 'יום ב׳', 'יום ג׳', 'יום ד׳', 'יום ה׳', 'יום ו׳', 'שבת'],\n  NARROWWEEKDAYS: ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'],\n  STANDALONENARROWWEEKDAYS: ['א׳', 'ב׳', 'ג׳', 'ד׳', 'ה׳', 'ו׳', 'ש׳'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['רבעון 1', 'רבעון 2', 'רבעון 3', 'רבעון 4'],\n  AMPMS: ['לפנה״צ', 'אחה״צ'],\n  DATEFORMATS: ['EEEE, d בMMMM y', 'd בMMMM y', 'd בMMM y', 'd.M.y'],\n  TIMEFORMATS: ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1} בשעה {0}', '{1} בשעה {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ja.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ja = {\n  ERAS: ['紀元前', '西暦'],\n  ERANAMES: ['紀元前', '西暦'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONEMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  SHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONESHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  WEEKDAYS: ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'],\n  STANDALONEWEEKDAYS: ['日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日'],\n  SHORTWEEKDAYS: ['日', '月', '火', '水', '木', '金', '土'],\n  STANDALONESHORTWEEKDAYS: ['日', '月', '火', '水', '木', '金', '土'],\n  NARROWWEEKDAYS: ['日', '月', '火', '水', '木', '金', '土'],\n  STANDALONENARROWWEEKDAYS: ['日', '月', '火', '水', '木', '金', '土'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['第1四半期', '第2四半期', '第3四半期', '第4四半期'],\n  AMPMS: ['午前', '午後'],\n  DATEFORMATS: ['y年M月d日EEEE', 'y年M月d日', 'y/MM/dd', 'y/MM/dd'],\n  TIMEFORMATS: ['H時mm分ss秒 zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ka.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ka = {\n  ERAS: ['ძვ. წ.', 'ახ. წ.'],\n  ERANAMES: ['ძველი წელთაღრიცხვით', 'ახალი წელთაღრიცხვით'],\n  NARROWMONTHS: ['ი', 'თ', 'მ', 'ა', 'მ', 'ი', 'ი', 'ა', 'ს', 'ო', 'ნ', 'დ'],\n  STANDALONENARROWMONTHS: ['ი', 'თ', 'მ', 'ა', 'მ', 'ი', 'ი', 'ა', 'ს', 'ო', 'ნ', 'დ'],\n  MONTHS: ['იანვარი', 'თებერვალი', 'მარტი', 'აპრილი', 'მაისი', 'ივნისი', 'ივლისი', 'აგვისტო', 'სექტემბერი', 'ოქტომბერი', 'ნოემბერი', 'დეკემბერი'],\n  STANDALONEMONTHS: ['იანვარი', 'თებერვალი', 'მარტი', 'აპრილი', 'მაისი', 'ივნისი', 'ივლისი', 'აგვისტო', 'სექტემბერი', 'ოქტომბერი', 'ნოემბერი', 'დეკემბერი'],\n  SHORTMONTHS: ['იან', 'თებ', 'მარ', 'აპრ', 'მაი', 'ივნ', 'ივლ', 'აგვ', 'სექ', 'ოქტ', 'ნოე', 'დეკ'],\n  STANDALONESHORTMONTHS: ['იან', 'თებ', 'მარ', 'აპრ', 'მაი', 'ივნ', 'ივლ', 'აგვ', 'სექ', 'ოქტ', 'ნოე', 'დეკ'],\n  WEEKDAYS: ['კვირა', 'ორშაბათი', 'სამშაბათი', 'ოთხშაბათი', 'ხუთშაბათი', 'პარასკევი', 'შაბათი'],\n  STANDALONEWEEKDAYS: ['კვირა', 'ორშაბათი', 'სამშაბათი', 'ოთხშაბათი', 'ხუთშაბათი', 'პარასკევი', 'შაბათი'],\n  SHORTWEEKDAYS: ['კვი', 'ორშ', 'სამ', 'ოთხ', 'ხუთ', 'პარ', 'შაბ'],\n  STANDALONESHORTWEEKDAYS: ['კვი', 'ორშ', 'სამ', 'ოთხ', 'ხუთ', 'პარ', 'შაბ'],\n  NARROWWEEKDAYS: ['კ', 'ო', 'ს', 'ო', 'ხ', 'პ', 'შ'],\n  STANDALONENARROWWEEKDAYS: ['კ', 'ო', 'ს', 'ო', 'ხ', 'პ', 'შ'],\n  SHORTQUARTERS: ['I კვ.', 'II კვ.', 'III კვ.', 'IV კვ.'],\n  QUARTERS: ['I კვარტალი', 'II კვარტალი', 'III კვარტალი', 'IV კვარტალი'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, dd MMMM, y', 'd MMMM, y', 'd MMM. y', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale kk.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kk = {\n  ERAS: ['б.з.д.', 'б.з.'],\n  ERANAMES: ['Біздің заманымызға дейін', 'біздің заманымыз'],\n  NARROWMONTHS: ['Қ', 'А', 'Н', 'С', 'М', 'М', 'Ш', 'Т', 'Қ', 'Қ', 'Қ', 'Ж'],\n  STANDALONENARROWMONTHS: ['Қ', 'А', 'Н', 'С', 'М', 'М', 'Ш', 'Т', 'Қ', 'Қ', 'Қ', 'Ж'],\n  MONTHS: ['қаңтар', 'ақпан', 'наурыз', 'сәуір', 'мамыр', 'маусым', 'шілде', 'тамыз', 'қыркүйек', 'қазан', 'қараша', 'желтоқсан'],\n  STANDALONEMONTHS: ['Қаңтар', 'Ақпан', 'Наурыз', 'Сәуір', 'Мамыр', 'Маусым', 'Шілде', 'Тамыз', 'Қыркүйек', 'Қазан', 'Қараша', 'Желтоқсан'],\n  SHORTMONTHS: ['қаң.', 'ақп.', 'нау.', 'сәу.', 'мам.', 'мау.', 'шіл.', 'там.', 'қыр.', 'қаз.', 'қар.', 'жел.'],\n  STANDALONESHORTMONTHS: ['қаң.', 'ақп.', 'нау.', 'сәу.', 'мам.', 'мау.', 'шіл.', 'там.', 'қыр.', 'қаз.', 'қар.', 'жел.'],\n  WEEKDAYS: ['жексенбі', 'дүйсенбі', 'сейсенбі', 'сәрсенбі', 'бейсенбі', 'жұма', 'сенбі'],\n  STANDALONEWEEKDAYS: ['жексенбі', 'дүйсенбі', 'сейсенбі', 'сәрсенбі', 'бейсенбі', 'жұма', 'сенбі'],\n  SHORTWEEKDAYS: ['жс', 'дс', 'сс', 'ср', 'бс', 'жм', 'сб'],\n  STANDALONESHORTWEEKDAYS: ['жс', 'дс', 'сс', 'ср', 'бс', 'жм', 'сб'],\n  NARROWWEEKDAYS: ['Ж', 'Д', 'С', 'С', 'Б', 'Ж', 'С'],\n  STANDALONENARROWWEEKDAYS: ['Ж', 'Д', 'С', 'С', 'Б', 'Ж', 'С'],\n  SHORTQUARTERS: ['І тқс.', 'ІІ тқс.', 'ІІІ тқс.', 'IV тқс.'],\n  QUARTERS: ['І тоқсан', 'ІІ тоқсан', 'ІІІ тоқсан', 'IV тоқсан'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y \\'ж\\'. d MMMM, EEEE', 'y \\'ж\\'. d MMMM', 'y \\'ж\\'. dd MMM', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale km.\n * @const\n */\ngoog.i18n.DateTimeSymbols_km = {\n  ERAS: ['មុន គ.ស.', 'គ.ស.'],\n  ERANAMES: ['មុន​គ្រិស្តសករាជ', 'គ្រិស្តសករាជ'],\n  NARROWMONTHS: ['ម', 'ក', 'ម', 'ម', 'ឧ', 'ម', 'ក', 'ស', 'ក', 'ត', 'វ', 'ធ'],\n  STANDALONENARROWMONTHS: ['ម', 'ក', 'ម', 'ម', 'ឧ', 'ម', 'ក', 'ស', 'ក', 'ត', 'វ', 'ធ'],\n  MONTHS: ['មករា', 'កុម្ភៈ', 'មីនា', 'មេសា', 'ឧសភា', 'មិថុនា', 'កក្កដា', 'សីហា', 'កញ្ញា', 'តុលា', 'វិច្ឆិកា', 'ធ្នូ'],\n  STANDALONEMONTHS: ['មករា', 'កុម្ភៈ', 'មីនា', 'មេសា', 'ឧសភា', 'មិថុនា', 'កក្កដា', 'សីហា', 'កញ្ញា', 'តុលា', 'វិច្ឆិកា', 'ធ្នូ'],\n  SHORTMONTHS: ['មករា', 'កុម្ភៈ', 'មីនា', 'មេសា', 'ឧសភា', 'មិថុនា', 'កក្កដា', 'សីហា', 'កញ្ញា', 'តុលា', 'វិច្ឆិកា', 'ធ្នូ'],\n  STANDALONESHORTMONTHS: ['មករា', 'កុម្ភៈ', 'មីនា', 'មេសា', 'ឧសភា', 'មិថុនា', 'កក្កដា', 'សីហា', 'កញ្ញា', 'តុលា', 'វិច្ឆិកា', 'ធ្នូ'],\n  WEEKDAYS: ['អាទិត្យ', 'ច័ន្ទ', 'អង្គារ', 'ពុធ', 'ព្រហស្បតិ៍', 'សុក្រ', 'សៅរ៍'],\n  STANDALONEWEEKDAYS: ['អាទិត្យ', 'ចន្ទ', 'អង្គារ', 'ពុធ', 'ព្រហស្បតិ៍', 'សុក្រ', 'សៅរ៍'],\n  SHORTWEEKDAYS: ['អាទិត្យ', 'ចន្ទ', 'អង្គារ', 'ពុធ', 'ព្រហ', 'សុក្រ', 'សៅរ៍'],\n  STANDALONESHORTWEEKDAYS: ['អាទិត្យ', 'ចន្ទ', 'អង្គារ', 'ពុធ', 'ព្រហ', 'សុក្រ', 'សៅរ៍'],\n  NARROWWEEKDAYS: ['អ', 'ច', 'អ', 'ព', 'ព', 'ស', 'ស'],\n  STANDALONENARROWWEEKDAYS: ['អ', 'ច', 'អ', 'ព', 'ព', 'ស', 'ស'],\n  SHORTQUARTERS: ['ត្រីមាសទី 1', 'ត្រីមាសទី 2', 'ត្រីមាសទី 3', 'ត្រីមាសទី 4'],\n  QUARTERS: ['ត្រីមាសទី 1', 'ត្រីមាសទី 2', 'ត្រីមាសទី 3', 'ត្រីមាសទី 4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} នៅ​ម៉ោង {0}', '{1} នៅ​ម៉ោង {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale kn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kn = {\n  ERAS: ['ಕ್ರಿ.ಪೂ', 'ಕ್ರಿ.ಶ'],\n  ERANAMES: ['ಕ್ರಿಸ್ತ ಪೂರ್ವ', 'ಕ್ರಿಸ್ತ ಶಕ'],\n  NARROWMONTHS: ['ಜ', 'ಫೆ', 'ಮಾ', 'ಏ', 'ಮೇ', 'ಜೂ', 'ಜು', 'ಆ', 'ಸೆ', 'ಅ', 'ನ', 'ಡಿ'],\n  STANDALONENARROWMONTHS: ['ಜ', 'ಫೆ', 'ಮಾ', 'ಏ', 'ಮೇ', 'ಜೂ', 'ಜು', 'ಆ', 'ಸೆ', 'ಅ', 'ನ', 'ಡಿ'],\n  MONTHS: ['ಜನವರಿ', 'ಫೆಬ್ರವರಿ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿಲ್', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗಸ್ಟ್', 'ಸೆಪ್ಟೆಂಬರ್', 'ಅಕ್ಟೋಬರ್', 'ನವೆಂಬರ್', 'ಡಿಸೆಂಬರ್'],\n  STANDALONEMONTHS: ['ಜನವರಿ', 'ಫೆಬ್ರವರಿ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿಲ್', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗಸ್ಟ್', 'ಸೆಪ್ಟೆಂಬರ್', 'ಅಕ್ಟೋಬರ್', 'ನವೆಂಬರ್', 'ಡಿಸೆಂಬರ್'],\n  SHORTMONTHS: ['ಜನವರಿ', 'ಫೆಬ್ರವರಿ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿ', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗ', 'ಸೆಪ್ಟೆಂ', 'ಅಕ್ಟೋ', 'ನವೆಂ', 'ಡಿಸೆಂ'],\n  STANDALONESHORTMONTHS: ['ಜನ', 'ಫೆಬ್ರ', 'ಮಾರ್ಚ್', 'ಏಪ್ರಿ', 'ಮೇ', 'ಜೂನ್', 'ಜುಲೈ', 'ಆಗ', 'ಸೆಪ್ಟೆಂ', 'ಅಕ್ಟೋ', 'ನವೆಂ', 'ಡಿಸೆಂ'],\n  WEEKDAYS: ['ಭಾನುವಾರ', 'ಸೋಮವಾರ', 'ಮಂಗಳವಾರ', 'ಬುಧವಾರ', 'ಗುರುವಾರ', 'ಶುಕ್ರವಾರ', 'ಶನಿವಾರ'],\n  STANDALONEWEEKDAYS: ['ಭಾನುವಾರ', 'ಸೋಮವಾರ', 'ಮಂಗಳವಾರ', 'ಬುಧವಾರ', 'ಗುರುವಾರ', 'ಶುಕ್ರವಾರ', 'ಶನಿವಾರ'],\n  SHORTWEEKDAYS: ['ಭಾನು', 'ಸೋಮ', 'ಮಂಗಳ', 'ಬುಧ', 'ಗುರು', 'ಶುಕ್ರ', 'ಶನಿ'],\n  STANDALONESHORTWEEKDAYS: ['ಭಾನು', 'ಸೋಮ', 'ಮಂಗಳ', 'ಬುಧ', 'ಗುರು', 'ಶುಕ್ರ', 'ಶನಿ'],\n  NARROWWEEKDAYS: ['ಭಾ', 'ಸೋ', 'ಮಂ', 'ಬು', 'ಗು', 'ಶು', 'ಶ'],\n  STANDALONENARROWWEEKDAYS: ['ಭಾ', 'ಸೋ', 'ಮಂ', 'ಬು', 'ಗು', 'ಶು', 'ಶ'],\n  SHORTQUARTERS: ['ತ್ರೈ 1', 'ತ್ರೈ 2', 'ತ್ರೈ 3', 'ತ್ರೈ 4'],\n  QUARTERS: ['1ನೇ ತ್ರೈಮಾಸಿಕ', '2ನೇ ತ್ರೈಮಾಸಿಕ', '3ನೇ ತ್ರೈಮಾಸಿಕ', '4ನೇ ತ್ರೈಮಾಸಿಕ'],\n  AMPMS: ['ಪೂರ್ವಾಹ್ನ', 'ಅಪರಾಹ್ನ'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'd/M/yy'],\n  TIMEFORMATS: ['hh:mm:ss a zzzz', 'hh:mm:ss a z', 'hh:mm:ss a', 'hh:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ko.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ko = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['기원전', '서기'],\n  NARROWMONTHS: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  STANDALONENARROWMONTHS: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  MONTHS: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  STANDALONEMONTHS: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  SHORTMONTHS: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  STANDALONESHORTMONTHS: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  WEEKDAYS: ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'],\n  STANDALONEWEEKDAYS: ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'],\n  SHORTWEEKDAYS: ['일', '월', '화', '수', '목', '금', '토'],\n  STANDALONESHORTWEEKDAYS: ['일', '월', '화', '수', '목', '금', '토'],\n  NARROWWEEKDAYS: ['일', '월', '화', '수', '목', '금', '토'],\n  STANDALONENARROWWEEKDAYS: ['일', '월', '화', '수', '목', '금', '토'],\n  SHORTQUARTERS: ['1분기', '2분기', '3분기', '4분기'],\n  QUARTERS: ['제 1/4분기', '제 2/4분기', '제 3/4분기', '제 4/4분기'],\n  AMPMS: ['오전', '오후'],\n  DATEFORMATS: ['y년 M월 d일 EEEE', 'y년 M월 d일', 'y. M. d.', 'yy. M. d.'],\n  TIMEFORMATS: ['a h시 m분 s초 zzzz', 'a h시 m분 s초 z', 'a h:mm:ss', 'a h:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ky.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ky = {\n  ERAS: ['б.з.ч.', 'б.з.'],\n  ERANAMES: ['биздин заманга чейин', 'биздин заман'],\n  NARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  STANDALONENARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  MONTHS: ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'],\n  STANDALONEMONTHS: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],\n  SHORTMONTHS: ['янв.', 'фев.', 'мар.', 'апр.', 'май', 'июн.', 'июл.', 'авг.', 'сен.', 'окт.', 'ноя.', 'дек.'],\n  STANDALONESHORTMONTHS: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'],\n  WEEKDAYS: ['жекшемби', 'дүйшөмбү', 'шейшемби', 'шаршемби', 'бейшемби', 'жума', 'ишемби'],\n  STANDALONEWEEKDAYS: ['жекшемби', 'дүйшөмбү', 'шейшемби', 'шаршемби', 'бейшемби', 'жума', 'ишемби'],\n  SHORTWEEKDAYS: ['жек.', 'дүй.', 'шейш.', 'шарш.', 'бейш.', 'жума', 'ишм.'],\n  STANDALONESHORTWEEKDAYS: ['жек.', 'дүй.', 'шейш.', 'шарш.', 'бейш.', 'жума', 'ишм.'],\n  NARROWWEEKDAYS: ['Ж', 'Д', 'Ш', 'Ш', 'Б', 'Ж', 'И'],\n  STANDALONENARROWWEEKDAYS: ['Ж', 'Д', 'Ш', 'Ш', 'Б', 'Ж', 'И'],\n  SHORTQUARTERS: ['1-чей.', '2-чей.', '3-чей.', '4-чей.'],\n  QUARTERS: ['1-чейрек', '2-чейрек', '3-чейрек', '4-чейрек'],\n  AMPMS: ['таңкы', 'түштөн кийинки'],\n  DATEFORMATS: ['y-\\'ж\\'., d-MMMM, EEEE', 'y-\\'ж\\'., d-MMMM', 'y-\\'ж\\'., d-MMM', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ln.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ln = {\n  ERAS: ['libóso ya', 'nsima ya Y'],\n  ERANAMES: ['Yambo ya Yézu Krís', 'Nsima ya Yézu Krís'],\n  NARROWMONTHS: ['y', 'f', 'm', 'a', 'm', 'y', 'y', 'a', 's', 'ɔ', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['y', 'f', 'm', 'a', 'm', 'y', 'y', 'a', 's', 'ɔ', 'n', 'd'],\n  MONTHS: ['sánzá ya yambo', 'sánzá ya míbalé', 'sánzá ya mísáto', 'sánzá ya mínei', 'sánzá ya mítáno', 'sánzá ya motóbá', 'sánzá ya nsambo', 'sánzá ya mwambe', 'sánzá ya libwa', 'sánzá ya zómi', 'sánzá ya zómi na mɔ̌kɔ́', 'sánzá ya zómi na míbalé'],\n  STANDALONEMONTHS: ['sánzá ya yambo', 'sánzá ya míbalé', 'sánzá ya mísáto', 'sánzá ya mínei', 'sánzá ya mítáno', 'sánzá ya motóbá', 'sánzá ya nsambo', 'sánzá ya mwambe', 'sánzá ya libwa', 'sánzá ya zómi', 'sánzá ya zómi na mɔ̌kɔ́', 'sánzá ya zómi na míbalé'],\n  SHORTMONTHS: ['yan', 'fbl', 'msi', 'apl', 'mai', 'yun', 'yul', 'agt', 'stb', 'ɔtb', 'nvb', 'dsb'],\n  STANDALONESHORTMONTHS: ['yan', 'fbl', 'msi', 'apl', 'mai', 'yun', 'yul', 'agt', 'stb', 'ɔtb', 'nvb', 'dsb'],\n  WEEKDAYS: ['eyenga', 'mokɔlɔ mwa yambo', 'mokɔlɔ mwa míbalé', 'mokɔlɔ mwa mísáto', 'mokɔlɔ ya mínéi', 'mokɔlɔ ya mítáno', 'mpɔ́sɔ'],\n  STANDALONEWEEKDAYS: ['eyenga', 'mokɔlɔ mwa yambo', 'mokɔlɔ mwa míbalé', 'mokɔlɔ mwa mísáto', 'mokɔlɔ ya mínéi', 'mokɔlɔ ya mítáno', 'mpɔ́sɔ'],\n  SHORTWEEKDAYS: ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'],\n  STANDALONESHORTWEEKDAYS: ['eye', 'ybo', 'mbl', 'mst', 'min', 'mtn', 'mps'],\n  NARROWWEEKDAYS: ['e', 'y', 'm', 'm', 'm', 'm', 'p'],\n  STANDALONENARROWWEEKDAYS: ['e', 'y', 'm', 'm', 'm', 'm', 'p'],\n  SHORTQUARTERS: ['SM1', 'SM2', 'SM3', 'SM4'],\n  QUARTERS: ['sánzá mísáto ya yambo', 'sánzá mísáto ya míbalé', 'sánzá mísáto ya mísáto', 'sánzá mísáto ya mínei'],\n  AMPMS: ['ntɔ́ngɔ́', 'mpókwa'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale lo.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lo = {\n  ERAS: ['ກ່ອນ ຄ.ສ.', 'ຄ.ສ.'],\n  ERANAMES: ['ກ່ອນຄຣິດສັກກະລາດ', 'ຄຣິດສັກກະລາດ'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['ມັງກອນ', 'ກຸມພາ', 'ມີນາ', 'ເມສາ', 'ພຶດສະພາ', 'ມິຖຸນາ', 'ກໍລະກົດ', 'ສິງຫາ', 'ກັນຍາ', 'ຕຸລາ', 'ພະຈິກ', 'ທັນວາ'],\n  STANDALONEMONTHS: ['ມັງກອນ', 'ກຸມພາ', 'ມີນາ', 'ເມສາ', 'ພຶດສະພາ', 'ມິຖຸນາ', 'ກໍລະກົດ', 'ສິງຫາ', 'ກັນຍາ', 'ຕຸລາ', 'ພະຈິກ', 'ທັນວາ'],\n  SHORTMONTHS: ['ມ.ກ.', 'ກ.ພ.', 'ມ.ນ.', 'ມ.ສ.', 'ພ.ພ.', 'ມິ.ຖ.', 'ກ.ລ.', 'ສ.ຫ.', 'ກ.ຍ.', 'ຕ.ລ.', 'ພ.ຈ.', 'ທ.ວ.'],\n  STANDALONESHORTMONTHS: ['ມ.ກ.', 'ກ.ພ.', 'ມ.ນ.', 'ມ.ສ.', 'ພ.ພ.', 'ມິ.ຖ.', 'ກ.ລ.', 'ສ.ຫ.', 'ກ.ຍ.', 'ຕ.ລ.', 'ພ.ຈ.', 'ທ.ວ.'],\n  WEEKDAYS: ['ວັນອາທິດ', 'ວັນຈັນ', 'ວັນອັງຄານ', 'ວັນພຸດ', 'ວັນພະຫັດ', 'ວັນສຸກ', 'ວັນເສົາ'],\n  STANDALONEWEEKDAYS: ['ວັນອາທິດ', 'ວັນຈັນ', 'ວັນອັງຄານ', 'ວັນພຸດ', 'ວັນພະຫັດ', 'ວັນສຸກ', 'ວັນເສົາ'],\n  SHORTWEEKDAYS: ['ອາທິດ', 'ຈັນ', 'ອັງຄານ', 'ພຸດ', 'ພະຫັດ', 'ສຸກ', 'ເສົາ'],\n  STANDALONESHORTWEEKDAYS: ['ອາທິດ', 'ຈັນ', 'ອັງຄານ', 'ພຸດ', 'ພະຫັດ', 'ສຸກ', 'ເສົາ'],\n  NARROWWEEKDAYS: ['ອາ', 'ຈ', 'ອ', 'ພ', 'ພຫ', 'ສຸ', 'ສ'],\n  STANDALONENARROWWEEKDAYS: ['ອາ', 'ຈ', 'ອ', 'ພ', 'ພຫ', 'ສຸ', 'ສ'],\n  SHORTQUARTERS: ['ຕມ1', 'ຕມ2', 'ຕມ3', 'ຕມ4'],\n  QUARTERS: ['ໄຕຣມາດ 1', 'ໄຕຣມາດ 2', 'ໄຕຣມາດ 3', 'ໄຕຣມາດ 4'],\n  AMPMS: ['ກ່ອນທ່ຽງ', 'ຫຼັງທ່ຽງ'],\n  DATEFORMATS: ['EEEE ທີ d MMMM G y', 'd MMMM y', 'd MMM y', 'd/M/y'],\n  TIMEFORMATS: ['H ໂມງ m ນາທີ ss ວິນາທີ zzzz', 'H ໂມງ m ນາທີ ss ວິນາທີ z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale lt.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lt = {\n  ERAS: ['pr. Kr.', 'po Kr.'],\n  ERANAMES: ['prieš Kristų', 'po Kristaus'],\n  NARROWMONTHS: ['S', 'V', 'K', 'B', 'G', 'B', 'L', 'R', 'R', 'S', 'L', 'G'],\n  STANDALONENARROWMONTHS: ['S', 'V', 'K', 'B', 'G', 'B', 'L', 'R', 'R', 'S', 'L', 'G'],\n  MONTHS: ['sausio', 'vasario', 'kovo', 'balandžio', 'gegužės', 'birželio', 'liepos', 'rugpjūčio', 'rugsėjo', 'spalio', 'lapkričio', 'gruodžio'],\n  STANDALONEMONTHS: ['sausis', 'vasaris', 'kovas', 'balandis', 'gegužė', 'birželis', 'liepa', 'rugpjūtis', 'rugsėjis', 'spalis', 'lapkritis', 'gruodis'],\n  SHORTMONTHS: ['saus.', 'vas.', 'kov.', 'bal.', 'geg.', 'birž.', 'liep.', 'rugp.', 'rugs.', 'spal.', 'lapkr.', 'gruod.'],\n  STANDALONESHORTMONTHS: ['saus.', 'vas.', 'kov.', 'bal.', 'geg.', 'birž.', 'liep.', 'rugp.', 'rugs.', 'spal.', 'lapkr.', 'gruod.'],\n  WEEKDAYS: ['sekmadienis', 'pirmadienis', 'antradienis', 'trečiadienis', 'ketvirtadienis', 'penktadienis', 'šeštadienis'],\n  STANDALONEWEEKDAYS: ['sekmadienis', 'pirmadienis', 'antradienis', 'trečiadienis', 'ketvirtadienis', 'penktadienis', 'šeštadienis'],\n  SHORTWEEKDAYS: ['sk', 'pr', 'an', 'tr', 'kt', 'pn', 'št'],\n  STANDALONESHORTWEEKDAYS: ['sk', 'pr', 'an', 'tr', 'kt', 'pn', 'št'],\n  NARROWWEEKDAYS: ['S', 'P', 'A', 'T', 'K', 'P', 'Š'],\n  STANDALONENARROWWEEKDAYS: ['S', 'P', 'A', 'T', 'K', 'P', 'Š'],\n  SHORTQUARTERS: ['I k.', 'II k.', 'III k.', 'IV k.'],\n  QUARTERS: ['I ketvirtis', 'II ketvirtis', 'III ketvirtis', 'IV ketvirtis'],\n  AMPMS: ['priešpiet', 'popiet'],\n  DATEFORMATS: ['y \\'m\\'. MMMM d \\'d\\'., EEEE', 'y \\'m\\'. MMMM d \\'d\\'.', 'y-MM-dd', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale lv.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lv = {\n  ERAS: ['p.m.ē.', 'm.ē.'],\n  ERANAMES: ['pirms mūsu ēras', 'mūsu ērā'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvāris', 'februāris', 'marts', 'aprīlis', 'maijs', 'jūnijs', 'jūlijs', 'augusts', 'septembris', 'oktobris', 'novembris', 'decembris'],\n  STANDALONEMONTHS: ['janvāris', 'februāris', 'marts', 'aprīlis', 'maijs', 'jūnijs', 'jūlijs', 'augusts', 'septembris', 'oktobris', 'novembris', 'decembris'],\n  SHORTMONTHS: ['janv.', 'febr.', 'marts', 'apr.', 'maijs', 'jūn.', 'jūl.', 'aug.', 'sept.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['janv.', 'febr.', 'marts', 'apr.', 'maijs', 'jūn.', 'jūl.', 'aug.', 'sept.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['svētdiena', 'pirmdiena', 'otrdiena', 'trešdiena', 'ceturtdiena', 'piektdiena', 'sestdiena'],\n  STANDALONEWEEKDAYS: ['Svētdiena', 'Pirmdiena', 'Otrdiena', 'Trešdiena', 'Ceturtdiena', 'Piektdiena', 'Sestdiena'],\n  SHORTWEEKDAYS: ['svētd.', 'pirmd.', 'otrd.', 'trešd.', 'ceturtd.', 'piektd.', 'sestd.'],\n  STANDALONESHORTWEEKDAYS: ['Svētd.', 'Pirmd.', 'Otrd.', 'Trešd.', 'Ceturtd.', 'Piektd.', 'Sestd.'],\n  NARROWWEEKDAYS: ['S', 'P', 'O', 'T', 'C', 'P', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'P', 'O', 'T', 'C', 'P', 'S'],\n  SHORTQUARTERS: ['1. cet.', '2. cet.', '3. cet.', '4. cet.'],\n  QUARTERS: ['1. ceturksnis', '2. ceturksnis', '3. ceturksnis', '4. ceturksnis'],\n  AMPMS: ['priekšpusdienā', 'pēcpusdienā'],\n  DATEFORMATS: ['EEEE, y. \\'gada\\' d. MMMM', 'y. \\'gada\\' d. MMMM', 'y. \\'gada\\' d. MMM', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale mk.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mk = {\n  ERAS: ['пр.н.е.', 'н.е.'],\n  ERANAMES: ['пред нашата ера', 'од нашата ера'],\n  NARROWMONTHS: ['ј', 'ф', 'м', 'а', 'м', 'ј', 'ј', 'а', 'с', 'о', 'н', 'д'],\n  STANDALONENARROWMONTHS: ['ј', 'ф', 'м', 'а', 'м', 'ј', 'ј', 'а', 'с', 'о', 'н', 'д'],\n  MONTHS: ['јануари', 'февруари', 'март', 'април', 'мај', 'јуни', 'јули', 'август', 'септември', 'октомври', 'ноември', 'декември'],\n  STANDALONEMONTHS: ['јануари', 'февруари', 'март', 'април', 'мај', 'јуни', 'јули', 'август', 'септември', 'октомври', 'ноември', 'декември'],\n  SHORTMONTHS: ['јан.', 'фев.', 'мар.', 'апр.', 'мај', 'јун.', 'јул.', 'авг.', 'септ.', 'окт.', 'ноем.', 'дек.'],\n  STANDALONESHORTMONTHS: ['јан.', 'фев.', 'мар.', 'апр.', 'мај', 'јун.', 'јул.', 'авг.', 'септ.', 'окт.', 'ноем.', 'дек.'],\n  WEEKDAYS: ['недела', 'понеделник', 'вторник', 'среда', 'четврток', 'петок', 'сабота'],\n  STANDALONEWEEKDAYS: ['недела', 'понеделник', 'вторник', 'среда', 'четврток', 'петок', 'сабота'],\n  SHORTWEEKDAYS: ['нед.', 'пон.', 'вт.', 'сре.', 'чет.', 'пет.', 'саб.'],\n  STANDALONESHORTWEEKDAYS: ['нед.', 'пон.', 'вто.', 'сре.', 'чет.', 'пет.', 'саб.'],\n  NARROWWEEKDAYS: ['н', 'п', 'в', 'с', 'ч', 'п', 'с'],\n  STANDALONENARROWWEEKDAYS: ['н', 'п', 'в', 'с', 'ч', 'п', 'с'],\n  SHORTQUARTERS: ['јан-мар', 'апр-јун', 'јул-сеп', 'окт-дек'],\n  QUARTERS: ['прво тромесечје', 'второ тромесечје', 'трето тромесечје', 'четврто тромесечје'],\n  AMPMS: ['претпладне', 'попладне'],\n  DATEFORMATS: ['EEEE, dd MMMM y', 'dd MMMM y', 'dd.M.y', 'dd.M.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ml.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ml = {\n  ERAS: ['ക്രി.മു.', 'എഡി'],\n  ERANAMES: ['ക്രിസ്‌തുവിന് മുമ്പ്', 'ആന്നോ ഡൊമിനി'],\n  NARROWMONTHS: ['ജ', 'ഫെ', 'മാ', 'ഏ', 'മെ', 'ജൂൺ', 'ജൂ', 'ഓ', 'സെ', 'ഒ', 'ന', 'ഡി'],\n  STANDALONENARROWMONTHS: ['ജ', 'ഫെ', 'മാ', 'ഏ', 'മെ', 'ജൂൺ', 'ജൂ', 'ഓ', 'സെ', 'ഒ', 'ന', 'ഡി'],\n  MONTHS: ['ജനുവരി', 'ഫെബ്രുവരി', 'മാർച്ച്', 'ഏപ്രിൽ', 'മേയ്', 'ജൂൺ', 'ജൂലൈ', 'ഓഗസ്റ്റ്', 'സെപ്റ്റംബർ', 'ഒക്‌ടോബർ', 'നവംബർ', 'ഡിസംബർ'],\n  STANDALONEMONTHS: ['ജനുവരി', 'ഫെബ്രുവരി', 'മാർച്ച്', 'ഏപ്രിൽ', 'മേയ്', 'ജൂൺ', 'ജൂലൈ', 'ഓഗസ്റ്റ്', 'സെപ്റ്റംബർ', 'ഒക്‌ടോബർ', 'നവംബർ', 'ഡിസംബർ'],\n  SHORTMONTHS: ['ജനു', 'ഫെബ്രു', 'മാർ', 'ഏപ്രി', 'മേയ്', 'ജൂൺ', 'ജൂലൈ', 'ഓഗ', 'സെപ്റ്റം', 'ഒക്ടോ', 'നവം', 'ഡിസം'],\n  STANDALONESHORTMONTHS: ['ജനു', 'ഫെബ്രു', 'മാർ', 'ഏപ്രി', 'മേയ്', 'ജൂൺ', 'ജൂലൈ', 'ഓഗ', 'സെപ്റ്റം', 'ഒക്ടോ', 'നവം', 'ഡിസം'],\n  WEEKDAYS: ['ഞായറാഴ്‌ച', 'തിങ്കളാഴ്‌ച', 'ചൊവ്വാഴ്ച', 'ബുധനാഴ്‌ച', 'വ്യാഴാഴ്‌ച', 'വെള്ളിയാഴ്‌ച', 'ശനിയാഴ്‌ച'],\n  STANDALONEWEEKDAYS: ['ഞായറാഴ്‌ച', 'തിങ്കളാഴ്‌ച', 'ചൊവ്വാഴ്‌ച', 'ബുധനാഴ്‌ച', 'വ്യാഴാഴ്‌ച', 'വെള്ളിയാഴ്‌ച', 'ശനിയാഴ്‌ച'],\n  SHORTWEEKDAYS: ['ഞായർ', 'തിങ്കൾ', 'ചൊവ്വ', 'ബുധൻ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],\n  STANDALONESHORTWEEKDAYS: ['ഞായർ', 'തിങ്കൾ', 'ചൊവ്വ', 'ബുധൻ', 'വ്യാഴം', 'വെള്ളി', 'ശനി'],\n  NARROWWEEKDAYS: ['ഞ', 'തി', 'ചൊ', 'ബു', 'വ്യാ', 'വെ', 'ശ'],\n  STANDALONENARROWWEEKDAYS: ['ഞാ', 'തി', 'ചൊ', 'ബു', 'വ്യാ', 'വെ', 'ശ'],\n  SHORTQUARTERS: ['ഒന്നാം പാദം', 'രണ്ടാം പാദം', 'മൂന്നാം പാദം', 'നാലാം പാദം'],\n  QUARTERS: ['ഒന്നാം പാദം', 'രണ്ടാം പാദം', 'മൂന്നാം പാദം', 'നാലാം പാദം'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y, MMMM d, EEEE', 'y, MMMM d', 'y, MMM d', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale mn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mn = {\n  ERAS: ['МЭӨ', 'МЭ'],\n  ERANAMES: ['манай эриний өмнөх', 'манай эриний'],\n  NARROWMONTHS: ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII'],\n  STANDALONENARROWMONTHS: ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XI', 'XII'],\n  MONTHS: ['нэгдүгээр сар', 'хоёрдугаар сар', 'гуравдугаар сар', 'дөрөвдүгээр сар', 'тавдугаар сар', 'зургаадугаар сар', 'долоодугаар сар', 'наймдугаар сар', 'есдүгээр сар', 'аравдугаар сар', 'арван нэгдүгээр сар', 'арван хоёрдугаар сар'],\n  STANDALONEMONTHS: ['Нэгдүгээр сар', 'Хоёрдугаар сар', 'Гуравдугаар сар', 'Дөрөвдүгээр сар', 'Тавдугаар сар', 'Зургаадугаар сар', 'Долоодугаар сар', 'Наймдугаар сар', 'Есдүгээр сар', 'Аравдугаар сар', 'Арван нэгдүгээр сар', 'Арван хоёрдугаар сар'],\n  SHORTMONTHS: ['1-р сар', '2-р сар', '3-р сар', '4-р сар', '5-р сар', '6-р сар', '7-р сар', '8-р сар', '9-р сар', '10-р сар', '11-р сар', '12-р сар'],\n  STANDALONESHORTMONTHS: ['1-р сар', '2-р сар', '3-р сар', '4-р сар', '5-р сар', '6-р сар', '7-р сар', '8-р сар', '9-р сар', '10-р сар', '11-р сар', '12-р сар'],\n  WEEKDAYS: ['ням', 'даваа', 'мягмар', 'лхагва', 'пүрэв', 'баасан', 'бямба'],\n  STANDALONEWEEKDAYS: ['Ням', 'Даваа', 'Мягмар', 'Лхагва', 'Пүрэв', 'Баасан', 'Бямба'],\n  SHORTWEEKDAYS: ['Ня', 'Да', 'Мя', 'Лх', 'Пү', 'Ба', 'Бя'],\n  STANDALONESHORTWEEKDAYS: ['Ня', 'Да', 'Мя', 'Лх', 'Пү', 'Ба', 'Бя'],\n  NARROWWEEKDAYS: ['Ня', 'Да', 'Мя', 'Лх', 'Пү', 'Ба', 'Бя'],\n  STANDALONENARROWWEEKDAYS: ['Ня', 'Да', 'Мя', 'Лх', 'Пү', 'Ба', 'Бя'],\n  SHORTQUARTERS: ['I улирал', 'II улирал', 'III улирал', 'IV улирал'],\n  QUARTERS: ['1-р улирал', '2-р улирал', '3-р улирал', '4-р улирал'],\n  AMPMS: ['ү.ө.', 'ү.х.'],\n  DATEFORMATS: ['y.MM.dd, EEEE', 'y.MM.dd', 'y \\'оны\\' MMM\\'ын\\' d', 'y.MM.dd'],\n  TIMEFORMATS: ['HH:mm:ss (zzzz)', 'HH:mm:ss (z)', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale mo.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mo = {\n  ERAS: ['î.Hr.', 'd.Hr.'],\n  ERANAMES: ['înainte de Hristos', 'după Hristos'],\n  NARROWMONTHS: ['I', 'F', 'M', 'A', 'M', 'I', 'I', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['I', 'F', 'M', 'A', 'M', 'I', 'I', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['ianuarie', 'februarie', 'martie', 'aprilie', 'mai', 'iunie', 'iulie', 'august', 'septembrie', 'octombrie', 'noiembrie', 'decembrie'],\n  STANDALONEMONTHS: ['ianuarie', 'februarie', 'martie', 'aprilie', 'mai', 'iunie', 'iulie', 'august', 'septembrie', 'octombrie', 'noiembrie', 'decembrie'],\n  SHORTMONTHS: ['ian.', 'feb.', 'mar.', 'apr.', 'mai', 'iun.', 'iul.', 'aug.', 'sept.', 'oct.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['ian.', 'feb.', 'mar.', 'apr.', 'mai', 'iun.', 'iul.', 'aug.', 'sept.', 'oct.', 'nov.', 'dec.'],\n  WEEKDAYS: ['duminică', 'luni', 'marți', 'miercuri', 'joi', 'vineri', 'sâmbătă'],\n  STANDALONEWEEKDAYS: ['duminică', 'luni', 'marți', 'miercuri', 'joi', 'vineri', 'sâmbătă'],\n  SHORTWEEKDAYS: ['dum.', 'lun.', 'mar.', 'mie.', 'joi', 'vin.', 'sâm.'],\n  STANDALONESHORTWEEKDAYS: ['dum.', 'lun.', 'mar.', 'mie.', 'joi', 'vin.', 'sâm.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['trim. I', 'trim. II', 'trim. III', 'trim. IV'],\n  QUARTERS: ['trimestrul I', 'trimestrul al II-lea', 'trimestrul al III-lea', 'trimestrul al IV-lea'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd.MM.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale mr.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mr = {\n  ZERODIGIT: 0x0966,\n  ERAS: ['इ. स. पू.', 'इ. स.'],\n  ERANAMES: ['ईसवीसनपूर्व', 'ईसवीसन'],\n  NARROWMONTHS: ['जा', 'फे', 'मा', 'ए', 'मे', 'जू', 'जु', 'ऑ', 'स', 'ऑ', 'नो', 'डि'],\n  STANDALONENARROWMONTHS: ['जा', 'फे', 'मा', 'ए', 'मे', 'जू', 'जु', 'ऑ', 'स', 'ऑ', 'नो', 'डि'],\n  MONTHS: ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलै', 'ऑगस्ट', 'सप्टेंबर', 'ऑक्टोबर', 'नोव्हेंबर', 'डिसेंबर'],\n  STANDALONEMONTHS: ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलै', 'ऑगस्ट', 'सप्टेंबर', 'ऑक्टोबर', 'नोव्हेंबर', 'डिसेंबर'],\n  SHORTMONTHS: ['जाने', 'फेब्रु', 'मार्च', 'एप्रि', 'मे', 'जून', 'जुलै', 'ऑग', 'सप्टें', 'ऑक्टो', 'नोव्हें', 'डिसें'],\n  STANDALONESHORTMONTHS: ['जाने', 'फेब्रु', 'मार्च', 'एप्रि', 'मे', 'जून', 'जुलै', 'ऑग', 'सप्टें', 'ऑक्टो', 'नोव्हें', 'डिसें'],\n  WEEKDAYS: ['रविवार', 'सोमवार', 'मंगळवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'],\n  STANDALONEWEEKDAYS: ['रविवार', 'सोमवार', 'मंगळवार', 'बुधवार', 'गुरुवार', 'शुक्रवार', 'शनिवार'],\n  SHORTWEEKDAYS: ['रवि', 'सोम', 'मंगळ', 'बुध', 'गुरु', 'शुक्र', 'शनि'],\n  STANDALONESHORTWEEKDAYS: ['रवि', 'सोम', 'मंगळ', 'बुध', 'गुरु', 'शुक्र', 'शनि'],\n  NARROWWEEKDAYS: ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'],\n  STANDALONENARROWWEEKDAYS: ['र', 'सो', 'मं', 'बु', 'गु', 'शु', 'श'],\n  SHORTQUARTERS: ['ति१', 'ति२', 'ति३', 'ति४'],\n  QUARTERS: ['प्रथम तिमाही', 'द्वितीय तिमाही', 'तृतीय तिमाही', 'चतुर्थ तिमाही'],\n  AMPMS: ['म.पू.', 'म.उ.'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM, y', 'd MMM, y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} रोजी {0}', '{1} रोजी {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ms.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ms = {\n  ERAS: ['S.M.', 'TM'],\n  ERANAMES: ['S.M.', 'TM'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'O', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'O', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januari', 'Februari', 'Mac', 'April', 'Mei', 'Jun', 'Julai', 'Ogos', 'September', 'Oktober', 'November', 'Disember'],\n  STANDALONEMONTHS: ['Januari', 'Februari', 'Mac', 'April', 'Mei', 'Jun', 'Julai', 'Ogos', 'September', 'Oktober', 'November', 'Disember'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ogo', 'Sep', 'Okt', 'Nov', 'Dis'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ogo', 'Sep', 'Okt', 'Nov', 'Dis'],\n  WEEKDAYS: ['Ahad', 'Isnin', 'Selasa', 'Rabu', 'Khamis', 'Jumaat', 'Sabtu'],\n  STANDALONEWEEKDAYS: ['Ahad', 'Isnin', 'Selasa', 'Rabu', 'Khamis', 'Jumaat', 'Sabtu'],\n  SHORTWEEKDAYS: ['Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'],\n  STANDALONESHORTWEEKDAYS: ['Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'],\n  NARROWWEEKDAYS: ['A', 'I', 'S', 'R', 'K', 'J', 'S'],\n  STANDALONENARROWWEEKDAYS: ['A', 'I', 'S', 'R', 'K', 'J', 'S'],\n  SHORTQUARTERS: ['S1', 'S2', 'S3', 'S4'],\n  QUARTERS: ['Suku pertama', 'Suku Ke-2', 'Suku Ke-3', 'Suku Ke-4'],\n  AMPMS: ['PG', 'PTG'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/MM/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale mt.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mt = {\n  ERAS: ['QK', 'WK'],\n  ERANAMES: ['Qabel Kristu', 'Wara Kristu'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'Ġ', 'L', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['Jn', 'Fr', 'Mz', 'Ap', 'Mj', 'Ġn', 'Lj', 'Aw', 'St', 'Ob', 'Nv', 'Dċ'],\n  MONTHS: ['Jannar', 'Frar', 'Marzu', 'April', 'Mejju', 'Ġunju', 'Lulju', 'Awwissu', 'Settembru', 'Ottubru', 'Novembru', 'Diċembru'],\n  STANDALONEMONTHS: ['Jannar', 'Frar', 'Marzu', 'April', 'Mejju', 'Ġunju', 'Lulju', 'Awwissu', 'Settembru', 'Ottubru', 'Novembru', 'Diċembru'],\n  SHORTMONTHS: ['Jan', 'Fra', 'Mar', 'Apr', 'Mej', 'Ġun', 'Lul', 'Aww', 'Set', 'Ott', 'Nov', 'Diċ'],\n  STANDALONESHORTMONTHS: ['Jan', 'Fra', 'Mar', 'Apr', 'Mej', 'Ġun', 'Lul', 'Aww', 'Set', 'Ott', 'Nov', 'Diċ'],\n  WEEKDAYS: ['Il-Ħadd', 'It-Tnejn', 'It-Tlieta', 'L-Erbgħa', 'Il-Ħamis', 'Il-Ġimgħa', 'Is-Sibt'],\n  STANDALONEWEEKDAYS: ['Il-Ħadd', 'It-Tnejn', 'It-Tlieta', 'L-Erbgħa', 'Il-Ħamis', 'Il-Ġimgħa', 'Is-Sibt'],\n  SHORTWEEKDAYS: ['Ħad', 'Tne', 'Tli', 'Erb', 'Ħam', 'Ġim', 'Sib'],\n  STANDALONESHORTWEEKDAYS: ['Ħad', 'Tne', 'Tli', 'Erb', 'Ħam', 'Ġim', 'Sib'],\n  NARROWWEEKDAYS: ['Ħd', 'T', 'Tl', 'Er', 'Ħm', 'Ġm', 'Sb'],\n  STANDALONENARROWWEEKDAYS: ['Ħd', 'Tn', 'Tl', 'Er', 'Ħm', 'Ġm', 'Sb'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1el kwart', '2ni kwart', '3et kwart', '4ba’ kwart'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d \\'ta\\'’ MMMM y', 'd \\'ta\\'’ MMMM y', 'dd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale my.\n * @const\n */\ngoog.i18n.DateTimeSymbols_my = {\n  ZERODIGIT: 0x1040,\n  ERAS: ['ဘီစီ', 'အဒေီ'],\n  ERANAMES: ['ခရစ်တော် မပေါ်မီနှစ်', 'ခရစ်နှစ်'],\n  NARROWMONTHS: ['ဇ', 'ဖ', 'မ', 'ဧ', 'မ', 'ဇ', 'ဇ', 'ဩ', 'စ', 'အ', 'န', 'ဒ'],\n  STANDALONENARROWMONTHS: ['ဇ', 'ဖ', 'မ', 'ဧ', 'မ', 'ဇ', 'ဇ', 'ဩ', 'စ', 'အ', 'န', 'ဒ'],\n  MONTHS: ['ဇန်နဝါရီ', 'ဖေဖော်ဝါရီ', 'မတ်', 'ဧပြီ', 'မေ', 'ဇွန်', 'ဇူလိုင်', 'ဩဂုတ်', 'စက်တင်ဘာ', 'အောက်တိုဘာ', 'နိုဝင်ဘာ', 'ဒီဇင်ဘာ'],\n  STANDALONEMONTHS: ['ဇန်နဝါရီ', 'ဖေဖော်ဝါရီ', 'မတ်', 'ဧပြီ', 'မေ', 'ဇွန်', 'ဇူလိုင်', 'ဩဂုတ်', 'စက်တင်ဘာ', 'အောက်တိုဘာ', 'နိုဝင်ဘာ', 'ဒီဇင်ဘာ'],\n  SHORTMONTHS: ['ဇန်', 'ဖေ', 'မတ်', 'ဧ', 'မေ', 'ဇွန်', 'ဇူ', 'ဩ', 'စက်', 'အောက်', 'နို', 'ဒီ'],\n  STANDALONESHORTMONTHS: ['ဇန်', 'ဖေ', 'မတ်', 'ဧ', 'မေ', 'ဇွန်', 'ဇူ', 'ဩ', 'စက်', 'အောက်', 'နို', 'ဒီ'],\n  WEEKDAYS: ['တနင်္ဂနွေ', 'တနင်္လာ', 'အင်္ဂါ', 'ဗုဒ္ဓဟူး', 'ကြာသပတေး', 'သောကြာ', 'စနေ'],\n  STANDALONEWEEKDAYS: ['တနင်္ဂနွေ', 'တနင်္လာ', 'အင်္ဂါ', 'ဗုဒ္ဓဟူး', 'ကြာသပတေး', 'သောကြာ', 'စနေ'],\n  SHORTWEEKDAYS: ['တနင်္ဂနွေ', 'တနင်္လာ', 'အင်္ဂါ', 'ဗုဒ္ဓဟူး', 'ကြာသပတေး', 'သောကြာ', 'စနေ'],\n  STANDALONESHORTWEEKDAYS: ['တနင်္ဂနွေ', 'တနင်္လာ', 'အင်္ဂါ', 'ဗုဒ္ဓဟူး', 'ကြာသပတေး', 'သောကြာ', 'စနေ'],\n  NARROWWEEKDAYS: ['တ', 'တ', 'အ', 'ဗ', 'က', 'သ', 'စ'],\n  STANDALONENARROWWEEKDAYS: ['တ', 'တ', 'အ', 'ဗ', 'က', 'သ', 'စ'],\n  SHORTQUARTERS: ['ပထမ သုံးလပတ်', 'ဒုတိယ သုံးလပတ်', 'တတိယ သုံးလပတ်', 'စတုတ္ထ သုံးလပတ်'],\n  QUARTERS: ['ပထမ သုံးလပတ်', 'ဒုတိယ သုံးလပတ်', 'တတိယ သုံးလပတ်', 'စတုတ္ထ သုံးလပတ်'],\n  AMPMS: ['နံနက်', 'ညနေ'],\n  DATEFORMATS: ['y၊ MMMM d၊ EEEE', 'y၊ d MMMM', 'y၊ MMM d', 'dd-MM-yy'],\n  TIMEFORMATS: ['zzzz HH:mm:ss', 'z HH:mm:ss', 'B HH:mm:ss', 'B H:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale nb.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nb = {\n  ERAS: ['f.Kr.', 'e.Kr.'],\n  ERANAMES: ['før Kristus', 'etter Kristus'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'],\n  STANDALONEMONTHS: ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mar.', 'apr.', 'mai', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'des.'],\n  STANDALONESHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'],\n  WEEKDAYS: ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],\n  STANDALONEWEEKDAYS: ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],\n  SHORTWEEKDAYS: ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'],\n  STANDALONESHORTWEEKDAYS: ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'O', 'T', 'F', 'L'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'O', 'T', 'F', 'L'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1. kvartal', '2. kvartal', '3. kvartal', '4. kvartal'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE d. MMMM y', 'd. MMMM y', 'd. MMM y', 'dd.MM.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} \\'kl\\'. {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale ne.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ne = {\n  ZERODIGIT: 0x0966,\n  ERAS: ['ईसा पूर्व', 'सन्'],\n  ERANAMES: ['ईसा पूर्व', 'सन्'],\n  NARROWMONTHS: ['जन', 'फेब', 'मार्च', 'अप्र', 'मे', 'जुन', 'जुल', 'अग', 'सेप', 'अक्टो', 'नोभे', 'डिसे'],\n  STANDALONENARROWMONTHS: ['जन', 'फेेब', 'मार्च', 'अप्र', 'मे', 'जुन', 'जुल', 'अग', 'सेप', 'अक्टो', 'नोभे', 'डिसे'],\n  MONTHS: ['जनवरी', 'फेब्रुअरी', 'मार्च', 'अप्रिल', 'मे', 'जुन', 'जुलाई', 'अगस्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'],\n  STANDALONEMONTHS: ['जनवरी', 'फेब्रुअरी', 'मार्च', 'अप्रिल', 'मे', 'जुन', 'जुलाई', 'अगस्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'],\n  SHORTMONTHS: ['जनवरी', 'फेब्रुअरी', 'मार्च', 'अप्रिल', 'मे', 'जुन', 'जुलाई', 'अगस्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'],\n  STANDALONESHORTMONTHS: ['जनवरी', 'फेब्रुअरी', 'मार्च', 'अप्रिल', 'मे', 'जुन', 'जुलाई', 'अगस्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'],\n  WEEKDAYS: ['आइतबार', 'सोमबार', 'मङ्गलबार', 'बुधबार', 'बिहिबार', 'शुक्रबार', 'शनिबार'],\n  STANDALONEWEEKDAYS: ['आइतबार', 'सोमबार', 'मङ्गलबार', 'बुधबार', 'बिहिबार', 'शुक्रबार', 'शनिबार'],\n  SHORTWEEKDAYS: ['आइत', 'सोम', 'मङ्गल', 'बुध', 'बिहि', 'शुक्र', 'शनि'],\n  STANDALONESHORTWEEKDAYS: ['आइत', 'सोम', 'मङ्गल', 'बुध', 'बिहि', 'शुक्र', 'शनि'],\n  NARROWWEEKDAYS: ['आ', 'सो', 'म', 'बु', 'बि', 'शु', 'श'],\n  STANDALONENARROWWEEKDAYS: ['आ', 'सो', 'म', 'बु', 'बि', 'शु', 'श'],\n  SHORTQUARTERS: ['पहिलो सत्र', 'दोस्रो सत्र', 'तेस्रो सत्र', 'चौथो सत्र'],\n  QUARTERS: ['पहिलो सत्र', 'दोस्रो सत्र', 'तेस्रो सत्र', 'चौथो सत्र'],\n  AMPMS: ['पूर्वाह्न', 'अपराह्न'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'yy/M/d'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale nl.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nl = {\n  ERAS: ['v.Chr.', 'n.Chr.'],\n  ERANAMES: ['voor Christus', 'na Christus'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  STANDALONEMONTHS: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  STANDALONEWEEKDAYS: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  SHORTWEEKDAYS: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  STANDALONESHORTWEEKDAYS: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  NARROWWEEKDAYS: ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],\n  STANDALONENARROWWEEKDAYS: ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1e kwartaal', '2e kwartaal', '3e kwartaal', '4e kwartaal'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd-MM-y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'om\\' {0}', '{1} \\'om\\' {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale no.\n * @const\n */\ngoog.i18n.DateTimeSymbols_no = {\n  ERAS: ['f.Kr.', 'e.Kr.'],\n  ERANAMES: ['før Kristus', 'etter Kristus'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'],\n  STANDALONEMONTHS: ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mar.', 'apr.', 'mai', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'des.'],\n  STANDALONESHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'],\n  WEEKDAYS: ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],\n  STANDALONEWEEKDAYS: ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],\n  SHORTWEEKDAYS: ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'],\n  STANDALONESHORTWEEKDAYS: ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'O', 'T', 'F', 'L'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'O', 'T', 'F', 'L'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1. kvartal', '2. kvartal', '3. kvartal', '4. kvartal'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE d. MMMM y', 'd. MMMM y', 'd. MMM y', 'dd.MM.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} \\'kl\\'. {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale no_NO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_no_NO = goog.i18n.DateTimeSymbols_no;\n\n\n/**\n * Date/time formatting symbols for locale or.\n * @const\n */\ngoog.i18n.DateTimeSymbols_or = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['ଖ୍ରୀଷ୍ଟପୂର୍ବ', 'ଖ୍ରୀଷ୍ଟାବ୍ଦ'],\n  NARROWMONTHS: ['ଜା', 'ଫେ', 'ମା', 'ଅ', 'ମଇ', 'ଜୁ', 'ଜୁ', 'ଅ', 'ସେ', 'ଅ', 'ନ', 'ଡି'],\n  STANDALONENARROWMONTHS: ['ଜା', 'ଫେ', 'ମା', 'ଅ', 'ମଇ', 'ଜୁ', 'ଜୁ', 'ଅ', 'ସେ', 'ଅ', 'ନ', 'ଡି'],\n  MONTHS: ['ଜାନୁଆରୀ', 'ଫେବୃଆରୀ', 'ମାର୍ଚ୍ଚ', 'ଅପ୍ରେଲ', 'ମଇ', 'ଜୁନ', 'ଜୁଲାଇ', 'ଅଗଷ୍ଟ', 'ସେପ୍ଟେମ୍ବର', 'ଅକ୍ଟୋବର', 'ନଭେମ୍ବର', 'ଡିସେମ୍ବର'],\n  STANDALONEMONTHS: ['ଜାନୁଆରୀ', 'ଫେବୃଆରୀ', 'ମାର୍ଚ୍ଚ', 'ଅପ୍ରେଲ', 'ମଇ', 'ଜୁନ', 'ଜୁଲାଇ', 'ଅଗଷ୍ଟ', 'ସେପ୍ଟେମ୍ବର', 'ଅକ୍ଟୋବର', 'ନଭେମ୍ବର', 'ଡିସେମ୍ବର'],\n  SHORTMONTHS: ['ଜାନୁଆରୀ', 'ଫେବୃଆରୀ', 'ମାର୍ଚ୍ଚ', 'ଅପ୍ରେଲ', 'ମଇ', 'ଜୁନ', 'ଜୁଲାଇ', 'ଅଗଷ୍ଟ', 'ସେପ୍ଟେମ୍ବର', 'ଅକ୍ଟୋବର', 'ନଭେମ୍ବର', 'ଡିସେମ୍ବର'],\n  STANDALONESHORTMONTHS: ['ଜାନୁଆରୀ', 'ଫେବୃଆରୀ', 'ମାର୍ଚ୍ଚ', 'ଅପ୍ରେଲ', 'ମଇ', 'ଜୁନ', 'ଜୁଲାଇ', 'ଅଗଷ୍ଟ', 'ସେପ୍ଟେମ୍ବର', 'ଅକ୍ଟୋବର', 'ନଭେମ୍ବର', 'ଡିସେମ୍ବର'],\n  WEEKDAYS: ['ରବିବାର', 'ସୋମବାର', 'ମଙ୍ଗଳବାର', 'ବୁଧବାର', 'ଗୁରୁବାର', 'ଶୁକ୍ରବାର', 'ଶନିବାର'],\n  STANDALONEWEEKDAYS: ['ରବିବାର', 'ସୋମବାର', 'ମଙ୍ଗଳବାର', 'ବୁଧବାର', 'ଗୁରୁବାର', 'ଶୁକ୍ରବାର', 'ଶନିବାର'],\n  SHORTWEEKDAYS: ['ରବି', 'ସୋମ', 'ମଙ୍ଗଳ', 'ବୁଧ', 'ଗୁରୁ', 'ଶୁକ୍ର', 'ଶନି'],\n  STANDALONESHORTWEEKDAYS: ['ରବି', 'ସୋମ', 'ମଙ୍ଗଳ', 'ବୁଧ', 'ଗୁରୁ', 'ଶୁକ୍ର', 'ଶନି'],\n  NARROWWEEKDAYS: ['ର', 'ସୋ', 'ମ', 'ବୁ', 'ଗୁ', 'ଶୁ', 'ଶ'],\n  STANDALONENARROWWEEKDAYS: ['ର', 'ସୋ', 'ମ', 'ବୁ', 'ଗୁ', 'ଶୁ', 'ଶ'],\n  SHORTQUARTERS: ['1ମ ତ୍ରୟମାସ', '2ୟ ତ୍ରୟମାସ', '3ୟ ତ୍ରୟମାସ', '4ର୍ଥ ତ୍ରୟମାସ'],\n  QUARTERS: ['1ମ ତ୍ରୟମାସ', '2ୟ ତ୍ରୟମାସ', '3ୟ ତ୍ରୟମାସ', '4ର୍ଥ ତ୍ରୟମାସ'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{0} ଠାରେ {1}', '{0} ଠାରେ {1}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale pa.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pa = {\n  ERAS: ['ਈ. ਪੂ.', 'ਸੰਨ'],\n  ERANAMES: ['ਈਸਵੀ ਪੂਰਵ', 'ਈਸਵੀ ਸੰਨ'],\n  NARROWMONTHS: ['ਜ', 'ਫ਼', 'ਮਾ', 'ਅ', 'ਮ', 'ਜੂ', 'ਜੁ', 'ਅ', 'ਸ', 'ਅ', 'ਨ', 'ਦ'],\n  STANDALONENARROWMONTHS: ['ਜ', 'ਫ਼', 'ਮਾ', 'ਅ', 'ਮ', 'ਜੂ', 'ਜੁ', 'ਅ', 'ਸ', 'ਅ', 'ਨ', 'ਦ'],\n  MONTHS: ['ਜਨਵਰੀ', 'ਫ਼ਰਵਰੀ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈਲ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾਈ', 'ਅਗਸਤ', 'ਸਤੰਬਰ', 'ਅਕਤੂਬਰ', 'ਨਵੰਬਰ', 'ਦਸੰਬਰ'],\n  STANDALONEMONTHS: ['ਜਨਵਰੀ', 'ਫ਼ਰਵਰੀ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈਲ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾਈ', 'ਅਗਸਤ', 'ਸਤੰਬਰ', 'ਅਕਤੂਬਰ', 'ਨਵੰਬਰ', 'ਦਸੰਬਰ'],\n  SHORTMONTHS: ['ਜਨ', 'ਫ਼ਰ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾ', 'ਅਗ', 'ਸਤੰ', 'ਅਕਤੂ', 'ਨਵੰ', 'ਦਸੰ'],\n  STANDALONESHORTMONTHS: ['ਜਨ', 'ਫ਼ਰ', 'ਮਾਰਚ', 'ਅਪ੍ਰੈ', 'ਮਈ', 'ਜੂਨ', 'ਜੁਲਾ', 'ਅਗ', 'ਸਤੰ', 'ਅਕਤੂ', 'ਨਵੰ', 'ਦਸੰ'],\n  WEEKDAYS: ['ਐਤਵਾਰ', 'ਸੋਮਵਾਰ', 'ਮੰਗਲਵਾਰ', 'ਬੁੱਧਵਾਰ', 'ਵੀਰਵਾਰ', 'ਸ਼ੁੱਕਰਵਾਰ', 'ਸ਼ਨਿੱਚਰਵਾਰ'],\n  STANDALONEWEEKDAYS: ['ਐਤਵਾਰ', 'ਸੋਮਵਾਰ', 'ਮੰਗਲਵਾਰ', 'ਬੁੱਧਵਾਰ', 'ਵੀਰਵਾਰ', 'ਸ਼ੁੱਕਰਵਾਰ', 'ਸ਼ਨਿੱਚਰਵਾਰ'],\n  SHORTWEEKDAYS: ['ਐਤ', 'ਸੋਮ', 'ਮੰਗਲ', 'ਬੁੱਧ', 'ਵੀਰ', 'ਸ਼ੁੱਕਰ', 'ਸ਼ਨਿੱਚਰ'],\n  STANDALONESHORTWEEKDAYS: ['ਐਤ', 'ਸੋਮ', 'ਮੰਗਲ', 'ਬੁੱਧ', 'ਵੀਰ', 'ਸ਼ੁੱਕਰ', 'ਸ਼ਨਿੱਚਰ'],\n  NARROWWEEKDAYS: ['ਐ', 'ਸੋ', 'ਮੰ', 'ਬੁੱ', 'ਵੀ', 'ਸ਼ੁੱ', 'ਸ਼'],\n  STANDALONENARROWWEEKDAYS: ['ਐ', 'ਸੋ', 'ਮੰ', 'ਬੁੱ', 'ਵੀ', 'ਸ਼ੁੱ', 'ਸ਼'],\n  SHORTQUARTERS: ['ਤਿਮਾਹੀ1', 'ਤਿਮਾਹੀ2', 'ਤਿਮਾਹੀ3', 'ਤਿਮਾਹੀ4'],\n  QUARTERS: ['ਪਹਿਲੀ ਤਿਮਾਹੀ', 'ਦੂਜੀ ਤਿਮਾਹੀ', 'ਤੀਜੀ ਤਿਮਾਹੀ', 'ਚੌਥੀ ਤਿਮਾਹੀ'],\n  AMPMS: ['ਪੂ.ਦੁ.', 'ਬਾ.ਦੁ.'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale pl.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pl = {\n  ERAS: ['p.n.e.', 'n.e.'],\n  ERANAMES: ['przed naszą erą', 'naszej ery'],\n  NARROWMONTHS: ['s', 'l', 'm', 'k', 'm', 'c', 'l', 's', 'w', 'p', 'l', 'g'],\n  STANDALONENARROWMONTHS: ['S', 'L', 'M', 'K', 'M', 'C', 'L', 'S', 'W', 'P', 'L', 'G'],\n  MONTHS: ['stycznia', 'lutego', 'marca', 'kwietnia', 'maja', 'czerwca', 'lipca', 'sierpnia', 'września', 'października', 'listopada', 'grudnia'],\n  STANDALONEMONTHS: ['styczeń', 'luty', 'marzec', 'kwiecień', 'maj', 'czerwiec', 'lipiec', 'sierpień', 'wrzesień', 'październik', 'listopad', 'grudzień'],\n  SHORTMONTHS: ['sty', 'lut', 'mar', 'kwi', 'maj', 'cze', 'lip', 'sie', 'wrz', 'paź', 'lis', 'gru'],\n  STANDALONESHORTMONTHS: ['sty', 'lut', 'mar', 'kwi', 'maj', 'cze', 'lip', 'sie', 'wrz', 'paź', 'lis', 'gru'],\n  WEEKDAYS: ['niedziela', 'poniedziałek', 'wtorek', 'środa', 'czwartek', 'piątek', 'sobota'],\n  STANDALONEWEEKDAYS: ['niedziela', 'poniedziałek', 'wtorek', 'środa', 'czwartek', 'piątek', 'sobota'],\n  SHORTWEEKDAYS: ['niedz.', 'pon.', 'wt.', 'śr.', 'czw.', 'pt.', 'sob.'],\n  STANDALONESHORTWEEKDAYS: ['niedz.', 'pon.', 'wt.', 'śr.', 'czw.', 'pt.', 'sob.'],\n  NARROWWEEKDAYS: ['n', 'p', 'w', 'ś', 'c', 'p', 's'],\n  STANDALONENARROWWEEKDAYS: ['N', 'P', 'W', 'Ś', 'C', 'P', 'S'],\n  SHORTQUARTERS: ['I kw.', 'II kw.', 'III kw.', 'IV kw.'],\n  QUARTERS: ['I kwartał', 'II kwartał', 'III kwartał', 'IV kwartał'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd.MM.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale pt.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pt = {\n  ERAS: ['a.C.', 'd.C.'],\n  ERANAMES: ['antes de Cristo', 'depois de Cristo'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  STANDALONEMONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  SHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  STANDALONESHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  WEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  SHORTWEEKDAYS: ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'],\n  STANDALONESHORTWEEKDAYS: ['dom', 'seg', 'ter', 'qua', 'qui', 'sex', 'sáb'],\n  NARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1º trimestre', '2º trimestre', '3º trimestre', '4º trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMM \\'de\\' y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale pt_BR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pt_BR = goog.i18n.DateTimeSymbols_pt;\n\n\n/**\n * Date/time formatting symbols for locale pt_PT.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pt_PT = {\n  ERAS: ['a.C.', 'd.C.'],\n  ERANAMES: ['antes de Cristo', 'depois de Cristo'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  STANDALONEMONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  SHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  STANDALONESHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  WEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  SHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  STANDALONESHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  NARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['da manhã', 'da tarde'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'dd/MM/y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'às\\' {0}', '{1} \\'às\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 2\n};\n\n\n/**\n * Date/time formatting symbols for locale ro.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ro = {\n  ERAS: ['î.Hr.', 'd.Hr.'],\n  ERANAMES: ['înainte de Hristos', 'după Hristos'],\n  NARROWMONTHS: ['I', 'F', 'M', 'A', 'M', 'I', 'I', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['I', 'F', 'M', 'A', 'M', 'I', 'I', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['ianuarie', 'februarie', 'martie', 'aprilie', 'mai', 'iunie', 'iulie', 'august', 'septembrie', 'octombrie', 'noiembrie', 'decembrie'],\n  STANDALONEMONTHS: ['ianuarie', 'februarie', 'martie', 'aprilie', 'mai', 'iunie', 'iulie', 'august', 'septembrie', 'octombrie', 'noiembrie', 'decembrie'],\n  SHORTMONTHS: ['ian.', 'feb.', 'mar.', 'apr.', 'mai', 'iun.', 'iul.', 'aug.', 'sept.', 'oct.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['ian.', 'feb.', 'mar.', 'apr.', 'mai', 'iun.', 'iul.', 'aug.', 'sept.', 'oct.', 'nov.', 'dec.'],\n  WEEKDAYS: ['duminică', 'luni', 'marți', 'miercuri', 'joi', 'vineri', 'sâmbătă'],\n  STANDALONEWEEKDAYS: ['duminică', 'luni', 'marți', 'miercuri', 'joi', 'vineri', 'sâmbătă'],\n  SHORTWEEKDAYS: ['dum.', 'lun.', 'mar.', 'mie.', 'joi', 'vin.', 'sâm.'],\n  STANDALONESHORTWEEKDAYS: ['dum.', 'lun.', 'mar.', 'mie.', 'joi', 'vin.', 'sâm.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['trim. I', 'trim. II', 'trim. III', 'trim. IV'],\n  QUARTERS: ['trimestrul I', 'trimestrul al II-lea', 'trimestrul al III-lea', 'trimestrul al IV-lea'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd.MM.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ru.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ru = {\n  ERAS: ['до н. э.', 'н. э.'],\n  ERANAMES: ['до Рождества Христова', 'от Рождества Христова'],\n  NARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  STANDALONENARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  MONTHS: ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'],\n  STANDALONEMONTHS: ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'],\n  SHORTMONTHS: ['янв.', 'февр.', 'мар.', 'апр.', 'мая', 'июн.', 'июл.', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n  STANDALONESHORTMONTHS: ['янв.', 'февр.', 'март', 'апр.', 'май', 'июнь', 'июль', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n  WEEKDAYS: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],\n  STANDALONEWEEKDAYS: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],\n  SHORTWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  STANDALONESHORTWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  NARROWWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  STANDALONENARROWWEEKDAYS: ['В', 'П', 'В', 'С', 'Ч', 'П', 'С'],\n  SHORTQUARTERS: ['1-й кв.', '2-й кв.', '3-й кв.', '4-й кв.'],\n  QUARTERS: ['1-й квартал', '2-й квартал', '3-й квартал', '4-й квартал'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y \\'г\\'.', 'd MMMM y \\'г\\'.', 'd MMM y \\'г\\'.', 'dd.MM.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale sh.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sh = {\n  ERAS: ['p. n. e.', 'n. e.'],\n  ERANAMES: ['pre nove ere', 'nove ere'],\n  NARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  MONTHS: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  STANDALONEMONTHS: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  SHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'avg', 'sep', 'okt', 'nov', 'dec'],\n  STANDALONESHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'avg', 'sep', 'okt', 'nov', 'dec'],\n  WEEKDAYS: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],\n  STANDALONEWEEKDAYS: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],\n  SHORTWEEKDAYS: ['ned', 'pon', 'uto', 'sre', 'čet', 'pet', 'sub'],\n  STANDALONESHORTWEEKDAYS: ['ned', 'pon', 'uto', 'sre', 'čet', 'pet', 'sub'],\n  NARROWWEEKDAYS: ['n', 'p', 'u', 's', 'č', 'p', 's'],\n  STANDALONENARROWWEEKDAYS: ['n', 'p', 'u', 's', 'č', 'p', 's'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['prvi kvartal', 'drugi kvartal', 'treći kvartal', 'četvrti kvartal'],\n  AMPMS: ['pre podne', 'po podne'],\n  DATEFORMATS: ['EEEE, dd. MMMM y.', 'dd. MMMM y.', 'dd.MM.y.', 'd.M.yy.'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale si.\n * @const\n */\ngoog.i18n.DateTimeSymbols_si = {\n  ERAS: ['ක්‍රි.පූ.', 'ක්‍රි.ව.'],\n  ERANAMES: ['ක්‍රිස්තු පූර්ව', 'ක්‍රිස්තු වර්ෂ'],\n  NARROWMONTHS: ['ජ', 'පෙ', 'මා', 'අ', 'මැ', 'ජූ', 'ජූ', 'අ', 'සැ', 'ඔ', 'නෙ', 'දෙ'],\n  STANDALONENARROWMONTHS: ['ජ', 'පෙ', 'මා', 'අ', 'මැ', 'ජූ', 'ජූ', 'අ', 'සැ', 'ඔ', 'නෙ', 'දෙ'],\n  MONTHS: ['ජනවාරි', 'පෙබරවාරි', 'මාර්තු', 'අප්‍රේල්', 'මැයි', 'ජූනි', 'ජූලි', 'අගෝස්තු', 'සැප්තැම්බර්', 'ඔක්තෝබර්', 'නොවැම්බර්', 'දෙසැම්බර්'],\n  STANDALONEMONTHS: ['ජනවාරි', 'පෙබරවාරි', 'මාර්තු', 'අප්‍රේල්', 'මැයි', 'ජූනි', 'ජූලි', 'අගෝස්තු', 'සැප්තැම්බර්', 'ඔක්තෝබර්', 'නොවැම්බර්', 'දෙසැම්බර්'],\n  SHORTMONTHS: ['ජන', 'පෙබ', 'මාර්තු', 'අප්‍රේල්', 'මැයි', 'ජූනි', 'ජූලි', 'අගෝ', 'සැප්', 'ඔක්', 'නොවැ', 'දෙසැ'],\n  STANDALONESHORTMONTHS: ['ජන', 'පෙබ', 'මාර්', 'අප්‍රේල්', 'මැයි', 'ජූනි', 'ජූලි', 'අගෝ', 'සැප්', 'ඔක්', 'නොවැ', 'දෙසැ'],\n  WEEKDAYS: ['ඉරිදා', 'සඳුදා', 'අඟහරුවාදා', 'බදාදා', 'බ්‍රහස්පතින්දා', 'සිකුරාදා', 'සෙනසුරාදා'],\n  STANDALONEWEEKDAYS: ['ඉරිදා', 'සඳුදා', 'අඟහරුවාදා', 'බදාදා', 'බ්‍රහස්පතින්දා', 'සිකුරාදා', 'සෙනසුරාදා'],\n  SHORTWEEKDAYS: ['ඉරිදා', 'සඳුදා', 'අඟහ', 'බදාදා', 'බ්‍රහස්', 'සිකු', 'සෙන'],\n  STANDALONESHORTWEEKDAYS: ['ඉරිදා', 'සඳුදා', 'අඟහ', 'බදාදා', 'බ්‍රහස්', 'සිකු', 'සෙන'],\n  NARROWWEEKDAYS: ['ඉ', 'ස', 'අ', 'බ', 'බ්‍ර', 'සි', 'සෙ'],\n  STANDALONENARROWWEEKDAYS: ['ඉ', 'ස', 'අ', 'බ', 'බ්‍ර', 'සි', 'සෙ'],\n  SHORTQUARTERS: ['කාර්:1', 'කාර්:2', 'කාර්:3', 'කාර්:4'],\n  QUARTERS: ['1 වන කාර්තුව', '2 වන කාර්තුව', '3 වන කාර්තුව', '4 වන කාර්තුව'],\n  AMPMS: ['පෙ.ව.', 'ප.ව.'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH.mm.ss zzzz', 'HH.mm.ss z', 'HH.mm.ss', 'HH.mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sk.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sk = {\n  ERAS: ['pred Kr.', 'po Kr.'],\n  ERANAMES: ['pred Kristom', 'po Kristovi'],\n  NARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  MONTHS: ['januára', 'februára', 'marca', 'apríla', 'mája', 'júna', 'júla', 'augusta', 'septembra', 'októbra', 'novembra', 'decembra'],\n  STANDALONEMONTHS: ['január', 'február', 'marec', 'apríl', 'máj', 'jún', 'júl', 'august', 'september', 'október', 'november', 'december'],\n  SHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'máj', 'jún', 'júl', 'aug', 'sep', 'okt', 'nov', 'dec'],\n  STANDALONESHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'máj', 'jún', 'júl', 'aug', 'sep', 'okt', 'nov', 'dec'],\n  WEEKDAYS: ['nedeľa', 'pondelok', 'utorok', 'streda', 'štvrtok', 'piatok', 'sobota'],\n  STANDALONEWEEKDAYS: ['nedeľa', 'pondelok', 'utorok', 'streda', 'štvrtok', 'piatok', 'sobota'],\n  SHORTWEEKDAYS: ['ne', 'po', 'ut', 'st', 'št', 'pi', 'so'],\n  STANDALONESHORTWEEKDAYS: ['ne', 'po', 'ut', 'st', 'št', 'pi', 'so'],\n  NARROWWEEKDAYS: ['n', 'p', 'u', 's', 'š', 'p', 's'],\n  STANDALONENARROWWEEKDAYS: ['n', 'p', 'u', 's', 'š', 'p', 's'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1. štvrťrok', '2. štvrťrok', '3. štvrťrok', '4. štvrťrok'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d. MMMM y', 'd. MMMM y', 'd. M. y', 'd. M. y'],\n  TIMEFORMATS: ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale sl.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sl = {\n  ERAS: ['pr. Kr.', 'po Kr.'],\n  ERANAMES: ['pred Kristusom', 'po Kristusu'],\n  NARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  MONTHS: ['januar', 'februar', 'marec', 'april', 'maj', 'junij', 'julij', 'avgust', 'september', 'oktober', 'november', 'december'],\n  STANDALONEMONTHS: ['januar', 'februar', 'marec', 'april', 'maj', 'junij', 'julij', 'avgust', 'september', 'oktober', 'november', 'december'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun.', 'jul.', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun.', 'jul.', 'avg.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['nedelja', 'ponedeljek', 'torek', 'sreda', 'četrtek', 'petek', 'sobota'],\n  STANDALONEWEEKDAYS: ['nedelja', 'ponedeljek', 'torek', 'sreda', 'četrtek', 'petek', 'sobota'],\n  SHORTWEEKDAYS: ['ned.', 'pon.', 'tor.', 'sre.', 'čet.', 'pet.', 'sob.'],\n  STANDALONESHORTWEEKDAYS: ['ned.', 'pon.', 'tor.', 'sre.', 'čet.', 'pet.', 'sob.'],\n  NARROWWEEKDAYS: ['n', 'p', 't', 's', 'č', 'p', 's'],\n  STANDALONENARROWWEEKDAYS: ['n', 'p', 't', 's', 'č', 'p', 's'],\n  SHORTQUARTERS: ['1. čet.', '2. čet.', '3. čet.', '4. čet.'],\n  QUARTERS: ['1. četrtletje', '2. četrtletje', '3. četrtletje', '4. četrtletje'],\n  AMPMS: ['dop.', 'pop.'],\n  DATEFORMATS: ['EEEE, dd. MMMM y', 'dd. MMMM y', 'd. MMM y', 'd. MM. yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sq.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sq = {\n  ERAS: ['p.K.', 'mb.K.'],\n  ERANAMES: ['para Krishtit', 'mbas Krishtit'],\n  NARROWMONTHS: ['j', 'sh', 'm', 'p', 'm', 'q', 'k', 'g', 'sh', 't', 'n', 'dh'],\n  STANDALONENARROWMONTHS: ['j', 'sh', 'm', 'p', 'm', 'q', 'k', 'g', 'sh', 't', 'n', 'dh'],\n  MONTHS: ['janar', 'shkurt', 'mars', 'prill', 'maj', 'qershor', 'korrik', 'gusht', 'shtator', 'tetor', 'nëntor', 'dhjetor'],\n  STANDALONEMONTHS: ['janar', 'shkurt', 'mars', 'prill', 'maj', 'qershor', 'korrik', 'gusht', 'shtator', 'tetor', 'nëntor', 'dhjetor'],\n  SHORTMONTHS: ['jan', 'shk', 'mar', 'pri', 'maj', 'qer', 'korr', 'gush', 'sht', 'tet', 'nën', 'dhj'],\n  STANDALONESHORTMONTHS: ['jan', 'shk', 'mar', 'pri', 'maj', 'qer', 'korr', 'gush', 'sht', 'tet', 'nën', 'dhj'],\n  WEEKDAYS: ['e diel', 'e hënë', 'e martë', 'e mërkurë', 'e enjte', 'e premte', 'e shtunë'],\n  STANDALONEWEEKDAYS: ['e diel', 'e hënë', 'e martë', 'e mërkurë', 'e enjte', 'e premte', 'e shtunë'],\n  SHORTWEEKDAYS: ['Die', 'Hën', 'Mar', 'Mër', 'Enj', 'Pre', 'Sht'],\n  STANDALONESHORTWEEKDAYS: ['die', 'hën', 'mar', 'mër', 'enj', 'pre', 'sht'],\n  NARROWWEEKDAYS: ['d', 'h', 'm', 'm', 'e', 'p', 'sh'],\n  STANDALONENARROWWEEKDAYS: ['d', 'h', 'm', 'm', 'e', 'p', 'sh'],\n  SHORTQUARTERS: ['tremujori I', 'tremujori II', 'tremujori III', 'tremujori IV'],\n  QUARTERS: ['tremujori i parë', 'tremujori i dytë', 'tremujori i tretë', 'tremujori i katërt'],\n  AMPMS: ['e paradites', 'e pasdites'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd.M.yy'],\n  TIMEFORMATS: ['h:mm:ss a, zzzz', 'h:mm:ss a, z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'në\\' {0}', '{1} \\'në\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sr.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sr = {\n  ERAS: ['п. н. е.', 'н. е.'],\n  ERANAMES: ['пре нове ере', 'нове ере'],\n  NARROWMONTHS: ['ј', 'ф', 'м', 'а', 'м', 'ј', 'ј', 'а', 'с', 'о', 'н', 'д'],\n  STANDALONENARROWMONTHS: ['ј', 'ф', 'м', 'а', 'м', 'ј', 'ј', 'а', 'с', 'о', 'н', 'д'],\n  MONTHS: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],\n  STANDALONEMONTHS: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],\n  SHORTMONTHS: ['јан', 'феб', 'мар', 'апр', 'мај', 'јун', 'јул', 'авг', 'сеп', 'окт', 'нов', 'дец'],\n  STANDALONESHORTMONTHS: ['јан', 'феб', 'мар', 'апр', 'мај', 'јун', 'јул', 'авг', 'сеп', 'окт', 'нов', 'дец'],\n  WEEKDAYS: ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'],\n  STANDALONEWEEKDAYS: ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'],\n  SHORTWEEKDAYS: ['нед', 'пон', 'уто', 'сре', 'чет', 'пет', 'суб'],\n  STANDALONESHORTWEEKDAYS: ['нед', 'пон', 'уто', 'сре', 'чет', 'пет', 'суб'],\n  NARROWWEEKDAYS: ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],\n  STANDALONENARROWWEEKDAYS: ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],\n  SHORTQUARTERS: ['К1', 'К2', 'К3', 'К4'],\n  QUARTERS: ['први квартал', 'други квартал', 'трећи квартал', 'четврти квартал'],\n  AMPMS: ['пре подне', 'по подне'],\n  DATEFORMATS: ['EEEE, dd. MMMM y.', 'dd. MMMM y.', 'dd.MM.y.', 'd.M.yy.'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sr_Latn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sr_Latn = {\n  ERAS: ['p. n. e.', 'n. e.'],\n  ERANAMES: ['pre nove ere', 'nove ere'],\n  NARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  MONTHS: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  STANDALONEMONTHS: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  SHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'avg', 'sep', 'okt', 'nov', 'dec'],\n  STANDALONESHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'avg', 'sep', 'okt', 'nov', 'dec'],\n  WEEKDAYS: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],\n  STANDALONEWEEKDAYS: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],\n  SHORTWEEKDAYS: ['ned', 'pon', 'uto', 'sre', 'čet', 'pet', 'sub'],\n  STANDALONESHORTWEEKDAYS: ['ned', 'pon', 'uto', 'sre', 'čet', 'pet', 'sub'],\n  NARROWWEEKDAYS: ['n', 'p', 'u', 's', 'č', 'p', 's'],\n  STANDALONENARROWWEEKDAYS: ['n', 'p', 'u', 's', 'č', 'p', 's'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['prvi kvartal', 'drugi kvartal', 'treći kvartal', 'četvrti kvartal'],\n  AMPMS: ['pre podne', 'po podne'],\n  DATEFORMATS: ['EEEE, dd. MMMM y.', 'dd. MMMM y.', 'dd.MM.y.', 'd.M.yy.'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sv.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sv = {\n  ERAS: ['f.Kr.', 'e.Kr.'],\n  ERANAMES: ['före Kristus', 'efter Kristus'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober', 'november', 'december'],\n  STANDALONEMONTHS: ['januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober', 'november', 'december'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mars', 'apr.', 'maj', 'juni', 'juli', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan.', 'feb.', 'mars', 'apr.', 'maj', 'juni', 'juli', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'],\n  STANDALONEWEEKDAYS: ['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'],\n  SHORTWEEKDAYS: ['sön', 'mån', 'tis', 'ons', 'tors', 'fre', 'lör'],\n  STANDALONESHORTWEEKDAYS: ['sön', 'mån', 'tis', 'ons', 'tors', 'fre', 'lör'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'O', 'T', 'F', 'L'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'O', 'T', 'F', 'L'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1:a kvartalet', '2:a kvartalet', '3:e kvartalet', '4:e kvartalet'],\n  AMPMS: ['fm', 'em'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'y-MM-dd'],\n  TIMEFORMATS: ['\\'kl\\'. HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale sw.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sw = {\n  ERAS: ['KK', 'BK'],\n  ERANAMES: ['Kabla ya Kristo', 'Baada ya Kristo'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  STANDALONEMONTHS: ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  WEEKDAYS: ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  STANDALONEWEEKDAYS: ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  SHORTWEEKDAYS: ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  STANDALONESHORTWEEKDAYS: ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Robo ya 1', 'Robo ya 2', 'Robo ya 3', 'Robo ya 4'],\n  QUARTERS: ['Robo ya 1', 'Robo ya 2', 'Robo ya 3', 'Robo ya 4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ta.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ta = {\n  ERAS: ['கி.மு.', 'கி.பி.'],\n  ERANAMES: ['கிறிஸ்துவுக்கு முன்', 'அன்னோ டோமினி'],\n  NARROWMONTHS: ['ஜ', 'பி', 'மா', 'ஏ', 'மே', 'ஜூ', 'ஜூ', 'ஆ', 'செ', 'அ', 'ந', 'டி'],\n  STANDALONENARROWMONTHS: ['ஜ', 'பி', 'மா', 'ஏ', 'மே', 'ஜூ', 'ஜூ', 'ஆ', 'செ', 'அ', 'ந', 'டி'],\n  MONTHS: ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'],\n  STANDALONEMONTHS: ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'],\n  SHORTMONTHS: ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'],\n  STANDALONESHORTMONTHS: ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'],\n  WEEKDAYS: ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'],\n  STANDALONEWEEKDAYS: ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'],\n  SHORTWEEKDAYS: ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'],\n  STANDALONESHORTWEEKDAYS: ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'],\n  NARROWWEEKDAYS: ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'],\n  STANDALONENARROWWEEKDAYS: ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'],\n  SHORTQUARTERS: ['காலா.1', 'காலா.2', 'காலா.3', 'காலா.4'],\n  QUARTERS: ['ஒன்றாம் காலாண்டு', 'இரண்டாம் காலாண்டு', 'மூன்றாம் காலாண்டு', 'நான்காம் காலாண்டு'],\n  AMPMS: ['முற்பகல்', 'பிற்பகல்'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM, y', 'd MMM, y', 'd/M/yy'],\n  TIMEFORMATS: ['a h:mm:ss zzzz', 'a h:mm:ss z', 'a h:mm:ss', 'a h:mm'],\n  DATETIMEFORMATS: ['{1} ’அன்று’ {0}', '{1} ’அன்று’ {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale te.\n * @const\n */\ngoog.i18n.DateTimeSymbols_te = {\n  ERAS: ['క్రీపూ', 'క్రీశ'],\n  ERANAMES: ['క్రీస్తు పూర్వం', 'క్రీస్తు శకం'],\n  NARROWMONTHS: ['జ', 'ఫి', 'మా', 'ఏ', 'మే', 'జూ', 'జు', 'ఆ', 'సె', 'అ', 'న', 'డి'],\n  STANDALONENARROWMONTHS: ['జ', 'ఫి', 'మా', 'ఏ', 'మే', 'జూ', 'జు', 'ఆ', 'సె', 'అ', 'న', 'డి'],\n  MONTHS: ['జనవరి', 'ఫిబ్రవరి', 'మార్చి', 'ఏప్రిల్', 'మే', 'జూన్', 'జులై', 'ఆగస్టు', 'సెప్టెంబర్', 'అక్టోబర్', 'నవంబర్', 'డిసెంబర్'],\n  STANDALONEMONTHS: ['జనవరి', 'ఫిబ్రవరి', 'మార్చి', 'ఏప్రిల్', 'మే', 'జూన్', 'జులై', 'ఆగస్టు', 'సెప్టెంబర్', 'అక్టోబర్', 'నవంబర్', 'డిసెంబర్'],\n  SHORTMONTHS: ['జన', 'ఫిబ్ర', 'మార్చి', 'ఏప్రి', 'మే', 'జూన్', 'జులై', 'ఆగ', 'సెప్టెం', 'అక్టో', 'నవం', 'డిసెం'],\n  STANDALONESHORTMONTHS: ['జన', 'ఫిబ్ర', 'మార్చి', 'ఏప్రి', 'మే', 'జూన్', 'జులై', 'ఆగ', 'సెప్టెం', 'అక్టో', 'నవం', 'డిసెం'],\n  WEEKDAYS: ['ఆదివారం', 'సోమవారం', 'మంగళవారం', 'బుధవారం', 'గురువారం', 'శుక్రవారం', 'శనివారం'],\n  STANDALONEWEEKDAYS: ['ఆదివారం', 'సోమవారం', 'మంగళవారం', 'బుధవారం', 'గురువారం', 'శుక్రవారం', 'శనివారం'],\n  SHORTWEEKDAYS: ['ఆది', 'సోమ', 'మంగళ', 'బుధ', 'గురు', 'శుక్ర', 'శని'],\n  STANDALONESHORTWEEKDAYS: ['ఆది', 'సోమ', 'మంగళ', 'బుధ', 'గురు', 'శుక్ర', 'శని'],\n  NARROWWEEKDAYS: ['ఆ', 'సో', 'మ', 'బు', 'గు', 'శు', 'శ'],\n  STANDALONENARROWWEEKDAYS: ['ఆ', 'సో', 'మ', 'బు', 'గు', 'శు', 'శ'],\n  SHORTQUARTERS: ['త్రై1', 'త్రై2', 'త్రై3', 'త్రై4'],\n  QUARTERS: ['1వ త్రైమాసికం', '2వ త్రైమాసికం', '3వ త్రైమాసికం', '4వ త్రైమాసికం'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['d, MMMM y, EEEE', 'd MMMM, y', 'd MMM, y', 'dd-MM-yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}కి', '{1} {0}కి', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale th.\n * @const\n */\ngoog.i18n.DateTimeSymbols_th = {\n  ERAS: ['ก่อน ค.ศ.', 'ค.ศ.'],\n  ERANAMES: ['ปีก่อนคริสตกาล', 'คริสต์ศักราช'],\n  NARROWMONTHS: ['ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.', 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.', 'ธ.ค.'],\n  STANDALONENARROWMONTHS: ['ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.', 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.', 'ธ.ค.'],\n  MONTHS: ['มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'],\n  STANDALONEMONTHS: ['มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม'],\n  SHORTMONTHS: ['ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.', 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.', 'ธ.ค.'],\n  STANDALONESHORTMONTHS: ['ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.', 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.', 'ธ.ค.'],\n  WEEKDAYS: ['วันอาทิตย์', 'วันจันทร์', 'วันอังคาร', 'วันพุธ', 'วันพฤหัสบดี', 'วันศุกร์', 'วันเสาร์'],\n  STANDALONEWEEKDAYS: ['วันอาทิตย์', 'วันจันทร์', 'วันอังคาร', 'วันพุธ', 'วันพฤหัสบดี', 'วันศุกร์', 'วันเสาร์'],\n  SHORTWEEKDAYS: ['อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'],\n  STANDALONESHORTWEEKDAYS: ['อา.', 'จ.', 'อ.', 'พ.', 'พฤ.', 'ศ.', 'ส.'],\n  NARROWWEEKDAYS: ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'],\n  STANDALONENARROWWEEKDAYS: ['อา', 'จ', 'อ', 'พ', 'พฤ', 'ศ', 'ส'],\n  SHORTQUARTERS: ['ไตรมาส 1', 'ไตรมาส 2', 'ไตรมาส 3', 'ไตรมาส 4'],\n  QUARTERS: ['ไตรมาส 1', 'ไตรมาส 2', 'ไตรมาส 3', 'ไตรมาส 4'],\n  AMPMS: ['ก่อนเที่ยง', 'หลังเที่ยง'],\n  DATEFORMATS: ['EEEEที่ d MMMM G y', 'd MMMM G y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['H นาฬิกา mm นาที ss วินาที zzzz', 'H นาฬิกา mm นาที ss วินาที z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale tl.\n * @const\n */\ngoog.i18n.DateTimeSymbols_tl = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['Ene', 'Peb', 'Mar', 'Abr', 'May', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'],\n  STANDALONENARROWMONTHS: ['E', 'P', 'M', 'A', 'M', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'],\n  MONTHS: ['Enero', 'Pebrero', 'Marso', 'Abril', 'Mayo', 'Hunyo', 'Hulyo', 'Agosto', 'Setyembre', 'Oktubre', 'Nobyembre', 'Disyembre'],\n  STANDALONEMONTHS: ['Enero', 'Pebrero', 'Marso', 'Abril', 'Mayo', 'Hunyo', 'Hulyo', 'Agosto', 'Setyembre', 'Oktubre', 'Nobyembre', 'Disyembre'],\n  SHORTMONTHS: ['Ene', 'Peb', 'Mar', 'Abr', 'May', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'],\n  STANDALONESHORTMONTHS: ['Ene', 'Peb', 'Mar', 'Abr', 'May', 'Hun', 'Hul', 'Ago', 'Set', 'Okt', 'Nob', 'Dis'],\n  WEEKDAYS: ['Linggo', 'Lunes', 'Martes', 'Miyerkules', 'Huwebes', 'Biyernes', 'Sabado'],\n  STANDALONEWEEKDAYS: ['Linggo', 'Lunes', 'Martes', 'Miyerkules', 'Huwebes', 'Biyernes', 'Sabado'],\n  SHORTWEEKDAYS: ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'],\n  STANDALONESHORTWEEKDAYS: ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'],\n  NARROWWEEKDAYS: ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'],\n  STANDALONENARROWWEEKDAYS: ['Lin', 'Lun', 'Mar', 'Miy', 'Huw', 'Biy', 'Sab'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['ika-1 quarter', 'ika-2 quarter', 'ika-3 quarter', 'ika-4 na quarter'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'nang\\' {0}', '{1} \\'nang\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale tr.\n * @const\n */\ngoog.i18n.DateTimeSymbols_tr = {\n  ERAS: ['MÖ', 'MS'],\n  ERANAMES: ['Milattan Önce', 'Milattan Sonra'],\n  NARROWMONTHS: ['O', 'Ş', 'M', 'N', 'M', 'H', 'T', 'A', 'E', 'E', 'K', 'A'],\n  STANDALONENARROWMONTHS: ['O', 'Ş', 'M', 'N', 'M', 'H', 'T', 'A', 'E', 'E', 'K', 'A'],\n  MONTHS: ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'],\n  STANDALONEMONTHS: ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'],\n  SHORTMONTHS: ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara'],\n  STANDALONESHORTMONTHS: ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara'],\n  WEEKDAYS: ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'],\n  STANDALONEWEEKDAYS: ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'],\n  SHORTWEEKDAYS: ['Paz', 'Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cmt'],\n  STANDALONESHORTWEEKDAYS: ['Paz', 'Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cmt'],\n  NARROWWEEKDAYS: ['P', 'P', 'S', 'Ç', 'P', 'C', 'C'],\n  STANDALONENARROWWEEKDAYS: ['P', 'P', 'S', 'Ç', 'P', 'C', 'C'],\n  SHORTQUARTERS: ['Ç1', 'Ç2', 'Ç3', 'Ç4'],\n  QUARTERS: ['1. çeyrek', '2. çeyrek', '3. çeyrek', '4. çeyrek'],\n  AMPMS: ['ÖÖ', 'ÖS'],\n  DATEFORMATS: ['d MMMM y EEEE', 'd MMMM y', 'd MMM y', 'd.MM.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale uk.\n * @const\n */\ngoog.i18n.DateTimeSymbols_uk = {\n  ERAS: ['до н. е.', 'н. е.'],\n  ERANAMES: ['до нашої ери', 'нашої ери'],\n  NARROWMONTHS: ['с', 'л', 'б', 'к', 'т', 'ч', 'л', 'с', 'в', 'ж', 'л', 'г'],\n  STANDALONENARROWMONTHS: ['С', 'Л', 'Б', 'К', 'Т', 'Ч', 'Л', 'С', 'В', 'Ж', 'Л', 'Г'],\n  MONTHS: ['січня', 'лютого', 'березня', 'квітня', 'травня', 'червня', 'липня', 'серпня', 'вересня', 'жовтня', 'листопада', 'грудня'],\n  STANDALONEMONTHS: ['січень', 'лютий', 'березень', 'квітень', 'травень', 'червень', 'липень', 'серпень', 'вересень', 'жовтень', 'листопад', 'грудень'],\n  SHORTMONTHS: ['січ.', 'лют.', 'бер.', 'квіт.', 'трав.', 'черв.', 'лип.', 'серп.', 'вер.', 'жовт.', 'лист.', 'груд.'],\n  STANDALONESHORTMONTHS: ['січ', 'лют', 'бер', 'кві', 'тра', 'чер', 'лип', 'сер', 'вер', 'жов', 'лис', 'гру'],\n  WEEKDAYS: ['неділя', 'понеділок', 'вівторок', 'середа', 'четвер', 'пʼятниця', 'субота'],\n  STANDALONEWEEKDAYS: ['неділя', 'понеділок', 'вівторок', 'середа', 'четвер', 'пʼятниця', 'субота'],\n  SHORTWEEKDAYS: ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  STANDALONESHORTWEEKDAYS: ['нд', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  NARROWWEEKDAYS: ['Н', 'П', 'В', 'С', 'Ч', 'П', 'С'],\n  STANDALONENARROWWEEKDAYS: ['Н', 'П', 'В', 'С', 'Ч', 'П', 'С'],\n  SHORTQUARTERS: ['1-й кв.', '2-й кв.', '3-й кв.', '4-й кв.'],\n  QUARTERS: ['1-й квартал', '2-й квартал', '3-й квартал', '4-й квартал'],\n  AMPMS: ['дп', 'пп'],\n  DATEFORMATS: ['EEEE, d MMMM y \\'р\\'.', 'd MMMM y \\'р\\'.', 'd MMM y \\'р\\'.', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'о\\' {0}', '{1} \\'о\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ur.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ur = {\n  ERAS: ['قبل مسیح', 'عیسوی'],\n  ERANAMES: ['قبل مسیح', 'عیسوی'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  STANDALONEMONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  SHORTMONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  STANDALONESHORTMONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  WEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  STANDALONEWEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  SHORTWEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  STANDALONESHORTWEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['پہلی سہ ماہی', 'دوسری سہ ماہی', 'تیسری سہ ماہی', 'چوتهی سہ ماہی'],\n  QUARTERS: ['پہلی سہ ماہی', 'دوسری سہ ماہی', 'تیسری سہ ماہی', 'چوتهی سہ ماہی'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE، d MMMM، y', 'd MMMM، y', 'd MMM، y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale uz.\n * @const\n */\ngoog.i18n.DateTimeSymbols_uz = {\n  ERAS: ['m.a.', 'milodiy'],\n  ERANAMES: ['miloddan avvalgi', 'milodiy'],\n  NARROWMONTHS: ['Y', 'F', 'M', 'A', 'M', 'I', 'I', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['Y', 'F', 'M', 'A', 'M', 'I', 'I', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['yanvar', 'fevral', 'mart', 'aprel', 'may', 'iyun', 'iyul', 'avgust', 'sentabr', 'oktabr', 'noyabr', 'dekabr'],\n  STANDALONEMONTHS: ['Yanvar', 'Fevral', 'Mart', 'Aprel', 'May', 'Iyun', 'Iyul', 'Avgust', 'Sentabr', 'Oktabr', 'Noyabr', 'Dekabr'],\n  SHORTMONTHS: ['yan', 'fev', 'mar', 'apr', 'may', 'iyn', 'iyl', 'avg', 'sen', 'okt', 'noy', 'dek'],\n  STANDALONESHORTMONTHS: ['Yan', 'Fev', 'Mar', 'Apr', 'May', 'Iyn', 'Iyl', 'Avg', 'Sen', 'Okt', 'Noy', 'Dek'],\n  WEEKDAYS: ['yakshanba', 'dushanba', 'seshanba', 'chorshanba', 'payshanba', 'juma', 'shanba'],\n  STANDALONEWEEKDAYS: ['yakshanba', 'dushanba', 'seshanba', 'chorshanba', 'payshanba', 'juma', 'shanba'],\n  SHORTWEEKDAYS: ['Yak', 'Dush', 'Sesh', 'Chor', 'Pay', 'Jum', 'Shan'],\n  STANDALONESHORTWEEKDAYS: ['Yak', 'Dush', 'Sesh', 'Chor', 'Pay', 'Jum', 'Shan'],\n  NARROWWEEKDAYS: ['Y', 'D', 'S', 'C', 'P', 'J', 'S'],\n  STANDALONENARROWWEEKDAYS: ['Y', 'D', 'S', 'C', 'P', 'J', 'S'],\n  SHORTQUARTERS: ['1-ch', '2-ch', '3-ch', '4-ch'],\n  QUARTERS: ['1-chorak', '2-chorak', '3-chorak', '4-chorak'],\n  AMPMS: ['TO', 'TK'],\n  DATEFORMATS: ['EEEE, d-MMMM, y', 'd-MMMM, y', 'd-MMM, y', 'dd/MM/yy'],\n  TIMEFORMATS: ['H:mm:ss (zzzz)', 'H:mm:ss (z)', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale vi.\n * @const\n */\ngoog.i18n.DateTimeSymbols_vi = {\n  ERAS: ['Trước CN', 'sau CN'],\n  ERANAMES: ['Trước CN', 'sau CN'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['tháng 1', 'tháng 2', 'tháng 3', 'tháng 4', 'tháng 5', 'tháng 6', 'tháng 7', 'tháng 8', 'tháng 9', 'tháng 10', 'tháng 11', 'tháng 12'],\n  STANDALONEMONTHS: ['Tháng 1', 'Tháng 2', 'Tháng 3', 'Tháng 4', 'Tháng 5', 'Tháng 6', 'Tháng 7', 'Tháng 8', 'Tháng 9', 'Tháng 10', 'Tháng 11', 'Tháng 12'],\n  SHORTMONTHS: ['thg 1', 'thg 2', 'thg 3', 'thg 4', 'thg 5', 'thg 6', 'thg 7', 'thg 8', 'thg 9', 'thg 10', 'thg 11', 'thg 12'],\n  STANDALONESHORTMONTHS: ['Thg 1', 'Thg 2', 'Thg 3', 'Thg 4', 'Thg 5', 'Thg 6', 'Thg 7', 'Thg 8', 'Thg 9', 'Thg 10', 'Thg 11', 'Thg 12'],\n  WEEKDAYS: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],\n  STANDALONEWEEKDAYS: ['Chủ Nhật', 'Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy'],\n  SHORTWEEKDAYS: ['CN', 'Th 2', 'Th 3', 'Th 4', 'Th 5', 'Th 6', 'Th 7'],\n  STANDALONESHORTWEEKDAYS: ['CN', 'Th 2', 'Th 3', 'Th 4', 'Th 5', 'Th 6', 'Th 7'],\n  NARROWWEEKDAYS: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],\n  STANDALONENARROWWEEKDAYS: ['CN', 'T2', 'T3', 'T4', 'T5', 'T6', 'T7'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Quý 1', 'Quý 2', 'Quý 3', 'Quý 4'],\n  AMPMS: ['SA', 'CH'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM, y', 'd MMM, y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{0} {1}', '{0} {1}', '{0}, {1}', '{0}, {1}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale zh.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zh = {\n  ERAS: ['公元前', '公元'],\n  ERANAMES: ['公元前', '公元'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n  STANDALONEMONTHS: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n  SHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONESHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  WEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  STANDALONEWEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  SHORTWEEKDAYS: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n  STANDALONESHORTWEEKDAYS: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n  NARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  STANDALONENARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  SHORTQUARTERS: ['1季度', '2季度', '3季度', '4季度'],\n  QUARTERS: ['第一季度', '第二季度', '第三季度', '第四季度'],\n  AMPMS: ['上午', '下午'],\n  DATEFORMATS: ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'y/M/d'],\n  TIMEFORMATS: ['zzzz ah:mm:ss', 'z ah:mm:ss', 'ah:mm:ss', 'ah:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale zh_CN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zh_CN = goog.i18n.DateTimeSymbols_zh;\n\n\n/**\n * Date/time formatting symbols for locale zh_HK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zh_HK = {\n  ERAS: ['公元前', '公元'],\n  ERANAMES: ['公元前', '公元'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONEMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  SHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONESHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  WEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  STANDALONEWEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  SHORTWEEKDAYS: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],\n  STANDALONESHORTWEEKDAYS: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],\n  NARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  STANDALONENARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['第1季', '第2季', '第3季', '第4季'],\n  AMPMS: ['上午', '下午'],\n  DATEFORMATS: ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'd/M/y'],\n  TIMEFORMATS: ['ah:mm:ss [zzzz]', 'ah:mm:ss [z]', 'ah:mm:ss', 'ah:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale zh_TW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zh_TW = {\n  ERAS: ['西元前', '西元'],\n  ERANAMES: ['西元前', '西元'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONEMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  SHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONESHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  WEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  STANDALONEWEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  SHORTWEEKDAYS: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],\n  STANDALONESHORTWEEKDAYS: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],\n  NARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  STANDALONENARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  SHORTQUARTERS: ['第1季', '第2季', '第3季', '第4季'],\n  QUARTERS: ['第1季', '第2季', '第3季', '第4季'],\n  AMPMS: ['上午', '下午'],\n  DATEFORMATS: ['y年M月d日 EEEE', 'y年M月d日', 'y年M月d日', 'y/M/d'],\n  TIMEFORMATS: ['ah:mm:ss [zzzz]', 'ah:mm:ss [z]', 'ah:mm:ss', 'ah:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale zu.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zu = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['BC', 'AD'],\n  NARROWMONTHS: ['J', 'F', 'M', 'E', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januwari', 'Februwari', 'Mashi', 'Ephreli', 'Meyi', 'Juni', 'Julayi', 'Agasti', 'Septhemba', 'Okthoba', 'Novemba', 'Disemba'],\n  STANDALONEMONTHS: ['Januwari', 'Februwari', 'Mashi', 'Ephreli', 'Meyi', 'Juni', 'Julayi', 'Agasti', 'Septhemba', 'Okthoba', 'Novemba', 'Disemba'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mas', 'Eph', 'Mey', 'Jun', 'Jul', 'Aga', 'Sep', 'Okt', 'Nov', 'Dis'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mas', 'Eph', 'Mey', 'Jun', 'Jul', 'Aga', 'Sep', 'Okt', 'Nov', 'Dis'],\n  WEEKDAYS: ['ISonto', 'UMsombuluko', 'ULwesibili', 'ULwesithathu', 'ULwesine', 'ULwesihlanu', 'UMgqibelo'],\n  STANDALONEWEEKDAYS: ['ISonto', 'UMsombuluko', 'ULwesibili', 'ULwesithathu', 'ULwesine', 'ULwesihlanu', 'UMgqibelo'],\n  SHORTWEEKDAYS: ['Son', 'Mso', 'Bil', 'Tha', 'Sin', 'Hla', 'Mgq'],\n  STANDALONESHORTWEEKDAYS: ['Son', 'Mso', 'Bil', 'Tha', 'Sin', 'Hla', 'Mgq'],\n  NARROWWEEKDAYS: ['S', 'M', 'B', 'T', 'S', 'H', 'M'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'B', 'T', 'S', 'H', 'M'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['ikota yesi-1', 'ikota yesi-2', 'ikota yesi-3', 'ikota yesi-4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n/**\n * @record\n * @struct\n */\ngoog.i18n.DateTimeSymbolsType = function() {};\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.ERAS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.ERANAMES;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.NARROWMONTHS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.STANDALONENARROWMONTHS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.MONTHS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.STANDALONEMONTHS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.SHORTMONTHS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.STANDALONESHORTMONTHS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.WEEKDAYS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.SHORTWEEKDAYS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.STANDALONESHORTWEEKDAYS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.STANDALONEWEEKDAYS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.NARROWWEEKDAYS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.STANDALONENARROWWEEKDAYS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.SHORTQUARTERS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.QUARTERS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.AMPMS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.DATEFORMATS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.TIMEFORMATS;\n\n/** @type {!Array<string>} */\ngoog.i18n.DateTimeSymbolsType.prototype.DATETIMEFORMATS;\n\n/** @type {number|undefined} */\ngoog.i18n.DateTimeSymbolsType.prototype.ZERODIGIT;\n\n/** @type {number} */\ngoog.i18n.DateTimeSymbolsType.prototype.FIRSTDAYOFWEEK;\n\n/** @type {!Array<number>} */\ngoog.i18n.DateTimeSymbolsType.prototype.WEEKENDRANGE;\n\n/** @type {number} */\ngoog.i18n.DateTimeSymbolsType.prototype.FIRSTWEEKCUTOFFDAY;\n\n\n/** @type {!goog.i18n.DateTimeSymbolsType} */\ngoog.i18n.DateTimeSymbols;\n\n\n/**\n * Selected date/time formatting symbols by locale.\n */\ngoog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en;\n\nswitch (goog.LOCALE) {\n  case 'en_ISO':\n  case 'en-ISO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_ISO;\n    break;\n  case 'af':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_af;\n    break;\n  case 'am':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_am;\n    break;\n  case 'ar':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar;\n    break;\n  case 'ar_DZ':\n  case 'ar-DZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_DZ;\n    break;\n  case 'ar_EG':\n  case 'ar-EG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_EG;\n    break;\n  case 'az':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_az;\n    break;\n  case 'be':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_be;\n    break;\n  case 'bg':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bg;\n    break;\n  case 'bn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bn;\n    break;\n  case 'br':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_br;\n    break;\n  case 'bs':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bs;\n    break;\n  case 'ca':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ca;\n    break;\n  case 'chr':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_chr;\n    break;\n  case 'cs':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_cs;\n    break;\n  case 'cy':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_cy;\n    break;\n  case 'da':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_da;\n    break;\n  case 'de':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_de;\n    break;\n  case 'de_AT':\n  case 'de-AT':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_de_AT;\n    break;\n  case 'de_CH':\n  case 'de-CH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_de_CH;\n    break;\n  case 'el':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_el;\n    break;\n  case 'en':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en;\n    break;\n  case 'en_AU':\n  case 'en-AU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_AU;\n    break;\n  case 'en_CA':\n  case 'en-CA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_CA;\n    break;\n  case 'en_GB':\n  case 'en-GB':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_GB;\n    break;\n  case 'en_IE':\n  case 'en-IE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_IE;\n    break;\n  case 'en_IN':\n  case 'en-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_IN;\n    break;\n  case 'en_SG':\n  case 'en-SG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_SG;\n    break;\n  case 'en_US':\n  case 'en-US':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_US;\n    break;\n  case 'en_ZA':\n  case 'en-ZA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_ZA;\n    break;\n  case 'es':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es;\n    break;\n  case 'es_419':\n  case 'es-419':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_419;\n    break;\n  case 'es_ES':\n  case 'es-ES':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_ES;\n    break;\n  case 'es_MX':\n  case 'es-MX':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_MX;\n    break;\n  case 'es_US':\n  case 'es-US':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_US;\n    break;\n  case 'et':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_et;\n    break;\n  case 'eu':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_eu;\n    break;\n  case 'fa':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fa;\n    break;\n  case 'fi':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fi;\n    break;\n  case 'fil':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fil;\n    break;\n  case 'fr':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr;\n    break;\n  case 'fr_CA':\n  case 'fr-CA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_CA;\n    break;\n  case 'ga':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ga;\n    break;\n  case 'gl':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_gl;\n    break;\n  case 'gsw':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_gsw;\n    break;\n  case 'gu':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_gu;\n    break;\n  case 'haw':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_haw;\n    break;\n  case 'he':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_he;\n    break;\n  case 'hi':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_hi;\n    break;\n  case 'hr':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_hr;\n    break;\n  case 'hu':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_hu;\n    break;\n  case 'hy':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_hy;\n    break;\n  case 'id':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_id;\n    break;\n  case 'in':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_in;\n    break;\n  case 'is':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_is;\n    break;\n  case 'it':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_it;\n    break;\n  case 'iw':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_iw;\n    break;\n  case 'ja':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ja;\n    break;\n  case 'ka':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ka;\n    break;\n  case 'kk':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kk;\n    break;\n  case 'km':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_km;\n    break;\n  case 'kn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kn;\n    break;\n  case 'ko':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ko;\n    break;\n  case 'ky':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ky;\n    break;\n  case 'ln':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ln;\n    break;\n  case 'lo':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lo;\n    break;\n  case 'lt':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lt;\n    break;\n  case 'lv':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lv;\n    break;\n  case 'mk':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mk;\n    break;\n  case 'ml':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ml;\n    break;\n  case 'mn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mn;\n    break;\n  case 'mo':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mo;\n    break;\n  case 'mr':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mr;\n    break;\n  case 'ms':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ms;\n    break;\n  case 'mt':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mt;\n    break;\n  case 'my':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_my;\n    break;\n  case 'nb':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nb;\n    break;\n  case 'ne':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ne;\n    break;\n  case 'nl':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nl;\n    break;\n  case 'no':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_no;\n    break;\n  case 'no_NO':\n  case 'no-NO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_no_NO;\n    break;\n  case 'or':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_or;\n    break;\n  case 'pa':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pa;\n    break;\n  case 'pl':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pl;\n    break;\n  case 'pt':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pt;\n    break;\n  case 'pt_BR':\n  case 'pt-BR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pt_BR;\n    break;\n  case 'pt_PT':\n  case 'pt-PT':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pt_PT;\n    break;\n  case 'ro':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ro;\n    break;\n  case 'ru':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ru;\n    break;\n  case 'sh':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sh;\n    break;\n  case 'si':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_si;\n    break;\n  case 'sk':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sk;\n    break;\n  case 'sl':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sl;\n    break;\n  case 'sq':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sq;\n    break;\n  case 'sr':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sr;\n    break;\n  case 'sr_Latn':\n  case 'sr-Latn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sr_Latn;\n    break;\n  case 'sv':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sv;\n    break;\n  case 'sw':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sw;\n    break;\n  case 'ta':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ta;\n    break;\n  case 'te':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_te;\n    break;\n  case 'th':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_th;\n    break;\n  case 'tl':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_tl;\n    break;\n  case 'tr':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_tr;\n    break;\n  case 'uk':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_uk;\n    break;\n  case 'ur':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ur;\n    break;\n  case 'uz':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_uz;\n    break;\n  case 'vi':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_vi;\n    break;\n  case 'zh':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zh;\n    break;\n  case 'zh_CN':\n  case 'zh-CN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zh_CN;\n    break;\n  case 'zh_HK':\n  case 'zh-HK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zh_HK;\n    break;\n  case 'zh_TW':\n  case 'zh-TW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zh_TW;\n    break;\n  case 'zu':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zu;\n    break;\n}\n","^9I",1579837703000,"^9J",["^9K",["^9>"]],"^9N",["^ ","^9O","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^9P","^9Q","^9R","^9S","^9T","Google Closure Library","^9U","^9V","^9W","http://code.google.com/p/closure-library/","^9X","^9Y","^9Z",["^9V","0.0-20191016-6ae1f72f"],"^9[","0.0-20191016-6ae1f72f"],"^9W",["^:0","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/datetimesymbols.js"],"^:1",["^9K",["~$goog.i18n.DateTimeSymbols_fr_CA","~$goog.i18n.DateTimeSymbols-uk","~$goog.i18n.DateTimeSymbols_en_IE","~$goog.i18n.DateTimeSymbols-sl","~$goog.i18n.DateTimeSymbols-my","~$goog.i18n.DateTimeSymbols_zh_CN","~$goog.i18n.DateTimeSymbols-kn","~$goog.i18n.DateTimeSymbols_be","~$goog.i18n.DateTimeSymbols-ta","~$goog.i18n.DateTimeSymbols-zh-TW","~$goog.i18n.DateTimeSymbols-vi","~$goog.i18n.DateTimeSymbols_sl","~$goog.i18n.DateTimeSymbols_or","~$goog.i18n.DateTimeSymbols-ml","~$goog.i18n.DateTimeSymbols_gu","~$goog.i18n.DateTimeSymbols_es","~$goog.i18n.DateTimeSymbols-ky","~$goog.i18n.DateTimeSymbols_ar_DZ","~$goog.i18n.DateTimeSymbols-hr","~$goog.i18n.DateTimeSymbols-ln","~$goog.i18n.DateTimeSymbols_fil","~$goog.i18n.DateTimeSymbols-or","~$goog.i18n.DateTimeSymbols-en-IE","~$goog.i18n.DateTimeSymbols_en_ZA","~$goog.i18n.DateTimeSymbols_hy","~$goog.i18n.DateTimeSymbols-iw","~$goog.i18n.DateTimeSymbols-es","~$goog.i18n.DateTimeSymbols-en-GB","~$goog.i18n.DateTimeSymbols_mk","~$goog.i18n.DateTimeSymbols_sv","~$goog.i18n.DateTimeSymbols-sr-Latn","~$goog.i18n.DateTimeSymbols_pt_PT","~$goog.i18n.DateTimeSymbols_de","~$goog.i18n.DateTimeSymbols-pt","~$goog.i18n.DateTimeSymbols-ro","~$goog.i18n.DateTimeSymbols_kn","~$goog.i18n.DateTimeSymbols-ur","~$goog.i18n.DateTimeSymbols_en_AU","~$goog.i18n.DateTimeSymbols_uz","~$goog.i18n.DateTimeSymbols-es-ES","~$goog.i18n.DateTimeSymbols-es-419","~$goog.i18n.DateTimeSymbols-pa","~$goog.i18n.DateTimeSymbols_mn","~$goog.i18n.DateTimeSymbols_zh","~$goog.i18n.DateTimeSymbols_mr","~$goog.i18n.DateTimeSymbols-cs","~$goog.i18n.DateTimeSymbols-fil","~$goog.i18n.DateTimeSymbols_iw","~$goog.i18n.DateTimeSymbols_ml","~$goog.i18n.DateTimeSymbols-en","^WG","~$goog.i18n.DateTimeSymbols-ar","~$goog.i18n.DateTimeSymbols-be","~$goog.i18n.DateTimeSymbols-mr","~$goog.i18n.DateTimeSymbols_ln","~$goog.i18n.DateTimeSymbols_ga","~$goog.i18n.DateTimeSymbols_fr","~$goog.i18n.DateTimeSymbols-fr","~$goog.i18n.DateTimeSymbols-in","~$goog.i18n.DateTimeSymbols_en_SG","~$goog.i18n.DateTimeSymbols_es_MX","~$goog.i18n.DateTimeSymbols-es-MX","~$goog.i18n.DateTimeSymbols_ru","~$goog.i18n.DateTimeSymbols_vi","~$goog.i18n.DateTimeSymbols-sq","~$goog.i18n.DateTimeSymbols_sk","~$goog.i18n.DateTimeSymbols_no","~$goog.i18n.DateTimeSymbols-si","~$goog.i18n.DateTimeSymbols_ja","~$goog.i18n.DateTimeSymbols_en_CA","~$goog.i18n.DateTimeSymbols-ms","~$goog.i18n.DateTimeSymbols-bn","~$goog.i18n.DateTimeSymbols_te","~$goog.i18n.DateTimeSymbols_no_NO","~$goog.i18n.DateTimeSymbols-sh","~$goog.i18n.DateTimeSymbols_sr_Latn","~$goog.i18n.DateTimeSymbols-haw","~$goog.i18n.DateTimeSymbols_sw","~$goog.i18n.DateTimeSymbols_es_ES","~$goog.i18n.DateTimeSymbols_lv","~$goog.i18n.DateTimeSymbols-ka","~$goog.i18n.DateTimeSymbols-ko","~$goog.i18n.DateTimeSymbols_nb","~$goog.i18n.DateTimeSymbols-eu","~$goog.i18n.DateTimeSymbols_bs","~$goog.i18n.DateTimeSymbols-en-SG","~$goog.i18n.DateTimeSymbols_zh_TW","~$goog.i18n.DateTimeSymbols_sr","~$goog.i18n.DateTimeSymbols-bs","~$goog.i18n.DateTimeSymbols-el","~$goog.i18n.DateTimeSymbols_haw","~$goog.i18n.DateTimeSymbols_cs","~$goog.i18n.DateTimeSymbols-en-ZA","~$goog.i18n.DateTimeSymbols-km","~$goog.i18n.DateTimeSymbols_en_IN","~$goog.i18n.DateTimeSymbols-sk","~$goog.i18n.DateTimeSymbols-pt-BR","~$goog.i18n.DateTimeSymbols-zu","~$goog.i18n.DateTimeSymbols_am","~$goog.i18n.DateTimeSymbols-de-AT","~$goog.i18n.DateTimeSymbols_he","~$goog.i18n.DateTimeSymbols_gl","~$goog.i18n.DateTimeSymbols_br","~$goog.i18n.DateTimeSymbols_fa","~$goog.i18n.DateTimeSymbols-nb","~$goog.i18n.DateTimeSymbols-hi","~$goog.i18n.DateTimeSymbols-is","~$goog.i18n.DateTimeSymbols-hu","~$goog.i18n.DateTimeSymbols-de","~$goog.i18n.DateTimeSymbols-ar-EG","~$goog.i18n.DateTimeSymbols_ca","~$goog.i18n.DateTimeSymbols_mo","~$goog.i18n.DateTimeSymbols_tr","~$goog.i18n.DateTimeSymbols-lo","~$goog.i18n.DateTimeSymbols-ja","~$goog.i18n.DateTimeSymbols-tl","~$goog.i18n.DateTimeSymbols_ar","~$goog.i18n.DateTimeSymbols-chr","~$goog.i18n.DateTimeSymbols-pl","~$goog.i18n.DateTimeSymbols-da","~$goog.i18n.DateTimeSymbols_nl","~$goog.i18n.DateTimeSymbols-en-IN","~$goog.i18n.DateTimeSymbols-gu","~$goog.i18n.DateTimeSymbols-az","~$goog.i18n.DateTimeSymbols-cy","~$goog.i18n.DateTimeSymbols_af","~$goog.i18n.DateTimeSymbols-bg","~$goog.i18n.DateTimeSymbols_it","~$goog.i18n.DateTimeSymbols-fi","~$goog.i18n.DateTimeSymbols_uk","~$goog.i18n.DateTimeSymbols_de_AT","~$goog.i18n.DateTimeSymbols-tr","~$goog.i18n.DateTimeSymbols_el","~$goog.i18n.DateTimeSymbols_fi","~$goog.i18n.DateTimeSymbols-es-US","~$goog.i18n.DateTimeSymbols_hi","~$goog.i18n.DateTimeSymbols-no-NO","~$goog.i18n.DateTimeSymbols_pt","~$goog.i18n.DateTimeSymbols-fr-CA","~$goog.i18n.DateTimeSymbols-no","~$goog.i18n.DateTimeSymbols_zh_HK","~$goog.i18n.DateTimeSymbols_ur","~$goog.i18n.DateTimeSymbols_gsw","~$goog.i18n.DateTimeSymbols-ga","~$goog.i18n.DateTimeSymbols_cy","~$goog.i18n.DateTimeSymbols-ru","~$goog.i18n.DateTimeSymbols-ne","~$goog.i18n.DateTimeSymbols_si","~$goog.i18n.DateTimeSymbols-mo","~$goog.i18n.DateTimeSymbols_en_US","~$goog.i18n.DateTimeSymbols_ar_EG","~$goog.i18n.DateTimeSymbols-ca","~$goog.i18n.DateTimeSymbols_hu","~$goog.i18n.DateTimeSymbols_es_US","~$goog.i18n.DateTimeSymbols_zu","~$goog.i18n.DateTimeSymbols-zh","~$goog.i18n.DateTimeSymbols_es_419","~$goog.i18n.DateTimeSymbols_ko","~$goog.i18n.DateTimeSymbols_pa","~$goog.i18n.DateTimeSymbols-id","~$goog.i18n.DateTimeSymbols-am","~$goog.i18n.DateTimeSymbols-gl","~$goog.i18n.DateTimeSymbols-he","~$goog.i18n.DateTimeSymbols_en_ISO","~$goog.i18n.DateTimeSymbols_az","~$goog.i18n.DateTimeSymbols_en_GB","~$goog.i18n.DateTimeSymbols_en","~$goog.i18n.DateTimeSymbols-nl","~$goog.i18n.DateTimeSymbols-kk","^WK","~$goog.i18n.DateTimeSymbols-en-ISO","~$goog.i18n.DateTimeSymbols-en-AU","~$goog.i18n.DateTimeSymbols-mt","~$goog.i18n.DateTimeSymbols_km","~$goog.i18n.DateTimeSymbols-zh-HK","~$goog.i18n.DateTimeSymbols_ro","~$goog.i18n.DateTimeSymbols_eu","~$goog.i18n.DateTimeSymbols-fa","~$goog.i18n.DateTimeSymbols_th","~$goog.i18n.DateTimeSymbols-de-CH","~$goog.i18n.DateTimeSymbols-gsw","~$goog.i18n.DateTimeSymbols-en-CA","~$goog.i18n.DateTimeSymbols_sh","~$goog.i18n.DateTimeSymbols-pt-PT","~$goog.i18n.DateTimeSymbols_ka","~$goog.i18n.DateTimeSymbols-hy","~$goog.i18n.DateTimeSymbols_et","~$goog.i18n.DateTimeSymbols_hr","~$goog.i18n.DateTimeSymbols_kk","~$goog.i18n.DateTimeSymbols-th","~$goog.i18n.DateTimeSymbols-te","~$goog.i18n.DateTimeSymbols-it","~$goog.i18n.DateTimeSymbols_ms","~$goog.i18n.DateTimeSymbols_chr","~$goog.i18n.DateTimeSymbols_ne","~$goog.i18n.DateTimeSymbols_ky","~$goog.i18n.DateTimeSymbols_in","~$goog.i18n.DateTimeSymbols_lo","~$goog.i18n.DateTimeSymbols-ar-DZ","~$goog.i18n.DateTimeSymbols-af","~$goog.i18n.DateTimeSymbols_mt","~$goog.i18n.DateTimeSymbols_de_CH","~$goog.i18n.DateTimeSymbols_ta","~$goog.i18n.DateTimeSymbols_bn","~$goog.i18n.DateTimeSymbols-et","~$goog.i18n.DateTimeSymbols-uz","~$goog.i18n.DateTimeSymbols_tl","~$goog.i18n.DateTimeSymbols_id","~$goog.i18n.DateTimeSymbols_pt_BR","~$goog.i18n.DateTimeSymbols-lv","~$goog.i18n.DateTimeSymbols-mk","~$goog.i18n.DateTimeSymbols-sv","~$goog.i18n.DateTimeSymbols-zh-CN","~$goog.i18n.DateTimeSymbols_my","~$goog.i18n.DateTimeSymbols-sr","~$goog.i18n.DateTimeSymbols-sw","~$goog.i18n.DateTimeSymbols_da","~$goog.i18n.DateTimeSymbols-mn","~$goog.i18n.DateTimeSymbols_sq","~$goog.i18n.DateTimeSymbols-lt","~$goog.i18n.DateTimeSymbols-br","~$goog.i18n.DateTimeSymbols-en-US","~$goog.i18n.DateTimeSymbols_bg","~$goog.i18n.DateTimeSymbols_pl","~$goog.i18n.DateTimeSymbols_lt","~$goog.i18n.DateTimeSymbols_is"]],"~:from-jar",true,"~:deps",["~$goog"]],["^ ","~:cache-key",[1579837703000],"~:output-name","goog.graphics.ext.strokeandfillelement.js","~:resource-id",["~:shadow.build.classpath/resource","goog/graphics/ext/strokeandfillelement.js"],"~:resource-name","goog/graphics/ext/strokeandfillelement.js","~:type","~:goog","~:source","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A thick wrapper around elements with stroke and fill.\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.graphics.ext.StrokeAndFillElement');\n\ngoog.forwardDeclare('goog.graphics.Fill');\ngoog.forwardDeclare('goog.graphics.Stroke');\ngoog.forwardDeclare('goog.graphics.StrokeAndFillElement');\ngoog.forwardDeclare('goog.graphics.ext.Group');\ngoog.require('goog.graphics.ext.Element');\n\n\n\n/**\n * Interface for a graphics element that has a stroke and fill.\n * This is the base interface for ellipse, rectangle and other\n * shape interfaces.\n * You should not construct objects from this constructor. Use a subclass.\n * @param {goog.graphics.ext.Group} group Parent for this element.\n * @param {goog.graphics.StrokeAndFillElement} wrapper The thin wrapper to wrap.\n * @constructor\n * @extends {goog.graphics.ext.Element}\n */\ngoog.graphics.ext.StrokeAndFillElement = function(group, wrapper) {\n  goog.graphics.ext.Element.call(this, group, wrapper);\n};\ngoog.inherits(\n    goog.graphics.ext.StrokeAndFillElement, goog.graphics.ext.Element);\n\n\n/**\n * Sets the fill for this element.\n * @param {goog.graphics.Fill?} fill The fill object.\n */\ngoog.graphics.ext.StrokeAndFillElement.prototype.setFill = function(fill) {\n  this.getWrapper().setFill(fill);\n};\n\n\n/**\n * Sets the stroke for this element.\n * @param {goog.graphics.Stroke?} stroke The stroke object.\n */\ngoog.graphics.ext.StrokeAndFillElement.prototype.setStroke = function(stroke) {\n  this.getWrapper().setStroke(stroke);\n};\n\n\n/**\n * Redraw the rectangle.  Called when the coordinate system is changed.\n * @protected\n * @override\n */\ngoog.graphics.ext.StrokeAndFillElement.prototype.redraw = function() {\n  this.getWrapper().reapplyStroke();\n};\n","~:last-modified",1579837703000,"~:requires",["~#set",["^Z","~$goog.graphics.ext.Element"]],"~:pom-info",["^ ","~:description","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","~:group-id","~$org.clojure","~:artifact-id","~$google-closure-library","~:name","Google Closure Library","~:id","~$org.clojure/google-closure-library","~:url","http://code.google.com/p/closure-library/","~:parent-group-id","~$org.sonatype.oss","~:coordinate",["^1C","0.0-20191016-6ae1f72f"],"~:version","0.0-20191016-6ae1f72f"],"^1D",["~#url","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/ext/strokeandfillelement.js"],"~:provides",["^19",["~$goog.graphics.ext.StrokeAndFillElement"]],"^X",true,"^Y",["^Z","^1:"]],["^ ","^[",[1579837703000],"^10","goog.positioning.menuanchoredposition.js","^11",["^12","goog/positioning/menuanchoredposition.js"],"^13","goog/positioning/menuanchoredposition.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Anchored viewport positioning class with both adjust and\n *     resize options for the popup.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.positioning.MenuAnchoredPosition');\n\ngoog.require('goog.positioning.AnchoredViewportPosition');\ngoog.require('goog.positioning.Overflow');\n\n\n\n/**\n * Encapsulates a popup position where the popup is anchored at a corner of\n * an element.  The positioning behavior changes based on the values of\n * opt_adjust and opt_resize.\n *\n * When using this positioning object it's recommended that the movable element\n * be absolutely positioned.\n *\n * @param {Element} anchorElement Element the movable element should be\n *     anchored against.\n * @param {goog.positioning.Corner} corner Corner of anchored element the\n *     movable element should be positioned at.\n * @param {boolean=} opt_adjust Whether the positioning should be adjusted until\n *     the element fits inside the viewport even if that means that the anchored\n *     corners are ignored.\n * @param {boolean=} opt_resize Whether the positioning should be adjusted until\n *     the element fits inside the viewport on the X axis and its height is\n *     resized so if fits in the viewport. This take precedence over opt_adjust.\n * @constructor\n * @extends {goog.positioning.AnchoredViewportPosition}\n */\ngoog.positioning.MenuAnchoredPosition = function(\n    anchorElement, corner, opt_adjust, opt_resize) {\n  goog.positioning.AnchoredViewportPosition.call(\n      this, anchorElement, corner, opt_adjust || opt_resize);\n\n  if (opt_adjust || opt_resize) {\n    var overflowX = goog.positioning.Overflow.ADJUST_X_EXCEPT_OFFSCREEN;\n    var overflowY = opt_resize ?\n        goog.positioning.Overflow.RESIZE_HEIGHT :\n        goog.positioning.Overflow.ADJUST_Y_EXCEPT_OFFSCREEN;\n    this.setLastResortOverflow(overflowX | overflowY);\n  }\n};\ngoog.inherits(\n    goog.positioning.MenuAnchoredPosition,\n    goog.positioning.AnchoredViewportPosition);\n","^17",1579837703000,"^18",["^19",["~$goog.positioning.AnchoredViewportPosition","^Z","~$goog.positioning.Overflow"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/positioning/menuanchoredposition.js"],"^1J",["^19",["~$goog.positioning.MenuAnchoredPosition"]],"^X",true,"^Y",["^Z","^1L","^1M"]],["^ ","^[",[1579837703000],"^10","goog.async.freelist.js","^11",["^12","goog/async/freelist.js"],"^13","goog/async/freelist.js","^14","^15","^16","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Simple freelist.\n *\n * An anterative to goog.structs.SimplePool, it imposes the requirement that the\n * objects in the list contain a \"next\" property that can be used to maintain\n * the pool.\n */\n\ngoog.provide('goog.async.FreeList');\n\n\n/**\n * @template ITEM\n */\ngoog.async.FreeList = class {\n  /**\n   * @param {function():ITEM} create\n   * @param {function(ITEM):void} reset\n   * @param {number} limit\n   */\n  constructor(create, reset, limit) {\n    /** @private @const {number} */\n    this.limit_ = limit;\n    /** @private @const {function()} */\n    this.create_ = create;\n    /** @private @const {function(ITEM):void} */\n    this.reset_ = reset;\n\n    /** @private {number} */\n    this.occupants_ = 0;\n    /** @private {ITEM} */\n    this.head_ = null;\n  }\n\n  /**\n   * @return {ITEM}\n   */\n  get() {\n    let item;\n    if (this.occupants_ > 0) {\n      this.occupants_--;\n      item = this.head_;\n      this.head_ = item.next;\n      item.next = null;\n    } else {\n      item = this.create_();\n    }\n    return item;\n  }\n\n  /**\n   * @param {ITEM} item An item available for possible future reuse.\n   */\n  put(item) {\n    this.reset_(item);\n    if (this.occupants_ < this.limit_) {\n      this.occupants_++;\n      item.next = this.head_;\n      this.head_ = item;\n    }\n  }\n\n  /**\n   * Visible for testing.\n   * @package\n   * @return {number}\n   */\n  occupants() {\n    return this.occupants_;\n  }\n};\n","^17",1579837703000,"^18",["^19",["^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/async/freelist.js"],"^1J",["^19",["~$goog.async.FreeList"]],"^X",true,"^Y",["^Z"]],["^ ","^[",[1579837703000],"^10","goog.ui.toolbar.js","^11",["^12","goog/ui/toolbar.js"],"^13","goog/ui/toolbar.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A toolbar class that hosts {@link goog.ui.Control}s such as\n * buttons and menus, along with toolbar-specific renderers of those controls.\n *\n * @author attila@google.com (Attila Bodis)\n * @see ../demos/toolbar.html\n */\n\ngoog.provide('goog.ui.Toolbar');\n\ngoog.require('goog.ui.Container');\ngoog.require('goog.ui.ToolbarRenderer');\n\n\n\n/**\n * A toolbar class, implemented as a {@link goog.ui.Container} that defaults to\n * having a horizontal orientation and {@link goog.ui.ToolbarRenderer} as its\n * renderer.\n * @param {goog.ui.ToolbarRenderer=} opt_renderer Renderer used to render or\n *     decorate the toolbar; defaults to {@link goog.ui.ToolbarRenderer}.\n * @param {?goog.ui.Container.Orientation=} opt_orientation Toolbar orientation;\n *     defaults to `HORIZONTAL`.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.Container}\n */\ngoog.ui.Toolbar = function(opt_renderer, opt_orientation, opt_domHelper) {\n  goog.ui.Container.call(\n      this, opt_orientation,\n      opt_renderer || goog.ui.ToolbarRenderer.getInstance(), opt_domHelper);\n};\ngoog.inherits(goog.ui.Toolbar, goog.ui.Container);\n\n\n/** @override */\ngoog.ui.Toolbar.prototype.handleFocus = function(e) {\n  goog.ui.Toolbar.base(this, 'handleFocus', e);\n  // Highlight the first highlightable item on focus via the keyboard for ARIA\n  // spec compliance. Do not highlight the item if the mouse button is pressed,\n  // since this method is also called from handleMouseDown when a toolbar button\n  // is clicked.\n  if (!this.isMouseButtonPressed()) {\n    this.highlightFirst();\n  }\n};\n","^17",1579837703000,"^18",["^19",["^Z","~$goog.ui.Container","~$goog.ui.ToolbarRenderer"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/toolbar.js"],"^1J",["^19",["~$goog.ui.Toolbar"]],"^X",true,"^Y",["^Z","^1P","^1Q"]],["^ ","^[",[1579837703000],"^10","goog.testing.performancetable.js","^11",["^12","goog/testing/performancetable.js"],"^13","goog/testing/performancetable.js","^14","^15","^16","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A table for showing the results of performance testing.\n *\n * {@see goog.testing.benchmark} for an easy way to use this functionality.\n *\n * @author attila@google.com (Attila Bodis)\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.setTestOnly('goog.testing.PerformanceTable');\ngoog.provide('goog.testing.PerformanceTable');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.testing.PerformanceTimer');\n\n\n\n/**\n * A UI widget that runs performance tests and displays the results.\n * @param {Element} root The element where the table should be attached.\n * @param {goog.testing.PerformanceTimer=} opt_timer A timer to use for\n *     executing functions and profiling them.\n * @param {number=} opt_precision Number of digits of precision to include in\n *     results.  Defaults to 0.\n * @param {number=} opt_numSamples The number of samples to take. Defaults to 5.\n * @constructor\n * @final\n */\ngoog.testing.PerformanceTable = function(\n    root, opt_timer, opt_precision, opt_numSamples) {\n  /**\n   * Where the table should be attached.\n   * @private {Element}\n   */\n  this.root_ = root;\n\n  /**\n   * Number of digits of precision to include in results.\n   * Defaults to 0.\n   * @private {number}\n   */\n  this.precision_ = opt_precision || 0;\n\n  var timer = opt_timer;\n  if (!timer) {\n    timer = new goog.testing.PerformanceTimer();\n    timer.setNumSamples(opt_numSamples || 5);\n    timer.setDiscardOutliers(true);\n  }\n\n  /**\n   * A timer for running the tests.\n   * @private {goog.testing.PerformanceTimer}\n   */\n  this.timer_ = timer;\n\n  this.initRoot_();\n};\n\n\n/**\n * @return {goog.testing.PerformanceTimer} The timer being used.\n */\ngoog.testing.PerformanceTable.prototype.getTimer = function() {\n  return this.timer_;\n};\n\n\n/**\n * Render the initial table.\n * @private\n */\ngoog.testing.PerformanceTable.prototype.initRoot_ = function() {\n  this.root_.innerHTML = '<table class=\"test-results\" cellspacing=\"1\">' +\n      '  <thead>' +\n      '    <tr>' +\n      '      <th rowspan=\"2\">Test Description</th>' +\n      '      <th rowspan=\"2\">Runs</th>' +\n      '      <th colspan=\"4\">Results (ms)</th>' +\n      '    </tr>' +\n      '    <tr>' +\n      '      <th>Average</th>' +\n      '      <th>Median</th>' +\n      '      <th>Std Dev</th>' +\n      '      <th>Minimum</th>' +\n      '      <th>Maximum</th>' +\n      '    </tr>' +\n      '  </thead>' +\n      '  <tbody>' +\n      '  </tbody>' +\n      '</table>';\n};\n\n\n/**\n * @return {Element} The body of the table.\n * @private\n */\ngoog.testing.PerformanceTable.prototype.getTableBody_ = function() {\n  return goog.dom.getElementsByTagName(\n      goog.dom.TagName.TBODY, goog.asserts.assert(this.root_))[0];\n};\n\n\n/**\n * Round to the specified precision.\n * @param {number} num The number to round.\n * @return {string} The rounded number, as a string.\n * @private\n */\ngoog.testing.PerformanceTable.prototype.round_ = function(num) {\n  var factor = Math.pow(10, this.precision_);\n  return String(Math.round(num * factor) / factor);\n};\n\n\n/**\n * Run the given function with the performance timer, and show the results.\n * @param {Function} fn The function to run.\n * @param {string=} opt_desc A description to associate with this run.\n */\ngoog.testing.PerformanceTable.prototype.run = function(fn, opt_desc) {\n  this.runTask(\n      new goog.testing.PerformanceTimer.Task(/** @type {function()} */ (fn)),\n      opt_desc);\n};\n\n\n/**\n * Run the given task with the performance timer, and show the results.\n * @param {goog.testing.PerformanceTimer.Task} task The performance timer task\n *     to run.\n * @param {string=} opt_desc A description to associate with this run.\n */\ngoog.testing.PerformanceTable.prototype.runTask = function(task, opt_desc) {\n  var results = this.timer_.runTask(task);\n  this.recordResults(results, opt_desc);\n};\n\n\n/**\n * Record a performance timer results object to the performance table. See\n * `goog.testing.PerformanceTimer` for details of the format of this\n * object.\n * @param {Object} results The performance timer results object.\n * @param {string=} opt_desc A description to associate with these results.\n */\ngoog.testing.PerformanceTable.prototype.recordResults = function(\n    results, opt_desc) {\n  var average = results['average'];\n  var standardDeviation = results['standardDeviation'];\n  var isSuspicious = average < 0 || standardDeviation > average * .5;\n  var resultsRow = goog.dom.createDom(\n      goog.dom.TagName.TR, null,\n      goog.dom.createDom(\n          goog.dom.TagName.TD, 'test-description',\n          opt_desc || 'No description'),\n      goog.dom.createDom(\n          goog.dom.TagName.TD, 'test-count', String(results['count'])),\n      goog.dom.createDom(\n          goog.dom.TagName.TD, 'test-average', this.round_(average)),\n      goog.dom.createDom(\n          goog.dom.TagName.TD, 'test-median', String(results['median'])),\n      goog.dom.createDom(\n          goog.dom.TagName.TD, 'test-standard-deviation',\n          this.round_(standardDeviation)),\n      goog.dom.createDom(\n          goog.dom.TagName.TD, 'test-minimum', String(results['minimum'])),\n      goog.dom.createDom(\n          goog.dom.TagName.TD, 'test-maximum', String(results['maximum'])));\n  if (isSuspicious) {\n    resultsRow.className = 'test-suspicious';\n  }\n  this.getTableBody_().appendChild(resultsRow);\n};\n\n\n/**\n * Report an error in the table.\n * @param {*} reason The reason for the error.\n */\ngoog.testing.PerformanceTable.prototype.reportError = function(reason) {\n  this.getTableBody_().appendChild(\n      goog.dom.createDom(\n          goog.dom.TagName.TR, null,\n          goog.dom.createDom(\n              goog.dom.TagName.TD, {'class': 'test-error', 'colSpan': 5},\n              String(reason))));\n};\n","^17",1579837703000,"^18",["^19",["~$goog.asserts","~$goog.dom","^Z","~$goog.testing.PerformanceTimer","~$goog.dom.TagName"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/performancetable.js"],"^1J",["^19",["~$goog.testing.PerformanceTable"]],"^X",true,"^Y",["^Z","^1S","^1T","^1V","^1U"]],["^ ","^[",[1579837703000],"^10","goog.graphics.abstractgraphics.js","^11",["^12","goog/graphics/abstractgraphics.js"],"^13","goog/graphics/abstractgraphics.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Graphics utility functions and factory methods.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.graphics.AbstractGraphics');\n\ngoog.require('goog.dom');\ngoog.require('goog.graphics.AffineTransform');\ngoog.require('goog.graphics.Element');\ngoog.require('goog.graphics.EllipseElement');\ngoog.require('goog.graphics.Fill');\ngoog.require('goog.graphics.Font');\ngoog.require('goog.graphics.GroupElement');\ngoog.require('goog.graphics.Path');\ngoog.require('goog.graphics.PathElement');\ngoog.require('goog.graphics.RectElement');\ngoog.require('goog.graphics.Stroke');\ngoog.require('goog.graphics.StrokeAndFillElement');\ngoog.require('goog.graphics.TextElement');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.math.Size');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\n\n\n\n/**\n * Base class for the different graphics. You should never construct objects\n * of this class. Instead us goog.graphics.createGraphics\n * @param {number|string} width The width in pixels or percent.\n * @param {number|string} height The height in pixels or percent.\n * @param {?number=} opt_coordWidth Optional coordinate system width - if\n *     omitted or null, defaults to same as width.\n * @param {?number=} opt_coordHeight Optional coordinate system height - if\n *     omitted or null, defaults to same as height.\n * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper object for the\n *     document we want to render in.\n * @constructor\n * @extends {goog.ui.Component}\n */\ngoog.graphics.AbstractGraphics = function(\n    width, height, opt_coordWidth, opt_coordHeight, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * Width of graphics in pixels or percentage points.\n   * @type {number|string}\n   * @protected\n   */\n  this.width = width;\n\n  /**\n   * Height of graphics in pixels or percentage points.\n   * @type {number|string}\n   * @protected\n   */\n  this.height = height;\n\n  /**\n   * Width of coordinate system in units.\n   * @type {?number}\n   * @protected\n   */\n  this.coordWidth = opt_coordWidth || null;\n\n  /**\n   * Height of coordinate system in units.\n   * @type {?number}\n   * @protected\n   */\n  this.coordHeight = opt_coordHeight || null;\n};\ngoog.inherits(goog.graphics.AbstractGraphics, goog.ui.Component);\n\n\n/**\n * The root level group element.\n * @type {goog.graphics.GroupElement?}\n * @protected\n */\ngoog.graphics.AbstractGraphics.prototype.canvasElement = null;\n\n\n/**\n * Left coordinate of the view box\n * @type {number}\n * @protected\n */\ngoog.graphics.AbstractGraphics.prototype.coordLeft = 0;\n\n\n/**\n * Top coordinate of the view box\n * @type {number}\n * @protected\n */\ngoog.graphics.AbstractGraphics.prototype.coordTop = 0;\n\n\n/**\n * @return {goog.graphics.GroupElement} The root level canvas element.\n */\ngoog.graphics.AbstractGraphics.prototype.getCanvasElement = function() {\n  return this.canvasElement;\n};\n\n\n/**\n * Changes the coordinate size.\n * @param {number} coordWidth  The coordinate width.\n * @param {number} coordHeight  The coordinate height.\n */\ngoog.graphics.AbstractGraphics.prototype.setCoordSize = function(\n    coordWidth, coordHeight) {\n  this.coordWidth = coordWidth;\n  this.coordHeight = coordHeight;\n};\n\n\n/**\n * @return {goog.math.Size} The coordinate size.\n */\ngoog.graphics.AbstractGraphics.prototype.getCoordSize = function() {\n  if (this.coordWidth) {\n    return new goog.math.Size(\n        this.coordWidth,\n        /** @type {number} */ (this.coordHeight));\n  } else {\n    return this.getPixelSize();\n  }\n};\n\n\n/**\n * Changes the coordinate system position.\n * @param {number} left  The coordinate system left bound.\n * @param {number} top  The coordinate system top bound.\n */\ngoog.graphics.AbstractGraphics.prototype.setCoordOrigin = goog.abstractMethod;\n\n\n/**\n * @return {!goog.math.Coordinate} The coordinate system position.\n */\ngoog.graphics.AbstractGraphics.prototype.getCoordOrigin = function() {\n  return new goog.math.Coordinate(this.coordLeft, this.coordTop);\n};\n\n\n/**\n * Change the size of the canvas.\n * @param {number} pixelWidth  The width in pixels.\n * @param {number} pixelHeight  The height in pixels.\n */\ngoog.graphics.AbstractGraphics.prototype.setSize = goog.abstractMethod;\n\n\n/**\n * @return {goog.math.Size} The size of canvas.\n * @deprecated Use getPixelSize.\n */\ngoog.graphics.AbstractGraphics.prototype.getSize = function() {\n  return this.getPixelSize();\n};\n\n\n/**\n * @return {goog.math.Size?} Returns the number of pixels spanned by the\n *     surface, or null if the size could not be computed due to the size being\n *     specified in percentage points and the component not being in the\n *     document.\n */\ngoog.graphics.AbstractGraphics.prototype.getPixelSize = function() {\n  if (this.isInDocument()) {\n    return goog.style.getSize(this.getElement());\n  }\n  if (typeof this.width === 'number' && typeof this.height === 'number') {\n    return new goog.math.Size(this.width, this.height);\n  }\n  return null;\n};\n\n\n/**\n * @return {number} Returns the number of pixels per unit in the x direction.\n */\ngoog.graphics.AbstractGraphics.prototype.getPixelScaleX = function() {\n  var pixelSize = this.getPixelSize();\n  return pixelSize ? pixelSize.width / this.getCoordSize().width : 0;\n};\n\n\n/**\n * @return {number} Returns the number of pixels per unit in the y direction.\n */\ngoog.graphics.AbstractGraphics.prototype.getPixelScaleY = function() {\n  var pixelSize = this.getPixelSize();\n  return pixelSize ? pixelSize.height / this.getCoordSize().height : 0;\n};\n\n\n/**\n * Remove all drawing elements from the graphics.\n */\ngoog.graphics.AbstractGraphics.prototype.clear = goog.abstractMethod;\n\n\n/**\n * Remove a single drawing element from the surface.  The default implementation\n * assumes a DOM based drawing surface.\n * @param {goog.graphics.Element} element The element to remove.\n */\ngoog.graphics.AbstractGraphics.prototype.removeElement = function(element) {\n  goog.dom.removeNode(element.getElement());\n};\n\n\n/**\n * Sets the fill for the given element.\n * @param {goog.graphics.StrokeAndFillElement} element The element wrapper.\n * @param {goog.graphics.Fill?} fill The fill object.\n */\ngoog.graphics.AbstractGraphics.prototype.setElementFill = goog.abstractMethod;\n\n\n/**\n * Sets the stroke for the given element.\n * @param {goog.graphics.StrokeAndFillElement} element The element wrapper.\n * @param {goog.graphics.Stroke?} stroke The stroke object.\n */\ngoog.graphics.AbstractGraphics.prototype.setElementStroke = goog.abstractMethod;\n\n\n/**\n * Set the transformation of an element.\n *\n * If a more general affine transform is needed than this provides\n * (e.g. skew and scale) then use setElementAffineTransform.\n * @param {goog.graphics.Element} element The element wrapper.\n * @param {number} x The x coordinate of the translation transform.\n * @param {number} y The y coordinate of the translation transform.\n * @param {number} angle The angle of the rotation transform.\n * @param {number} centerX The horizontal center of the rotation transform.\n * @param {number} centerY The vertical center of the rotation transform.\n */\ngoog.graphics.AbstractGraphics.prototype.setElementTransform =\n    goog.abstractMethod;\n\n\n/**\n * Set the affine transform of an element.\n * @param {!goog.graphics.Element} element The element wrapper.\n * @param {!goog.graphics.AffineTransform} affineTransform The\n *     transformation applied to this element.\n */\ngoog.graphics.AbstractGraphics.prototype.setElementAffineTransform =\n    goog.abstractMethod;\n\n\n/**\n * Draw a circle\n *\n * @param {number} cx Center X coordinate.\n * @param {number} cy Center Y coordinate.\n * @param {number} r Radius length.\n * @param {goog.graphics.Stroke?} stroke Stroke object describing the\n *    stroke.\n * @param {goog.graphics.Fill?} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element to\n *     append to. If not specified, appends to the main canvas.\n *\n * @return {goog.graphics.EllipseElement} The newly created element.\n */\ngoog.graphics.AbstractGraphics.prototype.drawCircle = function(\n    cx, cy, r, stroke, fill, opt_group) {\n  return this.drawEllipse(cx, cy, r, r, stroke, fill, opt_group);\n};\n\n\n/**\n * Draw an ellipse\n *\n * @param {number} cx Center X coordinate.\n * @param {number} cy Center Y coordinate.\n * @param {number} rx Radius length for the x-axis.\n * @param {number} ry Radius length for the y-axis.\n * @param {goog.graphics.Stroke?} stroke Stroke object describing the\n *    stroke.\n * @param {goog.graphics.Fill?} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element to\n *     append to. If not specified, appends to the main canvas.\n *\n * @return {goog.graphics.EllipseElement} The newly created element.\n */\ngoog.graphics.AbstractGraphics.prototype.drawEllipse = goog.abstractMethod;\n\n\n/**\n * Draw a rectangle\n *\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @param {number} width Width of rectangle.\n * @param {number} height Height of rectangle.\n * @param {goog.graphics.Stroke?} stroke Stroke object describing the\n *    stroke.\n * @param {goog.graphics.Fill?} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element to\n *     append to. If not specified, appends to the main canvas.\n *\n * @return {goog.graphics.RectElement} The newly created element.\n */\ngoog.graphics.AbstractGraphics.prototype.drawRect = goog.abstractMethod;\n\n\n/**\n * Draw a text string within a rectangle (drawing is horizontal)\n *\n * @param {string} text The text to draw.\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @param {number} width Width of rectangle.\n * @param {number} height Height of rectangle.\n * @param {string} align Horizontal alignment: left (default), center, right.\n * @param {string} vAlign Vertical alignment: top (default), center, bottom.\n * @param {goog.graphics.Font} font Font describing the font properties.\n * @param {goog.graphics.Stroke?} stroke Stroke object describing the\n *    stroke.\n * @param {goog.graphics.Fill?} fill  Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element to\n *     append to. If not specified, appends to the main canvas.\n *\n * @return {goog.graphics.TextElement} The newly created element.\n */\ngoog.graphics.AbstractGraphics.prototype.drawText = function(\n    text, x, y, width, height, align, vAlign, font, stroke, fill, opt_group) {\n  var baseline = font.size / 2;  // Baseline is middle of line\n  var textY;\n  if (vAlign == 'bottom') {\n    textY = y + height - baseline;\n  } else if (vAlign == 'center') {\n    textY = y + height / 2;\n  } else {\n    textY = y + baseline;\n  }\n\n  return this.drawTextOnLine(\n      text, x, textY, x + width, textY, align, font, stroke, fill, opt_group);\n};\n\n\n/**\n * Draw a text string vertically centered on a given line.\n *\n * @param {string} text  The text to draw.\n * @param {number} x1 X coordinate of start of line.\n * @param {number} y1 Y coordinate of start of line.\n * @param {number} x2 X coordinate of end of line.\n * @param {number} y2 Y coordinate of end of line.\n * @param {string} align Horizontal alingnment: left (default), center, right.\n * @param {goog.graphics.Font} font Font describing the font properties.\n * @param {goog.graphics.Stroke?} stroke Stroke object describing the\n *    stroke.\n * @param {goog.graphics.Fill?} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element to\n *     append to. If not specified, appends to the main canvas.\n *\n * @return {goog.graphics.TextElement} The newly created element.\n */\ngoog.graphics.AbstractGraphics.prototype.drawTextOnLine = goog.abstractMethod;\n\n\n/**\n * Draw a path.\n *\n * @param {!goog.graphics.Path} path The path object to draw.\n * @param {goog.graphics.Stroke?} stroke Stroke object describing the\n *    stroke.\n * @param {goog.graphics.Fill?} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element to\n *     append to. If not specified, appends to the main canvas.\n *\n * @return {goog.graphics.PathElement} The newly created element.\n */\ngoog.graphics.AbstractGraphics.prototype.drawPath = goog.abstractMethod;\n\n\n/**\n * Create an empty group of drawing elements.\n *\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element to\n *     append to. If not specified, appends to the main canvas.\n *\n * @return {goog.graphics.GroupElement} The newly created group.\n */\ngoog.graphics.AbstractGraphics.prototype.createGroup = goog.abstractMethod;\n\n\n/**\n * Create an empty path.\n *\n * @return {!goog.graphics.Path} The path.\n * @deprecated Use {@code new goog.graphics.Path()}.\n */\ngoog.graphics.AbstractGraphics.prototype.createPath = function() {\n  return new goog.graphics.Path();\n};\n\n\n/**\n * Measure and return the width (in pixels) of a given text string.\n * Text measurement is needed to make sure a text can fit in the allocated\n * area. The way text length is measured is by writing it into a div that is\n * after the visible area, measure the div width, and immediately erase the\n * written value.\n *\n * @param {string} text The text string to measure.\n * @param {goog.graphics.Font} font The font object describing the font style.\n *\n * @return {number} The width in pixels of the text strings.\n */\ngoog.graphics.AbstractGraphics.prototype.getTextWidth = goog.abstractMethod;\n\n\n/**\n * @return {boolean} Whether the underlying element can be cloned resulting in\n *     an accurate reproduction of the graphics contents.\n */\ngoog.graphics.AbstractGraphics.prototype.isDomClonable = function() {\n  return false;\n};\n\n\n/**\n * Start preventing redraws - useful for chaining large numbers of changes\n * together.  Not guaranteed to do anything - i.e. only use this for\n * optimization of a single code path.\n */\ngoog.graphics.AbstractGraphics.prototype.suspend = function() {};\n\n\n/**\n * Stop preventing redraws.  If any redraws had been prevented, a redraw will\n * be done now.\n */\ngoog.graphics.AbstractGraphics.prototype.resume = function() {};\n","^17",1579837703000,"^18",["^19",["~$goog.graphics.RectElement","~$goog.graphics.AffineTransform","~$goog.graphics.Font","^1T","~$goog.graphics.EllipseElement","~$goog.graphics.Fill","~$goog.graphics.GroupElement","~$goog.ui.Component","~$goog.math.Size","^Z","~$goog.graphics.StrokeAndFillElement","~$goog.graphics.Path","~$goog.math.Coordinate","~$goog.graphics.PathElement","~$goog.graphics.TextElement","~$goog.style","~$goog.graphics.Stroke","~$goog.graphics.Element"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/abstractgraphics.js"],"^1J",["^19",["~$goog.graphics.AbstractGraphics"]],"^X",true,"^Y",["^Z","^1T","^1Y","^2;","^1[","^20","^1Z","^21","^25","^27","^1X","^2:","^24","^28","^26","^23","^29","^22"]],["^ ","^[",[1579837703000],"^10","goog.html.legacyconversions.js","^11",["^12","goog/html/legacyconversions.js"],"^13","goog/html/legacyconversions.js","^14","^15","^16","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Transitional utilities to unsafely trust random strings as\n * goog.html types. Intended for temporary use when upgrading a library that\n * used to accept plain strings to use safe types, but where it's not\n * practical to transitively update callers.\n *\n * IMPORTANT: No new code should use the conversion functions in this file,\n * they are intended for refactoring old code to use goog.html types. New code\n * should construct goog.html types via their APIs, template systems or\n * sanitizers. If that’s not possible it should use\n * goog.html.uncheckedconversions and undergo security review.\n\n *\n * The semantics of the conversions in goog.html.legacyconversions are very\n * different from the ones provided by goog.html.uncheckedconversions. The\n * latter are for use in code where it has been established through manual\n * security review that the value produced by a piece of code will always\n * satisfy the SafeHtml contract (e.g., the output of a secure HTML sanitizer).\n * In uses of goog.html.legacyconversions, this guarantee is not given -- the\n * value in question originates in unreviewed legacy code and there is no\n * guarantee that it satisfies the SafeHtml contract.\n *\n * There are only three valid uses of legacyconversions:\n *\n * 1. Introducing a goog.html version of a function which currently consumes\n * string and passes that string to a DOM API which can execute script - and\n * hence cause XSS - like innerHTML. For example, Dialog might expose a\n * setContent method which takes a string and sets the innerHTML property of\n * an element with it. In this case a setSafeHtmlContent function could be\n * added, consuming goog.html.SafeHtml instead of string, and using\n * goog.dom.safe.setInnerHtml instead of directly setting innerHTML.\n * setContent could then internally use legacyconversions to create a SafeHtml\n * from string and pass the SafeHtml to setSafeHtmlContent. In this scenario\n * remember to document the use of legacyconversions in the modified setContent\n * and consider deprecating it as well.\n *\n * 2. Automated refactoring of application code which handles HTML as string\n * but needs to call a function which only takes goog.html types. For example,\n * in the Dialog scenario from (1) an alternative option would be to refactor\n * setContent to accept goog.html.SafeHtml instead of string and then refactor\n * all current callers to use legacyconversions to pass SafeHtml. This is\n * generally preferable to (1) because it keeps the library clean of\n * legacyconversions, and makes code sites in application code that are\n * potentially vulnerable to XSS more apparent.\n *\n * 3. Old code which needs to call APIs which consume goog.html types and for\n * which it is prohibitively expensive to refactor to use goog.html types.\n * Generally, this is code where safety from XSS is either hopeless or\n * unimportant.\n */\n\n\ngoog.provide('goog.html.legacyconversions');\n\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.SafeScript');\ngoog.require('goog.html.SafeStyle');\ngoog.require('goog.html.SafeStyleSheet');\ngoog.require('goog.html.SafeUrl');\ngoog.require('goog.html.TrustedResourceUrl');\n\n\n/**\n * Performs an \"unchecked conversion\" from string to SafeHtml for legacy API\n * purposes.\n *\n * Please read fileoverview documentation before using.\n *\n * @param {string} html A string to be converted to SafeHtml.\n * @return {!goog.html.SafeHtml} The value of html, wrapped in a SafeHtml\n *     object.\n */\ngoog.html.legacyconversions.safeHtmlFromString = function(html) {\n  goog.html.legacyconversions.reportCallback_();\n  return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(\n      html, null /* dir */);\n};\n\n\n/**\n * Performs an \"unchecked conversion\" from string to SafeScript for legacy API\n * purposes.\n *\n * Please read fileoverview documentation before using.\n *\n * @param {string} script A string to be converted to SafeScript.\n * @return {!goog.html.SafeScript} The value of script, wrapped in a SafeScript\n *     object.\n */\ngoog.html.legacyconversions.safeScriptFromString = function(script) {\n  goog.html.legacyconversions.reportCallback_();\n  return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(\n      script);\n};\n\n\n/**\n * Performs an \"unchecked conversion\" from string to SafeStyle for legacy API\n * purposes.\n *\n * Please read fileoverview documentation before using.\n *\n * @param {string} style A string to be converted to SafeStyle.\n * @return {!goog.html.SafeStyle} The value of style, wrapped in a SafeStyle\n *     object.\n */\ngoog.html.legacyconversions.safeStyleFromString = function(style) {\n  goog.html.legacyconversions.reportCallback_();\n  return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(\n      style);\n};\n\n\n/**\n * Performs an \"unchecked conversion\" from string to SafeStyleSheet for legacy\n * API purposes.\n *\n * Please read fileoverview documentation before using.\n *\n * @param {string} styleSheet A string to be converted to SafeStyleSheet.\n * @return {!goog.html.SafeStyleSheet} The value of style sheet, wrapped in\n *     a SafeStyleSheet object.\n */\ngoog.html.legacyconversions.safeStyleSheetFromString = function(styleSheet) {\n  goog.html.legacyconversions.reportCallback_();\n  return goog.html.SafeStyleSheet\n      .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(styleSheet);\n};\n\n\n/**\n * Performs an \"unchecked conversion\" from string to SafeUrl for legacy API\n * purposes.\n *\n * Please read fileoverview documentation before using.\n *\n * @param {string} url A string to be converted to SafeUrl.\n * @return {!goog.html.SafeUrl} The value of url, wrapped in a SafeUrl\n *     object.\n */\ngoog.html.legacyconversions.safeUrlFromString = function(url) {\n  goog.html.legacyconversions.reportCallback_();\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);\n};\n\n\n/**\n * Performs an \"unchecked conversion\" from string to TrustedResourceUrl for\n * legacy API purposes.\n *\n * Please read fileoverview documentation before using.\n *\n * @param {string} url A string to be converted to TrustedResourceUrl.\n * @return {!goog.html.TrustedResourceUrl} The value of url, wrapped in a\n *     TrustedResourceUrl object.\n */\ngoog.html.legacyconversions.trustedResourceUrlFromString = function(url) {\n  goog.html.legacyconversions.reportCallback_();\n  return goog.html.TrustedResourceUrl\n      .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(url);\n};\n\n/**\n * @private {function(): undefined}\n */\ngoog.html.legacyconversions.reportCallback_ = goog.nullFunction;\n\n\n/**\n * Sets a function that will be called every time a legacy conversion is\n * performed. The function is called with no parameters but it can use\n * goog.debug.getStacktrace to get a stacktrace.\n *\n * @param {function(): undefined} callback Error callback as defined above.\n */\ngoog.html.legacyconversions.setReportCallback = function(callback) {\n  goog.html.legacyconversions.reportCallback_ = callback;\n};\n","^17",1579837703000,"^18",["^19",["~$goog.html.SafeScript","~$goog.html.TrustedResourceUrl","~$goog.html.SafeUrl","^Z","~$goog.html.SafeStyle","~$goog.html.SafeStyleSheet","~$goog.html.SafeHtml"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/legacyconversions.js"],"^1J",["^19",["~$goog.html.legacyconversions"]],"^X",true,"^Y",["^Z","^2B","^2=","^2@","^2A","^2?","^2>"]],["^ ","^[",[1579837703000],"^10","goog.string.stringformat.js","^11",["^12","goog/string/stringformat.js"],"^13","goog/string/stringformat.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implementation of sprintf-like, python-%-operator-like,\n * .NET-String.Format-like functionality. Uses JS string's replace method to\n * extract format specifiers and sends those specifiers to a handler function,\n * which then, based on conversion type part of the specifier, calls the\n * appropriate function to handle the specific conversion.\n * For specific functionality implemented, look at formatRe below, or look\n * at the tests.\n */\n\ngoog.provide('goog.string.format');\n\ngoog.require('goog.string');\n\n\n// TODO(johnlenz): goog.string.format should not accept undefined as a parameter\n/**\n * Performs sprintf-like conversion, i.e. puts the values in a template.\n * DO NOT use it instead of built-in conversions in simple cases such as\n * 'Cost: %.2f' as it would introduce unnecessary latency opposed to\n * 'Cost: ' + cost.toFixed(2).\n * @param {string} formatString Template string containing % specifiers.\n * @param {...(string|number|undefined)} var_args Values formatString is to\n *     be filled with.\n * @return {string} Formatted string.\n */\ngoog.string.format = function(formatString, var_args) {\n\n  // Convert the arguments to an array (MDC recommended way).\n  var args = Array.prototype.slice.call(arguments);\n\n  // Try to get the template.\n  var template = args.shift();\n  if (typeof template == 'undefined') {\n    throw new Error('[goog.string.format] Template required');\n  }\n\n  // This re is used for matching, it also defines what is supported.\n  var formatRe = /%([0\\-\\ \\+]*)(\\d+)?(\\.(\\d+))?([%sfdiu])/g;\n\n  /**\n   * Chooses which conversion function to call based on type conversion\n   * specifier.\n   * @param {string} match Contains the re matched string.\n   * @param {string} flags Formatting flags.\n   * @param {string} width Replacement string minimum width.\n   * @param {string} dotp Matched precision including a dot.\n   * @param {string} precision Specifies floating point precision.\n   * @param {string} type Type conversion specifier.\n   * @param {string} offset Matching location in the original string.\n   * @param {string} wholeString Has the actualString being searched.\n   * @return {string} Formatted parameter.\n   */\n  function replacerDemuxer(\n      match, flags, width, dotp, precision, type, offset, wholeString) {\n    // The % is too simple and doesn't take an argument.\n    if (type == '%') {\n      return '%';\n    }\n\n    // Try to get the actual value from parent function.\n    var value = args.shift();\n\n    // If we didn't get any arguments, fail.\n    if (typeof value == 'undefined') {\n      throw new Error('[goog.string.format] Not enough arguments');\n    }\n\n    // Patch the value argument to the beginning of our type specific call.\n    arguments[0] = value;\n\n    return goog.string.format.demuxes_[type].apply(null, arguments);\n  }\n\n  return template.replace(formatRe, replacerDemuxer);\n};\n\n\n/**\n * Contains various conversion functions (to be filled in later on).\n * @private {!Object}\n */\ngoog.string.format.demuxes_ = {};\n\n\n/**\n * Processes %s conversion specifier.\n * @param {string} value Contains the formatRe matched string.\n * @param {string} flags Formatting flags.\n * @param {string} width Replacement string minimum width.\n * @param {string} dotp Matched precision including a dot.\n * @param {string} precision Specifies floating point precision.\n * @param {string} type Type conversion specifier.\n * @param {string} offset Matching location in the original string.\n * @param {string} wholeString Has the actualString being searched.\n * @return {string} Replacement string.\n */\ngoog.string.format.demuxes_['s'] = function(\n    value, flags, width, dotp, precision, type, offset, wholeString) {\n  var replacement = value;\n  // If no padding is necessary we're done.\n  // The check for '' is necessary because Firefox incorrectly provides the\n  // empty string instead of undefined for non-participating capture groups,\n  // and isNaN('') == false.\n  if (isNaN(width) || width == '' || replacement.length >= Number(width)) {\n    return replacement;\n  }\n\n  // Otherwise we should find out where to put spaces.\n  if (flags.indexOf('-', 0) > -1) {\n    replacement = replacement +\n        goog.string.repeat(' ', Number(width) - replacement.length);\n  } else {\n    replacement = goog.string.repeat(' ', Number(width) - replacement.length) +\n        replacement;\n  }\n  return replacement;\n};\n\n\n/**\n * Processes %f conversion specifier.\n * @param {string} value Contains the formatRe matched string.\n * @param {string} flags Formatting flags.\n * @param {string} width Replacement string minimum width.\n * @param {string} dotp Matched precision including a dot.\n * @param {string} precision Specifies floating point precision.\n * @param {string} type Type conversion specifier.\n * @param {string} offset Matching location in the original string.\n * @param {string} wholeString Has the actualString being searched.\n * @return {string} Replacement string.\n */\ngoog.string.format.demuxes_['f'] = function(\n    value, flags, width, dotp, precision, type, offset, wholeString) {\n\n  var replacement = value.toString();\n\n  // The check for '' is necessary because Firefox incorrectly provides the\n  // empty string instead of undefined for non-participating capture groups,\n  // and isNaN('') == false.\n  if (!(isNaN(precision) || precision == '')) {\n    replacement = parseFloat(value).toFixed(precision);\n  }\n\n  // Generates sign string that will be attached to the replacement.\n  var sign;\n  if (Number(value) < 0) {\n    sign = '-';\n  } else if (flags.indexOf('+') >= 0) {\n    sign = '+';\n  } else if (flags.indexOf(' ') >= 0) {\n    sign = ' ';\n  } else {\n    sign = '';\n  }\n\n  if (Number(value) >= 0) {\n    replacement = sign + replacement;\n  }\n\n  // If no padding is necessary we're done.\n  if (isNaN(width) || replacement.length >= Number(width)) {\n    return replacement;\n  }\n\n  // We need a clean signless replacement to start with\n  replacement = isNaN(precision) ? Math.abs(Number(value)).toString() :\n                                   Math.abs(Number(value)).toFixed(precision);\n\n  var padCount = Number(width) - replacement.length - sign.length;\n\n  // Find out which side to pad, and if it's left side, then which character to\n  // pad, and set the sign on the left and padding in the middle.\n  if (flags.indexOf('-', 0) >= 0) {\n    replacement = sign + replacement + goog.string.repeat(' ', padCount);\n  } else {\n    // Decides which character to pad.\n    var paddingChar = (flags.indexOf('0', 0) >= 0) ? '0' : ' ';\n    replacement =\n        sign + goog.string.repeat(paddingChar, padCount) + replacement;\n  }\n\n  return replacement;\n};\n\n\n/**\n * Processes %d conversion specifier.\n * @param {string} value Contains the formatRe matched string.\n * @param {string} flags Formatting flags.\n * @param {string} width Replacement string minimum width.\n * @param {string} dotp Matched precision including a dot.\n * @param {string} precision Specifies floating point precision.\n * @param {string} type Type conversion specifier.\n * @param {string} offset Matching location in the original string.\n * @param {string} wholeString Has the actualString being searched.\n * @return {string} Replacement string.\n */\ngoog.string.format.demuxes_['d'] = function(\n    value, flags, width, dotp, precision, type, offset, wholeString) {\n  return goog.string.format.demuxes_['f'](\n      parseInt(value, 10) /* value */, flags, width, dotp, 0 /* precision */,\n      type, offset, wholeString);\n};\n\n\n// These are additional aliases, for integer conversion.\ngoog.string.format.demuxes_['i'] = goog.string.format.demuxes_['d'];\ngoog.string.format.demuxes_['u'] = goog.string.format.demuxes_['d'];\n","^17",1579837703000,"^18",["^19",["~$goog.string","^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/string/stringformat.js"],"^1J",["^19",["~$goog.string.format"]],"^X",true,"^Y",["^Z","^2D"]],["^ ","^[",[1579837703000],"~:goog-module",true,"^10","goog.html.sanitizer.csspropertysanitizer.js","^11",["^12","goog/html/sanitizer/csspropertysanitizer.js"],"^13","goog/html/sanitizer/csspropertysanitizer.js","^14","^15","^16","// Copyright 2018 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A sanitizer for CSS property values. It is intended\n * to be used on the result of {@code CSSStyleDeclaration.getPropertyValue},\n * which has already been parsed and validated by the browser out of stylesheets\n * and inline style attributes. At the moment, it's only purpose is to detect\n * CSS functions to apply a whitelist and support rewriting of URLs.\n * @package\n */\n\ngoog.module('goog.html.sanitizer.CssPropertySanitizer');\ngoog.module.declareLegacyNamespace();\n\nvar SafeUrl = goog.require('goog.html.SafeUrl');\nvar googAsserts = goog.require('goog.asserts');\nvar googObject = goog.require('goog.object');\nvar googString = goog.require('goog.string');\n\n\n/**\n * Allowed CSS functions\n * @const {!Object<string,boolean>}\n */\nvar ALLOWED_FUNCTIONS = googObject.createSet(\n    'rgb', 'rgba', 'alpha', 'rect', 'image', 'linear-gradient',\n    'radial-gradient', 'repeating-linear-gradient', 'repeating-radial-gradient',\n    'cubic-bezier', 'matrix', 'perspective', 'rotate', 'rotate3d', 'rotatex',\n    'rotatey', 'steps', 'rotatez', 'scale', 'scale3d', 'scalex', 'scaley',\n    'scalez', 'skew', 'skewx', 'skewy', 'translate', 'translate3d',\n    'translatex', 'translatey', 'translatez');\n\n/**\n * The set of characters that need to be normalized inside url(\"...\").\n * We normalize newlines because they are not allowed inside quoted strings,\n * normalize quote characters, angle-brackets, and asterisks because they\n * could be used to break out of the URL or introduce targets for CSS\n * error recovery.  We normalize parentheses since they delimit unquoted\n * URLs and calls and could be a target for error recovery.\n * @const {!RegExp}\n */\nvar NORM_URL_REGEXP = /[\\n\\f\\r\\\"\\'()*<>]/g;\n\n/**\n * The replacements for NORM_URL_REGEXP.\n * @const {!Object<string, string>}\n */\nvar NORM_URL_REPLACEMENTS = {\n  '\\n': '%0a',\n  '\\f': '%0c',\n  '\\r': '%0d',\n  '\"': '%22',\n  '\\'': '%27',\n  '(': '%28',\n  ')': '%29',\n  '*': '%2a',\n  '<': '%3c',\n  '>': '%3e'\n};\n\n/**\n * Normalizes a character for use in a url() directive.\n * @param {string} ch Character to be normalized.\n * @return {string} Normalized character.\n */\nfunction normalizeUrlChar(ch) {\n  return googAsserts.assert(NORM_URL_REPLACEMENTS[ch]);\n}\n\n/**\n * Constructs a safe URI from a given URI and prop using a given uriRewriter\n * function.\n * @param {string} uri URI to be sanitized.\n * @param {string} propName Property name which contained the URI.\n * @param {?function(string, string):?SafeUrl} uriRewriter A URI rewriter that\n *     returns a {@link SafeUrl}.\n * @return {?string} Safe URI for use in CSS.\n */\nfunction getSafeUri(uri, propName, uriRewriter) {\n  if (!uriRewriter) {\n    return null;\n  }\n  var safeUri = uriRewriter(uri, propName);\n  if (safeUri && SafeUrl.unwrap(safeUri) != SafeUrl.INNOCUOUS_STRING) {\n    return 'url(\"' +\n        SafeUrl.unwrap(safeUri).replace(NORM_URL_REGEXP, normalizeUrlChar) +\n        '\")';\n  }\n  return null;\n}\n\n/**\n * Sanitizes the value for a given a browser-parsed CSS value.\n * @param {string} propName A property name.\n * @param {string} propValue Value of the property as parsed by the browser.\n * @param {function(string, string):?SafeUrl=} opt_uriRewriter A URI\n *     rewriter that returns an unwrapped goog.html.SafeUrl.\n * @return {?string} Sanitized property value or null if the property should be\n *     rejected altogether.\n */\nexports.sanitizeProperty = function(propName, propValue, opt_uriRewriter) {\n  propValue = googString.trim(propValue);\n  if (propValue == '') {\n    return null;\n  }\n\n  if (googString.caseInsensitiveStartsWith(propValue, 'url(')) {\n    // Urls can only appear as the only function call in the property value, and\n    // are rewritten according to the policy implemented in opt_uriRewriter.\n    if (!propValue.endsWith(')') || googString.countOf(propValue, '(') > 1 ||\n        googString.countOf(propValue, ')') > 1) {\n      // This is a little stricter than it needs to be (e.g. it will refuse\n      // url(\"http://foo.com/a(b\"), but it's better to err on the side of\n      // caution (even though getSafeUri is guaranteed to yield a single,\n      // SafeHtml-compliant url(...) value).\n      return null;\n    }\n    // TODO(pelizzi): use HtmlSanitizerUrlPolicy for opt_uriRewriter.\n    if (!opt_uriRewriter) {\n      return null;\n    }\n    // TODO(danesh): Check if we need to resolve this URI.\n    var uri = googString.stripQuotes(\n        propValue.substring(4, propValue.length - 1), '\"\\'');\n\n    return getSafeUri(uri, propName, opt_uriRewriter);\n  } else if (propValue.indexOf('(') > 0) {\n    // Functions are filtered through a whitelist. String arguments (e.g.\n    // url(\"...\")) are not supported, because IE/EDGE can feed back malformed\n    // output when given malformed input (e.g. url(\"ab\"c\")). We would need a\n    // full parser to address this.\n    if (/\"|'/.test(propValue)) {\n      return null;\n    }\n    var regex = /([\\-\\w]+)\\(/g;\n    var match;\n    while (match = regex.exec(propValue)) {\n      if (!(match[1] in ALLOWED_FUNCTIONS)) {\n        return null;\n      }\n    }\n    return propValue;\n  } else {\n    // Everything else is allowed.\n    // TODO(pelizzi): This was kept as-is during refactoring to maintain the\n    // existing behavior. In particular we allow 'quotes: \"xx\" \"yy\"'. But\n    // ideally we should only allow values without quotes and parentheses here.\n    return propValue;\n  }\n};\n","^17",1579837703000,"^18",["^19",["^1S","^2?","^2D","^Z","~$goog.object"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/sanitizer/csspropertysanitizer.js"],"^1J",["^19",["~$goog.html.sanitizer.CssPropertySanitizer"]],"^X",true,"^Y",["^Z","^2?","^1S","^2G","^2D"]],["^ ","^[",[1579837703000],"^10","goog.editor.contenteditablefield.js","^11",["^12","goog/editor/contenteditablefield.js"],"^13","goog/editor/contenteditablefield.js","^14","^15","^16","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class to encapsulate an editable field that blends into the\n * style of the page and never uses an iframe.  The field's height can be\n * controlled by CSS styles like min-height, max-height, and overflow.  This is\n * a goog.editor.Field, but overrides everything iframe related to use\n * contentEditable divs.  This is essentially a much lighter alternative to\n * goog.editor.SeamlessField, but only works in Firefox 3+, and only works\n * *well* in Firefox 12+ due to\n * https://bugzilla.mozilla.org/show_bug.cgi?id=669026.\n *\n * @author gboyer@google.com (Garrett Boyer)\n * @author nicksantos@google.com (Nick Santos)\n */\n\n\ngoog.provide('goog.editor.ContentEditableField');\n\ngoog.require('goog.asserts');\ngoog.require('goog.editor.Field');\ngoog.require('goog.log');\n\n\n\n/**\n * This class encapsulates an editable field that is just a contentEditable\n * div.\n *\n * To see events fired by this object, please see the base class.\n *\n * @param {string} id An identifer for the field. This is used to find the\n *     field and the element associated with this field.\n * @param {Document=} opt_doc The document that the element with the given\n *     id can be found in.\n * @constructor\n * @extends {goog.editor.Field}\n */\ngoog.editor.ContentEditableField = function(id, opt_doc) {\n  goog.editor.Field.call(this, id, opt_doc);\n};\ngoog.inherits(goog.editor.ContentEditableField, goog.editor.Field);\n\n\n/**\n * @override\n */\ngoog.editor.ContentEditableField.prototype.logger =\n    goog.log.getLogger('goog.editor.ContentEditableField');\n\n\n/** @override */\ngoog.editor.ContentEditableField.prototype.usesIframe = function() {\n  // Never uses an iframe in any browser.\n  return false;\n};\n\n\n// Overridden to improve dead code elimination only.\n/** @override */\ngoog.editor.ContentEditableField.prototype.turnOnDesignModeGecko =\n    goog.nullFunction;\n\n\n/** @override */\ngoog.editor.ContentEditableField.prototype.installStyles = function() {\n  goog.asserts.assert(\n      !this.cssStyles.getTypedStringValue(),\n      'ContentEditableField does not support CSS styles; instead just write ' +\n          'plain old CSS on the main page.');\n};\n\n\n/** @override */\ngoog.editor.ContentEditableField.prototype.makeEditableInternal = function(\n    opt_iframeSrc) {\n  var field = this.getOriginalElement();\n  if (field) {\n    this.setupFieldObject(field);\n    // TODO(gboyer): Allow clients/plugins to override with 'plaintext-only'\n    // for WebKit.\n    field.contentEditable = true;\n\n    this.injectContents(field.innerHTML, field);\n\n    this.handleFieldLoad();\n  }\n};\n\n\n/**\n * @override\n *\n * ContentEditableField does not make any changes to the DOM when it is made\n * editable other than setting contentEditable to true.\n */\ngoog.editor.ContentEditableField.prototype.restoreDom = goog.nullFunction;\n","^17",1579837703000,"^18",["^19",["^1S","^Z","~$goog.editor.Field","~$goog.log"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/contenteditablefield.js"],"^1J",["^19",["~$goog.editor.ContentEditableField"]],"^X",true,"^Y",["^Z","^1S","^2I","^2J"]],["^ ","^[",[1579837703000],"^10","goog.editor.field.js","^11",["^12","goog/editor/field.js"],"^13","goog/editor/field.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved.\n\n/**\n * @fileoverview Class to encapsulate an editable field.  Always uses an\n * iframe to contain the editable area, never inherits the style of the\n * surrounding page, and is always a fixed height.\n *\n * @author nicksantos@google.com (Nick Santos)\n * @see ../demos/editor/editor.html\n * @see ../demos/editor/field_basic.html\n */\n\ngoog.provide('goog.editor.Field');\ngoog.provide('goog.editor.Field.EventType');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.async.Delay');\ngoog.require('goog.dom');\ngoog.require('goog.dom.Range');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.dom.safe');\ngoog.require('goog.editor.BrowserFeature');\ngoog.require('goog.editor.Command');\ngoog.require('goog.editor.PluginImpl');\ngoog.require('goog.editor.icontent');\ngoog.require('goog.editor.icontent.FieldFormatInfo');\ngoog.require('goog.editor.icontent.FieldStyleInfo');\ngoog.require('goog.editor.node');\ngoog.require('goog.editor.range');\ngoog.require('goog.events');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.functions');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.SafeStyleSheet');\ngoog.require('goog.log');\ngoog.require('goog.log.Level');\ngoog.require('goog.string');\ngoog.require('goog.string.Unicode');\ngoog.require('goog.style');\ngoog.require('goog.userAgent');\ngoog.require('goog.userAgent.product');\n\n\n\n/**\n * This class encapsulates an editable field.\n *\n * event: load Fires when the field is loaded\n * event: unload Fires when the field is unloaded (made not editable)\n *\n * event: beforechange Fires before the content of the field might change\n *\n * event: delayedchange Fires a short time after field has changed. If multiple\n *                      change events happen really close to each other only\n *                      the last one will trigger the delayedchange event.\n *\n * event: beforefocus Fires before the field becomes active\n * event: focus Fires when the field becomes active. Fires after the blur event\n * event: blur Fires when the field becomes inactive\n *\n * TODO: figure out if blur or beforefocus fires first in IE and make FF match\n *\n * @param {string} id An identifer for the field. This is used to find the\n *    field and the element associated with this field.\n * @param {Document=} opt_doc The document that the element with the given\n *     id can be found in.  If not provided, the default document is used.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.editor.Field = function(id, opt_doc) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * The id for this editable field, which must match the id of the element\n   * associated with this field.\n   * @type {string}\n   */\n  this.id = id;\n\n  /**\n   * The hash code for this field. Should be equal to the id.\n   * @type {string}\n   * @private\n   */\n  this.hashCode_ = id;\n\n  /**\n   * Dom helper for the editable node.\n   * @type {?goog.dom.DomHelper}\n   * @protected\n   */\n  this.editableDomHelper = null;\n\n  /**\n   * Map of class id to registered plugin.\n   * @type {Object}\n   * @private\n   */\n  this.plugins_ = {};\n\n\n  /**\n   * Plugins registered on this field, indexed by the goog.editor.PluginImpl.Op\n   * that they support.\n   * @type {!Object<!Array<!goog.editor.PluginImpl>>}\n   * @private\n   */\n  this.indexedPlugins_ = {};\n\n  for (var op in goog.editor.PluginImpl.OPCODE) {\n    this.indexedPlugins_[op] = [];\n  }\n\n\n  /**\n   * Additional styles to install for the editable field.\n   * @type {!goog.html.SafeStyleSheet}\n   * @protected\n   */\n  this.cssStyles = goog.html.SafeStyleSheet.EMPTY;\n\n  // The field will not listen to change events until it has finished loading\n  /** @private */\n  this.stoppedEvents_ = {};\n  this.stopEvent(goog.editor.Field.EventType.CHANGE);\n  this.stopEvent(goog.editor.Field.EventType.DELAYEDCHANGE);\n  /** @private */\n  this.isModified_ = false;\n  /** @private */\n  this.isEverModified_ = false;\n  /** @private */\n  this.delayedChangeTimer_ = new goog.async.Delay(\n      this.dispatchDelayedChange_, goog.editor.Field.DELAYED_CHANGE_FREQUENCY,\n      this);\n\n  /** @private */\n  this.debouncedEvents_ = {};\n  for (var key in goog.editor.Field.EventType) {\n    this.debouncedEvents_[goog.editor.Field.EventType[key]] = 0;\n  }\n\n  if (goog.editor.BrowserFeature.USE_MUTATION_EVENTS) {\n    /** @private */\n    this.changeTimerGecko_ = new goog.async.Delay(\n        this.handleChange, goog.editor.Field.CHANGE_FREQUENCY, this);\n  }\n\n  /**\n   * @type {goog.events.EventHandler<!goog.editor.Field>}\n   * @protected\n   */\n  this.eventRegister = new goog.events.EventHandler(this);\n\n  // Wrappers around this field, to be disposed when the field is disposed.\n  /** @private */\n  this.wrappers_ = [];\n\n  /** @private */\n  this.loadState_ = goog.editor.Field.LoadState_.UNEDITABLE;\n\n  var doc = opt_doc || document;\n\n  /**\n   * The dom helper for the node to be made editable.\n   * @type {goog.dom.DomHelper}\n   * @protected\n   */\n  this.originalDomHelper = goog.dom.getDomHelper(doc);\n\n  /**\n   * The original node that is being made editable, or null if it has\n   * not yet been found.\n   * @type {Element}\n   * @protected\n   */\n  this.originalElement = this.originalDomHelper.getElement(this.id);\n\n  /**\n   * @private {boolean}\n   */\n  this.followLinkInNewWindow_ =\n      goog.editor.BrowserFeature.FOLLOWS_EDITABLE_LINKS;\n\n  // Default to the same window as the field is in.\n  /** @private */\n  this.appWindow_ = this.originalDomHelper.getWindow();\n};\ngoog.inherits(goog.editor.Field, goog.events.EventTarget);\n\n\n/**\n * The editable dom node.\n * @type {?Element}\n * TODO(user): Make this private!\n */\ngoog.editor.Field.prototype.field = null;\n\n\n/**\n * Logging object.\n * @type {goog.log.Logger}\n * @protected\n */\ngoog.editor.Field.prototype.logger = goog.log.getLogger('goog.editor.Field');\n\n\n/**\n * Event types that can be stopped/started.\n * @enum {string}\n */\ngoog.editor.Field.EventType = {\n  /**\n   * Dispatched when the command state of the selection may have changed. This\n   * event should be listened to for updating toolbar state.\n   */\n  COMMAND_VALUE_CHANGE: 'cvc',\n  /**\n   * Dispatched when the field is loaded and ready to use.\n   */\n  LOAD: 'load',\n  /**\n   * Dispatched when the field is fully unloaded and uneditable.\n   */\n  UNLOAD: 'unload',\n  /**\n   * Dispatched before the field contents are changed.\n   */\n  BEFORECHANGE: 'beforechange',\n  /**\n   * Dispatched when the field contents change, in FF only.\n   * Used for internal resizing, please do not use.\n   */\n  CHANGE: 'change',\n  /**\n   * Dispatched on a slight delay after changes are made.\n   * Use for autosave, or other times your app needs to know\n   * that the field contents changed.\n   */\n  DELAYEDCHANGE: 'delayedchange',\n  /**\n   * Dispatched before focus in moved into the field.\n   */\n  BEFOREFOCUS: 'beforefocus',\n  /**\n   * Dispatched when focus is moved into the field.\n   */\n  FOCUS: 'focus',\n  /**\n   * Dispatched when the field is blurred.\n   */\n  BLUR: 'blur',\n  /**\n   * Dispatched before tab is handled by the field.  This is a legacy way\n   * of controlling tab behavior.  Use trog.plugins.AbstractTabHandler now.\n   */\n  BEFORETAB: 'beforetab',\n  /**\n   * Dispatched after the iframe containing the field is resized, so that UI\n   * components which contain it can respond.\n   */\n  IFRAME_RESIZED: 'ifrsz',\n  /**\n   * Dispatched after a user action that will eventually fire a SELECTIONCHANGE\n   * event. For mouseups, this is fired immediately before SELECTIONCHANGE,\n   * since {@link #handleMouseUp_} fires SELECTIONCHANGE immediately. May be\n   * fired up to {@link #SELECTION_CHANGE_FREQUENCY_} ms before SELECTIONCHANGE\n   * is fired in the case of keyup events, since they use\n   * {@link #selectionChangeTimer_}.\n   */\n  BEFORESELECTIONCHANGE: 'beforeselectionchange',\n  /**\n   * Dispatched when the selection changes.\n   * Use handleSelectionChange from plugin API instead of listening\n   * directly to this event.\n   */\n  SELECTIONCHANGE: 'selectionchange'\n};\n\n\n/**\n * The load state of the field.\n * @enum {number}\n * @private\n */\ngoog.editor.Field.LoadState_ = {\n  UNEDITABLE: 0,\n  LOADING: 1,\n  EDITABLE: 2\n};\n\n\n/**\n * The amount of time that a debounce blocks an event.\n * TODO(nicksantos): As of 9/30/07, this is only used for blocking\n * a keyup event after a keydown. We might need to tweak this for other\n * types of events. Maybe have a per-event debounce time?\n * @type {number}\n * @private\n */\ngoog.editor.Field.DEBOUNCE_TIME_MS_ = 500;\n\n\n/**\n * There is at most one \"active\" field at a time.  By \"active\" field, we mean\n * a field that has focus and is being used.\n * @type {?string}\n * @private\n */\ngoog.editor.Field.activeFieldId_ = null;\n\n\n/**\n * Whether this field is in \"modal interaction\" mode. This usually\n * means that it's being edited by a dialog.\n * @type {boolean}\n * @private\n */\ngoog.editor.Field.prototype.inModalMode_ = false;\n\n\n/**\n * The window where dialogs and bubbles should be rendered.\n * @type {!Window}\n * @private\n */\ngoog.editor.Field.prototype.appWindow_;\n\n\n/** @private {?goog.async.Delay} */\ngoog.editor.Field.prototype.selectionChangeTimer_ = null;\n\n/** @private {boolean} */\ngoog.editor.Field.prototype.isSelectionEditable_ = false;\n\n\n/**\n * Target node to be used when dispatching SELECTIONCHANGE asynchronously on\n * mouseup (to avoid IE quirk). Should be set just before starting the timer and\n * nulled right after consuming.\n * @type {Node}\n * @private\n */\ngoog.editor.Field.prototype.selectionChangeTarget_;\n\n\n/**\n * Flag controlling whether to capture mouse up events on the window or not.\n * @type {boolean}\n * @private\n */\ngoog.editor.Field.prototype.useWindowMouseUp_ = false;\n\n\n/**\n * FLag indicating the handling of a mouse event sequence.\n * @type {boolean}\n * @private\n */\ngoog.editor.Field.prototype.waitingForMouseUp_ = false;\n\n\n/**\n * Sets the active field id.\n * @param {?string} fieldId The active field id.\n */\ngoog.editor.Field.setActiveFieldId = function(fieldId) {\n  goog.editor.Field.activeFieldId_ = fieldId;\n};\n\n\n/**\n * @return {?string} The id of the active field.\n */\ngoog.editor.Field.getActiveFieldId = function() {\n  return goog.editor.Field.activeFieldId_;\n};\n\n\n/**\n * Sets flag to control whether to use window mouse up after seeing\n * a mouse down operation on the field.\n * @param {boolean} flag True to track window mouse up.\n */\ngoog.editor.Field.prototype.setUseWindowMouseUp = function(flag) {\n  goog.asserts.assert(\n      !flag || !this.usesIframe(),\n      'procssing window mouse up should only be enabled when not using iframe');\n  this.useWindowMouseUp_ = flag;\n};\n\n\n/**\n * @return {boolean} Whether we're in modal interaction mode. When this\n *     returns true, another plugin is interacting with the field contents\n *     in a synchronous way, and expects you not to make changes to\n *     the field's DOM structure or selection.\n */\ngoog.editor.Field.prototype.inModalMode = function() {\n  return this.inModalMode_;\n};\n\n\n/**\n * @param {boolean} inModalMode Sets whether we're in modal interaction mode.\n */\ngoog.editor.Field.prototype.setModalMode = function(inModalMode) {\n  this.inModalMode_ = inModalMode;\n};\n\n\n/**\n * Returns a string usable as a hash code for this field. For field's\n * that were created with an id, the hash code is guaranteed to be the id.\n * TODO(user): I think we can get rid of this.  Seems only used from editor.\n * @return {string} The hash code for this editable field.\n */\ngoog.editor.Field.prototype.getHashCode = function() {\n  return this.hashCode_;\n};\n\n\n/**\n * Returns the editable DOM element or null if this field\n * is not editable.\n * <p>On IE or Safari this is the element with contentEditable=true\n * (in whitebox mode, the iFrame body).\n * <p>On Gecko this is the iFrame body\n * TODO(user): How do we word this for subclass version?\n * @return {Element} The editable DOM element, defined as above.\n */\ngoog.editor.Field.prototype.getElement = function() {\n  return this.field;\n};\n\n\n/**\n * Returns original DOM element that is being made editable by Trogedit or\n * null if that element has not yet been found in the appropriate document.\n * @return {Element} The original element.\n */\ngoog.editor.Field.prototype.getOriginalElement = function() {\n  return this.originalElement;\n};\n\n\n/**\n * Registers a keyboard event listener on the field.  This is necessary for\n * Gecko since the fields are contained in an iFrame and there is no way to\n * auto-propagate key events up to the main window.\n * @param {string|Array<string>} type Event type to listen for or array of\n *    event types, for example goog.events.EventType.KEYDOWN.\n * @param {Function} listener Function to be used as the listener.\n * @param {boolean=} opt_capture Whether to use capture phase (optional,\n *    defaults to false).\n * @param {Object=} opt_handler Object in whose scope to call the listener.\n */\ngoog.editor.Field.prototype.addListener = function(\n    type, listener, opt_capture, opt_handler) {\n  var elem = this.getElement();\n  // On Gecko, keyboard events only reliably fire on the document element when\n  // using an iframe.\n  if (goog.editor.BrowserFeature.USE_DOCUMENT_FOR_KEY_EVENTS && elem &&\n      this.usesIframe()) {\n    elem = elem.ownerDocument;\n  }\n  if (opt_handler) {\n    this.eventRegister.listenWithScope(\n        elem, type, listener, opt_capture, opt_handler);\n  } else {\n    this.eventRegister.listen(elem, type, listener, opt_capture);\n  }\n};\n\n\n/**\n * Returns the registered plugin with the given classId.\n * @param {string} classId classId of the plugin.\n * @return {?goog.editor.PluginImpl} Registered plugin with the given classId.\n */\ngoog.editor.Field.prototype.getPluginByClassId = function(classId) {\n  return this.plugins_[classId] || null;\n};\n\n\n/**\n * Registers the plugin with the editable field.\n * @param {!goog.editor.PluginImpl} plugin The plugin to register.\n */\ngoog.editor.Field.prototype.registerPlugin = function(plugin) {\n  var classId = plugin.getTrogClassId();\n  if (this.plugins_[classId]) {\n    goog.log.error(\n        this.logger, 'Cannot register the same class of plugin twice.');\n  }\n  this.plugins_[classId] = plugin;\n\n  // Only key events and execute should have these has* functions with a custom\n  // handler array since they need to be very careful about performance.\n  // The rest of the plugin hooks should be event-based.\n  for (var op in goog.editor.PluginImpl.OPCODE) {\n    var opcode = goog.editor.PluginImpl.OPCODE[op];\n    if (plugin[opcode]) {\n      this.indexedPlugins_[op].push(plugin);\n    }\n  }\n  plugin.registerFieldObject(this);\n\n  // By default we enable all plugins for fields that are currently loaded.\n  if (this.isLoaded()) {\n    plugin.enable(this);\n  }\n};\n\n\n/**\n * Unregisters the plugin with this field.\n * @param {?goog.editor.PluginImpl} plugin The plugin to unregister.\n */\ngoog.editor.Field.prototype.unregisterPlugin = function(plugin) {\n  if (!plugin) {\n    return;\n  }\n\n  var classId = plugin.getTrogClassId();\n  if (!this.plugins_[classId]) {\n    goog.log.error(\n        this.logger, 'Cannot unregister a plugin that isn\\'t registered.');\n  }\n  delete this.plugins_[classId];\n\n  for (var op in goog.editor.PluginImpl.OPCODE) {\n    var opcode = goog.editor.PluginImpl.OPCODE[op];\n    if (plugin[opcode]) {\n      goog.array.remove(this.indexedPlugins_[op], plugin);\n    }\n  }\n\n  plugin.unregisterFieldObject(this);\n};\n\n\n/**\n * Sets the value that will replace the style attribute of this field's\n * element when the field is made non-editable. This method is called with the\n * current value of the style attribute when the field is made editable.\n * @param {string} cssText The value of the style attribute.\n */\ngoog.editor.Field.prototype.setInitialStyle = function(cssText) {\n  this.cssText = cssText;\n};\n\n\n/**\n * Reset the properties on the original field element to how it was before\n * it was made editable.\n */\ngoog.editor.Field.prototype.resetOriginalElemProperties = function() {\n  var field = this.getOriginalElement();\n  field.removeAttribute('contentEditable');\n  field.removeAttribute('g_editable');\n  field.removeAttribute('role');\n\n  if (!this.id) {\n    field.removeAttribute('id');\n  } else {\n    field.id = this.id;\n  }\n\n  field.className = this.savedClassName_ || '';\n\n  var cssText = this.cssText;\n  if (!cssText) {\n    field.removeAttribute('style');\n  } else {\n    goog.dom.setProperties(field, {'style': cssText});\n  }\n\n  if (typeof (this.originalFieldLineHeight_) === 'string') {\n    goog.style.setStyle(field, 'lineHeight', this.originalFieldLineHeight_);\n    this.originalFieldLineHeight_ = null;\n  }\n};\n\n\n/**\n * Checks the modified state of the field.\n * Note: Changes that take place while the goog.editor.Field.EventType.CHANGE\n * event is stopped do not effect the modified state.\n * @param {boolean=} opt_useIsEverModified Set to true to check if the field\n *   has ever been modified since it was created, otherwise checks if the field\n *   has been modified since the last goog.editor.Field.EventType.DELAYEDCHANGE\n *   event was dispatched.\n * @return {boolean} Whether the field has been modified.\n */\ngoog.editor.Field.prototype.isModified = function(opt_useIsEverModified) {\n  return opt_useIsEverModified ? this.isEverModified_ : this.isModified_;\n};\n\n\n/**\n * Number of milliseconds after a change when the change event should be fired.\n * @type {number}\n */\ngoog.editor.Field.CHANGE_FREQUENCY = 15;\n\n\n/**\n * Number of milliseconds between delayed change events.\n * @type {number}\n */\ngoog.editor.Field.DELAYED_CHANGE_FREQUENCY = 250;\n\n\n/**\n * @return {boolean} Whether the field is implemented as an iframe.\n */\ngoog.editor.Field.prototype.usesIframe = goog.functions.TRUE;\n\n\n/**\n * @return {boolean} Whether the field should be rendered with a fixed\n *     height, or should expand to fit its contents.\n */\ngoog.editor.Field.prototype.isFixedHeight = goog.functions.TRUE;\n\n\n/**\n * @return {boolean} Whether the field should be refocused on input.\n *    This is a workaround for the iOS bug that text input doesn't work\n *    when the main window listens touch events.\n */\ngoog.editor.Field.prototype.shouldRefocusOnInputMobileSafari =\n    goog.functions.FALSE;\n\n\n/**\n * Map of keyCodes (not charCodes) that cause changes in the field contents.\n * @type {Object}\n * @private\n */\ngoog.editor.Field.KEYS_CAUSING_CHANGES_ = {\n  46: true,  // DEL\n  8: true    // BACKSPACE\n};\n\nif (!goog.userAgent.IE) {\n  // Only IE doesn't change the field by default upon tab.\n  // TODO(user): This really isn't right now that we have tab plugins.\n  goog.editor.Field.KEYS_CAUSING_CHANGES_[9] = true;  // TAB\n}\n\n\n/**\n * Map of keyCodes (not charCodes) that when used in conjunction with the\n * Ctrl key cause changes in the field contents. These are the keys that are\n * not handled by basic formatting trogedit plugins.\n * @type {Object}\n * @private\n */\ngoog.editor.Field.CTRL_KEYS_CAUSING_CHANGES_ = {\n  86: true,  // V\n  88: true   // X\n};\n\nif (goog.userAgent.WINDOWS && !goog.userAgent.GECKO) {\n  // In IE and Webkit, input from IME (Input Method Editor) does not generate a\n  // keypress event so we have to rely on the keydown event. This way we have\n  // false positives while the user is using keyboard to select the\n  // character to input, but it is still better than the false negatives\n  // that ignores user's final input at all.\n  goog.editor.Field.KEYS_CAUSING_CHANGES_[229] = true;  // from IME;\n}\n\n\n/**\n * Returns true if the keypress generates a change in contents.\n * @param {goog.events.BrowserEvent} e The event.\n * @param {boolean} testAllKeys True to test for all types of generating keys.\n *     False to test for only the keys found in\n *     goog.editor.Field.KEYS_CAUSING_CHANGES_.\n * @return {boolean} Whether the keypress generates a change in contents.\n * @private\n */\ngoog.editor.Field.isGeneratingKey_ = function(e, testAllKeys) {\n  if (goog.editor.Field.isSpecialGeneratingKey_(e)) {\n    return true;\n  }\n\n  return !!(\n      testAllKeys && !(e.ctrlKey || e.metaKey) &&\n      (!goog.userAgent.GECKO || e.charCode));\n};\n\n\n/**\n * Returns true if the keypress generates a change in the contents.\n * due to a special key listed in goog.editor.Field.KEYS_CAUSING_CHANGES_\n * @param {goog.events.BrowserEvent} e The event.\n * @return {boolean} Whether the keypress generated a change in the contents.\n * @private\n */\ngoog.editor.Field.isSpecialGeneratingKey_ = function(e) {\n  var testCtrlKeys = (e.ctrlKey || e.metaKey) &&\n      e.keyCode in goog.editor.Field.CTRL_KEYS_CAUSING_CHANGES_;\n  var testRegularKeys = !(e.ctrlKey || e.metaKey) &&\n      e.keyCode in goog.editor.Field.KEYS_CAUSING_CHANGES_;\n\n  return testCtrlKeys || testRegularKeys;\n};\n\n\n/**\n * Sets the application window.\n * @param {!Window} appWindow The window where dialogs and bubbles should be\n *     rendered.\n */\ngoog.editor.Field.prototype.setAppWindow = function(appWindow) {\n  this.appWindow_ = appWindow;\n};\n\n\n/**\n * Returns the \"application\" window, where dialogs and bubbles\n * should be rendered.\n * @return {!Window} The window.\n */\ngoog.editor.Field.prototype.getAppWindow = function() {\n  return this.appWindow_;\n};\n\n\n/**\n * Sets the zIndex that the field should be based off of.\n * TODO(user): Get rid of this completely.  Here for Sites.\n *     Should this be set directly on UI plugins?\n *\n * @param {number} zindex The base zIndex of the editor.\n */\ngoog.editor.Field.prototype.setBaseZindex = function(zindex) {\n  this.baseZindex_ = zindex;\n};\n\n\n/**\n * Returns the zindex of the base level of the field.\n *\n * @return {number} The base zindex of the editor.\n */\ngoog.editor.Field.prototype.getBaseZindex = function() {\n  return this.baseZindex_ || 0;\n};\n\n\n/**\n * Sets up the field object and window util of this field, and enables this\n * editable field with all registered plugins.\n * This is essential to the initialization of the field.\n * It must be called when the field becomes fully loaded and editable.\n * @param {Element} field The field property.\n * @protected\n */\ngoog.editor.Field.prototype.setupFieldObject = function(field) {\n  this.loadState_ = goog.editor.Field.LoadState_.EDITABLE;\n  this.field = field;\n  this.editableDomHelper = goog.dom.getDomHelper(field);\n  this.isModified_ = false;\n  this.isEverModified_ = false;\n  field.setAttribute('g_editable', 'true');\n  goog.a11y.aria.setRole(field, goog.a11y.aria.Role.TEXTBOX);\n};\n\n\n/**\n * Help make the field not editable by setting internal data structures to null,\n * and disabling this field with all registered plugins.\n * @private\n */\ngoog.editor.Field.prototype.tearDownFieldObject_ = function() {\n  this.loadState_ = goog.editor.Field.LoadState_.UNEDITABLE;\n\n  for (var classId in this.plugins_) {\n    var plugin = this.plugins_[classId];\n    if (!plugin.activeOnUneditableFields()) {\n      plugin.disable(this);\n    }\n  }\n\n  this.field = null;\n  this.editableDomHelper = null;\n};\n\n\n/**\n * Initialize listeners on the field.\n * @private\n */\ngoog.editor.Field.prototype.setupChangeListeners_ = function() {\n  if ((goog.userAgent.product.IPHONE || goog.userAgent.product.IPAD) &&\n      this.usesIframe() && this.shouldRefocusOnInputMobileSafari()) {\n    // This is a workaround for the iOS bug that text input doesn't work\n    // when the main window listens touch events.\n    var editWindow = this.getEditableDomHelper().getWindow();\n    this.boundRefocusListenerMobileSafari_ =\n        goog.bind(editWindow.focus, editWindow);\n    editWindow.addEventListener(\n        goog.events.EventType.KEYDOWN, this.boundRefocusListenerMobileSafari_,\n        false);\n    editWindow.addEventListener(\n        goog.events.EventType.TOUCHEND, this.boundRefocusListenerMobileSafari_,\n        false);\n  }\n  if (goog.userAgent.OPERA && this.usesIframe()) {\n    // We can't use addListener here because we need to listen on the window,\n    // and removing listeners on window objects from the event register throws\n    // an exception if the window is closed.\n    this.boundFocusListenerOpera_ =\n        goog.bind(this.dispatchFocusAndBeforeFocus_, this);\n    this.boundBlurListenerOpera_ = goog.bind(this.dispatchBlur, this);\n    var editWindow = this.getEditableDomHelper().getWindow();\n    editWindow.addEventListener(\n        goog.events.EventType.FOCUS, this.boundFocusListenerOpera_, false);\n    editWindow.addEventListener(\n        goog.events.EventType.BLUR, this.boundBlurListenerOpera_, false);\n  } else {\n    if (goog.editor.BrowserFeature.SUPPORTS_FOCUSIN) {\n      this.addListener(goog.events.EventType.FOCUS, this.dispatchFocus_);\n      this.addListener(\n          goog.events.EventType.FOCUSIN, this.dispatchBeforeFocus_);\n    } else {\n      this.addListener(\n          goog.events.EventType.FOCUS, this.dispatchFocusAndBeforeFocus_);\n    }\n    this.addListener(\n        goog.events.EventType.BLUR, this.dispatchBlur,\n        goog.editor.BrowserFeature.USE_MUTATION_EVENTS);\n  }\n\n  if (goog.editor.BrowserFeature.USE_MUTATION_EVENTS) {\n    // Ways to detect changes in Mozilla:\n    //\n    // keypress - check event.charCode (only typable characters has a\n    //            charCode), but also keyboard commands lile Ctrl+C will\n    //            return a charCode.\n    // dragdrop - fires when the user drops something. This does not necessary\n    //            lead to a change but we cannot detect if it will or not\n    //\n    // Known Issues: We cannot detect cut and paste using menus\n    //               We cannot detect when someone moves something out of the\n    //               field using drag and drop.\n    //\n    this.setupMutationEventHandlersGecko();\n  } else {\n    // Ways to detect that a change is about to happen in other browsers.\n    // (IE and Safari have these events. Opera appears to work, but we haven't\n    //  researched it.)\n    //\n    // onbeforepaste\n    // onbeforecut\n    // ondrop - happens when the user drops something on the editable text\n    //          field the value at this time does not contain the dropped text\n    // ondragleave - when the user drags something from the current document.\n    //               This might not cause a change if the action was copy\n    //               instead of move\n    // onkeypress - IE only fires keypress events if the key will generate\n    //              output. It will not trigger for delete and backspace\n    // onkeydown - For delete and backspace\n    //\n    // known issues: IE triggers beforepaste just by opening the edit menu\n    //               delete at the end should not cause beforechange\n    //               backspace at the beginning should not cause beforechange\n    //               see above in ondragleave\n    // TODO(user): Why don't we dispatchBeforeChange from the\n    // handleDrop event for all browsers?\n    this.addListener(\n        ['beforecut', 'beforepaste', 'drop', 'dragend'],\n        this.dispatchBeforeChange);\n    this.addListener(\n        ['cut', 'paste'], goog.functions.lock(this.dispatchChange));\n    this.addListener('drop', this.handleDrop_);\n  }\n\n  // TODO(user): Figure out why we use dragend vs dragdrop and\n  // document this better.\n  var dropEventName = goog.userAgent.WEBKIT ? 'dragend' : 'dragdrop';\n  this.addListener(dropEventName, this.handleDrop_);\n\n  this.addListener(goog.events.EventType.KEYDOWN, this.handleKeyDown_);\n  this.addListener(goog.events.EventType.KEYPRESS, this.handleKeyPress_);\n  this.addListener(goog.events.EventType.KEYUP, this.handleKeyUp_);\n\n  this.selectionChangeTimer_ = new goog.async.Delay(\n      this.handleSelectionChangeTimer_,\n      goog.editor.Field.SELECTION_CHANGE_FREQUENCY_, this);\n\n  if (this.followLinkInNewWindow_) {\n    this.addListener(\n        goog.events.EventType.CLICK, goog.editor.Field.cancelLinkClick_);\n  }\n\n  this.addListener(goog.events.EventType.MOUSEDOWN, this.handleMouseDown_);\n  if (this.useWindowMouseUp_) {\n    this.eventRegister.listen(\n        this.editableDomHelper.getDocument(), goog.events.EventType.MOUSEUP,\n        this.handleMouseUp_);\n    this.addListener(goog.events.EventType.DRAGSTART, this.handleDragStart_);\n  } else {\n    this.addListener(goog.events.EventType.MOUSEUP, this.handleMouseUp_);\n  }\n};\n\n\n/**\n * Frequency to check for selection changes.\n * @type {number}\n * @private\n */\ngoog.editor.Field.SELECTION_CHANGE_FREQUENCY_ = 250;\n\n\n/**\n * Stops all listeners and timers.\n * @protected\n */\ngoog.editor.Field.prototype.clearListeners = function() {\n  if (this.eventRegister) {\n    this.eventRegister.removeAll();\n  }\n\n  if ((goog.userAgent.product.IPHONE || goog.userAgent.product.IPAD) &&\n      this.usesIframe() && this.shouldRefocusOnInputMobileSafari()) {\n    try {\n      var editWindow = this.getEditableDomHelper().getWindow();\n      editWindow.removeEventListener(\n          goog.events.EventType.KEYDOWN, this.boundRefocusListenerMobileSafari_,\n          false);\n      editWindow.removeEventListener(\n          goog.events.EventType.TOUCHEND,\n          this.boundRefocusListenerMobileSafari_, false);\n    } catch (e) {\n      // The editWindow no longer exists, or has been navigated to a different-\n      // origin URL. Either way, the event listeners have already been removed\n      // for us.\n    }\n    delete this.boundRefocusListenerMobileSafari_;\n  }\n  if (goog.userAgent.OPERA && this.usesIframe()) {\n    try {\n      var editWindow = this.getEditableDomHelper().getWindow();\n      editWindow.removeEventListener(\n          goog.events.EventType.FOCUS, this.boundFocusListenerOpera_, false);\n      editWindow.removeEventListener(\n          goog.events.EventType.BLUR, this.boundBlurListenerOpera_, false);\n    } catch (e) {\n      // The editWindow no longer exists, or has been navigated to a different-\n      // origin URL. Either way, the event listeners have already been removed\n      // for us.\n    }\n    delete this.boundFocusListenerOpera_;\n    delete this.boundBlurListenerOpera_;\n  }\n\n  if (this.changeTimerGecko_) {\n    this.changeTimerGecko_.stop();\n  }\n  this.delayedChangeTimer_.stop();\n};\n\n\n/** @override */\ngoog.editor.Field.prototype.disposeInternal = function() {\n  if (this.isLoading() || this.isLoaded()) {\n    goog.log.warning(this.logger, 'Disposing a field that is in use.');\n  }\n\n  if (this.getOriginalElement()) {\n    this.execCommand(goog.editor.Command.CLEAR_LOREM);\n  }\n\n  this.tearDownFieldObject_();\n  this.clearListeners();\n  this.clearFieldLoadListener_();\n  this.originalDomHelper = null;\n\n  if (this.eventRegister) {\n    this.eventRegister.dispose();\n    this.eventRegister = null;\n  }\n\n  this.removeAllWrappers();\n\n  if (goog.editor.Field.getActiveFieldId() == this.id) {\n    goog.editor.Field.setActiveFieldId(null);\n  }\n\n  for (var classId in this.plugins_) {\n    var plugin = this.plugins_[classId];\n    if (plugin.isAutoDispose()) {\n      plugin.dispose();\n    }\n  }\n  delete (this.plugins_);\n\n  goog.editor.Field.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * Attach an wrapper to this field, to be thrown out when the field\n * is disposed.\n * @param {goog.Disposable} wrapper The wrapper to attach.\n */\ngoog.editor.Field.prototype.attachWrapper = function(wrapper) {\n  this.wrappers_.push(wrapper);\n};\n\n\n/**\n * Removes all wrappers and destroys them.\n */\ngoog.editor.Field.prototype.removeAllWrappers = function() {\n  var wrapper;\n  while (wrapper = this.wrappers_.pop()) {\n    wrapper.dispose();\n  }\n};\n\n\n/**\n * Sets whether activating a hyperlink in this editable field will open a new\n *     window or not.\n * @param {boolean} followLinkInNewWindow\n */\ngoog.editor.Field.prototype.setFollowLinkInNewWindow = function(\n    followLinkInNewWindow) {\n  this.followLinkInNewWindow_ = followLinkInNewWindow;\n};\n\n\n/**\n * List of mutation events in Gecko browsers.\n * @type {Array<string>}\n * @protected\n */\ngoog.editor.Field.MUTATION_EVENTS_GECKO = [\n  'DOMNodeInserted', 'DOMNodeRemoved', 'DOMNodeRemovedFromDocument',\n  'DOMNodeInsertedIntoDocument', 'DOMCharacterDataModified'\n];\n\n\n/**\n * Mutation events tell us when something has changed for mozilla.\n * @protected\n */\ngoog.editor.Field.prototype.setupMutationEventHandlersGecko = function() {\n  // Always use DOMSubtreeModified on Gecko when not using an iframe so that\n  // DOM mutations outside the Field do not trigger handleMutationEventGecko_.\n  if (goog.editor.BrowserFeature.HAS_DOM_SUBTREE_MODIFIED_EVENT ||\n      !this.usesIframe()) {\n    this.eventRegister.listen(\n        this.getElement(), 'DOMSubtreeModified',\n        this.handleMutationEventGecko_);\n  } else {\n    var doc = this.getEditableDomHelper().getDocument();\n    this.eventRegister.listen(\n        doc, goog.editor.Field.MUTATION_EVENTS_GECKO,\n        this.handleMutationEventGecko_, true);\n\n    // DOMAttrModified fires for a lot of events we want to ignore.  This goes\n    // through a different handler so that we can ignore many of these.\n    this.eventRegister.listen(\n        doc, 'DOMAttrModified',\n        goog.bind(\n            this.handleDomAttrChange, this, this.handleMutationEventGecko_),\n        true);\n  }\n};\n\n\n/**\n * Handle before change key events and fire the beforetab event if appropriate.\n * This needs to happen on keydown in IE and keypress in FF.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @return {boolean} Whether to still perform the default key action.  Only set\n *     to true if the actual event has already been canceled.\n * @private\n */\ngoog.editor.Field.prototype.handleBeforeChangeKeyEvent_ = function(e) {\n  // There are two reasons to block a key:\n  var block =\n      // #1: to intercept a tab\n      // TODO: possibly don't allow clients to intercept tabs outside of LIs and\n      // maybe tables as well?\n      (e.keyCode == goog.events.KeyCodes.TAB && !this.dispatchBeforeTab_(e)) ||\n      // #2: to block a Firefox-specific bug where Macs try to navigate\n      // back a page when you hit command+left arrow or comamnd-right arrow.\n      // See https://bugzilla.mozilla.org/show_bug.cgi?id=341886\n      // This was fixed in Firefox 29, but still exists in older versions.\n      (goog.userAgent.GECKO && e.metaKey &&\n       !goog.userAgent.isVersionOrHigher(29) &&\n       (e.keyCode == goog.events.KeyCodes.LEFT ||\n        e.keyCode == goog.events.KeyCodes.RIGHT));\n\n  if (block) {\n    e.preventDefault();\n    return false;\n  } else {\n    // In Gecko we have both keyCode and charCode. charCode is for human\n    // readable characters like a, b and c. However pressing ctrl+c and so on\n    // also causes charCode to be set.\n\n    // TODO(arv): Del at end of field or backspace at beginning should be\n    // ignored.\n    this.gotGeneratingKey_ = e.charCode ||\n        goog.editor.Field.isGeneratingKey_(e, goog.userAgent.GECKO);\n    if (this.gotGeneratingKey_) {\n      this.dispatchBeforeChange();\n      // TODO(robbyw): Should we return the value of the above?\n    }\n  }\n\n  return true;\n};\n\n\n/**\n * Keycodes that result in a selectionchange event (e.g. the cursor moving).\n * @type {!Object<number, number>}\n */\ngoog.editor.Field.SELECTION_CHANGE_KEYCODES = {\n  8: 1,   // backspace\n  9: 1,   // tab\n  13: 1,  // enter\n  33: 1,  // page up\n  34: 1,  // page down\n  35: 1,  // end\n  36: 1,  // home\n  37: 1,  // left\n  38: 1,  // up\n  39: 1,  // right\n  40: 1,  // down\n  46: 1   // delete\n};\n\n\n/**\n * Map of keyCodes (not charCodes) that when used in conjunction with the\n * Ctrl key cause selection changes in the field contents. These are the keys\n * that are not handled by the basic formatting trogedit plugins. Note that\n * combinations like Ctrl-left etc are already handled in\n * SELECTION_CHANGE_KEYCODES\n * @type {Object}\n * @private\n */\ngoog.editor.Field.CTRL_KEYS_CAUSING_SELECTION_CHANGES_ = {\n  65: true,  // A\n  86: true,  // V\n  88: true   // X\n};\n\n\n/**\n * Map of keyCodes (not charCodes) that might need to be handled as a keyboard\n * shortcut (even when ctrl/meta key is not pressed) by some plugin. Currently\n * it is a small list. If it grows too big we can optimize it by using ranges\n * or extending it from SELECTION_CHANGE_KEYCODES\n * @type {Object}\n * @private\n */\ngoog.editor.Field.POTENTIAL_SHORTCUT_KEYCODES_ = {\n  8: 1,   // backspace\n  9: 1,   // tab\n  13: 1,  // enter\n  27: 1,  // esc\n  33: 1,  // page up\n  34: 1,  // page down\n  37: 1,  // left\n  38: 1,  // up\n  39: 1,  // right\n  40: 1   // down\n};\n\n\n/**\n * Calls all the plugins of the given operation, in sequence, with the\n * given arguments. This is short-circuiting: once one plugin cancels\n * the event, no more plugins will be invoked.\n * @param {goog.editor.PluginImpl.Op} op A plugin op.\n * @param {...*} var_args The arguments to the plugin.\n * @return {boolean} True if one of the plugins cancel the event, false\n *    otherwise.\n * @private\n */\ngoog.editor.Field.prototype.invokeShortCircuitingOp_ = function(op, var_args) {\n  var plugins = this.indexedPlugins_[op];\n  var argList = goog.array.slice(arguments, 1);\n  for (var i = 0; i < plugins.length; ++i) {\n    // If the plugin returns true, that means it handled the event and\n    // we shouldn't propagate to the other plugins.\n    var plugin = plugins[i];\n    if ((plugin.isEnabled(this) ||\n         goog.editor.PluginImpl.IRREPRESSIBLE_OPS[op]) &&\n        plugin[goog.editor.PluginImpl.OPCODE[op]].apply(plugin, argList)) {\n      // Only one plugin is allowed to handle the event. If for some reason\n      // a plugin wants to handle it and still allow other plugins to handle\n      // it, it shouldn't return true.\n      return true;\n    }\n  }\n\n  return false;\n};\n\n\n/**\n * Invoke this operation on all plugins with the given arguments.\n * @param {!goog.editor.PluginImpl.Op} op A plugin op.\n * @param {...*} var_args The arguments to the plugin.\n * @private\n */\ngoog.editor.Field.prototype.invokeOp_ = function(op, var_args) {\n  var plugins = this.indexedPlugins_[op];\n  var argList = goog.array.slice(arguments, 1);\n  for (var i = 0; i < plugins.length; ++i) {\n    var plugin = plugins[i];\n    if (plugin.isEnabled(this) ||\n        goog.editor.PluginImpl.IRREPRESSIBLE_OPS[op]) {\n      plugin[goog.editor.PluginImpl.OPCODE[op]].apply(plugin, argList);\n    }\n  }\n};\n\n\n/**\n * Reduce this argument over all plugins. The result of each plugin invocation\n * will be passed to the next plugin invocation. See goog.array.reduce.\n * @param {goog.editor.PluginImpl.Op} op A plugin op.\n * @param {string} arg The argument to reduce. For now, we assume it's a\n *     string, but we should widen this later if there are reducing\n *     plugins that don't operate on strings.\n * @param {...*} var_args Any extra arguments to pass to the plugin. These args\n *     will not be reduced.\n * @return {string} The reduced argument.\n * @private\n */\ngoog.editor.Field.prototype.reduceOp_ = function(op, arg, var_args) {\n  var plugins = this.indexedPlugins_[op];\n  var argList = goog.array.slice(arguments, 1);\n  for (var i = 0; i < plugins.length; ++i) {\n    var plugin = plugins[i];\n    if (plugin.isEnabled(this) ||\n        goog.editor.PluginImpl.IRREPRESSIBLE_OPS[op]) {\n      argList[0] =\n          plugin[goog.editor.PluginImpl.OPCODE[op]].apply(plugin, argList);\n    }\n  }\n  return argList[0];\n};\n\n\n/**\n * Prepare the given contents, then inject them into the editable field.\n * @param {?string} contents The contents to prepare.\n * @param {Element} field The field element.\n * @protected\n */\ngoog.editor.Field.prototype.injectContents = function(contents, field) {\n  var styles = {};\n  var newHtml = this.getInjectableContents(contents, styles);\n  goog.style.setStyle(field, styles);\n  goog.editor.node.replaceInnerHtml(field, newHtml);\n};\n\n\n/**\n * Returns prepared contents that can be injected into the editable field.\n * @param {?string} contents The contents to prepare.\n * @param {Object} styles A map that will be populated with styles that should\n *     be applied to the field element together with the contents.\n * @return {string} The prepared contents.\n */\ngoog.editor.Field.prototype.getInjectableContents = function(contents, styles) {\n  return this.reduceOp_(\n      goog.editor.PluginImpl.Op.PREPARE_CONTENTS_HTML, contents || '', styles);\n};\n\n\n/**\n * Handles keydown on the field.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.editor.Field.prototype.handleKeyDown_ = function(e) {\n  // Mac only fires Cmd+A for keydown, not keyup: b/22407515.\n  if (goog.userAgent.MAC && e.keyCode == goog.events.KeyCodes.A) {\n    this.maybeStartSelectionChangeTimer_(e);\n  }\n\n  if (!goog.editor.BrowserFeature.USE_MUTATION_EVENTS) {\n    if (!this.handleBeforeChangeKeyEvent_(e)) {\n      return;\n    }\n  }\n\n  if (!this.invokeShortCircuitingOp_(goog.editor.PluginImpl.Op.KEYDOWN, e) &&\n      goog.editor.BrowserFeature.USES_KEYDOWN) {\n    this.handleKeyboardShortcut_(e);\n  }\n};\n\n\n/**\n * Handles keypress on the field.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.editor.Field.prototype.handleKeyPress_ = function(e) {\n  if (goog.editor.BrowserFeature.USE_MUTATION_EVENTS) {\n    if (!this.handleBeforeChangeKeyEvent_(e)) {\n      return;\n    }\n  } else {\n    // In IE only keys that generate output trigger keypress\n    // In Mozilla charCode is set for keys generating content.\n    this.gotGeneratingKey_ = true;\n    this.dispatchBeforeChange();\n  }\n\n  if (!this.invokeShortCircuitingOp_(goog.editor.PluginImpl.Op.KEYPRESS, e) &&\n      !goog.editor.BrowserFeature.USES_KEYDOWN) {\n    this.handleKeyboardShortcut_(e);\n  }\n};\n\n\n/**\n * Handles keyup on the field.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.editor.Field.prototype.handleKeyUp_ = function(e) {\n  if (!goog.editor.BrowserFeature.USE_MUTATION_EVENTS &&\n      (this.gotGeneratingKey_ ||\n       goog.editor.Field.isSpecialGeneratingKey_(e))) {\n    // The special keys won't have set the gotGeneratingKey flag, so we check\n    // for them explicitly\n    this.handleChange();\n  }\n\n  this.invokeShortCircuitingOp_(goog.editor.PluginImpl.Op.KEYUP, e);\n  this.maybeStartSelectionChangeTimer_(e);\n};\n\n\n/**\n * Fires `BEFORESELECTIONCHANGE` and starts the selection change timer\n * (which will fire `SELECTIONCHANGE`) if the given event is a key event\n * that causes a selection change.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.editor.Field.prototype.maybeStartSelectionChangeTimer_ = function(e) {\n  if (this.isEventStopped(goog.editor.Field.EventType.SELECTIONCHANGE)) {\n    return;\n  }\n\n  if (goog.editor.Field.SELECTION_CHANGE_KEYCODES[e.keyCode] ||\n      ((e.ctrlKey || e.metaKey) &&\n       goog.editor.Field.CTRL_KEYS_CAUSING_SELECTION_CHANGES_[e.keyCode])) {\n    this.dispatchEvent(goog.editor.Field.EventType.BEFORESELECTIONCHANGE);\n    this.selectionChangeTimer_.start();\n  }\n};\n\n\n/**\n * Handles keyboard shortcuts on the field.  Note that we bake this into our\n * handleKeyPress/handleKeyDown rather than using goog.events.KeyHandler or\n * goog.ui.KeyboardShortcutHandler for performance reasons.  Since these\n * are handled on every key stroke, we do not want to be going out to the\n * event system every time.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.editor.Field.prototype.handleKeyboardShortcut_ = function(e) {\n  // Alt key is used for i18n languages to enter certain characters. like\n  // control + alt + z (used for IMEs) and control + alt + s for Polish.\n  // So we only invoke handleKeyboardShortcut for alt + shift only.\n  if (e.altKey && !e.shiftKey) {\n    return;\n  }\n  // TODO(user): goog.events.KeyHandler uses much more complicated logic\n  // to determine key.  Consider changing to what they do.\n  var key = e.charCode || e.keyCode;\n  var stringKey = String.fromCharCode(key).toLowerCase();\n  var isPrimaryModifierPressed = goog.userAgent.MAC ? e.metaKey : e.ctrlKey;\n  var isAltShiftPressed = e.altKey && e.shiftKey;\n  if (isPrimaryModifierPressed || isAltShiftPressed ||\n      goog.editor.Field.POTENTIAL_SHORTCUT_KEYCODES_[e.keyCode]) {\n    if (key == 17) {  // Ctrl key\n      // In IE and Webkit pressing Ctrl key itself results in this event.\n      return;\n    }\n\n    // Ctrl+Cmd+Space generates a charCode for a backtick on Mac Firefox, but\n    // has the correct string key in the browser event.\n    if (goog.userAgent.MAC && goog.userAgent.GECKO && stringKey == '`' &&\n        e.getBrowserEvent().key == ' ') {\n      stringKey = ' ';\n    }\n    // Converting the keyCode for \"\\\" using fromCharCode creates \"u\", so we need\n    // to look out for it specifically.\n    if (e.keyCode == goog.events.KeyCodes.BACKSLASH) {\n      stringKey = '\\\\';\n    }\n\n    if (this.invokeShortCircuitingOp_(\n            goog.editor.PluginImpl.Op.SHORTCUT, e, stringKey,\n            isPrimaryModifierPressed)) {\n      e.preventDefault();\n      // We don't call stopPropagation as some other handler outside of\n      // trogedit might need it.\n    }\n  }\n};\n\n\n/**\n * Executes an editing command as per the registered plugins.\n * @param {string} command The command to execute.\n * @param {...*} var_args Any additional parameters needed to execute the\n *     command.\n * @return {*} False if the command wasn't handled, otherwise, the result of\n *     the command.\n */\ngoog.editor.Field.prototype.execCommand = function(command, var_args) {\n  var args = arguments;\n  var result;\n\n  var plugins = this.indexedPlugins_[goog.editor.PluginImpl.Op.EXEC_COMMAND];\n  for (var i = 0; i < plugins.length; ++i) {\n    // If the plugin supports the command, that means it handled the\n    // event and we shouldn't propagate to the other plugins.\n    var plugin = plugins[i];\n    if (plugin.isEnabled(this) && plugin.isSupportedCommand(command)) {\n      result = plugin.execCommand.apply(plugin, args);\n      break;\n    }\n  }\n\n  return result;\n};\n\n\n/**\n * Gets the value of command(s).\n * @param {string|Array<string>} commands String name(s) of the command.\n * @return {*} Value of each command. Returns false (or array of falses)\n *     if designMode is off or the field is otherwise uneditable, and\n *     there are no activeOnUneditable plugins for the command.\n */\ngoog.editor.Field.prototype.queryCommandValue = function(commands) {\n  var isEditable = this.isLoaded() && this.isSelectionEditable();\n  if (typeof commands === 'string') {\n    return this.queryCommandValueInternal_(commands, isEditable);\n  } else {\n    var state = {};\n    for (var i = 0; i < commands.length; i++) {\n      state[commands[i]] =\n          this.queryCommandValueInternal_(commands[i], isEditable);\n    }\n    return state;\n  }\n};\n\n\n/**\n * Gets the value of this command.\n * @param {string} command The command to check.\n * @param {boolean} isEditable Whether the field is currently editable.\n * @return {*} The state of this command. Null if not handled.\n *     False if the field is uneditable and there are no handlers for\n *     uneditable commands.\n * @private\n */\ngoog.editor.Field.prototype.queryCommandValueInternal_ = function(\n    command, isEditable) {\n  var plugins = this.indexedPlugins_[goog.editor.PluginImpl.Op.QUERY_COMMAND];\n  for (var i = 0; i < plugins.length; ++i) {\n    var plugin = plugins[i];\n    if (plugin.isEnabled(this) && plugin.isSupportedCommand(command) &&\n        (isEditable || plugin.activeOnUneditableFields())) {\n      return plugin.queryCommandValue(command);\n    }\n  }\n  return isEditable ? null : false;\n};\n\n\n/**\n * Fires a change event only if the attribute change effects the editiable\n * field. We ignore events that are internal browser events (ie scrollbar\n * state change)\n * @param {Function} handler The function to call if this is not an internal\n *     browser event.\n * @param {goog.events.BrowserEvent} browserEvent The browser event.\n * @protected\n */\ngoog.editor.Field.prototype.handleDomAttrChange = function(\n    handler, browserEvent) {\n  if (this.isEventStopped(goog.editor.Field.EventType.CHANGE)) {\n    return;\n  }\n\n  var e = browserEvent.getBrowserEvent();\n\n  // For XUL elements, since we don't care what they are doing\n  try {\n    if (e.originalTarget.prefix ||\n        /** @type {!Element} */ (e.originalTarget).nodeName == 'scrollbar') {\n      return;\n    }\n  } catch (ex1) {\n    // Some XUL nodes don't like you reading their properties.  If we got\n    // the exception, this implies  a XUL node so we can return.\n    return;\n  }\n\n  // Check if prev and new values are different, sometimes this fires when\n  // nothing has really changed.\n  if (e.prevValue == e.newValue) {\n    return;\n  }\n  handler.call(this, e);\n};\n\n\n/**\n * Handle a mutation event.\n * @param {goog.events.BrowserEvent|Event} e The browser event.\n * @private\n */\ngoog.editor.Field.prototype.handleMutationEventGecko_ = function(e) {\n  if (this.isEventStopped(goog.editor.Field.EventType.CHANGE)) {\n    return;\n  }\n\n  e = e.getBrowserEvent ? e.getBrowserEvent() : e;\n  // For people with firebug, firebug sets this property on elements it is\n  // inserting into the dom.\n  if (e.target.firebugIgnore) {\n    return;\n  }\n\n  this.isModified_ = true;\n  this.isEverModified_ = true;\n  this.changeTimerGecko_.start();\n};\n\n\n/**\n * Handle drop events. Deal with focus/selection issues and set the document\n * as changed.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.editor.Field.prototype.handleDrop_ = function(e) {\n  if (goog.userAgent.IE) {\n    // TODO(user): This should really be done in the loremipsum plugin.\n    this.execCommand(goog.editor.Command.CLEAR_LOREM, true);\n  }\n\n  // TODO(user): I just moved this code to this location, but I wonder why\n  // it is only done for this case.  Investigate.\n  if (goog.editor.BrowserFeature.USE_MUTATION_EVENTS) {\n    this.dispatchFocusAndBeforeFocus_();\n  }\n\n  this.dispatchChange();\n};\n\n\n/**\n * @return {HTMLIFrameElement} The iframe that's body is editable.\n * @protected\n */\ngoog.editor.Field.prototype.getEditableIframe = function() {\n  var dh;\n  if (this.usesIframe() && (dh = this.getEditableDomHelper())) {\n    // If the iframe has been destroyed, the dh could still exist since the\n    // node may not be gc'ed, but fetching the window can fail.\n    var win = dh.getWindow();\n    return /** @type {HTMLIFrameElement} */ (win && win.frameElement);\n  }\n  return null;\n};\n\n\n/**\n * @return {goog.dom.DomHelper?} The dom helper for the editable node.\n */\ngoog.editor.Field.prototype.getEditableDomHelper = function() {\n  return this.editableDomHelper;\n};\n\n\n/**\n * @return {goog.dom.AbstractRange?} Closure range object wrapping the selection\n *     in this field or null if this field is not currently editable.\n */\ngoog.editor.Field.prototype.getRange = function() {\n  var win = this.editableDomHelper && this.editableDomHelper.getWindow();\n  return win && goog.dom.Range.createFromWindow(win);\n};\n\n\n/**\n * Dispatch a selection change event, optionally caused by the given browser\n * event or selecting the given target.\n * @param {goog.events.BrowserEvent=} opt_e Optional browser event causing this\n *     event.\n * @param {Node=} opt_target The node the selection changed to.\n */\ngoog.editor.Field.prototype.dispatchSelectionChangeEvent = function(\n    opt_e, opt_target) {\n  if (this.isEventStopped(goog.editor.Field.EventType.SELECTIONCHANGE)) {\n    return;\n  }\n\n  // The selection is editable only if the selection is inside the\n  // editable field.\n  var range = this.getRange();\n  var rangeContainer = range && range.getContainerElement();\n  this.isSelectionEditable_ =\n      !!rangeContainer && goog.dom.contains(this.getElement(), rangeContainer);\n\n  this.dispatchCommandValueChange();\n  this.dispatchEvent({\n    type: goog.editor.Field.EventType.SELECTIONCHANGE,\n    originalType: opt_e && opt_e.type\n  });\n\n  this.invokeShortCircuitingOp_(\n      goog.editor.PluginImpl.Op.SELECTION, opt_e, opt_target);\n};\n\n\n/**\n * Dispatch a selection change event using a browser event that was\n * asynchronously saved earlier.\n * @private\n */\ngoog.editor.Field.prototype.handleSelectionChangeTimer_ = function() {\n  var t = this.selectionChangeTarget_;\n  this.selectionChangeTarget_ = null;\n  this.dispatchSelectionChangeEvent(undefined, t);\n};\n\n\n/**\n * This dispatches the beforechange event on the editable field\n */\ngoog.editor.Field.prototype.dispatchBeforeChange = function() {\n  if (this.isEventStopped(goog.editor.Field.EventType.BEFORECHANGE)) {\n    return;\n  }\n\n  this.dispatchEvent(goog.editor.Field.EventType.BEFORECHANGE);\n};\n\n\n/**\n * This dispatches the beforetab event on the editable field. If this event is\n * cancelled, then the default tab behavior is prevented.\n * @param {goog.events.BrowserEvent} e The tab event.\n * @private\n * @return {boolean} The result of dispatchEvent.\n */\ngoog.editor.Field.prototype.dispatchBeforeTab_ = function(e) {\n  return this.dispatchEvent({\n    type: goog.editor.Field.EventType.BEFORETAB,\n    shiftKey: e.shiftKey,\n    altKey: e.altKey,\n    ctrlKey: e.ctrlKey\n  });\n};\n\n\n/**\n * Temporarily ignore change events. If the time has already been set, it will\n * fire immediately now.  Further setting of the timer is stopped and\n * dispatching of events is stopped until startChangeEvents is called.\n * @param {boolean=} opt_stopChange Whether to ignore base change events.\n * @param {boolean=} opt_stopDelayedChange Whether to ignore delayed change\n *     events.\n */\ngoog.editor.Field.prototype.stopChangeEvents = function(\n    opt_stopChange, opt_stopDelayedChange) {\n  if (opt_stopChange) {\n    if (this.changeTimerGecko_) {\n      this.changeTimerGecko_.fireIfActive();\n    }\n\n    this.stopEvent(goog.editor.Field.EventType.CHANGE);\n  }\n  if (opt_stopDelayedChange) {\n    this.clearDelayedChange();\n    this.stopEvent(goog.editor.Field.EventType.DELAYEDCHANGE);\n  }\n};\n\n\n/**\n * Start change events again and fire once if desired.\n * @param {boolean=} opt_fireChange Whether to fire the change event\n *      immediately.\n * @param {boolean=} opt_fireDelayedChange Whether to fire the delayed change\n *      event immediately.\n */\ngoog.editor.Field.prototype.startChangeEvents = function(\n    opt_fireChange, opt_fireDelayedChange) {\n\n  if (!opt_fireChange && this.changeTimerGecko_) {\n    // In the case where change events were stopped and we're not firing\n    // them on start, the user was trying to suppress all change or delayed\n    // change events. Clear the change timer now while the events are still\n    // stopped so that its firing doesn't fire a stopped change event, or\n    // queue up a delayed change event that we were trying to stop.\n    this.changeTimerGecko_.fireIfActive();\n  }\n\n  this.startEvent(goog.editor.Field.EventType.CHANGE);\n  this.startEvent(goog.editor.Field.EventType.DELAYEDCHANGE);\n  if (opt_fireChange) {\n    this.handleChange();\n  }\n\n  if (opt_fireDelayedChange) {\n    this.dispatchDelayedChange_();\n  }\n};\n\n\n/**\n * Stops the event of the given type from being dispatched.\n * @param {goog.editor.Field.EventType} eventType type of event to stop.\n */\ngoog.editor.Field.prototype.stopEvent = function(eventType) {\n  this.stoppedEvents_[eventType] = 1;\n};\n\n\n/**\n * Re-starts the event of the given type being dispatched, if it had\n * previously been stopped with stopEvent().\n * @param {goog.editor.Field.EventType} eventType type of event to start.\n */\ngoog.editor.Field.prototype.startEvent = function(eventType) {\n  // Toggling this bit on/off instead of deleting it/re-adding it\n  // saves array allocations.\n  this.stoppedEvents_[eventType] = 0;\n};\n\n\n/**\n * Block an event for a short amount of time. Intended\n * for the situation where an event pair fires in quick succession\n * (e.g., mousedown/mouseup, keydown/keyup, focus/blur),\n * and we want the second event in the pair to get \"debounced.\"\n *\n * WARNING: This should never be used to solve race conditions or for\n * mission-critical actions. It should only be used for UI improvements,\n * where it's okay if the behavior is non-deterministic.\n *\n * @param {goog.editor.Field.EventType} eventType type of event to debounce.\n */\ngoog.editor.Field.prototype.debounceEvent = function(eventType) {\n  this.debouncedEvents_[eventType] = goog.now();\n};\n\n\n/**\n * Checks if the event of the given type has stopped being dispatched\n * @param {goog.editor.Field.EventType} eventType type of event to check.\n * @return {boolean} true if the event has been stopped with stopEvent().\n * @protected\n */\ngoog.editor.Field.prototype.isEventStopped = function(eventType) {\n  return !!this.stoppedEvents_[eventType] ||\n      (this.debouncedEvents_[eventType] &&\n       (goog.now() - this.debouncedEvents_[eventType] <=\n        goog.editor.Field.DEBOUNCE_TIME_MS_));\n};\n\n\n/**\n * Calls a function to manipulate the dom of this field. This method should be\n * used whenever Trogedit clients need to modify the dom of the field, so that\n * delayed change events are handled appropriately. Extra delayed change events\n * will cause undesired states to be added to the undo-redo stack. This method\n * will always fire at most one delayed change event, depending on the value of\n * `opt_preventDelayedChange`.\n *\n * @param {function()} func The function to call that will manipulate the dom.\n * @param {boolean=} opt_preventDelayedChange Whether delayed change should be\n *      prevented after calling `func`. Defaults to always firing\n *      delayed change.\n * @param {Object=} opt_handler Object in whose scope to call the listener.\n */\ngoog.editor.Field.prototype.manipulateDom = function(\n    func, opt_preventDelayedChange, opt_handler) {\n\n  this.stopChangeEvents(true, true);\n  // We don't want any problems with the passed in function permanently\n  // stopping change events. That would break Trogedit.\n  try {\n    func.call(opt_handler);\n  } finally {\n    // If the field isn't loaded then change and delayed change events will be\n    // started as part of the onload behavior.\n    if (this.isLoaded()) {\n      // We assume that func always modified the dom and so fire a single change\n      // event. Delayed change is only fired if not prevented by the user.\n      if (opt_preventDelayedChange) {\n        this.startEvent(goog.editor.Field.EventType.CHANGE);\n        this.handleChange();\n        this.startEvent(goog.editor.Field.EventType.DELAYEDCHANGE);\n      } else {\n        this.dispatchChange();\n      }\n    }\n  }\n};\n\n\n/**\n * Dispatches a command value change event.\n * @param {Array<string>=} opt_commands Commands whose state has\n *     changed.\n */\ngoog.editor.Field.prototype.dispatchCommandValueChange = function(\n    opt_commands) {\n  if (opt_commands) {\n    this.dispatchEvent({\n      type: goog.editor.Field.EventType.COMMAND_VALUE_CHANGE,\n      commands: opt_commands\n    });\n  } else {\n    this.dispatchEvent(goog.editor.Field.EventType.COMMAND_VALUE_CHANGE);\n  }\n};\n\n\n/**\n * Dispatches the appropriate set of change events. This only fires\n * synchronous change events in blended-mode, iframe-using mozilla. It just\n * starts the appropriate timer for goog.editor.Field.EventType.DELAYEDCHANGE.\n * This also starts up change events again if they were stopped.\n *\n * @param {boolean=} opt_noDelay True if\n *      goog.editor.Field.EventType.DELAYEDCHANGE should be fired syncronously.\n */\ngoog.editor.Field.prototype.dispatchChange = function(opt_noDelay) {\n  this.startChangeEvents(true, opt_noDelay);\n};\n\n\n/**\n * Handle a change in the Editable Field.  Marks the field has modified,\n * dispatches the change event on the editable field (moz only), starts the\n * timer for the delayed change event.  Note that these actions only occur if\n * the proper events are not stopped.\n */\ngoog.editor.Field.prototype.handleChange = function() {\n  if (this.isEventStopped(goog.editor.Field.EventType.CHANGE)) {\n    return;\n  }\n\n  // Clear the changeTimerGecko_ if it's active, since any manual call to\n  // handle change is equiavlent to changeTimerGecko_.fire().\n  if (this.changeTimerGecko_) {\n    this.changeTimerGecko_.stop();\n  }\n\n  this.isModified_ = true;\n  this.isEverModified_ = true;\n\n  if (this.isEventStopped(goog.editor.Field.EventType.DELAYEDCHANGE)) {\n    return;\n  }\n\n  this.delayedChangeTimer_.start();\n};\n\n\n/**\n * Dispatch a delayed change event.\n * @private\n */\ngoog.editor.Field.prototype.dispatchDelayedChange_ = function() {\n  if (this.isEventStopped(goog.editor.Field.EventType.DELAYEDCHANGE)) {\n    return;\n  }\n  // Clear the delayedChangeTimer_ if it's active, since any manual call to\n  // dispatchDelayedChange_ is equivalent to delayedChangeTimer_.fire().\n  this.delayedChangeTimer_.stop();\n  this.isModified_ = false;\n  this.dispatchEvent(goog.editor.Field.EventType.DELAYEDCHANGE);\n};\n\n\n/**\n * Don't wait for the timer and just fire the delayed change event if it's\n * pending.\n */\ngoog.editor.Field.prototype.clearDelayedChange = function() {\n  // The changeTimerGecko_ will queue up a delayed change so to fully clear\n  // delayed change we must also clear this timer.\n  if (this.changeTimerGecko_) {\n    this.changeTimerGecko_.fireIfActive();\n  }\n  this.delayedChangeTimer_.fireIfActive();\n};\n\n\n/**\n * Dispatch beforefocus and focus for FF. Note that both of these actually\n * happen in the document's \"focus\" event. Unfortunately, we don't actually\n * have a way of getting in before the focus event in FF (boo! hiss!).\n * In IE, we use onfocusin for before focus and onfocus for focus.\n * @private\n */\ngoog.editor.Field.prototype.dispatchFocusAndBeforeFocus_ = function() {\n  this.dispatchBeforeFocus_();\n  this.dispatchFocus_();\n};\n\n\n/**\n * Dispatches a before focus event.\n * @private\n */\ngoog.editor.Field.prototype.dispatchBeforeFocus_ = function() {\n  if (this.isEventStopped(goog.editor.Field.EventType.BEFOREFOCUS)) {\n    return;\n  }\n\n  this.execCommand(goog.editor.Command.CLEAR_LOREM, true);\n  this.dispatchEvent(goog.editor.Field.EventType.BEFOREFOCUS);\n};\n\n\n/**\n * Dispatches a focus event.\n * @private\n */\ngoog.editor.Field.prototype.dispatchFocus_ = function() {\n  if (this.isEventStopped(goog.editor.Field.EventType.FOCUS)) {\n    return;\n  }\n  goog.editor.Field.setActiveFieldId(this.id);\n\n  this.isSelectionEditable_ = true;\n\n  this.dispatchEvent(goog.editor.Field.EventType.FOCUS);\n\n  if (goog.editor.BrowserFeature\n          .PUTS_CURSOR_BEFORE_FIRST_BLOCK_ELEMENT_ON_FOCUS) {\n    // If the cursor is at the beginning of the field, make sure that it is\n    // in the first user-visible line break, e.g.,\n    // no selection: <div><p>...</p></div> --> <div><p>|cursor|...</p></div>\n    // <div>|cursor|<p>...</p></div> --> <div><p>|cursor|...</p></div>\n    // <body>|cursor|<p>...</p></body> --> <body><p>|cursor|...</p></body>\n    var field = this.getElement();\n    var range = this.getRange();\n\n    if (range) {\n      var focusNode = /** @type {!Element} */ (range.getFocusNode());\n      if (range.getFocusOffset() == 0 &&\n          (!focusNode || focusNode == field ||\n           focusNode.tagName == goog.dom.TagName.BODY)) {\n        goog.editor.range.selectNodeStart(field);\n      }\n    }\n  }\n\n  if (!goog.editor.BrowserFeature.CLEARS_SELECTION_WHEN_FOCUS_LEAVES &&\n      this.usesIframe()) {\n    var parent = this.getEditableDomHelper().getWindow().parent;\n    parent.getSelection().removeAllRanges();\n  }\n};\n\n\n/**\n * Dispatches a blur event.\n * @protected\n */\ngoog.editor.Field.prototype.dispatchBlur = function() {\n  if (this.isEventStopped(goog.editor.Field.EventType.BLUR)) {\n    return;\n  }\n\n  // Another field may have already been registered as active, so only\n  // clear out the active field id if we still think this field is active.\n  if (goog.editor.Field.getActiveFieldId() == this.id) {\n    goog.editor.Field.setActiveFieldId(null);\n  }\n\n  this.isSelectionEditable_ = false;\n  this.dispatchEvent(goog.editor.Field.EventType.BLUR);\n};\n\n\n/**\n * @return {boolean} Whether the selection is editable.\n */\ngoog.editor.Field.prototype.isSelectionEditable = function() {\n  return this.isSelectionEditable_;\n};\n\n\n/**\n * Event handler for clicks in browsers that will follow a link when the user\n * clicks, even if it's editable. We stop the click manually\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.editor.Field.cancelLinkClick_ = function(e) {\n  if (goog.dom.getAncestorByTagNameAndClass(\n          /** @type {Node} */ (e.target), goog.dom.TagName.A)) {\n    e.preventDefault();\n  }\n};\n\n\n/**\n * Handle mouse down inside the editable field.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.editor.Field.prototype.handleMouseDown_ = function(e) {\n  goog.editor.Field.setActiveFieldId(this.id);\n\n  // Open links in a new window if the user control + clicks.\n  if (goog.userAgent.IE) {\n    var targetElement = e.target;\n    if (targetElement &&\n        /** @type {!Element} */ (targetElement).tagName == goog.dom.TagName.A &&\n        e.ctrlKey) {\n      this.originalDomHelper.getWindow().open(targetElement.href);\n    }\n  }\n  this.waitingForMouseUp_ = true;\n};\n\n\n/**\n * Handle drag start. Needs to cancel listening for the mouse up event on the\n * window.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.editor.Field.prototype.handleDragStart_ = function(e) {\n  this.waitingForMouseUp_ = false;\n};\n\n\n/**\n * Handle mouse up inside the editable field.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.editor.Field.prototype.handleMouseUp_ = function(e) {\n  if (this.useWindowMouseUp_ && !this.waitingForMouseUp_) {\n    return;\n  }\n  this.waitingForMouseUp_ = false;\n\n  /*\n   * We fire a selection change event immediately for listeners that depend on\n   * the native browser event object (e).  On IE, a listener that tries to\n   * retrieve the selection with goog.dom.Range may see an out-of-date\n   * selection range.\n   */\n  this.dispatchEvent(goog.editor.Field.EventType.BEFORESELECTIONCHANGE);\n  this.dispatchSelectionChangeEvent(e);\n  if (goog.userAgent.IE) {\n    /*\n     * Fire a second selection change event for listeners that need an\n     * up-to-date selection range. Save the event's target to be sent with it\n     * (it's safer than saving a copy of the event itself).\n     */\n    this.selectionChangeTarget_ = /** @type {Node} */ (e.target);\n    this.selectionChangeTimer_.start();\n  }\n};\n\n\n/**\n * Retrieve the HTML contents of a field.\n *\n * Do NOT just get the innerHTML of a field directly--there's a lot of\n * processing that needs to happen.\n  * @return {string} The scrubbed contents of the field.\n */\ngoog.editor.Field.prototype.getCleanContents = function() {\n  if (this.queryCommandValue(goog.editor.Command.USING_LOREM)) {\n    return goog.string.Unicode.NBSP;\n  }\n\n  if (!this.isLoaded()) {\n    // The field is uneditable, so it's ok to read contents directly.\n    var elem = this.getOriginalElement();\n    if (!elem) {\n      goog.log.log(\n          this.logger, goog.log.Level.SHOUT,\n          \"Couldn't get the field element to read the contents\");\n    }\n    return elem.innerHTML;\n  }\n\n  var fieldCopy = this.getFieldCopy();\n\n  // Allow the plugins to handle their cleanup.\n  this.invokeOp_(goog.editor.PluginImpl.Op.CLEAN_CONTENTS_DOM, fieldCopy);\n  return this.reduceOp_(\n      goog.editor.PluginImpl.Op.CLEAN_CONTENTS_HTML, fieldCopy.innerHTML);\n};\n\n\n/**\n * Get the copy of the editable field element, which has the innerHTML set\n * correctly.\n * @return {!Element} The copy of the editable field.\n * @protected\n */\ngoog.editor.Field.prototype.getFieldCopy = function() {\n  var field = this.getElement();\n  // Deep cloneNode strips some script tag contents in IE, so we do this.\n  var fieldCopy = /** @type {Element} */ (field.cloneNode(false));\n\n  // For some reason, when IE sets innerHtml of the cloned node, it strips\n  // script tags that fall at the beginning of an element. Appending a\n  // non-breaking space prevents this.\n  var html = field.innerHTML;\n  if (goog.userAgent.IE && html.match(/^\\s*<script/i)) {\n    html = goog.string.Unicode.NBSP + html;\n  }\n  fieldCopy.innerHTML = html;\n  return fieldCopy;\n};\n\n\n/**\n * Sets the contents of the field.\n * @param {boolean} addParas Boolean to specify whether to add paragraphs\n *    to long fields.\n * @param {?goog.html.SafeHtml} html html to insert.  If html=null, then this\n *    defaults to a nbsp for mozilla and an empty string for IE.\n * @param {boolean=} opt_dontFireDelayedChange True to make this content change\n *    not fire a delayed change event.\n * @param {boolean=} opt_applyLorem Whether to apply lorem ipsum styles.\n */\ngoog.editor.Field.prototype.setSafeHtml = function(\n    addParas, html, opt_dontFireDelayedChange, opt_applyLorem) {\n  if (this.isLoading()) {\n    goog.log.error(this.logger, \"Can't set html while loading Trogedit\");\n    return;\n  }\n\n  // Clear the lorem ipsum style, always.\n  if (opt_applyLorem) {\n    this.execCommand(goog.editor.Command.CLEAR_LOREM);\n  }\n\n  if (html && addParas) {\n    html = goog.html.SafeHtml.create('p', {}, html);\n  }\n\n  // If we don't want change events to fire, we have to turn off change events\n  // before setting the field contents, since that causes mutation events.\n  if (opt_dontFireDelayedChange) {\n    this.stopChangeEvents(false, true);\n  }\n\n  this.setInnerHtml_(html);\n\n  // Set the lorem ipsum style, if the element is empty.\n  if (opt_applyLorem) {\n    this.execCommand(goog.editor.Command.UPDATE_LOREM);\n  }\n\n  // TODO(user): This check should probably be moved to isEventStopped and\n  // startEvent.\n  if (this.isLoaded()) {\n    if (opt_dontFireDelayedChange) {  // Turn back on change events\n      // We must fire change timer if necessary before restarting change events!\n      // Otherwise, the change timer firing after we restart events will cause\n      // the delayed change we were trying to stop. Flow:\n      //   Stop delayed change\n      //   setInnerHtml_, this starts the change timer\n      //   start delayed change\n      //   change timer fires\n      //   starts delayed change timer since event was not stopped\n      //   delayed change fires for the delayed change we tried to stop.\n      if (goog.editor.BrowserFeature.USE_MUTATION_EVENTS) {\n        this.changeTimerGecko_.fireIfActive();\n      }\n      this.startChangeEvents();\n    } else {  // Mark the document as changed and fire change events.\n      this.dispatchChange();\n    }\n  }\n};\n\n\n/**\n * Sets the inner HTML of the field. Works on both editable and\n * uneditable fields.\n * @param {?goog.html.SafeHtml} html The new inner HTML of the field.\n * @private\n */\ngoog.editor.Field.prototype.setInnerHtml_ = function(html) {\n  var field = this.getElement();\n  if (field) {\n    // Safari will put <style> tags into *new* <head> elements. When setting\n    // HTML, we need to remove these spare <head>s to make sure there's a\n    // clean slate, but keep the first <head>.\n    // Note:  We punt on this issue for the non iframe case since\n    // we don't want to screw with the main document.\n    if (this.usesIframe() && goog.editor.BrowserFeature.MOVES_STYLE_TO_HEAD) {\n      var heads = goog.dom.getElementsByTagName(\n          goog.dom.TagName.HEAD, goog.asserts.assert(field.ownerDocument));\n      for (var i = heads.length - 1; i >= 1; --i) {\n        heads[i].parentNode.removeChild(heads[i]);\n      }\n    }\n  } else {\n    field = this.getOriginalElement();\n  }\n\n  if (field) {\n    this.injectContents(html && goog.html.SafeHtml.unwrap(html), field);\n  }\n};\n\n\n/**\n * Attemps to turn on designMode for a document.  This function can fail under\n * certain circumstances related to the load event, and will throw an exception.\n * @protected\n */\ngoog.editor.Field.prototype.turnOnDesignModeGecko = function() {\n  var doc = this.getEditableDomHelper().getDocument();\n\n  // NOTE(nicksantos): This will fail under certain conditions, like\n  // when the node has display: none. It's up to clients to ensure that\n  // their fields are valid when they try to make them editable.\n  doc.designMode = 'on';\n\n  if (goog.editor.BrowserFeature.HAS_STYLE_WITH_CSS) {\n    doc.execCommand('styleWithCSS', false, false);\n  }\n};\n\n\n/**\n * Installs styles if needed. Only writes styles when they can't be written\n * inline directly into the field.\n * @protected\n */\ngoog.editor.Field.prototype.installStyles = function() {\n  if (this.cssStyles.getTypedStringValue() && this.shouldLoadAsynchronously()) {\n    goog.style.installSafeStyleSheet(this.cssStyles, this.getElement());\n  }\n};\n\n\n/**\n * Signal that the field is loaded and ready to use.  Change events now are\n * in effect.\n * @private\n */\ngoog.editor.Field.prototype.dispatchLoadEvent_ = function() {\n  this.getElement();\n  this.installStyles();\n  this.startChangeEvents();\n  goog.log.info(this.logger, 'Dispatching load ' + this.id);\n  this.dispatchEvent(goog.editor.Field.EventType.LOAD);\n};\n\n\n/**\n * @return {boolean} Whether the field is uneditable.\n */\ngoog.editor.Field.prototype.isUneditable = function() {\n  return this.loadState_ == goog.editor.Field.LoadState_.UNEDITABLE;\n};\n\n\n/**\n * @return {boolean} Whether the field has finished loading.\n */\ngoog.editor.Field.prototype.isLoaded = function() {\n  return this.loadState_ == goog.editor.Field.LoadState_.EDITABLE;\n};\n\n\n/**\n * @return {boolean} Whether the field is in the process of loading.\n */\ngoog.editor.Field.prototype.isLoading = function() {\n  return this.loadState_ == goog.editor.Field.LoadState_.LOADING;\n};\n\n\n/**\n * Gives the field focus.\n */\ngoog.editor.Field.prototype.focus = function() {\n  if (!goog.editor.BrowserFeature.HAS_CONTENT_EDITABLE && this.usesIframe()) {\n    // In designMode, only the window itself can be focused; not the element.\n    this.getEditableDomHelper().getWindow().focus();\n  } else {\n    if (goog.userAgent.OPERA) {\n      // Opera will scroll to the bottom of the focused document, even\n      // if it is contained in an iframe that is scrolled to the top and\n      // the bottom flows past the end of it. To prevent this,\n      // save the scroll position of the document containing the editor\n      // iframe, then restore it after the focus.\n      var scrollX = this.appWindow_.pageXOffset;\n      var scrollY = this.appWindow_.pageYOffset;\n    }\n    this.getElement().focus();\n    if (goog.userAgent.OPERA) {\n      this.appWindow_.scrollTo(\n          /** @type {number} */ (scrollX), /** @type {number} */ (scrollY));\n    }\n  }\n};\n\n\n/**\n * Gives the field focus and places the cursor at the start of the field.\n */\ngoog.editor.Field.prototype.focusAndPlaceCursorAtStart = function() {\n  // NOTE(user): Excluding Gecko to maintain existing behavior post refactoring\n  // placeCursorAtStart into its own method. In Gecko browsers that currently\n  // have a selection the existing selection will be restored, otherwise it\n  // will go to the start.\n  // TODO(user): Refactor the code using this and related methods. We should\n  // only mess with the selection in the case where there is not an existing\n  // selection in the field.\n  if (goog.editor.BrowserFeature.HAS_IE_RANGES || !goog.userAgent.GECKO) {\n    this.placeCursorAtStart();\n  }\n  this.focus();\n};\n\n\n/**\n * Place the cursor at the start of this field. It's recommended that you only\n * use this method (and manipulate the selection in general) when there is not\n * an existing selection in the field.\n */\ngoog.editor.Field.prototype.placeCursorAtStart = function() {\n  this.placeCursorAtStartOrEnd_(true);\n};\n\n\n/**\n * Place the cursor at the start of this field. It's recommended that you only\n * use this method (and manipulate the selection in general) when there is not\n * an existing selection in the field.\n */\ngoog.editor.Field.prototype.placeCursorAtEnd = function() {\n  this.placeCursorAtStartOrEnd_(false);\n};\n\n\n/**\n * Helper method to place the cursor at the start or end of this field.\n * @param {boolean} isStart True for start, false for end.\n * @private\n */\ngoog.editor.Field.prototype.placeCursorAtStartOrEnd_ = function(isStart) {\n  var field = this.getElement();\n  if (field) {\n    var cursorPosition = isStart ? goog.editor.node.getLeftMostLeaf(field) :\n                                   goog.editor.node.getRightMostLeaf(field);\n    if (field == cursorPosition) {\n      // The rightmost leaf we found was the field element itself (which likely\n      // means the field element is empty). We can't place the cursor next to\n      // the field element, so just place it at the beginning.\n      goog.dom.Range.createCaret(field, 0).select();\n    } else {\n      goog.editor.range.placeCursorNextTo(cursorPosition, isStart);\n    }\n    this.dispatchSelectionChangeEvent();\n  }\n};\n\n\n/**\n * Restore a saved range, and set the focus on the field.\n * If no range is specified, we simply set the focus.\n * @param {goog.dom.SavedRange=} opt_range A previously saved selected range.\n */\ngoog.editor.Field.prototype.restoreSavedRange = function(opt_range) {\n  if (opt_range) {\n    opt_range.restore();\n  }\n  this.focus();\n};\n\n\n/**\n * Makes a field editable.\n *\n * @param {!goog.html.TrustedResourceUrl=} opt_iframeSrc URL to set the iframe\n *     src to if necessary.\n */\ngoog.editor.Field.prototype.makeEditable = function(opt_iframeSrc) {\n  this.loadState_ = goog.editor.Field.LoadState_.LOADING;\n\n  var field = this.getOriginalElement();\n\n  // TODO: In the fieldObj, save the field's id, className, cssText\n  // in order to reset it on closeField. That way, we can muck with the field's\n  // css, id, class and restore to how it was at the end.\n  this.nodeName = field.nodeName;\n  this.savedClassName_ = field.className;\n  this.setInitialStyle(field.style.cssText);\n\n  goog.dom.classlist.add(field, 'editable');\n\n  this.makeEditableInternal(opt_iframeSrc);\n};\n\n\n/**\n * Handles actually making something editable - creating necessary nodes,\n * injecting content, etc.\n * @param {!goog.html.TrustedResourceUrl=} opt_iframeSrc URL to set the iframe\n *     src to if necessary.\n * @protected\n */\ngoog.editor.Field.prototype.makeEditableInternal = function(opt_iframeSrc) {\n  this.makeIframeField_(opt_iframeSrc);\n};\n\n\n/**\n * Handle the loading of the field (e.g. once the field is ready to setup).\n * TODO(user): this should probably just be moved into dispatchLoadEvent_.\n * @protected\n */\ngoog.editor.Field.prototype.handleFieldLoad = function() {\n  if (goog.userAgent.IE) {\n    // This sometimes fails if the selection is invalid. This can happen, for\n    // example, if you attach a CLICK handler to the field that causes the\n    // field to be removed from the DOM and replaced with an editor\n    // -- however, listening to another event like MOUSEDOWN does not have this\n    // issue since no mouse selection has happened at that time.\n    goog.dom.Range.clearSelection(this.editableDomHelper.getWindow());\n  }\n\n  if (goog.editor.Field.getActiveFieldId() != this.id) {\n    this.execCommand(goog.editor.Command.UPDATE_LOREM);\n  }\n\n  this.setupChangeListeners_();\n  this.dispatchLoadEvent_();\n\n  // Enabling plugins after we fire the load event so that clients have a\n  // chance to set initial field contents before we start mucking with\n  // everything.\n  for (var classId in this.plugins_) {\n    this.plugins_[classId].enable(this);\n  }\n};\n\n\n/**\n * Closes the field and cancels all pending change timers.  Note that this\n * means that if a change event has not fired yet, it will not fire.  Clients\n * should check fieldOj.isModified() if they depend on the final change event.\n * Throws an error if the field is already uneditable.\n *\n * @param {boolean=} opt_skipRestore True to prevent copying of editable field\n *     contents back into the original node.\n */\ngoog.editor.Field.prototype.makeUneditable = function(opt_skipRestore) {\n  if (this.isUneditable()) {\n    throw new Error('makeUneditable: Field is already uneditable');\n  }\n\n  // Fire any events waiting on a timeout.\n  // Clearing delayed change also clears changeTimerGecko_.\n  this.clearDelayedChange();\n  this.selectionChangeTimer_.fireIfActive();\n  this.execCommand(goog.editor.Command.CLEAR_LOREM);\n\n  var html = null;\n  if (!opt_skipRestore && this.getElement()) {\n    // Rest of cleanup is simpler if field was never initialized.\n    html = this.getCleanContents();\n  }\n\n  // First clean up anything that happens in makeFieldEditable\n  // (i.e. anything that needs cleanup even if field has not loaded).\n  this.clearFieldLoadListener_();\n\n  var field = this.getOriginalElement();\n  if (goog.editor.Field.getActiveFieldId() == field.id) {\n    goog.editor.Field.setActiveFieldId(null);\n  }\n\n  // Clear all listeners before removing the nodes from the dom - if\n  // there are listeners on the iframe window, Firefox throws errors trying\n  // to unlisten once the iframe is no longer in the dom.\n  this.clearListeners();\n\n  // For fields that have loaded, clean up anything that happened in\n  // handleFieldOpen or later.\n  // If html is provided, copy it back and reset the properties on the field\n  // so that the original node will have the same properties as it did before\n  // it was made editable.\n  if (typeof html === 'string') {\n    goog.editor.node.replaceInnerHtml(field, html);\n    this.resetOriginalElemProperties();\n  }\n\n  this.restoreDom();\n  this.tearDownFieldObject_();\n\n  // On Safari, make sure to un-focus the field so that the\n  // native \"current field\" highlight style gets removed.\n  if (goog.userAgent.WEBKIT) {\n    field.blur();\n  }\n\n  this.execCommand(goog.editor.Command.UPDATE_LOREM);\n  this.dispatchEvent(goog.editor.Field.EventType.UNLOAD);\n};\n\n\n/**\n * Restores the dom to how it was before being made editable.\n * @protected\n */\ngoog.editor.Field.prototype.restoreDom = function() {\n  // TODO(user): Consider only removing the iframe if we are\n  // restoring the original node, aka, if opt_html.\n  var field = this.getOriginalElement();\n  // TODO(robbyw): Consider throwing an error if !field.\n  if (field) {\n    // If the field is in the process of loading when it starts getting torn\n    // up, the iframe will not exist.\n    var iframe = this.getEditableIframe();\n    if (iframe) {\n      goog.dom.replaceNode(field, iframe);\n    }\n  }\n};\n\n\n/**\n * Returns true if the field needs to be loaded asynchrnously.\n * @return {boolean} True if loads are async.\n * @protected\n */\ngoog.editor.Field.prototype.shouldLoadAsynchronously = function() {\n  if (this.isHttps_ === undefined) {\n    this.isHttps_ = false;\n\n    if (goog.userAgent.IE && this.usesIframe()) {\n      // IE iframes need to load asynchronously if they are in https as we need\n      // to set an actual src on the iframe and wait for it to load.\n\n      // Find the top-most window we have access to and see if it's https.\n      // Technically this could fail if we have an http frame in an https frame\n      // on the same domain (or vice versa), but walking up the window hierarchy\n      // to find the first window that has an http* protocol seems like\n      // overkill.\n      var win = this.originalDomHelper.getWindow();\n      while (win != win.parent) {\n        try {\n          win = win.parent;\n        } catch (e) {\n          break;\n        }\n      }\n      var loc = win.location;\n      this.isHttps_ =\n          loc.protocol == 'https:' && loc.search.indexOf('nocheckhttps') == -1;\n    }\n  }\n  return this.isHttps_;\n};\n\n\n/**\n * Start the editable iframe creation process for Mozilla or IE whitebox.\n * The iframes load asynchronously.\n *\n * @param {!goog.html.TrustedResourceUrl=} opt_iframeSrc URL to set the iframe\n *     src to if necessary.\n * @private\n */\ngoog.editor.Field.prototype.makeIframeField_ = function(opt_iframeSrc) {\n  var field = this.getOriginalElement();\n  // TODO(robbyw): Consider throwing an error if !field.\n  if (field) {\n    var html = field.innerHTML;\n\n    // Invoke prepareContentsHtml on all plugins to prepare html for editing.\n    // Make sure this is done before calling this.attachFrame which removes the\n    // original element from DOM tree. Plugins may assume that the original\n    // element is still in its original position in DOM.\n    var styles = {};\n    html = this.reduceOp_(\n        goog.editor.PluginImpl.Op.PREPARE_CONTENTS_HTML, html, styles);\n\n    var iframe = this.originalDomHelper.createDom(\n        goog.dom.TagName.IFRAME, this.getIframeAttributes());\n\n    // TODO(nicksantos): Figure out if this is ever needed in SAFARI?\n    // In IE over HTTPS we need to wait for a load event before we set up the\n    // iframe, this is to prevent a security prompt or access is denied\n    // errors.\n    // NOTE(user): This hasn't been confirmed.  isHttps_ allows a query\n    // param, nocheckhttps, which we can use to ascertain if this is actually\n    // needed.  It was originally thought to be needed for IE6 SP1, but\n    // errors have been seen in IE7 as well.\n    if (this.shouldLoadAsynchronously()) {\n      // onLoad is the function to call once the iframe is ready to continue\n      // loading.\n      var onLoad =\n          goog.bind(this.iframeFieldLoadHandler, this, iframe, html, styles);\n\n      this.fieldLoadListenerKey_ =\n          goog.events.listen(iframe, goog.events.EventType.LOAD, onLoad, true);\n\n      if (opt_iframeSrc) {\n        goog.dom.safe.setIframeSrc(iframe, opt_iframeSrc);\n      }\n    }\n\n    this.attachIframe(iframe);\n\n    // Only continue if its not IE HTTPS in which case we're waiting for load.\n    if (!this.shouldLoadAsynchronously()) {\n      this.iframeFieldLoadHandler(iframe, html, styles);\n    }\n  }\n};\n\n\n/**\n * Given the original field element, and the iframe that is destined to\n * become the editable field, styles them appropriately and add the iframe\n * to the dom.\n *\n * @param {HTMLIFrameElement} iframe The iframe element.\n * @protected\n */\ngoog.editor.Field.prototype.attachIframe = function(iframe) {\n  var field = this.getOriginalElement();\n  // TODO(user): Why do we do these two lines .. and why whitebox only?\n  iframe.className = field.className;\n  iframe.id = field.id;\n  goog.dom.replaceNode(iframe, field);\n};\n\n\n/**\n * @param {Object} extraStyles A map of extra styles.\n * @return {!goog.editor.icontent.FieldFormatInfo} The FieldFormatInfo\n *     object for this field's configuration.\n * @protected\n */\ngoog.editor.Field.prototype.getFieldFormatInfo = function(extraStyles) {\n  var originalElement = this.getOriginalElement();\n  var isStandardsMode = goog.editor.node.isStandardsMode(originalElement);\n\n  return new goog.editor.icontent.FieldFormatInfo(\n      this.id, isStandardsMode, false, false, extraStyles);\n};\n\n\n/**\n * Writes the html content into the iframe.  Handles writing any aditional\n * styling as well.\n * @param {HTMLIFrameElement} iframe Iframe to write contents into.\n * @param {string} innerHtml The html content to write into the iframe.\n * @param {Object} extraStyles A map of extra style attributes.\n * @protected\n */\ngoog.editor.Field.prototype.writeIframeContent = function(\n    iframe, innerHtml, extraStyles) {\n  var formatInfo = this.getFieldFormatInfo(extraStyles);\n\n  if (this.shouldLoadAsynchronously()) {\n    var doc = goog.dom.getFrameContentDocument(iframe);\n    goog.editor.icontent.writeHttpsInitialIframe(formatInfo, doc, innerHtml);\n  } else {\n    var styleInfo = new goog.editor.icontent.FieldStyleInfo(\n        this.getElement(), this.cssStyles.getTypedStringValue());\n    goog.editor.icontent.writeNormalInitialIframe(\n        formatInfo, innerHtml, styleInfo, iframe);\n  }\n};\n\n\n/**\n * The function to call when the editable iframe loads.\n *\n * @param {HTMLIFrameElement} iframe Iframe that just loaded.\n * @param {string} innerHtml Html to put inside the body of the iframe.\n * @param {Object} styles Property-value map of CSS styles to install on\n *     editable field.\n * @protected\n */\ngoog.editor.Field.prototype.iframeFieldLoadHandler = function(\n    iframe, innerHtml, styles) {\n  this.clearFieldLoadListener_();\n\n  iframe.allowTransparency = 'true';\n  this.writeIframeContent(iframe, innerHtml, styles);\n  var doc = goog.dom.getFrameContentDocument(iframe);\n\n  // Make sure to get this pointer after the doc.write as the doc.write\n  // clobbers all the document contents.\n  var body = doc.body;\n  this.setupFieldObject(body);\n\n  if (!goog.editor.BrowserFeature.HAS_CONTENT_EDITABLE && this.usesIframe()) {\n    this.turnOnDesignModeGecko();\n  }\n\n  this.handleFieldLoad();\n};\n\n\n/**\n * Clears fieldLoadListener for a field. Must be called even (especially?) if\n * the field is not yet loaded and therefore not in this.fieldMap_\n * @private\n */\ngoog.editor.Field.prototype.clearFieldLoadListener_ = function() {\n  if (this.fieldLoadListenerKey_) {\n    goog.events.unlistenByKey(this.fieldLoadListenerKey_);\n    this.fieldLoadListenerKey_ = null;\n  }\n};\n\n\n/**\n * @return {!Object} Get the HTML attributes for this field's iframe.\n * @protected\n */\ngoog.editor.Field.prototype.getIframeAttributes = function() {\n  var iframeStyle = 'padding:0;' + this.getOriginalElement().style.cssText;\n\n  if (!goog.string.endsWith(iframeStyle, ';')) {\n    iframeStyle += ';';\n  }\n\n  iframeStyle += 'background-color:white;';\n\n  // Ensure that the iframe has default overflow styling.  If overflow is\n  // set to auto, an IE rendering bug can occur when it tries to render a\n  // table at the very bottom of the field, such that the table would cause\n  // a scrollbar, that makes the entire field go blank.\n  if (goog.userAgent.IE) {\n    iframeStyle += 'overflow:visible;';\n  }\n\n  return {'frameBorder': 0, 'style': iframeStyle};\n};\n","^17",1579837703000,"^18",["^19",["^1S","^1T","~$goog.events.EventHandler","~$goog.functions","~$goog.userAgent.product","~$goog.dom.classlist","~$goog.a11y.aria","~$goog.editor.icontent.FieldFormatInfo","~$goog.editor.Command","^2D","~$goog.editor.range","~$goog.log.Level","~$goog.a11y.aria.Role","~$goog.editor.BrowserFeature","^Z","~$goog.events.EventTarget","~$goog.userAgent","^2J","~$goog.editor.icontent.FieldStyleInfo","~$goog.events.EventType","~$goog.dom.safe","~$goog.editor.PluginImpl","^29","^2A","~$goog.editor.node","~$goog.string.Unicode","~$goog.dom.Range","~$goog.events.KeyCodes","~$goog.array","~$goog.events","^2B","^1V","~$goog.async.Delay","~$goog.editor.icontent"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/field.js"],"^1J",["^19",["^2I","~$goog.editor.Field.EventType"]],"^X",true,"^Y",["^Z","^2P","^2U","^35","^1S","^37","^1T","^33","^1V","^2O","^2[","^2V","^2R","^30","^38","^2Q","^2Y","^31","^2S","^36","^2L","^2W","^2Z","^34","^2M","^2B","^2A","^2J","^2T","^2D","^32","^29","^2X","^2N"]],["^ ","^[",[1579837703000],"^10","goog.net.streams.jsonstreamparser.js","^11",["^12","goog/net/streams/jsonstreamparser.js"],"^13","goog/net/streams/jsonstreamparser.js","^14","^15","^16","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview the default JSON stream parser.\n *\n * The default JSON parser decodes the input stream (string) under the\n * following rules:\n * 1. The stream represents a valid JSON array (must start with a \"[\" and close\n *    with the corresponding \"]\"). Each element of this array is assumed to be\n *    either an array or an object, and will be decoded as a JS object and\n *    delivered.\n * 2. All JSON elements in the buffer will be decoded and delivered in a batch.\n * 3. If a high-level API does not support batch delivery (e.g. grpc), then\n *    a wrapper is expected to deliver individual elements separately\n *    and in order.\n * 4. The parser is expected to drop any data (without breaking the\n *    specified MIME format) that is not visible to the client: e.g. new lines\n *    for pretty printing; no-op data for keep-alive support.\n * 5. Fail-fast: any invalid content should abort the stream by setting the\n *    state of the parser to \"invalid\".\n *\n * The parser is a streamed JSON parser and is optimized in such a way\n * that it only scans the message boundary and the actual decoding of JSON\n * strings and construction of JS object are done by JSON.parse (native\n * code).\n */\n\ngoog.provide('goog.net.streams.JsonStreamParser');\ngoog.provide('goog.net.streams.JsonStreamParser.Options');\n\ngoog.require('goog.asserts');\ngoog.require('goog.net.streams.StreamParser');\ngoog.require('goog.net.streams.utils');\n\n\ngoog.scope(function() {\n\n\nvar utils = goog.module.get('goog.net.streams.utils');\n\n\n/**\n * The default JSON stream parser.\n *\n * @param {!goog.net.streams.JsonStreamParser.Options=} opt_options\n *     Configuration for the new JsonStreamParser instance.\n * @constructor\n * @struct\n * @implements {goog.net.streams.StreamParser}\n * @final\n * @package\n */\ngoog.net.streams.JsonStreamParser = function(opt_options) {\n  /**\n   * The current error message, if any.\n   * @private {?string}\n   */\n  this.errorMessage_ = null;\n\n  /**\n   * The currently buffered result (parsed JSON objects).\n   * @private {!Array<string|!Object>}\n   */\n  this.result_ = [];\n\n  /**\n   * The currently buffered input.\n   * @private {string}\n   */\n  this.buffer_ = '';\n\n  /**\n   * The current stack.\n   * @private {!Array<!Parser.State_>}\n   */\n  this.stack_ = [];\n\n  /**\n   * The current depth of the nested JSON structure.\n   * @private {number}\n   */\n  this.depth_ = 0;\n\n  /**\n   * The current position in the streamed data.\n   * @private {number}\n   */\n  this.pos_ = 0;\n\n  /**\n   * The current state of whether the parser is decoding a '\\' escaped string.\n   * @private {boolean}\n   */\n  this.slashed_ = false;\n\n  /**\n   * The current unicode char count. 0 means no unicode, 1-4 otherwise.\n   * @private {number}\n   */\n  this.unicodeCount_ = 0;\n\n  /**\n   * The regexp for parsing string input.\n   * @private {!RegExp}\n   */\n  this.stringInputPattern_ = /[\\\\\"]/g;\n\n  /**\n   * The current stream state.\n   * @private {goog.net.streams.JsonStreamParser.StreamState_}\n   */\n  this.streamState_ = Parser.StreamState_.INIT;\n\n  /**\n   * The current parser state.\n   * @private {goog.net.streams.JsonStreamParser.State_}\n   */\n  this.state_ = Parser.State_.INIT;\n\n  /**\n   * Whether to deliver the raw message string without decoding into JS object.\n   * @private {boolean}\n   */\n  this.deliverMessageAsRawString_ =\n      !!(opt_options && opt_options.deliverMessageAsRawString);\n};\n\n\n/**\n * Configuration spec for newly created JSON stream parser:\n *\n * allowCompactJsonArrayFormat: ignored.\n *\n * deliverMessageAsRawString: whether to deliver the raw message string without\n *     decoding into JS object. Semantically insignificant whitespaces in the\n *     input may be kept or ignored.\n *\n * @typedef {{\n *   allowCompactJsonArrayFormat: (boolean|undefined),\n *   deliverMessageAsRawString: (boolean|undefined),\n * }}\n */\ngoog.net.streams.JsonStreamParser.Options;\n\n\nvar Parser = goog.net.streams.JsonStreamParser;\n\n\n/**\n * The stream state.\n * @private @enum {number}\n */\nParser.StreamState_ = {\n  INIT: 0,\n  ARRAY_OPEN: 1,\n  ARRAY_END: 2,\n  INVALID: 3\n};\n\n\n/**\n * The parser state.\n * @private @enum {number}\n */\nParser.State_ = {\n  INIT: 0,\n  VALUE: 1,\n  OBJECT_OPEN: 2,\n  OBJECT_END: 3,\n  ARRAY_OPEN: 4,\n  ARRAY_END: 5,\n  STRING: 6,\n  KEY_START: 7,\n  KEY_END: 8,\n  TRUE1: 9,  // T and expecting RUE ...\n  TRUE2: 10,\n  TRUE3: 11,\n  FALSE1: 12,  // F and expecting ALSE ...\n  FALSE2: 13,\n  FALSE3: 14,\n  FALSE4: 15,\n  NULL1: 16,  // N and expecting ULL ...\n  NULL2: 17,\n  NULL3: 18,\n  NUM_DECIMAL_POINT: 19,\n  NUM_DIGIT: 20\n};\n\n\n/**\n * @override\n */\nParser.prototype.isInputValid = function() {\n  return this.streamState_ != Parser.StreamState_.INVALID;\n};\n\n\n/**\n * @override\n */\nParser.prototype.getErrorMessage = function() {\n  return this.errorMessage_;\n};\n\n\n/**\n * @return {boolean} Whether the parser has reached the end of the stream\n *\n * TODO(updogliu): move this API to the base type.\n */\nParser.prototype.done = function() {\n  return this.streamState_ === Parser.StreamState_.ARRAY_END;\n};\n\n\n/**\n * Get the part of input that is after the end of the stream. Call this only\n * when `this.done()` is true.\n *\n * @return {string} The extra input\n *\n * TODO(updogliu): move this API to the base type.\n */\nParser.prototype.getExtraInput = function() {\n  return this.buffer_;\n};\n\n\n/**\n * @param {string|!ArrayBuffer|!Array<number>} input\n *     The current input string (always)\n * @param {number} pos The position in the current input that triggers the error\n * @throws {!Error} Throws an error indicating where the stream is broken\n * @private\n */\nParser.prototype.error_ = function(input, pos) {\n  this.streamState_ = Parser.StreamState_.INVALID;\n  this.errorMessage_ = 'The stream is broken @' + this.pos_ + '/' + pos +\n      '. With input:\\n' + input;\n  throw new Error(this.errorMessage_);\n};\n\n\n/**\n * @throws {Error} Throws an error message if the input is invalid.\n * @override\n */\nParser.prototype.parse = function(input) {\n  goog.asserts.assertString(input);\n\n  // captures\n  var parser = this;\n  var stack = parser.stack_;\n  var pattern = parser.stringInputPattern_;\n  var State = Parser.State_;  // enums\n\n  var num = input.length;\n\n  var streamStart = 0;\n\n  var msgStart = -1;\n\n  var i = 0;\n\n  while (i < num) {\n    switch (parser.streamState_) {\n      case Parser.StreamState_.INVALID:\n        parser.error_(input, i);\n        return null;\n\n      case Parser.StreamState_.ARRAY_END:\n        if (readMore()) {\n          parser.error_(input, i);\n        }\n        return null;\n\n      case Parser.StreamState_.INIT:\n        if (readMore()) {\n          var current = input[i++];\n          parser.pos_++;\n\n          if (current === '[') {\n            parser.streamState_ = Parser.StreamState_.ARRAY_OPEN;\n\n            streamStart = i;\n            parser.state_ = State.ARRAY_OPEN;\n\n            continue;\n          } else {\n            parser.error_(input, i);\n          }\n        }\n        return null;\n\n      case Parser.StreamState_.ARRAY_OPEN:\n        parseData();\n\n        if (parser.depth_ === 0 && parser.state_ == State.ARRAY_END) {\n          parser.streamState_ = Parser.StreamState_.ARRAY_END;\n          parser.buffer_ = input.substring(i);\n        } else {\n          if (msgStart === -1) {\n            parser.buffer_ += input.substring(streamStart);\n          } else {\n            parser.buffer_ = input.substring(msgStart);\n          }\n        }\n\n        if (parser.result_.length > 0) {\n          var msgs = parser.result_;\n          parser.result_ = [];\n          return msgs;\n        }\n        return null;\n    }\n  }\n\n  return null;\n\n  /**\n   * @return {boolean} true if the parser needs parse more data\n   */\n  function readMore() {\n    skipWhitespace();\n    return i < num;\n  }\n\n  /**\n   * Skip as many whitespaces as possible, and increments current index of\n   * stream to next available char.\n   */\n  function skipWhitespace() {\n    while (i < input.length) {\n      if (utils.isJsonWhitespace(input[i])) {\n        i++;\n        parser.pos_++;\n        continue;\n      }\n      break;\n    }\n  }\n\n  /**\n   * Parse the input JSON elements with a streamed state machine.\n   */\n  function parseData() {\n    var current;\n\n    while (true) {\n      current = input[i++];\n      if (!current) {\n        break;\n      }\n\n      parser.pos_++;\n\n      switch (parser.state_) {\n        case State.INIT:\n          if (current === '{') {\n            parser.state_ = State.OBJECT_OPEN;\n          } else if (current === '[') {\n            parser.state_ = State.ARRAY_OPEN;\n          } else if (!utils.isJsonWhitespace(current)) {\n            parser.error_(input, i);\n          }\n          continue;\n\n        case State.KEY_START:\n        case State.OBJECT_OPEN:\n          if (utils.isJsonWhitespace(current)) {\n            continue;\n          }\n          if (parser.state_ === State.KEY_START) {\n            stack.push(State.KEY_END);\n          } else {\n            if (current === '}') {\n              addMessage('{}');\n              parser.state_ = nextState();\n              continue;\n            } else {\n              stack.push(State.OBJECT_END);\n            }\n          }\n          if (current === '\"') {\n            parser.state_ = State.STRING;\n          } else {\n            parser.error_(input, i);\n          }\n          continue;\n\n\n        case State.KEY_END:\n        case State.OBJECT_END:\n          if (utils.isJsonWhitespace(current)) {\n            continue;\n          }\n          if (current === ':') {\n            if (parser.state_ === State.OBJECT_END) {\n              stack.push(State.OBJECT_END);\n              parser.depth_++;\n            }\n            parser.state_ = State.VALUE;\n          } else if (current === '}') {\n            parser.depth_--;\n            addMessage();\n            parser.state_ = nextState();\n          } else if (current === ',') {\n            if (parser.state_ === State.OBJECT_END) {\n              stack.push(State.OBJECT_END);\n            }\n            parser.state_ = State.KEY_START;\n          } else {\n            parser.error_(input, i);\n          }\n          continue;\n\n        case State.ARRAY_OPEN:\n        case State.VALUE:\n          if (utils.isJsonWhitespace(current)) {\n            continue;\n          }\n          if (parser.state_ === State.ARRAY_OPEN) {\n            parser.depth_++;\n            parser.state_ = State.VALUE;\n            if (current === ']') {\n              parser.depth_--;\n              if (parser.depth_ === 0) {\n                parser.state_ = State.ARRAY_END;\n                return;\n              }\n\n              addMessage('[]');\n\n              parser.state_ = nextState();\n              continue;\n            } else {\n              stack.push(State.ARRAY_END);\n            }\n          }\n          if (current === '\"')\n            parser.state_ = State.STRING;\n          else if (current === '{')\n            parser.state_ = State.OBJECT_OPEN;\n          else if (current === '[')\n            parser.state_ = State.ARRAY_OPEN;\n          else if (current === 't')\n            parser.state_ = State.TRUE1;\n          else if (current === 'f')\n            parser.state_ = State.FALSE1;\n          else if (current === 'n')\n            parser.state_ = State.NULL1;\n          else if (current === '-') {\n            // continue\n          } else if ('0123456789'.indexOf(current) !== -1) {\n            parser.state_ = State.NUM_DIGIT;\n          } else {\n            parser.error_(input, i);\n          }\n          continue;\n\n        case State.ARRAY_END:\n          if (current === ',') {\n            stack.push(State.ARRAY_END);\n            parser.state_ = State.VALUE;\n\n            if (parser.depth_ === 1) {\n              msgStart = i;  // skip ',', including a leading one\n            }\n          } else if (current === ']') {\n            parser.depth_--;\n            if (parser.depth_ === 0) {\n              return;\n            }\n\n            addMessage();\n            parser.state_ = nextState();\n          } else if (utils.isJsonWhitespace(current)) {\n            continue;\n          } else {\n            parser.error_(input, i);\n          }\n          continue;\n\n        case State.STRING:\n          var old = i;\n\n          STRING_LOOP: while (true) {\n            while (parser.unicodeCount_ > 0) {\n              current = input[i++];\n              if (parser.unicodeCount_ === 4) {\n                parser.unicodeCount_ = 0;\n              } else {\n                parser.unicodeCount_++;\n              }\n              if (!current) {\n                break STRING_LOOP;\n              }\n            }\n\n            if (current === '\"' && !parser.slashed_) {\n              parser.state_ = nextState();\n              break;\n            }\n            if (current === '\\\\' && !parser.slashed_) {\n              parser.slashed_ = true;\n              current = input[i++];\n              if (!current) {\n                break;\n              }\n            }\n            if (parser.slashed_) {\n              parser.slashed_ = false;\n              if (current === 'u') {\n                parser.unicodeCount_ = 1;\n              }\n              current = input[i++];\n              if (!current) {\n                break;\n              } else {\n                continue;\n              }\n            }\n\n            pattern.lastIndex = i;\n            var patternResult = pattern.exec(input);\n            if (!patternResult) {\n              i = input.length + 1;\n              break;\n            }\n            i = patternResult.index + 1;\n            current = input[patternResult.index];\n            if (!current) {\n              break;\n            }\n          }\n\n          parser.pos_ += (i - old);\n\n          continue;\n\n        case State.TRUE1:\n          if (!current) {\n            continue;\n          }\n          if (current === 'r') {\n            parser.state_ = State.TRUE2;\n          } else {\n            parser.error_(input, i);\n          }\n          continue;\n\n        case State.TRUE2:\n          if (!current) {\n            continue;\n          }\n          if (current === 'u') {\n            parser.state_ = State.TRUE3;\n          } else {\n            parser.error_(input, i);\n          }\n          continue;\n\n        case State.TRUE3:\n          if (!current) {\n            continue;\n          }\n          if (current === 'e') {\n            parser.state_ = nextState();\n          } else {\n            parser.error_(input, i);\n          }\n          continue;\n\n        case State.FALSE1:\n          if (!current) {\n            continue;\n          }\n          if (current === 'a') {\n            parser.state_ = State.FALSE2;\n          } else {\n            parser.error_(input, i);\n          }\n          continue;\n\n        case State.FALSE2:\n          if (!current) {\n            continue;\n          }\n          if (current === 'l') {\n            parser.state_ = State.FALSE3;\n          } else {\n            parser.error_(input, i);\n          }\n          continue;\n\n        case State.FALSE3:\n          if (!current) {\n            continue;\n          }\n          if (current === 's') {\n            parser.state_ = State.FALSE4;\n          } else {\n            parser.error_(input, i);\n          }\n          continue;\n\n        case State.FALSE4:\n          if (!current) {\n            continue;\n          }\n          if (current === 'e') {\n            parser.state_ = nextState();\n          } else {\n            parser.error_(input, i);\n          }\n          continue;\n\n        case State.NULL1:\n          if (!current) {\n            continue;\n          }\n          if (current === 'u') {\n            parser.state_ = State.NULL2;\n          } else {\n            parser.error_(input, i);\n          }\n          continue;\n\n        case State.NULL2:\n          if (!current) {\n            continue;\n          }\n          if (current === 'l') {\n            parser.state_ = State.NULL3;\n          } else {\n            parser.error_(input, i);\n          }\n          continue;\n\n        case State.NULL3:\n          if (!current) {\n            continue;\n          }\n          if (current === 'l') {\n            parser.state_ = nextState();\n          } else {\n            parser.error_(input, i);\n          }\n          continue;\n\n        case State.NUM_DECIMAL_POINT:\n          if (current === '.') {\n            parser.state_ = State.NUM_DIGIT;\n          } else {\n            parser.error_(input, i);\n          }\n          continue;\n\n        case State.NUM_DIGIT:  // no need for a full validation here\n          if ('0123456789.eE+-'.indexOf(current) !== -1) {\n            continue;\n          } else {\n            i--;\n            parser.pos_--;\n            parser.state_ = nextState();\n          }\n          continue;\n\n        default:\n          parser.error_(input, i);\n      }\n    }\n  }\n\n  /**\n   * @return {!goog.net.streams.JsonStreamParser.State_} the next state\n   *    from the stack, or the general VALUE state.\n   */\n  function nextState() {\n    var state = stack.pop();\n    if (state != null) {\n      return state;\n    } else {\n      return State.VALUE;\n    }\n  }\n\n  /**\n   * @param {(string)=} opt_data The message to add\n   */\n  function addMessage(opt_data) {\n    if (parser.depth_ > 1) {\n      return;\n    }\n\n    goog.asserts.assert(opt_data !== '');  // '' not possible\n\n    if (!opt_data) {\n      if (msgStart === -1) {\n        opt_data = parser.buffer_ + input.substring(streamStart, i);\n      } else {\n        opt_data = input.substring(msgStart, i);\n      }\n    }\n\n    if (parser.deliverMessageAsRawString_) {\n      parser.result_.push(opt_data);\n    } else {\n      parser.result_.push(\n          goog.asserts.assertInstanceof(JSON.parse(opt_data), Object));\n    }\n    msgStart = i;\n  }\n};\n\n});  // goog.scope\n","^17",1579837703000,"^18",["^19",["^1S","~$goog.net.streams.utils","^Z","~$goog.net.streams.StreamParser"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/streams/jsonstreamparser.js"],"^1J",["^19",["~$goog.net.streams.JsonStreamParser","~$goog.net.streams.JsonStreamParser.Options"]],"^X",true,"^Y",["^Z","^1S","^3;","^3:"]],["^ ","^[",[1579837703000],"^10","goog.math.vec2.js","^11",["^12","goog/math/vec2.js"],"^13","goog/math/vec2.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines a 2-element vector class that can be used for\n * coordinate math, useful for animation systems and point manipulation.\n *\n * Vec2 objects inherit from goog.math.Coordinate and may be used wherever a\n * Coordinate is required. Where appropriate, Vec2 functions accept both Vec2\n * and Coordinate objects as input.\n *\n * @author brenneman@google.com (Shawn Brenneman)\n */\n\ngoog.provide('goog.math.Vec2');\n\ngoog.require('goog.math');\ngoog.require('goog.math.Coordinate');\n\n\n\n/**\n * Class for a two-dimensional vector object and assorted functions useful for\n * manipulating points.\n *\n * @param {number} x The x coordinate for the vector.\n * @param {number} y The y coordinate for the vector.\n * @struct\n * @constructor\n * @extends {goog.math.Coordinate}\n */\ngoog.math.Vec2 = function(x, y) {\n  /**\n   * X-value\n   * @type {number}\n   */\n  this.x = x;\n\n  /**\n   * Y-value\n   * @type {number}\n   */\n  this.y = y;\n};\ngoog.inherits(goog.math.Vec2, goog.math.Coordinate);\n\n\n/**\n * @return {!goog.math.Vec2} A random unit-length vector.\n */\ngoog.math.Vec2.randomUnit = function() {\n  var angle = Math.random() * Math.PI * 2;\n  return new goog.math.Vec2(Math.cos(angle), Math.sin(angle));\n};\n\n\n/**\n * @return {!goog.math.Vec2} A random vector inside the unit-disc.\n */\ngoog.math.Vec2.random = function() {\n  var mag = Math.sqrt(Math.random());\n  var angle = Math.random() * Math.PI * 2;\n\n  return new goog.math.Vec2(Math.cos(angle) * mag, Math.sin(angle) * mag);\n};\n\n\n/**\n * Returns a new Vec2 object from a given coordinate.\n * @param {!goog.math.Coordinate} a The coordinate.\n * @return {!goog.math.Vec2} A new vector object.\n */\ngoog.math.Vec2.fromCoordinate = function(a) {\n  return new goog.math.Vec2(a.x, a.y);\n};\n\n\n/**\n * @return {!goog.math.Vec2} A new vector with the same coordinates as this one.\n * @override\n */\ngoog.math.Vec2.prototype.clone = function() {\n  return new goog.math.Vec2(this.x, this.y);\n};\n\n\n/**\n * Returns the magnitude of the vector measured from the origin.\n * @return {number} The length of the vector.\n */\ngoog.math.Vec2.prototype.magnitude = function() {\n  return Math.sqrt(this.x * this.x + this.y * this.y);\n};\n\n\n/**\n * Returns the squared magnitude of the vector measured from the origin.\n * NOTE(brenneman): Leaving out the square root is not a significant\n * optimization in JavaScript.\n * @return {number} The length of the vector, squared.\n */\ngoog.math.Vec2.prototype.squaredMagnitude = function() {\n  return this.x * this.x + this.y * this.y;\n};\n\n\n/**\n * @param {number} sx The scale factor to use for the x dimension.\n * @param {number=} opt_sy The scale factor to use for the y dimension.\n * @return {!goog.math.Vec2} This vector after scaling.\n * @override\n */\n// Since the implementation of Coordinate.scale() returns \"this\", we\n// can reuse that implementation here, and just recast the return type.\ngoog.math.Vec2.prototype.scale =\n    /** @type {function(number, number=):!goog.math.Vec2} */\n    (goog.math.Coordinate.prototype.scale);\n\n\n/**\n * Reverses the sign of the vector. Equivalent to scaling the vector by -1.\n * @return {!goog.math.Vec2} The inverted vector.\n */\ngoog.math.Vec2.prototype.invert = function() {\n  this.x = -this.x;\n  this.y = -this.y;\n  return this;\n};\n\n\n/**\n * Normalizes the current vector to have a magnitude of 1.\n * @return {!goog.math.Vec2} The normalized vector.\n */\ngoog.math.Vec2.prototype.normalize = function() {\n  return this.scale(1 / this.magnitude());\n};\n\n\n/**\n * Adds another vector to this vector in-place.\n * @param {!goog.math.Coordinate} b The vector to add.\n * @return {!goog.math.Vec2}  This vector with `b` added.\n */\ngoog.math.Vec2.prototype.add = function(b) {\n  this.x += b.x;\n  this.y += b.y;\n  return this;\n};\n\n\n/**\n * Subtracts another vector from this vector in-place.\n * @param {!goog.math.Coordinate} b The vector to subtract.\n * @return {!goog.math.Vec2} This vector with `b` subtracted.\n */\ngoog.math.Vec2.prototype.subtract = function(b) {\n  this.x -= b.x;\n  this.y -= b.y;\n  return this;\n};\n\n\n/**\n * Rotates this vector in-place by a given angle, specified in radians.\n * @param {number} angle The angle, in radians.\n * @return {!goog.math.Vec2} This vector rotated `angle` radians.\n */\ngoog.math.Vec2.prototype.rotate = function(angle) {\n  var cos = Math.cos(angle);\n  var sin = Math.sin(angle);\n  var newX = this.x * cos - this.y * sin;\n  var newY = this.y * cos + this.x * sin;\n  this.x = newX;\n  this.y = newY;\n  return this;\n};\n\n\n/**\n * Rotates a vector by a given angle, specified in radians, relative to a given\n * axis rotation point. The returned vector is a newly created instance - no\n * in-place changes are done.\n * @param {!goog.math.Vec2} v A vector.\n * @param {!goog.math.Vec2} axisPoint The rotation axis point.\n * @param {number} angle The angle, in radians.\n * @return {!goog.math.Vec2} The rotated vector in a newly created instance.\n */\ngoog.math.Vec2.rotateAroundPoint = function(v, axisPoint, angle) {\n  var res = v.clone();\n  return res.subtract(axisPoint).rotate(angle).add(axisPoint);\n};\n\n\n/** @override */\ngoog.math.Vec2.prototype.equals = function(b) {\n  if (this == b) {\n    return true;\n  }\n  return b instanceof goog.math.Vec2 && !!b && this.x == b.x && this.y == b.y;\n};\n\n\n/**\n * Returns the distance between two vectors.\n * @param {!goog.math.Coordinate} a The first vector.\n * @param {!goog.math.Coordinate} b The second vector.\n * @return {number} The distance.\n */\ngoog.math.Vec2.distance = goog.math.Coordinate.distance;\n\n\n/**\n * Returns the squared distance between two vectors.\n * @param {!goog.math.Coordinate} a The first vector.\n * @param {!goog.math.Coordinate} b The second vector.\n * @return {number} The squared distance.\n */\ngoog.math.Vec2.squaredDistance = goog.math.Coordinate.squaredDistance;\n\n\n/**\n * Compares vectors for equality.\n * @param {!goog.math.Coordinate} a The first vector.\n * @param {!goog.math.Coordinate} b The second vector.\n * @return {boolean} Whether the vectors have the same x and y coordinates.\n */\ngoog.math.Vec2.equals = goog.math.Coordinate.equals;\n\n\n/**\n * Returns the sum of two vectors as a new Vec2.\n * @param {!goog.math.Coordinate} a The first vector.\n * @param {!goog.math.Coordinate} b The second vector.\n * @return {!goog.math.Vec2} The sum vector.\n */\ngoog.math.Vec2.sum = function(a, b) {\n  return new goog.math.Vec2(a.x + b.x, a.y + b.y);\n};\n\n\n/**\n * Returns the difference between two vectors as a new Vec2.\n * @param {!goog.math.Coordinate} a The first vector.\n * @param {!goog.math.Coordinate} b The second vector.\n * @return {!goog.math.Vec2} The difference vector.\n */\ngoog.math.Vec2.difference = function(a, b) {\n  return new goog.math.Vec2(a.x - b.x, a.y - b.y);\n};\n\n\n/**\n * Returns the dot-product of two vectors.\n * @param {!goog.math.Coordinate} a The first vector.\n * @param {!goog.math.Coordinate} b The second vector.\n * @return {number} The dot-product of the two vectors.\n */\ngoog.math.Vec2.dot = function(a, b) {\n  return a.x * b.x + a.y * b.y;\n};\n\n\n/**\n * Returns the determinant of two vectors.\n * @param {!goog.math.Vec2} a The first vector.\n * @param {!goog.math.Vec2} b The second vector.\n * @return {number} The determinant of the two vectors.\n */\ngoog.math.Vec2.determinant = function(a, b) {\n  return a.x * b.y - a.y * b.x;\n};\n\n\n/**\n * Returns a new Vec2 that is the linear interpolant between vectors a and b at\n * scale-value x.\n * @param {!goog.math.Coordinate} a Vector a.\n * @param {!goog.math.Coordinate} b Vector b.\n * @param {number} x The proportion between a and b.\n * @return {!goog.math.Vec2} The interpolated vector.\n */\ngoog.math.Vec2.lerp = function(a, b, x) {\n  return new goog.math.Vec2(\n      goog.math.lerp(a.x, b.x, x), goog.math.lerp(a.y, b.y, x));\n};\n\n\n/**\n * Returns a new Vec2 that is a copy of the vector a, but rescaled by a factors\n * sx and sy in the x and y directions. If only sx is specified, then y is\n * scaled by the same factor as x.\n * @param {!goog.math.Coordinate} a Vector a.\n * @param {number} sx X scale factor.\n * @param {number=} sy Y scale factor (optional).\n * @return {!goog.math.Vec2} A new rescaled vector.\n */\ngoog.math.Vec2.rescaled = function(a, sx, sy = sx) {\n  return new goog.math.Vec2(a.x * sx, a.y * sy);\n};\n","^17",1579837703000,"^18",["^19",["^Z","^26","~$goog.math"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/vec2.js"],"^1J",["^19",["~$goog.math.Vec2"]],"^X",true,"^Y",["^Z","^3>","^26"]],["^ ","^[",[1579837703000],"^10","goog.ui.colormenubutton.js","^11",["^12","goog/ui/colormenubutton.js"],"^13","goog/ui/colormenubutton.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A color menu button.  Extends {@link goog.ui.MenuButton} by\n * showing the currently selected color in the button caption.\n *\n * @author robbyw@google.com (Robby Walker)\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ColorMenuButton');\n\ngoog.require('goog.array');\ngoog.require('goog.object');\ngoog.require('goog.ui.ColorMenuButtonRenderer');\ngoog.require('goog.ui.ColorPalette');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Menu');\ngoog.require('goog.ui.MenuButton');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * A color menu button control.  Extends {@link goog.ui.MenuButton} by adding\n * an API for getting and setting the currently selected color from a menu of\n * color palettes.\n *\n * @param {goog.ui.ControlContent} content Text caption or existing DOM\n *     structure to display as the button's caption.\n * @param {goog.ui.Menu=} opt_menu Menu to render under the button when clicked;\n *     should contain at least one {@link goog.ui.ColorPalette} if present.\n * @param {goog.ui.MenuButtonRenderer=} opt_renderer Button renderer;\n *     defaults to {@link goog.ui.ColorMenuButtonRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.MenuButton}\n */\ngoog.ui.ColorMenuButton = function(\n    content, opt_menu, opt_renderer, opt_domHelper) {\n  goog.ui.MenuButton.call(\n      this, content, opt_menu,\n      opt_renderer || goog.ui.ColorMenuButtonRenderer.getInstance(),\n      opt_domHelper);\n};\ngoog.inherits(goog.ui.ColorMenuButton, goog.ui.MenuButton);\n\n\n/**\n * Default color palettes.\n * @type {!Object}\n */\ngoog.ui.ColorMenuButton.PALETTES = {\n  /** Default grayscale colors. */\n  GRAYSCALE:\n      ['#000', '#444', '#666', '#999', '#ccc', '#eee', '#f3f3f3', '#fff'],\n\n  /** Default solid colors. */\n  SOLID: ['#f00', '#f90', '#ff0', '#0f0', '#0ff', '#00f', '#90f', '#f0f'],\n\n  /** Default pastel colors. */\n  PASTEL: [\n    '#f4cccc', '#fce5cd', '#fff2cc', '#d9ead3', '#d0e0e3', '#cfe2f3', '#d9d2e9',\n    '#ead1dc', '#ea9999', '#f9cb9c', '#ffe599', '#b6d7a8', '#a2c4c9', '#9fc5e8',\n    '#b4a7d6', '#d5a6bd', '#e06666', '#f6b26b', '#ffd966', '#93c47d', '#76a5af',\n    '#6fa8dc', '#8e7cc3', '#c27ba0', '#cc0000', '#e69138', '#f1c232', '#6aa84f',\n    '#45818e', '#3d85c6', '#674ea7', '#a64d79', '#990000', '#b45f06', '#bf9000',\n    '#38761d', '#134f5c', '#0b5394', '#351c75', '#741b47', '#660000', '#783f04',\n    '#7f6000', '#274e13', '#0c343d', '#073763', '#20124d', '#4c1130'\n  ]\n};\n\n\n/**\n * Value for the \"no color\" menu item object in the color menu (if present).\n * The {@link goog.ui.ColorMenuButton#handleMenuAction} method interprets\n * ACTION events dispatched by an item with this value as meaning \"clear the\n * selected color.\"\n * @type {string}\n */\ngoog.ui.ColorMenuButton.NO_COLOR = 'none';\n\n\n/**\n * Factory method that creates and returns a new {@link goog.ui.Menu} instance\n * containing default color palettes.\n * @param {Array<goog.ui.Control>=} opt_extraItems Optional extra menu items to\n *     add before the color palettes.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @return {!goog.ui.Menu} Color menu.\n */\ngoog.ui.ColorMenuButton.newColorMenu = function(opt_extraItems, opt_domHelper) {\n  var menu = new goog.ui.Menu(opt_domHelper);\n\n  if (opt_extraItems) {\n    goog.array.forEach(\n        opt_extraItems, function(item) { menu.addChild(item, true); });\n  }\n\n  goog.object.forEach(goog.ui.ColorMenuButton.PALETTES, function(colors) {\n    var palette = new goog.ui.ColorPalette(colors, null, opt_domHelper);\n    palette.setSize(8);\n    menu.addChild(palette, true);\n  });\n\n  return menu;\n};\n\n\n/**\n * Returns the currently selected color (null if none).\n * @return {string} The selected color.\n */\ngoog.ui.ColorMenuButton.prototype.getSelectedColor = function() {\n  return /** @type {string} */ (this.getValue());\n};\n\n\n/**\n * Sets the selected color, or clears the selected color if the argument is\n * null or not any of the available color choices.\n * @param {?string} color New color.\n */\ngoog.ui.ColorMenuButton.prototype.setSelectedColor = function(color) {\n  this.setValue(color);\n};\n\n\n/**\n * Sets the value associated with the color menu button.  Overrides\n * {@link goog.ui.Button#setValue} by interpreting the value as a color\n * spec string.\n * @param {*} value New button value; should be a color spec string.\n * @override\n */\ngoog.ui.ColorMenuButton.prototype.setValue = function(value) {\n  var color = /** @type {?string} */ (value);\n  for (var i = 0, item; item = this.getItemAt(i); i++) {\n    if (typeof item.setSelectedColor == 'function') {\n      // This menu item looks like a color palette.\n      item.setSelectedColor(color);\n    }\n  }\n  goog.ui.ColorMenuButton.superClass_.setValue.call(this, color);\n};\n\n\n/**\n * Handles {@link goog.ui.Component.EventType.ACTION} events dispatched by\n * the menu item clicked by the user.  Updates the button, calls the superclass\n * implementation to hide the menu, stops the propagation of the event, and\n * dispatches an ACTION event on behalf of the button itself.  Overrides\n * {@link goog.ui.MenuButton#handleMenuAction}.\n * @param {goog.events.Event} e Action event to handle.\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.ColorMenuButton.prototype.handleMenuAction = function(e) {\n  if (typeof e.target.getSelectedColor == 'function') {\n    // User clicked something that looks like a color palette.\n    this.setValue(e.target.getSelectedColor());\n  } else if (e.target.getValue() == goog.ui.ColorMenuButton.NO_COLOR) {\n    // User clicked the special \"no color\" menu item.\n    this.setValue(null);\n  }\n  goog.ui.ColorMenuButton.superClass_.handleMenuAction.call(this, e);\n  e.stopPropagation();\n  this.dispatchEvent(goog.ui.Component.EventType.ACTION);\n};\n\n\n/**\n * Opens or closes the menu.  Overrides {@link goog.ui.MenuButton#setOpen} by\n * generating a default color menu on the fly if needed.\n * @param {boolean} open Whether to open or close the menu.\n * @param {goog.events.Event=} opt_e Mousedown event that caused the menu to\n *     be opened.\n * @override\n */\ngoog.ui.ColorMenuButton.prototype.setOpen = function(open, opt_e) {\n  if (open && this.getItemCount() == 0) {\n    this.setMenu(\n        goog.ui.ColorMenuButton.newColorMenu(null, this.getDomHelper()));\n    this.setValue(/** @type {?string} */ (this.getValue()));\n  }\n  goog.ui.ColorMenuButton.superClass_.setOpen.call(this, open, opt_e);\n};\n\n\n// Register a decorator factory function for goog.ui.ColorMenuButtons.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.ColorMenuButtonRenderer.CSS_CLASS,\n    function() { return new goog.ui.ColorMenuButton(null); });\n","^17",1579837703000,"^18",["^19",["^22","~$goog.ui.MenuButton","^Z","^2G","~$goog.ui.registry","~$goog.ui.Menu","~$goog.ui.ColorPalette","~$goog.ui.ColorMenuButtonRenderer","^35"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/colormenubutton.js"],"^1J",["^19",["~$goog.ui.ColorMenuButton"]],"^X",true,"^Y",["^Z","^35","^2G","^3D","^3C","^22","^3B","^3@","^3A"]],["^ ","^[",[1579837703000],"^10","goog.style.style.js","^11",["^12","goog/style/style.js"],"^13","goog/style/style.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for element styles.\n *\n * @author arv@google.com (Erik Arvidsson)\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/inline_block_quirks.html\n * @see ../demos/inline_block_standards.html\n * @see ../demos/style_viewport.html\n */\n\ngoog.provide('goog.style');\n\n\ngoog.forwardDeclare('goog.events.Event');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.vendor');\ngoog.require('goog.html.SafeStyleSheet');\ngoog.require('goog.math.Box');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.math.Rect');\ngoog.require('goog.math.Size');\ngoog.require('goog.object');\ngoog.require('goog.reflect');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n/**\n * Sets a style value on an element.\n *\n * This function is not indended to patch issues in the browser's style\n * handling, but to allow easy programmatic access to setting dash-separated\n * style properties.  An example is setting a batch of properties from a data\n * object without overwriting old styles.  When possible, use native APIs:\n * elem.style.propertyKey = 'value' or (if obliterating old styles is fine)\n * elem.style.cssText = 'property1: value1; property2: value2'.\n *\n * @param {Element} element The element to change.\n * @param {string|Object} style If a string, a style name. If an object, a hash\n *     of style names to style values.\n * @param {string|number|boolean=} opt_value If style was a string, then this\n *     should be the value.\n */\ngoog.style.setStyle = function(element, style, opt_value) {\n  if (typeof style === 'string') {\n    goog.style.setStyle_(element, opt_value, style);\n  } else {\n    for (var key in style) {\n      goog.style.setStyle_(element, style[key], key);\n    }\n  }\n};\n\n\n/**\n * Sets a style value on an element, with parameters swapped to work with\n * `goog.object.forEach()`. Prepends a vendor-specific prefix when\n * necessary.\n * @param {Element} element The element to change.\n * @param {string|number|boolean|undefined} value Style value.\n * @param {string} style Style name.\n * @private\n */\ngoog.style.setStyle_ = function(element, value, style) {\n  var propertyName = goog.style.getVendorJsStyleName_(element, style);\n\n  if (propertyName) {\n    // TODO(johnlenz): coerce to string?\n    element.style[propertyName] = /** @type {?} */ (value);\n  }\n};\n\n\n/**\n * Style name cache that stores previous property name lookups.\n *\n * This is used by setStyle to speed up property lookups, entries look like:\n *   { StyleName: ActualPropertyName }\n *\n * @private {!Object<string, string>}\n */\ngoog.style.styleNameCache_ = {};\n\n\n/**\n * Returns the style property name in camel-case. If it does not exist and a\n * vendor-specific version of the property does exist, then return the vendor-\n * specific property name instead.\n * @param {Element} element The element to change.\n * @param {string} style Style name.\n * @return {string} Vendor-specific style.\n * @private\n */\ngoog.style.getVendorJsStyleName_ = function(element, style) {\n  var propertyName = goog.style.styleNameCache_[style];\n  if (!propertyName) {\n    var camelStyle = goog.string.toCamelCase(style);\n    propertyName = camelStyle;\n\n    if (element.style[camelStyle] === undefined) {\n      var prefixedStyle = goog.dom.vendor.getVendorJsPrefix() +\n          goog.string.toTitleCase(camelStyle);\n\n      if (element.style[prefixedStyle] !== undefined) {\n        propertyName = prefixedStyle;\n      }\n    }\n    goog.style.styleNameCache_[style] = propertyName;\n  }\n\n  return propertyName;\n};\n\n\n/**\n * Returns the style property name in CSS notation. If it does not exist and a\n * vendor-specific version of the property does exist, then return the vendor-\n * specific property name instead.\n * @param {Element} element The element to change.\n * @param {string} style Style name.\n * @return {string} Vendor-specific style.\n * @private\n */\ngoog.style.getVendorStyleName_ = function(element, style) {\n  var camelStyle = goog.string.toCamelCase(style);\n\n  if (element.style[camelStyle] === undefined) {\n    var prefixedStyle = goog.dom.vendor.getVendorJsPrefix() +\n        goog.string.toTitleCase(camelStyle);\n\n    if (element.style[prefixedStyle] !== undefined) {\n      return goog.dom.vendor.getVendorPrefix() + '-' + style;\n    }\n  }\n\n  return style;\n};\n\n\n/**\n * Retrieves an explicitly-set style value of a node. This returns '' if there\n * isn't a style attribute on the element or if this style property has not been\n * explicitly set in script.\n *\n * @param {Element} element Element to get style of.\n * @param {string} property Property to get, css-style (if you have a camel-case\n * property, use element.style[style]).\n * @return {string} Style value.\n */\ngoog.style.getStyle = function(element, property) {\n  // element.style is '' for well-known properties which are unset.\n  // For for browser specific styles as 'filter' is undefined\n  // so we need to return '' explicitly to make it consistent across\n  // browsers.\n  var styleValue = element.style[goog.string.toCamelCase(property)];\n\n  // Using typeof here because of a bug in Safari 5.1, where this value\n  // was undefined, but === undefined returned false.\n  if (typeof(styleValue) !== 'undefined') {\n    return styleValue;\n  }\n\n  return element.style[goog.style.getVendorJsStyleName_(element, property)] ||\n      '';\n};\n\n\n/**\n * Retrieves a computed style value of a node. It returns empty string if the\n * value cannot be computed (which will be the case in Internet Explorer) or\n * \"none\" if the property requested is an SVG one and it has not been\n * explicitly set (firefox and webkit).\n *\n * @param {Element} element Element to get style of.\n * @param {string} property Property to get (camel-case).\n * @return {string} Style value.\n */\ngoog.style.getComputedStyle = function(element, property) {\n  var doc = goog.dom.getOwnerDocument(element);\n  if (doc.defaultView && doc.defaultView.getComputedStyle) {\n    var styles = doc.defaultView.getComputedStyle(element, null);\n    if (styles) {\n      // element.style[..] is undefined for browser specific styles\n      // as 'filter'.\n      return styles[property] || styles.getPropertyValue(property) || '';\n    }\n  }\n\n  return '';\n};\n\n\n/**\n * Gets the cascaded style value of a node, or null if the value cannot be\n * computed (only Internet Explorer can do this).\n *\n * @param {Element} element Element to get style of.\n * @param {string} style Property to get (camel-case).\n * @return {string} Style value.\n */\ngoog.style.getCascadedStyle = function(element, style) {\n  // TODO(nicksantos): This should be documented to return null. #fixTypes\n  return /** @type {string} */ (\n      element.currentStyle ? element.currentStyle[style] : null);\n};\n\n\n/**\n * Cross-browser pseudo get computed style. It returns the computed style where\n * available. If not available it tries the cascaded style value (IE\n * currentStyle) and in worst case the inline style value.  It shouldn't be\n * called directly, see http://wiki/Main/ComputedStyleVsCascadedStyle for\n * discussion.\n *\n * @param {Element} element Element to get style of.\n * @param {string} style Property to get (must be camelCase, not css-style.).\n * @return {string} Style value.\n * @private\n */\ngoog.style.getStyle_ = function(element, style) {\n  return goog.style.getComputedStyle(element, style) ||\n      goog.style.getCascadedStyle(element, style) ||\n      (element.style && element.style[style]);\n};\n\n\n/**\n * Retrieves the computed value of the box-sizing CSS attribute.\n * Browser support: http://caniuse.com/css3-boxsizing.\n * @param {!Element} element The element whose box-sizing to get.\n * @return {?string} 'content-box', 'border-box' or 'padding-box'. null if\n *     box-sizing is not supported (IE7 and below).\n */\ngoog.style.getComputedBoxSizing = function(element) {\n  return goog.style.getStyle_(element, 'boxSizing') ||\n      goog.style.getStyle_(element, 'MozBoxSizing') ||\n      goog.style.getStyle_(element, 'WebkitBoxSizing') || null;\n};\n\n\n/**\n * Retrieves the computed value of the position CSS attribute.\n * @param {Element} element The element to get the position of.\n * @return {string} Position value.\n */\ngoog.style.getComputedPosition = function(element) {\n  return goog.style.getStyle_(element, 'position');\n};\n\n\n/**\n * Retrieves the computed background color string for a given element. The\n * string returned is suitable for assigning to another element's\n * background-color, but is not guaranteed to be in any particular string\n * format. Accessing the color in a numeric form may not be possible in all\n * browsers or with all input.\n *\n * If the background color for the element is defined as a hexadecimal value,\n * the resulting string can be parsed by goog.color.parse in all supported\n * browsers.\n *\n * Whether named colors like \"red\" or \"lightblue\" get translated into a\n * format which can be parsed is browser dependent. Calling this function on\n * transparent elements will return \"transparent\" in most browsers or\n * \"rgba(0, 0, 0, 0)\" in WebKit.\n * @param {Element} element The element to get the background color of.\n * @return {string} The computed string value of the background color.\n */\ngoog.style.getBackgroundColor = function(element) {\n  return goog.style.getStyle_(element, 'backgroundColor');\n};\n\n\n/**\n * Retrieves the computed value of the overflow-x CSS attribute.\n * @param {Element} element The element to get the overflow-x of.\n * @return {string} The computed string value of the overflow-x attribute.\n */\ngoog.style.getComputedOverflowX = function(element) {\n  return goog.style.getStyle_(element, 'overflowX');\n};\n\n\n/**\n * Retrieves the computed value of the overflow-y CSS attribute.\n * @param {Element} element The element to get the overflow-y of.\n * @return {string} The computed string value of the overflow-y attribute.\n */\ngoog.style.getComputedOverflowY = function(element) {\n  return goog.style.getStyle_(element, 'overflowY');\n};\n\n\n/**\n * Retrieves the computed value of the z-index CSS attribute.\n * @param {Element} element The element to get the z-index of.\n * @return {string|number} The computed value of the z-index attribute.\n */\ngoog.style.getComputedZIndex = function(element) {\n  return goog.style.getStyle_(element, 'zIndex');\n};\n\n\n/**\n * Retrieves the computed value of the text-align CSS attribute.\n * @param {Element} element The element to get the text-align of.\n * @return {string} The computed string value of the text-align attribute.\n */\ngoog.style.getComputedTextAlign = function(element) {\n  return goog.style.getStyle_(element, 'textAlign');\n};\n\n\n/**\n * Retrieves the computed value of the cursor CSS attribute.\n * @param {Element} element The element to get the cursor of.\n * @return {string} The computed string value of the cursor attribute.\n */\ngoog.style.getComputedCursor = function(element) {\n  return goog.style.getStyle_(element, 'cursor');\n};\n\n\n/**\n * Retrieves the computed value of the CSS transform attribute.\n * @param {Element} element The element to get the transform of.\n * @return {string} The computed string representation of the transform matrix.\n */\ngoog.style.getComputedTransform = function(element) {\n  var property = goog.style.getVendorStyleName_(element, 'transform');\n  return goog.style.getStyle_(element, property) ||\n      goog.style.getStyle_(element, 'transform');\n};\n\n\n/**\n * Sets the top/left values of an element.  If no unit is specified in the\n * argument then it will add px. The second argument is required if the first\n * argument is a string or number and is ignored if the first argument\n * is a coordinate.\n * @param {Element} el Element to move.\n * @param {string|number|goog.math.Coordinate} arg1 Left position or coordinate.\n * @param {string|number=} opt_arg2 Top position.\n */\ngoog.style.setPosition = function(el, arg1, opt_arg2) {\n  var x, y;\n\n  if (arg1 instanceof goog.math.Coordinate) {\n    x = arg1.x;\n    y = arg1.y;\n  } else {\n    x = arg1;\n    y = opt_arg2;\n  }\n\n  el.style.left = goog.style.getPixelStyleValue_(\n      /** @type {number|string} */ (x), false);\n  el.style.top = goog.style.getPixelStyleValue_(\n      /** @type {number|string} */ (y), false);\n};\n\n\n/**\n * Gets the offsetLeft and offsetTop properties of an element and returns them\n * in a Coordinate object\n * @param {Element} element Element.\n * @return {!goog.math.Coordinate} The position.\n */\ngoog.style.getPosition = function(element) {\n  return new goog.math.Coordinate(\n      /** @type {!HTMLElement} */ (element).offsetLeft,\n      /** @type {!HTMLElement} */ (element).offsetTop);\n};\n\n\n/**\n * Returns the viewport element for a particular document\n * @param {Node=} opt_node DOM node (Document is OK) to get the viewport element\n *     of.\n * @return {Element} document.documentElement or document.body.\n */\ngoog.style.getClientViewportElement = function(opt_node) {\n  var doc;\n  if (opt_node) {\n    doc = goog.dom.getOwnerDocument(opt_node);\n  } else {\n    doc = goog.dom.getDocument();\n  }\n\n  // In old IE versions the document.body represented the viewport\n  if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9) &&\n      !goog.dom.getDomHelper(doc).isCss1CompatMode()) {\n    return doc.body;\n  }\n  return doc.documentElement;\n};\n\n\n/**\n * Calculates the viewport coordinates relative to the page/document\n * containing the node. The viewport may be the browser viewport for\n * non-iframe document, or the iframe container for iframe'd document.\n * @param {!Document} doc The document to use as the reference point.\n * @return {!goog.math.Coordinate} The page offset of the viewport.\n */\ngoog.style.getViewportPageOffset = function(doc) {\n  var body = doc.body;\n  var documentElement = doc.documentElement;\n  var scrollLeft = body.scrollLeft || documentElement.scrollLeft;\n  var scrollTop = body.scrollTop || documentElement.scrollTop;\n  return new goog.math.Coordinate(scrollLeft, scrollTop);\n};\n\n\n/**\n * Gets the client rectangle of the DOM element.\n *\n * getBoundingClientRect is part of a new CSS object model draft (with a\n * long-time presence in IE), replacing the error-prone parent offset\n * computation and the now-deprecated Gecko getBoxObjectFor.\n *\n * This utility patches common browser bugs in getBoundingClientRect. It\n * will fail if getBoundingClientRect is unsupported.\n *\n * If the element is not in the DOM, the result is undefined, and an error may\n * be thrown depending on user agent.\n *\n * @param {!Element} el The element whose bounding rectangle is being queried.\n * @return {Object} A native bounding rectangle with numerical left, top,\n *     right, and bottom.  Reported by Firefox to be of object type ClientRect.\n * @private\n */\ngoog.style.getBoundingClientRect_ = function(el) {\n  var rect;\n  try {\n    rect = el.getBoundingClientRect();\n  } catch (e) {\n    // In IE < 9, calling getBoundingClientRect on an orphan element raises an\n    // \"Unspecified Error\". All other browsers return zeros.\n    return {'left': 0, 'top': 0, 'right': 0, 'bottom': 0};\n  }\n\n  // Patch the result in IE only, so that this function can be inlined if\n  // compiled for non-IE.\n  if (goog.userAgent.IE && el.ownerDocument.body) {\n    // In IE, most of the time, 2 extra pixels are added to the top and left\n    // due to the implicit 2-pixel inset border.  In IE6/7 quirks mode and\n    // IE6 standards mode, this border can be overridden by setting the\n    // document element's border to zero -- thus, we cannot rely on the\n    // offset always being 2 pixels.\n\n    // In quirks mode, the offset can be determined by querying the body's\n    // clientLeft/clientTop, but in standards mode, it is found by querying\n    // the document element's clientLeft/clientTop.  Since we already called\n    // getBoundingClientRect we have already forced a reflow, so it is not\n    // too expensive just to query them all.\n\n    // See: http://msdn.microsoft.com/en-us/library/ms536433(VS.85).aspx\n    var doc = el.ownerDocument;\n    rect.left -= doc.documentElement.clientLeft + doc.body.clientLeft;\n    rect.top -= doc.documentElement.clientTop + doc.body.clientTop;\n  }\n  return rect;\n};\n\n\n/**\n * Returns the first parent that could affect the position of a given element.\n * @param {Element} element The element to get the offset parent for.\n * @return {Element} The first offset parent or null if one cannot be found.\n */\ngoog.style.getOffsetParent = function(element) {\n  // element.offsetParent does the right thing in IE7 and below.  In other\n  // browsers it only includes elements with position absolute, relative or\n  // fixed, not elements with overflow set to auto or scroll.\n  if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(8)) {\n    goog.asserts.assert(element && 'offsetParent' in element);\n    return element.offsetParent;\n  }\n\n  var doc = goog.dom.getOwnerDocument(element);\n  var positionStyle = goog.style.getStyle_(element, 'position');\n  var skipStatic = positionStyle == 'fixed' || positionStyle == 'absolute';\n  for (var parent = element.parentNode; parent && parent != doc;\n       parent = parent.parentNode) {\n    // Skip shadowDOM roots.\n    if (parent.nodeType == goog.dom.NodeType.DOCUMENT_FRAGMENT && parent.host) {\n      // Cast because the assignment is not type safe, and without a cast we\n      // start typing parent loosely and get bad disambiguation.\n      parent = /** @type {!Element} */ (parent.host);\n    }\n    positionStyle =\n        goog.style.getStyle_(/** @type {!Element} */ (parent), 'position');\n    skipStatic = skipStatic && positionStyle == 'static' &&\n        parent != doc.documentElement && parent != doc.body;\n    if (!skipStatic &&\n        (parent.scrollWidth > parent.clientWidth ||\n         parent.scrollHeight > parent.clientHeight ||\n         positionStyle == 'fixed' || positionStyle == 'absolute' ||\n         positionStyle == 'relative')) {\n      return /** @type {!Element} */ (parent);\n    }\n  }\n  return null;\n};\n\n\n/**\n * Calculates and returns the visible rectangle for a given element. Returns a\n * box describing the visible portion of the nearest scrollable offset ancestor.\n * Coordinates are given relative to the document.\n *\n * @param {Element} element Element to get the visible rect for.\n * @return {goog.math.Box} Bounding elementBox describing the visible rect or\n *     null if scrollable ancestor isn't inside the visible viewport.\n */\ngoog.style.getVisibleRectForElement = function(element) {\n  var visibleRect = new goog.math.Box(0, Infinity, Infinity, 0);\n  var dom = goog.dom.getDomHelper(element);\n  var body = dom.getDocument().body;\n  var documentElement = dom.getDocument().documentElement;\n  var scrollEl = dom.getDocumentScrollElement();\n\n  // Determine the size of the visible rect by climbing the dom accounting for\n  // all scrollable containers.\n  for (var el = element; el = goog.style.getOffsetParent(el);) {\n    // clientWidth is zero for inline block elements in IE.\n    // on WEBKIT, body element can have clientHeight = 0 and scrollHeight > 0\n    if ((!goog.userAgent.IE || el.clientWidth != 0) &&\n        (!goog.userAgent.WEBKIT || el.clientHeight != 0 || el != body) &&\n        // body may have overflow set on it, yet we still get the entire\n        // viewport. In some browsers, el.offsetParent may be\n        // document.documentElement, so check for that too.\n        (el != body && el != documentElement &&\n         goog.style.getStyle_(el, 'overflow') != 'visible')) {\n      var pos = goog.style.getPageOffset(el);\n      var client = goog.style.getClientLeftTop(el);\n      pos.x += client.x;\n      pos.y += client.y;\n\n      visibleRect.top = Math.max(visibleRect.top, pos.y);\n      visibleRect.right = Math.min(visibleRect.right, pos.x + el.clientWidth);\n      visibleRect.bottom =\n          Math.min(visibleRect.bottom, pos.y + el.clientHeight);\n      visibleRect.left = Math.max(visibleRect.left, pos.x);\n    }\n  }\n\n  // Clip by window's viewport.\n  var scrollX = scrollEl.scrollLeft, scrollY = scrollEl.scrollTop;\n  visibleRect.left = Math.max(visibleRect.left, scrollX);\n  visibleRect.top = Math.max(visibleRect.top, scrollY);\n  var winSize = dom.getViewportSize();\n  visibleRect.right = Math.min(visibleRect.right, scrollX + winSize.width);\n  visibleRect.bottom = Math.min(visibleRect.bottom, scrollY + winSize.height);\n  return visibleRect.top >= 0 && visibleRect.left >= 0 &&\n          visibleRect.bottom > visibleRect.top &&\n          visibleRect.right > visibleRect.left ?\n      visibleRect :\n      null;\n};\n\n\n/**\n * Calculate the scroll position of `container` with the minimum amount so\n * that the content and the borders of the given `element` become visible.\n * If the element is bigger than the container, its top left corner will be\n * aligned as close to the container's top left corner as possible.\n *\n * @param {Element} element The element to make visible.\n * @param {Element=} opt_container The container to scroll. If not set, then the\n *     document scroll element will be used.\n * @param {boolean=} opt_center Whether to center the element in the container.\n *     Defaults to false.\n * @return {!goog.math.Coordinate} The new scroll position of the container,\n *     in form of goog.math.Coordinate(scrollLeft, scrollTop).\n */\ngoog.style.getContainerOffsetToScrollInto = function(\n    element, opt_container, opt_center) {\n  var container = opt_container || goog.dom.getDocumentScrollElement();\n  // Absolute position of the element's border's top left corner.\n  var elementPos = goog.style.getPageOffset(element);\n  // Absolute position of the container's border's top left corner.\n  var containerPos = goog.style.getPageOffset(container);\n  var containerBorder = goog.style.getBorderBox(container);\n  if (container == goog.dom.getDocumentScrollElement()) {\n    // The element position is calculated based on the page offset, and the\n    // document scroll element holds the scroll position within the page. We can\n    // use the scroll position to calculate the relative position from the\n    // element.\n    var relX = elementPos.x - container.scrollLeft;\n    var relY = elementPos.y - container.scrollTop;\n    if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(10)) {\n      // In older versions of IE getPageOffset(element) does not include the\n      // container border so it has to be added to accommodate.\n      relX += containerBorder.left;\n      relY += containerBorder.top;\n    }\n  } else {\n    // Relative pos. of the element's border box to the container's content box.\n    var relX = elementPos.x - containerPos.x - containerBorder.left;\n    var relY = elementPos.y - containerPos.y - containerBorder.top;\n  }\n  // How much the element can move in the container, i.e. the difference between\n  // the element's bottom-right-most and top-left-most position where it's\n  // fully visible.\n  var elementSize = goog.style.getSizeWithDisplay_(element);\n  var spaceX = container.clientWidth - elementSize.width;\n  var spaceY = container.clientHeight - elementSize.height;\n  var scrollLeft = container.scrollLeft;\n  var scrollTop = container.scrollTop;\n  if (opt_center) {\n    // All browsers round non-integer scroll positions down.\n    scrollLeft += relX - spaceX / 2;\n    scrollTop += relY - spaceY / 2;\n  } else {\n    // This formula was designed to give the correct scroll values in the\n    // following cases:\n    // - element is higher than container (spaceY < 0) => scroll down by relY\n    // - element is not higher that container (spaceY >= 0):\n    //   - it is above container (relY < 0) => scroll up by abs(relY)\n    //   - it is below container (relY > spaceY) => scroll down by relY - spaceY\n    //   - it is in the container => don't scroll\n    scrollLeft += Math.min(relX, Math.max(relX - spaceX, 0));\n    scrollTop += Math.min(relY, Math.max(relY - spaceY, 0));\n  }\n  return new goog.math.Coordinate(scrollLeft, scrollTop);\n};\n\n\n/**\n * Changes the scroll position of `container` with the minimum amount so\n * that the content and the borders of the given `element` become visible.\n * If the element is bigger than the container, its top left corner will be\n * aligned as close to the container's top left corner as possible.\n *\n * @param {Element} element The element to make visible.\n * @param {Element=} opt_container The container to scroll. If not set, then the\n *     document scroll element will be used.\n * @param {boolean=} opt_center Whether to center the element in the container.\n *     Defaults to false.\n */\ngoog.style.scrollIntoContainerView = function(\n    element, opt_container, opt_center) {\n  var container = opt_container || goog.dom.getDocumentScrollElement();\n  var offset =\n      goog.style.getContainerOffsetToScrollInto(element, container, opt_center);\n  container.scrollLeft = offset.x;\n  container.scrollTop = offset.y;\n};\n\n\n/**\n * Returns clientLeft (width of the left border and, if the directionality is\n * right to left, the vertical scrollbar) and clientTop as a coordinate object.\n *\n * @param {Element} el Element to get clientLeft for.\n * @return {!goog.math.Coordinate} Client left and top.\n */\ngoog.style.getClientLeftTop = function(el) {\n  return new goog.math.Coordinate(el.clientLeft, el.clientTop);\n};\n\n\n/**\n * Returns a Coordinate object relative to the top-left of the HTML document.\n * Implemented as a single function to save having to do two recursive loops in\n * opera and safari just to get both coordinates.  If you just want one value do\n * use goog.style.getPageOffsetLeft() and goog.style.getPageOffsetTop(), but\n * note if you call both those methods the tree will be analysed twice.\n *\n * @param {Element} el Element to get the page offset for.\n * @return {!goog.math.Coordinate} The page offset.\n */\ngoog.style.getPageOffset = function(el) {\n  var doc = goog.dom.getOwnerDocument(el);\n  // TODO(gboyer): Update the jsdoc in a way that doesn't break the universe.\n  goog.asserts.assertObject(el, 'Parameter is required');\n\n  // NOTE(arv): If element is hidden (display none or disconnected or any the\n  // ancestors are hidden) we get (0,0) by default but we still do the\n  // accumulation of scroll position.\n\n  // TODO(arv): Should we check if the node is disconnected and in that case\n  //            return (0,0)?\n\n  var pos = new goog.math.Coordinate(0, 0);\n  var viewportElement = goog.style.getClientViewportElement(doc);\n  if (el == viewportElement) {\n    // viewport is always at 0,0 as that defined the coordinate system for this\n    // function - this avoids special case checks in the code below\n    return pos;\n  }\n\n  var box = goog.style.getBoundingClientRect_(el);\n  // Must add the scroll coordinates in to get the absolute page offset\n  // of element since getBoundingClientRect returns relative coordinates to\n  // the viewport.\n  var scrollCoord = goog.dom.getDomHelper(doc).getDocumentScroll();\n  pos.x = box.left + scrollCoord.x;\n  pos.y = box.top + scrollCoord.y;\n\n  return pos;\n};\n\n\n/**\n * Returns the left coordinate of an element relative to the HTML document\n * @param {Element} el Elements.\n * @return {number} The left coordinate.\n */\ngoog.style.getPageOffsetLeft = function(el) {\n  return goog.style.getPageOffset(el).x;\n};\n\n\n/**\n * Returns the top coordinate of an element relative to the HTML document\n * @param {Element} el Elements.\n * @return {number} The top coordinate.\n */\ngoog.style.getPageOffsetTop = function(el) {\n  return goog.style.getPageOffset(el).y;\n};\n\n\n/**\n * Returns a Coordinate object relative to the top-left of an HTML document\n * in an ancestor frame of this element. Used for measuring the position of\n * an element inside a frame relative to a containing frame.\n *\n * @param {Element} el Element to get the page offset for.\n * @param {Window} relativeWin The window to measure relative to. If relativeWin\n *     is not in the ancestor frame chain of the element, we measure relative to\n *     the top-most window.\n * @return {!goog.math.Coordinate} The page offset.\n */\ngoog.style.getFramedPageOffset = function(el, relativeWin) {\n  var position = new goog.math.Coordinate(0, 0);\n\n  // Iterate up the ancestor frame chain, keeping track of the current window\n  // and the current element in that window.\n  var currentWin = goog.dom.getWindow(goog.dom.getOwnerDocument(el));\n\n  // MS Edge throws when accessing \"parent\" if el's containing iframe has been\n  // deleted.\n  if (!goog.reflect.canAccessProperty(currentWin, 'parent')) {\n    return position;\n  }\n\n  var currentEl = el;\n  do {\n    // if we're at the top window, we want to get the page offset.\n    // if we're at an inner frame, we only want to get the window position\n    // so that we can determine the actual page offset in the context of\n    // the outer window.\n    var offset = currentWin == relativeWin ?\n        goog.style.getPageOffset(currentEl) :\n        goog.style.getClientPositionForElement_(goog.asserts.assert(currentEl));\n\n    position.x += offset.x;\n    position.y += offset.y;\n  } while (currentWin && currentWin != relativeWin &&\n           currentWin != currentWin.parent &&\n           (currentEl = currentWin.frameElement) &&\n           (currentWin = currentWin.parent));\n\n  return position;\n};\n\n\n/**\n * Translates the specified rect relative to origBase page, for newBase page.\n * If origBase and newBase are the same, this function does nothing.\n *\n * @param {goog.math.Rect} rect The source rectangle relative to origBase page,\n *     and it will have the translated result.\n * @param {goog.dom.DomHelper} origBase The DomHelper for the input rectangle.\n * @param {goog.dom.DomHelper} newBase The DomHelper for the resultant\n *     coordinate.  This must be a DOM for an ancestor frame of origBase\n *     or the same as origBase.\n */\ngoog.style.translateRectForAnotherFrame = function(rect, origBase, newBase) {\n  if (origBase.getDocument() != newBase.getDocument()) {\n    var body = origBase.getDocument().body;\n    var pos = goog.style.getFramedPageOffset(body, newBase.getWindow());\n\n    // Adjust Body's margin.\n    pos = goog.math.Coordinate.difference(pos, goog.style.getPageOffset(body));\n\n    if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9) &&\n        !origBase.isCss1CompatMode()) {\n      pos = goog.math.Coordinate.difference(pos, origBase.getDocumentScroll());\n    }\n\n    rect.left += pos.x;\n    rect.top += pos.y;\n  }\n};\n\n\n/**\n * Returns the position of an element relative to another element in the\n * document.  A relative to B\n * @param {Element|Event|goog.events.Event} a Element or mouse event whose\n *     position we're calculating.\n * @param {Element|Event|goog.events.Event} b Element or mouse event position\n *     is relative to.\n * @return {!goog.math.Coordinate} The relative position.\n */\ngoog.style.getRelativePosition = function(a, b) {\n  var ap = goog.style.getClientPosition(a);\n  var bp = goog.style.getClientPosition(b);\n  return new goog.math.Coordinate(ap.x - bp.x, ap.y - bp.y);\n};\n\n\n/**\n * Returns the position of the event or the element's border box relative to\n * the client viewport.\n * @param {!Element} el Element whose position to get.\n * @return {!goog.math.Coordinate} The position.\n * @private\n */\ngoog.style.getClientPositionForElement_ = function(el) {\n  var box = goog.style.getBoundingClientRect_(el);\n  return new goog.math.Coordinate(box.left, box.top);\n};\n\n\n/**\n * Returns the position of the event or the element's border box relative to\n * the client viewport. If an event is passed, and if this event is a \"touch\"\n * event, then the position of the first changedTouches will be returned.\n * @param {Element|Event|goog.events.Event} el Element or a mouse / touch event.\n * @return {!goog.math.Coordinate} The position.\n */\ngoog.style.getClientPosition = function(el) {\n  goog.asserts.assert(el);\n  if (el.nodeType == goog.dom.NodeType.ELEMENT) {\n    return goog.style.getClientPositionForElement_(\n        /** @type {!Element} */ (el));\n  } else {\n    var targetEvent = el.changedTouches ? el.changedTouches[0] : el;\n    return new goog.math.Coordinate(targetEvent.clientX, targetEvent.clientY);\n  }\n};\n\n\n/**\n * Moves an element to the given coordinates relative to the client viewport.\n * @param {Element} el Absolutely positioned element to set page offset for.\n *     It must be in the document.\n * @param {number|goog.math.Coordinate} x Left position of the element's margin\n *     box or a coordinate object.\n * @param {number=} opt_y Top position of the element's margin box.\n */\ngoog.style.setPageOffset = function(el, x, opt_y) {\n  // Get current pageoffset\n  var cur = goog.style.getPageOffset(el);\n\n  if (x instanceof goog.math.Coordinate) {\n    opt_y = x.y;\n    x = x.x;\n  }\n\n  // NOTE(arv): We cannot allow strings for x and y. We could but that would\n  // require us to manually transform between different units\n\n  // Work out deltas\n  var dx = goog.asserts.assertNumber(x) - cur.x;\n  var dy = Number(opt_y) - cur.y;\n\n  // Set position to current left/top + delta\n  goog.style.setPosition(\n      el, /** @type {!HTMLElement} */ (el).offsetLeft + dx,\n      /** @type {!HTMLElement} */ (el).offsetTop + dy);\n};\n\n\n/**\n * Sets the width/height values of an element.  If an argument is numeric,\n * or a goog.math.Size is passed, it is assumed to be pixels and will add\n * 'px' after converting it to an integer in string form. (This just sets the\n * CSS width and height properties so it might set content-box or border-box\n * size depending on the box model the browser is using.)\n *\n * @param {Element} element Element to set the size of.\n * @param {string|number|goog.math.Size} w Width of the element, or a\n *     size object.\n * @param {string|number=} opt_h Height of the element. Required if w is not a\n *     size object.\n */\ngoog.style.setSize = function(element, w, opt_h) {\n  var h;\n  if (w instanceof goog.math.Size) {\n    h = w.height;\n    w = w.width;\n  } else {\n    if (opt_h == undefined) {\n      throw new Error('missing height argument');\n    }\n    h = opt_h;\n  }\n\n  goog.style.setWidth(element, /** @type {string|number} */ (w));\n  goog.style.setHeight(element, h);\n};\n\n\n/**\n * Helper function to create a string to be set into a pixel-value style\n * property of an element. Can round to the nearest integer value.\n *\n * @param {string|number} value The style value to be used. If a number,\n *     'px' will be appended, otherwise the value will be applied directly.\n * @param {boolean} round Whether to round the nearest integer (if property\n *     is a number).\n * @return {string} The string value for the property.\n * @private\n */\ngoog.style.getPixelStyleValue_ = function(value, round) {\n  if (typeof value == 'number') {\n    value = (round ? Math.round(value) : value) + 'px';\n  }\n\n  return value;\n};\n\n\n/**\n * Set the height of an element.  Sets the element's style property.\n * @param {Element} element Element to set the height of.\n * @param {string|number} height The height value to set.  If a number, 'px'\n *     will be appended, otherwise the value will be applied directly.\n */\ngoog.style.setHeight = function(element, height) {\n  element.style.height = goog.style.getPixelStyleValue_(height, true);\n};\n\n\n/**\n * Set the width of an element.  Sets the element's style property.\n * @param {Element} element Element to set the width of.\n * @param {string|number} width The width value to set.  If a number, 'px'\n *     will be appended, otherwise the value will be applied directly.\n */\ngoog.style.setWidth = function(element, width) {\n  element.style.width = goog.style.getPixelStyleValue_(width, true);\n};\n\n\n/**\n * Gets the height and width of an element, even if its display is none.\n *\n * Specifically, this returns the height and width of the border box,\n * irrespective of the box model in effect.\n *\n * Note that this function does not take CSS transforms into account. Please see\n * `goog.style.getTransformedSize`.\n * @param {Element} element Element to get size of.\n * @return {!goog.math.Size} Object with width/height properties.\n */\ngoog.style.getSize = function(element) {\n  return goog.style.evaluateWithTemporaryDisplay_(\n      goog.style.getSizeWithDisplay_, /** @type {!Element} */ (element));\n};\n\n\n/**\n * Call `fn` on `element` such that `element`'s dimensions are\n * accurate when it's passed to `fn`.\n * @param {function(!Element): T} fn Function to call with `element` as\n *     an argument after temporarily changing `element`'s display such\n *     that its dimensions are accurate.\n * @param {!Element} element Element (which may have display none) to use as\n *     argument to `fn`.\n * @return {T} Value returned by calling `fn` with `element`.\n * @template T\n * @private\n */\ngoog.style.evaluateWithTemporaryDisplay_ = function(fn, element) {\n  if (goog.style.getStyle_(element, 'display') != 'none') {\n    return fn(element);\n  }\n\n  var style = element.style;\n  var originalDisplay = style.display;\n  var originalVisibility = style.visibility;\n  var originalPosition = style.position;\n\n  style.visibility = 'hidden';\n  style.position = 'absolute';\n  style.display = 'inline';\n\n  var retVal = fn(element);\n\n  style.display = originalDisplay;\n  style.position = originalPosition;\n  style.visibility = originalVisibility;\n\n  return retVal;\n};\n\n\n/**\n * Gets the height and width of an element when the display is not none.\n * @param {Element} element Element to get size of.\n * @return {!goog.math.Size} Object with width/height properties.\n * @private\n */\ngoog.style.getSizeWithDisplay_ = function(element) {\n  var offsetWidth = /** @type {!HTMLElement} */ (element).offsetWidth;\n  var offsetHeight = /** @type {!HTMLElement} */ (element).offsetHeight;\n  var webkitOffsetsZero =\n      goog.userAgent.WEBKIT && !offsetWidth && !offsetHeight;\n  if ((offsetWidth === undefined || webkitOffsetsZero) &&\n      element.getBoundingClientRect) {\n    // Fall back to calling getBoundingClientRect when offsetWidth or\n    // offsetHeight are not defined, or when they are zero in WebKit browsers.\n    // This makes sure that we return for the correct size for SVG elements, but\n    // will still return 0 on Webkit prior to 534.8, see\n    // http://trac.webkit.org/changeset/67252.\n    var clientRect = goog.style.getBoundingClientRect_(element);\n    return new goog.math.Size(\n        clientRect.right - clientRect.left, clientRect.bottom - clientRect.top);\n  }\n  return new goog.math.Size(offsetWidth, offsetHeight);\n};\n\n\n/**\n * Gets the height and width of an element, post transform, even if its display\n * is none.\n *\n * This is like `goog.style.getSize`, except:\n * <ol>\n * <li>Takes webkitTransforms such as rotate and scale into account.\n * <li>Will return null if `element` doesn't respond to\n *     `getBoundingClientRect`.\n * <li>Currently doesn't make sense on non-WebKit browsers which don't support\n *    webkitTransforms.\n * </ol>\n * @param {!Element} element Element to get size of.\n * @return {goog.math.Size} Object with width/height properties.\n */\ngoog.style.getTransformedSize = function(element) {\n  if (!element.getBoundingClientRect) {\n    return null;\n  }\n\n  var clientRect = goog.style.evaluateWithTemporaryDisplay_(\n      goog.style.getBoundingClientRect_, element);\n  return new goog.math.Size(\n      clientRect.right - clientRect.left, clientRect.bottom - clientRect.top);\n};\n\n\n/**\n * Returns a bounding rectangle for a given element in page space.\n * @param {Element} element Element to get bounds of. Must not be display none.\n * @return {!goog.math.Rect} Bounding rectangle for the element.\n */\ngoog.style.getBounds = function(element) {\n  var o = goog.style.getPageOffset(element);\n  var s = goog.style.getSize(element);\n  return new goog.math.Rect(o.x, o.y, s.width, s.height);\n};\n\n\n/**\n * Converts a CSS selector in the form style-property to styleProperty.\n * @param {*} selector CSS Selector.\n * @return {string} Camel case selector.\n * @deprecated Use goog.string.toCamelCase instead.\n */\ngoog.style.toCamelCase = function(selector) {\n  return goog.string.toCamelCase(String(selector));\n};\n\n\n/**\n * Converts a CSS selector in the form styleProperty to style-property.\n * @param {string} selector Camel case selector.\n * @return {string} Selector cased.\n * @deprecated Use goog.string.toSelectorCase instead.\n */\ngoog.style.toSelectorCase = function(selector) {\n  return goog.string.toSelectorCase(selector);\n};\n\n\n/**\n * Gets the opacity of a node (x-browser). This gets the inline style opacity\n * of the node, and does not take into account the cascaded or the computed\n * style for this node.\n * @param {Element} el Element whose opacity has to be found.\n * @return {number|string} Opacity between 0 and 1 or an empty string {@code ''}\n *     if the opacity is not set.\n */\ngoog.style.getOpacity = function(el) {\n  goog.asserts.assert(el);\n  var style = el.style;\n  var result = '';\n  if ('opacity' in style) {\n    result = style.opacity;\n  } else if ('MozOpacity' in style) {\n    result = style.MozOpacity;\n  } else if ('filter' in style) {\n    var match = style.filter.match(/alpha\\(opacity=([\\d.]+)\\)/);\n    if (match) {\n      result = String(match[1] / 100);\n    }\n  }\n  return result == '' ? result : Number(result);\n};\n\n\n/**\n * Sets the opacity of a node (x-browser).\n * @param {Element} el Elements whose opacity has to be set.\n * @param {number|string} alpha Opacity between 0 and 1 or an empty string\n *     {@code ''} to clear the opacity.\n */\ngoog.style.setOpacity = function(el, alpha) {\n  goog.asserts.assert(el);\n  var style = el.style;\n  if ('opacity' in style) {\n    style.opacity = alpha;\n  } else if ('MozOpacity' in style) {\n    style.MozOpacity = alpha;\n  } else if ('filter' in style) {\n    // TODO(arv): Overwriting the filter might have undesired side effects.\n    if (alpha === '') {\n      style.filter = '';\n    } else {\n      style.filter = 'alpha(opacity=' + (Number(alpha) * 100) + ')';\n    }\n  }\n};\n\n\n/**\n * Sets the background of an element to a transparent image in a browser-\n * independent manner.\n *\n * This function does not support repeating backgrounds or alternate background\n * positions to match the behavior of Internet Explorer. It also does not\n * support sizingMethods other than crop since they cannot be replicated in\n * browsers other than Internet Explorer.\n *\n * @param {Element} el The element to set background on.\n * @param {string} src The image source URL.\n */\ngoog.style.setTransparentBackgroundImage = function(el, src) {\n  var style = el.style;\n  // It is safe to use the style.filter in IE only. In Safari 'filter' is in\n  // style object but access to style.filter causes it to throw an exception.\n  // Note: IE8 supports images with an alpha channel.\n  if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('8')) {\n    // See TODO in setOpacity.\n    style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(' +\n        'src=\"' + src + '\", sizingMethod=\"crop\")';\n  } else {\n    // Set style properties individually instead of using background shorthand\n    // to prevent overwriting a pre-existing background color.\n    style.backgroundImage = 'url(' + src + ')';\n    style.backgroundPosition = 'top left';\n    style.backgroundRepeat = 'no-repeat';\n  }\n};\n\n\n/**\n * Clears the background image of an element in a browser independent manner.\n * @param {Element} el The element to clear background image for.\n */\ngoog.style.clearTransparentBackgroundImage = function(el) {\n  var style = el.style;\n  if ('filter' in style) {\n    // See TODO in setOpacity.\n    style.filter = '';\n  } else {\n    // Set style properties individually instead of using background shorthand\n    // to prevent overwriting a pre-existing background color.\n    style.backgroundImage = 'none';\n  }\n};\n\n\n/**\n * Shows or hides an element from the page. Hiding the element is done by\n * setting the display property to \"none\", removing the element from the\n * rendering hierarchy so it takes up no space. To show the element, the default\n * inherited display property is restored (defined either in stylesheets or by\n * the browser's default style rules.)\n *\n * Caveat 1: if the inherited display property for the element is set to \"none\"\n * by the stylesheets, that is the property that will be restored by a call to\n * showElement(), effectively toggling the display between \"none\" and \"none\".\n *\n * Caveat 2: if the element display style is set inline (by setting either\n * element.style.display or a style attribute in the HTML), a call to\n * showElement will clear that setting and defer to the inherited style in the\n * stylesheet.\n * @param {Element} el Element to show or hide.\n * @param {*} display True to render the element in its default style,\n *     false to disable rendering the element.\n * @deprecated Use goog.style.setElementShown instead.\n */\ngoog.style.showElement = function(el, display) {\n  goog.style.setElementShown(el, display);\n};\n\n\n/**\n * Shows or hides an element from the page. Hiding the element is done by\n * setting the display property to \"none\", removing the element from the\n * rendering hierarchy so it takes up no space. To show the element, the default\n * inherited display property is restored (defined either in stylesheets or by\n * the browser's default style rules).\n *\n * Caveat 1: if the inherited display property for the element is set to \"none\"\n * by the stylesheets, that is the property that will be restored by a call to\n * setElementShown(), effectively toggling the display between \"none\" and\n * \"none\".\n *\n * Caveat 2: if the element display style is set inline (by setting either\n * element.style.display or a style attribute in the HTML), a call to\n * setElementShown will clear that setting and defer to the inherited style in\n * the stylesheet.\n * @param {Element} el Element to show or hide.\n * @param {*} isShown True to render the element in its default style,\n *     false to disable rendering the element.\n */\ngoog.style.setElementShown = function(el, isShown) {\n  el.style.display = isShown ? '' : 'none';\n};\n\n\n/**\n * Test whether the given element has been shown or hidden via a call to\n * {@link #setElementShown}.\n *\n * Note this is strictly a companion method for a call\n * to {@link #setElementShown} and the same caveats apply; in particular, this\n * method does not guarantee that the return value will be consistent with\n * whether or not the element is actually visible.\n *\n * @param {Element} el The element to test.\n * @return {boolean} Whether the element has been shown.\n * @see #setElementShown\n */\ngoog.style.isElementShown = function(el) {\n  return el.style.display != 'none';\n};\n\n\n/**\n * Installs the style sheet into the window that contains opt_node.  If\n * opt_node is null, the main window is used.\n * @param {!goog.html.SafeStyleSheet} safeStyleSheet The style sheet to install.\n * @param {?Node=} opt_node Node whose parent document should have the\n *     styles installed.\n * @return {!HTMLStyleElement|!StyleSheet} In IE<11, a StyleSheet object with no\n *     owning &lt;style&gt; tag (this is how IE creates style sheets).  In every\n *     other browser, a &lt;style&gt; element with an attached style.  This\n *     doesn't return a StyleSheet object so that setSafeStyleSheet can replace\n *     it (otherwise, if you pass a StyleSheet to setSafeStyleSheet, it will\n *     make a new StyleSheet and leave the original StyleSheet orphaned).\n */\ngoog.style.installSafeStyleSheet = function(safeStyleSheet, opt_node) {\n  var dh = goog.dom.getDomHelper(opt_node);\n\n  // IE < 11 requires createStyleSheet. Note that doc.createStyleSheet will be\n  // undefined as of IE 11.\n  var doc = dh.getDocument();\n  if (goog.userAgent.IE && doc.createStyleSheet) {\n    /** @type {(!HTMLStyleElement|!StyleSheet)} */\n    var styleSheet = doc.createStyleSheet();\n    goog.style.setSafeStyleSheet(styleSheet, safeStyleSheet);\n    return styleSheet;\n  } else {\n    var head = dh.getElementsByTagNameAndClass(goog.dom.TagName.HEAD)[0];\n\n    // In opera documents are not guaranteed to have a head element, thus we\n    // have to make sure one exists before using it.\n    if (!head) {\n      var body = dh.getElementsByTagNameAndClass(goog.dom.TagName.BODY)[0];\n      head = dh.createDom(goog.dom.TagName.HEAD);\n      body.parentNode.insertBefore(head, body);\n    }\n    var el = dh.createDom(goog.dom.TagName.STYLE);\n    // NOTE(user): Setting styles after the style element has been appended\n    // to the head results in a nasty Webkit bug in certain scenarios. Please\n    // refer to https://bugs.webkit.org/show_bug.cgi?id=26307 for additional\n    // details.\n    goog.style.setSafeStyleSheet(el, safeStyleSheet);\n    dh.appendChild(head, el);\n    return el;\n  }\n};\n\n\n/**\n * Removes the styles added by {@link #installStyles}.\n * @param {Element|StyleSheet} styleSheet The value returned by\n *     {@link #installStyles}.\n */\ngoog.style.uninstallStyles = function(styleSheet) {\n  var node = styleSheet.ownerNode || styleSheet.owningElement ||\n      /** @type {Element} */ (styleSheet);\n  goog.dom.removeNode(node);\n};\n\n\n/**\n * Sets the content of a style element.  The style element can be any valid\n * style element.  This element will have its content completely replaced by\n * the safeStyleSheet.\n * @param {!Element|!StyleSheet} element A stylesheet element as returned by\n *     installStyles.\n * @param {!goog.html.SafeStyleSheet} safeStyleSheet The new content of the\n *     stylesheet.\n */\ngoog.style.setSafeStyleSheet = function(element, safeStyleSheet) {\n  var stylesString = goog.html.SafeStyleSheet.unwrap(safeStyleSheet);\n  if (goog.userAgent.IE && element.cssText !== undefined) {\n    // Adding the selectors individually caused the browser to hang if the\n    // selector was invalid or there were CSS comments.  Setting the cssText of\n    // the style node works fine and ignores CSS that IE doesn't understand.\n    // However IE >= 11 doesn't support cssText any more, so we make sure that\n    // cssText is a defined property and otherwise fall back to innerHTML.\n    element.cssText = stylesString;\n  } else {\n    // Setting textContent doesn't work in Safari, see b/29340337.\n    element.innerHTML = stylesString;\n  }\n};\n\n\n/**\n * Sets 'white-space: pre-wrap' for a node (x-browser).\n *\n * There are as many ways of specifying pre-wrap as there are browsers.\n *\n * CSS3/IE8: white-space: pre-wrap;\n * Mozilla:  white-space: -moz-pre-wrap;\n * Opera:    white-space: -o-pre-wrap;\n * IE6/7:    white-space: pre; word-wrap: break-word;\n *\n * @param {Element} el Element to enable pre-wrap for.\n */\ngoog.style.setPreWrap = function(el) {\n  var style = el.style;\n  if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('8')) {\n    style.whiteSpace = 'pre';\n    style.wordWrap = 'break-word';\n  } else if (goog.userAgent.GECKO) {\n    style.whiteSpace = '-moz-pre-wrap';\n  } else {\n    style.whiteSpace = 'pre-wrap';\n  }\n};\n\n\n/**\n * Sets 'display: inline-block' for an element (cross-browser).\n * @param {Element} el Element to which the inline-block display style is to be\n *    applied.\n * @see ../demos/inline_block_quirks.html\n * @see ../demos/inline_block_standards.html\n */\ngoog.style.setInlineBlock = function(el) {\n  var style = el.style;\n  // Without position:relative, weirdness ensues.  Just accept it and move on.\n  style.position = 'relative';\n\n  if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('8')) {\n    // IE8 supports inline-block so fall through to the else\n    // Zoom:1 forces hasLayout, display:inline gives inline behavior.\n    style.zoom = '1';\n    style.display = 'inline';\n  } else {\n    // Opera, Webkit, and Safari seem to do OK with the standard inline-block\n    // style.\n    style.display = 'inline-block';\n  }\n};\n\n\n/**\n * Returns true if the element is using right to left (rtl) direction.\n * @param {Element} el  The element to test.\n * @return {boolean} True for right to left, false for left to right.\n */\ngoog.style.isRightToLeft = function(el) {\n  return 'rtl' == goog.style.getStyle_(el, 'direction');\n};\n\n\n/**\n * The CSS style property corresponding to an element being\n * unselectable on the current browser platform (null if none).\n * Opera and IE instead use a DOM attribute 'unselectable'. MS Edge uses\n * the Webkit prefix.\n * @type {?string}\n * @private\n */\ngoog.style.unselectableStyle_ = goog.userAgent.GECKO ?\n    'MozUserSelect' :\n    goog.userAgent.WEBKIT || goog.userAgent.EDGE ? 'WebkitUserSelect' : null;\n\n\n/**\n * Returns true if the element is set to be unselectable, false otherwise.\n * Note that on some platforms (e.g. Mozilla), even if an element isn't set\n * to be unselectable, it will behave as such if any of its ancestors is\n * unselectable.\n * @param {Element} el  Element to check.\n * @return {boolean}  Whether the element is set to be unselectable.\n */\ngoog.style.isUnselectable = function(el) {\n  if (goog.style.unselectableStyle_) {\n    return el.style[goog.style.unselectableStyle_].toLowerCase() == 'none';\n  } else if (goog.userAgent.IE || goog.userAgent.OPERA) {\n    return el.getAttribute('unselectable') == 'on';\n  }\n  return false;\n};\n\n\n/**\n * Makes the element and its descendants selectable or unselectable.  Note\n * that on some platforms (e.g. Mozilla), even if an element isn't set to\n * be unselectable, it will behave as such if any of its ancestors is\n * unselectable.\n * @param {Element} el  The element to alter.\n * @param {boolean} unselectable  Whether the element and its descendants\n *     should be made unselectable.\n * @param {boolean=} opt_noRecurse  Whether to only alter the element's own\n *     selectable state, and leave its descendants alone; defaults to false.\n */\ngoog.style.setUnselectable = function(el, unselectable, opt_noRecurse) {\n  // TODO(attila): Do we need all of TR_DomUtil.makeUnselectable() in Closure?\n  var descendants = !opt_noRecurse ? el.getElementsByTagName('*') : null;\n  var name = goog.style.unselectableStyle_;\n  if (name) {\n    // Add/remove the appropriate CSS style to/from the element and its\n    // descendants.\n    var value = unselectable ? 'none' : '';\n    // MathML elements do not have a style property. Verify before setting.\n    if (el.style) {\n      el.style[name] = value;\n    }\n    if (descendants) {\n      for (var i = 0, descendant; descendant = descendants[i]; i++) {\n        if (descendant.style) {\n          descendant.style[name] = value;\n        }\n      }\n    }\n  } else if (goog.userAgent.IE || goog.userAgent.OPERA) {\n    // Toggle the 'unselectable' attribute on the element and its descendants.\n    var value = unselectable ? 'on' : '';\n    el.setAttribute('unselectable', value);\n    if (descendants) {\n      for (var i = 0, descendant; descendant = descendants[i]; i++) {\n        descendant.setAttribute('unselectable', value);\n      }\n    }\n  }\n};\n\n\n/**\n * Gets the border box size for an element.\n * @param {Element} element  The element to get the size for.\n * @return {!goog.math.Size} The border box size.\n */\ngoog.style.getBorderBoxSize = function(element) {\n  return new goog.math.Size(\n      /** @type {!HTMLElement} */ (element).offsetWidth,\n      /** @type {!HTMLElement} */ (element).offsetHeight);\n};\n\n\n/**\n * Sets the border box size of an element. This is potentially expensive in IE\n * if the document is CSS1Compat mode\n * @param {Element} element  The element to set the size on.\n * @param {goog.math.Size} size  The new size.\n */\ngoog.style.setBorderBoxSize = function(element, size) {\n  var doc = goog.dom.getOwnerDocument(element);\n  var isCss1CompatMode = goog.dom.getDomHelper(doc).isCss1CompatMode();\n\n  if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('10') &&\n      (!isCss1CompatMode || !goog.userAgent.isVersionOrHigher('8'))) {\n    var style = element.style;\n    if (isCss1CompatMode) {\n      var paddingBox = goog.style.getPaddingBox(element);\n      var borderBox = goog.style.getBorderBox(element);\n      style.pixelWidth = size.width - borderBox.left - paddingBox.left -\n          paddingBox.right - borderBox.right;\n      style.pixelHeight = size.height - borderBox.top - paddingBox.top -\n          paddingBox.bottom - borderBox.bottom;\n    } else {\n      style.pixelWidth = size.width;\n      style.pixelHeight = size.height;\n    }\n  } else {\n    goog.style.setBoxSizingSize_(element, size, 'border-box');\n  }\n};\n\n\n/**\n * Gets the content box size for an element.  This is potentially expensive in\n * all browsers.\n * @param {Element} element  The element to get the size for.\n * @return {!goog.math.Size} The content box size.\n */\ngoog.style.getContentBoxSize = function(element) {\n  var doc = goog.dom.getOwnerDocument(element);\n  var ieCurrentStyle = goog.userAgent.IE && element.currentStyle;\n  if (ieCurrentStyle && goog.dom.getDomHelper(doc).isCss1CompatMode() &&\n      ieCurrentStyle.width != 'auto' && ieCurrentStyle.height != 'auto' &&\n      !ieCurrentStyle.boxSizing) {\n    // If IE in CSS1Compat mode than just use the width and height.\n    // If we have a boxSizing then fall back on measuring the borders etc.\n    var width = goog.style.getIePixelValue_(\n        element, /** @type {string} */ (ieCurrentStyle.width), 'width',\n        'pixelWidth');\n    var height = goog.style.getIePixelValue_(\n        element, /** @type {string} */ (ieCurrentStyle.height), 'height',\n        'pixelHeight');\n    return new goog.math.Size(width, height);\n  } else {\n    var borderBoxSize = goog.style.getBorderBoxSize(element);\n    var paddingBox = goog.style.getPaddingBox(element);\n    var borderBox = goog.style.getBorderBox(element);\n    return new goog.math.Size(\n        borderBoxSize.width - borderBox.left - paddingBox.left -\n            paddingBox.right - borderBox.right,\n        borderBoxSize.height - borderBox.top - paddingBox.top -\n            paddingBox.bottom - borderBox.bottom);\n  }\n};\n\n\n/**\n * Sets the content box size of an element. This is potentially expensive in IE\n * if the document is BackCompat mode.\n * @param {Element} element  The element to set the size on.\n * @param {goog.math.Size} size  The new size.\n */\ngoog.style.setContentBoxSize = function(element, size) {\n  var doc = goog.dom.getOwnerDocument(element);\n  var isCss1CompatMode = goog.dom.getDomHelper(doc).isCss1CompatMode();\n  if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('10') &&\n      (!isCss1CompatMode || !goog.userAgent.isVersionOrHigher('8'))) {\n    var style = element.style;\n    if (isCss1CompatMode) {\n      style.pixelWidth = size.width;\n      style.pixelHeight = size.height;\n    } else {\n      var paddingBox = goog.style.getPaddingBox(element);\n      var borderBox = goog.style.getBorderBox(element);\n      style.pixelWidth = size.width + borderBox.left + paddingBox.left +\n          paddingBox.right + borderBox.right;\n      style.pixelHeight = size.height + borderBox.top + paddingBox.top +\n          paddingBox.bottom + borderBox.bottom;\n    }\n  } else {\n    goog.style.setBoxSizingSize_(element, size, 'content-box');\n  }\n};\n\n\n/**\n * Helper function that sets the box sizing as well as the width and height\n * @param {Element} element  The element to set the size on.\n * @param {goog.math.Size} size  The new size to set.\n * @param {string} boxSizing  The box-sizing value.\n * @private\n */\ngoog.style.setBoxSizingSize_ = function(element, size, boxSizing) {\n  var style = element.style;\n  if (goog.userAgent.GECKO) {\n    style.MozBoxSizing = boxSizing;\n  } else if (goog.userAgent.WEBKIT) {\n    style.WebkitBoxSizing = boxSizing;\n  } else {\n    // Includes IE8 and Opera 9.50+\n    style.boxSizing = boxSizing;\n  }\n\n  // Setting this to a negative value will throw an exception on IE\n  // (and doesn't do anything different than setting it to 0).\n  style.width = Math.max(size.width, 0) + 'px';\n  style.height = Math.max(size.height, 0) + 'px';\n};\n\n\n/**\n * IE specific function that converts a non pixel unit to pixels.\n * @param {Element} element  The element to convert the value for.\n * @param {string} value  The current value as a string. The value must not be\n *     ''.\n * @param {string} name  The CSS property name to use for the converstion. This\n *     should be 'left', 'top', 'width' or 'height'.\n * @param {string} pixelName  The CSS pixel property name to use to get the\n *     value in pixels.\n * @return {number} The value in pixels.\n * @private\n */\ngoog.style.getIePixelValue_ = function(element, value, name, pixelName) {\n  // Try if we already have a pixel value. IE does not do half pixels so we\n  // only check if it matches a number followed by 'px'.\n  if (/^\\d+px?$/.test(value)) {\n    return parseInt(value, 10);\n  } else {\n    var oldStyleValue = element.style[name];\n    var oldRuntimeValue = element.runtimeStyle[name];\n    // set runtime style to prevent changes\n    element.runtimeStyle[name] = element.currentStyle[name];\n    element.style[name] = value;\n    var pixelValue = element.style[pixelName];\n    // restore\n    element.style[name] = oldStyleValue;\n    element.runtimeStyle[name] = oldRuntimeValue;\n    return +pixelValue;\n  }\n};\n\n\n/**\n * Helper function for getting the pixel padding or margin for IE.\n * @param {Element} element  The element to get the padding for.\n * @param {string} propName  The property name.\n * @return {number} The pixel padding.\n * @private\n */\ngoog.style.getIePixelDistance_ = function(element, propName) {\n  var value = goog.style.getCascadedStyle(element, propName);\n  return value ?\n      goog.style.getIePixelValue_(element, value, 'left', 'pixelLeft') :\n      0;\n};\n\n\n/**\n * Gets the computed paddings or margins (on all sides) in pixels.\n * @param {Element} element  The element to get the padding for.\n * @param {string} stylePrefix  Pass 'padding' to retrieve the padding box,\n *     or 'margin' to retrieve the margin box.\n * @return {!goog.math.Box} The computed paddings or margins.\n * @private\n */\ngoog.style.getBox_ = function(element, stylePrefix) {\n  if (goog.userAgent.IE) {\n    var left = goog.style.getIePixelDistance_(element, stylePrefix + 'Left');\n    var right = goog.style.getIePixelDistance_(element, stylePrefix + 'Right');\n    var top = goog.style.getIePixelDistance_(element, stylePrefix + 'Top');\n    var bottom =\n        goog.style.getIePixelDistance_(element, stylePrefix + 'Bottom');\n    return new goog.math.Box(top, right, bottom, left);\n  } else {\n    // On non-IE browsers, getComputedStyle is always non-null.\n    var left = goog.style.getComputedStyle(element, stylePrefix + 'Left');\n    var right = goog.style.getComputedStyle(element, stylePrefix + 'Right');\n    var top = goog.style.getComputedStyle(element, stylePrefix + 'Top');\n    var bottom = goog.style.getComputedStyle(element, stylePrefix + 'Bottom');\n\n    // NOTE(arv): Gecko can return floating point numbers for the computed\n    // style values.\n    return new goog.math.Box(\n        parseFloat(top), parseFloat(right), parseFloat(bottom),\n        parseFloat(left));\n  }\n};\n\n\n/**\n * Gets the computed paddings (on all sides) in pixels.\n * @param {Element} element  The element to get the padding for.\n * @return {!goog.math.Box} The computed paddings.\n */\ngoog.style.getPaddingBox = function(element) {\n  return goog.style.getBox_(element, 'padding');\n};\n\n\n/**\n * Gets the computed margins (on all sides) in pixels.\n * @param {Element} element  The element to get the margins for.\n * @return {!goog.math.Box} The computed margins.\n */\ngoog.style.getMarginBox = function(element) {\n  return goog.style.getBox_(element, 'margin');\n};\n\n\n/**\n * A map used to map the border width keywords to a pixel width.\n * @type {!Object}\n * @private\n */\ngoog.style.ieBorderWidthKeywords_ = {\n  'thin': 2,\n  'medium': 4,\n  'thick': 6\n};\n\n\n/**\n * Helper function for IE to get the pixel border.\n * @param {Element} element  The element to get the pixel border for.\n * @param {string} prop  The part of the property name.\n * @return {number} The value in pixels.\n * @private\n */\ngoog.style.getIePixelBorder_ = function(element, prop) {\n  if (goog.style.getCascadedStyle(element, prop + 'Style') == 'none') {\n    return 0;\n  }\n  var width = goog.style.getCascadedStyle(element, prop + 'Width');\n  if (width in goog.style.ieBorderWidthKeywords_) {\n    return goog.style.ieBorderWidthKeywords_[width];\n  }\n  return goog.style.getIePixelValue_(element, width, 'left', 'pixelLeft');\n};\n\n\n/**\n * Gets the computed border widths (on all sides) in pixels\n * @param {Element} element  The element to get the border widths for.\n * @return {!goog.math.Box} The computed border widths.\n */\ngoog.style.getBorderBox = function(element) {\n  if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) {\n    var left = goog.style.getIePixelBorder_(element, 'borderLeft');\n    var right = goog.style.getIePixelBorder_(element, 'borderRight');\n    var top = goog.style.getIePixelBorder_(element, 'borderTop');\n    var bottom = goog.style.getIePixelBorder_(element, 'borderBottom');\n    return new goog.math.Box(top, right, bottom, left);\n  } else {\n    // On non-IE browsers, getComputedStyle is always non-null.\n    var left = goog.style.getComputedStyle(element, 'borderLeftWidth');\n    var right = goog.style.getComputedStyle(element, 'borderRightWidth');\n    var top = goog.style.getComputedStyle(element, 'borderTopWidth');\n    var bottom = goog.style.getComputedStyle(element, 'borderBottomWidth');\n\n    return new goog.math.Box(\n        parseFloat(top), parseFloat(right), parseFloat(bottom),\n        parseFloat(left));\n  }\n};\n\n\n/**\n * Returns the font face applied to a given node. Opera and IE should return\n * the font actually displayed. Firefox returns the author's most-preferred\n * font (whether the browser is capable of displaying it or not.)\n * @param {Element} el  The element whose font family is returned.\n * @return {string} The font family applied to el.\n */\ngoog.style.getFontFamily = function(el) {\n  var doc = goog.dom.getOwnerDocument(el);\n  var font = '';\n  // The moveToElementText method from the TextRange only works if the element\n  // is attached to the owner document.\n  if (doc.body.createTextRange && goog.dom.contains(doc, el)) {\n    var range = doc.body.createTextRange();\n    range.moveToElementText(el);\n\n    try {\n      font = range.queryCommandValue('FontName');\n    } catch (e) {\n      // This is a workaround for a awkward exception.\n      // On some IE, there is an exception coming from it.\n      // The error description from this exception is:\n      // This window has already been registered as a drop target\n      // This is bogus description, likely due to a bug in ie.\n      font = '';\n    }\n  }\n  if (!font) {\n    // Note if for some reason IE can't derive FontName with a TextRange, we\n    // fallback to using currentStyle\n    font = goog.style.getStyle_(el, 'fontFamily');\n  }\n\n  // Firefox returns the applied font-family string (author's list of\n  // preferred fonts.) We want to return the most-preferred font, in lieu of\n  // the *actually* applied font.\n  var fontsArray = font.split(',');\n  if (fontsArray.length > 1) font = fontsArray[0];\n\n  // Sanitize for x-browser consistency:\n  // Strip quotes because browsers aren't consistent with how they're\n  // applied; Opera always encloses, Firefox sometimes, and IE never.\n  return goog.string.stripQuotes(font, '\"\\'');\n};\n\n\n/**\n * Regular expression used for getLengthUnits.\n * @type {RegExp}\n * @private\n */\ngoog.style.lengthUnitRegex_ = /[^\\d]+$/;\n\n\n/**\n * Returns the units used for a CSS length measurement.\n * @param {string} value  A CSS length quantity.\n * @return {?string} The units of measurement.\n */\ngoog.style.getLengthUnits = function(value) {\n  var units = value.match(goog.style.lengthUnitRegex_);\n  return units && units[0] || null;\n};\n\n\n/**\n * Map of absolute CSS length units\n * @type {!Object}\n * @private\n */\ngoog.style.ABSOLUTE_CSS_LENGTH_UNITS_ = {\n  'cm': 1,\n  'in': 1,\n  'mm': 1,\n  'pc': 1,\n  'pt': 1\n};\n\n\n/**\n * Map of relative CSS length units that can be accurately converted to px\n * font-size values using getIePixelValue_. Only units that are defined in\n * relation to a font size are convertible (%, small, etc. are not).\n * @type {!Object}\n * @private\n */\ngoog.style.CONVERTIBLE_RELATIVE_CSS_UNITS_ = {\n  'em': 1,\n  'ex': 1\n};\n\n\n/**\n * Returns the font size, in pixels, of text in an element.\n * @param {Element} el  The element whose font size is returned.\n * @return {number} The font size (in pixels).\n */\ngoog.style.getFontSize = function(el) {\n  var fontSize = goog.style.getStyle_(el, 'fontSize');\n  var sizeUnits = goog.style.getLengthUnits(fontSize);\n  if (fontSize && 'px' == sizeUnits) {\n    // NOTE(user): This could be parseFloat instead, but IE doesn't return\n    // decimal fractions in getStyle_ and Firefox reports the fractions, but\n    // ignores them when rendering. Interestingly enough, when we force the\n    // issue and size something to e.g., 50% of 25px, the browsers round in\n    // opposite directions with Firefox reporting 12px and IE 13px. I punt.\n    return parseInt(fontSize, 10);\n  }\n\n  // In IE, we can convert absolute length units to a px value using\n  // goog.style.getIePixelValue_. Units defined in relation to a font size\n  // (em, ex) are applied relative to the element's parentNode and can also\n  // be converted.\n  if (goog.userAgent.IE) {\n    if (String(sizeUnits) in goog.style.ABSOLUTE_CSS_LENGTH_UNITS_) {\n      return goog.style.getIePixelValue_(el, fontSize, 'left', 'pixelLeft');\n    } else if (\n        el.parentNode && el.parentNode.nodeType == goog.dom.NodeType.ELEMENT &&\n        String(sizeUnits) in goog.style.CONVERTIBLE_RELATIVE_CSS_UNITS_) {\n      // Check the parent size - if it is the same it means the relative size\n      // value is inherited and we therefore don't want to count it twice.  If\n      // it is different, this element either has explicit style or has a CSS\n      // rule applying to it.\n      var parentElement = /** @type {!Element} */ (el.parentNode);\n      var parentSize = goog.style.getStyle_(parentElement, 'fontSize');\n      return goog.style.getIePixelValue_(\n          parentElement, fontSize == parentSize ? '1em' : fontSize, 'left',\n          'pixelLeft');\n    }\n  }\n\n  // Sometimes we can't cleanly find the font size (some units relative to a\n  // node's parent's font size are difficult: %, smaller et al), so we create\n  // an invisible, absolutely-positioned span sized to be the height of an 'M'\n  // rendered in its parent's (i.e., our target element's) font size. This is\n  // the definition of CSS's font size attribute.\n  var sizeElement = goog.dom.createDom(goog.dom.TagName.SPAN, {\n    'style': 'visibility:hidden;position:absolute;' +\n        'line-height:0;padding:0;margin:0;border:0;height:1em;'\n  });\n  goog.dom.appendChild(el, sizeElement);\n  fontSize = sizeElement.offsetHeight;\n  goog.dom.removeNode(sizeElement);\n\n  return fontSize;\n};\n\n\n/**\n * Parses a style attribute value.  Converts CSS property names to camel case.\n * @param {string} value The style attribute value.\n * @return {!Object} Map of CSS properties to string values.\n */\ngoog.style.parseStyleAttribute = function(value) {\n  var result = {};\n  goog.array.forEach(value.split(/\\s*;\\s*/), function(pair) {\n    var keyValue = pair.match(/\\s*([\\w-]+)\\s*\\:(.+)/);\n    if (keyValue) {\n      var styleName = keyValue[1];\n      var styleValue = goog.string.trim(keyValue[2]);\n      result[goog.string.toCamelCase(styleName.toLowerCase())] = styleValue;\n    }\n  });\n  return result;\n};\n\n\n/**\n * Reverse of parseStyleAttribute; that is, takes a style object and returns the\n * corresponding attribute value.  Converts camel case property names to proper\n * CSS selector names.\n * @param {Object} obj Map of CSS properties to values.\n * @return {string} The style attribute value.\n */\ngoog.style.toStyleAttribute = function(obj) {\n  var buffer = [];\n  goog.object.forEach(obj, function(value, key) {\n    buffer.push(goog.string.toSelectorCase(key), ':', value, ';');\n  });\n  return buffer.join('');\n};\n\n\n/**\n * Sets CSS float property on an element.\n * @param {Element} el The element to set float property on.\n * @param {string} value The value of float CSS property to set on this element.\n */\ngoog.style.setFloat = function(el, value) {\n  el.style[goog.userAgent.IE ? 'styleFloat' : 'cssFloat'] = value;\n};\n\n\n/**\n * Gets value of explicitly-set float CSS property on an element.\n * @param {Element} el The element to get float property of.\n * @return {string} The value of explicitly-set float CSS property on this\n *     element.\n */\ngoog.style.getFloat = function(el) {\n  return el.style[goog.userAgent.IE ? 'styleFloat' : 'cssFloat'] || '';\n};\n\n\n/**\n * Returns the scroll bar width (represents the width of both horizontal\n * and vertical scroll).\n *\n * @param {string=} opt_className An optional class name (or names) to apply\n *     to the invisible div created to measure the scrollbar. This is necessary\n *     if some scrollbars are styled differently than others.\n * @return {number} The scroll bar width in px.\n */\ngoog.style.getScrollbarWidth = function(opt_className) {\n  // Add two hidden divs.  The child div is larger than the parent and\n  // forces scrollbars to appear on it.\n  // Using overflow:scroll does not work consistently with scrollbars that\n  // are styled with ::-webkit-scrollbar.\n  var outerDiv = goog.dom.createElement(goog.dom.TagName.DIV);\n  if (opt_className) {\n    outerDiv.className = opt_className;\n  }\n  outerDiv.style.cssText = 'overflow:auto;' +\n      'position:absolute;top:0;width:100px;height:100px';\n  var innerDiv = goog.dom.createElement(goog.dom.TagName.DIV);\n  goog.style.setSize(innerDiv, '200px', '200px');\n  outerDiv.appendChild(innerDiv);\n  goog.dom.appendChild(goog.dom.getDocument().body, outerDiv);\n  var width = outerDiv.offsetWidth - outerDiv.clientWidth;\n  goog.dom.removeNode(outerDiv);\n  return width;\n};\n\n\n/**\n * Regular expression to extract x and y translation components from a CSS\n * transform Matrix representation.\n *\n * @type {!RegExp}\n * @const\n * @private\n */\ngoog.style.MATRIX_TRANSLATION_REGEX_ = new RegExp(\n    'matrix\\\\([0-9\\\\.\\\\-]+, [0-9\\\\.\\\\-]+, ' +\n    '[0-9\\\\.\\\\-]+, [0-9\\\\.\\\\-]+, ' +\n    '([0-9\\\\.\\\\-]+)p?x?, ([0-9\\\\.\\\\-]+)p?x?\\\\)');\n\n\n/**\n * Returns the x,y translation component of any CSS transforms applied to the\n * element, in pixels.\n *\n * @param {!Element} element The element to get the translation of.\n * @return {!goog.math.Coordinate} The CSS translation of the element in px.\n */\ngoog.style.getCssTranslation = function(element) {\n  var transform = goog.style.getComputedTransform(element);\n  if (!transform) {\n    return new goog.math.Coordinate(0, 0);\n  }\n  var matches = transform.match(goog.style.MATRIX_TRANSLATION_REGEX_);\n  if (!matches) {\n    return new goog.math.Coordinate(0, 0);\n  }\n  return new goog.math.Coordinate(\n      parseFloat(matches[1]), parseFloat(matches[2]));\n};\n","^17",1579837703000,"^18",["^19",["^1S","^1T","~$goog.reflect","~$goog.dom.NodeType","^2D","^23","^Z","^2G","^2X","~$goog.math.Box","^26","~$goog.math.Rect","~$goog.dom.vendor","^2A","^35","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/style/style.js"],"^1J",["^19",["^29"]],"^X",true,"^Y",["^Z","^35","^1S","^1T","^3G","^1V","^3J","^2A","^3H","^26","^3I","^23","^2G","^3F","^2D","^2X"]],["^ ","^[",[1579837703000],"^10","goog.editor.browserfeature.js","^11",["^12","goog/editor/browserfeature.js"],"^13","goog/editor/browserfeature.js","^14","^15","^16","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Trogedit constants for browser features and quirks that should\n * be used by the rich text editor.\n */\n\ngoog.provide('goog.editor.BrowserFeature');\n\ngoog.require('goog.editor.defines');\ngoog.require('goog.labs.userAgent.browser');\ngoog.require('goog.userAgent');\ngoog.require('goog.userAgent.product');\ngoog.require('goog.userAgent.product.isVersion');\n\n\n/**\n * Maps browser quirks to boolean values, detailing what the current\n * browser supports.\n * @const\n */\ngoog.editor.BrowserFeature = {\n  // Whether this browser uses the IE TextRange object.\n  HAS_IE_RANGES: goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9),\n\n  // Whether this browser uses the W3C standard Range object.\n  // Assumes IE higher versions will be compliance with W3C standard.\n  HAS_W3C_RANGES: goog.userAgent.GECKO || goog.userAgent.WEBKIT ||\n      goog.userAgent.OPERA || goog.userAgent.EDGE ||\n      (goog.userAgent.IE && goog.userAgent.isDocumentModeOrHigher(9)),\n\n  // Has the contentEditable attribute, which makes nodes editable.\n  //\n  // NOTE(nicksantos): FF3 has contentEditable, but there are 3 major reasons\n  // why we don't use it:\n  // 1) In FF3, we listen for key events on the document, and we'd have to\n  //    filter them properly. See TR_Browser.USE_DOCUMENT_FOR_KEY_EVENTS.\n  // 2) In FF3, we listen for focus/blur events on the document, which\n  //    simply doesn't make sense in contentEditable. focus/blur\n  //    on contentEditable elements still has some quirks, which we're\n  //    talking to Firefox-team about.\n  // 3) We currently use Mutation events in FF3 to detect changes,\n  //    and these are dispatched on the document only.\n  // If we ever hope to support FF3/contentEditable, all 3 of these issues\n  // will need answers. Most just involve refactoring at our end.\n  HAS_CONTENT_EDITABLE: goog.userAgent.IE || goog.userAgent.WEBKIT ||\n      goog.userAgent.OPERA || goog.userAgent.EDGE ||\n      (goog.editor.defines.USE_CONTENTEDITABLE_IN_FIREFOX_3 &&\n       goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9')),\n\n  // Whether to use mutation event types to detect changes\n  // in the field contents.\n  USE_MUTATION_EVENTS: goog.userAgent.GECKO,\n\n  // Whether the browser has a functional DOMSubtreeModified event.\n  // TODO(user): Enable for all FF3 once we're confident this event fires\n  // reliably. Currently it's only enabled if using contentEditable in FF as\n  // we have no other choice in that case but to use this event.\n  HAS_DOM_SUBTREE_MODIFIED_EVENT: goog.userAgent.WEBKIT ||\n      (goog.editor.defines.USE_CONTENTEDITABLE_IN_FIREFOX_3 &&\n       goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9')),\n\n  // Whether nodes can be copied from one document to another\n  HAS_DOCUMENT_INDEPENDENT_NODES: goog.userAgent.GECKO,\n\n  // Whether the cursor goes before or inside the first block element on\n  // focus, e.g., <body><p>foo</p></body>. FF will put the cursor before the\n  // paragraph on focus, which is wrong.\n  PUTS_CURSOR_BEFORE_FIRST_BLOCK_ELEMENT_ON_FOCUS: goog.userAgent.GECKO,\n\n  // Whether the selection of one frame is cleared when another frame\n  // is focused.\n  CLEARS_SELECTION_WHEN_FOCUS_LEAVES:\n      goog.userAgent.IE || goog.userAgent.WEBKIT || goog.userAgent.OPERA,\n\n  // Whether \"unselectable\" is supported as an element style.\n  HAS_UNSELECTABLE_STYLE: goog.userAgent.GECKO || goog.userAgent.WEBKIT,\n\n  // Whether this browser's \"FormatBlock\" command does not suck.\n  FORMAT_BLOCK_WORKS_FOR_BLOCKQUOTES:\n      goog.userAgent.GECKO || goog.userAgent.WEBKIT || goog.userAgent.OPERA,\n\n  // Whether this browser's \"FormatBlock\" command may create multiple\n  // blockquotes.\n  CREATES_MULTIPLE_BLOCKQUOTES:\n      (goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher('534.16')) ||\n      goog.userAgent.OPERA,\n\n  // Whether this browser's \"FormatBlock\" command will wrap blockquotes\n  // inside of divs, instead of replacing divs with blockquotes.\n  WRAPS_BLOCKQUOTE_IN_DIVS: goog.userAgent.OPERA,\n\n  // Whether the readystatechange event is more reliable than load.\n  PREFERS_READY_STATE_CHANGE_EVENT: goog.userAgent.IE,\n\n  // Whether hitting the tab key will fire a keypress event.\n  // see http://www.quirksmode.org/js/keys.html\n  // TODO(sdh): This is fixed in IE8 and higher.\n  TAB_FIRES_KEYPRESS: !goog.userAgent.IE,\n\n  // Has a standards mode quirk where width=100% doesn't do the right thing,\n  // but width=99% does.\n  // TODO(user|user): This should be fixable by less hacky means\n  NEEDS_99_WIDTH_IN_STANDARDS_MODE: goog.userAgent.IE,\n\n  // Whether keyboard events only reliably fire on the document.\n  // On Gecko without contentEditable, keyboard events only fire reliably on the\n  // document element. With contentEditable, the field itself is focusable,\n  // which means that it will fire key events. This does not apply if\n  // application is using ContentEditableField or otherwise overriding Field\n  // not to use an iframe.\n  USE_DOCUMENT_FOR_KEY_EVENTS: goog.userAgent.GECKO &&\n      !goog.editor.defines.USE_CONTENTEDITABLE_IN_FIREFOX_3,\n\n  // Whether this browser shows non-standard attributes in innerHTML.\n  SHOWS_CUSTOM_ATTRS_IN_INNER_HTML: goog.userAgent.IE,\n\n  // Whether this browser shrinks empty nodes away to nothing.\n  // (If so, we need to insert some space characters into nodes that\n  //  shouldn't be collapsed)\n  COLLAPSES_EMPTY_NODES:\n      goog.userAgent.GECKO || goog.userAgent.WEBKIT || goog.userAgent.OPERA,\n\n  // Whether we must convert <strong> and <em> tags to <b>, <i>.\n  CONVERT_TO_B_AND_I_TAGS: goog.userAgent.GECKO || goog.userAgent.OPERA,\n\n  // Whether this browser likes to tab through images in contentEditable mode,\n  // and we like to disable this feature.\n  TABS_THROUGH_IMAGES: goog.userAgent.IE,\n\n  // Whether this browser unescapes urls when you extract it from the href tag.\n  UNESCAPES_URLS_WITHOUT_ASKING:\n      goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('7.0'),\n\n  // Whether this browser supports execCommand(\"styleWithCSS\") to toggle between\n  // inserting html tags or inline styling for things like bold, italic, etc.\n  HAS_STYLE_WITH_CSS:\n      goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.8') ||\n      goog.userAgent.WEBKIT || goog.userAgent.OPERA,\n\n  // Whether clicking on an editable link will take you to that site.\n  FOLLOWS_EDITABLE_LINKS: goog.userAgent.WEBKIT ||\n      goog.userAgent.IE && goog.userAgent.isVersionOrHigher('9'),\n\n  // Whether this browser has document.activeElement available.\n  HAS_ACTIVE_ELEMENT: goog.userAgent.IE || goog.userAgent.EDGE ||\n      goog.userAgent.OPERA ||\n      goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9'),\n\n  // Whether this browser supports the setCapture method on DOM elements.\n  HAS_SET_CAPTURE: goog.userAgent.IE,\n\n  // Whether this browser can't set background color when the selection\n  // is collapsed.\n  EATS_EMPTY_BACKGROUND_COLOR: goog.userAgent.GECKO ||\n      goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher('527'),\n\n  // Whether this browser supports the \"focusin\" or \"DOMFocusIn\" event\n  // consistently.\n  // NOTE(nicksantos): FF supports DOMFocusIn, but doesn't seem to do so\n  // consistently.\n  SUPPORTS_FOCUSIN: goog.userAgent.IE || goog.userAgent.OPERA,\n\n  // Whether clicking on an image will cause the selection to move to the image.\n  // Note: Gecko moves the selection, but it won't always go to the image.\n  // For example, if the image is wrapped in a div, and you click on the img,\n  // anchorNode = focusNode = div, anchorOffset = 0, focusOffset = 1, so this\n  // is another way of \"selecting\" the image, but there are too many special\n  // cases like this so we will do the work manually.\n  SELECTS_IMAGES_ON_CLICK: goog.userAgent.IE || goog.userAgent.OPERA,\n\n  // Whether this browser moves <style> tags into new <head> elements.\n  MOVES_STYLE_TO_HEAD: goog.userAgent.WEBKIT,\n\n  // Whether this browser collapses the selection in a contenteditable when the\n  // mouse is pressed in a non-editable portion of the same frame, even if\n  // Event.preventDefault is called. This field is deprecated and unused -- only\n  // old versions of Opera have this bug.\n  COLLAPSES_SELECTION_ONMOUSEDOWN: false,\n\n  // Whether the user can actually create a selection in this browser with the\n  // caret in the MIDDLE of the selection by double-clicking.\n  CARET_INSIDE_SELECTION: goog.userAgent.OPERA,\n\n  // Whether the browser focuses <body contenteditable> automatically when\n  // the user clicks on <html>. This field is deprecated and unused -- only old\n  // versions of Opera don't have this behavior.\n  FOCUSES_EDITABLE_BODY_ON_HTML_CLICK: true,\n\n  // Whether to use keydown for key listening (uses keypress otherwise). Taken\n  // from goog.events.KeyHandler.\n  USES_KEYDOWN:\n      !goog.userAgent.WEBKIT || goog.userAgent.isVersionOrHigher('525'),\n\n  // Whether this browser converts spaces to non-breaking spaces when calling\n  // execCommand's RemoveFormat.\n  // See: https://bugs.webkit.org/show_bug.cgi?id=14062\n  ADDS_NBSPS_IN_REMOVE_FORMAT:\n      goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher('531'),\n\n  // Whether the browser will get stuck inside a link.  That is, if your cursor\n  // is after a link and you type, does your text go inside the link tag.\n  // Bug: http://bugs.webkit.org/show_bug.cgi?id=17697\n  GETS_STUCK_IN_LINKS:\n      goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher('528'),\n\n  // Whether the browser corrupts empty text nodes in Node#normalize,\n  // removing them from the Document instead of merging them.\n  NORMALIZE_CORRUPTS_EMPTY_TEXT_NODES:\n      goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('1.9') ||\n      goog.userAgent.IE || goog.userAgent.EDGE || goog.userAgent.OPERA ||\n      goog.userAgent.WEBKIT && goog.userAgent.isVersionOrHigher('531'),\n\n  // Whether the browser corrupts all text nodes in Node#normalize,\n  // removing them from the Document instead of merging them.\n  NORMALIZE_CORRUPTS_ALL_TEXT_NODES: goog.userAgent.IE,\n\n  // Browsers where executing subscript then superscript (or vv) will cause both\n  // to be applied in a nested fashion instead of the first being overwritten by\n  // the second.\n  NESTS_SUBSCRIPT_SUPERSCRIPT: goog.userAgent.IE || goog.userAgent.EDGE ||\n      goog.userAgent.GECKO || goog.userAgent.OPERA,\n\n  // Whether this browser can place a cursor in an empty element natively.\n  CAN_SELECT_EMPTY_ELEMENT: !goog.userAgent.IE && !goog.userAgent.WEBKIT,\n\n  FORGETS_FORMATTING_WHEN_LISTIFYING: goog.userAgent.GECKO ||\n      goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher('526'),\n\n  LEAVES_P_WHEN_REMOVING_LISTS: goog.userAgent.IE || goog.userAgent.OPERA,\n\n  CAN_LISTIFY_BR: !goog.userAgent.IE && !goog.userAgent.OPERA,\n\n  // See bug 1286408. When somewhere inside your selection there is an element\n  // with a style attribute that sets the font size, if you change the font\n  // size, the browser creates a font tag, but the font size in the style attr\n  // overrides the font tag. Only webkit removes that font size from the style\n  // attr.\n  DOESNT_OVERRIDE_FONT_SIZE_IN_STYLE_ATTR:\n      !goog.userAgent.WEBKIT && !goog.userAgent.EDGE,\n\n  // Implements this spec about dragging files from the filesystem to the\n  // browser: http://www.whatwg/org/specs/web-apps/current-work/#dnd\n  SUPPORTS_HTML5_FILE_DRAGGING: (goog.userAgent.product.CHROME &&\n                                 goog.userAgent.product.isVersion('4')) ||\n      (goog.userAgent.product.SAFARI &&\n       goog.userAgent.isVersionOrHigher('533')) ||\n      (goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher('2.0')) ||\n      (goog.userAgent.IE && goog.userAgent.isVersionOrHigher('10')) ||\n      // TODO(user): Remove when b/27923889 is fixed.\n      (goog.userAgent.OPERA &&\n       goog.labs.userAgent.browser.isVersionOrHigher('15')) ||\n      goog.userAgent.EDGE,\n\n  // Version of Opera that supports the opera-defaultBlock execCommand to change\n  // the default block inserted when [return] is pressed. Note that this only is\n  // used if the caret is not already in a block that can be repeated.\n  // TODO(user): Link to public documentation of this feature if Opera puts\n  // something up about it.\n  SUPPORTS_OPERA_DEFAULTBLOCK_COMMAND:\n      goog.userAgent.OPERA && goog.userAgent.isVersionOrHigher('11.10'),\n\n  SUPPORTS_FILE_PASTING:\n      goog.userAgent.product.CHROME && goog.userAgent.product.isVersion('12')\n};\n","^17",1579837703000,"^18",["^19",["^2N","^Z","^2X","~$goog.editor.defines","~$goog.labs.userAgent.browser","~$goog.userAgent.product.isVersion"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/browserfeature.js"],"^1J",["^19",["^2V"]],"^X",true,"^Y",["^Z","^3K","^3L","^2X","^2N","^3M"]],["^ ","^[",[1579837703000],"^10","goog.soy.soy.js","^11",["^12","goog/soy/soy.js"],"^13","goog/soy/soy.js","^14","^15","^16","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides utility methods to render soy template.\n * @author chrishenry@google.com (Chris Henry)\n */\n\ngoog.provide('goog.soy');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.soy.data.SanitizedContent');\n\n/**\n * A structural interface for injected data.\n *\n * <p>Soy generated code contributes optional properties.\n *\n * @record\n */\ngoog.soy.IjData = function() {};\n\n/**\n * Helper typedef for ij parameters.  This is what soy generates.\n * @private\n * @typedef {!goog.soy.IjData|!Object<string, *>}\n */\ngoog.soy.CompatibleIj_;\n\n/**\n * Type definition for strict Soy templates. Very useful when passing a template\n * as an argument.\n * @typedef {function(?=,\n * ?goog.soy.CompatibleIj_=):(string|!goog.soy.data.SanitizedContent)}\n */\ngoog.soy.StrictTemplate;\n\n/**\n * Type definition for strict Soy HTML templates. Very useful when passing\n * a template as an argument.\n * @typedef {function(?=,\n * ?goog.soy.CompatibleIj_=):!goog.soy.data.SanitizedHtml}\n */\ngoog.soy.StrictHtmlTemplate;\n\n\n/**\n * Type definition for text templates.\n * @typedef {function(?=, ?goog.soy.CompatibleIj_=):string}\n */\ngoog.soy.TextTemplate;\n\n\n/**\n * Sets the processed template as the innerHTML of an element. It is recommended\n * to use this helper function instead of directly setting innerHTML in your\n * hand-written code, so that it will be easier to audit the code for cross-site\n * scripting vulnerabilities.\n *\n * @param {?Element} element The element whose content we are rendering into.\n * @param {!goog.soy.data.SanitizedContent} templateResult The processed\n *     template of kind HTML or TEXT (which will be escaped).\n * @template ARG_TYPES\n */\ngoog.soy.renderHtml = function(element, templateResult) {\n  goog.dom.safe.unsafeSetInnerHtmlDoNotUseOrElse(\n      goog.asserts.assert(element),\n      goog.soy.ensureTemplateOutputHtml_(templateResult));\n};\n\n\n// TODO(b/36644846): remove the second half of the function type union\n/**\n * Renders a Soy template and then set the output string as\n * the innerHTML of an element. It is recommended to use this helper function\n * instead of directly setting innerHTML in your hand-written code, so that it\n * will be easier to audit the code for cross-site scripting vulnerabilities.\n *\n * @param {Element} element The element whose content we are rendering into.\n * @param {?function(ARG_TYPES, ?goog.soy.CompatibleIj_=):*|\n *     ?function(ARG_TYPES, null=, Object<string, *>=):*} template\n *     The Soy template defining the element's content.\n * @param {ARG_TYPES=} opt_templateData The data for the template.\n * @param {Object=} opt_injectedData The injected data for the template.\n * @template ARG_TYPES\n */\ngoog.soy.renderElement = function(\n    element, template, opt_templateData, opt_injectedData) {\n  // Soy template parameter is only nullable for historical reasons.\n  goog.asserts.assert(template, 'Soy template may not be null.');\n  var html = goog.soy.ensureTemplateOutputHtml_(template(\n      opt_templateData || goog.soy.defaultTemplateData_, undefined,\n      opt_injectedData));\n  goog.dom.safe.unsafeSetInnerHtmlDoNotUseOrElse(\n      goog.asserts.assert(element), html);\n};\n\n// TODO(b/36644846): remove the second half of the function type union\n/**\n * Renders a Soy template into a single node or a document\n * fragment. If the rendered HTML string represents a single node, then that\n * node is returned (note that this is *not* a fragment, despite them name of\n * the method). Otherwise a document fragment is returned containing the\n * rendered nodes.\n *\n * @param {\n *     ?function(ARG_TYPES,\n * ?goog.soy.CompatibleIj_=):!goog.soy.data.SanitizedContent|\n *     ?function(ARG_TYPES, null=, Object<string, *>=):\n *     goog.soy.data.SanitizedContent} template The Soy template defining the\n *     element's content. The kind of the template must be \"html\" or \"text\".\n * @param {ARG_TYPES=} opt_templateData The data for the template.\n * @param {Object=} opt_injectedData The injected data for the template.\n * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper used to\n *     create DOM nodes; defaults to `goog.dom.getDomHelper`.\n * @return {!Node} The resulting node or document fragment.\n * @template ARG_TYPES\n */\ngoog.soy.renderAsFragment = function(\n    template, opt_templateData, opt_injectedData, opt_domHelper) {\n  // Soy template parameter is only nullable for historical reasons.\n  goog.asserts.assert(template, 'Soy template may not be null.');\n  var dom = opt_domHelper || goog.dom.getDomHelper();\n  var output = template(\n      opt_templateData || goog.soy.defaultTemplateData_, undefined,\n      opt_injectedData);\n  var html = goog.soy.ensureTemplateOutputHtml_(output);\n  goog.soy.assertFirstTagValid_(html.getTypedStringValue());\n  return dom.safeHtmlToNode(html);\n};\n\n// TODO(b/36644846): remove the second half of the function type union\n/**\n * Renders a Soy template into a single node. If the rendered\n * HTML string represents a single node, then that node is returned. Otherwise,\n * a DIV element is returned containing the rendered nodes.\n *\n * @param {?function(ARG_TYPES, ?goog.soy.CompatibleIj_=):*|\n *     ?function(ARG_TYPES, null=, Object<string, *>=):*} template\n *     The Soy template defining the element's content.\n * @param {ARG_TYPES=} opt_templateData The data for the template.\n * @param {Object=} opt_injectedData The injected data for the template.\n * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper used to\n *     create DOM nodes; defaults to `goog.dom.getDomHelper`.\n * @return {!Element} Rendered template contents, wrapped in a parent DIV\n *     element if necessary.\n * @template ARG_TYPES\n */\ngoog.soy.renderAsElement = function(\n    template, opt_templateData, opt_injectedData, opt_domHelper) {\n  // Soy template parameter is only nullable for historical reasons.\n  goog.asserts.assert(template, 'Soy template may not be null.');\n  return goog.soy.convertToElement_(\n      template(\n          opt_templateData || goog.soy.defaultTemplateData_, undefined,\n          opt_injectedData),\n      opt_domHelper);\n};\n\n\n/**\n * Converts a processed Soy template into a single node. If the rendered\n * HTML string represents a single node, then that node is returned. Otherwise,\n * a DIV element is returned containing the rendered nodes.\n *\n * @param {!goog.soy.data.SanitizedContent} templateResult The processed\n *     template of kind HTML or TEXT (which will be escaped).\n * @param {?goog.dom.DomHelper=} opt_domHelper The DOM helper used to\n *     create DOM nodes; defaults to `goog.dom.getDomHelper`.\n * @return {!Element} Rendered template contents, wrapped in a parent DIV\n *     element if necessary.\n */\ngoog.soy.convertToElement = function(templateResult, opt_domHelper) {\n  return goog.soy.convertToElement_(templateResult, opt_domHelper);\n};\n\n\n/**\n * Non-strict version of `goog.soy.convertToElement`.\n *\n * @param {*} templateResult The processed template.\n * @param {?goog.dom.DomHelper=} opt_domHelper The DOM helper used to\n *     create DOM nodes; defaults to `goog.dom.getDomHelper`.\n * @return {!Element} Rendered template contents, wrapped in a parent DIV\n *     element if necessary.\n * @private\n */\ngoog.soy.convertToElement_ = function(templateResult, opt_domHelper) {\n  var dom = opt_domHelper || goog.dom.getDomHelper();\n  var wrapper = dom.createElement(goog.dom.TagName.DIV);\n  var html = goog.soy.ensureTemplateOutputHtml_(templateResult);\n  goog.soy.assertFirstTagValid_(html.getTypedStringValue());\n  goog.dom.safe.unsafeSetInnerHtmlDoNotUseOrElse(wrapper, html);\n\n  // If the template renders as a single element, return it.\n  if (wrapper.childNodes.length == 1) {\n    var firstChild = wrapper.firstChild;\n    if (firstChild.nodeType == goog.dom.NodeType.ELEMENT) {\n      return /** @type {!Element} */ (firstChild);\n    }\n  }\n\n  // Otherwise, return the wrapper DIV.\n  return wrapper;\n};\n\n\n/**\n * Ensures the result is \"safe\" to insert as HTML.\n *\n * In the case the argument is a SanitizedContent object, it either must\n * already be of kind HTML, or if it is kind=\"text\", the output will be HTML\n * escaped.\n *\n * @param {*} templateResult The template result.\n * @return {!goog.html.SafeHtml} The assumed-safe HTML output string.\n * @private\n */\ngoog.soy.ensureTemplateOutputHtml_ = function(templateResult) {\n  // Note we allow everything that isn't an object, because some non-escaping\n  // templates end up returning non-strings if their only print statement is a\n  // non-escaped argument, plus some unit tests spoof templates.\n  // TODO(gboyer): Track down and fix these cases.\n  if (!goog.isObject(templateResult)) {\n    return goog.html.SafeHtml.htmlEscape(String(templateResult));\n  }\n\n  // Allow SanitizedContent of kind HTML.\n  if (templateResult instanceof goog.soy.data.SanitizedContent) {\n    return templateResult.toSafeHtml();\n  }\n\n  goog.asserts.fail(\n      'Soy template output is unsafe for use as HTML: ' + templateResult);\n\n  // In production, return a safe string, rather than failing hard.\n  return goog.html.SafeHtml.htmlEscape('zSoyz');\n};\n\n\n/**\n * Checks that the rendered HTML does not start with an invalid tag that would\n * likely cause unexpected output from renderAsElement or renderAsFragment.\n * See {@link http://www.w3.org/TR/html5/semantics.html#semantics} for reference\n * as to which HTML elements can be parents of each other.\n * @param {string} html The output of a template.\n * @private\n */\ngoog.soy.assertFirstTagValid_ = function(html) {\n  if (goog.asserts.ENABLE_ASSERTS) {\n    var matches = html.match(goog.soy.INVALID_TAG_TO_RENDER_);\n    goog.asserts.assert(\n        !matches, 'This template starts with a %s, which ' +\n            'cannot be a child of a <div>, as required by soy internals. ' +\n            'Consider using goog.soy.renderElement instead.\\nTemplate output: %s',\n        matches && matches[0], html);\n  }\n};\n\n\n/**\n * A pattern to find templates that cannot be rendered by renderAsElement or\n * renderAsFragment, as these elements cannot exist as the child of a <div>.\n * @type {!RegExp}\n * @private\n */\ngoog.soy.INVALID_TAG_TO_RENDER_ =\n    /^<(body|caption|col|colgroup|head|html|tr|td|th|tbody|thead|tfoot)>/i;\n\n\n/**\n * Immutable object that is passed into templates that are rendered\n * without any data.\n * @private @const\n */\ngoog.soy.defaultTemplateData_ = {};\n","^17",1579837703000,"^18",["^19",["^1S","^1T","^3G","^Z","^2[","~$goog.soy.data.SanitizedContent","^2B","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/soy/soy.js"],"^1J",["^19",["~$goog.soy"]],"^X",true,"^Y",["^Z","^1S","^1T","^3G","^1V","^2[","^2B","^3N"]],["^ ","^[",[1579837703000],"^10","goog.ui.ac.arraymatcher.js","^11",["^12","goog/ui/ac/arraymatcher.js"],"^13","goog/ui/ac/arraymatcher.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Basic class for matching words in an array.\n *\n */\n\n\ngoog.provide('goog.ui.ac.ArrayMatcher');\n\ngoog.require('goog.string');\n\n\n\n/**\n * Basic class for matching words in an array\n * @constructor\n * @param {Array<?>} rows Dictionary of items to match.  Can be objects if they\n *     have a toString method that returns the value to match against.\n * @param {boolean=} opt_noSimilar if true, do not do similarity matches for the\n *     input token against the dictionary.\n */\ngoog.ui.ac.ArrayMatcher = function(rows, opt_noSimilar) {\n  this.rows_ = rows || [];\n  this.useSimilar_ = !opt_noSimilar;\n};\n\n\n/**\n * Replaces the rows that this object searches over.\n * @param {Array<?>} rows Dictionary of items to match.\n */\ngoog.ui.ac.ArrayMatcher.prototype.setRows = function(rows) {\n  this.rows_ = rows || [];\n};\n\n\n/**\n * Function used to pass matches to the autocomplete\n * @param {string} token Token to match.\n * @param {number} maxMatches Max number of matches to return.\n * @param {Function} matchHandler callback to execute after matching.\n * @param {string=} opt_fullString The full string from the input box.\n */\ngoog.ui.ac.ArrayMatcher.prototype.requestMatchingRows = function(\n    token, maxMatches, matchHandler, opt_fullString) {\n\n  var matches = this.useSimilar_ ?\n      goog.ui.ac.ArrayMatcher.getMatchesForRows(token, maxMatches, this.rows_) :\n      this.getPrefixMatches(token, maxMatches);\n\n  matchHandler(token, matches);\n};\n\n\n/**\n * Matches the token against the specified rows, first looking for prefix\n * matches and if that fails, then looking for similar matches.\n *\n * @param {string} token Token to match.\n * @param {number} maxMatches Max number of matches to return.\n * @param {!Array<?>} rows Rows to search for matches. Can be objects if they\n *     have a toString method that returns the value to match against.\n * @return {!Array<?>} Rows that match.\n */\ngoog.ui.ac.ArrayMatcher.getMatchesForRows = function(token, maxMatches, rows) {\n  var matches =\n      goog.ui.ac.ArrayMatcher.getPrefixMatchesForRows(token, maxMatches, rows);\n\n  if (matches.length == 0) {\n    matches = goog.ui.ac.ArrayMatcher.getSimilarMatchesForRows(\n        token, maxMatches, rows);\n  }\n  return matches;\n};\n\n\n/**\n * Matches the token against the start of words in the row.\n * @param {string} token Token to match.\n * @param {number} maxMatches Max number of matches to return.\n * @return {!Array<?>} Rows that match.\n */\ngoog.ui.ac.ArrayMatcher.prototype.getPrefixMatches = function(\n    token, maxMatches) {\n  return goog.ui.ac.ArrayMatcher.getPrefixMatchesForRows(\n      token, maxMatches, this.rows_);\n};\n\n\n/**\n * Matches the token against the start of words in the row.\n * @param {string} token Token to match.\n * @param {number} maxMatches Max number of matches to return.\n * @param {!Array<?>} rows Rows to search for matches. Can be objects if they\n * have\n *     a toString method that returns the value to match against.\n * @return {!Array<?>} Rows that match.\n */\ngoog.ui.ac.ArrayMatcher.getPrefixMatchesForRows = function(\n    token, maxMatches, rows) {\n  var matches = [];\n\n  if (token != '') {\n    var escapedToken = goog.string.regExpEscape(token);\n    var matcher = new RegExp('(^|\\\\W+)' + escapedToken, 'i');\n\n    for (var i = 0; i < rows.length && matches.length < maxMatches; i++) {\n      var row = rows[i];\n      if (String(row).match(matcher)) {\n        matches.push(row);\n      }\n    }\n  }\n  return matches;\n};\n\n\n/**\n * Matches the token against similar rows, by calculating \"distance\" between the\n * terms.\n * @param {string} token Token to match.\n * @param {number} maxMatches Max number of matches to return.\n * @return {!Array<?>} The best maxMatches rows.\n */\ngoog.ui.ac.ArrayMatcher.prototype.getSimilarRows = function(token, maxMatches) {\n  return goog.ui.ac.ArrayMatcher.getSimilarMatchesForRows(\n      token, maxMatches, this.rows_);\n};\n\n\n/**\n * Matches the token against similar rows, by calculating \"distance\" between the\n * terms.\n * @param {string} token Token to match.\n * @param {number} maxMatches Max number of matches to return.\n * @param {!Array<?>} rows Rows to search for matches. Can be objects\n *     if they have a toString method that returns the value to\n *     match against.\n * @return {!Array<?>} The best maxMatches rows.\n */\ngoog.ui.ac.ArrayMatcher.getSimilarMatchesForRows = function(\n    token, maxMatches, rows) {\n  var results = [];\n\n  for (var index = 0; index < rows.length; index++) {\n    var row = rows[index];\n    var str = token.toLowerCase();\n    var txt = String(row).toLowerCase();\n    var score = 0;\n\n    if (txt.indexOf(str) != -1) {\n      score = parseInt((txt.indexOf(str) / 4).toString(), 10);\n\n    } else {\n      var arr = str.split('');\n\n      var lastPos = -1;\n      var penalty = 10;\n\n      for (var i = 0, c; c = arr[i]; i++) {\n        var pos = txt.indexOf(c);\n\n        if (pos > lastPos) {\n          var diff = pos - lastPos - 1;\n\n          if (diff > penalty - 5) {\n            diff = penalty - 5;\n          }\n\n          score += diff;\n\n          lastPos = pos;\n        } else {\n          score += penalty;\n          penalty += 5;\n        }\n      }\n    }\n\n    if (score < str.length * 6) {\n      results.push({str: row, score: score, index: index});\n    }\n  }\n\n  results.sort(function(a, b) {\n    var diff = a.score - b.score;\n    if (diff != 0) {\n      return diff;\n    }\n    return a.index - b.index;\n  });\n\n  var matches = [];\n  for (var i = 0; i < maxMatches && i < results.length; i++) {\n    matches.push(results[i].str);\n  }\n\n  return matches;\n};\n","^17",1579837703000,"^18",["^19",["^2D","^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/ac/arraymatcher.js"],"^1J",["^19",["~$goog.ui.ac.ArrayMatcher"]],"^X",true,"^Y",["^Z","^2D"]],["^ ","^[",[1579837703000],"^10","goog.dom.classlist.js","^11",["^12","goog/dom/classlist.js"],"^13","goog/dom/classlist.js","^14","^15","^16","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for detecting, adding and removing classes.  Prefer\n * this over goog.dom.classes for new code since it attempts to use classList\n * (DOMTokenList: http://dom.spec.whatwg.org/#domtokenlist) which is faster\n * and requires less code.\n *\n * Note: these utilities are meant to operate on HTMLElements and SVGElements\n * and may have unexpected behavior on elements with differing interfaces.\n */\n\n\ngoog.provide('goog.dom.classlist');\n\ngoog.require('goog.array');\n\n\n/**\n * Override this define at build-time if you know your target supports it.\n * @define {boolean} Whether to use the classList property (DOMTokenList).\n */\ngoog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST =\n    goog.define('goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST', false);\n\n\n/**\n * A wrapper which ensures correct functionality when interacting with\n * SVGElements\n * @param {?Element} element DOM node to get the class name of.\n * @return {string}\n * @private\n */\ngoog.dom.classlist.getClassName_ = function(element) {\n  // If className is an instance of SVGAnimatedString use getAttribute\n  return typeof element.className == 'string' ?\n      element.className :\n      element.getAttribute && element.getAttribute('class') || '';\n};\n\n\n/**\n * Gets an array-like object of class names on an element.\n * @param {Element} element DOM node to get the classes of.\n * @return {!IArrayLike<?>} Class names on `element`.\n */\ngoog.dom.classlist.get = function(element) {\n  if (goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST || element.classList) {\n    return element.classList;\n  }\n\n  return goog.dom.classlist.getClassName_(element).match(/\\S+/g) || [];\n};\n\n\n/**\n * Sets the entire class name of an element.\n * @param {Element} element DOM node to set class of.\n * @param {string} className Class name(s) to apply to element.\n */\ngoog.dom.classlist.set = function(element, className) {\n  // If className is an instance of SVGAnimatedString use setAttribute\n  if ((typeof element.className) == 'string') {\n    element.className = className;\n    return;\n  } else if (element.setAttribute) {\n    element.setAttribute('class', className);\n  }\n};\n\n\n/**\n * Returns true if an element has a class.  This method may throw a DOM\n * exception for an invalid or empty class name if DOMTokenList is used.\n * @param {Element} element DOM node to test.\n * @param {string} className Class name to test for.\n * @return {boolean} Whether element has the class.\n */\ngoog.dom.classlist.contains = function(element, className) {\n  if (goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST || element.classList) {\n    return element.classList.contains(className);\n  }\n  return goog.array.contains(goog.dom.classlist.get(element), className);\n};\n\n\n/**\n * Adds a class to an element.  Does not add multiples of class names.  This\n * method may throw a DOM exception for an invalid or empty class name if\n * DOMTokenList is used.\n * @param {Element} element DOM node to add class to.\n * @param {string} className Class name to add.\n */\ngoog.dom.classlist.add = function(element, className) {\n  if (goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST || element.classList) {\n    element.classList.add(className);\n    return;\n  }\n\n  if (!goog.dom.classlist.contains(element, className)) {\n    // Ensure we add a space if this is not the first class name added.\n    var oldClassName = goog.dom.classlist.getClassName_(element);\n    goog.dom.classlist.set(\n        element,\n        oldClassName +\n            (oldClassName.length > 0 ? (' ' + className) : className));\n  }\n};\n\n\n/**\n * Convenience method to add a number of class names at once.\n * @param {Element} element The element to which to add classes.\n * @param {IArrayLike<string>} classesToAdd An array-like object\n * containing a collection of class names to add to the element.\n * This method may throw a DOM exception if classesToAdd contains invalid\n * or empty class names.\n */\ngoog.dom.classlist.addAll = function(element, classesToAdd) {\n  if (goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST || element.classList) {\n    goog.array.forEach(classesToAdd, function(className) {\n      goog.dom.classlist.add(element, className);\n    });\n    return;\n  }\n\n  var classMap = {};\n\n  // Get all current class names into a map.\n  goog.array.forEach(goog.dom.classlist.get(element), function(className) {\n    classMap[className] = true;\n  });\n\n  // Add new class names to the map.\n  goog.array.forEach(\n      classesToAdd, function(className) { classMap[className] = true; });\n\n  // Flatten the keys of the map into the className.\n  var newClassName = '';\n  for (var className in classMap) {\n    newClassName += newClassName.length > 0 ? (' ' + className) : className;\n  }\n  goog.dom.classlist.set(element, newClassName);\n};\n\n\n/**\n * Removes a class from an element.  This method may throw a DOM exception\n * for an invalid or empty class name if DOMTokenList is used.\n * @param {Element} element DOM node to remove class from.\n * @param {string} className Class name to remove.\n */\ngoog.dom.classlist.remove = function(element, className) {\n  if (goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST || element.classList) {\n    element.classList.remove(className);\n    return;\n  }\n\n  if (goog.dom.classlist.contains(element, className)) {\n    // Filter out the class name.\n    goog.dom.classlist.set(\n        element,\n        goog.array\n            .filter(\n                goog.dom.classlist.get(element),\n                function(c) {\n                  return c != className;\n                })\n            .join(' '));\n  }\n};\n\n\n/**\n * Removes a set of classes from an element.  Prefer this call to\n * repeatedly calling `goog.dom.classlist.remove` if you want to remove\n * a large set of class names at once.\n * @param {Element} element The element from which to remove classes.\n * @param {IArrayLike<string>} classesToRemove An array-like object\n * containing a collection of class names to remove from the element.\n * This method may throw a DOM exception if classesToRemove contains invalid\n * or empty class names.\n */\ngoog.dom.classlist.removeAll = function(element, classesToRemove) {\n  if (goog.dom.classlist.ALWAYS_USE_DOM_TOKEN_LIST || element.classList) {\n    goog.array.forEach(classesToRemove, function(className) {\n      goog.dom.classlist.remove(element, className);\n    });\n    return;\n  }\n\n  // Filter out those classes in classesToRemove.\n  goog.dom.classlist.set(\n      element,\n      goog.array\n          .filter(\n              goog.dom.classlist.get(element),\n              function(className) {\n                // If this class is not one we are trying to remove,\n                // add it to the array of new class names.\n                return !goog.array.contains(classesToRemove, className);\n              })\n          .join(' '));\n};\n\n\n/**\n * Adds or removes a class depending on the enabled argument.  This method\n * may throw a DOM exception for an invalid or empty class name if DOMTokenList\n * is used.\n * @param {Element} element DOM node to add or remove the class on.\n * @param {string} className Class name to add or remove.\n * @param {boolean} enabled Whether to add or remove the class (true adds,\n *     false removes).\n */\ngoog.dom.classlist.enable = function(element, className, enabled) {\n  if (enabled) {\n    goog.dom.classlist.add(element, className);\n  } else {\n    goog.dom.classlist.remove(element, className);\n  }\n};\n\n\n/**\n * Adds or removes a set of classes depending on the enabled argument.  This\n * method may throw a DOM exception for an invalid or empty class name if\n * DOMTokenList is used.\n * @param {!Element} element DOM node to add or remove the class on.\n * @param {?IArrayLike<string>} classesToEnable An array-like object\n *     containing a collection of class names to add or remove from the element.\n * @param {boolean} enabled Whether to add or remove the classes (true adds,\n *     false removes).\n */\ngoog.dom.classlist.enableAll = function(element, classesToEnable, enabled) {\n  var f = enabled ? goog.dom.classlist.addAll : goog.dom.classlist.removeAll;\n  f(element, classesToEnable);\n};\n\n\n/**\n * Switches a class on an element from one to another without disturbing other\n * classes. If the fromClass isn't removed, the toClass won't be added.  This\n * method may throw a DOM exception if the class names are empty or invalid.\n * @param {Element} element DOM node to swap classes on.\n * @param {string} fromClass Class to remove.\n * @param {string} toClass Class to add.\n * @return {boolean} Whether classes were switched.\n */\ngoog.dom.classlist.swap = function(element, fromClass, toClass) {\n  if (goog.dom.classlist.contains(element, fromClass)) {\n    goog.dom.classlist.remove(element, fromClass);\n    goog.dom.classlist.add(element, toClass);\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Removes a class if an element has it, and adds it the element doesn't have\n * it.  Won't affect other classes on the node.  This method may throw a DOM\n * exception if the class name is empty or invalid.\n * @param {Element} element DOM node to toggle class on.\n * @param {string} className Class to toggle.\n * @return {boolean} True if class was added, false if it was removed\n *     (in other words, whether element has the class after this function has\n *     been called).\n */\ngoog.dom.classlist.toggle = function(element, className) {\n  var add = !goog.dom.classlist.contains(element, className);\n  goog.dom.classlist.enable(element, className, add);\n  return add;\n};\n\n\n/**\n * Adds and removes a class of an element.  Unlike\n * {@link goog.dom.classlist.swap}, this method adds the classToAdd regardless\n * of whether the classToRemove was present and had been removed.  This method\n * may throw a DOM exception if the class names are empty or invalid.\n *\n * @param {Element} element DOM node to swap classes on.\n * @param {string} classToRemove Class to remove.\n * @param {string} classToAdd Class to add.\n */\ngoog.dom.classlist.addRemove = function(element, classToRemove, classToAdd) {\n  goog.dom.classlist.remove(element, classToRemove);\n  goog.dom.classlist.add(element, classToAdd);\n};\n","^17",1579837703000,"^18",["^19",["^Z","^35"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/classlist.js"],"^1J",["^19",["^2O"]],"^X",true,"^Y",["^Z","^35"]],["^ ","^[",[1579837703000],"^10","goog.dom.textrange.js","^11",["^12","goog/dom/textrange.js"],"^13","goog/dom/textrange.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for working with text ranges in HTML documents.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.dom.TextRange');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.AbstractRange');\ngoog.require('goog.dom.RangeType');\ngoog.require('goog.dom.SavedRange');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.TextRangeIterator');\ngoog.require('goog.dom.browserrange');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Create a new text selection with no properties.  Do not use this constructor:\n * use one of the goog.dom.Range.createFrom* methods instead.\n * @constructor\n * @extends {goog.dom.AbstractRange}\n * @final\n */\ngoog.dom.TextRange = function() {\n  /**\n   * The browser specific range wrapper.  This can be null if one of the other\n   * representations of the range is specified.\n   * @private {goog.dom.browserrange.AbstractRange?}\n   */\n  this.browserRangeWrapper_ = null;\n\n  /**\n   * The start node of the range.  This can be null if one of the other\n   * representations of the range is specified.\n   * @private {?Node}\n   */\n  this.startNode_ = null;\n\n  /**\n   * The start offset of the range.  This can be null if one of the other\n   * representations of the range is specified.\n   * @private {?number}\n   */\n  this.startOffset_ = null;\n\n  /**\n   * The end node of the range.  This can be null if one of the other\n   * representations of the range is specified.\n   * @private {?Node}\n   */\n  this.endNode_ = null;\n\n  /**\n   * The end offset of the range.  This can be null if one of the other\n   * representations of the range is specified.\n   * @private {?number}\n   */\n  this.endOffset_ = null;\n\n  /**\n   * Whether the focus node is before the anchor node.\n   * @private {boolean}\n   */\n  this.isReversed_ = false;\n};\ngoog.inherits(goog.dom.TextRange, goog.dom.AbstractRange);\n\n\n/**\n * Create a new range wrapper from the given browser range object.  Do not use\n * this method directly - please use goog.dom.Range.createFrom* instead.\n * @param {Range|TextRange} range The browser range object.\n * @param {boolean=} opt_isReversed Whether the focus node is before the anchor\n *     node.\n * @return {!goog.dom.TextRange} A range wrapper object.\n */\ngoog.dom.TextRange.createFromBrowserRange = function(range, opt_isReversed) {\n  return goog.dom.TextRange.createFromBrowserRangeWrapper_(\n      goog.dom.browserrange.createRange(range), opt_isReversed);\n};\n\n\n/**\n * Create a new range wrapper from the given browser range wrapper.\n * @param {goog.dom.browserrange.AbstractRange} browserRange The browser range\n *     wrapper.\n * @param {boolean=} opt_isReversed Whether the focus node is before the anchor\n *     node.\n * @return {!goog.dom.TextRange} A range wrapper object.\n * @private\n */\ngoog.dom.TextRange.createFromBrowserRangeWrapper_ = function(\n    browserRange, opt_isReversed) {\n  var range = new goog.dom.TextRange();\n\n  // Initialize the range as a browser range wrapper type range.\n  range.browserRangeWrapper_ = browserRange;\n  range.isReversed_ = !!opt_isReversed;\n\n  return range;\n};\n\n\n/**\n * Create a new range wrapper that selects the given node's text.  Do not use\n * this method directly - please use goog.dom.Range.createFrom* instead.\n * @param {Node} node The node to select.\n * @param {boolean=} opt_isReversed Whether the focus node is before the anchor\n *     node.\n * @return {!goog.dom.TextRange} A range wrapper object.\n */\ngoog.dom.TextRange.createFromNodeContents = function(node, opt_isReversed) {\n  return goog.dom.TextRange.createFromBrowserRangeWrapper_(\n      goog.dom.browserrange.createRangeFromNodeContents(node), opt_isReversed);\n};\n\n\n/**\n * Create a new range wrapper that selects the area between the given nodes,\n * accounting for the given offsets.  Do not use this method directly - please\n * use goog.dom.Range.createFrom* instead.\n * @param {Node} anchorNode The node to start with.\n * @param {number} anchorOffset The offset within the node to start.\n * @param {Node} focusNode The node to end with.\n * @param {number} focusOffset The offset within the node to end.\n * @return {!goog.dom.TextRange} A range wrapper object.\n */\ngoog.dom.TextRange.createFromNodes = function(\n    anchorNode, anchorOffset, focusNode, focusOffset) {\n  var range = new goog.dom.TextRange();\n  range.isReversed_ = /** @suppress {missingRequire} */ (\n      goog.dom.Range.isReversed(\n          anchorNode, anchorOffset, focusNode, focusOffset));\n\n  // Avoid selecting terminal elements directly\n  if (goog.dom.isElement(anchorNode) && !goog.dom.canHaveChildren(anchorNode)) {\n    var parent = anchorNode.parentNode;\n    anchorOffset = goog.array.indexOf(parent.childNodes, anchorNode);\n    anchorNode = parent;\n  }\n\n  if (goog.dom.isElement(focusNode) && !goog.dom.canHaveChildren(focusNode)) {\n    var parent = focusNode.parentNode;\n    focusOffset = goog.array.indexOf(parent.childNodes, focusNode);\n    focusNode = parent;\n  }\n\n  // Initialize the range as a W3C style range.\n  if (range.isReversed_) {\n    range.startNode_ = focusNode;\n    range.startOffset_ = focusOffset;\n    range.endNode_ = anchorNode;\n    range.endOffset_ = anchorOffset;\n  } else {\n    range.startNode_ = anchorNode;\n    range.startOffset_ = anchorOffset;\n    range.endNode_ = focusNode;\n    range.endOffset_ = focusOffset;\n  }\n\n  return range;\n};\n\n\n// Method implementations\n\n\n/**\n * @return {!goog.dom.TextRange} A clone of this range.\n * @override\n */\ngoog.dom.TextRange.prototype.clone = function() {\n  var range = new goog.dom.TextRange();\n  range.browserRangeWrapper_ =\n      this.browserRangeWrapper_ && this.browserRangeWrapper_.clone();\n  range.startNode_ = this.startNode_;\n  range.startOffset_ = this.startOffset_;\n  range.endNode_ = this.endNode_;\n  range.endOffset_ = this.endOffset_;\n  range.isReversed_ = this.isReversed_;\n\n  return range;\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.getType = function() {\n  return goog.dom.RangeType.TEXT;\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.getBrowserRangeObject = function() {\n  return this.getBrowserRangeWrapper_().getBrowserRange();\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.setBrowserRangeObject = function(nativeRange) {\n  // Test if it's a control range by seeing if a control range only method\n  // exists.\n  if (goog.dom.AbstractRange.isNativeControlRange(nativeRange)) {\n    return false;\n  }\n  this.browserRangeWrapper_ = goog.dom.browserrange.createRange(nativeRange);\n  this.clearCachedValues_();\n  return true;\n};\n\n\n/**\n * Clear all cached values.\n * @private\n */\ngoog.dom.TextRange.prototype.clearCachedValues_ = function() {\n  this.startNode_ = this.startOffset_ = this.endNode_ = this.endOffset_ = null;\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.getTextRangeCount = function() {\n  return 1;\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.getTextRange = function(i) {\n  return this;\n};\n\n\n/**\n * @return {!goog.dom.browserrange.AbstractRange} The range wrapper object.\n * @private\n */\ngoog.dom.TextRange.prototype.getBrowserRangeWrapper_ = function() {\n  return this.browserRangeWrapper_ ||\n      (this.browserRangeWrapper_ = goog.dom.browserrange.createRangeFromNodes(\n           this.getStartNode(), this.getStartOffset(), this.getEndNode(),\n           this.getEndOffset()));\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.getContainer = function() {\n  return this.getBrowserRangeWrapper_().getContainer();\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.getStartNode = function() {\n  return this.startNode_ ||\n      (this.startNode_ = this.getBrowserRangeWrapper_().getStartNode());\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.getStartOffset = function() {\n  return this.startOffset_ != null ?\n      this.startOffset_ :\n      (this.startOffset_ = this.getBrowserRangeWrapper_().getStartOffset());\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.getStartPosition = function() {\n  return this.getBrowserRangeWrapper_().getStartPosition();\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.getEndNode = function() {\n  return this.endNode_ ||\n      (this.endNode_ = this.getBrowserRangeWrapper_().getEndNode());\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.getEndOffset = function() {\n  return this.endOffset_ != null ?\n      this.endOffset_ :\n      (this.endOffset_ = this.getBrowserRangeWrapper_().getEndOffset());\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.getEndPosition = function() {\n  return this.getBrowserRangeWrapper_().getEndPosition();\n};\n\n\n/**\n * Moves a TextRange to the provided nodes and offsets.\n * @param {Node} startNode The node to start with.\n * @param {number} startOffset The offset within the node to start.\n * @param {Node} endNode The node to end with.\n * @param {number} endOffset The offset within the node to end.\n * @param {boolean} isReversed Whether the range is reversed.\n */\ngoog.dom.TextRange.prototype.moveToNodes = function(\n    startNode, startOffset, endNode, endOffset, isReversed) {\n  this.startNode_ = startNode;\n  this.startOffset_ = startOffset;\n  this.endNode_ = endNode;\n  this.endOffset_ = endOffset;\n  this.isReversed_ = isReversed;\n  this.browserRangeWrapper_ = null;\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.isReversed = function() {\n  return this.isReversed_;\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.containsRange = function(\n    otherRange, opt_allowPartial) {\n  var otherRangeType = otherRange.getType();\n  if (otherRangeType == goog.dom.RangeType.TEXT) {\n    return this.getBrowserRangeWrapper_().containsRange(\n        otherRange.getBrowserRangeWrapper_(), opt_allowPartial);\n  } else if (otherRangeType == goog.dom.RangeType.CONTROL) {\n    var elements = otherRange.getElements();\n    var fn = opt_allowPartial ? goog.array.some : goog.array.every;\n    return fn(\n        elements,\n        /**\n         * @this {goog.dom.TextRange}\n         * @param {!Element} el\n         * @return {boolean}\n         */\n        function(el) {\n          return this.containsNode(el, opt_allowPartial);\n        },\n        this);\n  }\n  return false;\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.containsNode = function(node, opt_allowPartial) {\n  return this.containsRange(\n      goog.dom.TextRange.createFromNodeContents(node), opt_allowPartial);\n};\n\n\n\n/**\n * Tests if the given node is in a document.\n * @param {Node} node The node to check.\n * @return {boolean} Whether the given node is in the given document.\n */\ngoog.dom.TextRange.isAttachedNode = function(node) {\n  if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) {\n    var returnValue = false;\n\n    try {\n      returnValue = node.parentNode;\n    } catch (e) {\n      // IE sometimes throws Invalid Argument errors when a node is detached.\n      // Note: trying to return a value from the above try block can cause IE\n      // to crash.  It is necessary to use the local returnValue\n    }\n    return !!returnValue;\n  } else {\n    return goog.dom.contains(node.ownerDocument.body, node);\n  }\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.isRangeInDocument = function() {\n  // Ensure any cached nodes are in the document.  IE also allows ranges to\n  // become detached, so we check if the range is still in the document as\n  // well for IE.\n  return (!this.startNode_ ||\n          goog.dom.TextRange.isAttachedNode(this.startNode_)) &&\n      (!this.endNode_ || goog.dom.TextRange.isAttachedNode(this.endNode_)) &&\n      (!(goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) ||\n       this.getBrowserRangeWrapper_().isRangeInDocument());\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.isCollapsed = function() {\n  return this.getBrowserRangeWrapper_().isCollapsed();\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.getText = function() {\n  return this.getBrowserRangeWrapper_().getText();\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.getHtmlFragment = function() {\n  // TODO(robbyw): Generalize the code in browserrange so it is static and\n  // just takes an iterator.  This would mean we don't always have to create a\n  // browser range.\n  return this.getBrowserRangeWrapper_().getHtmlFragment();\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.getValidHtml = function() {\n  return this.getBrowserRangeWrapper_().getValidHtml();\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.getPastableHtml = function() {\n  // TODO(robbyw): Get any attributes the table or tr has.\n\n  var html = this.getValidHtml();\n\n  if (html.match(/^\\s*<td\\b/i)) {\n    // Match html starting with a TD.\n    html = '<table><tbody><tr>' + html + '</tr></tbody></table>';\n  } else if (html.match(/^\\s*<tr\\b/i)) {\n    // Match html starting with a TR.\n    html = '<table><tbody>' + html + '</tbody></table>';\n  } else if (html.match(/^\\s*<tbody\\b/i)) {\n    // Match html starting with a TBODY.\n    html = '<table>' + html + '</table>';\n  } else if (html.match(/^\\s*<li\\b/i)) {\n    // Match html starting with an LI.\n    var container = /** @type {!Element} */ (this.getContainer());\n    var tagType = goog.dom.TagName.UL;\n    while (container) {\n      if (container.tagName == goog.dom.TagName.OL) {\n        tagType = goog.dom.TagName.OL;\n        break;\n      } else if (container.tagName == goog.dom.TagName.UL) {\n        break;\n      }\n      container = container.parentNode;\n    }\n    html = goog.string.buildString('<', tagType, '>', html, '</', tagType, '>');\n  }\n\n  return html;\n};\n\n\n/**\n * Returns a TextRangeIterator over the contents of the range.  Regardless of\n * the direction of the range, the iterator will move in document order.\n * @param {boolean=} opt_keys Unused for this iterator.\n * @return {!goog.dom.TextRangeIterator} An iterator over tags in the range.\n * @override\n */\ngoog.dom.TextRange.prototype.__iterator__ = function(opt_keys) {\n  return new goog.dom.TextRangeIterator(\n      this.getStartNode(), this.getStartOffset(), this.getEndNode(),\n      this.getEndOffset());\n};\n\n\n// RANGE ACTIONS\n\n\n/** @override */\ngoog.dom.TextRange.prototype.select = function() {\n  this.getBrowserRangeWrapper_().select(this.isReversed_);\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.removeContents = function() {\n  this.getBrowserRangeWrapper_().removeContents();\n  this.clearCachedValues_();\n};\n\n\n/**\n * Surrounds the text range with the specified element (on Mozilla) or with a\n * clone of the specified element (on IE).  Returns a reference to the\n * surrounding element if the operation was successful; returns null if the\n * operation failed.\n * @param {Element} element The element with which the selection is to be\n *    surrounded.\n * @return {Element} The surrounding element (same as the argument on Mozilla,\n *    but not on IE), or null if unsuccessful.\n */\ngoog.dom.TextRange.prototype.surroundContents = function(element) {\n  var output = this.getBrowserRangeWrapper_().surroundContents(element);\n  this.clearCachedValues_();\n  return output;\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.insertNode = function(node, before) {\n  var output = this.getBrowserRangeWrapper_().insertNode(node, before);\n  this.clearCachedValues_();\n  return output;\n};\n\n\n/** @override */\ngoog.dom.TextRange.prototype.surroundWithNodes = function(startNode, endNode) {\n  this.getBrowserRangeWrapper_().surroundWithNodes(startNode, endNode);\n  this.clearCachedValues_();\n};\n\n\n// SAVE/RESTORE\n\n\n/** @override */\ngoog.dom.TextRange.prototype.saveUsingDom = function() {\n  return new goog.dom.DomSavedTextRange_(this);\n};\n\n\n// RANGE MODIFICATION\n\n\n/** @override */\ngoog.dom.TextRange.prototype.collapse = function(toAnchor) {\n  var toStart = this.isReversed() ? !toAnchor : toAnchor;\n\n  if (this.browserRangeWrapper_) {\n    this.browserRangeWrapper_.collapse(toStart);\n  }\n\n  if (toStart) {\n    this.endNode_ = this.startNode_;\n    this.endOffset_ = this.startOffset_;\n  } else {\n    this.startNode_ = this.endNode_;\n    this.startOffset_ = this.endOffset_;\n  }\n\n  // Collapsed ranges can't be reversed\n  this.isReversed_ = false;\n};\n\n\n// SAVED RANGE OBJECTS\n\n\n\n/**\n * A SavedRange implementation using DOM endpoints.\n * @param {goog.dom.AbstractRange} range The range to save.\n * @constructor\n * @extends {goog.dom.SavedRange}\n * @private\n */\ngoog.dom.DomSavedTextRange_ = function(range) {\n  goog.dom.DomSavedTextRange_.base(this, 'constructor');\n\n  /**\n   * The anchor node.\n   * @type {Node}\n   * @private\n   */\n  this.anchorNode_ = range.getAnchorNode();\n\n  /**\n   * The anchor node offset.\n   * @type {number}\n   * @private\n   */\n  this.anchorOffset_ = range.getAnchorOffset();\n\n  /**\n   * The focus node.\n   * @type {Node}\n   * @private\n   */\n  this.focusNode_ = range.getFocusNode();\n\n  /**\n   * The focus node offset.\n   * @type {number}\n   * @private\n   */\n  this.focusOffset_ = range.getFocusOffset();\n};\ngoog.inherits(goog.dom.DomSavedTextRange_, goog.dom.SavedRange);\n\n\n/**\n * @return {!goog.dom.AbstractRange} The restored range.\n * @override\n */\ngoog.dom.DomSavedTextRange_.prototype.restoreInternal = function() {\n  return /** @suppress {missingRequire} */ (\n      goog.dom.Range.createFromNodes(\n          this.anchorNode_, this.anchorOffset_, this.focusNode_,\n          this.focusOffset_));\n};\n\n\n/** @override */\ngoog.dom.DomSavedTextRange_.prototype.disposeInternal = function() {\n  goog.dom.DomSavedTextRange_.superClass_.disposeInternal.call(this);\n\n  this.anchorNode_ = null;\n  this.focusNode_ = null;\n};\n","^17",1579837703000,"^18",["^19",["^1T","~$goog.dom.AbstractRange","~$goog.dom.SavedRange","^2D","~$goog.dom.TextRangeIterator","^Z","^2X","~$goog.dom.browserrange","~$goog.dom.RangeType","^35","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/textrange.js"],"^1J",["^19",["~$goog.dom.TextRange"]],"^X",true,"^Y",["^Z","^35","^1T","^3Q","^3U","^3R","^1V","^3S","^3T","^2D","^2X"]],["^ ","^[",[1579837703000],"^10","goog.math.coordinate.js","^11",["^12","goog/math/coordinate.js"],"^13","goog/math/coordinate.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A utility class for representing two-dimensional positions.\n */\n\n\ngoog.provide('goog.math.Coordinate');\n\ngoog.require('goog.math');\n\n\n\n/**\n * Class for representing coordinates and positions.\n * @param {number=} opt_x Left, defaults to 0.\n * @param {number=} opt_y Top, defaults to 0.\n * @struct\n * @constructor\n */\ngoog.math.Coordinate = function(opt_x, opt_y) {\n  /**\n   * X-value\n   * @type {number}\n   */\n  this.x = (opt_x !== undefined) ? opt_x : 0;\n\n  /**\n   * Y-value\n   * @type {number}\n   */\n  this.y = (opt_y !== undefined) ? opt_y : 0;\n};\n\n\n/**\n * Returns a new copy of the coordinate.\n * @return {!goog.math.Coordinate} A clone of this coordinate.\n */\ngoog.math.Coordinate.prototype.clone = function() {\n  return new goog.math.Coordinate(this.x, this.y);\n};\n\n\nif (goog.DEBUG) {\n  /**\n   * Returns a nice string representing the coordinate.\n   * @return {string} In the form (50, 73).\n   * @override\n   */\n  goog.math.Coordinate.prototype.toString = function() {\n    return '(' + this.x + ', ' + this.y + ')';\n  };\n}\n\n\n/**\n * Returns whether the specified value is equal to this coordinate.\n * @param {*} other Some other value.\n * @return {boolean} Whether the specified value is equal to this coordinate.\n */\ngoog.math.Coordinate.prototype.equals = function(other) {\n  return other instanceof goog.math.Coordinate &&\n      goog.math.Coordinate.equals(this, other);\n};\n\n\n/**\n * Compares coordinates for equality.\n * @param {goog.math.Coordinate} a A Coordinate.\n * @param {goog.math.Coordinate} b A Coordinate.\n * @return {boolean} True iff the coordinates are equal, or if both are null.\n */\ngoog.math.Coordinate.equals = function(a, b) {\n  if (a == b) {\n    return true;\n  }\n  if (!a || !b) {\n    return false;\n  }\n  return a.x == b.x && a.y == b.y;\n};\n\n\n/**\n * Returns the distance between two coordinates.\n * @param {!goog.math.Coordinate} a A Coordinate.\n * @param {!goog.math.Coordinate} b A Coordinate.\n * @return {number} The distance between `a` and `b`.\n */\ngoog.math.Coordinate.distance = function(a, b) {\n  var dx = a.x - b.x;\n  var dy = a.y - b.y;\n  return Math.sqrt(dx * dx + dy * dy);\n};\n\n\n/**\n * Returns the magnitude of a coordinate.\n * @param {!goog.math.Coordinate} a A Coordinate.\n * @return {number} The distance between the origin and `a`.\n */\ngoog.math.Coordinate.magnitude = function(a) {\n  return Math.sqrt(a.x * a.x + a.y * a.y);\n};\n\n\n/**\n * Returns the angle from the origin to a coordinate.\n * @param {!goog.math.Coordinate} a A Coordinate.\n * @return {number} The angle, in degrees, clockwise from the positive X\n *     axis to `a`.\n */\ngoog.math.Coordinate.azimuth = function(a) {\n  return goog.math.angle(0, 0, a.x, a.y);\n};\n\n\n/**\n * Returns the squared distance between two coordinates. Squared distances can\n * be used for comparisons when the actual value is not required.\n *\n * Performance note: eliminating the square root is an optimization often used\n * in lower-level languages, but the speed difference is not nearly as\n * pronounced in JavaScript (only a few percent.)\n *\n * @param {!goog.math.Coordinate} a A Coordinate.\n * @param {!goog.math.Coordinate} b A Coordinate.\n * @return {number} The squared distance between `a` and `b`.\n */\ngoog.math.Coordinate.squaredDistance = function(a, b) {\n  var dx = a.x - b.x;\n  var dy = a.y - b.y;\n  return dx * dx + dy * dy;\n};\n\n\n/**\n * Returns the difference between two coordinates as a new\n * goog.math.Coordinate.\n * @param {!goog.math.Coordinate} a A Coordinate.\n * @param {!goog.math.Coordinate} b A Coordinate.\n * @return {!goog.math.Coordinate} A Coordinate representing the difference\n *     between `a` and `b`.\n */\ngoog.math.Coordinate.difference = function(a, b) {\n  return new goog.math.Coordinate(a.x - b.x, a.y - b.y);\n};\n\n\n/**\n * Returns the sum of two coordinates as a new goog.math.Coordinate.\n * @param {!goog.math.Coordinate} a A Coordinate.\n * @param {!goog.math.Coordinate} b A Coordinate.\n * @return {!goog.math.Coordinate} A Coordinate representing the sum of the two\n *     coordinates.\n */\ngoog.math.Coordinate.sum = function(a, b) {\n  return new goog.math.Coordinate(a.x + b.x, a.y + b.y);\n};\n\n\n/**\n * Rounds the x and y fields to the next larger integer values.\n * @return {!goog.math.Coordinate} This coordinate with ceil'd fields.\n */\ngoog.math.Coordinate.prototype.ceil = function() {\n  this.x = Math.ceil(this.x);\n  this.y = Math.ceil(this.y);\n  return this;\n};\n\n\n/**\n * Rounds the x and y fields to the next smaller integer values.\n * @return {!goog.math.Coordinate} This coordinate with floored fields.\n */\ngoog.math.Coordinate.prototype.floor = function() {\n  this.x = Math.floor(this.x);\n  this.y = Math.floor(this.y);\n  return this;\n};\n\n\n/**\n * Rounds the x and y fields to the nearest integer values.\n * @return {!goog.math.Coordinate} This coordinate with rounded fields.\n */\ngoog.math.Coordinate.prototype.round = function() {\n  this.x = Math.round(this.x);\n  this.y = Math.round(this.y);\n  return this;\n};\n\n\n/**\n * Translates this box by the given offsets. If a `goog.math.Coordinate`\n * is given, then the x and y values are translated by the coordinate's x and y.\n * Otherwise, x and y are translated by `tx` and `opt_ty`\n * respectively.\n * @param {number|goog.math.Coordinate} tx The value to translate x by or the\n *     the coordinate to translate this coordinate by.\n * @param {number=} opt_ty The value to translate y by.\n * @return {!goog.math.Coordinate} This coordinate after translating.\n */\ngoog.math.Coordinate.prototype.translate = function(tx, opt_ty) {\n  if (tx instanceof goog.math.Coordinate) {\n    this.x += tx.x;\n    this.y += tx.y;\n  } else {\n    this.x += Number(tx);\n    if (typeof opt_ty === 'number') {\n      this.y += opt_ty;\n    }\n  }\n  return this;\n};\n\n\n/**\n * Scales this coordinate by the given scale factors. The x and y values are\n * scaled by `sx` and `opt_sy` respectively.  If `opt_sy`\n * is not given, then `sx` is used for both x and y.\n * @param {number} sx The scale factor to use for the x dimension.\n * @param {number=} opt_sy The scale factor to use for the y dimension.\n * @return {!goog.math.Coordinate} This coordinate after scaling.\n */\ngoog.math.Coordinate.prototype.scale = function(sx, opt_sy) {\n  var sy = (typeof opt_sy === 'number') ? opt_sy : sx;\n  this.x *= sx;\n  this.y *= sy;\n  return this;\n};\n\n\n/**\n * Rotates this coordinate clockwise about the origin (or, optionally, the given\n * center) by the given angle, in radians.\n * @param {number} radians The angle by which to rotate this coordinate\n *     clockwise about the given center, in radians.\n * @param {!goog.math.Coordinate=} opt_center The center of rotation. Defaults\n *     to (0, 0) if not given.\n */\ngoog.math.Coordinate.prototype.rotateRadians = function(radians, opt_center) {\n  var center = opt_center || new goog.math.Coordinate(0, 0);\n\n  var x = this.x;\n  var y = this.y;\n  var cos = Math.cos(radians);\n  var sin = Math.sin(radians);\n\n  this.x = (x - center.x) * cos - (y - center.y) * sin + center.x;\n  this.y = (x - center.x) * sin + (y - center.y) * cos + center.y;\n};\n\n\n/**\n * Rotates this coordinate clockwise about the origin (or, optionally, the given\n * center) by the given angle, in degrees.\n * @param {number} degrees The angle by which to rotate this coordinate\n *     clockwise about the given center, in degrees.\n * @param {!goog.math.Coordinate=} opt_center The center of rotation. Defaults\n *     to (0, 0) if not given.\n */\ngoog.math.Coordinate.prototype.rotateDegrees = function(degrees, opt_center) {\n  this.rotateRadians(goog.math.toRadians(degrees), opt_center);\n};\n","^17",1579837703000,"^18",["^19",["^Z","^3>"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/coordinate.js"],"^1J",["^19",["^26"]],"^X",true,"^Y",["^Z","^3>"]],["^ ","^[",[1579837703000],"^10","goog.labs.mock.timeoutmode.js","^11",["^12","goog/labs/mock/timeoutmode.js"],"^13","goog/labs/mock/timeoutmode.js","^14","^15","^16","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides an interface that defines how users can extend the\n * `goog.labs.mock` mocking framework with a TimeoutMode. This is used\n * with waitAndVerify to specify a max timeout.\n *\n * In addition it exports a factory method that allows users to easily obtain\n * a TimeoutMode instance.\n */\n\ngoog.provide('goog.labs.mock.timeout');\ngoog.provide('goog.labs.mock.timeout.TimeoutMode');\n\n/**\n * Used to specify max timeout on waitAndVerify\n * @const\n */\ngoog.labs.mock.timeout.TimeoutMode = class TimeoutMode {\n  /**\n   * @param {number} duration\n   */\n  constructor(duration) {\n    /**\n     * @type {number} duration\n     * @public\n     */\n    this.duration = duration;\n  }\n};\n\n/**\n * @param {number} duration\n * @return {!goog.labs.mock.timeout.TimeoutMode}\n */\ngoog.labs.mock.timeout.timeout = function(duration) {\n  return new goog.labs.mock.timeout.TimeoutMode(duration);\n};\n","^17",1579837703000,"^18",["^19",["^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/mock/timeoutmode.js"],"^1J",["^19",["~$goog.labs.mock.timeout","~$goog.labs.mock.timeout.TimeoutMode"]],"^X",true,"^Y",["^Z"]],["^ ","^[",[1579837703000],"^10","goog.object.object.js","^11",["^12","goog/object/object.js"],"^13","goog/object/object.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for manipulating objects/maps/hashes.\n * @author arv@google.com (Erik Arvidsson)\n */\n\ngoog.provide('goog.object');\n\n\n/**\n * Whether two values are not observably distinguishable. This\n * correctly detects that 0 is not the same as -0 and two NaNs are\n * practically equivalent.\n *\n * The implementation is as suggested by harmony:egal proposal.\n *\n * @param {*} v The first value to compare.\n * @param {*} v2 The second value to compare.\n * @return {boolean} Whether two values are not observably distinguishable.\n * @see http://wiki.ecmascript.org/doku.php?id=harmony:egal\n */\ngoog.object.is = function(v, v2) {\n  if (v === v2) {\n    // 0 === -0, but they are not identical.\n    // We need the cast because the compiler requires that v2 is a\n    // number (although 1/v2 works with non-number). We cast to ? to\n    // stop the compiler from type-checking this statement.\n    return v !== 0 || 1 / v === 1 / /** @type {?} */ (v2);\n  }\n\n  // NaN is non-reflexive: NaN !== NaN, although they are identical.\n  return v !== v && v2 !== v2;\n};\n\n\n/**\n * Calls a function for each element in an object/map/hash.\n *\n * @param {Object<K,V>} obj The object over which to iterate.\n * @param {function(this:T,V,?,Object<K,V>):?} f The function to call\n *     for every element. This function takes 3 arguments (the value, the\n *     key and the object) and the return value is ignored.\n * @param {T=} opt_obj This is used as the 'this' object within f.\n * @template T,K,V\n */\ngoog.object.forEach = function(obj, f, opt_obj) {\n  for (const key in obj) {\n    f.call(/** @type {?} */ (opt_obj), obj[key], key, obj);\n  }\n};\n\n\n/**\n * Calls a function for each element in an object/map/hash. If that call returns\n * true, adds the element to a new object.\n *\n * @param {Object<K,V>} obj The object over which to iterate.\n * @param {function(this:T,V,?,Object<K,V>):boolean} f The function to call\n *     for every element. This\n *     function takes 3 arguments (the value, the key and the object)\n *     and should return a boolean. If the return value is true the\n *     element is added to the result object. If it is false the\n *     element is not included.\n * @param {T=} opt_obj This is used as the 'this' object within f.\n * @return {!Object<K,V>} a new object in which only elements that passed the\n *     test are present.\n * @template T,K,V\n */\ngoog.object.filter = function(obj, f, opt_obj) {\n  const res = {};\n  for (const key in obj) {\n    if (f.call(/** @type {?} */ (opt_obj), obj[key], key, obj)) {\n      res[key] = obj[key];\n    }\n  }\n  return res;\n};\n\n\n/**\n * For every element in an object/map/hash calls a function and inserts the\n * result into a new object.\n *\n * @param {Object<K,V>} obj The object over which to iterate.\n * @param {function(this:T,V,?,Object<K,V>):R} f The function to call\n *     for every element. This function\n *     takes 3 arguments (the value, the key and the object)\n *     and should return something. The result will be inserted\n *     into a new object.\n * @param {T=} opt_obj This is used as the 'this' object within f.\n * @return {!Object<K,R>} a new object with the results from f.\n * @template T,K,V,R\n */\ngoog.object.map = function(obj, f, opt_obj) {\n  const res = {};\n  for (const key in obj) {\n    res[key] = f.call(/** @type {?} */ (opt_obj), obj[key], key, obj);\n  }\n  return res;\n};\n\n\n/**\n * Calls a function for each element in an object/map/hash. If any\n * call returns true, returns true (without checking the rest). If\n * all calls return false, returns false.\n *\n * @param {Object<K,V>} obj The object to check.\n * @param {function(this:T,V,?,Object<K,V>):boolean} f The function to\n *     call for every element. This function\n *     takes 3 arguments (the value, the key and the object) and should\n *     return a boolean.\n * @param {T=} opt_obj This is used as the 'this' object within f.\n * @return {boolean} true if any element passes the test.\n * @template T,K,V\n */\ngoog.object.some = function(obj, f, opt_obj) {\n  for (const key in obj) {\n    if (f.call(/** @type {?} */ (opt_obj), obj[key], key, obj)) {\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Calls a function for each element in an object/map/hash. If\n * all calls return true, returns true. If any call returns false, returns\n * false at this point and does not continue to check the remaining elements.\n *\n * @param {Object<K,V>} obj The object to check.\n * @param {?function(this:T,V,?,Object<K,V>):boolean} f The function to\n *     call for every element. This function\n *     takes 3 arguments (the value, the key and the object) and should\n *     return a boolean.\n * @param {T=} opt_obj This is used as the 'this' object within f.\n * @return {boolean} false if any element fails the test.\n * @template T,K,V\n */\ngoog.object.every = function(obj, f, opt_obj) {\n  for (const key in obj) {\n    if (!f.call(/** @type {?} */ (opt_obj), obj[key], key, obj)) {\n      return false;\n    }\n  }\n  return true;\n};\n\n\n/**\n * Returns the number of key-value pairs in the object map.\n *\n * @param {Object} obj The object for which to get the number of key-value\n *     pairs.\n * @return {number} The number of key-value pairs in the object map.\n */\ngoog.object.getCount = function(obj) {\n  let rv = 0;\n  for (const key in obj) {\n    rv++;\n  }\n  return rv;\n};\n\n\n/**\n * Returns one key from the object map, if any exists.\n * For map literals the returned key will be the first one in most of the\n * browsers (a know exception is Konqueror).\n *\n * @param {Object} obj The object to pick a key from.\n * @return {string|undefined} The key or undefined if the object is empty.\n */\ngoog.object.getAnyKey = function(obj) {\n  for (const key in obj) {\n    return key;\n  }\n};\n\n\n/**\n * Returns one value from the object map, if any exists.\n * For map literals the returned value will be the first one in most of the\n * browsers (a know exception is Konqueror).\n *\n * @param {Object<K,V>} obj The object to pick a value from.\n * @return {V|undefined} The value or undefined if the object is empty.\n * @template K,V\n */\ngoog.object.getAnyValue = function(obj) {\n  for (const key in obj) {\n    return obj[key];\n  }\n};\n\n\n/**\n * Whether the object/hash/map contains the given object as a value.\n * An alias for goog.object.containsValue(obj, val).\n *\n * @param {Object<K,V>} obj The object in which to look for val.\n * @param {V} val The object for which to check.\n * @return {boolean} true if val is present.\n * @template K,V\n */\ngoog.object.contains = function(obj, val) {\n  return goog.object.containsValue(obj, val);\n};\n\n\n/**\n * Returns the values of the object/map/hash.\n *\n * @param {Object<K,V>} obj The object from which to get the values.\n * @return {!Array<V>} The values in the object/map/hash.\n * @template K,V\n */\ngoog.object.getValues = function(obj) {\n  const res = [];\n  let i = 0;\n  for (const key in obj) {\n    res[i++] = obj[key];\n  }\n  return res;\n};\n\n\n/**\n * Returns the keys of the object/map/hash.\n *\n * @param {Object} obj The object from which to get the keys.\n * @return {!Array<string>} Array of property keys.\n */\ngoog.object.getKeys = function(obj) {\n  const res = [];\n  let i = 0;\n  for (const key in obj) {\n    res[i++] = key;\n  }\n  return res;\n};\n\n\n/**\n * Get a value from an object multiple levels deep.  This is useful for\n * pulling values from deeply nested objects, such as JSON responses.\n * Example usage: getValueByKeys(jsonObj, 'foo', 'entries', 3)\n *\n * @param {!Object} obj An object to get the value from.  Can be array-like.\n * @param {...(string|number|!IArrayLike<number|string>)}\n *     var_args A number of keys\n *     (as strings, or numbers, for array-like objects).  Can also be\n *     specified as a single array of keys.\n * @return {*} The resulting value.  If, at any point, the value for a key\n *     in the current object is null or undefined, returns undefined.\n */\ngoog.object.getValueByKeys = function(obj, var_args) {\n  const isArrayLike = goog.isArrayLike(var_args);\n  const keys = isArrayLike ?\n      /** @type {!IArrayLike<number|string>} */ (var_args) :\n      arguments;\n\n  // Start with the 2nd parameter for the variable parameters syntax.\n  for (let i = isArrayLike ? 0 : 1; i < keys.length; i++) {\n    if (obj == null) return undefined;\n    obj = obj[keys[i]];\n  }\n\n  return obj;\n};\n\n\n/**\n * Whether the object/map/hash contains the given key.\n *\n * @param {Object} obj The object in which to look for key.\n * @param {?} key The key for which to check.\n * @return {boolean} true If the map contains the key.\n */\ngoog.object.containsKey = function(obj, key) {\n  return obj !== null && key in obj;\n};\n\n\n/**\n * Whether the object/map/hash contains the given value. This is O(n).\n *\n * @param {Object<K,V>} obj The object in which to look for val.\n * @param {V} val The value for which to check.\n * @return {boolean} true If the map contains the value.\n * @template K,V\n */\ngoog.object.containsValue = function(obj, val) {\n  for (const key in obj) {\n    if (obj[key] == val) {\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Searches an object for an element that satisfies the given condition and\n * returns its key.\n * @param {Object<K,V>} obj The object to search in.\n * @param {function(this:T,V,string,Object<K,V>):boolean} f The\n *      function to call for every element. Takes 3 arguments (the value,\n *     the key and the object) and should return a boolean.\n * @param {T=} opt_this An optional \"this\" context for the function.\n * @return {string|undefined} The key of an element for which the function\n *     returns true or undefined if no such element is found.\n * @template T,K,V\n */\ngoog.object.findKey = function(obj, f, opt_this) {\n  for (const key in obj) {\n    if (f.call(/** @type {?} */ (opt_this), obj[key], key, obj)) {\n      return key;\n    }\n  }\n  return undefined;\n};\n\n\n/**\n * Searches an object for an element that satisfies the given condition and\n * returns its value.\n * @param {Object<K,V>} obj The object to search in.\n * @param {function(this:T,V,string,Object<K,V>):boolean} f The function\n *     to call for every element. Takes 3 arguments (the value, the key\n *     and the object) and should return a boolean.\n * @param {T=} opt_this An optional \"this\" context for the function.\n * @return {V} The value of an element for which the function returns true or\n *     undefined if no such element is found.\n * @template T,K,V\n */\ngoog.object.findValue = function(obj, f, opt_this) {\n  const key = goog.object.findKey(obj, f, opt_this);\n  return key && obj[key];\n};\n\n\n/**\n * Whether the object/map/hash is empty.\n *\n * @param {Object} obj The object to test.\n * @return {boolean} true if obj is empty.\n */\ngoog.object.isEmpty = function(obj) {\n  for (const key in obj) {\n    return false;\n  }\n  return true;\n};\n\n\n/**\n * Removes all key value pairs from the object/map/hash.\n *\n * @param {Object} obj The object to clear.\n */\ngoog.object.clear = function(obj) {\n  for (const i in obj) {\n    delete obj[i];\n  }\n};\n\n\n/**\n * Removes a key-value pair based on the key.\n *\n * @param {Object} obj The object from which to remove the key.\n * @param {?} key The key to remove.\n * @return {boolean} Whether an element was removed.\n */\ngoog.object.remove = function(obj, key) {\n  let rv;\n  if (rv = key in /** @type {!Object} */ (obj)) {\n    delete obj[key];\n  }\n  return rv;\n};\n\n\n/**\n * Adds a key-value pair to the object. Throws an exception if the key is\n * already in use. Use set if you want to change an existing pair.\n *\n * @param {Object<K,V>} obj The object to which to add the key-value pair.\n * @param {string} key The key to add.\n * @param {V} val The value to add.\n * @template K,V\n */\ngoog.object.add = function(obj, key, val) {\n  if (obj !== null && key in obj) {\n    throw new Error('The object already contains the key \"' + key + '\"');\n  }\n  goog.object.set(obj, key, val);\n};\n\n\n/**\n * Returns the value for the given key.\n *\n * @param {Object<K,V>} obj The object from which to get the value.\n * @param {string} key The key for which to get the value.\n * @param {R=} opt_val The value to return if no item is found for the given\n *     key (default is undefined).\n * @return {V|R|undefined} The value for the given key.\n * @template K,V,R\n */\ngoog.object.get = function(obj, key, opt_val) {\n  if (obj !== null && key in obj) {\n    return obj[key];\n  }\n  return opt_val;\n};\n\n\n/**\n * Adds a key-value pair to the object/map/hash.\n *\n * @param {Object<K,V>} obj The object to which to add the key-value pair.\n * @param {string} key The key to add.\n * @param {V} value The value to add.\n * @template K,V\n */\ngoog.object.set = function(obj, key, value) {\n  obj[key] = value;\n};\n\n\n/**\n * Adds a key-value pair to the object/map/hash if it doesn't exist yet.\n *\n * @param {Object<K,V>} obj The object to which to add the key-value pair.\n * @param {string} key The key to add.\n * @param {V} value The value to add if the key wasn't present.\n * @return {V} The value of the entry at the end of the function.\n * @template K,V\n */\ngoog.object.setIfUndefined = function(obj, key, value) {\n  return key in /** @type {!Object} */ (obj) ? obj[key] : (obj[key] = value);\n};\n\n\n/**\n * Sets a key and value to an object if the key is not set. The value will be\n * the return value of the given function. If the key already exists, the\n * object will not be changed and the function will not be called (the function\n * will be lazily evaluated -- only called if necessary).\n *\n * This function is particularly useful when used with an `Object` which is\n * acting as a cache.\n *\n * @param {!Object<K,V>} obj The object to which to add the key-value pair.\n * @param {string} key The key to add.\n * @param {function():V} f The value to add if the key wasn't present.\n * @return {V} The value of the entry at the end of the function.\n * @template K,V\n */\ngoog.object.setWithReturnValueIfNotSet = function(obj, key, f) {\n  if (key in obj) {\n    return obj[key];\n  }\n\n  const val = f();\n  obj[key] = val;\n  return val;\n};\n\n\n/**\n * Compares two objects for equality using === on the values.\n *\n * @param {!Object<K,V>} a\n * @param {!Object<K,V>} b\n * @return {boolean}\n * @template K,V\n */\ngoog.object.equals = function(a, b) {\n  for (const k in a) {\n    if (!(k in b) || a[k] !== b[k]) {\n      return false;\n    }\n  }\n  for (const k in b) {\n    if (!(k in a)) {\n      return false;\n    }\n  }\n  return true;\n};\n\n\n/**\n * Returns a shallow clone of the object.\n *\n * @param {Object<K,V>} obj Object to clone.\n * @return {!Object<K,V>} Clone of the input object.\n * @template K,V\n */\ngoog.object.clone = function(obj) {\n  // We cannot use the prototype trick because a lot of methods depend on where\n  // the actual key is set.\n\n  const res = {};\n  for (const key in obj) {\n    res[key] = obj[key];\n  }\n  return res;\n  // We could also use goog.mixin but I wanted this to be independent from that.\n};\n\n\n/**\n * Clones a value. The input may be an Object, Array, or basic type. Objects and\n * arrays will be cloned recursively.\n *\n * WARNINGS:\n * <code>goog.object.unsafeClone</code> does not detect reference loops. Objects\n * that refer to themselves will cause infinite recursion.\n *\n * <code>goog.object.unsafeClone</code> is unaware of unique identifiers, and\n * copies UIDs created by <code>getUid</code> into cloned results.\n *\n * @param {T} obj The value to clone.\n * @return {T} A clone of the input value.\n * @template T\n */\ngoog.object.unsafeClone = function(obj) {\n  const type = goog.typeOf(obj);\n  if (type == 'object' || type == 'array') {\n    if (goog.isFunction(obj.clone)) {\n      return obj.clone();\n    }\n    const clone = type == 'array' ? [] : {};\n    for (const key in obj) {\n      clone[key] = goog.object.unsafeClone(obj[key]);\n    }\n    return clone;\n  }\n\n  return obj;\n};\n\n\n/**\n * Returns a new object in which all the keys and values are interchanged\n * (keys become values and values become keys). If multiple keys map to the\n * same value, the chosen transposed value is implementation-dependent.\n *\n * @param {Object} obj The object to transpose.\n * @return {!Object} The transposed object.\n */\ngoog.object.transpose = function(obj) {\n  const transposed = {};\n  for (const key in obj) {\n    transposed[obj[key]] = key;\n  }\n  return transposed;\n};\n\n\n/**\n * The names of the fields that are defined on Object.prototype.\n * @type {Array<string>}\n * @private\n */\ngoog.object.PROTOTYPE_FIELDS_ = [\n  'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',\n  'toLocaleString', 'toString', 'valueOf'\n];\n\n\n/**\n * Extends an object with another object.\n * This operates 'in-place'; it does not create a new Object.\n *\n * Example:\n * var o = {};\n * goog.object.extend(o, {a: 0, b: 1});\n * o; // {a: 0, b: 1}\n * goog.object.extend(o, {b: 2, c: 3});\n * o; // {a: 0, b: 2, c: 3}\n *\n * @param {Object} target The object to modify. Existing properties will be\n *     overwritten if they are also present in one of the objects in\n *     `var_args`.\n * @param {...(Object|null|undefined)} var_args The objects from which values\n *     will be copied.\n * @deprecated Prefer Object.assign\n */\ngoog.object.extend = function(target, var_args) {\n  let key;\n  let source;\n  for (let i = 1; i < arguments.length; i++) {\n    source = arguments[i];\n    for (key in source) {\n      target[key] = source[key];\n    }\n\n    // For IE the for-in-loop does not contain any properties that are not\n    // enumerable on the prototype object (for example isPrototypeOf from\n    // Object.prototype) and it will also not include 'replace' on objects that\n    // extend String and change 'replace' (not that it is common for anyone to\n    // extend anything except Object).\n\n    for (let j = 0; j < goog.object.PROTOTYPE_FIELDS_.length; j++) {\n      key = goog.object.PROTOTYPE_FIELDS_[j];\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }\n};\n\n\n/**\n * Creates a new object built from the key-value pairs provided as arguments.\n * @param {...*} var_args If only one argument is provided and it is an array\n *     then this is used as the arguments, otherwise even arguments are used as\n *     the property names and odd arguments are used as the property values.\n * @return {!Object} The new object.\n * @throws {Error} If there are uneven number of arguments or there is only one\n *     non array argument.\n */\ngoog.object.create = function(var_args) {\n  const argLength = arguments.length;\n  if (argLength == 1 && goog.isArray(arguments[0])) {\n    return goog.object.create.apply(null, arguments[0]);\n  }\n\n  if (argLength % 2) {\n    throw new Error('Uneven number of arguments');\n  }\n\n  const rv = {};\n  for (let i = 0; i < argLength; i += 2) {\n    rv[arguments[i]] = arguments[i + 1];\n  }\n  return rv;\n};\n\n\n/**\n * Creates a new object where the property names come from the arguments but\n * the value is always set to true\n * @param {...*} var_args If only one argument is provided and it is an array\n *     then this is used as the arguments, otherwise the arguments are used\n *     as the property names.\n * @return {!Object} The new object.\n */\ngoog.object.createSet = function(var_args) {\n  const argLength = arguments.length;\n  if (argLength == 1 && goog.isArray(arguments[0])) {\n    return goog.object.createSet.apply(null, arguments[0]);\n  }\n\n  const rv = {};\n  for (let i = 0; i < argLength; i++) {\n    rv[arguments[i]] = true;\n  }\n  return rv;\n};\n\n\n/**\n * Creates an immutable view of the underlying object, if the browser\n * supports immutable objects.\n *\n * In default mode, writes to this view will fail silently. In strict mode,\n * they will throw an error.\n *\n * @param {!Object<K,V>} obj An object.\n * @return {!Object<K,V>} An immutable view of that object, or the\n *     original object if this browser does not support immutables.\n * @template K,V\n */\ngoog.object.createImmutableView = function(obj) {\n  let result = obj;\n  if (Object.isFrozen && !Object.isFrozen(obj)) {\n    result = Object.create(obj);\n    Object.freeze(result);\n  }\n  return result;\n};\n\n\n/**\n * @param {!Object} obj An object.\n * @return {boolean} Whether this is an immutable view of the object.\n */\ngoog.object.isImmutableView = function(obj) {\n  return !!Object.isFrozen && Object.isFrozen(obj);\n};\n\n\n/**\n * Get all properties names on a given Object regardless of enumerability.\n *\n * <p> If the browser does not support `Object.getOwnPropertyNames` nor\n * `Object.getPrototypeOf` then this is equivalent to using\n * `goog.object.getKeys`\n *\n * @param {?Object} obj The object to get the properties of.\n * @param {boolean=} opt_includeObjectPrototype Whether properties defined on\n *     `Object.prototype` should be included in the result.\n * @param {boolean=} opt_includeFunctionPrototype Whether properties defined on\n *     `Function.prototype` should be included in the result.\n * @return {!Array<string>}\n * @public\n */\ngoog.object.getAllPropertyNames = function(\n    obj, opt_includeObjectPrototype, opt_includeFunctionPrototype) {\n  if (!obj) {\n    return [];\n  }\n\n  // Naively use a for..in loop to get the property names if the browser doesn't\n  // support any other APIs for getting it.\n  if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) {\n    return goog.object.getKeys(obj);\n  }\n\n  const visitedSet = {};\n\n  // Traverse the prototype chain and add all properties to the visited set.\n  let proto = obj;\n  while (proto &&\n         (proto !== Object.prototype || !!opt_includeObjectPrototype) &&\n         (proto !== Function.prototype || !!opt_includeFunctionPrototype)) {\n    const names = Object.getOwnPropertyNames(proto);\n    for (let i = 0; i < names.length; i++) {\n      visitedSet[names[i]] = true;\n    }\n    proto = Object.getPrototypeOf(proto);\n  }\n\n  return goog.object.getKeys(visitedSet);\n};\n\n\n/**\n * Given a ES5 or ES6 class reference, return its super class / super\n * constructor.\n *\n * This should be used in rare cases where you need to walk up the inheritance\n * tree (this is generally a bad idea). But this work with ES5 and ES6 classes,\n * unlike relying on the superClass_ property.\n *\n * Note: To start walking up the hierarchy from an instance call this with its\n * `constructor` property; e.g. `getSuperClass(instance.constructor)`.\n *\n * @param {function(new: ?)} constructor\n * @return {?Object}\n */\ngoog.object.getSuperClass = function(constructor) {\n  var proto = Object.getPrototypeOf(constructor.prototype);\n  return proto && proto.constructor;\n};\n","^17",1579837703000,"^18",["^19",["^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/object/object.js"],"^1J",["^19",["^2G"]],"^X",true,"^Y",["^Z"]],["^ ","^[",[1579837703000],"^10","goog.editor.plugins.loremipsum.js","^11",["^12","goog/editor/plugins/loremipsum.js"],"^13","goog/editor/plugins/loremipsum.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A plugin that fills the field with lorem ipsum text when it's\n * empty and does not have the focus. Applies to both editable and uneditable\n * fields.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.provide('goog.editor.plugins.LoremIpsum');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.editor.Command');\ngoog.require('goog.editor.Field');\ngoog.require('goog.editor.Plugin');\ngoog.require('goog.editor.node');\ngoog.require('goog.functions');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A plugin that manages lorem ipsum state of editable fields.\n * @param {string} message The lorem ipsum message.\n * @constructor\n * @extends {goog.editor.Plugin}\n * @final\n */\ngoog.editor.plugins.LoremIpsum = function(message) {\n  goog.editor.Plugin.call(this);\n\n  /**\n   * The lorem ipsum message.\n   * @type {string}\n   * @private\n   */\n  this.message_ = message;\n};\ngoog.inherits(goog.editor.plugins.LoremIpsum, goog.editor.Plugin);\n\n\n/** @override */\ngoog.editor.plugins.LoremIpsum.prototype.getTrogClassId =\n    goog.functions.constant('LoremIpsum');\n\n\n/** @override */\ngoog.editor.plugins.LoremIpsum.prototype.activeOnUneditableFields =\n    goog.functions.TRUE;\n\n\n/**\n * Whether the field is currently filled with lorem ipsum text.\n * @type {boolean}\n * @private\n */\ngoog.editor.plugins.LoremIpsum.prototype.usingLorem_ = false;\n\n\n/**\n * Handles queryCommandValue.\n * @param {string} command The command to query.\n * @return {boolean} The result.\n * @override\n */\ngoog.editor.plugins.LoremIpsum.prototype.queryCommandValue = function(command) {\n  return command == goog.editor.Command.USING_LOREM && this.usingLorem_;\n};\n\n\n/**\n * Handles execCommand.\n * @param {string} command The command to execute.\n *     Should be CLEAR_LOREM or UPDATE_LOREM.\n * @param {*=} opt_placeCursor Whether to place the cursor in the field\n *     after clearing lorem. Should be a boolean.\n * @override\n */\ngoog.editor.plugins.LoremIpsum.prototype.execCommand = function(\n    command, opt_placeCursor) {\n  if (command == goog.editor.Command.CLEAR_LOREM) {\n    this.clearLorem_(!!opt_placeCursor);\n  } else if (command == goog.editor.Command.UPDATE_LOREM) {\n    this.updateLorem_();\n  }\n};\n\n\n/** @override */\ngoog.editor.plugins.LoremIpsum.prototype.isSupportedCommand = function(\n    command) {\n  return command == goog.editor.Command.CLEAR_LOREM ||\n      command == goog.editor.Command.UPDATE_LOREM ||\n      command == goog.editor.Command.USING_LOREM;\n};\n\n\n/**\n * Set the lorem ipsum text in a goog.editor.Field if needed.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.editor.plugins.LoremIpsum.prototype.updateLorem_ = function() {\n  // Try to apply lorem ipsum if:\n  // 1) We have lorem ipsum text\n  // 2) There's not a dialog open, as that screws\n  //    with the dialog's ability to properly restore the selection\n  //    on dialog close (since the DOM nodes would get clobbered in FF)\n  // 3) We're not using lorem already\n  // 4) The field is not currently active (doesn't have focus).\n  var fieldObj = this.getFieldObject();\n  if (!this.usingLorem_ && !fieldObj.inModalMode() &&\n      goog.editor.Field.getActiveFieldId() != fieldObj.id) {\n    var field = fieldObj.getElement();\n    if (!field) {\n      // Fallback on the original element. This is needed by\n      // fields managed by click-to-edit.\n      field = fieldObj.getOriginalElement();\n    }\n\n    goog.asserts.assert(field);\n    if (goog.editor.node.isEmpty(field)) {\n      this.usingLorem_ = true;\n\n      // Save the old font style so it can be restored when we\n      // clear the lorem ipsum style.\n      this.oldFontStyle_ = field.style.fontStyle;\n      field.style.fontStyle = 'italic';\n      fieldObj.setSafeHtml(\n          true, goog.html.SafeHtml.htmlEscapePreservingNewlines(this.message_),\n          true);\n    }\n  }\n};\n\n\n/**\n * Clear an EditableField's lorem ipsum and put in initial text if needed.\n *\n * If using click-to-edit mode (where Trogedit manages whether the field\n * is editable), this works for both editable and uneditable fields.\n *\n * TODO(user): Is this really necessary? See TODO below.\n * @param {boolean=} opt_placeCursor Whether to place the cursor in the field\n *     after clearing lorem.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.editor.plugins.LoremIpsum.prototype.clearLorem_ = function(\n    opt_placeCursor) {\n  // Don't mess with lorem state when a dialog is open as that screws\n  // with the dialog's ability to properly restore the selection\n  // on dialog close (since the DOM nodes would get clobbered)\n  var fieldObj = this.getFieldObject();\n  if (this.usingLorem_ && !fieldObj.inModalMode()) {\n    var field = fieldObj.getElement();\n    if (!field) {\n      // Fallback on the original element. This is needed by\n      // fields managed by click-to-edit.\n      field = fieldObj.getOriginalElement();\n    }\n\n    goog.asserts.assert(field);\n    this.usingLorem_ = false;\n    field.style.fontStyle = this.oldFontStyle_;\n    fieldObj.setSafeHtml(true, null, true);\n\n    // TODO(nicksantos): I'm pretty sure that this is a hack, but talk to\n    // Julie about why this is necessary and what to do with it. Really,\n    // we need to figure out where it's necessary and remove it where it's\n    // not. Safari never places the cursor on its own willpower.\n    if (opt_placeCursor && fieldObj.isLoaded()) {\n      if (goog.userAgent.WEBKIT) {\n        goog.dom.getOwnerDocument(fieldObj.getElement()).body.focus();\n        fieldObj.focusAndPlaceCursorAtStart();\n      } else if (goog.userAgent.OPERA) {\n        fieldObj.placeCursorAtStart();\n      }\n    }\n  }\n};\n","^17",1579837703000,"^18",["^19",["^1S","^1T","^2M","^2R","^Z","^2I","^2X","~$goog.editor.Plugin","^31","^2B"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/loremipsum.js"],"^1J",["^19",["~$goog.editor.plugins.LoremIpsum"]],"^X",true,"^Y",["^Z","^1S","^1T","^2R","^2I","^3Y","^31","^2M","^2B","^2X"]],["^ ","^[",[1579837703000],"^10","goog.datasource.expr.js","^11",["^12","goog/datasource/expr.js"],"^13","goog/datasource/expr.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview\n * Expression evaluation utilities. Expression format is very similar to XPath.\n *\n * Expression details:\n * - Of format A/B/C, which will evaluate getChildNode('A').getChildNode('B').\n *    getChildNodes('C')|getChildNodeValue('C')|getChildNode('C') depending on\n *    call\n * - If expression ends with '/name()', will get the name() of the node\n *    referenced by the preceding path.\n * - If expression ends with '/count()', will get the count() of the nodes that\n *    match the expression referenced by the preceding path.\n * - If expression ends with '?', the value is OK to evaluate to null. This is\n *    not enforced by the expression evaluation functions, instead it is\n *    provided as a flag for client code which may ignore depending on usage\n * - If expression has [INDEX], will use getChildNodes().getByIndex(INDEX)\n *\n */\n\n\ngoog.provide('goog.ds.Expr');\n\ngoog.require('goog.ds.BasicNodeList');\ngoog.require('goog.ds.EmptyNodeList');\ngoog.require('goog.string');\n\n\n\n/**\n * Create a new expression. An expression uses a string expression language, and\n * from this string and a passed in DataNode can evaluate to a value, DataNode,\n * or a DataNodeList.\n *\n * @param {string=} opt_expr The string expression.\n * @constructor\n * @final\n */\ngoog.ds.Expr = function(opt_expr) {\n  if (opt_expr) {\n    this.setSource_(opt_expr);\n  }\n};\n\n\n/**\n * Set the source expression text & parse\n *\n * @param {string} expr The string expression source.\n * @param {Array=} opt_parts Array of the parts of an expression.\n * @param {goog.ds.Expr=} opt_childExpr Optional child of this expression,\n *   passed in as a hint for processing.\n * @param {goog.ds.Expr=} opt_prevExpr Optional preceding expression\n *   (i.e. $A/B/C is previous expression to B/C) passed in as a hint for\n *   processing.\n * @private\n */\ngoog.ds.Expr.prototype.setSource_ = function(\n    expr, opt_parts, opt_childExpr, opt_prevExpr) {\n  this.src_ = expr;\n\n  if (!opt_childExpr && !opt_prevExpr) {\n    // Check whether it can be empty\n    if (goog.string.endsWith(expr, goog.ds.Expr.String_.CAN_BE_EMPTY)) {\n      this.canBeEmpty_ = true;\n      expr = expr.substring(0, expr.length - 1);\n    }\n\n    // Check whether this is an node function\n    if (goog.string.endsWith(expr, '()')) {\n      if (goog.string.endsWith(expr, goog.ds.Expr.String_.NAME_EXPR) ||\n          goog.string.endsWith(expr, goog.ds.Expr.String_.COUNT_EXPR) ||\n          goog.string.endsWith(expr, goog.ds.Expr.String_.POSITION_EXPR)) {\n        var lastPos = expr.lastIndexOf(goog.ds.Expr.String_.SEPARATOR);\n        if (lastPos != -1) {\n          this.exprFn_ = expr.substring(lastPos + 1);\n          expr = expr.substring(0, lastPos);\n        } else {\n          this.exprFn_ = expr;\n          expr = goog.ds.Expr.String_.CURRENT_NODE_EXPR;\n        }\n        if (this.exprFn_ == goog.ds.Expr.String_.COUNT_EXPR) {\n          this.isCount_ = true;\n        }\n      }\n    }\n  }\n\n  // Split into component parts\n  this.parts_ = opt_parts || expr.split('/');\n  this.size_ = this.parts_.length;\n  this.last_ = this.parts_[this.size_ - 1];\n  this.root_ = this.parts_[0];\n\n  if (this.size_ == 1) {\n    this.rootExpr_ = this;\n    this.isAbsolute_ = goog.string.startsWith(expr, '$');\n  } else {\n    this.rootExpr_ = goog.ds.Expr.createInternal_(this.root_, null, this, null);\n    this.isAbsolute_ = this.rootExpr_.isAbsolute_;\n    this.root_ = this.rootExpr_.root_;\n  }\n\n  if (this.size_ == 1 && !this.isAbsolute_) {\n    // Check whether expression maps to current node, for convenience\n    this.isCurrent_ =\n        (expr == goog.ds.Expr.String_.CURRENT_NODE_EXPR ||\n         expr == goog.ds.Expr.String_.EMPTY_EXPR);\n\n    // Whether this expression is just an attribute (i.e. '@foo')\n    this.isJustAttribute_ =\n        goog.string.startsWith(expr, goog.ds.Expr.String_.ATTRIBUTE_START);\n\n    // Check whether this is a common node expression\n    this.isAllChildNodes_ = expr == goog.ds.Expr.String_.ALL_CHILD_NODES_EXPR;\n    this.isAllAttributes_ = expr == goog.ds.Expr.String_.ALL_ATTRIBUTES_EXPR;\n    this.isAllElements_ = expr == goog.ds.Expr.String_.ALL_ELEMENTS_EXPR;\n  }\n};\n\n\n/**\n * Get the source data path for the expression\n * @return {string} The path.\n */\ngoog.ds.Expr.prototype.getSource = function() {\n  return this.src_;\n};\n\n\n/**\n * Gets the last part of the expression.\n * @return {?string} Last part of the expression.\n */\ngoog.ds.Expr.prototype.getLast = function() {\n  return this.last_;\n};\n\n\n/**\n * Gets the parent expression of this expression, or null if this is top level\n * @return {goog.ds.Expr} The parent.\n */\ngoog.ds.Expr.prototype.getParent = function() {\n  if (!this.parentExprSet_) {\n    if (this.size_ > 1) {\n      this.parentExpr_ = goog.ds.Expr.createInternal_(\n          null, this.parts_.slice(0, this.parts_.length - 1), this, null);\n    }\n    this.parentExprSet_ = true;\n  }\n  return this.parentExpr_;\n};\n\n\n/**\n * Gets the parent expression of this expression, or null if this is top level\n * @return {goog.ds.Expr} The parent.\n */\ngoog.ds.Expr.prototype.getNext = function() {\n  if (!this.nextExprSet_) {\n    if (this.size_ > 1) {\n      this.nextExpr_ =\n          goog.ds.Expr.createInternal_(null, this.parts_.slice(1), null, this);\n    }\n    this.nextExprSet_ = true;\n  }\n  return this.nextExpr_;\n};\n\n\n/**\n * Evaluate an expression on a data node, and return a value\n * Recursively walks through child nodes to evaluate\n * TODO(user) Support other expression functions\n *\n * @param {goog.ds.DataNode=} opt_ds Optional datasource to evaluate against.\n *     If not provided, evaluates against DataManager global root.\n * @return {*} Value of the node, or null if doesn't exist.\n * @suppress {missingRequire} Cannot depend on goog.ds.DataManager because\n *     it creates a circular dependency.\n */\ngoog.ds.Expr.prototype.getValue = function(opt_ds) {\n  if (opt_ds == null) {\n    opt_ds = goog.ds.DataManager.getInstance();\n  } else if (this.isAbsolute_) {\n    opt_ds = opt_ds.getDataRoot ? opt_ds.getDataRoot() :\n                                  goog.ds.DataManager.getInstance();\n  }\n\n  if (this.isCount_) {\n    var nodes = this.getNodes(opt_ds);\n    return nodes.getCount();\n  }\n\n  if (this.size_ == 1) {\n    return opt_ds.getChildNodeValue(this.root_);\n  } else if (this.size_ == 0) {\n    return opt_ds.get();\n  }\n\n  var nextDs = opt_ds.getChildNode(this.root_);\n\n  if (nextDs == null) {\n    return null;\n  } else {\n    return this.getNext().getValue(nextDs);\n  }\n};\n\n\n/**\n * Evaluate an expression on a data node, and return matching nodes\n * Recursively walks through child nodes to evaluate\n *\n * @param {goog.ds.DataNode=} opt_ds Optional datasource to evaluate against.\n *     If not provided, evaluates against data root.\n * @param {boolean=} opt_canCreate If true, will try to create new nodes.\n * @return {goog.ds.DataNodeList} Matching nodes.\n */\ngoog.ds.Expr.prototype.getNodes = function(opt_ds, opt_canCreate) {\n  return /** @type {goog.ds.DataNodeList} */ (\n      this.getNodes_(opt_ds, false, opt_canCreate));\n};\n\n\n/**\n * Evaluate an expression on a data node, and return the first matching node\n * Recursively walks through child nodes to evaluate\n *\n * @param {goog.ds.DataNode=} opt_ds Optional datasource to evaluate against.\n *     If not provided, evaluates against DataManager global root.\n * @param {boolean=} opt_canCreate If true, will try to create new nodes.\n * @return {goog.ds.DataNode} Matching nodes, or null if doesn't exist.\n */\ngoog.ds.Expr.prototype.getNode = function(opt_ds, opt_canCreate) {\n  return /** @type {goog.ds.DataNode} */ (\n      this.getNodes_(opt_ds, true, opt_canCreate));\n};\n\n\n/**\n * Evaluate an expression on a data node, and return the first matching node\n * Recursively walks through child nodes to evaluate\n *\n * @param {goog.ds.DataNode=} opt_ds Optional datasource to evaluate against.\n *     If not provided, evaluates against DataManager global root.\n * @param {boolean=} opt_selectOne Whether to return single matching DataNode\n *     or matching nodes in DataNodeList.\n * @param {boolean=} opt_canCreate If true, will try to create new nodes.\n * @return {goog.ds.DataNode|goog.ds.DataNodeList} Matching node or nodes,\n *     depending on value of opt_selectOne.\n * @private\n * @suppress {missingRequire} Cannot depend on goog.ds.DataManager because\n *     it creates a circular dependency.\n */\ngoog.ds.Expr.prototype.getNodes_ = function(\n    opt_ds, opt_selectOne, opt_canCreate) {\n  if (opt_ds == null) {\n    opt_ds = goog.ds.DataManager.getInstance();\n  } else if (this.isAbsolute_) {\n    opt_ds = opt_ds.getDataRoot ? opt_ds.getDataRoot() :\n                                  goog.ds.DataManager.getInstance();\n  }\n\n  if (this.size_ == 0 && opt_selectOne) {\n    return opt_ds;\n  } else if (this.size_ == 0 && !opt_selectOne) {\n    return new goog.ds.BasicNodeList([opt_ds]);\n  } else if (this.size_ == 1) {\n    if (opt_selectOne) {\n      return opt_ds.getChildNode(this.root_, opt_canCreate);\n    } else {\n      var possibleListChild = opt_ds.getChildNode(this.root_);\n      if (possibleListChild && possibleListChild.isList()) {\n        return possibleListChild.getChildNodes();\n      } else {\n        return opt_ds.getChildNodes(this.root_);\n      }\n    }\n  } else {\n    var nextDs = opt_ds.getChildNode(this.root_, opt_canCreate);\n    if (nextDs == null && opt_selectOne) {\n      return null;\n    } else if (nextDs == null && !opt_selectOne) {\n      return new goog.ds.EmptyNodeList();\n    }\n    return this.getNext().getNodes_(nextDs, opt_selectOne, opt_canCreate);\n  }\n};\n\n\n/**\n * Whether the expression can be null.\n *\n * @type {boolean}\n * @private\n */\ngoog.ds.Expr.prototype.canBeEmpty_ = false;\n\n\n/**\n * The parsed paths in the expression\n *\n * @type {Array<string>}\n * @private\n */\ngoog.ds.Expr.prototype.parts_ = [];\n\n\n/**\n * Number of paths in the expression\n *\n * @type {?number}\n * @private\n */\ngoog.ds.Expr.prototype.size_ = null;\n\n\n/**\n * The root node path in the expression\n *\n * @type {string}\n * @private\n */\ngoog.ds.Expr.prototype.root_;\n\n\n/**\n * The last path in the expression\n *\n * @type {?string}\n * @private\n */\ngoog.ds.Expr.prototype.last_ = null;\n\n\n/**\n * Whether the expression evaluates to current node\n *\n * @type {boolean}\n * @private\n */\ngoog.ds.Expr.prototype.isCurrent_ = false;\n\n\n/**\n * Whether the expression is just an attribute\n *\n * @type {boolean}\n * @private\n */\ngoog.ds.Expr.prototype.isJustAttribute_ = false;\n\n\n/**\n * Does this expression select all DOM-style child nodes (element and text)\n *\n * @type {boolean}\n * @private\n */\ngoog.ds.Expr.prototype.isAllChildNodes_ = false;\n\n\n/**\n * Does this expression select all DOM-style attribute nodes (starts with '@')\n *\n * @type {boolean}\n * @private\n */\ngoog.ds.Expr.prototype.isAllAttributes_ = false;\n\n\n/**\n * Does this expression select all DOM-style element child nodes\n *\n * @type {boolean}\n * @private\n */\ngoog.ds.Expr.prototype.isAllElements_ = false;\n\n\n/**\n * The function used by this expression\n *\n * @type {?string}\n * @private\n */\ngoog.ds.Expr.prototype.exprFn_ = null;\n\n\n/**\n * Cached value for the parent expression.\n * @type {goog.ds.Expr?}\n * @private\n */\ngoog.ds.Expr.prototype.parentExpr_ = null;\n\n\n/**\n * Cached value for the next expression.\n * @type {goog.ds.Expr?}\n * @private\n */\ngoog.ds.Expr.prototype.nextExpr_ = null;\n\n\n/**\n * Create an expression from a string, can use cached values\n *\n * @param {string} expr The expression string.\n * @return {goog.ds.Expr} The expression object.\n */\ngoog.ds.Expr.create = function(expr) {\n  var result = goog.ds.Expr.cache_[expr];\n\n  if (result == null) {\n    result = new goog.ds.Expr(expr);\n    goog.ds.Expr.cache_[expr] = result;\n  }\n  return result;\n};\n\n\n/**\n * Create an expression from a string, can use cached values\n * Uses hints from related expressions to help in creation\n *\n * @param {?string=} opt_expr The string expression source.\n * @param {Array=} opt_parts Array of the parts of an expression.\n * @param {goog.ds.Expr=} opt_childExpr Optional child of this expression,\n *   passed in as a hint for processing.\n * @param {goog.ds.Expr=} opt_prevExpr Optional preceding expression\n *   (i.e. $A/B/C is previous expression to B/C) passed in as a hint for\n *   processing.\n * @return {goog.ds.Expr} The expression object.\n * @private\n */\ngoog.ds.Expr.createInternal_ = function(\n    opt_expr, opt_parts, opt_childExpr, opt_prevExpr) {\n  var expr = opt_expr || opt_parts.join('/');\n  var result = goog.ds.Expr.cache_[expr];\n\n  if (result == null) {\n    result = new goog.ds.Expr();\n    result.setSource_(expr, opt_parts, opt_childExpr, opt_prevExpr);\n    goog.ds.Expr.cache_[expr] = result;\n  }\n  return result;\n};\n\n\n/**\n * Cache of pre-parsed expressions\n * @private\n */\ngoog.ds.Expr.cache_ = {};\n\n\n/**\n * Commonly used strings in expressions.\n * @enum {string}\n * @private\n */\ngoog.ds.Expr.String_ = {\n  SEPARATOR: '/',\n  CURRENT_NODE_EXPR: '.',\n  EMPTY_EXPR: '',\n  ATTRIBUTE_START: '@',\n  ALL_CHILD_NODES_EXPR: '*|text()',\n  ALL_ATTRIBUTES_EXPR: '@*',\n  ALL_ELEMENTS_EXPR: '*',\n  NAME_EXPR: 'name()',\n  COUNT_EXPR: 'count()',\n  POSITION_EXPR: 'position()',\n  INDEX_START: '[',\n  INDEX_END: ']',\n  CAN_BE_EMPTY: '?'\n};\n\n\n/**\n * Standard expressions\n */\n\n\n/**\n * The current node\n */\ngoog.ds.Expr.CURRENT =\n    goog.ds.Expr.create(goog.ds.Expr.String_.CURRENT_NODE_EXPR);\n\n\n/**\n * For DOM interop - all DOM child nodes (text + element).\n * Text nodes have dataName #text\n */\ngoog.ds.Expr.ALL_CHILD_NODES =\n    goog.ds.Expr.create(goog.ds.Expr.String_.ALL_CHILD_NODES_EXPR);\n\n\n/**\n * For DOM interop - all DOM element child nodes\n */\ngoog.ds.Expr.ALL_ELEMENTS =\n    goog.ds.Expr.create(goog.ds.Expr.String_.ALL_ELEMENTS_EXPR);\n\n\n/**\n * For DOM interop - all DOM attribute nodes\n * Attribute nodes have dataName starting with \"@\"\n */\ngoog.ds.Expr.ALL_ATTRIBUTES =\n    goog.ds.Expr.create(goog.ds.Expr.String_.ALL_ATTRIBUTES_EXPR);\n\n\n/**\n * Get the dataName of a node\n */\ngoog.ds.Expr.NAME = goog.ds.Expr.create(goog.ds.Expr.String_.NAME_EXPR);\n\n\n/**\n * Get the count of nodes matching an expression\n */\ngoog.ds.Expr.COUNT = goog.ds.Expr.create(goog.ds.Expr.String_.COUNT_EXPR);\n\n\n/**\n * Get the position of the \"current\" node in the current node list\n * This will only apply for datasources that support the concept of a current\n * node (none exist yet). This is similar to XPath position() and concept of\n * current node\n */\ngoog.ds.Expr.POSITION = goog.ds.Expr.create(goog.ds.Expr.String_.POSITION_EXPR);\n","^17",1579837703000,"^18",["^19",["~$goog.ds.EmptyNodeList","^2D","~$goog.ds.BasicNodeList","^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/datasource/expr.js"],"^1J",["^19",["~$goog.ds.Expr"]],"^X",true,"^Y",["^Z","^40","^3[","^2D"]],["^ ","^[",[1579837703000],"^10","goog.datasource.jsdatasource.js","^11",["^12","goog/datasource/jsdatasource.js"],"^13","goog/datasource/jsdatasource.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An implementation of DataNode for wrapping JS data.\n *\n */\n\n\ngoog.provide('goog.ds.JsDataSource');\ngoog.provide('goog.ds.JsPropertyDataSource');\n\ngoog.require('goog.ds.BaseDataNode');\ngoog.require('goog.ds.BasicNodeList');\ngoog.require('goog.ds.DataManager');\ngoog.require('goog.ds.DataNode');\ngoog.require('goog.ds.EmptyNodeList');\ngoog.require('goog.ds.LoadState');\n\n\n/**\n * Data source whose backing is JavaScript data\n *\n * Names that are reserved for system use and shouldn't be used for data node\n * names: eval, toSource, toString, unwatch, valueOf, watch. Behavior is\n * undefined if these names are used.\n *\n * @param {Object} root The root JS node.\n * @param {string} dataName The name of this node relative to the parent node.\n * @param {Object=} opt_parent Optional parent of this JsDataSource.\n *\n * implements goog.ds.DataNode.\n * @constructor\n * @extends {goog.ds.DataNode}\n */\n// TODO(arv): Use interfaces when available.\ngoog.ds.JsDataSource = function(root, dataName, opt_parent) {\n  this.parent_ = opt_parent;\n  this.dataName_ = dataName;\n  this.setRoot(root);\n};\n\n\n/**\n * The root JS object. Can be null.\n * @type {*}\n * @protected\n * @suppress {underscore|visibility}\n */\ngoog.ds.JsDataSource.prototype.root_;\n\n\n/**\n * Sets the root JS object\n * @param {Object} root The root JS object. Can be null.\n *\n * @protected\n */\ngoog.ds.JsDataSource.prototype.setRoot = function(root) {\n  this.root_ = root;\n  this.childNodeList_ = null;\n};\n\n\n/**\n * Set this data source to use list semantics. List data sources:\n * - Are assumed to have child nodes of all of the same type of data\n * - Fire data changes on the root node of the list whenever children\n *     are added or removed\n * @param {?boolean} isList True to use list semantics.\n * @private\n */\ngoog.ds.JsDataSource.prototype.setIsList_ = function(isList) {\n  this.isList_ = isList;\n};\n\n\n/** @override */\ngoog.ds.JsDataSource.prototype.get = function() {\n  return !goog.isObject(this.root_) ? this.root_ : this.getChildNodes();\n};\n\n\n/**\n * Set the value of the node\n * @param {*} value The new value of the node.\n * @override\n */\ngoog.ds.JsDataSource.prototype.set = function(value) {\n  if (value && goog.isObject(this.root_)) {\n    throw new Error('Can\\'t set group nodes to new values yet');\n  }\n\n  if (this.parent_) {\n    this.parent_.root_[this.dataName_] = value;\n  }\n  this.root_ = value;\n  this.childNodeList_ = null;\n\n  goog.ds.DataManager.getInstance().fireDataChange(this.getDataPath());\n};\n\n\n/**\n * TODO(user) revisit lazy creation.\n * @override\n */\ngoog.ds.JsDataSource.prototype.getChildNodes = function(opt_selector) {\n  if (!this.root_) {\n    return new goog.ds.EmptyNodeList();\n  }\n\n  if (!opt_selector || opt_selector == goog.ds.STR_ALL_CHILDREN_SELECTOR) {\n    this.createChildNodes_(false);\n    return this.childNodeList_;\n  } else if (opt_selector.indexOf(goog.ds.STR_WILDCARD) == -1) {\n    if (this.root_[opt_selector] != null) {\n      return new goog.ds.BasicNodeList([this.getChildNode(opt_selector)]);\n    } else {\n      return new goog.ds.EmptyNodeList();\n    }\n  } else {\n    throw new Error('Selector not supported yet (' + opt_selector + ')');\n  }\n\n};\n\n\n/**\n * Creates the DataNodeList with the child nodes for this element.\n * Allows for only building list as needed.\n *\n * @param {boolean=} opt_force Whether to force recreating child nodes,\n *     defaults to false.\n * @private\n */\ngoog.ds.JsDataSource.prototype.createChildNodes_ = function(opt_force) {\n  if (this.childNodeList_ && !opt_force) {\n    return;\n  }\n\n  if (!goog.isObject(this.root_)) {\n    this.childNodeList_ = new goog.ds.EmptyNodeList();\n    return;\n  }\n\n  var childNodeList = new goog.ds.BasicNodeList();\n  var newNode;\n  if (goog.isArray(this.root_)) {\n    var len = this.root_.length;\n    for (var i = 0; i < len; i++) {\n      // \"id\" is reserved node name that will map to a named child node\n      // TODO(user) Configurable logic for choosing id node\n      var node = this.root_[i];\n      var id = node.id;\n      var name = id != null ? String(id) : '[' + i + ']';\n      newNode = new goog.ds.JsDataSource(node, name, this);\n      childNodeList.add(newNode);\n    }\n  } else {\n    for (var name in this.root_) {\n      var obj = this.root_[name];\n      // If the node is already a datasource, then add it.\n      if (obj.getDataName) {\n        childNodeList.add(obj);\n      } else if (!goog.isFunction(obj)) {\n        newNode = new goog.ds.JsDataSource(obj, name, this);\n        childNodeList.add(newNode);\n      }\n    }\n  }\n  this.childNodeList_ = childNodeList;\n};\n\n\n/**\n * Gets a named child node of the current node\n * @param {string} name The node name.\n * @param {boolean=} opt_canCreate If true, can create child node.\n * @return {goog.ds.DataNode} The child node, or null if no node of\n *     this name exists.\n * @override\n */\ngoog.ds.JsDataSource.prototype.getChildNode = function(name, opt_canCreate) {\n  if (!this.root_) {\n    return null;\n  }\n  var node = /** @type {goog.ds.DataNode} */ (this.getChildNodes().get(name));\n  if (!node && opt_canCreate) {\n    var newObj = {};\n    if (goog.isArray(this.root_)) {\n      newObj['id'] = name;\n      this.root_.push(newObj);\n    } else {\n      this.root_[name] = newObj;\n    }\n    node = new goog.ds.JsDataSource(newObj, name, this);\n    if (this.childNodeList_) {\n      this.childNodeList_.add(node);\n    }\n  }\n  return node;\n};\n\n\n/**\n * Gets the value of a child node\n * @param {string} name The node name.\n * @return {Object} The value of the node, or null if no value or the child\n *    node doesn't exist.\n * @override\n */\ngoog.ds.JsDataSource.prototype.getChildNodeValue = function(name) {\n  if (this.childNodeList_) {\n    var node = this.getChildNodes().get(name);\n    return node ? node.get() : null;\n  } else if (this.root_) {\n    return this.root_[name];\n  } else {\n    return null;\n  }\n};\n\n\n/**\n * Sets a named child node of the current node.\n * If value is null, removes the child node.\n * @param {string} name The node name.\n * @param {Object} value The value to set, can be DataNode, object,\n *     property, or null.\n * @return {Object} The child node, if set.\n * @override\n */\ngoog.ds.JsDataSource.prototype.setChildNode = function(name, value) {\n  var removedPath = null;\n  var node = null;\n  var addedNode = false;\n\n  // Set node to the DataNode to add - if the value isn't already a DataNode,\n  // creates a JsDataSource or JsPropertyDataSource wrapper\n  if (value != null) {\n    if (value.getDataName) {\n      // The value is a DataNode. We must update its parent.\n      node = value;\n      node.parent_ = this;\n    } else {\n      if (goog.isArray(value) || goog.isObject(value)) {\n        node = new goog.ds.JsDataSource(value, name, this);\n      } else {\n        node = new goog.ds.JsPropertyDataSource(\n            /** @type {goog.ds.DataNode} */ (this.root_), name, this);\n      }\n    }\n  }\n\n  // This logic will get cleaner once we can remove the backing array / object\n  // and just rely on the childNodeList_. This is needed until dependent code\n  // is cleaned up.\n  // TODO(user) Remove backing array / object and just use childNodeList_\n\n  if (goog.isArray(this.root_)) {\n    // To remove by name, need to create a map of the child nodes by ID\n    this.createChildNodes_();\n    var index = this.childNodeList_.indexOf(name);\n    if (value == null) {\n      // Remove the node\n      var nodeToRemove = this.childNodeList_.get(name);\n      if (nodeToRemove) {\n        removedPath = nodeToRemove.getDataPath();\n      }\n      this.root_.splice(index, 1);\n    } else {\n      // Add the node\n      if (index) {\n        this.root_[index] = value;\n      } else {\n        this.root_.push(value);\n      }\n    }\n    if (index == null) {\n      addedNode = true;\n    }\n    this.childNodeList_.setNode(name, /** @type {goog.ds.DataNode} */ (node));\n  } else if (goog.isObject(this.root_)) {\n    if (value == null) {\n      // Remove the node\n      this.createChildNodes_();\n      var nodeToRemove = this.childNodeList_.get(name);\n      if (nodeToRemove) {\n        removedPath = nodeToRemove.getDataPath();\n      }\n      delete this.root_[name];\n    } else {\n      // Add the node\n      if (!this.root_[name]) {\n        addedNode = true;\n      }\n      this.root_[name] = value;\n    }\n    // Only need to update childNodeList_ if has been created already\n    if (this.childNodeList_) {\n      this.childNodeList_.setNode(name, /** @type {goog.ds.DataNode} */ (node));\n    }\n  }\n\n  // Fire the event that the node changed\n  var dm = goog.ds.DataManager.getInstance();\n  if (node) {\n    dm.fireDataChange(node.getDataPath());\n    if (addedNode && this.isList()) {\n      dm.fireDataChange(this.getDataPath());\n      dm.fireDataChange(this.getDataPath() + '/count()');\n    }\n  } else if (removedPath) {\n    dm.fireDataChange(removedPath);\n    if (this.isList()) {\n      dm.fireDataChange(this.getDataPath());\n      dm.fireDataChange(this.getDataPath() + '/count()');\n    }\n  }\n  return node;\n};\n\n\n/**\n * Get the name of the node relative to the parent node\n * @return {string} The name of the node.\n * @override\n */\ngoog.ds.JsDataSource.prototype.getDataName = function() {\n  return this.dataName_;\n};\n\n\n/**\n * Setthe name of the node relative to the parent node\n * @param {string} dataName The name of the node.\n * @override\n */\ngoog.ds.JsDataSource.prototype.setDataName = function(dataName) {\n  this.dataName_ = dataName;\n};\n\n\n/**\n * Gets the a qualified data path to this node\n * @return {string} The data path.\n * @override\n */\ngoog.ds.JsDataSource.prototype.getDataPath = function() {\n  var parentPath = '';\n  if (this.parent_) {\n    parentPath = this.parent_.getDataPath() + goog.ds.STR_PATH_SEPARATOR;\n  }\n\n  return parentPath + this.dataName_;\n};\n\n\n/**\n * Load or reload the backing data for this node\n * @override\n */\ngoog.ds.JsDataSource.prototype.load = function() {\n  // Nothing to do\n};\n\n\n/**\n * Gets the state of the backing data for this node\n * TODO(user) Discuss null value handling\n * @return {goog.ds.LoadState} The state.\n * @override\n */\ngoog.ds.JsDataSource.prototype.getLoadState = function() {\n  return (this.root_ == null) ? goog.ds.LoadState.NOT_LOADED :\n                                goog.ds.LoadState.LOADED;\n};\n\n\n/**\n * Whether the value of this node is a homogeneous list of data\n * @return {boolean} True if a list.\n * @override\n */\ngoog.ds.JsDataSource.prototype.isList = function() {\n  return this.isList_ != null ? this.isList_ : goog.isArray(this.root_);\n};\n\n\n\n/**\n * Data source for JavaScript properties that arent objects. Contains reference\n * to parent object so that you can set the vaule\n *\n * @param {goog.ds.DataNode} parent Parent object.\n * @param {string} dataName Name of this property.\n * @param {goog.ds.DataNode=} opt_parentDataNode The parent data node. If\n *     omitted, assumes that the parent object is the parent data node.\n *\n * @constructor\n * @extends {goog.ds.BaseDataNode}\n * @final\n */\ngoog.ds.JsPropertyDataSource = function(parent, dataName, opt_parentDataNode) {\n  goog.ds.BaseDataNode.call(this);\n  this.dataName_ = dataName;\n  this.parent_ = parent;\n  this.parentDataNode_ = opt_parentDataNode || this.parent_;\n};\ngoog.inherits(goog.ds.JsPropertyDataSource, goog.ds.BaseDataNode);\n\n\n/**\n * Get the value of the node\n * @return {Object} The value of the node, or null if no value.\n */\ngoog.ds.JsPropertyDataSource.prototype.get = function() {\n  return this.parent_[this.dataName_];\n};\n\n\n/**\n * Set the value of the node\n * @param {Object} value The new value of the node.\n * @override\n */\ngoog.ds.JsPropertyDataSource.prototype.set = function(value) {\n  var oldValue = this.parent_[this.dataName_];\n  this.parent_[this.dataName_] = value;\n\n  if (oldValue != value) {\n    goog.ds.DataManager.getInstance().fireDataChange(this.getDataPath());\n  }\n};\n\n\n/**\n * Get the name of the node relative to the parent node\n * @return {string} The name of the node.\n * @override\n */\ngoog.ds.JsPropertyDataSource.prototype.getDataName = function() {\n  return this.dataName_;\n};\n\n\n/** @override */\ngoog.ds.JsPropertyDataSource.prototype.getParent = function() {\n  return this.parentDataNode_;\n};\n","^17",1579837703000,"^18",["^19",["^3[","^40","^Z","~$goog.ds.BaseDataNode","~$goog.ds.DataManager","~$goog.ds.LoadState","~$goog.ds.DataNode"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/datasource/jsdatasource.js"],"^1J",["^19",["~$goog.ds.JsPropertyDataSource","~$goog.ds.JsDataSource"]],"^X",true,"^Y",["^Z","^42","^40","^43","^45","^3[","^44"]],["^ ","^[",[1579837703000],"^10","goog.style.bidi.js","^11",["^12","goog/style/bidi.js"],"^13","goog/style/bidi.js","^14","^15","^16","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Bidi utility functions.\n *\n */\n\ngoog.provide('goog.style.bidi');\n\ngoog.require('goog.dom');\ngoog.require('goog.style');\ngoog.require('goog.userAgent');\ngoog.require('goog.userAgent.platform');\ngoog.require('goog.userAgent.product');\ngoog.require('goog.userAgent.product.isVersion');\n\n\n/**\n * Returns the normalized scrollLeft position for a scrolled element.\n * @param {Element} element The scrolled element.\n * @return {number} The number of pixels the element is scrolled. 0 indicates\n *     that the element is not scrolled at all (which, in general, is the\n *     left-most position in ltr and the right-most position in rtl).\n */\ngoog.style.bidi.getScrollLeft = function(element) {\n  var isRtl = goog.style.isRightToLeft(element);\n  if (isRtl && goog.style.bidi.usesNegativeScrollLeftInRtl_()) {\n    return -element.scrollLeft;\n  } else if (\n      isRtl &&\n      !(goog.userAgent.EDGE_OR_IE && goog.userAgent.isVersionOrHigher('8'))) {\n    // ScrollLeft starts at the maximum positive value and decreases towards\n    // 0 as the element is scrolled towards the left. However, for overflow\n    // visible, there is no scrollLeft and the value always stays correctly at 0\n    var overflowX = goog.style.getComputedOverflowX(element);\n    if (overflowX == 'visible') {\n      return element.scrollLeft;\n    } else {\n      return element.scrollWidth - element.clientWidth - element.scrollLeft;\n    }\n  }\n  // ScrollLeft behavior is identical in rtl and ltr, it starts at 0 and\n  // increases as the element is scrolled away from the start.\n  return element.scrollLeft;\n};\n\n\n/**\n * Returns the \"offsetStart\" of an element, analogous to offsetLeft but\n * normalized for right-to-left environments and various browser\n * inconsistencies. This value returned can always be passed to setScrollOffset\n * to scroll to an element's left edge in a left-to-right offsetParent or\n * right edge in a right-to-left offsetParent.\n *\n * For example, here offsetStart is 10px in an LTR environment and 5px in RTL:\n *\n * <pre>\n * |          xxxxxxxxxx     |\n *  ^^^^^^^^^^   ^^^^   ^^^^^\n *     10px      elem    5px\n * </pre>\n *\n * If an element is positioned before the start of its offsetParent, the\n * startOffset may be negative.  This can be used with setScrollOffset to\n * reliably scroll to an element:\n *\n * <pre>\n * var scrollOffset = goog.style.bidi.getOffsetStart(element);\n * goog.style.bidi.setScrollOffset(element.offsetParent, scrollOffset);\n * </pre>\n *\n * @see setScrollOffset\n *\n * @param {Element} element The element for which we need to determine the\n *     offsetStart position.\n * @return {number} The offsetStart for that element.\n */\ngoog.style.bidi.getOffsetStart = function(element) {\n  element = /** @type {!HTMLElement} */ (element);\n  var offsetLeftForReal = element.offsetLeft;\n\n  // The element might not have an offsetParent.\n  // For example, the node might not be attached to the DOM tree,\n  // and position:fixed children do not have an offset parent.\n  // Just try to do the best we can with what we have.\n  var bestParent = element.offsetParent;\n\n  if (!bestParent && goog.style.getComputedPosition(element) == 'fixed') {\n    bestParent = goog.dom.getOwnerDocument(element).documentElement;\n  }\n\n  // Just give up in this case.\n  if (!bestParent) {\n    return offsetLeftForReal;\n  }\n\n  if (goog.userAgent.GECKO && !goog.userAgent.isVersionOrHigher(58)) {\n    // When calculating an element's offsetLeft, Firefox 57 and below\n    // erroneously subtracts the border width from the actual distance.\n    // So we need to add it back. (Fixed in FireFox 58+)\n    var borderWidths = goog.style.getBorderBox(bestParent);\n    offsetLeftForReal += borderWidths.left;\n  } else if (\n      goog.userAgent.isDocumentModeOrHigher(8) &&\n      !goog.userAgent.isDocumentModeOrHigher(9)) {\n    // When calculating an element's offsetLeft, IE8/9-Standards Mode\n    // erroneously adds the border width to the actual distance.  So we need to\n    // subtract it.\n    var borderWidths = goog.style.getBorderBox(bestParent);\n    offsetLeftForReal -= borderWidths.left;\n  }\n\n  if (goog.style.isRightToLeft(bestParent)) {\n    // Right edge of the element relative to the left edge of its parent.\n    var elementRightOffset = offsetLeftForReal + element.offsetWidth;\n\n    // Distance from the parent's right edge to the element's right edge.\n    return bestParent.clientWidth - elementRightOffset;\n  }\n\n  return offsetLeftForReal;\n};\n\n\n/**\n * Sets the element's scrollLeft attribute so it is correctly scrolled by\n * offsetStart pixels.  This takes into account whether the element is RTL and\n * the nuances of different browsers.  To scroll to the \"beginning\" of an\n * element use getOffsetStart to obtain the element's offsetStart value and then\n * pass the value to setScrollOffset.\n * @see getOffsetStart\n * @param {Element} element The element to set scrollLeft on.\n * @param {number} offsetStart The number of pixels to scroll the element.\n *     If this value is < 0, 0 is used.\n */\ngoog.style.bidi.setScrollOffset = function(element, offsetStart) {\n  offsetStart = Math.max(offsetStart, 0);\n  // In LTR and in \"mirrored\" browser RTL (such as IE), we set scrollLeft to\n  // the number of pixels to scroll.\n  // Otherwise, in RTL, we need to account for different browser behavior.\n  if (!goog.style.isRightToLeft(element)) {\n    element.scrollLeft = offsetStart;\n  } else if (goog.style.bidi.usesNegativeScrollLeftInRtl_()) {\n    element.scrollLeft = -offsetStart;\n  } else if (\n      !(goog.userAgent.EDGE_OR_IE && goog.userAgent.isVersionOrHigher('8'))) {\n    // Take the current scrollLeft value and move to the right by the\n    // offsetStart to get to the left edge of the element, and then by\n    // the clientWidth of the element to get to the right edge.\n    element.scrollLeft =\n        element.scrollWidth - offsetStart - element.clientWidth;\n  } else {\n    element.scrollLeft = offsetStart;\n  }\n};\n\n\n/**\n * @return {boolean} Whether the current browser returns negative scrollLeft\n *     values for RTL elements. If true, then scrollLeft starts at 0 and then\n *     becomes more negative as the element is scrolled towards the left.\n * @private\n */\ngoog.style.bidi.usesNegativeScrollLeftInRtl_ = function() {\n  var isSafari10Plus =\n      goog.userAgent.product.SAFARI && goog.userAgent.product.isVersion(10);\n  var isIOS10Plus = goog.userAgent.IOS && goog.userAgent.platform.isVersion(10);\n  return goog.userAgent.GECKO || isSafari10Plus || isIOS10Plus;\n};\n\n\n/**\n * Sets the element's left style attribute in LTR or right style attribute in\n * RTL.  Also clears the left attribute in RTL and the right attribute in LTR.\n * @param {Element} elem The element to position.\n * @param {number} left The left position in LTR; will be set as right in RTL.\n * @param {?number} top The top position.  If null only the left/right is set.\n * @param {boolean} isRtl Whether we are in RTL mode.\n */\ngoog.style.bidi.setPosition = function(elem, left, top, isRtl) {\n  if (top !== null) {\n    elem.style.top = top + 'px';\n  }\n  if (isRtl) {\n    elem.style.right = left + 'px';\n    elem.style.left = '';\n  } else {\n    elem.style.left = left + 'px';\n    elem.style.right = '';\n  }\n};\n","^17",1579837703000,"^18",["^19",["^1T","^2N","~$goog.userAgent.platform","^Z","^2X","^29","^3M"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/style/bidi.js"],"^1J",["^19",["~$goog.style.bidi"]],"^X",true,"^Y",["^Z","^1T","^29","^2X","^48","^2N","^3M"]],["^ ","^[",[1579837703000],"^10","goog.testing.net.mockiframeio.js","^11",["^12","goog/testing/net/mockiframeio.js"],"^13","goog/testing/net/mockiframeio.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Mock of IframeIo for unit testing.\n */\n\ngoog.provide('goog.testing.net.MockIFrameIo');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.net.ErrorCode');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.IframeIo');\ngoog.require('goog.testing.TestQueue');\n\n\n\n/**\n * Mock implementation of goog.net.IframeIo. This doesn't provide a mock\n * implementation for all cases, but it's not too hard to add them as needed.\n * @param {goog.testing.TestQueue} testQueue Test queue for inserting test\n *     events.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.testing.net.MockIFrameIo = function(testQueue) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * Queue of events write to\n   * @type {goog.testing.TestQueue}\n   * @private\n   */\n  this.testQueue_ = testQueue;\n\n};\ngoog.inherits(goog.testing.net.MockIFrameIo, goog.events.EventTarget);\n\n\n/**\n * Whether MockIFrameIo is active.\n * @type {boolean}\n * @private\n */\ngoog.testing.net.MockIFrameIo.prototype.active_ = false;\n\n\n/**\n * Last content.\n * @type {string}\n * @private\n */\ngoog.testing.net.MockIFrameIo.prototype.lastContent_ = '';\n\n\n/**\n * Last error code.\n * @type {goog.net.ErrorCode}\n * @private\n */\ngoog.testing.net.MockIFrameIo.prototype.lastErrorCode_ =\n    goog.net.ErrorCode.NO_ERROR;\n\n\n/**\n * Last error message.\n * @type {string}\n * @private\n */\ngoog.testing.net.MockIFrameIo.prototype.lastError_ = '';\n\n\n/**\n * Last custom error.\n * @type {?Object}\n * @private\n */\ngoog.testing.net.MockIFrameIo.prototype.lastCustomError_ = null;\n\n\n/**\n * Last URI.\n * @type {?goog.Uri}\n * @private\n */\ngoog.testing.net.MockIFrameIo.prototype.lastUri_ = null;\n\n\n/** @private {Function} */\ngoog.testing.net.MockIFrameIo.prototype.errorChecker_;\n\n\n/** @private {boolean} */\ngoog.testing.net.MockIFrameIo.prototype.success_;\n\n\n/** @private {boolean} */\ngoog.testing.net.MockIFrameIo.prototype.complete_;\n\n\n/**\n * Simulates the iframe send.\n *\n * @param {goog.Uri|string} uri Uri of the request.\n * @param {string=} opt_method Default is GET, POST uses a form to submit the\n *     request.\n * @param {boolean=} opt_noCache Append a timestamp to the request to avoid\n *     caching.\n * @param {Object|goog.structs.Map=} opt_data Map of key-value pairs.\n */\ngoog.testing.net.MockIFrameIo.prototype.send = function(\n    uri, opt_method, opt_noCache, opt_data) {\n  if (this.active_) {\n    throw new Error('[goog.net.IframeIo] Unable to send, already active.');\n  }\n\n  this.testQueue_.enqueue(['s', uri, opt_method, opt_noCache, opt_data]);\n  this.complete_ = false;\n  this.active_ = true;\n};\n\n\n/**\n * Simulates the iframe send from a form.\n * @param {Element} form Form element used to send the request to the server.\n * @param {string=} opt_uri Uri to set for the destination of the request, by\n *     default the uri will come from the form.\n * @param {boolean=} opt_noCache Append a timestamp to the request to avoid\n *     caching.\n */\ngoog.testing.net.MockIFrameIo.prototype.sendFromForm = function(\n    form, opt_uri, opt_noCache) {\n  if (this.active_) {\n    throw new Error('[goog.net.IframeIo] Unable to send, already active.');\n  }\n\n  this.testQueue_.enqueue(['s', form, opt_uri, opt_noCache]);\n  this.complete_ = false;\n  this.active_ = true;\n};\n\n\n/**\n * Simulates aborting the current Iframe request.\n * @param {goog.net.ErrorCode=} opt_failureCode Optional error code to use -\n *     defaults to ABORT.\n */\ngoog.testing.net.MockIFrameIo.prototype.abort = function(opt_failureCode) {\n  if (this.active_) {\n    this.testQueue_.enqueue(['a', opt_failureCode]);\n    this.complete_ = false;\n    this.active_ = false;\n    this.success_ = false;\n    this.lastErrorCode_ = opt_failureCode || goog.net.ErrorCode.ABORT;\n    this.dispatchEvent(goog.net.EventType.ABORT);\n    this.simulateReady();\n  }\n};\n\n\n/**\n * Simulates receive of incremental data.\n * @param {Object} data Data.\n */\ngoog.testing.net.MockIFrameIo.prototype.simulateIncrementalData =\n    function(data) {\n  this.dispatchEvent(new goog.net.IframeIo.IncrementalDataEvent(data));\n};\n\n\n/**\n * Simulates the iframe is done.\n * @param {goog.net.ErrorCode} errorCode The error code for any error that\n *     should be simulated.\n */\ngoog.testing.net.MockIFrameIo.prototype.simulateDone = function(errorCode) {\n  if (errorCode) {\n    this.success_ = false;\n    this.lastErrorCode_ = goog.net.ErrorCode.HTTP_ERROR;\n    this.lastError_ = this.getLastError();\n    this.dispatchEvent(goog.net.EventType.ERROR);\n  } else {\n    this.success_ = true;\n    this.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR;\n    this.dispatchEvent(goog.net.EventType.SUCCESS);\n  }\n  this.complete_ = true;\n  this.dispatchEvent(goog.net.EventType.COMPLETE);\n};\n\n\n/**\n * Simulates the IFrame is ready for the next request.\n */\ngoog.testing.net.MockIFrameIo.prototype.simulateReady = function() {\n  this.dispatchEvent(goog.net.EventType.READY);\n};\n\n\n/**\n * @return {boolean} True if transfer is complete.\n */\ngoog.testing.net.MockIFrameIo.prototype.isComplete = function() {\n  return this.complete_;\n};\n\n\n/**\n * @return {boolean} True if transfer was successful.\n */\ngoog.testing.net.MockIFrameIo.prototype.isSuccess = function() {\n  return this.success_;\n};\n\n\n/**\n * @return {boolean} True if a transfer is in progress.\n */\ngoog.testing.net.MockIFrameIo.prototype.isActive = function() {\n  return this.active_;\n};\n\n\n/**\n * Returns the last response text (i.e. the text content of the iframe).\n * Assumes plain text!\n * @return {string} Result from the server.\n */\ngoog.testing.net.MockIFrameIo.prototype.getResponseText = function() {\n  return this.lastContent_;\n};\n\n\n/**\n * Parses the content as JSON. This is a safe parse and may throw an error\n * if the response is malformed.\n * @return {Object} The parsed content.\n */\ngoog.testing.net.MockIFrameIo.prototype.getResponseJson = function() {\n  return /** @type {!Object} */ (JSON.parse(this.lastContent_));\n};\n\n\n/**\n * Get the uri of the last request.\n * @return {goog.Uri} Uri of last request.\n */\ngoog.testing.net.MockIFrameIo.prototype.getLastUri = function() {\n  return this.lastUri_;\n};\n\n\n/**\n * Gets the last error code.\n * @return {goog.net.ErrorCode} Last error code.\n */\ngoog.testing.net.MockIFrameIo.prototype.getLastErrorCode = function() {\n  return this.lastErrorCode_;\n};\n\n\n/**\n * Gets the last error message.\n * @return {string} Last error message.\n */\ngoog.testing.net.MockIFrameIo.prototype.getLastError = function() {\n  return goog.net.ErrorCode.getDebugMessage(this.lastErrorCode_);\n};\n\n\n/**\n * Gets the last custom error.\n * @return {Object} Last custom error.\n */\ngoog.testing.net.MockIFrameIo.prototype.getLastCustomError = function() {\n  return this.lastCustomError_;\n};\n\n\n/**\n * Sets the callback function used to check if a loaded IFrame is in an error\n * state.\n * @param {Function} fn Callback that expects a document object as it's single\n *     argument.\n */\ngoog.testing.net.MockIFrameIo.prototype.setErrorChecker = function(fn) {\n  this.errorChecker_ = fn;\n};\n\n\n/**\n * Gets the callback function used to check if a loaded IFrame is in an error\n * state.\n * @return {Function} A callback that expects a document object as it's single\n *     argument.\n */\ngoog.testing.net.MockIFrameIo.prototype.getErrorChecker = function() {\n  return this.errorChecker_;\n};\n","^17",1579837703000,"^18",["^19",["~$goog.testing.TestQueue","~$goog.net.IframeIo","^Z","^2W","~$goog.net.EventType","~$goog.net.ErrorCode"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/net/mockiframeio.js"],"^1J",["^19",["~$goog.testing.net.MockIFrameIo"]],"^X",true,"^Y",["^Z","^2W","^4=","^4<","^4;","^4:"]],["^ ","^[",[1579837703000],"^10","goog.labs.net.xhr.js","^11",["^12","goog/labs/net/xhr.js"],"^13","goog/labs/net/xhr.js","^14","^15","^16","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Offered as an alternative to XhrIo as a way for making requests\n * via XMLHttpRequest.  Instead of mirroring the XHR interface and exposing\n * events, results are used as a way to pass a \"promise\" of the response to\n * interested parties.\n *\n */\n\ngoog.provide('goog.labs.net.xhr');\ngoog.provide('goog.labs.net.xhr.Error');\ngoog.provide('goog.labs.net.xhr.HttpError');\ngoog.provide('goog.labs.net.xhr.Options');\ngoog.provide('goog.labs.net.xhr.PostData');\ngoog.provide('goog.labs.net.xhr.ResponseType');\ngoog.provide('goog.labs.net.xhr.TimeoutError');\n\ngoog.require('goog.Promise');\ngoog.require('goog.asserts');\ngoog.require('goog.debug.Error');\ngoog.require('goog.net.HttpStatus');\ngoog.require('goog.net.XmlHttp');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.uri.utils');\ngoog.require('goog.userAgent');\n\n\n\ngoog.scope(function() {\nvar userAgent = goog.userAgent;\nvar xhr = goog.labs.net.xhr;\nvar HttpStatus = goog.net.HttpStatus;\n\n\n/**\n * Configuration options for an XMLHttpRequest.\n * - headers: map of header key/value pairs.\n * - timeoutMs: number of milliseconds after which the request will be timed\n *      out by the client. Default is to allow the browser to handle timeouts.\n * - withCredentials: whether user credentials are to be included in a\n *      cross-origin request. See:\n *      http://www.w3.org/TR/XMLHttpRequest/#the-withcredentials-attribute\n * - mimeType: allows the caller to override the content-type and charset for\n *      the request. See:\n *      http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-overridemimetype\n * - responseType: may be set to change the response type to an arraybuffer or\n *      blob for downloading binary data. See:\n *      http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-responsetype]\n * - xmlHttpFactory: allows the caller to override the factory used to create\n *      XMLHttpRequest objects.\n * - xssiPrefix: Prefix used for protecting against XSSI attacks, which should\n *      be removed before parsing the response as JSON.\n *\n * @typedef {{\n *   headers: (Object<string>|undefined),\n *   mimeType: (string|undefined),\n *   responseType: (xhr.ResponseType|undefined),\n *   timeoutMs: (number|undefined),\n *   withCredentials: (boolean|undefined),\n *   xmlHttpFactory: (goog.net.XmlHttpFactory|undefined),\n *   xssiPrefix: (string|undefined)\n * }}\n */\nxhr.Options;\n\n\n/**\n * Defines the types that are allowed as post data.\n * @typedef {(ArrayBuffer|ArrayBufferView|Blob|Document|FormData|null|string|undefined)}\n */\nxhr.PostData;\n\n\n/**\n * The Content-Type HTTP header name.\n * @type {string}\n */\nxhr.CONTENT_TYPE_HEADER = 'Content-Type';\n\n\n/**\n * The Content-Type HTTP header value for a url-encoded form.\n * @type {string}\n */\nxhr.FORM_CONTENT_TYPE = 'application/x-www-form-urlencoded;charset=utf-8';\n\n\n/**\n * Supported data types for the responseType field.\n * See: http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-response\n * @enum {string}\n */\nxhr.ResponseType = {\n  ARRAYBUFFER: 'arraybuffer',\n  BLOB: 'blob',\n  DOCUMENT: 'document',\n  JSON: 'json',\n  TEXT: 'text'\n};\n\n\n/**\n * Sends a get request, returning a promise that will be resolved\n * with the response text once the request completes.\n *\n * @param {string} url The URL to request.\n * @param {xhr.Options=} opt_options Configuration options for the request.\n * @return {!goog.Promise<string>} A promise that will be resolved with the\n *     response text once the request completes.\n */\nxhr.get = function(url, opt_options) {\n  return xhr.send('GET', url, null, opt_options).then(function(request) {\n    return request.responseText;\n  });\n};\n\n\n/**\n * Sends a post request, returning a promise that will be resolved\n * with the response text once the request completes.\n *\n * @param {string} url The URL to request.\n * @param {xhr.PostData} data The body of the post request.\n * @param {xhr.Options=} opt_options Configuration options for the request.\n * @return {!goog.Promise<string>} A promise that will be resolved with the\n *     response text once the request completes.\n */\nxhr.post = function(url, data, opt_options) {\n  return xhr.send('POST', url, data, opt_options).then(function(request) {\n    return request.responseText;\n  });\n};\n\n\n/**\n * Sends a get request, returning a promise that will be resolved with\n * the parsed response text once the request completes.\n *\n * @param {string} url The URL to request.\n * @param {xhr.Options=} opt_options Configuration options for the request.\n * @return {!goog.Promise<Object>} A promise that will be resolved with the\n *     response JSON once the request completes.\n */\nxhr.getJson = function(url, opt_options) {\n  return xhr.send('GET', url, null, opt_options).then(function(request) {\n    return xhr.parseJson_(request.responseText, opt_options);\n  });\n};\n\n\n/**\n * Sends a get request, returning a promise that will be resolved with the\n * response as a Blob.\n *\n * @param {string} url The URL to request.\n * @param {xhr.Options=} opt_options Configuration options for the request. If\n *     responseType is set, it will be ignored for this request.\n * @return {!goog.Promise<!Blob>} A promise that will be resolved with an\n *     immutable Blob representing the file once the request completes.\n */\nxhr.getBlob = function(url, opt_options) {\n  goog.asserts.assert(\n      'Blob' in goog.global, 'getBlob is not supported in this browser.');\n\n  var options = opt_options ? goog.object.clone(opt_options) : {};\n  options.responseType = xhr.ResponseType.BLOB;\n\n  return xhr.send('GET', url, null, options).then(function(request) {\n    return /** @type {!Blob} */ (request.response);\n  });\n};\n\n\n/**\n * Sends a get request, returning a promise that will be resolved with the\n * response as an array of bytes.\n *\n * Supported in all XMLHttpRequest level 2 browsers, as well as IE9. IE8 and\n * earlier are not supported.\n *\n * @param {string} url The URL to request.\n * @param {xhr.Options=} opt_options Configuration options for the request. If\n *     responseType is set, it will be ignored for this request.\n * @return {!goog.Promise<!Uint8Array|!Array<number>>} A promise that will be\n *     resolved with an array of bytes once the request completes.\n */\nxhr.getBytes = function(url, opt_options) {\n  goog.asserts.assert(\n      !userAgent.IE || userAgent.isDocumentModeOrHigher(9),\n      'getBytes is not supported in this browser.');\n\n  var options = opt_options ? goog.object.clone(opt_options) : {};\n  options.responseType = xhr.ResponseType.ARRAYBUFFER;\n\n  return xhr.send('GET', url, null, options).then(function(request) {\n    // Use the ArrayBuffer response in browsers that support XMLHttpRequest2.\n    // This covers nearly all modern browsers: http://caniuse.com/xhr2\n    if (request.response) {\n      return new Uint8Array(/** @type {!ArrayBuffer} */ (request.response));\n    }\n\n    // Fallback for IE9: the response may be accessed as an array of bytes with\n    // the non-standard responseBody property, which can only be accessed as a\n    // VBArray. IE7 and IE8 require significant amounts of VBScript to extract\n    // the bytes.\n    // See: http://stackoverflow.com/questions/1919972/\n    if (goog.global['VBArray']) {\n      return new goog.global['VBArray'](request['responseBody']).toArray();\n    }\n\n    // Nearly all common browsers are covered by the cases above. If downloading\n    // binary files in older browsers is necessary, the MDN article \"Sending and\n    // Receiving Binary Data\" provides techniques that may work with\n    // XMLHttpRequest level 1 browsers: http://goo.gl/7lEuGN\n    throw new xhr.Error(\n        'getBytes is not supported in this browser.', url, request);\n  });\n};\n\n\n/**\n * Sends a post request, returning a promise that will be resolved with\n * the parsed response text once the request completes.\n *\n * @param {string} url The URL to request.\n * @param {xhr.PostData} data The body of the post request.\n * @param {xhr.Options=} opt_options Configuration options for the request.\n * @return {!goog.Promise<Object>} A promise that will be resolved with the\n *     response JSON once the request completes.\n */\nxhr.postJson = function(url, data, opt_options) {\n  return xhr.send('POST', url, data, opt_options).then(function(request) {\n    return xhr.parseJson_(request.responseText, opt_options);\n  });\n};\n\n\n/**\n * Sends a request, returning a promise that will be resolved\n * with the XHR object once the request completes.\n *\n * If content type hasn't been set in opt_options headers, and hasn't been\n * explicitly set to null, default to form-urlencoded/UTF8 for POSTs.\n *\n * @param {string} method The HTTP method for the request.\n * @param {string} url The URL to request.\n * @param {xhr.PostData} data The body of the post request.\n * @param {xhr.Options=} opt_options Configuration options for the request.\n * @return {!goog.Promise<!goog.net.XhrLike.OrNative>} A promise that will be\n *     resolved with the XHR object once the request completes.\n */\nxhr.send = function(method, url, data, opt_options) {\n  var options = opt_options || {};\n  var request = options.xmlHttpFactory ?\n      options.xmlHttpFactory.createInstance() :\n      goog.net.XmlHttp();\n\n  var result = new goog.Promise(/** @suppress {strictPrimitiveOperators} Part of the go/strict_warnings_migration */\n                                function(resolve, reject) {\n    var timer;\n\n    try {\n      request.open(method, url, true);\n    } catch (e) {\n      // XMLHttpRequest.open may throw when 'open' is called, for example, IE7\n      // throws \"Access Denied\" for cross-origin requests.\n      reject(new xhr.Error('Error opening XHR: ' + e.message, url, request));\n    }\n\n    // So sad that IE doesn't support onload and onerror.\n    request.onreadystatechange = function() {\n      if (request.readyState == goog.net.XmlHttp.ReadyState.COMPLETE) {\n        goog.global.clearTimeout(timer);\n        // Note: When developing locally, XHRs to file:// schemes return\n        // a status code of 0. We mark that case as a success too.\n        if (HttpStatus.isSuccess(request.status) ||\n            request.status === 0 && !xhr.isEffectiveSchemeHttp_(url)) {\n          resolve(request);\n        } else {\n          reject(new xhr.HttpError(request.status, url, request));\n        }\n      }\n    };\n    request.onerror = function() {\n      reject(new xhr.Error('Network error', url, request));\n    };\n\n    // Set the headers.\n    var contentType;\n    if (options.headers) {\n      for (var key in options.headers) {\n        var value = options.headers[key];\n        if (value != null) {\n          request.setRequestHeader(key, value);\n        }\n      }\n      contentType = options.headers[xhr.CONTENT_TYPE_HEADER];\n    }\n\n    // Browsers will automatically set the content type to multipart/form-data\n    // when passed a FormData object.\n    var dataIsFormData =\n        (goog.global['FormData'] && (data instanceof goog.global['FormData']));\n    // If a content type hasn't been set, it hasn't been explicitly set to null,\n    // and the data isn't a FormData, default to form-urlencoded/UTF8 for POSTs.\n    // This is because some proxies have been known to reject posts without a\n    // content-type.\n    if (method == 'POST' && contentType === undefined && !dataIsFormData) {\n      request.setRequestHeader(xhr.CONTENT_TYPE_HEADER, xhr.FORM_CONTENT_TYPE);\n    }\n\n    // Set whether to include cookies with cross-domain requests. See:\n    // http://www.w3.org/TR/XMLHttpRequest/#the-withcredentials-attribute\n    if (options.withCredentials) {\n      request.withCredentials = options.withCredentials;\n    }\n\n    // Allows setting an alternative response type, such as an ArrayBuffer. See:\n    // http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-responsetype\n    if (options.responseType) {\n      request.responseType = options.responseType;\n    }\n\n    // Allow the request to override the MIME type of the response. See:\n    // http://www.w3.org/TR/XMLHttpRequest/#dom-xmlhttprequest-overridemimetype\n    if (options.mimeType) {\n      request.overrideMimeType(options.mimeType);\n    }\n\n    // Handle timeouts, if requested.\n    if (options.timeoutMs > 0) {\n      timer = goog.global.setTimeout(function() {\n        // Clear event listener before aborting so the errback will not be\n        // called twice.\n        request.onreadystatechange = goog.nullFunction;\n        request.abort();\n        reject(new xhr.TimeoutError(url, request));\n      }, options.timeoutMs);\n    }\n\n    // Trigger the send.\n    try {\n      request.send(data);\n    } catch (e) {\n      // XMLHttpRequest.send is known to throw on some versions of FF,\n      // for example if a cross-origin request is disallowed.\n      request.onreadystatechange = goog.nullFunction;\n      goog.global.clearTimeout(timer);\n      reject(new xhr.Error('Error sending XHR: ' + e.message, url, request));\n    }\n  });\n  return result.thenCatch(function(error) {\n    if (error instanceof goog.Promise.CancellationError) {\n      request.abort();\n    }\n    throw error;\n  });\n};\n\n\n/**\n * @param {string} url The URL to test.\n * @return {boolean} Whether the effective scheme is HTTP or HTTPS.\n * @private\n */\nxhr.isEffectiveSchemeHttp_ = function(url) {\n  var scheme = goog.uri.utils.getEffectiveScheme(url);\n  // NOTE(user): Empty-string is for the case under FF3.5 when the location\n  // is not defined inside a web worker.\n  return scheme == 'http' || scheme == 'https' || scheme == '';\n};\n\n/**\n * @param {string} responseText\n * @param {string=} opt_xssiPrefix Prefix used for protecting against XSSI\n *     attacks, which should be removed before parsing the response as JSON.\n * @return {!Object} JSON-parsed value of the original responseText.\n */\nxhr.parseJson = function(responseText, opt_xssiPrefix) {\n  return xhr.parseJson_(responseText, {xssiPrefix: opt_xssiPrefix});\n};\n\n\n/**\n * JSON-parses the given response text, returning an Object.\n *\n * @param {string} responseText Response text.\n * @param {xhr.Options|undefined} options The options object.\n * @return {!Object} The JSON-parsed value of the original responseText.\n * @private\n */\nxhr.parseJson_ = function(responseText, options) {\n  var prefixStrippedResult = responseText;\n  if (options && options.xssiPrefix) {\n    prefixStrippedResult =\n        xhr.stripXssiPrefix_(options.xssiPrefix, prefixStrippedResult);\n  }\n  return /** @type {!Object} */ (JSON.parse(prefixStrippedResult));\n};\n\n\n/**\n * Strips the XSSI prefix from the input string.\n *\n * @param {string} prefix The XSSI prefix.\n * @param {string} string The string to strip the prefix from.\n * @return {string} The input string without the prefix.\n * @private\n */\nxhr.stripXssiPrefix_ = function(prefix, string) {\n  if (goog.string.startsWith(string, prefix)) {\n    string = string.substring(prefix.length);\n  }\n  return string;\n};\n\n\n\n/**\n * Generic error that may occur during a request.\n *\n * @param {string} message The error message.\n * @param {string} url The URL that was being requested.\n * @param {!goog.net.XhrLike.OrNative} request The XHR that failed.\n * @extends {goog.debug.Error}\n * @constructor\n */\nxhr.Error = function(message, url, request) {\n  xhr.Error.base(this, 'constructor', message + ', url=' + url);\n\n  /**\n   * The URL that was requested.\n   * @type {string}\n   */\n  this.url = url;\n\n  /**\n   * The XMLHttpRequest corresponding with the failed request.\n   * @type {!goog.net.XhrLike.OrNative}\n   */\n  this.xhr = request;\n};\ngoog.inherits(xhr.Error, goog.debug.Error);\n\n\n/** @override */\nxhr.Error.prototype.name = 'XhrError';\n\n\n\n/**\n * Class for HTTP errors.\n *\n * @param {number} status The HTTP status code of the response.\n * @param {string} url The URL that was being requested.\n * @param {!goog.net.XhrLike.OrNative} request The XHR that failed.\n * @extends {xhr.Error}\n * @constructor\n * @final\n */\nxhr.HttpError = function(status, url, request) {\n  xhr.HttpError.base(\n      this, 'constructor', 'Request Failed, status=' + status, url, request);\n\n  /**\n   * The HTTP status code for the error.\n   * @type {number}\n   */\n  this.status = status;\n};\ngoog.inherits(xhr.HttpError, xhr.Error);\n\n\n/** @override */\nxhr.HttpError.prototype.name = 'XhrHttpError';\n\n\n\n/**\n * Class for Timeout errors.\n *\n * @param {string} url The URL that timed out.\n * @param {!goog.net.XhrLike.OrNative} request The XHR that failed.\n * @extends {xhr.Error}\n * @constructor\n * @final\n */\nxhr.TimeoutError = function(url, request) {\n  xhr.TimeoutError.base(this, 'constructor', 'Request timed out', url, request);\n};\ngoog.inherits(xhr.TimeoutError, xhr.Error);\n\n\n/** @override */\nxhr.TimeoutError.prototype.name = 'XhrTimeoutError';\n\n});  // goog.scope\n","^17",1579837703000,"^18",["^19",["^1S","~$goog.net.HttpStatus","~$goog.uri.utils","^2D","^Z","^2G","^2X","~$goog.debug.Error","~$goog.Promise","~$goog.net.XmlHttp"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/xhr.js"],"^1J",["^19",["~$goog.labs.net.xhr.PostData","~$goog.labs.net.xhr.ResponseType","~$goog.labs.net.xhr.HttpError","~$goog.labs.net.xhr.TimeoutError","~$goog.labs.net.xhr","~$goog.labs.net.xhr.Options","~$goog.labs.net.xhr.Error"]],"^X",true,"^Y",["^Z","^4B","^1S","^4A","^4?","^4C","^2G","^2D","^4@","^2X"]],["^ ","^[",[1579837703000],"^10","goog.structs.simplepool.js","^11",["^12","goog/structs/simplepool.js"],"^13","goog/structs/simplepool.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Datastructure: Pool.\n *\n *\n * A generic class for handling pools of objects that is more efficient than\n * goog.structs.Pool because it doesn't maintain a list of objects that are in\n * use. See constructor comment.\n */\n\n\ngoog.provide('goog.structs.SimplePool');\n\ngoog.require('goog.Disposable');\n\n\n\n/**\n * A generic pool class. Simpler and more efficient than goog.structs.Pool\n * because it doesn't maintain a list of objects that are in use. This class\n * has constant overhead and doesn't create any additional objects as part of\n * the pool management after construction time.\n *\n * IMPORTANT: If the objects being pooled are arrays or maps that can have\n * unlimited number of properties, they need to be cleaned before being\n * returned to the pool.\n *\n * Also note that {@see goog.object.clean} actually allocates an array to clean\n * the object passed to it, so simply using this function would defy the\n * purpose of using the pool.\n *\n * @param {number} initialCount Initial number of objects to populate the free\n *     pool at construction time.\n * @param {number} maxCount Maximum number of objects to keep in the free pool.\n * @constructor\n * @extends {goog.Disposable}\n * @template T\n */\ngoog.structs.SimplePool = function(initialCount, maxCount) {\n  goog.Disposable.call(this);\n\n  /**\n   * Function for overriding createObject. The avoids a common case requiring\n   * subclassing this class.\n   * @private {?Function}\n   */\n  this.createObjectFn_ = null;\n\n  /**\n   * Function for overriding disposeObject. The avoids a common case requiring\n   * subclassing this class.\n   * @private {?Function}\n   */\n  this.disposeObjectFn_ = null;\n\n  /**\n   * Maximum number of objects allowed\n   * @private {number}\n   */\n  this.maxCount_ = maxCount;\n\n  /**\n   * Queue used to store objects that are currently in the pool and available\n   * to be used.\n   * @private {Array<T>}\n   */\n  this.freeQueue_ = [];\n\n  this.createInitial_(initialCount);\n};\ngoog.inherits(goog.structs.SimplePool, goog.Disposable);\n\n\n/**\n * Sets the `createObject` function which is used for creating a new\n * object in the pool.\n * @param {Function} createObjectFn Create object function which returns the\n *     newly created object.\n */\ngoog.structs.SimplePool.prototype.setCreateObjectFn = function(createObjectFn) {\n  this.createObjectFn_ = createObjectFn;\n};\n\n\n/**\n * Sets the `disposeObject` function which is used for disposing of an\n * object in the pool.\n * @param {Function} disposeObjectFn Dispose object function which takes the\n *     object to dispose as a parameter.\n */\ngoog.structs.SimplePool.prototype.setDisposeObjectFn = function(\n    disposeObjectFn) {\n  this.disposeObjectFn_ = disposeObjectFn;\n};\n\n\n/**\n * Gets an unused object from the the pool, if there is one available,\n * otherwise creates a new one.\n * @return {T} An object from the pool or a new one if necessary.\n */\ngoog.structs.SimplePool.prototype.getObject = function() {\n  if (this.freeQueue_.length) {\n    return this.freeQueue_.pop();\n  }\n  return this.createObject();\n};\n\n\n/**\n * Returns an object to the pool so that it can be reused. If the pool is\n * already full, the object is disposed instead.\n * @param {T} obj The object to release.\n */\ngoog.structs.SimplePool.prototype.releaseObject = function(obj) {\n  if (this.freeQueue_.length < this.maxCount_) {\n    this.freeQueue_.push(obj);\n  } else {\n    this.disposeObject(obj);\n  }\n};\n\n\n/**\n * Populates the pool with initialCount objects.\n * @param {number} initialCount The number of objects to add to the pool.\n * @private\n */\ngoog.structs.SimplePool.prototype.createInitial_ = function(initialCount) {\n  if (initialCount > this.maxCount_) {\n    throw new Error(\n        '[goog.structs.SimplePool] Initial cannot be greater than max');\n  }\n  for (var i = 0; i < initialCount; i++) {\n    this.freeQueue_.push(this.createObject());\n  }\n};\n\n\n/**\n * Should be overridden by sub-classes to return an instance of the object type\n * that is expected in the pool.\n * @return {T} The created object.\n */\ngoog.structs.SimplePool.prototype.createObject = function() {\n  if (this.createObjectFn_) {\n    return this.createObjectFn_();\n  } else {\n    return {};\n  }\n};\n\n\n/**\n * Should be overrideen to dispose of an object. Default implementation is to\n * remove all of the object's members, which should render it useless. Calls the\n *  object's dispose method, if available.\n * @param {T} obj The object to dispose.\n */\ngoog.structs.SimplePool.prototype.disposeObject = function(obj) {\n  if (this.disposeObjectFn_) {\n    this.disposeObjectFn_(obj);\n  } else if (goog.isObject(obj)) {\n    if (goog.isFunction(obj.dispose)) {\n      obj.dispose();\n    } else {\n      for (var i in obj) {\n        delete obj[i];\n      }\n    }\n  }\n};\n\n\n/**\n * Disposes of the pool and all objects currently held in the pool.\n * @override\n * @protected\n */\ngoog.structs.SimplePool.prototype.disposeInternal = function() {\n  goog.structs.SimplePool.superClass_.disposeInternal.call(this);\n  // Call disposeObject on each object held by the pool.\n  var freeQueue = this.freeQueue_;\n  while (freeQueue.length) {\n    this.disposeObject(freeQueue.pop());\n  }\n  delete this.freeQueue_;\n};\n","^17",1579837703000,"^18",["^19",["^Z","~$goog.Disposable"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/simplepool.js"],"^1J",["^19",["~$goog.structs.SimplePool"]],"^X",true,"^Y",["^Z","^4K"]],["^ ","^[",[1579837703000],"^10","goog.dom.pattern.allchildren.js","^11",["^12","goog/dom/pattern/allchildren.js"],"^13","goog/dom/pattern/allchildren.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview DOM pattern to match any children of a tag.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.pattern.AllChildren');\n\ngoog.require('goog.dom.pattern.AbstractPattern');\ngoog.require('goog.dom.pattern.MatchType');\n\n\n\n/**\n * Pattern object that matches any nodes at or below the current tree depth.\n *\n * @constructor\n * @extends {goog.dom.pattern.AbstractPattern}\n */\ngoog.dom.pattern.AllChildren = function() {\n  /**\n   * Tracks the matcher's depth to detect the end of the tag.\n   *\n   * @private {number}\n   */\n  this.depth_ = 0;\n};\ngoog.inherits(goog.dom.pattern.AllChildren, goog.dom.pattern.AbstractPattern);\n\n\n/**\n * Test whether the given token is on the same level.\n *\n * @param {Node} token Token to match against.\n * @param {goog.dom.TagWalkType} type The type of token.\n * @return {goog.dom.pattern.MatchType} `MATCHING` if the token is on the\n *     same level or deeper and `BACKTRACK_MATCH` if not.\n * @override\n */\ngoog.dom.pattern.AllChildren.prototype.matchToken = function(token, type) {\n  this.depth_ += type;\n\n  if (this.depth_ >= 0) {\n    return goog.dom.pattern.MatchType.MATCHING;\n  } else {\n    this.depth_ = 0;\n    return goog.dom.pattern.MatchType.BACKTRACK_MATCH;\n  }\n};\n\n\n/**\n * Reset any internal state this pattern keeps.\n * @override\n */\ngoog.dom.pattern.AllChildren.prototype.reset = function() {\n  this.depth_ = 0;\n};\n","^17",1579837703000,"^18",["^19",["~$goog.dom.pattern.AbstractPattern","^Z","~$goog.dom.pattern.MatchType"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/allchildren.js"],"^1J",["^19",["~$goog.dom.pattern.AllChildren"]],"^X",true,"^Y",["^Z","^4M","^4N"]],["^ ","^[",[1579837703000],"^10","goog.db.error.js","^11",["^12","goog/db/error.js"],"^13","goog/db/error.js","^14","^15","^16","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Error classes for the IndexedDB wrapper.\n *\n */\n\n\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.db.DomErrorLike');\ngoog.provide('goog.db.Error');\ngoog.provide('goog.db.Error.ErrorCode');\ngoog.provide('goog.db.Error.ErrorName');\ngoog.provide('goog.db.Error.VersionChangeBlockedError');\n\ngoog.require('goog.asserts');\ngoog.require('goog.debug.Error');\n\n\n/** @record */\ngoog.db.DOMErrorLike = function() {};\n\n/** @type {string|undefined} */\ngoog.db.DOMErrorLike.prototype.name;\n\n/**\n * A database error. Since the stack trace can be unhelpful in an asynchronous\n * context, the error provides a message about where it was produced.\n *\n * @param {number|!DOMError|!goog.db.DOMErrorLike} error The DOMError instance\n *     returned by the browser for Chrome22+, or an error code for previous\n *     versions.\n * @param {string} context A description of where the error occurred.\n * @param {string=} opt_message Additional message.\n * @constructor\n * @extends {goog.debug.Error}\n * @final\n */\ngoog.db.Error = function(error, context, opt_message) {\n  var errorCode = null;\n  var internalError = null;\n  if (typeof error === 'number') {\n    errorCode = error;\n    internalError = {name: goog.db.Error.getName(errorCode)};\n  } else {\n    internalError = error;\n    errorCode = goog.db.Error.getCode(error.name);\n  }\n\n  /**\n   * The code for this error.\n   *\n   * @type {number}\n   */\n  this.code = errorCode;\n\n  /**\n   * The DOMException as returned by the browser.\n   *\n   * @type {!goog.db.DOMErrorLike}\n   * @private\n   */\n  this.error_ = internalError;\n\n  var msg = 'Error ' + context + ': ' + this.getName();\n  if (opt_message) {\n    msg += ', ' + opt_message;\n  }\n  goog.db.Error.base(this, 'constructor', msg);\n};\ngoog.inherits(goog.db.Error, goog.debug.Error);\n\n\n/**\n * @return {string} The name of the error.\n */\ngoog.db.Error.prototype.getName = function() {\n  return this.error_.name || '';\n};\n\n\n\n/**\n * A specific kind of database error. If a Version Change is unable to proceed\n * due to other open database connections, it will block and this error will be\n * thrown.\n *\n * @constructor\n * @extends {goog.debug.Error}\n * @final\n */\ngoog.db.Error.VersionChangeBlockedError = function() {\n  goog.db.Error.VersionChangeBlockedError.base(\n      this, 'constructor', 'Version change blocked');\n};\ngoog.inherits(goog.db.Error.VersionChangeBlockedError, goog.debug.Error);\n\n\n/**\n * Synthetic error codes for database errors, for use when IndexedDB\n * support is not available. This numbering differs in practice\n * from the browser implementations, but it is not meant to be reliable:\n * this object merely ensures that goog.db.Error is loadable on platforms\n * that do not support IndexedDB.\n *\n * @enum {number}\n * @private\n */\ngoog.db.Error.DatabaseErrorCode_ = {\n  UNKNOWN_ERR: 1,\n  NON_TRANSIENT_ERR: 2,\n  NOT_FOUND_ERR: 3,\n  CONSTRAINT_ERR: 4,\n  DATA_ERR: 5,\n  NOT_ALLOWED_ERR: 6,\n  TRANSACTION_INACTIVE_ERR: 7,\n  ABORT_ERR: 8,\n  READ_ONLY_ERR: 9,\n  TRANSIENT_ERR: 10,\n  TIMEOUT_ERR: 11,\n  QUOTA_ERR: 12,\n  INVALID_ACCESS_ERR: 13,\n  INVALID_STATE_ERR: 14\n};\n\n\n/**\n * Error codes for database errors.\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBDatabaseException\n *\n * @enum {number}\n * @suppress {missingProperties} Obsolete IndexDb exception objects\n */\ngoog.db.Error.ErrorCode = {\n  UNKNOWN_ERR: (goog.global.IDBDatabaseException ||\n                goog.global.webkitIDBDatabaseException ||\n                goog.db.Error.DatabaseErrorCode_)\n                   .UNKNOWN_ERR,\n  NON_TRANSIENT_ERR: (goog.global.IDBDatabaseException ||\n                      goog.global.webkitIDBDatabaseException ||\n                      goog.db.Error.DatabaseErrorCode_)\n                         .NON_TRANSIENT_ERR,\n  NOT_FOUND_ERR: (goog.global.IDBDatabaseException ||\n                  goog.global.webkitIDBDatabaseException ||\n                  goog.db.Error.DatabaseErrorCode_)\n                     .NOT_FOUND_ERR,\n  CONSTRAINT_ERR: (goog.global.IDBDatabaseException ||\n                   goog.global.webkitIDBDatabaseException ||\n                   goog.db.Error.DatabaseErrorCode_)\n                      .CONSTRAINT_ERR,\n  DATA_ERR: (goog.global.IDBDatabaseException ||\n             goog.global.webkitIDBDatabaseException ||\n             goog.db.Error.DatabaseErrorCode_)\n                .DATA_ERR,\n  NOT_ALLOWED_ERR: (goog.global.IDBDatabaseException ||\n                    goog.global.webkitIDBDatabaseException ||\n                    goog.db.Error.DatabaseErrorCode_)\n                       .NOT_ALLOWED_ERR,\n  TRANSACTION_INACTIVE_ERR: (goog.global.IDBDatabaseException ||\n                             goog.global.webkitIDBDatabaseException ||\n                             goog.db.Error.DatabaseErrorCode_)\n                                .TRANSACTION_INACTIVE_ERR,\n  ABORT_ERR: (goog.global.IDBDatabaseException ||\n              goog.global.webkitIDBDatabaseException ||\n              goog.db.Error.DatabaseErrorCode_)\n                 .ABORT_ERR,\n  READ_ONLY_ERR: (goog.global.IDBDatabaseException ||\n                  goog.global.webkitIDBDatabaseException ||\n                  goog.db.Error.DatabaseErrorCode_)\n                     .READ_ONLY_ERR,\n  TIMEOUT_ERR: (goog.global.IDBDatabaseException ||\n                goog.global.webkitIDBDatabaseException ||\n                goog.db.Error.DatabaseErrorCode_)\n                   .TIMEOUT_ERR,\n  QUOTA_ERR: (goog.global.IDBDatabaseException ||\n              goog.global.webkitIDBDatabaseException ||\n              goog.db.Error.DatabaseErrorCode_)\n                 .QUOTA_ERR,\n  INVALID_ACCESS_ERR:\n      (goog.global.DOMException || goog.db.Error.DatabaseErrorCode_)\n          .INVALID_ACCESS_ERR,\n  INVALID_STATE_ERR:\n      (goog.global.DOMException || goog.db.Error.DatabaseErrorCode_)\n          .INVALID_STATE_ERR\n};\n\n\n/**\n * Translates an error code into a more useful message.\n *\n * @param {number} code Error code.\n * @return {string} A debug message.\n */\ngoog.db.Error.getMessage = function(code) {\n  switch (code) {\n    case goog.db.Error.ErrorCode.UNKNOWN_ERR:\n      return 'Unknown error';\n    case goog.db.Error.ErrorCode.NON_TRANSIENT_ERR:\n      return 'Invalid operation';\n    case goog.db.Error.ErrorCode.NOT_FOUND_ERR:\n      return 'Required database object not found';\n    case goog.db.Error.ErrorCode.CONSTRAINT_ERR:\n      return 'Constraint unsatisfied';\n    case goog.db.Error.ErrorCode.DATA_ERR:\n      return 'Invalid data';\n    case goog.db.Error.ErrorCode.NOT_ALLOWED_ERR:\n      return 'Operation disallowed';\n    case goog.db.Error.ErrorCode.TRANSACTION_INACTIVE_ERR:\n      return 'Transaction not active';\n    case goog.db.Error.ErrorCode.ABORT_ERR:\n      return 'Request aborted';\n    case goog.db.Error.ErrorCode.READ_ONLY_ERR:\n      return 'Modifying operation not allowed in a read-only transaction';\n    case goog.db.Error.ErrorCode.TIMEOUT_ERR:\n      return 'Transaction timed out';\n    case goog.db.Error.ErrorCode.QUOTA_ERR:\n      return 'Database storage space quota exceeded';\n    case goog.db.Error.ErrorCode.INVALID_ACCESS_ERR:\n      return 'Invalid operation';\n    case goog.db.Error.ErrorCode.INVALID_STATE_ERR:\n      return 'Invalid state';\n    default:\n      return 'Unrecognized exception with code ' + code;\n  }\n};\n\n\n/**\n * Names of all possible errors as returned from the browser.\n * @see http://www.w3.org/TR/IndexedDB/#exceptions\n * @enum {string}\n */\ngoog.db.Error.ErrorName = {\n  ABORT_ERR: 'AbortError',\n  CONSTRAINT_ERR: 'ConstraintError',\n  DATA_CLONE_ERR: 'DataCloneError',\n  DATA_ERR: 'DataError',\n  INVALID_ACCESS_ERR: 'InvalidAccessError',\n  INVALID_STATE_ERR: 'InvalidStateError',\n  NOT_FOUND_ERR: 'NotFoundError',\n  QUOTA_EXCEEDED_ERR: 'QuotaExceededError',\n  READ_ONLY_ERR: 'ReadOnlyError',\n  SYNTAX_ERROR: 'SyntaxError',\n  TIMEOUT_ERR: 'TimeoutError',\n  TRANSACTION_INACTIVE_ERR: 'TransactionInactiveError',\n  UNKNOWN_ERR: 'UnknownError',\n  VERSION_ERR: 'VersionError'\n};\n\n\n/**\n * Translates an error name to an error code. This is purely kept for backwards\n * compatibility with Chrome21.\n *\n * @param {string|undefined} name The name of the erorr.\n * @return {number} The error code corresponding to the error.\n */\ngoog.db.Error.getCode = function(name) {\n  switch (name) {\n    case goog.db.Error.ErrorName.UNKNOWN_ERR:\n      return goog.db.Error.ErrorCode.UNKNOWN_ERR;\n    case goog.db.Error.ErrorName.NOT_FOUND_ERR:\n      return goog.db.Error.ErrorCode.NOT_FOUND_ERR;\n    case goog.db.Error.ErrorName.CONSTRAINT_ERR:\n      return goog.db.Error.ErrorCode.CONSTRAINT_ERR;\n    case goog.db.Error.ErrorName.DATA_ERR:\n      return goog.db.Error.ErrorCode.DATA_ERR;\n    case goog.db.Error.ErrorName.TRANSACTION_INACTIVE_ERR:\n      return goog.db.Error.ErrorCode.TRANSACTION_INACTIVE_ERR;\n    case goog.db.Error.ErrorName.ABORT_ERR:\n      return goog.db.Error.ErrorCode.ABORT_ERR;\n    case goog.db.Error.ErrorName.READ_ONLY_ERR:\n      return goog.db.Error.ErrorCode.READ_ONLY_ERR;\n    case goog.db.Error.ErrorName.TIMEOUT_ERR:\n      return goog.db.Error.ErrorCode.TIMEOUT_ERR;\n    case goog.db.Error.ErrorName.QUOTA_EXCEEDED_ERR:\n      return goog.db.Error.ErrorCode.QUOTA_ERR;\n    case goog.db.Error.ErrorName.INVALID_ACCESS_ERR:\n      return goog.db.Error.ErrorCode.INVALID_ACCESS_ERR;\n    case goog.db.Error.ErrorName.INVALID_STATE_ERR:\n      return goog.db.Error.ErrorCode.INVALID_STATE_ERR;\n    default:\n      return goog.db.Error.ErrorCode.UNKNOWN_ERR;\n  }\n};\n\n\n/**\n * Converts an error code used by the old spec, to an error name used by the\n * latest spec.\n * @see http://www.w3.org/TR/IndexedDB/#exceptions\n *\n * @param {!goog.db.Error.ErrorCode|number} code The error code to convert.\n * @return {!goog.db.Error.ErrorName} The corresponding name of the error.\n */\ngoog.db.Error.getName = function(code) {\n  switch (code) {\n    case goog.db.Error.ErrorCode.UNKNOWN_ERR:\n      return goog.db.Error.ErrorName.UNKNOWN_ERR;\n    case goog.db.Error.ErrorCode.NOT_FOUND_ERR:\n      return goog.db.Error.ErrorName.NOT_FOUND_ERR;\n    case goog.db.Error.ErrorCode.CONSTRAINT_ERR:\n      return goog.db.Error.ErrorName.CONSTRAINT_ERR;\n    case goog.db.Error.ErrorCode.DATA_ERR:\n      return goog.db.Error.ErrorName.DATA_ERR;\n    case goog.db.Error.ErrorCode.TRANSACTION_INACTIVE_ERR:\n      return goog.db.Error.ErrorName.TRANSACTION_INACTIVE_ERR;\n    case goog.db.Error.ErrorCode.ABORT_ERR:\n      return goog.db.Error.ErrorName.ABORT_ERR;\n    case goog.db.Error.ErrorCode.READ_ONLY_ERR:\n      return goog.db.Error.ErrorName.READ_ONLY_ERR;\n    case goog.db.Error.ErrorCode.TIMEOUT_ERR:\n      return goog.db.Error.ErrorName.TIMEOUT_ERR;\n    case goog.db.Error.ErrorCode.QUOTA_ERR:\n      return goog.db.Error.ErrorName.QUOTA_EXCEEDED_ERR;\n    case goog.db.Error.ErrorCode.INVALID_ACCESS_ERR:\n      return goog.db.Error.ErrorName.INVALID_ACCESS_ERR;\n    case goog.db.Error.ErrorCode.INVALID_STATE_ERR:\n      return goog.db.Error.ErrorName.INVALID_STATE_ERR;\n    default:\n      return goog.db.Error.ErrorName.UNKNOWN_ERR;\n  }\n};\n\n\n/**\n * Constructs an goog.db.Error instance from an IDBRequest. This abstraction is\n * necessary to provide backwards compatibility with Chrome21.\n *\n * @param {!IDBRequest} request The request that failed.\n * @param {string} message The error message to add to err if it's wrapped.\n * @return {!goog.db.Error} The error that caused the failure.\n */\ngoog.db.Error.fromRequest = function(request, message) {\n  if ('error' in request) {\n    // Chrome 22+\n    return new goog.db.Error(goog.asserts.assert(request.error), message);\n  } else {\n    return new goog.db.Error(\n        {name: goog.db.Error.ErrorName.UNKNOWN_ERR}, message);\n  }\n};\n\n\n/**\n * Constructs an goog.db.Error instance from an DOMException. This abstraction\n * is necessary to provide backwards compatibility with Chrome21.\n *\n * @param {!DOMError|!DOMException} ex The exception that was thrown.\n * @param {string} message The error message to add to err if it's wrapped.\n * @return {!goog.db.Error} The error that caused the failure.\n */\ngoog.db.Error.fromException = function(ex, message) {\n  if ('name' in ex) {\n    // Chrome 22+.\n    var errorMessage = message + ': ' + ex.message;\n    return new goog.db.Error(ex, errorMessage);\n  } else if ('code' in ex) {\n    // Chrome 21 and before.\n    var errorName = goog.db.Error.getName(ex.code);\n    var errorMessage = message + ': ' + ex.message;\n    return new goog.db.Error({name: errorName}, errorMessage);\n  } else {\n    return new goog.db.Error(\n        {name: goog.db.Error.ErrorName.UNKNOWN_ERR}, message);\n  }\n};\n","^17",1579837703000,"^18",["^19",["^1S","^Z","^4A"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/db/error.js"],"^1J",["^19",["~$goog.db.Error","~$goog.db.Error.ErrorName","~$goog.db.Error.VersionChangeBlockedError","~$goog.db.Error.ErrorCode","~$goog.db.DomErrorLike"]],"^X",true,"^Y",["^Z","^1S","^4A"]],["^ ","^[",[1579837703000],"^10","goog.labs.useragent.platform.js","^11",["^12","goog/labs/useragent/platform.js"],"^13","goog/labs/useragent/platform.js","^14","^15","^16","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Closure user agent platform detection.\n * @see <a href=\"http://www.useragentstring.com/\">User agent strings</a>\n * For more information on browser brand, rendering engine, or device see the\n * other sub-namespaces in goog.labs.userAgent (browser, engine, and device\n * respectively).\n *\n */\n\ngoog.provide('goog.labs.userAgent.platform');\n\ngoog.require('goog.labs.userAgent.util');\ngoog.require('goog.string');\n\n\n/**\n * @return {boolean} Whether the platform is Android.\n */\ngoog.labs.userAgent.platform.isAndroid = function() {\n  return goog.labs.userAgent.util.matchUserAgent('Android');\n};\n\n\n/**\n * @return {boolean} Whether the platform is iPod.\n */\ngoog.labs.userAgent.platform.isIpod = function() {\n  return goog.labs.userAgent.util.matchUserAgent('iPod');\n};\n\n\n/**\n * @return {boolean} Whether the platform is iPhone.\n */\ngoog.labs.userAgent.platform.isIphone = function() {\n  return goog.labs.userAgent.util.matchUserAgent('iPhone') &&\n      !goog.labs.userAgent.util.matchUserAgent('iPod') &&\n      !goog.labs.userAgent.util.matchUserAgent('iPad');\n};\n\n\n/**\n * @return {boolean} Whether the platform is iPad.\n */\ngoog.labs.userAgent.platform.isIpad = function() {\n  return goog.labs.userAgent.util.matchUserAgent('iPad');\n};\n\n\n/**\n * @return {boolean} Whether the platform is iOS.\n */\ngoog.labs.userAgent.platform.isIos = function() {\n  return goog.labs.userAgent.platform.isIphone() ||\n      goog.labs.userAgent.platform.isIpad() ||\n      goog.labs.userAgent.platform.isIpod();\n};\n\n\n/**\n * @return {boolean} Whether the platform is Mac.\n */\ngoog.labs.userAgent.platform.isMacintosh = function() {\n  return goog.labs.userAgent.util.matchUserAgent('Macintosh');\n};\n\n\n/**\n * Note: ChromeOS is not considered to be Linux as it does not report itself\n * as Linux in the user agent string.\n * @return {boolean} Whether the platform is Linux.\n */\ngoog.labs.userAgent.platform.isLinux = function() {\n  return goog.labs.userAgent.util.matchUserAgent('Linux');\n};\n\n\n/**\n * @return {boolean} Whether the platform is Windows.\n */\ngoog.labs.userAgent.platform.isWindows = function() {\n  return goog.labs.userAgent.util.matchUserAgent('Windows');\n};\n\n\n/**\n * @return {boolean} Whether the platform is ChromeOS.\n */\ngoog.labs.userAgent.platform.isChromeOS = function() {\n  return goog.labs.userAgent.util.matchUserAgent('CrOS');\n};\n\n/**\n * @return {boolean} Whether the platform is Chromecast.\n */\ngoog.labs.userAgent.platform.isChromecast = function() {\n  return goog.labs.userAgent.util.matchUserAgent('CrKey');\n};\n\n/**\n * @return {boolean} Whether the platform is KaiOS.\n */\ngoog.labs.userAgent.platform.isKaiOS = function() {\n  return goog.labs.userAgent.util.matchUserAgentIgnoreCase('KaiOS');\n};\n\n/**\n * @return {boolean} Whether the platform is Go2Phone.\n */\ngoog.labs.userAgent.platform.isGo2Phone = function() {\n  return goog.labs.userAgent.util.matchUserAgentIgnoreCase('GAFP');\n};\n\n/**\n * The version of the platform. We only determine the version for Windows,\n * Mac, and Chrome OS. It doesn't make much sense on Linux. For Windows, we only\n * look at the NT version. Non-NT-based versions (e.g. 95, 98, etc.) are given\n * version 0.0.\n *\n * @return {string} The platform version or empty string if version cannot be\n *     determined.\n */\ngoog.labs.userAgent.platform.getVersion = function() {\n  var userAgentString = goog.labs.userAgent.util.getUserAgent();\n  var version = '', re;\n  if (goog.labs.userAgent.platform.isWindows()) {\n    re = /Windows (?:NT|Phone) ([0-9.]+)/;\n    var match = re.exec(userAgentString);\n    if (match) {\n      version = match[1];\n    } else {\n      version = '0.0';\n    }\n  } else if (goog.labs.userAgent.platform.isIos()) {\n    re = /(?:iPhone|iPod|iPad|CPU)\\s+OS\\s+(\\S+)/;\n    var match = re.exec(userAgentString);\n    // Report the version as x.y.z and not x_y_z\n    version = match && match[1].replace(/_/g, '.');\n  } else if (goog.labs.userAgent.platform.isMacintosh()) {\n    re = /Mac OS X ([0-9_.]+)/;\n    var match = re.exec(userAgentString);\n    // Note: some old versions of Camino do not report an OSX version.\n    // Default to 10.\n    version = match ? match[1].replace(/_/g, '.') : '10';\n  } else if (goog.labs.userAgent.platform.isKaiOS()) {\n    re = /(?:KaiOS)\\/(\\S+)/i;\n    var match = re.exec(userAgentString);\n    version = match && match[1];\n  } else if (goog.labs.userAgent.platform.isAndroid()) {\n    re = /Android\\s+([^\\);]+)(\\)|;)/;\n    var match = re.exec(userAgentString);\n    version = match && match[1];\n  } else if (goog.labs.userAgent.platform.isChromeOS()) {\n    re = /(?:CrOS\\s+(?:i686|x86_64)\\s+([0-9.]+))/;\n    var match = re.exec(userAgentString);\n    version = match && match[1];\n  }\n  return version || '';\n};\n\n\n/**\n * @param {string|number} version The version to check.\n * @return {boolean} Whether the browser version is higher or the same as the\n *     given version.\n */\ngoog.labs.userAgent.platform.isVersionOrHigher = function(version) {\n  return goog.string.compareVersions(\n             goog.labs.userAgent.platform.getVersion(), version) >= 0;\n};\n","^17",1579837703000,"^18",["^19",["^2D","^Z","~$goog.labs.userAgent.util"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/useragent/platform.js"],"^1J",["^19",["~$goog.labs.userAgent.platform"]],"^X",true,"^Y",["^Z","^4U","^2D"]],["^ ","^[",[1579837703000],"^10","goog.useragent.iphoto.js","^11",["^12","goog/useragent/iphoto.js"],"^13","goog/useragent/iphoto.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Newer versions of iPhoto include a Safari plugin which allows\n * the browser to detect if iPhoto is installed. Adapted from detection code\n * built into the Mac.com Gallery RSS feeds.\n * @author brenneman@google.com (Shawn Brenneman)\n * @see ../demos/useragent.html\n */\n\n\ngoog.provide('goog.userAgent.iphoto');\n\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n(function() {\n  var hasIphoto = false;\n  var version = '';\n\n  /**\n   * The plugin description string contains the version number as in the form\n   * 'iPhoto 700'. This returns just the version number as a dotted string,\n   * e.g., '7.0.0', compatible with `goog.string.compareVersions`.\n   * @param {string} desc The version string.\n   * @return {string} The dotted version.\n   */\n  function getIphotoVersion(desc) {\n    var matches = desc.match(/\\d/g);\n    return matches.join('.');\n  }\n\n  if (goog.userAgent.WEBKIT && navigator.mimeTypes &&\n      navigator.mimeTypes.length > 0) {\n    var iphoto = navigator.mimeTypes['application/photo'];\n\n    if (iphoto) {\n      hasIphoto = true;\n      var description = iphoto['description'];\n\n      if (description) {\n        version = getIphotoVersion(description);\n      }\n    }\n  }\n\n  /**\n   * Whether we can detect that the user has iPhoto installed.\n   * @type {boolean}\n   */\n  goog.userAgent.iphoto.HAS_IPHOTO = hasIphoto;\n\n\n  /**\n   * The version of iPhoto installed if found.\n   * @type {string}\n   */\n  goog.userAgent.iphoto.VERSION = version;\n\n})();\n\n\n/**\n * Whether the installed version of iPhoto is as new or newer than a given\n * version.\n * @param {string} version The version to check.\n * @return {boolean} Whether the installed version of iPhoto is as new or newer\n *     than a given version.\n */\ngoog.userAgent.iphoto.isVersion = function(version) {\n  return goog.string.compareVersions(goog.userAgent.iphoto.VERSION, version) >=\n      0;\n};\n","^17",1579837703000,"^18",["^19",["^2D","^Z","^2X"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/useragent/iphoto.js"],"^1J",["^19",["~$goog.userAgent.iphoto"]],"^X",true,"^Y",["^Z","^2D","^2X"]],["^ ","^[",[1579837703000],"^10","goog.editor.table.js","^11",["^12","goog/editor/table.js"],"^13","goog/editor/table.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Table editing support.\n * This file provides the class goog.editor.Table and two\n * supporting classes, goog.editor.TableRow and\n * goog.editor.TableCell. Together these provide support for\n * high level table modifications: Adding and deleting rows and columns,\n * and merging and splitting cells.\n *\n */\n\ngoog.provide('goog.editor.Table');\ngoog.provide('goog.editor.TableCell');\ngoog.provide('goog.editor.TableRow');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.DomHelper');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.log');\ngoog.require('goog.string.Unicode');\ngoog.require('goog.style');\n\n\n\n/**\n * Class providing high level table editing functions.\n * @param {Element} node Element that is a table or descendant of a table.\n * @constructor\n * @final\n */\ngoog.editor.Table = function(node) {\n  this.element =\n      goog.dom.getAncestorByTagNameAndClass(node, goog.dom.TagName.TABLE);\n  if (!this.element) {\n    goog.log.error(\n        this.logger_, \"Can't create Table based on a node \" +\n            \"that isn't a table, or descended from a table.\");\n  }\n  this.dom_ = goog.dom.getDomHelper(this.element);\n  this.refresh();\n};\n\n\n/**\n * Logger object for debugging and error messages.\n * @type {goog.log.Logger}\n * @private\n */\ngoog.editor.Table.prototype.logger_ = goog.log.getLogger('goog.editor.Table');\n\n\n/**\n * Walks the dom structure of this object's table element and populates\n * this.rows with goog.editor.TableRow objects. This is done initially\n * to populate the internal data structures, and also after each time the\n * DOM structure is modified. Currently this means that the all existing\n * information is discarded and re-read from the DOM.\n */\n// TODO(user): support partial refresh to save cost of full update\n// every time there is a change to the DOM.\ngoog.editor.Table.prototype.refresh = function() {\n  var rows = this.rows = [];\n  var tbody = goog.dom.getElementsByTagName(\n      goog.dom.TagName.TBODY, goog.asserts.assert(this.element))[0];\n  if (!tbody) {\n    return;\n  }\n  var trs = [];\n  for (var child = tbody.firstChild; child; child = child.nextSibling) {\n    if (child.nodeName == goog.dom.TagName.TR) {\n      trs.push(child);\n    }\n  }\n\n  for (var rowNum = 0, tr; tr = trs[rowNum]; rowNum++) {\n    var existingRow = rows[rowNum];\n    var tds = goog.editor.Table.getChildCellElements(tr);\n    var columnNum = 0;\n    // A note on cellNum vs. columnNum: A cell is a td/th element. Cells may\n    // use colspan/rowspan to extend over multiple rows/columns. cellNum\n    // is the dom element number, columnNum is the logical column number.\n    for (var cellNum = 0, td; td = tds[cellNum]; cellNum++) {\n      // If there's already a cell extending into this column\n      // (due to that cell's colspan/rowspan), increment the column counter.\n      while (existingRow && existingRow.columns[columnNum]) {\n        columnNum++;\n      }\n      var cell = new goog.editor.TableCell(td, rowNum, columnNum);\n      // Place this cell in every row and column into which it extends.\n      for (var i = 0; i < cell.rowSpan; i++) {\n        var cellRowNum = rowNum + i;\n        // Create TableRow objects in this.rows as needed.\n        var cellRow = rows[cellRowNum];\n        if (!cellRow) {\n          // TODO(user): try to avoid second trs[] lookup.\n          rows.push(\n              cellRow = new goog.editor.TableRow(trs[cellRowNum], cellRowNum));\n        }\n        // Extend length of column array to make room for this cell.\n        var minimumColumnLength = columnNum + cell.colSpan;\n        if (cellRow.columns.length < minimumColumnLength) {\n          cellRow.columns.length = minimumColumnLength;\n        }\n        for (var j = 0; j < cell.colSpan; j++) {\n          var cellColumnNum = columnNum + j;\n          cellRow.columns[cellColumnNum] = cell;\n        }\n      }\n      columnNum += cell.colSpan;\n    }\n  }\n};\n\n\n/**\n * Returns all child elements of a TR element that are of type TD or TH.\n * @param {Element} tr TR element in which to find children.\n * @return {!Array<Element>} array of child cell elements.\n */\ngoog.editor.Table.getChildCellElements = function(tr) {\n  var cells = [];\n  for (var i = 0, cell; cell = tr.childNodes[i]; i++) {\n    if (cell.nodeName == goog.dom.TagName.TD ||\n        cell.nodeName == goog.dom.TagName.TH) {\n      cells.push(cell);\n    }\n  }\n  return cells;\n};\n\n\n/**\n * Inserts a new row in the table. The row will be populated with new\n * cells, and existing rowspanned cells that overlap the new row will\n * be extended.\n * @param {number=} opt_rowIndex Index at which to insert the row. If\n *     this is omitted the row will be appended to the end of the table.\n * @return {!Element} The new row.\n */\ngoog.editor.Table.prototype.insertRow = function(opt_rowIndex) {\n  var rowIndex = (opt_rowIndex != null) ? opt_rowIndex : this.rows.length;\n  var refRow;\n  var insertAfter;\n  if (rowIndex == 0) {\n    refRow = this.rows[0];\n    insertAfter = false;\n  } else {\n    refRow = this.rows[rowIndex - 1];\n    insertAfter = true;\n  }\n  var newTr = this.dom_.createElement(goog.dom.TagName.TR);\n  for (var i = 0, cell; cell = refRow.columns[i]; i += 1) {\n    // Check whether the existing cell will span this new row.\n    // If so, instead of creating a new cell, extend\n    // the rowspan of the existing cell.\n    if ((insertAfter && cell.endRow > rowIndex) ||\n        (!insertAfter && cell.startRow < rowIndex)) {\n      cell.setRowSpan(cell.rowSpan + 1);\n      if (cell.colSpan > 1) {\n        i += cell.colSpan - 1;\n      }\n    } else {\n      newTr.appendChild(this.createEmptyTd());\n    }\n    if (insertAfter) {\n      goog.dom.insertSiblingAfter(newTr, refRow.element);\n    } else {\n      goog.dom.insertSiblingBefore(newTr, refRow.element);\n    }\n  }\n  this.refresh();\n  return newTr;\n};\n\n\n/**\n * Inserts a new column in the table. The column will be created by\n * inserting new TD elements in each row, or extending the colspan\n * of existing TD elements.\n * @param {number=} opt_colIndex Index at which to insert the column. If\n *     this is omitted the column will be appended to the right side of\n *     the table.\n * @return {!Array<Element>} Array of new cell elements that were created\n *     to populate the new column.\n */\ngoog.editor.Table.prototype.insertColumn = function(opt_colIndex) {\n  // TODO(user): set column widths in a way that makes sense.\n  var colIndex = (opt_colIndex != null) ?\n      opt_colIndex :\n      (this.rows[0] && this.rows[0].columns.length) || 0;\n  var newTds = [];\n  for (var rowNum = 0, row; row = this.rows[rowNum]; rowNum++) {\n    var existingCell = row.columns[colIndex];\n    if (existingCell && existingCell.endCol >= colIndex &&\n        existingCell.startCol < colIndex) {\n      existingCell.setColSpan(existingCell.colSpan + 1);\n      rowNum += existingCell.rowSpan - 1;\n    } else {\n      var newTd = this.createEmptyTd();\n      // TODO(user): figure out a way to intelligently size new columns.\n      newTd.style.width = goog.editor.Table.OPTIMUM_EMPTY_CELL_WIDTH + 'px';\n      this.insertCellElement(newTd, rowNum, colIndex);\n      newTds.push(newTd);\n    }\n  }\n  this.refresh();\n  return newTds;\n};\n\n\n/**\n * Removes a row from the table, removing the TR element and\n * decrementing the rowspan of any cells in other rows that overlap the row.\n * @param {number} rowIndex Index of the row to delete.\n */\ngoog.editor.Table.prototype.removeRow = function(rowIndex) {\n  var row = this.rows[rowIndex];\n  if (!row) {\n    goog.log.warning(\n        this.logger_,\n        \"Can't remove row at position \" + rowIndex + ': no such row.');\n  }\n  for (var i = 0, cell; cell = row.columns[i]; i += cell.colSpan) {\n    if (cell.rowSpan > 1) {\n      cell.setRowSpan(cell.rowSpan - 1);\n      if (cell.startRow == rowIndex) {\n        // Rowspanned cell started in this row - move it down to the next row.\n        this.insertCellElement(cell.element, rowIndex + 1, cell.startCol);\n      }\n    }\n  }\n  row.element.parentNode.removeChild(row.element);\n  this.refresh();\n};\n\n\n/**\n * Removes a column from the table. This is done by removing cell elements,\n * or shrinking the colspan of elements that span multiple columns.\n * @param {number} colIndex Index of the column to delete.\n */\ngoog.editor.Table.prototype.removeColumn = function(colIndex) {\n  for (var i = 0, row; row = this.rows[i]; i++) {\n    var cell = row.columns[colIndex];\n    if (!cell) {\n      goog.log.error(\n          this.logger_, \"Can't remove cell at position \" + i + ', ' + colIndex +\n              ': no such cell.');\n    }\n    if (cell.colSpan > 1) {\n      cell.setColSpan(cell.colSpan - 1);\n    } else {\n      cell.element.parentNode.removeChild(cell.element);\n    }\n    // Skip over following rows that contain this same cell.\n    i += cell.rowSpan - 1;\n  }\n  this.refresh();\n};\n\n\n/**\n * Merges multiple cells into a single cell, and sets the rowSpan and colSpan\n * attributes of the cell to take up the same space as the original cells.\n * @param {number} startRowIndex Top coordinate of the cells to merge.\n * @param {number} startColIndex Left coordinate of the cells to merge.\n * @param {number} endRowIndex Bottom coordinate of the cells to merge.\n * @param {number} endColIndex Right coordinate of the cells to merge.\n * @return {boolean} Whether or not the merge was possible. If the cells\n *     in the supplied coordinates can't be merged this will return false.\n */\ngoog.editor.Table.prototype.mergeCells = function(\n    startRowIndex, startColIndex, endRowIndex, endColIndex) {\n  // TODO(user): take a single goog.math.Rect parameter instead?\n  var cells = [];\n  var cell;\n  if (startRowIndex == endRowIndex && startColIndex == endColIndex) {\n    goog.log.warning(this.logger_, \"Can't merge single cell\");\n    return false;\n  }\n  // Gather cells and do sanity check.\n  for (var i = startRowIndex; i <= endRowIndex; i++) {\n    for (var j = startColIndex; j <= endColIndex; j++) {\n      cell = this.rows[i].columns[j];\n      if (cell.startRow < startRowIndex || cell.endRow > endRowIndex ||\n          cell.startCol < startColIndex || cell.endCol > endColIndex) {\n        goog.log.warning(\n            this.logger_, \"Can't merge cells: the cell in row \" + i +\n                ', column ' + j + 'extends outside the supplied rectangle.');\n        return false;\n      }\n      // TODO(user): this is somewhat inefficient, as we will add\n      // a reference for a cell for each position, even if it's a single\n      // cell with row/colspan.\n      cells.push(cell);\n    }\n  }\n  var targetCell = cells[0];\n  var targetTd = targetCell.element;\n  var doc = this.dom_.getDocument();\n\n  // Merge cell contents and discard other cells.\n  for (var i = 1; cell = cells[i]; i++) {\n    var td = cell.element;\n    if (!td.parentNode || td == targetTd) {\n      // We've already handled this cell at one of its previous positions.\n      continue;\n    }\n    // Add a space if needed, to keep merged content from getting squished\n    // together.\n    if (targetTd.lastChild &&\n        targetTd.lastChild.nodeType == goog.dom.NodeType.TEXT) {\n      targetTd.appendChild(doc.createTextNode(' '));\n    }\n    var childNode;\n    while ((childNode = td.firstChild)) {\n      targetTd.appendChild(childNode);\n    }\n    td.parentNode.removeChild(td);\n  }\n  targetCell.setColSpan((endColIndex - startColIndex) + 1);\n  targetCell.setRowSpan((endRowIndex - startRowIndex) + 1);\n  if (endColIndex > startColIndex) {\n    // Clear width on target cell.\n    // TODO(user): instead of clearing width, calculate width\n    // based on width of input cells\n    targetTd.removeAttribute('width');\n    targetTd.style.width = null;\n  }\n  this.refresh();\n\n  return true;\n};\n\n\n/**\n * Splits a cell with colspans or rowspans into multiple descrete cells.\n * @param {number} rowIndex y coordinate of the cell to split.\n * @param {number} colIndex x coordinate of the cell to split.\n * @return {!Array<Element>} Array of new cell elements created by splitting\n *     the cell.\n */\n// TODO(user): support splitting only horizontally or vertically,\n// support splitting cells that aren't already row/colspanned.\ngoog.editor.Table.prototype.splitCell = function(rowIndex, colIndex) {\n  var row = this.rows[rowIndex];\n  var cell = row.columns[colIndex];\n  var newTds = [];\n  for (var i = 0; i < cell.rowSpan; i++) {\n    for (var j = 0; j < cell.colSpan; j++) {\n      if (i > 0 || j > 0) {\n        var newTd = this.createEmptyTd();\n        this.insertCellElement(newTd, rowIndex + i, colIndex + j);\n        newTds.push(newTd);\n      }\n    }\n  }\n  cell.setColSpan(1);\n  cell.setRowSpan(1);\n  this.refresh();\n  return newTds;\n};\n\n\n/**\n * Inserts a cell element at the given position. The colIndex is the logical\n * column index, not the position in the dom. This takes into consideration\n * that cells in a given logical  row may actually be children of a previous\n * DOM row that have used rowSpan to extend into the row.\n * @param {Element} td The new cell element to insert.\n * @param {number} rowIndex Row in which to insert the element.\n * @param {number} colIndex Column in which to insert the element.\n */\ngoog.editor.Table.prototype.insertCellElement = function(\n    td, rowIndex, colIndex) {\n  var row = this.rows[rowIndex];\n  var nextSiblingElement = null;\n  for (var i = colIndex, cell; cell = row.columns[i]; i += cell.colSpan) {\n    if (cell.startRow == rowIndex) {\n      nextSiblingElement = cell.element;\n      break;\n    }\n  }\n  row.element.insertBefore(td, nextSiblingElement);\n};\n\n\n/**\n * Creates an empty TD element and fill it with some empty content so it will\n * show up with borders even in IE pre-7 or if empty-cells is set to 'hide'\n * @return {!Element} a new TD element.\n */\ngoog.editor.Table.prototype.createEmptyTd = function() {\n  // TODO(user): more cross-browser testing to determine best\n  // and least annoying filler content.\n  return this.dom_.createDom(goog.dom.TagName.TD, {}, goog.string.Unicode.NBSP);\n};\n\n\n\n/**\n * Class representing a logical table row: a tr element and any cells\n * that appear in that row.\n * @param {Element} trElement This rows's underlying TR element.\n * @param {number} rowIndex This row's index in its parent table.\n * @constructor\n * @final\n */\ngoog.editor.TableRow = function(trElement, rowIndex) {\n  this.index = rowIndex;\n  this.element = trElement;\n  this.columns = [];\n};\n\n\n\n/**\n * Class representing a table cell, which may span across multiple\n * rows and columns\n * @param {Element} td This cell's underlying TD or TH element.\n * @param {number} startRow Index of the row where this cell begins.\n * @param {number} startCol Index of the column where this cell begins.\n * @constructor\n * @final\n */\ngoog.editor.TableCell = function(td, startRow, startCol) {\n  this.element = td;\n  this.colSpan = parseInt(td.colSpan, 10) || 1;\n  this.rowSpan = parseInt(td.rowSpan, 10) || 1;\n  this.startRow = startRow;\n  this.startCol = startCol;\n  this.updateCoordinates_();\n};\n\n\n/**\n * Calculates this cell's endRow/endCol coordinates based on rowSpan/colSpan\n * @private\n */\ngoog.editor.TableCell.prototype.updateCoordinates_ = function() {\n  this.endCol = this.startCol + this.colSpan - 1;\n  this.endRow = this.startRow + this.rowSpan - 1;\n};\n\n\n/**\n * Set this cell's colSpan, updating both its colSpan property and the\n * underlying element's colSpan attribute.\n * @param {number} colSpan The new colSpan.\n */\ngoog.editor.TableCell.prototype.setColSpan = function(colSpan) {\n  if (colSpan != this.colSpan) {\n    if (colSpan > 1) {\n      this.element.colSpan = colSpan;\n    } else {\n      this.element.colSpan = 1, this.element.removeAttribute('colSpan');\n    }\n    this.colSpan = colSpan;\n    this.updateCoordinates_();\n  }\n};\n\n\n/**\n * Set this cell's rowSpan, updating both its rowSpan property and the\n * underlying element's rowSpan attribute.\n * @param {number} rowSpan The new rowSpan.\n */\ngoog.editor.TableCell.prototype.setRowSpan = function(rowSpan) {\n  if (rowSpan != this.rowSpan) {\n    if (rowSpan > 1) {\n      this.element.rowSpan = rowSpan.toString();\n    } else {\n      this.element.rowSpan = '1';\n      this.element.removeAttribute('rowSpan');\n    }\n    this.rowSpan = rowSpan;\n    this.updateCoordinates_();\n  }\n};\n\n\n/**\n * Optimum size of empty cells (in pixels), if possible.\n * @type {number}\n */\ngoog.editor.Table.OPTIMUM_EMPTY_CELL_WIDTH = 60;\n\n\n/**\n * Maximum width for new tables.\n * @type {number}\n */\ngoog.editor.Table.OPTIMUM_MAX_NEW_TABLE_WIDTH = 600;\n\n\n/**\n * Default color for table borders.\n * @type {string}\n */\ngoog.editor.Table.DEFAULT_BORDER_COLOR = '#888';\n\n\n/**\n * Creates a new table element, populated with cells and formatted.\n * @param {Document} doc Document in which to create the table element.\n * @param {number} columns Number of columns in the table.\n * @param {number} rows Number of rows in the table.\n * @param {Object=} opt_tableStyle Object containing borderWidth and borderColor\n *    properties, used to set the initial style of the table.\n * @return {!Element} a table element.\n */\ngoog.editor.Table.createDomTable = function(\n    doc, columns, rows, opt_tableStyle) {\n  // TODO(user): define formatting properties as constants,\n  // make separate formatTable() function\n  var style = {\n    borderWidth: '1',\n    borderColor: goog.editor.Table.DEFAULT_BORDER_COLOR\n  };\n  for (var prop in opt_tableStyle) {\n    style[prop] = opt_tableStyle[prop];\n  }\n  var dom = new goog.dom.DomHelper(doc);\n  var tableElement = dom.createTable(rows, columns, true);\n\n  var minimumCellWidth = 10;\n  // Calculate a good cell width.\n  var cellWidth = Math.max(\n      minimumCellWidth,\n      Math.min(\n          goog.editor.Table.OPTIMUM_EMPTY_CELL_WIDTH,\n          goog.editor.Table.OPTIMUM_MAX_NEW_TABLE_WIDTH / columns));\n\n  var tds = goog.dom.getElementsByTagName(goog.dom.TagName.TD, tableElement);\n  for (var i = 0, td; td = tds[i]; i++) {\n    td.style.width = cellWidth + 'px';\n  }\n\n  // Set border somewhat redundantly to make sure they show\n  // up correctly in all browsers.\n  goog.style.setStyle(tableElement, {\n    'borderCollapse': 'collapse',\n    'borderColor': style.borderColor,\n    'borderWidth': style.borderWidth + 'px'\n  });\n  tableElement.border = style.borderWidth;\n  tableElement.setAttribute('bordercolor', style.borderColor);\n  tableElement.setAttribute('cellspacing', '0');\n\n  return tableElement;\n};\n","^17",1579837703000,"^18",["^19",["^1S","^1T","~$goog.dom.DomHelper","^3G","^Z","^2J","^29","^32","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/table.js"],"^1J",["^19",["~$goog.editor.Table","~$goog.editor.TableCell","~$goog.editor.TableRow"]],"^X",true,"^Y",["^Z","^1S","^1T","^4X","^3G","^1V","^2J","^32","^29"]],["^ ","^[",[1579837703000],"^10","goog.testing.ui.style.js","^11",["^12","goog/testing/ui/style.js"],"^13","goog/testing/ui/style.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Tools for testing Closure renderers against static markup\n * spec pages.\n *\n */\n\ngoog.setTestOnly('goog.testing.ui.style');\ngoog.provide('goog.testing.ui.style');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.testing.asserts');\n\n\n/**\n * Uses document.write to add an iFrame to the page with the reference path in\n * the src attribute. Used for loading an html file containing reference\n * structures to test against into the page. Should be called within the body of\n * the jsunit test page.\n * @param {string} referencePath A path to a reference HTML file.\n */\ngoog.testing.ui.style.writeReferenceFrame = function(referencePath) {\n  document.write(\n      '<iframe id=\"reference\" name=\"reference\" ' +\n      'src=\"' + referencePath + '\"></iframe>');\n};\n\n\n/**\n * Returns a reference to the first element child of a node with the given id\n * from the page loaded into the reference iFrame. Used to retrieve a particular\n * reference DOM structure to test against.\n * @param {string} referenceId The id of a container element for a reference\n *   structure in the reference page.\n * @return {Node} The root element of the reference structure.\n */\ngoog.testing.ui.style.getReferenceNode = function(referenceId) {\n  return goog.dom.getFirstElementChild(\n      window.frames['reference'].document.getElementById(referenceId));\n};\n\n\n/**\n * Returns an array of all element children of a given node.\n * @param {Node} element The node to get element children of.\n * @return {!Array<!Node>} An array of all the element children.\n */\ngoog.testing.ui.style.getElementChildren = function(element) {\n  var first = goog.dom.getFirstElementChild(element);\n  if (!first) {\n    return [];\n  }\n  var children = [first], next;\n  while (next = goog.dom.getNextElementSibling(children[children.length - 1])) {\n    children.push(next);\n  }\n  return children;\n};\n\n\n/**\n * Tests whether a given node is a \"content\" node of a reference structure,\n * which means it is allowed to have arbitrary children.\n * @param {Node} element The node to test.\n * @return {boolean} Whether the given node is a content node or not.\n * @suppress {missingProperties} \"className\" not defined on Node\n */\ngoog.testing.ui.style.isContentNode = function(element) {\n  return element.className.indexOf('content') != -1;\n};\n\n\n/**\n * Tests that the structure, node names, and classes of the given element are\n * the same as the reference structure with the given id. Throws an error if the\n * element doesn't have the same nodes at each level of the DOM with the same\n * classes on each. The test ignores all DOM structure within content nodes.\n * @param {Node} element The root node of the DOM structure to test.\n * @param {string} referenceId The id of the container for the reference\n *   structure to test against.\n */\ngoog.testing.ui.style.assertStructureMatchesReference = function(\n    element, referenceId) {\n  goog.testing.ui.style.assertStructureMatchesReferenceInner_(\n      element, goog.testing.ui.style.getReferenceNode(referenceId));\n};\n\n\n/**\n * A recursive function for comparing structure, node names, and classes between\n * a test and reference DOM structure. Throws an error if one of these things\n * doesn't match. Used internally by\n * {@link goog.testing.ui.style.assertStructureMatchesReference}.\n * @param {Node} element DOM element to test.\n * @param {Node} reference DOM element to use as a reference (test against).\n * @private\n */\ngoog.testing.ui.style.assertStructureMatchesReferenceInner_ = function(\n    element, reference) {\n  if (!element && !reference) {\n    return;\n  }\n  assertTrue('Expected two elements.', !!element && !!reference);\n  assertEquals(\n      'Expected nodes to have the same nodeName.', element.nodeName,\n      reference.nodeName);\n  var testElem = goog.asserts.assertElement(element);\n  var refElem = goog.asserts.assertElement(reference);\n  var elementClasses = goog.dom.classlist.get(testElem);\n  goog.array.forEach(goog.dom.classlist.get(refElem), function(referenceClass) {\n    assertContains(\n        'Expected test node to have all reference classes.', referenceClass,\n        elementClasses);\n  });\n  // Call assertStructureMatchesReferenceInner_ on all element children\n  // unless this is a content node\n  var elChildren = goog.testing.ui.style.getElementChildren(element),\n      refChildren = goog.testing.ui.style.getElementChildren(reference);\n  if (!goog.testing.ui.style.isContentNode(reference)) {\n    if (elChildren.length != refChildren.length) {\n      assertEquals(\n          'Expected same number of children for a non-content node.',\n          elChildren.length, refChildren.length);\n    }\n    for (var i = 0; i < elChildren.length; i++) {\n      goog.testing.ui.style.assertStructureMatchesReferenceInner_(\n          elChildren[i], refChildren[i]);\n    }\n  }\n};\n","^17",1579837703000,"^18",["^19",["^1S","^1T","^2O","~$goog.testing.asserts","^Z","^35"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/ui/style.js"],"^1J",["^19",["~$goog.testing.ui.style"]],"^X",true,"^Y",["^Z","^35","^1S","^1T","^2O","^50"]],["^ ","^[",[1579837703000],"^2F",true,"^10","goog.streams.lite_impl.js","^11",["^12","goog/streams/lite_impl.js"],"^13","goog/streams/lite_impl.js","^14","^15","^16","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A lite polyfill of the ReadableStream native API with a subset\n * of methods supported.\n */\ngoog.module('goog.streams.liteImpl');\n\nconst NativeResolver = goog.require('goog.promise.NativeResolver');\nconst liteTypes = goog.require('goog.streams.liteTypes');\nconst {assert, assertFunction} = goog.require('goog.asserts');\n\n/**\n * The lite implementation of ReadableStream.\n *\n * Supports the getReader() method and locked property.\n *\n * The only method of underlying sources that is supported is enqueueing,\n * closing, and erroring.\n *\n * Pulling (including backpressure and sizes) and cancellation are not\n * supported.\n * @template T\n * @implements {liteTypes.ReadableStream<T>}\n */\nclass ReadableStream {\n  /** @package */\n  constructor() {\n    /** @package {!ReadableStream.State} */\n    this.state = ReadableStream.State.READABLE;\n\n    /**  @package {!ReadableStreamDefaultReader|undefined} */\n    this.reader = undefined;\n\n    /** @type {*} */\n    this.storedError = undefined;\n\n    /** @package {!ReadableStreamDefaultController} */\n    this.readableStreamController;\n  }\n\n  /**\n   * Returns true if the ReadableStream has been locked to a reader.\n   * https://streams.spec.whatwg.org/#rs-locked\n   * @return {boolean}\n   * @override\n   */\n  get locked() {\n    return this.reader !== undefined;\n  }\n\n  /**\n   * Returns a ReadableStreamDefaultReader that enables reading chunks from\n   * the source.\n   * https://streams.spec.whatwg.org/#rs-get-reader\n   * @return {!ReadableStreamDefaultReader<T>}\n   * @override\n   */\n  getReader() {\n    return this.reader = new ReadableStreamDefaultReader(this);\n  }\n\n  /**\n   * @return {!Promise<!IIterableResult<T>>}\n   * @package\n   */\n  addReadRequest() {\n    const request = new NativeResolver();\n    this.reader.readRequests.push(request);\n    return request.promise;\n  }\n\n  /** @package */\n  close() {\n    this.state = ReadableStream.State.CLOSED;\n    if (!this.reader) {\n      return;\n    }\n    for (const readRequest of this.reader.readRequests) {\n      readRequest.resolve({value: undefined, done: true});\n    }\n    this.reader.readRequests = [];\n    this.reader.closedResolver.resolve();\n  }\n\n  /**\n   * @param {*} e\n   * @package\n   */\n  error(e) {\n    this.state = ReadableStream.State.ERRORED;\n    this.storedError = e;\n    if (!this.reader) {\n      return;\n    }\n    for (const readRequest of this.reader.readRequests) {\n      readRequest.reject(e);\n    }\n    this.reader.readRequests = [];\n    this.reader.closedResolver.promise.catch(() => {});\n    this.reader.closedResolver.reject(e);\n  }\n\n  /**\n   * @param {T} chunk\n   * @param {boolean} done\n   * @package\n   */\n  fulfillReadRequest(chunk, done) {\n    const readRequest = assert(this.reader).readRequests.shift();\n    readRequest.resolve({value: chunk, done});\n  }\n\n  /**\n   * @return {number}\n   * @package\n   */\n  getNumReadRequests() {\n    return assert(this.reader).readRequests.length;\n  }\n\n  /**\n   * @return {boolean}\n   * @package\n   */\n  hasDefaultReader() {\n    return this.reader !== undefined;\n  }\n}\n\n/** @package @enum {number} */\nReadableStream.State = {\n  READABLE: 1,\n  CLOSED: 2,\n  ERRORED: 3,\n};\n\n/**\n * Creates and returns a new ReadableStream.\n *\n * The underlying source should only have a start() method, and no other\n * properties.\n * @param {!liteTypes.ReadableStreamUnderlyingSource<T>} underlyingSource\n * @return {!ReadableStream<T>}\n * @suppress {strictMissingProperties}\n * @template T\n */\nfunction newReadableStream(underlyingSource) {\n  assertFunction(\n      underlyingSource.start,\n      `'start' property must be a function on an underlying source for a ` +\n          'lite ReadableStream');\n  const verifyObject =\n      /** @type {!Object} */ (underlyingSource);\n  assert(\n      !(verifyObject.pull),\n      `'pull' property not allowed on an underlying source for a ` +\n          'lite ReadableStream');\n  assert(\n      !(verifyObject.cancel),\n      `'cancel' property not allowed on an underlying source for a ` +\n          'lite ReadableStream');\n  assert(\n      !(verifyObject.type),\n      `'type' property not allowed on an underlying source for a ` +\n          'lite ReadableStream');\n  assert(\n      !(verifyObject.autoAllocateChunkSize),\n      `'autoAllocateChunkSize' property not allowed on an underlying ` +\n          'source for a lite ReadableStream');\n  const startAlgorithm = (controller) => underlyingSource.start(controller);\n  const stream = new ReadableStream();\n  const controller = new ReadableStreamDefaultController(stream);\n  stream.readableStreamController = controller;\n  controller.start(startAlgorithm);\n  return stream;\n}\n\n/**\n * A reader for a lite ReadableStream.\n *\n * Supports the read() and releaseLock() methods, along with the closed\n * property.\n * @template T\n * @implements {liteTypes.ReadableStreamDefaultReader<T>}\n */\nclass ReadableStreamDefaultReader {\n  /**\n   * @param {!ReadableStream} stream\n   * @package\n   */\n  constructor(stream) {\n    if (stream.reader) {\n      throw new TypeError(\n          'ReadableStreamReader constructor can only accept readable streams ' +\n          'that are not yet locked to a reader');\n    }\n    /** @package {!ReadableStream|undefined} */\n    this.ownerReadableStream = stream;\n\n    /** @package {!NativeResolver<undefined>} */\n    this.closedResolver = new NativeResolver();\n\n    /** @package {!Array<!NativeResolver<!IIterableResult<T>>>} */\n    this.readRequests = [];\n\n    if (stream.state === ReadableStream.State.CLOSED) {\n      this.closedResolver.resolve();\n    } else if (stream.state === ReadableStream.State.ERRORED) {\n      this.closedResolver.promise.catch(() => {});\n      this.closedResolver.reject(stream.storedError);\n    }\n  }\n\n  /**\n   * Returns a Promise that resolves when the Stream closes or is errored, or if\n   * the reader releases its lock.\n   * https://streams.spec.whatwg.org/#default-reader-closed\n   * @return {!Promise<undefined>}\n   * @override\n   */\n  get closed() {\n    return this.closedResolver.promise;\n  }\n\n  /**\n   * Returns a Promise that resolves with an IIterableResult providing the next\n   * chunk or that the stream is closed. The Promise may reject if the stream\n   * is errored.\n   * https://streams.spec.whatwg.org/#default-reader-read\n   * @return {!Promise<!IIterableResult<T>>}\n   * @override\n   */\n  read() {\n    if (!this.ownerReadableStream) {\n      throw new TypeError(\n          'This readable stream reader has been released and cannot be used ' +\n          'to read from its previous owner stream');\n    }\n    return this.readInternal();\n  }\n\n  /**\n   * Release the lock on the stream. Any further calls to read() will error,\n   * and the stream can create another reader.\n   * https://streams.spec.whatwg.org/#default-reader-release-lock\n   * @return {void}\n   * @override\n   */\n  releaseLock() {\n    if (!this.ownerReadableStream) {\n      return;\n    }\n    if (this.readRequests.length) {\n      throw new TypeError(\n          'Cannot release a readable stream reader when it still has ' +\n          'outstanding read() calls that have not yet settled');\n    }\n    this.release();\n  }\n\n  /** @package */\n  release() {\n    const stream = assert(this.ownerReadableStream);\n    const e = new TypeError(\n        'This readable stream reader has been released and cannot be used ' +\n        `to monitor the stream's state`);\n    if (stream.state === ReadableStream.State.READABLE) {\n      this.closedResolver.promise.catch(() => {});\n      this.closedResolver.reject(e);\n    } else {\n      this.closedResolver = new NativeResolver();\n      this.closedResolver.promise.catch(() => {});\n      this.closedResolver.reject(e);\n    }\n    stream.reader = undefined;\n    this.ownerReadableStream = undefined;\n  }\n\n  /**\n   * @return {!Promise<!IIterableResult<T>>}\n   * @package\n   */\n  readInternal() {\n    const stream = assert(this.ownerReadableStream);\n    if (stream.state === ReadableStream.State.CLOSED) {\n      return Promise.resolve({value: undefined, done: true});\n    }\n    if (stream.state === ReadableStream.State.ERRORED) {\n      return Promise.reject(stream.storedError);\n    }\n    return stream.readableStreamController.pullSteps();\n  }\n}\n\n/**\n * A controller for a lite ReadableStream.\n *\n * Provides the enqueue(), error(), and close() methods.\n * @template T\n * @implements {liteTypes.ReadableStreamDefaultController<T>}\n */\nclass ReadableStreamDefaultController {\n  /**\n   * @param {!ReadableStream} stream\n   * @package\n   */\n  constructor(stream) {\n    /** @package @const {!ReadableStream} */\n    this.controlledReadableStream = stream;\n\n    /** @package @const {!Queue} */\n    this.queue = new Queue();\n\n    /** @package {boolean} */\n    this.closeRequested = false;\n  }\n\n  /**\n   * Signals that the ReadableStream should close. The ReadableStream will\n   * actually close once all of its chunks have been read.\n   * https://streams.spec.whatwg.org/#rs-default-controller-close\n   * @return {void}\n   * @override\n   */\n  close() {\n    if (!this.canCloseOrEnqueue()) {\n      throw new TypeError(\n          'Cannot close a readable stream that has already been requested to ' +\n          'be closed');\n    }\n    this.closeInternal();\n  }\n\n  /**\n   * Enqueues a new chunk into the stream that can be read.\n   * https://streams.spec.whatwg.org/#rs-default-controller-enqueue\n   * @param {T} chunk\n   * @override\n   */\n  enqueue(chunk) {\n    if (!this.canCloseOrEnqueue()) {\n      throw new TypeError(\n          'Cannot enqueue a readable stream that has already been requested ' +\n          'to be closed');\n    }\n    this.enqueueInternal(chunk);\n  }\n\n  /**\n   * Closes the stream with an error. Any future interactions with the\n   * controller will throw an error.\n   * https://streams.spec.whatwg.org/#rs-default-controller-error\n   * @param {*} e\n   * @override\n   */\n  error(e) {\n    this.errorInternal(e);\n  }\n\n  /**\n   * @param {function(!ReadableStreamDefaultController):\n   *     (!Promise<undefined>|undefined)} startAlgorithm\n   * @package\n   */\n  start(startAlgorithm) {\n    Promise.resolve(startAlgorithm(this))\n        .then(\n            () => {\n              this.started();\n            },\n            (e) => {\n              this.errorInternal(e);\n            });\n  }\n\n  /**\n   * @return {!Promise<!IIterableResult<T>>}\n   * @package\n   */\n  pullSteps() {\n    if (!this.queue.empty()) {\n      const chunk = this.dequeueFromQueue();\n      if (this.closeRequested && this.queue.empty()) {\n        this.clearAlgorithms();\n        this.controlledReadableStream.close();\n      } else {\n        this.callPullIfNeeded();\n      }\n      return Promise.resolve({value: chunk, done: false});\n    }\n    const promise = this.controlledReadableStream.addReadRequest();\n    this.callPullIfNeeded();\n    return promise;\n  }\n\n  /** @package */\n  started() {}\n\n  /** @package */\n  callPullIfNeeded() {}\n\n  /** @package */\n  clearAlgorithms() {}\n\n  /**\n   * @package\n   */\n  closeInternal() {\n    this.closeRequested = true;\n    if (this.queue.empty()) {\n      this.clearAlgorithms();\n      this.controlledReadableStream.close();\n    }\n  }\n\n  /**\n   * @param {T} chunk\n   * @package\n   */\n  enqueueInternal(chunk) {\n    if (this.controlledReadableStream.locked &&\n        this.controlledReadableStream.getNumReadRequests() > 0) {\n      this.controlledReadableStream.fulfillReadRequest(\n          chunk, /* done= */ false);\n      return;\n    }\n    this.enqueueIntoQueue(chunk);\n  }\n\n  /**\n   * @param {*} e\n   * @package\n   */\n  errorInternal(e) {\n    if (this.controlledReadableStream.state !== ReadableStream.State.READABLE) {\n      return;\n    }\n    this.resetQueue();\n    this.clearAlgorithms();\n    this.controlledReadableStream.error(e);\n  }\n\n  /**\n   * @return {boolean}\n   * @package\n   */\n  canCloseOrEnqueue() {\n    return !this.closeRequested &&\n        this.controlledReadableStream.state === ReadableStream.State.READABLE;\n  }\n\n  /**\n   * @param {T} chunk\n   * @protected\n   */\n  enqueueIntoQueue(chunk) {\n    this.queue.enqueueValue(chunk);\n  }\n\n  /**\n   * @return {T}\n   * @protected\n   */\n  dequeueFromQueue() {\n    return this.queue.dequeueValue();\n  }\n\n  /**\n   * @protected\n   */\n  resetQueue() {\n    this.queue.resetQueue();\n  }\n}\n\n/**\n * An internal Queue representation. This simple Queue just wraps an Array.\n * Other implementations may also have a size associated with each element.\n * @template T\n * @package\n */\nclass Queue {\n  constructor() {\n    /** @private {!Array<T>} */\n    this.queue_ = [];\n  }\n\n  /**\n   * @return {boolean}\n   */\n  empty() {\n    return this.queue_.length === 0;\n  }\n\n  /**\n   * @param {T} value\n   */\n  enqueueValue(value) {\n    this.queue_.push(value);\n  }\n\n  /**\n   * @return {T}\n   */\n  dequeueValue() {\n    return this.queue_.shift();\n  }\n\n  /**\n   * @return {void}\n   */\n  resetQueue() {\n    this.queue_ = [];\n  }\n}\n\nexports = {\n  Queue,\n  ReadableStream,\n  ReadableStreamDefaultController,\n  ReadableStreamDefaultReader,\n  newReadableStream,\n};\n","^17",1579837703000,"^18",["^19",["^1S","^Z","~$goog.streams.liteTypes","~$goog.promise.NativeResolver"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/streams/lite_impl.js"],"^1J",["^19",["~$goog.streams.liteImpl"]],"^X",true,"^Y",["^Z","^53","^52","^1S"]],["^ ","^[",[1579837703000],"^10","goog.math.path.js","^11",["^12","goog/math/path.js"],"^13","goog/math/path.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Represents a path used with a Graphics implementation.\n * @author arv@google.com (Erik Arvidsson)\n */\n\ngoog.provide('goog.math.Path');\ngoog.provide('goog.math.Path.Segment');\n\ngoog.require('goog.array');\ngoog.require('goog.math');\ngoog.require('goog.math.AffineTransform');\n\n\n\n/**\n * Creates a path object. A path is a sequence of segments and may be open or\n * closed. Path uses the EVEN-ODD fill rule for determining the interior of the\n * path. A path must start with a moveTo command.\n *\n * A \"simple\" path does not contain any arcs and may be transformed using\n * the `transform` method.\n *\n * @struct\n * @constructor\n * @final\n */\ngoog.math.Path = function() {\n  /**\n   * The segment types that constitute this path.\n   * @private {!Array<goog.math.Path.Segment>}\n   */\n  this.segments_ = [];\n\n  /**\n   * The number of repeated segments of the current type.\n   * @type {!Array<number>}\n   * @private\n   */\n  this.count_ = [];\n\n  /**\n   * The arguments corresponding to each of the segments.\n   * @type {!Array<number>}\n   * @private\n   */\n  this.arguments_ = [];\n\n  /**\n   * The coordinates of the point which closes the path (the point of the\n   * last moveTo command).\n   * @type {Array<number>?}\n   * @private\n   */\n  this.closePoint_ = null;\n\n  /**\n   * The coordinates most recently added to the end of the path.\n   * @type {Array<number>?}\n   * @private\n   */\n  this.currentPoint_ = null;\n\n  /**\n   * Flag for whether this is a simple path (contains no arc segments).\n   * @type {boolean}\n   * @private\n   */\n  this.simple_ = true;\n};\n\n\n/**\n * Path segment types.\n * @enum {number}\n */\ngoog.math.Path.Segment = {\n  MOVETO: 0,\n  LINETO: 1,\n  CURVETO: 2,\n  ARCTO: 3,\n  CLOSE: 4\n};\n\n\n/**\n * The number of points for each segment type.\n * @type {!Array<number>}\n * @private\n */\ngoog.math.Path.segmentArgCounts_ = (function() {\n  var counts = [];\n  counts[goog.math.Path.Segment.MOVETO] = 2;\n  counts[goog.math.Path.Segment.LINETO] = 2;\n  counts[goog.math.Path.Segment.CURVETO] = 6;\n  counts[goog.math.Path.Segment.ARCTO] = 6;\n  counts[goog.math.Path.Segment.CLOSE] = 0;\n  return counts;\n})();\n\n\n/**\n * Returns an array of the segment types in this path, in the order of their\n * appearance. Adjacent segments of the same type are collapsed into a single\n * entry in the array. The returned array is a copy; modifications are not\n * reflected in the Path object.\n * @return {!Array<number>}\n */\ngoog.math.Path.prototype.getSegmentTypes = function() {\n  return this.segments_.concat();\n};\n\n\n/**\n * Returns an array of the number of times each segment type repeats in this\n * path, in order. The returned array is a copy; modifications are not reflected\n * in the Path object.\n * @return {!Array<number>}\n */\ngoog.math.Path.prototype.getSegmentCounts = function() {\n  return this.count_.concat();\n};\n\n\n/**\n * Returns an array of all arguments for the segments of this path object, in\n * order. The returned array is a copy; modifications are not reflected in the\n * Path object.\n * @return {!Array<number>}\n */\ngoog.math.Path.prototype.getSegmentArgs = function() {\n  return this.arguments_.concat();\n};\n\n\n/**\n * Returns the number of points for a segment type.\n *\n * @param {number} segment The segment type.\n * @return {number} The number of points.\n */\ngoog.math.Path.getSegmentCount = function(segment) {\n  return goog.math.Path.segmentArgCounts_[segment];\n};\n\n\n/**\n * Appends another path to the end of this path.\n *\n * @param {!goog.math.Path} path The path to append.\n * @return {!goog.math.Path} This path.\n */\ngoog.math.Path.prototype.appendPath = function(path) {\n  if (path.currentPoint_) {\n    Array.prototype.push.apply(this.segments_, path.segments_);\n    Array.prototype.push.apply(this.count_, path.count_);\n    Array.prototype.push.apply(this.arguments_, path.arguments_);\n    this.currentPoint_ = path.currentPoint_.concat();\n    this.closePoint_ = path.closePoint_.concat();\n    this.simple_ = this.simple_ && path.simple_;\n  }\n  return this;\n};\n\n\n/**\n * Clears the path.\n *\n * @return {!goog.math.Path} The path itself.\n */\ngoog.math.Path.prototype.clear = function() {\n  this.segments_.length = 0;\n  this.count_.length = 0;\n  this.arguments_.length = 0;\n  this.closePoint_ = null;\n  this.currentPoint_ = null;\n  this.simple_ = true;\n  return this;\n};\n\n\n/**\n * Adds a point to the path by moving to the specified point. Repeated moveTo\n * commands are collapsed into a single moveTo.\n *\n * @param {number} x X coordinate of destination point.\n * @param {number} y Y coordinate of destination point.\n * @return {!goog.math.Path} The path itself.\n */\ngoog.math.Path.prototype.moveTo = function(x, y) {\n  if (goog.array.peek(this.segments_) == goog.math.Path.Segment.MOVETO) {\n    this.arguments_.length -= 2;\n  } else {\n    this.segments_.push(goog.math.Path.Segment.MOVETO);\n    this.count_.push(1);\n  }\n  this.arguments_.push(x, y);\n  this.currentPoint_ = this.closePoint_ = [x, y];\n  return this;\n};\n\n\n/**\n * Adds points to the path by drawing a straight line to each point.\n *\n * @param {...number} var_args The coordinates of each destination point as x, y\n *     value pairs.\n * @return {!goog.math.Path} The path itself.\n */\ngoog.math.Path.prototype.lineTo = function(var_args) {\n  return this.lineTo_(arguments);\n};\n\n\n/**\n * Adds points to the path by drawing a straight line to each point.\n *\n * @param {!Array<number>} coordinates The coordinates of each\n *     destination point as x, y value pairs.\n * @return {!goog.math.Path} The path itself.\n */\ngoog.math.Path.prototype.lineToFromArray = function(coordinates) {\n  return this.lineTo_(coordinates);\n};\n\n\n/**\n * Adds points to the path by drawing a straight line to each point.\n *\n * @param {!Array<number>|Arguments} coordinates The coordinates of each\n *     destination point as x, y value pairs.\n * @return {!goog.math.Path} The path itself.\n * @private\n */\ngoog.math.Path.prototype.lineTo_ = function(coordinates) {\n  var lastSegment = goog.array.peek(this.segments_);\n  if (lastSegment == null) {\n    throw new Error('Path cannot start with lineTo');\n  }\n  if (lastSegment != goog.math.Path.Segment.LINETO) {\n    this.segments_.push(goog.math.Path.Segment.LINETO);\n    this.count_.push(0);\n  }\n  for (var i = 0; i < coordinates.length; i += 2) {\n    var x = coordinates[i];\n    var y = coordinates[i + 1];\n    this.arguments_.push(x, y);\n  }\n  this.count_[this.count_.length - 1] += i / 2;\n  this.currentPoint_ = [x, y];\n  return this;\n};\n\n\n/**\n * Adds points to the path by drawing cubic Bezier curves. Each curve is\n * specified using 3 points (6 coordinates) - two control points and the end\n * point of the curve.\n *\n * @param {...number} var_args The coordinates specifying each curve in sets of\n *     6 points: {@code [x1, y1]} the first control point, {@code [x2, y2]} the\n *     second control point and {@code [x, y]} the end point.\n * @return {!goog.math.Path} The path itself.\n */\ngoog.math.Path.prototype.curveTo = function(var_args) {\n  return this.curveTo_(arguments);\n};\n\n\n/**\n * Adds points to the path by drawing cubic Bezier curves. Each curve is\n * specified using 3 points (6 coordinates) - two control points and the end\n * point of the curve.\n *\n * @param {!Array<number>} coordinates The coordinates specifying\n *     each curve in sets of 6 points: {@code [x1, y1]} the first control point,\n *     {@code [x2, y2]} the second control point and {@code [x, y]} the end\n *     point.\n * @return {!goog.math.Path} The path itself.\n */\ngoog.math.Path.prototype.curveToFromArray = function(coordinates) {\n  return this.curveTo_(coordinates);\n};\n\n\n/**\n * Adds points to the path by drawing cubic Bezier curves. Each curve is\n * specified using 3 points (6 coordinates) - two control points and the end\n * point of the curve.\n *\n * @param {!Array<number>|Arguments} coordinates The coordinates specifying\n *     each curve in sets of 6 points: {@code [x1, y1]} the first control point,\n *     {@code [x2, y2]} the second control point and {@code [x, y]} the end\n *     point.\n * @return {!goog.math.Path} The path itself.\n * @private\n */\ngoog.math.Path.prototype.curveTo_ = function(coordinates) {\n  var lastSegment = goog.array.peek(this.segments_);\n  if (lastSegment == null) {\n    throw new Error('Path cannot start with curve');\n  }\n  if (lastSegment != goog.math.Path.Segment.CURVETO) {\n    this.segments_.push(goog.math.Path.Segment.CURVETO);\n    this.count_.push(0);\n  }\n  for (var i = 0; i < coordinates.length; i += 6) {\n    var x = coordinates[i + 4];\n    var y = coordinates[i + 5];\n    this.arguments_.push(\n        coordinates[i], coordinates[i + 1], coordinates[i + 2],\n        coordinates[i + 3], x, y);\n  }\n  this.count_[this.count_.length - 1] += i / 6;\n  this.currentPoint_ = [x, y];\n  return this;\n};\n\n\n/**\n * Adds a path command to close the path by connecting the\n * last point to the first point.\n *\n * @return {!goog.math.Path} The path itself.\n */\ngoog.math.Path.prototype.close = function() {\n  var lastSegment = goog.array.peek(this.segments_);\n  if (lastSegment == null) {\n    throw new Error('Path cannot start with close');\n  }\n  if (lastSegment != goog.math.Path.Segment.CLOSE) {\n    this.segments_.push(goog.math.Path.Segment.CLOSE);\n    this.count_.push(1);\n    this.currentPoint_ = this.closePoint_;\n  }\n  return this;\n};\n\n\n/**\n * Adds a path command to draw an arc centered at the point {@code (cx, cy)}\n * with radius `rx` along the x-axis and `ry` along the y-axis from\n * `startAngle` through `extent` degrees. Positive rotation is in\n * the direction from positive x-axis to positive y-axis.\n *\n * @param {number} cx X coordinate of center of ellipse.\n * @param {number} cy Y coordinate of center of ellipse.\n * @param {number} rx Radius of ellipse on x axis.\n * @param {number} ry Radius of ellipse on y axis.\n * @param {number} fromAngle Starting angle measured in degrees from the\n *     positive x-axis.\n * @param {number} extent The span of the arc in degrees.\n * @param {boolean} connect If true, the starting point of the arc is connected\n *     to the current point.\n * @return {!goog.math.Path} The path itself.\n * @deprecated Use `arcTo` or `arcToAsCurves` instead.\n */\ngoog.math.Path.prototype.arc = function(\n    cx, cy, rx, ry, fromAngle, extent, connect) {\n  var startX = cx + goog.math.angleDx(fromAngle, rx);\n  var startY = cy + goog.math.angleDy(fromAngle, ry);\n  if (connect) {\n    if (!this.currentPoint_ || startX != this.currentPoint_[0] ||\n        startY != this.currentPoint_[1]) {\n      this.lineTo(startX, startY);\n    }\n  } else {\n    this.moveTo(startX, startY);\n  }\n  return this.arcTo(rx, ry, fromAngle, extent);\n};\n\n\n/**\n * Adds a path command to draw an arc starting at the path's current point,\n * with radius `rx` along the x-axis and `ry` along the y-axis from\n * `startAngle` through `extent` degrees. Positive rotation is in\n * the direction from positive x-axis to positive y-axis.\n *\n * This method makes the path non-simple.\n *\n * @param {number} rx Radius of ellipse on x axis.\n * @param {number} ry Radius of ellipse on y axis.\n * @param {number} fromAngle Starting angle measured in degrees from the\n *     positive x-axis.\n * @param {number} extent The span of the arc in degrees.\n * @return {!goog.math.Path} The path itself.\n */\ngoog.math.Path.prototype.arcTo = function(rx, ry, fromAngle, extent) {\n  var cx = this.currentPoint_[0] - goog.math.angleDx(fromAngle, rx);\n  var cy = this.currentPoint_[1] - goog.math.angleDy(fromAngle, ry);\n  var ex = cx + goog.math.angleDx(fromAngle + extent, rx);\n  var ey = cy + goog.math.angleDy(fromAngle + extent, ry);\n  this.segments_.push(goog.math.Path.Segment.ARCTO);\n  this.count_.push(1);\n  this.arguments_.push(rx, ry, fromAngle, extent, ex, ey);\n  this.simple_ = false;\n  this.currentPoint_ = [ex, ey];\n  return this;\n};\n\n\n/**\n * Same as `arcTo`, but approximates the arc using bezier curves.\n.* As a result, this method does not affect the simplified status of this path.\n * The algorithm is adapted from `java.awt.geom.ArcIterator`.\n *\n * @param {number} rx Radius of ellipse on x axis.\n * @param {number} ry Radius of ellipse on y axis.\n * @param {number} fromAngle Starting angle measured in degrees from the\n *     positive x-axis.\n * @param {number} extent The span of the arc in degrees.\n * @return {!goog.math.Path} The path itself.\n */\ngoog.math.Path.prototype.arcToAsCurves = function(rx, ry, fromAngle, extent) {\n  var cx = this.currentPoint_[0] - goog.math.angleDx(fromAngle, rx);\n  var cy = this.currentPoint_[1] - goog.math.angleDy(fromAngle, ry);\n  var extentRad = goog.math.toRadians(extent);\n  var arcSegs = Math.ceil(Math.abs(extentRad) / Math.PI * 2);\n  var inc = extentRad / arcSegs;\n  var angle = goog.math.toRadians(fromAngle);\n  for (var j = 0; j < arcSegs; j++) {\n    var relX = Math.cos(angle);\n    var relY = Math.sin(angle);\n    var z = 4 / 3 * Math.sin(inc / 2) / (1 + Math.cos(inc / 2));\n    var c0 = cx + (relX - z * relY) * rx;\n    var c1 = cy + (relY + z * relX) * ry;\n    angle += inc;\n    relX = Math.cos(angle);\n    relY = Math.sin(angle);\n    this.curveTo(\n        c0, c1, cx + (relX + z * relY) * rx, cy + (relY - z * relX) * ry,\n        cx + relX * rx, cy + relY * ry);\n  }\n  return this;\n};\n\n\n/**\n * Iterates over the path calling the supplied callback once for each path\n * segment. The arguments to the callback function are the segment type and\n * an array of its arguments.\n *\n * The `LINETO` and `CURVETO` arrays can contain multiple\n * segments of the same type. The number of segments is the length of the\n * array divided by the segment length (2 for lines, 6 for  curves).\n *\n * As a convenience the `ARCTO` segment also includes the end point as the\n * last two arguments: {@code rx, ry, fromAngle, extent, x, y}.\n *\n * @param {function(!goog.math.Path.Segment, !Array<number>)} callback\n *     The function to call with each path segment.\n */\ngoog.math.Path.prototype.forEachSegment = function(callback) {\n  var points = this.arguments_;\n  var index = 0;\n  for (var i = 0, length = this.segments_.length; i < length; i++) {\n    var seg = this.segments_[i];\n    var n = goog.math.Path.segmentArgCounts_[seg] * this.count_[i];\n    callback(seg, points.slice(index, index + n));\n    index += n;\n  }\n};\n\n\n/**\n * Returns the coordinates most recently added to the end of the path.\n *\n * @return {Array<number>?} An array containing the ending coordinates of the\n *     path of the form {@code [x, y]}.\n */\ngoog.math.Path.prototype.getCurrentPoint = function() {\n  return this.currentPoint_ && this.currentPoint_.concat();\n};\n\n\n/**\n * @return {!goog.math.Path} A copy of this path.\n */\ngoog.math.Path.prototype.clone = function() {\n  var path = new goog.math.Path();\n  path.segments_ = this.segments_.concat();\n  path.count_ = this.count_.concat();\n  path.arguments_ = this.arguments_.concat();\n  path.closePoint_ = this.closePoint_ && this.closePoint_.concat();\n  path.currentPoint_ = this.currentPoint_ && this.currentPoint_.concat();\n  path.simple_ = this.simple_;\n  return path;\n};\n\n\n/**\n * Returns true if this path contains no arcs. Simplified paths can be\n * created using `createSimplifiedPath`.\n *\n * @return {boolean} True if the path contains no arcs.\n */\ngoog.math.Path.prototype.isSimple = function() {\n  return this.simple_;\n};\n\n\n/**\n * A map from segment type to the path function to call to simplify a path.\n * @private {!Object<goog.math.Path.Segment, function(this: goog.math.Path)>}\n */\ngoog.math.Path.simplifySegmentMap_ = (function() {\n  var map = {};\n  map[goog.math.Path.Segment.MOVETO] = goog.math.Path.prototype.moveTo;\n  map[goog.math.Path.Segment.LINETO] = goog.math.Path.prototype.lineTo;\n  map[goog.math.Path.Segment.CLOSE] = goog.math.Path.prototype.close;\n  map[goog.math.Path.Segment.CURVETO] = goog.math.Path.prototype.curveTo;\n  map[goog.math.Path.Segment.ARCTO] = goog.math.Path.prototype.arcToAsCurves;\n  return map;\n})();\n\n\n/**\n * Creates a copy of the given path, replacing `arcTo` with\n * `arcToAsCurves`. The resulting path is simplified and can\n * be transformed.\n *\n * @param {!goog.math.Path} src The path to simplify.\n * @return {!goog.math.Path} A new simplified path.\n */\ngoog.math.Path.createSimplifiedPath = function(src) {\n  if (src.isSimple()) {\n    return src.clone();\n  }\n  var path = new goog.math.Path();\n  src.forEachSegment(function(segment, args) {\n    goog.math.Path.simplifySegmentMap_[segment].apply(path, args);\n  });\n  return path;\n};\n\n\n// TODO(chrisn): Delete this method\n/**\n * Creates a transformed copy of this path. The path is simplified\n * {@see #createSimplifiedPath} prior to transformation.\n *\n * @param {!goog.math.AffineTransform} tx The transformation to perform.\n * @return {!goog.math.Path} A new, transformed path.\n */\ngoog.math.Path.prototype.createTransformedPath = function(tx) {\n  var path = goog.math.Path.createSimplifiedPath(this);\n  path.transform(tx);\n  return path;\n};\n\n\n/**\n * Transforms the path. Only simple paths are transformable. Attempting\n * to transform a non-simple path will throw an error.\n *\n * @param {!goog.math.AffineTransform} tx The transformation to perform.\n * @return {!goog.math.Path} The path itself.\n */\ngoog.math.Path.prototype.transform = function(tx) {\n  if (!this.isSimple()) {\n    throw new Error('Non-simple path');\n  }\n  tx.transform(\n      this.arguments_, 0, this.arguments_, 0, this.arguments_.length / 2);\n  if (this.closePoint_) {\n    tx.transform(this.closePoint_, 0, this.closePoint_, 0, 1);\n  }\n  if (this.currentPoint_ && this.closePoint_ != this.currentPoint_) {\n    tx.transform(this.currentPoint_, 0, this.currentPoint_, 0, 1);\n  }\n  return this;\n};\n\n\n/**\n * @return {boolean} Whether the path is empty.\n */\ngoog.math.Path.prototype.isEmpty = function() {\n  return this.segments_.length == 0;\n};\n","^17",1579837703000,"^18",["^19",["^Z","~$goog.math.AffineTransform","^3>","^35"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/path.js"],"^1J",["^19",["~$goog.math.Path.Segment","~$goog.math.Path"]],"^X",true,"^Y",["^Z","^35","^3>","^55"]],["^ ","^[",[1579837703000],"^10","goog.dom.vendor.js","^11",["^12","goog/dom/vendor.js"],"^13","goog/dom/vendor.js","^14","^15","^16","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Vendor prefix getters.\n */\n\ngoog.provide('goog.dom.vendor');\n\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n/**\n * Returns the JS vendor prefix used in CSS properties. Different vendors\n * use different methods of changing the case of the property names.\n *\n * @return {?string} The JS vendor prefix or null if there is none.\n */\ngoog.dom.vendor.getVendorJsPrefix = function() {\n  if (goog.userAgent.WEBKIT) {\n    return 'Webkit';\n  } else if (goog.userAgent.GECKO) {\n    return 'Moz';\n  } else if (goog.userAgent.IE) {\n    return 'ms';\n  } else if (goog.userAgent.OPERA) {\n    return 'O';\n  }\n\n  return null;\n};\n\n\n/**\n * Returns the vendor prefix used in CSS properties.\n *\n * @return {?string} The vendor prefix or null if there is none.\n */\ngoog.dom.vendor.getVendorPrefix = function() {\n  if (goog.userAgent.WEBKIT) {\n    return '-webkit';\n  } else if (goog.userAgent.GECKO) {\n    return '-moz';\n  } else if (goog.userAgent.IE) {\n    return '-ms';\n  } else if (goog.userAgent.OPERA) {\n    return '-o';\n  }\n\n  return null;\n};\n\n\n/**\n * @param {string} propertyName A property name.\n * @param {!Object=} opt_object If provided, we verify if the property exists in\n *     the object.\n * @return {?string} A vendor prefixed property name, or null if it does not\n *     exist.\n */\ngoog.dom.vendor.getPrefixedPropertyName = function(propertyName, opt_object) {\n  // We first check for a non-prefixed property, if available.\n  if (opt_object && propertyName in opt_object) {\n    return propertyName;\n  }\n  var prefix = goog.dom.vendor.getVendorJsPrefix();\n  if (prefix) {\n    prefix = prefix.toLowerCase();\n    var prefixedPropertyName = prefix + goog.string.toTitleCase(propertyName);\n    return (opt_object === undefined || prefixedPropertyName in opt_object) ?\n        prefixedPropertyName :\n        null;\n  }\n  return null;\n};\n\n\n/**\n * @param {string} eventType An event type.\n * @return {string} A lower-cased vendor prefixed event type.\n */\ngoog.dom.vendor.getPrefixedEventType = function(eventType) {\n  var prefix = goog.dom.vendor.getVendorJsPrefix() || '';\n  return (prefix + eventType).toLowerCase();\n};\n","^17",1579837703000,"^18",["^19",["^2D","^Z","^2X"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/vendor.js"],"^1J",["^19",["^3J"]],"^X",true,"^Y",["^Z","^2D","^2X"]],["^ ","^[",[1579837703000],"^10","goog.positioning.viewportposition.js","^11",["^12","goog/positioning/viewportposition.js"],"^13","goog/positioning/viewportposition.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Client positioning class.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.positioning.ViewportPosition');\n\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.positioning');\ngoog.require('goog.positioning.AbstractPosition');\ngoog.require('goog.positioning.Corner');\ngoog.require('goog.style');\n\n\n\n/**\n * Encapsulates a popup position where the popup is positioned according to\n * coordinates relative to the  element's viewport (page). This calculates the\n * correct position to use even if the element is relatively positioned to some\n * other element.\n *\n * @param {number|goog.math.Coordinate} arg1 Left position or coordinate.\n * @param {number=} opt_arg2 Top position.\n * @constructor\n * @extends {goog.positioning.AbstractPosition}\n */\ngoog.positioning.ViewportPosition = function(arg1, opt_arg2) {\n  this.coordinate = arg1 instanceof goog.math.Coordinate ?\n      arg1 :\n      new goog.math.Coordinate(/** @type {number} */ (arg1), opt_arg2);\n};\ngoog.inherits(\n    goog.positioning.ViewportPosition, goog.positioning.AbstractPosition);\n\n\n/**\n * Repositions the popup according to the current state\n *\n * @param {Element} element The DOM element of the popup.\n * @param {goog.positioning.Corner} popupCorner The corner of the popup\n *     element that that should be positioned adjacent to the anchorElement.\n * @param {goog.math.Box=} opt_margin A margin specified in pixels.\n * @param {goog.math.Size=} opt_preferredSize Preferred size of the element.\n * @override\n */\ngoog.positioning.ViewportPosition.prototype.reposition = function(\n    element, popupCorner, opt_margin, opt_preferredSize) {\n  goog.positioning.positionAtAnchor(\n      goog.style.getClientViewportElement(element),\n      goog.positioning.Corner.TOP_LEFT, element, popupCorner, this.coordinate,\n      opt_margin, null, opt_preferredSize);\n};\n","^17",1579837703000,"^18",["^19",["~$goog.positioning.Corner","~$goog.positioning","^Z","~$goog.positioning.AbstractPosition","^26","^29"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/positioning/viewportposition.js"],"^1J",["^19",["~$goog.positioning.ViewportPosition"]],"^X",true,"^Y",["^Z","^26","^59","^5:","^58","^29"]],["^ ","^[",[1579837703000],"^10","goog.structs.map.js","^11",["^12","goog/structs/map.js"],"^13","goog/structs/map.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Datastructure: Hash Map.\n *\n * @author arv@google.com (Erik Arvidsson)\n *\n * This file contains an implementation of a Map structure. It implements a lot\n * of the methods used in goog.structs so those functions work on hashes. This\n * is best suited for complex key types. For simple keys such as numbers and\n * strings consider using the lighter-weight utilities in goog.object.\n */\n\n\ngoog.provide('goog.structs.Map');\n\ngoog.require('goog.iter.Iterator');\ngoog.require('goog.iter.StopIteration');\n\n\n\n/**\n * Class for Hash Map datastructure.\n * @param {*=} opt_map Map or Object to initialize the map with.\n * @param {...*} var_args If 2 or more arguments are present then they\n *     will be used as key-value pairs.\n * @constructor\n * @template K, V\n * @deprecated This type is misleading: use ES6 Map instead.\n */\ngoog.structs.Map = function(opt_map, var_args) {\n\n  /**\n   * Underlying JS object used to implement the map.\n   * @private {!Object}\n   */\n  this.map_ = {};\n\n  /**\n   * An array of keys. This is necessary for two reasons:\n   *   1. Iterating the keys using for (var key in this.map_) allocates an\n   *      object for every key in IE which is really bad for IE6 GC perf.\n   *   2. Without a side data structure, we would need to escape all the keys\n   *      as that would be the only way we could tell during iteration if the\n   *      key was an internal key or a property of the object.\n   *\n   * This array can contain deleted keys so it's necessary to check the map\n   * as well to see if the key is still in the map (this doesn't require a\n   * memory allocation in IE).\n   * @private {!Array<string>}\n   */\n  this.keys_ = [];\n\n  /**\n   * The number of key value pairs in the map.\n   * @private {number}\n   */\n  this.count_ = 0;\n\n  /**\n   * Version used to detect changes while iterating.\n   * @private {number}\n   */\n  this.version_ = 0;\n\n  var argLength = arguments.length;\n\n  if (argLength > 1) {\n    if (argLength % 2) {\n      throw new Error('Uneven number of arguments');\n    }\n    for (var i = 0; i < argLength; i += 2) {\n      this.set(arguments[i], arguments[i + 1]);\n    }\n  } else if (opt_map) {\n    this.addAll(/** @type {!Object} */ (opt_map));\n  }\n};\n\n\n/**\n * @return {number} The number of key-value pairs in the map.\n */\ngoog.structs.Map.prototype.getCount = function() {\n  return this.count_;\n};\n\n\n/**\n * Returns the values of the map.\n * @return {!Array<V>} The values in the map.\n */\ngoog.structs.Map.prototype.getValues = function() {\n  this.cleanupKeysArray_();\n\n  var rv = [];\n  for (var i = 0; i < this.keys_.length; i++) {\n    var key = this.keys_[i];\n    rv.push(this.map_[key]);\n  }\n  return rv;\n};\n\n\n/**\n * Returns the keys of the map.\n * @return {!Array<string>} Array of string values.\n */\ngoog.structs.Map.prototype.getKeys = function() {\n  this.cleanupKeysArray_();\n  return /** @type {!Array<string>} */ (this.keys_.concat());\n};\n\n\n/**\n * Whether the map contains the given key.\n * @param {*} key The key to check for.\n * @return {boolean} Whether the map contains the key.\n */\ngoog.structs.Map.prototype.containsKey = function(key) {\n  return goog.structs.Map.hasKey_(this.map_, key);\n};\n\n\n/**\n * Whether the map contains the given value. This is O(n).\n * @param {V} val The value to check for.\n * @return {boolean} Whether the map contains the value.\n */\ngoog.structs.Map.prototype.containsValue = function(val) {\n  for (var i = 0; i < this.keys_.length; i++) {\n    var key = this.keys_[i];\n    if (goog.structs.Map.hasKey_(this.map_, key) && this.map_[key] == val) {\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Whether this map is equal to the argument map.\n * @param {goog.structs.Map} otherMap The map against which to test equality.\n * @param {function(V, V): boolean=} opt_equalityFn Optional equality function\n *     to test equality of values. If not specified, this will test whether\n *     the values contained in each map are identical objects.\n * @return {boolean} Whether the maps are equal.\n */\ngoog.structs.Map.prototype.equals = function(otherMap, opt_equalityFn) {\n  if (this === otherMap) {\n    return true;\n  }\n\n  if (this.count_ != otherMap.getCount()) {\n    return false;\n  }\n\n  var equalityFn = opt_equalityFn || goog.structs.Map.defaultEquals;\n\n  this.cleanupKeysArray_();\n  for (var key, i = 0; key = this.keys_[i]; i++) {\n    if (!equalityFn(this.get(key), otherMap.get(key))) {\n      return false;\n    }\n  }\n\n  return true;\n};\n\n\n/**\n * Default equality test for values.\n * @param {*} a The first value.\n * @param {*} b The second value.\n * @return {boolean} Whether a and b reference the same object.\n */\ngoog.structs.Map.defaultEquals = function(a, b) {\n  return a === b;\n};\n\n\n/**\n * @return {boolean} Whether the map is empty.\n */\ngoog.structs.Map.prototype.isEmpty = function() {\n  return this.count_ == 0;\n};\n\n\n/**\n * Removes all key-value pairs from the map.\n */\ngoog.structs.Map.prototype.clear = function() {\n  this.map_ = {};\n  this.keys_.length = 0;\n  this.count_ = 0;\n  this.version_ = 0;\n};\n\n\n/**\n * Removes a key-value pair based on the key. This is O(logN) amortized due to\n * updating the keys array whenever the count becomes half the size of the keys\n * in the keys array.\n * @param {*} key  The key to remove.\n * @return {boolean} Whether object was removed.\n */\ngoog.structs.Map.prototype.remove = function(key) {\n  if (goog.structs.Map.hasKey_(this.map_, key)) {\n    delete this.map_[key];\n    this.count_--;\n    this.version_++;\n\n    // clean up the keys array if the threshold is hit\n    if (this.keys_.length > 2 * this.count_) {\n      this.cleanupKeysArray_();\n    }\n\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Cleans up the temp keys array by removing entries that are no longer in the\n * map.\n * @private\n */\ngoog.structs.Map.prototype.cleanupKeysArray_ = function() {\n  if (this.count_ != this.keys_.length) {\n    // First remove keys that are no longer in the map.\n    var srcIndex = 0;\n    var destIndex = 0;\n    while (srcIndex < this.keys_.length) {\n      var key = this.keys_[srcIndex];\n      if (goog.structs.Map.hasKey_(this.map_, key)) {\n        this.keys_[destIndex++] = key;\n      }\n      srcIndex++;\n    }\n    this.keys_.length = destIndex;\n  }\n\n  if (this.count_ != this.keys_.length) {\n    // If the count still isn't correct, that means we have duplicates. This can\n    // happen when the same key is added and removed multiple times. Now we have\n    // to allocate one extra Object to remove the duplicates. This could have\n    // been done in the first pass, but in the common case, we can avoid\n    // allocating an extra object by only doing this when necessary.\n    var seen = {};\n    var srcIndex = 0;\n    var destIndex = 0;\n    while (srcIndex < this.keys_.length) {\n      var key = this.keys_[srcIndex];\n      if (!(goog.structs.Map.hasKey_(seen, key))) {\n        this.keys_[destIndex++] = key;\n        seen[key] = 1;\n      }\n      srcIndex++;\n    }\n    this.keys_.length = destIndex;\n  }\n};\n\n\n/**\n * Returns the value for the given key.  If the key is not found and the default\n * value is not given this will return `undefined`.\n * @param {*} key The key to get the value for.\n * @param {DEFAULT=} opt_val The value to return if no item is found for the\n *     given key, defaults to undefined.\n * @return {V|DEFAULT} The value for the given key.\n * @template DEFAULT\n */\ngoog.structs.Map.prototype.get = function(key, opt_val) {\n  if (goog.structs.Map.hasKey_(this.map_, key)) {\n    return this.map_[key];\n  }\n  return opt_val;\n};\n\n\n/**\n * Adds a key-value pair to the map.\n * @param {*} key The key.\n * @param {V} value The value to add.\n * @return {*} Some subclasses return a value.\n */\ngoog.structs.Map.prototype.set = function(key, value) {\n  if (!(goog.structs.Map.hasKey_(this.map_, key))) {\n    this.count_++;\n    // TODO(johnlenz): This class lies, it claims to return an array of string\n    // keys, but instead returns the original object used.\n    this.keys_.push(/** @type {?} */ (key));\n    // Only change the version if we add a new key.\n    this.version_++;\n  }\n  this.map_[key] = value;\n};\n\n\n/**\n * Adds multiple key-value pairs from another goog.structs.Map or Object.\n * @param {?Object} map Object containing the data to add.\n */\ngoog.structs.Map.prototype.addAll = function(map) {\n  if (map instanceof goog.structs.Map) {\n    var keys = map.getKeys();\n    for (var i = 0; i < keys.length; i++) {\n      this.set(keys[i], map.get(keys[i]));\n    }\n  } else {\n    for (var key in map) {\n      this.set(key, map[key]);\n    }\n  }\n};\n\n\n/**\n * Calls the given function on each entry in the map.\n * @param {function(this:T, V, K, goog.structs.Map<K,V>)} f\n * @param {T=} opt_obj The value of \"this\" inside f.\n * @template T\n */\ngoog.structs.Map.prototype.forEach = function(f, opt_obj) {\n  var keys = this.getKeys();\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    var value = this.get(key);\n    f.call(opt_obj, value, key, this);\n  }\n};\n\n\n/**\n * Clones a map and returns a new map.\n * @return {!goog.structs.Map} A new map with the same key-value pairs.\n */\ngoog.structs.Map.prototype.clone = function() {\n  return new goog.structs.Map(this);\n};\n\n\n/**\n * Returns a new map in which all the keys and values are interchanged\n * (keys become values and values become keys). If multiple keys map to the\n * same value, the chosen transposed value is implementation-dependent.\n *\n * It acts very similarly to {goog.object.transpose(Object)}.\n *\n * @return {!goog.structs.Map} The transposed map.\n */\ngoog.structs.Map.prototype.transpose = function() {\n  var transposed = new goog.structs.Map();\n  for (var i = 0; i < this.keys_.length; i++) {\n    var key = this.keys_[i];\n    var value = this.map_[key];\n    transposed.set(value, key);\n  }\n\n  return transposed;\n};\n\n\n/**\n * @return {!Object} Object representation of the map.\n */\ngoog.structs.Map.prototype.toObject = function() {\n  this.cleanupKeysArray_();\n  var obj = {};\n  for (var i = 0; i < this.keys_.length; i++) {\n    var key = this.keys_[i];\n    obj[key] = this.map_[key];\n  }\n  return obj;\n};\n\n\n/**\n * Returns an iterator that iterates over the keys in the map.  Removal of keys\n * while iterating might have undesired side effects.\n * @return {!goog.iter.Iterator} An iterator over the keys in the map.\n */\ngoog.structs.Map.prototype.getKeyIterator = function() {\n  return this.__iterator__(true);\n};\n\n\n/**\n * Returns an iterator that iterates over the values in the map.  Removal of\n * keys while iterating might have undesired side effects.\n * @return {!goog.iter.Iterator} An iterator over the values in the map.\n */\ngoog.structs.Map.prototype.getValueIterator = function() {\n  return this.__iterator__(false);\n};\n\n\n/**\n * Returns an iterator that iterates over the values or the keys in the map.\n * This throws an exception if the map was mutated since the iterator was\n * created.\n * @param {boolean=} opt_keys True to iterate over the keys. False to iterate\n *     over the values.  The default value is false.\n * @return {!goog.iter.Iterator} An iterator over the values or keys in the map.\n */\ngoog.structs.Map.prototype.__iterator__ = function(opt_keys) {\n  // Clean up keys to minimize the risk of iterating over dead keys.\n  this.cleanupKeysArray_();\n\n  var i = 0;\n  var version = this.version_;\n  var selfObj = this;\n\n  var newIter = new goog.iter.Iterator;\n  newIter.next = function() {\n    if (version != selfObj.version_) {\n      throw new Error('The map has changed since the iterator was created');\n    }\n    if (i >= selfObj.keys_.length) {\n      throw goog.iter.StopIteration;\n    }\n    var key = selfObj.keys_[i++];\n    return opt_keys ? key : selfObj.map_[key];\n  };\n  return newIter;\n};\n\n\n/**\n * Safe way to test for hasOwnProperty.  It even allows testing for\n * 'hasOwnProperty'.\n * @param {!Object} obj The object to test for presence of the given key.\n * @param {*} key The key to check for.\n * @return {boolean} Whether the object has the key.\n * @private\n */\ngoog.structs.Map.hasKey_ = function(obj, key) {\n  return Object.prototype.hasOwnProperty.call(obj, key);\n};\n","^17",1579837703000,"^18",["^19",["^Z","~$goog.iter.StopIteration","~$goog.iter.Iterator"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/map.js"],"^1J",["^19",["~$goog.structs.Map"]],"^X",true,"^Y",["^Z","^5=","^5<"]],["^ ","^[",[1579837703000],"^10","goog.ui.select.js","^11",["^12","goog/ui/select.js"],"^13","goog/ui/select.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A class that supports single selection from a dropdown menu,\n * with semantics similar to the native HTML <code>&lt;select&gt;</code>\n * element.\n *\n * @author attila@google.com (Attila Bodis)\n * @see ../demos/select.html\n */\n\ngoog.provide('goog.ui.Select');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.array');\ngoog.require('goog.events.EventType');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.IdGenerator');\ngoog.require('goog.ui.MenuButton');\ngoog.require('goog.ui.MenuItem');\ngoog.require('goog.ui.MenuRenderer');\ngoog.require('goog.ui.SelectionModel');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * A selection control.  Extends {@link goog.ui.MenuButton} by composing a\n * menu with a selection model, and automatically updating the button's caption\n * based on the current selection.\n *\n * Select fires the following events:\n *   CHANGE - after selection changes.\n *\n * @param {goog.ui.ControlContent=} opt_caption Default caption or existing DOM\n *     structure to display as the button's caption when nothing is selected.\n *     Defaults to no caption.\n * @param {goog.ui.Menu=} opt_menu Menu containing selection options.\n * @param {goog.ui.ButtonRenderer=} opt_renderer Renderer used to render or\n *     decorate the control; defaults to {@link goog.ui.MenuButtonRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @param {!goog.ui.MenuRenderer=} opt_menuRenderer Renderer used to render or\n *     decorate the menu; defaults to {@link goog.ui.MenuRenderer}.\n * @constructor\n * @extends {goog.ui.MenuButton}\n */\ngoog.ui.Select = function(\n    opt_caption, opt_menu, opt_renderer, opt_domHelper, opt_menuRenderer) {\n  goog.ui.Select.base(\n      this, 'constructor', opt_caption, opt_menu, opt_renderer, opt_domHelper,\n      opt_menuRenderer ||\n          new goog.ui.MenuRenderer(goog.a11y.aria.Role.LISTBOX));\n  /**\n   * Default caption to show when no option is selected.\n   * @private {goog.ui.ControlContent}\n   */\n  this.defaultCaption_ = this.getContent();\n\n  /**\n   * The initial value of the aria label of the content element. This will be\n   * null until the caption is first populated and will be non-null thereafter.\n   * @private {?string}\n   */\n  this.initialAriaLabel_ = null;\n\n  this.setPreferredAriaRole(goog.a11y.aria.Role.LISTBOX);\n};\ngoog.inherits(goog.ui.Select, goog.ui.MenuButton);\ngoog.tagUnsealableClass(goog.ui.Select);\n\n\n/**\n * The selection model controlling the items in the menu.\n * @type {?goog.ui.SelectionModel}\n * @private\n */\ngoog.ui.Select.prototype.selectionModel_ = null;\n\n\n/** @override */\ngoog.ui.Select.prototype.enterDocument = function() {\n  goog.ui.Select.superClass_.enterDocument.call(this);\n  this.updateCaption();\n  this.listenToSelectionModelEvents_();\n};\n\n\n/**\n * Decorates the given element with this control.  Overrides the superclass\n * implementation by initializing the default caption on the select button.\n * @param {Element} element Element to decorate.\n * @override\n */\ngoog.ui.Select.prototype.decorateInternal = function(element) {\n  goog.ui.Select.superClass_.decorateInternal.call(this, element);\n  var caption = this.getCaption();\n  if (caption) {\n    // Initialize the default caption.\n    this.setDefaultCaption(caption);\n  } else if (!this.getSelectedItem()) {\n    // If there is no default caption and no selected item, select the first\n    // option (this is technically an arbitrary choice, but what most people\n    // would expect to happen).\n    this.setSelectedIndex(0);\n  }\n};\n\n\n/** @override */\ngoog.ui.Select.prototype.disposeInternal = function() {\n  goog.ui.Select.superClass_.disposeInternal.call(this);\n\n  if (this.selectionModel_) {\n    this.selectionModel_.dispose();\n    this.selectionModel_ = null;\n  }\n\n  this.defaultCaption_ = null;\n};\n\n\n/**\n * Handles {@link goog.ui.Component.EventType.ACTION} events dispatched by\n * the menu item clicked by the user.  Updates the selection model, calls\n * the superclass implementation to hide the menu, stops the propagation of\n * the event, and dispatches an ACTION event on behalf of the select control\n * itself.  Overrides {@link goog.ui.MenuButton#handleMenuAction}.\n * @param {goog.events.Event} e Action event to handle.\n * @override\n */\ngoog.ui.Select.prototype.handleMenuAction = function(e) {\n  this.setSelectedItem(/** @type {goog.ui.MenuItem} */ (e.target));\n  goog.ui.Select.base(this, 'handleMenuAction', e);\n\n  // NOTE(chrishenry): We should not stop propagation and then fire\n  // our own ACTION event. Fixing this without breaking anyone\n  // relying on this event is hard though.\n  e.stopPropagation();\n  this.dispatchEvent(goog.ui.Component.EventType.ACTION);\n};\n\n\n/**\n * Handles {@link goog.events.EventType.SELECT} events raised by the\n * selection model when the selection changes.  Updates the contents of the\n * select button.\n * @param {goog.events.Event} e Selection event to handle.\n */\ngoog.ui.Select.prototype.handleSelectionChange = function(e) {\n  var item = this.getSelectedItem();\n  goog.ui.Select.superClass_.setValue.call(this, item && item.getValue());\n  this.updateCaption();\n};\n\n\n/**\n * Replaces the menu currently attached to the control (if any) with the given\n * argument, and updates the selection model.  Does nothing if the new menu is\n * the same as the old one.  Overrides {@link goog.ui.MenuButton#setMenu}.\n * @param {goog.ui.Menu} menu New menu to be attached to the menu button.\n * @return {goog.ui.Menu|undefined} Previous menu (undefined if none).\n * @override\n */\ngoog.ui.Select.prototype.setMenu = function(menu) {\n  // Call superclass implementation to replace the menu.\n  var oldMenu = goog.ui.Select.superClass_.setMenu.call(this, menu);\n\n  // Do nothing unless the new menu is different from the current one.\n  if (menu != oldMenu) {\n    // Clear the old selection model (if any).\n    if (this.selectionModel_) {\n      this.selectionModel_.clear();\n    }\n\n    // Initialize new selection model (unless the new menu is null).\n    if (menu) {\n      if (this.selectionModel_) {\n        menu.forEachChild(function(child, index) {\n          this.setCorrectAriaRole_(\n              /** @type {goog.ui.MenuItem|goog.ui.MenuSeparator} */ (child));\n          this.selectionModel_.addItem(child);\n        }, this);\n      } else {\n        this.createSelectionModel_(menu);\n      }\n    }\n  }\n\n  return oldMenu;\n};\n\n\n/**\n * Returns the default caption to be shown when no option is selected.\n * @return {goog.ui.ControlContent} Default caption.\n */\ngoog.ui.Select.prototype.getDefaultCaption = function() {\n  return this.defaultCaption_;\n};\n\n\n/**\n * Sets the default caption to the given string or DOM structure.\n * @param {goog.ui.ControlContent} caption Default caption to be shown\n *    when no option is selected.\n */\ngoog.ui.Select.prototype.setDefaultCaption = function(caption) {\n  this.defaultCaption_ = caption;\n  this.updateCaption();\n};\n\n\n/**\n * Adds a new menu item at the end of the menu.\n * @param {goog.ui.Control} item Menu item to add to the menu.\n * @override\n */\ngoog.ui.Select.prototype.addItem = function(item) {\n  this.setCorrectAriaRole_(\n      /** @type {goog.ui.MenuItem|goog.ui.MenuSeparator} */ (item));\n  goog.ui.Select.superClass_.addItem.call(this, item);\n\n  if (this.selectionModel_) {\n    this.selectionModel_.addItem(item);\n  } else {\n    this.createSelectionModel_(this.getMenu());\n  }\n  this.updateAriaActiveDescendant_();\n};\n\n\n/**\n * Adds a new menu item at a specific index in the menu.\n * @param {goog.ui.MenuItem|goog.ui.MenuSeparator} item Menu item to add to the\n *     menu.\n * @param {number} index Index at which to insert the menu item.\n * @override\n */\ngoog.ui.Select.prototype.addItemAt = function(item, index) {\n  this.setCorrectAriaRole_(\n      /** @type {goog.ui.MenuItem|goog.ui.MenuSeparator} */ (item));\n  goog.ui.Select.superClass_.addItemAt.call(this, item, index);\n\n  if (this.selectionModel_) {\n    this.selectionModel_.addItemAt(item, index);\n  } else {\n    this.createSelectionModel_(this.getMenu());\n  }\n};\n\n\n/**\n * Removes an item from the menu and disposes it.\n * @param {goog.ui.MenuItem|goog.ui.MenuSeparator} item The menu item to remove.\n * @override\n */\ngoog.ui.Select.prototype.removeItem = function(item) {\n  goog.ui.Select.superClass_.removeItem.call(this, item);\n  if (this.selectionModel_) {\n    this.selectionModel_.removeItem(item);\n  }\n};\n\n\n/**\n * Removes a menu item at a given index in the menu and disposes it.\n * @param {number} index Index of item.\n * @override\n */\ngoog.ui.Select.prototype.removeItemAt = function(index) {\n  goog.ui.Select.superClass_.removeItemAt.call(this, index);\n  if (this.selectionModel_) {\n    this.selectionModel_.removeItemAt(index);\n  }\n};\n\n\n/**\n * Selects the specified option (assumed to be in the select menu), and\n * deselects the previously selected option, if any.  A null argument clears\n * the selection.\n * @param {goog.ui.MenuItem} item Option to be selected (null to clear\n *     the selection).\n */\ngoog.ui.Select.prototype.setSelectedItem = function(item) {\n  if (this.selectionModel_) {\n    var prevItem = this.getSelectedItem();\n    this.selectionModel_.setSelectedItem(item);\n\n    if (item != prevItem) {\n      this.dispatchEvent(goog.ui.Component.EventType.CHANGE);\n    }\n  }\n};\n\n\n/**\n * Selects the option at the specified index, or clears the selection if the\n * index is out of bounds.\n * @param {number} index Index of the option to be selected.\n */\ngoog.ui.Select.prototype.setSelectedIndex = function(index) {\n  if (this.selectionModel_) {\n    this.setSelectedItem(/** @type {goog.ui.MenuItem} */\n        (this.selectionModel_.getItemAt(index)));\n  }\n};\n\n\n/**\n * Selects the first option found with an associated value equal to the\n * argument, or clears the selection if no such option is found.  A null\n * argument also clears the selection.  Overrides {@link\n * goog.ui.Button#setValue}.\n * @param {*} value Value of the option to be selected (null to clear\n *     the selection).\n * @override\n */\ngoog.ui.Select.prototype.setValue = function(value) {\n  if (value != null && this.selectionModel_) {\n    for (var i = 0, item; item = this.selectionModel_.getItemAt(i); i++) {\n      if (item && typeof item.getValue == 'function' &&\n          item.getValue() == value) {\n        this.setSelectedItem(/** @type {!goog.ui.MenuItem} */ (item));\n        return;\n      }\n    }\n  }\n\n  this.setSelectedItem(null);\n};\n\n\n/**\n * Gets the value associated with the currently selected option (null if none).\n *\n * Note that unlike {@link goog.ui.Button#getValue} which this method overrides,\n * the \"value\" of a Select instance is the value of its selected menu item, not\n * its own value. This makes a difference because the \"value\" of a Button is\n * reset to the value of the element it decorates when it's added to the DOM\n * (via ButtonRenderer), whereas the value of the selected item is unaffected.\n * So while setValue() has no effect on a Button before it is added to the DOM,\n * it will make a persistent change to a Select instance (which is consistent\n * with any changes made by {@link goog.ui.Select#setSelectedItem} and\n * {@link goog.ui.Select#setSelectedIndex}).\n *\n * @override\n */\ngoog.ui.Select.prototype.getValue = function() {\n  var selectedItem = this.getSelectedItem();\n  return selectedItem ? selectedItem.getValue() : null;\n};\n\n\n/**\n * Returns the currently selected option.\n * @return {goog.ui.MenuItem} The currently selected option (null if none).\n */\ngoog.ui.Select.prototype.getSelectedItem = function() {\n  return this.selectionModel_ ?\n      /** @type {goog.ui.MenuItem} */ (this.selectionModel_.getSelectedItem()) :\n                                      null;\n};\n\n\n/**\n * Returns the index of the currently selected option.\n * @return {number} 0-based index of the currently selected option (-1 if none).\n */\ngoog.ui.Select.prototype.getSelectedIndex = function() {\n  return this.selectionModel_ ? this.selectionModel_.getSelectedIndex() : -1;\n};\n\n\n/**\n * @return {goog.ui.SelectionModel} The selection model.\n * @protected\n */\ngoog.ui.Select.prototype.getSelectionModel = function() {\n  return this.selectionModel_;\n};\n\n\n/**\n * Creates a new selection model and sets up an event listener to handle\n * {@link goog.events.EventType.SELECT} events dispatched by it.\n * @param {goog.ui.Component=} opt_component If provided, will add the\n *     component's children as items to the selection model.\n * @private\n */\ngoog.ui.Select.prototype.createSelectionModel_ = function(opt_component) {\n  this.selectionModel_ = new goog.ui.SelectionModel();\n  if (opt_component) {\n    opt_component.forEachChild(function(child, index) {\n      this.setCorrectAriaRole_(\n          /** @type {goog.ui.MenuItem|goog.ui.MenuSeparator} */ (child));\n      this.selectionModel_.addItem(child);\n    }, this);\n  }\n  this.listenToSelectionModelEvents_();\n};\n\n\n/**\n * Subscribes to events dispatched by the selection model.\n * @private\n */\ngoog.ui.Select.prototype.listenToSelectionModelEvents_ = function() {\n  if (this.selectionModel_) {\n    this.getHandler().listen(\n        this.selectionModel_, goog.events.EventType.SELECT,\n        this.handleSelectionChange);\n  }\n};\n\n\n/**\n * Updates the caption to be shown in the select button.  If no option is\n * selected and a default caption is set, sets the caption to the default\n * caption; otherwise to the empty string.\n * @protected\n */\ngoog.ui.Select.prototype.updateCaption = function() {\n  var item = this.getSelectedItem();\n  this.setContent(item ? item.getCaption() : this.defaultCaption_);\n\n  var contentElement = this.getRenderer().getContentElement(this.getElement());\n  // Despite the ControlRenderer interface indicating the return value is\n  // {Element}, many renderers cast element.firstChild to {Element} when it is\n  // really {Node}. Checking tagName verifies this is an {!Element}.\n  if (contentElement && this.getDomHelper().isElement(contentElement)) {\n    if (this.initialAriaLabel_ == null) {\n      this.initialAriaLabel_ = goog.a11y.aria.getLabel(contentElement);\n    }\n    var itemElement = item ? item.getElement() : null;\n    goog.a11y.aria.setLabel(\n        contentElement, itemElement ? goog.a11y.aria.getLabel(itemElement) :\n                                      this.initialAriaLabel_);\n    this.updateAriaActiveDescendant_();\n  }\n};\n\n\n/**\n * Updates the aria active descendant attribute.\n * @private\n */\ngoog.ui.Select.prototype.updateAriaActiveDescendant_ = function() {\n  var renderer = this.getRenderer();\n  if (renderer) {\n    var contentElement = renderer.getContentElement(this.getElement());\n    if (contentElement) {\n      var buttonElement = this.getElementStrict();\n      if (!contentElement.id) {\n        contentElement.id = goog.ui.IdGenerator.getInstance().getNextUniqueId();\n      }\n      goog.a11y.aria.setRole(contentElement, goog.a11y.aria.Role.OPTION);\n      goog.a11y.aria.setState(\n          buttonElement, goog.a11y.aria.State.ACTIVEDESCENDANT,\n          contentElement.id);\n      if (this.selectionModel_) {\n        // We can't use selectionmodel's getItemCount here because we need to\n        // skip separators.\n        var items = this.selectionModel_.getItems();\n        goog.a11y.aria.setState(\n            contentElement, goog.a11y.aria.State.SETSIZE,\n            this.getNumMenuItems_(items));\n        // Set a human-readable selection index, excluding menu separators.\n        var index = this.selectionModel_.getSelectedIndex();\n        goog.a11y.aria.setState(\n            contentElement, goog.a11y.aria.State.POSINSET, index >= 0 ?\n                this.getNumMenuItems_(goog.array.slice(items, 0, index + 1)) :\n                0);\n      }\n    }\n  }\n};\n\n\n/**\n * Gets the number of menu items in the array.\n * @param {!Array<?Object>} items The items.\n * @return {number}\n * @private\n */\ngoog.ui.Select.prototype.getNumMenuItems_ = function(items) {\n  return goog.array.count(\n      items, function(item) { return item instanceof goog.ui.MenuItem; });\n};\n\n\n/**\n * Sets the correct ARIA role for the menu item or separator.\n * @param {goog.ui.MenuItem|goog.ui.MenuSeparator} item The item to set.\n * @private\n */\ngoog.ui.Select.prototype.setCorrectAriaRole_ = function(item) {\n  item.setPreferredAriaRole(\n      item instanceof goog.ui.MenuItem ? goog.a11y.aria.Role.OPTION :\n                                         goog.a11y.aria.Role.SEPARATOR);\n};\n\n\n/**\n * Opens or closes the menu.  Overrides {@link goog.ui.MenuButton#setOpen} by\n * highlighting the currently selected option on open.\n * @param {boolean} open Whether to open or close the menu.\n * @param {goog.events.Event=} opt_e Mousedown event that caused the menu to\n *     be opened.\n * @override\n */\ngoog.ui.Select.prototype.setOpen = function(open, opt_e) {\n  goog.ui.Select.superClass_.setOpen.call(this, open, opt_e);\n\n  if (this.isOpen()) {\n    this.getMenu().setHighlightedIndex(this.getSelectedIndex());\n  } else {\n    this.updateAriaActiveDescendant_();\n  }\n};\n\n\n// Register a decorator factory function for goog.ui.Selects.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.getCssName('goog-select'), function() {\n      // Select defaults to using MenuButtonRenderer, since it shares its L&F.\n      return new goog.ui.Select(null);\n    });\n","^17",1579837703000,"^18",["^19",["^2P","^22","^3@","^2U","^Z","^3A","~$goog.ui.MenuRenderer","^2Z","~$goog.a11y.aria.State","~$goog.ui.MenuItem","~$goog.ui.IdGenerator","~$goog.ui.SelectionModel","^35"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/select.js"],"^1J",["^19",["~$goog.ui.Select"]],"^X",true,"^Y",["^Z","^2P","^2U","^5@","^35","^2Z","^22","^5B","^3@","^5A","^5?","^5C","^3A"]],["^ ","^[",[1579837703000],"^10","goog.ui.richtextspellchecker.js","^11",["^12","goog/ui/richtextspellchecker.js"],"^13","goog/ui/richtextspellchecker.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Rich text spell checker implementation.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/richtextspellchecker.html\n */\n\ngoog.provide('goog.ui.RichTextSpellChecker');\n\ngoog.require('goog.Timer');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.Range');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.events.KeyHandler');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.spell.SpellCheck');\ngoog.require('goog.string.StringBuffer');\ngoog.require('goog.style');\ngoog.require('goog.ui.AbstractSpellChecker');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.PopupMenu');\n\n\n\n/**\n * Rich text spell checker implementation.\n *\n * @param {goog.spell.SpellCheck} handler Instance of the SpellCheckHandler\n *     support object to use. A single instance can be shared by multiple editor\n *     components.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.AbstractSpellChecker}\n */\ngoog.ui.RichTextSpellChecker = function(handler, opt_domHelper) {\n  goog.ui.AbstractSpellChecker.call(this, handler, opt_domHelper);\n\n  /**\n   * String buffer for use in reassembly of the original text.\n   * @type {goog.string.StringBuffer}\n   * @private\n   */\n  this.workBuffer_ = new goog.string.StringBuffer();\n\n  /**\n   * Bound async function (to avoid rebinding it on every call).\n   * @type {Function}\n   * @private\n   */\n  this.boundContinueAsyncFn_ = goog.bind(this.continueAsync_, this);\n\n  /**\n   * Event handler for listening to events without leaking.\n   * @private {!goog.events.EventHandler}\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n  this.registerDisposable(this.eventHandler_);\n\n  /**\n   * The object handling keyboard events.\n   * @private {!goog.events.KeyHandler}\n   */\n  this.keyHandler_ = new goog.events.KeyHandler();\n  this.registerDisposable(this.keyHandler_);\n};\ngoog.inherits(goog.ui.RichTextSpellChecker, goog.ui.AbstractSpellChecker);\ngoog.tagUnsealableClass(goog.ui.RichTextSpellChecker);\n\n\n/**\n * Root node for rich editor.\n * @type {Node}\n * @private\n */\ngoog.ui.RichTextSpellChecker.prototype.rootNode_;\n\n\n/**\n * Indicates whether the root node for the rich editor is an iframe.\n * @private {boolean}\n */\ngoog.ui.RichTextSpellChecker.prototype.rootNodeIframe_ = false;\n\n\n/**\n * Current node where spell checker has interrupted to go to the next stack\n * frame.\n * @type {Node}\n * @private\n */\ngoog.ui.RichTextSpellChecker.prototype.currentNode_;\n\n\n/**\n * Counter of inserted elements. Used in processing loop to attempt to preserve\n * existing nodes if they contain no misspellings.\n * @type {number}\n * @private\n */\ngoog.ui.RichTextSpellChecker.prototype.elementsInserted_ = 0;\n\n\n/**\n * Number of words to scan to precharge the dictionary.\n * @type {number}\n * @private\n */\ngoog.ui.RichTextSpellChecker.prototype.dictionaryPreScanSize_ = 1000;\n\n\n/**\n * Class name for word spans.\n * @type {string}\n */\ngoog.ui.RichTextSpellChecker.prototype.wordClassName =\n    goog.getCssName('goog-spellcheck-word');\n\n\n/**\n * DomHelper to be used for interacting with the editable document/element.\n *\n * @type {goog.dom.DomHelper|undefined}\n * @private\n */\ngoog.ui.RichTextSpellChecker.prototype.editorDom_;\n\n\n/**\n * Tag name portion of the marker for the text that does not need to be checked\n * for spelling.\n *\n * @type {Array<string|undefined>}\n */\ngoog.ui.RichTextSpellChecker.prototype.excludeTags;\n\n\n/**\n * CSS Style text for invalid words. As it's set inside the rich edit iframe\n * classes defined in the parent document are not available, thus the style is\n * set inline.\n * @type {string}\n */\ngoog.ui.RichTextSpellChecker.prototype.invalidWordCssText =\n    'background: yellow;';\n\n\n/**\n * Creates the initial DOM representation for the component.\n *\n * @throws {Error} Not supported. Use decorate.\n * @see #decorate\n * @override\n */\ngoog.ui.RichTextSpellChecker.prototype.createDom = function() {\n  throw new Error('Render not supported for goog.ui.RichTextSpellChecker.');\n};\n\n\n/**\n * Decorates the element for the UI component.\n * @param {Element} element Element to decorate.\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.RichTextSpellChecker.prototype.decorateInternal = function(element) {\n  this.setElementInternal(element);\n  this.rootNodeIframe_ = element.contentDocument || element.contentWindow;\n  if (this.rootNodeIframe_) {\n    var doc = element.contentDocument || element.contentWindow.document;\n    this.rootNode_ = doc.body;\n    this.editorDom_ = goog.dom.getDomHelper(doc);\n  } else {\n    this.rootNode_ = element;\n    this.editorDom_ = goog.dom.getDomHelper(element);\n  }\n};\n\n\n/** @override */\ngoog.ui.RichTextSpellChecker.prototype.enterDocument = function() {\n  goog.ui.RichTextSpellChecker.superClass_.enterDocument.call(this);\n\n  var rootElement = goog.asserts.assertElement(\n      this.rootNode_,\n      'The rootNode_ of a richtextspellchecker must be an Element.');\n  this.keyHandler_.attach(rootElement);\n\n  this.initSuggestionsMenu();\n};\n\n\n/** @override */\ngoog.ui.RichTextSpellChecker.prototype.initSuggestionsMenu = function() {\n  goog.ui.RichTextSpellChecker.base(this, 'initSuggestionsMenu');\n\n  var menu = goog.asserts.assertInstanceof(\n      this.getMenu(), goog.ui.PopupMenu,\n      'The menu of a richtextspellchecker must be a PopupMenu.');\n  this.eventHandler_.listen(\n      menu, goog.ui.Component.EventType.HIDE, this.onCorrectionHide_);\n};\n\n\n/**\n * Checks spelling for all text and displays correction UI.\n * @override\n */\ngoog.ui.RichTextSpellChecker.prototype.check = function() {\n  this.blockReadyEvents();\n  this.preChargeDictionary_(this.rootNode_, this.dictionaryPreScanSize_);\n  this.unblockReadyEvents();\n\n  this.eventHandler_.listen(\n      this.spellCheck, goog.spell.SpellCheck.EventType.READY,\n      this.onDictionaryCharged_, true);\n  this.spellCheck.processPending();\n};\n\n\n/**\n * Processes nodes recursively.\n *\n * @param {Node} node Node to start with.\n * @param {number} words Max number of words to process.\n * @private\n */\ngoog.ui.RichTextSpellChecker.prototype.preChargeDictionary_ = function(\n    node, words) {\n  while (node) {\n    var next = this.nextNode_(node);\n    if (this.isExcluded_(node)) {\n      node = next;\n      continue;\n    }\n    if (node.nodeType == goog.dom.NodeType.TEXT) {\n      if (node.nodeValue) {\n        words -= this.populateDictionary(node.nodeValue, words);\n        if (words <= 0) {\n          return;\n        }\n      }\n    } else if (node.nodeType == goog.dom.NodeType.ELEMENT) {\n      if (node.firstChild) {\n        next = node.firstChild;\n      }\n    }\n    node = next;\n  }\n};\n\n\n/**\n * Starts actual processing after the dictionary is charged.\n * @param {goog.events.Event} e goog.spell.SpellCheck.EventType.READY event.\n * @private\n */\ngoog.ui.RichTextSpellChecker.prototype.onDictionaryCharged_ = function(e) {\n  e.stopPropagation();\n  this.eventHandler_.unlisten(\n      this.spellCheck, goog.spell.SpellCheck.EventType.READY,\n      this.onDictionaryCharged_, true);\n\n  // Now actually do the spell checking.\n  this.clearWordElements();\n  this.initializeAsyncMode();\n  this.elementsInserted_ = 0;\n  var result = this.processNode_(this.rootNode_);\n  if (result == goog.ui.AbstractSpellChecker.AsyncResult.PENDING) {\n    goog.Timer.callOnce(this.boundContinueAsyncFn_);\n    return;\n  }\n  this.finishAsyncProcessing();\n  this.finishCheck_();\n};\n\n\n/**\n * Continues asynchrnonous spell checking.\n * @private\n */\ngoog.ui.RichTextSpellChecker.prototype.continueAsync_ = function() {\n  var result = this.continueAsyncProcessing();\n  if (result == goog.ui.AbstractSpellChecker.AsyncResult.PENDING) {\n    goog.Timer.callOnce(this.boundContinueAsyncFn_);\n    return;\n  }\n  result = this.processNode_(this.currentNode_);\n  if (result == goog.ui.AbstractSpellChecker.AsyncResult.PENDING) {\n    goog.Timer.callOnce(this.boundContinueAsyncFn_);\n    return;\n  }\n  this.finishAsyncProcessing();\n  this.finishCheck_();\n};\n\n\n/**\n * Finalizes spelling check.\n * @private\n */\ngoog.ui.RichTextSpellChecker.prototype.finishCheck_ = function() {\n  delete this.currentNode_;\n  this.spellCheck.processPending();\n\n  if (!this.isVisible()) {\n    this.eventHandler_\n        .listen(this.rootNode_, goog.events.EventType.CLICK, this.onWordClick_)\n        .listen(\n            this.keyHandler_, goog.events.KeyHandler.EventType.KEY,\n            this.handleRootNodeKeyEvent);\n  }\n  goog.ui.RichTextSpellChecker.superClass_.check.call(this);\n};\n\n\n/**\n * Finds next node in our enumeration of the tree.\n *\n * @param {Node} node The node to which we're computing the next node for.\n * @return {Node} The next node or null if none was found.\n * @private\n */\ngoog.ui.RichTextSpellChecker.prototype.nextNode_ = function(node) {\n  while (node != this.rootNode_) {\n    if (node.nextSibling) {\n      return node.nextSibling;\n    }\n    node = node.parentNode;\n  }\n  return null;\n};\n\n\n/**\n * Determines if the node is text node without any children.\n *\n * @param {Node} node The node to check.\n * @return {boolean} Whether the node is a text leaf node.\n * @private\n */\ngoog.ui.RichTextSpellChecker.prototype.isTextLeaf_ = function(node) {\n  return node != null && node.nodeType == goog.dom.NodeType.TEXT &&\n      !node.firstChild;\n};\n\n\n/** @override */\ngoog.ui.RichTextSpellChecker.prototype.setExcludeMarker = function(marker) {\n  if (marker) {\n    if (typeof marker == 'string') {\n      marker = [marker];\n    }\n\n    this.excludeTags = [];\n    this.excludeMarker = [];\n    for (var i = 0; i < marker.length; i++) {\n      var parts = marker[i].split('.');\n      if (parts.length == 2) {\n        this.excludeTags.push(parts[0]);\n        this.excludeMarker.push(parts[1]);\n      } else {\n        this.excludeMarker.push(parts[0]);\n        this.excludeTags.push(undefined);\n      }\n    }\n  }\n};\n\n\n/**\n * Determines if the node is excluded from checking.\n * @param {Node} node The node to check.\n * @return {boolean} Whether the node is excluded.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.RichTextSpellChecker.prototype.isExcluded_ = function(node) {\n  if (this.excludeMarker && node.className) {\n    for (var i = 0; i < this.excludeMarker.length; i++) {\n      var excludeTag = this.excludeTags[i];\n      var excludeClass = this.excludeMarker[i];\n      var isExcluded =\n          !!(excludeClass && node.className.indexOf(excludeClass) != -1 &&\n             (!excludeTag || node.tagName == excludeTag));\n      if (isExcluded) {\n        return true;\n      }\n    }\n  }\n  return false;\n};\n\n\n/**\n * Processes nodes recursively.\n * @param {Node} node Node where to start.\n * @return {goog.ui.AbstractSpellChecker.AsyncResult|undefined} Result code.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.RichTextSpellChecker.prototype.processNode_ = function(node) {\n  delete this.currentNode_;\n  while (node) {\n    var next = this.nextNode_(node);\n    if (this.isExcluded_(node)) {\n      node = next;\n      continue;\n    }\n    if (node.nodeType == goog.dom.NodeType.TEXT) {\n      var deleteNode = true;\n      if (node.nodeValue) {\n        var currentElements = this.elementsInserted_;\n        var result = this.processTextAsync(node, node.nodeValue);\n        if (result == goog.ui.AbstractSpellChecker.AsyncResult.PENDING) {\n          // This marks node for deletion (empty nodes get deleted couple\n          // of lines down this function). This is so our algorithm terminates.\n          // In this case the node may be needlessly recreated, but it\n          // happens rather infrequently and saves a lot of code.\n          node.nodeValue = '';\n          this.currentNode_ = node;\n          return result;\n        }\n        // If we did not add nodes in processing, the current element is still\n        // valid. Let's preserve it!\n        if (currentElements == this.elementsInserted_) {\n          deleteNode = false;\n        }\n      }\n      if (deleteNode) {\n        goog.dom.removeNode(node);\n      }\n    } else if (node.nodeType == goog.dom.NodeType.ELEMENT) {\n      // If this is a spell checker element...\n      if (node.className == this.wordClassName) {\n        // First, reconsolidate the text nodes inside the element - editing\n        // in IE splits them up.\n        var runner = node.firstChild;\n        while (runner) {\n          if (this.isTextLeaf_(runner)) {\n            while (this.isTextLeaf_(runner.nextSibling)) {\n              // Yes, this is not super efficient in IE, but it will almost\n              // never happen.\n              runner.nodeValue += runner.nextSibling.nodeValue;\n              goog.dom.removeNode(runner.nextSibling);\n            }\n          }\n          runner = runner.nextSibling;\n        }\n        // Move its contents out and reprocess it on the next iteration.\n        if (node.firstChild) {\n          next = node.firstChild;\n          while (node.firstChild) {\n            node.parentNode.insertBefore(node.firstChild, node);\n          }\n        }\n        // get rid of the empty shell.\n        goog.dom.removeNode(node);\n      } else {\n        if (node.firstChild) {\n          next = node.firstChild;\n        }\n      }\n    }\n    node = next;\n  }\n};\n\n\n/**\n * Processes word.\n *\n * @param {Node} node Node containing word.\n * @param {string} word Word to process.\n * @param {goog.spell.SpellCheck.WordStatus} status Status of the word.\n * @protected\n * @override\n */\ngoog.ui.RichTextSpellChecker.prototype.processWord = function(\n    node, word, status) {\n  node.parentNode.insertBefore(this.createWordElement(word, status), node);\n  this.elementsInserted_++;\n};\n\n\n/**\n * Processes recognized text and separators.\n *\n * @param {Node} node Node containing separator.\n * @param {string} text Text to process.\n * @protected\n * @override\n */\ngoog.ui.RichTextSpellChecker.prototype.processRange = function(node, text) {\n  // The text does not change, it only gets split, so if the lengths are the\n  // same, the text is the same, so keep the existing node.\n  if (node.nodeType == goog.dom.NodeType.TEXT &&\n      node.nodeValue.length == text.length) {\n    return;\n  }\n\n  node.parentNode.insertBefore(this.editorDom_.createTextNode(text), node);\n  this.elementsInserted_++;\n};\n\n\n/** @override */\ngoog.ui.RichTextSpellChecker.prototype.getElementByIndex = function(id) {\n  return this.editorDom_.getElement(this.makeElementId(id));\n};\n\n\n/**\n * Updates or replaces element based on word status.\n * @see goog.ui.AbstractSpellChecker.prototype.updateElement_\n *\n * Overridden from AbstractSpellChecker because we need to be mindful of\n * deleting the currentNode_ - this can break our pending processing.\n *\n * @param {Element} el Word element.\n * @param {string} word Word to update status for.\n * @param {goog.spell.SpellCheck.WordStatus} status Status of word.\n * @protected\n * @override\n */\ngoog.ui.RichTextSpellChecker.prototype.updateElement = function(\n    el, word, status) {\n  if (status == goog.spell.SpellCheck.WordStatus.VALID &&\n      el != this.currentNode_ && el.nextSibling != this.currentNode_) {\n    this.removeMarkup(el);\n  } else {\n    goog.dom.setProperties(el, this.getElementProperties(status));\n  }\n};\n\n\n/**\n * Hides correction UI.\n * @override\n */\ngoog.ui.RichTextSpellChecker.prototype.resume = function() {\n  goog.ui.RichTextSpellChecker.superClass_.resume.call(this);\n\n  this.restoreNode_(this.rootNode_);\n\n  this.eventHandler_\n      .unlisten(this.rootNode_, goog.events.EventType.CLICK, this.onWordClick_)\n      .unlisten(\n          this.keyHandler_, goog.events.KeyHandler.EventType.KEY,\n          this.handleRootNodeKeyEvent);\n};\n\n\n/**\n * Processes nodes recursively, removes all spell checker markup, and\n * consolidates text nodes.\n * @param {Node} node node on which to recurse.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.RichTextSpellChecker.prototype.restoreNode_ = function(node) {\n  while (node) {\n    if (this.isExcluded_(node)) {\n      node = node.nextSibling;\n      continue;\n    }\n    // Contents of the child of the element is usually 1 text element, but the\n    // user can actually add multiple nodes in it during editing. So we move\n    // all the children out, prepend, and reprocess (pointer is set back to\n    // the first node that's been moved out, and the loop repeats).\n    if (node.nodeType == goog.dom.NodeType.ELEMENT &&\n        node.className == this.wordClassName) {\n      var firstElement = node.firstChild;\n      var next;\n      for (var child = firstElement; child; child = next) {\n        next = child.nextSibling;\n        node.parentNode.insertBefore(child, node);\n      }\n      next = firstElement || node.nextSibling;\n      goog.dom.removeNode(node);\n      node = next;\n      continue;\n    }\n    // If this is a chain of text elements, we're trying to consolidate it.\n    var textLeaf = this.isTextLeaf_(node);\n    if (textLeaf) {\n      var textNodes = 1;\n      var next = node.nextSibling;\n      while (this.isTextLeaf_(node.previousSibling)) {\n        node = node.previousSibling;\n        ++textNodes;\n      }\n      while (this.isTextLeaf_(next)) {\n        next = next.nextSibling;\n        ++textNodes;\n      }\n      if (textNodes > 1) {\n        this.workBuffer_.append(node.nodeValue);\n        while (this.isTextLeaf_(node.nextSibling)) {\n          this.workBuffer_.append(node.nextSibling.nodeValue);\n          goog.dom.removeNode(node.nextSibling);\n        }\n        node.nodeValue = this.workBuffer_.toString();\n        this.workBuffer_.clear();\n      }\n    }\n    // Process child nodes, if any.\n    if (node.firstChild) {\n      this.restoreNode_(node.firstChild);\n    }\n    node = node.nextSibling;\n  }\n};\n\n\n/**\n * Returns desired element properties for the specified status.\n *\n * @param {goog.spell.SpellCheck.WordStatus} status Status of the word.\n * @return {!Object} Properties to apply to word element.\n * @protected\n * @override\n */\ngoog.ui.RichTextSpellChecker.prototype.getElementProperties = function(status) {\n  return {\n    'class': this.wordClassName,\n    'style': (status == goog.spell.SpellCheck.WordStatus.INVALID) ?\n        this.invalidWordCssText :\n        ''\n  };\n};\n\n\n/**\n * Handler for click events.\n * @param {goog.events.BrowserEvent} event Event object.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.RichTextSpellChecker.prototype.onWordClick_ = function(event) {\n  var target = /** @type {Element} */ (event.target);\n  if (event.target.className == this.wordClassName &&\n      this.spellCheck.checkWord(goog.dom.getTextContent(target)) ==\n          goog.spell.SpellCheck.WordStatus.INVALID) {\n    this.showSuggestionsMenu(target, event);\n\n    // Prevent document click handler from closing the menu.\n    event.stopPropagation();\n  }\n};\n\n\n/** @override */\ngoog.ui.RichTextSpellChecker.prototype.disposeInternal = function() {\n  goog.ui.RichTextSpellChecker.superClass_.disposeInternal.call(this);\n  this.rootNode_ = null;\n  this.editorDom_ = null;\n};\n\n\n/**\n * Returns whether the editor node is an iframe.\n *\n * @return {boolean} true the editor node is an iframe, otherwise false.\n * @protected\n */\ngoog.ui.RichTextSpellChecker.prototype.isEditorIframe = function() {\n  return this.rootNodeIframe_;\n};\n\n\n/**\n * Handles keyboard events inside the editor to allow keyboard navigation\n * between misspelled words and activation of the suggestion menu.\n *\n * @param {goog.events.BrowserEvent} e the key event.\n * @return {boolean} The handled value.\n * @protected\n */\ngoog.ui.RichTextSpellChecker.prototype.handleRootNodeKeyEvent = function(e) {\n  var handled = false;\n  switch (e.keyCode) {\n    case goog.events.KeyCodes.RIGHT:\n      if (e.ctrlKey) {\n        handled = this.navigate(goog.ui.AbstractSpellChecker.Direction.NEXT);\n      }\n      break;\n\n    case goog.events.KeyCodes.LEFT:\n      if (e.ctrlKey) {\n        handled =\n            this.navigate(goog.ui.AbstractSpellChecker.Direction.PREVIOUS);\n      }\n      break;\n\n    case goog.events.KeyCodes.DOWN:\n      if (this.getFocusedElementIndex()) {\n        var el = this.editorDom_.getElement(\n            this.makeElementId(this.getFocusedElementIndex()));\n        if (el) {\n          var position = goog.style.getClientPosition(el);\n\n          if (this.isEditorIframe()) {\n            var iframePosition =\n                goog.style.getClientPosition(this.getElementStrict());\n            position = goog.math.Coordinate.sum(iframePosition, position);\n          }\n\n          var size = goog.style.getSize(el);\n          position.x += size.width / 2;\n          position.y += size.height / 2;\n          this.showSuggestionsMenu(el, position);\n          handled = true;\n        }\n      }\n      break;\n  }\n\n  if (handled) {\n    e.preventDefault();\n  }\n\n  return handled;\n};\n\n\n/** @override */\ngoog.ui.RichTextSpellChecker.prototype.onCorrectionAction = function(event) {\n  goog.ui.RichTextSpellChecker.base(this, 'onCorrectionAction', event);\n\n  // In case of editWord base class has already set the focus (on the input),\n  // otherwise set the focus back on the word.\n  if (event.target != this.getMenuEdit()) {\n    this.reFocus_();\n  }\n};\n\n\n/**\n * Restores focus when the suggestion menu is hidden.\n *\n * @param {goog.events.BrowserEvent} event Blur event.\n * @private\n */\ngoog.ui.RichTextSpellChecker.prototype.onCorrectionHide_ = function(event) {\n  this.reFocus_();\n};\n\n\n/**\n * Sets the focus back on the previously focused word element.\n * @private\n */\ngoog.ui.RichTextSpellChecker.prototype.reFocus_ = function() {\n  this.getElementStrict().focus();\n\n  var el = this.getElementByIndex(this.getFocusedElementIndex());\n  if (el) {\n    this.focusOnElement(el);\n  }\n};\n\n\n/** @override */\ngoog.ui.RichTextSpellChecker.prototype.focusOnElement = function(element) {\n  goog.dom.Range.createCaret(element, 0).select();\n};\n","^17",1579837703000,"^18",["^19",["^1S","^1T","~$goog.ui.AbstractSpellChecker","^2L","~$goog.Timer","~$goog.spell.SpellCheck","^3G","^22","~$goog.events.KeyHandler","^Z","~$goog.string.StringBuffer","^2Z","^26","~$goog.ui.PopupMenu","^29","^33","^34"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/richtextspellchecker.js"],"^1J",["^19",["~$goog.ui.RichTextSpellChecker"]],"^X",true,"^Y",["^Z","^5F","^1S","^1T","^3G","^33","^2L","^2Z","^34","^5H","^26","^5G","^5I","^29","^5E","^22","^5J"]],["^ ","^[",[1579837703000],"^10","goog.labs.net.webchannel.basetestchannel.js","^11",["^12","goog/labs/net/webchannel/basetestchannel.js"],"^13","goog/labs/net/webchannel/basetestchannel.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Base TestChannel implementation.\n *\n */\n\n\ngoog.provide('goog.labs.net.webChannel.BaseTestChannel');\n\ngoog.forwardDeclare('goog.labs.net.webChannel.WebChannelBase');\ngoog.require('goog.labs.net.webChannel.Channel');\ngoog.require('goog.labs.net.webChannel.ChannelRequest');\ngoog.require('goog.labs.net.webChannel.WebChannelDebug');\ngoog.require('goog.labs.net.webChannel.requestStats');\ngoog.require('goog.net.WebChannel');\n\n\n\n/**\n * A TestChannel is used during the first part of channel negotiation\n * with the server to create the channel. It helps us determine whether we're\n * behind a buffering proxy.\n *\n * @constructor\n * @struct\n * @param {!goog.labs.net.webChannel.Channel} channel The channel\n *     that owns this test channel.\n * @param {!goog.labs.net.webChannel.WebChannelDebug} channelDebug A\n *     WebChannelDebug instance to use for logging.\n * @implements {goog.labs.net.webChannel.Channel}\n */\ngoog.labs.net.webChannel.BaseTestChannel = function(channel, channelDebug) {\n  /**\n   * The channel that owns this test channel\n   * @private {!goog.labs.net.webChannel.Channel}\n   */\n  this.channel_ = channel;\n\n  /**\n   * The channel debug to use for logging\n   * @private {!goog.labs.net.webChannel.WebChannelDebug}\n   */\n  this.channelDebug_ = channelDebug;\n\n  /**\n   * Extra HTTP headers to add to all the requests sent to the server.\n   * @private {?Object}\n   */\n  this.extraHeaders_ = null;\n\n  /**\n   * The test request.\n   * @private {?goog.labs.net.webChannel.ChannelRequest}\n   */\n  this.request_ = null;\n\n  /**\n   * Whether we have received the first result as an intermediate result. This\n   * helps us determine whether we're behind a buffering proxy.\n   * @private {boolean}\n   */\n  this.receivedIntermediateResult_ = false;\n\n  /**\n   * The relative path for test requests.\n   * @private {?string}\n   */\n  this.path_ = null;\n\n  /**\n   * The last status code received.\n   * @private {number}\n   */\n  this.lastStatusCode_ = -1;\n\n  /**\n   * A subdomain prefix for using a subdomain in IE for the backchannel\n   * requests.\n   * @private {?string}\n   */\n  this.hostPrefix_ = null;\n\n  /**\n   * The effective client protocol as indicated by the initial handshake\n   * response via the x-client-wire-protocol header.\n   *\n   * @private {?string}\n   */\n  this.clientProtocol_ = null;\n};\n\n\ngoog.scope(function() {\nvar WebChannel = goog.net.WebChannel;\nvar BaseTestChannel = goog.labs.net.webChannel.BaseTestChannel;\nvar WebChannelDebug = goog.labs.net.webChannel.WebChannelDebug;\nvar ChannelRequest = goog.labs.net.webChannel.ChannelRequest;\nvar requestStats = goog.labs.net.webChannel.requestStats;\nvar Channel = goog.labs.net.webChannel.Channel;\n\n\n/**\n * Enum type for the test channel state machine\n * @enum {number}\n * @private\n */\nBaseTestChannel.State_ = {\n  /**\n   * The state for the TestChannel state machine where we making the\n   * initial call to get the server configured parameters.\n   */\n  INIT: 0,\n\n  /**\n   * The  state for the TestChannel state machine where we're checking to\n   * se if we're behind a buffering proxy.\n   */\n  CONNECTION_TESTING: 1\n};\n\n\n/**\n * The state of the state machine for this object.\n *\n * @private {?BaseTestChannel.State_}\n */\nBaseTestChannel.prototype.state_ = null;\n\n\n/**\n * Sets extra HTTP headers to add to all the requests sent to the server.\n *\n * @param {Object} extraHeaders The HTTP headers.\n */\nBaseTestChannel.prototype.setExtraHeaders = function(extraHeaders) {\n  this.extraHeaders_ = extraHeaders;\n};\n\n\n/**\n * Starts the test channel. This initiates connections to the server.\n *\n * @param {string} path The relative uri for the test connection.\n */\nBaseTestChannel.prototype.connect = function(path) {\n  this.path_ = path;\n  var sendDataUri = this.channel_.getForwardChannelUri(this.path_);\n\n  requestStats.notifyStatEvent(requestStats.Stat.TEST_STAGE_ONE_START);\n\n  // If the channel already has the result of the handshake, then skip it.\n  var handshakeResult = this.channel_.getConnectionState().handshakeResult;\n  if (handshakeResult != null) {\n    this.hostPrefix_ = this.channel_.correctHostPrefix(handshakeResult[0]);\n    this.state_ = BaseTestChannel.State_.CONNECTION_TESTING;\n    this.checkBufferingProxy_();\n    return;\n  }\n\n  // the first request returns server specific parameters\n  sendDataUri.setParameterValues('MODE', 'init');\n\n  // http-session-id to be generated as the response\n  if (!this.channel_.getBackgroundChannelTest() &&\n      this.channel_.getHttpSessionIdParam()) {\n    sendDataUri.setParameterValues(WebChannel.X_HTTP_SESSION_ID,\n        this.channel_.getHttpSessionIdParam());\n  }\n\n  this.request_ = ChannelRequest.createChannelRequest(this, this.channelDebug_);\n\n  this.request_.setExtraHeaders(this.extraHeaders_);\n\n  this.request_.xmlHttpGet(\n      sendDataUri, false /* decodeChunks */, null /* hostPrefix */);\n  this.state_ = BaseTestChannel.State_.INIT;\n};\n\n\n/**\n * Begins the second stage of the test channel where we test to see if we're\n * behind a buffering proxy. The server sends back a multi-chunked response\n * with the first chunk containing the content '1' and then two seconds later\n * sending the second chunk containing the content '2'. Depending on how we\n * receive the content, we can tell if we're behind a buffering proxy.\n * @private\n */\nBaseTestChannel.prototype.checkBufferingProxy_ = function() {\n  this.channelDebug_.debug('TestConnection: starting stage 2');\n\n  // If the test result is already available, skip its execution.\n  var bufferingProxyResult =\n      this.channel_.getConnectionState().bufferingProxyResult;\n  if (bufferingProxyResult != null) {\n    this.channelDebug_.debug(function() {\n      return 'TestConnection: skipping stage 2, precomputed result is ' +\n              bufferingProxyResult ?\n          'Buffered' :\n          'Unbuffered';\n    });\n    requestStats.notifyStatEvent(requestStats.Stat.TEST_STAGE_TWO_START);\n    if (bufferingProxyResult) {  // Buffered/Proxy connection\n      requestStats.notifyStatEvent(requestStats.Stat.PROXY);\n      this.channel_.testConnectionFinished(this, false);\n    } else {  // Unbuffered/NoProxy connection\n      requestStats.notifyStatEvent(requestStats.Stat.NOPROXY);\n      this.channel_.testConnectionFinished(this, true);\n    }\n    return;  // Skip the test\n  }\n  this.request_ = ChannelRequest.createChannelRequest(this, this.channelDebug_);\n  this.request_.setExtraHeaders(this.extraHeaders_);\n  var recvDataUri = this.channel_.getBackChannelUri(\n      this.hostPrefix_,\n      /** @type {string} */ (this.path_));\n\n  requestStats.notifyStatEvent(requestStats.Stat.TEST_STAGE_TWO_START);\n  recvDataUri.setParameterValues('TYPE', 'xmlhttp');\n\n  var param = this.channel_.getHttpSessionIdParam();\n  var value = this.channel_.getHttpSessionId();\n  if (param && value) {\n    recvDataUri.setParameterValue(param, value);\n  }\n\n  this.request_.xmlHttpGet(\n      recvDataUri, false /** decodeChunks */, this.hostPrefix_);\n};\n\n\n/**\n * @override\n */\nBaseTestChannel.prototype.createXhrIo = function(hostPrefix) {\n  return this.channel_.createXhrIo(hostPrefix);\n};\n\n\n/**\n * Aborts the test channel.\n */\nBaseTestChannel.prototype.abort = function() {\n  if (this.request_) {\n    this.request_.cancel();\n    this.request_ = null;\n  }\n  this.lastStatusCode_ = -1;\n};\n\n\n/**\n * Returns whether the test channel is closed. The ChannelRequest object expects\n * this method to be implemented on its handler.\n *\n * @return {boolean} Whether the channel is closed.\n * @override\n */\nBaseTestChannel.prototype.isClosed = function() {\n  return false;\n};\n\n\n/**\n * Callback from ChannelRequest for when new data is received\n *\n * @param {ChannelRequest} req The request object.\n * @param {string} responseText The text of the response.\n * @override\n */\nBaseTestChannel.prototype.onRequestData = function(req, responseText) {\n  this.lastStatusCode_ = req.getLastStatusCode();\n  if (this.state_ == BaseTestChannel.State_.INIT) {\n    this.channelDebug_.debug('TestConnection: Got data for stage 1');\n\n    this.applyControlHeaders_(req);\n\n    if (!responseText) {\n      this.channelDebug_.debug('TestConnection: Null responseText');\n      // The server should always send text; something is wrong here\n      this.channel_.testConnectionFailure(this, ChannelRequest.Error.BAD_DATA);\n      return;\n    }\n\n\n    try {\n      var channel = /** @type {!goog.labs.net.webChannel.WebChannelBase} */ (\n          this.channel_);\n      var respArray = channel.getWireCodec().decodeMessage(responseText);\n    } catch (e) {\n      this.channelDebug_.dumpException(e);\n      this.channel_.testConnectionFailure(this, ChannelRequest.Error.BAD_DATA);\n      return;\n    }\n    this.hostPrefix_ = this.channel_.correctHostPrefix(respArray[0]);\n  } else if (this.state_ == BaseTestChannel.State_.CONNECTION_TESTING) {\n    if (this.receivedIntermediateResult_) {\n      requestStats.notifyStatEvent(requestStats.Stat.TEST_STAGE_TWO_DATA_TWO);\n    } else {\n      // '11111' is used instead of '1' to prevent a small amount of buffering\n      // by Safari.\n      if (responseText == '11111') {\n        requestStats.notifyStatEvent(requestStats.Stat.TEST_STAGE_TWO_DATA_ONE);\n        this.receivedIntermediateResult_ = true;\n        if (this.checkForEarlyNonBuffered_()) {\n          // If early chunk detection is on, and we passed the tests,\n          // assume HTTP_OK, cancel the test and turn on noproxy mode.\n          this.lastStatusCode_ = 200;\n          this.request_.cancel();\n          this.channelDebug_.debug(\n              'Test connection succeeded; using streaming connection');\n          requestStats.notifyStatEvent(requestStats.Stat.NOPROXY);\n          this.channel_.testConnectionFinished(this, true);\n        }\n      } else {\n        requestStats.notifyStatEvent(\n            requestStats.Stat.TEST_STAGE_TWO_DATA_BOTH);\n        this.receivedIntermediateResult_ = false;\n      }\n    }\n  }\n};\n\n\n/**\n * Callback from ChannelRequest that indicates a request has completed.\n *\n * @param {!ChannelRequest} req The request object.\n * @override\n */\nBaseTestChannel.prototype.onRequestComplete = function(req) {\n  this.lastStatusCode_ = this.request_.getLastStatusCode();\n  if (!this.request_.getSuccess()) {\n    this.channelDebug_.debug(\n        'TestConnection: request failed, in state ' + this.state_);\n    if (this.state_ == BaseTestChannel.State_.INIT) {\n      requestStats.notifyStatEvent(requestStats.Stat.TEST_STAGE_ONE_FAILED);\n    } else if (this.state_ == BaseTestChannel.State_.CONNECTION_TESTING) {\n      requestStats.notifyStatEvent(requestStats.Stat.TEST_STAGE_TWO_FAILED);\n    }\n    this.channel_.testConnectionFailure(\n        this,\n        /** @type {ChannelRequest.Error} */\n        (this.request_.getLastError()));\n    return;\n  }\n\n  if (this.state_ == BaseTestChannel.State_.INIT) {\n    this.state_ = BaseTestChannel.State_.CONNECTION_TESTING;\n\n    this.channelDebug_.debug(\n        'TestConnection: request complete for initial check');\n\n    this.checkBufferingProxy_();\n  } else if (this.state_ == BaseTestChannel.State_.CONNECTION_TESTING) {\n    this.channelDebug_.debug('TestConnection: request complete for stage 2');\n\n    var goodConn = this.receivedIntermediateResult_;\n    if (goodConn) {\n      this.channelDebug_.debug(\n          'Test connection succeeded; using streaming connection');\n      requestStats.notifyStatEvent(requestStats.Stat.NOPROXY);\n      this.channel_.testConnectionFinished(this, true);\n    } else {\n      this.channelDebug_.debug('Test connection failed; not using streaming');\n      requestStats.notifyStatEvent(requestStats.Stat.PROXY);\n      this.channel_.testConnectionFinished(this, false);\n    }\n  }\n};\n\n\n/**\n * Apply any control headers from the initial handshake response.\n *\n * @param {!ChannelRequest} req The request object.\n * @private\n */\nBaseTestChannel.prototype.applyControlHeaders_ = function(req) {\n  if (this.channel_.getBackgroundChannelTest()) {\n    return;\n  }\n\n  var xhr = req.getXhr();\n  if (xhr) {\n    var protocolHeader = xhr.getStreamingResponseHeader(\n        WebChannel.X_CLIENT_WIRE_PROTOCOL);\n    this.clientProtocol_ = protocolHeader ? protocolHeader : null;\n\n    if (this.channel_.getHttpSessionIdParam()) {\n      var httpSessionIdHeader = xhr.getStreamingResponseHeader(\n          WebChannel.X_HTTP_SESSION_ID);\n      if (httpSessionIdHeader) {\n        this.channel_.setHttpSessionId(httpSessionIdHeader);\n      } else {\n        this.channelDebug_.warning(\n            'Missing X_HTTP_SESSION_ID in the handshake response');\n      }\n    }\n  }\n};\n\n\n/**\n * @return {?string} The client protocol as recorded with the init handshake\n *     request.\n */\nBaseTestChannel.prototype.getClientProtocol = function() {\n  return this.clientProtocol_;\n};\n\n\n/**\n * Returns the last status code received for a request.\n * @return {number} The last status code received for a request.\n */\nBaseTestChannel.prototype.getLastStatusCode = function() {\n  return this.lastStatusCode_;\n};\n\n\n/**\n * @return {boolean} Whether we should be using secondary domains when the\n *     server instructs us to do so.\n * @override\n */\nBaseTestChannel.prototype.shouldUseSecondaryDomains = function() {\n  return this.channel_.shouldUseSecondaryDomains();\n};\n\n\n/**\n * @override\n */\nBaseTestChannel.prototype.isActive = function() {\n  return this.channel_.isActive();\n};\n\n\n/**\n * @return {boolean} True if test stage 2 detected a non-buffered\n *     channel early and early no buffering detection is enabled.\n * @private\n */\nBaseTestChannel.prototype.checkForEarlyNonBuffered_ = function() {\n  return ChannelRequest.supportsXhrStreaming();\n};\n\n\n/**\n * @override\n */\nBaseTestChannel.prototype.getForwardChannelUri = goog.abstractMethod;\n\n\n/**\n * @override\n */\nBaseTestChannel.prototype.getBackChannelUri = goog.abstractMethod;\n\n\n/**\n * @override\n */\nBaseTestChannel.prototype.correctHostPrefix = goog.abstractMethod;\n\n\n/**\n * @override\n */\nBaseTestChannel.prototype.createDataUri = goog.abstractMethod;\n\n\n/**\n * @override\n */\nBaseTestChannel.prototype.testConnectionFinished = goog.abstractMethod;\n\n\n/**\n * @override\n */\nBaseTestChannel.prototype.testConnectionFailure = goog.abstractMethod;\n\n\n/**\n * @override\n */\nBaseTestChannel.prototype.getConnectionState = goog.abstractMethod;\n\n\n/**\n * @override\n */\nBaseTestChannel.prototype.setHttpSessionIdParam = goog.abstractMethod;\n\n\n/**\n * @override\n */\nBaseTestChannel.prototype.getHttpSessionIdParam = goog.abstractMethod;\n\n\n/**\n * @override\n */\nBaseTestChannel.prototype.setHttpSessionId = goog.abstractMethod;\n\n\n/**\n * @override\n */\nBaseTestChannel.prototype.getHttpSessionId = goog.abstractMethod;\n\n\n/**\n * @override\n */\nBaseTestChannel.prototype.getBackgroundChannelTest = goog.abstractMethod;\n});  // goog.scope\n","^17",1579837703000,"^18",["^19",["~$goog.labs.net.webChannel.ChannelRequest","^Z","~$goog.labs.net.webChannel.Channel","~$goog.labs.net.webChannel.WebChannelDebug","~$goog.net.WebChannel","~$goog.labs.net.webChannel.requestStats"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchannel/basetestchannel.js"],"^1J",["^19",["~$goog.labs.net.webChannel.BaseTestChannel"]],"^X",true,"^Y",["^Z","^5M","^5L","^5N","^5P","^5O"]],["^ ","^[",[1579837703000],"^10","goog.testing.mockcontrol.js","^11",["^12","goog/testing/mockcontrol.js"],"^13","goog/testing/mockcontrol.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A MockControl holds a set of mocks for a particular test.\n * It consolidates calls to $replay, $verify, and $tearDown, which simplifies\n * the test and helps avoid omissions.\n *\n * You can create and control a mock:\n *   var mockFoo = mockControl.addMock(new MyMock(Foo));\n *\n * MockControl also exposes some convenience functions that create\n * controlled mocks for common mocks: StrictMock, LooseMock,\n * FunctionMock, MethodMock, and GlobalFunctionMock.\n *\n */\n\n\ngoog.setTestOnly('goog.testing.MockControl');\ngoog.provide('goog.testing.MockControl');\n\ngoog.require('goog.Promise');\ngoog.require('goog.array');\ngoog.require('goog.testing');\ngoog.require('goog.testing.LooseMock');\ngoog.require('goog.testing.StrictMock');\n\n\n\n/**\n * Controls a set of mocks.  Controlled mocks are replayed, verified, and\n * cleaned-up at the same time.\n * @constructor\n */\ngoog.testing.MockControl = function() {\n  /**\n   * The list of mocks being controlled.\n   * @type {Array<goog.testing.MockInterface>}\n   * @private\n   */\n  this.mocks_ = [];\n};\n\n\n/**\n * Takes control of this mock.\n * @param {goog.testing.MockInterface} mock Mock to be controlled.\n * @return {goog.testing.MockInterface} The same mock passed in,\n *     for convenience.\n */\ngoog.testing.MockControl.prototype.addMock = function(mock) {\n  this.mocks_.push(mock);\n  return mock;\n};\n\n\n/**\n * Calls replay on each controlled mock.\n */\ngoog.testing.MockControl.prototype.$replayAll = function() {\n  goog.array.forEach(this.mocks_, function(m) { m.$replay(); });\n};\n\n\n/**\n * Calls reset on each controlled mock.\n */\ngoog.testing.MockControl.prototype.$resetAll = function() {\n  goog.array.forEach(this.mocks_, function(m) { m.$reset(); });\n};\n\n\n/**\n * Returns a Promise that resolves when all of the controlled mocks have\n * finished and verified.\n * @return {!goog.Promise<!Array<undefined>>}\n */\ngoog.testing.MockControl.prototype.$waitAndVerifyAll = function() {\n  return goog.Promise.all(goog.array.map(this.mocks_, function(m) {\n    return m.$waitAndVerify();\n  }));\n};\n\n\n/**\n * Calls verify on each controlled mock.\n */\ngoog.testing.MockControl.prototype.$verifyAll = function() {\n  goog.array.forEach(this.mocks_, function(m) { m.$verify(); });\n};\n\n\n/**\n * Calls tearDown on each controlled mock, if necesssary.\n */\ngoog.testing.MockControl.prototype.$tearDown = function() {\n  goog.array.forEach(this.mocks_, function(m) {\n    if (!m) {\n      return;\n    }\n\n    m = /** @type {?} */ (m);\n    // $tearDown if defined.\n    if (m.$tearDown) {\n      m.$tearDown();\n    }\n    // TODO(user): Somehow determine if verifyAll should have been called\n    // but was not.\n  });\n};\n\n\n/**\n * Creates a controlled StrictMock.  Passes its arguments through to the\n * StrictMock constructor.\n * @param {Object|Function} objectToMock The object that should be mocked, or\n *    the constructor of an object to mock.\n * @param {boolean=} opt_mockStaticMethods An optional argument denoting that\n *     a mock should be constructed from the static functions of a class.\n * @param {boolean=} opt_createProxy An optional argument denoting that\n *     a proxy for the target mock should be created.\n * @return {!goog.testing.StrictMock} The mock object.\n */\ngoog.testing.MockControl.prototype.createStrictMock = function(\n    objectToMock, opt_mockStaticMethods, opt_createProxy) {\n  var m = new goog.testing.StrictMock(\n      objectToMock, opt_mockStaticMethods, opt_createProxy);\n  this.addMock(m);\n  return m;\n};\n\n\n/**\n * Creates a controlled LooseMock.  Passes its arguments through to the\n * LooseMock constructor.\n * @param {Object|Function} objectToMock The object that should be mocked, or\n *    the constructor of an object to mock.\n * @param {boolean=} opt_ignoreUnexpectedCalls Whether to ignore unexpected\n *     calls.\n * @param {boolean=} opt_mockStaticMethods An optional argument denoting that\n *     a mock should be constructed from the static functions of a class.\n * @param {boolean=} opt_createProxy An optional argument denoting that\n *     a proxy for the target mock should be created.\n * @return {!goog.testing.LooseMock} The mock object.\n */\ngoog.testing.MockControl.prototype.createLooseMock = function(\n    objectToMock, opt_ignoreUnexpectedCalls, opt_mockStaticMethods,\n    opt_createProxy) {\n  var m = new goog.testing.LooseMock(\n      objectToMock, opt_ignoreUnexpectedCalls, opt_mockStaticMethods,\n      opt_createProxy);\n  this.addMock(m);\n  return m;\n};\n\n\n/**\n * Creates a controlled FunctionMock.  Passes its arguments through to the\n * FunctionMock constructor.\n * @param {string=} opt_functionName The optional name of the function to mock\n *     set to '[anonymous mocked function]' if not passed in.\n * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or\n *     goog.testing.Mock.STRICT. The default is STRICT.\n * @return {!goog.testing.MockInterface} The mocked function.\n */\ngoog.testing.MockControl.prototype.createFunctionMock = function(\n    opt_functionName, opt_strictness) {\n  var m = goog.testing.createFunctionMock(opt_functionName, opt_strictness);\n  this.addMock(m);\n  return m;\n};\n\n\n/**\n * Creates a controlled MethodMock.  Passes its arguments through to the\n * MethodMock constructor.\n * @param {Object} scope The scope of the method to be mocked out.\n * @param {string} functionName The name of the function we're going to mock.\n * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or\n *     goog.testing.Mock.STRICT. The default is STRICT.\n * @return {!goog.testing.MockInterface} The mocked method.\n */\ngoog.testing.MockControl.prototype.createMethodMock = function(\n    scope, functionName, opt_strictness) {\n  var m = goog.testing.createMethodMock(scope, functionName, opt_strictness);\n  this.addMock(m);\n  return m;\n};\n\n\n/**\n * Creates a controlled MethodMock for a constructor.  Passes its arguments\n * through to the MethodMock constructor. See\n * {@link goog.testing.createConstructorMock} for details.\n * @param {Object} scope The scope of the constructor to be mocked out.\n * @param {string} constructorName The name of the function we're going to mock.\n * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or\n *     goog.testing.Mock.STRICT. The default is STRICT.\n * @return {!goog.testing.MockInterface} The mocked method.\n */\ngoog.testing.MockControl.prototype.createConstructorMock = function(\n    scope, constructorName, opt_strictness) {\n  var m = goog.testing.createConstructorMock(\n      scope, constructorName, opt_strictness);\n  this.addMock(m);\n  return m;\n};\n\n\n/**\n * Creates a controlled GlobalFunctionMock.  Passes its arguments through to the\n * GlobalFunctionMock constructor.\n * @param {string} functionName The name of the function we're going to mock.\n * @param {number=} opt_strictness One of goog.testing.Mock.LOOSE or\n *     goog.testing.Mock.STRICT. The default is STRICT.\n * @return {!goog.testing.MockInterface} The mocked function.\n */\ngoog.testing.MockControl.prototype.createGlobalFunctionMock = function(\n    functionName, opt_strictness) {\n  var m = goog.testing.createGlobalFunctionMock(functionName, opt_strictness);\n  this.addMock(m);\n  return m;\n};\n","^17",1579837703000,"^18",["^19",["~$goog.testing","^Z","^4B","~$goog.testing.LooseMock","~$goog.testing.StrictMock","^35"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/mockcontrol.js"],"^1J",["^19",["~$goog.testing.MockControl"]],"^X",true,"^Y",["^Z","^4B","^35","^5R","^5S","^5T"]],["^ ","^[",[1579837703000],"^10","goog.ui.ac.inputhandler.js","^11",["^12","goog/ui/ac/inputhandler.js"],"^13","goog/ui/ac/inputhandler.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class for managing the interactions between an\n * auto-complete object and a text-input or textarea.\n *\n * IME note:\n *\n * We used to suspend autocomplete while there are IME preedit characters, but\n * now for parity with Search we do not. We still detect the beginning and end\n * of IME entry because we need to listen to more events while an IME commit is\n * happening, but we update continuously as the user types.\n *\n * IMEs vary across operating systems, browsers, and even input languages. This\n * class tries to handle IME for:\n * - Windows x {FF3, IE7, Chrome} x MS IME 2002 (Japanese)\n * - Mac     x {FF3, Safari3}     x Kotoeri (Japanese)\n * - Linux   x {FF3}              x UIM + Anthy (Japanese)\n *\n * TODO(user): We cannot handle {Mac, Linux} x FF3 correctly.\n * TODO(user): We need to support Windows x Google IME.\n *\n * This class was tested with hiragana input. The event sequence when inputting\n * 'ai<enter>' with IME on (which commits two characters) is as follows:\n *\n * Notation: [key down code, key press, key up code]\n *           key code or +: event fired\n *           -: event not fired\n *\n * - Win/FF3: [WIN_IME, +, A], [-, -, ENTER]\n *            Note: No events are fired for 'i'.\n *\n * - Win/IE7: [WIN_IME, -, A], [WIN_IME, -, I], [WIN_IME, -, ENTER]\n *\n * - Win/Chrome: Same as Win/IE7\n *\n * - Mac/FF3: [A, -, A], [I, -, I], [ENTER, -, ENTER]\n *\n * - Mac/Safari3: Same as Win/IE7\n *\n * - Linux/FF3: No events are generated.\n *\n * With IME off,\n *\n * - ALL: [A, +, A], [I, +, I], [ENTER, +, ENTER]\n *        Note: Key code of key press event varies across configuration.\n *\n * With Microsoft Pinyin IME 3.0 (Simplified Chinese),\n *\n * - Win/IE7: Same as Win/IE7 with MS IME 2002 (Japanese)\n *\n *   The issue with this IME is that the key sequence that ends preedit is not\n *   a single ENTER key up.\n *   - ENTER key up following either ENTER or SPACE ends preedit.\n *   - SPACE key up following even number of LEFT, RIGHT, or SPACE (any\n *     combination) ends preedit.\n *   TODO(user): We only support SPACE-then-ENTER sequence.\n *   TODO(mpd): With the change to autocomplete during IME, this might not be an\n *   issue. Remove this comment once tested.\n *\n * With Microsoft Korean IME 2002,\n *\n * - Win/IE7: Same as Win/IE7 with MS IME 2002 (Japanese), but there is no\n *   sequence that ends the preedit.\n *\n * The following is the algorithm we use to detect IME preedit:\n *\n * - WIN_IME key down starts predit.\n * - (1) ENTER key up or (2) CTRL-M key up ends preedit.\n * - Any key press not immediately following WIN_IME key down signifies that\n *   preedit has ended.\n *\n * If you need to change this algorithm, please note the OS, browser, language,\n * and behavior above so that we can avoid regressions. Contact mpd or yuzo\n * if you have questions or concerns.\n *\n */\n\n\ngoog.provide('goog.ui.ac.InputHandler');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.Timer');\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.dom');\ngoog.require('goog.dom.selection');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.events.KeyHandler');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\ngoog.require('goog.userAgent.product');\n\n\n\n/**\n * Class for managing the interaction between an auto-complete object and a\n * text-input or textarea.\n *\n * @param {?string=} opt_separators Separators to split multiple entries.\n *     If none passed, uses ',' and ';'.\n * @param {?string=} opt_literals Characters used to delimit text literals.\n * @param {?boolean=} opt_multi Whether to allow multiple entries\n *     (Default: true).\n * @param {?number=} opt_throttleTime Number of milliseconds to throttle\n *     keyevents with (Default: 150). Use -1 to disable updates on typing. Note\n *     that typing the separator will update autocomplete suggestions.\n * @constructor\n * @extends {goog.Disposable}\n */\ngoog.ui.ac.InputHandler = function(\n    opt_separators, opt_literals, opt_multi, opt_throttleTime) {\n  goog.Disposable.call(this);\n  var throttleTime = opt_throttleTime || 150;\n\n  /**\n   * Whether this input accepts multiple values\n   * @type {boolean}\n   * @private\n   */\n  this.multi_ = opt_multi != null ? opt_multi : true;\n\n  // Set separators depends on this.multi_ being set correctly\n  this.setSeparators(\n      opt_separators || goog.ui.ac.InputHandler.STANDARD_LIST_SEPARATORS);\n\n  /**\n   * Characters that are used to delimit literal text. Separarator characters\n   * found within literal text are not processed as separators\n   * @type {string}\n   * @private\n   */\n  this.literals_ = opt_literals || '';\n\n  /**\n   * Whether to prevent highlighted item selection when tab is pressed.\n   * @type {boolean}\n   * @private\n   */\n  this.preventSelectionOnTab_ = false;\n\n  /**\n   * Whether to prevent the default behavior (moving focus to another element)\n   * when tab is pressed.  This occurs by default only for multi-value mode.\n   * @type {boolean}\n   * @private\n   */\n  this.preventDefaultOnTab_ = this.multi_;\n\n  /**\n   * A timer object used to monitor for changes when an element is active.\n   *\n   * TODO(user): Consider tuning the throttle time, so that it takes into\n   * account the length of the token.  When the token is short it is likely to\n   * match lots of rows, therefore we want to check less frequently.  Even\n   * something as simple as <3-chars = 150ms, then 100ms otherwise.\n   *\n   * @type {goog.Timer}\n   * @private\n   */\n  this.timer_ = throttleTime > 0 ? new goog.Timer(throttleTime) : null;\n\n  /**\n   * Event handler used by the input handler to manage events.\n   * @type {goog.events.EventHandler<!goog.ui.ac.InputHandler>}\n   * @private\n   */\n  this.eh_ = new goog.events.EventHandler(this);\n\n  /**\n   * Event handler to help us find an input element that already has the focus.\n   * @type {goog.events.EventHandler<!goog.ui.ac.InputHandler>}\n   * @private\n   */\n  this.activateHandler_ = new goog.events.EventHandler(this);\n\n  /**\n   * The keyhandler used for listening on most key events.  This takes care of\n   * abstracting away some of the browser differences.\n   * @type {goog.events.KeyHandler}\n   * @private\n   */\n  this.keyHandler_ = new goog.events.KeyHandler();\n\n  /**\n   * The last key down key code.\n   * @type {number}\n   * @private\n   */\n  this.lastKeyCode_ = -1;  // Initialize to a non-existent value.\n};\ngoog.inherits(goog.ui.ac.InputHandler, goog.Disposable);\ngoog.tagUnsealableClass(goog.ui.ac.InputHandler);\n\n\n/**\n * Whether or not we need to pause the execution of the blur handler in order\n * to allow the execution of the selection handler to run first. This is\n * currently true when running on IOS version prior to 4.2, since we need\n * some special logic for these devices to handle bug 4484488.\n * @type {boolean}\n * @private\n */\ngoog.ui.ac.InputHandler.REQUIRES_ASYNC_BLUR_ =\n    (goog.userAgent.product.IPHONE || goog.userAgent.product.IPAD) &&\n    // Check the webkit version against the version for iOS 4.2.1.\n    !goog.userAgent.isVersionOrHigher('533.17.9');\n\n\n/**\n * Standard list separators.\n * @type {string}\n * @const\n */\ngoog.ui.ac.InputHandler.STANDARD_LIST_SEPARATORS = ',;';\n\n\n/**\n * Literals for quotes.\n * @type {string}\n * @const\n */\ngoog.ui.ac.InputHandler.QUOTE_LITERALS = '\"';\n\n\n/**\n * The AutoComplete instance this inputhandler is associated with.\n * @type {goog.ui.ac.AutoComplete}\n */\ngoog.ui.ac.InputHandler.prototype.ac_;\n\n\n/**\n * Characters that can be used to split multiple entries in an input string\n * @type {string}\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.separators_;\n\n\n/**\n * The separator we use to reconstruct the string\n * @type {string}\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.defaultSeparator_;\n\n\n/**\n * Regular expression used from trimming tokens or null for no trimming.\n * @type {?RegExp}\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.trimmer_;\n\n\n/**\n * Regular expression to test whether a separator exists\n * @type {?RegExp}\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.separatorCheck_;\n\n\n/**\n * Should auto-completed tokens be wrapped in whitespace?  Used in selectRow.\n * @type {boolean}\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.whitespaceWrapEntries_ = true;\n\n\n/**\n * Should the occurrence of a literal indicate a token boundary?\n * @type {boolean}\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.generateNewTokenOnLiteral_ = true;\n\n\n/**\n * Whether to flip the orientation of up & down for hiliting next\n * and previous autocomplete entries.\n * @type {boolean}\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.upsideDown_ = false;\n\n\n/**\n * If we're in 'multi' mode, does typing a separator force the updating of\n * suggestions?\n * For example, if somebody finishes typing \"obama, hillary,\", should the last\n * comma trigger updating suggestions in a guaranteed manner? Especially useful\n * when the suggestions depend on complete keywords. Note that \"obama, hill\"\n * (a leading sub-string of \"obama, hillary\" will lead to different and possibly\n * irrelevant suggestions.\n * @type {boolean}\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.separatorUpdates_ = true;\n\n\n/**\n * If we're in 'multi' mode, does typing a separator force the current term to\n * autocomplete?\n * For example, if 'tomato' is a suggested completion and the user has typed\n * 'to,', do we autocomplete to turn that into 'tomato,'?\n * @type {boolean}\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.separatorSelects_ = true;\n\n\n/**\n * The id of the currently active timeout, so it can be cleared if required.\n * @type {?number}\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.activeTimeoutId_ = null;\n\n\n/**\n * The element that is currently active.\n * @type {?Element}\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.activeElement_ = null;\n\n\n/**\n * The previous value of the active element.\n * @type {string}\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.lastValue_ = '';\n\n\n/**\n * Flag used to indicate that the IME key has been seen and we need to wait for\n * the up event.\n * @type {boolean}\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.waitingForIme_ = false;\n\n\n/**\n * Flag used to indicate that the user just selected a row and we should\n * therefore ignore the change of the input value.\n * @type {boolean}\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.rowJustSelected_ = false;\n\n\n/**\n * Flag indicating whether the result list should be updated continuously\n * during typing or only after a short pause.\n * @type {boolean}\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.updateDuringTyping_ = true;\n\n\n/**\n * Attach an instance of an AutoComplete\n * @param {goog.ui.ac.AutoComplete} ac Autocomplete object.\n */\ngoog.ui.ac.InputHandler.prototype.attachAutoComplete = function(ac) {\n  this.ac_ = ac;\n};\n\n\n/**\n * Returns the associated autocomplete instance.\n * @return {goog.ui.ac.AutoComplete} The associated autocomplete instance.\n */\ngoog.ui.ac.InputHandler.prototype.getAutoComplete = function() {\n  return this.ac_;\n};\n\n\n/**\n * Returns the current active element.\n * @return {Element} The currently active element.\n */\ngoog.ui.ac.InputHandler.prototype.getActiveElement = function() {\n  return this.activeElement_;\n};\n\n\n/**\n * Returns the value of the current active element.\n * @return {string} The value of the current active element.\n */\ngoog.ui.ac.InputHandler.prototype.getValue = function() {\n  return this.activeElement_.value;\n};\n\n\n/**\n * Sets the value of the current active element.\n * @param {string} value The new value.\n */\ngoog.ui.ac.InputHandler.prototype.setValue = function(value) {\n  this.activeElement_.value = value;\n};\n\n\n/**\n * Returns the current cursor position.\n * @return {number} The index of the cursor position.\n */\ngoog.ui.ac.InputHandler.prototype.getCursorPosition = function() {\n  return goog.dom.selection.getStart(this.activeElement_);\n};\n\n\n/**\n * Sets the cursor at the given position.\n * @param {number} pos The index of the cursor position.\n */\ngoog.ui.ac.InputHandler.prototype.setCursorPosition = function(pos) {\n  goog.dom.selection.setStart(this.activeElement_, pos);\n  goog.dom.selection.setEnd(this.activeElement_, pos);\n};\n\n\n/**\n * Attaches the input handler to a target element. The target element\n * should be a textarea, input box, or other focusable element with the\n * same interface.\n * @param {Element|goog.events.EventTarget} target An element to attach the\n *     input handler to.\n */\ngoog.ui.ac.InputHandler.prototype.attachInput = function(target) {\n  if (goog.dom.isElement(target)) {\n    var el = /** @type {!Element} */ (target);\n    goog.a11y.aria.setRole(el, goog.a11y.aria.Role.COMBOBOX);\n    goog.a11y.aria.setState(el, goog.a11y.aria.State.AUTOCOMPLETE, 'list');\n  }\n\n  this.eh_.listen(target, goog.events.EventType.FOCUS, this.handleFocus);\n  this.eh_.listen(target, goog.events.EventType.BLUR, this.handleBlur);\n\n  if (!this.activeElement_) {\n    this.activateHandler_.listen(\n        target, goog.events.EventType.KEYDOWN,\n        this.onKeyDownOnInactiveElement_);\n\n    // Don't wait for a focus event if the element already has focus.\n    if (goog.dom.isElement(target)) {\n      var ownerDocument = goog.dom.getOwnerDocument(\n          /** @type {Element} */ (target));\n      if (goog.dom.getActiveElement(ownerDocument) == target) {\n        this.processFocus(/** @type {!Element} */ (target));\n      }\n    }\n  }\n};\n\n\n/**\n * Detaches the input handler from the provided element.\n * @param {Element|goog.events.EventTarget} target An element to detach the\n *     input handler from.\n */\ngoog.ui.ac.InputHandler.prototype.detachInput = function(target) {\n  if (goog.dom.isElement(target)) {\n    var el = /** @type {!Element} */ (target);\n    goog.a11y.aria.removeRole(el);\n    goog.a11y.aria.removeState(el, goog.a11y.aria.State.AUTOCOMPLETE);\n  }\n\n  if (target == this.activeElement_) {\n    this.handleBlur();\n  }\n  this.eh_.unlisten(target, goog.events.EventType.FOCUS, this.handleFocus);\n  this.eh_.unlisten(target, goog.events.EventType.BLUR, this.handleBlur);\n\n  if (!this.activeElement_) {\n    this.activateHandler_.unlisten(\n        target, goog.events.EventType.KEYDOWN,\n        this.onKeyDownOnInactiveElement_);\n  }\n};\n\n\n/**\n * Attaches the input handler to multiple elements.\n * @param {...Element} var_args Elements to attach the input handler too.\n */\ngoog.ui.ac.InputHandler.prototype.attachInputs = function(var_args) {\n  for (var i = 0; i < arguments.length; i++) {\n    this.attachInput(arguments[i]);\n  }\n};\n\n\n/**\n * Detaches the input handler from multuple elements.\n * @param {...Element} var_args Variable arguments for elements to unbind from.\n */\ngoog.ui.ac.InputHandler.prototype.detachInputs = function(var_args) {\n  for (var i = 0; i < arguments.length; i++) {\n    this.detachInput(arguments[i]);\n  }\n};\n\n\n/**\n * Selects the given row.  Implements the SelectionHandler interface.\n * @param {?} row The row to select.\n * @param {boolean=} opt_multi Should this be treated as a single or multi-token\n *     auto-complete?  Overrides previous setting of opt_multi on constructor.\n * @return {boolean} Whether to suppress the update event.\n */\ngoog.ui.ac.InputHandler.prototype.selectRow = function(row, opt_multi) {\n  if (this.activeElement_) {\n    this.setTokenText(row.toString(), opt_multi);\n  }\n  return false;\n};\n\n\n/**\n * Sets the text of the current token without updating the autocomplete\n * choices.\n * @param {string} tokenText The text for the current token.\n * @param {boolean=} opt_multi Should this be treated as a single or multi-token\n *     auto-complete?  Overrides previous setting of opt_multi on constructor.\n * @protected\n */\ngoog.ui.ac.InputHandler.prototype.setTokenText = function(\n    tokenText, opt_multi) {\n  if (opt_multi !== undefined ? opt_multi : this.multi_) {\n    var index = this.getTokenIndex_(this.getValue(), this.getCursorPosition());\n\n    // Break up the current input string.\n    var entries = this.splitInput_(this.getValue());\n\n    // Get the new value, ignoring whitespace associated with the entry.\n    var replaceValue = tokenText;\n\n    // Only add punctuation if there isn't already a separator available.\n    if (this.separatorCheck_ && !this.separatorCheck_.test(replaceValue)) {\n      replaceValue =\n          goog.string.trimRight(replaceValue) + this.defaultSeparator_;\n    }\n\n    // Ensure there's whitespace wrapping the entries, if whitespaceWrapEntries_\n    // has been set to true.\n    if (this.whitespaceWrapEntries_) {\n      if (index != 0 && !goog.string.isEmptyOrWhitespace(entries[index - 1])) {\n        replaceValue = ' ' + replaceValue;\n      }\n      // Add a space only if it's the last token; otherwise, we assume the\n      // next token already has the proper spacing.\n      if (index == entries.length - 1) {\n        replaceValue = replaceValue + ' ';\n      }\n    }\n\n    // If the token needs changing, then update the input box and move the\n    // cursor to the correct position.\n    if (replaceValue != entries[index]) {\n      // Replace the value in the array.\n      entries[index] = replaceValue;\n\n      var el = this.activeElement_;\n      // If there is an uncommitted IME in Firefox or IE 9, setting the value\n      // fails and results in actually clearing the value that's already in the\n      // input.\n      // The FF bug is http://bugzilla.mozilla.org/show_bug.cgi?id=549674\n      // Blurring before setting the value works around this problem. We'd like\n      // to do this only if there is an uncommitted IME, but this isn't possible\n      // to detect. Since text editing is finicky we restrict this\n      // workaround to Firefox and IE 9 where it's necessary.\n      // (Note: this has been fixed in Edge and since FF 41)\n      if (goog.userAgent.GECKO ||\n          (goog.userAgent.IE && goog.userAgent.isVersionOrHigher('9'))) {\n        el.blur();\n      }\n      // Join the array and replace the contents of the input.\n      el.value = entries.join('');\n\n      // Calculate which position to put the cursor at.\n      var pos = 0;\n      for (var i = 0; i <= index; i++) {\n        pos += entries[i].length;\n      }\n\n      // Set the cursor.\n      el.focus();\n      this.setCursorPosition(pos);\n    }\n  } else {\n    this.setValue(tokenText);\n  }\n\n  // Avoid triggering an autocomplete just because the value changed.\n  this.rowJustSelected_ = true;\n};\n\n\n/** @override */\ngoog.ui.ac.InputHandler.prototype.disposeInternal = function() {\n  goog.ui.ac.InputHandler.superClass_.disposeInternal.call(this);\n  if (this.activeTimeoutId_ != null) {\n    // Need to check against null explicitly because 0 is a valid value.\n    window.clearTimeout(this.activeTimeoutId_);\n  }\n  this.eh_.dispose();\n  delete this.eh_;\n  this.activateHandler_.dispose();\n  this.keyHandler_.dispose();\n  goog.dispose(this.timer_);\n};\n\n\n/**\n * Sets the entry separator characters.\n *\n * @param {string} separators The separator characters to set.\n * @param {string=} opt_defaultSeparators The defaultSeparator character to set.\n */\ngoog.ui.ac.InputHandler.prototype.setSeparators = function(\n    separators, opt_defaultSeparators) {\n  this.separators_ = separators;\n  this.defaultSeparator_ = (opt_defaultSeparators != null) ?\n      opt_defaultSeparators :\n      this.separators_.substring(0, 1);\n\n  var wspaceExp = this.multi_ ? '[\\\\s' + this.separators_ + ']+' : '[\\\\s]+';\n\n  this.trimmer_ = new RegExp('^' + wspaceExp + '|' + wspaceExp + '$', 'g');\n  this.separatorCheck_ = new RegExp('\\\\s*[' + this.separators_ + ']$');\n};\n\n\n/**\n * Sets whether to flip the orientation of up & down for hiliting next\n * and previous autocomplete entries.\n * @param {boolean} upsideDown Whether the orientation is upside down.\n */\ngoog.ui.ac.InputHandler.prototype.setUpsideDown = function(upsideDown) {\n  this.upsideDown_ = upsideDown;\n};\n\n\n/**\n * Sets whether auto-completed tokens should be wrapped with whitespace.\n * @param {boolean} newValue boolean value indicating whether or not\n *     auto-completed tokens should be wrapped with whitespace.\n */\ngoog.ui.ac.InputHandler.prototype.setWhitespaceWrapEntries = function(\n    newValue) {\n  this.whitespaceWrapEntries_ = newValue;\n};\n\n\n/**\n * Sets whether new tokens should be generated from literals.  That is, should\n * hello'world be two tokens, assuming ' is a literal?\n * @param {boolean} newValue boolean value indicating whether or not\n * new tokens should be generated from literals.\n */\ngoog.ui.ac.InputHandler.prototype.setGenerateNewTokenOnLiteral = function(\n    newValue) {\n  this.generateNewTokenOnLiteral_ = newValue;\n};\n\n\n/**\n * Sets the regular expression used to trim the tokens before passing them to\n * the matcher:  every substring that matches the given regular expression will\n * be removed.  This can also be set to null to disable trimming.\n * @param {?RegExp} trimmer Regexp to use for trimming or null to disable it.\n */\ngoog.ui.ac.InputHandler.prototype.setTrimmingRegExp = function(trimmer) {\n  this.trimmer_ = trimmer;\n};\n\n\n/**\n * Sets the regular expression used to check whether the replacement (used to\n * update the text area after a row is selected) ends with a separator. This can\n * be set to null if the input handler should never automatically append a\n * separator to the replacement string.\n * @param {?RegExp} separatorCheck Regexp to use for checking whether the\n *     replacement ends with a separator.\n */\ngoog.ui.ac.InputHandler.prototype.setEndsWithSeparatorRegExp = function(\n    separatorCheck) {\n  this.separatorCheck_ = separatorCheck;\n};\n\n\n/**\n * Sets whether we will prevent the default input behavior (moving focus to the\n * next focusable  element) on TAB.\n * @param {boolean} newValue Whether to preventDefault on TAB.\n */\ngoog.ui.ac.InputHandler.prototype.setPreventDefaultOnTab = function(newValue) {\n  this.preventDefaultOnTab_ = newValue;\n};\n\n\n/**\n * Sets whether we will prevent highlighted item selection on TAB.\n * @param {boolean} newValue Whether to prevent selection on TAB.\n */\ngoog.ui.ac.InputHandler.prototype.setPreventSelectionOnTab = function(\n    newValue) {\n  this.preventSelectionOnTab_ = newValue;\n};\n\n\n/**\n * Sets whether separators perform autocomplete.\n * @param {boolean} newValue Whether to autocomplete on separators.\n */\ngoog.ui.ac.InputHandler.prototype.setSeparatorCompletes = function(newValue) {\n  this.separatorUpdates_ = newValue;\n  this.separatorSelects_ = newValue;\n};\n\n\n/**\n * Sets whether separators perform autocomplete.\n * @param {boolean} newValue Whether to autocomplete on separators.\n */\ngoog.ui.ac.InputHandler.prototype.setSeparatorSelects = function(newValue) {\n  this.separatorSelects_ = newValue;\n};\n\n\n/**\n * Gets the time to wait before updating the results. If the update during\n * typing flag is switched on, this delay counts from the last update,\n * otherwise from the last keypress.\n * @return {number} Throttle time in milliseconds.\n */\ngoog.ui.ac.InputHandler.prototype.getThrottleTime = function() {\n  return this.timer_ ? this.timer_.getInterval() : -1;\n};\n\n\n/**\n * Sets whether a row has just been selected.\n * @param {boolean} justSelected Whether or not the row has just been selected.\n */\ngoog.ui.ac.InputHandler.prototype.setRowJustSelected = function(justSelected) {\n  this.rowJustSelected_ = justSelected;\n};\n\n\n/**\n * Sets the time to wait before updating the results.\n * @param {number} time New throttle time in milliseconds.\n */\ngoog.ui.ac.InputHandler.prototype.setThrottleTime = function(time) {\n  if (time < 0) {\n    this.timer_.dispose();\n    this.timer_ = null;\n    return;\n  }\n  if (this.timer_) {\n    this.timer_.setInterval(time);\n  } else {\n    this.timer_ = new goog.Timer(time);\n  }\n};\n\n\n/**\n * Gets whether the result list is updated during typing.\n * @return {boolean} Value of the flag.\n */\ngoog.ui.ac.InputHandler.prototype.getUpdateDuringTyping = function() {\n  return this.updateDuringTyping_;\n};\n\n\n/**\n * Sets whether the result list should be updated during typing.\n * @param {boolean} value New value of the flag.\n */\ngoog.ui.ac.InputHandler.prototype.setUpdateDuringTyping = function(value) {\n  this.updateDuringTyping_ = value;\n};\n\n\n/**\n * Handles a key event.\n * @param {goog.events.BrowserEvent} e Browser event object.\n * @return {boolean} True if the key event was handled.\n * @protected\n */\ngoog.ui.ac.InputHandler.prototype.handleKeyEvent = function(e) {\n  switch (e.keyCode) {\n    // If the menu is open and 'down' caused a change then prevent the default\n    // action and prevent scrolling.  If the box isn't a multi autocomplete\n    // and the menu isn't open, we force it open now.\n    case goog.events.KeyCodes.DOWN:\n      if (this.ac_.isOpen()) {\n        this.moveDown_();\n        e.preventDefault();\n        return true;\n\n      } else if (!this.multi_) {\n        this.update(true);\n        e.preventDefault();\n        return true;\n      }\n      break;\n\n    // If the menu is open and 'up' caused a change then prevent the default\n    // action and prevent scrolling.\n    case goog.events.KeyCodes.UP:\n      if (this.ac_.isOpen()) {\n        this.moveUp_();\n        e.preventDefault();\n        return true;\n      }\n      break;\n\n    // If tab key is pressed, select the current highlighted item.  The default\n    // action is also prevented if the input is a multi input, to prevent the\n    // user tabbing out of the field.\n    case goog.events.KeyCodes.TAB:\n      if (this.ac_.isOpen() && !e.shiftKey && !this.preventSelectionOnTab_) {\n        // Ensure the menu is up to date before completing.\n        this.update();\n        if (this.ac_.selectHilited() && this.preventDefaultOnTab_) {\n          e.preventDefault();\n          return true;\n        }\n      } else {\n        this.ac_.dismiss();\n      }\n      break;\n\n    // On enter, just select the highlighted row.\n    case goog.events.KeyCodes.ENTER:\n      if (this.ac_.isOpen()) {\n        // Ensure the menu is up to date before completing.\n        this.update();\n        if (this.ac_.selectHilited()) {\n          e.preventDefault();\n          e.stopPropagation();\n          return true;\n        }\n      } else {\n        this.ac_.dismiss();\n      }\n      break;\n\n    // On escape tell the autocomplete to dismiss.\n    case goog.events.KeyCodes.ESC:\n      if (this.ac_.isOpen()) {\n        this.ac_.dismiss();\n        e.preventDefault();\n        e.stopPropagation();\n        return true;\n      }\n      break;\n\n    // The IME keycode indicates an IME sequence has started, we ignore all\n    // changes until we get an enter key-up.\n    case goog.events.KeyCodes.WIN_IME:\n      if (!this.waitingForIme_) {\n        this.startWaitingForIme_();\n        return true;\n      }\n      break;\n\n    default:\n      if (this.timer_ && !this.updateDuringTyping_) {\n        // Waits throttle time before sending the request again.\n        this.timer_.stop();\n        this.timer_.start();\n      }\n  }\n\n  return this.handleSeparator_(e);\n};\n\n\n/**\n * Handles a key event for a separator key.\n * @param {goog.events.BrowserEvent} e Browser event object.\n * @return {boolean} True if the key event was handled.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.handleSeparator_ = function(e) {\n  var isSeparatorKey = this.multi_ && e.charCode &&\n      this.separators_.indexOf(String.fromCharCode(e.charCode)) != -1;\n  if (this.separatorUpdates_ && isSeparatorKey) {\n    this.update();\n  }\n  if (this.separatorSelects_ && isSeparatorKey) {\n    if (this.ac_.selectHilited()) {\n      e.preventDefault();\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * @return {boolean} Whether this inputhandler need to listen on key-up.\n * @protected\n */\ngoog.ui.ac.InputHandler.prototype.needKeyUpListener = function() {\n  return false;\n};\n\n\n/**\n * Handles the key up event. Registered only if needKeyUpListener returns true.\n * @param {goog.events.Event} e The keyup event.\n * @return {boolean} Whether an action was taken or not.\n * @protected\n */\ngoog.ui.ac.InputHandler.prototype.handleKeyUp = function(e) {\n  return false;\n};\n\n\n/**\n * Adds the necessary input event handlers.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.addEventHandlers_ = function() {\n  this.keyHandler_.attach(this.activeElement_);\n  this.eh_.listen(\n      this.keyHandler_, goog.events.KeyHandler.EventType.KEY, this.onKey_);\n  if (this.needKeyUpListener()) {\n    this.eh_.listen(\n        this.activeElement_, goog.events.EventType.KEYUP, this.handleKeyUp);\n  }\n  this.eh_.listen(\n      this.activeElement_, goog.events.EventType.MOUSEDOWN, this.onMouseDown_);\n\n  // IE6 also needs a keypress to check if the user typed a separator\n  if (goog.userAgent.IE) {\n    this.eh_.listen(\n        this.activeElement_, goog.events.EventType.KEYPRESS,\n        this.onIeKeyPress_);\n  }\n};\n\n\n/**\n * Removes the necessary input event handlers.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.removeEventHandlers_ = function() {\n  this.eh_.unlisten(\n      this.keyHandler_, goog.events.KeyHandler.EventType.KEY, this.onKey_);\n  this.keyHandler_.detach();\n  this.eh_.unlisten(\n      this.activeElement_, goog.events.EventType.KEYUP, this.handleKeyUp);\n  this.eh_.unlisten(\n      this.activeElement_, goog.events.EventType.MOUSEDOWN, this.onMouseDown_);\n\n  if (goog.userAgent.IE) {\n    this.eh_.unlisten(\n        this.activeElement_, goog.events.EventType.KEYPRESS,\n        this.onIeKeyPress_);\n  }\n\n  if (this.waitingForIme_) {\n    this.stopWaitingForIme_();\n  }\n};\n\n\n/**\n * Handles an element getting focus.\n * @param {goog.events.Event} e Browser event object.\n * @protected\n */\ngoog.ui.ac.InputHandler.prototype.handleFocus = function(e) {\n  this.processFocus(/** @type {Element} */ (e.target || null));\n};\n\n\n/**\n * Registers handlers for the active element when it receives focus.\n * @param {Element} target The element to focus.\n * @protected\n */\ngoog.ui.ac.InputHandler.prototype.processFocus = function(target) {\n  this.activateHandler_.removeAll();\n\n  if (this.ac_) {\n    this.ac_.cancelDelayedDismiss();\n  }\n\n  // Double-check whether the active element has actually changed.\n  // This is a fix for Safari 3, which fires spurious focus events.\n  if (target != this.activeElement_) {\n    this.activeElement_ = target;\n    if (this.timer_) {\n      this.timer_.start();\n      this.eh_.listen(this.timer_, goog.Timer.TICK, this.onTick_);\n    }\n    this.lastValue_ = this.getValue();\n    this.addEventHandlers_();\n  }\n};\n\n\n/**\n * Handles an element blurring.\n * @param {goog.events.Event=} opt_e Browser event object.\n * @protected\n */\ngoog.ui.ac.InputHandler.prototype.handleBlur = function(opt_e) {\n  // Phones running iOS prior to version 4.2.\n  if (goog.ui.ac.InputHandler.REQUIRES_ASYNC_BLUR_) {\n    // @bug 4484488 This is required so that the menu works correctly on\n    // iOS prior to version 4.2. Otherwise, the blur action closes the menu\n    // before the menu button click can be processed.\n    // In order to fix the bug, we set a timeout to process the blur event, so\n    // that any pending selection event can be processed first.\n    this.activeTimeoutId_ =\n        window.setTimeout(goog.bind(this.processBlur, this), 0);\n    return;\n  } else {\n    this.processBlur();\n  }\n};\n\n\n/**\n * Helper function that does the logic to handle an element blurring.\n * @protected\n */\ngoog.ui.ac.InputHandler.prototype.processBlur = function() {\n  // it's possible that a blur event could fire when there's no active element,\n  // in the case where attachInput was called on an input that already had\n  // the focus\n  if (this.activeElement_) {\n    this.removeEventHandlers_();\n    this.activeElement_ = null;\n\n    if (this.timer_) {\n      this.timer_.stop();\n      this.eh_.unlisten(this.timer_, goog.Timer.TICK, this.onTick_);\n    }\n\n    if (this.ac_) {\n      // Pause dismissal slightly to take into account any other events that\n      // might fire on the renderer (e.g. a click will lose the focus).\n      this.ac_.dismissOnDelay();\n    }\n  }\n};\n\n\n/**\n * Handles the timer's tick event.  Calculates the current token, and reports\n * any update to the autocomplete.\n * @param {goog.events.Event} e Browser event object.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.onTick_ = function(e) {\n  this.update();\n};\n\n\n/**\n * Handles typing in an inactive input element. Activate it.\n * @param {goog.events.BrowserEvent} e Browser event object.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.onKeyDownOnInactiveElement_ = function(e) {\n  this.handleFocus(e);\n};\n\n\n/**\n * Handles typing in the active input element.  Checks if the key is a special\n * key and does the relevant action as appropriate.\n * @param {goog.events.BrowserEvent} e Browser event object.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.onKey_ = function(e) {\n  this.lastKeyCode_ = e.keyCode;\n  if (this.ac_) {\n    this.handleKeyEvent(e);\n  }\n};\n\n\n/**\n * Handles a KEYPRESS event generated by typing in the active input element.\n * Checks if IME input is ended.\n * @param {goog.events.BrowserEvent} e Browser event object.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.onKeyPress_ = function(e) {\n  if (this.waitingForIme_ &&\n      this.lastKeyCode_ != goog.events.KeyCodes.WIN_IME) {\n    this.stopWaitingForIme_();\n  }\n};\n\n\n/**\n * Handles the key-up event.  This is only ever used by Mac FF or when we are in\n * an IME entry scenario.\n * @param {goog.events.BrowserEvent} e Browser event object.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.onKeyUp_ = function(e) {\n  if (this.waitingForIme_ &&\n      (e.keyCode == goog.events.KeyCodes.ENTER ||\n       (e.keyCode == goog.events.KeyCodes.M && e.ctrlKey))) {\n    this.stopWaitingForIme_();\n  }\n};\n\n\n/**\n * Handles mouse-down event.\n * @param {goog.events.BrowserEvent} e Browser event object.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.onMouseDown_ = function(e) {\n  if (this.ac_) {\n    this.handleMouseDown(e);\n  }\n};\n\n\n/**\n * For subclasses to override to handle the mouse-down event.\n * @param {goog.events.BrowserEvent} e Browser event object.\n * @protected\n */\ngoog.ui.ac.InputHandler.prototype.handleMouseDown = function(e) {};\n\n\n/**\n * Starts waiting for IME.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.startWaitingForIme_ = function() {\n  if (this.waitingForIme_) {\n    return;\n  }\n  this.eh_.listen(\n      this.activeElement_, goog.events.EventType.KEYUP, this.onKeyUp_);\n  this.eh_.listen(\n      this.activeElement_, goog.events.EventType.KEYPRESS, this.onKeyPress_);\n  this.waitingForIme_ = true;\n};\n\n\n/**\n * Stops waiting for IME.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.stopWaitingForIme_ = function() {\n  if (!this.waitingForIme_) {\n    return;\n  }\n  this.waitingForIme_ = false;\n  this.eh_.unlisten(\n      this.activeElement_, goog.events.EventType.KEYPRESS, this.onKeyPress_);\n  this.eh_.unlisten(\n      this.activeElement_, goog.events.EventType.KEYUP, this.onKeyUp_);\n};\n\n\n/**\n * Handles the key-press event for IE, checking to see if the user typed a\n * separator character.\n * @param {goog.events.BrowserEvent} e Browser event object.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.onIeKeyPress_ = function(e) {\n  this.handleSeparator_(e);\n};\n\n\n/**\n * Checks if an update has occurred and notified the autocomplete of the new\n * token.\n * @param {boolean=} opt_force If true the menu will be forced to update.\n */\ngoog.ui.ac.InputHandler.prototype.update = function(opt_force) {\n  if (this.activeElement_ &&\n      (opt_force || this.getValue() != this.lastValue_)) {\n    if (opt_force || !this.rowJustSelected_) {\n      var token = this.parseToken();\n\n      if (this.ac_) {\n        this.ac_.setTarget(this.activeElement_);\n        this.ac_.setToken(token, this.getValue());\n      }\n    }\n    this.lastValue_ = this.getValue();\n  }\n  this.rowJustSelected_ = false;\n};\n\n\n/**\n * Parses a text area or input box for the currently highlighted token.\n * @return {string} Token to complete.\n * @protected\n */\ngoog.ui.ac.InputHandler.prototype.parseToken = function() {\n  return this.parseToken_();\n};\n\n\n/**\n * Moves hilite up.  May hilite next or previous depending on orientation.\n * @return {boolean} True if successful.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.moveUp_ = function() {\n  return this.upsideDown_ ? this.ac_.hiliteNext() : this.ac_.hilitePrev();\n};\n\n\n/**\n * Moves hilite down.  May hilite next or previous depending on orientation.\n * @return {boolean} True if successful.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.moveDown_ = function() {\n  return this.upsideDown_ ? this.ac_.hilitePrev() : this.ac_.hiliteNext();\n};\n\n\n/**\n * Parses a text area or input box for the currently highlighted token.\n * @return {string} Token to complete.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.parseToken_ = function() {\n  var caret = this.getCursorPosition();\n  var text = this.getValue();\n  return this.trim_(this.splitInput_(text)[this.getTokenIndex_(text, caret)]);\n};\n\n\n/**\n * Trims a token of characters that we want to ignore\n * @param {string} text string to trim.\n * @return {string} Trimmed string.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.trim_ = function(text) {\n  return this.trimmer_ ? String(text).replace(this.trimmer_, '') : text;\n};\n\n\n/**\n * Gets the index of the currently highlighted token\n * @param {string} text string to parse.\n * @param {number} caret Position of cursor in string.\n * @return {number} Index of token.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.getTokenIndex_ = function(text, caret) {\n  // Split up the input string into multiple entries\n  var entries = this.splitInput_(text);\n\n  // Short-circuit to select the last entry\n  if (caret == text.length) return entries.length - 1;\n\n  // Calculate which of the entries the cursor is currently in\n  var current = 0;\n  for (var i = 0, pos = 0; i < entries.length && pos <= caret; i++) {\n    pos += entries[i].length;\n    current = i;\n  }\n\n  // Get the token for the current item\n  return current;\n};\n\n\n/**\n * Splits an input string of text at the occurrence of a character in\n * {@link goog.ui.ac.InputHandler.prototype.separators_} and creates\n * an array of tokens.  Each token may contain additional whitespace and\n * formatting marks.  If necessary use\n * {@link goog.ui.ac.InputHandler.prototype.trim_} to clean up the\n * entries.\n *\n * @param {string} text Input text.\n * @return {!Array<string>} Parsed array.\n * @private\n */\ngoog.ui.ac.InputHandler.prototype.splitInput_ = function(text) {\n  if (!this.multi_) {\n    return [text];\n  }\n\n  var arr = String(text).split('');\n  var parts = [];\n  var cache = [];\n\n  for (var i = 0, inLiteral = false; i < arr.length; i++) {\n    if (this.literals_ && this.literals_.indexOf(arr[i]) != -1) {\n      if (this.generateNewTokenOnLiteral_ && !inLiteral) {\n        parts.push(cache.join(''));\n        cache.length = 0;\n      }\n      cache.push(arr[i]);\n      inLiteral = !inLiteral;\n\n    } else if (!inLiteral && this.separators_.indexOf(arr[i]) != -1) {\n      cache.push(arr[i]);\n      parts.push(cache.join(''));\n      cache.length = 0;\n\n    } else {\n      cache.push(arr[i]);\n    }\n  }\n  parts.push(cache.join(''));\n\n  return parts;\n};\n","^17",1579837703000,"^18",["^19",["^1T","^2L","^5F","^2N","^2P","^2D","^2U","^5H","^Z","^2X","^2Z","^4K","^5@","~$goog.dom.selection","^34"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/ac/inputhandler.js"],"^1J",["^19",["~$goog.ui.ac.InputHandler"]],"^X",true,"^Y",["^Z","^4K","^5F","^2P","^2U","^5@","^1T","^5V","^2L","^2Z","^34","^5H","^2D","^2X","^2N"]],["^ ","^[",[1579837703000],"^10","goog.ui.imagelessmenubuttonrenderer.js","^11",["^12","goog/ui/imagelessmenubuttonrenderer.js"],"^13","goog/ui/imagelessmenubuttonrenderer.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An alternative custom button renderer that uses even more CSS\n * voodoo than the default implementation to render custom buttons with fake\n * rounded corners and dimensionality (via a subtle flat shadow on the bottom\n * half of the button) without the use of images.\n *\n * Based on the Custom Buttons 3.1 visual specification, see\n * http://go/custombuttons\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/imagelessmenubutton.html\n */\n\ngoog.provide('goog.ui.ImagelessMenuButtonRenderer');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.ui.INLINE_BLOCK_CLASSNAME');\ngoog.require('goog.ui.MenuButton');\ngoog.require('goog.ui.MenuButtonRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Custom renderer for {@link goog.ui.MenuButton}s. Imageless buttons can\n * contain almost arbitrary HTML content, will flow like inline elements, but\n * can be styled like block-level elements.\n *\n * @deprecated These contain a lot of unnecessary DOM for modern user agents.\n *     Please use a simpler button renderer like css3buttonrenderer.\n * @constructor\n * @extends {goog.ui.MenuButtonRenderer}\n * @final\n */\ngoog.ui.ImagelessMenuButtonRenderer = function() {\n  goog.ui.MenuButtonRenderer.call(this);\n};\ngoog.inherits(goog.ui.ImagelessMenuButtonRenderer, goog.ui.MenuButtonRenderer);\ngoog.addSingletonGetter(goog.ui.ImagelessMenuButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.ImagelessMenuButtonRenderer.CSS_CLASS =\n    goog.getCssName('goog-imageless-button');\n\n\n/** @override */\ngoog.ui.ImagelessMenuButtonRenderer.prototype.getContentElement = function(\n    element) {\n  if (element) {\n    var captionElem = goog.dom.getElementsByTagNameAndClass(\n        '*', goog.getCssName(this.getCssClass(), 'caption'), element)[0];\n    return captionElem;\n  }\n  return null;\n};\n\n\n/**\n * Returns true if this renderer can decorate the element.  Overrides\n * {@link goog.ui.MenuButtonRenderer#canDecorate} by returning true if the\n * element is a DIV, false otherwise.\n * @param {Element} element Element to decorate.\n * @return {boolean} Whether the renderer can decorate the element.\n * @override\n */\ngoog.ui.ImagelessMenuButtonRenderer.prototype.canDecorate = function(element) {\n  return element.tagName == goog.dom.TagName.DIV;\n};\n\n\n/**\n * Takes a text caption or existing DOM structure, and returns the content\n * wrapped in a pseudo-rounded-corner box.  Creates the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-imageless-button\">\n *      <div class=\"goog-inline-block goog-imageless-button-outer-box\">\n *        <div class=\"goog-imageless-button-inner-box\">\n *          <div class=\"goog-imageless-button-pos-box\">\n *            <div class=\"goog-imageless-button-top-shadow\">&nbsp;</div>\n *            <div class=\"goog-imageless-button-content\n *                        goog-imageless-menubutton-caption\">Contents...\n *            </div>\n *            <div class=\"goog-imageless-menubutton-dropdown\"></div>\n *          </div>\n *        </div>\n *      </div>\n *    </div>\n *\n * Used by both {@link #createDom} and {@link #decorate}.  To be overridden\n * by subclasses.\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to wrap\n *     in a box.\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {!Element} Pseudo-rounded-corner box containing the content.\n * @override\n */\ngoog.ui.ImagelessMenuButtonRenderer.prototype.createButton = function(\n    content, dom) {\n  var baseClass = this.getCssClass();\n  var inlineBlock = goog.ui.INLINE_BLOCK_CLASSNAME + ' ';\n  return dom.createDom(\n      goog.dom.TagName.DIV,\n      inlineBlock + goog.getCssName(baseClass, 'outer-box'),\n      dom.createDom(\n          goog.dom.TagName.DIV,\n          inlineBlock + goog.getCssName(baseClass, 'inner-box'),\n          dom.createDom(\n              goog.dom.TagName.DIV, goog.getCssName(baseClass, 'pos'),\n              dom.createDom(\n                  goog.dom.TagName.DIV,\n                  goog.getCssName(baseClass, 'top-shadow'), '\\u00A0'),\n              dom.createDom(\n                  goog.dom.TagName.DIV,\n                  [\n                    goog.getCssName(baseClass, 'content'),\n                    goog.getCssName(baseClass, 'caption'),\n                    goog.getCssName('goog-inline-block')\n                  ],\n                  content),\n              dom.createDom(goog.dom.TagName.DIV, [\n                goog.getCssName(baseClass, 'dropdown'),\n                goog.getCssName('goog-inline-block')\n              ]))));\n};\n\n\n/**\n * Check if the button's element has a box structure.\n * @param {goog.ui.Button} button Button instance whose structure is being\n *     checked.\n * @param {Element} element Element of the button.\n * @return {boolean} Whether the element has a box structure.\n * @protected\n * @override\n */\ngoog.ui.ImagelessMenuButtonRenderer.prototype.hasBoxStructure = function(\n    button, element) {\n  var outer = button.getDomHelper().getFirstElementChild(element);\n  var outerClassName = goog.getCssName(this.getCssClass(), 'outer-box');\n  if (outer && goog.dom.classlist.contains(outer, outerClassName)) {\n    var inner = button.getDomHelper().getFirstElementChild(outer);\n    var innerClassName = goog.getCssName(this.getCssClass(), 'inner-box');\n    if (inner && goog.dom.classlist.contains(inner, innerClassName)) {\n      var pos = button.getDomHelper().getFirstElementChild(inner);\n      var posClassName = goog.getCssName(this.getCssClass(), 'pos');\n      if (pos && goog.dom.classlist.contains(pos, posClassName)) {\n        var shadow = button.getDomHelper().getFirstElementChild(pos);\n        var shadowClassName = goog.getCssName(this.getCssClass(), 'top-shadow');\n        if (shadow && goog.dom.classlist.contains(shadow, shadowClassName)) {\n          var content = button.getDomHelper().getNextElementSibling(shadow);\n          var contentClassName = goog.getCssName(this.getCssClass(), 'content');\n          if (content &&\n              goog.dom.classlist.contains(content, contentClassName)) {\n            // We have a proper box structure.\n            return true;\n          }\n        }\n      }\n    }\n  }\n  return false;\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.ImagelessMenuButtonRenderer.prototype.getCssClass = function() {\n  return goog.ui.ImagelessMenuButtonRenderer.CSS_CLASS;\n};\n\n\n// Register a decorator factory function for\n// goog.ui.ImagelessMenuButtonRenderer. Since we're using goog-imageless-button\n// as the base class in order to get the same styling as\n// goog.ui.ImagelessButtonRenderer, we need to be explicit about giving\n// goog-imageless-menu-button here.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.getCssName('goog-imageless-menu-button'), function() {\n      return new goog.ui.MenuButton(\n          null, null, goog.ui.ImagelessMenuButtonRenderer.getInstance());\n    });\n","^17",1579837703000,"^18",["^19",["^1T","^2O","^3@","^Z","~$goog.ui.MenuButtonRenderer","^3A","~$goog.ui.INLINE-BLOCK-CLASSNAME","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/imagelessmenubuttonrenderer.js"],"^1J",["^19",["~$goog.ui.ImagelessMenuButtonRenderer"]],"^X",true,"^Y",["^Z","^1T","^1V","^2O","^5Y","^3@","^5X","^3A"]],["^ ","^[",[1579837703000],"^10","goog.messaging.loggerclient.js","^11",["^12","goog/messaging/loggerclient.js"],"^13","goog/messaging/loggerclient.js","^14","^15","^16","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This class sends logging messages over a message channel to a\n * server on the main page that prints them using standard logging mechanisms.\n *\n */\n\ngoog.provide('goog.messaging.LoggerClient');\n\ngoog.forwardDeclare('goog.messaging.MessageChannel');\ngoog.require('goog.Disposable');\ngoog.require('goog.debug');\ngoog.require('goog.debug.LogManager');\ngoog.require('goog.debug.Logger');\n\n\n\n/**\n * Creates a logger client that sends messages along a message channel for the\n * remote end to log. The remote end of the channel should use a\n * {goog.messaging.LoggerServer} with the same service name.\n *\n * @param {!goog.messaging.MessageChannel} channel The channel that on which to\n *     send the log messages.\n * @param {string} serviceName The name of the logging service to use.\n * @constructor\n * @extends {goog.Disposable}\n * @final\n */\ngoog.messaging.LoggerClient = function(channel, serviceName) {\n  if (goog.messaging.LoggerClient.instance_) {\n    return goog.messaging.LoggerClient.instance_;\n  }\n\n  goog.messaging.LoggerClient.base(this, 'constructor');\n\n  /**\n   * The channel on which to send the log messages.\n   * @type {!goog.messaging.MessageChannel}\n   * @private\n   */\n  this.channel_ = channel;\n\n  /**\n   * The name of the logging service to use.\n   * @type {string}\n   * @private\n   */\n  this.serviceName_ = serviceName;\n\n  /**\n   * The bound handler function for handling log messages. This is kept in a\n   * variable so that it can be deregistered when the logger client is disposed.\n   * @type {Function}\n   * @private\n   */\n  this.publishHandler_ = goog.bind(this.sendLog_, this);\n  goog.debug.LogManager.getRoot().addHandler(this.publishHandler_);\n\n  goog.messaging.LoggerClient.instance_ = this;\n};\ngoog.inherits(goog.messaging.LoggerClient, goog.Disposable);\n\n\n/**\n * The singleton instance, if any.\n * @type {?goog.messaging.LoggerClient}\n * @private\n */\ngoog.messaging.LoggerClient.instance_ = null;\n\n\n/**\n * Sends a log message through the channel.\n * @param {!goog.debug.LogRecord} logRecord The log message.\n * @private\n */\ngoog.messaging.LoggerClient.prototype.sendLog_ = function(logRecord) {\n  var name = logRecord.getLoggerName();\n  var level = logRecord.getLevel();\n  var msg = logRecord.getMessage();\n  var originalException = logRecord.getException();\n\n  var exception;\n  if (originalException) {\n    var normalizedException =\n        goog.debug.normalizeErrorObject(originalException);\n    exception = {\n      'name': normalizedException.name,\n      'message': normalizedException.message,\n      'lineNumber': normalizedException.lineNumber,\n      'fileName': normalizedException.fileName,\n      // Normalized exceptions without a stack have 'stack' set to 'Not\n      // available', so we check for the existence of 'stack' on the original\n      // exception instead.\n      'stack': originalException.stack ||\n          goog.debug.getStacktrace(goog.debug.Logger.prototype.log)\n    };\n\n    if (goog.isObject(originalException)) {\n      // Add messageN to the exception in case it was added using\n      // goog.debug.enhanceError.\n      for (var i = 0; 'message' + i in originalException; i++) {\n        exception['message' + i] = String(originalException['message' + i]);\n      }\n    }\n  }\n  this.channel_.send(this.serviceName_, {\n    'name': name,\n    'level': level.value,\n    'message': msg,\n    'exception': exception\n  });\n};\n\n\n/** @override */\ngoog.messaging.LoggerClient.prototype.disposeInternal = function() {\n  goog.messaging.LoggerClient.base(this, 'disposeInternal');\n  goog.debug.LogManager.getRoot().removeHandler(this.publishHandler_);\n  delete this.channel_;\n  goog.messaging.LoggerClient.instance_ = null;\n};\n","^17",1579837703000,"^18",["^19",["~$goog.debug.LogManager","^Z","~$goog.debug.Logger","~$goog.debug","^4K"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/loggerclient.js"],"^1J",["^19",["~$goog.messaging.LoggerClient"]],"^X",true,"^Y",["^Z","^4K","^61","^5[","^60"]],["^ ","^[",[1579837703000],"^10","goog.vec.ray.js","^11",["^12","goog/vec/ray.js"],"^13","goog/vec/ray.js","^14","^15","^16","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implements a 3D ray that are compatible with WebGL.\n * Each element is a float64 in case high precision is required.\n * The API is structured to avoid unnecessary memory allocations.\n * The last parameter will typically be the output vector and an\n * object can be both an input and output parameter to all methods\n * except where noted.\n *\n */\ngoog.provide('goog.vec.Ray');\n\ngoog.require('goog.vec.Vec3');\n\n\n\n/**\n * Constructs a new ray with an optional origin and direction. If not specified,\n * the default is [0, 0, 0].\n * @param {goog.vec.Vec3.AnyType=} opt_origin The optional origin.\n * @param {goog.vec.Vec3.AnyType=} opt_dir The optional direction.\n * @constructor\n * @final\n */\ngoog.vec.Ray = function(opt_origin, opt_dir) {\n  /**\n   * @type {goog.vec.Vec3.Float64}\n   */\n  this.origin = goog.vec.Vec3.createFloat64();\n  if (opt_origin) {\n    goog.vec.Vec3.setFromArray(this.origin, opt_origin);\n  }\n\n  /**\n   * @type {goog.vec.Vec3.Float64}\n   */\n  this.dir = goog.vec.Vec3.createFloat64();\n  if (opt_dir) {\n    goog.vec.Vec3.setFromArray(this.dir, opt_dir);\n  }\n};\n\n\n/**\n * Sets the origin and direction of the ray.\n * @param {goog.vec.AnyType} origin The new origin.\n * @param {goog.vec.AnyType} dir The new direction.\n */\ngoog.vec.Ray.prototype.set = function(origin, dir) {\n  goog.vec.Vec3.setFromArray(this.origin, origin);\n  goog.vec.Vec3.setFromArray(this.dir, dir);\n};\n\n\n/**\n * Sets the origin of the ray.\n * @param {goog.vec.AnyType} origin the new origin.\n */\ngoog.vec.Ray.prototype.setOrigin = function(origin) {\n  goog.vec.Vec3.setFromArray(this.origin, origin);\n};\n\n\n/**\n * Sets the direction of the ray.\n * @param {goog.vec.AnyType} dir The new direction.\n */\ngoog.vec.Ray.prototype.setDir = function(dir) {\n  goog.vec.Vec3.setFromArray(this.dir, dir);\n};\n\n\n/**\n * Returns true if this ray is equal to the other ray.\n * @param {goog.vec.Ray} other The other ray.\n * @return {boolean} True if this ray is equal to the other ray.\n */\ngoog.vec.Ray.prototype.equals = function(other) {\n  return other != null && goog.vec.Vec3.equals(this.origin, other.origin) &&\n      goog.vec.Vec3.equals(this.dir, other.dir);\n};\n","^17",1579837703000,"^18",["^19",["~$goog.vec.Vec3","^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/ray.js"],"^1J",["^19",["~$goog.vec.Ray"]],"^X",true,"^Y",["^Z","^63"]],["^ ","^[",[1579837703000],"^10","goog.ui.tristatemenuitemrenderer.js","^11",["^12","goog/ui/tristatemenuitemrenderer.js"],"^13","goog/ui/tristatemenuitemrenderer.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for {@link goog.ui.TriStateMenuItem}s.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.ui.TriStateMenuItemRenderer');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.ui.MenuItemRenderer');\n\n\n\n/**\n * Default renderer for {@link goog.ui.TriStateMenuItemRenderer}s. Each item has\n * the following structure:\n *\n *    <div class=\"goog-tristatemenuitem\">\n *        <div class=\"goog-tristatemenuitem-checkbox\"></div>\n *        <div>...(content)...</div>\n *    </div>\n *\n * @constructor\n * @extends {goog.ui.MenuItemRenderer}\n * @final\n */\ngoog.ui.TriStateMenuItemRenderer = function() {\n  goog.ui.MenuItemRenderer.call(this);\n};\ngoog.inherits(goog.ui.TriStateMenuItemRenderer, goog.ui.MenuItemRenderer);\ngoog.addSingletonGetter(goog.ui.TriStateMenuItemRenderer);\n\n\n/**\n * CSS class name the renderer applies to menu item elements.\n * @type {string}\n */\ngoog.ui.TriStateMenuItemRenderer.CSS_CLASS =\n    goog.getCssName('goog-tristatemenuitem');\n\n\n/**\n * Overrides {@link goog.ui.ControlRenderer#decorate} by initializing the\n * menu item to checkable based on whether the element to be decorated has\n * extra styling indicating that it should be.\n * @param {goog.ui.Control} item goog.ui.TriStateMenuItem to decorate\n *     the element.\n * @param {Element} element Element to decorate.\n * @return {!Element} Decorated element.\n * @override\n */\ngoog.ui.TriStateMenuItemRenderer.prototype.decorate = function(item, element) {\n  element = goog.ui.TriStateMenuItemRenderer.superClass_.decorate.call(\n      this, item, element);\n  this.setCheckable(item, element, true);\n\n  goog.asserts.assert(element);\n\n  if (goog.dom.classlist.contains(\n          element, goog.getCssName(this.getCssClass(), 'fully-checked'))) {\n    item.setCheckedState(/** @suppress {missingRequire} */\n        goog.ui.TriStateMenuItem.State.FULLY_CHECKED);\n  } else if (\n      goog.dom.classlist.contains(\n          element, goog.getCssName(this.getCssClass(), 'partially-checked'))) {\n    /** @suppress {missingRequire} */\n    item.setCheckedState(goog.ui.TriStateMenuItem.State.PARTIALLY_CHECKED);\n  } else {\n    /** @suppress {missingRequire} */\n    item.setCheckedState(goog.ui.TriStateMenuItem.State.NOT_CHECKED);\n  }\n\n  return element;\n};\n\n\n/** @override */\ngoog.ui.TriStateMenuItemRenderer.prototype.getCssClass = function() {\n  return goog.ui.TriStateMenuItemRenderer.CSS_CLASS;\n};\n","^17",1579837703000,"^18",["^19",["^1S","^2O","^Z","~$goog.ui.MenuItemRenderer"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/tristatemenuitemrenderer.js"],"^1J",["^19",["~$goog.ui.TriStateMenuItemRenderer"]],"^X",true,"^Y",["^Z","^1S","^2O","^65"]],["^ ","^[",[1579837703000],"^10","goog.labs.i18n.listsymbols.js","^11",["^12","goog/labs/i18n/listsymbols.js"],"^13","goog/labs/i18n/listsymbols.js","^14","^15","^16","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview List formatting symbols for all locales.\n *\n * This file is autogenerated by script.  See\n * http://go/generate_list_symbols.py using --for_closure\n * File generated from CLDR ver. 34\n *\n * To reduce the file size (which may cause issues in some JS\n * developing environments), this file will only contain locales\n * that are usually supported by Google products. It is a super\n * set of 40 languages. The rest of the data can be found in another file\n * named \"listsymbolsext.js\", which will be generated at the same\n * time as this file.\n * Before checkin, this file could have been manually edited. This is\n * to incorporate changes before we could correct CLDR. All manual\n * modification must be documented in this section, and should be\n * removed after those changes land to CLDR.\n * @suppress {const}\n */\n\n// clang-format off\n\ngoog.provide('goog.labs.i18n.ListFormatSymbols');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_af');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_am');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_DZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_EG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_az');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_be');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bg');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_br');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bs');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ca');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_chr');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_cs');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_cy');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_da');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_de');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_de_AT');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_de_CH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_el');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_AU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_CA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_GB');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_IE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_SG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_US');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_ZA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_419');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_ES');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_MX');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_US');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_et');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_eu');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fa');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fi');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fil');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_CA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ga');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_gl');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_gsw');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_gu');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_haw');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_he');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_hi');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_hr');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_hu');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_hy');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_id');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_in');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_is');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_it');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_iw');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ja');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ka');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kk');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_km');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ko');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ky');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ln');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lo');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lt');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lv');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mk');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ml');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mo');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mr');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ms');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mt');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_my');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nb');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ne');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nl');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_no');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_no_NO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_or');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pa');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pl');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pt');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pt_BR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pt_PT');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ro');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ru');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sh');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_si');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sk');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sl');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sq');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sr');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sr_Latn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sv');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sw');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ta');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_te');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_th');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_tl');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_tr');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_uk');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ur');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_uz');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_vi');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zh');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zh_CN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zh_HK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zh_TW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zu');\n\n\n/**\n * List formatting symbols for locale af.\n */\ngoog.labs.i18n.ListFormatSymbols_af = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} en {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} en {1}'\n};\n\n\n/**\n * List formatting symbols for locale am.\n */\ngoog.labs.i18n.ListFormatSymbols_am = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} እና {1}',\n  LIST_START: '{0}፣ {1}',\n  LIST_MIDDLE: '{0}፣ {1}',\n  LIST_END: '{0}, እና {1}'\n};\n\n\n/**\n * List formatting symbols for locale ar.\n */\ngoog.labs.i18n.ListFormatSymbols_ar = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_DZ.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_DZ = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_EG.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_EG = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale az.\n */\ngoog.labs.i18n.ListFormatSymbols_az = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} və {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} və {1}'\n};\n\n\n/**\n * List formatting symbols for locale be.\n */\ngoog.labs.i18n.ListFormatSymbols_be = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} і {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} і {1}'\n};\n\n\n/**\n * List formatting symbols for locale bg.\n */\ngoog.labs.i18n.ListFormatSymbols_bg = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale bn.\n */\ngoog.labs.i18n.ListFormatSymbols_bn = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} এবং {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} এবং {1}'\n};\n\n\n/**\n * List formatting symbols for locale br.\n */\ngoog.labs.i18n.ListFormatSymbols_br = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale bs.\n */\ngoog.labs.i18n.ListFormatSymbols_bs = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale ca.\n */\ngoog.labs.i18n.ListFormatSymbols_ca = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale chr.\n */\ngoog.labs.i18n.ListFormatSymbols_chr = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ᎠᎴ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, ᎠᎴ {1}'\n};\n\n\n/**\n * List formatting symbols for locale cs.\n */\ngoog.labs.i18n.ListFormatSymbols_cs = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} a {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} a {1}'\n};\n\n\n/**\n * List formatting symbols for locale cy.\n */\ngoog.labs.i18n.ListFormatSymbols_cy = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} a(c) {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, a(c) {1}'\n};\n\n\n/**\n * List formatting symbols for locale da.\n */\ngoog.labs.i18n.ListFormatSymbols_da = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} og {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} og {1}'\n};\n\n\n/**\n * List formatting symbols for locale de.\n */\ngoog.labs.i18n.ListFormatSymbols_de = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} und {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} und {1}'\n};\n\n\n/**\n * List formatting symbols for locale de_AT.\n */\ngoog.labs.i18n.ListFormatSymbols_de_AT = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} und {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} und {1}'\n};\n\n\n/**\n * List formatting symbols for locale de_CH.\n */\ngoog.labs.i18n.ListFormatSymbols_de_CH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} und {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} und {1}'\n};\n\n\n/**\n * List formatting symbols for locale el.\n */\ngoog.labs.i18n.ListFormatSymbols_el = {\n  GENDER_STYLE: 1,\n  LIST_TWO: '{0} και {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} και {1}'\n};\n\n\n/**\n * List formatting symbols for locale en.\n */\ngoog.labs.i18n.ListFormatSymbols_en = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_AU.\n */\ngoog.labs.i18n.ListFormatSymbols_en_AU = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_CA.\n */\ngoog.labs.i18n.ListFormatSymbols_en_CA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_GB.\n */\ngoog.labs.i18n.ListFormatSymbols_en_GB = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_IE.\n */\ngoog.labs.i18n.ListFormatSymbols_en_IE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_en_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_SG.\n */\ngoog.labs.i18n.ListFormatSymbols_en_SG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_US.\n */\ngoog.labs.i18n.ListFormatSymbols_en_US = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_ZA.\n */\ngoog.labs.i18n.ListFormatSymbols_en_ZA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale es.\n */\ngoog.labs.i18n.ListFormatSymbols_es = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_419.\n */\ngoog.labs.i18n.ListFormatSymbols_es_419 = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_ES.\n */\ngoog.labs.i18n.ListFormatSymbols_es_ES = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_MX.\n */\ngoog.labs.i18n.ListFormatSymbols_es_MX = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_US.\n */\ngoog.labs.i18n.ListFormatSymbols_es_US = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale et.\n */\ngoog.labs.i18n.ListFormatSymbols_et = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ja {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ja {1}'\n};\n\n\n/**\n * List formatting symbols for locale eu.\n */\ngoog.labs.i18n.ListFormatSymbols_eu = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} eta {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} eta {1}'\n};\n\n\n/**\n * List formatting symbols for locale fa.\n */\ngoog.labs.i18n.ListFormatSymbols_fa = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} و {1}',\n  LIST_START: '{0}،‏ {1}',\n  LIST_MIDDLE: '{0}،‏ {1}',\n  LIST_END: '{0}، و {1}'\n};\n\n\n/**\n * List formatting symbols for locale fi.\n */\ngoog.labs.i18n.ListFormatSymbols_fi = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ja {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ja {1}'\n};\n\n\n/**\n * List formatting symbols for locale fil.\n */\ngoog.labs.i18n.ListFormatSymbols_fil = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} at {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, at {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr.\n */\ngoog.labs.i18n.ListFormatSymbols_fr = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_CA.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_CA = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale ga.\n */\ngoog.labs.i18n.ListFormatSymbols_ga = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} agus {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, agus {1}'\n};\n\n\n/**\n * List formatting symbols for locale gl.\n */\ngoog.labs.i18n.ListFormatSymbols_gl = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale gsw.\n */\ngoog.labs.i18n.ListFormatSymbols_gsw = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} und {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} und {1}'\n};\n\n\n/**\n * List formatting symbols for locale gu.\n */\ngoog.labs.i18n.ListFormatSymbols_gu = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} અને {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} અને {1}'\n};\n\n\n/**\n * List formatting symbols for locale haw.\n */\ngoog.labs.i18n.ListFormatSymbols_haw = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale he.\n */\ngoog.labs.i18n.ListFormatSymbols_he = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} ו{1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ו{1}'\n};\n\n\n/**\n * List formatting symbols for locale hi.\n */\ngoog.labs.i18n.ListFormatSymbols_hi = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} और {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, और {1}'\n};\n\n\n/**\n * List formatting symbols for locale hr.\n */\ngoog.labs.i18n.ListFormatSymbols_hr = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale hu.\n */\ngoog.labs.i18n.ListFormatSymbols_hu = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} és {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} és {1}'\n};\n\n\n/**\n * List formatting symbols for locale hy.\n */\ngoog.labs.i18n.ListFormatSymbols_hy = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} և {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} և {1}'\n};\n\n\n/**\n * List formatting symbols for locale id.\n */\ngoog.labs.i18n.ListFormatSymbols_id = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} dan {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, dan {1}'\n};\n\n\n/**\n * List formatting symbols for locale in.\n */\ngoog.labs.i18n.ListFormatSymbols_in = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} dan {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, dan {1}'\n};\n\n\n/**\n * List formatting symbols for locale is.\n */\ngoog.labs.i18n.ListFormatSymbols_is = {\n  GENDER_STYLE: 1,\n  LIST_TWO: '{0} og {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} og {1}'\n};\n\n\n/**\n * List formatting symbols for locale it.\n */\ngoog.labs.i18n.ListFormatSymbols_it = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale iw.\n */\ngoog.labs.i18n.ListFormatSymbols_iw = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ו{1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ו{1}'\n};\n\n\n/**\n * List formatting symbols for locale ja.\n */\ngoog.labs.i18n.ListFormatSymbols_ja = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}、{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}、{1}'\n};\n\n\n/**\n * List formatting symbols for locale ka.\n */\ngoog.labs.i18n.ListFormatSymbols_ka = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} და {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} და {1}'\n};\n\n\n/**\n * List formatting symbols for locale kk.\n */\ngoog.labs.i18n.ListFormatSymbols_kk = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} және {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale km.\n */\ngoog.labs.i18n.ListFormatSymbols_km = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} និង​{1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} និង {1}'\n};\n\n\n/**\n * List formatting symbols for locale kn.\n */\ngoog.labs.i18n.ListFormatSymbols_kn = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ಮತ್ತು {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, ಮತ್ತು {1}'\n};\n\n\n/**\n * List formatting symbols for locale ko.\n */\ngoog.labs.i18n.ListFormatSymbols_ko = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} 및 {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} 및 {1}'\n};\n\n\n/**\n * List formatting symbols for locale ky.\n */\ngoog.labs.i18n.ListFormatSymbols_ky = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} жана {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} жана {1}'\n};\n\n\n/**\n * List formatting symbols for locale ln.\n */\ngoog.labs.i18n.ListFormatSymbols_ln = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale lo.\n */\ngoog.labs.i18n.ListFormatSymbols_lo = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ແລະ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale lt.\n */\ngoog.labs.i18n.ListFormatSymbols_lt = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} ir {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ir {1}'\n};\n\n\n/**\n * List formatting symbols for locale lv.\n */\ngoog.labs.i18n.ListFormatSymbols_lv = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} un {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} un {1}'\n};\n\n\n/**\n * List formatting symbols for locale mk.\n */\ngoog.labs.i18n.ListFormatSymbols_mk = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale ml.\n */\ngoog.labs.i18n.ListFormatSymbols_ml = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} കൂടാതെ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1} എന്നിവ'\n};\n\n\n/**\n * List formatting symbols for locale mn.\n */\ngoog.labs.i18n.ListFormatSymbols_mn = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mo.\n */\ngoog.labs.i18n.ListFormatSymbols_mo = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} și {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} și {1}'\n};\n\n\n/**\n * List formatting symbols for locale mr.\n */\ngoog.labs.i18n.ListFormatSymbols_mr = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} आणि {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} आणि {1}'\n};\n\n\n/**\n * List formatting symbols for locale ms.\n */\ngoog.labs.i18n.ListFormatSymbols_ms = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} dan {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} dan {1}'\n};\n\n\n/**\n * List formatting symbols for locale mt.\n */\ngoog.labs.i18n.ListFormatSymbols_mt = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} u {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, u {1}'\n};\n\n\n/**\n * List formatting symbols for locale my.\n */\ngoog.labs.i18n.ListFormatSymbols_my = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}နှင့် {1}',\n  LIST_START: '{0} {1}',\n  LIST_MIDDLE: '{0} {1}',\n  LIST_END: '{0}နှင့် {1}'\n};\n\n\n/**\n * List formatting symbols for locale nb.\n */\ngoog.labs.i18n.ListFormatSymbols_nb = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} og {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} og {1}'\n};\n\n\n/**\n * List formatting symbols for locale ne.\n */\ngoog.labs.i18n.ListFormatSymbols_ne = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} र {1}',\n  LIST_START: '{0},{1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} र {1}'\n};\n\n\n/**\n * List formatting symbols for locale nl.\n */\ngoog.labs.i18n.ListFormatSymbols_nl = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} en {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} en {1}'\n};\n\n\n/**\n * List formatting symbols for locale no.\n */\ngoog.labs.i18n.ListFormatSymbols_no = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} og {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} og {1}'\n};\n\n\n/**\n * List formatting symbols for locale no_NO.\n */\ngoog.labs.i18n.ListFormatSymbols_no_NO = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} og {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} og {1}'\n};\n\n\n/**\n * List formatting symbols for locale or.\n */\ngoog.labs.i18n.ListFormatSymbols_or = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ଓ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, ଓ {1}'\n};\n\n\n/**\n * List formatting symbols for locale pa.\n */\ngoog.labs.i18n.ListFormatSymbols_pa = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ਅਤੇ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ਅਤੇ {1}'\n};\n\n\n/**\n * List formatting symbols for locale pl.\n */\ngoog.labs.i18n.ListFormatSymbols_pl = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale pt.\n */\ngoog.labs.i18n.ListFormatSymbols_pt = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale pt_BR.\n */\ngoog.labs.i18n.ListFormatSymbols_pt_BR = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale pt_PT.\n */\ngoog.labs.i18n.ListFormatSymbols_pt_PT = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale ro.\n */\ngoog.labs.i18n.ListFormatSymbols_ro = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} și {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} și {1}'\n};\n\n\n/**\n * List formatting symbols for locale ru.\n */\ngoog.labs.i18n.ListFormatSymbols_ru = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale sh.\n */\ngoog.labs.i18n.ListFormatSymbols_sh = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale si.\n */\ngoog.labs.i18n.ListFormatSymbols_si = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} සහ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, සහ {1}'\n};\n\n\n/**\n * List formatting symbols for locale sk.\n */\ngoog.labs.i18n.ListFormatSymbols_sk = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} a {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} a {1}'\n};\n\n\n/**\n * List formatting symbols for locale sl.\n */\ngoog.labs.i18n.ListFormatSymbols_sl = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} in {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} in {1}'\n};\n\n\n/**\n * List formatting symbols for locale sq.\n */\ngoog.labs.i18n.ListFormatSymbols_sq = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} dhe {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} dhe {1}'\n};\n\n\n/**\n * List formatting symbols for locale sr.\n */\ngoog.labs.i18n.ListFormatSymbols_sr = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale sr_Latn.\n */\ngoog.labs.i18n.ListFormatSymbols_sr_Latn = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale sv.\n */\ngoog.labs.i18n.ListFormatSymbols_sv = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} och {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} och {1}'\n};\n\n\n/**\n * List formatting symbols for locale sw.\n */\ngoog.labs.i18n.ListFormatSymbols_sw = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} na {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} na {1}'\n};\n\n\n/**\n * List formatting symbols for locale ta.\n */\ngoog.labs.i18n.ListFormatSymbols_ta = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} மற்றும் {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} மற்றும் {1}'\n};\n\n\n/**\n * List formatting symbols for locale te.\n */\ngoog.labs.i18n.ListFormatSymbols_te = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} మరియు {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} మరియు {1}'\n};\n\n\n/**\n * List formatting symbols for locale th.\n */\ngoog.labs.i18n.ListFormatSymbols_th = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}และ{1}',\n  LIST_START: '{0} {1}',\n  LIST_MIDDLE: '{0} {1}',\n  LIST_END: '{0} และ{1}'\n};\n\n\n/**\n * List formatting symbols for locale tl.\n */\ngoog.labs.i18n.ListFormatSymbols_tl = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} at {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, at {1}'\n};\n\n\n/**\n * List formatting symbols for locale tr.\n */\ngoog.labs.i18n.ListFormatSymbols_tr = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ve {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ve {1}'\n};\n\n\n/**\n * List formatting symbols for locale uk.\n */\ngoog.labs.i18n.ListFormatSymbols_uk = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} і {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} і {1}'\n};\n\n\n/**\n * List formatting symbols for locale ur.\n */\ngoog.labs.i18n.ListFormatSymbols_ur = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} اور {1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، اور {1}'\n};\n\n\n/**\n * List formatting symbols for locale uz.\n */\ngoog.labs.i18n.ListFormatSymbols_uz = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} va {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} va {1}'\n};\n\n\n/**\n * List formatting symbols for locale vi.\n */\ngoog.labs.i18n.ListFormatSymbols_vi = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} và {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} và {1}'\n};\n\n\n/**\n * List formatting symbols for locale zh.\n */\ngoog.labs.i18n.ListFormatSymbols_zh = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0}和{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}和{1}'\n};\n\n\n/**\n * List formatting symbols for locale zh_CN.\n */\ngoog.labs.i18n.ListFormatSymbols_zh_CN = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0}和{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}和{1}'\n};\n\n\n/**\n * List formatting symbols for locale zh_HK.\n */\ngoog.labs.i18n.ListFormatSymbols_zh_HK = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0}及{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}及{1}'\n};\n\n\n/**\n * List formatting symbols for locale zh_TW.\n */\ngoog.labs.i18n.ListFormatSymbols_zh_TW = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0}和{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}和{1}'\n};\n\n\n/**\n * List formatting symbols for locale zu.\n */\ngoog.labs.i18n.ListFormatSymbols_zu = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ne-{1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, ne-{1}'\n};\n\n\n/**\n * Default value, in case nothing else matches\n */\ngoog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en;\n\n\n/**\n * Selecting symbols by locale.\n */\nif (goog.LOCALE == 'af') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_af;\n}\n\nif (goog.LOCALE == 'am') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_am;\n}\n\nif (goog.LOCALE == 'ar') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar;\n}\n\nif (goog.LOCALE == 'ar_DZ' || goog.LOCALE == 'ar-DZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_DZ;\n}\n\nif (goog.LOCALE == 'ar_EG' || goog.LOCALE == 'ar-EG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_EG;\n}\n\nif (goog.LOCALE == 'az') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_az;\n}\n\nif (goog.LOCALE == 'be') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_be;\n}\n\nif (goog.LOCALE == 'bg') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bg;\n}\n\nif (goog.LOCALE == 'bn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bn;\n}\n\nif (goog.LOCALE == 'br') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_br;\n}\n\nif (goog.LOCALE == 'bs') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bs;\n}\n\nif (goog.LOCALE == 'ca') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ca;\n}\n\nif (goog.LOCALE == 'chr') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_chr;\n}\n\nif (goog.LOCALE == 'cs') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_cs;\n}\n\nif (goog.LOCALE == 'cy') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_cy;\n}\n\nif (goog.LOCALE == 'da') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_da;\n}\n\nif (goog.LOCALE == 'de') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_de;\n}\n\nif (goog.LOCALE == 'de_AT' || goog.LOCALE == 'de-AT') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_de_AT;\n}\n\nif (goog.LOCALE == 'de_CH' || goog.LOCALE == 'de-CH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_de_CH;\n}\n\nif (goog.LOCALE == 'el') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_el;\n}\n\nif (goog.LOCALE == 'en') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en;\n}\n\nif (goog.LOCALE == 'en_AU' || goog.LOCALE == 'en-AU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_AU;\n}\n\nif (goog.LOCALE == 'en_CA' || goog.LOCALE == 'en-CA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_CA;\n}\n\nif (goog.LOCALE == 'en_GB' || goog.LOCALE == 'en-GB') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_GB;\n}\n\nif (goog.LOCALE == 'en_IE' || goog.LOCALE == 'en-IE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_IE;\n}\n\nif (goog.LOCALE == 'en_IN' || goog.LOCALE == 'en-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_IN;\n}\n\nif (goog.LOCALE == 'en_SG' || goog.LOCALE == 'en-SG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_SG;\n}\n\nif (goog.LOCALE == 'en_US' || goog.LOCALE == 'en-US') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_US;\n}\n\nif (goog.LOCALE == 'en_ZA' || goog.LOCALE == 'en-ZA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_ZA;\n}\n\nif (goog.LOCALE == 'es') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es;\n}\n\nif (goog.LOCALE == 'es_419' || goog.LOCALE == 'es-419') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_419;\n}\n\nif (goog.LOCALE == 'es_ES' || goog.LOCALE == 'es-ES') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_ES;\n}\n\nif (goog.LOCALE == 'es_MX' || goog.LOCALE == 'es-MX') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_MX;\n}\n\nif (goog.LOCALE == 'es_US' || goog.LOCALE == 'es-US') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_US;\n}\n\nif (goog.LOCALE == 'et') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_et;\n}\n\nif (goog.LOCALE == 'eu') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_eu;\n}\n\nif (goog.LOCALE == 'fa') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fa;\n}\n\nif (goog.LOCALE == 'fi') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fi;\n}\n\nif (goog.LOCALE == 'fil') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fil;\n}\n\nif (goog.LOCALE == 'fr') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr;\n}\n\nif (goog.LOCALE == 'fr_CA' || goog.LOCALE == 'fr-CA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_CA;\n}\n\nif (goog.LOCALE == 'ga') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ga;\n}\n\nif (goog.LOCALE == 'gl') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_gl;\n}\n\nif (goog.LOCALE == 'gsw') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_gsw;\n}\n\nif (goog.LOCALE == 'gu') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_gu;\n}\n\nif (goog.LOCALE == 'haw') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_haw;\n}\n\nif (goog.LOCALE == 'he') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_he;\n}\n\nif (goog.LOCALE == 'hi') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_hi;\n}\n\nif (goog.LOCALE == 'hr') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_hr;\n}\n\nif (goog.LOCALE == 'hu') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_hu;\n}\n\nif (goog.LOCALE == 'hy') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_hy;\n}\n\nif (goog.LOCALE == 'id') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_id;\n}\n\nif (goog.LOCALE == 'in') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_in;\n}\n\nif (goog.LOCALE == 'is') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_is;\n}\n\nif (goog.LOCALE == 'it') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_it;\n}\n\nif (goog.LOCALE == 'iw') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_iw;\n}\n\nif (goog.LOCALE == 'ja') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ja;\n}\n\nif (goog.LOCALE == 'ka') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ka;\n}\n\nif (goog.LOCALE == 'kk') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kk;\n}\n\nif (goog.LOCALE == 'km') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_km;\n}\n\nif (goog.LOCALE == 'kn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kn;\n}\n\nif (goog.LOCALE == 'ko') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ko;\n}\n\nif (goog.LOCALE == 'ky') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ky;\n}\n\nif (goog.LOCALE == 'ln') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ln;\n}\n\nif (goog.LOCALE == 'lo') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lo;\n}\n\nif (goog.LOCALE == 'lt') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lt;\n}\n\nif (goog.LOCALE == 'lv') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lv;\n}\n\nif (goog.LOCALE == 'mk') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mk;\n}\n\nif (goog.LOCALE == 'ml') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ml;\n}\n\nif (goog.LOCALE == 'mn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mn;\n}\n\nif (goog.LOCALE == 'mo') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mo;\n}\n\nif (goog.LOCALE == 'mr') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mr;\n}\n\nif (goog.LOCALE == 'ms') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ms;\n}\n\nif (goog.LOCALE == 'mt') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mt;\n}\n\nif (goog.LOCALE == 'my') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_my;\n}\n\nif (goog.LOCALE == 'nb') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nb;\n}\n\nif (goog.LOCALE == 'ne') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ne;\n}\n\nif (goog.LOCALE == 'nl') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nl;\n}\n\nif (goog.LOCALE == 'no') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_no;\n}\n\nif (goog.LOCALE == 'no_NO' || goog.LOCALE == 'no-NO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_no_NO;\n}\n\nif (goog.LOCALE == 'or') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_or;\n}\n\nif (goog.LOCALE == 'pa') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pa;\n}\n\nif (goog.LOCALE == 'pl') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pl;\n}\n\nif (goog.LOCALE == 'pt') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pt;\n}\n\nif (goog.LOCALE == 'pt_BR' || goog.LOCALE == 'pt-BR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pt_BR;\n}\n\nif (goog.LOCALE == 'pt_PT' || goog.LOCALE == 'pt-PT') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pt_PT;\n}\n\nif (goog.LOCALE == 'ro') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ro;\n}\n\nif (goog.LOCALE == 'ru') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ru;\n}\n\nif (goog.LOCALE == 'sh') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sh;\n}\n\nif (goog.LOCALE == 'si') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_si;\n}\n\nif (goog.LOCALE == 'sk') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sk;\n}\n\nif (goog.LOCALE == 'sl') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sl;\n}\n\nif (goog.LOCALE == 'sq') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sq;\n}\n\nif (goog.LOCALE == 'sr') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sr;\n}\n\nif (goog.LOCALE == 'sr_Latn' || goog.LOCALE == 'sr-Latn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sr_Latn;\n}\n\nif (goog.LOCALE == 'sv') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sv;\n}\n\nif (goog.LOCALE == 'sw') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sw;\n}\n\nif (goog.LOCALE == 'ta') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ta;\n}\n\nif (goog.LOCALE == 'te') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_te;\n}\n\nif (goog.LOCALE == 'th') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_th;\n}\n\nif (goog.LOCALE == 'tl') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_tl;\n}\n\nif (goog.LOCALE == 'tr') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_tr;\n}\n\nif (goog.LOCALE == 'uk') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_uk;\n}\n\nif (goog.LOCALE == 'ur') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ur;\n}\n\nif (goog.LOCALE == 'uz') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_uz;\n}\n\nif (goog.LOCALE == 'vi') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_vi;\n}\n\nif (goog.LOCALE == 'zh') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zh;\n}\n\nif (goog.LOCALE == 'zh_CN' || goog.LOCALE == 'zh-CN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zh_CN;\n}\n\nif (goog.LOCALE == 'zh_HK' || goog.LOCALE == 'zh-HK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zh_HK;\n}\n\nif (goog.LOCALE == 'zh_TW' || goog.LOCALE == 'zh-TW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zh_TW;\n}\n\nif (goog.LOCALE == 'zu') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zu;\n}\n\n","^17",1579837703000,"^18",["^19",["^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/i18n/listsymbols.js"],"^1J",["^19",["~$goog.labs.i18n.ListFormatSymbols-fr","~$goog.labs.i18n.ListFormatSymbols_bs","~$goog.labs.i18n.ListFormatSymbols_fr","~$goog.labs.i18n.ListFormatSymbols-bn","~$goog.labs.i18n.ListFormatSymbols-sh","~$goog.labs.i18n.ListFormatSymbols-en-AU","~$goog.labs.i18n.ListFormatSymbols_ro","~$goog.labs.i18n.ListFormatSymbols-kn","~$goog.labs.i18n.ListFormatSymbols_en_IE","~$goog.labs.i18n.ListFormatSymbols-ko","~$goog.labs.i18n.ListFormatSymbols-ar-EG","~$goog.labs.i18n.ListFormatSymbols_sw","~$goog.labs.i18n.ListFormatSymbols_am","~$goog.labs.i18n.ListFormatSymbols_or","~$goog.labs.i18n.ListFormatSymbols-ky","~$goog.labs.i18n.ListFormatSymbols_es_ES","~$goog.labs.i18n.ListFormatSymbols-de","~$goog.labs.i18n.ListFormatSymbols-en-IN","~$goog.labs.i18n.ListFormatSymbols-is","~$goog.labs.i18n.ListFormatSymbols_pt","~$goog.labs.i18n.ListFormatSymbols-gsw","~$goog.labs.i18n.ListFormatSymbols-nb","~$goog.labs.i18n.ListFormatSymbols_ar_EG","~$goog.labs.i18n.ListFormatSymbols-fr-CA","~$goog.labs.i18n.ListFormatSymbols-fi","~$goog.labs.i18n.ListFormatSymbols-hr","~$goog.labs.i18n.ListFormatSymbols_is","~$goog.labs.i18n.ListFormatSymbols-es-ES","~$goog.labs.i18n.ListFormatSymbols-hu","~$goog.labs.i18n.ListFormatSymbols-ms","~$goog.labs.i18n.ListFormatSymbols-ro","~$goog.labs.i18n.ListFormatSymbols_mr","~$goog.labs.i18n.ListFormatSymbols-de-CH","~$goog.labs.i18n.ListFormatSymbols-en-ZA","~$goog.labs.i18n.ListFormatSymbols_cs","~$goog.labs.i18n.ListFormatSymbols-kk","~$goog.labs.i18n.ListFormatSymbols_ta","~$goog.labs.i18n.ListFormatSymbols-km","~$goog.labs.i18n.ListFormatSymbols_ko","~$goog.labs.i18n.ListFormatSymbols_pt_BR","~$goog.labs.i18n.ListFormatSymbols-pl","~$goog.labs.i18n.ListFormatSymbols-si","~$goog.labs.i18n.ListFormatSymbols_uz","~$goog.labs.i18n.ListFormatSymbols_lo","~$goog.labs.i18n.ListFormatSymbols-mk","~$goog.labs.i18n.ListFormatSymbols-en","~$goog.labs.i18n.ListFormatSymbols_te","~$goog.labs.i18n.ListFormatSymbols-mr","~$goog.labs.i18n.ListFormatSymbols_es_US","~$goog.labs.i18n.ListFormatSymbols-et","~$goog.labs.i18n.ListFormatSymbols_ml","~$goog.labs.i18n.ListFormatSymbols_ru","~$goog.labs.i18n.ListFormatSymbols-el","~$goog.labs.i18n.ListFormatSymbols-ar-DZ","~$goog.labs.i18n.ListFormatSymbols-sk","~$goog.labs.i18n.ListFormatSymbols-iw","~$goog.labs.i18n.ListFormatSymbols-cs","~$goog.labs.i18n.ListFormatSymbols_chr","~$goog.labs.i18n.ListFormatSymbols_no_NO","~$goog.labs.i18n.ListFormatSymbols_in","~$goog.labs.i18n.ListFormatSymbols-ca","~$goog.labs.i18n.ListFormatSymbols-ne","~$goog.labs.i18n.ListFormatSymbols_lv","~$goog.labs.i18n.ListFormatSymbols-he","~$goog.labs.i18n.ListFormatSymbols-in","~$goog.labs.i18n.ListFormatSymbols_mo","~$goog.labs.i18n.ListFormatSymbols_kk","~$goog.labs.i18n.ListFormatSymbols_en_AU","~$goog.labs.i18n.ListFormatSymbols_ky","~$goog.labs.i18n.ListFormatSymbols_ja","~$goog.labs.i18n.ListFormatSymbols_it","~$goog.labs.i18n.ListFormatSymbols_hy","~$goog.labs.i18n.ListFormatSymbols-ja","~$goog.labs.i18n.ListFormatSymbols_be","~$goog.labs.i18n.ListFormatSymbols_bg","~$goog.labs.i18n.ListFormatSymbols-ru","~$goog.labs.i18n.ListFormatSymbols_sr","~$goog.labs.i18n.ListFormatSymbols_ga","~$goog.labs.i18n.ListFormatSymbols_de_AT","~$goog.labs.i18n.ListFormatSymbols_ar_DZ","~$goog.labs.i18n.ListFormatSymbols_sl","~$goog.labs.i18n.ListFormatSymbols-sl","~$goog.labs.i18n.ListFormatSymbols-nl","~$goog.labs.i18n.ListFormatSymbols-uz","~$goog.labs.i18n.ListFormatSymbols_gu","~$goog.labs.i18n.ListFormatSymbols-pa","~$goog.labs.i18n.ListFormatSymbols_es_419","~$goog.labs.i18n.ListFormatSymbols_km","~$goog.labs.i18n.ListFormatSymbols_br","~$goog.labs.i18n.ListFormatSymbols-ka","~$goog.labs.i18n.ListFormatSymbols_nb","~$goog.labs.i18n.ListFormatSymbols-zu","~$goog.labs.i18n.ListFormatSymbols-br","~$goog.labs.i18n.ListFormatSymbols_id","~$goog.labs.i18n.ListFormatSymbols-ar","~$goog.labs.i18n.ListFormatSymbols_fi","~$goog.labs.i18n.ListFormatSymbols_ur","~$goog.labs.i18n.ListFormatSymbols-vi","~$goog.labs.i18n.ListFormatSymbols_et","~$goog.labs.i18n.ListFormatSymbols_sr_Latn","~$goog.labs.i18n.ListFormatSymbols_sk","~$goog.labs.i18n.ListFormatSymbols-no","~$goog.labs.i18n.ListFormatSymbols-ur","~$goog.labs.i18n.ListFormatSymbols_fa","~$goog.labs.i18n.ListFormatSymbols_ka","~$goog.labs.i18n.ListFormatSymbols-tl","~$goog.labs.i18n.ListFormatSymbols_es_MX","~$goog.labs.i18n.ListFormatSymbols_da","~$goog.labs.i18n.ListFormatSymbols_af","~$goog.labs.i18n.ListFormatSymbols-ln","~$goog.labs.i18n.ListFormatSymbols_cy","~$goog.labs.i18n.ListFormatSymbols-cy","~$goog.labs.i18n.ListFormatSymbols-mt","~$goog.labs.i18n.ListFormatSymbols_sv","~$goog.labs.i18n.ListFormatSymbols-hy","~$goog.labs.i18n.ListFormatSymbols-en-SG","~$goog.labs.i18n.ListFormatSymbols-sr-Latn","~$goog.labs.i18n.ListFormatSymbols_th","~$goog.labs.i18n.ListFormatSymbols-lt","~$goog.labs.i18n.ListFormatSymbols-fil","~$goog.labs.i18n.ListFormatSymbols-be","~$goog.labs.i18n.ListFormatSymbols_el","~$goog.labs.i18n.ListFormatSymbols-es-419","~$goog.labs.i18n.ListFormatSymbols_en_GB","~$goog.labs.i18n.ListFormatSymbols_si","~$goog.labs.i18n.ListFormatSymbols_no","~$goog.labs.i18n.ListFormatSymbols-bg","~$goog.labs.i18n.ListFormatSymbols_en_IN","~$goog.labs.i18n.ListFormatSymbols_eu","~$goog.labs.i18n.ListFormatSymbols_bn","~$goog.labs.i18n.ListFormatSymbols_ar","~$goog.labs.i18n.ListFormatSymbols_gl","~$goog.labs.i18n.ListFormatSymbols-chr","~$goog.labs.i18n.ListFormatSymbols-haw","~$goog.labs.i18n.ListFormatSymbols_ne","~$goog.labs.i18n.ListFormatSymbols-fa","~$goog.labs.i18n.ListFormatSymbols-da","~$goog.labs.i18n.ListFormatSymbols-en-US","~$goog.labs.i18n.ListFormatSymbols-it","~$goog.labs.i18n.ListFormatSymbols-ga","~$goog.labs.i18n.ListFormatSymbols-pt-BR","~$goog.labs.i18n.ListFormatSymbols-lo","~$goog.labs.i18n.ListFormatSymbols-az","~$goog.labs.i18n.ListFormatSymbols_es","~$goog.labs.i18n.ListFormatSymbols_sq","~$goog.labs.i18n.ListFormatSymbols_pa","~$goog.labs.i18n.ListFormatSymbols_zu","~$goog.labs.i18n.ListFormatSymbols_en_CA","~$goog.labs.i18n.ListFormatSymbols_pt_PT","~$goog.labs.i18n.ListFormatSymbols_mk","~$goog.labs.i18n.ListFormatSymbols_he","~$goog.labs.i18n.ListFormatSymbols-gu","~$goog.labs.i18n.ListFormatSymbols_my","~$goog.labs.i18n.ListFormatSymbols_zh_TW","~$goog.labs.i18n.ListFormatSymbols_ln","~$goog.labs.i18n.ListFormatSymbols_hr","~$goog.labs.i18n.ListFormatSymbols-de-AT","~$goog.labs.i18n.ListFormatSymbols-es-MX","~$goog.labs.i18n.ListFormatSymbols-tr","~$goog.labs.i18n.ListFormatSymbols_sh","~$goog.labs.i18n.ListFormatSymbols_tl","~$goog.labs.i18n.ListFormatSymbols-ta","~$goog.labs.i18n.ListFormatSymbols_de_CH","~$goog.labs.i18n.ListFormatSymbols_lt","~$goog.labs.i18n.ListFormatSymbols_ms","~$goog.labs.i18n.ListFormatSymbols-te","~$goog.labs.i18n.ListFormatSymbols-sq","~$goog.labs.i18n.ListFormatSymbols-en-GB","~$goog.labs.i18n.ListFormatSymbols-zh-TW","~$goog.labs.i18n.ListFormatSymbols-en-CA","~$goog.labs.i18n.ListFormatSymbols-pt-PT","~$goog.labs.i18n.ListFormatSymbols-zh","~$goog.labs.i18n.ListFormatSymbols-eu","~$goog.labs.i18n.ListFormatSymbols_vi","~$goog.labs.i18n.ListFormatSymbols-mn","~$goog.labs.i18n.ListFormatSymbols_kn","~$goog.labs.i18n.ListFormatSymbols-en-IE","~$goog.labs.i18n.ListFormatSymbols_az","~$goog.labs.i18n.ListFormatSymbols-lv","~$goog.labs.i18n.ListFormatSymbols-th","~$goog.labs.i18n.ListFormatSymbols-gl","~$goog.labs.i18n.ListFormatSymbols-id","~$goog.labs.i18n.ListFormatSymbols-es","~$goog.labs.i18n.ListFormatSymbols_en","~$goog.labs.i18n.ListFormatSymbols-no-NO","~$goog.labs.i18n.ListFormatSymbols-zh-HK","~$goog.labs.i18n.ListFormatSymbols_fil","~$goog.labs.i18n.ListFormatSymbols_zh_HK","~$goog.labs.i18n.ListFormatSymbols_nl","~$goog.labs.i18n.ListFormatSymbols-ml","~$goog.labs.i18n.ListFormatSymbols_pl","~$goog.labs.i18n.ListFormatSymbols_uk","~$goog.labs.i18n.ListFormatSymbols_mt","~$goog.labs.i18n.ListFormatSymbols-sv","~$goog.labs.i18n.ListFormatSymbols_de","~$goog.labs.i18n.ListFormatSymbols-uk","~$goog.labs.i18n.ListFormatSymbols_fr_CA","~$goog.labs.i18n.ListFormatSymbols_hi","~$goog.labs.i18n.ListFormatSymbols-pt","~$goog.labs.i18n.ListFormatSymbols-am","~$goog.labs.i18n.ListFormatSymbols-sw","~$goog.labs.i18n.ListFormatSymbols-af","~$goog.labs.i18n.ListFormatSymbols","~$goog.labs.i18n.ListFormatSymbols_zh_CN","~$goog.labs.i18n.ListFormatSymbols_gsw","~$goog.labs.i18n.ListFormatSymbols-es-US","~$goog.labs.i18n.ListFormatSymbols-sr","~$goog.labs.i18n.ListFormatSymbols_zh","~$goog.labs.i18n.ListFormatSymbols_en_ZA","~$goog.labs.i18n.ListFormatSymbols-mo","~$goog.labs.i18n.ListFormatSymbols-my","~$goog.labs.i18n.ListFormatSymbols_en_SG","~$goog.labs.i18n.ListFormatSymbols-zh-CN","~$goog.labs.i18n.ListFormatSymbols_ca","~$goog.labs.i18n.ListFormatSymbols_iw","~$goog.labs.i18n.ListFormatSymbols_tr","~$goog.labs.i18n.ListFormatSymbols_haw","~$goog.labs.i18n.ListFormatSymbols_en_US","~$goog.labs.i18n.ListFormatSymbols_hu","~$goog.labs.i18n.ListFormatSymbols-bs","~$goog.labs.i18n.ListFormatSymbols_mn","~$goog.labs.i18n.ListFormatSymbols-or","~$goog.labs.i18n.ListFormatSymbols-hi"]],"^X",true,"^Y",["^Z"]],["^ ","^[",[1579837703000],"^10","goog.structs.circularbuffer.js","^11",["^12","goog/structs/circularbuffer.js"],"^13","goog/structs/circularbuffer.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Datastructure: Circular Buffer.\n *\n * Implements a buffer with a maximum size. New entries override the oldest\n * entries when the maximum size has been reached.\n *\n */\n\n\ngoog.provide('goog.structs.CircularBuffer');\n\n\n\n/**\n * Class for CircularBuffer.\n * @param {number=} opt_maxSize The maximum size of the buffer.\n * @constructor\n * @template T\n */\ngoog.structs.CircularBuffer = function(opt_maxSize) {\n  /**\n   * Index of the next element in the circular array structure.\n   * @private {number}\n   */\n  this.nextPtr_ = 0;\n\n  /**\n   * Maximum size of the the circular array structure.\n   * @private {number}\n   */\n  this.maxSize_ = opt_maxSize || 100;\n\n  /**\n   * Underlying array for the CircularBuffer.\n   * @private {!Array<T>}\n   */\n  this.buff_ = [];\n};\n\n\n/**\n * Adds an item to the buffer. May remove the oldest item if the buffer is at\n * max size.\n * @param {T} item The item to add.\n * @return {T|undefined} The removed old item, if the buffer is at max size.\n *     Return undefined, otherwise.\n */\ngoog.structs.CircularBuffer.prototype.add = function(item) {\n  const previousItem = this.buff_[this.nextPtr_];\n  this.buff_[this.nextPtr_] = item;\n  this.nextPtr_ = (this.nextPtr_ + 1) % this.maxSize_;\n  return previousItem;\n};\n\n\n/**\n * Returns the item at the specified index.\n * @param {number} index The index of the item. The index of an item can change\n *     after calls to `add()` if the buffer is at maximum size.\n * @return {T} The item at the specified index.\n */\ngoog.structs.CircularBuffer.prototype.get = function(index) {\n  index = this.normalizeIndex_(index);\n  return this.buff_[index];\n};\n\n\n/**\n * Sets the item at the specified index.\n * @param {number} index The index of the item. The index of an item can change\n *     after calls to `add()` if the buffer is at maximum size.\n * @param {T} item The item to add.\n */\ngoog.structs.CircularBuffer.prototype.set = function(index, item) {\n  index = this.normalizeIndex_(index);\n  this.buff_[index] = item;\n};\n\n\n/**\n * Returns the current number of items in the buffer.\n * @return {number} The current number of items in the buffer.\n */\ngoog.structs.CircularBuffer.prototype.getCount = function() {\n  return this.buff_.length;\n};\n\n\n/**\n * @return {boolean} Whether the buffer is empty.\n */\ngoog.structs.CircularBuffer.prototype.isEmpty = function() {\n  return this.buff_.length == 0;\n};\n\n\n/**\n * Empties the current buffer.\n */\ngoog.structs.CircularBuffer.prototype.clear = function() {\n  this.buff_.length = 0;\n  this.nextPtr_ = 0;\n};\n\n\n/**\n * @return {!Array<T>} The values in the buffer ordered from oldest to newest.\n */\ngoog.structs.CircularBuffer.prototype.getValues = function() {\n  // getNewestValues returns all the values if the maxCount parameter is the\n  // count\n  return this.getNewestValues(this.getCount());\n};\n\n\n/**\n * Returns the newest values in the buffer up to `count`.\n * @param {number} maxCount The maximum number of values to get. Should be a\n *     positive number.\n * @return {!Array<T>} The newest values in the buffer up to `count`. The\n *     values are ordered from oldest to newest.\n */\ngoog.structs.CircularBuffer.prototype.getNewestValues = function(maxCount) {\n  const l = this.getCount();\n  const start = this.getCount() - maxCount;\n  const rv = [];\n  for (let i = start; i < l; i++) {\n    rv.push(this.get(i));\n  }\n  return rv;\n};\n\n\n/** @return {!Array<number>} The indexes in the buffer. */\ngoog.structs.CircularBuffer.prototype.getKeys = function() {\n  const rv = [];\n  const l = this.getCount();\n  for (let i = 0; i < l; i++) {\n    rv[i] = i;\n  }\n  return rv;\n};\n\n\n/**\n * Whether the buffer contains the key/index.\n * @param {number} key The key/index to check for.\n * @return {boolean} Whether the buffer contains the key/index.\n */\ngoog.structs.CircularBuffer.prototype.containsKey = function(key) {\n  return key < this.getCount();\n};\n\n\n/**\n * Whether the buffer contains the given value.\n * @param {T} value The value to check for.\n * @return {boolean} Whether the buffer contains the given value.\n */\ngoog.structs.CircularBuffer.prototype.containsValue = function(value) {\n  const l = this.getCount();\n  for (let i = 0; i < l; i++) {\n    if (this.get(i) == value) {\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Returns the last item inserted into the buffer.\n * @return {T|null} The last item inserted into the buffer,\n *     or null if the buffer is empty.\n */\ngoog.structs.CircularBuffer.prototype.getLast = function() {\n  if (this.getCount() == 0) {\n    return null;\n  }\n  return this.get(this.getCount() - 1);\n};\n\n\n/**\n * Helper function to convert an index in the number space of oldest to\n * newest items in the array to the position that the element will be at in the\n * underlying array.\n * @param {number} index The index of the item in a list ordered from oldest to\n *     newest.\n * @return {number} The index of the item in the CircularBuffer's underlying\n *     array.\n * @private\n */\ngoog.structs.CircularBuffer.prototype.normalizeIndex_ = function(index) {\n  if (index >= this.buff_.length) {\n    throw new Error('Out of bounds exception');\n  }\n\n  if (this.buff_.length < this.maxSize_) {\n    return index;\n  }\n\n  return (this.nextPtr_ + Number(index)) % this.maxSize_;\n};\n","^17",1579837703000,"^18",["^19",["^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/circularbuffer.js"],"^1J",["^19",["~$goog.structs.CircularBuffer"]],"^X",true,"^Y",["^Z"]],["^ ","^[",[1579837703000],"^10","goog.vec.mat4.js","^11",["^12","goog/vec/mat4.js"],"^13","goog/vec/mat4.js","^14","^15","^16","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implements 4x4 matrices and their related functions which are\n * compatible with WebGL. The API is structured to avoid unnecessary memory\n * allocations.  The last parameter will typically be the output vector and\n * an object can be both an input and output parameter to all methods except\n * where noted. Matrix operations follow the mathematical form when multiplying\n * vectors as follows: resultVec = matrix * vec.\n *\n * The matrices are stored in column-major order.\n *\n */\ngoog.provide('goog.vec.Mat4');\n\ngoog.require('goog.vec');\ngoog.require('goog.vec.Vec3');\ngoog.require('goog.vec.Vec4');\n\n\n/** @typedef {!goog.vec.Float32} */ goog.vec.Mat4.Float32;\n/** @typedef {!goog.vec.Float64} */ goog.vec.Mat4.Float64;\n/** @typedef {!goog.vec.Number} */ goog.vec.Mat4.Number;\n/** @typedef {!goog.vec.AnyType} */ goog.vec.Mat4.AnyType;\n\n// The following two types are deprecated - use the above types instead.\n/** @typedef {!Float32Array} */ goog.vec.Mat4.Type;\n/** @typedef {!goog.vec.ArrayType} */ goog.vec.Mat4.Mat4Like;\n\n\n/**\n * Creates the array representation of a 4x4 matrix of Float32.\n * The use of the array directly instead of a class reduces overhead.\n * The returned matrix is cleared to all zeros.\n *\n * @return {!goog.vec.Mat4.Float32} The new matrix.\n */\ngoog.vec.Mat4.createFloat32 = function() {\n  return new Float32Array(16);\n};\n\n\n/**\n * Creates the array representation of a 4x4 matrix of Float64.\n * The returned matrix is cleared to all zeros.\n *\n * @return {!goog.vec.Mat4.Float64} The new matrix.\n */\ngoog.vec.Mat4.createFloat64 = function() {\n  return new Float64Array(16);\n};\n\n\n/**\n * Creates the array representation of a 4x4 matrix of Number.\n * The returned matrix is cleared to all zeros.\n *\n * @return {!goog.vec.Mat4.Number} The new matrix.\n */\ngoog.vec.Mat4.createNumber = function() {\n  var a = new Array(16);\n  goog.vec.Mat4.setFromValues(\n      a, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n  return a;\n};\n\n\n/**\n * Creates the array representation of a 4x4 matrix of Float32.\n * The returned matrix is cleared to all zeros.\n *\n * @deprecated Use createFloat32.\n * @return {!goog.vec.Mat4.Type} The new matrix.\n */\ngoog.vec.Mat4.create = function() {\n  return goog.vec.Mat4.createFloat32();\n};\n\n\n/**\n * Creates a 4x4 identity matrix of Float32.\n *\n * @return {!goog.vec.Mat4.Float32} The new 16 element array.\n */\ngoog.vec.Mat4.createFloat32Identity = function() {\n  var mat = goog.vec.Mat4.createFloat32();\n  mat[0] = mat[5] = mat[10] = mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Creates a 4x4 identity matrix of Float64.\n *\n * @return {!goog.vec.Mat4.Float64} The new 16 element array.\n */\ngoog.vec.Mat4.createFloat64Identity = function() {\n  var mat = goog.vec.Mat4.createFloat64();\n  mat[0] = mat[5] = mat[10] = mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Creates a 4x4 identity matrix of Number.\n * The returned matrix is cleared to all zeros.\n *\n * @return {!goog.vec.Mat4.Number} The new 16 element array.\n */\ngoog.vec.Mat4.createNumberIdentity = function() {\n  var a = new Array(16);\n  goog.vec.Mat4.setFromValues(\n      a, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n  return a;\n};\n\n\n/**\n * Creates the array representation of a 4x4 matrix of Float32.\n * The returned matrix is cleared to all zeros.\n *\n * @deprecated Use createFloat32Identity.\n * @return {!goog.vec.Mat4.Type} The new 16 element array.\n */\ngoog.vec.Mat4.createIdentity = function() {\n  return goog.vec.Mat4.createFloat32Identity();\n};\n\n\n/**\n * Creates a 4x4 matrix of Float32 initialized from the given array.\n *\n * @param {goog.vec.Mat4.AnyType} matrix The array containing the\n *     matrix values in column major order.\n * @return {!goog.vec.Mat4.Float32} The new, 16 element array.\n */\ngoog.vec.Mat4.createFloat32FromArray = function(matrix) {\n  var newMatrix = goog.vec.Mat4.createFloat32();\n  goog.vec.Mat4.setFromArray(newMatrix, matrix);\n  return newMatrix;\n};\n\n\n/**\n * Creates a 4x4 matrix of Float32 initialized from the given values.\n *\n * @param {number} v00 The values at (0, 0).\n * @param {number} v10 The values at (1, 0).\n * @param {number} v20 The values at (2, 0).\n * @param {number} v30 The values at (3, 0).\n * @param {number} v01 The values at (0, 1).\n * @param {number} v11 The values at (1, 1).\n * @param {number} v21 The values at (2, 1).\n * @param {number} v31 The values at (3, 1).\n * @param {number} v02 The values at (0, 2).\n * @param {number} v12 The values at (1, 2).\n * @param {number} v22 The values at (2, 2).\n * @param {number} v32 The values at (3, 2).\n * @param {number} v03 The values at (0, 3).\n * @param {number} v13 The values at (1, 3).\n * @param {number} v23 The values at (2, 3).\n * @param {number} v33 The values at (3, 3).\n * @return {!goog.vec.Mat4.Float32} The new, 16 element array.\n */\ngoog.vec.Mat4.createFloat32FromValues = function(\n    v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13, v23,\n    v33) {\n  var newMatrix = goog.vec.Mat4.createFloat32();\n  goog.vec.Mat4.setFromValues(\n      newMatrix, v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32,\n      v03, v13, v23, v33);\n  return newMatrix;\n};\n\n\n/**\n * Creates a clone of a 4x4 matrix of Float32.\n *\n * @param {goog.vec.Mat4.Float32} matrix The source 4x4 matrix.\n * @return {!goog.vec.Mat4.Float32} The new 4x4 element matrix.\n */\ngoog.vec.Mat4.cloneFloat32 = goog.vec.Mat4.createFloat32FromArray;\n\n\n/**\n * Creates a 4x4 matrix of Float64 initialized from the given array.\n *\n * @param {goog.vec.Mat4.AnyType} matrix The array containing the\n *     matrix values in column major order.\n * @return {!goog.vec.Mat4.Float64} The new, nine element array.\n */\ngoog.vec.Mat4.createFloat64FromArray = function(matrix) {\n  var newMatrix = goog.vec.Mat4.createFloat64();\n  goog.vec.Mat4.setFromArray(newMatrix, matrix);\n  return newMatrix;\n};\n\n\n/**\n * Creates a 4x4 matrix of Float64 initialized from the given values.\n *\n * @param {number} v00 The values at (0, 0).\n * @param {number} v10 The values at (1, 0).\n * @param {number} v20 The values at (2, 0).\n * @param {number} v30 The values at (3, 0).\n * @param {number} v01 The values at (0, 1).\n * @param {number} v11 The values at (1, 1).\n * @param {number} v21 The values at (2, 1).\n * @param {number} v31 The values at (3, 1).\n * @param {number} v02 The values at (0, 2).\n * @param {number} v12 The values at (1, 2).\n * @param {number} v22 The values at (2, 2).\n * @param {number} v32 The values at (3, 2).\n * @param {number} v03 The values at (0, 3).\n * @param {number} v13 The values at (1, 3).\n * @param {number} v23 The values at (2, 3).\n * @param {number} v33 The values at (3, 3).\n * @return {!goog.vec.Mat4.Float64} The new, 16 element array.\n */\ngoog.vec.Mat4.createFloat64FromValues = function(\n    v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13, v23,\n    v33) {\n  var newMatrix = goog.vec.Mat4.createFloat64();\n  goog.vec.Mat4.setFromValues(\n      newMatrix, v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32,\n      v03, v13, v23, v33);\n  return newMatrix;\n};\n\n\n/**\n * Creates a clone of a 4x4 matrix of Float64.\n *\n * @param {goog.vec.Mat4.Float64} matrix The source 4x4 matrix.\n * @return {!goog.vec.Mat4.Float64} The new 4x4 element matrix.\n */\ngoog.vec.Mat4.cloneFloat64 = goog.vec.Mat4.createFloat64FromArray;\n\n\n/**\n * Creates a 4x4 matrix of Float32 initialized from the given array.\n *\n * @deprecated Use createFloat32FromArray.\n * @param {goog.vec.Mat4.Mat4Like} matrix The array containing the\n *     matrix values in column major order.\n * @return {!goog.vec.Mat4.Type} The new, nine element array.\n */\ngoog.vec.Mat4.createFromArray = function(matrix) {\n  var newMatrix = goog.vec.Mat4.createFloat32();\n  goog.vec.Mat4.setFromArray(newMatrix, matrix);\n  return newMatrix;\n};\n\n\n/**\n * Creates a 4x4 matrix of Float32 initialized from the given values.\n *\n * @deprecated Use createFloat32FromValues.\n * @param {number} v00 The values at (0, 0).\n * @param {number} v10 The values at (1, 0).\n * @param {number} v20 The values at (2, 0).\n * @param {number} v30 The values at (3, 0).\n * @param {number} v01 The values at (0, 1).\n * @param {number} v11 The values at (1, 1).\n * @param {number} v21 The values at (2, 1).\n * @param {number} v31 The values at (3, 1).\n * @param {number} v02 The values at (0, 2).\n * @param {number} v12 The values at (1, 2).\n * @param {number} v22 The values at (2, 2).\n * @param {number} v32 The values at (3, 2).\n * @param {number} v03 The values at (0, 3).\n * @param {number} v13 The values at (1, 3).\n * @param {number} v23 The values at (2, 3).\n * @param {number} v33 The values at (3, 3).\n * @return {!goog.vec.Mat4.Type} The new, 16 element array.\n */\ngoog.vec.Mat4.createFromValues = function(\n    v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13, v23,\n    v33) {\n  return goog.vec.Mat4.createFloat32FromValues(\n      v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13, v23,\n      v33);\n};\n\n\n/**\n * Creates a clone of a 4x4 matrix of Float32.\n *\n * @deprecated Use cloneFloat32.\n * @param {goog.vec.Mat4.Mat4Like} matrix The source 4x4 matrix.\n * @return {!goog.vec.Mat4.Type} The new 4x4 element matrix.\n */\ngoog.vec.Mat4.clone = goog.vec.Mat4.createFromArray;\n\n\n/**\n * Retrieves the element at the requested row and column.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix containing the\n *     value to retrieve.\n * @param {number} row The row index.\n * @param {number} column The column index.\n * @return {number} The element value at the requested row, column indices.\n */\ngoog.vec.Mat4.getElement = function(mat, row, column) {\n  return mat[row + column * 4];\n};\n\n\n/**\n * Sets the element at the requested row and column.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to set the value on.\n * @param {number} row The row index.\n * @param {number} column The column index.\n * @param {number} value The value to set at the requested row, column.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.setElement = function(mat, row, column, value) {\n  mat[row + column * 4] = value;\n  return mat;\n};\n\n\n/**\n * Initializes the matrix from the set of values. Note the values supplied are\n * in column major order.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to receive the\n *     values.\n * @param {number} v00 The values at (0, 0).\n * @param {number} v10 The values at (1, 0).\n * @param {number} v20 The values at (2, 0).\n * @param {number} v30 The values at (3, 0).\n * @param {number} v01 The values at (0, 1).\n * @param {number} v11 The values at (1, 1).\n * @param {number} v21 The values at (2, 1).\n * @param {number} v31 The values at (3, 1).\n * @param {number} v02 The values at (0, 2).\n * @param {number} v12 The values at (1, 2).\n * @param {number} v22 The values at (2, 2).\n * @param {number} v32 The values at (3, 2).\n * @param {number} v03 The values at (0, 3).\n * @param {number} v13 The values at (1, 3).\n * @param {number} v23 The values at (2, 3).\n * @param {number} v33 The values at (3, 3).\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.setFromValues = function(\n    mat, v00, v10, v20, v30, v01, v11, v21, v31, v02, v12, v22, v32, v03, v13,\n    v23, v33) {\n  mat[0] = v00;\n  mat[1] = v10;\n  mat[2] = v20;\n  mat[3] = v30;\n  mat[4] = v01;\n  mat[5] = v11;\n  mat[6] = v21;\n  mat[7] = v31;\n  mat[8] = v02;\n  mat[9] = v12;\n  mat[10] = v22;\n  mat[11] = v32;\n  mat[12] = v03;\n  mat[13] = v13;\n  mat[14] = v23;\n  mat[15] = v33;\n  return mat;\n};\n\n\n/**\n * Sets the matrix from the array of values stored in column major order.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to receive the values.\n * @param {goog.vec.Mat4.AnyType} values The column major ordered\n *     array of values to store in the matrix.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.setFromArray = function(mat, values) {\n  mat[0] = values[0];\n  mat[1] = values[1];\n  mat[2] = values[2];\n  mat[3] = values[3];\n  mat[4] = values[4];\n  mat[5] = values[5];\n  mat[6] = values[6];\n  mat[7] = values[7];\n  mat[8] = values[8];\n  mat[9] = values[9];\n  mat[10] = values[10];\n  mat[11] = values[11];\n  mat[12] = values[12];\n  mat[13] = values[13];\n  mat[14] = values[14];\n  mat[15] = values[15];\n  return mat;\n};\n\n\n/**\n * Sets the matrix from the array of values stored in row major order.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to receive the values.\n * @param {goog.vec.Mat4.AnyType} values The row major ordered array of\n *     values to store in the matrix.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.setFromRowMajorArray = function(mat, values) {\n  mat[0] = values[0];\n  mat[1] = values[4];\n  mat[2] = values[8];\n  mat[3] = values[12];\n\n  mat[4] = values[1];\n  mat[5] = values[5];\n  mat[6] = values[9];\n  mat[7] = values[13];\n\n  mat[8] = values[2];\n  mat[9] = values[6];\n  mat[10] = values[10];\n  mat[11] = values[14];\n\n  mat[12] = values[3];\n  mat[13] = values[7];\n  mat[14] = values[11];\n  mat[15] = values[15];\n\n  return mat;\n};\n\n\n/**\n * Sets the diagonal values of the matrix from the given values.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to receive the values.\n * @param {number} v00 The values for (0, 0).\n * @param {number} v11 The values for (1, 1).\n * @param {number} v22 The values for (2, 2).\n * @param {number} v33 The values for (3, 3).\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.setDiagonalValues = function(mat, v00, v11, v22, v33) {\n  mat[0] = v00;\n  mat[5] = v11;\n  mat[10] = v22;\n  mat[15] = v33;\n  return mat;\n};\n\n\n/**\n * Sets the diagonal values of the matrix from the given vector.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to receive the values.\n * @param {goog.vec.Vec4.AnyType} vec The vector containing the values.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.setDiagonal = function(mat, vec) {\n  mat[0] = vec[0];\n  mat[5] = vec[1];\n  mat[10] = vec[2];\n  mat[15] = vec[3];\n  return mat;\n};\n\n\n/**\n * Gets the diagonal values of the matrix into the given vector.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix containing the values.\n * @param {goog.vec.Vec4.AnyType} vec The vector to receive the values.\n * @param {number=} opt_diagonal Which diagonal to get. A value of 0 selects the\n *     main diagonal, a positive number selects a super diagonal and a negative\n *     number selects a sub diagonal.\n * @return {goog.vec.Vec4.AnyType} return vec so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.getDiagonal = function(mat, vec, opt_diagonal) {\n  if (!opt_diagonal) {\n    // This is the most common case, so we avoid the for loop.\n    vec[0] = mat[0];\n    vec[1] = mat[5];\n    vec[2] = mat[10];\n    vec[3] = mat[15];\n  } else {\n    var offset = opt_diagonal > 0 ? 4 * opt_diagonal : -opt_diagonal;\n    for (var i = 0; i < 4 - Math.abs(opt_diagonal); i++) {\n      vec[i] = mat[offset + 5 * i];\n    }\n  }\n  return vec;\n};\n\n\n/**\n * Sets the specified column with the supplied values.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to receive the values.\n * @param {number} column The column index to set the values on.\n * @param {number} v0 The value for row 0.\n * @param {number} v1 The value for row 1.\n * @param {number} v2 The value for row 2.\n * @param {number} v3 The value for row 3.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.setColumnValues = function(mat, column, v0, v1, v2, v3) {\n  var i = column * 4;\n  mat[i] = v0;\n  mat[i + 1] = v1;\n  mat[i + 2] = v2;\n  mat[i + 3] = v3;\n  return mat;\n};\n\n\n/**\n * Sets the specified column with the value from the supplied vector.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to receive the values.\n * @param {number} column The column index to set the values on.\n * @param {goog.vec.Vec4.AnyType} vec The vector of elements for the column.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.setColumn = function(mat, column, vec) {\n  var i = column * 4;\n  mat[i] = vec[0];\n  mat[i + 1] = vec[1];\n  mat[i + 2] = vec[2];\n  mat[i + 3] = vec[3];\n  return mat;\n};\n\n\n/**\n * Retrieves the specified column from the matrix into the given vector.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix supplying the values.\n * @param {number} column The column to get the values from.\n * @param {goog.vec.Vec4.AnyType} vec The vector of elements to\n *     receive the column.\n * @return {goog.vec.Vec4.AnyType} return vec so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.getColumn = function(mat, column, vec) {\n  var i = column * 4;\n  vec[0] = mat[i];\n  vec[1] = mat[i + 1];\n  vec[2] = mat[i + 2];\n  vec[3] = mat[i + 3];\n  return vec;\n};\n\n\n/**\n * Sets the columns of the matrix from the given vectors.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to receive the values.\n * @param {goog.vec.Vec4.AnyType} vec0 The values for column 0.\n * @param {goog.vec.Vec4.AnyType} vec1 The values for column 1.\n * @param {goog.vec.Vec4.AnyType} vec2 The values for column 2.\n * @param {goog.vec.Vec4.AnyType} vec3 The values for column 3.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.setColumns = function(mat, vec0, vec1, vec2, vec3) {\n  goog.vec.Mat4.setColumn(mat, 0, vec0);\n  goog.vec.Mat4.setColumn(mat, 1, vec1);\n  goog.vec.Mat4.setColumn(mat, 2, vec2);\n  goog.vec.Mat4.setColumn(mat, 3, vec3);\n  return mat;\n};\n\n\n/**\n * Retrieves the column values from the given matrix into the given vectors.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix supplying the columns.\n * @param {goog.vec.Vec4.AnyType} vec0 The vector to receive column 0.\n * @param {goog.vec.Vec4.AnyType} vec1 The vector to receive column 1.\n * @param {goog.vec.Vec4.AnyType} vec2 The vector to receive column 2.\n * @param {goog.vec.Vec4.AnyType} vec3 The vector to receive column 3.\n */\ngoog.vec.Mat4.getColumns = function(mat, vec0, vec1, vec2, vec3) {\n  goog.vec.Mat4.getColumn(mat, 0, vec0);\n  goog.vec.Mat4.getColumn(mat, 1, vec1);\n  goog.vec.Mat4.getColumn(mat, 2, vec2);\n  goog.vec.Mat4.getColumn(mat, 3, vec3);\n};\n\n\n/**\n * Sets the row values from the supplied values.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to receive the values.\n * @param {number} row The index of the row to receive the values.\n * @param {number} v0 The value for column 0.\n * @param {number} v1 The value for column 1.\n * @param {number} v2 The value for column 2.\n * @param {number} v3 The value for column 3.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.setRowValues = function(mat, row, v0, v1, v2, v3) {\n  mat[row] = v0;\n  mat[row + 4] = v1;\n  mat[row + 8] = v2;\n  mat[row + 12] = v3;\n  return mat;\n};\n\n\n/**\n * Sets the row values from the supplied vector.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to receive the row values.\n * @param {number} row The index of the row.\n * @param {goog.vec.Vec4.AnyType} vec The vector containing the values.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.setRow = function(mat, row, vec) {\n  mat[row] = vec[0];\n  mat[row + 4] = vec[1];\n  mat[row + 8] = vec[2];\n  mat[row + 12] = vec[3];\n  return mat;\n};\n\n\n/**\n * Retrieves the row values into the given vector.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix supplying the values.\n * @param {number} row The index of the row supplying the values.\n * @param {goog.vec.Vec4.AnyType} vec The vector to receive the row.\n * @return {goog.vec.Vec4.AnyType} return vec so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.getRow = function(mat, row, vec) {\n  vec[0] = mat[row];\n  vec[1] = mat[row + 4];\n  vec[2] = mat[row + 8];\n  vec[3] = mat[row + 12];\n  return vec;\n};\n\n\n/**\n * Sets the rows of the matrix from the supplied vectors.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to receive the values.\n * @param {goog.vec.Vec4.AnyType} vec0 The values for row 0.\n * @param {goog.vec.Vec4.AnyType} vec1 The values for row 1.\n * @param {goog.vec.Vec4.AnyType} vec2 The values for row 2.\n * @param {goog.vec.Vec4.AnyType} vec3 The values for row 3.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.setRows = function(mat, vec0, vec1, vec2, vec3) {\n  goog.vec.Mat4.setRow(mat, 0, vec0);\n  goog.vec.Mat4.setRow(mat, 1, vec1);\n  goog.vec.Mat4.setRow(mat, 2, vec2);\n  goog.vec.Mat4.setRow(mat, 3, vec3);\n  return mat;\n};\n\n\n/**\n * Retrieves the rows of the matrix into the supplied vectors.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to supply the values.\n * @param {goog.vec.Vec4.AnyType} vec0 The vector to receive row 0.\n * @param {goog.vec.Vec4.AnyType} vec1 The vector to receive row 1.\n * @param {goog.vec.Vec4.AnyType} vec2 The vector to receive row 2.\n * @param {goog.vec.Vec4.AnyType} vec3 The vector to receive row 3.\n */\ngoog.vec.Mat4.getRows = function(mat, vec0, vec1, vec2, vec3) {\n  goog.vec.Mat4.getRow(mat, 0, vec0);\n  goog.vec.Mat4.getRow(mat, 1, vec1);\n  goog.vec.Mat4.getRow(mat, 2, vec2);\n  goog.vec.Mat4.getRow(mat, 3, vec3);\n};\n\n\n/**\n * Makes the given 4x4 matrix the zero matrix.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @return {!goog.vec.Mat4.AnyType} return mat so operations can be chained.\n */\ngoog.vec.Mat4.makeZero = function(mat) {\n  mat[0] = 0;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = 0;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = 0;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 0;\n  return mat;\n};\n\n\n/**\n * Makes the given 4x4 matrix the identity matrix.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @return {goog.vec.Mat4.AnyType} return mat so operations can be chained.\n */\ngoog.vec.Mat4.makeIdentity = function(mat) {\n  mat[0] = 1;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = 1;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  mat[9] = 0;\n  mat[10] = 1;\n  mat[11] = 0;\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n  return mat;\n};\n\n\n/**\n * Performs a per-component addition of the matrix mat0 and mat1, storing\n * the result into resultMat.\n *\n * @param {goog.vec.Mat4.AnyType} mat0 The first addend.\n * @param {goog.vec.Mat4.AnyType} mat1 The second addend.\n * @param {goog.vec.Mat4.AnyType} resultMat The matrix to\n *     receive the results (may be either mat0 or mat1).\n * @return {goog.vec.Mat4.AnyType} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.addMat = function(mat0, mat1, resultMat) {\n  resultMat[0] = mat0[0] + mat1[0];\n  resultMat[1] = mat0[1] + mat1[1];\n  resultMat[2] = mat0[2] + mat1[2];\n  resultMat[3] = mat0[3] + mat1[3];\n  resultMat[4] = mat0[4] + mat1[4];\n  resultMat[5] = mat0[5] + mat1[5];\n  resultMat[6] = mat0[6] + mat1[6];\n  resultMat[7] = mat0[7] + mat1[7];\n  resultMat[8] = mat0[8] + mat1[8];\n  resultMat[9] = mat0[9] + mat1[9];\n  resultMat[10] = mat0[10] + mat1[10];\n  resultMat[11] = mat0[11] + mat1[11];\n  resultMat[12] = mat0[12] + mat1[12];\n  resultMat[13] = mat0[13] + mat1[13];\n  resultMat[14] = mat0[14] + mat1[14];\n  resultMat[15] = mat0[15] + mat1[15];\n  return resultMat;\n};\n\n\n/**\n * Performs a per-component subtraction of the matrix mat0 and mat1,\n * storing the result into resultMat.\n *\n * @param {goog.vec.Mat4.AnyType} mat0 The minuend.\n * @param {goog.vec.Mat4.AnyType} mat1 The subtrahend.\n * @param {goog.vec.Mat4.AnyType} resultMat The matrix to receive\n *     the results (may be either mat0 or mat1).\n * @return {goog.vec.Mat4.AnyType} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.subMat = function(mat0, mat1, resultMat) {\n  resultMat[0] = mat0[0] - mat1[0];\n  resultMat[1] = mat0[1] - mat1[1];\n  resultMat[2] = mat0[2] - mat1[2];\n  resultMat[3] = mat0[3] - mat1[3];\n  resultMat[4] = mat0[4] - mat1[4];\n  resultMat[5] = mat0[5] - mat1[5];\n  resultMat[6] = mat0[6] - mat1[6];\n  resultMat[7] = mat0[7] - mat1[7];\n  resultMat[8] = mat0[8] - mat1[8];\n  resultMat[9] = mat0[9] - mat1[9];\n  resultMat[10] = mat0[10] - mat1[10];\n  resultMat[11] = mat0[11] - mat1[11];\n  resultMat[12] = mat0[12] - mat1[12];\n  resultMat[13] = mat0[13] - mat1[13];\n  resultMat[14] = mat0[14] - mat1[14];\n  resultMat[15] = mat0[15] - mat1[15];\n  return resultMat;\n};\n\n\n/**\n * Multiplies matrix mat with the given scalar, storing the result\n * into resultMat.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} scalar The scalar value to multiply to each element of mat.\n * @param {goog.vec.Mat4.AnyType} resultMat The matrix to receive\n *     the results (may be mat).\n * @return {goog.vec.Mat4.AnyType} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.multScalar = function(mat, scalar, resultMat) {\n  resultMat[0] = mat[0] * scalar;\n  resultMat[1] = mat[1] * scalar;\n  resultMat[2] = mat[2] * scalar;\n  resultMat[3] = mat[3] * scalar;\n  resultMat[4] = mat[4] * scalar;\n  resultMat[5] = mat[5] * scalar;\n  resultMat[6] = mat[6] * scalar;\n  resultMat[7] = mat[7] * scalar;\n  resultMat[8] = mat[8] * scalar;\n  resultMat[9] = mat[9] * scalar;\n  resultMat[10] = mat[10] * scalar;\n  resultMat[11] = mat[11] * scalar;\n  resultMat[12] = mat[12] * scalar;\n  resultMat[13] = mat[13] * scalar;\n  resultMat[14] = mat[14] * scalar;\n  resultMat[15] = mat[15] * scalar;\n  return resultMat;\n};\n\n\n/**\n * Multiplies the two matrices mat0 and mat1 using matrix multiplication,\n * storing the result into resultMat.\n *\n * @param {goog.vec.Mat4.AnyType} mat0 The first (left hand) matrix.\n * @param {goog.vec.Mat4.AnyType} mat1 The second (right hand) matrix.\n * @param {goog.vec.Mat4.AnyType} resultMat The matrix to receive\n *     the results (may be either mat0 or mat1).\n * @return {goog.vec.Mat4.AnyType} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.multMat = function(mat0, mat1, resultMat) {\n  var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2], a30 = mat0[3];\n  var a01 = mat0[4], a11 = mat0[5], a21 = mat0[6], a31 = mat0[7];\n  var a02 = mat0[8], a12 = mat0[9], a22 = mat0[10], a32 = mat0[11];\n  var a03 = mat0[12], a13 = mat0[13], a23 = mat0[14], a33 = mat0[15];\n\n  var b00 = mat1[0], b10 = mat1[1], b20 = mat1[2], b30 = mat1[3];\n  var b01 = mat1[4], b11 = mat1[5], b21 = mat1[6], b31 = mat1[7];\n  var b02 = mat1[8], b12 = mat1[9], b22 = mat1[10], b32 = mat1[11];\n  var b03 = mat1[12], b13 = mat1[13], b23 = mat1[14], b33 = mat1[15];\n\n  resultMat[0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30;\n  resultMat[1] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30;\n  resultMat[2] = a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30;\n  resultMat[3] = a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30;\n\n  resultMat[4] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31;\n  resultMat[5] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31;\n  resultMat[6] = a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31;\n  resultMat[7] = a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31;\n\n  resultMat[8] = a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32;\n  resultMat[9] = a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32;\n  resultMat[10] = a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32;\n  resultMat[11] = a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32;\n\n  resultMat[12] = a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33;\n  resultMat[13] = a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33;\n  resultMat[14] = a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33;\n  resultMat[15] = a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33;\n  return resultMat;\n};\n\n\n/**\n * Transposes the given matrix mat storing the result into resultMat.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to transpose.\n * @param {goog.vec.Mat4.AnyType} resultMat The matrix to receive\n *     the results (may be mat).\n * @return {goog.vec.Mat4.AnyType} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.transpose = function(mat, resultMat) {\n  if (resultMat == mat) {\n    var a10 = mat[1], a20 = mat[2], a30 = mat[3];\n    var a21 = mat[6], a31 = mat[7];\n    var a32 = mat[11];\n    resultMat[1] = mat[4];\n    resultMat[2] = mat[8];\n    resultMat[3] = mat[12];\n    resultMat[4] = a10;\n    resultMat[6] = mat[9];\n    resultMat[7] = mat[13];\n    resultMat[8] = a20;\n    resultMat[9] = a21;\n    resultMat[11] = mat[14];\n    resultMat[12] = a30;\n    resultMat[13] = a31;\n    resultMat[14] = a32;\n  } else {\n    resultMat[0] = mat[0];\n    resultMat[1] = mat[4];\n    resultMat[2] = mat[8];\n    resultMat[3] = mat[12];\n\n    resultMat[4] = mat[1];\n    resultMat[5] = mat[5];\n    resultMat[6] = mat[9];\n    resultMat[7] = mat[13];\n\n    resultMat[8] = mat[2];\n    resultMat[9] = mat[6];\n    resultMat[10] = mat[10];\n    resultMat[11] = mat[14];\n\n    resultMat[12] = mat[3];\n    resultMat[13] = mat[7];\n    resultMat[14] = mat[11];\n    resultMat[15] = mat[15];\n  }\n  return resultMat;\n};\n\n\n/**\n * Computes the determinant of the matrix.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to compute the matrix for.\n * @return {number} The determinant of the matrix.\n */\ngoog.vec.Mat4.determinant = function(mat) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];\n  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];\n  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];\n  var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15];\n\n  var a0 = m00 * m11 - m10 * m01;\n  var a1 = m00 * m21 - m20 * m01;\n  var a2 = m00 * m31 - m30 * m01;\n  var a3 = m10 * m21 - m20 * m11;\n  var a4 = m10 * m31 - m30 * m11;\n  var a5 = m20 * m31 - m30 * m21;\n  var b0 = m02 * m13 - m12 * m03;\n  var b1 = m02 * m23 - m22 * m03;\n  var b2 = m02 * m33 - m32 * m03;\n  var b3 = m12 * m23 - m22 * m13;\n  var b4 = m12 * m33 - m32 * m13;\n  var b5 = m22 * m33 - m32 * m23;\n\n  return a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0;\n};\n\n\n/**\n * Computes the inverse of mat storing the result into resultMat. If the\n * inverse is defined, this function returns true, false otherwise.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix to invert.\n * @param {goog.vec.Mat4.AnyType} resultMat The matrix to receive\n *     the result (may be mat).\n * @return {boolean} True if the inverse is defined. If false is returned,\n *     resultMat is not modified.\n */\ngoog.vec.Mat4.invert = function(mat, resultMat) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];\n  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];\n  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];\n  var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15];\n\n  var a0 = m00 * m11 - m10 * m01;\n  var a1 = m00 * m21 - m20 * m01;\n  var a2 = m00 * m31 - m30 * m01;\n  var a3 = m10 * m21 - m20 * m11;\n  var a4 = m10 * m31 - m30 * m11;\n  var a5 = m20 * m31 - m30 * m21;\n  var b0 = m02 * m13 - m12 * m03;\n  var b1 = m02 * m23 - m22 * m03;\n  var b2 = m02 * m33 - m32 * m03;\n  var b3 = m12 * m23 - m22 * m13;\n  var b4 = m12 * m33 - m32 * m13;\n  var b5 = m22 * m33 - m32 * m23;\n\n  var det = a0 * b5 - a1 * b4 + a2 * b3 + a3 * b2 - a4 * b1 + a5 * b0;\n  if (det == 0) {\n    return false;\n  }\n\n  var idet = 1.0 / det;\n  resultMat[0] = (m11 * b5 - m21 * b4 + m31 * b3) * idet;\n  resultMat[1] = (-m10 * b5 + m20 * b4 - m30 * b3) * idet;\n  resultMat[2] = (m13 * a5 - m23 * a4 + m33 * a3) * idet;\n  resultMat[3] = (-m12 * a5 + m22 * a4 - m32 * a3) * idet;\n  resultMat[4] = (-m01 * b5 + m21 * b2 - m31 * b1) * idet;\n  resultMat[5] = (m00 * b5 - m20 * b2 + m30 * b1) * idet;\n  resultMat[6] = (-m03 * a5 + m23 * a2 - m33 * a1) * idet;\n  resultMat[7] = (m02 * a5 - m22 * a2 + m32 * a1) * idet;\n  resultMat[8] = (m01 * b4 - m11 * b2 + m31 * b0) * idet;\n  resultMat[9] = (-m00 * b4 + m10 * b2 - m30 * b0) * idet;\n  resultMat[10] = (m03 * a4 - m13 * a2 + m33 * a0) * idet;\n  resultMat[11] = (-m02 * a4 + m12 * a2 - m32 * a0) * idet;\n  resultMat[12] = (-m01 * b3 + m11 * b1 - m21 * b0) * idet;\n  resultMat[13] = (m00 * b3 - m10 * b1 + m20 * b0) * idet;\n  resultMat[14] = (-m03 * a3 + m13 * a1 - m23 * a0) * idet;\n  resultMat[15] = (m02 * a3 - m12 * a1 + m22 * a0) * idet;\n  return true;\n};\n\n\n/**\n * Returns true if the components of mat0 are equal to the components of mat1.\n *\n * @param {goog.vec.Mat4.AnyType} mat0 The first matrix.\n * @param {goog.vec.Mat4.AnyType} mat1 The second matrix.\n * @return {boolean} True if the the two matrices are equivalent.\n */\ngoog.vec.Mat4.equals = function(mat0, mat1) {\n  return mat0.length == mat1.length && mat0[0] == mat1[0] &&\n      mat0[1] == mat1[1] && mat0[2] == mat1[2] && mat0[3] == mat1[3] &&\n      mat0[4] == mat1[4] && mat0[5] == mat1[5] && mat0[6] == mat1[6] &&\n      mat0[7] == mat1[7] && mat0[8] == mat1[8] && mat0[9] == mat1[9] &&\n      mat0[10] == mat1[10] && mat0[11] == mat1[11] && mat0[12] == mat1[12] &&\n      mat0[13] == mat1[13] && mat0[14] == mat1[14] && mat0[15] == mat1[15];\n};\n\n\n/**\n * Transforms the given vector with the given matrix storing the resulting,\n * transformed vector into resultVec. The input vector is multiplied against the\n * upper 3x4 matrix omitting the projective component.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix supplying the transformation.\n * @param {goog.vec.Vec3.AnyType} vec The 3 element vector to transform.\n * @param {goog.vec.Vec3.AnyType} resultVec The 3 element vector to\n *     receive the results (may be vec).\n * @return {goog.vec.Vec3.AnyType} return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.multVec3 = function(mat, vec, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2];\n  resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8] + mat[12];\n  resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9] + mat[13];\n  resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10] + mat[14];\n  return resultVec;\n};\n\n\n/**\n * Transforms the given vector with the given matrix storing the resulting,\n * transformed vector into resultVec. The input vector is multiplied against the\n * upper 3x3 matrix omitting the projective component and translation\n * components.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix supplying the transformation.\n * @param {goog.vec.Vec3.AnyType} vec The 3 element vector to transform.\n * @param {goog.vec.Vec3.AnyType} resultVec The 3 element vector to\n *     receive the results (may be vec).\n * @return {goog.vec.Vec3.AnyType} return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.multVec3NoTranslate = function(mat, vec, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2];\n  resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8];\n  resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9];\n  resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10];\n  return resultVec;\n};\n\n\n/**\n * Transforms the given vector with the given matrix storing the resulting,\n * transformed vector into resultVec. The input vector is multiplied against the\n * full 4x4 matrix with the homogeneous divide applied to reduce the 4 element\n * vector to a 3 element vector.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix supplying the transformation.\n * @param {goog.vec.Vec3.AnyType} vec The 3 element vector to transform.\n * @param {goog.vec.Vec3.AnyType} resultVec The 3 element vector\n *     to receive the results (may be vec).\n * @return {goog.vec.Vec3.AnyType} return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.multVec3Projective = function(mat, vec, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2];\n  var invw = 1 / (x * mat[3] + y * mat[7] + z * mat[11] + mat[15]);\n  resultVec[0] = (x * mat[0] + y * mat[4] + z * mat[8] + mat[12]) * invw;\n  resultVec[1] = (x * mat[1] + y * mat[5] + z * mat[9] + mat[13]) * invw;\n  resultVec[2] = (x * mat[2] + y * mat[6] + z * mat[10] + mat[14]) * invw;\n  return resultVec;\n};\n\n\n/**\n * Transforms the given vector with the given matrix storing the resulting,\n * transformed vector into resultVec.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix supplying the transformation.\n * @param {goog.vec.Vec4.AnyType} vec The vector to transform.\n * @param {goog.vec.Vec4.AnyType} resultVec The vector to\n *     receive the results (may be vec).\n * @return {goog.vec.Vec4.AnyType} return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.multVec4 = function(mat, vec, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2], w = vec[3];\n  resultVec[0] = x * mat[0] + y * mat[4] + z * mat[8] + w * mat[12];\n  resultVec[1] = x * mat[1] + y * mat[5] + z * mat[9] + w * mat[13];\n  resultVec[2] = x * mat[2] + y * mat[6] + z * mat[10] + w * mat[14];\n  resultVec[3] = x * mat[3] + y * mat[7] + z * mat[11] + w * mat[15];\n  return resultVec;\n};\n\n\n/**\n * Makes the given 4x4 matrix a translation matrix with x, y and z\n * translation factors.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} x The translation along the x axis.\n * @param {number} y The translation along the y axis.\n * @param {number} z The translation along the z axis.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.makeTranslate = function(mat, x, y, z) {\n  goog.vec.Mat4.makeIdentity(mat);\n  return goog.vec.Mat4.setColumnValues(mat, 3, x, y, z, 1);\n};\n\n\n/**\n * Makes the given 4x4 matrix as a scale matrix with x, y and z scale factors.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} x The scale along the x axis.\n * @param {number} y The scale along the y axis.\n * @param {number} z The scale along the z axis.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.makeScale = function(mat, x, y, z) {\n  goog.vec.Mat4.makeIdentity(mat);\n  return goog.vec.Mat4.setDiagonalValues(mat, x, y, z, 1);\n};\n\n\n/**\n * Makes the given 4x4 matrix a rotation matrix with the given rotation\n * angle about the axis defined by the vector (ax, ay, az).\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @param {number} ax The x component of the rotation axis.\n * @param {number} ay The y component of the rotation axis.\n * @param {number} az The z component of the rotation axis.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.makeRotate = function(mat, angle, ax, ay, az) {\n  var c = Math.cos(angle);\n  var d = 1 - c;\n  var s = Math.sin(angle);\n\n  return goog.vec.Mat4.setFromValues(\n      mat, ax * ax * d + c, ax * ay * d + az * s, ax * az * d - ay * s, 0,\n\n      ax * ay * d - az * s, ay * ay * d + c, ay * az * d + ax * s, 0,\n\n      ax * az * d + ay * s, ay * az * d - ax * s, az * az * d + c, 0,\n\n      0, 0, 0, 1);\n};\n\n\n/**\n * Makes the given 4x4 matrix a rotation matrix with the given rotation\n * angle about the X axis.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.makeRotateX = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n  return goog.vec.Mat4.setFromValues(\n      mat, 1, 0, 0, 0, 0, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1);\n};\n\n\n/**\n * Makes the given 4x4 matrix a rotation matrix with the given rotation\n * angle about the Y axis.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.makeRotateY = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n  return goog.vec.Mat4.setFromValues(\n      mat, c, 0, -s, 0, 0, 1, 0, 0, s, 0, c, 0, 0, 0, 0, 1);\n};\n\n\n/**\n * Makes the given 4x4 matrix a rotation matrix with the given rotation\n * angle about the Z axis.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.makeRotateZ = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n  return goog.vec.Mat4.setFromValues(\n      mat, c, s, 0, 0, -s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);\n};\n\n\n/**\n * Makes the given 4x4 matrix a perspective projection matrix.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} left The coordinate of the left clipping plane.\n * @param {number} right The coordinate of the right clipping plane.\n * @param {number} bottom The coordinate of the bottom clipping plane.\n * @param {number} top The coordinate of the top clipping plane.\n * @param {number} near The distance to the near clipping plane.\n * @param {number} far The distance to the far clipping plane.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.makeFrustum = function(mat, left, right, bottom, top, near, far) {\n  var x = (2 * near) / (right - left);\n  var y = (2 * near) / (top - bottom);\n  var a = (right + left) / (right - left);\n  var b = (top + bottom) / (top - bottom);\n  var c = -(far + near) / (far - near);\n  var d = -(2 * far * near) / (far - near);\n\n  return goog.vec.Mat4.setFromValues(\n      mat, x, 0, 0, 0, 0, y, 0, 0, a, b, c, -1, 0, 0, d, 0);\n};\n\n\n/**\n * Makes the given 4x4 matrix  perspective projection matrix given a\n * field of view and aspect ratio.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} fovy The field of view along the y (vertical) axis in\n *     radians.\n * @param {number} aspect The x (width) to y (height) aspect ratio.\n * @param {number} near The distance to the near clipping plane.\n * @param {number} far The distance to the far clipping plane.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.makePerspective = function(mat, fovy, aspect, near, far) {\n  var angle = fovy / 2;\n  var dz = far - near;\n  var sinAngle = Math.sin(angle);\n  if (dz == 0 || sinAngle == 0 || aspect == 0) {\n    return mat;\n  }\n\n  var cot = Math.cos(angle) / sinAngle;\n  return goog.vec.Mat4.setFromValues(\n      mat, cot / aspect, 0, 0, 0, 0, cot, 0, 0, 0, 0, -(far + near) / dz, -1, 0,\n      0, -(2 * near * far) / dz, 0);\n};\n\n\n/**\n * Makes the given 4x4 matrix an orthographic projection matrix.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} left The coordinate of the left clipping plane.\n * @param {number} right The coordinate of the right clipping plane.\n * @param {number} bottom The coordinate of the bottom clipping plane.\n * @param {number} top The coordinate of the top clipping plane.\n * @param {number} near The distance to the near clipping plane.\n * @param {number} far The distance to the far clipping plane.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.makeOrtho = function(mat, left, right, bottom, top, near, far) {\n  var x = 2 / (right - left);\n  var y = 2 / (top - bottom);\n  var z = -2 / (far - near);\n  var a = -(right + left) / (right - left);\n  var b = -(top + bottom) / (top - bottom);\n  var c = -(far + near) / (far - near);\n\n  return goog.vec.Mat4.setFromValues(\n      mat, x, 0, 0, 0, 0, y, 0, 0, 0, 0, z, 0, a, b, c, 1);\n};\n\n\n/**\n * Makes the given 4x4 matrix a modelview matrix of a camera so that\n * the camera is 'looking at' the given center point.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {goog.vec.Vec3.AnyType} eyePt The position of the eye point\n *     (camera origin).\n * @param {goog.vec.Vec3.AnyType} centerPt The point to aim the camera at.\n * @param {goog.vec.Vec3.AnyType} worldUpVec The vector that identifies\n *     the up direction for the camera.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.makeLookAt = function(mat, eyePt, centerPt, worldUpVec) {\n  // Compute the direction vector from the eye point to the center point and\n  // normalize.\n  var fwdVec = goog.vec.Mat4.tmpVec4_[0];\n  goog.vec.Vec3.subtract(centerPt, eyePt, fwdVec);\n  goog.vec.Vec3.normalize(fwdVec, fwdVec);\n  fwdVec[3] = 0;\n\n  // Compute the side vector from the forward vector and the input up vector.\n  var sideVec = goog.vec.Mat4.tmpVec4_[1];\n  goog.vec.Vec3.cross(fwdVec, worldUpVec, sideVec);\n  goog.vec.Vec3.normalize(sideVec, sideVec);\n  sideVec[3] = 0;\n\n  // Now the up vector to form the orthonormal basis.\n  var upVec = goog.vec.Mat4.tmpVec4_[2];\n  goog.vec.Vec3.cross(sideVec, fwdVec, upVec);\n  goog.vec.Vec3.normalize(upVec, upVec);\n  upVec[3] = 0;\n\n  // Update the view matrix with the new orthonormal basis and position the\n  // camera at the given eye point.\n  goog.vec.Vec3.negate(fwdVec, fwdVec);\n  goog.vec.Mat4.setRow(mat, 0, sideVec);\n  goog.vec.Mat4.setRow(mat, 1, upVec);\n  goog.vec.Mat4.setRow(mat, 2, fwdVec);\n  goog.vec.Mat4.setRowValues(mat, 3, 0, 0, 0, 1);\n  goog.vec.Mat4.translate(mat, -eyePt[0], -eyePt[1], -eyePt[2]);\n\n  return mat;\n};\n\n\n/**\n * Decomposes a matrix into the lookAt vectors eyePt, fwdVec and worldUpVec.\n * The matrix represents the modelview matrix of a camera. It is the inverse\n * of lookAt except for the output of the fwdVec instead of centerPt.\n * The centerPt itself cannot be recovered from a modelview matrix.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {goog.vec.Vec3.AnyType} eyePt The position of the eye point\n *     (camera origin).\n * @param {goog.vec.Vec3.AnyType} fwdVec The vector describing where\n *     the camera points to.\n * @param {goog.vec.Vec3.AnyType} worldUpVec The vector that\n *     identifies the up direction for the camera.\n * @return {boolean} True if the method succeeds, false otherwise.\n *     The method can only fail if the inverse of viewMatrix is not defined.\n */\ngoog.vec.Mat4.toLookAt = function(mat, eyePt, fwdVec, worldUpVec) {\n  // Get eye of the camera.\n  var matInverse = goog.vec.Mat4.tmpMat4_[0];\n  if (!goog.vec.Mat4.invert(mat, matInverse)) {\n    // The input matrix does not have a valid inverse.\n    return false;\n  }\n\n  if (eyePt) {\n    eyePt[0] = matInverse[12];\n    eyePt[1] = matInverse[13];\n    eyePt[2] = matInverse[14];\n  }\n\n  // Get forward vector from the definition of lookAt.\n  if (fwdVec || worldUpVec) {\n    if (!fwdVec) {\n      fwdVec = goog.vec.Mat4.tmpVec3_[0];\n    }\n    fwdVec[0] = -mat[2];\n    fwdVec[1] = -mat[6];\n    fwdVec[2] = -mat[10];\n    // Normalize forward vector.\n    goog.vec.Vec3.normalize(fwdVec, fwdVec);\n  }\n\n  if (worldUpVec) {\n    // Get side vector from the definition of gluLookAt.\n    var side = goog.vec.Mat4.tmpVec3_[1];\n    side[0] = mat[0];\n    side[1] = mat[4];\n    side[2] = mat[8];\n    // Compute up vector as a up = side x forward.\n    goog.vec.Vec3.cross(side, fwdVec, worldUpVec);\n    // Normalize up vector.\n    goog.vec.Vec3.normalize(worldUpVec, worldUpVec);\n  }\n  return true;\n};\n\n\n/**\n * Makes the given 4x4 matrix a rotation matrix given Euler angles using\n * the ZXZ convention.\n * Given the euler angles [theta1, theta2, theta3], the rotation is defined as\n * rotation = rotation_z(theta1) * rotation_x(theta2) * rotation_z(theta3),\n * with theta1 in [0, 2 * pi], theta2 in [0, pi] and theta3 in [0, 2 * pi].\n * rotation_x(theta) means rotation around the X axis of theta radians,\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} theta1 The angle of rotation around the Z axis in radians.\n * @param {number} theta2 The angle of rotation around the X axis in radians.\n * @param {number} theta3 The angle of rotation around the Z axis in radians.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.makeEulerZXZ = function(mat, theta1, theta2, theta3) {\n  var c1 = Math.cos(theta1);\n  var s1 = Math.sin(theta1);\n\n  var c2 = Math.cos(theta2);\n  var s2 = Math.sin(theta2);\n\n  var c3 = Math.cos(theta3);\n  var s3 = Math.sin(theta3);\n\n  mat[0] = c1 * c3 - c2 * s1 * s3;\n  mat[1] = c2 * c1 * s3 + c3 * s1;\n  mat[2] = s3 * s2;\n  mat[3] = 0;\n\n  mat[4] = -c1 * s3 - c3 * c2 * s1;\n  mat[5] = c1 * c2 * c3 - s1 * s3;\n  mat[6] = c3 * s2;\n  mat[7] = 0;\n\n  mat[8] = s2 * s1;\n  mat[9] = -c1 * s2;\n  mat[10] = c2;\n  mat[11] = 0;\n\n  mat[12] = 0;\n  mat[13] = 0;\n  mat[14] = 0;\n  mat[15] = 1;\n\n  return mat;\n};\n\n\n/**\n * Decomposes a rotation matrix into Euler angles using the ZXZ convention so\n * that rotation = rotation_z(theta1) * rotation_x(theta2) * rotation_z(theta3),\n * with theta1 in [0, 2 * pi], theta2 in [0, pi] and theta3 in [0, 2 * pi].\n * rotation_x(theta) means rotation around the X axis of theta radians.\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {goog.vec.Vec3.AnyType} euler The ZXZ Euler angles in\n *     radians as [theta1, theta2, theta3].\n * @param {boolean=} opt_theta2IsNegative Whether theta2 is in [-pi, 0] instead\n *     of the default [0, pi].\n * @return {goog.vec.Vec4.AnyType} return euler so that operations can be\n *     chained together.\n */\ngoog.vec.Mat4.toEulerZXZ = function(mat, euler, opt_theta2IsNegative) {\n  // There is an ambiguity in the sign of sinTheta2 because of the sqrt.\n  var sinTheta2 = Math.sqrt(mat[2] * mat[2] + mat[6] * mat[6]);\n\n  // By default we explicitely constrain theta2 to be in [0, pi],\n  // so sinTheta2 is always positive. We can change the behavior and specify\n  // theta2 to be negative in [-pi, 0] with opt_Theta2IsNegative.\n  var signTheta2 = opt_theta2IsNegative ? -1 : 1;\n\n  if (sinTheta2 > goog.vec.EPSILON) {\n    euler[2] = Math.atan2(mat[2] * signTheta2, mat[6] * signTheta2);\n    euler[1] = Math.atan2(sinTheta2 * signTheta2, mat[10]);\n    euler[0] = Math.atan2(mat[8] * signTheta2, -mat[9] * signTheta2);\n  } else {\n    // There is also an arbitrary choice for theta1 = 0 or theta2 = 0 here.\n    // We assume theta1 = 0 as some applications do not allow the camera to roll\n    // (i.e. have theta1 != 0).\n    euler[0] = 0;\n    euler[1] = Math.atan2(sinTheta2 * signTheta2, mat[10]);\n    euler[2] = Math.atan2(mat[1], mat[0]);\n  }\n\n  // Atan2 outputs angles in [-pi, pi] so we bring them back to [0, 2 * pi].\n  euler[0] = (euler[0] + Math.PI * 2) % (Math.PI * 2);\n  euler[2] = (euler[2] + Math.PI * 2) % (Math.PI * 2);\n  // For theta2 we want the angle to be in [0, pi] or [-pi, 0] depending on\n  // signTheta2.\n  euler[1] =\n      ((euler[1] * signTheta2 + Math.PI * 2) % (Math.PI * 2)) * signTheta2;\n\n  return euler;\n};\n\n\n/**\n * Translates the given matrix by x,y,z.  Equvialent to:\n * goog.vec.Mat4.multMat(\n *     mat,\n *     goog.vec.Mat4.makeTranslate(goog.vec.Mat4.create(), x, y, z),\n *     mat);\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} x The translation along the x axis.\n * @param {number} y The translation along the y axis.\n * @param {number} z The translation along the z axis.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.translate = function(mat, x, y, z) {\n  return goog.vec.Mat4.setColumnValues(\n      mat, 3, mat[0] * x + mat[4] * y + mat[8] * z + mat[12],\n      mat[1] * x + mat[5] * y + mat[9] * z + mat[13],\n      mat[2] * x + mat[6] * y + mat[10] * z + mat[14],\n      mat[3] * x + mat[7] * y + mat[11] * z + mat[15]);\n};\n\n\n/**\n * Scales the given matrix by x,y,z.  Equivalent to:\n * goog.vec.Mat4.multMat(\n *     mat,\n *     goog.vec.Mat4.makeScale(goog.vec.Mat4.create(), x, y, z),\n *     mat);\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} x The x scale factor.\n * @param {number} y The y scale factor.\n * @param {number} z The z scale factor.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.scale = function(mat, x, y, z) {\n  return goog.vec.Mat4.setFromValues(\n      mat, mat[0] * x, mat[1] * x, mat[2] * x, mat[3] * x, mat[4] * y,\n      mat[5] * y, mat[6] * y, mat[7] * y, mat[8] * z, mat[9] * z, mat[10] * z,\n      mat[11] * z, mat[12], mat[13], mat[14], mat[15]);\n};\n\n\n/**\n * Rotate the given matrix by angle about the x,y,z axis.  Equivalent to:\n * goog.vec.Mat4.multMat(\n *     mat,\n *     goog.vec.Mat4.makeRotate(goog.vec.Mat4.create(), angle, x, y, z),\n *     mat);\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} angle The angle in radians.\n * @param {number} x The x component of the rotation axis.\n * @param {number} y The y component of the rotation axis.\n * @param {number} z The z component of the rotation axis.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.rotate = function(mat, angle, x, y, z) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];\n  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];\n  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];\n  var m03 = mat[12], m13 = mat[13], m23 = mat[14], m33 = mat[15];\n\n  var cosAngle = Math.cos(angle);\n  var sinAngle = Math.sin(angle);\n  var diffCosAngle = 1 - cosAngle;\n  var r00 = x * x * diffCosAngle + cosAngle;\n  var r10 = x * y * diffCosAngle + z * sinAngle;\n  var r20 = x * z * diffCosAngle - y * sinAngle;\n\n  var r01 = x * y * diffCosAngle - z * sinAngle;\n  var r11 = y * y * diffCosAngle + cosAngle;\n  var r21 = y * z * diffCosAngle + x * sinAngle;\n\n  var r02 = x * z * diffCosAngle + y * sinAngle;\n  var r12 = y * z * diffCosAngle - x * sinAngle;\n  var r22 = z * z * diffCosAngle + cosAngle;\n\n  return goog.vec.Mat4.setFromValues(\n      mat, m00 * r00 + m01 * r10 + m02 * r20, m10 * r00 + m11 * r10 + m12 * r20,\n      m20 * r00 + m21 * r10 + m22 * r20, m30 * r00 + m31 * r10 + m32 * r20,\n\n      m00 * r01 + m01 * r11 + m02 * r21, m10 * r01 + m11 * r11 + m12 * r21,\n      m20 * r01 + m21 * r11 + m22 * r21, m30 * r01 + m31 * r11 + m32 * r21,\n\n      m00 * r02 + m01 * r12 + m02 * r22, m10 * r02 + m11 * r12 + m12 * r22,\n      m20 * r02 + m21 * r12 + m22 * r22, m30 * r02 + m31 * r12 + m32 * r22,\n\n      m03, m13, m23, m33);\n};\n\n\n/**\n * Rotate the given matrix by angle about the x axis.  Equivalent to:\n * goog.vec.Mat4.multMat(\n *     mat,\n *     goog.vec.Mat4.makeRotateX(goog.vec.Mat4.create(), angle),\n *     mat);\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.rotateX = function(mat, angle) {\n  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];\n  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[4] = m01 * c + m02 * s;\n  mat[5] = m11 * c + m12 * s;\n  mat[6] = m21 * c + m22 * s;\n  mat[7] = m31 * c + m32 * s;\n  mat[8] = m01 * -s + m02 * c;\n  mat[9] = m11 * -s + m12 * c;\n  mat[10] = m21 * -s + m22 * c;\n  mat[11] = m31 * -s + m32 * c;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the y axis.  Equivalent to:\n * goog.vec.Mat4.multMat(\n *     mat,\n *     goog.vec.Mat4.makeRotateY(goog.vec.Mat4.create(), angle),\n *     mat);\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.rotateY = function(mat, angle) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];\n  var m02 = mat[8], m12 = mat[9], m22 = mat[10], m32 = mat[11];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = m00 * c + m02 * -s;\n  mat[1] = m10 * c + m12 * -s;\n  mat[2] = m20 * c + m22 * -s;\n  mat[3] = m30 * c + m32 * -s;\n  mat[8] = m00 * s + m02 * c;\n  mat[9] = m10 * s + m12 * c;\n  mat[10] = m20 * s + m22 * c;\n  mat[11] = m30 * s + m32 * c;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the z axis.  Equivalent to:\n * goog.vec.Mat4.multMat(\n *     mat,\n *     goog.vec.Mat4.makeRotateZ(goog.vec.Mat4.create(), angle),\n *     mat);\n *\n * @param {goog.vec.Mat4.AnyType} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.rotateZ = function(mat, angle) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2], m30 = mat[3];\n  var m01 = mat[4], m11 = mat[5], m21 = mat[6], m31 = mat[7];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = m00 * c + m01 * s;\n  mat[1] = m10 * c + m11 * s;\n  mat[2] = m20 * c + m21 * s;\n  mat[3] = m30 * c + m31 * s;\n  mat[4] = m00 * -s + m01 * c;\n  mat[5] = m10 * -s + m11 * c;\n  mat[6] = m20 * -s + m21 * c;\n  mat[7] = m30 * -s + m31 * c;\n\n  return mat;\n};\n\n\n/**\n * Retrieves the translation component of the transformation matrix.\n *\n * @param {goog.vec.Mat4.AnyType} mat The transformation matrix.\n * @param {goog.vec.Vec3.AnyType} translation The vector for storing the\n *     result.\n * @return {goog.vec.Mat4.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat4.getTranslation = function(mat, translation) {\n  translation[0] = mat[12];\n  translation[1] = mat[13];\n  translation[2] = mat[14];\n  return translation;\n};\n\n\n/**\n * @type {!Array<!goog.vec.Mat4.Float64>}\n * @private\n */\ngoog.vec.Mat4.tmpVec3_ =\n    [goog.vec.Vec3.createFloat64(), goog.vec.Vec3.createFloat64()];\n\n\n/**\n * @type {!Array<!goog.vec.Mat4.Float64>}\n * @private\n */\ngoog.vec.Mat4.tmpVec4_ = [\n  goog.vec.Vec4.createFloat64(), goog.vec.Vec4.createFloat64(),\n  goog.vec.Vec4.createFloat64()\n];\n\n\n/**\n * @type {!Array<!goog.vec.Mat4.Float64>}\n * @private\n */\ngoog.vec.Mat4.tmpMat4_ = [goog.vec.Mat4.createFloat64()];\n","^17",1579837703000,"^18",["^19",["~$goog.vec.Vec4","~$goog.vec","^63","^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/mat4.js"],"^1J",["^19",["~$goog.vec.Mat4"]],"^X",true,"^Y",["^Z","^;<","^63","^;;"]],["^ ","^[",[1579837703000],"^2F",true,"^10","goog.labs.net.webchannel.forwardchannelrequestpool.js","^11",["^12","goog/labs/net/webchannel/forwardchannelrequestpool.js"],"^13","goog/labs/net/webchannel/forwardchannelrequestpool.js","^14","^15","^16","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A pool of forward channel requests to enable real-time\n * messaging from the client to server.\n */\n\ngoog.module('goog.labs.net.webChannel.ForwardChannelRequestPool');\n\ngoog.module.declareLegacyNamespace();\n\nvar ChannelRequest = goog.require('goog.labs.net.webChannel.ChannelRequest');\nvar Set = goog.require('goog.structs.Set');\nvar Wire = goog.require('goog.labs.net.webChannel.Wire');\nvar array = goog.require('goog.array');\nvar googString = goog.require('goog.string');\n\n\n/**\n * This class represents the state of all forward channel requests.\n *\n * @param {number=} opt_maxPoolSize The maximum pool size.\n *\n * @struct @constructor @final\n */\nvar ForwardChannelRequestPool = function(opt_maxPoolSize) {\n  /**\n   * The max pool size as configured.\n   *\n   * @private {number}\n   */\n  this.maxPoolSizeConfigured_ =\n      opt_maxPoolSize || ForwardChannelRequestPool.MAX_POOL_SIZE_;\n\n  /**\n   * The current size limit of the request pool. This limit is meant to be\n   * read-only after the channel is fully opened.\n   *\n   * If SPDY or HTTP2 is enabled, set it to the max pool size, which is also\n   * configurable.\n   *\n   * @private {number}\n   */\n  this.maxSize_ = ForwardChannelRequestPool.isSpdyOrHttp2Enabled_() ?\n      this.maxPoolSizeConfigured_ :\n      1;\n\n  /**\n   * The container for all the pending request objects.\n   *\n   * @private {?Set<?ChannelRequest>}\n   */\n  this.requestPool_ = null;\n\n  if (this.maxSize_ > 1) {\n    this.requestPool_ = new Set();\n  }\n\n  /**\n   * The single request object when the pool size is limited to one.\n   *\n   * @private {?ChannelRequest}\n   */\n  this.request_ = null;\n\n  /**\n   * Saved pending messages when the pool is cancelled.\n   *\n   * @private {!Array<Wire.QueuedMap>}\n   */\n  this.pendingMessages_ = [];\n};\n\n\n/**\n * The default size limit of the request pool.\n *\n * @private {number}\n */\nForwardChannelRequestPool.MAX_POOL_SIZE_ = 10;\n\n\n/**\n * @return {boolean} True if SPDY or HTTP2 is enabled. Uses chrome-specific APIs\n *     as a fallback and will always return false for other browsers where\n *     PerformanceNavigationTiming is not available.\n * @private\n */\nForwardChannelRequestPool.isSpdyOrHttp2Enabled_ = function() {\n  if (goog.global.PerformanceNavigationTiming) {\n    var entrys = /** @type {!Array<!PerformanceNavigationTiming>} */ (\n        goog.global.performance.getEntriesByType('navigation'));\n    return entrys.length > 0 &&\n        (entrys[0].nextHopProtocol == 'hq' ||\n         entrys[0].nextHopProtocol == 'h2');\n  }\n  return !!(\n      goog.global.chrome && goog.global.chrome.loadTimes &&\n      goog.global.chrome.loadTimes() &&\n      goog.global.chrome.loadTimes().wasFetchedViaSpdy);\n};\n\n\n/**\n * Once we know the client protocol (from the handshake), check if we need\n * enable the request pool accordingly. This is more robust than using\n * browser-internal APIs (specific to Chrome).\n *\n * @param {string} clientProtocol The client protocol\n */\nForwardChannelRequestPool.prototype.applyClientProtocol = function(\n    clientProtocol) {\n  if (this.requestPool_) {\n    return;\n  }\n\n  if (googString.contains(clientProtocol, 'spdy') ||\n      googString.contains(clientProtocol, 'quic') ||\n      googString.contains(clientProtocol, 'h2')) {\n    this.maxSize_ = this.maxPoolSizeConfigured_;\n    this.requestPool_ = new Set();\n    if (this.request_) {\n      this.addRequest(this.request_);\n      this.request_ = null;\n    }\n  }\n};\n\n\n/**\n * @return {boolean} True if the pool is full.\n */\nForwardChannelRequestPool.prototype.isFull = function() {\n  if (this.request_) {\n    return true;\n  }\n\n  if (this.requestPool_) {\n    return this.requestPool_.getCount() >= this.maxSize_;\n  }\n\n  return false;\n};\n\n\n/**\n * @return {number} The current size limit.\n */\nForwardChannelRequestPool.prototype.getMaxSize = function() {\n  return this.maxSize_;\n};\n\n\n/**\n * @return {number} The number of pending requests in the pool.\n */\nForwardChannelRequestPool.prototype.getRequestCount = function() {\n  if (this.request_) {\n    return 1;\n  }\n\n  if (this.requestPool_) {\n    return this.requestPool_.getCount();\n  }\n\n  return 0;\n};\n\n\n/**\n * @param {ChannelRequest} req The channel request.\n * @return {boolean} True if the request is a included inside the pool.\n */\nForwardChannelRequestPool.prototype.hasRequest = function(req) {\n  if (this.request_) {\n    return this.request_ == req;\n  }\n\n  if (this.requestPool_) {\n    return this.requestPool_.contains(req);\n  }\n\n  return false;\n};\n\n\n/**\n * Adds a new request to the pool.\n *\n * @param {!ChannelRequest} req The new channel request.\n */\nForwardChannelRequestPool.prototype.addRequest = function(req) {\n  if (this.requestPool_) {\n    this.requestPool_.add(req);\n  } else {\n    this.request_ = req;\n  }\n};\n\n\n/**\n * Removes the given request from the pool.\n *\n * @param {ChannelRequest} req The channel request.\n * @return {boolean} Whether the request has been removed from the pool.\n */\nForwardChannelRequestPool.prototype.removeRequest = function(req) {\n  if (this.request_ && this.request_ == req) {\n    this.request_ = null;\n    return true;\n  }\n\n  if (this.requestPool_ && this.requestPool_.contains(req)) {\n    this.requestPool_.remove(req);\n    return true;\n  }\n\n  return false;\n};\n\n\n/**\n * Clears the pool and cancel all the pending requests.\n */\nForwardChannelRequestPool.prototype.cancel = function() {\n  // save any pending messages\n  this.pendingMessages_ = this.getPendingMessages();\n\n  if (this.request_) {\n    this.request_.cancel();\n    this.request_ = null;\n    return;\n  }\n\n  if (this.requestPool_ && !this.requestPool_.isEmpty()) {\n    array.forEach(this.requestPool_.getValues(), function(val) {\n      val.cancel();\n    });\n    this.requestPool_.clear();\n  }\n};\n\n\n/**\n * @return {boolean} Whether there are any pending requests.\n */\nForwardChannelRequestPool.prototype.hasPendingRequest = function() {\n  return (this.request_ != null) ||\n      (this.requestPool_ != null && !this.requestPool_.isEmpty());\n};\n\n\n/**\n * @return {!Array<Wire.QueuedMap>} All the pending messages from the pool,\n *     as a new array.\n */\nForwardChannelRequestPool.prototype.getPendingMessages = function() {\n  if (this.request_ != null) {\n    return this.pendingMessages_.concat(this.request_.getPendingMessages());\n  }\n\n  if (this.requestPool_ != null && !this.requestPool_.isEmpty()) {\n    var result = this.pendingMessages_;\n    array.forEach(this.requestPool_.getValues(), function(val) {\n      result = result.concat(val.getPendingMessages());\n    });\n    return result;\n  }\n\n  return array.clone(this.pendingMessages_);\n};\n\n\n/**\n * Records pending messages, e.g. when a request receives a failed response.\n *\n * @param {!Array<Wire.QueuedMap>} messages Pending messages.\n */\nForwardChannelRequestPool.prototype.addPendingMessages = function(messages) {\n  this.pendingMessages_ = this.pendingMessages_.concat(messages);\n};\n\n\n/**\n * Clears any recorded pending messages.\n */\nForwardChannelRequestPool.prototype.clearPendingMessages = function() {\n  this.pendingMessages_.length = 0;\n};\n\n\n/**\n * Cancels all pending requests and force the completion of channel requests.\n *\n * Need go through the standard onRequestComplete logic to expose the max-retry\n * failure in the standard way.\n *\n * @param {function(!ChannelRequest)} onComplete The completion callback.\n * @return {boolean} true if any request has been forced to complete.\n */\nForwardChannelRequestPool.prototype.forceComplete = function(onComplete) {\n  if (this.request_ != null) {\n    this.request_.cancel();\n    onComplete(this.request_);\n    return true;\n  }\n\n  if (this.requestPool_ && !this.requestPool_.isEmpty()) {\n    array.forEach(this.requestPool_.getValues(), function(val) {\n      val.cancel();\n      onComplete(val);\n    });\n    return true;\n  }\n\n  return false;\n};\n\nexports = ForwardChannelRequestPool;\n","^17",1579837703000,"^18",["^19",["^2D","~$goog.labs.net.webChannel.Wire","^5L","^Z","^35","~$goog.structs.Set"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchannel/forwardchannelrequestpool.js"],"^1J",["^19",["~$goog.labs.net.webChannel.ForwardChannelRequestPool"]],"^X",true,"^Y",["^Z","^5L","^;?","^;>","^35","^2D"]],["^ ","^[",[1579837703000],"^10","goog.positioning.anchoredposition.js","^11",["^12","goog/positioning/anchoredposition.js"],"^13","goog/positioning/anchoredposition.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Client positioning class.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.positioning.AnchoredPosition');\n\ngoog.require('goog.positioning');\ngoog.require('goog.positioning.AbstractPosition');\n\n\n\n/**\n * Encapsulates a popup position where the popup is anchored at a corner of\n * an element.\n *\n * When using AnchoredPosition, it is recommended that the popup element\n * specified in the Popup constructor or Popup.setElement be absolutely\n * positioned.\n *\n * @param {Element} anchorElement Element the movable element should be\n *     anchored against.\n * @param {goog.positioning.Corner} corner Corner of anchored element the\n *     movable element should be positioned at.\n * @param {number=} opt_overflow Overflow handling mode. Defaults to IGNORE if\n *     not specified. Bitmap, {@see goog.positioning.Overflow}.\n * @constructor\n * @extends {goog.positioning.AbstractPosition}\n */\ngoog.positioning.AnchoredPosition = function(\n    anchorElement, corner, opt_overflow) {\n  /**\n   * Element the movable element should be anchored against.\n   * @type {Element}\n   */\n  this.element = anchorElement;\n\n  /**\n   * Corner of anchored element the movable element should be positioned at.\n   * @type {goog.positioning.Corner}\n   */\n  this.corner = corner;\n\n  /**\n   * Overflow handling mode. Defaults to IGNORE if not specified.\n   * Bitmap, {@see goog.positioning.Overflow}.\n   * @type {number|undefined}\n   * @private\n   */\n  this.overflow_ = opt_overflow;\n};\ngoog.inherits(\n    goog.positioning.AnchoredPosition, goog.positioning.AbstractPosition);\n\n\n/**\n * Repositions the movable element.\n *\n * @param {Element} movableElement Element to position.\n * @param {goog.positioning.Corner} movableCorner Corner of the movable element\n *     that should be positioned adjacent to the anchored element.\n * @param {goog.math.Box=} opt_margin A margin specifin pixels.\n * @param {goog.math.Size=} opt_preferredSize PreferredSize of the\n *     movableElement (unused in this class).\n * @override\n */\ngoog.positioning.AnchoredPosition.prototype.reposition = function(\n    movableElement, movableCorner, opt_margin, opt_preferredSize) {\n  goog.positioning.positionAtAnchor(\n      this.element, this.corner, movableElement, movableCorner, undefined,\n      opt_margin, this.overflow_);\n};\n","^17",1579837703000,"^18",["^19",["^59","^Z","^5:"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/positioning/anchoredposition.js"],"^1J",["^19",["~$goog.positioning.AnchoredPosition"]],"^X",true,"^Y",["^Z","^59","^5:"]],["^ ","^[",[1579837703000],"^2F",true,"^10","goog.net.streams.utils.js","^11",["^12","goog/net/streams/utils.js"],"^13","goog/net/streams/utils.js","^14","^15","^16","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.module('goog.net.streams.utils');\n\n\n/**\n * Returns whether a character is whitespace in the context of parsing JSON\n * stream.\n *\n * TODO(user): 0xa0 for IE?\n *\n * @param {string} c The char to check\n * @return {boolean} true if a char is a whitespace\n */\nexports.isJsonWhitespace = function(c) {\n  return c == '\\r' || c == '\\n' || c == ' ' || c == '\\t';\n};\n","^17",1579837703000,"^18",["^19",["^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/streams/utils.js"],"^1J",["^19",["^3:"]],"^X",true,"^Y",["^Z"]],["^ ","^[",[1579837703000],"^10","goog.editor.plugins.abstracttabhandler.js","^11",["^12","goog/editor/plugins/abstracttabhandler.js"],"^13","goog/editor/plugins/abstracttabhandler.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Abstract Editor plugin class to handle tab keys.  Has one\n * abstract method which should be overriden to handle a tab key press.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.editor.plugins.AbstractTabHandler');\n\ngoog.require('goog.editor.Plugin');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Plugin to handle tab keys. Specific tab behavior defined by subclasses.\n *\n * @constructor\n * @extends {goog.editor.Plugin}\n */\ngoog.editor.plugins.AbstractTabHandler = function() {\n  goog.editor.Plugin.call(this);\n};\ngoog.inherits(goog.editor.plugins.AbstractTabHandler, goog.editor.Plugin);\n\n\n/** @override */\ngoog.editor.plugins.AbstractTabHandler.prototype.getTrogClassId =\n    goog.abstractMethod;\n\n\n/** @override */\ngoog.editor.plugins.AbstractTabHandler.prototype.handleKeyboardShortcut =\n    function(e, key, isModifierPressed) {\n  // If a dialog doesn't have selectable field, Moz grabs the event and\n  // performs actions in editor window. This solves that problem and allows\n  // the event to be passed on to proper handlers.\n  if (goog.userAgent.GECKO && this.getFieldObject().inModalMode()) {\n    return false;\n  }\n\n  // Don't handle Ctrl+Tab since the user is most likely trying to switch\n  // browser tabs. See bug 1305086.\n  // FF3 on Mac sends Ctrl-Tab to trogedit and we end up inserting a tab, but\n  // then it also switches the tabs. See bug 1511681. Note that we don't use\n  // isModifierPressed here since isModifierPressed is true only if metaKey\n  // is true on Mac.\n  if (e.keyCode == goog.events.KeyCodes.TAB && !e.metaKey && !e.ctrlKey) {\n    return this.handleTabKey(e);\n  }\n\n  return false;\n};\n\n\n/**\n * Handle a tab key press.\n * @param {goog.events.Event} e The key event.\n * @return {boolean} Whether this event was handled by this plugin.\n * @protected\n */\ngoog.editor.plugins.AbstractTabHandler.prototype.handleTabKey =\n    goog.abstractMethod;\n","^17",1579837703000,"^18",["^19",["^Z","^2X","^3Y","^34"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/abstracttabhandler.js"],"^1J",["^19",["~$goog.editor.plugins.AbstractTabHandler"]],"^X",true,"^Y",["^Z","^3Y","^34","^2X"]],["^ ","^[",[1579837703000],"^10","goog.graphics.path.js","^11",["^12","goog/graphics/path.js"],"^13","goog/graphics/path.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Represents a path used with a Graphics implementation.\n * @author arv@google.com (Erik Arvidsson)\n */\n\ngoog.provide('goog.graphics.Path');\ngoog.provide('goog.graphics.Path.Segment');\n\ngoog.require('goog.array');\ngoog.require('goog.graphics.AffineTransform');\ngoog.require('goog.math');\n\n\n\n/**\n * Creates a path object. A path is a sequence of segments and may be open or\n * closed. Path uses the EVEN-ODD fill rule for determining the interior of the\n * path. A path must start with a moveTo command.\n *\n * A \"simple\" path does not contain any arcs and may be transformed using\n * the `transform` method.\n *\n * @constructor\n */\ngoog.graphics.Path = function() {\n  /**\n   * The segment types that constitute this path.\n   * @type {!Array<number>}\n   * @private\n   */\n  this.segments_ = [];\n\n  /**\n   * The number of repeated segments of the current type.\n   * @type {!Array<number>}\n   * @private\n   */\n  this.count_ = [];\n\n  /**\n   * The arguments corresponding to each of the segments.\n   * @type {!Array<number>}\n   * @private\n   */\n  this.arguments_ = [];\n};\n\n\n/**\n * The coordinates of the point which closes the path (the point of the\n * last moveTo command).\n * @type {Array<number>?}\n * @private\n */\ngoog.graphics.Path.prototype.closePoint_ = null;\n\n\n/**\n * The coordinates most recently added to the end of the path.\n * @type {Array<number>?}\n * @private\n */\ngoog.graphics.Path.prototype.currentPoint_ = null;\n\n\n/**\n * Flag for whether this is a simple path (contains no arc segments).\n * @type {boolean}\n * @private\n */\ngoog.graphics.Path.prototype.simple_ = true;\n\n\n/**\n * Path segment types.\n * @enum {number}\n */\ngoog.graphics.Path.Segment = {\n  MOVETO: 0,\n  LINETO: 1,\n  CURVETO: 2,\n  ARCTO: 3,\n  CLOSE: 4\n};\n\n\n/**\n * The number of points for each segment type.\n * @type {!Array<number>}\n * @private\n */\ngoog.graphics.Path.segmentArgCounts_ = (function() {\n  var counts = [];\n  counts[goog.graphics.Path.Segment.MOVETO] = 2;\n  counts[goog.graphics.Path.Segment.LINETO] = 2;\n  counts[goog.graphics.Path.Segment.CURVETO] = 6;\n  counts[goog.graphics.Path.Segment.ARCTO] = 6;\n  counts[goog.graphics.Path.Segment.CLOSE] = 0;\n  return counts;\n})();\n\n\n/**\n * Returns the number of points for a segment type.\n *\n * @param {number} segment The segment type.\n * @return {number} The number of points.\n */\ngoog.graphics.Path.getSegmentCount = function(segment) {\n  return goog.graphics.Path.segmentArgCounts_[segment];\n};\n\n\n/**\n * Appends another path to the end of this path.\n *\n * @param {!goog.graphics.Path} path The path to append.\n * @return {!goog.graphics.Path} This path.\n */\ngoog.graphics.Path.prototype.appendPath = function(path) {\n  if (path.currentPoint_) {\n    Array.prototype.push.apply(this.segments_, path.segments_);\n    Array.prototype.push.apply(this.count_, path.count_);\n    Array.prototype.push.apply(this.arguments_, path.arguments_);\n    this.currentPoint_ = path.currentPoint_.concat();\n    this.closePoint_ = path.closePoint_.concat();\n    this.simple_ = this.simple_ && path.simple_;\n  }\n  return this;\n};\n\n\n/**\n * Clears the path.\n *\n * @return {!goog.graphics.Path} The path itself.\n */\ngoog.graphics.Path.prototype.clear = function() {\n  this.segments_.length = 0;\n  this.count_.length = 0;\n  this.arguments_.length = 0;\n  delete this.closePoint_;\n  delete this.currentPoint_;\n  delete this.simple_;\n  return this;\n};\n\n\n/**\n * Adds a point to the path by moving to the specified point. Repeated moveTo\n * commands are collapsed into a single moveTo.\n *\n * @param {number} x X coordinate of destination point.\n * @param {number} y Y coordinate of destination point.\n * @return {!goog.graphics.Path} The path itself.\n */\ngoog.graphics.Path.prototype.moveTo = function(x, y) {\n  if (goog.array.peek(this.segments_) == goog.graphics.Path.Segment.MOVETO) {\n    this.arguments_.length -= 2;\n  } else {\n    this.segments_.push(goog.graphics.Path.Segment.MOVETO);\n    this.count_.push(1);\n  }\n  this.arguments_.push(x, y);\n  this.currentPoint_ = this.closePoint_ = [x, y];\n  return this;\n};\n\n\n/**\n * Adds points to the path by drawing a straight line to each point.\n *\n * @param {...number} var_args The coordinates of each destination point as x, y\n *     value pairs.\n * @return {!goog.graphics.Path} The path itself.\n */\ngoog.graphics.Path.prototype.lineTo = function(var_args) {\n  var lastSegment = goog.array.peek(this.segments_);\n  if (lastSegment == null) {\n    throw new Error('Path cannot start with lineTo');\n  }\n  if (lastSegment != goog.graphics.Path.Segment.LINETO) {\n    this.segments_.push(goog.graphics.Path.Segment.LINETO);\n    this.count_.push(0);\n  }\n  for (var i = 0; i < arguments.length; i += 2) {\n    var x = arguments[i];\n    var y = arguments[i + 1];\n    this.arguments_.push(x, y);\n  }\n  this.count_[this.count_.length - 1] += i / 2;\n  this.currentPoint_ = [x, y];\n  return this;\n};\n\n\n/**\n * Adds points to the path by drawing cubic Bezier curves. Each curve is\n * specified using 3 points (6 coordinates) - two control points and the end\n * point of the curve.\n *\n * @param {...number} var_args The coordinates specifying each curve in sets of\n *     6 points: {@code [x1, y1]} the first control point, {@code [x2, y2]} the\n *     second control point and {@code [x, y]} the end point.\n * @return {!goog.graphics.Path} The path itself.\n */\ngoog.graphics.Path.prototype.curveTo = function(var_args) {\n  var lastSegment = goog.array.peek(this.segments_);\n  if (lastSegment == null) {\n    throw new Error('Path cannot start with curve');\n  }\n  if (lastSegment != goog.graphics.Path.Segment.CURVETO) {\n    this.segments_.push(goog.graphics.Path.Segment.CURVETO);\n    this.count_.push(0);\n  }\n  for (var i = 0; i < arguments.length; i += 6) {\n    var x = arguments[i + 4];\n    var y = arguments[i + 5];\n    this.arguments_.push(\n        arguments[i], arguments[i + 1], arguments[i + 2], arguments[i + 3], x,\n        y);\n  }\n  this.count_[this.count_.length - 1] += i / 6;\n  this.currentPoint_ = [x, y];\n  return this;\n};\n\n\n/**\n * Adds a path command to close the path by connecting the\n * last point to the first point.\n *\n * @return {!goog.graphics.Path} The path itself.\n */\ngoog.graphics.Path.prototype.close = function() {\n  var lastSegment = goog.array.peek(this.segments_);\n  if (lastSegment == null) {\n    throw new Error('Path cannot start with close');\n  }\n  if (lastSegment != goog.graphics.Path.Segment.CLOSE) {\n    this.segments_.push(goog.graphics.Path.Segment.CLOSE);\n    this.count_.push(1);\n    this.currentPoint_ = this.closePoint_;\n  }\n  return this;\n};\n\n\n/**\n * Adds a path command to draw an arc centered at the point {@code (cx, cy)}\n * with radius `rx` along the x-axis and `ry` along the y-axis from\n * `startAngle` through `extent` degrees. Positive rotation is in\n * the direction from positive x-axis to positive y-axis.\n *\n * @param {number} cx X coordinate of center of ellipse.\n * @param {number} cy Y coordinate of center of ellipse.\n * @param {number} rx Radius of ellipse on x axis.\n * @param {number} ry Radius of ellipse on y axis.\n * @param {number} fromAngle Starting angle measured in degrees from the\n *     positive x-axis.\n * @param {number} extent The span of the arc in degrees.\n * @param {boolean} connect If true, the starting point of the arc is connected\n *     to the current point.\n * @return {!goog.graphics.Path} The path itself.\n * @deprecated Use `arcTo` or `arcToAsCurves` instead.\n */\ngoog.graphics.Path.prototype.arc = function(\n    cx, cy, rx, ry, fromAngle, extent, connect) {\n  var startX = cx + goog.math.angleDx(fromAngle, rx);\n  var startY = cy + goog.math.angleDy(fromAngle, ry);\n  if (connect) {\n    if (!this.currentPoint_ || startX != this.currentPoint_[0] ||\n        startY != this.currentPoint_[1]) {\n      this.lineTo(startX, startY);\n    }\n  } else {\n    this.moveTo(startX, startY);\n  }\n  return this.arcTo(rx, ry, fromAngle, extent);\n};\n\n\n/**\n * Adds a path command to draw an arc starting at the path's current point,\n * with radius `rx` along the x-axis and `ry` along the y-axis from\n * `startAngle` through `extent` degrees. Positive rotation is in\n * the direction from positive x-axis to positive y-axis.\n *\n * This method makes the path non-simple.\n *\n * @param {number} rx Radius of ellipse on x axis.\n * @param {number} ry Radius of ellipse on y axis.\n * @param {number} fromAngle Starting angle measured in degrees from the\n *     positive x-axis.\n * @param {number} extent The span of the arc in degrees.\n * @return {!goog.graphics.Path} The path itself.\n */\ngoog.graphics.Path.prototype.arcTo = function(rx, ry, fromAngle, extent) {\n  var cx = this.currentPoint_[0] - goog.math.angleDx(fromAngle, rx);\n  var cy = this.currentPoint_[1] - goog.math.angleDy(fromAngle, ry);\n  var ex = cx + goog.math.angleDx(fromAngle + extent, rx);\n  var ey = cy + goog.math.angleDy(fromAngle + extent, ry);\n  this.segments_.push(goog.graphics.Path.Segment.ARCTO);\n  this.count_.push(1);\n  this.arguments_.push(rx, ry, fromAngle, extent, ex, ey);\n  this.simple_ = false;\n  this.currentPoint_ = [ex, ey];\n  return this;\n};\n\n\n/**\n * Same as `arcTo`, but approximates the arc using bezier curves.\n.* As a result, this method does not affect the simplified status of this path.\n * The algorithm is adapted from `java.awt.geom.ArcIterator`.\n *\n * @param {number} rx Radius of ellipse on x axis.\n * @param {number} ry Radius of ellipse on y axis.\n * @param {number} fromAngle Starting angle measured in degrees from the\n *     positive x-axis.\n * @param {number} extent The span of the arc in degrees.\n * @return {!goog.graphics.Path} The path itself.\n */\ngoog.graphics.Path.prototype.arcToAsCurves = function(\n    rx, ry, fromAngle, extent) {\n  var cx = this.currentPoint_[0] - goog.math.angleDx(fromAngle, rx);\n  var cy = this.currentPoint_[1] - goog.math.angleDy(fromAngle, ry);\n  var extentRad = goog.math.toRadians(extent);\n  var arcSegs = Math.ceil(Math.abs(extentRad) / Math.PI * 2);\n  var inc = extentRad / arcSegs;\n  var angle = goog.math.toRadians(fromAngle);\n  for (var j = 0; j < arcSegs; j++) {\n    var relX = Math.cos(angle);\n    var relY = Math.sin(angle);\n    var z = 4 / 3 * Math.sin(inc / 2) / (1 + Math.cos(inc / 2));\n    var c0 = cx + (relX - z * relY) * rx;\n    var c1 = cy + (relY + z * relX) * ry;\n    angle += inc;\n    relX = Math.cos(angle);\n    relY = Math.sin(angle);\n    this.curveTo(\n        c0, c1, cx + (relX + z * relY) * rx, cy + (relY - z * relX) * ry,\n        cx + relX * rx, cy + relY * ry);\n  }\n  return this;\n};\n\n\n/**\n * Iterates over the path calling the supplied callback once for each path\n * segment. The arguments to the callback function are the segment type and\n * an array of its arguments.\n *\n * The `LINETO` and `CURVETO` arrays can contain multiple\n * segments of the same type. The number of segments is the length of the\n * array divided by the segment length (2 for lines, 6 for  curves).\n *\n * As a convenience the `ARCTO` segment also includes the end point as the\n * last two arguments: {@code rx, ry, fromAngle, extent, x, y}.\n *\n * @param {function(number, Array)} callback The function to call with each\n *     path segment.\n */\ngoog.graphics.Path.prototype.forEachSegment = function(callback) {\n  var points = this.arguments_;\n  var index = 0;\n  for (var i = 0, length = this.segments_.length; i < length; i++) {\n    var seg = this.segments_[i];\n    var n = goog.graphics.Path.segmentArgCounts_[seg] * this.count_[i];\n    callback(seg, points.slice(index, index + n));\n    index += n;\n  }\n};\n\n\n/**\n * Returns the coordinates most recently added to the end of the path.\n *\n * @return {Array<number>?} An array containing the ending coordinates of the\n *     path of the form {@code [x, y]}.\n */\ngoog.graphics.Path.prototype.getCurrentPoint = function() {\n  return this.currentPoint_ && this.currentPoint_.concat();\n};\n\n\n/**\n * @return {!goog.graphics.Path} A copy of this path.\n */\ngoog.graphics.Path.prototype.clone = function() {\n  var path = new this.constructor();\n  path.segments_ = this.segments_.concat();\n  path.count_ = this.count_.concat();\n  path.arguments_ = this.arguments_.concat();\n  path.closePoint_ = this.closePoint_ && this.closePoint_.concat();\n  path.currentPoint_ = this.currentPoint_ && this.currentPoint_.concat();\n  path.simple_ = this.simple_;\n  return path;\n};\n\n\n/**\n * Returns true if this path contains no arcs. Simplified paths can be\n * created using `createSimplifiedPath`.\n *\n * @return {boolean} True if the path contains no arcs.\n */\ngoog.graphics.Path.prototype.isSimple = function() {\n  return this.simple_;\n};\n\n\n/**\n * A map from segment type to the path function to call to simplify a path.\n * @type {!Object}\n * @private\n * @suppress {deprecated} goog.graphics.Path is deprecated.\n */\ngoog.graphics.Path.simplifySegmentMap_ = (function() {\n  var map = {};\n  map[goog.graphics.Path.Segment.MOVETO] = goog.graphics.Path.prototype.moveTo;\n  map[goog.graphics.Path.Segment.LINETO] = goog.graphics.Path.prototype.lineTo;\n  map[goog.graphics.Path.Segment.CLOSE] = goog.graphics.Path.prototype.close;\n  map[goog.graphics.Path.Segment.CURVETO] =\n      goog.graphics.Path.prototype.curveTo;\n  map[goog.graphics.Path.Segment.ARCTO] =\n      goog.graphics.Path.prototype.arcToAsCurves;\n  return map;\n})();\n\n\n/**\n * Creates a copy of the given path, replacing `arcTo` with\n * `arcToAsCurves`. The resulting path is simplified and can\n * be transformed.\n *\n * @param {!goog.graphics.Path} src The path to simplify.\n * @return {!goog.graphics.Path} A new simplified path.\n * @suppress {deprecated} goog.graphics is deprecated.\n */\ngoog.graphics.Path.createSimplifiedPath = function(src) {\n  if (src.isSimple()) {\n    return src.clone();\n  }\n  var path = new goog.graphics.Path();\n  src.forEachSegment(function(segment, args) {\n    goog.graphics.Path.simplifySegmentMap_[segment].apply(path, args);\n  });\n  return path;\n};\n\n\n// TODO(chrisn): Delete this method\n/**\n * Creates a transformed copy of this path. The path is simplified\n * {@see #createSimplifiedPath} prior to transformation.\n *\n * @param {!goog.graphics.AffineTransform} tx The transformation to perform.\n * @return {!goog.graphics.Path} A new, transformed path.\n */\ngoog.graphics.Path.prototype.createTransformedPath = function(tx) {\n  var path = goog.graphics.Path.createSimplifiedPath(this);\n  path.transform(tx);\n  return path;\n};\n\n\n/**\n * Transforms the path. Only simple paths are transformable. Attempting\n * to transform a non-simple path will throw an error.\n *\n * @param {!goog.graphics.AffineTransform} tx The transformation to perform.\n * @return {!goog.graphics.Path} The path itself.\n */\ngoog.graphics.Path.prototype.transform = function(tx) {\n  if (!this.isSimple()) {\n    throw new Error('Non-simple path');\n  }\n  tx.transform(\n      this.arguments_, 0, this.arguments_, 0, this.arguments_.length / 2);\n  if (this.closePoint_) {\n    tx.transform(this.closePoint_, 0, this.closePoint_, 0, 1);\n  }\n  if (this.currentPoint_ && this.closePoint_ != this.currentPoint_) {\n    tx.transform(this.currentPoint_, 0, this.currentPoint_, 0, 1);\n  }\n  return this;\n};\n\n\n/**\n * @return {boolean} Whether the path is empty.\n */\ngoog.graphics.Path.prototype.isEmpty = function() {\n  return this.segments_.length == 0;\n};\n","^17",1579837703000,"^18",["^19",["^1Y","^Z","^3>","^35"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/path.js"],"^1J",["^19",["~$goog.graphics.Path.Segment","^25"]],"^X",true,"^Y",["^Z","^35","^1Y","^3>"]],["^ ","^[",[1579837703000],"^10","goog.ui.flatmenubuttonrenderer.js","^11",["^12","goog/ui/flatmenubuttonrenderer.js"],"^13","goog/ui/flatmenubuttonrenderer.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Similar functionality of {@link goog.ui.MenuButtonRenderer},\n * but inherits from {@link goog.ui.FlatButtonRenderer} instead of\n * {@link goog.ui.CustomButtonRenderer}. This creates a simpler menu button\n * that will look more like a traditional <select> menu.\n *\n */\n\ngoog.provide('goog.ui.FlatMenuButtonRenderer');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.style');\ngoog.require('goog.ui.FlatButtonRenderer');\ngoog.require('goog.ui.INLINE_BLOCK_CLASSNAME');\ngoog.require('goog.ui.Menu');\ngoog.require('goog.ui.MenuButton');\ngoog.require('goog.ui.MenuRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Flat Menu Button renderer. Creates a simpler version of\n * {@link goog.ui.MenuButton} that doesn't look like a button and\n * doesn't have rounded corners. Uses just a `<div>` and looks more like\n * a traditional `<select>` element.\n * @constructor\n * @extends {goog.ui.FlatButtonRenderer}\n */\ngoog.ui.FlatMenuButtonRenderer = function() {\n  goog.ui.FlatButtonRenderer.call(this);\n};\ngoog.inherits(goog.ui.FlatMenuButtonRenderer, goog.ui.FlatButtonRenderer);\ngoog.addSingletonGetter(goog.ui.FlatMenuButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.FlatMenuButtonRenderer.CSS_CLASS =\n    goog.getCssName('goog-flat-menu-button');\n\n\n/**\n * Returns the button's contents wrapped in the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-flat-menu-button\">\n *        <div class=\"goog-inline-block goog-flat-menu-button-caption\">\n *          Contents...\n *        </div>\n *        <div class=\"goog-inline-block goog-flat-menu-button-dropdown\">\n *          &nbsp;\n *        </div>\n *    </div>\n *\n * Overrides {@link goog.ui.FlatButtonRenderer#createDom}.\n * @param {goog.ui.Control} control Button to render.\n * @return {!Element} Root element for the button.\n * @override\n */\ngoog.ui.FlatMenuButtonRenderer.prototype.createDom = function(control) {\n  var button = /** @type {goog.ui.Button} */ (control);\n  var classNames = this.getClassNames(button);\n  var element = button.getDomHelper().createDom(\n      goog.dom.TagName.DIV,\n      goog.ui.INLINE_BLOCK_CLASSNAME + ' ' + classNames.join(' '), [\n        this.createCaption(button.getContent(), button.getDomHelper()),\n        this.createDropdown(button.getDomHelper())\n      ]);\n  this.setTooltip(element, /** @type {string}*/ (button.getTooltip()));\n  return element;\n};\n\n\n/**\n * Takes the button's root element and returns the parent element of the\n * button's contents.\n * @param {Element} element Root element of the button whose content\n * element is to be returned.\n * @return {Element} The button's content element (if any).\n * @override\n */\ngoog.ui.FlatMenuButtonRenderer.prototype.getContentElement = function(element) {\n  return element && /** @type {Element} */ (element.firstChild);\n};\n\n\n/**\n * Takes an element, decorates it with the menu button control, and returns\n * the element.  Overrides {@link goog.ui.CustomButtonRenderer#decorate} by\n * looking for a child element that can be decorated by a menu, and if it\n * finds one, decorates it and attaches it to the menu button.\n * @param {goog.ui.Control} button Menu button to decorate the element.\n * @param {Element} element Element to decorate.\n * @return {Element} Decorated element.\n * @override\n */\ngoog.ui.FlatMenuButtonRenderer.prototype.decorate = function(button, element) {\n  // TODO(user): MenuButtonRenderer uses the exact same code.\n  // Refactor this block to its own module where both can use it.\n  var menuElem = goog.dom.getElementsByTagNameAndClass(\n      '*', goog.ui.MenuRenderer.CSS_CLASS, element)[0];\n  if (menuElem) {\n    // Move the menu element directly under the body, but hide it first; see\n    // bug 1089244.\n    goog.style.setElementShown(menuElem, false);\n    button.getDomHelper().getDocument().body.appendChild(menuElem);\n\n    // Decorate the menu and attach it to the button.\n    var menu = new goog.ui.Menu();\n    menu.decorate(menuElem);\n    button.setMenu(menu);\n  }\n\n  // Add the caption if it's not already there.\n  var captionElem = goog.dom.getElementsByTagNameAndClass(\n      '*', goog.getCssName(this.getCssClass(), 'caption'), element)[0];\n  if (!captionElem) {\n    element.appendChild(\n        this.createCaption(element.childNodes, button.getDomHelper()));\n  }\n\n  // Add the dropdown icon if it's not already there.\n  var dropdownElem = goog.dom.getElementsByTagNameAndClass(\n      '*', goog.getCssName(this.getCssClass(), 'dropdown'), element)[0];\n  if (!dropdownElem) {\n    element.appendChild(this.createDropdown(button.getDomHelper()));\n  }\n\n  // Let the superclass do the rest.\n  return goog.ui.FlatMenuButtonRenderer.superClass_.decorate.call(\n      this, button, element);\n};\n\n\n/**\n * Takes a text caption or existing DOM structure, and returns it wrapped in\n * an appropriately-styled DIV.  Creates the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-flat-menu-button-caption\">\n *      Contents...\n *    </div>\n *\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to wrap\n *     in a box.\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {Element} Caption element.\n */\ngoog.ui.FlatMenuButtonRenderer.prototype.createCaption = function(\n    content, dom) {\n  return dom.createDom(\n      goog.dom.TagName.DIV, goog.ui.INLINE_BLOCK_CLASSNAME + ' ' +\n          goog.getCssName(this.getCssClass(), 'caption'),\n      content);\n};\n\n\n/**\n * Returns an appropriately-styled DIV containing a dropdown arrow element.\n * Creates the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-flat-menu-button-dropdown\">\n *      &nbsp;\n *    </div>\n *\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {!Element} Dropdown element.\n */\ngoog.ui.FlatMenuButtonRenderer.prototype.createDropdown = function(dom) {\n  // 00A0 is &nbsp;\n  return dom.createDom(\n      goog.dom.TagName.DIV, {\n        'class': goog.ui.INLINE_BLOCK_CLASSNAME + ' ' +\n            goog.getCssName(this.getCssClass(), 'dropdown'),\n        'aria-hidden': true\n      },\n      '\\u00A0');\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.FlatMenuButtonRenderer.prototype.getCssClass = function() {\n  return goog.ui.FlatMenuButtonRenderer.CSS_CLASS;\n};\n\n\n// Register a decorator factory function for Flat Menu Buttons.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.FlatMenuButtonRenderer.CSS_CLASS, function() {\n      // Uses goog.ui.MenuButton, but with FlatMenuButtonRenderer.\n      return new goog.ui.MenuButton(\n          null, null, goog.ui.FlatMenuButtonRenderer.getInstance());\n    });\n","^17",1579837703000,"^18",["^19",["^1T","~$goog.ui.FlatButtonRenderer","^3@","^Z","^3A","^5?","^3B","^29","^5Y","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/flatmenubuttonrenderer.js"],"^1J",["^19",["~$goog.ui.FlatMenuButtonRenderer"]],"^X",true,"^Y",["^Z","^1T","^1V","^29","^;D","^5Y","^3B","^3@","^5?","^3A"]],["^ ","^[",[1579837703000],"^10","goog.graphics.lineargradient.js","^11",["^12","goog/graphics/lineargradient.js"],"^13","goog/graphics/lineargradient.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Represents a gradient to be used with a Graphics implementor.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.graphics.LinearGradient');\n\n\ngoog.require('goog.asserts');\ngoog.require('goog.graphics.Fill');\n\n\n\n/**\n * Creates an immutable linear gradient fill object.\n *\n * @param {number} x1 Start X position of the gradient.\n * @param {number} y1 Start Y position of the gradient.\n * @param {number} x2 End X position of the gradient.\n * @param {number} y2 End Y position of the gradient.\n * @param {string} color1 Start color of the gradient.\n * @param {string} color2 End color of the gradient.\n * @param {?number=} opt_opacity1 Start opacity of the gradient, both or neither\n *     of opt_opacity1 and opt_opacity2 have to be set.\n * @param {?number=} opt_opacity2 End opacity of the gradient.\n * @constructor\n * @extends {goog.graphics.Fill}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n * @final\n */\ngoog.graphics.LinearGradient = function(\n    x1, y1, x2, y2, color1, color2, opt_opacity1, opt_opacity2) {\n  /**\n   * Start X position of the gradient.\n   * @type {number}\n   * @private\n   */\n  this.x1_ = x1;\n\n  /**\n   * Start Y position of the gradient.\n   * @type {number}\n   * @private\n   */\n  this.y1_ = y1;\n\n  /**\n   * End X position of the gradient.\n   * @type {number}\n   * @private\n   */\n  this.x2_ = x2;\n\n  /**\n   * End Y position of the gradient.\n   * @type {number}\n   * @private\n   */\n  this.y2_ = y2;\n\n  /**\n   * Start color of the gradient.\n   * @type {string}\n   * @private\n   */\n  this.color1_ = color1;\n\n  /**\n   * End color of the gradient.\n   * @type {string}\n   * @private\n   */\n  this.color2_ = color2;\n\n  goog.asserts.assert(\n      (typeof opt_opacity1 === 'number') == (typeof opt_opacity2 === 'number'),\n      'Both or neither of opt_opacity1 and opt_opacity2 have to be set.');\n\n  /**\n   * Start opacity of the gradient.\n   * @type {?number}\n   * @private\n   */\n  this.opacity1_ = (opt_opacity1 !== undefined) ? opt_opacity1 : null;\n\n  /**\n   * End opacity of the gradient.\n   * @type {?number}\n   * @private\n   */\n  this.opacity2_ = (opt_opacity2 !== undefined) ? opt_opacity2 : null;\n};\ngoog.inherits(goog.graphics.LinearGradient, goog.graphics.Fill);\n\n\n/**\n * @return {number} The start X position of the gradient.\n */\ngoog.graphics.LinearGradient.prototype.getX1 = function() {\n  return this.x1_;\n};\n\n\n/**\n * @return {number} The start Y position of the gradient.\n */\ngoog.graphics.LinearGradient.prototype.getY1 = function() {\n  return this.y1_;\n};\n\n\n/**\n * @return {number} The end X position of the gradient.\n */\ngoog.graphics.LinearGradient.prototype.getX2 = function() {\n  return this.x2_;\n};\n\n\n/**\n * @return {number} The end Y position of the gradient.\n */\ngoog.graphics.LinearGradient.prototype.getY2 = function() {\n  return this.y2_;\n};\n\n\n/**\n * @override\n */\ngoog.graphics.LinearGradient.prototype.getColor1 = function() {\n  return this.color1_;\n};\n\n\n/**\n * @override\n */\ngoog.graphics.LinearGradient.prototype.getColor2 = function() {\n  return this.color2_;\n};\n\n\n/**\n * @return {?number} The start opacity of the gradient.\n */\ngoog.graphics.LinearGradient.prototype.getOpacity1 = function() {\n  return this.opacity1_;\n};\n\n\n/**\n * @return {?number} The end opacity of the gradient.\n */\ngoog.graphics.LinearGradient.prototype.getOpacity2 = function() {\n  return this.opacity2_;\n};\n","^17",1579837703000,"^18",["^19",["^1S","^20","^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/lineargradient.js"],"^1J",["^19",["~$goog.graphics.LinearGradient"]],"^X",true,"^Y",["^Z","^1S","^20"]],["^ ","^[",[1579837703000],"^10","goog.editor.node.js","^11",["^12","goog/editor/node.js"],"^13","goog/editor/node.js","^14","^15","^16","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilties for working with DOM nodes related to rich text\n * editing.  Many of these are not general enough to go into goog.dom.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.provide('goog.editor.node');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.iter.ChildIterator');\ngoog.require('goog.dom.iter.SiblingIterator');\ngoog.require('goog.iter');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.string.Unicode');\ngoog.require('goog.userAgent');\n\n\n/**\n * Names of all block-level tags\n * @type {Object}\n * @private\n */\ngoog.editor.node.BLOCK_TAG_NAMES_ = goog.object.createSet(\n    goog.dom.TagName.ADDRESS, goog.dom.TagName.ARTICLE, goog.dom.TagName.ASIDE,\n    goog.dom.TagName.BLOCKQUOTE, goog.dom.TagName.BODY,\n    goog.dom.TagName.CAPTION, goog.dom.TagName.CENTER, goog.dom.TagName.COL,\n    goog.dom.TagName.COLGROUP, goog.dom.TagName.DETAILS, goog.dom.TagName.DIR,\n    goog.dom.TagName.DIV, goog.dom.TagName.DL, goog.dom.TagName.DD,\n    goog.dom.TagName.DT, goog.dom.TagName.FIELDSET, goog.dom.TagName.FIGCAPTION,\n    goog.dom.TagName.FIGURE, goog.dom.TagName.FOOTER, goog.dom.TagName.FORM,\n    goog.dom.TagName.H1, goog.dom.TagName.H2, goog.dom.TagName.H3,\n    goog.dom.TagName.H4, goog.dom.TagName.H5, goog.dom.TagName.H6,\n    goog.dom.TagName.HEADER, goog.dom.TagName.HGROUP, goog.dom.TagName.HR,\n    goog.dom.TagName.ISINDEX, goog.dom.TagName.OL, goog.dom.TagName.LI,\n    goog.dom.TagName.MAIN, goog.dom.TagName.MAP, goog.dom.TagName.MENU,\n    goog.dom.TagName.NAV, goog.dom.TagName.OPTGROUP, goog.dom.TagName.OPTION,\n    goog.dom.TagName.P, goog.dom.TagName.PRE, goog.dom.TagName.SECTION,\n    goog.dom.TagName.SUMMARY, goog.dom.TagName.TABLE, goog.dom.TagName.TBODY,\n    goog.dom.TagName.TD, goog.dom.TagName.TFOOT, goog.dom.TagName.TH,\n    goog.dom.TagName.THEAD, goog.dom.TagName.TR, goog.dom.TagName.UL);\n\n\n/**\n * Names of tags that have intrinsic content.\n * TODO(robbyw): What about object, br, input, textarea, button, isindex,\n * hr, keygen, select, table, tr, td?\n * @type {Object}\n * @private\n */\ngoog.editor.node.NON_EMPTY_TAGS_ = goog.object.createSet(\n    goog.dom.TagName.IMG, goog.dom.TagName.IFRAME, goog.dom.TagName.EMBED);\n\n\n/**\n * Check if the node is in a standards mode document.\n * @param {Node} node The node to test.\n * @return {boolean} Whether the node is in a standards mode document.\n */\ngoog.editor.node.isStandardsMode = function(node) {\n  return goog.dom.getDomHelper(node).isCss1CompatMode();\n};\n\n\n/**\n * Get the right-most non-ignorable leaf node of the given node.\n * @param {Node} parent The parent ndoe.\n * @return {Node} The right-most non-ignorable leaf node.\n */\ngoog.editor.node.getRightMostLeaf = function(parent) {\n  var temp;\n  while (temp = goog.editor.node.getLastChild(parent)) {\n    parent = temp;\n  }\n  return parent;\n};\n\n\n/**\n * Get the left-most non-ignorable leaf node of the given node.\n * @param {Node} parent The parent ndoe.\n * @return {Node} The left-most non-ignorable leaf node.\n */\ngoog.editor.node.getLeftMostLeaf = function(parent) {\n  var temp;\n  while (temp = goog.editor.node.getFirstChild(parent)) {\n    parent = temp;\n  }\n  return parent;\n};\n\n\n/**\n * Version of firstChild that skips nodes that are entirely\n * whitespace and comments.\n * @param {Node} parent The reference node.\n * @return {Node} The first child of sibling that is important according to\n *     goog.editor.node.isImportant, or null if no such node exists.\n */\ngoog.editor.node.getFirstChild = function(parent) {\n  return goog.editor.node.getChildHelper_(parent, false);\n};\n\n\n/**\n * Version of lastChild that skips nodes that are entirely whitespace or\n * comments.  (Normally lastChild is a property of all DOM nodes that gives the\n * last of the nodes contained directly in the reference node.)\n * @param {Node} parent The reference node.\n * @return {Node} The last child of sibling that is important according to\n *     goog.editor.node.isImportant, or null if no such node exists.\n */\ngoog.editor.node.getLastChild = function(parent) {\n  return goog.editor.node.getChildHelper_(parent, true);\n};\n\n\n/**\n * Version of previoussibling that skips nodes that are entirely\n * whitespace or comments.  (Normally previousSibling is a property\n * of all DOM nodes that gives the sibling node, the node that is\n * a child of the same parent, that occurs immediately before the\n * reference node.)\n * @param {Node} sibling The reference node.\n * @return {Node} The closest previous sibling to sibling that is\n *     important according to goog.editor.node.isImportant, or null if no such\n *     node exists.\n */\ngoog.editor.node.getPreviousSibling = function(sibling) {\n  return /** @type {Node} */ (\n      goog.editor.node.getFirstValue_(\n          goog.iter.filter(\n              new goog.dom.iter.SiblingIterator(sibling, false, true),\n              goog.editor.node.isImportant)));\n};\n\n\n/**\n * Version of nextSibling that skips nodes that are entirely whitespace or\n * comments.\n * @param {Node} sibling The reference node.\n * @return {Node} The closest next sibling to sibling that is important\n *     according to goog.editor.node.isImportant, or null if no\n *     such node exists.\n */\ngoog.editor.node.getNextSibling = function(sibling) {\n  return /** @type {Node} */ (\n      goog.editor.node.getFirstValue_(\n          goog.iter.filter(\n              new goog.dom.iter.SiblingIterator(sibling),\n              goog.editor.node.isImportant)));\n};\n\n\n/**\n * Internal helper for lastChild/firstChild that skips nodes that are entirely\n * whitespace or comments.\n * @param {Node} parent The reference node.\n * @param {boolean} isReversed Whether children should be traversed forward\n *     or backward.\n * @return {Node} The first/last child of sibling that is important according\n *     to goog.editor.node.isImportant, or null if no such node exists.\n * @private\n */\ngoog.editor.node.getChildHelper_ = function(parent, isReversed) {\n  return (!parent || parent.nodeType != goog.dom.NodeType.ELEMENT) ?\n      null :\n      /** @type {Node} */ (\n          goog.editor.node.getFirstValue_(\n              goog.iter.filter(\n                  new goog.dom.iter.ChildIterator(\n                      /** @type {!Element} */ (parent), isReversed),\n                  goog.editor.node.isImportant)));\n};\n\n\n/**\n * Utility function that returns the first value from an iterator or null if\n * the iterator is empty.\n * @param {goog.iter.Iterator} iterator The iterator to get a value from.\n * @return {*} The first value from the iterator.\n * @private\n */\ngoog.editor.node.getFirstValue_ = function(iterator) {\n\n  try {\n    return iterator.next();\n  } catch (e) {\n    return null;\n  }\n};\n\n\n/**\n * Determine if a node should be returned by the iterator functions.\n * @param {Node} node An object implementing the DOM1 Node interface.\n * @return {boolean} Whether the node is an element, or a text node that\n *     is not all whitespace.\n */\ngoog.editor.node.isImportant = function(node) {\n  // Return true if the node is not either a TextNode or an ElementNode.\n  return node.nodeType == goog.dom.NodeType.ELEMENT ||\n      node.nodeType == goog.dom.NodeType.TEXT &&\n      !goog.editor.node.isAllNonNbspWhiteSpace(node);\n};\n\n\n/**\n * Determine whether a node's text content is entirely whitespace.\n * @param {Node} textNode A node implementing the CharacterData interface (i.e.,\n *     a Text, Comment, or CDATASection node.\n * @return {boolean} Whether the text content of node is whitespace,\n *     otherwise false.\n */\ngoog.editor.node.isAllNonNbspWhiteSpace = function(textNode) {\n  return goog.string.isBreakingWhitespace(textNode.nodeValue);\n};\n\n\n/**\n * Returns true if the node contains only whitespace and is not and does not\n * contain any images, iframes or embed tags.\n * @param {Node} node The node to check.\n * @param {boolean=} opt_prohibitSingleNbsp By default, this function treats a\n *     single nbsp as empty.  Set this to true to treat this case as non-empty.\n * @return {boolean} Whether the node contains only whitespace.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.editor.node.isEmpty = function(node, opt_prohibitSingleNbsp) {\n  var nodeData = goog.dom.getRawTextContent(node);\n\n  if (node.getElementsByTagName) {\n    node = /** @type {!Element} */ (node);\n    for (var tag in goog.editor.node.NON_EMPTY_TAGS_) {\n      if (node.tagName == tag || node.getElementsByTagName(tag).length > 0) {\n        return false;\n      }\n    }\n  }\n  return (!opt_prohibitSingleNbsp && nodeData == goog.string.Unicode.NBSP) ||\n      goog.string.isBreakingWhitespace(nodeData);\n};\n\n\n/**\n * Returns the length of the text in node if it is a text node, or the number\n * of children of the node, if it is an element. Useful for range-manipulation\n * code where you need to know the offset for the right side of the node.\n * @param {Node} node The node to get the length of.\n * @return {number} The length of the node.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.editor.node.getLength = function(node) {\n  return node.length || node.childNodes.length;\n};\n\n\n/**\n * Search child nodes using a predicate function and return the first node that\n * satisfies the condition.\n * @param {Node} parent The parent node to search.\n * @param {function(Node):boolean} hasProperty A function that takes a child\n *    node as a parameter and returns true if it meets the criteria.\n * @return {?number} The index of the node found, or null if no node is found.\n */\ngoog.editor.node.findInChildren = function(parent, hasProperty) {\n  for (var i = 0, len = parent.childNodes.length; i < len; i++) {\n    if (hasProperty(parent.childNodes[i])) {\n      return i;\n    }\n  }\n  return null;\n};\n\n\n/**\n * Search ancestor nodes using a predicate function and returns the topmost\n * ancestor in the chain of consecutive ancestors that satisfies the condition.\n *\n * @param {Node} node The node whose ancestors have to be searched.\n * @param {function(Node): boolean} hasProperty A function that takes a parent\n *     node as a parameter and returns true if it meets the criteria.\n * @return {Node} The topmost ancestor or null if no ancestor satisfies the\n *     predicate function.\n */\ngoog.editor.node.findHighestMatchingAncestor = function(node, hasProperty) {\n  var parent = node.parentNode;\n  var ancestor = null;\n  while (parent && hasProperty(parent)) {\n    ancestor = parent;\n    parent = parent.parentNode;\n  }\n  return ancestor;\n};\n\n\n/**\n* Checks if node is a block-level html element. The <tt>display</tt> css\n * property is ignored.\n * @param {Node} node The node to test.\n * @return {boolean} Whether the node is a block-level node.\n */\ngoog.editor.node.isBlockTag = function(node) {\n  return !!goog.editor.node.BLOCK_TAG_NAMES_[\n      /** @type {!Element} */ (node).tagName];\n};\n\n\n/**\n * Skips siblings of a node that are empty text nodes.\n * @param {Node} node A node. May be null.\n * @return {Node} The node or the first sibling of the node that is not an\n *     empty text node. May be null.\n */\ngoog.editor.node.skipEmptyTextNodes = function(node) {\n  while (node && node.nodeType == goog.dom.NodeType.TEXT && !node.nodeValue) {\n    node = node.nextSibling;\n  }\n  return node;\n};\n\n\n/**\n * Checks if an element is a top-level editable container (meaning that\n * it itself is not editable, but all its child nodes are editable).\n * @param {Node} element The element to test.\n * @return {boolean} Whether the element is a top-level editable container.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.editor.node.isEditableContainer = function(element) {\n  return element.getAttribute && element.getAttribute('g_editable') == 'true';\n};\n\n\n/**\n * Checks if a node is inside an editable container.\n * @param {Node} node The node to test.\n * @return {boolean} Whether the node is in an editable container.\n */\ngoog.editor.node.isEditable = function(node) {\n  return !!goog.dom.getAncestor(node, goog.editor.node.isEditableContainer);\n};\n\n\n/**\n * Finds the top-most DOM node inside an editable field that is an ancestor\n * (or self) of a given DOM node and meets the specified criteria.\n * @param {Node} node The DOM node where the search starts.\n * @param {function(Node) : boolean} criteria A function that takes a DOM node\n *     as a parameter and returns a boolean to indicate whether the node meets\n *     the criteria or not.\n * @return {Node} The DOM node if found, or null.\n */\ngoog.editor.node.findTopMostEditableAncestor = function(node, criteria) {\n  var targetNode = null;\n  while (node && !goog.editor.node.isEditableContainer(node)) {\n    if (criteria(node)) {\n      targetNode = node;\n    }\n    node = node.parentNode;\n  }\n  return targetNode;\n};\n\n\n/**\n * Splits off a subtree.\n * @param {!Node} currentNode The starting splitting point.\n * @param {Node=} opt_secondHalf The initial leftmost leaf the new subtree.\n *     If null, siblings after currentNode will be placed in the subtree, but\n *     no additional node will be.\n * @param {Node=} opt_root The top of the tree where splitting stops at.\n * @return {!Node} The new subtree.\n */\ngoog.editor.node.splitDomTreeAt = function(\n    currentNode, opt_secondHalf, opt_root) {\n  var parent;\n  while (currentNode != opt_root && (parent = currentNode.parentNode)) {\n    opt_secondHalf = goog.editor.node.getSecondHalfOfNode_(\n        parent, currentNode, opt_secondHalf);\n    currentNode = parent;\n  }\n  return /** @type {!Node} */ (opt_secondHalf);\n};\n\n\n/**\n * Creates a clone of node, moving all children after startNode to it.\n * When firstChild is not null or undefined, it is also appended to the clone\n * as the first child.\n * @param {!Node} node The node to clone.\n * @param {!Node} startNode All siblings after this node will be moved to the\n *     clone.\n * @param {Node|undefined} firstChild The first child of the new cloned element.\n * @return {!Node} The cloned node that now contains the children after\n *     startNode.\n * @private\n */\ngoog.editor.node.getSecondHalfOfNode_ = function(node, startNode, firstChild) {\n  var secondHalf = /** @type {!Node} */ (node.cloneNode(false));\n  while (startNode.nextSibling) {\n    goog.dom.appendChild(secondHalf, startNode.nextSibling);\n  }\n  if (firstChild) {\n    secondHalf.insertBefore(firstChild, secondHalf.firstChild);\n  }\n  return secondHalf;\n};\n\n\n/**\n * Appends all of oldNode's children to newNode. This removes all children from\n * oldNode and appends them to newNode. oldNode is left with no children.\n * @param {!Node} newNode Node to transfer children to.\n * @param {Node} oldNode Node to transfer children from.\n * @deprecated Use goog.dom.append directly instead.\n */\ngoog.editor.node.transferChildren = function(newNode, oldNode) {\n  goog.dom.append(newNode, oldNode.childNodes);\n};\n\n\n/**\n * Replaces the innerHTML of a node.\n *\n * IE has serious problems if you try to set innerHTML of an editable node with\n * any selection. Early versions of IE tear up the old internal tree storage, to\n * help avoid ref-counting loops. But this sometimes leaves the selection object\n * in a bad state and leads to segfaults.\n *\n * Removing the nodes first prevents IE from tearing them up. This is not\n * strictly necessary in nodes that do not have the selection. You should always\n * use this function when setting innerHTML inside of a field.\n * @param {Node} node A node.\n * @param {string} html The innerHTML to set on the node.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.editor.node.replaceInnerHtml = function(node, html) {\n  // Only do this IE. On gecko, we use element change events, and don't\n  // want to trigger spurious events.\n  if (goog.userAgent.IE) {\n    goog.dom.removeChildren(node);\n  }\n  node.innerHTML = html;\n};\n","^17",1579837703000,"^18",["^19",["~$goog.iter","^1T","^3G","^2D","^Z","^2G","^2X","~$goog.dom.iter.ChildIterator","^32","^1V","~$goog.dom.iter.SiblingIterator"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/node.js"],"^1J",["^19",["^31"]],"^X",true,"^Y",["^Z","^1T","^3G","^1V","^;H","^;I","^;G","^2G","^2D","^32","^2X"]],["^ ","^[",[1579837703000],"^10","goog.events.wheelhandler.js","^11",["^12","goog/events/wheelhandler.js"],"^13","goog/events/wheelhandler.js","^14","^15","^16","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This event wrapper will dispatch an event when the user uses\n * the wheel on an element. The event provides details of the unit type (pixel /\n * line / page) and deltas in those units in up to 3 dimensions. Additionally,\n * simplified pixel deltas are provided for code that doesn't need to handle the\n * different units differently. This is not to be confused with the scroll\n * event, where an element in the dom can report that it was scrolled.\n *\n * This class aims to smooth out inconsistencies between browser platforms with\n * regards to wheel events, but we do not cover every possible software/hardware\n * combination out there, some of which occasionally produce very large deltas\n * in wheel events, especially when the device supports acceleration.\n *\n * Relevant standard:\n * http://www.w3.org/TR/2014/WD-DOM-Level-3-Events-20140925/#interface-WheelEvent\n *\n * Clients of this code should be aware that some input devices only fire a few\n * discrete events (such as a mouse wheel without acceleration) whereas some can\n * generate a large number of events for a single interaction (such as a\n * touchpad with acceleration). There is no signal in the events to reliably\n * distinguish between these.\n *\n * @author arv@google.com (Erik Arvidsson)\n * @see ../demos/wheelhandler.html\n */\n\ngoog.provide('goog.events.WheelHandler');\n\ngoog.require('goog.dom');\ngoog.require('goog.events');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.WheelEvent');\ngoog.require('goog.style');\ngoog.require('goog.userAgent');\ngoog.require('goog.userAgent.product');\ngoog.require('goog.userAgent.product.isVersion');\n\n\n\n/**\n * This event handler allows you to catch wheel events in a consistent manner.\n * @param {!Element|!Document} element The element to listen to the wheel event\n *     on.\n * @param {boolean=} opt_capture Whether to handle the wheel event in capture\n *     phase.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.events.WheelHandler = function(element, opt_capture) {\n  goog.events.WheelHandler.base(this, 'constructor');\n\n  /**\n   * This is the element that we will listen to the real wheel events on.\n   * @private {!Element|!Document}\n   */\n  this.element_ = element;\n\n  var rtlElement = goog.dom.isElement(this.element_) ?\n      /** @type {!Element} */ (this.element_) :\n                              /** @type {!Document} */ (this.element_).body;\n\n  /**\n   * True if the element exists and is RTL, false otherwise.\n   * @private {boolean}\n   */\n  this.isRtl_ = !!rtlElement && goog.style.isRightToLeft(rtlElement);\n\n  /**\n   * The key returned from the goog.events.listen.\n   * @private {goog.events.Key}\n   */\n  this.listenKey_ = goog.events.listen(\n      this.element_, goog.events.WheelHandler.getDomEventType(), this,\n      opt_capture);\n};\ngoog.inherits(goog.events.WheelHandler, goog.events.EventTarget);\n\n\n/**\n * Returns the dom event type.\n * @return {string} The dom event type.\n */\ngoog.events.WheelHandler.getDomEventType = function() {\n  // Prefer to use wheel events whenever supported.\n  if (goog.userAgent.GECKO && goog.userAgent.isVersionOrHigher(17) ||\n      goog.userAgent.IE && goog.userAgent.isVersionOrHigher(9) ||\n      goog.userAgent.product.CHROME && goog.userAgent.product.isVersion(31)) {\n    return 'wheel';\n  }\n\n  // Legacy events. Still the best we have on Opera and Safari.\n  return goog.userAgent.GECKO ? 'DOMMouseScroll' : 'mousewheel';\n};\n\n\n/**\n * Handles the events on the element.\n * @param {!goog.events.BrowserEvent} e The underlying browser event.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.events.WheelHandler.prototype.handleEvent = function(e) {\n  var deltaMode = goog.events.WheelEvent.DeltaMode.PIXEL;\n  var deltaX = 0;\n  var deltaY = 0;\n  var deltaZ = 0;\n  var be = e.getBrowserEvent();\n  if (be.type == 'wheel') {\n    deltaMode = be.deltaMode;\n    deltaX = be.deltaX;\n    deltaY = be.deltaY;\n    deltaZ = be.deltaZ;\n  } else if (be.type == 'mousewheel') {\n    // Assume that these are still comparable to pixels. This may not be true\n    // for all old browsers.\n    if (be.wheelDeltaX !== undefined) {\n      deltaX = -be.wheelDeltaX;\n      deltaY = -be.wheelDeltaY;\n    } else {\n      deltaY = -be.wheelDelta;\n    }\n  } else {  // Historical Gecko\n    // Gecko returns multiple of 3 (representing the number of lines)\n    deltaMode = goog.events.WheelEvent.DeltaMode.LINE;\n    // Firefox 3.1 adds an axis field to the event to indicate axis.\n    if (be.axis !== undefined && be.axis === be.HORIZONTAL_AXIS) {\n      deltaX = be.detail;\n    } else {\n      deltaY = be.detail;\n    }\n  }\n  // For horizontal deltas we need to flip the value for RTL grids.\n  if (this.isRtl_) {\n    deltaX = -deltaX;\n  }\n  var newEvent =\n      new goog.events.WheelEvent(be, deltaMode, deltaX, deltaY, deltaZ);\n  this.dispatchEvent(newEvent);\n};\n\n\n/** @override */\ngoog.events.WheelHandler.prototype.disposeInternal = function() {\n  goog.events.WheelHandler.superClass_.disposeInternal.call(this);\n  goog.events.unlistenByKey(this.listenKey_);\n  this.listenKey_ = null;\n};\n","^17",1579837703000,"^18",["^19",["~$goog.events.WheelEvent","^1T","^2N","^Z","^2W","^2X","^29","^3M","^36"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/wheelhandler.js"],"^1J",["^19",["~$goog.events.WheelHandler"]],"^X",true,"^Y",["^Z","^1T","^36","^2W","^;J","^29","^2X","^2N","^3M"]],["^ ","^[",[1579837703000],"^10","goog.dom.pattern.abstractpattern.js","^11",["^12","goog/dom/pattern/abstractpattern.js"],"^13","goog/dom/pattern/abstractpattern.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview DOM pattern base class.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.pattern.AbstractPattern');\n\ngoog.require('goog.dom.TagWalkType');\ngoog.require('goog.dom.pattern.MatchType');\n\n\n\n/**\n * Base pattern class for DOM matching.\n *\n * @constructor\n */\ngoog.dom.pattern.AbstractPattern = function() {\n  /**\n   * The first node matched by this pattern.\n   * @type {?Node}\n   */\n  this.matchedNode = null;\n};\n\n\n/**\n * Reset any internal state this pattern keeps.\n */\ngoog.dom.pattern.AbstractPattern.prototype.reset = function() {\n  // The base implementation does nothing.\n};\n\n\n/**\n * Test whether this pattern matches the given token.\n *\n * @param {Node} token Token to match against.\n * @param {goog.dom.TagWalkType} type The type of token.\n * @return {goog.dom.pattern.MatchType} `MATCH` if the pattern matches.\n */\ngoog.dom.pattern.AbstractPattern.prototype.matchToken = function(token, type) {\n  return goog.dom.pattern.MatchType.NO_MATCH;\n};\n","^17",1579837703000,"^18",["^19",["~$goog.dom.TagWalkType","^Z","^4N"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/abstractpattern.js"],"^1J",["^19",["^4M"]],"^X",true,"^Y",["^Z","^;L","^4N"]],["^ ","^[",[1579837703000],"^10","goog.ui.menubase.js","^11",["^12","goog/ui/menubase.js"],"^13","goog/ui/menubase.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the MenuBase class.\n *\n */\n\ngoog.provide('goog.ui.MenuBase');\n\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyHandler');\ngoog.require('goog.ui.Popup');\n\n\n\n/**\n * The MenuBase class provides an abstract base class for different\n * implementations of menu controls.\n *\n * @param {Element=} opt_element A DOM element for the popup.\n * @deprecated Use goog.ui.Menu.\n * @constructor\n * @extends {goog.ui.Popup}\n */\ngoog.ui.MenuBase = function(opt_element) {\n  goog.ui.Popup.call(this, opt_element);\n\n  /**\n   * Event handler for simplifiying adding/removing listeners.\n   * @type {goog.events.EventHandler<!goog.ui.MenuBase>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  /**\n   * KeyHandler to cope with the vagaries of cross-browser key events.\n   * @type {goog.events.KeyHandler}\n   * @private\n   */\n  this.keyHandler_ = new goog.events.KeyHandler(this.getElement());\n};\ngoog.inherits(goog.ui.MenuBase, goog.ui.Popup);\n\n\n/**\n * Events fired by the Menu\n * @const\n */\ngoog.ui.MenuBase.Events = {};\n\n\n/**\n * Event fired by the Menu when an item is \"clicked\".\n */\ngoog.ui.MenuBase.Events.ITEM_ACTION = 'itemaction';\n\n\n/** @override */\ngoog.ui.MenuBase.prototype.disposeInternal = function() {\n  goog.ui.MenuBase.superClass_.disposeInternal.call(this);\n  this.eventHandler_.dispose();\n  this.keyHandler_.dispose();\n};\n\n\n/**\n * Called after the menu is shown. Derived classes can override to hook this\n * event but should make sure to call the parent class method.\n *\n * @protected\n * @override\n */\ngoog.ui.MenuBase.prototype.onShow = function() {\n  goog.ui.MenuBase.superClass_.onShow.call(this);\n\n  // register common event handlers for derived classes\n  var el = this.getElement();\n  this.eventHandler_.listen(\n      el, goog.events.EventType.MOUSEOVER, this.onMouseOver);\n  this.eventHandler_.listen(\n      el, goog.events.EventType.MOUSEOUT, this.onMouseOut);\n  this.eventHandler_.listen(\n      el, goog.events.EventType.MOUSEDOWN, this.onMouseDown);\n  this.eventHandler_.listen(el, goog.events.EventType.MOUSEUP, this.onMouseUp);\n\n  this.eventHandler_.listen(\n      this.keyHandler_, goog.events.KeyHandler.EventType.KEY, this.onKeyDown);\n};\n\n\n/**\n * Called after the menu is hidden. Derived classes can override to hook this\n * event but should make sure to call the parent class method.\n * @param {?Node=} opt_target Target of the event causing the hide.\n * @protected\n * @override\n */\ngoog.ui.MenuBase.prototype.onHide = function(opt_target) {\n  goog.ui.MenuBase.superClass_.onHide.call(this, opt_target);\n\n  // remove listeners when hidden\n  this.eventHandler_.removeAll();\n};\n\n\n/**\n * Returns the selected item\n *\n * @return {Object} The item selected or null if no item is selected.\n */\ngoog.ui.MenuBase.prototype.getSelectedItem = function() {\n  return null;\n};\n\n\n/**\n * Sets the selected item\n *\n * @param {Object} item The item to select. The type of this item is specific\n *     to the menu class.\n */\ngoog.ui.MenuBase.prototype.setSelectedItem = function(item) {};\n\n\n/**\n * Mouse over handler for the menu. Derived classes should override.\n *\n * @param {goog.events.Event} e The event object.\n * @protected\n */\ngoog.ui.MenuBase.prototype.onMouseOver = function(e) {};\n\n\n/**\n * Mouse out handler for the menu. Derived classes should override.\n *\n * @param {goog.events.Event} e The event object.\n * @protected\n */\ngoog.ui.MenuBase.prototype.onMouseOut = function(e) {};\n\n\n/**\n * Mouse down handler for the menu. Derived classes should override.\n *\n * @param {!goog.events.Event} e The event object.\n * @protected\n */\ngoog.ui.MenuBase.prototype.onMouseDown = function(e) {};\n\n\n/**\n * Mouse up handler for the menu. Derived classes should override.\n *\n * @param {goog.events.Event} e The event object.\n * @protected\n */\ngoog.ui.MenuBase.prototype.onMouseUp = function(e) {};\n\n\n/**\n * Key down handler for the menu. Derived classes should override.\n *\n * @param {goog.events.KeyEvent} e The event object.\n * @protected\n */\ngoog.ui.MenuBase.prototype.onKeyDown = function(e) {};\n","^17",1579837703000,"^18",["^19",["^2L","^5H","^Z","^2Z","~$goog.ui.Popup"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/menubase.js"],"^1J",["^19",["~$goog.ui.MenuBase"]],"^X",true,"^Y",["^Z","^2L","^2Z","^5H","^;M"]],["^ ","^[",[1579837703000],"^10","goog.ui.controlrenderer.js","^11",["^12","goog/ui/controlrenderer.js"],"^13","goog/ui/controlrenderer.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Base class for control renderers.\n * TODO(attila):  If the renderer framework works well, pull it into Component.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ControlRenderer');\n\ngoog.forwardDeclare('goog.ui.Control');\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.ControlContent');\ngoog.require('goog.userAgent');  // circular\n\n\n\n/**\n * Default renderer for {@link goog.ui.Control}s.  Can be used as-is, but\n * subclasses of Control will probably want to use renderers specifically\n * tailored for them by extending this class.  Controls that use renderers\n * delegate one or more of the following API methods to the renderer:\n * <ul>\n *    <li>`createDom` - renders the DOM for the component\n *    <li>`canDecorate` - determines whether an element can be decorated\n *        by the component\n *    <li>`decorate` - decorates an existing element with the component\n *    <li>`setState` - updates the appearance of the component based on\n *        its state\n *    <li>`getContent` - returns the component's content\n *    <li>`setContent` - sets the component's content\n * </ul>\n * Controls are stateful; renderers, on the other hand, should be stateless and\n * reusable.\n * @constructor\n */\ngoog.ui.ControlRenderer = function() {};\ngoog.addSingletonGetter(goog.ui.ControlRenderer);\ngoog.tagUnsealableClass(goog.ui.ControlRenderer);\n\n\n/**\n * Constructs a new renderer and sets the CSS class that the renderer will use\n * as the base CSS class to apply to all elements rendered by that renderer.\n * An example to use this function using a color palette:\n *\n * <pre>\n * var myCustomRenderer = goog.ui.ControlRenderer.getCustomRenderer(\n *     goog.ui.PaletteRenderer, 'my-special-palette');\n * var newColorPalette = new goog.ui.ColorPalette(\n *     colors, myCustomRenderer, opt_domHelper);\n * </pre>\n *\n * Your CSS can look like this now:\n * <pre>\n * .my-special-palette { }\n * .my-special-palette-table { }\n * .my-special-palette-cell { }\n * etc.\n * </pre>\n *\n * <em>instead</em> of\n * <pre>\n * .CSS_MY_SPECIAL_PALETTE .goog-palette { }\n * .CSS_MY_SPECIAL_PALETTE .goog-palette-table { }\n * .CSS_MY_SPECIAL_PALETTE .goog-palette-cell { }\n * etc.\n * </pre>\n *\n * You would want to use this functionality when you want an instance of a\n * component to have specific styles different than the other components of the\n * same type in your application.  This avoids using descendant selectors to\n * apply the specific styles to this component.\n *\n * @param {Function} ctor The constructor of the renderer you are trying to\n *     create.\n * @param {string} cssClassName The name of the CSS class for this renderer.\n * @return {goog.ui.ControlRenderer} An instance of the desired renderer with\n *     its getCssClass() method overridden to return the supplied custom CSS\n *     class name.\n */\ngoog.ui.ControlRenderer.getCustomRenderer = function(ctor, cssClassName) {\n  var renderer = new ctor();\n\n  /**\n   * Returns the CSS class to be applied to the root element of components\n   * rendered using this renderer.\n   * @return {string} Renderer-specific CSS class.\n   */\n  renderer.getCssClass = function() { return cssClassName; };\n\n  return renderer;\n};\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.ControlRenderer.CSS_CLASS = goog.getCssName('goog-control');\n\n\n/**\n * Array of arrays of CSS classes that we want composite classes added and\n * removed for in IE6 and lower as a workaround for lack of multi-class CSS\n * selector support.\n *\n * Subclasses that have accompanying CSS requiring this workaround should define\n * their own static IE6_CLASS_COMBINATIONS constant and override\n * getIe6ClassCombinations to return it.\n *\n * For example, if your stylesheet uses the selector .button.collapse-left\n * (and is compiled to .button_collapse-left for the IE6 version of the\n * stylesheet,) you should include ['button', 'collapse-left'] in this array\n * and the class button_collapse-left will be applied to the root element\n * whenever both button and collapse-left are applied individually.\n *\n * Members of each class name combination will be joined with underscores in the\n * order that they're defined in the array. You should alphabetize them (for\n * compatibility with the CSS compiler) unless you are doing something special.\n * @type {Array<Array<string>>}\n */\ngoog.ui.ControlRenderer.IE6_CLASS_COMBINATIONS = [];\n\n\n/**\n * Map of component states to corresponding ARIA attributes.  Since the mapping\n * of component states to ARIA attributes is neither component- nor\n * renderer-specific, this is a static property of the renderer class, and is\n * initialized on first use.\n * @type {Object<goog.ui.Component.State, goog.a11y.aria.State>}\n * @private\n */\ngoog.ui.ControlRenderer.ariaAttributeMap_;\n\n\n/**\n * Map of certain ARIA states to ARIA roles that support them. Used for checked\n * and selected Component states because they are used on Components with ARIA\n * roles that do not support the corresponding ARIA state.\n * @private {!Object<goog.a11y.aria.Role, goog.a11y.aria.State>}\n * @const\n */\ngoog.ui.ControlRenderer.TOGGLE_ARIA_STATE_MAP_ = goog.object.create(\n    goog.a11y.aria.Role.BUTTON, goog.a11y.aria.State.PRESSED,\n    goog.a11y.aria.Role.CHECKBOX, goog.a11y.aria.State.CHECKED,\n    goog.a11y.aria.Role.MENU_ITEM, goog.a11y.aria.State.SELECTED,\n    goog.a11y.aria.Role.MENU_ITEM_CHECKBOX, goog.a11y.aria.State.CHECKED,\n    goog.a11y.aria.Role.MENU_ITEM_RADIO, goog.a11y.aria.State.CHECKED,\n    goog.a11y.aria.Role.RADIO, goog.a11y.aria.State.CHECKED,\n    goog.a11y.aria.Role.TAB, goog.a11y.aria.State.SELECTED,\n    goog.a11y.aria.Role.TREEITEM, goog.a11y.aria.State.SELECTED);\n\n\n/**\n * Returns the ARIA role to be applied to the control.\n * See http://wiki/Main/ARIA for more info.\n * @return {goog.a11y.aria.Role|undefined} ARIA role.\n */\ngoog.ui.ControlRenderer.prototype.getAriaRole = function() {\n  // By default, the ARIA role is unspecified.\n  return undefined;\n};\n\n\n/**\n * Returns the control's contents wrapped in a DIV, with the renderer's own\n * CSS class and additional state-specific classes applied to it.\n * @param {goog.ui.Control} control Control to render.\n * @return {Element} Root element for the control.\n */\ngoog.ui.ControlRenderer.prototype.createDom = function(control) {\n  // Create and return DIV wrapping contents.\n  var element = control.getDomHelper().createDom(\n      goog.dom.TagName.DIV, this.getClassNames(control).join(' '),\n      control.getContent());\n\n  return element;\n};\n\n\n/**\n * Takes the control's root element and returns the parent element of the\n * control's contents.  Since by default controls are rendered as a single\n * DIV, the default implementation returns the element itself.  Subclasses\n * with more complex DOM structures must override this method as needed.\n * @param {Element} element Root element of the control whose content element\n *     is to be returned.\n * @return {Element} The control's content element.\n */\ngoog.ui.ControlRenderer.prototype.getContentElement = function(element) {\n  return element;\n};\n\n\n/**\n * Updates the control's DOM by adding or removing the specified class name\n * to/from its root element. May add additional combined classes as needed in\n * IE6 and lower. Because of this, subclasses should use this method when\n * modifying class names on the control's root element.\n * @param {goog.ui.Control|Element} control Control instance (or root element)\n *     to be updated.\n * @param {string} className CSS class name to add or remove.\n * @param {boolean} enable Whether to add or remove the class name.\n */\ngoog.ui.ControlRenderer.prototype.enableClassName = function(\n    control, className, enable) {\n  var element = /** @type {Element} */ (\n      control.getElement ? control.getElement() : control);\n  if (element) {\n    var classNames = [className];\n\n    // For IE6, we need to enable any combined classes involving this class\n    // as well.\n    // TODO(user): Remove this as IE6 is no longer in use.\n    if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('7')) {\n      classNames = this.getAppliedCombinedClassNames_(\n          goog.dom.classlist.get(element), className);\n      classNames.push(className);\n    }\n\n    goog.dom.classlist.enableAll(element, classNames, enable);\n  }\n};\n\n\n/**\n * Updates the control's DOM by adding or removing the specified extra class\n * name to/from its element.\n * @param {goog.ui.Control} control Control to be updated.\n * @param {string} className CSS class name to add or remove.\n * @param {boolean} enable Whether to add or remove the class name.\n */\ngoog.ui.ControlRenderer.prototype.enableExtraClassName = function(\n    control, className, enable) {\n  // The base class implementation is trivial; subclasses should override as\n  // needed.\n  this.enableClassName(control, className, enable);\n};\n\n\n/**\n * Returns true if this renderer can decorate the element, false otherwise.\n * The default implementation always returns true.\n * @param {Element} element Element to decorate.\n * @return {boolean} Whether the renderer can decorate the element.\n */\ngoog.ui.ControlRenderer.prototype.canDecorate = function(element) {\n  return true;\n};\n\n\n/**\n * Default implementation of `decorate` for {@link goog.ui.Control}s.\n * Initializes the control's ID, content, and state based on the ID of the\n * element, its child nodes, and its CSS classes, respectively.  Returns the\n * element.\n * @param {goog.ui.Control} control Control instance to decorate the element.\n * @param {Element} element Element to decorate.\n * @return {Element} Decorated element.\n */\ngoog.ui.ControlRenderer.prototype.decorate = function(control, element) {\n  // Set the control's ID to the decorated element's DOM ID, if any.\n  if (element.id) {\n    control.setId(element.id);\n  }\n\n  // Set the control's content to the decorated element's content.\n  var contentElem = this.getContentElement(element);\n  if (contentElem && contentElem.firstChild) {\n    control.setContentInternal(\n        contentElem.firstChild.nextSibling ?\n            goog.array.clone(contentElem.childNodes) :\n            contentElem.firstChild);\n  } else {\n    control.setContentInternal(null);\n  }\n\n  // Initialize the control's state based on the decorated element's CSS class.\n  // This implementation is optimized to minimize object allocations, string\n  // comparisons, and DOM access.\n  var state = 0x00;\n  var rendererClassName = this.getCssClass();\n  var structuralClassName = this.getStructuralCssClass();\n  var hasRendererClassName = false;\n  var hasStructuralClassName = false;\n  var hasCombinedClassName = false;\n  var classNames = goog.array.toArray(goog.dom.classlist.get(element));\n  goog.array.forEach(classNames, function(className) {\n    if (!hasRendererClassName && className == rendererClassName) {\n      hasRendererClassName = true;\n      if (structuralClassName == rendererClassName) {\n        hasStructuralClassName = true;\n      }\n    } else if (!hasStructuralClassName && className == structuralClassName) {\n      hasStructuralClassName = true;\n    } else {\n      state |= this.getStateFromClass(className);\n    }\n    if (this.getStateFromClass(className) == goog.ui.Component.State.DISABLED) {\n      goog.asserts.assertElement(contentElem);\n      if (goog.dom.isFocusableTabIndex(contentElem)) {\n        goog.dom.setFocusableTabIndex(contentElem, false);\n      }\n    }\n  }, this);\n  control.setStateInternal(state);\n\n  // Make sure the element has the renderer's CSS classes applied, as well as\n  // any extra class names set on the control.\n  if (!hasRendererClassName) {\n    classNames.push(rendererClassName);\n    if (structuralClassName == rendererClassName) {\n      hasStructuralClassName = true;\n    }\n  }\n  if (!hasStructuralClassName) {\n    classNames.push(structuralClassName);\n  }\n  var extraClassNames = control.getExtraClassNames();\n  if (extraClassNames) {\n    classNames.push.apply(classNames, extraClassNames);\n  }\n\n  // For IE6, rewrite all classes on the decorated element if any combined\n  // classes apply.\n  if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('7')) {\n    var combinedClasses = this.getAppliedCombinedClassNames_(classNames);\n    if (combinedClasses.length > 0) {\n      classNames.push.apply(classNames, combinedClasses);\n      hasCombinedClassName = true;\n    }\n  }\n\n  // Only write to the DOM if new class names had to be added to the element.\n  if (!hasRendererClassName || !hasStructuralClassName || extraClassNames ||\n      hasCombinedClassName) {\n    goog.dom.classlist.set(element, classNames.join(' '));\n  }\n\n  return element;\n};\n\n\n/**\n * Initializes the control's DOM by configuring properties that can only be set\n * after the DOM has entered the document.  This implementation sets up BiDi\n * and keyboard focus.  Called from {@link goog.ui.Control#enterDocument}.\n * @param {goog.ui.Control} control Control whose DOM is to be initialized\n *     as it enters the document.\n */\ngoog.ui.ControlRenderer.prototype.initializeDom = function(control) {\n  // Initialize render direction (BiDi).  We optimize the left-to-right render\n  // direction by assuming that elements are left-to-right by default, and only\n  // updating their styling if they are explicitly set to right-to-left.\n  if (control.isRightToLeft()) {\n    this.setRightToLeft(control.getElement(), true);\n  }\n\n  // Initialize keyboard focusability (tab index).  We assume that components\n  // aren't focusable by default (i.e have no tab index), and only touch the\n  // DOM if the component is focusable, enabled, and visible, and therefore\n  // needs a tab index.\n  if (control.isEnabled()) {\n    this.setFocusable(control, control.isVisible());\n  }\n};\n\n\n/**\n * Sets the element's ARIA role.\n * @param {Element} element Element to update.\n * @param {?goog.a11y.aria.Role=} opt_preferredRole The preferred ARIA role.\n */\ngoog.ui.ControlRenderer.prototype.setAriaRole = function(\n    element, opt_preferredRole) {\n  var ariaRole = opt_preferredRole || this.getAriaRole();\n  if (ariaRole) {\n    goog.asserts.assert(\n        element, 'The element passed as a first parameter cannot be null.');\n    var currentRole = goog.a11y.aria.getRole(element);\n    if (ariaRole == currentRole) {\n      return;\n    }\n    goog.a11y.aria.setRole(element, ariaRole);\n  }\n};\n\n\n/**\n * Sets the element's ARIA attributes, including distinguishing between\n * universally supported ARIA properties and ARIA states that are only\n * supported by certain ARIA roles. Only attributes which are initialized to be\n * true will be set.\n * @param {!goog.ui.Control} control Control whose ARIA state will be updated.\n * @param {!Element} element Element whose ARIA state is to be updated.\n */\ngoog.ui.ControlRenderer.prototype.setAriaStates = function(control, element) {\n  goog.asserts.assert(control);\n  goog.asserts.assert(element);\n\n  var ariaLabel = control.getAriaLabel();\n  if (ariaLabel != null) {\n    this.setAriaLabel(element, ariaLabel);\n  }\n\n  if (!control.isVisible()) {\n    goog.a11y.aria.setState(\n        element, goog.a11y.aria.State.HIDDEN, !control.isVisible());\n  }\n  if (!control.isEnabled()) {\n    this.updateAriaState(\n        element, goog.ui.Component.State.DISABLED, !control.isEnabled());\n  }\n  if (control.isSupportedState(goog.ui.Component.State.SELECTED)) {\n    this.updateAriaState(\n        element, goog.ui.Component.State.SELECTED, control.isSelected());\n  }\n  if (control.isSupportedState(goog.ui.Component.State.CHECKED)) {\n    this.updateAriaState(\n        element, goog.ui.Component.State.CHECKED, control.isChecked());\n  }\n  if (control.isSupportedState(goog.ui.Component.State.OPENED)) {\n    this.updateAriaState(\n        element, goog.ui.Component.State.OPENED, control.isOpen());\n  }\n};\n\n\n/**\n * Sets the element's ARIA label. This should be overriden by subclasses that\n * don't apply the role directly on control.element_.\n * @param {!Element} element Element whose ARIA label is to be updated.\n * @param {string} ariaLabel Label to add to the element.\n */\ngoog.ui.ControlRenderer.prototype.setAriaLabel = function(element, ariaLabel) {\n  goog.a11y.aria.setLabel(element, ariaLabel);\n};\n\n\n/**\n * Allows or disallows text selection within the control's DOM.\n * @param {Element} element The control's root element.\n * @param {boolean} allow Whether the element should allow text selection.\n */\ngoog.ui.ControlRenderer.prototype.setAllowTextSelection = function(\n    element, allow) {\n  // On all browsers other than IE and Opera, it isn't necessary to recursively\n  // apply unselectable styling to the element's children.\n  goog.style.setUnselectable(\n      element, !allow, !goog.userAgent.IE && !goog.userAgent.OPERA);\n};\n\n\n/**\n * Applies special styling to/from the control's element if it is rendered\n * right-to-left, and removes it if it is rendered left-to-right.\n * @param {Element} element The control's root element.\n * @param {boolean} rightToLeft Whether the component is rendered\n *     right-to-left.\n */\ngoog.ui.ControlRenderer.prototype.setRightToLeft = function(\n    element, rightToLeft) {\n  this.enableClassName(\n      element, goog.getCssName(this.getStructuralCssClass(), 'rtl'),\n      rightToLeft);\n};\n\n\n/**\n * Returns true if the control's key event target supports keyboard focus\n * (based on its `tabIndex` attribute), false otherwise.\n * @param {goog.ui.Control} control Control whose key event target is to be\n *     checked.\n * @return {boolean} Whether the control's key event target is focusable.\n */\ngoog.ui.ControlRenderer.prototype.isFocusable = function(control) {\n  var keyTarget;\n  if (control.isSupportedState(goog.ui.Component.State.FOCUSED) &&\n      (keyTarget = control.getKeyEventTarget())) {\n    return goog.dom.isFocusableTabIndex(keyTarget);\n  }\n  return false;\n};\n\n\n/**\n * Updates the control's key event target to make it focusable or non-focusable\n * via its `tabIndex` attribute.  Does nothing if the control doesn't\n * support the `FOCUSED` state, or if it has no key event target.\n * @param {goog.ui.Control} control Control whose key event target is to be\n *     updated.\n * @param {boolean} focusable Whether to enable keyboard focus support on the\n *     control's key event target.\n */\ngoog.ui.ControlRenderer.prototype.setFocusable = function(control, focusable) {\n  var keyTarget;\n  if (control.isSupportedState(goog.ui.Component.State.FOCUSED) &&\n      (keyTarget = control.getKeyEventTarget())) {\n    if (!focusable && control.isFocused()) {\n      // Blur before hiding.  Note that IE calls onblur handlers asynchronously.\n      try {\n        keyTarget.blur();\n      } catch (e) {\n        // TODO(user|user):  Find out why this fails on IE.\n      }\n      // The blur event dispatched by the key event target element when blur()\n      // was called on it should have been handled by the control's handleBlur()\n      // method, so at this point the control should no longer be focused.\n      // However, blur events are unreliable on IE and FF3, so if at this point\n      // the control is still focused, we trigger its handleBlur() method\n      // programmatically.\n      if (control.isFocused()) {\n        control.handleBlur(null);\n      }\n    }\n    // Don't overwrite existing tab index values unless needed.\n    if (goog.dom.isFocusableTabIndex(keyTarget) != focusable) {\n      goog.dom.setFocusableTabIndex(keyTarget, focusable);\n    }\n  }\n};\n\n\n/**\n * Shows or hides the element.\n * @param {Element} element Element to update.\n * @param {boolean} visible Whether to show the element.\n */\ngoog.ui.ControlRenderer.prototype.setVisible = function(element, visible) {\n  // The base class implementation is trivial; subclasses should override as\n  // needed.  It should be possible to do animated reveals, for example.\n  goog.style.setElementShown(element, visible);\n  if (element) {\n    goog.a11y.aria.setState(element, goog.a11y.aria.State.HIDDEN, !visible);\n  }\n};\n\n\n/**\n * Updates the appearance of the control in response to a state change.\n * @param {goog.ui.Control} control Control instance to update.\n * @param {goog.ui.Component.State} state State to enable or disable.\n * @param {boolean} enable Whether the control is entering or exiting the state.\n */\ngoog.ui.ControlRenderer.prototype.setState = function(control, state, enable) {\n  var element = control.getElement();\n  if (element) {\n    var className = this.getClassForState(state);\n    if (className) {\n      this.enableClassName(control, className, enable);\n    }\n    this.updateAriaState(element, state, enable);\n  }\n};\n\n\n/**\n * Updates the element's ARIA (accessibility) attributes , including\n * distinguishing between universally supported ARIA properties and ARIA states\n * that are only supported by certain ARIA roles.\n * @param {Element} element Element whose ARIA state is to be updated.\n * @param {goog.ui.Component.State} state Component state being enabled or\n *     disabled.\n * @param {boolean} enable Whether the state is being enabled or disabled.\n * @protected\n */\ngoog.ui.ControlRenderer.prototype.updateAriaState = function(\n    element, state, enable) {\n  // Ensure the ARIA attribute map exists.\n  if (!goog.ui.ControlRenderer.ariaAttributeMap_) {\n    goog.ui.ControlRenderer.ariaAttributeMap_ = goog.object.create(\n        goog.ui.Component.State.DISABLED, goog.a11y.aria.State.DISABLED,\n        goog.ui.Component.State.SELECTED, goog.a11y.aria.State.SELECTED,\n        goog.ui.Component.State.CHECKED, goog.a11y.aria.State.CHECKED,\n        goog.ui.Component.State.OPENED, goog.a11y.aria.State.EXPANDED);\n  }\n  goog.asserts.assert(\n      element, 'The element passed as a first parameter cannot be null.');\n  var ariaAttr = goog.ui.ControlRenderer.getAriaStateForAriaRole_(\n      element, goog.ui.ControlRenderer.ariaAttributeMap_[state]);\n  if (ariaAttr) {\n    goog.a11y.aria.setState(element, ariaAttr, enable);\n  }\n};\n\n\n/**\n * Returns the appropriate ARIA attribute based on ARIA role if the ARIA\n * attribute is an ARIA state.\n * @param {!Element} element The element from which to get the ARIA role for\n * matching ARIA state.\n * @param {goog.a11y.aria.State} attr The ARIA attribute to check to see if it\n * can be applied to the given ARIA role.\n * @return {goog.a11y.aria.State} An ARIA attribute that can be applied to the\n * given ARIA role.\n * @private\n */\ngoog.ui.ControlRenderer.getAriaStateForAriaRole_ = function(element, attr) {\n  var role = goog.a11y.aria.getRole(element);\n  if (!role) {\n    return attr;\n  }\n  role = /** @type {goog.a11y.aria.Role} */ (role);\n  var matchAttr = goog.ui.ControlRenderer.TOGGLE_ARIA_STATE_MAP_[role] || attr;\n  return goog.ui.ControlRenderer.isAriaState_(attr) ? matchAttr : attr;\n};\n\n\n/**\n * Determines if the given ARIA attribute is an ARIA property or ARIA state.\n * @param {goog.a11y.aria.State} attr The ARIA attribute to classify.\n * @return {boolean} If the ARIA attribute is an ARIA state.\n * @private\n */\ngoog.ui.ControlRenderer.isAriaState_ = function(attr) {\n  return attr == goog.a11y.aria.State.CHECKED ||\n      attr == goog.a11y.aria.State.SELECTED;\n};\n\n\n/**\n * Takes a control's root element, and sets its content to the given text\n * caption or DOM structure.  The default implementation replaces the children\n * of the given element.  Renderers that create more complex DOM structures\n * must override this method accordingly.\n * @param {Element} element The control's root element.\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to be\n *     set as the control's content. The DOM nodes will not be cloned, they\n *     will only moved under the content element of the control.\n */\ngoog.ui.ControlRenderer.prototype.setContent = function(element, content) {\n  var contentElem = this.getContentElement(element);\n  if (contentElem) {\n    goog.dom.removeChildren(contentElem);\n    if (content) {\n      if (typeof content === 'string') {\n        goog.dom.setTextContent(contentElem, content);\n      } else {\n        var childHandler = function(child) {\n          if (child) {\n            var doc = goog.dom.getOwnerDocument(contentElem);\n            contentElem.appendChild(\n                typeof child === 'string' ? doc.createTextNode(child) : child);\n          }\n        };\n        if (goog.isArray(content)) {\n          // Array of nodes.\n          goog.array.forEach(content, childHandler);\n        } else if (goog.isArrayLike(content) && !('nodeType' in content)) {\n          // NodeList. The second condition filters out TextNode which also has\n          // length attribute but is not array like. The nodes have to be cloned\n          // because childHandler removes them from the list during iteration.\n          goog.array.forEach(\n              goog.array.clone(/** @type {!NodeList<?>} */ (content)),\n              childHandler);\n        } else {\n          // Node or string.\n          childHandler(content);\n        }\n      }\n    }\n  }\n};\n\n\n/**\n * Returns the element within the component's DOM that should receive keyboard\n * focus (null if none).  The default implementation returns the control's root\n * element.\n * @param {goog.ui.Control} control Control whose key event target is to be\n *     returned.\n * @return {Element} The key event target.\n */\ngoog.ui.ControlRenderer.prototype.getKeyEventTarget = function(control) {\n  return control.getElement();\n};\n\n\n// CSS class name management.\n\n\n/**\n * Returns the CSS class name to be applied to the root element of all\n * components rendered or decorated using this renderer.  The class name\n * is expected to uniquely identify the renderer class, i.e. no two\n * renderer classes are expected to share the same CSS class name.\n * @return {string} Renderer-specific CSS class name.\n */\ngoog.ui.ControlRenderer.prototype.getCssClass = function() {\n  return goog.ui.ControlRenderer.CSS_CLASS;\n};\n\n\n/**\n * Returns an array of combinations of classes to apply combined class names for\n * in IE6 and below. See {@link IE6_CLASS_COMBINATIONS} for more detail. This\n * method doesn't reference {@link IE6_CLASS_COMBINATIONS} so that it can be\n * compiled out, but subclasses should return their IE6_CLASS_COMBINATIONS\n * static constant instead.\n * @return {Array<Array<string>>} Array of class name combinations.\n */\ngoog.ui.ControlRenderer.prototype.getIe6ClassCombinations = function() {\n  return [];\n};\n\n\n/**\n * Returns the name of a DOM structure-specific CSS class to be applied to the\n * root element of all components rendered or decorated using this renderer.\n * Unlike the class name returned by {@link #getCssClass}, the structural class\n * name may be shared among different renderers that generate similar DOM\n * structures.  The structural class name also serves as the basis of derived\n * class names used to identify and style structural elements of the control's\n * DOM, as well as the basis for state-specific class names.  The default\n * implementation returns the same class name as {@link #getCssClass}, but\n * subclasses are expected to override this method as needed.\n * @return {string} DOM structure-specific CSS class name (same as the renderer-\n *     specific CSS class name by default).\n */\ngoog.ui.ControlRenderer.prototype.getStructuralCssClass = function() {\n  return this.getCssClass();\n};\n\n\n/**\n * Returns all CSS class names applicable to the given control, based on its\n * state.  The return value is an array of strings containing\n * <ol>\n *   <li>the renderer-specific CSS class returned by {@link #getCssClass},\n *       followed by\n *   <li>the structural CSS class returned by {@link getStructuralCssClass} (if\n *       different from the renderer-specific CSS class), followed by\n *   <li>any state-specific classes returned by {@link #getClassNamesForState},\n *       followed by\n *   <li>any extra classes returned by the control's `getExtraClassNames`\n *       method and\n *   <li>for IE6 and lower, additional combined classes from\n *       {@link getAppliedCombinedClassNames_}.\n * </ol>\n * Since all controls have at least one renderer-specific CSS class name, this\n * method is guaranteed to return an array of at least one element.\n * @param {goog.ui.Control} control Control whose CSS classes are to be\n *     returned.\n * @return {!Array<string>} Array of CSS class names applicable to the control.\n * @protected\n */\ngoog.ui.ControlRenderer.prototype.getClassNames = function(control) {\n  var cssClass = this.getCssClass();\n\n  // Start with the renderer-specific class name.\n  var classNames = [cssClass];\n\n  // Add structural class name, if different.\n  var structuralCssClass = this.getStructuralCssClass();\n  if (structuralCssClass != cssClass) {\n    classNames.push(structuralCssClass);\n  }\n\n  // Add state-specific class names, if any.\n  var classNamesForState = this.getClassNamesForState(control.getState());\n  classNames.push.apply(classNames, classNamesForState);\n\n  // Add extra class names, if any.\n  var extraClassNames = control.getExtraClassNames();\n  if (extraClassNames) {\n    classNames.push.apply(classNames, extraClassNames);\n  }\n\n  // Add composite classes for IE6 support\n  if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('7')) {\n    classNames.push.apply(\n        classNames, this.getAppliedCombinedClassNames_(classNames));\n  }\n\n  return classNames;\n};\n\n\n/**\n * Returns an array of all the combined class names that should be applied based\n * on the given list of classes. Checks the result of\n * {@link getIe6ClassCombinations} for any combinations that have all\n * members contained in classes. If a combination matches, the members are\n * joined with an underscore (in order), and added to the return array.\n *\n * If opt_includedClass is provided, return only the combined classes that have\n * all members contained in classes AND include opt_includedClass as well.\n * opt_includedClass is added to classes as well.\n * @param {IArrayLike<string>} classes Array-like thing of classes to\n *     return matching combined classes for.\n * @param {?string=} opt_includedClass If provided, get only the combined\n *     classes that include this one.\n * @return {!Array<string>} Array of combined class names that should be\n *     applied.\n * @private\n */\ngoog.ui.ControlRenderer.prototype.getAppliedCombinedClassNames_ = function(\n    classes, opt_includedClass) {\n  var toAdd = [];\n  if (opt_includedClass) {\n    classes = goog.array.concat(classes, [opt_includedClass]);\n  }\n  goog.array.forEach(this.getIe6ClassCombinations(), function(combo) {\n    if (goog.array.every(combo, goog.partial(goog.array.contains, classes)) &&\n        (!opt_includedClass || goog.array.contains(combo, opt_includedClass))) {\n      toAdd.push(combo.join('_'));\n    }\n  });\n  return toAdd;\n};\n\n\n/**\n * Takes a bit mask of {@link goog.ui.Component.State}s, and returns an array\n * of the appropriate class names representing the given state, suitable to be\n * applied to the root element of a component rendered using this renderer, or\n * null if no state-specific classes need to be applied.  This default\n * implementation uses the renderer's {@link getClassForState} method to\n * generate each state-specific class.\n * @param {number} state Bit mask of component states.\n * @return {!Array<string>} Array of CSS class names representing the given\n *     state.\n * @protected\n */\ngoog.ui.ControlRenderer.prototype.getClassNamesForState = function(state) {\n  var classNames = [];\n  while (state) {\n    // For each enabled state, push the corresponding CSS class name onto\n    // the classNames array.\n    var mask = state & -state;  // Least significant bit\n    classNames.push(\n        this.getClassForState(\n            /** @type {goog.ui.Component.State} */ (mask)));\n    state &= ~mask;\n  }\n  return classNames;\n};\n\n\n/**\n * Takes a single {@link goog.ui.Component.State}, and returns the\n * corresponding CSS class name (null if none).\n * @param {goog.ui.Component.State} state Component state.\n * @return {string|undefined} CSS class representing the given state (undefined\n *     if none).\n * @protected\n */\ngoog.ui.ControlRenderer.prototype.getClassForState = function(state) {\n  if (!this.classByState_) {\n    this.createClassByStateMap_();\n  }\n  return this.classByState_[state];\n};\n\n\n/**\n * Takes a single CSS class name which may represent a component state, and\n * returns the corresponding component state (0x00 if none).\n * @param {string} className CSS class name, possibly representing a component\n *     state.\n * @return {goog.ui.Component.State} state Component state corresponding\n *     to the given CSS class (0x00 if none).\n * @protected\n */\ngoog.ui.ControlRenderer.prototype.getStateFromClass = function(className) {\n  if (!this.stateByClass_) {\n    this.createStateByClassMap_();\n  }\n  var state = parseInt(this.stateByClass_[className], 10);\n  return /** @type {goog.ui.Component.State} */ (isNaN(state) ? 0x00 : state);\n};\n\n\n/**\n * Creates the lookup table of states to classes, used during state changes.\n * @private\n */\ngoog.ui.ControlRenderer.prototype.createClassByStateMap_ = function() {\n  var baseClass = this.getStructuralCssClass();\n\n  // This ensures space-separated css classnames are not allowed, which some\n  // ControlRenderers had been doing.  See http://b/13694665.\n  var isValidClassName =\n      !goog.string.contains(goog.string.normalizeWhitespace(baseClass), ' ');\n  goog.asserts.assert(\n      isValidClassName,\n      'ControlRenderer has an invalid css class: \\'' + baseClass + '\\'');\n\n  /**\n   * Map of component states to state-specific structural class names,\n   * used when changing the DOM in response to a state change.  Precomputed\n   * and cached on first use to minimize object allocations and string\n   * concatenation.\n   * @type {Object}\n   * @private\n   */\n  this.classByState_ = goog.object.create(\n      goog.ui.Component.State.DISABLED, goog.getCssName(baseClass, 'disabled'),\n      goog.ui.Component.State.HOVER, goog.getCssName(baseClass, 'hover'),\n      goog.ui.Component.State.ACTIVE, goog.getCssName(baseClass, 'active'),\n      goog.ui.Component.State.SELECTED, goog.getCssName(baseClass, 'selected'),\n      goog.ui.Component.State.CHECKED, goog.getCssName(baseClass, 'checked'),\n      goog.ui.Component.State.FOCUSED, goog.getCssName(baseClass, 'focused'),\n      goog.ui.Component.State.OPENED, goog.getCssName(baseClass, 'open'));\n};\n\n\n/**\n * Creates the lookup table of classes to states, used during decoration.\n * @private\n */\ngoog.ui.ControlRenderer.prototype.createStateByClassMap_ = function() {\n  // We need the classByState_ map so we can transpose it.\n  if (!this.classByState_) {\n    this.createClassByStateMap_();\n  }\n\n  /**\n   * Map of state-specific structural class names to component states,\n   * used during element decoration.  Precomputed and cached on first use\n   * to minimize object allocations and string concatenation.\n   * @type {Object}\n   * @private\n   */\n  this.stateByClass_ = goog.object.transpose(this.classByState_);\n};\n","^17",1579837703000,"^18",["^19",["^1S","^1T","^2O","^2P","^2D","^22","^2U","^Z","^2G","^2X","~$goog.ui.ControlContent","^5@","^29","^35","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/controlrenderer.js"],"^1J",["^19",["~$goog.ui.ControlRenderer"]],"^X",true,"^Y",["^Z","^2P","^2U","^5@","^35","^1S","^1T","^1V","^2O","^2G","^2D","^29","^22","^;O","^2X"]],["^ ","^[",[1579837703000],"^10","goog.ui.separator.js","^11",["^12","goog/ui/separator.js"],"^13","goog/ui/separator.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A class for representing a separator, with renderers for both\n * horizontal (menu) and vertical (toolbar) separators.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.Separator');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.asserts');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Control');\ngoog.require('goog.ui.MenuSeparatorRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Class representing a separator.  Although it extends {@link goog.ui.Control},\n * the Separator class doesn't allocate any event handlers, nor does it change\n * its appearance on mouseover, etc.\n * @param {goog.ui.MenuSeparatorRenderer=} opt_renderer Renderer to render or\n *    decorate the separator; defaults to {@link goog.ui.MenuSeparatorRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *    document interaction.\n * @constructor\n * @extends {goog.ui.Control}\n */\ngoog.ui.Separator = function(opt_renderer, opt_domHelper) {\n  goog.ui.Control.call(\n      this, null, opt_renderer || goog.ui.MenuSeparatorRenderer.getInstance(),\n      opt_domHelper);\n\n  this.setSupportedState(goog.ui.Component.State.DISABLED, false);\n  this.setSupportedState(goog.ui.Component.State.HOVER, false);\n  this.setSupportedState(goog.ui.Component.State.ACTIVE, false);\n  this.setSupportedState(goog.ui.Component.State.FOCUSED, false);\n\n  // Separators are always considered disabled.\n  this.setStateInternal(goog.ui.Component.State.DISABLED);\n};\ngoog.inherits(goog.ui.Separator, goog.ui.Control);\n\n\n/**\n * Configures the component after its DOM has been rendered.  Overrides\n * {@link goog.ui.Control#enterDocument} by making sure no event handler\n * is allocated.\n * @override\n */\ngoog.ui.Separator.prototype.enterDocument = function() {\n  goog.ui.Separator.superClass_.enterDocument.call(this);\n  var element = this.getElement();\n  goog.asserts.assert(\n      element, 'The DOM element for the separator cannot be null.');\n  goog.a11y.aria.setRole(element, 'separator');\n};\n\n\n// Register a decorator factory function for goog.ui.MenuSeparators.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.MenuSeparatorRenderer.CSS_CLASS, function() {\n      // Separator defaults to using MenuSeparatorRenderer.\n      return new goog.ui.Separator();\n    });\n","^17",1579837703000,"^18",["^19",["^1S","^2P","^22","^Z","^3A","~$goog.ui.MenuSeparatorRenderer","~$goog.ui.Control"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/separator.js"],"^1J",["^19",["~$goog.ui.Separator"]],"^X",true,"^Y",["^Z","^2P","^1S","^22","^;R","^;Q","^3A"]],["^ ","^[",[1579837703000],"^10","goog.ui.ac.renderoptions.js","^11",["^12","goog/ui/ac/renderoptions.js"],"^13","goog/ui/ac/renderoptions.js","^14","^15","^16","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Options for rendering matches.\n *\n */\n\ngoog.provide('goog.ui.ac.RenderOptions');\n\n\n\n/**\n * A simple class that contains options for rendering a set of autocomplete\n * matches.  Used as an optional argument in the callback from the matcher.\n * @constructor\n */\ngoog.ui.ac.RenderOptions = function() {};\n\n\n/**\n * Whether the current highlighting is to be preserved when displaying the new\n * set of matches.\n * @type {boolean}\n * @private\n */\ngoog.ui.ac.RenderOptions.prototype.preserveHilited_ = false;\n\n\n/**\n * Whether the first match is to be highlighted.  When undefined the autoHilite\n * flag of the autocomplete is used.\n * @type {boolean|undefined}\n * @private\n */\ngoog.ui.ac.RenderOptions.prototype.autoHilite_;\n\n\n/**\n * @param {boolean} flag The new value for the preserveHilited_ flag.\n */\ngoog.ui.ac.RenderOptions.prototype.setPreserveHilited = function(flag) {\n  this.preserveHilited_ = flag;\n};\n\n\n/**\n * @return {boolean} The value of the preserveHilited_ flag.\n */\ngoog.ui.ac.RenderOptions.prototype.getPreserveHilited = function() {\n  return this.preserveHilited_;\n};\n\n\n/**\n * @param {boolean} flag The new value for the autoHilite_ flag.\n */\ngoog.ui.ac.RenderOptions.prototype.setAutoHilite = function(flag) {\n  this.autoHilite_ = flag;\n};\n\n\n/**\n * @return {boolean|undefined} The value of the autoHilite_ flag.\n */\ngoog.ui.ac.RenderOptions.prototype.getAutoHilite = function() {\n  return this.autoHilite_;\n};\n","^17",1579837703000,"^18",["^19",["^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/ac/renderoptions.js"],"^1J",["^19",["~$goog.ui.ac.RenderOptions"]],"^X",true,"^Y",["^Z"]],["^ ","^[",[1579837703000],"^10","goog.structs.stringset.js","^11",["^12","goog/structs/stringset.js"],"^13","goog/structs/stringset.js","^14","^15","^16","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Data structure for set of strings.\n *\n *\n * This class implements a set data structure for strings. Adding and removing\n * is O(1). It doesn't contain any bloat from {@link goog.structs.Set}, i.e.\n * it isn't optimized for IE6 garbage collector (see the description of\n * {@link goog.structs.Map#keys_} for details), and it distinguishes its\n * elements by their string value not by hash code.\n * The implementation assumes that no new keys are added to Object.prototype.\n */\n\ngoog.provide('goog.structs.StringSet');\n\ngoog.require('goog.asserts');\ngoog.require('goog.iter');\n\n\n\n/**\n * Creates a set of strings.\n * @param {!Array<?>=} opt_elements Elements to add to the set. The non-string\n *     items will be converted to strings, so 15 and '15' will mean the same.\n * @constructor\n * @final\n */\ngoog.structs.StringSet = function(opt_elements) {\n  /**\n   * An object storing the escaped elements of the set in its keys.\n   * @type {!Object}\n   * @private\n   */\n  this.elements_ = {};\n\n  if (opt_elements) {\n    for (var i = 0; i < opt_elements.length; i++) {\n      this.elements_[goog.structs.StringSet.encode_(opt_elements[i])] = null;\n    }\n  }\n\n  goog.asserts.assertObjectPrototypeIsIntact();\n};\n\n\n/**\n * Empty object. Referring to it is faster than creating a new empty object in\n * `goog.structs.StringSet.encode_`.\n * @const {!Object}\n * @private\n */\ngoog.structs.StringSet.EMPTY_OBJECT_ = {};\n\n\n/**\n * The '__proto__' and the '__count__' keys aren't enumerable in Firefox, and\n * 'toString', 'valueOf', 'constructor', etc. aren't enumerable in IE so they\n * have to be escaped before they are added to the internal object.\n * NOTE: When a new set is created, 50-80% of the CPU time is spent in encode.\n * @param {*} element The element to escape.\n * @return {*} The escaped element or the element itself if it doesn't have to\n *     be escaped.\n * @private\n */\ngoog.structs.StringSet.encode_ = function(element) {\n  return element in goog.structs.StringSet.EMPTY_OBJECT_ ||\n          String(element).charCodeAt(0) == 32 ?\n      ' ' + element :\n      element;\n};\n\n\n/**\n * Inverse function of `goog.structs.StringSet.encode_`.\n * NOTE: forEach would be 30% faster in FF if the compiler inlined decode.\n * @param {string} key The escaped element used as the key of the internal\n *     object.\n * @return {string} The unescaped element.\n * @private\n */\ngoog.structs.StringSet.decode_ = function(key) {\n  return key.charCodeAt(0) == 32 ? key.substr(1) : key;\n};\n\n\n/**\n * Adds a single element to the set.\n * @param {*} element The element to add. It will be converted to string.\n */\ngoog.structs.StringSet.prototype.add = function(element) {\n  this.elements_[goog.structs.StringSet.encode_(element)] = null;\n};\n\n\n/**\n * Adds a the elements of an array to this set.\n * @param {!Array<?>} arr The array to add the elements of.\n */\ngoog.structs.StringSet.prototype.addArray = function(arr) {\n  for (var i = 0; i < arr.length; i++) {\n    this.elements_[goog.structs.StringSet.encode_(arr[i])] = null;\n  }\n};\n\n\n/**\n * Adds the elements which are in `set1` but not in `set2` to this\n * set.\n * @param {!goog.structs.StringSet} set1 First set.\n * @param {!goog.structs.StringSet} set2 Second set.\n * @private\n */\ngoog.structs.StringSet.prototype.addDifference_ = function(set1, set2) {\n  for (var key in set1.elements_) {\n    if (!(key in set2.elements_)) {\n      this.elements_[key] = null;\n    }\n  }\n};\n\n\n/**\n * Adds a the elements of a set to this set.\n * @param {!goog.structs.StringSet} stringSet The set to add the elements of.\n */\ngoog.structs.StringSet.prototype.addSet = function(stringSet) {\n  for (var key in stringSet.elements_) {\n    this.elements_[key] = null;\n  }\n};\n\n\n/**\n * Removes all elements of the set.\n */\ngoog.structs.StringSet.prototype.clear = function() {\n  this.elements_ = {};\n};\n\n\n/**\n * @return {!goog.structs.StringSet} Clone of the set.\n */\ngoog.structs.StringSet.prototype.clone = function() {\n  var ret = new goog.structs.StringSet;\n  ret.addSet(this);\n  return ret;\n};\n\n\n/**\n * Tells if the set contains the given element.\n * @param {*} element The element to check.\n * @return {boolean} Whether it is in the set.\n */\ngoog.structs.StringSet.prototype.contains = function(element) {\n  return goog.structs.StringSet.encode_(element) in this.elements_;\n};\n\n\n/**\n * Tells if the set contains all elements of the array.\n * @param {!Array<?>} arr The elements to check.\n * @return {boolean} Whether they are in the set.\n */\ngoog.structs.StringSet.prototype.containsArray = function(arr) {\n  for (var i = 0; i < arr.length; i++) {\n    if (!(goog.structs.StringSet.encode_(arr[i]) in this.elements_)) {\n      return false;\n    }\n  }\n  return true;\n};\n\n\n/**\n * Tells if this set has the same elements as the given set.\n * @param {!goog.structs.StringSet} stringSet The other set.\n * @return {boolean} Whether they have the same elements.\n */\ngoog.structs.StringSet.prototype.equals = function(stringSet) {\n  return this.isSubsetOf(stringSet) && stringSet.isSubsetOf(this);\n};\n\n\n/**\n * Calls a function for each element in the set.\n * @param {function(string, undefined, !goog.structs.StringSet)} f The function\n *     to call for every element. It takes the element, undefined (because sets\n *     have no notion of keys), and the set.\n * @param {Object=} opt_obj The object to be used as the value of 'this'\n *     within `f`.\n */\ngoog.structs.StringSet.prototype.forEach = function(f, opt_obj) {\n  for (var key in this.elements_) {\n    f.call(opt_obj, goog.structs.StringSet.decode_(key), undefined, this);\n  }\n};\n\n\n/**\n * Counts the number of elements in the set in linear time.\n * NOTE: getCount is always called at most once per set instance in google3.\n * If this usage pattern won't change, the linear getCount implementation is\n * better, because\n * <li>populating a set and getting the number of elements in it takes the same\n * amount of time as keeping a count_ member up to date and getting its value;\n * <li>if getCount is not called, adding and removing elements have no overhead.\n * @return {number} The number of elements in the set.\n */\ngoog.structs.StringSet.prototype.getCount = Object.keys ?\n    /**\n     * @this {!goog.structs.StringSet}\n     * @return {number}\n     */\n    function() {\n      return Object.keys(this.elements_).length;\n    } :\n    /**\n     * @this {!goog.structs.StringSet}\n     * @return {number}\n     */\n    function() {\n      var count = 0;\n      for (var key in this.elements_) {\n        count++;\n      }\n      return count;\n    };\n\n\n/**\n * Calculates the difference of two sets.\n * @param {!goog.structs.StringSet} stringSet The set to subtract from this set.\n * @return {!goog.structs.StringSet} `this` minus `stringSet`.\n */\ngoog.structs.StringSet.prototype.getDifference = function(stringSet) {\n  var ret = new goog.structs.StringSet;\n  ret.addDifference_(this, stringSet);\n  return ret;\n};\n\n\n/**\n * Calculates the intersection of this set with another set.\n * @param {!goog.structs.StringSet} stringSet The set to take the intersection\n *     with.\n * @return {!goog.structs.StringSet} A new set with the common elements.\n */\ngoog.structs.StringSet.prototype.getIntersection = function(stringSet) {\n  var ret = new goog.structs.StringSet;\n  for (var key in this.elements_) {\n    if (key in stringSet.elements_) {\n      ret.elements_[key] = null;\n    }\n  }\n  return ret;\n};\n\n\n/**\n * Calculates the symmetric difference of two sets.\n * @param {!goog.structs.StringSet} stringSet The other set.\n * @return {!goog.structs.StringSet} A new set with the elements in exactly one\n *     of `this` and `stringSet`.\n */\ngoog.structs.StringSet.prototype.getSymmetricDifference = function(stringSet) {\n  var ret = new goog.structs.StringSet;\n  ret.addDifference_(this, stringSet);\n  ret.addDifference_(stringSet, this);\n  return ret;\n};\n\n\n/**\n * Calculates the union of this set and another set.\n * @param {!goog.structs.StringSet} stringSet The set to take the union with.\n * @return {!goog.structs.StringSet} A new set with the union of elements.\n */\ngoog.structs.StringSet.prototype.getUnion = function(stringSet) {\n  var ret = this.clone();\n  ret.addSet(stringSet);\n  return ret;\n};\n\n\n/**\n * @return {!Array<string>} The elements of the set.\n */\ngoog.structs.StringSet.prototype.getValues = Object.keys ?\n    /**\n     * @this {!goog.structs.StringSet}\n     * @return {!Array<string>}\n     */\n    function() {\n      // Object.keys was introduced in JavaScript 1.8.5, Array#map in 1.6.\n      return Object.keys(this.elements_)\n          .map(goog.structs.StringSet.decode_, this);\n    } :\n    /**\n     * @this {!goog.structs.StringSet}\n     * @return {!Array<string>}\n     */\n    function() {\n      var ret = [];\n      for (var key in this.elements_) {\n        ret.push(goog.structs.StringSet.decode_(key));\n      }\n      return ret;\n    };\n\n\n/**\n * Tells if this set and the given set are disjoint.\n * @param {!goog.structs.StringSet} stringSet The other set.\n * @return {boolean} True iff they don't have common elements.\n */\ngoog.structs.StringSet.prototype.isDisjoint = function(stringSet) {\n  for (var key in this.elements_) {\n    if (key in stringSet.elements_) {\n      return false;\n    }\n  }\n  return true;\n};\n\n\n/**\n * @return {boolean} Whether the set is empty.\n */\ngoog.structs.StringSet.prototype.isEmpty = function() {\n  for (var key in this.elements_) {\n    return false;\n  }\n  return true;\n};\n\n\n/**\n * Tells if this set is the subset of the given set.\n * @param {!goog.structs.StringSet} stringSet The other set.\n * @return {boolean} Whether this set if the subset of that.\n */\ngoog.structs.StringSet.prototype.isSubsetOf = function(stringSet) {\n  for (var key in this.elements_) {\n    if (!(key in stringSet.elements_)) {\n      return false;\n    }\n  }\n  return true;\n};\n\n\n/**\n * Tells if this set is the superset of the given set.\n * @param {!goog.structs.StringSet} stringSet The other set.\n * @return {boolean} Whether this set if the superset of that.\n */\ngoog.structs.StringSet.prototype.isSupersetOf = function(stringSet) {\n  return stringSet.isSubsetOf(this);\n};\n\n\n/**\n * Removes a single element from the set.\n * @param {*} element The element to remove.\n * @return {boolean} Whether the element was in the set.\n */\ngoog.structs.StringSet.prototype.remove = function(element) {\n  var key = goog.structs.StringSet.encode_(element);\n  if (key in this.elements_) {\n    delete this.elements_[key];\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Removes all elements of the given array from this set.\n * @param {!Array<?>} arr The elements to remove.\n */\ngoog.structs.StringSet.prototype.removeArray = function(arr) {\n  for (var i = 0; i < arr.length; i++) {\n    delete this.elements_[goog.structs.StringSet.encode_(arr[i])];\n  }\n};\n\n\n/**\n * Removes all elements of the given set from this set.\n * @param {!goog.structs.StringSet} stringSet The set of elements to remove.\n */\ngoog.structs.StringSet.prototype.removeSet = function(stringSet) {\n  for (var key in stringSet.elements_) {\n    delete this.elements_[key];\n  }\n};\n\n\n/**\n * Returns an iterator that iterates over the elements in the set.\n * NOTE: creating the iterator copies the whole set so use {@link #forEach} when\n * possible.\n * @param {boolean=} opt_keys Ignored for sets.\n * @return {!goog.iter.Iterator} An iterator over the elements in the set.\n */\ngoog.structs.StringSet.prototype.__iterator__ = function(opt_keys) {\n  return goog.iter.toIterator(this.getValues());\n};\n","^17",1579837703000,"^18",["^19",["^1S","^;G","^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/stringset.js"],"^1J",["^19",["~$goog.structs.StringSet"]],"^X",true,"^Y",["^Z","^1S","^;G"]],["^ ","^[",[1579837703000],"^10","goog.crypt.base64.js","^11",["^12","goog/crypt/base64.js"],"^13","goog/crypt/base64.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Base64 en/decoding. Not much to say here except that we\n * work with decoded values in arrays of bytes. By \"byte\" I mean a number\n * in [0, 255].\n *\n * @author doughtie@google.com (Gavin Doughtie)\n */\n\ngoog.provide('goog.crypt.base64');\n\ngoog.require('goog.asserts');\ngoog.require('goog.crypt');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\ngoog.require('goog.userAgent.product');\n\n/**\n * Default alphabet, shared between alphabets. Only 62 characters.\n * @private {string}\n */\ngoog.crypt.base64.DEFAULT_ALPHABET_COMMON_ = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' +\n    'abcdefghijklmnopqrstuvwxyz' +\n    '0123456789';\n\n\n/**\n * Alphabet characters for Alphabet.DEFAULT encoding.\n * For characters without padding, please consider using\n * `goog.crypt.baseN.BASE_64` instead.\n *\n * @type {string}\n */\ngoog.crypt.base64.ENCODED_VALS =\n    goog.crypt.base64.DEFAULT_ALPHABET_COMMON_ + '+/=';\n\n\n/**\n * Alphabet characters for Alphabet.WEBSAFE_DOT_PADDING encoding.\n * The dot padding is no Internet Standard, according to RFC 4686.\n * https://tools.ietf.org/html/rfc4648\n * For characters without padding, please consider using\n * `goog.crypt.baseN.BASE_64_URL_SAFE` instead.\n *\n * @type {string}\n */\ngoog.crypt.base64.ENCODED_VALS_WEBSAFE =\n    goog.crypt.base64.DEFAULT_ALPHABET_COMMON_ + '-_.';\n\n\n/**\n * Alphabets for Base64 encoding\n * Alphabets with no padding character are for encoding without padding.\n * About the alphabets, please refer to RFC 4686.\n * https://tools.ietf.org/html/rfc4648\n * @enum {number}\n */\ngoog.crypt.base64.Alphabet = {\n  DEFAULT: 0,\n  NO_PADDING: 1,\n  WEBSAFE: 2,\n  WEBSAFE_DOT_PADDING: 3,\n  WEBSAFE_NO_PADDING: 4,\n};\n\n\n/**\n * Padding chars for Base64 encoding\n * @const {string}\n * @private\n */\ngoog.crypt.base64.paddingChars_ = '=.';\n\n\n/**\n * Check if a character is a padding character\n *\n * @param {string} char\n * @return {boolean}\n * @private\n */\ngoog.crypt.base64.isPadding_ = function(char) {\n  return goog.string.contains(goog.crypt.base64.paddingChars_, char);\n};\n\n\n// Static lookup maps, lazily populated by init_()\n\n/**\n * For each `Alphabet`, maps from bytes to characters.\n *\n * @see https://jsperf.com/char-lookups\n * @type {!Object<!goog.crypt.base64.Alphabet, !Array<string>>}\n * @private\n */\ngoog.crypt.base64.byteToCharMaps_ = {};\n\n/**\n * Maps characters to bytes.\n *\n * This map is used for all alphabets since, across alphabets, common chars\n * always map to the same byte.\n *\n * `null` indicates `init` has not yet been called.\n *\n * @type {?Object<string, number>}\n * @private\n */\ngoog.crypt.base64.charToByteMap_ = null;\n\n\n/**\n * White list of implementations with known-good native atob and btoa functions.\n * Listing these explicitly (via the ASSUME_* wrappers) benefits dead-code\n * removal in per-browser compilations.\n * @private {boolean}\n */\ngoog.crypt.base64.ASSUME_NATIVE_SUPPORT_ = goog.userAgent.GECKO ||\n    (goog.userAgent.WEBKIT && !goog.userAgent.product.SAFARI) ||\n    goog.userAgent.OPERA;\n\n\n/**\n * Does this browser have a working btoa function?\n * @private {boolean}\n */\ngoog.crypt.base64.HAS_NATIVE_ENCODE_ =\n    goog.crypt.base64.ASSUME_NATIVE_SUPPORT_ ||\n    typeof(goog.global.btoa) == 'function';\n\n\n/**\n * Does this browser have a working atob function?\n * We blacklist known-bad implementations:\n *  - IE (10+) added atob() but it does not tolerate whitespace on the input.\n * @private {boolean}\n */\ngoog.crypt.base64.HAS_NATIVE_DECODE_ =\n    goog.crypt.base64.ASSUME_NATIVE_SUPPORT_ ||\n    (!goog.userAgent.product.SAFARI && !goog.userAgent.IE &&\n     typeof(goog.global.atob) == 'function');\n\n\n/**\n * Base64-encode an array of bytes.\n *\n * @param {Array<number>|Uint8Array} input An array of bytes (numbers with\n *     value in [0, 255]) to encode.\n * @param {!goog.crypt.base64.Alphabet=} alphabet Base 64 alphabet to\n *     use in encoding. Alphabet.DEFAULT is used by default.\n * @return {string} The base64 encoded string.\n */\ngoog.crypt.base64.encodeByteArray = function(input, alphabet) {\n  // Assert avoids runtime dependency on goog.isArrayLike, which helps reduce\n  // size of jscompiler output, and which yields slight performance increase.\n  goog.asserts.assert(\n      goog.isArrayLike(input), 'encodeByteArray takes an array as a parameter');\n\n  if (alphabet === undefined) {\n    alphabet = goog.crypt.base64.Alphabet.DEFAULT;\n  }\n\n  goog.crypt.base64.init_();\n\n  var byteToCharMap = goog.crypt.base64.byteToCharMaps_[alphabet];\n\n  var output = [];\n\n  for (var i = 0; i < input.length; i += 3) {\n    var byte1 = input[i];\n    var haveByte2 = i + 1 < input.length;\n    var byte2 = haveByte2 ? input[i + 1] : 0;\n    var haveByte3 = i + 2 < input.length;\n    var byte3 = haveByte3 ? input[i + 2] : 0;\n\n    var outByte1 = byte1 >> 2;\n    var outByte2 = ((byte1 & 0x03) << 4) | (byte2 >> 4);\n    var outByte3 = ((byte2 & 0x0F) << 2) | (byte3 >> 6);\n    var outByte4 = byte3 & 0x3F;\n\n    if (!haveByte3) {\n      outByte4 = 64;\n\n      if (!haveByte2) {\n        outByte3 = 64;\n      }\n    }\n\n    output.push(\n        byteToCharMap[outByte1], byteToCharMap[outByte2],\n        byteToCharMap[outByte3] || '', byteToCharMap[outByte4] || '');\n  }\n\n  return output.join('');\n};\n\n\n/**\n * Base64-encode a string.\n *\n * @param {string} input A string to encode.\n * @param {!goog.crypt.base64.Alphabet=} alphabet Base 64 alphabet to\n *     use in encoding. Alphabet.DEFAULT is used by default.\n * @return {string} The base64 encoded string.\n */\ngoog.crypt.base64.encodeString = function(input, alphabet) {\n  // Shortcut for browsers that implement\n  // a native base64 encoder in the form of \"btoa/atob\"\n  if (goog.crypt.base64.HAS_NATIVE_ENCODE_ && !alphabet) {\n    return goog.global.btoa(input);\n  }\n  return goog.crypt.base64.encodeByteArray(\n      goog.crypt.stringToByteArray(input), alphabet);\n};\n\n\n/**\n * Base64-decode a string.\n *\n * @param {string} input Input to decode. Any whitespace is ignored, and the\n *     input maybe encoded with either supported alphabet (or a mix thereof).\n * @param {boolean=} useCustomDecoder True indicates the custom decoder is used,\n *     which supports alternative alphabets. Note that passing false may still\n *     use the custom decoder on browsers without native support.\n * @return {string} string representing the decoded value.\n */\ngoog.crypt.base64.decodeString = function(input, useCustomDecoder) {\n  // Shortcut for browsers that implement\n  // a native base64 encoder in the form of \"btoa/atob\"\n  if (goog.crypt.base64.HAS_NATIVE_DECODE_ && !useCustomDecoder) {\n    return goog.global.atob(input);\n  }\n  var output = '';\n  function pushByte(b) {\n    output += String.fromCharCode(b);\n  }\n\n  goog.crypt.base64.decodeStringInternal_(input, pushByte);\n\n  return output;\n};\n\n\n/**\n * Base64-decode a string to an Array of numbers.\n *\n * In base-64 decoding, groups of four characters are converted into three\n * bytes.  If the encoder did not apply padding, the input length may not\n * be a multiple of 4.\n *\n * In this case, the last group will have fewer than 4 characters, and\n * padding will be inferred.  If the group has one or two characters, it decodes\n * to one byte.  If the group has three characters, it decodes to two bytes.\n *\n * @param {string} input Input to decode. Any whitespace is ignored, and the\n *     input maybe encoded with either supported alphabet (or a mix thereof).\n * @param {boolean=} opt_ignored Unused parameter, retained for compatibility.\n * @return {!Array<number>} bytes representing the decoded value.\n */\ngoog.crypt.base64.decodeStringToByteArray = function(input, opt_ignored) {\n  var output = [];\n  function pushByte(b) { output.push(b); }\n\n  goog.crypt.base64.decodeStringInternal_(input, pushByte);\n\n  return output;\n};\n\n\n/**\n * Base64-decode a string to a Uint8Array.\n *\n * Note that Uint8Array is not supported on older browsers, e.g. IE < 10.\n * @see http://caniuse.com/uint8array\n *\n * In base-64 decoding, groups of four characters are converted into three\n * bytes.  If the encoder did not apply padding, the input length may not\n * be a multiple of 4.\n *\n * In this case, the last group will have fewer than 4 characters, and\n * padding will be inferred.  If the group has one or two characters, it decodes\n * to one byte.  If the group has three characters, it decodes to two bytes.\n *\n * @param {string} input Input to decode. Any whitespace is ignored, and the\n *     input maybe encoded with either supported alphabet (or a mix thereof).\n * @return {!Uint8Array} bytes representing the decoded value.\n */\ngoog.crypt.base64.decodeStringToUint8Array = function(input) {\n  goog.asserts.assert(\n      !goog.userAgent.IE || goog.userAgent.isVersionOrHigher('10'),\n      'Browser does not support typed arrays');\n  var len = input.length;\n  // Approximate the length of the array needed for output.\n  // Our method varies according to the format of the input, which we can\n  // consider in three categories:\n  //   A) well-formed with proper padding\n  //   B) well-formed without any padding\n  //   C) not-well-formed, either with extra whitespace in the middle or with\n  //      extra padding characters.\n  //\n  //  In the case of (A), (length * 3 / 4) will result in an integer number of\n  //  bytes evenly divisible by 3, and we need only subtract bytes according to\n  //  the padding observed.\n  //\n  //  In the case of (B), (length * 3 / 4) will result in a non-integer number\n  //  of bytes, or not evenly divisible by 3. (If the result is evenly divisible\n  //  by 3, it's well-formed with the proper amount of padding [0 padding]).\n  //  This approximation can become exact by rounding down.\n  //\n  //  In the case of (C), the only way to get the length is to walk the full\n  //  length of the string to consider each character. This is handled by\n  //  tracking the number of bytes added to the array and using subarray to\n  //  trim the array back down to size.\n  var approxByteLength = len * 3 / 4;\n  if (approxByteLength % 3) {\n    // The string isn't complete, either because it didn't include padding, or\n    // because it has extra white space.\n    // In either case, we won't generate more bytes than are completely encoded,\n    // so rounding down is appropriate to have a buffer at least as large as\n    // output.\n    approxByteLength = Math.floor(approxByteLength);\n  } else if (goog.crypt.base64.isPadding_(input[len - 1])) {\n    // The string has a round length, and has some padding.\n    // Reduce the byte length according to the quantity of padding.\n    if (goog.crypt.base64.isPadding_(input[len - 2])) {\n      approxByteLength -= 2;\n    } else {\n      approxByteLength -= 1;\n    }\n  }\n  var output = new Uint8Array(approxByteLength);\n  var outLen = 0;\n  function pushByte(b) {\n    output[outLen++] = b;\n  }\n\n  goog.crypt.base64.decodeStringInternal_(input, pushByte);\n\n  // Return a subarray to handle the case that input included extra whitespace\n  // or extra padding and approxByteLength was incorrect.\n  return output.subarray(0, outLen);\n};\n\n\n/**\n * @param {string} input Input to decode.\n * @param {function(number):void} pushByte result accumulator.\n * @private\n */\ngoog.crypt.base64.decodeStringInternal_ = function(input, pushByte) {\n  goog.crypt.base64.init_();\n\n  var nextCharIndex = 0;\n  /**\n   * @param {number} default_val Used for end-of-input.\n   * @return {number} The next 6-bit value, or the default for end-of-input.\n   */\n  function getByte(default_val) {\n    while (nextCharIndex < input.length) {\n      var ch = input.charAt(nextCharIndex++);\n      var b = goog.crypt.base64.charToByteMap_[ch];\n      if (b != null) {\n        return b;  // Common case: decoded the char.\n      }\n      if (!goog.string.isEmptyOrWhitespace(ch)) {\n        throw new Error('Unknown base64 encoding at char: ' + ch);\n      }\n      // We encountered whitespace: loop around to the next input char.\n    }\n    return default_val;  // No more input remaining.\n  }\n\n  while (true) {\n    var byte1 = getByte(-1);\n    var byte2 = getByte(0);\n    var byte3 = getByte(64);\n    var byte4 = getByte(64);\n\n    // The common case is that all four bytes are present, so if we have byte4\n    // we can skip over the truncated input special case handling.\n    if (byte4 === 64) {\n      if (byte1 === -1) {\n        return;  // Terminal case: no input left to decode.\n      }\n      // Here we know an intermediate number of bytes are missing.\n      // The defaults for byte2, byte3 and byte4 apply the inferred padding\n      // rules per the public API documentation. i.e: 1 byte\n      // missing should yield 2 bytes of output, but 2 or 3 missing bytes yield\n      // a single byte of output. (Recall that 64 corresponds the padding char).\n    }\n\n    var outByte1 = (byte1 << 2) | (byte2 >> 4);\n    pushByte(outByte1);\n\n    if (byte3 != 64) {\n      var outByte2 = ((byte2 << 4) & 0xF0) | (byte3 >> 2);\n      pushByte(outByte2);\n\n      if (byte4 != 64) {\n        var outByte3 = ((byte3 << 6) & 0xC0) | byte4;\n        pushByte(outByte3);\n      }\n    }\n  }\n};\n\n\n/**\n * Lazy static initialization function. Called before\n * accessing any of the static map variables.\n * @private\n */\ngoog.crypt.base64.init_ = function() {\n  if (goog.crypt.base64.charToByteMap_) {\n    return;\n  }\n  goog.crypt.base64.charToByteMap_ = {};\n\n  // We want quick mappings back and forth, so we precompute encoding maps.\n\n  /** @type {!Array<string>} */\n  var commonChars = goog.crypt.base64.DEFAULT_ALPHABET_COMMON_.split('');\n  var specialChars = [\n    '+/=',  // DEFAULT\n    '+/',   // NO_PADDING\n    '-_=',  // WEBSAFE\n    '-_.',  // WEBSAFE_DOT_PADDING\n    '-_',   // WEBSAFE_NO_PADDING\n  ];\n\n  for (var i = 0; i < 5; i++) {\n    // `i` is each value of the `goog.crypt.base64.Alphabet` enum\n    var chars = commonChars.concat(specialChars[i].split(''));\n\n    // Sets byte-to-char map\n    goog.crypt.base64\n        .byteToCharMaps_[/** @type {!goog.crypt.base64.Alphabet} */ (i)] =\n        chars;\n\n    // Sets char-to-byte map\n    for (var j = 0; j < chars.length; j++) {\n      var char = chars[j];\n\n      var existingByte = goog.crypt.base64.charToByteMap_[char];\n      if (existingByte === undefined) {\n        goog.crypt.base64.charToByteMap_[char] = j;\n      } else {\n        goog.asserts.assert(existingByte === j);\n      }\n    }\n  }\n};\n","^17",1579837703000,"^18",["^19",["^1S","~$goog.crypt","^2N","^2D","^Z","^2X"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/base64.js"],"^1J",["^19",["~$goog.crypt.base64"]],"^X",true,"^Y",["^Z","^1S","^;V","^2D","^2X","^2N"]],["^ ","^[",[1579837703000],"^10","goog.ui.media.flickr.js","^11",["^12","goog/ui/media/flickr.js"],"^13","goog/ui/media/flickr.js","^14","^15","^16","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview provides a reusable FlickrSet photo UI component given a public\n * FlickrSetModel.\n *\n * goog.ui.media.FlickrSet is actually a {@link goog.ui.ControlRenderer}, a\n * stateless class - that could/should be used as a Singleton with the static\n * method `goog.ui.media.FlickrSet.getInstance` -, that knows how to\n * render Flickr sets. It is designed to be used with a {@link goog.ui.Control},\n * which will actually control the media renderer and provide the\n * {@link goog.ui.Component} base. This design guarantees that all different\n * types of medias will behave alike but will look different.\n *\n * goog.ui.media.FlickrSet expects a `goog.ui.media.FlickrSetModel` on\n * `goog.ui.Control.getModel` as data models, and renders a flash object\n * that will show the contents of that set.\n *\n * Example of usage:\n *\n * <pre>\n *   var flickrSet = goog.ui.media.FlickrSetModel.newInstance(flickrSetUrl);\n *   goog.ui.media.FlickrSet.newControl(flickrSet).render();\n * </pre>\n *\n * FlickrSet medias currently support the following states:\n *\n * <ul>\n *   <li> {@link goog.ui.Component.State.DISABLED}: shows 'flash not available'\n *   <li> {@link goog.ui.Component.State.HOVER}: mouse cursor is over the video\n *   <li> {@link goog.ui.Component.State.SELECTED}: flash video is shown\n * </ul>\n *\n * Which can be accessed by\n * <pre>\n *   video.setEnabled(true);\n *   video.setHighlighted(true);\n *   video.setSelected(true);\n * </pre>\n *\n * Requires flash to actually work.\n *\n *\n * TODO(user): Support non flash users. Maybe show a link to the Flick set,\n * or fetch the data and rendering it using javascript (instead of a broken\n * 'You need to install flash' message).\n */\n\ngoog.provide('goog.ui.media.FlickrSet');\ngoog.provide('goog.ui.media.FlickrSetModel');\n\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.string.Const');\ngoog.require('goog.ui.media.FlashObject');\ngoog.require('goog.ui.media.Media');\ngoog.require('goog.ui.media.MediaModel');\ngoog.require('goog.ui.media.MediaRenderer');\n\n\n\n/**\n * Subclasses a goog.ui.media.MediaRenderer to provide a FlickrSet specific\n * media renderer.\n *\n * This class knows how to parse FlickrSet URLs, and render the DOM structure\n * of flickr set players. This class is meant to be used as a singleton static\n * stateless class, that takes `goog.ui.media.Media` instances and renders\n * it. It expects `goog.ui.media.Media.getModel` to return a well formed,\n * previously constructed, set id {@see goog.ui.media.FlickrSet.parseUrl},\n * which is the data model this renderer will use to construct the DOM\n * structure. {@see goog.ui.media.FlickrSet.newControl} for a example of\n * constructing a control with this renderer.\n *\n * This design is patterned after\n * http://go/closure_control_subclassing\n *\n * It uses {@link goog.ui.media.FlashObject} to embed the flash object.\n *\n * @constructor\n * @extends {goog.ui.media.MediaRenderer}\n * @final\n */\ngoog.ui.media.FlickrSet = function() {\n  goog.ui.media.MediaRenderer.call(this);\n};\ngoog.inherits(goog.ui.media.FlickrSet, goog.ui.media.MediaRenderer);\ngoog.addSingletonGetter(goog.ui.media.FlickrSet);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n *\n * @type {string}\n */\ngoog.ui.media.FlickrSet.CSS_CLASS = goog.getCssName('goog-ui-media-flickrset');\n\n\n/**\n * Flash player URL. Uses Flickr's flash player by default.\n *\n * @type {!goog.html.TrustedResourceUrl}\n * @private\n */\ngoog.ui.media.FlickrSet.flashUrl_ = goog.html.TrustedResourceUrl.fromConstant(\n    goog.string.Const.from(\n        'http://www.flickr.com/apps/slideshow/show.swf?v=63961'));\n\n\n/**\n * A static convenient method to construct a goog.ui.media.Media control out of\n * a FlickrSet URL. It extracts the set id information on the URL, sets it\n * as the data model goog.ui.media.FlickrSet renderer uses, sets the states\n * supported by the renderer, and returns a Control that binds everything\n * together. This is what you should be using for constructing FlickrSet videos,\n * except if you need more fine control over the configuration.\n *\n * @param {goog.ui.media.FlickrSetModel} dataModel The Flickr Set data model.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @return {!goog.ui.media.Media} A Control binded to the FlickrSet renderer.\n * @throws exception in case `flickrSetUrl` is an invalid flickr set URL.\n * TODO(user): use {@link goog.ui.media.MediaModel} once it is checked in.\n */\ngoog.ui.media.FlickrSet.newControl = function(dataModel, opt_domHelper) {\n  var control = new goog.ui.media.Media(\n      dataModel, goog.ui.media.FlickrSet.getInstance(), opt_domHelper);\n  control.setSelected(true);\n  return control;\n};\n\n\n/**\n * A static method that sets which flash URL this class should use. Use this if\n * you want to host your own flash flickr player.\n *\n * @param {!goog.html.TrustedResourceUrl} flashUrl The URL of the flash flickr\n *     player.\n */\ngoog.ui.media.FlickrSet.setFlashUrl = function(flashUrl) {\n  goog.ui.media.FlickrSet.flashUrl_ = flashUrl;\n};\n\n\n/**\n * Creates the initial DOM structure of the flickr set, which is basically a\n * the flash object pointing to a flickr set player.\n *\n * @param {goog.ui.Control} c The media control.\n * @return {!Element} The DOM structure that represents this control.\n * @override\n */\ngoog.ui.media.FlickrSet.prototype.createDom = function(c) {\n  var control = /** @type {goog.ui.media.Media} */ (c);\n  var div = goog.ui.media.FlickrSet.superClass_.createDom.call(this, control);\n\n  var model =\n      /** @type {goog.ui.media.FlickrSetModel} */ (control.getDataModel());\n\n  // TODO(user): find out what is the policy about hosting this SWF. figure out\n  // if it works over https.\n  var flash = new goog.ui.media.FlashObject(\n      model.getPlayer().getTrustedResourceUrl(), control.getDomHelper());\n  flash.addFlashVars(model.getPlayer().getVars());\n  flash.render(div);\n\n  return div;\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.media.FlickrSet.prototype.getCssClass = function() {\n  return goog.ui.media.FlickrSet.CSS_CLASS;\n};\n\n\n\n/**\n * The `goog.ui.media.FlickrAlbum` media data model. It stores a required\n * `userId` and `setId` fields, sets the flickr Set URL, and\n * allows a few optional parameters.\n *\n * @param {string} userId The flickr userId associated with this set.\n * @param {string} setId The flickr setId associated with this set.\n * @param {string=} opt_caption An optional caption of the flickr set.\n * @param {string=} opt_description An optional description of the flickr set.\n * @constructor\n * @extends {goog.ui.media.MediaModel}\n * @final\n */\ngoog.ui.media.FlickrSetModel = function(\n    userId, setId, opt_caption, opt_description) {\n  goog.ui.media.MediaModel.call(\n      this, goog.ui.media.FlickrSetModel.buildUrl(userId, setId), opt_caption,\n      opt_description, goog.ui.media.MediaModel.MimeType.FLASH);\n\n  /**\n   * The Flickr user id.\n   * @type {string}\n   * @private\n   */\n  this.userId_ = userId;\n\n  /**\n   * The Flickr set id.\n   * @type {string}\n   * @private\n   */\n  this.setId_ = setId;\n\n  var flashVars = {\n    'offsite': 'true',\n    'lang': 'en',\n    'page_show_url': '/photos/' + userId + '/sets/' + setId + '/show/',\n    'page_show_back_url': '/photos/' + userId + '/sets/' + setId,\n    'set_id': setId\n  };\n\n  var player = new goog.ui.media.MediaModel.Player(\n      goog.ui.media.FlickrSet.flashUrl_, flashVars);\n\n  this.setPlayer(player);\n};\ngoog.inherits(goog.ui.media.FlickrSetModel, goog.ui.media.MediaModel);\n\n\n/**\n * Regular expression used to extract the username and set id out of the flickr\n * URLs.\n *\n * Copied from http://go/markdownlite.js and {@link FlickrExtractor.xml}.\n *\n * @type {RegExp}\n * @private\n * @const\n */\ngoog.ui.media.FlickrSetModel.MATCHER_ =\n    /(?:http:\\/\\/)?(?:www\\.)?flickr\\.com\\/(?:photos\\/([\\d\\w@\\-]+)\\/sets\\/(\\d+))\\/?/i;\n\n\n/**\n * Takes a `flickrSetUrl` and extracts the flickr username and set id.\n *\n * @param {string} flickrSetUrl A Flickr set URL.\n * @param {string=} opt_caption An optional caption of the flickr set.\n * @param {string=} opt_description An optional description of the flickr set.\n * @return {!goog.ui.media.FlickrSetModel} The data model that represents the\n *     Flickr set.\n * @throws exception in case the parsing fails\n */\ngoog.ui.media.FlickrSetModel.newInstance = function(\n    flickrSetUrl, opt_caption, opt_description) {\n  if (goog.ui.media.FlickrSetModel.MATCHER_.test(flickrSetUrl)) {\n    var data = goog.ui.media.FlickrSetModel.MATCHER_.exec(flickrSetUrl);\n    return new goog.ui.media.FlickrSetModel(\n        data[1], data[2], opt_caption, opt_description);\n  }\n  throw new Error('failed to parse flickr url: ' + flickrSetUrl);\n};\n\n\n/**\n * Takes a flickr username and set id and returns an URL.\n *\n * @param {string} userId The owner of the set.\n * @param {string} setId The set id.\n * @return {string} The URL of the set.\n */\ngoog.ui.media.FlickrSetModel.buildUrl = function(userId, setId) {\n  return 'http://flickr.com/photos/' + userId + '/sets/' + setId;\n};\n\n\n/**\n * Gets the Flickr user id.\n * @return {string} The Flickr user id.\n */\ngoog.ui.media.FlickrSetModel.prototype.getUserId = function() {\n  return this.userId_;\n};\n\n\n/**\n * Gets the Flickr set id.\n * @return {string} The Flickr set id.\n */\ngoog.ui.media.FlickrSetModel.prototype.getSetId = function() {\n  return this.setId_;\n};\n","^17",1579837703000,"^18",["^19",["^2>","~$goog.ui.media.MediaModel","~$goog.ui.media.Media","~$goog.ui.media.MediaRenderer","^Z","~$goog.string.Const","~$goog.ui.media.FlashObject"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/media/flickr.js"],"^1J",["^19",["~$goog.ui.media.FlickrSetModel","~$goog.ui.media.FlickrSet"]],"^X",true,"^Y",["^Z","^2>","^;[","^<0","^;Y","^;X","^;Z"]],["^ ","^[",[1579837703000],"^10","goog.html.sanitizer.csssanitizer.js","^11",["^12","goog/html/sanitizer/csssanitizer.js"],"^13","goog/html/sanitizer/csssanitizer.js","^14","^15","^16","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview\n * JavaScript support for client-side CSS sanitization.\n *\n * @author danesh@google.com (Danesh Irani)\n * @author mikesamuel@gmail.com (Mike Samuel)\n */\n\ngoog.provide('goog.html.sanitizer.CssSanitizer');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.CssSpecificity');\ngoog.require('goog.html.SafeStyle');\ngoog.require('goog.html.SafeStyleSheet');\ngoog.require('goog.html.SafeUrl');\ngoog.require('goog.html.sanitizer.CssPropertySanitizer');\ngoog.require('goog.html.sanitizer.noclobber');\ngoog.require('goog.html.uncheckedconversions');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.string.Const');\ngoog.require('goog.userAgent');\ngoog.require('goog.userAgent.product');\n\n\n\n/**\n * A regular expression to match each selector in a CSS rule. Selectors are\n * separated by commas, but can have strings within them (e.g. foo[name=\"bar\"])\n * that can contain commas and escaped quotes.\n * @private {?RegExp}\n */\ngoog.html.sanitizer.CssSanitizer.SELECTOR_REGEX_ =\n    // Don't even evaluate it on older browsers (IE8 and IE9), it throws a\n    // syntax error and we don't use it anyway.\n    !(goog.userAgent.IE && document.documentMode < 10) ?\n    new RegExp(\n        '\\\\s*' +              // Discard initial space\n            '([^\\\\s\\'\",]+' +  // Beginning of the match. Anything but a comma,\n                              // spaces or a string delimiter. This is the only\n                              // non-optional component of the regex.\n            '[^\\'\",]*' +      // Spaces are fine afterwards (e.g. \"a > b\").\n            ('(' +  // A series of optional strings with matching delimiters\n                    // that can contain anything, and optional non-quoted text\n                    // without commas.\n             '(\\'([^\\'\\\\r\\\\n\\\\f\\\\\\\\]|\\\\\\\\[^])*\\')|' +  // Optional single-quoted\n                                                       // string.\n             '(\"([^\"\\\\r\\\\n\\\\f\\\\\\\\]|\\\\\\\\[^])*\")|' +     // Optional double-quoted\n                                                       // string.\n             '[^\\'\",]' +  // Optional non-string content.\n             ')*') +      // String and non-string\n                          // content can come in any\n                          // order.\n            ')',          // End of the match.\n        'g') :\n    null;\n\n\n/**\n * A whitelist of properties that can retain the prefix in Chrome.\n * @private @const {!Object<string,boolean>}\n */\ngoog.html.sanitizer.CHROME_INCLUDE_VENDOR_PREFIX_WHITELIST_ =\n    goog.object.createSet(\n        '-webkit-border-horizontal-spacing', '-webkit-border-vertical-spacing');\n\n\n/**\n * Removes a vendor prefix from a property name.\n * @param {string} propName A property name.\n * @return {string} A property name without vendor prefixes.\n * @private\n */\ngoog.html.sanitizer.CssSanitizer.withoutVendorPrefix_ = function(propName) {\n  // A few property names are only valid with the prefix on specific browsers.\n  // The recommendation is of course to avoid them, but in specific cases a\n  // non-prefixed property gets transformed into one or more prefixed\n  // properties by the browser. In this case, the best option to avoid having\n  // the non-prefixed property be dropped silently is to allow the prefixed\n  // property in the output.\n  if (goog.userAgent.WEBKIT &&\n      propName in goog.html.sanitizer.CHROME_INCLUDE_VENDOR_PREFIX_WHITELIST_) {\n    return propName;\n  }\n  // http://stackoverflow.com/a/5411098/20394 has a fairly extensive list\n  // of vendor prefixes. Blink has not declared a vendor prefix distinct from\n  // -webkit- and http://css-tricks.com/tldr-on-vendor-prefix-drama/ discusses\n  // how Mozilla recognizes some -webkit- prefixes.\n  // http://wiki.csswg.org/spec/vendor-prefixes talks more about\n  // cross-implementation, and lists other prefixes.\n  return propName.replace(\n      /^-(?:apple|css|epub|khtml|moz|mso?|o|rim|wap|webkit|xv)-(?=[a-z])/i, '');\n};\n\n\n/**\n * Sanitizes a {@link CSSStyleSheet}.\n * @param {!CSSStyleSheet} cssStyleSheet\n * @param {?string} containerId An ID to restrict the scope of the rules being\n *     sanitized. If null, no restriction is applied.\n * @param {function(string, string):?goog.html.SafeUrl|undefined} uriRewriter A\n *     URI rewriter that returns a goog.html.SafeUrl.\n * @return {!goog.html.SafeStyleSheet}\n * @private\n */\ngoog.html.sanitizer.CssSanitizer.sanitizeStyleSheet_ = function(\n    cssStyleSheet, containerId, uriRewriter) {\n  var sanitizedRules = [];\n  var cssRules = goog.html.sanitizer.CssSanitizer.getOnlyStyleRules_(\n      goog.array.toArray(cssStyleSheet.cssRules));\n  goog.array.forEach(cssRules, function(cssRule) {\n    if (containerId && !/[a-zA-Z][\\w-:\\.]*/.test(containerId)) {\n      // Sanity check on the element ID that will confine the new CSS rules.\n      throw new Error('Invalid container id');\n    }\n    if (containerId && goog.userAgent.product.IE &&\n        document.documentMode == 10 && /\\\\['\"]/.test(cssRule.selectorText)) {\n      // If a container ID was specified, drop selectors with escaped quotes in\n      // strings on IE 10 due to a regex bug.\n      return;\n    }\n    // If a container ID was specified, restrict all selectors in this rule to\n    // be descendants of the node with such an ID. Use a regex to exclude commas\n    // within selector strings.\n    var scopedSelector = containerId ?\n        cssRule.selectorText.replace(\n            goog.html.sanitizer.CssSanitizer.SELECTOR_REGEX_,\n            '#' + containerId + ' $1') :\n        cssRule.selectorText;\n    sanitizedRules.push(goog.html.SafeStyleSheet.createRule(\n        scopedSelector,\n        goog.html.sanitizer.CssSanitizer.sanitizeInlineStyle(\n            cssRule.style, uriRewriter)));\n  });\n  return goog.html.SafeStyleSheet.concat(sanitizedRules);\n};\n\n\n/**\n * Used to filter out at-rules like @media, @font, etc. Currently, none of these\n * are supported.\n * @param {!Array<!CSSRule>} cssRules\n * @return {!Array<!CSSStyleRule>}\n * @private\n */\n// TODO(pelizzi): some of these at-rules are safe, consider adding partial\n// support for them.\ngoog.html.sanitizer.CssSanitizer.getOnlyStyleRules_ = function(cssRules) {\n  return /** @type {!Array<!CSSStyleRule>} */ (\n      goog.array.filter(cssRules, function(cssRule) {\n        return cssRule instanceof CSSStyleRule ||\n            cssRule.type == CSSRule.STYLE_RULE;\n      }));\n};\n\n\n/**\n * Sanitizes the contents of a STYLE tag.\n * @param {string} textContent The textual content of the STYLE tag.\n * @param {?string=} opt_containerId The ID of a node that will contain the\n *     STYLE tag that includes the sanitized content, to restrict the effects of\n *     the rules being sanitized to descendants of this node.\n * @param {function(string, string):?goog.html.SafeUrl=} opt_uriRewriter A URI\n *     rewriter that returns a goog.html.SafeUrl.\n * @return {!goog.html.SafeStyleSheet}\n * @supported IE 10+, Chrome 26+, Firefox 22+, Safari 7.1+, Opera 15+. On IE10,\n *     support for escaped quotes inside quoted strings (e.g. `a[name=\"it\\'s\"]`)\n *     is unreliable, and some (but not all!) rules containing these are\n *     silently dropped.\n */\ngoog.html.sanitizer.CssSanitizer.sanitizeStyleSheetString = function(\n    textContent, opt_containerId, opt_uriRewriter) {\n  var styleTag = /** @type {?HTMLStyleElement} */\n      (goog.html.sanitizer.CssSanitizer.safeParseHtmlAndGetInertElement(\n          '<style>' + textContent + '</style>'));\n  if (styleTag == null || styleTag.sheet == null) {\n    return goog.html.SafeStyleSheet.EMPTY;\n  }\n  var containerId = opt_containerId != undefined ? opt_containerId : null;\n  return goog.html.sanitizer.CssSanitizer.sanitizeStyleSheet_(\n      /** @type {!CSSStyleSheet} */ (styleTag.sheet), containerId,\n      opt_uriRewriter);\n};\n\n\n/**\n * Returns an inert DOM tree produced by parsing the provided html using\n * DOMParser. \"Inert\" here means that merely parsing the string won't execute\n * scripts or load images. If you attach this tree to a non-inert document, it\n * will execute these side effects! In this package we prefer using the TEMPLATE\n * tag over DOMParser to produce inert trees, but at least on Chrome the inert\n * STYLE tag does not have a CSSStyleSheet object attached to it.\n * @param {string} html\n * @return {?Element}\n */\ngoog.html.sanitizer.CssSanitizer.safeParseHtmlAndGetInertElement = function(\n    html) {\n  if ((goog.userAgent.IE && !goog.userAgent.isVersionOrHigher(10)) ||\n      typeof goog.global.DOMParser != 'function') {\n    return null;\n  }\n  var safeHtml = goog.html.uncheckedconversions\n                     .safeHtmlFromStringKnownToSatisfyTypeContract(\n                         goog.string.Const.from('Never attached to DOM.'),\n                         '<html><head></head><body>' + html + '</body></html>');\n  return goog.dom.safe.parseFromStringHtml(new DOMParser(), safeHtml)\n      .body.children[0];\n};\n\n\n/**\n * Sanitizes an inline style attribute. Short-hand attributes are expanded to\n * their individual elements. Note: The sanitizer does not output vendor\n * prefixed styles.\n * @param {?CSSStyleDeclaration} cssStyle A CSS style object.\n * @param {function(string, string):?goog.html.SafeUrl=} opt_uriRewriter A URI\n *     rewriter that returns a goog.html.SafeUrl.\n * @return {!goog.html.SafeStyle} A sanitized inline cssText.\n */\ngoog.html.sanitizer.CssSanitizer.sanitizeInlineStyle = function(\n    cssStyle, opt_uriRewriter) {\n  if (!cssStyle) {\n    return goog.html.SafeStyle.EMPTY;\n  }\n\n  var cleanCssStyle = document.createElement('div').style;\n  var cssPropNames =\n      goog.html.sanitizer.CssSanitizer.getCssPropNames_(cssStyle);\n\n  goog.array.forEach(cssPropNames, function(propName) {\n    var propNameWithoutPrefix =\n        goog.html.sanitizer.CssSanitizer.withoutVendorPrefix_(propName);\n    if (!goog.html.sanitizer.CssSanitizer.isDisallowedPropertyName_(\n            propNameWithoutPrefix)) {\n      var propValue = goog.html.sanitizer.noclobber.getCssPropertyValue(\n          /** @type {!CSSStyleDeclaration} */ (cssStyle), propName);\n\n      var sanitizedValue =\n          goog.html.sanitizer.CssPropertySanitizer.sanitizeProperty(\n              propNameWithoutPrefix, propValue, opt_uriRewriter);\n      if (sanitizedValue != null) {\n        goog.html.sanitizer.noclobber.setCssProperty(\n            cleanCssStyle, propNameWithoutPrefix, sanitizedValue);\n      }\n    }\n  });\n  return goog.html.uncheckedconversions\n      .safeStyleFromStringKnownToSatisfyTypeContract(\n          goog.string.Const.from('Output of CSS sanitizer'),\n          cleanCssStyle.cssText || '');\n};\n\n\n/**\n * Sanitizes inline CSS text and returns it as a SafeStyle object. When adequate\n * browser support is not available, such as for IE9 and below, a\n * SafeStyle-wrapped empty string is returned.\n * @param {string} cssText CSS text to be sanitized.\n * @param {function(string, string):?goog.html.SafeUrl=} opt_uriRewriter A URI\n *     rewriter that returns a goog.html.SafeUrl.\n * @return {!goog.html.SafeStyle} A sanitized inline cssText.\n */\ngoog.html.sanitizer.CssSanitizer.sanitizeInlineStyleString = function(\n    cssText, opt_uriRewriter) {\n  // same check as in goog.html.sanitizer.HTML_SANITIZER_SUPPORTED_\n  if (goog.userAgent.IE && document.documentMode < 10) {\n    return new goog.html.SafeStyle();\n  }\n\n  var div = goog.html.sanitizer.CssSanitizer\n      .createInertDocument_()\n      .createElement('DIV');\n  div.style.cssText = cssText;\n  return goog.html.sanitizer.CssSanitizer.sanitizeInlineStyle(\n      div.style, opt_uriRewriter);\n};\n\n\n/**\n * Converts rules in STYLE tags into style attributes on the tags they apply to.\n * Modifies the provided DOM subtree in-place.\n * @param {!Element} element\n * @package\n */\ngoog.html.sanitizer.CssSanitizer.inlineStyleRules = function(element) {\n  // Note that Webkit used to offer the perfect function for the job:\n  // getMatchedCSSRules. Unfortunately, it was never supported cross-browser and\n  // is deprecated now. On the other hand, getComputedStyle cannot be used to\n  // differentiate property values that are set by a style sheet from those set\n  // by a style attribute or default values. This algorithm with\n  // O(nr_of_elements * nr_of_rules) complexity that has to manually sort\n  // selectors by specificity is the best we can do.\n\n  // Extract all rules from STYLE tags found in the subtree.\n  /** @type {!Array<!HTMLStyleElement>} */\n  var styleTags =\n      goog.html.sanitizer.noclobber.getElementsByTagName(element, 'STYLE');\n  var cssRules = goog.array.concatMap(styleTags, function(styleTag) {\n    return goog.array.toArray(\n        goog.html.sanitizer.noclobber.getElementStyleSheet(styleTag).cssRules);\n  });\n  cssRules = goog.html.sanitizer.CssSanitizer.getOnlyStyleRules_(cssRules);\n  // Sort the rules by descending specificity.\n  cssRules.sort(function(a, b) {\n    var aSpecificity = goog.html.CssSpecificity.getSpecificity(a.selectorText);\n    var bSpecificity = goog.html.CssSpecificity.getSpecificity(b.selectorText);\n    return -goog.array.compare3(aSpecificity, bSpecificity);\n  });\n  // For each element, apply the matching rules to the element style attribute.\n  // If a property is already explicitly defined, do not update it. This\n  // guarantees that the rule with selectors with the highest priority (or the\n  // properties defined in the style attribute itself) have precedence over\n  // lower priority ones.\n  var subTreeWalker = document.createTreeWalker(\n      element, NodeFilter.SHOW_ELEMENT, null /* filter */,\n      false /* entityReferenceExpansion */);\n  var currentElement;\n  while (currentElement = /** @type {!Element} */ (subTreeWalker.nextNode())) {\n    goog.array.forEach(cssRules, function(rule) {\n      if (!goog.html.sanitizer.noclobber.elementMatches(\n              currentElement, rule.selectorText)) {\n        return;\n      }\n      if (!rule.style) {\n        return;\n      }\n      goog.html.sanitizer.CssSanitizer.mergeStyleDeclarations_(\n          currentElement, rule.style);\n    });\n  }\n  // Delete the STYLE tags.\n  goog.array.forEach(styleTags, goog.dom.removeNode);\n};\n\n\n/**\n * Merges style properties from `styleDeclaration` into\n * `element.style`.\n * @param {!Element} element\n * @param {!CSSStyleDeclaration} styleDeclaration\n * @private\n */\ngoog.html.sanitizer.CssSanitizer.mergeStyleDeclarations_ = function(\n    element, styleDeclaration) {\n  var existingPropNames =\n      goog.html.sanitizer.CssSanitizer.getCssPropNames_(element.style);\n  var newPropNames =\n      goog.html.sanitizer.CssSanitizer.getCssPropNames_(styleDeclaration);\n\n  goog.array.forEach(newPropNames, function(propName) {\n    if (existingPropNames.indexOf(propName) >= 0) {\n      // This was either a property set by the style attribute or a stylesheet\n      // rule with a higher priority. Leave the existing value.\n      return;\n    }\n    var propValue = goog.html.sanitizer.noclobber.getCssPropertyValue(\n        styleDeclaration, propName);\n    goog.html.sanitizer.noclobber.setCssProperty(\n        element.style, propName, propValue);\n  });\n};\n\n\n/**\n * Creates an DOM Document object that will not execute scripts or make\n * network requests while parsing HTML.\n * @return {!Document}\n * @private\n */\ngoog.html.sanitizer.CssSanitizer.createInertDocument_ = function() {\n  // Documents created using window.document.implementation.createHTMLDocument()\n  // use the same custom component registry as their parent document. This means\n  // that parsing arbitrary HTML can result in calls to user-defined JavaScript.\n  // This is worked around by creating a template element and its content's\n  // document. See https://github.com/cure53/DOMPurify/issues/47.\n  var doc = document;\n  if (typeof HTMLTemplateElement === 'function') {\n    doc =\n        goog.dom.createElement(goog.dom.TagName.TEMPLATE).content.ownerDocument;\n  }\n  return doc.implementation.createHTMLDocument('');\n};\n\n\n/**\n * Provides a cross-browser way to get a CSS property names.\n * @param {!CSSStyleDeclaration} cssStyle A CSS style object.\n * @return {!Array<string>} CSS property names.\n * @private\n */\ngoog.html.sanitizer.CssSanitizer.getCssPropNames_ = function(cssStyle) {\n  var propNames = [];\n  if (goog.isArrayLike(cssStyle)) {\n    // Gets property names via item().\n    // https://drafts.csswg.org/cssom/#dom-cssstyledeclaration-item\n    propNames = goog.array.toArray(cssStyle);\n  } else {\n    // In IE8 and other older browsers we have to iterate over all the property\n    // names. We skip cssText because it contains the unsanitized CSS, which\n    // defeats the purpose.\n    propNames = goog.object.getKeys(cssStyle);\n    goog.array.remove(propNames, 'cssText');\n  }\n  return propNames;\n};\n\n\n/**\n * Checks whether the property name specified should be disallowed.\n * @param {string} propName A property name.\n * @return {boolean} Whether the property name is disallowed.\n * @private\n */\ngoog.html.sanitizer.CssSanitizer.isDisallowedPropertyName_ = function(\n    propName) {\n  // getPropertyValue doesn't deal with custom variables properly and will NOT\n  // decode CSS escapes (but the browser will do so silently). Simply disallow\n  // custom variables (http://www.w3.org/TR/css-variables/#defining-variables).\n  return goog.string.startsWith(propName, '--') ||\n      goog.string.startsWith(propName, 'var');\n};\n","^17",1579837703000,"^18",["^19",["^1T","^2N","^2?","^2D","^Z","^2G","~$goog.html.uncheckedconversions","^2X","^;[","~$goog.html.CssSpecificity","^2H","^2@","^2[","~$goog.html.sanitizer.noclobber","^2A","^35","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/sanitizer/csssanitizer.js"],"^1J",["^19",["~$goog.html.sanitizer.CssSanitizer"]],"^X",true,"^Y",["^Z","^35","^1T","^1V","^2[","^<4","^2@","^2A","^2?","^2H","^<5","^<3","^2G","^2D","^;[","^2X","^2N"]],["^ ","^[",[1579837703000],"^10","goog.ui.editor.defaulttoolbar.js","^11",["^12","goog/ui/editor/defaulttoolbar.js"],"^13","goog/ui/editor/defaulttoolbar.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Factory functions for creating a default editing toolbar.\n *\n * @author attila@google.com (Attila Bodis)\n * @see ../../demos/editor/editor.html\n */\n\ngoog.provide('goog.ui.editor.ButtonDescriptor');\ngoog.provide('goog.ui.editor.DefaultToolbar');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.editor.Command');\ngoog.require('goog.style');\ngoog.require('goog.ui.editor.ToolbarFactory');\ngoog.require('goog.ui.editor.messages');\ngoog.require('goog.userAgent');\n\n// Font menu creation.\n\n\n/** @desc Font menu item caption for the default sans-serif font. */\ngoog.ui.editor.DefaultToolbar.MSG_FONT_NORMAL = goog.getMsg('Normal');\n\n\n/** @desc Font menu item caption for the default serif font. */\ngoog.ui.editor.DefaultToolbar.MSG_FONT_NORMAL_SERIF =\n    goog.getMsg('Normal / serif');\n\n\n/**\n * Common font descriptors for all locales.  Each descriptor has the following\n * attributes:\n * <ul>\n *   <li>`caption` - Caption to show in the font menu (e.g. 'Tahoma')\n *   <li>`value` - Value for the corresponding 'font-family' CSS style\n *       (e.g. 'Tahoma, Arial, sans-serif')\n * </ul>\n * @type {!Array<{caption:string, value:string}>}\n * @private\n */\ngoog.ui.editor.DefaultToolbar.FONTS_ = [\n  {\n    caption: goog.ui.editor.DefaultToolbar.MSG_FONT_NORMAL,\n    value: 'arial,sans-serif'\n  },\n  {\n    caption: goog.ui.editor.DefaultToolbar.MSG_FONT_NORMAL_SERIF,\n    value: 'times new roman,serif'\n  },\n  {caption: 'Courier New', value: 'courier new,monospace'},\n  {caption: 'Georgia', value: 'georgia,serif'},\n  {caption: 'Trebuchet', value: 'trebuchet ms,sans-serif'},\n  {caption: 'Verdana', value: 'verdana,sans-serif'}\n];\n\n\n/**\n * Locale-specific font descriptors.  The object is a map of locale strings to\n * arrays of font descriptors.\n * @type {!Object<!Array<{caption:string, value:string}>>}\n * @private\n */\ngoog.ui.editor.DefaultToolbar.I18N_FONTS_ = {\n  'ja': [\n    {\n      caption: '\\uff2d\\uff33 \\uff30\\u30b4\\u30b7\\u30c3\\u30af',\n      value: 'ms pgothic,sans-serif'\n    },\n    {caption: '\\uff2d\\uff33 \\uff30\\u660e\\u671d', value: 'ms pmincho,serif'}, {\n      caption: '\\uff2d\\uff33 \\u30b4\\u30b7\\u30c3\\u30af',\n      value: 'ms gothic,monospace'\n    }\n  ],\n  'ko': [\n    {caption: '\\uad74\\ub9bc', value: 'gulim,sans-serif'},\n    {caption: '\\ubc14\\ud0d5', value: 'batang,serif'},\n    {caption: '\\uad74\\ub9bc\\uccb4', value: 'gulimche,monospace'}\n  ],\n  'zh-tw': [\n    {caption: '\\u65b0\\u7d30\\u660e\\u9ad4', value: 'pmingliu,serif'},\n    {caption: '\\u7d30\\u660e\\u9ad4', value: 'mingliu,serif'}\n  ],\n  'zh-cn': [\n    {caption: '\\u5b8b\\u4f53', value: 'simsun,serif'},\n    {caption: '\\u9ed1\\u4f53', value: 'simhei,sans-serif'},\n    {caption: 'MS Song', value: 'ms song,monospace'}\n  ]\n};\n\n\n/**\n * Default locale for font names.\n * @type {string}\n * @private\n */\ngoog.ui.editor.DefaultToolbar.locale_ = 'en-us';\n\n\n/**\n * Sets the locale for the font names.  If not set, defaults to 'en-us'.\n * Used only for default creation of font names name.  Must be set\n * before font name menu is created.\n * @param {string} locale Locale to use for the toolbar font names.\n */\ngoog.ui.editor.DefaultToolbar.setLocale = function(locale) {\n  goog.ui.editor.DefaultToolbar.locale_ = locale;\n};\n\n\n/**\n * Initializes the given font menu button by adding default fonts to the menu.\n * If goog.ui.editor.DefaultToolbar.setLocale was called to specify a locale\n * for which locale-specific default fonts exist, those are added before\n * common fonts.\n * @param {!goog.ui.Select} button Font menu button.\n */\ngoog.ui.editor.DefaultToolbar.addDefaultFonts = function(button) {\n  // Normalize locale to lowercase, with a hyphen (see bug 1036165).\n  var locale =\n      goog.ui.editor.DefaultToolbar.locale_.replace(/_/, '-').toLowerCase();\n  // Add locale-specific default fonts, if any.\n  var fontlist = [];\n\n  if (locale in goog.ui.editor.DefaultToolbar.I18N_FONTS_) {\n    fontlist = goog.ui.editor.DefaultToolbar.I18N_FONTS_[locale];\n  }\n  if (fontlist.length) {\n    goog.ui.editor.ToolbarFactory.addFonts(button, fontlist);\n  }\n  // Add locale-independent default fonts.\n  goog.ui.editor.ToolbarFactory.addFonts(\n      button, goog.ui.editor.DefaultToolbar.FONTS_);\n};\n\n\n// Font size menu creation.\n\n\n/** @desc Font size menu item caption for the 'Small' size. */\ngoog.ui.editor.DefaultToolbar.MSG_FONT_SIZE_SMALL = goog.getMsg('Small');\n\n\n/** @desc Font size menu item caption for the 'Normal' size. */\ngoog.ui.editor.DefaultToolbar.MSG_FONT_SIZE_NORMAL = goog.getMsg('Normal');\n\n\n/** @desc Font size menu item caption for the 'Large' size. */\ngoog.ui.editor.DefaultToolbar.MSG_FONT_SIZE_LARGE = goog.getMsg('Large');\n\n\n/** @desc Font size menu item caption for the 'Huge' size. */\ngoog.ui.editor.DefaultToolbar.MSG_FONT_SIZE_HUGE = goog.getMsg('Huge');\n\n\n/**\n * Font size descriptors, each with the following attributes:\n * <ul>\n *   <li>`caption` - Caption to show in the font size menu (e.g. 'Huge')\n *   <li>`value` - Value for the corresponding HTML font size (e.g. 6)\n * </ul>\n * @type {!Array<{caption:string, value:number}>}\n * @private\n */\ngoog.ui.editor.DefaultToolbar.FONT_SIZES_ = [\n  {caption: goog.ui.editor.DefaultToolbar.MSG_FONT_SIZE_SMALL, value: 1},\n  {caption: goog.ui.editor.DefaultToolbar.MSG_FONT_SIZE_NORMAL, value: 2},\n  {caption: goog.ui.editor.DefaultToolbar.MSG_FONT_SIZE_LARGE, value: 4},\n  {caption: goog.ui.editor.DefaultToolbar.MSG_FONT_SIZE_HUGE, value: 6}\n];\n\n\n/**\n * Initializes the given font size menu button by adding default font sizes to\n * it.\n * @param {!goog.ui.Select} button Font size menu button.\n */\ngoog.ui.editor.DefaultToolbar.addDefaultFontSizes = function(button) {\n  goog.ui.editor.ToolbarFactory.addFontSizes(\n      button, goog.ui.editor.DefaultToolbar.FONT_SIZES_);\n};\n\n\n// Header format menu creation.\n\n\n/** @desc Caption for \"Heading\" block format option. */\ngoog.ui.editor.DefaultToolbar.MSG_FORMAT_HEADING = goog.getMsg('Heading');\n\n\n/** @desc Caption for \"Subheading\" block format option. */\ngoog.ui.editor.DefaultToolbar.MSG_FORMAT_SUBHEADING = goog.getMsg('Subheading');\n\n\n/** @desc Caption for \"Minor heading\" block format option. */\ngoog.ui.editor.DefaultToolbar.MSG_FORMAT_MINOR_HEADING =\n    goog.getMsg('Minor heading');\n\n\n/** @desc Caption for \"Normal\" block format option. */\ngoog.ui.editor.DefaultToolbar.MSG_FORMAT_NORMAL = goog.getMsg('Normal');\n\n\n/**\n * Format option descriptors, each with the following attributes:\n * <ul>\n *   <li>`caption` - Caption to show in the menu (e.g. 'Minor heading')\n *   <li>`command` - Corresponding {@link goog.dom.TagName} (e.g.\n *       'H4')\n * </ul>\n * @type {!Array<{caption: string, command: !goog.dom.TagName}>}\n * @private\n */\ngoog.ui.editor.DefaultToolbar.FORMAT_OPTIONS_ = [\n  {\n    caption: goog.ui.editor.DefaultToolbar.MSG_FORMAT_HEADING,\n    command: goog.dom.TagName.H2\n  },\n  {\n    caption: goog.ui.editor.DefaultToolbar.MSG_FORMAT_SUBHEADING,\n    command: goog.dom.TagName.H3\n  },\n  {\n    caption: goog.ui.editor.DefaultToolbar.MSG_FORMAT_MINOR_HEADING,\n    command: goog.dom.TagName.H4\n  },\n  {\n    caption: goog.ui.editor.DefaultToolbar.MSG_FORMAT_NORMAL,\n    command: goog.dom.TagName.P\n  }\n];\n\n\n/**\n * Initializes the given \"Format block\" menu button by adding default format\n * options to the menu.\n * @param {!goog.ui.Select} button \"Format block\" menu button.\n */\ngoog.ui.editor.DefaultToolbar.addDefaultFormatOptions = function(button) {\n  goog.ui.editor.ToolbarFactory.addFormatOptions(\n      button, goog.ui.editor.DefaultToolbar.FORMAT_OPTIONS_);\n};\n\n\n/**\n * Creates a {@link goog.ui.Toolbar} containing a default set of editor\n * toolbar buttons, and renders it into the given parent element.\n * @param {!Element} elem Toolbar parent element.\n * @param {boolean=} opt_isRightToLeft Whether the editor chrome is\n *     right-to-left; defaults to the directionality of the toolbar parent\n *     element.\n * @return {!goog.ui.Toolbar} Default editor toolbar, rendered into the given\n *     parent element.\n * @see goog.ui.editor.DefaultToolbar.DEFAULT_BUTTONS\n */\ngoog.ui.editor.DefaultToolbar.makeDefaultToolbar = function(\n    elem, opt_isRightToLeft) {\n  var isRightToLeft = opt_isRightToLeft || goog.style.isRightToLeft(elem);\n  var buttons = isRightToLeft ?\n      goog.ui.editor.DefaultToolbar.DEFAULT_BUTTONS_RTL :\n      goog.ui.editor.DefaultToolbar.DEFAULT_BUTTONS;\n  return goog.ui.editor.DefaultToolbar.makeToolbar(\n      buttons, elem, opt_isRightToLeft);\n};\n\n\n/**\n * Creates a {@link goog.ui.Toolbar} containing the specified set of\n * toolbar buttons, and renders it into the given parent element.  Each\n * item in the `items` array must either be a\n * {@link goog.editor.Command} (to create a built-in button) or a subclass\n * of {@link goog.ui.Control} (to create a custom control).\n * @param {!Array<string|goog.ui.Control>} items Toolbar items; each must\n *     be a {@link goog.editor.Command} or a {@link goog.ui.Control}.\n * @param {!Element} elem Toolbar parent element.\n * @param {boolean=} opt_isRightToLeft Whether the editor chrome is\n *     right-to-left; defaults to the directionality of the toolbar parent\n *     element.\n * @return {!goog.ui.Toolbar} Editor toolbar, rendered into the given parent\n *     element.\n */\ngoog.ui.editor.DefaultToolbar.makeToolbar = function(\n    items, elem, opt_isRightToLeft) {\n  var domHelper = goog.dom.getDomHelper(elem);\n  var controls = [];\n\n  for (var i = 0, button; button = items[i]; i++) {\n    if (typeof button === 'string') {\n      button = goog.ui.editor.DefaultToolbar.makeBuiltInToolbarButton(\n          button, domHelper);\n    }\n    if (button) {\n      controls.push(button);\n    }\n  }\n\n  return goog.ui.editor.ToolbarFactory.makeToolbar(\n      controls, elem, opt_isRightToLeft);\n};\n\n\n/**\n * Creates an instance of a subclass of {@link goog.ui.Button} for the given\n * {@link goog.editor.Command}, or null if no built-in button exists for the\n * command.  Note that this function is only intended to create built-in\n * buttons; please don't try to hack it!\n * @param {string} command Editor command ID.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for DOM\n *     creation; defaults to the current document if unspecified.\n * @return {goog.ui.Button} Toolbar button (null if no built-in button exists\n *     for the command).\n */\ngoog.ui.editor.DefaultToolbar.makeBuiltInToolbarButton = function(\n    command, opt_domHelper) {\n  var button = null;\n  var descriptor = goog.ui.editor.DefaultToolbar.buttons_[command];\n  if (descriptor) {\n    // Default the factory method to makeToggleButton, since most built-in\n    // toolbar buttons are toggle buttons. See also\n    // goog.ui.editor.DefaultToolbar.button_list_.\n    /** @type {!Function} */\n    var factory =\n        descriptor.factory || goog.ui.editor.ToolbarFactory.makeToggleButton;\n    var id = descriptor.command;\n    var tooltip = descriptor.tooltip;\n    var caption = descriptor.caption;\n    var classNames = descriptor.classes;\n    // Default the DOM helper to the one for the current document.\n    var domHelper = opt_domHelper || goog.dom.getDomHelper();\n    // Instantiate the button based on the descriptor.\n    button = factory(id, tooltip, caption, classNames, null, domHelper);\n    // If this button's state should be queried when updating the toolbar,\n    // set the button object's queryable property to true.\n    if (descriptor.queryable) {\n      button.queryable = true;\n    }\n  }\n  return button;\n};\n\n\n/**\n * A set of built-in buttons to display in the default editor toolbar.\n * @type {!Array<string>}\n */\ngoog.ui.editor.DefaultToolbar.DEFAULT_BUTTONS = [\n  goog.editor.Command.IMAGE, goog.editor.Command.LINK, goog.editor.Command.BOLD,\n  goog.editor.Command.ITALIC, goog.editor.Command.UNORDERED_LIST,\n  goog.editor.Command.FONT_COLOR, goog.editor.Command.FONT_FACE,\n  goog.editor.Command.FONT_SIZE, goog.editor.Command.JUSTIFY_LEFT,\n  goog.editor.Command.JUSTIFY_CENTER, goog.editor.Command.JUSTIFY_RIGHT,\n  goog.editor.Command.EDIT_HTML\n];\n\n\n/**\n * A set of built-in buttons to display in the default editor toolbar when\n * the editor chrome is right-to-left (BiDi mode only).\n * @type {!Array<string>}\n */\ngoog.ui.editor.DefaultToolbar.DEFAULT_BUTTONS_RTL = [\n  goog.editor.Command.IMAGE, goog.editor.Command.LINK, goog.editor.Command.BOLD,\n  goog.editor.Command.ITALIC, goog.editor.Command.UNORDERED_LIST,\n  goog.editor.Command.FONT_COLOR, goog.editor.Command.FONT_FACE,\n  goog.editor.Command.FONT_SIZE, goog.editor.Command.JUSTIFY_RIGHT,\n  goog.editor.Command.JUSTIFY_CENTER, goog.editor.Command.JUSTIFY_LEFT,\n  goog.editor.Command.DIR_RTL, goog.editor.Command.DIR_LTR,\n  goog.editor.Command.EDIT_HTML\n];\n\n\n/**\n * Creates a toolbar button with the given ID, tooltip, and caption.  Applies\n * any custom CSS class names to the button's caption element.  This button\n * is designed to be used as the RTL button.\n * @param {string} id Button ID; must equal a {@link goog.editor.Command} for\n *     built-in buttons, anything else for custom buttons.\n * @param {string} tooltip Tooltip to be shown on hover.\n * @param {goog.ui.ControlContent} caption Button caption.\n * @param {string=} opt_classNames CSS class name(s) to apply to the caption\n *     element.\n * @param {goog.ui.ButtonRenderer=} opt_renderer Button renderer; defaults to\n *     {@link goog.ui.ToolbarButtonRenderer} if unspecified.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for DOM\n *     creation; defaults to the current document if unspecified.\n * @return {!goog.ui.Button} A toolbar button.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.editor.DefaultToolbar.rtlButtonFactory_ = function(\n    id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper) {\n  var button = goog.ui.editor.ToolbarFactory.makeToggleButton(\n      id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper);\n  button.updateFromValue = function(value) {\n    // Enable/disable right-to-left text editing mode in the toolbar.\n    var isRtl = !!value;\n    // Enable/disable a marker class on the toolbar's root element; the rest is\n    // done using CSS scoping in editortoolbar.css.  This changes\n    // direction-senitive toolbar icons (like indent/outdent)\n    goog.dom.classlist.enable(\n        goog.asserts.assert(button.getParent().getElement()),\n        goog.getCssName('tr-rtl-mode'), isRtl);\n    button.setChecked(isRtl);\n  };\n  return button;\n};\n\n\n/**\n * Creates a toolbar button with the given ID, tooltip, and caption.  Applies\n * any custom CSS class names to the button's caption element.  Designed to\n * be used to create undo and redo buttons.\n * @param {string} id Button ID; must equal a {@link goog.editor.Command} for\n *     built-in buttons, anything else for custom buttons.\n * @param {string} tooltip Tooltip to be shown on hover.\n * @param {goog.ui.ControlContent} caption Button caption.\n * @param {string=} opt_classNames CSS class name(s) to apply to the caption\n *     element.\n * @param {goog.ui.ButtonRenderer=} opt_renderer Button renderer; defaults to\n *     {@link goog.ui.ToolbarButtonRenderer} if unspecified.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for DOM\n *     creation; defaults to the current document if unspecified.\n * @return {!goog.ui.Button} A toolbar button.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.editor.DefaultToolbar.undoRedoButtonFactory_ = function(\n    id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper) {\n  var button = goog.ui.editor.ToolbarFactory.makeButton(\n      id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper);\n  button.updateFromValue = function(value) {\n    button.setEnabled(value);\n  };\n  return button;\n};\n\n\n/**\n * Creates a toolbar button with the given ID, tooltip, and caption.  Applies\n * any custom CSS class names to the button's caption element.  Used to create\n * a font face button, filled with default fonts.\n * @param {string} id Button ID; must equal a {@link goog.editor.Command} for\n *     built-in buttons, anything else for custom buttons.\n * @param {string} tooltip Tooltip to be shown on hover.\n * @param {goog.ui.ControlContent} caption Button caption.\n * @param {string=} opt_classNames CSS class name(s) to apply to the caption\n *     element.\n * @param {goog.ui.MenuButtonRenderer=} opt_renderer Button renderer; defaults\n *     to {@link goog.ui.ToolbarMenuButtonRenderer} if unspecified.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for DOM\n *     creation; defaults to the current document if unspecified.\n * @return {!goog.ui.Button} A toolbar button.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.editor.DefaultToolbar.fontFaceFactory_ = function(\n    id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper) {\n  var button = goog.ui.editor.ToolbarFactory.makeSelectButton(\n      id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper);\n  goog.ui.editor.DefaultToolbar.addDefaultFonts(button);\n  button.setDefaultCaption(goog.ui.editor.DefaultToolbar.MSG_FONT_NORMAL);\n  // Font options don't have keyboard accelerators.\n  goog.dom.classlist.add(\n      goog.asserts.assert(button.getMenu().getContentElement()),\n      goog.getCssName('goog-menu-noaccel'));\n\n  // How to update this button's state.\n  button.updateFromValue = function(value) {\n    // Normalize value to null or a non-empty string (sometimes we get\n    // the empty string, sometimes we get false...), extract the substring\n    // up to the first comma to get the primary font name, and normalize\n    // to lowercase.  This allows us to map a font spec like \"Arial,\n    // Helvetica, sans-serif\" to a font menu item.\n    // TODO (attila): Try to make this more robust.\n    var item = null;\n    if (value && value.length > 0) {\n      item = /** @type {goog.ui.MenuItem} */ (button.getMenu().getChild(\n          goog.ui.editor.ToolbarFactory.getPrimaryFont(value)));\n    }\n    var selectedItem = button.getSelectedItem();\n    if (item != selectedItem) {\n      button.setSelectedItem(item);\n    }\n  };\n  return button;\n};\n\n\n/**\n * Creates a toolbar button with the given ID, tooltip, and caption.  Applies\n * any custom CSS class names to the button's caption element. Use to create a\n * font size button, filled with default font sizes.\n * @param {string} id Button ID; must equal a {@link goog.editor.Command} for\n *     built-in buttons, anything else for custom buttons.\n * @param {string} tooltip Tooltip to be shown on hover.\n * @param {goog.ui.ControlContent} caption Button caption.\n * @param {string=} opt_classNames CSS class name(s) to apply to the caption\n *     element.\n * @param {goog.ui.MenuButtonRenderer=} opt_renderer Button renderer; defaults\n *     to {@link goog.ui.ToolbarMebuButtonRenderer} if unspecified.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for DOM\n *     creation; defaults to the current document if unspecified.\n * @return {!goog.ui.Button} A toolbar button.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.editor.DefaultToolbar.fontSizeFactory_ = function(\n    id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper) {\n  var button = goog.ui.editor.ToolbarFactory.makeSelectButton(\n      id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper);\n  goog.ui.editor.DefaultToolbar.addDefaultFontSizes(button);\n  button.setDefaultCaption(goog.ui.editor.DefaultToolbar.MSG_FONT_SIZE_NORMAL);\n  // Font size options don't have keyboard accelerators.\n  goog.dom.classlist.add(\n      goog.asserts.assert(button.getMenu().getContentElement()),\n      goog.getCssName('goog-menu-noaccel'));\n  // How to update this button's state.\n  button.updateFromValue = function(value) {\n    // Webkit pre-534.7 returns a string like '32px' instead of the equivalent\n    // integer, so normalize that first.\n    // NOTE(user): Gecko returns \"6\" so can't just normalize all\n    // strings, only ones ending in \"px\".\n    if (typeof value === 'string' && goog.style.getLengthUnits(value) == 'px') {\n      value = goog.ui.editor.ToolbarFactory.getLegacySizeFromPx(\n          parseInt(value, 10));\n    }\n    // Normalize value to null or a positive integer (sometimes we get\n    // the empty string, sometimes we get false, or -1 if the above\n    // normalization didn't match to a particular 0-7 size)\n    value = value > 0 ? value : null;\n    if (value != button.getValue()) {\n      button.setValue(value);\n    }\n  };\n  return button;\n};\n\n\n/**\n * Function to update the state of a color menu button.\n * @param {goog.ui.ToolbarColorMenuButton} button The button to which the\n *     color menu is attached.\n * @param {number} color Color value to update to.\n * @private\n */\ngoog.ui.editor.DefaultToolbar.colorUpdateFromValue_ = function(button, color) {\n  var value = color;\n\n  try {\n    if (goog.userAgent.IE) {\n      // IE returns a number that, converted to hex, is a BGR color.\n      // Convert from decimal to BGR to RGB.\n      var hex = '000000' + value.toString(16);\n      var bgr = hex.substr(hex.length - 6, 6);\n      value =\n          '#' + bgr.substring(4, 6) + bgr.substring(2, 4) + bgr.substring(0, 2);\n    }\n    if (value != button.getValue()) {\n      button.setValue(/** @type {string} */ (value));\n    }\n  } catch (ex) {\n    // TODO(attila): Find out when/why this happens.\n  }\n};\n\n\n/**\n * Creates a toolbar button with the given ID, tooltip, and caption.  Applies\n * any custom CSS class names to the button's caption element. Use to create\n * a font color button.\n * @param {string} id Button ID; must equal a {@link goog.editor.Command} for\n *     built-in buttons, anything else for custom buttons.\n * @param {string} tooltip Tooltip to be shown on hover.\n * @param {goog.ui.ControlContent} caption Button caption.\n * @param {string=} opt_classNames CSS class name(s) to apply to the caption\n *     element.\n * @param {goog.ui.ColorMenuButtonRenderer=} opt_renderer Button renderer;\n *     defaults to {@link goog.ui.ToolbarColorMenuButtonRenderer} if\n *     unspecified.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for DOM\n *     creation; defaults to the current document if unspecified.\n * @return {!goog.ui.Button} A toolbar button.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.editor.DefaultToolbar.fontColorFactory_ = function(\n    id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper) {\n  var button = goog.ui.editor.ToolbarFactory.makeColorMenuButton(\n      id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper);\n  // Initialize default foreground color.\n  button.setSelectedColor('#000');\n  button.updateFromValue = goog.partial(\n      goog.ui.editor.DefaultToolbar.colorUpdateFromValue_,\n      /** @type {!goog.ui.ToolbarColorMenuButton} */ (button));\n  return button;\n};\n\n\n/**\n * Creates a toolbar button with the given ID, tooltip, and caption.  Applies\n * any custom CSS class names to the button's caption element. Use to create\n * a font background color button.\n * @param {string} id Button ID; must equal a {@link goog.editor.Command} for\n *     built-in buttons, anything else for custom buttons.\n * @param {string} tooltip Tooltip to be shown on hover.\n * @param {goog.ui.ControlContent} caption Button caption.\n * @param {string=} opt_classNames CSS class name(s) to apply to the caption\n *     element.\n * @param {goog.ui.ColorMenuButtonRenderer=} opt_renderer Button renderer;\n *     defaults to {@link goog.ui.ToolbarColorMenuButtonRenderer} if\n *     unspecified.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for DOM\n *     creation; defaults to the current document if unspecified.\n * @return {!goog.ui.Button} A toolbar button.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.editor.DefaultToolbar.backgroundColorFactory_ = function(\n    id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper) {\n  var button = goog.ui.editor.ToolbarFactory.makeColorMenuButton(\n      id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper);\n  // Initialize default background color.\n  button.setSelectedColor('#FFF');\n  button.updateFromValue = goog.partial(\n      goog.ui.editor.DefaultToolbar.colorUpdateFromValue_,\n      /** @type {!goog.ui.ToolbarColorMenuButton} */ (button));\n  return button;\n};\n\n\n/**\n * Creates a toolbar button with the given ID, tooltip, and caption.  Applies\n * any custom CSS class names to the button's caption element. Use to create\n * the format menu, prefilled with default formats.\n * @param {string} id Button ID; must equal a {@link goog.editor.Command} for\n *     built-in buttons, anything else for custom buttons.\n * @param {string} tooltip Tooltip to be shown on hover.\n * @param {goog.ui.ControlContent} caption Button caption.\n * @param {string=} opt_classNames CSS class name(s) to apply to the caption\n *     element.\n * @param {goog.ui.MenuButtonRenderer=} opt_renderer Button renderer;\n *     defaults to\n *     {@link goog.ui.ToolbarMenuButtonRenderer} if unspecified.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for DOM\n *     creation; defaults to the current document if unspecified.\n * @return {!goog.ui.Button} A toolbar button.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.editor.DefaultToolbar.formatBlockFactory_ = function(\n    id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper) {\n  var button = goog.ui.editor.ToolbarFactory.makeSelectButton(\n      id, tooltip, caption, opt_classNames, opt_renderer, opt_domHelper);\n  goog.ui.editor.DefaultToolbar.addDefaultFormatOptions(button);\n  button.setDefaultCaption(goog.ui.editor.DefaultToolbar.MSG_FORMAT_NORMAL);\n  // Format options don't have keyboard accelerators.\n  goog.dom.classlist.add(\n      goog.asserts.assert(button.getMenu().getContentElement()),\n      goog.getCssName('goog-menu-noaccel'));\n  // How to update this button.\n  button.updateFromValue = function(value) {\n    // Normalize value to null or a nonempty string (sometimes we get\n    // the empty string, sometimes we get false...)\n    value = value && value.length > 0 ? value : null;\n    if (value != button.getValue()) {\n      button.setValue(value);\n    }\n  };\n  return button;\n};\n\n\n// Messages used for tooltips and captions.\n\n\n/** @desc Format menu tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_FORMAT_BLOCK_TITLE = goog.getMsg('Format');\n\n\n/** @desc Format menu caption. */\ngoog.ui.editor.DefaultToolbar.MSG_FORMAT_BLOCK_CAPTION = goog.getMsg('Format');\n\n\n/** @desc Undo button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_UNDO_TITLE = goog.getMsg('Undo');\n\n\n/** @desc Redo button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_REDO_TITLE = goog.getMsg('Redo');\n\n\n/** @desc Font menu tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_FONT_FACE_TITLE = goog.getMsg('Font');\n\n\n/** @desc Font size menu tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_FONT_SIZE_TITLE = goog.getMsg('Font size');\n\n\n/** @desc Text foreground color menu tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_FONT_COLOR_TITLE = goog.getMsg('Text color');\n\n\n/** @desc Bold button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_BOLD_TITLE = goog.getMsg('Bold');\n\n\n/** @desc Italic button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_ITALIC_TITLE = goog.getMsg('Italic');\n\n\n/** @desc Underline button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_UNDERLINE_TITLE = goog.getMsg('Underline');\n\n\n/** @desc Text background color menu tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_BACKGROUND_COLOR_TITLE =\n    goog.getMsg('Text background color');\n\n\n/** @desc Link button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_LINK_TITLE =\n    goog.getMsg('Add or remove link');\n\n\n/** @desc Numbered list button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_ORDERED_LIST_TITLE =\n    goog.getMsg('Numbered list');\n\n\n/** @desc Bullet list button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_UNORDERED_LIST_TITLE =\n    goog.getMsg('Bullet list');\n\n\n/** @desc Outdent button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_OUTDENT_TITLE =\n    goog.getMsg('Decrease indent');\n\n\n/** @desc Indent button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_INDENT_TITLE = goog.getMsg('Increase indent');\n\n\n/** @desc Align left button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_ALIGN_LEFT_TITLE = goog.getMsg('Align left');\n\n\n/** @desc Align center button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_ALIGN_CENTER_TITLE =\n    goog.getMsg('Align center');\n\n\n/** @desc Align right button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_ALIGN_RIGHT_TITLE =\n    goog.getMsg('Align right');\n\n\n/** @desc Justify button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_JUSTIFY_TITLE = goog.getMsg('Justify');\n\n\n/** @desc Remove formatting button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_REMOVE_FORMAT_TITLE =\n    goog.getMsg('Remove formatting');\n\n\n/** @desc Insert image button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_IMAGE_TITLE = goog.getMsg('Insert image');\n\n\n/** @desc Strike through button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_STRIKE_THROUGH_TITLE =\n    goog.getMsg('Strikethrough');\n\n\n/** @desc Left-to-right button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_DIR_LTR_TITLE = goog.getMsg('Left-to-right');\n\n\n/** @desc Right-to-left button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_DIR_RTL_TITLE = goog.getMsg('Right-to-left');\n\n\n/** @desc Blockquote button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_BLOCKQUOTE_TITLE = goog.getMsg('Quote');\n\n\n/** @desc Edit HTML button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_EDIT_HTML_TITLE =\n    goog.getMsg('Edit HTML source');\n\n\n/** @desc Subscript button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_SUBSCRIPT = goog.getMsg('Subscript');\n\n\n/** @desc Superscript button tooltip. */\ngoog.ui.editor.DefaultToolbar.MSG_SUPERSCRIPT = goog.getMsg('Superscript');\n\n\n/** @desc Edit HTML button caption. */\ngoog.ui.editor.DefaultToolbar.MSG_EDIT_HTML_CAPTION = goog.getMsg('Edit HTML');\n\n\n/**\n * Map of `goog.editor.Command`s to toolbar button descriptor objects,\n * each of which has the following attributes:\n * <ul>\n *   <li>`command` - The command corresponding to the\n *       button (mandatory)\n *   <li>`tooltip` - Tooltip text (optional); if unspecified, the button\n *       has no hover text\n *   <li>`caption` - Caption to display on the button (optional); if\n *       unspecified, the button has no text caption\n *   <li>`classes` - CSS class name(s) to be applied to the button's\n *       element when rendered (optional); if unspecified, defaults to\n *       'tr-icon'\n *       plus 'tr-' followed by the command ID, but without any leading '+'\n *       character (e.g. if the command ID is '+undo', then `classes`\n *       defaults to 'tr-icon tr-undo')\n *   <li>`factory` - factory function used to create the button, which\n *       must accept `id`, `tooltip`, `caption`, and\n *       `classes` as arguments, and must return an instance of\n *       {@link goog.ui.Button} or an appropriate subclass (optional); if\n *       unspecified, defaults to\n *       {@link goog.ui.editor.DefaultToolbar.makeToggleButton},\n *       since most built-in toolbar buttons are toggle buttons\n *   <li>(@code queryable} - Whether the button's state should be queried\n *       when updating the toolbar (optional).\n * </ul>\n * Note that this object is only used for creating toolbar buttons for\n * built-in editor commands; custom buttons aren't listed here.  Please don't\n * try to hack this!\n * @private {!Object<string, !goog.ui.editor.ButtonDescriptor>}.\n */\ngoog.ui.editor.DefaultToolbar.buttons_ = {};\n\n\n/**\n * @typedef {{\n *   command: string,\n *   tooltip: (undefined|string),\n *   caption: (undefined|goog.ui.ControlContent),\n *   classes: (undefined|string),\n *   factory: (undefined|!Function),\n *   queryable:(undefined|boolean)}}\n */\ngoog.ui.editor.ButtonDescriptor;\n\n\n/**\n * Built-in toolbar button descriptors.  See\n * {@link goog.ui.editor.DefaultToolbar.buttons_} for details on button\n * descriptor objects.  This array is processed at JS parse time; each item is\n * inserted into {@link goog.ui.editor.DefaultToolbar.buttons_}, and the array\n * itself is deleted and (hopefully) garbage-collected.\n * @private {Array<!goog.ui.editor.ButtonDescriptor>}\n */\ngoog.ui.editor.DefaultToolbar.button_list_ = [\n  {\n    command: goog.editor.Command.UNDO,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_UNDO_TITLE,\n    classes: goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-undo'),\n    factory: goog.ui.editor.DefaultToolbar.undoRedoButtonFactory_,\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.REDO,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_REDO_TITLE,\n    classes: goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-redo'),\n    factory: goog.ui.editor.DefaultToolbar.undoRedoButtonFactory_,\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.FONT_FACE,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_FONT_FACE_TITLE,\n    classes: goog.getCssName('tr-fontName'),\n    factory: goog.ui.editor.DefaultToolbar.fontFaceFactory_,\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.FONT_SIZE,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_FONT_SIZE_TITLE,\n    classes: goog.getCssName('tr-fontSize'),\n    factory: goog.ui.editor.DefaultToolbar.fontSizeFactory_,\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.BOLD,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_BOLD_TITLE,\n    classes: goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-bold'),\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.ITALIC,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_ITALIC_TITLE,\n    classes: goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-italic'),\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.UNDERLINE,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_UNDERLINE_TITLE,\n    classes: goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-underline'),\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.FONT_COLOR,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_FONT_COLOR_TITLE,\n    classes: goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-foreColor'),\n    factory: goog.ui.editor.DefaultToolbar.fontColorFactory_,\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.BACKGROUND_COLOR,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_BACKGROUND_COLOR_TITLE,\n    classes: goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-backColor'),\n    factory: goog.ui.editor.DefaultToolbar.backgroundColorFactory_,\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.LINK,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_LINK_TITLE,\n    caption: goog.ui.editor.messages.MSG_LINK_CAPTION,\n    classes: goog.getCssName('tr-link'),\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.ORDERED_LIST,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_ORDERED_LIST_TITLE,\n    classes: goog.getCssName('tr-icon') + ' ' +\n        goog.getCssName('tr-insertOrderedList'),\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.UNORDERED_LIST,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_UNORDERED_LIST_TITLE,\n    classes: goog.getCssName('tr-icon') + ' ' +\n        goog.getCssName('tr-insertUnorderedList'),\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.OUTDENT,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_OUTDENT_TITLE,\n    classes: goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-outdent'),\n    factory: goog.ui.editor.ToolbarFactory.makeButton\n  },\n  {\n    command: goog.editor.Command.INDENT,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_INDENT_TITLE,\n    classes: goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-indent'),\n    factory: goog.ui.editor.ToolbarFactory.makeButton\n  },\n  {\n    command: goog.editor.Command.JUSTIFY_LEFT,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_ALIGN_LEFT_TITLE,\n    classes:\n        goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-justifyLeft'),\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.JUSTIFY_CENTER,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_ALIGN_CENTER_TITLE,\n    classes:\n        goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-justifyCenter'),\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.JUSTIFY_RIGHT,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_ALIGN_RIGHT_TITLE,\n    classes:\n        goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-justifyRight'),\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.JUSTIFY_FULL,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_JUSTIFY_TITLE,\n    classes:\n        goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-justifyFull'),\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.REMOVE_FORMAT,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_REMOVE_FORMAT_TITLE,\n    classes:\n        goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-removeFormat'),\n    factory: goog.ui.editor.ToolbarFactory.makeButton\n  },\n  {\n    command: goog.editor.Command.IMAGE,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_IMAGE_TITLE,\n    classes: goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-image'),\n    factory: goog.ui.editor.ToolbarFactory.makeButton\n  },\n  {\n    command: goog.editor.Command.STRIKE_THROUGH,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_STRIKE_THROUGH_TITLE,\n    classes:\n        goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-strikeThrough'),\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.SUBSCRIPT,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_SUBSCRIPT,\n    classes: goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-subscript'),\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.SUPERSCRIPT,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_SUPERSCRIPT,\n    classes:\n        goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-superscript'),\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.DIR_LTR,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_DIR_LTR_TITLE,\n    classes: goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-ltr'),\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.DIR_RTL,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_DIR_RTL_TITLE,\n    classes: goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-rtl'),\n    factory: goog.ui.editor.DefaultToolbar.rtlButtonFactory_,\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.BLOCKQUOTE,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_BLOCKQUOTE_TITLE,\n    classes:\n        goog.getCssName('tr-icon') + ' ' + goog.getCssName('tr-BLOCKQUOTE'),\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.FORMAT_BLOCK,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_FORMAT_BLOCK_TITLE,\n    caption: goog.ui.editor.DefaultToolbar.MSG_FORMAT_BLOCK_CAPTION,\n    classes: goog.getCssName('tr-formatBlock'),\n    factory: goog.ui.editor.DefaultToolbar.formatBlockFactory_,\n    queryable: true\n  },\n  {\n    command: goog.editor.Command.EDIT_HTML,\n    tooltip: goog.ui.editor.DefaultToolbar.MSG_EDIT_HTML_TITLE,\n    caption: goog.ui.editor.DefaultToolbar.MSG_EDIT_HTML_CAPTION,\n    classes: goog.getCssName('tr-editHtml'),\n    factory: goog.ui.editor.ToolbarFactory.makeButton\n  }\n];\n\n\n(function() {\n// Create the goog.ui.editor.DefaultToolbar.buttons_ map from\n// goog.ui.editor.DefaultToolbar.button_list_.\nfor (var i = 0, button; button = goog.ui.editor.DefaultToolbar.button_list_[i];\n     i++) {\n  goog.ui.editor.DefaultToolbar.buttons_[button.command] = button;\n}\n\n// goog.ui.editor.DefaultToolbar.button_list_ is no longer needed\n// once the map is ready.\ngoog.ui.editor.DefaultToolbar.button_list_ = null;\n})();\n","^17",1579837703000,"^18",["^19",["^1S","^1T","^2O","^2R","^Z","^2X","~$goog.ui.editor.messages","~$goog.ui.editor.ToolbarFactory","^29","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/editor/defaulttoolbar.js"],"^1J",["^19",["~$goog.ui.editor.DefaultToolbar","~$goog.ui.editor.ButtonDescriptor"]],"^X",true,"^Y",["^Z","^1S","^1T","^1V","^2O","^2R","^29","^<8","^<7","^2X"]],["^ ","^[",[1579837703000],"^10","goog.ui.emoji.emojipaletterenderer.js","^11",["^12","goog/ui/emoji/emojipaletterenderer.js"],"^13","goog/ui/emoji/emojipaletterenderer.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Emoji Palette renderer implementation.\n * @suppress {checkPrototypalTypes}\n *\n */\n\ngoog.provide('goog.ui.emoji.EmojiPaletteRenderer');\n\ngoog.forwardDeclare('goog.ui.Palette');\ngoog.forwardDeclare('goog.ui.emoji.SpriteInfo');\ngoog.require('goog.a11y.aria');\ngoog.require('goog.asserts');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.style');\ngoog.require('goog.ui.PaletteRenderer');\ngoog.require('goog.ui.emoji.Emoji');\n\n\n\n/**\n * Renders an emoji palette.\n *\n * @param {?string} defaultImgUrl Url of the img that should be used to fill up\n *     the cells in the emoji table, to prevent jittering. Will be stretched\n *     to the emoji cell size. A good image is a transparent dot.\n * @constructor\n * @extends {goog.ui.PaletteRenderer}\n */\ngoog.ui.emoji.EmojiPaletteRenderer = function(defaultImgUrl) {\n  goog.ui.PaletteRenderer.call(this);\n\n  this.defaultImgUrl_ = defaultImgUrl;\n};\ngoog.inherits(goog.ui.emoji.EmojiPaletteRenderer, goog.ui.PaletteRenderer);\n\n\n/**\n * Globally unique ID sequence for cells rendered by this renderer class.\n * @type {number}\n * @private\n */\ngoog.ui.emoji.EmojiPaletteRenderer.cellId_ = 0;\n\n\n/**\n * Url of the img that should be used for cells in the emoji palette that are\n * not filled with emoji, i.e., after all the emoji have already been placed\n * on a page.\n *\n * @type {?string}\n * @private\n */\ngoog.ui.emoji.EmojiPaletteRenderer.prototype.defaultImgUrl_ = null;\n\n\n/** @override */\ngoog.ui.emoji.EmojiPaletteRenderer.getCssClass = function() {\n  return goog.getCssName('goog-ui-emojipalette');\n};\n\n\n/**\n * Creates a palette item from the given emoji data.\n *\n * @param {goog.dom.DomHelper} dom DOM helper for constructing DOM elements.\n * @param {string} id Goomoji id for the emoji.\n * @param {goog.ui.emoji.SpriteInfo} spriteInfo Spriting info for the emoji.\n * @param {string} displayUrl URL of the image served for this cell, whether\n *     an individual emoji image or a sprite.\n * @return {!HTMLDivElement} The palette item for this emoji.\n */\ngoog.ui.emoji.EmojiPaletteRenderer.prototype.createPaletteItem = function(\n    dom, id, spriteInfo, displayUrl) {\n  var el;\n\n  if (spriteInfo) {\n    var cssClass = spriteInfo.getCssClass();\n    if (cssClass) {\n      el = dom.createDom(goog.dom.TagName.DIV, cssClass);\n    } else {\n      el = this.buildElementFromSpriteMetadata(dom, spriteInfo, displayUrl);\n    }\n  } else {\n    el = dom.createDom(goog.dom.TagName.IMG, {'src': displayUrl});\n  }\n\n  var outerdiv = dom.createDom(\n      goog.dom.TagName.DIV, goog.getCssName('goog-palette-cell-wrapper'), el);\n  outerdiv.setAttribute(goog.ui.emoji.Emoji.ATTRIBUTE, id);\n  outerdiv.setAttribute(goog.ui.emoji.Emoji.DATA_ATTRIBUTE, id);\n  return /** @type {!HTMLDivElement} */ (outerdiv);\n};\n\n\n/**\n * Modifies a palette item containing an animated emoji, in response to the\n * animated emoji being successfully downloaded.\n *\n * @param {Element} item The palette item to update.\n * @param {Image} animatedImg An Image object containing the animated emoji.\n */\ngoog.ui.emoji.EmojiPaletteRenderer.prototype.updateAnimatedPaletteItem =\n    function(item, animatedImg) {\n  // An animated emoji is one that had sprite info for a static version and is\n  // now being updated. See createPaletteItem for the structure of the palette\n  // items we're modifying.\n\n  var inner = /** @type {Element} */ (item.firstChild);\n  goog.asserts.assert(inner);\n  // The first case is a palette item with a CSS class representing the sprite,\n  // and an animated emoji.\n  var classes = goog.dom.classlist.get(inner);\n  if (classes && classes.length == 1) {\n    inner.className = '';\n  }\n\n  goog.style.setStyle(inner, {\n    'width': animatedImg.width,\n    'height': animatedImg.height,\n    'background-image': 'url(' + animatedImg.src + ')',\n    'background-position': '0 0'\n  });\n};\n\n\n/**\n * Builds the inner contents of a palette item out of sprite metadata.\n *\n * @param {goog.dom.DomHelper} dom DOM helper for constructing DOM elements.\n * @param {goog.ui.emoji.SpriteInfo} spriteInfo The metadata to create the css\n *     for the sprite.\n * @param {string} displayUrl The URL of the image for this cell.\n * @return {HTMLDivElement} The inner element for a palette item.\n */\ngoog.ui.emoji.EmojiPaletteRenderer.prototype.buildElementFromSpriteMetadata =\n    function(dom, spriteInfo, displayUrl) {\n  var width = spriteInfo.getWidthCssValue();\n  var height = spriteInfo.getHeightCssValue();\n  var x = spriteInfo.getXOffsetCssValue();\n  var y = spriteInfo.getYOffsetCssValue();\n\n  var el = dom.createDom(goog.dom.TagName.DIV);\n  goog.style.setStyle(el, {\n    'width': width,\n    'height': height,\n    'background-image': 'url(' + displayUrl + ')',\n    'background-repeat': 'no-repeat',\n    'background-position': x + ' ' + y\n  });\n\n  return /** @type {!HTMLDivElement} */ (el);\n};\n\n\n/** @override */\ngoog.ui.emoji.EmojiPaletteRenderer.prototype.createCell = function(node, dom) {\n  // Create a cell with  the default img if we're out of items, in order to\n  // prevent jitter in the table. If there's no default img url, just create an\n  // empty div, to prevent trying to fetch a null url.\n  if (!node) {\n    var elem = this.defaultImgUrl_ ?\n        dom.createDom(goog.dom.TagName.IMG, {src: this.defaultImgUrl_}) :\n        dom.createDom(goog.dom.TagName.DIV);\n    node = dom.createDom(\n        goog.dom.TagName.DIV, goog.getCssName('goog-palette-cell-wrapper'),\n        elem);\n  }\n\n  var cell = dom.createDom(\n      goog.dom.TagName.TD, {\n        'class': goog.getCssName(this.getCssClass(), 'cell'),\n        // Cells must have an ID, for accessibility, so we generate one here.\n        'id': this.getCssClass() + '-cell-' +\n            goog.ui.emoji.EmojiPaletteRenderer.cellId_++\n      },\n      node);\n  goog.a11y.aria.setRole(cell, 'gridcell');\n  return cell;\n};\n\n\n/**\n * Returns the item corresponding to the given node, or null if the node is\n * neither a palette cell nor part of a palette item.\n * @param {goog.ui.Palette} palette Palette in which to look for the item.\n * @param {Node} node Node to look for.\n * @return {Node} The corresponding palette item (null if not found).\n * @override\n */\ngoog.ui.emoji.EmojiPaletteRenderer.prototype.getContainingItem = function(\n    palette, node) {\n  var root = palette.getElement();\n  while (node && node.nodeType == goog.dom.NodeType.ELEMENT && node != root) {\n    if (node.tagName == goog.dom.TagName.TD) {\n      return node.firstChild;\n    }\n    node = node.parentNode;\n  }\n\n  return null;\n};\n","^17",1579837703000,"^18",["^19",["^1S","^2O","^3G","^2P","^Z","~$goog.ui.PaletteRenderer","~$goog.ui.emoji.Emoji","^29","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/emoji/emojipaletterenderer.js"],"^1J",["^19",["~$goog.ui.emoji.EmojiPaletteRenderer"]],"^X",true,"^Y",["^Z","^2P","^1S","^3G","^1V","^2O","^29","^<;","^<<"]],["^ ","^[",[1579837703000],"^10","goog.a11y.aria.announcer.js","^11",["^12","goog/a11y/aria/announcer.js"],"^13","goog/a11y/aria/announcer.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Announcer that allows messages to be spoken by assistive\n * technologies.\n */\n\ngoog.provide('goog.a11y.aria.Announcer');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.Timer');\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.LivePriority');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.object');\n\n\n\n/**\n * Class that allows messages to be spoken by assistive technologies that the\n * user may have active.\n *\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper.\n * @constructor\n * @extends {goog.Disposable}\n * @final\n */\ngoog.a11y.aria.Announcer = function(opt_domHelper) {\n  goog.a11y.aria.Announcer.base(this, 'constructor');\n\n  /**\n   * @type {goog.dom.DomHelper}\n   * @private\n   */\n  this.domHelper_ = opt_domHelper || goog.dom.getDomHelper();\n\n  /**\n   * Map of priority to live region elements to use for communicating updates.\n   * Elements are created on demand.\n   * @type {Object<goog.a11y.aria.LivePriority, !Element>}\n   * @private\n   */\n  this.liveRegions_ = {};\n};\ngoog.inherits(goog.a11y.aria.Announcer, goog.Disposable);\n\n\n/** @override */\ngoog.a11y.aria.Announcer.prototype.disposeInternal = function() {\n  goog.object.forEach(\n      this.liveRegions_, this.domHelper_.removeNode, this.domHelper_);\n  this.liveRegions_ = null;\n  this.domHelper_ = null;\n  goog.a11y.aria.Announcer.base(this, 'disposeInternal');\n};\n\n\n/**\n * Announce a message to be read by any assistive technologies the user may\n * have active.\n * @param {string} message The message to announce to screen readers.\n * @param {goog.a11y.aria.LivePriority=} opt_priority The priority of the\n *     message. Defaults to POLITE.\n */\ngoog.a11y.aria.Announcer.prototype.say = function(message, opt_priority) {\n  var priority = opt_priority || goog.a11y.aria.LivePriority.POLITE;\n  var liveRegion = this.getLiveRegion_(priority);\n  // Resets text content to force a DOM mutation (so that the setTextContent\n  // post-timeout function will be noticed by the screen reader). This is to\n  // avoid the problem of when the same message is \"said\" twice, which doesn't\n  // trigger a DOM mutation.\n  goog.dom.setTextContent(liveRegion, '');\n  // Uses non-zero timer to make VoiceOver and NVDA work\n  goog.Timer.callOnce(function() {\n    goog.dom.setTextContent(liveRegion, message);\n  }, 1);\n};\n\n\n/**\n * Returns an aria-live region that can be used to communicate announcements.\n * @param {!goog.a11y.aria.LivePriority} priority The required priority.\n * @return {!Element} A live region of the requested priority.\n * @private\n */\ngoog.a11y.aria.Announcer.prototype.getLiveRegion_ = function(priority) {\n  var liveRegion = this.liveRegions_[priority];\n  if (liveRegion) {\n    // Make sure the live region is not aria-hidden.\n    goog.a11y.aria.removeState(liveRegion, goog.a11y.aria.State.HIDDEN);\n    return liveRegion;\n  }\n\n  liveRegion = this.domHelper_.createElement(goog.dom.TagName.DIV);\n  // Note that IE has a habit of declaring things that aren't display:none as\n  // invisible to third-party tools like JAWs, so we can't just use height:0.\n  liveRegion.style.position = 'absolute';\n  liveRegion.style.top = '-1000px';\n  liveRegion.style.height = '1px';\n  liveRegion.style.overflow = 'hidden';\n  goog.a11y.aria.setState(liveRegion, goog.a11y.aria.State.LIVE, priority);\n  goog.a11y.aria.setState(liveRegion, goog.a11y.aria.State.ATOMIC, 'true');\n  this.domHelper_.getDocument().body.appendChild(liveRegion);\n  this.liveRegions_[priority] = liveRegion;\n  return liveRegion;\n};\n","^17",1579837703000,"^18",["^19",["^1T","~$goog.a11y.aria.LivePriority","^5F","^2P","^Z","^2G","^4K","^5@","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/a11y/aria/announcer.js"],"^1J",["^19",["~$goog.a11y.aria.Announcer"]],"^X",true,"^Y",["^Z","^4K","^5F","^2P","^<>","^5@","^1T","^1V","^2G"]],["^ ","^[",[1579837703000],"^2F",true,"^10","goog.structs.avltree.js","^11",["^12","goog/structs/avltree.js"],"^13","goog/structs/avltree.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Datastructure: AvlTree.\n *\n *\n * This file provides the implementation of an AVL-Tree datastructure. The tree\n * maintains a set of unique values in a sorted order. The values can be\n * accessed efficiently in their sorted order since the tree enforces an O(logn)\n * maximum height. See http://en.wikipedia.org/wiki/Avl_tree for more detail.\n *\n * The big-O notation for all operations are below:\n * <pre>\n *   Method                 big-O\n * ----------------------------------------------------------------------------\n * - add                    O(logn)\n * - remove                 O(logn)\n * - clear                  O(1)\n * - contains               O(logn)\n * - indexOf                O(logn)\n * - getCount               O(1)\n * - getMinimum             O(1), or O(logn) when optional root is specified\n * - getMaximum             O(1), or O(logn) when optional root is specified\n * - getHeight              O(1)\n * - getValues              O(n)\n * - inOrderTraverse        O(logn + k), where k is number of traversed nodes\n * - reverseOrderTraverse   O(logn + k), where k is number of traversed nodes\n * - copy                   O(n * p), where p is the time complexity to copy a\n *                          node\n * </pre>\n */\n\n\ngoog.module('goog.structs.AvlTree');\ngoog.module.declareLegacyNamespace();\n\nvar Collection = goog.require('goog.structs.Collection');\nvar asserts = goog.require('goog.asserts');\n\n\n\n/**\n * Constructs an AVL-Tree, which uses the specified comparator to order its\n * values. The values can be accessed efficiently in their sorted order since\n * the tree enforces a O(logn) maximum height.\n *\n * @param {?Function=} opt_comparator Function used to order the tree's nodes.\n * @constructor\n * @implements {Collection<T>}\n * @final\n * @template T\n */\nvar AvlTree = function(opt_comparator) {\n  /**\n   * Comparison function used to compare values in the tree. This function\n   * should take two values, a and b, and return x where:\n   *\n   * <pre>\n   *  x < 0 if a < b,\n   *  x > 0 if a > b,\n   *  x = 0 otherwise\n   * </pre>\n   *\n   * @private @const {!Function}\n   */\n  this.comparator_ = opt_comparator || DEFAULT_COMPARATOR;\n\n  /**\n   * Pointer to the root node of the tree.\n   *\n   * @private {?Node<T>}\n   */\n  this.root_ = null;\n\n  /**\n   * Pointer to the node with the smallest value in the tree.\n   *\n   * @private {?Node<T>}\n   */\n  this.minNode_ = null;\n\n  /**\n   * Pointer to the node with the largest value in the tree.\n   *\n   * @private {?Node<T>}\n   */\n  this.maxNode_ = null;\n};\n\n\n/**\n * String comparison function used to compare values in the tree. This function\n * is used by default if no comparator is specified in the tree's constructor.\n *\n * @param {T} a The first value.\n * @param {T} b The second value.\n * @return {number} -1 if a < b, 1 if a > b, 0 if a = b.\n * @template T\n * @const\n */\nvar DEFAULT_COMPARATOR = function(a, b) {\n  if (String(a) < String(b)) {\n    return -1;\n  } else if (String(a) > String(b)) {\n    return 1;\n  }\n  return 0;\n};\n\n\n/**\n * @param {?Node} node\n * @return {number}\n */\nfunction height(node) {\n  return node ? node.height : 0;\n}\n\n\n/**\n * @param {?Node} node\n * @return {number}\n */\nfunction balanceFactor(node) {\n  if (node) {\n    var lh = node.left ? node.left.height : 0;\n    var rh = node.right ? node.right.height : 0;\n    return lh - rh;\n  }\n  return 0;\n}\n\n\n/**\n * @param {!Node<T>} node Node to balance.\n * @return {!Node<T>} Root of the modified subtree.\n * @private\n */\nAvlTree.prototype.balance_ = function(node) {\n  var bf = balanceFactor(node);\n  if (bf > 1) {\n    if (balanceFactor(node.left) < 0) {\n      asserts.assert(node.left);\n      this.leftRotate_(node.left);\n    }\n    return this.rightRotate_(node);\n  } else if (bf < -1) {\n    if (balanceFactor(node.right) > 0) {\n      asserts.assert(node.right);\n      this.rightRotate_(node.right);\n    }\n    return this.leftRotate_(node);\n  }\n  return node;\n};\n\n\n/**\n * Recursively find the correct place to add the given value to the tree.\n *\n * @param {T} value\n * @param {!Node<T>} currentNode\n * @return {boolean}\n * @private\n */\nAvlTree.prototype.addInternal_ = function(value, currentNode) {\n  var comparison = this.comparator_(value, currentNode.value);\n  var added = false;\n\n  if (comparison > 0) {\n    if (currentNode.right) {\n      added = this.addInternal_(value, currentNode.right);\n    } else {\n      currentNode.right = new Node(value, currentNode);\n      added = true;\n\n      if (currentNode == this.maxNode_) {\n        this.maxNode_ = currentNode.right;\n      }\n    }\n  } else if (comparison < 0) {\n    if (currentNode.left) {\n      added = this.addInternal_(value, currentNode.left);\n    } else {\n      currentNode.left = new Node(value, currentNode);\n      added = true;\n\n      if (currentNode == this.minNode_) {\n        this.minNode_ = currentNode.left;\n      }\n    }\n  }\n\n  if (added) {\n    currentNode.count++;\n    currentNode.height =\n        Math.max(height(currentNode.left), height(currentNode.right)) + 1;\n\n    this.balance_(currentNode);\n  }\n\n  return added;\n};\n\n\n/**\n * Inserts a node into the tree with the specified value if the tree does\n * not already contain a node with the specified value. If the value is\n * inserted, the tree is balanced to enforce the AVL-Tree height property.\n *\n * @param {T} value Value to insert into the tree.\n * @return {boolean} Whether value was inserted into the tree.\n * @override\n */\nAvlTree.prototype.add = function(value) {\n  // If the tree is empty, create a root node with the specified value\n  if (!this.root_) {\n    this.root_ = new Node(value);\n    this.minNode_ = this.root_;\n    this.maxNode_ = this.root_;\n    return true;\n  }\n\n  return this.addInternal_(value, this.root_);\n};\n\n\n/**\n * @param {?Node} node\n * @return {number}\n */\nfunction count(node) {\n  return node ? node.count : 0;\n}\n\n\n/**\n * @param {T} value Value to remove.\n * @param {?Node<T>} currentNode\n * @return {{value: (T|null), root: ?Node<T>}} The value that was removed or\n *     null if nothing was removed in addition to the root of the modified\n *     subtree.\n * @private\n */\nAvlTree.prototype.removeInternal_ = function(value, currentNode) {\n  if (!currentNode) {\n    return {value: null, root: null};\n  }\n\n  var comparison = this.comparator_(currentNode.value, value);\n\n  if (comparison > 0) {\n    var removeResult = this.removeInternal_(value, currentNode.left);\n    currentNode.left = removeResult.root;\n    value = removeResult.value;\n  } else if (comparison < 0) {\n    var removeResult = this.removeInternal_(value, currentNode.right);\n    currentNode.right = removeResult.root;\n    value = removeResult.value;\n  } else {\n    value = currentNode.value;\n    if (!currentNode.left || !currentNode.right) {\n      // Zero or one children.\n      var replacement = currentNode.left ? currentNode.left : currentNode.right;\n\n      if (!replacement) {\n        if (this.maxNode_ == currentNode) {\n          this.maxNode_ = currentNode.parent;\n        }\n        if (this.minNode_ == currentNode) {\n          this.minNode_ = currentNode.parent;\n        }\n        return {value: value, root: null};\n      }\n\n      if (this.maxNode_ == currentNode) {\n        this.maxNode_ = replacement;\n      }\n      if (this.minNode_ == currentNode) {\n        this.minNode_ = replacement;\n      }\n\n      replacement.parent = currentNode.parent;\n      currentNode = replacement;\n    } else {\n      value = currentNode.value;\n      var nextInOrder = currentNode.right;\n      // Two children. Note this cannot be the max or min value. Find the next\n      // in order replacement (the left most child of the current node's right\n      // child).\n      this.traverse_(function(node) {\n        if (node.left) {\n          nextInOrder = node.left;\n          return nextInOrder;\n        }\n        return null;\n      }, currentNode.right);\n      asserts.assert(nextInOrder);\n      currentNode.value = nextInOrder.value;\n      var removeResult = this.removeInternal_(\n          /** @type {?} */ (nextInOrder.value), currentNode.right);\n      currentNode.right = removeResult.root;\n    }\n  }\n\n  currentNode.count = count(currentNode.left) + count(currentNode.right) + 1;\n  currentNode.height =\n      Math.max(height(currentNode.left), height(currentNode.right)) + 1;\n  return {root: this.balance_(currentNode), value: value};\n};\n\n\n/**\n * Removes a node from the tree with the specified value if the tree contains a\n * node with this value. If a node is removed the tree is balanced to enforce\n * the AVL-Tree height property. The value of the removed node is returned.\n *\n * @param {T} value Value to find and remove from the tree.\n * @return {T} The value of the removed node or null if the value was not in\n *     the tree.\n * @override\n */\nAvlTree.prototype.remove = function(value) {\n  var result = this.removeInternal_(value, this.root_);\n  this.root_ = result.root;\n  return result.value;\n};\n\n\n/**\n * Removes all nodes from the tree.\n */\nAvlTree.prototype.clear = function() {\n  this.root_ = null;\n  this.minNode_ = null;\n  this.maxNode_ = null;\n};\n\n\n/**\n * Returns true if the tree contains a node with the specified value, false\n * otherwise.\n *\n * @param {T} value Value to find in the tree.\n * @return {boolean} Whether the tree contains a node with the specified value.\n * @override\n */\nAvlTree.prototype.contains = function(value) {\n  // Assume the value is not in the tree and set this value if it is found\n  var isContained = false;\n\n  // Depth traverse the tree and set isContained if we find the node\n  this.traverse_(function(node) {\n    var retNode = null;\n    var comparison = this.comparator_(node.value, value);\n    if (comparison > 0) {\n      retNode = node.left;\n    } else if (comparison < 0) {\n      retNode = node.right;\n    } else {\n      isContained = true;\n    }\n    return retNode;  // If null, we'll stop traversing the tree\n  });\n\n  // Return true if the value is contained in the tree, false otherwise\n  return isContained;\n};\n\n\n/**\n * Returns the index (in an in-order traversal) of the node in the tree with\n * the specified value. For example, the minimum value in the tree will\n * return an index of 0 and the maximum will return an index of n - 1 (where\n * n is the number of nodes in the tree).  If the value is not found then -1\n * is returned.\n *\n * @param {T} value Value in the tree whose in-order index is returned.\n * @return {number} The in-order index of the given value in the\n *     tree or -1 if the value is not found.\n */\nAvlTree.prototype.indexOf = function(value) {\n  // Assume the value is not in the tree and set this value if it is found\n  var retIndex = -1;\n  var currIndex = 0;\n\n  // Depth traverse the tree and set retIndex if we find the node\n  this.traverse_(function(node) {\n    var comparison = this.comparator_(node.value, value);\n    if (comparison > 0) {\n      // The value is less than this node, so recurse into the left subtree.\n      return node.left;\n    }\n\n    if (node.left) {\n      // The value is greater than all of the nodes in the left subtree.\n      currIndex += node.left.count;\n    }\n\n    if (comparison < 0) {\n      // The value is also greater than this node.\n      currIndex++;\n      // Recurse into the right subtree.\n      return node.right;\n    }\n    // We found the node, so stop traversing the tree.\n    retIndex = currIndex;\n    return null;\n  });\n\n  // Return index if the value is contained in the tree, -1 otherwise\n  return retIndex;\n};\n\n\n/**\n * Returns the number of values stored in the tree.\n *\n * @return {number} The number of values stored in the tree.\n * @override\n */\nAvlTree.prototype.getCount = function() {\n  return this.root_ ? this.root_.count : 0;\n};\n\n\n/**\n * Returns a k-th smallest value, based on the comparator, where 0 <= k <\n * this.getCount().\n * @param {number} k The number k.\n * @return {T} The k-th smallest value.\n */\nAvlTree.prototype.getKthValue = function(k) {\n  if (k < 0 || k >= this.getCount()) {\n    return null;\n  }\n  return this.getKthNode_(k).value;\n};\n\n\n/**\n * Returns the value u, such that u is contained in the tree and u < v, for all\n * values v in the tree where v != u.\n *\n * @return {T} The minimum value contained in the tree.\n */\nAvlTree.prototype.getMinimum = function() {\n  return this.getMinNode_().value;\n};\n\n\n/**\n * Returns the value u, such that u is contained in the tree and u > v, for all\n * values v in the tree where v != u.\n *\n * @return {T} The maximum value contained in the tree.\n */\nAvlTree.prototype.getMaximum = function() {\n  return this.getMaxNode_().value;\n};\n\n\n/**\n * Returns the height of the tree (the maximum depth). This height should\n * always be <= 1.4405*(Math.log(n+2)/Math.log(2))-1.3277, where n is the\n * number of nodes in the tree.\n *\n * @return {number} The height of the tree.\n */\nAvlTree.prototype.getHeight = function() {\n  return this.root_ ? this.root_.height : 0;\n};\n\n\n/**\n * Inserts the values stored in the tree into a new Array and returns the Array.\n *\n * @return {!Array<T>} An array containing all of the trees values in sorted\n *     order.\n */\nAvlTree.prototype.getValues = function() {\n  var ret = [];\n  this.inOrderTraverse(function(value) { ret.push(value); });\n  return ret;\n};\n\n\n/**\n * Performs an in-order traversal of the tree and calls `func` with each\n * traversed node, optionally starting from the smallest node with a value >= to\n * the specified start value. The traversal ends after traversing the tree's\n * maximum node or when `func` returns a value that evaluates to true.\n *\n * @param {Function} func Function to call on each traversed node.\n * @param {T=} opt_startValue If specified, traversal will begin on the node\n *     with the smallest value >= opt_startValue.\n */\nAvlTree.prototype.inOrderTraverse = function(func, opt_startValue) {\n  // If our tree is empty, return immediately\n  if (!this.root_) {\n    return;\n  }\n\n  // Depth traverse the tree to find node to begin in-order traversal from\n  /** @type {undefined|!Node} */\n  var startNode;\n  if (opt_startValue !== undefined) {\n    this.traverse_(function(node) {\n      var retNode = null;\n      var comparison = this.comparator_(node.value, opt_startValue);\n      if (comparison > 0) {\n        retNode = node.left;\n        startNode = node;\n      } else if (comparison < 0) {\n        retNode = node.right;\n      } else {\n        startNode = node;\n      }\n      return retNode;  // If null, we'll stop traversing the tree\n    });\n    if (!startNode) {\n      return;\n    }\n  } else {\n    startNode = /** @type {!Node} */ (this.getMinNode_());\n  }\n\n  // Traverse the tree and call func on each traversed node's value\n  var node = /** @type {!Node} */ (startNode);\n  var prev = node.left ? node.left : node;\n  while (node != null) {\n    if (node.left != null && node.left != prev && node.right != prev) {\n      node = node.left;\n    } else {\n      if (node.right != prev) {\n        if (func(node.value)) {\n          return;\n        }\n      }\n      var temp = node;\n      node =\n          node.right != null && node.right != prev ? node.right : node.parent;\n      prev = temp;\n    }\n  }\n};\n\n\n/**\n * Performs a reverse-order traversal of the tree and calls `func` with\n * each traversed node, optionally starting from the largest node with a value\n * <= to the specified start value. The traversal ends after traversing the\n * tree's minimum node or when func returns a value that evaluates to true.\n *\n * @param {function(T):?} func Function to call on each traversed node.\n * @param {T=} opt_startValue If specified, traversal will begin on the node\n *     with the largest value <= opt_startValue.\n */\nAvlTree.prototype.reverseOrderTraverse = function(func, opt_startValue) {\n  // If our tree is empty, return immediately\n  if (!this.root_) {\n    return;\n  }\n\n  // Depth traverse the tree to find node to begin reverse-order traversal from\n  var startNode;\n  if (opt_startValue !== undefined) {\n    this.traverse_(goog.bind(function(node) {\n      var retNode = null;\n      var comparison = this.comparator_(node.value, opt_startValue);\n      if (comparison > 0) {\n        retNode = node.left;\n      } else if (comparison < 0) {\n        retNode = node.right;\n        startNode = node;\n      } else {\n        startNode = node;\n      }\n      return retNode;  // If null, we'll stop traversing the tree\n    }, this));\n    if (!startNode) {\n      return;\n    }\n  } else {\n    startNode = this.getMaxNode_();\n  }\n\n  // Traverse the tree and call func on each traversed node's value\n  var node = startNode, prev = startNode.right ? startNode.right : startNode;\n  while (node != null) {\n    if (node.right != null && node.right != prev && node.left != prev) {\n      node = node.right;\n    } else {\n      if (node.left != prev) {\n        if (func(node.value)) {\n          return;\n        }\n      }\n      var temp = node;\n      node = node.left != null && node.left != prev ? node.left : node.parent;\n      prev = temp;\n    }\n  }\n};\n\n\n/**\n * Performs a traversal defined by the supplied `traversalFunc`. The first\n * call to `traversalFunc` is passed the root or the optionally specified\n * startNode. After that, calls `traversalFunc` with the node returned\n * by the previous call to `traversalFunc` until `traversalFunc`\n * returns null or the optionally specified endNode. The first call to\n * traversalFunc is passed the root or the optionally specified startNode.\n *\n * @param {function(\n *     this:AvlTree<T>,\n *     !Node<T>):?Node<T>} traversalFunc\n * Function used to traverse the tree.\n * @param {Node<T>=} opt_startNode The node at which the\n *     traversal begins.\n * @param {Node<T>=} opt_endNode The node at which the\n *     traversal ends.\n * @private\n */\nAvlTree.prototype.traverse_ = function(\n    traversalFunc, opt_startNode, opt_endNode) {\n  var node = opt_startNode ? opt_startNode : this.root_;\n  var endNode = opt_endNode ? opt_endNode : null;\n  while (node && node != endNode) {\n    node = traversalFunc.call(this, node);\n  }\n};\n\n\n/**\n * Performs a left tree rotation on the specified node.\n *\n * @param {!Node<T>} node Pivot node to rotate from.\n * @return {!Node<T>} New root of the sub tree.\n * @private\n */\nAvlTree.prototype.leftRotate_ = function(node) {\n  // Re-assign parent-child references for the parent of the node being removed\n  if (node.isLeftChild()) {\n    node.parent.left = node.right;\n    node.right.parent = node.parent;\n  } else if (node.isRightChild()) {\n    node.parent.right = node.right;\n    node.right.parent = node.parent;\n  } else {\n    this.root_ = node.right;\n    this.root_.parent = null;\n  }\n\n  // Re-assign parent-child references for the child of the node being removed\n  var temp = node.right;\n  node.right = node.right.left;\n  if (node.right != null) node.right.parent = node;\n  temp.left = node;\n  node.parent = temp;\n\n  // Update counts.\n  temp.count = node.count;\n  node.count -= (temp.right ? temp.right.count : 0) + 1;\n\n  node.fixHeight();\n  temp.fixHeight();\n\n  return temp;\n};\n\n\n/**\n * Performs a right tree rotation on the specified node.\n *\n * @param {!Node<T>} node Pivot node to rotate from.\n * @return {!Node<T>} New root of the sub tree.\n * @private\n */\nAvlTree.prototype.rightRotate_ = function(node) {\n  // Re-assign parent-child references for the parent of the node being removed\n  if (node.isLeftChild()) {\n    node.parent.left = node.left;\n    node.left.parent = node.parent;\n  } else if (node.isRightChild()) {\n    node.parent.right = node.left;\n    node.left.parent = node.parent;\n  } else {\n    this.root_ = node.left;\n    this.root_.parent = null;\n  }\n\n  // Re-assign parent-child references for the child of the node being removed\n  var temp = node.left;\n  node.left = node.left.right;\n  if (node.left != null) node.left.parent = node;\n  temp.right = node;\n  node.parent = temp;\n\n  // Update counts.\n  temp.count = node.count;\n  node.count -= (temp.left ? temp.left.count : 0) + 1;\n\n  node.fixHeight();\n  temp.fixHeight();\n\n  return temp;\n};\n\n\n/**\n * Returns the node in the tree that has k nodes before it in an in-order\n * traversal, optionally rooted at `opt_rootNode`.\n *\n * @param {number} k The number of nodes before the node to be returned in an\n *     in-order traversal, where 0 <= k < root.count.\n * @param {Node<T>=} opt_rootNode Optional root node.\n * @return {Node<T>} The node at the specified index.\n * @private\n */\nAvlTree.prototype.getKthNode_ = function(k, opt_rootNode) {\n  var root = opt_rootNode || this.root_;\n  var numNodesInLeftSubtree = root.left ? root.left.count : 0;\n\n  if (k < numNodesInLeftSubtree) {\n    return this.getKthNode_(k, root.left);\n  } else if (k == numNodesInLeftSubtree) {\n    return root;\n  } else {\n    return this.getKthNode_(k - numNodesInLeftSubtree - 1, root.right);\n  }\n};\n\n\n/**\n * Returns the node with the smallest value in tree, optionally rooted at\n * `opt_rootNode`.\n *\n * @param {Node<T>=} opt_rootNode Optional root node.\n * @return {Node<T>} The node with the smallest value in\n *     the tree.\n * @private\n */\nAvlTree.prototype.getMinNode_ = function(opt_rootNode) {\n  if (!opt_rootNode) {\n    return this.minNode_;\n  }\n\n  var minNode = opt_rootNode;\n  this.traverse_(function(node) {\n    var retNode = null;\n    if (node.left) {\n      minNode = node.left;\n      retNode = node.left;\n    }\n    return retNode;  // If null, we'll stop traversing the tree\n  }, opt_rootNode);\n\n  return minNode;\n};\n\n\n/**\n * Returns the node with the largest value in tree, optionally rooted at\n * opt_rootNode.\n *\n * @param {Node<T>=} opt_rootNode Optional root node.\n * @return {Node<T>} The node with the largest value in\n *     the tree.\n * @private\n */\nAvlTree.prototype.getMaxNode_ = function(opt_rootNode) {\n  if (!opt_rootNode) {\n    return this.maxNode_;\n  }\n\n  var maxNode = opt_rootNode;\n  this.traverse_(function(node) {\n    var retNode = null;\n    if (node.right) {\n      maxNode = node.right;\n      retNode = node.right;\n    }\n    return retNode;  // If null, we'll stop traversing the tree\n  }, opt_rootNode);\n\n  return maxNode;\n};\n\n\n/**\n * Copies the AVL tree.\n * @param {(function(T): T)=} opt_copy - Function used to copy the elements\n *     contained in the tree. The identity function is used by default, which\n *     results in a shallow copy of the tree. Copied elements will be compared\n *     against their originals using the tree's comparator to ensure the\n *     integrity of the copied tree.\n * @return {!AvlTree<T>}\n */\nAvlTree.prototype.copy = function(opt_copy) {\n  var tree = new AvlTree(this.comparator_);\n\n  // Empty tree\n  if (!this.root_) {\n    return tree;\n  }\n\n  // Copy instance properties\n  var copyInfo =\n      this.root_.copy(/* parent= */ null, this.comparator_, opt_copy);\n  tree.root_ = copyInfo.root;\n  tree.minNode_ = copyInfo.leftMost;\n  tree.maxNode_ = copyInfo.rightMost;\n\n  return tree;\n};\n\n\n\n/**\n * Constructs an AVL-Tree node with the specified value. If no parent is\n * specified, the node's parent is assumed to be null. The node's height\n * defaults to 1 and its children default to null.\n *\n * @param {T} value Value to store in the node.\n * @param {Node<T>=} opt_parent Optional parent node.\n * @constructor\n * @final\n * @template T\n */\nvar Node = function(value, opt_parent) {\n  /**\n   * The value stored by the node.\n   *\n   * @type {T}\n   */\n  this.value = value;\n\n  /**\n   * The node's parent. Null if the node is the root.\n   *\n   * @type {?Node<T>}\n   */\n  this.parent = opt_parent ? opt_parent : null;\n\n  /**\n   * The number of nodes in the subtree rooted at this node.\n   *\n   * @type {number}\n   */\n  this.count = 1;\n\n  /**\n   * The node's left child. Null if the node does not have a left child.\n   *\n   * @type {?Node<T>}\n   */\n  this.left = null;\n\n  /**\n   * The node's right child. Null if the node does not have a right child.\n   *\n   * @type {?Node<T>}\n   */\n  this.right = null;\n\n  /**\n   * Height of this node.\n   *\n   * @type {number}\n   */\n  this.height = 1;\n};\n\n\n/**\n * Returns true iff the specified node has a parent and is the right child of\n * its parent.\n *\n * @return {boolean} Whether the specified node has a parent and is the right\n *    child of its parent.\n */\nNode.prototype.isRightChild = function() {\n  return !!this.parent && this.parent.right == this;\n};\n\n\n/**\n * Returns true iff the specified node has a parent and is the left child of\n * its parent.\n *\n * @return {boolean} Whether the specified node has a parent and is the left\n *    child of its parent.\n */\nNode.prototype.isLeftChild = function() {\n  return !!this.parent && this.parent.left == this;\n};\n\n\n/**\n * Helper method to fix the height of this node (e.g. after children have\n * changed).\n */\nNode.prototype.fixHeight = function() {\n  this.height = Math.max(\n                    this.left ? this.left.height : 0,\n                    this.right ? this.right.height : 0) +\n      1;\n};\n\n\n/**\n * Copies a node.\n * @param {?Node<T>} parent - The parent of this node.\n * @param {!Function} comparator Comparison function for values, used to assert\n *     that the nodes are equivalent after copying.\n * @param {(function(T): T)=} opt_copy - Function used to copy the elements\n *     contained in the tree. The identity function is used by default, which\n *     results in a shallow copy of the tree. Copied elements will be compared\n *     against their originals using the tree's comparator to ensure the\n *     integrity of the copied tree.\n * @return {{\n *   root: !Node<T>,\n *   leftMost: ?Node<T>,\n *   rightMost: ?Node<T>,\n * }} subtree - Information about the copied subtree\n */\nNode.prototype.copy = function(parent, comparator, opt_copy) {\n  var val;\n\n  if (opt_copy) {\n    val = opt_copy(this.value);\n    asserts.assert(comparator(this.value, val) === 0);\n  } else {\n    val = this.value;\n  }\n\n  var node = new Node(val, parent);\n\n  // Copy all properties\n  node.count = this.count;\n  node.height = this.height;\n\n  var minNode = node;\n  var maxNode = node;\n\n  if (this.left) {\n    var leftInfo = this.left.copy(node, comparator, opt_copy);\n    node.left = leftInfo.root;\n    minNode = leftInfo.leftMost;\n  }\n\n  if (this.right) {\n    var rightInfo = this.right.copy(node, comparator, opt_copy);\n    node.right = rightInfo.root;\n    maxNode = rightInfo.rightMost;\n  }\n\n  return {root: node, leftMost: minNode, rightMost: maxNode};\n};\n\nexports = AvlTree;\n","^17",1579837703000,"^18",["^19",["^1S","~$goog.structs.Collection","^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/avltree.js"],"^1J",["^19",["~$goog.structs.AvlTree"]],"^X",true,"^Y",["^Z","^<@","^1S"]],["^ ","^[",[1579837703000],"^10","goog.graphics.svgelement.js","^11",["^12","goog/graphics/svgelement.js"],"^13","goog/graphics/svgelement.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Thin wrappers around the DOM element returned from\n * the different draw methods of the graphics. This is the SVG implementation.\n * @author arv@google.com (Erik Arvidsson)\n */\n\ngoog.provide('goog.graphics.SvgEllipseElement');\ngoog.provide('goog.graphics.SvgGroupElement');\ngoog.provide('goog.graphics.SvgImageElement');\ngoog.provide('goog.graphics.SvgPathElement');\ngoog.provide('goog.graphics.SvgRectElement');\ngoog.provide('goog.graphics.SvgTextElement');\n\n\ngoog.forwardDeclare('goog.graphics.SvgGraphics');\ngoog.require('goog.dom');\ngoog.require('goog.graphics.EllipseElement');\ngoog.require('goog.graphics.GroupElement');\ngoog.require('goog.graphics.ImageElement');\ngoog.require('goog.graphics.PathElement');\ngoog.require('goog.graphics.RectElement');\ngoog.require('goog.graphics.TextElement');\n\n\n\n/**\n * Thin wrapper for SVG group elements.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.SvgGraphics} graphics The graphics creating\n *     this element.\n * @constructor\n * @extends {goog.graphics.GroupElement}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n * @final\n */\ngoog.graphics.SvgGroupElement = function(element, graphics) {\n  goog.graphics.GroupElement.call(this, element, graphics);\n};\ngoog.inherits(goog.graphics.SvgGroupElement, goog.graphics.GroupElement);\n\n\n/**\n * Remove all drawing elements from the group.\n * @override\n */\ngoog.graphics.SvgGroupElement.prototype.clear = function() {\n  goog.dom.removeChildren(this.getElement());\n};\n\n\n/**\n * Set the size of the group element.\n * @param {number|string} width The width of the group element.\n * @param {number|string} height The height of the group element.\n * @override\n */\ngoog.graphics.SvgGroupElement.prototype.setSize = function(width, height) {\n  this.getGraphics().setElementAttributes(\n      this.getElement(), {'width': width, 'height': height});\n};\n\n\n\n/**\n * Thin wrapper for SVG ellipse elements.\n * This is an implementation of the goog.graphics.EllipseElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.SvgGraphics} graphics The graphics creating\n *     this element.\n * @param {goog.graphics.Stroke?} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill?} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.EllipseElement}\n * @final\n */\ngoog.graphics.SvgEllipseElement = function(element, graphics, stroke, fill) {\n  goog.graphics.EllipseElement.call(this, element, graphics, stroke, fill);\n};\ngoog.inherits(goog.graphics.SvgEllipseElement, goog.graphics.EllipseElement);\n\n\n/**\n * Update the center point of the ellipse.\n * @param {number} cx Center X coordinate.\n * @param {number} cy Center Y coordinate.\n * @override\n */\ngoog.graphics.SvgEllipseElement.prototype.setCenter = function(cx, cy) {\n  this.getGraphics().setElementAttributes(\n      this.getElement(), {'cx': cx, 'cy': cy});\n};\n\n\n/**\n * Update the radius of the ellipse.\n * @param {number} rx Radius length for the x-axis.\n * @param {number} ry Radius length for the y-axis.\n * @override\n */\ngoog.graphics.SvgEllipseElement.prototype.setRadius = function(rx, ry) {\n  this.getGraphics().setElementAttributes(\n      this.getElement(), {'rx': rx, 'ry': ry});\n};\n\n\n\n/**\n * Thin wrapper for SVG rectangle elements.\n * This is an implementation of the goog.graphics.RectElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.SvgGraphics} graphics The graphics creating\n *     this element.\n * @param {goog.graphics.Stroke?} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill?} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.RectElement}\n * @final\n */\ngoog.graphics.SvgRectElement = function(element, graphics, stroke, fill) {\n  goog.graphics.RectElement.call(this, element, graphics, stroke, fill);\n};\ngoog.inherits(goog.graphics.SvgRectElement, goog.graphics.RectElement);\n\n\n/**\n * Update the position of the rectangle.\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @override\n */\ngoog.graphics.SvgRectElement.prototype.setPosition = function(x, y) {\n  this.getGraphics().setElementAttributes(this.getElement(), {'x': x, 'y': y});\n};\n\n\n/**\n * Update the size of the rectangle.\n * @param {number} width Width of rectangle.\n * @param {number} height Height of rectangle.\n * @override\n */\ngoog.graphics.SvgRectElement.prototype.setSize = function(width, height) {\n  this.getGraphics().setElementAttributes(\n      this.getElement(), {'width': width, 'height': height});\n};\n\n\n\n/**\n * Thin wrapper for SVG path elements.\n * This is an implementation of the goog.graphics.PathElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.SvgGraphics} graphics The graphics creating\n *     this element.\n * @param {goog.graphics.Stroke?} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill?} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.PathElement}\n * @final\n */\ngoog.graphics.SvgPathElement = function(element, graphics, stroke, fill) {\n  goog.graphics.PathElement.call(this, element, graphics, stroke, fill);\n};\ngoog.inherits(goog.graphics.SvgPathElement, goog.graphics.PathElement);\n\n\n/**\n * Update the underlying path.\n * @param {!goog.graphics.Path} path The path object to draw.\n * @override\n */\ngoog.graphics.SvgPathElement.prototype.setPath = function(path) {\n  /** @suppress {missingRequire} goog.graphics.SvgGraphics */\n  this.getGraphics().setElementAttributes(\n      this.getElement(), {'d': goog.graphics.SvgGraphics.getSvgPath(path)});\n};\n\n\n\n/**\n * Thin wrapper for SVG text elements.\n * This is an implementation of the goog.graphics.TextElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.SvgGraphics} graphics The graphics creating\n *     this element.\n * @param {goog.graphics.Stroke?} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill?} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.TextElement}\n * @final\n */\ngoog.graphics.SvgTextElement = function(element, graphics, stroke, fill) {\n  goog.graphics.TextElement.call(this, element, graphics, stroke, fill);\n};\ngoog.inherits(goog.graphics.SvgTextElement, goog.graphics.TextElement);\n\n\n/**\n * Update the displayed text of the element.\n * @param {string} text The text to draw.\n * @override\n */\ngoog.graphics.SvgTextElement.prototype.setText = function(text) {\n  // This is actually SVGTextElement but we don't have it in externs.\n  /** @type {!Text} */ (this.getElement().firstChild).data = text;\n};\n\n\n\n/**\n * Thin wrapper for SVG image elements.\n * This is an implementation of the goog.graphics.ImageElement interface.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.SvgGraphics} graphics The graphics creating\n *     this element.\n * @constructor\n * @extends {goog.graphics.ImageElement}\n * @final\n */\ngoog.graphics.SvgImageElement = function(element, graphics) {\n  goog.graphics.ImageElement.call(this, element, graphics);\n};\ngoog.inherits(goog.graphics.SvgImageElement, goog.graphics.ImageElement);\n\n\n/**\n * Update the position of the image.\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @override\n */\ngoog.graphics.SvgImageElement.prototype.setPosition = function(x, y) {\n  this.getGraphics().setElementAttributes(this.getElement(), {'x': x, 'y': y});\n};\n\n\n/**\n * Update the size of the image.\n * @param {number} width Width of image.\n * @param {number} height Height of image.\n * @override\n */\ngoog.graphics.SvgImageElement.prototype.setSize = function(width, height) {\n  this.getGraphics().setElementAttributes(\n      this.getElement(), {'width': width, 'height': height});\n};\n\n\n/**\n * Update the source of the image.\n * @param {string} src Source of the image.\n * @override\n */\ngoog.graphics.SvgImageElement.prototype.setSource = function(src) {\n  this.getGraphics().setElementAttributes(\n      this.getElement(), {'xlink:href': src});\n};\n","^17",1579837703000,"^18",["^19",["^1X","^1T","^1[","^21","^Z","^27","~$goog.graphics.ImageElement","^28"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/svgelement.js"],"^1J",["^19",["~$goog.graphics.SvgPathElement","~$goog.graphics.SvgTextElement","~$goog.graphics.SvgImageElement","~$goog.graphics.SvgGroupElement","~$goog.graphics.SvgRectElement","~$goog.graphics.SvgEllipseElement"]],"^X",true,"^Y",["^Z","^1T","^1[","^21","^<B","^27","^1X","^28"]],["^ ","^[",[1579837703000],"^10","goog.ui.dimensionpickerrenderer.js","^11",["^12","goog/ui/dimensionpickerrenderer.js"],"^13","goog/ui/dimensionpickerrenderer.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The default renderer for a goog.dom.DimensionPicker.  A\n * dimension picker allows the user to visually select a row and column count.\n * It looks like a palette but in order to minimize DOM load it is rendered.\n * using CSS background tiling instead of as a grid of nodes.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.ui.DimensionPickerRenderer');\n\ngoog.forwardDeclare('goog.ui.DimensionPicker');\ngoog.require('goog.a11y.aria.Announcer');\ngoog.require('goog.a11y.aria.LivePriority');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.i18n.bidi');\ngoog.require('goog.style');\ngoog.require('goog.ui.ControlRenderer');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Default renderer for {@link goog.ui.DimensionPicker}s.  Renders the\n * palette as two divs, one with the un-highlighted background, and one with the\n * highlighted background.\n *\n * @constructor\n * @extends {goog.ui.ControlRenderer}\n */\ngoog.ui.DimensionPickerRenderer = function() {\n  goog.ui.ControlRenderer.call(this);\n\n  /** @private {goog.a11y.aria.Announcer} */\n  this.announcer_ = new goog.a11y.aria.Announcer();\n};\ngoog.inherits(goog.ui.DimensionPickerRenderer, goog.ui.ControlRenderer);\ngoog.addSingletonGetter(goog.ui.DimensionPickerRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.DimensionPickerRenderer.CSS_CLASS =\n    goog.getCssName('goog-dimension-picker');\n\n\n/**\n * Return the underlying div for the given outer element.\n * @param {Element} element The root element.\n * @return {Element} The underlying div.\n * @private\n */\ngoog.ui.DimensionPickerRenderer.prototype.getUnderlyingDiv_ = function(\n    element) {\n  return /** @type {Element} */ (element.firstChild.childNodes[1]);\n};\n\n\n/**\n * Return the highlight div for the given outer element.\n * @param {Element} element The root element.\n * @return {Element} The highlight div.\n * @private\n */\ngoog.ui.DimensionPickerRenderer.prototype.getHighlightDiv_ = function(element) {\n  return /** @type {Element} */ (element.firstChild.lastChild);\n};\n\n\n/**\n * Return the status message div for the given outer element.\n * @param {Element} element The root element.\n * @return {Element} The status message div.\n * @private\n */\ngoog.ui.DimensionPickerRenderer.prototype.getStatusDiv_ = function(element) {\n  return /** @type {Element} */ (element.lastChild);\n};\n\n\n/**\n * Return the invisible mouse catching div for the given outer element.\n * @param {Element} element The root element.\n * @return {Element} The invisible mouse catching div.\n * @private\n */\ngoog.ui.DimensionPickerRenderer.prototype.getMouseCatcher_ = function(element) {\n  return /** @type {Element} */ (element.firstChild.firstChild);\n};\n\n\n/**\n * Overrides {@link goog.ui.ControlRenderer#canDecorate} to allow decorating\n * empty DIVs only.\n * @param {Element} element The element to check.\n * @return {boolean} Whether if the element is an empty div.\n * @override\n */\ngoog.ui.DimensionPickerRenderer.prototype.canDecorate = function(element) {\n  return element.tagName == goog.dom.TagName.DIV && !element.firstChild;\n};\n\n\n/**\n * Overrides {@link goog.ui.ControlRenderer#decorate} to decorate empty DIVs.\n * @param {goog.ui.Control} control goog.ui.DimensionPicker to decorate.\n * @param {Element} element The element to decorate.\n * @return {Element} The decorated element.\n * @override\n */\ngoog.ui.DimensionPickerRenderer.prototype.decorate = function(\n    control, element) {\n  var palette = /** @type {goog.ui.DimensionPicker} */ (control);\n  goog.ui.DimensionPickerRenderer.superClass_.decorate.call(\n      this, palette, element);\n\n  this.addElementContents_(palette, element);\n  this.updateSize(palette, element);\n\n  return element;\n};\n\n\n/**\n * Scales various elements in order to update the palette's size.\n * @param {goog.ui.DimensionPicker} palette The palette object.\n * @param {Element} element The element to set the style of.\n */\ngoog.ui.DimensionPickerRenderer.prototype.updateSize = function(\n    palette, element) {\n  var size = palette.getSize();\n\n  element.style.width = size.width + 'em';\n\n  var underlyingDiv = this.getUnderlyingDiv_(element);\n  underlyingDiv.style.width = size.width + 'em';\n  underlyingDiv.style.height = size.height + 'em';\n\n  if (palette.isRightToLeft()) {\n    this.adjustParentDirection_(palette, element);\n  }\n};\n\n\n/**\n * Adds the appropriate content elements to the given outer DIV.\n * @param {goog.ui.DimensionPicker} palette The palette object.\n * @param {Element} element The element to decorate.\n * @private\n */\ngoog.ui.DimensionPickerRenderer.prototype.addElementContents_ = function(\n    palette, element) {\n  // First we create a single div containing three stacked divs.  The bottom div\n  // catches mouse events.  We can't use document level mouse move detection as\n  // we could lose events to iframes.  This is especially important in Firefox 2\n  // in which TrogEdit creates iframes. The middle div uses a css tiled\n  // background image to represent deselected tiles.  The top div uses a\n  // different css tiled background image to represent selected tiles.\n  var mouseCatcherDiv = palette.getDomHelper().createDom(\n      goog.dom.TagName.DIV,\n      goog.getCssName(this.getCssClass(), 'mousecatcher'));\n  var unhighlightedDiv =\n      palette.getDomHelper().createDom(goog.dom.TagName.DIV, {\n        'class': goog.getCssName(this.getCssClass(), 'unhighlighted'),\n        'style': 'width:100%;height:100%'\n      });\n  var highlightedDiv = palette.getDomHelper().createDom(\n      goog.dom.TagName.DIV, goog.getCssName(this.getCssClass(), 'highlighted'));\n  element.appendChild(\n      palette.getDomHelper().createDom(\n          goog.dom.TagName.DIV, {\n            'style': 'width:100%;height:100%;touch-action:none;'\n          },\n          mouseCatcherDiv, unhighlightedDiv, highlightedDiv));\n\n  // Lastly we add a div to store the text version of the current state.\n  element.appendChild(\n      palette.getDomHelper().createDom(\n          goog.dom.TagName.DIV, goog.getCssName(this.getCssClass(), 'status')));\n};\n\n\n/**\n * Creates a div and adds the appropriate contents to it.\n * @param {goog.ui.Control} control Picker to render.\n * @return {!Element} Root element for the palette.\n * @override\n */\ngoog.ui.DimensionPickerRenderer.prototype.createDom = function(control) {\n  var palette = /** @type {goog.ui.DimensionPicker} */ (control);\n  var classNames = this.getClassNames(palette);\n  // Hide the element from screen readers so they don't announce \"1 of 1\" for\n  // the perceived number of items in the palette.\n  var element = palette.getDomHelper().createDom(\n      goog.dom.TagName.DIV,\n      {'class': classNames ? classNames.join(' ') : '', 'aria-hidden': 'true'});\n  this.addElementContents_(palette, element);\n  this.updateSize(palette, element);\n  return element;\n};\n\n\n/**\n * Initializes the control's DOM when the control enters the document.  Called\n * from {@link goog.ui.Control#enterDocument}.\n * @param {goog.ui.Control} control Palette whose DOM is to be\n *     initialized as it enters the document.\n * @override\n */\ngoog.ui.DimensionPickerRenderer.prototype.initializeDom = function(control) {\n  var palette = /** @type {goog.ui.DimensionPicker} */ (control);\n  goog.ui.DimensionPickerRenderer.superClass_.initializeDom.call(this, palette);\n\n  // Make the displayed highlighted size match the dimension picker's value.\n  var highlightedSize = palette.getValue();\n  this.setHighlightedSize(\n      palette, highlightedSize.width, highlightedSize.height);\n\n  this.positionMouseCatcher(palette);\n};\n\n\n/**\n * Get the element to listen for mouse move events on.\n * @param {goog.ui.DimensionPicker} palette The palette to listen on.\n * @return {Element} The element to listen for mouse move events on.\n */\ngoog.ui.DimensionPickerRenderer.prototype.getMouseMoveElement = function(\n    palette) {\n  return /** @type {Element} */ (palette.getElement().firstChild);\n};\n\n\n/**\n * Returns the x offset in to the grid for the given mouse x position.\n * @param {goog.ui.DimensionPicker} palette The table size palette.\n * @param {number} x The mouse event x position.\n * @return {number} The x offset in to the grid.\n */\ngoog.ui.DimensionPickerRenderer.prototype.getGridOffsetX = function(\n    palette, x) {\n  // TODO(robbyw): Don't rely on magic 18 - measure each palette's em size.\n  return Math.min(palette.maxColumns, Math.ceil(x / 18));\n};\n\n\n/**\n * Returns the y offset in to the grid for the given mouse y position.\n * @param {goog.ui.DimensionPicker} palette The table size palette.\n * @param {number} y The mouse event y position.\n * @return {number} The y offset in to the grid.\n */\ngoog.ui.DimensionPickerRenderer.prototype.getGridOffsetY = function(\n    palette, y) {\n  return Math.min(palette.maxRows, Math.ceil(y / 18));\n};\n\n\n/**\n * Sets the highlighted size. Does nothing if the palette hasn't been rendered.\n * @param {goog.ui.DimensionPicker} palette The table size palette.\n * @param {number} columns The number of columns to highlight.\n * @param {number} rows The number of rows to highlight.\n */\ngoog.ui.DimensionPickerRenderer.prototype.setHighlightedSize = function(\n    palette, columns, rows) {\n  var element = palette.getElement();\n  // Can't update anything if DimensionPicker hasn't been rendered.\n  if (!element) {\n    return;\n  }\n\n  // Style the highlight div.\n  var style = this.getHighlightDiv_(element).style;\n  style.width = columns + 'em';\n  style.height = rows + 'em';\n\n  // Explicitly set style.right so the element grows to the left when increase\n  // in width.\n  if (palette.isRightToLeft()) {\n    style.right = '0';\n  }\n\n  /**\n   * @desc The dimension of the columns and rows currently selected in the\n   * dimension picker, as text that can be spoken by a screen reader.\n   */\n  var MSG_DIMENSION_PICKER_HIGHLIGHTED_DIMENSIONS = goog.getMsg(\n      '{$numCols} by {$numRows}',\n      {'numCols': String(columns), 'numRows': String(rows)});\n  this.announcer_.say(\n      MSG_DIMENSION_PICKER_HIGHLIGHTED_DIMENSIONS,\n      goog.a11y.aria.LivePriority.ASSERTIVE);\n\n  // Update the size text.\n  goog.dom.setTextContent(\n      this.getStatusDiv_(element),\n      goog.i18n.bidi.enforceLtrInText(columns + ' x ' + rows));\n};\n\n\n/**\n * Position the mouse catcher such that it receives mouse events past the\n * selectedsize up to the maximum size.  Takes care to not introduce scrollbars.\n * Should be called on enter document and when the window changes size.\n * @param {goog.ui.DimensionPicker} palette The table size palette.\n */\ngoog.ui.DimensionPickerRenderer.prototype.positionMouseCatcher = function(\n    palette) {\n  var mouseCatcher = this.getMouseCatcher_(palette.getElement());\n  var doc = goog.dom.getOwnerDocument(mouseCatcher);\n  var body = doc.body;\n\n  var position = goog.style.getRelativePosition(mouseCatcher, body);\n\n  // Hide the mouse catcher so it doesn't affect the body's scroll size.\n  mouseCatcher.style.display = 'none';\n\n  // Compute the maximum size the catcher can be without introducing scrolling.\n  var xAvailableEm = (palette.isRightToLeft() && position.x > 0) ?\n      Math.floor(position.x / 18) :\n      Math.floor((body.scrollWidth - position.x) / 18);\n\n  // Computing available height is more complicated - we need to check the\n  // window's inner height.\n  var height;\n  if (goog.userAgent.IE) {\n    // Offset 20px to make up for scrollbar size.\n    height = goog.style.getClientViewportElement(body).scrollHeight - 20;\n  } else {\n    var win = goog.dom.getWindow(doc);\n    // Offset 20px to make up for scrollbar size.\n    height = Math.max(win.innerHeight, body.scrollHeight) - 20;\n  }\n  var yAvailableEm = Math.floor((height - position.y) / 18);\n\n  // Resize and display the mouse catcher.\n  mouseCatcher.style.width = Math.min(palette.maxColumns, xAvailableEm) + 'em';\n  mouseCatcher.style.height = Math.min(palette.maxRows, yAvailableEm) + 'em';\n  mouseCatcher.style.display = '';\n\n  // Explicitly set style.right so the mouse catcher is positioned on the left\n  // side instead of right.\n  if (palette.isRightToLeft()) {\n    mouseCatcher.style.right = '0';\n  }\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.DimensionPickerRenderer.prototype.getCssClass = function() {\n  return goog.ui.DimensionPickerRenderer.CSS_CLASS;\n};\n\n\n/**\n * This function adjusts the positioning from 'left' and 'top' to 'right' and\n * 'top' as appropriate for RTL control.  This is so when the dimensionpicker\n * grow in width, the containing element grow to the left instead of right.\n * This won't be necessary if goog.ui.SubMenu rendering code would position RTL\n * control with 'right' and 'top'.\n * @private\n *\n * @param {goog.ui.DimensionPicker} palette The palette object.\n * @param {Element} element The palette's element.\n */\ngoog.ui.DimensionPickerRenderer.prototype.adjustParentDirection_ = function(\n    palette, element) {\n  var parent = palette.getParent();\n  if (parent) {\n    var parentElement = parent.getElement();\n\n    // Anchors the containing element to the right so it grows to the left\n    // when it increase in width.\n    var right = goog.style.getStyle(parentElement, 'right');\n    if (right == '') {\n      var parentPos = goog.style.getPosition(parentElement);\n      var parentSize = goog.style.getSize(parentElement);\n      if (parentSize.width != 0 && parentPos.x != 0) {\n        var visibleRect =\n            goog.style.getBounds(goog.style.getClientViewportElement());\n        var visibleWidth = visibleRect.width;\n        right = visibleWidth - parentPos.x - parentSize.width;\n        goog.style.setStyle(parentElement, 'right', right + 'px');\n      }\n    }\n\n    // When a table is inserted, the containing elemet's position is\n    // recalculated the next time it shows, set left back to '' to prevent\n    // extra white space on the left.\n    var left = goog.style.getStyle(parentElement, 'left');\n    if (left != '') {\n      goog.style.setStyle(parentElement, 'left', '');\n    }\n  } else {\n    goog.style.setStyle(element, 'right', '0px');\n  }\n};\n","^17",1579837703000,"^18",["^19",["^1T","^<>","^Z","^2X","^;P","^<?","~$goog.i18n.bidi","^29","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/dimensionpickerrenderer.js"],"^1J",["^19",["~$goog.ui.DimensionPickerRenderer"]],"^X",true,"^Y",["^Z","^<?","^<>","^1T","^1V","^<I","^29","^;P","^2X"]],["^ ","^[",[1579837703000],"^10","goog.ui.menuitemrenderer.js","^11",["^12","goog/ui/menuitemrenderer.js"],"^13","goog/ui/menuitemrenderer.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for {@link goog.ui.MenuItem}s.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.MenuItemRenderer');\n\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.ControlRenderer');\n\n\n\n/**\n * Default renderer for {@link goog.ui.MenuItem}s.  Each item has the following\n * structure:\n *\n *    <div class=\"goog-menuitem\">\n *      <div class=\"goog-menuitem-content\">\n *        ...(menu item contents)...\n *      </div>\n *    </div>\n *\n * @constructor\n * @extends {goog.ui.ControlRenderer}\n */\ngoog.ui.MenuItemRenderer = function() {\n  goog.ui.ControlRenderer.call(this);\n\n  /**\n   * Commonly used CSS class names, cached here for convenience (and to avoid\n   * unnecessary string concatenation).\n   * @type {!Array<string>}\n   * @private\n   */\n  this.classNameCache_ = [];\n};\ngoog.inherits(goog.ui.MenuItemRenderer, goog.ui.ControlRenderer);\ngoog.addSingletonGetter(goog.ui.MenuItemRenderer);\n\n\n/**\n * CSS class name the renderer applies to menu item elements.\n * @type {string}\n */\ngoog.ui.MenuItemRenderer.CSS_CLASS = goog.getCssName('goog-menuitem');\n\n\n/**\n * Constants for referencing composite CSS classes.\n * @enum {number}\n * @private\n */\ngoog.ui.MenuItemRenderer.CompositeCssClassIndex_ = {\n  HOVER: 0,\n  CHECKBOX: 1,\n  CONTENT: 2\n};\n\n\n/**\n * Returns the composite CSS class by using the cached value or by constructing\n * the value from the base CSS class and the passed index.\n * @param {goog.ui.MenuItemRenderer.CompositeCssClassIndex_} index Index for the\n *     CSS class - could be highlight, checkbox or content in usual cases.\n * @return {string} The composite CSS class.\n * @private\n */\ngoog.ui.MenuItemRenderer.prototype.getCompositeCssClass_ = function(index) {\n  var result = this.classNameCache_[index];\n  if (!result) {\n    switch (index) {\n      case goog.ui.MenuItemRenderer.CompositeCssClassIndex_.HOVER:\n        result = goog.getCssName(this.getStructuralCssClass(), 'highlight');\n        break;\n      case goog.ui.MenuItemRenderer.CompositeCssClassIndex_.CHECKBOX:\n        result = goog.getCssName(this.getStructuralCssClass(), 'checkbox');\n        break;\n      case goog.ui.MenuItemRenderer.CompositeCssClassIndex_.CONTENT:\n        result = goog.getCssName(this.getStructuralCssClass(), 'content');\n        break;\n    }\n    this.classNameCache_[index] = result;\n  }\n\n  return result;\n};\n\n\n/** @override */\ngoog.ui.MenuItemRenderer.prototype.getAriaRole = function() {\n  return goog.a11y.aria.Role.MENU_ITEM;\n};\n\n\n/**\n * Overrides {@link goog.ui.ControlRenderer#createDom} by adding extra markup\n * and stying to the menu item's element if it is selectable or checkable.\n * @param {goog.ui.Control} item Menu item to render.\n * @return {Element} Root element for the item.\n * @override\n */\ngoog.ui.MenuItemRenderer.prototype.createDom = function(item) {\n  var element = item.getDomHelper().createDom(\n      goog.dom.TagName.DIV, this.getClassNames(item).join(' '),\n      this.createContent(item.getContent(), item.getDomHelper()));\n  this.setEnableCheckBoxStructure(\n      item, element, item.isSupportedState(goog.ui.Component.State.SELECTED) ||\n          item.isSupportedState(goog.ui.Component.State.CHECKED));\n  return element;\n};\n\n\n/** @override */\ngoog.ui.MenuItemRenderer.prototype.getContentElement = function(element) {\n  return /** @type {Element} */ (element && element.firstChild);\n};\n\n\n/**\n * Overrides {@link goog.ui.ControlRenderer#decorate} by initializing the\n * menu item to checkable based on whether the element to be decorated has\n * extra stying indicating that it should be.\n * @param {goog.ui.Control} item Menu item instance to decorate the element.\n * @param {Element} element Element to decorate.\n * @return {Element} Decorated element.\n * @override\n */\ngoog.ui.MenuItemRenderer.prototype.decorate = function(item, element) {\n  goog.asserts.assert(element);\n  if (!this.hasContentStructure(element)) {\n    element.appendChild(\n        this.createContent(element.childNodes, item.getDomHelper()));\n  }\n  if (goog.dom.classlist.contains(element, goog.getCssName('goog-option'))) {\n    (/** @type {goog.ui.MenuItem} */ (item)).setCheckable(true);\n    this.setCheckable(item, element, true);\n  }\n  return goog.ui.MenuItemRenderer.superClass_.decorate.call(\n      this, item, element);\n};\n\n\n/**\n * Takes a menu item's root element, and sets its content to the given text\n * caption or DOM structure.  Overrides the superclass immplementation by\n * making sure that the checkbox structure (for selectable/checkable menu\n * items) is preserved.\n * @param {Element} element The item's root element.\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to be\n *     set as the item's content.\n * @override\n */\ngoog.ui.MenuItemRenderer.prototype.setContent = function(element, content) {\n  // Save the checkbox element, if present.\n  var contentElement = this.getContentElement(element);\n  var checkBoxElement =\n      this.hasCheckBoxStructure(element) ? contentElement.firstChild : null;\n  goog.ui.MenuItemRenderer.superClass_.setContent.call(this, element, content);\n  if (checkBoxElement && !this.hasCheckBoxStructure(element)) {\n    // The call to setContent() blew away the checkbox element; reattach it.\n    contentElement.insertBefore(\n        checkBoxElement, contentElement.firstChild || null);\n  }\n};\n\n\n/**\n * Returns true if the element appears to have a proper menu item structure by\n * checking whether its first child has the appropriate structural class name.\n * @param {Element} element Element to check.\n * @return {boolean} Whether the element appears to have a proper menu item DOM.\n * @protected\n */\ngoog.ui.MenuItemRenderer.prototype.hasContentStructure = function(element) {\n  var child = goog.dom.getFirstElementChild(element);\n  var contentClassName = this.getCompositeCssClass_(\n      goog.ui.MenuItemRenderer.CompositeCssClassIndex_.CONTENT);\n  return !!child && goog.dom.classlist.contains(child, contentClassName);\n};\n\n\n/**\n * Wraps the given text caption or existing DOM node(s) in a structural element\n * containing the menu item's contents.\n * @param {goog.ui.ControlContent} content Menu item contents.\n * @param {goog.dom.DomHelper} dom DOM helper for document interaction.\n * @return {Element} Menu item content element.\n * @protected\n */\ngoog.ui.MenuItemRenderer.prototype.createContent = function(content, dom) {\n  var contentClassName = this.getCompositeCssClass_(\n      goog.ui.MenuItemRenderer.CompositeCssClassIndex_.CONTENT);\n  return dom.createDom(goog.dom.TagName.DIV, contentClassName, content);\n};\n\n\n/**\n * Enables/disables radio button semantics on the menu item.\n * @param {goog.ui.Control} item Menu item to update.\n * @param {Element} element Menu item element to update (may be null if the\n *     item hasn't been rendered yet).\n * @param {boolean} selectable Whether the item should be selectable.\n */\ngoog.ui.MenuItemRenderer.prototype.setSelectable = function(\n    item, element, selectable) {\n  if (item && element) {\n    this.setEnableCheckBoxStructure(item, element, selectable);\n  }\n};\n\n\n/**\n * Enables/disables checkbox semantics on the menu item.\n * @param {goog.ui.Control} item Menu item to update.\n * @param {Element} element Menu item element to update (may be null if the\n *     item hasn't been rendered yet).\n * @param {boolean} checkable Whether the item should be checkable.\n */\ngoog.ui.MenuItemRenderer.prototype.setCheckable = function(\n    item, element, checkable) {\n  if (item && element) {\n    this.setEnableCheckBoxStructure(item, element, checkable);\n  }\n};\n\n\n/**\n * Determines whether the item contains a checkbox element.\n * @param {Element} element Menu item root element.\n * @return {boolean} Whether the element contains a checkbox element.\n * @protected\n */\ngoog.ui.MenuItemRenderer.prototype.hasCheckBoxStructure = function(element) {\n  var contentElement = this.getContentElement(element);\n  if (contentElement) {\n    var child = contentElement.firstChild;\n    var checkboxClassName = this.getCompositeCssClass_(\n        goog.ui.MenuItemRenderer.CompositeCssClassIndex_.CHECKBOX);\n    return !!child && goog.dom.isElement(child) &&\n        goog.dom.classlist.contains(\n            /** @type {!Element} */ (child), checkboxClassName);\n  }\n  return false;\n};\n\n\n/**\n * Adds or removes extra markup and CSS styling to the menu item to make it\n * selectable or non-selectable, depending on the value of the\n * `selectable` argument.\n * @param {!goog.ui.Control} item Menu item to update.\n * @param {!Element} element Menu item element to update.\n * @param {boolean} enable Whether to add or remove the checkbox structure.\n * @protected\n */\ngoog.ui.MenuItemRenderer.prototype.setEnableCheckBoxStructure = function(\n    item, element, enable) {\n  this.setAriaRole(element, item.getPreferredAriaRole());\n  this.setAriaStates(item, element);\n  if (enable != this.hasCheckBoxStructure(element)) {\n    goog.dom.classlist.enable(element, goog.getCssName('goog-option'), enable);\n    var contentElement = this.getContentElement(element);\n    if (enable) {\n      // Insert checkbox structure.\n      var checkboxClassName = this.getCompositeCssClass_(\n          goog.ui.MenuItemRenderer.CompositeCssClassIndex_.CHECKBOX);\n      contentElement.insertBefore(\n          item.getDomHelper().createDom(\n              goog.dom.TagName.DIV, checkboxClassName),\n          contentElement.firstChild || null);\n    } else {\n      // Remove checkbox structure.\n      contentElement.removeChild(contentElement.firstChild);\n    }\n  }\n};\n\n\n/**\n * Takes a single {@link goog.ui.Component.State}, and returns the\n * corresponding CSS class name (null if none).  Overrides the superclass\n * implementation by using 'highlight' as opposed to 'hover' as the CSS\n * class name suffix for the HOVER state, for backwards compatibility.\n * @param {goog.ui.Component.State} state Component state.\n * @return {string|undefined} CSS class representing the given state\n *     (undefined if none).\n * @override\n */\ngoog.ui.MenuItemRenderer.prototype.getClassForState = function(state) {\n  switch (state) {\n    case goog.ui.Component.State.HOVER:\n      // We use 'highlight' as the suffix, for backwards compatibility.\n      return this.getCompositeCssClass_(\n          goog.ui.MenuItemRenderer.CompositeCssClassIndex_.HOVER);\n    case goog.ui.Component.State.CHECKED:\n    case goog.ui.Component.State.SELECTED:\n      // We use 'goog-option-selected' as the class, for backwards\n      // compatibility.\n      return goog.getCssName('goog-option-selected');\n    default:\n      return goog.ui.MenuItemRenderer.superClass_.getClassForState.call(\n          this, state);\n  }\n};\n\n\n/**\n * Takes a single CSS class name which may represent a component state, and\n * returns the corresponding component state (0x00 if none).  Overrides the\n * superclass implementation by treating 'goog-option-selected' as special,\n * for backwards compatibility.\n * @param {string} className CSS class name, possibly representing a component\n *     state.\n * @return {goog.ui.Component.State} state Component state corresponding\n *     to the given CSS class (0x00 if none).\n * @override\n */\ngoog.ui.MenuItemRenderer.prototype.getStateFromClass = function(className) {\n  var hoverClassName = this.getCompositeCssClass_(\n      goog.ui.MenuItemRenderer.CompositeCssClassIndex_.HOVER);\n  switch (className) {\n    case goog.getCssName('goog-option-selected'):\n      return goog.ui.Component.State.CHECKED;\n    case hoverClassName:\n      return goog.ui.Component.State.HOVER;\n    default:\n      return goog.ui.MenuItemRenderer.superClass_.getStateFromClass.call(\n          this, className);\n  }\n};\n\n\n/** @override */\ngoog.ui.MenuItemRenderer.prototype.getCssClass = function() {\n  return goog.ui.MenuItemRenderer.CSS_CLASS;\n};\n","^17",1579837703000,"^18",["^19",["^1S","^1T","^2O","^22","^2U","^Z","^;P","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/menuitemrenderer.js"],"^1J",["^19",["^65"]],"^X",true,"^Y",["^Z","^2U","^1S","^1T","^1V","^2O","^22","^;P"]],["^ ","^[",[1579837703000],"^10","goog.ui.tree.treenode.js","^11",["^12","goog/ui/tree/treenode.js"],"^13","goog/ui/tree/treenode.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the goog.ui.tree.TreeNode class.\n *\n * @author arv@google.com (Erik Arvidsson)\n * @author eae@google.com (Emil A Eklund)\n *\n * This is a based on the webfx tree control. See file comment in\n * treecontrol.js.\n */\n\ngoog.provide('goog.ui.tree.TreeNode');\n\ngoog.forwardDeclare('goog.ui.tree.TreeControl');\ngoog.require('goog.ui.tree.BaseNode');  // circular\n\n\n\n/**\n * A single node in the tree.\n * @param {string|!goog.html.SafeHtml} content The content of the node label.\n *     Strings are treated as plain-text and will be HTML escaped.\n * @param {Object=} opt_config The configuration for the tree. See\n *    goog.ui.tree.TreeControl.defaultConfig. If not specified, a default config\n *    will be used.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.tree.BaseNode}\n */\ngoog.ui.tree.TreeNode = function(content, opt_config, opt_domHelper) {\n  goog.ui.tree.BaseNode.call(this, content, opt_config, opt_domHelper);\n};\ngoog.inherits(goog.ui.tree.TreeNode, goog.ui.tree.BaseNode);\n\n\n/**\n * Returns the tree.\n * @return {?goog.ui.tree.TreeControl} The tree.\n * @override\n */\ngoog.ui.tree.TreeNode.prototype.getTree = function() {\n  if (this.tree) {\n    return this.tree;\n  }\n  var parent = this.getParent();\n  if (parent) {\n    var tree = parent.getTree();\n    if (tree) {\n      this.setTreeInternal(tree);\n      return tree;\n    }\n  }\n  return null;\n};\n\n\n/**\n * Returns the source for the icon.\n * @return {string} Src for the icon.\n * @override\n */\ngoog.ui.tree.TreeNode.prototype.getCalculatedIconClass = function() {\n  var expanded = this.getExpanded();\n  var expandedIconClass = this.getExpandedIconClass();\n  if (expanded && expandedIconClass) {\n    return expandedIconClass;\n  }\n  var iconClass = this.getIconClass();\n  if (!expanded && iconClass) {\n    return iconClass;\n  }\n\n  // fall back on default icons\n  var config = this.getConfig();\n  if (this.hasChildren()) {\n    if (expanded && config.cssExpandedFolderIcon) {\n      return config.cssTreeIcon + ' ' + config.cssExpandedFolderIcon;\n    } else if (!expanded && config.cssCollapsedFolderIcon) {\n      return config.cssTreeIcon + ' ' + config.cssCollapsedFolderIcon;\n    }\n  } else {\n    if (config.cssFileIcon) {\n      return config.cssTreeIcon + ' ' + config.cssFileIcon;\n    }\n  }\n  return '';\n};\n","^17",1579837703000,"^18",["^19",["~$goog.ui.tree.BaseNode","^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/tree/treenode.js"],"^1J",["^19",["~$goog.ui.tree.TreeNode"]],"^X",true,"^Y",["^Z","^<K"]],["^ ","^[",[1579837703000],"^10","goog.db.indexeddb.js","^11",["^12","goog/db/indexeddb.js"],"^13","goog/db/indexeddb.js","^14","^15","^16","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Wrapper for an IndexedDB database.\n *\n */\n\n\ngoog.provide('goog.db.IndexedDb');\n\ngoog.require('goog.db.Error');\ngoog.require('goog.db.ObjectStore');\ngoog.require('goog.db.Transaction');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\n\n\n\n/**\n * Creates an IDBDatabase wrapper object. The database object has methods for\n * setting the version to change the structure of the database and for creating\n * transactions to get or modify the stored records. Should not be created\n * directly, call {@link goog.db.openDatabase} to set up the connection.\n *\n * @param {!IDBDatabase} db Underlying IndexedDB database object.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.db.IndexedDb = function(db) {\n  goog.db.IndexedDb.base(this, 'constructor');\n\n  /**\n   * Underlying IndexedDB database object.\n   *\n   * @type {!IDBDatabase}\n   * @private\n   */\n  this.db_ = db;\n\n  /**\n   * Internal event handler that listens to IDBDatabase events.\n   * @type {!goog.events.EventHandler<!goog.db.IndexedDb>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  this.eventHandler_.listen(\n      this.db_, goog.db.IndexedDb.EventType.ABORT,\n      goog.bind(this.dispatchEvent, this, goog.db.IndexedDb.EventType.ABORT));\n  this.eventHandler_.listen(\n      this.db_, goog.db.IndexedDb.EventType.ERROR, this.dispatchError_);\n  this.eventHandler_.listen(\n      this.db_, goog.db.IndexedDb.EventType.VERSION_CHANGE,\n      this.dispatchVersionChange_);\n  this.eventHandler_.listen(\n      this.db_, goog.db.IndexedDb.EventType.CLOSE,\n      goog.bind(this.dispatchEvent, this, goog.db.IndexedDb.EventType.CLOSE));\n};\ngoog.inherits(goog.db.IndexedDb, goog.events.EventTarget);\n\n\n/**\n * True iff the database connection is open.\n *\n * @type {boolean}\n * @private\n */\ngoog.db.IndexedDb.prototype.open_ = true;\n\n\n/**\n * Dispatches a wrapped error event based on the given event.\n *\n * @param {!Event} ev The error event given to the underlying IDBDatabase.\n * @private\n */\ngoog.db.IndexedDb.prototype.dispatchError_ = function(ev) {\n  const idbRequest = /** @type {?IDBRequest} */ (ev.target);\n  const domError = idbRequest && idbRequest.error;\n  const /** ?number */ errorCode = domError && domError.severity;\n  this.dispatchEvent({\n    type: goog.db.IndexedDb.EventType.ERROR,\n    errorCode: errorCode,\n  });\n};\n\n\n/**\n * Dispatches a wrapped version change event based on the given event.\n *\n * @param {Event} ev The version change event given to the underlying\n *     IDBDatabase.\n * @private\n */\ngoog.db.IndexedDb.prototype.dispatchVersionChange_ = function(ev) {\n  this.dispatchEvent(\n      new goog.db.IndexedDb.VersionChangeEvent(ev.oldVersion, ev.newVersion));\n};\n\n\n/**\n * Closes the database connection. Metadata queries can still be made after this\n * method is called, but otherwise this wrapper should not be used further.\n */\ngoog.db.IndexedDb.prototype.close = function() {\n  if (this.open_) {\n    this.db_.close();\n    this.open_ = false;\n  }\n};\n\n\n/**\n * @return {boolean} Whether a connection is open and the database can be used.\n */\ngoog.db.IndexedDb.prototype.isOpen = function() {\n  return this.open_;\n};\n\n\n/**\n * @return {string} The name of this database.\n */\ngoog.db.IndexedDb.prototype.getName = function() {\n  return this.db_.name;\n};\n\n\n/**\n * @return {number} The current database version.\n */\ngoog.db.IndexedDb.prototype.getVersion = function() {\n  // TODO(bradfordcsmith): drop Number() call once closure compiler's externs\n  // are updated\n  return Number(this.db_.version);\n};\n\n\n/**\n * @return {DOMStringList} List of object stores in this database.\n */\ngoog.db.IndexedDb.prototype.getObjectStoreNames = function() {\n  return this.db_.objectStoreNames;\n};\n\n\n/**\n * Creates an object store in this database. Can only be called inside a\n * {@link goog.db.UpgradeNeededCallback}.\n *\n * @param {string} name Name for the new object store.\n * @param {!IDBObjectStoreParameters=} opt_params Options object.\n *     The available options are:\n *     keyPath, which is a string and determines what object attribute\n *     to use as the key when storing objects in this object store; and\n *     autoIncrement, which is a boolean, which defaults to false and determines\n *     whether the object store should automatically generate keys for stored\n *     objects. If keyPath is not provided and autoIncrement is false, then all\n *     insert operations must provide a key as a parameter.\n * @return {!goog.db.ObjectStore} The newly created object store.\n * @throws {goog.db.Error} If there's a problem creating the object store.\n */\ngoog.db.IndexedDb.prototype.createObjectStore = function(name, opt_params) {\n  try {\n    return new goog.db.ObjectStore(\n        this.db_.createObjectStore(name, opt_params));\n  } catch (ex) {\n    throw goog.db.Error.fromException(ex, 'creating object store ' + name);\n  }\n};\n\n\n/**\n * Deletes an object store. Can only be called inside a\n * {@link goog.db.UpgradeNeededCallback}.\n *\n * @param {string} name Name of the object store to delete.\n * @throws {goog.db.Error} If there's a problem deleting the object store.\n */\ngoog.db.IndexedDb.prototype.deleteObjectStore = function(name) {\n  try {\n    this.db_.deleteObjectStore(name);\n  } catch (ex) {\n    throw goog.db.Error.fromException(ex, 'deleting object store ' + name);\n  }\n};\n\n\n/**\n * Creates a new transaction.\n *\n * @param {!Array<string>} storeNames A list of strings that contains the\n *     transaction's scope, the object stores that this transaction can operate\n *     on.\n * @param {goog.db.Transaction.TransactionMode=} opt_mode The mode of the\n *     transaction. If not present, the default is READ_ONLY.\n * @return {!goog.db.Transaction} The wrapper for the newly created transaction.\n * @throws {goog.db.Error} If there's a problem creating the transaction.\n */\ngoog.db.IndexedDb.prototype.createTransaction = function(storeNames, opt_mode) {\n  try {\n    // IndexedDB on Chrome 22+ requires that opt_mode not be passed rather than\n    // be explicitly passed as undefined.\n    var transaction = opt_mode ? this.db_.transaction(storeNames, opt_mode) :\n                                 this.db_.transaction(storeNames);\n    return new goog.db.Transaction(transaction, this);\n  } catch (ex) {\n    throw goog.db.Error.fromException(ex, 'creating transaction');\n  }\n};\n\n\n/** @override */\ngoog.db.IndexedDb.prototype.disposeInternal = function() {\n  goog.db.IndexedDb.base(this, 'disposeInternal');\n  this.eventHandler_.dispose();\n};\n\n\n/**\n * Event types fired by a database.\n *\n * @enum {string} The event types for the web socket.\n */\ngoog.db.IndexedDb.EventType = {\n\n  /**\n   * Fired when a transaction is aborted and the event bubbles to its database.\n   */\n  ABORT: 'abort',\n\n  /**\n   * Fired when the database connection is forcibly closed by the browser,\n   * without an explicit call to IDBDatabase#close. This behavior is not in the\n   * spec yet but will be added since it is necessary, see\n   * https://www.w3.org/Bugs/Public/show_bug.cgi?id=22540.\n   */\n  CLOSE: 'close',\n\n  /**\n   * Fired when a transaction has an error.\n   */\n  ERROR: 'error',\n\n  /**\n   * Fired when someone (possibly in another window) is attempting to modify the\n   * structure of the database. Since a change can only be made when there are\n   * no active database connections, this usually means that the database should\n   * be closed so that the other client can make its changes.\n   */\n  VERSION_CHANGE: 'versionchange'\n};\n\n\n\n/**\n * Event representing a (possibly attempted) change in the database structure.\n *\n * At time of writing, no Chrome versions support oldVersion or newVersion. See\n * http://crbug.com/153122.\n *\n * @param {number} oldVersion The previous version of the database.\n * @param {number} newVersion The version the database is being or has been\n *     updated to.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.db.IndexedDb.VersionChangeEvent = function(oldVersion, newVersion) {\n  goog.db.IndexedDb.VersionChangeEvent.base(\n      this, 'constructor', goog.db.IndexedDb.EventType.VERSION_CHANGE);\n\n  /**\n   * The previous version of the database.\n   * @type {number}\n   */\n  this.oldVersion = oldVersion;\n\n  /**\n   * The version the database is being or has been updated to.\n   * @type {number}\n   */\n  this.newVersion = newVersion;\n};\ngoog.inherits(goog.db.IndexedDb.VersionChangeEvent, goog.events.Event);\n","^17",1579837703000,"^18",["^19",["~$goog.db.ObjectStore","~$goog.db.Transaction","^2L","^4P","^Z","^2W","~$goog.events.Event"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/db/indexeddb.js"],"^1J",["^19",["~$goog.db.IndexedDb"]],"^X",true,"^Y",["^Z","^4P","^<M","^<N","^<O","^2L","^2W"]],["^ ","^[",[1579837703000],"^10","goog.date.relativecommontests.js","^11",["^12","goog/date/relativecommontests.js"],"^13","goog/date/relativecommontests.js","^14","^15","^16","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.date.relativeCommonTests');\ngoog.setTestOnly('goog.date.relativeCommonTests');\n\ngoog.require('goog.date.DateTime');\ngoog.require('goog.date.relative');\ngoog.require('goog.i18n.DateTimeFormat');\ngoog.require('goog.i18n.DateTimePatterns_ar');\ngoog.require('goog.i18n.DateTimePatterns_bn');\ngoog.require('goog.i18n.DateTimePatterns_es');\ngoog.require('goog.i18n.DateTimePatterns_fa');\ngoog.require('goog.i18n.DateTimePatterns_fr');\ngoog.require('goog.i18n.DateTimePatterns_no');\ngoog.require('goog.i18n.DateTimeSymbols_ar');\ngoog.require('goog.i18n.DateTimeSymbols_bn');\ngoog.require('goog.i18n.DateTimeSymbols_es');\ngoog.require('goog.i18n.DateTimeSymbols_fa');\ngoog.require('goog.i18n.DateTimeSymbols_fr');\ngoog.require('goog.i18n.DateTimeSymbols_no');\ngoog.require('goog.i18n.NumberFormatSymbols_bn');\ngoog.require('goog.i18n.NumberFormatSymbols_en');\ngoog.require('goog.i18n.NumberFormatSymbols_fa');\ngoog.require('goog.i18n.NumberFormatSymbols_no');\ngoog.require('goog.i18n.relativeDateTimeSymbols');\ngoog.require('goog.testing.PropertyReplacer');\ngoog.require('goog.testing.jsunit');\n\n\n// Testing stubs that autoreset after each test run.\nvar stubs = new goog.testing.PropertyReplacer();\n\n// Timestamp to base times for test on.\nvar baseTime = new Date(2009, 2, 23, 14, 31, 6).getTime();\n\nvar RelativeDateTimeSymbols;\n\nvar propertyReplacer = new goog.testing.PropertyReplacer();\n\nfunction setUpPage() {\n  // Ensure goog.now returns a constant timestamp.\n  propertyReplacer.replace(goog, 'now', function() {\n    return baseTime;\n  });\n  propertyReplacer.replace(goog, 'LOCALE', 'en-US');\n\n  RelativeDateTimeSymbols =\n      goog.module.get('goog.i18n.relativeDateTimeSymbols');\n}\n\nfunction setUp() {\n  propertyReplacer.replace(goog, 'LOCALE', 'en-US');\n  goog.i18n.NumberFormatSymbols = goog.i18n.NumberFormatSymbols_en;\n}\n\nfunction tearDown() {\n  stubs.reset();\n\n  // Resets state to default English\n  RelativeDateTimeSymbols.setRelativeDateTimeSymbols(\n      RelativeDateTimeSymbols.RelativeDateTimeSymbols_en);\n}\n\nfunction testFormatRelativeForPastDates() {\n  var fn = goog.date.relative.format;\n\n  assertEquals(\n      'Should round seconds to the minute below', '0 minutes ago',\n      fn(timestamp('23 March 2009 14:30:10')));\n\n  assertEquals(\n      'Should round seconds to the minute below', '1 minute ago',\n      fn(timestamp('23 March 2009 14:29:56')));\n\n  assertEquals(\n      'Should round seconds to the minute below', '2 minutes ago',\n      fn(timestamp('23 March 2009 14:29:00')));\n\n  assertEquals('10 minutes ago', fn(timestamp('23 March 2009 14:20:10')));\n  assertEquals('59 minutes ago', fn(timestamp('23 March 2009 13:31:42')));\n  assertEquals('2 hours ago', fn(timestamp('23 March 2009 12:20:56')));\n  assertEquals('23 hours ago', fn(timestamp('22 March 2009 15:30:56')));\n  assertEquals('1 day ago', fn(timestamp('22 March 2009 12:11:04')));\n  assertEquals('1 day ago', fn(timestamp('22 March 2009 00:00:00')));\n  assertEquals('2 days ago', fn(timestamp('21 March 2009 23:59:59')));\n  assertEquals('2 days ago', fn(timestamp('21 March 2009 10:30:56')));\n  assertEquals('2 days ago', fn(timestamp('21 March 2009 00:00:00')));\n  assertEquals('3 days ago', fn(timestamp('20 March 2009 23:59:59')));\n}\n\nfunction testFormatRelativeForFutureDates() {\n  var fn = goog.date.relative.format;\n\n  assertEquals(\n      'Should round seconds to the minute below', 'in 1 minute',\n      fn(timestamp('23 March 2009 14:32:05')));\n\n  assertEquals(\n      'Should round seconds to the minute below', 'in 2 minutes',\n      fn(timestamp('23 March 2009 14:33:00')));\n\n  assertEquals('in 1 minute', fn(timestamp('23 March 2009 14:32:00')));\n  assertEquals('in 10 minutes', fn(timestamp('23 March 2009 14:40:10')));\n  assertEquals('in 59 minutes', fn(timestamp('23 March 2009 15:29:15')));\n  assertEquals('in 2 hours', fn(timestamp('23 March 2009 17:20:56')));\n  assertEquals('in 23 hours', fn(timestamp('24 March 2009 13:30:56')));\n  assertEquals('in 1 day', fn(timestamp('24 March 2009 14:31:07')));\n  assertEquals('in 1 day', fn(timestamp('24 March 2009 16:11:04')));\n  assertEquals('in 1 day', fn(timestamp('24 March 2009 23:59:59')));\n  assertEquals('in 2 days', fn(timestamp('25 March 2009 00:00:00')));\n  assertEquals('in 2 days', fn(timestamp('25 March 2009 10:30:56')));\n  assertEquals('in 2 days', fn(timestamp('25 March 2009 23:59:59')));\n  assertEquals('in 3 days', fn(timestamp('26 March 2009 00:00:00')));\n}\n\n\nfunction testFormatPast() {\n  var fn = goog.date.relative.formatPast;\n\n  assertEquals('59 minutes ago', fn(timestamp('23 March 2009 13:31:42')));\n  assertEquals('0 minutes ago', fn(timestamp('23 March 2009 14:32:05')));\n  assertEquals('0 minutes ago', fn(timestamp('23 March 2009 14:33:00')));\n  assertEquals('0 minutes ago', fn(timestamp('25 March 2009 10:30:56')));\n}\n\n\nfunction testFormatDayNotShort() {\n  stubs.set(goog.date.relative, 'monthDateFormatter_', null);\n\n  var fn = goog.date.relative.formatDay;\n  assertEquals('Sep 25', fn(timestamp('25 September 2009 10:31:06')));\n  assertEquals('Mar 25', fn(timestamp('25 March 2009 00:12:19')));\n}\n\nfunction testFormatDay() {\n  stubs.set(goog.date.relative, 'monthDateFormatter_', null);\n\n  var fn = goog.date.relative.formatDay;\n  var formatter =\n      new goog.i18n.DateTimeFormat(goog.i18n.DateTimeFormat.Format.SHORT_DATE);\n  var format = goog.bind(formatter.format, formatter);\n\n  assertEquals('Sep 25', fn(timestamp('25 September 2009 10:31:06')));\n  assertEquals('Mar 25', fn(timestamp('25 March 2009 00:12:19')));\n\n  goog.date.relative.setCasingMode(false);\n  assertEquals('tomorrow', fn(timestamp('24 March 2009 10:31:06')));\n  assertEquals('tomorrow', fn(timestamp('24 March 2009 00:12:19')));\n  assertEquals('today', fn(timestamp('23 March 2009 10:31:06')));\n  assertEquals('today', fn(timestamp('23 March 2009 00:12:19')));\n  assertEquals('yesterday', fn(timestamp('22 March 2009 23:48:12')));\n  assertEquals('yesterday', fn(timestamp('22 March 2009 04:11:23')));\n  assertEquals('Mar 21', fn(timestamp('21 March 2009 15:54:45')));\n  assertEquals('Mar 19', fn(timestamp('19 March 2009 01:22:11')));\n\n  // Test that a formatter can also be accepted as input.\n  goog.date.relative.setCasingMode(true);\n\n  assertEquals('Tomorrow', fn(timestamp('24 March 2009 10:31:06')));\n  assertEquals('Tomorrow', fn(timestamp('24 March 2009 00:12:19')));\n  assertEquals('Today', fn(timestamp('23 March 2009 10:31:06'), format));\n  assertEquals('Today', fn(timestamp('23 March 2009 00:12:19'), format));\n  assertEquals('Yesterday', fn(timestamp('22 March 2009 23:48:12'), format));\n  assertEquals('Yesterday', fn(timestamp('22 March 2009 04:11:23'), format));\n\n  goog.date.relative.setCasingMode(false);\n  assertEquals('today', fn(timestamp('23 March 2009 10:31:06'), format));\n  assertEquals('today', fn(timestamp('23 March 2009 00:12:19'), format));\n  assertEquals('yesterday', fn(timestamp('22 March 2009 23:48:12'), format));\n  assertEquals('yesterday', fn(timestamp('22 March 2009 04:11:23'), format));\n\n  var expected = format(gdatetime(timestamp('21 March 2009 15:54:45')));\n  assertEquals(expected, fn(timestamp('21 March 2009 15:54:45'), format));\n  expected = format(gdatetime(timestamp('19 March 2009 01:22:11')));\n  assertEquals(expected, fn(timestamp('19 March 2009 01:22:11'), format));\n\n  expected = format(gdatetime(timestamp('1 January 2010 01:22:11')));\n  assertEquals(expected, fn(timestamp('1 January 2010 01:22:11'), format));\n}\n\nfunction testGetDateString() {\n  var fn = goog.date.relative.getDateString;\n\n  assertEquals(\n      '2:21 PM (10 minutes ago)', fn(new Date(baseTime - 10 * 60 * 1000)));\n  assertEquals(\n      '4:31 AM (10 hours ago)', fn(new Date(baseTime - 10 * 60 * 60 * 1000)));\n  assertEquals(\n      'Friday, March 13, 2009 (10 days ago)',\n      fn(new Date(baseTime - 10 * 24 * 60 * 60 * 1000)));\n  assertEquals(\n      'Tuesday, March 3, 2009',\n      fn(new Date(baseTime - 20 * 24 * 60 * 60 * 1000)));\n\n  // Test that goog.date.DateTime can also be accepted as input.\n  assertEquals(\n      '2:21 PM (10 minutes ago)', fn(gdatetime(baseTime - 10 * 60 * 1000)));\n  assertEquals(\n      '4:31 AM (10 hours ago)', fn(gdatetime(baseTime - 10 * 60 * 60 * 1000)));\n  assertEquals(\n      'Friday, March 13, 2009 (10 days ago)',\n      fn(gdatetime(baseTime - 10 * 24 * 60 * 60 * 1000)));\n  assertEquals(\n      'Tuesday, March 3, 2009',\n      fn(gdatetime(baseTime - 20 * 24 * 60 * 60 * 1000)));\n}\n\nfunction testGetPastDateString() {\n  var fn = goog.date.relative.getPastDateString;\n  assertEquals(\n      '2:21 PM (10 minutes ago)', fn(new Date(baseTime - 10 * 60 * 1000)));\n  assertEquals(\n      '2:30 PM (1 minute ago)', fn(new Date(baseTime - 1 * 60 * 1000)));\n  assertEquals(\n      '2:41 PM (0 minutes ago)', fn(new Date(baseTime + 10 * 60 * 1000)));\n\n  // Test that goog.date.DateTime can also be accepted as input.\n  assertEquals(\n      '2:21 PM (10 minutes ago)', fn(gdatetime(baseTime - 10 * 60 * 1000)));\n  assertEquals('2:31 PM (0 minutes ago)', fn(gdatetime(baseTime)));\n  assertEquals(\n      '2:30 PM (1 minute ago)', fn(gdatetime(baseTime - 1 * 60 * 1000)));\n  assertEquals(\n      '2:41 PM (0 minutes ago)', fn(gdatetime(baseTime + 10 * 60 * 1000)));\n}\n\n// Test for non-English locales, too.\nfunction testFormatSpanish() {\n  var fn = goog.date.relative.formatDay;\n\n  propertyReplacer.replace(goog, 'LOCALE', 'es');\n\n  // Spanish locale 'es'\n  stubs.set(goog.date.relative, 'monthDateFormatter_', null);\n  stubs.set(goog.i18n, 'DateTimeSymbols', goog.i18n.DateTimeSymbols_es);\n  stubs.set(goog.i18n, 'DateTimePatterns', goog.i18n.DateTimePatterns_es);\n\n  RelativeDateTimeSymbols.setRelativeDateTimeSymbols(\n      RelativeDateTimeSymbols.RelativeDateTimeSymbols_es);\n\n  // Checks casing issues.\n  goog.date.relative.setCasingMode(true);\n\n  assertEquals('Pasado mañana', fn(timestamp('25 March 2009 20:59:59')));\n  assertEquals('Anteayer', fn(timestamp('21 March 2009 19:00:02')));\n\n  assertEquals('Ayer', fn(timestamp('22 March 2009 04:11:23')));\n  assertEquals('Hoy', fn(timestamp('23 March 2009 14:11:23')));\n  assertEquals('Mañana', fn(timestamp('24 March 2009 12:10:23')));\n\n  goog.date.relative.setCasingMode(false);\n  assertEquals('pasado mañana', fn(timestamp('25 March 2009 20:59:59')));\n  assertEquals('anteayer', fn(timestamp('21 March 2009 19:00:02')));\n\n  assertEquals('ayer', fn(timestamp('22 March 2009 04:11:23')));\n  assertEquals('hoy', fn(timestamp('23 March 2009 14:11:23')));\n  assertEquals('mañana', fn(timestamp('24 March 2009 12:10:23')));\n\n  // Outside the range. These should be localized.\n  assertEquals('26 mar.', fn(timestamp('26 March 2009 12:10:23')));  //\n  assertEquals('28 feb.', fn(timestamp('28 February 2009 12:10:23')));\n\n  fn = goog.date.relative.format;\n\n  assertEquals(\n      'Should round seconds to the minute below', 'dentro de 1 minuto',\n      fn(timestamp('23 March 2009 14:32:05')));\n  assertEquals(\n      'Should round seconds to the minute below', 'dentro de 9 minutos',\n      fn(timestamp('23 March 2009 14:39:07')));\n\n  assertEquals(\n      'Should round days to the day below', 'dentro de 1 día',\n      fn(timestamp('24 March 2009 14:32:05')));\n  assertEquals(\n      'Should round days to the day below', 'dentro de 8 días',\n      fn(timestamp('31 March 2009 14:39:07')));\n\n  assertEquals(\n      'Should round hours to the hour below', 'hace 1 hora',\n      fn(timestamp('23 March 2009 13:31:05')));\n  assertEquals(\n      'Should round hour to the hour below', 'hace 8 horas',\n      fn(timestamp('23 March 2009 06:31:04')));\n}\n\nfunction testFormatFrench() {\n  var fn = goog.date.relative.formatDay;\n\n  // Frence locale 'fr'\n  propertyReplacer.replace(goog, 'LOCALE', 'fr');\n\n  stubs.set(goog.date.relative, 'monthDateFormatter_', null);\n  stubs.set(goog.i18n, 'DateTimeSymbols', goog.i18n.DateTimeSymbols_fr);\n  stubs.set(goog.i18n, 'DateTimePatterns', goog.i18n.DateTimePatterns_fr);\n\n  RelativeDateTimeSymbols.setRelativeDateTimeSymbols(\n      RelativeDateTimeSymbols.RelativeDateTimeSymbols_fr);\n\n  // Check for casing results.\n  goog.date.relative.setCasingMode(true);\n  assertEquals('Après-demain', fn(timestamp('25 March 2009 20:59:59')));\n  assertEquals('Avant-hier', fn(timestamp('21 March 2009 19:00:02')));\n\n  assertEquals('Hier', fn(timestamp('22 March 2009 04:11:23')));\n  assertEquals('Aujourd’hui', fn(timestamp('23 March 2009 14:11:23')));\n  assertEquals('Demain', fn(timestamp('24 March 2009 12:10:23')));\n\n  goog.date.relative.setCasingMode(false);\n  assertEquals('après-demain', fn(timestamp('25 March 2009 20:59:59')));\n  assertEquals('avant-hier', fn(timestamp('21 March 2009 19:00:02')));\n\n  assertEquals('hier', fn(timestamp('22 March 2009 04:11:23')));\n  assertEquals('aujourd’hui', fn(timestamp('23 March 2009 14:11:23')));\n  assertEquals('demain', fn(timestamp('24 March 2009 12:10:23')));\n\n  // Outside the range. These should be localized.\n  assertEquals('26 mars', fn(timestamp('26 March 2009 12:10:23')));  //\n  assertEquals('28 févr.', fn(timestamp('28 February 2009 12:10:23')));\n  fn = goog.date.relative.format;\n\n  assertEquals(\n      'Should round seconds to the minute below', 'dans 1 minute',\n      fn(timestamp('23 March 2009 14:32:05')));\n  assertEquals(\n      'Should round seconds to the minute below', 'dans 9 minutes',\n      fn(timestamp('23 March 2009 14:39:07')));\n\n  assertEquals(\n      'Should round days to the day below', 'dans 1 jour',\n      fn(timestamp('24 March 2009 14:32:05')));\n  assertEquals(\n      'Should round days to the day below', 'dans 8 jours',\n      fn(timestamp('31 March 2009 14:39:07')));\n\n  assertEquals(\n      'Should round hours to the hour below', 'il y a 1 heure',\n      fn(timestamp('23 March 2009 13:31:05')));\n  assertEquals(\n      'Should round hour to the hour below', 'il y a 8 heures',\n      fn(timestamp('23 March 2009 06:31:04')));\n}\n\nfunction testFormatArabic() {\n  var fn = goog.date.relative.formatDay;\n\n  propertyReplacer.replace(goog, 'LOCALE', 'ar');\n\n  // Arabic locale 'ar'\n  stubs.set(goog.date.relative, 'monthDateFormatter_', null);\n  stubs.set(goog.i18n, 'DateTimeSymbols', goog.i18n.DateTimeSymbols_ar);\n  stubs.set(goog.i18n, 'DateTimePatterns', goog.i18n.DateTimePatterns_ar);\n\n  RelativeDateTimeSymbols.setRelativeDateTimeSymbols(\n      RelativeDateTimeSymbols.RelativeDateTimeSymbols_ar);\n\n  assertEquals('بعد الغد', fn(timestamp('25 March 2009 20:59:59')));\n  assertEquals('أول أمس', fn(timestamp('21 March 2009 19:00:02')));\n\n  assertEquals('أمس', fn(timestamp('22 March 2009 04:11:23')));\n  assertEquals('اليوم', fn(timestamp('23 March 2009 14:11:23')));\n  assertEquals('غدًا', fn(timestamp('24 March 2009 12:10:23')));\n\n  // Outside the range. These should be localized.\n  assertEquals('26 مارس', fn(timestamp('26 March 2009 12:10:23')));  //\n  assertEquals('28 فبراير', fn(timestamp('28 February 2009 12:10:23')));\n}\n\n/* Tests for non-ASCII digits in formatter results */\n\nfunction testFormatRelativeForPastDatesPersianDigits() {\n  stubs.set(goog.date.relative, 'monthDateFormatter_', null);\n  stubs.set(goog.i18n, 'DateTimeSymbols', goog.i18n.DateTimeSymbols_fa);\n  stubs.set(goog.i18n, 'DateTimePatterns', goog.i18n.DateTimePatterns_fa);\n  stubs.set(goog.i18n, 'NumberFormatSymbols', goog.i18n.NumberFormatSymbols_fa);\n\n  var fn = goog.date.relative.format;\n\n  // The text here is English, as it comes from localized resources, not\n  // from CLDR. It works properly in production, but it's not loaded here.\n  // Will need to wait for CLDR 24, when the data we need will be available,\n  // so that we can add it to DateTimeSymbols and out of localization.\n\n  // For Persian \\u06F0 is the base, so \\u6F0 = digit 0, \\u6F5 = digit 5 ...\n  // \"Western\" digits in square brackets for convenience\n\n  propertyReplacer.replace(goog, 'LOCALE', 'en-u-nu-arabext');\n  assertEquals(\n      'Should round seconds to the minute below',\n      localizeNumber(0) + ' minutes ago',  // ۰ minutes ago\n      fn(timestamp('23 March 2009 14:30:10')));\n\n  assertEquals(\n      'Should round seconds to the minute below',\n      localizeNumber(1) + ' minute ago',  // ۱ minute ago\n      fn(timestamp('23 March 2009 14:29:56')));\n\n  assertEquals(\n      'Should round seconds to the minute below',\n      localizeNumber(2) + ' minutes ago',  // ۲ minutes ago\n      fn(timestamp('23 March 2009 14:29:00')));\n\n  assertEquals(\n      localizeNumber(10) + ' minutes ago',  // ۱۰ minutes ago\n      fn(timestamp('23 March 2009 14:20:10')));\n  assertEquals(\n      localizeNumber(59) + ' minutes ago',  // ۵۹ minutes ago\n      fn(timestamp('23 March 2009 13:31:42')));\n  assertEquals(\n      localizeNumber(2) + ' hours ago',  // ۲ hours ago\n      fn(timestamp('23 March 2009 12:20:56')));\n  assertEquals(\n      localizeNumber(23) + ' hours ago',  // ۲۳ hours ago\n      fn(timestamp('22 March 2009 15:30:56')));\n  assertEquals(\n      localizeNumber(1) + ' day ago',  // ۱ day ago\n      fn(timestamp('22 March 2009 12:11:04')));\n  assertEquals(\n      localizeNumber(1) + ' day ago',  // ۱ day ago\n      fn(timestamp('22 March 2009 00:00:00')));\n  assertEquals(\n      localizeNumber(2) + ' days ago',  // ۲ days ago\n      fn(timestamp('21 March 2009 23:59:59')));\n  assertEquals(\n      localizeNumber(2) + ' days ago',  // ۲ days ago\n      fn(timestamp('21 March 2009 10:30:56')));\n  assertEquals(\n      localizeNumber(2) + ' days ago',  // ۲ days ago\n      fn(timestamp('21 March 2009 00:00:00')));\n  assertEquals(\n      localizeNumber(3) + ' days ago',  // ۳ days ago\n      fn(timestamp('20 March 2009 23:59:59')));\n\n  propertyReplacer.replace(goog, 'LOCALE', 'fa');\n  RelativeDateTimeSymbols.setRelativeDateTimeSymbols(\n      RelativeDateTimeSymbols.RelativeDateTimeSymbols_fa);\n\n  const result1 = fn(timestamp('21 March 2009 10:30:56'));\n  assertEquals('۲ روز پیش', result1);\n}\n\nfunction testFormatRelativeForFutureDatesBengaliDigits() {\n  stubs.set(goog.date.relative, 'monthDateFormatter_', null);\n  stubs.set(goog.i18n, 'DateTimeSymbols', goog.i18n.DateTimeSymbols_bn);\n  stubs.set(goog.i18n, 'DateTimePatterns', goog.i18n.DateTimePatterns_bn);\n  stubs.set(goog.i18n, 'NumberFormatSymbols', goog.i18n.NumberFormatSymbols_bn);\n\n  // Get Bengali digits\n  propertyReplacer.replace(goog, 'LOCALE', 'en-u-nu-beng');\n\n  var fn = goog.date.relative.format;\n\n  // For Bengali \\u09E6 is the base, so \\u09E6 = digit 0, \\u09EB = digit 5\n  // \"Western\" digits in square brackets for convenience\n  assertEquals(\n      'Should round seconds to the minute below',\n      'in ' + localizeNumber(1) + ' minute',  // in ১ minute\n      fn(timestamp('23 March 2009 14:32:05')));\n\n  assertEquals(\n      'Should round seconds to the minute below',\n      'in ' + localizeNumber(2) + ' minutes',  // in ২ minutes\n      fn(timestamp('23 March 2009 14:33:00')));\n\n  assertEquals(\n      'in ' + localizeNumber(10) + ' minutes',  // in ১০ minutes\n      fn(timestamp('23 March 2009 14:40:10')));\n  assertEquals(\n      'in ' + localizeNumber(59) + ' minutes',  // in ৫৯ minutes\n      fn(timestamp('23 March 2009 15:29:15')));\n  assertEquals(\n      'in ' + localizeNumber(2) + ' hours',  // in ২ hours\n      fn(timestamp('23 March 2009 17:20:56')));\n  assertEquals(\n      'in ' + localizeNumber(23) + ' hours',  // in ২৩ hours\n      fn(timestamp('24 March 2009 13:30:56')));\n  assertEquals(\n      'in ' + localizeNumber(1) + ' day',  // in ১ day\n      fn(timestamp('24 March 2009 14:31:07')));\n  assertEquals(\n      'in ' + localizeNumber(1) + ' day',  // in ১ day\n      fn(timestamp('24 March 2009 16:11:04')));\n  assertEquals(\n      'in ' + localizeNumber(1) + ' day',  // in ১ day\n      fn(timestamp('24 March 2009 23:59:59')));\n  assertEquals(\n      'in ' + localizeNumber(2) + ' days',  // in ২ days\n      fn(timestamp('25 March 2009 00:00:00')));\n  assertEquals(\n      'in ' + localizeNumber(2) + ' days',  // in ২ days\n      fn(timestamp('25 March 2009 10:30:56')));\n  assertEquals(\n      'in ' + localizeNumber(2) + ' days',  // in ২ days\n      fn(timestamp('25 March 2009 23:59:59')));\n  assertEquals(\n      'in ' + localizeNumber(3) + ' days',  // in ৩ days\n      fn(timestamp('26 March 2009 00:00:00')));\n\n  // Try Bengali text and numerals, too.\n  RelativeDateTimeSymbols.setRelativeDateTimeSymbols(\n      RelativeDateTimeSymbols.RelativeDateTimeSymbols_bn);\n\n  propertyReplacer.replace(goog, 'LOCALE', 'bn');\n\n  // For Bengali \\u09E6 is the base, so \\u09E6 = digit 0, \\u09EB = digit 5\n  // \"Western\" digits in square brackets for convenience\n\n  const result1 = fn(timestamp('23 March 2009 14:32:05'));\n  assertEquals('Should round seconds to the minute below', '১ মিনিটে', result1);\n\n  const result2 = fn(timestamp('26 March 2009 00:00:00'));\n  assertEquals(\n      'Should be Bengali text with Bengali digit.', '৩ দিনের মধ্যে', result2);\n}\n\nfunction testFormatRelativeForFutureDatesNorwegian() {\n  stubs.set(goog.date.relative, 'monthDateFormatter_', null);\n  stubs.set(goog.i18n, 'DateTimeSymbols', goog.i18n.DateTimeSymbols_no);\n  stubs.set(goog.i18n, 'DateTimePatterns', goog.i18n.DateTimePatterns_no);\n  stubs.set(goog.i18n, 'NumberFormatSymbols', goog.i18n.NumberFormatSymbols_no);\n\n  RelativeDateTimeSymbols.setRelativeDateTimeSymbols(\n      RelativeDateTimeSymbols.RelativeDateTimeSymbols_no);\n\n  // For a locale not in the ECMASCRIPT locale set.\n  propertyReplacer.replace(goog, 'LOCALE', 'no');\n\n  var fn = goog.date.relative.format;\n  assertEquals('om 1 minutt', fn(timestamp('23 March 2009 14:32:05')));\n}\n\n/**\n * Quick conversion to national digits, to increase readability of the\n * tests above.\n * @param {string|number} value\n * @return {string}\n */\nfunction localizeNumber(value) {\n  if (typeof value == 'number') {\n    value = value.toString();\n  }\n  return goog.i18n.DateTimeFormat.localizeNumbers(value);\n}\n\n/**\n * Create google DateTime object from timestamp\n * @param {number} timestamp\n * @return {!goog.date.DateTime}\n */\n\nfunction gdatetime(timestamp) {\n  return new goog.date.DateTime(new Date(timestamp));\n}\n\n/**\n * Create timestamp for specified time.\n * @param {string} str\n * @return {number}\n */\nfunction timestamp(str) {\n  return new Date(str).getTime();\n}\n\nfunction testUpcasing() {\n  // Tests package function that sentence-cases a string.\n  var fn = goog.date.relative.upcase;\n\n  assertEquals('today', 'Today', fn('today'));\n\n  assertEquals('Today', 'Today', fn('Today'));\n\n  assertEquals('TODAY', 'TODAY', fn('TODAY'));\n\n  assertEquals('tODAY', 'TODAY', fn('tODAY'));\n\n  // Non-ascii\n  assertEquals('', 'Ābc', fn('ābc'));\n\n  assertEquals('', 'Ābc', fn('Ābc'));\n\n  // Greek\n  assertEquals('Greek 1', '\\u0391\\u03b2\\u03b3', fn('\\u0391\\u03b2\\u03b3'));\n\n  assertEquals('Greek 2', '\\u0391\\u03b2\\u03b3', fn('\\u03b1\\u03b2\\u03b3'));\n\n  // Cyrillic\n  assertEquals('Cyrillic', 'Ађё', fn('ађё'));\n\n  // Adlam, SMP, cased\n  assertEquals('Adlam', '‮\uD83A\uDD00\uD83A\uDD26\uD83A\uDD37', fn('‮\uD83A\uDD00\uD83A\uDD26\uD83A\uDD37'));\n\n  // Chakma, SMP, uncased\n  assertEquals('Chakma', '\uD804\uDD03\uD804\uDD2C\uD804\uDD0C\uD804\uDD34\uD804\uDD25\uD804\uDD33\uD804\uDD20', fn('\uD804\uDD03\uD804\uDD2C\uD804\uDD0C\uD804\uDD34\uD804\uDD25\uD804\uDD33\uD804\uDD20'));\n}\n","^17",1579837703000,"^18",["^19",["~$goog.date.relative","~$goog.i18n.DateTimeSymbols-es","~$goog.i18n.NumberFormatSymbols-bn","~$goog.i18n.DateTimeSymbols-ar","~$goog.i18n.DateTimeSymbols-fr","~$goog.i18n.DateTimePatterns-es","~$goog.i18n.relativeDateTimeSymbols","~$goog.i18n.DateTimePatterns-fr","~$goog.i18n.DateTimeSymbols-bn","~$goog.i18n.DateTimePatterns-fa","~$goog.i18n.DateTimePatterns-no","~$goog.i18n.DateTimeFormat","^Z","~$goog.i18n.DateTimePatterns-ar","~$goog.i18n.DateTimeSymbols-no","~$goog.testing.PropertyReplacer","~$goog.i18n.DateTimePatterns-bn","~$goog.testing.jsunit","~$goog.i18n.NumberFormatSymbols-fa","~$goog.i18n.DateTimeSymbols-fa","~$goog.date.DateTime","~$goog.i18n.NumberFormatSymbols-en","~$goog.i18n.NumberFormatSymbols-no"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/date/relativecommontests.js"],"^1J",["^19",["~$goog.date.relativeCommonTests"]],"^X",true,"^Y",["^Z","^=8","^<Q","^=0","^=1","^=4","^<V","^<Z","^<X","^<[","^<T","^<Y","^<R","^=7","^<U","^=2","^<S","^=9","^=6","^=:","^<W","^=3","^=5"]],["^ ","^[",[1579837703000],"^10","goog.ui.defaultdatepickerrenderer.js","^11",["^12","goog/ui/defaultdatepickerrenderer.js"],"^13","goog/ui/defaultdatepickerrenderer.js","^14","^15","^16","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The default renderer for {@link goog.ui.DatePicker}.\n *\n * @see ../demos/datepicker.html\n */\n\ngoog.provide('goog.ui.DefaultDatePickerRenderer');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\n/** @suppress {extraRequire} Interface. */\ngoog.require('goog.ui.DatePickerRenderer');\n\n\n\n/**\n * Default renderer for {@link goog.ui.DatePicker}. Renders the date picker's\n * navigation header and footer.\n *\n * @param {string} baseCssClass Name of base CSS class of the date picker.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper.\n * @constructor\n * @implements {goog.ui.DatePickerRenderer}\n */\ngoog.ui.DefaultDatePickerRenderer = function(baseCssClass, opt_domHelper) {\n  /**\n   * Name of base CSS class of datepicker\n   * @type {string}\n   * @private\n   */\n  this.baseCssClass_ = baseCssClass;\n\n  /**\n   * @type {!goog.dom.DomHelper}\n   * @private\n   */\n  this.dom_ = opt_domHelper || goog.dom.getDomHelper();\n};\n\n\n/**\n * Returns the dom helper that is being used on this component.\n * @return {!goog.dom.DomHelper} The dom helper used on this component.\n */\ngoog.ui.DefaultDatePickerRenderer.prototype.getDomHelper = function() {\n  return this.dom_;\n};\n\n\n/**\n * Returns base CSS class. This getter is used to get base CSS class part.\n * All CSS class names in component are created as:\n *   goog.getCssName(this.getBaseCssClass(), 'CLASS_NAME')\n * @return {string} Base CSS class.\n */\ngoog.ui.DefaultDatePickerRenderer.prototype.getBaseCssClass = function() {\n  return this.baseCssClass_;\n};\n\n\n/**\n * Render the navigation row (navigating months and maybe years).\n *\n * @param {!Element} row The parent element to render the component into.\n * @param {boolean} simpleNavigation Whether the picker should render a simple\n *     navigation menu that only contains controls for navigating to the next\n *     and previous month. The default navigation menu contains controls for\n *     navigating to the next/previous month, next/previous year, and menus for\n *     jumping to specific months and years.\n * @param {boolean} showWeekNum Whether week numbers should be shown.\n * @param {string} fullDateFormat The full date format.\n *     {@see goog.i18n.DateTimeSymbols}.\n * @override\n */\ngoog.ui.DefaultDatePickerRenderer.prototype.renderNavigationRow = function(\n    row, simpleNavigation, showWeekNum, fullDateFormat) {\n  // Populate the navigation row according to the configured navigation mode.\n  var cell, monthCell, yearCell;\n\n  if (simpleNavigation) {\n    cell = this.getDomHelper().createElement(goog.dom.TagName.TD);\n    cell.colSpan = showWeekNum ? 1 : 2;\n    this.createButton_(\n        cell, '\\u00AB',\n        goog.getCssName(this.getBaseCssClass(), 'previousMonth'));  // <<\n    row.appendChild(cell);\n\n    cell = this.getDomHelper().createElement(goog.dom.TagName.TD);\n    cell.colSpan = showWeekNum ? 6 : 5;\n    cell.className = goog.getCssName(this.getBaseCssClass(), 'monthyear');\n    row.appendChild(cell);\n\n    cell = this.getDomHelper().createElement(goog.dom.TagName.TD);\n    this.createButton_(\n        cell, '\\u00BB',\n        goog.getCssName(this.getBaseCssClass(), 'nextMonth'));  // >>\n    row.appendChild(cell);\n\n  } else {\n    monthCell = this.getDomHelper().createElement(goog.dom.TagName.TD);\n    monthCell.colSpan = 5;\n    this.createButton_(\n        monthCell, '\\u00AB',\n        goog.getCssName(this.getBaseCssClass(), 'previousMonth'));  // <<\n    this.createButton_(\n        monthCell, '', goog.getCssName(this.getBaseCssClass(), 'month'));\n    this.createButton_(\n        monthCell, '\\u00BB',\n        goog.getCssName(this.getBaseCssClass(), 'nextMonth'));  // >>\n\n    yearCell = this.getDomHelper().createElement(goog.dom.TagName.TD);\n    yearCell.colSpan = 3;\n    this.createButton_(\n        yearCell, '\\u00AB',\n        goog.getCssName(this.getBaseCssClass(), 'previousYear'));  // <<\n    this.createButton_(\n        yearCell, '', goog.getCssName(this.getBaseCssClass(), 'year'));\n    this.createButton_(\n        yearCell, '\\u00BB',\n        goog.getCssName(this.getBaseCssClass(), 'nextYear'));  // <<\n\n    // If the date format has year ('y') appearing first before month ('m'),\n    // show the year on the left hand side of the datepicker popup.  Otherwise,\n    // show the month on the left side.  This check assumes the data to be\n    // valid, and that all date formats contain month and year.\n    if (fullDateFormat.indexOf('y') < fullDateFormat.indexOf('m')) {\n      row.appendChild(yearCell);\n      row.appendChild(monthCell);\n    } else {\n      row.appendChild(monthCell);\n      row.appendChild(yearCell);\n    }\n  }\n};\n\n\n/**\n * Render the footer row (with select buttons).\n *\n * @param {!Element} row The parent element to render the component into.\n * @param {boolean} showWeekNum Whether week numbers should be shown.\n * @override\n */\ngoog.ui.DefaultDatePickerRenderer.prototype.renderFooterRow = function(\n    row, showWeekNum) {\n  // Populate the footer row with buttons for Today and None.\n  var cell = this.getDomHelper().createElement(goog.dom.TagName.TD);\n  cell.colSpan = showWeekNum ? 2 : 3;\n  cell.className = goog.getCssName(this.getBaseCssClass(), 'today-cont');\n\n  /** @desc Label for button that selects the current date. */\n  var MSG_DATEPICKER_TODAY_BUTTON_LABEL = goog.getMsg('Today');\n  this.createButton_(\n      cell, MSG_DATEPICKER_TODAY_BUTTON_LABEL,\n      goog.getCssName(this.getBaseCssClass(), 'today-btn'));\n  row.appendChild(cell);\n\n  cell = this.getDomHelper().createElement(goog.dom.TagName.TD);\n  cell.colSpan = showWeekNum ? 4 : 3;\n  row.appendChild(cell);\n\n  cell = this.getDomHelper().createElement(goog.dom.TagName.TD);\n  cell.colSpan = 2;\n  cell.className = goog.getCssName(this.getBaseCssClass(), 'none-cont');\n\n  /** @desc Label for button that clears the selection. */\n  var MSG_DATEPICKER_NONE = goog.getMsg('None');\n  this.createButton_(\n      cell, MSG_DATEPICKER_NONE,\n      goog.getCssName(this.getBaseCssClass(), 'none-btn'));\n  row.appendChild(cell);\n};\n\n\n/**\n * Support function for button creation.\n *\n * @param {Element} parentNode Container the button should be added to.\n * @param {string} label Button label.\n * @param {string=} opt_className Class name for button, which will be used\n *    in addition to \"goog-date-picker-btn\".\n * @private\n * @return {!Element} The created button element.\n */\ngoog.ui.DefaultDatePickerRenderer.prototype.createButton_ = function(\n    parentNode, label, opt_className) {\n  var classes = [goog.getCssName(this.getBaseCssClass(), 'btn')];\n  if (opt_className) {\n    classes.push(opt_className);\n  }\n  var el = this.getDomHelper().createElement(goog.dom.TagName.BUTTON);\n  el.className = classes.join(' ');\n  el.appendChild(this.getDomHelper().createTextNode(label));\n  parentNode.appendChild(el);\n  return el;\n};\n","^17",1579837703000,"^18",["^19",["^1T","^Z","~$goog.ui.DatePickerRenderer","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/defaultdatepickerrenderer.js"],"^1J",["^19",["~$goog.ui.DefaultDatePickerRenderer"]],"^X",true,"^Y",["^Z","^1T","^1V","^=<"]],["^ ","^[",[1579837703000],"^2F",true,"^10","goog.delegate.delegates.js","^11",["^12","goog/delegate/delegates.js"],"^13","goog/delegate/delegates.js","^14","^15","^16","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides some utility methods for calling delegate lists with\n * common \"calling conventions\".\n *\n * @see goog.delegate.DelegateRegistry\n */\n\ngoog.module('goog.delegate.delegates');\n\n\n/**\n * Calls the first delegate, or returns undefined if none are given.\n * @param {!Array<T>} delegates\n * @param {function(T): R} mapper\n * @return {R|undefined}\n * @template T, R\n */\nexports.callFirst = (delegates, mapper) => {\n  return delegates.length > 0 ? mapper(delegates[0]) : undefined;\n};\n\n\n/**\n * Calls delegates until one returns a defined, non-null result.  Returns\n * undefined if no such element is found.\n * @param {!Array<T>} delegates\n * @param {function(T): R|undefined} mapper\n * @return {R|undefined}\n * @template T, R\n */\nexports.callUntilDefinedAndNotNull = (delegates, mapper) => {\n  for (const delegate of delegates) {\n    const result = mapper(delegate);\n    if (result != null) return result;\n  }\n  return undefined;\n};\n\n\n/**\n * Calls delegates until one returns a truthy result.  Returns false if no such\n * element is found.\n * @param {!Array<T>} delegates\n * @param {function(T): R} mapper\n * @return {boolean|R}\n * @template T, R\n */\nexports.callUntilTruthy = (delegates, mapper) => {\n  for (const delegate of delegates) {\n    const result = mapper(delegate);\n    if (result) return result;\n  }\n  return false;\n};\n","^17",1579837703000,"^18",["^19",["^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/delegate/delegates.js"],"^1J",["^19",["~$goog.delegate.delegates"]],"^X",true,"^Y",["^Z"]],["^ ","^[",[1579837703000],"^10","goog.editor.plugins.basictextformatter.js","^11",["^12","goog/editor/plugins/basictextformatter.js"],"^13","goog/editor/plugins/basictextformatter.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions to style text.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.provide('goog.editor.plugins.BasicTextFormatter');\ngoog.provide('goog.editor.plugins.BasicTextFormatter.COMMAND');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.Range');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.editor.BrowserFeature');\ngoog.require('goog.editor.Command');\ngoog.require('goog.editor.Link');\ngoog.require('goog.editor.Plugin');\ngoog.require('goog.editor.node');\ngoog.require('goog.editor.range');\ngoog.require('goog.editor.style');\ngoog.require('goog.iter');\ngoog.require('goog.iter.StopIteration');\ngoog.require('goog.log');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.string.Unicode');\ngoog.require('goog.style');\ngoog.require('goog.ui.editor.messages');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Functions to style text (e.g. underline, make bold, etc.)\n * @constructor\n * @extends {goog.editor.Plugin}\n */\ngoog.editor.plugins.BasicTextFormatter = function() {\n  goog.editor.Plugin.call(this);\n};\ngoog.inherits(goog.editor.plugins.BasicTextFormatter, goog.editor.Plugin);\n\n\n/** @override */\ngoog.editor.plugins.BasicTextFormatter.prototype.getTrogClassId = function() {\n  return 'BTF';\n};\n\n\n/**\n * Logging object.\n * @type {goog.log.Logger}\n * @protected\n * @override\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.logger =\n    goog.log.getLogger('goog.editor.plugins.BasicTextFormatter');\n\n\n/**\n * Commands implemented by this plugin.\n * @enum {string}\n */\ngoog.editor.plugins.BasicTextFormatter.COMMAND = {\n  LINK: '+link',\n  CREATE_LINK: '+createLink',\n  FORMAT_BLOCK: '+formatBlock',\n  INDENT: '+indent',\n  OUTDENT: '+outdent',\n  STRIKE_THROUGH: '+strikeThrough',\n  HORIZONTAL_RULE: '+insertHorizontalRule',\n  SUBSCRIPT: '+subscript',\n  SUPERSCRIPT: '+superscript',\n  UNDERLINE: '+underline',\n  BOLD: '+bold',\n  ITALIC: '+italic',\n  FONT_SIZE: '+fontSize',\n  FONT_FACE: '+fontName',\n  FONT_COLOR: '+foreColor',\n  BACKGROUND_COLOR: '+backColor',\n  ORDERED_LIST: '+insertOrderedList',\n  UNORDERED_LIST: '+insertUnorderedList',\n  JUSTIFY_CENTER: '+justifyCenter',\n  JUSTIFY_FULL: '+justifyFull',\n  JUSTIFY_RIGHT: '+justifyRight',\n  JUSTIFY_LEFT: '+justifyLeft'\n};\n\n\n/**\n * Inverse map of execCommand strings to\n * {@link goog.editor.plugins.BasicTextFormatter.COMMAND} constants. Used to\n * determine whether a string corresponds to a command this plugin\n * handles in O(1) time.\n * @type {Object}\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.SUPPORTED_COMMANDS_ =\n    goog.object.transpose(goog.editor.plugins.BasicTextFormatter.COMMAND);\n\n\n/**\n * Whether the string corresponds to a command this plugin handles.\n * @param {string} command Command string to check.\n * @return {boolean} Whether the string corresponds to a command\n *     this plugin handles.\n * @override\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.isSupportedCommand = function(\n    command) {\n  // TODO(user): restore this to simple check once table editing\n  // is moved out into its own plugin\n  return command in goog.editor.plugins.BasicTextFormatter.SUPPORTED_COMMANDS_;\n};\n\n\n/**\n * Array of execCommand strings which should be silent.\n * @type {!Array<goog.editor.plugins.BasicTextFormatter.COMMAND>}\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.SILENT_COMMANDS_ =\n    [goog.editor.plugins.BasicTextFormatter.COMMAND.CREATE_LINK];\n\n\n/**\n * Whether the string corresponds to a command that should be silent.\n * @override\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.isSilentCommand = function(\n    command) {\n  return goog.array.contains(\n      goog.editor.plugins.BasicTextFormatter.SILENT_COMMANDS_, command);\n};\n\n\n/**\n * @return {goog.dom.AbstractRange} The closure range object that wraps the\n *     current user selection.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.getRange_ = function() {\n  return this.getFieldObject().getRange();\n};\n\n\n/**\n * @return {!Document} The document object associated with the currently active\n *     field.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.getDocument_ = function() {\n  return this.getFieldDomHelper().getDocument();\n};\n\n\n/**\n * Execute a user-initiated command.\n * @param {string} command Command to execute.\n * @param {...*} var_args For color commands, this\n *     should be the hex color (with the #). For FORMAT_BLOCK, this should be\n *     the goog.editor.plugins.BasicTextFormatter.BLOCK_COMMAND.\n *     It will be unused for other commands.\n * @return {Object|undefined} The result of the command.\n * @override\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.execCommandInternal = function(\n    command, var_args) {\n  var preserveDir, styleWithCss, needsFormatBlockDiv, hasDummySelection;\n  var result;\n  var opt_arg = arguments[1];\n\n  switch (command) {\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.BACKGROUND_COLOR:\n      // Don't bother for no color selected, color picker is resetting itself.\n      if (opt_arg !== null) {\n        if (goog.editor.BrowserFeature.EATS_EMPTY_BACKGROUND_COLOR) {\n          this.applyBgColorManually_(opt_arg);\n        } else if (goog.userAgent.OPERA) {\n          // backColor will color the block level element instead of\n          // the selected span of text in Opera.\n          this.execCommandHelper_('hiliteColor', opt_arg);\n        } else {\n          this.execCommandHelper_(command, opt_arg);\n        }\n      }\n      break;\n\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.CREATE_LINK:\n      result = this.createLink_(arguments[1], arguments[2], arguments[3]);\n      break;\n\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.LINK:\n      result = this.toggleLink_(opt_arg);\n      break;\n\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_CENTER:\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_FULL:\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_RIGHT:\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_LEFT:\n      this.justify_(command);\n      break;\n\n    default:\n      if (goog.userAgent.IE &&\n          command ==\n              goog.editor.plugins.BasicTextFormatter.COMMAND.FORMAT_BLOCK &&\n          opt_arg) {\n        // IE requires that the argument be in the form of an opening\n        // tag, like <h1>, including angle brackets.  WebKit will accept\n        // the arguemnt with or without brackets, and Firefox pre-3 supports\n        // only a fixed subset of tags with brackets, and prefers without.\n        // So we only add them IE only.\n        opt_arg = '<' + opt_arg + '>';\n      }\n\n      if (command ==\n              goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_COLOR &&\n          opt_arg === null) {\n        // If we don't have a color, then FONT_COLOR is a no-op.\n        break;\n      }\n\n      switch (command) {\n        case goog.editor.plugins.BasicTextFormatter.COMMAND.INDENT:\n        case goog.editor.plugins.BasicTextFormatter.COMMAND.OUTDENT:\n          if (goog.editor.BrowserFeature.HAS_STYLE_WITH_CSS) {\n            if (goog.userAgent.GECKO) {\n              styleWithCss = true;\n            }\n            if (goog.userAgent.OPERA) {\n              if (command ==\n                  goog.editor.plugins.BasicTextFormatter.COMMAND.OUTDENT) {\n                // styleWithCSS actually sets negative margins on <blockquote>\n                // to outdent them. If the command is enabled without\n                // styleWithCSS flipped on, then the caret is in a blockquote so\n                // styleWithCSS must not be used. But if the command is not\n                // enabled, styleWithCSS should be used so that elements such as\n                // a <div> with a margin-left style can still be outdented.\n                // (Opera bug: CORE-21118)\n                styleWithCss =\n                    !this.getDocument_().queryCommandEnabled('outdent');\n              } else {\n                // Always use styleWithCSS for indenting. Otherwise, Opera will\n                // make separate <blockquote>s around *each* indented line,\n                // which adds big default <blockquote> margins between each\n                // indented line.\n                styleWithCss = true;\n              }\n            }\n          }\n          // Fall through.\n\n        case goog.editor.plugins.BasicTextFormatter.COMMAND.ORDERED_LIST:\n        case goog.editor.plugins.BasicTextFormatter.COMMAND.UNORDERED_LIST:\n          if (goog.editor.BrowserFeature.LEAVES_P_WHEN_REMOVING_LISTS &&\n              this.queryCommandStateInternal_(this.getDocument_(), command)) {\n            // IE leaves behind P tags when unapplying lists.\n            // If we're not in P-mode, then we want divs\n            // So, unlistify, then convert the Ps into divs.\n            needsFormatBlockDiv =\n                this.getFieldObject().queryCommandValue(\n                    goog.editor.Command.DEFAULT_TAG) != goog.dom.TagName.P;\n          } else if (!goog.editor.BrowserFeature.CAN_LISTIFY_BR) {\n            // IE doesn't convert BRed line breaks into separate list items.\n            // So convert the BRs to divs, then do the listify.\n            this.convertBreaksToDivs_();\n          }\n\n          // This fix only works in Gecko.\n          if (goog.userAgent.GECKO &&\n              goog.editor.BrowserFeature.FORGETS_FORMATTING_WHEN_LISTIFYING &&\n              !this.queryCommandValue(command)) {\n            hasDummySelection |= this.beforeInsertListGecko_();\n          }\n          // Fall through to preserveDir block\n\n        case goog.editor.plugins.BasicTextFormatter.COMMAND.FORMAT_BLOCK:\n          // Both FF & IE may lose directionality info. Save/restore it.\n          // TODO(user): Does Safari also need this?\n          // TODO (gmark, jparent): This isn't ideal because it uses a string\n          // literal, so if the plugin name changes, it would break. We need a\n          // better solution. See also other places in code that use\n          // this.getPluginByClassId('Bidi').\n          preserveDir = !!this.getFieldObject().getPluginByClassId('Bidi');\n          break;\n\n        case goog.editor.plugins.BasicTextFormatter.COMMAND.SUBSCRIPT:\n        case goog.editor.plugins.BasicTextFormatter.COMMAND.SUPERSCRIPT:\n          if (goog.editor.BrowserFeature.NESTS_SUBSCRIPT_SUPERSCRIPT) {\n            // This browser nests subscript and superscript when both are\n            // applied, instead of canceling out the first when applying the\n            // second.\n            this.applySubscriptSuperscriptWorkarounds_(command);\n          }\n          break;\n\n        case goog.editor.plugins.BasicTextFormatter.COMMAND.UNDERLINE:\n        case goog.editor.plugins.BasicTextFormatter.COMMAND.BOLD:\n        case goog.editor.plugins.BasicTextFormatter.COMMAND.ITALIC:\n          // If we are applying the formatting, then we want to have\n          // styleWithCSS false so that we generate html tags (like <b>).  If we\n          // are unformatting something, we want to have styleWithCSS true so\n          // that we can unformat both html tags and inline styling.\n          // TODO(user): What about WebKit and Opera?\n          styleWithCss = goog.userAgent.GECKO &&\n              goog.editor.BrowserFeature.HAS_STYLE_WITH_CSS &&\n              this.queryCommandValue(command);\n          break;\n\n        case goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_COLOR:\n        case goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_FACE:\n          // It is very expensive in FF (order of magnitude difference) to use\n          // font tags instead of styled spans. Whenever possible,\n          // force FF to use spans.\n          // Font size is very expensive too, but FF always uses font tags,\n          // regardless of which styleWithCSS value you use.\n          styleWithCss = goog.editor.BrowserFeature.HAS_STYLE_WITH_CSS &&\n              goog.userAgent.GECKO;\n      }\n\n      /**\n       * Cases where we just use the default execCommand (in addition\n       * to the above fall-throughs)\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.STRIKE_THROUGH:\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.HORIZONTAL_RULE:\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.SUBSCRIPT:\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.SUPERSCRIPT:\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.UNDERLINE:\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.BOLD:\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.ITALIC:\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_SIZE:\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_FACE:\n       */\n      this.execCommandHelper_(command, opt_arg, preserveDir, !!styleWithCss);\n\n      if (hasDummySelection) {\n        this.getDocument_().execCommand('Delete', false, true);\n      }\n\n      if (needsFormatBlockDiv) {\n        this.getDocument_().execCommand('FormatBlock', false, '<div>');\n      }\n  }\n  // FF loses focus, so we have to set the focus back to the document or the\n  // user can't type after selecting from menu.  In IE, focus is set correctly\n  // and resetting it here messes it up.\n  if (goog.userAgent.GECKO && !this.getFieldObject().inModalMode()) {\n    this.focusField_();\n  }\n  return result;\n};\n\n\n/**\n * Focuses on the field.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.focusField_ = function() {\n  this.getFieldDomHelper().getWindow().focus();\n};\n\n\n/**\n * Gets the command value.\n * @param {string} command The command value to get.\n * @return {string|boolean|null} The current value of the command in the given\n *     selection.  NOTE: This return type list is not documented in MSDN or MDC\n *     and has been constructed from experience.  Please update it\n *     if necessary.\n * @override\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.queryCommandValue = function(\n    command) {\n  var styleWithCss;\n  switch (command) {\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.LINK:\n      return this.isNodeInState_(goog.dom.TagName.A);\n\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_CENTER:\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_FULL:\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_RIGHT:\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.JUSTIFY_LEFT:\n      return this.isJustification_(command);\n\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.FORMAT_BLOCK:\n      // TODO(nicksantos): See if we can use queryCommandValue here.\n      return goog.editor.plugins.BasicTextFormatter.getSelectionBlockState_(\n          this.getFieldObject().getRange());\n\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.INDENT:\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.OUTDENT:\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.HORIZONTAL_RULE:\n      // TODO: See if there are reasonable results to return for\n      // these commands.\n      return false;\n\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_SIZE:\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_FACE:\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.FONT_COLOR:\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.BACKGROUND_COLOR:\n      // We use queryCommandValue here since we don't just want to know if a\n      // color/fontface/fontsize is applied, we want to know WHICH one it is.\n      return this.queryCommandValueInternal_(\n          this.getDocument_(), command,\n          goog.editor.BrowserFeature.HAS_STYLE_WITH_CSS &&\n              goog.userAgent.GECKO);\n\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.UNDERLINE:\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.BOLD:\n    case goog.editor.plugins.BasicTextFormatter.COMMAND.ITALIC:\n      styleWithCss =\n          goog.editor.BrowserFeature.HAS_STYLE_WITH_CSS && goog.userAgent.GECKO;\n\n    default:\n      /**\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.STRIKE_THROUGH\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.SUBSCRIPT\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.SUPERSCRIPT\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.UNDERLINE\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.BOLD\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.ITALIC\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.ORDERED_LIST\n       * goog.editor.plugins.BasicTextFormatter.COMMAND.UNORDERED_LIST\n       */\n      // This only works for commands that use the default execCommand\n      return this.queryCommandStateInternal_(\n          this.getDocument_(), command, styleWithCss);\n  }\n};\n\n\n/**\n * @override\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.prepareContentsHtml = function(\n    html) {\n  // If the browser collapses empty nodes and the field has only a script\n  // tag in it, then it will collapse this node. Which will mean the user\n  // can't click into it to edit it.\n  if (goog.editor.BrowserFeature.COLLAPSES_EMPTY_NODES &&\n      html.match(/^\\s*<script/i)) {\n    html = '&nbsp;' + html;\n  }\n\n  if (goog.editor.BrowserFeature.CONVERT_TO_B_AND_I_TAGS) {\n    // Some browsers (FF) can't undo strong/em in some cases, but can undo b/i!\n    html = html.replace(/<(\\/?)strong([^\\w])/gi, '<$1b$2');\n    html = html.replace(/<(\\/?)em([^\\w])/gi, '<$1i$2');\n  }\n\n  return html;\n};\n\n\n/**\n * @override\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.cleanContentsDom = function(\n    fieldCopy) {\n  var images = goog.dom.getElementsByTagName(goog.dom.TagName.IMG, fieldCopy);\n  for (var i = 0, image; image = images[i]; i++) {\n    if (goog.editor.BrowserFeature.SHOWS_CUSTOM_ATTRS_IN_INNER_HTML) {\n      // Only need to remove these attributes in IE because\n      // Firefox and Safari don't show custom attributes in the innerHTML.\n      image.removeAttribute('tabIndex');\n      image.removeAttribute('tabIndexSet');\n      goog.removeUid(image);\n\n      // Declare oldTypeIndex for the compiler. The associated plugin may not be\n      // included in the compiled bundle.\n      /** @type {number} */ image.oldTabIndex;\n\n      // oldTabIndex will only be set if\n      // goog.editor.BrowserFeature.TABS_THROUGH_IMAGES is true and we're in\n      // P-on-enter mode.\n      if (image.oldTabIndex) {\n        image.tabIndex = image.oldTabIndex;\n      }\n    }\n  }\n};\n\n\n/**\n * @override\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.cleanContentsHtml = function(\n    html) {\n  if (goog.editor.BrowserFeature.MOVES_STYLE_TO_HEAD) {\n    // Safari creates a new <head> element for <style> tags, so prepend their\n    // contents to the output.\n    var heads = this.getFieldObject()\n                    .getEditableDomHelper()\n                    .getElementsByTagNameAndClass(goog.dom.TagName.HEAD);\n    var stylesHtmlArr = [];\n\n    // i starts at 1 so we don't copy in the original, legitimate <head>.\n    var numHeads = heads.length;\n    for (var i = 1; i < numHeads; ++i) {\n      var styles =\n          goog.dom.getElementsByTagName(goog.dom.TagName.STYLE, heads[i]);\n      var numStyles = styles.length;\n      for (var j = 0; j < numStyles; ++j) {\n        stylesHtmlArr.push(styles[j].outerHTML);\n      }\n    }\n    return stylesHtmlArr.join('') + html;\n  }\n\n  return html;\n};\n\n\n/**\n * @override\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.handleKeyboardShortcut =\n    function(e, key, isModifierPressed) {\n  if (!isModifierPressed) {\n    return false;\n  }\n  var command;\n  switch (key) {\n    case 'b':  // Ctrl+B\n      command = goog.editor.plugins.BasicTextFormatter.COMMAND.BOLD;\n      break;\n    case 'i':  // Ctrl+I\n      command = goog.editor.plugins.BasicTextFormatter.COMMAND.ITALIC;\n      break;\n    case 'u':  // Ctrl+U\n      command = goog.editor.plugins.BasicTextFormatter.COMMAND.UNDERLINE;\n      break;\n    case 's':  // Ctrl+S\n      // TODO(user): This doesn't belong in here.  Clients should handle\n      // this themselves.\n      // Catching control + s prevents the annoying browser save dialog\n      // from appearing.\n      return true;\n  }\n\n  if (command) {\n    this.getFieldObject().execCommand(command);\n    return true;\n  }\n\n  return false;\n};\n\n\n// Helpers for execCommand\n\n\n/**\n * Regular expression to match BRs in HTML. Saves the BRs' attributes in $1 for\n * use with replace(). In non-IE browsers, does not match BRs adjacent to an\n * opening or closing DIV or P tag, since nonrendered BR elements can occur at\n * the end of block level containers in those browsers' editors.\n * @type {RegExp}\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.BR_REGEXP_ = goog.userAgent.IE ?\n    /<br([^\\/>]*)\\/?>/gi :\n    /<br([^\\/>]*)\\/?>(?!<\\/(div|p)>)/gi;\n\n\n/**\n * Convert BRs in the selection to divs.\n * This is only intended to be used in IE and Opera.\n * @return {boolean} Whether any BR's were converted.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.convertBreaksToDivs_ =\n    function() {\n  if (!goog.userAgent.IE && !goog.userAgent.OPERA) {\n    // This function is only supported on IE and Opera.\n    return false;\n  }\n  var range = this.getRange_();\n  var parent = range.getContainerElement();\n  var doc = this.getDocument_();\n  var dom = this.getFieldDomHelper();\n\n  goog.editor.plugins.BasicTextFormatter.BR_REGEXP_.lastIndex = 0;\n  // Only mess with the HTML/selection if it contains a BR.\n  if (goog.editor.plugins.BasicTextFormatter.BR_REGEXP_.test(\n          parent.innerHTML)) {\n    // Insert temporary markers to remember the selection.\n    var savedRange = range.saveUsingCarets();\n\n    if (parent.tagName == goog.dom.TagName.P) {\n      // Can't append paragraphs to paragraph tags. Throws an exception in IE.\n      goog.editor.plugins.BasicTextFormatter.convertParagraphToDiv_(\n          parent, true);\n    } else {\n      // Used to do:\n      // IE: <div>foo<br>bar</div> --> <div>foo<p id=\"temp_br\">bar</div>\n      // Opera: <div>foo<br>bar</div> --> <div>foo<p class=\"temp_br\">bar</div>\n      // To fix bug 1939883, now does for both:\n      // <div>foo<br>bar</div> --> <div>foo<p trtempbr=\"temp_br\">bar</div>\n      // TODO(user): Confirm if there's any way to skip this\n      // intermediate step of converting br's to p's before converting those to\n      // div's. The reason may be hidden in CLs 5332866 and 8530601.\n      var attribute = 'trtempbr';\n      var value = 'temp_br';\n      var newHtml = parent.innerHTML.replace(\n          goog.editor.plugins.BasicTextFormatter.BR_REGEXP_,\n          '<p$1 ' + attribute + '=\"' + value + '\">');\n      goog.editor.node.replaceInnerHtml(parent, newHtml);\n\n      var paragraphs = goog.array.toArray(\n          goog.dom.getElementsByTagName(goog.dom.TagName.P, parent));\n      goog.iter.forEach(paragraphs, function(paragraph) {\n        if (paragraph.getAttribute(attribute) == value) {\n          paragraph.removeAttribute(attribute);\n          if (goog.string.isBreakingWhitespace(\n                  goog.dom.getTextContent(paragraph))) {\n            // Prevent the empty blocks from collapsing.\n            // A <BR> is preferable because it doesn't result in any text being\n            // added to the \"blank\" line. In IE, however, it is possible to\n            // place the caret after the <br>, which effectively creates a\n            // visible line break. Because of this, we have to resort to using a\n            // &nbsp; in IE.\n            var child = goog.userAgent.IE ?\n                doc.createTextNode(goog.string.Unicode.NBSP) :\n                dom.createElement(goog.dom.TagName.BR);\n            paragraph.appendChild(child);\n          }\n          goog.editor.plugins.BasicTextFormatter.convertParagraphToDiv_(\n              paragraph);\n        }\n      });\n    }\n\n    // Select the previously selected text so we only listify\n    // the selected portion and maintain the user's selection.\n    savedRange.restore();\n    return true;\n  }\n\n  return false;\n};\n\n\n/**\n * Convert the given paragraph to being a div. This clobbers the\n * passed-in node!\n * This is only intended to be used in IE and Opera.\n * @param {Node} paragraph Paragragh to convert to a div.\n * @param {boolean=} opt_convertBrs If true, also convert BRs to divs.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.convertParagraphToDiv_ = function(\n    paragraph, opt_convertBrs) {\n  if (!goog.userAgent.IE && !goog.userAgent.OPERA) {\n    // This function is only supported on IE and Opera.\n    return;\n  }\n  var outerHTML = paragraph.outerHTML.replace(/<(\\/?)p/gi, '<$1div');\n  if (opt_convertBrs) {\n    // IE fills in the closing div tag if it's missing!\n    outerHTML = outerHTML.replace(\n        goog.editor.plugins.BasicTextFormatter.BR_REGEXP_, '</div><div$1>');\n  }\n  if (goog.userAgent.OPERA && !/<\\/div>$/i.test(outerHTML)) {\n    // Opera doesn't automatically add the closing tag, so add it if needed.\n    outerHTML += '</div>';\n  }\n  paragraph.outerHTML = outerHTML;\n};\n\n\n/**\n * If this is a goog.editor.plugins.BasicTextFormatter.COMMAND,\n * convert it to something that we can pass into execCommand,\n * queryCommandState, etc.\n *\n * TODO(user): Consider doing away with the + and converter completely.\n *\n * @param {goog.editor.plugins.BasicTextFormatter.COMMAND|string}\n *     command A command key.\n * @return {string} The equivalent execCommand command.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.convertToRealExecCommand_ = function(\n    command) {\n  return command.indexOf('+') == 0 ? command.substring(1) : command;\n};\n\n\n/**\n * Justify the text in the selection.\n * @param {string} command The type of justification to perform.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.justify_ = function(command) {\n  this.execCommandHelper_(command, null, false, true);\n  // Firefox cannot justify divs.  In fact, justifying divs results in removing\n  // the divs and replacing them with brs.  So \"<div>foo</div><div>bar</div>\"\n  // becomes \"foo<br>bar\" after alignment is applied.  However, if you justify\n  // again, then you get \"<div style='text-align: right'>foo<br>bar</div>\",\n  // which at least looks visually correct.  Since justification is (normally)\n  // idempotent, it isn't a problem when the selection does not contain divs to\n  // apply justifcation again.\n  if (goog.userAgent.GECKO) {\n    this.execCommandHelper_(command, null, false, true);\n  }\n\n  // Convert all block elements in the selection to use CSS text-align\n  // instead of the align property. This works better because the align\n  // property is overridden by the CSS text-align property.\n  //\n  // Only for browsers that can't handle this by the styleWithCSS execCommand,\n  // which allows us to specify if we should insert align or text-align.\n  // TODO(user): What about WebKit or Opera?\n  if (!(goog.editor.BrowserFeature.HAS_STYLE_WITH_CSS &&\n        goog.userAgent.GECKO)) {\n    goog.iter.forEach(\n        this.getFieldObject().getRange(),\n        goog.editor.plugins.BasicTextFormatter.convertContainerToTextAlign_);\n  }\n};\n\n\n/**\n * Converts the block element containing the given node to use CSS text-align\n * instead of the align property.\n * @param {Node} node The node to convert the container of.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.convertContainerToTextAlign_ = function(\n    node) {\n  var container = goog.editor.style.getContainer(node);\n\n  // TODO(user): Fix this so that it doesn't screw up tables.\n  if (container.align) {\n    container.style.textAlign = container.align;\n    container.removeAttribute('align');\n  }\n};\n\n\n/**\n * Perform an execCommand on the active document.\n * @param {string} command The command to execute.\n * @param {string|number|boolean|null=} opt_value Optional value.\n * @param {boolean=} opt_preserveDir Set true to make sure that command does not\n *     change directionality of the selected text (works only if all selected\n *     text has the same directionality, otherwise ignored). Should not be true\n *     if bidi plugin is not loaded.\n * @param {boolean=} opt_styleWithCss Set to true to ask the browser to use CSS\n *     to perform the execCommand.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.execCommandHelper_ = function(\n    command, opt_value, opt_preserveDir, opt_styleWithCss) {\n  // There is a bug in FF: some commands do not preserve attributes of the\n  // block-level elements they replace.\n  // This (among the rest) leads to loss of directionality information.\n  // For now we use a hack (when opt_preserveDir==true) to avoid this\n  // directionality problem in the simplest cases.\n  // Known affected commands: formatBlock, insertOrderedList,\n  // insertUnorderedList, indent, outdent.\n  // A similar problem occurs in IE when insertOrderedList or\n  // insertUnorderedList remove existing list.\n  var dir = null;\n  if (opt_preserveDir) {\n    dir = this.getFieldObject().queryCommandValue(goog.editor.Command.DIR_RTL) ?\n        'rtl' :\n        this.getFieldObject().queryCommandValue(goog.editor.Command.DIR_LTR) ?\n        'ltr' :\n        null;\n  }\n\n  command =\n      goog.editor.plugins.BasicTextFormatter.convertToRealExecCommand_(command);\n\n  var endDiv, nbsp;\n  if (goog.userAgent.IE) {\n    var ret = this.applyExecCommandIEFixes_(command);\n    endDiv = ret[0];\n    nbsp = ret[1];\n  }\n\n  if (goog.userAgent.WEBKIT) {\n    endDiv = this.applyExecCommandSafariFixes_(command);\n  }\n\n  if (goog.userAgent.GECKO) {\n    this.applyExecCommandGeckoFixes_(command);\n  }\n\n  if (goog.editor.BrowserFeature.DOESNT_OVERRIDE_FONT_SIZE_IN_STYLE_ATTR &&\n      command.toLowerCase() == 'fontsize') {\n    this.removeFontSizeFromStyleAttrs_();\n  }\n\n  var doc = this.getDocument_();\n  if (opt_styleWithCss && goog.editor.BrowserFeature.HAS_STYLE_WITH_CSS) {\n    doc.execCommand('styleWithCSS', false, true);\n    if (goog.userAgent.OPERA) {\n      this.invalidateInlineCss_();\n    }\n  }\n\n  doc.execCommand(command, false, opt_value);\n  if (opt_styleWithCss && goog.editor.BrowserFeature.HAS_STYLE_WITH_CSS) {\n    // If we enabled styleWithCSS, turn it back off.\n    doc.execCommand('styleWithCSS', false, false);\n  }\n\n  if (goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher('526') &&\n      command.toLowerCase() == 'formatblock' && opt_value &&\n      /^[<]?h\\d[>]?$/i.test(opt_value)) {\n    this.cleanUpSafariHeadings_();\n  }\n\n  if (/insert(un)?orderedlist/i.test(command)) {\n    // NOTE(user): This doesn't check queryCommandState because it seems to\n    // lie. Also, this runs for insertunorderedlist so that the the list\n    // isn't made up of an <ul> for each <li> - even though it looks the same,\n    // the markup is disgusting.\n    if (goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher(534)) {\n      this.fixSafariLists_();\n    }\n    if (goog.userAgent.IE) {\n      this.fixIELists_();\n\n      if (nbsp) {\n        // Remove the text node, if applicable.  Do not try to instead clobber\n        // the contents of the text node if it was added, or the same invalid\n        // node thing as above will happen.  The error won't happen here, it\n        // will happen after you hit enter and then do anything that loops\n        // through the dom and tries to read that node.\n        goog.dom.removeNode(nbsp);\n      }\n    }\n  }\n\n  if (endDiv) {\n    // Remove the dummy div.\n    goog.dom.removeNode(endDiv);\n  }\n\n  // Restore directionality if required and only when unambigous (dir!=null).\n  if (dir) {\n    this.getFieldObject().execCommand(dir);\n  }\n};\n\n\n/**\n * Applies a background color to a selection when the browser can't do the job.\n *\n * NOTE(nicksantos): If you think this is hacky, you should try applying\n * background color in Opera. It made me cry.\n *\n * @param {string} bgColor backgroundColor from .formatText to .execCommand.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.applyBgColorManually_ =\n    function(bgColor) {\n  var needsSpaceInTextNode = goog.userAgent.GECKO;\n  var range = this.getFieldObject().getRange();\n  var textNode;\n  var parentTag;\n  if (range && range.isCollapsed()) {\n    // Hack to handle Firefox bug:\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=279330\n    // execCommand hiliteColor in Firefox on collapsed selection creates\n    // a font tag onkeypress\n    textNode = this.getFieldDomHelper().createTextNode(\n        needsSpaceInTextNode ? ' ' : '');\n\n    var containerNode = range.getStartNode();\n    // Check if we're inside a tag that contains the cursor and nothing else;\n    // if we are, don't create a dummySpan. Just use this containing tag to\n    // hide the 1-space selection.\n    // If the user sets a background color on a collapsed selection, then sets\n    // another one immediately, we get a span tag with a single empty TextNode.\n    // If the user sets a background color, types, then backspaces, we get a\n    // span tag with nothing inside it (container is the span).\n    parentTag = containerNode.nodeType == goog.dom.NodeType.ELEMENT ?\n        containerNode :\n        containerNode.parentNode;\n\n    if (parentTag.innerHTML == '') {\n      // There's an Element to work with\n      // make the space character invisible using a CSS indent hack\n      parentTag.style.textIndent = '-10000px';\n      parentTag.appendChild(textNode);\n    } else {\n      // No Element to work with; make one\n      // create a span with a space character inside\n      // make the space character invisible using a CSS indent hack\n      parentTag = this.getFieldDomHelper().createDom(\n          goog.dom.TagName.SPAN, {'style': 'text-indent:-10000px'}, textNode);\n      range.replaceContentsWithNode(parentTag);\n    }\n    goog.dom.Range.createFromNodeContents(textNode).select();\n  }\n\n  this.execCommandHelper_('hiliteColor', bgColor, false, true);\n\n  if (textNode) {\n    // eliminate the space if necessary.\n    if (needsSpaceInTextNode) {\n      textNode.data = '';\n    }\n\n    // eliminate the hack.\n    parentTag.style.textIndent = '';\n    // execCommand modified our span so we leave it in place.\n  }\n};\n\n\n/**\n * Toggle link for the current selection:\n *   If selection contains a link, unlink it, return null.\n *   Otherwise, make selection into a link, return the link.\n * @param {string=} opt_target Target for the link.\n * @return {goog.editor.Link?} The resulting link, or null if a link was\n *     removed.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.toggleLink_ = function(\n    opt_target) {\n  if (!this.getFieldObject().isSelectionEditable()) {\n    this.focusField_();\n  }\n\n  var range = this.getRange_();\n  // Since we wrap images in links, its possible that the user selected an\n  // image and clicked link, in which case we want to actually use the\n  // image as the selection.\n  var parent = range && range.getContainerElement();\n  var link = /** @type {Element} */ (\n      goog.dom.getAncestorByTagNameAndClass(parent, goog.dom.TagName.A));\n  if (link && goog.editor.node.isEditable(link)) {\n    goog.dom.flattenElement(link);\n  } else {\n    var editableLink = this.createLink_(range, '/', opt_target);\n    if (editableLink) {\n      if (!this.getFieldObject().execCommand(\n              goog.editor.Command.MODAL_LINK_EDITOR, editableLink)) {\n        var url = this.getFieldObject().getAppWindow().prompt(\n            goog.ui.editor.messages.MSG_LINK_TO, 'http://');\n        if (url) {\n          editableLink.setTextAndUrl(editableLink.getCurrentText() || url, url);\n          editableLink.placeCursorRightOf();\n        } else {\n          var savedRange = goog.editor.range.saveUsingNormalizedCarets(\n              goog.dom.Range.createFromNodeContents(editableLink.getAnchor()));\n          editableLink.removeLink();\n          savedRange.restore().select();\n          return null;\n        }\n      }\n      return editableLink;\n    }\n  }\n  return null;\n};\n\n\n/**\n * Create a link out of the current selection.  If nothing is selected, insert\n * a new link.  Otherwise, enclose the selection in a link.\n * @param {goog.dom.AbstractRange} range The closure range object for the\n *     current selection.\n * @param {string} url The url to link to.\n * @param {string=} opt_target Target for the link.\n * @return {goog.editor.Link?} The newly created link, or null if the link\n *     couldn't be created.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.createLink_ = function(\n    range, url, opt_target) {\n  var anchor = null;\n  var anchors = [];\n  var parent = range && range.getContainerElement();\n  // We do not yet support creating links around images.  Instead of throwing\n  // lots of js errors, just fail silently.\n  // TODO(user): Add support for linking images.\n  if (parent && parent.tagName == goog.dom.TagName.IMG) {\n    return null;\n  }\n  // If range is not present, the editable field doesn't have focus, abort\n  // creating a link.\n  if (!range) {\n    return null;\n  }\n\n  if (range.isCollapsed()) {\n    var textRange = range.getTextRange(0).getBrowserRangeObject();\n    if (goog.editor.BrowserFeature.HAS_W3C_RANGES) {\n      anchor = this.getFieldDomHelper().createElement(goog.dom.TagName.A);\n      textRange.insertNode(anchor);\n    } else if (goog.editor.BrowserFeature.HAS_IE_RANGES) {\n      // TODO: Use goog.dom.AbstractRange's surroundContents\n      textRange.pasteHTML(\"<a id='newLink'></a>\");\n      anchor = this.getFieldDomHelper().getElement('newLink');\n      anchor.removeAttribute('id');\n    }\n  } else {\n    // Create a unique identifier for the link so we can retrieve it later.\n    // execCommand doesn't return the link to us, and we need a way to find\n    // the newly created link in the dom, and the url is the only property\n    // we have control over, so we set that to be unique and then find it.\n    var uniqueId = goog.string.createUniqueString();\n    this.execCommandHelper_('CreateLink', uniqueId);\n    var setHrefAndLink = function(element, index, arr) {\n      // We can't do straight comparison since the href can contain the\n      // absolute url.\n      if (goog.string.endsWith(element.href, uniqueId)) {\n        anchors.push(element);\n      }\n    };\n\n    goog.array.forEach(\n        goog.dom.getElementsByTagName(\n            goog.dom.TagName.A,\n            /** @type {!Element} */ (this.getFieldObject().getElement())),\n        setHrefAndLink);\n    if (anchors.length) {\n      anchor = anchors.pop();\n    }\n    var isLikelyUrl = function(a, i, anchors) {\n      return goog.editor.Link.isLikelyUrl(goog.dom.getRawTextContent(a));\n    };\n    if (anchors.length && goog.array.every(anchors, isLikelyUrl)) {\n      for (var i = 0, a; a = anchors[i]; i++) {\n        goog.editor.Link.createNewLinkFromText(a, opt_target);\n      }\n      anchors = null;\n    }\n  }\n\n  return goog.editor.Link.createNewLink(\n      /** @type {HTMLAnchorElement} */ (anchor), url, opt_target, anchors);\n};\n\n\n//---------------------------------------------------------------------\n// browser fixes\n\n\n/**\n * The following execCommands are \"broken\" in some way - in IE they allow\n * the nodes outside the contentEditable region to get modified (see\n * execCommand below for more details).\n * @const\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.brokenExecCommandsIE_ = {\n  'indent': 1,\n  'outdent': 1,\n  'insertOrderedList': 1,\n  'insertUnorderedList': 1,\n  'justifyCenter': 1,\n  'justifyFull': 1,\n  'justifyRight': 1,\n  'justifyLeft': 1,\n  'ltr': 1,\n  'rtl': 1\n};\n\n\n/**\n * When the following commands are executed while the selection is\n * inside a blockquote, they hose the blockquote tag in weird and\n * unintuitive ways.\n * @const\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.blockquoteHatingCommandsIE_ = {\n  'insertOrderedList': 1,\n  'insertUnorderedList': 1\n};\n\n\n/**\n * Makes sure that superscript is removed before applying subscript, and vice\n * versa. Fixes {@link http://buganizer/issue?id=1173491} .\n * @param {goog.editor.plugins.BasicTextFormatter.COMMAND} command The command\n *     being applied, either SUBSCRIPT or SUPERSCRIPT.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype\n    .applySubscriptSuperscriptWorkarounds_ = function(command) {\n  if (!this.queryCommandValue(command)) {\n    // The current selection doesn't currently have the requested\n    // command, so we are applying it as opposed to removing it.\n    // (Note that queryCommandValue() will only return true if the\n    // command is applied to the whole selection, not just part of it.\n    // In this case it is fine because only if the whole selection has\n    // the command applied will we be removing it and thus skipping the\n    // removal of the opposite command.)\n    var oppositeCommand =\n        (command == goog.editor.plugins.BasicTextFormatter.COMMAND.SUBSCRIPT ?\n             goog.editor.plugins.BasicTextFormatter.COMMAND.SUPERSCRIPT :\n             goog.editor.plugins.BasicTextFormatter.COMMAND.SUBSCRIPT);\n    var oppositeExecCommand =\n        goog.editor.plugins.BasicTextFormatter.convertToRealExecCommand_(\n            oppositeCommand);\n    // Executing the opposite command on a selection that already has it\n    // applied will cancel it out. But if the selection only has the\n    // opposite command applied to a part of it, the browser will\n    // normalize the selection to have the opposite command applied on\n    // the whole of it.\n    if (!this.queryCommandValue(oppositeCommand)) {\n      // The selection doesn't have the opposite command applied to the\n      // whole of it, so let's exec the opposite command to normalize\n      // the selection.\n      // Note: since we know both subscript and superscript commands\n      // will boil down to a simple call to the browser's execCommand(),\n      // for performance reasons we can do that directly instead of\n      // calling execCommandHelper_(). However this is a potential for\n      // bugs if the implementation of execCommandHelper_() is changed\n      // to do something more int eh case of subscript and superscript.\n      this.getDocument_().execCommand(oppositeExecCommand, false, null);\n    }\n    // Now that we know the whole selection has the opposite command\n    // applied, we exec it a second time to properly remove it.\n    this.getDocument_().execCommand(oppositeExecCommand, false, null);\n  }\n};\n\n\n/**\n * Removes inline font-size styles from elements fully contained in the\n * selection, so the font tags produced by execCommand work properly.\n * See {@bug 1286408}.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.removeFontSizeFromStyleAttrs_ =\n    function() {\n  // Expand the range so that we consider surrounding tags. E.g. if only the\n  // text node inside a span is selected, the browser could wrap a font tag\n  // around the span and leave the selection such that only the text node is\n  // found when looking inside the range, not the span.\n  var range = goog.editor.range.expand(\n      this.getFieldObject().getRange(), this.getFieldObject().getElement());\n  goog.iter.forEach(goog.iter.filter(range, function(tag, dummy, iter) {\n    return iter.isStartTag() && range.containsNode(tag);\n  }), function(node) {\n    goog.style.setStyle(node, 'font-size', '');\n    // Gecko doesn't remove empty style tags.\n    if (goog.userAgent.GECKO && node.style.length == 0 &&\n        node.getAttribute('style') != null) {\n      node.removeAttribute('style');\n    }\n  });\n};\n\n\n/**\n * Apply pre-execCommand fixes for IE.\n * @param {string} command The command to execute.\n * @return {!Array<Node>} Array of nodes to be removed after the execCommand.\n *     Will never be longer than 2 elements.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.applyExecCommandIEFixes_ =\n    function(command) {\n  // IE has a crazy bug where executing list commands\n  // around blockquotes cause the blockquotes to get transformed\n  // into \"<OL><OL>\" or \"<UL><UL>\" tags.\n  var toRemove = [];\n  var endDiv = null;\n  var range = this.getRange_();\n  var dh = this.getFieldDomHelper();\n  if (command in\n      goog.editor.plugins.BasicTextFormatter.blockquoteHatingCommandsIE_) {\n    var parent = range && range.getContainerElement();\n    if (parent) {\n      var blockquotes = goog.dom.getElementsByTagNameAndClass(\n          goog.dom.TagName.BLOCKQUOTE, null, parent);\n\n      // If a blockquote contains the selection, the fix is easy:\n      // add a dummy div to the blockquote that isn't in the current selection.\n      //\n      // if the selection contains a blockquote,\n      // there appears to be no easy way to protect it from getting mangled.\n      // For now, we're just going to punt on this and try to\n      // adjust the selection so that IE does something reasonable.\n      //\n      // TODO(nicksantos): Find a better fix for this.\n      var bq;\n      for (var i = 0; i < blockquotes.length; i++) {\n        if (range.containsNode(blockquotes[i])) {\n          bq = blockquotes[i];\n          break;\n        }\n      }\n\n      var bqThatNeedsDummyDiv = bq ||\n          goog.dom.getAncestorByTagNameAndClass(\n              parent, goog.dom.TagName.BLOCKQUOTE);\n      if (bqThatNeedsDummyDiv) {\n        endDiv = dh.createDom(goog.dom.TagName.DIV, {style: 'height:0'});\n        goog.dom.appendChild(bqThatNeedsDummyDiv, endDiv);\n        toRemove.push(endDiv);\n\n        if (bq) {\n          range = goog.dom.Range.createFromNodes(bq, 0, endDiv, 0);\n        } else if (range.containsNode(endDiv)) {\n          // the selection might be the entire blockquote, and\n          // it's important that endDiv not be in the selection.\n          range = goog.dom.Range.createFromNodes(\n              range.getStartNode(), range.getStartOffset(), endDiv, 0);\n        }\n        range.select();\n      }\n    }\n  }\n\n  // IE has a crazy bug where certain block execCommands cause it to mess with\n  // the DOM nodes above the contentEditable element if the selection contains\n  // or partially contains the last block element in the contentEditable\n  // element.\n  // Known commands: Indent, outdent, insertorderedlist, insertunorderedlist,\n  // Justify (all of them)\n\n  // Both of the above are \"solved\" by appending a dummy div to the field\n  // before the execCommand and removing it after, but we don't need to do this\n  // if we've alread added a dummy div somewhere else.\n  var fieldObject = this.getFieldObject();\n  if (!fieldObject.usesIframe() && !endDiv) {\n    if (command in\n        goog.editor.plugins.BasicTextFormatter.brokenExecCommandsIE_) {\n      var field = fieldObject.getElement();\n\n      // If the field is totally empty, or if the field contains only text nodes\n      // and the cursor is at the end of the field, then IE stills walks outside\n      // the contentEditable region and destroys things AND justify will not\n      // work. This is \"solved\" by adding a text node into the end of the\n      // field and moving the cursor before it.\n      if (range && range.isCollapsed() &&\n          !goog.dom.getFirstElementChild(field)) {\n        // The problem only occurs if the selection is at the end of the field.\n        var selection = range.getTextRange(0).getBrowserRangeObject();\n        var testRange = selection.duplicate();\n        testRange.moveToElementText(field);\n        testRange.collapse(false);\n\n        if (testRange.isEqual(selection)) {\n          // For reasons I really don't understand, if you use a breaking space\n          // here, either \" \" or String.fromCharCode(32), this textNode becomes\n          // corrupted, only after you hit ENTER to split it.  It exists in the\n          // dom in that its parent has it as childNode and the parent's\n          // innerText is correct, but the node itself throws invalid argument\n          // errors when you try to access its data, parentNode, nextSibling,\n          // previousSibling or most other properties.  WTF.\n          var nbsp = dh.createTextNode(goog.string.Unicode.NBSP);\n          field.appendChild(nbsp);\n          selection.move('character', 1);\n          selection.move('character', -1);\n          selection.select();\n          toRemove.push(nbsp);\n        }\n      }\n\n      endDiv = dh.createDom(goog.dom.TagName.DIV, {style: 'height:0'});\n      goog.dom.appendChild(field, endDiv);\n      toRemove.push(endDiv);\n    }\n  }\n\n  return toRemove;\n};\n\n\n/**\n * Fix a ridiculous Safari bug: the first letters of new headings\n * somehow retain their original font size and weight if multiple lines are\n * selected during the execCommand that turns them into headings.\n * The solution is to strip these styles which are normally stripped when\n * making things headings anyway.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.cleanUpSafariHeadings_ =\n    function() {\n  goog.iter.forEach(this.getRange_(), function(node) {\n    if (node.className == 'Apple-style-span') {\n      // These shouldn't persist after creating headings via\n      // a FormatBlock execCommand.\n      node.style.fontSize = '';\n      node.style.fontWeight = '';\n    }\n  });\n};\n\n\n/**\n * Prevent Safari from making each list item be \"1\" when converting from\n * unordered to ordered lists.\n * (see https://bugs.webkit.org/show_bug.cgi?id=19539, fixed by 2010-04-21)\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.fixSafariLists_ = function() {\n  var previousList = false;\n  goog.iter.forEach(this.getRange_(), function(node) {\n    var tagName = node.tagName;\n    if (tagName == goog.dom.TagName.UL || tagName == goog.dom.TagName.OL) {\n      // Don't disturb lists outside of the selection. If this is the first <ul>\n      // or <ol> in the range, we don't really want to merge the previous list\n      // into it, since that list isn't in the range.\n      if (!previousList) {\n        previousList = true;\n        return;\n      }\n      // The lists must be siblings to be merged; otherwise, indented sublists\n      // could be broken.\n      var previousElementSibling = goog.dom.getPreviousElementSibling(node);\n      if (!previousElementSibling) {\n        return;\n      }\n      // Make sure there isn't text between the two lists before they are merged\n      var range = node.ownerDocument.createRange();\n      range.setStartAfter(previousElementSibling);\n      range.setEndBefore(node);\n      if (!goog.string.isEmptyOrWhitespace(range.toString())) {\n        return;\n      }\n      // Make sure both are lists of the same type (ordered or unordered)\n      if (previousElementSibling.nodeName == node.nodeName) {\n        // We must merge the previous list into this one. Moving around\n        // the current node will break the iterator, so we can't merge\n        // this list into the previous one.\n        while (previousElementSibling.lastChild) {\n          node.insertBefore(previousElementSibling.lastChild, node.firstChild);\n        }\n        previousElementSibling.parentNode.removeChild(previousElementSibling);\n      }\n    }\n  });\n};\n\n\n/**\n * Sane \"type\" attribute values for OL elements\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.orderedListTypes_ = {\n  '1': 1,\n  'a': 1,\n  'A': 1,\n  'i': 1,\n  'I': 1\n};\n\n\n/**\n * Sane \"type\" attribute values for UL elements\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.unorderedListTypes_ = {\n  'disc': 1,\n  'circle': 1,\n  'square': 1\n};\n\n\n/**\n * Changing an OL to a UL (or the other way around) will fail if the list\n * has a type attribute (such as \"UL type=disc\" becoming \"OL type=disc\", which\n * is visually identical). Most browsers will remove the type attribute\n * automatically, but IE doesn't. This does it manually.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.fixIELists_ = function() {\n  // Find the lowest-level <ul> or <ol> that contains the entire range.\n  var range = this.getRange_();\n  var container = range && range.getContainer();\n  while (container &&\n         /** @type {!Element} */ (container).tagName != goog.dom.TagName.UL &&\n         /** @type {!Element} */ (container).tagName != goog.dom.TagName.OL) {\n    container = container.parentNode;\n  }\n  if (container) {\n    // We want the parent node of the list so that we can grab it using\n    // getElementsByTagName\n    container = container.parentNode;\n  }\n  if (!container) return;\n  var lists = goog.array.toArray(goog.dom.getElementsByTagName(\n      goog.dom.TagName.UL, /** @type {!Element} */ (container)));\n  goog.array.extend(\n      lists,\n      goog.array.toArray(goog.dom.getElementsByTagName(\n          goog.dom.TagName.OL, /** @type {!Element} */ (container))));\n  // Fix the lists\n  goog.array.forEach(lists, function(node) {\n    var type = node.type;\n    if (type) {\n      var saneTypes =\n          (node.tagName == goog.dom.TagName.UL ?\n               goog.editor.plugins.BasicTextFormatter.unorderedListTypes_ :\n               goog.editor.plugins.BasicTextFormatter.orderedListTypes_);\n      if (!saneTypes[type]) {\n        node.type = '';\n      }\n    }\n  });\n};\n\n\n/**\n * In WebKit, the following commands will modify the node with\n * contentEditable=true if there are no block-level elements.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.brokenExecCommandsSafari_ = {\n  'justifyCenter': 1,\n  'justifyFull': 1,\n  'justifyRight': 1,\n  'justifyLeft': 1,\n  'formatBlock': 1\n};\n\n\n/**\n * In WebKit, the following commands can hang the browser if the selection\n * touches the beginning of the field.\n * https://bugs.webkit.org/show_bug.cgi?id=19735\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.hangingExecCommandWebkit_ = {\n  'insertOrderedList': 1,\n  'insertUnorderedList': 1\n};\n\n\n/**\n * Apply pre-execCommand fixes for Safari.\n * @param {string} command The command to execute.\n * @return {!Element|undefined} The div added to the field.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.applyExecCommandSafariFixes_ =\n    function(command) {\n  // See the comment on brokenExecCommandsSafari_\n  var div;\n  if (goog.editor.plugins.BasicTextFormatter\n          .brokenExecCommandsSafari_[command]) {\n    // Add a new div at the end of the field.\n    // Safari knows that it would be wrong to apply text-align to the\n    // contentEditable element if there are non-empty block nodes in the field,\n    // because then it would align them too. So in this case, it will\n    // enclose the current selection in a block node.\n    div = this.getFieldDomHelper().createDom(\n        goog.dom.TagName.DIV, {'style': 'height: 0'}, 'x');\n    goog.dom.appendChild(this.getFieldObject().getElement(), div);\n  }\n\n  if (!goog.userAgent.isVersionOrHigher(534) &&\n      goog.editor.plugins.BasicTextFormatter\n          .hangingExecCommandWebkit_[command]) {\n    // Add a new div at the beginning of the field.\n    var field = this.getFieldObject().getElement();\n    div = this.getFieldDomHelper().createDom(\n        goog.dom.TagName.DIV, {'style': 'height: 0'}, 'x');\n    field.insertBefore(div, field.firstChild);\n  }\n\n  return div;\n};\n\n\n/**\n * Apply pre-execCommand fixes for Gecko.\n * @param {string} command The command to execute.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.applyExecCommandGeckoFixes_ =\n    function(command) {\n  if (goog.userAgent.isVersionOrHigher('1.9') &&\n      command.toLowerCase() == 'formatblock') {\n    // Firefox 3 and above throw a JS error for formatblock if the range is\n    // a child of the body node. Changing the selection to the BR fixes the\n    // problem.\n    // See https://bugzilla.mozilla.org/show_bug.cgi?id=481696\n    var range = this.getRange_();\n    var startNode = range.getStartNode();\n    if (range.isCollapsed() && startNode &&\n        /** @type {!Element} */ (startNode).tagName == goog.dom.TagName.BODY) {\n      var startOffset = range.getStartOffset();\n      var childNode = startNode.childNodes[startOffset];\n      if (childNode && childNode.tagName == goog.dom.TagName.BR) {\n        // Change the range using getBrowserRange() because goog.dom.TextRange\n        // will avoid setting <br>s directly.\n        // @see goog.dom.TextRange#createFromNodes\n        var browserRange = range.getBrowserRangeObject();\n        browserRange.setStart(childNode, 0);\n        browserRange.setEnd(childNode, 0);\n      }\n    }\n  }\n};\n\n\n/**\n * Workaround for Opera bug CORE-23903. Opera sometimes fails to invalidate\n * serialized CSS or innerHTML for the DOM after certain execCommands when\n * styleWithCSS is on. Toggling an inline style on the elements fixes it.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.invalidateInlineCss_ =\n    function() {\n  var ancestors = [];\n  var ancestor = this.getFieldObject().getRange().getContainerElement();\n  do {\n    ancestors.push(ancestor);\n  } while (ancestor = ancestor.parentNode);\n  var nodesInSelection = goog.iter.chain(\n      goog.iter.toIterator(this.getFieldObject().getRange()),\n      goog.iter.toIterator(ancestors));\n  var containersInSelection =\n      goog.iter.filter(nodesInSelection, goog.editor.style.isContainer);\n  goog.iter.forEach(containersInSelection, function(element) {\n    var oldOutline = element.style.outline;\n    element.style.outline = '0px solid red';\n    element.style.outline = oldOutline;\n  });\n};\n\n\n/**\n * Work around a Gecko bug that causes inserted lists to forget the current\n * font. This affects WebKit in the same way and Opera in a slightly different\n * way, but this workaround only works in Gecko.\n * WebKit bug: https://bugs.webkit.org/show_bug.cgi?id=19653\n * Mozilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=439966\n * Opera bug: https://bugs.opera.com/show_bug.cgi?id=340392\n * TODO: work around this issue in WebKit and Opera as well.\n * @return {boolean} Whether the workaround was applied.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.beforeInsertListGecko_ =\n    function() {\n  var tag =\n      this.getFieldObject().queryCommandValue(goog.editor.Command.DEFAULT_TAG);\n  if (tag == goog.dom.TagName.P || tag == goog.dom.TagName.DIV) {\n    return false;\n  }\n\n  // Prevent Firefox from forgetting current formatting\n  // when creating a list.\n  // The bug happens with a collapsed selection, but it won't\n  // happen when text with the desired formatting is selected.\n  // So, we insert some dummy text, insert the list,\n  // then remove the dummy text (while preserving its formatting).\n  // (This formatting bug also affects WebKit, but this fix\n  // only seems to work in Firefox)\n  var range = this.getRange_();\n  if (range.isCollapsed() &&\n      (range.getContainer().nodeType != goog.dom.NodeType.TEXT)) {\n    var tempTextNode =\n        this.getFieldDomHelper().createTextNode(goog.string.Unicode.NBSP);\n    range.insertNode(tempTextNode, false);\n    goog.dom.Range.createFromNodeContents(tempTextNode).select();\n    return true;\n  }\n  return false;\n};\n\n\n// Helpers for queryCommandState\n\n\n/**\n * Get the toolbar state for the block-level elements in the given range.\n * @param {goog.dom.AbstractRange} range The range to get toolbar state for.\n * @return {string?} The selection block state.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.getSelectionBlockState_ = function(\n    range) {\n  var tagName = null;\n  goog.iter.forEach(range, function(node, ignore, it) {\n    if (!it.isEndTag()) {\n      // Iterate over all containers in the range, checking if they all have the\n      // same tagName.\n      var container = goog.editor.style.getContainer(node);\n      var thisTagName = container.tagName;\n      tagName = tagName || thisTagName;\n\n      if (tagName != thisTagName) {\n        // If we find a container tag that doesn't match, exit right away.\n        tagName = null;\n        throw goog.iter.StopIteration;\n      }\n\n      // Skip the tag.\n      it.skipTag();\n    }\n  });\n\n  return tagName;\n};\n\n\n/**\n * Hash of suppoted justifications.\n * @type {Object}\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.SUPPORTED_JUSTIFICATIONS_ = {\n  'center': 1,\n  'justify': 1,\n  'right': 1,\n  'left': 1\n};\n\n\n/**\n * To avoid forcing the BidiPlugin code to be loaded create a simple interface\n * for the method that is needed.\n *\n * @record\n */\ngoog.editor.plugins.BasicTextFormatter.IBidiPlugin = function() {\n  /** @type {function():?string}} */\n  this.getSelectionAlignment;\n};\n\n\n/**\n * Returns true if the current justification matches the justification\n * command for the entire selection.\n * @param {string} command The justification command to check for.\n * @return {boolean} Whether the current justification matches the justification\n *     command for the entire selection.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.isJustification_ = function(\n    command) {\n  var alignment = command.replace('+justify', '').toLowerCase();\n  if (alignment == 'full') {\n    alignment = 'justify';\n  }\n\n  var bidiPlugin = this.getFieldObject().getPluginByClassId('Bidi');\n  if (bidiPlugin) {\n    // BiDi aware version\n\n    // TODO: Since getComputedStyle is not used here, this version may be even\n    // faster. If profiling confirms that it would be good to use this approach\n    // in both cases. Otherwise the bidi part should be moved into an\n    // execCommand so this bidi plugin dependence isn't needed here.\n    return alignment ==\n        /** @type {!goog.editor.plugins.BasicTextFormatter.IBidiPlugin} */\n        (bidiPlugin).getSelectionAlignment();\n  } else {\n    // BiDi unaware version\n    var range = this.getRange_();\n    if (!range) {\n      // When nothing is in the selection then no justification\n      // command matches.\n      return false;\n    }\n\n    var parent = range.getContainerElement();\n    var nodes = goog.array.filter(parent.childNodes, function(node) {\n      return goog.editor.node.isImportant(node) &&\n          range.containsNode(node, true);\n    });\n    nodes = nodes.length ? nodes : [parent];\n\n    for (var i = 0; i < nodes.length; i++) {\n      var current = nodes[i];\n\n      // If any node in the selection is not aligned the way we are checking,\n      // then the justification command does not match.\n      var container = goog.editor.style.getContainer(\n          /** @type {Node} */ (current));\n      if (alignment !=\n          goog.editor.plugins.BasicTextFormatter.getNodeJustification_(\n              container)) {\n        return false;\n      }\n    }\n\n    // If all nodes in the selection are aligned the way we are checking,\n    // the justification command does match.\n    return true;\n  }\n};\n\n\n/**\n * Determines the justification for a given block-level element.\n * @param {Element} element The node to get justification for.\n * @return {string} The justification for a given block-level node.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.getNodeJustification_ = function(\n    element) {\n  var value = goog.style.getComputedTextAlign(element);\n  // Strip preceding -moz- or -webkit- (@bug 2472589).\n  value = value.replace(/^-(moz|webkit)-/, '');\n\n  // If there is no alignment, try the inline property,\n  // otherwise assume left aligned.\n  // TODO: for rtl languages we probably need to assume right.\n  if (!goog.editor.plugins.BasicTextFormatter\n           .SUPPORTED_JUSTIFICATIONS_[value]) {\n    value = element.align || 'left';\n  }\n  return /** @type {string} */ (value);\n};\n\n\n/**\n * Returns true if a selection contained in the node should set the appropriate\n * toolbar state for the given nodeName, e.g. if the node is contained in a\n * strong element and nodeName is \"strong\", then it will return true.\n * @param {!goog.dom.TagName} nodeName The type of node to check for.\n * @return {boolean} Whether the user's selection is in the given state.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.isNodeInState_ = function(\n    nodeName) {\n  var range = this.getRange_();\n  var node = range && range.getContainerElement();\n  var ancestor = goog.dom.getAncestorByTagNameAndClass(node, nodeName);\n  return !!ancestor && goog.editor.node.isEditable(ancestor);\n};\n\n\n/**\n * Wrapper for browser's queryCommandState.\n * @param {Document|TextRange|Range} queryObject The object to query.\n * @param {string} command The command to check.\n * @param {boolean=} opt_styleWithCss Set to true to enable styleWithCSS before\n *     performing the queryCommandState.\n * @return {boolean} The command state.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.queryCommandStateInternal_ =\n    function(queryObject, command, opt_styleWithCss) {\n  return /** @type {boolean} */ (\n      this.queryCommandHelper_(true, queryObject, command, opt_styleWithCss));\n};\n\n\n/**\n * Wrapper for browser's queryCommandValue.\n * @param {Document|TextRange|Range} queryObject The object to query.\n * @param {string} command The command to check.\n * @param {boolean=} opt_styleWithCss Set to true to enable styleWithCSS before\n *     performing the queryCommandValue.\n * @return {string|boolean|null} The command value.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.queryCommandValueInternal_ =\n    function(queryObject, command, opt_styleWithCss) {\n  return this.queryCommandHelper_(\n      false, queryObject, command, opt_styleWithCss);\n};\n\n\n/**\n * Helper function to perform queryCommand(Value|State).\n * @param {boolean} isGetQueryCommandState True to use queryCommandState, false\n *     to use queryCommandValue.\n * @param {Document|TextRange|Range} queryObject The object to query.\n * @param {string} command The command to check.\n * @param {boolean=} opt_styleWithCss Set to true to enable styleWithCSS before\n *     performing the queryCommand(Value|State).\n * @return {string|boolean|null} The command value.\n * @private\n */\ngoog.editor.plugins.BasicTextFormatter.prototype.queryCommandHelper_ = function(\n    isGetQueryCommandState, queryObject, command, opt_styleWithCss) {\n  command =\n      goog.editor.plugins.BasicTextFormatter.convertToRealExecCommand_(command);\n  if (opt_styleWithCss) {\n    var doc = this.getDocument_();\n    // Don't use this.execCommandHelper_ here, as it is more heavyweight\n    // and inserts a dummy div to protect against comamnds that could step\n    // outside the editable region, which would cause change event on\n    // every toolbar update.\n    doc.execCommand('styleWithCSS', false, true);\n  }\n  var ret = isGetQueryCommandState ? queryObject.queryCommandState(command) :\n                                     queryObject.queryCommandValue(command);\n  if (opt_styleWithCss) {\n    doc.execCommand('styleWithCSS', false, false);\n  }\n  return ret;\n};\n","^17",1579837703000,"^18",["^19",["^;G","^1T","^3G","^2R","^2D","^2S","^2V","^Z","^2G","^2X","^2J","^<7","~$goog.editor.Link","^3Y","^5<","^29","^31","^32","~$goog.editor.style","^33","^35","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/basictextformatter.js"],"^1J",["^19",["~$goog.editor.plugins.BasicTextFormatter","~$goog.editor.plugins.BasicTextFormatter.COMMAND"]],"^X",true,"^Y",["^Z","^35","^1T","^3G","^33","^1V","^2V","^2R","^=?","^3Y","^31","^2S","^=@","^;G","^5<","^2J","^2G","^2D","^32","^29","^<7","^2X"]],["^ ","^[",[1579837703000],"^10","goog.i18n.datetimesymbolsext.js","^11",["^12","goog/i18n/datetimesymbolsext.js"],"^13","goog/i18n/datetimesymbolsext.js","^14","^15","^16","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Date/time formatting symbols for all locales.\n *\n * File generated from CLDR ver. 35\n *\n * This file covers those locales that are not covered in\n * \"datetimesymbols.js\".\n *\n * @suppress {const,missingRequire} Suppress \"missing require\" warnings for\n *     names like goog.i18n.DateTimeSymbols_af. They are included\n *     by requiring goog.i18n.DateTimeSymbols.\n */\n\n// clang-format off\n\ngoog.provide('goog.i18n.DateTimeSymbolsExt');\ngoog.provide('goog.i18n.DateTimeSymbols_af_NA');\ngoog.provide('goog.i18n.DateTimeSymbols_af_ZA');\ngoog.provide('goog.i18n.DateTimeSymbols_agq');\ngoog.provide('goog.i18n.DateTimeSymbols_agq_CM');\ngoog.provide('goog.i18n.DateTimeSymbols_ak');\ngoog.provide('goog.i18n.DateTimeSymbols_ak_GH');\ngoog.provide('goog.i18n.DateTimeSymbols_am_ET');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_001');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_AE');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_BH');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_DJ');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_EH');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_ER');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_IL');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_IQ');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_JO');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_KM');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_KW');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_LB');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_LY');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_MA');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_MR');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_OM');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_PS');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_QA');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_SA');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_SD');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_SO');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_SS');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_SY');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_TD');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_TN');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_XB');\ngoog.provide('goog.i18n.DateTimeSymbols_ar_YE');\ngoog.provide('goog.i18n.DateTimeSymbols_as');\ngoog.provide('goog.i18n.DateTimeSymbols_as_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_asa');\ngoog.provide('goog.i18n.DateTimeSymbols_asa_TZ');\ngoog.provide('goog.i18n.DateTimeSymbols_ast');\ngoog.provide('goog.i18n.DateTimeSymbols_ast_ES');\ngoog.provide('goog.i18n.DateTimeSymbols_az_Cyrl');\ngoog.provide('goog.i18n.DateTimeSymbols_az_Cyrl_AZ');\ngoog.provide('goog.i18n.DateTimeSymbols_az_Latn');\ngoog.provide('goog.i18n.DateTimeSymbols_az_Latn_AZ');\ngoog.provide('goog.i18n.DateTimeSymbols_bas');\ngoog.provide('goog.i18n.DateTimeSymbols_bas_CM');\ngoog.provide('goog.i18n.DateTimeSymbols_be_BY');\ngoog.provide('goog.i18n.DateTimeSymbols_bem');\ngoog.provide('goog.i18n.DateTimeSymbols_bem_ZM');\ngoog.provide('goog.i18n.DateTimeSymbols_bez');\ngoog.provide('goog.i18n.DateTimeSymbols_bez_TZ');\ngoog.provide('goog.i18n.DateTimeSymbols_bg_BG');\ngoog.provide('goog.i18n.DateTimeSymbols_bm');\ngoog.provide('goog.i18n.DateTimeSymbols_bm_ML');\ngoog.provide('goog.i18n.DateTimeSymbols_bn_BD');\ngoog.provide('goog.i18n.DateTimeSymbols_bn_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_bo');\ngoog.provide('goog.i18n.DateTimeSymbols_bo_CN');\ngoog.provide('goog.i18n.DateTimeSymbols_bo_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_br_FR');\ngoog.provide('goog.i18n.DateTimeSymbols_brx');\ngoog.provide('goog.i18n.DateTimeSymbols_brx_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_bs_Cyrl');\ngoog.provide('goog.i18n.DateTimeSymbols_bs_Cyrl_BA');\ngoog.provide('goog.i18n.DateTimeSymbols_bs_Latn');\ngoog.provide('goog.i18n.DateTimeSymbols_bs_Latn_BA');\ngoog.provide('goog.i18n.DateTimeSymbols_ca_AD');\ngoog.provide('goog.i18n.DateTimeSymbols_ca_ES');\ngoog.provide('goog.i18n.DateTimeSymbols_ca_FR');\ngoog.provide('goog.i18n.DateTimeSymbols_ca_IT');\ngoog.provide('goog.i18n.DateTimeSymbols_ccp');\ngoog.provide('goog.i18n.DateTimeSymbols_ccp_BD');\ngoog.provide('goog.i18n.DateTimeSymbols_ccp_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_ce');\ngoog.provide('goog.i18n.DateTimeSymbols_ce_RU');\ngoog.provide('goog.i18n.DateTimeSymbols_ceb');\ngoog.provide('goog.i18n.DateTimeSymbols_ceb_PH');\ngoog.provide('goog.i18n.DateTimeSymbols_cgg');\ngoog.provide('goog.i18n.DateTimeSymbols_cgg_UG');\ngoog.provide('goog.i18n.DateTimeSymbols_chr_US');\ngoog.provide('goog.i18n.DateTimeSymbols_ckb');\ngoog.provide('goog.i18n.DateTimeSymbols_ckb_IQ');\ngoog.provide('goog.i18n.DateTimeSymbols_ckb_IR');\ngoog.provide('goog.i18n.DateTimeSymbols_cs_CZ');\ngoog.provide('goog.i18n.DateTimeSymbols_cy_GB');\ngoog.provide('goog.i18n.DateTimeSymbols_da_DK');\ngoog.provide('goog.i18n.DateTimeSymbols_da_GL');\ngoog.provide('goog.i18n.DateTimeSymbols_dav');\ngoog.provide('goog.i18n.DateTimeSymbols_dav_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_de_BE');\ngoog.provide('goog.i18n.DateTimeSymbols_de_DE');\ngoog.provide('goog.i18n.DateTimeSymbols_de_IT');\ngoog.provide('goog.i18n.DateTimeSymbols_de_LI');\ngoog.provide('goog.i18n.DateTimeSymbols_de_LU');\ngoog.provide('goog.i18n.DateTimeSymbols_dje');\ngoog.provide('goog.i18n.DateTimeSymbols_dje_NE');\ngoog.provide('goog.i18n.DateTimeSymbols_dsb');\ngoog.provide('goog.i18n.DateTimeSymbols_dsb_DE');\ngoog.provide('goog.i18n.DateTimeSymbols_dua');\ngoog.provide('goog.i18n.DateTimeSymbols_dua_CM');\ngoog.provide('goog.i18n.DateTimeSymbols_dyo');\ngoog.provide('goog.i18n.DateTimeSymbols_dyo_SN');\ngoog.provide('goog.i18n.DateTimeSymbols_dz');\ngoog.provide('goog.i18n.DateTimeSymbols_dz_BT');\ngoog.provide('goog.i18n.DateTimeSymbols_ebu');\ngoog.provide('goog.i18n.DateTimeSymbols_ebu_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_ee');\ngoog.provide('goog.i18n.DateTimeSymbols_ee_GH');\ngoog.provide('goog.i18n.DateTimeSymbols_ee_TG');\ngoog.provide('goog.i18n.DateTimeSymbols_el_CY');\ngoog.provide('goog.i18n.DateTimeSymbols_el_GR');\ngoog.provide('goog.i18n.DateTimeSymbols_en_001');\ngoog.provide('goog.i18n.DateTimeSymbols_en_150');\ngoog.provide('goog.i18n.DateTimeSymbols_en_AE');\ngoog.provide('goog.i18n.DateTimeSymbols_en_AG');\ngoog.provide('goog.i18n.DateTimeSymbols_en_AI');\ngoog.provide('goog.i18n.DateTimeSymbols_en_AS');\ngoog.provide('goog.i18n.DateTimeSymbols_en_AT');\ngoog.provide('goog.i18n.DateTimeSymbols_en_BB');\ngoog.provide('goog.i18n.DateTimeSymbols_en_BE');\ngoog.provide('goog.i18n.DateTimeSymbols_en_BI');\ngoog.provide('goog.i18n.DateTimeSymbols_en_BM');\ngoog.provide('goog.i18n.DateTimeSymbols_en_BS');\ngoog.provide('goog.i18n.DateTimeSymbols_en_BW');\ngoog.provide('goog.i18n.DateTimeSymbols_en_BZ');\ngoog.provide('goog.i18n.DateTimeSymbols_en_CC');\ngoog.provide('goog.i18n.DateTimeSymbols_en_CH');\ngoog.provide('goog.i18n.DateTimeSymbols_en_CK');\ngoog.provide('goog.i18n.DateTimeSymbols_en_CM');\ngoog.provide('goog.i18n.DateTimeSymbols_en_CX');\ngoog.provide('goog.i18n.DateTimeSymbols_en_CY');\ngoog.provide('goog.i18n.DateTimeSymbols_en_DE');\ngoog.provide('goog.i18n.DateTimeSymbols_en_DG');\ngoog.provide('goog.i18n.DateTimeSymbols_en_DK');\ngoog.provide('goog.i18n.DateTimeSymbols_en_DM');\ngoog.provide('goog.i18n.DateTimeSymbols_en_ER');\ngoog.provide('goog.i18n.DateTimeSymbols_en_FI');\ngoog.provide('goog.i18n.DateTimeSymbols_en_FJ');\ngoog.provide('goog.i18n.DateTimeSymbols_en_FK');\ngoog.provide('goog.i18n.DateTimeSymbols_en_FM');\ngoog.provide('goog.i18n.DateTimeSymbols_en_GD');\ngoog.provide('goog.i18n.DateTimeSymbols_en_GG');\ngoog.provide('goog.i18n.DateTimeSymbols_en_GH');\ngoog.provide('goog.i18n.DateTimeSymbols_en_GI');\ngoog.provide('goog.i18n.DateTimeSymbols_en_GM');\ngoog.provide('goog.i18n.DateTimeSymbols_en_GU');\ngoog.provide('goog.i18n.DateTimeSymbols_en_GY');\ngoog.provide('goog.i18n.DateTimeSymbols_en_HK');\ngoog.provide('goog.i18n.DateTimeSymbols_en_IL');\ngoog.provide('goog.i18n.DateTimeSymbols_en_IM');\ngoog.provide('goog.i18n.DateTimeSymbols_en_IO');\ngoog.provide('goog.i18n.DateTimeSymbols_en_JE');\ngoog.provide('goog.i18n.DateTimeSymbols_en_JM');\ngoog.provide('goog.i18n.DateTimeSymbols_en_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_en_KI');\ngoog.provide('goog.i18n.DateTimeSymbols_en_KN');\ngoog.provide('goog.i18n.DateTimeSymbols_en_KY');\ngoog.provide('goog.i18n.DateTimeSymbols_en_LC');\ngoog.provide('goog.i18n.DateTimeSymbols_en_LR');\ngoog.provide('goog.i18n.DateTimeSymbols_en_LS');\ngoog.provide('goog.i18n.DateTimeSymbols_en_MG');\ngoog.provide('goog.i18n.DateTimeSymbols_en_MH');\ngoog.provide('goog.i18n.DateTimeSymbols_en_MO');\ngoog.provide('goog.i18n.DateTimeSymbols_en_MP');\ngoog.provide('goog.i18n.DateTimeSymbols_en_MS');\ngoog.provide('goog.i18n.DateTimeSymbols_en_MT');\ngoog.provide('goog.i18n.DateTimeSymbols_en_MU');\ngoog.provide('goog.i18n.DateTimeSymbols_en_MW');\ngoog.provide('goog.i18n.DateTimeSymbols_en_MY');\ngoog.provide('goog.i18n.DateTimeSymbols_en_NA');\ngoog.provide('goog.i18n.DateTimeSymbols_en_NF');\ngoog.provide('goog.i18n.DateTimeSymbols_en_NG');\ngoog.provide('goog.i18n.DateTimeSymbols_en_NL');\ngoog.provide('goog.i18n.DateTimeSymbols_en_NR');\ngoog.provide('goog.i18n.DateTimeSymbols_en_NU');\ngoog.provide('goog.i18n.DateTimeSymbols_en_NZ');\ngoog.provide('goog.i18n.DateTimeSymbols_en_PG');\ngoog.provide('goog.i18n.DateTimeSymbols_en_PH');\ngoog.provide('goog.i18n.DateTimeSymbols_en_PK');\ngoog.provide('goog.i18n.DateTimeSymbols_en_PN');\ngoog.provide('goog.i18n.DateTimeSymbols_en_PR');\ngoog.provide('goog.i18n.DateTimeSymbols_en_PW');\ngoog.provide('goog.i18n.DateTimeSymbols_en_RW');\ngoog.provide('goog.i18n.DateTimeSymbols_en_SB');\ngoog.provide('goog.i18n.DateTimeSymbols_en_SC');\ngoog.provide('goog.i18n.DateTimeSymbols_en_SD');\ngoog.provide('goog.i18n.DateTimeSymbols_en_SE');\ngoog.provide('goog.i18n.DateTimeSymbols_en_SH');\ngoog.provide('goog.i18n.DateTimeSymbols_en_SI');\ngoog.provide('goog.i18n.DateTimeSymbols_en_SL');\ngoog.provide('goog.i18n.DateTimeSymbols_en_SS');\ngoog.provide('goog.i18n.DateTimeSymbols_en_SX');\ngoog.provide('goog.i18n.DateTimeSymbols_en_SZ');\ngoog.provide('goog.i18n.DateTimeSymbols_en_TC');\ngoog.provide('goog.i18n.DateTimeSymbols_en_TK');\ngoog.provide('goog.i18n.DateTimeSymbols_en_TO');\ngoog.provide('goog.i18n.DateTimeSymbols_en_TT');\ngoog.provide('goog.i18n.DateTimeSymbols_en_TV');\ngoog.provide('goog.i18n.DateTimeSymbols_en_TZ');\ngoog.provide('goog.i18n.DateTimeSymbols_en_UG');\ngoog.provide('goog.i18n.DateTimeSymbols_en_UM');\ngoog.provide('goog.i18n.DateTimeSymbols_en_US_POSIX');\ngoog.provide('goog.i18n.DateTimeSymbols_en_VC');\ngoog.provide('goog.i18n.DateTimeSymbols_en_VG');\ngoog.provide('goog.i18n.DateTimeSymbols_en_VI');\ngoog.provide('goog.i18n.DateTimeSymbols_en_VU');\ngoog.provide('goog.i18n.DateTimeSymbols_en_WS');\ngoog.provide('goog.i18n.DateTimeSymbols_en_XA');\ngoog.provide('goog.i18n.DateTimeSymbols_en_ZM');\ngoog.provide('goog.i18n.DateTimeSymbols_en_ZW');\ngoog.provide('goog.i18n.DateTimeSymbols_eo');\ngoog.provide('goog.i18n.DateTimeSymbols_eo_001');\ngoog.provide('goog.i18n.DateTimeSymbols_es_AR');\ngoog.provide('goog.i18n.DateTimeSymbols_es_BO');\ngoog.provide('goog.i18n.DateTimeSymbols_es_BR');\ngoog.provide('goog.i18n.DateTimeSymbols_es_BZ');\ngoog.provide('goog.i18n.DateTimeSymbols_es_CL');\ngoog.provide('goog.i18n.DateTimeSymbols_es_CO');\ngoog.provide('goog.i18n.DateTimeSymbols_es_CR');\ngoog.provide('goog.i18n.DateTimeSymbols_es_CU');\ngoog.provide('goog.i18n.DateTimeSymbols_es_DO');\ngoog.provide('goog.i18n.DateTimeSymbols_es_EA');\ngoog.provide('goog.i18n.DateTimeSymbols_es_EC');\ngoog.provide('goog.i18n.DateTimeSymbols_es_GQ');\ngoog.provide('goog.i18n.DateTimeSymbols_es_GT');\ngoog.provide('goog.i18n.DateTimeSymbols_es_HN');\ngoog.provide('goog.i18n.DateTimeSymbols_es_IC');\ngoog.provide('goog.i18n.DateTimeSymbols_es_NI');\ngoog.provide('goog.i18n.DateTimeSymbols_es_PA');\ngoog.provide('goog.i18n.DateTimeSymbols_es_PE');\ngoog.provide('goog.i18n.DateTimeSymbols_es_PH');\ngoog.provide('goog.i18n.DateTimeSymbols_es_PR');\ngoog.provide('goog.i18n.DateTimeSymbols_es_PY');\ngoog.provide('goog.i18n.DateTimeSymbols_es_SV');\ngoog.provide('goog.i18n.DateTimeSymbols_es_UY');\ngoog.provide('goog.i18n.DateTimeSymbols_es_VE');\ngoog.provide('goog.i18n.DateTimeSymbols_et_EE');\ngoog.provide('goog.i18n.DateTimeSymbols_eu_ES');\ngoog.provide('goog.i18n.DateTimeSymbols_ewo');\ngoog.provide('goog.i18n.DateTimeSymbols_ewo_CM');\ngoog.provide('goog.i18n.DateTimeSymbols_fa_AF');\ngoog.provide('goog.i18n.DateTimeSymbols_fa_IR');\ngoog.provide('goog.i18n.DateTimeSymbols_ff');\ngoog.provide('goog.i18n.DateTimeSymbols_ff_Latn');\ngoog.provide('goog.i18n.DateTimeSymbols_ff_Latn_BF');\ngoog.provide('goog.i18n.DateTimeSymbols_ff_Latn_CM');\ngoog.provide('goog.i18n.DateTimeSymbols_ff_Latn_GH');\ngoog.provide('goog.i18n.DateTimeSymbols_ff_Latn_GM');\ngoog.provide('goog.i18n.DateTimeSymbols_ff_Latn_GN');\ngoog.provide('goog.i18n.DateTimeSymbols_ff_Latn_GW');\ngoog.provide('goog.i18n.DateTimeSymbols_ff_Latn_LR');\ngoog.provide('goog.i18n.DateTimeSymbols_ff_Latn_MR');\ngoog.provide('goog.i18n.DateTimeSymbols_ff_Latn_NE');\ngoog.provide('goog.i18n.DateTimeSymbols_ff_Latn_NG');\ngoog.provide('goog.i18n.DateTimeSymbols_ff_Latn_SL');\ngoog.provide('goog.i18n.DateTimeSymbols_ff_Latn_SN');\ngoog.provide('goog.i18n.DateTimeSymbols_fi_FI');\ngoog.provide('goog.i18n.DateTimeSymbols_fil_PH');\ngoog.provide('goog.i18n.DateTimeSymbols_fo');\ngoog.provide('goog.i18n.DateTimeSymbols_fo_DK');\ngoog.provide('goog.i18n.DateTimeSymbols_fo_FO');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_BE');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_BF');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_BI');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_BJ');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_BL');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_CD');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_CF');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_CG');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_CH');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_CI');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_CM');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_DJ');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_DZ');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_FR');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_GA');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_GF');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_GN');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_GP');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_GQ');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_HT');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_KM');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_LU');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_MA');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_MC');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_MF');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_MG');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_ML');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_MQ');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_MR');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_MU');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_NC');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_NE');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_PF');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_PM');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_RE');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_RW');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_SC');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_SN');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_SY');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_TD');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_TG');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_TN');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_VU');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_WF');\ngoog.provide('goog.i18n.DateTimeSymbols_fr_YT');\ngoog.provide('goog.i18n.DateTimeSymbols_fur');\ngoog.provide('goog.i18n.DateTimeSymbols_fur_IT');\ngoog.provide('goog.i18n.DateTimeSymbols_fy');\ngoog.provide('goog.i18n.DateTimeSymbols_fy_NL');\ngoog.provide('goog.i18n.DateTimeSymbols_ga_IE');\ngoog.provide('goog.i18n.DateTimeSymbols_gd');\ngoog.provide('goog.i18n.DateTimeSymbols_gd_GB');\ngoog.provide('goog.i18n.DateTimeSymbols_gl_ES');\ngoog.provide('goog.i18n.DateTimeSymbols_gsw_CH');\ngoog.provide('goog.i18n.DateTimeSymbols_gsw_FR');\ngoog.provide('goog.i18n.DateTimeSymbols_gsw_LI');\ngoog.provide('goog.i18n.DateTimeSymbols_gu_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_guz');\ngoog.provide('goog.i18n.DateTimeSymbols_guz_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_gv');\ngoog.provide('goog.i18n.DateTimeSymbols_gv_IM');\ngoog.provide('goog.i18n.DateTimeSymbols_ha');\ngoog.provide('goog.i18n.DateTimeSymbols_ha_GH');\ngoog.provide('goog.i18n.DateTimeSymbols_ha_NE');\ngoog.provide('goog.i18n.DateTimeSymbols_ha_NG');\ngoog.provide('goog.i18n.DateTimeSymbols_haw_US');\ngoog.provide('goog.i18n.DateTimeSymbols_he_IL');\ngoog.provide('goog.i18n.DateTimeSymbols_hi_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_hr_BA');\ngoog.provide('goog.i18n.DateTimeSymbols_hr_HR');\ngoog.provide('goog.i18n.DateTimeSymbols_hsb');\ngoog.provide('goog.i18n.DateTimeSymbols_hsb_DE');\ngoog.provide('goog.i18n.DateTimeSymbols_hu_HU');\ngoog.provide('goog.i18n.DateTimeSymbols_hy_AM');\ngoog.provide('goog.i18n.DateTimeSymbols_ia');\ngoog.provide('goog.i18n.DateTimeSymbols_ia_001');\ngoog.provide('goog.i18n.DateTimeSymbols_id_ID');\ngoog.provide('goog.i18n.DateTimeSymbols_ig');\ngoog.provide('goog.i18n.DateTimeSymbols_ig_NG');\ngoog.provide('goog.i18n.DateTimeSymbols_ii');\ngoog.provide('goog.i18n.DateTimeSymbols_ii_CN');\ngoog.provide('goog.i18n.DateTimeSymbols_is_IS');\ngoog.provide('goog.i18n.DateTimeSymbols_it_CH');\ngoog.provide('goog.i18n.DateTimeSymbols_it_IT');\ngoog.provide('goog.i18n.DateTimeSymbols_it_SM');\ngoog.provide('goog.i18n.DateTimeSymbols_it_VA');\ngoog.provide('goog.i18n.DateTimeSymbols_ja_JP');\ngoog.provide('goog.i18n.DateTimeSymbols_jgo');\ngoog.provide('goog.i18n.DateTimeSymbols_jgo_CM');\ngoog.provide('goog.i18n.DateTimeSymbols_jmc');\ngoog.provide('goog.i18n.DateTimeSymbols_jmc_TZ');\ngoog.provide('goog.i18n.DateTimeSymbols_jv');\ngoog.provide('goog.i18n.DateTimeSymbols_jv_ID');\ngoog.provide('goog.i18n.DateTimeSymbols_ka_GE');\ngoog.provide('goog.i18n.DateTimeSymbols_kab');\ngoog.provide('goog.i18n.DateTimeSymbols_kab_DZ');\ngoog.provide('goog.i18n.DateTimeSymbols_kam');\ngoog.provide('goog.i18n.DateTimeSymbols_kam_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_kde');\ngoog.provide('goog.i18n.DateTimeSymbols_kde_TZ');\ngoog.provide('goog.i18n.DateTimeSymbols_kea');\ngoog.provide('goog.i18n.DateTimeSymbols_kea_CV');\ngoog.provide('goog.i18n.DateTimeSymbols_khq');\ngoog.provide('goog.i18n.DateTimeSymbols_khq_ML');\ngoog.provide('goog.i18n.DateTimeSymbols_ki');\ngoog.provide('goog.i18n.DateTimeSymbols_ki_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_kk_KZ');\ngoog.provide('goog.i18n.DateTimeSymbols_kkj');\ngoog.provide('goog.i18n.DateTimeSymbols_kkj_CM');\ngoog.provide('goog.i18n.DateTimeSymbols_kl');\ngoog.provide('goog.i18n.DateTimeSymbols_kl_GL');\ngoog.provide('goog.i18n.DateTimeSymbols_kln');\ngoog.provide('goog.i18n.DateTimeSymbols_kln_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_km_KH');\ngoog.provide('goog.i18n.DateTimeSymbols_kn_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_ko_KP');\ngoog.provide('goog.i18n.DateTimeSymbols_ko_KR');\ngoog.provide('goog.i18n.DateTimeSymbols_kok');\ngoog.provide('goog.i18n.DateTimeSymbols_kok_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_ks');\ngoog.provide('goog.i18n.DateTimeSymbols_ks_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_ksb');\ngoog.provide('goog.i18n.DateTimeSymbols_ksb_TZ');\ngoog.provide('goog.i18n.DateTimeSymbols_ksf');\ngoog.provide('goog.i18n.DateTimeSymbols_ksf_CM');\ngoog.provide('goog.i18n.DateTimeSymbols_ksh');\ngoog.provide('goog.i18n.DateTimeSymbols_ksh_DE');\ngoog.provide('goog.i18n.DateTimeSymbols_ku');\ngoog.provide('goog.i18n.DateTimeSymbols_ku_TR');\ngoog.provide('goog.i18n.DateTimeSymbols_kw');\ngoog.provide('goog.i18n.DateTimeSymbols_kw_GB');\ngoog.provide('goog.i18n.DateTimeSymbols_ky_KG');\ngoog.provide('goog.i18n.DateTimeSymbols_lag');\ngoog.provide('goog.i18n.DateTimeSymbols_lag_TZ');\ngoog.provide('goog.i18n.DateTimeSymbols_lb');\ngoog.provide('goog.i18n.DateTimeSymbols_lb_LU');\ngoog.provide('goog.i18n.DateTimeSymbols_lg');\ngoog.provide('goog.i18n.DateTimeSymbols_lg_UG');\ngoog.provide('goog.i18n.DateTimeSymbols_lkt');\ngoog.provide('goog.i18n.DateTimeSymbols_lkt_US');\ngoog.provide('goog.i18n.DateTimeSymbols_ln_AO');\ngoog.provide('goog.i18n.DateTimeSymbols_ln_CD');\ngoog.provide('goog.i18n.DateTimeSymbols_ln_CF');\ngoog.provide('goog.i18n.DateTimeSymbols_ln_CG');\ngoog.provide('goog.i18n.DateTimeSymbols_lo_LA');\ngoog.provide('goog.i18n.DateTimeSymbols_lrc');\ngoog.provide('goog.i18n.DateTimeSymbols_lrc_IQ');\ngoog.provide('goog.i18n.DateTimeSymbols_lrc_IR');\ngoog.provide('goog.i18n.DateTimeSymbols_lt_LT');\ngoog.provide('goog.i18n.DateTimeSymbols_lu');\ngoog.provide('goog.i18n.DateTimeSymbols_lu_CD');\ngoog.provide('goog.i18n.DateTimeSymbols_luo');\ngoog.provide('goog.i18n.DateTimeSymbols_luo_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_luy');\ngoog.provide('goog.i18n.DateTimeSymbols_luy_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_lv_LV');\ngoog.provide('goog.i18n.DateTimeSymbols_mas');\ngoog.provide('goog.i18n.DateTimeSymbols_mas_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_mas_TZ');\ngoog.provide('goog.i18n.DateTimeSymbols_mer');\ngoog.provide('goog.i18n.DateTimeSymbols_mer_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_mfe');\ngoog.provide('goog.i18n.DateTimeSymbols_mfe_MU');\ngoog.provide('goog.i18n.DateTimeSymbols_mg');\ngoog.provide('goog.i18n.DateTimeSymbols_mg_MG');\ngoog.provide('goog.i18n.DateTimeSymbols_mgh');\ngoog.provide('goog.i18n.DateTimeSymbols_mgh_MZ');\ngoog.provide('goog.i18n.DateTimeSymbols_mgo');\ngoog.provide('goog.i18n.DateTimeSymbols_mgo_CM');\ngoog.provide('goog.i18n.DateTimeSymbols_mi');\ngoog.provide('goog.i18n.DateTimeSymbols_mi_NZ');\ngoog.provide('goog.i18n.DateTimeSymbols_mk_MK');\ngoog.provide('goog.i18n.DateTimeSymbols_ml_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_mn_MN');\ngoog.provide('goog.i18n.DateTimeSymbols_mr_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_ms_BN');\ngoog.provide('goog.i18n.DateTimeSymbols_ms_MY');\ngoog.provide('goog.i18n.DateTimeSymbols_ms_SG');\ngoog.provide('goog.i18n.DateTimeSymbols_mt_MT');\ngoog.provide('goog.i18n.DateTimeSymbols_mua');\ngoog.provide('goog.i18n.DateTimeSymbols_mua_CM');\ngoog.provide('goog.i18n.DateTimeSymbols_my_MM');\ngoog.provide('goog.i18n.DateTimeSymbols_mzn');\ngoog.provide('goog.i18n.DateTimeSymbols_mzn_IR');\ngoog.provide('goog.i18n.DateTimeSymbols_naq');\ngoog.provide('goog.i18n.DateTimeSymbols_naq_NA');\ngoog.provide('goog.i18n.DateTimeSymbols_nb_NO');\ngoog.provide('goog.i18n.DateTimeSymbols_nb_SJ');\ngoog.provide('goog.i18n.DateTimeSymbols_nd');\ngoog.provide('goog.i18n.DateTimeSymbols_nd_ZW');\ngoog.provide('goog.i18n.DateTimeSymbols_nds');\ngoog.provide('goog.i18n.DateTimeSymbols_nds_DE');\ngoog.provide('goog.i18n.DateTimeSymbols_nds_NL');\ngoog.provide('goog.i18n.DateTimeSymbols_ne_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_ne_NP');\ngoog.provide('goog.i18n.DateTimeSymbols_nl_AW');\ngoog.provide('goog.i18n.DateTimeSymbols_nl_BE');\ngoog.provide('goog.i18n.DateTimeSymbols_nl_BQ');\ngoog.provide('goog.i18n.DateTimeSymbols_nl_CW');\ngoog.provide('goog.i18n.DateTimeSymbols_nl_NL');\ngoog.provide('goog.i18n.DateTimeSymbols_nl_SR');\ngoog.provide('goog.i18n.DateTimeSymbols_nl_SX');\ngoog.provide('goog.i18n.DateTimeSymbols_nmg');\ngoog.provide('goog.i18n.DateTimeSymbols_nmg_CM');\ngoog.provide('goog.i18n.DateTimeSymbols_nn');\ngoog.provide('goog.i18n.DateTimeSymbols_nn_NO');\ngoog.provide('goog.i18n.DateTimeSymbols_nnh');\ngoog.provide('goog.i18n.DateTimeSymbols_nnh_CM');\ngoog.provide('goog.i18n.DateTimeSymbols_nus');\ngoog.provide('goog.i18n.DateTimeSymbols_nus_SS');\ngoog.provide('goog.i18n.DateTimeSymbols_nyn');\ngoog.provide('goog.i18n.DateTimeSymbols_nyn_UG');\ngoog.provide('goog.i18n.DateTimeSymbols_om');\ngoog.provide('goog.i18n.DateTimeSymbols_om_ET');\ngoog.provide('goog.i18n.DateTimeSymbols_om_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_or_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_os');\ngoog.provide('goog.i18n.DateTimeSymbols_os_GE');\ngoog.provide('goog.i18n.DateTimeSymbols_os_RU');\ngoog.provide('goog.i18n.DateTimeSymbols_pa_Arab');\ngoog.provide('goog.i18n.DateTimeSymbols_pa_Arab_PK');\ngoog.provide('goog.i18n.DateTimeSymbols_pa_Guru');\ngoog.provide('goog.i18n.DateTimeSymbols_pa_Guru_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_pl_PL');\ngoog.provide('goog.i18n.DateTimeSymbols_ps');\ngoog.provide('goog.i18n.DateTimeSymbols_ps_AF');\ngoog.provide('goog.i18n.DateTimeSymbols_ps_PK');\ngoog.provide('goog.i18n.DateTimeSymbols_pt_AO');\ngoog.provide('goog.i18n.DateTimeSymbols_pt_CH');\ngoog.provide('goog.i18n.DateTimeSymbols_pt_CV');\ngoog.provide('goog.i18n.DateTimeSymbols_pt_GQ');\ngoog.provide('goog.i18n.DateTimeSymbols_pt_GW');\ngoog.provide('goog.i18n.DateTimeSymbols_pt_LU');\ngoog.provide('goog.i18n.DateTimeSymbols_pt_MO');\ngoog.provide('goog.i18n.DateTimeSymbols_pt_MZ');\ngoog.provide('goog.i18n.DateTimeSymbols_pt_ST');\ngoog.provide('goog.i18n.DateTimeSymbols_pt_TL');\ngoog.provide('goog.i18n.DateTimeSymbols_qu');\ngoog.provide('goog.i18n.DateTimeSymbols_qu_BO');\ngoog.provide('goog.i18n.DateTimeSymbols_qu_EC');\ngoog.provide('goog.i18n.DateTimeSymbols_qu_PE');\ngoog.provide('goog.i18n.DateTimeSymbols_rm');\ngoog.provide('goog.i18n.DateTimeSymbols_rm_CH');\ngoog.provide('goog.i18n.DateTimeSymbols_rn');\ngoog.provide('goog.i18n.DateTimeSymbols_rn_BI');\ngoog.provide('goog.i18n.DateTimeSymbols_ro_MD');\ngoog.provide('goog.i18n.DateTimeSymbols_ro_RO');\ngoog.provide('goog.i18n.DateTimeSymbols_rof');\ngoog.provide('goog.i18n.DateTimeSymbols_rof_TZ');\ngoog.provide('goog.i18n.DateTimeSymbols_ru_BY');\ngoog.provide('goog.i18n.DateTimeSymbols_ru_KG');\ngoog.provide('goog.i18n.DateTimeSymbols_ru_KZ');\ngoog.provide('goog.i18n.DateTimeSymbols_ru_MD');\ngoog.provide('goog.i18n.DateTimeSymbols_ru_RU');\ngoog.provide('goog.i18n.DateTimeSymbols_ru_UA');\ngoog.provide('goog.i18n.DateTimeSymbols_rw');\ngoog.provide('goog.i18n.DateTimeSymbols_rw_RW');\ngoog.provide('goog.i18n.DateTimeSymbols_rwk');\ngoog.provide('goog.i18n.DateTimeSymbols_rwk_TZ');\ngoog.provide('goog.i18n.DateTimeSymbols_sah');\ngoog.provide('goog.i18n.DateTimeSymbols_sah_RU');\ngoog.provide('goog.i18n.DateTimeSymbols_saq');\ngoog.provide('goog.i18n.DateTimeSymbols_saq_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_sbp');\ngoog.provide('goog.i18n.DateTimeSymbols_sbp_TZ');\ngoog.provide('goog.i18n.DateTimeSymbols_sd');\ngoog.provide('goog.i18n.DateTimeSymbols_sd_PK');\ngoog.provide('goog.i18n.DateTimeSymbols_se');\ngoog.provide('goog.i18n.DateTimeSymbols_se_FI');\ngoog.provide('goog.i18n.DateTimeSymbols_se_NO');\ngoog.provide('goog.i18n.DateTimeSymbols_se_SE');\ngoog.provide('goog.i18n.DateTimeSymbols_seh');\ngoog.provide('goog.i18n.DateTimeSymbols_seh_MZ');\ngoog.provide('goog.i18n.DateTimeSymbols_ses');\ngoog.provide('goog.i18n.DateTimeSymbols_ses_ML');\ngoog.provide('goog.i18n.DateTimeSymbols_sg');\ngoog.provide('goog.i18n.DateTimeSymbols_sg_CF');\ngoog.provide('goog.i18n.DateTimeSymbols_shi');\ngoog.provide('goog.i18n.DateTimeSymbols_shi_Latn');\ngoog.provide('goog.i18n.DateTimeSymbols_shi_Latn_MA');\ngoog.provide('goog.i18n.DateTimeSymbols_shi_Tfng');\ngoog.provide('goog.i18n.DateTimeSymbols_shi_Tfng_MA');\ngoog.provide('goog.i18n.DateTimeSymbols_si_LK');\ngoog.provide('goog.i18n.DateTimeSymbols_sk_SK');\ngoog.provide('goog.i18n.DateTimeSymbols_sl_SI');\ngoog.provide('goog.i18n.DateTimeSymbols_smn');\ngoog.provide('goog.i18n.DateTimeSymbols_smn_FI');\ngoog.provide('goog.i18n.DateTimeSymbols_sn');\ngoog.provide('goog.i18n.DateTimeSymbols_sn_ZW');\ngoog.provide('goog.i18n.DateTimeSymbols_so');\ngoog.provide('goog.i18n.DateTimeSymbols_so_DJ');\ngoog.provide('goog.i18n.DateTimeSymbols_so_ET');\ngoog.provide('goog.i18n.DateTimeSymbols_so_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_so_SO');\ngoog.provide('goog.i18n.DateTimeSymbols_sq_AL');\ngoog.provide('goog.i18n.DateTimeSymbols_sq_MK');\ngoog.provide('goog.i18n.DateTimeSymbols_sq_XK');\ngoog.provide('goog.i18n.DateTimeSymbols_sr_Cyrl');\ngoog.provide('goog.i18n.DateTimeSymbols_sr_Cyrl_BA');\ngoog.provide('goog.i18n.DateTimeSymbols_sr_Cyrl_ME');\ngoog.provide('goog.i18n.DateTimeSymbols_sr_Cyrl_RS');\ngoog.provide('goog.i18n.DateTimeSymbols_sr_Cyrl_XK');\ngoog.provide('goog.i18n.DateTimeSymbols_sr_Latn_BA');\ngoog.provide('goog.i18n.DateTimeSymbols_sr_Latn_ME');\ngoog.provide('goog.i18n.DateTimeSymbols_sr_Latn_RS');\ngoog.provide('goog.i18n.DateTimeSymbols_sr_Latn_XK');\ngoog.provide('goog.i18n.DateTimeSymbols_sv_AX');\ngoog.provide('goog.i18n.DateTimeSymbols_sv_FI');\ngoog.provide('goog.i18n.DateTimeSymbols_sv_SE');\ngoog.provide('goog.i18n.DateTimeSymbols_sw_CD');\ngoog.provide('goog.i18n.DateTimeSymbols_sw_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_sw_TZ');\ngoog.provide('goog.i18n.DateTimeSymbols_sw_UG');\ngoog.provide('goog.i18n.DateTimeSymbols_ta_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_ta_LK');\ngoog.provide('goog.i18n.DateTimeSymbols_ta_MY');\ngoog.provide('goog.i18n.DateTimeSymbols_ta_SG');\ngoog.provide('goog.i18n.DateTimeSymbols_te_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_teo');\ngoog.provide('goog.i18n.DateTimeSymbols_teo_KE');\ngoog.provide('goog.i18n.DateTimeSymbols_teo_UG');\ngoog.provide('goog.i18n.DateTimeSymbols_tg');\ngoog.provide('goog.i18n.DateTimeSymbols_tg_TJ');\ngoog.provide('goog.i18n.DateTimeSymbols_th_TH');\ngoog.provide('goog.i18n.DateTimeSymbols_ti');\ngoog.provide('goog.i18n.DateTimeSymbols_ti_ER');\ngoog.provide('goog.i18n.DateTimeSymbols_ti_ET');\ngoog.provide('goog.i18n.DateTimeSymbols_tk');\ngoog.provide('goog.i18n.DateTimeSymbols_tk_TM');\ngoog.provide('goog.i18n.DateTimeSymbols_to');\ngoog.provide('goog.i18n.DateTimeSymbols_to_TO');\ngoog.provide('goog.i18n.DateTimeSymbols_tr_CY');\ngoog.provide('goog.i18n.DateTimeSymbols_tr_TR');\ngoog.provide('goog.i18n.DateTimeSymbols_tt');\ngoog.provide('goog.i18n.DateTimeSymbols_tt_RU');\ngoog.provide('goog.i18n.DateTimeSymbols_twq');\ngoog.provide('goog.i18n.DateTimeSymbols_twq_NE');\ngoog.provide('goog.i18n.DateTimeSymbols_tzm');\ngoog.provide('goog.i18n.DateTimeSymbols_tzm_MA');\ngoog.provide('goog.i18n.DateTimeSymbols_ug');\ngoog.provide('goog.i18n.DateTimeSymbols_ug_CN');\ngoog.provide('goog.i18n.DateTimeSymbols_uk_UA');\ngoog.provide('goog.i18n.DateTimeSymbols_ur_IN');\ngoog.provide('goog.i18n.DateTimeSymbols_ur_PK');\ngoog.provide('goog.i18n.DateTimeSymbols_uz_Arab');\ngoog.provide('goog.i18n.DateTimeSymbols_uz_Arab_AF');\ngoog.provide('goog.i18n.DateTimeSymbols_uz_Cyrl');\ngoog.provide('goog.i18n.DateTimeSymbols_uz_Cyrl_UZ');\ngoog.provide('goog.i18n.DateTimeSymbols_uz_Latn');\ngoog.provide('goog.i18n.DateTimeSymbols_uz_Latn_UZ');\ngoog.provide('goog.i18n.DateTimeSymbols_vai');\ngoog.provide('goog.i18n.DateTimeSymbols_vai_Latn');\ngoog.provide('goog.i18n.DateTimeSymbols_vai_Latn_LR');\ngoog.provide('goog.i18n.DateTimeSymbols_vai_Vaii');\ngoog.provide('goog.i18n.DateTimeSymbols_vai_Vaii_LR');\ngoog.provide('goog.i18n.DateTimeSymbols_vi_VN');\ngoog.provide('goog.i18n.DateTimeSymbols_vun');\ngoog.provide('goog.i18n.DateTimeSymbols_vun_TZ');\ngoog.provide('goog.i18n.DateTimeSymbols_wae');\ngoog.provide('goog.i18n.DateTimeSymbols_wae_CH');\ngoog.provide('goog.i18n.DateTimeSymbols_wo');\ngoog.provide('goog.i18n.DateTimeSymbols_wo_SN');\ngoog.provide('goog.i18n.DateTimeSymbols_xh');\ngoog.provide('goog.i18n.DateTimeSymbols_xh_ZA');\ngoog.provide('goog.i18n.DateTimeSymbols_xog');\ngoog.provide('goog.i18n.DateTimeSymbols_xog_UG');\ngoog.provide('goog.i18n.DateTimeSymbols_yav');\ngoog.provide('goog.i18n.DateTimeSymbols_yav_CM');\ngoog.provide('goog.i18n.DateTimeSymbols_yi');\ngoog.provide('goog.i18n.DateTimeSymbols_yi_001');\ngoog.provide('goog.i18n.DateTimeSymbols_yo');\ngoog.provide('goog.i18n.DateTimeSymbols_yo_BJ');\ngoog.provide('goog.i18n.DateTimeSymbols_yo_NG');\ngoog.provide('goog.i18n.DateTimeSymbols_yue');\ngoog.provide('goog.i18n.DateTimeSymbols_yue_Hans');\ngoog.provide('goog.i18n.DateTimeSymbols_yue_Hans_CN');\ngoog.provide('goog.i18n.DateTimeSymbols_yue_Hant');\ngoog.provide('goog.i18n.DateTimeSymbols_yue_Hant_HK');\ngoog.provide('goog.i18n.DateTimeSymbols_zgh');\ngoog.provide('goog.i18n.DateTimeSymbols_zgh_MA');\ngoog.provide('goog.i18n.DateTimeSymbols_zh_Hans');\ngoog.provide('goog.i18n.DateTimeSymbols_zh_Hans_CN');\ngoog.provide('goog.i18n.DateTimeSymbols_zh_Hans_HK');\ngoog.provide('goog.i18n.DateTimeSymbols_zh_Hans_MO');\ngoog.provide('goog.i18n.DateTimeSymbols_zh_Hans_SG');\ngoog.provide('goog.i18n.DateTimeSymbols_zh_Hant');\ngoog.provide('goog.i18n.DateTimeSymbols_zh_Hant_HK');\ngoog.provide('goog.i18n.DateTimeSymbols_zh_Hant_MO');\ngoog.provide('goog.i18n.DateTimeSymbols_zh_Hant_TW');\ngoog.provide('goog.i18n.DateTimeSymbols_zu_ZA');\ngoog.require('goog.i18n.DateTimeSymbols');\n\n/**\n * Date/time formatting symbols for locale af_NA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_af_NA = {\n  ERAS: ['v.C.', 'n.C.'],\n  ERANAMES: ['voor Christus', 'na Christus'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januarie', 'Februarie', 'Maart', 'April', 'Mei', 'Junie', 'Julie', 'Augustus', 'September', 'Oktober', 'November', 'Desember'],\n  STANDALONEMONTHS: ['Januarie', 'Februarie', 'Maart', 'April', 'Mei', 'Junie', 'Julie', 'Augustus', 'September', 'Oktober', 'November', 'Desember'],\n  SHORTMONTHS: ['Jan.', 'Feb.', 'Mrt.', 'Apr.', 'Mei', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Okt.', 'Nov.', 'Des.'],\n  STANDALONESHORTMONTHS: ['Jan.', 'Feb.', 'Mrt.', 'Apr.', 'Mei', 'Jun.', 'Jul.', 'Aug.', 'Sep.', 'Okt.', 'Nov.', 'Des.'],\n  WEEKDAYS: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],\n  STANDALONEWEEKDAYS: ['Sondag', 'Maandag', 'Dinsdag', 'Woensdag', 'Donderdag', 'Vrydag', 'Saterdag'],\n  SHORTWEEKDAYS: ['So.', 'Ma.', 'Di.', 'Wo.', 'Do.', 'Vr.', 'Sa.'],\n  STANDALONESHORTWEEKDAYS: ['So.', 'Ma.', 'Di.', 'Wo.', 'Do.', 'Vr.', 'Sa.'],\n  NARROWWEEKDAYS: ['S', 'M', 'D', 'W', 'D', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'D', 'W', 'D', 'V', 'S'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1ste kwartaal', '2de kwartaal', '3de kwartaal', '4de kwartaal'],\n  AMPMS: ['vm.', 'nm.'],\n  DATEFORMATS: ['EEEE dd MMMM y', 'dd MMMM y', 'dd MMM y', 'y-MM-dd'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale af_ZA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_af_ZA = goog.i18n.DateTimeSymbols_af;\n\n\n/**\n * Date/time formatting symbols for locale agq.\n * @const\n */\ngoog.i18n.DateTimeSymbols_agq = {\n  ERAS: ['SK', 'BK'],\n  ERANAMES: ['Sěe Kɨ̀lesto', 'Bǎa Kɨ̀lesto'],\n  NARROWMONTHS: ['n', 'k', 't', 't', 's', 'z', 'k', 'f', 'd', 'l', 'c', 'f'],\n  STANDALONENARROWMONTHS: ['n', 'k', 't', 't', 's', 'z', 'k', 'f', 'd', 'l', 'c', 'f'],\n  MONTHS: ['ndzɔ̀ŋɔ̀nùm', 'ndzɔ̀ŋɔ̀kƗ̀zùʔ', 'ndzɔ̀ŋɔ̀tƗ̀dʉ̀ghà', 'ndzɔ̀ŋɔ̀tǎafʉ̄ghā', 'ndzɔ̀ŋèsèe', 'ndzɔ̀ŋɔ̀nzùghò', 'ndzɔ̀ŋɔ̀dùmlo', 'ndzɔ̀ŋɔ̀kwîfɔ̀e', 'ndzɔ̀ŋɔ̀tƗ̀fʉ̀ghàdzughù', 'ndzɔ̀ŋɔ̀ghǔuwelɔ̀m', 'ndzɔ̀ŋɔ̀chwaʔàkaa wo', 'ndzɔ̀ŋèfwòo'],\n  STANDALONEMONTHS: ['ndzɔ̀ŋɔ̀nùm', 'ndzɔ̀ŋɔ̀kƗ̀zùʔ', 'ndzɔ̀ŋɔ̀tƗ̀dʉ̀ghà', 'ndzɔ̀ŋɔ̀tǎafʉ̄ghā', 'ndzɔ̀ŋèsèe', 'ndzɔ̀ŋɔ̀nzùghò', 'ndzɔ̀ŋɔ̀dùmlo', 'ndzɔ̀ŋɔ̀kwîfɔ̀e', 'ndzɔ̀ŋɔ̀tƗ̀fʉ̀ghàdzughù', 'ndzɔ̀ŋɔ̀ghǔuwelɔ̀m', 'ndzɔ̀ŋɔ̀chwaʔàkaa wo', 'ndzɔ̀ŋèfwòo'],\n  SHORTMONTHS: ['nùm', 'kɨz', 'tɨd', 'taa', 'see', 'nzu', 'dum', 'fɔe', 'dzu', 'lɔm', 'kaa', 'fwo'],\n  STANDALONESHORTMONTHS: ['nùm', 'kɨz', 'tɨd', 'taa', 'see', 'nzu', 'dum', 'fɔe', 'dzu', 'lɔm', 'kaa', 'fwo'],\n  WEEKDAYS: ['tsuʔntsɨ', 'tsuʔukpà', 'tsuʔughɔe', 'tsuʔutɔ̀mlò', 'tsuʔumè', 'tsuʔughɨ̂m', 'tsuʔndzɨkɔʔɔ'],\n  STANDALONEWEEKDAYS: ['tsuʔntsɨ', 'tsuʔukpà', 'tsuʔughɔe', 'tsuʔutɔ̀mlò', 'tsuʔumè', 'tsuʔughɨ̂m', 'tsuʔndzɨkɔʔɔ'],\n  SHORTWEEKDAYS: ['nts', 'kpa', 'ghɔ', 'tɔm', 'ume', 'ghɨ', 'dzk'],\n  STANDALONESHORTWEEKDAYS: ['nts', 'kpa', 'ghɔ', 'tɔm', 'ume', 'ghɨ', 'dzk'],\n  NARROWWEEKDAYS: ['n', 'k', 'g', 't', 'u', 'g', 'd'],\n  STANDALONENARROWWEEKDAYS: ['n', 'k', 'g', 't', 'u', 'g', 'd'],\n  SHORTQUARTERS: ['kɨbâ kɨ 1', 'ugbâ u 2', 'ugbâ u 3', 'ugbâ u 4'],\n  QUARTERS: ['kɨbâ kɨ 1', 'ugbâ u 2', 'ugbâ u 3', 'ugbâ u 4'],\n  AMPMS: ['a.g', 'a.k'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale agq_CM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_agq_CM = goog.i18n.DateTimeSymbols_agq;\n\n\n/**\n * Date/time formatting symbols for locale ak.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ak = {\n  ERAS: ['AK', 'KE'],\n  ERANAMES: ['Ansa Kristo', 'Kristo Ekyiri'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['Sanda-Ɔpɛpɔn', 'Kwakwar-Ɔgyefuo', 'Ebɔw-Ɔbenem', 'Ebɔbira-Oforisuo', 'Esusow Aketseaba-Kɔtɔnimba', 'Obirade-Ayɛwohomumu', 'Ayɛwoho-Kitawonsa', 'Difuu-Ɔsandaa', 'Fankwa-Ɛbɔ', 'Ɔbɛsɛ-Ahinime', 'Ɔberɛfɛw-Obubuo', 'Mumu-Ɔpɛnimba'],\n  STANDALONEMONTHS: ['Sanda-Ɔpɛpɔn', 'Kwakwar-Ɔgyefuo', 'Ebɔw-Ɔbenem', 'Ebɔbira-Oforisuo', 'Esusow Aketseaba-Kɔtɔnimba', 'Obirade-Ayɛwohomumu', 'Ayɛwoho-Kitawonsa', 'Difuu-Ɔsandaa', 'Fankwa-Ɛbɔ', 'Ɔbɛsɛ-Ahinime', 'Ɔberɛfɛw-Obubuo', 'Mumu-Ɔpɛnimba'],\n  SHORTMONTHS: ['S-Ɔ', 'K-Ɔ', 'E-Ɔ', 'E-O', 'E-K', 'O-A', 'A-K', 'D-Ɔ', 'F-Ɛ', 'Ɔ-A', 'Ɔ-O', 'M-Ɔ'],\n  STANDALONESHORTMONTHS: ['S-Ɔ', 'K-Ɔ', 'E-Ɔ', 'E-O', 'E-K', 'O-A', 'A-K', 'D-Ɔ', 'F-Ɛ', 'Ɔ-A', 'Ɔ-O', 'M-Ɔ'],\n  WEEKDAYS: ['Kwesida', 'Dwowda', 'Benada', 'Wukuda', 'Yawda', 'Fida', 'Memeneda'],\n  STANDALONEWEEKDAYS: ['Kwesida', 'Dwowda', 'Benada', 'Wukuda', 'Yawda', 'Fida', 'Memeneda'],\n  SHORTWEEKDAYS: ['Kwe', 'Dwo', 'Ben', 'Wuk', 'Yaw', 'Fia', 'Mem'],\n  STANDALONESHORTWEEKDAYS: ['Kwe', 'Dwo', 'Ben', 'Wuk', 'Yaw', 'Fia', 'Mem'],\n  NARROWWEEKDAYS: ['K', 'D', 'B', 'W', 'Y', 'F', 'M'],\n  STANDALONENARROWWEEKDAYS: ['K', 'D', 'B', 'W', 'Y', 'F', 'M'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AN', 'EW'],\n  DATEFORMATS: ['EEEE, y MMMM dd', 'y MMMM d', 'y MMM d', 'yy/MM/dd'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ak_GH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ak_GH = goog.i18n.DateTimeSymbols_ak;\n\n\n/**\n * Date/time formatting symbols for locale am_ET.\n * @const\n */\ngoog.i18n.DateTimeSymbols_am_ET = goog.i18n.DateTimeSymbols_am;\n\n\n/**\n * Date/time formatting symbols for locale ar_001.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_001 = {\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_AE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_AE = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_BH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_BH = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_DJ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_DJ = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_EH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_EH = {\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_ER.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_ER = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_IL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_IL = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_IQ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_IQ = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ك', 'ش', 'آ', 'ن', 'أ', 'ح', 'ت', 'آ', 'أ', 'ت', 'ت', 'ك'],\n  STANDALONENARROWMONTHS: ['ك', 'ش', 'آ', 'ن', 'أ', 'ح', 'ت', 'آ', 'أ', 'ت', 'ت', 'ك'],\n  MONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  STANDALONEMONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  SHORTMONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  STANDALONESHORTMONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_JO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_JO = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ك', 'ش', 'آ', 'ن', 'أ', 'ح', 'ت', 'آ', 'أ', 'ت', 'ت', 'ك'],\n  STANDALONENARROWMONTHS: ['ك', 'ش', 'آ', 'ن', 'أ', 'ح', 'ت', 'آ', 'أ', 'ت', 'ت', 'ك'],\n  MONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  STANDALONEMONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  SHORTMONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  STANDALONESHORTMONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_KM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_KM = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_KW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_KW = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_LB.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_LB = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ك', 'ش', 'آ', 'ن', 'أ', 'ح', 'ت', 'آ', 'أ', 'ت', 'ت', 'ك'],\n  STANDALONENARROWMONTHS: ['ك', 'ش', 'آ', 'ن', 'أ', 'ح', 'ت', 'آ', 'أ', 'ت', 'ت', 'ك'],\n  MONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  STANDALONEMONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  SHORTMONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  STANDALONESHORTMONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_LY.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_LY = goog.i18n.DateTimeSymbols_ar;\n\n\n/**\n * Date/time formatting symbols for locale ar_MA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_MA = {\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'م', 'ن', 'ل', 'غ', 'ش', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'م', 'ن', 'ل', 'غ', 'ش', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'ماي', 'يونيو', 'يوليوز', 'غشت', 'شتنبر', 'أكتوبر', 'نونبر', 'دجنبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'ماي', 'يونيو', 'يوليوز', 'غشت', 'شتنبر', 'أكتوبر', 'نونبر', 'دجنبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'ماي', 'يونيو', 'يوليوز', 'غشت', 'شتنبر', 'أكتوبر', 'نونبر', 'دجنبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'ماي', 'يونيو', 'يوليوز', 'غشت', 'شتنبر', 'أكتوبر', 'نونبر', 'دجنبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_MR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_MR = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'إ', 'و', 'ن', 'ل', 'غ', 'ش', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'إ', 'و', 'ن', 'ل', 'غ', 'ش', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'إبريل', 'مايو', 'يونيو', 'يوليو', 'أغشت', 'شتمبر', 'أكتوبر', 'نوفمبر', 'دجمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'إبريل', 'مايو', 'يونيو', 'يوليو', 'أغشت', 'شتمبر', 'أكتوبر', 'نوفمبر', 'دجمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'إبريل', 'مايو', 'يونيو', 'يوليو', 'أغشت', 'شتمبر', 'أكتوبر', 'نوفمبر', 'دجمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'إبريل', 'مايو', 'يونيو', 'يوليو', 'أغشت', 'شتمبر', 'أكتوبر', 'نوفمبر', 'دجمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_OM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_OM = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_PS.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_PS = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ك', 'ش', 'آ', 'ن', 'أ', 'ح', 'ت', 'آ', 'أ', 'ت', 'ت', 'ك'],\n  STANDALONENARROWMONTHS: ['ك', 'ش', 'آ', 'ن', 'أ', 'ح', 'ت', 'آ', 'أ', 'ت', 'ت', 'ك'],\n  MONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  STANDALONEMONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  SHORTMONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  STANDALONESHORTMONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_QA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_QA = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_SA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_SA = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_SD.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_SD = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_SO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_SO = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_SS.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_SS = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_SY.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_SY = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ك', 'ش', 'آ', 'ن', 'أ', 'ح', 'ت', 'آ', 'أ', 'ت', 'ت', 'ك'],\n  STANDALONENARROWMONTHS: ['ك', 'ش', 'آ', 'ن', 'أ', 'ح', 'ت', 'آ', 'أ', 'ت', 'ت', 'ك'],\n  MONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  STANDALONEMONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  SHORTMONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  STANDALONESHORTMONTHS: ['كانون الثاني', 'شباط', 'آذار', 'نيسان', 'أيار', 'حزيران', 'تموز', 'آب', 'أيلول', 'تشرين الأول', 'تشرين الثاني', 'كانون الأول'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_TD.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_TD = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_TN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_TN = {\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ج', 'ف', 'م', 'أ', 'م', 'ج', 'ج', 'أ', 'س', 'أ', 'ن', 'د'],\n  STANDALONENARROWMONTHS: ['ج', 'ف', 'م', 'أ', 'م', 'ج', 'ج', 'أ', 'س', 'أ', 'ن', 'د'],\n  MONTHS: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان', 'جويلية', 'أوت', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان', 'جويلية', 'أوت', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان', 'جويلية', 'أوت', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['جانفي', 'فيفري', 'مارس', 'أفريل', 'ماي', 'جوان', 'جويلية', 'أوت', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_XB.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_XB = {\n  ERAS: ['؜‮BC‬؜', '؜‮AD‬؜'],\n  ERANAMES: ['؜‮Before‬؜ ؜‮Christ‬؜', '؜‮Anno‬؜ ؜‮Domini‬؜'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['؜‮January‬؜', '؜‮February‬؜', '؜‮March‬؜', '؜‮April‬؜', '؜‮May‬؜', '؜‮June‬؜', '؜‮July‬؜', '؜‮August‬؜', '؜‮September‬؜', '؜‮October‬؜', '؜‮November‬؜', '؜‮December‬؜'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['؜‮Jan‬؜', '؜‮Feb‬؜', '؜‮Mar‬؜', '؜‮Apr‬؜', '؜‮May‬؜', '؜‮Jun‬؜', '؜‮Jul‬؜', '؜‮Aug‬؜', '؜‮Sep‬؜', '؜‮Oct‬؜', '؜‮Nov‬؜', '؜‮Dec‬؜'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['؜‮Sunday‬؜', '؜‮Monday‬؜', '؜‮Tuesday‬؜', '؜‮Wednesday‬؜', '؜‮Thursday‬؜', '؜‮Friday‬؜', '؜‮Saturday‬؜'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['؜‮Sun‬؜', '؜‮Mon‬؜', '؜‮Tue‬؜', '؜‮Wed‬؜', '؜‮Thu‬؜', '؜‮Fri‬؜', '؜‮Sat‬؜'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['؜‮Q‬؜1', '؜‮Q‬؜2', '؜‮Q‬؜3', '؜‮Q‬؜4'],\n  QUARTERS: ['1؜‮st‬؜ ؜‮quarter‬؜', '2؜‮nd‬؜ ؜‮quarter‬؜', '3؜‮rd‬؜ ؜‮quarter‬؜', '4؜‮th‬؜ ؜‮quarter‬؜'],\n  AMPMS: ['؜‮AM‬؜', '؜‮PM‬؜'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'؜‮at‬؜\\' {0}', '{1} \\'؜‮at‬؜\\' {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ar_YE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ar_YE = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['ق.م', 'م'],\n  ERANAMES: ['قبل الميلاد', 'ميلادي'],\n  NARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  STANDALONENARROWMONTHS: ['ي', 'ف', 'م', 'أ', 'و', 'ن', 'ل', 'غ', 'س', 'ك', 'ب', 'د'],\n  MONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONEMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  SHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  STANDALONESHORTMONTHS: ['يناير', 'فبراير', 'مارس', 'أبريل', 'مايو', 'يونيو', 'يوليو', 'أغسطس', 'سبتمبر', 'أكتوبر', 'نوفمبر', 'ديسمبر'],\n  WEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONEWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  SHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  STANDALONESHORTWEEKDAYS: ['الأحد', 'الاثنين', 'الثلاثاء', 'الأربعاء', 'الخميس', 'الجمعة', 'السبت'],\n  NARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  STANDALONENARROWWEEKDAYS: ['ح', 'ن', 'ث', 'ر', 'خ', 'ج', 'س'],\n  SHORTQUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  QUARTERS: ['الربع الأول', 'الربع الثاني', 'الربع الثالث', 'الربع الرابع'],\n  AMPMS: ['ص', 'م'],\n  DATEFORMATS: ['EEEE، d MMMM y', 'd MMMM y', 'dd‏/MM‏/y', 'd‏/M‏/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale as.\n * @const\n */\ngoog.i18n.DateTimeSymbols_as = {\n  ZERODIGIT: 0x09E6,\n  ERAS: ['খ্ৰীঃ পূঃ', 'খ্ৰীঃ'],\n  ERANAMES: ['খ্ৰীষ্টপূৰ্ব', 'খ্ৰীষ্টাব্দ'],\n  NARROWMONTHS: ['জ', 'ফ', 'ম', 'এ', 'ম', 'জ', 'জ', 'আ', 'ছ', 'অ', 'ন', 'ড'],\n  STANDALONENARROWMONTHS: ['জ', 'ফ', 'ম', 'এ', 'ম', 'জ', 'জ', 'আ', 'ছ', 'অ', 'ন', 'ড'],\n  MONTHS: ['জানুৱাৰী', 'ফেব্ৰুৱাৰী', 'মাৰ্চ', 'এপ্ৰিল', 'মে’', 'জুন', 'জুলাই', 'আগষ্ট', 'ছেপ্তেম্বৰ', 'অক্টোবৰ', 'নৱেম্বৰ', 'ডিচেম্বৰ'],\n  STANDALONEMONTHS: ['জানুৱাৰী', 'ফেব্ৰুৱাৰী', 'মাৰ্চ', 'এপ্ৰিল', 'মে’', 'জুন', 'জুলাই', 'আগষ্ট', 'ছেপ্তেম্বৰ', 'অক্টোবৰ', 'নৱেম্বৰ', 'ডিচেম্বৰ'],\n  SHORTMONTHS: ['জানু', 'ফেব্ৰু', 'মাৰ্চ', 'এপ্ৰিল', 'মে’', 'জুন', 'জুলাই', 'আগ', 'ছেপ্তে', 'অক্টো', 'নৱে', 'ডিচে'],\n  STANDALONESHORTMONTHS: ['জানু', 'ফেব্ৰু', 'মাৰ্চ', 'এপ্ৰিল', 'মে’', 'জুন', 'জুলাই', 'আগ', 'ছেপ্তে', 'অক্টো', 'নৱে', 'ডিচে'],\n  WEEKDAYS: ['দেওবাৰ', 'সোমবাৰ', 'মঙ্গলবাৰ', 'বুধবাৰ', 'বৃহস্পতিবাৰ', 'শুক্ৰবাৰ', 'শনিবাৰ'],\n  STANDALONEWEEKDAYS: ['দেওবাৰ', 'সোমবাৰ', 'মঙ্গলবাৰ', 'বুধবাৰ', 'বৃহস্পতিবাৰ', 'শুক্ৰবাৰ', 'শনিবাৰ'],\n  SHORTWEEKDAYS: ['দেও', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহ', 'শুক্ৰ', 'শনি'],\n  STANDALONESHORTWEEKDAYS: ['দেও', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহ', 'শুক্ৰ', 'শনি'],\n  NARROWWEEKDAYS: ['দ', 'স', 'ম', 'ব', 'ব', 'শ', 'শ'],\n  STANDALONENARROWWEEKDAYS: ['দ', 'স', 'ম', 'ব', 'ব', 'শ', 'শ'],\n  SHORTQUARTERS: ['১মঃ তিঃ', '২য়ঃ তিঃ', '৩য়ঃ তিঃ', '৪ৰ্থঃ তিঃ'],\n  QUARTERS: ['প্ৰথম তিনিমাহ', 'দ্বিতীয় তিনিমাহ', 'তৃতীয় তিনিমাহ', 'চতুৰ্থ তিনিমাহ'],\n  AMPMS: ['পূৰ্বাহ্ন', 'অপৰাহ্ন'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM, y', 'dd-MM-y', 'd-M-y'],\n  TIMEFORMATS: ['a h.mm.ss zzzz', 'a h.mm.ss z', 'a h.mm.ss', 'a h.mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale as_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_as_IN = goog.i18n.DateTimeSymbols_as;\n\n\n/**\n * Date/time formatting symbols for locale asa.\n * @const\n */\ngoog.i18n.DateTimeSymbols_asa = {\n  ERAS: ['KM', 'BM'],\n  ERANAMES: ['Kabla yakwe Yethu', 'Baada yakwe Yethu'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  STANDALONEMONTHS: ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Dec'],\n  WEEKDAYS: ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  STANDALONEWEEKDAYS: ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  SHORTWEEKDAYS: ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Ijm', 'Jmo'],\n  STANDALONESHORTWEEKDAYS: ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Ijm', 'Jmo'],\n  NARROWWEEKDAYS: ['J', 'J', 'J', 'J', 'A', 'I', 'J'],\n  STANDALONENARROWWEEKDAYS: ['J', 'J', 'J', 'J', 'A', 'I', 'J'],\n  SHORTQUARTERS: ['R1', 'R2', 'R3', 'R4'],\n  QUARTERS: ['Robo 1', 'Robo 2', 'Robo 3', 'Robo 4'],\n  AMPMS: ['icheheavo', 'ichamthi'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale asa_TZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_asa_TZ = goog.i18n.DateTimeSymbols_asa;\n\n\n/**\n * Date/time formatting symbols for locale ast.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ast = {\n  ERAS: ['e.C.', 'd.C.'],\n  ERANAMES: ['enantes de Cristu', 'después de Cristu'],\n  NARROWMONTHS: ['X', 'F', 'M', 'A', 'M', 'X', 'X', 'A', 'S', 'O', 'P', 'A'],\n  STANDALONENARROWMONTHS: ['X', 'F', 'M', 'A', 'M', 'X', 'X', 'A', 'S', 'O', 'P', 'A'],\n  MONTHS: ['de xineru', 'de febreru', 'de marzu', 'd’abril', 'de mayu', 'de xunu', 'de xunetu', 'd’agostu', 'de setiembre', 'd’ochobre', 'de payares', 'd’avientu'],\n  STANDALONEMONTHS: ['xineru', 'febreru', 'marzu', 'abril', 'mayu', 'xunu', 'xunetu', 'agostu', 'setiembre', 'ochobre', 'payares', 'avientu'],\n  SHORTMONTHS: ['xin', 'feb', 'mar', 'abr', 'may', 'xun', 'xnt', 'ago', 'set', 'och', 'pay', 'avi'],\n  STANDALONESHORTMONTHS: ['Xin', 'Feb', 'Mar', 'Abr', 'May', 'Xun', 'Xnt', 'Ago', 'Set', 'Och', 'Pay', 'Avi'],\n  WEEKDAYS: ['domingu', 'llunes', 'martes', 'miércoles', 'xueves', 'vienres', 'sábadu'],\n  STANDALONEWEEKDAYS: ['domingu', 'llunes', 'martes', 'miércoles', 'xueves', 'vienres', 'sábadu'],\n  SHORTWEEKDAYS: ['dom', 'llu', 'mar', 'mié', 'xue', 'vie', 'sáb'],\n  STANDALONESHORTWEEKDAYS: ['dom', 'llu', 'mar', 'mié', 'xue', 'vie', 'sáb'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'X', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'X', 'V', 'S'],\n  SHORTQUARTERS: ['1T', '2T', '3T', '4T'],\n  QUARTERS: ['1er trimestre', '2u trimestre', '3er trimestre', '4u trimestre'],\n  AMPMS: ['de la mañana', 'de la tarde'],\n  DATEFORMATS: ['EEEE, d MMMM \\'de\\' y', 'd MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'a\\' \\'les\\' {0}', '{1} \\'a\\' \\'les\\' {0}', '{1}, {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale ast_ES.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ast_ES = goog.i18n.DateTimeSymbols_ast;\n\n\n/**\n * Date/time formatting symbols for locale az_Cyrl.\n * @const\n */\ngoog.i18n.DateTimeSymbols_az_Cyrl = {\n  ERAS: ['е.ә.', 'ј.е.'],\n  ERANAMES: ['ерамыздан әввәл', 'јени ера'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['јанвар', 'феврал', 'март', 'апрел', 'май', 'ијун', 'ијул', 'август', 'сентјабр', 'октјабр', 'нојабр', 'декабр'],\n  STANDALONEMONTHS: ['Јанвар', 'Феврал', 'Март', 'Апрел', 'Май', 'Ијун', 'Ијул', 'Август', 'Сентјабр', 'Октјабр', 'Нојабр', 'Декабр'],\n  SHORTMONTHS: ['јан', 'фев', 'мар', 'апр', 'май', 'ијн', 'ијл', 'авг', 'сен', 'окт', 'ној', 'дек'],\n  STANDALONESHORTMONTHS: ['јан', 'фев', 'мар', 'апр', 'май', 'ијн', 'ијл', 'авг', 'сен', 'окт', 'ној', 'дек'],\n  WEEKDAYS: ['базар', 'базар ертәси', 'чәршәнбә ахшамы', 'чәршәнбә', 'ҹүмә ахшамы', 'ҹүмә', 'шәнбә'],\n  STANDALONEWEEKDAYS: ['базар', 'базар ертәси', 'чәршәнбә ахшамы', 'чәршәнбә', 'ҹүмә ахшамы', 'ҹүмә', 'шәнбә'],\n  SHORTWEEKDAYS: ['Б.', 'Б.Е.', 'Ч.А.', 'Ч.', 'Ҹ.А.', 'Ҹ.', 'Ш.'],\n  STANDALONESHORTWEEKDAYS: ['Б.', 'Б.Е.', 'Ч.А.', 'Ч.', 'Ҹ.А.', 'Ҹ.', 'Ш.'],\n  NARROWWEEKDAYS: ['7', '1', '2', '3', '4', '5', '6'],\n  STANDALONENARROWWEEKDAYS: ['7', '1', '2', '3', '4', '5', '6'],\n  SHORTQUARTERS: ['1-ҹи кв.', '2-ҹи кв.', '3-ҹү кв.', '4-ҹү кв.'],\n  QUARTERS: ['1-ҹи квартал', '2-ҹи квартал', '3-ҹү квартал', '4-ҹү квартал'],\n  AMPMS: ['АМ', 'ПМ'],\n  DATEFORMATS: ['d MMMM y, EEEE', 'd MMMM y', 'd MMM y', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale az_Cyrl_AZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_az_Cyrl_AZ = {\n  ERAS: ['е.ә.', 'ј.е.'],\n  ERANAMES: ['ерамыздан әввәл', 'јени ера'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['јанвар', 'феврал', 'март', 'апрел', 'май', 'ијун', 'ијул', 'август', 'сентјабр', 'октјабр', 'нојабр', 'декабр'],\n  STANDALONEMONTHS: ['Јанвар', 'Феврал', 'Март', 'Апрел', 'Май', 'Ијун', 'Ијул', 'Август', 'Сентјабр', 'Октјабр', 'Нојабр', 'Декабр'],\n  SHORTMONTHS: ['јан', 'фев', 'мар', 'апр', 'май', 'ијн', 'ијл', 'авг', 'сен', 'окт', 'ној', 'дек'],\n  STANDALONESHORTMONTHS: ['јан', 'фев', 'мар', 'апр', 'май', 'ијн', 'ијл', 'авг', 'сен', 'окт', 'ној', 'дек'],\n  WEEKDAYS: ['базар', 'базар ертәси', 'чәршәнбә ахшамы', 'чәршәнбә', 'ҹүмә ахшамы', 'ҹүмә', 'шәнбә'],\n  STANDALONEWEEKDAYS: ['базар', 'базар ертәси', 'чәршәнбә ахшамы', 'чәршәнбә', 'ҹүмә ахшамы', 'ҹүмә', 'шәнбә'],\n  SHORTWEEKDAYS: ['Б.', 'Б.Е.', 'Ч.А.', 'Ч.', 'Ҹ.А.', 'Ҹ.', 'Ш.'],\n  STANDALONESHORTWEEKDAYS: ['Б.', 'Б.Е.', 'Ч.А.', 'Ч.', 'Ҹ.А.', 'Ҹ.', 'Ш.'],\n  NARROWWEEKDAYS: ['7', '1', '2', '3', '4', '5', '6'],\n  STANDALONENARROWWEEKDAYS: ['7', '1', '2', '3', '4', '5', '6'],\n  SHORTQUARTERS: ['1-ҹи кв.', '2-ҹи кв.', '3-ҹү кв.', '4-ҹү кв.'],\n  QUARTERS: ['1-ҹи квартал', '2-ҹи квартал', '3-ҹү квартал', '4-ҹү квартал'],\n  AMPMS: ['АМ', 'ПМ'],\n  DATEFORMATS: ['d MMMM y, EEEE', 'd MMMM y', 'd MMM y', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale az_Latn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_az_Latn = goog.i18n.DateTimeSymbols_az;\n\n\n/**\n * Date/time formatting symbols for locale az_Latn_AZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_az_Latn_AZ = goog.i18n.DateTimeSymbols_az;\n\n\n/**\n * Date/time formatting symbols for locale bas.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bas = {\n  ERAS: ['b.Y.K', 'm.Y.K'],\n  ERANAMES: ['bisū bi Yesù Krǐstò', 'i mbūs Yesù Krǐstò'],\n  NARROWMONTHS: ['k', 'm', 'm', 'm', 'm', 'h', 'n', 'h', 'd', 'b', 'm', 'l'],\n  STANDALONENARROWMONTHS: ['k', 'm', 'm', 'm', 'm', 'h', 'n', 'h', 'd', 'b', 'm', 'l'],\n  MONTHS: ['Kɔndɔŋ', 'Màcɛ̂l', 'Màtùmb', 'Màtop', 'M̀puyɛ', 'Hìlòndɛ̀', 'Njèbà', 'Hìkaŋ', 'Dìpɔ̀s', 'Bìòôm', 'Màyɛsèp', 'Lìbuy li ńyèe'],\n  STANDALONEMONTHS: ['Kɔndɔŋ', 'Màcɛ̂l', 'Màtùmb', 'Màtop', 'M̀puyɛ', 'Hìlòndɛ̀', 'Njèbà', 'Hìkaŋ', 'Dìpɔ̀s', 'Bìòôm', 'Màyɛsèp', 'Lìbuy li ńyèe'],\n  SHORTMONTHS: ['kɔn', 'mac', 'mat', 'mto', 'mpu', 'hil', 'nje', 'hik', 'dip', 'bio', 'may', 'liɓ'],\n  STANDALONESHORTMONTHS: ['kɔn', 'mac', 'mat', 'mto', 'mpu', 'hil', 'nje', 'hik', 'dip', 'bio', 'may', 'liɓ'],\n  WEEKDAYS: ['ŋgwà nɔ̂y', 'ŋgwà njaŋgumba', 'ŋgwà ûm', 'ŋgwà ŋgê', 'ŋgwà mbɔk', 'ŋgwà kɔɔ', 'ŋgwà jôn'],\n  STANDALONEWEEKDAYS: ['ŋgwà nɔ̂y', 'ŋgwà njaŋgumba', 'ŋgwà ûm', 'ŋgwà ŋgê', 'ŋgwà mbɔk', 'ŋgwà kɔɔ', 'ŋgwà jôn'],\n  SHORTWEEKDAYS: ['nɔy', 'nja', 'uum', 'ŋge', 'mbɔ', 'kɔɔ', 'jon'],\n  STANDALONESHORTWEEKDAYS: ['nɔy', 'nja', 'uum', 'ŋge', 'mbɔ', 'kɔɔ', 'jon'],\n  NARROWWEEKDAYS: ['n', 'n', 'u', 'ŋ', 'm', 'k', 'j'],\n  STANDALONENARROWWEEKDAYS: ['n', 'n', 'u', 'ŋ', 'm', 'k', 'j'],\n  SHORTQUARTERS: ['K1s3', 'K2s3', 'K3s3', 'K4s3'],\n  QUARTERS: ['Kèk bisu i soŋ iaâ', 'Kèk i ńyonos biɓaà i soŋ iaâ', 'Kèk i ńyonos biaâ i soŋ iaâ', 'Kèk i ńyonos binâ i soŋ iaâ'],\n  AMPMS: ['I bikɛ̂glà', 'I ɓugajɔp'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale bas_CM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bas_CM = goog.i18n.DateTimeSymbols_bas;\n\n\n/**\n * Date/time formatting symbols for locale be_BY.\n * @const\n */\ngoog.i18n.DateTimeSymbols_be_BY = goog.i18n.DateTimeSymbols_be;\n\n\n/**\n * Date/time formatting symbols for locale bem.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bem = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Yesu', 'After Yesu'],\n  NARROWMONTHS: ['J', 'F', 'M', 'E', 'M', 'J', 'J', 'O', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'E', 'M', 'J', 'J', 'O', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januari', 'Februari', 'Machi', 'Epreo', 'Mei', 'Juni', 'Julai', 'Ogasti', 'Septemba', 'Oktoba', 'Novemba', 'Disemba'],\n  STANDALONEMONTHS: ['Januari', 'Februari', 'Machi', 'Epreo', 'Mei', 'Juni', 'Julai', 'Ogasti', 'Septemba', 'Oktoba', 'Novemba', 'Disemba'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Epr', 'Mei', 'Jun', 'Jul', 'Oga', 'Sep', 'Okt', 'Nov', 'Dis'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Epr', 'Mei', 'Jun', 'Jul', 'Oga', 'Sep', 'Okt', 'Nov', 'Dis'],\n  WEEKDAYS: ['Pa Mulungu', 'Palichimo', 'Palichibuli', 'Palichitatu', 'Palichine', 'Palichisano', 'Pachibelushi'],\n  STANDALONEWEEKDAYS: ['Pa Mulungu', 'Palichimo', 'Palichibuli', 'Palichitatu', 'Palichine', 'Palichisano', 'Pachibelushi'],\n  SHORTWEEKDAYS: ['Pa Mulungu', 'Palichimo', 'Palichibuli', 'Palichitatu', 'Palichine', 'Palichisano', 'Pachibelushi'],\n  STANDALONESHORTWEEKDAYS: ['Pa Mulungu', 'Palichimo', 'Palichibuli', 'Palichitatu', 'Palichine', 'Palichisano', 'Pachibelushi'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['uluchelo', 'akasuba'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale bem_ZM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bem_ZM = goog.i18n.DateTimeSymbols_bem;\n\n\n/**\n * Date/time formatting symbols for locale bez.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bez = {\n  ERAS: ['KM', 'BM'],\n  ERANAMES: ['Kabla ya Mtwaa', 'Baada ya Mtwaa'],\n  NARROWMONTHS: ['H', 'V', 'D', 'T', 'H', 'S', 'S', 'N', 'T', 'K', 'K', 'K'],\n  STANDALONENARROWMONTHS: ['H', 'V', 'D', 'T', 'H', 'S', 'S', 'N', 'T', 'K', 'K', 'K'],\n  MONTHS: ['pa mwedzi gwa hutala', 'pa mwedzi gwa wuvili', 'pa mwedzi gwa wudatu', 'pa mwedzi gwa wutai', 'pa mwedzi gwa wuhanu', 'pa mwedzi gwa sita', 'pa mwedzi gwa saba', 'pa mwedzi gwa nane', 'pa mwedzi gwa tisa', 'pa mwedzi gwa kumi', 'pa mwedzi gwa kumi na moja', 'pa mwedzi gwa kumi na mbili'],\n  STANDALONEMONTHS: ['pa mwedzi gwa hutala', 'pa mwedzi gwa wuvili', 'pa mwedzi gwa wudatu', 'pa mwedzi gwa wutai', 'pa mwedzi gwa wuhanu', 'pa mwedzi gwa sita', 'pa mwedzi gwa saba', 'pa mwedzi gwa nane', 'pa mwedzi gwa tisa', 'pa mwedzi gwa kumi', 'pa mwedzi gwa kumi na moja', 'pa mwedzi gwa kumi na mbili'],\n  SHORTMONTHS: ['Hut', 'Vil', 'Dat', 'Tai', 'Han', 'Sit', 'Sab', 'Nan', 'Tis', 'Kum', 'Kmj', 'Kmb'],\n  STANDALONESHORTMONTHS: ['Hut', 'Vil', 'Dat', 'Tai', 'Han', 'Sit', 'Sab', 'Nan', 'Tis', 'Kum', 'Kmj', 'Kmb'],\n  WEEKDAYS: ['pa mulungu', 'pa shahuviluha', 'pa hivili', 'pa hidatu', 'pa hitayi', 'pa hihanu', 'pa shahulembela'],\n  STANDALONEWEEKDAYS: ['pa mulungu', 'pa shahuviluha', 'pa hivili', 'pa hidatu', 'pa hitayi', 'pa hihanu', 'pa shahulembela'],\n  SHORTWEEKDAYS: ['Mul', 'Vil', 'Hiv', 'Hid', 'Hit', 'Hih', 'Lem'],\n  STANDALONESHORTWEEKDAYS: ['Mul', 'Vil', 'Hiv', 'Hid', 'Hit', 'Hih', 'Lem'],\n  NARROWWEEKDAYS: ['M', 'J', 'H', 'H', 'H', 'W', 'J'],\n  STANDALONENARROWWEEKDAYS: ['M', 'J', 'H', 'H', 'H', 'W', 'J'],\n  SHORTQUARTERS: ['L1', 'L2', 'L3', 'L4'],\n  QUARTERS: ['Lobo 1', 'Lobo 2', 'Lobo 3', 'Lobo 4'],\n  AMPMS: ['pamilau', 'pamunyi'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale bez_TZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bez_TZ = goog.i18n.DateTimeSymbols_bez;\n\n\n/**\n * Date/time formatting symbols for locale bg_BG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bg_BG = goog.i18n.DateTimeSymbols_bg;\n\n\n/**\n * Date/time formatting symbols for locale bm.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bm = {\n  ERAS: ['J.-C. ɲɛ', 'ni J.-C.'],\n  ERANAMES: ['jezu krisiti ɲɛ', 'jezu krisiti minkɛ'],\n  NARROWMONTHS: ['Z', 'F', 'M', 'A', 'M', 'Z', 'Z', 'U', 'S', 'Ɔ', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['Z', 'F', 'M', 'A', 'M', 'Z', 'Z', 'U', 'S', 'Ɔ', 'N', 'D'],\n  MONTHS: ['zanwuye', 'feburuye', 'marisi', 'awirili', 'mɛ', 'zuwɛn', 'zuluye', 'uti', 'sɛtanburu', 'ɔkutɔburu', 'nowanburu', 'desanburu'],\n  STANDALONEMONTHS: ['zanwuye', 'feburuye', 'marisi', 'awirili', 'mɛ', 'zuwɛn', 'zuluye', 'uti', 'sɛtanburu', 'ɔkutɔburu', 'nowanburu', 'desanburu'],\n  SHORTMONTHS: ['zan', 'feb', 'mar', 'awi', 'mɛ', 'zuw', 'zul', 'uti', 'sɛt', 'ɔku', 'now', 'des'],\n  STANDALONESHORTMONTHS: ['zan', 'feb', 'mar', 'awi', 'mɛ', 'zuw', 'zul', 'uti', 'sɛt', 'ɔku', 'now', 'des'],\n  WEEKDAYS: ['kari', 'ntɛnɛ', 'tarata', 'araba', 'alamisa', 'juma', 'sibiri'],\n  STANDALONEWEEKDAYS: ['kari', 'ntɛnɛ', 'tarata', 'araba', 'alamisa', 'juma', 'sibiri'],\n  SHORTWEEKDAYS: ['kar', 'ntɛ', 'tar', 'ara', 'ala', 'jum', 'sib'],\n  STANDALONESHORTWEEKDAYS: ['kar', 'ntɛ', 'tar', 'ara', 'ala', 'jum', 'sib'],\n  NARROWWEEKDAYS: ['K', 'N', 'T', 'A', 'A', 'J', 'S'],\n  STANDALONENARROWWEEKDAYS: ['K', 'N', 'T', 'A', 'A', 'J', 'S'],\n  SHORTQUARTERS: ['KS1', 'KS2', 'KS3', 'KS4'],\n  QUARTERS: ['kalo saba fɔlɔ', 'kalo saba filanan', 'kalo saba sabanan', 'kalo saba naaninan'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale bm_ML.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bm_ML = goog.i18n.DateTimeSymbols_bm;\n\n\n/**\n * Date/time formatting symbols for locale bn_BD.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bn_BD = goog.i18n.DateTimeSymbols_bn;\n\n\n/**\n * Date/time formatting symbols for locale bn_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bn_IN = {\n  ZERODIGIT: 0x09E6,\n  ERAS: ['খ্রিস্টপূর্ব', 'খৃষ্টাব্দ'],\n  ERANAMES: ['খ্রিস্টপূর্ব', 'খ্রীষ্টাব্দ'],\n  NARROWMONTHS: ['জা', 'ফে', 'মা', 'এ', 'মে', 'জুন', 'জু', 'আ', 'সে', 'অ', 'ন', 'ডি'],\n  STANDALONENARROWMONTHS: ['জা', 'ফে', 'মা', 'এ', 'মে', 'জুন', 'জু', 'আ', 'সে', 'অ', 'ন', 'ডি'],\n  MONTHS: ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'],\n  STANDALONEMONTHS: ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'],\n  SHORTMONTHS: ['জানু', 'ফেব', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'],\n  STANDALONESHORTMONTHS: ['জানুয়ারী', 'ফেব্রুয়ারী', 'মার্চ', 'এপ্রিল', 'মে', 'জুন', 'জুলাই', 'আগস্ট', 'সেপ্টেম্বর', 'অক্টোবর', 'নভেম্বর', 'ডিসেম্বর'],\n  WEEKDAYS: ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'],\n  STANDALONEWEEKDAYS: ['রবিবার', 'সোমবার', 'মঙ্গলবার', 'বুধবার', 'বৃহস্পতিবার', 'শুক্রবার', 'শনিবার'],\n  SHORTWEEKDAYS: ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'],\n  STANDALONESHORTWEEKDAYS: ['রবি', 'সোম', 'মঙ্গল', 'বুধ', 'বৃহস্পতি', 'শুক্র', 'শনি'],\n  NARROWWEEKDAYS: ['র', 'সো', 'ম', 'বু', 'বৃ', 'শু', 'শ'],\n  STANDALONENARROWWEEKDAYS: ['র', 'সো', 'ম', 'বু', 'বৃ', 'শু', 'শ'],\n  SHORTQUARTERS: ['ত্রৈমাসিক', 'দ্বিতীয় ত্রৈমাসিক', 'তৃতীয় ত্রৈমাসিক', 'চতুর্থ ত্রৈমাসিক'],\n  QUARTERS: ['ত্রৈমাসিক', 'দ্বিতীয় ত্রৈমাসিক', 'তৃতীয় ত্রৈমাসিক', 'চতুর্থ ত্রৈমাসিক'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM, y', 'd MMM, y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale bo.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bo = {\n  ERAS: ['སྤྱི་ལོ་སྔོན་', 'སྤྱི་ལོ་'],\n  ERANAMES: ['སྤྱི་ལོ་སྔོན་', 'སྤྱི་ལོ་'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['ཟླ་བ་དང་པོ', 'ཟླ་བ་གཉིས་པ', 'ཟླ་བ་གསུམ་པ', 'ཟླ་བ་བཞི་པ', 'ཟླ་བ་ལྔ་པ', 'ཟླ་བ་དྲུག་པ', 'ཟླ་བ་བདུན་པ', 'ཟླ་བ་བརྒྱད་པ', 'ཟླ་བ་དགུ་པ', 'ཟླ་བ་བཅུ་པ', 'ཟླ་བ་བཅུ་གཅིག་པ', 'ཟླ་བ་བཅུ་གཉིས་པ'],\n  STANDALONEMONTHS: ['ཟླ་བ་དང་པོ་', 'ཟླ་བ་གཉིས་པ་', 'ཟླ་བ་གསུམ་པ་', 'ཟླ་བ་བཞི་པ་', 'ཟླ་བ་ལྔ་པ་', 'ཟླ་བ་དྲུག་པ་', 'ཟླ་བ་བདུན་པ་', 'ཟླ་བ་བརྒྱད་པ་', 'ཟླ་བ་དགུ་པ་', 'ཟླ་བ་བཅུ་པ་', 'ཟླ་བ་བཅུ་གཅིག་པ་', 'ཟླ་བ་བཅུ་གཉིས་པ་'],\n  SHORTMONTHS: ['ཟླ་༡', 'ཟླ་༢', 'ཟླ་༣', 'ཟླ་༤', 'ཟླ་༥', 'ཟླ་༦', 'ཟླ་༧', 'ཟླ་༨', 'ཟླ་༩', 'ཟླ་༡༠', 'ཟླ་༡༡', 'ཟླ་༡༢'],\n  STANDALONESHORTMONTHS: ['ཟླ་༡', 'ཟླ་༢', 'ཟླ་༣', 'ཟླ་༤', 'ཟླ་༥', 'ཟླ་༦', 'ཟླ་༧', 'ཟླ་༨', 'ཟླ་༩', 'ཟླ་༡༠', 'ཟླ་༡༡', 'ཟླ་༡༢'],\n  WEEKDAYS: ['གཟའ་ཉི་མ་', 'གཟའ་ཟླ་བ་', 'གཟའ་མིག་དམར་', 'གཟའ་ལྷག་པ་', 'གཟའ་ཕུར་བུ་', 'གཟའ་པ་སངས་', 'གཟའ་སྤེན་པ་'],\n  STANDALONEWEEKDAYS: ['གཟའ་ཉི་མ་', 'གཟའ་ཟླ་བ་', 'གཟའ་མིག་དམར་', 'གཟའ་ལྷག་པ་', 'གཟའ་ཕུར་བུ་', 'གཟའ་པ་སངས་', 'གཟའ་སྤེན་པ་'],\n  SHORTWEEKDAYS: ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ་', 'པ་སངས་', 'སྤེན་པ་'],\n  STANDALONESHORTWEEKDAYS: ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ་', 'པ་སངས་', 'སྤེན་པ་'],\n  NARROWWEEKDAYS: ['ཉི', 'ཟླ', 'མིག', 'ལྷག', 'ཕུར', 'སངས', 'སྤེན'],\n  STANDALONENARROWWEEKDAYS: ['ཉི', 'ཟླ', 'མིག', 'ལྷག', 'ཕུར', 'སངས', 'སྤེན'],\n  SHORTQUARTERS: ['དུས་ཚིགས་དང་པོ།', 'དུས་ཚིགས་གཉིས་པ།', 'དུས་ཚིགས་གསུམ་པ།', 'དུས་ཚིགས་བཞི་པ།'],\n  QUARTERS: ['དུས་ཚིགས་དང་པོ།', 'དུས་ཚིགས་གཉིས་པ།', 'དུས་ཚིགས་གསུམ་པ།', 'དུས་ཚིགས་བཞི་པ།'],\n  AMPMS: ['སྔ་དྲོ་', 'ཕྱི་དྲོ་'],\n  DATEFORMATS: ['y MMMMའི་ཚེས་d, EEEE', 'སྤྱི་ལོ་y MMMMའི་ཚེས་d', 'y ལོའི་MMMཚེས་d', 'y-MM-dd'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale bo_CN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bo_CN = goog.i18n.DateTimeSymbols_bo;\n\n\n/**\n * Date/time formatting symbols for locale bo_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bo_IN = {\n  ERAS: ['སྤྱི་ལོ་སྔོན་', 'སྤྱི་ལོ་'],\n  ERANAMES: ['སྤྱི་ལོ་སྔོན་', 'སྤྱི་ལོ་'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['ཟླ་བ་དང་པོ', 'ཟླ་བ་གཉིས་པ', 'ཟླ་བ་གསུམ་པ', 'ཟླ་བ་བཞི་པ', 'ཟླ་བ་ལྔ་པ', 'ཟླ་བ་དྲུག་པ', 'ཟླ་བ་བདུན་པ', 'ཟླ་བ་བརྒྱད་པ', 'ཟླ་བ་དགུ་པ', 'ཟླ་བ་བཅུ་པ', 'ཟླ་བ་བཅུ་གཅིག་པ', 'ཟླ་བ་བཅུ་གཉིས་པ'],\n  STANDALONEMONTHS: ['ཟླ་བ་དང་པོ་', 'ཟླ་བ་གཉིས་པ་', 'ཟླ་བ་གསུམ་པ་', 'ཟླ་བ་བཞི་པ་', 'ཟླ་བ་ལྔ་པ་', 'ཟླ་བ་དྲུག་པ་', 'ཟླ་བ་བདུན་པ་', 'ཟླ་བ་བརྒྱད་པ་', 'ཟླ་བ་དགུ་པ་', 'ཟླ་བ་བཅུ་པ་', 'ཟླ་བ་བཅུ་གཅིག་པ་', 'ཟླ་བ་བཅུ་གཉིས་པ་'],\n  SHORTMONTHS: ['ཟླ་༡', 'ཟླ་༢', 'ཟླ་༣', 'ཟླ་༤', 'ཟླ་༥', 'ཟླ་༦', 'ཟླ་༧', 'ཟླ་༨', 'ཟླ་༩', 'ཟླ་༡༠', 'ཟླ་༡༡', 'ཟླ་༡༢'],\n  STANDALONESHORTMONTHS: ['ཟླ་༡', 'ཟླ་༢', 'ཟླ་༣', 'ཟླ་༤', 'ཟླ་༥', 'ཟླ་༦', 'ཟླ་༧', 'ཟླ་༨', 'ཟླ་༩', 'ཟླ་༡༠', 'ཟླ་༡༡', 'ཟླ་༡༢'],\n  WEEKDAYS: ['གཟའ་ཉི་མ་', 'གཟའ་ཟླ་བ་', 'གཟའ་མིག་དམར་', 'གཟའ་ལྷག་པ་', 'གཟའ་ཕུར་བུ་', 'གཟའ་པ་སངས་', 'གཟའ་སྤེན་པ་'],\n  STANDALONEWEEKDAYS: ['གཟའ་ཉི་མ་', 'གཟའ་ཟླ་བ་', 'གཟའ་མིག་དམར་', 'གཟའ་ལྷག་པ་', 'གཟའ་ཕུར་བུ་', 'གཟའ་པ་སངས་', 'གཟའ་སྤེན་པ་'],\n  SHORTWEEKDAYS: ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ་', 'པ་སངས་', 'སྤེན་པ་'],\n  STANDALONESHORTWEEKDAYS: ['ཉི་མ་', 'ཟླ་བ་', 'མིག་དམར་', 'ལྷག་པ་', 'ཕུར་བུ་', 'པ་སངས་', 'སྤེན་པ་'],\n  NARROWWEEKDAYS: ['ཉི', 'ཟླ', 'མིག', 'ལྷག', 'ཕུར', 'སངས', 'སྤེན'],\n  STANDALONENARROWWEEKDAYS: ['ཉི', 'ཟླ', 'མིག', 'ལྷག', 'ཕུར', 'སངས', 'སྤེན'],\n  SHORTQUARTERS: ['དུས་ཚིགས་དང་པོ།', 'དུས་ཚིགས་གཉིས་པ།', 'དུས་ཚིགས་གསུམ་པ།', 'དུས་ཚིགས་བཞི་པ།'],\n  QUARTERS: ['དུས་ཚིགས་དང་པོ།', 'དུས་ཚིགས་གཉིས་པ།', 'དུས་ཚིགས་གསུམ་པ།', 'དུས་ཚིགས་བཞི་པ།'],\n  AMPMS: ['སྔ་དྲོ་', 'ཕྱི་དྲོ་'],\n  DATEFORMATS: ['y MMMMའི་ཚེས་d, EEEE', 'སྤྱི་ལོ་y MMMMའི་ཚེས་d', 'y ལོའི་MMMཚེས་d', 'y-MM-dd'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale br_FR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_br_FR = goog.i18n.DateTimeSymbols_br;\n\n\n/**\n * Date/time formatting symbols for locale brx.\n * @const\n */\ngoog.i18n.DateTimeSymbols_brx = {\n  ERAS: ['ईसा.पूर्व', 'सन'],\n  ERANAMES: ['ईसा.पूर्व', 'सन'],\n  NARROWMONTHS: ['ज', 'फे', 'मा', 'ए', 'मे', 'जु', 'जु', 'आ', 'से', 'अ', 'न', 'दि'],\n  STANDALONENARROWMONTHS: ['ज', 'फे', 'मा', 'ए', 'मे', 'जु', 'जु', 'आ', 'से', 'अ', 'न', 'दि'],\n  MONTHS: ['जानुवारी', 'फेब्रुवारी', 'मार्स', 'एफ्रिल', 'मे', 'जुन', 'जुलाइ', 'आगस्थ', 'सेबथेज्ब़र', 'अखथबर', 'नबेज्ब़र', 'दिसेज्ब़र'],\n  STANDALONEMONTHS: ['जानुवारी', 'फेब्रुवारी', 'मार्स', 'एफ्रिल', 'मे', 'जुन', 'जुलाइ', 'आगस्थ', 'सेबथेज्ब़र', 'अखथबर', 'नबेज्ब़र', 'दिसेज्ब़र'],\n  SHORTMONTHS: ['जानुवारी', 'फेब्रुवारी', 'मार्स', 'एफ्रिल', 'मे', 'जुन', 'जुलाइ', 'आगस्थ', 'सेबथेज्ब़र', 'अखथबर', 'नबेज्ब़र', 'दिसेज्ब़र'],\n  STANDALONESHORTMONTHS: ['जानुवारी', 'फेब्रुवारी', 'मार्स', 'एफ्रिल', 'मे', 'जुन', 'जुलाइ', 'आगस्थ', 'सेबथेज्ब़र', 'अखथबर', 'नबेज्ब़र', 'दिसेज्ब़र'],\n  WEEKDAYS: ['रबिबार', 'समबार', 'मंगलबार', 'बुदबार', 'बिसथिबार', 'सुखुरबार', 'सुनिबार'],\n  STANDALONEWEEKDAYS: ['रबिबार', 'समबार', 'मंगलबार', 'बुदबार', 'बिसथिबार', 'सुखुरबार', 'सुनिबार'],\n  SHORTWEEKDAYS: ['रबि', 'सम', 'मंगल', 'बुद', 'बिसथि', 'सुखुर', 'सुनि'],\n  STANDALONESHORTWEEKDAYS: ['रबि', 'सम', 'मंगल', 'बुद', 'बिसथि', 'सुखुर', 'सुनि'],\n  NARROWWEEKDAYS: ['र', 'स', 'मं', 'बु', 'बि', 'सु', 'सु'],\n  STANDALONENARROWWEEKDAYS: ['र', 'स', 'मं', 'बु', 'बि', 'सु', 'सु'],\n  SHORTQUARTERS: ['सिथासे/खोन्दोसे/बाहागोसे', 'खावसे/खोन्दोनै/बाहागोनै', 'खावथाम/खोन्दोथाम/बाहागोथाम', 'खावब्रै/खोन्दोब्रै/फुरा/आबुं'],\n  QUARTERS: ['सिथासे/खोन्दोसे/बाहागोसे', 'खावसे/खोन्दोनै/बाहागोनै', 'खावथाम/खोन्दोथाम/बाहागोथाम', 'खावब्रै/खोन्दोब्रै/फुरा/आबुं'],\n  AMPMS: ['फुं', 'बेलासे'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale brx_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_brx_IN = goog.i18n.DateTimeSymbols_brx;\n\n\n/**\n * Date/time formatting symbols for locale bs_Cyrl.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bs_Cyrl = {\n  ERAS: ['п. н. е.', 'н. е.'],\n  ERANAMES: ['прије нове ере', 'нове ере'],\n  NARROWMONTHS: ['ј', 'ф', 'м', 'а', 'м', 'ј', 'ј', 'а', 'с', 'о', 'н', 'д'],\n  STANDALONENARROWMONTHS: ['ј', 'ф', 'м', 'а', 'м', 'ј', 'ј', 'а', 'с', 'о', 'н', 'д'],\n  MONTHS: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јуни', 'јули', 'аугуст', 'септембар', 'октобар', 'новембар', 'децембар'],\n  STANDALONEMONTHS: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јуни', 'јули', 'аугуст', 'септембар', 'октобар', 'новембар', 'децембар'],\n  SHORTMONTHS: ['јан', 'феб', 'мар', 'апр', 'мај', 'јун', 'јул', 'ауг', 'сеп', 'окт', 'нов', 'дец'],\n  STANDALONESHORTMONTHS: ['јан', 'феб', 'мар', 'апр', 'мај', 'јун', 'јул', 'ауг', 'сеп', 'окт', 'нов', 'дец'],\n  WEEKDAYS: ['недјеља', 'понедјељак', 'уторак', 'сриједа', 'четвртак', 'петак', 'субота'],\n  STANDALONEWEEKDAYS: ['недјеља', 'понедјељак', 'уторак', 'сриједа', 'четвртак', 'петак', 'субота'],\n  SHORTWEEKDAYS: ['нед', 'пон', 'уто', 'сри', 'чет', 'пет', 'суб'],\n  STANDALONESHORTWEEKDAYS: ['нед', 'пон', 'уто', 'сри', 'чет', 'пет', 'суб'],\n  NARROWWEEKDAYS: ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],\n  STANDALONENARROWWEEKDAYS: ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],\n  SHORTQUARTERS: ['К1', 'К2', 'К3', 'К4'],\n  QUARTERS: ['Прво тромесечје', 'Друго тромесечје', 'Треће тромесечје', 'Четврто тромесечје'],\n  AMPMS: ['пре подне', 'поподне'],\n  DATEFORMATS: ['EEEE, dd. MMMM y.', 'dd. MMMM y.', 'dd.MM.y.', 'd.M.yy.'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale bs_Cyrl_BA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bs_Cyrl_BA = {\n  ERAS: ['п. н. е.', 'н. е.'],\n  ERANAMES: ['прије нове ере', 'нове ере'],\n  NARROWMONTHS: ['ј', 'ф', 'м', 'а', 'м', 'ј', 'ј', 'а', 'с', 'о', 'н', 'д'],\n  STANDALONENARROWMONTHS: ['ј', 'ф', 'м', 'а', 'м', 'ј', 'ј', 'а', 'с', 'о', 'н', 'д'],\n  MONTHS: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јуни', 'јули', 'аугуст', 'септембар', 'октобар', 'новембар', 'децембар'],\n  STANDALONEMONTHS: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јуни', 'јули', 'аугуст', 'септембар', 'октобар', 'новембар', 'децембар'],\n  SHORTMONTHS: ['јан', 'феб', 'мар', 'апр', 'мај', 'јун', 'јул', 'ауг', 'сеп', 'окт', 'нов', 'дец'],\n  STANDALONESHORTMONTHS: ['јан', 'феб', 'мар', 'апр', 'мај', 'јун', 'јул', 'ауг', 'сеп', 'окт', 'нов', 'дец'],\n  WEEKDAYS: ['недјеља', 'понедјељак', 'уторак', 'сриједа', 'четвртак', 'петак', 'субота'],\n  STANDALONEWEEKDAYS: ['недјеља', 'понедјељак', 'уторак', 'сриједа', 'четвртак', 'петак', 'субота'],\n  SHORTWEEKDAYS: ['нед', 'пон', 'уто', 'сри', 'чет', 'пет', 'суб'],\n  STANDALONESHORTWEEKDAYS: ['нед', 'пон', 'уто', 'сри', 'чет', 'пет', 'суб'],\n  NARROWWEEKDAYS: ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],\n  STANDALONENARROWWEEKDAYS: ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],\n  SHORTQUARTERS: ['К1', 'К2', 'К3', 'К4'],\n  QUARTERS: ['Прво тромесечје', 'Друго тромесечје', 'Треће тромесечје', 'Четврто тромесечје'],\n  AMPMS: ['пре подне', 'поподне'],\n  DATEFORMATS: ['EEEE, dd. MMMM y.', 'dd. MMMM y.', 'dd.MM.y.', 'd.M.yy.'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale bs_Latn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bs_Latn = goog.i18n.DateTimeSymbols_bs;\n\n\n/**\n * Date/time formatting symbols for locale bs_Latn_BA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_bs_Latn_BA = goog.i18n.DateTimeSymbols_bs;\n\n\n/**\n * Date/time formatting symbols for locale ca_AD.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ca_AD = goog.i18n.DateTimeSymbols_ca;\n\n\n/**\n * Date/time formatting symbols for locale ca_ES.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ca_ES = goog.i18n.DateTimeSymbols_ca;\n\n\n/**\n * Date/time formatting symbols for locale ca_FR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ca_FR = goog.i18n.DateTimeSymbols_ca;\n\n\n/**\n * Date/time formatting symbols for locale ca_IT.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ca_IT = goog.i18n.DateTimeSymbols_ca;\n\n\n/**\n * Date/time formatting symbols for locale ccp.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ccp = {\n  ERAS: ['\uD804\uDD08\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD34\uD804\uDD1B\uD804\uDD2B\uD804\uDD22\uD804\uDD34\uD804\uDD1D\uD804\uDD27', '\uD804\uDD08\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD1B\uD804\uDD34\uD804\uDD18\uD804\uDD27'],\n  ERANAMES: ['\uD804\uDD08\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD34\uD804\uDD1B\uD804\uDD2B\uD804\uDD22\uD804\uDD34\uD804\uDD1D\uD804\uDD27', '\uD804\uDD08\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD1B\uD804\uDD34\uD804\uDD18\uD804\uDD27'],\n  NARROWMONTHS: ['\uD804\uDD0E', '\uD804\uDD1C\uD804\uDD2C', '\uD804\uDD1F', '\uD804\uDD03\uD804\uDD2C', '\uD804\uDD1F\uD804\uDD2C', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD1A\uD804\uDD34', '\uD804\uDD0E\uD804\uDD2A', '\uD804\uDD03', '\uD804\uDD25\uD804\uDD2C', '\uD804\uDD03\uD804\uDD27', '\uD804\uDD1A\uD804\uDD27', '\uD804\uDD13\uD804\uDD28'],\n  STANDALONENARROWMONTHS: ['\uD804\uDD0E', '\uD804\uDD1C\uD804\uDD2C', '\uD804\uDD1F', '\uD804\uDD03\uD804\uDD2C', '\uD804\uDD1F\uD804\uDD2C', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD1A\uD804\uDD34', '\uD804\uDD0E\uD804\uDD2A', '\uD804\uDD03', '\uD804\uDD25\uD804\uDD2C', '\uD804\uDD03\uD804\uDD27', '\uD804\uDD1A\uD804\uDD27', '\uD804\uDD13\uD804\uDD28'],\n  MONTHS: ['\uD804\uDD0E\uD804\uDD1A\uD804\uDD2A\uD804\uDD20\uD804\uDD22\uD804\uDD28', '\uD804\uDD1C\uD804\uDD2C\uD804\uDD1B\uD804\uDD34\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD2A\uD804\uDD20\uD804\uDD22\uD804\uDD28', '\uD804\uDD1F\uD804\uDD22\uD804\uDD34\uD804\uDD0C\uD804\uDD27', '\uD804\uDD03\uD804\uDD2C\uD804\uDD1B\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD23\uD804\uDD34', '\uD804\uDD1F\uD804\uDD2C', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD1A\uD804\uDD34', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD23\uD804\uDD2D', '\uD804\uDD03\uD804\uDD09\uD804\uDD27\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD34', '\uD804\uDD25\uD804\uDD2C\uD804\uDD1B\uD804\uDD34\uD804\uDD11\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD03\uD804\uDD27\uD804\uDD07\uD804\uDD34\uD804\uDD11\uD804\uDD2C\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD1A\uD804\uDD27\uD804\uDD1E\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD13\uD804\uDD28\uD804\uDD25\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34'],\n  STANDALONEMONTHS: ['\uD804\uDD0E\uD804\uDD1A\uD804\uDD2A\uD804\uDD20\uD804\uDD22\uD804\uDD28', '\uD804\uDD1C\uD804\uDD2C\uD804\uDD1B\uD804\uDD34\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD2A\uD804\uDD20\uD804\uDD22\uD804\uDD28', '\uD804\uDD1F\uD804\uDD22\uD804\uDD34\uD804\uDD0C\uD804\uDD27', '\uD804\uDD03\uD804\uDD2C\uD804\uDD1B\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD23\uD804\uDD34', '\uD804\uDD1F\uD804\uDD2C', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD1A\uD804\uDD34', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD23\uD804\uDD2D', '\uD804\uDD03\uD804\uDD09\uD804\uDD27\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD34', '\uD804\uDD25\uD804\uDD2C\uD804\uDD1B\uD804\uDD34\uD804\uDD11\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD03\uD804\uDD27\uD804\uDD07\uD804\uDD34\uD804\uDD11\uD804\uDD2E\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD1A\uD804\uDD27\uD804\uDD1E\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD13\uD804\uDD28\uD804\uDD25\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34'],\n  SHORTMONTHS: ['\uD804\uDD0E\uD804\uDD1A\uD804\uDD2A', '\uD804\uDD1C\uD804\uDD2C\uD804\uDD1B\uD804\uDD34', '\uD804\uDD1F\uD804\uDD22\uD804\uDD34\uD804\uDD0C\uD804\uDD27', '\uD804\uDD03\uD804\uDD2C\uD804\uDD1B\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD23\uD804\uDD34', '\uD804\uDD1F\uD804\uDD2C', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD1A\uD804\uDD34', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD23\uD804\uDD2D', '\uD804\uDD03\uD804\uDD09\uD804\uDD27\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD34', '\uD804\uDD25\uD804\uDD2C\uD804\uDD1B\uD804\uDD34\uD804\uDD11\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD03\uD804\uDD27\uD804\uDD07\uD804\uDD34\uD804\uDD11\uD804\uDD2E\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD1A\uD804\uDD27\uD804\uDD1E\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD13\uD804\uDD28\uD804\uDD25\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34'],\n  STANDALONESHORTMONTHS: ['\uD804\uDD0E\uD804\uDD1A\uD804\uDD2A\uD804\uDD20\uD804\uDD22\uD804\uDD28', '\uD804\uDD1C\uD804\uDD2C\uD804\uDD1B\uD804\uDD34\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD2A\uD804\uDD20\uD804\uDD22\uD804\uDD28', '\uD804\uDD1F\uD804\uDD22\uD804\uDD34\uD804\uDD0C\uD804\uDD27', '\uD804\uDD03\uD804\uDD2C\uD804\uDD1B\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD23\uD804\uDD34', '\uD804\uDD1F\uD804\uDD2C', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD1A\uD804\uDD34', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD23\uD804\uDD2D', '\uD804\uDD03\uD804\uDD09\uD804\uDD27\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD34', '\uD804\uDD25\uD804\uDD2C\uD804\uDD1B\uD804\uDD34\uD804\uDD11\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD03\uD804\uDD27\uD804\uDD07\uD804\uDD34\uD804\uDD11\uD804\uDD2E\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD1A\uD804\uDD27\uD804\uDD1E\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD13\uD804\uDD28\uD804\uDD25\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34'],\n  WEEKDAYS: ['\uD804\uDD22\uD804\uDD27\uD804\uDD1D\uD804\uDD28\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD27\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD1F\uD804\uDD27\uD804\uDD01\uD804\uDD09\uD804\uDD27\uD804\uDD23\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD1D\uD804\uDD2A\uD804\uDD16\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD25\uD804\uDD2A\uD804\uDD1B\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD2A\uD804\uDD07\uD804\uDD34\uD804\uDD07\uD804\uDD2E\uD804\uDD22\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD27\uD804\uDD1A\uD804\uDD28\uD804\uDD1D\uD804\uDD22\uD804\uDD34'],\n  STANDALONEWEEKDAYS: ['\uD804\uDD22\uD804\uDD27\uD804\uDD1D\uD804\uDD28\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD27\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD1F\uD804\uDD27\uD804\uDD01\uD804\uDD09\uD804\uDD27\uD804\uDD23\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD1D\uD804\uDD2A\uD804\uDD16\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD25\uD804\uDD2A\uD804\uDD1B\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD2A\uD804\uDD07\uD804\uDD34\uD804\uDD07\uD804\uDD2E\uD804\uDD22\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD27\uD804\uDD1A\uD804\uDD28\uD804\uDD1D\uD804\uDD22\uD804\uDD34'],\n  SHORTWEEKDAYS: ['\uD804\uDD22\uD804\uDD27\uD804\uDD1D\uD804\uDD28', '\uD804\uDD25\uD804\uDD27\uD804\uDD1F\uD804\uDD34', '\uD804\uDD1F\uD804\uDD27\uD804\uDD01\uD804\uDD09\uD804\uDD27\uD804\uDD23\uD804\uDD34', '\uD804\uDD1D\uD804\uDD2A\uD804\uDD16\uD804\uDD34', '\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD25\uD804\uDD2A\uD804\uDD1B\uD804\uDD34', '\uD804\uDD25\uD804\uDD2A\uD804\uDD07\uD804\uDD34\uD804\uDD07\uD804\uDD2E\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD27\uD804\uDD1A\uD804\uDD28'],\n  STANDALONESHORTWEEKDAYS: ['\uD804\uDD22\uD804\uDD27\uD804\uDD1D\uD804\uDD28', '\uD804\uDD25\uD804\uDD27\uD804\uDD1F\uD804\uDD34', '\uD804\uDD1F\uD804\uDD27\uD804\uDD01\uD804\uDD09\uD804\uDD27\uD804\uDD23\uD804\uDD34', '\uD804\uDD1D\uD804\uDD2A\uD804\uDD16\uD804\uDD34', '\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD25\uD804\uDD2A\uD804\uDD1B\uD804\uDD34', '\uD804\uDD25\uD804\uDD2A\uD804\uDD07\uD804\uDD34\uD804\uDD07\uD804\uDD2E\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD27\uD804\uDD1A\uD804\uDD28'],\n  NARROWWEEKDAYS: ['\uD804\uDD22\uD804\uDD27', '\uD804\uDD25\uD804\uDD27', '\uD804\uDD1F\uD804\uDD27', '\uD804\uDD1D\uD804\uDD2A', '\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD28', '\uD804\uDD25\uD804\uDD2A', '\uD804\uDD25\uD804\uDD27'],\n  STANDALONENARROWWEEKDAYS: ['\uD804\uDD22\uD804\uDD27', '\uD804\uDD25\uD804\uDD27', '\uD804\uDD1F\uD804\uDD27', '\uD804\uDD1D\uD804\uDD2A', '\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD28', '\uD804\uDD25\uD804\uDD2A', '\uD804\uDD25\uD804\uDD27'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['\uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0E\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD18\uD804\uDD28 \uD804\uDD1B\uD804\uDD33\uD804\uDD06\uD804\uDD18\uD804\uDD33\uD804\uDD20\uD804\uDD2C \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0E\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34 \uD804\uDD1B\uD804\uDD33\uD804\uDD06\uD804\uDD18\uD804\uDD33\uD804\uDD20\uD804\uDD2C \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0E\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD0C\uD804\uDD33\uD804\uDD06\uD804\uDD2C\uD804\uDD22\uD804\uDD34 \uD804\uDD1B\uD804\uDD33\uD804\uDD06\uD804\uDD18\uD804\uDD33\uD804\uDD20\uD804\uDD2C \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0E\uD804\uDD27\uD804\uDD22\uD804\uDD34'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM, y', 'd MMM, y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ccp_BD.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ccp_BD = goog.i18n.DateTimeSymbols_ccp;\n\n\n/**\n * Date/time formatting symbols for locale ccp_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ccp_IN = {\n  ERAS: ['\uD804\uDD08\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD34\uD804\uDD1B\uD804\uDD2B\uD804\uDD22\uD804\uDD34\uD804\uDD1D\uD804\uDD27', '\uD804\uDD08\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD1B\uD804\uDD34\uD804\uDD18\uD804\uDD27'],\n  ERANAMES: ['\uD804\uDD08\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD34\uD804\uDD1B\uD804\uDD2B\uD804\uDD22\uD804\uDD34\uD804\uDD1D\uD804\uDD27', '\uD804\uDD08\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD1B\uD804\uDD34\uD804\uDD18\uD804\uDD27'],\n  NARROWMONTHS: ['\uD804\uDD0E', '\uD804\uDD1C\uD804\uDD2C', '\uD804\uDD1F', '\uD804\uDD03\uD804\uDD2C', '\uD804\uDD1F\uD804\uDD2C', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD1A\uD804\uDD34', '\uD804\uDD0E\uD804\uDD2A', '\uD804\uDD03', '\uD804\uDD25\uD804\uDD2C', '\uD804\uDD03\uD804\uDD27', '\uD804\uDD1A\uD804\uDD27', '\uD804\uDD13\uD804\uDD28'],\n  STANDALONENARROWMONTHS: ['\uD804\uDD0E', '\uD804\uDD1C\uD804\uDD2C', '\uD804\uDD1F', '\uD804\uDD03\uD804\uDD2C', '\uD804\uDD1F\uD804\uDD2C', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD1A\uD804\uDD34', '\uD804\uDD0E\uD804\uDD2A', '\uD804\uDD03', '\uD804\uDD25\uD804\uDD2C', '\uD804\uDD03\uD804\uDD27', '\uD804\uDD1A\uD804\uDD27', '\uD804\uDD13\uD804\uDD28'],\n  MONTHS: ['\uD804\uDD0E\uD804\uDD1A\uD804\uDD2A\uD804\uDD20\uD804\uDD22\uD804\uDD28', '\uD804\uDD1C\uD804\uDD2C\uD804\uDD1B\uD804\uDD34\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD2A\uD804\uDD20\uD804\uDD22\uD804\uDD28', '\uD804\uDD1F\uD804\uDD22\uD804\uDD34\uD804\uDD0C\uD804\uDD27', '\uD804\uDD03\uD804\uDD2C\uD804\uDD1B\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD23\uD804\uDD34', '\uD804\uDD1F\uD804\uDD2C', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD1A\uD804\uDD34', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD23\uD804\uDD2D', '\uD804\uDD03\uD804\uDD09\uD804\uDD27\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD34', '\uD804\uDD25\uD804\uDD2C\uD804\uDD1B\uD804\uDD34\uD804\uDD11\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD03\uD804\uDD27\uD804\uDD07\uD804\uDD34\uD804\uDD11\uD804\uDD2C\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD1A\uD804\uDD27\uD804\uDD1E\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD13\uD804\uDD28\uD804\uDD25\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34'],\n  STANDALONEMONTHS: ['\uD804\uDD0E\uD804\uDD1A\uD804\uDD2A\uD804\uDD20\uD804\uDD22\uD804\uDD28', '\uD804\uDD1C\uD804\uDD2C\uD804\uDD1B\uD804\uDD34\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD2A\uD804\uDD20\uD804\uDD22\uD804\uDD28', '\uD804\uDD1F\uD804\uDD22\uD804\uDD34\uD804\uDD0C\uD804\uDD27', '\uD804\uDD03\uD804\uDD2C\uD804\uDD1B\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD23\uD804\uDD34', '\uD804\uDD1F\uD804\uDD2C', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD1A\uD804\uDD34', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD23\uD804\uDD2D', '\uD804\uDD03\uD804\uDD09\uD804\uDD27\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD34', '\uD804\uDD25\uD804\uDD2C\uD804\uDD1B\uD804\uDD34\uD804\uDD11\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD03\uD804\uDD27\uD804\uDD07\uD804\uDD34\uD804\uDD11\uD804\uDD2E\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD1A\uD804\uDD27\uD804\uDD1E\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD13\uD804\uDD28\uD804\uDD25\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34'],\n  SHORTMONTHS: ['\uD804\uDD0E\uD804\uDD1A\uD804\uDD2A', '\uD804\uDD1C\uD804\uDD2C\uD804\uDD1B\uD804\uDD34', '\uD804\uDD1F\uD804\uDD22\uD804\uDD34\uD804\uDD0C\uD804\uDD27', '\uD804\uDD03\uD804\uDD2C\uD804\uDD1B\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD23\uD804\uDD34', '\uD804\uDD1F\uD804\uDD2C', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD1A\uD804\uDD34', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD23\uD804\uDD2D', '\uD804\uDD03\uD804\uDD09\uD804\uDD27\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD34', '\uD804\uDD25\uD804\uDD2C\uD804\uDD1B\uD804\uDD34\uD804\uDD11\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD03\uD804\uDD27\uD804\uDD07\uD804\uDD34\uD804\uDD11\uD804\uDD2E\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD1A\uD804\uDD27\uD804\uDD1E\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD13\uD804\uDD28\uD804\uDD25\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34'],\n  STANDALONESHORTMONTHS: ['\uD804\uDD0E\uD804\uDD1A\uD804\uDD2A\uD804\uDD20\uD804\uDD22\uD804\uDD28', '\uD804\uDD1C\uD804\uDD2C\uD804\uDD1B\uD804\uDD34\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD2A\uD804\uDD20\uD804\uDD22\uD804\uDD28', '\uD804\uDD1F\uD804\uDD22\uD804\uDD34\uD804\uDD0C\uD804\uDD27', '\uD804\uDD03\uD804\uDD2C\uD804\uDD1B\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD23\uD804\uDD34', '\uD804\uDD1F\uD804\uDD2C', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD1A\uD804\uDD34', '\uD804\uDD0E\uD804\uDD2A\uD804\uDD23\uD804\uDD2D', '\uD804\uDD03\uD804\uDD09\uD804\uDD27\uD804\uDD0C\uD804\uDD34\uD804\uDD11\uD804\uDD34', '\uD804\uDD25\uD804\uDD2C\uD804\uDD1B\uD804\uDD34\uD804\uDD11\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD03\uD804\uDD27\uD804\uDD07\uD804\uDD34\uD804\uDD11\uD804\uDD2E\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD1A\uD804\uDD27\uD804\uDD1E\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD13\uD804\uDD28\uD804\uDD25\uD804\uDD2C\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD27\uD804\uDD22\uD804\uDD34'],\n  WEEKDAYS: ['\uD804\uDD22\uD804\uDD27\uD804\uDD1D\uD804\uDD28\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD27\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD1F\uD804\uDD27\uD804\uDD01\uD804\uDD09\uD804\uDD27\uD804\uDD23\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD1D\uD804\uDD2A\uD804\uDD16\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD25\uD804\uDD2A\uD804\uDD1B\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD2A\uD804\uDD07\uD804\uDD34\uD804\uDD07\uD804\uDD2E\uD804\uDD22\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD27\uD804\uDD1A\uD804\uDD28\uD804\uDD1D\uD804\uDD22\uD804\uDD34'],\n  STANDALONEWEEKDAYS: ['\uD804\uDD22\uD804\uDD27\uD804\uDD1D\uD804\uDD28\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD27\uD804\uDD1F\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD1F\uD804\uDD27\uD804\uDD01\uD804\uDD09\uD804\uDD27\uD804\uDD23\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD1D\uD804\uDD2A\uD804\uDD16\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD25\uD804\uDD2A\uD804\uDD1B\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD2A\uD804\uDD07\uD804\uDD34\uD804\uDD07\uD804\uDD2E\uD804\uDD22\uD804\uDD34\uD804\uDD1D\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD27\uD804\uDD1A\uD804\uDD28\uD804\uDD1D\uD804\uDD22\uD804\uDD34'],\n  SHORTWEEKDAYS: ['\uD804\uDD22\uD804\uDD27\uD804\uDD1D\uD804\uDD28', '\uD804\uDD25\uD804\uDD27\uD804\uDD1F\uD804\uDD34', '\uD804\uDD1F\uD804\uDD27\uD804\uDD01\uD804\uDD09\uD804\uDD27\uD804\uDD23\uD804\uDD34', '\uD804\uDD1D\uD804\uDD2A\uD804\uDD16\uD804\uDD34', '\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD25\uD804\uDD2A\uD804\uDD1B\uD804\uDD34', '\uD804\uDD25\uD804\uDD2A\uD804\uDD07\uD804\uDD34\uD804\uDD07\uD804\uDD2E\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD27\uD804\uDD1A\uD804\uDD28'],\n  STANDALONESHORTWEEKDAYS: ['\uD804\uDD22\uD804\uDD27\uD804\uDD1D\uD804\uDD28', '\uD804\uDD25\uD804\uDD27\uD804\uDD1F\uD804\uDD34', '\uD804\uDD1F\uD804\uDD27\uD804\uDD01\uD804\uDD09\uD804\uDD27\uD804\uDD23\uD804\uDD34', '\uD804\uDD1D\uD804\uDD2A\uD804\uDD16\uD804\uDD34', '\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD28\uD804\uDD25\uD804\uDD2A\uD804\uDD1B\uD804\uDD34', '\uD804\uDD25\uD804\uDD2A\uD804\uDD07\uD804\uDD34\uD804\uDD07\uD804\uDD2E\uD804\uDD22\uD804\uDD34', '\uD804\uDD25\uD804\uDD27\uD804\uDD1A\uD804\uDD28'],\n  NARROWWEEKDAYS: ['\uD804\uDD22\uD804\uDD27', '\uD804\uDD25\uD804\uDD27', '\uD804\uDD1F\uD804\uDD27', '\uD804\uDD1D\uD804\uDD2A', '\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD28', '\uD804\uDD25\uD804\uDD2A', '\uD804\uDD25\uD804\uDD27'],\n  STANDALONENARROWWEEKDAYS: ['\uD804\uDD22\uD804\uDD27', '\uD804\uDD25\uD804\uDD27', '\uD804\uDD1F\uD804\uDD27', '\uD804\uDD1D\uD804\uDD2A', '\uD804\uDD1D\uD804\uDD33\uD804\uDD22\uD804\uDD28', '\uD804\uDD25\uD804\uDD2A', '\uD804\uDD25\uD804\uDD27'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['\uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0E\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD18\uD804\uDD28 \uD804\uDD1B\uD804\uDD33\uD804\uDD06\uD804\uDD18\uD804\uDD33\uD804\uDD20\uD804\uDD2C \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0E\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34 \uD804\uDD1B\uD804\uDD33\uD804\uDD06\uD804\uDD18\uD804\uDD33\uD804\uDD20\uD804\uDD2C \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0E\uD804\uDD27\uD804\uDD22\uD804\uDD34', '\uD804\uDD0C\uD804\uDD33\uD804\uDD06\uD804\uDD2C\uD804\uDD22\uD804\uDD34 \uD804\uDD1B\uD804\uDD33\uD804\uDD06\uD804\uDD18\uD804\uDD33\uD804\uDD20\uD804\uDD2C \uD804\uDD16\uD804\uDD28\uD804\uDD1A\uD804\uDD34\uD804\uDD1F\uD804\uDD0E\uD804\uDD27\uD804\uDD22\uD804\uDD34'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM, y', 'd MMM, y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ce.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ce = {\n  ERAS: ['в. э. тӀ. я', 'в. э'],\n  ERANAMES: ['Ӏийса пайхамар вина де кхачале', 'Ӏийса пайхамар вина дийнахь дуьйна'],\n  NARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  STANDALONENARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  MONTHS: ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'],\n  STANDALONEMONTHS: ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'],\n  SHORTMONTHS: ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'],\n  STANDALONESHORTMONTHS: ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'],\n  WEEKDAYS: ['кӀира', 'оршот', 'шинара', 'кхаара', 'еара', 'пӀераска', 'шуот'],\n  STANDALONEWEEKDAYS: ['кӀира', 'оршот', 'шинара', 'кхаара', 'еара', 'пӀераска', 'шуот'],\n  SHORTWEEKDAYS: ['кӀи', 'ор', 'ши', 'кха', 'еа', 'пӀе', 'шуо'],\n  STANDALONESHORTWEEKDAYS: ['кӀи', 'ор', 'ши', 'кха', 'еа', 'пӀе', 'шуо'],\n  NARROWWEEKDAYS: ['кӀи', 'ор', 'ши', 'кха', 'еа', 'пӀе', 'шуо'],\n  STANDALONENARROWWEEKDAYS: ['кӀ', 'о', 'ш', 'кх', 'е', 'пӀ', 'ш'],\n  SHORTQUARTERS: ['1-гӀа кв.', '2-гӀа кв.', '3-гӀа кв.', '4-гӀа кв.'],\n  QUARTERS: ['1-гӀа квартал', '2-гӀа квартал', '3-гӀа квартал', '4-гӀа квартал'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale ce_RU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ce_RU = goog.i18n.DateTimeSymbols_ce;\n\n\n/**\n * Date/time formatting symbols for locale ceb.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ceb = {\n  ERAS: ['WK', 'KP'],\n  ERANAMES: ['WK', 'KP'],\n  NARROWMONTHS: ['E', 'P', 'M', 'A', 'M', 'H', 'H', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'P', 'M', 'A', 'M', 'H', 'H', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Enero', 'Pebrero', 'Marso', 'April', 'Mayo', 'Hunyo', 'Hulyo', 'Agosto', 'Setyembre', 'Oktubre', 'Nobyembre', 'Disyembre'],\n  STANDALONEMONTHS: ['Enero', 'Pebrero', 'Marso', 'April', 'Mayo', 'Hunyo', 'Hulyo', 'Agosto', 'Setyembre', 'Oktubre', 'Nobyembre', 'Disyembre'],\n  SHORTMONTHS: ['En', 'Peb', 'Mar', 'Apr', 'May', 'Hun', 'Hul', 'Ag', 'Set', 'Okt', 'Nob', 'Dis'],\n  STANDALONESHORTMONTHS: ['En', 'Peb', 'Mar', 'Apr', 'May', 'Hun', 'Hul', 'Ag', 'Set', 'Okt', 'Nob', 'Dis'],\n  WEEKDAYS: ['Domingo', 'Lunes', 'Martes', 'Miyerkules', 'Huwebes', 'Biyernes', 'Sabado'],\n  STANDALONEWEEKDAYS: ['Domingo', 'Lunes', 'Martes', 'Miyerkules', 'Huwebes', 'Biyernes', 'Sabado'],\n  SHORTWEEKDAYS: ['Dom', 'Lun', 'Mar', 'Mks', 'Hu', 'Bi', 'Sa'],\n  STANDALONESHORTWEEKDAYS: ['Dom', 'Lun', 'Mar', 'Mks', 'Hu', 'Bi', 'Sa'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'H', 'B', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'H', 'B', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Una sa matag-tulo ka bulan', 'Ikaduha sa matag-tulo ka bulan', 'Ikatulo sa matag-tulo ka bulan', 'Ikaupat sa matag-tulo ka bulan'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'sa\\' {0}', '{1} \\'sa\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ceb_PH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ceb_PH = goog.i18n.DateTimeSymbols_ceb;\n\n\n/**\n * Date/time formatting symbols for locale cgg.\n * @const\n */\ngoog.i18n.DateTimeSymbols_cgg = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Kurisito Atakaijire', 'Kurisito Yaijire'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Okwokubanza', 'Okwakabiri', 'Okwakashatu', 'Okwakana', 'Okwakataana', 'Okwamukaaga', 'Okwamushanju', 'Okwamunaana', 'Okwamwenda', 'Okwaikumi', 'Okwaikumi na kumwe', 'Okwaikumi na ibiri'],\n  STANDALONEMONTHS: ['Okwokubanza', 'Okwakabiri', 'Okwakashatu', 'Okwakana', 'Okwakataana', 'Okwamukaaga', 'Okwamushanju', 'Okwamunaana', 'Okwamwenda', 'Okwaikumi', 'Okwaikumi na kumwe', 'Okwaikumi na ibiri'],\n  SHORTMONTHS: ['KBZ', 'KBR', 'KST', 'KKN', 'KTN', 'KMK', 'KMS', 'KMN', 'KMW', 'KKM', 'KNK', 'KNB'],\n  STANDALONESHORTMONTHS: ['KBZ', 'KBR', 'KST', 'KKN', 'KTN', 'KMK', 'KMS', 'KMN', 'KMW', 'KKM', 'KNK', 'KNB'],\n  WEEKDAYS: ['Sande', 'Orwokubanza', 'Orwakabiri', 'Orwakashatu', 'Orwakana', 'Orwakataano', 'Orwamukaaga'],\n  STANDALONEWEEKDAYS: ['Sande', 'Orwokubanza', 'Orwakabiri', 'Orwakashatu', 'Orwakana', 'Orwakataano', 'Orwamukaaga'],\n  SHORTWEEKDAYS: ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'],\n  STANDALONESHORTWEEKDAYS: ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'],\n  NARROWWEEKDAYS: ['S', 'K', 'R', 'S', 'N', 'T', 'M'],\n  STANDALONENARROWWEEKDAYS: ['S', 'K', 'R', 'S', 'N', 'T', 'M'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['KWOTA 1', 'KWOTA 2', 'KWOTA 3', 'KWOTA 4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale cgg_UG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_cgg_UG = goog.i18n.DateTimeSymbols_cgg;\n\n\n/**\n * Date/time formatting symbols for locale chr_US.\n * @const\n */\ngoog.i18n.DateTimeSymbols_chr_US = goog.i18n.DateTimeSymbols_chr;\n\n\n/**\n * Date/time formatting symbols for locale ckb.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ckb = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['پێش زایین', 'زایینی'],\n  ERANAMES: ['پێش زایین', 'زایینی'],\n  NARROWMONTHS: ['ک', 'ش', 'ئ', 'ن', 'ئ', 'ح', 'ت', 'ئ', 'ئ', 'ت', 'ت', 'ک'],\n  STANDALONENARROWMONTHS: ['ک', 'ش', 'ئ', 'ن', 'ئ', 'ح', 'ت', 'ئ', 'ئ', 'ت', 'ت', 'ک'],\n  MONTHS: ['کانوونی دووەم', 'شوبات', 'ئازار', 'نیسان', 'ئایار', 'حوزەیران', 'تەمووز', 'ئاب', 'ئەیلوول', 'تشرینی یەکەم', 'تشرینی دووەم', 'کانونی یەکەم'],\n  STANDALONEMONTHS: ['کانوونی دووەم', 'شوبات', 'ئازار', 'نیسان', 'ئایار', 'حوزەیران', 'تەمووز', 'ئاب', 'ئەیلوول', 'تشرینی یەکەم', 'تشرینی دووەم', 'کانونی یەکەم'],\n  SHORTMONTHS: ['کانوونی دووەم', 'شوبات', 'ئازار', 'نیسان', 'ئایار', 'حوزەیران', 'تەمووز', 'ئاب', 'ئەیلوول', 'تشرینی یەکەم', 'تشرینی دووەم', 'کانونی یەکەم'],\n  STANDALONESHORTMONTHS: ['کانوونی دووەم', 'شوبات', 'ئازار', 'نیسان', 'ئایار', 'حوزەیران', 'تەمووز', 'ئاب', 'ئەیلوول', 'تشرینی یەکەم', 'تشرینی دووەم', 'کانونی یەکەم'],\n  WEEKDAYS: ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'ھەینی', 'شەممە'],\n  STANDALONEWEEKDAYS: ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'ھەینی', 'شەممە'],\n  SHORTWEEKDAYS: ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'ھەینی', 'شەممە'],\n  STANDALONESHORTWEEKDAYS: ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'ھەینی', 'شەممە'],\n  NARROWWEEKDAYS: ['ی', 'د', 'س', 'چ', 'پ', 'ھ', 'ش'],\n  STANDALONENARROWWEEKDAYS: ['ی', 'د', 'س', 'چ', 'پ', 'ھ', 'ش'],\n  SHORTQUARTERS: ['چ١', 'چ٢', 'چ٣', 'چ٤'],\n  QUARTERS: ['چارەکی یەکەم', 'چارەکی دووەم', 'چارەکی سێەم', 'چارەکی چوارەم'],\n  AMPMS: ['ب.ن', 'د.ن'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'dی MMMMی y', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale ckb_IQ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ckb_IQ = goog.i18n.DateTimeSymbols_ckb;\n\n\n/**\n * Date/time formatting symbols for locale ckb_IR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ckb_IR = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['پێش زایین', 'زایینی'],\n  ERANAMES: ['پێش زایین', 'زایینی'],\n  NARROWMONTHS: ['ک', 'ش', 'ئ', 'ن', 'ئ', 'ح', 'ت', 'ئ', 'ئ', 'ت', 'ت', 'ک'],\n  STANDALONENARROWMONTHS: ['ک', 'ش', 'ئ', 'ن', 'ئ', 'ح', 'ت', 'ئ', 'ئ', 'ت', 'ت', 'ک'],\n  MONTHS: ['کانوونی دووەم', 'شوبات', 'ئازار', 'نیسان', 'ئایار', 'حوزەیران', 'تەمووز', 'ئاب', 'ئەیلوول', 'تشرینی یەکەم', 'تشرینی دووەم', 'کانونی یەکەم'],\n  STANDALONEMONTHS: ['کانوونی دووەم', 'شوبات', 'ئازار', 'نیسان', 'ئایار', 'حوزەیران', 'تەمووز', 'ئاب', 'ئەیلوول', 'تشرینی یەکەم', 'تشرینی دووەم', 'کانونی یەکەم'],\n  SHORTMONTHS: ['کانوونی دووەم', 'شوبات', 'ئازار', 'نیسان', 'ئایار', 'حوزەیران', 'تەمووز', 'ئاب', 'ئەیلوول', 'تشرینی یەکەم', 'تشرینی دووەم', 'کانونی یەکەم'],\n  STANDALONESHORTMONTHS: ['کانوونی دووەم', 'شوبات', 'ئازار', 'نیسان', 'ئایار', 'حوزەیران', 'تەمووز', 'ئاب', 'ئەیلوول', 'تشرینی یەکەم', 'تشرینی دووەم', 'کانونی یەکەم'],\n  WEEKDAYS: ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'ھەینی', 'شەممە'],\n  STANDALONEWEEKDAYS: ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'ھەینی', 'شەممە'],\n  SHORTWEEKDAYS: ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'ھەینی', 'شەممە'],\n  STANDALONESHORTWEEKDAYS: ['یەکشەممە', 'دووشەممە', 'سێشەممە', 'چوارشەممە', 'پێنجشەممە', 'ھەینی', 'شەممە'],\n  NARROWWEEKDAYS: ['ی', 'د', 'س', 'چ', 'پ', 'ھ', 'ش'],\n  STANDALONENARROWWEEKDAYS: ['ی', 'د', 'س', 'چ', 'پ', 'ھ', 'ش'],\n  SHORTQUARTERS: ['چ١', 'چ٢', 'چ٣', 'چ٤'],\n  QUARTERS: ['چارەکی یەکەم', 'چارەکی دووەم', 'چارەکی سێەم', 'چارەکی چوارەم'],\n  AMPMS: ['ب.ن', 'د.ن'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'dی MMMMی y', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 4],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale cs_CZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_cs_CZ = goog.i18n.DateTimeSymbols_cs;\n\n\n/**\n * Date/time formatting symbols for locale cy_GB.\n * @const\n */\ngoog.i18n.DateTimeSymbols_cy_GB = goog.i18n.DateTimeSymbols_cy;\n\n\n/**\n * Date/time formatting symbols for locale da_DK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_da_DK = goog.i18n.DateTimeSymbols_da;\n\n\n/**\n * Date/time formatting symbols for locale da_GL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_da_GL = {\n  ERAS: ['f.Kr.', 'e.Kr.'],\n  ERANAMES: ['f.Kr.', 'e.Kr.'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december'],\n  STANDALONEMONTHS: ['januar', 'februar', 'marts', 'april', 'maj', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'december'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan.', 'feb.', 'mar.', 'apr.', 'maj', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],\n  STANDALONEWEEKDAYS: ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],\n  SHORTWEEKDAYS: ['søn.', 'man.', 'tir.', 'ons.', 'tor.', 'fre.', 'lør.'],\n  STANDALONESHORTWEEKDAYS: ['søn', 'man', 'tir', 'ons', 'tor', 'fre', 'lør'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'O', 'T', 'F', 'L'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'O', 'T', 'F', 'L'],\n  SHORTQUARTERS: ['1. kvt.', '2. kvt.', '3. kvt.', '4. kvt.'],\n  QUARTERS: ['1. kvartal', '2. kvartal', '3. kvartal', '4. kvartal'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE \\'den\\' d. MMMM y', 'd. MMMM y', 'd. MMM y', 'dd.MM.y'],\n  TIMEFORMATS: ['HH.mm.ss zzzz', 'HH.mm.ss z', 'HH.mm.ss', 'HH.mm'],\n  DATETIMEFORMATS: ['{1} \\'kl\\'. {0}', '{1} \\'kl\\'. {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale dav.\n * @const\n */\ngoog.i18n.DateTimeSymbols_dav = {\n  ERAS: ['KK', 'BK'],\n  ERANAMES: ['Kabla ya Kristo', 'Baada ya Kristo'],\n  NARROWMONTHS: ['I', 'K', 'K', 'K', 'K', 'K', 'M', 'W', 'I', 'I', 'I', 'I'],\n  STANDALONENARROWMONTHS: ['I', 'K', 'K', 'K', 'K', 'K', 'M', 'W', 'I', 'I', 'I', 'I'],\n  MONTHS: ['Mori ghwa imbiri', 'Mori ghwa kawi', 'Mori ghwa kadadu', 'Mori ghwa kana', 'Mori ghwa kasanu', 'Mori ghwa karandadu', 'Mori ghwa mfungade', 'Mori ghwa wunyanya', 'Mori ghwa ikenda', 'Mori ghwa ikumi', 'Mori ghwa ikumi na imweri', 'Mori ghwa ikumi na iwi'],\n  STANDALONEMONTHS: ['Mori ghwa imbiri', 'Mori ghwa kawi', 'Mori ghwa kadadu', 'Mori ghwa kana', 'Mori ghwa kasanu', 'Mori ghwa karandadu', 'Mori ghwa mfungade', 'Mori ghwa wunyanya', 'Mori ghwa ikenda', 'Mori ghwa ikumi', 'Mori ghwa ikumi na imweri', 'Mori ghwa ikumi na iwi'],\n  SHORTMONTHS: ['Imb', 'Kaw', 'Kad', 'Kan', 'Kas', 'Kar', 'Mfu', 'Wun', 'Ike', 'Iku', 'Imw', 'Iwi'],\n  STANDALONESHORTMONTHS: ['Imb', 'Kaw', 'Kad', 'Kan', 'Kas', 'Kar', 'Mfu', 'Wun', 'Ike', 'Iku', 'Imw', 'Iwi'],\n  WEEKDAYS: ['Ituku ja jumwa', 'Kuramuka jimweri', 'Kuramuka kawi', 'Kuramuka kadadu', 'Kuramuka kana', 'Kuramuka kasanu', 'Kifula nguwo'],\n  STANDALONEWEEKDAYS: ['Ituku ja jumwa', 'Kuramuka jimweri', 'Kuramuka kawi', 'Kuramuka kadadu', 'Kuramuka kana', 'Kuramuka kasanu', 'Kifula nguwo'],\n  SHORTWEEKDAYS: ['Jum', 'Jim', 'Kaw', 'Kad', 'Kan', 'Kas', 'Ngu'],\n  STANDALONESHORTWEEKDAYS: ['Jum', 'Jim', 'Kaw', 'Kad', 'Kan', 'Kas', 'Ngu'],\n  NARROWWEEKDAYS: ['J', 'J', 'K', 'K', 'K', 'K', 'N'],\n  STANDALONENARROWWEEKDAYS: ['J', 'J', 'K', 'K', 'K', 'K', 'N'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['Kimu cha imbiri', 'Kimu cha kawi', 'Kimu cha kadadu', 'Kimu cha kana'],\n  AMPMS: ['Luma lwa K', 'luma lwa p'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale dav_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_dav_KE = goog.i18n.DateTimeSymbols_dav;\n\n\n/**\n * Date/time formatting symbols for locale de_BE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_de_BE = goog.i18n.DateTimeSymbols_de;\n\n\n/**\n * Date/time formatting symbols for locale de_DE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_de_DE = goog.i18n.DateTimeSymbols_de;\n\n\n/**\n * Date/time formatting symbols for locale de_IT.\n * @const\n */\ngoog.i18n.DateTimeSymbols_de_IT = {\n  ERAS: ['v. Chr.', 'n. Chr.'],\n  ERANAMES: ['v. Chr.', 'n. Chr.'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Jänner', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],\n  STANDALONEMONTHS: ['Jänner', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],\n  SHORTMONTHS: ['Jän.', 'Feb.', 'März', 'Apr.', 'Mai', 'Juni', 'Juli', 'Aug.', 'Sep.', 'Okt.', 'Nov.', 'Dez.'],\n  STANDALONESHORTMONTHS: ['Jän', 'Feb', 'Mär', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],\n  WEEKDAYS: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],\n  STANDALONEWEEKDAYS: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],\n  SHORTWEEKDAYS: ['So.', 'Mo.', 'Di.', 'Mi.', 'Do.', 'Fr.', 'Sa.'],\n  STANDALONESHORTWEEKDAYS: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],\n  NARROWWEEKDAYS: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1. Quartal', '2. Quartal', '3. Quartal', '4. Quartal'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d. MMMM y', 'd. MMMM y', 'dd.MM.y', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'um\\' {0}', '{1} \\'um\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale de_LI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_de_LI = goog.i18n.DateTimeSymbols_de;\n\n\n/**\n * Date/time formatting symbols for locale de_LU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_de_LU = goog.i18n.DateTimeSymbols_de;\n\n\n/**\n * Date/time formatting symbols for locale dje.\n * @const\n */\ngoog.i18n.DateTimeSymbols_dje = {\n  ERAS: ['IJ', 'IZ'],\n  ERANAMES: ['Isaa jine', 'Isaa zamanoo'],\n  NARROWMONTHS: ['Ž', 'F', 'M', 'A', 'M', 'Ž', 'Ž', 'U', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['Ž', 'F', 'M', 'A', 'M', 'Ž', 'Ž', 'U', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'],\n  STANDALONEMONTHS: ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'],\n  SHORTMONTHS: ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'],\n  STANDALONESHORTMONTHS: ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'],\n  WEEKDAYS: ['Alhadi', 'Atinni', 'Atalaata', 'Alarba', 'Alhamisi', 'Alzuma', 'Asibti'],\n  STANDALONEWEEKDAYS: ['Alhadi', 'Atinni', 'Atalaata', 'Alarba', 'Alhamisi', 'Alzuma', 'Asibti'],\n  SHORTWEEKDAYS: ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'],\n  STANDALONESHORTWEEKDAYS: ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'],\n  NARROWWEEKDAYS: ['H', 'T', 'T', 'L', 'M', 'Z', 'S'],\n  STANDALONENARROWWEEKDAYS: ['H', 'T', 'T', 'L', 'M', 'Z', 'S'],\n  SHORTQUARTERS: ['A1', 'A2', 'A3', 'A4'],\n  QUARTERS: ['Arrubu 1', 'Arrubu 2', 'Arrubu 3', 'Arrubu 4'],\n  AMPMS: ['Subbaahi', 'Zaarikay b'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale dje_NE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_dje_NE = goog.i18n.DateTimeSymbols_dje;\n\n\n/**\n * Date/time formatting symbols for locale dsb.\n * @const\n */\ngoog.i18n.DateTimeSymbols_dsb = {\n  ERAS: ['pś.Chr.n.', 'pó Chr.n.'],\n  ERANAMES: ['pśed Kristusowym naroźenim', 'pó Kristusowem naroźenju'],\n  NARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  MONTHS: ['januara', 'februara', 'měrca', 'apryla', 'maja', 'junija', 'julija', 'awgusta', 'septembra', 'oktobra', 'nowembra', 'decembra'],\n  STANDALONEMONTHS: ['januar', 'februar', 'měrc', 'apryl', 'maj', 'junij', 'julij', 'awgust', 'september', 'oktober', 'nowember', 'december'],\n  SHORTMONTHS: ['jan.', 'feb.', 'měr.', 'apr.', 'maj.', 'jun.', 'jul.', 'awg.', 'sep.', 'okt.', 'now.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan', 'feb', 'měr', 'apr', 'maj', 'jun', 'jul', 'awg', 'sep', 'okt', 'now', 'dec'],\n  WEEKDAYS: ['njeźela', 'pónjeźele', 'wałtora', 'srjoda', 'stwórtk', 'pětk', 'sobota'],\n  STANDALONEWEEKDAYS: ['njeźela', 'pónjeźele', 'wałtora', 'srjoda', 'stwórtk', 'pětk', 'sobota'],\n  SHORTWEEKDAYS: ['nje', 'pón', 'wał', 'srj', 'stw', 'pět', 'sob'],\n  STANDALONESHORTWEEKDAYS: ['nje', 'pón', 'wał', 'srj', 'stw', 'pět', 'sob'],\n  NARROWWEEKDAYS: ['n', 'p', 'w', 's', 's', 'p', 's'],\n  STANDALONENARROWWEEKDAYS: ['n', 'p', 'w', 's', 's', 'p', 's'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1. kwartal', '2. kwartal', '3. kwartal', '4. kwartal'],\n  AMPMS: ['dopołdnja', 'wótpołdnja'],\n  DATEFORMATS: ['EEEE, d. MMMM y', 'd. MMMM y', 'd.M.y', 'd.M.yy'],\n  TIMEFORMATS: ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale dsb_DE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_dsb_DE = goog.i18n.DateTimeSymbols_dsb;\n\n\n/**\n * Date/time formatting symbols for locale dua.\n * @const\n */\ngoog.i18n.DateTimeSymbols_dua = {\n  ERAS: ['ɓ.Ys', 'mb.Ys'],\n  ERANAMES: ['ɓoso ɓwá yáɓe lá', 'mbúsa kwédi a Yés'],\n  NARROWMONTHS: ['d', 'ŋ', 's', 'd', 'e', 'e', 'm', 'd', 'n', 'm', 't', 'e'],\n  STANDALONENARROWMONTHS: ['d', 'ŋ', 's', 'd', 'e', 'e', 'm', 'd', 'n', 'm', 't', 'e'],\n  MONTHS: ['dimɔ́di', 'ŋgɔndɛ', 'sɔŋɛ', 'diɓáɓá', 'emiasele', 'esɔpɛsɔpɛ', 'madiɓɛ́díɓɛ́', 'diŋgindi', 'nyɛtɛki', 'mayésɛ́', 'tiníní', 'eláŋgɛ́'],\n  STANDALONEMONTHS: ['dimɔ́di', 'ŋgɔndɛ', 'sɔŋɛ', 'diɓáɓá', 'emiasele', 'esɔpɛsɔpɛ', 'madiɓɛ́díɓɛ́', 'diŋgindi', 'nyɛtɛki', 'mayésɛ́', 'tiníní', 'eláŋgɛ́'],\n  SHORTMONTHS: ['di', 'ŋgɔn', 'sɔŋ', 'diɓ', 'emi', 'esɔ', 'mad', 'diŋ', 'nyɛt', 'may', 'tin', 'elá'],\n  STANDALONESHORTMONTHS: ['di', 'ŋgɔn', 'sɔŋ', 'diɓ', 'emi', 'esɔ', 'mad', 'diŋ', 'nyɛt', 'may', 'tin', 'elá'],\n  WEEKDAYS: ['éti', 'mɔ́sú', 'kwasú', 'mukɔ́sú', 'ŋgisú', 'ɗónɛsú', 'esaɓasú'],\n  STANDALONEWEEKDAYS: ['éti', 'mɔ́sú', 'kwasú', 'mukɔ́sú', 'ŋgisú', 'ɗónɛsú', 'esaɓasú'],\n  SHORTWEEKDAYS: ['ét', 'mɔ́s', 'kwa', 'muk', 'ŋgi', 'ɗón', 'esa'],\n  STANDALONESHORTWEEKDAYS: ['ét', 'mɔ́s', 'kwa', 'muk', 'ŋgi', 'ɗón', 'esa'],\n  NARROWWEEKDAYS: ['e', 'm', 'k', 'm', 'ŋ', 'ɗ', 'e'],\n  STANDALONENARROWWEEKDAYS: ['e', 'm', 'k', 'm', 'ŋ', 'ɗ', 'e'],\n  SHORTQUARTERS: ['ndu1', 'ndu2', 'ndu3', 'ndu4'],\n  QUARTERS: ['ndúmbū nyá ɓosó', 'ndúmbū ní lóndɛ́ íɓaá', 'ndúmbū ní lóndɛ́ ílálo', 'ndúmbū ní lóndɛ́ ínɛ́y'],\n  AMPMS: ['idiɓa', 'ebyámu'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale dua_CM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_dua_CM = goog.i18n.DateTimeSymbols_dua;\n\n\n/**\n * Date/time formatting symbols for locale dyo.\n * @const\n */\ngoog.i18n.DateTimeSymbols_dyo = {\n  ERAS: ['ArY', 'AtY'],\n  ERANAMES: ['Ariŋuu Yeesu', 'Atooŋe Yeesu'],\n  NARROWMONTHS: ['S', 'F', 'M', 'A', 'M', 'S', 'S', 'U', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['S', 'F', 'M', 'A', 'M', 'S', 'S', 'U', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Sanvie', 'Fébirie', 'Mars', 'Aburil', 'Mee', 'Sueŋ', 'Súuyee', 'Ut', 'Settembar', 'Oktobar', 'Novembar', 'Disambar'],\n  STANDALONEMONTHS: ['Sanvie', 'Fébirie', 'Mars', 'Aburil', 'Mee', 'Sueŋ', 'Súuyee', 'Ut', 'Settembar', 'Oktobar', 'Novembar', 'Disambar'],\n  SHORTMONTHS: ['Sa', 'Fe', 'Ma', 'Ab', 'Me', 'Su', 'Sú', 'Ut', 'Se', 'Ok', 'No', 'De'],\n  STANDALONESHORTMONTHS: ['Sa', 'Fe', 'Ma', 'Ab', 'Me', 'Su', 'Sú', 'Ut', 'Se', 'Ok', 'No', 'De'],\n  WEEKDAYS: ['Dimas', 'Teneŋ', 'Talata', 'Alarbay', 'Aramisay', 'Arjuma', 'Sibiti'],\n  STANDALONEWEEKDAYS: ['Dimas', 'Teneŋ', 'Talata', 'Alarbay', 'Aramisay', 'Arjuma', 'Sibiti'],\n  SHORTWEEKDAYS: ['Dim', 'Ten', 'Tal', 'Ala', 'Ara', 'Arj', 'Sib'],\n  STANDALONESHORTWEEKDAYS: ['Dim', 'Ten', 'Tal', 'Ala', 'Ara', 'Arj', 'Sib'],\n  NARROWWEEKDAYS: ['D', 'T', 'T', 'A', 'A', 'A', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'T', 'T', 'A', 'A', 'A', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale dyo_SN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_dyo_SN = goog.i18n.DateTimeSymbols_dyo;\n\n\n/**\n * Date/time formatting symbols for locale dz.\n * @const\n */\ngoog.i18n.DateTimeSymbols_dz = {\n  ZERODIGIT: 0x0F20,\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['༡', '༢', '༣', '4', '༥', '༦', '༧', '༨', '9', '༡༠', '༡༡', '༡༢'],\n  STANDALONENARROWMONTHS: ['༡', '༢', '༣', '༤', '༥', '༦', '༧', '༨', '༩', '༡༠', '༡༡', '༡༢'],\n  MONTHS: ['ཟླ་དངཔ་', 'ཟླ་གཉིས་པ་', 'ཟླ་གསུམ་པ་', 'ཟླ་བཞི་པ་', 'ཟླ་ལྔ་པ་', 'ཟླ་དྲུག་པ', 'ཟླ་བདུན་པ་', 'ཟླ་བརྒྱད་པ་', 'ཟླ་དགུ་པ་', 'ཟླ་བཅུ་པ་', 'ཟླ་བཅུ་གཅིག་པ་', 'ཟླ་བཅུ་གཉིས་པ་'],\n  STANDALONEMONTHS: ['སྤྱི་ཟླ་དངཔ་', 'སྤྱི་ཟླ་གཉིས་པ་', 'སྤྱི་ཟླ་གསུམ་པ་', 'སྤྱི་ཟླ་བཞི་པ', 'སྤྱི་ཟླ་ལྔ་པ་', 'སྤྱི་ཟླ་དྲུག་པ', 'སྤྱི་ཟླ་བདུན་པ་', 'སྤྱི་ཟླ་བརྒྱད་པ་', 'སྤྱི་ཟླ་དགུ་པ་', 'སྤྱི་ཟླ་བཅུ་པ་', 'སྤྱི་ཟླ་བཅུ་གཅིག་པ་', 'སྤྱི་ཟླ་བཅུ་གཉིས་པ་'],\n  SHORTMONTHS: ['༡', '༢', '༣', '༤', '༥', '༦', '༧', '༨', '༩', '༡༠', '༡༡', '12'],\n  STANDALONESHORTMONTHS: ['ཟླ་༡', 'ཟླ་༢', 'ཟླ་༣', 'ཟླ་༤', 'ཟླ་༥', 'ཟླ་༦', 'ཟླ་༧', 'ཟླ་༨', 'ཟླ་༩', 'ཟླ་༡༠', 'ཟླ་༡༡', 'ཟླ་༡༢'],\n  WEEKDAYS: ['གཟའ་ཟླ་བ་', 'གཟའ་མིག་དམར་', 'གཟའ་ལྷག་པ་', 'གཟའ་ཕུར་བུ་', 'གཟའ་པ་སངས་', 'གཟའ་སྤེན་པ་', 'གཟའ་ཉི་མ་'],\n  STANDALONEWEEKDAYS: ['གཟའ་ཟླ་བ་', 'གཟའ་མིག་དམར་', 'གཟའ་ལྷག་པ་', 'གཟའ་ཕུར་བུ་', 'གཟའ་པ་སངས་', 'གཟའ་སྤེན་པ་', 'གཟའ་ཉི་མ་'],\n  SHORTWEEKDAYS: ['ཟླ་', 'མིར་', 'ལྷག་', 'ཕུར་', 'སངས་', 'སྤེན་', 'ཉི་'],\n  STANDALONESHORTWEEKDAYS: ['ཟླ་', 'མིར་', 'ལྷག་', 'ཕུར་', 'སངས་', 'སྤེན་', 'ཉི་'],\n  NARROWWEEKDAYS: ['ཟླ', 'མིར', 'ལྷག', 'ཕུར', 'སངྶ', 'སྤེན', 'ཉི'],\n  STANDALONENARROWWEEKDAYS: ['ཟླ', 'མིར', 'ལྷག', 'ཕུར', 'སངྶ', 'སྤེན', 'ཉི'],\n  SHORTQUARTERS: ['བཞི་དཔྱ་༡', 'བཞི་དཔྱ་༢', 'བཞི་དཔྱ་༣', 'བཞི་དཔྱ་༤'],\n  QUARTERS: ['བཞི་དཔྱ་དང་པ་', 'བཞི་དཔྱ་གཉིས་པ་', 'བཞི་དཔྱ་གསུམ་པ་', 'བཞི་དཔྱ་བཞི་པ་'],\n  AMPMS: ['སྔ་ཆ་', 'ཕྱི་ཆ་'],\n  DATEFORMATS: ['EEEE, སྤྱི་ལོ་y MMMM ཚེས་dd', 'སྤྱི་ལོ་y MMMM ཚེས་ dd', 'སྤྱི་ལོ་y ཟླ་MMM ཚེས་dd', 'y-MM-dd'],\n  TIMEFORMATS: ['ཆུ་ཚོད་ h སྐར་མ་ mm:ss a zzzz', 'ཆུ་ཚོད་ h སྐར་མ་ mm:ss a z', 'ཆུ་ཚོད་h:mm:ss a', 'ཆུ་ཚོད་ h སྐར་མ་ mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale dz_BT.\n * @const\n */\ngoog.i18n.DateTimeSymbols_dz_BT = goog.i18n.DateTimeSymbols_dz;\n\n\n/**\n * Date/time formatting symbols for locale ebu.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ebu = {\n  ERAS: ['MK', 'TK'],\n  ERANAMES: ['Mbere ya Kristo', 'Thutha wa Kristo'],\n  NARROWMONTHS: ['M', 'K', 'K', 'K', 'G', 'G', 'M', 'K', 'K', 'I', 'I', 'I'],\n  STANDALONENARROWMONTHS: ['M', 'K', 'K', 'K', 'G', 'G', 'M', 'K', 'K', 'I', 'I', 'I'],\n  MONTHS: ['Mweri wa mbere', 'Mweri wa kaĩri', 'Mweri wa kathatũ', 'Mweri wa kana', 'Mweri wa gatano', 'Mweri wa gatantatũ', 'Mweri wa mũgwanja', 'Mweri wa kanana', 'Mweri wa kenda', 'Mweri wa ikũmi', 'Mweri wa ikũmi na ũmwe', 'Mweri wa ikũmi na Kaĩrĩ'],\n  STANDALONEMONTHS: ['Mweri wa mbere', 'Mweri wa kaĩri', 'Mweri wa kathatũ', 'Mweri wa kana', 'Mweri wa gatano', 'Mweri wa gatantatũ', 'Mweri wa mũgwanja', 'Mweri wa kanana', 'Mweri wa kenda', 'Mweri wa ikũmi', 'Mweri wa ikũmi na ũmwe', 'Mweri wa ikũmi na Kaĩrĩ'],\n  SHORTMONTHS: ['Mbe', 'Kai', 'Kat', 'Kan', 'Gat', 'Gan', 'Mug', 'Knn', 'Ken', 'Iku', 'Imw', 'Igi'],\n  STANDALONESHORTMONTHS: ['Mbe', 'Kai', 'Kat', 'Kan', 'Gat', 'Gan', 'Mug', 'Knn', 'Ken', 'Iku', 'Imw', 'Igi'],\n  WEEKDAYS: ['Kiumia', 'Njumatatu', 'Njumaine', 'Njumatano', 'Aramithi', 'Njumaa', 'NJumamothii'],\n  STANDALONEWEEKDAYS: ['Kiumia', 'Njumatatu', 'Njumaine', 'Njumatano', 'Aramithi', 'Njumaa', 'NJumamothii'],\n  SHORTWEEKDAYS: ['Kma', 'Tat', 'Ine', 'Tan', 'Arm', 'Maa', 'NMM'],\n  STANDALONESHORTWEEKDAYS: ['Kma', 'Tat', 'Ine', 'Tan', 'Arm', 'Maa', 'NMM'],\n  NARROWWEEKDAYS: ['K', 'N', 'N', 'N', 'A', 'M', 'N'],\n  STANDALONENARROWWEEKDAYS: ['K', 'N', 'N', 'N', 'A', 'M', 'N'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['Kuota ya mbere', 'Kuota ya Kaĩrĩ', 'Kuota ya kathatu', 'Kuota ya kana'],\n  AMPMS: ['KI', 'UT'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ebu_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ebu_KE = goog.i18n.DateTimeSymbols_ebu;\n\n\n/**\n * Date/time formatting symbols for locale ee.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ee = {\n  ERAS: ['HYV', 'Yŋ'],\n  ERANAMES: ['Hafi Yesu Va', 'Yesu ŋɔli'],\n  NARROWMONTHS: ['d', 'd', 't', 'a', 'd', 'm', 's', 'd', 'a', 'k', 'a', 'd'],\n  STANDALONENARROWMONTHS: ['d', 'd', 't', 'a', 'd', 'm', 's', 'd', 'a', 'k', 'a', 'd'],\n  MONTHS: ['dzove', 'dzodze', 'tedoxe', 'afɔfĩe', 'dama', 'masa', 'siamlɔm', 'deasiamime', 'anyɔnyɔ', 'kele', 'adeɛmekpɔxe', 'dzome'],\n  STANDALONEMONTHS: ['dzove', 'dzodze', 'tedoxe', 'afɔfĩe', 'dama', 'masa', 'siamlɔm', 'deasiamime', 'anyɔnyɔ', 'kele', 'adeɛmekpɔxe', 'dzome'],\n  SHORTMONTHS: ['dzv', 'dzd', 'ted', 'afɔ', 'dam', 'mas', 'sia', 'dea', 'any', 'kel', 'ade', 'dzm'],\n  STANDALONESHORTMONTHS: ['dzv', 'dzd', 'ted', 'afɔ', 'dam', 'mas', 'sia', 'dea', 'any', 'kel', 'ade', 'dzm'],\n  WEEKDAYS: ['kɔsiɖa', 'dzoɖa', 'blaɖa', 'kuɖa', 'yawoɖa', 'fiɖa', 'memleɖa'],\n  STANDALONEWEEKDAYS: ['kɔsiɖa', 'dzoɖa', 'blaɖa', 'kuɖa', 'yawoɖa', 'fiɖa', 'memleɖa'],\n  SHORTWEEKDAYS: ['kɔs', 'dzo', 'bla', 'kuɖ', 'yaw', 'fiɖ', 'mem'],\n  STANDALONESHORTWEEKDAYS: ['kɔs', 'dzo', 'bla', 'kuɖ', 'yaw', 'fiɖ', 'mem'],\n  NARROWWEEKDAYS: ['k', 'd', 'b', 'k', 'y', 'f', 'm'],\n  STANDALONENARROWWEEKDAYS: ['k', 'd', 'b', 'k', 'y', 'f', 'm'],\n  SHORTQUARTERS: ['k1', 'k2', 'k3', 'k4'],\n  QUARTERS: ['kɔta gbãtɔ', 'kɔta evelia', 'kɔta etɔ̃lia', 'kɔta enelia'],\n  AMPMS: ['ŋdi', 'ɣetrɔ'],\n  DATEFORMATS: ['EEEE, MMMM d \\'lia\\' y', 'MMMM d \\'lia\\' y', 'MMM d \\'lia\\', y', 'M/d/yy'],\n  TIMEFORMATS: ['a \\'ga\\' h:mm:ss zzzz', 'a \\'ga\\' h:mm:ss z', 'a \\'ga\\' h:mm:ss', 'a \\'ga\\' h:mm'],\n  DATETIMEFORMATS: ['{0} {1}', '{0} {1}', '{0} {1}', '{0} {1}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ee_GH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ee_GH = goog.i18n.DateTimeSymbols_ee;\n\n\n/**\n * Date/time formatting symbols for locale ee_TG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ee_TG = {\n  ERAS: ['HYV', 'Yŋ'],\n  ERANAMES: ['Hafi Yesu Va', 'Yesu ŋɔli'],\n  NARROWMONTHS: ['d', 'd', 't', 'a', 'd', 'm', 's', 'd', 'a', 'k', 'a', 'd'],\n  STANDALONENARROWMONTHS: ['d', 'd', 't', 'a', 'd', 'm', 's', 'd', 'a', 'k', 'a', 'd'],\n  MONTHS: ['dzove', 'dzodze', 'tedoxe', 'afɔfĩe', 'dama', 'masa', 'siamlɔm', 'deasiamime', 'anyɔnyɔ', 'kele', 'adeɛmekpɔxe', 'dzome'],\n  STANDALONEMONTHS: ['dzove', 'dzodze', 'tedoxe', 'afɔfĩe', 'dama', 'masa', 'siamlɔm', 'deasiamime', 'anyɔnyɔ', 'kele', 'adeɛmekpɔxe', 'dzome'],\n  SHORTMONTHS: ['dzv', 'dzd', 'ted', 'afɔ', 'dam', 'mas', 'sia', 'dea', 'any', 'kel', 'ade', 'dzm'],\n  STANDALONESHORTMONTHS: ['dzv', 'dzd', 'ted', 'afɔ', 'dam', 'mas', 'sia', 'dea', 'any', 'kel', 'ade', 'dzm'],\n  WEEKDAYS: ['kɔsiɖa', 'dzoɖa', 'blaɖa', 'kuɖa', 'yawoɖa', 'fiɖa', 'memleɖa'],\n  STANDALONEWEEKDAYS: ['kɔsiɖa', 'dzoɖa', 'blaɖa', 'kuɖa', 'yawoɖa', 'fiɖa', 'memleɖa'],\n  SHORTWEEKDAYS: ['kɔs', 'dzo', 'bla', 'kuɖ', 'yaw', 'fiɖ', 'mem'],\n  STANDALONESHORTWEEKDAYS: ['kɔs', 'dzo', 'bla', 'kuɖ', 'yaw', 'fiɖ', 'mem'],\n  NARROWWEEKDAYS: ['k', 'd', 'b', 'k', 'y', 'f', 'm'],\n  STANDALONENARROWWEEKDAYS: ['k', 'd', 'b', 'k', 'y', 'f', 'm'],\n  SHORTQUARTERS: ['k1', 'k2', 'k3', 'k4'],\n  QUARTERS: ['kɔta gbãtɔ', 'kɔta evelia', 'kɔta etɔ̃lia', 'kɔta enelia'],\n  AMPMS: ['ŋdi', 'ɣetrɔ'],\n  DATEFORMATS: ['EEEE, MMMM d \\'lia\\' y', 'MMMM d \\'lia\\' y', 'MMM d \\'lia\\', y', 'M/d/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{0} {1}', '{0} {1}', '{0} {1}', '{0} {1}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale el_CY.\n * @const\n */\ngoog.i18n.DateTimeSymbols_el_CY = {\n  ERAS: ['π.Χ.', 'μ.Χ.'],\n  ERANAMES: ['προ Χριστού', 'μετά Χριστόν'],\n  NARROWMONTHS: ['Ι', 'Φ', 'Μ', 'Α', 'Μ', 'Ι', 'Ι', 'Α', 'Σ', 'Ο', 'Ν', 'Δ'],\n  STANDALONENARROWMONTHS: ['Ι', 'Φ', 'Μ', 'Α', 'Μ', 'Ι', 'Ι', 'Α', 'Σ', 'Ο', 'Ν', 'Δ'],\n  MONTHS: ['Ιανουαρίου', 'Φεβρουαρίου', 'Μαρτίου', 'Απριλίου', 'Μαΐου', 'Ιουνίου', 'Ιουλίου', 'Αυγούστου', 'Σεπτεμβρίου', 'Οκτωβρίου', 'Νοεμβρίου', 'Δεκεμβρίου'],\n  STANDALONEMONTHS: ['Ιανουάριος', 'Φεβρουάριος', 'Μάρτιος', 'Απρίλιος', 'Μάιος', 'Ιούνιος', 'Ιούλιος', 'Αύγουστος', 'Σεπτέμβριος', 'Οκτώβριος', 'Νοέμβριος', 'Δεκέμβριος'],\n  SHORTMONTHS: ['Ιαν', 'Φεβ', 'Μαρ', 'Απρ', 'Μαΐ', 'Ιουν', 'Ιουλ', 'Αυγ', 'Σεπ', 'Οκτ', 'Νοε', 'Δεκ'],\n  STANDALONESHORTMONTHS: ['Ιαν', 'Φεβ', 'Μάρ', 'Απρ', 'Μάι', 'Ιούν', 'Ιούλ', 'Αύγ', 'Σεπ', 'Οκτ', 'Νοέ', 'Δεκ'],\n  WEEKDAYS: ['Κυριακή', 'Δευτέρα', 'Τρίτη', 'Τετάρτη', 'Πέμπτη', 'Παρασκευή', 'Σάββατο'],\n  STANDALONEWEEKDAYS: ['Κυριακή', 'Δευτέρα', 'Τρίτη', 'Τετάρτη', 'Πέμπτη', 'Παρασκευή', 'Σάββατο'],\n  SHORTWEEKDAYS: ['Κυρ', 'Δευ', 'Τρί', 'Τετ', 'Πέμ', 'Παρ', 'Σάβ'],\n  STANDALONESHORTWEEKDAYS: ['Κυρ', 'Δευ', 'Τρί', 'Τετ', 'Πέμ', 'Παρ', 'Σάβ'],\n  NARROWWEEKDAYS: ['Κ', 'Δ', 'Τ', 'Τ', 'Π', 'Π', 'Σ'],\n  STANDALONENARROWWEEKDAYS: ['Κ', 'Δ', 'Τ', 'Τ', 'Π', 'Π', 'Σ'],\n  SHORTQUARTERS: ['Τ1', 'Τ2', 'Τ3', 'Τ4'],\n  QUARTERS: ['1ο τρίμηνο', '2ο τρίμηνο', '3ο τρίμηνο', '4ο τρίμηνο'],\n  AMPMS: ['π.μ.', 'μ.μ.'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} - {0}', '{1} - {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale el_GR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_el_GR = goog.i18n.DateTimeSymbols_el;\n\n\n/**\n * Date/time formatting symbols for locale en_001.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_001 = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_150.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_150 = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_AE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_AE = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale en_AG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_AG = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_AI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_AI = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_AS.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_AS = goog.i18n.DateTimeSymbols_en;\n\n\n/**\n * Date/time formatting symbols for locale en_AT.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_AT = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en_BB.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_BB = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_BE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_BE = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'dd MMM y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en_BI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_BI = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_BM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_BM = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_BS.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_BS = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_BW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_BW = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, dd MMMM y', 'dd MMMM y', 'dd MMM y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_BZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_BZ = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, dd MMMM y', 'dd MMMM y', 'dd-MMM-y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_CC.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_CC = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_CH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_CH = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en_CK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_CK = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_CM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_CM = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_CX.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_CX = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_CY.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_CY = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_DE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_DE = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en_DG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_DG = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_DK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_DK = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH.mm.ss zzzz', 'HH.mm.ss z', 'HH.mm.ss', 'HH.mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en_DM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_DM = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_ER.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_ER = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_FI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_FI = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['H.mm.ss zzzz', 'H.mm.ss z', 'H.mm.ss', 'H.mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en_FJ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_FJ = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en_FK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_FK = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_FM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_FM = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_GD.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_GD = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_GG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_GG = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en_GH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_GH = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_GI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_GI = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en_GM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_GM = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_GU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_GU = goog.i18n.DateTimeSymbols_en;\n\n\n/**\n * Date/time formatting symbols for locale en_GY.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_GY = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_HK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_HK = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_IL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_IL = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_IM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_IM = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en_IO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_IO = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_JE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_JE = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en_JM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_JM = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_KE = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_KI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_KI = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_KN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_KN = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_KY.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_KY = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_LC.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_LC = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_LR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_LR = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_LS.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_LS = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_MG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_MG = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_MH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_MH = goog.i18n.DateTimeSymbols_en;\n\n\n/**\n * Date/time formatting symbols for locale en_MO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_MO = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_MP.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_MP = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_MS.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_MS = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_MT.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_MT = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'dd MMMM y', 'dd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_MU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_MU = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_MW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_MW = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_MY.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_MY = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_NA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_NA = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_NF.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_NF = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_NG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_NG = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_NL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_NL = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en_NR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_NR = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_NU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_NU = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_NZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_NZ = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd/MM/y', 'd/MM/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_PG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_PG = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_PH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_PH = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_PK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_PK = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'dd-MMM-y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_PN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_PN = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_PR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_PR = goog.i18n.DateTimeSymbols_en;\n\n\n/**\n * Date/time formatting symbols for locale en_PW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_PW = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_RW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_RW = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_SB.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_SB = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_SC.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_SC = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_SD.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_SD = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale en_SE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_SE = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale en_SH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_SH = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_SI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_SI = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_SL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_SL = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_SS.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_SS = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_SX.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_SX = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_SZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_SZ = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_TC.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_TC = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_TK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_TK = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_TO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_TO = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_TT.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_TT = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_TV.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_TV = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_TZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_TZ = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_UG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_UG = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_UM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_UM = goog.i18n.DateTimeSymbols_en;\n\n\n/**\n * Date/time formatting symbols for locale en_US_POSIX.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_US_POSIX = goog.i18n.DateTimeSymbols_en;\n\n\n/**\n * Date/time formatting symbols for locale en_VC.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_VC = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_VG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_VG = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_VI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_VI = goog.i18n.DateTimeSymbols_en;\n\n\n/**\n * Date/time formatting symbols for locale en_VU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_VU = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_WS.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_WS = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale en_XA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_XA = {\n  ERAS: ['[ƁÇ one]', '[ÅÐ one]'],\n  ERANAMES: ['[Ɓéƒöŕé Çĥŕîšţ one two]', '[Åññö Ðöɱîñî one two]'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['[Ĵåñûåŕý one]', '[Ƒéƀŕûåŕý one]', '[Ṁåŕçĥ one]', '[Åþŕîļ one]', '[Ṁåý one]', '[Ĵûñé one]', '[Ĵûļý one]', '[Åûĝûšţ one]', '[Šéþţéɱƀéŕ one two]', '[Öçţöƀéŕ one]', '[Ñöṽéɱƀéŕ one]', '[Ðéçéɱƀéŕ one]'],\n  STANDALONEMONTHS: ['[Ĵåñûåŕý one]', '[Ƒéƀŕûåŕý one]', '[Ṁåŕçĥ one]', '[Åþŕîļ one]', '[Ṁåý one]', '[Ĵûñé one]', '[Ĵûļý one]', '[Åûĝûšţ one]', '[Šéþţéɱƀéŕ one two]', '[Öçţöƀéŕ one]', '[Ñöṽéɱƀéŕ one]', '[Ðéçéɱƀéŕ one]'],\n  SHORTMONTHS: ['[Ĵåñ one]', '[Ƒéƀ one]', '[Ṁåŕ one]', '[Åþŕ one]', '[Ṁåý one]', '[Ĵûñ one]', '[Ĵûļ one]', '[Åûĝ one]', '[Šéþ one]', '[Öçţ one]', '[Ñöṽ one]', '[Ðéç one]'],\n  STANDALONESHORTMONTHS: ['[Ĵåñ one]', '[Ƒéƀ one]', '[Ṁåŕ one]', '[Åþŕ one]', '[Ṁåý one]', '[Ĵûñ one]', '[Ĵûļ one]', '[Åûĝ one]', '[Šéþ one]', '[Öçţ one]', '[Ñöṽ one]', '[Ðéç one]'],\n  WEEKDAYS: ['[Šûñðåý one]', '[Ṁöñðåý one]', '[Ţûéšðåý one]', '[Ŵéðñéšðåý one two]', '[Ţĥûŕšðåý one]', '[Ƒŕîðåý one]', '[Šåţûŕðåý one]'],\n  STANDALONEWEEKDAYS: ['[Šûñðåý one]', '[Ṁöñðåý one]', '[Ţûéšðåý one]', '[Ŵéðñéšðåý one two]', '[Ţĥûŕšðåý one]', '[Ƒŕîðåý one]', '[Šåţûŕðåý one]'],\n  SHORTWEEKDAYS: ['[Šûñ one]', '[Ṁöñ one]', '[Ţûé one]', '[Ŵéð one]', '[Ţĥû one]', '[Ƒŕî one]', '[Šåţ one]'],\n  STANDALONESHORTWEEKDAYS: ['[Šûñ one]', '[Ṁöñ one]', '[Ţûé one]', '[Ŵéð one]', '[Ţĥû one]', '[Ƒŕî one]', '[Šåţ one]'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['[Ǫ① one]', '[Ǫ② one]', '[Ǫ③ one]', '[Ǫ④ one]'],\n  QUARTERS: ['[①šţ ǫûåŕţéŕ one two]', '[②ñð ǫûåŕţéŕ one two]', '[③ŕð ǫûåŕţéŕ one two]', '[④ţĥ ǫûåŕţéŕ one two]'],\n  AMPMS: ['[ÅṀ one]', '[ÞṀ one]'],\n  DATEFORMATS: ['[EEEE, MMMM d, y]', '[MMMM d, y]', '[MMM d, y]', '[M/d/yy]'],\n  TIMEFORMATS: ['[h:mm:ss a zzzz]', '[h:mm:ss a z]', '[h:mm:ss a]', '[h:mm a]'],\n  DATETIMEFORMATS: ['[{1} \\'åţ\\' {0} \\'one\\']', '[{1} \\'åţ\\' {0} \\'one\\']', '[{1}, {0}]', '[{1}, {0}]'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_ZM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_ZM = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale en_ZW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_en_ZW = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Before Christ', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  STANDALONEMONTHS: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  STANDALONEWEEKDAYS: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1st quarter', '2nd quarter', '3rd quarter', '4th quarter'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, dd MMMM y', 'dd MMMM y', 'dd MMM,y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'at\\' {0}', '{1} \\'at\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale eo.\n * @const\n */\ngoog.i18n.DateTimeSymbols_eo = {\n  ERAS: ['aK', 'pK'],\n  ERANAMES: ['aK', 'pK'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['januaro', 'februaro', 'marto', 'aprilo', 'majo', 'junio', 'julio', 'aŭgusto', 'septembro', 'oktobro', 'novembro', 'decembro'],\n  STANDALONEMONTHS: ['januaro', 'februaro', 'marto', 'aprilo', 'majo', 'junio', 'julio', 'aŭgusto', 'septembro', 'oktobro', 'novembro', 'decembro'],\n  SHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aŭg', 'sep', 'okt', 'nov', 'dec'],\n  STANDALONESHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aŭg', 'sep', 'okt', 'nov', 'dec'],\n  WEEKDAYS: ['dimanĉo', 'lundo', 'mardo', 'merkredo', 'ĵaŭdo', 'vendredo', 'sabato'],\n  STANDALONEWEEKDAYS: ['dimanĉo', 'lundo', 'mardo', 'merkredo', 'ĵaŭdo', 'vendredo', 'sabato'],\n  SHORTWEEKDAYS: ['di', 'lu', 'ma', 'me', 'ĵa', 've', 'sa'],\n  STANDALONESHORTWEEKDAYS: ['di', 'lu', 'ma', 'me', 'ĵa', 've', 'sa'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['atm', 'ptm'],\n  DATEFORMATS: ['EEEE, d-\\'a\\' \\'de\\' MMMM y', 'y-MMMM-dd', 'y-MMM-dd', 'yy-MM-dd'],\n  TIMEFORMATS: ['H-\\'a\\' \\'horo\\' \\'kaj\\' m:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale eo_001.\n * @const\n */\ngoog.i18n.DateTimeSymbols_eo_001 = goog.i18n.DateTimeSymbols_eo;\n\n\n/**\n * Date/time formatting symbols for locale es_AR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_AR = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.er trimestre', '2.º trimestre', '3.er trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es_BO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_BO = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM \\'de\\' y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale es_BR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_BR = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es_BZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_BZ = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es_CL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_CL = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'dd-MM-y', 'dd-MM-yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale es_CO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_CO = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd/MM/y', 'd/MM/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es_CR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_CR = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale es_CU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_CU = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale es_DO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_DO = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es_EA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_EA = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.er trimestre', '2.º trimestre', '3.er trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['H:mm:ss (zzzz)', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale es_EC.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_EC = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale es_GQ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_GQ = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.er trimestre', '2.º trimestre', '3.er trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['H:mm:ss (zzzz)', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale es_GT.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_GT = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd/MM/y', 'd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es_HN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_HN = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE dd \\'de\\' MMMM \\'de\\' y', 'dd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es_IC.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_IC = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.er trimestre', '2.º trimestre', '3.er trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['H:mm:ss (zzzz)', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale es_NI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_NI = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es_PA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_PA = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er. trimestre', '2do. trimestre', '3er. trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'MM/dd/y', 'MM/dd/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es_PE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_PE = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'setiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Setiembre', 'Octubre', 'Noviembre', 'Diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'set.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['Ene.', 'Feb.', 'Mar.', 'Abr.', 'May.', 'Jun.', 'Jul.', 'Ago.', 'Set.', 'Oct.', 'Nov.', 'Dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es_PH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_PH = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.er trimestre', '2.º trimestre', '3.er trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es_PR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_PR = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'MM/dd/y', 'MM/dd/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es_PY.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_PY = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es_SV.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_SV = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sep.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale es_UY.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_UY = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'setiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Setiembre', 'Octubre', 'Noviembre', 'Diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'set.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['Ene.', 'Feb.', 'Mar.', 'Abr.', 'May.', 'Jun.', 'Jul.', 'Ago.', 'Set.', 'Oct.', 'Nov.', 'Dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale es_VE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_es_VE = {\n  ERAS: ['a. C.', 'd. C.'],\n  ERANAMES: ['antes de Cristo', 'después de Cristo'],\n  NARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['E', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  STANDALONEMONTHS: ['enero', 'febrero', 'marzo', 'abril', 'mayo', 'junio', 'julio', 'agosto', 'septiembre', 'octubre', 'noviembre', 'diciembre'],\n  SHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  STANDALONESHORTMONTHS: ['ene.', 'feb.', 'mar.', 'abr.', 'may.', 'jun.', 'jul.', 'ago.', 'sept.', 'oct.', 'nov.', 'dic.'],\n  WEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'lunes', 'martes', 'miércoles', 'jueves', 'viernes', 'sábado'],\n  SHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  STANDALONESHORTWEEKDAYS: ['dom.', 'lun.', 'mar.', 'mié.', 'jue.', 'vie.', 'sáb.'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2do trimestre', '3er trimestre', '4to trimestre'],\n  AMPMS: ['a. m.', 'p. m.'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale et_EE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_et_EE = goog.i18n.DateTimeSymbols_et;\n\n\n/**\n * Date/time formatting symbols for locale eu_ES.\n * @const\n */\ngoog.i18n.DateTimeSymbols_eu_ES = goog.i18n.DateTimeSymbols_eu;\n\n\n/**\n * Date/time formatting symbols for locale ewo.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ewo = {\n  ERAS: ['oyk', 'ayk'],\n  ERANAMES: ['osúsúa Yésus kiri', 'ámvus Yésus Kirís'],\n  NARROWMONTHS: ['o', 'b', 'l', 'n', 't', 's', 'z', 'm', 'e', 'a', 'd', 'b'],\n  STANDALONENARROWMONTHS: ['o', 'b', 'l', 'n', 't', 's', 'z', 'm', 'e', 'a', 'd', 'b'],\n  MONTHS: ['ngɔn osú', 'ngɔn bɛ̌', 'ngɔn lála', 'ngɔn nyina', 'ngɔn tána', 'ngɔn saməna', 'ngɔn zamgbála', 'ngɔn mwom', 'ngɔn ebulú', 'ngɔn awóm', 'ngɔn awóm ai dziá', 'ngɔn awóm ai bɛ̌'],\n  STANDALONEMONTHS: ['ngɔn osú', 'ngɔn bɛ̌', 'ngɔn lála', 'ngɔn nyina', 'ngɔn tána', 'ngɔn saməna', 'ngɔn zamgbála', 'ngɔn mwom', 'ngɔn ebulú', 'ngɔn awóm', 'ngɔn awóm ai dziá', 'ngɔn awóm ai bɛ̌'],\n  SHORTMONTHS: ['ngo', 'ngb', 'ngl', 'ngn', 'ngt', 'ngs', 'ngz', 'ngm', 'nge', 'nga', 'ngad', 'ngab'],\n  STANDALONESHORTMONTHS: ['ngo', 'ngb', 'ngl', 'ngn', 'ngt', 'ngs', 'ngz', 'ngm', 'nge', 'nga', 'ngad', 'ngab'],\n  WEEKDAYS: ['sɔ́ndɔ', 'mɔ́ndi', 'sɔ́ndɔ məlú mə́bɛ̌', 'sɔ́ndɔ məlú mə́lɛ́', 'sɔ́ndɔ məlú mə́nyi', 'fúladé', 'séradé'],\n  STANDALONEWEEKDAYS: ['sɔ́ndɔ', 'mɔ́ndi', 'sɔ́ndɔ məlú mə́bɛ̌', 'sɔ́ndɔ məlú mə́lɛ́', 'sɔ́ndɔ məlú mə́nyi', 'fúladé', 'séradé'],\n  SHORTWEEKDAYS: ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'fúl', 'sér'],\n  STANDALONESHORTWEEKDAYS: ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'fúl', 'sér'],\n  NARROWWEEKDAYS: ['s', 'm', 's', 's', 's', 'f', 's'],\n  STANDALONENARROWWEEKDAYS: ['s', 'm', 's', 's', 's', 'f', 's'],\n  SHORTQUARTERS: ['nno', 'nnb', 'nnl', 'nnny'],\n  QUARTERS: ['nsámbá ngɔn asú', 'nsámbá ngɔn bɛ̌', 'nsámbá ngɔn lála', 'nsámbá ngɔn nyina'],\n  AMPMS: ['kíkíríg', 'ngəgógəle'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ewo_CM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ewo_CM = goog.i18n.DateTimeSymbols_ewo;\n\n\n/**\n * Date/time formatting symbols for locale fa_AF.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fa_AF = {\n  ZERODIGIT: 0x06F0,\n  ERAS: ['ق.م.', 'م.'],\n  ERANAMES: ['قبل از میلاد', 'میلادی'],\n  NARROWMONTHS: ['ج', 'ف', 'م', 'ا', 'م', 'ج', 'ج', 'ا', 'س', 'ا', 'ن', 'د'],\n  STANDALONENARROWMONTHS: ['ج', 'ف', 'م', 'ا', 'م', 'ج', 'ج', 'ا', 'س', 'ا', 'ن', 'د'],\n  MONTHS: ['جنوری', 'فبروری', 'مارچ', 'اپریل', 'می', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  STANDALONEMONTHS: ['جنوری', 'فبروری', 'مارچ', 'اپریل', 'می', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  SHORTMONTHS: ['جنو', 'فبروری', 'مارچ', 'اپریل', 'می', 'جون', 'جول', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسم'],\n  STANDALONESHORTMONTHS: ['جنوری', 'فبروری', 'مارچ', 'اپریل', 'می', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  WEEKDAYS: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  STANDALONEWEEKDAYS: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  SHORTWEEKDAYS: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  STANDALONESHORTWEEKDAYS: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  NARROWWEEKDAYS: ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],\n  STANDALONENARROWWEEKDAYS: ['ی', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],\n  SHORTQUARTERS: ['ر۱', 'ر۲', 'ر۳', 'ر۴'],\n  QUARTERS: ['ربع اول', 'ربع دوم', 'ربع سوم', 'ربع چهارم'],\n  AMPMS: ['قبل‌ازظهر', 'بعدازظهر'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'y/M/d'],\n  TIMEFORMATS: ['H:mm:ss (zzzz)', 'H:mm:ss (z)', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1}، ساعت {0}', '{1}، ساعت {0}', '{1}،‏ {0}', '{1}،‏ {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [3, 4],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale fa_IR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fa_IR = goog.i18n.DateTimeSymbols_fa;\n\n\n/**\n * Date/time formatting symbols for locale ff.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ff = {\n  ERAS: ['H-I', 'C-I'],\n  ERANAMES: ['Hade Iisa', 'Caggal Iisa'],\n  NARROWMONTHS: ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],\n  STANDALONENARROWMONTHS: ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],\n  MONTHS: ['siilo', 'colte', 'mbooy', 'seeɗto', 'duujal', 'korse', 'morso', 'juko', 'siilto', 'yarkomaa', 'jolal', 'bowte'],\n  STANDALONEMONTHS: ['siilo', 'colte', 'mbooy', 'seeɗto', 'duujal', 'korse', 'morso', 'juko', 'siilto', 'yarkomaa', 'jolal', 'bowte'],\n  SHORTMONTHS: ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],\n  STANDALONESHORTMONTHS: ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],\n  WEEKDAYS: ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],\n  STANDALONEWEEKDAYS: ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],\n  SHORTWEEKDAYS: ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n  STANDALONESHORTWEEKDAYS: ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n  NARROWWEEKDAYS: ['d', 'a', 'm', 'n', 'n', 'm', 'h'],\n  STANDALONENARROWWEEKDAYS: ['d', 'a', 'm', 'n', 'n', 'm', 'h'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['Termes 1', 'Termes 2', 'Termes 3', 'Termes 4'],\n  AMPMS: ['subaka', 'kikiiɗe'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ff_Latn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ff_Latn = goog.i18n.DateTimeSymbols_ff;\n\n\n/**\n * Date/time formatting symbols for locale ff_Latn_BF.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ff_Latn_BF = goog.i18n.DateTimeSymbols_ff;\n\n\n/**\n * Date/time formatting symbols for locale ff_Latn_CM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ff_Latn_CM = goog.i18n.DateTimeSymbols_ff;\n\n\n/**\n * Date/time formatting symbols for locale ff_Latn_GH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ff_Latn_GH = {\n  ERAS: ['H-I', 'C-I'],\n  ERANAMES: ['Hade Iisa', 'Caggal Iisa'],\n  NARROWMONTHS: ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],\n  STANDALONENARROWMONTHS: ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],\n  MONTHS: ['siilo', 'colte', 'mbooy', 'seeɗto', 'duujal', 'korse', 'morso', 'juko', 'siilto', 'yarkomaa', 'jolal', 'bowte'],\n  STANDALONEMONTHS: ['siilo', 'colte', 'mbooy', 'seeɗto', 'duujal', 'korse', 'morso', 'juko', 'siilto', 'yarkomaa', 'jolal', 'bowte'],\n  SHORTMONTHS: ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],\n  STANDALONESHORTMONTHS: ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],\n  WEEKDAYS: ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],\n  STANDALONEWEEKDAYS: ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],\n  SHORTWEEKDAYS: ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n  STANDALONESHORTWEEKDAYS: ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n  NARROWWEEKDAYS: ['d', 'a', 'm', 'n', 'n', 'm', 'h'],\n  STANDALONENARROWWEEKDAYS: ['d', 'a', 'm', 'n', 'n', 'm', 'h'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['Termes 1', 'Termes 2', 'Termes 3', 'Termes 4'],\n  AMPMS: ['subaka', 'kikiiɗe'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ff_Latn_GM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ff_Latn_GM = {\n  ERAS: ['H-I', 'C-I'],\n  ERANAMES: ['Hade Iisa', 'Caggal Iisa'],\n  NARROWMONTHS: ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],\n  STANDALONENARROWMONTHS: ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],\n  MONTHS: ['siilo', 'colte', 'mbooy', 'seeɗto', 'duujal', 'korse', 'morso', 'juko', 'siilto', 'yarkomaa', 'jolal', 'bowte'],\n  STANDALONEMONTHS: ['siilo', 'colte', 'mbooy', 'seeɗto', 'duujal', 'korse', 'morso', 'juko', 'siilto', 'yarkomaa', 'jolal', 'bowte'],\n  SHORTMONTHS: ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],\n  STANDALONESHORTMONTHS: ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],\n  WEEKDAYS: ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],\n  STANDALONEWEEKDAYS: ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],\n  SHORTWEEKDAYS: ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n  STANDALONESHORTWEEKDAYS: ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n  NARROWWEEKDAYS: ['d', 'a', 'm', 'n', 'n', 'm', 'h'],\n  STANDALONENARROWWEEKDAYS: ['d', 'a', 'm', 'n', 'n', 'm', 'h'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['Termes 1', 'Termes 2', 'Termes 3', 'Termes 4'],\n  AMPMS: ['subaka', 'kikiiɗe'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ff_Latn_GN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ff_Latn_GN = goog.i18n.DateTimeSymbols_ff;\n\n\n/**\n * Date/time formatting symbols for locale ff_Latn_GW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ff_Latn_GW = goog.i18n.DateTimeSymbols_ff;\n\n\n/**\n * Date/time formatting symbols for locale ff_Latn_LR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ff_Latn_LR = {\n  ERAS: ['H-I', 'C-I'],\n  ERANAMES: ['Hade Iisa', 'Caggal Iisa'],\n  NARROWMONTHS: ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],\n  STANDALONENARROWMONTHS: ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],\n  MONTHS: ['siilo', 'colte', 'mbooy', 'seeɗto', 'duujal', 'korse', 'morso', 'juko', 'siilto', 'yarkomaa', 'jolal', 'bowte'],\n  STANDALONEMONTHS: ['siilo', 'colte', 'mbooy', 'seeɗto', 'duujal', 'korse', 'morso', 'juko', 'siilto', 'yarkomaa', 'jolal', 'bowte'],\n  SHORTMONTHS: ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],\n  STANDALONESHORTMONTHS: ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],\n  WEEKDAYS: ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],\n  STANDALONEWEEKDAYS: ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],\n  SHORTWEEKDAYS: ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n  STANDALONESHORTWEEKDAYS: ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n  NARROWWEEKDAYS: ['d', 'a', 'm', 'n', 'n', 'm', 'h'],\n  STANDALONENARROWWEEKDAYS: ['d', 'a', 'm', 'n', 'n', 'm', 'h'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['Termes 1', 'Termes 2', 'Termes 3', 'Termes 4'],\n  AMPMS: ['subaka', 'kikiiɗe'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ff_Latn_MR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ff_Latn_MR = {\n  ERAS: ['H-I', 'C-I'],\n  ERANAMES: ['Hade Iisa', 'Caggal Iisa'],\n  NARROWMONTHS: ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],\n  STANDALONENARROWMONTHS: ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],\n  MONTHS: ['siilo', 'colte', 'mbooy', 'seeɗto', 'duujal', 'korse', 'morso', 'juko', 'siilto', 'yarkomaa', 'jolal', 'bowte'],\n  STANDALONEMONTHS: ['siilo', 'colte', 'mbooy', 'seeɗto', 'duujal', 'korse', 'morso', 'juko', 'siilto', 'yarkomaa', 'jolal', 'bowte'],\n  SHORTMONTHS: ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],\n  STANDALONESHORTMONTHS: ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],\n  WEEKDAYS: ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],\n  STANDALONEWEEKDAYS: ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],\n  SHORTWEEKDAYS: ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n  STANDALONESHORTWEEKDAYS: ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n  NARROWWEEKDAYS: ['d', 'a', 'm', 'n', 'n', 'm', 'h'],\n  STANDALONENARROWWEEKDAYS: ['d', 'a', 'm', 'n', 'n', 'm', 'h'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['Termes 1', 'Termes 2', 'Termes 3', 'Termes 4'],\n  AMPMS: ['subaka', 'kikiiɗe'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ff_Latn_NE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ff_Latn_NE = goog.i18n.DateTimeSymbols_ff;\n\n\n/**\n * Date/time formatting symbols for locale ff_Latn_NG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ff_Latn_NG = goog.i18n.DateTimeSymbols_ff;\n\n\n/**\n * Date/time formatting symbols for locale ff_Latn_SL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ff_Latn_SL = {\n  ERAS: ['H-I', 'C-I'],\n  ERANAMES: ['Hade Iisa', 'Caggal Iisa'],\n  NARROWMONTHS: ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],\n  STANDALONENARROWMONTHS: ['s', 'c', 'm', 's', 'd', 'k', 'm', 'j', 's', 'y', 'j', 'b'],\n  MONTHS: ['siilo', 'colte', 'mbooy', 'seeɗto', 'duujal', 'korse', 'morso', 'juko', 'siilto', 'yarkomaa', 'jolal', 'bowte'],\n  STANDALONEMONTHS: ['siilo', 'colte', 'mbooy', 'seeɗto', 'duujal', 'korse', 'morso', 'juko', 'siilto', 'yarkomaa', 'jolal', 'bowte'],\n  SHORTMONTHS: ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],\n  STANDALONESHORTMONTHS: ['sii', 'col', 'mbo', 'see', 'duu', 'kor', 'mor', 'juk', 'slt', 'yar', 'jol', 'bow'],\n  WEEKDAYS: ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],\n  STANDALONEWEEKDAYS: ['dewo', 'aaɓnde', 'mawbaare', 'njeslaare', 'naasaande', 'mawnde', 'hoore-biir'],\n  SHORTWEEKDAYS: ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n  STANDALONESHORTWEEKDAYS: ['dew', 'aaɓ', 'maw', 'nje', 'naa', 'mwd', 'hbi'],\n  NARROWWEEKDAYS: ['d', 'a', 'm', 'n', 'n', 'm', 'h'],\n  STANDALONENARROWWEEKDAYS: ['d', 'a', 'm', 'n', 'n', 'm', 'h'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['Termes 1', 'Termes 2', 'Termes 3', 'Termes 4'],\n  AMPMS: ['subaka', 'kikiiɗe'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ff_Latn_SN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ff_Latn_SN = goog.i18n.DateTimeSymbols_ff;\n\n\n/**\n * Date/time formatting symbols for locale fi_FI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fi_FI = goog.i18n.DateTimeSymbols_fi;\n\n\n/**\n * Date/time formatting symbols for locale fil_PH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fil_PH = goog.i18n.DateTimeSymbols_fil;\n\n\n/**\n * Date/time formatting symbols for locale fo.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fo = {\n  ERAS: ['f.Kr.', 'e.Kr.'],\n  ERANAMES: ['fyri Krist', 'eftir Krist'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['januar', 'februar', 'mars', 'apríl', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'],\n  STANDALONEMONTHS: ['januar', 'februar', 'mars', 'apríl', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mar.', 'apr.', 'mai', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'des.'],\n  STANDALONESHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'],\n  WEEKDAYS: ['sunnudagur', 'mánadagur', 'týsdagur', 'mikudagur', 'hósdagur', 'fríggjadagur', 'leygardagur'],\n  STANDALONEWEEKDAYS: ['sunnudagur', 'mánadagur', 'týsdagur', 'mikudagur', 'hósdagur', 'fríggjadagur', 'leygardagur'],\n  SHORTWEEKDAYS: ['sun.', 'mán.', 'týs.', 'mik.', 'hós.', 'frí.', 'ley.'],\n  STANDALONESHORTWEEKDAYS: ['sun', 'mán', 'týs', 'mik', 'hós', 'frí', 'ley'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'M', 'H', 'F', 'L'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'M', 'H', 'F', 'L'],\n  SHORTQUARTERS: ['1. ársfj.', '2. ársfj.', '3. ársfj.', '4. ársfj.'],\n  QUARTERS: ['1. ársfjórðingur', '2. ársfjórðingur', '3. ársfjórðingur', '4. ársfjórðingur'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d. MMMM y', 'd. MMMM y', 'dd.MM.y', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'kl\\'. {0}', '{1} \\'kl\\'. {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale fo_DK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fo_DK = goog.i18n.DateTimeSymbols_fo;\n\n\n/**\n * Date/time formatting symbols for locale fo_FO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fo_FO = goog.i18n.DateTimeSymbols_fo;\n\n\n/**\n * Date/time formatting symbols for locale fr_BE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_BE = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/MM/yy'],\n  TIMEFORMATS: ['H \\'h\\' mm \\'min\\' ss \\'s\\' zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_BF.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_BF = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_BI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_BI = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_BJ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_BJ = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_BL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_BL = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_CD.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_CD = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_CF.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_CF = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_CG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_CG = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_CH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_CH = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH.mm:ss \\'h\\' zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_CI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_CI = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_CM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_CM = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['matin', 'soir'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_DJ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_DJ = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_DZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_DZ = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_FR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_FR = goog.i18n.DateTimeSymbols_fr;\n\n\n/**\n * Date/time formatting symbols for locale fr_GA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_GA = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_GF.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_GF = goog.i18n.DateTimeSymbols_fr;\n\n\n/**\n * Date/time formatting symbols for locale fr_GN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_GN = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_GP.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_GP = goog.i18n.DateTimeSymbols_fr;\n\n\n/**\n * Date/time formatting symbols for locale fr_GQ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_GQ = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_HT.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_HT = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_KM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_KM = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_LU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_LU = goog.i18n.DateTimeSymbols_fr;\n\n\n/**\n * Date/time formatting symbols for locale fr_MA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_MA = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['jan.', 'fév.', 'mar.', 'avr.', 'mai', 'jui.', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['jan.', 'fév.', 'mar.', 'avr.', 'mai', 'jui.', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_MC.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_MC = goog.i18n.DateTimeSymbols_fr;\n\n\n/**\n * Date/time formatting symbols for locale fr_MF.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_MF = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_MG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_MG = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_ML.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_ML = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['le 1er trimestre', 'le 2ème trimestre', 'le 3ème trimestre', 'le 4ème trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_MQ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_MQ = goog.i18n.DateTimeSymbols_fr;\n\n\n/**\n * Date/time formatting symbols for locale fr_MR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_MR = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_MU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_MU = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_NC.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_NC = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_NE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_NE = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_PF.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_PF = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_PM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_PM = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_RE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_RE = goog.i18n.DateTimeSymbols_fr;\n\n\n/**\n * Date/time formatting symbols for locale fr_RW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_RW = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_SC.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_SC = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_SN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_SN = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_SY.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_SY = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_TD.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_TD = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_TG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_TG = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_TN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_TN = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_VU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_VU = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_WF.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_WF = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fr_YT.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fr_YT = {\n  ERAS: ['av. J.-C.', 'ap. J.-C.'],\n  ERANAMES: ['avant Jésus-Christ', 'après Jésus-Christ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  STANDALONEMONTHS: ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],\n  SHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  STANDALONESHORTMONTHS: ['janv.', 'févr.', 'mars', 'avr.', 'mai', 'juin', 'juil.', 'août', 'sept.', 'oct.', 'nov.', 'déc.'],\n  WEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  STANDALONEWEEKDAYS: ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],\n  SHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  STANDALONESHORTWEEKDAYS: ['dim.', 'lun.', 'mar.', 'mer.', 'jeu.', 'ven.', 'sam.'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1er trimestre', '2e trimestre', '3e trimestre', '4e trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} \\'à\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale fur.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fur = {\n  ERAS: ['pdC', 'ddC'],\n  ERANAMES: ['pdC', 'ddC'],\n  NARROWMONTHS: ['Z', 'F', 'M', 'A', 'M', 'J', 'L', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['Z', 'F', 'M', 'A', 'M', 'J', 'L', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Zenâr', 'Fevrâr', 'Març', 'Avrîl', 'Mai', 'Jugn', 'Lui', 'Avost', 'Setembar', 'Otubar', 'Novembar', 'Dicembar'],\n  STANDALONEMONTHS: ['Zenâr', 'Fevrâr', 'Març', 'Avrîl', 'Mai', 'Jugn', 'Lui', 'Avost', 'Setembar', 'Otubar', 'Novembar', 'Dicembar'],\n  SHORTMONTHS: ['Zen', 'Fev', 'Mar', 'Avr', 'Mai', 'Jug', 'Lui', 'Avo', 'Set', 'Otu', 'Nov', 'Dic'],\n  STANDALONESHORTMONTHS: ['Zen', 'Fev', 'Mar', 'Avr', 'Mai', 'Jug', 'Lui', 'Avo', 'Set', 'Otu', 'Nov', 'Dic'],\n  WEEKDAYS: ['domenie', 'lunis', 'martars', 'miercus', 'joibe', 'vinars', 'sabide'],\n  STANDALONEWEEKDAYS: ['domenie', 'lunis', 'martars', 'miercus', 'joibe', 'vinars', 'sabide'],\n  SHORTWEEKDAYS: ['dom', 'lun', 'mar', 'mie', 'joi', 'vin', 'sab'],\n  STANDALONESHORTWEEKDAYS: ['dom', 'lun', 'mar', 'mie', 'joi', 'vin', 'sab'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['Prin trimestri', 'Secont trimestri', 'Tierç trimestri', 'Cuart trimestri'],\n  AMPMS: ['a.', 'p.'],\n  DATEFORMATS: ['EEEE d \\'di\\' MMMM \\'dal\\' y', 'd \\'di\\' MMMM \\'dal\\' y', 'dd/MM/y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale fur_IT.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fur_IT = goog.i18n.DateTimeSymbols_fur;\n\n\n/**\n * Date/time formatting symbols for locale fy.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fy = {\n  ERAS: ['f.Kr.', 'n.Kr.'],\n  ERANAMES: ['Foar Kristus', 'nei Kristus'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Jannewaris', 'Febrewaris', 'Maart', 'April', 'Maaie', 'Juny', 'July', 'Augustus', 'Septimber', 'Oktober', 'Novimber', 'Desimber'],\n  STANDALONEMONTHS: ['Jannewaris', 'Febrewaris', 'Maart', 'April', 'Maaie', 'Juny', 'July', 'Augustus', 'Septimber', 'Oktober', 'Novimber', 'Desimber'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mrt', 'Apr', 'Mai', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Des'],\n  WEEKDAYS: ['snein', 'moandei', 'tiisdei', 'woansdei', 'tongersdei', 'freed', 'sneon'],\n  STANDALONEWEEKDAYS: ['snein', 'moandei', 'tiisdei', 'woansdei', 'tongersdei', 'freed', 'sneon'],\n  SHORTWEEKDAYS: ['si', 'mo', 'ti', 'wo', 'to', 'fr', 'so'],\n  STANDALONESHORTWEEKDAYS: ['si', 'mo', 'ti', 'wo', 'to', 'fr', 'so'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1e fearnsjier', '2e fearnsjier', '3e fearnsjier', '4e fearnsjier'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd-MM-yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'om\\' {0}', '{1} \\'om\\' {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale fy_NL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_fy_NL = goog.i18n.DateTimeSymbols_fy;\n\n\n/**\n * Date/time formatting symbols for locale ga_IE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ga_IE = goog.i18n.DateTimeSymbols_ga;\n\n\n/**\n * Date/time formatting symbols for locale gd.\n * @const\n */\ngoog.i18n.DateTimeSymbols_gd = {\n  ERAS: ['RC', 'AD'],\n  ERANAMES: ['Ro Chrìosta', 'An dèidh Chrìosta'],\n  NARROWMONTHS: ['F', 'G', 'M', 'G', 'C', 'Ò', 'I', 'L', 'S', 'D', 'S', 'D'],\n  STANDALONENARROWMONTHS: ['F', 'G', 'M', 'G', 'C', 'Ò', 'I', 'L', 'S', 'D', 'S', 'D'],\n  MONTHS: ['dhen Fhaoilleach', 'dhen Ghearran', 'dhen Mhàrt', 'dhen Ghiblean', 'dhen Chèitean', 'dhen Ògmhios', 'dhen Iuchar', 'dhen Lùnastal', 'dhen t-Sultain', 'dhen Dàmhair', 'dhen t-Samhain', 'dhen Dùbhlachd'],\n  STANDALONEMONTHS: ['Am Faoilleach', 'An Gearran', 'Am Màrt', 'An Giblean', 'An Cèitean', 'An t-Ògmhios', 'An t-Iuchar', 'An Lùnastal', 'An t-Sultain', 'An Dàmhair', 'An t-Samhain', 'An Dùbhlachd'],\n  SHORTMONTHS: ['Faoi', 'Gearr', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùna', 'Sult', 'Dàmh', 'Samh', 'Dùbh'],\n  STANDALONESHORTMONTHS: ['Faoi', 'Gearr', 'Màrt', 'Gibl', 'Cèit', 'Ògmh', 'Iuch', 'Lùna', 'Sult', 'Dàmh', 'Samh', 'Dùbh'],\n  WEEKDAYS: ['DiDòmhnaich', 'DiLuain', 'DiMàirt', 'DiCiadain', 'DiarDaoin', 'DihAoine', 'DiSathairne'],\n  STANDALONEWEEKDAYS: ['DiDòmhnaich', 'DiLuain', 'DiMàirt', 'DiCiadain', 'DiarDaoin', 'DihAoine', 'DiSathairne'],\n  SHORTWEEKDAYS: ['DiD', 'DiL', 'DiM', 'DiC', 'Dia', 'Dih', 'DiS'],\n  STANDALONESHORTWEEKDAYS: ['DiD', 'DiL', 'DiM', 'DiC', 'Dia', 'Dih', 'DiS'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'C', 'A', 'H', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'C', 'A', 'H', 'S'],\n  SHORTQUARTERS: ['C1', 'C2', 'C3', 'C4'],\n  QUARTERS: ['1d chairteal', '2na cairteal', '3s cairteal', '4mh cairteal'],\n  AMPMS: ['m', 'f'],\n  DATEFORMATS: ['EEEE, d\\'mh\\' MMMM y', 'd\\'mh\\' MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale gd_GB.\n * @const\n */\ngoog.i18n.DateTimeSymbols_gd_GB = goog.i18n.DateTimeSymbols_gd;\n\n\n/**\n * Date/time formatting symbols for locale gl_ES.\n * @const\n */\ngoog.i18n.DateTimeSymbols_gl_ES = goog.i18n.DateTimeSymbols_gl;\n\n\n/**\n * Date/time formatting symbols for locale gsw_CH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_gsw_CH = goog.i18n.DateTimeSymbols_gsw;\n\n\n/**\n * Date/time formatting symbols for locale gsw_FR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_gsw_FR = goog.i18n.DateTimeSymbols_gsw;\n\n\n/**\n * Date/time formatting symbols for locale gsw_LI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_gsw_LI = goog.i18n.DateTimeSymbols_gsw;\n\n\n/**\n * Date/time formatting symbols for locale gu_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_gu_IN = goog.i18n.DateTimeSymbols_gu;\n\n\n/**\n * Date/time formatting symbols for locale guz.\n * @const\n */\ngoog.i18n.DateTimeSymbols_guz = {\n  ERAS: ['YA', 'YK'],\n  ERANAMES: ['Yeso ataiborwa', 'Yeso kaiboirwe'],\n  NARROWMONTHS: ['C', 'F', 'M', 'A', 'M', 'J', 'C', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['C', 'F', 'M', 'A', 'M', 'J', 'C', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Chanuari', 'Feburari', 'Machi', 'Apiriri', 'Mei', 'Juni', 'Chulai', 'Agosti', 'Septemba', 'Okitoba', 'Nobemba', 'Disemba'],\n  STANDALONEMONTHS: ['Chanuari', 'Feburari', 'Machi', 'Apiriri', 'Mei', 'Juni', 'Chulai', 'Agosti', 'Septemba', 'Okitoba', 'Nobemba', 'Disemba'],\n  SHORTMONTHS: ['Can', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Cul', 'Agt', 'Sep', 'Okt', 'Nob', 'Dis'],\n  STANDALONESHORTMONTHS: ['Can', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Cul', 'Agt', 'Sep', 'Okt', 'Nob', 'Dis'],\n  WEEKDAYS: ['Chumapiri', 'Chumatato', 'Chumaine', 'Chumatano', 'Aramisi', 'Ichuma', 'Esabato'],\n  STANDALONEWEEKDAYS: ['Chumapiri', 'Chumatato', 'Chumaine', 'Chumatano', 'Aramisi', 'Ichuma', 'Esabato'],\n  SHORTWEEKDAYS: ['Cpr', 'Ctt', 'Cmn', 'Cmt', 'Ars', 'Icm', 'Est'],\n  STANDALONESHORTWEEKDAYS: ['Cpr', 'Ctt', 'Cmn', 'Cmt', 'Ars', 'Icm', 'Est'],\n  NARROWWEEKDAYS: ['C', 'C', 'C', 'C', 'A', 'I', 'E'],\n  STANDALONENARROWWEEKDAYS: ['C', 'C', 'C', 'C', 'A', 'I', 'E'],\n  SHORTQUARTERS: ['E1', 'E2', 'E3', 'E4'],\n  QUARTERS: ['Erobo entang’ani', 'Erobo yakabere', 'Erobo yagatato', 'Erobo yakane'],\n  AMPMS: ['Mambia', 'Mog'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale guz_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_guz_KE = goog.i18n.DateTimeSymbols_guz;\n\n\n/**\n * Date/time formatting symbols for locale gv.\n * @const\n */\ngoog.i18n.DateTimeSymbols_gv = {\n  ERAS: ['RC', 'AD'],\n  ERANAMES: ['RC', 'AD'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['Jerrey-geuree', 'Toshiaght-arree', 'Mayrnt', 'Averil', 'Boaldyn', 'Mean-souree', 'Jerrey-souree', 'Luanistyn', 'Mean-fouyir', 'Jerrey-fouyir', 'Mee Houney', 'Mee ny Nollick'],\n  STANDALONEMONTHS: ['Jerrey-geuree', 'Toshiaght-arree', 'Mayrnt', 'Averil', 'Boaldyn', 'Mean-souree', 'Jerrey-souree', 'Luanistyn', 'Mean-fouyir', 'Jerrey-fouyir', 'Mee Houney', 'Mee ny Nollick'],\n  SHORTMONTHS: ['J-guer', 'T-arree', 'Mayrnt', 'Avrril', 'Boaldyn', 'M-souree', 'J-souree', 'Luanistyn', 'M-fouyir', 'J-fouyir', 'M-Houney', 'M-Nollick'],\n  STANDALONESHORTMONTHS: ['J-guer', 'T-arree', 'Mayrnt', 'Avrril', 'Boaldyn', 'M-souree', 'J-souree', 'Luanistyn', 'M-fouyir', 'J-fouyir', 'M-Houney', 'M-Nollick'],\n  WEEKDAYS: ['Jedoonee', 'Jelhein', 'Jemayrt', 'Jercean', 'Jerdein', 'Jeheiney', 'Jesarn'],\n  STANDALONEWEEKDAYS: ['Jedoonee', 'Jelhein', 'Jemayrt', 'Jercean', 'Jerdein', 'Jeheiney', 'Jesarn'],\n  SHORTWEEKDAYS: ['Jed', 'Jel', 'Jem', 'Jerc', 'Jerd', 'Jeh', 'Jes'],\n  STANDALONESHORTWEEKDAYS: ['Jed', 'Jel', 'Jem', 'Jerc', 'Jerd', 'Jeh', 'Jes'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale gv_IM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_gv_IM = goog.i18n.DateTimeSymbols_gv;\n\n\n/**\n * Date/time formatting symbols for locale ha.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ha = {\n  ERAS: ['K.H', 'BHAI'],\n  ERANAMES: ['Kafin haihuwar annab', 'Bayan haihuwar annab'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'Y', 'Y', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'Y', 'Y', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Janairu', 'Faburairu', 'Maris', 'Afirilu', 'Mayu', 'Yuni', 'Yuli', 'Agusta', 'Satumba', 'Oktoba', 'Nuwamba', 'Disamba'],\n  STANDALONEMONTHS: ['Janairu', 'Faburairu', 'Maris', 'Afirilu', 'Mayu', 'Yuni', 'Yuli', 'Agusta', 'Satumba', 'Oktoba', 'Nuwamba', 'Disamba'],\n  SHORTMONTHS: ['Jan', 'Fab', 'Mar', 'Afi', 'May', 'Yun', 'Yul', 'Agu', 'Sat', 'Okt', 'Nuw', 'Dis'],\n  STANDALONESHORTMONTHS: ['Jan', 'Fab', 'Mar', 'Afi', 'May', 'Yun', 'Yul', 'Agu', 'Sat', 'Okt', 'Nuw', 'Dis'],\n  WEEKDAYS: ['Lahadi', 'Litinin', 'Talata', 'Laraba', 'Alhamis', 'Jummaʼa', 'Asabar'],\n  STANDALONEWEEKDAYS: ['Lahadi', 'Litinin', 'Talata', 'Laraba', 'Alhamis', 'Jummaʼa', 'Asabar'],\n  SHORTWEEKDAYS: ['Lah', 'Lit', 'Tal', 'Lar', 'Alh', 'Jum', 'Asa'],\n  STANDALONESHORTWEEKDAYS: ['Lah', 'Lit', 'Tal', 'Lar', 'Alh', 'Jum', 'Asa'],\n  NARROWWEEKDAYS: ['L', 'L', 'T', 'L', 'A', 'J', 'A'],\n  STANDALONENARROWWEEKDAYS: ['L', 'L', 'T', 'L', 'A', 'J', 'A'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['Kwata na ɗaya', 'Kwata na biyu', 'Kwata na uku', 'Kwata na huɗu'],\n  AMPMS: ['Safiya', 'Yamma'],\n  DATEFORMATS: ['EEEE d MMMM, y', 'd MMMM, y', 'd MMM, y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ha_GH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ha_GH = {\n  ERAS: ['K.H', 'BHAI'],\n  ERANAMES: ['Kafin haihuwar annab', 'Bayan haihuwar annab'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'Y', 'Y', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'Y', 'Y', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Janairu', 'Faburairu', 'Maris', 'Afirilu', 'Mayu', 'Yuni', 'Yuli', 'Agusta', 'Satumba', 'Oktoba', 'Nuwamba', 'Disamba'],\n  STANDALONEMONTHS: ['Janairu', 'Faburairu', 'Maris', 'Afirilu', 'Mayu', 'Yuni', 'Yuli', 'Agusta', 'Satumba', 'Oktoba', 'Nuwamba', 'Disamba'],\n  SHORTMONTHS: ['Jan', 'Fab', 'Mar', 'Afi', 'May', 'Yun', 'Yul', 'Agu', 'Sat', 'Okt', 'Nuw', 'Dis'],\n  STANDALONESHORTMONTHS: ['Jan', 'Fab', 'Mar', 'Afi', 'May', 'Yun', 'Yul', 'Agu', 'Sat', 'Okt', 'Nuw', 'Dis'],\n  WEEKDAYS: ['Lahadi', 'Litinin', 'Talata', 'Laraba', 'Alhamis', 'Jummaʼa', 'Asabar'],\n  STANDALONEWEEKDAYS: ['Lahadi', 'Litinin', 'Talata', 'Laraba', 'Alhamis', 'Jummaʼa', 'Asabar'],\n  SHORTWEEKDAYS: ['Lah', 'Lit', 'Tal', 'Lar', 'Alh', 'Jum', 'Asa'],\n  STANDALONESHORTWEEKDAYS: ['Lah', 'Lit', 'Tal', 'Lar', 'Alh', 'Jum', 'Asa'],\n  NARROWWEEKDAYS: ['L', 'L', 'T', 'L', 'A', 'J', 'A'],\n  STANDALONENARROWWEEKDAYS: ['L', 'L', 'T', 'L', 'A', 'J', 'A'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['Kwata na ɗaya', 'Kwata na biyu', 'Kwata na uku', 'Kwata na huɗu'],\n  AMPMS: ['Safiya', 'Yamma'],\n  DATEFORMATS: ['EEEE d MMMM, y', 'd MMMM, y', 'd MMM, y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ha_NE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ha_NE = goog.i18n.DateTimeSymbols_ha;\n\n\n/**\n * Date/time formatting symbols for locale ha_NG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ha_NG = goog.i18n.DateTimeSymbols_ha;\n\n\n/**\n * Date/time formatting symbols for locale haw_US.\n * @const\n */\ngoog.i18n.DateTimeSymbols_haw_US = goog.i18n.DateTimeSymbols_haw;\n\n\n/**\n * Date/time formatting symbols for locale he_IL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_he_IL = goog.i18n.DateTimeSymbols_he;\n\n\n/**\n * Date/time formatting symbols for locale hi_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_hi_IN = goog.i18n.DateTimeSymbols_hi;\n\n\n/**\n * Date/time formatting symbols for locale hr_BA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_hr_BA = {\n  ERAS: ['pr. Kr.', 'po. Kr.'],\n  ERANAMES: ['prije Krista', 'poslije Krista'],\n  NARROWMONTHS: ['1.', '2.', '3.', '4.', '5.', '6.', '7.', '8.', '9.', '10.', '11.', '12.'],\n  STANDALONENARROWMONTHS: ['1.', '2.', '3.', '4.', '5.', '6.', '7.', '8.', '9.', '10.', '11.', '12.'],\n  MONTHS: ['siječnja', 'veljače', 'ožujka', 'travnja', 'svibnja', 'lipnja', 'srpnja', 'kolovoza', 'rujna', 'listopada', 'studenoga', 'prosinca'],\n  STANDALONEMONTHS: ['siječanj', 'veljača', 'ožujak', 'travanj', 'svibanj', 'lipanj', 'srpanj', 'kolovoz', 'rujan', 'listopad', 'studeni', 'prosinac'],\n  SHORTMONTHS: ['sij', 'velj', 'ožu', 'tra', 'svi', 'lip', 'srp', 'kol', 'ruj', 'lis', 'stu', 'pro'],\n  STANDALONESHORTMONTHS: ['sij', 'velj', 'ožu', 'tra', 'svi', 'lip', 'srp', 'kol', 'ruj', 'lis', 'stu', 'pro'],\n  WEEKDAYS: ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'],\n  STANDALONEWEEKDAYS: ['nedjelja', 'ponedjeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'],\n  SHORTWEEKDAYS: ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub'],\n  STANDALONESHORTWEEKDAYS: ['ned', 'pon', 'uto', 'sri', 'čet', 'pet', 'sub'],\n  NARROWWEEKDAYS: ['N', 'P', 'U', 'S', 'Č', 'P', 'S'],\n  STANDALONENARROWWEEKDAYS: ['N', 'P', 'U', 'S', 'Č', 'P', 'S'],\n  SHORTQUARTERS: ['1. kv.', '2. kv.', '3. kv.', '4. kv.'],\n  QUARTERS: ['1. kvartal', '2. kvartal', '3. kvartal', '4. kvartal'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d. MMMM y.', 'd. MMMM y.', 'd. MMM y.', 'd. M. yy.'],\n  TIMEFORMATS: ['HH:mm:ss (zzzz)', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'u\\' {0}', '{1} \\'u\\' {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale hr_HR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_hr_HR = goog.i18n.DateTimeSymbols_hr;\n\n\n/**\n * Date/time formatting symbols for locale hsb.\n * @const\n */\ngoog.i18n.DateTimeSymbols_hsb = {\n  ERAS: ['př.Chr.n.', 'po Chr.n.'],\n  ERANAMES: ['před Chrystowym narodźenjom', 'po Chrystowym narodźenju'],\n  NARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  MONTHS: ['januara', 'februara', 'měrca', 'apryla', 'meje', 'junija', 'julija', 'awgusta', 'septembra', 'oktobra', 'nowembra', 'decembra'],\n  STANDALONEMONTHS: ['januar', 'februar', 'měrc', 'apryl', 'meja', 'junij', 'julij', 'awgust', 'september', 'oktober', 'nowember', 'december'],\n  SHORTMONTHS: ['jan.', 'feb.', 'měr.', 'apr.', 'mej.', 'jun.', 'jul.', 'awg.', 'sep.', 'okt.', 'now.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan', 'feb', 'měr', 'apr', 'mej', 'jun', 'jul', 'awg', 'sep', 'okt', 'now', 'dec'],\n  WEEKDAYS: ['njedźela', 'póndźela', 'wutora', 'srjeda', 'štwórtk', 'pjatk', 'sobota'],\n  STANDALONEWEEKDAYS: ['njedźela', 'póndźela', 'wutora', 'srjeda', 'štwórtk', 'pjatk', 'sobota'],\n  SHORTWEEKDAYS: ['nje', 'pón', 'wut', 'srj', 'štw', 'pja', 'sob'],\n  STANDALONESHORTWEEKDAYS: ['nje', 'pón', 'wut', 'srj', 'štw', 'pja', 'sob'],\n  NARROWWEEKDAYS: ['n', 'p', 'w', 's', 'š', 'p', 's'],\n  STANDALONENARROWWEEKDAYS: ['n', 'p', 'w', 's', 'š', 'p', 's'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1. kwartal', '2. kwartal', '3. kwartal', '4. kwartal'],\n  AMPMS: ['dopołdnja', 'popołdnju'],\n  DATEFORMATS: ['EEEE, d. MMMM y', 'd. MMMM y', 'd.M.y', 'd.M.yy'],\n  TIMEFORMATS: ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm \\'hodź\\'.'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale hsb_DE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_hsb_DE = goog.i18n.DateTimeSymbols_hsb;\n\n\n/**\n * Date/time formatting symbols for locale hu_HU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_hu_HU = goog.i18n.DateTimeSymbols_hu;\n\n\n/**\n * Date/time formatting symbols for locale hy_AM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_hy_AM = goog.i18n.DateTimeSymbols_hy;\n\n\n/**\n * Date/time formatting symbols for locale ia.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ia = {\n  ERAS: ['a.Chr.', 'p.Chr.'],\n  ERANAMES: ['ante Christo', 'post Christo'],\n  NARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['januario', 'februario', 'martio', 'april', 'maio', 'junio', 'julio', 'augusto', 'septembre', 'octobre', 'novembre', 'decembre'],\n  STANDALONEMONTHS: ['januario', 'februario', 'martio', 'april', 'maio', 'junio', 'julio', 'augusto', 'septembre', 'octobre', 'novembre', 'decembre'],\n  SHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'],\n  STANDALONESHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'],\n  WEEKDAYS: ['dominica', 'lunedi', 'martedi', 'mercuridi', 'jovedi', 'venerdi', 'sabbato'],\n  STANDALONEWEEKDAYS: ['dominica', 'lunedi', 'martedi', 'mercuridi', 'jovedi', 'venerdi', 'sabbato'],\n  SHORTWEEKDAYS: ['dom', 'lun', 'mar', 'mer', 'jov', 'ven', 'sab'],\n  STANDALONESHORTWEEKDAYS: ['dom', 'lun', 'mar', 'mer', 'jov', 'ven', 'sab'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'j', 'v', 's'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1me trimestre', '2nde trimestre', '3tie trimestre', '4te trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE \\'le\\' d \\'de\\' MMMM y', 'd \\'de\\' MMMM y', 'd MMM y', 'dd-MM-y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'a\\' {0}', '{1} \\'a\\' {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ia_001.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ia_001 = goog.i18n.DateTimeSymbols_ia;\n\n\n/**\n * Date/time formatting symbols for locale id_ID.\n * @const\n */\ngoog.i18n.DateTimeSymbols_id_ID = goog.i18n.DateTimeSymbols_id;\n\n\n/**\n * Date/time formatting symbols for locale ig.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ig = {\n  ERAS: ['T.K.', 'A.K.'],\n  ERANAMES: ['Tupu Kristi', 'Afọ Kristi'],\n  NARROWMONTHS: ['J', 'F', 'M', 'E', 'M', 'J', 'J', 'Ọ', 'S', 'Ọ', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'E', 'M', 'J', 'J', 'Ọ', 'S', 'Ọ', 'N', 'D'],\n  MONTHS: ['Jenụwarị', 'Febrụwarị', 'Maachị', 'Epreel', 'Mee', 'Juun', 'Julaị', 'Ọgọọst', 'Septemba', 'Ọktoba', 'Novemba', 'Disemba'],\n  STANDALONEMONTHS: ['Jenụwarị', 'Febrụwarị', 'Maachị', 'Epreel', 'Mee', 'Juun', 'Julaị', 'Ọgọọst', 'Septemba', 'Ọktoba', 'Novemba', 'Disemba'],\n  SHORTMONTHS: ['Jen', 'Feb', 'Maa', 'Epr', 'Mee', 'Juu', 'Jul', 'Ọgọ', 'Sep', 'Ọkt', 'Nov', 'Dis'],\n  STANDALONESHORTMONTHS: ['Jen', 'Feb', 'Maa', 'Epr', 'Mee', 'Juu', 'Jul', 'Ọgọ', 'Sep', 'Ọkt', 'Nov', 'Dis'],\n  WEEKDAYS: ['Ụbọchị Ụka', 'Mọnde', 'Tiuzdee', 'Wenezdee', 'Tọọzdee', 'Fraịdee', 'Satọdee'],\n  STANDALONEWEEKDAYS: ['Ụbọchị Ụka', 'Mọnde', 'Tiuzdee', 'Wenezdee', 'Tọọzdee', 'Fraịdee', 'Satọdee'],\n  SHORTWEEKDAYS: ['Ụka', 'Mọn', 'Tiu', 'Wen', 'Tọọ', 'Fraị', 'Satọdee'],\n  STANDALONESHORTWEEKDAYS: ['Ụka', 'Mọn', 'Tiu', 'Wen', 'Tọọ', 'Fraị', 'Satọdee'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Ọ1', 'Ọ2', 'Ọ3', 'Ọ4'],\n  QUARTERS: ['Ọkara 1', 'Ọkara 2', 'Ọkara 3', 'Ọkara 4'],\n  AMPMS: ['N’ụtụtụ', 'N’abali'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'na\\' {0}', '{1} \\'na\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ig_NG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ig_NG = goog.i18n.DateTimeSymbols_ig;\n\n\n/**\n * Date/time formatting symbols for locale ii.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ii = {\n  ERAS: ['ꃅꋊꂿ', 'ꃅꋊꊂ'],\n  ERANAMES: ['ꃅꋊꂿ', 'ꃅꋊꊂ'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['ꋍꆪ', 'ꑍꆪ', 'ꌕꆪ', 'ꇖꆪ', 'ꉬꆪ', 'ꃘꆪ', 'ꏃꆪ', 'ꉆꆪ', 'ꈬꆪ', 'ꊰꆪ', 'ꊰꊪꆪ', 'ꊰꑋꆪ'],\n  STANDALONEMONTHS: ['ꋍꆪ', 'ꑍꆪ', 'ꌕꆪ', 'ꇖꆪ', 'ꉬꆪ', 'ꃘꆪ', 'ꏃꆪ', 'ꉆꆪ', 'ꈬꆪ', 'ꊰꆪ', 'ꊰꊪꆪ', 'ꊰꑋꆪ'],\n  SHORTMONTHS: ['ꋍꆪ', 'ꑍꆪ', 'ꌕꆪ', 'ꇖꆪ', 'ꉬꆪ', 'ꃘꆪ', 'ꏃꆪ', 'ꉆꆪ', 'ꈬꆪ', 'ꊰꆪ', 'ꊰꊪꆪ', 'ꊰꑋꆪ'],\n  STANDALONESHORTMONTHS: ['ꋍꆪ', 'ꑍꆪ', 'ꌕꆪ', 'ꇖꆪ', 'ꉬꆪ', 'ꃘꆪ', 'ꏃꆪ', 'ꉆꆪ', 'ꈬꆪ', 'ꊰꆪ', 'ꊰꊪꆪ', 'ꊰꑋꆪ'],\n  WEEKDAYS: ['ꑭꆏꑍ', 'ꆏꊂꋍ', 'ꆏꊂꑍ', 'ꆏꊂꌕ', 'ꆏꊂꇖ', 'ꆏꊂꉬ', 'ꆏꊂꃘ'],\n  STANDALONEWEEKDAYS: ['ꑭꆏꑍ', 'ꆏꊂꋍ', 'ꆏꊂꑍ', 'ꆏꊂꌕ', 'ꆏꊂꇖ', 'ꆏꊂꉬ', 'ꆏꊂꃘ'],\n  SHORTWEEKDAYS: ['ꑭꆏ', 'ꆏꋍ', 'ꆏꑍ', 'ꆏꌕ', 'ꆏꇖ', 'ꆏꉬ', 'ꆏꃘ'],\n  STANDALONESHORTWEEKDAYS: ['ꑭꆏ', 'ꆏꋍ', 'ꆏꑍ', 'ꆏꌕ', 'ꆏꇖ', 'ꆏꉬ', 'ꆏꃘ'],\n  NARROWWEEKDAYS: ['ꆏ', 'ꋍ', 'ꑍ', 'ꌕ', 'ꇖ', 'ꉬ', 'ꃘ'],\n  STANDALONENARROWWEEKDAYS: ['ꆏ', 'ꋍ', 'ꑍ', 'ꌕ', 'ꇖ', 'ꉬ', 'ꃘ'],\n  SHORTQUARTERS: ['ꃅꑌ', 'ꃅꎸ', 'ꃅꍵ', 'ꃅꋆ'],\n  QUARTERS: ['ꃅꑌ', 'ꃅꎸ', 'ꃅꍵ', 'ꃅꋆ'],\n  AMPMS: ['ꎸꄑ', 'ꁯꋒ'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ii_CN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ii_CN = goog.i18n.DateTimeSymbols_ii;\n\n\n/**\n * Date/time formatting symbols for locale is_IS.\n * @const\n */\ngoog.i18n.DateTimeSymbols_is_IS = goog.i18n.DateTimeSymbols_is;\n\n\n/**\n * Date/time formatting symbols for locale it_CH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_it_CH = {\n  ERAS: ['a.C.', 'd.C.'],\n  ERANAMES: ['avanti Cristo', 'dopo Cristo'],\n  NARROWMONTHS: ['G', 'F', 'M', 'A', 'M', 'G', 'L', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['G', 'F', 'M', 'A', 'M', 'G', 'L', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'],\n  STANDALONEMONTHS: ['gennaio', 'febbraio', 'marzo', 'aprile', 'maggio', 'giugno', 'luglio', 'agosto', 'settembre', 'ottobre', 'novembre', 'dicembre'],\n  SHORTMONTHS: ['gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic'],\n  STANDALONESHORTMONTHS: ['gen', 'feb', 'mar', 'apr', 'mag', 'giu', 'lug', 'ago', 'set', 'ott', 'nov', 'dic'],\n  WEEKDAYS: ['domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato'],\n  STANDALONEWEEKDAYS: ['domenica', 'lunedì', 'martedì', 'mercoledì', 'giovedì', 'venerdì', 'sabato'],\n  SHORTWEEKDAYS: ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'],\n  STANDALONESHORTWEEKDAYS: ['dom', 'lun', 'mar', 'mer', 'gio', 'ven', 'sab'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'G', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'M', 'G', 'V', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1º trimestre', '2º trimestre', '3º trimestre', '4º trimestre'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale it_IT.\n * @const\n */\ngoog.i18n.DateTimeSymbols_it_IT = goog.i18n.DateTimeSymbols_it;\n\n\n/**\n * Date/time formatting symbols for locale it_SM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_it_SM = goog.i18n.DateTimeSymbols_it;\n\n\n/**\n * Date/time formatting symbols for locale it_VA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_it_VA = goog.i18n.DateTimeSymbols_it;\n\n\n/**\n * Date/time formatting symbols for locale ja_JP.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ja_JP = goog.i18n.DateTimeSymbols_ja;\n\n\n/**\n * Date/time formatting symbols for locale jgo.\n * @const\n */\ngoog.i18n.DateTimeSymbols_jgo = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['tsɛttsɛt mɛŋguꞌ mi ɛ́ lɛɛnɛ Kɛlísɛtɔ gɔ ńɔ́', 'tsɛttsɛt mɛŋguꞌ mi ɛ́ fúnɛ Kɛlísɛtɔ tɔ́ mɔ́'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['Nduŋmbi Saŋ', 'Pɛsaŋ Pɛ́pá', 'Pɛsaŋ Pɛ́tát', 'Pɛsaŋ Pɛ́nɛ́kwa', 'Pɛsaŋ Pataa', 'Pɛsaŋ Pɛ́nɛ́ntúkú', 'Pɛsaŋ Saambá', 'Pɛsaŋ Pɛ́nɛ́fɔm', 'Pɛsaŋ Pɛ́nɛ́pfúꞋú', 'Pɛsaŋ Nɛgɛ́m', 'Pɛsaŋ Ntsɔ̌pmɔ́', 'Pɛsaŋ Ntsɔ̌ppá'],\n  STANDALONEMONTHS: ['Nduŋmbi Saŋ', 'Pɛsaŋ Pɛ́pá', 'Pɛsaŋ Pɛ́tát', 'Pɛsaŋ Pɛ́nɛ́kwa', 'Pɛsaŋ Pataa', 'Pɛsaŋ Pɛ́nɛ́ntúkú', 'Pɛsaŋ Saambá', 'Pɛsaŋ Pɛ́nɛ́fɔm', 'Pɛsaŋ Pɛ́nɛ́pfúꞋú', 'Pɛsaŋ Nɛgɛ́m', 'Pɛsaŋ Ntsɔ̌pmɔ́', 'Pɛsaŋ Ntsɔ̌ppá'],\n  SHORTMONTHS: ['Nduŋmbi Saŋ', 'Pɛsaŋ Pɛ́pá', 'Pɛsaŋ Pɛ́tát', 'Pɛsaŋ Pɛ́nɛ́kwa', 'Pɛsaŋ Pataa', 'Pɛsaŋ Pɛ́nɛ́ntúkú', 'Pɛsaŋ Saambá', 'Pɛsaŋ Pɛ́nɛ́fɔm', 'Pɛsaŋ Pɛ́nɛ́pfúꞋú', 'Pɛsaŋ Nɛgɛ́m', 'Pɛsaŋ Ntsɔ̌pmɔ́', 'Pɛsaŋ Ntsɔ̌ppá'],\n  STANDALONESHORTMONTHS: ['Nduŋmbi Saŋ', 'Pɛsaŋ Pɛ́pá', 'Pɛsaŋ Pɛ́tát', 'Pɛsaŋ Pɛ́nɛ́kwa', 'Pɛsaŋ Pataa', 'Pɛsaŋ Pɛ́nɛ́ntúkú', 'Pɛsaŋ Saambá', 'Pɛsaŋ Pɛ́nɛ́fɔm', 'Pɛsaŋ Pɛ́nɛ́pfúꞋú', 'Pɛsaŋ Nɛgɛ́m', 'Pɛsaŋ Ntsɔ̌pmɔ́', 'Pɛsaŋ Ntsɔ̌ppá'],\n  WEEKDAYS: ['Sɔ́ndi', 'Mɔ́ndi', 'Ápta Mɔ́ndi', 'Wɛ́nɛsɛdɛ', 'Tɔ́sɛdɛ', 'Fɛlâyɛdɛ', 'Sásidɛ'],\n  STANDALONEWEEKDAYS: ['Sɔ́ndi', 'Mɔ́ndi', 'Ápta Mɔ́ndi', 'Wɛ́nɛsɛdɛ', 'Tɔ́sɛdɛ', 'Fɛlâyɛdɛ', 'Sásidɛ'],\n  SHORTWEEKDAYS: ['Sɔ́ndi', 'Mɔ́ndi', 'Ápta Mɔ́ndi', 'Wɛ́nɛsɛdɛ', 'Tɔ́sɛdɛ', 'Fɛlâyɛdɛ', 'Sásidɛ'],\n  STANDALONESHORTWEEKDAYS: ['Sɔ́ndi', 'Mɔ́ndi', 'Ápta Mɔ́ndi', 'Wɛ́nɛsɛdɛ', 'Tɔ́sɛdɛ', 'Fɛlâyɛdɛ', 'Sásidɛ'],\n  NARROWWEEKDAYS: ['Sɔ́', 'Mɔ́', 'ÁM', 'Wɛ́', 'Tɔ́', 'Fɛ', 'Sá'],\n  STANDALONENARROWWEEKDAYS: ['Sɔ́', 'Mɔ́', 'ÁM', 'Wɛ́', 'Tɔ́', 'Fɛ', 'Sá'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['mbaꞌmbaꞌ', 'ŋka mbɔ́t nji'],\n  DATEFORMATS: ['EEEE, y MMMM dd', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale jgo_CM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_jgo_CM = goog.i18n.DateTimeSymbols_jgo;\n\n\n/**\n * Date/time formatting symbols for locale jmc.\n * @const\n */\ngoog.i18n.DateTimeSymbols_jmc = {\n  ERAS: ['KK', 'BK'],\n  ERANAMES: ['Kabla ya Kristu', 'Baada ya Kristu'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januari', 'Februari', 'Machi', 'Aprilyi', 'Mei', 'Junyi', 'Julyai', 'Agusti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  STANDALONEMONTHS: ['Januari', 'Februari', 'Machi', 'Aprilyi', 'Mei', 'Junyi', 'Julyai', 'Agusti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  WEEKDAYS: ['Jumapilyi', 'Jumatatuu', 'Jumanne', 'Jumatanu', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  STANDALONEWEEKDAYS: ['Jumapilyi', 'Jumatatuu', 'Jumanne', 'Jumatanu', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  SHORTWEEKDAYS: ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'],\n  STANDALONESHORTWEEKDAYS: ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'],\n  NARROWWEEKDAYS: ['J', 'J', 'J', 'J', 'A', 'I', 'J'],\n  STANDALONENARROWWEEKDAYS: ['J', 'J', 'J', 'J', 'A', 'I', 'J'],\n  SHORTQUARTERS: ['R1', 'R2', 'R3', 'R4'],\n  QUARTERS: ['Robo 1', 'Robo 2', 'Robo 3', 'Robo 4'],\n  AMPMS: ['utuko', 'kyiukonyi'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale jmc_TZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_jmc_TZ = goog.i18n.DateTimeSymbols_jmc;\n\n\n/**\n * Date/time formatting symbols for locale jv.\n * @const\n */\ngoog.i18n.DateTimeSymbols_jv = {\n  ERAS: ['SM', 'M'],\n  ERANAMES: ['Sakdurunge Masehi', 'Masehi'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'],\n  STANDALONEMONTHS: ['Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni', 'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agt', 'Sep', 'Okt', 'Nov', 'Des'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Agt', 'Sep', 'Okt', 'Nov', 'Des'],\n  WEEKDAYS: ['Ahad', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'],\n  STANDALONEWEEKDAYS: ['Ahad', 'Senin', 'Selasa', 'Rabu', 'Kamis', 'Jumat', 'Sabtu'],\n  SHORTWEEKDAYS: ['Ahd', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'],\n  STANDALONESHORTWEEKDAYS: ['Ahd', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'],\n  NARROWWEEKDAYS: ['A', 'S', 'S', 'R', 'K', 'J', 'S'],\n  STANDALONENARROWWEEKDAYS: ['A', 'S', 'S', 'R', 'K', 'J', 'S'],\n  SHORTQUARTERS: ['TW1', 'TW2', 'TW3', 'TW4'],\n  QUARTERS: ['triwulan kaping pisan', 'triwulan kaping loro', 'triwulan kaping telu', 'triwulan kaping papat'],\n  AMPMS: ['Isuk', 'Wengi'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd-MM-y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale jv_ID.\n * @const\n */\ngoog.i18n.DateTimeSymbols_jv_ID = goog.i18n.DateTimeSymbols_jv;\n\n\n/**\n * Date/time formatting symbols for locale ka_GE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ka_GE = goog.i18n.DateTimeSymbols_ka;\n\n\n/**\n * Date/time formatting symbols for locale kab.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kab = {\n  ERAS: ['snd. T.Ɛ', 'sld. T.Ɛ'],\n  ERANAMES: ['send talalit n Ɛisa', 'seld talalit n Ɛisa'],\n  NARROWMONTHS: ['Y', 'F', 'M', 'Y', 'M', 'Y', 'Y', 'Ɣ', 'C', 'T', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['Y', 'F', 'M', 'Y', 'M', 'Y', 'Y', 'Ɣ', 'C', 'T', 'N', 'D'],\n  MONTHS: ['Yennayer', 'Fuṛar', 'Meɣres', 'Yebrir', 'Mayyu', 'Yunyu', 'Yulyu', 'Ɣuct', 'Ctembeṛ', 'Tubeṛ', 'Nunembeṛ', 'Duǧembeṛ'],\n  STANDALONEMONTHS: ['Yennayer', 'Fuṛar', 'Meɣres', 'Yebrir', 'Mayyu', 'Yunyu', 'Yulyu', 'Ɣuct', 'Ctembeṛ', 'Tubeṛ', 'Nunembeṛ', 'Duǧembeṛ'],\n  SHORTMONTHS: ['Yen', 'Fur', 'Meɣ', 'Yeb', 'May', 'Yun', 'Yul', 'Ɣuc', 'Cte', 'Tub', 'Nun', 'Duǧ'],\n  STANDALONESHORTMONTHS: ['Yen', 'Fur', 'Meɣ', 'Yeb', 'May', 'Yun', 'Yul', 'Ɣuc', 'Cte', 'Tub', 'Nun', 'Duǧ'],\n  WEEKDAYS: ['Yanass', 'Sanass', 'Kraḍass', 'Kuẓass', 'Samass', 'Sḍisass', 'Sayass'],\n  STANDALONEWEEKDAYS: ['Yanass', 'Sanass', 'Kraḍass', 'Kuẓass', 'Samass', 'Sḍisass', 'Sayass'],\n  SHORTWEEKDAYS: ['Yan', 'San', 'Kraḍ', 'Kuẓ', 'Sam', 'Sḍis', 'Say'],\n  STANDALONESHORTWEEKDAYS: ['Yan', 'San', 'Kraḍ', 'Kuẓ', 'Sam', 'Sḍis', 'Say'],\n  NARROWWEEKDAYS: ['Y', 'S', 'K', 'K', 'S', 'S', 'S'],\n  STANDALONENARROWWEEKDAYS: ['Y', 'S', 'K', 'K', 'S', 'S', 'S'],\n  SHORTQUARTERS: ['Kḍg1', 'Kḍg2', 'Kḍg3', 'Kḍg4'],\n  QUARTERS: ['akraḍaggur amenzu', 'akraḍaggur wis-sin', 'akraḍaggur wis-kraḍ', 'akraḍaggur wis-kuẓ'],\n  AMPMS: ['n tufat', 'n tmeddit'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale kab_DZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kab_DZ = goog.i18n.DateTimeSymbols_kab;\n\n\n/**\n * Date/time formatting symbols for locale kam.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kam = {\n  ERAS: ['MY', 'IY'],\n  ERANAMES: ['Mbee wa Yesũ', 'Ĩtina wa Yesũ'],\n  NARROWMONTHS: ['M', 'K', 'K', 'K', 'K', 'T', 'M', 'N', 'K', 'Ĩ', 'Ĩ', 'Ĩ'],\n  STANDALONENARROWMONTHS: ['M', 'K', 'K', 'K', 'K', 'T', 'M', 'N', 'K', 'Ĩ', 'Ĩ', 'Ĩ'],\n  MONTHS: ['Mwai wa mbee', 'Mwai wa kelĩ', 'Mwai wa katatũ', 'Mwai wa kana', 'Mwai wa katano', 'Mwai wa thanthatũ', 'Mwai wa muonza', 'Mwai wa nyaanya', 'Mwai wa kenda', 'Mwai wa ĩkumi', 'Mwai wa ĩkumi na ĩmwe', 'Mwai wa ĩkumi na ilĩ'],\n  STANDALONEMONTHS: ['Mwai wa mbee', 'Mwai wa kelĩ', 'Mwai wa katatũ', 'Mwai wa kana', 'Mwai wa katano', 'Mwai wa thanthatũ', 'Mwai wa muonza', 'Mwai wa nyaanya', 'Mwai wa kenda', 'Mwai wa ĩkumi', 'Mwai wa ĩkumi na ĩmwe', 'Mwai wa ĩkumi na ilĩ'],\n  SHORTMONTHS: ['Mbe', 'Kel', 'Ktũ', 'Kan', 'Ktn', 'Tha', 'Moo', 'Nya', 'Knd', 'Ĩku', 'Ĩkm', 'Ĩkl'],\n  STANDALONESHORTMONTHS: ['Mbe', 'Kel', 'Ktũ', 'Kan', 'Ktn', 'Tha', 'Moo', 'Nya', 'Knd', 'Ĩku', 'Ĩkm', 'Ĩkl'],\n  WEEKDAYS: ['Wa kyumwa', 'Wa kwambĩlĩlya', 'Wa kelĩ', 'Wa katatũ', 'Wa kana', 'Wa katano', 'Wa thanthatũ'],\n  STANDALONEWEEKDAYS: ['Wa kyumwa', 'Wa kwambĩlĩlya', 'Wa kelĩ', 'Wa katatũ', 'Wa kana', 'Wa katano', 'Wa thanthatũ'],\n  SHORTWEEKDAYS: ['Wky', 'Wkw', 'Wkl', 'Wtũ', 'Wkn', 'Wtn', 'Wth'],\n  STANDALONESHORTWEEKDAYS: ['Wky', 'Wkw', 'Wkl', 'Wtũ', 'Wkn', 'Wtn', 'Wth'],\n  NARROWWEEKDAYS: ['Y', 'W', 'E', 'A', 'A', 'A', 'A'],\n  STANDALONENARROWWEEKDAYS: ['Y', 'W', 'E', 'A', 'A', 'A', 'A'],\n  SHORTQUARTERS: ['L1', 'L2', 'L3', 'L4'],\n  QUARTERS: ['Lovo ya mbee', 'Lovo ya kelĩ', 'Lovo ya katatũ', 'Lovo ya kana'],\n  AMPMS: ['Ĩyakwakya', 'Ĩyawĩoo'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale kam_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kam_KE = goog.i18n.DateTimeSymbols_kam;\n\n\n/**\n * Date/time formatting symbols for locale kde.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kde = {\n  ERAS: ['AY', 'NY'],\n  ERANAMES: ['Akanapawa Yesu', 'Nankuida Yesu'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Mwedi Ntandi', 'Mwedi wa Pili', 'Mwedi wa Tatu', 'Mwedi wa Nchechi', 'Mwedi wa Nnyano', 'Mwedi wa Nnyano na Umo', 'Mwedi wa Nnyano na Mivili', 'Mwedi wa Nnyano na Mitatu', 'Mwedi wa Nnyano na Nchechi', 'Mwedi wa Nnyano na Nnyano', 'Mwedi wa Nnyano na Nnyano na U', 'Mwedi wa Nnyano na Nnyano na M'],\n  STANDALONEMONTHS: ['Mwedi Ntandi', 'Mwedi wa Pili', 'Mwedi wa Tatu', 'Mwedi wa Nchechi', 'Mwedi wa Nnyano', 'Mwedi wa Nnyano na Umo', 'Mwedi wa Nnyano na Mivili', 'Mwedi wa Nnyano na Mitatu', 'Mwedi wa Nnyano na Nchechi', 'Mwedi wa Nnyano na Nnyano', 'Mwedi wa Nnyano na Nnyano na U', 'Mwedi wa Nnyano na Nnyano na M'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  WEEKDAYS: ['Liduva lyapili', 'Liduva lyatatu', 'Liduva lyanchechi', 'Liduva lyannyano', 'Liduva lyannyano na linji', 'Liduva lyannyano na mavili', 'Liduva litandi'],\n  STANDALONEWEEKDAYS: ['Liduva lyapili', 'Liduva lyatatu', 'Liduva lyanchechi', 'Liduva lyannyano', 'Liduva lyannyano na linji', 'Liduva lyannyano na mavili', 'Liduva litandi'],\n  SHORTWEEKDAYS: ['Ll2', 'Ll3', 'Ll4', 'Ll5', 'Ll6', 'Ll7', 'Ll1'],\n  STANDALONESHORTWEEKDAYS: ['Ll2', 'Ll3', 'Ll4', 'Ll5', 'Ll6', 'Ll7', 'Ll1'],\n  NARROWWEEKDAYS: ['2', '3', '4', '5', '6', '7', '1'],\n  STANDALONENARROWWEEKDAYS: ['2', '3', '4', '5', '6', '7', '1'],\n  SHORTQUARTERS: ['L1', 'L2', 'L3', 'L4'],\n  QUARTERS: ['Lobo 1', 'Lobo 2', 'Lobo 3', 'Lobo 4'],\n  AMPMS: ['Muhi', 'Chilo'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale kde_TZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kde_TZ = goog.i18n.DateTimeSymbols_kde;\n\n\n/**\n * Date/time formatting symbols for locale kea.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kea = {\n  ERAS: ['AK', 'DK'],\n  ERANAMES: ['Antis di Kristu', 'Dispos di Kristu'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Janeru', 'Febreru', 'Marsu', 'Abril', 'Maiu', 'Junhu', 'Julhu', 'Agostu', 'Setenbru', 'Otubru', 'Nuvenbru', 'Dizenbru'],\n  STANDALONEMONTHS: ['Janeru', 'Febreru', 'Marsu', 'Abril', 'Maiu', 'Junhu', 'Julhu', 'Agostu', 'Setenbru', 'Otubru', 'Nuvenbru', 'Dizenbru'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Otu', 'Nuv', 'Diz'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Otu', 'Nuv', 'Diz'],\n  WEEKDAYS: ['dumingu', 'sigunda-fera', 'tersa-fera', 'kuarta-fera', 'kinta-fera', 'sesta-fera', 'sabadu'],\n  STANDALONEWEEKDAYS: ['dumingu', 'sigunda-fera', 'tersa-fera', 'kuarta-fera', 'kinta-fera', 'sesta-fera', 'sábadu'],\n  SHORTWEEKDAYS: ['dum', 'sig', 'ter', 'kua', 'kin', 'ses', 'sab'],\n  STANDALONESHORTWEEKDAYS: ['dum', 'sig', 'ter', 'kua', 'kin', 'ses', 'sab'],\n  NARROWWEEKDAYS: ['D', 'S', 'T', 'K', 'K', 'S', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'S', 'T', 'K', 'K', 'S', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1º trimestri', '2º trimestri', '3º trimestri', '4º trimestri'],\n  AMPMS: ['am', 'pm'],\n  DATEFORMATS: ['EEEE, d \\'di\\' MMMM \\'di\\' y', 'd \\'di\\' MMMM \\'di\\' y', 'd MMM y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale kea_CV.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kea_CV = goog.i18n.DateTimeSymbols_kea;\n\n\n/**\n * Date/time formatting symbols for locale khq.\n * @const\n */\ngoog.i18n.DateTimeSymbols_khq = {\n  ERAS: ['IJ', 'IZ'],\n  ERANAMES: ['Isaa jine', 'Isaa jamanoo'],\n  NARROWMONTHS: ['Ž', 'F', 'M', 'A', 'M', 'Ž', 'Ž', 'U', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['Ž', 'F', 'M', 'A', 'M', 'Ž', 'Ž', 'U', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'],\n  STANDALONEMONTHS: ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'],\n  SHORTMONTHS: ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'],\n  STANDALONESHORTMONTHS: ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'],\n  WEEKDAYS: ['Alhadi', 'Atini', 'Atalata', 'Alarba', 'Alhamiisa', 'Aljuma', 'Assabdu'],\n  STANDALONEWEEKDAYS: ['Alhadi', 'Atini', 'Atalata', 'Alarba', 'Alhamiisa', 'Aljuma', 'Assabdu'],\n  SHORTWEEKDAYS: ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alj', 'Ass'],\n  STANDALONESHORTWEEKDAYS: ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alj', 'Ass'],\n  NARROWWEEKDAYS: ['H', 'T', 'T', 'L', 'L', 'L', 'S'],\n  STANDALONENARROWWEEKDAYS: ['H', 'T', 'T', 'L', 'L', 'L', 'S'],\n  SHORTQUARTERS: ['A1', 'A2', 'A3', 'A4'],\n  QUARTERS: ['Arrubu 1', 'Arrubu 2', 'Arrubu 3', 'Arrubu 4'],\n  AMPMS: ['Adduha', 'Aluula'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale khq_ML.\n * @const\n */\ngoog.i18n.DateTimeSymbols_khq_ML = goog.i18n.DateTimeSymbols_khq;\n\n\n/**\n * Date/time formatting symbols for locale ki.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ki = {\n  ERAS: ['MK', 'TK'],\n  ERANAMES: ['Mbere ya Kristo', 'Thutha wa Kristo'],\n  NARROWMONTHS: ['J', 'K', 'G', 'K', 'G', 'G', 'M', 'K', 'K', 'I', 'I', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'K', 'G', 'K', 'G', 'G', 'M', 'K', 'K', 'I', 'I', 'D'],\n  MONTHS: ['Njenuarĩ', 'Mwere wa kerĩ', 'Mwere wa gatatũ', 'Mwere wa kana', 'Mwere wa gatano', 'Mwere wa gatandatũ', 'Mwere wa mũgwanja', 'Mwere wa kanana', 'Mwere wa kenda', 'Mwere wa ikũmi', 'Mwere wa ikũmi na ũmwe', 'Ndithemba'],\n  STANDALONEMONTHS: ['Njenuarĩ', 'Mwere wa kerĩ', 'Mwere wa gatatũ', 'Mwere wa kana', 'Mwere wa gatano', 'Mwere wa gatandatũ', 'Mwere wa mũgwanja', 'Mwere wa kanana', 'Mwere wa kenda', 'Mwere wa ikũmi', 'Mwere wa ikũmi na ũmwe', 'Ndithemba'],\n  SHORTMONTHS: ['JEN', 'WKR', 'WGT', 'WKN', 'WTN', 'WTD', 'WMJ', 'WNN', 'WKD', 'WIK', 'WMW', 'DIT'],\n  STANDALONESHORTMONTHS: ['JEN', 'WKR', 'WGT', 'WKN', 'WTN', 'WTD', 'WMJ', 'WNN', 'WKD', 'WIK', 'WMW', 'DIT'],\n  WEEKDAYS: ['Kiumia', 'Njumatatũ', 'Njumaine', 'Njumatana', 'Aramithi', 'Njumaa', 'Njumamothi'],\n  STANDALONEWEEKDAYS: ['Kiumia', 'Njumatatũ', 'Njumaine', 'Njumatana', 'Aramithi', 'Njumaa', 'Njumamothi'],\n  SHORTWEEKDAYS: ['KMA', 'NTT', 'NMN', 'NMT', 'ART', 'NMA', 'NMM'],\n  STANDALONESHORTWEEKDAYS: ['KMA', 'NTT', 'NMN', 'NMT', 'ART', 'NMA', 'NMM'],\n  NARROWWEEKDAYS: ['K', 'N', 'N', 'N', 'A', 'N', 'N'],\n  STANDALONENARROWWEEKDAYS: ['K', 'N', 'N', 'N', 'A', 'N', 'N'],\n  SHORTQUARTERS: ['R1', 'R2', 'R3', 'R4'],\n  QUARTERS: ['Robo ya mbere', 'Robo ya kerĩ', 'Robo ya gatatũ', 'Robo ya kana'],\n  AMPMS: ['Kiroko', 'Hwaĩ-inĩ'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ki_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ki_KE = goog.i18n.DateTimeSymbols_ki;\n\n\n/**\n * Date/time formatting symbols for locale kk_KZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kk_KZ = goog.i18n.DateTimeSymbols_kk;\n\n\n/**\n * Date/time formatting symbols for locale kkj.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kkj = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['pamba', 'wanja', 'mbiyɔ mɛndoŋgɔ', 'Nyɔlɔmbɔŋgɔ', 'Mɔnɔ ŋgbanja', 'Nyaŋgwɛ ŋgbanja', 'kuŋgwɛ', 'fɛ', 'njapi', 'nyukul', '11', 'ɓulɓusɛ'],\n  STANDALONEMONTHS: ['pamba', 'wanja', 'mbiyɔ mɛndoŋgɔ', 'Nyɔlɔmbɔŋgɔ', 'Mɔnɔ ŋgbanja', 'Nyaŋgwɛ ŋgbanja', 'kuŋgwɛ', 'fɛ', 'njapi', 'nyukul', '11', 'ɓulɓusɛ'],\n  SHORTMONTHS: ['pamba', 'wanja', 'mbiyɔ mɛndoŋgɔ', 'Nyɔlɔmbɔŋgɔ', 'Mɔnɔ ŋgbanja', 'Nyaŋgwɛ ŋgbanja', 'kuŋgwɛ', 'fɛ', 'njapi', 'nyukul', '11', 'ɓulɓusɛ'],\n  STANDALONESHORTMONTHS: ['pamba', 'wanja', 'mbiyɔ mɛndoŋgɔ', 'Nyɔlɔmbɔŋgɔ', 'Mɔnɔ ŋgbanja', 'Nyaŋgwɛ ŋgbanja', 'kuŋgwɛ', 'fɛ', 'njapi', 'nyukul', '11', 'ɓulɓusɛ'],\n  WEEKDAYS: ['sɔndi', 'lundi', 'mardi', 'mɛrkɛrɛdi', 'yedi', 'vaŋdɛrɛdi', 'mɔnɔ sɔndi'],\n  STANDALONEWEEKDAYS: ['sɔndi', 'lundi', 'mardi', 'mɛrkɛrɛdi', 'yedi', 'vaŋdɛrɛdi', 'mɔnɔ sɔndi'],\n  SHORTWEEKDAYS: ['sɔndi', 'lundi', 'mardi', 'mɛrkɛrɛdi', 'yedi', 'vaŋdɛrɛdi', 'mɔnɔ sɔndi'],\n  STANDALONESHORTWEEKDAYS: ['sɔndi', 'lundi', 'mardi', 'mɛrkɛrɛdi', 'yedi', 'vaŋdɛrɛdi', 'mɔnɔ sɔndi'],\n  NARROWWEEKDAYS: ['so', 'lu', 'ma', 'mɛ', 'ye', 'va', 'ms'],\n  STANDALONENARROWWEEKDAYS: ['so', 'lu', 'ma', 'mɛ', 'ye', 'va', 'ms'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE dd MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale kkj_CM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kkj_CM = goog.i18n.DateTimeSymbols_kkj;\n\n\n/**\n * Date/time formatting symbols for locale kl.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kl = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['januari', 'februari', 'martsi', 'aprili', 'maji', 'juni', 'juli', 'augustusi', 'septemberi', 'oktoberi', 'novemberi', 'decemberi'],\n  STANDALONEMONTHS: ['januari', 'februari', 'martsi', 'aprili', 'maji', 'juni', 'juli', 'augustusi', 'septemberi', 'oktoberi', 'novemberi', 'decemberi'],\n  SHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],\n  STANDALONESHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'dec'],\n  WEEKDAYS: ['sapaat', 'ataasinngorneq', 'marlunngorneq', 'pingasunngorneq', 'sisamanngorneq', 'tallimanngorneq', 'arfininngorneq'],\n  STANDALONEWEEKDAYS: ['sapaat', 'ataasinngorneq', 'marlunngorneq', 'pingasunngorneq', 'sisamanngorneq', 'tallimanngorneq', 'arfininngorneq'],\n  SHORTWEEKDAYS: ['sap', 'ata', 'mar', 'pin', 'sis', 'tal', 'arf'],\n  STANDALONESHORTWEEKDAYS: ['sap', 'ata', 'mar', 'pin', 'sis', 'tal', 'arf'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH.mm.ss zzzz', 'HH.mm.ss z', 'HH.mm.ss', 'HH.mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale kl_GL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kl_GL = goog.i18n.DateTimeSymbols_kl;\n\n\n/**\n * Date/time formatting symbols for locale kln.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kln = {\n  ERAS: ['AM', 'KO'],\n  ERANAMES: ['Amait kesich Jesu', 'Kokakesich Jesu'],\n  NARROWMONTHS: ['M', 'N', 'T', 'I', 'M', 'P', 'N', 'R', 'B', 'E', 'K', 'K'],\n  STANDALONENARROWMONTHS: ['M', 'N', 'T', 'I', 'M', 'P', 'N', 'R', 'B', 'E', 'K', 'K'],\n  MONTHS: ['Mulgul', 'Ng’atyaato', 'Kiptaamo', 'Iwootkuut', 'Mamuut', 'Paagi', 'Ng’eiyeet', 'Rooptui', 'Bureet', 'Epeeso', 'Kipsuunde ne taai', 'Kipsuunde nebo aeng’'],\n  STANDALONEMONTHS: ['Mulgul', 'Ng’atyaato', 'Kiptaamo', 'Iwootkuut', 'Mamuut', 'Paagi', 'Ng’eiyeet', 'Rooptui', 'Bureet', 'Epeeso', 'Kipsuunde ne taai', 'Kipsuunde nebo aeng’'],\n  SHORTMONTHS: ['Mul', 'Ngat', 'Taa', 'Iwo', 'Mam', 'Paa', 'Nge', 'Roo', 'Bur', 'Epe', 'Kpt', 'Kpa'],\n  STANDALONESHORTMONTHS: ['Mul', 'Ngat', 'Taa', 'Iwo', 'Mam', 'Paa', 'Nge', 'Roo', 'Bur', 'Epe', 'Kpt', 'Kpa'],\n  WEEKDAYS: ['Kotisap', 'Kotaai', 'Koaeng’', 'Kosomok', 'Koang’wan', 'Komuut', 'Kolo'],\n  STANDALONEWEEKDAYS: ['Kotisap', 'Kotaai', 'Koaeng’', 'Kosomok', 'Koang’wan', 'Komuut', 'Kolo'],\n  SHORTWEEKDAYS: ['Kts', 'Kot', 'Koo', 'Kos', 'Koa', 'Kom', 'Kol'],\n  STANDALONESHORTWEEKDAYS: ['Kts', 'Kot', 'Koo', 'Kos', 'Koa', 'Kom', 'Kol'],\n  NARROWWEEKDAYS: ['T', 'T', 'O', 'S', 'A', 'M', 'L'],\n  STANDALONENARROWWEEKDAYS: ['T', 'T', 'O', 'S', 'A', 'M', 'L'],\n  SHORTQUARTERS: ['R1', 'R2', 'R3', 'R4'],\n  QUARTERS: ['Robo netai', 'Robo nebo aeng’', 'Robo nebo somok', 'Robo nebo ang’wan'],\n  AMPMS: ['karoon', 'kooskoliny'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale kln_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kln_KE = goog.i18n.DateTimeSymbols_kln;\n\n\n/**\n * Date/time formatting symbols for locale km_KH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_km_KH = goog.i18n.DateTimeSymbols_km;\n\n\n/**\n * Date/time formatting symbols for locale kn_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kn_IN = goog.i18n.DateTimeSymbols_kn;\n\n\n/**\n * Date/time formatting symbols for locale ko_KP.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ko_KP = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['기원전', '서기'],\n  NARROWMONTHS: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  STANDALONENARROWMONTHS: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  MONTHS: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  STANDALONEMONTHS: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  SHORTMONTHS: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  STANDALONESHORTMONTHS: ['1월', '2월', '3월', '4월', '5월', '6월', '7월', '8월', '9월', '10월', '11월', '12월'],\n  WEEKDAYS: ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'],\n  STANDALONEWEEKDAYS: ['일요일', '월요일', '화요일', '수요일', '목요일', '금요일', '토요일'],\n  SHORTWEEKDAYS: ['일', '월', '화', '수', '목', '금', '토'],\n  STANDALONESHORTWEEKDAYS: ['일', '월', '화', '수', '목', '금', '토'],\n  NARROWWEEKDAYS: ['일', '월', '화', '수', '목', '금', '토'],\n  STANDALONENARROWWEEKDAYS: ['일', '월', '화', '수', '목', '금', '토'],\n  SHORTQUARTERS: ['1분기', '2분기', '3분기', '4분기'],\n  QUARTERS: ['제 1/4분기', '제 2/4분기', '제 3/4분기', '제 4/4분기'],\n  AMPMS: ['오전', '오후'],\n  DATEFORMATS: ['y년 M월 d일 EEEE', 'y년 M월 d일', 'y. M. d.', 'yy. M. d.'],\n  TIMEFORMATS: ['a h시 m분 s초 zzzz', 'a h시 m분 s초 z', 'a h:mm:ss', 'a h:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ko_KR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ko_KR = goog.i18n.DateTimeSymbols_ko;\n\n\n/**\n * Date/time formatting symbols for locale kok.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kok = {\n  ERAS: ['क्रिस्तपूर्व', 'क्रिस्तशखा'],\n  ERANAMES: ['क्रिस्तपूर्व', 'क्रिस्तशखा'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलाय', 'आगोस्त', 'सप्टेंबर', 'ऑक्टोबर', 'नोव्हेंबर', 'डिसेंबर'],\n  STANDALONEMONTHS: ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलाय', 'आगोस्त', 'सप्टेंबर', 'ऑक्टोबर', 'नोव्हेंबर', 'डिसेंबर'],\n  SHORTMONTHS: ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलाय', 'आगोस्त', 'सप्टेंबर', 'ऑक्टोबर', 'नोव्हेंबर', 'डिसेंबर'],\n  STANDALONESHORTMONTHS: ['जानेवारी', 'फेब्रुवारी', 'मार्च', 'एप्रिल', 'मे', 'जून', 'जुलाय', 'आगोस्त', 'सप्टेंबर', 'ऑक्टोबर', 'नोव्हेंबर', 'डिसेंबर'],\n  WEEKDAYS: ['आयतार', 'सोमार', 'मंगळार', 'बुधवार', 'गुरुवार', 'शुक्रार', 'शेनवार'],\n  STANDALONEWEEKDAYS: ['आयतार', 'सोमार', 'मंगळार', 'बुधवार', 'गुरुवार', 'शुक्रार', 'शेनवार'],\n  SHORTWEEKDAYS: ['आयतार', 'सोमार', 'मंगळार', 'बुधवार', 'गुरुवार', 'शुक्रार', 'शेनवार'],\n  STANDALONESHORTWEEKDAYS: ['आयतार', 'सोमार', 'मंगळार', 'बुधवार', 'गुरुवार', 'शुक्रार', 'शेनवार'],\n  NARROWWEEKDAYS: ['आ', 'सो', 'मं', 'बु', 'गु', 'शु', 'शे'],\n  STANDALONENARROWWEEKDAYS: ['आ', 'सो', 'मं', 'बु', 'गु', 'शु', 'शे'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['म.पू.', 'म.नं.'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'dd-MM-y', 'd-M-yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale kok_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kok_IN = goog.i18n.DateTimeSymbols_kok;\n\n\n/**\n * Date/time formatting symbols for locale ks.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ks = {\n  ZERODIGIT: 0x06F0,\n  ERAS: ['بی سی', 'اے ڈی'],\n  ERANAMES: ['قبٕل مسیٖح', 'عیٖسوی سنہٕ'],\n  NARROWMONTHS: ['ج', 'ف', 'م', 'ا', 'م', 'ج', 'ج', 'ا', 'س', 'س', 'ا', 'ن'],\n  STANDALONENARROWMONTHS: ['ج', 'ف', 'م', 'ا', 'م', 'ج', 'ج', 'ا', 'س', 'س', 'ا', 'ن'],\n  MONTHS: ['جنؤری', 'فرؤری', 'مارٕچ', 'اپریل', 'میٔ', 'جوٗن', 'جوٗلایی', 'اگست', 'ستمبر', 'اکتوٗبر', 'نومبر', 'دسمبر'],\n  STANDALONEMONTHS: ['جنؤری', 'فرؤری', 'مارٕچ', 'اپریل', 'میٔ', 'جوٗن', 'جوٗلایی', 'اگست', 'ستمبر', 'اکتوٗبر', 'نومبر', 'دسمبر'],\n  SHORTMONTHS: ['جنؤری', 'فرؤری', 'مارٕچ', 'اپریل', 'میٔ', 'جوٗن', 'جوٗلایی', 'اگست', 'ستمبر', 'اکتوٗبر', 'نومبر', 'دسمبر'],\n  STANDALONESHORTMONTHS: ['جنؤری', 'فرؤری', 'مارٕچ', 'اپریل', 'میٔ', 'جوٗن', 'جوٗلایی', 'اگست', 'ستمبر', 'اکتوٗبر', 'نومبر', 'دسمبر'],\n  WEEKDAYS: ['اَتھوار', 'ژٔندرٕروار', 'بۆموار', 'بودوار', 'برؠسوار', 'جُمہ', 'بٹوار'],\n  STANDALONEWEEKDAYS: ['اَتھوار', 'ژٔندرٕروار', 'بۆموار', 'بودوار', 'برؠسوار', 'جُمہ', 'بٹوار'],\n  SHORTWEEKDAYS: ['آتھوار', 'ژٔندٕروار', 'بۆموار', 'بودوار', 'برؠسوار', 'جُمہ', 'بٹوار'],\n  STANDALONESHORTWEEKDAYS: ['آتھوار', 'ژٔندٕروار', 'بۆموار', 'بودوار', 'برؠسوار', 'جُمہ', 'بٹوار'],\n  NARROWWEEKDAYS: ['ا', 'ژ', 'ب', 'ب', 'ب', 'ج', 'ب'],\n  STANDALONENARROWWEEKDAYS: ['ا', 'ژ', 'ب', 'ب', 'ب', 'ج', 'ب'],\n  SHORTQUARTERS: ['ژۄباگ', 'دۆیِم ژۄباگ', 'تریِم ژۄباگ', 'ژوٗرِم ژۄباگ'],\n  QUARTERS: ['گۄڑنیُک ژۄباگ', 'دۆیِم ژۄباگ', 'تریِم ژۄباگ', 'ژوٗرِم ژۄباگ'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ks_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ks_IN = goog.i18n.DateTimeSymbols_ks;\n\n\n/**\n * Date/time formatting symbols for locale ksb.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ksb = {\n  ERAS: ['KK', 'BK'],\n  ERANAMES: ['Kabla ya Klisto', 'Baada ya Klisto'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januali', 'Febluali', 'Machi', 'Aplili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  STANDALONEMONTHS: ['Januali', 'Febluali', 'Machi', 'Aplili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  WEEKDAYS: ['Jumaapii', 'Jumaatatu', 'Jumaane', 'Jumaatano', 'Alhamisi', 'Ijumaa', 'Jumaamosi'],\n  STANDALONEWEEKDAYS: ['Jumaapii', 'Jumaatatu', 'Jumaane', 'Jumaatano', 'Alhamisi', 'Ijumaa', 'Jumaamosi'],\n  SHORTWEEKDAYS: ['Jpi', 'Jtt', 'Jmn', 'Jtn', 'Alh', 'Iju', 'Jmo'],\n  STANDALONESHORTWEEKDAYS: ['Jpi', 'Jtt', 'Jmn', 'Jtn', 'Alh', 'Iju', 'Jmo'],\n  NARROWWEEKDAYS: ['2', '3', '4', '5', 'A', 'I', '1'],\n  STANDALONENARROWWEEKDAYS: ['2', '3', '4', '5', 'A', 'I', '1'],\n  SHORTQUARTERS: ['L1', 'L2', 'L3', 'L4'],\n  QUARTERS: ['Lobo ya bosi', 'Lobo ya mbii', 'Lobo ya nnd’atu', 'Lobo ya nne'],\n  AMPMS: ['makeo', 'nyiaghuo'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ksb_TZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ksb_TZ = goog.i18n.DateTimeSymbols_ksb;\n\n\n/**\n * Date/time formatting symbols for locale ksf.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ksf = {\n  ERAS: ['d.Y.', 'k.Y.'],\n  ERANAMES: ['di Yɛ́sus aká yálɛ', 'cámɛɛn kǝ kǝbɔpka Y'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['ŋwíí a ntɔ́ntɔ', 'ŋwíí akǝ bɛ́ɛ', 'ŋwíí akǝ ráá', 'ŋwíí akǝ nin', 'ŋwíí akǝ táan', 'ŋwíí akǝ táafɔk', 'ŋwíí akǝ táabɛɛ', 'ŋwíí akǝ táaraa', 'ŋwíí akǝ táanin', 'ŋwíí akǝ ntɛk', 'ŋwíí akǝ ntɛk di bɔ́k', 'ŋwíí akǝ ntɛk di bɛ́ɛ'],\n  STANDALONEMONTHS: ['ŋwíí a ntɔ́ntɔ', 'ŋwíí akǝ bɛ́ɛ', 'ŋwíí akǝ ráá', 'ŋwíí akǝ nin', 'ŋwíí akǝ táan', 'ŋwíí akǝ táafɔk', 'ŋwíí akǝ táabɛɛ', 'ŋwíí akǝ táaraa', 'ŋwíí akǝ táanin', 'ŋwíí akǝ ntɛk', 'ŋwíí akǝ ntɛk di bɔ́k', 'ŋwíí akǝ ntɛk di bɛ́ɛ'],\n  SHORTMONTHS: ['ŋ1', 'ŋ2', 'ŋ3', 'ŋ4', 'ŋ5', 'ŋ6', 'ŋ7', 'ŋ8', 'ŋ9', 'ŋ10', 'ŋ11', 'ŋ12'],\n  STANDALONESHORTMONTHS: ['ŋ1', 'ŋ2', 'ŋ3', 'ŋ4', 'ŋ5', 'ŋ6', 'ŋ7', 'ŋ8', 'ŋ9', 'ŋ10', 'ŋ11', 'ŋ12'],\n  WEEKDAYS: ['sɔ́ndǝ', 'lǝndí', 'maadí', 'mɛkrɛdí', 'jǝǝdí', 'júmbá', 'samdí'],\n  STANDALONEWEEKDAYS: ['sɔ́ndǝ', 'lǝndí', 'maadí', 'mɛkrɛdí', 'jǝǝdí', 'júmbá', 'samdí'],\n  SHORTWEEKDAYS: ['sɔ́n', 'lǝn', 'maa', 'mɛk', 'jǝǝ', 'júm', 'sam'],\n  STANDALONESHORTWEEKDAYS: ['sɔ́n', 'lǝn', 'maa', 'mɛk', 'jǝǝ', 'júm', 'sam'],\n  NARROWWEEKDAYS: ['s', 'l', 'm', 'm', 'j', 'j', 's'],\n  STANDALONENARROWWEEKDAYS: ['s', 'l', 'm', 'm', 'j', 'j', 's'],\n  SHORTQUARTERS: ['i1', 'i2', 'i3', 'i4'],\n  QUARTERS: ['id́ɛ́n kǝbǝk kǝ ntɔ́ntɔ́', 'idɛ́n kǝbǝk kǝ kǝbɛ́ɛ', 'idɛ́n kǝbǝk kǝ kǝráá', 'idɛ́n kǝbǝk kǝ kǝnin'],\n  AMPMS: ['sárúwá', 'cɛɛ́nko'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ksf_CM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ksf_CM = goog.i18n.DateTimeSymbols_ksf;\n\n\n/**\n * Date/time formatting symbols for locale ksh.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ksh = {\n  ERAS: ['v. Chr.', 'n. Chr.'],\n  ERANAMES: ['vür Krestos', 'noh Krestos'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'O', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'O', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Jannewa', 'Fäbrowa', 'Määz', 'Aprell', 'Mai', 'Juuni', 'Juuli', 'Oujoß', 'Septämber', 'Oktohber', 'Novämber', 'Dezämber'],\n  STANDALONEMONTHS: ['Jannewa', 'Fäbrowa', 'Määz', 'Aprell', 'Mai', 'Juuni', 'Juuli', 'Oujoß', 'Septämber', 'Oktohber', 'Novämber', 'Dezämber'],\n  SHORTMONTHS: ['Jan', 'Fäb', 'Mäz', 'Apr', 'Mai', 'Jun', 'Jul', 'Ouj', 'Säp', 'Okt', 'Nov', 'Dez'],\n  STANDALONESHORTMONTHS: ['Jan.', 'Fäb.', 'Mäz.', 'Apr.', 'Mai', 'Jun.', 'Jul.', 'Ouj.', 'Säp.', 'Okt.', 'Nov.', 'Dez.'],\n  WEEKDAYS: ['Sunndaach', 'Mohndaach', 'Dinnsdaach', 'Metwoch', 'Dunnersdaach', 'Friidaach', 'Samsdaach'],\n  STANDALONEWEEKDAYS: ['Sunndaach', 'Mohndaach', 'Dinnsdaach', 'Metwoch', 'Dunnersdaach', 'Friidaach', 'Samsdaach'],\n  SHORTWEEKDAYS: ['Su.', 'Mo.', 'Di.', 'Me.', 'Du.', 'Fr.', 'Sa.'],\n  STANDALONESHORTWEEKDAYS: ['Su.', 'Mo.', 'Di.', 'Me.', 'Du.', 'Fr.', 'Sa.'],\n  NARROWWEEKDAYS: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],\n  SHORTQUARTERS: ['1.Q.', '2.Q.', '3.Q.', '4.Q.'],\n  QUARTERS: ['1. Quattahl', '2. Quattahl', '3. Quattahl', '4. Quattahl'],\n  AMPMS: ['Uhr vörmiddaachs', 'Uhr nommendaachs'],\n  DATEFORMATS: ['EEEE, \\'dä\\' d. MMMM y', 'd. MMMM y', 'd. MMM. y', 'd. M. y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale ksh_DE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ksh_DE = goog.i18n.DateTimeSymbols_ksh;\n\n\n/**\n * Date/time formatting symbols for locale ku.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ku = {\n  ERAS: ['BZ', 'PZ'],\n  ERANAMES: ['berî zayînê', 'piştî zayînê'],\n  NARROWMONTHS: ['R', 'R', 'A', 'A', 'G', 'P', 'T', 'G', 'R', 'K', 'S', 'B'],\n  STANDALONENARROWMONTHS: ['R', 'R', 'A', 'A', 'G', 'P', 'T', 'G', 'R', 'K', 'S', 'B'],\n  MONTHS: ['rêbendanê', 'reşemiyê', 'adarê', 'avrêlê', 'gulanê', 'pûşperê', 'tîrmehê', 'gelawêjê', 'rezberê', 'kewçêrê', 'sermawezê', 'berfanbarê'],\n  STANDALONEMONTHS: ['rêbendan', 'reşemî', 'adar', 'avrêl', 'gulan', 'pûşper', 'tîrmeh', 'gelawêj', 'rezber', 'kewçêr', 'sermawez', 'berfanbar'],\n  SHORTMONTHS: ['rêb', 'reş', 'ada', 'avr', 'gul', 'pûş', 'tîr', 'gel', 'rez', 'kew', 'ser', 'ber'],\n  STANDALONESHORTMONTHS: ['rêb', 'reş', 'ada', 'avr', 'gul', 'pûş', 'tîr', 'gel', 'rez', 'kew', 'ser', 'ber'],\n  WEEKDAYS: ['yekşem', 'duşem', 'sêşem', 'çarşem', 'pêncşem', 'în', 'şemî'],\n  STANDALONEWEEKDAYS: ['yekşem', 'duşem', 'sêşem', 'çarşem', 'pêncşem', 'în', 'şemî'],\n  SHORTWEEKDAYS: ['yş', 'dş', 'sş', 'çş', 'pş', 'în', 'ş'],\n  STANDALONESHORTWEEKDAYS: ['yş', 'dş', 'sş', 'çş', 'pş', 'în', 'ş'],\n  NARROWWEEKDAYS: ['Y', 'D', 'S', 'Ç', 'P', 'Î', 'Ş'],\n  STANDALONENARROWWEEKDAYS: ['Y', 'D', 'S', 'Ç', 'P', 'Î', 'Ş'],\n  SHORTQUARTERS: ['Ç1', 'Ç2', 'Ç3', 'Ç4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ku_TR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ku_TR = goog.i18n.DateTimeSymbols_ku;\n\n\n/**\n * Date/time formatting symbols for locale kw.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kw = {\n  ERAS: ['RC', 'AD'],\n  ERANAMES: ['RC', 'AD'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['mis Genver', 'mis Hwevrer', 'mis Meurth', 'mis Ebrel', 'mis Me', 'mis Metheven', 'mis Gortheren', 'mis Est', 'mis Gwynngala', 'mis Hedra', 'mis Du', 'mis Kevardhu'],\n  STANDALONEMONTHS: ['mis Genver', 'mis Hwevrer', 'mis Meurth', 'mis Ebrel', 'mis Me', 'mis Metheven', 'mis Gortheren', 'mis Est', 'mis Gwynngala', 'mis Hedra', 'mis Du', 'mis Kevardhu'],\n  SHORTMONTHS: ['Gen', 'Hwe', 'Meu', 'Ebr', 'Me', 'Met', 'Gor', 'Est', 'Gwn', 'Hed', 'Du', 'Kev'],\n  STANDALONESHORTMONTHS: ['Gen', 'Hwe', 'Meu', 'Ebr', 'Me', 'Met', 'Gor', 'Est', 'Gwn', 'Hed', 'Du', 'Kev'],\n  WEEKDAYS: ['dy Sul', 'dy Lun', 'dy Meurth', 'dy Merher', 'dy Yow', 'dy Gwener', 'dy Sadorn'],\n  STANDALONEWEEKDAYS: ['dy Sul', 'dy Lun', 'dy Meurth', 'dy Merher', 'dy Yow', 'dy Gwener', 'dy Sadorn'],\n  SHORTWEEKDAYS: ['Sul', 'Lun', 'Mth', 'Mhr', 'Yow', 'Gwe', 'Sad'],\n  STANDALONESHORTWEEKDAYS: ['Sul', 'Lun', 'Mth', 'Mhr', 'Yow', 'Gwe', 'Sad'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale kw_GB.\n * @const\n */\ngoog.i18n.DateTimeSymbols_kw_GB = goog.i18n.DateTimeSymbols_kw;\n\n\n/**\n * Date/time formatting symbols for locale ky_KG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ky_KG = goog.i18n.DateTimeSymbols_ky;\n\n\n/**\n * Date/time formatting symbols for locale lag.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lag = {\n  ERAS: ['KSA', 'KA'],\n  ERANAMES: ['Kɨrɨsitʉ sɨ anavyaal', 'Kɨrɨsitʉ akavyaalwe'],\n  NARROWMONTHS: ['F', 'N', 'K', 'I', 'I', 'I', 'M', 'V', 'S', 'I', 'S', 'S'],\n  STANDALONENARROWMONTHS: ['F', 'N', 'K', 'I', 'I', 'I', 'M', 'V', 'S', 'I', 'S', 'S'],\n  MONTHS: ['Kʉfúngatɨ', 'Kʉnaanɨ', 'Kʉkeenda', 'Kwiikumi', 'Kwiinyambála', 'Kwiidwaata', 'Kʉmʉʉnchɨ', 'Kʉvɨɨrɨ', 'Kʉsaatʉ', 'Kwiinyi', 'Kʉsaano', 'Kʉsasatʉ'],\n  STANDALONEMONTHS: ['Kʉfúngatɨ', 'Kʉnaanɨ', 'Kʉkeenda', 'Kwiikumi', 'Kwiinyambála', 'Kwiidwaata', 'Kʉmʉʉnchɨ', 'Kʉvɨɨrɨ', 'Kʉsaatʉ', 'Kwiinyi', 'Kʉsaano', 'Kʉsasatʉ'],\n  SHORTMONTHS: ['Fúngatɨ', 'Naanɨ', 'Keenda', 'Ikúmi', 'Inyambala', 'Idwaata', 'Mʉʉnchɨ', 'Vɨɨrɨ', 'Saatʉ', 'Inyi', 'Saano', 'Sasatʉ'],\n  STANDALONESHORTMONTHS: ['Fúngatɨ', 'Naanɨ', 'Keenda', 'Ikúmi', 'Inyambala', 'Idwaata', 'Mʉʉnchɨ', 'Vɨɨrɨ', 'Saatʉ', 'Inyi', 'Saano', 'Sasatʉ'],\n  WEEKDAYS: ['Jumapíiri', 'Jumatátu', 'Jumaíne', 'Jumatáano', 'Alamíisi', 'Ijumáa', 'Jumamóosi'],\n  STANDALONEWEEKDAYS: ['Jumapíiri', 'Jumatátu', 'Jumaíne', 'Jumatáano', 'Alamíisi', 'Ijumáa', 'Jumamóosi'],\n  SHORTWEEKDAYS: ['Píili', 'Táatu', 'Íne', 'Táano', 'Alh', 'Ijm', 'Móosi'],\n  STANDALONESHORTWEEKDAYS: ['Píili', 'Táatu', 'Íne', 'Táano', 'Alh', 'Ijm', 'Móosi'],\n  NARROWWEEKDAYS: ['P', 'T', 'E', 'O', 'A', 'I', 'M'],\n  STANDALONENARROWWEEKDAYS: ['P', 'T', 'E', 'O', 'A', 'I', 'M'],\n  SHORTQUARTERS: ['Ncho 1', 'Ncho 2', 'Ncho 3', 'Ncho 4'],\n  QUARTERS: ['Ncholo ya 1', 'Ncholo ya 2', 'Ncholo ya 3', 'Ncholo ya 4'],\n  AMPMS: ['TOO', 'MUU'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale lag_TZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lag_TZ = goog.i18n.DateTimeSymbols_lag;\n\n\n/**\n * Date/time formatting symbols for locale lb.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lb = {\n  ERAS: ['v. Chr.', 'n. Chr.'],\n  ERANAMES: ['v. Chr.', 'n. Chr.'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januar', 'Februar', 'Mäerz', 'Abrëll', 'Mee', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],\n  STANDALONEMONTHS: ['Januar', 'Februar', 'Mäerz', 'Abrëll', 'Mee', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'],\n  SHORTMONTHS: ['Jan.', 'Feb.', 'Mäe.', 'Abr.', 'Mee', 'Juni', 'Juli', 'Aug.', 'Sep.', 'Okt.', 'Nov.', 'Dez.'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mäe', 'Abr', 'Mee', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dez'],\n  WEEKDAYS: ['Sonndeg', 'Méindeg', 'Dënschdeg', 'Mëttwoch', 'Donneschdeg', 'Freideg', 'Samschdeg'],\n  STANDALONEWEEKDAYS: ['Sonndeg', 'Méindeg', 'Dënschdeg', 'Mëttwoch', 'Donneschdeg', 'Freideg', 'Samschdeg'],\n  SHORTWEEKDAYS: ['Son.', 'Méi.', 'Dën.', 'Mët.', 'Don.', 'Fre.', 'Sam.'],\n  STANDALONESHORTWEEKDAYS: ['Son', 'Méi', 'Dën', 'Mët', 'Don', 'Fre', 'Sam'],\n  NARROWWEEKDAYS: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'D', 'M', 'D', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1. Quartal', '2. Quartal', '3. Quartal', '4. Quartal'],\n  AMPMS: ['moies', 'nomëttes'],\n  DATEFORMATS: ['EEEE, d. MMMM y', 'd. MMMM y', 'd. MMM y', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale lb_LU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lb_LU = goog.i18n.DateTimeSymbols_lb;\n\n\n/**\n * Date/time formatting symbols for locale lg.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lg = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Kulisito nga tannaza', 'Bukya Kulisito Azaal'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Janwaliyo', 'Febwaliyo', 'Marisi', 'Apuli', 'Maayi', 'Juuni', 'Julaayi', 'Agusito', 'Sebuttemba', 'Okitobba', 'Novemba', 'Desemba'],\n  STANDALONEMONTHS: ['Janwaliyo', 'Febwaliyo', 'Marisi', 'Apuli', 'Maayi', 'Juuni', 'Julaayi', 'Agusito', 'Sebuttemba', 'Okitobba', 'Novemba', 'Desemba'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apu', 'Maa', 'Juu', 'Jul', 'Agu', 'Seb', 'Oki', 'Nov', 'Des'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apu', 'Maa', 'Juu', 'Jul', 'Agu', 'Seb', 'Oki', 'Nov', 'Des'],\n  WEEKDAYS: ['Sabbiiti', 'Balaza', 'Lwakubiri', 'Lwakusatu', 'Lwakuna', 'Lwakutaano', 'Lwamukaaga'],\n  STANDALONEWEEKDAYS: ['Sabbiiti', 'Balaza', 'Lwakubiri', 'Lwakusatu', 'Lwakuna', 'Lwakutaano', 'Lwamukaaga'],\n  SHORTWEEKDAYS: ['Sab', 'Bal', 'Lw2', 'Lw3', 'Lw4', 'Lw5', 'Lw6'],\n  STANDALONESHORTWEEKDAYS: ['Sab', 'Bal', 'Lw2', 'Lw3', 'Lw4', 'Lw5', 'Lw6'],\n  NARROWWEEKDAYS: ['S', 'B', 'L', 'L', 'L', 'L', 'L'],\n  STANDALONENARROWWEEKDAYS: ['S', 'B', 'L', 'L', 'L', 'L', 'L'],\n  SHORTQUARTERS: ['Kya1', 'Kya2', 'Kya3', 'Kya4'],\n  QUARTERS: ['Kyakuna 1', 'Kyakuna 2', 'Kyakuna 3', 'Kyakuna 4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale lg_UG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lg_UG = goog.i18n.DateTimeSymbols_lg;\n\n\n/**\n * Date/time formatting symbols for locale lkt.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lkt = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['Wiótheȟika Wí', 'Thiyóȟeyuŋka Wí', 'Ištáwičhayazaŋ Wí', 'Pȟežítȟo Wí', 'Čhaŋwápetȟo Wí', 'Wípazukȟa-wašté Wí', 'Čhaŋpȟásapa Wí', 'Wasútȟuŋ Wí', 'Čhaŋwápeǧi Wí', 'Čhaŋwápe-kasná Wí', 'Waníyetu Wí', 'Tȟahékapšuŋ Wí'],\n  STANDALONEMONTHS: ['Wiótheȟika Wí', 'Thiyóȟeyuŋka Wí', 'Ištáwičhayazaŋ Wí', 'Pȟežítȟo Wí', 'Čhaŋwápetȟo Wí', 'Wípazukȟa-wašté Wí', 'Čhaŋpȟásapa Wí', 'Wasútȟuŋ Wí', 'Čhaŋwápeǧi Wí', 'Čhaŋwápe-kasná Wí', 'Waníyetu Wí', 'Tȟahékapšuŋ Wí'],\n  SHORTMONTHS: ['Wiótheȟika Wí', 'Thiyóȟeyuŋka Wí', 'Ištáwičhayazaŋ Wí', 'Pȟežítȟo Wí', 'Čhaŋwápetȟo Wí', 'Wípazukȟa-wašté Wí', 'Čhaŋpȟásapa Wí', 'Wasútȟuŋ Wí', 'Čhaŋwápeǧi Wí', 'Čhaŋwápe-kasná Wí', 'Waníyetu Wí', 'Tȟahékapšuŋ Wí'],\n  STANDALONESHORTMONTHS: ['Wiótheȟika Wí', 'Thiyóȟeyuŋka Wí', 'Ištáwičhayazaŋ Wí', 'Pȟežítȟo Wí', 'Čhaŋwápetȟo Wí', 'Wípazukȟa-wašté Wí', 'Čhaŋpȟásapa Wí', 'Wasútȟuŋ Wí', 'Čhaŋwápeǧi Wí', 'Čhaŋwápe-kasná Wí', 'Waníyetu Wí', 'Tȟahékapšuŋ Wí'],\n  WEEKDAYS: ['Aŋpétuwakȟaŋ', 'Aŋpétuwaŋži', 'Aŋpétunuŋpa', 'Aŋpétuyamni', 'Aŋpétutopa', 'Aŋpétuzaptaŋ', 'Owáŋgyužažapi'],\n  STANDALONEWEEKDAYS: ['Aŋpétuwakȟaŋ', 'Aŋpétuwaŋži', 'Aŋpétunuŋpa', 'Aŋpétuyamni', 'Aŋpétutopa', 'Aŋpétuzaptaŋ', 'Owáŋgyužažapi'],\n  SHORTWEEKDAYS: ['Aŋpétuwakȟaŋ', 'Aŋpétuwaŋži', 'Aŋpétunuŋpa', 'Aŋpétuyamni', 'Aŋpétutopa', 'Aŋpétuzaptaŋ', 'Owáŋgyužažapi'],\n  STANDALONESHORTWEEKDAYS: ['Aŋpétuwakȟaŋ', 'Aŋpétuwaŋži', 'Aŋpétunuŋpa', 'Aŋpétuyamni', 'Aŋpétutopa', 'Aŋpétuzaptaŋ', 'Owáŋgyužažapi'],\n  NARROWWEEKDAYS: ['A', 'W', 'N', 'Y', 'T', 'Z', 'O'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'MMMM d, y', 'MMM d, y', 'M/d/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale lkt_US.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lkt_US = goog.i18n.DateTimeSymbols_lkt;\n\n\n/**\n * Date/time formatting symbols for locale ln_AO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ln_AO = goog.i18n.DateTimeSymbols_ln;\n\n\n/**\n * Date/time formatting symbols for locale ln_CD.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ln_CD = goog.i18n.DateTimeSymbols_ln;\n\n\n/**\n * Date/time formatting symbols for locale ln_CF.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ln_CF = goog.i18n.DateTimeSymbols_ln;\n\n\n/**\n * Date/time formatting symbols for locale ln_CG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ln_CG = goog.i18n.DateTimeSymbols_ln;\n\n\n/**\n * Date/time formatting symbols for locale lo_LA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lo_LA = goog.i18n.DateTimeSymbols_lo;\n\n\n/**\n * Date/time formatting symbols for locale lrc.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lrc = {\n  ZERODIGIT: 0x06F0,\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['جانڤیە', 'فئڤریە', 'مارس', 'آڤریل', 'مئی', 'جوٙأن', 'جوٙلا', 'آگوست', 'سئپتامر', 'ئوکتوڤر', 'نوڤامر', 'دئسامر'],\n  STANDALONEMONTHS: ['جانڤیە', 'فئڤریە', 'مارس', 'آڤریل', 'مئی', 'جوٙأن', 'جوٙلا', 'آگوست', 'سئپتامر', 'ئوکتوڤر', 'نوڤامر', 'دئسامر'],\n  SHORTMONTHS: ['جانڤیە', 'فئڤریە', 'مارس', 'آڤریل', 'مئی', 'جوٙأن', 'جوٙلا', 'آگوست', 'سئپتامر', 'ئوکتوڤر', 'نوڤامر', 'دئسامر'],\n  STANDALONESHORTMONTHS: ['جانڤیە', 'فئڤریە', 'مارس', 'آڤریل', 'مئی', 'جوٙأن', 'جوٙلا', 'آگوست', 'سئپتامر', 'ئوکتوڤر', 'نوڤامر', 'دئسامر'],\n  WEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONEWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 4],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale lrc_IQ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lrc_IQ = {\n  ZERODIGIT: 0x06F0,\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['جانڤیە', 'فئڤریە', 'مارس', 'آڤریل', 'مئی', 'جوٙأن', 'جوٙلا', 'آگوست', 'سئپتامر', 'ئوکتوڤر', 'نوڤامر', 'دئسامر'],\n  STANDALONEMONTHS: ['جانڤیە', 'فئڤریە', 'مارس', 'آڤریل', 'مئی', 'جوٙأن', 'جوٙلا', 'آگوست', 'سئپتامر', 'ئوکتوڤر', 'نوڤامر', 'دئسامر'],\n  SHORTMONTHS: ['جانڤیە', 'فئڤریە', 'مارس', 'آڤریل', 'مئی', 'جوٙأن', 'جوٙلا', 'آگوست', 'سئپتامر', 'ئوکتوڤر', 'نوڤامر', 'دئسامر'],\n  STANDALONESHORTMONTHS: ['جانڤیە', 'فئڤریە', 'مارس', 'آڤریل', 'مئی', 'جوٙأن', 'جوٙلا', 'آگوست', 'سئپتامر', 'ئوکتوڤر', 'نوڤامر', 'دئسامر'],\n  WEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONEWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 5],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale lrc_IR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lrc_IR = goog.i18n.DateTimeSymbols_lrc;\n\n\n/**\n * Date/time formatting symbols for locale lt_LT.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lt_LT = goog.i18n.DateTimeSymbols_lt;\n\n\n/**\n * Date/time formatting symbols for locale lu.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lu = {\n  ERAS: ['kmp. Y.K.', 'kny. Y. K.'],\n  ERANAMES: ['Kumpala kwa Yezu Kli', 'Kunyima kwa Yezu Kli'],\n  NARROWMONTHS: ['C', 'L', 'L', 'M', 'L', 'L', 'K', 'L', 'L', 'L', 'K', 'C'],\n  STANDALONENARROWMONTHS: ['C', 'L', 'L', 'M', 'L', 'L', 'K', 'L', 'L', 'L', 'K', 'C'],\n  MONTHS: ['Ciongo', 'Lùishi', 'Lusòlo', 'Mùuyà', 'Lumùngùlù', 'Lufuimi', 'Kabàlàshìpù', 'Lùshìkà', 'Lutongolo', 'Lungùdi', 'Kaswèkèsè', 'Ciswà'],\n  STANDALONEMONTHS: ['Ciongo', 'Lùishi', 'Lusòlo', 'Mùuyà', 'Lumùngùlù', 'Lufuimi', 'Kabàlàshìpù', 'Lùshìkà', 'Lutongolo', 'Lungùdi', 'Kaswèkèsè', 'Ciswà'],\n  SHORTMONTHS: ['Cio', 'Lui', 'Lus', 'Muu', 'Lum', 'Luf', 'Kab', 'Lush', 'Lut', 'Lun', 'Kas', 'Cis'],\n  STANDALONESHORTMONTHS: ['Cio', 'Lui', 'Lus', 'Muu', 'Lum', 'Luf', 'Kab', 'Lush', 'Lut', 'Lun', 'Kas', 'Cis'],\n  WEEKDAYS: ['Lumingu', 'Nkodya', 'Ndàayà', 'Ndangù', 'Njòwa', 'Ngòvya', 'Lubingu'],\n  STANDALONEWEEKDAYS: ['Lumingu', 'Nkodya', 'Ndàayà', 'Ndangù', 'Njòwa', 'Ngòvya', 'Lubingu'],\n  SHORTWEEKDAYS: ['Lum', 'Nko', 'Ndy', 'Ndg', 'Njw', 'Ngv', 'Lub'],\n  STANDALONESHORTWEEKDAYS: ['Lum', 'Nko', 'Ndy', 'Ndg', 'Njw', 'Ngv', 'Lub'],\n  NARROWWEEKDAYS: ['L', 'N', 'N', 'N', 'N', 'N', 'L'],\n  STANDALONENARROWWEEKDAYS: ['L', 'N', 'N', 'N', 'N', 'N', 'L'],\n  SHORTQUARTERS: ['M1', 'M2', 'M3', 'M4'],\n  QUARTERS: ['Mueji 1', 'Mueji 2', 'Mueji 3', 'Mueji 4'],\n  AMPMS: ['Dinda', 'Dilolo'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale lu_CD.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lu_CD = goog.i18n.DateTimeSymbols_lu;\n\n\n/**\n * Date/time formatting symbols for locale luo.\n * @const\n */\ngoog.i18n.DateTimeSymbols_luo = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Kapok Kristo obiro', 'Ka Kristo osebiro'],\n  NARROWMONTHS: ['C', 'R', 'D', 'N', 'B', 'U', 'B', 'B', 'C', 'P', 'C', 'P'],\n  STANDALONENARROWMONTHS: ['C', 'R', 'D', 'N', 'B', 'U', 'B', 'B', 'C', 'P', 'C', 'P'],\n  MONTHS: ['Dwe mar Achiel', 'Dwe mar Ariyo', 'Dwe mar Adek', 'Dwe mar Ang’wen', 'Dwe mar Abich', 'Dwe mar Auchiel', 'Dwe mar Abiriyo', 'Dwe mar Aboro', 'Dwe mar Ochiko', 'Dwe mar Apar', 'Dwe mar gi achiel', 'Dwe mar Apar gi ariyo'],\n  STANDALONEMONTHS: ['Dwe mar Achiel', 'Dwe mar Ariyo', 'Dwe mar Adek', 'Dwe mar Ang’wen', 'Dwe mar Abich', 'Dwe mar Auchiel', 'Dwe mar Abiriyo', 'Dwe mar Aboro', 'Dwe mar Ochiko', 'Dwe mar Apar', 'Dwe mar gi achiel', 'Dwe mar Apar gi ariyo'],\n  SHORTMONTHS: ['DAC', 'DAR', 'DAD', 'DAN', 'DAH', 'DAU', 'DAO', 'DAB', 'DOC', 'DAP', 'DGI', 'DAG'],\n  STANDALONESHORTMONTHS: ['DAC', 'DAR', 'DAD', 'DAN', 'DAH', 'DAU', 'DAO', 'DAB', 'DOC', 'DAP', 'DGI', 'DAG'],\n  WEEKDAYS: ['Jumapil', 'Wuok Tich', 'Tich Ariyo', 'Tich Adek', 'Tich Ang’wen', 'Tich Abich', 'Ngeso'],\n  STANDALONEWEEKDAYS: ['Jumapil', 'Wuok Tich', 'Tich Ariyo', 'Tich Adek', 'Tich Ang’wen', 'Tich Abich', 'Ngeso'],\n  SHORTWEEKDAYS: ['JMP', 'WUT', 'TAR', 'TAD', 'TAN', 'TAB', 'NGS'],\n  STANDALONESHORTWEEKDAYS: ['JMP', 'WUT', 'TAR', 'TAD', 'TAN', 'TAB', 'NGS'],\n  NARROWWEEKDAYS: ['J', 'W', 'T', 'T', 'T', 'T', 'N'],\n  STANDALONENARROWWEEKDAYS: ['J', 'W', 'T', 'T', 'T', 'T', 'N'],\n  SHORTQUARTERS: ['NMN1', 'NMN2', 'NMN3', 'NMN4'],\n  QUARTERS: ['nus mar nus 1', 'nus mar nus 2', 'nus mar nus 3', 'nus mar nus 4'],\n  AMPMS: ['OD', 'OT'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale luo_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_luo_KE = goog.i18n.DateTimeSymbols_luo;\n\n\n/**\n * Date/time formatting symbols for locale luy.\n * @const\n */\ngoog.i18n.DateTimeSymbols_luy = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Imberi ya Kuuza Kwa', 'Muhiga Kuvita Kuuza'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  STANDALONEMONTHS: ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  WEEKDAYS: ['Jumapiri', 'Jumatatu', 'Jumanne', 'Jumatano', 'Murwa wa Kanne', 'Murwa wa Katano', 'Jumamosi'],\n  STANDALONEWEEKDAYS: ['Jumapiri', 'Jumatatu', 'Jumanne', 'Jumatano', 'Murwa wa Kanne', 'Murwa wa Katano', 'Jumamosi'],\n  SHORTWEEKDAYS: ['J2', 'J3', 'J4', 'J5', 'Al', 'Ij', 'J1'],\n  STANDALONESHORTWEEKDAYS: ['J2', 'J3', 'J4', 'J5', 'Al', 'Ij', 'J1'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Robo ya Kala', 'Robo ya Kaviri', 'Robo ya Kavaga', 'Robo ya Kanne'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale luy_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_luy_KE = goog.i18n.DateTimeSymbols_luy;\n\n\n/**\n * Date/time formatting symbols for locale lv_LV.\n * @const\n */\ngoog.i18n.DateTimeSymbols_lv_LV = goog.i18n.DateTimeSymbols_lv;\n\n\n/**\n * Date/time formatting symbols for locale mas.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mas = {\n  ERAS: ['MY', 'EY'],\n  ERANAMES: ['Meínō Yɛ́sʉ', 'Eínō Yɛ́sʉ'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['Oladalʉ́', 'Arát', 'Ɔɛnɨ́ɔɨŋɔk', 'Olodoyíóríê inkókúâ', 'Oloilépūnyīē inkókúâ', 'Kújúɔrɔk', 'Mórusásin', 'Ɔlɔ́ɨ́bɔ́rárɛ', 'Kúshîn', 'Olgísan', 'Pʉshʉ́ka', 'Ntʉ́ŋʉ́s'],\n  STANDALONEMONTHS: ['Oladalʉ́', 'Arát', 'Ɔɛnɨ́ɔɨŋɔk', 'Olodoyíóríê inkókúâ', 'Oloilépūnyīē inkókúâ', 'Kújúɔrɔk', 'Mórusásin', 'Ɔlɔ́ɨ́bɔ́rárɛ', 'Kúshîn', 'Olgísan', 'Pʉshʉ́ka', 'Ntʉ́ŋʉ́s'],\n  SHORTMONTHS: ['Dal', 'Ará', 'Ɔɛn', 'Doy', 'Lép', 'Rok', 'Sás', 'Bɔ́r', 'Kús', 'Gís', 'Shʉ́', 'Ntʉ́'],\n  STANDALONESHORTMONTHS: ['Dal', 'Ará', 'Ɔɛn', 'Doy', 'Lép', 'Rok', 'Sás', 'Bɔ́r', 'Kús', 'Gís', 'Shʉ́', 'Ntʉ́'],\n  WEEKDAYS: ['Jumapílí', 'Jumatátu', 'Jumane', 'Jumatánɔ', 'Alaámisi', 'Jumáa', 'Jumamósi'],\n  STANDALONEWEEKDAYS: ['Jumapílí', 'Jumatátu', 'Jumane', 'Jumatánɔ', 'Alaámisi', 'Jumáa', 'Jumamósi'],\n  SHORTWEEKDAYS: ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'],\n  STANDALONESHORTWEEKDAYS: ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'],\n  NARROWWEEKDAYS: ['2', '3', '4', '5', '6', '7', '1'],\n  STANDALONENARROWWEEKDAYS: ['2', '3', '4', '5', '6', '7', '1'],\n  SHORTQUARTERS: ['E1', 'E2', 'E3', 'E4'],\n  QUARTERS: ['Erobo 1', 'Erobo 2', 'Erobo 3', 'Erobo 4'],\n  AMPMS: ['Ɛnkakɛnyá', 'Ɛndámâ'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale mas_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mas_KE = goog.i18n.DateTimeSymbols_mas;\n\n\n/**\n * Date/time formatting symbols for locale mas_TZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mas_TZ = {\n  ERAS: ['MY', 'EY'],\n  ERANAMES: ['Meínō Yɛ́sʉ', 'Eínō Yɛ́sʉ'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['Oladalʉ́', 'Arát', 'Ɔɛnɨ́ɔɨŋɔk', 'Olodoyíóríê inkókúâ', 'Oloilépūnyīē inkókúâ', 'Kújúɔrɔk', 'Mórusásin', 'Ɔlɔ́ɨ́bɔ́rárɛ', 'Kúshîn', 'Olgísan', 'Pʉshʉ́ka', 'Ntʉ́ŋʉ́s'],\n  STANDALONEMONTHS: ['Oladalʉ́', 'Arát', 'Ɔɛnɨ́ɔɨŋɔk', 'Olodoyíóríê inkókúâ', 'Oloilépūnyīē inkókúâ', 'Kújúɔrɔk', 'Mórusásin', 'Ɔlɔ́ɨ́bɔ́rárɛ', 'Kúshîn', 'Olgísan', 'Pʉshʉ́ka', 'Ntʉ́ŋʉ́s'],\n  SHORTMONTHS: ['Dal', 'Ará', 'Ɔɛn', 'Doy', 'Lép', 'Rok', 'Sás', 'Bɔ́r', 'Kús', 'Gís', 'Shʉ́', 'Ntʉ́'],\n  STANDALONESHORTMONTHS: ['Dal', 'Ará', 'Ɔɛn', 'Doy', 'Lép', 'Rok', 'Sás', 'Bɔ́r', 'Kús', 'Gís', 'Shʉ́', 'Ntʉ́'],\n  WEEKDAYS: ['Jumapílí', 'Jumatátu', 'Jumane', 'Jumatánɔ', 'Alaámisi', 'Jumáa', 'Jumamósi'],\n  STANDALONEWEEKDAYS: ['Jumapílí', 'Jumatátu', 'Jumane', 'Jumatánɔ', 'Alaámisi', 'Jumáa', 'Jumamósi'],\n  SHORTWEEKDAYS: ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'],\n  STANDALONESHORTWEEKDAYS: ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'],\n  NARROWWEEKDAYS: ['2', '3', '4', '5', '6', '7', '1'],\n  STANDALONENARROWWEEKDAYS: ['2', '3', '4', '5', '6', '7', '1'],\n  SHORTQUARTERS: ['E1', 'E2', 'E3', 'E4'],\n  QUARTERS: ['Erobo 1', 'Erobo 2', 'Erobo 3', 'Erobo 4'],\n  AMPMS: ['Ɛnkakɛnyá', 'Ɛndámâ'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale mer.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mer = {\n  ERAS: ['MK', 'NK'],\n  ERANAMES: ['Mbere ya Kristũ', 'Nyuma ya Kristũ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'Ĩ', 'M', 'N', 'N', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'Ĩ', 'M', 'N', 'N', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januarĩ', 'Feburuarĩ', 'Machi', 'Ĩpurũ', 'Mĩĩ', 'Njuni', 'Njuraĩ', 'Agasti', 'Septemba', 'Oktũba', 'Novemba', 'Dicemba'],\n  STANDALONEMONTHS: ['Januarĩ', 'Feburuarĩ', 'Machi', 'Ĩpurũ', 'Mĩĩ', 'Njuni', 'Njuraĩ', 'Agasti', 'Septemba', 'Oktũba', 'Novemba', 'Dicemba'],\n  SHORTMONTHS: ['JAN', 'FEB', 'MAC', 'ĨPU', 'MĨĨ', 'NJU', 'NJR', 'AGA', 'SPT', 'OKT', 'NOV', 'DEC'],\n  STANDALONESHORTMONTHS: ['JAN', 'FEB', 'MAC', 'ĨPU', 'MĨĨ', 'NJU', 'NJR', 'AGA', 'SPT', 'OKT', 'NOV', 'DEC'],\n  WEEKDAYS: ['Kiumia', 'Muramuko', 'Wairi', 'Wethatu', 'Wena', 'Wetano', 'Jumamosi'],\n  STANDALONEWEEKDAYS: ['Kiumia', 'Muramuko', 'Wairi', 'Wethatu', 'Wena', 'Wetano', 'Jumamosi'],\n  SHORTWEEKDAYS: ['KIU', 'MRA', 'WAI', 'WET', 'WEN', 'WTN', 'JUM'],\n  STANDALONESHORTWEEKDAYS: ['KIU', 'MRA', 'WAI', 'WET', 'WEN', 'WTN', 'JUM'],\n  NARROWWEEKDAYS: ['K', 'M', 'W', 'W', 'W', 'W', 'J'],\n  STANDALONENARROWWEEKDAYS: ['K', 'M', 'W', 'W', 'W', 'W', 'J'],\n  SHORTQUARTERS: ['Ĩmwe kĩrĩ inya', 'Ijĩrĩ kĩrĩ inya', 'Ithatũ kĩrĩ inya', 'Inya kĩrĩ inya'],\n  QUARTERS: ['Ĩmwe kĩrĩ inya', 'Ijĩrĩ kĩrĩ inya', 'Ithatũ kĩrĩ inya', 'Inya kĩrĩ inya'],\n  AMPMS: ['RŨ', 'ŨG'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale mer_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mer_KE = goog.i18n.DateTimeSymbols_mer;\n\n\n/**\n * Date/time formatting symbols for locale mfe.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mfe = {\n  ERAS: ['av. Z-K', 'ap. Z-K'],\n  ERANAMES: ['avan Zezi-Krist', 'apre Zezi-Krist'],\n  NARROWMONTHS: ['z', 'f', 'm', 'a', 'm', 'z', 'z', 'o', 's', 'o', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['z', 'f', 'm', 'a', 'm', 'z', 'z', 'o', 's', 'o', 'n', 'd'],\n  MONTHS: ['zanvie', 'fevriye', 'mars', 'avril', 'me', 'zin', 'zilye', 'out', 'septam', 'oktob', 'novam', 'desam'],\n  STANDALONEMONTHS: ['zanvie', 'fevriye', 'mars', 'avril', 'me', 'zin', 'zilye', 'out', 'septam', 'oktob', 'novam', 'desam'],\n  SHORTMONTHS: ['zan', 'fev', 'mar', 'avr', 'me', 'zin', 'zil', 'out', 'sep', 'okt', 'nov', 'des'],\n  STANDALONESHORTMONTHS: ['zan', 'fev', 'mar', 'avr', 'me', 'zin', 'zil', 'out', 'sep', 'okt', 'nov', 'des'],\n  WEEKDAYS: ['dimans', 'lindi', 'mardi', 'merkredi', 'zedi', 'vandredi', 'samdi'],\n  STANDALONEWEEKDAYS: ['dimans', 'lindi', 'mardi', 'merkredi', 'zedi', 'vandredi', 'samdi'],\n  SHORTWEEKDAYS: ['dim', 'lin', 'mar', 'mer', 'ze', 'van', 'sam'],\n  STANDALONESHORTWEEKDAYS: ['dim', 'lin', 'mar', 'mer', 'ze', 'van', 'sam'],\n  NARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'z', 'v', 's'],\n  STANDALONENARROWWEEKDAYS: ['d', 'l', 'm', 'm', 'z', 'v', 's'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1e trimes', '2em trimes', '3em trimes', '4em trimes'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale mfe_MU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mfe_MU = goog.i18n.DateTimeSymbols_mfe;\n\n\n/**\n * Date/time formatting symbols for locale mg.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mg = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Alohan’i JK', 'Aorian’i JK'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Janoary', 'Febroary', 'Martsa', 'Aprily', 'Mey', 'Jona', 'Jolay', 'Aogositra', 'Septambra', 'Oktobra', 'Novambra', 'Desambra'],\n  STANDALONEMONTHS: ['Janoary', 'Febroary', 'Martsa', 'Aprily', 'Mey', 'Jona', 'Jolay', 'Aogositra', 'Septambra', 'Oktobra', 'Novambra', 'Desambra'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'Mey', 'Jon', 'Jol', 'Aog', 'Sep', 'Okt', 'Nov', 'Des'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'Mey', 'Jon', 'Jol', 'Aog', 'Sep', 'Okt', 'Nov', 'Des'],\n  WEEKDAYS: ['Alahady', 'Alatsinainy', 'Talata', 'Alarobia', 'Alakamisy', 'Zoma', 'Asabotsy'],\n  STANDALONEWEEKDAYS: ['Alahady', 'Alatsinainy', 'Talata', 'Alarobia', 'Alakamisy', 'Zoma', 'Asabotsy'],\n  SHORTWEEKDAYS: ['Alah', 'Alats', 'Tal', 'Alar', 'Alak', 'Zom', 'Asab'],\n  STANDALONESHORTWEEKDAYS: ['Alah', 'Alats', 'Tal', 'Alar', 'Alak', 'Zom', 'Asab'],\n  NARROWWEEKDAYS: ['A', 'A', 'T', 'A', 'A', 'Z', 'A'],\n  STANDALONENARROWWEEKDAYS: ['A', 'A', 'T', 'A', 'A', 'Z', 'A'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['Telovolana voalohany', 'Telovolana faharoa', 'Telovolana fahatelo', 'Telovolana fahefatra'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale mg_MG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mg_MG = goog.i18n.DateTimeSymbols_mg;\n\n\n/**\n * Date/time formatting symbols for locale mgh.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mgh = {\n  ERAS: ['HY', 'YY'],\n  ERANAMES: ['Hinapiya yesu', 'Yopia yesu'],\n  NARROWMONTHS: ['K', 'U', 'R', 'C', 'T', 'M', 'S', 'N', 'T', 'K', 'M', 'Y'],\n  STANDALONENARROWMONTHS: ['K', 'U', 'R', 'C', 'T', 'M', 'S', 'N', 'T', 'K', 'M', 'Y'],\n  MONTHS: ['Mweri wo kwanza', 'Mweri wo unayeli', 'Mweri wo uneraru', 'Mweri wo unecheshe', 'Mweri wo unethanu', 'Mweri wo thanu na mocha', 'Mweri wo saba', 'Mweri wo nane', 'Mweri wo tisa', 'Mweri wo kumi', 'Mweri wo kumi na moja', 'Mweri wo kumi na yel’li'],\n  STANDALONEMONTHS: ['Mweri wo kwanza', 'Mweri wo unayeli', 'Mweri wo uneraru', 'Mweri wo unecheshe', 'Mweri wo unethanu', 'Mweri wo thanu na mocha', 'Mweri wo saba', 'Mweri wo nane', 'Mweri wo tisa', 'Mweri wo kumi', 'Mweri wo kumi na moja', 'Mweri wo kumi na yel’li'],\n  SHORTMONTHS: ['Kwa', 'Una', 'Rar', 'Che', 'Tha', 'Moc', 'Sab', 'Nan', 'Tis', 'Kum', 'Moj', 'Yel'],\n  STANDALONESHORTMONTHS: ['Kwa', 'Una', 'Rar', 'Che', 'Tha', 'Moc', 'Sab', 'Nan', 'Tis', 'Kum', 'Moj', 'Yel'],\n  WEEKDAYS: ['Sabato', 'Jumatatu', 'Jumanne', 'Jumatano', 'Arahamisi', 'Ijumaa', 'Jumamosi'],\n  STANDALONEWEEKDAYS: ['Sabato', 'Jumatatu', 'Jumanne', 'Jumatano', 'Arahamisi', 'Ijumaa', 'Jumamosi'],\n  SHORTWEEKDAYS: ['Sab', 'Jtt', 'Jnn', 'Jtn', 'Ara', 'Iju', 'Jmo'],\n  STANDALONESHORTWEEKDAYS: ['Sab', 'Jtt', 'Jnn', 'Jtn', 'Ara', 'Iju', 'Jmo'],\n  NARROWWEEKDAYS: ['S', 'J', 'J', 'J', 'A', 'I', 'J'],\n  STANDALONENARROWWEEKDAYS: ['S', 'J', 'J', 'J', 'A', 'I', 'J'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['wichishu', 'mchochil’l'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale mgh_MZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mgh_MZ = goog.i18n.DateTimeSymbols_mgh;\n\n\n/**\n * Date/time formatting symbols for locale mgo.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mgo = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['M1', 'A2', 'M3', 'N4', 'F5', 'I6', 'A7', 'I8', 'K9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['M1', 'A2', 'M3', 'N4', 'F5', 'I6', 'A7', 'I8', 'K9', '10', '11', '12'],\n  MONTHS: ['iməg mbegtug', 'imeg àbùbì', 'imeg mbəŋchubi', 'iməg ngwə̀t', 'iməg fog', 'iməg ichiibɔd', 'iməg àdùmbə̀ŋ', 'iməg ichika', 'iməg kud', 'iməg tèsiʼe', 'iməg zò', 'iməg krizmed'],\n  STANDALONEMONTHS: ['iməg mbegtug', 'imeg àbùbì', 'imeg mbəŋchubi', 'iməg ngwə̀t', 'iməg fog', 'iməg ichiibɔd', 'iməg àdùmbə̀ŋ', 'iməg ichika', 'iməg kud', 'iməg tèsiʼe', 'iməg zò', 'iməg krizmed'],\n  SHORTMONTHS: ['mbegtug', 'imeg àbùbì', 'imeg mbəŋchubi', 'iməg ngwə̀t', 'iməg fog', 'iməg ichiibɔd', 'iməg àdùmbə̀ŋ', 'iməg ichika', 'iməg kud', 'iməg tèsiʼe', 'iməg zò', 'iməg krizmed'],\n  STANDALONESHORTMONTHS: ['mbegtug', 'imeg àbùbì', 'imeg mbəŋchubi', 'iməg ngwə̀t', 'iməg fog', 'iməg ichiibɔd', 'iməg àdùmbə̀ŋ', 'iməg ichika', 'iməg kud', 'iməg tèsiʼe', 'iməg zò', 'iməg krizmed'],\n  WEEKDAYS: ['Aneg 1', 'Aneg 2', 'Aneg 3', 'Aneg 4', 'Aneg 5', 'Aneg 6', 'Aneg 7'],\n  STANDALONEWEEKDAYS: ['Aneg 1', 'Aneg 2', 'Aneg 3', 'Aneg 4', 'Aneg 5', 'Aneg 6', 'Aneg 7'],\n  SHORTWEEKDAYS: ['Aneg 1', 'Aneg 2', 'Aneg 3', 'Aneg 4', 'Aneg 5', 'Aneg 6', 'Aneg 7'],\n  STANDALONESHORTWEEKDAYS: ['Aneg 1', 'Aneg 2', 'Aneg 3', 'Aneg 4', 'Aneg 5', 'Aneg 6', 'Aneg 7'],\n  NARROWWEEKDAYS: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7'],\n  STANDALONENARROWWEEKDAYS: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6', 'A7'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, y MMMM dd', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale mgo_CM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mgo_CM = goog.i18n.DateTimeSymbols_mgo;\n\n\n/**\n * Date/time formatting symbols for locale mi.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mi = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['K', 'H', 'P', 'P', 'H', 'P', 'H', 'H', 'M', 'N', 'R', 'H'],\n  STANDALONENARROWMONTHS: ['K', 'H', 'P', 'P', 'H', 'P', 'H', 'H', 'M', 'N', 'R', 'H'],\n  MONTHS: ['Kohitātea', 'Huitanguru', 'Poutūterangi', 'Paengawhāwhā', 'Haratua', 'Pipiri', 'Hōngongoi', 'Hereturikōkā', 'Mahuru', 'Whiringa-ā-nuku', 'Whiringa-ā-rangi', 'Hakihea'],\n  STANDALONEMONTHS: ['Kohitātea', 'Huitanguru', 'Poutūterangi', 'Paengawhāwhā', 'Haratua', 'Pipiri', 'Hōngongoi', 'Hereturikōkā', 'Mahuru', 'Whiringa-ā-nuku', 'Whiringa-ā-rangi', 'Hakihea'],\n  SHORTMONTHS: ['Kohi', 'Hui', 'Pou', 'Pae', 'Hara', 'Pipi', 'Hōngo', 'Here', 'Mahu', 'Nuku', 'Rangi', 'Haki'],\n  STANDALONESHORTMONTHS: ['Kohi', 'Hui', 'Pou', 'Pae', 'Hara', 'Pipi', 'Hōngo', 'Here', 'Mahu', 'Nuku', 'Rangi', 'Haki'],\n  WEEKDAYS: ['Rātapu', 'Rāhina', 'Rātū', 'Rāapa', 'Rāpare', 'Rāmere', 'Rāhoroi'],\n  STANDALONEWEEKDAYS: ['Rātapu', 'Rāhina', 'Rātū', 'Rāapa', 'Rāpare', 'Rāmere', 'Rāhoroi'],\n  SHORTWEEKDAYS: ['Tap', 'Hin', 'Tū', 'Apa', 'Par', 'Mer', 'Hor'],\n  STANDALONESHORTWEEKDAYS: ['Tap', 'Hin', 'Tū', 'Apa', 'Par', 'Mer', 'Hor'],\n  NARROWWEEKDAYS: ['T', 'H', 'T', 'A', 'P', 'M', 'H'],\n  STANDALONENARROWWEEKDAYS: ['T', 'H', 'T', 'A', 'P', 'M', 'H'],\n  SHORTQUARTERS: ['HW1', 'HW2', 'HW3', 'HW4'],\n  QUARTERS: ['Hauwhā tuatahi', 'Hauwhā tuarua', 'Hauwhā tuatoru', 'Hauwhā tuawhā'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss', 'h:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale mi_NZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mi_NZ = goog.i18n.DateTimeSymbols_mi;\n\n\n/**\n * Date/time formatting symbols for locale mk_MK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mk_MK = goog.i18n.DateTimeSymbols_mk;\n\n\n/**\n * Date/time formatting symbols for locale ml_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ml_IN = goog.i18n.DateTimeSymbols_ml;\n\n\n/**\n * Date/time formatting symbols for locale mn_MN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mn_MN = goog.i18n.DateTimeSymbols_mn;\n\n\n/**\n * Date/time formatting symbols for locale mr_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mr_IN = goog.i18n.DateTimeSymbols_mr;\n\n\n/**\n * Date/time formatting symbols for locale ms_BN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ms_BN = {\n  ERAS: ['S.M.', 'TM'],\n  ERANAMES: ['S.M.', 'TM'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'O', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'O', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januari', 'Februari', 'Mac', 'April', 'Mei', 'Jun', 'Julai', 'Ogos', 'September', 'Oktober', 'November', 'Disember'],\n  STANDALONEMONTHS: ['Januari', 'Februari', 'Mac', 'April', 'Mei', 'Jun', 'Julai', 'Ogos', 'September', 'Oktober', 'November', 'Disember'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ogo', 'Sep', 'Okt', 'Nov', 'Dis'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ogo', 'Sep', 'Okt', 'Nov', 'Dis'],\n  WEEKDAYS: ['Ahad', 'Isnin', 'Selasa', 'Rabu', 'Khamis', 'Jumaat', 'Sabtu'],\n  STANDALONEWEEKDAYS: ['Ahad', 'Isnin', 'Selasa', 'Rabu', 'Khamis', 'Jumaat', 'Sabtu'],\n  SHORTWEEKDAYS: ['Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'],\n  STANDALONESHORTWEEKDAYS: ['Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'],\n  NARROWWEEKDAYS: ['A', 'I', 'S', 'R', 'K', 'J', 'S'],\n  STANDALONENARROWWEEKDAYS: ['A', 'I', 'S', 'R', 'K', 'J', 'S'],\n  SHORTQUARTERS: ['S1', 'S2', 'S3', 'S4'],\n  QUARTERS: ['Suku pertama', 'Suku Ke-2', 'Suku Ke-3', 'Suku Ke-4'],\n  AMPMS: ['PG', 'PTG'],\n  DATEFORMATS: ['dd MMMM y', 'd MMMM y', 'd MMM y', 'd/MM/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ms_MY.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ms_MY = goog.i18n.DateTimeSymbols_ms;\n\n\n/**\n * Date/time formatting symbols for locale ms_SG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ms_SG = {\n  ERAS: ['S.M.', 'TM'],\n  ERANAMES: ['S.M.', 'TM'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'O', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'O', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januari', 'Februari', 'Mac', 'April', 'Mei', 'Jun', 'Julai', 'Ogos', 'September', 'Oktober', 'November', 'Disember'],\n  STANDALONEMONTHS: ['Januari', 'Februari', 'Mac', 'April', 'Mei', 'Jun', 'Julai', 'Ogos', 'September', 'Oktober', 'November', 'Disember'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ogo', 'Sep', 'Okt', 'Nov', 'Dis'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ogo', 'Sep', 'Okt', 'Nov', 'Dis'],\n  WEEKDAYS: ['Ahad', 'Isnin', 'Selasa', 'Rabu', 'Khamis', 'Jumaat', 'Sabtu'],\n  STANDALONEWEEKDAYS: ['Ahad', 'Isnin', 'Selasa', 'Rabu', 'Khamis', 'Jumaat', 'Sabtu'],\n  SHORTWEEKDAYS: ['Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'],\n  STANDALONESHORTWEEKDAYS: ['Ahd', 'Isn', 'Sel', 'Rab', 'Kha', 'Jum', 'Sab'],\n  NARROWWEEKDAYS: ['A', 'I', 'S', 'R', 'K', 'J', 'S'],\n  STANDALONENARROWWEEKDAYS: ['A', 'I', 'S', 'R', 'K', 'J', 'S'],\n  SHORTQUARTERS: ['S1', 'S2', 'S3', 'S4'],\n  QUARTERS: ['Suku pertama', 'Suku Ke-2', 'Suku Ke-3', 'Suku Ke-4'],\n  AMPMS: ['PG', 'PTG'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd/MM/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale mt_MT.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mt_MT = goog.i18n.DateTimeSymbols_mt;\n\n\n/**\n * Date/time formatting symbols for locale mua.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mua = {\n  ERAS: ['KK', 'PK'],\n  ERANAMES: ['KǝPel Kristu', 'Pel Kristu'],\n  NARROWMONTHS: ['O', 'A', 'I', 'F', 'D', 'B', 'L', 'M', 'E', 'U', 'W', 'Y'],\n  STANDALONENARROWMONTHS: ['O', 'A', 'I', 'F', 'D', 'B', 'L', 'M', 'E', 'U', 'W', 'Y'],\n  MONTHS: ['Fĩi Loo', 'Cokcwaklaŋne', 'Cokcwaklii', 'Fĩi Marfoo', 'Madǝǝuutǝbijaŋ', 'Mamǝŋgwãafahbii', 'Mamǝŋgwãalii', 'Madǝmbii', 'Fĩi Dǝɓlii', 'Fĩi Mundaŋ', 'Fĩi Gwahlle', 'Fĩi Yuru'],\n  STANDALONEMONTHS: ['Fĩi Loo', 'Cokcwaklaŋne', 'Cokcwaklii', 'Fĩi Marfoo', 'Madǝǝuutǝbijaŋ', 'Mamǝŋgwãafahbii', 'Mamǝŋgwãalii', 'Madǝmbii', 'Fĩi Dǝɓlii', 'Fĩi Mundaŋ', 'Fĩi Gwahlle', 'Fĩi Yuru'],\n  SHORTMONTHS: ['FLO', 'CLA', 'CKI', 'FMF', 'MAD', 'MBI', 'MLI', 'MAM', 'FDE', 'FMU', 'FGW', 'FYU'],\n  STANDALONESHORTMONTHS: ['FLO', 'CLA', 'CKI', 'FMF', 'MAD', 'MBI', 'MLI', 'MAM', 'FDE', 'FMU', 'FGW', 'FYU'],\n  WEEKDAYS: ['Com’yakke', 'Comlaaɗii', 'Comzyiiɗii', 'Comkolle', 'Comkaldǝɓlii', 'Comgaisuu', 'Comzyeɓsuu'],\n  STANDALONEWEEKDAYS: ['Com’yakke', 'Comlaaɗii', 'Comzyiiɗii', 'Comkolle', 'Comkaldǝɓlii', 'Comgaisuu', 'Comzyeɓsuu'],\n  SHORTWEEKDAYS: ['Cya', 'Cla', 'Czi', 'Cko', 'Cka', 'Cga', 'Cze'],\n  STANDALONESHORTWEEKDAYS: ['Cya', 'Cla', 'Czi', 'Cko', 'Cka', 'Cga', 'Cze'],\n  NARROWWEEKDAYS: ['Y', 'L', 'Z', 'O', 'A', 'G', 'E'],\n  STANDALONENARROWWEEKDAYS: ['Y', 'L', 'Z', 'O', 'A', 'G', 'E'],\n  SHORTQUARTERS: ['F1', 'F2', 'F3', 'F4'],\n  QUARTERS: ['Tai fĩi sai ma tǝn kee zah', 'Tai fĩi sai zah lǝn gwa ma kee', 'Tai fĩi sai zah lǝn sai ma kee', 'Tai fĩi sai ma coo kee zah ‘na'],\n  AMPMS: ['comme', 'lilli'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale mua_CM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mua_CM = goog.i18n.DateTimeSymbols_mua;\n\n\n/**\n * Date/time formatting symbols for locale my_MM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_my_MM = goog.i18n.DateTimeSymbols_my;\n\n\n/**\n * Date/time formatting symbols for locale mzn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mzn = {\n  ZERODIGIT: 0x06F0,\n  ERAS: ['پ.م', 'م.'],\n  ERANAMES: ['قبل میلاد', 'بعد میلاد'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'],\n  STANDALONEMONTHS: ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'],\n  SHORTMONTHS: ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'],\n  STANDALONESHORTMONTHS: ['ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'],\n  WEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONEWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [4, 4],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale mzn_IR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_mzn_IR = goog.i18n.DateTimeSymbols_mzn;\n\n\n/**\n * Date/time formatting symbols for locale naq.\n * @const\n */\ngoog.i18n.DateTimeSymbols_naq = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Xristub aiǃâ', 'Xristub khaoǃgâ'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['ǃKhanni', 'ǃKhanǀgôab', 'ǀKhuuǁkhâb', 'ǃHôaǂkhaib', 'ǃKhaitsâb', 'Gamaǀaeb', 'ǂKhoesaob', 'Aoǁkhuumûǁkhâb', 'Taraǀkhuumûǁkhâb', 'ǂNûǁnâiseb', 'ǀHooǂgaeb', 'Hôasoreǁkhâb'],\n  STANDALONEMONTHS: ['ǃKhanni', 'ǃKhanǀgôab', 'ǀKhuuǁkhâb', 'ǃHôaǂkhaib', 'ǃKhaitsâb', 'Gamaǀaeb', 'ǂKhoesaob', 'Aoǁkhuumûǁkhâb', 'Taraǀkhuumûǁkhâb', 'ǂNûǁnâiseb', 'ǀHooǂgaeb', 'Hôasoreǁkhâb'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],\n  WEEKDAYS: ['Sontaxtsees', 'Mantaxtsees', 'Denstaxtsees', 'Wunstaxtsees', 'Dondertaxtsees', 'Fraitaxtsees', 'Satertaxtsees'],\n  STANDALONEWEEKDAYS: ['Sontaxtsees', 'Mantaxtsees', 'Denstaxtsees', 'Wunstaxtsees', 'Dondertaxtsees', 'Fraitaxtsees', 'Satertaxtsees'],\n  SHORTWEEKDAYS: ['Son', 'Ma', 'De', 'Wu', 'Do', 'Fr', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Son', 'Ma', 'De', 'Wu', 'Do', 'Fr', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'E', 'W', 'D', 'F', 'A'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'E', 'W', 'D', 'F', 'A'],\n  SHORTQUARTERS: ['KW1', 'KW2', 'KW3', 'KW4'],\n  QUARTERS: ['1ro kwartals', '2ǁî kwartals', '3ǁî kwartals', '4ǁî kwartals'],\n  AMPMS: ['ǁgoagas', 'ǃuias'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale naq_NA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_naq_NA = goog.i18n.DateTimeSymbols_naq;\n\n\n/**\n * Date/time formatting symbols for locale nb_NO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nb_NO = goog.i18n.DateTimeSymbols_nb;\n\n\n/**\n * Date/time formatting symbols for locale nb_SJ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nb_SJ = goog.i18n.DateTimeSymbols_nb;\n\n\n/**\n * Date/time formatting symbols for locale nd.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nd = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['UKristo angakabuyi', 'Ukristo ebuyile'],\n  NARROWMONTHS: ['Z', 'N', 'M', 'M', 'N', 'N', 'N', 'N', 'M', 'M', 'L', 'M'],\n  STANDALONENARROWMONTHS: ['Z', 'N', 'M', 'M', 'N', 'N', 'N', 'N', 'M', 'M', 'L', 'M'],\n  MONTHS: ['Zibandlela', 'Nhlolanja', 'Mbimbitho', 'Mabasa', 'Nkwenkwezi', 'Nhlangula', 'Ntulikazi', 'Ncwabakazi', 'Mpandula', 'Mfumfu', 'Lwezi', 'Mpalakazi'],\n  STANDALONEMONTHS: ['Zibandlela', 'Nhlolanja', 'Mbimbitho', 'Mabasa', 'Nkwenkwezi', 'Nhlangula', 'Ntulikazi', 'Ncwabakazi', 'Mpandula', 'Mfumfu', 'Lwezi', 'Mpalakazi'],\n  SHORTMONTHS: ['Zib', 'Nhlo', 'Mbi', 'Mab', 'Nkw', 'Nhla', 'Ntu', 'Ncw', 'Mpan', 'Mfu', 'Lwe', 'Mpal'],\n  STANDALONESHORTMONTHS: ['Zib', 'Nhlo', 'Mbi', 'Mab', 'Nkw', 'Nhla', 'Ntu', 'Ncw', 'Mpan', 'Mfu', 'Lwe', 'Mpal'],\n  WEEKDAYS: ['Sonto', 'Mvulo', 'Sibili', 'Sithathu', 'Sine', 'Sihlanu', 'Mgqibelo'],\n  STANDALONEWEEKDAYS: ['Sonto', 'Mvulo', 'Sibili', 'Sithathu', 'Sine', 'Sihlanu', 'Mgqibelo'],\n  SHORTWEEKDAYS: ['Son', 'Mvu', 'Sib', 'Sit', 'Sin', 'Sih', 'Mgq'],\n  STANDALONESHORTWEEKDAYS: ['Son', 'Mvu', 'Sib', 'Sit', 'Sin', 'Sih', 'Mgq'],\n  NARROWWEEKDAYS: ['S', 'M', 'S', 'S', 'S', 'S', 'M'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'S', 'S', 'S', 'S', 'M'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['Kota 1', 'Kota 2', 'Kota 3', 'Kota 4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale nd_ZW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nd_ZW = goog.i18n.DateTimeSymbols_nd;\n\n\n/**\n * Date/time formatting symbols for locale nds.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nds = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'],\n  STANDALONEMONTHS: ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'],\n  SHORTMONTHS: ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'],\n  STANDALONESHORTMONTHS: ['M01', 'M02', 'M03', 'M04', 'M05', 'M06', 'M07', 'M08', 'M09', 'M10', 'M11', 'M12'],\n  WEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONEWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  SHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale nds_DE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nds_DE = goog.i18n.DateTimeSymbols_nds;\n\n\n/**\n * Date/time formatting symbols for locale nds_NL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nds_NL = goog.i18n.DateTimeSymbols_nds;\n\n\n/**\n * Date/time formatting symbols for locale ne_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ne_IN = {\n  ZERODIGIT: 0x0966,\n  ERAS: ['ईसा पूर्व', 'सन्'],\n  ERANAMES: ['ईसा पूर्व', 'सन्'],\n  NARROWMONTHS: ['जन', 'फेब', 'मार्च', 'अप्र', 'मे', 'जुन', 'जुल', 'अग', 'सेप', 'अक्टो', 'नोभे', 'डिसे'],\n  STANDALONENARROWMONTHS: ['जन', 'फेेब', 'मार्च', 'अप्र', 'मे', 'जुन', 'जुल', 'अग', 'सेप', 'अक्टो', 'नोभे', 'डिसे'],\n  MONTHS: ['जनवरी', 'फेब्रुअरी', 'मार्च', 'अप्रिल', 'मे', 'जुन', 'जुलाई', 'अगस्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'],\n  STANDALONEMONTHS: ['जनवरी', 'फेब्रुअरी', 'मार्च', 'अप्रिल', 'मे', 'जुन', 'जुलाई', 'अगस्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'],\n  SHORTMONTHS: ['जनवरी', 'फेब्रुअरी', 'मार्च', 'अप्रिल', 'मे', 'जुन', 'जुलाई', 'अगस्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'],\n  STANDALONESHORTMONTHS: ['जनवरी', 'फेब्रुअरी', 'मार्च', 'अप्रिल', 'मे', 'जुन', 'जुलाई', 'अगस्ट', 'सेप्टेम्बर', 'अक्टोबर', 'नोभेम्बर', 'डिसेम्बर'],\n  WEEKDAYS: ['आइतबार', 'सोमबार', 'मङ्गलबार', 'बुधबार', 'बिहिबार', 'शुक्रबार', 'शनिबार'],\n  STANDALONEWEEKDAYS: ['आइतबार', 'सोमबार', 'मङ्गलबार', 'बुधबार', 'बिहिबार', 'शुक्रबार', 'शनिबार'],\n  SHORTWEEKDAYS: ['आइत', 'सोम', 'मङ्गल', 'बुध', 'बिहि', 'शुक्र', 'शनि'],\n  STANDALONESHORTWEEKDAYS: ['आइत', 'सोम', 'मङ्गल', 'बुध', 'बिहि', 'शुक्र', 'शनि'],\n  NARROWWEEKDAYS: ['आ', 'सो', 'म', 'बु', 'बि', 'शु', 'श'],\n  STANDALONENARROWWEEKDAYS: ['आ', 'सो', 'म', 'बु', 'बि', 'शु', 'श'],\n  SHORTQUARTERS: ['पहिलो सत्र', 'दोस्रो सत्र', 'तेस्रो सत्र', 'चौथो सत्र'],\n  QUARTERS: ['पहिलो सत्र', 'दोस्रो सत्र', 'तेस्रो सत्र', 'चौथो सत्र'],\n  AMPMS: ['पूर्वाह्न', 'अपराह्न'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'yy/M/d'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ne_NP.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ne_NP = goog.i18n.DateTimeSymbols_ne;\n\n\n/**\n * Date/time formatting symbols for locale nl_AW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nl_AW = {\n  ERAS: ['v.Chr.', 'n.Chr.'],\n  ERANAMES: ['voor Christus', 'na Christus'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  STANDALONEMONTHS: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  STANDALONEWEEKDAYS: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  SHORTWEEKDAYS: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  STANDALONESHORTWEEKDAYS: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  NARROWWEEKDAYS: ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],\n  STANDALONENARROWWEEKDAYS: ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1e kwartaal', '2e kwartaal', '3e kwartaal', '4e kwartaal'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd-MM-y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'om\\' {0}', '{1} \\'om\\' {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale nl_BE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nl_BE = {\n  ERAS: ['v.Chr.', 'n.Chr.'],\n  ERANAMES: ['voor Christus', 'na Christus'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  STANDALONEMONTHS: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  STANDALONEWEEKDAYS: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  SHORTWEEKDAYS: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  STANDALONESHORTWEEKDAYS: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  NARROWWEEKDAYS: ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],\n  STANDALONENARROWWEEKDAYS: ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1e kwartaal', '2e kwartaal', '3e kwartaal', '4e kwartaal'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'om\\' {0}', '{1} \\'om\\' {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale nl_BQ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nl_BQ = {\n  ERAS: ['v.Chr.', 'n.Chr.'],\n  ERANAMES: ['voor Christus', 'na Christus'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  STANDALONEMONTHS: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  STANDALONEWEEKDAYS: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  SHORTWEEKDAYS: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  STANDALONESHORTWEEKDAYS: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  NARROWWEEKDAYS: ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],\n  STANDALONENARROWWEEKDAYS: ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1e kwartaal', '2e kwartaal', '3e kwartaal', '4e kwartaal'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd-MM-y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'om\\' {0}', '{1} \\'om\\' {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale nl_CW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nl_CW = {\n  ERAS: ['v.Chr.', 'n.Chr.'],\n  ERANAMES: ['voor Christus', 'na Christus'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  STANDALONEMONTHS: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  STANDALONEWEEKDAYS: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  SHORTWEEKDAYS: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  STANDALONESHORTWEEKDAYS: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  NARROWWEEKDAYS: ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],\n  STANDALONENARROWWEEKDAYS: ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1e kwartaal', '2e kwartaal', '3e kwartaal', '4e kwartaal'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd-MM-y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'om\\' {0}', '{1} \\'om\\' {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale nl_NL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nl_NL = goog.i18n.DateTimeSymbols_nl;\n\n\n/**\n * Date/time formatting symbols for locale nl_SR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nl_SR = {\n  ERAS: ['v.Chr.', 'n.Chr.'],\n  ERANAMES: ['voor Christus', 'na Christus'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  STANDALONEMONTHS: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  STANDALONEWEEKDAYS: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  SHORTWEEKDAYS: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  STANDALONESHORTWEEKDAYS: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  NARROWWEEKDAYS: ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],\n  STANDALONENARROWWEEKDAYS: ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1e kwartaal', '2e kwartaal', '3e kwartaal', '4e kwartaal'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd-MM-y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'om\\' {0}', '{1} \\'om\\' {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale nl_SX.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nl_SX = {\n  ERAS: ['v.Chr.', 'n.Chr.'],\n  ERANAMES: ['voor Christus', 'na Christus'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  STANDALONEMONTHS: ['januari', 'februari', 'maart', 'april', 'mei', 'juni', 'juli', 'augustus', 'september', 'oktober', 'november', 'december'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan.', 'feb.', 'mrt.', 'apr.', 'mei', 'jun.', 'jul.', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  STANDALONEWEEKDAYS: ['zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag'],\n  SHORTWEEKDAYS: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  STANDALONESHORTWEEKDAYS: ['zo', 'ma', 'di', 'wo', 'do', 'vr', 'za'],\n  NARROWWEEKDAYS: ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],\n  STANDALONENARROWWEEKDAYS: ['Z', 'M', 'D', 'W', 'D', 'V', 'Z'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1e kwartaal', '2e kwartaal', '3e kwartaal', '4e kwartaal'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd-MM-y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'om\\' {0}', '{1} \\'om\\' {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale nmg.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nmg = {\n  ERAS: ['BL', 'PB'],\n  ERANAMES: ['Bó Lahlɛ̄', 'Pfiɛ Burī'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['ngwɛn matáhra', 'ngwɛn ńmba', 'ngwɛn ńlal', 'ngwɛn ńna', 'ngwɛn ńtan', 'ngwɛn ńtuó', 'ngwɛn hɛmbuɛrí', 'ngwɛn lɔmbi', 'ngwɛn rɛbvuâ', 'ngwɛn wum', 'ngwɛn wum navǔr', 'krísimin'],\n  STANDALONEMONTHS: ['ngwɛn matáhra', 'ngwɛn ńmba', 'ngwɛn ńlal', 'ngwɛn ńna', 'ngwɛn ńtan', 'ngwɛn ńtuó', 'ngwɛn hɛmbuɛrí', 'ngwɛn lɔmbi', 'ngwɛn rɛbvuâ', 'ngwɛn wum', 'ngwɛn wum navǔr', 'krísimin'],\n  SHORTMONTHS: ['ng1', 'ng2', 'ng3', 'ng4', 'ng5', 'ng6', 'ng7', 'ng8', 'ng9', 'ng10', 'ng11', 'kris'],\n  STANDALONESHORTMONTHS: ['ng1', 'ng2', 'ng3', 'ng4', 'ng5', 'ng6', 'ng7', 'ng8', 'ng9', 'ng10', 'ng11', 'kris'],\n  WEEKDAYS: ['sɔ́ndɔ', 'mɔ́ndɔ', 'sɔ́ndɔ mafú mába', 'sɔ́ndɔ mafú málal', 'sɔ́ndɔ mafú mána', 'mabágá má sukul', 'sásadi'],\n  STANDALONEWEEKDAYS: ['sɔ́ndɔ', 'mɔ́ndɔ', 'sɔ́ndɔ mafú mába', 'sɔ́ndɔ mafú málal', 'sɔ́ndɔ mafú mána', 'mabágá má sukul', 'sásadi'],\n  SHORTWEEKDAYS: ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'mbs', 'sas'],\n  STANDALONESHORTWEEKDAYS: ['sɔ́n', 'mɔ́n', 'smb', 'sml', 'smn', 'mbs', 'sas'],\n  NARROWWEEKDAYS: ['s', 'm', 's', 's', 's', 'm', 's'],\n  STANDALONENARROWWEEKDAYS: ['s', 'm', 's', 's', 's', 'm', 's'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['Tindɛ nvúr', 'Tindɛ ńmba', 'Tindɛ ńlal', 'Tindɛ ńna'],\n  AMPMS: ['maná', 'kugú'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale nmg_CM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nmg_CM = goog.i18n.DateTimeSymbols_nmg;\n\n\n/**\n * Date/time formatting symbols for locale nn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nn = {\n  ERAS: ['f.Kr.', 'e.Kr.'],\n  ERANAMES: ['f.Kr.', 'e.Kr.'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'],\n  STANDALONEMONTHS: ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mars', 'apr.', 'mai', 'juni', 'juli', 'aug.', 'sep.', 'okt.', 'nov.', 'des.'],\n  STANDALONESHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'],\n  WEEKDAYS: ['søndag', 'måndag', 'tysdag', 'onsdag', 'torsdag', 'fredag', 'laurdag'],\n  STANDALONEWEEKDAYS: ['søndag', 'måndag', 'tysdag', 'onsdag', 'torsdag', 'fredag', 'laurdag'],\n  SHORTWEEKDAYS: ['sø.', 'må.', 'ty.', 'on.', 'to.', 'fr.', 'la.'],\n  STANDALONESHORTWEEKDAYS: ['søn', 'mån', 'tys', 'ons', 'tor', 'fre', 'lau'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'O', 'T', 'F', 'L'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'O', 'T', 'F', 'L'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['1. kvartal', '2. kvartal', '3. kvartal', '4. kvartal'],\n  AMPMS: ['formiddag', 'ettermiddag'],\n  DATEFORMATS: ['EEEE d. MMMM y', 'd. MMMM y', 'd. MMM y', 'dd.MM.y'],\n  TIMEFORMATS: ['\\'kl\\'. HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} \\'kl\\'. {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale nn_NO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nn_NO = goog.i18n.DateTimeSymbols_nn;\n\n\n/**\n * Date/time formatting symbols for locale nnh.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nnh = {\n  ERAS: ['m.z.Y.', 'm.g.n.Y.'],\n  ERANAMES: ['mé zyé Yěsô', 'mé gÿo ńzyé Yěsô'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['saŋ tsetsɛ̀ɛ lùm', 'saŋ kàg ngwóŋ', 'saŋ lepyè shúm', 'saŋ cÿó', 'saŋ tsɛ̀ɛ cÿó', 'saŋ njÿoláʼ', 'saŋ tyɛ̀b tyɛ̀b mbʉ̀ŋ', 'saŋ mbʉ̀ŋ', 'saŋ ngwɔ̀ʼ mbÿɛ', 'saŋ tàŋa tsetsáʼ', 'saŋ mejwoŋó', 'saŋ lùm'],\n  STANDALONEMONTHS: ['saŋ tsetsɛ̀ɛ lùm', 'saŋ kàg ngwóŋ', 'saŋ lepyè shúm', 'saŋ cÿó', 'saŋ tsɛ̀ɛ cÿó', 'saŋ njÿoláʼ', 'saŋ tyɛ̀b tyɛ̀b mbʉ̀ŋ', 'saŋ mbʉ̀ŋ', 'saŋ ngwɔ̀ʼ mbÿɛ', 'saŋ tàŋa tsetsáʼ', 'saŋ mejwoŋó', 'saŋ lùm'],\n  SHORTMONTHS: ['saŋ tsetsɛ̀ɛ lùm', 'saŋ kàg ngwóŋ', 'saŋ lepyè shúm', 'saŋ cÿó', 'saŋ tsɛ̀ɛ cÿó', 'saŋ njÿoláʼ', 'saŋ tyɛ̀b tyɛ̀b mbʉ̀ŋ', 'saŋ mbʉ̀ŋ', 'saŋ ngwɔ̀ʼ mbÿɛ', 'saŋ tàŋa tsetsáʼ', 'saŋ mejwoŋó', 'saŋ lùm'],\n  STANDALONESHORTMONTHS: ['saŋ tsetsɛ̀ɛ lùm', 'saŋ kàg ngwóŋ', 'saŋ lepyè shúm', 'saŋ cÿó', 'saŋ tsɛ̀ɛ cÿó', 'saŋ njÿoláʼ', 'saŋ tyɛ̀b tyɛ̀b mbʉ̀ŋ', 'saŋ mbʉ̀ŋ', 'saŋ ngwɔ̀ʼ mbÿɛ', 'saŋ tàŋa tsetsáʼ', 'saŋ mejwoŋó', 'saŋ lùm'],\n  WEEKDAYS: ['lyɛʼɛ́ sẅíŋtè', 'mvfò lyɛ̌ʼ', 'mbɔ́ɔntè mvfò lyɛ̌ʼ', 'tsètsɛ̀ɛ lyɛ̌ʼ', 'mbɔ́ɔntè tsetsɛ̀ɛ lyɛ̌ʼ', 'mvfò màga lyɛ̌ʼ', 'màga lyɛ̌ʼ'],\n  STANDALONEWEEKDAYS: ['lyɛʼɛ́ sẅíŋtè', 'mvfò lyɛ̌ʼ', 'mbɔ́ɔntè mvfò lyɛ̌ʼ', 'tsètsɛ̀ɛ lyɛ̌ʼ', 'mbɔ́ɔntè tsetsɛ̀ɛ lyɛ̌ʼ', 'mvfò màga lyɛ̌ʼ', 'màga lyɛ̌ʼ'],\n  SHORTWEEKDAYS: ['lyɛʼɛ́ sẅíŋtè', 'mvfò lyɛ̌ʼ', 'mbɔ́ɔntè mvfò lyɛ̌ʼ', 'tsètsɛ̀ɛ lyɛ̌ʼ', 'mbɔ́ɔntè tsetsɛ̀ɛ lyɛ̌ʼ', 'mvfò màga lyɛ̌ʼ', 'màga lyɛ̌ʼ'],\n  STANDALONESHORTWEEKDAYS: ['lyɛʼɛ́ sẅíŋtè', 'mvfò lyɛ̌ʼ', 'mbɔ́ɔntè mvfò lyɛ̌ʼ', 'tsètsɛ̀ɛ lyɛ̌ʼ', 'mbɔ́ɔntè tsetsɛ̀ɛ lyɛ̌ʼ', 'mvfò màga lyɛ̌ʼ', 'màga lyɛ̌ʼ'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['mbaʼámbaʼ', 'ncwònzém'],\n  DATEFORMATS: ['EEEE , \\'lyɛ\\'̌ʼ d \\'na\\' MMMM, y', '\\'lyɛ\\'̌ʼ d \\'na\\' MMMM, y', 'd MMM, y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1},{0}', '{1}, {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale nnh_CM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nnh_CM = goog.i18n.DateTimeSymbols_nnh;\n\n\n/**\n * Date/time formatting symbols for locale nus.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nus = {\n  ERAS: ['AY', 'ƐY'],\n  ERANAMES: ['A ka̱n Yecu ni dap', 'Ɛ ca Yecu dap'],\n  NARROWMONTHS: ['T', 'P', 'D', 'G', 'D', 'K', 'P', 'T', 'T', 'L', 'K', 'T'],\n  STANDALONENARROWMONTHS: ['T', 'P', 'D', 'G', 'D', 'K', 'P', 'T', 'T', 'L', 'K', 'T'],\n  MONTHS: ['Tiop thar pɛt', 'Pɛt', 'Duɔ̱ɔ̱ŋ', 'Guak', 'Duät', 'Kornyoot', 'Pay yie̱tni', 'Tho̱o̱r', 'Tɛɛr', 'Laath', 'Kur', 'Tio̱p in di̱i̱t'],\n  STANDALONEMONTHS: ['Tiop thar pɛt', 'Pɛt', 'Duɔ̱ɔ̱ŋ', 'Guak', 'Duät', 'Kornyoot', 'Pay yie̱tni', 'Tho̱o̱r', 'Tɛɛr', 'Laath', 'Kur', 'Tio̱p in di̱i̱t'],\n  SHORTMONTHS: ['Tiop', 'Pɛt', 'Duɔ̱ɔ̱', 'Guak', 'Duä', 'Kor', 'Pay', 'Thoo', 'Tɛɛ', 'Laa', 'Kur', 'Tid'],\n  STANDALONESHORTMONTHS: ['Tiop', 'Pɛt', 'Duɔ̱ɔ̱', 'Guak', 'Duä', 'Kor', 'Pay', 'Thoo', 'Tɛɛ', 'Laa', 'Kur', 'Tid'],\n  WEEKDAYS: ['Cäŋ kuɔth', 'Jiec la̱t', 'Rɛw lätni', 'Diɔ̱k lätni', 'Ŋuaan lätni', 'Dhieec lätni', 'Bäkɛl lätni'],\n  STANDALONEWEEKDAYS: ['Cäŋ kuɔth', 'Jiec la̱t', 'Rɛw lätni', 'Diɔ̱k lätni', 'Ŋuaan lätni', 'Dhieec lätni', 'Bäkɛl lätni'],\n  SHORTWEEKDAYS: ['Cäŋ', 'Jiec', 'Rɛw', 'Diɔ̱k', 'Ŋuaan', 'Dhieec', 'Bäkɛl'],\n  STANDALONESHORTWEEKDAYS: ['Cäŋ', 'Jiec', 'Rɛw', 'Diɔ̱k', 'Ŋuaan', 'Dhieec', 'Bäkɛl'],\n  NARROWWEEKDAYS: ['C', 'J', 'R', 'D', 'Ŋ', 'D', 'B'],\n  STANDALONENARROWWEEKDAYS: ['C', 'J', 'R', 'D', 'Ŋ', 'D', 'B'],\n  SHORTQUARTERS: ['P1', 'P2', 'P3', 'P4'],\n  QUARTERS: ['Päth diɔk tin nhiam', 'Päth diɔk tin guurɛ', 'Päth diɔk tin wä kɔɔriɛn', 'Päth diɔk tin jiɔakdiɛn'],\n  AMPMS: ['RW', 'TŊ'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/MM/y'],\n  TIMEFORMATS: ['zzzz h:mm:ss a', 'z h:mm:ss a', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale nus_SS.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nus_SS = goog.i18n.DateTimeSymbols_nus;\n\n\n/**\n * Date/time formatting symbols for locale nyn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nyn = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Kurisito Atakaijire', 'Kurisito Yaijire'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Okwokubanza', 'Okwakabiri', 'Okwakashatu', 'Okwakana', 'Okwakataana', 'Okwamukaaga', 'Okwamushanju', 'Okwamunaana', 'Okwamwenda', 'Okwaikumi', 'Okwaikumi na kumwe', 'Okwaikumi na ibiri'],\n  STANDALONEMONTHS: ['Okwokubanza', 'Okwakabiri', 'Okwakashatu', 'Okwakana', 'Okwakataana', 'Okwamukaaga', 'Okwamushanju', 'Okwamunaana', 'Okwamwenda', 'Okwaikumi', 'Okwaikumi na kumwe', 'Okwaikumi na ibiri'],\n  SHORTMONTHS: ['KBZ', 'KBR', 'KST', 'KKN', 'KTN', 'KMK', 'KMS', 'KMN', 'KMW', 'KKM', 'KNK', 'KNB'],\n  STANDALONESHORTMONTHS: ['KBZ', 'KBR', 'KST', 'KKN', 'KTN', 'KMK', 'KMS', 'KMN', 'KMW', 'KKM', 'KNK', 'KNB'],\n  WEEKDAYS: ['Sande', 'Orwokubanza', 'Orwakabiri', 'Orwakashatu', 'Orwakana', 'Orwakataano', 'Orwamukaaga'],\n  STANDALONEWEEKDAYS: ['Sande', 'Orwokubanza', 'Orwakabiri', 'Orwakashatu', 'Orwakana', 'Orwakataano', 'Orwamukaaga'],\n  SHORTWEEKDAYS: ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'],\n  STANDALONESHORTWEEKDAYS: ['SAN', 'ORK', 'OKB', 'OKS', 'OKN', 'OKT', 'OMK'],\n  NARROWWEEKDAYS: ['S', 'K', 'R', 'S', 'N', 'T', 'M'],\n  STANDALONENARROWWEEKDAYS: ['S', 'K', 'R', 'S', 'N', 'T', 'M'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['KWOTA 1', 'KWOTA 2', 'KWOTA 3', 'KWOTA 4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale nyn_UG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_nyn_UG = goog.i18n.DateTimeSymbols_nyn;\n\n\n/**\n * Date/time formatting symbols for locale om.\n * @const\n */\ngoog.i18n.DateTimeSymbols_om = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['Dheengadda Jeesu', 'CE'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Amajjii', 'Guraandhala', 'Bitooteessa', 'Elba', 'Caamsa', 'Waxabajjii', 'Adooleessa', 'Hagayya', 'Fuulbana', 'Onkololeessa', 'Sadaasa', 'Muddee'],\n  STANDALONEMONTHS: ['Amajjii', 'Guraandhala', 'Bitooteessa', 'Elba', 'Caamsa', 'Waxabajjii', 'Adooleessa', 'Hagayya', 'Fuulbana', 'Onkololeessa', 'Sadaasa', 'Muddee'],\n  SHORTMONTHS: ['Ama', 'Gur', 'Bit', 'Elb', 'Cam', 'Wax', 'Ado', 'Hag', 'Ful', 'Onk', 'Sad', 'Mud'],\n  STANDALONESHORTMONTHS: ['Ama', 'Gur', 'Bit', 'Elb', 'Cam', 'Wax', 'Ado', 'Hag', 'Ful', 'Onk', 'Sad', 'Mud'],\n  WEEKDAYS: ['Dilbata', 'Wiixata', 'Qibxata', 'Roobii', 'Kamiisa', 'Jimaata', 'Sanbata'],\n  STANDALONEWEEKDAYS: ['Dilbata', 'Wiixata', 'Qibxata', 'Roobii', 'Kamiisa', 'Jimaata', 'Sanbata'],\n  SHORTWEEKDAYS: ['Dil', 'Wix', 'Qib', 'Rob', 'Kam', 'Jim', 'San'],\n  STANDALONESHORTWEEKDAYS: ['Dil', 'Wix', 'Qib', 'Rob', 'Kam', 'Jim', 'San'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Kurmaana 1', 'Kurmaana 2', 'Kurmaana 3', 'Kurmaana 4'],\n  AMPMS: ['WD', 'WB'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'dd MMMM y', 'dd-MMM-y', 'dd/MM/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale om_ET.\n * @const\n */\ngoog.i18n.DateTimeSymbols_om_ET = goog.i18n.DateTimeSymbols_om;\n\n\n/**\n * Date/time formatting symbols for locale om_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_om_KE = {\n  ERAS: ['KD', 'CE'],\n  ERANAMES: ['Dheengadda Jeesu', 'CE'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['A', 'G', 'B', 'E', 'C', 'W', 'A', 'H', 'F', 'O', 'S', 'M'],\n  MONTHS: ['Amajjii', 'Guraandhala', 'Bitooteessa', 'Elba', 'Caamsa', 'Waxabajjii', 'Adooleessa', 'Hagayya', 'Fuulbana', 'Onkololeessa', 'Sadaasa', 'Muddee'],\n  STANDALONEMONTHS: ['Amajjii', 'Guraandhala', 'Bitooteessa', 'Elba', 'Caamsa', 'Waxabajjii', 'Adooleessa', 'Hagayya', 'Fuulbana', 'Onkololeessa', 'Sadaasa', 'Muddee'],\n  SHORTMONTHS: ['Ama', 'Gur', 'Bit', 'Elb', 'Cam', 'Wax', 'Ado', 'Hag', 'Ful', 'Onk', 'Sad', 'Mud'],\n  STANDALONESHORTMONTHS: ['Ama', 'Gur', 'Bit', 'Elb', 'Cam', 'Wax', 'Ado', 'Hag', 'Ful', 'Onk', 'Sad', 'Mud'],\n  WEEKDAYS: ['Dilbata', 'Wiixata', 'Qibxata', 'Roobii', 'Kamiisa', 'Jimaata', 'Sanbata'],\n  STANDALONEWEEKDAYS: ['Dilbata', 'Wiixata', 'Qibxata', 'Roobii', 'Kamiisa', 'Jimaata', 'Sanbata'],\n  SHORTWEEKDAYS: ['Dil', 'Wix', 'Qib', 'Rob', 'Kam', 'Jim', 'San'],\n  STANDALONESHORTWEEKDAYS: ['Dil', 'Wix', 'Qib', 'Rob', 'Kam', 'Jim', 'San'],\n  NARROWWEEKDAYS: ['D', 'W', 'Q', 'R', 'K', 'J', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'W', 'Q', 'R', 'K', 'J', 'S'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['Kurmaana 1', 'Kurmaana 2', 'Kurmaana 3', 'Kurmaana 4'],\n  AMPMS: ['WD', 'WB'],\n  DATEFORMATS: ['EEEE, MMMM d, y', 'dd MMMM y', 'dd-MMM-y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale or_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_or_IN = goog.i18n.DateTimeSymbols_or;\n\n\n/**\n * Date/time formatting symbols for locale os.\n * @const\n */\ngoog.i18n.DateTimeSymbols_os = {\n  ERAS: ['н.д.а.', 'н.д.'],\n  ERANAMES: ['н.д.а.', 'н.д.'],\n  NARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  STANDALONENARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  MONTHS: ['январы', 'февралы', 'мартъийы', 'апрелы', 'майы', 'июны', 'июлы', 'августы', 'сентябры', 'октябры', 'ноябры', 'декабры'],\n  STANDALONEMONTHS: ['Январь', 'Февраль', 'Мартъи', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],\n  SHORTMONTHS: ['янв.', 'фев.', 'мар.', 'апр.', 'майы', 'июны', 'июлы', 'авг.', 'сен.', 'окт.', 'ноя.', 'дек.'],\n  STANDALONESHORTMONTHS: ['Янв.', 'Февр.', 'Март.', 'Апр.', 'Май', 'Июнь', 'Июль', 'Авг.', 'Сент.', 'Окт.', 'Нояб.', 'Дек.'],\n  WEEKDAYS: ['хуыцаубон', 'къуырисӕр', 'дыццӕг', 'ӕртыццӕг', 'цыппӕрӕм', 'майрӕмбон', 'сабат'],\n  STANDALONEWEEKDAYS: ['Хуыцаубон', 'Къуырисӕр', 'Дыццӕг', 'Ӕртыццӕг', 'Цыппӕрӕм', 'Майрӕмбон', 'Сабат'],\n  SHORTWEEKDAYS: ['хцб', 'крс', 'дцг', 'ӕрт', 'цпр', 'мрб', 'сбт'],\n  STANDALONESHORTWEEKDAYS: ['Хцб', 'Крс', 'Дцг', 'Ӕрт', 'Цпр', 'Мрб', 'Сбт'],\n  NARROWWEEKDAYS: ['Х', 'К', 'Д', 'Ӕ', 'Ц', 'М', 'С'],\n  STANDALONENARROWWEEKDAYS: ['Х', 'К', 'Д', 'Ӕ', 'Ц', 'М', 'С'],\n  SHORTQUARTERS: ['1-аг кв.', '2-аг кв.', '3-аг кв.', '4-ӕм кв.'],\n  QUARTERS: ['1-аг квартал', '2-аг квартал', '3-аг квартал', '4-ӕм квартал'],\n  AMPMS: ['ӕмбисбоны размӕ', 'ӕмбисбоны фӕстӕ'],\n  DATEFORMATS: ['EEEE, d MMMM, y \\'аз\\'', 'd MMMM, y \\'аз\\'', 'dd MMM y \\'аз\\'', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale os_GE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_os_GE = goog.i18n.DateTimeSymbols_os;\n\n\n/**\n * Date/time formatting symbols for locale os_RU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_os_RU = {\n  ERAS: ['н.д.а.', 'н.д.'],\n  ERANAMES: ['н.д.а.', 'н.д.'],\n  NARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  STANDALONENARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  MONTHS: ['январы', 'февралы', 'мартъийы', 'апрелы', 'майы', 'июны', 'июлы', 'августы', 'сентябры', 'октябры', 'ноябры', 'декабры'],\n  STANDALONEMONTHS: ['Январь', 'Февраль', 'Мартъи', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],\n  SHORTMONTHS: ['янв.', 'фев.', 'мар.', 'апр.', 'майы', 'июны', 'июлы', 'авг.', 'сен.', 'окт.', 'ноя.', 'дек.'],\n  STANDALONESHORTMONTHS: ['Янв.', 'Февр.', 'Март.', 'Апр.', 'Май', 'Июнь', 'Июль', 'Авг.', 'Сент.', 'Окт.', 'Нояб.', 'Дек.'],\n  WEEKDAYS: ['хуыцаубон', 'къуырисӕр', 'дыццӕг', 'ӕртыццӕг', 'цыппӕрӕм', 'майрӕмбон', 'сабат'],\n  STANDALONEWEEKDAYS: ['Хуыцаубон', 'Къуырисӕр', 'Дыццӕг', 'Ӕртыццӕг', 'Цыппӕрӕм', 'Майрӕмбон', 'Сабат'],\n  SHORTWEEKDAYS: ['хцб', 'крс', 'дцг', 'ӕрт', 'цпр', 'мрб', 'сбт'],\n  STANDALONESHORTWEEKDAYS: ['Хцб', 'Крс', 'Дцг', 'Ӕрт', 'Цпр', 'Мрб', 'Сбт'],\n  NARROWWEEKDAYS: ['Х', 'К', 'Д', 'Ӕ', 'Ц', 'М', 'С'],\n  STANDALONENARROWWEEKDAYS: ['Х', 'К', 'Д', 'Ӕ', 'Ц', 'М', 'С'],\n  SHORTQUARTERS: ['1-аг кв.', '2-аг кв.', '3-аг кв.', '4-ӕм кв.'],\n  QUARTERS: ['1-аг квартал', '2-аг квартал', '3-аг квартал', '4-ӕм квартал'],\n  AMPMS: ['ӕмбисбоны размӕ', 'ӕмбисбоны фӕстӕ'],\n  DATEFORMATS: ['EEEE, d MMMM, y \\'аз\\'', 'd MMMM, y \\'аз\\'', 'dd MMM y \\'аз\\'', 'dd.MM.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale pa_Arab.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pa_Arab = {\n  ZERODIGIT: 0x06F0,\n  ERAS: ['ايساپورو', 'سں'],\n  ERANAMES: ['ايساپورو', 'سں'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئ', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  STANDALONEMONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئ', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  SHORTMONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئ', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  STANDALONESHORTMONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئ', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  WEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  STANDALONEWEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  SHORTWEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  STANDALONESHORTWEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['چوتھاي پہلاں', 'چوتھاي دوجا', 'چوتھاي تيجا', 'چوتھاي چوتھا'],\n  QUARTERS: ['چوتھاي پہلاں', 'چوتھاي دوجا', 'چوتھاي تيجا', 'چوتھاي چوتھا'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, dd MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale pa_Arab_PK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pa_Arab_PK = {\n  ZERODIGIT: 0x06F0,\n  ERAS: ['ايساپورو', 'سں'],\n  ERANAMES: ['ايساپورو', 'سں'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئ', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  STANDALONEMONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئ', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  SHORTMONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئ', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  STANDALONESHORTMONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئ', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  WEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  STANDALONEWEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  SHORTWEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  STANDALONESHORTWEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بُدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['چوتھاي پہلاں', 'چوتھاي دوجا', 'چوتھاي تيجا', 'چوتھاي چوتھا'],\n  QUARTERS: ['چوتھاي پہلاں', 'چوتھاي دوجا', 'چوتھاي تيجا', 'چوتھاي چوتھا'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, dd MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale pa_Guru.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pa_Guru = goog.i18n.DateTimeSymbols_pa;\n\n\n/**\n * Date/time formatting symbols for locale pa_Guru_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pa_Guru_IN = goog.i18n.DateTimeSymbols_pa;\n\n\n/**\n * Date/time formatting symbols for locale pl_PL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pl_PL = goog.i18n.DateTimeSymbols_pl;\n\n\n/**\n * Date/time formatting symbols for locale ps.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ps = {\n  ZERODIGIT: 0x06F0,\n  ERAS: ['له میلاد وړاندې', 'م.'],\n  ERANAMES: ['له میلاد څخه وړاندې', 'له میلاد څخه وروسته'],\n  NARROWMONTHS: ['ج', 'ف', 'م', 'ا', 'م', 'ج', 'ج', 'ا', 'س', 'ا', 'ن', 'د'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['جنوري', 'فبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سېپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  STANDALONEMONTHS: ['جنوري', 'فېبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  SHORTMONTHS: ['جنوري', 'فبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سېپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  STANDALONESHORTMONTHS: ['جنوري', 'فبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  WEEKDAYS: ['يونۍ', 'دونۍ', 'درېنۍ', 'څلرنۍ', 'پينځنۍ', 'جمعه', 'اونۍ'],\n  STANDALONEWEEKDAYS: ['يونۍ', 'دونۍ', 'درېنۍ', 'څلرنۍ', 'پينځنۍ', 'جمعه', 'اونۍ'],\n  SHORTWEEKDAYS: ['يونۍ', 'دونۍ', 'درېنۍ', 'څلرنۍ', 'پينځنۍ', 'جمعه', 'اونۍ'],\n  STANDALONESHORTWEEKDAYS: ['يونۍ', 'دونۍ', 'درېنۍ', 'څلرنۍ', 'پينځنۍ', 'جمعه', 'اونۍ'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['لومړۍ ربعه', '۲مه ربعه', '۳مه ربعه', '۴مه ربعه'],\n  QUARTERS: ['لومړۍ ربعه', '۲مه ربعه', '۳مه ربعه', '۴مه ربعه'],\n  AMPMS: ['غ.م.', 'غ.و.'],\n  DATEFORMATS: ['EEEE د y د MMMM d', 'د y د MMMM d', 'y MMM d', 'y/M/d'],\n  TIMEFORMATS: ['H:mm:ss (zzzz)', 'H:mm:ss (z)', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [3, 4],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale ps_AF.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ps_AF = goog.i18n.DateTimeSymbols_ps;\n\n\n/**\n * Date/time formatting symbols for locale ps_PK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ps_PK = {\n  ZERODIGIT: 0x06F0,\n  ERAS: ['له میلاد وړاندې', 'م.'],\n  ERANAMES: ['له میلاد څخه وړاندې', 'له میلاد څخه وروسته'],\n  NARROWMONTHS: ['ج', 'ف', 'م', 'ا', 'م', 'ج', 'ج', 'ا', 'س', 'ا', 'ن', 'د'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['جنوري', 'فبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سېپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  STANDALONEMONTHS: ['جنوري', 'فېبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  SHORTMONTHS: ['جنوري', 'فبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سېپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  STANDALONESHORTMONTHS: ['جنوري', 'فبروري', 'مارچ', 'اپریل', 'مۍ', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  WEEKDAYS: ['يونۍ', 'دونۍ', 'درېنۍ', 'څلرنۍ', 'پينځنۍ', 'جمعه', 'اونۍ'],\n  STANDALONEWEEKDAYS: ['يونۍ', 'دونۍ', 'درېنۍ', 'څلرنۍ', 'پينځنۍ', 'جمعه', 'اونۍ'],\n  SHORTWEEKDAYS: ['يونۍ', 'دونۍ', 'درېنۍ', 'څلرنۍ', 'پينځنۍ', 'جمعه', 'اونۍ'],\n  STANDALONESHORTWEEKDAYS: ['يونۍ', 'دونۍ', 'درېنۍ', 'څلرنۍ', 'پينځنۍ', 'جمعه', 'اونۍ'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['لومړۍ ربعه', '۲مه ربعه', '۳مه ربعه', '۴مه ربعه'],\n  QUARTERS: ['لومړۍ ربعه', '۲مه ربعه', '۳مه ربعه', '۴مه ربعه'],\n  AMPMS: ['غ.م.', 'غ.و.'],\n  DATEFORMATS: ['EEEE د y د MMMM d', 'د y د MMMM d', 'y MMM d', 'y/M/d'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale pt_AO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pt_AO = {\n  ERAS: ['a.C.', 'd.C.'],\n  ERANAMES: ['antes de Cristo', 'depois de Cristo'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  STANDALONEMONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  SHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  STANDALONESHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  WEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  SHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  STANDALONESHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  NARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['da manhã', 'da tarde'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'dd/MM/y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'às\\' {0}', '{1} \\'às\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale pt_CH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pt_CH = {\n  ERAS: ['a.C.', 'd.C.'],\n  ERANAMES: ['antes de Cristo', 'depois de Cristo'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  STANDALONEMONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  SHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  STANDALONESHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  WEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  SHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  STANDALONESHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  NARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['da manhã', 'da tarde'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'dd/MM/y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'às\\' {0}', '{1} \\'às\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale pt_CV.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pt_CV = {\n  ERAS: ['a.C.', 'd.C.'],\n  ERANAMES: ['antes de Cristo', 'depois de Cristo'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  STANDALONEMONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  SHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  STANDALONESHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  WEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  SHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  STANDALONESHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  NARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['da manhã', 'da tarde'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'dd/MM/y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'às\\' {0}', '{1} \\'às\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale pt_GQ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pt_GQ = {\n  ERAS: ['a.C.', 'd.C.'],\n  ERANAMES: ['antes de Cristo', 'depois de Cristo'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  STANDALONEMONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  SHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  STANDALONESHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  WEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  SHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  STANDALONESHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  NARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['da manhã', 'da tarde'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'dd/MM/y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'às\\' {0}', '{1} \\'às\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale pt_GW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pt_GW = {\n  ERAS: ['a.C.', 'd.C.'],\n  ERANAMES: ['antes de Cristo', 'depois de Cristo'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  STANDALONEMONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  SHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  STANDALONESHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  WEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  SHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  STANDALONESHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  NARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['da manhã', 'da tarde'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'dd/MM/y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'às\\' {0}', '{1} \\'às\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale pt_LU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pt_LU = {\n  ERAS: ['a.C.', 'd.C.'],\n  ERANAMES: ['antes de Cristo', 'depois de Cristo'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  STANDALONEMONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  SHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  STANDALONESHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  WEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  SHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  STANDALONESHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  NARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['da manhã', 'da tarde'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'dd/MM/y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'às\\' {0}', '{1} \\'às\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale pt_MO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pt_MO = {\n  ERAS: ['a.C.', 'd.C.'],\n  ERANAMES: ['antes de Cristo', 'depois de Cristo'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  STANDALONEMONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  SHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  STANDALONESHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  WEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  SHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  STANDALONESHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  NARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['da manhã', 'da tarde'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'dd/MM/y', 'dd/MM/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} \\'às\\' {0}', '{1} \\'às\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale pt_MZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pt_MZ = {\n  ERAS: ['a.C.', 'd.C.'],\n  ERANAMES: ['antes de Cristo', 'depois de Cristo'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  STANDALONEMONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  SHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  STANDALONESHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  WEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  SHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  STANDALONESHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  NARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['da manhã', 'da tarde'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'dd/MM/y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'às\\' {0}', '{1} \\'às\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale pt_ST.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pt_ST = {\n  ERAS: ['a.C.', 'd.C.'],\n  ERANAMES: ['antes de Cristo', 'depois de Cristo'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  STANDALONEMONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  SHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  STANDALONESHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  WEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  SHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  STANDALONESHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  NARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['da manhã', 'da tarde'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'dd/MM/y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'às\\' {0}', '{1} \\'às\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale pt_TL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_pt_TL = {\n  ERAS: ['a.C.', 'd.C.'],\n  ERANAMES: ['antes de Cristo', 'depois de Cristo'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  STANDALONEMONTHS: ['janeiro', 'fevereiro', 'março', 'abril', 'maio', 'junho', 'julho', 'agosto', 'setembro', 'outubro', 'novembro', 'dezembro'],\n  SHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  STANDALONESHORTMONTHS: ['jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez'],\n  WEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  STANDALONEWEEKDAYS: ['domingo', 'segunda-feira', 'terça-feira', 'quarta-feira', 'quinta-feira', 'sexta-feira', 'sábado'],\n  SHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  STANDALONESHORTWEEKDAYS: ['domingo', 'segunda', 'terça', 'quarta', 'quinta', 'sexta', 'sábado'],\n  NARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'S', 'T', 'Q', 'Q', 'S', 'S'],\n  SHORTQUARTERS: ['T1', 'T2', 'T3', 'T4'],\n  QUARTERS: ['1.º trimestre', '2.º trimestre', '3.º trimestre', '4.º trimestre'],\n  AMPMS: ['da manhã', 'da tarde'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'dd/MM/y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'às\\' {0}', '{1} \\'às\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale qu.\n * @const\n */\ngoog.i18n.DateTimeSymbols_qu = {\n  ERAS: ['BCE', 'd.C.'],\n  ERANAMES: ['BCE', 'd.C.'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Setiembre', 'Octubre', 'Noviembre', 'Diciembre'],\n  STANDALONEMONTHS: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Setiembre', 'Octubre', 'Noviembre', 'Diciembre'],\n  SHORTMONTHS: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Set', 'Oct', 'Nov', 'Dic'],\n  STANDALONESHORTMONTHS: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Set', 'Oct', 'Nov', 'Dic'],\n  WEEKDAYS: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],\n  STANDALONEWEEKDAYS: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],\n  SHORTWEEKDAYS: ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sab'],\n  STANDALONESHORTWEEKDAYS: ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sab'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{0} {1}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale qu_BO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_qu_BO = {\n  ERAS: ['BCE', 'd.C.'],\n  ERANAMES: ['BCE', 'd.C.'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Setiembre', 'Octubre', 'Noviembre', 'Diciembre'],\n  STANDALONEMONTHS: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Setiembre', 'Octubre', 'Noviembre', 'Diciembre'],\n  SHORTMONTHS: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Set', 'Oct', 'Nov', 'Dic'],\n  STANDALONESHORTMONTHS: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Set', 'Oct', 'Nov', 'Dic'],\n  WEEKDAYS: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],\n  STANDALONEWEEKDAYS: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],\n  SHORTWEEKDAYS: ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sab'],\n  STANDALONESHORTWEEKDAYS: ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sab'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{0} {1}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale qu_EC.\n * @const\n */\ngoog.i18n.DateTimeSymbols_qu_EC = {\n  ERAS: ['BCE', 'd.C.'],\n  ERANAMES: ['BCE', 'd.C.'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Setiembre', 'Octubre', 'Noviembre', 'Diciembre'],\n  STANDALONEMONTHS: ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Setiembre', 'Octubre', 'Noviembre', 'Diciembre'],\n  SHORTMONTHS: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Set', 'Oct', 'Nov', 'Dic'],\n  STANDALONESHORTMONTHS: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Set', 'Oct', 'Nov', 'Dic'],\n  WEEKDAYS: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],\n  STANDALONEWEEKDAYS: ['Domingo', 'Lunes', 'Martes', 'Miércoles', 'Jueves', 'Viernes', 'Sábado'],\n  SHORTWEEKDAYS: ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sab'],\n  STANDALONESHORTWEEKDAYS: ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sab'],\n  NARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'M', 'X', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{0} {1}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale qu_PE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_qu_PE = goog.i18n.DateTimeSymbols_qu;\n\n\n/**\n * Date/time formatting symbols for locale rm.\n * @const\n */\ngoog.i18n.DateTimeSymbols_rm = {\n  ERAS: ['av. Cr.', 's. Cr.'],\n  ERANAMES: ['avant Cristus', 'suenter Cristus'],\n  NARROWMONTHS: ['S', 'F', 'M', 'A', 'M', 'Z', 'F', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['S', 'F', 'M', 'A', 'M', 'Z', 'F', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['schaner', 'favrer', 'mars', 'avrigl', 'matg', 'zercladur', 'fanadur', 'avust', 'settember', 'october', 'november', 'december'],\n  STANDALONEMONTHS: ['schaner', 'favrer', 'mars', 'avrigl', 'matg', 'zercladur', 'fanadur', 'avust', 'settember', 'october', 'november', 'december'],\n  SHORTMONTHS: ['schan.', 'favr.', 'mars', 'avr.', 'matg', 'zercl.', 'fan.', 'avust', 'sett.', 'oct.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['schan.', 'favr.', 'mars', 'avr.', 'matg', 'zercl.', 'fan.', 'avust', 'sett.', 'oct.', 'nov.', 'dec.'],\n  WEEKDAYS: ['dumengia', 'glindesdi', 'mardi', 'mesemna', 'gievgia', 'venderdi', 'sonda'],\n  STANDALONEWEEKDAYS: ['dumengia', 'glindesdi', 'mardi', 'mesemna', 'gievgia', 'venderdi', 'sonda'],\n  SHORTWEEKDAYS: ['du', 'gli', 'ma', 'me', 'gie', 've', 'so'],\n  STANDALONESHORTWEEKDAYS: ['du', 'gli', 'ma', 'me', 'gie', 've', 'so'],\n  NARROWWEEKDAYS: ['D', 'G', 'M', 'M', 'G', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'G', 'M', 'M', 'G', 'V', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1. quartal', '2. quartal', '3. quartal', '4. quartal'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, \\'ils\\' d \\'da\\' MMMM y', 'd \\'da\\' MMMM y', 'dd-MM-y', 'dd-MM-yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale rm_CH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_rm_CH = goog.i18n.DateTimeSymbols_rm;\n\n\n/**\n * Date/time formatting symbols for locale rn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_rn = {\n  ERAS: ['Mb.Y.', 'Ny.Y'],\n  ERANAMES: ['Mbere ya Yezu', 'Nyuma ya Yezu'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['Nzero', 'Ruhuhuma', 'Ntwarante', 'Ndamukiza', 'Rusama', 'Ruheshi', 'Mukakaro', 'Nyandagaro', 'Nyakanga', 'Gitugutu', 'Munyonyo', 'Kigarama'],\n  STANDALONEMONTHS: ['Nzero', 'Ruhuhuma', 'Ntwarante', 'Ndamukiza', 'Rusama', 'Ruheshi', 'Mukakaro', 'Nyandagaro', 'Nyakanga', 'Gitugutu', 'Munyonyo', 'Kigarama'],\n  SHORTMONTHS: ['Mut.', 'Gas.', 'Wer.', 'Mat.', 'Gic.', 'Kam.', 'Nya.', 'Kan.', 'Nze.', 'Ukw.', 'Ugu.', 'Uku.'],\n  STANDALONESHORTMONTHS: ['Mut.', 'Gas.', 'Wer.', 'Mat.', 'Gic.', 'Kam.', 'Nya.', 'Kan.', 'Nze.', 'Ukw.', 'Ugu.', 'Uku.'],\n  WEEKDAYS: ['Ku w’indwi', 'Ku wa mbere', 'Ku wa kabiri', 'Ku wa gatatu', 'Ku wa kane', 'Ku wa gatanu', 'Ku wa gatandatu'],\n  STANDALONEWEEKDAYS: ['Ku w’indwi', 'Ku wa mbere', 'Ku wa kabiri', 'Ku wa gatatu', 'Ku wa kane', 'Ku wa gatanu', 'Ku wa gatandatu'],\n  SHORTWEEKDAYS: ['cu.', 'mbe.', 'kab.', 'gtu.', 'kan.', 'gnu.', 'gnd.'],\n  STANDALONESHORTWEEKDAYS: ['cu.', 'mbe.', 'kab.', 'gtu.', 'kan.', 'gnu.', 'gnd.'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['I1', 'I2', 'I3', 'I4'],\n  QUARTERS: ['Igice ca mbere c’umwaka', 'Igice ca kabiri c’umwaka', 'Igice ca gatatu c’umwaka', 'Igice ca kane c’umwaka'],\n  AMPMS: ['Z.MU.', 'Z.MW.'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale rn_BI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_rn_BI = goog.i18n.DateTimeSymbols_rn;\n\n\n/**\n * Date/time formatting symbols for locale ro_MD.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ro_MD = {\n  ERAS: ['î.Hr.', 'd.Hr.'],\n  ERANAMES: ['înainte de Hristos', 'după Hristos'],\n  NARROWMONTHS: ['I', 'F', 'M', 'A', 'M', 'I', 'I', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['I', 'F', 'M', 'A', 'M', 'I', 'I', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['ianuarie', 'februarie', 'martie', 'aprilie', 'mai', 'iunie', 'iulie', 'august', 'septembrie', 'octombrie', 'noiembrie', 'decembrie'],\n  STANDALONEMONTHS: ['ianuarie', 'februarie', 'martie', 'aprilie', 'mai', 'iunie', 'iulie', 'august', 'septembrie', 'octombrie', 'noiembrie', 'decembrie'],\n  SHORTMONTHS: ['ian.', 'feb.', 'mar.', 'apr.', 'mai', 'iun.', 'iul.', 'aug.', 'sept.', 'oct.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['ian.', 'feb.', 'mar.', 'apr.', 'mai', 'iun.', 'iul.', 'aug.', 'sept.', 'oct.', 'nov.', 'dec.'],\n  WEEKDAYS: ['duminică', 'luni', 'marți', 'miercuri', 'joi', 'vineri', 'sâmbătă'],\n  STANDALONEWEEKDAYS: ['duminică', 'luni', 'marți', 'miercuri', 'joi', 'vineri', 'sâmbătă'],\n  SHORTWEEKDAYS: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],\n  STANDALONESHORTWEEKDAYS: ['Dum', 'Lun', 'Mar', 'Mie', 'Joi', 'Vin', 'Sâm'],\n  NARROWWEEKDAYS: ['D', 'L', 'Ma', 'Mi', 'J', 'V', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'L', 'Ma', 'Mi', 'J', 'V', 'S'],\n  SHORTQUARTERS: ['trim. 1', 'trim. 2', 'trim. 3', 'trim. 4'],\n  QUARTERS: ['trimestrul 1', 'trimestrul 2', 'trimestrul 3', 'trimestrul 4'],\n  AMPMS: ['a.m.', 'p.m.'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd.MM.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ro_RO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ro_RO = goog.i18n.DateTimeSymbols_ro;\n\n\n/**\n * Date/time formatting symbols for locale rof.\n * @const\n */\ngoog.i18n.DateTimeSymbols_rof = {\n  ERAS: ['KM', 'BM'],\n  ERANAMES: ['Kabla ya Mayesu', 'Baada ya Mayesu'],\n  NARROWMONTHS: ['K', 'K', 'K', 'K', 'T', 'S', 'S', 'N', 'T', 'I', 'I', 'I'],\n  STANDALONENARROWMONTHS: ['K', 'K', 'K', 'K', 'T', 'S', 'S', 'N', 'T', 'I', 'I', 'I'],\n  MONTHS: ['Mweri wa kwanza', 'Mweri wa kaili', 'Mweri wa katatu', 'Mweri wa kaana', 'Mweri wa tanu', 'Mweri wa sita', 'Mweri wa saba', 'Mweri wa nane', 'Mweri wa tisa', 'Mweri wa ikumi', 'Mweri wa ikumi na moja', 'Mweri wa ikumi na mbili'],\n  STANDALONEMONTHS: ['Mweri wa kwanza', 'Mweri wa kaili', 'Mweri wa katatu', 'Mweri wa kaana', 'Mweri wa tanu', 'Mweri wa sita', 'Mweri wa saba', 'Mweri wa nane', 'Mweri wa tisa', 'Mweri wa ikumi', 'Mweri wa ikumi na moja', 'Mweri wa ikumi na mbili'],\n  SHORTMONTHS: ['M1', 'M2', 'M3', 'M4', 'M5', 'M6', 'M7', 'M8', 'M9', 'M10', 'M11', 'M12'],\n  STANDALONESHORTMONTHS: ['M1', 'M2', 'M3', 'M4', 'M5', 'M6', 'M7', 'M8', 'M9', 'M10', 'M11', 'M12'],\n  WEEKDAYS: ['Ijumapili', 'Ijumatatu', 'Ijumanne', 'Ijumatano', 'Alhamisi', 'Ijumaa', 'Ijumamosi'],\n  STANDALONEWEEKDAYS: ['Ijumapili', 'Ijumatatu', 'Ijumanne', 'Ijumatano', 'Alhamisi', 'Ijumaa', 'Ijumamosi'],\n  SHORTWEEKDAYS: ['Ijp', 'Ijt', 'Ijn', 'Ijtn', 'Alh', 'Iju', 'Ijm'],\n  STANDALONESHORTWEEKDAYS: ['Ijp', 'Ijt', 'Ijn', 'Ijtn', 'Alh', 'Iju', 'Ijm'],\n  NARROWWEEKDAYS: ['2', '3', '4', '5', '6', '7', '1'],\n  STANDALONENARROWWEEKDAYS: ['2', '3', '4', '5', '6', '7', '1'],\n  SHORTQUARTERS: ['R1', 'R2', 'R3', 'R4'],\n  QUARTERS: ['Robo ya kwanza', 'Robo ya kaili', 'Robo ya katatu', 'Robo ya kaana'],\n  AMPMS: ['kang’ama', 'kingoto'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale rof_TZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_rof_TZ = goog.i18n.DateTimeSymbols_rof;\n\n\n/**\n * Date/time formatting symbols for locale ru_BY.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ru_BY = {\n  ERAS: ['до н. э.', 'н. э.'],\n  ERANAMES: ['до Рождества Христова', 'от Рождества Христова'],\n  NARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  STANDALONENARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  MONTHS: ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'],\n  STANDALONEMONTHS: ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'],\n  SHORTMONTHS: ['янв.', 'февр.', 'мар.', 'апр.', 'мая', 'июн.', 'июл.', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n  STANDALONESHORTMONTHS: ['янв.', 'февр.', 'март', 'апр.', 'май', 'июнь', 'июль', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n  WEEKDAYS: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],\n  STANDALONEWEEKDAYS: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],\n  SHORTWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  STANDALONESHORTWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  NARROWWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  STANDALONENARROWWEEKDAYS: ['В', 'П', 'В', 'С', 'Ч', 'П', 'С'],\n  SHORTQUARTERS: ['1-й кв.', '2-й кв.', '3-й кв.', '4-й кв.'],\n  QUARTERS: ['1-й квартал', '2-й квартал', '3-й квартал', '4-й квартал'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y \\'г\\'.', 'd MMMM y \\'г\\'.', 'd MMM y \\'г\\'.', 'dd.MM.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ru_KG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ru_KG = {\n  ERAS: ['до н. э.', 'н. э.'],\n  ERANAMES: ['до Рождества Христова', 'от Рождества Христова'],\n  NARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  STANDALONENARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  MONTHS: ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'],\n  STANDALONEMONTHS: ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'],\n  SHORTMONTHS: ['янв.', 'февр.', 'мар.', 'апр.', 'мая', 'июн.', 'июл.', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n  STANDALONESHORTMONTHS: ['янв.', 'февр.', 'март', 'апр.', 'май', 'июнь', 'июль', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n  WEEKDAYS: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],\n  STANDALONEWEEKDAYS: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],\n  SHORTWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  STANDALONESHORTWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  NARROWWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  STANDALONENARROWWEEKDAYS: ['В', 'П', 'В', 'С', 'Ч', 'П', 'С'],\n  SHORTQUARTERS: ['1-й кв.', '2-й кв.', '3-й кв.', '4-й кв.'],\n  QUARTERS: ['1-й квартал', '2-й квартал', '3-й квартал', '4-й квартал'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y \\'г\\'.', 'd MMMM y \\'г\\'.', 'd MMM y \\'г\\'.', 'dd.MM.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ru_KZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ru_KZ = {\n  ERAS: ['до н. э.', 'н. э.'],\n  ERANAMES: ['до Рождества Христова', 'от Рождества Христова'],\n  NARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  STANDALONENARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  MONTHS: ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'],\n  STANDALONEMONTHS: ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'],\n  SHORTMONTHS: ['янв.', 'февр.', 'мар.', 'апр.', 'мая', 'июн.', 'июл.', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n  STANDALONESHORTMONTHS: ['янв.', 'февр.', 'март', 'апр.', 'май', 'июнь', 'июль', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n  WEEKDAYS: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],\n  STANDALONEWEEKDAYS: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],\n  SHORTWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  STANDALONESHORTWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  NARROWWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  STANDALONENARROWWEEKDAYS: ['В', 'П', 'В', 'С', 'Ч', 'П', 'С'],\n  SHORTQUARTERS: ['1-й кв.', '2-й кв.', '3-й кв.', '4-й кв.'],\n  QUARTERS: ['1-й квартал', '2-й квартал', '3-й квартал', '4-й квартал'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y \\'г\\'.', 'd MMMM y \\'г\\'.', 'd MMM y \\'г\\'.', 'dd.MM.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ru_MD.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ru_MD = {\n  ERAS: ['до н. э.', 'н. э.'],\n  ERANAMES: ['до Рождества Христова', 'от Рождества Христова'],\n  NARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  STANDALONENARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  MONTHS: ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'],\n  STANDALONEMONTHS: ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'],\n  SHORTMONTHS: ['янв.', 'февр.', 'мар.', 'апр.', 'мая', 'июн.', 'июл.', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n  STANDALONESHORTMONTHS: ['янв.', 'февр.', 'март', 'апр.', 'май', 'июнь', 'июль', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n  WEEKDAYS: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],\n  STANDALONEWEEKDAYS: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],\n  SHORTWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  STANDALONESHORTWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  NARROWWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  STANDALONENARROWWEEKDAYS: ['В', 'П', 'В', 'С', 'Ч', 'П', 'С'],\n  SHORTQUARTERS: ['1-й кв.', '2-й кв.', '3-й кв.', '4-й кв.'],\n  QUARTERS: ['1-й квартал', '2-й квартал', '3-й квартал', '4-й квартал'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y \\'г\\'.', 'd MMMM y \\'г\\'.', 'd MMM y \\'г\\'.', 'dd.MM.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ru_RU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ru_RU = goog.i18n.DateTimeSymbols_ru;\n\n\n/**\n * Date/time formatting symbols for locale ru_UA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ru_UA = {\n  ERAS: ['до н. э.', 'н. э.'],\n  ERANAMES: ['до Рождества Христова', 'от Рождества Христова'],\n  NARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  STANDALONENARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  MONTHS: ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'],\n  STANDALONEMONTHS: ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'],\n  SHORTMONTHS: ['янв.', 'февр.', 'мар.', 'апр.', 'мая', 'июн.', 'июл.', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n  STANDALONESHORTMONTHS: ['янв.', 'февр.', 'март', 'апр.', 'май', 'июнь', 'июль', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n  WEEKDAYS: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],\n  STANDALONEWEEKDAYS: ['воскресенье', 'понедельник', 'вторник', 'среда', 'четверг', 'пятница', 'суббота'],\n  SHORTWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  STANDALONESHORTWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  NARROWWEEKDAYS: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],\n  STANDALONENARROWWEEKDAYS: ['В', 'П', 'В', 'С', 'Ч', 'П', 'С'],\n  SHORTQUARTERS: ['1-й кв.', '2-й кв.', '3-й кв.', '4-й кв.'],\n  QUARTERS: ['1-й квартал', '2-й квартал', '3-й квартал', '4-й квартал'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y \\'г\\'.', 'd MMMM y \\'г\\'.', 'd MMM y \\'г\\'.', 'dd.MM.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale rw.\n * @const\n */\ngoog.i18n.DateTimeSymbols_rw = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['Mutarama', 'Gashyantare', 'Werurwe', 'Mata', 'Gicuransi', 'Kamena', 'Nyakanga', 'Kanama', 'Nzeli', 'Ukwakira', 'Ugushyingo', 'Ukuboza'],\n  STANDALONEMONTHS: ['Mutarama', 'Gashyantare', 'Werurwe', 'Mata', 'Gicuransi', 'Kamena', 'Nyakanga', 'Kanama', 'Nzeli', 'Ukwakira', 'Ugushyingo', 'Ukuboza'],\n  SHORTMONTHS: ['mut.', 'gas.', 'wer.', 'mat.', 'gic.', 'kam.', 'nya.', 'kan.', 'nze.', 'ukw.', 'ugu.', 'uku.'],\n  STANDALONESHORTMONTHS: ['mut.', 'gas.', 'wer.', 'mat.', 'gic.', 'kam.', 'nya.', 'kan.', 'nze.', 'ukw.', 'ugu.', 'uku.'],\n  WEEKDAYS: ['Ku cyumweru', 'Kuwa mbere', 'Kuwa kabiri', 'Kuwa gatatu', 'Kuwa kane', 'Kuwa gatanu', 'Kuwa gatandatu'],\n  STANDALONEWEEKDAYS: ['Ku cyumweru', 'Kuwa mbere', 'Kuwa kabiri', 'Kuwa gatatu', 'Kuwa kane', 'Kuwa gatanu', 'Kuwa gatandatu'],\n  SHORTWEEKDAYS: ['cyu.', 'mbe.', 'kab.', 'gtu.', 'kan.', 'gnu.', 'gnd.'],\n  STANDALONESHORTWEEKDAYS: ['cyu.', 'mbe.', 'kab.', 'gtu.', 'kan.', 'gnu.', 'gnd.'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['I1', 'I2', 'I3', 'I4'],\n  QUARTERS: ['igihembwe cya mbere', 'igihembwe cya kabiri', 'igihembwe cya gatatu', 'igihembwe cya kane'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale rw_RW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_rw_RW = goog.i18n.DateTimeSymbols_rw;\n\n\n/**\n * Date/time formatting symbols for locale rwk.\n * @const\n */\ngoog.i18n.DateTimeSymbols_rwk = {\n  ERAS: ['KK', 'BK'],\n  ERANAMES: ['Kabla ya Kristu', 'Baada ya Kristu'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januari', 'Februari', 'Machi', 'Aprilyi', 'Mei', 'Junyi', 'Julyai', 'Agusti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  STANDALONEMONTHS: ['Januari', 'Februari', 'Machi', 'Aprilyi', 'Mei', 'Junyi', 'Julyai', 'Agusti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  WEEKDAYS: ['Jumapilyi', 'Jumatatuu', 'Jumanne', 'Jumatanu', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  STANDALONEWEEKDAYS: ['Jumapilyi', 'Jumatatuu', 'Jumanne', 'Jumatanu', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  SHORTWEEKDAYS: ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'],\n  STANDALONESHORTWEEKDAYS: ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'],\n  NARROWWEEKDAYS: ['J', 'J', 'J', 'J', 'A', 'I', 'J'],\n  STANDALONENARROWWEEKDAYS: ['J', 'J', 'J', 'J', 'A', 'I', 'J'],\n  SHORTQUARTERS: ['R1', 'R2', 'R3', 'R4'],\n  QUARTERS: ['Robo 1', 'Robo 2', 'Robo 3', 'Robo 4'],\n  AMPMS: ['utuko', 'kyiukonyi'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale rwk_TZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_rwk_TZ = goog.i18n.DateTimeSymbols_rwk;\n\n\n/**\n * Date/time formatting symbols for locale sah.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sah = {\n  ERAS: ['б. э. и.', 'б. э'],\n  ERANAMES: ['б. э. и.', 'б. э'],\n  NARROWMONTHS: ['Т', 'О', 'К', 'М', 'Ы', 'Б', 'О', 'А', 'Б', 'А', 'С', 'А'],\n  STANDALONENARROWMONTHS: ['Т', 'О', 'К', 'М', 'Ы', 'Б', 'О', 'А', 'Б', 'А', 'С', 'А'],\n  MONTHS: ['Тохсунньу', 'Олунньу', 'Кулун тутар', 'Муус устар', 'Ыам ыйын', 'Бэс ыйын', 'От ыйын', 'Атырдьых ыйын', 'Балаҕан ыйын', 'Алтынньы', 'Сэтинньи', 'ахсынньы'],\n  STANDALONEMONTHS: ['тохсунньу', 'олунньу', 'кулун тутар', 'муус устар', 'ыам ыйа', 'бэс ыйа', 'от ыйа', 'атырдьых ыйа', 'балаҕан ыйа', 'алтынньы', 'сэтинньи', 'ахсынньы'],\n  SHORTMONTHS: ['Тохс', 'Олун', 'Клн', 'Мсу', 'Ыам', 'Бэс', 'Отй', 'Атр', 'Блҕ', 'Алт', 'Сэт', 'Ахс'],\n  STANDALONESHORTMONTHS: ['Тохс', 'Олун', 'Клн', 'Мсу', 'Ыам', 'Бэс', 'Отй', 'Атр', 'Блҕ', 'Алт', 'Сэт', 'Ахс'],\n  WEEKDAYS: ['баскыһыанньа', 'бэнидиэнньик', 'оптуорунньук', 'сэрэдэ', 'чэппиэр', 'Бээтиҥсэ', 'субуота'],\n  STANDALONEWEEKDAYS: ['баскыһыанньа', 'бэнидиэнньик', 'оптуорунньук', 'сэрэдэ', 'чэппиэр', 'Бээтиҥсэ', 'субуота'],\n  SHORTWEEKDAYS: ['бс', 'бн', 'оп', 'сэ', 'чп', 'бэ', 'сб'],\n  STANDALONESHORTWEEKDAYS: ['бс', 'бн', 'оп', 'сэ', 'чп', 'бэ', 'сб'],\n  NARROWWEEKDAYS: ['Б', 'Б', 'О', 'С', 'Ч', 'Б', 'С'],\n  STANDALONENARROWWEEKDAYS: ['Б', 'Б', 'О', 'С', 'Ч', 'Б', 'С'],\n  SHORTQUARTERS: ['1-кы кб', '2-с кб', '3-с кб', '4-с кб'],\n  QUARTERS: ['1-кы кыбаартал', '2-с кыбаартал', '3-с кыбаартал', '4-с кыбаартал'],\n  AMPMS: ['ЭИ', 'ЭК'],\n  DATEFORMATS: ['y \\'сыл\\' MMMM d \\'күнэ\\', EEEE', 'y, MMMM d', 'y, MMM d', 'yy/M/d'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale sah_RU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sah_RU = goog.i18n.DateTimeSymbols_sah;\n\n\n/**\n * Date/time formatting symbols for locale saq.\n * @const\n */\ngoog.i18n.DateTimeSymbols_saq = {\n  ERAS: ['KK', 'BK'],\n  ERANAMES: ['Kabla ya Christo', 'Baada ya Christo'],\n  NARROWMONTHS: ['O', 'W', 'O', 'O', 'I', 'I', 'S', 'I', 'S', 'T', 'T', 'T'],\n  STANDALONENARROWMONTHS: ['O', 'W', 'O', 'O', 'I', 'I', 'S', 'I', 'S', 'T', 'T', 'T'],\n  MONTHS: ['Lapa le obo', 'Lapa le waare', 'Lapa le okuni', 'Lapa le ong’wan', 'Lapa le imet', 'Lapa le ile', 'Lapa le sapa', 'Lapa le isiet', 'Lapa le saal', 'Lapa le tomon', 'Lapa le tomon obo', 'Lapa le tomon waare'],\n  STANDALONEMONTHS: ['Lapa le obo', 'Lapa le waare', 'Lapa le okuni', 'Lapa le ong’wan', 'Lapa le imet', 'Lapa le ile', 'Lapa le sapa', 'Lapa le isiet', 'Lapa le saal', 'Lapa le tomon', 'Lapa le tomon obo', 'Lapa le tomon waare'],\n  SHORTMONTHS: ['Obo', 'Waa', 'Oku', 'Ong', 'Ime', 'Ile', 'Sap', 'Isi', 'Saa', 'Tom', 'Tob', 'Tow'],\n  STANDALONESHORTMONTHS: ['Obo', 'Waa', 'Oku', 'Ong', 'Ime', 'Ile', 'Sap', 'Isi', 'Saa', 'Tom', 'Tob', 'Tow'],\n  WEEKDAYS: ['Mderot ee are', 'Mderot ee kuni', 'Mderot ee ong’wan', 'Mderot ee inet', 'Mderot ee ile', 'Mderot ee sapa', 'Mderot ee kwe'],\n  STANDALONEWEEKDAYS: ['Mderot ee are', 'Mderot ee kuni', 'Mderot ee ong’wan', 'Mderot ee inet', 'Mderot ee ile', 'Mderot ee sapa', 'Mderot ee kwe'],\n  SHORTWEEKDAYS: ['Are', 'Kun', 'Ong', 'Ine', 'Ile', 'Sap', 'Kwe'],\n  STANDALONESHORTWEEKDAYS: ['Are', 'Kun', 'Ong', 'Ine', 'Ile', 'Sap', 'Kwe'],\n  NARROWWEEKDAYS: ['A', 'K', 'O', 'I', 'I', 'S', 'K'],\n  STANDALONENARROWWEEKDAYS: ['A', 'K', 'O', 'I', 'I', 'S', 'K'],\n  SHORTQUARTERS: ['R1', 'R2', 'R3', 'R4'],\n  QUARTERS: ['Robo 1', 'Robo 2', 'Robo 3', 'Robo 4'],\n  AMPMS: ['Tesiran', 'Teipa'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale saq_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_saq_KE = goog.i18n.DateTimeSymbols_saq;\n\n\n/**\n * Date/time formatting symbols for locale sbp.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sbp = {\n  ERAS: ['AK', 'PK'],\n  ERANAMES: ['Ashanali uKilisito', 'Pamwandi ya Kilisto'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['Mupalangulwa', 'Mwitope', 'Mushende', 'Munyi', 'Mushende Magali', 'Mujimbi', 'Mushipepo', 'Mupuguto', 'Munyense', 'Mokhu', 'Musongandembwe', 'Muhaano'],\n  STANDALONEMONTHS: ['Mupalangulwa', 'Mwitope', 'Mushende', 'Munyi', 'Mushende Magali', 'Mujimbi', 'Mushipepo', 'Mupuguto', 'Munyense', 'Mokhu', 'Musongandembwe', 'Muhaano'],\n  SHORTMONTHS: ['Mup', 'Mwi', 'Msh', 'Mun', 'Mag', 'Muj', 'Msp', 'Mpg', 'Mye', 'Mok', 'Mus', 'Muh'],\n  STANDALONESHORTMONTHS: ['Mup', 'Mwi', 'Msh', 'Mun', 'Mag', 'Muj', 'Msp', 'Mpg', 'Mye', 'Mok', 'Mus', 'Muh'],\n  WEEKDAYS: ['Mulungu', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alahamisi', 'Ijumaa', 'Jumamosi'],\n  STANDALONEWEEKDAYS: ['Mulungu', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alahamisi', 'Ijumaa', 'Jumamosi'],\n  SHORTWEEKDAYS: ['Mul', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'],\n  STANDALONESHORTWEEKDAYS: ['Mul', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'],\n  NARROWWEEKDAYS: ['M', 'J', 'J', 'J', 'A', 'I', 'J'],\n  STANDALONENARROWWEEKDAYS: ['M', 'J', 'J', 'J', 'A', 'I', 'J'],\n  SHORTQUARTERS: ['L1', 'L2', 'L3', 'L4'],\n  QUARTERS: ['Lobo 1', 'Lobo 2', 'Lobo 3', 'Lobo 4'],\n  AMPMS: ['Lwamilawu', 'Pashamihe'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sbp_TZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sbp_TZ = goog.i18n.DateTimeSymbols_sbp;\n\n\n/**\n * Date/time formatting symbols for locale sd.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sd = {\n  ZERODIGIT: 0x0660,\n  ERAS: ['BC', 'CD'],\n  ERANAMES: ['مسيح کان اڳ', 'عيسوي کان پهرين'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['جنوري', 'فيبروري', 'مارچ', 'اپريل', 'مئي', 'جون', 'جولاءِ', 'آگسٽ', 'سيپٽمبر', 'آڪٽوبر', 'نومبر', 'ڊسمبر'],\n  STANDALONEMONTHS: ['جنوري', 'فيبروري', 'مارچ', 'اپريل', 'مئي', 'جون', 'جولاءِ', 'آگسٽ', 'سيپٽمبر', 'آڪٽوبر', 'نومبر', 'ڊسمبر'],\n  SHORTMONTHS: ['جنوري', 'فيبروري', 'مارچ', 'اپريل', 'مئي', 'جون', 'جولاءِ', 'آگسٽ', 'سيپٽمبر', 'آڪٽوبر', 'نومبر', 'ڊسمبر'],\n  STANDALONESHORTMONTHS: ['جنوري', 'فيبروري', 'مارچ', 'اپريل', 'مئي', 'جون', 'جولاءِ', 'آگسٽ', 'سيپٽمبر', 'آڪٽوبر', 'نومبر', 'ڊسمبر'],\n  WEEKDAYS: ['آچر', 'سومر', 'اڱارو', 'اربع', 'خميس', 'جمعو', 'ڇنڇر'],\n  STANDALONEWEEKDAYS: ['آچر', 'سومر', 'اڱارو', 'اربع', 'خميس', 'جمعو', 'ڇنڇر'],\n  SHORTWEEKDAYS: ['آچر', 'سومر', 'اڱارو', 'اربع', 'خميس', 'جمعو', 'ڇنڇر'],\n  STANDALONESHORTWEEKDAYS: ['آچر', 'سومر', 'اڱارو', 'اربع', 'خميس', 'جمعو', 'ڇنڇر'],\n  NARROWWEEKDAYS: ['آچر', 'سو', 'اڱارو', 'اربع', 'خم', 'جمعو', 'ڇنڇر'],\n  STANDALONENARROWWEEKDAYS: ['آچر', 'سو', 'اڱارو', 'اربع', 'خم', 'جمعو', 'ڇنڇر'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q5'],\n  QUARTERS: ['پهرين ٽي ماهي', 'ٻين ٽي ماهي', 'ٽين ٽي ماهي', 'چوٿين ٽي ماهي'],\n  AMPMS: ['صبح، منجهند', 'منجهند، شام'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale sd_PK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sd_PK = goog.i18n.DateTimeSymbols_sd;\n\n\n/**\n * Date/time formatting symbols for locale se.\n * @const\n */\ngoog.i18n.DateTimeSymbols_se = {\n  ERAS: ['o.Kr.', 'm.Kr.'],\n  ERANAMES: ['ovdal Kristtusa', 'maŋŋel Kristtusa'],\n  NARROWMONTHS: ['O', 'G', 'N', 'C', 'M', 'G', 'S', 'B', 'Č', 'G', 'S', 'J'],\n  STANDALONENARROWMONTHS: ['O', 'G', 'N', 'C', 'M', 'G', 'S', 'B', 'Č', 'G', 'S', 'J'],\n  MONTHS: ['ođđajagemánnu', 'guovvamánnu', 'njukčamánnu', 'cuoŋománnu', 'miessemánnu', 'geassemánnu', 'suoidnemánnu', 'borgemánnu', 'čakčamánnu', 'golggotmánnu', 'skábmamánnu', 'juovlamánnu'],\n  STANDALONEMONTHS: ['ođđajagemánnu', 'guovvamánnu', 'njukčamánnu', 'cuoŋománnu', 'miessemánnu', 'geassemánnu', 'suoidnemánnu', 'borgemánnu', 'čakčamánnu', 'golggotmánnu', 'skábmamánnu', 'juovlamánnu'],\n  SHORTMONTHS: ['ođđj', 'guov', 'njuk', 'cuo', 'mies', 'geas', 'suoi', 'borg', 'čakč', 'golg', 'skáb', 'juov'],\n  STANDALONESHORTMONTHS: ['ođđj', 'guov', 'njuk', 'cuo', 'mies', 'geas', 'suoi', 'borg', 'čakč', 'golg', 'skáb', 'juov'],\n  WEEKDAYS: ['sotnabeaivi', 'vuossárga', 'maŋŋebárga', 'gaskavahkku', 'duorasdat', 'bearjadat', 'lávvardat'],\n  STANDALONEWEEKDAYS: ['sotnabeaivi', 'vuossárga', 'maŋŋebárga', 'gaskavahkku', 'duorasdat', 'bearjadat', 'lávvardat'],\n  SHORTWEEKDAYS: ['sotn', 'vuos', 'maŋ', 'gask', 'duor', 'bear', 'láv'],\n  STANDALONESHORTWEEKDAYS: ['sotn', 'vuos', 'maŋ', 'gask', 'duor', 'bear', 'láv'],\n  NARROWWEEKDAYS: ['S', 'V', 'M', 'G', 'D', 'B', 'L'],\n  STANDALONENARROWWEEKDAYS: ['S', 'V', 'M', 'G', 'D', 'B', 'L'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['iđitbeaivet', 'eahketbeaivet'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale se_FI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_se_FI = {\n  ERAS: ['oKr.', 'mKr.'],\n  ERANAMES: ['ovdal Kristusa', 'maŋŋel Kristusa'],\n  NARROWMONTHS: ['O', 'G', 'N', 'C', 'M', 'G', 'S', 'B', 'Č', 'G', 'S', 'J'],\n  STANDALONENARROWMONTHS: ['O', 'G', 'N', 'C', 'M', 'G', 'S', 'B', 'Č', 'G', 'S', 'J'],\n  MONTHS: ['ođđajagemánnu', 'guovvamánnu', 'njukčamánnu', 'cuoŋománnu', 'miessemánnu', 'geassemánnu', 'suoidnemánnu', 'borgemánnu', 'čakčamánnu', 'golggotmánnu', 'skábmamánnu', 'juovlamánnu'],\n  STANDALONEMONTHS: ['ođđajagemánnu', 'guovvamánnu', 'njukčamánnu', 'cuoŋománnu', 'miessemánnu', 'geassemánnu', 'suoidnemánnu', 'borgemánnu', 'čakčamánnu', 'golggotmánnu', 'skábmamánnu', 'juovlamánnu'],\n  SHORTMONTHS: ['ođđj', 'guov', 'njuk', 'cuoŋ', 'mies', 'geas', 'suoi', 'borg', 'čakč', 'golg', 'skáb', 'juov'],\n  STANDALONESHORTMONTHS: ['ođđj', 'guov', 'njuk', 'cuoŋ', 'mies', 'geas', 'suoi', 'borg', 'čakč', 'golg', 'skáb', 'juov'],\n  WEEKDAYS: ['sotnabeaivi', 'mánnodat', 'disdat', 'gaskavahkku', 'duorastat', 'bearjadat', 'lávvordat'],\n  STANDALONEWEEKDAYS: ['sotnabeaivi', 'mánnodat', 'disdat', 'gaskavahkku', 'duorastat', 'bearjadat', 'lávvordat'],\n  SHORTWEEKDAYS: ['so', 'má', 'di', 'ga', 'du', 'be', 'lá'],\n  STANDALONESHORTWEEKDAYS: ['so', 'má', 'di', 'ga', 'du', 'be', 'lá'],\n  NARROWWEEKDAYS: ['S', 'M', 'D', 'G', 'D', 'B', 'L'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'D', 'G', 'D', 'B', 'L'],\n  SHORTQUARTERS: ['1Q', '2Q', '3Q', '4Q'],\n  QUARTERS: ['1. njealjádas', '2. njealjádas', '3. njealjádas', '4. njealjádas'],\n  AMPMS: ['ib', 'eb'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd.MM.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale se_NO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_se_NO = goog.i18n.DateTimeSymbols_se;\n\n\n/**\n * Date/time formatting symbols for locale se_SE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_se_SE = goog.i18n.DateTimeSymbols_se;\n\n\n/**\n * Date/time formatting symbols for locale seh.\n * @const\n */\ngoog.i18n.DateTimeSymbols_seh = {\n  ERAS: ['AC', 'AD'],\n  ERANAMES: ['Antes de Cristo', 'Anno Domini'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Janeiro', 'Fevreiro', 'Marco', 'Abril', 'Maio', 'Junho', 'Julho', 'Augusto', 'Setembro', 'Otubro', 'Novembro', 'Decembro'],\n  STANDALONEMONTHS: ['Janeiro', 'Fevreiro', 'Marco', 'Abril', 'Maio', 'Junho', 'Julho', 'Augusto', 'Setembro', 'Otubro', 'Novembro', 'Decembro'],\n  SHORTMONTHS: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Aug', 'Set', 'Otu', 'Nov', 'Dec'],\n  STANDALONESHORTMONTHS: ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Aug', 'Set', 'Otu', 'Nov', 'Dec'],\n  WEEKDAYS: ['Dimingu', 'Chiposi', 'Chipiri', 'Chitatu', 'Chinai', 'Chishanu', 'Sabudu'],\n  STANDALONEWEEKDAYS: ['Dimingu', 'Chiposi', 'Chipiri', 'Chitatu', 'Chinai', 'Chishanu', 'Sabudu'],\n  SHORTWEEKDAYS: ['Dim', 'Pos', 'Pir', 'Tat', 'Nai', 'Sha', 'Sab'],\n  STANDALONESHORTWEEKDAYS: ['Dim', 'Pos', 'Pir', 'Tat', 'Nai', 'Sha', 'Sab'],\n  NARROWWEEKDAYS: ['D', 'P', 'C', 'T', 'N', 'S', 'S'],\n  STANDALONENARROWWEEKDAYS: ['D', 'P', 'C', 'T', 'N', 'S', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMMM \\'de\\' y', 'd \\'de\\' MMM \\'de\\' y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale seh_MZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_seh_MZ = goog.i18n.DateTimeSymbols_seh;\n\n\n/**\n * Date/time formatting symbols for locale ses.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ses = {\n  ERAS: ['IJ', 'IZ'],\n  ERANAMES: ['Isaa jine', 'Isaa zamanoo'],\n  NARROWMONTHS: ['Ž', 'F', 'M', 'A', 'M', 'Ž', 'Ž', 'U', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['Ž', 'F', 'M', 'A', 'M', 'Ž', 'Ž', 'U', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'],\n  STANDALONEMONTHS: ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'],\n  SHORTMONTHS: ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'],\n  STANDALONESHORTMONTHS: ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'],\n  WEEKDAYS: ['Alhadi', 'Atinni', 'Atalaata', 'Alarba', 'Alhamiisa', 'Alzuma', 'Asibti'],\n  STANDALONEWEEKDAYS: ['Alhadi', 'Atinni', 'Atalaata', 'Alarba', 'Alhamiisa', 'Alzuma', 'Asibti'],\n  SHORTWEEKDAYS: ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'],\n  STANDALONESHORTWEEKDAYS: ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'],\n  NARROWWEEKDAYS: ['H', 'T', 'T', 'L', 'L', 'L', 'S'],\n  STANDALONENARROWWEEKDAYS: ['H', 'T', 'T', 'L', 'L', 'L', 'S'],\n  SHORTQUARTERS: ['A1', 'A2', 'A3', 'A4'],\n  QUARTERS: ['Arrubu 1', 'Arrubu 2', 'Arrubu 3', 'Arrubu 4'],\n  AMPMS: ['Adduha', 'Aluula'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ses_ML.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ses_ML = goog.i18n.DateTimeSymbols_ses;\n\n\n/**\n * Date/time formatting symbols for locale sg.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sg = {\n  ERAS: ['KnK', 'NpK'],\n  ERANAMES: ['Kôzo na Krîstu', 'Na pekô tî Krîstu'],\n  NARROWMONTHS: ['N', 'F', 'M', 'N', 'B', 'F', 'L', 'K', 'M', 'N', 'N', 'K'],\n  STANDALONENARROWMONTHS: ['N', 'F', 'M', 'N', 'B', 'F', 'L', 'K', 'M', 'N', 'N', 'K'],\n  MONTHS: ['Nyenye', 'Fulundïgi', 'Mbängü', 'Ngubùe', 'Bêläwü', 'Föndo', 'Lengua', 'Kükürü', 'Mvuka', 'Ngberere', 'Nabändüru', 'Kakauka'],\n  STANDALONEMONTHS: ['Nyenye', 'Fulundïgi', 'Mbängü', 'Ngubùe', 'Bêläwü', 'Föndo', 'Lengua', 'Kükürü', 'Mvuka', 'Ngberere', 'Nabändüru', 'Kakauka'],\n  SHORTMONTHS: ['Nye', 'Ful', 'Mbä', 'Ngu', 'Bêl', 'Fön', 'Len', 'Kük', 'Mvu', 'Ngb', 'Nab', 'Kak'],\n  STANDALONESHORTMONTHS: ['Nye', 'Ful', 'Mbä', 'Ngu', 'Bêl', 'Fön', 'Len', 'Kük', 'Mvu', 'Ngb', 'Nab', 'Kak'],\n  WEEKDAYS: ['Bikua-ôko', 'Bïkua-ûse', 'Bïkua-ptâ', 'Bïkua-usïö', 'Bïkua-okü', 'Lâpôsö', 'Lâyenga'],\n  STANDALONEWEEKDAYS: ['Bikua-ôko', 'Bïkua-ûse', 'Bïkua-ptâ', 'Bïkua-usïö', 'Bïkua-okü', 'Lâpôsö', 'Lâyenga'],\n  SHORTWEEKDAYS: ['Bk1', 'Bk2', 'Bk3', 'Bk4', 'Bk5', 'Lâp', 'Lây'],\n  STANDALONESHORTWEEKDAYS: ['Bk1', 'Bk2', 'Bk3', 'Bk4', 'Bk5', 'Lâp', 'Lây'],\n  NARROWWEEKDAYS: ['K', 'S', 'T', 'S', 'K', 'P', 'Y'],\n  STANDALONENARROWWEEKDAYS: ['K', 'S', 'T', 'S', 'K', 'P', 'Y'],\n  SHORTQUARTERS: ['F4–1', 'F4–2', 'F4–3', 'F4–4'],\n  QUARTERS: ['Fângbisïö ôko', 'Fângbisïö ûse', 'Fângbisïö otâ', 'Fângbisïö usïö'],\n  AMPMS: ['ND', 'LK'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sg_CF.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sg_CF = goog.i18n.DateTimeSymbols_sg;\n\n\n/**\n * Date/time formatting symbols for locale shi.\n * @const\n */\ngoog.i18n.DateTimeSymbols_shi = {\n  ERAS: ['ⴷⴰⵄ', 'ⴷⴼⵄ'],\n  ERANAMES: ['ⴷⴰⵜ ⵏ ⵄⵉⵙⴰ', 'ⴷⴼⴼⵉⵔ ⵏ ⵄⵉⵙⴰ'],\n  NARROWMONTHS: ['ⵉ', 'ⴱ', 'ⵎ', 'ⵉ', 'ⵎ', 'ⵢ', 'ⵢ', 'ⵖ', 'ⵛ', 'ⴽ', 'ⵏ', 'ⴷ'],\n  STANDALONENARROWMONTHS: ['ⵉ', 'ⴱ', 'ⵎ', 'ⵉ', 'ⵎ', 'ⵢ', 'ⵢ', 'ⵖ', 'ⵛ', 'ⴽ', 'ⵏ', 'ⴷ'],\n  MONTHS: ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵜⵓⴱⵔ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⴰⵏⴱⵉⵔ'],\n  STANDALONEMONTHS: ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵜⵓⴱⵔ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⴰⵏⴱⵉⵔ'],\n  SHORTMONTHS: ['ⵉⵏⵏ', 'ⴱⵕⴰ', 'ⵎⴰⵕ', 'ⵉⴱⵔ', 'ⵎⴰⵢ', 'ⵢⵓⵏ', 'ⵢⵓⵍ', 'ⵖⵓⵛ', 'ⵛⵓⵜ', 'ⴽⵜⵓ', 'ⵏⵓⵡ', 'ⴷⵓⵊ'],\n  STANDALONESHORTMONTHS: ['ⵉⵏⵏ', 'ⴱⵕⴰ', 'ⵎⴰⵕ', 'ⵉⴱⵔ', 'ⵎⴰⵢ', 'ⵢⵓⵏ', 'ⵢⵓⵍ', 'ⵖⵓⵛ', 'ⵛⵓⵜ', 'ⴽⵜⵓ', 'ⵏⵓⵡ', 'ⴷⵓⵊ'],\n  WEEKDAYS: ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵕⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'],\n  STANDALONEWEEKDAYS: ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵕⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'],\n  SHORTWEEKDAYS: ['ⴰⵙⴰ', 'ⴰⵢⵏ', 'ⴰⵙⵉ', 'ⴰⴽⵕ', 'ⴰⴽⵡ', 'ⴰⵙⵉⵎ', 'ⴰⵙⵉⴹ'],\n  STANDALONESHORTWEEKDAYS: ['ⴰⵙⴰ', 'ⴰⵢⵏ', 'ⴰⵙⵉ', 'ⴰⴽⵕ', 'ⴰⴽⵡ', 'ⴰⵙⵉⵎ', 'ⴰⵙⵉⴹ'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['ⴰⴽ 1', 'ⴰⴽ 2', 'ⴰⴽ 3', 'ⴰⴽ 4'],\n  QUARTERS: ['ⴰⴽⵕⴰⴹⵢⵓⵔ 1', 'ⴰⴽⵕⴰⴹⵢⵓⵔ 2', 'ⴰⴽⵕⴰⴹⵢⵓⵔ 3', 'ⴰⴽⵕⴰⴹⵢⵓⵔ 4'],\n  AMPMS: ['ⵜⵉⴼⴰⵡⵜ', 'ⵜⴰⴷⴳⴳⵯⴰⵜ'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale shi_Latn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_shi_Latn = {\n  ERAS: ['daɛ', 'dfɛ'],\n  ERANAMES: ['dat n ɛisa', 'dffir n ɛisa'],\n  NARROWMONTHS: ['i', 'b', 'm', 'i', 'm', 'y', 'y', 'ɣ', 'c', 'k', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['i', 'b', 'm', 'i', 'm', 'y', 'y', 'ɣ', 'c', 'k', 'n', 'd'],\n  MONTHS: ['innayr', 'bṛayṛ', 'maṛṣ', 'ibrir', 'mayyu', 'yunyu', 'yulyuz', 'ɣuct', 'cutanbir', 'ktubr', 'nuwanbir', 'dujanbir'],\n  STANDALONEMONTHS: ['innayr', 'bṛayṛ', 'maṛṣ', 'ibrir', 'mayyu', 'yunyu', 'yulyuz', 'ɣuct', 'cutanbir', 'ktubr', 'nuwanbir', 'dujanbir'],\n  SHORTMONTHS: ['inn', 'bṛa', 'maṛ', 'ibr', 'may', 'yun', 'yul', 'ɣuc', 'cut', 'ktu', 'nuw', 'duj'],\n  STANDALONESHORTMONTHS: ['inn', 'bṛa', 'maṛ', 'ibr', 'may', 'yun', 'yul', 'ɣuc', 'cut', 'ktu', 'nuw', 'duj'],\n  WEEKDAYS: ['asamas', 'aynas', 'asinas', 'akṛas', 'akwas', 'asimwas', 'asiḍyas'],\n  STANDALONEWEEKDAYS: ['asamas', 'aynas', 'asinas', 'akṛas', 'akwas', 'asimwas', 'asiḍyas'],\n  SHORTWEEKDAYS: ['asa', 'ayn', 'asi', 'akṛ', 'akw', 'asim', 'asiḍ'],\n  STANDALONESHORTWEEKDAYS: ['asa', 'ayn', 'asi', 'akṛ', 'akw', 'asim', 'asiḍ'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['ak 1', 'ak 2', 'ak 3', 'ak 4'],\n  QUARTERS: ['akṛaḍyur 1', 'akṛaḍyur 2', 'akṛaḍyur 3', 'akṛaḍyur 4'],\n  AMPMS: ['tifawt', 'tadggʷat'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale shi_Latn_MA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_shi_Latn_MA = {\n  ERAS: ['daɛ', 'dfɛ'],\n  ERANAMES: ['dat n ɛisa', 'dffir n ɛisa'],\n  NARROWMONTHS: ['i', 'b', 'm', 'i', 'm', 'y', 'y', 'ɣ', 'c', 'k', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['i', 'b', 'm', 'i', 'm', 'y', 'y', 'ɣ', 'c', 'k', 'n', 'd'],\n  MONTHS: ['innayr', 'bṛayṛ', 'maṛṣ', 'ibrir', 'mayyu', 'yunyu', 'yulyuz', 'ɣuct', 'cutanbir', 'ktubr', 'nuwanbir', 'dujanbir'],\n  STANDALONEMONTHS: ['innayr', 'bṛayṛ', 'maṛṣ', 'ibrir', 'mayyu', 'yunyu', 'yulyuz', 'ɣuct', 'cutanbir', 'ktubr', 'nuwanbir', 'dujanbir'],\n  SHORTMONTHS: ['inn', 'bṛa', 'maṛ', 'ibr', 'may', 'yun', 'yul', 'ɣuc', 'cut', 'ktu', 'nuw', 'duj'],\n  STANDALONESHORTMONTHS: ['inn', 'bṛa', 'maṛ', 'ibr', 'may', 'yun', 'yul', 'ɣuc', 'cut', 'ktu', 'nuw', 'duj'],\n  WEEKDAYS: ['asamas', 'aynas', 'asinas', 'akṛas', 'akwas', 'asimwas', 'asiḍyas'],\n  STANDALONEWEEKDAYS: ['asamas', 'aynas', 'asinas', 'akṛas', 'akwas', 'asimwas', 'asiḍyas'],\n  SHORTWEEKDAYS: ['asa', 'ayn', 'asi', 'akṛ', 'akw', 'asim', 'asiḍ'],\n  STANDALONESHORTWEEKDAYS: ['asa', 'ayn', 'asi', 'akṛ', 'akw', 'asim', 'asiḍ'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['ak 1', 'ak 2', 'ak 3', 'ak 4'],\n  QUARTERS: ['akṛaḍyur 1', 'akṛaḍyur 2', 'akṛaḍyur 3', 'akṛaḍyur 4'],\n  AMPMS: ['tifawt', 'tadggʷat'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale shi_Tfng.\n * @const\n */\ngoog.i18n.DateTimeSymbols_shi_Tfng = goog.i18n.DateTimeSymbols_shi;\n\n\n/**\n * Date/time formatting symbols for locale shi_Tfng_MA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_shi_Tfng_MA = goog.i18n.DateTimeSymbols_shi;\n\n\n/**\n * Date/time formatting symbols for locale si_LK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_si_LK = goog.i18n.DateTimeSymbols_si;\n\n\n/**\n * Date/time formatting symbols for locale sk_SK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sk_SK = goog.i18n.DateTimeSymbols_sk;\n\n\n/**\n * Date/time formatting symbols for locale sl_SI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sl_SI = goog.i18n.DateTimeSymbols_sl;\n\n\n/**\n * Date/time formatting symbols for locale smn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_smn = {\n  ERAS: ['oKr.', 'mKr.'],\n  ERANAMES: ['Ovdil Kristus šoddâm', 'maŋa Kristus šoddâm'],\n  NARROWMONTHS: ['U', 'K', 'NJ', 'C', 'V', 'K', 'S', 'P', 'Č', 'R', 'S', 'J'],\n  STANDALONENARROWMONTHS: ['U', 'K', 'NJ', 'C', 'V', 'K', 'S', 'P', 'Č', 'R', 'S', 'J'],\n  MONTHS: ['uđđâivemáánu', 'kuovâmáánu', 'njuhčâmáánu', 'cuáŋuimáánu', 'vyesimáánu', 'kesimáánu', 'syeinimáánu', 'porgemáánu', 'čohčâmáánu', 'roovvâdmáánu', 'skammâmáánu', 'juovlâmáánu'],\n  STANDALONEMONTHS: ['uđđâivemáánu', 'kuovâmáánu', 'njuhčâmáánu', 'cuáŋuimáánu', 'vyesimáánu', 'kesimáánu', 'syeinimáánu', 'porgemáánu', 'čohčâmáánu', 'roovvâdmáánu', 'skammâmáánu', 'juovlâmáánu'],\n  SHORTMONTHS: ['uđiv', 'kuovâ', 'njuhčâ', 'cuáŋui', 'vyesi', 'kesi', 'syeini', 'porge', 'čohčâ', 'roovvâd', 'skammâ', 'juovlâ'],\n  STANDALONESHORTMONTHS: ['uđiv', 'kuovâ', 'njuhčâ', 'cuáŋui', 'vyesi', 'kesi', 'syeini', 'porge', 'čohčâ', 'roovvâd', 'skammâ', 'juovlâ'],\n  WEEKDAYS: ['pasepeeivi', 'vuossaargâ', 'majebaargâ', 'koskoho', 'tuorâstuv', 'vástuppeeivi', 'lávurduv'],\n  STANDALONEWEEKDAYS: ['pasepeivi', 'vuossargâ', 'majebargâ', 'koskokko', 'tuorâstâh', 'vástuppeivi', 'lávurdâh'],\n  SHORTWEEKDAYS: ['pas', 'vuo', 'maj', 'kos', 'tuo', 'vás', 'láv'],\n  STANDALONESHORTWEEKDAYS: ['pas', 'vuo', 'maj', 'kos', 'tuo', 'vás', 'láv'],\n  NARROWWEEKDAYS: ['p', 'V', 'M', 'K', 'T', 'V', 'L'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['1. niälj.', '2. niälj.', '3. niälj.', '4. niälj.'],\n  QUARTERS: ['1. niäljádâs', '2. niäljádâs', '3. niäljádâs', '4. niäljádâs'],\n  AMPMS: ['ip.', 'ep.'],\n  DATEFORMATS: ['cccc, MMMM d. y', 'MMMM d. y', 'MMM d. y', 'd.M.y'],\n  TIMEFORMATS: ['H.mm.ss zzzz', 'H.mm.ss z', 'H.mm.ss', 'H.mm'],\n  DATETIMEFORMATS: ['{1} \\'tme\\' {0}', '{1} \\'tme\\' {0}', '{1} \\'tme\\' {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale smn_FI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_smn_FI = goog.i18n.DateTimeSymbols_smn;\n\n\n/**\n * Date/time formatting symbols for locale sn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sn = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['Kristo asati auya', 'mugore ramambo vedu'],\n  NARROWMONTHS: ['N', 'K', 'K', 'K', 'C', 'C', 'C', 'N', 'G', 'G', 'M', 'Z'],\n  STANDALONENARROWMONTHS: ['N', 'K', 'K', 'K', 'C', 'C', 'C', 'N', 'G', 'G', 'M', 'Z'],\n  MONTHS: ['Ndira', 'Kukadzi', 'Kurume', 'Kubvumbi', 'Chivabvu', 'Chikumi', 'Chikunguru', 'Nyamavhuvhu', 'Gunyana', 'Gumiguru', 'Mbudzi', 'Zvita'],\n  STANDALONEMONTHS: ['Ndira', 'Kukadzi', 'Kurume', 'Kubvumbi', 'Chivabvu', 'Chikumi', 'Chikunguru', 'Nyamavhuvhu', 'Gunyana', 'Gumiguru', 'Mbudzi', 'Zvita'],\n  SHORTMONTHS: ['Ndi', 'Kuk', 'Kur', 'Kub', 'Chv', 'Chk', 'Chg', 'Nya', 'Gun', 'Gum', 'Mbu', 'Zvi'],\n  STANDALONESHORTMONTHS: ['Ndi', 'Kuk', 'Kur', 'Kub', 'Chv', 'Chk', 'Chg', 'Nya', 'Gun', 'Gum', 'Mbu', 'Zvi'],\n  WEEKDAYS: ['Svondo', 'Muvhuro', 'Chipiri', 'Chitatu', 'China', 'Chishanu', 'Mugovera'],\n  STANDALONEWEEKDAYS: ['Svondo', 'Muvhuro', 'Chipiri', 'Chitatu', 'China', 'Chishanu', 'Mugovera'],\n  SHORTWEEKDAYS: ['Svo', 'Muv', 'Chp', 'Cht', 'Chn', 'Chs', 'Mug'],\n  STANDALONESHORTWEEKDAYS: ['Svo', 'Muv', 'Chp', 'Cht', 'Chn', 'Chs', 'Mug'],\n  NARROWWEEKDAYS: ['S', 'M', 'C', 'C', 'C', 'C', 'M'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'C', 'C', 'C', 'C', 'M'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['Kota 1', 'Kota 2', 'Kota 3', 'Kota 4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale sn_ZW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sn_ZW = goog.i18n.DateTimeSymbols_sn;\n\n\n/**\n * Date/time formatting symbols for locale so.\n * @const\n */\ngoog.i18n.DateTimeSymbols_so = {\n  ERAS: ['CH', 'CD'],\n  ERANAMES: ['Ciise Hortii', 'Ciise Dabadii'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'L', 'O', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'L', 'O', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Bisha Koobaad', 'Bisha Labaad', 'Bisha Saddexaad', 'Bisha Afraad', 'Bisha Shanaad', 'Bisha Lixaad', 'Bisha Todobaad', 'Bisha Sideedaad', 'Bisha Sagaalaad', 'Bisha Tobnaad', 'Bisha Kow iyo Tobnaad', 'Bisha Laba iyo Tobnaad'],\n  STANDALONEMONTHS: ['Jannaayo', 'Febraayo', 'Maarso', 'Abriil', 'May', 'Juun', 'Luuliyo', 'Ogost', 'Sebtembar', 'Oktoobar', 'Nofembar', 'Desembar'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Lul', 'Ogs', 'Seb', 'Okt', 'Nof', 'Dis'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Lul', 'Ogs', 'Seb', 'Okt', 'Nof', 'Dis'],\n  WEEKDAYS: ['Axad', 'Isniin', 'Salaasa', 'Arbaca', 'Khamiis', 'Jimce', 'Sabti'],\n  STANDALONEWEEKDAYS: ['Axad', 'Isniin', 'Salaasa', 'Arbaca', 'Khamiis', 'Jimce', 'Sabti'],\n  SHORTWEEKDAYS: ['Axd', 'Isn', 'Slsa', 'Arbc', 'Khms', 'Jmc', 'Sbti'],\n  STANDALONESHORTWEEKDAYS: ['Axd', 'Isn', 'Slsa', 'Arbc', 'Khms', 'Jmc', 'Sbti'],\n  NARROWWEEKDAYS: ['A', 'I', 'S', 'A', 'Kh', 'J', 'S'],\n  STANDALONENARROWWEEKDAYS: ['A', 'I', 'S', 'A', 'Kh', 'J', 'S'],\n  SHORTQUARTERS: ['R1', 'R2', 'R3', 'R4'],\n  QUARTERS: ['Rubaca 1aad', 'Rubaca 2aad', 'Rubaca 3aad', 'Rubaca 4aad'],\n  AMPMS: ['GH', 'GD'],\n  DATEFORMATS: ['EEEE, MMMM dd, y', 'dd MMMM y', 'dd-MMM-y', 'dd/MM/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale so_DJ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_so_DJ = {\n  ERAS: ['CH', 'CD'],\n  ERANAMES: ['Ciise Hortii', 'Ciise Dabadii'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'L', 'O', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'L', 'O', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Bisha Koobaad', 'Bisha Labaad', 'Bisha Saddexaad', 'Bisha Afraad', 'Bisha Shanaad', 'Bisha Lixaad', 'Bisha Todobaad', 'Bisha Sideedaad', 'Bisha Sagaalaad', 'Bisha Tobnaad', 'Bisha Kow iyo Tobnaad', 'Bisha Laba iyo Tobnaad'],\n  STANDALONEMONTHS: ['Jannaayo', 'Febraayo', 'Maarso', 'Abriil', 'May', 'Juun', 'Luuliyo', 'Ogost', 'Sebtembar', 'Oktoobar', 'Nofembar', 'Desembar'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Lul', 'Ogs', 'Seb', 'Okt', 'Nof', 'Dis'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Lul', 'Ogs', 'Seb', 'Okt', 'Nof', 'Dis'],\n  WEEKDAYS: ['Axad', 'Isniin', 'Salaasa', 'Arbaca', 'Khamiis', 'Jimce', 'Sabti'],\n  STANDALONEWEEKDAYS: ['Axad', 'Isniin', 'Salaasa', 'Arbaca', 'Khamiis', 'Jimce', 'Sabti'],\n  SHORTWEEKDAYS: ['Axd', 'Isn', 'Slsa', 'Arbc', 'Khms', 'Jmc', 'Sbti'],\n  STANDALONESHORTWEEKDAYS: ['Axd', 'Isn', 'Slsa', 'Arbc', 'Khms', 'Jmc', 'Sbti'],\n  NARROWWEEKDAYS: ['A', 'I', 'S', 'A', 'Kh', 'J', 'S'],\n  STANDALONENARROWWEEKDAYS: ['A', 'I', 'S', 'A', 'Kh', 'J', 'S'],\n  SHORTQUARTERS: ['R1', 'R2', 'R3', 'R4'],\n  QUARTERS: ['Rubaca 1aad', 'Rubaca 2aad', 'Rubaca 3aad', 'Rubaca 4aad'],\n  AMPMS: ['GH', 'GD'],\n  DATEFORMATS: ['EEEE, MMMM dd, y', 'dd MMMM y', 'dd-MMM-y', 'dd/MM/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale so_ET.\n * @const\n */\ngoog.i18n.DateTimeSymbols_so_ET = {\n  ERAS: ['CH', 'CD'],\n  ERANAMES: ['Ciise Hortii', 'Ciise Dabadii'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'L', 'O', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'L', 'O', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Bisha Koobaad', 'Bisha Labaad', 'Bisha Saddexaad', 'Bisha Afraad', 'Bisha Shanaad', 'Bisha Lixaad', 'Bisha Todobaad', 'Bisha Sideedaad', 'Bisha Sagaalaad', 'Bisha Tobnaad', 'Bisha Kow iyo Tobnaad', 'Bisha Laba iyo Tobnaad'],\n  STANDALONEMONTHS: ['Jannaayo', 'Febraayo', 'Maarso', 'Abriil', 'May', 'Juun', 'Luuliyo', 'Ogost', 'Sebtembar', 'Oktoobar', 'Nofembar', 'Desembar'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Lul', 'Ogs', 'Seb', 'Okt', 'Nof', 'Dis'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Lul', 'Ogs', 'Seb', 'Okt', 'Nof', 'Dis'],\n  WEEKDAYS: ['Axad', 'Isniin', 'Salaasa', 'Arbaca', 'Khamiis', 'Jimce', 'Sabti'],\n  STANDALONEWEEKDAYS: ['Axad', 'Isniin', 'Salaasa', 'Arbaca', 'Khamiis', 'Jimce', 'Sabti'],\n  SHORTWEEKDAYS: ['Axd', 'Isn', 'Slsa', 'Arbc', 'Khms', 'Jmc', 'Sbti'],\n  STANDALONESHORTWEEKDAYS: ['Axd', 'Isn', 'Slsa', 'Arbc', 'Khms', 'Jmc', 'Sbti'],\n  NARROWWEEKDAYS: ['A', 'I', 'S', 'A', 'Kh', 'J', 'S'],\n  STANDALONENARROWWEEKDAYS: ['A', 'I', 'S', 'A', 'Kh', 'J', 'S'],\n  SHORTQUARTERS: ['R1', 'R2', 'R3', 'R4'],\n  QUARTERS: ['Rubaca 1aad', 'Rubaca 2aad', 'Rubaca 3aad', 'Rubaca 4aad'],\n  AMPMS: ['GH', 'GD'],\n  DATEFORMATS: ['EEEE, MMMM dd, y', 'dd MMMM y', 'dd-MMM-y', 'dd/MM/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale so_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_so_KE = {\n  ERAS: ['CH', 'CD'],\n  ERANAMES: ['Ciise Hortii', 'Ciise Dabadii'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'L', 'O', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'L', 'O', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Bisha Koobaad', 'Bisha Labaad', 'Bisha Saddexaad', 'Bisha Afraad', 'Bisha Shanaad', 'Bisha Lixaad', 'Bisha Todobaad', 'Bisha Sideedaad', 'Bisha Sagaalaad', 'Bisha Tobnaad', 'Bisha Kow iyo Tobnaad', 'Bisha Laba iyo Tobnaad'],\n  STANDALONEMONTHS: ['Jannaayo', 'Febraayo', 'Maarso', 'Abriil', 'May', 'Juun', 'Luuliyo', 'Ogost', 'Sebtembar', 'Oktoobar', 'Nofembar', 'Desembar'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Lul', 'Ogs', 'Seb', 'Okt', 'Nof', 'Dis'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Lul', 'Ogs', 'Seb', 'Okt', 'Nof', 'Dis'],\n  WEEKDAYS: ['Axad', 'Isniin', 'Salaasa', 'Arbaca', 'Khamiis', 'Jimce', 'Sabti'],\n  STANDALONEWEEKDAYS: ['Axad', 'Isniin', 'Salaasa', 'Arbaca', 'Khamiis', 'Jimce', 'Sabti'],\n  SHORTWEEKDAYS: ['Axd', 'Isn', 'Slsa', 'Arbc', 'Khms', 'Jmc', 'Sbti'],\n  STANDALONESHORTWEEKDAYS: ['Axd', 'Isn', 'Slsa', 'Arbc', 'Khms', 'Jmc', 'Sbti'],\n  NARROWWEEKDAYS: ['A', 'I', 'S', 'A', 'Kh', 'J', 'S'],\n  STANDALONENARROWWEEKDAYS: ['A', 'I', 'S', 'A', 'Kh', 'J', 'S'],\n  SHORTQUARTERS: ['R1', 'R2', 'R3', 'R4'],\n  QUARTERS: ['Rubaca 1aad', 'Rubaca 2aad', 'Rubaca 3aad', 'Rubaca 4aad'],\n  AMPMS: ['GH', 'GD'],\n  DATEFORMATS: ['EEEE, MMMM dd, y', 'dd MMMM y', 'dd-MMM-y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale so_SO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_so_SO = goog.i18n.DateTimeSymbols_so;\n\n\n/**\n * Date/time formatting symbols for locale sq_AL.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sq_AL = goog.i18n.DateTimeSymbols_sq;\n\n\n/**\n * Date/time formatting symbols for locale sq_MK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sq_MK = {\n  ERAS: ['p.K.', 'mb.K.'],\n  ERANAMES: ['para Krishtit', 'mbas Krishtit'],\n  NARROWMONTHS: ['j', 'sh', 'm', 'p', 'm', 'q', 'k', 'g', 'sh', 't', 'n', 'dh'],\n  STANDALONENARROWMONTHS: ['j', 'sh', 'm', 'p', 'm', 'q', 'k', 'g', 'sh', 't', 'n', 'dh'],\n  MONTHS: ['janar', 'shkurt', 'mars', 'prill', 'maj', 'qershor', 'korrik', 'gusht', 'shtator', 'tetor', 'nëntor', 'dhjetor'],\n  STANDALONEMONTHS: ['janar', 'shkurt', 'mars', 'prill', 'maj', 'qershor', 'korrik', 'gusht', 'shtator', 'tetor', 'nëntor', 'dhjetor'],\n  SHORTMONTHS: ['jan', 'shk', 'mar', 'pri', 'maj', 'qer', 'korr', 'gush', 'sht', 'tet', 'nën', 'dhj'],\n  STANDALONESHORTMONTHS: ['jan', 'shk', 'mar', 'pri', 'maj', 'qer', 'korr', 'gush', 'sht', 'tet', 'nën', 'dhj'],\n  WEEKDAYS: ['e diel', 'e hënë', 'e martë', 'e mërkurë', 'e enjte', 'e premte', 'e shtunë'],\n  STANDALONEWEEKDAYS: ['e diel', 'e hënë', 'e martë', 'e mërkurë', 'e enjte', 'e premte', 'e shtunë'],\n  SHORTWEEKDAYS: ['Die', 'Hën', 'Mar', 'Mër', 'Enj', 'Pre', 'Sht'],\n  STANDALONESHORTWEEKDAYS: ['die', 'hën', 'mar', 'mër', 'enj', 'pre', 'sht'],\n  NARROWWEEKDAYS: ['d', 'h', 'm', 'm', 'e', 'p', 'sh'],\n  STANDALONENARROWWEEKDAYS: ['d', 'h', 'm', 'm', 'e', 'p', 'sh'],\n  SHORTQUARTERS: ['tremujori I', 'tremujori II', 'tremujori III', 'tremujori IV'],\n  QUARTERS: ['tremujori i parë', 'tremujori i dytë', 'tremujori i tretë', 'tremujori i katërt'],\n  AMPMS: ['e paradites', 'e pasdites'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd.M.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'në\\' {0}', '{1} \\'në\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sq_XK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sq_XK = {\n  ERAS: ['p.K.', 'mb.K.'],\n  ERANAMES: ['para Krishtit', 'mbas Krishtit'],\n  NARROWMONTHS: ['j', 'sh', 'm', 'p', 'm', 'q', 'k', 'g', 'sh', 't', 'n', 'dh'],\n  STANDALONENARROWMONTHS: ['j', 'sh', 'm', 'p', 'm', 'q', 'k', 'g', 'sh', 't', 'n', 'dh'],\n  MONTHS: ['janar', 'shkurt', 'mars', 'prill', 'maj', 'qershor', 'korrik', 'gusht', 'shtator', 'tetor', 'nëntor', 'dhjetor'],\n  STANDALONEMONTHS: ['janar', 'shkurt', 'mars', 'prill', 'maj', 'qershor', 'korrik', 'gusht', 'shtator', 'tetor', 'nëntor', 'dhjetor'],\n  SHORTMONTHS: ['jan', 'shk', 'mar', 'pri', 'maj', 'qer', 'korr', 'gush', 'sht', 'tet', 'nën', 'dhj'],\n  STANDALONESHORTMONTHS: ['jan', 'shk', 'mar', 'pri', 'maj', 'qer', 'korr', 'gush', 'sht', 'tet', 'nën', 'dhj'],\n  WEEKDAYS: ['e diel', 'e hënë', 'e martë', 'e mërkurë', 'e enjte', 'e premte', 'e shtunë'],\n  STANDALONEWEEKDAYS: ['e diel', 'e hënë', 'e martë', 'e mërkurë', 'e enjte', 'e premte', 'e shtunë'],\n  SHORTWEEKDAYS: ['Die', 'Hën', 'Mar', 'Mër', 'Enj', 'Pre', 'Sht'],\n  STANDALONESHORTWEEKDAYS: ['die', 'hën', 'mar', 'mër', 'enj', 'pre', 'sht'],\n  NARROWWEEKDAYS: ['d', 'h', 'm', 'm', 'e', 'p', 'sh'],\n  STANDALONENARROWWEEKDAYS: ['d', 'h', 'm', 'm', 'e', 'p', 'sh'],\n  SHORTQUARTERS: ['tremujori I', 'tremujori II', 'tremujori III', 'tremujori IV'],\n  QUARTERS: ['tremujori i parë', 'tremujori i dytë', 'tremujori i tretë', 'tremujori i katërt'],\n  AMPMS: ['e paradites', 'e pasdites'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'd.M.yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'në\\' {0}', '{1} \\'në\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sr_Cyrl.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sr_Cyrl = goog.i18n.DateTimeSymbols_sr;\n\n\n/**\n * Date/time formatting symbols for locale sr_Cyrl_BA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sr_Cyrl_BA = {\n  ERAS: ['п. н. е.', 'н. е.'],\n  ERANAMES: ['прије нове ере', 'нове ере'],\n  NARROWMONTHS: ['ј', 'ф', 'м', 'а', 'м', 'ј', 'ј', 'а', 'с', 'о', 'н', 'д'],\n  STANDALONENARROWMONTHS: ['ј', 'ф', 'м', 'а', 'м', 'ј', 'ј', 'а', 'с', 'о', 'н', 'д'],\n  MONTHS: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],\n  STANDALONEMONTHS: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],\n  SHORTMONTHS: ['јан', 'феб', 'мар', 'апр', 'мај', 'јун', 'јул', 'авг', 'сеп', 'окт', 'нов', 'дец'],\n  STANDALONESHORTMONTHS: ['јан', 'феб', 'март', 'апр', 'мај', 'јун', 'јул', 'авг', 'септ', 'окт', 'нов', 'дец'],\n  WEEKDAYS: ['недјеља', 'понедељак', 'уторак', 'сриједа', 'четвртак', 'петак', 'субота'],\n  STANDALONEWEEKDAYS: ['недјеља', 'понедељак', 'уторак', 'сриједа', 'четвртак', 'петак', 'субота'],\n  SHORTWEEKDAYS: ['нед', 'пон', 'ут', 'ср', 'чет', 'пет', 'суб'],\n  STANDALONESHORTWEEKDAYS: ['нед', 'пон', 'ут', 'ср', 'чет', 'пет', 'суб'],\n  NARROWWEEKDAYS: ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],\n  STANDALONENARROWWEEKDAYS: ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],\n  SHORTQUARTERS: ['К1', 'К2', 'К3', 'К4'],\n  QUARTERS: ['први квартал', 'други квартал', 'трећи квартал', 'четврти квартал'],\n  AMPMS: ['прије подне', 'по подне'],\n  DATEFORMATS: ['EEEE, dd. MMMM y.', 'dd. MMMM y.', 'dd.MM.y.', 'd.M.yy.'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sr_Cyrl_ME.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sr_Cyrl_ME = {\n  ERAS: ['п. н. е.', 'н. е.'],\n  ERANAMES: ['прије нове ере', 'нове ере'],\n  NARROWMONTHS: ['ј', 'ф', 'м', 'а', 'м', 'ј', 'ј', 'а', 'с', 'о', 'н', 'д'],\n  STANDALONENARROWMONTHS: ['ј', 'ф', 'м', 'а', 'м', 'ј', 'ј', 'а', 'с', 'о', 'н', 'д'],\n  MONTHS: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],\n  STANDALONEMONTHS: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],\n  SHORTMONTHS: ['јан', 'феб', 'март', 'апр', 'мај', 'јун', 'јул', 'авг', 'септ', 'окт', 'нов', 'дец'],\n  STANDALONESHORTMONTHS: ['јан', 'феб', 'март', 'апр', 'мај', 'јун', 'јул', 'авг', 'септ', 'окт', 'нов', 'дец'],\n  WEEKDAYS: ['недјеља', 'понедељак', 'уторак', 'сриједа', 'четвртак', 'петак', 'субота'],\n  STANDALONEWEEKDAYS: ['недјеља', 'понедељак', 'уторак', 'сриједа', 'четвртак', 'петак', 'субота'],\n  SHORTWEEKDAYS: ['нед', 'пон', 'уто', 'сре', 'чет', 'пет', 'суб'],\n  STANDALONESHORTWEEKDAYS: ['нед', 'пон', 'уто', 'сре', 'чет', 'пет', 'суб'],\n  NARROWWEEKDAYS: ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],\n  STANDALONENARROWWEEKDAYS: ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],\n  SHORTQUARTERS: ['К1', 'К2', 'К3', 'К4'],\n  QUARTERS: ['први квартал', 'други квартал', 'трећи квартал', 'четврти квартал'],\n  AMPMS: ['прије подне', 'по подне'],\n  DATEFORMATS: ['EEEE, dd. MMMM y.', 'dd. MMMM y.', 'dd.MM.y.', 'd.M.yy.'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sr_Cyrl_RS.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sr_Cyrl_RS = goog.i18n.DateTimeSymbols_sr;\n\n\n/**\n * Date/time formatting symbols for locale sr_Cyrl_XK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sr_Cyrl_XK = {\n  ERAS: ['п. н. е.', 'н. е.'],\n  ERANAMES: ['пре нове ере', 'нове ере'],\n  NARROWMONTHS: ['ј', 'ф', 'м', 'а', 'м', 'ј', 'ј', 'а', 'с', 'о', 'н', 'д'],\n  STANDALONENARROWMONTHS: ['ј', 'ф', 'м', 'а', 'м', 'ј', 'ј', 'а', 'с', 'о', 'н', 'д'],\n  MONTHS: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],\n  STANDALONEMONTHS: ['јануар', 'фебруар', 'март', 'април', 'мај', 'јун', 'јул', 'август', 'септембар', 'октобар', 'новембар', 'децембар'],\n  SHORTMONTHS: ['јан', 'феб', 'март', 'апр', 'мај', 'јун', 'јул', 'авг', 'септ', 'окт', 'нов', 'дец'],\n  STANDALONESHORTMONTHS: ['јан', 'феб', 'март', 'апр', 'мај', 'јун', 'јул', 'авг', 'септ', 'окт', 'нов', 'дец'],\n  WEEKDAYS: ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'],\n  STANDALONEWEEKDAYS: ['недеља', 'понедељак', 'уторак', 'среда', 'четвртак', 'петак', 'субота'],\n  SHORTWEEKDAYS: ['нед', 'пон', 'уто', 'сре', 'чет', 'пет', 'суб'],\n  STANDALONESHORTWEEKDAYS: ['нед', 'пон', 'уто', 'сре', 'чет', 'пет', 'суб'],\n  NARROWWEEKDAYS: ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],\n  STANDALONENARROWWEEKDAYS: ['н', 'п', 'у', 'с', 'ч', 'п', 'с'],\n  SHORTQUARTERS: ['К1', 'К2', 'К3', 'К4'],\n  QUARTERS: ['први квартал', 'други квартал', 'трећи квартал', 'четврти квартал'],\n  AMPMS: ['пре подне', 'по подне'],\n  DATEFORMATS: ['EEEE, dd. MMMM y.', 'dd. MMMM y.', 'dd.MM.y.', 'd.M.yy.'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sr_Latn_BA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sr_Latn_BA = {\n  ERAS: ['p. n. e.', 'n. e.'],\n  ERANAMES: ['prije nove ere', 'nove ere'],\n  NARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  MONTHS: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  STANDALONEMONTHS: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  SHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'avg', 'sep', 'okt', 'nov', 'dec'],\n  STANDALONESHORTMONTHS: ['jan', 'feb', 'mart', 'apr', 'maj', 'jun', 'jul', 'avg', 'sept', 'okt', 'nov', 'dec'],\n  WEEKDAYS: ['nedjelja', 'ponedeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'],\n  STANDALONEWEEKDAYS: ['nedjelja', 'ponedeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'],\n  SHORTWEEKDAYS: ['ned', 'pon', 'ut', 'sr', 'čet', 'pet', 'sub'],\n  STANDALONESHORTWEEKDAYS: ['ned', 'pon', 'ut', 'sr', 'čet', 'pet', 'sub'],\n  NARROWWEEKDAYS: ['n', 'p', 'u', 's', 'č', 'p', 's'],\n  STANDALONENARROWWEEKDAYS: ['n', 'p', 'u', 's', 'č', 'p', 's'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['prvi kvartal', 'drugi kvartal', 'treći kvartal', 'četvrti kvartal'],\n  AMPMS: ['prije podne', 'po podne'],\n  DATEFORMATS: ['EEEE, dd. MMMM y.', 'dd. MMMM y.', 'dd.MM.y.', 'd.M.yy.'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sr_Latn_ME.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sr_Latn_ME = {\n  ERAS: ['p. n. e.', 'n. e.'],\n  ERANAMES: ['prije nove ere', 'nove ere'],\n  NARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  MONTHS: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  STANDALONEMONTHS: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mart', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sept.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan.', 'feb.', 'mart', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sept.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['nedjelja', 'ponedeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'],\n  STANDALONEWEEKDAYS: ['nedjelja', 'ponedeljak', 'utorak', 'srijeda', 'četvrtak', 'petak', 'subota'],\n  SHORTWEEKDAYS: ['ned.', 'pon.', 'ut.', 'sr.', 'čet.', 'pet.', 'sub.'],\n  STANDALONESHORTWEEKDAYS: ['ned.', 'pon.', 'ut.', 'sr.', 'čet.', 'pet.', 'sub.'],\n  NARROWWEEKDAYS: ['n', 'p', 'u', 's', 'č', 'p', 's'],\n  STANDALONENARROWWEEKDAYS: ['n', 'p', 'u', 's', 'č', 'p', 's'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['prvi kvartal', 'drugi kvartal', 'treći kvartal', 'četvrti kvartal'],\n  AMPMS: ['prije podne', 'po podne'],\n  DATEFORMATS: ['EEEE, dd. MMMM y.', 'dd. MMMM y.', 'dd.MM.y.', 'd.M.yy.'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sr_Latn_RS.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sr_Latn_RS = {\n  ERAS: ['p. n. e.', 'n. e.'],\n  ERANAMES: ['pre nove ere', 'nove ere'],\n  NARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  MONTHS: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  STANDALONEMONTHS: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  SHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'avg', 'sep', 'okt', 'nov', 'dec'],\n  STANDALONESHORTMONTHS: ['jan', 'feb', 'mar', 'apr', 'maj', 'jun', 'jul', 'avg', 'sep', 'okt', 'nov', 'dec'],\n  WEEKDAYS: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],\n  STANDALONEWEEKDAYS: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],\n  SHORTWEEKDAYS: ['ned', 'pon', 'uto', 'sre', 'čet', 'pet', 'sub'],\n  STANDALONESHORTWEEKDAYS: ['ned', 'pon', 'uto', 'sre', 'čet', 'pet', 'sub'],\n  NARROWWEEKDAYS: ['n', 'p', 'u', 's', 'č', 'p', 's'],\n  STANDALONENARROWWEEKDAYS: ['n', 'p', 'u', 's', 'č', 'p', 's'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['prvi kvartal', 'drugi kvartal', 'treći kvartal', 'četvrti kvartal'],\n  AMPMS: ['pre podne', 'po podne'],\n  DATEFORMATS: ['EEEE, dd. MMMM y.', 'dd. MMMM y.', 'dd.MM.y.', 'd.M.yy.'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sr_Latn_XK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sr_Latn_XK = {\n  ERAS: ['p. n. e.', 'n. e.'],\n  ERANAMES: ['pre nove ere', 'nove ere'],\n  NARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  STANDALONENARROWMONTHS: ['j', 'f', 'm', 'a', 'm', 'j', 'j', 'a', 's', 'o', 'n', 'd'],\n  MONTHS: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  STANDALONEMONTHS: ['januar', 'februar', 'mart', 'april', 'maj', 'jun', 'jul', 'avgust', 'septembar', 'oktobar', 'novembar', 'decembar'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mart', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sept.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan.', 'feb.', 'mart', 'apr.', 'maj', 'jun', 'jul', 'avg.', 'sept.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],\n  STANDALONEWEEKDAYS: ['nedelja', 'ponedeljak', 'utorak', 'sreda', 'četvrtak', 'petak', 'subota'],\n  SHORTWEEKDAYS: ['ned.', 'pon.', 'ut.', 'sr.', 'čet.', 'pet.', 'sub.'],\n  STANDALONESHORTWEEKDAYS: ['ned.', 'pon.', 'ut.', 'sr.', 'čet.', 'pet.', 'sub.'],\n  NARROWWEEKDAYS: ['n', 'p', 'u', 's', 'č', 'p', 's'],\n  STANDALONENARROWWEEKDAYS: ['n', 'p', 'u', 's', 'č', 'p', 's'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['prvi kvartal', 'drugi kvartal', 'treći kvartal', 'četvrti kvartal'],\n  AMPMS: ['pre podne', 'po podne'],\n  DATEFORMATS: ['EEEE, dd. MMMM y.', 'dd. MMMM y.', 'dd.MM.y.', 'd.M.yy.'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale sv_AX.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sv_AX = goog.i18n.DateTimeSymbols_sv;\n\n\n/**\n * Date/time formatting symbols for locale sv_FI.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sv_FI = {\n  ERAS: ['f.Kr.', 'e.Kr.'],\n  ERANAMES: ['före Kristus', 'efter Kristus'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober', 'november', 'december'],\n  STANDALONEMONTHS: ['januari', 'februari', 'mars', 'april', 'maj', 'juni', 'juli', 'augusti', 'september', 'oktober', 'november', 'december'],\n  SHORTMONTHS: ['jan.', 'feb.', 'mars', 'apr.', 'maj', 'juni', 'juli', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  STANDALONESHORTMONTHS: ['jan.', 'feb.', 'mars', 'apr.', 'maj', 'juni', 'juli', 'aug.', 'sep.', 'okt.', 'nov.', 'dec.'],\n  WEEKDAYS: ['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'],\n  STANDALONEWEEKDAYS: ['söndag', 'måndag', 'tisdag', 'onsdag', 'torsdag', 'fredag', 'lördag'],\n  SHORTWEEKDAYS: ['sön', 'mån', 'tis', 'ons', 'tors', 'fre', 'lör'],\n  STANDALONESHORTWEEKDAYS: ['sön', 'mån', 'tis', 'ons', 'tors', 'fre', 'lör'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'O', 'T', 'F', 'L'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'O', 'T', 'F', 'L'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1:a kvartalet', '2:a kvartalet', '3:e kvartalet', '4:e kvartalet'],\n  AMPMS: ['fm', 'em'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'dd-MM-y'],\n  TIMEFORMATS: ['\\'kl\\'. HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale sv_SE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sv_SE = goog.i18n.DateTimeSymbols_sv;\n\n\n/**\n * Date/time formatting symbols for locale sw_CD.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sw_CD = goog.i18n.DateTimeSymbols_sw;\n\n\n/**\n * Date/time formatting symbols for locale sw_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sw_KE = {\n  ERAS: ['KK', 'BK'],\n  ERANAMES: ['Kabla ya Kristo', 'Baada ya Kristo'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  STANDALONEMONTHS: ['Januari', 'Februari', 'Machi', 'Aprili', 'Mei', 'Juni', 'Julai', 'Agosti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  WEEKDAYS: ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  STANDALONEWEEKDAYS: ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  SHORTWEEKDAYS: ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  STANDALONESHORTWEEKDAYS: ['Jumapili', 'Jumatatu', 'Jumanne', 'Jumatano', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Robo ya 1', 'Robo ya 2', 'Robo ya 3', 'Robo ya 4'],\n  QUARTERS: ['Robo ya 1', 'Robo ya 2', 'Robo ya 3', 'Robo ya 4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'saa\\' {0}', '{1} \\'saa\\' {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale sw_TZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sw_TZ = goog.i18n.DateTimeSymbols_sw;\n\n\n/**\n * Date/time formatting symbols for locale sw_UG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_sw_UG = goog.i18n.DateTimeSymbols_sw;\n\n\n/**\n * Date/time formatting symbols for locale ta_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ta_IN = goog.i18n.DateTimeSymbols_ta;\n\n\n/**\n * Date/time formatting symbols for locale ta_LK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ta_LK = {\n  ERAS: ['கி.மு.', 'கி.பி.'],\n  ERANAMES: ['கிறிஸ்துவுக்கு முன்', 'அன்னோ டோமினி'],\n  NARROWMONTHS: ['ஜ', 'பி', 'மா', 'ஏ', 'மே', 'ஜூ', 'ஜூ', 'ஆ', 'செ', 'அ', 'ந', 'டி'],\n  STANDALONENARROWMONTHS: ['ஜ', 'பி', 'மா', 'ஏ', 'மே', 'ஜூ', 'ஜூ', 'ஆ', 'செ', 'அ', 'ந', 'டி'],\n  MONTHS: ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'],\n  STANDALONEMONTHS: ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'],\n  SHORTMONTHS: ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'],\n  STANDALONESHORTMONTHS: ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'],\n  WEEKDAYS: ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'],\n  STANDALONEWEEKDAYS: ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'],\n  SHORTWEEKDAYS: ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'],\n  STANDALONESHORTWEEKDAYS: ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'],\n  NARROWWEEKDAYS: ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'],\n  STANDALONENARROWWEEKDAYS: ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'],\n  SHORTQUARTERS: ['காலா.1', 'காலா.2', 'காலா.3', 'காலா.4'],\n  QUARTERS: ['ஒன்றாம் காலாண்டு', 'இரண்டாம் காலாண்டு', 'மூன்றாம் காலாண்டு', 'நான்காம் காலாண்டு'],\n  AMPMS: ['முற்பகல்', 'பிற்பகல்'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM, y', 'd MMM, y', 'd/M/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} ’அன்று’ {0}', '{1} ’அன்று’ {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ta_MY.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ta_MY = {\n  ERAS: ['கி.மு.', 'கி.பி.'],\n  ERANAMES: ['கிறிஸ்துவுக்கு முன்', 'அன்னோ டோமினி'],\n  NARROWMONTHS: ['ஜ', 'பி', 'மா', 'ஏ', 'மே', 'ஜூ', 'ஜூ', 'ஆ', 'செ', 'அ', 'ந', 'டி'],\n  STANDALONENARROWMONTHS: ['ஜ', 'பி', 'மா', 'ஏ', 'மே', 'ஜூ', 'ஜூ', 'ஆ', 'செ', 'அ', 'ந', 'டி'],\n  MONTHS: ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'],\n  STANDALONEMONTHS: ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'],\n  SHORTMONTHS: ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'],\n  STANDALONESHORTMONTHS: ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'],\n  WEEKDAYS: ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'],\n  STANDALONEWEEKDAYS: ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'],\n  SHORTWEEKDAYS: ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'],\n  STANDALONESHORTWEEKDAYS: ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'],\n  NARROWWEEKDAYS: ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'],\n  STANDALONENARROWWEEKDAYS: ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'],\n  SHORTQUARTERS: ['காலா.1', 'காலா.2', 'காலா.3', 'காலா.4'],\n  QUARTERS: ['ஒன்றாம் காலாண்டு', 'இரண்டாம் காலாண்டு', 'மூன்றாம் காலாண்டு', 'நான்காம் காலாண்டு'],\n  AMPMS: ['முற்பகல்', 'பிற்பகல்'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM, y', 'd MMM, y', 'd/M/yy'],\n  TIMEFORMATS: ['a h:mm:ss zzzz', 'a h:mm:ss z', 'a h:mm:ss', 'a h:mm'],\n  DATETIMEFORMATS: ['{1} ’அன்று’ {0}', '{1} ’அன்று’ {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ta_SG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ta_SG = {\n  ERAS: ['கி.மு.', 'கி.பி.'],\n  ERANAMES: ['கிறிஸ்துவுக்கு முன்', 'அன்னோ டோமினி'],\n  NARROWMONTHS: ['ஜ', 'பி', 'மா', 'ஏ', 'மே', 'ஜூ', 'ஜூ', 'ஆ', 'செ', 'அ', 'ந', 'டி'],\n  STANDALONENARROWMONTHS: ['ஜ', 'பி', 'மா', 'ஏ', 'மே', 'ஜூ', 'ஜூ', 'ஆ', 'செ', 'அ', 'ந', 'டி'],\n  MONTHS: ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'],\n  STANDALONEMONTHS: ['ஜனவரி', 'பிப்ரவரி', 'மார்ச்', 'ஏப்ரல்', 'மே', 'ஜூன்', 'ஜூலை', 'ஆகஸ்ட்', 'செப்டம்பர்', 'அக்டோபர்', 'நவம்பர்', 'டிசம்பர்'],\n  SHORTMONTHS: ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'],\n  STANDALONESHORTMONTHS: ['ஜன.', 'பிப்.', 'மார்.', 'ஏப்.', 'மே', 'ஜூன்', 'ஜூலை', 'ஆக.', 'செப்.', 'அக்.', 'நவ.', 'டிச.'],\n  WEEKDAYS: ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'],\n  STANDALONEWEEKDAYS: ['ஞாயிறு', 'திங்கள்', 'செவ்வாய்', 'புதன்', 'வியாழன்', 'வெள்ளி', 'சனி'],\n  SHORTWEEKDAYS: ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'],\n  STANDALONESHORTWEEKDAYS: ['ஞாயி.', 'திங்.', 'செவ்.', 'புத.', 'வியா.', 'வெள்.', 'சனி'],\n  NARROWWEEKDAYS: ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'],\n  STANDALONENARROWWEEKDAYS: ['ஞா', 'தி', 'செ', 'பு', 'வி', 'வெ', 'ச'],\n  SHORTQUARTERS: ['காலா.1', 'காலா.2', 'காலா.3', 'காலா.4'],\n  QUARTERS: ['ஒன்றாம் காலாண்டு', 'இரண்டாம் காலாண்டு', 'மூன்றாம் காலாண்டு', 'நான்காம் காலாண்டு'],\n  AMPMS: ['முற்பகல்', 'பிற்பகல்'],\n  DATEFORMATS: ['EEEE, d MMMM, y', 'd MMMM, y', 'd MMM, y', 'd/M/yy'],\n  TIMEFORMATS: ['a h:mm:ss zzzz', 'a h:mm:ss z', 'a h:mm:ss', 'a h:mm'],\n  DATETIMEFORMATS: ['{1} ’அன்று’ {0}', '{1} ’அன்று’ {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale te_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_te_IN = goog.i18n.DateTimeSymbols_te;\n\n\n/**\n * Date/time formatting symbols for locale teo.\n * @const\n */\ngoog.i18n.DateTimeSymbols_teo = {\n  ERAS: ['KK', 'BK'],\n  ERANAMES: ['Kabla ya Christo', 'Baada ya Christo'],\n  NARROWMONTHS: ['R', 'M', 'K', 'D', 'M', 'M', 'J', 'P', 'S', 'T', 'L', 'P'],\n  STANDALONENARROWMONTHS: ['R', 'M', 'K', 'D', 'M', 'M', 'J', 'P', 'S', 'T', 'L', 'P'],\n  MONTHS: ['Orara', 'Omuk', 'Okwamg’', 'Odung’el', 'Omaruk', 'Omodok’king’ol', 'Ojola', 'Opedel', 'Osokosokoma', 'Otibar', 'Olabor', 'Opoo'],\n  STANDALONEMONTHS: ['Orara', 'Omuk', 'Okwamg’', 'Odung’el', 'Omaruk', 'Omodok’king’ol', 'Ojola', 'Opedel', 'Osokosokoma', 'Otibar', 'Olabor', 'Opoo'],\n  SHORTMONTHS: ['Rar', 'Muk', 'Kwa', 'Dun', 'Mar', 'Mod', 'Jol', 'Ped', 'Sok', 'Tib', 'Lab', 'Poo'],\n  STANDALONESHORTMONTHS: ['Rar', 'Muk', 'Kwa', 'Dun', 'Mar', 'Mod', 'Jol', 'Ped', 'Sok', 'Tib', 'Lab', 'Poo'],\n  WEEKDAYS: ['Nakaejuma', 'Nakaebarasa', 'Nakaare', 'Nakauni', 'Nakaung’on', 'Nakakany', 'Nakasabiti'],\n  STANDALONEWEEKDAYS: ['Nakaejuma', 'Nakaebarasa', 'Nakaare', 'Nakauni', 'Nakaung’on', 'Nakakany', 'Nakasabiti'],\n  SHORTWEEKDAYS: ['Jum', 'Bar', 'Aar', 'Uni', 'Ung', 'Kan', 'Sab'],\n  STANDALONESHORTWEEKDAYS: ['Jum', 'Bar', 'Aar', 'Uni', 'Ung', 'Kan', 'Sab'],\n  NARROWWEEKDAYS: ['J', 'B', 'A', 'U', 'U', 'K', 'S'],\n  STANDALONENARROWWEEKDAYS: ['J', 'B', 'A', 'U', 'U', 'K', 'S'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['Akwota abe', 'Akwota Aane', 'Akwota auni', 'Akwota Aung’on'],\n  AMPMS: ['Taparachu', 'Ebongi'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale teo_KE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_teo_KE = {\n  ERAS: ['KK', 'BK'],\n  ERANAMES: ['Kabla ya Christo', 'Baada ya Christo'],\n  NARROWMONTHS: ['R', 'M', 'K', 'D', 'M', 'M', 'J', 'P', 'S', 'T', 'L', 'P'],\n  STANDALONENARROWMONTHS: ['R', 'M', 'K', 'D', 'M', 'M', 'J', 'P', 'S', 'T', 'L', 'P'],\n  MONTHS: ['Orara', 'Omuk', 'Okwamg’', 'Odung’el', 'Omaruk', 'Omodok’king’ol', 'Ojola', 'Opedel', 'Osokosokoma', 'Otibar', 'Olabor', 'Opoo'],\n  STANDALONEMONTHS: ['Orara', 'Omuk', 'Okwamg’', 'Odung’el', 'Omaruk', 'Omodok’king’ol', 'Ojola', 'Opedel', 'Osokosokoma', 'Otibar', 'Olabor', 'Opoo'],\n  SHORTMONTHS: ['Rar', 'Muk', 'Kwa', 'Dun', 'Mar', 'Mod', 'Jol', 'Ped', 'Sok', 'Tib', 'Lab', 'Poo'],\n  STANDALONESHORTMONTHS: ['Rar', 'Muk', 'Kwa', 'Dun', 'Mar', 'Mod', 'Jol', 'Ped', 'Sok', 'Tib', 'Lab', 'Poo'],\n  WEEKDAYS: ['Nakaejuma', 'Nakaebarasa', 'Nakaare', 'Nakauni', 'Nakaung’on', 'Nakakany', 'Nakasabiti'],\n  STANDALONEWEEKDAYS: ['Nakaejuma', 'Nakaebarasa', 'Nakaare', 'Nakauni', 'Nakaung’on', 'Nakakany', 'Nakasabiti'],\n  SHORTWEEKDAYS: ['Jum', 'Bar', 'Aar', 'Uni', 'Ung', 'Kan', 'Sab'],\n  STANDALONESHORTWEEKDAYS: ['Jum', 'Bar', 'Aar', 'Uni', 'Ung', 'Kan', 'Sab'],\n  NARROWWEEKDAYS: ['J', 'B', 'A', 'U', 'U', 'K', 'S'],\n  STANDALONENARROWWEEKDAYS: ['J', 'B', 'A', 'U', 'U', 'K', 'S'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['Akwota abe', 'Akwota Aane', 'Akwota auni', 'Akwota Aung’on'],\n  AMPMS: ['Taparachu', 'Ebongi'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale teo_UG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_teo_UG = goog.i18n.DateTimeSymbols_teo;\n\n\n/**\n * Date/time formatting symbols for locale tg.\n * @const\n */\ngoog.i18n.DateTimeSymbols_tg = {\n  ERAS: ['ПеМ', 'ПаМ'],\n  ERANAMES: ['Пеш аз милод', 'ПаМ'],\n  NARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  STANDALONENARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  MONTHS: ['Январ', 'Феврал', 'Март', 'Апрел', 'Май', 'Июн', 'Июл', 'Август', 'Сентябр', 'Октябр', 'Ноябр', 'Декабр'],\n  STANDALONEMONTHS: ['Январ', 'Феврал', 'Март', 'Апрел', 'Май', 'Июн', 'Июл', 'Август', 'Сентябр', 'Октябр', 'Ноябр', 'Декабр'],\n  SHORTMONTHS: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'],\n  STANDALONESHORTMONTHS: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'],\n  WEEKDAYS: ['Якшанбе', 'Душанбе', 'Сешанбе', 'Чоршанбе', 'Панҷшанбе', 'Ҷумъа', 'Шанбе'],\n  STANDALONEWEEKDAYS: ['Якшанбе', 'Душанбе', 'Сешанбе', 'Чоршанбе', 'Панҷшанбе', 'Ҷумъа', 'Шанбе'],\n  SHORTWEEKDAYS: ['Яшб', 'Дшб', 'Сшб', 'Чшб', 'Пшб', 'Ҷмъ', 'Шнб'],\n  STANDALONESHORTWEEKDAYS: ['Яшб', 'Дшб', 'Сшб', 'Чшб', 'Пшб', 'Ҷмъ', 'Шнб'],\n  NARROWWEEKDAYS: ['Я', 'Д', 'С', 'Ч', 'П', 'Ҷ', 'Ш'],\n  STANDALONENARROWWEEKDAYS: ['Я', 'Д', 'С', 'Ч', 'П', 'Ҷ', 'Ш'],\n  SHORTQUARTERS: ['Ч1', 'Ч2', 'Ч3', 'Ч4'],\n  QUARTERS: ['Ч1', 'Ч2', 'Ч3', 'Ч4'],\n  AMPMS: ['пе. чо.', 'па. чо.'],\n  DATEFORMATS: ['EEEE, dd MMMM y', 'dd MMMM y', 'dd MMM y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale tg_TJ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_tg_TJ = goog.i18n.DateTimeSymbols_tg;\n\n\n/**\n * Date/time formatting symbols for locale th_TH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_th_TH = goog.i18n.DateTimeSymbols_th;\n\n\n/**\n * Date/time formatting symbols for locale ti.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ti = {\n  ERAS: ['ዓ/ዓ', 'ዓ/ም'],\n  ERANAMES: ['ዓ/ዓ', 'ዓመተ ምህረት'],\n  NARROWMONTHS: ['ጥ', 'ለ', 'መ', 'ሚ', 'ግ', 'ሰ', 'ሓ', 'ነ', 'መ', 'ጥ', 'ሕ', 'ታ'],\n  STANDALONENARROWMONTHS: ['ጥ', 'ለ', 'መ', 'ሚ', 'ግ', 'ሰ', 'ሓ', 'ነ', 'መ', 'ጥ', 'ሕ', 'ታ'],\n  MONTHS: ['ጥሪ', 'ለካቲት', 'መጋቢት', 'ሚያዝያ', 'ግንቦት', 'ሰነ', 'ሓምለ', 'ነሓሰ', 'መስከረም', 'ጥቅምቲ', 'ሕዳር', 'ታሕሳስ'],\n  STANDALONEMONTHS: ['ጥሪ', 'ለካቲት', 'መጋቢት', 'ሚያዝያ', 'ግንቦት', 'ሰነ', 'ሓምለ', 'ነሓሰ', 'መስከረም', 'ጥቅምቲ', 'ሕዳር', 'ታሕሳስ'],\n  SHORTMONTHS: ['ጥሪ', 'ለካ', 'መጋ', 'ሚያ', 'ግን', 'ሰነ', 'ሓም', 'ነሓ', 'መስ', 'ጥቅ', 'ሕዳ', 'ታሕ'],\n  STANDALONESHORTMONTHS: ['ጥሪ', 'ለካ', 'መጋ', 'ሚያ', 'ግን', 'ሰነ', 'ሓም', 'ነሓ', 'መስ', 'ጥቅ', 'ሕዳ', 'ታሕ'],\n  WEEKDAYS: ['ሰንበት', 'ሰኑይ', 'ሠሉስ', 'ረቡዕ', 'ኃሙስ', 'ዓርቢ', 'ቀዳም'],\n  STANDALONEWEEKDAYS: ['ሰንበት', 'ሰኑይ', 'ሠሉስ', 'ረቡዕ', 'ኃሙስ', 'ዓርቢ', 'ቀዳም'],\n  SHORTWEEKDAYS: ['ሰን', 'ሰኑ', 'ሰሉ', 'ረቡ', 'ሓሙ', 'ዓር', 'ቀዳ'],\n  STANDALONESHORTWEEKDAYS: ['ሰን', 'ሰኑ', 'ሰሉ', 'ረቡ', 'ሓሙ', 'ዓር', 'ቀዳ'],\n  NARROWWEEKDAYS: ['ሰ', 'ሰ', 'ሰ', 'ረ', 'ሓ', 'ዓ', 'ቀ'],\n  STANDALONENARROWWEEKDAYS: ['ሰ', 'ሰ', 'ሠ', 'ረ', 'ሓ', 'ዓ', 'ቀ'],\n  SHORTQUARTERS: ['ር1', 'ር2', 'ር3', 'ር4'],\n  QUARTERS: ['ቀዳማይ ርብዒ', 'ካልኣይ ርብዒ', 'ሳልሳይ ርብዒ', 'ራብዓይ ርብዒ'],\n  AMPMS: ['ንጉሆ ሰዓተ', 'ድሕር ሰዓት'],\n  DATEFORMATS: ['EEEE፣ dd MMMM መዓልቲ y G', 'dd MMMM y', 'dd-MMM-y', 'dd/MM/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ti_ER.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ti_ER = {\n  ERAS: ['ዓ/ዓ', 'ዓ/ም'],\n  ERANAMES: ['ዓመተ ዓለም', 'ዓመተ ምህረት'],\n  NARROWMONTHS: ['ጥ', 'ለ', 'መ', 'ሚ', 'ግ', 'ሰ', 'ሓ', 'ነ', 'መ', 'ጥ', 'ሕ', 'ታ'],\n  STANDALONENARROWMONTHS: ['ጥ', 'ለ', 'መ', 'ሚ', 'ግ', 'ሰ', 'ሓ', 'ነ', 'መ', 'ጥ', 'ሕ', 'ታ'],\n  MONTHS: ['ጥሪ', 'ለካቲት', 'መጋቢት', 'ሚያዝያ', 'ግንቦት', 'ሰነ', 'ሓምለ', 'ነሓሰ', 'መስከረም', 'ጥቅምቲ', 'ሕዳር', 'ታሕሳስ'],\n  STANDALONEMONTHS: ['ጥሪ', 'ለካቲት', 'መጋቢት', 'ሚያዝያ', 'ግንቦት', 'ሰነ', 'ሓምለ', 'ነሓሰ', 'መስከረም', 'ጥቅምቲ', 'ሕዳር', 'ታሕሳስ'],\n  SHORTMONTHS: ['ጥሪ', 'ለካ', 'መጋ', 'ሚያ', 'ግን', 'ሰነ', 'ሓም', 'ነሓ', 'መስ', 'ጥቅ', 'ሕዳ', 'ታሕ'],\n  STANDALONESHORTMONTHS: ['ጥሪ', 'ለካ', 'መጋ', 'ሚያ', 'ግን', 'ሰነ', 'ሓም', 'ነሓ', 'መስ', 'ጥቅ', 'ሕዳ', 'ታሕ'],\n  WEEKDAYS: ['ሰንበት', 'ሰኑይ', 'ሠሉስ', 'ረቡዕ', 'ኃሙስ', 'ዓርቢ', 'ቀዳም'],\n  STANDALONEWEEKDAYS: ['ሰንበት', 'ሰኑይ', 'ሠሉስ', 'ረቡዕ', 'ኃሙስ', 'ዓርቢ', 'ቀዳም'],\n  SHORTWEEKDAYS: ['ሰን', 'ሰኑ', 'ሰሉ', 'ረቡ', 'ሓሙ', 'ዓር', 'ቀዳ'],\n  STANDALONESHORTWEEKDAYS: ['ሰን', 'ሰኑ', 'ሰሉ', 'ረቡ', 'ሓሙ', 'ዓር', 'ቀዳ'],\n  NARROWWEEKDAYS: ['ሰ', 'ሰ', 'ሰ', 'ረ', 'ሓ', 'ዓ', 'ቀ'],\n  STANDALONENARROWWEEKDAYS: ['ሰ', 'ሰ', 'ሰ', 'ረ', 'ሓ', 'ዓ', 'ቀ'],\n  SHORTQUARTERS: ['ር1', 'ር2', 'ር3', 'ር4'],\n  QUARTERS: ['ቀዳማይ ርብዒ', 'ካልኣይ ርብዒ', 'ሳልሳይ ርብዒ', 'ራብዓይ ርብዒ'],\n  AMPMS: ['ንጉሆ ሰዓተ', 'ድሕር ሰዓት'],\n  DATEFORMATS: ['EEEE፣ dd MMMM መዓልቲ y G', 'dd MMMM y', 'dd-MMM-y', 'dd/MM/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale ti_ET.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ti_ET = goog.i18n.DateTimeSymbols_ti;\n\n\n/**\n * Date/time formatting symbols for locale tk.\n * @const\n */\ngoog.i18n.DateTimeSymbols_tk = {\n  ERAS: ['B.e.öň', 'B.e.'],\n  ERANAMES: ['Isadan öň', 'Isadan soň'],\n  NARROWMONTHS: ['Ý', 'F', 'M', 'A', 'M', 'I', 'I', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['Ý', 'F', 'M', 'A', 'M', 'I', 'I', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['ýanwar', 'fewral', 'mart', 'aprel', 'maý', 'iýun', 'iýul', 'awgust', 'sentýabr', 'oktýabr', 'noýabr', 'dekabr'],\n  STANDALONEMONTHS: ['Ýanwar', 'Fewral', 'Mart', 'Aprel', 'Maý', 'Iýun', 'Iýul', 'Awgust', 'Sentýabr', 'Oktýabr', 'Noýabr', 'Dekabr'],\n  SHORTMONTHS: ['ýan', 'few', 'mart', 'apr', 'maý', 'iýun', 'iýul', 'awg', 'sen', 'okt', 'noý', 'dek'],\n  STANDALONESHORTMONTHS: ['Ýan', 'Few', 'Mar', 'Apr', 'Maý', 'Iýun', 'Iýul', 'Awg', 'Sen', 'Okt', 'Noý', 'Dek'],\n  WEEKDAYS: ['ýekşenbe', 'duşenbe', 'sişenbe', 'çarşenbe', 'penşenbe', 'anna', 'şenbe'],\n  STANDALONEWEEKDAYS: ['Ýekşenbe', 'Duşenbe', 'Sişenbe', 'Çarşenbe', 'Penşenbe', 'Anna', 'Şenbe'],\n  SHORTWEEKDAYS: ['ýek', 'duş', 'siş', 'çar', 'pen', 'ann', 'şen'],\n  STANDALONESHORTWEEKDAYS: ['Ýek', 'Duş', 'Siş', 'Çar', 'Pen', 'Ann', 'Şen'],\n  NARROWWEEKDAYS: ['Ý', 'D', 'S', 'Ç', 'P', 'A', 'Ş'],\n  STANDALONENARROWWEEKDAYS: ['Ý', 'D', 'S', 'Ç', 'P', 'A', 'Ş'],\n  SHORTQUARTERS: ['1Ç', '2Ç', '3Ç', '4Ç'],\n  QUARTERS: ['1-nji çärýek', '2-nji çärýek', '3-nji çärýek', '4-nji çärýek'],\n  AMPMS: ['günortadan öň', 'günortadan soň'],\n  DATEFORMATS: ['d MMMM y EEEE', 'd MMMM y', 'd MMM y', 'dd.MM.y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale tk_TM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_tk_TM = goog.i18n.DateTimeSymbols_tk;\n\n\n/**\n * Date/time formatting symbols for locale to.\n * @const\n */\ngoog.i18n.DateTimeSymbols_to = {\n  ERAS: ['KM', 'TS'],\n  ERANAMES: ['ki muʻa', 'taʻu ʻo Sīsū'],\n  NARROWMONTHS: ['S', 'F', 'M', 'E', 'M', 'S', 'S', 'A', 'S', 'O', 'N', 'T'],\n  STANDALONENARROWMONTHS: ['S', 'F', 'M', 'E', 'M', 'S', 'S', 'A', 'S', 'O', 'N', 'T'],\n  MONTHS: ['Sānuali', 'Fēpueli', 'Maʻasi', 'ʻEpeleli', 'Mē', 'Sune', 'Siulai', 'ʻAokosi', 'Sepitema', 'ʻOkatopa', 'Nōvema', 'Tīsema'],\n  STANDALONEMONTHS: ['Sānuali', 'Fēpueli', 'Maʻasi', 'ʻEpeleli', 'Mē', 'Sune', 'Siulai', 'ʻAokosi', 'Sepitema', 'ʻOkatopa', 'Nōvema', 'Tīsema'],\n  SHORTMONTHS: ['Sān', 'Fēp', 'Maʻa', 'ʻEpe', 'Mē', 'Sun', 'Siu', 'ʻAok', 'Sep', 'ʻOka', 'Nōv', 'Tīs'],\n  STANDALONESHORTMONTHS: ['Sān', 'Fēp', 'Maʻa', 'ʻEpe', 'Mē', 'Sun', 'Siu', 'ʻAok', 'Sep', 'ʻOka', 'Nōv', 'Tīs'],\n  WEEKDAYS: ['Sāpate', 'Mōnite', 'Tūsite', 'Pulelulu', 'Tuʻapulelulu', 'Falaite', 'Tokonaki'],\n  STANDALONEWEEKDAYS: ['Sāpate', 'Mōnite', 'Tūsite', 'Pulelulu', 'Tuʻapulelulu', 'Falaite', 'Tokonaki'],\n  SHORTWEEKDAYS: ['Sāp', 'Mōn', 'Tūs', 'Pul', 'Tuʻa', 'Fal', 'Tok'],\n  STANDALONESHORTWEEKDAYS: ['Sāp', 'Mōn', 'Tūs', 'Pul', 'Tuʻa', 'Fal', 'Tok'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'P', 'T', 'F', 'T'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'P', 'T', 'F', 'T'],\n  SHORTQUARTERS: ['K1', 'K2', 'K3', 'K4'],\n  QUARTERS: ['kuata ʻuluaki', 'kuata ua', 'kuata tolu', 'kuata fā'],\n  AMPMS: ['hengihengi', 'efiafi'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale to_TO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_to_TO = goog.i18n.DateTimeSymbols_to;\n\n\n/**\n * Date/time formatting symbols for locale tr_CY.\n * @const\n */\ngoog.i18n.DateTimeSymbols_tr_CY = {\n  ERAS: ['MÖ', 'MS'],\n  ERANAMES: ['Milattan Önce', 'Milattan Sonra'],\n  NARROWMONTHS: ['O', 'Ş', 'M', 'N', 'M', 'H', 'T', 'A', 'E', 'E', 'K', 'A'],\n  STANDALONENARROWMONTHS: ['O', 'Ş', 'M', 'N', 'M', 'H', 'T', 'A', 'E', 'E', 'K', 'A'],\n  MONTHS: ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'],\n  STANDALONEMONTHS: ['Ocak', 'Şubat', 'Mart', 'Nisan', 'Mayıs', 'Haziran', 'Temmuz', 'Ağustos', 'Eylül', 'Ekim', 'Kasım', 'Aralık'],\n  SHORTMONTHS: ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara'],\n  STANDALONESHORTMONTHS: ['Oca', 'Şub', 'Mar', 'Nis', 'May', 'Haz', 'Tem', 'Ağu', 'Eyl', 'Eki', 'Kas', 'Ara'],\n  WEEKDAYS: ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'],\n  STANDALONEWEEKDAYS: ['Pazar', 'Pazartesi', 'Salı', 'Çarşamba', 'Perşembe', 'Cuma', 'Cumartesi'],\n  SHORTWEEKDAYS: ['Paz', 'Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cmt'],\n  STANDALONESHORTWEEKDAYS: ['Paz', 'Pzt', 'Sal', 'Çar', 'Per', 'Cum', 'Cmt'],\n  NARROWWEEKDAYS: ['P', 'P', 'S', 'Ç', 'P', 'C', 'C'],\n  STANDALONENARROWWEEKDAYS: ['P', 'P', 'S', 'Ç', 'P', 'C', 'C'],\n  SHORTQUARTERS: ['Ç1', 'Ç2', 'Ç3', 'Ç4'],\n  QUARTERS: ['1. çeyrek', '2. çeyrek', '3. çeyrek', '4. çeyrek'],\n  AMPMS: ['ÖÖ', 'ÖS'],\n  DATEFORMATS: ['d MMMM y EEEE', 'd MMMM y', 'd MMM y', 'd.MM.y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale tr_TR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_tr_TR = goog.i18n.DateTimeSymbols_tr;\n\n\n/**\n * Date/time formatting symbols for locale tt.\n * @const\n */\ngoog.i18n.DateTimeSymbols_tt = {\n  ERAS: ['б.э.к.', 'б.э.'],\n  ERANAMES: ['безнең эрага кадәр', 'безнең эра'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['гыйнвар', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'],\n  STANDALONEMONTHS: ['гыйнвар', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь'],\n  SHORTMONTHS: ['гыйн.', 'фев.', 'мар.', 'апр.', 'май', 'июнь', 'июль', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n  STANDALONESHORTMONTHS: ['гыйн.', 'фев.', 'мар.', 'апр.', 'май', 'июнь', 'июль', 'авг.', 'сент.', 'окт.', 'нояб.', 'дек.'],\n  WEEKDAYS: ['якшәмбе', 'дүшәмбе', 'сишәмбе', 'чәршәмбе', 'пәнҗешәмбе', 'җомга', 'шимбә'],\n  STANDALONEWEEKDAYS: ['якшәмбе', 'дүшәмбе', 'сишәмбе', 'чәршәмбе', 'пәнҗешәмбе', 'җомга', 'шимбә'],\n  SHORTWEEKDAYS: ['якш.', 'дүш.', 'сиш.', 'чәр.', 'пәнҗ.', 'җом.', 'шим.'],\n  STANDALONESHORTWEEKDAYS: ['якш.', 'дүш.', 'сиш.', 'чәр.', 'пәнҗ.', 'җом.', 'шим.'],\n  NARROWWEEKDAYS: ['Я', 'Д', 'С', 'Ч', 'П', 'Җ', 'Ш'],\n  STANDALONENARROWWEEKDAYS: ['Я', 'Д', 'С', 'Ч', 'П', 'Җ', 'Ш'],\n  SHORTQUARTERS: ['1 нче кв.', '2 нче кв.', '3 нче кв.', '4 нче кв.'],\n  QUARTERS: ['1 нче квартал', '2 нче квартал', '3 нче квартал', '4 нче квартал'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['d MMMM, y \\'ел\\', EEEE', 'd MMMM, y \\'ел\\'', 'd MMM, y \\'ел\\'', 'dd.MM.y'],\n  TIMEFORMATS: ['H:mm:ss zzzz', 'H:mm:ss z', 'H:mm:ss', 'H:mm'],\n  DATETIMEFORMATS: ['{1}, {0}', '{1}, {0}', '{1}, {0}', '{1}, {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale tt_RU.\n * @const\n */\ngoog.i18n.DateTimeSymbols_tt_RU = goog.i18n.DateTimeSymbols_tt;\n\n\n/**\n * Date/time formatting symbols for locale twq.\n * @const\n */\ngoog.i18n.DateTimeSymbols_twq = {\n  ERAS: ['IJ', 'IZ'],\n  ERANAMES: ['Isaa jine', 'Isaa zamanoo'],\n  NARROWMONTHS: ['Ž', 'F', 'M', 'A', 'M', 'Ž', 'Ž', 'U', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['Ž', 'F', 'M', 'A', 'M', 'Ž', 'Ž', 'U', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'],\n  STANDALONEMONTHS: ['Žanwiye', 'Feewiriye', 'Marsi', 'Awiril', 'Me', 'Žuweŋ', 'Žuyye', 'Ut', 'Sektanbur', 'Oktoobur', 'Noowanbur', 'Deesanbur'],\n  SHORTMONTHS: ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'],\n  STANDALONESHORTMONTHS: ['Žan', 'Fee', 'Mar', 'Awi', 'Me', 'Žuw', 'Žuy', 'Ut', 'Sek', 'Okt', 'Noo', 'Dee'],\n  WEEKDAYS: ['Alhadi', 'Atinni', 'Atalaata', 'Alarba', 'Alhamiisa', 'Alzuma', 'Asibti'],\n  STANDALONEWEEKDAYS: ['Alhadi', 'Atinni', 'Atalaata', 'Alarba', 'Alhamiisa', 'Alzuma', 'Asibti'],\n  SHORTWEEKDAYS: ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'],\n  STANDALONESHORTWEEKDAYS: ['Alh', 'Ati', 'Ata', 'Ala', 'Alm', 'Alz', 'Asi'],\n  NARROWWEEKDAYS: ['H', 'T', 'T', 'L', 'L', 'L', 'S'],\n  STANDALONENARROWWEEKDAYS: ['H', 'T', 'T', 'L', 'L', 'L', 'S'],\n  SHORTQUARTERS: ['A1', 'A2', 'A3', 'A4'],\n  QUARTERS: ['Arrubu 1', 'Arrubu 2', 'Arrubu 3', 'Arrubu 4'],\n  AMPMS: ['Subbaahi', 'Zaarikay b'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale twq_NE.\n * @const\n */\ngoog.i18n.DateTimeSymbols_twq_NE = goog.i18n.DateTimeSymbols_twq;\n\n\n/**\n * Date/time formatting symbols for locale tzm.\n * @const\n */\ngoog.i18n.DateTimeSymbols_tzm = {\n  ERAS: ['ZƐ', 'ḌƐ'],\n  ERANAMES: ['Zdat Ɛisa (TAƔ)', 'Ḍeffir Ɛisa (TAƔ)'],\n  NARROWMONTHS: ['Y', 'Y', 'M', 'I', 'M', 'Y', 'Y', 'Ɣ', 'C', 'K', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['Y', 'Y', 'M', 'I', 'M', 'Y', 'Y', 'Ɣ', 'C', 'K', 'N', 'D'],\n  MONTHS: ['Yennayer', 'Yebrayer', 'Mars', 'Ibrir', 'Mayyu', 'Yunyu', 'Yulyuz', 'Ɣuct', 'Cutanbir', 'Kṭuber', 'Nwanbir', 'Dujanbir'],\n  STANDALONEMONTHS: ['Yennayer', 'Yebrayer', 'Mars', 'Ibrir', 'Mayyu', 'Yunyu', 'Yulyuz', 'Ɣuct', 'Cutanbir', 'Kṭuber', 'Nwanbir', 'Dujanbir'],\n  SHORTMONTHS: ['Yen', 'Yeb', 'Mar', 'Ibr', 'May', 'Yun', 'Yul', 'Ɣuc', 'Cut', 'Kṭu', 'Nwa', 'Duj'],\n  STANDALONESHORTMONTHS: ['Yen', 'Yeb', 'Mar', 'Ibr', 'May', 'Yun', 'Yul', 'Ɣuc', 'Cut', 'Kṭu', 'Nwa', 'Duj'],\n  WEEKDAYS: ['Asamas', 'Aynas', 'Asinas', 'Akras', 'Akwas', 'Asimwas', 'Asiḍyas'],\n  STANDALONEWEEKDAYS: ['Asamas', 'Aynas', 'Asinas', 'Akras', 'Akwas', 'Asimwas', 'Asiḍyas'],\n  SHORTWEEKDAYS: ['Asa', 'Ayn', 'Asn', 'Akr', 'Akw', 'Asm', 'Asḍ'],\n  STANDALONESHORTWEEKDAYS: ['Asa', 'Ayn', 'Asn', 'Akr', 'Akw', 'Asm', 'Asḍ'],\n  NARROWWEEKDAYS: ['A', 'A', 'A', 'A', 'A', 'A', 'A'],\n  STANDALONENARROWWEEKDAYS: ['A', 'A', 'A', 'A', 'A', 'A', 'A'],\n  SHORTQUARTERS: ['IA1', 'IA2', 'IA3', 'IA4'],\n  QUARTERS: ['Imir adamsan 1', 'Imir adamsan 2', 'Imir adamsan 3', 'Imir adamsan 4'],\n  AMPMS: ['Zdat azal', 'Ḍeffir aza'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale tzm_MA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_tzm_MA = goog.i18n.DateTimeSymbols_tzm;\n\n\n/**\n * Date/time formatting symbols for locale ug.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ug = {\n  ERAS: ['BCE', 'مىلادىيە'],\n  ERANAMES: ['مىلادىيەدىن بۇرۇن', 'مىلادىيە'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['يانۋار', 'فېۋرال', 'مارت', 'ئاپرېل', 'ماي', 'ئىيۇن', 'ئىيۇل', 'ئاۋغۇست', 'سېنتەبىر', 'ئۆكتەبىر', 'نويابىر', 'دېكابىر'],\n  STANDALONEMONTHS: ['يانۋار', 'فېۋرال', 'مارت', 'ئاپرېل', 'ماي', 'ئىيۇن', 'ئىيۇل', 'ئاۋغۇست', 'سېنتەبىر', 'ئۆكتەبىر', 'نويابىر', 'دېكابىر'],\n  SHORTMONTHS: ['يانۋار', 'فېۋرال', 'مارت', 'ئاپرېل', 'ماي', 'ئىيۇن', 'ئىيۇل', 'ئاۋغۇست', 'سېنتەبىر', 'ئۆكتەبىر', 'نويابىر', 'دېكابىر'],\n  STANDALONESHORTMONTHS: ['يانۋار', 'فېۋرال', 'مارت', 'ئاپرېل', 'ماي', 'ئىيۇن', 'ئىيۇل', 'ئاۋغۇست', 'سېنتەبىر', 'ئۆكتەبىر', 'نويابىر', 'دېكابىر'],\n  WEEKDAYS: ['يەكشەنبە', 'دۈشەنبە', 'سەيشەنبە', 'چارشەنبە', 'پەيشەنبە', 'جۈمە', 'شەنبە'],\n  STANDALONEWEEKDAYS: ['يەكشەنبە', 'دۈشەنبە', 'سەيشەنبە', 'چارشەنبە', 'پەيشەنبە', 'جۈمە', 'شەنبە'],\n  SHORTWEEKDAYS: ['يە', 'دۈ', 'سە', 'چا', 'پە', 'جۈ', 'شە'],\n  STANDALONESHORTWEEKDAYS: ['يە', 'دۈ', 'سە', 'چا', 'پە', 'جۈ', 'شە'],\n  NARROWWEEKDAYS: ['ي', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],\n  STANDALONENARROWWEEKDAYS: ['ي', 'د', 'س', 'چ', 'پ', 'ج', 'ش'],\n  SHORTQUARTERS: ['1-پەسىل', '2-پەسىل', '3-پەسىل', '4-پەسىل'],\n  QUARTERS: ['بىرىنچى پەسىل', 'ئىككىنچى پەسىل', 'ئۈچىنچى پەسىل', 'تۆتىنچى پەسىل'],\n  AMPMS: ['چۈشتىن بۇرۇن', 'چۈشتىن كېيىن'],\n  DATEFORMATS: ['y d-MMMM، EEEE', 'd-MMMM، y', 'd-MMM، y', 'y-MM-dd'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1}، {0}', '{1}، {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ug_CN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ug_CN = goog.i18n.DateTimeSymbols_ug;\n\n\n/**\n * Date/time formatting symbols for locale uk_UA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_uk_UA = goog.i18n.DateTimeSymbols_uk;\n\n\n/**\n * Date/time formatting symbols for locale ur_IN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ur_IN = {\n  ZERODIGIT: 0x06F0,\n  ERAS: ['قبل مسیح', 'عیسوی'],\n  ERANAMES: ['قبل مسیح', 'عیسوی'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  STANDALONEMONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  SHORTMONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  STANDALONESHORTMONTHS: ['جنوری', 'فروری', 'مارچ', 'اپریل', 'مئی', 'جون', 'جولائی', 'اگست', 'ستمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  WEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  STANDALONEWEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  SHORTWEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  STANDALONESHORTWEEKDAYS: ['اتوار', 'پیر', 'منگل', 'بدھ', 'جمعرات', 'جمعہ', 'ہفتہ'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['پہلی سہ ماہی', 'دوسری سہ ماہی', 'تیسری سہ ماہی', 'چوتهی سہ ماہی'],\n  QUARTERS: ['پہلی سہ ماہی', 'دوسری سہ ماہی', 'تیسری سہ ماہی', 'چوتهی سہ ماہی'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE، d MMMM، y', 'd MMMM، y', 'd MMM، y', 'd/M/yy'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [6, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale ur_PK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_ur_PK = goog.i18n.DateTimeSymbols_ur;\n\n\n/**\n * Date/time formatting symbols for locale uz_Arab.\n * @const\n */\ngoog.i18n.DateTimeSymbols_uz_Arab = {\n  ZERODIGIT: 0x06F0,\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['جنوری', 'فبروری', 'مارچ', 'اپریل', 'می', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  STANDALONEMONTHS: ['جنوری', 'فبروری', 'مارچ', 'اپریل', 'می', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  SHORTMONTHS: ['جنو', 'فبر', 'مار', 'اپر', 'می', 'جون', 'جول', 'اگس', 'سپت', 'اکت', 'نوم', 'دسم'],\n  STANDALONESHORTMONTHS: ['جنو', 'فبر', 'مار', 'اپر', 'می', 'جون', 'جول', 'اگس', 'سپت', 'اکت', 'نوم', 'دسم'],\n  WEEKDAYS: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  STANDALONEWEEKDAYS: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  SHORTWEEKDAYS: ['ی.', 'د.', 'س.', 'چ.', 'پ.', 'ج.', 'ش.'],\n  STANDALONESHORTWEEKDAYS: ['ی.', 'د.', 'س.', 'چ.', 'پ.', 'ج.', 'ش.'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [3, 4],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale uz_Arab_AF.\n * @const\n */\ngoog.i18n.DateTimeSymbols_uz_Arab_AF = {\n  ZERODIGIT: 0x06F0,\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['جنوری', 'فبروری', 'مارچ', 'اپریل', 'می', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  STANDALONEMONTHS: ['جنوری', 'فبروری', 'مارچ', 'اپریل', 'می', 'جون', 'جولای', 'اگست', 'سپتمبر', 'اکتوبر', 'نومبر', 'دسمبر'],\n  SHORTMONTHS: ['جنو', 'فبر', 'مار', 'اپر', 'می', 'جون', 'جول', 'اگس', 'سپت', 'اکت', 'نوم', 'دسم'],\n  STANDALONESHORTMONTHS: ['جنو', 'فبر', 'مار', 'اپر', 'می', 'جون', 'جول', 'اگس', 'سپت', 'اکت', 'نوم', 'دسم'],\n  WEEKDAYS: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  STANDALONEWEEKDAYS: ['یکشنبه', 'دوشنبه', 'سه‌شنبه', 'چهارشنبه', 'پنجشنبه', 'جمعه', 'شنبه'],\n  SHORTWEEKDAYS: ['ی.', 'د.', 'س.', 'چ.', 'پ.', 'ج.', 'ش.'],\n  STANDALONESHORTWEEKDAYS: ['ی.', 'د.', 'س.', 'چ.', 'پ.', 'ج.', 'ش.'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 5,\n  WEEKENDRANGE: [3, 4],\n  FIRSTWEEKCUTOFFDAY: 4\n};\n\n\n/**\n * Date/time formatting symbols for locale uz_Cyrl.\n * @const\n */\ngoog.i18n.DateTimeSymbols_uz_Cyrl = {\n  ERAS: ['м.а.', 'милодий'],\n  ERANAMES: ['милоддан аввалги', 'милодий'],\n  NARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  STANDALONENARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  MONTHS: ['январ', 'феврал', 'март', 'апрел', 'май', 'июн', 'июл', 'август', 'сентябр', 'октябр', 'ноябр', 'декабр'],\n  STANDALONEMONTHS: ['январ', 'феврал', 'март', 'апрел', 'май', 'июн', 'июл', 'август', 'сентябр', 'октябр', 'ноябр', 'декабр'],\n  SHORTMONTHS: ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'],\n  STANDALONESHORTMONTHS: ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'],\n  WEEKDAYS: ['якшанба', 'душанба', 'сешанба', 'чоршанба', 'пайшанба', 'жума', 'шанба'],\n  STANDALONEWEEKDAYS: ['якшанба', 'душанба', 'сешанба', 'чоршанба', 'пайшанба', 'жума', 'шанба'],\n  SHORTWEEKDAYS: ['якш', 'душ', 'сеш', 'чор', 'пай', 'жум', 'шан'],\n  STANDALONESHORTWEEKDAYS: ['якш', 'душ', 'сеш', 'чор', 'пай', 'жум', 'шан'],\n  NARROWWEEKDAYS: ['Я', 'Д', 'С', 'Ч', 'П', 'Ж', 'Ш'],\n  STANDALONENARROWWEEKDAYS: ['Я', 'Д', 'С', 'Ч', 'П', 'Ж', 'Ш'],\n  SHORTQUARTERS: ['1-ч', '2-ч', '3-ч', '4-ч'],\n  QUARTERS: ['1-чорак', '2-чорак', '3-чорак', '4-чорак'],\n  AMPMS: ['ТО', 'ТК'],\n  DATEFORMATS: ['EEEE, dd MMMM, y', 'd MMMM, y', 'd MMM, y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss (zzzz)', 'HH:mm:ss (z)', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale uz_Cyrl_UZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_uz_Cyrl_UZ = {\n  ERAS: ['м.а.', 'милодий'],\n  ERANAMES: ['милоддан аввалги', 'милодий'],\n  NARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  STANDALONENARROWMONTHS: ['Я', 'Ф', 'М', 'А', 'М', 'И', 'И', 'А', 'С', 'О', 'Н', 'Д'],\n  MONTHS: ['январ', 'феврал', 'март', 'апрел', 'май', 'июн', 'июл', 'август', 'сентябр', 'октябр', 'ноябр', 'декабр'],\n  STANDALONEMONTHS: ['январ', 'феврал', 'март', 'апрел', 'май', 'июн', 'июл', 'август', 'сентябр', 'октябр', 'ноябр', 'декабр'],\n  SHORTMONTHS: ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'],\n  STANDALONESHORTMONTHS: ['янв', 'фев', 'мар', 'апр', 'май', 'июн', 'июл', 'авг', 'сен', 'окт', 'ноя', 'дек'],\n  WEEKDAYS: ['якшанба', 'душанба', 'сешанба', 'чоршанба', 'пайшанба', 'жума', 'шанба'],\n  STANDALONEWEEKDAYS: ['якшанба', 'душанба', 'сешанба', 'чоршанба', 'пайшанба', 'жума', 'шанба'],\n  SHORTWEEKDAYS: ['якш', 'душ', 'сеш', 'чор', 'пай', 'жум', 'шан'],\n  STANDALONESHORTWEEKDAYS: ['якш', 'душ', 'сеш', 'чор', 'пай', 'жум', 'шан'],\n  NARROWWEEKDAYS: ['Я', 'Д', 'С', 'Ч', 'П', 'Ж', 'Ш'],\n  STANDALONENARROWWEEKDAYS: ['Я', 'Д', 'С', 'Ч', 'П', 'Ж', 'Ш'],\n  SHORTQUARTERS: ['1-ч', '2-ч', '3-ч', '4-ч'],\n  QUARTERS: ['1-чорак', '2-чорак', '3-чорак', '4-чорак'],\n  AMPMS: ['ТО', 'ТК'],\n  DATEFORMATS: ['EEEE, dd MMMM, y', 'd MMMM, y', 'd MMM, y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss (zzzz)', 'HH:mm:ss (z)', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale uz_Latn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_uz_Latn = goog.i18n.DateTimeSymbols_uz;\n\n\n/**\n * Date/time formatting symbols for locale uz_Latn_UZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_uz_Latn_UZ = goog.i18n.DateTimeSymbols_uz;\n\n\n/**\n * Date/time formatting symbols for locale vai.\n * @const\n */\ngoog.i18n.DateTimeSymbols_vai = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['ꖨꖕ ꕪꕴ ꔞꔀꕮꕊ', 'ꕒꕡꖝꖕ', 'ꕾꖺ', 'ꖢꖕ', 'ꖑꕱ', 'ꖱꘋ', 'ꖱꕞꔤ', 'ꗛꔕ', 'ꕢꕌ', 'ꕭꖃ', 'ꔞꘋꕔꕿ ꕸꖃꗏ', 'ꖨꖕ ꕪꕴ ꗏꖺꕮꕊ'],\n  STANDALONEMONTHS: ['ꖨꖕ ꕪꕴ ꔞꔀꕮꕊ', 'ꕒꕡꖝꖕ', 'ꕾꖺ', 'ꖢꖕ', 'ꖑꕱ', 'ꖱꘋ', 'ꖱꕞꔤ', 'ꗛꔕ', 'ꕢꕌ', 'ꕭꖃ', 'ꔞꘋꕔꕿ ꕸꖃꗏ', 'ꖨꖕ ꕪꕴ ꗏꖺꕮꕊ'],\n  SHORTMONTHS: ['ꖨꖕꔞ', 'ꕒꕡ', 'ꕾꖺ', 'ꖢꖕ', 'ꖑꕱ', 'ꖱꘋ', 'ꖱꕞ', 'ꗛꔕ', 'ꕢꕌ', 'ꕭꖃ', 'ꔞꘋ', 'ꖨꖕꗏ'],\n  STANDALONESHORTMONTHS: ['ꖨꖕꔞ', 'ꕒꕡ', 'ꕾꖺ', 'ꖢꖕ', 'ꖑꕱ', 'ꖱꘋ', 'ꖱꕞ', 'ꗛꔕ', 'ꕢꕌ', 'ꕭꖃ', 'ꔞꘋ', 'ꖨꖕꗏ'],\n  WEEKDAYS: ['ꕞꕌꔵ', 'ꗳꗡꘉ', 'ꕚꕞꕚ', 'ꕉꕞꕒ', 'ꕉꔤꕆꕢ', 'ꕉꔤꕀꕮ', 'ꔻꔬꔳ'],\n  STANDALONEWEEKDAYS: ['ꕞꕌꔵ', 'ꗳꗡꘉ', 'ꕚꕞꕚ', 'ꕉꕞꕒ', 'ꕉꔤꕆꕢ', 'ꕉꔤꕀꕮ', 'ꔻꔬꔳ'],\n  SHORTWEEKDAYS: ['ꕞꕌꔵ', 'ꗳꗡꘉ', 'ꕚꕞꕚ', 'ꕉꕞꕒ', 'ꕉꔤꕆꕢ', 'ꕉꔤꕀꕮ', 'ꔻꔬꔳ'],\n  STANDALONESHORTWEEKDAYS: ['ꕞꕌꔵ', 'ꗳꗡꘉ', 'ꕚꕞꕚ', 'ꕉꕞꕒ', 'ꕉꔤꕆꕢ', 'ꕉꔤꕀꕮ', 'ꔻꔬꔳ'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale vai_Latn.\n * @const\n */\ngoog.i18n.DateTimeSymbols_vai_Latn = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['luukao kemã', 'ɓandaɓu', 'vɔɔ', 'fulu', 'goo', '6', '7', 'kɔnde', 'saah', 'galo', 'kenpkato ɓololɔ', 'luukao lɔma'],\n  STANDALONEMONTHS: ['luukao kemã', 'ɓandaɓu', 'vɔɔ', 'fulu', 'goo', '6', '7', 'kɔnde', 'saah', 'galo', 'kenpkato ɓololɔ', 'luukao lɔma'],\n  SHORTMONTHS: ['luukao kemã', 'ɓandaɓu', 'vɔɔ', 'fulu', 'goo', '6', '7', 'kɔnde', 'saah', 'galo', 'kenpkato ɓololɔ', 'luukao lɔma'],\n  STANDALONESHORTMONTHS: ['luukao kemã', 'ɓandaɓu', 'vɔɔ', 'fulu', 'goo', '6', '7', 'kɔnde', 'saah', 'galo', 'kenpkato ɓololɔ', 'luukao lɔma'],\n  WEEKDAYS: ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'],\n  STANDALONEWEEKDAYS: ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'],\n  SHORTWEEKDAYS: ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'],\n  STANDALONESHORTWEEKDAYS: ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale vai_Latn_LR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_vai_Latn_LR = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['luukao kemã', 'ɓandaɓu', 'vɔɔ', 'fulu', 'goo', '6', '7', 'kɔnde', 'saah', 'galo', 'kenpkato ɓololɔ', 'luukao lɔma'],\n  STANDALONEMONTHS: ['luukao kemã', 'ɓandaɓu', 'vɔɔ', 'fulu', 'goo', '6', '7', 'kɔnde', 'saah', 'galo', 'kenpkato ɓololɔ', 'luukao lɔma'],\n  SHORTMONTHS: ['luukao kemã', 'ɓandaɓu', 'vɔɔ', 'fulu', 'goo', '6', '7', 'kɔnde', 'saah', 'galo', 'kenpkato ɓololɔ', 'luukao lɔma'],\n  STANDALONESHORTMONTHS: ['luukao kemã', 'ɓandaɓu', 'vɔɔ', 'fulu', 'goo', '6', '7', 'kɔnde', 'saah', 'galo', 'kenpkato ɓololɔ', 'luukao lɔma'],\n  WEEKDAYS: ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'],\n  STANDALONEWEEKDAYS: ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'],\n  SHORTWEEKDAYS: ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'],\n  STANDALONESHORTWEEKDAYS: ['lahadi', 'tɛɛnɛɛ', 'talata', 'alaba', 'aimisa', 'aijima', 'siɓiti'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['h:mm:ss a zzzz', 'h:mm:ss a z', 'h:mm:ss a', 'h:mm a'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale vai_Vaii.\n * @const\n */\ngoog.i18n.DateTimeSymbols_vai_Vaii = goog.i18n.DateTimeSymbols_vai;\n\n\n/**\n * Date/time formatting symbols for locale vai_Vaii_LR.\n * @const\n */\ngoog.i18n.DateTimeSymbols_vai_Vaii_LR = goog.i18n.DateTimeSymbols_vai;\n\n\n/**\n * Date/time formatting symbols for locale vi_VN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_vi_VN = goog.i18n.DateTimeSymbols_vi;\n\n\n/**\n * Date/time formatting symbols for locale vun.\n * @const\n */\ngoog.i18n.DateTimeSymbols_vun = {\n  ERAS: ['KK', 'BK'],\n  ERANAMES: ['Kabla ya Kristu', 'Baada ya Kristu'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Januari', 'Februari', 'Machi', 'Aprilyi', 'Mei', 'Junyi', 'Julyai', 'Agusti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  STANDALONEMONTHS: ['Januari', 'Februari', 'Machi', 'Aprilyi', 'Mei', 'Junyi', 'Julyai', 'Agusti', 'Septemba', 'Oktoba', 'Novemba', 'Desemba'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mac', 'Apr', 'Mei', 'Jun', 'Jul', 'Ago', 'Sep', 'Okt', 'Nov', 'Des'],\n  WEEKDAYS: ['Jumapilyi', 'Jumatatuu', 'Jumanne', 'Jumatanu', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  STANDALONEWEEKDAYS: ['Jumapilyi', 'Jumatatuu', 'Jumanne', 'Jumatanu', 'Alhamisi', 'Ijumaa', 'Jumamosi'],\n  SHORTWEEKDAYS: ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'],\n  STANDALONESHORTWEEKDAYS: ['Jpi', 'Jtt', 'Jnn', 'Jtn', 'Alh', 'Iju', 'Jmo'],\n  NARROWWEEKDAYS: ['J', 'J', 'J', 'J', 'A', 'I', 'J'],\n  STANDALONENARROWWEEKDAYS: ['J', 'J', 'J', 'J', 'A', 'I', 'J'],\n  SHORTQUARTERS: ['R1', 'R2', 'R3', 'R4'],\n  QUARTERS: ['Robo 1', 'Robo 2', 'Robo 3', 'Robo 4'],\n  AMPMS: ['utuko', 'kyiukonyi'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale vun_TZ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_vun_TZ = goog.i18n.DateTimeSymbols_vun;\n\n\n/**\n * Date/time formatting symbols for locale wae.\n * @const\n */\ngoog.i18n.DateTimeSymbols_wae = {\n  ERAS: ['v. Chr.', 'n. Chr'],\n  ERANAMES: ['v. Chr.', 'n. Chr'],\n  NARROWMONTHS: ['J', 'H', 'M', 'A', 'M', 'B', 'H', 'Ö', 'H', 'W', 'W', 'C'],\n  STANDALONENARROWMONTHS: ['J', 'H', 'M', 'A', 'M', 'B', 'H', 'Ö', 'H', 'W', 'W', 'C'],\n  MONTHS: ['Jenner', 'Hornig', 'Märze', 'Abrille', 'Meije', 'Bráčet', 'Heiwet', 'Öigšte', 'Herbštmánet', 'Wímánet', 'Wintermánet', 'Chrištmánet'],\n  STANDALONEMONTHS: ['Jenner', 'Hornig', 'Märze', 'Abrille', 'Meije', 'Bráčet', 'Heiwet', 'Öigšte', 'Herbštmánet', 'Wímánet', 'Wintermánet', 'Chrištmánet'],\n  SHORTMONTHS: ['Jen', 'Hor', 'Mär', 'Abr', 'Mei', 'Brá', 'Hei', 'Öig', 'Her', 'Wím', 'Win', 'Chr'],\n  STANDALONESHORTMONTHS: ['Jen', 'Hor', 'Mär', 'Abr', 'Mei', 'Brá', 'Hei', 'Öig', 'Her', 'Wím', 'Win', 'Chr'],\n  WEEKDAYS: ['Sunntag', 'Mäntag', 'Zištag', 'Mittwuč', 'Fróntag', 'Fritag', 'Samštag'],\n  STANDALONEWEEKDAYS: ['Sunntag', 'Mäntag', 'Zištag', 'Mittwuč', 'Fróntag', 'Fritag', 'Samštag'],\n  SHORTWEEKDAYS: ['Sun', 'Män', 'Ziš', 'Mit', 'Fró', 'Fri', 'Sam'],\n  STANDALONESHORTWEEKDAYS: ['Sun', 'Män', 'Ziš', 'Mit', 'Fró', 'Fri', 'Sam'],\n  NARROWWEEKDAYS: ['S', 'M', 'Z', 'M', 'F', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'Z', 'M', 'F', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1. quartal', '2. quartal', '3. quartal', '4. quartal'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['EEEE, d. MMMM y', 'd. MMMM y', 'd. MMM y', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 3\n};\n\n\n/**\n * Date/time formatting symbols for locale wae_CH.\n * @const\n */\ngoog.i18n.DateTimeSymbols_wae_CH = goog.i18n.DateTimeSymbols_wae;\n\n\n/**\n * Date/time formatting symbols for locale wo.\n * @const\n */\ngoog.i18n.DateTimeSymbols_wo = {\n  ERAS: ['JC', 'AD'],\n  ERANAMES: ['av. JC', 'AD'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['Samwiyee', 'Fewriyee', 'Mars', 'Awril', 'Mee', 'Suwe', 'Sulet', 'Ut', 'Sàttumbar', 'Oktoobar', 'Nowàmbar', 'Desàmbar'],\n  STANDALONEMONTHS: ['Samwiyee', 'Fewriyee', 'Mars', 'Awril', 'Mee', 'Suwe', 'Sulet', 'Ut', 'Sàttumbar', 'Oktoobar', 'Nowàmbar', 'Desàmbar'],\n  SHORTMONTHS: ['Sam', 'Few', 'Mar', 'Awr', 'Mee', 'Suw', 'Sul', 'Ut', 'Sàt', 'Okt', 'Now', 'Des'],\n  STANDALONESHORTMONTHS: ['Sam', 'Few', 'Mar', 'Awr', 'Mee', 'Suw', 'Sul', 'Ut', 'Sàt', 'Okt', 'Now', 'Des'],\n  WEEKDAYS: ['Dibéer', 'Altine', 'Talaata', 'Àlarba', 'Alxamis', 'Àjjuma', 'Aseer'],\n  STANDALONEWEEKDAYS: ['Dibéer', 'Altine', 'Talaata', 'Àlarba', 'Alxamis', 'Àjjuma', 'Aseer'],\n  SHORTWEEKDAYS: ['Dib', 'Alt', 'Tal', 'Àla', 'Alx', 'Àjj', 'Ase'],\n  STANDALONESHORTWEEKDAYS: ['Dib', 'Alt', 'Tal', 'Àla', 'Alx', 'Àjj', 'Ase'],\n  NARROWWEEKDAYS: ['Dib', 'Alt', 'Tal', 'Àla', 'Alx', 'Àjj', 'Ase'],\n  STANDALONENARROWWEEKDAYS: ['Dib', 'Alt', 'Tal', 'Àla', 'Alx', 'Àjj', 'Ase'],\n  SHORTQUARTERS: ['1er Tri', '2e Tri', '3e Tri', '4e Tri'],\n  QUARTERS: ['1er Trimestar', '2e Trimestar', '3e Trimestar', '4e Trimestar'],\n  AMPMS: ['Sub', 'Ngo'],\n  DATEFORMATS: ['EEEE, d MMM, y', 'd MMMM, y', 'd MMM, y', 'dd-MM-y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} \\'ci\\' {0}', '{1} \\'ci\\' {0}', '{1} - {0}', '{1} - {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale wo_SN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_wo_SN = goog.i18n.DateTimeSymbols_wo;\n\n\n/**\n * Date/time formatting symbols for locale xh.\n * @const\n */\ngoog.i18n.DateTimeSymbols_xh = {\n  ERAS: ['BC', 'AD'],\n  ERANAMES: ['BC', 'AD'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['Janyuwari', 'Februwari', 'Matshi', 'Epreli', 'Meyi', 'Juni', 'Julayi', 'Agasti', 'Septemba', 'Okthoba', 'Novemba', 'Disemba'],\n  STANDALONEMONTHS: ['Janyuwari', 'Februwari', 'Matshi', 'Epreli', 'Meyi', 'Juni', 'Julayi', 'Agasti', 'Septemba', 'Okthoba', 'Novemba', 'Disemba'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mat', 'Epr', 'Mey', 'Jun', 'Jul', 'Aga', 'Sep', 'Okt', 'Nov', 'Dis'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mat', 'Epr', 'Mey', 'Jun', 'Jul', 'Aga', 'Sep', 'Okt', 'Nov', 'Dis'],\n  WEEKDAYS: ['Cawe', 'Mvulo', 'Lwesibini', 'Lwesithathu', 'Lwesine', 'Lwesihlanu', 'Mgqibelo'],\n  STANDALONEWEEKDAYS: ['Cawe', 'Mvulo', 'Lwesibini', 'Lwesithathu', 'Lwesine', 'Lwesihlanu', 'Mgqibelo'],\n  SHORTWEEKDAYS: ['Caw', 'Mvu', 'Bin', 'Tha', 'Sin', 'Hla', 'Mgq'],\n  STANDALONESHORTWEEKDAYS: ['Caw', 'Mvu', 'Bin', 'Tha', 'Sin', 'Hla', 'Mgq'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['1 unyangantathu', '2 unyangantathu', '3 unyangantathu', '4 unyangantathu'],\n  AMPMS: ['AM', 'PM'],\n  DATEFORMATS: ['y MMMM d, EEEE', 'y MMMM d', 'y MMM d', 'y-MM-dd'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale xh_ZA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_xh_ZA = goog.i18n.DateTimeSymbols_xh;\n\n\n/**\n * Date/time formatting symbols for locale xog.\n * @const\n */\ngoog.i18n.DateTimeSymbols_xog = {\n  ERAS: ['AZ', 'AF'],\n  ERANAMES: ['Kulisto nga azilawo', 'Kulisto nga affile'],\n  NARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  STANDALONENARROWMONTHS: ['J', 'F', 'M', 'A', 'M', 'J', 'J', 'A', 'S', 'O', 'N', 'D'],\n  MONTHS: ['Janwaliyo', 'Febwaliyo', 'Marisi', 'Apuli', 'Maayi', 'Juuni', 'Julaayi', 'Agusito', 'Sebuttemba', 'Okitobba', 'Novemba', 'Desemba'],\n  STANDALONEMONTHS: ['Janwaliyo', 'Febwaliyo', 'Marisi', 'Apuli', 'Maayi', 'Juuni', 'Julaayi', 'Agusito', 'Sebuttemba', 'Okitobba', 'Novemba', 'Desemba'],\n  SHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apu', 'Maa', 'Juu', 'Jul', 'Agu', 'Seb', 'Oki', 'Nov', 'Des'],\n  STANDALONESHORTMONTHS: ['Jan', 'Feb', 'Mar', 'Apu', 'Maa', 'Juu', 'Jul', 'Agu', 'Seb', 'Oki', 'Nov', 'Des'],\n  WEEKDAYS: ['Sabiiti', 'Balaza', 'Owokubili', 'Owokusatu', 'Olokuna', 'Olokutaanu', 'Olomukaaga'],\n  STANDALONEWEEKDAYS: ['Sabiiti', 'Balaza', 'Owokubili', 'Owokusatu', 'Olokuna', 'Olokutaanu', 'Olomukaaga'],\n  SHORTWEEKDAYS: ['Sabi', 'Bala', 'Kubi', 'Kusa', 'Kuna', 'Kuta', 'Muka'],\n  STANDALONESHORTWEEKDAYS: ['Sabi', 'Bala', 'Kubi', 'Kusa', 'Kuna', 'Kuta', 'Muka'],\n  NARROWWEEKDAYS: ['S', 'B', 'B', 'S', 'K', 'K', 'M'],\n  STANDALONENARROWWEEKDAYS: ['S', 'B', 'B', 'S', 'K', 'K', 'M'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Ebisera ebyomwaka ebisoka', 'Ebisera ebyomwaka ebyokubiri', 'Ebisera ebyomwaka ebyokusatu', 'Ebisera ebyomwaka ebyokuna'],\n  AMPMS: ['Munkyo', 'Eigulo'],\n  DATEFORMATS: ['EEEE, d MMMM y', 'd MMMM y', 'd MMM y', 'dd/MM/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale xog_UG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_xog_UG = goog.i18n.DateTimeSymbols_xog;\n\n\n/**\n * Date/time formatting symbols for locale yav.\n * @const\n */\ngoog.i18n.DateTimeSymbols_yav = {\n  ERAS: ['k.Y.', '+J.C.'],\n  ERANAMES: ['katikupíen Yésuse', 'ékélémkúnupíén n'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['pikítíkítie, oólí ú kutúan', 'siɛyɛ́, oóli ú kándíɛ', 'ɔnsúmbɔl, oóli ú kátátúɛ', 'mesiŋ, oóli ú kénie', 'ensil, oóli ú kátánuɛ', 'ɔsɔn', 'efute', 'pisuyú', 'imɛŋ i puɔs', 'imɛŋ i putúk,oóli ú kátíɛ', 'makandikɛ', 'pilɔndɔ́'],\n  STANDALONEMONTHS: ['pikítíkítie, oólí ú kutúan', 'siɛyɛ́, oóli ú kándíɛ', 'ɔnsúmbɔl, oóli ú kátátúɛ', 'mesiŋ, oóli ú kénie', 'ensil, oóli ú kátánuɛ', 'ɔsɔn', 'efute', 'pisuyú', 'imɛŋ i puɔs', 'imɛŋ i putúk,oóli ú kátíɛ', 'makandikɛ', 'pilɔndɔ́'],\n  SHORTMONTHS: ['o.1', 'o.2', 'o.3', 'o.4', 'o.5', 'o.6', 'o.7', 'o.8', 'o.9', 'o.10', 'o.11', 'o.12'],\n  STANDALONESHORTMONTHS: ['o.1', 'o.2', 'o.3', 'o.4', 'o.5', 'o.6', 'o.7', 'o.8', 'o.9', 'o.10', 'o.11', 'o.12'],\n  WEEKDAYS: ['sɔ́ndiɛ', 'móndie', 'muányáŋmóndie', 'metúkpíápɛ', 'kúpélimetúkpiapɛ', 'feléte', 'séselé'],\n  STANDALONEWEEKDAYS: ['sɔ́ndiɛ', 'móndie', 'muányáŋmóndie', 'metúkpíápɛ', 'kúpélimetúkpiapɛ', 'feléte', 'séselé'],\n  SHORTWEEKDAYS: ['sd', 'md', 'mw', 'et', 'kl', 'fl', 'ss'],\n  STANDALONESHORTWEEKDAYS: ['sd', 'md', 'mw', 'et', 'kl', 'fl', 'ss'],\n  NARROWWEEKDAYS: ['s', 'm', 'm', 'e', 'k', 'f', 's'],\n  STANDALONENARROWWEEKDAYS: ['s', 'm', 'm', 'e', 'k', 'f', 's'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['ndátúɛ 1', 'ndátúɛ 2', 'ndátúɛ 3', 'ndátúɛ 4'],\n  AMPMS: ['kiɛmɛ́ɛm', 'kisɛ́ndɛ'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale yav_CM.\n * @const\n */\ngoog.i18n.DateTimeSymbols_yav_CM = goog.i18n.DateTimeSymbols_yav;\n\n\n/**\n * Date/time formatting symbols for locale yi.\n * @const\n */\ngoog.i18n.DateTimeSymbols_yi = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['BCE', 'CE'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['יאַנואַר', 'פֿעברואַר', 'מערץ', 'אַפּריל', 'מיי', 'יוני', 'יולי', 'אויגוסט', 'סעפּטעמבער', 'אקטאבער', 'נאוועמבער', 'דעצעמבער'],\n  STANDALONEMONTHS: ['יאַנואַר', 'פֿעברואַר', 'מערץ', 'אַפּריל', 'מיי', 'יוני', 'יולי', 'אויגוסט', 'סעפּטעמבער', 'אקטאבער', 'נאוועמבער', 'דעצעמבער'],\n  SHORTMONTHS: ['יאַנואַר', 'פֿעברואַר', 'מערץ', 'אַפּריל', 'מיי', 'יוני', 'יולי', 'אויגוסט', 'סעפּטעמבער', 'אקטאבער', 'נאוועמבער', 'דעצעמבער'],\n  STANDALONESHORTMONTHS: ['יאַנ', 'פֿעב', 'מערץ', 'אַפּר', 'מיי', 'יוני', 'יולי', 'אויג', 'סעפּ', 'אקט', 'נאוו', 'דעצ'],\n  WEEKDAYS: ['זונטיק', 'מאָנטיק', 'דינסטיק', 'מיטוואך', 'דאנערשטיק', 'פֿרײַטיק', 'שבת'],\n  STANDALONEWEEKDAYS: ['זונטיק', 'מאָנטיק', 'דינסטיק', 'מיטוואך', 'דאנערשטיק', 'פֿרײַטיק', 'שבת'],\n  SHORTWEEKDAYS: ['זונטיק', 'מאָנטיק', 'דינסטיק', 'מיטוואך', 'דאנערשטיק', 'פֿרײַטיק', 'שבת'],\n  STANDALONESHORTWEEKDAYS: ['זונטיק', 'מאָנטיק', 'דינסטיק', 'מיטוואך', 'דאנערשטיק', 'פֿרײַטיק', 'שבת'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  AMPMS: ['פֿאַרמיטאָג', 'נאָכמיטאָג'],\n  DATEFORMATS: ['EEEE, dטן MMMM y', 'dטן MMMM y', 'dטן MMM y', 'dd/MM/yy'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1}, {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale yi_001.\n * @const\n */\ngoog.i18n.DateTimeSymbols_yi_001 = goog.i18n.DateTimeSymbols_yi;\n\n\n/**\n * Date/time formatting symbols for locale yo.\n * @const\n */\ngoog.i18n.DateTimeSymbols_yo = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['Saju Kristi', 'Lehin Kristi'],\n  NARROWMONTHS: ['S', 'È', 'Ẹ', 'Ì', 'Ẹ̀', 'Ò', 'A', 'Ò', 'O', 'Ọ̀', 'B', 'Ọ̀'],\n  STANDALONENARROWMONTHS: ['S', 'È', 'Ẹ', 'Ì', 'Ẹ̀', 'Ò', 'A', 'Ò', 'O', 'Ọ̀', 'B', 'Ọ̀'],\n  MONTHS: ['Oṣù Ṣẹ́rẹ́', 'Oṣù Èrèlè', 'Oṣù Ẹrẹ̀nà', 'Oṣù Ìgbé', 'Oṣù Ẹ̀bibi', 'Oṣù Òkúdu', 'Oṣù Agẹmọ', 'Oṣù Ògún', 'Oṣù Owewe', 'Oṣù Ọ̀wàrà', 'Oṣù Bélú', 'Oṣù Ọ̀pẹ̀'],\n  STANDALONEMONTHS: ['Ṣẹ́rẹ́', 'Èrèlè', 'Ẹrẹ̀nà', 'Ìgbé', 'Ẹ̀bibi', 'Òkúdu', 'Agẹmọ', 'Ògún', 'Owewe', 'Ọ̀wàrà', 'Bélú', 'Ọ̀pẹ̀'],\n  SHORTMONTHS: ['Ṣẹ́r', 'Èrèl', 'Ẹrẹ̀n', 'Ìgb', 'Ẹ̀bi', 'Òkú', 'Agẹ', 'Ògú', 'Owe', 'Ọ̀wà', 'Bél', 'Ọ̀pẹ'],\n  STANDALONESHORTMONTHS: ['Ṣẹ́', 'Èr', 'Ẹr', 'Ìg', 'Ẹ̀b', 'Òk', 'Ag', 'Òg', 'Ow', 'Ọ̀w', 'Bé', 'Ọ̀p'],\n  WEEKDAYS: ['Ọjọ́ Àìkú', 'Ọjọ́ Ajé', 'Ọjọ́ Ìsẹ́gun', 'Ọjọ́rú', 'Ọjọ́bọ', 'Ọjọ́ Ẹtì', 'Ọjọ́ Àbámẹ́ta'],\n  STANDALONEWEEKDAYS: ['Àìkú', 'Ajé', 'Ìsẹ́gun', 'Ọjọ́rú', 'Ọjọ́bọ', 'Ẹtì', 'Àbámẹ́ta'],\n  SHORTWEEKDAYS: ['Àìk', 'Aj', 'Ìsẹ́g', 'Ọjọ́r', 'Ọjọ́b', 'Ẹt', 'Àbám'],\n  STANDALONESHORTWEEKDAYS: ['Àìk', 'Aj', 'Ìsẹ́g', 'Ọjọ́r', 'Ọjọ́b', 'Ẹt', 'Àbám'],\n  NARROWWEEKDAYS: ['À', 'A', 'Ì', 'Ọ', 'Ọ', 'Ẹ', 'À'],\n  STANDALONENARROWWEEKDAYS: ['À', 'A', 'Ì', 'Ọ', 'Ọ', 'Ẹ', 'À'],\n  SHORTQUARTERS: ['Ìdámẹ́rin kíní', 'Ìdámẹ́rin Kejì', 'Ìdámẹ́rin Kẹta', 'Ìdámẹ́rin Kẹrin'],\n  QUARTERS: ['Ìdámẹ́rin kíní', 'Ìdámẹ́rin Kejì', 'Ìdámẹ́rin Kẹta', 'Ìdámẹ́rin Kẹrin'],\n  AMPMS: ['Àárọ̀', 'Ọ̀sán'],\n  DATEFORMATS: ['EEEE, d MMM y', 'd MMM y', 'd MM y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'H:mm:ss z', 'H:m:s', 'H:m'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale yo_BJ.\n * @const\n */\ngoog.i18n.DateTimeSymbols_yo_BJ = {\n  ERAS: ['BCE', 'CE'],\n  ERANAMES: ['Saju Kristi', 'Lehin Kristi'],\n  NARROWMONTHS: ['S', 'È', 'Ɛ', 'Ì', 'Ɛ̀', 'Ò', 'A', 'Ò', 'O', 'Ɔ̀', 'B', 'Ɔ̀'],\n  STANDALONENARROWMONTHS: ['S', 'È', 'Ɛ', 'Ì', 'Ɛ̀', 'Ò', 'A', 'Ò', 'O', 'Ɔ̀', 'B', 'Ɔ̀'],\n  MONTHS: ['Oshù Shɛ́rɛ́', 'Oshù Èrèlè', 'Oshù Ɛrɛ̀nà', 'Oshù Ìgbé', 'Oshù Ɛ̀bibi', 'Oshù Òkúdu', 'Oshù Agɛmɔ', 'Oshù Ògún', 'Oshù Owewe', 'Oshù Ɔ̀wàrà', 'Oshù Bélú', 'Oshù Ɔ̀pɛ̀'],\n  STANDALONEMONTHS: ['Shɛ́rɛ́', 'Èrèlè', 'Ɛrɛ̀nà', 'Ìgbé', 'Ɛ̀bibi', 'Òkúdu', 'Agɛmɔ', 'Ògún', 'Owewe', 'Ɔ̀wàrà', 'Bélú', 'Ɔ̀pɛ̀'],\n  SHORTMONTHS: ['Shɛ́r', 'Èrèl', 'Ɛrɛ̀n', 'Ìgb', 'Ɛ̀bi', 'Òkú', 'Agɛ', 'Ògú', 'Owe', 'Ɔ̀wà', 'Bél', 'Ɔ̀pɛ'],\n  STANDALONESHORTMONTHS: ['Shɛ́', 'Èr', 'Ɛr', 'Ìg', 'Ɛ̀b', 'Òk', 'Ag', 'Òg', 'Ow', 'Ɔ̀w', 'Bé', 'Ɔ̀p'],\n  WEEKDAYS: ['Ɔjɔ́ Àìkú', 'Ɔjɔ́ Ajé', 'Ɔjɔ́ Ìsɛ́gun', 'Ɔjɔ́rú', 'Ɔjɔ́bɔ', 'Ɔjɔ́ Ɛtì', 'Ɔjɔ́ Àbámɛ́ta'],\n  STANDALONEWEEKDAYS: ['Àìkú', 'Ajé', 'Ìsɛ́gun', 'Ɔjɔ́rú', 'Ɔjɔ́bɔ', 'Ɛtì', 'Àbámɛ́ta'],\n  SHORTWEEKDAYS: ['Àìk', 'Aj', 'Ìsɛ́g', 'Ɔjɔ́r', 'Ɔjɔ́b', 'Ɛt', 'Àbám'],\n  STANDALONESHORTWEEKDAYS: ['Àìk', 'Aj', 'Ìsɛ́g', 'Ɔjɔ́r', 'Ɔjɔ́b', 'Ɛt', 'Àbám'],\n  NARROWWEEKDAYS: ['À', 'A', 'Ì', 'Ɔ', 'Ɔ', 'Ɛ', 'À'],\n  STANDALONENARROWWEEKDAYS: ['À', 'A', 'Ì', 'Ɔ', 'Ɔ', 'Ɛ', 'À'],\n  SHORTQUARTERS: ['Ìdámɛ́rin kíní', 'Ìdámɛ́rin Kejì', 'Ìdámɛ́rin Kɛta', 'Ìdámɛ́rin Kɛrin'],\n  QUARTERS: ['Ìdámɛ́rin kíní', 'Ìdámɛ́rin Kejì', 'Ìdámɛ́rin Kɛta', 'Ìdámɛ́rin Kɛrin'],\n  AMPMS: ['Àárɔ̀', 'Ɔ̀sán'],\n  DATEFORMATS: ['EEEE, d MMM y', 'd MMM y', 'd MM y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'H:mm:ss z', 'H:m:s', 'H:m'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale yo_NG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_yo_NG = goog.i18n.DateTimeSymbols_yo;\n\n\n/**\n * Date/time formatting symbols for locale yue.\n * @const\n */\ngoog.i18n.DateTimeSymbols_yue = {\n  ERAS: ['西元前', '西元'],\n  ERANAMES: ['西元前', '西元'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONEMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  SHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONESHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  WEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  STANDALONEWEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  SHORTWEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  STANDALONESHORTWEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  NARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  STANDALONENARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  SHORTQUARTERS: ['第1季', '第2季', '第3季', '第4季'],\n  QUARTERS: ['第1季', '第2季', '第3季', '第4季'],\n  AMPMS: ['上午', '下午'],\n  DATEFORMATS: ['y年M月d日 EEEE', 'y年M月d日', 'y年M月d日', 'y/M/d'],\n  TIMEFORMATS: ['ah:mm:ss [zzzz]', 'ah:mm:ss [z]', 'ah:mm:ss', 'ah:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale yue_Hans.\n * @const\n */\ngoog.i18n.DateTimeSymbols_yue_Hans = {\n  ERAS: ['西元前', '西元'],\n  ERANAMES: ['西元前', '西元'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n  STANDALONEMONTHS: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n  SHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONESHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  WEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  STANDALONEWEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  SHORTWEEKDAYS: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n  STANDALONESHORTWEEKDAYS: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n  NARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  STANDALONENARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  SHORTQUARTERS: ['第1季', '第2季', '第3季', '第4季'],\n  QUARTERS: ['第1季', '第2季', '第3季', '第4季'],\n  AMPMS: ['上午', '下午'],\n  DATEFORMATS: ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'y/M/d'],\n  TIMEFORMATS: ['zzzz ah:mm:ss', 'z ah:mm:ss', 'ah:mm:ss', 'ah:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale yue_Hans_CN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_yue_Hans_CN = {\n  ERAS: ['西元前', '西元'],\n  ERANAMES: ['西元前', '西元'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n  STANDALONEMONTHS: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n  SHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONESHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  WEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  STANDALONEWEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  SHORTWEEKDAYS: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n  STANDALONESHORTWEEKDAYS: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n  NARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  STANDALONENARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  SHORTQUARTERS: ['第1季', '第2季', '第3季', '第4季'],\n  QUARTERS: ['第1季', '第2季', '第3季', '第4季'],\n  AMPMS: ['上午', '下午'],\n  DATEFORMATS: ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'y/M/d'],\n  TIMEFORMATS: ['zzzz ah:mm:ss', 'z ah:mm:ss', 'ah:mm:ss', 'ah:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale yue_Hant.\n * @const\n */\ngoog.i18n.DateTimeSymbols_yue_Hant = goog.i18n.DateTimeSymbols_yue;\n\n\n/**\n * Date/time formatting symbols for locale yue_Hant_HK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_yue_Hant_HK = goog.i18n.DateTimeSymbols_yue;\n\n\n/**\n * Date/time formatting symbols for locale zgh.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zgh = {\n  ERAS: ['ⴷⴰⵄ', 'ⴷⴼⵄ'],\n  ERANAMES: ['ⴷⴰⵜ ⵏ ⵄⵉⵙⴰ', 'ⴷⴼⴼⵉⵔ ⵏ ⵄⵉⵙⴰ'],\n  NARROWMONTHS: ['ⵉ', 'ⴱ', 'ⵎ', 'ⵉ', 'ⵎ', 'ⵢ', 'ⵢ', 'ⵖ', 'ⵛ', 'ⴽ', 'ⵏ', 'ⴷ'],\n  STANDALONENARROWMONTHS: ['ⵉ', 'ⴱ', 'ⵎ', 'ⵉ', 'ⵎ', 'ⵢ', 'ⵢ', 'ⵖ', 'ⵛ', 'ⴽ', 'ⵏ', 'ⴷ'],\n  MONTHS: ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵜⵓⴱⵔ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⴰⵏⴱⵉⵔ'],\n  STANDALONEMONTHS: ['ⵉⵏⵏⴰⵢⵔ', 'ⴱⵕⴰⵢⵕ', 'ⵎⴰⵕⵚ', 'ⵉⴱⵔⵉⵔ', 'ⵎⴰⵢⵢⵓ', 'ⵢⵓⵏⵢⵓ', 'ⵢⵓⵍⵢⵓⵣ', 'ⵖⵓⵛⵜ', 'ⵛⵓⵜⴰⵏⴱⵉⵔ', 'ⴽⵜⵓⴱⵔ', 'ⵏⵓⵡⴰⵏⴱⵉⵔ', 'ⴷⵓⵊⴰⵏⴱⵉⵔ'],\n  SHORTMONTHS: ['ⵉⵏⵏ', 'ⴱⵕⴰ', 'ⵎⴰⵕ', 'ⵉⴱⵔ', 'ⵎⴰⵢ', 'ⵢⵓⵏ', 'ⵢⵓⵍ', 'ⵖⵓⵛ', 'ⵛⵓⵜ', 'ⴽⵜⵓ', 'ⵏⵓⵡ', 'ⴷⵓⵊ'],\n  STANDALONESHORTMONTHS: ['ⵉⵏⵏ', 'ⴱⵕⴰ', 'ⵎⴰⵕ', 'ⵉⴱⵔ', 'ⵎⴰⵢ', 'ⵢⵓⵏ', 'ⵢⵓⵍ', 'ⵖⵓⵛ', 'ⵛⵓⵜ', 'ⴽⵜⵓ', 'ⵏⵓⵡ', 'ⴷⵓⵊ'],\n  WEEKDAYS: ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵕⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⴰⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'],\n  STANDALONEWEEKDAYS: ['ⴰⵙⴰⵎⴰⵙ', 'ⴰⵢⵏⴰⵙ', 'ⴰⵙⵉⵏⴰⵙ', 'ⴰⴽⵕⴰⵙ', 'ⴰⴽⵡⴰⵙ', 'ⴰⵙⵉⵎⵡⴰⵙ', 'ⴰⵙⵉⴹⵢⴰⵙ'],\n  SHORTWEEKDAYS: ['ⴰⵙⴰ', 'ⴰⵢⵏ', 'ⴰⵙⵉ', 'ⴰⴽⵕ', 'ⴰⴽⵡ', 'ⴰⵙⵉⵎ', 'ⴰⵙⵉⴹ'],\n  STANDALONESHORTWEEKDAYS: ['ⴰⵙⴰ', 'ⴰⵢⵏ', 'ⴰⵙⵉ', 'ⴰⴽⵕ', 'ⴰⴽⵡ', 'ⴰⵙⵉⵎ', 'ⴰⵙⵉⴹ'],\n  NARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  STANDALONENARROWWEEKDAYS: ['S', 'M', 'T', 'W', 'T', 'F', 'S'],\n  SHORTQUARTERS: ['ⴰⴽ 1', 'ⴰⴽ 2', 'ⴰⴽ 3', 'ⴰⴽ 4'],\n  QUARTERS: ['ⴰⴽⵕⴰⴹⵢⵓⵔ 1', 'ⴰⴽⵕⴰⴹⵢⵓⵔ 2', 'ⴰⴽⵕⴰⴹⵢⵓⵔ 3', 'ⴰⴽⵕⴰⴹⵢⵓⵔ 4'],\n  AMPMS: ['ⵜⵉⴼⴰⵡⵜ', 'ⵜⴰⴷⴳⴳⵯⴰⵜ'],\n  DATEFORMATS: ['EEEE d MMMM y', 'd MMMM y', 'd MMM, y', 'd/M/y'],\n  TIMEFORMATS: ['HH:mm:ss zzzz', 'HH:mm:ss z', 'HH:mm:ss', 'HH:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 0,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 6\n};\n\n\n/**\n * Date/time formatting symbols for locale zgh_MA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zgh_MA = goog.i18n.DateTimeSymbols_zgh;\n\n\n/**\n * Date/time formatting symbols for locale zh_Hans.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zh_Hans = goog.i18n.DateTimeSymbols_zh;\n\n\n/**\n * Date/time formatting symbols for locale zh_Hans_CN.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zh_Hans_CN = goog.i18n.DateTimeSymbols_zh;\n\n\n/**\n * Date/time formatting symbols for locale zh_Hans_HK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zh_Hans_HK = {\n  ERAS: ['公元前', '公元'],\n  ERANAMES: ['公元前', '公元'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n  STANDALONEMONTHS: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n  SHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONESHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  WEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  STANDALONEWEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  SHORTWEEKDAYS: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n  STANDALONESHORTWEEKDAYS: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n  NARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  STANDALONENARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  SHORTQUARTERS: ['1季度', '2季度', '3季度', '4季度'],\n  QUARTERS: ['第一季度', '第二季度', '第三季度', '第四季度'],\n  AMPMS: ['上午', '下午'],\n  DATEFORMATS: ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'd/M/yy'],\n  TIMEFORMATS: ['zzzz ah:mm:ss', 'z ah:mm:ss', 'ah:mm:ss', 'ah:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale zh_Hans_MO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zh_Hans_MO = {\n  ERAS: ['公元前', '公元'],\n  ERANAMES: ['公元前', '公元'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n  STANDALONEMONTHS: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n  SHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONESHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  WEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  STANDALONEWEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  SHORTWEEKDAYS: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n  STANDALONESHORTWEEKDAYS: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n  NARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  STANDALONENARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  SHORTQUARTERS: ['1季度', '2季度', '3季度', '4季度'],\n  QUARTERS: ['第一季度', '第二季度', '第三季度', '第四季度'],\n  AMPMS: ['上午', '下午'],\n  DATEFORMATS: ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'd/M/yy'],\n  TIMEFORMATS: ['zzzz ah:mm:ss', 'z ah:mm:ss', 'ah:mm:ss', 'ah:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale zh_Hans_SG.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zh_Hans_SG = {\n  ERAS: ['公元前', '公元'],\n  ERANAMES: ['公元前', '公元'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n  STANDALONEMONTHS: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],\n  SHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONESHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  WEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  STANDALONEWEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  SHORTWEEKDAYS: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n  STANDALONESHORTWEEKDAYS: ['周日', '周一', '周二', '周三', '周四', '周五', '周六'],\n  NARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  STANDALONENARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  SHORTQUARTERS: ['1季度', '2季度', '3季度', '4季度'],\n  QUARTERS: ['第一季度', '第二季度', '第三季度', '第四季度'],\n  AMPMS: ['上午', '下午'],\n  DATEFORMATS: ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'dd/MM/yy'],\n  TIMEFORMATS: ['zzzz ah:mm:ss', 'z ah:mm:ss', 'ah:mm:ss', 'ah:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale zh_Hant.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zh_Hant = {\n  ERAS: ['西元前', '西元'],\n  ERANAMES: ['西元前', '西元'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONEMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  SHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONESHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  WEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  STANDALONEWEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  SHORTWEEKDAYS: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],\n  STANDALONESHORTWEEKDAYS: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],\n  NARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  STANDALONENARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  SHORTQUARTERS: ['第1季', '第2季', '第3季', '第4季'],\n  QUARTERS: ['第1季', '第2季', '第3季', '第4季'],\n  AMPMS: ['上午', '下午'],\n  DATEFORMATS: ['y年M月d日 EEEE', 'y年M月d日', 'y年M月d日', 'y/M/d'],\n  TIMEFORMATS: ['ah:mm:ss [zzzz]', 'ah:mm:ss [z]', 'ah:mm:ss', 'ah:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale zh_Hant_HK.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zh_Hant_HK = {\n  ERAS: ['公元前', '公元'],\n  ERANAMES: ['公元前', '公元'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONEMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  SHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONESHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  WEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  STANDALONEWEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  SHORTWEEKDAYS: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],\n  STANDALONESHORTWEEKDAYS: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],\n  NARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  STANDALONENARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['第1季', '第2季', '第3季', '第4季'],\n  AMPMS: ['上午', '下午'],\n  DATEFORMATS: ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'd/M/y'],\n  TIMEFORMATS: ['ah:mm:ss [zzzz]', 'ah:mm:ss [z]', 'ah:mm:ss', 'ah:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale zh_Hant_MO.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zh_Hant_MO = {\n  ERAS: ['公元前', '公元'],\n  ERANAMES: ['公元前', '公元'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONEMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  SHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONESHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  WEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  STANDALONEWEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  SHORTWEEKDAYS: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],\n  STANDALONESHORTWEEKDAYS: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],\n  NARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  STANDALONENARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  SHORTQUARTERS: ['Q1', 'Q2', 'Q3', 'Q4'],\n  QUARTERS: ['第1季', '第2季', '第3季', '第4季'],\n  AMPMS: ['上午', '下午'],\n  DATEFORMATS: ['y年M月d日EEEE', 'y年M月d日', 'y年M月d日', 'd/M/y'],\n  TIMEFORMATS: ['ah:mm:ss [zzzz]', 'ah:mm:ss [z]', 'ah:mm:ss', 'ah:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale zh_Hant_TW.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zh_Hant_TW = {\n  ERAS: ['西元前', '西元'],\n  ERANAMES: ['西元前', '西元'],\n  NARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  STANDALONENARROWMONTHS: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'],\n  MONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONEMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  SHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  STANDALONESHORTMONTHS: ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月'],\n  WEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  STANDALONEWEEKDAYS: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'],\n  SHORTWEEKDAYS: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],\n  STANDALONESHORTWEEKDAYS: ['週日', '週一', '週二', '週三', '週四', '週五', '週六'],\n  NARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  STANDALONENARROWWEEKDAYS: ['日', '一', '二', '三', '四', '五', '六'],\n  SHORTQUARTERS: ['第1季', '第2季', '第3季', '第4季'],\n  QUARTERS: ['第1季', '第2季', '第3季', '第4季'],\n  AMPMS: ['上午', '下午'],\n  DATEFORMATS: ['y年M月d日 EEEE', 'y年M月d日', 'y年M月d日', 'y/M/d'],\n  TIMEFORMATS: ['ah:mm:ss [zzzz]', 'ah:mm:ss [z]', 'ah:mm:ss', 'ah:mm'],\n  DATETIMEFORMATS: ['{1} {0}', '{1} {0}', '{1} {0}', '{1} {0}'],\n  FIRSTDAYOFWEEK: 6,\n  WEEKENDRANGE: [5, 6],\n  FIRSTWEEKCUTOFFDAY: 5\n};\n\n\n/**\n * Date/time formatting symbols for locale zu_ZA.\n * @const\n */\ngoog.i18n.DateTimeSymbols_zu_ZA = goog.i18n.DateTimeSymbols_zu;\n\n\n/**\n * Selected date/time formatting symbols by locale.\n */\nswitch (goog.LOCALE) {\n  case 'af_NA':\n  case 'af-NA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_af_NA;\n    break;\n  case 'af_ZA':\n  case 'af-ZA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_af_ZA;\n    break;\n  case 'agq':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_agq;\n    break;\n  case 'agq_CM':\n  case 'agq-CM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_agq_CM;\n    break;\n  case 'ak':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ak;\n    break;\n  case 'ak_GH':\n  case 'ak-GH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ak_GH;\n    break;\n  case 'am_ET':\n  case 'am-ET':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_am_ET;\n    break;\n  case 'ar_001':\n  case 'ar-001':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_001;\n    break;\n  case 'ar_AE':\n  case 'ar-AE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_AE;\n    break;\n  case 'ar_BH':\n  case 'ar-BH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_BH;\n    break;\n  case 'ar_DJ':\n  case 'ar-DJ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_DJ;\n    break;\n  case 'ar_EH':\n  case 'ar-EH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_EH;\n    break;\n  case 'ar_ER':\n  case 'ar-ER':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_ER;\n    break;\n  case 'ar_IL':\n  case 'ar-IL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_IL;\n    break;\n  case 'ar_IQ':\n  case 'ar-IQ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_IQ;\n    break;\n  case 'ar_JO':\n  case 'ar-JO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_JO;\n    break;\n  case 'ar_KM':\n  case 'ar-KM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_KM;\n    break;\n  case 'ar_KW':\n  case 'ar-KW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_KW;\n    break;\n  case 'ar_LB':\n  case 'ar-LB':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_LB;\n    break;\n  case 'ar_LY':\n  case 'ar-LY':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_LY;\n    break;\n  case 'ar_MA':\n  case 'ar-MA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_MA;\n    break;\n  case 'ar_MR':\n  case 'ar-MR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_MR;\n    break;\n  case 'ar_OM':\n  case 'ar-OM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_OM;\n    break;\n  case 'ar_PS':\n  case 'ar-PS':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_PS;\n    break;\n  case 'ar_QA':\n  case 'ar-QA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_QA;\n    break;\n  case 'ar_SA':\n  case 'ar-SA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_SA;\n    break;\n  case 'ar_SD':\n  case 'ar-SD':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_SD;\n    break;\n  case 'ar_SO':\n  case 'ar-SO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_SO;\n    break;\n  case 'ar_SS':\n  case 'ar-SS':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_SS;\n    break;\n  case 'ar_SY':\n  case 'ar-SY':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_SY;\n    break;\n  case 'ar_TD':\n  case 'ar-TD':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_TD;\n    break;\n  case 'ar_TN':\n  case 'ar-TN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_TN;\n    break;\n  case 'ar_XB':\n  case 'ar-XB':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_XB;\n    break;\n  case 'ar_YE':\n  case 'ar-YE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ar_YE;\n    break;\n  case 'as':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_as;\n    break;\n  case 'as_IN':\n  case 'as-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_as_IN;\n    break;\n  case 'asa':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_asa;\n    break;\n  case 'asa_TZ':\n  case 'asa-TZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_asa_TZ;\n    break;\n  case 'ast':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ast;\n    break;\n  case 'ast_ES':\n  case 'ast-ES':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ast_ES;\n    break;\n  case 'az_Cyrl':\n  case 'az-Cyrl':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_az_Cyrl;\n    break;\n  case 'az_Cyrl_AZ':\n  case 'az-Cyrl-AZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_az_Cyrl_AZ;\n    break;\n  case 'az_Latn':\n  case 'az-Latn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_az_Latn;\n    break;\n  case 'az_Latn_AZ':\n  case 'az-Latn-AZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_az_Latn_AZ;\n    break;\n  case 'bas':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bas;\n    break;\n  case 'bas_CM':\n  case 'bas-CM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bas_CM;\n    break;\n  case 'be_BY':\n  case 'be-BY':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_be_BY;\n    break;\n  case 'bem':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bem;\n    break;\n  case 'bem_ZM':\n  case 'bem-ZM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bem_ZM;\n    break;\n  case 'bez':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bez;\n    break;\n  case 'bez_TZ':\n  case 'bez-TZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bez_TZ;\n    break;\n  case 'bg_BG':\n  case 'bg-BG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bg_BG;\n    break;\n  case 'bm':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bm;\n    break;\n  case 'bm_ML':\n  case 'bm-ML':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bm_ML;\n    break;\n  case 'bn_BD':\n  case 'bn-BD':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bn_BD;\n    break;\n  case 'bn_IN':\n  case 'bn-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bn_IN;\n    break;\n  case 'bo':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bo;\n    break;\n  case 'bo_CN':\n  case 'bo-CN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bo_CN;\n    break;\n  case 'bo_IN':\n  case 'bo-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bo_IN;\n    break;\n  case 'br_FR':\n  case 'br-FR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_br_FR;\n    break;\n  case 'brx':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_brx;\n    break;\n  case 'brx_IN':\n  case 'brx-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_brx_IN;\n    break;\n  case 'bs_Cyrl':\n  case 'bs-Cyrl':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bs_Cyrl;\n    break;\n  case 'bs_Cyrl_BA':\n  case 'bs-Cyrl-BA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bs_Cyrl_BA;\n    break;\n  case 'bs_Latn':\n  case 'bs-Latn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bs_Latn;\n    break;\n  case 'bs_Latn_BA':\n  case 'bs-Latn-BA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_bs_Latn_BA;\n    break;\n  case 'ca_AD':\n  case 'ca-AD':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ca_AD;\n    break;\n  case 'ca_ES':\n  case 'ca-ES':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ca_ES;\n    break;\n  case 'ca_FR':\n  case 'ca-FR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ca_FR;\n    break;\n  case 'ca_IT':\n  case 'ca-IT':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ca_IT;\n    break;\n  case 'ccp':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ccp;\n    break;\n  case 'ccp_BD':\n  case 'ccp-BD':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ccp_BD;\n    break;\n  case 'ccp_IN':\n  case 'ccp-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ccp_IN;\n    break;\n  case 'ce':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ce;\n    break;\n  case 'ce_RU':\n  case 'ce-RU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ce_RU;\n    break;\n  case 'ceb':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ceb;\n    break;\n  case 'ceb_PH':\n  case 'ceb-PH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ceb_PH;\n    break;\n  case 'cgg':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_cgg;\n    break;\n  case 'cgg_UG':\n  case 'cgg-UG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_cgg_UG;\n    break;\n  case 'chr_US':\n  case 'chr-US':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_chr_US;\n    break;\n  case 'ckb':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ckb;\n    break;\n  case 'ckb_IQ':\n  case 'ckb-IQ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ckb_IQ;\n    break;\n  case 'ckb_IR':\n  case 'ckb-IR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ckb_IR;\n    break;\n  case 'cs_CZ':\n  case 'cs-CZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_cs_CZ;\n    break;\n  case 'cy_GB':\n  case 'cy-GB':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_cy_GB;\n    break;\n  case 'da_DK':\n  case 'da-DK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_da_DK;\n    break;\n  case 'da_GL':\n  case 'da-GL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_da_GL;\n    break;\n  case 'dav':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_dav;\n    break;\n  case 'dav_KE':\n  case 'dav-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_dav_KE;\n    break;\n  case 'de_BE':\n  case 'de-BE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_de_BE;\n    break;\n  case 'de_DE':\n  case 'de-DE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_de_DE;\n    break;\n  case 'de_IT':\n  case 'de-IT':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_de_IT;\n    break;\n  case 'de_LI':\n  case 'de-LI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_de_LI;\n    break;\n  case 'de_LU':\n  case 'de-LU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_de_LU;\n    break;\n  case 'dje':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_dje;\n    break;\n  case 'dje_NE':\n  case 'dje-NE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_dje_NE;\n    break;\n  case 'dsb':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_dsb;\n    break;\n  case 'dsb_DE':\n  case 'dsb-DE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_dsb_DE;\n    break;\n  case 'dua':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_dua;\n    break;\n  case 'dua_CM':\n  case 'dua-CM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_dua_CM;\n    break;\n  case 'dyo':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_dyo;\n    break;\n  case 'dyo_SN':\n  case 'dyo-SN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_dyo_SN;\n    break;\n  case 'dz':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_dz;\n    break;\n  case 'dz_BT':\n  case 'dz-BT':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_dz_BT;\n    break;\n  case 'ebu':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ebu;\n    break;\n  case 'ebu_KE':\n  case 'ebu-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ebu_KE;\n    break;\n  case 'ee':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ee;\n    break;\n  case 'ee_GH':\n  case 'ee-GH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ee_GH;\n    break;\n  case 'ee_TG':\n  case 'ee-TG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ee_TG;\n    break;\n  case 'el_CY':\n  case 'el-CY':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_el_CY;\n    break;\n  case 'el_GR':\n  case 'el-GR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_el_GR;\n    break;\n  case 'en_001':\n  case 'en-001':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_001;\n    break;\n  case 'en_150':\n  case 'en-150':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_150;\n    break;\n  case 'en_AE':\n  case 'en-AE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_AE;\n    break;\n  case 'en_AG':\n  case 'en-AG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_AG;\n    break;\n  case 'en_AI':\n  case 'en-AI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_AI;\n    break;\n  case 'en_AS':\n  case 'en-AS':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_AS;\n    break;\n  case 'en_AT':\n  case 'en-AT':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_AT;\n    break;\n  case 'en_BB':\n  case 'en-BB':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_BB;\n    break;\n  case 'en_BE':\n  case 'en-BE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_BE;\n    break;\n  case 'en_BI':\n  case 'en-BI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_BI;\n    break;\n  case 'en_BM':\n  case 'en-BM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_BM;\n    break;\n  case 'en_BS':\n  case 'en-BS':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_BS;\n    break;\n  case 'en_BW':\n  case 'en-BW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_BW;\n    break;\n  case 'en_BZ':\n  case 'en-BZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_BZ;\n    break;\n  case 'en_CC':\n  case 'en-CC':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_CC;\n    break;\n  case 'en_CH':\n  case 'en-CH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_CH;\n    break;\n  case 'en_CK':\n  case 'en-CK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_CK;\n    break;\n  case 'en_CM':\n  case 'en-CM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_CM;\n    break;\n  case 'en_CX':\n  case 'en-CX':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_CX;\n    break;\n  case 'en_CY':\n  case 'en-CY':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_CY;\n    break;\n  case 'en_DE':\n  case 'en-DE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_DE;\n    break;\n  case 'en_DG':\n  case 'en-DG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_DG;\n    break;\n  case 'en_DK':\n  case 'en-DK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_DK;\n    break;\n  case 'en_DM':\n  case 'en-DM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_DM;\n    break;\n  case 'en_ER':\n  case 'en-ER':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_ER;\n    break;\n  case 'en_FI':\n  case 'en-FI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_FI;\n    break;\n  case 'en_FJ':\n  case 'en-FJ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_FJ;\n    break;\n  case 'en_FK':\n  case 'en-FK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_FK;\n    break;\n  case 'en_FM':\n  case 'en-FM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_FM;\n    break;\n  case 'en_GD':\n  case 'en-GD':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_GD;\n    break;\n  case 'en_GG':\n  case 'en-GG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_GG;\n    break;\n  case 'en_GH':\n  case 'en-GH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_GH;\n    break;\n  case 'en_GI':\n  case 'en-GI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_GI;\n    break;\n  case 'en_GM':\n  case 'en-GM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_GM;\n    break;\n  case 'en_GU':\n  case 'en-GU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_GU;\n    break;\n  case 'en_GY':\n  case 'en-GY':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_GY;\n    break;\n  case 'en_HK':\n  case 'en-HK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_HK;\n    break;\n  case 'en_IL':\n  case 'en-IL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_IL;\n    break;\n  case 'en_IM':\n  case 'en-IM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_IM;\n    break;\n  case 'en_IO':\n  case 'en-IO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_IO;\n    break;\n  case 'en_JE':\n  case 'en-JE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_JE;\n    break;\n  case 'en_JM':\n  case 'en-JM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_JM;\n    break;\n  case 'en_KE':\n  case 'en-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_KE;\n    break;\n  case 'en_KI':\n  case 'en-KI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_KI;\n    break;\n  case 'en_KN':\n  case 'en-KN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_KN;\n    break;\n  case 'en_KY':\n  case 'en-KY':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_KY;\n    break;\n  case 'en_LC':\n  case 'en-LC':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_LC;\n    break;\n  case 'en_LR':\n  case 'en-LR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_LR;\n    break;\n  case 'en_LS':\n  case 'en-LS':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_LS;\n    break;\n  case 'en_MG':\n  case 'en-MG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_MG;\n    break;\n  case 'en_MH':\n  case 'en-MH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_MH;\n    break;\n  case 'en_MO':\n  case 'en-MO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_MO;\n    break;\n  case 'en_MP':\n  case 'en-MP':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_MP;\n    break;\n  case 'en_MS':\n  case 'en-MS':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_MS;\n    break;\n  case 'en_MT':\n  case 'en-MT':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_MT;\n    break;\n  case 'en_MU':\n  case 'en-MU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_MU;\n    break;\n  case 'en_MW':\n  case 'en-MW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_MW;\n    break;\n  case 'en_MY':\n  case 'en-MY':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_MY;\n    break;\n  case 'en_NA':\n  case 'en-NA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_NA;\n    break;\n  case 'en_NF':\n  case 'en-NF':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_NF;\n    break;\n  case 'en_NG':\n  case 'en-NG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_NG;\n    break;\n  case 'en_NL':\n  case 'en-NL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_NL;\n    break;\n  case 'en_NR':\n  case 'en-NR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_NR;\n    break;\n  case 'en_NU':\n  case 'en-NU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_NU;\n    break;\n  case 'en_NZ':\n  case 'en-NZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_NZ;\n    break;\n  case 'en_PG':\n  case 'en-PG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_PG;\n    break;\n  case 'en_PH':\n  case 'en-PH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_PH;\n    break;\n  case 'en_PK':\n  case 'en-PK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_PK;\n    break;\n  case 'en_PN':\n  case 'en-PN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_PN;\n    break;\n  case 'en_PR':\n  case 'en-PR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_PR;\n    break;\n  case 'en_PW':\n  case 'en-PW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_PW;\n    break;\n  case 'en_RW':\n  case 'en-RW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_RW;\n    break;\n  case 'en_SB':\n  case 'en-SB':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_SB;\n    break;\n  case 'en_SC':\n  case 'en-SC':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_SC;\n    break;\n  case 'en_SD':\n  case 'en-SD':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_SD;\n    break;\n  case 'en_SE':\n  case 'en-SE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_SE;\n    break;\n  case 'en_SH':\n  case 'en-SH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_SH;\n    break;\n  case 'en_SI':\n  case 'en-SI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_SI;\n    break;\n  case 'en_SL':\n  case 'en-SL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_SL;\n    break;\n  case 'en_SS':\n  case 'en-SS':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_SS;\n    break;\n  case 'en_SX':\n  case 'en-SX':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_SX;\n    break;\n  case 'en_SZ':\n  case 'en-SZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_SZ;\n    break;\n  case 'en_TC':\n  case 'en-TC':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_TC;\n    break;\n  case 'en_TK':\n  case 'en-TK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_TK;\n    break;\n  case 'en_TO':\n  case 'en-TO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_TO;\n    break;\n  case 'en_TT':\n  case 'en-TT':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_TT;\n    break;\n  case 'en_TV':\n  case 'en-TV':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_TV;\n    break;\n  case 'en_TZ':\n  case 'en-TZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_TZ;\n    break;\n  case 'en_UG':\n  case 'en-UG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_UG;\n    break;\n  case 'en_UM':\n  case 'en-UM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_UM;\n    break;\n  case 'en_US_POSIX':\n  case 'en-US-POSIX':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_US_POSIX;\n    break;\n  case 'en_VC':\n  case 'en-VC':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_VC;\n    break;\n  case 'en_VG':\n  case 'en-VG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_VG;\n    break;\n  case 'en_VI':\n  case 'en-VI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_VI;\n    break;\n  case 'en_VU':\n  case 'en-VU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_VU;\n    break;\n  case 'en_WS':\n  case 'en-WS':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_WS;\n    break;\n  case 'en_XA':\n  case 'en-XA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_XA;\n    break;\n  case 'en_ZM':\n  case 'en-ZM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_ZM;\n    break;\n  case 'en_ZW':\n  case 'en-ZW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_en_ZW;\n    break;\n  case 'eo':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_eo;\n    break;\n  case 'eo_001':\n  case 'eo-001':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_eo_001;\n    break;\n  case 'es_AR':\n  case 'es-AR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_AR;\n    break;\n  case 'es_BO':\n  case 'es-BO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_BO;\n    break;\n  case 'es_BR':\n  case 'es-BR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_BR;\n    break;\n  case 'es_BZ':\n  case 'es-BZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_BZ;\n    break;\n  case 'es_CL':\n  case 'es-CL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_CL;\n    break;\n  case 'es_CO':\n  case 'es-CO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_CO;\n    break;\n  case 'es_CR':\n  case 'es-CR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_CR;\n    break;\n  case 'es_CU':\n  case 'es-CU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_CU;\n    break;\n  case 'es_DO':\n  case 'es-DO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_DO;\n    break;\n  case 'es_EA':\n  case 'es-EA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_EA;\n    break;\n  case 'es_EC':\n  case 'es-EC':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_EC;\n    break;\n  case 'es_GQ':\n  case 'es-GQ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_GQ;\n    break;\n  case 'es_GT':\n  case 'es-GT':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_GT;\n    break;\n  case 'es_HN':\n  case 'es-HN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_HN;\n    break;\n  case 'es_IC':\n  case 'es-IC':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_IC;\n    break;\n  case 'es_NI':\n  case 'es-NI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_NI;\n    break;\n  case 'es_PA':\n  case 'es-PA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_PA;\n    break;\n  case 'es_PE':\n  case 'es-PE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_PE;\n    break;\n  case 'es_PH':\n  case 'es-PH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_PH;\n    break;\n  case 'es_PR':\n  case 'es-PR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_PR;\n    break;\n  case 'es_PY':\n  case 'es-PY':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_PY;\n    break;\n  case 'es_SV':\n  case 'es-SV':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_SV;\n    break;\n  case 'es_UY':\n  case 'es-UY':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_UY;\n    break;\n  case 'es_VE':\n  case 'es-VE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_es_VE;\n    break;\n  case 'et_EE':\n  case 'et-EE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_et_EE;\n    break;\n  case 'eu_ES':\n  case 'eu-ES':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_eu_ES;\n    break;\n  case 'ewo':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ewo;\n    break;\n  case 'ewo_CM':\n  case 'ewo-CM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ewo_CM;\n    break;\n  case 'fa_AF':\n  case 'fa-AF':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fa_AF;\n    break;\n  case 'fa_IR':\n  case 'fa-IR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fa_IR;\n    break;\n  case 'ff':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ff;\n    break;\n  case 'ff_Latn':\n  case 'ff-Latn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ff_Latn;\n    break;\n  case 'ff_Latn_BF':\n  case 'ff-Latn-BF':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ff_Latn_BF;\n    break;\n  case 'ff_Latn_CM':\n  case 'ff-Latn-CM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ff_Latn_CM;\n    break;\n  case 'ff_Latn_GH':\n  case 'ff-Latn-GH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ff_Latn_GH;\n    break;\n  case 'ff_Latn_GM':\n  case 'ff-Latn-GM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ff_Latn_GM;\n    break;\n  case 'ff_Latn_GN':\n  case 'ff-Latn-GN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ff_Latn_GN;\n    break;\n  case 'ff_Latn_GW':\n  case 'ff-Latn-GW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ff_Latn_GW;\n    break;\n  case 'ff_Latn_LR':\n  case 'ff-Latn-LR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ff_Latn_LR;\n    break;\n  case 'ff_Latn_MR':\n  case 'ff-Latn-MR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ff_Latn_MR;\n    break;\n  case 'ff_Latn_NE':\n  case 'ff-Latn-NE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ff_Latn_NE;\n    break;\n  case 'ff_Latn_NG':\n  case 'ff-Latn-NG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ff_Latn_NG;\n    break;\n  case 'ff_Latn_SL':\n  case 'ff-Latn-SL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ff_Latn_SL;\n    break;\n  case 'ff_Latn_SN':\n  case 'ff-Latn-SN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ff_Latn_SN;\n    break;\n  case 'fi_FI':\n  case 'fi-FI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fi_FI;\n    break;\n  case 'fil_PH':\n  case 'fil-PH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fil_PH;\n    break;\n  case 'fo':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fo;\n    break;\n  case 'fo_DK':\n  case 'fo-DK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fo_DK;\n    break;\n  case 'fo_FO':\n  case 'fo-FO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fo_FO;\n    break;\n  case 'fr_BE':\n  case 'fr-BE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_BE;\n    break;\n  case 'fr_BF':\n  case 'fr-BF':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_BF;\n    break;\n  case 'fr_BI':\n  case 'fr-BI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_BI;\n    break;\n  case 'fr_BJ':\n  case 'fr-BJ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_BJ;\n    break;\n  case 'fr_BL':\n  case 'fr-BL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_BL;\n    break;\n  case 'fr_CD':\n  case 'fr-CD':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_CD;\n    break;\n  case 'fr_CF':\n  case 'fr-CF':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_CF;\n    break;\n  case 'fr_CG':\n  case 'fr-CG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_CG;\n    break;\n  case 'fr_CH':\n  case 'fr-CH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_CH;\n    break;\n  case 'fr_CI':\n  case 'fr-CI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_CI;\n    break;\n  case 'fr_CM':\n  case 'fr-CM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_CM;\n    break;\n  case 'fr_DJ':\n  case 'fr-DJ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_DJ;\n    break;\n  case 'fr_DZ':\n  case 'fr-DZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_DZ;\n    break;\n  case 'fr_FR':\n  case 'fr-FR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_FR;\n    break;\n  case 'fr_GA':\n  case 'fr-GA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_GA;\n    break;\n  case 'fr_GF':\n  case 'fr-GF':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_GF;\n    break;\n  case 'fr_GN':\n  case 'fr-GN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_GN;\n    break;\n  case 'fr_GP':\n  case 'fr-GP':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_GP;\n    break;\n  case 'fr_GQ':\n  case 'fr-GQ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_GQ;\n    break;\n  case 'fr_HT':\n  case 'fr-HT':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_HT;\n    break;\n  case 'fr_KM':\n  case 'fr-KM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_KM;\n    break;\n  case 'fr_LU':\n  case 'fr-LU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_LU;\n    break;\n  case 'fr_MA':\n  case 'fr-MA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_MA;\n    break;\n  case 'fr_MC':\n  case 'fr-MC':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_MC;\n    break;\n  case 'fr_MF':\n  case 'fr-MF':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_MF;\n    break;\n  case 'fr_MG':\n  case 'fr-MG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_MG;\n    break;\n  case 'fr_ML':\n  case 'fr-ML':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_ML;\n    break;\n  case 'fr_MQ':\n  case 'fr-MQ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_MQ;\n    break;\n  case 'fr_MR':\n  case 'fr-MR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_MR;\n    break;\n  case 'fr_MU':\n  case 'fr-MU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_MU;\n    break;\n  case 'fr_NC':\n  case 'fr-NC':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_NC;\n    break;\n  case 'fr_NE':\n  case 'fr-NE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_NE;\n    break;\n  case 'fr_PF':\n  case 'fr-PF':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_PF;\n    break;\n  case 'fr_PM':\n  case 'fr-PM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_PM;\n    break;\n  case 'fr_RE':\n  case 'fr-RE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_RE;\n    break;\n  case 'fr_RW':\n  case 'fr-RW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_RW;\n    break;\n  case 'fr_SC':\n  case 'fr-SC':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_SC;\n    break;\n  case 'fr_SN':\n  case 'fr-SN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_SN;\n    break;\n  case 'fr_SY':\n  case 'fr-SY':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_SY;\n    break;\n  case 'fr_TD':\n  case 'fr-TD':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_TD;\n    break;\n  case 'fr_TG':\n  case 'fr-TG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_TG;\n    break;\n  case 'fr_TN':\n  case 'fr-TN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_TN;\n    break;\n  case 'fr_VU':\n  case 'fr-VU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_VU;\n    break;\n  case 'fr_WF':\n  case 'fr-WF':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_WF;\n    break;\n  case 'fr_YT':\n  case 'fr-YT':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fr_YT;\n    break;\n  case 'fur':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fur;\n    break;\n  case 'fur_IT':\n  case 'fur-IT':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fur_IT;\n    break;\n  case 'fy':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fy;\n    break;\n  case 'fy_NL':\n  case 'fy-NL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_fy_NL;\n    break;\n  case 'ga_IE':\n  case 'ga-IE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ga_IE;\n    break;\n  case 'gd':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_gd;\n    break;\n  case 'gd_GB':\n  case 'gd-GB':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_gd_GB;\n    break;\n  case 'gl_ES':\n  case 'gl-ES':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_gl_ES;\n    break;\n  case 'gsw_CH':\n  case 'gsw-CH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_gsw_CH;\n    break;\n  case 'gsw_FR':\n  case 'gsw-FR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_gsw_FR;\n    break;\n  case 'gsw_LI':\n  case 'gsw-LI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_gsw_LI;\n    break;\n  case 'gu_IN':\n  case 'gu-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_gu_IN;\n    break;\n  case 'guz':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_guz;\n    break;\n  case 'guz_KE':\n  case 'guz-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_guz_KE;\n    break;\n  case 'gv':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_gv;\n    break;\n  case 'gv_IM':\n  case 'gv-IM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_gv_IM;\n    break;\n  case 'ha':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ha;\n    break;\n  case 'ha_GH':\n  case 'ha-GH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ha_GH;\n    break;\n  case 'ha_NE':\n  case 'ha-NE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ha_NE;\n    break;\n  case 'ha_NG':\n  case 'ha-NG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ha_NG;\n    break;\n  case 'haw_US':\n  case 'haw-US':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_haw_US;\n    break;\n  case 'he_IL':\n  case 'he-IL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_he_IL;\n    break;\n  case 'hi_IN':\n  case 'hi-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_hi_IN;\n    break;\n  case 'hr_BA':\n  case 'hr-BA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_hr_BA;\n    break;\n  case 'hr_HR':\n  case 'hr-HR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_hr_HR;\n    break;\n  case 'hsb':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_hsb;\n    break;\n  case 'hsb_DE':\n  case 'hsb-DE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_hsb_DE;\n    break;\n  case 'hu_HU':\n  case 'hu-HU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_hu_HU;\n    break;\n  case 'hy_AM':\n  case 'hy-AM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_hy_AM;\n    break;\n  case 'ia':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ia;\n    break;\n  case 'ia_001':\n  case 'ia-001':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ia_001;\n    break;\n  case 'id_ID':\n  case 'id-ID':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_id_ID;\n    break;\n  case 'ig':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ig;\n    break;\n  case 'ig_NG':\n  case 'ig-NG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ig_NG;\n    break;\n  case 'ii':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ii;\n    break;\n  case 'ii_CN':\n  case 'ii-CN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ii_CN;\n    break;\n  case 'is_IS':\n  case 'is-IS':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_is_IS;\n    break;\n  case 'it_CH':\n  case 'it-CH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_it_CH;\n    break;\n  case 'it_IT':\n  case 'it-IT':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_it_IT;\n    break;\n  case 'it_SM':\n  case 'it-SM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_it_SM;\n    break;\n  case 'it_VA':\n  case 'it-VA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_it_VA;\n    break;\n  case 'ja_JP':\n  case 'ja-JP':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ja_JP;\n    break;\n  case 'jgo':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_jgo;\n    break;\n  case 'jgo_CM':\n  case 'jgo-CM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_jgo_CM;\n    break;\n  case 'jmc':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_jmc;\n    break;\n  case 'jmc_TZ':\n  case 'jmc-TZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_jmc_TZ;\n    break;\n  case 'jv':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_jv;\n    break;\n  case 'jv_ID':\n  case 'jv-ID':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_jv_ID;\n    break;\n  case 'ka_GE':\n  case 'ka-GE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ka_GE;\n    break;\n  case 'kab':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kab;\n    break;\n  case 'kab_DZ':\n  case 'kab-DZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kab_DZ;\n    break;\n  case 'kam':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kam;\n    break;\n  case 'kam_KE':\n  case 'kam-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kam_KE;\n    break;\n  case 'kde':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kde;\n    break;\n  case 'kde_TZ':\n  case 'kde-TZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kde_TZ;\n    break;\n  case 'kea':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kea;\n    break;\n  case 'kea_CV':\n  case 'kea-CV':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kea_CV;\n    break;\n  case 'khq':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_khq;\n    break;\n  case 'khq_ML':\n  case 'khq-ML':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_khq_ML;\n    break;\n  case 'ki':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ki;\n    break;\n  case 'ki_KE':\n  case 'ki-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ki_KE;\n    break;\n  case 'kk_KZ':\n  case 'kk-KZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kk_KZ;\n    break;\n  case 'kkj':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kkj;\n    break;\n  case 'kkj_CM':\n  case 'kkj-CM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kkj_CM;\n    break;\n  case 'kl':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kl;\n    break;\n  case 'kl_GL':\n  case 'kl-GL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kl_GL;\n    break;\n  case 'kln':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kln;\n    break;\n  case 'kln_KE':\n  case 'kln-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kln_KE;\n    break;\n  case 'km_KH':\n  case 'km-KH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_km_KH;\n    break;\n  case 'kn_IN':\n  case 'kn-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kn_IN;\n    break;\n  case 'ko_KP':\n  case 'ko-KP':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ko_KP;\n    break;\n  case 'ko_KR':\n  case 'ko-KR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ko_KR;\n    break;\n  case 'kok':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kok;\n    break;\n  case 'kok_IN':\n  case 'kok-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kok_IN;\n    break;\n  case 'ks':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ks;\n    break;\n  case 'ks_IN':\n  case 'ks-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ks_IN;\n    break;\n  case 'ksb':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ksb;\n    break;\n  case 'ksb_TZ':\n  case 'ksb-TZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ksb_TZ;\n    break;\n  case 'ksf':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ksf;\n    break;\n  case 'ksf_CM':\n  case 'ksf-CM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ksf_CM;\n    break;\n  case 'ksh':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ksh;\n    break;\n  case 'ksh_DE':\n  case 'ksh-DE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ksh_DE;\n    break;\n  case 'ku':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ku;\n    break;\n  case 'ku_TR':\n  case 'ku-TR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ku_TR;\n    break;\n  case 'kw':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kw;\n    break;\n  case 'kw_GB':\n  case 'kw-GB':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_kw_GB;\n    break;\n  case 'ky_KG':\n  case 'ky-KG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ky_KG;\n    break;\n  case 'lag':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lag;\n    break;\n  case 'lag_TZ':\n  case 'lag-TZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lag_TZ;\n    break;\n  case 'lb':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lb;\n    break;\n  case 'lb_LU':\n  case 'lb-LU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lb_LU;\n    break;\n  case 'lg':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lg;\n    break;\n  case 'lg_UG':\n  case 'lg-UG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lg_UG;\n    break;\n  case 'lkt':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lkt;\n    break;\n  case 'lkt_US':\n  case 'lkt-US':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lkt_US;\n    break;\n  case 'ln_AO':\n  case 'ln-AO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ln_AO;\n    break;\n  case 'ln_CD':\n  case 'ln-CD':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ln_CD;\n    break;\n  case 'ln_CF':\n  case 'ln-CF':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ln_CF;\n    break;\n  case 'ln_CG':\n  case 'ln-CG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ln_CG;\n    break;\n  case 'lo_LA':\n  case 'lo-LA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lo_LA;\n    break;\n  case 'lrc':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lrc;\n    break;\n  case 'lrc_IQ':\n  case 'lrc-IQ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lrc_IQ;\n    break;\n  case 'lrc_IR':\n  case 'lrc-IR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lrc_IR;\n    break;\n  case 'lt_LT':\n  case 'lt-LT':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lt_LT;\n    break;\n  case 'lu':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lu;\n    break;\n  case 'lu_CD':\n  case 'lu-CD':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lu_CD;\n    break;\n  case 'luo':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_luo;\n    break;\n  case 'luo_KE':\n  case 'luo-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_luo_KE;\n    break;\n  case 'luy':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_luy;\n    break;\n  case 'luy_KE':\n  case 'luy-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_luy_KE;\n    break;\n  case 'lv_LV':\n  case 'lv-LV':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_lv_LV;\n    break;\n  case 'mas':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mas;\n    break;\n  case 'mas_KE':\n  case 'mas-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mas_KE;\n    break;\n  case 'mas_TZ':\n  case 'mas-TZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mas_TZ;\n    break;\n  case 'mer':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mer;\n    break;\n  case 'mer_KE':\n  case 'mer-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mer_KE;\n    break;\n  case 'mfe':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mfe;\n    break;\n  case 'mfe_MU':\n  case 'mfe-MU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mfe_MU;\n    break;\n  case 'mg':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mg;\n    break;\n  case 'mg_MG':\n  case 'mg-MG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mg_MG;\n    break;\n  case 'mgh':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mgh;\n    break;\n  case 'mgh_MZ':\n  case 'mgh-MZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mgh_MZ;\n    break;\n  case 'mgo':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mgo;\n    break;\n  case 'mgo_CM':\n  case 'mgo-CM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mgo_CM;\n    break;\n  case 'mi':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mi;\n    break;\n  case 'mi_NZ':\n  case 'mi-NZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mi_NZ;\n    break;\n  case 'mk_MK':\n  case 'mk-MK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mk_MK;\n    break;\n  case 'ml_IN':\n  case 'ml-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ml_IN;\n    break;\n  case 'mn_MN':\n  case 'mn-MN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mn_MN;\n    break;\n  case 'mr_IN':\n  case 'mr-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mr_IN;\n    break;\n  case 'ms_BN':\n  case 'ms-BN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ms_BN;\n    break;\n  case 'ms_MY':\n  case 'ms-MY':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ms_MY;\n    break;\n  case 'ms_SG':\n  case 'ms-SG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ms_SG;\n    break;\n  case 'mt_MT':\n  case 'mt-MT':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mt_MT;\n    break;\n  case 'mua':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mua;\n    break;\n  case 'mua_CM':\n  case 'mua-CM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mua_CM;\n    break;\n  case 'my_MM':\n  case 'my-MM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_my_MM;\n    break;\n  case 'mzn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mzn;\n    break;\n  case 'mzn_IR':\n  case 'mzn-IR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_mzn_IR;\n    break;\n  case 'naq':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_naq;\n    break;\n  case 'naq_NA':\n  case 'naq-NA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_naq_NA;\n    break;\n  case 'nb_NO':\n  case 'nb-NO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nb_NO;\n    break;\n  case 'nb_SJ':\n  case 'nb-SJ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nb_SJ;\n    break;\n  case 'nd':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nd;\n    break;\n  case 'nd_ZW':\n  case 'nd-ZW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nd_ZW;\n    break;\n  case 'nds':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nds;\n    break;\n  case 'nds_DE':\n  case 'nds-DE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nds_DE;\n    break;\n  case 'nds_NL':\n  case 'nds-NL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nds_NL;\n    break;\n  case 'ne_IN':\n  case 'ne-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ne_IN;\n    break;\n  case 'ne_NP':\n  case 'ne-NP':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ne_NP;\n    break;\n  case 'nl_AW':\n  case 'nl-AW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nl_AW;\n    break;\n  case 'nl_BE':\n  case 'nl-BE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nl_BE;\n    break;\n  case 'nl_BQ':\n  case 'nl-BQ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nl_BQ;\n    break;\n  case 'nl_CW':\n  case 'nl-CW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nl_CW;\n    break;\n  case 'nl_NL':\n  case 'nl-NL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nl_NL;\n    break;\n  case 'nl_SR':\n  case 'nl-SR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nl_SR;\n    break;\n  case 'nl_SX':\n  case 'nl-SX':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nl_SX;\n    break;\n  case 'nmg':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nmg;\n    break;\n  case 'nmg_CM':\n  case 'nmg-CM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nmg_CM;\n    break;\n  case 'nn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nn;\n    break;\n  case 'nn_NO':\n  case 'nn-NO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nn_NO;\n    break;\n  case 'nnh':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nnh;\n    break;\n  case 'nnh_CM':\n  case 'nnh-CM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nnh_CM;\n    break;\n  case 'nus':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nus;\n    break;\n  case 'nus_SS':\n  case 'nus-SS':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nus_SS;\n    break;\n  case 'nyn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nyn;\n    break;\n  case 'nyn_UG':\n  case 'nyn-UG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_nyn_UG;\n    break;\n  case 'om':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_om;\n    break;\n  case 'om_ET':\n  case 'om-ET':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_om_ET;\n    break;\n  case 'om_KE':\n  case 'om-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_om_KE;\n    break;\n  case 'or_IN':\n  case 'or-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_or_IN;\n    break;\n  case 'os':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_os;\n    break;\n  case 'os_GE':\n  case 'os-GE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_os_GE;\n    break;\n  case 'os_RU':\n  case 'os-RU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_os_RU;\n    break;\n  case 'pa_Arab':\n  case 'pa-Arab':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pa_Arab;\n    break;\n  case 'pa_Arab_PK':\n  case 'pa-Arab-PK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pa_Arab_PK;\n    break;\n  case 'pa_Guru':\n  case 'pa-Guru':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pa_Guru;\n    break;\n  case 'pa_Guru_IN':\n  case 'pa-Guru-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pa_Guru_IN;\n    break;\n  case 'pl_PL':\n  case 'pl-PL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pl_PL;\n    break;\n  case 'ps':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ps;\n    break;\n  case 'ps_AF':\n  case 'ps-AF':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ps_AF;\n    break;\n  case 'ps_PK':\n  case 'ps-PK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ps_PK;\n    break;\n  case 'pt_AO':\n  case 'pt-AO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pt_AO;\n    break;\n  case 'pt_CH':\n  case 'pt-CH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pt_CH;\n    break;\n  case 'pt_CV':\n  case 'pt-CV':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pt_CV;\n    break;\n  case 'pt_GQ':\n  case 'pt-GQ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pt_GQ;\n    break;\n  case 'pt_GW':\n  case 'pt-GW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pt_GW;\n    break;\n  case 'pt_LU':\n  case 'pt-LU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pt_LU;\n    break;\n  case 'pt_MO':\n  case 'pt-MO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pt_MO;\n    break;\n  case 'pt_MZ':\n  case 'pt-MZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pt_MZ;\n    break;\n  case 'pt_ST':\n  case 'pt-ST':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pt_ST;\n    break;\n  case 'pt_TL':\n  case 'pt-TL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_pt_TL;\n    break;\n  case 'qu':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_qu;\n    break;\n  case 'qu_BO':\n  case 'qu-BO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_qu_BO;\n    break;\n  case 'qu_EC':\n  case 'qu-EC':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_qu_EC;\n    break;\n  case 'qu_PE':\n  case 'qu-PE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_qu_PE;\n    break;\n  case 'rm':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_rm;\n    break;\n  case 'rm_CH':\n  case 'rm-CH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_rm_CH;\n    break;\n  case 'rn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_rn;\n    break;\n  case 'rn_BI':\n  case 'rn-BI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_rn_BI;\n    break;\n  case 'ro_MD':\n  case 'ro-MD':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ro_MD;\n    break;\n  case 'ro_RO':\n  case 'ro-RO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ro_RO;\n    break;\n  case 'rof':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_rof;\n    break;\n  case 'rof_TZ':\n  case 'rof-TZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_rof_TZ;\n    break;\n  case 'ru_BY':\n  case 'ru-BY':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ru_BY;\n    break;\n  case 'ru_KG':\n  case 'ru-KG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ru_KG;\n    break;\n  case 'ru_KZ':\n  case 'ru-KZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ru_KZ;\n    break;\n  case 'ru_MD':\n  case 'ru-MD':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ru_MD;\n    break;\n  case 'ru_RU':\n  case 'ru-RU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ru_RU;\n    break;\n  case 'ru_UA':\n  case 'ru-UA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ru_UA;\n    break;\n  case 'rw':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_rw;\n    break;\n  case 'rw_RW':\n  case 'rw-RW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_rw_RW;\n    break;\n  case 'rwk':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_rwk;\n    break;\n  case 'rwk_TZ':\n  case 'rwk-TZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_rwk_TZ;\n    break;\n  case 'sah':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sah;\n    break;\n  case 'sah_RU':\n  case 'sah-RU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sah_RU;\n    break;\n  case 'saq':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_saq;\n    break;\n  case 'saq_KE':\n  case 'saq-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_saq_KE;\n    break;\n  case 'sbp':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sbp;\n    break;\n  case 'sbp_TZ':\n  case 'sbp-TZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sbp_TZ;\n    break;\n  case 'sd':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sd;\n    break;\n  case 'sd_PK':\n  case 'sd-PK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sd_PK;\n    break;\n  case 'se':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_se;\n    break;\n  case 'se_FI':\n  case 'se-FI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_se_FI;\n    break;\n  case 'se_NO':\n  case 'se-NO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_se_NO;\n    break;\n  case 'se_SE':\n  case 'se-SE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_se_SE;\n    break;\n  case 'seh':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_seh;\n    break;\n  case 'seh_MZ':\n  case 'seh-MZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_seh_MZ;\n    break;\n  case 'ses':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ses;\n    break;\n  case 'ses_ML':\n  case 'ses-ML':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ses_ML;\n    break;\n  case 'sg':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sg;\n    break;\n  case 'sg_CF':\n  case 'sg-CF':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sg_CF;\n    break;\n  case 'shi':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_shi;\n    break;\n  case 'shi_Latn':\n  case 'shi-Latn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_shi_Latn;\n    break;\n  case 'shi_Latn_MA':\n  case 'shi-Latn-MA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_shi_Latn_MA;\n    break;\n  case 'shi_Tfng':\n  case 'shi-Tfng':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_shi_Tfng;\n    break;\n  case 'shi_Tfng_MA':\n  case 'shi-Tfng-MA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_shi_Tfng_MA;\n    break;\n  case 'si_LK':\n  case 'si-LK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_si_LK;\n    break;\n  case 'sk_SK':\n  case 'sk-SK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sk_SK;\n    break;\n  case 'sl_SI':\n  case 'sl-SI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sl_SI;\n    break;\n  case 'smn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_smn;\n    break;\n  case 'smn_FI':\n  case 'smn-FI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_smn_FI;\n    break;\n  case 'sn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sn;\n    break;\n  case 'sn_ZW':\n  case 'sn-ZW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sn_ZW;\n    break;\n  case 'so':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_so;\n    break;\n  case 'so_DJ':\n  case 'so-DJ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_so_DJ;\n    break;\n  case 'so_ET':\n  case 'so-ET':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_so_ET;\n    break;\n  case 'so_KE':\n  case 'so-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_so_KE;\n    break;\n  case 'so_SO':\n  case 'so-SO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_so_SO;\n    break;\n  case 'sq_AL':\n  case 'sq-AL':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sq_AL;\n    break;\n  case 'sq_MK':\n  case 'sq-MK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sq_MK;\n    break;\n  case 'sq_XK':\n  case 'sq-XK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sq_XK;\n    break;\n  case 'sr_Cyrl':\n  case 'sr-Cyrl':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sr_Cyrl;\n    break;\n  case 'sr_Cyrl_BA':\n  case 'sr-Cyrl-BA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sr_Cyrl_BA;\n    break;\n  case 'sr_Cyrl_ME':\n  case 'sr-Cyrl-ME':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sr_Cyrl_ME;\n    break;\n  case 'sr_Cyrl_RS':\n  case 'sr-Cyrl-RS':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sr_Cyrl_RS;\n    break;\n  case 'sr_Cyrl_XK':\n  case 'sr-Cyrl-XK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sr_Cyrl_XK;\n    break;\n  case 'sr_Latn_BA':\n  case 'sr-Latn-BA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sr_Latn_BA;\n    break;\n  case 'sr_Latn_ME':\n  case 'sr-Latn-ME':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sr_Latn_ME;\n    break;\n  case 'sr_Latn_RS':\n  case 'sr-Latn-RS':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sr_Latn_RS;\n    break;\n  case 'sr_Latn_XK':\n  case 'sr-Latn-XK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sr_Latn_XK;\n    break;\n  case 'sv_AX':\n  case 'sv-AX':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sv_AX;\n    break;\n  case 'sv_FI':\n  case 'sv-FI':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sv_FI;\n    break;\n  case 'sv_SE':\n  case 'sv-SE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sv_SE;\n    break;\n  case 'sw_CD':\n  case 'sw-CD':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sw_CD;\n    break;\n  case 'sw_KE':\n  case 'sw-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sw_KE;\n    break;\n  case 'sw_TZ':\n  case 'sw-TZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sw_TZ;\n    break;\n  case 'sw_UG':\n  case 'sw-UG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_sw_UG;\n    break;\n  case 'ta_IN':\n  case 'ta-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ta_IN;\n    break;\n  case 'ta_LK':\n  case 'ta-LK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ta_LK;\n    break;\n  case 'ta_MY':\n  case 'ta-MY':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ta_MY;\n    break;\n  case 'ta_SG':\n  case 'ta-SG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ta_SG;\n    break;\n  case 'te_IN':\n  case 'te-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_te_IN;\n    break;\n  case 'teo':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_teo;\n    break;\n  case 'teo_KE':\n  case 'teo-KE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_teo_KE;\n    break;\n  case 'teo_UG':\n  case 'teo-UG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_teo_UG;\n    break;\n  case 'tg':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_tg;\n    break;\n  case 'tg_TJ':\n  case 'tg-TJ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_tg_TJ;\n    break;\n  case 'th_TH':\n  case 'th-TH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_th_TH;\n    break;\n  case 'ti':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ti;\n    break;\n  case 'ti_ER':\n  case 'ti-ER':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ti_ER;\n    break;\n  case 'ti_ET':\n  case 'ti-ET':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ti_ET;\n    break;\n  case 'tk':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_tk;\n    break;\n  case 'tk_TM':\n  case 'tk-TM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_tk_TM;\n    break;\n  case 'to':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_to;\n    break;\n  case 'to_TO':\n  case 'to-TO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_to_TO;\n    break;\n  case 'tr_CY':\n  case 'tr-CY':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_tr_CY;\n    break;\n  case 'tr_TR':\n  case 'tr-TR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_tr_TR;\n    break;\n  case 'tt':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_tt;\n    break;\n  case 'tt_RU':\n  case 'tt-RU':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_tt_RU;\n    break;\n  case 'twq':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_twq;\n    break;\n  case 'twq_NE':\n  case 'twq-NE':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_twq_NE;\n    break;\n  case 'tzm':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_tzm;\n    break;\n  case 'tzm_MA':\n  case 'tzm-MA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_tzm_MA;\n    break;\n  case 'ug':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ug;\n    break;\n  case 'ug_CN':\n  case 'ug-CN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ug_CN;\n    break;\n  case 'uk_UA':\n  case 'uk-UA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_uk_UA;\n    break;\n  case 'ur_IN':\n  case 'ur-IN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ur_IN;\n    break;\n  case 'ur_PK':\n  case 'ur-PK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_ur_PK;\n    break;\n  case 'uz_Arab':\n  case 'uz-Arab':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_uz_Arab;\n    break;\n  case 'uz_Arab_AF':\n  case 'uz-Arab-AF':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_uz_Arab_AF;\n    break;\n  case 'uz_Cyrl':\n  case 'uz-Cyrl':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_uz_Cyrl;\n    break;\n  case 'uz_Cyrl_UZ':\n  case 'uz-Cyrl-UZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_uz_Cyrl_UZ;\n    break;\n  case 'uz_Latn':\n  case 'uz-Latn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_uz_Latn;\n    break;\n  case 'uz_Latn_UZ':\n  case 'uz-Latn-UZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_uz_Latn_UZ;\n    break;\n  case 'vai':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_vai;\n    break;\n  case 'vai_Latn':\n  case 'vai-Latn':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_vai_Latn;\n    break;\n  case 'vai_Latn_LR':\n  case 'vai-Latn-LR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_vai_Latn_LR;\n    break;\n  case 'vai_Vaii':\n  case 'vai-Vaii':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_vai_Vaii;\n    break;\n  case 'vai_Vaii_LR':\n  case 'vai-Vaii-LR':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_vai_Vaii_LR;\n    break;\n  case 'vi_VN':\n  case 'vi-VN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_vi_VN;\n    break;\n  case 'vun':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_vun;\n    break;\n  case 'vun_TZ':\n  case 'vun-TZ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_vun_TZ;\n    break;\n  case 'wae':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_wae;\n    break;\n  case 'wae_CH':\n  case 'wae-CH':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_wae_CH;\n    break;\n  case 'wo':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_wo;\n    break;\n  case 'wo_SN':\n  case 'wo-SN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_wo_SN;\n    break;\n  case 'xh':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_xh;\n    break;\n  case 'xh_ZA':\n  case 'xh-ZA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_xh_ZA;\n    break;\n  case 'xog':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_xog;\n    break;\n  case 'xog_UG':\n  case 'xog-UG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_xog_UG;\n    break;\n  case 'yav':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_yav;\n    break;\n  case 'yav_CM':\n  case 'yav-CM':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_yav_CM;\n    break;\n  case 'yi':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_yi;\n    break;\n  case 'yi_001':\n  case 'yi-001':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_yi_001;\n    break;\n  case 'yo':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_yo;\n    break;\n  case 'yo_BJ':\n  case 'yo-BJ':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_yo_BJ;\n    break;\n  case 'yo_NG':\n  case 'yo-NG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_yo_NG;\n    break;\n  case 'yue':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_yue;\n    break;\n  case 'yue_Hans':\n  case 'yue-Hans':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_yue_Hans;\n    break;\n  case 'yue_Hans_CN':\n  case 'yue-Hans-CN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_yue_Hans_CN;\n    break;\n  case 'yue_Hant':\n  case 'yue-Hant':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_yue_Hant;\n    break;\n  case 'yue_Hant_HK':\n  case 'yue-Hant-HK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_yue_Hant_HK;\n    break;\n  case 'zgh':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zgh;\n    break;\n  case 'zgh_MA':\n  case 'zgh-MA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zgh_MA;\n    break;\n  case 'zh_Hans':\n  case 'zh-Hans':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zh_Hans;\n    break;\n  case 'zh_Hans_CN':\n  case 'zh-Hans-CN':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zh_Hans_CN;\n    break;\n  case 'zh_Hans_HK':\n  case 'zh-Hans-HK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zh_Hans_HK;\n    break;\n  case 'zh_Hans_MO':\n  case 'zh-Hans-MO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zh_Hans_MO;\n    break;\n  case 'zh_Hans_SG':\n  case 'zh-Hans-SG':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zh_Hans_SG;\n    break;\n  case 'zh_Hant':\n  case 'zh-Hant':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zh_Hant;\n    break;\n  case 'zh_Hant_HK':\n  case 'zh-Hant-HK':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zh_Hant_HK;\n    break;\n  case 'zh_Hant_MO':\n  case 'zh-Hant-MO':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zh_Hant_MO;\n    break;\n  case 'zh_Hant_TW':\n  case 'zh-Hant-TW':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zh_Hant_TW;\n    break;\n  case 'zu_ZA':\n  case 'zu-ZA':\n    goog.i18n.DateTimeSymbols = goog.i18n.DateTimeSymbols_zu_ZA;\n    break;\n}\n","^17",1579837703000,"^18",["^19",["^Z","~$goog.i18n.DateTimeSymbols"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/datetimesymbolsext.js"],"^1J",["^19",["~$goog.i18n.DateTimeSymbols_kw","~$goog.i18n.DateTimeSymbols-en-PW","~$goog.i18n.DateTimeSymbols-en-PR","~$goog.i18n.DateTimeSymbols_lu","~$goog.i18n.DateTimeSymbols_vun_TZ","~$goog.i18n.DateTimeSymbols_saq","~$goog.i18n.DateTimeSymbols-tzm-MA","~$goog.i18n.DateTimeSymbols_en_DM","~$goog.i18n.DateTimeSymbols_ru_KG","~$goog.i18n.DateTimeSymbols-am-ET","~$goog.i18n.DateTimeSymbols-se","~$goog.i18n.DateTimeSymbols-tk-TM","~$goog.i18n.DateTimeSymbols-fr-BF","~$goog.i18n.DateTimeSymbols_en_AG","~$goog.i18n.DateTimeSymbols-my-MM","~$goog.i18n.DateTimeSymbols-se-FI","~$goog.i18n.DateTimeSymbols_fr_WF","~$goog.i18n.DateTimeSymbols-en-LR","~$goog.i18n.DateTimeSymbols_rm_CH","~$goog.i18n.DateTimeSymbols-bas","~$goog.i18n.DateTimeSymbols-sn","~$goog.i18n.DateTimeSymbols-om","~$goog.i18n.DateTimeSymbols_az_Latn_AZ","~$goog.i18n.DateTimeSymbols_sr_Cyrl_XK","~$goog.i18n.DateTimeSymbols-ms-MY","~$goog.i18n.DateTimeSymbols_en_SS","~$goog.i18n.DateTimeSymbols_bm","~$goog.i18n.DateTimeSymbols-ta-SG","~$goog.i18n.DateTimeSymbols-en-VC","~$goog.i18n.DateTimeSymbols_el_GR","~$goog.i18n.DateTimeSymbols-sah-RU","~$goog.i18n.DateTimeSymbols-teo-KE","~$goog.i18n.DateTimeSymbols-yue","~$goog.i18n.DateTimeSymbols-qu","~$goog.i18n.DateTimeSymbols_tr_CY","~$goog.i18n.DateTimeSymbols_kln","~$goog.i18n.DateTimeSymbols-qu-EC","~$goog.i18n.DateTimeSymbols_qu","~$goog.i18n.DateTimeSymbols-smn-FI","~$goog.i18n.DateTimeSymbols_km_KH","~$goog.i18n.DateTimeSymbols_qu_PE","~$goog.i18n.DateTimeSymbols-kea","~$goog.i18n.DateTimeSymbols_fr_MG","~$goog.i18n.DateTimeSymbols-rm-CH","~$goog.i18n.DateTimeSymbols_fr_RE","~$goog.i18n.DateTimeSymbols-guz-KE","~$goog.i18n.DateTimeSymbols-en-MO","~$goog.i18n.DateTimeSymbols-ru-KZ","~$goog.i18n.DateTimeSymbols-fr-GP","~$goog.i18n.DateTimeSymbols_bs_Cyrl","~$goog.i18n.DateTimeSymbols_fr_BF","~$goog.i18n.DateTimeSymbols_bez","~$goog.i18n.DateTimeSymbols-nds-DE","~$goog.i18n.DateTimeSymbols_ar_MR","~$goog.i18n.DateTimeSymbols_to_TO","~$goog.i18n.DateTimeSymbols_en_MU","~$goog.i18n.DateTimeSymbols-ml-IN","~$goog.i18n.DateTimeSymbols_da_GL","~$goog.i18n.DateTimeSymbols_ko_KP","~$goog.i18n.DateTimeSymbols_zgh_MA","~$goog.i18n.DateTimeSymbols-ur-PK","~$goog.i18n.DateTimeSymbols_pt_CV","~$goog.i18n.DateTimeSymbols-ia","~$goog.i18n.DateTimeSymbols_kln_KE","~$goog.i18n.DateTimeSymbols-ff-Latn-NE","~$goog.i18n.DateTimeSymbols-nmg-CM","~$goog.i18n.DateTimeSymbols-dsb","~$goog.i18n.DateTimeSymbols_es_BR","~$goog.i18n.DateTimeSymbols_mg_MG","~$goog.i18n.DateTimeSymbols_ksb_TZ","~$goog.i18n.DateTimeSymbols_en_UG","~$goog.i18n.DateTimeSymbols_sd","~$goog.i18n.DateTimeSymbols_ur_PK","~$goog.i18n.DateTimeSymbols_be_BY","~$goog.i18n.DateTimeSymbols_ia","~$goog.i18n.DateTimeSymbols_bo_IN","~$goog.i18n.DateTimeSymbols_en_US_POSIX","~$goog.i18n.DateTimeSymbols-es-PE","~$goog.i18n.DateTimeSymbols_uz_Arab_AF","~$goog.i18n.DateTimeSymbols_en_CC","~$goog.i18n.DateTimeSymbols_vai","~$goog.i18n.DateTimeSymbols-nyn-UG","~$goog.i18n.DateTimeSymbols-bo-IN","~$goog.i18n.DateTimeSymbols-ar-LB","~$goog.i18n.DateTimeSymbols_ta_SG","~$goog.i18n.DateTimeSymbols-shi-Latn","~$goog.i18n.DateTimeSymbols_si_LK","~$goog.i18n.DateTimeSymbols_fo_DK","~$goog.i18n.DateTimeSymbols-ar-IQ","~$goog.i18n.DateTimeSymbols-gsw-CH","~$goog.i18n.DateTimeSymbols-es-DO","~$goog.i18n.DateTimeSymbols-uz-Cyrl-UZ","~$goog.i18n.DateTimeSymbols_en_WS","~$goog.i18n.DateTimeSymbols-ha-NE","~$goog.i18n.DateTimeSymbols_fr_BE","~$goog.i18n.DateTimeSymbols_en_MO","~$goog.i18n.DateTimeSymbols-de-LU","~$goog.i18n.DateTimeSymbols-zgh","~$goog.i18n.DateTimeSymbols-pt-CV","~$goog.i18n.DateTimeSymbols_lg","~$goog.i18n.DateTimeSymbols-dje-NE","~$goog.i18n.DateTimeSymbols-bm-ML","~$goog.i18n.DateTimeSymbols-kde","~$goog.i18n.DateTimeSymbols-ff-Latn-GM","~$goog.i18n.DateTimeSymbols_fr_GN","~$goog.i18n.DateTimeSymbols-sbp-TZ","~$goog.i18n.DateTimeSymbols-ta-LK","~$goog.i18n.DateTimeSymbols_en_VG","~$goog.i18n.DateTimeSymbols-en-DE","~$goog.i18n.DateTimeSymbols_kl_GL","~$goog.i18n.DateTimeSymbols-bas-CM","~$goog.i18n.DateTimeSymbols_vai_Vaii","~$goog.i18n.DateTimeSymbols_ar_XB","~$goog.i18n.DateTimeSymbols_ar_ER","~$goog.i18n.DateTimeSymbols-sr-Latn-BA","~$goog.i18n.DateTimeSymbols-es-IC","~$goog.i18n.DateTimeSymbols_fr_BJ","~$goog.i18n.DateTimeSymbols_zh_Hant","~$goog.i18n.DateTimeSymbols-jmc-TZ","~$goog.i18n.DateTimeSymbols_it_CH","~$goog.i18n.DateTimeSymbols_rm","~$goog.i18n.DateTimeSymbols_ff_Latn_MR","~$goog.i18n.DateTimeSymbols_so_DJ","~$goog.i18n.DateTimeSymbols-ta-IN","~$goog.i18n.DateTimeSymbols-mas","~$goog.i18n.DateTimeSymbols-ru-MD","~$goog.i18n.DateTimeSymbols-nl-CW","~$goog.i18n.DateTimeSymbols_ar_PS","~$goog.i18n.DateTimeSymbols-nnh","~$goog.i18n.DateTimeSymbols_id_ID","~$goog.i18n.DateTimeSymbols_es_DO","~$goog.i18n.DateTimeSymbols_de_IT","~$goog.i18n.DateTimeSymbols-bn-IN","~$goog.i18n.DateTimeSymbols-fr-GF","~$goog.i18n.DateTimeSymbols_lag_TZ","~$goog.i18n.DateTimeSymbols_az_Cyrl_AZ","~$goog.i18n.DateTimeSymbols_mzn","~$goog.i18n.DateTimeSymbols-kok-IN","~$goog.i18n.DateTimeSymbols_hr_BA","~$goog.i18n.DateTimeSymbols_bez_TZ","~$goog.i18n.DateTimeSymbols-ln-CF","~$goog.i18n.DateTimeSymbols_et_EE","~$goog.i18n.DateTimeSymbols_da_DK","~$goog.i18n.DateTimeSymbols_fr_CG","~$goog.i18n.DateTimeSymbols-en-KI","~$goog.i18n.DateTimeSymbols-lrc-IR","~$goog.i18n.DateTimeSymbols-kea-CV","~$goog.i18n.DateTimeSymbols-kkj-CM","~$goog.i18n.DateTimeSymbols-guz","~$goog.i18n.DateTimeSymbols_os_RU","~$goog.i18n.DateTimeSymbols_en_SL","~$goog.i18n.DateTimeSymbols_ccp","~$goog.i18n.DateTimeSymbols-lrc-IQ","~$goog.i18n.DateTimeSymbols-fr-MC","~$goog.i18n.DateTimeSymbols-bs-Latn-BA","~$goog.i18n.DateTimeSymbols_ml_IN","~$goog.i18n.DateTimeSymbols-wae-CH","~$goog.i18n.DateTimeSymbols-dua","~$goog.i18n.DateTimeSymbols_sv_AX","~$goog.i18n.DateTimeSymbols-fr-DJ","~$goog.i18n.DateTimeSymbols-pt-GQ","~$goog.i18n.DateTimeSymbols_bas","~$goog.i18n.DateTimeSymbols_mgo","~$goog.i18n.DateTimeSymbols_twq","~$goog.i18n.DateTimeSymbols-gd-GB","~$goog.i18n.DateTimeSymbols_dav","~$goog.i18n.DateTimeSymbols_fr_HT","~$goog.i18n.DateTimeSymbols-es-PY","~$goog.i18n.DateTimeSymbols_eo","~$goog.i18n.DateTimeSymbols_en_GU","~$goog.i18n.DateTimeSymbols-kam","~$goog.i18n.DateTimeSymbols_yue","~$goog.i18n.DateTimeSymbols_fr_ML","~$goog.i18n.DateTimeSymbols-zu-ZA","~$goog.i18n.DateTimeSymbols-de-BE","~$goog.i18n.DateTimeSymbols_dyo","~$goog.i18n.DateTimeSymbols_fr_PF","~$goog.i18n.DateTimeSymbols_se_SE","~$goog.i18n.DateTimeSymbols_kl","~$goog.i18n.DateTimeSymbols-sk-SK","~$goog.i18n.DateTimeSymbols-en-SE","~$goog.i18n.DateTimeSymbols_gd_GB","~$goog.i18n.DateTimeSymbols-az-Latn","~$goog.i18n.DateTimeSymbols_nds_NL","~$goog.i18n.DateTimeSymbols-fr-BE","~$goog.i18n.DateTimeSymbols-ak-GH","~$goog.i18n.DateTimeSymbols-gd","~$goog.i18n.DateTimeSymbols-ff","~$goog.i18n.DateTimeSymbols-ln-CG","~$goog.i18n.DateTimeSymbols_fr_CF","~$goog.i18n.DateTimeSymbols_en_GD","~$goog.i18n.DateTimeSymbols_yo","~$goog.i18n.DateTimeSymbols-mn-MN","~$goog.i18n.DateTimeSymbols-lg","~$goog.i18n.DateTimeSymbols_sv_FI","~$goog.i18n.DateTimeSymbols-sw-TZ","~$goog.i18n.DateTimeSymbols_dav_KE","~$goog.i18n.DateTimeSymbols-kw-GB","~$goog.i18n.DateTimeSymbols-ccp-BD","~$goog.i18n.DateTimeSymbols-en-GD","~$goog.i18n.DateTimeSymbols_ksf","~$goog.i18n.DateTimeSymbols_ebu","~$goog.i18n.DateTimeSymbols_hy_AM","~$goog.i18n.DateTimeSymbols-eo-001","~$goog.i18n.DateTimeSymbols-en-SZ","~$goog.i18n.DateTimeSymbols-ln-AO","~$goog.i18n.DateTimeSymbols-pl-PL","~$goog.i18n.DateTimeSymbols_jgo","~$goog.i18n.DateTimeSymbols_lag","~$goog.i18n.DateTimeSymbols-ff-Latn-SL","~$goog.i18n.DateTimeSymbols_en_BS","~$goog.i18n.DateTimeSymbols-mt-MT","~$goog.i18n.DateTimeSymbols-hr-BA","~$goog.i18n.DateTimeSymbols_en_KE","~$goog.i18n.DateTimeSymbols_om_ET","~$goog.i18n.DateTimeSymbols_ce","~$goog.i18n.DateTimeSymbols_sr_Latn_ME","~$goog.i18n.DateTimeSymbols_en_TZ","~$goog.i18n.DateTimeSymbols-en-PH","~$goog.i18n.DateTimeSymbols-en-AS","~$goog.i18n.DateTimeSymbols_fr_TD","~$goog.i18n.DateTimeSymbols_qu_EC","~$goog.i18n.DateTimeSymbols_shi_Latn_MA","~$goog.i18n.DateTimeSymbols_mgo_CM","~$goog.i18n.DateTimeSymbols_nds_DE","~$goog.i18n.DateTimeSymbols-ii","~$goog.i18n.DateTimeSymbols_dje","~$goog.i18n.DateTimeSymbols-ar-MR","~$goog.i18n.DateTimeSymbols-kln","~$goog.i18n.DateTimeSymbols-ee-TG","~$goog.i18n.DateTimeSymbols_fr_SC","~$goog.i18n.DateTimeSymbols_kde_TZ","~$goog.i18n.DateTimeSymbols-en-CH","~$goog.i18n.DateTimeSymbols-fr-BL","~$goog.i18n.DateTimeSymbols_de_DE","~$goog.i18n.DateTimeSymbols-ha","~$goog.i18n.DateTimeSymbols_mn_MN","~$goog.i18n.DateTimeSymbols-tk","~$goog.i18n.DateTimeSymbols-es-AR","~$goog.i18n.DateTimeSymbols_is_IS","~$goog.i18n.DateTimeSymbols_pt_AO","~$goog.i18n.DateTimeSymbols_uz_Cyrl","~$goog.i18n.DateTimeSymbols_sg_CF","~$goog.i18n.DateTimeSymbols_so_SO","~$goog.i18n.DateTimeSymbols_ksb","~$goog.i18n.DateTimeSymbols-yue-Hans","~$goog.i18n.DateTimeSymbols_ff","~$goog.i18n.DateTimeSymbols_ar_AE","~$goog.i18n.DateTimeSymbols_lu_CD","~$goog.i18n.DateTimeSymbols_en_AE","~$goog.i18n.DateTimeSymbols_dz","~$goog.i18n.DateTimeSymbols_en_CM","~$goog.i18n.DateTimeSymbols_ce_RU","~$goog.i18n.DateTimeSymbols-nl-AW","~$goog.i18n.DateTimeSymbols_mg","~$goog.i18n.DateTimeSymbols_en_TK","~$goog.i18n.DateTimeSymbols_ar_QA","~$goog.i18n.DateTimeSymbols-ksf-CM","~$goog.i18n.DateTimeSymbols-en-PK","~$goog.i18n.DateTimeSymbols-fr-FR","~$goog.i18n.DateTimeSymbols_pt_ST","~$goog.i18n.DateTimeSymbols_bn_IN","~$goog.i18n.DateTimeSymbols_twq_NE","~$goog.i18n.DateTimeSymbols-ca-FR","~$goog.i18n.DateTimeSymbols-fr-MA","~$goog.i18n.DateTimeSymbols-kl-GL","~$goog.i18n.DateTimeSymbols_en_CX","~$goog.i18n.DateTimeSymbols-bn-BD","~$goog.i18n.DateTimeSymbols-lkt","~$goog.i18n.DateTimeSymbols-yi","~$goog.i18n.DateTimeSymbols-brx","~$goog.i18n.DateTimeSymbols_nnh_CM","~$goog.i18n.DateTimeSymbols-lkt-US","~$goog.i18n.DateTimeSymbols_kk_KZ","~$goog.i18n.DateTimeSymbols-de-DE","~$goog.i18n.DateTimeSymbols-hy-AM","~$goog.i18n.DateTimeSymbols-ar-ER","~$goog.i18n.DateTimeSymbols_es_PE","~$goog.i18n.DateTimeSymbols-to-TO","~$goog.i18n.DateTimeSymbols_dua_CM","~$goog.i18n.DateTimeSymbols-lu","~$goog.i18n.DateTimeSymbols_ki_KE","~$goog.i18n.DateTimeSymbols_ug_CN","~$goog.i18n.DateTimeSymbols_pa_Guru_IN","~$goog.i18n.DateTimeSymbols_dsb_DE","~$goog.i18n.DateTimeSymbols_ee_TG","~$goog.i18n.DateTimeSymbols-en-NG","~$goog.i18n.DateTimeSymbols-ne-IN","~$goog.i18n.DateTimeSymbols-en-UM","~$goog.i18n.DateTimeSymbols-vai-Latn","~$goog.i18n.DateTimeSymbols_ig_NG","~$goog.i18n.DateTimeSymbols_fr_VU","~$goog.i18n.DateTimeSymbols_lv_LV","~$goog.i18n.DateTimeSymbols_sw_TZ","~$goog.i18n.DateTimeSymbols-lrc","~$goog.i18n.DateTimeSymbols_ks_IN","~$goog.i18n.DateTimeSymbols_ksh","~$goog.i18n.DateTimeSymbols_to","~$goog.i18n.DateTimeSymbols-bo-CN","~$goog.i18n.DateTimeSymbols_haw_US","~$goog.i18n.DateTimeSymbols-mua-CM","~$goog.i18n.DateTimeSymbols-dyo","~$goog.i18n.DateTimeSymbols-sd","~$goog.i18n.DateTimeSymbols_nmg","~$goog.i18n.DateTimeSymbols-en-GH","~$goog.i18n.DateTimeSymbols-lb-LU","~$goog.i18n.DateTimeSymbols-ru-KG","~$goog.i18n.DateTimeSymbols_nmg_CM","~$goog.i18n.DateTimeSymbols-xh-ZA","~$goog.i18n.DateTimeSymbols-asa","~$goog.i18n.DateTimeSymbols_sn_ZW","~$goog.i18n.DateTimeSymbols_jmc","~$goog.i18n.DateTimeSymbols_yo_BJ","~$goog.i18n.DateTimeSymbols-fr-CD","~$goog.i18n.DateTimeSymbols-pt-GW","~$goog.i18n.DateTimeSymbols_ps","~$goog.i18n.DateTimeSymbols_en_NR","~$goog.i18n.DateTimeSymbols-it-VA","~$goog.i18n.DateTimeSymbols_lkt_US","~$goog.i18n.DateTimeSymbols-ki-KE","~$goog.i18n.DateTimeSymbols-fr-PF","~$goog.i18n.DateTimeSymbols_fr_YT","~$goog.i18n.DateTimeSymbols_en_TT","~$goog.i18n.DateTimeSymbols-fr-KM","~$goog.i18n.DateTimeSymbols_fr_GF","~$goog.i18n.DateTimeSymbols_ee","~$goog.i18n.DateTimeSymbols-fr-CG","~$goog.i18n.DateTimeSymbols_wae","~$goog.i18n.DateTimeSymbols_ig","~$goog.i18n.DateTimeSymbols_uz_Cyrl_UZ","~$goog.i18n.DateTimeSymbols-en-NL","~$goog.i18n.DateTimeSymbols_hu_HU","~$goog.i18n.DateTimeSymbols-kkj","~$goog.i18n.DateTimeSymbols-cgg-UG","~$goog.i18n.DateTimeSymbols-gv-IM","~$goog.i18n.DateTimeSymbols_fr_MC","~$goog.i18n.DateTimeSymbols-ps","~$goog.i18n.DateTimeSymbols-ig","~$goog.i18n.DateTimeSymbols_fy","~$goog.i18n.DateTimeSymbols_es_PY","~$goog.i18n.DateTimeSymbols_ps_AF","~$goog.i18n.DateTimeSymbols_ewo","~$goog.i18n.DateTimeSymbols_fr_MF","~$goog.i18n.DateTimeSymbols_agq_CM","~$goog.i18n.DateTimeSymbols-de-IT","~$goog.i18n.DateTimeSymbols-si-LK","~$goog.i18n.DateTimeSymbols_lrc_IR","~$goog.i18n.DateTimeSymbols-chr-US","~$goog.i18n.DateTimeSymbols-ebu-KE","~$goog.i18n.DateTimeSymbols_ja_JP","~$goog.i18n.DateTimeSymbols_es_GT","~$goog.i18n.DateTimeSymbols_khq","~$goog.i18n.DateTimeSymbols_ksh_DE","~$goog.i18n.DateTimeSymbols-ti-ET","~$goog.i18n.DateTimeSymbols_fr_GQ","~$goog.i18n.DateTimeSymbols-en-SC","~$goog.i18n.DateTimeSymbols-kw","~$goog.i18n.DateTimeSymbols-jgo","~$goog.i18n.DateTimeSymbols-ca-ES","~$goog.i18n.DateTimeSymbols_ccp_IN","~$goog.i18n.DateTimeSymbols-en-CM","~$goog.i18n.DateTimeSymbols_ar_OM","~$goog.i18n.DateTimeSymbols_ee_GH","~$goog.i18n.DateTimeSymbols_fr_FR","~$goog.i18n.DateTimeSymbols-en-RW","~$goog.i18n.DateTimeSymbols_seh_MZ","~$goog.i18n.DateTimeSymbols_yi_001","~$goog.i18n.DateTimeSymbols-es-BO","~$goog.i18n.DateTimeSymbols_cgg","~$goog.i18n.DateTimeSymbols-en-XA","~$goog.i18n.DateTimeSymbols-ug","~$goog.i18n.DateTimeSymbols_bs_Cyrl_BA","~$goog.i18n.DateTimeSymbols_en_TO","~$goog.i18n.DateTimeSymbols-en-IO","~$goog.i18n.DateTimeSymbols_en_GH","~$goog.i18n.DateTimeSymbols_hsb_DE","~$goog.i18n.DateTimeSymbols_yue_Hant_HK","~$goog.i18n.DateTimeSymbols_ti","~$goog.i18n.DateTimeSymbols_en_IO","~$goog.i18n.DateTimeSymbols_pt_TL","~$goog.i18n.DateTimeSymbols-wo","~$goog.i18n.DateTimeSymbols-en-GU","~$goog.i18n.DateTimeSymbols-dsb-DE","~$goog.i18n.DateTimeSymbols_shi_Latn","~$goog.i18n.DateTimeSymbols_ar_JO","~$goog.i18n.DateTimeSymbols_tzm","~$goog.i18n.DateTimeSymbols_ar_SO","~$goog.i18n.DateTimeSymbols-it-SM","~$goog.i18n.DateTimeSymbols-nmg","~$goog.i18n.DateTimeSymbols-nl-SR","~$goog.i18n.DateTimeSymbols_ff_Latn_GN","~$goog.i18n.DateTimeSymbols-wo-SN","~$goog.i18n.DateTimeSymbols_ta_LK","~$goog.i18n.DateTimeSymbols-ig-NG","~$goog.i18n.DateTimeSymbols-ar-DJ","~$goog.i18n.DateTimeSymbols-es-PR","~$goog.i18n.DateTimeSymbols_ar_TD","~$goog.i18n.DateTimeSymbols_seh","~$goog.i18n.DateTimeSymbols_en_MP","~$goog.i18n.DateTimeSymbols_mgh_MZ","~$goog.i18n.DateTimeSymbols-cy-GB","~$goog.i18n.DateTimeSymbols-es-GQ","~$goog.i18n.DateTimeSymbols_en_AS","~$goog.i18n.DateTimeSymbols-ar-YE","~$goog.i18n.DateTimeSymbols_en_NF","~$goog.i18n.DateTimeSymbols-mas-KE","~$goog.i18n.DateTimeSymbols-fa-AF","~$goog.i18n.DateTimeSymbols_hr_HR","~$goog.i18n.DateTimeSymbols-ccp","~$goog.i18n.DateTimeSymbols-nus","~$goog.i18n.DateTimeSymbols-km-KH","~$goog.i18n.DateTimeSymbols_af_ZA","~$goog.i18n.DateTimeSymbols_en_DE","~$goog.i18n.DateTimeSymbols_kok_IN","~$goog.i18n.DateTimeSymbols_es_PR","~$goog.i18n.DateTimeSymbols-ff-Latn-CM","~$goog.i18n.DateTimeSymbols-en-JM","~$goog.i18n.DateTimeSymbols_es_SV","~$goog.i18n.DateTimeSymbols_ff_Latn_SN","~$goog.i18n.DateTimeSymbols_fo_FO","~$goog.i18n.DateTimeSymbols_de_LU","~$goog.i18n.DateTimeSymbols-khq-ML","~$goog.i18n.DateTimeSymbols-nd","~$goog.i18n.DateTimeSymbols-qu-BO","~$goog.i18n.DateTimeSymbols-rn-BI","~$goog.i18n.DateTimeSymbols_sn","~$goog.i18n.DateTimeSymbols-fr-VU","~$goog.i18n.DateTimeSymbols_vai_Latn","~$goog.i18n.DateTimeSymbols_ms_MY","~$goog.i18n.DateTimeSymbols-sg-CF","~$goog.i18n.DateTimeSymbols-fr-MG","~$goog.i18n.DateTimeSymbols-nds-NL","~$goog.i18n.DateTimeSymbols-en-TC","~$goog.i18n.DateTimeSymbols_dje_NE","~$goog.i18n.DateTimeSymbols_vun","~$goog.i18n.DateTimeSymbols-es-GT","~$goog.i18n.DateTimeSymbols-fr-LU","~$goog.i18n.DateTimeSymbols-nnh-CM","~$goog.i18n.DateTimeSymbols-nl-BE","~$goog.i18n.DateTimeSymbols-zh-Hans-SG","~$goog.i18n.DateTimeSymbols-yue-Hant-HK","~$goog.i18n.DateTimeSymbols-en-KE","~$goog.i18n.DateTimeSymbols-ceb","~$goog.i18n.DateTimeSymbols-luy","~$goog.i18n.DateTimeSymbols-ckb","~$goog.i18n.DateTimeSymbols-zh-Hans-CN","~$goog.i18n.DateTimeSymbols-shi","~$goog.i18n.DateTimeSymbols-tt","~$goog.i18n.DateTimeSymbols_ar_DJ","~$goog.i18n.DateTimeSymbols-es-CU","~$goog.i18n.DateTimeSymbols-om-ET","~$goog.i18n.DateTimeSymbols-ru-BY","~$goog.i18n.DateTimeSymbols-hu-HU","~$goog.i18n.DateTimeSymbols_ebu_KE","~$goog.i18n.DateTimeSymbols_zh_Hans","~$goog.i18n.DateTimeSymbols-ses-ML","~$goog.i18n.DateTimeSymbols_hi_IN","~$goog.i18n.DateTimeSymbols-en-MS","~$goog.i18n.DateTimeSymbols_sw_CD","~$goog.i18n.DateTimeSymbols-es-EC","~$goog.i18n.DateTimeSymbols-fr-WF","~$goog.i18n.DateTimeSymbols_en_FJ","~$goog.i18n.DateTimeSymbols-pa-Guru-IN","~$goog.i18n.DateTimeSymbols_en_NA","~$goog.i18n.DateTimeSymbols-seh-MZ","~$goog.i18n.DateTimeSymbols_ps_PK","~$goog.i18n.DateTimeSymbols-ee","~$goog.i18n.DateTimeSymbols_af_NA","~$goog.i18n.DateTimeSymbols_en_AI","~$goog.i18n.DateTimeSymbols-en-LC","~$goog.i18n.DateTimeSymbols-en-FI","~$goog.i18n.DateTimeSymbols_naq","~$goog.i18n.DateTimeSymbols_ku","~$goog.i18n.DateTimeSymbols-lb","~$goog.i18n.DateTimeSymbols-fil-PH","~$goog.i18n.DateTimeSymbols_ko_KR","~$goog.i18n.DateTimeSymbols_yav_CM","~$goog.i18n.DateTimeSymbols_uk_UA","~$goog.i18n.DateTimeSymbols_bn_BD","~$goog.i18n.DateTimeSymbols_sr_Cyrl_RS","~$goog.i18n.DateTimeSymbols_vai_Latn_LR","~$goog.i18n.DateTimeSymbols_fur","~$goog.i18n.DateTimeSymbols-lg-UG","~$goog.i18n.DateTimeSymbols_mi","~$goog.i18n.DateTimeSymbols_my_MM","~$goog.i18n.DateTimeSymbols_fr_DJ","~$goog.i18n.DateTimeSymbols-pt-LU","~$goog.i18n.DateTimeSymbols-ar-TN","~$goog.i18n.DateTimeSymbols_rof_TZ","~$goog.i18n.DateTimeSymbols-ii-CN","~$goog.i18n.DateTimeSymbols_kkj_CM","~$goog.i18n.DateTimeSymbols-en-NA","~$goog.i18n.DateTimeSymbols-sq-MK","~$goog.i18n.DateTimeSymbols-is-IS","~$goog.i18n.DateTimeSymbols_es_PH","~$goog.i18n.DateTimeSymbols-nd-ZW","~$goog.i18n.DateTimeSymbols_uz_Latn","~$goog.i18n.DateTimeSymbols-mg","~$goog.i18n.DateTimeSymbols-fr-GN","~$goog.i18n.DateTimeSymbols-fi-FI","~$goog.i18n.DateTimeSymbols_en_SI","~$goog.i18n.DateTimeSymbols_nnh","~$goog.i18n.DateTimeSymbols-te-IN","~$goog.i18n.DateTimeSymbols_fr_SY","~$goog.i18n.DateTimeSymbols-en-CY","~$goog.i18n.DateTimeSymbols-ccp-IN","~$goog.i18n.DateTimeSymbols_hsb","~$goog.i18n.DateTimeSymbols-fo-FO","~$goog.i18n.DateTimeSymbols_en_150","~$goog.i18n.DateTimeSymbols-jgo-CM","~$goog.i18n.DateTimeSymbols-sl-SI","~$goog.i18n.DateTimeSymbols-uz-Arab","~$goog.i18n.DateTimeSymbols_gsw_LI","~$goog.i18n.DateTimeSymbols_pt_MZ","~$goog.i18n.DateTimeSymbols-ti-ER","~$goog.i18n.DateTimeSymbols_ceb","~$goog.i18n.DateTimeSymbols-en-GI","~$goog.i18n.DateTimeSymbols-khq","~$goog.i18n.DateTimeSymbols-saq-KE","~$goog.i18n.DateTimeSymbols-mr-IN","~$goog.i18n.DateTimeSymbols-rn","~$goog.i18n.DateTimeSymbols_wae_CH","~$goog.i18n.DateTimeSymbols_en_CK","~$goog.i18n.DateTimeSymbols-yue-Hant","~$goog.i18n.DateTimeSymbols_ast","~$goog.i18n.DateTimeSymbols_ar_MA","~$goog.i18n.DateTimeSymbols_xog_UG","~$goog.i18n.DateTimeSymbols_ln_CD","~$goog.i18n.DateTimeSymbols-so-DJ","~$goog.i18n.DateTimeSymbols-ast-ES","~$goog.i18n.DateTimeSymbols-es-BZ","~$goog.i18n.DateTimeSymbols-fr-PM","~$goog.i18n.DateTimeSymbols-sr-Cyrl-RS","~$goog.i18n.DateTimeSymbols-nds","~$goog.i18n.DateTimeSymbols_ha_NG","~$goog.i18n.DateTimeSymbols_smn","~$goog.i18n.DateTimeSymbols-en-NF","~$goog.i18n.DateTimeSymbols-so-ET","~$goog.i18n.DateTimeSymbols_zh_Hant_HK","~$goog.i18n.DateTimeSymbols_es_BZ","~$goog.i18n.DateTimeSymbols-xog","~$goog.i18n.DateTimeSymbols-ps-AF","~$goog.i18n.DateTimeSymbols_en_GY","~$goog.i18n.DateTimeSymbols_tk","~$goog.i18n.DateTimeSymbols_en_TC","~$goog.i18n.DateTimeSymbols_as_IN","~$goog.i18n.DateTimeSymbols-mer","~$goog.i18n.DateTimeSymbols-pa-Guru","~$goog.i18n.DateTimeSymbols-fy-NL","~$goog.i18n.DateTimeSymbols_ur_IN","~$goog.i18n.DateTimeSymbols-en-JE","~$goog.i18n.DateTimeSymbols-shi-Tfng-MA","~$goog.i18n.DateTimeSymbols-et-EE","~$goog.i18n.DateTimeSymbols_bem_ZM","~$goog.i18n.DateTimeSymbols_ne_IN","~$goog.i18n.DateTimeSymbols-sd-PK","~$goog.i18n.DateTimeSymbols-pt-MO","~$goog.i18n.DateTimeSymbols_it_VA","~$goog.i18n.DateTimeSymbols-en-FM","~$goog.i18n.DateTimeSymbols-en-NZ","~$goog.i18n.DateTimeSymbols-nb-NO","~$goog.i18n.DateTimeSymbols_eu_ES","~$goog.i18n.DateTimeSymbols_it_SM","~$goog.i18n.DateTimeSymbols-kab","~$goog.i18n.DateTimeSymbols-rwk","~$goog.i18n.DateTimeSymbols-fur-IT","~$goog.i18n.DateTimeSymbols_nb_SJ","~$goog.i18n.DateTimeSymbols_luo","~$goog.i18n.DateTimeSymbols_mer_KE","~$goog.i18n.DateTimeSymbols_sr_Latn_BA","~$goog.i18n.DateTimeSymbols_naq_NA","~$goog.i18n.DateTimeSymbols-en-LS","~$goog.i18n.DateTimeSymbols_mi_NZ","~$goog.i18n.DateTimeSymbols_ewo_CM","~$goog.i18n.DateTimeSymbols-sr-Cyrl-ME","~$goog.i18n.DateTimeSymbols_khq_ML","~$goog.i18n.DateTimeSymbols_en_CY","~$goog.i18n.DateTimeSymbols-ar-SY","~$goog.i18n.DateTimeSymbols-fr-CI","~$goog.i18n.DateTimeSymbols-sq-XK","~$goog.i18n.DateTimeSymbols-ks-IN","~$goog.i18n.DateTimeSymbols-ff-Latn-GH","~$goog.i18n.DateTimeSymbols_ru_MD","~$goog.i18n.DateTimeSymbols-rw-RW","~$goog.i18n.DateTimeSymbols-ja-JP","~$goog.i18n.DateTimeSymbols-ar-SS","~$goog.i18n.DateTimeSymbols_en_IL","~$goog.i18n.DateTimeSymbols_en_XA","~$goog.i18n.DateTimeSymbols-pa-Arab","~$goog.i18n.DateTimeSymbols_mua_CM","~$goog.i18n.DateTimeSymbols_fur_IT","~$goog.i18n.DateTimeSymbols-fr-TD","~$goog.i18n.DateTimeSymbols_sl_SI","~$goog.i18n.DateTimeSymbols-fa-IR","~$goog.i18n.DateTimeSymbols_cs_CZ","~$goog.i18n.DateTimeSymbols-ro-MD","~$goog.i18n.DateTimeSymbols_ga_IE","~$goog.i18n.DateTimeSymbols-en-VG","~$goog.i18n.DateTimeSymbols-pt-ST","~$goog.i18n.DateTimeSymbols-mer-KE","~$goog.i18n.DateTimeSymbols-fr-CF","~$goog.i18n.DateTimeSymbols_es_HN","~$goog.i18n.DateTimeSymbols-yue-Hans-CN","~$goog.i18n.DateTimeSymbols_so","~$goog.i18n.DateTimeSymbols-uz-Arab-AF","~$goog.i18n.DateTimeSymbols_ms_BN","~$goog.i18n.DateTimeSymbols_mer","~$goog.i18n.DateTimeSymbols-fr-SY","~$goog.i18n.DateTimeSymbols_ar_SY","~$goog.i18n.DateTimeSymbols_ksf_CM","~$goog.i18n.DateTimeSymbols_zh_Hans_MO","~$goog.i18n.DateTimeSymbols-vai-Vaii-LR","~$goog.i18n.DateTimeSymbols-kk-KZ","~$goog.i18n.DateTimeSymbols-ksf","~$goog.i18n.DateTimeSymbols-zh-Hant-HK","~$goog.i18n.DateTimeSymbols_ln_AO","~$goog.i18n.DateTimeSymbols_ta_MY","~$goog.i18n.DateTimeSymbols_teo_UG","~$goog.i18n.DateTimeSymbols_sv_SE","~$goog.i18n.DateTimeSymbols-mg-MG","~$goog.i18n.DateTimeSymbols_en_NL","~$goog.i18n.DateTimeSymbols-dav-KE","~$goog.i18n.DateTimeSymbols-lag-TZ","~$goog.i18n.DateTimeSymbols-sw-CD","~$goog.i18n.DateTimeSymbols_es_CU","~$goog.i18n.DateTimeSymbols_jv","~$goog.i18n.DateTimeSymbols_fi_FI","~$goog.i18n.DateTimeSymbols-ceb-PH","~$goog.i18n.DateTimeSymbols_rn","~$goog.i18n.DateTimeSymbols_nus_SS","~$goog.i18n.DateTimeSymbols_mk_MK","~$goog.i18n.DateTimeSymbols-ga-IE","~$goog.i18n.DateTimeSymbols_se_FI","~$goog.i18n.DateTimeSymbols_sq_XK","~$goog.i18n.DateTimeSymbols_tr_TR","~$goog.i18n.DateTimeSymbols_sd_PK","~$goog.i18n.DateTimeSymbols_en_CH","~$goog.i18n.DateTimeSymbols-or-IN","~$goog.i18n.DateTimeSymbols_kam","~$goog.i18n.DateTimeSymbols_th_TH","~$goog.i18n.DateTimeSymbols-mzn-IR","~$goog.i18n.DateTimeSymbols_pt_GQ","~$goog.i18n.DateTimeSymbols-rm","~$goog.i18n.DateTimeSymbols-en-BZ","~$goog.i18n.DateTimeSymbols_agq","~$goog.i18n.DateTimeSymbols-lv-LV","~$goog.i18n.DateTimeSymbols-en-MU","~$goog.i18n.DateTimeSymbols_en_DK","~$goog.i18n.DateTimeSymbols_vi_VN","~$goog.i18n.DateTimeSymbols_ca_IT","~$goog.i18n.DateTimeSymbols_ca_AD","~$goog.i18n.DateTimeSymbols-fr-YT","~$goog.i18n.DateTimeSymbols_kab","~$goog.i18n.DateTimeSymbols-en-TZ","~$goog.i18n.DateTimeSymbols-se-SE","~$goog.i18n.DateTimeSymbols-en-GM","~$goog.i18n.DateTimeSymbols_en_FM","~$goog.i18n.DateTimeSymbols-ksb","~$goog.i18n.DateTimeSymbols_saq_KE","~$goog.i18n.DateTimeSymbols_en_BI","~$goog.i18n.DateTimeSymbols_yav","~$goog.i18n.DateTimeSymbols-gu-IN","~$goog.i18n.DateTimeSymbols_fr_MQ","~$goog.i18n.DateTimeSymbols-yav","~$goog.i18n.DateTimeSymbols-brx-IN","~$goog.i18n.DateTimeSymbols-en-DK","~$goog.i18n.DateTimeSymbols-sq-AL","~$goog.i18n.DateTimeSymbols_nb_NO","~$goog.i18n.DateTimeSymbols_sr_Latn_XK","~$goog.i18n.DateTimeSymbols-dz-BT","~$goog.i18n.DateTimeSymbols_dz_BT","~$goog.i18n.DateTimeSymbols-en-DM","~$goog.i18n.DateTimeSymbols-en-AE","~$goog.i18n.DateTimeSymbols-bm","~$goog.i18n.DateTimeSymbols_ff_Latn_NG","~$goog.i18n.DateTimeSymbols-sr-Cyrl-XK","~$goog.i18n.DateTimeSymbols_es_CO","~$goog.i18n.DateTimeSymbols-so","~$goog.i18n.DateTimeSymbols_mgh","~$goog.i18n.DateTimeSymbols_ru_UA","~$goog.i18n.DateTimeSymbols_vai_Vaii_LR","~$goog.i18n.DateTimeSymbols_fr_MA","~$goog.i18n.DateTimeSymbols-zgh-MA","~$goog.i18n.DateTimeSymbols_fr_LU","~$goog.i18n.DateTimeSymbols_tt_RU","~$goog.i18n.DateTimeSymbols-fr-HT","~$goog.i18n.DateTimeSymbols_teo_KE","~$goog.i18n.DateTimeSymbols-ses","~$goog.i18n.DateTimeSymbols-sg","~$goog.i18n.DateTimeSymbols-mgh","~$goog.i18n.DateTimeSymbols_sr_Latn_RS","~$goog.i18n.DateTimeSymbols-nus-SS","~$goog.i18n.DateTimeSymbols_en_GG","~$goog.i18n.DateTimeSymbols_eo_001","~$goog.i18n.DateTimeSymbols-dz","~$goog.i18n.DateTimeSymbols-az-Latn-AZ","~$goog.i18n.DateTimeSymbols-en-BW","~$goog.i18n.DateTimeSymbols_ar_KM","~$goog.i18n.DateTimeSymbols_fo","~$goog.i18n.DateTimeSymbols_pt_MO","~$goog.i18n.DateTimeSymbols-fo","~$goog.i18n.DateTimeSymbols-dua-CM","~$goog.i18n.DateTimeSymbols-fr-MF","~$goog.i18n.DateTimeSymbols_fr_NE","~$goog.i18n.DateTimeSymbols_smn_FI","~$goog.i18n.DateTimeSymbols-fr-BJ","~$goog.i18n.DateTimeSymbols-vi-VN","~$goog.i18n.DateTimeSymbols-ru-RU","~$goog.i18n.DateTimeSymbols-kl","~$goog.i18n.DateTimeSymbols-es-PA","~$goog.i18n.DateTimeSymbols_en_UM","~$goog.i18n.DateTimeSymbols_sw_UG","~$goog.i18n.DateTimeSymbols_asa_TZ","~$goog.i18n.DateTimeSymbols_fr_CI","~$goog.i18n.DateTimeSymbols-en-CX","~$goog.i18n.DateTimeSymbols-os-RU","~$goog.i18n.DateTimeSymbols-el-GR","~$goog.i18n.DateTimeSymbols_fy_NL","~$goog.i18n.DateTimeSymbols_pa_Guru","~$goog.i18n.DateTimeSymbols_el_CY","~$goog.i18n.DateTimeSymbols-ar-SA","~$goog.i18n.DateTimeSymbols_nyn_UG","~$goog.i18n.DateTimeSymbols_shi_Tfng","~$goog.i18n.DateTimeSymbols-ff-Latn-BF","~$goog.i18n.DateTimeSymbols_sq_AL","~$goog.i18n.DateTimeSymbols-ff-Latn-MR","~$goog.i18n.DateTimeSymbols-es-CL","~$goog.i18n.DateTimeSymbols_az_Cyrl","~$goog.i18n.DateTimeSymbols-en-WS","~$goog.i18n.DateTimeSymbols-ms-BN","~$goog.i18n.DateTimeSymbols-en-FK","~$goog.i18n.DateTimeSymbols_rw_RW","~$goog.i18n.DateTimeSymbols_en_KY","~$goog.i18n.DateTimeSymbols_ar_EH","~$goog.i18n.DateTimeSymbols-en-MH","~$goog.i18n.DateTimeSymbols-fr-MQ","~$goog.i18n.DateTimeSymbols_wo","~$goog.i18n.DateTimeSymbols_jv_ID","~$goog.i18n.DateTimeSymbols-yo-NG","~$goog.i18n.DateTimeSymbols-ce-RU","~$goog.i18n.DateTimeSymbols-en-ZW","~$goog.i18n.DateTimeSymbols-qu-PE","~$goog.i18n.DateTimeSymbols-fr-MR","~$goog.i18n.DateTimeSymbols_ar_LB","~$goog.i18n.DateTimeSymbols_en_SC","~$goog.i18n.DateTimeSymbols_guz_KE","~$goog.i18n.DateTimeSymbols_ro_MD","~$goog.i18n.DateTimeSymbols_shi","~$goog.i18n.DateTimeSymbols_pt_CH","~$goog.i18n.DateTimeSymbols_gv","~$goog.i18n.DateTimeSymbols-luy-KE","~$goog.i18n.DateTimeSymbols-so-SO","~$goog.i18n.DateTimeSymbols_ha_NE","~$goog.i18n.DateTimeSymbols-bg-BG","~$goog.i18n.DateTimeSymbols-nyn","~$goog.i18n.DateTimeSymbols_nds","~$goog.i18n.DateTimeSymbols-ff-Latn-SN","~$goog.i18n.DateTimeSymbols_en_JE","~$goog.i18n.DateTimeSymbols-fr-TN","~$goog.i18n.DateTimeSymbols-zh-Hant-MO","~$goog.i18n.DateTimeSymbols-teo-UG","~$goog.i18n.DateTimeSymbols_es_UY","~$goog.i18n.DateTimeSymbols_brx","~$goog.i18n.DateTimeSymbols-hsb-DE","~$goog.i18n.DateTimeSymbols_ru_RU","~$goog.i18n.DateTimeSymbols-ckb-IQ","~$goog.i18n.DateTimeSymbols_en_SD","~$goog.i18n.DateTimeSymbols-ca-AD","~$goog.i18n.DateTimeSymbols_kde","~$goog.i18n.DateTimeSymbols_gl_ES","~$goog.i18n.DateTimeSymbols-zh-Hant-TW","~$goog.i18n.DateTimeSymbols_lkt","~$goog.i18n.DateTimeSymbols-sbp","~$goog.i18n.DateTimeSymbols-he-IL","~$goog.i18n.DateTimeSymbols_fr_RW","~$goog.i18n.DateTimeSymbols-en-VI","~$goog.i18n.DateTimeSymbols_en_FK","~$goog.i18n.DateTimeSymbols_xh_ZA","~$goog.i18n.DateTimeSymbols_kam_KE","~$goog.i18n.DateTimeSymbols_brx_IN","~$goog.i18n.DateTimeSymbols-sw-UG","~$goog.i18n.DateTimeSymbols_kab_DZ","~$goog.i18n.DateTimeSymbols_bs_Latn_BA","~$goog.i18n.DateTimeSymbols-tt-RU","~$goog.i18n.DateTimeSymbols_fr_CH","~$goog.i18n.DateTimeSymbols-es-CO","~$goog.i18n.DateTimeSymbols-it-CH","~$goog.i18n.DateTimeSymbols-en-SB","~$goog.i18n.DateTimeSymbols-fr-GA","~$goog.i18n.DateTimeSymbols_en_TV","~$goog.i18n.DateTimeSymbols-fr-CM","~$goog.i18n.DateTimeSymbols-agq-CM","~$goog.i18n.DateTimeSymbols_fr_PM","~$goog.i18n.DateTimeSymbols-fr-SC","~$goog.i18n.DateTimeSymbols_ar_IQ","~$goog.i18n.DateTimeSymbols-en-MG","~$goog.i18n.DateTimeSymbols-en-MT","~$goog.i18n.DateTimeSymbols-ti","~$goog.i18n.DateTimeSymbols_es_NI","~$goog.i18n.DateTimeSymbols-rw","~$goog.i18n.DateTimeSymbols-yo","~$goog.i18n.DateTimeSymbols_en_DG","~$goog.i18n.DateTimeSymbols-kde-TZ","~$goog.i18n.DateTimeSymbols-om-KE","~$goog.i18n.DateTimeSymbols-fy","~$goog.i18n.DateTimeSymbols-vai-Vaii","~$goog.i18n.DateTimeSymbols-yav-CM","~$goog.i18n.DateTimeSymbols_en_BB","~$goog.i18n.DateTimeSymbols_fr_TN","~$goog.i18n.DateTimeSymbols_gd","~$goog.i18n.DateTimeSymbols-fr-NC","~$goog.i18n.DateTimeSymbols_br_FR","~$goog.i18n.DateTimeSymbols-en-SH","~$goog.i18n.DateTimeSymbols-jv-ID","~$goog.i18n.DateTimeSymbols_kkj","~$goog.i18n.DateTimeSymbols_bo","~$goog.i18n.DateTimeSymbols-fr-RE","~$goog.i18n.DateTimeSymbols_zh_Hans_HK","~$goog.i18n.DateTimeSymbols-to","~$goog.i18n.DateTimeSymbols_ru_BY","~$goog.i18n.DateTimeSymbols_ar_001","~$goog.i18n.DateTimeSymbols_se_NO","~$goog.i18n.DateTimeSymbols_en_PW","~$goog.i18n.DateTimeSymbols-haw-US","~$goog.i18n.DateTimeSymbols_es_CR","~$goog.i18n.DateTimeSymbols-ru-UA","~$goog.i18n.DateTimeSymbols_mfe_MU","~$goog.i18n.DateTimeSymbols_ff_Latn_SL","~$goog.i18n.DateTimeSymbols_es_AR","~$goog.i18n.DateTimeSymbols-tzm","~$goog.i18n.DateTimeSymbols-en-TV","~$goog.i18n.DateTimeSymbols_en_SX","~$goog.i18n.DateTimeSymbols-vai-Latn-LR","~$goog.i18n.DateTimeSymbols_kw_GB","~$goog.i18n.DateTimeSymbols_kok","~$goog.i18n.DateTimeSymbols-en-TT","~$goog.i18n.DateTimeSymbols-en-001","~$goog.i18n.DateTimeSymbols_en_ZW","~$goog.i18n.DateTimeSymbols-en-SL","~$goog.i18n.DateTimeSymbols-mfe-MU","~$goog.i18n.DateTimeSymbols_ar_IL","~$goog.i18n.DateTimeSymbols-es-HN","~$goog.i18n.DateTimeSymbols_jmc_TZ","~$goog.i18n.DateTimeSymbols-bs-Cyrl","~$goog.i18n.DateTimeSymbols_en_AT","~$goog.i18n.DateTimeSymbols-agq","~$goog.i18n.DateTimeSymbols-zh-Hant","~$goog.i18n.DateTimeSymbols_fr_BI","~$goog.i18n.DateTimeSymbols_os","~$goog.i18n.DateTimeSymbols_ku_TR","~$goog.i18n.DateTimeSymbols_fr_NC","~$goog.i18n.DateTimeSymbols-en-AT","~$goog.i18n.DateTimeSymbols_en_FI","~$goog.i18n.DateTimeSymbols-ar-XB","~$goog.i18n.DateTimeSymbols-kam-KE","~$goog.i18n.DateTimeSymbols-eu-ES","~$goog.i18n.DateTimeSymbols_en_MT","~$goog.i18n.DateTimeSymbols_tg_TJ","~$goog.i18n.DateTimeSymbols-pt-TL","~$goog.i18n.DateTimeSymbols_yi","~$goog.i18n.DateTimeSymbols-gsw-FR","~$goog.i18n.DateTimeSymbols_rof","~$goog.i18n.DateTimeSymbols_zgh","~$goog.i18n.DateTimeSymbols-be-BY","~$goog.i18n.DateTimeSymbols_ii_CN","~$goog.i18n.DateTimeSymbols_sg","~$goog.i18n.DateTimeSymbols-zh-Hans","~$goog.i18n.DateTimeSymbols-br-FR","~$goog.i18n.DateTimeSymbols-fur","~$goog.i18n.DateTimeSymbols-en-MW","~$goog.i18n.DateTimeSymbols_lg_UG","~$goog.i18n.DateTimeSymbols_ff_Latn_CM","~$goog.i18n.DateTimeSymbols_sr_Cyrl","~$goog.i18n.DateTimeSymbols_am_ET","~$goog.i18n.DateTimeSymbols-twq-NE","~$goog.i18n.DateTimeSymbols-se-NO","~$goog.i18n.DateTimeSymbols-ar-KW","~$goog.i18n.DateTimeSymbols_chr_US","~$goog.i18n.DateTimeSymbols-es-SV","~$goog.i18n.DateTimeSymbols_ii","~$goog.i18n.DateTimeSymbols-sv-FI","~$goog.i18n.DateTimeSymbols_ses","~$goog.i18n.DateTimeSymbols_ia_001","~$goog.i18n.DateTimeSymbols-ur-IN","~$goog.i18n.DateTimeSymbols_en_VU","~$goog.i18n.DateTimeSymbols-mi-NZ","~$goog.i18n.DateTimeSymbols_fr_MU","~$goog.i18n.DateTimeSymbols_pt_GW","~$goog.i18n.DateTimeSymbols_ca_ES","~$goog.i18n.DateTimeSymbols_qu_BO","~$goog.i18n.DateTimeSymbols-es-PH","~$goog.i18n.DateTimeSymbols-en-NU","~$goog.i18n.DateTimeSymbols_gsw_CH","~$goog.i18n.DateTimeSymbols-bo","~$goog.i18n.DateTimeSymbols_en_SB","~$goog.i18n.DateTimeSymbols_gv_IM","~$goog.i18n.DateTimeSymbols_sr_Cyrl_BA","~$goog.i18n.DateTimeSymbols-pa-Arab-PK","~$goog.i18n.DateTimeSymbols-en-GY","~$goog.i18n.DateTimeSymbols-fr-RW","~$goog.i18n.DateTimeSymbols-da-DK","~$goog.i18n.DateTimeSymbols-zh-Hans-HK","~$goog.i18n.DateTimeSymbols-ku","~$goog.i18n.DateTimeSymbols-en-IM","~$goog.i18n.DateTimeSymbols_mr_IN","~$goog.i18n.DateTimeSymbols_rw","~$goog.i18n.DateTimeSymbols-mgh-MZ","~$goog.i18n.DateTimeSymbols_bm_ML","~$goog.i18n.DateTimeSymbols-en-TO","~$goog.i18n.DateTimeSymbols-ar-001","~$goog.i18n.DateTimeSymbols_fr_KM","~$goog.i18n.DateTimeSymbols_ki","~$goog.i18n.DateTimeSymbols-en-US-POSIX","~$goog.i18n.DateTimeSymbols_ln_CG","~$goog.i18n.DateTimeSymbols_nl_SR","~$goog.i18n.DateTimeSymbols-az-Cyrl","~$goog.i18n.DateTimeSymbols-yi-001","~$goog.i18n.DateTimeSymbols_zh_Hans_SG","~$goog.i18n.DateTimeSymbols_xog","~$goog.i18n.DateTimeSymbols-nl-NL","~$goog.i18n.DateTimeSymbols_xh","~$goog.i18n.DateTimeSymbols-ee-GH","~$goog.i18n.DateTimeSymbols_en_SZ","~$goog.i18n.DateTimeSymbols_sah_RU","~$goog.i18n.DateTimeSymbols-uz-Latn-UZ","~$goog.i18n.DateTimeSymbols-os","~$goog.i18n.DateTimeSymbols-vai","~$goog.i18n.DateTimeSymbols_en_RW","~$goog.i18n.DateTimeSymbols-ff-Latn-GW","~$goog.i18n.DateTimeSymbols-ar-BH","~$goog.i18n.DateTimeSymbols_lrc","~$goog.i18n.DateTimeSymbols-dje","~$goog.i18n.DateTimeSymbols-zh-Hans-MO","~$goog.i18n.DateTimeSymbols-ak","~$goog.i18n.DateTimeSymbols_en_IM","~$goog.i18n.DateTimeSymbols-fr-TG","~$goog.i18n.DateTimeSymbols-tr-TR","~$goog.i18n.DateTimeSymbols_luy","~$goog.i18n.DateTimeSymbols_pa_Arab","~$goog.i18n.DateTimeSymbols_en_ER","~$goog.i18n.DateTimeSymbols_fr_CD","~$goog.i18n.DateTimeSymbols_nl_BQ","~$goog.i18n.DateTimeSymbols_kea_CV","~$goog.i18n.DateTimeSymbols_uz_Latn_UZ","~$goog.i18n.DateTimeSymbols-fr-BI","~$goog.i18n.DateTimeSymbols-fr-SN","~$goog.i18n.DateTimeSymbols_mas_TZ","~$goog.i18n.DateTimeSymbols_ro_RO","~$goog.i18n.DateTimeSymbols-mas-TZ","~$goog.i18n.DateTimeSymbolsExt","~$goog.i18n.DateTimeSymbols-en-NR","~$goog.i18n.DateTimeSymbols_sq_MK","~$goog.i18n.DateTimeSymbols-en-SI","~$goog.i18n.DateTimeSymbols_lb","~$goog.i18n.DateTimeSymbols-ia-001","~$goog.i18n.DateTimeSymbols-luo","~$goog.i18n.DateTimeSymbols-wae","~$goog.i18n.DateTimeSymbols_ar_LY","~$goog.i18n.DateTimeSymbols_yo_NG","~$goog.i18n.DateTimeSymbols-hr-HR","~$goog.i18n.DateTimeSymbols-mgo-CM","~$goog.i18n.DateTimeSymbols_ckb","~$goog.i18n.DateTimeSymbols_ccp_BD","~$goog.i18n.DateTimeSymbols_wo_SN","~$goog.i18n.DateTimeSymbols-en-ZM","~$goog.i18n.DateTimeSymbols-en-BB","~$goog.i18n.DateTimeSymbols_en_MY","~$goog.i18n.DateTimeSymbols_en_ZM","~$goog.i18n.DateTimeSymbols-pt-MZ","~$goog.i18n.DateTimeSymbols-af-NA","~$goog.i18n.DateTimeSymbols-ar-OM","~$goog.i18n.DateTimeSymbols-en-VU","~$goog.i18n.DateTimeSymbols_ff_Latn","~$goog.i18n.DateTimeSymbols-nb-SJ","~$goog.i18n.DateTimeSymbols-fr-DZ","~$goog.i18n.DateTimeSymbols_es_IC","~$goog.i18n.DateTimeSymbols-hsb","~$goog.i18n.DateTimeSymbols-mua","~$goog.i18n.DateTimeSymbols_fr_BL","~$goog.i18n.DateTimeSymbols-en-MP","~$goog.i18n.DateTimeSymbols-ar-MA","~$goog.i18n.DateTimeSymbols-ca-IT","~$goog.i18n.DateTimeSymbols-ki","~$goog.i18n.DateTimeSymbols_rwk","~$goog.i18n.DateTimeSymbols_pa_Arab_PK","~$goog.i18n.DateTimeSymbols-en-CC","~$goog.i18n.DateTimeSymbols_ak_GH","~$goog.i18n.DateTimeSymbols_ses_ML","~$goog.i18n.DateTimeSymbols_ha","~$goog.i18n.DateTimeSymbols-ar-AE","~$goog.i18n.DateTimeSymbols-fr-ML","~$goog.i18n.DateTimeSymbols_ar_YE","~$goog.i18n.DateTimeSymbols_guz","~$goog.i18n.DateTimeSymbols_nd","~$goog.i18n.DateTimeSymbols_asa","~$goog.i18n.DateTimeSymbols-ar-IL","~$goog.i18n.DateTimeSymbols-ar-KM","~$goog.i18n.DateTimeSymbols_ug","~$goog.i18n.DateTimeSymbols-es-CR","~$goog.i18n.DateTimeSymbols_fa_IR","~$goog.i18n.DateTimeSymbols_en_VC","~$goog.i18n.DateTimeSymbols-saq","~$goog.i18n.DateTimeSymbols-mk-MK","~$goog.i18n.DateTimeSymbols-lt-LT","~$goog.i18n.DateTimeSymbols-ar-LY","~$goog.i18n.DateTimeSymbols_mfe","~$goog.i18n.DateTimeSymbols_de_BE","~$goog.i18n.DateTimeSymbols-gl-ES","~$goog.i18n.DateTimeSymbols-bez-TZ","~$goog.i18n.DateTimeSymbols_ar_SS","~$goog.i18n.DateTimeSymbols-sv-SE","~$goog.i18n.DateTimeSymbols_es_CL","~$goog.i18n.DateTimeSymbols_te_IN","~$goog.i18n.DateTimeSymbols-naq","~$goog.i18n.DateTimeSymbols_sk_SK","~$goog.i18n.DateTimeSymbols_lb_LU","~$goog.i18n.DateTimeSymbols-xog-UG","~$goog.i18n.DateTimeSymbols_az_Latn","~$goog.i18n.DateTimeSymbols-gv","~$goog.i18n.DateTimeSymbols_mas","~$goog.i18n.DateTimeSymbols_fr_GP","~$goog.i18n.DateTimeSymbols-sw-KE","~$goog.i18n.DateTimeSymbols_ff_Latn_LR","~$goog.i18n.DateTimeSymbols_teo","~$goog.i18n.DateTimeSymbols_shi_Tfng_MA","~$goog.i18n.DateTimeSymbols_en_MH","~$goog.i18n.DateTimeSymbols_en_VI","~$goog.i18n.DateTimeSymbols-seh","~$goog.i18n.DateTimeSymbols_tg","~$goog.i18n.DateTimeSymbols_ln_CF","~$goog.i18n.DateTimeSymbols-mgo","~$goog.i18n.DateTimeSymbols-es-BR","~$goog.i18n.DateTimeSymbols-es-NI","~$goog.i18n.DateTimeSymbols-en-KN","~$goog.i18n.DateTimeSymbols_nn_NO","~$goog.i18n.DateTimeSymbols_nl_AW","~$goog.i18n.DateTimeSymbols_bem","~$goog.i18n.DateTimeSymbols-pt-CH","~$goog.i18n.DateTimeSymbols_zu_ZA","~$goog.i18n.DateTimeSymbols-rof-TZ","~$goog.i18n.DateTimeSymbols-ff-Latn-GN","~$goog.i18n.DateTimeSymbols_it_IT","~$goog.i18n.DateTimeSymbols_nn","~$goog.i18n.DateTimeSymbols-lu-CD","~$goog.i18n.DateTimeSymbols_ak","~$goog.i18n.DateTimeSymbols_gu_IN","~$goog.i18n.DateTimeSymbols-ms-SG","~$goog.i18n.DateTimeSymbols_cy_GB","~$goog.i18n.DateTimeSymbols-ps-PK","~$goog.i18n.DateTimeSymbols_en_BZ","~$goog.i18n.DateTimeSymbols-cgg","~$goog.i18n.DateTimeSymbols-en-SX","~$goog.i18n.DateTimeSymbols-en-150","~$goog.i18n.DateTimeSymbols-nl-SX","~$goog.i18n.DateTimeSymbols-ks","~$goog.i18n.DateTimeSymbols_en_BE","~$goog.i18n.DateTimeSymbols_luo_KE","~$goog.i18n.DateTimeSymbols_mzn_IR","~$goog.i18n.DateTimeSymbols_ff_Latn_BF","~$goog.i18n.DateTimeSymbols-en-GG","~$goog.i18n.DateTimeSymbols-ka-GE","~$goog.i18n.DateTimeSymbols-en-AI","~$goog.i18n.DateTimeSymbols-vun-TZ","~$goog.i18n.DateTimeSymbols-nn-NO","~$goog.i18n.DateTimeSymbols_ff_Latn_NE","~$goog.i18n.DateTimeSymbols_ff_Latn_GH","~$goog.i18n.DateTimeSymbols-en-HK","~$goog.i18n.DateTimeSymbols_fil_PH","~$goog.i18n.DateTimeSymbols_nd_ZW","~$goog.i18n.DateTimeSymbols-en-SS","~$goog.i18n.DateTimeSymbols_luy_KE","~$goog.i18n.DateTimeSymbols-fr-GQ","~$goog.i18n.DateTimeSymbols-mi","~$goog.i18n.DateTimeSymbols_ca_FR","~$goog.i18n.DateTimeSymbols_fr_CM","~$goog.i18n.DateTimeSymbols-kn-IN","~$goog.i18n.DateTimeSymbols_fr_MR","~$goog.i18n.DateTimeSymbols-uz-Cyrl","~$goog.i18n.DateTimeSymbols_rn_BI","~$goog.i18n.DateTimeSymbols-dyo-SN","~$goog.i18n.DateTimeSymbols-bez","~$goog.i18n.DateTimeSymbols-gsw-LI","~$goog.i18n.DateTimeSymbols_zh_Hans_CN","~$goog.i18n.DateTimeSymbols-as-IN","~$goog.i18n.DateTimeSymbols-shi-Tfng","~$goog.i18n.DateTimeSymbols_pt_LU","~$goog.i18n.DateTimeSymbols_nus","~$goog.i18n.DateTimeSymbols-ar-JO","~$goog.i18n.DateTimeSymbols_ceb_PH","~$goog.i18n.DateTimeSymbols_de_LI","~$goog.i18n.DateTimeSymbols_es_PA","~$goog.i18n.DateTimeSymbols-ksh-DE","~$goog.i18n.DateTimeSymbols_en_BW","~$goog.i18n.DateTimeSymbols_jgo_CM","~$goog.i18n.DateTimeSymbols-bem","~$goog.i18n.DateTimeSymbols-es-VE","~$goog.i18n.DateTimeSymbols-tg-TJ","~$goog.i18n.DateTimeSymbols_dua","~$goog.i18n.DateTimeSymbols-sn-ZW","~$goog.i18n.DateTimeSymbols-ar-QA","~$goog.i18n.DateTimeSymbols_zh_Hant_MO","~$goog.i18n.DateTimeSymbols_en_KN","~$goog.i18n.DateTimeSymbols_tzm_MA","~$goog.i18n.DateTimeSymbols_fr_TG","~$goog.i18n.DateTimeSymbols-nn","~$goog.i18n.DateTimeSymbols_nyn","~$goog.i18n.DateTimeSymbols_en_PH","~$goog.i18n.DateTimeSymbols_en_PN","~$goog.i18n.DateTimeSymbols-kab-DZ","~$goog.i18n.DateTimeSymbols_en_HK","~$goog.i18n.DateTimeSymbols-ta-MY","~$goog.i18n.DateTimeSymbols-ko-KR","~$goog.i18n.DateTimeSymbols_en_NU","~$goog.i18n.DateTimeSymbols_en_PR","~$goog.i18n.DateTimeSymbols_en_NG","~$goog.i18n.DateTimeSymbols-shi-Latn-MA","~$goog.i18n.DateTimeSymbols_en_SH","~$goog.i18n.DateTimeSymbols_lo_LA","~$goog.i18n.DateTimeSymbols_fr_GA","~$goog.i18n.DateTimeSymbols-de-LI","~$goog.i18n.DateTimeSymbols_sah","~$goog.i18n.DateTimeSymbols-kln-KE","~$goog.i18n.DateTimeSymbols-da-GL","~$goog.i18n.DateTimeSymbols-dav","~$goog.i18n.DateTimeSymbols_es_EA","~$goog.i18n.DateTimeSymbols_en_001","~$goog.i18n.DateTimeSymbols_as","~$goog.i18n.DateTimeSymbols-vun","~$goog.i18n.DateTimeSymbols-th-TH","~$goog.i18n.DateTimeSymbols-twq","~$goog.i18n.DateTimeSymbols-asa-TZ","~$goog.i18n.DateTimeSymbols-ha-GH","~$goog.i18n.DateTimeSymbols-ug-CN","~$goog.i18n.DateTimeSymbols-so-KE","~$goog.i18n.DateTimeSymbols_es_VE","~$goog.i18n.DateTimeSymbols_en_PK","~$goog.i18n.DateTimeSymbols_en_MS","~$goog.i18n.DateTimeSymbols-sr-Cyrl","~$goog.i18n.DateTimeSymbols-az-Cyrl-AZ","~$goog.i18n.DateTimeSymbols_fa_AF","~$goog.i18n.DateTimeSymbols_kn_IN","~$goog.i18n.DateTimeSymbols-en-BE","~$goog.i18n.DateTimeSymbols_lrc_IQ","~$goog.i18n.DateTimeSymbols-teo","~$goog.i18n.DateTimeSymbols-fr-CH","~$goog.i18n.DateTimeSymbols-os-GE","~$goog.i18n.DateTimeSymbols-en-MY","~$goog.i18n.DateTimeSymbols-ff-Latn","~$goog.i18n.DateTimeSymbols-ast","~$goog.i18n.DateTimeSymbols-ar-PS","~$goog.i18n.DateTimeSymbols_ky_KG","~$goog.i18n.DateTimeSymbols_en_GM","~$goog.i18n.DateTimeSymbols_so_ET","~$goog.i18n.DateTimeSymbols-sr-Latn-RS","~$goog.i18n.DateTimeSymbols-ar-EH","~$goog.i18n.DateTimeSymbols_ff_Latn_GW","~$goog.i18n.DateTimeSymbols-it-IT","~$goog.i18n.DateTimeSymbols-luo-KE","~$goog.i18n.DateTimeSymbols-ar-SD","~$goog.i18n.DateTimeSymbols_en_GI","~$goog.i18n.DateTimeSymbols_es_BO","~$goog.i18n.DateTimeSymbols_om_KE","~$goog.i18n.DateTimeSymbols-tg","~$goog.i18n.DateTimeSymbols_nl_CW","~$goog.i18n.DateTimeSymbols_ti_ER","~$goog.i18n.DateTimeSymbols_sw_KE","~$goog.i18n.DateTimeSymbols_en_BM","~$goog.i18n.DateTimeSymbols_en_MW","~$goog.i18n.DateTimeSymbols-naq-NA","~$goog.i18n.DateTimeSymbols_en_LS","~$goog.i18n.DateTimeSymbols-en-DG","~$goog.i18n.DateTimeSymbols-eo","~$goog.i18n.DateTimeSymbols_rwk_TZ","~$goog.i18n.DateTimeSymbols-hi-IN","~$goog.i18n.DateTimeSymbols_ckb_IQ","~$goog.i18n.DateTimeSymbols-en-PG","~$goog.i18n.DateTimeSymbols-ar-SO","~$goog.i18n.DateTimeSymbols-en-IL","~$goog.i18n.DateTimeSymbols_ne_NP","~$goog.i18n.DateTimeSymbols-bem-ZM","~$goog.i18n.DateTimeSymbols-ewo-CM","~$goog.i18n.DateTimeSymbols-cs-CZ","~$goog.i18n.DateTimeSymbols_en_MG","~$goog.i18n.DateTimeSymbols_zh_Hant_TW","~$goog.i18n.DateTimeSymbols-nl-BQ","~$goog.i18n.DateTimeSymbols_fr_DZ","~$goog.i18n.DateTimeSymbols_or_IN","~$goog.i18n.DateTimeSymbols_ru_KZ","~$goog.i18n.DateTimeSymbols_ar_SA","~$goog.i18n.DateTimeSymbols_dyo_SN","~$goog.i18n.DateTimeSymbols_yue_Hans_CN","~$goog.i18n.DateTimeSymbols_mua","~$goog.i18n.DateTimeSymbols_bas_CM","~$goog.i18n.DateTimeSymbols-mzn","~$goog.i18n.DateTimeSymbols-id-ID","~$goog.i18n.DateTimeSymbols-jv","~$goog.i18n.DateTimeSymbols-rwk-TZ","~$goog.i18n.DateTimeSymbols-en-PN","~$goog.i18n.DateTimeSymbols-en-BS","~$goog.i18n.DateTimeSymbols-ar-TD","~$goog.i18n.DateTimeSymbols_ast_ES","~$goog.i18n.DateTimeSymbols_fr_SN","~$goog.i18n.DateTimeSymbols-bs-Latn","~$goog.i18n.DateTimeSymbols_kea","~$goog.i18n.DateTimeSymbols_en_PG","~$goog.i18n.DateTimeSymbols-en-UG","~$goog.i18n.DateTimeSymbols-tr-CY","~$goog.i18n.DateTimeSymbols_sbp","~$goog.i18n.DateTimeSymbols-el-CY","~$goog.i18n.DateTimeSymbols-ff-Latn-NG","~$goog.i18n.DateTimeSymbols_nl_NL","~$goog.i18n.DateTimeSymbols_bo_CN","~$goog.i18n.DateTimeSymbols_ar_KW","~$goog.i18n.DateTimeSymbols-sr-Latn-XK","~$goog.i18n.DateTimeSymbols-rof","~$goog.i18n.DateTimeSymbols-as","~$goog.i18n.DateTimeSymbols-en-ER","~$goog.i18n.DateTimeSymbols-lo-LA","~$goog.i18n.DateTimeSymbols-ln-CD","~$goog.i18n.DateTimeSymbols-fr-MU","~$goog.i18n.DateTimeSymbols-ewo","~$goog.i18n.DateTimeSymbols_he_IL","~$goog.i18n.DateTimeSymbols-ha-NG","~$goog.i18n.DateTimeSymbols-en-SD","~$goog.i18n.DateTimeSymbols-lag","~$goog.i18n.DateTimeSymbols_ka_GE","~$goog.i18n.DateTimeSymbols-ce","~$goog.i18n.DateTimeSymbols_en_LC","~$goog.i18n.DateTimeSymbols-jmc","~$goog.i18n.DateTimeSymbols-en-BM","~$goog.i18n.DateTimeSymbols-pt-AO","~$goog.i18n.DateTimeSymbols-ckb-IR","~$goog.i18n.DateTimeSymbols_ckb_IR","~$goog.i18n.DateTimeSymbols_ta_IN","~$goog.i18n.DateTimeSymbols-xh","~$goog.i18n.DateTimeSymbols-smn","~$goog.i18n.DateTimeSymbols-ky-KG","~$goog.i18n.DateTimeSymbols-sv-AX","~$goog.i18n.DateTimeSymbols_nl_BE","~$goog.i18n.DateTimeSymbols_en_KI","~$goog.i18n.DateTimeSymbols_en_SE","~$goog.i18n.DateTimeSymbols_bg_BG","~$goog.i18n.DateTimeSymbols-ksb-TZ","~$goog.i18n.DateTimeSymbols_bs_Latn","~$goog.i18n.DateTimeSymbols-es-UY","~$goog.i18n.DateTimeSymbols_es_EC","~$goog.i18n.DateTimeSymbols-sah","~$goog.i18n.DateTimeSymbols-ro-RO","~$goog.i18n.DateTimeSymbols-en-BI","~$goog.i18n.DateTimeSymbols_tt","~$goog.i18n.DateTimeSymbols-uz-Latn","~$goog.i18n.DateTimeSymbols-en-AG","~$goog.i18n.DateTimeSymbols_ha_GH","~$goog.i18n.DateTimeSymbols-ksh","~$goog.i18n.DateTimeSymbols-en-CK","~$goog.i18n.DateTimeSymbols_yue_Hant","~$goog.i18n.DateTimeSymbols_ks","~$goog.i18n.DateTimeSymbols_pl_PL","~$goog.i18n.DateTimeSymbols_ff_Latn_GM","~$goog.i18n.DateTimeSymbols-ff-Latn-LR","~$goog.i18n.DateTimeSymbols-fo-DK","~$goog.i18n.DateTimeSymbols_gsw_FR","~$goog.i18n.DateTimeSymbols_ar_TN","~$goog.i18n.DateTimeSymbols-kok","~$goog.i18n.DateTimeSymbols_en_NZ","~$goog.i18n.DateTimeSymbols_uz_Arab","~$goog.i18n.DateTimeSymbols-ko-KP","~$goog.i18n.DateTimeSymbols_sbp_TZ","~$goog.i18n.DateTimeSymbols-yo-BJ","~$goog.i18n.DateTimeSymbols_ar_BH","~$goog.i18n.DateTimeSymbols_so_KE","~$goog.i18n.DateTimeSymbols-es-EA","~$goog.i18n.DateTimeSymbols-ne-NP","~$goog.i18n.DateTimeSymbols_en_JM","~$goog.i18n.DateTimeSymbols_dsb","~$goog.i18n.DateTimeSymbols_sr_Cyrl_ME","~$goog.i18n.DateTimeSymbols_os_GE","~$goog.i18n.DateTimeSymbols-sr-Cyrl-BA","~$goog.i18n.DateTimeSymbols_cgg_UG","~$goog.i18n.DateTimeSymbols_es_GQ","~$goog.i18n.DateTimeSymbols_mas_KE","~$goog.i18n.DateTimeSymbols-ku-TR","~$goog.i18n.DateTimeSymbols_lt_LT","~$goog.i18n.DateTimeSymbols_nl_SX","~$goog.i18n.DateTimeSymbols-af-ZA","~$goog.i18n.DateTimeSymbols-en-TK","~$goog.i18n.DateTimeSymbols_se","~$goog.i18n.DateTimeSymbols_ti_ET","~$goog.i18n.DateTimeSymbols-mfe","~$goog.i18n.DateTimeSymbols_tk_TM","~$goog.i18n.DateTimeSymbols_ar_SD","~$goog.i18n.DateTimeSymbols-en-FJ","~$goog.i18n.DateTimeSymbols_ms_SG","~$goog.i18n.DateTimeSymbols_en_LR","~$goog.i18n.DateTimeSymbols_om","~$goog.i18n.DateTimeSymbols-ebu","~$goog.i18n.DateTimeSymbols-en-KY","~$goog.i18n.DateTimeSymbols-bs-Cyrl-BA","~$goog.i18n.DateTimeSymbols-fr-NE","~$goog.i18n.DateTimeSymbols_yue_Hans","~$goog.i18n.DateTimeSymbols_mt_MT","~$goog.i18n.DateTimeSymbols-sr-Latn-ME","~$goog.i18n.DateTimeSymbols-uk-UA"]],"^X",true,"^Y",["^Z","^=C"]],["^ ","^[",[1579837703000],"^10","goog.dom.browserrange.browserrange.js","^11",["^12","goog/dom/browserrange/browserrange.js"],"^13","goog/dom/browserrange/browserrange.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the browser range namespace and interface, as\n * well as several useful utility functions.\n *\n * DO NOT USE THIS FILE DIRECTLY.  Use goog.dom.Range instead.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.dom.browserrange');\ngoog.provide('goog.dom.browserrange.Error');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.BrowserFeature');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.browserrange.GeckoRange');\ngoog.require('goog.dom.browserrange.IeRange');\ngoog.require('goog.dom.browserrange.OperaRange');\ngoog.require('goog.dom.browserrange.W3cRange');\ngoog.require('goog.dom.browserrange.WebKitRange');\ngoog.require('goog.userAgent');\n\n\n/**\n * Common error constants.\n * @enum {string}\n */\ngoog.dom.browserrange.Error = {\n  NOT_IMPLEMENTED: 'Not Implemented'\n};\n\n\n// NOTE(robbyw): While it would be nice to eliminate the duplicate switches\n//               below, doing so uncovers bugs in the JsCompiler in which\n//               necessary code is stripped out.\n\n\n/**\n * Static method that returns the proper type of browser range.\n * @param {Range|TextRange} range A browser range object.\n * @return {!goog.dom.browserrange.AbstractRange} A wrapper object.\n */\ngoog.dom.browserrange.createRange = function(range) {\n  if (goog.dom.BrowserFeature.LEGACY_IE_RANGES) {\n    return new goog.dom.browserrange.IeRange(\n        /** @type {TextRange} */ (range),\n        goog.dom.getOwnerDocument(range.parentElement()));\n  } else if (goog.userAgent.WEBKIT) {\n    return new goog.dom.browserrange.WebKitRange(\n        /** @type {Range} */ (range));\n  } else if (goog.userAgent.GECKO) {\n    return new goog.dom.browserrange.GeckoRange(\n        /** @type {Range} */ (range));\n  } else if (goog.userAgent.OPERA) {\n    return new goog.dom.browserrange.OperaRange(\n        /** @type {Range} */ (range));\n  } else {\n    // Default other browsers, including Opera, to W3c ranges.\n    return new goog.dom.browserrange.W3cRange(\n        /** @type {Range} */ (range));\n  }\n};\n\n\n/**\n * Static method that returns the proper type of browser range.\n * @param {Node} node The node to select.\n * @return {!goog.dom.browserrange.AbstractRange} A wrapper object.\n */\ngoog.dom.browserrange.createRangeFromNodeContents = function(node) {\n  if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) {\n    return goog.dom.browserrange.IeRange.createFromNodeContents(node);\n  } else if (goog.userAgent.WEBKIT) {\n    return goog.dom.browserrange.WebKitRange.createFromNodeContents(node);\n  } else if (goog.userAgent.GECKO) {\n    return goog.dom.browserrange.GeckoRange.createFromNodeContents(node);\n  } else if (goog.userAgent.OPERA) {\n    return goog.dom.browserrange.OperaRange.createFromNodeContents(node);\n  } else {\n    // Default other browsers to W3c ranges.\n    return goog.dom.browserrange.W3cRange.createFromNodeContents(node);\n  }\n};\n\n\n/**\n * Static method that returns the proper type of browser range.\n * @param {Node} startNode The node to start with.\n * @param {number} startOffset The offset within the node to start.  This is\n *     either the index into the childNodes array for element startNodes or\n *     the index into the character array for text startNodes.\n * @param {Node} endNode The node to end with.\n * @param {number} endOffset The offset within the node to end.  This is\n *     either the index into the childNodes array for element endNodes or\n *     the index into the character array for text endNodes.\n * @return {!goog.dom.browserrange.AbstractRange} A wrapper object.\n */\ngoog.dom.browserrange.createRangeFromNodes = function(\n    startNode, startOffset, endNode, endOffset) {\n  if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) {\n    return goog.dom.browserrange.IeRange.createFromNodes(\n        startNode, startOffset, endNode, endOffset);\n  } else if (goog.userAgent.WEBKIT) {\n    return goog.dom.browserrange.WebKitRange.createFromNodes(\n        startNode, startOffset, endNode, endOffset);\n  } else if (goog.userAgent.GECKO) {\n    return goog.dom.browserrange.GeckoRange.createFromNodes(\n        startNode, startOffset, endNode, endOffset);\n  } else if (goog.userAgent.OPERA) {\n    return goog.dom.browserrange.OperaRange.createFromNodes(\n        startNode, startOffset, endNode, endOffset);\n  } else {\n    // Default other browsers to W3c ranges.\n    return goog.dom.browserrange.W3cRange.createFromNodes(\n        startNode, startOffset, endNode, endOffset);\n  }\n};\n\n\n/**\n * Tests whether the given node can contain a range end point.\n * @param {Node} node The node to check.\n * @return {boolean} Whether the given node can contain a range end point.\n */\ngoog.dom.browserrange.canContainRangeEndpoint = function(node) {\n  // NOTE(user, bloom): This is not complete, as divs with style -\n  // 'display:inline-block' or 'position:absolute' can also not contain range\n  // endpoints. A more complete check is to see if that element can be partially\n  // selected (can be container) or not.\n  return goog.dom.canHaveChildren(node) ||\n      node.nodeType == goog.dom.NodeType.TEXT;\n};\n","^17",1579837703000,"^18",["^19",["~$goog.dom.BrowserFeature","^1T","^3G","~$goog.dom.browserrange.WebKitRange","~$goog.dom.browserrange.W3cRange","^Z","^2X","~$goog.dom.browserrange.OperaRange","~$goog.dom.browserrange.GeckoRange","~$goog.dom.browserrange.IeRange"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/browserrange/browserrange.js"],"^1J",["^19",["^3T","~$goog.dom.browserrange.Error"]],"^X",true,"^Y",["^Z","^1T","^[3","^3G","^[7","^[8","^[6","^[5","^[4","^2X"]],["^ ","^[",[1579837703000],"^10","goog.net.streams.pbstreamparser.js","^11",["^12","goog/net/streams/pbstreamparser.js"],"^13","goog/net/streams/pbstreamparser.js","^14","^15","^16","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The default Protobuf stream parser.\n *\n * The default Protobuf parser decodes the input stream (binary) under the\n * following rules:\n * 1. The data stream as a whole represents a valid proto message,\n *    defined as following:\n *\n *    message StreamBody {\n *      repeated bytes messages = 1;\n *      google.rpc.Status status = 2;\n *      repeated bytes padding = 15;\n *    }\n *\n *    Padding are noop messages may be generated as base64 padding (for\n *    browsers) or as a way to keep the connection alive. Its tag-id is\n *    reserved as the maximum value allowed for a single-byte tag-id.\n *\n * 2. The only things that are significant to this parser in the above\n *    definition are the specification of the tag ids and wire types (all fields\n *    having length-delimited wire type). The parser doesn't fail if status\n *    appears more than once, i.e. the validity of StreamBody (other than tag\n *    ids and wire types) is not checked.\n *\n * 3. The wire format looks like:\n *\n *    (<tag-id> <wire-type> <length> <message-bytes>)... EOF\n *\n *    For details of Protobuf wire format see\n *    https://developers.google.com/protocol-buffers/docs/encoding\n *\n *    A message with unknown tag or with length larger than 2^32 - 1 will\n *    invalidate the whole stream.\n *\n * 4. All decoded messages and status in the buffer will be delivered in\n *    a batch (array), with each constructed as {tag-id: opaque-byte-array}.\n *    No-op data, e.g. padding, will be immediately discarded.\n *\n * 5. If a high-level API does not support batch delivery (e.g. grpc), then\n *    a wrapper is expected to deliver individual message separately in order.\n */\n\ngoog.provide('goog.net.streams.PbStreamParser');\n\ngoog.require('goog.asserts');\ngoog.require('goog.net.streams.StreamParser');\n\n/**\n * The default Protobuf stream parser.\n *\n * @constructor\n * @struct\n * @implements {goog.net.streams.StreamParser}\n * @final\n */\ngoog.net.streams.PbStreamParser = function() {\n  /**\n   * The current error message, if any.\n   * @private {?string}\n   */\n  this.errorMessage_ = null;\n\n  /**\n   * The currently buffered result (parsed messages).\n   * @private {!Array<!Object>}\n   */\n  this.result_ = [];\n\n  /**\n   * The current position in the streamed data.\n   * @private {number}\n   */\n  this.streamPos_ = 0;\n\n  /**\n   * The current parser state.\n   * @private {goog.net.streams.PbStreamParser.State_}\n   */\n  this.state_ = goog.net.streams.PbStreamParser.State_.INIT;\n\n  /**\n   * The tag of the proto message being parsed.\n   * @private {number}\n   */\n  this.tag_ = 0;\n\n  /**\n   * The length of the proto message being parsed.\n   * @private {number}\n   */\n  this.length_ = 0;\n\n  /**\n   * Count of processed length bytes.\n   * @private {number}\n   */\n  this.countLengthBytes_ = 0;\n\n  /**\n   * Raw bytes of the current message. Uses Uint8Array by default. Falls back to\n   * native array when Uint8Array is unsupported.\n   * @private {?Uint8Array|?Array<number>}\n   */\n  this.messageBuffer_ = null;\n\n  /**\n   * Count of processed message bytes.\n   * @private {number}\n   */\n  this.countMessageBytes_ = 0;\n};\n\n\n/**\n * The parser state.\n * @private @enum {number}\n */\ngoog.net.streams.PbStreamParser.State_ = {\n  INIT: 0,     // expecting the tag:wire-type byte\n  LENGTH: 1,   // expecting more varint bytes of length\n  MESSAGE: 2,  // expecting more message bytes\n  INVALID: 3\n};\n\n\n/**\n * Tag of padding messages.\n * @private @const {number}\n */\ngoog.net.streams.PbStreamParser.PADDING_TAG_ = 15;\n\n\n/**\n * @override\n */\ngoog.net.streams.PbStreamParser.prototype.isInputValid = function() {\n  return this.state_ != goog.net.streams.PbStreamParser.State_.INVALID;\n};\n\n\n/**\n * @override\n */\ngoog.net.streams.PbStreamParser.prototype.getErrorMessage = function() {\n  return this.errorMessage_;\n};\n\n\n/**\n * @param {!Uint8Array|!Array<number>} inputBytes The current input buffer\n * @param {number} pos The position in the current input that triggers the error\n * @param {string} errorMsg Additional error message\n * @throws {!Error} Throws an error indicating where the stream is broken\n * @private\n */\ngoog.net.streams.PbStreamParser.prototype.error_ = function(\n    inputBytes, pos, errorMsg) {\n  this.state_ = goog.net.streams.PbStreamParser.State_.INVALID;\n  this.errorMessage_ = 'The stream is broken @' + this.streamPos_ + '/' + pos +\n      '. ' +\n      'Error: ' + errorMsg + '. ' +\n      'With input:\\n' + inputBytes;\n  throw new Error(this.errorMessage_);\n};\n\n\n/**\n * @throws {!Error} Throws an error message if the input is invalid.\n * @override\n */\ngoog.net.streams.PbStreamParser.prototype.parse = function(input) {\n  goog.asserts.assert(input instanceof Array || input instanceof ArrayBuffer);\n\n  var parser = this;\n  var inputBytes = (input instanceof Array) ? input : new Uint8Array(input);\n  var pos = 0;\n\n  while (pos < inputBytes.length) {\n    switch (parser.state_) {\n      case goog.net.streams.PbStreamParser.State_.INVALID: {\n        parser.error_(inputBytes, pos, 'stream already broken');\n        break;\n      }\n      case goog.net.streams.PbStreamParser.State_.INIT: {\n        processTagByte(inputBytes[pos]);\n        break;\n      }\n      case goog.net.streams.PbStreamParser.State_.LENGTH: {\n        processLengthByte(inputBytes[pos]);\n        break;\n      }\n      case goog.net.streams.PbStreamParser.State_.MESSAGE: {\n        processMessageByte(inputBytes[pos]);\n        break;\n      }\n      default: {\n        throw new Error('unexpected parser state: ' + parser.state_);\n      }\n    }\n\n    parser.streamPos_++;\n    pos++;\n  }\n\n  var msgs = parser.result_;\n  parser.result_ = [];\n  return msgs.length > 0 ? msgs : null;\n\n  /**\n   * @param {number} b A tag byte to process\n   */\n  function processTagByte(b) {\n    if (b & 0x80) {\n      parser.error_(inputBytes, pos, 'invalid tag');\n    }\n\n    var wireType = b & 0x07;\n    if (wireType != 2) {\n      parser.error_(inputBytes, pos, 'invalid wire type');\n    }\n\n    parser.tag_ = b >>> 3;\n    if (parser.tag_ != 1 && parser.tag_ != 2 && parser.tag_ != 15) {\n      parser.error_(inputBytes, pos, 'unexpected tag');\n    }\n\n    parser.state_ = goog.net.streams.PbStreamParser.State_.LENGTH;\n    parser.length_ = 0;\n    parser.countLengthBytes_ = 0;\n  }\n\n  /**\n   * @param {number} b A length byte to process\n   */\n  function processLengthByte(b) {\n    parser.countLengthBytes_++;\n    if (parser.countLengthBytes_ == 5) {\n      if (b & 0xF0) {  // length will not fit in a 32-bit uint\n        parser.error_(inputBytes, pos, 'message length too long');\n      }\n    }\n    parser.length_ |= (b & 0x7F) << ((parser.countLengthBytes_ - 1) * 7);\n\n    if (!(b & 0x80)) {  // no more length byte\n      parser.state_ = goog.net.streams.PbStreamParser.State_.MESSAGE;\n      parser.countMessageBytes_ = 0;\n      if (typeof Uint8Array !== 'undefined') {\n        parser.messageBuffer_ = new Uint8Array(parser.length_);\n      } else {\n        parser.messageBuffer_ = new Array(parser.length_);\n      }\n\n      if (parser.length_ == 0) {  // empty message\n        finishMessage();\n      }\n    }\n  }\n\n  /**\n   * @param {number} b A message byte to process\n   */\n  function processMessageByte(b) {\n    parser.messageBuffer_[parser.countMessageBytes_++] = b;\n    if (parser.countMessageBytes_ == parser.length_) {\n      finishMessage();\n    }\n  }\n\n  /**\n   * Finishes up building the current message and resets parser state\n   */\n  function finishMessage() {\n    if (parser.tag_ < goog.net.streams.PbStreamParser.PADDING_TAG_) {\n      var message = {};\n      message[parser.tag_] = parser.messageBuffer_;\n      parser.result_.push(message);\n    }\n    parser.state_ = goog.net.streams.PbStreamParser.State_.INIT;\n  }\n};\n","^17",1579837703000,"^18",["^19",["^1S","^Z","^3;"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/streams/pbstreamparser.js"],"^1J",["^19",["~$goog.net.streams.PbStreamParser"]],"^X",true,"^Y",["^Z","^1S","^3;"]],["^ ","^[",[1579837703000],"^10","goog.testing.mockuseragent.js","^11",["^12","goog/testing/mockuseragent.js"],"^13","goog/testing/mockuseragent.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview MockUserAgent overrides goog.userAgent.getUserAgentString()\n *     depending on a specified configuration.\n *\n */\n\ngoog.setTestOnly('goog.testing.MockUserAgent');\ngoog.provide('goog.testing.MockUserAgent');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.labs.userAgent.util');\ngoog.require('goog.testing.PropertyReplacer');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Class for unit testing code that uses goog.userAgent.\n *\n * @extends {goog.Disposable}\n * @constructor\n * @final\n */\ngoog.testing.MockUserAgent = function() {\n  goog.Disposable.call(this);\n\n  /**\n   * Property replacer used to mock out User-Agent functions.\n   * @type {!goog.testing.PropertyReplacer}\n   * @private\n   */\n  this.propertyReplacer_ = new goog.testing.PropertyReplacer();\n\n  /**\n   * The userAgent string used by goog.userAgent.\n   * @type {?string}\n   * @private\n   */\n  this.userAgent_ = goog.userAgent.getUserAgentString();\n\n  /**\n   * The navigator object used by goog.userAgent\n   * @type {?Navigator}\n   * @private\n   */\n  this.navigator_ = goog.userAgent.getNavigatorTyped();\n\n  /**\n   * The documentMode number used by goog.userAgent\n   * @type {number|undefined}\n   * @private\n   */\n  this.documentMode_ = goog.userAgent.DOCUMENT_MODE;\n};\ngoog.inherits(goog.testing.MockUserAgent, goog.Disposable);\n\n\n/**\n * Whether this MockUserAgent has been installed.\n * @type {boolean}\n * @private\n */\ngoog.testing.MockUserAgent.prototype.installed_;\n\n\n/**\n * Installs this MockUserAgent.\n */\ngoog.testing.MockUserAgent.prototype.install = function() {\n  if (!this.installed_) {\n    // Stub out user agent functions.\n    this.propertyReplacer_.replace(\n        goog.userAgent, 'getUserAgentString',\n        goog.bind(this.getUserAgentString, this));\n\n    this.propertyReplacer_.replace(\n        goog.labs.userAgent.util, 'getUserAgent',\n        goog.bind(this.getUserAgentString, this));\n\n    // Stub out navigator functions.\n    this.propertyReplacer_.replace(\n        goog.userAgent, 'getNavigator', goog.bind(this.getNavigator, this));\n\n    // Stub out navigator functions.\n    this.propertyReplacer_.replace(\n        goog.userAgent, 'getNavigatorTyped',\n        goog.bind(this.getNavigator, this));\n\n    // Stub out documentMode functions.\n    this.propertyReplacer_.replace(\n        goog.userAgent, 'getDocumentMode_',\n        goog.bind(this.getDocumentMode, this));\n\n    this.propertyReplacer_.replace(\n        goog.userAgent, 'DOCUMENT_MODE', this.getDocumentMode());\n\n    this.installed_ = true;\n  }\n};\n\n\n/**\n * @return {?string} The userAgent set in this class.\n */\ngoog.testing.MockUserAgent.prototype.getUserAgentString = function() {\n  return this.userAgent_;\n};\n\n\n/**\n * @param {string} userAgent The desired userAgent string to use.\n */\ngoog.testing.MockUserAgent.prototype.setUserAgentString = function(userAgent) {\n  this.userAgent_ = userAgent;\n};\n\n\n/**\n * @return {?Object} The Navigator set in this class.\n */\ngoog.testing.MockUserAgent.prototype.getNavigator = function() {\n  return this.navigator_;\n};\n\n\n/**\n * @return {?Navigator} The Navigator set in this class.\n */\ngoog.testing.MockUserAgent.prototype.getNavigatorTyped = function() {\n  return this.navigator_;\n};\n\n/**\n * @param {Object} navigator The desired Navigator object to use.\n */\ngoog.testing.MockUserAgent.prototype.setNavigator = function(navigator) {\n  this.navigator_ = /** @type {?Navigator} */ (navigator);\n};\n\n/**\n * @return {number|undefined} The documentMode set in this class.\n */\ngoog.testing.MockUserAgent.prototype.getDocumentMode = function() {\n  return this.documentMode_;\n};\n\n/**\n * @param {number} documentMode The desired documentMode to use.\n */\ngoog.testing.MockUserAgent.prototype.setDocumentMode = function(documentMode) {\n  this.documentMode_ = documentMode;\n  this.propertyReplacer_.set(goog.userAgent, 'DOCUMENT_MODE', documentMode);\n};\n\n/**\n * Uninstalls the MockUserAgent.\n */\ngoog.testing.MockUserAgent.prototype.uninstall = function() {\n  if (this.installed_) {\n    this.propertyReplacer_.reset();\n    this.installed_ = false;\n  }\n\n};\n\n\n/** @override */\ngoog.testing.MockUserAgent.prototype.disposeInternal = function() {\n  this.uninstall();\n  delete this.propertyReplacer_;\n  delete this.navigator_;\n  delete this.documentMode_;\n  goog.testing.MockUserAgent.base(this, 'disposeInternal');\n};\n","^17",1579837703000,"^18",["^19",["^Z","^2X","^=3","^4K","^4U"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/mockuseragent.js"],"^1J",["^19",["~$goog.testing.MockUserAgent"]],"^X",true,"^Y",["^Z","^4K","^4U","^=3","^2X"]],["^ ","^[",[1579837703000],"^10","goog.dom.multirange.js","^11",["^12","goog/dom/multirange.js"],"^13","goog/dom/multirange.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for working with W3C multi-part ranges.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\n\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.dom.MultiRange');\ngoog.provide('goog.dom.MultiRangeIterator');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.AbstractMultiRange');\ngoog.require('goog.dom.AbstractRange');\ngoog.require('goog.dom.RangeIterator');\ngoog.require('goog.dom.RangeType');\ngoog.require('goog.dom.SavedRange');\ngoog.require('goog.dom.TextRange');\ngoog.require('goog.iter');\ngoog.require('goog.iter.StopIteration');\ngoog.require('goog.log');\n\n\n\n/**\n * Creates a new multi part range with no properties.  Do not use this\n * constructor: use one of the goog.dom.Range.createFrom* methods instead.\n * @constructor\n * @extends {goog.dom.AbstractMultiRange}\n * @final\n */\ngoog.dom.MultiRange = function() {\n  /**\n   * Logging object.\n   * @private {goog.log.Logger}\n   */\n  this.logger_ = goog.log.getLogger('goog.dom.MultiRange');\n\n  /**\n   * Array of browser sub-ranges comprising this multi-range.\n   * @private {Array<Range>}\n   */\n  this.browserRanges_ = [];\n\n  /**\n   * Lazily initialized array of range objects comprising this multi-range.\n   * @private {Array<goog.dom.TextRange>}\n   */\n  this.ranges_ = [];\n\n  /**\n   * Lazily computed sorted version of ranges_, sorted by start point.\n   * @private {Array<?goog.dom.TextRange>?}\n   */\n  this.sortedRanges_ = null;\n\n  /**\n   * Lazily computed container node.\n   * @private {?Node}\n   */\n  this.container_ = null;\n};\ngoog.inherits(goog.dom.MultiRange, goog.dom.AbstractMultiRange);\n\n\n/**\n * Creates a new range wrapper from the given browser selection object.  Do not\n * use this method directly - please use goog.dom.Range.createFrom* instead.\n * @param {Selection} selection The browser selection object.\n * @return {!goog.dom.MultiRange} A range wrapper object.\n */\ngoog.dom.MultiRange.createFromBrowserSelection = function(selection) {\n  var range = new goog.dom.MultiRange();\n  for (var i = 0, len = selection.rangeCount; i < len; i++) {\n    range.browserRanges_.push(selection.getRangeAt(i));\n  }\n  return range;\n};\n\n\n/**\n * Creates a new range wrapper from the given browser ranges.  Do not\n * use this method directly - please use goog.dom.Range.createFrom* instead.\n * @param {Array<Range>} browserRanges The browser ranges.\n * @return {!goog.dom.MultiRange} A range wrapper object.\n */\ngoog.dom.MultiRange.createFromBrowserRanges = function(browserRanges) {\n  var range = new goog.dom.MultiRange();\n  range.browserRanges_ = goog.array.clone(browserRanges);\n  return range;\n};\n\n\n/**\n * Creates a new range wrapper from the given goog.dom.TextRange objects.  Do\n * not use this method directly - please use goog.dom.Range.createFrom* instead.\n * @param {Array<goog.dom.TextRange>} textRanges The text range objects.\n * @return {!goog.dom.MultiRange} A range wrapper object.\n */\ngoog.dom.MultiRange.createFromTextRanges = function(textRanges) {\n  var range = new goog.dom.MultiRange();\n  range.ranges_ = textRanges;\n  range.browserRanges_ = goog.array.map(\n      textRanges, function(range) { return range.getBrowserRangeObject(); });\n  return range;\n};\n\n\n// Method implementations\n\n\n/**\n * Clears cached values.  Should be called whenever this.browserRanges_ is\n * modified.\n * @private\n */\ngoog.dom.MultiRange.prototype.clearCachedValues_ = function() {\n  this.ranges_ = [];\n  this.sortedRanges_ = null;\n  this.container_ = null;\n};\n\n\n/**\n * @return {!goog.dom.MultiRange} A clone of this range.\n * @override\n */\ngoog.dom.MultiRange.prototype.clone = function() {\n  return goog.dom.MultiRange.createFromBrowserRanges(this.browserRanges_);\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.getType = function() {\n  return goog.dom.RangeType.MULTI;\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.getBrowserRangeObject = function() {\n  // NOTE(robbyw): This method does not make sense for multi-ranges.\n  if (this.browserRanges_.length > 1) {\n    goog.log.warning(\n        this.logger_,\n        'getBrowserRangeObject called on MultiRange with more than 1 range');\n  }\n  return this.browserRanges_[0];\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.setBrowserRangeObject = function(nativeRange) {\n  // TODO(robbyw): Look in to adding setBrowserSelectionObject.\n  return false;\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.getTextRangeCount = function() {\n  return this.browserRanges_.length;\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.getTextRange = function(i) {\n  if (!this.ranges_[i]) {\n    this.ranges_[i] =\n        goog.dom.TextRange.createFromBrowserRange(this.browserRanges_[i]);\n  }\n  return this.ranges_[i];\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.getContainer = function() {\n  if (!this.container_) {\n    var nodes = [];\n    for (var i = 0, len = this.getTextRangeCount(); i < len; i++) {\n      nodes.push(this.getTextRange(i).getContainer());\n    }\n    this.container_ = goog.dom.findCommonAncestor.apply(null, nodes);\n  }\n  return this.container_;\n};\n\n\n/**\n * @return {!Array<goog.dom.TextRange>} An array of sub-ranges, sorted by start\n *     point.\n */\ngoog.dom.MultiRange.prototype.getSortedRanges = function() {\n  if (!this.sortedRanges_) {\n    this.sortedRanges_ = this.getTextRanges();\n    this.sortedRanges_.sort(function(a, b) {\n      var aStartNode = a.getStartNode();\n      var aStartOffset = a.getStartOffset();\n      var bStartNode = b.getStartNode();\n      var bStartOffset = b.getStartOffset();\n\n      if (aStartNode == bStartNode && aStartOffset == bStartOffset) {\n        return 0;\n      }\n\n      /**\n       * @suppress {missingRequire} Cannot depend on goog.dom.Range because\n       *     it creates a circular dependency.\n       */\n      return goog.dom.Range.isReversed(\n                 aStartNode, aStartOffset, bStartNode, bStartOffset) ?\n          1 :\n          -1;\n    });\n  }\n  return this.sortedRanges_;\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.getStartNode = function() {\n  return this.getSortedRanges()[0].getStartNode();\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.getStartOffset = function() {\n  return this.getSortedRanges()[0].getStartOffset();\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.getEndNode = function() {\n  // NOTE(robbyw): This may return the wrong node if any subranges overlap.\n  return goog.array.peek(this.getSortedRanges()).getEndNode();\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.getEndOffset = function() {\n  // NOTE(robbyw): This may return the wrong value if any subranges overlap.\n  return goog.array.peek(this.getSortedRanges()).getEndOffset();\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.isRangeInDocument = function() {\n  return goog.array.every(this.getTextRanges(), function(range) {\n    return range.isRangeInDocument();\n  });\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.isCollapsed = function() {\n  return this.browserRanges_.length == 0 ||\n      this.browserRanges_.length == 1 && this.getTextRange(0).isCollapsed();\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.getText = function() {\n  return goog.array\n      .map(this.getTextRanges(), function(range) { return range.getText(); })\n      .join('');\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.getHtmlFragment = function() {\n  return this.getValidHtml();\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.getValidHtml = function() {\n  // NOTE(robbyw): This does not behave well if the sub-ranges overlap.\n  return goog.array\n      .map(\n          this.getTextRanges(),\n          function(range) { return range.getValidHtml(); })\n      .join('');\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.getPastableHtml = function() {\n  // TODO(robbyw): This should probably do something smart like group TR and TD\n  // selections in to the same table.\n  return this.getValidHtml();\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.__iterator__ = function(opt_keys) {\n  return new goog.dom.MultiRangeIterator(this);\n};\n\n\n// RANGE ACTIONS\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.select = function() {\n  var selection =\n      goog.dom.AbstractRange.getBrowserSelectionForWindow(this.getWindow());\n  selection.removeAllRanges();\n  for (var i = 0, len = this.getTextRangeCount(); i < len; i++) {\n    selection.addRange(this.getTextRange(i).getBrowserRangeObject());\n  }\n};\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.removeContents = function() {\n  goog.array.forEach(\n      this.getTextRanges(), function(range) { range.removeContents(); });\n};\n\n\n// SAVE/RESTORE\n\n\n/** @override */\ngoog.dom.MultiRange.prototype.saveUsingDom = function() {\n  return new goog.dom.DomSavedMultiRange_(this);\n};\n\n\n// RANGE MODIFICATION\n\n\n/**\n * Collapses this range to a single point, either the first or last point\n * depending on the parameter.  This will result in the number of ranges in this\n * multi range becoming 1.\n * @param {boolean} toAnchor Whether to collapse to the anchor.\n * @override\n */\ngoog.dom.MultiRange.prototype.collapse = function(toAnchor) {\n  if (!this.isCollapsed()) {\n    var range = toAnchor ? this.getTextRange(0) :\n                           this.getTextRange(this.getTextRangeCount() - 1);\n\n    this.clearCachedValues_();\n    range.collapse(toAnchor);\n    this.ranges_ = [range];\n    this.sortedRanges_ = [range];\n    this.browserRanges_ = [range.getBrowserRangeObject()];\n  }\n};\n\n\n// SAVED RANGE OBJECTS\n\n\n\n/**\n * A SavedRange implementation using DOM endpoints.\n * @param {goog.dom.MultiRange} range The range to save.\n * @constructor\n * @extends {goog.dom.SavedRange}\n * @private\n */\ngoog.dom.DomSavedMultiRange_ = function(range) {\n  /**\n   * Array of saved ranges.\n   * @type {Array<goog.dom.SavedRange>}\n   * @private\n   */\n  this.savedRanges_ = goog.array.map(\n      range.getTextRanges(), function(range) { return range.saveUsingDom(); });\n};\ngoog.inherits(goog.dom.DomSavedMultiRange_, goog.dom.SavedRange);\n\n\n/**\n * @return {!goog.dom.MultiRange} The restored range.\n * @override\n */\ngoog.dom.DomSavedMultiRange_.prototype.restoreInternal = function() {\n  var ranges = goog.array.map(\n      this.savedRanges_, function(savedRange) { return savedRange.restore(); });\n  return goog.dom.MultiRange.createFromTextRanges(ranges);\n};\n\n\n/** @override */\ngoog.dom.DomSavedMultiRange_.prototype.disposeInternal = function() {\n  goog.dom.DomSavedMultiRange_.superClass_.disposeInternal.call(this);\n\n  goog.array.forEach(\n      this.savedRanges_, function(savedRange) { savedRange.dispose(); });\n  delete this.savedRanges_;\n};\n\n\n// RANGE ITERATION\n\n\n\n/**\n * Subclass of goog.dom.TagIterator that iterates over a DOM range.  It\n * adds functions to determine the portion of each text node that is selected.\n *\n * @param {goog.dom.MultiRange} range The range to traverse.\n * @constructor\n * @extends {goog.dom.RangeIterator}\n * @final\n */\ngoog.dom.MultiRangeIterator = function(range) {\n  /**\n   * The list of range iterators left to traverse.\n   * @private {?Array<?goog.dom.RangeIterator>}\n   */\n  this.iterators_ = null;\n\n  /**\n   * The index of the current sub-iterator being traversed.\n   * @private {number}\n   */\n  this.currentIdx_ = 0;\n\n  if (range) {\n    this.iterators_ = goog.array.map(range.getSortedRanges(), function(r) {\n      return goog.iter.toIterator(r);\n    });\n  }\n\n  goog.dom.MultiRangeIterator.base(\n      this, 'constructor', range ? this.getStartNode() : null, false);\n};\ngoog.inherits(goog.dom.MultiRangeIterator, goog.dom.RangeIterator);\n\n\n/** @override */\ngoog.dom.MultiRangeIterator.prototype.getStartTextOffset = function() {\n  return this.iterators_[this.currentIdx_].getStartTextOffset();\n};\n\n\n/** @override */\ngoog.dom.MultiRangeIterator.prototype.getEndTextOffset = function() {\n  return this.iterators_[this.currentIdx_].getEndTextOffset();\n};\n\n\n/** @override */\ngoog.dom.MultiRangeIterator.prototype.getStartNode = function() {\n  return this.iterators_[0].getStartNode();\n};\n\n\n/** @override */\ngoog.dom.MultiRangeIterator.prototype.getEndNode = function() {\n  return goog.array.peek(this.iterators_).getEndNode();\n};\n\n\n/** @override */\ngoog.dom.MultiRangeIterator.prototype.isLast = function() {\n  return this.iterators_[this.currentIdx_].isLast();\n};\n\n\n/** @override */\ngoog.dom.MultiRangeIterator.prototype.next = function() {\n\n  try {\n    var it = this.iterators_[this.currentIdx_];\n    var next = it.next();\n    this.setPosition(it.node, it.tagType, it.depth);\n    return next;\n  } catch (ex) {\n    if (ex !== goog.iter.StopIteration ||\n        this.iterators_.length - 1 == this.currentIdx_) {\n      throw ex;\n    } else {\n      // In case we got a StopIteration, increment counter and try again.\n      this.currentIdx_++;\n      return this.next();\n    }\n  }\n};\n\n\n/** @override */\ngoog.dom.MultiRangeIterator.prototype.copyFrom = function(other) {\n  this.iterators_ = goog.array.clone(other.iterators_);\n  goog.dom.MultiRangeIterator.superClass_.copyFrom.call(this, other);\n};\n\n\n/**\n * @return {!goog.dom.MultiRangeIterator} An identical iterator.\n * @override\n */\ngoog.dom.MultiRangeIterator.prototype.clone = function() {\n  var copy = new goog.dom.MultiRangeIterator(null);\n  copy.copyFrom(this);\n  return copy;\n};\n","^17",1579837703000,"^18",["^19",["^;G","^1T","^3Q","^3R","^Z","^2J","~$goog.dom.AbstractMultiRange","^3V","^5<","^3U","^35","~$goog.dom.RangeIterator"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/multirange.js"],"^1J",["^19",["~$goog.dom.MultiRangeIterator","~$goog.dom.MultiRange"]],"^X",true,"^Y",["^Z","^35","^1T","^[<","^3Q","^[=","^3U","^3R","^3V","^;G","^5<","^2J"]],["^ ","^[",[1579837703000],"^10","goog.net.cookies.js","^11",["^12","goog/net/cookies.js"],"^13","goog/net/cookies.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions for setting, getting and deleting cookies.\n *\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.net.Cookies');\ngoog.provide('goog.net.cookies');\n\ngoog.require('goog.asserts');\ngoog.require('goog.string');\n\n\n\n/**\n * A class for handling browser cookies.\n * @param {?Document} context The context document to get/set cookies on.\n * @constructor\n * @final\n */\ngoog.net.Cookies = function(context) {\n  /**\n  * The context document to get/set cookies on. If no document context is\n  * passed, use a fake one with only the \"cookie\" attribute. This allows\n  * this class to be instantiated safely in web worker environments.\n  * @private {{cookie: string}}\n  */\n  this.document_ = context || {cookie: ''};\n};\n\n\n/**\n * Static constant for the size of cookies. Per the spec, there's a 4K limit\n * to the size of a cookie. To make sure users can't break this limit, we\n * should truncate long cookies at 3950 bytes, to be extra careful with dumb\n * browsers/proxies that interpret 4K as 4000 rather than 4096.\n * @const {number}\n */\ngoog.net.Cookies.MAX_COOKIE_LENGTH = 3950;\n\n\n/**\n * Returns true if cookies are enabled.\n * @return {boolean} True if cookies are enabled.\n */\ngoog.net.Cookies.prototype.isEnabled = function() {\n  return navigator.cookieEnabled;\n};\n\n\n/**\n * We do not allow '=', ';', or white space in the name.\n *\n * NOTE: The following are allowed by this method, but should be avoided for\n * cookies handled by the server.\n * - any name starting with '$'\n * - 'Comment'\n * - 'Domain'\n * - 'Expires'\n * - 'Max-Age'\n * - 'Path'\n * - 'Secure'\n * - 'Version'\n *\n * @param {string} name Cookie name.\n * @return {boolean} Whether name is valid.\n *\n * @see <a href=\"http://tools.ietf.org/html/rfc2109\">RFC 2109</a>\n * @see <a href=\"http://tools.ietf.org/html/rfc2965\">RFC 2965</a>\n */\ngoog.net.Cookies.prototype.isValidName = function(name) {\n  return !(/[;=\\s]/.test(name));\n};\n\n\n/**\n * We do not allow ';' or line break in the value.\n *\n * Spec does not mention any illegal characters, but in practice semi-colons\n * break parsing and line breaks truncate the name.\n *\n * @param {string} value Cookie value.\n * @return {boolean} Whether value is valid.\n *\n * @see <a href=\"http://tools.ietf.org/html/rfc2109\">RFC 2109</a>\n * @see <a href=\"http://tools.ietf.org/html/rfc2965\">RFC 2965</a>\n */\ngoog.net.Cookies.prototype.isValidValue = function(value) {\n  return !(/[;\\r\\n]/.test(value));\n};\n\n\n/**\n * Sets a cookie.  The max_age can be -1 to set a session cookie. To remove and\n * expire cookies, use remove() instead.\n *\n * Neither the `name` nor the `value` are encoded in any way. It is\n * up to the callers of `get` and `set` (as well as all the other\n * methods) to handle any possible encoding and decoding.\n *\n * @throws {!Error} If the `name` fails #goog.net.cookies.isValidName.\n * @throws {!Error} If the `value` fails #goog.net.cookies.isValidValue.\n *\n * @param {string} name  The cookie name.\n * @param {string} value  The cookie value.\n * @param {number|!goog.net.Cookies.SetOptions=} opt_maxAge  The options object,\n *     or else (deprecated) the max age in seconds (from now). Use -1 to set a\n *     session cookie. If not provided, the default is -1 (i.e. set a session\n *     cookie).\n * @param {?string=} opt_path  The path of the cookie. If not present then this\n *     uses the full request path.\n * @param {?string=} opt_domain  The domain of the cookie, or null to not\n *     specify a domain attribute (browser will use the full request host name).\n *     If not provided, the default is null (i.e. let browser use full request\n *     host name).\n * @param {boolean=} opt_secure Whether the cookie should only be sent over\n *     a secure channel.\n */\ngoog.net.Cookies.prototype.set = function(\n    name, value, opt_maxAge, opt_path, opt_domain, opt_secure) {\n  /** @type {string|undefined} */\n  var sameSite;\n  if (typeof opt_maxAge === 'object') {\n    goog.asserts.assert(opt_path == null);\n    goog.asserts.assert(opt_domain == null);\n    goog.asserts.assert(opt_secure == null);\n    var options = opt_maxAge;\n    sameSite = options.sameSite;\n    opt_secure = options.secure;\n    opt_domain = options.domain;\n    opt_path = options.path;\n    opt_maxAge = options.maxAge;\n  }\n  if (!this.isValidName(name)) {\n    throw new Error('Invalid cookie name \"' + name + '\"');\n  }\n  if (!this.isValidValue(value)) {\n    throw new Error('Invalid cookie value \"' + value + '\"');\n  }\n\n  if (opt_maxAge === undefined) {\n    opt_maxAge = -1;\n  }\n\n  var domainStr = opt_domain ? ';domain=' + opt_domain : '';\n  var pathStr = opt_path ? ';path=' + opt_path : '';\n  var secureStr = opt_secure ? ';secure' : '';\n\n  var expiresStr;\n\n  // Case 1: Set a session cookie.\n  if (opt_maxAge < 0) {\n    expiresStr = '';\n\n    // Case 2: Remove the cookie.\n    // Note: We don't tell people about this option in the function doc because\n    // we prefer people to use remove() to remove cookies.\n  } else if (opt_maxAge == 0) {\n    // Note: Don't use Jan 1, 1970 for date because NS 4.76 will try to convert\n    // it to local time, and if the local time is before Jan 1, 1970, then the\n    // browser will ignore the Expires attribute altogether.\n    var pastDate = new Date(1970, 1 /*Feb*/, 1);  // Feb 1, 1970\n    expiresStr = ';expires=' + pastDate.toUTCString();\n\n    // Case 3: Set a persistent cookie.\n  } else {\n    var futureDate = new Date(goog.now() + opt_maxAge * 1000);\n    expiresStr = ';expires=' + futureDate.toUTCString();\n  }\n\n  var sameSiteStr = sameSite != null ? ';samesite=' + sameSite : '';\n\n  this.setCookie_(\n      name + '=' + value + domainStr + pathStr + expiresStr + secureStr +\n      sameSiteStr);\n};\n\n\n/**\n * Returns the value for the first cookie with the given name.\n * @param {string} name  The name of the cookie to get.\n * @param {string=} opt_default  If not found this is returned instead.\n * @return {string|undefined}  The value of the cookie. If no cookie is set this\n *     returns opt_default or undefined if opt_default is not provided.\n */\ngoog.net.Cookies.prototype.get = function(name, opt_default) {\n  var nameEq = name + '=';\n  var parts = this.getParts_();\n  for (var i = 0, part; i < parts.length; i++) {\n    part = goog.string.trim(parts[i]);\n    // startsWith\n    if (part.lastIndexOf(nameEq, 0) == 0) {\n      return part.substr(nameEq.length);\n    }\n    if (part == name) {\n      return '';\n    }\n  }\n  return opt_default;\n};\n\n\n/**\n * Removes and expires a cookie.\n * @param {string} name  The cookie name.\n * @param {?string=} opt_path  The path of the cookie. If null or not present,\n *     expires the cookie set at the full request path.\n * @param {?string=} opt_domain  The domain of the cookie, or null to expire a\n *     cookie set at the full request host name. If not provided, the default is\n *     null (i.e. cookie at full request host name).\n * @return {boolean} Whether the cookie existed before it was removed.\n */\ngoog.net.Cookies.prototype.remove = function(name, opt_path, opt_domain) {\n  var rv = this.containsKey(name);\n  this.set(name, '', 0, opt_path, opt_domain);\n  return rv;\n};\n\n\n/**\n * Gets the names for all the cookies.\n * @return {Array<string>} An array with the names of the cookies.\n */\ngoog.net.Cookies.prototype.getKeys = function() {\n  return this.getKeyValues_().keys;\n};\n\n\n/**\n * Gets the values for all the cookies.\n * @return {Array<string>} An array with the values of the cookies.\n */\ngoog.net.Cookies.prototype.getValues = function() {\n  return this.getKeyValues_().values;\n};\n\n\n/**\n * @return {boolean} Whether there are any cookies for this document.\n */\ngoog.net.Cookies.prototype.isEmpty = function() {\n  return !this.getCookie_();\n};\n\n\n/**\n * @return {number} The number of cookies for this document.\n */\ngoog.net.Cookies.prototype.getCount = function() {\n  var cookie = this.getCookie_();\n  if (!cookie) {\n    return 0;\n  }\n  return this.getParts_().length;\n};\n\n\n/**\n * Returns whether there is a cookie with the given name.\n * @param {string} key The name of the cookie to test for.\n * @return {boolean} Whether there is a cookie by that name.\n */\ngoog.net.Cookies.prototype.containsKey = function(key) {\n  // substring will return empty string if the key is not found, so the get\n  // function will only return undefined\n  return this.get(key) !== undefined;\n};\n\n\n/**\n * Returns whether there is a cookie with the given value. (This is an O(n)\n * operation.)\n * @param {string} value  The value to check for.\n * @return {boolean} Whether there is a cookie with that value.\n */\ngoog.net.Cookies.prototype.containsValue = function(value) {\n  // this O(n) in any case so lets do the trivial thing.\n  var values = this.getKeyValues_().values;\n  for (var i = 0; i < values.length; i++) {\n    if (values[i] == value) {\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Removes all cookies for this document.  Note that this will only remove\n * cookies from the current path and domain.  If there are cookies set using a\n * subpath and/or another domain these will still be there.\n */\ngoog.net.Cookies.prototype.clear = function() {\n  var keys = this.getKeyValues_().keys;\n  for (var i = keys.length - 1; i >= 0; i--) {\n    this.remove(keys[i]);\n  }\n};\n\n\n/**\n * Private helper function to allow testing cookies without depending on the\n * browser.\n * @param {string} s The cookie string to set.\n * @private\n */\ngoog.net.Cookies.prototype.setCookie_ = function(s) {\n  this.document_.cookie = s;\n};\n\n\n/**\n * Private helper function to allow testing cookies without depending on the\n * browser. IE6 can return null here.\n * @return {string} Returns the `document.cookie`.\n * @private\n */\ngoog.net.Cookies.prototype.getCookie_ = function() {\n  return this.document_.cookie;\n};\n\n\n/**\n * @return {!Array<string>} The cookie split on semi colons.\n * @private\n */\ngoog.net.Cookies.prototype.getParts_ = function() {\n  return (this.getCookie_() || '').split(';');\n};\n\n\n/**\n * Gets the names and values for all the cookies.\n * @return {{keys:!Array<string>, values:!Array<string>}} An object with keys\n *     and values.\n * @private\n */\ngoog.net.Cookies.prototype.getKeyValues_ = function() {\n  var parts = this.getParts_();\n  var keys = [], values = [], index, part;\n  for (var i = 0; i < parts.length; i++) {\n    part = goog.string.trim(parts[i]);\n    index = part.indexOf('=');\n\n    if (index == -1) {  // empty name\n      keys.push('');\n      values.push(part);\n    } else {\n      keys.push(part.substring(0, index));\n      values.push(part.substring(index + 1));\n    }\n  }\n  return {keys: keys, values: values};\n};\n\n\n/**\n * Options object for calls to Cookies.prototype.set.\n * @record\n */\ngoog.net.Cookies.SetOptions = function() {\n  /**\n   * The max age in seconds (from now). Use -1 to set a session cookie. If not\n   * provided, the default is -1 (i.e. set a session cookie).\n   * @type {number|undefined}\n   */\n  this.maxAge;\n  /**\n   * The path of the cookie. If not present then this uses the full request\n   * path.\n   * @type {?string|undefined}\n   */\n  this.path;\n  /**\n   * The domain of the cookie, or null to not specify a domain attribute\n   * (browser will use the full request host name). If not provided, the default\n   * is null (i.e. let browser use full request host name).\n   * @type {?string|undefined}\n   */\n  this.domain;\n  /**\n   * Whether the cookie should only be sent over a secure channel.\n   * @type {boolean|undefined}\n   */\n  this.secure;\n  /**\n   * The SameSite attribute for the cookie (default is NONE).\n   * @type {!goog.net.Cookies.SameSite|undefined}\n   */\n  this.sameSite;\n};\n\n\n/**\n * Valid values for the SameSite cookie attribute.  In 2019, browsers began the\n * process of changing the default from NONE to LAX.\n *\n * @see https://web.dev/samesite-cookies-explained\n * @see https://tools.ietf.org/html/draft-ietf-httpbis-rfc6265bis-03#section-5.3.7\n * @enum {string}\n */\ngoog.net.Cookies.SameSite = {\n  /**\n   * The cookie will be sent in first-party contexts, including initial\n   * navigation from external referrers.\n   */\n  LAX: 'lax',\n  /**\n   * The cookie will be sent in all first-party or third-party contexts. This\n   * was the original default behavior of the web, but will need to be set\n   * explicitly starting in 2020.\n   */\n  NONE: 'none',\n  /**\n   * The cookie will only be sent in first-party contexts. It will not be sent\n   * on initial navigation from external referrers.\n   */\n  STRICT: 'strict',\n};\n\n\n// TODO(closure-team): This should be a singleton getter instead of a static\n// instance.\n/**\n * A static default instance.\n * @const {!goog.net.Cookies}\n */\ngoog.net.cookies =\n    new goog.net.Cookies(typeof document == 'undefined' ? null : document);\n\n\n/**\n * Getter for the static instance of goog.net.Cookies.\n * @return {!goog.net.Cookies}\n */\ngoog.net.Cookies.getInstance = function() {\n  return goog.net.cookies;\n};\n","^17",1579837703000,"^18",["^19",["^1S","^2D","^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/cookies.js"],"^1J",["^19",["~$goog.net.Cookies","~$goog.net.cookies"]],"^X",true,"^Y",["^Z","^1S","^2D"]],["^ ","^[",[1579837703000],"^10","goog.ui.ac.remote.js","^11",["^12","goog/ui/ac/remote.js"],"^13","goog/ui/ac/remote.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Factory class to create a simple autocomplete that will match\n * from an array of data provided via ajax.\n *\n * @see ../../demos/autocompleteremote.html\n */\n\ngoog.provide('goog.ui.ac.Remote');\n\ngoog.require('goog.ui.ac.AutoComplete');\ngoog.require('goog.ui.ac.InputHandler');\ngoog.require('goog.ui.ac.RemoteArrayMatcher');\ngoog.require('goog.ui.ac.Renderer');\n\n\n\n/**\n * Factory class for building a remote autocomplete widget that autocompletes\n * an inputbox or text area from a data array provided via ajax.\n * @param {string} url The Uri which generates the auto complete matches.\n * @param {Element} input Input element or text area.\n * @param {boolean=} opt_multi Whether to allow multiple entries; defaults\n *     to false.\n * @param {boolean=} opt_useSimilar Whether to use similar matches; e.g.\n *     \"gost\" => \"ghost\".\n * @constructor\n * @extends {goog.ui.ac.AutoComplete}\n */\ngoog.ui.ac.Remote = function(url, input, opt_multi, opt_useSimilar) {\n  var matcher = new goog.ui.ac.RemoteArrayMatcher(url, !opt_useSimilar);\n  this.matcher_ = matcher;\n\n  var renderer = new goog.ui.ac.Renderer();\n\n  var inputhandler = new goog.ui.ac.InputHandler(null, null, !!opt_multi, 300);\n\n  goog.ui.ac.AutoComplete.call(this, matcher, renderer, inputhandler);\n\n  inputhandler.attachAutoComplete(this);\n  inputhandler.attachInputs(input);\n};\ngoog.inherits(goog.ui.ac.Remote, goog.ui.ac.AutoComplete);\n\n\n/**\n * Set whether or not standard highlighting should be used when rendering rows.\n * @param {boolean} useStandardHighlighting true if standard highlighting used.\n */\ngoog.ui.ac.Remote.prototype.setUseStandardHighlighting = function(\n    useStandardHighlighting) {\n  this.renderer_.setUseStandardHighlighting(useStandardHighlighting);\n};\n\n\n/**\n * Gets the attached InputHandler object.\n * @return {goog.ui.ac.InputHandler} The input handler.\n */\ngoog.ui.ac.Remote.prototype.getInputHandler = function() {\n  return /** @type {goog.ui.ac.InputHandler} */ (this.selectionHandler_);\n};\n\n\n/**\n * Set the send method (\"GET\", \"POST\") for the matcher.\n * @param {string} method The send method; default: GET.\n */\ngoog.ui.ac.Remote.prototype.setMethod = function(method) {\n  this.matcher_.setMethod(method);\n};\n\n\n/**\n * Set the post data for the matcher.\n * @param {string} content Post data.\n */\ngoog.ui.ac.Remote.prototype.setContent = function(content) {\n  this.matcher_.setContent(content);\n};\n\n\n/**\n * Set the HTTP headers for the matcher.\n * @param {Object|goog.structs.Map} headers Map of headers to add to the\n *     request.\n */\ngoog.ui.ac.Remote.prototype.setHeaders = function(headers) {\n  this.matcher_.setHeaders(headers);\n};\n\n\n/**\n * Set the timeout interval for the matcher.\n * @param {number} interval Number of milliseconds after which an\n *     incomplete request will be aborted; 0 means no timeout is set.\n */\ngoog.ui.ac.Remote.prototype.setTimeoutInterval = function(interval) {\n  this.matcher_.setTimeoutInterval(interval);\n};\n","^17",1579837703000,"^18",["^19",["~$goog.ui.ac.AutoComplete","~$goog.ui.ac.Renderer","^Z","~$goog.ui.ac.RemoteArrayMatcher","^5W"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/ac/remote.js"],"^1J",["^19",["~$goog.ui.ac.Remote"]],"^X",true,"^Y",["^Z","^[B","^5W","^[D","^[C"]],["^ ","^[",[1579837703000],"^10","goog.vec.vec4d.js","^11",["^12","goog/vec/vec4d.js"],"^13","goog/vec/vec4d.js","^14","^15","^16","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n//                                                                           //\n// Any edits to this file must be applied to vec4f.js by running:            //\n//   swap_type.sh vec4d.js > vec4f.js                                        //\n//                                                                           //\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n\n\n/**\n * @fileoverview Provides functions for operating on 4 element double (64bit)\n * vectors.\n *\n * The last parameter will typically be the output object and an object\n * can be both an input and output parameter to all methods except where\n * noted.\n *\n * See the README for notes about the design and structure of the API\n * (especially related to performance).\n *\n */\ngoog.provide('goog.vec.vec4d');\ngoog.provide('goog.vec.vec4d.Type');\n\n/** @suppress {extraRequire} */\ngoog.require('goog.vec');\n\n/** @typedef {!goog.vec.Float64} */ goog.vec.vec4d.Type;\n\n\n/**\n * Creates a vec4d with all elements initialized to zero.\n *\n * @return {!goog.vec.vec4d.Type} The new vec4d.\n */\ngoog.vec.vec4d.create = function() {\n  return new Float64Array(4);\n};\n\n\n/**\n * Creates a new vec4d initialized with the value from the given array.\n *\n * @param {!Array<number>} vec The source 4 element array.\n * @return {!goog.vec.vec4d.Type} The new vec4d.\n */\ngoog.vec.vec4d.createFromArray = function(vec) {\n  var newVec = goog.vec.vec4d.create();\n  goog.vec.vec4d.setFromArray(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Creates a new vec4d initialized with the supplied values.\n *\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @param {number} v3 The value for element at index 3.\n * @return {!goog.vec.vec4d.Type} The new vector.\n */\ngoog.vec.vec4d.createFromValues = function(v0, v1, v2, v3) {\n  var vec = goog.vec.vec4d.create();\n  goog.vec.vec4d.setFromValues(vec, v0, v1, v2, v3);\n  return vec;\n};\n\n\n/**\n * Creates a clone of the given vec4d.\n *\n * @param {!goog.vec.vec4d.Type} vec The source vec4d.\n * @return {!goog.vec.vec4d.Type} The new cloned vec4d.\n */\ngoog.vec.vec4d.clone = function(vec) {\n  var newVec = goog.vec.vec4d.create();\n  goog.vec.vec4d.setFromVec4d(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Initializes the vector with the given values.\n *\n * @param {!goog.vec.vec4d.Type} vec The vector to receive the values.\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @param {number} v3 The value for element at index 3.\n * @return {!goog.vec.vec4d.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4d.setFromValues = function(vec, v0, v1, v2, v3) {\n  vec[0] = v0;\n  vec[1] = v1;\n  vec[2] = v2;\n  vec[3] = v3;\n  return vec;\n};\n\n\n/**\n * Initializes vec4d vec from vec4d src.\n *\n * @param {!goog.vec.vec4d.Type} vec The destination vector.\n * @param {!goog.vec.vec4d.Type} src The source vector.\n * @return {!goog.vec.vec4d.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4d.setFromVec4d = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  vec[2] = src[2];\n  vec[3] = src[3];\n  return vec;\n};\n\n\n/**\n * Initializes vec4d vec from vec4f src (typed as a Float32Array to\n * avoid circular goog.requires).\n *\n * @param {!goog.vec.vec4d.Type} vec The destination vector.\n * @param {Float32Array} src The source vector.\n * @return {!goog.vec.vec4d.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4d.setFromVec4f = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  vec[2] = src[2];\n  vec[3] = src[3];\n  return vec;\n};\n\n\n/**\n * Initializes vec4d vec from Array src.\n *\n * @param {!goog.vec.vec4d.Type} vec The destination vector.\n * @param {Array<number>} src The source vector.\n * @return {!goog.vec.vec4d.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4d.setFromArray = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  vec[2] = src[2];\n  vec[3] = src[3];\n  return vec;\n};\n\n\n/**\n * Performs a component-wise addition of vec0 and vec1 together storing the\n * result into resultVec.\n *\n * @param {!goog.vec.vec4d.Type} vec0 The first addend.\n * @param {!goog.vec.vec4d.Type} vec1 The second addend.\n * @param {!goog.vec.vec4d.Type} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.vec4d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4d.add = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] + vec1[0];\n  resultVec[1] = vec0[1] + vec1[1];\n  resultVec[2] = vec0[2] + vec1[2];\n  resultVec[3] = vec0[3] + vec1[3];\n  return resultVec;\n};\n\n\n/**\n * Performs a component-wise subtraction of vec1 from vec0 storing the\n * result into resultVec.\n *\n * @param {!goog.vec.vec4d.Type} vec0 The minuend.\n * @param {!goog.vec.vec4d.Type} vec1 The subtrahend.\n * @param {!goog.vec.vec4d.Type} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.vec4d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4d.subtract = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] - vec1[0];\n  resultVec[1] = vec0[1] - vec1[1];\n  resultVec[2] = vec0[2] - vec1[2];\n  resultVec[3] = vec0[3] - vec1[3];\n  return resultVec;\n};\n\n\n/**\n * Negates vec0, storing the result into resultVec.\n *\n * @param {!goog.vec.vec4d.Type} vec0 The vector to negate.\n * @param {!goog.vec.vec4d.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec4d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4d.negate = function(vec0, resultVec) {\n  resultVec[0] = -vec0[0];\n  resultVec[1] = -vec0[1];\n  resultVec[2] = -vec0[2];\n  resultVec[3] = -vec0[3];\n  return resultVec;\n};\n\n\n/**\n * Takes the absolute value of each component of vec0 storing the result in\n * resultVec.\n *\n * @param {!goog.vec.vec4d.Type} vec0 The source vector.\n * @param {!goog.vec.vec4d.Type} resultVec The vector to receive the result.\n *     May be vec0.\n * @return {!goog.vec.vec4d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4d.abs = function(vec0, resultVec) {\n  resultVec[0] = Math.abs(vec0[0]);\n  resultVec[1] = Math.abs(vec0[1]);\n  resultVec[2] = Math.abs(vec0[2]);\n  resultVec[3] = Math.abs(vec0[3]);\n  return resultVec;\n};\n\n\n/**\n * Multiplies each component of vec0 with scalar storing the product into\n * resultVec.\n *\n * @param {!goog.vec.vec4d.Type} vec0 The source vector.\n * @param {number} scalar The value to multiply with each component of vec0.\n * @param {!goog.vec.vec4d.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec4d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4d.scale = function(vec0, scalar, resultVec) {\n  resultVec[0] = vec0[0] * scalar;\n  resultVec[1] = vec0[1] * scalar;\n  resultVec[2] = vec0[2] * scalar;\n  resultVec[3] = vec0[3] * scalar;\n  return resultVec;\n};\n\n\n/**\n * Returns the magnitudeSquared of the given vector.\n *\n * @param {!goog.vec.vec4d.Type} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.vec4d.magnitudeSquared = function(vec0) {\n  var x = vec0[0], y = vec0[1], z = vec0[2], w = vec0[3];\n  return x * x + y * y + z * z + w * w;\n};\n\n\n/**\n * Returns the magnitude of the given vector.\n *\n * @param {!goog.vec.vec4d.Type} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.vec4d.magnitude = function(vec0) {\n  var x = vec0[0], y = vec0[1], z = vec0[2], w = vec0[3];\n  return Math.sqrt(x * x + y * y + z * z + w * w);\n};\n\n\n/**\n * Normalizes the given vector storing the result into resultVec.\n *\n * @param {!goog.vec.vec4d.Type} vec0 The vector to normalize.\n * @param {!goog.vec.vec4d.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec4d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4d.normalize = function(vec0, resultVec) {\n  var x = vec0[0], y = vec0[1], z = vec0[2], w = vec0[3];\n  var ilen = 1 / Math.sqrt(x * x + y * y + z * z + w * w);\n  resultVec[0] = x * ilen;\n  resultVec[1] = y * ilen;\n  resultVec[2] = z * ilen;\n  resultVec[3] = w * ilen;\n  return resultVec;\n};\n\n\n/**\n * Returns the scalar product of vectors v0 and v1.\n *\n * @param {!goog.vec.vec4d.Type} v0 The first vector.\n * @param {!goog.vec.vec4d.Type} v1 The second vector.\n * @return {number} The scalar product.\n */\ngoog.vec.vec4d.dot = function(v0, v1) {\n  return v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2] + v0[3] * v1[3];\n};\n\n\n/**\n * Linearly interpolate from v0 to v1 according to f. The value of f should be\n * in the range [0..1] otherwise the results are undefined.\n *\n * @param {!goog.vec.vec4d.Type} v0 The first vector.\n * @param {!goog.vec.vec4d.Type} v1 The second vector.\n * @param {number} f The interpolation factor.\n * @param {!goog.vec.vec4d.Type} resultVec The vector to receive the\n *     results (may be v0 or v1).\n * @return {!goog.vec.vec4d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4d.lerp = function(v0, v1, f, resultVec) {\n  var x = v0[0], y = v0[1], z = v0[2], w = v0[3];\n  resultVec[0] = (v1[0] - x) * f + x;\n  resultVec[1] = (v1[1] - y) * f + y;\n  resultVec[2] = (v1[2] - z) * f + z;\n  resultVec[3] = (v1[3] - w) * f + w;\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the larger values in resultVec.\n *\n * @param {!goog.vec.vec4d.Type} vec0 The source vector.\n * @param {!goog.vec.vec4d.Type|number} limit The limit vector or scalar.\n * @param {!goog.vec.vec4d.Type} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.vec4d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4d.max = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.max(vec0[0], limit);\n    resultVec[1] = Math.max(vec0[1], limit);\n    resultVec[2] = Math.max(vec0[2], limit);\n    resultVec[3] = Math.max(vec0[3], limit);\n  } else {\n    resultVec[0] = Math.max(vec0[0], limit[0]);\n    resultVec[1] = Math.max(vec0[1], limit[1]);\n    resultVec[2] = Math.max(vec0[2], limit[2]);\n    resultVec[3] = Math.max(vec0[3], limit[3]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the smaller values in resultVec.\n *\n * @param {!goog.vec.vec4d.Type} vec0 The source vector.\n * @param {!goog.vec.vec4d.Type|number} limit The limit vector or scalar.\n * @param {!goog.vec.vec4d.Type} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.vec4d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec4d.min = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.min(vec0[0], limit);\n    resultVec[1] = Math.min(vec0[1], limit);\n    resultVec[2] = Math.min(vec0[2], limit);\n    resultVec[3] = Math.min(vec0[3], limit);\n  } else {\n    resultVec[0] = Math.min(vec0[0], limit[0]);\n    resultVec[1] = Math.min(vec0[1], limit[1]);\n    resultVec[2] = Math.min(vec0[2], limit[2]);\n    resultVec[3] = Math.min(vec0[3], limit[3]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Returns true if the components of v0 are equal to the components of v1.\n *\n * @param {!goog.vec.vec4d.Type} v0 The first vector.\n * @param {!goog.vec.vec4d.Type} v1 The second vector.\n * @return {boolean} True if the vectors are equal, false otherwise.\n */\ngoog.vec.vec4d.equals = function(v0, v1) {\n  return v0.length == v1.length && v0[0] == v1[0] && v0[1] == v1[1] &&\n      v0[2] == v1[2] && v0[3] == v1[3];\n};\n","^17",1579837703000,"^18",["^19",["^;<","^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/vec4d.js"],"^1J",["^19",["~$goog.vec.vec4d.Type","~$goog.vec.vec4d"]],"^X",true,"^Y",["^Z","^;<"]],["^ ","^[",[1579837703000],"^10","goog.editor.plugins.blockquote.js","^11",["^12","goog/editor/plugins/blockquote.js"],"^13","goog/editor/plugins/blockquote.js","^14","^15","^16","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview goog.editor plugin to handle splitting block quotes.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.editor.plugins.Blockquote');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.editor.BrowserFeature');\ngoog.require('goog.editor.Command');\ngoog.require('goog.editor.Plugin');\ngoog.require('goog.editor.node');\ngoog.require('goog.functions');\ngoog.require('goog.log');\n\n\n\n/**\n * Plugin to handle splitting block quotes.  This plugin does nothing on its\n * own and should be used in conjunction with EnterHandler or one of its\n * subclasses.\n * @param {boolean} requiresClassNameToSplit Whether to split only blockquotes\n *     that have the given classname.\n * @param {string=} opt_className The classname to apply to generated\n *     blockquotes.  Defaults to 'tr_bq'.\n * @constructor\n * @extends {goog.editor.Plugin}\n * @final\n */\ngoog.editor.plugins.Blockquote = function(\n    requiresClassNameToSplit, opt_className) {\n  goog.editor.Plugin.call(this);\n\n  /**\n   * Whether we only split blockquotes that have {@link classname}, or whether\n   * all blockquote tags should be split on enter.\n   * @type {boolean}\n   * @private\n   */\n  this.requiresClassNameToSplit_ = requiresClassNameToSplit;\n\n  /**\n   * Classname to put on blockquotes that are generated via the toolbar for\n   * blockquote, so that we can internally distinguish these from blockquotes\n   * that are used for indentation.  This classname can be over-ridden by\n   * clients for styling or other purposes.\n   * @type {string}\n   * @private\n   */\n  this.className_ = opt_className || goog.getCssName('tr_bq');\n};\ngoog.inherits(goog.editor.plugins.Blockquote, goog.editor.Plugin);\n\n\n/**\n * Command implemented by this plugin.\n * @type {string}\n */\ngoog.editor.plugins.Blockquote.SPLIT_COMMAND = '+splitBlockquote';\n\n\n/**\n * Class ID used to identify this plugin.\n * @type {string}\n */\ngoog.editor.plugins.Blockquote.CLASS_ID = 'Blockquote';\n\n\n/**\n * Logging object.\n * @type {goog.log.Logger}\n * @protected\n * @override\n */\ngoog.editor.plugins.Blockquote.prototype.logger =\n    goog.log.getLogger('goog.editor.plugins.Blockquote');\n\n\n/** @override */\ngoog.editor.plugins.Blockquote.prototype.getTrogClassId = function() {\n  return goog.editor.plugins.Blockquote.CLASS_ID;\n};\n\n\n/**\n * Since our exec command is always called from elsewhere, we make it silent.\n * @override\n */\ngoog.editor.plugins.Blockquote.prototype.isSilentCommand = goog.functions.TRUE;\n\n\n/**\n * Checks if a node is a blockquote which can be split. A splittable blockquote\n * meets the following criteria:\n * <ol>\n *   <li>Node is a blockquote element</li>\n *   <li>Node has the blockquote classname if the classname is required to\n *       split</li>\n * </ol>\n *\n * @param {Node} node DOM node in question.\n * @return {boolean} Whether the node is a splittable blockquote.\n */\ngoog.editor.plugins.Blockquote.prototype.isSplittableBlockquote = function(\n    node) {\n  if (/** @type {!Element} */ (node).tagName != goog.dom.TagName.BLOCKQUOTE) {\n    return false;\n  }\n\n  if (!this.requiresClassNameToSplit_) {\n    return true;\n  }\n\n  return goog.dom.classlist.contains(\n      /** @type {!Element} */ (node), this.className_);\n};\n\n\n/**\n * Checks if a node is a blockquote element which has been setup.\n * @param {Node} node DOM node to check.\n * @return {boolean} Whether the node is a blockquote with the required class\n *     name applied.\n */\ngoog.editor.plugins.Blockquote.prototype.isSetupBlockquote = function(node) {\n  return /** @type {!Element} */ (node).tagName ==\n      goog.dom.TagName.BLOCKQUOTE &&\n      goog.dom.classlist.contains(\n          /** @type {!Element} */ (node), this.className_);\n};\n\n\n/**\n * Checks if a node is a blockquote element which has not been setup yet.\n * @param {Node} node DOM node to check.\n * @return {boolean} Whether the node is a blockquote without the required\n *     class name applied.\n */\ngoog.editor.plugins.Blockquote.prototype.isUnsetupBlockquote = function(node) {\n  return /** @type {!Element} */ (node).tagName ==\n      goog.dom.TagName.BLOCKQUOTE &&\n      !this.isSetupBlockquote(node);\n};\n\n\n/**\n * Gets the class name required for setup blockquotes.\n * @return {string} The blockquote class name.\n */\ngoog.editor.plugins.Blockquote.prototype.getBlockquoteClassName = function() {\n  return this.className_;\n};\n\n\n/**\n * Helper routine which walks up the tree to find the topmost\n * ancestor with only a single child. The ancestor node or the original\n * node (if no ancestor was found) is then removed from the DOM.\n *\n * @param {Node} node The node whose ancestors have to be searched.\n * @param {Node} root The root node to stop the search at.\n * @private\n */\ngoog.editor.plugins.Blockquote.findAndRemoveSingleChildAncestor_ = function(\n    node, root) {\n  var predicateFunc = function(parentNode) {\n    return parentNode != root && parentNode.childNodes.length == 1;\n  };\n  var ancestor =\n      goog.editor.node.findHighestMatchingAncestor(node, predicateFunc);\n  if (!ancestor) {\n    ancestor = node;\n  }\n  goog.dom.removeNode(ancestor);\n};\n\n\n/**\n * Remove every nodes from the DOM tree that are all white space nodes.\n * @param {Array<Node>} nodes Nodes to be checked.\n * @private\n */\ngoog.editor.plugins.Blockquote.removeAllWhiteSpaceNodes_ = function(nodes) {\n  for (var i = 0; i < nodes.length; ++i) {\n    if (goog.editor.node.isEmpty(nodes[i], true)) {\n      goog.dom.removeNode(nodes[i]);\n    }\n  }\n};\n\n\n/** @override */\ngoog.editor.plugins.Blockquote.prototype.isSupportedCommand = function(\n    command) {\n  return command == goog.editor.plugins.Blockquote.SPLIT_COMMAND;\n};\n\n\n/**\n * Splits a quoted region if any.  To be called on a key press event.  When this\n * function returns true, the event that caused it to be called should be\n * canceled.\n * @param {string} command The command to execute.\n * @param {...*} var_args Single additional argument representing the current\n *     cursor position. If BrowserFeature.HAS_W3C_RANGES it is an object with a\n *     `node` key and an `offset` key. In other cases (legacy IE)\n *     it is a single node.\n * @return {boolean|undefined} Boolean true when the quoted region has been\n *     split, false or undefined otherwise.\n * @override\n */\ngoog.editor.plugins.Blockquote.prototype.execCommandInternal = function(\n    command, var_args) {\n  var pos = arguments[1];\n  if (command == goog.editor.plugins.Blockquote.SPLIT_COMMAND && pos &&\n      (this.className_ || !this.requiresClassNameToSplit_)) {\n    return goog.editor.BrowserFeature.HAS_W3C_RANGES ?\n        this.splitQuotedBlockW3C_(pos) :\n        this.splitQuotedBlockIE_(/** @type {Node} */ (pos));\n  }\n};\n\n\n/**\n * Version of splitQuotedBlock_ that uses W3C ranges.\n * @param {Object} anchorPos The current cursor position.\n * @return {boolean} Whether the blockquote was split.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.editor.plugins.Blockquote.prototype.splitQuotedBlockW3C_ = function(\n    anchorPos) {\n  var cursorNode = anchorPos.node;\n  var quoteNode = goog.editor.node.findTopMostEditableAncestor(\n      cursorNode.parentNode, goog.bind(this.isSplittableBlockquote, this));\n\n  var secondHalf, textNodeToRemove;\n  var insertTextNode = false;\n  // There are two special conditions that we account for here.\n  //\n  // 1. Whenever the cursor is after (one<BR>|) or just before a BR element\n  //    (one|<BR>) and the user presses enter, the second quoted block starts\n  //    with a BR which appears to the user as an extra newline. This stems\n  //    from the fact that we create two text nodes as our split boundaries\n  //    and the BR becomes a part of the second half because of this.\n  //\n  // 2. When the cursor is at the end of a text node with no siblings and\n  //    the user presses enter, the second blockquote might contain a\n  //    empty subtree that ends in a 0 length text node. We account for that\n  //    as a post-splitting operation.\n  if (quoteNode) {\n    // selection is in a line that has text in it\n    if (cursorNode.nodeType == goog.dom.NodeType.TEXT) {\n      if (anchorPos.offset == cursorNode.length) {\n        var siblingNode = cursorNode.nextSibling;\n\n        // This accounts for the condition where the cursor appears at the\n        // end of a text node and right before the BR eg: one|<BR>. We ensure\n        // that we split on the BR in that case.\n        if (siblingNode && siblingNode.tagName == goog.dom.TagName.BR) {\n          cursorNode = siblingNode;\n          // This might be null but splitDomTreeAt accounts for the null case.\n          secondHalf = siblingNode.nextSibling;\n        } else {\n          textNodeToRemove = cursorNode.splitText(anchorPos.offset);\n          secondHalf = textNodeToRemove;\n        }\n      } else {\n        secondHalf = cursorNode.splitText(anchorPos.offset);\n      }\n    } else if (cursorNode.tagName == goog.dom.TagName.BR) {\n      // This might be null but splitDomTreeAt accounts for the null case.\n      secondHalf = cursorNode.nextSibling;\n    } else {\n      // The selection is in a line that is empty, with more than 1 level\n      // of quote.\n      insertTextNode = true;\n    }\n  } else {\n    // Check if current node is a quote node.\n    // This will happen if user clicks in an empty line in the quote,\n    // when there is 1 level of quote.\n    if (this.isSetupBlockquote(cursorNode)) {\n      quoteNode = cursorNode;\n      insertTextNode = true;\n    }\n  }\n\n  if (insertTextNode) {\n    // Create two empty text nodes to split between.\n    cursorNode = this.insertEmptyTextNodeBeforeRange_();\n    secondHalf = this.insertEmptyTextNodeBeforeRange_();\n  }\n\n  if (!quoteNode) {\n    return false;\n  }\n\n  secondHalf =\n      goog.editor.node.splitDomTreeAt(cursorNode, secondHalf, quoteNode);\n  goog.dom.insertSiblingAfter(secondHalf, quoteNode);\n\n  // Set the insertion point.\n  var dh = this.getFieldDomHelper();\n  var tagToInsert = this.getFieldObject().queryCommandValue(\n                        goog.editor.Command.DEFAULT_TAG) ||\n      goog.dom.TagName.DIV;\n  var container = dh.createElement(/** @type {string} */ (tagToInsert));\n  container.innerHTML = '&nbsp;';  // Prevent the div from collapsing.\n  quoteNode.parentNode.insertBefore(container, secondHalf);\n  dh.getWindow().getSelection().collapse(container, 0);\n\n  // We need to account for the condition where the second blockquote\n  // might contain an empty DOM tree. This arises from trying to split\n  // at the end of an empty text node. We resolve this by walking up the tree\n  // till we either reach the blockquote or till we hit a node with more\n  // than one child. The resulting node is then removed from the DOM.\n  if (textNodeToRemove) {\n    goog.editor.plugins.Blockquote.findAndRemoveSingleChildAncestor_(\n        textNodeToRemove, secondHalf);\n  }\n\n  goog.editor.plugins.Blockquote.removeAllWhiteSpaceNodes_(\n      [quoteNode, secondHalf]);\n  return true;\n};\n\n\n/**\n * Inserts an empty text node before the field's range.\n * @return {!Node} The empty text node.\n * @private\n */\ngoog.editor.plugins.Blockquote.prototype.insertEmptyTextNodeBeforeRange_ =\n    function() {\n  var range = this.getFieldObject().getRange();\n  var node = this.getFieldDomHelper().createTextNode('');\n  range.insertNode(node, true);\n  return node;\n};\n\n\n/**\n * IE version of splitQuotedBlock_.\n * @param {Node} splitNode The current cursor position.\n * @return {boolean} Whether the blockquote was split.\n * @private\n */\ngoog.editor.plugins.Blockquote.prototype.splitQuotedBlockIE_ = function(\n    splitNode) {\n  var dh = this.getFieldDomHelper();\n  var quoteNode = goog.editor.node.findTopMostEditableAncestor(\n      splitNode.parentNode, goog.bind(this.isSplittableBlockquote, this));\n\n  if (!quoteNode) {\n    return false;\n  }\n\n  var clone = splitNode.cloneNode(false);\n\n  // Whenever the cursor is just before a BR element (one|<BR>) and the user\n  // presses enter, the second quoted block starts with a BR which appears\n  // to the user as an extra newline. This stems from the fact that the\n  // dummy span that we create (splitNode) occurs before the BR and we split\n  // on that.\n  if (splitNode.nextSibling &&\n      /** @type {!Element} */ (splitNode.nextSibling).tagName ==\n          goog.dom.TagName.BR) {\n    splitNode = splitNode.nextSibling;\n  }\n  var secondHalf = goog.editor.node.splitDomTreeAt(splitNode, clone, quoteNode);\n  goog.dom.insertSiblingAfter(secondHalf, quoteNode);\n\n  // Set insertion point.\n  var tagToInsert = this.getFieldObject().queryCommandValue(\n                        goog.editor.Command.DEFAULT_TAG) ||\n      goog.dom.TagName.DIV;\n  var div = dh.createElement(/** @type {string} */ (tagToInsert));\n  quoteNode.parentNode.insertBefore(div, secondHalf);\n\n  // The div needs non-whitespace contents in order for the insertion point\n  // to get correctly inserted.\n  div.innerHTML = '&nbsp;';\n\n  // Moving the range 1 char isn't enough when you have markup.\n  // This moves the range to the end of the nbsp.\n  var range = dh.getDocument().selection.createRange();\n  range.moveToElementText(splitNode);\n  range.move('character', 2);\n  range.select();\n\n  // Remove the no-longer-necessary nbsp.\n  goog.dom.removeChildren(div);\n\n  // Clear the original selection.\n  range.pasteHTML('');\n\n  // We need to remove clone from the DOM but just removing clone alone will\n  // not suffice. Let's assume we have the following DOM structure and the\n  // cursor is placed after the first numbered list item \"one\".\n  //\n  // <blockquote class=\"gmail-quote\">\n  //   <div><div>a</div><ol><li>one|</li></ol></div>\n  //   <div>b</div>\n  // </blockquote>\n  //\n  // After pressing enter, we have the following structure.\n  //\n  // <blockquote class=\"gmail-quote\">\n  //   <div><div>a</div><ol><li>one|</li></ol></div>\n  // </blockquote>\n  // <div>&nbsp;</div>\n  // <blockquote class=\"gmail-quote\">\n  //   <div><ol><li><span id=\"\"></span></li></ol></div>\n  //   <div>b</div>\n  // </blockquote>\n  //\n  // The clone is contained in a subtree which should be removed. This stems\n  // from the fact that we invoke splitDomTreeAt with the dummy span\n  // as the starting splitting point and this results in the empty subtree\n  // <div><ol><li><span id=\"\"></span></li></ol></div>.\n  //\n  // We resolve this by walking up the tree till we either reach the\n  // blockquote or till we hit a node with more than one child. The resulting\n  // node is then removed from the DOM.\n  goog.editor.plugins.Blockquote.findAndRemoveSingleChildAncestor_(\n      clone, secondHalf);\n\n  goog.editor.plugins.Blockquote.removeAllWhiteSpaceNodes_(\n      [quoteNode, secondHalf]);\n  return true;\n};\n","^17",1579837703000,"^18",["^19",["^1T","^2M","^2O","^3G","^2R","^2V","^Z","^2J","^3Y","^31","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/blockquote.js"],"^1J",["^19",["~$goog.editor.plugins.Blockquote"]],"^X",true,"^Y",["^Z","^1T","^3G","^1V","^2O","^2V","^2R","^3Y","^31","^2M","^2J"]],["^ ","^[",[1579837703000],"^10","goog.dom.browserrange.ierange.js","^11",["^12","goog/dom/browserrange/ierange.js"],"^13","goog/dom/browserrange/ierange.js","^14","^15","^16","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the IE browser specific range wrapper.\n * @suppress {missingRequire} Cannot depend on goog.dom.browserrange because it\n *     creates a circular dependency.\n *\n * DO NOT USE THIS FILE DIRECTLY.  Use goog.dom.Range instead.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.dom.browserrange.IeRange');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.RangeEndpoint');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.browserrange.AbstractRange');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.uncheckedconversions');\ngoog.require('goog.log');\ngoog.require('goog.string');\n\n\n\n/**\n * The constructor for IE specific browser ranges.\n * @param {TextRange} range The range object.\n * @param {Document} doc The document the range exists in.\n * @constructor\n * @extends {goog.dom.browserrange.AbstractRange}\n * @final\n */\ngoog.dom.browserrange.IeRange = function(range, doc) {\n  /**\n   * Lazy cache of the node containing the entire selection.\n   * @private {?Node}\n   */\n  this.parentNode_ = null;\n\n  /**\n   * Lazy cache of the node containing the start of the selection.\n   * @private {?Node}\n   */\n  this.startNode_ = null;\n\n  /**\n   * Lazy cache of the node containing the end of the selection.\n   * @private {?Node}\n   */\n  this.endNode_ = null;\n\n  /**\n   * Lazy cache of the offset in startNode_ where this range starts.\n   * @private {number}\n   */\n  this.startOffset_ = -1;\n\n  /**\n   * Lazy cache of the offset in endNode_ where this range ends.\n   * @private {number}\n   */\n  this.endOffset_ = -1;\n\n  /**\n   * The browser range object this class wraps.\n   * @private {TextRange}\n   */\n  this.range_ = range;\n\n  /**\n   * The document the range exists in.\n   * @private {Document}\n   */\n  this.doc_ = doc;\n};\ngoog.inherits(\n    goog.dom.browserrange.IeRange, goog.dom.browserrange.AbstractRange);\n\n\n/**\n * Logging object.\n * @type {goog.log.Logger}\n * @private\n */\ngoog.dom.browserrange.IeRange.logger_ =\n    goog.log.getLogger('goog.dom.browserrange.IeRange');\n\n\n/**\n * Returns a browser range spanning the given node's contents.\n * @param {Node} node The node to select.\n * @return {!TextRange} A browser range spanning the node's contents.\n * @private\n */\ngoog.dom.browserrange.IeRange.getBrowserRangeForNode_ = function(node) {\n  var nodeRange = goog.dom.getOwnerDocument(node).body.createTextRange();\n  if (node.nodeType == goog.dom.NodeType.ELEMENT) {\n    // Elements are easy.\n    nodeRange.moveToElementText(node);\n    // Note(user) : If there are no child nodes of the element, the\n    // range.htmlText includes the element's outerHTML. The range created above\n    // is not collapsed, and should be collapsed explicitly.\n    // Example : node = <div></div>\n    // But if the node is sth like <br>, it shouldn't be collapsed.\n    if (goog.dom.browserrange.canContainRangeEndpoint(node) &&\n        !node.childNodes.length) {\n      nodeRange.collapse(false);\n    }\n  } else {\n    // Text nodes are hard.\n    // Compute the offset from the nearest element related position.\n    var offset = 0;\n    var sibling = node;\n    while (sibling = sibling.previousSibling) {\n      var nodeType = sibling.nodeType;\n      if (nodeType == goog.dom.NodeType.TEXT) {\n        offset += sibling.length;\n      } else if (nodeType == goog.dom.NodeType.ELEMENT) {\n        // Move to the space after this element.\n        nodeRange.moveToElementText(sibling);\n        break;\n      }\n    }\n\n    if (!sibling) {\n      nodeRange.moveToElementText(node.parentNode);\n    }\n\n    nodeRange.collapse(!sibling);\n\n    if (offset) {\n      nodeRange.move('character', offset);\n    }\n\n    nodeRange.moveEnd('character', node.length);\n  }\n\n  return nodeRange;\n};\n\n\n/**\n * Returns a browser range spanning the given nodes.\n * @param {Node} startNode The node to start with.\n * @param {number} startOffset The offset within the start node.\n * @param {Node} endNode The node to end with.\n * @param {number} endOffset The offset within the end node.\n * @return {!TextRange} A browser range spanning the node's contents.\n * @private\n */\ngoog.dom.browserrange.IeRange.getBrowserRangeForNodes_ = function(\n    startNode, startOffset, endNode, endOffset) {\n  // Create a range starting at the correct start position.\n  var child, collapse = false;\n  if (startNode.nodeType == goog.dom.NodeType.ELEMENT) {\n    if (startOffset > startNode.childNodes.length) {\n      goog.log.error(\n          goog.dom.browserrange.IeRange.logger_,\n          'Cannot have startOffset > startNode child count');\n    }\n    child = startNode.childNodes[startOffset];\n    collapse = !child;\n    startNode = child || startNode.lastChild || startNode;\n    startOffset = 0;\n  }\n  var leftRange =\n      goog.dom.browserrange.IeRange.getBrowserRangeForNode_(startNode);\n\n  // This happens only when startNode is a text node.\n  if (startOffset) {\n    leftRange.move('character', startOffset);\n  }\n\n\n  // The range movements in IE are still an approximation to the standard W3C\n  // behavior, and IE has its trickery when it comes to htmlText and text\n  // properties of the range. So we short-circuit computation whenever we can.\n  if (startNode == endNode && startOffset == endOffset) {\n    leftRange.collapse(true);\n    return leftRange;\n  }\n\n  // This can happen only when the startNode is an element, and there is no node\n  // at the given offset. We start at the last point inside the startNode in\n  // that case.\n  if (collapse) {\n    leftRange.collapse(false);\n  }\n\n  // Create a range that ends at the right position.\n  collapse = false;\n  if (endNode.nodeType == goog.dom.NodeType.ELEMENT) {\n    if (endOffset > endNode.childNodes.length) {\n      goog.log.error(\n          goog.dom.browserrange.IeRange.logger_,\n          'Cannot have endOffset > endNode child count');\n    }\n    child = endNode.childNodes[endOffset];\n    endNode = child || endNode.lastChild || endNode;\n    endOffset = 0;\n    collapse = !child;\n  }\n  var rightRange =\n      goog.dom.browserrange.IeRange.getBrowserRangeForNode_(endNode);\n  rightRange.collapse(!collapse);\n  if (endOffset) {\n    rightRange.moveEnd('character', endOffset);\n  }\n\n  // Merge and return.\n  leftRange.setEndPoint('EndToEnd', rightRange);\n  return leftRange;\n};\n\n\n/**\n * Create a range object that selects the given node's text.\n * @param {Node} node The node to select.\n * @return {!goog.dom.browserrange.IeRange} An IE range wrapper object.\n */\ngoog.dom.browserrange.IeRange.createFromNodeContents = function(node) {\n  var range = new goog.dom.browserrange.IeRange(\n      goog.dom.browserrange.IeRange.getBrowserRangeForNode_(node),\n      goog.dom.getOwnerDocument(node));\n\n  if (!goog.dom.browserrange.canContainRangeEndpoint(node)) {\n    range.startNode_ = range.endNode_ = range.parentNode_ = node.parentNode;\n    range.startOffset_ = goog.array.indexOf(range.parentNode_.childNodes, node);\n    range.endOffset_ = range.startOffset_ + 1;\n  } else {\n    // Note(user) : Emulate the behavior of W3CRange - Go to deepest possible\n    // range containers on both edges. It seems W3CRange did this to match the\n    // IE behavior, and now it is a circle. Changing W3CRange may break clients\n    // in all sorts of ways.\n    var tempNode, leaf = node;\n    while ((tempNode = leaf.firstChild) &&\n           goog.dom.browserrange.canContainRangeEndpoint(tempNode)) {\n      leaf = tempNode;\n    }\n    range.startNode_ = leaf;\n    range.startOffset_ = 0;\n\n    leaf = node;\n    while ((tempNode = leaf.lastChild) &&\n           goog.dom.browserrange.canContainRangeEndpoint(tempNode)) {\n      leaf = tempNode;\n    }\n    range.endNode_ = leaf;\n    range.endOffset_ = leaf.nodeType == goog.dom.NodeType.ELEMENT ?\n        leaf.childNodes.length :\n        leaf.length;\n    range.parentNode_ = node;\n  }\n  return range;\n};\n\n\n/**\n * Static method that returns the proper type of browser range.\n * @param {Node} startNode The node to start with.\n * @param {number} startOffset The offset within the start node.\n * @param {Node} endNode The node to end with.\n * @param {number} endOffset The offset within the end node.\n * @return {!goog.dom.browserrange.AbstractRange} A wrapper object.\n */\ngoog.dom.browserrange.IeRange.createFromNodes = function(\n    startNode, startOffset, endNode, endOffset) {\n  var range = new goog.dom.browserrange.IeRange(\n      goog.dom.browserrange.IeRange.getBrowserRangeForNodes_(\n          startNode, startOffset, endNode, endOffset),\n      goog.dom.getOwnerDocument(startNode));\n  range.startNode_ = startNode;\n  range.startOffset_ = startOffset;\n  range.endNode_ = endNode;\n  range.endOffset_ = endOffset;\n  return range;\n};\n\n\n/**\n * @return {!goog.dom.browserrange.IeRange} A clone of this range.\n * @override\n */\ngoog.dom.browserrange.IeRange.prototype.clone = function() {\n  var range =\n      new goog.dom.browserrange.IeRange(this.range_.duplicate(), this.doc_);\n  range.parentNode_ = this.parentNode_;\n  range.startNode_ = this.startNode_;\n  range.endNode_ = this.endNode_;\n  return range;\n};\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.getBrowserRange = function() {\n  return this.range_;\n};\n\n\n/**\n * Clears the cached values for containers.\n * @private\n */\ngoog.dom.browserrange.IeRange.prototype.clearCachedValues_ = function() {\n  this.parentNode_ = this.startNode_ = this.endNode_ = null;\n  this.startOffset_ = this.endOffset_ = -1;\n};\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.getContainer = function() {\n  if (!this.parentNode_) {\n    var selectText = this.range_.text;\n\n    // If the selection ends with spaces, we need to remove these to get the\n    // parent container of only the real contents.  This is to get around IE's\n    // inconsistency where it selects the spaces after a word when you double\n    // click, but leaves out the spaces during execCommands.\n    var range = this.range_.duplicate();\n    // We can't use goog.string.trimRight, as that will remove other whitespace\n    // too.\n    var rightTrimmedSelectText = selectText.replace(/ +$/, '');\n    var numSpacesAtEnd = selectText.length - rightTrimmedSelectText.length;\n    if (numSpacesAtEnd) {\n      range.moveEnd('character', -numSpacesAtEnd);\n    }\n\n    // Get the parent node.  This should be the end, but alas, it is not.\n    var parent = range.parentElement();\n\n    var htmlText = range.htmlText;\n    var htmlTextLen = goog.string.stripNewlines(htmlText).length;\n    if (this.isCollapsed() && htmlTextLen > 0) {\n      return (this.parentNode_ = parent);\n    }\n\n    // Deal with selection bug where IE thinks one of the selection's children\n    // is actually the selection's parent. Relies on the assumption that the\n    // HTML text of the parent container is longer than the length of the\n    // selection's HTML text.\n\n    // Also note IE will sometimes insert \\r and \\n whitespace, which should be\n    // disregarded. Otherwise the loop may run too long and return wrong parent\n    while (htmlTextLen > goog.string.stripNewlines(parent.outerHTML).length) {\n      parent = parent.parentNode;\n    }\n\n    // Deal with IE's selecting the outer tags when you double click\n    // If the innerText is the same, then we just want the inner node\n    while (parent.childNodes.length == 1 &&\n           parent.innerText ==\n               goog.dom.browserrange.IeRange.getNodeText_(parent.firstChild)) {\n      // A container should be an element which can have children or a text\n      // node. Elements like IMG, BR, etc. can not be containers.\n      if (!goog.dom.browserrange.canContainRangeEndpoint(parent.firstChild)) {\n        break;\n      }\n      parent = parent.firstChild;\n    }\n\n    // If the selection is empty, we may need to do extra work to position it\n    // properly.\n    if (selectText.length == 0) {\n      parent = this.findDeepestContainer_(parent);\n    }\n\n    this.parentNode_ = parent;\n  }\n\n  return this.parentNode_;\n};\n\n\n/**\n * Helper method to find the deepest parent for this range, starting\n * the search from `node`, which must contain the range.\n * @param {Node} node The node to start the search from.\n * @return {Node} The deepest parent for this range.\n * @private\n */\ngoog.dom.browserrange.IeRange.prototype.findDeepestContainer_ = function(node) {\n  var childNodes = node.childNodes;\n  for (var i = 0, len = childNodes.length; i < len; i++) {\n    var child = childNodes[i];\n\n    if (goog.dom.browserrange.canContainRangeEndpoint(child)) {\n      var childRange =\n          goog.dom.browserrange.IeRange.getBrowserRangeForNode_(child);\n      var start = goog.dom.RangeEndpoint.START;\n      var end = goog.dom.RangeEndpoint.END;\n\n      // There are two types of erratic nodes where the range over node has\n      // different htmlText than the node's outerHTML.\n      // Case 1 - A node with magic &nbsp; child. In this case :\n      //    nodeRange.htmlText shows &nbsp; ('<p>&nbsp;</p>), while\n      //    node.outerHTML doesn't show the magic node (<p></p>).\n      // Case 2 - Empty span. In this case :\n      //    node.outerHTML shows '<span></span>'\n      //    node.htmlText is just empty string ''.\n      var isChildRangeErratic = (childRange.htmlText != child.outerHTML);\n\n      // Moreover the inRange comparison fails only when the\n      var isNativeInRangeErratic = this.isCollapsed() && isChildRangeErratic;\n\n      // In case 2 mentioned above, childRange is also collapsed. So we need to\n      // compare start of this range with both start and end of child range.\n      var inChildRange = isNativeInRangeErratic ?\n          (this.compareBrowserRangeEndpoints(childRange, start, start) >= 0 &&\n           this.compareBrowserRangeEndpoints(childRange, start, end) <= 0) :\n          this.range_.inRange(childRange);\n      if (inChildRange) {\n        return this.findDeepestContainer_(child);\n      }\n    }\n  }\n\n  return node;\n};\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.getStartNode = function() {\n  if (!this.startNode_) {\n    this.startNode_ = this.getEndpointNode_(goog.dom.RangeEndpoint.START);\n    if (this.isCollapsed()) {\n      this.endNode_ = this.startNode_;\n    }\n  }\n  return this.startNode_;\n};\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.getStartOffset = function() {\n  if (this.startOffset_ < 0) {\n    this.startOffset_ = this.getOffset_(goog.dom.RangeEndpoint.START);\n    if (this.isCollapsed()) {\n      this.endOffset_ = this.startOffset_;\n    }\n  }\n  return this.startOffset_;\n};\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.getEndNode = function() {\n  if (this.isCollapsed()) {\n    return this.getStartNode();\n  }\n  if (!this.endNode_) {\n    this.endNode_ = this.getEndpointNode_(goog.dom.RangeEndpoint.END);\n  }\n  return this.endNode_;\n};\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.getEndOffset = function() {\n  if (this.isCollapsed()) {\n    return this.getStartOffset();\n  }\n  if (this.endOffset_ < 0) {\n    this.endOffset_ = this.getOffset_(goog.dom.RangeEndpoint.END);\n    if (this.isCollapsed()) {\n      this.startOffset_ = this.endOffset_;\n    }\n  }\n  return this.endOffset_;\n};\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.compareBrowserRangeEndpoints = function(\n    range, thisEndpoint, otherEndpoint) {\n  return this.range_.compareEndPoints(\n      (thisEndpoint == goog.dom.RangeEndpoint.START ? 'Start' : 'End') + 'To' +\n          (otherEndpoint == goog.dom.RangeEndpoint.START ? 'Start' : 'End'),\n      range);\n};\n\n\n/**\n * Recurses to find the correct node for the given endpoint.\n * @param {goog.dom.RangeEndpoint} endpoint The endpoint to get the node for.\n * @param {Node=} opt_node Optional node to start the search from.\n * @return {Node} The deepest node containing the endpoint.\n * @private\n */\ngoog.dom.browserrange.IeRange.prototype.getEndpointNode_ = function(\n    endpoint, opt_node) {\n\n  /** @type {Node} */\n  var node = opt_node || this.getContainer();\n\n  // If we're at a leaf in the DOM, we're done.\n  if (!node || !node.firstChild) {\n    return node;\n  }\n\n  var start = goog.dom.RangeEndpoint.START, end = goog.dom.RangeEndpoint.END;\n  var isStartEndpoint = endpoint == start;\n\n  // Find the first/last child that overlaps the selection.\n  // NOTE(user) : One of the children can be the magic &nbsp; node. This\n  // node will have only nodeType property as valid and accessible. All other\n  // dom related properties like ownerDocument, parentNode, nextSibling etc\n  // cause error when accessed. Therefore use the for-loop on childNodes to\n  // iterate.\n  for (var j = 0, length = node.childNodes.length; j < length; j++) {\n    var i = isStartEndpoint ? j : length - j - 1;\n    var child = node.childNodes[i];\n    var childRange;\n    try {\n      childRange = goog.dom.browserrange.createRangeFromNodeContents(child);\n    } catch (e) {\n      // If the child is the magic &nbsp; node, then the above will throw\n      // error. The magic node exists only when editing using keyboard, so can\n      // not add any unit test.\n      continue;\n    }\n    var ieRange = childRange.getBrowserRange();\n\n    // Case 1 : Finding end points when this range is collapsed.\n    // Note that in case of collapsed range, getEnd{Node,Offset} call\n    // getStart{Node,Offset}.\n    if (this.isCollapsed()) {\n      // Handle situations where caret is not in a text node. In such cases,\n      // the adjacent child won't be a valid range endpoint container.\n      if (!goog.dom.browserrange.canContainRangeEndpoint(child)) {\n        // The following handles a scenario like <div><BR>[caret]<BR></div>,\n        // where point should be (div, 1).\n        if (this.compareBrowserRangeEndpoints(ieRange, start, start) == 0) {\n          this.startOffset_ = this.endOffset_ = i;\n          return node;\n        }\n      } else if (childRange.containsRange(this)) {\n        // For collapsed range, we should invert the containsRange check with\n        // childRange.\n        return this.getEndpointNode_(endpoint, child);\n      }\n\n      // Case 2 - The first child encountered to have overlap this range is\n      // contained entirely in this range.\n    } else if (this.containsRange(childRange)) {\n      // If it is an element which can not be a range endpoint container, the\n      // current child offset can be used to deduce the endpoint offset.\n      if (!goog.dom.browserrange.canContainRangeEndpoint(child)) {\n        // Container can't be any deeper, so current node is the container.\n        if (isStartEndpoint) {\n          this.startOffset_ = i;\n        } else {\n          this.endOffset_ = i + 1;\n        }\n        return node;\n      }\n\n      // If child can contain range endpoints, recurse inside this child.\n      return this.getEndpointNode_(endpoint, child);\n\n      // Case 3 - Partial non-adjacency overlap.\n    } else if (\n        this.compareBrowserRangeEndpoints(ieRange, start, end) < 0 &&\n        this.compareBrowserRangeEndpoints(ieRange, end, start) > 0) {\n      // If this child overlaps the selection partially, recurse down to find\n      // the first/last child the next level down that overlaps the selection\n      // completely. We do not consider edge-adjacency (== 0) as overlap.\n      return this.getEndpointNode_(endpoint, child);\n    }\n  }\n\n  // None of the children of this node overlapped the selection, that means\n  // the selection starts/ends in this node directly.\n  return node;\n};\n\n\n/**\n * Compares one endpoint of this range with the endpoint of a node.\n * For internal methods, we should prefer this method to containsNode.\n * containsNode has a lot of false negatives when we're dealing with\n * {@code <br>} tags.\n *\n * @param {Node} node The node to compare against.\n * @param {goog.dom.RangeEndpoint} thisEndpoint The endpoint of this range\n *     to compare with.\n * @param {goog.dom.RangeEndpoint} otherEndpoint The endpoint of the node\n *     to compare with.\n * @return {number} 0 if the endpoints are equal, negative if this range\n *     endpoint comes before the other node endpoint, and positive otherwise.\n * @private\n */\ngoog.dom.browserrange.IeRange.prototype.compareNodeEndpoints_ = function(\n    node, thisEndpoint, otherEndpoint) {\n  /** @suppress {missingRequire} Circular dep with browserrange */\n  return this.range_.compareEndPoints(\n      (thisEndpoint == goog.dom.RangeEndpoint.START ? 'Start' : 'End') + 'To' +\n          (otherEndpoint == goog.dom.RangeEndpoint.START ? 'Start' : 'End'),\n      goog.dom.browserrange.createRangeFromNodeContents(node)\n          .getBrowserRange());\n};\n\n\n/**\n * Returns the offset into the start/end container.\n * @param {goog.dom.RangeEndpoint} endpoint The endpoint to get the offset for.\n * @param {Node=} opt_container The container to get the offset relative to.\n *     Defaults to the value returned by getStartNode/getEndNode.\n * @return {number} The offset.\n * @private\n */\ngoog.dom.browserrange.IeRange.prototype.getOffset_ = function(\n    endpoint, opt_container) {\n  var isStartEndpoint = endpoint == goog.dom.RangeEndpoint.START;\n  var container = opt_container ||\n      (isStartEndpoint ? this.getStartNode() : this.getEndNode());\n\n  if (container.nodeType == goog.dom.NodeType.ELEMENT) {\n    // Find the first/last child that overlaps the selection\n    var children = container.childNodes;\n    var len = children.length;\n    var edge = isStartEndpoint ? 0 : len - 1;\n    var sign = isStartEndpoint ? 1 : -1;\n\n    // We find the index in the child array of the endpoint of the selection.\n    for (var i = edge; i >= 0 && i < len; i += sign) {\n      var child = children[i];\n      // Ignore the child nodes, which could be end point containers.\n      /** @suppress {missingRequire} Circular dep with browserrange */\n      if (goog.dom.browserrange.canContainRangeEndpoint(child)) {\n        continue;\n      }\n      // Stop looping when we reach the edge of the selection.\n      var endPointCompare =\n          this.compareNodeEndpoints_(child, endpoint, endpoint);\n      if (endPointCompare == 0) {\n        return isStartEndpoint ? i : i + 1;\n      }\n    }\n\n    // When starting from the end in an empty container, we erroneously return\n    // -1: fix this to return 0.\n    return i == -1 ? 0 : i;\n  } else {\n    // Get a temporary range object.\n    var range = this.range_.duplicate();\n\n    // Create a range that selects the entire container.\n    var nodeRange =\n        goog.dom.browserrange.IeRange.getBrowserRangeForNode_(container);\n\n    // Now, intersect our range with the container range - this should give us\n    // the part of our selection that is in the container.\n    range.setEndPoint(isStartEndpoint ? 'EndToEnd' : 'StartToStart', nodeRange);\n\n    var rangeLength = range.text.length;\n    return isStartEndpoint ? container.length - rangeLength : rangeLength;\n  }\n};\n\n\n/**\n * Returns the text of the given node.  Uses IE specific properties.\n * @param {Node} node The node to retrieve the text of.\n * @return {string} The node's text.\n * @private\n */\ngoog.dom.browserrange.IeRange.getNodeText_ = function(node) {\n  return node.nodeType == goog.dom.NodeType.TEXT ? node.nodeValue :\n                                                   node.innerText;\n};\n\n\n/**\n * Tests whether this range is valid (i.e. whether its endpoints are still in\n * the document).  A range becomes invalid when, after this object was created,\n * either one or both of its endpoints are removed from the document.  Use of\n * an invalid range can lead to runtime errors, particularly in IE.\n * @return {boolean} Whether the range is valid.\n */\ngoog.dom.browserrange.IeRange.prototype.isRangeInDocument = function() {\n  var range = this.doc_.body.createTextRange();\n  range.moveToElementText(this.doc_.body);\n\n  return this.containsRange(\n      new goog.dom.browserrange.IeRange(range, this.doc_), true);\n};\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.isCollapsed = function() {\n  // Note(user) : The earlier implementation used (range.text == ''), but this\n  // fails when (range.htmlText == '<br>')\n  // Alternative: this.range_.htmlText == '';\n  return this.range_.compareEndPoints('StartToEnd', this.range_) == 0;\n};\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.getText = function() {\n  return this.range_.text;\n};\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.getValidHtml = function() {\n  return this.range_.htmlText;\n};\n\n\n// SELECTION MODIFICATION\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.select = function(opt_reverse) {\n  // IE doesn't support programmatic reversed selections.\n  this.range_.select();\n};\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.removeContents = function() {\n  // NOTE: Sometimes htmlText is non-empty, but the range is actually empty.\n  // TODO(gboyer): The htmlText check is probably unnecessary, but I left it in\n  // for paranoia.\n  if (!this.isCollapsed() && this.range_.htmlText) {\n    // Store some before-removal state.\n    var startNode = this.getStartNode();\n    var endNode = this.getEndNode();\n    var oldText = this.range_.text;\n\n    // IE sometimes deletes nodes unrelated to the selection.  This trick fixes\n    // that problem most of the time.  Even though it looks like a no-op, it is\n    // somehow changing IE's internal state such that empty unrelated nodes are\n    // no longer deleted.\n    var clone = this.range_.duplicate();\n    clone.moveStart('character', 1);\n    clone.moveStart('character', -1);\n\n    // However, sometimes moving the start back and forth ends up changing the\n    // range.\n    // TODO(gboyer): This condition used to happen for empty ranges, but (1)\n    // never worked, and (2) the isCollapsed call should protect against empty\n    // ranges better than before.  However, this is left for paranoia.\n    if (clone.text == oldText) {\n      this.range_ = clone;\n    }\n\n    // Use the browser's native deletion code.\n    this.range_.text = '';\n    this.clearCachedValues_();\n\n    // Unfortunately, when deleting a portion of a single text node, IE creates\n    // an extra text node unlike other browsers which just change the text in\n    // the node.  We normalize for that behavior here, making IE behave like all\n    // the other browsers.\n    var newStartNode = this.getStartNode();\n    var newStartOffset = this.getStartOffset();\n\n    try {\n      var sibling = startNode.nextSibling;\n      if (startNode == endNode && startNode.parentNode &&\n          startNode.nodeType == goog.dom.NodeType.TEXT && sibling &&\n          sibling.nodeType == goog.dom.NodeType.TEXT) {\n        startNode.nodeValue += sibling.nodeValue;\n        goog.dom.removeNode(sibling);\n\n        // Make sure to reselect the appropriate position.\n        this.range_ =\n            goog.dom.browserrange.IeRange.getBrowserRangeForNode_(newStartNode);\n        this.range_.move('character', newStartOffset);\n        this.clearCachedValues_();\n      }\n    } catch (e) {\n      // IE throws errors on orphaned nodes.\n    }\n  }\n};\n\n\n/**\n * @param {TextRange} range The range to get a dom helper for.\n * @return {!goog.dom.DomHelper} A dom helper for the document the range\n *     resides in.\n * @private\n */\ngoog.dom.browserrange.IeRange.getDomHelper_ = function(range) {\n  return goog.dom.getDomHelper(range.parentElement());\n};\n\n\n/**\n * Pastes the given element into the given range, returning the resulting\n * element.\n * @param {TextRange} range The range to paste into.\n * @param {Element} element The node to insert a copy of.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper object for the document\n *     the range resides in.\n * @return {Element} The resulting copy of element.\n * @private\n */\ngoog.dom.browserrange.IeRange.pasteElement_ = function(\n    range, element, opt_domHelper) {\n  opt_domHelper =\n      opt_domHelper || goog.dom.browserrange.IeRange.getDomHelper_(range);\n\n  // Make sure the node has a unique id.\n  var id;\n  var originalId = id = element.id;\n  if (!id) {\n    id = element.id = goog.string.createUniqueString();\n  }\n\n  // Insert (a clone of) the node.\n  range.pasteHTML(element.outerHTML);\n\n  // Pasting the outerHTML of the modified element into the document creates\n  // a clone of the element argument.  We want to return a reference to the\n  // clone, not the original.  However we need to remove the temporary ID\n  // first.\n  element = opt_domHelper.getElement(id);\n\n  // If element is null here, we failed.\n  if (element) {\n    if (!originalId) {\n      element.removeAttribute('id');\n    }\n  }\n\n  return element;\n};\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.surroundContents = function(element) {\n  // Make sure the element is detached from the document.\n  goog.dom.removeNode(element);\n\n  goog.dom.safe.setInnerHtml(\n      goog.asserts.assert(element),\n      goog.html.uncheckedconversions\n          .safeHtmlFromStringKnownToSatisfyTypeContract(\n              goog.string.Const.from(\n                  'IE more or less guarantees that range.htmlText is ' +\n                  'well-formed & valid.'),\n              this.range_.htmlText));\n  element = goog.dom.browserrange.IeRange.pasteElement_(this.range_, element);\n\n  // If element is null here, we failed.\n  if (element) {\n    this.range_.moveToElementText(element);\n  }\n\n  this.clearCachedValues_();\n\n  return element;\n};\n\n\n/**\n * Internal handler for inserting a node.\n * @param {TextRange} clone A clone of this range's browser range object.\n * @param {Node} node The node to insert.\n * @param {boolean} before Whether to insert the node before or after the range.\n * @param {goog.dom.DomHelper=} opt_domHelper The dom helper to use.\n * @return {Node} The resulting copy of node.\n * @private\n */\ngoog.dom.browserrange.IeRange.insertNode_ = function(\n    clone, node, before, opt_domHelper) {\n  // Get a DOM helper.\n  opt_domHelper =\n      opt_domHelper || goog.dom.browserrange.IeRange.getDomHelper_(clone);\n\n  // If it's not an element, wrap it in one.\n  var isNonElement;\n  if (node.nodeType != goog.dom.NodeType.ELEMENT) {\n    isNonElement = true;\n    node = opt_domHelper.createDom(goog.dom.TagName.DIV, null, node);\n  }\n\n  clone.collapse(before);\n  node = goog.dom.browserrange.IeRange.pasteElement_(\n      clone,\n      /** @type {!Element} */ (node), opt_domHelper);\n\n  // If we didn't want an element, unwrap the element and return the node.\n  if (isNonElement) {\n    // pasteElement_() may have returned a copy of the wrapper div, and the\n    // node it wraps could also be a new copy. So we must extract that new\n    // node from the new wrapper.\n    var newNonElement = node.firstChild;\n    opt_domHelper.flattenElement(node);\n    node = newNonElement;\n  }\n\n  return node;\n};\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.insertNode = function(node, before) {\n  var output = goog.dom.browserrange.IeRange.insertNode_(\n      this.range_.duplicate(), node, before);\n  this.clearCachedValues_();\n  return output;\n};\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.surroundWithNodes = function(\n    startNode, endNode) {\n  var clone1 = this.range_.duplicate();\n  var clone2 = this.range_.duplicate();\n  goog.dom.browserrange.IeRange.insertNode_(clone1, startNode, true);\n  goog.dom.browserrange.IeRange.insertNode_(clone2, endNode, false);\n\n  this.clearCachedValues_();\n};\n\n\n/** @override */\ngoog.dom.browserrange.IeRange.prototype.collapse = function(toStart) {\n  this.range_.collapse(toStart);\n\n  if (toStart) {\n    this.endNode_ = this.startNode_;\n    this.endOffset_ = this.startOffset_;\n  } else {\n    this.startNode_ = this.endNode_;\n    this.startOffset_ = this.endOffset_;\n  }\n};\n","^17",1579837703000,"^18",["^19",["^1T","^3G","^2D","^Z","^<3","^2J","^2[","~$goog.dom.browserrange.AbstractRange","~$goog.dom.RangeEndpoint","^35","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/browserrange/ierange.js"],"^1J",["^19",["^[8"]],"^X",true,"^Y",["^Z","^35","^1T","^3G","^[J","^1V","^[I","^2[","^<3","^2J","^2D"]],["^ ","^[",[1579837703000],"^10","goog.labs.events.nondisposableeventtarget.js","^11",["^12","goog/labs/events/nondisposableeventtarget.js"],"^13","goog/labs/events/nondisposableeventtarget.js","^14","^15","^16","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An implementation of {@link goog.events.Listenable} that does\n * not need to be disposed.\n */\n\ngoog.provide('goog.labs.events.NonDisposableEventTarget');\n\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.Listenable');\ngoog.require('goog.events.ListenerMap');\ngoog.require('goog.object');\n\n\n\n/**\n * An implementation of `goog.events.Listenable` with full W3C\n * EventTarget-like support (capture/bubble mechanism, stopping event\n * propagation, preventing default actions).\n *\n * You may subclass this class to turn your class into a Listenable.\n *\n * Unlike {@link goog.events.EventTarget}, this class does not implement\n * {@link goog.disposable.IDisposable}. Instances of this class that have had\n * It is not necessary to call {@link goog.dispose}\n * or {@link #removeAllListeners} in order for an instance of this class\n * to be garbage collected.\n *\n * Unless propagation is stopped, an event dispatched by an\n * EventTarget will bubble to the parent returned by\n * `getParentEventTarget`. To set the parent, call\n * `setParentEventTarget`. Subclasses that don't support\n * changing the parent can override the setter to throw an error.\n *\n * Example usage:\n * <pre>\n *   var source = new goog.labs.events.NonDisposableEventTarget();\n *   function handleEvent(e) {\n *     alert('Type: ' + e.type + '; Target: ' + e.target);\n *   }\n *   source.listen('foo', handleEvent);\n *   source.dispatchEvent('foo'); // will call handleEvent\n * </pre>\n *\n * TODO(chrishenry|johnlenz): Consider a more modern, less viral\n * (not based on inheritance) replacement of goog.Disposable, which will allow\n * goog.events.EventTarget to not be disposable.\n *\n * @constructor\n * @implements {goog.events.Listenable}\n * @final\n */\ngoog.labs.events.NonDisposableEventTarget = function() {\n  /**\n   * Maps of event type to an array of listeners.\n   * @private {!goog.events.ListenerMap}\n   */\n  this.eventTargetListeners_ = new goog.events.ListenerMap(this);\n};\ngoog.events.Listenable.addImplementation(\n    goog.labs.events.NonDisposableEventTarget);\n\n\n/**\n * An artificial cap on the number of ancestors you can have. This is mainly\n * for loop detection.\n * @const {number}\n * @private\n */\ngoog.labs.events.NonDisposableEventTarget.MAX_ANCESTORS_ = 1000;\n\n\n/**\n * Parent event target, used during event bubbling.\n * @private {?goog.events.Listenable}\n */\ngoog.labs.events.NonDisposableEventTarget.prototype.parentEventTarget_ = null;\n\n\n/** @override */\ngoog.labs.events.NonDisposableEventTarget.prototype.getParentEventTarget =\n    function() {\n  return this.parentEventTarget_;\n};\n\n\n/**\n * Sets the parent of this event target to use for capture/bubble\n * mechanism.\n * @param {goog.events.Listenable} parent Parent listenable (null if none).\n */\ngoog.labs.events.NonDisposableEventTarget.prototype.setParentEventTarget =\n    function(parent) {\n  this.parentEventTarget_ = parent;\n};\n\n\n/** @override */\ngoog.labs.events.NonDisposableEventTarget.prototype.dispatchEvent = function(\n    e) {\n  this.assertInitialized_();\n  var ancestorsTree, ancestor = this.getParentEventTarget();\n  if (ancestor) {\n    ancestorsTree = [];\n    var ancestorCount = 1;\n    for (; ancestor; ancestor = ancestor.getParentEventTarget()) {\n      ancestorsTree.push(ancestor);\n      goog.asserts.assert(\n          (++ancestorCount <\n           goog.labs.events.NonDisposableEventTarget.MAX_ANCESTORS_),\n          'infinite loop');\n    }\n  }\n\n  return goog.labs.events.NonDisposableEventTarget.dispatchEventInternal_(\n      this, e, ancestorsTree);\n};\n\n\n/** @override */\ngoog.labs.events.NonDisposableEventTarget.prototype.listen = function(\n    type, listener, opt_useCapture, opt_listenerScope) {\n  this.assertInitialized_();\n  return this.eventTargetListeners_.add(\n      String(type), listener, false /* callOnce */, opt_useCapture,\n      opt_listenerScope);\n};\n\n\n/** @override */\ngoog.labs.events.NonDisposableEventTarget.prototype.listenOnce = function(\n    type, listener, opt_useCapture, opt_listenerScope) {\n  return this.eventTargetListeners_.add(\n      String(type), listener, true /* callOnce */, opt_useCapture,\n      opt_listenerScope);\n};\n\n\n/** @override */\ngoog.labs.events.NonDisposableEventTarget.prototype.unlisten = function(\n    type, listener, opt_useCapture, opt_listenerScope) {\n  return this.eventTargetListeners_.remove(\n      String(type), listener, opt_useCapture, opt_listenerScope);\n};\n\n\n/** @override */\ngoog.labs.events.NonDisposableEventTarget.prototype.unlistenByKey = function(\n    key) {\n  return this.eventTargetListeners_.removeByKey(key);\n};\n\n\n/** @override */\ngoog.labs.events.NonDisposableEventTarget.prototype.removeAllListeners =\n    function(opt_type) {\n  return this.eventTargetListeners_.removeAll(opt_type);\n};\n\n\n/** @override */\ngoog.labs.events.NonDisposableEventTarget.prototype.fireListeners = function(\n    type, capture, eventObject) {\n  // TODO(chrishenry): Original code avoids array creation when there\n  // is no listener, so we do the same. If this optimization turns\n  // out to be not required, we can replace this with\n  // getListeners(type, capture) instead, which is simpler.\n  var listenerArray = this.eventTargetListeners_.listeners[String(type)];\n  if (!listenerArray) {\n    return true;\n  }\n  listenerArray = goog.array.clone(listenerArray);\n\n  var rv = true;\n  for (var i = 0; i < listenerArray.length; ++i) {\n    var listener = listenerArray[i];\n    // We might not have a listener if the listener was removed.\n    if (listener && !listener.removed && listener.capture == capture) {\n      var listenerFn = listener.listener;\n      var listenerHandler = listener.handler || listener.src;\n\n      if (listener.callOnce) {\n        this.unlistenByKey(listener);\n      }\n      rv = listenerFn.call(listenerHandler, eventObject) !== false && rv;\n    }\n  }\n\n  return rv && eventObject.returnValue_ != false;\n};\n\n\n/** @override */\ngoog.labs.events.NonDisposableEventTarget.prototype.getListeners = function(\n    type, capture) {\n  return this.eventTargetListeners_.getListeners(String(type), capture);\n};\n\n\n/** @override */\ngoog.labs.events.NonDisposableEventTarget.prototype.getListener = function(\n    type, listener, capture, opt_listenerScope) {\n  return this.eventTargetListeners_.getListener(\n      String(type), listener, capture, opt_listenerScope);\n};\n\n\n/** @override */\ngoog.labs.events.NonDisposableEventTarget.prototype.hasListener = function(\n    opt_type, opt_capture) {\n  var id = (opt_type !== undefined) ? String(opt_type) : undefined;\n  return this.eventTargetListeners_.hasListener(id, opt_capture);\n};\n\n\n/**\n * Asserts that the event target instance is initialized properly.\n * @private\n */\ngoog.labs.events.NonDisposableEventTarget.prototype.assertInitialized_ =\n    function() {\n  goog.asserts.assert(\n      this.eventTargetListeners_,\n      'Event target is not initialized. Did you call the superclass ' +\n          '(goog.labs.events.NonDisposableEventTarget) constructor?');\n};\n\n\n/**\n * Dispatches the given event on the ancestorsTree.\n *\n * TODO(chrishenry): Look for a way to reuse this logic in\n * goog.events, if possible.\n * @param {!Object} target The target to dispatch on.\n * @param {goog.events.Event|Object|string} e The event object.\n * @param {Array<goog.events.Listenable>=} opt_ancestorsTree The ancestors\n *     tree of the target, in reverse order from the closest ancestor\n *     to the root event target. May be null if the target has no ancestor.\n * @return {boolean} If anyone called preventDefault on the event object (or\n *     if any of the listeners returns false) this will also return false.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.labs.events.NonDisposableEventTarget.dispatchEventInternal_ = function(\n    target, e, opt_ancestorsTree) {\n  var type = e.type || /** @type {string} */ (e);\n\n  // If accepting a string or object, create a custom event object so that\n  // preventDefault and stopPropagation work with the event.\n  if (typeof e === 'string') {\n    e = new goog.events.Event(e, target);\n  } else if (!(e instanceof goog.events.Event)) {\n    var oldEvent = e;\n    e = new goog.events.Event(type, target);\n    goog.object.extend(e, oldEvent);\n  } else {\n    e.target = e.target || target;\n  }\n\n  var rv = true, currentTarget;\n\n  // Executes all capture listeners on the ancestors, if any.\n  if (opt_ancestorsTree) {\n    for (var i = opt_ancestorsTree.length - 1; !e.propagationStopped_ && i >= 0;\n         i--) {\n      currentTarget = e.currentTarget = opt_ancestorsTree[i];\n      rv = currentTarget.fireListeners(type, true, e) && rv;\n    }\n  }\n\n  // Executes capture and bubble listeners on the target.\n  if (!e.propagationStopped_) {\n    currentTarget = e.currentTarget = target;\n    rv = currentTarget.fireListeners(type, true, e) && rv;\n    if (!e.propagationStopped_) {\n      rv = currentTarget.fireListeners(type, false, e) && rv;\n    }\n  }\n\n  // Executes all bubble listeners on the ancestors, if any.\n  if (opt_ancestorsTree) {\n    for (i = 0; !e.propagationStopped_ && i < opt_ancestorsTree.length; i++) {\n      currentTarget = e.currentTarget = opt_ancestorsTree[i];\n      rv = currentTarget.fireListeners(type, false, e) && rv;\n    }\n  }\n\n  return rv;\n};\n","^17",1579837703000,"^18",["^19",["^1S","~$goog.events.Listenable","^Z","^2G","~$goog.events.ListenerMap","^<O","^35"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/events/nondisposableeventtarget.js"],"^1J",["^19",["~$goog.labs.events.NonDisposableEventTarget"]],"^X",true,"^Y",["^Z","^35","^1S","^<O","^[K","^[L","^2G"]],["^ ","^[",[1579837703000],"^10","goog.debug.fpsdisplay.js","^11",["^12","goog/debug/fpsdisplay.js"],"^13","goog/debug/fpsdisplay.js","^14","^15","^16","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Displays frames per second (FPS) for the current window.\n * Only supported in browsers that support requestAnimationFrame.\n * See: https://developer.mozilla.org/en/DOM/window.requestAnimationFrame.\n *\n * @see ../demos/fpsdisplay.html\n */\n\ngoog.provide('goog.debug.FpsDisplay');\n\ngoog.require('goog.asserts');\ngoog.require('goog.async.AnimationDelay');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.ui.Component');\n\n\n\n/**\n * Displays frames per seconds that the window this component is\n * rendered in is animating at.\n *\n * @param {goog.dom.DomHelper=} opt_domHelper An optional dom helper.\n * @constructor\n * @extends {goog.ui.Component}\n * @final\n */\ngoog.debug.FpsDisplay = function(opt_domHelper) {\n  goog.debug.FpsDisplay.base(this, 'constructor', opt_domHelper);\n};\ngoog.inherits(goog.debug.FpsDisplay, goog.ui.Component);\n\n\n/**\n * CSS class for the FPS display.\n */\ngoog.debug.FpsDisplay.CSS = goog.getCssName('goog-fps-display');\n\n\n/**\n * The number of samples per FPS report.\n */\ngoog.debug.FpsDisplay.SAMPLES = 10;\n\n\n/**\n * The current animation.\n * @type {?goog.debug.FpsDisplay.FpsAnimation_}\n * @private\n */\ngoog.debug.FpsDisplay.prototype.animation_ = null;\n\n\n/** @override */\ngoog.debug.FpsDisplay.prototype.createDom = function() {\n  this.setElementInternal(\n      this.getDomHelper().createDom(\n          goog.dom.TagName.DIV, goog.debug.FpsDisplay.CSS));\n};\n\n\n/** @override */\ngoog.debug.FpsDisplay.prototype.enterDocument = function() {\n  goog.debug.FpsDisplay.base(this, 'enterDocument');\n  this.animation_ = new goog.debug.FpsDisplay.FpsAnimation_(this.getElement());\n  this.delay_ = new goog.async.AnimationDelay(\n      this.handleDelay_, this.getDomHelper().getWindow(), this);\n  this.delay_.start();\n};\n\n\n/**\n * @param {number} now The current time.\n * @private\n */\ngoog.debug.FpsDisplay.prototype.handleDelay_ = function(now) {\n  if (this.isInDocument()) {\n    this.animation_.onAnimationFrame(now);\n    this.delay_.start();\n  }\n};\n\n\n/** @override */\ngoog.debug.FpsDisplay.prototype.exitDocument = function() {\n  goog.debug.FpsDisplay.base(this, 'exitDocument');\n  this.animation_ = null;\n  goog.dispose(this.delay_);\n};\n\n\n/**\n * @return {number} The average frames per second.\n */\ngoog.debug.FpsDisplay.prototype.getFps = function() {\n  goog.asserts.assert(\n      this.isInDocument(), 'Render the FPS display before querying FPS');\n  return this.animation_.lastFps_;\n};\n\n\n\n/**\n * @param {Element} elem An element to hold the FPS count.\n * @constructor\n * @private\n */\ngoog.debug.FpsDisplay.FpsAnimation_ = function(elem) {\n  /**\n   * An element to hold the current FPS rate.\n   * @type {Element}\n   * @private\n   */\n  this.element_ = elem;\n\n  /**\n   * The number of frames observed so far.\n   * @type {number}\n   * @private\n   */\n  this.frameNumber_ = 0;\n};\n\n\n/**\n * The last time which we reported FPS at.\n * @type {number}\n * @private\n */\ngoog.debug.FpsDisplay.FpsAnimation_.prototype.lastTime_ = 0;\n\n\n/**\n * The last average FPS.\n * @type {number}\n * @private\n */\ngoog.debug.FpsDisplay.FpsAnimation_.prototype.lastFps_ = -1;\n\n\n/**\n * @param {number} now The current time.\n */\ngoog.debug.FpsDisplay.FpsAnimation_.prototype.onAnimationFrame = function(now) {\n  var SAMPLES = goog.debug.FpsDisplay.SAMPLES;\n  if (this.frameNumber_ % SAMPLES == 0) {\n    this.lastFps_ = Math.round((1000 * SAMPLES) / (now - this.lastTime_));\n    goog.dom.setTextContent(this.element_, this.lastFps_);\n    this.lastTime_ = now;\n  }\n  this.frameNumber_++;\n};\n","^17",1579837703000,"^18",["^19",["~$goog.async.AnimationDelay","^1S","^1T","^22","^Z","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/fpsdisplay.js"],"^1J",["^19",["~$goog.debug.FpsDisplay"]],"^X",true,"^Y",["^Z","^1S","^[N","^1T","^1V","^22"]],["^ ","^[",[1579837703000],"^2F",true,"^10","goog.streams.full.js","^11",["^12","goog/streams/full.js"],"^13","goog/streams/full.js","^14","^15","^16","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A full ponyfill of the ReadableStream native API.\n */\ngoog.module('goog.streams.full');\n\nconst fullImpl = goog.require('goog.streams.fullImpl');\nconst fullNativeImpl = goog.require('goog.streams.fullNativeImpl');\nconst {ReadableStream, ReadableStreamAsyncIterator, ReadableStreamDefaultController, ReadableStreamDefaultReader, ReadableStreamStrategy, ReadableStreamUnderlyingSource} = goog.require('goog.streams.fullTypes');\nconst {USE_NATIVE_IMPLEMENTATION} = goog.require('goog.streams.defines');\n\n/**\n * Creates and returns a new ReadableStream.\n *\n * The underlying source should only have a start() method, and no other\n * properties.\n * @param {!ReadableStreamUnderlyingSource<T>=} underlyingSource\n * @param {!ReadableStreamStrategy<T>=} strategy\n * @return {!ReadableStream<T>}\n * @suppress {strictMissingProperties}\n * @template T\n */\nfunction newReadableStream(underlyingSource = {}, strategy = {}) {\n  if (USE_NATIVE_IMPLEMENTATION === 'true' ||\n      (USE_NATIVE_IMPLEMENTATION === 'detect' && goog.global.ReadableStream)) {\n    return fullNativeImpl.newReadableStream(underlyingSource, strategy);\n  } else {\n    return fullImpl.newReadableStream(underlyingSource, strategy);\n  }\n}\n\nexports = {\n  ReadableStream,\n  ReadableStreamAsyncIterator,\n  ReadableStreamDefaultController,\n  ReadableStreamDefaultReader,\n  ReadableStreamStrategy,\n  ReadableStreamUnderlyingSource,\n  newReadableStream,\n};\n","^17",1579837703000,"^18",["^19",["^Z","~$goog.streams.fullImpl","~$goog.streams.defines","~$goog.streams.fullTypes","~$goog.streams.fullNativeImpl"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/streams/full.js"],"^1J",["^19",["~$goog.streams.full"]],"^X",true,"^Y",["^Z","^[P","^[S","^[R","^[Q"]],["^ ","^[",[1579837703000],"^10","goog.structs.structs.js","^11",["^12","goog/structs/structs.js"],"^13","goog/structs/structs.js","^14","^15","^16","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Generics method for collection-like classes and objects.\n *\n * @author arv@google.com (Erik Arvidsson)\n *\n * This file contains functions to work with collections. It supports using\n * Map, Set, Array and Object and other classes that implement collection-like\n * methods.\n * @suppress {strictMissingProperties}\n */\n\n\ngoog.provide('goog.structs');\n\ngoog.require('goog.array');\ngoog.require('goog.object');\n\n\n// We treat an object as a dictionary if it has getKeys or it is an object that\n// isn't arrayLike.\n\n\n/**\n * Returns the number of values in the collection-like object.\n * @param {Object} col The collection-like object.\n * @return {number} The number of values in the collection-like object.\n */\ngoog.structs.getCount = function(col) {\n  if (col.getCount && typeof col.getCount == 'function') {\n    return col.getCount();\n  }\n  if (goog.isArrayLike(col) || typeof col === 'string') {\n    return col.length;\n  }\n  return goog.object.getCount(col);\n};\n\n\n/**\n * Returns the values of the collection-like object.\n * @param {Object} col The collection-like object.\n * @return {!Array<?>} The values in the collection-like object.\n */\ngoog.structs.getValues = function(col) {\n  if (col.getValues && typeof col.getValues == 'function') {\n    return col.getValues();\n  }\n  if (typeof col === 'string') {\n    return col.split('');\n  }\n  if (goog.isArrayLike(col)) {\n    var rv = [];\n    var l = col.length;\n    for (var i = 0; i < l; i++) {\n      rv.push(col[i]);\n    }\n    return rv;\n  }\n  return goog.object.getValues(col);\n};\n\n\n/**\n * Returns the keys of the collection. Some collections have no notion of\n * keys/indexes and this function will return undefined in those cases.\n * @param {Object} col The collection-like object.\n * @return {!Array|undefined} The keys in the collection.\n */\ngoog.structs.getKeys = function(col) {\n  if (col.getKeys && typeof col.getKeys == 'function') {\n    return col.getKeys();\n  }\n  // if we have getValues but no getKeys we know this is a key-less collection\n  if (col.getValues && typeof col.getValues == 'function') {\n    return undefined;\n  }\n  if (goog.isArrayLike(col) || typeof col === 'string') {\n    var rv = [];\n    var l = col.length;\n    for (var i = 0; i < l; i++) {\n      rv.push(i);\n    }\n    return rv;\n  }\n\n  return goog.object.getKeys(col);\n};\n\n\n/**\n * Whether the collection contains the given value. This is O(n) and uses\n * equals (==) to test the existence.\n * @param {Object} col The collection-like object.\n * @param {*} val The value to check for.\n * @return {boolean} True if the map contains the value.\n */\ngoog.structs.contains = function(col, val) {\n  if (col.contains && typeof col.contains == 'function') {\n    return col.contains(val);\n  }\n  if (col.containsValue && typeof col.containsValue == 'function') {\n    return col.containsValue(val);\n  }\n  if (goog.isArrayLike(col) || typeof col === 'string') {\n    return goog.array.contains(/** @type {!Array<?>} */ (col), val);\n  }\n  return goog.object.containsValue(col, val);\n};\n\n\n/**\n * Whether the collection is empty.\n * @param {Object} col The collection-like object.\n * @return {boolean} True if empty.\n */\ngoog.structs.isEmpty = function(col) {\n  if (col.isEmpty && typeof col.isEmpty == 'function') {\n    return col.isEmpty();\n  }\n\n  // We do not use goog.string.isEmptyOrWhitespace because here we treat the\n  // string as\n  // collection and as such even whitespace matters\n\n  if (goog.isArrayLike(col) || typeof col === 'string') {\n    return goog.array.isEmpty(/** @type {!Array<?>} */ (col));\n  }\n  return goog.object.isEmpty(col);\n};\n\n\n/**\n * Removes all the elements from the collection.\n * @param {Object} col The collection-like object.\n */\ngoog.structs.clear = function(col) {\n  // NOTE(arv): This should not contain strings because strings are immutable\n  if (col.clear && typeof col.clear == 'function') {\n    col.clear();\n  } else if (goog.isArrayLike(col)) {\n    goog.array.clear(/** @type {IArrayLike<?>} */ (col));\n  } else {\n    goog.object.clear(col);\n  }\n};\n\n\n/**\n * Calls a function for each value in a collection. The function takes\n * three arguments; the value, the key and the collection.\n *\n * @param {S} col The collection-like object.\n * @param {function(this:T,?,?,S):?} f The function to call for every value.\n *     This function takes\n *     3 arguments (the value, the key or undefined if the collection has no\n *     notion of keys, and the collection) and the return value is irrelevant.\n * @param {T=} opt_obj The object to be used as the value of 'this'\n *     within `f`.\n * @template T,S\n * @deprecated Use a more specific method, e.g. goog.array.forEach,\n *     goog.object.forEach, or for-of.\n */\ngoog.structs.forEach = function(col, f, opt_obj) {\n  if (col.forEach && typeof col.forEach == 'function') {\n    col.forEach(f, opt_obj);\n  } else if (goog.isArrayLike(col) || typeof col === 'string') {\n    goog.array.forEach(/** @type {!Array<?>} */ (col), f, opt_obj);\n  } else {\n    var keys = goog.structs.getKeys(col);\n    var values = goog.structs.getValues(col);\n    var l = values.length;\n    for (var i = 0; i < l; i++) {\n      f.call(/** @type {?} */ (opt_obj), values[i], keys && keys[i], col);\n    }\n  }\n};\n\n\n/**\n * Calls a function for every value in the collection. When a call returns true,\n * adds the value to a new collection (Array is returned by default).\n *\n * @param {S} col The collection-like object.\n * @param {function(this:T,?,?,S):boolean} f The function to call for every\n *     value. This function takes\n *     3 arguments (the value, the key or undefined if the collection has no\n *     notion of keys, and the collection) and should return a Boolean. If the\n *     return value is true the value is added to the result collection. If it\n *     is false the value is not included.\n * @param {T=} opt_obj The object to be used as the value of 'this'\n *     within `f`.\n * @return {!Object|!Array<?>} A new collection where the passed values are\n *     present. If col is a key-less collection an array is returned.  If col\n *     has keys and values a plain old JS object is returned.\n * @template T,S\n */\ngoog.structs.filter = function(col, f, opt_obj) {\n  if (typeof col.filter == 'function') {\n    return col.filter(f, opt_obj);\n  }\n  if (goog.isArrayLike(col) || typeof col === 'string') {\n    return goog.array.filter(/** @type {!Array<?>} */ (col), f, opt_obj);\n  }\n\n  var rv;\n  var keys = goog.structs.getKeys(col);\n  var values = goog.structs.getValues(col);\n  var l = values.length;\n  if (keys) {\n    rv = {};\n    for (var i = 0; i < l; i++) {\n      if (f.call(/** @type {?} */ (opt_obj), values[i], keys[i], col)) {\n        rv[keys[i]] = values[i];\n      }\n    }\n  } else {\n    // We should not use goog.array.filter here since we want to make sure that\n    // the index is undefined as well as make sure that col is passed to the\n    // function.\n    rv = [];\n    for (var i = 0; i < l; i++) {\n      if (f.call(opt_obj, values[i], undefined, col)) {\n        rv.push(values[i]);\n      }\n    }\n  }\n  return rv;\n};\n\n\n/**\n * Calls a function for every value in the collection and adds the result into a\n * new collection (defaults to creating a new Array).\n *\n * @param {S} col The collection-like object.\n * @param {function(this:T,?,?,S):V} f The function to call for every value.\n *     This function takes 3 arguments (the value, the key or undefined if the\n *     collection has no notion of keys, and the collection) and should return\n *     something. The result will be used as the value in the new collection.\n * @param {T=} opt_obj  The object to be used as the value of 'this'\n *     within `f`.\n * @return {!Object<V>|!Array<V>} A new collection with the new values.  If\n *     col is a key-less collection an array is returned.  If col has keys and\n *     values a plain old JS object is returned.\n * @template T,S,V\n */\ngoog.structs.map = function(col, f, opt_obj) {\n  if (typeof col.map == 'function') {\n    return col.map(f, opt_obj);\n  }\n  if (goog.isArrayLike(col) || typeof col === 'string') {\n    return goog.array.map(/** @type {!Array<?>} */ (col), f, opt_obj);\n  }\n\n  var rv;\n  var keys = goog.structs.getKeys(col);\n  var values = goog.structs.getValues(col);\n  var l = values.length;\n  if (keys) {\n    rv = {};\n    for (var i = 0; i < l; i++) {\n      rv[keys[i]] = f.call(/** @type {?} */ (opt_obj), values[i], keys[i], col);\n    }\n  } else {\n    // We should not use goog.array.map here since we want to make sure that\n    // the index is undefined as well as make sure that col is passed to the\n    // function.\n    rv = [];\n    for (var i = 0; i < l; i++) {\n      rv[i] = f.call(/** @type {?} */ (opt_obj), values[i], undefined, col);\n    }\n  }\n  return rv;\n};\n\n\n/**\n * Calls f for each value in a collection. If any call returns true this returns\n * true (without checking the rest). If all returns false this returns false.\n *\n * @param {S} col The collection-like object.\n * @param {function(this:T,?,?,S):boolean} f The function to call for every\n *     value. This function takes 3 arguments (the value, the key or undefined\n *     if the collection has no notion of keys, and the collection) and should\n *     return a boolean.\n * @param {T=} opt_obj  The object to be used as the value of 'this'\n *     within `f`.\n * @return {boolean} True if any value passes the test.\n * @template T,S\n */\ngoog.structs.some = function(col, f, opt_obj) {\n  if (typeof col.some == 'function') {\n    return col.some(f, opt_obj);\n  }\n  if (goog.isArrayLike(col) || typeof col === 'string') {\n    return goog.array.some(/** @type {!Array<?>} */ (col), f, opt_obj);\n  }\n  var keys = goog.structs.getKeys(col);\n  var values = goog.structs.getValues(col);\n  var l = values.length;\n  for (var i = 0; i < l; i++) {\n    if (f.call(/** @type {?} */ (opt_obj), values[i], keys && keys[i], col)) {\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Calls f for each value in a collection. If all calls return true this return\n * true this returns true. If any returns false this returns false at this point\n *  and does not continue to check the remaining values.\n *\n * @param {S} col The collection-like object.\n * @param {function(this:T,?,?,S):boolean} f The function to call for every\n *     value. This function takes 3 arguments (the value, the key or\n *     undefined if the collection has no notion of keys, and the collection)\n *     and should return a boolean.\n * @param {T=} opt_obj  The object to be used as the value of 'this'\n *     within `f`.\n * @return {boolean} True if all key-value pairs pass the test.\n * @template T,S\n */\ngoog.structs.every = function(col, f, opt_obj) {\n  if (typeof col.every == 'function') {\n    return col.every(f, opt_obj);\n  }\n  if (goog.isArrayLike(col) || typeof col === 'string') {\n    return goog.array.every(/** @type {!Array<?>} */ (col), f, opt_obj);\n  }\n  var keys = goog.structs.getKeys(col);\n  var values = goog.structs.getValues(col);\n  var l = values.length;\n  for (var i = 0; i < l; i++) {\n    if (!f.call(/** @type {?} */ (opt_obj), values[i], keys && keys[i], col)) {\n      return false;\n    }\n  }\n  return true;\n};\n","^17",1579837703000,"^18",["^19",["^Z","^2G","^35"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/structs.js"],"^1J",["^19",["~$goog.structs"]],"^X",true,"^Y",["^Z","^35","^2G"]],["^ ","^[",[1579837703000],"^10","goog.labs.structs.multimap.js","^11",["^12","goog/labs/structs/multimap.js"],"^13","goog/labs/structs/multimap.js","^14","^15","^16","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A Map that associates multiple values with a single key.\n *\n * @author chrishenry@google.com (Chris Henry)\n */\n\ngoog.provide('goog.labs.structs.Multimap');\n\ngoog.require('goog.array');\ngoog.require('goog.object');\n\n\n\n/**\n * Creates a new multimap.\n * @constructor\n * @struct\n * @final\n * @template K, V\n */\ngoog.labs.structs.Multimap = function() {\n  this.clear();\n};\n\n\n/**\n * The backing map.\n * @private {!Map<K, !Array<V>>}\n */\ngoog.labs.structs.Multimap.prototype.map_;\n\n\n/**\n * @private {number}\n */\ngoog.labs.structs.Multimap.prototype.count_ = 0;\n\n\n/**\n * Clears the multimap.\n */\ngoog.labs.structs.Multimap.prototype.clear = function() {\n  this.count_ = 0;\n  this.map_ = new Map();\n};\n\n\n/**\n * Clones this multimap.\n * @return {!goog.labs.structs.Multimap<K, V>} A multimap that contains all\n *     the mapping this multimap has.\n */\ngoog.labs.structs.Multimap.prototype.clone = function() {\n  var map = new goog.labs.structs.Multimap();\n  map.addAllFromMultimap(this);\n  return map;\n};\n\n\n/**\n * Adds the given (key, value) pair to the map. The (key, value) pair\n * is guaranteed to be added.\n * @param {K} key The key to add.\n * @param {V} value The value to add.\n */\ngoog.labs.structs.Multimap.prototype.add = function(key, value) {\n  var values = this.map_.get(key);\n  if (!values) {\n    this.map_.set(key, (values = []));\n  }\n\n  values.push(value);\n  this.count_++;\n};\n\n\n/**\n * Stores a collection of values to the given key. Does not replace\n * existing (key, value) pairs.\n * @param {K} key The key to add.\n * @param {!Array<V>} values The values to add.\n */\ngoog.labs.structs.Multimap.prototype.addAllValues = function(key, values) {\n  goog.array.forEach(values, function(v) { this.add(key, v); }, this);\n};\n\n\n/**\n * Adds the contents of the given map/multimap to this multimap.\n * @param {!goog.labs.structs.Multimap<K, V>} map The\n *     map to add.\n */\ngoog.labs.structs.Multimap.prototype.addAllFromMultimap = function(map) {\n  goog.array.forEach(map.getEntries(), function(entry) {\n    this.add(entry[0], entry[1]);\n  }, this);\n};\n\n\n/**\n * Replaces all the values for the given key with the given values.\n * @param {K} key The key whose values are to be replaced.\n * @param {!Array<V>} values The new values. If empty, this is\n *     equivalent to `removeAll(key)`.\n */\ngoog.labs.structs.Multimap.prototype.replaceValues = function(key, values) {\n  this.removeAll(key);\n  this.addAllValues(key, values);\n};\n\n\n/**\n * Gets the values correspond to the given key.\n * @param {K} key The key to retrieve.\n * @return {!Array<V>} An array of values corresponding to the given\n *     key. May be empty. Note that the ordering of values are not\n *     guaranteed to be consistent.\n */\ngoog.labs.structs.Multimap.prototype.get = function(key) {\n  var values = this.map_.get(key);\n  return values ? goog.array.clone(values) : [];\n};\n\n\n/**\n * Removes a single occurrence of (key, value) pair.\n * @param {K} key The key to remove.\n * @param {V} value The value to remove.\n * @return {boolean} Whether any matching (key, value) pair is removed.\n */\ngoog.labs.structs.Multimap.prototype.remove = function(key, value) {\n  var values = this.map_.get(key);\n  if (!values) {\n    return false;\n  }\n\n  var removed = goog.array.removeIf(\n      values, function(v) { return goog.object.is(value, v); });\n\n  if (removed) {\n    this.count_--;\n    if (values.length == 0) {\n      this.map_.delete(key);\n    }\n  }\n  return removed;\n};\n\n\n/**\n * Removes all values corresponding to the given key.\n * @param {K} key The key whose values are to be removed.\n * @return {boolean} Whether any value is removed.\n */\ngoog.labs.structs.Multimap.prototype.removeAll = function(key) {\n  // We have to first retrieve the values from the backing map because\n  // we need to keep track of count (and correctly calculates the\n  // return value). values may be undefined.\n  var values = this.map_.get(key);\n  if (this.map_.delete(key)) {\n    this.count_ -= values.length;\n    return true;\n  }\n\n  return false;\n};\n\n\n/**\n * @return {boolean} Whether the multimap is empty.\n */\ngoog.labs.structs.Multimap.prototype.isEmpty = function() {\n  return !this.count_;\n};\n\n\n/**\n * @return {number} The count of (key, value) pairs in the map.\n */\ngoog.labs.structs.Multimap.prototype.getCount = function() {\n  return this.count_;\n};\n\n\n/**\n * @param {K} key The key to check.\n * @param {V} value The value to check.\n * @return {boolean} Whether the (key, value) pair exists in the multimap.\n */\ngoog.labs.structs.Multimap.prototype.containsEntry = function(key, value) {\n  var values = this.map_.get(key);\n  if (!values) {\n    return false;\n  }\n\n  var index = goog.array.findIndex(\n      values, function(v) { return goog.object.is(v, value); });\n  return index >= 0;\n};\n\n\n/**\n * @param {K} key The key to check.\n * @return {boolean} Whether the multimap contains at least one (key,\n *     value) pair with the given key.\n */\ngoog.labs.structs.Multimap.prototype.containsKey = function(key) {\n  return this.getKeys().includes(key);\n};\n\n\n/**\n * @param {V} value The value to check.\n * @return {boolean} Whether the multimap contains at least one (key,\n *     value) pair with the given value.\n */\ngoog.labs.structs.Multimap.prototype.containsValue = function(value) {\n  return this.getValues().includes(value);\n};\n\n\n/**\n * @return {!Array<K>} An array of unique keys.\n */\ngoog.labs.structs.Multimap.prototype.getKeys = function() {\n  return [...this.map_.keys()];\n};\n\n\n/**\n * @return {!Array<V>} An array of values. There may be duplicates.\n */\ngoog.labs.structs.Multimap.prototype.getValues = function() {\n  return goog.array.flatten([...this.map_.values()]);\n};\n\n\n/**\n * @return {!Array<!Array<K|V>>} An array of entries. Each entry is of the\n *     form [key, value].\n */\ngoog.labs.structs.Multimap.prototype.getEntries = function() {\n  var keys = this.getKeys();\n  var entries = [];\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    var values = this.get(key);\n    for (var j = 0; j < values.length; j++) {\n      entries.push([key, values[j]]);\n    }\n  }\n  return entries;\n};\n","^17",1579837703000,"^18",["^19",["^Z","^2G","^35"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/structs/multimap.js"],"^1J",["^19",["~$goog.labs.structs.Multimap"]],"^X",true,"^Y",["^Z","^35","^2G"]],["^ ","^[",[1579837703000],"^10","goog.crypt.arc4.js","^11",["^12","goog/crypt/arc4.js"],"^13","goog/crypt/arc4.js","^14","^15","^16","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview ARC4 streamcipher implementation.  A description of the\n * algorithm can be found at:\n * http://www.mozilla.org/projects/security/pki/nss/draft-kaukonen-cipher-arcfour-03.txt.\n *\n * Usage:\n * <code>\n *   var arc4 = new goog.crypt.Arc4();\n *   arc4.setKey(key);\n *   arc4.discard(1536);\n *   arc4.crypt(bytes);\n * </code>\n *\n * Note: For converting between strings and byte arrays, goog.crypt.base64 may\n * be useful.\n *\n */\n\ngoog.provide('goog.crypt.Arc4');\n\ngoog.require('goog.asserts');\n\n\n\n/**\n * ARC4 streamcipher implementation.\n * @constructor\n * @final\n * @struct\n */\ngoog.crypt.Arc4 = function() {\n  /**\n   * A permutation of all 256 possible bytes.\n   * @type {Array<number>}\n   * @private\n   */\n  this.state_ = [];\n\n  /**\n   * 8 bit index pointer into this.state_.\n   * @type {number}\n   * @private\n   */\n  this.index1_ = 0;\n\n  /**\n   * 8 bit index pointer into this.state_.\n   * @type {number}\n   * @private\n   */\n  this.index2_ = 0;\n};\n\n\n/**\n * Initialize the cipher for use with new key.\n * @param {Array<number>} key A byte array containing the key.\n * @param {number=} opt_length Indicates # of bytes to take from the key.\n */\ngoog.crypt.Arc4.prototype.setKey = function(key, opt_length) {\n  goog.asserts.assertArray(key, 'Key parameter must be a byte array');\n\n  if (!opt_length) {\n    opt_length = key.length;\n  }\n\n  var state = this.state_;\n\n  for (var i = 0; i < 256; ++i) {\n    state[i] = i;\n  }\n\n  var j = 0;\n  for (var i = 0; i < 256; ++i) {\n    j = (j + state[i] + key[i % opt_length]) & 255;\n\n    var tmp = state[i];\n    state[i] = state[j];\n    state[j] = tmp;\n  }\n\n  this.index1_ = 0;\n  this.index2_ = 0;\n};\n\n\n/**\n * Discards n bytes of the keystream.\n * These days 1536 is considered a decent amount to drop to get the key state\n * warmed-up enough for secure usage. This is not done in the constructor to\n * preserve efficiency for use cases that do not need this.\n * NOTE: Discard is identical to crypt without actually xoring any data. It's\n * unfortunate to have this code duplicated, but this was done for performance\n * reasons. Alternatives which were attempted:\n * 1. Create a temp array of the correct length and pass it to crypt. This\n *    works but needlessly allocates an array. But more importantly this\n *    requires choosing an array type (Array or Uint8Array) in discard, and\n *    choosing a different type than will be passed to crypt by the client\n *    code hurts the javascript engines ability to optimize crypt (7x hit in\n *    v8).\n * 2. Make data option in crypt so discard can pass null, this has a huge\n *    perf hit for crypt.\n * @param {number} length Number of bytes to disregard from the stream.\n */\ngoog.crypt.Arc4.prototype.discard = function(length) {\n  var i = this.index1_;\n  var j = this.index2_;\n  var state = this.state_;\n\n  for (var n = 0; n < length; ++n) {\n    i = (i + 1) & 255;\n    j = (j + state[i]) & 255;\n\n    var tmp = state[i];\n    state[i] = state[j];\n    state[j] = tmp;\n  }\n\n  this.index1_ = i;\n  this.index2_ = j;\n};\n\n\n/**\n * En- or decrypt (same operation for streamciphers like ARC4)\n * @param {Array<number>|Uint8Array} data The data to be xor-ed in place.\n * @param {number=} opt_length The number of bytes to crypt.\n */\ngoog.crypt.Arc4.prototype.crypt = function(data, opt_length) {\n  if (!opt_length) {\n    opt_length = data.length;\n  }\n  var i = this.index1_;\n  var j = this.index2_;\n  var state = this.state_;\n\n  for (var n = 0; n < opt_length; ++n) {\n    i = (i + 1) & 255;\n    j = (j + state[i]) & 255;\n\n    var tmp = state[i];\n    state[i] = state[j];\n    state[j] = tmp;\n\n    data[n] ^= state[(state[i] + state[j]) & 255];\n  }\n\n  this.index1_ = i;\n  this.index2_ = j;\n};\n","^17",1579837703000,"^18",["^19",["^1S","^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/arc4.js"],"^1J",["^19",["~$goog.crypt.Arc4"]],"^X",true,"^Y",["^Z","^1S"]],["^ ","^[",[1579837703000],"^10","goog.i18n.charpickerdata.js","^11",["^12","goog/i18n/charpickerdata.js"],"^13","goog/i18n/charpickerdata.js","^14","^15","^16","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Character lists and their classifications used by character\n * picker widget. Autogenerated from Unicode data:\n * https://sites/cibu/character-picker.\n */\n\n// clang-format off\ngoog.provide('goog.i18n.CharPickerData');\n\n\n\n/**\n * Object holding two level character organization and character listing.\n * @constructor\n */\ngoog.i18n.CharPickerData = function() {};\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SYMBOL = goog.getMsg('Symbol');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_ARROWS = goog.getMsg('Arrows');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_BRAILLE = goog.getMsg('Braille');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_CONTROL_PICTURES =\n    goog.getMsg('Control Pictures');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_CURRENCY = goog.getMsg('Currency');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_EMOTICONS = goog.getMsg('Emoticons');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_GAME_PIECES = goog.getMsg('Game Pieces');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_GENDER_AND_GENEALOGICAL =\n    goog.getMsg('Gender and Genealogical');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_GEOMETRIC_SHAPES =\n    goog.getMsg('Geometric Shapes');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_KEYBOARD_AND_UI =\n    goog.getMsg('Keyboard and UI');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_LATIN_1_SUPPLEMENT =\n    goog.getMsg('Latin 1 Supplement');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_MATH = goog.getMsg('Math');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_MATH_ALPHANUMERIC =\n    goog.getMsg('Math Alphanumeric');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_MISCELLANEOUS = goog.getMsg('Miscellaneous');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_MUSICAL = goog.getMsg('Musical');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_STARS_ASTERISKS =\n    goog.getMsg('Stars/Asterisks');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SUBSCRIPT = goog.getMsg('Subscript');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SUPERSCRIPT = goog.getMsg('Superscript');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_TECHNICAL = goog.getMsg('Technical');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_TRANSPORT_AND_MAP =\n    goog.getMsg('Transport And Map');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_WEATHER_AND_ASTROLOGICAL =\n    goog.getMsg('Weather and Astrological');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_YIJING_TAI_XUAN_JING =\n    goog.getMsg('Yijing / Tai Xuan Jing');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HISTORIC = goog.getMsg('Historic');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_COMPATIBILITY = goog.getMsg('Compatibility');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_EMOJI = goog.getMsg('Emoji');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_PEOPLE_AND_EMOTIONS =\n    goog.getMsg('People and Emotions');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_ANIMALS_PLANTS_AND_FOOD =\n    goog.getMsg('Animals, Plants and Food');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_OBJECTS = goog.getMsg('Objects');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SPORTS_CELEBRATIONS_AND_ACTIVITIES =\n    goog.getMsg('Sports, Celebrations and Activities');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_TRANSPORT_MAPS_AND_SIGNAGE =\n    goog.getMsg('Transport, Maps and Signage');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_WEATHER_SCENES_AND_ZODIAC_SIGNS =\n    goog.getMsg('Weather, Scenes and Zodiac signs');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_ENCLOSED = goog.getMsg('Enclosed');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_MARKS = goog.getMsg('Marks');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SYMBOLS = goog.getMsg('Symbols');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_PUNCTUATION = goog.getMsg('Punctuation');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_ASCII_BASED = goog.getMsg('ASCII Based');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_DASH_CONNECTOR = goog.getMsg('Dash/Connector');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_OTHER = goog.getMsg('Other');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_PAIRED = goog.getMsg('Paired');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_NUMBER = goog.getMsg('Number');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_DECIMAL = goog.getMsg('Decimal');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_ENCLOSED_DOTTED =\n    goog.getMsg('Enclosed/Dotted');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_FRACTIONS_RELATED =\n    goog.getMsg('Fractions/Related');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_FORMAT_WHITESPACE =\n    goog.getMsg('Format & Whitespace');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_FORMAT = goog.getMsg('Format');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_VARIATION_SELECTOR =\n    goog.getMsg('Variation Selector');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_WHITESPACE = goog.getMsg('Whitespace');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_MODIFIER = goog.getMsg('Modifier');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_ENCLOSING = goog.getMsg('Enclosing');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_NONSPACING = goog.getMsg('Nonspacing');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SPACING = goog.getMsg('Spacing');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_LATIN = goog.getMsg('Latin');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_COMMON = goog.getMsg('Common');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_FLIPPED_MIRRORED =\n    goog.getMsg('Flipped/Mirrored');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_PHONETICS_IPA = goog.getMsg('Phonetics (IPA)');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_PHONETICS_X_IPA =\n    goog.getMsg('Phonetics (X-IPA)');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_OTHER_EUROPEAN_SCRIPTS =\n    goog.getMsg('Other European Scripts');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_ARMENIAN = goog.getMsg('Armenian');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_CYRILLIC = goog.getMsg('Cyrillic');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_GEORGIAN = goog.getMsg('Georgian');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_GREEK = goog.getMsg('Greek');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_CYPRIOT = goog.getMsg('Cypriot');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_GLAGOLITIC = goog.getMsg('Glagolitic');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_GOTHIC = goog.getMsg('Gothic');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_LINEAR_B = goog.getMsg('Linear B');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_OGHAM = goog.getMsg('Ogham');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_OLD_ITALIC = goog.getMsg('Old Italic');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_RUNIC = goog.getMsg('Runic');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SHAVIAN = goog.getMsg('Shavian');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_AMERICAN_SCRIPTS =\n    goog.getMsg('American Scripts');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_CANADIAN_ABORIGINAL =\n    goog.getMsg('Canadian Aboriginal');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_CHEROKEE = goog.getMsg('Cherokee');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_DESERET = goog.getMsg('Deseret');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_AFRICAN_SCRIPTS =\n    goog.getMsg('African Scripts');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_EGYPTIAN_HIEROGLYPHS =\n    goog.getMsg('Egyptian Hieroglyphs');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_ETHIOPIC = goog.getMsg('Ethiopic');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_MEROITIC_CURSIVE =\n    goog.getMsg('Meroitic Cursive');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_MEROITIC_HIEROGLYPHS =\n    goog.getMsg('Meroitic Hieroglyphs');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_NKO = goog.getMsg('Nko');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_TIFINAGH = goog.getMsg('Tifinagh');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_VAI = goog.getMsg('Vai');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_BAMUM = goog.getMsg('Bamum');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_COPTIC = goog.getMsg('Coptic');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_OSMANYA = goog.getMsg('Osmanya');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_MIDDLE_EASTERN_SCRIPTS =\n    goog.getMsg('Middle Eastern Scripts');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_ARABIC = goog.getMsg('Arabic');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HEBREW = goog.getMsg('Hebrew');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_IMPERIAL_ARAMAIC =\n    goog.getMsg('Imperial Aramaic');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_INSCRIPTIONAL_PAHLAVI =\n    goog.getMsg('Inscriptional Pahlavi');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_INSCRIPTIONAL_PARTHIAN =\n    goog.getMsg('Inscriptional Parthian');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_MANDAIC = goog.getMsg('Mandaic');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_OLD_SOUTH_ARABIAN =\n    goog.getMsg('Old South Arabian');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SAMARITAN = goog.getMsg('Samaritan');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SYRIAC = goog.getMsg('Syriac');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_AVESTAN = goog.getMsg('Avestan');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_CARIAN = goog.getMsg('Carian');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_CUNEIFORM = goog.getMsg('Cuneiform');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_LYCIAN = goog.getMsg('Lycian');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_LYDIAN = goog.getMsg('Lydian');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_OLD_PERSIAN = goog.getMsg('Old Persian');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_PHOENICIAN = goog.getMsg('Phoenician');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_UGARITIC = goog.getMsg('Ugaritic');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SOUTH_ASIAN_SCRIPTS =\n    goog.getMsg('South Asian Scripts');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_BENGALI = goog.getMsg('Bengali');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_CHAKMA = goog.getMsg('Chakma');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_DEVANAGARI = goog.getMsg('Devanagari');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_GUJARATI = goog.getMsg('Gujarati');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_GURMUKHI = goog.getMsg('Gurmukhi');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_KANNADA = goog.getMsg('Kannada');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_LEPCHA = goog.getMsg('Lepcha');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_LIMBU = goog.getMsg('Limbu');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_MALAYALAM = goog.getMsg('Malayalam');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_MEETEI_MAYEK = goog.getMsg('Meetei Mayek');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_OL_CHIKI = goog.getMsg('Ol Chiki');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_ORIYA = goog.getMsg('Oriya');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SAURASHTRA = goog.getMsg('Saurashtra');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SINHALA = goog.getMsg('Sinhala');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SORA_SOMPENG = goog.getMsg('Sora Sompeng');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_TAMIL = goog.getMsg('Tamil');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_TELUGU = goog.getMsg('Telugu');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_THAANA = goog.getMsg('Thaana');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_TIBETAN = goog.getMsg('Tibetan');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_BRAHMI = goog.getMsg('Brahmi');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_KAITHI = goog.getMsg('Kaithi');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_KHAROSHTHI = goog.getMsg('Kharoshthi');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SHARADA = goog.getMsg('Sharada');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SYLOTI_NAGRI = goog.getMsg('Syloti Nagri');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_TAKRI = goog.getMsg('Takri');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SOUTHEAST_ASIAN_SCRIPTS =\n    goog.getMsg('Southeast Asian Scripts');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_BALINESE = goog.getMsg('Balinese');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_BATAK = goog.getMsg('Batak');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_CHAM = goog.getMsg('Cham');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_JAVANESE = goog.getMsg('Javanese');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_KAYAH_LI = goog.getMsg('Kayah Li');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_KHMER = goog.getMsg('Khmer');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_LAO = goog.getMsg('Lao');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_MYANMAR = goog.getMsg('Myanmar');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_NEW_TAI_LUE = goog.getMsg('New Tai Lue');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_TAI_LE = goog.getMsg('Tai Le');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_TAI_THAM = goog.getMsg('Tai Tham');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_TAI_VIET = goog.getMsg('Tai Viet');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_THAI = goog.getMsg('Thai');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_BUGINESE = goog.getMsg('Buginese');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_BUHID = goog.getMsg('Buhid');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HANUNOO = goog.getMsg('Hanunoo');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_REJANG = goog.getMsg('Rejang');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_SUNDANESE = goog.getMsg('Sundanese');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_TAGALOG = goog.getMsg('Tagalog');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_TAGBANWA = goog.getMsg('Tagbanwa');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HANGUL = goog.getMsg('Hangul');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_OTHER_EAST_ASIAN_SCRIPTS =\n    goog.getMsg('Other East Asian Scripts');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_BOPOMOFO = goog.getMsg('Bopomofo');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HIRAGANA = goog.getMsg('Hiragana');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_KATAKANA = goog.getMsg('Katakana');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_LISU = goog.getMsg('Lisu');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_MIAO = goog.getMsg('Miao');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_MONGOLIAN = goog.getMsg('Mongolian');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_OLD_TURKIC = goog.getMsg('Old Turkic');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_PHAGS_PA = goog.getMsg('Phags Pa');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_YI = goog.getMsg('Yi');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HAN_1_STROKE_RADICALS =\n    goog.getMsg('Han 1-Stroke Radicals');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_LESS_COMMON = goog.getMsg('Less Common');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HAN_2_STROKE_RADICALS =\n    goog.getMsg('Han 2-Stroke Radicals');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HAN_3_STROKE_RADICALS =\n    goog.getMsg('Han 3-Stroke Radicals');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HAN_4_STROKE_RADICALS =\n    goog.getMsg('Han 4-Stroke Radicals');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HAN_5_STROKE_RADICALS =\n    goog.getMsg('Han 5-Stroke Radicals');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HAN_6_STROKE_RADICALS =\n    goog.getMsg('Han 6-Stroke Radicals');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HAN_7_STROKE_RADICALS =\n    goog.getMsg('Han 7-Stroke Radicals');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HAN_8_STROKE_RADICALS =\n    goog.getMsg('Han 8-Stroke Radicals');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HAN_9_STROKE_RADICALS =\n    goog.getMsg('Han 9-Stroke Radicals');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HAN_10_STROKE_RADICALS =\n    goog.getMsg('Han 10-Stroke Radicals');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HAN_11_17_STROKE_RADICALS =\n    goog.getMsg('Han 11..17-Stroke Radicals');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_HAN_OTHER = goog.getMsg('Han - Other');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_CJK_STROKES = goog.getMsg('CJK Strokes');\n\n\n/**\n * @desc Name for a symbol or character category. Used in a pull-down list\n *   shown to a  document editing user trying to insert a special character.\n *   Newlines are not allowed; translation should be a noun and as consise as\n *   possible. More details:\n *   docs/fileview?id=0B8NbxddKsFtwYjExMGJjNzgtYjkzOS00NjdiLTlmOGQtOGVhZDkyZDU5YjM4.\n * @type {string}\n */\ngoog.i18n.CharPickerData.MSG_CP_IDEOGRAPHIC_DESCRIPTION =\n    goog.getMsg('Ideographic Description');\n\n\n/**\n * Top catagory names of character organization.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.prototype.categories = [\n  goog.i18n.CharPickerData.MSG_CP_SYMBOL,\n  goog.i18n.CharPickerData.MSG_CP_EMOJI,\n  goog.i18n.CharPickerData.MSG_CP_PUNCTUATION,\n  goog.i18n.CharPickerData.MSG_CP_NUMBER,\n  goog.i18n.CharPickerData.MSG_CP_FORMAT_WHITESPACE,\n  goog.i18n.CharPickerData.MSG_CP_MODIFIER,\n  goog.i18n.CharPickerData.MSG_CP_LATIN,\n  goog.i18n.CharPickerData.MSG_CP_OTHER_EUROPEAN_SCRIPTS,\n  goog.i18n.CharPickerData.MSG_CP_AMERICAN_SCRIPTS,\n  goog.i18n.CharPickerData.MSG_CP_AFRICAN_SCRIPTS,\n  goog.i18n.CharPickerData.MSG_CP_MIDDLE_EASTERN_SCRIPTS,\n  goog.i18n.CharPickerData.MSG_CP_SOUTH_ASIAN_SCRIPTS,\n  goog.i18n.CharPickerData.MSG_CP_SOUTHEAST_ASIAN_SCRIPTS,\n  goog.i18n.CharPickerData.MSG_CP_HANGUL,\n  goog.i18n.CharPickerData.MSG_CP_OTHER_EAST_ASIAN_SCRIPTS,\n  goog.i18n.CharPickerData.MSG_CP_HAN_1_STROKE_RADICALS,\n  goog.i18n.CharPickerData.MSG_CP_HAN_2_STROKE_RADICALS,\n  goog.i18n.CharPickerData.MSG_CP_HAN_3_STROKE_RADICALS,\n  goog.i18n.CharPickerData.MSG_CP_HAN_4_STROKE_RADICALS,\n  goog.i18n.CharPickerData.MSG_CP_HAN_5_STROKE_RADICALS,\n  goog.i18n.CharPickerData.MSG_CP_HAN_6_STROKE_RADICALS,\n  goog.i18n.CharPickerData.MSG_CP_HAN_7_STROKE_RADICALS,\n  goog.i18n.CharPickerData.MSG_CP_HAN_8_STROKE_RADICALS,\n  goog.i18n.CharPickerData.MSG_CP_HAN_9_STROKE_RADICALS,\n  goog.i18n.CharPickerData.MSG_CP_HAN_10_STROKE_RADICALS,\n  goog.i18n.CharPickerData.MSG_CP_HAN_11_17_STROKE_RADICALS,\n  goog.i18n.CharPickerData.MSG_CP_HAN_OTHER\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_SYMBOL = [\n  goog.i18n.CharPickerData.MSG_CP_ARROWS,\n  goog.i18n.CharPickerData.MSG_CP_BRAILLE,\n  goog.i18n.CharPickerData.MSG_CP_CONTROL_PICTURES,\n  goog.i18n.CharPickerData.MSG_CP_CURRENCY,\n  goog.i18n.CharPickerData.MSG_CP_EMOTICONS,\n  goog.i18n.CharPickerData.MSG_CP_GAME_PIECES,\n  goog.i18n.CharPickerData.MSG_CP_GENDER_AND_GENEALOGICAL,\n  goog.i18n.CharPickerData.MSG_CP_GEOMETRIC_SHAPES,\n  goog.i18n.CharPickerData.MSG_CP_KEYBOARD_AND_UI,\n  goog.i18n.CharPickerData.MSG_CP_LATIN_1_SUPPLEMENT,\n  goog.i18n.CharPickerData.MSG_CP_MATH,\n  goog.i18n.CharPickerData.MSG_CP_MATH_ALPHANUMERIC,\n  goog.i18n.CharPickerData.MSG_CP_MISCELLANEOUS,\n  goog.i18n.CharPickerData.MSG_CP_MUSICAL,\n  goog.i18n.CharPickerData.MSG_CP_STARS_ASTERISKS,\n  goog.i18n.CharPickerData.MSG_CP_SUBSCRIPT,\n  goog.i18n.CharPickerData.MSG_CP_SUPERSCRIPT,\n  goog.i18n.CharPickerData.MSG_CP_TECHNICAL,\n  goog.i18n.CharPickerData.MSG_CP_TRANSPORT_AND_MAP,\n  goog.i18n.CharPickerData.MSG_CP_WEATHER_AND_ASTROLOGICAL,\n  goog.i18n.CharPickerData.MSG_CP_YIJING_TAI_XUAN_JING,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_SYMBOL = [\n  '2>807AnTMm6e6HDk%`O728F1f4V1PNF2WF1G}58?]514M]Ol1%2l2^3X1U:1Un2Mb>$0MD-(068k11I3706:%MwiZ06',\n  ';oA0FN',\n  '(j90d3',\n  'H3XBMQQ10HB(2106uPM]N:qol202S20#2;.Z0^xM0:91E]J6O6',\n  ';(i1-5W?',\n  'Q6A06f5#1H2,]4MeEY[W1@3W}891N1GF1GN18N1P%k',\n  '2JA0sOc',\n  'oG90nMcPTFNfFEQE10t2H3kQ7X1sj>$0OW6*F%E',\n  '(P90UGv771.Uv46%7Y^Y1F2mc]1M+<Z1',\n  '9FP1',\n  ':3f1En5894WX3:2v+]lEQ?60f2E11OH1P1M]1U11UfCf111MuUmH6Ue6WGGu:26G8:2NO$M:16H8%2V28H211cvg.]4s9AnU#5PNdkX4-1Gc24P1P2:2P2:2P2:2P2:2P2g>50M8V2868G8,8M88mW888E868G8888868GM8k8M8M88,8d1eE8U8d1%46bf$0:;c8%Ef1Ev2:28]BmMbp)02p8071WO6WUw+w0',\n  '9G6e:-EGX26G6(k70Ocm,]AWG,8OUmOO68E86uMeU^`Q1t78V686GG6GM8|88k8-58MGs8k8d28M8U8Ok8-UGF28F28#28F28#28F28#28F28#28F28sGd4rLS1H1',\n  '1FGW8I(90EHB686WU8l1$Uv4?8En1E8|:29168U8718k8kG8M868688686e686888,148MO8|8E]7wV10k2tN1cYf806813692W]3%68X2f2|O6G86%1P5m6%5$6%468e[E8c11126v1MH2|%F9DuM8E86m8UTN%065j#0M',\n  ';DA0k2mO1NM[d3GV5eEms$6ut2WN493@5OA;80sD790UOc$sGk%2MfDE',\n  ';OA0v5-3g510E^jW1WV1:l',\n  'Qq80N1871QC30',\n  'XFu6e6^X80O?vE82+Y16T+g1Ug2709+H12F30QjW0PC6',\n  'gM90sW#1G6$l7H1!%2N2O?ml1]6?',\n  'g?i1N6',\n  'Q4A0F1mv3}1v8,uUe^zX171',\n  'w8A0sf7c2WA0#5A>E1-7',\n  'I{)0%4!P7|%4}3A,$0dA',\n  '(PD0M(ZU16H1-3e!u6'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_EMOJI = [\n  goog.i18n.CharPickerData.MSG_CP_PEOPLE_AND_EMOTIONS,\n  goog.i18n.CharPickerData.MSG_CP_ANIMALS_PLANTS_AND_FOOD,\n  goog.i18n.CharPickerData.MSG_CP_OBJECTS,\n  goog.i18n.CharPickerData.MSG_CP_SPORTS_CELEBRATIONS_AND_ACTIVITIES,\n  goog.i18n.CharPickerData.MSG_CP_TRANSPORT_MAPS_AND_SIGNAGE,\n  goog.i18n.CharPickerData.MSG_CP_WEATHER_SCENES_AND_ZODIAC_SIGNS,\n  goog.i18n.CharPickerData.MSG_CP_ENCLOSED,\n  goog.i18n.CharPickerData.MSG_CP_MARKS,\n  goog.i18n.CharPickerData.MSG_CP_SYMBOLS\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_EMOJI = [\n  '^6A0n2:IE]7Y>X18N1%1-28EOO8871G|%U-5W?',\n  'I6A0A_X1c8N6eXBt5',\n  ';O906PJG]m1C1Amew)X16:It1]2W68E8X168[8d68MP171P1!1372',\n  '2DA0s%76o]W1@3nAN1GF1GN18N1Xzd191N38U9I',\n  '(DA0v1O]2694t1m72$2>X1d1%DvXUvBN6',\n  'Q4A0F1mv4|HAUe98(rX1@2]k',\n  'Y#90;v308ICU1d2W-3H9EH1-3e!u6',\n  ';5A09M9188:48WE8n5EH2',\n  'Y%C0(wV1P7N3[EP1M'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_PUNCTUATION = [\n  goog.i18n.CharPickerData.MSG_CP_ASCII_BASED,\n  goog.i18n.CharPickerData.MSG_CP_DASH_CONNECTOR,\n  goog.i18n.CharPickerData.MSG_CP_OTHER,\n  goog.i18n.CharPickerData.MSG_CP_PAIRED,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_PUNCTUATION = [\n  ':2M8EG886[6O6f2H6eP16u',\n  '14f4gX80c%36%1gu30:26Q3t0XG',\n  '(s70:<.MOEmEGGG8OEms88Iu3068G6n1!',\n  'n36f48v2894X1;P80sP26[6]46P16nvMPF6f3c1^F1H76:2,va@1%5M]26;7106G,fh,Gs2Ms06nPcXF6f48v288686',\n  'gm808kQT30MnN72v1U8U(%t0Eb(t0',\n  'Ig80e91E91686W8$EH1X36P162pw0,12-1G|8F18W86nDE8c8M[6O6X2E8f2886'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_NUMBER = [\n  goog.i18n.CharPickerData.MSG_CP_DECIMAL,\n  goog.i18n.CharPickerData.MSG_CP_ENCLOSED_DOTTED,\n  goog.i18n.CharPickerData.MSG_CP_FRACTIONS_RELATED,\n  goog.i18n.CharPickerData.MSG_CP_OTHER,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_NUMBER = [\n  'P4,]A6egh10,HC,1I,fb,%A,%A,%A,%A,%A,%A,%A,%A,XK,%A,X6,PP,X6,Q]10,f3,PR,vB,9F,m,nG,]K,m,A710Ocm,^SZ0,vz,f3,1I,%A,]a,AnQ0,vB,f5,9D,2Q10,5O60,',\n  'gs90#7%4@1Pvt2g+20,%2s8N1]2,n3N1',\n  '9G6eGEoX80Ocm,1IV1%3',\n  'ot20cHYc]AE9Ck]Lcvd,^910#1oF10,vh2}1073GMQ:30P2!P1EHVMI2V0,9Ts8^aP0sHn6%JsH2s](#2fg#1wnp0l1;-70?',\n  'o560EgM10,Yk10EGMo230w6u0}39175n1:aMv2$HCUXI,^E10cnQso,60@8',\n  'w.80-2o?30EHVMoSU1?b}#0,'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_FORMAT_WHITESPACE = [\n  goog.i18n.CharPickerData.MSG_CP_FORMAT,\n  goog.i18n.CharPickerData.MSG_CP_VARIATION_SELECTOR,\n  goog.i18n.CharPickerData.MSG_CP_WHITESPACE,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_FORMAT_WHITESPACE = [\n  'vF;Z10c12fHf4gh40;920UX2Uf4U8M2n#0Iej0MQi50sY)W9l8bk0AvME',\n  ']=oY506%7E^$zA#LDF1AV1',\n  'fEIH602920,H3P4wB40;#s0',\n  'w-10f4^#206IV10(970ols0',\n  'fEAQ80?P3P4wB40^@s0'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_MODIFIER = [\n  goog.i18n.CharPickerData.MSG_CP_ENCLOSING,\n  goog.i18n.CharPickerData.MSG_CP_NONSPACING,\n  goog.i18n.CharPickerData.MSG_CP_SPACING,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_MODIFIER = [\n  '(y80M8E',\n  '%+#5GG,8t1(#60E8718kWm:I,H46v%71WO|oWQ1En1sGk%2MT_t0k',\n  'f!!.M%3M91gz30(C30f1695E8?8l18d2X4N32D40XH',\n  '%?71HP62x60M[F2926^Py0',\n  'n<686'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_LATIN = [\n  goog.i18n.CharPickerData.MSG_CP_COMMON,\n  goog.i18n.CharPickerData.MSG_CP_ENCLOSED,\n  goog.i18n.CharPickerData.MSG_CP_FLIPPED_MIRRORED,\n  goog.i18n.CharPickerData.MSG_CP_OTHER,\n  goog.i18n.CharPickerData.MSG_CP_PHONETICS_IPA,\n  goog.i18n.CharPickerData.MSG_CP_PHONETICS_X_IPA,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_LATIN = [\n  ':5N2mN2P6}18#28V1Gl1GcG|W68cGs8|GMGMG6G}1GWG6OU8GEOG6H168E11M.s$$6f16%2Mv3P168688uW.128$IN706126H26W6:16m6$6P16Gc916[878QAa06zph0696U8EOP3o2706',\n  '^x90}6^yX1#28F5m-3:6N2',\n  'X4X1m6OEWku8WGc88M8H6%1nFmu11916X16H3H1%4P3[8EOmeWW.euWM918HMH6%512]I1Q^+20f+.%2X8]cfBg*10I710P1681H]E^BZ01BE',\n  ']N6v16m6P16Gv26W6W6G6H286O6G6m86OE86GUGGEGOEv2s8sG!OEOt2mV38?A570@3%5718}2H9|G@1G72GMG#1GcGsGF1G6m|GcHuO11G6e6O88mOuX18Eo]20}1u62cW0F1v6N1e68M91?H7zSi081s868EG?8E8EGcu8E8UGEw^60t5H193N3v!H1f171QmZ072f9E]96',\n  '%8N2%96$uH4H3u:9M%CF28718M868UO?86G68E8868GHOeP1I>70EO6LF80E8GW11OO6918Of26868886OV3WU%2W',\n  '1uH1WGeE11G6GO8G868s',\n  'HZ6uP268691s15P36Al7068H8cHw!Y?20UwdW0#58s:BUbvh0d1g{A06AZW0sH2697',\n  'XFX1:A6116v5H6!P3E(o706vtM8E8?86GUGE8O8M8E86W8.U12-2Qd40HBMvE,et8:2Qtq0kg710N2mN2bV)0mWOXnc'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_OTHER_EUROPEAN_SCRIPTS = [\n  goog.i18n.CharPickerData.MSG_CP_ARMENIAN,\n  goog.i18n.CharPickerData.MSG_CP_CYRILLIC,\n  goog.i18n.CharPickerData.MSG_CP_GEORGIAN,\n  goog.i18n.CharPickerData.MSG_CP_GREEK,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_CYPRIOT,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_CYRILLIC,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_GEORGIAN,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_GLAGOLITIC,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_GOTHIC,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_GREEK,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_LINEAR_B,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_OGHAM,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_OLD_ITALIC,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_RUNIC,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_SHAVIAN,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_ARMENIAN,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_GREEK\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_OTHER_EUROPEAN_SCRIPTS = [\n  '(W10V3Oc8V3G6W=4',\n  '2510-BuNEKuvfE',\n  '(e10o{20eG@2mMGEJ',\n  ']]8E88#18@3P3$wC70@1GcGV3GcGs8888l1888888O#48U8eE8E88OEOUeE8k8eE8E88{l706W',\n  '^-+0cG8@386OG',\n  '2{h0F4W[872{<g06g^A0-2;;V0M8,8:2',\n  ';Y40V3]3cW2a70V38e',\n  '^tB0F48F4',\n  '^l*0V2',\n  ']@MG6OEX7EO71f18GU8E;{(0#6YBt0@5OJE',\n  '(z)0|8N28t1868N1GF1937B',\n  'o_50l2',\n  'oh*0#28M',\n  'g|50N7',\n  'A;*0N4',\n  'oe10g^$0U',\n  'XG%$$%6Ef26OoN70888888n5G[8uuuuH189Rr:706we708E11EH1EH1EH16'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_AMERICAN_SCRIPTS = [\n  goog.i18n.CharPickerData.MSG_CP_CANADIAN_ABORIGINAL,\n  goog.i18n.CharPickerData.MSG_CP_CHEROKEE,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_DESERET\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_AMERICAN_SCRIPTS = [\n  'YP507w]oN6',\n  'wG50t7',\n  ';(*0F7'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_AFRICAN_SCRIPTS = [\n  goog.i18n.CharPickerData.MSG_CP_EGYPTIAN_HIEROGLYPHS,\n  goog.i18n.CharPickerData.MSG_CP_ETHIOPIC,\n  goog.i18n.CharPickerData.MSG_CP_MEROITIC_CURSIVE,\n  goog.i18n.CharPickerData.MSG_CP_MEROITIC_HIEROGLYPHS,\n  goog.i18n.CharPickerData.MSG_CP_NKO,\n  goog.i18n.CharPickerData.MSG_CP_TIFINAGH,\n  goog.i18n.CharPickerData.MSG_CP_VAI,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_BAMUM,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_COPTIC,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_NKO,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_OSMANYA\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_AFRICAN_SCRIPTS = [\n  ';Y[0}}N9',\n  ';(40l68MGk88MGt38MG@28MGk88MGN18758MG}5el2ON2(;60}1.k8k8k8k8k8k8k8kI8X0cGcGc.k8kDDe0E',\n  '(L,072m6',\n  ';I,0-2',\n  'Q420l3P1MK1?W',\n  'o_B0}4$3X1',\n  '^th0NO8#2*2',\n  '(5i0F7GcY4p0tpzup06',\n  'Q210F12$A0}9O6eka1E',\n  '^720E',\n  'g?*0t2G,'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_MIDDLE_EASTERN_SCRIPTS = [\n  goog.i18n.CharPickerData.MSG_CP_ARABIC,\n  goog.i18n.CharPickerData.MSG_CP_HEBREW,\n  goog.i18n.CharPickerData.MSG_CP_IMPERIAL_ARAMAIC,\n  goog.i18n.CharPickerData.MSG_CP_INSCRIPTIONAL_PAHLAVI,\n  goog.i18n.CharPickerData.MSG_CP_INSCRIPTIONAL_PARTHIAN,\n  goog.i18n.CharPickerData.MSG_CP_MANDAIC,\n  goog.i18n.CharPickerData.MSG_CP_OLD_SOUTH_ARABIAN,\n  goog.i18n.CharPickerData.MSG_CP_SAMARITAN,\n  goog.i18n.CharPickerData.MSG_CP_SYRIAC,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_ARABIC,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_AVESTAN,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_CARIAN,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_CUNEIFORM,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_HEBREW,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_LYCIAN,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_LYDIAN,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_OLD_PERSIAN,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_PHOENICIAN,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_SYRIAC,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_UGARITIC,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_ARABIC,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_HEBREW\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_MIDDLE_EASTERN_SCRIPTS = [\n  'op10U8,11Gl2m,]1F1O68W-18V6H2l1P774XQ8?^F60g2#0#2YVx06r##0vAry%0U]3[-1f11vV2QG$0V1',\n  'oj108G91V2eUC6F1886A?$0',\n  '(>+0@18!',\n  'g!,0t1es',\n  'ox,0@1Gs',\n  '^F20F2eZE',\n  'Id,0-2',\n  'AA20@1X2N1Qt60{w6072',\n  'wq10P1O]2[?X2',\n  '^u10UH46%2H7[fD6=Wc1HkG,8M',\n  '(r,0-4Ok',\n  ';Y*0V4',\n  'gE=0-@HD@8H1M',\n  'Qk10^>$0!f35}$0#2:168',\n  '^V*0l2',\n  'AA,0N2e',\n  'Aw*0F3WF1',\n  'I7,0d2O',\n  ';;10F1868t2v2Eq5%2V2',\n  'It*0t28',\n  'I!10MA^e1M8V2868G8,8M88mW888E868G8888868GM8k8M8M88,8d1eE8U8d1{W$0-813@Wv1#5G-4v371fAE88FC',\n  '2a(08.F18U886868!'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_SOUTH_ASIAN_SCRIPTS = [\n  goog.i18n.CharPickerData.MSG_CP_BENGALI,\n  goog.i18n.CharPickerData.MSG_CP_CHAKMA,\n  goog.i18n.CharPickerData.MSG_CP_DEVANAGARI,\n  goog.i18n.CharPickerData.MSG_CP_GUJARATI,\n  goog.i18n.CharPickerData.MSG_CP_GURMUKHI,\n  goog.i18n.CharPickerData.MSG_CP_KANNADA,\n  goog.i18n.CharPickerData.MSG_CP_LEPCHA,\n  goog.i18n.CharPickerData.MSG_CP_LIMBU,\n  goog.i18n.CharPickerData.MSG_CP_MALAYALAM,\n  goog.i18n.CharPickerData.MSG_CP_MEETEI_MAYEK,\n  goog.i18n.CharPickerData.MSG_CP_OL_CHIKI,\n  goog.i18n.CharPickerData.MSG_CP_ORIYA,\n  goog.i18n.CharPickerData.MSG_CP_SAURASHTRA,\n  goog.i18n.CharPickerData.MSG_CP_SINHALA,\n  goog.i18n.CharPickerData.MSG_CP_SORA_SOMPENG,\n  goog.i18n.CharPickerData.MSG_CP_TAMIL,\n  goog.i18n.CharPickerData.MSG_CP_TELUGU,\n  goog.i18n.CharPickerData.MSG_CP_THAANA,\n  goog.i18n.CharPickerData.MSG_CP_TIBETAN,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_BRAHMI,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_KAITHI,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_KANNADA,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_KHAROSHTHI,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_SHARADA,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_SYLOTI_NAGRI,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_TAKRI,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_BENGALI,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_DEVANAGARI,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_GURMUKHI,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_ORIYA,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_TIBETAN\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_SOUTH_ASIAN_SCRIPTS = [\n  'gg206:2sG6G@18k8OMOf1n16W@1:*64[E958kG6GE.[6',\n  'wH.0F3X1F146EP3F1',\n  '(X20-4Ov1X16G718c8k9[6gMf0,DRg0M]4E8l18k[6H1YEg0l1',\n  '(*20!8E8@18k868UOv1X16W|fk6*uE958s8E8E:16',\n  'gg206fEcW6G@18k8GG693.,GE:v6a*E958UW6GEO%26O',\n  'QR30s8E8}18,8UO936W,86CA6958k8E8Mu6116',\n  'oZ70F392N1OE=3#1',\n  '(r60l2H3O|K4|W|',\n  '^c30s8E8t3Gf1n16WV1Okw@4053506P5k8E8M.[6',\n  'wGj0?eEvI73$W,iOUOMfLs86',\n  ';g70l3m6pc',\n  'gg206%bsG6G@18k868UO13EWl1PY6CjE958kG6GE$6[6',\n  'oni0d4X2|486n4d1',\n  'oo30l1O728!8Gk94A+40j@406X6Wc88sv16',\n  '2D.0F2u,',\n  ';3308cOE8MO6886O6OEO|12]1-1=AX5UOE8M.',\n  'wF30s8E8}18,8UOX26m6W,$sPA6=LEP5k8E8Mu6116',\n  'wq10P1O:5,PPV311_?',\n  '2{30|8?GV2888MGE8M8M8M8M8M8|8EH2GUf4s8c8kW6Ii806e,GsL$806f288W6f468ek8E86ec8M8M8M8M8M8|8E.',\n  '(u70M8MO6jf30M',\n  'Y^-0#4X1kWt24AE:4N1',\n  '26.0}311k=5E94?',\n  'YZ30',\n  'gU,0X1M8E8V291s$!=7E86eMv3EW',\n  'QT.0N4P1su,48EX4F1',\n  '(bi068E8M8}1eMy3OW92U',\n  'Yv:0-3]1,y271',\n  'Yr2068',\n  'Yf20s',\n  'Qz20G93EG',\n  'Q0306',\n  'A|30]4.WWW91we#0M5e#0868$n1.WWW91'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_SOUTHEAST_ASIAN_SCRIPTS = [\n  goog.i18n.CharPickerData.MSG_CP_BALINESE,\n  goog.i18n.CharPickerData.MSG_CP_BATAK,\n  goog.i18n.CharPickerData.MSG_CP_CHAM,\n  goog.i18n.CharPickerData.MSG_CP_JAVANESE,\n  goog.i18n.CharPickerData.MSG_CP_KAYAH_LI,\n  goog.i18n.CharPickerData.MSG_CP_KHMER,\n  goog.i18n.CharPickerData.MSG_CP_LAO,\n  goog.i18n.CharPickerData.MSG_CP_MYANMAR,\n  goog.i18n.CharPickerData.MSG_CP_NEW_TAI_LUE,\n  goog.i18n.CharPickerData.MSG_CP_TAI_LE,\n  goog.i18n.CharPickerData.MSG_CP_TAI_THAM,\n  goog.i18n.CharPickerData.MSG_CP_TAI_VIET,\n  goog.i18n.CharPickerData.MSG_CP_THAI,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_BUGINESE,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_BUHID,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_HANUNOO,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_KHMER,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_REJANG,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_SUNDANESE,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_TAGALOG,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_TAGBANWA\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_SOUTHEAST_ASIAN_SCRIPTS = [\n  '(C70F4n1kWV2.!KBUP4d1f3!',\n  '(T70V312MK2F1',\n  'Q`i0t392E8sW,GM=4F191$6',\n  '2:i0F4P171G,W6q8MP4F1P1',\n  '2zi0V3$6)s',\n  ';I6073GE8?]2E8UO,m,Hi-2Srl286O',\n  'g:3068G68GmM8k8E88G68M86.GU11,GMC4Gc86.8c',\n  'QK40-3:1}1WMOO6uEW71918,W6Iwe0V18,D-e0#192MWE8EGkOMH1|8[M;xe0[',\n  'Y%60@3WN2m?O6',\n  '2z60t2GU',\n  '^@60#4]3,m,mk8c`7,8l2Gn3',\n  '^7j0N48O6GUG8H2686K48EG6e68f2',\n  ';z30N48691c.71*3Gk11!',\n  '2>60}1u6xU',\n  '2C606.#1',\n  'AA60l1O6RE',\n  'gM60v311',\n  'Y%i0}1H2C271',\n  'IO70t2H1l1PNsyTE%271',\n  'I760718MH36K3E',\n  '2C606%3718E86'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HANGUL = [\n  goog.i18n.CharPickerData.MSG_CP_OTHER,\n  '\\u1100',\n  '\\u1102',\n  '\\u1103',\n  '\\u1105',\n  '\\u1106',\n  '\\u1107',\n  '\\u1109',\n  '\\u110B',\n  '\\u110C',\n  '\\u110E',\n  '\\u110F',\n  '\\u1110',\n  '\\u1111',\n  '\\u1112',\n  '\\u1159',\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_HANGUL = [\n  'AzC0M88,8F1X1mWMPqYyh0}1WV42BA06Tis06',\n  ';gj0}}-I',\n  '(zk0Vr',\n  '(+i0MAj20}}-I',\n  'A,i0?2#30Vr',\n  'A-i0EIS40Vr',\n  'Y-i0EY]40}}-I',\n  'w-i0IC60}}-I',\n  '(-i06^U70Vr',\n  '^-i0Q`70}}-I',\n  'I}r0Vr',\n  'wqs0Vr',\n  '2.i02YA0Vr',\n  'A.i0Y}A0Vr',\n  'I.i0(qB0Vr',\n  'Q.i0',\n  'oh40FN^L80d8',\n  'oJD0#2]5#2IGs0MX5#2OcGcGcGE'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_OTHER_EAST_ASIAN_SCRIPTS = [\n  goog.i18n.CharPickerData.MSG_CP_BOPOMOFO,\n  goog.i18n.CharPickerData.MSG_CP_HIRAGANA,\n  goog.i18n.CharPickerData.MSG_CP_KATAKANA,\n  goog.i18n.CharPickerData.MSG_CP_LISU,\n  goog.i18n.CharPickerData.MSG_CP_MIAO,\n  goog.i18n.CharPickerData.MSG_CP_MONGOLIAN,\n  goog.i18n.CharPickerData.MSG_CP_OLD_TURKIC,\n  goog.i18n.CharPickerData.MSG_CP_PHAGS_PA,\n  goog.i18n.CharPickerData.MSG_CP_YI,\n  goog.i18n.CharPickerData.MSG_CP_HISTORIC + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_PHAGS_PA,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_BOPOMOFO,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_HIRAGANA,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_KATAKANA,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_PHAGS_PA,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY + ' - ' +\n      goog.i18n.CharPickerData.MSG_CP_YI\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_OTHER_EAST_ASIAN_SCRIPTS = [\n  'AzC0M88,8F1X1mWM]Ht3XAV2I8s06+f(06^`B0M',\n  'AzC0M88F2X1mWM8#7.H8fD6QCD1T0l065is0U196G6f8wqs0946',\n  'AzC0M88F2X1mWM%8N8fD6n8V1I2D1L0l065is0U196:8Egqs0946',\n  'oph0l3m6pc',\n  '2591F611F4f1d1',\n  'gU60?O8,m738t4$t38aEE:4H9',\n  '2>,0l6',\n  'wU6068AU606e,Gs',\n  'AzC06e,Gs2qT0-18}}-FO@4DL10',\n  'ohi0}4',\n  'Ql)0M',\n  '^%C0f91MF1^oU1bE$0Ujys06',\n  '^%C0HIPDF1vRF48@7g`r0N18}3r%s06',\n  'Ql)0M',\n  'Ql)0M'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_1_STROKE_RADICALS = [\n  '\\u4E00',\n  '\\u4E28',\n  '\\u4E36',\n  '\\u4E3F',\n  '\\u4E59',\n  '\\u4E85',\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY,\n  goog.i18n.CharPickerData.MSG_CP_LESS_COMMON\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_HAN_1_STROKE_RADICALS = [\n  'ItK0l3]1f7YL10',\n  ';wK0M8!',\n  'AyK0k8[',\n  '^yK0,8N1^w30',\n  'Q#K0sG}2YfL0',\n  'Q)K0k',\n  '(bC0c]R]q8O8f2EgqB2E5Cl1]116$f7fG',\n  'A(D0t3(rX1V288k8!8k8868|8l188U8718M8N48E88GE8#48MG@3oA20]G2P60;QB0]9^(20^7L0t2'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_2_STROKE_RADICALS = [\n  '\\u4E8C',\n  '\\u4EA0',\n  '\\u4EBA',\n  '\\u513F',\n  '\\u5165',\n  '\\u516B',\n  '\\u5182',\n  '\\u5196',\n  '\\u51AB',\n  '\\u51E0',\n  '\\u51F5',\n  '\\u5200',\n  '\\u529B',\n  '\\u52F9',\n  '\\u5315',\n  '\\u531A',\n  '\\u5338',\n  '\\u5341',\n  '\\u535C',\n  '\\u5369',\n  '\\u5382',\n  '\\u53B6',\n  '\\u53C8',\n  '\\u8BA0',\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY,\n  goog.i18n.CharPickerData.MSG_CP_LESS_COMMON\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_HAN_2_STROKE_RADICALS = [\n  '^)K0M8N1',\n  '(+K0N2',\n  'A.K0lww)K0',\n  '(gL0V3',\n  'IkL0cI870',\n  '(kL0}1QyK0',\n  ';mL0#1Yw50',\n  'woL0-1',\n  'oqL0#4',\n  'YvL0-1',\n  'QxL0?',\n  'QyL0}D',\n  'Y;L0V58@2',\n  '^^L0d2',\n  'g{L0U',\n  '^{L0t2^IK0',\n  'w0M0!',\n  'g1M0E8s868?QHK0rIK0G',\n  '^3M071',\n  'A5M0F2',\n  'Y7M0t4;XD0',\n  'ACM0l1',\n  '(DM0V2IS10',\n  'Y]a0tD',\n  'QcC0}1%P8]qG688P1W6G6mO8^pB2F28d292%B6f6%A15P1ODrl1f1E9386H18e11Ee[n16[91e11.G$H1n18611$X2cX5k',\n  ';+D0tN8l49H2i40kAsS1uH3v1H788]9@18}2872Gk8E8|8s88E8G-18778@28lF8-6G,8@48#486GF28d28t18t48N3874868-78F58V18}28F48l48lG868d18N18#18!8FN8@98FP8s8}F8N28,8VG8F18tF8}2(s30%U;@101bI-50QE60^{40;X60IhB0}Oo_20d3j%S1'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_3_STROKE_RADICALS = [\n  '\\u53E3',\n  '\\u56D7',\n  '\\u571F',\n  '\\u58EB',\n  '\\u5902',\n  '\\u590A',\n  '\\u5915',\n  '\\u5927',\n  '\\u5973',\n  '\\u5B50',\n  '\\u5B80',\n  '\\u5BF8',\n  '\\u5C0F',\n  '\\u5C22',\n  '\\u5C38',\n  '\\u5C6E',\n  '\\u5C71',\n  '\\u5DDB',\n  '\\u5DE5',\n  '\\u5DF1',\n  '\\u5DFE',\n  '\\u5E72',\n  '\\u5E7A',\n  '\\u5E7F',\n  '\\u5EF4',\n  '\\u5EFE',\n  '\\u5F0B',\n  '\\u5F13',\n  '\\u5F50',\n  '\\u5F61',\n  '\\u5F73',\n  '\\u7E9F',\n  '\\u95E8',\n  '\\u98DE',\n  '\\u9963',\n  '\\u9A6C',\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY,\n  goog.i18n.CharPickerData.MSG_CP_LESS_COMMON\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_HAN_3_STROKE_RADICALS = [\n  'IGM0dY8FM8tB',\n  '^`M0d6^GJ0',\n  'g3N0tZ8}48!Q#I0Ge',\n  'gCN0%W}1',\n  'YlN0k',\n  '2mN0|',\n  'AnN0l1',\n  '(oN0-6',\n  'wvN07D8}T',\n  '2DO0N4',\n  'YHO0-Aw]50',\n  'QSO0}1',\n  'YUO0t1^=H0',\n  'AWO0@1',\n  'AYO08t4',\n  '2dO0E',\n  'A$K0A#30-W',\n  'I.O0c8E',\n  'A:O0|',\n  'I;O071',\n  'Y<O0V78@2',\n  '^{O0s',\n  '2$K0oM40U',\n  'A}O0lAw7H0',\n  '(9P0,',\n  'wAP071',\n  ';BP0s',\n  'oCP0d5',\n  'AIP0d1',\n  'wJP0!8s',\n  'QLP0F7^]G06',\n  '(gX0tD',\n  'wud0t4',\n  'obe0',\n  'wne0l4',\n  '(:e0V5',\n  'YeC0#2P=11Wm11686W(uB2}18l58E8EGMP8:5]6]9Lvl1G86:1mP26m6%1me%1E11X1OmEf1692Ge6H1%1Gm8GX3kX4[F1',\n  'YAE0@G8V(I!20|I!10E:5fX18EwYR1%1u8Gn3v11B1693P2uO91$8OH2H713vMXG%1%K:6]SG13%2H@vX93tU8F587w8}V8-68tA8dO8db8V38758V28t58F18k8#C8t!8V78V98tU8lT8de8}}V98lB8}B8#387987H8#38NJ8@78U8N18U8kgE10(L10v_X4ngA6109Nn2v2Ac101O1}HSQ*1094^.50N2:BP6Ay10Q<40]5;s20AE20V1H9^j20l1%g-3YY20YU10}zAv10@2;310F1]E72X3}1DeT18'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_4_STROKE_RADICALS = [\n  '\\u5FC3',\n  '\\u6208',\n  '\\u6236',\n  '\\u624B',\n  '\\u652F',\n  '\\u6534',\n  '\\u6587',\n  '\\u6597',\n  '\\u65A4',\n  '\\u65B9',\n  '\\u65E0',\n  '\\u65E5',\n  '\\u66F0',\n  '\\u6708',\n  '\\u6728',\n  '\\u6B20',\n  '\\u6B62',\n  '\\u6B79',\n  '\\u6BB3',\n  '\\u6BCB',\n  '\\u6BD4',\n  '\\u6BDB',\n  '\\u6C0F',\n  '\\u6C14',\n  '\\u6C34',\n  '\\u706B',\n  '\\u722A',\n  '\\u7236',\n  '\\u723B',\n  '\\u723F',\n  '\\u7247',\n  '\\u7259',\n  '\\u725B',\n  '\\u72AC',\n  '\\u89C1',\n  '\\u8D1D',\n  '\\u8F66',\n  '\\u97E6',\n  '\\u98CE',\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY,\n  goog.i18n.CharPickerData.MSG_CP_LESS_COMMON\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_HAN_4_STROKE_RADICALS = [\n  'oSP0#q',\n  'Y]P074',\n  'o{P0-1',\n  'g}P0F)2gF0',\n  '((Q0U',\n  '(oM0YG40d7(cA0',\n  '(;Q0V1YNF0',\n  'I=Q071',\n  'Y>Q0-1',\n  'Q@Q0d3',\n  ';^Q0U',\n  ';@L0Y350FOH1os602W80',\n  ';@L0wR5071868k',\n  '(LR0-2Y070',\n  'wOR0}}N4:+IBD0',\n  '2TS0@5',\n  '2ZS0}1I-D0',\n  'AbS0F5',\n  'YgS072',\n  'oiS0!',\n  'YjS0k',\n  '2kS0t4',\n  '(oS0U',\n  'IpS0-2',\n  'AsS0dH8V[',\n  'I$T0le;@402[60nI12',\n  'A:M0wV70|',\n  '^HU0U',\n  'YIU0M',\n  'IxK0gl90s',\n  'gJU0l1',\n  'ALU06',\n  'QLU0N7',\n  'wSU0lJ',\n  ';ba0U8?',\n  '2Sb0V6',\n  'I]b0#4',\n  '2Fe0k',\n  'Aae071',\n  '^SC0HE}2::MGEG.OovB2:8e#4G6G-28}2871]7$65ml1G$mEm6OGOEWE%1eE916Ou6m868W$6m6GU11OE8W91WEWGMmOG6eM$8e6W6mG611Of371136P2}18EH4M',\n  '^aE0]uFq8#@^U20U%LEwSS1f7HLfkX2vCH4vM(a10gv10IO10Yg30Hz}}VE8to8-w8@J8-28tK8td8N48FC8E8l68cGNM8V#8#98lK8-A8-A8|8728E8l287N8}}#E8@N8V%8tC88V88-88lC8N18@48t38l`;Y20(>101dYk201)XQ6nUv^Xao940kAi10cv3QF40UHdXG|fe8o^40}}l3YD10c]Ak]7@19YcX4UjUT16'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_5_STROKE_RADICALS = [\n  '\\u7384',\n  '\\u7389',\n  '\\u74DC',\n  '\\u74E6',\n  '\\u7518',\n  '\\u751F',\n  '\\u7528',\n  '\\u7530',\n  '\\u758B',\n  '\\u7592',\n  '\\u7676',\n  '\\u767D',\n  '\\u76AE',\n  '\\u76BF',\n  '\\u76EE',\n  '\\u77DB',\n  '\\u77E2',\n  '\\u77F3',\n  '\\u793A',\n  '\\u79B8',\n  '\\u79BE',\n  '\\u7A74',\n  '\\u7ACB',\n  '\\u9485',\n  '\\u957F',\n  '\\u9E1F',\n  '\\u9F99',\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY,\n  goog.i18n.CharPickerData.MSG_CP_LESS_COMMON\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_HAN_5_STROKE_RADICALS = [\n  'QmU0U',\n  '(mU0#U',\n  'o@U0,',\n  'g[U0d4',\n  '2{U0k',\n  'w{U0!',\n  'g|U0s',\n  'I}U0N48k8}2',\n  'g7V0k',\n  'A8V0tK',\n  ';SV0k',\n  'o3V0:PV4',\n  '^XV0d1A;A0',\n  'gZV0F4',\n  '(dV0dL(mA0',\n  'QzV0k',\n  '^zV0d1',\n  'w-S0(@20tT',\n  'I5W0VBQH40P4;-506',\n  'wGW0c((20',\n  'IHW0dG',\n  '(XW0-7',\n  'wfW0#1G72Ai70',\n  'YOd0@L',\n  'Ald0',\n  ';-f0#7',\n  'IIg0E',\n  'QkC0}1n.O86n1^?B2V18V3{gl1$f2u6[P1[68$$P1P16926u[[E91$6.u:2UH4|f6O|11X1[E',\n  'AoG0@:;12071n^kXD6I4R1:4WnB9d[15:49lHkX.1pP5Hw]nf]^H20()109d;u101@]2%KY!10:9f.;(307k8dL8}38@88-98?8V?WdA8}S87Q8748l!8-T8#d8d28lI8FK8#12@30nQI,10w^402B20F22,50-1AQ30}b(F10V49f}3]3'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_6_STROKE_RADICALS = [\n  '\\u7AF9',\n  '\\u7C73',\n  '\\u7CF8',\n  '\\u7F36',\n  '\\u7F51',\n  '\\u7F8A',\n  '\\u7FBD',\n  '\\u8001',\n  '\\u800C',\n  '\\u8012',\n  '\\u8033',\n  '\\u807F',\n  '\\u8089',\n  '\\u81E3',\n  '\\u81EA',\n  '\\u81F3',\n  '\\u81FC',\n  '\\u820C',\n  '\\u821B',\n  '\\u821F',\n  '\\u826E',\n  '\\u8272',\n  '\\u8278',\n  '\\u864D',\n  '\\u866B',\n  '\\u8840',\n  '\\u884C',\n  '\\u8863',\n  '\\u897E',\n  '\\u9875',\n  '\\u9F50',\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY,\n  goog.i18n.CharPickerData.MSG_CP_LESS_COMMON\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_HAN_6_STROKE_RADICALS = [\n  ';jW0NY',\n  ';,N0YL70;<10}B',\n  'Q4X0Vc',\n  'guX0V2',\n  '^wX075',\n  'IlV0;G20l4',\n  '(*X076',\n  '^;X0?',\n  '^<X0c',\n  'g=X0@2',\n  'g@X0-6',\n  'Y|X0,',\n  ';^O0Y490tP8l5',\n  '(UY0k',\n  'YVY0!',\n  'IWY0!',\n  '2XY0V1',\n  'gYY0N1',\n  ';ZY0M',\n  'IaY077',\n  'YhY0M',\n  '(hY0c',\n  'QiY0ld8lC8taI!60H1u6.',\n  'gKP0^OA0U872',\n  'ImZ0lg',\n  ';2a0|',\n  '^3a0}1',\n  '^!L0(K10IAD0tP2@50',\n  '(Va071',\n  '2Se0l4',\n  'oBg06',\n  'YmC0l2onC2Wn56XC-28U86G68M8@4jql1MemO68691Em6e6.6GO6n1Oem6P268me$6n19112Eue86WWW:168:4?v6G?%2',\n  'o5E0oq10;%10VE8VH91l;P^w0S1Q0101Io3102E20XZoi10n>2;10XUPN18e]1;n30v6m6(L40vHvCX1:8;g10A{30HM}}N@X2#B8F68@D8VI8@(8NQG#L8#68t18tO8#v8Na8##8VC8#^8tt(j10wB30YE30E(870NF13#hfxd1>RT18'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_7_STROKE_RADICALS = [\n  '\\u5364',\n  '\\u898B',\n  '\\u89D2',\n  '\\u8A00',\n  '\\u8C37',\n  '\\u8C46',\n  '\\u8C55',\n  '\\u8C78',\n  '\\u8C9D',\n  '\\u8D64',\n  '\\u8D70',\n  '\\u8DB3',\n  '\\u8EAB',\n  '\\u8ECA',\n  '\\u8F9B',\n  '\\u8FB0',\n  '\\u8FB5',\n  '\\u9091',\n  '\\u9149',\n  '\\u91C6',\n  '\\u91CC',\n  '\\u9F9F',\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY,\n  goog.i18n.CharPickerData.MSG_CP_LESS_COMMON\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_HAN_7_STROKE_RADICALS = [\n  'w4M0(<J0',\n  '^Wa0?8#3',\n  'Yda074QB50',\n  'oha0#b^R50e',\n  'A7b0N1',\n  'g8b0N1',\n  ';9b073',\n  '2Db0N3',\n  'YGb0}88V2',\n  'gYb0|',\n  'oZb0}5A(40',\n  'wfb0dM',\n  'I$b0#2',\n  '2)b07EwQ4012',\n  '2|b0-1',\n  '^}b0U',\n  '(.O0oFD0@J',\n  'YKc0tG',\n  'Abc0NB',\n  'gmc0c',\n  '2nc0U',\n  '(Ig0',\n  'oaC0XE#1X*en1;}B2n5F18E8!jul186X1ev1[.mn1Gn18116P1[8m]111%1n1v1[G92G6un4kX7|v1',\n  'QAE0gj40lFu-8etLO#D^DT1PL9,AY30v9]_A^60Yl10;N50Az10oi10(I80F`8M8V58Nh8lCu}}}hml3Glb8N@;820o{80|m-3n3V3u-712#9nwv3+zT16'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_8_STROKE_RADICALS = [\n  '\\u91D1',\n  '\\u9577',\n  '\\u9580',\n  '\\u961C',\n  '\\u96B6',\n  '\\u96B9',\n  '\\u96E8',\n  '\\u9751',\n  '\\u975E',\n  '\\u9C7C',\n  '\\u9F7F',\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY,\n  goog.i18n.CharPickerData.MSG_CP_LESS_COMMON\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_HAN_8_STROKE_RADICALS = [\n  'wVS0(HA0-!o_20GG',\n  'Ykd0s',\n  'Ild0V9',\n  'Yzd0@D',\n  'Y<d0E',\n  'w<d0F4',\n  '^@d0d9',\n  'g1e071',\n  'w2e0M',\n  '(Xf0d9',\n  ';Fg0F1',\n  ';qC0!:(IvB2vf71865vl194m.uu14:1]1EWH191$H1m92v1v195X8M',\n  'QTJ0l8H1F4OV68-5:ssQMR1AQ50Q>U0#88@yP2dcf1798N#8FJQn30@1^;106;y30l8f4@1P1N61OV39B!DzT1E'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_9_STROKE_RADICALS = [\n  '\\u9762',\n  '\\u9769',\n  '\\u97CB',\n  '\\u97ED',\n  '\\u97F3',\n  '\\u9801',\n  '\\u98A8',\n  '\\u98DB',\n  '\\u98DF',\n  '\\u9996',\n  '\\u9999',\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY,\n  goog.i18n.CharPickerData.MSG_CP_LESS_COMMON\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_HAN_9_STROKE_RADICALS = [\n  '23e0k',\n  'w3e0-8',\n  'oCe0V2',\n  'wFe0c',\n  'ghW06oy70F1',\n  'gHe0dA',\n  'wWe0V3',\n  'Qbe0E',\n  'wbe0@B',\n  'Qse0E',\n  'ose0t1',\n  'wrC0?f)(AC2N1{gl1f298Ef56n8M',\n  'ooH0g520-Q8!IHS1:_P32-30ARC0YA40](^b70gd807Y8lBelaW728NG91}Zv1t288-4Iz70d1mt1n1|el1H2N1'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_10_STROKE_RADICALS = [\n  '\\u99AC',\n  '\\u9AA8',\n  '\\u9AD8',\n  '\\u9ADF',\n  '\\u9B25',\n  '\\u9B2F',\n  '\\u9B32',\n  '\\u9B3C',\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY,\n  goog.i18n.CharPickerData.MSG_CP_LESS_COMMON\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_HAN_10_STROKE_RADICALS = [\n  'Que0VHQY106',\n  'I@e0N4',\n  'o_e0k',\n  'I`e0N6',\n  'o2f0,',\n  'g3f0E',\n  '(3f0,',\n  'w4f0t2',\n  'wsC0s^?C2Ubvl1:9nT',\n  '^_J077O#9wM(1gQ10#Y]3};gl60@192l2'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_11_17_STROKE_RADICALS = [\n  '\\u9B5A',\n  '\\u9CE5',\n  '\\u9E75',\n  '\\u9E7F',\n  '\\u9EA5',\n  '\\u9EA6',\n  '\\u9EBB',\n  '\\u9EC3',\n  '\\u9ECD',\n  '\\u9ED1',\n  '\\u9EF9',\n  '\\u9EFD',\n  '\\u9EFE',\n  '\\u9F0E',\n  '\\u9F13',\n  '\\u9F20',\n  '\\u9F3B',\n  '\\u9F4A',\n  '\\u9F52',\n  '\\u9F8D',\n  '\\u9F9C',\n  '\\u9FA0',\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY,\n  goog.i18n.CharPickerData.MSG_CP_LESS_COMMON\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_HAN_11_17_STROKE_RADICALS = [\n  'Y7f0NQXWPh',\n  'Qhf0dB87B8l59c',\n  'w@f0!',\n  'o[f0V3',\n  '2`f08d1',\n  'A`f0n1E',\n  '2|f0s',\n  '(|f0,',\n  'w}f0M',\n  'IdN0(mI0s8#2',\n  'w3g0M',\n  '24g08|',\n  'A4g091E',\n  'o5g0U',\n  '26g071',\n  'I7g0V2',\n  'w9g0N1',\n  '2Bg0c',\n  '(Bg0}3',\n  'AHg0E8s',\n  'gIg0E',\n  ';Ig0c',\n  'YtC0#12hC2fYt1>yl1692H26ef66P5946H5nE.6',\n  'IDK0t9$@9uNDGkoOR1fk^x102.20nDQf301=^N50;g202j30M^>90od80g320to12t!]1-H8F[GN6284075f3@394E8l2.G'\n];\n\n\n/**\n * Names of subcategories. Each message this array is the\n * name for the corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_OTHER = [\n  goog.i18n.CharPickerData.MSG_CP_CJK_STROKES,\n  goog.i18n.CharPickerData.MSG_CP_IDEOGRAPHIC_DESCRIPTION,\n  goog.i18n.CharPickerData.MSG_CP_OTHER,\n  goog.i18n.CharPickerData.MSG_CP_COMPATIBILITY,\n  goog.i18n.CharPickerData.MSG_CP_LESS_COMMON\n];\n\n\n/**\n * List of characters in base88 encoding scheme. Each base88 encoded\n * charater string represents corresponding subcategory specified in\n * `goog.i18n.CharPickerData.subcategories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<string>}\n */\ngoog.i18n.CharPickerData.CHARLIST_OF_HAN_OTHER = [\n  'AQC0N28M8d7H%F3',\n  'oxC0|',\n  'AzC0M8|8}1mmWM2iT0o|O065ms0P3MH1',\n  'gMD0F3PB|%CF2[U%8#2Q+r0M',\n  'Q=727K'\n];\n\n\n/**\n * Subcategory names. Each subarray in this array is a list of subcategory\n * names for the corresponding category specified in\n * `goog.i18n.CharPickerData.categories`.\n * @type {!Array<!Array<string>>}\n */\ngoog.i18n.CharPickerData.prototype.subcategories = [\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_SYMBOL,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_EMOJI,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_PUNCTUATION,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_NUMBER,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_FORMAT_WHITESPACE,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_MODIFIER,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_LATIN,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_OTHER_EUROPEAN_SCRIPTS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_AMERICAN_SCRIPTS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_AFRICAN_SCRIPTS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_MIDDLE_EASTERN_SCRIPTS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_SOUTH_ASIAN_SCRIPTS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_SOUTHEAST_ASIAN_SCRIPTS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HANGUL,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_OTHER_EAST_ASIAN_SCRIPTS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_1_STROKE_RADICALS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_2_STROKE_RADICALS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_3_STROKE_RADICALS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_4_STROKE_RADICALS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_5_STROKE_RADICALS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_6_STROKE_RADICALS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_7_STROKE_RADICALS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_8_STROKE_RADICALS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_9_STROKE_RADICALS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_10_STROKE_RADICALS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_11_17_STROKE_RADICALS,\n  goog.i18n.CharPickerData.SUBCATEGORY_NAMES_OF_HAN_OTHER\n];\n\n\n/**\n * Character lists in base88 encoding scheme. Each subarray is a list of\n * base88 encoded charater strings representing corresponding subcategory\n * specified in `goog.i18n.CharPickerData.categories`. Encoding\n * scheme is described in `goog.i18n.CharListDecompressor`.\n * @type {!Array<!Array<string>>}\n */\ngoog.i18n.CharPickerData.prototype.charList = [\n  goog.i18n.CharPickerData.CHARLIST_OF_SYMBOL,\n  goog.i18n.CharPickerData.CHARLIST_OF_EMOJI,\n  goog.i18n.CharPickerData.CHARLIST_OF_PUNCTUATION,\n  goog.i18n.CharPickerData.CHARLIST_OF_NUMBER,\n  goog.i18n.CharPickerData.CHARLIST_OF_FORMAT_WHITESPACE,\n  goog.i18n.CharPickerData.CHARLIST_OF_MODIFIER,\n  goog.i18n.CharPickerData.CHARLIST_OF_LATIN,\n  goog.i18n.CharPickerData.CHARLIST_OF_OTHER_EUROPEAN_SCRIPTS,\n  goog.i18n.CharPickerData.CHARLIST_OF_AMERICAN_SCRIPTS,\n  goog.i18n.CharPickerData.CHARLIST_OF_AFRICAN_SCRIPTS,\n  goog.i18n.CharPickerData.CHARLIST_OF_MIDDLE_EASTERN_SCRIPTS,\n  goog.i18n.CharPickerData.CHARLIST_OF_SOUTH_ASIAN_SCRIPTS,\n  goog.i18n.CharPickerData.CHARLIST_OF_SOUTHEAST_ASIAN_SCRIPTS,\n  goog.i18n.CharPickerData.CHARLIST_OF_HANGUL,\n  goog.i18n.CharPickerData.CHARLIST_OF_OTHER_EAST_ASIAN_SCRIPTS,\n  goog.i18n.CharPickerData.CHARLIST_OF_HAN_1_STROKE_RADICALS,\n  goog.i18n.CharPickerData.CHARLIST_OF_HAN_2_STROKE_RADICALS,\n  goog.i18n.CharPickerData.CHARLIST_OF_HAN_3_STROKE_RADICALS,\n  goog.i18n.CharPickerData.CHARLIST_OF_HAN_4_STROKE_RADICALS,\n  goog.i18n.CharPickerData.CHARLIST_OF_HAN_5_STROKE_RADICALS,\n  goog.i18n.CharPickerData.CHARLIST_OF_HAN_6_STROKE_RADICALS,\n  goog.i18n.CharPickerData.CHARLIST_OF_HAN_7_STROKE_RADICALS,\n  goog.i18n.CharPickerData.CHARLIST_OF_HAN_8_STROKE_RADICALS,\n  goog.i18n.CharPickerData.CHARLIST_OF_HAN_9_STROKE_RADICALS,\n  goog.i18n.CharPickerData.CHARLIST_OF_HAN_10_STROKE_RADICALS,\n  goog.i18n.CharPickerData.CHARLIST_OF_HAN_11_17_STROKE_RADICALS,\n  goog.i18n.CharPickerData.CHARLIST_OF_HAN_OTHER\n];\n","^17",1579837703000,"^18",["^19",["^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/charpickerdata.js"],"^1J",["^19",["~$goog.i18n.CharPickerData"]],"^X",true,"^Y",["^Z"]],["^ ","^[",[1579837703000],"^10","goog.events.eventid.js","^11",["^12","goog/events/eventid.js"],"^13","goog/events/eventid.js","^14","^15","^16","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.events.EventId');\n\n\n\n/**\n * A templated class that is used when registering for events. Typical usage:\n *\n *    /** @type {goog.events.EventId<MyEventObj>} *\\\n *    var myEventId = new goog.events.EventId(\n *        goog.events.getUniqueId(('someEvent'));\n *\n *    // No need to cast or declare here since the compiler knows the\n *    // correct type of 'evt' (MyEventObj).\n *    something.listen(myEventId, function(evt) {});\n *\n * @param {string} eventId\n * @template T\n * @constructor\n * @struct\n * @final\n */\ngoog.events.EventId = function(eventId) {\n  /** @const */ this.id = eventId;\n};\n\n\n/**\n * @override\n */\ngoog.events.EventId.prototype.toString = function() {\n  return this.id;\n};\n","^17",1579837703000,"^18",["^19",["^Z"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/eventid.js"],"^1J",["^19",["~$goog.events.EventId"]],"^X",true,"^Y",["^Z"]],["^ ","^[",[1579837703000],"^10","goog.labs.useragent.util.js","^11",["^12","goog/labs/useragent/util.js"],"^13","goog/labs/useragent/util.js","^14","^15","^16","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities used by goog.labs.userAgent tools. These functions\n * should not be used outside of goog.labs.userAgent.*.\n *\n * @author nnaze@google.com (Nathan Naze)\n */\n\ngoog.provide('goog.labs.userAgent.util');\n\ngoog.require('goog.string.internal');\n\n\n/**\n * Gets the native userAgent string from navigator if it exists.\n * If navigator or navigator.userAgent string is missing, returns an empty\n * string.\n * @return {string}\n * @private\n */\ngoog.labs.userAgent.util.getNativeUserAgentString_ = function() {\n  var navigator = goog.labs.userAgent.util.getNavigator_();\n  if (navigator) {\n    var userAgent = navigator.userAgent;\n    if (userAgent) {\n      return userAgent;\n    }\n  }\n  return '';\n};\n\n\n/**\n * Getter for the native navigator.\n * This is a separate function so it can be stubbed out in testing.\n * @return {Navigator}\n * @private\n */\ngoog.labs.userAgent.util.getNavigator_ = function() {\n  return goog.global.navigator;\n};\n\n\n/**\n * A possible override for applications which wish to not check\n * navigator.userAgent but use a specified value for detection instead.\n * @private {string}\n */\ngoog.labs.userAgent.util.userAgent_ =\n    goog.labs.userAgent.util.getNativeUserAgentString_();\n\n\n/**\n * Applications may override browser detection on the built in\n * navigator.userAgent object by setting this string. Set to null to use the\n * browser object instead.\n * @param {?string=} opt_userAgent The User-Agent override.\n */\ngoog.labs.userAgent.util.setUserAgent = function(opt_userAgent) {\n  goog.labs.userAgent.util.userAgent_ =\n      opt_userAgent || goog.labs.userAgent.util.getNativeUserAgentString_();\n};\n\n\n/**\n * @return {string} The user agent string.\n */\ngoog.labs.userAgent.util.getUserAgent = function() {\n  return goog.labs.userAgent.util.userAgent_;\n};\n\n\n/**\n * @param {string} str\n * @return {boolean} Whether the user agent contains the given string.\n */\ngoog.labs.userAgent.util.matchUserAgent = function(str) {\n  var userAgent = goog.labs.userAgent.util.getUserAgent();\n  return goog.string.internal.contains(userAgent, str);\n};\n\n\n/**\n * @param {string} str\n * @return {boolean} Whether the user agent contains the given string, ignoring\n *     case.\n */\ngoog.labs.userAgent.util.matchUserAgentIgnoreCase = function(str) {\n  var userAgent = goog.labs.userAgent.util.getUserAgent();\n  return goog.string.internal.caseInsensitiveContains(userAgent, str);\n};\n\n\n/**\n * Parses the user agent into tuples for each section.\n * @param {string} userAgent\n * @return {!Array<!Array<string>>} Tuples of key, version, and the contents\n *     of the parenthetical.\n */\ngoog.labs.userAgent.util.extractVersionTuples = function(userAgent) {\n  // Matches each section of a user agent string.\n  // Example UA:\n  // Mozilla/5.0 (iPad; U; CPU OS 3_2_1 like Mac OS X; en-us)\n  // AppleWebKit/531.21.10 (KHTML, like Gecko) Mobile/7B405\n  // This has three version tuples: Mozilla, AppleWebKit, and Mobile.\n\n  var versionRegExp = new RegExp(\n      // Key. Note that a key may have a space.\n      // (i.e. 'Mobile Safari' in 'Mobile Safari/5.0')\n      '(\\\\w[\\\\w ]+)' +\n\n          '/' +                // slash\n          '([^\\\\s]+)' +        // version (i.e. '5.0b')\n          '\\\\s*' +             // whitespace\n          '(?:\\\\((.*?)\\\\))?',  // parenthetical info. parentheses not matched.\n      'g');\n\n  var data = [];\n  var match;\n\n  // Iterate and collect the version tuples.  Each iteration will be the\n  // next regex match.\n  while (match = versionRegExp.exec(userAgent)) {\n    data.push([\n      match[1],  // key\n      match[2],  // value\n      // || undefined as this is not undefined in IE7 and IE8\n      match[3] || undefined  // info\n    ]);\n  }\n\n  return data;\n};\n","^17",1579837703000,"^18",["^19",["^Z","~$goog.string.internal"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/useragent/util.js"],"^1J",["^19",["^4U"]],"^X",true,"^Y",["^Z","^[Z"]],["^ ","^[",[1579837703000],"^2F",true,"^10","goog.streams.lite_test_cases.js","^11",["^12","goog/streams/lite_test_cases.js"],"^13","goog/streams/lite_test_cases.js","^14","^15","^16","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.module('goog.streams.liteTestCases');\ngoog.setTestOnly();\n\nconst {ReadableStream, ReadableStreamDefaultController, ReadableStreamUnderlyingSource} = goog.require('goog.streams.liteTypes');\n/** @suppress {extraRequire} */\ngoog.require('goog.testing.jsunit');\n\nclass TestCases {\n  /**\n   * @param {function(!ReadableStreamUnderlyingSource): !ReadableStream}\n   *     newReadableStream\n   */\n  constructor(newReadableStream) {\n    /** @const */\n    this.newReadableStream = newReadableStream;\n  }\n\n  /**\n   * @param {!ReadableStreamUnderlyingSource=} underlyingSource\n   * @return {{stream: !ReadableStream<string>, controller:\n   *     !ReadableStreamDefaultController<string>}}\n   */\n  newReadableStreamWithController(underlyingSource = {}) {\n    let controller;\n    const start = underlyingSource.start;\n    underlyingSource = Object.assign({}, underlyingSource, {\n      start(ctlr) {\n        controller = ctlr;\n        return start && start(ctlr);\n      },\n    });\n    const stream = this.newReadableStream(underlyingSource);\n    return {stream, controller};\n  }\n\n  async testEnqueue_ThenRead() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const chunk = 'foo';\n    controller.enqueue(chunk);\n    const reader = stream.getReader();\n    const readResult = await reader.read();\n    assertFalse(readResult.done);\n    assertEquals(chunk, readResult.value);\n  }\n\n  testEnqueue_Closed() {\n    const {controller} = this.newReadableStreamWithController();\n    controller.close();\n    assertThrows(() => {\n      controller.enqueue('foo');\n    });\n  }\n\n  testEnqueue_Closing() {\n    const {controller} = this.newReadableStreamWithController();\n    controller.enqueue('foo');\n    controller.close();\n    assertThrows(() => {\n      controller.enqueue('bar');\n    });\n  }\n\n  testEnqueue_Errored() {\n    const {controller} = this.newReadableStreamWithController();\n    controller.error(new Error('error'));\n    assertThrows(() => {\n      controller.enqueue('foo');\n    });\n  }\n\n  async testRead_ThenEnqueue() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const chunk = 'foo';\n    const reader = stream.getReader();\n    const read = reader.read();\n    controller.enqueue(chunk);\n    const readResult = await read;\n    assertFalse(readResult.done);\n    assertEquals(chunk, readResult.value);\n  }\n\n  async testRead_Closed() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    controller.close();\n    const reader = stream.getReader();\n    const readResult = await reader.read();\n    assertTrue(readResult.done);\n    assertUndefined(readResult.value);\n  }\n\n  async testRead_Closing() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const chunk = 'foo';\n    controller.enqueue(chunk);\n    controller.close();\n    const reader = stream.getReader();\n    let readResult = await reader.read();\n    assertFalse(readResult.done);\n    assertEquals(chunk, readResult.value);\n    readResult = await reader.read();\n    assertTrue(readResult.done);\n    assertUndefined(readResult.value);\n  }\n\n  async testRead_Errored() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const error = new Error('error');\n    controller.error(error);\n    const reader = stream.getReader();\n    const rejectedError = await assertRejects(reader.read());\n    assertEquals(error, rejectedError);\n  }\n\n  async testRead_ThenClosed() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const reader = stream.getReader();\n    const read = reader.read();\n    controller.close();\n    const readResult = await read;\n    assertTrue(readResult.done);\n    assertUndefined(readResult.value);\n  }\n\n  async testRead_ThenErrored() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const error = new Error('error');\n    const reader = stream.getReader();\n    const read = reader.read();\n    controller.error(error);\n    const rejectedError = await assertRejects(read);\n    assertEquals(error, rejectedError);\n  }\n\n  testClose_Closed() {\n    const {controller} = this.newReadableStreamWithController();\n    controller.close();\n    assertThrows(() => {\n      controller.close();\n    });\n  }\n\n  testClose_Closing() {\n    const {controller} = this.newReadableStreamWithController();\n    controller.enqueue('foo');\n    controller.close();\n    assertThrows(() => {\n      controller.close();\n    });\n  }\n\n  async testLocked() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    assertFalse(stream.locked);\n    const reader = stream.getReader();\n    assertTrue(stream.locked);\n    reader.releaseLock();\n    assertFalse(stream.locked);\n  }\n\n  testLocked_Closed() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const reader = stream.getReader();\n    assertTrue(stream.locked);\n    controller.close();\n    assertTrue(stream.locked);\n    reader.releaseLock();\n    assertFalse(stream.locked);\n  }\n\n  testLocked_Closing() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const reader = stream.getReader();\n    controller.enqueue('foo');\n    assertTrue(stream.locked);\n    controller.close();\n    assertTrue(stream.locked);\n    reader.releaseLock();\n    assertFalse(stream.locked);\n  }\n\n  testLocked_Errored() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const reader = stream.getReader();\n    assertTrue(stream.locked);\n    controller.error(new Error('error'));\n    assertTrue(stream.locked);\n    reader.releaseLock();\n    assertFalse(stream.locked);\n  }\n\n  async testClosed_Close() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    controller.close();\n    const reader = stream.getReader();\n    const closed = reader.closed;\n    const closedResult = await closed;\n    assertUndefined(closedResult);\n  }\n\n  async testClosed_ThenClosed() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const reader = stream.getReader();\n    const closed = reader.closed;\n    controller.close();\n    const closedResult = await closed;\n    assertUndefined(closedResult);\n  }\n\n  async testClosed_Closing() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    controller.enqueue('foo');\n    controller.close();\n    const reader = stream.getReader();\n    const closed = reader.closed;\n    await reader.read();\n    const closedResult = await closed;\n    assertUndefined(closedResult);\n  }\n\n  async testClosed_ThenClosing() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const reader = stream.getReader();\n    const closed = reader.closed;\n    controller.enqueue('foo');\n    controller.close();\n    await reader.read();\n    const closedResult = await closed;\n    assertUndefined(closedResult);\n  }\n\n  async testClosed_Errored() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const error = new Error('error');\n    controller.error(error);\n    const reader = stream.getReader();\n    const rejectedError = await assertRejects(reader.closed);\n    assertEquals(error, rejectedError);\n  }\n\n  async testClosed_ThenErrored() {\n    const {stream, controller} = this.newReadableStreamWithController();\n    const reader = stream.getReader();\n    const closed = reader.closed;\n    controller.error(new Error('error'));\n    await assertRejects(closed);\n  }\n\n  async testClosed_ThenReleaseLock() {\n    const {stream} = this.newReadableStreamWithController();\n    const reader = stream.getReader();\n    const closed = reader.closed;\n    reader.releaseLock();\n    await assertRejects(closed);\n  }\n\n  testGetReader_WhileLocked() {\n    const {stream} = this.newReadableStreamWithController();\n    stream.getReader();\n    assertThrows(() => {\n      stream.getReader();\n    });\n  }\n\n  testReleaseLock_WhileOutstandingReads() {\n    const {stream} = this.newReadableStreamWithController();\n    const reader = stream.getReader();\n    reader.read();\n    assertThrows(() => {\n      reader.releaseLock();\n    });\n  }\n\n  testReleaseLock_Released() {\n    const {stream} = this.newReadableStreamWithController();\n    const reader = stream.getReader();\n    reader.releaseLock();\n    reader.releaseLock();\n  }\n\n  async testStart_RejectedPromise() {\n    const error = new Error('error');\n    const stream = this.newReadableStream({\n      start() {\n        return Promise.reject(error);\n      }\n    });\n    const reader = stream.getReader();\n    const rejectedError = await assertRejects(reader.read());\n    assertEquals(error, rejectedError);\n  }\n}\n\nexports = {\n  TestCases,\n};\n","^17",1579837703000,"^18",["^19",["^Z","^52","^=5"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/streams/lite_test_cases.js"],"^1J",["^19",["~$goog.streams.liteTestCases"]],"^X",true,"^Y",["^Z","^52","^=5"]],["^ ","^[",[1579837703000],"^10","goog.ui.media.photo.js","^11",["^12","goog/ui/media/photo.js"],"^13","goog/ui/media/photo.js","^14","^15","^16","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview provides a reusable photo UI component that renders photos that\n * contains metadata (such as captions, description, thumbnail/high resolution\n * versions, etc).\n *\n * goog.ui.media.Photo is actually a {@link goog.ui.ControlRenderer},\n * a stateless class - that could/should be used as a Singleton with the static\n * method `goog.ui.media.Photo.getInstance` -, that knows how to render\n * Photos. It is designed to be used with a {@link goog.ui.Control}, which will\n * actually control the media renderer and provide the {@link goog.ui.Component}\n * base. This design guarantees that all different types of medias will behave\n * alike but will look different.\n *\n * goog.ui.media.Photo expects `goog.ui.media.MediaModel` on\n * `goog.ui.Control.getModel` as data models.\n *\n * Example of usage:\n *\n * <pre>\n *   var photo = goog.ui.media.Photo.newControl(\n *       new goog.ui.media.MediaModel('http://hostname/file.jpg'));\n *   photo.render(goog.dom.getElement('parent'));\n * </pre>\n *\n * Photo medias currently support the following states:\n *\n * <ul>\n *   <li> {@link goog.ui.Component.State.HOVER}: mouse cursor is over the photo.\n *   <li> {@link goog.ui.Component.State.SELECTED}: photo is being displayed.\n * </ul>\n *\n * Which can be accessed by\n *\n * <pre>\n *   photo.setHighlighted(true);\n *   photo.setSelected(true);\n * </pre>\n *\n */\n\ngoog.provide('goog.ui.media.Photo');\n\ngoog.forwardDeclare('goog.ui.media.MediaModel');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.ui.media.Media');\ngoog.require('goog.ui.media.MediaRenderer');\n\n\n\n/**\n * Subclasses a goog.ui.media.MediaRenderer to provide a Photo specific media\n * renderer. Provides a base class for any other renderer that wants to display\n * photos.\n *\n * This class is meant to be used as a singleton static stateless class, that\n * takes `goog.ui.media.Media` instances and renders it.\n *\n * This design is patterned after\n * http://go/closure_control_subclassing\n *\n * @constructor\n * @extends {goog.ui.media.MediaRenderer}\n * @final\n */\ngoog.ui.media.Photo = function() {\n  goog.ui.media.MediaRenderer.call(this);\n};\ngoog.inherits(goog.ui.media.Photo, goog.ui.media.MediaRenderer);\ngoog.addSingletonGetter(goog.ui.media.Photo);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n *\n * @type {string}\n */\ngoog.ui.media.Photo.CSS_CLASS = goog.getCssName('goog-ui-media-photo');\n\n\n/**\n * A static convenient method to construct a goog.ui.media.Media control out of\n * a photo `goog.ui.media.MediaModel`. It sets it as the data model\n * goog.ui.media.Photo renderer uses, sets the states supported by the renderer,\n * and returns a Control that binds everything together. This is what you\n * should be using for constructing Photos, except if you need finer control\n * over the configuration.\n *\n * @param {goog.ui.media.MediaModel} dataModel The photo data model.\n * @return {!goog.ui.media.Media} A goog.ui.Control subclass with the photo\n *     renderer.\n */\ngoog.ui.media.Photo.newControl = function(dataModel) {\n  var control =\n      new goog.ui.media.Media(dataModel, goog.ui.media.Photo.getInstance());\n  return control;\n};\n\n\n/**\n * Creates the initial DOM structure of a photo.\n *\n * @param {goog.ui.Control} c The media control.\n * @return {!Element} A DOM structure that represents the control.\n * @override\n */\ngoog.ui.media.Photo.prototype.createDom = function(c) {\n  var control = /** @type {goog.ui.media.Media} */ (c);\n  var div = goog.ui.media.Photo.superClass_.createDom.call(this, control);\n\n  var img = control.getDomHelper().createDom(goog.dom.TagName.IMG, {\n    src: control.getDataModel().getPlayer().getUrl(),\n    className: goog.getCssName(this.getCssClass(), 'image')\n  });\n\n  div.appendChild(img);\n\n  return div;\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.media.Photo.prototype.getCssClass = function() {\n  return goog.ui.media.Photo.CSS_CLASS;\n};\n","^17",1579837703000,"^18",["^19",["^;Y","^;Z","^Z","^1V"]],"^1;",["^ ","^1<","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^1=","^1>","^1?","^1@","^1A","Google Closure Library","^1B","^1C","^1D","http://code.google.com/p/closure-library/","^1E","^1F","^1G",["^1C","0.0-20191016-6ae1f72f"],"^1H","0.0-20191016-6ae1f72f"],"^1D",["^1I","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/media/photo.js"],"^1J",["^19",["~$goog.ui.media.Photo"]],"~:from-jar",true,"~:deps",["~$goog","~$goog.dom.TagName","~$goog.ui.media.Media","~$goog.ui.media.MediaRenderer"]],["^ ","~:cache-key",[1579837703000],"~:output-name","goog.proto2.package_test.pb.js","~:resource-id",["~:shadow.build.classpath/resource","goog/proto2/package_test.pb.js"],"~:resource-name","goog/proto2/package_test.pb.js","~:type","~:goog","~:source","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All other code copyright its respective owners(s).\n\n/**\n * @fileoverview Generated Protocol Buffer code for file\n * closure/goog/proto2/package_test.proto.\n */\n\ngoog.provide('someprotopackage.TestPackageTypes');\ngoog.setTestOnly('someprotopackage.TestPackageTypes');\n\ngoog.require('goog.proto2.Message');\ngoog.require('proto2.TestAllTypes');\n\n\n\n/**\n * Message TestPackageTypes.\n * @constructor\n * @extends {goog.proto2.Message}\n * @final\n */\nsomeprotopackage.TestPackageTypes = function() {\n  goog.proto2.Message.call(this);\n};\ngoog.inherits(someprotopackage.TestPackageTypes, goog.proto2.Message);\n\n\n/**\n * Descriptor for this message, deserialized lazily in getDescriptor().\n * @private {?goog.proto2.Descriptor}\n */\nsomeprotopackage.TestPackageTypes.descriptor_ = null;\n\n\n/**\n * Overrides {@link goog.proto2.Message#clone} to specify its exact return type.\n * @return {!someprotopackage.TestPackageTypes} The cloned message.\n * @override\n */\nsomeprotopackage.TestPackageTypes.prototype.clone;\n\n\n/**\n * Gets the value of the optional_int32 field.\n * @return {?number} The value.\n */\nsomeprotopackage.TestPackageTypes.prototype.getOptionalInt32 = function() {\n  return /** @type {?number} */ (this.get$Value(1));\n};\n\n\n/**\n * Gets the value of the optional_int32 field or the default value if not set.\n * @return {number} The value.\n */\nsomeprotopackage.TestPackageTypes.prototype.getOptionalInt32OrDefault = function() {\n  return /** @type {number} */ (this.get$ValueOrDefault(1));\n};\n\n\n/**\n * Sets the value of the optional_int32 field.\n * @param {number} value The value.\n */\nsomeprotopackage.TestPackageTypes.prototype.setOptionalInt32 = function(value) {\n  this.set$Value(1, value);\n};\n\n\n/**\n * @return {boolean} Whether the optional_int32 field has a value.\n */\nsomeprotopackage.TestPackageTypes.prototype.hasOptionalInt32 = function() {\n  return this.has$Value(1);\n};\n\n\n/**\n * @return {number} The number of values in the optional_int32 field.\n */\nsomeprotopackage.TestPackageTypes.prototype.optionalInt32Count = function() {\n  return this.count$Values(1);\n};\n\n\n/**\n * Clears the values in the optional_int32 field.\n */\nsomeprotopackage.TestPackageTypes.prototype.clearOptionalInt32 = function() {\n  this.clear$Field(1);\n};\n\n\n/**\n * Gets the value of the other_all field.\n * @return {?proto2.TestAllTypes} The value.\n */\nsomeprotopackage.TestPackageTypes.prototype.getOtherAll = function() {\n  return /** @type {?proto2.TestAllTypes} */ (this.get$Value(2));\n};\n\n\n/**\n * Gets the value of the other_all field or the default value if not set.\n * @return {!proto2.TestAllTypes} The value.\n */\nsomeprotopackage.TestPackageTypes.prototype.getOtherAllOrDefault = function() {\n  return /** @type {!proto2.TestAllTypes} */ (this.get$ValueOrDefault(2));\n};\n\n\n/**\n * Sets the value of the other_all field.\n * @param {!proto2.TestAllTypes} value The value.\n */\nsomeprotopackage.TestPackageTypes.prototype.setOtherAll = function(value) {\n  this.set$Value(2, value);\n};\n\n\n/**\n * @return {boolean} Whether the other_all field has a value.\n */\nsomeprotopackage.TestPackageTypes.prototype.hasOtherAll = function() {\n  return this.has$Value(2);\n};\n\n\n/**\n * @return {number} The number of values in the other_all field.\n */\nsomeprotopackage.TestPackageTypes.prototype.otherAllCount = function() {\n  return this.count$Values(2);\n};\n\n\n/**\n * Clears the values in the other_all field.\n */\nsomeprotopackage.TestPackageTypes.prototype.clearOtherAll = function() {\n  this.clear$Field(2);\n};\n\n\n/** @override */\nsomeprotopackage.TestPackageTypes.prototype.getDescriptor = function() {\n  let descriptor = someprotopackage.TestPackageTypes.descriptor_;\n  if (!descriptor) {\n    // The descriptor is created lazily when we instantiate a new instance.\n    const descriptorObj = {\n      0: {\n        name: 'TestPackageTypes',\n        fullName: 'someprotopackage.TestPackageTypes'\n      },\n      1: {\n        name: 'optional_int32',\n        fieldType: goog.proto2.Message.FieldType.INT32,\n        type: Number\n      },\n      2: {\n        name: 'other_all',\n        fieldType: goog.proto2.Message.FieldType.MESSAGE,\n        type: proto2.TestAllTypes\n      }\n    };\n    someprotopackage.TestPackageTypes.descriptor_ = descriptor =\n        goog.proto2.Message.createDescriptor(\n             someprotopackage.TestPackageTypes, descriptorObj);\n  }\n  return descriptor;\n};\n\n\n/** @nocollapse */\nsomeprotopackage.TestPackageTypes.getDescriptor =\n    someprotopackage.TestPackageTypes.prototype.getDescriptor;\n","~:last-modified",1579837703000,"~:requires",["~#set",["^3","~$proto2.TestAllTypes","~$goog.proto2.Message"]],"~:pom-info",["^ ","~:description","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","~:group-id","~$org.clojure","~:artifact-id","~$google-closure-library","~:name","Google Closure Library","~:id","~$org.clojure/google-closure-library","~:url","http://code.google.com/p/closure-library/","~:parent-group-id","~$org.sonatype.oss","~:coordinate",["^L","0.0-20191016-6ae1f72f"],"~:version","0.0-20191016-6ae1f72f"],"^M",["~#url","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/proto2/package_test.pb.js"],"~:provides",["^A",["~$someprotopackage.TestPackageTypes"]],"^1",true,"^2",["^3","^C","^B"]],["^ ","^7",[1579837703000],"^8","goog.vec.quaternion.js","^9",["^:","goog/vec/quaternion.js"],"^;","goog/vec/quaternion.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Implements quaternions and their conversion functions. In this\n * implementation, quaternions are represented as 4 element vectors with the\n * first 3 elements holding the imaginary components and the 4th element holding\n * the real component.\n *\n */\ngoog.provide('goog.vec.Quaternion');\ngoog.provide('goog.vec.Quaternion.AnyType');\n\ngoog.require('goog.vec');\ngoog.require('goog.vec.Vec3');\ngoog.require('goog.vec.Vec4');\n\n\n/** @typedef {!goog.vec.Float32} */ goog.vec.Quaternion.Float32;\n/** @typedef {!goog.vec.Float64} */ goog.vec.Quaternion.Float64;\n/** @typedef {!goog.vec.Number} */ goog.vec.Quaternion.Number;\n/** @typedef {!goog.vec.AnyType} */ goog.vec.Quaternion.AnyType;\n\n\n/**\n * Creates a Float32 quaternion, initialized to zero.\n *\n * @return {!goog.vec.Quaternion.Float32} The new quaternion.\n */\ngoog.vec.Quaternion.createFloat32 = goog.vec.Vec4.createFloat32;\n\n\n/**\n * Creates a Float64 quaternion, initialized to zero.\n *\n * @return {!goog.vec.Quaternion.Float64} The new quaternion.\n */\ngoog.vec.Quaternion.createFloat64 = goog.vec.Vec4.createFloat64;\n\n\n/**\n * Creates a Number quaternion, initialized to zero.\n *\n * @return {goog.vec.Quaternion.Number} The new quaternion.\n */\ngoog.vec.Quaternion.createNumber = goog.vec.Vec4.createNumber;\n\n\n/**\n * Creates a new Float32 quaternion initialized with the values from the\n * supplied array.\n *\n * @param {!goog.vec.AnyType} vec The source 4 element array.\n * @return {!goog.vec.Quaternion.Float32} The new quaternion.\n */\ngoog.vec.Quaternion.createFloat32FromArray =\n    goog.vec.Vec4.createFloat32FromArray;\n\n\n/**\n * Creates a new Float64 quaternion initialized with the values from the\n * supplied array.\n *\n * @param {!goog.vec.AnyType} vec The source 4 element array.\n * @return {!goog.vec.Quaternion.Float64} The new quaternion.\n */\ngoog.vec.Quaternion.createFloat64FromArray =\n    goog.vec.Vec4.createFloat64FromArray;\n\n\n/**\n * Creates a new Float32 quaternion initialized with the supplied values.\n *\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @param {number} v3 The value for element at index 3.\n * @return {!goog.vec.Quaternion.Float32} The new quaternion.\n */\ngoog.vec.Quaternion.createFloat32FromValues =\n    goog.vec.Vec4.createFloat32FromValues;\n\n\n/**\n * Creates a new Float64 quaternion initialized with the supplied values.\n *\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @param {number} v3 The value for element at index 3.\n * @return {!goog.vec.Quaternion.Float64} The new quaternion.\n */\ngoog.vec.Quaternion.createFloat64FromValues =\n    goog.vec.Vec4.createFloat64FromValues;\n\n\n/**\n * Creates a clone of the given Float32 quaternion.\n *\n * @param {!goog.vec.Quaternion.Float32} q The source quaternion.\n * @return {!goog.vec.Quaternion.Float32} The new quaternion.\n */\ngoog.vec.Quaternion.cloneFloat32 = goog.vec.Vec4.cloneFloat32;\n\n\n/**\n * Creates a clone of the given Float64 quaternion.\n *\n * @param {!goog.vec.Quaternion.Float64} q The source quaternion.\n * @return {!goog.vec.Quaternion.Float64} The new quaternion.\n */\ngoog.vec.Quaternion.cloneFloat64 = goog.vec.Vec4.cloneFloat64;\n\n\n/**\n * Creates a Float32 quaternion, initialized to the identity.\n *\n * @return {!goog.vec.Quaternion.Float32} The new quaternion.\n */\ngoog.vec.Quaternion.createIdentityFloat32 = function() {\n  var quat = goog.vec.Quaternion.createFloat32();\n  goog.vec.Quaternion.makeIdentity(quat);\n  return quat;\n};\n\n\n/**\n * Creates a Float64 quaternion, initialized to the identity.\n *\n * @return {!goog.vec.Quaternion.Float64} The new quaternion.\n */\ngoog.vec.Quaternion.createIdentityFloat64 = function() {\n  var quat = goog.vec.Quaternion.createFloat64();\n  goog.vec.Quaternion.makeIdentity(quat);\n  return quat;\n};\n\n\n/**\n * Initializes the quaternion with the given values.\n *\n * @param {!goog.vec.Quaternion.AnyType} q The quaternion to receive\n *     the values.\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @param {number} v3 The value for element at index 3.\n * @return {!goog.vec.Vec4.AnyType} return q so that operations can be\n *     chained together.\n */\ngoog.vec.Quaternion.setFromValues = goog.vec.Vec4.setFromValues;\n\n\n/**\n * Initializes the quaternion with the given array of values.\n *\n * @param {!goog.vec.Quaternion.AnyType} q The quaternion to receive\n *     the values.\n * @param {!goog.vec.AnyType} values The array of values.\n * @return {!goog.vec.Quaternion.AnyType} return q so that operations can be\n *     chained together.\n */\ngoog.vec.Quaternion.setFromArray = goog.vec.Vec4.setFromArray;\n\n\n/**\n * Adds the two quaternions.\n *\n * @param {!goog.vec.Quaternion.AnyType} quat0 The first addend.\n * @param {!goog.vec.Quaternion.AnyType} quat1 The second addend.\n * @param {!goog.vec.Quaternion.AnyType} resultQuat The quaternion to\n *     receive the result. May be quat0 or quat1.\n */\ngoog.vec.Quaternion.add = goog.vec.Vec4.add;\n\n\n/**\n * Negates a quaternion, storing the result into resultQuat.\n *\n * @param {!goog.vec.Quaternion.AnyType} quat0 The quaternion to negate.\n * @param {!goog.vec.Quaternion.AnyType} resultQuat The quaternion to\n *     receive the result. May be quat0.\n */\ngoog.vec.Quaternion.negate = goog.vec.Vec4.negate;\n\n\n/**\n * Multiplies each component of quat0 with scalar storing the product into\n * resultVec.\n *\n * @param {!goog.vec.Quaternion.AnyType} quat0 The source quaternion.\n * @param {number} scalar The value to multiply with each component of quat0.\n * @param {!goog.vec.Quaternion.AnyType} resultQuat The quaternion to\n *     receive the result. May be quat0.\n */\ngoog.vec.Quaternion.scale = goog.vec.Vec4.scale;\n\n\n/**\n * Returns the square magnitude of the given quaternion.\n *\n * @param {!goog.vec.Quaternion.AnyType} quat0 The quaternion.\n * @return {number} The magnitude of the quaternion.\n */\ngoog.vec.Quaternion.magnitudeSquared = goog.vec.Vec4.magnitudeSquared;\n\n\n/**\n * Returns the magnitude of the given quaternion.\n *\n * @param {!goog.vec.Quaternion.AnyType} quat0 The quaternion.\n * @return {number} The magnitude of the quaternion.\n */\ngoog.vec.Quaternion.magnitude = goog.vec.Vec4.magnitude;\n\n\n/**\n * Normalizes the given quaternion storing the result into resultVec.\n *\n * @param {!goog.vec.Quaternion.AnyType} quat0 The quaternion to\n *     normalize.\n * @param {!goog.vec.Quaternion.AnyType} resultQuat The quaternion to\n *     receive the result. May be quat0.\n */\ngoog.vec.Quaternion.normalize = goog.vec.Vec4.normalize;\n\n\n/**\n * Computes the dot (scalar) product of two quaternions.\n *\n * @param {!goog.vec.Quaternion.AnyType} q0 The first quaternion.\n * @param {!goog.vec.Quaternion.AnyType} q1 The second quaternion.\n * @return {number} The scalar product.\n */\ngoog.vec.Quaternion.dot = goog.vec.Vec4.dot;\n\n\n/**\n * Computes the inverse of the quaternion in quat, storing the result into\n * resultQuat.\n *\n * If the quaternion is already normalized, goog.vec.Quaternion.conjugate\n * is faster than this function and produces the same result.\n *\n * @param {!goog.vec.Quaternion.AnyType} quat The quaternion to invert.\n * @param {!goog.vec.Quaternion.AnyType} resultQuat The quaternion to receive\n *     the result.\n * @return {!goog.vec.Quaternion.AnyType} Return resultQuat so that\n *     operations can be chained together.\n */\ngoog.vec.Quaternion.invert = function(quat, resultQuat) {\n  var a0 = quat[0], a1 = quat[1], a2 = quat[2], a3 = quat[3];\n  var dot = a0 * a0 + a1 * a1 + a2 * a2 + a3 * a3;\n  var invDot = dot ? 1.0 / dot : 0;\n\n  resultQuat[0] = -a0 * invDot;\n  resultQuat[1] = -a1 * invDot;\n  resultQuat[2] = -a2 * invDot;\n  resultQuat[3] = a3 * invDot;\n  return resultQuat;\n};\n\n\n/**\n * Computes the conjugate of the quaternion in quat, storing the result into\n * resultQuat.\n *\n * If the quaternion is normalized already, this function is faster than\n * goog.Quaternion.inverse and produces the same result.\n *\n * @param {!goog.vec.Quaternion.AnyType} quat The source quaternion.\n * @param {!goog.vec.Quaternion.AnyType} resultQuat The quaternion to\n *     receive the result.\n * @return {!goog.vec.Quaternion.AnyType} Return resultQuat so that\n *     operations can be chained together.\n */\ngoog.vec.Quaternion.conjugate = function(quat, resultQuat) {\n  resultQuat[0] = -quat[0];\n  resultQuat[1] = -quat[1];\n  resultQuat[2] = -quat[2];\n  resultQuat[3] = quat[3];\n  return resultQuat;\n};\n\n\n/**\n * Concatenates the two quaternions storing the result into resultQuat.\n *\n * @param {!goog.vec.Quaternion.AnyType} quat0 The first quaternion.\n * @param {!goog.vec.Quaternion.AnyType} quat1 The second quaternion.\n * @param {!goog.vec.Quaternion.AnyType} resultQuat The quaternion to\n *     receive the result.\n * @return {!goog.vec.Quaternion.AnyType} Return resultQuat so that\n *     operations can be chained together.\n */\ngoog.vec.Quaternion.concat = function(quat0, quat1, resultQuat) {\n  var x0 = quat0[0], y0 = quat0[1], z0 = quat0[2], w0 = quat0[3];\n  var x1 = quat1[0], y1 = quat1[1], z1 = quat1[2], w1 = quat1[3];\n  resultQuat[0] = w0 * x1 + x0 * w1 + y0 * z1 - z0 * y1;\n  resultQuat[1] = w0 * y1 - x0 * z1 + y0 * w1 + z0 * x1;\n  resultQuat[2] = w0 * z1 + x0 * y1 - y0 * x1 + z0 * w1;\n  resultQuat[3] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n  return resultQuat;\n};\n\n\n/**\n * Makes the given quaternion the identity quaternion (0, 0, 0, 1).\n *\n * @param {!goog.vec.Quaternion.AnyType} quat The quaternion.\n * @return {!goog.vec.Quaternion.AnyType} Return quat so that\n *     operations can be chained together.\n */\ngoog.vec.Quaternion.makeIdentity = function(quat) {\n  quat[0] = 0;\n  quat[1] = 0;\n  quat[2] = 0;\n  quat[3] = 1;\n  return quat;\n};\n\n\n/**\n * Generates a unit quaternion from the given angle-axis rotation pair.\n * The rotation axis is not required to be a unit vector, but should\n * have non-zero length.  The angle should be specified in radians.\n *\n * @param {number} angle The angle (in radians) to rotate about the axis.\n * @param {!goog.vec.Quaternion.AnyType} axis Unit vector specifying the\n *     axis of rotation.\n * @param {!goog.vec.Quaternion.AnyType} quat Unit quaternion to store the\n *     result.\n * @return {!goog.vec.Quaternion.AnyType} Return quat so that\n *     operations can be chained together.\n */\ngoog.vec.Quaternion.fromAngleAxis = function(angle, axis, quat) {\n  // Normalize the axis of rotation.\n  goog.vec.Vec3.normalize(axis, axis);\n\n  var halfAngle = 0.5 * angle;\n  var sin = Math.sin(halfAngle);\n  goog.vec.Quaternion.setFromValues(\n      quat, sin * axis[0], sin * axis[1], sin * axis[2], Math.cos(halfAngle));\n\n  // Normalize the resulting quaternion.\n  goog.vec.Quaternion.normalize(quat, quat);\n  return quat;\n};\n\n\n/**\n * Generates an angle-axis rotation pair from a unit quaternion.\n * The quaternion is assumed to be of unit length.  The calculated\n * values are returned via the passed 'axis' object and the 'angle'\n * number returned by the function itself. The returned rotation axis\n * is a non-zero length unit vector, and the returned angle is in\n * radians in the range of [-PI, +PI].\n *\n * @param {!goog.vec.Quaternion.AnyType} quat Unit quaternion to convert.\n * @param {!goog.vec.Quaternion.AnyType} axis Vector to store the returned\n *     rotation axis.\n * @return {number} angle Angle (in radians) to rotate about 'axis'.\n *     The range of the returned angle is [-PI, +PI].\n */\ngoog.vec.Quaternion.toAngleAxis = function(quat, axis) {\n  var angle = 2 * Math.acos(quat[3]);\n  var magnitude = Math.min(Math.max(1 - quat[3] * quat[3], 0), 1);\n  if (magnitude < goog.vec.EPSILON) {\n    // This is nearly an identity rotation, so just use a fixed +X axis.\n    goog.vec.Vec3.setFromValues(axis, 1, 0, 0);\n  } else {\n    // Compute the proper rotation axis.\n    goog.vec.Vec3.setFromValues(axis, quat[0], quat[1], quat[2]);\n    // Make sure the rotation axis is of unit length.\n    goog.vec.Vec3.normalize(axis, axis);\n  }\n  // Adjust the range of the returned angle to [-PI, +PI].\n  if (angle > Math.PI) {\n    angle -= 2 * Math.PI;\n  }\n  return angle;\n};\n\n\n/**\n * Generates the quaternion from the given 3x3 rotation matrix.\n *\n * Perf: http://jsperf.com/conversion-of-3x3-matrix-to-quaternion\n *       http://jsperf.com/goog-vec-fromrotationmatrix3-a\n *\n * @param {!goog.vec.AnyType} matrix The source matrix.\n * @param {!goog.vec.Quaternion.AnyType} quat The resulting quaternion.\n * @return {!goog.vec.Quaternion.AnyType} Return quat so that\n *     operations can be chained together.\n */\ngoog.vec.Quaternion.fromRotationMatrix3 = function(matrix, quat) {\n  // Algorithm in Ken Shoemake's article in 1987 SIGGRAPH course notes\n  // article \"Quaternion Calculus and Fast Animation\".\n  var fTrace = matrix[0] + matrix[4] + matrix[8];\n  var fRoot;\n\n  if (fTrace > 0.0) {\n    // |w| > 1/2, may as well choose w > 1/2\n    fRoot = Math.sqrt(fTrace + 1.0);  // 2w\n    quat[3] = 0.5 * fRoot;\n    fRoot = 0.5 / fRoot;  // 1 / (4w)\n    quat[0] = (matrix[5] - matrix[7]) * fRoot;\n    quat[1] = (matrix[6] - matrix[2]) * fRoot;\n    quat[2] = (matrix[1] - matrix[3]) * fRoot;\n  } else {\n    // |w| <= 1/2\n    var i = 0;\n    if (matrix[4] > matrix[0]) i = 1;\n    if (matrix[8] > matrix[i * 3 + i]) i = 2;\n    var j = (i + 1) % 3;\n    var k = (i + 2) % 3;\n\n    fRoot = Math.sqrt(\n        matrix[i * 3 + i] - matrix[j * 3 + j] - matrix[k * 3 + k] + 1.0);\n    quat[i] = 0.5 * fRoot;\n    fRoot = 0.5 / fRoot;\n    quat[3] = (matrix[j * 3 + k] - matrix[k * 3 + j]) * fRoot;\n    quat[j] = (matrix[j * 3 + i] + matrix[i * 3 + j]) * fRoot;\n    quat[k] = (matrix[k * 3 + i] + matrix[i * 3 + k]) * fRoot;\n\n    // Flip all signs if w is negative.\n    if (quat[3] < 0) {\n      quat[0] = -quat[0];\n      quat[1] = -quat[1];\n      quat[2] = -quat[2];\n      quat[3] = -quat[3];\n    }\n  }\n  return quat;\n};\n\n\n/**\n * Generates the quaternion from the given 4x4 rotation matrix.\n *\n * Perf: http://jsperf.com/goog-vec-fromrotationmatrix4\n *\n * Implementation is the same as fromRotationMatrix3 but using indices from\n * the top left 3x3 in a 4x4 matrix.\n *\n * @param {!goog.vec.AnyType} matrix The source matrix.\n * @param {!goog.vec.Quaternion.AnyType} quat The resulting quaternion.\n * @return {!goog.vec.Quaternion.AnyType} Return quat so that\n *     operations can be chained together.\n */\ngoog.vec.Quaternion.fromRotationMatrix4 = function(matrix, quat) {\n  var fTrace = matrix[0] + matrix[5] + matrix[10];\n  var fRoot;\n\n  if (fTrace > 0.0) {\n    // |w| > 1/2, may as well choose w > 1/2\n    fRoot = Math.sqrt(fTrace + 1.0);  // 2w\n    quat[3] = 0.5 * fRoot;\n    fRoot = 0.5 / fRoot;  // 1 / (4w)\n    quat[0] = (matrix[6] - matrix[9]) * fRoot;\n    quat[1] = (matrix[8] - matrix[2]) * fRoot;\n    quat[2] = (matrix[1] - matrix[4]) * fRoot;\n  } else {\n    // |w| <= 1/2\n    var i = 0;\n    if (matrix[5] > matrix[0]) i = 1;\n    if (matrix[10] > matrix[i * 4 + i]) i = 2;\n    var j = (i + 1) % 3;\n    var k = (i + 2) % 3;\n\n    fRoot = Math.sqrt(\n        matrix[i * 4 + i] - matrix[j * 4 + j] - matrix[k * 4 + k] + 1.0);\n    quat[i] = 0.5 * fRoot;\n    fRoot = 0.5 / fRoot;\n    quat[3] = (matrix[j * 4 + k] - matrix[k * 4 + j]) * fRoot;\n    quat[j] = (matrix[j * 4 + i] + matrix[i * 4 + j]) * fRoot;\n    quat[k] = (matrix[k * 4 + i] + matrix[i * 4 + k]) * fRoot;\n\n    // Flip all signs if w is negative.\n    if (quat[3] < 0) {\n      quat[0] = -quat[0];\n      quat[1] = -quat[1];\n      quat[2] = -quat[2];\n      quat[3] = -quat[3];\n    }\n  }\n  return quat;\n};\n\n\n/**\n * Generates the 3x3 rotation matrix from the given quaternion.\n *\n * @param {!goog.vec.Quaternion.AnyType} quat The source quaternion.\n * @param {!goog.vec.AnyType} matrix The resulting matrix.\n * @return {!goog.vec.AnyType} Return resulting matrix so that\n *     operations can be chained together.\n */\ngoog.vec.Quaternion.toRotationMatrix3 = function(quat, matrix) {\n  var x = quat[0], y = quat[1], z = quat[2], w = quat[3];\n  var x2 = 2 * x, y2 = 2 * y, z2 = 2 * z;\n  var wx = x2 * w;\n  var wy = y2 * w;\n  var wz = z2 * w;\n  var xx = x2 * x;\n  var xy = y2 * x;\n  var xz = z2 * x;\n  var yy = y2 * y;\n  var yz = z2 * y;\n  var zz = z2 * z;\n\n  matrix[0] = 1 - (yy + zz);\n  matrix[1] = xy + wz;\n  matrix[2] = xz - wy;\n  matrix[3] = xy - wz;\n  matrix[4] = 1 - (xx + zz);\n  matrix[5] = yz + wx;\n  matrix[6] = xz + wy;\n  matrix[7] = yz - wx;\n  matrix[8] = 1 - (xx + yy);\n  return matrix;\n};\n\n\n/**\n * Generates the 4x4 rotation matrix from the given quaternion.\n *\n * @param {!goog.vec.Quaternion.AnyType} quat The source quaternion.\n * @param {!goog.vec.AnyType} matrix The resulting matrix.\n * @return {!goog.vec.AnyType} Return resulting matrix so that\n *     operations can be chained together.\n */\ngoog.vec.Quaternion.toRotationMatrix4 = function(quat, matrix) {\n  var x = quat[0], y = quat[1], z = quat[2], w = quat[3];\n  var x2 = 2 * x, y2 = 2 * y, z2 = 2 * z;\n  var wx = x2 * w;\n  var wy = y2 * w;\n  var wz = z2 * w;\n  var xx = x2 * x;\n  var xy = y2 * x;\n  var xz = z2 * x;\n  var yy = y2 * y;\n  var yz = z2 * y;\n  var zz = z2 * z;\n\n  matrix[0] = 1 - (yy + zz);\n  matrix[1] = xy + wz;\n  matrix[2] = xz - wy;\n  matrix[3] = 0;\n  matrix[4] = xy - wz;\n  matrix[5] = 1 - (xx + zz);\n  matrix[6] = yz + wx;\n  matrix[7] = 0;\n  matrix[8] = xz + wy;\n  matrix[9] = yz - wx;\n  matrix[10] = 1 - (xx + yy);\n  matrix[11] = 0;\n  matrix[12] = 0;\n  matrix[13] = 0;\n  matrix[14] = 0;\n  matrix[15] = 1;\n  return matrix;\n};\n\n\n/**\n * Rotates a quaternion by the given angle about the X axis.\n *\n * @param {!goog.vec.Quaternion.AnyType} quat The quaternion.\n * @param {number} angle The angle in radians.\n * @param {!goog.vec.Quaternion.AnyType} resultQuat The quaternion to\n *     receive the result.\n * @return {!goog.vec.Quaternion.AnyType} Return resultQuat so that\n *     operations can be chained together.\n */\ngoog.vec.Quaternion.rotateX = function(quat, angle, resultQuat) {\n  angle *= 0.5;\n  var ax = quat[0], ay = quat[1], az = quat[2], aw = quat[3];\n  var bx = Math.sin(angle), bw = Math.cos(angle);\n\n  resultQuat[0] = ax * bw + aw * bx;\n  resultQuat[1] = ay * bw + az * bx;\n  resultQuat[2] = az * bw - ay * bx;\n  resultQuat[3] = aw * bw - ax * bx;\n  return resultQuat;\n};\n\n\n/**\n * Rotates a quaternion by the given angle about the Y axis.\n *\n * @param {!goog.vec.Quaternion.AnyType} quat The quaternion.\n * @param {number} angle The angle in radians.\n * @param {!goog.vec.Quaternion.AnyType} resultQuat The quaternion to\n *     receive the result.\n * @return {!goog.vec.Quaternion.AnyType} Return resultQuat so that\n *     operations can be chained together.\n */\ngoog.vec.Quaternion.rotateY = function(quat, angle, resultQuat) {\n  angle *= 0.5;\n  var ax = quat[0], ay = quat[1], az = quat[2], aw = quat[3];\n  var by = Math.sin(angle), bw = Math.cos(angle);\n\n  resultQuat[0] = ax * bw - az * by;\n  resultQuat[1] = ay * bw + aw * by;\n  resultQuat[2] = az * bw + ax * by;\n  resultQuat[3] = aw * bw - ay * by;\n  return resultQuat;\n};\n\n\n/**\n * Rotates a quaternion by the given angle about the Z axis.\n *\n * @param {!goog.vec.Quaternion.AnyType} quat The quaternion.\n * @param {number} angle The angle in radians.\n * @param {!goog.vec.Quaternion.AnyType} resultQuat The quaternion to\n *     receive the result.\n * @return {!goog.vec.Quaternion.AnyType} Return resultQuat so that\n *     operations can be chained together.\n */\ngoog.vec.Quaternion.rotateZ = function(quat, angle, resultQuat) {\n  angle *= 0.5;\n  var ax = quat[0], ay = quat[1], az = quat[2], aw = quat[3];\n  var bz = Math.sin(angle), bw = Math.cos(angle);\n\n  resultQuat[0] = ax * bw + ay * bz;\n  resultQuat[1] = ay * bw - ax * bz;\n  resultQuat[2] = az * bw + aw * bz;\n  resultQuat[3] = aw * bw - az * bz;\n  return resultQuat;\n};\n\n\n/**\n * Transforms a vec with a quaternion. Works on both vec3s and vec4s.\n *\n * @param {!goog.vec.AnyType} vec The vec to transform.\n * @param {!goog.vec.Quaternion.AnyType} quat The quaternion.\n * @param {!goog.vec.AnyType} resultVec The vec to receive the result.\n * @return {!goog.vec.AnyType} Return resultVec so that operations can be\n *     chained together. Note that the caller is responsible for type-casting.\n */\ngoog.vec.Quaternion.transformVec = function(vec, quat, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2];\n  var qx = quat[0], qy = quat[1], qz = quat[2], qw = quat[3];\n  // Calculate quat * vec.\n  var ix = qw * x + qy * z - qz * y;\n  var iy = qw * y + qz * x - qx * z;\n  var iz = qw * z + qx * y - qy * x;\n  var iw = -qx * x - qy * y - qz * z;\n  // Calculate result * inverse quat.\n  resultVec[0] = ix * qw + iw * -qx + iy * -qz - iz * -qy;\n  resultVec[1] = iy * qw + iw * -qy + iz * -qx - ix * -qz;\n  resultVec[2] = iz * qw + iw * -qz + ix * -qy - iy * -qx;\n  return resultVec;\n};\n\n\n/**\n * Computes the spherical linear interpolated value from the given quaternions\n * q0 and q1 according to the coefficient t. The resulting quaternion is stored\n * in resultQuat.\n *\n * @param {!goog.vec.Quaternion.AnyType} q0 The first quaternion.\n * @param {!goog.vec.Quaternion.AnyType} q1 The second quaternion.\n * @param {number} t The interpolating coefficient.\n * @param {!goog.vec.Quaternion.AnyType} resultQuat The quaternion to\n *     receive the result.\n * @return {!goog.vec.Quaternion.AnyType} Return resultQuat so that\n *     operations can be chained together.\n */\ngoog.vec.Quaternion.slerp = function(q0, q1, t, resultQuat) {\n  // Compute the dot product between q0 and q1 (cos of the angle between q0 and\n  // q1). If it's outside the interval [-1,1], then the arccos is not defined.\n  // The usual reason for this is that q0 and q1 are colinear. In this case\n  // the angle between the two is zero, so just return q1.\n  var cosVal = goog.vec.Quaternion.dot(q0, q1);\n  if (cosVal > 1 || cosVal < -1) {\n    goog.vec.Vec4.setFromArray(resultQuat, q1);\n    return resultQuat;\n  }\n\n  // Quaternions are a double cover on the space of rotations. That is, q and -q\n  // represent the same rotation. Thus we have two possibilities when\n  // interpolating between q0 and q1: going the short way or the long way. We\n  // prefer the short way since that is the likely expectation from users.\n  var factor = 1;\n  if (cosVal < 0) {\n    factor = -1;\n    cosVal = -cosVal;\n  }\n\n  // Compute the angle between q0 and q1. If it's very small, then just return\n  // q1 to avoid a very large denominator below.\n  var angle = Math.acos(cosVal);\n  if (angle <= goog.vec.EPSILON) {\n    goog.vec.Vec4.setFromArray(resultQuat, q1);\n    return resultQuat;\n  }\n\n  // Compute the coefficients and interpolate.\n  var invSinVal = 1 / Math.sin(angle);\n  var c0 = Math.sin((1 - t) * angle) * invSinVal;\n  var c1 = factor * Math.sin(t * angle) * invSinVal;\n\n  resultQuat[0] = q0[0] * c0 + q1[0] * c1;\n  resultQuat[1] = q0[1] * c0 + q1[1] * c1;\n  resultQuat[2] = q0[2] * c0 + q1[2] * c1;\n  resultQuat[3] = q0[3] * c0 + q1[3] * c1;\n  return resultQuat;\n};\n\n\n/**\n * Compute the simple linear interpolation of the two quaternions q0 and q1\n * according to the coefficient t. The resulting quaternion is stored in\n * resultVec.\n *\n * @param {!goog.vec.Quaternion.AnyType} q0 The first quaternion.\n * @param {!goog.vec.Quaternion.AnyType} q1 The second quaternion.\n * @param {number} t The interpolation factor.\n * @param {!goog.vec.Quaternion.AnyType} resultQuat The quaternion to\n *     receive the results (may be q0 or q1).\n */\ngoog.vec.Quaternion.nlerp = goog.vec.Vec4.lerp;\n","^?",1579837703000,"^@",["^A",["~$goog.vec.Vec4","~$goog.vec","~$goog.vec.Vec3","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/quaternion.js"],"^S",["^A",["~$goog.vec.Quaternion.AnyType","~$goog.vec.Quaternion"]],"^1",true,"^2",["^3","^V","^W","^U"]],["^ ","^7",[1579837703000],"^8","goog.color.color.js","^9",["^:","goog/color/color.js"],"^;","goog/color/color.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities related to color and color conversion.\n */\n\ngoog.provide('goog.color');\ngoog.provide('goog.color.Hsl');\ngoog.provide('goog.color.Hsv');\ngoog.provide('goog.color.Rgb');\n\ngoog.require('goog.color.names');\ngoog.require('goog.math');\n\n\n/**\n * RGB color representation. An array containing three elements [r, g, b],\n * each an integer in [0, 255], representing the red, green, and blue components\n * of the color respectively.\n * @typedef {Array<number>}\n */\ngoog.color.Rgb;\n\n\n/**\n * HSV color representation. An array containing three elements [h, s, v]:\n * h (hue) must be an integer in [0, 360], cyclic.\n * s (saturation) must be a number in [0, 1].\n * v (value/brightness) must be an integer in [0, 255].\n * @typedef {Array<number>}\n */\ngoog.color.Hsv;\n\n\n/**\n * HSL color representation. An array containing three elements [h, s, l]:\n * h (hue) must be an integer in [0, 360], cyclic.\n * s (saturation) must be a number in [0, 1].\n * l (lightness) must be a number in [0, 1].\n * @typedef {Array<number>}\n */\ngoog.color.Hsl;\n\n\n/**\n * Parses a color out of a string.\n * @param {string} str Color in some format.\n * @return {{hex: string, type: string}} 'hex' is a string containing a hex\n *     representation of the color, 'type' is a string containing the type\n *     of color format passed in ('hex', 'rgb', 'named').\n */\ngoog.color.parse = function(str) {\n  var result = {};\n  str = String(str);\n\n  var maybeHex = goog.color.prependHashIfNecessaryHelper(str);\n  if (goog.color.isValidHexColor_(maybeHex)) {\n    result.hex = goog.color.normalizeHex(maybeHex);\n    result.type = 'hex';\n    return result;\n  } else {\n    var rgb = goog.color.isValidRgbColor_(str);\n    if (rgb.length) {\n      result.hex = goog.color.rgbArrayToHex(rgb);\n      result.type = 'rgb';\n      return result;\n    } else if (goog.color.names) {\n      var hex = goog.color.names[str.toLowerCase()];\n      if (hex) {\n        result.hex = hex;\n        result.type = 'named';\n        return result;\n      }\n    }\n  }\n  throw Error(str + ' is not a valid color string');\n};\n\n\n/**\n * Determines if the given string can be parsed as a color.\n *     {@see goog.color.parse}.\n * @param {string} str Potential color string.\n * @return {boolean} True if str is in a format that can be parsed to a color.\n */\ngoog.color.isValidColor = function(str) {\n  var maybeHex = goog.color.prependHashIfNecessaryHelper(str);\n  return !!(\n      goog.color.isValidHexColor_(maybeHex) ||\n      goog.color.isValidRgbColor_(str).length ||\n      goog.color.names && goog.color.names[str.toLowerCase()]);\n};\n\n\n/**\n * Parses red, green, blue components out of a valid rgb color string.\n * Throws Error if the color string is invalid.\n * @param {string} str RGB representation of a color.\n *    {@see goog.color.isValidRgbColor_}.\n * @return {!goog.color.Rgb} rgb representation of the color.\n */\ngoog.color.parseRgb = function(str) {\n  var rgb = goog.color.isValidRgbColor_(str);\n  if (!rgb.length) {\n    throw Error(str + ' is not a valid RGB color');\n  }\n  return rgb;\n};\n\n\n/**\n * Converts a hex representation of a color to RGB.\n * @param {string} hexColor Color to convert.\n * @return {string} string of the form 'rgb(R,G,B)' which can be used in\n *    styles.\n */\ngoog.color.hexToRgbStyle = function(hexColor) {\n  return goog.color.rgbStyle_(goog.color.hexToRgb(hexColor));\n};\n\n\n/**\n * Regular expression for extracting the digits in a hex color triplet.\n * @type {!RegExp}\n * @private\n */\ngoog.color.hexTripletRe_ = /#(.)(.)(.)/;\n\n\n/**\n * Normalize an hex representation of a color\n * @param {string} hexColor an hex color string.\n * @return {string} hex color in the format '#rrggbb' with all lowercase\n *     literals.\n */\ngoog.color.normalizeHex = function(hexColor) {\n  if (!goog.color.isValidHexColor_(hexColor)) {\n    throw Error(\"'\" + hexColor + \"' is not a valid hex color\");\n  }\n  if (hexColor.length == 4) {  // of the form #RGB\n    hexColor = hexColor.replace(goog.color.hexTripletRe_, '#$1$1$2$2$3$3');\n  }\n  return hexColor.toLowerCase();\n};\n\n\n/**\n * Converts a hex representation of a color to RGB.\n * @param {string} hexColor Color to convert.\n * @return {!goog.color.Rgb} rgb representation of the color.\n */\ngoog.color.hexToRgb = function(hexColor) {\n  hexColor = goog.color.normalizeHex(hexColor);\n  var rgb = parseInt(hexColor.substr(1), 16);\n  var r = rgb >> 16;\n  var g = (rgb >> 8) & 255;\n  var b = rgb & 255;\n\n  return [r, g, b];\n};\n\n\n/**\n * Converts a color from RGB to hex representation.\n * @param {number} r Amount of red, int between 0 and 255.\n * @param {number} g Amount of green, int between 0 and 255.\n * @param {number} b Amount of blue, int between 0 and 255.\n * @return {string} hex representation of the color.\n */\ngoog.color.rgbToHex = function(r, g, b) {\n  r = Number(r);\n  g = Number(g);\n  b = Number(b);\n  if (r != (r & 255) || g != (g & 255) || b != (b & 255)) {\n    throw Error('\"(' + r + ',' + g + ',' + b + '\") is not a valid RGB color');\n  }\n  var rgb = (r << 16) | (g << 8) | b;\n  if (r < 0x10) {\n    return '#' + (0x1000000 | rgb).toString(16).substr(1);\n  }\n  return '#' + rgb.toString(16);\n};\n\n\n/**\n * Converts a color from RGB to hex representation.\n * @param {goog.color.Rgb} rgb rgb representation of the color.\n * @return {string} hex representation of the color.\n */\ngoog.color.rgbArrayToHex = function(rgb) {\n  return goog.color.rgbToHex(rgb[0], rgb[1], rgb[2]);\n};\n\n\n/**\n * Converts a color from RGB color space to HSL color space.\n * Modified from {@link http://en.wikipedia.org/wiki/HLS_color_space}.\n * @param {number} r Value of red, in [0, 255].\n * @param {number} g Value of green, in [0, 255].\n * @param {number} b Value of blue, in [0, 255].\n * @return {!goog.color.Hsl} hsl representation of the color.\n */\ngoog.color.rgbToHsl = function(r, g, b) {\n  // First must normalize r, g, b to be between 0 and 1.\n  var normR = r / 255;\n  var normG = g / 255;\n  var normB = b / 255;\n  var max = Math.max(normR, normG, normB);\n  var min = Math.min(normR, normG, normB);\n  var h = 0;\n  var s = 0;\n\n  // Luminosity is the average of the max and min rgb color intensities.\n  var l = 0.5 * (max + min);\n\n  // The hue and saturation are dependent on which color intensity is the max.\n  // If max and min are equal, the color is gray and h and s should be 0.\n  if (max != min) {\n    if (max == normR) {\n      h = 60 * (normG - normB) / (max - min);\n    } else if (max == normG) {\n      h = 60 * (normB - normR) / (max - min) + 120;\n    } else if (max == normB) {\n      h = 60 * (normR - normG) / (max - min) + 240;\n    }\n\n    if (0 < l && l <= 0.5) {\n      s = (max - min) / (2 * l);\n    } else {\n      s = (max - min) / (2 - 2 * l);\n    }\n  }\n\n  // Make sure the hue falls between 0 and 360.\n  return [Math.round(h + 360) % 360, s, l];\n};\n\n\n/**\n * Converts a color from RGB color space to HSL color space.\n * @param {goog.color.Rgb} rgb rgb representation of the color.\n * @return {!goog.color.Hsl} hsl representation of the color.\n */\ngoog.color.rgbArrayToHsl = function(rgb) {\n  return goog.color.rgbToHsl(rgb[0], rgb[1], rgb[2]);\n};\n\n\n/**\n * Helper for hslToRgb.\n * @param {number} v1 Helper variable 1.\n * @param {number} v2 Helper variable 2.\n * @param {number} vH Helper variable 3.\n * @return {number} Appropriate RGB value, given the above.\n * @private\n */\ngoog.color.hueToRgb_ = function(v1, v2, vH) {\n  if (vH < 0) {\n    vH += 1;\n  } else if (vH > 1) {\n    vH -= 1;\n  }\n  if ((6 * vH) < 1) {\n    return (v1 + (v2 - v1) * 6 * vH);\n  } else if (2 * vH < 1) {\n    return v2;\n  } else if (3 * vH < 2) {\n    return (v1 + (v2 - v1) * ((2 / 3) - vH) * 6);\n  }\n  return v1;\n};\n\n\n/**\n * Converts a color from HSL color space to RGB color space.\n * Modified from {@link http://www.easyrgb.com/math.html}\n * @param {number} h Hue, in [0, 360].\n * @param {number} s Saturation, in [0, 1].\n * @param {number} l Luminosity, in [0, 1].\n * @return {!goog.color.Rgb} rgb representation of the color.\n */\ngoog.color.hslToRgb = function(h, s, l) {\n  var r = 0;\n  var g = 0;\n  var b = 0;\n  var normH = h / 360;  // normalize h to fall in [0, 1]\n\n  if (s == 0) {\n    r = g = b = l * 255;\n  } else {\n    var temp1 = 0;\n    var temp2 = 0;\n    if (l < 0.5) {\n      temp2 = l * (1 + s);\n    } else {\n      temp2 = l + s - (s * l);\n    }\n    temp1 = 2 * l - temp2;\n    r = 255 * goog.color.hueToRgb_(temp1, temp2, normH + (1 / 3));\n    g = 255 * goog.color.hueToRgb_(temp1, temp2, normH);\n    b = 255 * goog.color.hueToRgb_(temp1, temp2, normH - (1 / 3));\n  }\n\n  return [Math.round(r), Math.round(g), Math.round(b)];\n};\n\n\n/**\n * Converts a color from HSL color space to RGB color space.\n * @param {goog.color.Hsl} hsl hsl representation of the color.\n * @return {!goog.color.Rgb} rgb representation of the color.\n */\ngoog.color.hslArrayToRgb = function(hsl) {\n  return goog.color.hslToRgb(hsl[0], hsl[1], hsl[2]);\n};\n\n\n/**\n * Helper for isValidHexColor_.\n * @type {!RegExp}\n * @private\n */\ngoog.color.validHexColorRe_ = /^#(?:[0-9a-f]{3}){1,2}$/i;\n\n\n/**\n * Checks if a string is a valid hex color.  We expect strings of the format\n * #RRGGBB (ex: #1b3d5f) or #RGB (ex: #3CA == #33CCAA).\n * @param {string} str String to check.\n * @return {boolean} Whether the string is a valid hex color.\n * @private\n */\ngoog.color.isValidHexColor_ = function(str) {\n  return goog.color.validHexColorRe_.test(str);\n};\n\n\n/**\n * Regular expression for matching and capturing RGB style strings. Helper for\n * isValidRgbColor_.\n * @type {!RegExp}\n * @private\n */\ngoog.color.rgbColorRe_ =\n    /^(?:rgb)?\\((0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2}),\\s?(0|[1-9]\\d{0,2})\\)$/i;\n\n\n/**\n * Checks if a string is a valid rgb color.  We expect strings of the format\n * '(r, g, b)', or 'rgb(r, g, b)', where each color component is an int in\n * [0, 255].\n * @param {string} str String to check.\n * @return {!goog.color.Rgb} the rgb representation of the color if it is\n *     a valid color, or the empty array otherwise.\n * @private\n */\ngoog.color.isValidRgbColor_ = function(str) {\n  // Each component is separate (rather than using a repeater) so we can\n  // capture the match. Also, we explicitly set each component to be either 0,\n  // or start with a non-zero, to prevent octal numbers from slipping through.\n  var regExpResultArray = str.match(goog.color.rgbColorRe_);\n  if (regExpResultArray) {\n    var r = Number(regExpResultArray[1]);\n    var g = Number(regExpResultArray[2]);\n    var b = Number(regExpResultArray[3]);\n    if (r >= 0 && r <= 255 && g >= 0 && g <= 255 && b >= 0 && b <= 255) {\n      return [r, g, b];\n    }\n  }\n  return [];\n};\n\n\n/**\n * Takes a hex value and prepends a zero if it's a single digit.\n * Small helper method for use by goog.color and friends.\n * @param {string} hex Hex value to prepend if single digit.\n * @return {string} hex value prepended with zero if it was single digit,\n *     otherwise the same value that was passed in.\n */\ngoog.color.prependZeroIfNecessaryHelper = function(hex) {\n  return hex.length == 1 ? '0' + hex : hex;\n};\n\n\n/**\n * Takes a string a prepends a '#' sign if one doesn't exist.\n * Small helper method for use by goog.color and friends.\n * @param {string} str String to check.\n * @return {string} The value passed in, prepended with a '#' if it didn't\n *     already have one.\n */\ngoog.color.prependHashIfNecessaryHelper = function(str) {\n  return str.charAt(0) == '#' ? str : '#' + str;\n};\n\n\n/**\n * Takes an array of [r, g, b] and converts it into a string appropriate for\n * CSS styles.\n * @param {goog.color.Rgb} rgb rgb representation of the color.\n * @return {string} string of the form 'rgb(r,g,b)'.\n * @private\n */\ngoog.color.rgbStyle_ = function(rgb) {\n  return 'rgb(' + rgb.join(',') + ')';\n};\n\n\n/**\n * Converts an HSV triplet to an RGB array.  V is brightness because b is\n *   reserved for blue in RGB.\n * @param {number} h Hue value in [0, 360].\n * @param {number} s Saturation value in [0, 1].\n * @param {number} brightness brightness in [0, 255].\n * @return {!goog.color.Rgb} rgb representation of the color.\n */\ngoog.color.hsvToRgb = function(h, s, brightness) {\n  var red = 0;\n  var green = 0;\n  var blue = 0;\n  if (s == 0) {\n    red = brightness;\n    green = brightness;\n    blue = brightness;\n  } else {\n    var sextant = Math.floor(h / 60);\n    var remainder = (h / 60) - sextant;\n    var val1 = brightness * (1 - s);\n    var val2 = brightness * (1 - (s * remainder));\n    var val3 = brightness * (1 - (s * (1 - remainder)));\n    switch (sextant) {\n      case 1:\n        red = val2;\n        green = brightness;\n        blue = val1;\n        break;\n      case 2:\n        red = val1;\n        green = brightness;\n        blue = val3;\n        break;\n      case 3:\n        red = val1;\n        green = val2;\n        blue = brightness;\n        break;\n      case 4:\n        red = val3;\n        green = val1;\n        blue = brightness;\n        break;\n      case 5:\n        red = brightness;\n        green = val1;\n        blue = val2;\n        break;\n      case 6:\n      case 0:\n        red = brightness;\n        green = val3;\n        blue = val1;\n        break;\n    }\n  }\n\n  return [Math.round(red), Math.round(green), Math.round(blue)];\n};\n\n\n/**\n * Converts from RGB values to an array of HSV values.\n * @param {number} red Red value in [0, 255].\n * @param {number} green Green value in [0, 255].\n * @param {number} blue Blue value in [0, 255].\n * @return {!goog.color.Hsv} hsv representation of the color.\n */\ngoog.color.rgbToHsv = function(red, green, blue) {\n\n  var max = Math.max(Math.max(red, green), blue);\n  var min = Math.min(Math.min(red, green), blue);\n  var hue;\n  var saturation;\n  var value = max;\n  if (min == max) {\n    hue = 0;\n    saturation = 0;\n  } else {\n    var delta = (max - min);\n    saturation = delta / max;\n\n    if (red == max) {\n      hue = (green - blue) / delta;\n    } else if (green == max) {\n      hue = 2 + ((blue - red) / delta);\n    } else {\n      hue = 4 + ((red - green) / delta);\n    }\n    hue *= 60;\n    if (hue < 0) {\n      hue += 360;\n    }\n    if (hue > 360) {\n      hue -= 360;\n    }\n  }\n\n  return [hue, saturation, value];\n};\n\n\n/**\n * Converts from an array of RGB values to an array of HSV values.\n * @param {goog.color.Rgb} rgb rgb representation of the color.\n * @return {!goog.color.Hsv} hsv representation of the color.\n */\ngoog.color.rgbArrayToHsv = function(rgb) {\n  return goog.color.rgbToHsv(rgb[0], rgb[1], rgb[2]);\n};\n\n\n/**\n * Converts an HSV triplet to an RGB array.\n * @param {goog.color.Hsv} hsv hsv representation of the color.\n * @return {!goog.color.Rgb} rgb representation of the color.\n */\ngoog.color.hsvArrayToRgb = function(hsv) {\n  return goog.color.hsvToRgb(hsv[0], hsv[1], hsv[2]);\n};\n\n\n/**\n * Converts a hex representation of a color to HSL.\n * @param {string} hex Color to convert.\n * @return {!goog.color.Hsl} hsl representation of the color.\n */\ngoog.color.hexToHsl = function(hex) {\n  var rgb = goog.color.hexToRgb(hex);\n  return goog.color.rgbToHsl(rgb[0], rgb[1], rgb[2]);\n};\n\n\n/**\n * Converts from h,s,l values to a hex string\n * @param {number} h Hue, in [0, 360].\n * @param {number} s Saturation, in [0, 1].\n * @param {number} l Luminosity, in [0, 1].\n * @return {string} hex representation of the color.\n */\ngoog.color.hslToHex = function(h, s, l) {\n  return goog.color.rgbArrayToHex(goog.color.hslToRgb(h, s, l));\n};\n\n\n/**\n * Converts from an hsl array to a hex string\n * @param {goog.color.Hsl} hsl hsl representation of the color.\n * @return {string} hex representation of the color.\n */\ngoog.color.hslArrayToHex = function(hsl) {\n  return goog.color.rgbArrayToHex(goog.color.hslToRgb(hsl[0], hsl[1], hsl[2]));\n};\n\n\n/**\n * Converts a hex representation of a color to HSV\n * @param {string} hex Color to convert.\n * @return {!goog.color.Hsv} hsv representation of the color.\n */\ngoog.color.hexToHsv = function(hex) {\n  return goog.color.rgbArrayToHsv(goog.color.hexToRgb(hex));\n};\n\n\n/**\n * Converts from h,s,v values to a hex string\n * @param {number} h Hue, in [0, 360].\n * @param {number} s Saturation, in [0, 1].\n * @param {number} v Value, in [0, 255].\n * @return {string} hex representation of the color.\n */\ngoog.color.hsvToHex = function(h, s, v) {\n  return goog.color.rgbArrayToHex(goog.color.hsvToRgb(h, s, v));\n};\n\n\n/**\n * Converts from an HSV array to a hex string\n * @param {goog.color.Hsv} hsv hsv representation of the color.\n * @return {string} hex representation of the color.\n */\ngoog.color.hsvArrayToHex = function(hsv) {\n  return goog.color.hsvToHex(hsv[0], hsv[1], hsv[2]);\n};\n\n\n/**\n * Calculates the Euclidean distance between two color vectors on an HSL sphere.\n * A demo of the sphere can be found at:\n * http://en.wikipedia.org/wiki/HSL_color_space\n * In short, a vector for color (H, S, L) in this system can be expressed as\n * (S*L'*cos(2*PI*H), S*L'*sin(2*PI*H), L), where L' = abs(L - 0.5), and we\n * simply calculate the 1-2 distance using these coordinates\n * @param {goog.color.Hsl} hsl1 First color in hsl representation.\n * @param {goog.color.Hsl} hsl2 Second color in hsl representation.\n * @return {number} Distance between the two colors, in the range [0, 1].\n */\ngoog.color.hslDistance = function(hsl1, hsl2) {\n  var sl1, sl2;\n  if (hsl1[2] <= 0.5) {\n    sl1 = hsl1[1] * hsl1[2];\n  } else {\n    sl1 = hsl1[1] * (1.0 - hsl1[2]);\n  }\n\n  if (hsl2[2] <= 0.5) {\n    sl2 = hsl2[1] * hsl2[2];\n  } else {\n    sl2 = hsl2[1] * (1.0 - hsl2[2]);\n  }\n\n  var h1 = hsl1[0] / 360.0;\n  var h2 = hsl2[0] / 360.0;\n  var dh = (h1 - h2) * 2.0 * Math.PI;\n  return (hsl1[2] - hsl2[2]) * (hsl1[2] - hsl2[2]) + sl1 * sl1 + sl2 * sl2 -\n      2 * sl1 * sl2 * Math.cos(dh);\n};\n\n\n/**\n * Blend two colors together, using the specified factor to indicate the weight\n * given to the first color\n * @param {goog.color.Rgb} rgb1 First color represented in rgb.\n * @param {goog.color.Rgb} rgb2 Second color represented in rgb.\n * @param {number} factor The weight to be given to rgb1 over rgb2. Values\n *     should be in the range [0, 1]. If less than 0, factor will be set to 0.\n *     If greater than 1, factor will be set to 1.\n * @return {!goog.color.Rgb} Combined color represented in rgb.\n */\ngoog.color.blend = function(rgb1, rgb2, factor) {\n  factor = goog.math.clamp(factor, 0, 1);\n\n  return [\n    Math.round(rgb2[0] + factor * (rgb1[0] - rgb2[0])),\n    Math.round(rgb2[1] + factor * (rgb1[1] - rgb2[1])),\n    Math.round(rgb2[2] + factor * (rgb1[2] - rgb2[2]))\n  ];\n};\n\n\n/**\n * Adds black to the specified color, darkening it\n * @param {goog.color.Rgb} rgb rgb representation of the color.\n * @param {number} factor Number in the range [0, 1]. 0 will do nothing, while\n *     1 will return black. If less than 0, factor will be set to 0. If greater\n *     than 1, factor will be set to 1.\n * @return {!goog.color.Rgb} Combined rgb color.\n */\ngoog.color.darken = function(rgb, factor) {\n  var black = [0, 0, 0];\n  return goog.color.blend(black, rgb, factor);\n};\n\n\n/**\n * Adds white to the specified color, lightening it\n * @param {goog.color.Rgb} rgb rgb representation of the color.\n * @param {number} factor Number in the range [0, 1].  0 will do nothing, while\n *     1 will return white. If less than 0, factor will be set to 0. If greater\n *     than 1, factor will be set to 1.\n * @return {!goog.color.Rgb} Combined rgb color.\n */\ngoog.color.lighten = function(rgb, factor) {\n  var white = [255, 255, 255];\n  return goog.color.blend(white, rgb, factor);\n};\n\n\n/**\n * Find the \"best\" (highest-contrast) of the suggested colors for the prime\n * color. Uses W3C formula for judging readability and visual accessibility:\n * http://www.w3.org/TR/AERT#color-contrast\n * @param {goog.color.Rgb} prime Color represented as a rgb array.\n * @param {Array<goog.color.Rgb>} suggestions Array of colors,\n *     each representing a rgb array.\n * @return {!goog.color.Rgb} Highest-contrast color represented by an array..\n */\ngoog.color.highContrast = function(prime, suggestions) {\n  var suggestionsWithDiff = [];\n  for (var i = 0; i < suggestions.length; i++) {\n    suggestionsWithDiff.push({\n      color: suggestions[i],\n      diff: goog.color.yiqBrightnessDiff_(suggestions[i], prime) +\n          goog.color.colorDiff_(suggestions[i], prime)\n    });\n  }\n  suggestionsWithDiff.sort(function(a, b) { return b.diff - a.diff; });\n  return suggestionsWithDiff[0].color;\n};\n\n\n/**\n * Calculate brightness of a color according to YIQ formula (brightness is Y).\n * More info on YIQ here: http://en.wikipedia.org/wiki/YIQ. Helper method for\n * goog.color.highContrast()\n * @param {goog.color.Rgb} rgb Color represented by a rgb array.\n * @return {number} brightness (Y).\n * @private\n */\ngoog.color.yiqBrightness_ = function(rgb) {\n  return Math.round((rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000);\n};\n\n\n/**\n * Calculate difference in brightness of two colors. Helper method for\n * goog.color.highContrast()\n * @param {goog.color.Rgb} rgb1 Color represented by a rgb array.\n * @param {goog.color.Rgb} rgb2 Color represented by a rgb array.\n * @return {number} Brightness difference.\n * @private\n */\ngoog.color.yiqBrightnessDiff_ = function(rgb1, rgb2) {\n  return Math.abs(\n      goog.color.yiqBrightness_(rgb1) - goog.color.yiqBrightness_(rgb2));\n};\n\n\n/**\n * Calculate color difference between two colors. Helper method for\n * goog.color.highContrast()\n * @param {goog.color.Rgb} rgb1 Color represented by a rgb array.\n * @param {goog.color.Rgb} rgb2 Color represented by a rgb array.\n * @return {number} Color difference.\n * @private\n */\ngoog.color.colorDiff_ = function(rgb1, rgb2) {\n  return Math.abs(rgb1[0] - rgb2[0]) + Math.abs(rgb1[1] - rgb2[1]) +\n      Math.abs(rgb1[2] - rgb2[2]);\n};\n","^?",1579837703000,"^@",["^A",["^3","~$goog.color.names","~$goog.math"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/color/color.js"],"^S",["^A",["~$goog.color","~$goog.color.Hsl","~$goog.color.Hsv","~$goog.color.Rgb"]],"^1",true,"^2",["^3","^Z","^["]],["^ ","^7",[1579837703000],"^8","goog.window.window.js","^9",["^:","goog/window/window.js"],"^;","goog/window/window.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for window manipulation.\n */\n\n\ngoog.provide('goog.window');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.SafeUrl');\ngoog.require('goog.html.uncheckedconversions');\ngoog.require('goog.labs.userAgent.platform');\ngoog.require('goog.string');\ngoog.require('goog.string.Const');\ngoog.require('goog.userAgent');\n\n\n/**\n * Default height for popup windows\n * @type {number}\n */\ngoog.window.DEFAULT_POPUP_HEIGHT = 500;\n\n\n/**\n * Default width for popup windows\n * @type {number}\n */\ngoog.window.DEFAULT_POPUP_WIDTH = 690;\n\n\n/**\n * Default target for popup windows\n * @type {string}\n */\ngoog.window.DEFAULT_POPUP_TARGET = 'google_popup';\n\n\n/**\n * @return {!Window}\n * @suppress {checkTypes}\n * @private\n */\ngoog.window.createFakeWindow_ = function() {\n  return /** @type {!Window} */ ({});\n};\n\n/**\n * Opens a new window.\n *\n * @param {!goog.html.SafeUrl|string|!Object|null} linkRef If an Object with an\n *     'href' attribute (such as HTMLAnchorElement) is passed then the value of\n *     'href' is used, otherwise its toString method is called. Note that if a\n *     string|Object is used, it will be sanitized with SafeUrl.sanitize().\n *\n * @param {?Object=} opt_options supports the following options:\n *  'target': (string) target (window name). If null, linkRef.target will\n *      be used.\n *  'width': (number) window width.\n *  'height': (number) window height.\n *  'top': (number) distance from top of screen\n *  'left': (number) distance from left of screen\n *  'toolbar': (boolean) show toolbar\n *  'scrollbars': (boolean) show scrollbars\n *  'location': (boolean) show location\n *  'statusbar': (boolean) show statusbar\n *  'menubar': (boolean) show menubar\n *  'resizable': (boolean) resizable\n *  'noreferrer': (boolean) whether to attempt to remove the referrer header\n *      from the request headers. Does this by opening a blank window that\n *      then redirects to the target url, so users may see some flickering.\n *  'noopener': (boolean) whether to remove the `opener` property from the\n *      window object of the newly created window. The property contains a\n *      reference to the original window, and can be used to launch a\n *      reverse tabnabbing attack.\n *\n * @param {?Window=} opt_parentWin Parent window that should be used to open the\n *                 new window.\n *\n * @return {?Window} Returns the window object that was opened. This returns\n *                  null if a popup blocker prevented the window from being\n *                  opened. In case when a new window is opened in a different\n *                  browser sandbox (such as iOS standalone mode), the returned\n *                  object is a emulated Window object that functions as if\n *                  a cross-origin window has been opened.\n */\ngoog.window.open = function(linkRef, opt_options, opt_parentWin) {\n  if (!opt_options) {\n    opt_options = {};\n  }\n  var parentWin = opt_parentWin || window;\n\n  /** @type {!goog.html.SafeUrl} */\n  var safeLinkRef;\n\n  if (linkRef instanceof goog.html.SafeUrl) {\n    safeLinkRef = linkRef;\n  } else {\n    // HTMLAnchorElement has a toString() method with the same behavior as\n    // goog.Uri in all browsers except for Safari, which returns\n    // '[object HTMLAnchorElement]'.  We check for the href first, then\n    // assume that it's a goog.Uri or String otherwise.\n    /**\n     * @type {string|!goog.string.TypedString}\n     * @suppress {missingProperties}\n     */\n    var url =\n        typeof linkRef.href != 'undefined' ? linkRef.href : String(linkRef);\n    safeLinkRef = goog.html.SafeUrl.sanitize(url);\n  }\n\n  /** @suppress {missingProperties} loose references to 'target' */\n  /** @suppress {strictMissingProperties} */\n  var target = opt_options.target || linkRef.target;\n\n  var sb = [];\n  for (var option in opt_options) {\n    switch (option) {\n      case 'width':\n      case 'height':\n      case 'top':\n      case 'left':\n        sb.push(option + '=' + opt_options[option]);\n        break;\n      case 'target':\n      case 'noopener':\n      case 'noreferrer':\n        break;\n      default:\n        sb.push(option + '=' + (opt_options[option] ? 1 : 0));\n    }\n  }\n  var optionString = sb.join(',');\n\n  var newWin;\n  if (goog.labs.userAgent.platform.isIos() && parentWin.navigator &&\n      parentWin.navigator['standalone'] && target && target != '_self') {\n    // iOS in standalone mode disregards \"target\" in window.open and always\n    // opens new URL in the same window. The workaround is to create an \"A\"\n    // element and send a click event to it.\n    // Notice that the \"A\" tag does NOT have to be added to the DOM.\n\n    var a = goog.dom.createElement(goog.dom.TagName.A);\n    goog.dom.safe.setAnchorHref(a, safeLinkRef);\n\n    a.setAttribute('target', target);\n    if (opt_options['noreferrer']) {\n      a.setAttribute('rel', 'noreferrer');\n    }\n\n    var click = /** @type {!MouseEvent} */ (document.createEvent('MouseEvent'));\n    click.initMouseEvent(\n        'click',\n        true,  // canBubble\n        true,  // cancelable\n        parentWin,\n        1);  // detail = mousebutton\n    a.dispatchEvent(click);\n    // New window is not available in this case. Instead, a fake Window object\n    // is returned. In particular, it will have window.document undefined. In\n    // general, it will appear to most of clients as a Window for a different\n    // origin. Since iOS standalone web apps are run in their own sandbox, this\n    // is the most appropriate return value.\n    newWin = goog.window.createFakeWindow_();\n  } else if (opt_options['noreferrer']) {\n    // This code used to use meta-refresh to stop the referrer from being\n    // included in the request headers. This was the only cross-browser way\n    // to remove the referrer circa 2009. However, this never worked in Chrome,\n    // and, instead newWin.opener had to be set to null on this browser. This\n    // behavior is slated to be removed in Chrome and should not be relied\n    // upon. Referrer Policy is the only spec'd and supported way of stripping\n    // referrers and works across all current browsers. This is used in\n    // addition to the aforementioned tricks.\n    //\n    // We also set the opener to be set to null in the new window, thus\n    // disallowing the opened window from navigating its opener.\n    //\n    // Detecting user agent and then using a different strategy per browser\n    // would allow the referrer to leak in case of an incorrect/missing user\n    // agent.\n    //\n    // Also note that we can't use goog.dom.safe.openInWindow here, as it\n    // requires a goog.string.Const 'name' parameter, while we're using plain\n    // strings here for target.\n    newWin = parentWin.open('', target, optionString);\n\n    var sanitizedLinkRef = goog.html.SafeUrl.unwrap(safeLinkRef);\n    if (newWin) {\n      if (goog.userAgent.EDGE_OR_IE) {\n        // IE/EDGE can't parse the content attribute if the url contains\n        // a semicolon. We can fix this by adding quotes around the url, but\n        // then we can't parse quotes in the URL correctly. We take a\n        // best-effort approach.\n        //\n        // If the URL has semicolons, wrap it in single quotes to protect\n        // the semicolons.\n        // If the URL has semicolons and single quotes, url-encode the single\n        // quotes as well.\n        //\n        // This is imperfect. Notice that both ' and ; are reserved characters\n        // in URIs, so this could do the wrong thing, but at least it will\n        // do the wrong thing in only rare cases.\n        // ugh.\n        if (goog.string.contains(sanitizedLinkRef, ';')) {\n          sanitizedLinkRef = \"'\" + sanitizedLinkRef.replace(/'/g, '%27') + \"'\";\n        }\n      }\n      newWin.opener = null;\n\n      // TODO(rjamet): Building proper SafeHtml with SafeHtml.createMetaRefresh\n      // pulls in a lot of compiled code, which is composed of various unneeded\n      // goog.html parts such as SafeStyle.create among others. So, for now,\n      // keep the unchecked conversion until we figure out how to make the\n      // dependencies of createSafeHtmlTagSecurityPrivateDoNotAccessOrElse less\n      // heavy.\n      var safeHtml =\n          goog.html.uncheckedconversions\n              .safeHtmlFromStringKnownToSatisfyTypeContract(\n                  goog.string.Const.from(\n                      'b/12014412, meta tag with sanitized URL'),\n                  '<meta name=\"referrer\" content=\"no-referrer\">' +\n                      '<meta http-equiv=\"refresh\" content=\"0; url=' +\n                      goog.string.htmlEscape(sanitizedLinkRef) + '\">');\n\n      // During window loading `newWin.document` may be unset in some browsers.\n      // Storing and checking a reference to the document prevents NPEs.\n      var newDoc = newWin.document;\n      if (newDoc) {\n        goog.dom.safe.documentWrite(newDoc, safeHtml);\n        newDoc.close();\n      }\n    }\n  } else {\n    newWin = parentWin.open(\n        goog.html.SafeUrl.unwrap(safeLinkRef), target, optionString);\n    // Passing in 'noopener' into the 'windowFeatures' param of window.open(...)\n    // will yield a feature-deprived browser. This is an known issue, tracked\n    // here: https://github.com/whatwg/html/issues/1902\n    if (newWin && opt_options['noopener']) {\n      newWin.opener = null;\n    }\n  }\n  // newWin is null if a popup blocker prevented the window open.\n  return newWin;\n};\n\n\n/**\n * Opens a new window without any real content in it.\n *\n * This can be used to get around popup blockers if you need to open a window\n * in response to a user event, but need to do asynchronous work to determine\n * the URL to open, and then set the URL later.\n *\n * Example usage:\n *\n * var newWin = goog.window.openBlank('Loading...');\n * setTimeout(\n *     function() {\n *       newWin.location.href = 'http://www.google.com';\n *     }, 100);\n *\n * @param {string=} opt_message String to show in the new window. This string\n *     will be HTML-escaped to avoid XSS issues.\n * @param {?Object=} opt_options Options to open window with.\n *     {@see goog.window.open for exact option semantics}.\n * @param {?Window=} opt_parentWin Parent window that should be used to open the\n *                 new window.\n * @return {?Window} Returns the window object that was opened. This returns\n *                  null if a popup blocker prevented the window from being\n *                  opened.\n */\ngoog.window.openBlank = function(opt_message, opt_options, opt_parentWin) {\n  // Open up a window with the loading message and nothing else.\n  // This will be interpreted as HTML content type with a missing doctype\n  // and html/body tags, but is otherwise acceptable.\n  //\n  // IMPORTANT: The order of escaping is crucial here in order to avoid XSS.\n  // First, HTML-escaping is needed because the result of the JS expression\n  // is evaluated as HTML. Second, JS-string escaping is needed; this avoids\n  // \\u escaping from inserting HTML tags and \\ from escaping the final \".\n  // Finally, URL percent-encoding is done with encodeURI(); this\n  // avoids percent-encoding from bypassing HTML and JS escaping.\n  //\n  // Note: There are other ways the same result could be achieved but the\n  // current behavior was preserved when this code was refactored to use\n  // SafeUrl, in order to avoid breakage.\n  var loadingMessage;\n  if (!opt_message) {\n    loadingMessage = '';\n  } else {\n    loadingMessage =\n        goog.string.escapeString(goog.string.htmlEscape(opt_message));\n  }\n  var url = goog.html.uncheckedconversions\n                .safeUrlFromStringKnownToSatisfyTypeContract(\n                    goog.string.Const.from(\n                        'b/12014412, encoded string in javascript: URL'),\n                    'javascript:\"' + encodeURI(loadingMessage) + '\"');\n  return /** @type {?Window} */ (\n      goog.window.open(url, opt_options, opt_parentWin));\n};\n\n\n/**\n * Raise a help popup window, defaulting to \"Google standard\" size and name.\n *\n * (If your project is using GXPs, consider using {@link PopUpLink.gxp}.)\n *\n* @param {?goog.html.SafeUrl|string|?Object} linkRef If an Object with an 'href'\n *     attribute (such as HTMLAnchorElement) is passed then the value of 'href'\n *     is used, otherwise  otherwise its toString method is called. Note that\n *     if a string|Object is used, it will be sanitized with SafeUrl.sanitize().\n *\n * @param {?Object=} opt_options Options to open window with.\n *     {@see goog.window.open for exact option semantics}\n *     Additional wrinkles to the options:\n *     - if 'target' field is null, linkRef.target will be used. If *that's*\n *     null, the default is \"google_popup\".\n *     - if 'width' field is not specified, the default is 690.\n *     - if 'height' field is not specified, the default is 500.\n *\n * @return {boolean} true if the window was not popped up, false if it was.\n */\ngoog.window.popup = function(linkRef, opt_options) {\n  if (!opt_options) {\n    opt_options = {};\n  }\n\n  // set default properties\n  opt_options['target'] = opt_options['target'] || linkRef['target'] ||\n      goog.window.DEFAULT_POPUP_TARGET;\n  opt_options['width'] =\n      opt_options['width'] || goog.window.DEFAULT_POPUP_WIDTH;\n  opt_options['height'] =\n      opt_options['height'] || goog.window.DEFAULT_POPUP_HEIGHT;\n\n  var newWin = goog.window.open(linkRef, opt_options);\n  if (!newWin) {\n    return true;\n  }\n  newWin.focus();\n\n  return false;\n};\n","^?",1579837703000,"^@",["^A",["~$goog.dom","~$goog.html.SafeUrl","~$goog.string","^3","~$goog.html.uncheckedconversions","~$goog.userAgent","~$goog.labs.userAgent.platform","~$goog.string.Const","~$goog.dom.safe","^4"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/window/window.js"],"^S",["^A",["~$goog.window"]],"^1",true,"^2",["^3","^14","^4","^1;","^15","^17","^19","^16","^1:","^18"]],["^ ","^7",[1579837703000],"~:goog-module",true,"^8","goog.html.sanitizer.elementweakmap.js","^9",["^:","goog/html/sanitizer/elementweakmap.js"],"^;","goog/html/sanitizer/elementweakmap.js","^<","^=","^>","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @package\n * @supported IE 10+ and other browsers. IE 8 and IE 9 could be supported by\n * by making anti-clobbering support optional.\n */\n\ngoog.module('goog.html.sanitizer.ElementWeakMap');\ngoog.module.declareLegacyNamespace();\n\nvar noclobber = goog.require('goog.html.sanitizer.noclobber');\n\n// We also need to check if WeakMap has been polyfilled, because we want to use\n// ElementWeakMap instead of the polyfill.\n/** @const {boolean} */\nvar NATIVE_WEAKMAP_SUPPORTED = typeof WeakMap != 'undefined' &&\n    WeakMap.toString().indexOf('[native code]') != -1;\n\n/** @const {string} */\nvar DATA_ATTRIBUTE_NAME_PREFIX = 'data-elementweakmap-index-';\n\n// Increased every time a new ElementWeakMap is constructed, to guarantee\n// that each weakmap uses a different attribute name.\nvar weakMapCount = 0;\n\n/**\n * A weakmap-like implementation for browsers that don't support native WeakMap.\n * It uses a data attribute on the key element for O(1) lookups.\n * @template T\n * @constructor\n */\nvar ElementWeakMap = function() {\n  /** @private {!Array<!Element>} */\n  this.keys_ = [];\n\n  /** @private {!Array<!T>} */\n  this.values_ = [];\n\n  /** @private @const {string} */\n  this.dataAttributeName_ = DATA_ATTRIBUTE_NAME_PREFIX + weakMapCount++;\n};\n\n/**\n * Stores a `elementKey` -> `value` mapping.\n * @param {!Element} elementKey\n * @param {!T} value\n * @return {!ElementWeakMap}\n */\nElementWeakMap.prototype.set = function(elementKey, value) {\n  if (noclobber.hasElementAttribute(elementKey, this.dataAttributeName_)) {\n    var itemIndex = parseInt(\n        noclobber.getElementAttribute(elementKey, this.dataAttributeName_), 10);\n    this.values_[itemIndex] = value;\n  } else {\n    var itemIndex = this.values_.push(value) - 1;\n    noclobber.setElementAttribute(\n        elementKey, this.dataAttributeName_, itemIndex.toString());\n    this.keys_.push(elementKey);\n  }\n  return this;\n};\n\n/**\n * Gets the value previously stored for `elementKey`, or undefined if no\n * value was stored for such key.\n * @param {!Element} elementKey\n * @return {!Element|undefined}\n */\nElementWeakMap.prototype.get = function(elementKey) {\n  if (!noclobber.hasElementAttribute(elementKey, this.dataAttributeName_)) {\n    return undefined;\n  }\n  var itemIndex = parseInt(\n      noclobber.getElementAttribute(elementKey, this.dataAttributeName_), 10);\n  return this.values_[itemIndex];\n};\n\n/** Clears the map. */\nElementWeakMap.prototype.clear = function() {\n  this.keys_.forEach(function(el) {\n    noclobber.removeElementAttribute(el, this.dataAttributeName_);\n  }, this);\n  this.keys_ = [];\n  this.values_ = [];\n};\n\n/**\n * Returns either this weakmap adapter or the native weakmap implmentation, if\n * available.\n * @return {!ElementWeakMap|!WeakMap}\n */\nElementWeakMap.newWeakMap = function() {\n  return NATIVE_WEAKMAP_SUPPORTED ? new WeakMap() : new ElementWeakMap();\n};\n\nexports = ElementWeakMap;\n","^?",1579837703000,"^@",["^A",["^3","~$goog.html.sanitizer.noclobber"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/sanitizer/elementweakmap.js"],"^S",["^A",["~$goog.html.sanitizer.ElementWeakMap"]],"^1",true,"^2",["^3","^1>"]],["^ ","^7",[1579837703000],"^8","goog.ui.emoji.popupemojipicker.js","^9",["^:","goog/ui/emoji/popupemojipicker.js"],"^;","goog/ui/emoji/popupemojipicker.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Popup Emoji Picker implementation. This provides a UI widget\n * for choosing an emoji from a grid of possible choices. The widget is a popup,\n * so it is suitable for a toolbar, for instance the TrogEdit toolbar.\n *\n * @see ../demos/popupemojipicker.html for an example of how to instantiate\n * an emoji picker.\n *\n * See goog.ui.emoji.EmojiPicker in emojipicker.js for more details.\n *\n * Based on goog.ui.PopupColorPicker (popupcolorpicker.js).\n *\n * @see ../../demos/popupemojipicker.html\n */\n\ngoog.provide('goog.ui.emoji.PopupEmojiPicker');\n\ngoog.require('goog.events.EventType');\ngoog.require('goog.positioning.AnchoredPosition');\ngoog.require('goog.positioning.Corner');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Popup');\ngoog.require('goog.ui.emoji.EmojiPicker');\n\n\n\n/**\n * Constructs a popup emoji picker widget.\n *\n * @param {string} defaultImgUrl Url of the img that should be used to fill up\n *     the cells in the emoji table, to prevent jittering. Should be the same\n *     size as the emoji.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @extends {goog.ui.Component}\n * @constructor\n * @final\n */\ngoog.ui.emoji.PopupEmojiPicker = function(defaultImgUrl, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  this.emojiPicker_ =\n      new goog.ui.emoji.EmojiPicker(defaultImgUrl, opt_domHelper);\n  this.addChild(this.emojiPicker_);\n\n  this.getHandler().listen(\n      this.emojiPicker_, goog.ui.Component.EventType.ACTION,\n      this.onEmojiPicked_);\n};\ngoog.inherits(goog.ui.emoji.PopupEmojiPicker, goog.ui.Component);\n\n\n/**\n * Instance of an emoji picker control.\n * @type {?goog.ui.emoji.EmojiPicker}\n * @private\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.emojiPicker_ = null;\n\n\n/**\n * Instance of goog.ui.Popup used to manage the behavior of the emoji picker.\n * @type {?goog.ui.Popup}\n * @private\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.popup_ = null;\n\n\n/**\n * Reference to the element that triggered the last popup.\n * @type {?Element}\n * @private\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.lastTarget_ = null;\n\n\n/**\n * Whether the emoji picker can accept focus.\n * @type {boolean}\n * @private\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.focusable_ = true;\n\n\n/**\n * If true, then the emojipicker will toggle off if it is already visible.\n * Default is true.\n * @type {boolean}\n * @private\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.toggleMode_ = true;\n\n\n/**\n * Adds a group of emoji to the picker.\n *\n * @param {string|Element} title Title for the group.\n * @param {Array<Array<?>>} emojiGroup A new group of emoji to be added. Each\n *    internal array contains [emojiUrl, emojiId].\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.addEmojiGroup = function(\n    title, emojiGroup) {\n  this.emojiPicker_.addEmojiGroup(title, emojiGroup);\n};\n\n\n/**\n * Sets whether the emoji picker should toggle if it is already open.\n * @param {boolean} toggle The toggle mode to use.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.setToggleMode = function(toggle) {\n  this.toggleMode_ = toggle;\n};\n\n\n/**\n * Gets whether the emojipicker is in toggle mode\n * @return {boolean} toggle.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.getToggleMode = function() {\n  return this.toggleMode_;\n};\n\n\n/**\n * Sets whether loading of images should be delayed until after dom creation.\n * Thus, this function must be called before {@link #createDom}. If set to true,\n * the client must call {@link #loadImages} when they wish the images to be\n * loaded.\n *\n * @param {boolean} shouldDelay Whether to delay loading the images.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.setDelayedLoad = function(\n    shouldDelay) {\n  if (this.emojiPicker_) {\n    this.emojiPicker_.setDelayedLoad(shouldDelay);\n  }\n};\n\n\n/**\n * Sets whether the emoji picker can accept focus.\n * @param {boolean} focusable Whether the emoji picker should accept focus.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.setFocusable = function(focusable) {\n  this.focusable_ = focusable;\n  if (this.emojiPicker_) {\n    // TODO(user): In next revision sort the behavior of passing state to\n    // children correctly\n    this.emojiPicker_.setFocusable(focusable);\n  }\n};\n\n\n/**\n * Sets the URL prefix for the emoji URLs.\n *\n * @param {string} urlPrefix Prefix that should be prepended to all URLs.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.setUrlPrefix = function(urlPrefix) {\n  this.emojiPicker_.setUrlPrefix(urlPrefix);\n};\n\n\n/**\n * Sets the location of the tabs in relation to the emoji grids. This should\n * only be called before the picker has been rendered.\n *\n * @param {goog.ui.TabPane.TabLocation} tabLocation The location of the tabs.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.setTabLocation = function(\n    tabLocation) {\n  this.emojiPicker_.setTabLocation(tabLocation);\n};\n\n\n/**\n * Sets the number of rows per grid in the emoji picker. This should only be\n * called before the picker has been rendered.\n *\n * @param {number} numRows Number of rows per grid.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.setNumRows = function(numRows) {\n  this.emojiPicker_.setNumRows(numRows);\n};\n\n\n/**\n * Sets the number of columns per grid in the emoji picker. This should only be\n * called before the picker has been rendered.\n *\n * @param {number} numCols Number of columns per grid.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.setNumColumns = function(numCols) {\n  this.emojiPicker_.setNumColumns(numCols);\n};\n\n\n/**\n * Sets the progressive rendering aspect of this emojipicker. Must be called\n * before createDom to have an effect.\n *\n * @param {boolean} progressive Whether the picker should render progressively.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.setProgressiveRender = function(\n    progressive) {\n  if (this.emojiPicker_) {\n    this.emojiPicker_.setProgressiveRender(progressive);\n  }\n};\n\n\n/**\n * Returns the number of emoji groups in this picker.\n *\n * @return {number} The number of emoji groups in this picker.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.getNumEmojiGroups = function() {\n  return this.emojiPicker_.getNumEmojiGroups();\n};\n\n\n/**\n * Causes the emoji imgs to be loaded into the picker. Used for delayed loading.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.loadImages = function() {\n  if (this.emojiPicker_) {\n    this.emojiPicker_.loadImages();\n  }\n};\n\n\n/** @override */\ngoog.ui.emoji.PopupEmojiPicker.prototype.createDom = function() {\n  goog.ui.emoji.PopupEmojiPicker.superClass_.createDom.call(this);\n\n  this.emojiPicker_.createDom();\n\n  this.getElement().className = goog.getCssName('goog-ui-popupemojipicker');\n  this.getElement().appendChild(this.emojiPicker_.getElement());\n\n  this.popup_ = new goog.ui.Popup(this.getElement());\n  this.getElement().unselectable = 'on';\n};\n\n\n/** @override */\ngoog.ui.emoji.PopupEmojiPicker.prototype.disposeInternal = function() {\n  goog.ui.emoji.PopupEmojiPicker.superClass_.disposeInternal.call(this);\n  this.emojiPicker_ = null;\n  this.lastTarget_ = null;\n  if (this.popup_) {\n    this.popup_.dispose();\n    this.popup_ = null;\n  }\n};\n\n\n/**\n * Attaches the popup emoji picker to an element.\n *\n * @param {Element} element The element to attach to.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.attach = function(element) {\n  // TODO(user): standardize event type, popups should use MOUSEDOWN, but\n  // currently apps are using click.\n  this.getHandler().listen(element, goog.events.EventType.CLICK, this.show_);\n};\n\n\n/**\n * Detatches the popup emoji picker from an element.\n *\n * @param {Element} element The element to detach from.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.detach = function(element) {\n  this.getHandler().unlisten(element, goog.events.EventType.CLICK, this.show_);\n};\n\n\n/**\n * @return {goog.ui.emoji.EmojiPicker} The emoji picker instance.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.getEmojiPicker = function() {\n  return this.emojiPicker_;\n};\n\n\n/**\n * Returns whether the Popup dismisses itself when the user clicks outside of\n * it.\n * @return {boolean} Whether the Popup autohides on an external click.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.getAutoHide = function() {\n  return !!this.popup_ && this.popup_.getAutoHide();\n};\n\n\n/**\n * Sets whether the Popup dismisses itself when the user clicks outside of it -\n * must be called after the Popup has been created (in createDom()),\n * otherwise it does nothing.\n *\n * @param {boolean} autoHide Whether to autohide on an external click.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.setAutoHide = function(autoHide) {\n  if (this.popup_) {\n    this.popup_.setAutoHide(autoHide);\n  }\n};\n\n\n/**\n * Returns the region inside which the Popup dismisses itself when the user\n * clicks, or null if it was not set. Null indicates the entire document is\n * the autohide region.\n * @return {Element} The DOM element for autohide, or null if it hasn't been\n *     set.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.getAutoHideRegion = function() {\n  return this.popup_ && this.popup_.getAutoHideRegion();\n};\n\n\n/**\n * Sets the region inside which the Popup dismisses itself when the user\n * clicks - must be called after the Popup has been created (in createDom()),\n * otherwise it does nothing.\n *\n * @param {Element} element The DOM element for autohide.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.setAutoHideRegion = function(element) {\n  if (this.popup_) {\n    this.popup_.setAutoHideRegion(element);\n  }\n};\n\n\n/**\n * Returns the {@link goog.ui.PopupBase} from this picker. Returns null if the\n * popup has not yet been created.\n *\n * NOTE: This should *ONLY* be called from tests. If called before createDom(),\n * this should return null.\n *\n * @return {goog.ui.PopupBase?} The popup, or null if it hasn't been created.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.getPopup = function() {\n  return this.popup_;\n};\n\n\n/**\n * @return {Element} The last element that triggered the popup.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.getLastTarget = function() {\n  return this.lastTarget_;\n};\n\n\n/**\n * @return {goog.ui.emoji.Emoji} The currently selected emoji.\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.getSelectedEmoji = function() {\n  return this.emojiPicker_.getSelectedEmoji();\n};\n\n\n/**\n * Handles click events on the element this picker is attached to and shows the\n * emoji picker in a popup.\n *\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.show_ = function(e) {\n  if (this.popup_.isOrWasRecentlyVisible() && this.toggleMode_ &&\n      this.lastTarget_ == e.currentTarget) {\n    this.popup_.setVisible(false);\n    return;\n  }\n\n  this.lastTarget_ = /** @type {Element} */ (e.currentTarget);\n  this.popup_.setPosition(\n      new goog.positioning.AnchoredPosition(\n          this.lastTarget_, goog.positioning.Corner.BOTTOM_LEFT));\n  this.popup_.setVisible(true);\n};\n\n\n/**\n * Handles selection of an emoji.\n *\n * @param {goog.events.Event} e The event object.\n * @private\n */\ngoog.ui.emoji.PopupEmojiPicker.prototype.onEmojiPicked_ = function(e) {\n  this.popup_.setVisible(false);\n};\n","^?",1579837703000,"^@",["^A",["~$goog.positioning.Corner","~$goog.positioning.AnchoredPosition","~$goog.ui.Component","^3","~$goog.events.EventType","~$goog.ui.emoji.EmojiPicker","~$goog.ui.Popup"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/emoji/popupemojipicker.js"],"^S",["^A",["~$goog.ui.emoji.PopupEmojiPicker"]],"^1",true,"^2",["^3","^1C","^1A","^1@","^1B","^1E","^1D"]],["^ ","^7",[1579837703000],"^1=",true,"^8","goog.test_module_dep.js","^9",["^:","goog/test_module_dep.js"],"^;","goog/test_module_dep.js","^<","^=","^>","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A test file for testing goog.module.\n */\n\ngoog.module('goog.test_module_dep');\ngoog.setTestOnly('goog.test_module');\n\n/** @type {number} */\nexports.someValue = 1;\n\n/** @type {function()} */\nexports.someFunction = function() {};\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/test_module_dep.js"],"^S",["^A",["~$goog.test_module_dep","~$goog.test-module-dep"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.net.httpstatusname.js","^9",["^:","goog/net/httpstatusname.js"],"^;","goog/net/httpstatusname.js","^<","^=","^>","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Names for HTTP status codes\n */\n\ngoog.provide('goog.net.HttpStatusName');\n\n\n/**\n * HTTP Status Code Names defined in RFC 2616, RFC 6585, and RFC 4918.\n * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html\n * @see http://tools.ietf.org/html/rfc6585\n * @see https://tools.ietf.org/html/rfc4918\n * @type {!Object<number, string>}\n */\ngoog.net.HttpStatusName = {\n  // Informational 1xx\n  100: 'Continue',\n  101: 'Switching Protocols',\n\n  // Successful 2xx\n  200: 'OK',\n  201: 'Created',\n  202: 'Accepted',\n  203: 'Non-Authoritative Information',\n  204: 'No Content',\n  205: 'Reset Content',\n  206: 'Partial Content',\n  207: 'Multi-Status',\n\n  // Redirection 3xx\n  300: 'Multiple Choices',\n  301: 'Moved Permanently',\n  302: 'Found',\n  303: 'See Other',\n  304: 'Not Modified',\n  305: 'Use Proxy',\n  307: 'Temporary Redirect',\n\n  // Client Error 4xx\n  400: 'Bad Request',\n  401: 'Unauthorized',\n  402: 'Payment Required',\n  403: 'Forbidden',\n  404: 'Not Found',\n  405: 'Method Not Allowed',\n  406: 'Not Acceptable',\n  407: 'Proxy Authentication Required',\n  408: 'Request Timeout',\n  409: 'Conflict',\n  410: 'Gone',\n  411: 'Length Required',\n  412: 'Precondition Failed',\n  413: 'Request Entity Too Large',\n  414: 'Request-URI Too Long',\n  415: 'Unsupported Media Type',\n  416: 'Requested Range Not Satisfiable',\n  417: 'Expectation Failed',\n  422: 'Unprocessable Entity',\n  423: 'Locked',\n  424: 'Failed Dependency',\n  428: 'Precondition Required',\n  429: 'Too Many Requests',\n  431: 'Request Header Fields Too Large',\n\n  // Server Error 5xx\n  500: 'Internal Server Error',\n  501: 'Not Implemented',\n  502: 'Bad Gateway',\n  503: 'Service Unavailable',\n  504: 'Gateway Timeout',\n  505: 'HTTP Version Not Supported',\n  507: 'Insufficient Storage',\n  511: 'Network Authentication Required'\n};\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/httpstatusname.js"],"^S",["^A",["~$goog.net.HttpStatusName"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.graphics.element.js","^9",["^:","goog/graphics/element.js"],"^;","goog/graphics/element.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A thin wrapper around the DOM element returned from\n * the different draw methods of the graphics implementation, and\n * all interfaces that the various element types support.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.graphics.Element');\n\ngoog.require('goog.asserts');\ngoog.require('goog.events');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.Listenable');\ngoog.require('goog.graphics.AffineTransform');\ngoog.require('goog.math');\n\n\n\n/**\n * Base class for a thin wrapper around the DOM element returned from\n * the different draw methods of the graphics.\n * You should not construct objects from this constructor. The graphics\n * will return the object for you.\n * @param {Element} element  The DOM element to wrap.\n * @param {goog.graphics.AbstractGraphics} graphics  The graphics creating\n *     this element.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n */\ngoog.graphics.Element = function(element, graphics) {\n  goog.events.EventTarget.call(this);\n  this.element_ = element;\n  this.graphics_ = graphics;\n  // Overloading EventTarget field to state that this is not a custom event.\n  // TODO(user) Should be handled in EventTarget.js (see bug 846824).\n  this[goog.events.Listenable.IMPLEMENTED_BY_PROP] = false;\n};\ngoog.inherits(goog.graphics.Element, goog.events.EventTarget);\n\n\n/**\n * The graphics object that contains this element.\n * @type {goog.graphics.AbstractGraphics?}\n * @private\n */\ngoog.graphics.Element.prototype.graphics_ = null;\n\n\n/**\n * The native browser element this class wraps.\n * @type {?Element}\n * @private\n */\ngoog.graphics.Element.prototype.element_ = null;\n\n\n/**\n * The transformation applied to this element.\n * @type {goog.graphics.AffineTransform?}\n * @private\n */\ngoog.graphics.Element.prototype.transform_ = null;\n\n\n/**\n * Returns the underlying object.\n * @return {Element} The underlying element.\n */\ngoog.graphics.Element.prototype.getElement = function() {\n  return this.element_;\n};\n\n\n/**\n * Returns the graphics.\n * @return {goog.graphics.AbstractGraphics} The graphics that created the\n *     element.\n */\ngoog.graphics.Element.prototype.getGraphics = function() {\n  return this.graphics_;\n};\n\n\n/**\n * Set the translation and rotation of the element.\n *\n * If a more general affine transform is needed than this provides\n * (e.g. skew and scale) then use setTransform.\n * @param {number} x The x coordinate of the translation transform.\n * @param {number} y The y coordinate of the translation transform.\n * @param {number} rotate The angle of the rotation transform.\n * @param {number} centerX The horizontal center of the rotation transform.\n * @param {number} centerY The vertical center of the rotation transform.\n */\ngoog.graphics.Element.prototype.setTransformation = function(\n    x, y, rotate, centerX, centerY) {\n  this.transform_ =\n      goog.graphics.AffineTransform\n          .getRotateInstance(goog.math.toRadians(rotate), centerX, centerY)\n          .translate(x, y);\n  this.getGraphics().setElementTransform(this, x, y, rotate, centerX, centerY);\n};\n\n\n/**\n * @return {!goog.graphics.AffineTransform} The transformation applied to\n *     this element.\n */\ngoog.graphics.Element.prototype.getTransform = function() {\n  return this.transform_ ? this.transform_.clone() :\n                           new goog.graphics.AffineTransform();\n};\n\n\n/**\n * Set the affine transform of the element.\n * @param {!goog.graphics.AffineTransform} affineTransform The\n *     transformation applied to this element.\n */\ngoog.graphics.Element.prototype.setTransform = function(affineTransform) {\n  this.transform_ = affineTransform.clone();\n  this.getGraphics().setElementAffineTransform(this, affineTransform);\n};\n\n\n/** @override */\ngoog.graphics.Element.prototype.addEventListener = function(\n    type, handler, opt_capture, opt_handlerScope) {\n  goog.events.listen(\n      this.element_, type, handler, opt_capture, opt_handlerScope);\n};\n\n\n/** @override */\ngoog.graphics.Element.prototype.removeEventListener = function(\n    type, handler, opt_capture, opt_handlerScope) {\n  goog.events.unlisten(\n      this.element_, type, handler, opt_capture, opt_handlerScope);\n};\n\n\n/** @override */\ngoog.graphics.Element.prototype.disposeInternal = function() {\n  goog.graphics.Element.superClass_.disposeInternal.call(this);\n  goog.asserts.assert(this.element_);\n  goog.events.removeAll(this.element_);\n};\n","^?",1579837703000,"^@",["^A",["~$goog.asserts","~$goog.graphics.AffineTransform","~$goog.events.Listenable","^3","~$goog.events.EventTarget","^[","~$goog.events"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/element.js"],"^S",["^A",["~$goog.graphics.Element"]],"^1",true,"^2",["^3","^1J","^1N","^1M","^1L","^1K","^["]],["^ ","^7",[1579837703000],"^8","goog.storage.mechanism.mechanismtestdefinition.js","^9",["^:","goog/storage/mechanism/mechanismtestdefinition.js"],"^;","goog/storage/mechanism/mechanismtestdefinition.js","^<","^=","^>","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview This shim namespace defines the shared\n * mechanism variables used in mechanismSeparationTester\n * and mechanismSelectionTester. This exists to allow test compilation\n * to work correctly for these legacy tests.\n */\n\ngoog.provide('goog.storage.mechanism.mechanismTestDefinition');\ngoog.setTestOnly('goog.storage.mechanism.mechanismTestDefinition');\n\nvar mechanism;\nvar mechanism_shared;\nvar mechanism_separate;\nvar minimumQuota;\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/mechanism/mechanismtestdefinition.js"],"^S",["^A",["~$goog.storage.mechanism.mechanismTestDefinition"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.testing.loosemock.js","^9",["^:","goog/testing/loosemock.js"],"^;","goog/testing/loosemock.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This file defines a loose mock implementation.\n */\n\ngoog.setTestOnly('goog.testing.LooseExpectationCollection');\ngoog.provide('goog.testing.LooseExpectationCollection');\ngoog.provide('goog.testing.LooseMock');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.structs.Map');\ngoog.require('goog.structs.Set');\ngoog.require('goog.testing.Mock');\n\n\n\n/**\n * This class is an ordered collection of expectations for one method. Since\n * the loose mock does most of its verification at the time of $verify, this\n * class is necessary to manage the return/throw behavior when the mock is\n * being called.\n * @constructor\n * @final\n */\ngoog.testing.LooseExpectationCollection = function() {\n  /**\n   * The list of expectations. All of these should have the same name.\n   * @type {!Array<!goog.testing.MockExpectation>}\n   * @private\n   */\n  this.expectations_ = [];\n};\n\n\n/**\n * Adds an expectation to this collection.\n * @param {!goog.testing.MockExpectation} expectation The expectation to add.\n */\ngoog.testing.LooseExpectationCollection.prototype.addExpectation = function(\n    expectation) {\n  this.expectations_.push(expectation);\n};\n\n\n/**\n * Gets the list of expectations in this collection.\n * @return {!Array<!goog.testing.MockExpectation>} The array of expectations.\n */\ngoog.testing.LooseExpectationCollection.prototype.getExpectations = function() {\n  return this.expectations_;\n};\n\n\n\n/**\n * This is a mock that does not care about the order of method calls. As a\n * result, it won't throw exceptions until verify() is called. The only\n * exception is that if a method is called that has no expectations, then an\n * exception will be thrown.\n * @param {Object|Function} objectToMock The object that should be mocked, or\n *    the constructor of an object to mock.\n * @param {boolean=} opt_ignoreUnexpectedCalls Whether to ignore unexpected\n *     calls.\n * @param {boolean=} opt_mockStaticMethods An optional argument denoting that\n *     a mock should be constructed from the static functions of a class.\n * @param {boolean=} opt_createProxy An optional argument denoting that\n *     a proxy for the target mock should be created.\n * @constructor\n * @extends {goog.testing.Mock}\n */\ngoog.testing.LooseMock = function(\n    objectToMock, opt_ignoreUnexpectedCalls, opt_mockStaticMethods,\n    opt_createProxy) {\n  goog.testing.Mock.call(\n      this, objectToMock, opt_mockStaticMethods, opt_createProxy);\n\n  /**\n   * A map of method names to a LooseExpectationCollection for that method.\n   * @type {!goog.structs.Map<string, !goog.testing.LooseExpectationCollection>}\n   * @private\n   */\n  this.$expectations_ = new goog.structs.Map();\n\n  /** @private {!goog.structs.Set<!goog.testing.MockExpectation>} */\n  this.awaitingExpectations_ = new goog.structs.Set();\n\n  /**\n   * The calls that have been made; we cache them to verify at the end. Each\n   * element is an array where the first element is the name, and the second\n   * element is the arguments.\n   * @type {Array<Array<*>>}\n   * @private\n   */\n  this.$calls_ = [];\n\n  /**\n   * Whether to ignore unexpected calls.\n   * @type {boolean}\n   * @private\n   */\n  this.$ignoreUnexpectedCalls_ = !!opt_ignoreUnexpectedCalls;\n};\ngoog.inherits(goog.testing.LooseMock, goog.testing.Mock);\n\n\n/**\n * A setter for the ignoreUnexpectedCalls field.\n * @param {boolean} ignoreUnexpectedCalls Whether to ignore unexpected calls.\n * @return {!goog.testing.LooseMock} This mock object.\n */\ngoog.testing.LooseMock.prototype.$setIgnoreUnexpectedCalls = function(\n    ignoreUnexpectedCalls) {\n  this.$ignoreUnexpectedCalls_ = ignoreUnexpectedCalls;\n  return this;\n};\n\n\n/** @override */\ngoog.testing.LooseMock.prototype.$recordExpectation = function() {\n  if (!this.$expectations_.containsKey(this.$pendingExpectation.name)) {\n    this.$expectations_.set(\n        this.$pendingExpectation.name,\n        new goog.testing.LooseExpectationCollection());\n  }\n\n  var collection = this.$expectations_.get(this.$pendingExpectation.name);\n  collection.addExpectation(this.$pendingExpectation);\n  if (this.$pendingExpectation) {\n    this.awaitingExpectations_.add(this.$pendingExpectation);\n  }\n};\n\n\n/** @override */\ngoog.testing.LooseMock.prototype.$recordCall = function(name, args) {\n  if (!this.$expectations_.containsKey(name)) {\n    if (this.$ignoreUnexpectedCalls_) {\n      return;\n    }\n    this.$throwCallException(name, args);\n  }\n\n  // Start from the beginning of the expectations for this name,\n  // and iterate over them until we find an expectation that matches\n  // and also has calls remaining.\n  var collection = this.$expectations_.get(name);\n  var matchingExpectation = null;\n  var expectations = collection.getExpectations();\n  for (var i = 0; i < expectations.length; i++) {\n    var expectation = expectations[i];\n    if (this.$verifyCall(expectation, name, args)) {\n      matchingExpectation = expectation;\n      if (expectation.actualCalls < expectation.maxCalls) {\n        break;\n      }  // else continue and see if we can find something that does match\n    }\n  }\n  if (matchingExpectation == null) {\n    this.$throwCallException(name, args, expectation);\n  }\n\n  matchingExpectation.actualCalls++;\n  if (matchingExpectation.actualCalls > matchingExpectation.maxCalls) {\n    this.$throwException(\n        'Too many calls to ' + matchingExpectation.name + '\\nExpected: ' +\n        matchingExpectation.maxCalls + ' but was: ' +\n        matchingExpectation.actualCalls);\n  }\n  if (matchingExpectation.actualCalls >= matchingExpectation.minCalls) {\n    this.awaitingExpectations_.remove(matchingExpectation);\n    this.maybeFinishedWithExpectations_();\n  }\n\n  this.$calls_.push([name, args]);\n  return this.$do(matchingExpectation, args);\n};\n\n\n/** @override */\ngoog.testing.LooseMock.prototype.$reset = function() {\n  goog.testing.LooseMock.superClass_.$reset.call(this);\n\n  this.$expectations_ = new goog.structs.Map();\n  this.awaitingExpectations_ = new goog.structs.Set();\n  this.$calls_ = [];\n};\n\n\n/** @override */\ngoog.testing.LooseMock.prototype.$replay = function() {\n  goog.testing.LooseMock.superClass_.$replay.call(this);\n\n  // Verify that there are no expectations that can never be reached.\n  // This can't catch every situation, but it is a decent sanity check\n  // and it's similar to the behavior of EasyMock in java.\n  var collections = this.$expectations_.getValues();\n  for (var i = 0; i < collections.length; i++) {\n    var expectations = collections[i].getExpectations();\n    for (var j = 0; j < expectations.length; j++) {\n      var expectation = expectations[j];\n      // If this expectation can be called infinite times, then\n      // check if any subsequent expectation has the exact same\n      // argument list.\n      if (!isFinite(expectation.maxCalls)) {\n        for (var k = j + 1; k < expectations.length; k++) {\n          var laterExpectation = expectations[k];\n          if (laterExpectation.minCalls > 0 &&\n              goog.array.equals(\n                  expectation.argumentList, laterExpectation.argumentList)) {\n            var name = expectation.name;\n            var argsString = this.$argumentsAsString(expectation.argumentList);\n            this.$throwException([\n              'Expected call to ', name, ' with arguments ', argsString,\n              ' has an infinite max number of calls; can\\'t expect an',\n              ' identical call later with a positive min number of calls'\n            ].join(''));\n          }\n        }\n      }\n    }\n  }\n};\n\n\n/** @override */\ngoog.testing.LooseMock.prototype.$waitAndVerify = function() {\n  var keys = this.$expectations_.getKeys();\n  for (var i = 0; i < keys.length; i++) {\n    var expectations = this.$expectations_.get(keys[i]).getExpectations();\n    for (var j = 0; j < expectations.length; j++) {\n      var expectation = expectations[j];\n      goog.asserts.assert(\n          !isFinite(expectation.maxCalls) ||\n              expectation.minCalls == expectation.maxCalls,\n          'Mock expectations cannot have a loose number of expected calls to ' +\n              'use $waitAndVerify.');\n    }\n  }\n  var promise = goog.testing.LooseMock.base(this, '$waitAndVerify');\n  this.maybeFinishedWithExpectations_();\n  return promise;\n};\n\n/**\n * @private\n */\ngoog.testing.LooseMock.prototype.maybeFinishedWithExpectations_ = function() {\n  var unresolvedExpectations = goog.array.some(\n      this.$expectations_.getValues(), function(expectationCollection) {\n        return goog.array.some(\n            expectationCollection.getExpectations(), function(expectation) {\n              return expectation.actualCalls < expectation.minCalls;\n            });\n      });\n  if (this.waitingForExpectations && !unresolvedExpectations) {\n    this.waitingForExpectations.resolve();\n  }\n};\n\n/** @override */\ngoog.testing.LooseMock.prototype.$verify = function() {\n  goog.testing.LooseMock.superClass_.$verify.call(this);\n  var collections = this.$expectations_.getValues();\n\n  for (var i = 0; i < collections.length; i++) {\n    var expectations = collections[i].getExpectations();\n    for (var j = 0; j < expectations.length; j++) {\n      var expectation = expectations[j];\n      if (expectation.actualCalls > expectation.maxCalls) {\n        this.$throwException(\n            'Too many calls to ' + expectation.name + '\\nExpected: ' +\n            expectation.maxCalls + ' but was: ' + expectation.actualCalls);\n      } else if (expectation.actualCalls < expectation.minCalls) {\n        this.$throwException(\n            'Not enough calls to ' + expectation.name + '\\nExpected: ' +\n            expectation.minCalls + ' but was: ' + expectation.actualCalls);\n      }\n    }\n  }\n};\n","^?",1579837703000,"^@",["^A",["^1J","~$goog.structs.Map","^3","~$goog.testing.Mock","~$goog.array","~$goog.structs.Set"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/loosemock.js"],"^S",["^A",["~$goog.testing.LooseExpectationCollection","~$goog.testing.LooseMock"]],"^1",true,"^2",["^3","^1S","^1J","^1Q","^1T","^1R"]],["^ ","^7",[1579837703000],"^8","goog.storage.mechanism.iterablemechanism.js","^9",["^:","goog/storage/mechanism/iterablemechanism.js"],"^;","goog/storage/mechanism/iterablemechanism.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Interface for storing, retieving and scanning data using some\n * persistence mechanism.\n *\n */\n\ngoog.provide('goog.storage.mechanism.IterableMechanism');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.iter');\ngoog.require('goog.storage.mechanism.Mechanism');\n\n\n\n/**\n * Interface for all iterable storage mechanisms.\n *\n * @constructor\n * @struct\n * @extends {goog.storage.mechanism.Mechanism}\n */\ngoog.storage.mechanism.IterableMechanism = function() {\n  goog.storage.mechanism.IterableMechanism.base(this, 'constructor');\n};\ngoog.inherits(\n    goog.storage.mechanism.IterableMechanism, goog.storage.mechanism.Mechanism);\n\n\n/**\n * Get the number of stored key-value pairs.\n *\n * Could be overridden in a subclass, as the default implementation is not very\n * efficient - it iterates over all keys.\n *\n * @return {number} Number of stored elements.\n */\ngoog.storage.mechanism.IterableMechanism.prototype.getCount = function() {\n  var count = 0;\n  goog.iter.forEach(this.__iterator__(true), function(key) {\n    goog.asserts.assertString(key);\n    count++;\n  });\n  return count;\n};\n\n\n/**\n * Returns an iterator that iterates over the elements in the storage. Will\n * throw goog.iter.StopIteration after the last element.\n *\n * @param {boolean=} opt_keys True to iterate over the keys. False to iterate\n *     over the values.  The default value is false.\n * @return {!goog.iter.Iterator} The iterator.\n */\ngoog.storage.mechanism.IterableMechanism.prototype.__iterator__ =\n    goog.abstractMethod;\n\n\n/**\n * Remove all key-value pairs.\n *\n * Could be overridden in a subclass, as the default implementation is not very\n * efficient - it iterates over all keys.\n */\ngoog.storage.mechanism.IterableMechanism.prototype.clear = function() {\n  // This converts the keys to an array first because otherwise\n  // removing while iterating results in unstable ordering of keys and\n  // can skip keys or terminate early.\n  var keys = goog.iter.toArray(this.__iterator__(true));\n  var selfObj = this;\n  goog.array.forEach(keys, function(key) { selfObj.remove(key); });\n};\n","^?",1579837703000,"^@",["^A",["^1J","~$goog.iter","^3","~$goog.storage.mechanism.Mechanism","^1S"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/mechanism/iterablemechanism.js"],"^S",["^A",["~$goog.storage.mechanism.IterableMechanism"]],"^1",true,"^2",["^3","^1S","^1J","^1W","^1X"]],["^ ","^7",[1579837703000],"^8","goog.dom.dom.js","^9",["^:","goog/dom/dom.js"],"^;","goog/dom/dom.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for manipulating the browser's Document Object Model\n * Inspiration taken *heavily* from mochikit (http://mochikit.com/).\n *\n * You can use {@link goog.dom.DomHelper} to create new dom helpers that refer\n * to a different document object.  This is useful if you are working with\n * frames or multiple windows.\n *\n * @author arv@google.com (Erik Arvidsson)\n * @suppress {strictMissingProperties}\n */\n\n\n// TODO(arv): Rename/refactor getTextContent and getRawTextContent. The problem\n// is that getTextContent should mimic the DOM3 textContent. We should add a\n// getInnerText (or getText) which tries to return the visible text, innerText.\n\n\ngoog.provide('goog.dom');\ngoog.provide('goog.dom.Appendable');\ngoog.provide('goog.dom.DomHelper');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom.BrowserFeature');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.uncheckedconversions');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.math.Size');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.string.Unicode');\ngoog.require('goog.userAgent');\n\n\n/**\n * @define {boolean} Whether we know at compile time that the browser is in\n * quirks mode.\n */\ngoog.dom.ASSUME_QUIRKS_MODE = goog.define('goog.dom.ASSUME_QUIRKS_MODE', false);\n\n\n/**\n * @define {boolean} Whether we know at compile time that the browser is in\n * standards compliance mode.\n */\ngoog.dom.ASSUME_STANDARDS_MODE =\n    goog.define('goog.dom.ASSUME_STANDARDS_MODE', false);\n\n\n/**\n * Whether we know the compatibility mode at compile time.\n * @type {boolean}\n * @private\n */\ngoog.dom.COMPAT_MODE_KNOWN_ =\n    goog.dom.ASSUME_QUIRKS_MODE || goog.dom.ASSUME_STANDARDS_MODE;\n\n\n/**\n * Gets the DomHelper object for the document where the element resides.\n * @param {(Node|Window)=} opt_element If present, gets the DomHelper for this\n *     element.\n * @return {!goog.dom.DomHelper} The DomHelper.\n */\ngoog.dom.getDomHelper = function(opt_element) {\n  return opt_element ?\n      new goog.dom.DomHelper(goog.dom.getOwnerDocument(opt_element)) :\n      (goog.dom.defaultDomHelper_ ||\n       (goog.dom.defaultDomHelper_ = new goog.dom.DomHelper()));\n};\n\n\n/**\n * Cached default DOM helper.\n * @type {!goog.dom.DomHelper|undefined}\n * @private\n */\ngoog.dom.defaultDomHelper_;\n\n\n/**\n * Gets the document object being used by the dom library.\n * @return {!Document} Document object.\n */\ngoog.dom.getDocument = function() {\n  return document;\n};\n\n\n/**\n * Gets an element from the current document by element id.\n *\n * If an Element is passed in, it is returned.\n *\n * @param {string|Element} element Element ID or a DOM node.\n * @return {Element} The element with the given ID, or the node passed in.\n */\ngoog.dom.getElement = function(element) {\n  return goog.dom.getElementHelper_(document, element);\n};\n\n\n/**\n * Gets an element by id from the given document (if present).\n * If an element is given, it is returned.\n * @param {!Document} doc\n * @param {string|Element} element Element ID or a DOM node.\n * @return {Element} The resulting element.\n * @private\n */\ngoog.dom.getElementHelper_ = function(doc, element) {\n  return typeof element === 'string' ? doc.getElementById(element) : element;\n};\n\n\n/**\n * Gets an element by id, asserting that the element is found.\n *\n * This is used when an element is expected to exist, and should fail with\n * an assertion error if it does not (if assertions are enabled).\n *\n * @param {string} id Element ID.\n * @return {!Element} The element with the given ID, if it exists.\n */\ngoog.dom.getRequiredElement = function(id) {\n  return goog.dom.getRequiredElementHelper_(document, id);\n};\n\n\n/**\n * Helper function for getRequiredElementHelper functions, both static and\n * on DomHelper.  Asserts the element with the given id exists.\n * @param {!Document} doc\n * @param {string} id\n * @return {!Element} The element with the given ID, if it exists.\n * @private\n */\ngoog.dom.getRequiredElementHelper_ = function(doc, id) {\n  // To prevent users passing in Elements as is permitted in getElement().\n  goog.asserts.assertString(id);\n  var element = goog.dom.getElementHelper_(doc, id);\n  element =\n      goog.asserts.assertElement(element, 'No element found with id: ' + id);\n  return element;\n};\n\n\n/**\n * Alias for getElement.\n * @param {string|Element} element Element ID or a DOM node.\n * @return {Element} The element with the given ID, or the node passed in.\n * @deprecated Use {@link goog.dom.getElement} instead.\n */\ngoog.dom.$ = goog.dom.getElement;\n\n\n/**\n * Gets elements by tag name.\n * @param {!goog.dom.TagName<T>} tagName\n * @param {(!Document|!Element)=} opt_parent Parent element or document where to\n *     look for elements. Defaults to document.\n * @return {!NodeList<R>} List of elements. The members of the list are\n *     {!Element} if tagName is not a member of goog.dom.TagName or more\n *     specific types if it is (e.g. {!HTMLAnchorElement} for\n *     goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n */\ngoog.dom.getElementsByTagName = function(tagName, opt_parent) {\n  var parent = opt_parent || document;\n  return parent.getElementsByTagName(String(tagName));\n};\n\n\n/**\n * Looks up elements by both tag and class name, using browser native functions\n * (`querySelectorAll`, `getElementsByTagName` or\n * `getElementsByClassName`) where possible. This function\n * is a useful, if limited, way of collecting a list of DOM elements\n * with certain characteristics.  `querySelectorAll` offers a\n * more powerful and general solution which allows matching on CSS3\n * selector expressions.\n *\n * Note that tag names are case sensitive in the SVG namespace, and this\n * function converts opt_tag to uppercase for comparisons. For queries in the\n * SVG namespace you should use querySelector or querySelectorAll instead.\n * https://bugzilla.mozilla.org/show_bug.cgi?id=963870\n * https://bugs.webkit.org/show_bug.cgi?id=83438\n *\n * @see {https://developer.mozilla.org/en-US/docs/Web/API/Document/querySelectorAll}\n *\n * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.\n * @param {?string=} opt_class Optional class name.\n * @param {(Document|Element)=} opt_el Optional element to look in.\n * @return {!IArrayLike<R>} Array-like list of elements (only a length property\n *     and numerical indices are guaranteed to exist). The members of the array\n *     are {!Element} if opt_tag is not a member of goog.dom.TagName or more\n *     specific types if it is (e.g. {!HTMLAnchorElement} for\n *     goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n */\ngoog.dom.getElementsByTagNameAndClass = function(opt_tag, opt_class, opt_el) {\n  return goog.dom.getElementsByTagNameAndClass_(\n      document, opt_tag, opt_class, opt_el);\n};\n\n\n/**\n * Gets the first element matching the tag and the class.\n *\n * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.\n * @param {?string=} opt_class Optional class name.\n * @param {(Document|Element)=} opt_el Optional element to look in.\n * @return {?R} Reference to a DOM node. The return type is {?Element} if\n *     tagName is a string or a more specific type if it is a member of\n *     goog.dom.TagName (e.g. {?HTMLAnchorElement} for goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n */\ngoog.dom.getElementByTagNameAndClass = function(opt_tag, opt_class, opt_el) {\n  return goog.dom.getElementByTagNameAndClass_(\n      document, opt_tag, opt_class, opt_el);\n};\n\n\n/**\n * Returns a static, array-like list of the elements with the provided\n * className.\n *\n * @param {string} className the name of the class to look for.\n * @param {(Document|Element)=} opt_el Optional element to look in.\n * @return {!IArrayLike<!Element>} The items found with the class name provided.\n */\ngoog.dom.getElementsByClass = function(className, opt_el) {\n  var parent = opt_el || document;\n  if (goog.dom.canUseQuerySelector_(parent)) {\n    return parent.querySelectorAll('.' + className);\n  }\n  return goog.dom.getElementsByTagNameAndClass_(\n      document, '*', className, opt_el);\n};\n\n\n/**\n * Returns the first element with the provided className.\n *\n * @param {string} className the name of the class to look for.\n * @param {Element|Document=} opt_el Optional element to look in.\n * @return {Element} The first item with the class name provided.\n */\ngoog.dom.getElementByClass = function(className, opt_el) {\n  var parent = opt_el || document;\n  var retVal = null;\n  if (parent.getElementsByClassName) {\n    retVal = parent.getElementsByClassName(className)[0];\n  } else {\n    retVal =\n        goog.dom.getElementByTagNameAndClass_(document, '*', className, opt_el);\n  }\n  return retVal || null;\n};\n\n\n/**\n * Ensures an element with the given className exists, and then returns the\n * first element with the provided className.\n *\n * @param {string} className the name of the class to look for.\n * @param {!Element|!Document=} opt_root Optional element or document to look\n *     in.\n * @return {!Element} The first item with the class name provided.\n * @throws {goog.asserts.AssertionError} Thrown if no element is found.\n */\ngoog.dom.getRequiredElementByClass = function(className, opt_root) {\n  var retValue = goog.dom.getElementByClass(className, opt_root);\n  return goog.asserts.assert(\n      retValue, 'No element found with className: ' + className);\n};\n\n\n/**\n * Prefer the standardized (http://www.w3.org/TR/selectors-api/), native and\n * fast W3C Selectors API.\n * @param {!(Element|Document)} parent The parent document object.\n * @return {boolean} whether or not we can use parent.querySelector* APIs.\n * @private\n */\ngoog.dom.canUseQuerySelector_ = function(parent) {\n  return !!(parent.querySelectorAll && parent.querySelector);\n};\n\n\n/**\n * Helper for `getElementsByTagNameAndClass`.\n * @param {!Document} doc The document to get the elements in.\n * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.\n * @param {?string=} opt_class Optional class name.\n * @param {(Document|Element)=} opt_el Optional element to look in.\n * @return {!IArrayLike<R>} Array-like list of elements (only a length property\n *     and numerical indices are guaranteed to exist). The members of the array\n *     are {!Element} if opt_tag is not a member of goog.dom.TagName or more\n *     specific types if it is (e.g. {!HTMLAnchorElement} for\n *     goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n * @private\n */\ngoog.dom.getElementsByTagNameAndClass_ = function(\n    doc, opt_tag, opt_class, opt_el) {\n  var parent = opt_el || doc;\n  var tagName =\n      (opt_tag && opt_tag != '*') ? String(opt_tag).toUpperCase() : '';\n\n  if (goog.dom.canUseQuerySelector_(parent) && (tagName || opt_class)) {\n    var query = tagName + (opt_class ? '.' + opt_class : '');\n    return parent.querySelectorAll(query);\n  }\n\n  // Use the native getElementsByClassName if available, under the assumption\n  // that even when the tag name is specified, there will be fewer elements to\n  // filter through when going by class than by tag name\n  if (opt_class && parent.getElementsByClassName) {\n    var els = parent.getElementsByClassName(opt_class);\n\n    if (tagName) {\n      var arrayLike = {};\n      var len = 0;\n\n      // Filter for specific tags if requested.\n      for (var i = 0, el; el = els[i]; i++) {\n        if (tagName == el.nodeName) {\n          arrayLike[len++] = el;\n        }\n      }\n      arrayLike.length = len;\n\n      return /** @type {!IArrayLike<!Element>} */ (arrayLike);\n    } else {\n      return els;\n    }\n  }\n\n  var els = parent.getElementsByTagName(tagName || '*');\n\n  if (opt_class) {\n    var arrayLike = {};\n    var len = 0;\n    for (var i = 0, el; el = els[i]; i++) {\n      var className = el.className;\n      // Check if className has a split function since SVG className does not.\n      if (typeof className.split == 'function' &&\n          goog.array.contains(className.split(/\\s+/), opt_class)) {\n        arrayLike[len++] = el;\n      }\n    }\n    arrayLike.length = len;\n    return /** @type {!IArrayLike<!Element>} */ (arrayLike);\n  } else {\n    return els;\n  }\n};\n\n\n/**\n * Helper for goog.dom.getElementByTagNameAndClass.\n *\n * @param {!Document} doc The document to get the elements in.\n * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.\n * @param {?string=} opt_class Optional class name.\n * @param {(Document|Element)=} opt_el Optional element to look in.\n * @return {?R} Reference to a DOM node. The return type is {?Element} if\n *     tagName is a string or a more specific type if it is a member of\n *     goog.dom.TagName (e.g. {?HTMLAnchorElement} for goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n * @private\n */\ngoog.dom.getElementByTagNameAndClass_ = function(\n    doc, opt_tag, opt_class, opt_el) {\n  var parent = opt_el || doc;\n  var tag = (opt_tag && opt_tag != '*') ? String(opt_tag).toUpperCase() : '';\n  if (goog.dom.canUseQuerySelector_(parent) && (tag || opt_class)) {\n    return parent.querySelector(tag + (opt_class ? '.' + opt_class : ''));\n  }\n  var elements =\n      goog.dom.getElementsByTagNameAndClass_(doc, opt_tag, opt_class, opt_el);\n  return elements[0] || null;\n};\n\n\n\n/**\n * Alias for `getElementsByTagNameAndClass`.\n * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.\n * @param {?string=} opt_class Optional class name.\n * @param {Element=} opt_el Optional element to look in.\n * @return {!IArrayLike<R>} Array-like list of elements (only a length property\n *     and numerical indices are guaranteed to exist). The members of the array\n *     are {!Element} if opt_tag is not a member of goog.dom.TagName or more\n *     specific types if it is (e.g. {!HTMLAnchorElement} for\n *     goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n * @deprecated Use {@link goog.dom.getElementsByTagNameAndClass} instead.\n */\ngoog.dom.$$ = goog.dom.getElementsByTagNameAndClass;\n\n\n/**\n * Sets multiple properties, and sometimes attributes, on an element. Note that\n * properties are simply object properties on the element instance, while\n * attributes are visible in the DOM. Many properties map to attributes with the\n * same names, some with different names, and there are also unmappable cases.\n *\n * This method sets properties by default (which means that custom attributes\n * are not supported). These are the exeptions (some of which is legacy):\n * - \"style\": Even though this is an attribute name, it is translated to a\n *   property, \"style.cssText\". Note that this property sanitizes and formats\n *   its value, unlike the attribute.\n * - \"class\": This is an attribute name, it is translated to the \"className\"\n *   property.\n * - \"for\": This is an attribute name, it is translated to the \"htmlFor\"\n *   property.\n * - Entries in {@see goog.dom.DIRECT_ATTRIBUTE_MAP_} are set as attributes,\n *   this is probably due to browser quirks.\n * - \"aria-*\", \"data-*\": Always set as attributes, they have no property\n *   counterparts.\n *\n * @param {Element} element DOM node to set properties on.\n * @param {Object} properties Hash of property:value pairs.\n *     Property values can be strings or goog.string.TypedString values (such as\n *     goog.html.SafeUrl).\n */\ngoog.dom.setProperties = function(element, properties) {\n  goog.object.forEach(properties, function(val, key) {\n    if (val && typeof val == 'object' && val.implementsGoogStringTypedString) {\n      val = val.getTypedStringValue();\n    }\n    if (key == 'style') {\n      element.style.cssText = val;\n    } else if (key == 'class') {\n      element.className = val;\n    } else if (key == 'for') {\n      element.htmlFor = val;\n    } else if (goog.dom.DIRECT_ATTRIBUTE_MAP_.hasOwnProperty(key)) {\n      element.setAttribute(goog.dom.DIRECT_ATTRIBUTE_MAP_[key], val);\n    } else if (\n        goog.string.startsWith(key, 'aria-') ||\n        goog.string.startsWith(key, 'data-')) {\n      element.setAttribute(key, val);\n    } else {\n      element[key] = val;\n    }\n  });\n};\n\n\n/**\n * Map of attributes that should be set using\n * element.setAttribute(key, val) instead of element[key] = val.  Used\n * by goog.dom.setProperties.\n *\n * @private {!Object<string, string>}\n * @const\n */\ngoog.dom.DIRECT_ATTRIBUTE_MAP_ = {\n  'cellpadding': 'cellPadding',\n  'cellspacing': 'cellSpacing',\n  'colspan': 'colSpan',\n  'frameborder': 'frameBorder',\n  'height': 'height',\n  'maxlength': 'maxLength',\n  'nonce': 'nonce',\n  'role': 'role',\n  'rowspan': 'rowSpan',\n  'type': 'type',\n  'usemap': 'useMap',\n  'valign': 'vAlign',\n  'width': 'width'\n};\n\n\n/**\n * Gets the dimensions of the viewport.\n *\n * Gecko Standards mode:\n * docEl.clientWidth  Width of viewport excluding scrollbar.\n * win.innerWidth     Width of viewport including scrollbar.\n * body.clientWidth   Width of body element.\n *\n * docEl.clientHeight Height of viewport excluding scrollbar.\n * win.innerHeight    Height of viewport including scrollbar.\n * body.clientHeight  Height of document.\n *\n * Gecko Backwards compatible mode:\n * docEl.clientWidth  Width of viewport excluding scrollbar.\n * win.innerWidth     Width of viewport including scrollbar.\n * body.clientWidth   Width of viewport excluding scrollbar.\n *\n * docEl.clientHeight Height of document.\n * win.innerHeight    Height of viewport including scrollbar.\n * body.clientHeight  Height of viewport excluding scrollbar.\n *\n * IE6/7 Standards mode:\n * docEl.clientWidth  Width of viewport excluding scrollbar.\n * win.innerWidth     Undefined.\n * body.clientWidth   Width of body element.\n *\n * docEl.clientHeight Height of viewport excluding scrollbar.\n * win.innerHeight    Undefined.\n * body.clientHeight  Height of document element.\n *\n * IE5 + IE6/7 Backwards compatible mode:\n * docEl.clientWidth  0.\n * win.innerWidth     Undefined.\n * body.clientWidth   Width of viewport excluding scrollbar.\n *\n * docEl.clientHeight 0.\n * win.innerHeight    Undefined.\n * body.clientHeight  Height of viewport excluding scrollbar.\n *\n * Opera 9 Standards and backwards compatible mode:\n * docEl.clientWidth  Width of viewport excluding scrollbar.\n * win.innerWidth     Width of viewport including scrollbar.\n * body.clientWidth   Width of viewport excluding scrollbar.\n *\n * docEl.clientHeight Height of document.\n * win.innerHeight    Height of viewport including scrollbar.\n * body.clientHeight  Height of viewport excluding scrollbar.\n *\n * WebKit:\n * Safari 2\n * docEl.clientHeight Same as scrollHeight.\n * docEl.clientWidth  Same as innerWidth.\n * win.innerWidth     Width of viewport excluding scrollbar.\n * win.innerHeight    Height of the viewport including scrollbar.\n * frame.innerHeight  Height of the viewport exluding scrollbar.\n *\n * Safari 3 (tested in 522)\n *\n * docEl.clientWidth  Width of viewport excluding scrollbar.\n * docEl.clientHeight Height of viewport excluding scrollbar in strict mode.\n * body.clientHeight  Height of viewport excluding scrollbar in quirks mode.\n *\n * @param {Window=} opt_window Optional window element to test.\n * @return {!goog.math.Size} Object with values 'width' and 'height'.\n */\ngoog.dom.getViewportSize = function(opt_window) {\n  // TODO(arv): This should not take an argument\n  return goog.dom.getViewportSize_(opt_window || window);\n};\n\n\n/**\n * Helper for `getViewportSize`.\n * @param {Window} win The window to get the view port size for.\n * @return {!goog.math.Size} Object with values 'width' and 'height'.\n * @private\n */\ngoog.dom.getViewportSize_ = function(win) {\n  var doc = win.document;\n  var el = goog.dom.isCss1CompatMode_(doc) ? doc.documentElement : doc.body;\n  return new goog.math.Size(el.clientWidth, el.clientHeight);\n};\n\n\n/**\n * Calculates the height of the document.\n *\n * @return {number} The height of the current document.\n */\ngoog.dom.getDocumentHeight = function() {\n  return goog.dom.getDocumentHeight_(window);\n};\n\n/**\n * Calculates the height of the document of the given window.\n *\n * @param {!Window} win The window whose document height to retrieve.\n * @return {number} The height of the document of the given window.\n */\ngoog.dom.getDocumentHeightForWindow = function(win) {\n  return goog.dom.getDocumentHeight_(win);\n};\n\n/**\n * Calculates the height of the document of the given window.\n *\n * Function code copied from the opensocial gadget api:\n *   gadgets.window.adjustHeight(opt_height)\n *\n * @private\n * @param {!Window} win The window whose document height to retrieve.\n * @return {number} The height of the document of the given window.\n */\ngoog.dom.getDocumentHeight_ = function(win) {\n  // NOTE(eae): This method will return the window size rather than the document\n  // size in webkit quirks mode.\n  var doc = win.document;\n  var height = 0;\n\n  if (doc) {\n    // Calculating inner content height is hard and different between\n    // browsers rendering in Strict vs. Quirks mode.  We use a combination of\n    // three properties within document.body and document.documentElement:\n    // - scrollHeight\n    // - offsetHeight\n    // - clientHeight\n    // These values differ significantly between browsers and rendering modes.\n    // But there are patterns.  It just takes a lot of time and persistence\n    // to figure out.\n\n    var body = doc.body;\n    var docEl = /** @type {!HTMLElement} */ (doc.documentElement);\n    if (!(docEl && body)) {\n      return 0;\n    }\n\n    // Get the height of the viewport\n    var vh = goog.dom.getViewportSize_(win).height;\n    if (goog.dom.isCss1CompatMode_(doc) && docEl.scrollHeight) {\n      // In Strict mode:\n      // The inner content height is contained in either:\n      //    document.documentElement.scrollHeight\n      //    document.documentElement.offsetHeight\n      // Based on studying the values output by different browsers,\n      // use the value that's NOT equal to the viewport height found above.\n      height =\n          docEl.scrollHeight != vh ? docEl.scrollHeight : docEl.offsetHeight;\n    } else {\n      // In Quirks mode:\n      // documentElement.clientHeight is equal to documentElement.offsetHeight\n      // except in IE.  In most browsers, document.documentElement can be used\n      // to calculate the inner content height.\n      // However, in other browsers (e.g. IE), document.body must be used\n      // instead.  How do we know which one to use?\n      // If document.documentElement.clientHeight does NOT equal\n      // document.documentElement.offsetHeight, then use document.body.\n      var sh = docEl.scrollHeight;\n      var oh = docEl.offsetHeight;\n      if (docEl.clientHeight != oh) {\n        sh = body.scrollHeight;\n        oh = body.offsetHeight;\n      }\n\n      // Detect whether the inner content height is bigger or smaller\n      // than the bounding box (viewport).  If bigger, take the larger\n      // value.  If smaller, take the smaller value.\n      if (sh > vh) {\n        // Content is larger\n        height = sh > oh ? sh : oh;\n      } else {\n        // Content is smaller\n        height = sh < oh ? sh : oh;\n      }\n    }\n  }\n\n  return height;\n};\n\n\n/**\n * Gets the page scroll distance as a coordinate object.\n *\n * @param {Window=} opt_window Optional window element to test.\n * @return {!goog.math.Coordinate} Object with values 'x' and 'y'.\n * @deprecated Use {@link goog.dom.getDocumentScroll} instead.\n */\ngoog.dom.getPageScroll = function(opt_window) {\n  var win = opt_window || goog.global || window;\n  return goog.dom.getDomHelper(win.document).getDocumentScroll();\n};\n\n\n/**\n * Gets the document scroll distance as a coordinate object.\n *\n * @return {!goog.math.Coordinate} Object with values 'x' and 'y'.\n */\ngoog.dom.getDocumentScroll = function() {\n  return goog.dom.getDocumentScroll_(document);\n};\n\n\n/**\n * Helper for `getDocumentScroll`.\n *\n * @param {!Document} doc The document to get the scroll for.\n * @return {!goog.math.Coordinate} Object with values 'x' and 'y'.\n * @private\n */\ngoog.dom.getDocumentScroll_ = function(doc) {\n  var el = goog.dom.getDocumentScrollElement_(doc);\n  var win = goog.dom.getWindow_(doc);\n  if (goog.userAgent.IE && goog.userAgent.isVersionOrHigher('10') &&\n      win.pageYOffset != el.scrollTop) {\n    // The keyboard on IE10 touch devices shifts the page using the pageYOffset\n    // without modifying scrollTop. For this case, we want the body scroll\n    // offsets.\n    return new goog.math.Coordinate(el.scrollLeft, el.scrollTop);\n  }\n  return new goog.math.Coordinate(\n      win.pageXOffset || el.scrollLeft, win.pageYOffset || el.scrollTop);\n};\n\n\n/**\n * Gets the document scroll element.\n * @return {!Element} Scrolling element.\n */\ngoog.dom.getDocumentScrollElement = function() {\n  return goog.dom.getDocumentScrollElement_(document);\n};\n\n\n/**\n * Helper for `getDocumentScrollElement`.\n * @param {!Document} doc The document to get the scroll element for.\n * @return {!Element} Scrolling element.\n * @private\n */\ngoog.dom.getDocumentScrollElement_ = function(doc) {\n  // Old WebKit needs body.scrollLeft in both quirks mode and strict mode. We\n  // also default to the documentElement if the document does not have a body\n  // (e.g. a SVG document).\n  // Uses http://dev.w3.org/csswg/cssom-view/#dom-document-scrollingelement to\n  // avoid trying to guess about browser behavior from the UA string.\n  if (doc.scrollingElement) {\n    return doc.scrollingElement;\n  }\n  if (!goog.userAgent.WEBKIT && goog.dom.isCss1CompatMode_(doc)) {\n    return doc.documentElement;\n  }\n  return doc.body || doc.documentElement;\n};\n\n\n/**\n * Gets the window object associated with the given document.\n *\n * @param {Document=} opt_doc  Document object to get window for.\n * @return {!Window} The window associated with the given document.\n */\ngoog.dom.getWindow = function(opt_doc) {\n  // TODO(arv): This should not take an argument.\n  return opt_doc ? goog.dom.getWindow_(opt_doc) : window;\n};\n\n\n/**\n * Helper for `getWindow`.\n *\n * @param {!Document} doc  Document object to get window for.\n * @return {!Window} The window associated with the given document.\n * @private\n */\ngoog.dom.getWindow_ = function(doc) {\n  return /** @type {!Window} */ (doc.parentWindow || doc.defaultView);\n};\n\n\n/**\n * Returns a dom node with a set of attributes.  This function accepts varargs\n * for subsequent nodes to be added.  Subsequent nodes will be added to the\n * first node as childNodes.\n *\n * So:\n * <code>createDom(goog.dom.TagName.DIV, null, createDom(goog.dom.TagName.P),\n * createDom(goog.dom.TagName.P));</code> would return a div with two child\n * paragraphs\n *\n * This function uses {@link goog.dom.setProperties} to set attributes: the\n * `opt_attributes` parameter follows the same rules.\n *\n * @param {string|!goog.dom.TagName<T>} tagName Tag to create.\n * @param {?Object|?Array<string>|string=} opt_attributes If object, then a map\n *     of name-value pairs for attributes. If a string, then this is the\n *     className of the new element. If an array, the elements will be joined\n *     together as the className of the new element.\n * @param {...(Object|string|Array|NodeList|null|undefined)} var_args Further\n *     DOM nodes or strings for text nodes. If one of the var_args is an array\n *     or NodeList, its elements will be added as childNodes instead.\n * @return {R} Reference to a DOM node. The return type is {!Element} if tagName\n *     is a string or a more specific type if it is a member of\n *     goog.dom.TagName (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n */\ngoog.dom.createDom = function(tagName, opt_attributes, var_args) {\n  return goog.dom.createDom_(document, arguments);\n};\n\n\n/**\n * Helper for `createDom`.\n * @param {!Document} doc The document to create the DOM in.\n * @param {!Arguments} args Argument object passed from the callers. See\n *     `goog.dom.createDom` for details.\n * @return {!Element} Reference to a DOM node.\n * @private\n */\ngoog.dom.createDom_ = function(doc, args) {\n  var tagName = String(args[0]);\n  var attributes = args[1];\n\n  // Internet Explorer is dumb:\n  // name: https://msdn.microsoft.com/en-us/library/ms534184(v=vs.85).aspx\n  // type: https://msdn.microsoft.com/en-us/library/ms534700(v=vs.85).aspx\n  // Also does not allow setting of 'type' attribute on 'input' or 'button'.\n  if (!goog.dom.BrowserFeature.CAN_ADD_NAME_OR_TYPE_ATTRIBUTES && attributes &&\n      (attributes.name || attributes.type)) {\n    var tagNameArr = ['<', tagName];\n    if (attributes.name) {\n      tagNameArr.push(' name=\"', goog.string.htmlEscape(attributes.name), '\"');\n    }\n    if (attributes.type) {\n      tagNameArr.push(' type=\"', goog.string.htmlEscape(attributes.type), '\"');\n\n      // Clone attributes map to remove 'type' without mutating the input.\n      var clone = {};\n      goog.object.extend(clone, attributes);\n\n      // JSCompiler can't see how goog.object.extend added this property,\n      // because it was essentially added by reflection.\n      // So it needs to be quoted.\n      delete clone['type'];\n\n      attributes = clone;\n    }\n    tagNameArr.push('>');\n    tagName = tagNameArr.join('');\n  }\n\n  var element = goog.dom.createElement_(doc, tagName);\n\n  if (attributes) {\n    if (typeof attributes === 'string') {\n      element.className = attributes;\n    } else if (goog.isArray(attributes)) {\n      element.className = attributes.join(' ');\n    } else {\n      goog.dom.setProperties(element, attributes);\n    }\n  }\n\n  if (args.length > 2) {\n    goog.dom.append_(doc, element, args, 2);\n  }\n\n  return element;\n};\n\n\n/**\n * Appends a node with text or other nodes.\n * @param {!Document} doc The document to create new nodes in.\n * @param {!Node} parent The node to append nodes to.\n * @param {!Arguments} args The values to add. See `goog.dom.append`.\n * @param {number} startIndex The index of the array to start from.\n * @private\n */\ngoog.dom.append_ = function(doc, parent, args, startIndex) {\n  function childHandler(child) {\n    // TODO(user): More coercion, ala MochiKit?\n    if (child) {\n      parent.appendChild(\n          typeof child === 'string' ? doc.createTextNode(child) : child);\n    }\n  }\n\n  for (var i = startIndex; i < args.length; i++) {\n    var arg = args[i];\n    // TODO(attila): Fix isArrayLike to return false for a text node.\n    if (goog.isArrayLike(arg) && !goog.dom.isNodeLike(arg)) {\n      // If the argument is a node list, not a real array, use a clone,\n      // because forEach can't be used to mutate a NodeList.\n      goog.array.forEach(\n          goog.dom.isNodeList(arg) ? goog.array.toArray(arg) : arg,\n          childHandler);\n    } else {\n      childHandler(arg);\n    }\n  }\n};\n\n\n/**\n * Alias for `createDom`.\n * @param {string|!goog.dom.TagName<T>} tagName Tag to create.\n * @param {?Object|?Array<string>|string=} opt_attributes If object, then a map\n *     of name-value pairs for attributes. If a string, then this is the\n *     className of the new element. If an array, the elements will be joined\n *     together as the className of the new element.\n * @param {...(Object|string|Array|NodeList|null|undefined)} var_args Further\n *     DOM nodes or strings for text nodes. If one of the var_args is an array,\n *     its children will be added as childNodes instead.\n * @return {R} Reference to a DOM node. The return type is {!Element} if tagName\n *     is a string or a more specific type if it is a member of\n *     goog.dom.TagName (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n * @deprecated Use {@link goog.dom.createDom} instead.\n */\ngoog.dom.$dom = goog.dom.createDom;\n\n\n/**\n * Creates a new element.\n * @param {string|!goog.dom.TagName<T>} name Tag to create.\n * @return {R} The new element. The return type is {!Element} if name is\n *     a string or a more specific type if it is a member of goog.dom.TagName\n *     (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n */\ngoog.dom.createElement = function(name) {\n  return goog.dom.createElement_(document, name);\n};\n\n\n/**\n * Creates a new element.\n * @param {!Document} doc The document to create the element in.\n * @param {string|!goog.dom.TagName<T>} name Tag to create.\n * @return {R} The new element. The return type is {!Element} if name is\n *     a string or a more specific type if it is a member of goog.dom.TagName\n *     (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n * @private\n */\ngoog.dom.createElement_ = function(doc, name) {\n  name = String(name);\n  if (doc.contentType === 'application/xhtml+xml') name = name.toLowerCase();\n  return doc.createElement(name);\n};\n\n\n/**\n * Creates a new text node.\n * @param {number|string} content Content.\n * @return {!Text} The new text node.\n */\ngoog.dom.createTextNode = function(content) {\n  return document.createTextNode(String(content));\n};\n\n\n/**\n * Create a table.\n * @param {number} rows The number of rows in the table.  Must be >= 1.\n * @param {number} columns The number of columns in the table.  Must be >= 1.\n * @param {boolean=} opt_fillWithNbsp If true, fills table entries with\n *     `goog.string.Unicode.NBSP` characters.\n * @return {!Element} The created table.\n */\ngoog.dom.createTable = function(rows, columns, opt_fillWithNbsp) {\n  // TODO(mlourenco): Return HTMLTableElement, also in prototype function.\n  // Callers need to be updated to e.g. not assign numbers to table.cellSpacing.\n  return goog.dom.createTable_(document, rows, columns, !!opt_fillWithNbsp);\n};\n\n\n/**\n * Create a table.\n * @param {!Document} doc Document object to use to create the table.\n * @param {number} rows The number of rows in the table.  Must be >= 1.\n * @param {number} columns The number of columns in the table.  Must be >= 1.\n * @param {boolean} fillWithNbsp If true, fills table entries with\n *     `goog.string.Unicode.NBSP` characters.\n * @return {!HTMLTableElement} The created table.\n * @private\n */\ngoog.dom.createTable_ = function(doc, rows, columns, fillWithNbsp) {\n  var table = goog.dom.createElement_(doc, goog.dom.TagName.TABLE);\n  var tbody =\n      table.appendChild(goog.dom.createElement_(doc, goog.dom.TagName.TBODY));\n  for (var i = 0; i < rows; i++) {\n    var tr = goog.dom.createElement_(doc, goog.dom.TagName.TR);\n    for (var j = 0; j < columns; j++) {\n      var td = goog.dom.createElement_(doc, goog.dom.TagName.TD);\n      // IE <= 9 will create a text node if we set text content to the empty\n      // string, so we avoid doing it unless necessary. This ensures that the\n      // same DOM tree is returned on all browsers.\n      if (fillWithNbsp) {\n        goog.dom.setTextContent(td, goog.string.Unicode.NBSP);\n      }\n      tr.appendChild(td);\n    }\n    tbody.appendChild(tr);\n  }\n  return table;\n};\n\n\n\n/**\n * Creates a new Node from constant strings of HTML markup.\n * @param {...!goog.string.Const} var_args The HTML strings to concatenate then\n *     convert into a node.\n * @return {!Node}\n */\ngoog.dom.constHtmlToNode = function(var_args) {\n  var stringArray = goog.array.map(arguments, goog.string.Const.unwrap);\n  var safeHtml =\n      goog.html.uncheckedconversions\n          .safeHtmlFromStringKnownToSatisfyTypeContract(\n              goog.string.Const.from(\n                  'Constant HTML string, that gets turned into a ' +\n                  'Node later, so it will be automatically balanced.'),\n              stringArray.join(''));\n  return goog.dom.safeHtmlToNode(safeHtml);\n};\n\n\n/**\n * Converts HTML markup into a node. This is a safe version of\n * `goog.dom.htmlToDocumentFragment` which is now deleted.\n * @param {!goog.html.SafeHtml} html The HTML markup to convert.\n * @return {!Node} The resulting node.\n */\ngoog.dom.safeHtmlToNode = function(html) {\n  return goog.dom.safeHtmlToNode_(document, html);\n};\n\n\n/**\n * Helper for `safeHtmlToNode`.\n * @param {!Document} doc The document.\n * @param {!goog.html.SafeHtml} html The HTML markup to convert.\n * @return {!Node} The resulting node.\n * @private\n */\ngoog.dom.safeHtmlToNode_ = function(doc, html) {\n  var tempDiv = goog.dom.createElement_(doc, goog.dom.TagName.DIV);\n  if (goog.dom.BrowserFeature.INNER_HTML_NEEDS_SCOPED_ELEMENT) {\n    goog.dom.safe.setInnerHtml(\n        tempDiv, goog.html.SafeHtml.concat(goog.html.SafeHtml.BR, html));\n    tempDiv.removeChild(goog.asserts.assert(tempDiv.firstChild));\n  } else {\n    goog.dom.safe.setInnerHtml(tempDiv, html);\n  }\n  return goog.dom.childrenToNode_(doc, tempDiv);\n};\n\n\n/**\n * Helper for `safeHtmlToNode_`.\n * @param {!Document} doc The document.\n * @param {!Node} tempDiv The input node.\n * @return {!Node} The resulting node.\n * @private\n */\ngoog.dom.childrenToNode_ = function(doc, tempDiv) {\n  if (tempDiv.childNodes.length == 1) {\n    return tempDiv.removeChild(goog.asserts.assert(tempDiv.firstChild));\n  } else {\n    var fragment = doc.createDocumentFragment();\n    while (tempDiv.firstChild) {\n      fragment.appendChild(tempDiv.firstChild);\n    }\n    return fragment;\n  }\n};\n\n\n/**\n * Returns true if the browser is in \"CSS1-compatible\" (standards-compliant)\n * mode, false otherwise.\n * @return {boolean} True if in CSS1-compatible mode.\n */\ngoog.dom.isCss1CompatMode = function() {\n  return goog.dom.isCss1CompatMode_(document);\n};\n\n\n/**\n * Returns true if the browser is in \"CSS1-compatible\" (standards-compliant)\n * mode, false otherwise.\n * @param {!Document} doc The document to check.\n * @return {boolean} True if in CSS1-compatible mode.\n * @private\n */\ngoog.dom.isCss1CompatMode_ = function(doc) {\n  if (goog.dom.COMPAT_MODE_KNOWN_) {\n    return goog.dom.ASSUME_STANDARDS_MODE;\n  }\n\n  return doc.compatMode == 'CSS1Compat';\n};\n\n\n/**\n * Determines if the given node can contain children, intended to be used for\n * HTML generation.\n *\n * IE natively supports node.canHaveChildren but has inconsistent behavior.\n * Prior to IE8 the base tag allows children and in IE9 all nodes return true\n * for canHaveChildren.\n *\n * In practice all non-IE browsers allow you to add children to any node, but\n * the behavior is inconsistent:\n *\n * <pre>\n *   var a = goog.dom.createElement(goog.dom.TagName.BR);\n *   a.appendChild(document.createTextNode('foo'));\n *   a.appendChild(document.createTextNode('bar'));\n *   console.log(a.childNodes.length);  // 2\n *   console.log(a.innerHTML);  // Chrome: \"\", IE9: \"foobar\", FF3.5: \"foobar\"\n * </pre>\n *\n * For more information, see:\n * http://dev.w3.org/html5/markup/syntax.html#syntax-elements\n *\n * TODO(user): Rename shouldAllowChildren() ?\n *\n * @param {Node} node The node to check.\n * @return {boolean} Whether the node can contain children.\n */\ngoog.dom.canHaveChildren = function(node) {\n  if (node.nodeType != goog.dom.NodeType.ELEMENT) {\n    return false;\n  }\n  switch (/** @type {!Element} */ (node).tagName) {\n    case String(goog.dom.TagName.APPLET):\n    case String(goog.dom.TagName.AREA):\n    case String(goog.dom.TagName.BASE):\n    case String(goog.dom.TagName.BR):\n    case String(goog.dom.TagName.COL):\n    case String(goog.dom.TagName.COMMAND):\n    case String(goog.dom.TagName.EMBED):\n    case String(goog.dom.TagName.FRAME):\n    case String(goog.dom.TagName.HR):\n    case String(goog.dom.TagName.IMG):\n    case String(goog.dom.TagName.INPUT):\n    case String(goog.dom.TagName.IFRAME):\n    case String(goog.dom.TagName.ISINDEX):\n    case String(goog.dom.TagName.KEYGEN):\n    case String(goog.dom.TagName.LINK):\n    case String(goog.dom.TagName.NOFRAMES):\n    case String(goog.dom.TagName.NOSCRIPT):\n    case String(goog.dom.TagName.META):\n    case String(goog.dom.TagName.OBJECT):\n    case String(goog.dom.TagName.PARAM):\n    case String(goog.dom.TagName.SCRIPT):\n    case String(goog.dom.TagName.SOURCE):\n    case String(goog.dom.TagName.STYLE):\n    case String(goog.dom.TagName.TRACK):\n    case String(goog.dom.TagName.WBR):\n      return false;\n  }\n  return true;\n};\n\n\n/**\n * Appends a child to a node.\n * @param {Node} parent Parent.\n * @param {Node} child Child.\n */\ngoog.dom.appendChild = function(parent, child) {\n  goog.asserts.assert(\n      parent != null && child != null,\n      'goog.dom.appendChild expects non-null arguments');\n  parent.appendChild(child);\n};\n\n\n/**\n * Appends a node with text or other nodes.\n * @param {!Node} parent The node to append nodes to.\n * @param {...goog.dom.Appendable} var_args The things to append to the node.\n *     If this is a Node it is appended as is.\n *     If this is a string then a text node is appended.\n *     If this is an array like object then fields 0 to length - 1 are appended.\n */\ngoog.dom.append = function(parent, var_args) {\n  goog.dom.append_(goog.dom.getOwnerDocument(parent), parent, arguments, 1);\n};\n\n\n/**\n * Removes all the child nodes on a DOM node.\n * @param {Node} node Node to remove children from.\n */\ngoog.dom.removeChildren = function(node) {\n  // Note: Iterations over live collections can be slow, this is the fastest\n  // we could find. The double parenthesis are used to prevent JsCompiler and\n  // strict warnings.\n  var child;\n  while ((child = node.firstChild)) {\n    node.removeChild(child);\n  }\n};\n\n\n/**\n * Inserts a new node before an existing reference node (i.e. as the previous\n * sibling). If the reference node has no parent, then does nothing.\n * @param {Node} newNode Node to insert.\n * @param {Node} refNode Reference node to insert before.\n */\ngoog.dom.insertSiblingBefore = function(newNode, refNode) {\n  goog.asserts.assert(\n      newNode != null && refNode != null,\n      'goog.dom.insertSiblingBefore expects non-null arguments');\n  if (refNode.parentNode) {\n    refNode.parentNode.insertBefore(newNode, refNode);\n  }\n};\n\n\n/**\n * Inserts a new node after an existing reference node (i.e. as the next\n * sibling). If the reference node has no parent, then does nothing.\n * @param {Node} newNode Node to insert.\n * @param {Node} refNode Reference node to insert after.\n */\ngoog.dom.insertSiblingAfter = function(newNode, refNode) {\n  goog.asserts.assert(\n      newNode != null && refNode != null,\n      'goog.dom.insertSiblingAfter expects non-null arguments');\n  if (refNode.parentNode) {\n    refNode.parentNode.insertBefore(newNode, refNode.nextSibling);\n  }\n};\n\n\n/**\n * Insert a child at a given index. If index is larger than the number of child\n * nodes that the parent currently has, the node is inserted as the last child\n * node.\n * @param {Element} parent The element into which to insert the child.\n * @param {Node} child The element to insert.\n * @param {number} index The index at which to insert the new child node. Must\n *     not be negative.\n */\ngoog.dom.insertChildAt = function(parent, child, index) {\n  // Note that if the second argument is null, insertBefore\n  // will append the child at the end of the list of children.\n  goog.asserts.assert(\n      parent != null, 'goog.dom.insertChildAt expects a non-null parent');\n  parent.insertBefore(child, parent.childNodes[index] || null);\n};\n\n\n/**\n * Removes a node from its parent.\n * @param {Node} node The node to remove.\n * @return {Node} The node removed if removed; else, null.\n */\ngoog.dom.removeNode = function(node) {\n  return node && node.parentNode ? node.parentNode.removeChild(node) : null;\n};\n\n\n/**\n * Replaces a node in the DOM tree. Will do nothing if `oldNode` has no\n * parent.\n * @param {Node} newNode Node to insert.\n * @param {Node} oldNode Node to replace.\n */\ngoog.dom.replaceNode = function(newNode, oldNode) {\n  goog.asserts.assert(\n      newNode != null && oldNode != null,\n      'goog.dom.replaceNode expects non-null arguments');\n  var parent = oldNode.parentNode;\n  if (parent) {\n    parent.replaceChild(newNode, oldNode);\n  }\n};\n\n\n/**\n * Flattens an element. That is, removes it and replace it with its children.\n * Does nothing if the element is not in the document.\n * @param {Element} element The element to flatten.\n * @return {Element|undefined} The original element, detached from the document\n *     tree, sans children; or undefined, if the element was not in the document\n *     to begin with.\n */\ngoog.dom.flattenElement = function(element) {\n  var child, parent = element.parentNode;\n  if (parent && parent.nodeType != goog.dom.NodeType.DOCUMENT_FRAGMENT) {\n    // Use IE DOM method (supported by Opera too) if available\n    if (element.removeNode) {\n      return /** @type {Element} */ (element.removeNode(false));\n    } else {\n      // Move all children of the original node up one level.\n      while ((child = element.firstChild)) {\n        parent.insertBefore(child, element);\n      }\n\n      // Detach the original element.\n      return /** @type {Element} */ (goog.dom.removeNode(element));\n    }\n  }\n};\n\n\n/**\n * Returns an array containing just the element children of the given element.\n * @param {Element} element The element whose element children we want.\n * @return {!(Array<!Element>|NodeList<!Element>)} An array or array-like list\n *     of just the element children of the given element.\n */\ngoog.dom.getChildren = function(element) {\n  // We check if the children attribute is supported for child elements\n  // since IE8 misuses the attribute by also including comments.\n  if (goog.dom.BrowserFeature.CAN_USE_CHILDREN_ATTRIBUTE &&\n      element.children != undefined) {\n    return element.children;\n  }\n  // Fall back to manually filtering the element's child nodes.\n  return goog.array.filter(element.childNodes, function(node) {\n    return node.nodeType == goog.dom.NodeType.ELEMENT;\n  });\n};\n\n\n/**\n * Returns the first child node that is an element.\n * @param {Node} node The node to get the first child element of.\n * @return {Element} The first child node of `node` that is an element.\n */\ngoog.dom.getFirstElementChild = function(node) {\n  if (node.firstElementChild !== undefined) {\n    return /** @type {!Element} */ (node).firstElementChild;\n  }\n  return goog.dom.getNextElementNode_(node.firstChild, true);\n};\n\n\n/**\n * Returns the last child node that is an element.\n * @param {Node} node The node to get the last child element of.\n * @return {Element} The last child node of `node` that is an element.\n */\ngoog.dom.getLastElementChild = function(node) {\n  if (node.lastElementChild !== undefined) {\n    return /** @type {!Element} */ (node).lastElementChild;\n  }\n  return goog.dom.getNextElementNode_(node.lastChild, false);\n};\n\n\n/**\n * Returns the first next sibling that is an element.\n * @param {Node} node The node to get the next sibling element of.\n * @return {Element} The next sibling of `node` that is an element.\n */\ngoog.dom.getNextElementSibling = function(node) {\n  if (node.nextElementSibling !== undefined) {\n    return /** @type {!Element} */ (node).nextElementSibling;\n  }\n  return goog.dom.getNextElementNode_(node.nextSibling, true);\n};\n\n\n/**\n * Returns the first previous sibling that is an element.\n * @param {Node} node The node to get the previous sibling element of.\n * @return {Element} The first previous sibling of `node` that is\n *     an element.\n */\ngoog.dom.getPreviousElementSibling = function(node) {\n  if (node.previousElementSibling !== undefined) {\n    return /** @type {!Element} */ (node).previousElementSibling;\n  }\n  return goog.dom.getNextElementNode_(node.previousSibling, false);\n};\n\n\n/**\n * Returns the first node that is an element in the specified direction,\n * starting with `node`.\n * @param {Node} node The node to get the next element from.\n * @param {boolean} forward Whether to look forwards or backwards.\n * @return {Element} The first element.\n * @private\n */\ngoog.dom.getNextElementNode_ = function(node, forward) {\n  while (node && node.nodeType != goog.dom.NodeType.ELEMENT) {\n    node = forward ? node.nextSibling : node.previousSibling;\n  }\n\n  return /** @type {Element} */ (node);\n};\n\n\n/**\n * Returns the next node in source order from the given node.\n * @param {Node} node The node.\n * @return {Node} The next node in the DOM tree, or null if this was the last\n *     node.\n */\ngoog.dom.getNextNode = function(node) {\n  if (!node) {\n    return null;\n  }\n\n  if (node.firstChild) {\n    return node.firstChild;\n  }\n\n  while (node && !node.nextSibling) {\n    node = node.parentNode;\n  }\n\n  return node ? node.nextSibling : null;\n};\n\n\n/**\n * Returns the previous node in source order from the given node.\n * @param {Node} node The node.\n * @return {Node} The previous node in the DOM tree, or null if this was the\n *     first node.\n */\ngoog.dom.getPreviousNode = function(node) {\n  if (!node) {\n    return null;\n  }\n\n  if (!node.previousSibling) {\n    return node.parentNode;\n  }\n\n  node = node.previousSibling;\n  while (node && node.lastChild) {\n    node = node.lastChild;\n  }\n\n  return node;\n};\n\n\n/**\n * Whether the object looks like a DOM node.\n * @param {?} obj The object being tested for node likeness.\n * @return {boolean} Whether the object looks like a DOM node.\n */\ngoog.dom.isNodeLike = function(obj) {\n  return goog.isObject(obj) && obj.nodeType > 0;\n};\n\n\n/**\n * Whether the object looks like an Element.\n * @param {?} obj The object being tested for Element likeness.\n * @return {boolean} Whether the object looks like an Element.\n */\ngoog.dom.isElement = function(obj) {\n  return goog.isObject(obj) && obj.nodeType == goog.dom.NodeType.ELEMENT;\n};\n\n\n/**\n * Returns true if the specified value is a Window object. This includes the\n * global window for HTML pages, and iframe windows.\n * @param {?} obj Variable to test.\n * @return {boolean} Whether the variable is a window.\n */\ngoog.dom.isWindow = function(obj) {\n  return goog.isObject(obj) && obj['window'] == obj;\n};\n\n\n/**\n * Returns an element's parent, if it's an Element.\n * @param {Element} element The DOM element.\n * @return {Element} The parent, or null if not an Element.\n */\ngoog.dom.getParentElement = function(element) {\n  var parent;\n  if (goog.dom.BrowserFeature.CAN_USE_PARENT_ELEMENT_PROPERTY) {\n    var isIe9 = goog.userAgent.IE && goog.userAgent.isVersionOrHigher('9') &&\n        !goog.userAgent.isVersionOrHigher('10');\n    // SVG elements in IE9 can't use the parentElement property.\n    // goog.global['SVGElement'] is not defined in IE9 quirks mode.\n    if (!(isIe9 && goog.global['SVGElement'] &&\n          element instanceof goog.global['SVGElement'])) {\n      parent = element.parentElement;\n      if (parent) {\n        return parent;\n      }\n    }\n  }\n  parent = element.parentNode;\n  return goog.dom.isElement(parent) ? /** @type {!Element} */ (parent) : null;\n};\n\n\n/**\n * Whether a node contains another node.\n * @param {?Node|undefined} parent The node that should contain the other node.\n * @param {?Node|undefined} descendant The node to test presence of.\n * @return {boolean} Whether the parent node contains the descendant node.\n */\ngoog.dom.contains = function(parent, descendant) {\n  if (!parent || !descendant) {\n    return false;\n  }\n  // We use browser specific methods for this if available since it is faster\n  // that way.\n\n  // IE DOM\n  if (parent.contains && descendant.nodeType == goog.dom.NodeType.ELEMENT) {\n    return parent == descendant || parent.contains(descendant);\n  }\n\n  // W3C DOM Level 3\n  if (typeof parent.compareDocumentPosition != 'undefined') {\n    return parent == descendant ||\n        Boolean(parent.compareDocumentPosition(descendant) & 16);\n  }\n\n  // W3C DOM Level 1\n  while (descendant && parent != descendant) {\n    descendant = descendant.parentNode;\n  }\n  return descendant == parent;\n};\n\n\n/**\n * Compares the document order of two nodes, returning 0 if they are the same\n * node, a negative number if node1 is before node2, and a positive number if\n * node2 is before node1.  Note that we compare the order the tags appear in the\n * document so in the tree <b><i>text</i></b> the B node is considered to be\n * before the I node.\n *\n * @param {Node} node1 The first node to compare.\n * @param {Node} node2 The second node to compare.\n * @return {number} 0 if the nodes are the same node, a negative number if node1\n *     is before node2, and a positive number if node2 is before node1.\n */\ngoog.dom.compareNodeOrder = function(node1, node2) {\n  // Fall out quickly for equality.\n  if (node1 == node2) {\n    return 0;\n  }\n\n  // Use compareDocumentPosition where available\n  if (node1.compareDocumentPosition) {\n    // 4 is the bitmask for FOLLOWS.\n    return node1.compareDocumentPosition(node2) & 2 ? 1 : -1;\n  }\n\n  // Special case for document nodes on IE 7 and 8.\n  if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(9)) {\n    if (node1.nodeType == goog.dom.NodeType.DOCUMENT) {\n      return -1;\n    }\n    if (node2.nodeType == goog.dom.NodeType.DOCUMENT) {\n      return 1;\n    }\n  }\n\n  // Process in IE using sourceIndex - we check to see if the first node has\n  // a source index or if its parent has one.\n  if ('sourceIndex' in node1 ||\n      (node1.parentNode && 'sourceIndex' in node1.parentNode)) {\n    var isElement1 = node1.nodeType == goog.dom.NodeType.ELEMENT;\n    var isElement2 = node2.nodeType == goog.dom.NodeType.ELEMENT;\n\n    if (isElement1 && isElement2) {\n      return node1.sourceIndex - node2.sourceIndex;\n    } else {\n      var parent1 = node1.parentNode;\n      var parent2 = node2.parentNode;\n\n      if (parent1 == parent2) {\n        return goog.dom.compareSiblingOrder_(node1, node2);\n      }\n\n      if (!isElement1 && goog.dom.contains(parent1, node2)) {\n        return -1 * goog.dom.compareParentsDescendantNodeIe_(node1, node2);\n      }\n\n\n      if (!isElement2 && goog.dom.contains(parent2, node1)) {\n        return goog.dom.compareParentsDescendantNodeIe_(node2, node1);\n      }\n\n      return (isElement1 ? node1.sourceIndex : parent1.sourceIndex) -\n          (isElement2 ? node2.sourceIndex : parent2.sourceIndex);\n    }\n  }\n\n  // For Safari, we compare ranges.\n  var doc = goog.dom.getOwnerDocument(node1);\n\n  var range1, range2;\n  range1 = doc.createRange();\n  range1.selectNode(node1);\n  range1.collapse(true);\n\n  range2 = doc.createRange();\n  range2.selectNode(node2);\n  range2.collapse(true);\n\n  return range1.compareBoundaryPoints(\n      goog.global['Range'].START_TO_END, range2);\n};\n\n\n/**\n * Utility function to compare the position of two nodes, when\n * `textNode`'s parent is an ancestor of `node`.  If this entry\n * condition is not met, this function will attempt to reference a null object.\n * @param {!Node} textNode The textNode to compare.\n * @param {Node} node The node to compare.\n * @return {number} -1 if node is before textNode, +1 otherwise.\n * @private\n */\ngoog.dom.compareParentsDescendantNodeIe_ = function(textNode, node) {\n  var parent = textNode.parentNode;\n  if (parent == node) {\n    // If textNode is a child of node, then node comes first.\n    return -1;\n  }\n  var sibling = node;\n  while (sibling.parentNode != parent) {\n    sibling = sibling.parentNode;\n  }\n  return goog.dom.compareSiblingOrder_(sibling, textNode);\n};\n\n\n/**\n * Utility function to compare the position of two nodes known to be non-equal\n * siblings.\n * @param {Node} node1 The first node to compare.\n * @param {!Node} node2 The second node to compare.\n * @return {number} -1 if node1 is before node2, +1 otherwise.\n * @private\n */\ngoog.dom.compareSiblingOrder_ = function(node1, node2) {\n  var s = node2;\n  while ((s = s.previousSibling)) {\n    if (s == node1) {\n      // We just found node1 before node2.\n      return -1;\n    }\n  }\n\n  // Since we didn't find it, node1 must be after node2.\n  return 1;\n};\n\n\n/**\n * Find the deepest common ancestor of the given nodes.\n * @param {...Node} var_args The nodes to find a common ancestor of.\n * @return {Node} The common ancestor of the nodes, or null if there is none.\n *     null will only be returned if two or more of the nodes are from different\n *     documents.\n */\ngoog.dom.findCommonAncestor = function(var_args) {\n  var i, count = arguments.length;\n  if (!count) {\n    return null;\n  } else if (count == 1) {\n    return arguments[0];\n  }\n\n  var paths = [];\n  var minLength = Infinity;\n  for (i = 0; i < count; i++) {\n    // Compute the list of ancestors.\n    var ancestors = [];\n    var node = arguments[i];\n    while (node) {\n      ancestors.unshift(node);\n      node = node.parentNode;\n    }\n\n    // Save the list for comparison.\n    paths.push(ancestors);\n    minLength = Math.min(minLength, ancestors.length);\n  }\n  var output = null;\n  for (i = 0; i < minLength; i++) {\n    var first = paths[0][i];\n    for (var j = 1; j < count; j++) {\n      if (first != paths[j][i]) {\n        return output;\n      }\n    }\n    output = first;\n  }\n  return output;\n};\n\n\n/**\n * Returns whether node is in a document or detached. Throws an error if node\n * itself is a document. This specifically handles two cases beyond naive use of\n * builtins: (1) it works correctly in IE, and (2) it works for elements from\n * different documents/iframes. If neither of these considerations are relevant\n * then a simple `document.contains(node)` may be used instead.\n * @param {!Node} node\n * @return {boolean}\n */\ngoog.dom.isInDocument = function(node) {\n  return (node.ownerDocument.compareDocumentPosition(node) & 16) == 16;\n};\n\n\n/**\n * Returns the owner document for a node.\n * @param {Node|Window} node The node to get the document for.\n * @return {!Document} The document owning the node.\n */\ngoog.dom.getOwnerDocument = function(node) {\n  // TODO(nnaze): Update param signature to be non-nullable.\n  goog.asserts.assert(node, 'Node cannot be null or undefined.');\n  return /** @type {!Document} */ (\n      node.nodeType == goog.dom.NodeType.DOCUMENT ? node : node.ownerDocument ||\n              node.document);\n};\n\n\n/**\n * Cross-browser function for getting the document element of a frame or iframe.\n * @param {Element} frame Frame element.\n * @return {!Document} The frame content document.\n */\ngoog.dom.getFrameContentDocument = function(frame) {\n  return frame.contentDocument ||\n      /** @type {!HTMLFrameElement} */ (frame).contentWindow.document;\n};\n\n\n/**\n * Cross-browser function for getting the window of a frame or iframe.\n * @param {Element} frame Frame element.\n * @return {Window} The window associated with the given frame, or null if none\n *     exists.\n */\ngoog.dom.getFrameContentWindow = function(frame) {\n  try {\n    return frame.contentWindow ||\n        (frame.contentDocument ? goog.dom.getWindow(frame.contentDocument) :\n                                 null);\n  } catch (e) {\n    // NOTE(user): In IE8, checking the contentWindow or contentDocument\n    // properties will throw a \"Unspecified Error\" exception if the iframe is\n    // not inserted in the DOM. If we get this we can be sure that no window\n    // exists, so return null.\n  }\n  return null;\n};\n\n\n/**\n * Sets the text content of a node, with cross-browser support.\n * @param {Node} node The node to change the text content of.\n * @param {string|number} text The value that should replace the node's content.\n */\ngoog.dom.setTextContent = function(node, text) {\n  goog.asserts.assert(\n      node != null,\n      'goog.dom.setTextContent expects a non-null value for node');\n\n  if ('textContent' in node) {\n    node.textContent = text;\n  } else if (node.nodeType == goog.dom.NodeType.TEXT) {\n    /** @type {!Text} */ (node).data = String(text);\n  } else if (\n      node.firstChild && node.firstChild.nodeType == goog.dom.NodeType.TEXT) {\n    // If the first child is a text node we just change its data and remove the\n    // rest of the children.\n    while (node.lastChild != node.firstChild) {\n      node.removeChild(goog.asserts.assert(node.lastChild));\n    }\n    /** @type {!Text} */ (node.firstChild).data = String(text);\n  } else {\n    goog.dom.removeChildren(node);\n    var doc = goog.dom.getOwnerDocument(node);\n    node.appendChild(doc.createTextNode(String(text)));\n  }\n};\n\n\n/**\n * Gets the outerHTML of a node, which is like innerHTML, except that it\n * actually contains the HTML of the node itself.\n * @param {Element} element The element to get the HTML of.\n * @return {string} The outerHTML of the given element.\n */\ngoog.dom.getOuterHtml = function(element) {\n  goog.asserts.assert(\n      element !== null,\n      'goog.dom.getOuterHtml expects a non-null value for element');\n  // IE, Opera and WebKit all have outerHTML.\n  if ('outerHTML' in element) {\n    return element.outerHTML;\n  } else {\n    var doc = goog.dom.getOwnerDocument(element);\n    var div = goog.dom.createElement_(doc, goog.dom.TagName.DIV);\n    div.appendChild(element.cloneNode(true));\n    return div.innerHTML;\n  }\n};\n\n\n/**\n * Finds the first descendant node that matches the filter function, using depth\n * first search. This function offers the most general purpose way of finding a\n * matching element.\n *\n * Prefer using `querySelector` if the matching criteria can be expressed as a\n * CSS selector, or `goog.dom.findElement` if you would filter for `nodeType ==\n * Node.ELEMENT_NODE`.\n *\n * @param {Node} root The root of the tree to search.\n * @param {function(Node) : boolean} p The filter function.\n * @return {Node|undefined} The found node or undefined if none is found.\n */\ngoog.dom.findNode = function(root, p) {\n  var rv = [];\n  var found = goog.dom.findNodes_(root, p, rv, true);\n  return found ? rv[0] : undefined;\n};\n\n\n/**\n * Finds all the descendant nodes that match the filter function, using depth\n * first search. This function offers the most general-purpose way\n * of finding a set of matching elements.\n *\n * Prefer using `querySelectorAll` if the matching criteria can be expressed as\n * a CSS selector, or `goog.dom.findElements` if you would filter for\n * `nodeType == Node.ELEMENT_NODE`.\n *\n * @param {Node} root The root of the tree to search.\n * @param {function(Node) : boolean} p The filter function.\n * @return {!Array<!Node>} The found nodes or an empty array if none are found.\n */\ngoog.dom.findNodes = function(root, p) {\n  var rv = [];\n  goog.dom.findNodes_(root, p, rv, false);\n  return rv;\n};\n\n\n/**\n * Finds the first or all the descendant nodes that match the filter function,\n * using a depth first search.\n * @param {Node} root The root of the tree to search.\n * @param {function(Node) : boolean} p The filter function.\n * @param {!Array<!Node>} rv The found nodes are added to this array.\n * @param {boolean} findOne If true we exit after the first found node.\n * @return {boolean} Whether the search is complete or not. True in case findOne\n *     is true and the node is found. False otherwise.\n * @private\n */\ngoog.dom.findNodes_ = function(root, p, rv, findOne) {\n  if (root != null) {\n    var child = root.firstChild;\n    while (child) {\n      if (p(child)) {\n        rv.push(child);\n        if (findOne) {\n          return true;\n        }\n      }\n      if (goog.dom.findNodes_(child, p, rv, findOne)) {\n        return true;\n      }\n      child = child.nextSibling;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Finds the first descendant element (excluding `root`) that matches the filter\n * function, using depth first search. Prefer using `querySelector` if the\n * matching criteria can be expressed as a CSS selector.\n *\n * @param {!Element | !Document} root\n * @param {function(!Element): boolean} pred Filter function.\n * @return {?Element} First matching element or null if there is none.\n */\ngoog.dom.findElement = function(root, pred) {\n  var stack = goog.dom.getChildrenReverse_(root);\n  while (stack.length > 0) {\n    var next = stack.pop();\n    if (pred(next)) return next;\n    for (var c = next.lastElementChild; c; c = c.previousElementSibling) {\n      stack.push(c);\n    }\n  }\n  return null;\n};\n\n\n/**\n * Finds all the descendant elements (excluding `root`) that match the filter\n * function, using depth first search. Prefer using `querySelectorAll` if the\n * matching criteria can be expressed as a CSS selector.\n *\n * @param {!Element | !Document} root\n * @param {function(!Element): boolean} pred Filter function.\n * @return {!Array<!Element>}\n */\ngoog.dom.findElements = function(root, pred) {\n  var result = [], stack = goog.dom.getChildrenReverse_(root);\n  while (stack.length > 0) {\n    var next = stack.pop();\n    if (pred(next)) result.push(next);\n    for (var c = next.lastElementChild; c; c = c.previousElementSibling) {\n      stack.push(c);\n    }\n  }\n  return result;\n};\n\n\n/**\n * @param {!Element | !Document} node\n * @return {!Array<!Element>} node's child elements in reverse order.\n * @private\n */\ngoog.dom.getChildrenReverse_ = function(node) {\n  // document.lastElementChild doesn't exist in IE9; fall back to\n  // documentElement.\n  if (node.nodeType == goog.dom.NodeType.DOCUMENT) {\n    return [node.documentElement];\n  } else {\n    var children = [];\n    for (var c = node.lastElementChild; c; c = c.previousElementSibling) {\n      children.push(c);\n    }\n    return children;\n  }\n};\n\n\n/**\n * Map of tags whose content to ignore when calculating text length.\n * @private {!Object<string, number>}\n * @const\n */\ngoog.dom.TAGS_TO_IGNORE_ = {\n  'SCRIPT': 1,\n  'STYLE': 1,\n  'HEAD': 1,\n  'IFRAME': 1,\n  'OBJECT': 1\n};\n\n\n/**\n * Map of tags which have predefined values with regard to whitespace.\n * @private {!Object<string, string>}\n * @const\n */\ngoog.dom.PREDEFINED_TAG_VALUES_ = {\n  'IMG': ' ',\n  'BR': '\\n'\n};\n\n\n/**\n * Returns true if the element has a tab index that allows it to receive\n * keyboard focus (tabIndex >= 0), false otherwise.  Note that some elements\n * natively support keyboard focus, even if they have no tab index.\n * @param {!Element} element Element to check.\n * @return {boolean} Whether the element has a tab index that allows keyboard\n *     focus.\n */\ngoog.dom.isFocusableTabIndex = function(element) {\n  return goog.dom.hasSpecifiedTabIndex_(element) &&\n      goog.dom.isTabIndexFocusable_(element);\n};\n\n\n/**\n * Enables or disables keyboard focus support on the element via its tab index.\n * Only elements for which {@link goog.dom.isFocusableTabIndex} returns true\n * (or elements that natively support keyboard focus, like form elements) can\n * receive keyboard focus.  See http://go/tabindex for more info.\n * @param {Element} element Element whose tab index is to be changed.\n * @param {boolean} enable Whether to set or remove a tab index on the element\n *     that supports keyboard focus.\n */\ngoog.dom.setFocusableTabIndex = function(element, enable) {\n  if (enable) {\n    element.tabIndex = 0;\n  } else {\n    // Set tabIndex to -1 first, then remove it. This is a workaround for\n    // Safari (confirmed in version 4 on Windows). When removing the attribute\n    // without setting it to -1 first, the element remains keyboard focusable\n    // despite not having a tabIndex attribute anymore.\n    element.tabIndex = -1;\n    element.removeAttribute('tabIndex');  // Must be camelCase!\n  }\n};\n\n\n/**\n * Returns true if the element can be focused, i.e. it has a tab index that\n * allows it to receive keyboard focus (tabIndex >= 0), or it is an element\n * that natively supports keyboard focus.\n * @param {!Element} element Element to check.\n * @return {boolean} Whether the element allows keyboard focus.\n */\ngoog.dom.isFocusable = function(element) {\n  var focusable;\n  // Some elements can have unspecified tab index and still receive focus.\n  if (goog.dom.nativelySupportsFocus_(element)) {\n    // Make sure the element is not disabled ...\n    focusable = !element.disabled &&\n        // ... and if a tab index is specified, it allows focus.\n        (!goog.dom.hasSpecifiedTabIndex_(element) ||\n         goog.dom.isTabIndexFocusable_(element));\n  } else {\n    focusable = goog.dom.isFocusableTabIndex(element);\n  }\n\n  // IE requires elements to be visible in order to focus them.\n  return focusable && goog.userAgent.IE ?\n      goog.dom.hasNonZeroBoundingRect_(/** @type {!HTMLElement} */ (element)) :\n      focusable;\n};\n\n\n/**\n * Returns true if the element has a specified tab index.\n * @param {!Element} element Element to check.\n * @return {boolean} Whether the element has a specified tab index.\n * @private\n */\ngoog.dom.hasSpecifiedTabIndex_ = function(element) {\n  // IE8 and below don't support hasAttribute(), instead check whether the\n  // 'tabindex' attributeNode is specified. Otherwise check hasAttribute().\n  if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('9')) {\n    var attrNode = element.getAttributeNode('tabindex');  // Must be lowercase!\n    return attrNode != null && attrNode.specified;\n  } else {\n    return element.hasAttribute('tabindex');\n  }\n};\n\n\n/**\n * Returns true if the element's tab index allows the element to be focused.\n * @param {!Element} element Element to check.\n * @return {boolean} Whether the element's tab index allows focus.\n * @private\n */\ngoog.dom.isTabIndexFocusable_ = function(element) {\n  var index = /** @type {!HTMLElement} */ (element).tabIndex;\n  // NOTE: IE9 puts tabIndex in 16-bit int, e.g. -2 is 65534.\n  return typeof (index) === 'number' && index >= 0 && index < 32768;\n};\n\n\n/**\n * Returns true if the element is focusable even when tabIndex is not set.\n * @param {!Element} element Element to check.\n * @return {boolean} Whether the element natively supports focus.\n * @private\n */\ngoog.dom.nativelySupportsFocus_ = function(element) {\n  return (\n      element.tagName == goog.dom.TagName.A && element.hasAttribute('href') ||\n      element.tagName == goog.dom.TagName.INPUT ||\n      element.tagName == goog.dom.TagName.TEXTAREA ||\n      element.tagName == goog.dom.TagName.SELECT ||\n      element.tagName == goog.dom.TagName.BUTTON);\n};\n\n\n/**\n * Returns true if the element has a bounding rectangle that would be visible\n * (i.e. its width and height are greater than zero).\n * @param {!HTMLElement} element Element to check.\n * @return {boolean} Whether the element has a non-zero bounding rectangle.\n * @private\n */\ngoog.dom.hasNonZeroBoundingRect_ = function(element) {\n  var rect;\n  if (!goog.isFunction(element['getBoundingClientRect']) ||\n      // In IE, getBoundingClientRect throws on detached nodes.\n      (goog.userAgent.IE && element.parentElement == null)) {\n    rect = {'height': element.offsetHeight, 'width': element.offsetWidth};\n  } else {\n    rect = element.getBoundingClientRect();\n  }\n  return rect != null && rect.height > 0 && rect.width > 0;\n};\n\n\n/**\n * Returns the text content of the current node, without markup and invisible\n * symbols. New lines are stripped and whitespace is collapsed,\n * such that each character would be visible.\n *\n * In browsers that support it, innerText is used.  Other browsers attempt to\n * simulate it via node traversal.  Line breaks are canonicalized in IE.\n *\n * @param {Node} node The node from which we are getting content.\n * @return {string} The text content.\n */\ngoog.dom.getTextContent = function(node) {\n  var textContent;\n  // Note(arv): IE9, Opera, and Safari 3 support innerText but they include\n  // text nodes in script tags. So we revert to use a user agent test here.\n  if (goog.dom.BrowserFeature.CAN_USE_INNER_TEXT && node !== null &&\n      ('innerText' in node)) {\n    textContent = goog.string.canonicalizeNewlines(node.innerText);\n    // Unfortunately .innerText() returns text with &shy; symbols\n    // We need to filter it out and then remove duplicate whitespaces\n  } else {\n    var buf = [];\n    goog.dom.getTextContent_(node, buf, true);\n    textContent = buf.join('');\n  }\n\n  // Strip &shy; entities. goog.format.insertWordBreaks inserts them in Opera.\n  textContent = textContent.replace(/ \\xAD /g, ' ').replace(/\\xAD/g, '');\n  // Strip &#8203; entities. goog.format.insertWordBreaks inserts them in IE8.\n  textContent = textContent.replace(/\\u200B/g, '');\n\n  // Skip this replacement on old browsers with working innerText, which\n  // automatically turns &nbsp; into ' ' and / +/ into ' ' when reading\n  // innerText.\n  if (!goog.dom.BrowserFeature.CAN_USE_INNER_TEXT) {\n    textContent = textContent.replace(/ +/g, ' ');\n  }\n  if (textContent != ' ') {\n    textContent = textContent.replace(/^\\s*/, '');\n  }\n\n  return textContent;\n};\n\n\n/**\n * Returns the text content of the current node, without markup.\n *\n * Unlike `getTextContent` this method does not collapse whitespaces\n * or normalize lines breaks.\n *\n * @param {Node} node The node from which we are getting content.\n * @return {string} The raw text content.\n */\ngoog.dom.getRawTextContent = function(node) {\n  var buf = [];\n  goog.dom.getTextContent_(node, buf, false);\n\n  return buf.join('');\n};\n\n\n/**\n * Recursive support function for text content retrieval.\n *\n * @param {Node} node The node from which we are getting content.\n * @param {Array<string>} buf string buffer.\n * @param {boolean} normalizeWhitespace Whether to normalize whitespace.\n * @private\n */\ngoog.dom.getTextContent_ = function(node, buf, normalizeWhitespace) {\n  if (node.nodeName in goog.dom.TAGS_TO_IGNORE_) {\n    // ignore certain tags\n  } else if (node.nodeType == goog.dom.NodeType.TEXT) {\n    if (normalizeWhitespace) {\n      buf.push(String(node.nodeValue).replace(/(\\r\\n|\\r|\\n)/g, ''));\n    } else {\n      buf.push(node.nodeValue);\n    }\n  } else if (node.nodeName in goog.dom.PREDEFINED_TAG_VALUES_) {\n    buf.push(goog.dom.PREDEFINED_TAG_VALUES_[node.nodeName]);\n  } else {\n    var child = node.firstChild;\n    while (child) {\n      goog.dom.getTextContent_(child, buf, normalizeWhitespace);\n      child = child.nextSibling;\n    }\n  }\n};\n\n\n/**\n * Returns the text length of the text contained in a node, without markup. This\n * is equivalent to the selection length if the node was selected, or the number\n * of cursor movements to traverse the node. Images & BRs take one space.  New\n * lines are ignored.\n *\n * @param {Node} node The node whose text content length is being calculated.\n * @return {number} The length of `node`'s text content.\n */\ngoog.dom.getNodeTextLength = function(node) {\n  return goog.dom.getTextContent(node).length;\n};\n\n\n/**\n * Returns the text offset of a node relative to one of its ancestors. The text\n * length is the same as the length calculated by goog.dom.getNodeTextLength.\n *\n * @param {Node} node The node whose offset is being calculated.\n * @param {Node=} opt_offsetParent The node relative to which the offset will\n *     be calculated. Defaults to the node's owner document's body.\n * @return {number} The text offset.\n */\ngoog.dom.getNodeTextOffset = function(node, opt_offsetParent) {\n  var root = opt_offsetParent || goog.dom.getOwnerDocument(node).body;\n  var buf = [];\n  while (node && node != root) {\n    var cur = node;\n    while ((cur = cur.previousSibling)) {\n      buf.unshift(goog.dom.getTextContent(cur));\n    }\n    node = node.parentNode;\n  }\n  // Trim left to deal with FF cases when there might be line breaks and empty\n  // nodes at the front of the text\n  return goog.string.trimLeft(buf.join('')).replace(/ +/g, ' ').length;\n};\n\n\n/**\n * Returns the node at a given offset in a parent node.  If an object is\n * provided for the optional third parameter, the node and the remainder of the\n * offset will stored as properties of this object.\n * @param {Node} parent The parent node.\n * @param {number} offset The offset into the parent node.\n * @param {Object=} opt_result Object to be used to store the return value. The\n *     return value will be stored in the form {node: Node, remainder: number}\n *     if this object is provided.\n * @return {Node} The node at the given offset.\n */\ngoog.dom.getNodeAtOffset = function(parent, offset, opt_result) {\n  var stack = [parent], pos = 0, cur = null;\n  while (stack.length > 0 && pos < offset) {\n    cur = stack.pop();\n    if (cur.nodeName in goog.dom.TAGS_TO_IGNORE_) {\n      // ignore certain tags\n    } else if (cur.nodeType == goog.dom.NodeType.TEXT) {\n      var text = cur.nodeValue.replace(/(\\r\\n|\\r|\\n)/g, '').replace(/ +/g, ' ');\n      pos += text.length;\n    } else if (cur.nodeName in goog.dom.PREDEFINED_TAG_VALUES_) {\n      pos += goog.dom.PREDEFINED_TAG_VALUES_[cur.nodeName].length;\n    } else {\n      for (var i = cur.childNodes.length - 1; i >= 0; i--) {\n        stack.push(cur.childNodes[i]);\n      }\n    }\n  }\n  if (goog.isObject(opt_result)) {\n    opt_result.remainder = cur ? cur.nodeValue.length + offset - pos - 1 : 0;\n    opt_result.node = cur;\n  }\n\n  return cur;\n};\n\n\n/**\n * Returns true if the object is a `NodeList`.  To qualify as a NodeList,\n * the object must have a numeric length property and an item function (which\n * has type 'string' on IE for some reason).\n * @param {Object} val Object to test.\n * @return {boolean} Whether the object is a NodeList.\n */\ngoog.dom.isNodeList = function(val) {\n  // TODO(attila): Now the isNodeList is part of goog.dom we can use\n  // goog.userAgent to make this simpler.\n  // A NodeList must have a length property of type 'number' on all platforms.\n  if (val && typeof val.length == 'number') {\n    // A NodeList is an object everywhere except Safari, where it's a function.\n    if (goog.isObject(val)) {\n      // A NodeList must have an item function (on non-IE platforms) or an item\n      // property of type 'string' (on IE).\n      return typeof val.item == 'function' || typeof val.item == 'string';\n    } else if (goog.isFunction(val)) {\n      // On Safari, a NodeList is a function with an item property that is also\n      // a function.\n      return typeof /** @type {?} */ (val.item) == 'function';\n    }\n  }\n\n  // Not a NodeList.\n  return false;\n};\n\n\n/**\n * Walks up the DOM hierarchy returning the first ancestor that has the passed\n * tag name and/or class name. If the passed element matches the specified\n * criteria, the element itself is returned.\n * @param {Node} element The DOM node to start with.\n * @param {?(goog.dom.TagName<T>|string)=} opt_tag The tag name to match (or\n *     null/undefined to match only based on class name).\n * @param {?string=} opt_class The class name to match (or null/undefined to\n *     match only based on tag name).\n * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the\n *     dom.\n * @return {?R} The first ancestor that matches the passed criteria, or\n *     null if no match is found. The return type is {?Element} if opt_tag is\n *     not a member of goog.dom.TagName or a more specific type if it is (e.g.\n *     {?HTMLAnchorElement} for goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n */\ngoog.dom.getAncestorByTagNameAndClass = function(\n    element, opt_tag, opt_class, opt_maxSearchSteps) {\n  if (!opt_tag && !opt_class) {\n    return null;\n  }\n  var tagName = opt_tag ? String(opt_tag).toUpperCase() : null;\n  return /** @type {Element} */ (goog.dom.getAncestor(element, function(node) {\n    return (!tagName || node.nodeName == tagName) &&\n        (!opt_class ||\n         typeof node.className === 'string' &&\n             goog.array.contains(node.className.split(/\\s+/), opt_class));\n  }, true, opt_maxSearchSteps));\n};\n\n\n/**\n * Walks up the DOM hierarchy returning the first ancestor that has the passed\n * class name. If the passed element matches the specified criteria, the\n * element itself is returned.\n * @param {Node} element The DOM node to start with.\n * @param {string} className The class name to match.\n * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the\n *     dom.\n * @return {Element} The first ancestor that matches the passed criteria, or\n *     null if none match.\n */\ngoog.dom.getAncestorByClass = function(element, className, opt_maxSearchSteps) {\n  return goog.dom.getAncestorByTagNameAndClass(\n      element, null, className, opt_maxSearchSteps);\n};\n\n\n/**\n * Walks up the DOM hierarchy returning the first ancestor that passes the\n * matcher function.\n * @param {Node} element The DOM node to start with.\n * @param {function(Node) : boolean} matcher A function that returns true if the\n *     passed node matches the desired criteria.\n * @param {boolean=} opt_includeNode If true, the node itself is included in\n *     the search (the first call to the matcher will pass startElement as\n *     the node to test).\n * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the\n *     dom.\n * @return {Node} DOM node that matched the matcher, or null if there was\n *     no match.\n */\ngoog.dom.getAncestor = function(\n    element, matcher, opt_includeNode, opt_maxSearchSteps) {\n  if (element && !opt_includeNode) {\n    element = element.parentNode;\n  }\n  var steps = 0;\n  while (element &&\n         (opt_maxSearchSteps == null || steps <= opt_maxSearchSteps)) {\n    goog.asserts.assert(element.name != 'parentNode');\n    if (matcher(element)) {\n      return element;\n    }\n    element = element.parentNode;\n    steps++;\n  }\n  // Reached the root of the DOM without a match\n  return null;\n};\n\n\n/**\n * Determines the active element in the given document.\n * @param {Document} doc The document to look in.\n * @return {Element} The active element.\n */\ngoog.dom.getActiveElement = function(doc) {\n  // While in an iframe, IE9 will throw \"Unspecified error\" when accessing\n  // activeElement.\n  try {\n    var activeElement = doc && doc.activeElement;\n    // While not in an iframe, IE9-11 sometimes gives null.\n    // While in an iframe, IE11 sometimes returns an empty object.\n    return activeElement && activeElement.nodeName ? activeElement : null;\n  } catch (e) {\n    return null;\n  }\n};\n\n\n/**\n * Gives the current devicePixelRatio.\n *\n * By default, this is the value of window.devicePixelRatio (which should be\n * preferred if present).\n *\n * If window.devicePixelRatio is not present, the ratio is calculated with\n * window.matchMedia, if present. Otherwise, gives 1.0.\n *\n * Some browsers (including Chrome) consider the browser zoom level in the pixel\n * ratio, so the value may change across multiple calls.\n *\n * @return {number} The number of actual pixels per virtual pixel.\n */\ngoog.dom.getPixelRatio = function() {\n  var win = goog.dom.getWindow();\n  if (win.devicePixelRatio !== undefined) {\n    return win.devicePixelRatio;\n  } else if (win.matchMedia) {\n    // Should be for IE10 and FF6-17 (this basically clamps to lower)\n    // Note that the order of these statements is important\n    return goog.dom.matchesPixelRatio_(3) || goog.dom.matchesPixelRatio_(2) ||\n           goog.dom.matchesPixelRatio_(1.5) || goog.dom.matchesPixelRatio_(1) ||\n           .75;\n  }\n  return 1;\n};\n\n\n/**\n * Calculates a mediaQuery to check if the current device supports the\n * given actual to virtual pixel ratio.\n * @param {number} pixelRatio The ratio of actual pixels to virtual pixels.\n * @return {number} pixelRatio if applicable, otherwise 0.\n * @private\n */\ngoog.dom.matchesPixelRatio_ = function(pixelRatio) {\n  var win = goog.dom.getWindow();\n  /**\n   * Due to the 1:96 fixed ratio of CSS in to CSS px, 1dppx is equivalent to\n   * 96dpi.\n   * @const {number}\n   */\n  var dpiPerDppx = 96;\n  var query =\n      // FF16-17\n      '(min-resolution: ' + pixelRatio + 'dppx),' +\n      // FF6-15\n      '(min--moz-device-pixel-ratio: ' + pixelRatio + '),' +\n      // IE10 (this works for the two browsers above too but I don't want to\n      // trust the 1:96 fixed ratio magic)\n      '(min-resolution: ' + (pixelRatio * dpiPerDppx) + 'dpi)';\n  return win.matchMedia(query).matches ? pixelRatio : 0;\n};\n\n\n/**\n * Gets '2d' context of a canvas. Shortcut for canvas.getContext('2d') with a\n * type information.\n * @param {!HTMLCanvasElement|!OffscreenCanvas} canvas\n * @return {!CanvasRenderingContext2D}\n */\ngoog.dom.getCanvasContext2D = function(canvas) {\n  return /** @type {!CanvasRenderingContext2D} */ (canvas.getContext('2d'));\n};\n\n\n\n/**\n * Create an instance of a DOM helper with a new document object.\n * @param {Document=} opt_document Document object to associate with this\n *     DOM helper.\n * @constructor\n */\ngoog.dom.DomHelper = function(opt_document) {\n  /**\n   * Reference to the document object to use\n   * @type {!Document}\n   * @private\n   */\n  this.document_ = opt_document || goog.global.document || document;\n};\n\n\n/**\n * Gets the dom helper object for the document where the element resides.\n * @param {Node=} opt_node If present, gets the DomHelper for this node.\n * @return {!goog.dom.DomHelper} The DomHelper.\n */\ngoog.dom.DomHelper.prototype.getDomHelper = goog.dom.getDomHelper;\n\n\n/**\n * Sets the document object.\n * @param {!Document} document Document object.\n */\ngoog.dom.DomHelper.prototype.setDocument = function(document) {\n  this.document_ = document;\n};\n\n\n/**\n * Gets the document object being used by the dom library.\n * @return {!Document} Document object.\n */\ngoog.dom.DomHelper.prototype.getDocument = function() {\n  return this.document_;\n};\n\n\n/**\n * Alias for `getElementById`. If a DOM node is passed in then we just\n * return that.\n * @param {string|Element} element Element ID or a DOM node.\n * @return {Element} The element with the given ID, or the node passed in.\n */\ngoog.dom.DomHelper.prototype.getElement = function(element) {\n  return goog.dom.getElementHelper_(this.document_, element);\n};\n\n\n/**\n * Gets an element by id, asserting that the element is found.\n *\n * This is used when an element is expected to exist, and should fail with\n * an assertion error if it does not (if assertions are enabled).\n *\n * @param {string} id Element ID.\n * @return {!Element} The element with the given ID, if it exists.\n */\ngoog.dom.DomHelper.prototype.getRequiredElement = function(id) {\n  return goog.dom.getRequiredElementHelper_(this.document_, id);\n};\n\n\n/**\n * Alias for `getElement`.\n * @param {string|Element} element Element ID or a DOM node.\n * @return {Element} The element with the given ID, or the node passed in.\n * @deprecated Use {@link goog.dom.DomHelper.prototype.getElement} instead.\n */\ngoog.dom.DomHelper.prototype.$ = goog.dom.DomHelper.prototype.getElement;\n\n\n/**\n * Gets elements by tag name.\n * @param {!goog.dom.TagName<T>} tagName\n * @param {(!Document|!Element)=} opt_parent Parent element or document where to\n *     look for elements. Defaults to document of this DomHelper.\n * @return {!NodeList<R>} List of elements. The members of the list are\n *     {!Element} if tagName is not a member of goog.dom.TagName or more\n *     specific types if it is (e.g. {!HTMLAnchorElement} for\n *     goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n */\ngoog.dom.DomHelper.prototype.getElementsByTagName =\n    function(tagName, opt_parent) {\n  var parent = opt_parent || this.document_;\n  return parent.getElementsByTagName(String(tagName));\n};\n\n\n/**\n * Looks up elements by both tag and class name, using browser native functions\n * (`querySelectorAll`, `getElementsByTagName` or\n * `getElementsByClassName`) where possible. The returned array is a live\n * NodeList or a static list depending on the code path taken.\n *\n * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name or * for all\n *     tags.\n * @param {?string=} opt_class Optional class name.\n * @param {(Document|Element)=} opt_el Optional element to look in.\n * @return {!IArrayLike<R>} Array-like list of elements (only a length property\n *     and numerical indices are guaranteed to exist). The members of the array\n *     are {!Element} if opt_tag is not a member of goog.dom.TagName or more\n *     specific types if it is (e.g. {!HTMLAnchorElement} for\n *     goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n */\ngoog.dom.DomHelper.prototype.getElementsByTagNameAndClass = function(\n    opt_tag, opt_class, opt_el) {\n  return goog.dom.getElementsByTagNameAndClass_(\n      this.document_, opt_tag, opt_class, opt_el);\n};\n\n\n/**\n * Gets the first element matching the tag and the class.\n *\n * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.\n * @param {?string=} opt_class Optional class name.\n * @param {(Document|Element)=} opt_el Optional element to look in.\n * @return {?R} Reference to a DOM node. The return type is {?Element} if\n *     tagName is a string or a more specific type if it is a member of\n *     goog.dom.TagName (e.g. {?HTMLAnchorElement} for goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n */\ngoog.dom.DomHelper.prototype.getElementByTagNameAndClass = function(\n    opt_tag, opt_class, opt_el) {\n  return goog.dom.getElementByTagNameAndClass_(\n      this.document_, opt_tag, opt_class, opt_el);\n};\n\n\n/**\n * Returns an array of all the elements with the provided className.\n * @param {string} className the name of the class to look for.\n * @param {Element|Document=} opt_el Optional element to look in.\n * @return {!IArrayLike<!Element>} The items found with the class name provided.\n */\ngoog.dom.DomHelper.prototype.getElementsByClass = function(className, opt_el) {\n  var doc = opt_el || this.document_;\n  return goog.dom.getElementsByClass(className, doc);\n};\n\n\n/**\n * Returns the first element we find matching the provided class name.\n * @param {string} className the name of the class to look for.\n * @param {(Element|Document)=} opt_el Optional element to look in.\n * @return {Element} The first item found with the class name provided.\n */\ngoog.dom.DomHelper.prototype.getElementByClass = function(className, opt_el) {\n  var doc = opt_el || this.document_;\n  return goog.dom.getElementByClass(className, doc);\n};\n\n\n/**\n * Ensures an element with the given className exists, and then returns the\n * first element with the provided className.\n * @param {string} className the name of the class to look for.\n * @param {(!Element|!Document)=} opt_root Optional element or document to look\n *     in.\n * @return {!Element} The first item found with the class name provided.\n * @throws {goog.asserts.AssertionError} Thrown if no element is found.\n */\ngoog.dom.DomHelper.prototype.getRequiredElementByClass = function(\n    className, opt_root) {\n  var root = opt_root || this.document_;\n  return goog.dom.getRequiredElementByClass(className, root);\n};\n\n\n/**\n * Alias for `getElementsByTagNameAndClass`.\n * @deprecated Use DomHelper getElementsByTagNameAndClass.\n *\n * @param {(string|?goog.dom.TagName<T>)=} opt_tag Element tag name.\n * @param {?string=} opt_class Optional class name.\n * @param {Element=} opt_el Optional element to look in.\n * @return {!IArrayLike<R>} Array-like list of elements (only a length property\n *     and numerical indices are guaranteed to exist). The members of the array\n *     are {!Element} if opt_tag is a string or more specific types if it is\n *     a member of goog.dom.TagName (e.g. {!HTMLAnchorElement} for\n *     goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n */\ngoog.dom.DomHelper.prototype.$$ =\n    goog.dom.DomHelper.prototype.getElementsByTagNameAndClass;\n\n\n/**\n * Sets a number of properties on a node.\n * @param {Element} element DOM node to set properties on.\n * @param {Object} properties Hash of property:value pairs.\n */\ngoog.dom.DomHelper.prototype.setProperties = goog.dom.setProperties;\n\n\n/**\n * Gets the dimensions of the viewport.\n * @param {Window=} opt_window Optional window element to test. Defaults to\n *     the window of the Dom Helper.\n * @return {!goog.math.Size} Object with values 'width' and 'height'.\n */\ngoog.dom.DomHelper.prototype.getViewportSize = function(opt_window) {\n  // TODO(arv): This should not take an argument. That breaks the rule of a\n  // a DomHelper representing a single frame/window/document.\n  return goog.dom.getViewportSize(opt_window || this.getWindow());\n};\n\n\n/**\n * Calculates the height of the document.\n *\n * @return {number} The height of the document.\n */\ngoog.dom.DomHelper.prototype.getDocumentHeight = function() {\n  return goog.dom.getDocumentHeight_(this.getWindow());\n};\n\n\n/**\n * Typedef for use with goog.dom.createDom and goog.dom.append.\n * @typedef {Object|string|Array|NodeList}\n */\ngoog.dom.Appendable;\n\n\n/**\n * Returns a dom node with a set of attributes.  This function accepts varargs\n * for subsequent nodes to be added.  Subsequent nodes will be added to the\n * first node as childNodes.\n *\n * So:\n * <code>createDom(goog.dom.TagName.DIV, null, createDom(goog.dom.TagName.P),\n * createDom(goog.dom.TagName.P));</code> would return a div with two child\n * paragraphs\n *\n * An easy way to move all child nodes of an existing element to a new parent\n * element is:\n * <code>createDom(goog.dom.TagName.DIV, null, oldElement.childNodes);</code>\n * which will remove all child nodes from the old element and add them as\n * child nodes of the new DIV.\n *\n * @param {string|!goog.dom.TagName<T>} tagName Tag to create.\n * @param {?Object|?Array<string>|string=} opt_attributes If object, then a map\n *     of name-value pairs for attributes. If a string, then this is the\n *     className of the new element. If an array, the elements will be joined\n *     together as the className of the new element.\n * @param {...(goog.dom.Appendable|undefined)} var_args Further DOM nodes or\n *     strings for text nodes. If one of the var_args is an array or\n *     NodeList, its elements will be added as childNodes instead.\n * @return {R} Reference to a DOM node. The return type is {!Element} if tagName\n *     is a string or a more specific type if it is a member of\n *     goog.dom.TagName (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n */\ngoog.dom.DomHelper.prototype.createDom = function(\n    tagName, opt_attributes, var_args) {\n  return goog.dom.createDom_(this.document_, arguments);\n};\n\n\n/**\n * Alias for `createDom`.\n * @param {string|!goog.dom.TagName<T>} tagName Tag to create.\n * @param {?Object|?Array<string>|string=} opt_attributes If object, then a map\n *     of name-value pairs for attributes. If a string, then this is the\n *     className of the new element. If an array, the elements will be joined\n *     together as the className of the new element.\n * @param {...(goog.dom.Appendable|undefined)} var_args Further DOM nodes or\n *     strings for text nodes.  If one of the var_args is an array, its children\n *     will be added as childNodes instead.\n * @return {R} Reference to a DOM node. The return type is {!Element} if tagName\n *     is a string or a more specific type if it is a member of\n *     goog.dom.TagName (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n * @deprecated Use {@link goog.dom.DomHelper.prototype.createDom} instead.\n */\ngoog.dom.DomHelper.prototype.$dom = goog.dom.DomHelper.prototype.createDom;\n\n\n/**\n * Creates a new element.\n * @param {string|!goog.dom.TagName<T>} name Tag to create.\n * @return {R} The new element. The return type is {!Element} if name is\n *     a string or a more specific type if it is a member of goog.dom.TagName\n *     (e.g. {!HTMLAnchorElement} for goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n */\ngoog.dom.DomHelper.prototype.createElement = function(name) {\n  return goog.dom.createElement_(this.document_, name);\n};\n\n\n/**\n * Creates a new text node.\n * @param {number|string} content Content.\n * @return {!Text} The new text node.\n */\ngoog.dom.DomHelper.prototype.createTextNode = function(content) {\n  return this.document_.createTextNode(String(content));\n};\n\n\n/**\n * Create a table.\n * @param {number} rows The number of rows in the table.  Must be >= 1.\n * @param {number} columns The number of columns in the table.  Must be >= 1.\n * @param {boolean=} opt_fillWithNbsp If true, fills table entries with\n *     `goog.string.Unicode.NBSP` characters.\n * @return {!HTMLElement} The created table.\n */\ngoog.dom.DomHelper.prototype.createTable = function(\n    rows, columns, opt_fillWithNbsp) {\n  return goog.dom.createTable_(\n      this.document_, rows, columns, !!opt_fillWithNbsp);\n};\n\n\n/**\n * Converts an HTML into a node or a document fragment. A single Node is used if\n * `html` only generates a single node. If `html` generates multiple\n * nodes then these are put inside a `DocumentFragment`. This is a safe\n * version of `goog.dom.DomHelper#htmlToDocumentFragment` which is now\n * deleted.\n * @param {!goog.html.SafeHtml} html The HTML markup to convert.\n * @return {!Node} The resulting node.\n */\ngoog.dom.DomHelper.prototype.safeHtmlToNode = function(html) {\n  return goog.dom.safeHtmlToNode_(this.document_, html);\n};\n\n\n/**\n * Returns true if the browser is in \"CSS1-compatible\" (standards-compliant)\n * mode, false otherwise.\n * @return {boolean} True if in CSS1-compatible mode.\n */\ngoog.dom.DomHelper.prototype.isCss1CompatMode = function() {\n  return goog.dom.isCss1CompatMode_(this.document_);\n};\n\n\n/**\n * Gets the window object associated with the document.\n * @return {!Window} The window associated with the given document.\n */\ngoog.dom.DomHelper.prototype.getWindow = function() {\n  return goog.dom.getWindow_(this.document_);\n};\n\n\n/**\n * Gets the document scroll element.\n * @return {!Element} Scrolling element.\n */\ngoog.dom.DomHelper.prototype.getDocumentScrollElement = function() {\n  return goog.dom.getDocumentScrollElement_(this.document_);\n};\n\n\n/**\n * Gets the document scroll distance as a coordinate object.\n * @return {!goog.math.Coordinate} Object with properties 'x' and 'y'.\n */\ngoog.dom.DomHelper.prototype.getDocumentScroll = function() {\n  return goog.dom.getDocumentScroll_(this.document_);\n};\n\n\n/**\n * Determines the active element in the given document.\n * @param {Document=} opt_doc The document to look in.\n * @return {Element} The active element.\n */\ngoog.dom.DomHelper.prototype.getActiveElement = function(opt_doc) {\n  return goog.dom.getActiveElement(opt_doc || this.document_);\n};\n\n\n/**\n * Appends a child to a node.\n * @param {Node} parent Parent.\n * @param {Node} child Child.\n */\ngoog.dom.DomHelper.prototype.appendChild = goog.dom.appendChild;\n\n\n/**\n * Appends a node with text or other nodes.\n * @param {!Node} parent The node to append nodes to.\n * @param {...goog.dom.Appendable} var_args The things to append to the node.\n *     If this is a Node it is appended as is.\n *     If this is a string then a text node is appended.\n *     If this is an array like object then fields 0 to length - 1 are appended.\n */\ngoog.dom.DomHelper.prototype.append = goog.dom.append;\n\n\n/**\n * Determines if the given node can contain children, intended to be used for\n * HTML generation.\n *\n * @param {Node} node The node to check.\n * @return {boolean} Whether the node can contain children.\n */\ngoog.dom.DomHelper.prototype.canHaveChildren = goog.dom.canHaveChildren;\n\n\n/**\n * Removes all the child nodes on a DOM node.\n * @param {Node} node Node to remove children from.\n */\ngoog.dom.DomHelper.prototype.removeChildren = goog.dom.removeChildren;\n\n\n/**\n * Inserts a new node before an existing reference node (i.e., as the previous\n * sibling). If the reference node has no parent, then does nothing.\n * @param {Node} newNode Node to insert.\n * @param {Node} refNode Reference node to insert before.\n */\ngoog.dom.DomHelper.prototype.insertSiblingBefore = goog.dom.insertSiblingBefore;\n\n\n/**\n * Inserts a new node after an existing reference node (i.e., as the next\n * sibling). If the reference node has no parent, then does nothing.\n * @param {Node} newNode Node to insert.\n * @param {Node} refNode Reference node to insert after.\n */\ngoog.dom.DomHelper.prototype.insertSiblingAfter = goog.dom.insertSiblingAfter;\n\n\n/**\n * Insert a child at a given index. If index is larger than the number of child\n * nodes that the parent currently has, the node is inserted as the last child\n * node.\n * @param {Element} parent The element into which to insert the child.\n * @param {Node} child The element to insert.\n * @param {number} index The index at which to insert the new child node. Must\n *     not be negative.\n */\ngoog.dom.DomHelper.prototype.insertChildAt = goog.dom.insertChildAt;\n\n\n/**\n * Removes a node from its parent.\n * @param {Node} node The node to remove.\n * @return {Node} The node removed if removed; else, null.\n */\ngoog.dom.DomHelper.prototype.removeNode = goog.dom.removeNode;\n\n\n/**\n * Replaces a node in the DOM tree. Will do nothing if `oldNode` has no\n * parent.\n * @param {Node} newNode Node to insert.\n * @param {Node} oldNode Node to replace.\n */\ngoog.dom.DomHelper.prototype.replaceNode = goog.dom.replaceNode;\n\n\n/**\n * Flattens an element. That is, removes it and replace it with its children.\n * @param {Element} element The element to flatten.\n * @return {Element|undefined} The original element, detached from the document\n *     tree, sans children, or undefined if the element was already not in the\n *     document.\n */\ngoog.dom.DomHelper.prototype.flattenElement = goog.dom.flattenElement;\n\n\n/**\n * Returns an array containing just the element children of the given element.\n * @param {Element} element The element whose element children we want.\n * @return {!(Array<!Element>|NodeList<!Element>)} An array or array-like list\n *     of just the element children of the given element.\n */\ngoog.dom.DomHelper.prototype.getChildren = goog.dom.getChildren;\n\n\n/**\n * Returns the first child node that is an element.\n * @param {Node} node The node to get the first child element of.\n * @return {Element} The first child node of `node` that is an element.\n */\ngoog.dom.DomHelper.prototype.getFirstElementChild =\n    goog.dom.getFirstElementChild;\n\n\n/**\n * Returns the last child node that is an element.\n * @param {Node} node The node to get the last child element of.\n * @return {Element} The last child node of `node` that is an element.\n */\ngoog.dom.DomHelper.prototype.getLastElementChild = goog.dom.getLastElementChild;\n\n\n/**\n * Returns the first next sibling that is an element.\n * @param {Node} node The node to get the next sibling element of.\n * @return {Element} The next sibling of `node` that is an element.\n */\ngoog.dom.DomHelper.prototype.getNextElementSibling =\n    goog.dom.getNextElementSibling;\n\n\n/**\n * Returns the first previous sibling that is an element.\n * @param {Node} node The node to get the previous sibling element of.\n * @return {Element} The first previous sibling of `node` that is\n *     an element.\n */\ngoog.dom.DomHelper.prototype.getPreviousElementSibling =\n    goog.dom.getPreviousElementSibling;\n\n\n/**\n * Returns the next node in source order from the given node.\n * @param {Node} node The node.\n * @return {Node} The next node in the DOM tree, or null if this was the last\n *     node.\n */\ngoog.dom.DomHelper.prototype.getNextNode = goog.dom.getNextNode;\n\n\n/**\n * Returns the previous node in source order from the given node.\n * @param {Node} node The node.\n * @return {Node} The previous node in the DOM tree, or null if this was the\n *     first node.\n */\ngoog.dom.DomHelper.prototype.getPreviousNode = goog.dom.getPreviousNode;\n\n\n/**\n * Whether the object looks like a DOM node.\n * @param {?} obj The object being tested for node likeness.\n * @return {boolean} Whether the object looks like a DOM node.\n */\ngoog.dom.DomHelper.prototype.isNodeLike = goog.dom.isNodeLike;\n\n\n/**\n * Whether the object looks like an Element.\n * @param {?} obj The object being tested for Element likeness.\n * @return {boolean} Whether the object looks like an Element.\n */\ngoog.dom.DomHelper.prototype.isElement = goog.dom.isElement;\n\n\n/**\n * Returns true if the specified value is a Window object. This includes the\n * global window for HTML pages, and iframe windows.\n * @param {?} obj Variable to test.\n * @return {boolean} Whether the variable is a window.\n */\ngoog.dom.DomHelper.prototype.isWindow = goog.dom.isWindow;\n\n\n/**\n * Returns an element's parent, if it's an Element.\n * @param {Element} element The DOM element.\n * @return {Element} The parent, or null if not an Element.\n */\ngoog.dom.DomHelper.prototype.getParentElement = goog.dom.getParentElement;\n\n\n/**\n * Whether a node contains another node.\n * @param {Node} parent The node that should contain the other node.\n * @param {Node} descendant The node to test presence of.\n * @return {boolean} Whether the parent node contains the descendant node.\n */\ngoog.dom.DomHelper.prototype.contains = goog.dom.contains;\n\n\n/**\n * Compares the document order of two nodes, returning 0 if they are the same\n * node, a negative number if node1 is before node2, and a positive number if\n * node2 is before node1.  Note that we compare the order the tags appear in the\n * document so in the tree <b><i>text</i></b> the B node is considered to be\n * before the I node.\n *\n * @param {Node} node1 The first node to compare.\n * @param {Node} node2 The second node to compare.\n * @return {number} 0 if the nodes are the same node, a negative number if node1\n *     is before node2, and a positive number if node2 is before node1.\n */\ngoog.dom.DomHelper.prototype.compareNodeOrder = goog.dom.compareNodeOrder;\n\n\n/**\n * Find the deepest common ancestor of the given nodes.\n * @param {...Node} var_args The nodes to find a common ancestor of.\n * @return {Node} The common ancestor of the nodes, or null if there is none.\n *     null will only be returned if two or more of the nodes are from different\n *     documents.\n */\ngoog.dom.DomHelper.prototype.findCommonAncestor = goog.dom.findCommonAncestor;\n\n\n/**\n * Returns the owner document for a node.\n * @param {Node} node The node to get the document for.\n * @return {!Document} The document owning the node.\n */\ngoog.dom.DomHelper.prototype.getOwnerDocument = goog.dom.getOwnerDocument;\n\n\n/**\n * Cross browser function for getting the document element of an iframe.\n * @param {Element} iframe Iframe element.\n * @return {!Document} The frame content document.\n */\ngoog.dom.DomHelper.prototype.getFrameContentDocument =\n    goog.dom.getFrameContentDocument;\n\n\n/**\n * Cross browser function for getting the window of a frame or iframe.\n * @param {Element} frame Frame element.\n * @return {Window} The window associated with the given frame.\n */\ngoog.dom.DomHelper.prototype.getFrameContentWindow =\n    goog.dom.getFrameContentWindow;\n\n\n/**\n * Sets the text content of a node, with cross-browser support.\n * @param {Node} node The node to change the text content of.\n * @param {string|number} text The value that should replace the node's content.\n */\ngoog.dom.DomHelper.prototype.setTextContent = goog.dom.setTextContent;\n\n\n/**\n * Gets the outerHTML of a node, which islike innerHTML, except that it\n * actually contains the HTML of the node itself.\n * @param {Element} element The element to get the HTML of.\n * @return {string} The outerHTML of the given element.\n */\ngoog.dom.DomHelper.prototype.getOuterHtml = goog.dom.getOuterHtml;\n\n\n/**\n * Finds the first descendant node that matches the filter function. This does\n * a depth first search.\n * @param {Node} root The root of the tree to search.\n * @param {function(Node) : boolean} p The filter function.\n * @return {Node|undefined} The found node or undefined if none is found.\n */\ngoog.dom.DomHelper.prototype.findNode = goog.dom.findNode;\n\n\n/**\n * Finds all the descendant nodes that matches the filter function. This does a\n * depth first search.\n * @param {Node} root The root of the tree to search.\n * @param {function(Node) : boolean} p The filter function.\n * @return {Array<Node>} The found nodes or an empty array if none are found.\n */\ngoog.dom.DomHelper.prototype.findNodes = goog.dom.findNodes;\n\n\n/**\n * Returns true if the element has a tab index that allows it to receive\n * keyboard focus (tabIndex >= 0), false otherwise.  Note that some elements\n * natively support keyboard focus, even if they have no tab index.\n * @param {!Element} element Element to check.\n * @return {boolean} Whether the element has a tab index that allows keyboard\n *     focus.\n */\ngoog.dom.DomHelper.prototype.isFocusableTabIndex = goog.dom.isFocusableTabIndex;\n\n\n/**\n * Enables or disables keyboard focus support on the element via its tab index.\n * Only elements for which {@link goog.dom.isFocusableTabIndex} returns true\n * (or elements that natively support keyboard focus, like form elements) can\n * receive keyboard focus.  See http://go/tabindex for more info.\n * @param {Element} element Element whose tab index is to be changed.\n * @param {boolean} enable Whether to set or remove a tab index on the element\n *     that supports keyboard focus.\n */\ngoog.dom.DomHelper.prototype.setFocusableTabIndex =\n    goog.dom.setFocusableTabIndex;\n\n\n/**\n * Returns true if the element can be focused, i.e. it has a tab index that\n * allows it to receive keyboard focus (tabIndex >= 0), or it is an element\n * that natively supports keyboard focus.\n * @param {!Element} element Element to check.\n * @return {boolean} Whether the element allows keyboard focus.\n */\ngoog.dom.DomHelper.prototype.isFocusable = goog.dom.isFocusable;\n\n\n/**\n * Returns the text contents of the current node, without markup. New lines are\n * stripped and whitespace is collapsed, such that each character would be\n * visible.\n *\n * In browsers that support it, innerText is used.  Other browsers attempt to\n * simulate it via node traversal.  Line breaks are canonicalized in IE.\n *\n * @param {Node} node The node from which we are getting content.\n * @return {string} The text content.\n */\ngoog.dom.DomHelper.prototype.getTextContent = goog.dom.getTextContent;\n\n\n/**\n * Returns the text length of the text contained in a node, without markup. This\n * is equivalent to the selection length if the node was selected, or the number\n * of cursor movements to traverse the node. Images & BRs take one space.  New\n * lines are ignored.\n *\n * @param {Node} node The node whose text content length is being calculated.\n * @return {number} The length of `node`'s text content.\n */\ngoog.dom.DomHelper.prototype.getNodeTextLength = goog.dom.getNodeTextLength;\n\n\n/**\n * Returns the text offset of a node relative to one of its ancestors. The text\n * length is the same as the length calculated by\n * `goog.dom.getNodeTextLength`.\n *\n * @param {Node} node The node whose offset is being calculated.\n * @param {Node=} opt_offsetParent Defaults to the node's owner document's body.\n * @return {number} The text offset.\n */\ngoog.dom.DomHelper.prototype.getNodeTextOffset = goog.dom.getNodeTextOffset;\n\n\n/**\n * Returns the node at a given offset in a parent node.  If an object is\n * provided for the optional third parameter, the node and the remainder of the\n * offset will stored as properties of this object.\n * @param {Node} parent The parent node.\n * @param {number} offset The offset into the parent node.\n * @param {Object=} opt_result Object to be used to store the return value. The\n *     return value will be stored in the form {node: Node, remainder: number}\n *     if this object is provided.\n * @return {Node} The node at the given offset.\n */\ngoog.dom.DomHelper.prototype.getNodeAtOffset = goog.dom.getNodeAtOffset;\n\n\n/**\n * Returns true if the object is a `NodeList`.  To qualify as a NodeList,\n * the object must have a numeric length property and an item function (which\n * has type 'string' on IE for some reason).\n * @param {Object} val Object to test.\n * @return {boolean} Whether the object is a NodeList.\n */\ngoog.dom.DomHelper.prototype.isNodeList = goog.dom.isNodeList;\n\n\n/**\n * Walks up the DOM hierarchy returning the first ancestor that has the passed\n * tag name and/or class name. If the passed element matches the specified\n * criteria, the element itself is returned.\n * @param {Node} element The DOM node to start with.\n * @param {?(goog.dom.TagName<T>|string)=} opt_tag The tag name to match (or\n *     null/undefined to match only based on class name).\n * @param {?string=} opt_class The class name to match (or null/undefined to\n *     match only based on tag name).\n * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the\n *     dom.\n * @return {?R} The first ancestor that matches the passed criteria, or\n *     null if no match is found. The return type is {?Element} if opt_tag is\n *     not a member of goog.dom.TagName or a more specific type if it is (e.g.\n *     {?HTMLAnchorElement} for goog.dom.TagName.A).\n * @template T\n * @template R := cond(isUnknown(T), 'Element', T) =:\n */\ngoog.dom.DomHelper.prototype.getAncestorByTagNameAndClass =\n    goog.dom.getAncestorByTagNameAndClass;\n\n\n/**\n * Walks up the DOM hierarchy returning the first ancestor that has the passed\n * class name. If the passed element matches the specified criteria, the\n * element itself is returned.\n * @param {Node} element The DOM node to start with.\n * @param {string} class The class name to match.\n * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the\n *     dom.\n * @return {Element} The first ancestor that matches the passed criteria, or\n *     null if none match.\n */\ngoog.dom.DomHelper.prototype.getAncestorByClass = goog.dom.getAncestorByClass;\n\n\n/**\n * Walks up the DOM hierarchy returning the first ancestor that passes the\n * matcher function.\n * @param {Node} element The DOM node to start with.\n * @param {function(Node) : boolean} matcher A function that returns true if the\n *     passed node matches the desired criteria.\n * @param {boolean=} opt_includeNode If true, the node itself is included in\n *     the search (the first call to the matcher will pass startElement as\n *     the node to test).\n * @param {number=} opt_maxSearchSteps Maximum number of levels to search up the\n *     dom.\n * @return {Node} DOM node that matched the matcher, or null if there was\n *     no match.\n */\ngoog.dom.DomHelper.prototype.getAncestor = goog.dom.getAncestor;\n\n\n/**\n * Gets '2d' context of a canvas. Shortcut for canvas.getContext('2d') with a\n * type information.\n * @param {!HTMLCanvasElement} canvas\n * @return {!CanvasRenderingContext2D}\n */\ngoog.dom.DomHelper.prototype.getCanvasContext2D = goog.dom.getCanvasContext2D;\n","^?",1579837703000,"^@",["^A",["^1J","~$goog.dom.BrowserFeature","~$goog.dom.NodeType","^16","~$goog.math.Size","^3","~$goog.object","^17","^18","~$goog.math.Coordinate","^1;","~$goog.string.Unicode","^1S","~$goog.html.SafeHtml","^4"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/dom.js"],"^S",["^A",["^14","~$goog.dom.DomHelper","~$goog.dom.Appendable"]],"^1",true,"^2",["^3","^1S","^1J","^1Z","^1[","^4","^1;","^24","^17","^22","^20","^21","^16","^23","^18"]],["^ ","^7",[1579837703000],"^8","goog.ui.css3menubuttonrenderer.js","^9",["^:","goog/ui/css3menubuttonrenderer.js"],"^;","goog/ui/css3menubuttonrenderer.js","^<","^=","^>","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An alternative imageless button renderer that uses CSS3 rather\n * than voodoo to render custom buttons with rounded corners and dimensionality\n * (via a subtle flat shadow on the bottom half of the button) without the use\n * of images.\n *\n * Based on the Custom Buttons 3.1 visual specification, see\n * http://go/custombuttons\n *\n * Tested and verified to work in Gecko 1.9.2+ and WebKit 528+.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/css3menubutton.html\n */\n\ngoog.provide('goog.ui.Css3MenuButtonRenderer');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.ui.INLINE_BLOCK_CLASSNAME');\ngoog.require('goog.ui.MenuButton');\ngoog.require('goog.ui.MenuButtonRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Custom renderer for {@link goog.ui.MenuButton}s. Css3 buttons can contain\n * almost arbitrary HTML content, will flow like inline elements, but can be\n * styled like block-level elements.\n *\n * @constructor\n * @extends {goog.ui.MenuButtonRenderer}\n * @final\n */\ngoog.ui.Css3MenuButtonRenderer = function() {\n  goog.ui.MenuButtonRenderer.call(this);\n};\ngoog.inherits(goog.ui.Css3MenuButtonRenderer, goog.ui.MenuButtonRenderer);\ngoog.addSingletonGetter(goog.ui.Css3MenuButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.Css3MenuButtonRenderer.CSS_CLASS = goog.getCssName('goog-css3-button');\n\n\n/** @override */\ngoog.ui.Css3MenuButtonRenderer.prototype.getContentElement = function(element) {\n  if (element) {\n    var captionElem = goog.dom.getElementsByTagNameAndClass(\n        '*', goog.getCssName(this.getCssClass(), 'caption'), element)[0];\n    return captionElem;\n  }\n  return null;\n};\n\n\n/**\n * Returns true if this renderer can decorate the element.  Overrides\n * {@link goog.ui.MenuButtonRenderer#canDecorate} by returning true if the\n * element is a DIV, false otherwise.\n * @param {Element} element Element to decorate.\n * @return {boolean} Whether the renderer can decorate the element.\n * @override\n */\ngoog.ui.Css3MenuButtonRenderer.prototype.canDecorate = function(element) {\n  return element.tagName == goog.dom.TagName.DIV;\n};\n\n\n/**\n * Takes a text caption or existing DOM structure, and returns the content\n * wrapped in a pseudo-rounded-corner box.  Creates the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-css3-button goog-css3-menu-button\">\n *      <div class=\"goog-css3-button-caption\">Contents...</div>\n *      <div class=\"goog-css3-button-dropdown\"></div>\n *    </div>\n *\n * Used by both {@link #createDom} and {@link #decorate}.  To be overridden\n * by subclasses.\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to wrap\n *     in a box.\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {!Element} Pseudo-rounded-corner box containing the content.\n * @override\n */\ngoog.ui.Css3MenuButtonRenderer.prototype.createButton = function(content, dom) {\n  var baseClass = this.getCssClass();\n  var inlineBlock = goog.ui.INLINE_BLOCK_CLASSNAME + ' ';\n  return dom.createDom(\n      goog.dom.TagName.DIV, inlineBlock,\n      dom.createDom(\n          goog.dom.TagName.DIV,\n          [\n            goog.getCssName(baseClass, 'caption'),\n            goog.getCssName('goog-inline-block')\n          ],\n          content),\n      dom.createDom(goog.dom.TagName.DIV, [\n        goog.getCssName(baseClass, 'dropdown'),\n        goog.getCssName('goog-inline-block')\n      ]));\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.Css3MenuButtonRenderer.prototype.getCssClass = function() {\n  return goog.ui.Css3MenuButtonRenderer.CSS_CLASS;\n};\n\n\n// Register a decorator factory function for goog.ui.Css3MenuButtonRenderer.\n// Since we're using goog-css3-button as the base class in order to get the\n// same styling as goog.ui.Css3ButtonRenderer, we need to be explicit about\n// giving goog-css3-menu-button here.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.getCssName('goog-css3-menu-button'), function() {\n      return new goog.ui.MenuButton(\n          null, null, goog.ui.Css3MenuButtonRenderer.getInstance());\n    });\n","^?",1579837703000,"^@",["^A",["^14","~$goog.ui.MenuButton","^3","~$goog.ui.MenuButtonRenderer","~$goog.ui.registry","~$goog.ui.INLINE-BLOCK-CLASSNAME","^4"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/css3menubuttonrenderer.js"],"^S",["^A",["~$goog.ui.Css3MenuButtonRenderer"]],"^1",true,"^2",["^3","^14","^4","^2:","^27","^28","^29"]],["^ ","^7",[1579837703000],"^8","goog.labs.mock.mock.js","^9",["^:","goog/labs/mock/mock.js"],"^;","goog/labs/mock/mock.js","^<","^=","^>","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a mocking framework in Closure to make unit tests easy\n * to write and understand. The methods provided here can be used to replace\n * implementations of existing objects with 'mock' objects to abstract out\n * external services and dependencies thereby isolating the code under test.\n * Apart from mocking, methods are also provided to just monitor calls to an\n * object (spying) and returning specific values for some or all the inputs to\n * methods (stubbing).\n *\n * Design doc : http://go/closuremock\n *\n */\n\n\ngoog.provide('goog.labs.mock');\ngoog.provide('goog.labs.mock.TimeoutError');\ngoog.provide('goog.labs.mock.VerificationError');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.debug');\ngoog.require('goog.debug.Error');\ngoog.require('goog.functions');\ngoog.require('goog.labs.mock.timeout');\ngoog.require('goog.labs.mock.timeout.TimeoutMode');\ngoog.require('goog.labs.mock.verification');\ngoog.require('goog.labs.mock.verification.BaseVerificationMode');\ngoog.require('goog.labs.mock.verification.VerificationMode');\ngoog.require('goog.object');\n\ngoog.setTestOnly('goog.labs.mock');\n\n\n/**\n * Mocks a given object or class.\n *\n * @param {!Object} objectOrClass An instance or a constructor of a class to be\n *     mocked.\n * @return {!Object} The mocked object.\n */\ngoog.labs.mock.mock = function(objectOrClass) {\n  // Go over properties of 'objectOrClass' and create a MockManager to\n  // be used for stubbing out calls to methods.\n  var mockObjectManager = new goog.labs.mock.MockObjectManager_(objectOrClass);\n  var mockedObject = mockObjectManager.getMockedItem();\n  goog.asserts.assertObject(mockedObject);\n  return /** @type {!Object} */ (mockedObject);\n};\n\n\n/**\n * Mocks a given function.\n *\n * @param {!Function} func A function to be mocked.\n * @return {!Function} The mocked function.\n */\ngoog.labs.mock.mockFunction = function(func) {\n  var mockFuncManager = new goog.labs.mock.MockFunctionManager_(func);\n  var mockedFunction = mockFuncManager.getMockedItem();\n  goog.asserts.assertFunction(mockedFunction);\n  return /** @type {!Function} */ (mockedFunction);\n};\n\n\n/**\n * Mocks a given constructor.\n *\n * @param {function(new:T, ...?)} ctor A constructor function to be mocked.\n * @return {function(new:T, ...?)} The mocked constructor.\n * @template T\n */\ngoog.labs.mock.mockConstructor = function(ctor) {\n  var mockCtor = goog.labs.mock.mockFunction(ctor);\n\n  // Copy class members from the real constructor to the mock. Do not copy\n  // the closure superClass_ property (see goog.inherits), the built-in\n  // prototype property, or properties added to Function.prototype\n  for (var property in ctor) {\n    if (property != 'superClass_' && property != 'prototype' &&\n        ctor.hasOwnProperty(property)) {\n      mockCtor[property] = ctor[property];\n    }\n  }\n  return mockCtor;\n};\n\n\n/**\n * Spies on a given object.\n *\n * @param {!Object} obj The object to be spied on.\n * @return {!Object} The spy object.\n */\ngoog.labs.mock.spy = function(obj) {\n  // Go over properties of 'obj' and create a MockSpyManager_ to\n  // be used for spying on calls to methods.\n  var mockSpyManager = new goog.labs.mock.MockSpyManager_(obj);\n  var spyObject = mockSpyManager.getMockedItem();\n  goog.asserts.assert(spyObject);\n  return spyObject;\n};\n\n\n/**\n * Returns an object that can be used to verify calls to specific methods of a\n * given mock.\n * @param {!Object} obj The mocked object.\n * @param {!goog.labs.mock.verification.VerificationMode=} opt_verificationMode The mode\n *     under which to verify invocations.\n * @return {?} The verifier. Return type {?} to avoid compilation errors.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.labs.mock.verify = function(obj, opt_verificationMode) {\n  var mode = opt_verificationMode || goog.labs.mock.verification.atLeast(1);\n  obj.$verificationModeSetter(mode);\n\n  return obj.$callVerifier;\n};\n\n/**\n * Returns an object that can be used to wait for calls to specific methods of a\n * given mock.\n * @param {!Object} obj The mocked object.\n * @param {...(!goog.labs.mock.verification.VerificationMode|\n *   !goog.labs.mock.timeout.TimeoutMode)} verificationOrTimeoutModes\n *   The mode under which to verify invocations.\n * @return {?} The waiter. Return type {?} to avoid compilation errors.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.labs.mock.waitAndVerify = function(obj, ...verificationOrTimeoutModes) {\n  goog.asserts.assert(\n      verificationOrTimeoutModes.length <= 2,\n      'At most 2 arguments may be passed as Timeout and Verification modes.');\n  for (var i = 0; i < 2; i++) {\n    var mode = verificationOrTimeoutModes[i];\n    if (mode instanceof goog.labs.mock.timeout.TimeoutMode) {\n      obj.$timeoutModeSetter(mode);\n    } else if (\n        mode instanceof goog.labs.mock.verification.BaseVerificationMode) {\n      obj.$verificationModeSetter(mode);\n    }\n  }\n  return obj.$callWaiter;\n};\n\n/**\n * Returns a name to identify a function. Named functions return their names,\n * unnamed functions return a string of the form '#anonymous{ID}' where ID is\n * a unique identifier for each anonymous function.\n * @private\n * @param {!Function} func The function.\n * @return {string} The function name.\n */\ngoog.labs.mock.getFunctionName_ = function(func) {\n  var funcName = goog.debug.getFunctionName(func);\n  if (funcName == '' || funcName == '[Anonymous]') {\n    funcName = '#anonymous' + goog.labs.mock.getUid(func);\n  }\n  return funcName;\n};\n\n\n/**\n * Returns a nicely formatted, readable representation of a method call.\n * @private\n * @param {string} methodName The name of the method.\n * @param {Array<?>=} opt_args The method arguments.\n * @return {string} The string representation of the method call.\n */\ngoog.labs.mock.formatMethodCall_ = function(methodName, opt_args) {\n  opt_args = opt_args || [];\n  opt_args = goog.array.map(opt_args, function(arg) {\n    if (goog.isFunction(arg)) {\n      var funcName = goog.labs.mock.getFunctionName_(arg);\n      return '<function ' + funcName + '>';\n    } else {\n      var isObjectWithClass = goog.isObject(arg) && !goog.isFunction(arg) &&\n          !goog.isArray(arg) && arg.constructor != Object;\n\n      if (isObjectWithClass) {\n        return arg.toString();\n      }\n\n      return goog.labs.mock.formatValue_(arg);\n    }\n  });\n  return methodName + '(' + opt_args.join(', ') + ')';\n};\n\n\n/**\n * An array to store objects for unique id generation.\n * @private\n * @type {!Array<!Object>}\n */\ngoog.labs.mock.uid_ = [];\n\n\n/**\n * A unique Id generator that does not modify the object.\n * @param {Object!} obj The object whose unique ID we want to generate.\n * @return {number} an unique id for the object.\n */\ngoog.labs.mock.getUid = function(obj) {\n  var index = goog.array.indexOf(goog.labs.mock.uid_, obj);\n  if (index == -1) {\n    index = goog.labs.mock.uid_.length;\n    goog.labs.mock.uid_.push(obj);\n  }\n  return index;\n};\n\n\n/**\n * This is just another implementation of goog.debug.deepExpose with a more\n * compact format.\n * @private\n * @param {*} obj The object whose string representation will be returned.\n * @param {boolean=} opt_id Whether to include the id of objects or not.\n *     Defaults to true.\n * @return {string} The string representation of the object.\n */\ngoog.labs.mock.formatValue_ = function(obj, opt_id) {\n  var id = (opt_id !== undefined) ? opt_id : true;\n  var previous = [];\n  var output = [];\n\n  var helper = function(obj) {\n    var indentMultiline = function(output) {\n      return output.replace(/\\n/g, '\\n');\n    };\n\n\n    try {\n      if (obj === undefined) {\n        output.push('undefined');\n      } else if (obj === null) {\n        output.push('NULL');\n      } else if (typeof obj === 'string') {\n        output.push('\"' + indentMultiline(obj) + '\"');\n      } else if (goog.isFunction(obj)) {\n        var funcName = goog.labs.mock.getFunctionName_(obj);\n        output.push('<function ' + funcName + '>');\n      } else if (goog.isObject(obj)) {\n        if (goog.array.contains(previous, obj)) {\n          if (id) {\n            output.push(\n                '<recursive/dupe obj_' + goog.labs.mock.getUid(obj) + '>');\n          } else {\n            output.push('<recursive/dupe>');\n          }\n        } else {\n          previous.push(obj);\n          output.push('{');\n          for (var x in obj) {\n            output.push(' ');\n            output.push(\n                '\"' + x + '\"' +\n                ':');\n            helper(obj[x]);\n          }\n          if (id) {\n            output.push(' _id:' + goog.labs.mock.getUid(obj));\n          }\n          output.push('}');\n        }\n      } else {\n        output.push(obj);\n      }\n    } catch (e) {\n      output.push('*** ' + e + ' ***');\n    }\n  };\n\n  helper(obj);\n  return output.join('')\n      .replace(/\"closure_uid_\\d+\"/g, '_id')\n      .replace(/{ /g, '{');\n};\n\n\n\n/**\n * Error thrown when verification failed.\n *\n * @param {Array<!goog.labs.mock.MethodBinding_>} recordedCalls\n *     The recorded calls that didn't match the expectation.\n * @param {string} methodName The expected method call.\n * @param {!goog.labs.mock.verification.VerificationMode} verificationMode The\n *     expected verification mode which failed verification.\n * @param {!Array<?>} args The expected arguments.\n * @constructor\n * @extends {goog.debug.Error}\n * @final\n */\ngoog.labs.mock.VerificationError = function(\n    recordedCalls, methodName, verificationMode, args) {\n  var msg = goog.labs.mock.VerificationError.getVerificationErrorMsg_(\n      recordedCalls, methodName, verificationMode, args);\n  goog.labs.mock.VerificationError.base(this, 'constructor', msg);\n};\ngoog.inherits(goog.labs.mock.VerificationError, goog.debug.Error);\n\n\n/** @override */\ngoog.labs.mock.VerificationError.prototype.name = 'VerificationError';\n\n/**\n * Error thrown when timeout triggers before specified action.\n *\n * @param {!Array<!goog.labs.mock.MethodBinding_>} recordedCalls\n *     The recorded calls that didn't match the expectation.\n * @param {string} methodName The expected method call.\n * @param {!goog.labs.mock.verification.VerificationMode} verificationMode The\n *     expected verification mode which failed verification.\n * @param {!Array<?>} args The expected arguments.\n * @constructor\n * @extends {goog.debug.Error}\n * @final\n */\ngoog.labs.mock.TimeoutError = function(\n    recordedCalls, methodName, verificationMode, args) {\n  var msg = goog.labs.mock.TimeoutError.getTimeoutErrorMsg_(\n      recordedCalls, methodName, verificationMode, args);\n  goog.labs.mock.TimeoutError.base(this, 'constructor', msg);\n};\ngoog.inherits(goog.labs.mock.TimeoutError, goog.debug.Error);\n\n/** @override */\ngoog.labs.mock.TimeoutError.prototype.name = 'TimeoutError';\n\n/**\n * This array contains the name of the functions that are part of the base\n * Object prototype.\n * Basically a copy of goog.object.PROTOTYPE_FIELDS_.\n * @const\n * @type {!Array<string>}\n * @private\n */\ngoog.labs.mock.PROTOTYPE_FIELDS_ = [\n  'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',\n  'toLocaleString', 'toString', 'valueOf'\n];\n\n\n/**\n * Constructs a descriptive error message for an expected method call.\n * @private\n * @param {Array<!goog.labs.mock.MethodBinding_>} recordedCalls\n *     The recorded calls that didn't match the expectation.\n * @param {string} methodName The expected method call.\n * @param {!goog.labs.mock.verification.VerificationMode} verificationMode The\n *     expected verification mode that failed verification.\n * @param {!Array<?>} args The expected arguments.\n * @return {string} The error message.\n */\ngoog.labs.mock.VerificationError.getVerificationErrorMsg_ = function(\n    recordedCalls, methodName, verificationMode, args) {\n\n  recordedCalls = goog.array.filter(recordedCalls, function(binding) {\n    return binding.getMethodName() == methodName;\n  });\n\n  var expected = goog.labs.mock.formatMethodCall_(methodName, args);\n\n  var msg =\n      '\\nExpected: ' + expected.toString() + ' ' + verificationMode.describe();\n  msg += '\\nRecorded: ';\n\n  if (recordedCalls.length > 0) {\n    msg += recordedCalls.join(',\\n          ');\n  } else {\n    msg += 'No recorded calls';\n  }\n\n  return msg;\n};\n\n/**\n * Constructs a descriptive error message for an expected method call\n * that was not triggered within a specified duration.\n * @private\n * @param {!Array<!goog.labs.mock.MethodBinding_>} recordedCalls\n *     The recorded calls that didn't match the expectation.\n * @param {string} methodName The expected method call.\n * @param {!goog.labs.mock.verification.VerificationMode} verificationMode The\n *     expected verification mode whose criteria was never met.\n * @param {!Array<?>} args The expected arguments.\n * @return {string} The error message.\n */\ngoog.labs.mock.TimeoutError.getTimeoutErrorMsg_ = function(\n    recordedCalls, methodName, verificationMode, args) {\n  var verificationErrorMsg =\n      goog.labs.mock.VerificationError.getVerificationErrorMsg_(\n          recordedCalls, methodName, verificationMode, args);\n  var timeoutErrorMsg =\n      'Function call was either not invoked or never met criteria specified ' +\n      'by provided verification mode. ' + verificationErrorMsg;\n  return timeoutErrorMsg;\n};\n\n\n\n/**\n * Base class that provides basic functionality for creating, adding and\n * finding bindings, offering an executor method that is called when a call to\n * the stub is made, an array to hold the bindings and the mocked item, among\n * other things.\n *\n * @constructor\n * @struct\n * @private\n */\ngoog.labs.mock.MockManager_ = function() {\n  /**\n   * Proxies the methods for the mocked object or class to execute the stubs.\n   * @type {!Object}\n   * @protected\n   */\n  this.mockedItem = {};\n\n  /**\n   * A reference to the object or function being mocked.\n   * @type {?Object|?Function}\n   * @protected\n   */\n  this.mockee = null;\n\n  /**\n   * Holds the stub bindings established so far.\n   * @protected\n   */\n  this.methodBindings = [];\n\n  /**\n   * Holds a reference to the binder used to define stubs.\n   * @protected\n   */\n  this.$stubBinder = null;\n\n  /**\n   * Record method calls with no stub definitions.\n   * @type {!Array<!goog.labs.mock.MethodBinding_>}\n   * @private\n   */\n  this.callRecords_ = [];\n\n  /**\n   * Which `VerificationMode` to use during verification.\n   * @private\n   */\n  this.verificationMode_ = goog.labs.mock.verification.atLeast(1);\n\n  /**\n   * Which `TimeoutMode` to use during waitAndVerify.\n   * @private\n   */\n  this.timeoutMode_ = goog.labs.mock.timeout.timeout(0);\n\n  /**\n   * Maintains a dictionary keyed by methodName, that holds a list of\n   * callbacks that should be called anytime the provided methodName is called.\n   * @type {!Object<string, !Set<function(!goog.labs.mock.MethodBinding_)>>}\n   * @private\n   * @const\n   */\n  this.callListeners_ = {};\n};\n\n\n/**\n * Allows callers of `#verify` to override the default verification\n * mode of this MockManager.\n *\n * @param {!goog.labs.mock.verification.VerificationMode} verificationMode\n * @private\n */\ngoog.labs.mock.MockManager_.prototype.setVerificationMode_ = function(\n    verificationMode) {\n  this.verificationMode_ = verificationMode;\n};\n\n/**\n * Allows callers of `#waitAndVerify` to override the default timeout\n * mode of this MockManager.\n *\n * @param {!goog.labs.mock.timeout.TimeoutMode} timeoutMode\n * @private\n */\ngoog.labs.mock.MockManager_.prototype.setTimeoutMode_ = function(timeoutMode) {\n  this.timeoutMode_ = timeoutMode;\n};\n\n/**\n * Handles the first step in creating a stub, returning a stub-binder that\n * is later used to bind a stub for a method.\n *\n * @param {string} methodName The name of the method being bound.\n * @param {...*} var_args The arguments to the method.\n * @return {!goog.labs.mock.StubBinder} The stub binder.\n * @private\n */\ngoog.labs.mock.MockManager_.prototype.handleMockCall_ = function(\n    methodName, var_args) {\n  var args = goog.array.slice(arguments, 1);\n  return new goog.labs.mock.StubBinderImpl_(this, methodName, args);\n};\n\n\n/**\n * Returns the mock object. This should have a stubbed method for each method\n * on the object being mocked.\n *\n * @return {!Object|!Function} The mock object.\n */\ngoog.labs.mock.MockManager_.prototype.getMockedItem = function() {\n  return this.mockedItem;\n};\n\n\n/**\n * Adds a binding for the method name and arguments to be stubbed.\n *\n * @param {?string} methodName The name of the stubbed method.\n * @param {!Array<?>} args The arguments passed to the method.\n * @param {!Function} func The stub function.\n * @return {!Array<?>} The array of stubs for further sequential stubs to be\n *     appended.\n */\ngoog.labs.mock.MockManager_.prototype.addBinding = function(\n    methodName, args, func) {\n  var binding = new goog.labs.mock.MethodBinding_(methodName, args, func);\n  var sequentialStubsArray = [binding];\n  goog.array.insertAt(this.methodBindings, sequentialStubsArray, 0);\n  return sequentialStubsArray;\n};\n\n\n/**\n * Returns a stub, if defined, for the method name and arguments passed in.\n * If there are multiple stubs for this method name and arguments, then\n * the most recent binding will be used.\n *\n * If the next binding is a sequence of stubs, then they'll be returned\n * in order until only one is left, at which point it will be returned for\n * every subsequent call.\n *\n * @param {string} methodName The name of the stubbed method.\n * @param {!Array<?>} args The arguments passed to the method.\n * @return {?Function} The stub function or null.\n * @protected\n */\ngoog.labs.mock.MockManager_.prototype.getNextBinding = function(\n    methodName, args) {\n  var bindings = goog.array.find(this.methodBindings, function(bindingArray) {\n    return bindingArray[0].matches(\n        methodName, args, false /* isVerification */);\n  });\n  if (bindings == null) {\n    return null;\n  }\n\n  if (bindings.length > 1) {\n    return bindings.shift().getStub();\n  }\n  return bindings[0].getStub();\n};\n\n\n/**\n * Returns a stub, if defined, for the method name and arguments passed in as\n * parameters.\n *\n * @param {string} methodName The name of the stubbed method.\n * @param {!Array<?>} args The arguments passed to the method.\n * @return {Function} The stub function or undefined.\n * @protected\n */\ngoog.labs.mock.MockManager_.prototype.getExecutor = function(methodName, args) {\n  return this.getNextBinding(methodName, args);\n};\n\n\n/**\n * Looks up the list of stubs defined on the mock object and executes the\n * function associated with that stub.\n *\n * @param {string} methodName The name of the method to execute.\n * @param {...*} var_args The arguments passed to the method.\n * @return {*} Value returned by the stub function.\n * @protected\n */\ngoog.labs.mock.MockManager_.prototype.executeStub = function(\n    methodName, var_args) {\n  var args = goog.array.slice(arguments, 1);\n\n  var callRecord = this.recordCall_(methodName, args);\n\n  if (this.callListeners_[methodName] instanceof Set) {\n    this.callListeners_[methodName].forEach((listener) => {\n      listener(callRecord);\n    });\n  }\n\n  var func = this.getExecutor(methodName, args);\n  if (func) {\n    return func.apply(null, args);\n  }\n};\n\n\n/**\n * Records a call to 'methodName' with arguments 'args'.\n *\n * @param {string} methodName The name of the called method.\n * @param {!Array<?>} args The array of arguments.\n * @return {!goog.labs.mock.MethodBinding_} The call record that was recorded.\n * @private\n */\ngoog.labs.mock.MockManager_.prototype.recordCall_ = function(methodName, args) {\n  var callRecord =\n      new goog.labs.mock.MethodBinding_(methodName, args, goog.nullFunction);\n\n  this.callRecords_.push(callRecord);\n  return callRecord;\n};\n\n\n/**\n * Verify invocation of a method with specific arguments.\n *\n * @param {string} methodName The name of the method.\n * @param {...*} var_args The arguments passed.\n * @protected\n */\ngoog.labs.mock.MockManager_.prototype.verifyInvocation = function(\n    methodName, var_args) {\n  var args = goog.array.slice(arguments, 1);\n  var count = goog.array.count(this.callRecords_, function(binding) {\n    return binding.matches(methodName, args, true /* isVerification */);\n  });\n\n  if (!this.verificationMode_.verify(count)) {\n    throw new goog.labs.mock.VerificationError(\n        this.callRecords_, methodName, this.verificationMode_, args);\n  }\n};\n\n/**\n * Wait until a function is called and then resolve.\n * @param {string} methodName The name of the method.\n * @param {...*} args The arguments passed.\n * @return {!Promise} A promise that resolves when the method is called\n *     according to its verification mode.\n * @protected\n */\ngoog.labs.mock.MockManager_.prototype.waitForCall = function(\n    methodName, ...args) {\n  var count = goog.array.count(this.callRecords_, function(binding) {\n    return binding.matches(methodName, args, true /* isVerification */);\n  });\n\n  return new Promise((resolve, reject) => {\n    // If the function has already been called, immediately resolve.\n    if (this.verificationMode_.verify(count)) {\n      resolve();\n      return;\n    }\n\n    var timeout = setTimeout(() => {\n      reject(new goog.labs.mock.TimeoutError(\n          this.callRecords_, methodName, this.verificationMode_, args));\n      this.callListeners_[methodName].delete(listener);\n    }, this.timeoutMode_.duration);\n\n    if (!this.callListeners_[methodName]) {\n      this.callListeners_[methodName] = new Set();\n    }\n\n    /**\n     * Listens for calls to this function name\n     * @param {!goog.labs.mock.MethodBinding_} callRecord The call record\n     *     just added\n     * @this {goog.labs.mock.MockManager_}\n     */\n    const listener = (callRecord) => {\n      if (callRecord.matches(methodName, args, true /* isVerification */)) {\n        count++;\n        if (this.verificationMode_.verify(count)) {\n          resolve();\n          clearTimeout(timeout);\n          this.callListeners_[methodName].delete(listener);\n        }\n      }\n    };\n\n    this.callListeners_[methodName].add(listener);\n  });\n};\n\n\n\n/**\n * Sets up mock for the given object (or class), stubbing out all the defined\n * methods. By default, all stubs return `undefined`, though stubs can be\n * later defined using `goog.labs.mock.when`.\n * @struct\n * @constructor\n * @extends {goog.labs.mock.MockManager_}\n * @param {!Object|!Function} objOrClass The object or class to set up the\n *     mock for. A class is a constructor function.\n * @private\n * @suppress {strictMissingProperties} Part of the\n * go/strict_warnings_migration\n */\ngoog.labs.mock.MockObjectManager_ = function(objOrClass) {\n  goog.labs.mock.MockObjectManager_.base(this, 'constructor');\n\n  /**\n   * Proxies the calls to establish the first step of the stub bindings\n   * (object and method name)\n   * @private\n   */\n  this.objectStubBinder_ = {};\n\n  this.mockee = objOrClass;\n\n  /**\n   * The call verifier is used to verify the calls. It maps property names to\n   * the method that does call verification.\n   * @type {!Object<string, function(string, ...)>}\n   * @private\n   */\n  this.objectCallVerifier_ = {};\n\n  /**\n   * The call waiter is used to wait for function calls. It returns a resolved\n   * promise when the function is eventually called.\n   * @type {!Object<string, function(string, ...)>}\n   * @private\n   * @const\n   */\n  this.objectCallWaiter_ = {};\n\n  var obj;\n  if (goog.isFunction(objOrClass)) {\n    // Create a temporary subclass with a no-op constructor so that we can\n    // create an instance and determine what methods it has.\n    /**\n     * @constructor\n     * @final\n     */\n    var tempCtor = function() {};\n    goog.inherits(tempCtor, objOrClass);\n    obj = new tempCtor();\n  } else {\n    obj = objOrClass;\n  }\n\n  // Put the object being mocked in the prototype chain of the mock so that\n  // it has all the correct properties and instanceof works.\n  /**\n   * @constructor\n   * @final\n   */\n  var mockedItemCtor = function() {};\n  mockedItemCtor.prototype = obj;\n  this.mockedItem = new mockedItemCtor();\n\n  var propObj = goog.isFunction(objOrClass) ? objOrClass.prototype : objOrClass;\n  var enumerableProperties = goog.object.getAllPropertyNames(propObj);\n  // The non enumerable properties are added due to the fact that IE8 does not\n  // enumerate any of the prototype Object functions even when overridden and\n  // mocking these is sometimes needed.\n  for (var i = 0; i < goog.labs.mock.PROTOTYPE_FIELDS_.length; i++) {\n    var prop = goog.labs.mock.PROTOTYPE_FIELDS_[i];\n    if (!goog.array.contains(enumerableProperties, prop)) {\n      enumerableProperties.push(prop);\n    }\n  }\n\n  // Adds the properties to the mock, creating a proxy stub for each method on\n  // the instance.\n  for (var i = 0; i < enumerableProperties.length; i++) {\n    var prop = enumerableProperties[i];\n    if (goog.isFunction(propObj[prop])) {\n      this.mockedItem[prop] = goog.bind(this.executeStub, this, prop);\n      // The stub binder used to create bindings.\n      this.objectStubBinder_[prop] =\n          goog.bind(this.handleMockCall_, this, prop);\n      // The verifier verifies the calls.\n      this.objectCallVerifier_[prop] =\n          goog.bind(this.verifyInvocation, this, prop);\n      // The call waiter waits for calls.\n      this.objectCallWaiter_[prop] = goog.bind(this.waitForCall, this, prop);\n    }\n  }\n  // The alias for stub binder exposed to the world.\n  this.mockedItem.$stubBinder = this.objectStubBinder_;\n\n  // The alias for verifier for the world.\n  this.mockedItem.$callVerifier = this.objectCallVerifier_;\n\n  this.mockedItem.$callWaiter = this.objectCallWaiter_;\n\n  this.mockedItem.$verificationModeSetter =\n      goog.bind(this.setVerificationMode_, this);\n\n  this.mockedItem.$timeoutModeSetter = goog.bind(this.setTimeoutMode_, this);\n};\ngoog.inherits(goog.labs.mock.MockObjectManager_, goog.labs.mock.MockManager_);\n\n\n\n/**\n * Sets up the spying behavior for the given object.\n *\n * @param {!Object} obj The object to be spied on.\n *\n * @constructor\n * @struct\n * @extends {goog.labs.mock.MockObjectManager_}\n * @private\n */\ngoog.labs.mock.MockSpyManager_ = function(obj) {\n  goog.labs.mock.MockSpyManager_.base(this, 'constructor', obj);\n};\ngoog.inherits(\n    goog.labs.mock.MockSpyManager_, goog.labs.mock.MockObjectManager_);\n\n\n/**\n * Return a stub, if defined, for the method and arguments passed in. If we\n * lack a stub, instead look for a call record that matches the method and\n * arguments.\n *\n * @return {!Function} The stub or the invocation logger, if defined.\n * @override\n */\ngoog.labs.mock.MockSpyManager_.prototype.getNextBinding = function(\n    methodName, args) {\n  var stub = goog.labs.mock.MockSpyManager_.base(\n      this, 'getNextBinding', methodName, args);\n\n  if (!stub) {\n    stub = goog.bind(this.mockee[methodName], this.mockedItem);\n  }\n\n  return stub;\n};\n\n\n\n/**\n * Sets up mock for the given function, stubbing out. By default, all stubs\n * return `undefined`, though stubs can be later defined using\n * `goog.labs.mock.when`.\n * @struct\n * @constructor\n * @extends {goog.labs.mock.MockManager_}\n * @param {!Function} func The function to set up the mock for.\n * @private\n * @suppress {strictMissingProperties} Part of the\n * go/strict_warnings_migration\n */\ngoog.labs.mock.MockFunctionManager_ = function(func) {\n  goog.labs.mock.MockFunctionManager_.base(this, 'constructor');\n\n  this.func_ = func;\n\n  /**\n   * The stub binder used to create bindings.\n   * Sets the first argument of handleMockCall_ to the function name.\n   * @type {!Function}\n   * @private\n   */\n  this.functionStubBinder_ = this.useMockedFunctionName_(this.handleMockCall_);\n\n  this.mockedItem = this.useMockedFunctionName_(this.executeStub);\n  this.mockedItem.$stubBinder = this.functionStubBinder_;\n\n  /**\n   * The call verifier is used to verify function invocations.\n   * Sets the first argument of verifyInvocation to the function name.\n   * @type {!Function}\n   */\n  this.mockedItem.$callVerifier =\n      this.useMockedFunctionName_(this.verifyInvocation);\n\n  // These have to be repeated because if they're set in the base class they\n  // will be stubbed by MockObjectManager.\n  this.mockedItem.$verificationModeSetter =\n      goog.bind(this.setVerificationMode_, this);\n  this.mockedItem.$timeoutModeSetter = goog.bind(this.setTimeoutMode_, this);\n};\ngoog.inherits(goog.labs.mock.MockFunctionManager_, goog.labs.mock.MockManager_);\n\n\n/**\n * Given a method, returns a new function that calls the first one setting\n * the first argument to the mocked function name.\n * This is used to dynamically override the stub binders and call verifiers.\n * @private\n * @param {Function} nextFunc The function to override.\n * @return {!Function} The overloaded function.\n */\ngoog.labs.mock.MockFunctionManager_.prototype.useMockedFunctionName_ = function(\n    nextFunc) {\n  var mockFunctionManager = this;\n  // Avoid using 'this' because this function may be called with 'new'.\n  return function(var_args) {\n    var args = goog.array.clone(arguments);\n    var name = '#mockFor<' +\n        goog.labs.mock.getFunctionName_(mockFunctionManager.func_) + '>';\n    goog.array.insertAt(args, name, 0);\n    return nextFunc.apply(mockFunctionManager, args);\n  };\n};\n\n\n/**\n * A stub binder is an object that helps define the stub by binding\n * method name to the stub method.\n * @interface\n */\ngoog.labs.mock.StubBinder = function() {};\n\n\n/**\n * Defines the function to be called for the method name and arguments bound\n * to this `StubBinder`.\n *\n * If `then` or `thenReturn` has been previously called\n * on this `StubBinder` then the given stub `func` will be called\n * only after the stubs passed previously have been called.  Afterwards,\n * if no other calls are made to `then` or `thenReturn` for this\n * `StubBinder` then the given `func` will be used for every further\n * invocation.\n * See #when for complete examples.\n * TODO(user): Add support for the 'Answer' interface.\n *\n * @param {!Function} func The function to call.\n * @return {!goog.labs.mock.StubBinder} Returns itself for chaining.\n */\ngoog.labs.mock.StubBinder.prototype.then = goog.abstractMethod;\n\n\n/**\n * Defines the constant return value for the stub represented by this\n * `StubBinder`.\n *\n * @param {*} value The value to return.\n * @return {!goog.labs.mock.StubBinder} Returns itself for chaining.\n */\ngoog.labs.mock.StubBinder.prototype.thenReturn = goog.abstractMethod;\n\n\n/**\n * A `StubBinder` which uses `MockManager_` to manage stub\n * bindings.\n *\n * @param {!goog.labs.mock.MockManager_}\n *   mockManager The mock manager.\n * @param {?string} name The method name.\n * @param {!Array<?>} args The other arguments to the method.\n *\n * @implements {goog.labs.mock.StubBinder}\n * @private @constructor @struct @final\n */\ngoog.labs.mock.StubBinderImpl_ = function(mockManager, name, args) {\n  /**\n   * The mock manager instance.\n   * @type {!goog.labs.mock.MockManager_}\n   * @private\n   */\n  this.mockManager_ = mockManager;\n\n  /**\n   * Holds the name of the method to be bound.\n   * @type {?string}\n   * @private\n   */\n  this.name_ = name;\n\n  /**\n   * Holds the arguments for the method.\n   * @type {!Array<?>}\n   * @private\n   */\n  this.args_ = args;\n\n  /**\n   * Stores a reference to the list of stubs to allow chaining sequential\n   * stubs.\n   * @private {!Array<?>}\n   */\n  this.sequentialStubsArray_ = [];\n};\n\n\n/**\n * @override\n */\ngoog.labs.mock.StubBinderImpl_.prototype.then = function(func) {\n  if (this.sequentialStubsArray_.length) {\n    this.sequentialStubsArray_.push(\n        new goog.labs.mock.MethodBinding_(this.name_, this.args_, func));\n  } else {\n    this.sequentialStubsArray_ =\n        this.mockManager_.addBinding(this.name_, this.args_, func);\n  }\n  return this;\n};\n\n\n/**\n * @override\n */\ngoog.labs.mock.StubBinderImpl_.prototype.thenReturn = function(value) {\n  return this.then(goog.functions.constant(value));\n};\n\n\n/**\n * Facilitates (and is the first step in) setting up stubs. Obtains an object\n * on which, the method to be mocked is called to create a stub. Sample usage:\n *\n * var mockObj = goog.labs.mock.mock(objectBeingMocked);\n * goog.labs.mock.when(mockObj).getFoo(3).thenReturn(4);\n *\n * Subsequent calls to `when` take precedence over earlier calls, allowing\n * users to set up default stubs in setUp methods and then override them in\n * individual tests.\n *\n * If a user wants sequential calls to their stub to return different\n * values, they can chain calls to `then` or `thenReturn` as\n * follows:\n *\n * var mockObj = goog.labs.mock.mock(objectBeingMocked);\n * goog.labs.mock.when(mockObj).getFoo(3)\n *     .thenReturn(4)\n *     .then(function() {\n *         throw new Error('exceptional case');\n *     });\n * @param {!Object} mockObject The mocked object.\n * @return {?} The property binder. Return type {?} to avoid compilation\n *     errors.\n * @suppress {strictMissingProperties} Part of the\n * go/strict_warnings_migration\n */\ngoog.labs.mock.when = function(mockObject) {\n  goog.asserts.assert(mockObject.$stubBinder, 'Stub binder cannot be null!');\n  return mockObject.$stubBinder;\n};\n\n\n\n/**\n * Represents a binding between a method name, args and a stub.\n *\n * @param {?string} methodName The name of the method being stubbed.\n * @param {!Array<?>} args The arguments passed to the method.\n * @param {!Function} stub The stub function to be called for the given\n *     method.\n * @constructor\n * @struct\n * @private\n */\ngoog.labs.mock.MethodBinding_ = function(methodName, args, stub) {\n  /**\n   * The name of the method being stubbed.\n   * @type {?string}\n   * @private\n   */\n  this.methodName_ = methodName;\n\n  /**\n   * The arguments for the method being stubbed.\n   * @type {!Array<?>}\n   * @private\n   */\n  this.args_ = args;\n\n  /**\n   * The stub function.\n   * @type {!Function}\n   * @private\n   */\n  this.stub_ = stub;\n};\n\n\n/**\n * @return {!Function} The stub to be executed.\n */\ngoog.labs.mock.MethodBinding_.prototype.getStub = function() {\n  return this.stub_;\n};\n\n\n/**\n * @override\n * @return {string} A readable string representation of the binding\n *  as a method call.\n */\ngoog.labs.mock.MethodBinding_.prototype.toString = function() {\n  return goog.labs.mock.formatMethodCall_(this.methodName_ || '', this.args_);\n};\n\n\n/**\n * @return {string} The method name for this binding.\n */\ngoog.labs.mock.MethodBinding_.prototype.getMethodName = function() {\n  return this.methodName_ || '';\n};\n\n\n/**\n * Determines whether the given args match the stored args_. Used to determine\n * which stub to invoke for a method.\n *\n * @param {string} methodName The name of the method being stubbed.\n * @param {!Array<?>} args An array of arguments.\n * @param {boolean} isVerification Whether this is a function verification\n *     call or not.\n * @return {boolean} If it matches the stored arguments.\n */\ngoog.labs.mock.MethodBinding_.prototype.matches = function(\n    methodName, args, isVerification) {\n  var specs = isVerification ? args : this.args_;\n  var calls = isVerification ? this.args_ : args;\n\n  // TODO(user): More elaborate argument matching. Think about matching\n  //    objects.\n  return this.methodName_ == methodName &&\n      goog.array.equals(calls, specs, function(arg, spec) {\n        // Duck-type to see if this is an object that implements the\n        // goog.labs.testing.Matcher interface.\n        if (spec && goog.isFunction(spec.matches)) {\n          return spec.matches(arg);\n        } else {\n          return goog.array.defaultCompareEquality(spec, arg);\n        }\n      });\n};\n","^?",1579837703000,"^@",["^A",["^1J","~$goog.functions","~$goog.labs.mock.verification.VerificationMode","^3","~$goog.labs.mock.timeout","^21","~$goog.labs.mock.verification.BaseVerificationMode","~$goog.debug.Error","~$goog.debug","~$goog.labs.mock.timeout.TimeoutMode","~$goog.labs.mock.verification","^1S"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/mock/mock.js"],"^S",["^A",["~$goog.labs.mock.TimeoutError","~$goog.labs.mock.VerificationError","~$goog.labs.mock"]],"^1",true,"^2",["^3","^1S","^1J","^2A","^2@","^2<","^2>","^2B","^2C","^2?","^2=","^21"]],["^ ","^7",[1579837703000],"^8","goog.locale.timezonedetection.js","^9",["^:","goog/locale/timezonedetection.js"],"^;","goog/locale/timezonedetection.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions for detecting user's time zone.\n * This work is based on Charlie Luo and Hong Yan's time zone detection work\n * for CBG.\n */\ngoog.provide('goog.locale.timeZoneDetection');\n\ngoog.require('goog.locale.TimeZoneFingerprint');\n\n\n/**\n * Array of time instances for checking the time zone offset.\n * @type {Array<number>}\n * @private\n */\ngoog.locale.timeZoneDetection.TZ_POKE_POINTS_ = [\n  1109635200, 1128902400, 1130657000, 1143333000, 1143806400, 1145000000,\n  1146380000, 1152489600, 1159800000, 1159500000, 1162095000, 1162075000,\n  1162105500\n];\n\n\n/**\n * Calculates time zone fingerprint by poking time zone offsets for 13\n * preselected time points.\n * See {@link goog.locale.timeZoneDetection.TZ_POKE_POINTS_}\n * @param {Date} date Date for calculating the fingerprint.\n * @return {number} Fingerprint of user's time zone setting.\n */\ngoog.locale.timeZoneDetection.getFingerprint = function(date) {\n  var hash = 0;\n  var stdOffset;\n  var isComplex = false;\n  for (var i = 0; i < goog.locale.timeZoneDetection.TZ_POKE_POINTS_.length;\n       i++) {\n    date.setTime(goog.locale.timeZoneDetection.TZ_POKE_POINTS_[i] * 1000);\n    var offset = date.getTimezoneOffset() / 30 + 48;\n    if (i == 0) {\n      stdOffset = offset;\n    } else if (stdOffset != offset) {\n      isComplex = true;\n    }\n    hash = (hash << 2) ^ offset;\n  }\n  return isComplex ? hash : /** @type {number} */ (stdOffset);\n};\n\n\n/**\n * Detects browser's time zone setting. If user's country is known, a better\n * time zone choice could be guessed.\n * @param {string=} opt_country Two-letter ISO 3166 country code.\n * @param {Date=} opt_date Date for calculating the fingerprint. Defaults to the\n *     current date.\n * @return {string} Time zone ID of best guess.\n */\ngoog.locale.timeZoneDetection.detectTimeZone = function(opt_country, opt_date) {\n  var date = opt_date || new Date();\n  var fingerprint = goog.locale.timeZoneDetection.getFingerprint(date);\n  var timeZoneList = goog.locale.TimeZoneFingerprint[fingerprint];\n  // Timezones in goog.locale.TimeZoneDetection.TimeZoneMap are in the format\n  // US-America/Los_Angeles. Country code needs to be stripped before a\n  // timezone is returned.\n  if (timeZoneList) {\n    if (opt_country) {\n      for (var i = 0; i < timeZoneList.length; ++i) {\n        if (timeZoneList[i].indexOf(opt_country) == 0) {\n          return timeZoneList[i].substring(3);\n        }\n      }\n    }\n    return timeZoneList[0].substring(3);\n  }\n  return '';\n};\n\n\n/**\n * Returns an array of time zones that are consistent with user's platform\n * setting. If user's country is given, only the time zone for that country is\n * returned.\n * @param {string=} opt_country 2 letter ISO 3166 country code. Helps in making\n *     a better guess for user's time zone.\n * @param {Date=} opt_date Date for retrieving timezone list. Defaults to the\n *     current date.\n * @return {!Array<string>} Array of time zone IDs.\n */\ngoog.locale.timeZoneDetection.getTimeZoneList = function(\n    opt_country, opt_date) {\n  var date = opt_date || new Date();\n  var fingerprint = goog.locale.timeZoneDetection.getFingerprint(date);\n  var timeZoneList = goog.locale.TimeZoneFingerprint[fingerprint];\n  if (!timeZoneList) {\n    return [];\n  }\n  var chosenList = [];\n  for (var i = 0; i < timeZoneList.length; i++) {\n    if (!opt_country || timeZoneList[i].indexOf(opt_country) == 0) {\n      chosenList.push(timeZoneList[i].substring(3));\n    }\n  }\n  return chosenList;\n};\n","^?",1579837703000,"^@",["^A",["^3","~$goog.locale.TimeZoneFingerprint"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/locale/timezonedetection.js"],"^S",["^A",["~$goog.locale.timeZoneDetection"]],"^1",true,"^2",["^3","^2G"]],["^ ","^7",[1579837703000],"^8","goog.ui.editor.messages.js","^9",["^:","goog/ui/editor/messages.js"],"^;","goog/ui/editor/messages.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Messages common to Editor UI components.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.ui.editor.messages');\n\ngoog.require('goog.html.SafeHtmlFormatter');\n\n\n/** @desc Link button / bubble caption. */\ngoog.ui.editor.messages.MSG_LINK_CAPTION = goog.getMsg('Link');\n\n\n/** @desc Title for the dialog that edits a link. */\ngoog.ui.editor.messages.MSG_EDIT_LINK = goog.getMsg('Edit Link');\n\n\n/** @desc Prompt the user for the text of the link they've written. */\ngoog.ui.editor.messages.MSG_TEXT_TO_DISPLAY = goog.getMsg('Text to display:');\n\n\n/** @desc Prompt the user for the URL of the link they've created. */\ngoog.ui.editor.messages.MSG_LINK_TO = goog.getMsg('Link to:');\n\n\n/** @desc Prompt the user to type a web address for their link. */\ngoog.ui.editor.messages.MSG_ON_THE_WEB = goog.getMsg('Web address');\n\n\n/** @desc More details on what linking to a web address involves.. */\ngoog.ui.editor.messages.MSG_ON_THE_WEB_TIP =\n    goog.getMsg('Link to a page or file somewhere else on the web');\n\n\n/**\n * @desc Text for a button that allows the user to test the link that\n *     they created.\n */\ngoog.ui.editor.messages.MSG_TEST_THIS_LINK = goog.getMsg('Test this link');\n\n\n/**\n * @return {!goog.html.SafeHtml} SafeHtml version of MSG_TR_LINK_EXPLANATION.\n */\ngoog.ui.editor.messages.getTrLinkExplanationSafeHtml = function() {\n  var formatter = new goog.html.SafeHtmlFormatter();\n\n  /**\n   * @desc Explanation for how to create a link with the link-editing dialog.\n   */\n  var MSG_TR_LINK_EXPLANATION = goog.getMsg(\n      '{$startBold}Not sure what to put in the box?{$endBold} ' +\n          'First, find the page on the web that you want to ' +\n          'link to. (A {$searchEngineLink}search engine{$endLink} ' +\n          'might be useful.) Then, copy the web address from ' +\n          'the box in your browser\\'s address bar, and paste it into ' +\n          'the box above.',\n      {\n        'startBold': formatter.startTag('b'),\n        'endBold': formatter.endTag('b'),\n        'searchEngineLink': formatter.startTag(\n            'a', {'href': 'http://www.google.com/', 'target': '_new'}),\n        'endLink': formatter.endTag('a')\n      });\n\n  return formatter.format(MSG_TR_LINK_EXPLANATION);\n};\n\n\n/** @desc Prompt for the URL of a link that the user is creating. */\ngoog.ui.editor.messages.MSG_WHAT_URL =\n    goog.getMsg('To what URL should this link go?');\n\n\n/**\n * @desc Prompt for an email address, so that the user can create a link\n *    that sends an email.\n */\ngoog.ui.editor.messages.MSG_EMAIL_ADDRESS = goog.getMsg('Email address');\n\n\n/**\n * @desc Explanation of the prompt for an email address in a link.\n */\ngoog.ui.editor.messages.MSG_EMAIL_ADDRESS_TIP =\n    goog.getMsg('Link to an email address');\n\n\n/** @desc Error message when the user enters an invalid email address. */\ngoog.ui.editor.messages.MSG_INVALID_EMAIL =\n    goog.getMsg('Invalid email address');\n\n\n/**\n * @desc When the user creates a mailto link, asks them what email\n *     address clicking on this link will send mail to.\n */\ngoog.ui.editor.messages.MSG_WHAT_EMAIL =\n    goog.getMsg('To what email address should this link?');\n\n\n/**\n * @return {!goog.html.SafeHtml} SafeHtml version of MSG_EMAIL_EXPLANATION.\n */\ngoog.ui.editor.messages.getEmailExplanationSafeHtml = function() {\n  var formatter = new goog.html.SafeHtmlFormatter();\n\n  /**\n   * @desc Warning about the dangers of creating links with email\n   *     addresses in them.\n   */\n  var MSG_EMAIL_EXPLANATION = goog.getMsg(\n      '{$preb}Be careful.{$postb} ' +\n          'Remember that any time you include an email address on a web ' +\n          'page, nasty spammers can find it too.',\n      {'preb': formatter.startTag('b'), 'postb': formatter.endTag('b')});\n\n  return formatter.format(MSG_EMAIL_EXPLANATION);\n};\n\n\n/**\n * @desc Label for the checkbox that allows the user to specify what when this\n *     link is clicked, it should be opened in a new window.\n */\ngoog.ui.editor.messages.MSG_OPEN_IN_NEW_WINDOW =\n    goog.getMsg('Open this link in a new window');\n\n\n/** @desc Image bubble caption. */\ngoog.ui.editor.messages.MSG_IMAGE_CAPTION = goog.getMsg('Image');\n","^?",1579837703000,"^@",["^A",["~$goog.html.SafeHtmlFormatter","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/editor/messages.js"],"^S",["^A",["~$goog.ui.editor.messages"]],"^1",true,"^2",["^3","^2I"]],["^ ","^7",[1579837703000],"^8","goog.ui.colorpicker.js","^9",["^:","goog/ui/colorpicker.js"],"^;","goog/ui/colorpicker.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A color picker component.  A color picker can compose several\n * instances of goog.ui.ColorPalette.\n *\n * NOTE: The ColorPicker is in a state of transition towards the common\n * component/control/container interface we are developing.  If the API changes\n * we will do our best to update your code.  The end result will be that a\n * color picker will compose multiple color palettes.  In the simple case this\n * will be one grid, but may consistute 3 distinct grids, a custom color picker\n * or even a color wheel.\n *\n */\n\ngoog.provide('goog.ui.ColorPicker');\ngoog.provide('goog.ui.ColorPicker.EventType');\n\ngoog.require('goog.ui.ColorPalette');\ngoog.require('goog.ui.Component');\n\n\n\n/**\n * Create a new, empty color picker.\n *\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @param {goog.ui.ColorPalette=} opt_colorPalette Optional color palette to\n *     use for this color picker.\n * @extends {goog.ui.Component}\n * @constructor\n * @final\n */\ngoog.ui.ColorPicker = function(opt_domHelper, opt_colorPalette) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * The color palette used inside the color picker.\n   * @type {goog.ui.ColorPalette?}\n   * @private\n   */\n  this.colorPalette_ = opt_colorPalette || null;\n\n  this.getHandler().listen(\n      this, goog.ui.Component.EventType.ACTION, this.onColorPaletteAction_);\n};\ngoog.inherits(goog.ui.ColorPicker, goog.ui.Component);\n\n\n/**\n * Default number of columns in the color palette. May be overridden by calling\n * setSize.\n *\n * @type {number}\n */\ngoog.ui.ColorPicker.DEFAULT_NUM_COLS = 5;\n\n\n/**\n * Constants for event names.\n * @enum {string}\n */\ngoog.ui.ColorPicker.EventType = {\n  CHANGE: 'change'\n};\n\n\n/**\n * Whether the component is focusable.\n * @type {boolean}\n * @private\n */\ngoog.ui.ColorPicker.prototype.focusable_ = true;\n\n\n/**\n * Gets the array of colors displayed by the color picker.\n * Modifying this array will lead to unexpected behavior.\n * @return {Array<string>?} The colors displayed by this widget.\n */\ngoog.ui.ColorPicker.prototype.getColors = function() {\n  return this.colorPalette_ ? this.colorPalette_.getColors() : null;\n};\n\n\n/**\n * Sets the array of colors to be displayed by the color picker.\n * @param {Array<string>} colors The array of colors to be added.\n */\ngoog.ui.ColorPicker.prototype.setColors = function(colors) {\n  // TODO(user): Don't add colors directly, we should add palettes and the\n  // picker should support multiple palettes.\n  if (!this.colorPalette_) {\n    this.createColorPalette_(colors);\n  } else {\n    this.colorPalette_.setColors(colors);\n  }\n};\n\n\n/**\n * Sets the array of colors to be displayed by the color picker.\n * @param {Array<string>} colors The array of colors to be added.\n * @deprecated Use setColors.\n */\ngoog.ui.ColorPicker.prototype.addColors = function(colors) {\n  this.setColors(colors);\n};\n\n\n/**\n * Sets the size of the palette.  Will throw an error after the picker has been\n * rendered.\n * @param {goog.math.Size|number} size The size of the grid.\n */\ngoog.ui.ColorPicker.prototype.setSize = function(size) {\n  // TODO(user): The color picker should contain multiple palettes which will\n  // all be resized at this point.\n  if (!this.colorPalette_) {\n    this.createColorPalette_([]);\n  }\n  this.colorPalette_.setSize(size);\n};\n\n\n/**\n * Gets the number of columns displayed.\n * @return {goog.math.Size?} The size of the grid.\n */\ngoog.ui.ColorPicker.prototype.getSize = function() {\n  return this.colorPalette_ ? this.colorPalette_.getSize() : null;\n};\n\n\n/**\n * Sets the number of columns.  Will throw an error after the picker has been\n * rendered.\n * @param {number} n The number of columns.\n * @deprecated Use setSize.\n */\ngoog.ui.ColorPicker.prototype.setColumnCount = function(n) {\n  this.setSize(n);\n};\n\n\n/**\n * @return {number} The index of the color selected.\n */\ngoog.ui.ColorPicker.prototype.getSelectedIndex = function() {\n  return this.colorPalette_ ? this.colorPalette_.getSelectedIndex() : -1;\n};\n\n\n/**\n * Sets which color is selected. A value that is out-of-range means that no\n * color is selected.\n * @param {number} ind The index in this.colors_ of the selected color.\n */\ngoog.ui.ColorPicker.prototype.setSelectedIndex = function(ind) {\n  if (this.colorPalette_) {\n    this.colorPalette_.setSelectedIndex(ind);\n  }\n};\n\n\n/**\n * Gets the color that is currently selected in this color picker.\n * @return {?string} The hex string of the color selected, or null if no\n *     color is selected.\n */\ngoog.ui.ColorPicker.prototype.getSelectedColor = function() {\n  return this.colorPalette_ ? this.colorPalette_.getSelectedColor() : null;\n};\n\n\n/**\n * Sets which color is selected.  Noop if the color palette hasn't been created\n * yet.\n * @param {string} color The selected color.\n */\ngoog.ui.ColorPicker.prototype.setSelectedColor = function(color) {\n  // TODO(user): This will set the color in the first available palette that\n  // contains it\n  if (this.colorPalette_) {\n    this.colorPalette_.setSelectedColor(color);\n  }\n};\n\n\n/**\n * Returns true if the component is focusable, false otherwise.  The default\n * is true.  Focusable components always have a tab index and allocate a key\n * handler to handle keyboard events while focused.\n * @return {boolean} True iff the component is focusable.\n */\ngoog.ui.ColorPicker.prototype.isFocusable = function() {\n  return this.focusable_;\n};\n\n\n/**\n * Sets whether the component is focusable.  The default is true.\n * Focusable components always have a tab index and allocate a key handler to\n * handle keyboard events while focused.\n * @param {boolean} focusable True iff the component is focusable.\n */\ngoog.ui.ColorPicker.prototype.setFocusable = function(focusable) {\n  this.focusable_ = focusable;\n  if (this.colorPalette_) {\n    this.colorPalette_.setSupportedState(\n        goog.ui.Component.State.FOCUSED, focusable);\n  }\n};\n\n\n/**\n * ColorPickers cannot be used to decorate pre-existing html, since the\n * structure they build is fairly complicated.\n * @param {Element} element Element to decorate.\n * @return {boolean} Returns always false.\n * @override\n */\ngoog.ui.ColorPicker.prototype.canDecorate = function(element) {\n  return false;\n};\n\n\n/**\n * Renders the color picker inside the provided element. This will override the\n * current content of the element.\n * @override\n */\ngoog.ui.ColorPicker.prototype.enterDocument = function() {\n  goog.ui.ColorPicker.superClass_.enterDocument.call(this);\n  if (this.colorPalette_) {\n    this.colorPalette_.render(this.getElement());\n  }\n  this.getElement().unselectable = 'on';\n};\n\n\n/** @override */\ngoog.ui.ColorPicker.prototype.disposeInternal = function() {\n  goog.ui.ColorPicker.superClass_.disposeInternal.call(this);\n  if (this.colorPalette_) {\n    this.colorPalette_.dispose();\n    this.colorPalette_ = null;\n  }\n};\n\n\n/**\n * Sets the focus to the color picker's palette.\n */\ngoog.ui.ColorPicker.prototype.focus = function() {\n  if (this.colorPalette_) {\n    this.colorPalette_.getElement().focus();\n  }\n};\n\n\n/**\n * Handles actions from the color palette.\n *\n * @param {goog.events.Event} e The event.\n * @private\n */\ngoog.ui.ColorPicker.prototype.onColorPaletteAction_ = function(e) {\n  e.stopPropagation();\n  this.dispatchEvent(goog.ui.ColorPicker.EventType.CHANGE);\n};\n\n\n/**\n * Create a color palette for the color picker.\n * @param {Array<string>} colors Array of colors.\n * @private\n */\ngoog.ui.ColorPicker.prototype.createColorPalette_ = function(colors) {\n  // TODO(user): The color picker should eventually just contain a number of\n  // palettes and manage the interactions between them.  This will go away then.\n  var cp = new goog.ui.ColorPalette(colors, null, this.getDomHelper());\n  cp.setSize(goog.ui.ColorPicker.DEFAULT_NUM_COLS);\n  cp.setSupportedState(goog.ui.Component.State.FOCUSED, this.focusable_);\n  // TODO(user): Use addChild(cp, true) and remove calls to render.\n  this.addChild(cp);\n  this.colorPalette_ = cp;\n  if (this.isInDocument()) {\n    this.colorPalette_.render(this.getElement());\n  }\n};\n\n\n/**\n * Returns an unrendered instance of the color picker.  The colors and layout\n * are a simple color grid, the same as the old Gmail color picker.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @return {!goog.ui.ColorPicker} The unrendered instance.\n */\ngoog.ui.ColorPicker.createSimpleColorGrid = function(opt_domHelper) {\n  var cp = new goog.ui.ColorPicker(opt_domHelper);\n  cp.setSize(7);\n  cp.setColors(goog.ui.ColorPicker.SIMPLE_GRID_COLORS);\n  return cp;\n};\n\n\n/**\n * Array of colors for a 7-cell wide simple-grid color picker.\n * @type {Array<string>}\n */\ngoog.ui.ColorPicker.SIMPLE_GRID_COLORS = [\n  // grays\n  '#ffffff', '#cccccc', '#c0c0c0', '#999999', '#666666', '#333333', '#000000',\n  // reds\n  '#ffcccc', '#ff6666', '#ff0000', '#cc0000', '#990000', '#660000', '#330000',\n  // oranges\n  '#ffcc99', '#ff9966', '#ff9900', '#ff6600', '#cc6600', '#993300', '#663300',\n  // yellows\n  '#ffff99', '#ffff66', '#ffcc66', '#ffcc33', '#cc9933', '#996633', '#663333',\n  // olives\n  '#ffffcc', '#ffff33', '#ffff00', '#ffcc00', '#999900', '#666600', '#333300',\n  // greens\n  '#99ff99', '#66ff99', '#33ff33', '#33cc00', '#009900', '#006600', '#003300',\n  // turquoises\n  '#99ffff', '#33ffff', '#66cccc', '#00cccc', '#339999', '#336666', '#003333',\n  // blues\n  '#ccffff', '#66ffff', '#33ccff', '#3366ff', '#3333ff', '#000099', '#000066',\n  // purples\n  '#ccccff', '#9999ff', '#6666cc', '#6633ff', '#6600cc', '#333399', '#330099',\n  // violets\n  '#ffccff', '#ff99ff', '#cc66cc', '#cc33cc', '#993399', '#663366', '#330033'\n];\n","^?",1579837703000,"^@",["^A",["^1B","^3","~$goog.ui.ColorPalette"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/colorpicker.js"],"^S",["^A",["~$goog.ui.ColorPicker","~$goog.ui.ColorPicker.EventType"]],"^1",true,"^2",["^3","^2K","^1B"]],["^ ","^7",[1579837703000],"^8","goog.graphics.ext.path.js","^9",["^:","goog/graphics/ext/path.js"],"^;","goog/graphics/ext/path.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A thick wrapper around paths.\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.graphics.ext.Path');\n\ngoog.require('goog.graphics.AffineTransform');\ngoog.require('goog.graphics.Path');\ngoog.require('goog.math.Rect');\n\n\n\n/**\n * Creates a path object\n * @constructor\n * @extends {goog.graphics.Path}\n * @final\n */\ngoog.graphics.ext.Path = function() {\n  goog.graphics.Path.call(this);\n};\ngoog.inherits(goog.graphics.ext.Path, goog.graphics.Path);\n\n\n/**\n * Optional cached or user specified bounding box.  A user may wish to\n * precompute a bounding box to save time and include more accurate\n * computations.\n * @type {goog.math.Rect?}\n * @private\n */\ngoog.graphics.ext.Path.prototype.bounds_ = null;\n\n\n/**\n * Clones the path.\n * @return {!goog.graphics.ext.Path} A clone of this path.\n * @override\n */\ngoog.graphics.ext.Path.prototype.clone = function() {\n  var output = /** @type {goog.graphics.ext.Path} */\n      (goog.graphics.ext.Path.superClass_.clone.call(this));\n  output.bounds_ = this.bounds_ && this.bounds_.clone();\n  return output;\n};\n\n\n/**\n * Transforms the path. Only simple paths are transformable. Attempting\n * to transform a non-simple path will throw an error.\n * @param {!goog.graphics.AffineTransform} tx The transformation to perform.\n * @return {!goog.graphics.ext.Path} The path itself.\n * @override\n */\ngoog.graphics.ext.Path.prototype.transform = function(tx) {\n  goog.graphics.ext.Path.superClass_.transform.call(this, tx);\n\n  // Make sure the precomputed bounds are cleared when the path is transformed.\n  this.bounds_ = null;\n\n  return this;\n};\n\n\n/**\n * Modify the bounding box of the path.  This may cause the path to be\n * simplified (i.e. arcs converted to curves) as a side-effect.\n * @param {number} deltaX How far to translate the x coordinates.\n * @param {number} deltaY How far to translate the y coordinates.\n * @param {number} xFactor After translation, all x coordinates are multiplied\n *     by this number.\n * @param {number} yFactor After translation, all y coordinates are multiplied\n *     by this number.\n * @return {!goog.graphics.ext.Path} The path itself.\n */\ngoog.graphics.ext.Path.prototype.modifyBounds = function(\n    deltaX, deltaY, xFactor, yFactor) {\n  if (!this.isSimple()) {\n    var simple = goog.graphics.Path.createSimplifiedPath(this);\n    this.clear();\n    this.appendPath(simple);\n  }\n\n  return this.transform(\n      goog.graphics.AffineTransform.getScaleInstance(xFactor, yFactor)\n          .translate(deltaX, deltaY));\n};\n\n\n/**\n * Set the precomputed bounds.\n * @param {goog.math.Rect?} bounds The bounds to use, or set to null to clear\n *     and recompute on the next call to getBoundingBox.\n */\ngoog.graphics.ext.Path.prototype.useBoundingBox = function(bounds) {\n  this.bounds_ = bounds && bounds.clone();\n};\n\n\n/**\n * @return {goog.math.Rect?} The bounding box of the path, or null if the\n *     path is empty.\n */\ngoog.graphics.ext.Path.prototype.getBoundingBox = function() {\n  if (!this.bounds_ && !this.isEmpty()) {\n    var minY;\n    var minX = minY = Number.POSITIVE_INFINITY;\n    var maxY;\n    var maxX = maxY = Number.NEGATIVE_INFINITY;\n\n    var simplePath =\n        this.isSimple() ? this : goog.graphics.Path.createSimplifiedPath(this);\n    simplePath.forEachSegment(function(type, points) {\n      for (var i = 0, len = points.length; i < len; i += 2) {\n        minX = Math.min(minX, points[i]);\n        maxX = Math.max(maxX, points[i]);\n        minY = Math.min(minY, points[i + 1]);\n        maxY = Math.max(maxY, points[i + 1]);\n      }\n    });\n\n    this.bounds_ = new goog.math.Rect(minX, minY, maxX - minX, maxY - minY);\n  }\n\n  return this.bounds_;\n};\n","^?",1579837703000,"^@",["^A",["^1K","^3","~$goog.graphics.Path","~$goog.math.Rect"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/ext/path.js"],"^S",["^A",["~$goog.graphics.ext.Path"]],"^1",true,"^2",["^3","^1K","^2N","^2O"]],["^ ","^7",[1579837703000],"^8","goog.graphics.vmlgraphics.js","^9",["^:","goog/graphics/vmlgraphics.js"],"^;","goog/graphics/vmlgraphics.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview VmlGraphics sub class that uses VML to draw the graphics.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.graphics.VmlGraphics');\n\n\ngoog.require('goog.array');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.events');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.graphics.AbstractGraphics');\ngoog.require('goog.graphics.Font');\ngoog.require('goog.graphics.LinearGradient');\ngoog.require('goog.graphics.Path');\ngoog.require('goog.graphics.SolidFill');\ngoog.require('goog.graphics.VmlEllipseElement');\ngoog.require('goog.graphics.VmlGroupElement');\ngoog.require('goog.graphics.VmlImageElement');\ngoog.require('goog.graphics.VmlPathElement');\ngoog.require('goog.graphics.VmlRectElement');\ngoog.require('goog.graphics.VmlTextElement');\ngoog.require('goog.html.uncheckedconversions');\ngoog.require('goog.math');\ngoog.require('goog.math.Size');\ngoog.require('goog.reflect');\ngoog.require('goog.string');\ngoog.require('goog.string.Const');\ngoog.require('goog.style');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A Graphics implementation for drawing using VML.\n * @param {string|number} width The (non-zero) width in pixels.  Strings\n *     expressing percentages of parent with (e.g. '80%') are also accepted.\n * @param {string|number} height The (non-zero) height in pixels.  Strings\n *     expressing percentages of parent with (e.g. '80%') are also accepted.\n * @param {?number=} opt_coordWidth The coordinate width - if\n *     omitted or null, defaults to same as width.\n * @param {?number=} opt_coordHeight The coordinate height - if\n *     omitted or null, defaults to same as height.\n * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper object for the\n *     document we want to render in.\n * @constructor\n * @extends {goog.graphics.AbstractGraphics}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n * @final\n */\ngoog.graphics.VmlGraphics = function(\n    width, height, opt_coordWidth, opt_coordHeight, opt_domHelper) {\n  goog.graphics.AbstractGraphics.call(\n      this, width, height, opt_coordWidth, opt_coordHeight, opt_domHelper);\n  this.handler_ = new goog.events.EventHandler(this);\n  this.registerDisposable(this.handler_);\n};\ngoog.inherits(goog.graphics.VmlGraphics, goog.graphics.AbstractGraphics);\n\n\n/**\n * The prefix to use for VML elements\n * @private\n * @type {string}\n */\ngoog.graphics.VmlGraphics.VML_PREFIX_ = 'g_vml_';\n\n\n/**\n * The VML namespace URN\n * @private\n * @type {string}\n */\ngoog.graphics.VmlGraphics.VML_NS_ = 'urn:schemas-microsoft-com:vml';\n\n\n/**\n * The VML behavior URL.\n * @private\n * @type {string}\n */\ngoog.graphics.VmlGraphics.VML_IMPORT_ = '#default#VML';\n\n\n/**\n * Whether the document is using IE8 standards mode, and therefore needs hacks.\n * @private\n * @type {boolean}\n */\ngoog.graphics.VmlGraphics.IE8_MODE_ = goog.global.document &&\n    goog.global.document.documentMode && goog.global.document.documentMode >= 8;\n\n\n/**\n * The coordinate multiplier to allow sub-pixel rendering\n * @type {number}\n */\ngoog.graphics.VmlGraphics.COORD_MULTIPLIER = 100;\n\n\n/**\n * Converts the given size to a css size.  If it is a percentage, leaves it\n * alone.  Otherwise assumes px.\n *\n * @param {number|string} size The size to use.\n * @return {string} The position adjusted for COORD_MULTIPLIER.\n */\ngoog.graphics.VmlGraphics.toCssSize = function(size) {\n  return typeof size === 'string' && goog.string.endsWith(size, '%') ?\n      size :\n      parseFloat(size.toString()) + 'px';\n};\n\n\n/**\n * Multiplies positioning coordinates by COORD_MULTIPLIER to allow sub-pixel\n * coordinates.  Also adds a half pixel offset to match SVG.\n *\n * This function is internal for the VML supporting classes, and\n * should not be used externally.\n *\n * @param {number|string} number A position in pixels.\n * @return {number} The position adjusted for COORD_MULTIPLIER.\n */\ngoog.graphics.VmlGraphics.toPosCoord = function(number) {\n  return Math.round(\n      (parseFloat(number.toString()) - 0.5) *\n      goog.graphics.VmlGraphics.COORD_MULTIPLIER);\n};\n\n\n/**\n * Add a \"px\" suffix to a number of pixels, and multiplies all coordinates by\n * COORD_MULTIPLIER to allow sub-pixel coordinates.\n *\n * This function is internal for the VML supporting classes, and\n * should not be used externally.\n *\n * @param {number|string} number A position in pixels.\n * @return {string} The position with suffix 'px'.\n */\ngoog.graphics.VmlGraphics.toPosPx = function(number) {\n  return goog.graphics.VmlGraphics.toPosCoord(number) + 'px';\n};\n\n\n/**\n * Multiplies the width or height coordinate by COORD_MULTIPLIER to allow\n * sub-pixel coordinates.\n *\n * This function is internal for the VML supporting classes, and\n * should not be used externally.\n *\n * @param {string|number} number A size in units.\n * @return {number} The size multiplied by the correct factor.\n */\ngoog.graphics.VmlGraphics.toSizeCoord = function(number) {\n  return Math.round(\n      parseFloat(number.toString()) *\n      goog.graphics.VmlGraphics.COORD_MULTIPLIER);\n};\n\n\n/**\n * Add a \"px\" suffix to a number of pixels, and multiplies all coordinates by\n * COORD_MULTIPLIER to allow sub-pixel coordinates.\n *\n * This function is internal for the VML supporting classes, and\n * should not be used externally.\n *\n * @param {number|string} number A size in pixels.\n * @return {string} The size with suffix 'px'.\n */\ngoog.graphics.VmlGraphics.toSizePx = function(number) {\n  return goog.graphics.VmlGraphics.toSizeCoord(number) + 'px';\n};\n\n\n/**\n * Sets an attribute on the given VML element, in the way best suited to the\n * current version of IE.  Should only be used in the goog.graphics package.\n * @param {Element} element The element to set an attribute\n *     on.\n * @param {string} name The name of the attribute to set.\n * @param {string} value The value to set it to.\n */\ngoog.graphics.VmlGraphics.setAttribute = function(element, name, value) {\n  if (goog.graphics.VmlGraphics.IE8_MODE_) {\n    element[name] = value;\n  } else {\n    element.setAttribute(name, value);\n  }\n};\n\n\n/**\n * Event handler.\n * @type {goog.events.EventHandler}\n * @private\n */\ngoog.graphics.VmlGraphics.prototype.handler_;\n\n\n/**\n * Creates a VML element. Used internally and by different VML classes.\n * @param {string} tagName The type of element to create.\n * @return {!Element} The created element.\n */\ngoog.graphics.VmlGraphics.prototype.createVmlElement = function(tagName) {\n  var element = this.dom_.createElement(\n      goog.graphics.VmlGraphics.VML_PREFIX_ + ':' + tagName);\n  element.id = goog.string.createUniqueString();\n  return element;\n};\n\n\n/**\n * Returns the VML element with the given id that is a child of this graphics\n * object.\n * Should be considered package private, and not used externally.\n * @param {string} id The element id to find.\n * @return {Element} The element with the given id, or null if none is found.\n */\ngoog.graphics.VmlGraphics.prototype.getVmlElement = function(id) {\n  return this.dom_.getElement(id);\n};\n\n\n/**\n * Resets the graphics so they will display properly on IE8.  Noop in older\n * versions.\n * @private\n */\ngoog.graphics.VmlGraphics.prototype.updateGraphics_ = function() {\n  if (goog.graphics.VmlGraphics.IE8_MODE_ && this.isInDocument()) {\n    // There's a risk of mXSS here, as the browser is not guaranteed to\n    // return the HTML that was originally written, when innerHTML is read.\n    // However, given that this a deprecated API and affects only IE, it seems\n    // an acceptable risk.\n    var html = goog.html.uncheckedconversions\n                   .safeHtmlFromStringKnownToSatisfyTypeContract(\n                       goog.string.Const.from('Assign innerHTML to itself'),\n                       this.getElement().innerHTML);\n    goog.dom.safe.setInnerHtml(\n        /** @type {!Element} */ (this.getElement()), html);\n  }\n};\n\n\n/**\n * Appends an element.\n *\n * @param {goog.graphics.Element} element The element wrapper.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element\n *     to append to. If not specified, appends to the main canvas.\n * @private\n */\ngoog.graphics.VmlGraphics.prototype.append_ = function(element, opt_group) {\n  var parent = opt_group || this.canvasElement;\n  parent.getElement().appendChild(element.getElement());\n  this.updateGraphics_();\n};\n\n\n/**\n * Sets the fill for the given element.\n * @param {goog.graphics.StrokeAndFillElement} element The element wrapper.\n * @param {goog.graphics.Fill?} fill The fill object.\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.graphics.VmlGraphics.prototype.setElementFill = function(element, fill) {\n  var vmlElement = element.getElement();\n  goog.graphics.VmlGraphics.removeFill_(vmlElement);\n  if (fill instanceof goog.graphics.SolidFill) {\n    // NOTE(arv): VML does not understand 'transparent' so hard code support\n    // for it.\n    if (fill.getColor() == 'transparent') {\n      vmlElement.filled = false;\n    } else if (fill.getOpacity() != 1) {\n      vmlElement.filled = true;\n      // Set opacity (number 0-1 is translated to percent)\n      var fillNode = this.createVmlElement('fill');\n      fillNode.opacity = Math.round(fill.getOpacity() * 100) + '%';\n      fillNode.color = fill.getColor();\n      vmlElement.appendChild(fillNode);\n    } else {\n      vmlElement.filled = true;\n      vmlElement.fillcolor = fill.getColor();\n    }\n  } else if (fill instanceof goog.graphics.LinearGradient) {\n    vmlElement.filled = true;\n    // Add a 'fill' element\n    var gradient = this.createVmlElement('fill');\n    gradient.color = fill.getColor1();\n    gradient.color2 = fill.getColor2();\n    if (typeof fill.getOpacity1() === 'number') {\n      gradient.opacity = fill.getOpacity1();\n    }\n    if (typeof fill.getOpacity2() === 'number') {\n      gradient.opacity2 = fill.getOpacity2();\n    }\n    var angle =\n        goog.math.angle(fill.getX1(), fill.getY1(), fill.getX2(), fill.getY2());\n    // Our angles start from 0 to the right, and grow clockwise.\n    // MSIE starts from 0 to top, and grows anti-clockwise.\n    angle = Math.round(goog.math.standardAngle(270 - angle));\n    gradient.angle = angle;\n    gradient.type = 'gradient';\n    vmlElement.appendChild(gradient);\n  } else {\n    vmlElement.filled = false;\n  }\n  this.updateGraphics_();\n};\n\n\n/**\n * Sets the stroke for the given element.\n * @param {goog.graphics.StrokeAndFillElement} element The element wrapper.\n * @param {goog.graphics.Stroke?} stroke The stroke object.\n * @override\n * @suppress {strictPrimitiveOperators,strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.graphics.VmlGraphics.prototype.setElementStroke = function(\n    element, stroke) {\n  var vmlElement = element.getElement();\n  if (stroke) {\n    vmlElement.stroked = true;\n\n    var width = stroke.getWidth();\n    if (typeof width === 'string' && width.indexOf('px') == -1) {\n      width = parseFloat(width);\n    } else {\n      width = width * this.getPixelScaleX();\n    }\n\n    var strokeElement = vmlElement.getElementsByTagName('stroke')[0];\n    if (!strokeElement) {\n      strokeElement = strokeElement || this.createVmlElement('stroke');\n      vmlElement.appendChild(strokeElement);\n    }\n    strokeElement.opacity = stroke.getOpacity();\n    strokeElement.weight = width + 'px';\n    strokeElement.color = stroke.getColor();\n  } else {\n    vmlElement.stroked = false;\n  }\n  this.updateGraphics_();\n};\n\n\n/**\n * Set the translation and rotation of an element.\n *\n * If a more general affine transform is needed than this provides\n * (e.g. skew and scale) then use setElementAffineTransform.\n * @param {goog.graphics.Element} element The element wrapper.\n * @param {number} x The x coordinate of the translation transform.\n * @param {number} y The y coordinate of the translation transform.\n * @param {number} angle The angle of the rotation transform.\n * @param {number} centerX The horizontal center of the rotation transform.\n * @param {number} centerY The vertical center of the rotation transform.\n * @override\n */\ngoog.graphics.VmlGraphics.prototype.setElementTransform = function(\n    element, x, y, angle, centerX, centerY) {\n  var el = element.getElement();\n\n  el.style.left = goog.graphics.VmlGraphics.toPosPx(x);\n  el.style.top = goog.graphics.VmlGraphics.toPosPx(y);\n  if (angle || el.rotation) {\n    el.rotation = angle;\n    el.coordsize = goog.graphics.VmlGraphics.toSizeCoord(centerX * 2) + ' ' +\n        goog.graphics.VmlGraphics.toSizeCoord(centerY * 2);\n  }\n};\n\n\n/**\n * Set the transformation of an element.\n * @param {!goog.graphics.Element} element The element wrapper.\n * @param {!goog.graphics.AffineTransform} affineTransform The\n *     transformation applied to this element.\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.graphics.VmlGraphics.prototype.setElementAffineTransform = function(\n    element, affineTransform) {\n  var t = affineTransform;\n  var vmlElement = element.getElement();\n  goog.graphics.VmlGraphics.removeSkew_(vmlElement);\n  var skewNode = this.createVmlElement('skew');\n  skewNode.on = 'true';\n  // Move the transform origin to 0px,0px of the graphics.\n  // In VML, 0,0 means the center of the element, -0.5,-0.5 left top conner of\n  // it.\n  skewNode.origin =\n      (-vmlElement.style.pixelLeft / vmlElement.style.pixelWidth - 0.5) + ',' +\n      (-vmlElement.style.pixelTop / vmlElement.style.pixelHeight - 0.5);\n  skewNode.offset = t.getTranslateX().toFixed(1) + 'px,' +\n      t.getTranslateY().toFixed(1) + 'px';\n  skewNode.matrix = [\n    t.getScaleX().toFixed(6), t.getShearX().toFixed(6),\n    t.getShearY().toFixed(6), t.getScaleY().toFixed(6), 0, 0\n  ].join(',');\n  vmlElement.appendChild(skewNode);\n  this.updateGraphics_();\n};\n\n\n/**\n * Removes the skew information from a dom element.\n * @param {Element} element DOM element.\n * @private\n */\ngoog.graphics.VmlGraphics.removeSkew_ = function(element) {\n  goog.array.forEach(element.childNodes, /** @suppress {strictMissingProperties} Part of the go/strict_warnings_migration */\n                                         function(child) {\n    if (child.tagName == 'skew') {\n      element.removeChild(child);\n    }\n  });\n};\n\n\n/**\n * Removes the fill information from a dom element.\n * @param {Element} element DOM element.\n * @private\n */\ngoog.graphics.VmlGraphics.removeFill_ = function(element) {\n  element.fillcolor = '';\n  goog.array.forEach(element.childNodes, /** @suppress {strictMissingProperties} Part of the go/strict_warnings_migration */\n                                         function(child) {\n    if (child.tagName == 'fill') {\n      element.removeChild(child);\n    }\n  });\n};\n\n\n/**\n * Set top, left, width and height for an element.\n * This function is internal for the VML supporting classes, and\n * should not be used externally.\n *\n * @param {Element} element DOM element.\n * @param {number} left Left ccordinate in pixels.\n * @param {number} top Top ccordinate in pixels.\n * @param {number} width Width in pixels.\n * @param {number} height Height in pixels.\n */\ngoog.graphics.VmlGraphics.setPositionAndSize = function(\n    element, left, top, width, height) {\n  var style = element.style;\n  style.position = 'absolute';\n  style.left = goog.graphics.VmlGraphics.toPosPx(left);\n  style.top = goog.graphics.VmlGraphics.toPosPx(top);\n  style.width = goog.graphics.VmlGraphics.toSizePx(width);\n  style.height = goog.graphics.VmlGraphics.toSizePx(height);\n\n  if (element.tagName == 'shape') {\n    element.coordsize = goog.graphics.VmlGraphics.toSizeCoord(width) + ' ' +\n        goog.graphics.VmlGraphics.toSizeCoord(height);\n  }\n};\n\n\n/**\n * Creates an element spanning the surface.\n *\n * @param {string} type The type of element to create.\n * @return {!Element} The created, positioned, and sized element.\n * @private\n */\ngoog.graphics.VmlGraphics.prototype.createFullSizeElement_ = function(type) {\n  var element = this.createVmlElement(type);\n  var size = this.getCoordSize();\n  goog.graphics.VmlGraphics.setPositionAndSize(\n      element, 0, 0, size.width, size.height);\n  return element;\n};\n\n\n/**\n * IE magic - if this \"no-op\" logic is not here, the 'if' statement in createDom\n * will fail intermittently.  The logic is used to prevent the JsCompiler from\n * stripping this piece of code, which it quite reasonably thinks is doing\n * nothing. Put it in try-catch block to prevent \"Unspecified Error\" when\n * this statement is executed in a defer JS in IE.\n * More info here:\n * http://www.mail-archive.com/users@openlayers.org/msg01838.html\n */\nif (goog.userAgent.IE) {\n  try {\n    goog.reflect.sinkValue(document.namespaces);\n  } catch (e) {\n  }\n}\n\n\n/**\n * Creates the DOM representation of the graphics area.\n * @override\n */\ngoog.graphics.VmlGraphics.prototype.createDom = function() {\n  var doc = this.dom_.getDocument();\n\n  // Add the namespace.\n  if (!doc.namespaces[goog.graphics.VmlGraphics.VML_PREFIX_]) {\n    if (goog.graphics.VmlGraphics.IE8_MODE_) {\n      doc.namespaces.add(\n          goog.graphics.VmlGraphics.VML_PREFIX_,\n          goog.graphics.VmlGraphics.VML_NS_,\n          goog.graphics.VmlGraphics.VML_IMPORT_);\n    } else {\n      doc.namespaces.add(\n          goog.graphics.VmlGraphics.VML_PREFIX_,\n          goog.graphics.VmlGraphics.VML_NS_);\n    }\n\n    // We assume that we only need to add the CSS if the namespace was not\n    // present\n    var ss = doc.createStyleSheet();\n    ss.cssText = goog.graphics.VmlGraphics.VML_PREFIX_ + '\\\\:*' +\n        '{behavior:url(#default#VML)}';\n  }\n\n  // Outer a DIV with overflow hidden for clipping.\n  // All inner elements are absolutely positioned on-top of this div.\n  var pixelWidth = this.width;\n  var pixelHeight = this.height;\n  var divElement = this.dom_.createDom(goog.dom.TagName.DIV, {\n    'style': 'overflow:hidden;position:relative;width:' +\n        goog.graphics.VmlGraphics.toCssSize(pixelWidth) + ';height:' +\n        goog.graphics.VmlGraphics.toCssSize(pixelHeight)\n  });\n\n  this.setElementInternal(divElement);\n\n  var group = this.createVmlElement('group');\n  var style = group.style;\n\n  style.position = 'absolute';\n  style.left = style.top = '0';\n  style.width = this.width;\n  style.height = this.height;\n  if (this.coordWidth) {\n    group.coordsize = goog.graphics.VmlGraphics.toSizeCoord(this.coordWidth) +\n        ' ' +\n        goog.graphics.VmlGraphics.toSizeCoord(\n            /** @type {number} */ (this.coordHeight));\n  } else {\n    group.coordsize = goog.graphics.VmlGraphics.toSizeCoord(pixelWidth) + ' ' +\n        goog.graphics.VmlGraphics.toSizeCoord(pixelHeight);\n  }\n\n  if (this.coordLeft !== undefined) {\n    group.coordorigin = goog.graphics.VmlGraphics.toSizeCoord(this.coordLeft) +\n        ' ' + goog.graphics.VmlGraphics.toSizeCoord(this.coordTop);\n  } else {\n    group.coordorigin = '0 0';\n  }\n  divElement.appendChild(group);\n\n  this.canvasElement = new goog.graphics.VmlGroupElement(group, this);\n\n  goog.events.listen(\n      divElement, goog.events.EventType.RESIZE,\n      goog.bind(this.handleContainerResize_, this));\n};\n\n\n/**\n * Changes the canvas element size to match the container element size.\n * @private\n */\ngoog.graphics.VmlGraphics.prototype.handleContainerResize_ = function() {\n  var size = goog.style.getSize(this.getElement());\n  var style = this.canvasElement.getElement().style;\n\n  if (size.width) {\n    style.width = size.width + 'px';\n    style.height = size.height + 'px';\n  } else {\n    var current = this.getElement();\n    while (current && current.currentStyle &&\n           current.currentStyle.display != 'none') {\n      current = current.parentNode;\n    }\n    if (current && current.currentStyle) {\n      this.handler_.listen(\n          current, 'propertychange', this.handleContainerResize_);\n    }\n  }\n\n  this.dispatchEvent(goog.events.EventType.RESIZE);\n};\n\n\n/**\n * Handle property changes on hidden ancestors.\n * @param {goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.graphics.VmlGraphics.prototype.handlePropertyChange_ = function(e) {\n  var prop = e.getBrowserEvent().propertyName;\n  if (prop == 'display' || prop == 'className') {\n    this.handler_.unlisten(\n        /** @type {Element} */ (e.target), 'propertychange',\n        this.handlePropertyChange_);\n    this.handleContainerResize_();\n  }\n};\n\n\n/**\n * Changes the coordinate system position.\n * @param {number} left The coordinate system left bound.\n * @param {number} top The coordinate system top bound.\n * @override\n */\ngoog.graphics.VmlGraphics.prototype.setCoordOrigin = function(left, top) {\n  this.coordLeft = left;\n  this.coordTop = top;\n\n  this.canvasElement.getElement().coordorigin =\n      goog.graphics.VmlGraphics.toSizeCoord(this.coordLeft) + ' ' +\n      goog.graphics.VmlGraphics.toSizeCoord(this.coordTop);\n};\n\n\n/**\n * Changes the coordinate size.\n * @param {number} coordWidth The coordinate width.\n * @param {number} coordHeight The coordinate height.\n * @override\n */\ngoog.graphics.VmlGraphics.prototype.setCoordSize = function(\n    coordWidth, coordHeight) {\n  goog.graphics.VmlGraphics.superClass_.setCoordSize.apply(this, arguments);\n\n  this.canvasElement.getElement().coordsize =\n      goog.graphics.VmlGraphics.toSizeCoord(coordWidth) + ' ' +\n      goog.graphics.VmlGraphics.toSizeCoord(coordHeight);\n};\n\n\n/**\n * Change the size of the canvas.\n * @param {number} pixelWidth The width in pixels.\n * @param {number} pixelHeight The height in pixels.\n * @override\n */\ngoog.graphics.VmlGraphics.prototype.setSize = function(\n    pixelWidth, pixelHeight) {\n  goog.style.setSize(this.getElement(), pixelWidth, pixelHeight);\n};\n\n\n/**\n * @return {!goog.math.Size} Returns the number of pixels spanned by the\n *     surface.\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.graphics.VmlGraphics.prototype.getPixelSize = function() {\n  var el = this.getElement();\n  // The following relies on the fact that the size can never be 0.\n  return new goog.math.Size(\n      el.style.pixelWidth || el.offsetWidth || 1,\n      el.style.pixelHeight || el.offsetHeight || 1);\n};\n\n\n/**\n * Remove all drawing elements from the graphics.\n * @override\n */\ngoog.graphics.VmlGraphics.prototype.clear = function() {\n  this.canvasElement.clear();\n};\n\n\n/**\n * Draw an ellipse.\n *\n * @param {number} cx Center X coordinate.\n * @param {number} cy Center Y coordinate.\n * @param {number} rx Radius length for the x-axis.\n * @param {number} ry Radius length for the y-axis.\n * @param {goog.graphics.Stroke?} stroke Stroke object describing the\n *    stroke.\n * @param {goog.graphics.Fill?} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element\n *     to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.EllipseElement} The newly created element.\n * @override\n */\ngoog.graphics.VmlGraphics.prototype.drawEllipse = function(\n    cx, cy, rx, ry, stroke, fill, opt_group) {\n  var element = this.createVmlElement('oval');\n  goog.graphics.VmlGraphics.setPositionAndSize(\n      element, cx - rx, cy - ry, rx * 2, ry * 2);\n  var wrapper = new goog.graphics.VmlEllipseElement(\n      element, this, cx, cy, rx, ry, stroke, fill);\n  this.append_(wrapper, opt_group);\n  return wrapper;\n};\n\n\n/**\n * Draw a rectangle.\n *\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @param {number} width Width of rectangle.\n * @param {number} height Height of rectangle.\n * @param {goog.graphics.Stroke?} stroke Stroke object describing the\n *    stroke.\n * @param {goog.graphics.Fill?} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element\n *     to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.RectElement} The newly created element.\n * @override\n */\ngoog.graphics.VmlGraphics.prototype.drawRect = function(\n    x, y, width, height, stroke, fill, opt_group) {\n  var element = this.createVmlElement('rect');\n  goog.graphics.VmlGraphics.setPositionAndSize(element, x, y, width, height);\n  var wrapper = new goog.graphics.VmlRectElement(element, this, stroke, fill);\n  this.append_(wrapper, opt_group);\n  return wrapper;\n};\n\n\n/**\n * Draw an image.\n *\n * @param {number} x X coordinate (left).\n * @param {number} y Y coordinate (top).\n * @param {number} width Width of image.\n * @param {number} height Height of image.\n * @param {string} src Source of the image.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element\n *     to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.ImageElement} The newly created element.\n */\ngoog.graphics.VmlGraphics.prototype.drawImage = function(\n    x, y, width, height, src, opt_group) {\n  var element = this.createVmlElement('image');\n  goog.graphics.VmlGraphics.setPositionAndSize(element, x, y, width, height);\n  goog.graphics.VmlGraphics.setAttribute(element, 'src', src);\n  var wrapper = new goog.graphics.VmlImageElement(element, this);\n  this.append_(wrapper, opt_group);\n  return wrapper;\n};\n\n\n/**\n * Draw a text string vertically centered on a given line.\n *\n * @param {string} text The text to draw.\n * @param {number} x1 X coordinate of start of line.\n * @param {number} y1 Y coordinate of start of line.\n * @param {number} x2 X coordinate of end of line.\n * @param {number} y2 Y coordinate of end of line.\n * @param {?string} align Horizontal alignment: left (default), center, right.\n * @param {goog.graphics.Font} font Font describing the font properties.\n * @param {goog.graphics.Stroke?} stroke Stroke object describing the stroke.\n * @param {goog.graphics.Fill?} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element\n *     to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.TextElement} The newly created element.\n * @override\n */\ngoog.graphics.VmlGraphics.prototype.drawTextOnLine = function(\n    text, x1, y1, x2, y2, align, font, stroke, fill, opt_group) {\n  var shape = this.createFullSizeElement_('shape');\n\n  var pathElement = this.createVmlElement('path');\n  var path = 'M' + goog.graphics.VmlGraphics.toPosCoord(x1) + ',' +\n      goog.graphics.VmlGraphics.toPosCoord(y1) + 'L' +\n      goog.graphics.VmlGraphics.toPosCoord(x2) + ',' +\n      goog.graphics.VmlGraphics.toPosCoord(y2) + 'E';\n  goog.graphics.VmlGraphics.setAttribute(pathElement, 'v', path);\n  goog.graphics.VmlGraphics.setAttribute(pathElement, 'textpathok', 'true');\n\n  var textPathElement = this.createVmlElement('textpath');\n  textPathElement.setAttribute('on', 'true');\n  var style = textPathElement.style;\n  style.fontSize = font.size * this.getPixelScaleX();\n  style.fontFamily = font.family;\n  if (align != null) {\n    style['v-text-align'] = align;\n  }\n  if (font.bold) {\n    style.fontWeight = 'bold';\n  }\n  if (font.italic) {\n    style.fontStyle = 'italic';\n  }\n  goog.graphics.VmlGraphics.setAttribute(textPathElement, 'string', text);\n\n  shape.appendChild(pathElement);\n  shape.appendChild(textPathElement);\n  var wrapper = new goog.graphics.VmlTextElement(shape, this, stroke, fill);\n  this.append_(wrapper, opt_group);\n  return wrapper;\n};\n\n\n/**\n * Draw a path.\n *\n * @param {!goog.graphics.Path} path The path object to draw.\n * @param {goog.graphics.Stroke?} stroke Stroke object describing the stroke.\n * @param {goog.graphics.Fill?} fill Fill object describing the fill.\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element\n *     to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.PathElement} The newly created element.\n * @override\n */\ngoog.graphics.VmlGraphics.prototype.drawPath = function(\n    path, stroke, fill, opt_group) {\n  var element = this.createFullSizeElement_('shape');\n  goog.graphics.VmlGraphics.setAttribute(\n      element, 'path', goog.graphics.VmlGraphics.getVmlPath(path));\n\n  var wrapper = new goog.graphics.VmlPathElement(element, this, stroke, fill);\n  this.append_(wrapper, opt_group);\n  return wrapper;\n};\n\n\n/**\n * Returns a string representation of a logical path suitable for use in\n * a VML element.\n *\n * @param {goog.graphics.Path} path The logical path.\n * @return {string} The VML path representation.\n * @suppress {deprecated} goog.graphics is deprecated.\n */\ngoog.graphics.VmlGraphics.getVmlPath = function(path) {\n  var list = [];\n  path.forEachSegment(function(segment, args) {\n    switch (segment) {\n      case goog.graphics.Path.Segment.MOVETO:\n        list.push('m');\n        Array.prototype.push.apply(\n            list, goog.array.map(args, goog.graphics.VmlGraphics.toSizeCoord));\n        break;\n      case goog.graphics.Path.Segment.LINETO:\n        list.push('l');\n        Array.prototype.push.apply(\n            list, goog.array.map(args, goog.graphics.VmlGraphics.toSizeCoord));\n        break;\n      case goog.graphics.Path.Segment.CURVETO:\n        list.push('c');\n        Array.prototype.push.apply(\n            list, goog.array.map(args, goog.graphics.VmlGraphics.toSizeCoord));\n        break;\n      case goog.graphics.Path.Segment.CLOSE:\n        list.push('x');\n        break;\n      case goog.graphics.Path.Segment.ARCTO:\n        var toAngle = args[2] + args[3];\n        var cx = goog.graphics.VmlGraphics.toSizeCoord(\n            args[4] - goog.math.angleDx(toAngle, args[0]));\n        var cy = goog.graphics.VmlGraphics.toSizeCoord(\n            args[5] - goog.math.angleDy(toAngle, args[1]));\n        var rx = goog.graphics.VmlGraphics.toSizeCoord(args[0]);\n        var ry = goog.graphics.VmlGraphics.toSizeCoord(args[1]);\n        // VML angles are in fd units (see http://www.w3.org/TR/NOTE-VML) and\n        // are positive counter-clockwise.\n        var fromAngle = Math.round(args[2] * -65536);\n        var extent = Math.round(args[3] * -65536);\n        list.push('ae', cx, cy, rx, ry, fromAngle, extent);\n        break;\n    }\n  });\n  return list.join(' ');\n};\n\n\n/**\n * Create an empty group of drawing elements.\n *\n * @param {goog.graphics.GroupElement=} opt_group The group wrapper element\n *     to append to. If not specified, appends to the main canvas.\n *\n * @return {!goog.graphics.GroupElement} The newly created group.\n * @override\n */\ngoog.graphics.VmlGraphics.prototype.createGroup = function(opt_group) {\n  var element = this.createFullSizeElement_('group');\n  var parent = opt_group || this.canvasElement;\n  parent.getElement().appendChild(element);\n  return new goog.graphics.VmlGroupElement(element, this);\n};\n\n\n/**\n * Measure and return the width (in pixels) of a given text string.\n * Text measurement is needed to make sure a text can fit in the allocated\n * area. The way text length is measured is by writing it into a div that is\n * after the visible area, measure the div width, and immediately erase the\n * written value.\n *\n * @param {string} text The text string to measure.\n * @param {goog.graphics.Font} font The font object describing the font style.\n *\n * @return {number} The width in pixels of the text strings.\n * @override\n */\ngoog.graphics.VmlGraphics.prototype.getTextWidth = function(text, font) {\n  // TODO(arv): Implement\n  return 0;\n};\n\n\n/** @override */\ngoog.graphics.VmlGraphics.prototype.enterDocument = function() {\n  goog.graphics.VmlGraphics.superClass_.enterDocument.call(this);\n  this.handleContainerResize_();\n  this.updateGraphics_();\n};\n\n\n/**\n * Disposes of the component by removing event handlers, detacing DOM nodes from\n * the document body, and removing references to them.\n * @override\n * @protected\n */\ngoog.graphics.VmlGraphics.prototype.disposeInternal = function() {\n  this.canvasElement = null;\n  goog.graphics.VmlGraphics.superClass_.disposeInternal.call(this);\n};\n","^?",1579837703000,"^@",["^A",["~$goog.graphics.Font","~$goog.events.EventHandler","~$goog.graphics.AbstractGraphics","~$goog.reflect","~$goog.graphics.VmlTextElement","^16","^20","^3","^17","^18","^1:","~$goog.graphics.VmlGroupElement","^2N","^1C","~$goog.graphics.VmlPathElement","^1;","~$goog.graphics.VmlImageElement","^[","~$goog.style","~$goog.graphics.LinearGradient","~$goog.graphics.VmlEllipseElement","~$goog.graphics.VmlRectElement","^1S","^1N","^4","~$goog.graphics.SolidFill"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/vmlgraphics.js"],"^S",["^A",["~$goog.graphics.VmlGraphics"]],"^1",true,"^2",["^3","^1S","^4","^1;","^1N","^2R","^1C","^2S","^2Q","^2Z","^2N","^31","^2[","^2V","^2X","^2W","^30","^2U","^17","^[","^20","^2T","^16","^1:","^2Y","^18"]],["^ ","^7",[1579837703000],"^8","goog.ui.style.app.menubuttonrenderer.js","^9",["^:","goog/ui/style/app/menubuttonrenderer.js"],"^;","goog/ui/style/app/menubuttonrenderer.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for {@link goog.ui.style.app.MenuButton}s and\n * subclasses.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.style.app.MenuButtonRenderer');\n\ngoog.forwardDeclare('goog.ui.MenuButton');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.style');\ngoog.require('goog.ui.Menu');\ngoog.require('goog.ui.MenuRenderer');\ngoog.require('goog.ui.style.app.ButtonRenderer');\n\n\n\n/**\n * Renderer for {@link goog.ui.style.app.MenuButton}s.  This implementation\n * overrides {@link goog.ui.style.app.ButtonRenderer#createButton} to insert a\n * dropdown element into the content element after the specified content.\n * @constructor\n * @extends {goog.ui.style.app.ButtonRenderer}\n * @final\n */\ngoog.ui.style.app.MenuButtonRenderer = function() {\n  goog.ui.style.app.ButtonRenderer.call(this);\n};\ngoog.inherits(\n    goog.ui.style.app.MenuButtonRenderer, goog.ui.style.app.ButtonRenderer);\ngoog.addSingletonGetter(goog.ui.style.app.MenuButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.style.app.MenuButtonRenderer.CSS_CLASS =\n    goog.getCssName('goog-menu-button');\n\n\n/**\n * Array of arrays of CSS classes that we want composite classes added and\n * removed for in IE6 and lower as a workaround for lack of multi-class CSS\n * selector support.\n * @type {Array<Array<string>>}\n */\ngoog.ui.style.app.MenuButtonRenderer.IE6_CLASS_COMBINATIONS = [\n  [\n    goog.getCssName('goog-button-base-rtl'), goog.getCssName('goog-menu-button')\n  ],\n\n  [\n    goog.getCssName('goog-button-base-hover'),\n    goog.getCssName('goog-menu-button')\n  ],\n\n  [\n    goog.getCssName('goog-button-base-focused'),\n    goog.getCssName('goog-menu-button')\n  ],\n\n  [\n    goog.getCssName('goog-button-base-disabled'),\n    goog.getCssName('goog-menu-button')\n  ],\n\n  [\n    goog.getCssName('goog-button-base-active'),\n    goog.getCssName('goog-menu-button')\n  ],\n\n  [\n    goog.getCssName('goog-button-base-open'),\n    goog.getCssName('goog-menu-button')\n  ],\n\n  [\n    goog.getCssName('goog-button-base-active'),\n    goog.getCssName('goog-button-base-open'),\n    goog.getCssName('goog-menu-button')\n  ]\n];\n\n\n/**\n * Returns the ARIA role to be applied to menu buttons, which\n * have a menu attached to them.\n * @return {goog.a11y.aria.Role} ARIA role.\n * @override\n */\ngoog.ui.style.app.MenuButtonRenderer.prototype.getAriaRole = function() {\n  // If we apply the 'button' ARIA role to the menu button, the\n  // screen reader keeps referring to menus as buttons, which\n  // might be misleading for the users. Hence the ARIA role\n  // 'menu' is assigned.\n  return goog.a11y.aria.Role.MENU;\n};\n\n\n/**\n * Takes the button's root element and returns the parent element of the\n * button's contents.  Overrides the superclass implementation by taking\n * the nested DIV structure of menu buttons into account.\n * @param {Element} element Root element of the button whose content element\n *     is to be returned.\n * @return {Element} The button's content element.\n * @override\n */\ngoog.ui.style.app.MenuButtonRenderer.prototype.getContentElement = function(\n    element) {\n  return goog.ui.style.app.MenuButtonRenderer.superClass_.getContentElement\n      .call(this, element);\n};\n\n\n/**\n * Takes an element, decorates it with the menu button control, and returns\n * the element.  Overrides {@link goog.ui.style.app.ButtonRenderer#decorate} by\n * looking for a child element that can be decorated by a menu, and if it\n * finds one, decorates it and attaches it to the menu button.\n * @param {goog.ui.Control} control goog.ui.MenuButton to decorate the element.\n * @param {Element} element Element to decorate.\n * @return {Element} Decorated element.\n * @override\n */\ngoog.ui.style.app.MenuButtonRenderer.prototype.decorate = function(\n    control, element) {\n  var button = /** @type {goog.ui.MenuButton} */ (control);\n  // TODO(attila):  Add more robust support for subclasses of goog.ui.Menu.\n  var menuElem = goog.dom.getElementsByTagNameAndClass(\n      '*', goog.ui.MenuRenderer.CSS_CLASS, element)[0];\n  if (menuElem) {\n    // Move the menu element directly under the body (but hide it first to\n    // prevent flicker; see bug 1089244).\n    goog.style.setElementShown(menuElem, false);\n    goog.dom.appendChild(goog.dom.getOwnerDocument(menuElem).body, menuElem);\n\n    // Decorate the menu and attach it to the button.\n    var menu = new goog.ui.Menu();\n    menu.decorate(menuElem);\n    button.setMenu(menu);\n  }\n\n  // Let the superclass do the rest.\n  return goog.ui.style.app.MenuButtonRenderer.superClass_.decorate.call(\n      this, button, element);\n};\n\n\n/**\n * Takes a text caption or existing DOM structure, and returns the content and\n * a dropdown arrow element wrapped in a pseudo-rounded-corner box.  Creates\n * the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-button-outer-box\">\n *      <div class=\"goog-inline-block goog-button-inner-box\">\n *        <div class=\"goog-button-pos\">\n *          <div class=\"goog-button-top-shadow\">&nbsp;</div>\n *          <div class=\"goog-button-content\">\n *            Contents...\n *            <div class=\"goog-menu-button-dropdown\"> </div>\n *          </div>\n *        </div>\n *      </div>\n *    </div>\n *\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to wrap\n *     in a box.\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {Element} Pseudo-rounded-corner box containing the content.\n * @override\n */\ngoog.ui.style.app.MenuButtonRenderer.prototype.createButton = function(\n    content, dom) {\n  var contentWithDropdown = this.createContentWithDropdown(content, dom);\n  return goog.ui.style.app.MenuButtonRenderer.superClass_.createButton.call(\n      this, contentWithDropdown, dom);\n};\n\n\n/** @override */\ngoog.ui.style.app.MenuButtonRenderer.prototype.setContent = function(\n    element, content) {\n  var dom = goog.dom.getDomHelper(this.getContentElement(element));\n  goog.ui.style.app.MenuButtonRenderer.superClass_.setContent.call(\n      this, element, this.createContentWithDropdown(content, dom));\n};\n\n\n/**\n * Inserts dropdown element as last child of existing content.\n * @param {goog.ui.ControlContent} content Text caption or DOM structure.\n * @param {goog.dom.DomHelper} dom DOM helper, used for document ineraction.\n * @return {Array<Node>} DOM structure to be set as the button's content.\n */\ngoog.ui.style.app.MenuButtonRenderer.prototype.createContentWithDropdown =\n    function(content, dom) {\n  var caption = dom.createDom(\n      goog.dom.TagName.DIV, null, content, this.createDropdown(dom));\n  return goog.array.toArray(caption.childNodes);\n};\n\n\n/**\n * Returns an appropriately-styled DIV containing a dropdown arrow.\n * Creates the following DOM structure:\n *\n *    <div class=\"goog-menu-button-dropdown\"> </div>\n *\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {Element} Dropdown element.\n */\ngoog.ui.style.app.MenuButtonRenderer.prototype.createDropdown = function(dom) {\n  return dom.createDom(\n      goog.dom.TagName.DIV, goog.getCssName(this.getCssClass(), 'dropdown'));\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.style.app.MenuButtonRenderer.prototype.getCssClass = function() {\n  return goog.ui.style.app.MenuButtonRenderer.CSS_CLASS;\n};\n\n\n/** @override */\ngoog.ui.style.app.MenuButtonRenderer.prototype.getIe6ClassCombinations =\n    function() {\n  return goog.ui.style.app.MenuButtonRenderer.IE6_CLASS_COMBINATIONS;\n};\n","^?",1579837703000,"^@",["^A",["^14","~$goog.a11y.aria.Role","^3","~$goog.ui.MenuRenderer","~$goog.ui.style.app.ButtonRenderer","~$goog.ui.Menu","^2Y","^1S","^4"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/style/app/menubuttonrenderer.js"],"^S",["^A",["~$goog.ui.style.app.MenuButtonRenderer"]],"^1",true,"^2",["^3","^33","^1S","^14","^4","^2Y","^36","^34","^35"]],["^ ","^7",[1579837703000],"^8","goog.ui.idgenerator.js","^9",["^:","goog/ui/idgenerator.js"],"^;","goog/ui/idgenerator.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Generator for unique element IDs.\n *\n */\n\ngoog.provide('goog.ui.IdGenerator');\n\n\n\n/**\n * Creates a new id generator.\n * @constructor\n * @final\n */\ngoog.ui.IdGenerator = function() {};\ngoog.addSingletonGetter(goog.ui.IdGenerator);\n\n\n/**\n * Next unique ID to use\n * @type {number}\n * @private\n */\ngoog.ui.IdGenerator.prototype.nextId_ = 0;\n\n\n/**\n * Random ID prefix to help avoid collisions with other closure JavaScript on\n * the same page that may initialize its own IdGenerator singleton.\n * @type {string}\n * @private\n */\ngoog.ui.IdGenerator.prototype.idPrefix_ = '';\n\n\n/**\n * Sets the ID prefix for this singleton. This is a temporary workaround to be\n * backwards compatible with code relying on the undocumented, but consistent,\n * behavior. In the future this will be removed and the prefix will be set to\n * a randomly generated string.\n * @param {string} idPrefix\n */\ngoog.ui.IdGenerator.prototype.setIdPrefix = function(idPrefix) {\n  this.idPrefix_ = idPrefix;\n};\n\n\n/**\n * Gets the next unique ID.\n * @return {string} The next unique identifier.\n */\ngoog.ui.IdGenerator.prototype.getNextUniqueId = function() {\n  return this.idPrefix_ + ':' + (this.nextId_++).toString(36);\n};\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/idgenerator.js"],"^S",["^A",["~$goog.ui.IdGenerator"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.messaging.testdata.portnetwork_worker2.js","^9",["^:","goog/messaging/testdata/portnetwork_worker2.js"],"^;","goog/messaging/testdata/portnetwork_worker2.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n\n// Use of this source code is governed by the Apache License, Version 2.0.\n// See the COPYING file for details.\n\n/**\n * @fileoverview A web worker for integration testing the PortPool class.\n *\n * @nocompile\n */\n\nself.CLOSURE_BASE_PATH = '../../';\nimportScripts('../../bootstrap/webworkers.js');\nimportScripts('../../base.js');\n\n// The provide is necessary to stop the jscompiler from thinking this is an\n// entry point and adding it into the manifest incorrectly.\ngoog.provide('goog.messaging.testdata.portnetwork_worker2');\ngoog.require('goog.messaging.PortCaller');\ngoog.require('goog.messaging.PortChannel');\n\nfunction startListening() {\n  var caller =\n      new goog.messaging.PortCaller(new goog.messaging.PortChannel(self));\n\n  caller.dial('main').registerService('sendToFrame', function(msg) {\n    msg.push('worker2');\n    caller.dial('frame').send('sendToWorker1', msg);\n  }, true);\n}\n\nstartListening();\n","^?",1579837703000,"^@",["^A",["~$goog.messaging.PortCaller","~$goog.messaging.PortChannel","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/testdata/portnetwork_worker2.js"],"^S",["^A",["~$goog.messaging.testdata.portnetwork-worker2","~$goog.messaging.testdata.portnetwork_worker2"]],"^1",true,"^2",["^3","^39","^3:"]],["^ ","^7",[1579837703000],"^8","goog.dom.pattern.starttag.js","^9",["^:","goog/dom/pattern/starttag.js"],"^;","goog/dom/pattern/starttag.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview DOM pattern to match the start of a tag.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.pattern.StartTag');\n\ngoog.require('goog.dom.TagWalkType');\ngoog.require('goog.dom.pattern.Tag');\n\n\n\n/**\n * Pattern object that matches an opening tag.\n *\n * @param {string|RegExp} tag Name of the tag.  Also will accept a regular\n *     expression to match against the tag name.\n * @param {Object=} opt_attrs Optional map of attribute names to desired values.\n *     This pattern will only match when all attributes are present and match\n *     the string or regular expression value provided here.\n * @param {Object=} opt_styles Optional map of CSS style names to desired\n *     values. This pattern will only match when all styles are present and\n *     match the string or regular expression value provided here.\n * @param {Function=} opt_test Optional function that takes the element as a\n *     parameter and returns true if this pattern should match it.\n * @constructor\n * @extends {goog.dom.pattern.Tag}\n */\ngoog.dom.pattern.StartTag = function(tag, opt_attrs, opt_styles, opt_test) {\n  goog.dom.pattern.Tag.call(\n      this, tag, goog.dom.TagWalkType.START_TAG, opt_attrs, opt_styles,\n      opt_test);\n};\ngoog.inherits(goog.dom.pattern.StartTag, goog.dom.pattern.Tag);\n","^?",1579837703000,"^@",["^A",["~$goog.dom.TagWalkType","^3","~$goog.dom.pattern.Tag"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/starttag.js"],"^S",["^A",["~$goog.dom.pattern.StartTag"]],"^1",true,"^2",["^3","^3=","^3>"]],["^ ","^7",[1579837703000],"^8","goog.messaging.abstractchannel.js","^9",["^:","goog/messaging/abstractchannel.js"],"^;","goog/messaging/abstractchannel.js","^<","^=","^>","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An abstract superclass for message channels that handles the\n * repetitive details of registering and dispatching to services. This is more\n * useful for full-fledged channels than for decorators, since decorators\n * generally delegate service registering anyway.\n *\n */\n\n\ngoog.provide('goog.messaging.AbstractChannel');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.json');\ngoog.require('goog.log');\ngoog.require('goog.messaging.MessageChannel');  // interface\n\n\n\n/**\n * Creates an abstract message channel.\n *\n * @constructor\n * @extends {goog.Disposable}\n * @implements {goog.messaging.MessageChannel}\n */\ngoog.messaging.AbstractChannel = function() {\n  goog.messaging.AbstractChannel.base(this, 'constructor');\n\n  /**\n   * The services registered for this channel.\n   * @type {Object<string, {callback: function((string|!Object)),\n                             objectPayload: boolean}>}\n   * @private\n   */\n  this.services_ = {};\n};\ngoog.inherits(goog.messaging.AbstractChannel, goog.Disposable);\n\n\n/**\n * The default service to be run when no other services match.\n *\n * @type {?function(string, (string|!Object))}\n * @private\n */\ngoog.messaging.AbstractChannel.prototype.defaultService_;\n\n\n/**\n * Logger for this class.\n * @type {goog.log.Logger}\n * @protected\n */\ngoog.messaging.AbstractChannel.prototype.logger =\n    goog.log.getLogger('goog.messaging.AbstractChannel');\n\n\n/**\n * Immediately calls opt_connectCb if given, and is otherwise a no-op. If\n * subclasses have configuration that needs to happen before the channel is\n * connected, they should override this and {@link #isConnected}.\n * @override\n */\ngoog.messaging.AbstractChannel.prototype.connect = function(opt_connectCb) {\n  if (opt_connectCb) {\n    opt_connectCb();\n  }\n};\n\n\n/**\n * Always returns true. If subclasses have configuration that needs to happen\n * before the channel is connected, they should override this and\n * {@link #connect}.\n * @override\n */\ngoog.messaging.AbstractChannel.prototype.isConnected = function() {\n  return true;\n};\n\n\n/** @override */\ngoog.messaging.AbstractChannel.prototype.registerService = function(\n    serviceName, callback, opt_objectPayload) {\n  this.services_[serviceName] = {\n    callback: callback,\n    objectPayload: !!opt_objectPayload\n  };\n};\n\n\n/** @override */\ngoog.messaging.AbstractChannel.prototype.registerDefaultService = function(\n    callback) {\n  this.defaultService_ = callback;\n};\n\n\n/** @override */\ngoog.messaging.AbstractChannel.prototype.send = goog.abstractMethod;\n\n\n/**\n * Delivers a message to the appropriate service. This is meant to be called by\n * subclasses when they receive messages.\n *\n * This method takes into account both explicitly-registered and default\n * services, as well as making sure that JSON payloads are decoded when\n * necessary. If the subclass is capable of passing objects as payloads, those\n * objects can be passed in to this method directly. Otherwise, the (potentially\n * JSON-encoded) strings should be passed in.\n *\n * @param {string} serviceName The name of the service receiving the message.\n * @param {string|!Object} payload The contents of the message.\n * @protected\n */\ngoog.messaging.AbstractChannel.prototype.deliver = function(\n    serviceName, payload) {\n  var service = this.getService(serviceName, payload);\n  if (!service) {\n    return;\n  }\n\n  var decodedPayload =\n      this.decodePayload(serviceName, payload, service.objectPayload);\n  if (decodedPayload != null) {\n    service.callback(decodedPayload);\n  }\n};\n\n\n/**\n * Find the service object for a given service name. If there's no service\n * explicitly registered, but there is a default service, a service object is\n * constructed for it.\n *\n * @param {string} serviceName The name of the service receiving the message.\n * @param {string|!Object} payload The contents of the message.\n * @return {?{callback: function((string|!Object)), objectPayload: boolean}} The\n *     service object for the given service, or null if none was found.\n * @protected\n */\ngoog.messaging.AbstractChannel.prototype.getService = function(\n    serviceName, payload) {\n  var service = this.services_[serviceName];\n  if (service) {\n    return service;\n  } else if (this.defaultService_) {\n    var callback = goog.partial(this.defaultService_, serviceName);\n    var objectPayload = goog.isObject(payload);\n    return {callback: callback, objectPayload: objectPayload};\n  }\n\n  goog.log.warning(this.logger, 'Unknown service name \"' + serviceName + '\"');\n  return null;\n};\n\n\n/**\n * Converts the message payload into the format expected by the registered\n * service (either JSON or string).\n *\n * @param {string} serviceName The name of the service receiving the message.\n * @param {string|!Object} payload The contents of the message.\n * @param {boolean} objectPayload Whether the service expects an object or a\n *     plain string.\n * @return {string|Object} The payload in the format expected by the service, or\n *     null if something went wrong.\n * @protected\n */\ngoog.messaging.AbstractChannel.prototype.decodePayload = function(\n    serviceName, payload, objectPayload) {\n  if (objectPayload && typeof payload === 'string') {\n    try {\n      return /** @type {!Object} */ (JSON.parse(payload));\n    } catch (err) {\n      goog.log.warning(\n          this.logger, 'Expected JSON payload for ' + serviceName + ', was \"' +\n              payload + '\"');\n      return null;\n    }\n  } else if (!objectPayload && typeof payload !== 'string') {\n    return goog.json.serialize(payload);\n  }\n  return payload;\n};\n\n\n/** @override */\ngoog.messaging.AbstractChannel.prototype.disposeInternal = function() {\n  goog.messaging.AbstractChannel.base(this, 'disposeInternal');\n  delete this.services_;\n  delete this.defaultService_;\n};\n","^?",1579837703000,"^@",["^A",["~$goog.json","~$goog.messaging.MessageChannel","^3","~$goog.log","~$goog.Disposable"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/abstractchannel.js"],"^S",["^A",["~$goog.messaging.AbstractChannel"]],"^1",true,"^2",["^3","^3C","^3@","^3B","^3A"]],["^ ","^7",[1579837703000],"^8","goog.soy.soy_testhelper.js","^9",["^:","goog/soy/soy_testhelper.js"],"^;","goog/soy/soy_testhelper.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides test helpers for Soy tests.\n * @author chrishenry@google.com (Chris Henry)\n */\n\ngoog.provide('goog.soy.testHelper');\ngoog.setTestOnly('goog.soy.testHelper');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.i18n.bidi.Dir');\ngoog.require('goog.soy.data.SanitizedContent');\ngoog.require('goog.soy.data.SanitizedContentKind');\ngoog.require('goog.soy.data.SanitizedCss');\ngoog.require('goog.soy.data.SanitizedTrustedResourceUri');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Instantiable subclass of SanitizedContent.\n *\n * This is a spoof for sanitized content that isn't robust enough to get\n * through Soy's escaping functions but is good enough for the checks here.\n *\n * @constructor\n * @param {string} content The text.\n * @param {goog.soy.data.SanitizedContentKind} kind The kind of safe content.\n * @extends {goog.soy.data.SanitizedContent}\n * @suppress {missingProvide}\n */\nfunction SanitizedContentSubclass(content, kind) {\n  // IMPORTANT! No superclass chaining to avoid exception being thrown.\n  this.content = content;\n  this.contentKind = kind;\n}\ngoog.inherits(SanitizedContentSubclass, goog.soy.data.SanitizedContent);\n\n\n/**\n * Instantiable subclass of SanitizedCss.\n * @param {string} content\n * @constructor\n * @extends {goog.soy.data.SanitizedCss}\n * @suppress {missingProvide}\n */\nfunction SanitizedCssSubclass(content) {\n  // IMPORTANT! No superclass chaining to avoid exception being thrown.\n  this.content = content;\n  this.contentKind = goog.soy.data.SanitizedContentKind.CSS;\n}\ngoog.inherits(SanitizedCssSubclass, goog.soy.data.SanitizedCss);\n\n\n/**\n * @param {string} content The text.\n * @param {goog.soy.data.SanitizedContentKind|string} kind The kind of safe\n *     content.\n * @return {!SanitizedContentSubclass}\n */\nfunction makeSanitizedContent(content, kind) {\n  return new SanitizedContentSubclass(\n      content,\n      /** @type {goog.soy.data.SanitizedContentKind} */ (kind));\n}\n\n\n\n/**\n * Instantiable subclass of SanitizedTrustedResourceUri.\n *\n * This is a spoof for trusted resource URI that isn't robust enough to get\n * through Soy's escaping functions but is good enough for the checks here.\n *\n * @param {string} content The URI.\n * @constructor\n * @extends {goog.soy.data.SanitizedTrustedResourceUri}\n * @suppress {missingProvide}\n * @final\n */\nfunction SanitizedTrustedResourceUriSubclass(content) {\n  // IMPORTANT! No superclass chaining to avoid exception being thrown.\n  this.content = content;\n  this.contentKind = goog.soy.data.SanitizedContentKind.TRUSTED_RESOURCE_URI;\n}\ngoog.inherits(\n    SanitizedTrustedResourceUriSubclass,\n    goog.soy.data.SanitizedTrustedResourceUri);\n\n\n\n//\n// Fake Soy-generated template functions.\n//\n\nconst example = {};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {?Object<string, *>=} opt_injectedData\n * @return {!goog.soy.data.SanitizedContent}\n */\nexample.textNodeTemplate = function(data, opt_sb, opt_injectedData) {\n  assertNotNull(data);\n  assertNotUndefined(data);\n  return makeSanitizedContent(\n      goog.string.htmlEscape(data.name),\n      goog.soy.data.SanitizedContentKind.HTML);\n};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {?Object<string, *>=} opt_injectedData\n * @return {!goog.soy.data.SanitizedContent}\n */\nexample.singleRootTemplate = function(data, opt_sb, opt_injectedData) {\n  assertNotNull(data);\n  assertNotUndefined(data);\n  return makeSanitizedContent(\n      '<span>' + goog.string.htmlEscape(data.name) + '</span>',\n      goog.soy.data.SanitizedContentKind.HTML);\n};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {?Object<string, *>=} opt_injectedData\n * @return {!goog.soy.data.SanitizedContent}\n */\nexample.multiRootTemplate = function(data, opt_sb, opt_injectedData) {\n  assertNotNull(data);\n  assertNotUndefined(data);\n  return makeSanitizedContent(\n      '<div>Hello</div><div>' + goog.string.htmlEscape(data.name) + '</div>',\n      goog.soy.data.SanitizedContentKind.HTML);\n};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {?Object<string, *>=} opt_injectedData\n * @return {!goog.soy.data.SanitizedContent}\n */\nexample.injectedDataTemplate = function(data, opt_sb, opt_injectedData) {\n  assertNotNull(data);\n  assertNotUndefined(data);\n  return makeSanitizedContent(\n      goog.string.htmlEscape(data.name) +\n          goog.string.htmlEscape(opt_injectedData.name),\n      goog.soy.data.SanitizedContentKind.HTML);\n};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {Object<string, *>=} opt_injectedData\n * @return {!goog.soy.data.SanitizedContent}\n */\nexample.noDataTemplate = function(data, opt_sb, opt_injectedData) {\n  assertNotNull(data);\n  assertNotUndefined(data);\n  return makeSanitizedContent(\n      '<div>Hello</div>', goog.soy.data.SanitizedContentKind.HTML);\n};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {Object<string, *>=} opt_injectedData\n * @return {!SanitizedContentSubclass}\n */\nexample.sanitizedHtmlTemplate = function(data, opt_sb, opt_injectedData) {\n  // Test the SanitizedContent constructor.\n  const sanitized = makeSanitizedContent(\n      'Hello <b>World</b>', goog.soy.data.SanitizedContentKind.HTML);\n  sanitized.contentDir = goog.i18n.bidi.Dir.LTR;\n  return sanitized;\n};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {Object<string, *>=} opt_injectedData\n * @return {!SanitizedContentSubclass}\n */\nexample.sanitizedHtmlAttributesTemplate = function(\n    data, opt_sb, opt_injectedData) {\n  return makeSanitizedContent(\n      'foo=\"bar\"', goog.soy.data.SanitizedContentKind.ATTRIBUTES);\n};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {?Object<string, *>=} opt_injectedData\n * @return {!SanitizedContentSubclass}\n */\nexample.sanitizedSmsUrlTemplate = function(data, opt_sb, opt_injectedData) {\n  // Test the SanitizedContent constructor.\n  const sanitized = makeSanitizedContent(\n      'sms:123456789', goog.soy.data.SanitizedContentKind.URI);\n  return sanitized;\n};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {?Object<string, *>=} opt_injectedData\n * @return {!SanitizedContentSubclass}\n */\nexample.sanitizedHttpUrlTemplate = function(data, opt_sb, opt_injectedData) {\n  // Test the SanitizedContent constructor.\n  const sanitized = makeSanitizedContent(\n      'https://google.com/foo?n=917', goog.soy.data.SanitizedContentKind.URI);\n  return sanitized;\n};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {?Object<string, *>=} opt_injectedData\n * @return {!goog.soy.data.SanitizedTrustedResourceUri}\n */\nexample.sanitizedTrustedResourceUriTemplate = function(\n    data, opt_sb, opt_injectedData) {\n  return new SanitizedTrustedResourceUriSubclass('https://google.com/a.js');\n};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {Object<string, *>=} opt_injectedData\n * @return {!goog.soy.data.SanitizedCss}\n */\nexample.sanitizedCssTemplate = function(data, opt_sb, opt_injectedData) {\n  return new SanitizedCssSubclass('html{display:none}');\n};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {Object<string, *>=} opt_injectedData\n * @return {string}\n */\nexample.stringTemplate = function(data, opt_sb, opt_injectedData) {\n  return '<b>XSS</b>';\n};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {?Object<string, *>=} opt_injectedData\n * @return {!SanitizedContentSubclass}\n */\nexample.sanitizedUriTemplate = function(data, opt_sb, opt_injectedData) {\n  return makeSanitizedContent(\n      'https://example.com', goog.soy.data.SanitizedContentKind.URI);\n};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {Object<string, *>=} opt_injectedData\n * @return {!SanitizedContentSubclass}\n */\nexample.templateSpoofingSanitizedContentString = function(\n    data, opt_sb, opt_injectedData) {\n  return makeSanitizedContent(\n      'Hello World',\n      // This is to ensure we're using triple-equals against a unique JavaScript\n      // object.  For example, in JavaScript, consider ({}) == '[Object object]'\n      // is true.\n      goog.soy.data.SanitizedContentKind.HTML.toString());\n};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {Object<string, *>=} opt_injectedData\n * @return {!goog.soy.data.SanitizedContent}\n */\nexample.tableRowTemplate = function(data, opt_sb, opt_injectedData) {\n  return makeSanitizedContent(\n      '<tr><td></td></tr>', goog.soy.data.SanitizedContentKind.HTML);\n};\n\n\n/**\n * @param {{name: string}} data\n * @param {null=} opt_sb\n * @param {Object<string, *>=} opt_injectedData\n * @return {!goog.soy.data.SanitizedContent}\n */\nexample.colGroupTemplateCaps = function(data, opt_sb, opt_injectedData) {\n  return makeSanitizedContent(\n      '<COLGROUP></COLGROUP>', goog.soy.data.SanitizedContentKind.HTML);\n};\n\n\n//\n// Test helper functions.\n//\n\n\n/**\n * Retrieves the content of document fragment as HTML.\n * @param {Node} fragment The document fragment.\n * @return {string} Content of the document fragment as HTML.\n */\nfunction fragmentToHtml(fragment) {\n  const testDiv = goog.dom.createElement(goog.dom.TagName.DIV);\n  testDiv.appendChild(fragment);\n  return elementToInnerHtml(testDiv);\n}\n\n\n/**\n * Retrieves the content of an element as HTML.\n * @param {Element} elem The element.\n * @return {string} Content of the element as HTML.\n */\nfunction elementToInnerHtml(elem) {\n  let innerHtml = elem.innerHTML;\n  if (goog.userAgent.IE) {\n    innerHtml = innerHtml.replace(/DIV/g, 'div').replace(/\\s/g, '');\n  }\n  return innerHtml;\n}\n","^?",1579837703000,"^@",["^A",["~$goog.soy.data.SanitizedTrustedResourceUri","^14","^16","^3","~$goog.soy.data.SanitizedContentKind","^18","~$goog.soy.data.SanitizedCss","~$goog.i18n.bidi.Dir","~$goog.soy.data.SanitizedContent","^4"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/soy/soy_testhelper.js"],"^S",["^A",["~$goog.soy.testHelper"]],"^1",true,"^2",["^3","^14","^4","^3H","^3I","^3F","^3G","^3E","^16","^18"]],["^ ","^7",[1579837703000],"^8","goog.string.string.js","^9",["^:","goog/string/string.js"],"^;","goog/string/string.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for string manipulation.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\n/**\n * Namespace for string utilities\n */\ngoog.provide('goog.string');\ngoog.provide('goog.string.Unicode');\n\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.uncheckedconversions');\ngoog.require('goog.string.Const');\ngoog.require('goog.string.internal');\n\n\n/**\n * @define {boolean} Enables HTML escaping of lowercase letter \"e\" which helps\n * with detection of double-escaping as this letter is frequently used.\n */\ngoog.string.DETECT_DOUBLE_ESCAPING =\n    goog.define('goog.string.DETECT_DOUBLE_ESCAPING', false);\n\n\n/**\n * @define {boolean} Whether to force non-dom html unescaping.\n */\ngoog.string.FORCE_NON_DOM_HTML_UNESCAPING =\n    goog.define('goog.string.FORCE_NON_DOM_HTML_UNESCAPING', false);\n\n\n/**\n * Common Unicode string characters.\n * @enum {string}\n */\ngoog.string.Unicode = {\n  NBSP: '\\xa0'\n};\n\n\n/**\n * Fast prefix-checker.\n * @param {string} str The string to check.\n * @param {string} prefix A string to look for at the start of `str`.\n * @return {boolean} True if `str` begins with `prefix`.\n */\ngoog.string.startsWith = goog.string.internal.startsWith;\n\n\n/**\n * Fast suffix-checker.\n * @param {string} str The string to check.\n * @param {string} suffix A string to look for at the end of `str`.\n * @return {boolean} True if `str` ends with `suffix`.\n */\ngoog.string.endsWith = goog.string.internal.endsWith;\n\n\n/**\n * Case-insensitive prefix-checker.\n * @param {string} str The string to check.\n * @param {string} prefix  A string to look for at the end of `str`.\n * @return {boolean} True if `str` begins with `prefix` (ignoring\n *     case).\n */\ngoog.string.caseInsensitiveStartsWith =\n    goog.string.internal.caseInsensitiveStartsWith;\n\n\n/**\n * Case-insensitive suffix-checker.\n * @param {string} str The string to check.\n * @param {string} suffix A string to look for at the end of `str`.\n * @return {boolean} True if `str` ends with `suffix` (ignoring\n *     case).\n */\ngoog.string.caseInsensitiveEndsWith =\n    goog.string.internal.caseInsensitiveEndsWith;\n\n\n/**\n * Case-insensitive equality checker.\n * @param {string} str1 First string to check.\n * @param {string} str2 Second string to check.\n * @return {boolean} True if `str1` and `str2` are the same string,\n *     ignoring case.\n */\ngoog.string.caseInsensitiveEquals = goog.string.internal.caseInsensitiveEquals;\n\n\n/**\n * Does simple python-style string substitution.\n * subs(\"foo%s hot%s\", \"bar\", \"dog\") becomes \"foobar hotdog\".\n * @param {string} str The string containing the pattern.\n * @param {...*} var_args The items to substitute into the pattern.\n * @return {string} A copy of `str` in which each occurrence of\n *     {@code %s} has been replaced an argument from `var_args`.\n */\ngoog.string.subs = function(str, var_args) {\n  var splitParts = str.split('%s');\n  var returnString = '';\n\n  var subsArguments = Array.prototype.slice.call(arguments, 1);\n  while (subsArguments.length &&\n         // Replace up to the last split part. We are inserting in the\n         // positions between split parts.\n         splitParts.length > 1) {\n    returnString += splitParts.shift() + subsArguments.shift();\n  }\n\n  return returnString + splitParts.join('%s');  // Join unused '%s'\n};\n\n\n/**\n * Converts multiple whitespace chars (spaces, non-breaking-spaces, new lines\n * and tabs) to a single space, and strips leading and trailing whitespace.\n * @param {string} str Input string.\n * @return {string} A copy of `str` with collapsed whitespace.\n */\ngoog.string.collapseWhitespace = function(str) {\n  // Since IE doesn't include non-breaking-space (0xa0) in their \\s character\n  // class (as required by section 7.2 of the ECMAScript spec), we explicitly\n  // include it in the regexp to enforce consistent cross-browser behavior.\n  return str.replace(/[\\s\\xa0]+/g, ' ').replace(/^\\s+|\\s+$/g, '');\n};\n\n\n/**\n * Checks if a string is empty or contains only whitespaces.\n * @param {string} str The string to check.\n * @return {boolean} Whether `str` is empty or whitespace only.\n */\ngoog.string.isEmptyOrWhitespace = goog.string.internal.isEmptyOrWhitespace;\n\n\n/**\n * Checks if a string is empty.\n * @param {string} str The string to check.\n * @return {boolean} Whether `str` is empty.\n */\ngoog.string.isEmptyString = function(str) {\n  return str.length == 0;\n};\n\n\n/**\n * Checks if a string is empty or contains only whitespaces.\n *\n * @param {string} str The string to check.\n * @return {boolean} Whether `str` is empty or whitespace only.\n * @deprecated Use goog.string.isEmptyOrWhitespace instead.\n */\ngoog.string.isEmpty = goog.string.isEmptyOrWhitespace;\n\n\n/**\n * Checks if a string is null, undefined, empty or contains only whitespaces.\n * @param {*} str The string to check.\n * @return {boolean} Whether `str` is null, undefined, empty, or\n *     whitespace only.\n * @deprecated Use goog.string.isEmptyOrWhitespace(goog.string.makeSafe(str))\n *     instead.\n */\ngoog.string.isEmptyOrWhitespaceSafe = function(str) {\n  return goog.string.isEmptyOrWhitespace(goog.string.makeSafe(str));\n};\n\n\n/**\n * Checks if a string is null, undefined, empty or contains only whitespaces.\n *\n * @param {*} str The string to check.\n * @return {boolean} Whether `str` is null, undefined, empty, or\n *     whitespace only.\n * @deprecated Use goog.string.isEmptyOrWhitespace instead.\n */\ngoog.string.isEmptySafe = goog.string.isEmptyOrWhitespaceSafe;\n\n\n/**\n * Checks if a string is all breaking whitespace.\n * @param {string} str The string to check.\n * @return {boolean} Whether the string is all breaking whitespace.\n */\ngoog.string.isBreakingWhitespace = function(str) {\n  return !/[^\\t\\n\\r ]/.test(str);\n};\n\n\n/**\n * Checks if a string contains all letters.\n * @param {string} str string to check.\n * @return {boolean} True if `str` consists entirely of letters.\n */\ngoog.string.isAlpha = function(str) {\n  return !/[^a-zA-Z]/.test(str);\n};\n\n\n/**\n * Checks if a string contains only numbers.\n * @param {*} str string to check. If not a string, it will be\n *     casted to one.\n * @return {boolean} True if `str` is numeric.\n */\ngoog.string.isNumeric = function(str) {\n  return !/[^0-9]/.test(str);\n};\n\n\n/**\n * Checks if a string contains only numbers or letters.\n * @param {string} str string to check.\n * @return {boolean} True if `str` is alphanumeric.\n */\ngoog.string.isAlphaNumeric = function(str) {\n  return !/[^a-zA-Z0-9]/.test(str);\n};\n\n\n/**\n * Checks if a character is a space character.\n * @param {string} ch Character to check.\n * @return {boolean} True if `ch` is a space.\n */\ngoog.string.isSpace = function(ch) {\n  return ch == ' ';\n};\n\n\n/**\n * Checks if a character is a valid unicode character.\n * @param {string} ch Character to check.\n * @return {boolean} True if `ch` is a valid unicode character.\n */\ngoog.string.isUnicodeChar = function(ch) {\n  return ch.length == 1 && ch >= ' ' && ch <= '~' ||\n      ch >= '\\u0080' && ch <= '\\uFFFD';\n};\n\n\n/**\n * Takes a string and replaces newlines with a space. Multiple lines are\n * replaced with a single space.\n * @param {string} str The string from which to strip newlines.\n * @return {string} A copy of `str` stripped of newlines.\n */\ngoog.string.stripNewlines = function(str) {\n  return str.replace(/(\\r\\n|\\r|\\n)+/g, ' ');\n};\n\n\n/**\n * Replaces Windows and Mac new lines with unix style: \\r or \\r\\n with \\n.\n * @param {string} str The string to in which to canonicalize newlines.\n * @return {string} `str` A copy of {@code} with canonicalized newlines.\n */\ngoog.string.canonicalizeNewlines = function(str) {\n  return str.replace(/(\\r\\n|\\r|\\n)/g, '\\n');\n};\n\n\n/**\n * Normalizes whitespace in a string, replacing all whitespace chars with\n * a space.\n * @param {string} str The string in which to normalize whitespace.\n * @return {string} A copy of `str` with all whitespace normalized.\n */\ngoog.string.normalizeWhitespace = function(str) {\n  return str.replace(/\\xa0|\\s/g, ' ');\n};\n\n\n/**\n * Normalizes spaces in a string, replacing all consecutive spaces and tabs\n * with a single space. Replaces non-breaking space with a space.\n * @param {string} str The string in which to normalize spaces.\n * @return {string} A copy of `str` with all consecutive spaces and tabs\n *    replaced with a single space.\n */\ngoog.string.normalizeSpaces = function(str) {\n  return str.replace(/\\xa0|[ \\t]+/g, ' ');\n};\n\n\n/**\n * Removes the breaking spaces from the left and right of the string and\n * collapses the sequences of breaking spaces in the middle into single spaces.\n * The original and the result strings render the same way in HTML.\n * @param {string} str A string in which to collapse spaces.\n * @return {string} Copy of the string with normalized breaking spaces.\n */\ngoog.string.collapseBreakingSpaces = function(str) {\n  return str.replace(/[\\t\\r\\n ]+/g, ' ')\n      .replace(/^[\\t\\r\\n ]+|[\\t\\r\\n ]+$/g, '');\n};\n\n\n/**\n * Trims white spaces to the left and right of a string.\n * @param {string} str The string to trim.\n * @return {string} A trimmed copy of `str`.\n */\ngoog.string.trim = goog.string.internal.trim;\n\n\n/**\n * Trims whitespaces at the left end of a string.\n * @param {string} str The string to left trim.\n * @return {string} A trimmed copy of `str`.\n */\ngoog.string.trimLeft = function(str) {\n  // Since IE doesn't include non-breaking-space (0xa0) in their \\s character\n  // class (as required by section 7.2 of the ECMAScript spec), we explicitly\n  // include it in the regexp to enforce consistent cross-browser behavior.\n  return str.replace(/^[\\s\\xa0]+/, '');\n};\n\n\n/**\n * Trims whitespaces at the right end of a string.\n * @param {string} str The string to right trim.\n * @return {string} A trimmed copy of `str`.\n */\ngoog.string.trimRight = function(str) {\n  // Since IE doesn't include non-breaking-space (0xa0) in their \\s character\n  // class (as required by section 7.2 of the ECMAScript spec), we explicitly\n  // include it in the regexp to enforce consistent cross-browser behavior.\n  return str.replace(/[\\s\\xa0]+$/, '');\n};\n\n\n/**\n * A string comparator that ignores case.\n * -1 = str1 less than str2\n *  0 = str1 equals str2\n *  1 = str1 greater than str2\n *\n * @param {string} str1 The string to compare.\n * @param {string} str2 The string to compare `str1` to.\n * @return {number} The comparator result, as described above.\n */\ngoog.string.caseInsensitiveCompare =\n    goog.string.internal.caseInsensitiveCompare;\n\n\n/**\n * Compares two strings interpreting their numeric substrings as numbers.\n *\n * @param {string} str1 First string.\n * @param {string} str2 Second string.\n * @param {!RegExp} tokenizerRegExp Splits a string into substrings of\n *     non-negative integers, non-numeric characters and optionally fractional\n *     numbers starting with a decimal point.\n * @return {number} Negative if str1 < str2, 0 is str1 == str2, positive if\n *     str1 > str2.\n * @private\n */\ngoog.string.numberAwareCompare_ = function(str1, str2, tokenizerRegExp) {\n  if (str1 == str2) {\n    return 0;\n  }\n  if (!str1) {\n    return -1;\n  }\n  if (!str2) {\n    return 1;\n  }\n\n  // Using match to split the entire string ahead of time turns out to be faster\n  // for most inputs than using RegExp.exec or iterating over each character.\n  var tokens1 = str1.toLowerCase().match(tokenizerRegExp);\n  var tokens2 = str2.toLowerCase().match(tokenizerRegExp);\n\n  var count = Math.min(tokens1.length, tokens2.length);\n\n  for (var i = 0; i < count; i++) {\n    var a = tokens1[i];\n    var b = tokens2[i];\n\n    // Compare pairs of tokens, returning if one token sorts before the other.\n    if (a != b) {\n      // Only if both tokens are integers is a special comparison required.\n      // Decimal numbers are sorted as strings (e.g., '.09' < '.1').\n      var num1 = parseInt(a, 10);\n      if (!isNaN(num1)) {\n        var num2 = parseInt(b, 10);\n        if (!isNaN(num2) && num1 - num2) {\n          return num1 - num2;\n        }\n      }\n      return a < b ? -1 : 1;\n    }\n  }\n\n  // If one string is a substring of the other, the shorter string sorts first.\n  if (tokens1.length != tokens2.length) {\n    return tokens1.length - tokens2.length;\n  }\n\n  // The two strings must be equivalent except for case (perfect equality is\n  // tested at the head of the function.) Revert to default ASCII string\n  // comparison to stabilize the sort.\n  return str1 < str2 ? -1 : 1;\n};\n\n\n/**\n * String comparison function that handles non-negative integer numbers in a\n * way humans might expect. Using this function, the string 'File 2.jpg' sorts\n * before 'File 10.jpg', and 'Version 1.9' before 'Version 1.10'. The comparison\n * is mostly case-insensitive, though strings that are identical except for case\n * are sorted with the upper-case strings before lower-case.\n *\n * This comparison function is up to 50x slower than either the default or the\n * case-insensitive compare. It should not be used in time-critical code, but\n * should be fast enough to sort several hundred short strings (like filenames)\n * with a reasonable delay.\n *\n * @param {string} str1 The string to compare in a numerically sensitive way.\n * @param {string} str2 The string to compare `str1` to.\n * @return {number} less than 0 if str1 < str2, 0 if str1 == str2, greater than\n *     0 if str1 > str2.\n */\ngoog.string.intAwareCompare = function(str1, str2) {\n  return goog.string.numberAwareCompare_(str1, str2, /\\d+|\\D+/g);\n};\n\n\n/**\n * String comparison function that handles non-negative integer and fractional\n * numbers in a way humans might expect. Using this function, the string\n * 'File 2.jpg' sorts before 'File 10.jpg', and '3.14' before '3.2'. Equivalent\n * to {@link goog.string.intAwareCompare} apart from the way how it interprets\n * dots.\n *\n * @param {string} str1 The string to compare in a numerically sensitive way.\n * @param {string} str2 The string to compare `str1` to.\n * @return {number} less than 0 if str1 < str2, 0 if str1 == str2, greater than\n *     0 if str1 > str2.\n */\ngoog.string.floatAwareCompare = function(str1, str2) {\n  return goog.string.numberAwareCompare_(str1, str2, /\\d+|\\.\\d+|\\D+/g);\n};\n\n\n/**\n * Alias for {@link goog.string.floatAwareCompare}.\n *\n * @param {string} str1\n * @param {string} str2\n * @return {number}\n */\ngoog.string.numerateCompare = goog.string.floatAwareCompare;\n\n\n/**\n * URL-encodes a string\n * @param {*} str The string to url-encode.\n * @return {string} An encoded copy of `str` that is safe for urls.\n *     Note that '#', ':', and other characters used to delimit portions\n *     of URLs *will* be encoded.\n */\ngoog.string.urlEncode = function(str) {\n  return encodeURIComponent(String(str));\n};\n\n\n/**\n * URL-decodes the string. We need to specially handle '+'s because\n * the javascript library doesn't convert them to spaces.\n * @param {string} str The string to url decode.\n * @return {string} The decoded `str`.\n */\ngoog.string.urlDecode = function(str) {\n  return decodeURIComponent(str.replace(/\\+/g, ' '));\n};\n\n\n/**\n * Converts \\n to <br>s or <br />s.\n * @param {string} str The string in which to convert newlines.\n * @param {boolean=} opt_xml Whether to use XML compatible tags.\n * @return {string} A copy of `str` with converted newlines.\n */\ngoog.string.newLineToBr = goog.string.internal.newLineToBr;\n\n\n/**\n * Escapes double quote '\"' and single quote '\\'' characters in addition to\n * '&', '<', and '>' so that a string can be included in an HTML tag attribute\n * value within double or single quotes.\n *\n * It should be noted that > doesn't need to be escaped for the HTML or XML to\n * be valid, but it has been decided to escape it for consistency with other\n * implementations.\n *\n * With goog.string.DETECT_DOUBLE_ESCAPING, this function escapes also the\n * lowercase letter \"e\".\n *\n * NOTE(user):\n * HtmlEscape is often called during the generation of large blocks of HTML.\n * Using statics for the regular expressions and strings is an optimization\n * that can more than half the amount of time IE spends in this function for\n * large apps, since strings and regexes both contribute to GC allocations.\n *\n * Testing for the presence of a character before escaping increases the number\n * of function calls, but actually provides a speed increase for the average\n * case -- since the average case often doesn't require the escaping of all 4\n * characters and indexOf() is much cheaper than replace().\n * The worst case does suffer slightly from the additional calls, therefore the\n * opt_isLikelyToContainHtmlChars option has been included for situations\n * where all 4 HTML entities are very likely to be present and need escaping.\n *\n * Some benchmarks (times tended to fluctuate +-0.05ms):\n *                                     FireFox                     IE6\n * (no chars / average (mix of cases) / all 4 chars)\n * no checks                     0.13 / 0.22 / 0.22         0.23 / 0.53 / 0.80\n * indexOf                       0.08 / 0.17 / 0.26         0.22 / 0.54 / 0.84\n * indexOf + re test             0.07 / 0.17 / 0.28         0.19 / 0.50 / 0.85\n *\n * An additional advantage of checking if replace actually needs to be called\n * is a reduction in the number of object allocations, so as the size of the\n * application grows the difference between the various methods would increase.\n *\n * @param {string} str string to be escaped.\n * @param {boolean=} opt_isLikelyToContainHtmlChars Don't perform a check to see\n *     if the character needs replacing - use this option if you expect each of\n *     the characters to appear often. Leave false if you expect few html\n *     characters to occur in your strings, such as if you are escaping HTML.\n * @return {string} An escaped copy of `str`.\n */\ngoog.string.htmlEscape = function(str, opt_isLikelyToContainHtmlChars) {\n  str = goog.string.internal.htmlEscape(str, opt_isLikelyToContainHtmlChars);\n  if (goog.string.DETECT_DOUBLE_ESCAPING) {\n    str = str.replace(goog.string.E_RE_, '&#101;');\n  }\n  return str;\n};\n\n\n/**\n * Regular expression that matches a lowercase letter \"e\", for use in escaping.\n * @const {!RegExp}\n * @private\n */\ngoog.string.E_RE_ = /e/g;\n\n\n/**\n * Unescapes an HTML string.\n *\n * @param {string} str The string to unescape.\n * @return {string} An unescaped copy of `str`.\n */\ngoog.string.unescapeEntities = function(str) {\n  if (goog.string.contains(str, '&')) {\n    // We are careful not to use a DOM if we do not have one or we explicitly\n    // requested non-DOM html unescaping.\n    if (!goog.string.FORCE_NON_DOM_HTML_UNESCAPING &&\n        'document' in goog.global) {\n      return goog.string.unescapeEntitiesUsingDom_(str);\n    } else {\n      // Fall back on pure XML entities\n      return goog.string.unescapePureXmlEntities_(str);\n    }\n  }\n  return str;\n};\n\n\n/**\n * Unescapes a HTML string using the provided document.\n *\n * @param {string} str The string to unescape.\n * @param {!Document} document A document to use in escaping the string.\n * @return {string} An unescaped copy of `str`.\n */\ngoog.string.unescapeEntitiesWithDocument = function(str, document) {\n  if (goog.string.contains(str, '&')) {\n    return goog.string.unescapeEntitiesUsingDom_(str, document);\n  }\n  return str;\n};\n\n\n/**\n * Unescapes an HTML string using a DOM to resolve non-XML, non-numeric\n * entities. This function is XSS-safe and whitespace-preserving.\n * @private\n * @param {string} str The string to unescape.\n * @param {Document=} opt_document An optional document to use for creating\n *     elements. If this is not specified then the default window.document\n *     will be used.\n * @return {string} The unescaped `str` string.\n */\ngoog.string.unescapeEntitiesUsingDom_ = function(str, opt_document) {\n  /** @type {!Object<string, string>} */\n  var seen = {'&amp;': '&', '&lt;': '<', '&gt;': '>', '&quot;': '\"'};\n  /** @type {!Element} */\n  var div;\n  if (opt_document) {\n    div = opt_document.createElement('div');\n  } else {\n    div = goog.global.document.createElement('div');\n  }\n  // Match as many valid entity characters as possible. If the actual entity\n  // happens to be shorter, it will still work as innerHTML will return the\n  // trailing characters unchanged. Since the entity characters do not include\n  // open angle bracket, there is no chance of XSS from the innerHTML use.\n  // Since no whitespace is passed to innerHTML, whitespace is preserved.\n  return str.replace(goog.string.HTML_ENTITY_PATTERN_, function(s, entity) {\n    // Check for cached entity.\n    var value = seen[s];\n    if (value) {\n      return value;\n    }\n    // Check for numeric entity.\n    if (entity.charAt(0) == '#') {\n      // Prefix with 0 so that hex entities (e.g. &#x10) parse as hex numbers.\n      var n = Number('0' + entity.substr(1));\n      if (!isNaN(n)) {\n        value = String.fromCharCode(n);\n      }\n    }\n    // Fall back to innerHTML otherwise.\n    if (!value) {\n      // Append a non-entity character to avoid a bug in Webkit that parses\n      // an invalid entity at the end of innerHTML text as the empty string.\n      goog.dom.safe.setInnerHtml(\n          div,\n          goog.html.uncheckedconversions\n              .safeHtmlFromStringKnownToSatisfyTypeContract(\n                  goog.string.Const.from('Single HTML entity.'), s + ' '));\n      // Then remove the trailing character from the result.\n      value = div.firstChild.nodeValue.slice(0, -1);\n    }\n    // Cache and return.\n    return seen[s] = value;\n  });\n};\n\n\n/**\n * Unescapes XML entities.\n * @private\n * @param {string} str The string to unescape.\n * @return {string} An unescaped copy of `str`.\n */\ngoog.string.unescapePureXmlEntities_ = function(str) {\n  return str.replace(/&([^;]+);/g, function(s, entity) {\n    switch (entity) {\n      case 'amp':\n        return '&';\n      case 'lt':\n        return '<';\n      case 'gt':\n        return '>';\n      case 'quot':\n        return '\"';\n      default:\n        if (entity.charAt(0) == '#') {\n          // Prefix with 0 so that hex entities (e.g. &#x10) parse as hex.\n          var n = Number('0' + entity.substr(1));\n          if (!isNaN(n)) {\n            return String.fromCharCode(n);\n          }\n        }\n        // For invalid entities we just return the entity\n        return s;\n    }\n  });\n};\n\n\n/**\n * Regular expression that matches an HTML entity.\n * See also HTML5: Tokenization / Tokenizing character references.\n * @private\n * @type {!RegExp}\n */\ngoog.string.HTML_ENTITY_PATTERN_ = /&([^;\\s<&]+);?/g;\n\n\n/**\n * Do escaping of whitespace to preserve spatial formatting. We use character\n * entity #160 to make it safer for xml.\n * @param {string} str The string in which to escape whitespace.\n * @param {boolean=} opt_xml Whether to use XML compatible tags.\n * @return {string} An escaped copy of `str`.\n */\ngoog.string.whitespaceEscape = function(str, opt_xml) {\n  // This doesn't use goog.string.preserveSpaces for backwards compatibility.\n  return goog.string.newLineToBr(str.replace(/  /g, ' &#160;'), opt_xml);\n};\n\n\n/**\n * Preserve spaces that would be otherwise collapsed in HTML by replacing them\n * with non-breaking space Unicode characters.\n * @param {string} str The string in which to preserve whitespace.\n * @return {string} A copy of `str` with preserved whitespace.\n */\ngoog.string.preserveSpaces = function(str) {\n  return str.replace(/(^|[\\n ]) /g, '$1' + goog.string.Unicode.NBSP);\n};\n\n\n/**\n * Strip quote characters around a string.  The second argument is a string of\n * characters to treat as quotes.  This can be a single character or a string of\n * multiple character and in that case each of those are treated as possible\n * quote characters. For example:\n *\n * <pre>\n * goog.string.stripQuotes('\"abc\"', '\"`') --> 'abc'\n * goog.string.stripQuotes('`abc`', '\"`') --> 'abc'\n * </pre>\n *\n * @param {string} str The string to strip.\n * @param {string} quoteChars The quote characters to strip.\n * @return {string} A copy of `str` without the quotes.\n */\ngoog.string.stripQuotes = function(str, quoteChars) {\n  var length = quoteChars.length;\n  for (var i = 0; i < length; i++) {\n    var quoteChar = length == 1 ? quoteChars : quoteChars.charAt(i);\n    if (str.charAt(0) == quoteChar && str.charAt(str.length - 1) == quoteChar) {\n      return str.substring(1, str.length - 1);\n    }\n  }\n  return str;\n};\n\n\n/**\n * Truncates a string to a certain length and adds '...' if necessary.  The\n * length also accounts for the ellipsis, so a maximum length of 10 and a string\n * 'Hello World!' produces 'Hello W...'.\n * @param {string} str The string to truncate.\n * @param {number} chars Max number of characters.\n * @param {boolean=} opt_protectEscapedCharacters Whether to protect escaped\n *     characters from being cut off in the middle.\n * @return {string} The truncated `str` string.\n */\ngoog.string.truncate = function(str, chars, opt_protectEscapedCharacters) {\n  if (opt_protectEscapedCharacters) {\n    str = goog.string.unescapeEntities(str);\n  }\n\n  if (str.length > chars) {\n    str = str.substring(0, chars - 3) + '...';\n  }\n\n  if (opt_protectEscapedCharacters) {\n    str = goog.string.htmlEscape(str);\n  }\n\n  return str;\n};\n\n\n/**\n * Truncate a string in the middle, adding \"...\" if necessary,\n * and favoring the beginning of the string.\n * @param {string} str The string to truncate the middle of.\n * @param {number} chars Max number of characters.\n * @param {boolean=} opt_protectEscapedCharacters Whether to protect escaped\n *     characters from being cutoff in the middle.\n * @param {number=} opt_trailingChars Optional number of trailing characters to\n *     leave at the end of the string, instead of truncating as close to the\n *     middle as possible.\n * @return {string} A truncated copy of `str`.\n */\ngoog.string.truncateMiddle = function(\n    str, chars, opt_protectEscapedCharacters, opt_trailingChars) {\n  if (opt_protectEscapedCharacters) {\n    str = goog.string.unescapeEntities(str);\n  }\n\n  if (opt_trailingChars && str.length > chars) {\n    if (opt_trailingChars > chars) {\n      opt_trailingChars = chars;\n    }\n    var endPoint = str.length - opt_trailingChars;\n    var startPoint = chars - opt_trailingChars;\n    str = str.substring(0, startPoint) + '...' + str.substring(endPoint);\n  } else if (str.length > chars) {\n    // Favor the beginning of the string:\n    var half = Math.floor(chars / 2);\n    var endPos = str.length - half;\n    half += chars % 2;\n    str = str.substring(0, half) + '...' + str.substring(endPos);\n  }\n\n  if (opt_protectEscapedCharacters) {\n    str = goog.string.htmlEscape(str);\n  }\n\n  return str;\n};\n\n\n/**\n * Special chars that need to be escaped for goog.string.quote.\n * @private {!Object<string, string>}\n */\ngoog.string.specialEscapeChars_ = {\n  '\\0': '\\\\0',\n  '\\b': '\\\\b',\n  '\\f': '\\\\f',\n  '\\n': '\\\\n',\n  '\\r': '\\\\r',\n  '\\t': '\\\\t',\n  '\\x0B': '\\\\x0B',  // '\\v' is not supported in JScript\n  '\"': '\\\\\"',\n  '\\\\': '\\\\\\\\',\n  // To support the use case of embedding quoted strings inside of script\n  // tags, we have to make sure HTML comments and opening/closing script tags do\n  // not appear in the resulting string. The specific strings that must be\n  // escaped are documented at:\n  // https://html.spec.whatwg.org/multipage/scripting.html#restrictions-for-contents-of-script-elements\n  '<': '\\\\u003C'  // NOTE: JSON.parse crashes on '\\\\x3c'.\n};\n\n\n/**\n * Character mappings used internally for goog.string.escapeChar.\n * @private {!Object<string, string>}\n */\ngoog.string.jsEscapeCache_ = {\n  '\\'': '\\\\\\''\n};\n\n\n/**\n * Encloses a string in double quotes and escapes characters so that the\n * string is a valid JS string. The resulting string is safe to embed in\n * `<script>` tags as \"<\" is escaped.\n * @param {string} s The string to quote.\n * @return {string} A copy of `s` surrounded by double quotes.\n */\ngoog.string.quote = function(s) {\n  s = String(s);\n  var sb = ['\"'];\n  for (var i = 0; i < s.length; i++) {\n    var ch = s.charAt(i);\n    var cc = ch.charCodeAt(0);\n    sb[i + 1] = goog.string.specialEscapeChars_[ch] ||\n        ((cc > 31 && cc < 127) ? ch : goog.string.escapeChar(ch));\n  }\n  sb.push('\"');\n  return sb.join('');\n};\n\n\n/**\n * Takes a string and returns the escaped string for that input string.\n * @param {string} str The string to escape.\n * @return {string} An escaped string representing `str`.\n */\ngoog.string.escapeString = function(str) {\n  var sb = [];\n  for (var i = 0; i < str.length; i++) {\n    sb[i] = goog.string.escapeChar(str.charAt(i));\n  }\n  return sb.join('');\n};\n\n\n/**\n * Takes a character and returns the escaped string for that character. For\n * example escapeChar(String.fromCharCode(15)) -> \"\\\\x0E\".\n * @param {string} c The character to escape.\n * @return {string} An escaped string representing `c`.\n */\ngoog.string.escapeChar = function(c) {\n  if (c in goog.string.jsEscapeCache_) {\n    return goog.string.jsEscapeCache_[c];\n  }\n\n  if (c in goog.string.specialEscapeChars_) {\n    return goog.string.jsEscapeCache_[c] = goog.string.specialEscapeChars_[c];\n  }\n\n  var rv = c;\n  var cc = c.charCodeAt(0);\n  if (cc > 31 && cc < 127) {\n    rv = c;\n  } else {\n    // tab is 9 but handled above\n    if (cc < 256) {\n      rv = '\\\\x';\n      if (cc < 16 || cc > 256) {\n        rv += '0';\n      }\n    } else {\n      rv = '\\\\u';\n      if (cc < 4096) {  // \\u1000\n        rv += '0';\n      }\n    }\n    rv += cc.toString(16).toUpperCase();\n  }\n\n  return goog.string.jsEscapeCache_[c] = rv;\n};\n\n\n/**\n * Determines whether a string contains a substring.\n * @param {string} str The string to search.\n * @param {string} subString The substring to search for.\n * @return {boolean} Whether `str` contains `subString`.\n */\ngoog.string.contains = goog.string.internal.contains;\n\n\n/**\n * Determines whether a string contains a substring, ignoring case.\n * @param {string} str The string to search.\n * @param {string} subString The substring to search for.\n * @return {boolean} Whether `str` contains `subString`.\n */\ngoog.string.caseInsensitiveContains =\n    goog.string.internal.caseInsensitiveContains;\n\n\n/**\n * Returns the non-overlapping occurrences of ss in s.\n * If either s or ss evalutes to false, then returns zero.\n * @param {string} s The string to look in.\n * @param {string} ss The string to look for.\n * @return {number} Number of occurrences of ss in s.\n */\ngoog.string.countOf = function(s, ss) {\n  return s && ss ? s.split(ss).length - 1 : 0;\n};\n\n\n/**\n * Removes a substring of a specified length at a specific\n * index in a string.\n * @param {string} s The base string from which to remove.\n * @param {number} index The index at which to remove the substring.\n * @param {number} stringLength The length of the substring to remove.\n * @return {string} A copy of `s` with the substring removed or the full\n *     string if nothing is removed or the input is invalid.\n */\ngoog.string.removeAt = function(s, index, stringLength) {\n  var resultStr = s;\n  // If the index is greater or equal to 0 then remove substring\n  if (index >= 0 && index < s.length && stringLength > 0) {\n    resultStr = s.substr(0, index) +\n        s.substr(index + stringLength, s.length - index - stringLength);\n  }\n  return resultStr;\n};\n\n\n/**\n * Removes the first occurrence of a substring from a string.\n * @param {string} str The base string from which to remove.\n * @param {string} substr The string to remove.\n * @return {string} A copy of `str` with `substr` removed or the\n *     full string if nothing is removed.\n */\ngoog.string.remove = function(str, substr) {\n  return str.replace(substr, '');\n};\n\n\n/**\n *  Removes all occurrences of a substring from a string.\n *  @param {string} s The base string from which to remove.\n *  @param {string} ss The string to remove.\n *  @return {string} A copy of `s` with `ss` removed or the full\n *      string if nothing is removed.\n */\ngoog.string.removeAll = function(s, ss) {\n  var re = new RegExp(goog.string.regExpEscape(ss), 'g');\n  return s.replace(re, '');\n};\n\n\n/**\n *  Replaces all occurrences of a substring of a string with a new substring.\n *  @param {string} s The base string from which to remove.\n *  @param {string} ss The string to replace.\n *  @param {string} replacement The replacement string.\n *  @return {string} A copy of `s` with `ss` replaced by\n *      `replacement` or the original string if nothing is replaced.\n */\ngoog.string.replaceAll = function(s, ss, replacement) {\n  var re = new RegExp(goog.string.regExpEscape(ss), 'g');\n  return s.replace(re, replacement.replace(/\\$/g, '$$$$'));\n};\n\n\n/**\n * Escapes characters in the string that are not safe to use in a RegExp.\n * @param {*} s The string to escape. If not a string, it will be casted\n *     to one.\n * @return {string} A RegExp safe, escaped copy of `s`.\n */\ngoog.string.regExpEscape = function(s) {\n  return String(s)\n      .replace(/([-()\\[\\]{}+?*.$\\^|,:#<!\\\\])/g, '\\\\$1')\n      .replace(/\\x08/g, '\\\\x08');\n};\n\n\n/**\n * Repeats a string n times.\n * @param {string} string The string to repeat.\n * @param {number} length The number of times to repeat.\n * @return {string} A string containing `length` repetitions of\n *     `string`.\n */\ngoog.string.repeat = (String.prototype.repeat) ? function(string, length) {\n  // The native method is over 100 times faster than the alternative.\n  return string.repeat(length);\n} : function(string, length) {\n  return new Array(length + 1).join(string);\n};\n\n\n/**\n * Pads number to given length and optionally rounds it to a given precision.\n * For example:\n * <pre>padNumber(1.25, 2, 3) -> '01.250'\n * padNumber(1.25, 2) -> '01.25'\n * padNumber(1.25, 2, 1) -> '01.3'\n * padNumber(1.25, 0) -> '1.25'</pre>\n *\n * @param {number} num The number to pad.\n * @param {number} length The desired length.\n * @param {number=} opt_precision The desired precision.\n * @return {string} `num` as a string with the given options.\n */\ngoog.string.padNumber = function(num, length, opt_precision) {\n  var s =\n      (opt_precision !== undefined) ? num.toFixed(opt_precision) : String(num);\n  var index = s.indexOf('.');\n  if (index == -1) {\n    index = s.length;\n  }\n  return goog.string.repeat('0', Math.max(0, length - index)) + s;\n};\n\n\n/**\n * Returns a string representation of the given object, with\n * null and undefined being returned as the empty string.\n *\n * @param {*} obj The object to convert.\n * @return {string} A string representation of the `obj`.\n */\ngoog.string.makeSafe = function(obj) {\n  return obj == null ? '' : String(obj);\n};\n\n\n/**\n * Concatenates string expressions. This is useful\n * since some browsers are very inefficient when it comes to using plus to\n * concat strings. Be careful when using null and undefined here since\n * these will not be included in the result. If you need to represent these\n * be sure to cast the argument to a String first.\n * For example:\n * <pre>buildString('a', 'b', 'c', 'd') -> 'abcd'\n * buildString(null, undefined) -> ''\n * </pre>\n * @param {...*} var_args A list of strings to concatenate. If not a string,\n *     it will be casted to one.\n * @return {string} The concatenation of `var_args`.\n */\ngoog.string.buildString = function(var_args) {\n  return Array.prototype.join.call(arguments, '');\n};\n\n\n/**\n * Returns a string with at least 64-bits of randomness.\n *\n * Doesn't trust JavaScript's random function entirely. Uses a combination of\n * random and current timestamp, and then encodes the string in base-36 to\n * make it shorter.\n *\n * @return {string} A random string, e.g. sn1s7vb4gcic.\n */\ngoog.string.getRandomString = function() {\n  var x = 2147483648;\n  return Math.floor(Math.random() * x).toString(36) +\n      Math.abs(Math.floor(Math.random() * x) ^ goog.now()).toString(36);\n};\n\n\n/**\n * Compares two version numbers.\n *\n * @param {string|number} version1 Version of first item.\n * @param {string|number} version2 Version of second item.\n *\n * @return {number}  1 if `version1` is higher.\n *                   0 if arguments are equal.\n *                  -1 if `version2` is higher.\n */\ngoog.string.compareVersions = goog.string.internal.compareVersions;\n\n\n/**\n * String hash function similar to java.lang.String.hashCode().\n * The hash code for a string is computed as\n * s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1],\n * where s[i] is the ith character of the string and n is the length of\n * the string. We mod the result to make it between 0 (inclusive) and 2^32\n * (exclusive).\n * @param {string} str A string.\n * @return {number} Hash value for `str`, between 0 (inclusive) and 2^32\n *  (exclusive). The empty string returns 0.\n */\ngoog.string.hashCode = function(str) {\n  var result = 0;\n  for (var i = 0; i < str.length; ++i) {\n    // Normalize to 4 byte range, 0 ... 2^32.\n    result = (31 * result + str.charCodeAt(i)) >>> 0;\n  }\n  return result;\n};\n\n\n/**\n * The most recent unique ID. |0 is equivalent to Math.floor in this case.\n * @type {number}\n * @private\n */\ngoog.string.uniqueStringCounter_ = Math.random() * 0x80000000 | 0;\n\n\n/**\n * Generates and returns a string which is unique in the current document.\n * This is useful, for example, to create unique IDs for DOM elements.\n * @return {string} A unique id.\n */\ngoog.string.createUniqueString = function() {\n  return 'goog_' + goog.string.uniqueStringCounter_++;\n};\n\n\n/**\n * Converts the supplied string to a number, which may be Infinity or NaN.\n * This function strips whitespace: (toNumber(' 123') === 123)\n * This function accepts scientific notation: (toNumber('1e1') === 10)\n *\n * This is better than JavaScript's built-in conversions because, sadly:\n *     (Number(' ') === 0) and (parseFloat('123a') === 123)\n *\n * @param {string} str The string to convert.\n * @return {number} The number the supplied string represents, or NaN.\n */\ngoog.string.toNumber = function(str) {\n  var num = Number(str);\n  if (num == 0 && goog.string.isEmptyOrWhitespace(str)) {\n    return NaN;\n  }\n  return num;\n};\n\n\n/**\n * Returns whether the given string is lower camel case (e.g. \"isFooBar\").\n *\n * Note that this assumes the string is entirely letters.\n * @see http://en.wikipedia.org/wiki/CamelCase#Variations_and_synonyms\n *\n * @param {string} str String to test.\n * @return {boolean} Whether the string is lower camel case.\n */\ngoog.string.isLowerCamelCase = function(str) {\n  return /^[a-z]+([A-Z][a-z]*)*$/.test(str);\n};\n\n\n/**\n * Returns whether the given string is upper camel case (e.g. \"FooBarBaz\").\n *\n * Note that this assumes the string is entirely letters.\n * @see http://en.wikipedia.org/wiki/CamelCase#Variations_and_synonyms\n *\n * @param {string} str String to test.\n * @return {boolean} Whether the string is upper camel case.\n */\ngoog.string.isUpperCamelCase = function(str) {\n  return /^([A-Z][a-z]*)+$/.test(str);\n};\n\n\n/**\n * Converts a string from selector-case to camelCase (e.g. from\n * \"multi-part-string\" to \"multiPartString\"), useful for converting\n * CSS selectors and HTML dataset keys to their equivalent JS properties.\n * @param {string} str The string in selector-case form.\n * @return {string} The string in camelCase form.\n */\ngoog.string.toCamelCase = function(str) {\n  return String(str).replace(/\\-([a-z])/g, function(all, match) {\n    return match.toUpperCase();\n  });\n};\n\n\n/**\n * Converts a string from camelCase to selector-case (e.g. from\n * \"multiPartString\" to \"multi-part-string\"), useful for converting JS\n * style and dataset properties to equivalent CSS selectors and HTML keys.\n * @param {string} str The string in camelCase form.\n * @return {string} The string in selector-case form.\n */\ngoog.string.toSelectorCase = function(str) {\n  return String(str).replace(/([A-Z])/g, '-$1').toLowerCase();\n};\n\n\n/**\n * Converts a string into TitleCase. First character of the string is always\n * capitalized in addition to the first letter of every subsequent word.\n * Words are delimited by one or more whitespaces by default. Custom delimiters\n * can optionally be specified to replace the default, which doesn't preserve\n * whitespace delimiters and instead must be explicitly included if needed.\n *\n * Default delimiter => \" \":\n *    goog.string.toTitleCase('oneTwoThree')    => 'OneTwoThree'\n *    goog.string.toTitleCase('one two three')  => 'One Two Three'\n *    goog.string.toTitleCase('  one   two   ') => '  One   Two   '\n *    goog.string.toTitleCase('one_two_three')  => 'One_two_three'\n *    goog.string.toTitleCase('one-two-three')  => 'One-two-three'\n *\n * Custom delimiter => \"_-.\":\n *    goog.string.toTitleCase('oneTwoThree', '_-.')       => 'OneTwoThree'\n *    goog.string.toTitleCase('one two three', '_-.')     => 'One two three'\n *    goog.string.toTitleCase('  one   two   ', '_-.')    => '  one   two   '\n *    goog.string.toTitleCase('one_two_three', '_-.')     => 'One_Two_Three'\n *    goog.string.toTitleCase('one-two-three', '_-.')     => 'One-Two-Three'\n *    goog.string.toTitleCase('one...two...three', '_-.') => 'One...Two...Three'\n *    goog.string.toTitleCase('one. two. three', '_-.')   => 'One. two. three'\n *    goog.string.toTitleCase('one-two.three', '_-.')     => 'One-Two.Three'\n *\n * @param {string} str String value in camelCase form.\n * @param {string=} opt_delimiters Custom delimiter character set used to\n *      distinguish words in the string value. Each character represents a\n *      single delimiter. When provided, default whitespace delimiter is\n *      overridden and must be explicitly included if needed.\n * @return {string} String value in TitleCase form.\n */\ngoog.string.toTitleCase = function(str, opt_delimiters) {\n  var delimiters = (typeof opt_delimiters === 'string') ?\n      goog.string.regExpEscape(opt_delimiters) :\n      '\\\\s';\n\n  // For IE8, we need to prevent using an empty character set. Otherwise,\n  // incorrect matching will occur.\n  delimiters = delimiters ? '|[' + delimiters + ']+' : '';\n\n  var regexp = new RegExp('(^' + delimiters + ')([a-z])', 'g');\n  return str.replace(regexp, function(all, p1, p2) {\n    return p1 + p2.toUpperCase();\n  });\n};\n\n\n/**\n * Capitalizes a string, i.e. converts the first letter to uppercase\n * and all other letters to lowercase, e.g.:\n *\n * goog.string.capitalize('one')     => 'One'\n * goog.string.capitalize('ONE')     => 'One'\n * goog.string.capitalize('one two') => 'One two'\n *\n * Note that this function does not trim initial whitespace.\n *\n * @param {string} str String value to capitalize.\n * @return {string} String value with first letter in uppercase.\n */\ngoog.string.capitalize = function(str) {\n  return String(str.charAt(0)).toUpperCase() +\n      String(str.substr(1)).toLowerCase();\n};\n\n\n/**\n * Parse a string in decimal or hexidecimal ('0xFFFF') form.\n *\n * To parse a particular radix, please use parseInt(string, radix) directly. See\n * https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/parseInt\n *\n * This is a wrapper for the built-in parseInt function that will only parse\n * numbers as base 10 or base 16.  Some JS implementations assume strings\n * starting with \"0\" are intended to be octal. ES3 allowed but discouraged\n * this behavior. ES5 forbids it.  This function emulates the ES5 behavior.\n *\n * For more information, see Mozilla JS Reference: http://goo.gl/8RiFj\n *\n * @param {string|number|null|undefined} value The value to be parsed.\n * @return {number} The number, parsed. If the string failed to parse, this\n *     will be NaN.\n */\ngoog.string.parseInt = function(value) {\n  // Force finite numbers to strings.\n  if (isFinite(value)) {\n    value = String(value);\n  }\n\n  if (typeof value === 'string') {\n    // If the string starts with '0x' or '-0x', parse as hex.\n    return /^\\s*-?0x/i.test(value) ? parseInt(value, 16) : parseInt(value, 10);\n  }\n\n  return NaN;\n};\n\n\n/**\n * Splits a string on a separator a limited number of times.\n *\n * This implementation is more similar to Python or Java, where the limit\n * parameter specifies the maximum number of splits rather than truncating\n * the number of results.\n *\n * See http://docs.python.org/2/library/stdtypes.html#str.split\n * See JavaDoc: http://goo.gl/F2AsY\n * See Mozilla reference: http://goo.gl/dZdZs\n *\n * @param {string} str String to split.\n * @param {string} separator The separator.\n * @param {number} limit The limit to the number of splits. The resulting array\n *     will have a maximum length of limit+1.  Negative numbers are the same\n *     as zero.\n * @return {!Array<string>} The string, split.\n */\ngoog.string.splitLimit = function(str, separator, limit) {\n  var parts = str.split(separator);\n  var returnVal = [];\n\n  // Only continue doing this while we haven't hit the limit and we have\n  // parts left.\n  while (limit > 0 && parts.length) {\n    returnVal.push(parts.shift());\n    limit--;\n  }\n\n  // If there are remaining parts, append them to the end.\n  if (parts.length) {\n    returnVal.push(parts.join(separator));\n  }\n\n  return returnVal;\n};\n\n\n/**\n * Finds the characters to the right of the last instance of any separator\n *\n * This function is similar to goog.string.path.baseName, except it can take a\n * list of characters to split the string on. It will return the rightmost\n * grouping of characters to the right of any separator as a left-to-right\n * oriented string.\n *\n * @see goog.string.path.baseName\n * @param {string} str The string\n * @param {string|!Array<string>} separators A list of separator characters\n * @return {string} The last part of the string with respect to the separators\n */\ngoog.string.lastComponent = function(str, separators) {\n  if (!separators) {\n    return str;\n  } else if (typeof separators == 'string') {\n    separators = [separators];\n  }\n\n  var lastSeparatorIndex = -1;\n  for (var i = 0; i < separators.length; i++) {\n    if (separators[i] == '') {\n      continue;\n    }\n    var currentSeparatorIndex = str.lastIndexOf(separators[i]);\n    if (currentSeparatorIndex > lastSeparatorIndex) {\n      lastSeparatorIndex = currentSeparatorIndex;\n    }\n  }\n  if (lastSeparatorIndex == -1) {\n    return str;\n  }\n  return str.slice(lastSeparatorIndex + 1);\n};\n\n\n/**\n * Computes the Levenshtein edit distance between two strings.\n * @param {string} a\n * @param {string} b\n * @return {number} The edit distance between the two strings.\n */\ngoog.string.editDistance = function(a, b) {\n  var v0 = [];\n  var v1 = [];\n\n  if (a == b) {\n    return 0;\n  }\n\n  if (!a.length || !b.length) {\n    return Math.max(a.length, b.length);\n  }\n\n  for (var i = 0; i < b.length + 1; i++) {\n    v0[i] = i;\n  }\n\n  for (var i = 0; i < a.length; i++) {\n    v1[0] = i + 1;\n\n    for (var j = 0; j < b.length; j++) {\n      var cost = Number(a[i] != b[j]);\n      // Cost for the substring is the minimum of adding one character, removing\n      // one character, or a swap.\n      v1[j + 1] = Math.min(v1[j] + 1, v0[j + 1] + 1, v0[j] + cost);\n    }\n\n    for (var j = 0; j < v0.length; j++) {\n      v0[j] = v1[j];\n    }\n  }\n\n  return v1[b.length];\n};\n","^?",1579837703000,"^@",["^A",["^3","^17","^1:","^1;","~$goog.string.internal"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/string/string.js"],"^S",["^A",["^16","^23"]],"^1",true,"^2",["^3","^1;","^17","^1:","^3K"]],["^ ","^7",[1579837703000],"^8","goog.async.conditionaldelay.js","^9",["^:","goog/async/conditionaldelay.js"],"^;","goog/async/conditionaldelay.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines a class useful for handling functions that must be\n * invoked later when some condition holds. Examples include deferred function\n * calls that return a boolean flag whether it succedeed or not.\n *\n * Example:\n *\n *  function deferred() {\n *     var succeeded = false;\n *     // ... custom code\n *     return succeeded;\n *  }\n *\n *  var deferredCall = new goog.async.ConditionalDelay(deferred);\n *  deferredCall.onSuccess = function() {\n *    alert('Success: The deferred function has been successfully executed.');\n *  }\n *  deferredCall.onFailure = function() {\n *    alert('Failure: Time limit exceeded.');\n *  }\n *\n *  // Call the deferred() every 100 msec until it returns true,\n *  // or 5 seconds pass.\n *  deferredCall.start(100, 5000);\n *\n *  // Stop the deferred function call (does nothing if it's not active).\n *  deferredCall.stop();\n *\n */\n\n\ngoog.provide('goog.async.ConditionalDelay');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.async.Delay');\n\n\n\n/**\n * A ConditionalDelay object invokes the associated function after a specified\n * interval delay and checks its return value. If the function returns\n * `true` the conditional delay is cancelled and {@see #onSuccess}\n * is called. Otherwise this object keeps to invoke the deferred function until\n * either it returns `true` or the timeout is exceeded. In the latter case\n * the {@see #onFailure} method will be called.\n *\n * The interval duration and timeout can be specified each time the delay is\n * started. Calling start on an active delay will reset the timer.\n *\n * @param {function():boolean} listener Function to call when the delay\n *     completes. Should return a value that type-converts to `true` if\n *     the call succeeded and this delay should be stopped.\n * @param {Object=} opt_handler The object scope to invoke the function in.\n * @constructor\n * @struct\n * @extends {goog.Disposable}\n */\ngoog.async.ConditionalDelay = function(listener, opt_handler) {\n  goog.async.ConditionalDelay.base(this, 'constructor');\n\n  /**\n   * The delay interval in milliseconds to between the calls to the callback.\n   * Note, that the callback may be invoked earlier than this interval if the\n   * timeout is exceeded.\n   * @private {number}\n   */\n  this.interval_ = 0;\n\n  /**\n   * The timeout timestamp until which the delay is to be executed.\n   * A negative value means no timeout.\n   * @private {number}\n   */\n  this.runUntil_ = 0;\n\n  /**\n   * True if the listener has been executed, and it returned `true`.\n   * @private {boolean}\n   */\n  this.isDone_ = false;\n\n  /**\n   * The function that will be invoked after a delay.\n   * @private {function():boolean}\n   */\n  this.listener_ = listener;\n\n  /**\n   * The object context to invoke the callback in.\n   * @private {Object|undefined}\n   */\n  this.handler_ = opt_handler;\n\n  /**\n   * The underlying goog.async.Delay delegate object.\n   * @private {goog.async.Delay}\n   */\n  this.delay_ = new goog.async.Delay(\n      goog.bind(this.onTick_, this), 0 /*interval*/, this /*scope*/);\n};\ngoog.inherits(goog.async.ConditionalDelay, goog.Disposable);\n\n\n/** @override */\ngoog.async.ConditionalDelay.prototype.disposeInternal = function() {\n  this.delay_.dispose();\n  delete this.listener_;\n  delete this.handler_;\n  goog.async.ConditionalDelay.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * Starts the delay timer. The provided listener function will be called\n * repeatedly after the specified interval until the function returns\n * `true` or the timeout is exceeded. Calling start on an active timer\n * will stop the timer first.\n * @param {number=} opt_interval The time interval between the function\n *     invocations (in milliseconds). Default is 0.\n * @param {number=} opt_timeout The timeout interval (in milliseconds). Takes\n *     precedence over the `opt_interval`, i.e. if the timeout is less\n *     than the invocation interval, the function will be called when the\n *     timeout is exceeded. A negative value means no timeout. Default is 0.\n */\ngoog.async.ConditionalDelay.prototype.start = function(\n    opt_interval, opt_timeout) {\n  this.stop();\n  this.isDone_ = false;\n\n  var timeout = opt_timeout || 0;\n  this.interval_ = Math.max(opt_interval || 0, 0);\n  this.runUntil_ = timeout < 0 ? -1 : (goog.now() + timeout);\n  this.delay_.start(\n      timeout < 0 ? this.interval_ : Math.min(this.interval_, timeout));\n};\n\n\n/**\n * Stops the delay timer if it is active. No action is taken if the timer is not\n * in use.\n */\ngoog.async.ConditionalDelay.prototype.stop = function() {\n  this.delay_.stop();\n};\n\n\n/**\n * @return {boolean} True if the delay is currently active, false otherwise.\n */\ngoog.async.ConditionalDelay.prototype.isActive = function() {\n  return this.delay_.isActive();\n};\n\n\n/**\n * @return {boolean} True if the listener has been executed and returned\n *     `true` since the last call to {@see #start}.\n */\ngoog.async.ConditionalDelay.prototype.isDone = function() {\n  return this.isDone_;\n};\n\n\n/**\n * Called when the listener has been successfully executed and returned\n * `true`. The {@see #isDone} method should return `true` by now.\n * Designed for inheritance, should be overridden by subclasses or on the\n * instances if they care.\n */\ngoog.async.ConditionalDelay.prototype.onSuccess = function() {\n  // Do nothing by default.\n};\n\n\n/**\n * Called when this delayed call is cancelled because the timeout has been\n * exceeded, and the listener has never returned `true`.\n * Designed for inheritance, should be overridden by subclasses or on the\n * instances if they care.\n */\ngoog.async.ConditionalDelay.prototype.onFailure = function() {\n  // Do nothing by default.\n};\n\n\n/**\n * A callback function for the underlying `goog.async.Delay` object. When\n * executed the listener function is called, and if it returns `true`\n * the delay is stopped and the {@see #onSuccess} method is invoked.\n * If the timeout is exceeded the delay is stopped and the\n * {@see #onFailure} method is called.\n * @private\n */\ngoog.async.ConditionalDelay.prototype.onTick_ = function() {\n  var successful = this.listener_.call(this.handler_);\n  if (successful) {\n    this.isDone_ = true;\n    this.onSuccess();\n  } else {\n    // Try to reschedule the task.\n    if (this.runUntil_ < 0) {\n      // No timeout.\n      this.delay_.start(this.interval_);\n    } else {\n      var timeLeft = this.runUntil_ - goog.now();\n      if (timeLeft <= 0) {\n        this.onFailure();\n      } else {\n        this.delay_.start(Math.min(this.interval_, timeLeft));\n      }\n    }\n  }\n};\n","^?",1579837703000,"^@",["^A",["^3","^3C","~$goog.async.Delay"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/async/conditionaldelay.js"],"^S",["^A",["~$goog.async.ConditionalDelay"]],"^1",true,"^2",["^3","^3C","^3L"]],["^ ","^7",[1579837703000],"^8","goog.db.transaction.js","^9",["^:","goog/db/transaction.js"],"^;","goog/db/transaction.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Wrapper for an IndexedDB transaction.\n *\n */\n\n\ngoog.provide('goog.db.Transaction');\ngoog.provide('goog.db.Transaction.TransactionMode');\n\ngoog.require('goog.async.Deferred');\ngoog.require('goog.db.Error');\ngoog.require('goog.db.ObjectStore');\ngoog.require('goog.events');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\n\n\n\n/**\n * Creates a new transaction. Transactions contain methods for accessing object\n * stores and are created from the database object. Should not be created\n * directly, open a database and call createTransaction on it.\n * @see goog.db.IndexedDb#createTransaction\n *\n * @param {!IDBTransaction} tx IndexedDB transaction to back this wrapper.\n * @param {!goog.db.IndexedDb} db The database that this transaction modifies.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.db.Transaction = function(tx, db) {\n  goog.db.Transaction.base(this, 'constructor');\n\n  /**\n   * Underlying IndexedDB transaction object.\n   *\n   * @type {!IDBTransaction}\n   * @private\n   */\n  this.tx_ = tx;\n\n  /**\n   * The database that this transaction modifies.\n   *\n   * @type {!goog.db.IndexedDb}\n   * @private\n   */\n  this.db_ = db;\n\n  /**\n   * Event handler for this transaction.\n   *\n   * @type {!goog.events.EventHandler<!goog.db.Transaction>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  // TODO(user): remove these casts once the externs file is updated to\n  // correctly reflect that IDBTransaction extends EventTarget\n  this.eventHandler_.listen(\n      /** @type {!EventTarget} */ (this.tx_), 'complete',\n      goog.bind(\n          this.dispatchEvent, this, goog.db.Transaction.EventTypes.COMPLETE));\n  this.eventHandler_.listen(\n      /** @type {!EventTarget} */ (this.tx_), 'abort',\n      goog.bind(\n          this.dispatchEvent, this, goog.db.Transaction.EventTypes.ABORT));\n  this.eventHandler_.listen(\n      /** @type {!EventTarget} */ (this.tx_), 'error', this.dispatchError_);\n};\ngoog.inherits(goog.db.Transaction, goog.events.EventTarget);\n\n\n/**\n * Dispatches an error event based on the given event, wrapping the error\n * if necessary.\n *\n * @param {Event} ev The error event given to the underlying IDBTransaction.\n * @private\n */\ngoog.db.Transaction.prototype.dispatchError_ = function(ev) {\n  if (ev.target instanceof goog.db.Error) {\n    this.dispatchEvent(\n        {type: goog.db.Transaction.EventTypes.ERROR, target: ev.target});\n  } else {\n    this.dispatchEvent({\n      type: goog.db.Transaction.EventTypes.ERROR,\n      target: goog.db.Error.fromRequest(\n          /** @type {!IDBRequest} */ (ev.target), 'in transaction')\n    });\n  }\n};\n\n\n/**\n * Event types the Transaction can dispatch. COMPLETE events are dispatched\n * when the transaction is committed. If a transaction is aborted it dispatches\n * both an ABORT event and an ERROR event with the ABORT_ERR code. Error events\n * are dispatched on any error.\n *\n * @enum {string}\n */\ngoog.db.Transaction.EventTypes = {\n  COMPLETE: 'complete',\n  ABORT: 'abort',\n  ERROR: 'error'\n};\n\n\n/**\n * @return {goog.db.Transaction.TransactionMode} The transaction's mode.\n */\ngoog.db.Transaction.prototype.getMode = function() {\n  return /** @type {goog.db.Transaction.TransactionMode} */ (this.tx_.mode);\n};\n\n\n/**\n * @return {!goog.db.IndexedDb} The database that this transaction modifies.\n */\ngoog.db.Transaction.prototype.getDatabase = function() {\n  return this.db_;\n};\n\n\n/**\n * Opens an object store to do operations on in this transaction. The requested\n * object store must be one that is in this transaction's scope.\n * @see goog.db.IndexedDb#createTransaction\n *\n * @param {string} name The name of the requested object store.\n * @return {!goog.db.ObjectStore} The wrapped object store.\n * @throws {goog.db.Error} In case of error getting the object store.\n */\ngoog.db.Transaction.prototype.objectStore = function(name) {\n  try {\n    return new goog.db.ObjectStore(this.tx_.objectStore(name));\n  } catch (ex) {\n    throw goog.db.Error.fromException(ex, 'getting object store ' + name);\n  }\n};\n\n\n/**\n * @return {!goog.async.Deferred} A deferred that will fire once the\n *     transaction is complete. It fires the errback chain if an error occurs\n *     in the transaction, or if it is aborted.\n */\ngoog.db.Transaction.prototype.wait = function() {\n  var d = new goog.async.Deferred();\n  goog.events.listenOnce(\n      this, goog.db.Transaction.EventTypes.COMPLETE, goog.bind(d.callback, d));\n  var errorKey;\n  var abortKey = goog.events.listenOnce(\n      this, goog.db.Transaction.EventTypes.ABORT, function() {\n        goog.events.unlistenByKey(errorKey);\n        d.errback(\n            new goog.db.Error(\n                goog.db.Error.ErrorCode.ABORT_ERR,\n                'waiting for transaction to complete'));\n      });\n  errorKey = goog.events.listenOnce(\n      this, goog.db.Transaction.EventTypes.ERROR, function(e) {\n        goog.events.unlistenByKey(abortKey);\n        d.errback(e.target);\n      });\n\n  var db = this.getDatabase();\n  return d.addCallback(function() { return db; });\n};\n\n\n/**\n * Aborts this transaction. No pending operations will be applied to the\n * database. Dispatches an ABORT event.\n */\ngoog.db.Transaction.prototype.abort = function() {\n  this.tx_.abort();\n};\n\n\n/** @override */\ngoog.db.Transaction.prototype.disposeInternal = function() {\n  goog.db.Transaction.base(this, 'disposeInternal');\n  this.eventHandler_.dispose();\n};\n\n\n/**\n * The three possible transaction modes.\n * @see http://www.w3.org/TR/IndexedDB/#idl-def-IDBTransaction\n *\n * @enum {string}\n */\ngoog.db.Transaction.TransactionMode = {\n  READ_ONLY: 'readonly',\n  READ_WRITE: 'readwrite',\n  VERSION_CHANGE: 'versionchange'\n};\n","^?",1579837703000,"^@",["^A",["~$goog.db.ObjectStore","^2R","~$goog.db.Error","^3","^1M","~$goog.async.Deferred","^1N"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/db/transaction.js"],"^S",["^A",["~$goog.db.Transaction","~$goog.db.Transaction.TransactionMode"]],"^1",true,"^2",["^3","^3P","^3O","^3N","^1N","^2R","^1M"]],["^ ","^7",[1579837703000],"^8","goog.graphics.ext.group.js","^9",["^:","goog/graphics/ext/group.js"],"^;","goog/graphics/ext/group.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A thicker wrapper around graphics groups.\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.graphics.ext.Group');\n\ngoog.forwardDeclare('goog.graphics.GroupElement');\ngoog.require('goog.array');\ngoog.require('goog.graphics.ext.Element');\n\n\n\n/**\n * Wrapper for a graphics group.\n * @param {goog.graphics.ext.Group} group Parent for this element. Can\n *     be null if this is a Graphics instance.\n * @param {goog.graphics.GroupElement=} opt_wrapper The thin wrapper\n *     to wrap. If omitted, a new group will be created. Must be included\n *     when group is null.\n * @constructor\n * @extends {goog.graphics.ext.Element}\n */\ngoog.graphics.ext.Group = function(group, opt_wrapper) {\n  opt_wrapper = opt_wrapper ||\n      group.getGraphicsImplementation().createGroup(group.getWrapper());\n  goog.graphics.ext.Element.call(this, group, opt_wrapper);\n\n  /**\n   * Array of child elements this group contains.\n   * @type {Array<goog.graphics.ext.Element>}\n   * @private\n   */\n  this.children_ = [];\n};\ngoog.inherits(goog.graphics.ext.Group, goog.graphics.ext.Element);\n\n\n/**\n * Add an element to the group.  This should be treated as package local, as\n * it is called by the draw* methods.\n * @param {!goog.graphics.ext.Element} element The element to add.\n * @param {boolean=} opt_chain Whether this addition is part of a longer set\n *     of element additions.\n */\ngoog.graphics.ext.Group.prototype.addChild = function(element, opt_chain) {\n  if (!goog.array.contains(this.children_, element)) {\n    this.children_.push(element);\n  }\n\n  var transformed = this.growToFit_(element);\n\n  if (element.isParentDependent()) {\n    element.parentTransform();\n  }\n\n  if (!opt_chain && element.isPendingTransform()) {\n    element.reset();\n  }\n\n  if (transformed) {\n    this.reset();\n  }\n};\n\n\n/**\n * Remove an element from the group.\n * @param {goog.graphics.ext.Element} element The element to remove.\n */\ngoog.graphics.ext.Group.prototype.removeChild = function(element) {\n  goog.array.remove(this.children_, element);\n\n  // TODO(robbyw): shape.fireEvent('delete')\n\n  this.getGraphicsImplementation().removeElement(element.getWrapper());\n};\n\n\n/**\n * Calls the given function on each of this component's children in order.  If\n * `opt_obj` is provided, it will be used as the 'this' object in the\n * function when called.  The function should take two arguments:  the child\n * component and its 0-based index.  The return value is ignored.\n * @param {Function} f The function to call for every child component; should\n *    take 2 arguments (the child and its index).\n * @param {Object=} opt_obj Used as the 'this' object in f when called.\n */\ngoog.graphics.ext.Group.prototype.forEachChild = function(f, opt_obj) {\n  if (this.children_) {\n    goog.array.forEach(this.children_, f, opt_obj);\n  }\n};\n\n\n/**\n * @return {goog.graphics.GroupElement} The underlying thin wrapper.\n * @override\n */\ngoog.graphics.ext.Group.prototype.getWrapper;\n\n\n/**\n * Reset the element.\n * @override\n */\ngoog.graphics.ext.Group.prototype.reset = function() {\n  goog.graphics.ext.Group.superClass_.reset.call(this);\n\n  this.updateChildren();\n};\n\n\n/**\n * Called from the parent class, this method resets any pre-computed positions\n * and sizes.\n * @protected\n * @override\n */\ngoog.graphics.ext.Group.prototype.redraw = function() {\n  this.getWrapper().setSize(this.getWidth(), this.getHeight());\n  this.transformChildren();\n};\n\n\n/**\n * Transform the children that need to be transformed.\n * @protected\n */\ngoog.graphics.ext.Group.prototype.transformChildren = function() {\n  this.forEachChild(function(child) {\n    if (child.isParentDependent()) {\n      child.parentTransform();\n    }\n  });\n};\n\n\n/**\n * As part of the reset process, update child elements.\n */\ngoog.graphics.ext.Group.prototype.updateChildren = function() {\n  this.forEachChild(function(child) {\n    if (child.isParentDependent() || child.isPendingTransform()) {\n      child.reset();\n    } else if (child.updateChildren) {\n      child.updateChildren();\n    }\n  });\n};\n\n\n/**\n * When adding an element, grow this group's bounds to fit it.\n * @param {!goog.graphics.ext.Element} element The added element.\n * @return {boolean} Whether the size of this group changed.\n * @private\n */\ngoog.graphics.ext.Group.prototype.growToFit_ = function(element) {\n  var transformed = false;\n\n  var x = element.getMaxX();\n  if (x > this.getWidth()) {\n    this.setMinWidth(x);\n    transformed = true;\n  }\n\n  var y = element.getMaxY();\n  if (y > this.getHeight()) {\n    this.setMinHeight(y);\n    transformed = true;\n  }\n\n  return transformed;\n};\n\n\n/**\n * @return {number} The width of the element's coordinate space.\n */\ngoog.graphics.ext.Group.prototype.getCoordinateWidth = function() {\n  return this.getWidth();\n};\n\n\n/**\n * @return {number} The height of the element's coordinate space.\n */\ngoog.graphics.ext.Group.prototype.getCoordinateHeight = function() {\n  return this.getHeight();\n};\n\n\n/**\n * Remove all drawing elements from the group.\n */\ngoog.graphics.ext.Group.prototype.clear = function() {\n  while (this.children_.length) {\n    this.removeChild(this.children_[0]);\n  }\n};\n","^?",1579837703000,"^@",["^A",["^3","^1S","~$goog.graphics.ext.Element"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/ext/group.js"],"^S",["^A",["~$goog.graphics.ext.Group"]],"^1",true,"^2",["^3","^1S","^3S"]],["^ ","^7",[1579837703000],"^8","goog.ui.menubutton.js","^9",["^:","goog/ui/menubutton.js"],"^;","goog/ui/menubutton.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A menu button control.\n *\n * @author attila@google.com (Attila Bodis)\n * @see ../demos/menubutton.html\n */\n\ngoog.provide('goog.ui.MenuButton');\n\ngoog.require('goog.Timer');\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.events.KeyHandler');\ngoog.require('goog.math.Box');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.math.Rect');\ngoog.require('goog.positioning');\ngoog.require('goog.positioning.Corner');\ngoog.require('goog.positioning.MenuAnchoredPosition');\ngoog.require('goog.positioning.Overflow');\ngoog.require('goog.style');\ngoog.require('goog.ui.Button');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.IdGenerator');\ngoog.require('goog.ui.Menu');\ngoog.require('goog.ui.MenuButtonRenderer');\ngoog.require('goog.ui.MenuItem');\ngoog.require('goog.ui.MenuRenderer');\ngoog.require('goog.ui.SubMenu');\ngoog.require('goog.ui.registry');\ngoog.require('goog.userAgent');\ngoog.require('goog.userAgent.product');\n\n\n\n/**\n * A menu button control.  Extends {@link goog.ui.Button} by composing a button\n * with a dropdown arrow and a popup menu.\n *\n * @param {goog.ui.ControlContent=} opt_content Text caption or existing DOM\n *     structure to display as the button's caption (if any).\n * @param {goog.ui.Menu=} opt_menu Menu to render under the button when clicked.\n * @param {goog.ui.ButtonRenderer=} opt_renderer Renderer used to render or\n *     decorate the menu button; defaults to {@link goog.ui.MenuButtonRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @param {!goog.ui.MenuRenderer=} opt_menuRenderer Renderer used to render or\n *     decorate the menu; defaults to {@link goog.ui.MenuRenderer}.\n * @constructor\n * @extends {goog.ui.Button}\n */\ngoog.ui.MenuButton = function(\n    opt_content, opt_menu, opt_renderer, opt_domHelper, opt_menuRenderer) {\n  goog.ui.Button.call(\n      this, opt_content,\n      opt_renderer || goog.ui.MenuButtonRenderer.getInstance(), opt_domHelper);\n\n  // Menu buttons support the OPENED state.\n  this.setSupportedState(goog.ui.Component.State.OPENED, true);\n\n  /**\n   * The menu position on this button.\n   * @type {!goog.positioning.AnchoredPosition}\n   * @private\n   */\n  this.menuPosition_ = new goog.positioning.MenuAnchoredPosition(\n      null, goog.positioning.Corner.BOTTOM_START);\n\n  if (opt_menu) {\n    this.setMenu(opt_menu);\n  }\n  this.menuMargin_ = null;\n  this.timer_ = new goog.Timer(500);  // 0.5 sec\n\n  // Phones running iOS prior to version 4.2.\n  if ((goog.userAgent.product.IPHONE || goog.userAgent.product.IPAD) &&\n      // Check the webkit version against the version for iOS 4.2.1.\n      !goog.userAgent.isVersionOrHigher('533.17.9')) {\n    // @bug 4322060 This is required so that the menu works correctly on\n    // iOS prior to version 4.2. Otherwise, the blur action closes the menu\n    // before the menu button click can be processed.\n    this.setFocusablePopupMenu(true);\n  }\n\n  /** @private {!goog.ui.MenuRenderer} */\n  this.menuRenderer_ = opt_menuRenderer || goog.ui.MenuRenderer.getInstance();\n};\ngoog.inherits(goog.ui.MenuButton, goog.ui.Button);\ngoog.tagUnsealableClass(goog.ui.MenuButton);\n\n\n/**\n * The menu.\n * @type {goog.ui.Menu|undefined}\n * @private\n */\ngoog.ui.MenuButton.prototype.menu_;\n\n\n/**\n * The position element.  If set, use positionElement_ to position the\n * popup menu instead of the default which is to use the menu button element.\n * @type {Element|undefined}\n * @private\n */\ngoog.ui.MenuButton.prototype.positionElement_;\n\n\n/**\n * The margin to apply to the menu's position when it is shown.  If null, no\n * margin will be applied.\n * @type {goog.math.Box}\n * @private\n */\ngoog.ui.MenuButton.prototype.menuMargin_;\n\n\n/**\n * Whether the attached popup menu is focusable or not (defaults to false).\n * Popup menus attached to menu buttons usually don't need to be focusable,\n * i.e. the button retains keyboard focus, and forwards key events to the\n * menu for processing.  However, menus like {@link goog.ui.FilteredMenu}\n * need to be focusable.\n * @type {boolean}\n * @private\n */\ngoog.ui.MenuButton.prototype.isFocusablePopupMenu_ = false;\n\n\n/**\n * A Timer to correct menu position.\n * @type {goog.Timer}\n * @private\n */\ngoog.ui.MenuButton.prototype.timer_;\n\n\n/**\n * The bounding rectangle of the button element.\n * @type {goog.math.Rect}\n * @private\n */\ngoog.ui.MenuButton.prototype.buttonRect_;\n\n\n/**\n * The viewport rectangle.\n * @type {goog.math.Box}\n * @private\n */\ngoog.ui.MenuButton.prototype.viewportBox_;\n\n\n/**\n * The original size.\n * @type {goog.math.Size|undefined}\n * @private\n */\ngoog.ui.MenuButton.prototype.originalSize_;\n\n\n/**\n * Do we render the drop down menu as a sibling to the label, or at the end\n * of the current dom?\n * @type {boolean}\n * @private\n */\ngoog.ui.MenuButton.prototype.renderMenuAsSibling_ = false;\n\n\n/**\n * Whether to select the first item in the menu when it is opened using\n * enter or space. By default, the first item is selected only when\n * opened by a key up or down event. When this is on, the first item will\n * be selected due to any of the four events.\n * @private\n */\ngoog.ui.MenuButton.prototype.selectFirstOnEnterOrSpace_ = false;\n\n\n/**\n * Sets up event handlers specific to menu buttons.\n * @override\n */\ngoog.ui.MenuButton.prototype.enterDocument = function() {\n  goog.ui.MenuButton.superClass_.enterDocument.call(this);\n  this.attachKeyDownEventListener_(true);\n  if (this.menu_) {\n    this.attachMenuEventListeners_(this.menu_, true);\n  }\n  goog.a11y.aria.setState(\n      this.getElementStrict(), goog.a11y.aria.State.HASPOPUP, !!this.menu_);\n};\n\n\n/**\n * Removes event handlers specific to menu buttons, and ensures that the\n * attached menu also exits the document.\n * @override\n */\ngoog.ui.MenuButton.prototype.exitDocument = function() {\n  goog.ui.MenuButton.superClass_.exitDocument.call(this);\n  this.attachKeyDownEventListener_(false);\n  if (this.menu_) {\n    this.setOpen(false);\n    this.menu_.exitDocument();\n    this.attachMenuEventListeners_(this.menu_, false);\n\n    var menuElement = this.menu_.getElement();\n    if (menuElement) {\n      goog.dom.removeNode(menuElement);\n    }\n  }\n};\n\n\n/** @override */\ngoog.ui.MenuButton.prototype.disposeInternal = function() {\n  goog.ui.MenuButton.superClass_.disposeInternal.call(this);\n  if (this.menu_) {\n    this.menu_.dispose();\n    delete this.menu_;\n  }\n  delete this.positionElement_;\n  this.timer_.dispose();\n};\n\n\n/**\n * Handles mousedown events.  Invokes the superclass implementation to dispatch\n * an ACTIVATE event and activate the button.  Also toggles the visibility of\n * the attached menu.\n * @param {goog.events.Event} e Mouse event to handle.\n * @override\n * @protected\n */\ngoog.ui.MenuButton.prototype.handleMouseDown = function(e) {\n  goog.ui.MenuButton.superClass_.handleMouseDown.call(this, e);\n  if (this.isActive()) {\n    // The component was allowed to activate; toggle menu visibility.\n    this.setOpen(!this.isOpen(), e);\n    if (this.menu_) {\n      this.menu_.setMouseButtonPressed(this.isOpen());\n    }\n  }\n};\n\n\n/**\n * Handles mouseup events.  Invokes the superclass implementation to dispatch\n * an ACTION event and deactivate the button.\n * @param {goog.events.Event} e Mouse event to handle.\n * @override\n * @protected\n */\ngoog.ui.MenuButton.prototype.handleMouseUp = function(e) {\n  goog.ui.MenuButton.superClass_.handleMouseUp.call(this, e);\n  if (this.menu_ && !this.isActive()) {\n    this.menu_.setMouseButtonPressed(false);\n  }\n};\n\n\n/**\n * Performs the appropriate action when the menu button is activated by the\n * user.  Overrides the superclass implementation by not dispatching an\n * `ACTION` event, because menu buttons exist only to reveal menus, not to\n * perform actions themselves.  Calls {@link #setActive} to deactivate the\n * button.\n * @param {goog.events.Event} e Mouse or key event that triggered the action.\n * @return {boolean} Whether the action was allowed to proceed.\n * @override\n * @protected\n */\ngoog.ui.MenuButton.prototype.performActionInternal = function(e) {\n  this.setActive(false);\n  return true;\n};\n\n\n/**\n * Handles mousedown events over the document.  If the mousedown happens over\n * an element unrelated to the component, hides the menu.\n * TODO(attila): Reconcile this with goog.ui.Popup (and handle frames/windows).\n * @param {goog.events.BrowserEvent} e Mouse event to handle.\n * @protected\n */\ngoog.ui.MenuButton.prototype.handleDocumentMouseDown = function(e) {\n  if (this.menu_ && this.menu_.isVisible() &&\n      !this.containsElement(/** @type {Element} */ (e.target))) {\n    // User clicked somewhere else in the document while the menu was visible;\n    // dismiss menu.\n    this.setOpen(false);\n  }\n};\n\n\n/**\n * Returns true if the given element is to be considered part of the component,\n * even if it isn't a DOM descendant of the component's root element.\n * @param {Element} element Element to test (if any).\n * @return {boolean} Whether the element is considered part of the component.\n * @protected\n */\ngoog.ui.MenuButton.prototype.containsElement = function(element) {\n  return element && goog.dom.contains(this.getElement(), element) ||\n      this.menu_ && this.menu_.containsElement(element) || false;\n};\n\n\n/** @override */\ngoog.ui.MenuButton.prototype.handleKeyEventInternal = function(e) {\n  // Handle SPACE on keyup and all other keys on keypress.\n  if (e.keyCode == goog.events.KeyCodes.SPACE) {\n    // Prevent page scrolling in Chrome.\n    e.preventDefault();\n    if (e.type != goog.events.EventType.KEYUP) {\n      // Ignore events because KeyCodes.SPACE is handled further down.\n      return true;\n    }\n  } else if (e.type != goog.events.KeyHandler.EventType.KEY) {\n    return false;\n  }\n\n  if (this.menu_ && this.menu_.isVisible()) {\n    // Menu is open.\n    const isEnterOrSpace = e.keyCode == goog.events.KeyCodes.ENTER ||\n        e.keyCode == goog.events.KeyCodes.SPACE;\n    const handledByMenu = this.menu_.handleKeyEvent(e);\n    // If the submenu has handled the key event, then defer to it to close the\n    // menu if necessary and do not close it here. This is needed because the\n    // enter key should keep the submenu open, but should close other types of\n    // menu items.\n    // Check for this.menu_ again here because some widgets set this.dispose\n    // after handleKeyEvent. Example: go/widget-dispose-ex\n    const handledBySubMenu = handledByMenu && this.menu_ &&\n        this.menu_.getOpenItem() instanceof goog.ui.SubMenu;\n    if (!handledBySubMenu &&\n        (e.keyCode == goog.events.KeyCodes.ESC || isEnterOrSpace)) {\n      // Dismiss the menu.\n      this.setOpen(false);\n      return true;\n    }\n    return handledByMenu;\n  }\n\n  if (e.keyCode == goog.events.KeyCodes.DOWN ||\n      e.keyCode == goog.events.KeyCodes.UP ||\n      e.keyCode == goog.events.KeyCodes.SPACE ||\n      e.keyCode == goog.events.KeyCodes.ENTER) {\n    // Menu is closed, and the user hit the down/up/space/enter key; open menu.\n    this.setOpen(true, e);\n    return true;\n  }\n\n  // Key event wasn't handled by the component.\n  return false;\n};\n\n\n/**\n * Handles `ACTION` events dispatched by an activated menu item.\n * @param {goog.events.Event} e Action event to handle.\n * @protected\n */\ngoog.ui.MenuButton.prototype.handleMenuAction = function(e) {\n  // Close the menu on click.\n  this.setOpen(false);\n};\n\n\n/**\n * Handles `BLUR` events dispatched by the popup menu by closing it.\n * Only registered if the menu is focusable.\n * @param {goog.events.Event} e Blur event dispatched by a focusable menu.\n */\ngoog.ui.MenuButton.prototype.handleMenuBlur = function(e) {\n  // Close the menu when it reports that it lost focus, unless the button is\n  // pressed (active).\n  if (!this.isActive()) {\n    this.setOpen(false);\n  }\n};\n\n\n/**\n * Handles blur events dispatched by the button's key event target when it\n * loses keyboard focus by closing the popup menu (unless it is focusable).\n * Only registered if the button is focusable.\n * @param {goog.events.Event} e Blur event dispatched by the menu button.\n * @override\n * @protected\n */\ngoog.ui.MenuButton.prototype.handleBlur = function(e) {\n  if (!this.isFocusablePopupMenu()) {\n    this.setOpen(false);\n  }\n  goog.ui.MenuButton.superClass_.handleBlur.call(this, e);\n};\n\n\n/**\n * Returns the menu attached to the button.  If no menu is attached, creates a\n * new empty menu.\n * @return {goog.ui.Menu} Popup menu attached to the menu button.\n */\ngoog.ui.MenuButton.prototype.getMenu = function() {\n  if (!this.menu_) {\n    this.setMenu(new goog.ui.Menu(this.getDomHelper(), this.menuRenderer_));\n  }\n  return this.menu_ || null;\n};\n\n\n/**\n * Replaces the menu attached to the button with the argument, and returns the\n * previous menu (if any).\n * @param {goog.ui.Menu?} menu New menu to be attached to the menu button (null\n *     to remove the menu).\n * @return {goog.ui.Menu|undefined} Previous menu (undefined if none).\n */\ngoog.ui.MenuButton.prototype.setMenu = function(menu) {\n  var oldMenu = this.menu_;\n\n  // Do nothing unless the new menu is different from the current one.\n  if (menu != oldMenu) {\n    if (oldMenu) {\n      this.setOpen(false);\n      if (this.isInDocument()) {\n        this.attachMenuEventListeners_(oldMenu, false);\n      }\n      delete this.menu_;\n    }\n    if (this.isInDocument()) {\n      goog.a11y.aria.setState(\n          this.getElementStrict(), goog.a11y.aria.State.HASPOPUP, !!menu);\n    }\n    if (menu) {\n      this.menu_ = menu;\n      menu.setParent(this);\n      menu.setVisible(false);\n      menu.setAllowAutoFocus(this.isFocusablePopupMenu());\n      if (this.isInDocument()) {\n        this.attachMenuEventListeners_(menu, true);\n      }\n    }\n  }\n\n  return oldMenu;\n};\n\n\n/**\n * Specify which positioning algorithm to use.\n *\n * This method is preferred over the fine-grained positioning methods like\n * setPositionElement, setAlignMenuToStart, and setScrollOnOverflow. Calling\n * this method will override settings by those methods.\n *\n * @param {goog.positioning.AnchoredPosition} position The position of the\n *     Menu the button. If the position has a null anchor, we will use the\n *     menubutton element as the anchor.\n */\ngoog.ui.MenuButton.prototype.setMenuPosition = function(position) {\n  if (position) {\n    this.menuPosition_ = position;\n    this.positionElement_ = position.element;\n  }\n};\n\n\n/**\n * Sets an element for anchoring the menu.\n * @param {Element} positionElement New element to use for\n *     positioning the dropdown menu.  Null to use the default behavior\n *     of positioning to this menu button.\n */\ngoog.ui.MenuButton.prototype.setPositionElement = function(positionElement) {\n  this.positionElement_ = positionElement;\n  this.positionMenu();\n};\n\n\n/**\n * Sets a margin that will be applied to the menu's position when it is shown.\n * If null, no margin will be applied.\n * @param {goog.math.Box} margin Margin to apply.\n */\ngoog.ui.MenuButton.prototype.setMenuMargin = function(margin) {\n  this.menuMargin_ = margin;\n};\n\n\n/**\n * Sets whether to select the first item in the menu when it is opened using\n * enter or space. By default, the first item is selected only when\n * opened by a key up or down event. When this is on, the first item will\n * be selected due to any of the four events.\n * @param {boolean} select\n */\ngoog.ui.MenuButton.prototype.setSelectFirstOnEnterOrSpace = function(select) {\n  this.selectFirstOnEnterOrSpace_ = select;\n};\n\n\n/**\n * Adds a new menu item at the end of the menu.\n * @param {goog.ui.MenuItem|goog.ui.MenuSeparator|goog.ui.Control} item Menu\n *     item to add to the menu.\n */\ngoog.ui.MenuButton.prototype.addItem = function(item) {\n  this.getMenu().addChild(item, true);\n};\n\n\n/**\n * Adds a new menu item at the specific index in the menu.\n * @param {goog.ui.MenuItem|goog.ui.MenuSeparator} item Menu item to add to the\n *     menu.\n * @param {number} index Index at which to insert the menu item.\n */\ngoog.ui.MenuButton.prototype.addItemAt = function(item, index) {\n  this.getMenu().addChildAt(item, index, true);\n};\n\n\n/**\n * Removes the item from the menu and disposes of it.\n * @param {goog.ui.MenuItem|goog.ui.MenuSeparator} item The menu item to remove.\n */\ngoog.ui.MenuButton.prototype.removeItem = function(item) {\n  var child = this.getMenu().removeChild(item, true);\n  if (child) {\n    child.dispose();\n  }\n};\n\n\n/**\n * Removes the menu item at a given index in the menu and disposes of it.\n * @param {number} index Index of item.\n */\ngoog.ui.MenuButton.prototype.removeItemAt = function(index) {\n  var child = this.getMenu().removeChildAt(index, true);\n  if (child) {\n    child.dispose();\n  }\n};\n\n\n/**\n * Returns the menu item at a given index.\n * @param {number} index Index of menu item.\n * @return {goog.ui.MenuItem?} Menu item (null if not found).\n */\ngoog.ui.MenuButton.prototype.getItemAt = function(index) {\n  return this.menu_ ?\n      /** @type {goog.ui.MenuItem} */ (this.menu_.getChildAt(index)) :\n                                      null;\n};\n\n\n/**\n * Returns the number of items in the menu (including separators).\n * @return {number} The number of items in the menu.\n */\ngoog.ui.MenuButton.prototype.getItemCount = function() {\n  return this.menu_ ? this.menu_.getChildCount() : 0;\n};\n\n\n/**\n * Shows/hides the menu button based on the value of the argument.  Also hides\n * the popup menu if the button is being hidden.\n * @param {boolean} visible Whether to show or hide the button.\n * @param {boolean=} opt_force If true, doesn't check whether the component\n *     already has the requested visibility, and doesn't dispatch any events.\n * @return {boolean} Whether the visibility was changed.\n * @override\n */\ngoog.ui.MenuButton.prototype.setVisible = function(visible, opt_force) {\n  var visibilityChanged =\n      goog.ui.MenuButton.superClass_.setVisible.call(this, visible, opt_force);\n  if (visibilityChanged && !this.isVisible()) {\n    this.setOpen(false);\n  }\n  return visibilityChanged;\n};\n\n\n/**\n * Enables/disables the menu button based on the value of the argument, and\n * updates its CSS styling.  Also hides the popup menu if the button is being\n * disabled.\n * @param {boolean} enable Whether to enable or disable the button.\n * @override\n */\ngoog.ui.MenuButton.prototype.setEnabled = function(enable) {\n  goog.ui.MenuButton.superClass_.setEnabled.call(this, enable);\n  if (!this.isEnabled()) {\n    this.setOpen(false);\n  }\n};\n\n\n// TODO(nicksantos): AlignMenuToStart and ScrollOnOverflow and PositionElement\n// should all be deprecated, in favor of people setting their own\n// AnchoredPosition with the parameters they need. Right now, we try\n// to be backwards-compatible as possible, but this is incomplete because\n// the APIs are non-orthogonal.\n\n\n/**\n * @return {boolean} Whether the menu is aligned to the start of the button\n *     (left if the render direction is left-to-right, right if the render\n *     direction is right-to-left).\n */\ngoog.ui.MenuButton.prototype.isAlignMenuToStart = function() {\n  var corner = this.menuPosition_.corner;\n  return corner == goog.positioning.Corner.BOTTOM_START ||\n      corner == goog.positioning.Corner.TOP_START;\n};\n\n\n/**\n * Sets whether the menu is aligned to the start or the end of the button.\n * @param {boolean} alignToStart Whether the menu is to be aligned to the start\n *     of the button (left if the render direction is left-to-right, right if\n *     the render direction is right-to-left).\n */\ngoog.ui.MenuButton.prototype.setAlignMenuToStart = function(alignToStart) {\n  this.menuPosition_.corner = alignToStart ?\n      goog.positioning.Corner.BOTTOM_START :\n      goog.positioning.Corner.BOTTOM_END;\n};\n\n\n/**\n * Sets whether the menu should scroll when it's too big to fix vertically on\n * the screen.  The css of the menu element should have overflow set to auto.\n * Note: Adding or removing items while the menu is open will not work correctly\n * if scrollOnOverflow is on.\n * @param {boolean} scrollOnOverflow Whether the menu should scroll when too big\n *     to fit on the screen.  If false, adjust logic will be used to try and\n *     reposition the menu to fit.\n */\ngoog.ui.MenuButton.prototype.setScrollOnOverflow = function(scrollOnOverflow) {\n  if (this.menuPosition_.setLastResortOverflow) {\n    var overflowX = goog.positioning.Overflow.ADJUST_X;\n    var overflowY = scrollOnOverflow ? goog.positioning.Overflow.RESIZE_HEIGHT :\n                                       goog.positioning.Overflow.ADJUST_Y;\n    this.menuPosition_.setLastResortOverflow(overflowX | overflowY);\n  }\n};\n\n\n/**\n * @return {boolean} Whether the menu will scroll when it's to big to fit\n *     vertically on the screen.\n */\ngoog.ui.MenuButton.prototype.isScrollOnOverflow = function() {\n  return this.menuPosition_.getLastResortOverflow &&\n      !!(this.menuPosition_.getLastResortOverflow() &\n         goog.positioning.Overflow.RESIZE_HEIGHT);\n};\n\n\n/**\n * @return {boolean} Whether the attached menu is focusable.\n */\ngoog.ui.MenuButton.prototype.isFocusablePopupMenu = function() {\n  return this.isFocusablePopupMenu_;\n};\n\n\n/**\n * Sets whether the attached popup menu is focusable.  If the popup menu is\n * focusable, it may steal keyboard focus from the menu button, so the button\n * will not hide the menu on blur.\n * @param {boolean} focusable Whether the attached menu is focusable.\n */\ngoog.ui.MenuButton.prototype.setFocusablePopupMenu = function(focusable) {\n  // TODO(attila):  The menu itself should advertise whether it is focusable.\n  this.isFocusablePopupMenu_ = focusable;\n};\n\n\n/**\n * Sets whether to render the menu as a sibling element of the button.\n * Normally, the menu is a child of document.body.  This option is useful if\n * you need the menu to inherit styles from a common parent element, or if you\n * otherwise need it to share a parent element for desired event handling.  One\n * example of the latter is if the parent is in a goog.ui.Popup, to ensure that\n * clicks on the menu are considered being within the popup.\n * @param {boolean} renderMenuAsSibling Whether we render the menu at the end\n *     of the dom or as a sibling to the button/label that renders the drop\n *     down.\n */\ngoog.ui.MenuButton.prototype.setRenderMenuAsSibling = function(\n    renderMenuAsSibling) {\n  this.renderMenuAsSibling_ = renderMenuAsSibling;\n};\n\n\n/**\n * Reveals the menu and hooks up menu-specific event handling.\n * @deprecated Use {@link #setOpen} instead.\n */\ngoog.ui.MenuButton.prototype.showMenu = function() {\n  this.setOpen(true);\n};\n\n\n/**\n * Hides the menu and cleans up menu-specific event handling.\n * @deprecated Use {@link #setOpen} instead.\n */\ngoog.ui.MenuButton.prototype.hideMenu = function() {\n  this.setOpen(false);\n};\n\n\n/**\n * Opens or closes the attached popup menu.\n * @param {boolean} open Whether to open or close the menu.\n * @param {goog.events.Event=} opt_e Event that caused the menu to be opened.\n * @override\n */\ngoog.ui.MenuButton.prototype.setOpen = function(open, opt_e) {\n  goog.ui.MenuButton.superClass_.setOpen.call(this, open);\n  if (this.menu_ && this.hasState(goog.ui.Component.State.OPENED) == open) {\n    if (open) {\n      if (!this.menu_.isInDocument()) {\n        if (this.renderMenuAsSibling_) {\n          // When we render the menu in the same parent as this button, we\n          // prefer to add it immediately after the button. This way, the screen\n          // readers will go to the menu on the very next element after the\n          // button is read.\n          var nextElementSibling =\n              goog.dom.getNextElementSibling(this.getElement());\n          if (nextElementSibling) {\n            this.menu_.renderBefore(nextElementSibling);\n          } else {\n            this.menu_.render(\n                /** @type {Element} */ (this.getElement().parentNode));\n          }\n        } else {\n          this.menu_.render();\n        }\n      }\n      this.viewportBox_ =\n          goog.style.getVisibleRectForElement(this.getElement());\n      this.buttonRect_ = goog.style.getBounds(this.getElement());\n      this.positionMenu();\n\n      // As per aria spec, highlight the first element in the menu when\n      // keyboarding up or down. Thus, the first menu item will be announced\n      // for screen reader users. If selectFirstOnEnterOrSpace is set, do this\n      // for enter or space as well.\n      var isEnterOrSpace =\n          !!opt_e && (opt_e.keyCode == goog.events.KeyCodes.ENTER ||\n                      opt_e.keyCode == goog.events.KeyCodes.SPACE);\n      var isUpOrDown = !!opt_e && (opt_e.keyCode == goog.events.KeyCodes.DOWN ||\n                                   opt_e.keyCode == goog.events.KeyCodes.UP);\n      var focus =\n          isUpOrDown || (isEnterOrSpace && this.selectFirstOnEnterOrSpace_);\n      if (focus) {\n        this.menu_.highlightFirst();\n      } else {\n        this.menu_.setHighlightedIndex(-1);\n      }\n    } else {\n      this.setActive(false);\n      this.menu_.setMouseButtonPressed(false);\n\n      var element = this.getElement();\n      // Clear any remaining a11y state.\n      if (element) {\n        goog.a11y.aria.setState(\n            element, goog.a11y.aria.State.ACTIVEDESCENDANT, '');\n        goog.a11y.aria.setState(element, goog.a11y.aria.State.OWNS, '');\n      }\n\n      // Clear any sizes that might have been stored.\n      if (this.originalSize_ != null) {\n        this.originalSize_ = undefined;\n        var elem = this.menu_.getElement();\n        if (elem) {\n          goog.style.setSize(elem, '', '');\n        }\n      }\n    }\n    this.menu_.setVisible(open, false, opt_e);\n    // In Pivot Tables the menu button somehow gets disposed of during the\n    // setVisible call, causing attachPopupListeners_ to fail.\n    // TODO(user): Debug what happens.\n    if (!this.isDisposed()) {\n      this.attachPopupListeners_(open);\n    }\n  }\n  if (this.menu_ && this.menu_.getElement()) {\n    // Remove the aria-hidden state on the menu element so that it won't be\n    // hidden to screen readers if it's inside a dialog (see b/17610491).\n    goog.a11y.aria.removeState(\n        this.menu_.getElementStrict(), goog.a11y.aria.State.HIDDEN);\n  }\n};\n\n\n/**\n * Resets the MenuButton's size.  This is useful for cases where items are added\n * or removed from the menu and scrollOnOverflow is on.  In those cases the\n * menu will not behave correctly and resize itself unless this is called\n * (usually followed by positionMenu()).\n */\ngoog.ui.MenuButton.prototype.invalidateMenuSize = function() {\n  this.originalSize_ = undefined;\n};\n\n\n/**\n * Positions the menu under the button.  May be called directly in cases when\n * the menu size is known to change.\n */\ngoog.ui.MenuButton.prototype.positionMenu = function() {\n  if (!this.menu_.isInDocument()) {\n    return;\n  }\n\n  var positionElement = this.positionElement_ || this.getElement();\n  var position = this.menuPosition_;\n  this.menuPosition_.element = positionElement;\n\n  var elem = this.menu_.getElement();\n  if (!this.menu_.isVisible()) {\n    elem.style.visibility = 'hidden';\n    goog.style.setElementShown(elem, true);\n  }\n\n  if (!this.originalSize_ && this.isScrollOnOverflow()) {\n    this.originalSize_ = goog.style.getSize(elem);\n  }\n  var popupCorner = goog.positioning.flipCornerVertical(position.corner);\n  position.reposition(elem, popupCorner, this.menuMargin_, this.originalSize_);\n\n  if (!this.menu_.isVisible()) {\n    goog.style.setElementShown(elem, false);\n    elem.style.visibility = 'visible';\n  }\n};\n\n\n/**\n * Periodically repositions the menu while it is visible.\n *\n * @param {goog.events.Event} e An event object.\n * @private\n */\ngoog.ui.MenuButton.prototype.onTick_ = function(e) {\n  // Call positionMenu() only if the button position or size was\n  // changed, or if the window's viewport was changed.\n  var currentButtonRect = goog.style.getBounds(this.getElement());\n  var currentViewport = goog.style.getVisibleRectForElement(this.getElement());\n  if (goog.math.Rect.equals(this.buttonRect_, currentButtonRect) &&\n      goog.math.Box.equals(this.viewportBox_, currentViewport)) {\n    return;\n  }\n\n  // Reduction in the viewport width (e.g. due to increasing the zoom) can\n  // cause the menu to get squashed against the right edge, distorting its\n  // shape. When we move the menu back where it belongs, we risk using the\n  // distorted size, causing mispositioning. To be safe, start by moving the\n  // menu to the top left to let it reassume its true shape.\n  if (this.menu_.isInDocument() && currentViewport && this.viewportBox_ &&\n      (currentViewport.getWidth() < this.viewportBox_.getWidth())) {\n    var elem = this.menu_.getElement();\n    if (!this.menu_.isVisible()) {\n      elem.style.visibility = 'hidden';\n      goog.style.setElementShown(elem, true);\n    }\n\n    goog.style.setPosition(elem, new goog.math.Coordinate(0, 0));\n  }\n\n  this.buttonRect_ = currentButtonRect;\n  this.viewportBox_ = currentViewport;\n  this.positionMenu();\n};\n\n\n/**\n * Attaches or detaches menu event listeners to/from the given menu.\n * Called each time a menu is attached to or detached from the button.\n * @param {goog.ui.Menu} menu Menu on which to listen for events.\n * @param {boolean} attach Whether to attach or detach event listeners.\n * @private\n */\ngoog.ui.MenuButton.prototype.attachMenuEventListeners_ = function(\n    menu, attach) {\n  var handler = this.getHandler();\n  var method = attach ? handler.listen : handler.unlisten;\n\n  // Handle events dispatched by menu items.\n  method.call(\n      handler, menu, goog.ui.Component.EventType.ACTION, this.handleMenuAction);\n  method.call(\n      handler, menu, goog.ui.Component.EventType.CLOSE, this.handleCloseItem);\n  method.call(\n      handler, menu, goog.ui.Component.EventType.HIGHLIGHT,\n      this.handleHighlightItem);\n  method.call(\n      handler, menu, goog.ui.Component.EventType.UNHIGHLIGHT,\n      this.handleUnHighlightItem);\n};\n\n\n/**\n * Attaches or detaches a keydown event listener to/from the given element.\n * Called each time the button enters or exits the document.\n * @param {boolean} attach Whether to attach or detach the event listener.\n * @private\n */\ngoog.ui.MenuButton.prototype.attachKeyDownEventListener_ = function(attach) {\n  var handler = this.getHandler();\n  var method = attach ? handler.listen : handler.unlisten;\n\n  // Handle keydown events dispatched by the button.\n  method.call(\n      handler, this.getElement(), goog.events.EventType.KEYDOWN,\n      this.handleKeyDownEvent_);\n};\n\n\n/**\n * Handles `HIGHLIGHT` events dispatched by the attached menu.\n * @param {goog.events.Event} e Highlight event to handle.\n */\ngoog.ui.MenuButton.prototype.handleHighlightItem = function(e) {\n  var targetEl = e.target.getElement();\n  if (targetEl) {\n    this.setAriaActiveDescendant_(targetEl);\n  }\n};\n\n\n/**\n * Handles `KEYDOWN` events dispatched by the button element. When the\n * button is focusable and the menu is present and visible, prevents the event\n * from propagating since the desired behavior is only to close the menu.\n * @param {goog.events.Event} e KeyDown event to handle.\n * @private\n */\ngoog.ui.MenuButton.prototype.handleKeyDownEvent_ = function(e) {\n  if (this.isSupportedState(goog.ui.Component.State.FOCUSED) &&\n      this.getKeyEventTarget() && this.menu_ && this.menu_.isVisible()) {\n    e.stopPropagation();\n  }\n};\n\n\n/**\n * Handles UNHIGHLIGHT events dispatched by the associated menu.\n * @param {goog.events.Event} e Unhighlight event to handle.\n */\ngoog.ui.MenuButton.prototype.handleUnHighlightItem = function(e) {\n  if (!this.menu_.getHighlighted()) {\n    var element = this.getElement();\n    goog.asserts.assert(element, 'The menu button DOM element cannot be null.');\n    goog.a11y.aria.setState(element, goog.a11y.aria.State.ACTIVEDESCENDANT, '');\n    goog.a11y.aria.setState(element, goog.a11y.aria.State.OWNS, '');\n  }\n};\n\n\n/**\n * Handles `CLOSE` events dispatched by the associated menu.\n * @param {goog.events.Event} e Close event to handle.\n */\ngoog.ui.MenuButton.prototype.handleCloseItem = function(e) {\n  // When a submenu is closed by pressing left arrow, no highlight event is\n  // dispatched because the newly focused item was already highlighted, so this\n  // scenario is handled by listening for the submenu close event instead.\n  if (this.isOpen() && e.target instanceof goog.ui.MenuItem) {\n    var menuItem = /** @type {!goog.ui.MenuItem} */ (e.target);\n    var menuItemEl = menuItem.getElement();\n    if (menuItem.isVisible() && menuItem.isHighlighted() &&\n        menuItemEl != null) {\n      this.setAriaActiveDescendant_(menuItemEl);\n    }\n  }\n};\n\n\n/**\n * Updates the aria-activedescendant attribute to the given target element.\n * @param {!Element} targetEl The target element.\n * @private\n */\ngoog.ui.MenuButton.prototype.setAriaActiveDescendant_ = function(targetEl) {\n  var element = this.getElement();\n  goog.asserts.assert(element, 'The menu button DOM element cannot be null.');\n\n  // If target element has an activedescendant, then set this control's\n  // activedescendant to that, otherwise set it to the target element. This is\n  // a workaround for some screen readers which do not handle\n  // aria-activedescendant redirection properly.\n  var targetActiveDescendant = goog.a11y.aria.getActiveDescendant(targetEl);\n  var activeDescendant = targetActiveDescendant || targetEl;\n\n  if (!activeDescendant.id) {\n    // Create an id if there isn't one already.\n    var idGenerator = goog.ui.IdGenerator.getInstance();\n    activeDescendant.id = idGenerator.getNextUniqueId();\n  }\n\n  goog.a11y.aria.setActiveDescendant(element, activeDescendant);\n  goog.a11y.aria.setState(\n      element, goog.a11y.aria.State.OWNS, activeDescendant.id);\n};\n\n\n/**\n * Attaches or detaches event listeners depending on whether the popup menu\n * is being shown or hidden.  Starts listening for document mousedown events\n * and for menu blur events when the menu is shown, and stops listening for\n * these events when it is hidden.  Called from {@link #setOpen}.\n * @param {boolean} attach Whether to attach or detach event listeners.\n * @private\n */\ngoog.ui.MenuButton.prototype.attachPopupListeners_ = function(attach) {\n  var handler = this.getHandler();\n  var method = attach ? handler.listen : handler.unlisten;\n\n  // Listen for document mousedown events in the capture phase, because\n  // the target may stop propagation of the event in the bubble phase.\n  method.call(\n      handler, this.getDomHelper().getDocument(),\n      goog.events.EventType.MOUSEDOWN, this.handleDocumentMouseDown, true);\n\n  // Only listen for blur events dispatched by the menu if it is focusable.\n  if (this.isFocusablePopupMenu()) {\n    method.call(\n        handler, /** @type {!goog.events.EventTarget} */ (this.menu_),\n        goog.ui.Component.EventType.BLUR, this.handleMenuBlur);\n  }\n\n  method.call(handler, this.timer_, goog.Timer.TICK, this.onTick_);\n  if (attach) {\n    this.timer_.start();\n  } else {\n    this.timer_.stop();\n  }\n};\n\n\n// Register a decorator factory function for goog.ui.MenuButtons.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.MenuButtonRenderer.CSS_CLASS, function() {\n      // MenuButton defaults to using MenuButtonRenderer.\n      return new goog.ui.MenuButton(null);\n    });\n","^?",1579837703000,"^@",["^A",["^1J","^14","^1@","~$goog.Timer","~$goog.userAgent.product","~$goog.a11y.aria","~$goog.ui.SubMenu","~$goog.positioning","^1B","~$goog.events.KeyHandler","^3","^28","^29","^18","^34","~$goog.math.Box","^1C","^22","^36","~$goog.positioning.Overflow","^2O","~$goog.a11y.aria.State","~$goog.ui.MenuItem","^2Y","^38","~$goog.positioning.MenuAnchoredPosition","~$goog.ui.Button","~$goog.events.KeyCodes"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/menubutton.js"],"^S",["^A",["^27"]],"^1",true,"^2",["^3","^3U","^3W","^41","^1J","^14","^1C","^45","^3Z","^3[","^22","^2O","^3Y","^1@","^43","^40","^2Y","^44","^1B","^38","^36","^28","^42","^34","^3X","^29","^18","^3V"]],["^ ","^7",[1579837703000],"^8","goog.i18n.bidi.js","^9",["^:","goog/i18n/bidi.js"],"^;","goog/i18n/bidi.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility functions for supporting Bidi issues.\n */\n\n\n/**\n * Namespace for bidi supporting functions.\n */\ngoog.provide('goog.i18n.bidi');\ngoog.provide('goog.i18n.bidi.Dir');\ngoog.provide('goog.i18n.bidi.DirectionalString');\ngoog.provide('goog.i18n.bidi.Format');\n\n\n/**\n * @define {boolean} FORCE_RTL forces the {@link goog.i18n.bidi.IS_RTL} constant\n * to say that the current locale is a RTL locale.  This should only be used\n * if you want to override the default behavior for deciding whether the\n * current locale is RTL or not.\n *\n * {@see goog.i18n.bidi.IS_RTL}\n */\ngoog.i18n.bidi.FORCE_RTL = goog.define('goog.i18n.bidi.FORCE_RTL', false);\n\n\n/**\n * Constant that defines whether or not the current locale is a RTL locale.\n * If {@link goog.i18n.bidi.FORCE_RTL} is not true, this constant will default\n * to check that {@link goog.LOCALE} is one of a few major RTL locales.\n *\n * <p>This is designed to be a maximally efficient compile-time constant. For\n * example, for the default goog.LOCALE, compiling\n * \"if (goog.i18n.bidi.IS_RTL) alert('rtl') else {}\" should produce no code. It\n * is this design consideration that limits the implementation to only\n * supporting a few major RTL locales, as opposed to the broader repertoire of\n * something like goog.i18n.bidi.isRtlLanguage.\n *\n * <p>Since this constant refers to the directionality of the locale, it is up\n * to the caller to determine if this constant should also be used for the\n * direction of the UI.\n *\n * {@see goog.LOCALE}\n *\n * @type {boolean}\n *\n * TODO(user): write a test that checks that this is a compile-time constant.\n */\n// LINT.IfChange\ngoog.i18n.bidi.IS_RTL =\n    goog.i18n.bidi.FORCE_RTL ||\n    ((goog.LOCALE.substring(0, 2).toLowerCase() == 'ar' ||\n      goog.LOCALE.substring(0, 2).toLowerCase() == 'fa' ||\n      goog.LOCALE.substring(0, 2).toLowerCase() == 'he' ||\n      goog.LOCALE.substring(0, 2).toLowerCase() == 'iw' ||\n      goog.LOCALE.substring(0, 2).toLowerCase() == 'ps' ||\n      goog.LOCALE.substring(0, 2).toLowerCase() == 'sd' ||\n      goog.LOCALE.substring(0, 2).toLowerCase() == 'ug' ||\n      goog.LOCALE.substring(0, 2).toLowerCase() == 'ur' ||\n      goog.LOCALE.substring(0, 2).toLowerCase() == 'yi') &&\n     (goog.LOCALE.length == 2 || goog.LOCALE.substring(2, 3) == '-' ||\n      goog.LOCALE.substring(2, 3) == '_')) ||\n    (  // Specific to CKB (Central Kurdish)\n        goog.LOCALE.length >= 3 &&\n        goog.LOCALE.substring(0, 3).toLowerCase() == 'ckb' &&\n        (goog.LOCALE.length == 3 || goog.LOCALE.substring(3, 4) == '-' ||\n         goog.LOCALE.substring(3, 4) == '_')) ||\n    (  // 2 letter language codes with RTL scripts\n        goog.LOCALE.length >= 7 &&\n        ((goog.LOCALE.substring(2, 3) == '-' ||\n          goog.LOCALE.substring(2, 3) == '_') &&\n         (goog.LOCALE.substring(3, 7).toLowerCase() == 'adlm' ||\n          goog.LOCALE.substring(3, 7).toLowerCase() == 'arab' ||\n          goog.LOCALE.substring(3, 7).toLowerCase() == 'hebr' ||\n          goog.LOCALE.substring(3, 7).toLowerCase() == 'nkoo' ||\n          goog.LOCALE.substring(3, 7).toLowerCase() == 'rohg' ||\n          goog.LOCALE.substring(3, 7).toLowerCase() == 'thaa'))) ||\n    (  // 3 letter languages codes with RTL scripts\n        goog.LOCALE.length >= 8 &&\n        ((goog.LOCALE.substring(3, 4) == '-' ||\n          goog.LOCALE.substring(3, 4) == '_') &&\n         (goog.LOCALE.substring(4, 8).toLowerCase() == 'adlm' ||\n          goog.LOCALE.substring(4, 8).toLowerCase() == 'arab' ||\n          goog.LOCALE.substring(4, 8).toLowerCase() == 'hebr' ||\n          goog.LOCALE.substring(4, 8).toLowerCase() == 'nkoo' ||\n          goog.LOCALE.substring(4, 8).toLowerCase() == 'rohg' ||\n          goog.LOCALE.substring(4, 8).toLowerCase() == 'thaa')));\n//    closure/RtlLocalesTest.java)\n\n// TODO(b/77919903): Add additional scripts and languages that are RTL,\n// e.g., mende, samaritan, etc.\n\n\n/**\n * Unicode formatting characters and directionality string constants.\n * @enum {string}\n */\ngoog.i18n.bidi.Format = {\n  /** Unicode \"Left-To-Right Embedding\" (LRE) character. */\n  LRE: '\\u202A',\n  /** Unicode \"Right-To-Left Embedding\" (RLE) character. */\n  RLE: '\\u202B',\n  /** Unicode \"Pop Directional Formatting\" (PDF) character. */\n  PDF: '\\u202C',\n  /** Unicode \"Left-To-Right Mark\" (LRM) character. */\n  LRM: '\\u200E',\n  /** Unicode \"Right-To-Left Mark\" (RLM) character. */\n  RLM: '\\u200F'\n};\n\n\n/**\n * Directionality enum.\n * @enum {number}\n */\ngoog.i18n.bidi.Dir = {\n  /**\n   * Left-to-right.\n   */\n  LTR: 1,\n\n  /**\n   * Right-to-left.\n   */\n  RTL: -1,\n\n  /**\n   * Neither left-to-right nor right-to-left.\n   */\n  NEUTRAL: 0\n};\n\n\n/**\n * 'right' string constant.\n * @type {string}\n */\ngoog.i18n.bidi.RIGHT = 'right';\n\n\n/**\n * 'left' string constant.\n * @type {string}\n */\ngoog.i18n.bidi.LEFT = 'left';\n\n\n/**\n * 'left' if locale is RTL, 'right' if not.\n * @type {string}\n */\ngoog.i18n.bidi.I18N_RIGHT =\n    goog.i18n.bidi.IS_RTL ? goog.i18n.bidi.LEFT : goog.i18n.bidi.RIGHT;\n\n\n/**\n * 'right' if locale is RTL, 'left' if not.\n * @type {string}\n */\ngoog.i18n.bidi.I18N_LEFT =\n    goog.i18n.bidi.IS_RTL ? goog.i18n.bidi.RIGHT : goog.i18n.bidi.LEFT;\n\n\n/**\n * Convert a directionality given in various formats to a goog.i18n.bidi.Dir\n * constant. Useful for interaction with different standards of directionality\n * representation.\n *\n * @param {goog.i18n.bidi.Dir|number|boolean|null} givenDir Directionality given\n *     in one of the following formats:\n *     1. A goog.i18n.bidi.Dir constant.\n *     2. A number (positive = LTR, negative = RTL, 0 = neutral).\n *     3. A boolean (true = RTL, false = LTR).\n *     4. A null for unknown directionality.\n * @param {boolean=} opt_noNeutral Whether a givenDir of zero or\n *     goog.i18n.bidi.Dir.NEUTRAL should be treated as null, i.e. unknown, in\n *     order to preserve legacy behavior.\n * @return {?goog.i18n.bidi.Dir} A goog.i18n.bidi.Dir constant matching the\n *     given directionality. If given null, returns null (i.e. unknown).\n */\ngoog.i18n.bidi.toDir = function(givenDir, opt_noNeutral) {\n  if (typeof givenDir == 'number') {\n    // This includes the non-null goog.i18n.bidi.Dir case.\n    return givenDir > 0 ?\n        goog.i18n.bidi.Dir.LTR :\n        givenDir < 0 ? goog.i18n.bidi.Dir.RTL :\n                       opt_noNeutral ? null : goog.i18n.bidi.Dir.NEUTRAL;\n  } else if (givenDir == null) {\n    return null;\n  } else {\n    // Must be typeof givenDir == 'boolean'.\n    return givenDir ? goog.i18n.bidi.Dir.RTL : goog.i18n.bidi.Dir.LTR;\n  }\n};\n\n\n/**\n * A practical pattern to identify strong LTR character in the BMP.\n * This pattern is not theoretically correct according to the Unicode\n * standard. It is simplified for performance and small code size.\n * It also partially supports LTR scripts beyond U+FFFF by including\n * UTF-16 high surrogate values corresponding to mostly L-class code\n * point ranges.\n * However, low surrogate values and private-use regions are not included\n * in this RegEx.\n * @type {string}\n * @private\n */\ngoog.i18n.bidi.ltrChars_ =\n    'A-Za-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02B8\\u0300-\\u0590\\u0900-\\u1FFF' +\n    '\\u200E\\u2C00-\\uD801\\uD804-\\uD839\\uD83C-\\uDBFF' +\n    '\\uF900-\\uFB1C\\uFE00-\\uFE6F\\uFEFD-\\uFFFF';\n\n/**\n * A practical pattern to identify strong RTL character. This pattern is not\n * theoretically correct according to the Unicode standard. It is simplified\n * for performance and small code size.\n * It also partially supports RTL scripts beyond U+FFFF by including\n * UTF-16 high surrogate values corresponding to mostly R- or AL-class\n * code point ranges.\n * However, low surrogate values and private-use regions are not included\n * in this RegEx.\n * @type {string}\n * @private\n */\ngoog.i18n.bidi.rtlChars_ =\n    '\\u0591-\\u06EF\\u06FA-\\u08FF\\u200F\\uD802-\\uD803\\uD83A-\\uD83B' +\n    '\\uFB1D-\\uFDFF\\uFE70-\\uFEFC';\n\n/**\n * Simplified regular expression for an HTML tag (opening or closing) or an HTML\n * escape. We might want to skip over such expressions when estimating the text\n * directionality.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.htmlSkipReg_ = /<[^>]*>|&[^;]+;/g;\n\n\n/**\n * Returns the input text with spaces instead of HTML tags or HTML escapes, if\n * opt_isStripNeeded is true. Else returns the input as is.\n * Useful for text directionality estimation.\n * Note: the function should not be used in other contexts; it is not 100%\n * correct, but rather a good-enough implementation for directionality\n * estimation purposes.\n * @param {string} str The given string.\n * @param {boolean=} opt_isStripNeeded Whether to perform the stripping.\n *     Default: false (to retain consistency with calling functions).\n * @return {string} The given string cleaned of HTML tags / escapes.\n * @private\n */\ngoog.i18n.bidi.stripHtmlIfNeeded_ = function(str, opt_isStripNeeded) {\n  return opt_isStripNeeded ? str.replace(goog.i18n.bidi.htmlSkipReg_, '') : str;\n};\n\n\n/**\n * Regular expression to check for RTL characters, BMP and high surrogate.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.rtlCharReg_ = new RegExp('[' + goog.i18n.bidi.rtlChars_ + ']');\n\n\n/**\n * Regular expression to check for LTR characters.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.ltrCharReg_ = new RegExp('[' + goog.i18n.bidi.ltrChars_ + ']');\n\n\n/**\n * Test whether the given string has any RTL characters in it.\n * @param {string} str The given string that need to be tested.\n * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.\n *     Default: false.\n * @return {boolean} Whether the string contains RTL characters.\n */\ngoog.i18n.bidi.hasAnyRtl = function(str, opt_isHtml) {\n  return goog.i18n.bidi.rtlCharReg_.test(\n      goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));\n};\n\n\n/**\n * Test whether the given string has any RTL characters in it.\n * @param {string} str The given string that need to be tested.\n * @return {boolean} Whether the string contains RTL characters.\n * @deprecated Use hasAnyRtl.\n */\ngoog.i18n.bidi.hasRtlChar = goog.i18n.bidi.hasAnyRtl;\n\n\n/**\n * Test whether the given string has any LTR characters in it.\n * @param {string} str The given string that need to be tested.\n * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.\n *     Default: false.\n * @return {boolean} Whether the string contains LTR characters.\n */\ngoog.i18n.bidi.hasAnyLtr = function(str, opt_isHtml) {\n  return goog.i18n.bidi.ltrCharReg_.test(\n      goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));\n};\n\n\n/**\n * Regular expression pattern to check if the first character in the string\n * is LTR.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.ltrRe_ = new RegExp('^[' + goog.i18n.bidi.ltrChars_ + ']');\n\n\n/**\n * Regular expression pattern to check if the first character in the string\n * is RTL.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.rtlRe_ = new RegExp('^[' + goog.i18n.bidi.rtlChars_ + ']');\n\n\n/**\n * Check if the first character in the string is RTL or not.\n * @param {string} str The given string that need to be tested.\n * @return {boolean} Whether the first character in str is an RTL char.\n */\ngoog.i18n.bidi.isRtlChar = function(str) {\n  return goog.i18n.bidi.rtlRe_.test(str);\n};\n\n\n/**\n * Check if the first character in the string is LTR or not.\n * @param {string} str The given string that need to be tested.\n * @return {boolean} Whether the first character in str is an LTR char.\n */\ngoog.i18n.bidi.isLtrChar = function(str) {\n  return goog.i18n.bidi.ltrRe_.test(str);\n};\n\n\n/**\n * Check if the first character in the string is neutral or not.\n * @param {string} str The given string that need to be tested.\n * @return {boolean} Whether the first character in str is a neutral char.\n */\ngoog.i18n.bidi.isNeutralChar = function(str) {\n  return !goog.i18n.bidi.isLtrChar(str) && !goog.i18n.bidi.isRtlChar(str);\n};\n\n\n/**\n * Regular expressions to check if a piece of text is of LTR directionality\n * on first character with strong directionality.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.ltrDirCheckRe_ = new RegExp(\n    '^[^' + goog.i18n.bidi.rtlChars_ + ']*[' + goog.i18n.bidi.ltrChars_ + ']');\n\n\n/**\n * Regular expressions to check if a piece of text is of RTL directionality\n * on first character with strong directionality.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.rtlDirCheckRe_ = new RegExp(\n    '^[^' + goog.i18n.bidi.ltrChars_ + ']*[' + goog.i18n.bidi.rtlChars_ + ']');\n\n\n/**\n * Check whether the first strongly directional character (if any) is RTL.\n * @param {string} str String being checked.\n * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.\n *     Default: false.\n * @return {boolean} Whether RTL directionality is detected using the first\n *     strongly-directional character method.\n */\ngoog.i18n.bidi.startsWithRtl = function(str, opt_isHtml) {\n  return goog.i18n.bidi.rtlDirCheckRe_.test(\n      goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));\n};\n\n\n/**\n * Check whether the first strongly directional character (if any) is RTL.\n * @param {string} str String being checked.\n * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.\n *     Default: false.\n * @return {boolean} Whether RTL directionality is detected using the first\n *     strongly-directional character method.\n * @deprecated Use startsWithRtl.\n */\ngoog.i18n.bidi.isRtlText = goog.i18n.bidi.startsWithRtl;\n\n\n/**\n * Check whether the first strongly directional character (if any) is LTR.\n * @param {string} str String being checked.\n * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.\n *     Default: false.\n * @return {boolean} Whether LTR directionality is detected using the first\n *     strongly-directional character method.\n */\ngoog.i18n.bidi.startsWithLtr = function(str, opt_isHtml) {\n  return goog.i18n.bidi.ltrDirCheckRe_.test(\n      goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));\n};\n\n\n/**\n * Check whether the first strongly directional character (if any) is LTR.\n * @param {string} str String being checked.\n * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.\n *     Default: false.\n * @return {boolean} Whether LTR directionality is detected using the first\n *     strongly-directional character method.\n * @deprecated Use startsWithLtr.\n */\ngoog.i18n.bidi.isLtrText = goog.i18n.bidi.startsWithLtr;\n\n\n/**\n * Regular expression to check if a string looks like something that must\n * always be LTR even in RTL text, e.g. a URL. When estimating the\n * directionality of text containing these, we treat these as weakly LTR,\n * like numbers.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.isRequiredLtrRe_ = /^http:\\/\\/.*/;\n\n\n/**\n * Check whether the input string either contains no strongly directional\n * characters or looks like a url.\n * @param {string} str String being checked.\n * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.\n *     Default: false.\n * @return {boolean} Whether neutral directionality is detected.\n */\ngoog.i18n.bidi.isNeutralText = function(str, opt_isHtml) {\n  str = goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml);\n  return goog.i18n.bidi.isRequiredLtrRe_.test(str) ||\n      !goog.i18n.bidi.hasAnyLtr(str) && !goog.i18n.bidi.hasAnyRtl(str);\n};\n\n\n/**\n * Regular expressions to check if the last strongly-directional character in a\n * piece of text is LTR.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.ltrExitDirCheckRe_ = new RegExp(\n    '[' + goog.i18n.bidi.ltrChars_ + ']' +\n    '[^' + goog.i18n.bidi.rtlChars_ + ']*$');\n\n\n/**\n * Regular expressions to check if the last strongly-directional character in a\n * piece of text is RTL.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.rtlExitDirCheckRe_ = new RegExp(\n    '[' + goog.i18n.bidi.rtlChars_ + ']' +\n    '[^' + goog.i18n.bidi.ltrChars_ + ']*$');\n\n\n/**\n * Check if the exit directionality a piece of text is LTR, i.e. if the last\n * strongly-directional character in the string is LTR.\n * @param {string} str String being checked.\n * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.\n *     Default: false.\n * @return {boolean} Whether LTR exit directionality was detected.\n */\ngoog.i18n.bidi.endsWithLtr = function(str, opt_isHtml) {\n  return goog.i18n.bidi.ltrExitDirCheckRe_.test(\n      goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));\n};\n\n\n/**\n * Check if the exit directionality a piece of text is LTR, i.e. if the last\n * strongly-directional character in the string is LTR.\n * @param {string} str String being checked.\n * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.\n *     Default: false.\n * @return {boolean} Whether LTR exit directionality was detected.\n * @deprecated Use endsWithLtr.\n */\ngoog.i18n.bidi.isLtrExitText = goog.i18n.bidi.endsWithLtr;\n\n\n/**\n * Check if the exit directionality a piece of text is RTL, i.e. if the last\n * strongly-directional character in the string is RTL.\n * @param {string} str String being checked.\n * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.\n *     Default: false.\n * @return {boolean} Whether RTL exit directionality was detected.\n */\ngoog.i18n.bidi.endsWithRtl = function(str, opt_isHtml) {\n  return goog.i18n.bidi.rtlExitDirCheckRe_.test(\n      goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml));\n};\n\n\n/**\n * Check if the exit directionality a piece of text is RTL, i.e. if the last\n * strongly-directional character in the string is RTL.\n * @param {string} str String being checked.\n * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.\n *     Default: false.\n * @return {boolean} Whether RTL exit directionality was detected.\n * @deprecated Use endsWithRtl.\n */\ngoog.i18n.bidi.isRtlExitText = goog.i18n.bidi.endsWithRtl;\n\n\n/**\n * A regular expression for matching right-to-left language codes.\n * See {@link #isRtlLanguage} for the design.\n * Note that not all RTL scripts are included.\n * @type {!RegExp}\n * @private\n */\ngoog.i18n.bidi.rtlLocalesRe_ = new RegExp(\n    '^(ar|ckb|dv|he|iw|fa|nqo|ps|sd|ug|ur|yi|' +\n        '.*[-_](Adlm|Arab|Hebr|Nkoo|Rohg|Thaa))' +\n        '(?!.*[-_](Latn|Cyrl)($|-|_))($|-|_)',\n    'i');\n\n\n/**\n * Check if a BCP 47 / III language code indicates an RTL language, i.e. either:\n * - a language code explicitly specifying one of the right-to-left scripts,\n *   e.g. \"az-Arab\", or<p>\n * - a language code specifying one of the languages normally written in a\n *   right-to-left script, e.g. \"fa\" (Farsi), except ones explicitly specifying\n *   Latin or Cyrillic script (which are the usual LTR alternatives).<p>\n * The list of right-to-left scripts appears in the 100-199 range in\n * http://www.unicode.org/iso15924/iso15924-num.html, of which Arabic and\n * Hebrew are by far the most widely used. We also recognize Thaana, and N'Ko,\n * which also have significant modern usage. Adlam and Rohingya\n * scripts are now included since they can be expected to be used in the\n * future. The rest (Syriac, Samaritan, Mandaic, etc.) seem to have extremely\n * limited or no modern usage and are not recognized to save on code size. The\n * languages usually written in a right-to-left script are taken as those with\n * Suppress-Script: Hebr|Arab|Thaa|Nkoo|Adlm|Rohg in\n * http://www.iana.org/assignments/language-subtag-registry,\n * as well as Central (or Sorani) Kurdish (ckb), Sindhi (sd) and Uyghur (ug).\n * Other subtags of the language code, e.g. regions like EG (Egypt), are\n * ignored.\n * @param {string} lang BCP 47 (a.k.a III) language code.\n * @return {boolean} Whether the language code is an RTL language.\n */\ngoog.i18n.bidi.isRtlLanguage = function(lang) {\n  return goog.i18n.bidi.rtlLocalesRe_.test(lang);\n};\n\n\n/**\n * Regular expression for bracket guard replacement in text.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.bracketGuardTextRe_ =\n    /(\\(.*?\\)+)|(\\[.*?\\]+)|(\\{.*?\\}+)|(<.*?>+)/g;\n\n\n/**\n * Apply bracket guard using LRM and RLM. This is to address the problem of\n * messy bracket display frequently happens in RTL layout.\n * This function works for plain text, not for HTML. In HTML, the opening\n * bracket might be in a different context than the closing bracket (such as\n * an attribute value).\n * @param {string} s The string that need to be processed.\n * @param {boolean=} opt_isRtlContext specifies default direction (usually\n *     direction of the UI).\n * @return {string} The processed string, with all bracket guarded.\n */\ngoog.i18n.bidi.guardBracketInText = function(s, opt_isRtlContext) {\n  const useRtl = opt_isRtlContext === undefined ? goog.i18n.bidi.hasAnyRtl(s) :\n                                                  opt_isRtlContext;\n  const mark = useRtl ? goog.i18n.bidi.Format.RLM : goog.i18n.bidi.Format.LRM;\n  return s.replace(goog.i18n.bidi.bracketGuardTextRe_, mark + '$&' + mark);\n};\n\n\n/**\n * Enforce the html snippet in RTL directionality regardless of overall context.\n * If the html piece was enclosed by tag, dir will be applied to existing\n * tag, otherwise a span tag will be added as wrapper. For this reason, if\n * html snippet starts with a tag, this tag must enclose the whole piece. If\n * the tag already has a dir specified, this new one will override existing\n * one in behavior (tested on FF and IE).\n * @param {string} html The string that need to be processed.\n * @return {string} The processed string, with directionality enforced to RTL.\n */\ngoog.i18n.bidi.enforceRtlInHtml = function(html) {\n  if (html.charAt(0) == '<') {\n    return html.replace(/<\\w+/, '$& dir=rtl');\n  }\n  // '\\n' is important for FF so that it won't incorrectly merge span groups\n  return '\\n<span dir=rtl>' + html + '</span>';\n};\n\n\n/**\n * Enforce RTL on both end of the given text piece using unicode BiDi formatting\n * characters RLE and PDF.\n * @param {string} text The piece of text that need to be wrapped.\n * @return {string} The wrapped string after process.\n */\ngoog.i18n.bidi.enforceRtlInText = function(text) {\n  return goog.i18n.bidi.Format.RLE + text + goog.i18n.bidi.Format.PDF;\n};\n\n\n/**\n * Enforce the html snippet in RTL directionality regardless or overall context.\n * If the html piece was enclosed by tag, dir will be applied to existing\n * tag, otherwise a span tag will be added as wrapper. For this reason, if\n * html snippet starts with a tag, this tag must enclose the whole piece. If\n * the tag already has a dir specified, this new one will override existing\n * one in behavior (tested on FF and IE).\n * @param {string} html The string that need to be processed.\n * @return {string} The processed string, with directionality enforced to RTL.\n */\ngoog.i18n.bidi.enforceLtrInHtml = function(html) {\n  if (html.charAt(0) == '<') {\n    return html.replace(/<\\w+/, '$& dir=ltr');\n  }\n  // '\\n' is important for FF so that it won't incorrectly merge span groups\n  return '\\n<span dir=ltr>' + html + '</span>';\n};\n\n\n/**\n * Enforce LTR on both end of the given text piece using unicode BiDi formatting\n * characters LRE and PDF.\n * @param {string} text The piece of text that need to be wrapped.\n * @return {string} The wrapped string after process.\n */\ngoog.i18n.bidi.enforceLtrInText = function(text) {\n  return goog.i18n.bidi.Format.LRE + text + goog.i18n.bidi.Format.PDF;\n};\n\n\n/**\n * Regular expression to find dimensions such as \"padding: .3 0.4ex 5px 6;\"\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.dimensionsRe_ =\n    /:\\s*([.\\d][.\\w]*)\\s+([.\\d][.\\w]*)\\s+([.\\d][.\\w]*)\\s+([.\\d][.\\w]*)/g;\n\n\n/**\n * Regular expression for left.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.leftRe_ = /left/gi;\n\n\n/**\n * Regular expression for right.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.rightRe_ = /right/gi;\n\n\n/**\n * Placeholder regular expression for swapping.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.tempRe_ = /%%%%/g;\n\n\n/**\n * Swap location parameters and 'left'/'right' in CSS specification. The\n * processed string will be suited for RTL layout. Though this function can\n * cover most cases, there are always exceptions. It is suggested to put\n * those exceptions in separate group of CSS string.\n * @param {string} cssStr CSS spefication string.\n * @return {string} Processed CSS specification string.\n */\ngoog.i18n.bidi.mirrorCSS = function(cssStr) {\n  return cssStr\n      .\n      // reverse dimensions\n      replace(goog.i18n.bidi.dimensionsRe_, ':$1 $4 $3 $2')\n      .replace(goog.i18n.bidi.leftRe_, '%%%%')\n      .  // swap left and right\n      replace(goog.i18n.bidi.rightRe_, goog.i18n.bidi.LEFT)\n      .replace(goog.i18n.bidi.tempRe_, goog.i18n.bidi.RIGHT);\n};\n\n\n/**\n * Regular expression for hebrew double quote substitution, finding quote\n * directly after hebrew characters.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.doubleQuoteSubstituteRe_ = /([\\u0591-\\u05f2])\"/g;\n\n\n/**\n * Regular expression for hebrew single quote substitution, finding quote\n * directly after hebrew characters.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.singleQuoteSubstituteRe_ = /([\\u0591-\\u05f2])'/g;\n\n\n/**\n * Replace the double and single quote directly after a Hebrew character with\n * GERESH and GERSHAYIM. In such case, most likely that's user intention.\n * @param {string} str String that need to be processed.\n * @return {string} Processed string with double/single quote replaced.\n */\ngoog.i18n.bidi.normalizeHebrewQuote = function(str) {\n  return str.replace(goog.i18n.bidi.doubleQuoteSubstituteRe_, '$1\\u05f4')\n      .replace(goog.i18n.bidi.singleQuoteSubstituteRe_, '$1\\u05f3');\n};\n\n\n/**\n * Regular expression to split a string into \"words\" for directionality\n * estimation based on relative word counts.\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.wordSeparatorRe_ = /\\s+/;\n\n\n/**\n * Regular expression to check if a string contains any numerals. Used to\n * differentiate between completely neutral strings and those containing\n * numbers, which are weakly LTR.\n *\n * Native Arabic digits (\\u0660 - \\u0669) are not included because although they\n * do flow left-to-right inside a number, this is the case even if the  overall\n * directionality is RTL, and a mathematical expression using these digits is\n * supposed to flow right-to-left overall, including unary plus and minus\n * appearing to the right of a number, and this does depend on the overall\n * directionality being RTL. The digits used in Farsi (\\u06F0 - \\u06F9), on the\n * other hand, are included, since Farsi math (including unary plus and minus)\n * does flow left-to-right.\n * TODO: Consider other systems of digits, e.g., Adlam.\n *\n * @type {RegExp}\n * @private\n */\ngoog.i18n.bidi.hasNumeralsRe_ = /[\\d\\u06f0-\\u06f9]/;\n\n\n/**\n * This constant controls threshold of RTL directionality.\n * @type {number}\n * @private\n */\ngoog.i18n.bidi.rtlDetectionThreshold_ = 0.40;\n\n\n/**\n * Estimates the directionality of a string based on relative word counts.\n * If the number of RTL words is above a certain percentage of the total number\n * of strongly directional words, returns RTL.\n * Otherwise, if any words are strongly or weakly LTR, returns LTR.\n * Otherwise, returns UNKNOWN, which is used to mean \"neutral\".\n * Numbers are counted as weakly LTR.\n * @param {string} str The string to be checked.\n * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.\n *     Default: false.\n * @return {goog.i18n.bidi.Dir} Estimated overall directionality of `str`.\n */\ngoog.i18n.bidi.estimateDirection = function(str, opt_isHtml) {\n  let rtlCount = 0;\n  let totalCount = 0;\n  let hasWeaklyLtr = false;\n  const tokens = goog.i18n.bidi.stripHtmlIfNeeded_(str, opt_isHtml)\n                     .split(goog.i18n.bidi.wordSeparatorRe_);\n  for (let i = 0; i < tokens.length; i++) {\n    const token = tokens[i];\n    if (goog.i18n.bidi.startsWithRtl(token)) {\n      rtlCount++;\n      totalCount++;\n    } else if (goog.i18n.bidi.isRequiredLtrRe_.test(token)) {\n      hasWeaklyLtr = true;\n    } else if (goog.i18n.bidi.hasAnyLtr(token)) {\n      totalCount++;\n    } else if (goog.i18n.bidi.hasNumeralsRe_.test(token)) {\n      hasWeaklyLtr = true;\n    }\n  }\n\n  return totalCount == 0 ?\n      (hasWeaklyLtr ? goog.i18n.bidi.Dir.LTR : goog.i18n.bidi.Dir.NEUTRAL) :\n      (rtlCount / totalCount > goog.i18n.bidi.rtlDetectionThreshold_ ?\n           goog.i18n.bidi.Dir.RTL :\n           goog.i18n.bidi.Dir.LTR);\n};\n\n\n/**\n * Check the directionality of a piece of text, return true if the piece of\n * text should be laid out in RTL direction.\n * @param {string} str The piece of text that need to be detected.\n * @param {boolean=} opt_isHtml Whether str is HTML / HTML-escaped.\n *     Default: false.\n * @return {boolean} Whether this piece of text should be laid out in RTL.\n */\ngoog.i18n.bidi.detectRtlDirectionality = function(str, opt_isHtml) {\n  return goog.i18n.bidi.estimateDirection(str, opt_isHtml) ==\n      goog.i18n.bidi.Dir.RTL;\n};\n\n\n/**\n * Sets text input element's directionality and text alignment based on a\n * given directionality. Does nothing if the given directionality is unknown or\n * neutral.\n * @param {Element} element Input field element to set directionality to.\n * @param {goog.i18n.bidi.Dir|number|boolean|null} dir Desired directionality,\n *     given in one of the following formats:\n *     1. A goog.i18n.bidi.Dir constant.\n *     2. A number (positive = LRT, negative = RTL, 0 = neutral).\n *     3. A boolean (true = RTL, false = LTR).\n *     4. A null for unknown directionality.\n */\ngoog.i18n.bidi.setElementDirAndAlign = function(element, dir) {\n  if (element) {\n    const htmlElement = /** @type {!HTMLElement} */ (element);\n    dir = goog.i18n.bidi.toDir(dir);\n    if (dir) {\n      htmlElement.style.textAlign = dir == goog.i18n.bidi.Dir.RTL ?\n          goog.i18n.bidi.RIGHT :\n          goog.i18n.bidi.LEFT;\n      htmlElement.dir = dir == goog.i18n.bidi.Dir.RTL ? 'rtl' : 'ltr';\n    }\n  }\n};\n\n\n/**\n * Sets element dir based on estimated directionality of the given text.\n * @param {!Element} element\n * @param {string} text\n */\ngoog.i18n.bidi.setElementDirByTextDirectionality = function(element, text) {\n  const htmlElement = /** @type {!HTMLElement} */ (element);\n  switch (goog.i18n.bidi.estimateDirection(text)) {\n    case (goog.i18n.bidi.Dir.LTR):\n      htmlElement.dir = 'ltr';\n      break;\n    case (goog.i18n.bidi.Dir.RTL):\n      htmlElement.dir = 'rtl';\n      break;\n    default:\n      // Default for no direction, inherit from document.\n      htmlElement.removeAttribute('dir');\n  }\n};\n\n\n\n/**\n * Strings that have an (optional) known direction.\n *\n * Implementations of this interface are string-like objects that carry an\n * attached direction, if known.\n * @interface\n */\ngoog.i18n.bidi.DirectionalString = function() {};\n\n\n/**\n * Interface marker of the DirectionalString interface.\n *\n * This property can be used to determine at runtime whether or not an object\n * implements this interface.  All implementations of this interface set this\n * property to `true`.\n * @type {boolean}\n */\ngoog.i18n.bidi.DirectionalString.prototype\n    .implementsGoogI18nBidiDirectionalString;\n\n\n/**\n * Retrieves this object's known direction (if any).\n * @return {?goog.i18n.bidi.Dir} The known direction. Null if unknown.\n */\ngoog.i18n.bidi.DirectionalString.prototype.getDirection;\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/bidi.js"],"^S",["^A",["~$goog.i18n.bidi.Format","^3H","~$goog.i18n.bidi","~$goog.i18n.bidi.DirectionalString"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.testing.performancetimer.js","^9",["^:","goog/testing/performancetimer.js"],"^;","goog/testing/performancetimer.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Performance timer.\n *\n * {@see goog.testing.benchmark} for an easy way to use this functionality.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.setTestOnly('goog.testing.PerformanceTimer');\ngoog.provide('goog.testing.PerformanceTimer');\ngoog.provide('goog.testing.PerformanceTimer.Task');\n\ngoog.require('goog.array');\ngoog.require('goog.async.Deferred');\ngoog.require('goog.math');\n\n\n\n/**\n * Creates a performance timer that runs test functions a number of times to\n * generate timing samples, and provides performance statistics (minimum,\n * maximum, average, and standard deviation).\n * @param {number=} opt_numSamples Number of times to run the test function;\n *     defaults to 10.\n * @param {number=} opt_timeoutInterval Number of milliseconds after which the\n *     test is to be aborted; defaults to 5 seconds (5,000ms).\n * @constructor\n */\ngoog.testing.PerformanceTimer = function(opt_numSamples, opt_timeoutInterval) {\n  /**\n   * Number of times the test function is to be run; defaults to 10.\n   * @private {number}\n   */\n  this.numSamples_ = opt_numSamples || 10;\n\n  /**\n   * Number of milliseconds after which the test is to be aborted; defaults to\n   * 5,000ms.\n   * @private {number}\n   */\n  this.timeoutInterval_ = opt_timeoutInterval || 5000;\n\n  /**\n   * Whether to discard outliers (i.e. the smallest and the largest values)\n   * from the sample set before computing statistics.  Defaults to false.\n   * @private {boolean}\n   */\n  this.discardOutliers_ = false;\n};\n\n\n/**\n * A function whose subsequent calls differ in milliseconds. Used to calculate\n * the start and stop checkpoint times for runs. Note that high performance\n * timers do not necessarily return the current time in milliseconds.\n * @return {number}\n * @private\n */\ngoog.testing.PerformanceTimer.now_ = function() {\n  // goog.now is used in DEBUG mode to make the class easier to test.\n  return !goog.DEBUG && window.performance && window.performance.now ?\n      window.performance.now() :\n      goog.now();\n};\n\n\n/**\n * @return {number} The number of times the test function will be run.\n */\ngoog.testing.PerformanceTimer.prototype.getNumSamples = function() {\n  return this.numSamples_;\n};\n\n\n/**\n * Sets the number of times the test function will be run.\n * @param {number} numSamples Number of times to run the test function.\n */\ngoog.testing.PerformanceTimer.prototype.setNumSamples = function(numSamples) {\n  this.numSamples_ = numSamples;\n};\n\n\n/**\n * @return {number} The number of milliseconds after which the test times out.\n */\ngoog.testing.PerformanceTimer.prototype.getTimeoutInterval = function() {\n  return this.timeoutInterval_;\n};\n\n\n/**\n * Sets the number of milliseconds after which the test times out.\n * @param {number} timeoutInterval Timeout interval in ms.\n */\ngoog.testing.PerformanceTimer.prototype.setTimeoutInterval = function(\n    timeoutInterval) {\n  this.timeoutInterval_ = timeoutInterval;\n};\n\n\n/**\n * Sets whether to ignore the smallest and the largest values when computing\n * stats.\n * @param {boolean} discard Whether to discard outlier values.\n */\ngoog.testing.PerformanceTimer.prototype.setDiscardOutliers = function(discard) {\n  this.discardOutliers_ = discard;\n};\n\n\n/**\n * @return {boolean} Whether outlier values are discarded prior to computing\n *     stats.\n */\ngoog.testing.PerformanceTimer.prototype.isDiscardOutliers = function() {\n  return this.discardOutliers_;\n};\n\n\n/**\n * Executes the test function the required number of times (or until the\n * test run exceeds the timeout interval, whichever comes first).  Returns\n * an object containing the following:\n * <pre>\n *   {\n *     'average': average execution time (ms)\n *     'count': number of executions (may be fewer than expected due to timeout)\n *     'maximum': longest execution time (ms)\n *     'minimum': shortest execution time (ms)\n *     'standardDeviation': sample standard deviation (ms)\n *     'total': total execution time (ms)\n *   }\n * </pre>\n *\n * @param {Function} testFn Test function whose performance is to\n *     be measured.\n * @return {!Object} Object containing performance stats.\n */\ngoog.testing.PerformanceTimer.prototype.run = function(testFn) {\n  return this.runTask(\n      new goog.testing.PerformanceTimer.Task(\n          /** @type {goog.testing.PerformanceTimer.TestFunction} */ (testFn)));\n};\n\n\n/**\n * Executes the test function of the specified task as described in\n * `run`. In addition, if specified, the set up and tear down functions of\n * the task are invoked before and after each invocation of the test function.\n * @see goog.testing.PerformanceTimer#run\n * @param {goog.testing.PerformanceTimer.Task} task A task describing the test\n *     function to invoke.\n * @return {!Object} Object containing performance stats.\n */\ngoog.testing.PerformanceTimer.prototype.runTask = function(task) {\n  var samples = [];\n  var testStart = goog.testing.PerformanceTimer.now_();\n  var totalRunTime = 0;\n\n  var testFn = task.getTest();\n  var setUpFn = task.getSetUp();\n  var tearDownFn = task.getTearDown();\n\n  for (var i = 0; i < this.numSamples_ && totalRunTime <= this.timeoutInterval_;\n       i++) {\n    setUpFn();\n    var sampleStart = goog.testing.PerformanceTimer.now_();\n    testFn();\n    var sampleEnd = goog.testing.PerformanceTimer.now_();\n    tearDownFn();\n    samples[i] = sampleEnd - sampleStart;\n    totalRunTime = sampleEnd - testStart;\n  }\n\n  return this.finishTask_(samples);\n};\n\n\n/**\n * Finishes the run of a task by creating a result object from samples, in the\n * format described in `run`.\n * @see goog.testing.PerformanceTimer#run\n * @param {!Array<number>} samples The samples to analyze.\n * @return {!Object} Object containing performance stats.\n * @private\n */\ngoog.testing.PerformanceTimer.prototype.finishTask_ = function(samples) {\n  if (this.discardOutliers_ && samples.length > 2) {\n    goog.array.remove(samples, Math.min.apply(null, samples));\n    goog.array.remove(samples, Math.max.apply(null, samples));\n  }\n\n  return goog.testing.PerformanceTimer.createResults(samples);\n};\n\n\n/**\n * Executes the test function of the specified task asynchronously. The test\n * function is expected to take a callback as input and has to call it to signal\n * that it's done. In addition, if specified, the setUp and tearDown functions\n * of the task are invoked before and after each invocation of the test\n * function. Note that setUp/tearDown functions take a callback as input and\n * must call this callback when they are done.\n * @see goog.testing.PerformanceTimer#run\n * @param {goog.testing.PerformanceTimer.Task} task A task describing the test\n *     function to invoke.\n * @return {!goog.async.Deferred} The deferred result, eventually an object\n *     containing performance stats.\n */\ngoog.testing.PerformanceTimer.prototype.runAsyncTask = function(task) {\n  var samples = [];\n  var testStart = goog.testing.PerformanceTimer.now_();\n\n  var testFn = task.getTest();\n  var setUpFn = task.getSetUp();\n  var tearDownFn = task.getTearDown();\n\n  // Note that this uses a separate code path from runTask() because\n  // implementing runTask() in terms of runAsyncTask() could easily cause\n  // a stack overflow if there are many iterations.\n  var result = new goog.async.Deferred();\n  this.runAsyncTaskSample_(\n      testFn, setUpFn, tearDownFn, result, samples, testStart);\n  return result;\n};\n\n\n/**\n * Runs a task once, waits for the test function to complete asynchronously\n * and starts another run if not enough samples have been collected. Otherwise\n * finishes this task.\n * @param {goog.testing.PerformanceTimer.TestFunction} testFn The test function.\n * @param {goog.testing.PerformanceTimer.TestFunction} setUpFn The set up\n *     function that will be called once before the test function is run.\n * @param {goog.testing.PerformanceTimer.TestFunction} tearDownFn The set up\n *     function that will be called once after the test function completed.\n * @param {!goog.async.Deferred} result The deferred result, eventually an\n *     object containing performance stats.\n * @param {!Array<number>} samples The time samples from all runs of the test\n *     function so far.\n * @param {number} testStart The timestamp when the first sample was started.\n * @private\n */\ngoog.testing.PerformanceTimer.prototype.runAsyncTaskSample_ = function(\n    testFn, setUpFn, tearDownFn, result, samples, testStart) {\n  var timer = this;\n  timer.handleOptionalDeferred_(setUpFn, function() {\n    var sampleStart = goog.testing.PerformanceTimer.now_();\n    timer.handleOptionalDeferred_(testFn, function() {\n      var sampleEnd = goog.testing.PerformanceTimer.now_();\n      timer.handleOptionalDeferred_(tearDownFn, function() {\n        samples.push(sampleEnd - sampleStart);\n        var totalRunTime = sampleEnd - testStart;\n        if (samples.length < timer.numSamples_ &&\n            totalRunTime <= timer.timeoutInterval_) {\n          timer.runAsyncTaskSample_(\n              testFn, setUpFn, tearDownFn, result, samples, testStart);\n        } else {\n          result.callback(timer.finishTask_(samples));\n        }\n      });\n    });\n  });\n};\n\n\n/**\n * Return the median of the samples.\n * @param {!Array<number>} samples\n * @return {number}\n */\ngoog.testing.PerformanceTimer.median = function(samples) {\n  samples.sort(function(a, b) {\n    return a - b;\n  });\n  let half = Math.floor(samples.length / 2);\n  if (samples.length % 2) {\n    return samples[half];\n  } else {\n    return (samples[half - 1] + samples[half]) / 2.0;\n  }\n};\n\n\n/**\n * Execute a function that optionally returns a deferred object and continue\n * with the given continuation function only once the deferred object has a\n * result.\n * @param {goog.testing.PerformanceTimer.TestFunction} deferredFactory The\n *     function that optionally returns a deferred object.\n * @param {function()} continuationFunction The function that should be called\n *     after the optional deferred has a result.\n * @private\n */\ngoog.testing.PerformanceTimer.prototype.handleOptionalDeferred_ = function(\n    deferredFactory, continuationFunction) {\n  var deferred = deferredFactory();\n  if (deferred) {\n    deferred.addCallback(continuationFunction);\n  } else {\n    continuationFunction();\n  }\n};\n\n\n/**\n * Creates a performance timer results object by analyzing a given array of\n * sample timings.\n * @param {!Array<number>} samples The samples to analyze.\n * @return {!Object} Object containing performance stats.\n */\ngoog.testing.PerformanceTimer.createResults = function(samples) {\n  return {\n    'average': goog.math.average.apply(null, samples),\n    'count': samples.length,\n    'median': goog.testing.PerformanceTimer.median(samples),\n    'maximum': Math.max.apply(null, samples),\n    'minimum': Math.min.apply(null, samples),\n    'standardDeviation': goog.math.standardDeviation.apply(null, samples),\n    'total': goog.math.sum.apply(null, samples)\n  };\n};\n\n\n/**\n * A test function whose performance should be measured or a setUp/tearDown\n * function. It may optionally return a deferred object. If it does so, the\n * test harness will assume the function is asynchronous and it must signal\n * that it's done by setting an (empty) result on the deferred object. If the\n * function doesn't return anything, the test harness will assume it's\n * synchronous.\n * @typedef {function():(goog.async.Deferred|undefined)}\n */\ngoog.testing.PerformanceTimer.TestFunction;\n\n\n\n/**\n * A task for the performance timer to measure. Callers can specify optional\n * setUp and tearDown methods to control state before and after each run of the\n * test function.\n * @param {goog.testing.PerformanceTimer.TestFunction} test Test function whose\n *     performance is to be measured.\n * @constructor\n * @final\n */\ngoog.testing.PerformanceTimer.Task = function(test) {\n  /**\n   * The test function to time.\n   * @type {goog.testing.PerformanceTimer.TestFunction}\n   * @private\n   */\n  this.test_ = test;\n};\n\n\n/**\n * An optional set up function to run before each invocation of the test\n * function.\n * @type {goog.testing.PerformanceTimer.TestFunction}\n * @private\n */\ngoog.testing.PerformanceTimer.Task.prototype.setUp_ = goog.nullFunction;\n\n\n/**\n * An optional tear down function to run after each invocation of the test\n * function.\n * @type {goog.testing.PerformanceTimer.TestFunction}\n * @private\n */\ngoog.testing.PerformanceTimer.Task.prototype.tearDown_ = goog.nullFunction;\n\n\n/**\n * @return {goog.testing.PerformanceTimer.TestFunction} The test function to\n *     time.\n */\ngoog.testing.PerformanceTimer.Task.prototype.getTest = function() {\n  return this.test_;\n};\n\n\n/**\n * Specifies a set up function to be invoked before each invocation of the test\n * function.\n * @param {goog.testing.PerformanceTimer.TestFunction} setUp The set up\n *     function.\n * @return {!goog.testing.PerformanceTimer.Task} This task.\n */\ngoog.testing.PerformanceTimer.Task.prototype.withSetUp = function(setUp) {\n  this.setUp_ = setUp;\n  return this;\n};\n\n\n/**\n * @return {goog.testing.PerformanceTimer.TestFunction} The set up function or\n *     the default no-op function if none was specified.\n */\ngoog.testing.PerformanceTimer.Task.prototype.getSetUp = function() {\n  return this.setUp_;\n};\n\n\n/**\n * Specifies a tear down function to be invoked after each invocation of the\n * test function.\n * @param {goog.testing.PerformanceTimer.TestFunction} tearDown The tear down\n *     function.\n * @return {!goog.testing.PerformanceTimer.Task} This task.\n */\ngoog.testing.PerformanceTimer.Task.prototype.withTearDown = function(tearDown) {\n  this.tearDown_ = tearDown;\n  return this;\n};\n\n\n/**\n * @return {goog.testing.PerformanceTimer.TestFunction} The tear down function\n *     or the default no-op function if none was specified.\n */\ngoog.testing.PerformanceTimer.Task.prototype.getTearDown = function() {\n  return this.tearDown_;\n};\n","^?",1579837703000,"^@",["^A",["^3","^[","^3P","^1S"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/performancetimer.js"],"^S",["^A",["~$goog.testing.PerformanceTimer.Task","~$goog.testing.PerformanceTimer"]],"^1",true,"^2",["^3","^1S","^3P","^["]],["^ ","^7",[1579837703000],"^8","goog.testing.editor.dom.js","^9",["^:","goog/testing/editor/dom.js"],"^;","goog/testing/editor/dom.js","^<","^=","^>","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Testing utilities for editor specific DOM related tests.\n *\n */\n\ngoog.setTestOnly('goog.testing.editor.dom');\ngoog.provide('goog.testing.editor.dom');\n\ngoog.require('goog.dom.AbstractRange');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagIterator');\ngoog.require('goog.dom.TagWalkType');\ngoog.require('goog.iter');\ngoog.require('goog.string');\ngoog.require('goog.testing.asserts');\n\n\n/**\n * Returns the previous (in document order) node from the given node that is a\n * non-empty text node, or null if none is found or opt_stopAt is not an\n * ancestor of node. Note that if the given node has children, the search will\n * start from the end tag of the node, meaning all its descendants will be\n * included in the search, unless opt_skipDescendants is true.\n * @param {Node} node Node to start searching from.\n * @param {Node=} opt_stopAt Node to stop searching at (search will be\n *     restricted to this node's subtree), defaults to the body of the document\n *     containing node.\n * @param {boolean=} opt_skipDescendants Whether to skip searching the given\n *     node's descentants.\n * @return {Text} The previous (in document order) node from the given node\n *     that is a non-empty text node, or null if none is found.\n */\ngoog.testing.editor.dom.getPreviousNonEmptyTextNode = function(\n    node, opt_stopAt, opt_skipDescendants) {\n  return goog.testing.editor.dom.getPreviousNextNonEmptyTextNodeHelper_(\n      node, opt_stopAt, opt_skipDescendants, true);\n};\n\n\n/**\n * Returns the next (in document order) node from the given node that is a\n * non-empty text node, or null if none is found or opt_stopAt is not an\n * ancestor of node. Note that if the given node has children, the search will\n * start from the start tag of the node, meaning all its descendants will be\n * included in the search, unless opt_skipDescendants is true.\n * @param {Node} node Node to start searching from.\n * @param {Node=} opt_stopAt Node to stop searching at (search will be\n *     restricted to this node's subtree), defaults to the body of the document\n *     containing node.\n * @param {boolean=} opt_skipDescendants Whether to skip searching the given\n *     node's descentants.\n * @return {Text} The next (in document order) node from the given node that\n *     is a non-empty text node, or null if none is found or opt_stopAt is not\n *     an ancestor of node.\n */\ngoog.testing.editor.dom.getNextNonEmptyTextNode = function(\n    node, opt_stopAt, opt_skipDescendants) {\n  return goog.testing.editor.dom.getPreviousNextNonEmptyTextNodeHelper_(\n      node, opt_stopAt, opt_skipDescendants, false);\n};\n\n\n/**\n * Helper that returns the previous or next (in document order) node from the\n * given node that is a non-empty text node, or null if none is found or\n * opt_stopAt is not an ancestor of node. Note that if the given node has\n * children, the search will start from the end or start tag of the node\n * (depending on whether it's searching for the previous or next node), meaning\n * all its descendants will be included in the search, unless\n * opt_skipDescendants is true.\n * @param {Node} node Node to start searching from.\n * @param {Node=} opt_stopAt Node to stop searching at (search will be\n *     restricted to this node's subtree), defaults to the body of the document\n *     containing node.\n * @param {boolean=} opt_skipDescendants Whether to skip searching the given\n *   node's descentants.\n * @param {boolean=} opt_isPrevious Whether to search for the previous non-empty\n *     text node instead of the next one.\n * @return {Text} The next (in document order) node from the given node that\n *     is a non-empty text node, or null if none is found or opt_stopAt is not\n *     an ancestor of node.\n * @private\n */\ngoog.testing.editor.dom.getPreviousNextNonEmptyTextNodeHelper_ = function(\n    node, opt_stopAt, opt_skipDescendants, opt_isPrevious) {\n  opt_stopAt = opt_stopAt || node.ownerDocument.body;\n  // Initializing the iterator to iterate over the children of opt_stopAt\n  // makes it stop only when it finishes iterating through all of that\n  // node's children, even though we will start at a different node and exit\n  // that starting node's subtree in the process.\n  var iter = new goog.dom.TagIterator(opt_stopAt, opt_isPrevious);\n\n  // TODO(user): Move this logic to a new method in TagIterator such as\n  // skipToNode().\n  // Then we set the iterator to start at the given start node, not opt_stopAt.\n  var walkType;  // Let TagIterator set the initial walk type by default.\n  var depth = goog.testing.editor.dom.getRelativeDepth_(node, opt_stopAt);\n  if (depth == -1) {\n    return null;  // Fail because opt_stopAt is not an ancestor of node.\n  }\n  if (node.nodeType == goog.dom.NodeType.ELEMENT) {\n    if (opt_skipDescendants) {\n      // Specifically set the initial walk type so that we skip the descendant\n      // subtree by starting at the start if going backwards or at the end if\n      // going forwards.\n      walkType = opt_isPrevious ? goog.dom.TagWalkType.START_TAG :\n                                  goog.dom.TagWalkType.END_TAG;\n    } else {\n      // We're starting \"inside\" an element node so the depth needs to be one\n      // deeper than the node's actual depth. That's how TagIterator works!\n      depth++;\n    }\n  }\n  iter.setPosition(node, walkType, depth);\n\n  // Advance the iterator so it skips the start node.\n  try {\n    iter.next();\n  } catch (e) {\n    return null;  // It could have been a leaf node.\n  }\n  // Now just get the first non-empty text node the iterator finds.\n  var filter =\n      goog.iter.filter(iter, goog.testing.editor.dom.isNonEmptyTextNode_);\n  try {\n    return /** @type {Text} */ (filter.next());\n  } catch (e) {  // No next item is available so return null.\n    return null;\n  }\n};\n\n\n/**\n * Returns whether the given node is a non-empty text node.\n * @param {Node} node Node to be checked.\n * @return {boolean} Whether the given node is a non-empty text node.\n * @private\n */\ngoog.testing.editor.dom.isNonEmptyTextNode_ = function(node) {\n  if (node && node.nodeType == goog.dom.NodeType.TEXT) {\n    node = /** @type {!Text} */ (node);\n    return node.length > 0;\n  }\n\n  return false;\n};\n\n\n/**\n * Returns the depth of the given node relative to the given parent node, or -1\n * if the given node is not a descendant of the given parent node. E.g. if\n * node == parentNode returns 0, if node.parentNode == parentNode returns 1,\n * etc.\n * @param {Node} node Node whose depth to get.\n * @param {Node} parentNode Node relative to which the depth should be\n *     calculated.\n * @return {number} The depth of the given node relative to the given parent\n *     node, or -1 if the given node is not a descendant of the given parent\n *     node.\n * @private\n */\ngoog.testing.editor.dom.getRelativeDepth_ = function(node, parentNode) {\n  var depth = 0;\n  while (node) {\n    if (node == parentNode) {\n      return depth;\n    }\n    node = node.parentNode;\n    depth++;\n  }\n  return -1;\n};\n\n\n/**\n * Assert that the range is surrounded by the given strings. This is useful\n * because different browsers can place the range endpoints inside different\n * nodes even when visually the range looks the same. Also, there may be empty\n * text nodes in the way (again depending on the browser) making it difficult to\n * use assertRangeEquals.\n * @param {string} before String that should occur immediately before the start\n *     point of the range. If this is the empty string, assert will only succeed\n *     if there is no text before the start point of the range.\n * @param {string} after String that should occur immediately after the end\n *     point of the range. If this is the empty string, assert will only succeed\n *     if there is no text after the end point of the range.\n * @param {goog.dom.AbstractRange} range The range to be tested.\n * @param {Node=} opt_stopAt Node to stop searching at (search will be\n *     restricted to this node's subtree).\n */\ngoog.testing.editor.dom.assertRangeBetweenText = function(\n    before, after, range, opt_stopAt) {\n  var previousText =\n      goog.testing.editor.dom.getTextFollowingRange_(range, true, opt_stopAt);\n  if (before == '') {\n    assertNull(\n        'Expected nothing before range but found <' + previousText + '>',\n        previousText);\n  } else {\n    assertNotNull(\n        'Expected <' + before + '> before range but found nothing',\n        previousText);\n    assertTrue(\n        'Expected <' + before + '> before range but found <' + previousText +\n            '>',\n        goog.string.endsWith(\n            /** @type {string} */ (previousText), before));\n  }\n  var nextText =\n      goog.testing.editor.dom.getTextFollowingRange_(range, false, opt_stopAt);\n  if (after == '') {\n    assertNull(\n        'Expected nothing after range but found <' + nextText + '>', nextText);\n  } else {\n    assertNotNull(\n        'Expected <' + after + '> after range but found nothing', nextText);\n    assertTrue(\n        'Expected <' + after + '> after range but found <' + nextText + '>',\n        goog.string.startsWith(\n            /** @type {string} */ (nextText), after));\n  }\n};\n\n\n/**\n * Returns the text that follows the given range, where the term \"follows\" means\n * \"comes immediately before the start of the range\" if isBefore is true, and\n * \"comes immediately after the end of the range\" if isBefore is false, or null\n * if no non-empty text node is found.\n * @param {goog.dom.AbstractRange} range The range to search from.\n * @param {boolean} isBefore Whether to search before the range instead of\n *     after it.\n * @param {Node=} opt_stopAt Node to stop searching at (search will be\n *     restricted to this node's subtree).\n * @return {?string} The text that follows the given range, or null if no\n *     non-empty text node is found.\n * @private\n */\ngoog.testing.editor.dom.getTextFollowingRange_ = function(\n    range, isBefore, opt_stopAt) {\n  var followingTextNode;\n  var endpointNode = isBefore ? range.getStartNode() : range.getEndNode();\n  var endpointOffset = isBefore ? range.getStartOffset() : range.getEndOffset();\n  var getFollowingTextNode = isBefore ?\n      goog.testing.editor.dom.getPreviousNonEmptyTextNode :\n      goog.testing.editor.dom.getNextNonEmptyTextNode;\n\n  if (endpointNode.nodeType == goog.dom.NodeType.TEXT) {\n    // Range endpoint is in a text node.\n    var endText = endpointNode.nodeValue;\n    if (isBefore ? endpointOffset > 0 : endpointOffset < endText.length) {\n      // There is text in this node following the endpoint so return the portion\n      // that follows the endpoint.\n      return isBefore ? endText.substr(0, endpointOffset) :\n                        endText.substr(endpointOffset);\n    } else {\n      // There is no text following the endpoint so look for the follwing text\n      // node.\n      followingTextNode = getFollowingTextNode(endpointNode, opt_stopAt);\n      return followingTextNode && followingTextNode.nodeValue;\n    }\n  } else {\n    // Range endpoint is in an element node.\n    var numChildren = endpointNode.childNodes.length;\n    if (isBefore ? endpointOffset > 0 : endpointOffset < numChildren) {\n      // There is at least one child following the endpoint.\n      var followingChild =\n          endpointNode\n              .childNodes[isBefore ? endpointOffset - 1 : endpointOffset];\n      if (goog.testing.editor.dom.isNonEmptyTextNode_(followingChild)) {\n        // The following child has text so return that.\n        return followingChild.nodeValue;\n      } else {\n        // The following child has no text so look for the following text node.\n        followingTextNode = getFollowingTextNode(followingChild, opt_stopAt);\n        return followingTextNode && followingTextNode.nodeValue;\n      }\n    } else {\n      // There is no child following the endpoint, so search from the endpoint\n      // node, but don't search its children because they are not following the\n      // endpoint!\n      followingTextNode = getFollowingTextNode(endpointNode, opt_stopAt, true);\n      return followingTextNode && followingTextNode.nodeValue;\n    }\n  }\n};\n","^?",1579837703000,"^@",["^A",["^1W","~$goog.dom.AbstractRange","~$goog.dom.TagIterator","^1[","~$goog.testing.asserts","^16","^3=","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/editor/dom.js"],"^S",["^A",["~$goog.testing.editor.dom"]],"^1",true,"^2",["^3","^4;","^1[","^4<","^3=","^1W","^16","^4="]],["^ ","^7",[1579837703000],"^8","goog.storage.expiringstorage.js","^9",["^:","goog/storage/expiringstorage.js"],"^;","goog/storage/expiringstorage.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a convenient API for data persistence with expiration.\n *\n */\n\ngoog.provide('goog.storage.ExpiringStorage');\n\ngoog.forwardDeclare('goog.storage.mechanism.Mechanism');\ngoog.require('goog.storage.RichStorage');\n\n\n\n/**\n * Provides a storage with expiring keys.\n *\n * @param {!goog.storage.mechanism.Mechanism} mechanism The underlying\n *     storage mechanism.\n * @constructor\n * @struct\n * @extends {goog.storage.RichStorage}\n */\ngoog.storage.ExpiringStorage = function(mechanism) {\n  goog.storage.ExpiringStorage.base(this, 'constructor', mechanism);\n};\ngoog.inherits(goog.storage.ExpiringStorage, goog.storage.RichStorage);\n\n\n/**\n * Metadata key under which the expiration time is stored.\n *\n * @type {string}\n * @protected\n */\ngoog.storage.ExpiringStorage.EXPIRATION_TIME_KEY = 'expiration';\n\n\n/**\n * Metadata key under which the creation time is stored.\n *\n * @type {string}\n * @protected\n */\ngoog.storage.ExpiringStorage.CREATION_TIME_KEY = 'creation';\n\n\n/**\n * Returns the wrapper creation time.\n *\n * @param {!Object} wrapper The wrapper.\n * @return {number|undefined} Wrapper creation time.\n */\ngoog.storage.ExpiringStorage.getCreationTime = function(wrapper) {\n  return wrapper[goog.storage.ExpiringStorage.CREATION_TIME_KEY];\n};\n\n\n/**\n * Returns the wrapper expiration time.\n *\n * @param {!Object} wrapper The wrapper.\n * @return {number|undefined} Wrapper expiration time.\n */\ngoog.storage.ExpiringStorage.getExpirationTime = function(wrapper) {\n  return wrapper[goog.storage.ExpiringStorage.EXPIRATION_TIME_KEY];\n};\n\n\n/**\n * Checks if the data item has expired.\n *\n * @param {!Object} wrapper The wrapper.\n * @return {boolean} True if the item has expired.\n */\ngoog.storage.ExpiringStorage.isExpired = function(wrapper) {\n  var creation = goog.storage.ExpiringStorage.getCreationTime(wrapper);\n  var expiration = goog.storage.ExpiringStorage.getExpirationTime(wrapper);\n  return !!expiration && expiration < goog.now() ||\n      !!creation && creation > goog.now();\n};\n\n\n/**\n * Set an item in the storage.\n *\n * @param {string} key The key to set.\n * @param {*} value The value to serialize to a string and save.\n * @param {number=} opt_expiration The number of miliseconds since epoch\n *     (as in goog.now()) when the value is to expire. If the expiration\n *     time is not provided, the value will persist as long as possible.\n * @override\n */\ngoog.storage.ExpiringStorage.prototype.set = function(\n    key, value, opt_expiration) {\n  var wrapper = goog.storage.RichStorage.Wrapper.wrapIfNecessary(value);\n  if (wrapper) {\n    if (opt_expiration) {\n      if (opt_expiration < goog.now()) {\n        goog.storage.ExpiringStorage.prototype.remove.call(this, key);\n        return;\n      }\n      wrapper[goog.storage.ExpiringStorage.EXPIRATION_TIME_KEY] =\n          opt_expiration;\n    }\n    wrapper[goog.storage.ExpiringStorage.CREATION_TIME_KEY] = goog.now();\n  }\n  goog.storage.ExpiringStorage.base(this, 'set', key, wrapper);\n};\n\n\n/**\n * Get an item wrapper (the item and its metadata) from the storage.\n *\n * @param {string} key The key to get.\n * @param {boolean=} opt_expired If true, return expired wrappers as well.\n * @return {(!Object|undefined)} The wrapper, or undefined if not found.\n * @override\n */\ngoog.storage.ExpiringStorage.prototype.getWrapper = function(key, opt_expired) {\n  var wrapper = goog.storage.ExpiringStorage.base(this, 'getWrapper', key);\n  if (!wrapper) {\n    return undefined;\n  }\n  if (!opt_expired && goog.storage.ExpiringStorage.isExpired(wrapper)) {\n    goog.storage.ExpiringStorage.prototype.remove.call(this, key);\n    return undefined;\n  }\n  return wrapper;\n};\n","^?",1579837703000,"^@",["^A",["~$goog.storage.RichStorage","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/expiringstorage.js"],"^S",["^A",["~$goog.storage.ExpiringStorage"]],"^1",true,"^2",["^3","^4?"]],["^ ","^7",[1579837703000],"^8","goog.net.filedownloader.js","^9",["^:","goog/net/filedownloader.js"],"^;","goog/net/filedownloader.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A class for downloading remote files and storing them\n * locally using the HTML5 FileSystem API.\n *\n * The directory structure is of the form /HASH/URL/BASENAME:\n *\n * The HASH portion is a three-character slice of the hash of the URL. Since the\n * filesystem has a limit of about 5000 files per directory, this should divide\n * the downloads roughly evenly among about 5000 directories, thus allowing for\n * at most 5000^2 downloads.\n *\n * The URL portion is the (sanitized) full URL used for downloading the file.\n * This is used to ensure that each file ends up in a different location, even\n * if the HASH and BASENAME are the same.\n *\n * The BASENAME portion is the basename of the URL. It's used for the filename\n * proper so that the local filesystem: URL will be downloaded to a file with a\n * recognizable name.\n *\n */\n\ngoog.provide('goog.net.FileDownloader');\ngoog.provide('goog.net.FileDownloader.Error');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.asserts');\ngoog.require('goog.async.Deferred');\ngoog.require('goog.crypt.hash32');\ngoog.require('goog.debug.Error');\ngoog.require('goog.events');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.fs');\ngoog.require('goog.fs.DirectoryEntry');\ngoog.require('goog.fs.Error');\ngoog.require('goog.fs.FileSaver');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.XhrIo');\ngoog.require('goog.net.XhrIoPool');\ngoog.require('goog.object');\n\n\n\n/**\n * A class for downloading remote files and storing them locally using the\n * HTML5 filesystem API.\n *\n * @param {!goog.fs.DirectoryEntry} dir The directory in which the downloaded\n *     files are stored. This directory should be solely managed by\n *     FileDownloader.\n * @param {goog.net.XhrIoPool=} opt_pool The pool of XhrIo objects to use for\n *     downloading files.\n * @constructor\n * @extends {goog.Disposable}\n * @final\n */\ngoog.net.FileDownloader = function(dir, opt_pool) {\n  goog.net.FileDownloader.base(this, 'constructor');\n\n  /**\n   * The directory in which the downloaded files are stored.\n   * @type {!goog.fs.DirectoryEntry}\n   * @private\n   */\n  this.dir_ = dir;\n\n  /**\n   * The pool of XHRs to use for capturing.\n   * @type {!goog.net.XhrIoPool}\n   * @private\n   */\n  this.pool_ = opt_pool || new goog.net.XhrIoPool();\n\n  /**\n   * A map from URLs to active downloads running for those URLs.\n   * @type {!Object<!goog.net.FileDownloader.Download_>}\n   * @private\n   */\n  this.downloads_ = {};\n\n  /**\n   * The handler for URL capturing events.\n   * @type {!goog.events.EventHandler<!goog.net.FileDownloader>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n};\ngoog.inherits(goog.net.FileDownloader, goog.Disposable);\n\n\n/**\n * Download a remote file and save its contents to the filesystem. A given file\n * is uniquely identified by its URL string; this means that the relative and\n * absolute URLs for a single file are considered different for the purposes of\n * the FileDownloader.\n *\n * Returns a Deferred that will contain the downloaded blob. If there's an error\n * while downloading the URL, this Deferred will be passed the\n * {@link goog.net.FileDownloader.Error} object as an errback.\n *\n * If a download is already in progress for the given URL, this will return the\n * deferred blob for that download. If the URL has already been downloaded, this\n * will fail once it tries to save the downloaded blob.\n *\n * When a download is in progress, all Deferreds returned for that download will\n * be branches of a single parent. If all such branches are cancelled, or if one\n * is cancelled with opt_deepCancel set, then the download will be cancelled as\n * well.\n *\n * @param {string} url The URL of the file to download.\n * @return {!goog.async.Deferred} The deferred result blob.\n */\ngoog.net.FileDownloader.prototype.download = function(url) {\n  if (this.isDownloading(url)) {\n    return this.downloads_[url].deferred.branch(true /* opt_propagateCancel */);\n  }\n\n  var download = new goog.net.FileDownloader.Download_(url, this);\n  this.downloads_[url] = download;\n  this.pool_.getObject(goog.bind(this.gotXhr_, this, download));\n  return download.deferred.branch(true /* opt_propagateCancel */);\n};\n\n\n/**\n * Return a Deferred that will fire once no download is active for a given URL.\n * If there's no download active for that URL when this is called, the deferred\n * will fire immediately; otherwise, it will fire once the download is complete,\n * whether or not it succeeds.\n *\n * @param {string} url The URL of the download to wait for.\n * @return {!goog.async.Deferred} The Deferred that will fire when the download\n *     is complete.\n */\ngoog.net.FileDownloader.prototype.waitForDownload = function(url) {\n  var deferred = new goog.async.Deferred();\n  if (this.isDownloading(url)) {\n    this.downloads_[url].deferred.addBoth(function() {\n      deferred.callback(null);\n    }, this);\n  } else {\n    deferred.callback(null);\n  }\n  return deferred;\n};\n\n\n/**\n * Returns whether or not there is an active download for a given URL.\n *\n * @param {string} url The URL of the download to check.\n * @return {boolean} Whether or not there is an active download for the URL.\n */\ngoog.net.FileDownloader.prototype.isDownloading = function(url) {\n  return url in this.downloads_;\n};\n\n\n/**\n * Load a downloaded blob from the filesystem. Will fire a deferred error if the\n * given URL has not yet been downloaded.\n *\n * @param {string} url The URL of the blob to load.\n * @return {!goog.async.Deferred} The deferred Blob object. The callback will be\n *     passed the blob. If a file API error occurs while loading the blob, that\n *     error will be passed to the errback.\n */\ngoog.net.FileDownloader.prototype.getDownloadedBlob = function(url) {\n  return this.getFile_(url).addCallback(function(fileEntry) {\n    return fileEntry.file();\n  });\n};\n\n\n/**\n * Get the local filesystem: URL for a downloaded file. This is different from\n * the blob: URL that's available from getDownloadedBlob(). If the end user\n * accesses the filesystem: URL, the resulting file's name will be determined by\n * the download filename as opposed to an arbitrary GUID. In addition, the\n * filesystem: URL is connected to a filesystem location, so if the download is\n * removed then that URL will become invalid.\n *\n * Warning: in Chrome 12, some filesystem: URLs are opened inline. This means\n * that e.g. HTML pages given to the user via filesystem: URLs will be opened\n * and processed by the browser.\n *\n * @param {string} url The URL of the file to get the URL of.\n * @return {!goog.async.Deferred} The deferred filesystem: URL. The callback\n *     will be passed the URL. If a file API error occurs while loading the\n *     blob, that error will be passed to the errback.\n */\ngoog.net.FileDownloader.prototype.getLocalUrl = function(url) {\n  return this.getFile_(url).addCallback(function(fileEntry) {\n    return fileEntry.toUrl();\n  });\n};\n\n\n/**\n * Return (deferred) whether or not a URL has been downloaded. Will fire a\n * deferred error if something goes wrong when determining this.\n *\n * @param {string} url The URL to check.\n * @return {!goog.async.Deferred} The deferred boolean. The callback will be\n *     passed the boolean. If a file API error occurs while checking the\n *     existence of the downloaded URL, that error will be passed to the\n *     errback.\n */\ngoog.net.FileDownloader.prototype.isDownloaded = function(url) {\n  var deferred = new goog.async.Deferred();\n  var blobDeferred = this.getDownloadedBlob(url);\n  blobDeferred.addCallback(function() { deferred.callback(true); });\n  blobDeferred.addErrback(function(err) {\n    if (err.name == goog.fs.Error.ErrorName.NOT_FOUND) {\n      deferred.callback(false);\n    } else {\n      deferred.errback(err);\n    }\n  });\n  return deferred;\n};\n\n\n/**\n * Remove a URL from the FileDownloader.\n *\n * This returns a Deferred. If the removal is completed successfully, its\n * callback will be called without any value. If the removal fails, its errback\n * will be called with the {@link goog.fs.Error}.\n *\n * @param {string} url The URL to remove.\n * @return {!goog.async.Deferred} The deferred used for registering callbacks on\n *     success or on error.\n */\ngoog.net.FileDownloader.prototype.remove = function(url) {\n  return this.getDir_(url, goog.fs.DirectoryEntry.Behavior.DEFAULT)\n      .addCallback(function(dir) { return dir.removeRecursively(); });\n};\n\n\n/**\n * Save a blob for a given URL. This works just as through the blob were\n * downloaded form that URL, except you specify the blob and no HTTP request is\n * made.\n *\n * If the URL is currently being downloaded, it's indeterminate whether the blob\n * being set or the blob being downloaded will end up in the filesystem.\n * Whichever one doesn't get saved will have an error. To ensure that one or the\n * other takes precedence, use {@link #waitForDownload} to allow the download to\n * complete before setting the blob.\n *\n * @param {string} url The URL at which to set the blob.\n * @param {!Blob} blob The blob to set.\n * @param {string=} opt_name The name of the file. If this isn't given, it's\n *     determined from the URL.\n * @return {!goog.async.Deferred} The deferred used for registering callbacks on\n *     success or on error. This can be cancelled just like a {@link #download}\n *     Deferred. The objects passed to the errback will be\n *     {@link goog.net.FileDownloader.Error}s.\n */\ngoog.net.FileDownloader.prototype.setBlob = function(url, blob, opt_name) {\n  var name = this.sanitize_(opt_name || this.urlToName_(url));\n  var download = new goog.net.FileDownloader.Download_(url, this);\n  this.downloads_[url] = download;\n  download.blob = blob;\n  this.getDir_(download.url, goog.fs.DirectoryEntry.Behavior.CREATE_EXCLUSIVE)\n      .addCallback(function(dir) {\n        return dir.getFile(\n            name, goog.fs.DirectoryEntry.Behavior.CREATE_EXCLUSIVE);\n      })\n      .addCallback(goog.bind(this.fileSuccess_, this, download))\n      .addErrback(goog.bind(this.error_, this, download));\n  return download.deferred.branch(true /* opt_propagateCancel */);\n};\n\n\n/**\n * The callback called when an XHR becomes available from the XHR pool.\n *\n * @param {!goog.net.FileDownloader.Download_} download The download object for\n *     this download.\n * @param {!goog.net.XhrIo} xhr The XhrIo object for downloading the page.\n * @private\n */\ngoog.net.FileDownloader.prototype.gotXhr_ = function(download, xhr) {\n  if (download.cancelled) {\n    this.freeXhr_(xhr);\n    return;\n  }\n\n  this.eventHandler_.listen(\n      xhr, goog.net.EventType.SUCCESS,\n      goog.bind(this.xhrSuccess_, this, download));\n  this.eventHandler_.listen(\n      xhr, [goog.net.EventType.ERROR, goog.net.EventType.ABORT],\n      goog.bind(this.error_, this, download));\n  this.eventHandler_.listen(\n      xhr, goog.net.EventType.READY, goog.bind(this.freeXhr_, this, xhr));\n\n  download.xhr = xhr;\n  xhr.setResponseType(goog.net.XhrIo.ResponseType.ARRAY_BUFFER);\n  xhr.send(download.url);\n};\n\n\n/**\n * The callback called when an XHR succeeds in downloading a remote file.\n *\n * @param {!goog.net.FileDownloader.Download_} download The download object for\n *     this download.\n * @private\n */\ngoog.net.FileDownloader.prototype.xhrSuccess_ = function(download) {\n  if (download.cancelled) {\n    return;\n  }\n\n  var name = this.sanitize_(\n      this.getName_(\n          /** @type {!goog.net.XhrIo} */ (download.xhr)));\n  var resp = /** @type {ArrayBuffer} */ (download.xhr.getResponse());\n  if (!resp) {\n    // This should never happen - it indicates the XHR hasn't completed, has\n    // failed or has been cleaned up.  If it does happen (eg. due to a bug\n    // somewhere) we don't want to pass null to getBlob - it's not valid and\n    // triggers a bug in some versions of WebKit causing it to crash.\n    this.error_(download);\n    return;\n  }\n\n  download.blob = goog.fs.getBlob(resp);\n  delete download.xhr;\n\n  this.getDir_(download.url, goog.fs.DirectoryEntry.Behavior.CREATE_EXCLUSIVE)\n      .addCallback(function(dir) {\n        return dir.getFile(\n            name, goog.fs.DirectoryEntry.Behavior.CREATE_EXCLUSIVE);\n      })\n      .addCallback(goog.bind(this.fileSuccess_, this, download))\n      .addErrback(goog.bind(this.error_, this, download));\n};\n\n\n/**\n * The callback called when a file that will be used for saving a file is\n * successfully opened.\n *\n * @param {!goog.net.FileDownloader.Download_} download The download object for\n *     this download.\n * @param {!goog.fs.FileEntry} file The newly-opened file object.\n * @private\n */\ngoog.net.FileDownloader.prototype.fileSuccess_ = function(download, file) {\n  if (download.cancelled) {\n    file.remove();\n    return;\n  }\n\n  download.file = file;\n  file.createWriter()\n      .addCallback(goog.bind(this.fileWriterSuccess_, this, download))\n      .addErrback(goog.bind(this.error_, this, download));\n};\n\n\n/**\n * The callback called when a file writer is successfully created for writing a\n * file to the filesystem.\n *\n * @param {!goog.net.FileDownloader.Download_} download The download object for\n *     this download.\n * @param {!goog.fs.FileWriter} writer The newly-created file writer object.\n * @private\n */\ngoog.net.FileDownloader.prototype.fileWriterSuccess_ = function(\n    download, writer) {\n  if (download.cancelled) {\n    download.file.remove();\n    return;\n  }\n\n  download.writer = writer;\n  writer.write(/** @type {!Blob} */ (download.blob));\n  this.eventHandler_.listenOnce(\n      writer, goog.fs.FileSaver.EventType.WRITE_END,\n      goog.bind(this.writeEnd_, this, download));\n};\n\n\n/**\n * The callback called when file writing ends, whether or not it's successful.\n *\n * @param {!goog.net.FileDownloader.Download_} download The download object for\n *     this download.\n * @private\n */\ngoog.net.FileDownloader.prototype.writeEnd_ = function(download) {\n  if (download.cancelled || download.writer.getError()) {\n    this.error_(download, download.writer.getError());\n    return;\n  }\n\n  delete this.downloads_[download.url];\n  download.deferred.callback(download.blob);\n};\n\n\n/**\n * The error callback for all asynchronous operations. Ensures that all stages\n * of a given download are cleaned up, and emits the error event.\n *\n * @param {!goog.net.FileDownloader.Download_} download The download object for\n *     this download.\n * @param {goog.fs.Error=} opt_err The file error object. Only defined if the\n *     error was raised by the file API.\n * @private\n */\ngoog.net.FileDownloader.prototype.error_ = function(download, opt_err) {\n  if (download.file) {\n    download.file.remove();\n  }\n\n  if (download.cancelled) {\n    return;\n  }\n\n  delete this.downloads_[download.url];\n  download.deferred.errback(\n      new goog.net.FileDownloader.Error(download, opt_err));\n};\n\n\n/**\n * Abort the download of the given URL.\n *\n * @param {!goog.net.FileDownloader.Download_} download The download to abort.\n * @private\n */\ngoog.net.FileDownloader.prototype.cancel_ = function(download) {\n  goog.dispose(download);\n  delete this.downloads_[download.url];\n};\n\n\n/**\n * Get the directory for a given URL. If the directory already exists when this\n * is called, it will contain exactly one file: the downloaded file.\n *\n * This not only calls the FileSystem API's getFile method, but attempts to\n * distribute the files so that they don't overload the filesystem. The spec\n * says directories can't contain more than 5000 files\n * (http://www.w3.org/TR/file-system-api/#directories), so this ensures that\n * each file is put into a subdirectory based on its SHA1 hash.\n *\n * All parameters are the same as in the FileSystem API's Entry#getFile method.\n *\n * @param {string} url The URL corresponding to the directory to get.\n * @param {goog.fs.DirectoryEntry.Behavior} behavior The behavior to pass to the\n *     underlying method.\n * @return {!goog.async.Deferred} The deferred DirectoryEntry object.\n * @private\n */\ngoog.net.FileDownloader.prototype.getDir_ = function(url, behavior) {\n  // 3 hex digits provide 16**3 = 4096 different possible dirnames, which is\n  // less than the maximum of 5000 entries. Downloaded files should be\n  // distributed roughly evenly throughout the directories due to the hash\n  // function, allowing many more than 5000 files to be downloaded.\n  //\n  // The leading ` ensures that no illegal dirnames are accidentally used. % was\n  // previously used, but Chrome has a bug (as of 12.0.725.0 dev) where\n  // filenames are URL-decoded before checking their validity, so filenames\n  // containing e.g. '%3f' (the URL-encoding of :, an invalid character) are\n  // rejected.\n  var dirname = '`' +\n      Math.abs(goog.crypt.hash32.encodeString(url))\n          .toString(16)\n          .substring(0, 3);\n\n  return this.dir_.getDirectory(dirname, goog.fs.DirectoryEntry.Behavior.CREATE)\n      .addCallback(function(dir) {\n        return dir.getDirectory(this.sanitize_(url), behavior);\n      }, this);\n};\n\n\n/**\n * Get the file for a given URL. This will only retrieve files that have already\n * been saved; it shouldn't be used for creating the file in the first place.\n * This is because the filename isn't necessarily determined by the URL, but by\n * the headers of the XHR response.\n *\n * @param {string} url The URL corresponding to the file to get.\n * @return {!goog.async.Deferred} The deferred FileEntry object.\n * @private\n */\ngoog.net.FileDownloader.prototype.getFile_ = function(url) {\n  return this.getDir_(url, goog.fs.DirectoryEntry.Behavior.DEFAULT)\n      .addCallback(function(dir) {\n        return dir.listDirectory().addCallback(function(files) {\n          goog.asserts.assert(files.length == 1);\n          // If the filesystem somehow gets corrupted and we end up with an\n          // empty directory here, it makes sense to just return the normal\n          // file-not-found error.\n          return files[0] || dir.getFile('file');\n        });\n      });\n};\n\n\n/**\n * Sanitize a string so it can be safely used as a file or directory name for\n * the FileSystem API.\n *\n * @param {string} str The string to sanitize.\n * @return {string} The sanitized string.\n * @private\n */\ngoog.net.FileDownloader.prototype.sanitize_ = function(str) {\n  // Add a prefix, since certain prefixes are disallowed for paths. None of the\n  // disallowed prefixes start with '`'. We use ` rather than % for escaping the\n  // filename due to a Chrome bug (as of 12.0.725.0 dev) where filenames are\n  // URL-decoded before checking their validity, so filenames containing e.g.\n  // '%3f' (the URL-encoding of :, an invalid character) are rejected.\n  return '`' +\n      str.replace(/[\\/\\\\<>:?*\"|%`]/g, encodeURIComponent).replace(/%/g, '`');\n};\n\n\n/**\n * Gets the filename specified by the XHR. This first attempts to parse the\n * Content-Disposition header for a filename and, failing that, falls back on\n * deriving the filename from the URL.\n *\n * @param {!goog.net.XhrIo} xhr The XHR containing the response headers.\n * @return {string} The filename.\n * @private\n */\ngoog.net.FileDownloader.prototype.getName_ = function(xhr) {\n  var disposition = xhr.getResponseHeader('Content-Disposition');\n  var match =\n      disposition && disposition.match(/^attachment *; *filename=\"(.*)\"$/i);\n  if (match) {\n    // The Content-Disposition header allows for arbitrary backslash-escaped\n    // characters (usually \" and \\). We want to unescape them before using them\n    // in the filename.\n    return match[1].replace(/\\\\(.)/g, '$1');\n  }\n\n  return this.urlToName_(xhr.getLastUri());\n};\n\n\n/**\n * Extracts the basename from a URL.\n *\n * @param {string} url The URL.\n * @return {string} The basename.\n * @private\n */\ngoog.net.FileDownloader.prototype.urlToName_ = function(url) {\n  var segments = url.split('/');\n  return segments[segments.length - 1];\n};\n\n\n/**\n * Remove all event listeners for an XHR and release it back into the pool.\n *\n * @param {!goog.net.XhrIo} xhr The XHR to free.\n * @private\n */\ngoog.net.FileDownloader.prototype.freeXhr_ = function(xhr) {\n  goog.events.removeAll(xhr);\n  this.pool_.addFreeObject(xhr);\n};\n\n\n/** @override */\ngoog.net.FileDownloader.prototype.disposeInternal = function() {\n  delete this.dir_;\n  goog.dispose(this.eventHandler_);\n  delete this.eventHandler_;\n  goog.object.forEach(this.downloads_, function(download) {\n    download.deferred.cancel();\n  }, this);\n  delete this.downloads_;\n  goog.dispose(this.pool_);\n  delete this.pool_;\n\n  goog.net.FileDownloader.base(this, 'disposeInternal');\n};\n\n\n\n/**\n * The error object for FileDownloader download errors.\n *\n * @param {!goog.net.FileDownloader.Download_} download The download object for\n *     the download in question.\n * @param {goog.fs.Error=} opt_fsErr The file error object, if this was a file\n *     error.\n *\n * @constructor\n * @extends {goog.debug.Error}\n * @final\n */\ngoog.net.FileDownloader.Error = function(download, opt_fsErr) {\n  goog.net.FileDownloader.Error.base(\n      this, 'constructor', 'Error capturing URL ' + download.url);\n\n  /**\n   * The URL the event relates to.\n   * @type {string}\n   */\n  this.url = download.url;\n\n  if (download.xhr) {\n    this.xhrStatus = download.xhr.getStatus();\n    this.xhrErrorCode = download.xhr.getLastErrorCode();\n    this.message += ': XHR failed with status ' + this.xhrStatus +\n        ' (error code ' + this.xhrErrorCode + ')';\n  } else if (opt_fsErr) {\n    this.fileError = opt_fsErr;\n    this.message += ': file API failed (' + opt_fsErr.message + ')';\n  }\n};\ngoog.inherits(goog.net.FileDownloader.Error, goog.debug.Error);\n\n\n/**\n * The status of the XHR. Only set if the error was caused by an XHR failure.\n * @type {number|undefined}\n */\ngoog.net.FileDownloader.Error.prototype.xhrStatus;\n\n\n/**\n * The error code of the XHR. Only set if the error was caused by an XHR\n * failure.\n * @type {goog.net.ErrorCode|undefined}\n */\ngoog.net.FileDownloader.Error.prototype.xhrErrorCode;\n\n\n/**\n * The file API error. Only set if the error was caused by the file API.\n * @type {goog.fs.Error|undefined}\n */\ngoog.net.FileDownloader.Error.prototype.fileError;\n\n\n\n/**\n * A struct containing the data for a single download.\n *\n * @param {string} url The URL for the file being downloaded.\n * @param {!goog.net.FileDownloader} downloader The parent FileDownloader.\n * @extends {goog.Disposable}\n * @constructor\n * @private\n */\ngoog.net.FileDownloader.Download_ = function(url, downloader) {\n  goog.net.FileDownloader.Download_.base(this, 'constructor');\n\n  /**\n   * The URL for the file being downloaded.\n   * @type {string}\n   */\n  this.url = url;\n\n  /**\n   * The Deferred that will be fired when the download is complete.\n   * @type {!goog.async.Deferred}\n   */\n  this.deferred =\n      new goog.async.Deferred(goog.bind(downloader.cancel_, downloader, this));\n\n  /**\n   * Whether this download has been cancelled by the user.\n   * @type {boolean}\n   */\n  this.cancelled = false;\n\n  /**\n   * The XhrIo object for downloading the file. Only set once it's been\n   * retrieved from the pool.\n   * @type {?goog.net.XhrIo}\n   */\n  this.xhr = null;\n\n  /**\n   * The name of the blob being downloaded. Only sey once the XHR has completed,\n   * if it completed successfully.\n   * @type {?string}\n   */\n  this.name = null;\n\n  /**\n   * The downloaded blob. Only set once the XHR has completed, if it completed\n   * successfully.\n   * @type {?Blob}\n   */\n  this.blob = null;\n\n  /**\n   * The file entry where the blob is to be stored. Only set once it's been\n   * loaded from the filesystem.\n   * @type {?goog.fs.FileEntry}\n   */\n  this.file = null;\n\n  /**\n   * The file writer for writing the blob to the filesystem. Only set once it's\n   * been loaded from the filesystem.\n   * @type {?goog.fs.FileWriter}\n   */\n  this.writer = null;\n};\ngoog.inherits(goog.net.FileDownloader.Download_, goog.Disposable);\n\n\n/** @override */\ngoog.net.FileDownloader.Download_.prototype.disposeInternal = function() {\n  this.cancelled = true;\n  if (this.xhr) {\n    this.xhr.abort();\n  } else if (\n      this.writer &&\n      this.writer.getReadyState() == goog.fs.FileSaver.ReadyState.WRITING) {\n    this.writer.abort();\n  }\n\n  goog.net.FileDownloader.Download_.base(this, 'disposeInternal');\n};\n","^?",1579837703000,"^@",["^A",["^1J","~$goog.net.XhrIoPool","~$goog.fs.FileSaver","^2R","~$goog.net.XhrIo","~$goog.crypt.hash32","~$goog.fs.Error","^3","^21","^2@","~$goog.net.EventType","~$goog.fs.DirectoryEntry","^3C","~$goog.fs","^3P","^1N"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/filedownloader.js"],"^S",["^A",["~$goog.net.FileDownloader","~$goog.net.FileDownloader.Error"]],"^1",true,"^2",["^3","^3C","^1J","^3P","^4D","^2@","^1N","^2R","^4H","^4G","^4E","^4B","^4F","^4C","^4A","^21"]],["^ ","^7",[1579837703000],"^8","goog.ui.toolbarmenubuttonrenderer.js","^9",["^:","goog/ui/toolbarmenubuttonrenderer.js"],"^;","goog/ui/toolbarmenubuttonrenderer.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A toolbar menu button renderer.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ToolbarMenuButtonRenderer');\n\ngoog.require('goog.ui.MenuButtonRenderer');\n\n\n\n/**\n * Toolbar-specific renderer for {@link goog.ui.MenuButton}s, based on {@link\n * goog.ui.MenuButtonRenderer}.\n * @constructor\n * @extends {goog.ui.MenuButtonRenderer}\n */\ngoog.ui.ToolbarMenuButtonRenderer = function() {\n  goog.ui.MenuButtonRenderer.call(this);\n};\ngoog.inherits(goog.ui.ToolbarMenuButtonRenderer, goog.ui.MenuButtonRenderer);\ngoog.addSingletonGetter(goog.ui.ToolbarMenuButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of menu buttons rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.ToolbarMenuButtonRenderer.CSS_CLASS =\n    goog.getCssName('goog-toolbar-menu-button');\n\n\n/**\n * Returns the CSS class to be applied to the root element of menu buttons\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.ToolbarMenuButtonRenderer.prototype.getCssClass = function() {\n  return goog.ui.ToolbarMenuButtonRenderer.CSS_CLASS;\n};\n","^?",1579837703000,"^@",["^A",["^3","^28"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/toolbarmenubuttonrenderer.js"],"^S",["^A",["~$goog.ui.ToolbarMenuButtonRenderer"]],"^1",true,"^2",["^3","^28"]],["^ ","^7",[1579837703000],"^8","goog.net.bulkloaderhelper.js","^9",["^:","goog/net/bulkloaderhelper.js"],"^;","goog/net/bulkloaderhelper.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Helper class to load a list of URIs in bulk. All URIs\n * must be a successfully loaded in order for the entire load to be considered\n * a success.\n *\n */\n\ngoog.provide('goog.net.BulkLoaderHelper');\n\ngoog.forwardDeclare('goog.Uri');\ngoog.require('goog.Disposable');\n\n\n\n/**\n * Helper class used to load multiple URIs.\n * @param {Array<string|goog.Uri>} uris The URIs to load.\n * @constructor\n * @extends {goog.Disposable}\n * @final\n */\ngoog.net.BulkLoaderHelper = function(uris) {\n  goog.Disposable.call(this);\n\n  /**\n   * The URIs to load.\n   * @type {Array<string|goog.Uri>}\n   * @private\n   */\n  this.uris_ = uris;\n\n  /**\n   * The response from the XHR's.\n   * @type {Array<string>}\n   * @private\n   */\n  this.responseTexts_ = [];\n};\ngoog.inherits(goog.net.BulkLoaderHelper, goog.Disposable);\n\n\n\n/**\n * Gets the URI by id.\n * @param {number} id The id.\n * @return {string|goog.Uri} The URI specified by the id.\n */\ngoog.net.BulkLoaderHelper.prototype.getUri = function(id) {\n  return this.uris_[id];\n};\n\n\n/**\n * Gets the URIs.\n * @return {Array<string|goog.Uri>} The URIs.\n */\ngoog.net.BulkLoaderHelper.prototype.getUris = function() {\n  return this.uris_;\n};\n\n\n/**\n * Gets the response texts.\n * @return {Array<string>} The response texts.\n */\ngoog.net.BulkLoaderHelper.prototype.getResponseTexts = function() {\n  return this.responseTexts_;\n};\n\n\n/**\n * Sets the response text by id.\n * @param {number} id The id.\n * @param {string} responseText The response texts.\n */\ngoog.net.BulkLoaderHelper.prototype.setResponseText = function(\n    id, responseText) {\n  this.responseTexts_[id] = responseText;\n};\n\n\n/**\n * Determines if the load of the URIs is complete.\n * @return {boolean} TRUE iff the load is complete.\n */\ngoog.net.BulkLoaderHelper.prototype.isLoadComplete = function() {\n  var responseTexts = this.responseTexts_;\n  if (responseTexts.length == this.uris_.length) {\n    for (var i = 0; i < responseTexts.length; i++) {\n      if (responseTexts[i] == null) {\n        return false;\n      }\n    }\n    return true;\n  }\n  return false;\n};\n\n\n/** @override */\ngoog.net.BulkLoaderHelper.prototype.disposeInternal = function() {\n  goog.net.BulkLoaderHelper.superClass_.disposeInternal.call(this);\n\n  this.uris_ = null;\n  this.responseTexts_ = null;\n};\n","^?",1579837703000,"^@",["^A",["^3","^3C"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/bulkloaderhelper.js"],"^S",["^A",["~$goog.net.BulkLoaderHelper"]],"^1",true,"^2",["^3","^3C"]],["^ ","^7",[1579837703000],"^8","goog.messaging.testdata.portnetwork_worker1.js","^9",["^:","goog/messaging/testdata/portnetwork_worker1.js"],"^;","goog/messaging/testdata/portnetwork_worker1.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n\n// Use of this source code is governed by the Apache License, Version 2.0.\n// See the COPYING file for details.\n\n/**\n * @fileoverview A web worker for integration testing the PortPool class.\n *\n * @nocompile\n */\n\nself.CLOSURE_BASE_PATH = '../../';\nimportScripts('../../bootstrap/webworkers.js');\nimportScripts('../../base.js');\n\n// The provide is necessary to stop the jscompiler from thinking this is an\n// entry point and adding it into the manifest incorrectly.\ngoog.provide('goog.messaging.testdata.portnetwork_worker1');\ngoog.require('goog.messaging.PortCaller');\ngoog.require('goog.messaging.PortChannel');\n\nfunction startListening() {\n  var caller =\n      new goog.messaging.PortCaller(new goog.messaging.PortChannel(self));\n\n  caller.dial('frame').registerService('sendToMain', function(msg) {\n    msg.push('worker1');\n    caller.dial('main').send('result', msg);\n  }, true);\n}\n\nstartListening();\n","^?",1579837703000,"^@",["^A",["^39","^3:","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/testdata/portnetwork_worker1.js"],"^S",["^A",["~$goog.messaging.testdata.portnetwork_worker1","~$goog.messaging.testdata.portnetwork-worker1"]],"^1",true,"^2",["^3","^39","^3:"]],["^ ","^7",[1579837703000],"^1=",true,"^8","goog.i18n.dateintervalpatterns.js","^9",["^:","goog/i18n/dateintervalpatterns.js"],"^;","goog/i18n/dateintervalpatterns.js","^<","^=","^>","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Date interval formatting patterns for all locales.\n *\n * File generated from CLDR ver. 35.1\n *\n * To reduce the file size (which may cause issues in some JS\n * developing environments), this file will only contain locales\n * that are frequently used by web applications. This is defined as\n * proto/closure_locales_data.txt and will change (most likely addition)\n * over time.  Rest of the data can be found in another file named\n * \"dateintervalpatternsext.js\", which will be generated at\n * the same time together with this file.\n */\n\n// clang-format off\n\ngoog.module('goog.i18n.dateIntervalPatterns');\n\nvar dateIntervalSymbols = goog.require('goog.i18n.dateIntervalSymbols');\n\n/**\n * Collection of date interval patterns.\n * @typedef {{\n *   YEAR_FULL: !dateIntervalSymbols.DateIntervalPatternMap,\n *   YEAR_FULL_WITH_ERA: !dateIntervalSymbols.DateIntervalPatternMap,\n *   YEAR_MONTH_ABBR: !dateIntervalSymbols.DateIntervalPatternMap,\n *   YEAR_MONTH_FULL: !dateIntervalSymbols.DateIntervalPatternMap,\n *   YEAR_MONTH_SHORT: !dateIntervalSymbols.DateIntervalPatternMap,\n *   MONTH_DAY_ABBR: !dateIntervalSymbols.DateIntervalPatternMap,\n *   MONTH_DAY_FULL: !dateIntervalSymbols.DateIntervalPatternMap,\n *   MONTH_DAY_SHORT: !dateIntervalSymbols.DateIntervalPatternMap,\n *   MONTH_DAY_MEDIUM: !dateIntervalSymbols.DateIntervalPatternMap,\n *   MONTH_DAY_YEAR_MEDIUM: !dateIntervalSymbols.DateIntervalPatternMap,\n *   WEEKDAY_MONTH_DAY_MEDIUM: !dateIntervalSymbols.DateIntervalPatternMap,\n *   WEEKDAY_MONTH_DAY_YEAR_MEDIUM: !dateIntervalSymbols.DateIntervalPatternMap,\n *   DAY_ABBR: !dateIntervalSymbols.DateIntervalPatternMap\n * }}\n */\nvar DateIntervalPatterns;\n\n/** @typedef {!DateIntervalPatterns} */\nexports.DateIntervalPatterns;\n\n/** @type {!DateIntervalPatterns} */\nvar defaultPatterns;\n\n/**\n * Returns the default DateIntervalPatterns.\n * @return {!DateIntervalPatterns}\n */\nexports.getDateIntervalPatterns = function() {\n  return defaultPatterns;\n};\n\n/**\n * Sets the default DateIntervalPatterns.\n * @param {!DateIntervalPatterns} patterns\n */\nexports.setDateIntervalPatterns = function(patterns) {\n  defaultPatterns = patterns;\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_af = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'y-M GGGGG – y-M GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/M – d/M',\n    'y': 'd/M/y – d/M/y',\n    '_': 'dd-MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E d MMM – E d MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM y G – E d MMM y G',\n    'Md': 'E d MMM – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_am = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM፣ y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG M/y – GGGGG M/y',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'MMM d፣ y – MMM d፣ y',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'MMMM d፣ y – MMMM d፣ y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'M': 'd/M – d/M',\n    'd': 'd–d/M',\n    'y': 'd/M/y – d/M/y',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'MMMM d፣ y – MMMM d፣ y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G MMM d፣ y – G MMM d፣ y',\n    'M': 'MMM d – MMM d፣ y',\n    'd': 'MMM d–d፣ y',\n    'y': 'MMM d፣ y – MMM d፣ y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'MMM d, E – MMM d, E',\n    'd': 'E d – E d፣ MMM',\n    'y': 'E፣ MMM d፣ y – E፣ MMM d፣ y',\n    '_': 'EEE፣ MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E፣ MMM d፣ y – G E፣ MMM d፣ y',\n    'Md': 'E MMM d – E MMM d፣ y',\n    'y': 'E፣ MMM d፣ y – E፣ MMM d፣ y',\n    '_': 'EEE፣ MMM d y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM، y',\n    'y': 'MMM، y – MMM، y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM، y',\n    'y': 'MMMM، y – MMMM، y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M‏/y – M‏/y',\n    '_': 'MM‏/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM، y – d MMM، y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM، y – d MMMM، y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'M/d – M/d',\n    'y': 'd‏/M‏/y – d‏/M‏/y',\n    '_': 'd/‏M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM، y – d MMMM، y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM، y',\n    'd': 'd–d MMM، y',\n    'y': 'd MMM، y – d MMM، y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E، d MMM – E، d MMM',\n    'd': 'E، d – E، d MMM',\n    'y': 'E، d MMM، y – E، d MMM، y',\n    '_': 'EEE، d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E، d MMM – E، d MMM، y',\n    'd': 'E، d – E، d MMM، y',\n    'y': 'E، d MMM، y – E، d MMM، y',\n    '_': 'EEE، d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'M/d – M/d',\n    'd': 'd–d',\n    'y': 'd‏/M‏/y – d‏/M‏/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_DZ = exports.DateIntervalPatterns_ar;\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ar_EG = exports.DateIntervalPatterns_ar;\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_az = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM.y – GGGGG MM.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'dd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d MMM y – G d MMM y',\n    'M': 'd MMM y – d MMM',\n    'd': 'y MMM d–d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'd MMM, E – d MMM, E',\n    'y': 'd MMM y, E – d MMM y, E',\n    '_': 'd MMM, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d MMM y, E – d MMM y, E',\n    'Md': 'd MMM y, E – d MMM, E',\n    'y': 'd MMM y, E – d MMM y, E',\n    '_': 'd MMM y, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM – dd.MM',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_be = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y – y G',\n    '_': 'y \\'г\\'. G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'LLL–LLL y',\n    '_': 'LLL y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'LLLL–LLLL y',\n    '_': 'LLLL y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M.y GGGGG – M.y GGGGG',\n    'My': 'M.y – M.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd.M.y – d.M.y',\n    '_': 'd.M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM, y G – d MMM, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d MMM – E, d MMM',\n    'd': 'E, d – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d MMM, y G – E, d MMM, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd.M – d.M',\n    'd': 'd–d',\n    'y': 'd.M.y – d.M.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_bg = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y – y \\'г\\'.',\n    '_': 'y \\'г\\'.'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y – y G',\n    '_': 'y \\'г\\'. G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    '_': 'MM.y \\'г\\'.'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y \\'г\\'.',\n    '_': 'MMMM y \\'г\\'.'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM.y GGGGG – MM.y GGGGG',\n    '_': 'MM.y \\'г\\'.'\n  },\n  MONTH_DAY_ABBR: {\n    'y': 'd.MM.y \\'г\\'. – d.MM.y \\'г\\'.',\n    '_': 'd.MM'\n  },\n  MONTH_DAY_FULL: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y \\'г\\'. – d MMMM y \\'г\\'.',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd.MM.y \\'г\\'. – d.MM.y \\'г\\'.',\n    '_': 'd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y \\'г\\'. – d MMMM y \\'г\\'.',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'Md': 'd.MM – d.MM.y \\'г\\'.',\n    '_': 'd.MM.y \\'г\\'.'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d.MM – E, d.MM',\n    'y': 'E, d.MM.y \\'г\\'. – E, d.MM.y \\'г\\'.',\n    '_': 'EEE, d.MM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d MMM y G – E, d MMM y G',\n    'Md': 'E, d.MM – E, d.MM.y \\'г\\'.',\n    'y': 'E, d.MM.y \\'г\\'. – E, d.MM.y \\'г\\'.',\n    '_': 'EEE, d.MM.y \\'г\\'.'\n  },\n  DAY_ABBR: {\n    'M': 'd.MM – d.MM',\n    'y': 'd.MM.y \\'г\\'. – d.MM.y \\'г\\'.',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_bn = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM, y – d MMM, y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd–d MMM, y',\n    '_': 'd MMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'Md': 'E, d MMM – E, d MMM, y',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'EEE, d MMM, y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_br = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E d MMM – E d MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E d MMM – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_bs = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y.'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y. G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'LLL – LLL y.',\n    'y': 'LLL y. – LLL y.',\n    '_': 'MMM y.'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'LLLL – LLLL y.',\n    'y': 'LLLL y. – LLLL y.',\n    '_': 'LLLL y.'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd. MMM – d. MMM',\n    'd': 'd.–d. MMM',\n    'y': 'd. MMM y. – d. MMM y.',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y. – d. MMMM y.',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd. M – d. M.',\n    'y': 'd.M.y. – d.M.y.',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y. – d. MMMM y.',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd. MMM – d. MMM y.',\n    'd': 'd. – d. MMM y.',\n    'y': 'd. MMM y. – d. MMM y.',\n    '_': 'd. MMM y.'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d. MMM – E, d. MMM',\n    'd': 'E, d. – E, d. MMM',\n    'y': 'E, d. MMM y. – E, d. MMM y.',\n    '_': 'EEE, d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, d. MMM – E, d. MMM y.',\n    'd': 'E, d. – E, d. MMM y.',\n    'y': 'E, d. MMM y. – E, d. MMM y.',\n    '_': 'EEE, d. MMM y.'\n  },\n  DAY_ABBR: {\n    'M': 'd. M – d. M.',\n    'd': 'd–d.',\n    'y': 'd.M.y. – d.M.y.',\n    '_': 'd.'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ca = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'LLL y G – LLL y G',\n    'M': 'LLL–LLL y',\n    'y': 'LLL y – LLL y',\n    '_': 'LLL \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'LLLL y G – LLLL y G',\n    'M': 'LLLL–LLLL \\'de\\' y',\n    'y': 'LLLL \\'de\\' y – LLLL \\'de\\' y',\n    '_': 'LLLL \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/M – d/M',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM, y G – d MMM, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d MMM – E, d MMM',\n    'd': 'E, d – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d MMM, y G – E, d MMM, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_chr = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d – d',\n    'y': 'MMM d, y – MMM d, y',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d – d',\n    'y': 'MMMM d, y – MMMM d, y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'M/d/y – M/d/y',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d – d',\n    'y': 'MMMM d, y – MMMM d, y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'MMM d – MMM d, y',\n    'd': 'MMM d – d, y',\n    '_': 'MMM d, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, MMM d – E, MMM d',\n    'y': 'E, MMM d, y – E, MMM d, y',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'Md': 'E, MMM d – E, MMM d, y',\n    'y': 'E, MMM d, y – E, MMM d, y',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'M/d – M/d',\n    'y': 'M/d/y – M/d/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_cs = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'LLLL y G – LLLL y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'LLLL y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'LLLL y G – LLLL y G',\n    'M': 'LLLL–LLLL y',\n    '_': 'LLLL y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd.–d. M.',\n    'y': 'd. M. y – d. M. y',\n    '_': 'd. M.'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. M. – d. M.',\n    'd': 'd.–d. M.',\n    'y': 'd. M. y – d. M. y',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd. M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd. M. – d. M.',\n    'd': 'd.–d. M.',\n    'y': 'd. M. y – d. M. y',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd. M. y G – d. M. y G',\n    'M': 'd. M. – d. M. y',\n    'd': 'd.–d. M. y',\n    '_': 'd. M. y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E d. M. – E d. M.',\n    'y': 'E d. M. y – E d. M. y',\n    '_': 'EEE d. M.'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d. M. y G – E d. M. y G',\n    'Md': 'E d. M. – E d. M. y',\n    'y': 'E d. M. y – E d. M. y',\n    '_': 'EEE d. M. y'\n  },\n  DAY_ABBR: {\n    'M': 'd. M. – d. M.',\n    'd': 'd.–d.',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd.'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_cy = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM, y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM, y – d MMMM y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM, y – d MMMM y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM, y – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, d MMM – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_da = {\n  YEAR_FULL: {\n    'G': 'G y–G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y–G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y–G MMM y',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y–G MMMM y',\n    'M': 'MMMM–MMMM y',\n    'y': 'MMMM y–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM.y–GGGGG MM.y',\n    'My': 'MM.y–MM.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd. MMM–d. MMM',\n    'd': 'd.–d. MMM',\n    'y': 'd. MMM y–d. MMM y',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM–d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y–d. MMMM y',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.MM–dd.MM',\n    'y': 'dd.MM.y–dd.MM.y',\n    '_': 'd.M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd. MMMM–d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y–d. MMMM y',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d. MMM y–G d. MMM y',\n    'M': 'd. MMM–d. MMM y',\n    'd': 'd.–d. MMM y',\n    'y': 'd. MMM y–d. MMM y',\n    '_': 'd. MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d. MMM–E d. MMM',\n    'd': 'E d.–E d. MMM',\n    'y': 'E d. MMM y–E d. MMM y',\n    '_': 'EEE d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E d. MMM y–G E d. MMM y',\n    'M': 'E d. MMM–E d. MMM y',\n    'd': 'E d.–E d. MMM y',\n    'y': 'E d. MMM y–E d. MMM y',\n    '_': 'EEE d. MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM–dd.MM',\n    'd': 'd.–d.',\n    'y': 'dd.MM.y–dd.MM.y',\n    '_': 'd.'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_de = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM.y GGGGG – MM.y GGGGG',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd.–d. MMM',\n    'y': 'd. MMM y – d. MMM y',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'M': 'dd.MM. – dd.MM.',\n    'd': 'dd.–dd.MM.',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd. MMM y G – d. MMM y G',\n    'M': 'd. MMM – d. MMM y',\n    'd': 'd.–d. MMM y',\n    '_': 'd. MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d. MMM – E, d. MMM',\n    'd': 'E, d. – E, d. MMM',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE, d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d. MMM y G – E E, d. MMM y G',\n    'M': 'E, d. MMM – E, d. MMM y',\n    'd': 'E, d. – E, d. MMM y',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE, d. MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM. – dd.MM.',\n    'd': 'd.–d.',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_de_AT = exports.DateIntervalPatterns_de;\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_de_CH = exports.DateIntervalPatterns_de;\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_el = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'LLLL–LLLL y',\n    'y': 'LLLL y – LLLL y',\n    '_': 'LLLL y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM-y GGGGG – MM-y GGGGG',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'dd MMM – dd MMM',\n    'd': 'dd–dd MMM',\n    'y': 'dd MMM y – dd MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'dd MMMM – dd MMMM',\n    'd': 'dd–dd MMMM',\n    'y': 'dd MMMM y – dd MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'dd MMMM – dd MMMM',\n    'd': 'dd–dd MMMM',\n    'y': 'dd MMMM y – dd MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'dd MMM – dd MMM y',\n    'd': 'dd–dd MMM y',\n    'y': 'dd MMM y – dd MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, dd MMM – E, dd MMM',\n    'd': 'E, dd – E, dd MMM',\n    'y': 'E, dd MMM y – E, dd MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM y G – E d MMM y G',\n    'Md': 'E, dd MMM – E, dd MMM y',\n    'y': 'E, dd MMM y – E, dd MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_en = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d – d',\n    'y': 'MMM d, y – MMM d, y',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d – d',\n    'y': 'MMMM d, y – MMMM d, y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'M/d/y – M/d/y',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d – d',\n    'y': 'MMMM d, y – MMMM d, y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'MMM d – MMM d, y',\n    'd': 'MMM d – d, y',\n    '_': 'MMM d, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, MMM d – E, MMM d',\n    'y': 'E, MMM d, y – E, MMM d, y',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'Md': 'E, MMM d – E, MMM d, y',\n    'y': 'E, MMM d, y – E, MMM d, y',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'M/d – M/d',\n    'y': 'M/d/y – M/d/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_AU = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_CA = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d – d',\n    'y': 'MMM d, y – MMM d, y',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d – d',\n    'y': 'MMMM d, y – MMMM d, y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d – d',\n    'y': 'MMMM d, y – MMMM d, y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'MMM d – MMM d, y',\n    'd': 'MMM d – d, y',\n    '_': 'MMM d, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, MMM d – E, MMM d',\n    'y': 'E, MMM d, y – E, MMM d, y',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'Md': 'E, MMM d – E, MMM d, y',\n    'y': 'E, MMM d, y – E, MMM d, y',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_GB = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_IE = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E d MMM – E d MMM y',\n    'd': 'E d – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_IN = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d MMM – E, d MMM',\n    'd': 'E, d – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM, y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_SG = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'Md': 'E, d MMM – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_US = exports.DateIntervalPatterns_en;\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_en_ZA = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'MM/dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'dd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, dd MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, dd MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_es = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y – MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'y-MM GGGGG – y-MM GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d y G – MMM d y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'Md': 'E, d MMM – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_419 = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    '_': 'M/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_ES = exports.DateIntervalPatterns_es;\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_MX = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM \\'de\\' y G – MMM \\'de\\' y G',\n    'M': 'MMM–MMM \\'de\\' y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM \\'de\\' y G – MMMM \\'de\\' y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd–d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd \\'de\\' MMM \\'de\\' y G – d \\'de\\' MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM y',\n    'd': 'd–d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E d \\'de\\' MMM – E d \\'de\\' MMM',\n    'y': 'E d \\'de\\' MMM \\'de\\' y – E d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE d \\'de\\' MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d \\'de\\' MMM \\'de\\' y G – E d \\'de\\' MMM \\'de\\' y G',\n    'Md': 'E d \\'de\\' MMM – E d \\'de\\' MMM \\'de\\' y',\n    'y': 'E d \\'de\\' MMM \\'de\\' y – E d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_es_US = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM \\'de\\' y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y – MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    'My': 'M/y–M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd–d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM–d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y–d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y–d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM \\'de\\' y G – d MMM \\'de\\' y G',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM y',\n    'd': 'd–d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E d \\'de\\' MMM – E d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM \\'de\\' y G – E d MMM \\'de\\' y G',\n    'Md': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'y': 'd/M/y–d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_et = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'MM.y–MM.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd.–d. MMM',\n    'y': 'd. MMM y – d. MMM y',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.MM–dd.MM',\n    'y': 'dd.MM.y–dd.MM.y',\n    '_': 'd.M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd. MMM y G – d. MMM y G',\n    'M': 'd. MMM – d. MMM y',\n    'd': 'd.–d. MMM y',\n    '_': 'd. MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d. MMM – E, d. MMM',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE, d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d. MMM y G – E, d. MMM y G',\n    'Md': 'E, d. MMM – E, d. MMM y',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE, d. MMMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM–dd.MM',\n    'd': 'd–d',\n    'y': 'dd.MM.y–dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_eu = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y, MMM – G y, MMM',\n    'M': 'y(\\'e\\')\\'ko\\' MMM–MMM',\n    'y': 'y(\\'e\\')\\'ko\\' MMM – y(\\'e\\')\\'ko\\' MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y, MMMM – G y, MMMM',\n    'M': 'y(\\'e\\')\\'ko\\' MMMM–MMMM',\n    '_': 'y(\\'e\\')\\'ko\\' MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y/M – y/M',\n    '_': 'y/MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y(\\'e\\')\\'ko\\' MMM d – y(\\'e\\')\\'ko\\' MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y(\\'e\\')\\'ko\\' MMMM d – y(\\'e\\')\\'ko\\' MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y/M/d – y/M/d',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y(\\'e\\')\\'ko\\' MMMM d – y(\\'e\\')\\'ko\\' MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y, MMM d – G y, MMM d',\n    'M': 'y(\\'e\\')\\'ko\\' MMM d – MMM d',\n    'd': 'y(\\'e\\')\\'ko\\' MMM d–d',\n    'y': 'y(\\'e\\')\\'ko\\' MMM d – y(\\'e\\')\\'ko\\' MMM d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y(\\'e\\')\\'ko\\' MMM d, E – y(\\'e\\')\\'ko\\' MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y, MMM d, E – G y, MMM d, E',\n    'M': 'y(\\'e\\')\\'ko\\' MMM d, E – MMM d, E',\n    'dy': 'y(\\'e\\')\\'ko\\' MMM d, E – y(\\'e\\')\\'ko\\' MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'M/d – M/d',\n    'd': 'd–d',\n    'y': 'y/M/d – y/M/d',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_fa = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'LLL تا MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'LLLL تا MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y/M تا y/M',\n    '_': 'y/MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd تا d LLL',\n    'y': 'd MMM y تا d MMM y',\n    '_': 'd LLL'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd LLLL تا d LLLL',\n    'd': 'd تا d LLLL',\n    'y': 'd MMMM y تا d MMMM y',\n    '_': 'dd LLLL'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y/M/d تا y/M/d',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd تا d LLLL',\n    'y': 'd MMMM y تا d MMMM y',\n    '_': 'd LLLL'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd LLL تا d MMM y',\n    'd': 'd تا d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E d LLL تا E d LLL',\n    'y': 'E d MMM y تا E d MMM y',\n    '_': 'EEE d LLL'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E d LLL تا E d MMM y',\n    'y': 'E d MMM y تا E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'M/d تا M/d',\n    'y': 'y/M/d تا y/M/d',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_fi = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'LLL–LLLL y',\n    'y': 'LLLL y – LLLL y',\n    '_': 'LLL y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'LLL–LLLL y',\n    'y': 'LLLL y – LLLL y',\n    '_': 'LLLL y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'M': 'LLL–LLLL y',\n    'y': 'LLLL y – LLLL y',\n    '_': 'M.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'd': 'd.–d.M.',\n    'y': 'd.M.y–d.M.y',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd.–d. MMM, y G',\n    'M': 'd. MMMM – d. MMMM y',\n    'd': 'd.–d. MMMM y',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'd. MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d. MMMM – E d. MMMM',\n    'd': 'E d. – E d. MMMM',\n    'y': 'E d. MMMM y – E d. MMMM y',\n    '_': 'ccc d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d. MMM y – E d. MMM y G',\n    'M': 'E d. MMMM – E d. MMMM y',\n    'd': 'E d. – E d. MMMM y',\n    'y': 'E d. MMMM y – E d. MMMM y',\n    '_': 'EEE d. MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd.M.–d.M.',\n    'd': 'd.–d.',\n    'y': 'd.M.y–d.M.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_fil = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y – y G',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'MMM d, y – MMM d, y',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'MMMM d, y – MMMM d, y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'M/d/y – M/d/y',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'MMMM d, y – MMMM d, y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'MMM d – MMM d, y',\n    'd': 'MMM d–d, y',\n    '_': 'MMM d, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, MMM d – E, MMM d',\n    'y': 'E, MMM d, y – E, MMM d, y',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'Md': 'E, MMM d – E, MMM d, y',\n    'y': 'E, MMM d, y – E, MMM d, y',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'M/d – M/d',\n    'd': 'd–d',\n    'y': 'M/d/y – M/d/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr = {\n  YEAR_FULL: {\n    'G': 'y G \\'à\\' y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G \\'à\\' y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G \\'à\\' MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G \\'à\\' MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y G \\'à\\' M/y G',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G \\'à\\' d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM y G \\'à\\' E d MMM y G',\n    'M': 'E d MMM – E d MMM y',\n    'd': 'E d – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_fr_CA = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'y-MM GGGGG – y-MM GGGGG',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M-d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM y G – E d MMM y G',\n    'M': 'E d MMM – E d MMM y',\n    'd': 'E d – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ga = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E d MMM – E d MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E d MMM – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_gl = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM \\'de\\' y G – MMM \\'de\\' y G',\n    'M': 'MMM–MMM \\'de\\' y',\n    '_': 'MMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM \\'de\\' y G – MMMM \\'de\\' y G',\n    'M': 'MMMM–MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM/y GGGGG – MM/y GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd–d \\'de\\' MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd \\'de\\' MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd \\'de\\' MMM \\'de\\' y G – d \\'de\\' MMM \\'de\\' y G',\n    'M': 'd MMM – d MMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMMM \\'de\\' y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd/MM/y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d MMM – E, d MMM',\n    'd': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d \\'de\\' MMM \\'de\\' y G – E, d \\'de\\' MMM \\'de\\' y G',\n    'M': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'd': 'E, d MMM – E, d MMM y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM/y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_gsw = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MM – MM.y',\n    'y': 'MM.y – MM.y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd.–d. MMM',\n    'y': 'd. MMM y – d. MMM y',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.MM. – dd.MM.',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd. MMM – d. MMM y',\n    'd': 'd.–d. MMM y',\n    'y': 'd. MMM y – d. MMM y',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d. MMM – E, d. MMM',\n    'd': 'E, d. – E, d. MMM',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, d. MMM – E, d. MMM y',\n    'd': 'E, d. – E, d. MMM y',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE, d. MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM. – dd.MM.',\n    'd': 'd.–d.',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_gu = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM, y – d MMM, y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y d MMM – G y d MMM',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd–d MMM, y',\n    '_': 'd MMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y d MMM, E – G y d MMM, E',\n    'Md': 'E, d MMM – E, d MMM, y',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'EEE, d MMM, y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_haw = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_he = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM y',\n    'y': 'MMMM y–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M.y GGGGG – M.y GGGGG',\n    'M': 'M.y–M.y',\n    'y': 'M.y‏–M.y',\n    '_': 'M.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd בMMM–d בMMM',\n    'd': 'd–d בMMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd בMMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd בMMMM–d בMMMM',\n    'd': 'd–d בMMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd בMMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd.M–d.M',\n    'y': 'd.M.y – d.M.y',\n    '_': 'd.M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd בMMMM–d בMMMM',\n    'd': 'd–d בMMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd בMMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd בMMM y G – d בMMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d בMMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd בMMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'EEEE, d בMMM – EEEE, d בMMM',\n    'y': 'EEEE d MMM y – EEEE d MMM y',\n    '_': 'EEE, d בMMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d בMMM y G – E, d בMMM y G',\n    'Md': 'EEEE d MMM – EEEE d MMM y',\n    'y': 'EEEE d MMM y – EEEE d MMM y',\n    '_': 'EEE, d בMMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd.M–d.M',\n    'd': 'd–d',\n    'y': 'd.M.y – d.M.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_hi = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd MMM–d',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd MMMM–d',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd MMMM–d',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, d MMM – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_hr = {\n  YEAR_FULL: {\n    'G': 'y. G – y. G',\n    '_': 'y.'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y. – y. G',\n    '_': 'y. G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y. G – MMM y. G',\n    'M': 'LLL – LLL y.',\n    '_': 'LLL y.'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y. G – MMMM y. G',\n    'M': 'LLLL – LLLL y.',\n    '_': 'LLLL y.'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM. y. GGGGG – MM. y. GGGGG',\n    '_': 'MM. y.'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'dd. MMM – dd. MMM',\n    'd': 'dd. – dd. MMM',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'd': 'dd. – dd. MMMM',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd. MM. y. – dd. MM. y.',\n    '_': 'dd. MM.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'dd. MMMM – dd. MMMM',\n    'd': 'dd. – dd. MMMM',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'dd. MMM y. G – dd. MMM y. G',\n    'M': 'dd. MMM – dd. MMM y.',\n    'd': 'dd. – dd. MMM y.',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'd. MMM y.'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, dd. MMM – E, dd. MMM',\n    'd': 'E, dd. – E, dd. MMM',\n    'y': 'E, dd. MMM y. – E, dd. MMM y.',\n    '_': 'EEE, d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, dd. MMM y. G – E, dd. MMM y. G',\n    'M': 'E, dd. MMM – E, dd. MMM y.',\n    'd': 'E, dd. – E, dd. MMM y.',\n    'y': 'E, dd. MMM y. – E, dd. MMM y.',\n    '_': 'EEE, d. MMM y.'\n  },\n  DAY_ABBR: {\n    'M': 'dd. MM. – dd. MM.',\n    'd': 'dd. – dd.',\n    'y': 'dd. MM. y. – dd. MM. y.',\n    '_': 'd.'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_hu = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y.'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'G y.'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y. MMM–MMM',\n    '_': 'y. MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y. MMMM–MMMM',\n    '_': 'y. MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'y. MM–MM.',\n    '_': 'y. MM.'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d.',\n    'y': 'y. MMM d. – y. MMM d.',\n    '_': 'MMM d.'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d. – MMMM d.',\n    'd': 'MMMM d–d.',\n    'y': 'y. MMMM d. – y. MMMM d.',\n    '_': 'MMMM dd.'\n  },\n  MONTH_DAY_SHORT: {\n    'd': 'M. d–d.',\n    'y': 'y. MM. dd. – y. MM. dd.',\n    '_': 'M. d.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d.',\n    'y': 'y. MMMM d. – y. MMMM d.',\n    '_': 'MMMM d.'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y. MMM d. – MMM d.',\n    'd': 'y. MMM d–d.',\n    '_': 'y. MMM d.'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'MMM d., E – MMM d., E',\n    'd': 'MMM d., E – d., E',\n    'y': 'y. MMM d., E – y. MMM d., E',\n    '_': 'MMM d., EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'y. MMM d., E – MMM d., E',\n    'd': 'y. MMM d., E – d., E',\n    'y': 'y. MMM d., E – y. MMM d., E',\n    '_': 'y. MMM d., EEE'\n  },\n  DAY_ABBR: {\n    'M': 'M. d. – M. d.',\n    'd': 'd–d.',\n    'y': 'y. MM. dd. – y. MM. dd.',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_hy = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y թթ․',\n    '_': 'G y թ.'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y թ. MMM – MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'y թ. LLL'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y թ․ LLLL – LLLL',\n    '_': 'y թ․ LLLL'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM.y – GGGGG MM.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM dd – MMM dd',\n    'd': 'MMM dd–dd',\n    'y': 'dd MMM, y թ․ – dd MMM, y թ.',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'd': 'MMMM dd–dd',\n    'y': 'dd MMMM, y թ․ – dd MMMM, y թ.',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'dd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM dd – MMMM dd',\n    'd': 'MMMM dd–dd',\n    'y': 'dd MMMM, y թ․ – dd MMMM, y թ.',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G dd MMM, y թ․ – G dd MMM, y թ.',\n    'M': 'dd MMM – dd MMM, y թ.',\n    'd': 'dd–dd MMM, y թ.',\n    'y': 'dd MMM, y թ․ – dd MMM, y թ.',\n    '_': 'd MMM, y թ.'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, MMM dd – E, MMM dd',\n    'y': 'E, d MMM, y – E, d MMM, y թ.',\n    '_': 'd MMM, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E, d MMM – G E, d MMM, y թ.',\n    'Md': 'E, d MMM – E, d MMM, y թ.',\n    'y': 'E, d MMM, y – E, d MMM, y թ.',\n    '_': 'y թ. MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM – dd.MM',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_id = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d MMM y G – E, d MMM y G',\n    'Md': 'E, d MMM – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_in = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d MMM y G – E, d MMM y G',\n    'Md': 'E, d MMM – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_is = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M.y – M.y',\n    '_': 'MM. y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd.–d. MMM',\n    'y': 'd. MMM y – d. MMM y',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd.M.–d.M.',\n    'y': 'd.M.y – d.M.y',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y – d. MMMM y',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd. MMM – d. MMM y',\n    'd': 'd.–d. MMM y',\n    '_': 'd. MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d. MMM – E, d. MMM',\n    'd': 'E, d. – E, d. MMM',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE, d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, d. MMM – E, d. MMM y',\n    'd': 'E, d. – E, d. MMM y',\n    'y': 'E, d. MMM y – E, d. MMM y',\n    '_': 'EEE, d. MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd.M.–d.M.',\n    'd': 'd.–d.',\n    'y': 'd.M.y – d.M.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_it = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'dd MMM – dd MMM',\n    'd': 'dd–dd MMM',\n    'y': 'dd MMM y – dd MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'dd MMMM – dd MMMM',\n    'd': 'dd–dd MMMM',\n    'y': 'dd MMMM y – dd MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'dd MMMM – dd MMMM',\n    'd': 'dd–dd MMMM',\n    'y': 'dd MMMM y – dd MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'dd MMM – dd MMM y',\n    'd': 'dd–dd MMM y',\n    'y': 'dd MMM y – dd MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E dd MMM – E dd MMM',\n    'd': 'E dd – E dd MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM y G – E d MMM y G',\n    'M': 'E d MMM – E d MMM y',\n    'd': 'E d – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_iw = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM y',\n    'y': 'MMMM y–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M.y GGGGG – M.y GGGGG',\n    'M': 'M.y–M.y',\n    'y': 'M.y‏–M.y',\n    '_': 'M.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd בMMM–d בMMM',\n    'd': 'd–d בMMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd בMMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd בMMMM–d בMMMM',\n    'd': 'd–d בMMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd בMMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd.M–d.M',\n    'y': 'd.M.y – d.M.y',\n    '_': 'd.M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd בMMMM–d בMMMM',\n    'd': 'd–d בMMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd בMMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd בMMM y G – d בMMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d בMMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd בMMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'EEEE, d בMMM – EEEE, d בMMM',\n    'y': 'EEEE d MMM y – EEEE d MMM y',\n    '_': 'EEE, d בMMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d בMMM y G – E, d בMMM y G',\n    'Md': 'EEEE d MMM – EEEE d MMM y',\n    'y': 'EEEE d MMM y – EEEE d MMM y',\n    '_': 'EEE, d בMMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd.M–d.M',\n    'd': 'd–d',\n    'y': 'd.M.y – d.M.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ja = {\n  YEAR_FULL: {\n    'G': 'Gy年～Gy年',\n    '_': 'y年'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'Gy年～y年',\n    '_': 'Gy年'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'Gy年M月～Gy年M月',\n    'M': 'y年M月～M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'Gy年M月～Gy年M月',\n    'M': 'y年M月～M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'Gy/MM～Gy/MM',\n    '_': 'y/MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'M月d日～d日',\n    'y': 'y年M月d日～y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'M月d日～M月d日',\n    'd': 'M月d日～d日',\n    'y': 'y年M月d日～y年M月d日',\n    '_': 'M月dd日'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM/dd～MM/dd',\n    'y': 'y/MM/dd～y/MM/dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'M月d日～d日',\n    'y': 'y年M月d日～y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'Gy年M月d日～Gy年M月d日',\n    'M': 'y年M月d日～M月d日',\n    'd': 'y年M月d日～d日',\n    '_': 'y年M月d日'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'M月d日(E)～M月d日(E)',\n    'd': 'M月d日(E)～d日(E)',\n    'y': 'y年M月d日(E)～y年M月d日(E)',\n    '_': 'M月d日(EEE)'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'Gy年M月d日(E)～Gy年M月d日(E)',\n    'M': 'y年M月d日(E)～M月d日(E)',\n    'd': 'y年M月d日(E)～d日(E)',\n    'y': 'y年M月d日(E)～y年M月d日(E)',\n    '_': 'y年M月d日(EEE)'\n  },\n  DAY_ABBR: {\n    'M': 'MM/dd～MM/dd',\n    'y': 'y/MM/dd～y/MM/dd',\n    '_': 'd日'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ka = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'MMM. y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM, y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'MMMM, y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'dd MMM. y – d MMM. y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'dd MMMM. y – d MMMM. y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.MM. – dd.MM.',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd.M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'dd MMMM. y – d MMMM. y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'dd MMM. – dd MMM. y',\n    'd': 'd–d MMM, y',\n    'y': 'dd MMM. y – d MMM. y',\n    '_': 'd MMM. y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d MMM – E, d MMM',\n    'd': 'E, d – E, d MMM',\n    'y': 'E, d MMM. y – E, d MMM. y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, d MMM. – E, d MMM. y',\n    'y': 'E, d MMM. y – E, d MMM. y',\n    '_': 'EEE, d MMM. y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM. – dd.MM.',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_kk = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'G y \\'ж\\'.'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y \\'ж\\'. MMM–MMM',\n    'y': 'y \\'ж\\'. MMM – y \\'ж\\'. MMM',\n    '_': 'y \\'ж\\'. MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y \\'ж\\'. MMMM – MMMM',\n    'y': 'y \\'ж\\'. MMMM – y \\'ж\\'. MMMM',\n    '_': 'y \\'ж\\'. MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'MM.y – MM.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd–d MMM',\n    'y': 'y \\'ж\\'. d MMM – y \\'ж\\'. d MMM',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'y \\'ж\\'. d MMMM – y \\'ж\\'. d MMMM',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.MM – dd.MM',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'dd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'y \\'ж\\'. d MMMM – y \\'ж\\'. d MMMM',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y \\'ж\\'. d MMM – G y \\'ж\\'. d MMM',\n    'M': 'y \\'ж\\'. d MMM – d MMM',\n    'd': 'y \\'ж\\'. d–d MMM',\n    'y': 'y \\'ж\\'. d MMM – y \\'ж\\'. d MMM',\n    '_': 'y \\'ж\\'. d MMM'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'd MMM, E – d MMM, E',\n    'y': 'y \\'ж\\'. d MMM, E – y \\'ж\\'. d MMM, E',\n    '_': 'd MMM, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y \\'ж\\'. d MMM, E – G y \\'ж\\'. d MMM, E',\n    'M': 'y \\'ж\\'. d MMM, E – d MMM, E',\n    'dy': 'y \\'ж\\'. d MMM, E – y \\'ж\\'. d MMM, E',\n    '_': 'y \\'ж\\'. d MMM, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM – dd.MM',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_km = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y – y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM​ y',\n    'y': 'MMM y – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/M – d/M',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E d MMM – E d MMM',\n    'y': 'E dd-MM-y – E dd MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E dd MMM y – E dd MMM y',\n    'y': 'E dd-MM-y – E dd MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd – d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_kn = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'MMM d – d',\n    'y': 'd, MMM, y – d, MMM, y',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'MMMM d – d',\n    'y': 'd, MMMM, y – d, MMMM, y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'M/d – M/d',\n    'y': 'M/d/y – M/d/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d – d',\n    'y': 'd, MMMM, y – d, MMMM, y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y',\n    'd': 'MMM d–d,y',\n    'y': 'd, MMM, y – d, MMM, y',\n    '_': 'MMM d,y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'd MMM, y E – d MMM, y E',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, MMM d – E, MMMM d, y',\n    'd': 'E, MMM d – E, MMM d,y',\n    'y': 'd MMM, y E – d MMM, y E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'M/d – M/d',\n    'd': 'd–d',\n    'y': 'M/d/y – M/d/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ko = {\n  YEAR_FULL: {\n    'G': 'G y년 ~ G y년',\n    '_': 'y년'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y년~y년',\n    '_': 'G y년'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y년 MMM ~ G y년 MMM',\n    'M': 'y년 M월~M월',\n    'y': 'y년 M월 ~ y년 M월',\n    '_': 'y년 MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y년 MMMM ~ G y년 MMMM',\n    'M': 'y년 MMMM ~ MMMM',\n    '_': 'y년 MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y년 M월 ~ GGGGG y년 M월',\n    'My': 'y. M ~ y. M',\n    '_': 'y. M.'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'M월 d일 ~ M월 d일',\n    'd': 'MMM d일~d일',\n    'y': 'y년 M월 d일 ~ y년 M월 d일',\n    '_': 'MMM d일'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'M월 d일 ~ M월 d일',\n    'd': 'MMMM d일~d일',\n    'y': 'y년 M월 d일 ~ y년 M월 d일',\n    '_': 'MMMM dd일'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'M. d ~ M. d',\n    'y': 'y. M. d. ~ y. M. d.',\n    '_': 'M. d.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'M월 d일 ~ M월 d일',\n    'd': 'MMMM d일~d일',\n    'y': 'y년 M월 d일 ~ y년 M월 d일',\n    '_': 'MMMM d일'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y년 MMM d일 ~ G y년 MMM d일',\n    'M': 'y년 M월 d일 ~ M월 d일',\n    'd': 'y년 M월 d일~d일',\n    'y': 'y년 M월 d일 ~ y년 M월 d일',\n    '_': 'y년 MMM d일'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'M월 d일 (E) ~ M월 d일 (E)',\n    'd': 'M월 d일 (E) ~ d일 (E)',\n    'y': 'y년 M월 d일 (E) ~ y년 M월 d일 (E)',\n    '_': 'MMM d일 (EEE)'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y년 MMM d일 E요일 ~ G y년 MMM d일 E요일',\n    'M': 'y년 M월 d일 (E) ~ M월 d일 (E)',\n    'd': 'y년 M월 d일 (E) ~ d일 (E)',\n    'y': 'y년 M월 d일 (E) ~ y년 M월 d일 (E)',\n    '_': 'y년 MMM d일 (EEE)'\n  },\n  DAY_ABBR: {\n    'M': 'M. d ~ M. d',\n    'd': 'd일~d일',\n    'y': 'y. M. d. ~ y. M. d.',\n    '_': 'd일'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ky = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'G y-\\'ж\\'.'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y-\\'ж\\'.',\n    'y': 'MMM y-\\'ж\\'. - MMM y-\\'ж\\'.',\n    '_': 'y-\\'ж\\'. MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM, y-\\'ж\\'.',\n    'y': 'MMMM, y-\\'ж\\'. – MMMM, y-\\'ж\\'.',\n    '_': 'y-\\'ж\\'., MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'y-MM – y-MM',\n    'y': 'MM.y – MM.y',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd-MMM – d-MMM',\n    'd': 'd–d-MMM',\n    'y': 'd-MMM y-\\'ж\\'. - d-MMM y-\\'ж\\'.',\n    '_': 'd-MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd-MMMM – d-MMMM',\n    'd': 'd–d-MMMM',\n    'y': 'd-MMMM y-\\'ж\\'. - d-MMMM y-\\'ж\\'.',\n    '_': 'dd-MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.MM – dd.MM',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'dd-MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd-MMMM – d-MMMM',\n    'd': 'd–d-MMMM',\n    'y': 'd-MMMM y-\\'ж\\'. - d-MMMM y-\\'ж\\'.',\n    '_': 'd-MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd-MMM – d-MMM y-\\'ж\\'.',\n    'd': 'd–d-MMM y-\\'ж\\'.',\n    'y': 'd-MMM y-\\'ж\\'. - d-MMM y-\\'ж\\'.',\n    '_': 'y-\\'ж\\'. d-MMM'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'd-MMM, E – d-MMM, E',\n    'y': 'y-\\'ж\\'., d-MMM, E – y-\\'ж\\'., d-MMM, E',\n    '_': 'd-MMM, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'y-\\'ж\\'., d-MMM, E – d-MMM E',\n    'd': 'y-\\'ж\\'., d-MMM, E – d-MMM, E',\n    'y': 'y-\\'ж\\'., d-MMM, E – y-\\'ж\\'., d-MMM, E',\n    '_': 'y-\\'ж\\'. d-MMM, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM – dd.MM',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ln = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_lo = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MM/y – G MM/y',\n    'My': 'MM/y – MM/y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MM/y – G MM/y',\n    'M': 'MM/y – MM',\n    'y': 'MM/y – MM/y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM/y – GGGGG MM/y',\n    'y': 'y/MM – y/MM',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'Md': 'd/MM – d/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'Md': 'd/MM – d/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'Md': 'd/MM – d/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G dd/MM/y– G dd/MM/y',\n    'M': 'd/MM/y – d/MM',\n    'd': 'd/MM/y – d/MM/y',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d/MM – E, d/MM',\n    'y': 'E, dd/MM/y – E, dd/MM/y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E, dd/MM/y – G E, dd/MM/y',\n    'Mdy': 'E, dd/MM/y – E, dd/MM/y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_lt = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y \\'m\\'. G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'y-MM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y LLLL–LLLL',\n    'y': 'y LLLL – y LLLL',\n    '_': 'y \\'m\\'. LLLL'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd \\'d\\'.'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d \\'d\\'.'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'y-MM-dd'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MM-dd, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y-MM-dd, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'dd–dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'dd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_lv = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y.–y.',\n    '_': 'y. \\'g\\'.'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'G y. \\'g\\'.'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y. \\'gada\\' MMM–MMM',\n    'y': 'y. \\'gada\\' MMM – y. \\'gada\\' MMM',\n    '_': 'y. \\'g\\'. MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y. \\'gada\\' MMMM – MMMM',\n    'y': 'y. \\'gada\\' MMMM – y. \\'gada\\' MMMM',\n    '_': 'y. \\'g\\'. MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'MM.y.–MM.y.',\n    '_': 'MM.y.'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd. MMM – d. MMM',\n    'd': 'd.–d. MMM',\n    'y': 'y. \\'gada\\' d. MMM – y. \\'gada\\' d. MMM',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'y. \\'gada\\' d. MMMM – y. \\'gada\\' d. MMMM',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.MM.–dd.MM.',\n    'y': 'dd.MM.y.–dd.MM.y.',\n    '_': 'dd.MM.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd. MMMM – d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'y. \\'gada\\' d. MMMM – y. \\'gada\\' d. MMMM',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y. \\'gada\\' d. MMM – d. MMM',\n    'd': 'y. \\'gada\\' d.–d. MMM',\n    'y': 'y. \\'gada\\' d. MMM – y. \\'gada\\' d. MMM',\n    '_': 'y. \\'g\\'. d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d. MMM – E, d. MMM',\n    'y': 'E, y. \\'gada\\' d. MMM – E, y. \\'gada\\' d. MMM',\n    '_': 'EEE, d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, y. \\'gada\\' d. MMM – E, y. \\'gada\\' d. MMM',\n    'y': 'E, y. \\'gada\\' d. MMM – E, y. \\'gada\\' d. MMM',\n    '_': 'EEE, y. \\'g\\'. d. MMM'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM.–dd.MM.',\n    'd': 'd.–d.',\n    'y': 'dd.MM.y.–dd.MM.y.',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_mk = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y – y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y – y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'MMM y \\'г\\'.'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'MMMM y \\'г\\'.'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M.y – M.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'dd MMM – dd MMM',\n    'd': 'dd – dd MMM',\n    'y': 'dd MMM y – dd MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'dd MMMM – dd MMMM',\n    'd': 'dd – dd MMMM',\n    'y': 'dd MMMM y – dd MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.M – dd.M',\n    'y': 'dd.M.y – dd.M.y',\n    '_': 'd.M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'dd MMMM – dd MMMM',\n    'd': 'dd – dd MMMM',\n    'y': 'dd MMMM y – dd MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'dd MMM – dd MMM y',\n    'd': 'dd – dd MMM y',\n    'y': 'dd MMM y – dd MMM y',\n    '_': 'd MMM y \\'г\\'.'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, dd MMM – E, dd MMM',\n    'd': 'E, dd – E, dd MMM',\n    'y': 'E, dd MMM y – E, dd MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, dd MMM – E, dd MMM y',\n    'd': 'E, dd – E, dd MMM y',\n    'y': 'E, dd MMM y – E, dd MMM y',\n    '_': 'EEE, d MMM y \\'г\\'.'\n  },\n  DAY_ABBR: {\n    'M': 'dd.M – dd.M',\n    'd': 'd – d',\n    'y': 'dd.M.y – dd.M.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ml = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y – y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM – MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d – d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d – d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/M – d/M',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d – d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d – d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd – d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_mn = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y \\'оны\\' MMMMM – MMMMM \\'сар\\'',\n    'y': 'y \\'оны\\' MMMMM \\'сар\\' – y \\'оны\\' MMMMM \\'сар\\'',\n    '_': 'y \\'оны\\' MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y \\'оны\\' MMMMM – MMMMM \\'сар\\'',\n    'y': 'y \\'оны\\' MMMMM \\'сар\\' – y \\'оны\\' MMMMM \\'сар\\'',\n    '_': 'y \\'оны\\' MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'y \\'оны\\' MMMMM–MMMMM \\'сар\\'',\n    'y': 'y \\'оны\\' MMMMM \\'сар\\' – y \\'оны\\' MMMMM \\'сар\\'',\n    '_': 'y MMMMM'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMMMM/d – MMMMM/d',\n    'd': 'MMMMM/d – d',\n    'y': 'y \\'оны\\' MMMMM/dd – y \\'оны\\' MMMMM/dd',\n    '_': 'MMM\\'ын\\' d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMMM/d – MMMMM/d',\n    'd': 'MMMMM/d – d',\n    'y': 'y \\'оны\\' MMMMM/dd – y \\'оны\\' MMMMM/dd',\n    '_': 'MMMM\\'ын\\' dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MMMMM/d – MMMMM/d',\n    'y': 'y \\'оны\\' MMMMM/dd – y \\'оны\\' MMMMM/dd',\n    '_': 'MMMMM/dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMMM/d – MMMMM/d',\n    'd': 'MMMMM/d – d',\n    'y': 'y \\'оны\\' MMMMM/dd – y \\'оны\\' MMMMM/dd',\n    '_': 'MMMM\\'ын\\' d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y \\'оны\\' MMMMM/dd – MMMMM/dd',\n    'd': 'y \\'оны\\' MMMMM/dd – dd',\n    'y': 'y \\'оны\\' MMMMM/dd – y \\'оны\\' MMMMM/dd',\n    '_': 'y \\'оны\\' MMM\\'ын\\' d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMMMM/d E – MMMMM/d E',\n    'y': 'y \\'оны\\' MMMMM/dd E – y \\'оны\\' MMMMM/dd E',\n    '_': 'MMM\\'ын\\' d. EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y \\'оны\\' MMMMM/dd E – MMMMM/dd E',\n    'y': 'y \\'оны\\' MMMMM/dd E – y \\'оны\\' MMMMM/dd E',\n    '_': 'y \\'оны\\' MMM\\'ын\\' d. EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MMMMM/d – MMMMM/d',\n    'y': 'y \\'оны\\' MMMMM/dd – y \\'оны\\' MMMMM/dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_mo = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM.y GGGGG – MM.y GGGGG',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'dd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d MMM y G – E, d MMM y G',\n    'Md': 'E, d MMM – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM – dd.MM',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_mr = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM, y – d MMM, y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd – d MMM, y',\n    '_': 'd MMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, d MMM – E, d MMM, y',\n    'd': 'E, d MMM y – E, d MMM, y',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'EEE, d, MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ms = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/M – d/M',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd-M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d MMM y G – E, d MMM y G',\n    'Md': 'E, d MMM – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_mt = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'MM/y – MM/y',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'ta\\'’ MMM – d \\'ta\\'’ MMM',\n    'd': 'd – d MMM',\n    'y': 'd MMM, y – d MMM, y',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'ta\\'’ MMMM – d \\'ta\\'’ MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'dd \\'ta\\'’ MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'd \\'ta\\'’ MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'd – d MMM y',\n    'y': 'd MMM, y – d MMM, y',\n    '_': 'd \\'ta\\'’ MMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d \\'ta\\'’ MMM – E, d \\'ta\\'’ MMM',\n    'd': 'E, d – E d MMM',\n    'y': 'E, d \\'ta\\'’ MMM y – E, d \\'ta\\'’ MMM y',\n    '_': 'EEE, d \\'ta\\'’ MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, d \\'ta\\'’ MMM – E, d \\'ta\\'’ MMM y',\n    'd': 'E, d MMM – E, d MMM, y',\n    'y': 'E, d \\'ta\\'’ MMM y – E, d \\'ta\\'’ MMM y',\n    '_': 'EEE, d \\'ta\\'’ MMM, y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_my = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y – y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM – MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM – MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM   ',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d – d',\n    'y': 'y၊ MMM d – y၊ MMM d',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d – d',\n    'y': 'y၊ MMMM d – y၊ MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d – d',\n    'y': 'y၊ MMMM d – y၊ MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d   ',\n    'M': 'y၊ MMM d – MMM d',\n    'd': 'y၊ MMM d – d',\n    '_': 'y၊ MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d၊ E – MMM d၊ E',\n    'y': 'y၊ MMM d၊ EEEE – y၊ MMM d၊ EEEE',\n    '_': 'MMM d၊ EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y၊ MMM d၊ EEEE – MMM d၊ EEEE',\n    'y': 'y၊ MMM d၊ EEEE – y၊ MMM d၊ EEEE',\n    '_': 'y၊ MMM d၊ EEE'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_nb = {\n  YEAR_FULL: {\n    'G': 'y G–y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G–MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G–MMMM y G',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM.y GGGGG–MM.y GGGGG',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd.–d. MMM',\n    'y': 'd. MMM y–d. MMM y',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM–d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y–d. MMMM y',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.MM.–dd.MM.',\n    'y': 'dd.MM.y–dd.MM.y',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y–d. MMMM y',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd. MMM y G–d. MMM y G',\n    'M': 'd. MMM–d. MMM y',\n    'd': 'd.–d. MMM y',\n    '_': 'd. MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d. MMM–E d. MMM',\n    'd': 'E d.–E d. MMM',\n    'y': 'E d. MMM y–E d. MMM y',\n    '_': 'EEE d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d. MMM y G–E d. MMM y G',\n    'M': 'E d. MMM–E d. MMM y',\n    'd': 'E d.–E d. MMM y',\n    'y': 'E d. MMM y–E d. MMM y',\n    '_': 'EEE d. MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM.–dd.MM.',\n    'y': 'dd.MM.y–dd.MM.y',\n    '_': 'd.'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ne = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_nl = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M-y GGGGG – M-y GGGGG',\n    'My': 'MM-y – MM-y',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd-MM – dd-MM',\n    'y': 'dd-MM-y – dd-MM-y',\n    '_': 'd-M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d MMM y G – E d MMM y G',\n    'M': 'E d MMM – E d MMM y',\n    'd': 'E d – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd-MM – dd-MM',\n    'd': 'd–d',\n    'y': 'dd-MM-y – dd-MM-y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_no = {\n  YEAR_FULL: {\n    'G': 'y G–y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G–MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G–MMMM y G',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM.y GGGGG–MM.y GGGGG',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd.–d. MMM',\n    'y': 'd. MMM y–d. MMM y',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM–d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y–d. MMMM y',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.MM.–dd.MM.',\n    'y': 'dd.MM.y–dd.MM.y',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y–d. MMMM y',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd. MMM y G–d. MMM y G',\n    'M': 'd. MMM–d. MMM y',\n    'd': 'd.–d. MMM y',\n    '_': 'd. MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d. MMM–E d. MMM',\n    'd': 'E d.–E d. MMM',\n    'y': 'E d. MMM y–E d. MMM y',\n    '_': 'EEE d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d. MMM y G–E d. MMM y G',\n    'M': 'E d. MMM–E d. MMM y',\n    'd': 'E d.–E d. MMM y',\n    'y': 'E d. MMM y–E d. MMM y',\n    '_': 'EEE d. MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM.–dd.MM.',\n    'y': 'dd.MM.y–dd.MM.y',\n    '_': 'd.'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_no_NO = exports.DateIntervalPatterns_no;\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_or = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    'y': 'y MMM – y MMM',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM–MMMM',\n    'y': 'y MMMM – y MMMM',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y-MM – y-MM',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'MM-dd – MM-dd',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y MMM d, E – MMM d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'MM-dd – MM-dd',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_pa = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, d MMM – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_pl = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y–y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'LLL–LLL y',\n    '_': 'LLL y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'LLLL–LLLL y',\n    '_': 'LLLL y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M.y GGGGG – M.y GGGGG',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y–d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd.MM–dd.MM',\n    'y': 'dd.MM.y–dd.MM.y',\n    '_': 'd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM–d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM–E, d MMM',\n    'y': 'E, d MMM y–E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d MMM y G – E, d MMM y G',\n    'My': 'E, d MMM y–E, d MMM y',\n    'd': 'E, d–E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM–dd.MM',\n    'y': 'dd.MM.y–dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_pt = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y – y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y – y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM – MMM \\'de\\' y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MMM \\'de\\' y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM – MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y – MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM/y – GGGGG MM/y',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd – d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd – d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd – d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d \\'de\\' MMM y – G d \\'de\\' MMM y',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd – d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd \\'de\\' MMM \\'de\\' y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM',\n    'd': 'E, d – E, d \\'de\\' MMM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E, d \\'de\\' MMM y – G E, d \\'de\\' MMM y',\n    'M': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'd': 'E, d – E, d \\'de\\' MMM \\'de\\' y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d \\'de\\' MMM \\'de\\' y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd – d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_pt_BR = exports.DateIntervalPatterns_pt;\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_pt_PT = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y – y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM \\'de\\' y',\n    'y': 'MMM \\'de\\' y – MMM \\'de\\' y',\n    '_': 'MM/y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM – MMMM \\'de\\' y',\n    'y': 'MMMM \\'de\\' y – MMMM \\'de\\' y',\n    '_': 'MMMM \\'de\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM/y – GGGGG MM/y',\n    'My': 'MM/y – MM/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM',\n    'd': 'd–d \\'de\\' MMM',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'dd \\'de\\' MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd \\'de\\' MMMM – d \\'de\\' MMMM',\n    'd': 'd–d \\'de\\' MMMM',\n    'y': 'd \\'de\\' MMMM \\'de\\' y – d \\'de\\' MMMM \\'de\\' y',\n    '_': 'd \\'de\\' MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d \\'de\\' MMM y – G d \\'de\\' MMM y',\n    'M': 'd \\'de\\' MMM – d \\'de\\' MMM \\'de\\' y',\n    'd': 'd–d \\'de\\' MMM \\'de\\' y',\n    'y': 'd \\'de\\' MMM \\'de\\' y – d \\'de\\' MMM \\'de\\' y',\n    '_': 'd/MM/y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'ccc, dd/MM – ccc, dd/MM',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G E, d \\'de\\' MMM y – G E, d \\'de\\' MMM y',\n    'M': 'E, d \\'de\\' MMM – E, d \\'de\\' MMM \\'de\\' y',\n    'd': 'E, dd/MM – E, dd/MM/y',\n    'y': 'E, d \\'de\\' MMM \\'de\\' y – E, d \\'de\\' MMM \\'de\\' y',\n    '_': 'EEE, d/MM/y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ro = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM.y GGGGG – MM.y GGGGG',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'dd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d MMM y G – E, d MMM y G',\n    'Md': 'E, d MMM – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM – dd.MM',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ru = {\n  YEAR_FULL: {\n    'G': 'y \\'г\\'. G – y \\'г\\'. G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y–y \\'гг\\'. G',\n    '_': 'y \\'г\\'. G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'LLL y \\'г\\'. G – LLL y \\'г\\'. G',\n    'M': 'LLL – LLL y \\'г\\'.',\n    '_': 'LLL y \\'г\\'.'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'LLLL y \\'г\\'. G – LLLL y \\'г\\'. G',\n    'M': 'LLLL – LLLL y \\'г\\'.',\n    '_': 'LLLL y \\'г\\'.'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM.y G – MM.y G',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y \\'г\\'. – d MMM y \\'г\\'.',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y \\'г\\'. – d MMMM y \\'г\\'.',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'dd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y \\'г\\'. – d MMMM y \\'г\\'.',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y \\'г\\'. G – d MMM y \\'г\\'. G',\n    'M': 'd MMM – d MMM y \\'г\\'.',\n    'd': 'd–d MMM y \\'г\\'.',\n    '_': 'd MMM y \\'г\\'.'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'ccc, d MMM y \\'г\\'. – ccc, d MMM y \\'г\\'.',\n    '_': 'ccc, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'ccc, d MMM y \\'г\\'. G – ccc, d MMM y \\'г\\'. G',\n    'M': 'ccc, d MMM – ccc, d MMM y \\'г\\'.',\n    'd': 'ccc, d – ccc, d MMM y \\'г\\'.',\n    'y': 'ccc, d MMM y \\'г\\'. – ccc, d MMM y \\'г\\'.',\n    '_': 'EEE, d MMM y \\'г\\'.'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM – dd.MM',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_sh = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y.'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y. G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y.',\n    '_': 'MMM y.'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y.',\n    '_': 'MMMM y.'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'M – M, y',\n    'y': 'M.y. – M.y.',\n    '_': 'MM.y.'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'dd. MMM – dd. MMM',\n    'd': 'dd.–dd. MMM',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'd': 'dd.–dd. MMMM',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd.M – d.M',\n    'y': 'd.M.y. – d.M.y.',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'dd. MMMM – dd. MMMM',\n    'd': 'dd.–dd. MMMM',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'dd. MMM – dd. MMM y.',\n    'd': 'dd.–dd. MMM y.',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'd. MMM y.'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, dd. MMM – E, dd. MMM',\n    'd': 'E, dd. – E, dd. MMM',\n    'y': 'E, dd. MMM y. – E, dd. MMM y.',\n    '_': 'EEE d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, dd. MMM – E, dd. MMM y.',\n    'd': 'E, dd. – E, dd. MMM y.',\n    'y': 'E, dd. MMM y. – E, dd. MMM y.',\n    '_': 'EEE, d. MMM y.'\n  },\n  DAY_ABBR: {\n    'M': 'd.M – d.M',\n    'd': 'd–d',\n    'y': 'd.M.y. – d.M.y.',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_si = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y MMM–MMM',\n    '_': 'y MMM'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y MMMM – MMMM',\n    '_': 'y MMMM'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'y MMM d – y MMM d',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y-M-d – y-M-d',\n    '_': 'M-d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'y MMMM d – y MMMM d',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y MMM d – MMM d',\n    'd': 'y MMM d – d',\n    '_': 'y MMM d'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'MMM-dd, E – MMM-dd, E',\n    'd': 'MMM-d, E – MMM-d, E',\n    'y': 'y MMM d, E – y MMM d, E',\n    '_': 'MMM d EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Mdy': 'y MMM d, E – y MMM d, E',\n    '_': 'y MMM d, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'M-d – M-d',\n    'd': 'd–d',\n    'y': 'y-M-d – y-M-d',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_sk = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'LLLL y G – LLLL y G',\n    'M': 'M – M/y',\n    '_': 'M/y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'LLLL y G – LLLL y G',\n    'M': 'LLLL – LLLL y',\n    '_': 'LLLL y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd. – d. M.',\n    'y': 'd. M. y – d. M. y',\n    '_': 'd. M.'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. M. – d. M.',\n    'd': 'd. – d. M.',\n    'y': 'd. M. y – d. M. y',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'd': 'd. M. – d. M.',\n    'y': 'd. M. y – d. M. y',\n    '_': 'd. M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd. M. – d. M.',\n    'd': 'd. – d. M.',\n    'y': 'd. M. y – d. M. y',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd. M. y G – d. M. y G',\n    'M': 'd. M. – d. M. y',\n    'd': 'd. – d. M. y',\n    '_': 'd. M. y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d. M. – E d. M.',\n    'd': 'E d. – E d. M.',\n    'y': 'E d. M. y – E d. M. y',\n    '_': 'EEE d. M.'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E d. M. y G – E d. M. y G',\n    'M': 'E d. M. – E d. M. y',\n    'd': 'E d. – E d. M. y',\n    'y': 'E d. M. y – E d. M. y',\n    '_': 'EEE d. M. y'\n  },\n  DAY_ABBR: {\n    'M': 'd. M. – d. M.',\n    'y': 'd. M. y – d. M. y',\n    '_': 'd.'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_sl = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'M.–M. y',\n    'y': 'M. y–M. y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd.–d. MMM',\n    'y': 'd. MMM y–d. MMM y',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd. MMMM–d. MMMM',\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y–d. MMMM y',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'd': 'd.–d. M.',\n    'y': 'd. M. y–d. M. y',\n    '_': 'd. M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd.–d. MMMM',\n    'y': 'd. MMMM y–d. MMMM y',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd. MMM–d. MMM y',\n    'd': 'd.–d. MMM y',\n    '_': 'd. MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d. MMM–E, d. MMM',\n    'd': 'E, d.–E, d. MMM',\n    'y': 'E, d. MMM y–E, d. MMM y',\n    '_': 'EEE, d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, d. MMM–E, d. MMM y',\n    'y': 'E, d. MMM y–E, d. MMM y',\n    '_': 'EEE, d. MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd. M.–d. M.',\n    'y': 'd. M. y–d. M. y',\n    '_': 'd.'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_sq = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y – y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    'y': 'MMM y – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM – MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M.y GGGGG – M.y GGGGG',\n    'My': 'M.y – M.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd.M – d.M',\n    'y': 'd.M.y – d.M.y',\n    '_': 'd.M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM y',\n    'd': 'd – d MMM y',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d MMM y G – E, d MMM y G',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd.M – d.M',\n    'd': 'd – d',\n    'y': 'd.M.y – d.M.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_sr = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y.'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y. G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y.',\n    '_': 'MMM y.'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y.',\n    '_': 'MMMM y.'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'M – M, y',\n    'y': 'M.y. – M.y.',\n    '_': 'MM.y.'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'dd. MMM – dd. MMM',\n    'd': 'dd.–dd. MMM',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'd. MMM'\n  },\n  MONTH_DAY_FULL: {\n    'd': 'dd.–dd. MMMM',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'dd. MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd.M – d.M',\n    'y': 'd.M.y. – d.M.y.',\n    '_': 'd.M.'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'dd. MMMM – dd. MMMM',\n    'd': 'dd.–dd. MMMM',\n    'y': 'dd. MMMM y. – dd. MMMM y.',\n    '_': 'd. MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'dd. MMM – dd. MMM y.',\n    'd': 'dd.–dd. MMM y.',\n    'y': 'dd. MMM y. – dd. MMM y.',\n    '_': 'd. MMM y.'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, dd. MMM – E, dd. MMM',\n    'd': 'E, dd. – E, dd. MMM',\n    'y': 'E, dd. MMM y. – E, dd. MMM y.',\n    '_': 'EEE d. MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, dd. MMM – E, dd. MMM y.',\n    'd': 'E, dd. – E, dd. MMM y.',\n    'y': 'E, dd. MMM y. – E, dd. MMM y.',\n    '_': 'EEE, d. MMM y.'\n  },\n  DAY_ABBR: {\n    'M': 'd.M – d.M',\n    'd': 'd–d',\n    'y': 'd.M.y. – d.M.y.',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_sr_Latn = exports.DateIntervalPatterns_sr;\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_sv = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'y-MM – MM',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y–d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y–d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'M': 'd/M–d/M',\n    'd': 'd–d/M',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y–d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM–d MMM y',\n    'd': 'd–d MMM y',\n    'y': 'd MMM y–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E dd MMM y–E dd MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E dd MMM–E dd MMM y',\n    'y': 'E dd MMM y–E dd MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M–d/M',\n    'd': 'd–d',\n    'y': 'y-MM-dd – y-MM-dd',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_sw = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'MMM d – MMM d',\n    'd': 'MMM d–d',\n    'y': 'MMM d y – MMM d y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'MMMM d y – MMMM d y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'MMMM d y – MMMM d y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'Md': 'MMM d – d, y',\n    'y': 'MMM d y – MMM d y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'MMM d, E – MMM d, E',\n    'y': 'E, MMM d y – E, MMM d y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'M': 'E, MMM d– E, MMM d y',\n    'd': 'E, MMM d – E, MMM d y',\n    'y': 'E, MMM d y – E, MMM d y',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ta = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'd MMM – d MMM',\n    'd': 'd – d MMM',\n    'y': 'd MMM, y – d MMM, y',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd – d MMM, y',\n    '_': 'd MMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'MMM d, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, d MMM – E, d MMM, y',\n    'y': 'E, d MMM, y – E, d MMM, y',\n    '_': 'EEE, d MMM, y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_te = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG M/y – GGGGG M/y',\n    'My': 'M/y – M/y',\n    '_': 'MM-y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM, y – d MMM, y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM, y – d MMMM, y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d MMM y – G d MMM y',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd–d MMM, y',\n    'y': 'd MMM, y – d MMM, y',\n    '_': 'd, MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'd MMM, E – d MMM, E',\n    'y': 'd MMM, y, E – d MMM, y, E',\n    '_': 'd MMM, EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d MMM, y, E – G d MMM, y, E',\n    'Md': 'd MMM, E – d MMM, y, E',\n    'y': 'd MMM, y, E – d MMM, y, E',\n    '_': 'd MMM, y, EEE'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_th = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    'y': 'MMMM y – MMMM y',\n    '_': 'MMMM G y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'MMMM d–d',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E d MMM – E d MMM',\n    'd': 'E d – E d MMM',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E d MMM – E d MMM y',\n    'y': 'E d MMM y – E d MMM y',\n    '_': 'EEE d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_tl = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y – y G',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'MMM d, y – MMM d, y',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'MMMM d, y – MMMM d, y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'M/d/y – M/d/y',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'MMMM d, y – MMMM d, y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'MMM d – MMM d, y',\n    'd': 'MMM d–d, y',\n    '_': 'MMM d, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, MMM d – E, MMM d',\n    'y': 'E, MMM d, y – E, MMM d, y',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'Md': 'E, MMM d – E, MMM d, y',\n    'y': 'E, MMM d, y – E, MMM d, y',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'M/d – M/d',\n    'd': 'd–d',\n    'y': 'M/d/y – M/d/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_tr = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G MMM y – G MMM y',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G MMMM y – G MMMM y',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG MM.y – GGGGG MM.y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd.M – d.M',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d MMM y – G d MMM y',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'd MMM E – d MMM E',\n    'y': 'd MMM y E – d MMM y E',\n    '_': 'd MMMM EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G d MMM y E – G d MMM y E',\n    'Mdy': 'd MMM y E – d MMM y E',\n    '_': 'd MMM y EEE'\n  },\n  DAY_ABBR: {\n    'M': 'd.M – d.M',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_uk = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'LLL–LLL y',\n    '_': 'LLL y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'LLLL – LLLL y',\n    '_': 'LLLL y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'MM.y G – MM.y G',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM y – d MMM y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'dd.MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM y – d MMMM y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'd MMM – d MMM y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'E, d MMM – E, d MMM',\n    'd': 'E, d – E, d MMM',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'E, d MMM – E, d MMM y',\n    'd': 'E, d – E, d MMM y',\n    'y': 'E, d MMM y – E, d MMM y',\n    '_': 'EEE, d MMM y'\n  },\n  DAY_ABBR: {\n    'M': 'dd.MM – dd.MM',\n    'd': 'd–d',\n    'y': 'dd.MM.y – dd.MM.y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_ur = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM y G – MMM y G',\n    'M': 'MMM–MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM y G – MMMM y G',\n    'M': 'MMMM–MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'M/y – M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd–d MMM',\n    'y': 'd MMM، y – d MMM، y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd MMMM – d MMMM',\n    'd': 'd–d MMMM',\n    'y': 'd MMMM، y – d MMMM، y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'd/M/y – d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd–d MMMM',\n    'y': 'd MMMM، y – d MMMM، y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'MMM d, y G – MMM d, y G',\n    'M': 'd MMM – d MMM، y',\n    'd': 'd–d MMM y',\n    '_': 'd MMM، y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E، d MMM – E، d MMM',\n    'y': 'E، d MMM، y – E، d MMM، y',\n    '_': 'EEE، d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, MMM d, y G – E, MMM d, y G',\n    'Md': 'E، d MMM – E، d MMM، y',\n    'y': 'E، d MMM، y – E، d MMM، y',\n    '_': 'EEE، d MMM، y'\n  },\n  DAY_ABBR: {\n    'M': 'd/M – d/M',\n    'd': 'd–d',\n    'y': 'd/M/y – d/M/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_uz = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MMM, G y – MMM, G y',\n    'M': 'MMM – MMM, y',\n    '_': 'MMM, y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MMMM, G y – MMMM, G y',\n    'M': 'MMMM – MMMM, y',\n    '_': 'MMMM, y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y (GGGGG) – M/y (GGGGG)',\n    'My': 'MM/y – MM/y',\n    '_': 'MM.y'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'd – d-MMM',\n    'y': 'd-MMM, y – d-MMM, y',\n    '_': 'd-MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'd-MMMM – d-MMMM',\n    'd': 'd – d-MMMM',\n    'y': 'd-MMMM, y – d-MMMM, y',\n    '_': 'dd-MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/MM'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'd – d-MMMM',\n    'y': 'd-MMMM, y – d-MMMM, y',\n    '_': 'd-MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd-MMM, G y – d-MMM, G y',\n    'M': 'd-MMM – d-MMM, y',\n    'd': 'd – d-MMM, y',\n    '_': 'd-MMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d-MMM – E, d-MMM',\n    'y': 'E, d-MMM, y – E, d-MMM, y',\n    '_': 'EEE, d-MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d-MMM, G y – E, d-MMM, G y',\n    'Md': 'E, d-MMM – E, d-MMM, y',\n    'y': 'E, d-MMM, y – E, d-MMM, y',\n    '_': 'EEE, d-MMM, y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': 'd–d',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_vi = {\n  YEAR_FULL: {\n    'G': 'y G – y G',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'y G – y G',\n    'y': 'y – y G',\n    '_': 'y G'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'MM y G – MM y G',\n    'M': '\\'Tháng\\' M - \\'Tháng\\' M \\'năm\\' y',\n    'y': '\\'Tháng\\' M \\'năm\\' y - \\'Tháng\\' M \\'năm\\' y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'MM y G – MM y G',\n    'M': 'MMMM–MMMM \\'năm\\' y',\n    'y': 'MMMM, y – MMMM, y',\n    '_': 'MMMM \\'năm\\' y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'M/y GGGGG – M/y GGGGG',\n    'My': 'MM/y – MM/y',\n    '_': '\\'tháng\\' MM, y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': '\\'Ngày\\' dd \\'tháng\\' M - \\'Ngày\\' dd \\'tháng\\' M',\n    'd': '\\'Ngày\\' dd - \\'Ngày\\' dd \\'tháng\\' M',\n    'y': '\\'Ngày\\' dd \\'tháng\\' M \\'năm\\' y - \\'Ngày\\' dd \\'tháng\\' M \\'năm\\' y',\n    '_': 'd MMM'\n  },\n  MONTH_DAY_FULL: {\n    'M': '\\'Ngày\\' dd \\'tháng\\' M - \\'Ngày\\' dd \\'tháng\\' M',\n    'd': '\\'Ngày\\' dd - \\'Ngày\\' dd \\'tháng\\' M',\n    'y': '\\'Ngày\\' dd \\'tháng\\' M \\'năm\\' y - \\'Ngày\\' dd \\'tháng\\' M \\'năm\\' y',\n    '_': 'dd MMMM'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'dd/MM – dd/MM',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'dd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': '\\'Ngày\\' dd \\'tháng\\' M - \\'Ngày\\' dd \\'tháng\\' M',\n    'd': '\\'Ngày\\' dd - \\'Ngày\\' dd \\'tháng\\' M',\n    'y': '\\'Ngày\\' dd \\'tháng\\' M \\'năm\\' y - \\'Ngày\\' dd \\'tháng\\' M \\'năm\\' y',\n    '_': 'd MMMM'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'd MMM y G – d MMM y G',\n    'M': 'd MMM – d MMM, y',\n    'd': 'd – d MMM, y',\n    'y': '\\'Ngày\\' dd \\'tháng\\' M \\'năm\\' y - \\'Ngày\\' dd \\'tháng\\' M \\'năm\\' y',\n    '_': 'd MMM, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, d MMM – E, d MMM',\n    'y': 'E, dd \\'tháng\\' M, y – E, dd \\'tháng\\' M, y',\n    '_': 'EEE, d MMM'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'E, d MMM y G – E, d MMM y G',\n    'M': 'E, dd \\'tháng\\' M – E, dd \\'tháng\\' M, y',\n    'd': 'EEEE, \\'ngày\\' dd MMM – EEEE, \\'ngày\\' dd MMM \\'năm\\' y',\n    'y': 'E, dd \\'tháng\\' M, y – E, dd \\'tháng\\' M, y',\n    '_': 'EEE, d MMM, y'\n  },\n  DAY_ABBR: {\n    'M': 'dd/MM – dd/MM',\n    'd': '\\'Ngày\\' dd–dd',\n    'y': 'dd/MM/y – dd/MM/y',\n    '_': 'd'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_zh = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y年',\n    '_': 'y年'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'Gy年'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月dd日'\n  },\n  MONTH_DAY_SHORT: {\n    'y': 'y/M/d – y/M/d',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y年M月d日至M月d日',\n    'd': 'y年M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'y年M月d日'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'M月d日E至M月d日E',\n    'd': 'M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'M月d日EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'M': 'y年M月d日E至M月d日E',\n    'd': 'y年M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'y年M月d日EEE'\n  },\n  DAY_ABBR: {\n    'M': 'M/d – M/d',\n    'd': 'd–d日',\n    'y': 'y/M/d – y/M/d',\n    '_': 'd日'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_zh_CN = exports.DateIntervalPatterns_zh;\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_zh_HK = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y至y',\n    '_': 'y年'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'Gy年'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y 至 M/y',\n    '_': 'MM/y'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月dd日'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'd/M 至 d/M',\n    'y': 'd/M/y 至 d/M/y',\n    '_': 'd/M'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y年M月d日至M月d日',\n    'd': 'y年M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'y年M月d日'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'M月d日E至M月d日E',\n    'd': 'M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'M月d日EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y年M月d日E至M月d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'y年M月d日EEE'\n  },\n  DAY_ABBR: {\n    'M': 'd/M 至 d/M',\n    'd': 'd日至d日',\n    'y': 'd/M/y 至 d/M/y',\n    '_': 'd日'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_zh_TW = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y至y',\n    '_': 'y年'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'G': 'G y – G y',\n    'y': 'G y–y',\n    '_': 'Gy年'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'y年M月至M月',\n    'y': 'y年M月至y年M月',\n    '_': 'y年M月'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'y/M至y/M',\n    '_': 'y/MM'\n  },\n  MONTH_DAY_ABBR: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月dd日'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'M/d至M/d',\n    'y': 'y/M/d至y/M/d',\n    '_': 'M/d'\n  },\n  MONTH_DAY_MEDIUM: {\n    'M': 'M月d日至M月d日',\n    'd': 'M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'M月d日'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'y年M月d日至M月d日',\n    'd': 'y年M月d日至d日',\n    'y': 'y年M月d日至y年M月d日',\n    '_': 'y年M月d日'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'M': 'M月d日E至M月d日E',\n    'd': 'M月d日E至d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'M月d日 EEE'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'y年M月d日E至M月d日E',\n    'y': 'y年M月d日E至y年M月d日E',\n    '_': 'y年M月d日 EEE'\n  },\n  DAY_ABBR: {\n    'M': 'M/d至M/d',\n    'd': 'd日至d日',\n    'y': 'y/M/d至y/M/d',\n    '_': 'd日'\n  }\n};\n\n/** @const {!DateIntervalPatterns} */\nexports.DateIntervalPatterns_zu = {\n  YEAR_FULL: {\n    'G': 'G y – G y',\n    'y': 'y–y',\n    '_': 'y'\n  },\n  YEAR_FULL_WITH_ERA: {\n    'y': 'G y–y',\n    '_': 'G y'\n  },\n  YEAR_MONTH_ABBR: {\n    'G': 'G y MMM – G y MMM',\n    'M': 'MMM – MMM y',\n    '_': 'MMM y'\n  },\n  YEAR_MONTH_FULL: {\n    'G': 'G y MMMM – G y MMMM',\n    'M': 'MMMM – MMMM y',\n    '_': 'MMMM y'\n  },\n  YEAR_MONTH_SHORT: {\n    'G': 'GGGGG y-MM – GGGGG y-MM',\n    'My': 'M/y – M/y',\n    '_': 'y-MM'\n  },\n  MONTH_DAY_ABBR: {\n    'd': 'MMM d–d',\n    'y': 'MMM d, y – MMM d, y',\n    '_': 'MMM d'\n  },\n  MONTH_DAY_FULL: {\n    'M': 'MMMM d – MMMM d',\n    'd': 'MMMM d–d',\n    'y': 'MMMM d, y – MMMM d, y',\n    '_': 'MMMM dd'\n  },\n  MONTH_DAY_SHORT: {\n    'Md': 'M/d – M/d',\n    'y': 'M/d/y – M/d/y',\n    '_': 'MM-dd'\n  },\n  MONTH_DAY_MEDIUM: {\n    'd': 'MMMM d–d',\n    'y': 'MMMM d, y – MMMM d, y',\n    '_': 'MMMM d'\n  },\n  MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d – G y MMM d',\n    'M': 'MMM d – MMM d, y',\n    'd': 'MMM d – d, y',\n    '_': 'MMM d, y'\n  },\n  WEEKDAY_MONTH_DAY_MEDIUM: {\n    'Md': 'E, MMM d – E, MMM d',\n    'y': 'E, MMM d, y – E, MMM d, y',\n    '_': 'EEE, MMM d'\n  },\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: {\n    'G': 'G y MMM d, E – G y MMM d, E',\n    'Md': 'E, MMM d – E, MMM d, y',\n    'y': 'E, MMM d, y – E, MMM d, y',\n    '_': 'EEE, MMM d, y'\n  },\n  DAY_ABBR: {\n    'M': 'M/d – M/d',\n    'd': 'd–d',\n    'y': 'M/d/y – M/d/y',\n    '_': 'd'\n  }\n};\n\nswitch (goog.LOCALE) {\n  case 'af':\n    defaultPatterns = exports.DateIntervalPatterns_af;\n    break;\n  case 'am':\n    defaultPatterns = exports.DateIntervalPatterns_am;\n    break;\n  case 'ar':\n    defaultPatterns = exports.DateIntervalPatterns_ar;\n    break;\n  case 'ar_DZ':\n  case 'ar-DZ':\n    defaultPatterns = exports.DateIntervalPatterns_ar_DZ;\n    break;\n  case 'ar_EG':\n  case 'ar-EG':\n    defaultPatterns = exports.DateIntervalPatterns_ar_EG;\n    break;\n  case 'az':\n    defaultPatterns = exports.DateIntervalPatterns_az;\n    break;\n  case 'be':\n    defaultPatterns = exports.DateIntervalPatterns_be;\n    break;\n  case 'bg':\n    defaultPatterns = exports.DateIntervalPatterns_bg;\n    break;\n  case 'bn':\n    defaultPatterns = exports.DateIntervalPatterns_bn;\n    break;\n  case 'br':\n    defaultPatterns = exports.DateIntervalPatterns_br;\n    break;\n  case 'bs':\n    defaultPatterns = exports.DateIntervalPatterns_bs;\n    break;\n  case 'ca':\n    defaultPatterns = exports.DateIntervalPatterns_ca;\n    break;\n  case 'chr':\n    defaultPatterns = exports.DateIntervalPatterns_chr;\n    break;\n  case 'cs':\n    defaultPatterns = exports.DateIntervalPatterns_cs;\n    break;\n  case 'cy':\n    defaultPatterns = exports.DateIntervalPatterns_cy;\n    break;\n  case 'da':\n    defaultPatterns = exports.DateIntervalPatterns_da;\n    break;\n  case 'de':\n    defaultPatterns = exports.DateIntervalPatterns_de;\n    break;\n  case 'de_AT':\n  case 'de-AT':\n    defaultPatterns = exports.DateIntervalPatterns_de_AT;\n    break;\n  case 'de_CH':\n  case 'de-CH':\n    defaultPatterns = exports.DateIntervalPatterns_de_CH;\n    break;\n  case 'el':\n    defaultPatterns = exports.DateIntervalPatterns_el;\n    break;\n  case 'en':\n    defaultPatterns = exports.DateIntervalPatterns_en;\n    break;\n  case 'en_AU':\n  case 'en-AU':\n    defaultPatterns = exports.DateIntervalPatterns_en_AU;\n    break;\n  case 'en_CA':\n  case 'en-CA':\n    defaultPatterns = exports.DateIntervalPatterns_en_CA;\n    break;\n  case 'en_GB':\n  case 'en-GB':\n    defaultPatterns = exports.DateIntervalPatterns_en_GB;\n    break;\n  case 'en_IE':\n  case 'en-IE':\n    defaultPatterns = exports.DateIntervalPatterns_en_IE;\n    break;\n  case 'en_IN':\n  case 'en-IN':\n    defaultPatterns = exports.DateIntervalPatterns_en_IN;\n    break;\n  case 'en_SG':\n  case 'en-SG':\n    defaultPatterns = exports.DateIntervalPatterns_en_SG;\n    break;\n  case 'en_US':\n  case 'en-US':\n    defaultPatterns = exports.DateIntervalPatterns_en_US;\n    break;\n  case 'en_ZA':\n  case 'en-ZA':\n    defaultPatterns = exports.DateIntervalPatterns_en_ZA;\n    break;\n  case 'es':\n    defaultPatterns = exports.DateIntervalPatterns_es;\n    break;\n  case 'es_419':\n  case 'es-419':\n    defaultPatterns = exports.DateIntervalPatterns_es_419;\n    break;\n  case 'es_ES':\n  case 'es-ES':\n    defaultPatterns = exports.DateIntervalPatterns_es_ES;\n    break;\n  case 'es_MX':\n  case 'es-MX':\n    defaultPatterns = exports.DateIntervalPatterns_es_MX;\n    break;\n  case 'es_US':\n  case 'es-US':\n    defaultPatterns = exports.DateIntervalPatterns_es_US;\n    break;\n  case 'et':\n    defaultPatterns = exports.DateIntervalPatterns_et;\n    break;\n  case 'eu':\n    defaultPatterns = exports.DateIntervalPatterns_eu;\n    break;\n  case 'fa':\n    defaultPatterns = exports.DateIntervalPatterns_fa;\n    break;\n  case 'fi':\n    defaultPatterns = exports.DateIntervalPatterns_fi;\n    break;\n  case 'fil':\n    defaultPatterns = exports.DateIntervalPatterns_fil;\n    break;\n  case 'fr':\n    defaultPatterns = exports.DateIntervalPatterns_fr;\n    break;\n  case 'fr_CA':\n  case 'fr-CA':\n    defaultPatterns = exports.DateIntervalPatterns_fr_CA;\n    break;\n  case 'ga':\n    defaultPatterns = exports.DateIntervalPatterns_ga;\n    break;\n  case 'gl':\n    defaultPatterns = exports.DateIntervalPatterns_gl;\n    break;\n  case 'gsw':\n    defaultPatterns = exports.DateIntervalPatterns_gsw;\n    break;\n  case 'gu':\n    defaultPatterns = exports.DateIntervalPatterns_gu;\n    break;\n  case 'haw':\n    defaultPatterns = exports.DateIntervalPatterns_haw;\n    break;\n  case 'he':\n    defaultPatterns = exports.DateIntervalPatterns_he;\n    break;\n  case 'hi':\n    defaultPatterns = exports.DateIntervalPatterns_hi;\n    break;\n  case 'hr':\n    defaultPatterns = exports.DateIntervalPatterns_hr;\n    break;\n  case 'hu':\n    defaultPatterns = exports.DateIntervalPatterns_hu;\n    break;\n  case 'hy':\n    defaultPatterns = exports.DateIntervalPatterns_hy;\n    break;\n  case 'id':\n    defaultPatterns = exports.DateIntervalPatterns_id;\n    break;\n  case 'in':\n    defaultPatterns = exports.DateIntervalPatterns_in;\n    break;\n  case 'is':\n    defaultPatterns = exports.DateIntervalPatterns_is;\n    break;\n  case 'it':\n    defaultPatterns = exports.DateIntervalPatterns_it;\n    break;\n  case 'iw':\n    defaultPatterns = exports.DateIntervalPatterns_iw;\n    break;\n  case 'ja':\n    defaultPatterns = exports.DateIntervalPatterns_ja;\n    break;\n  case 'ka':\n    defaultPatterns = exports.DateIntervalPatterns_ka;\n    break;\n  case 'kk':\n    defaultPatterns = exports.DateIntervalPatterns_kk;\n    break;\n  case 'km':\n    defaultPatterns = exports.DateIntervalPatterns_km;\n    break;\n  case 'kn':\n    defaultPatterns = exports.DateIntervalPatterns_kn;\n    break;\n  case 'ko':\n    defaultPatterns = exports.DateIntervalPatterns_ko;\n    break;\n  case 'ky':\n    defaultPatterns = exports.DateIntervalPatterns_ky;\n    break;\n  case 'ln':\n    defaultPatterns = exports.DateIntervalPatterns_ln;\n    break;\n  case 'lo':\n    defaultPatterns = exports.DateIntervalPatterns_lo;\n    break;\n  case 'lt':\n    defaultPatterns = exports.DateIntervalPatterns_lt;\n    break;\n  case 'lv':\n    defaultPatterns = exports.DateIntervalPatterns_lv;\n    break;\n  case 'mk':\n    defaultPatterns = exports.DateIntervalPatterns_mk;\n    break;\n  case 'ml':\n    defaultPatterns = exports.DateIntervalPatterns_ml;\n    break;\n  case 'mn':\n    defaultPatterns = exports.DateIntervalPatterns_mn;\n    break;\n  case 'mo':\n    defaultPatterns = exports.DateIntervalPatterns_mo;\n    break;\n  case 'mr':\n    defaultPatterns = exports.DateIntervalPatterns_mr;\n    break;\n  case 'ms':\n    defaultPatterns = exports.DateIntervalPatterns_ms;\n    break;\n  case 'mt':\n    defaultPatterns = exports.DateIntervalPatterns_mt;\n    break;\n  case 'my':\n    defaultPatterns = exports.DateIntervalPatterns_my;\n    break;\n  case 'nb':\n    defaultPatterns = exports.DateIntervalPatterns_nb;\n    break;\n  case 'ne':\n    defaultPatterns = exports.DateIntervalPatterns_ne;\n    break;\n  case 'nl':\n    defaultPatterns = exports.DateIntervalPatterns_nl;\n    break;\n  case 'no':\n    defaultPatterns = exports.DateIntervalPatterns_no;\n    break;\n  case 'no_NO':\n  case 'no-NO':\n    defaultPatterns = exports.DateIntervalPatterns_no_NO;\n    break;\n  case 'or':\n    defaultPatterns = exports.DateIntervalPatterns_or;\n    break;\n  case 'pa':\n    defaultPatterns = exports.DateIntervalPatterns_pa;\n    break;\n  case 'pl':\n    defaultPatterns = exports.DateIntervalPatterns_pl;\n    break;\n  case 'pt':\n    defaultPatterns = exports.DateIntervalPatterns_pt;\n    break;\n  case 'pt_BR':\n  case 'pt-BR':\n    defaultPatterns = exports.DateIntervalPatterns_pt_BR;\n    break;\n  case 'pt_PT':\n  case 'pt-PT':\n    defaultPatterns = exports.DateIntervalPatterns_pt_PT;\n    break;\n  case 'ro':\n    defaultPatterns = exports.DateIntervalPatterns_ro;\n    break;\n  case 'ru':\n    defaultPatterns = exports.DateIntervalPatterns_ru;\n    break;\n  case 'sh':\n    defaultPatterns = exports.DateIntervalPatterns_sh;\n    break;\n  case 'si':\n    defaultPatterns = exports.DateIntervalPatterns_si;\n    break;\n  case 'sk':\n    defaultPatterns = exports.DateIntervalPatterns_sk;\n    break;\n  case 'sl':\n    defaultPatterns = exports.DateIntervalPatterns_sl;\n    break;\n  case 'sq':\n    defaultPatterns = exports.DateIntervalPatterns_sq;\n    break;\n  case 'sr':\n    defaultPatterns = exports.DateIntervalPatterns_sr;\n    break;\n  case 'sr_Latn':\n  case 'sr-Latn':\n    defaultPatterns = exports.DateIntervalPatterns_sr_Latn;\n    break;\n  case 'sv':\n    defaultPatterns = exports.DateIntervalPatterns_sv;\n    break;\n  case 'sw':\n    defaultPatterns = exports.DateIntervalPatterns_sw;\n    break;\n  case 'ta':\n    defaultPatterns = exports.DateIntervalPatterns_ta;\n    break;\n  case 'te':\n    defaultPatterns = exports.DateIntervalPatterns_te;\n    break;\n  case 'th':\n    defaultPatterns = exports.DateIntervalPatterns_th;\n    break;\n  case 'tl':\n    defaultPatterns = exports.DateIntervalPatterns_tl;\n    break;\n  case 'tr':\n    defaultPatterns = exports.DateIntervalPatterns_tr;\n    break;\n  case 'uk':\n    defaultPatterns = exports.DateIntervalPatterns_uk;\n    break;\n  case 'ur':\n    defaultPatterns = exports.DateIntervalPatterns_ur;\n    break;\n  case 'uz':\n    defaultPatterns = exports.DateIntervalPatterns_uz;\n    break;\n  case 'vi':\n    defaultPatterns = exports.DateIntervalPatterns_vi;\n    break;\n  case 'zh':\n    defaultPatterns = exports.DateIntervalPatterns_zh;\n    break;\n  case 'zh_CN':\n  case 'zh-CN':\n    defaultPatterns = exports.DateIntervalPatterns_zh_CN;\n    break;\n  case 'zh_HK':\n  case 'zh-HK':\n    defaultPatterns = exports.DateIntervalPatterns_zh_HK;\n    break;\n  case 'zh_TW':\n  case 'zh-TW':\n    defaultPatterns = exports.DateIntervalPatterns_zh_TW;\n    break;\n  case 'zu':\n    defaultPatterns = exports.DateIntervalPatterns_zu;\n    break;\n  default:\n    defaultPatterns = exports.DateIntervalPatterns_en;\n}\n","^?",1579837703000,"^@",["^A",["~$goog.i18n.dateIntervalSymbols","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/dateintervalpatterns.js"],"^S",["^A",["~$goog.i18n.dateIntervalPatterns"]],"^1",true,"^2",["^3","^4O"]],["^ ","^7",[1579837703000],"^8","goog.vec.vec4.js","^9",["^:","goog/vec/vec4.js"],"^;","goog/vec/vec4.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Supplies 4 element vectors that are compatible with WebGL.\n * Each element is a float32 since that is typically the desired size of a\n * 4-vector in the GPU.  The API is structured to avoid unnecessary memory\n * allocations.  The last parameter will typically be the output vector and\n * an object can be both an input and output parameter to all methods except\n * where noted.\n *\n */\ngoog.provide('goog.vec.Vec4');\n\n/** @suppress {extraRequire} */\ngoog.require('goog.vec');\n\n/** @typedef {!goog.vec.Float32} */ goog.vec.Vec4.Float32;\n/** @typedef {!goog.vec.Float64} */ goog.vec.Vec4.Float64;\n/** @typedef {!goog.vec.Number} */ goog.vec.Vec4.Number;\n/** @typedef {!goog.vec.AnyType} */ goog.vec.Vec4.AnyType;\n\n// The following two types are deprecated - use the above types instead.\n/** @typedef {!Float32Array} */ goog.vec.Vec4.Type;\n/** @typedef {!goog.vec.ArrayType} */ goog.vec.Vec4.Vec4Like;\n\n\n/**\n * Creates a 4 element vector of Float32. The array is initialized to zero.\n *\n * @return {!goog.vec.Vec4.Float32} The new 3 element array.\n */\ngoog.vec.Vec4.createFloat32 = function() {\n  return new Float32Array(4);\n};\n\n\n/**\n * Creates a 4 element vector of Float64. The array is initialized to zero.\n *\n * @return {!goog.vec.Vec4.Float64} The new 4 element array.\n */\ngoog.vec.Vec4.createFloat64 = function() {\n  return new Float64Array(4);\n};\n\n\n/**\n * Creates a 4 element vector of Number. The array is initialized to zero.\n *\n * @return {!goog.vec.Vec4.Number} The new 4 element array.\n */\ngoog.vec.Vec4.createNumber = function() {\n  var v = new Array(4);\n  goog.vec.Vec4.setFromValues(v, 0, 0, 0, 0);\n  return v;\n};\n\n\n/**\n * Creates a 4 element vector of Float32Array. The array is initialized to zero.\n *\n * @deprecated Use createFloat32.\n * @return {!goog.vec.Vec4.Type} The new 4 element array.\n */\ngoog.vec.Vec4.create = function() {\n  return new Float32Array(4);\n};\n\n\n/**\n * Creates a new 4 element vector initialized with the value from the given\n * array.\n *\n * @deprecated Use createFloat32FromArray.\n * @param {goog.vec.Vec4.Vec4Like} vec The source 4 element array.\n * @return {!goog.vec.Vec4.Type} The new 4 element array.\n */\ngoog.vec.Vec4.createFromArray = function(vec) {\n  var newVec = goog.vec.Vec4.create();\n  goog.vec.Vec4.setFromArray(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Creates a new 4 element FLoat32 vector initialized with the value from the\n * given array.\n *\n * @param {goog.vec.Vec4.AnyType} vec The source 3 element array.\n * @return {!goog.vec.Vec4.Float32} The new 3 element array.\n */\ngoog.vec.Vec4.createFloat32FromArray = function(vec) {\n  var newVec = goog.vec.Vec4.createFloat32();\n  goog.vec.Vec4.setFromArray(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Creates a new 4 element Float32 vector initialized with the supplied values.\n *\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @param {number} v3 The value for element at index 3.\n * @return {!goog.vec.Vec4.Float32} The new vector.\n */\ngoog.vec.Vec4.createFloat32FromValues = function(v0, v1, v2, v3) {\n  var vec = goog.vec.Vec4.createFloat32();\n  goog.vec.Vec4.setFromValues(vec, v0, v1, v2, v3);\n  return vec;\n};\n\n\n/**\n * Creates a clone of the given 4 element Float32 vector.\n *\n * @param {goog.vec.Vec4.Float32} vec The source 3 element vector.\n * @return {!goog.vec.Vec4.Float32} The new cloned vector.\n */\ngoog.vec.Vec4.cloneFloat32 = goog.vec.Vec4.createFloat32FromArray;\n\n\n/**\n * Creates a new 4 element Float64 vector initialized with the value from the\n * given array.\n *\n * @param {goog.vec.Vec4.AnyType} vec The source 4 element array.\n * @return {!goog.vec.Vec4.Float64} The new 4 element array.\n */\ngoog.vec.Vec4.createFloat64FromArray = function(vec) {\n  var newVec = goog.vec.Vec4.createFloat64();\n  goog.vec.Vec4.setFromArray(newVec, vec);\n  return newVec;\n};\n\n\n/**\n* Creates a new 4 element Float64 vector initialized with the supplied values.\n*\n* @param {number} v0 The value for element at index 0.\n* @param {number} v1 The value for element at index 1.\n* @param {number} v2 The value for element at index 2.\n* @param {number} v3 The value for element at index 3.\n* @return {!goog.vec.Vec4.Float64} The new vector.\n*/\ngoog.vec.Vec4.createFloat64FromValues = function(v0, v1, v2, v3) {\n  var vec = goog.vec.Vec4.createFloat64();\n  goog.vec.Vec4.setFromValues(vec, v0, v1, v2, v3);\n  return vec;\n};\n\n\n/**\n * Creates a clone of the given 4 element vector.\n *\n * @param {goog.vec.Vec4.Float64} vec The source 4 element vector.\n * @return {!goog.vec.Vec4.Float64} The new cloned vector.\n */\ngoog.vec.Vec4.cloneFloat64 = goog.vec.Vec4.createFloat64FromArray;\n\n\n/**\n * Creates a new 4 element vector initialized with the supplied values.\n *\n * @deprecated Use createFloat32FromValues.\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @param {number} v3 The value for element at index 3.\n * @return {!goog.vec.Vec4.Type} The new vector.\n */\ngoog.vec.Vec4.createFromValues = function(v0, v1, v2, v3) {\n  var vec = goog.vec.Vec4.create();\n  goog.vec.Vec4.setFromValues(vec, v0, v1, v2, v3);\n  return vec;\n};\n\n\n/**\n * Creates a clone of the given 4 element vector.\n *\n * @deprecated Use cloneFloat32.\n * @param {goog.vec.Vec4.Vec4Like} vec The source 4 element vector.\n * @return {!goog.vec.Vec4.Type} The new cloned vector.\n */\ngoog.vec.Vec4.clone = goog.vec.Vec4.createFromArray;\n\n\n/**\n * Initializes the vector with the given values.\n *\n * @param {goog.vec.Vec4.AnyType} vec The vector to receive the values.\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @param {number} v2 The value for element at index 2.\n * @param {number} v3 The value for element at index 3.\n * @return {!goog.vec.Vec4.AnyType} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec4.setFromValues = function(vec, v0, v1, v2, v3) {\n  vec[0] = v0;\n  vec[1] = v1;\n  vec[2] = v2;\n  vec[3] = v3;\n  return vec;\n};\n\n\n/**\n * Initializes the vector with the given array of values.\n *\n * @param {goog.vec.Vec4.AnyType} vec The vector to receive the\n *     values.\n * @param {goog.vec.Vec4.AnyType} values The array of values.\n * @return {!goog.vec.Vec4.AnyType} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec4.setFromArray = function(vec, values) {\n  vec[0] = values[0];\n  vec[1] = values[1];\n  vec[2] = values[2];\n  vec[3] = values[3];\n  return vec;\n};\n\n\n/**\n * Performs a component-wise addition of vec0 and vec1 together storing the\n * result into resultVec.\n *\n * @param {goog.vec.Vec4.AnyType} vec0 The first addend.\n * @param {goog.vec.Vec4.AnyType} vec1 The second addend.\n * @param {goog.vec.Vec4.AnyType} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.Vec4.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec4.add = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] + vec1[0];\n  resultVec[1] = vec0[1] + vec1[1];\n  resultVec[2] = vec0[2] + vec1[2];\n  resultVec[3] = vec0[3] + vec1[3];\n  return resultVec;\n};\n\n\n/**\n * Performs a component-wise subtraction of vec1 from vec0 storing the\n * result into resultVec.\n *\n * @param {goog.vec.Vec4.AnyType} vec0 The minuend.\n * @param {goog.vec.Vec4.AnyType} vec1 The subtrahend.\n * @param {goog.vec.Vec4.AnyType} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.Vec4.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec4.subtract = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] - vec1[0];\n  resultVec[1] = vec0[1] - vec1[1];\n  resultVec[2] = vec0[2] - vec1[2];\n  resultVec[3] = vec0[3] - vec1[3];\n  return resultVec;\n};\n\n\n/**\n * Negates vec0, storing the result into resultVec.\n *\n * @param {goog.vec.Vec4.AnyType} vec0 The vector to negate.\n * @param {goog.vec.Vec4.AnyType} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.Vec4.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec4.negate = function(vec0, resultVec) {\n  resultVec[0] = -vec0[0];\n  resultVec[1] = -vec0[1];\n  resultVec[2] = -vec0[2];\n  resultVec[3] = -vec0[3];\n  return resultVec;\n};\n\n\n/**\n * Takes the absolute value of each component of vec0 storing the result in\n * resultVec.\n *\n * @param {goog.vec.Vec4.AnyType} vec0 The source vector.\n * @param {goog.vec.Vec4.AnyType} resultVec The vector to receive the result.\n *     May be vec0.\n * @return {!goog.vec.Vec4.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec4.abs = function(vec0, resultVec) {\n  resultVec[0] = Math.abs(vec0[0]);\n  resultVec[1] = Math.abs(vec0[1]);\n  resultVec[2] = Math.abs(vec0[2]);\n  resultVec[3] = Math.abs(vec0[3]);\n  return resultVec;\n};\n\n\n/**\n * Multiplies each component of vec0 with scalar storing the product into\n * resultVec.\n *\n * @param {goog.vec.Vec4.AnyType} vec0 The source vector.\n * @param {number} scalar The value to multiply with each component of vec0.\n * @param {goog.vec.Vec4.AnyType} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.Vec4.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec4.scale = function(vec0, scalar, resultVec) {\n  resultVec[0] = vec0[0] * scalar;\n  resultVec[1] = vec0[1] * scalar;\n  resultVec[2] = vec0[2] * scalar;\n  resultVec[3] = vec0[3] * scalar;\n  return resultVec;\n};\n\n\n/**\n * Returns the magnitudeSquared of the given vector.\n *\n * @param {goog.vec.Vec4.AnyType} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.Vec4.magnitudeSquared = function(vec0) {\n  var x = vec0[0], y = vec0[1], z = vec0[2], w = vec0[3];\n  return x * x + y * y + z * z + w * w;\n};\n\n\n/**\n * Returns the magnitude of the given vector.\n *\n * @param {goog.vec.Vec4.AnyType} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.Vec4.magnitude = function(vec0) {\n  var x = vec0[0], y = vec0[1], z = vec0[2], w = vec0[3];\n  return Math.sqrt(x * x + y * y + z * z + w * w);\n};\n\n\n/**\n * Normalizes the given vector storing the result into resultVec.\n *\n * @param {goog.vec.Vec4.AnyType} vec0 The vector to normalize.\n * @param {goog.vec.Vec4.AnyType} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.Vec4.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec4.normalize = function(vec0, resultVec) {\n  var ilen = 1 / goog.vec.Vec4.magnitude(vec0);\n  resultVec[0] = vec0[0] * ilen;\n  resultVec[1] = vec0[1] * ilen;\n  resultVec[2] = vec0[2] * ilen;\n  resultVec[3] = vec0[3] * ilen;\n  return resultVec;\n};\n\n\n/**\n * Returns the scalar product of vectors v0 and v1.\n *\n * @param {goog.vec.Vec4.AnyType} v0 The first vector.\n * @param {goog.vec.Vec4.AnyType} v1 The second vector.\n * @return {number} The scalar product.\n */\ngoog.vec.Vec4.dot = function(v0, v1) {\n  return v0[0] * v1[0] + v0[1] * v1[1] + v0[2] * v1[2] + v0[3] * v1[3];\n};\n\n\n/**\n * Linearly interpolate from v0 to v1 according to f. The value of f should be\n * in the range [0..1] otherwise the results are undefined.\n *\n * @param {goog.vec.Vec4.AnyType} v0 The first vector.\n * @param {goog.vec.Vec4.AnyType} v1 The second vector.\n * @param {number} f The interpolation factor.\n * @param {goog.vec.Vec4.AnyType} resultVec The vector to receive the\n *     results (may be v0 or v1).\n * @return {!goog.vec.Vec4.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec4.lerp = function(v0, v1, f, resultVec) {\n  var x = v0[0], y = v0[1], z = v0[2], w = v0[3];\n  resultVec[0] = (v1[0] - x) * f + x;\n  resultVec[1] = (v1[1] - y) * f + y;\n  resultVec[2] = (v1[2] - z) * f + z;\n  resultVec[3] = (v1[3] - w) * f + w;\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the larger values in resultVec.\n *\n * @param {goog.vec.Vec4.AnyType} vec0 The source vector.\n * @param {goog.vec.Vec4.AnyType|number} limit The limit vector or scalar.\n * @param {goog.vec.Vec4.AnyType} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.Vec4.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec4.max = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.max(vec0[0], limit);\n    resultVec[1] = Math.max(vec0[1], limit);\n    resultVec[2] = Math.max(vec0[2], limit);\n    resultVec[3] = Math.max(vec0[3], limit);\n  } else {\n    resultVec[0] = Math.max(vec0[0], limit[0]);\n    resultVec[1] = Math.max(vec0[1], limit[1]);\n    resultVec[2] = Math.max(vec0[2], limit[2]);\n    resultVec[3] = Math.max(vec0[3], limit[3]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the smaller values in resultVec.\n *\n * @param {goog.vec.Vec4.AnyType} vec0 The source vector.\n * @param {goog.vec.Vec4.AnyType|number} limit The limit vector or scalar.\n * @param {goog.vec.Vec4.AnyType} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.Vec4.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec4.min = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.min(vec0[0], limit);\n    resultVec[1] = Math.min(vec0[1], limit);\n    resultVec[2] = Math.min(vec0[2], limit);\n    resultVec[3] = Math.min(vec0[3], limit);\n  } else {\n    resultVec[0] = Math.min(vec0[0], limit[0]);\n    resultVec[1] = Math.min(vec0[1], limit[1]);\n    resultVec[2] = Math.min(vec0[2], limit[2]);\n    resultVec[3] = Math.min(vec0[3], limit[3]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Returns true if the components of v0 are equal to the components of v1.\n *\n * @param {goog.vec.Vec4.AnyType} v0 The first vector.\n * @param {goog.vec.Vec4.AnyType} v1 The second vector.\n * @return {boolean} True if the vectors are equal, false otherwise.\n */\ngoog.vec.Vec4.equals = function(v0, v1) {\n  return v0.length == v1.length && v0[0] == v1[0] && v0[1] == v1[1] &&\n      v0[2] == v1[2] && v0[3] == v1[3];\n};\n","^?",1579837703000,"^@",["^A",["^V","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/vec4.js"],"^S",["^A",["^U"]],"^1",true,"^2",["^3","^V"]],["^ ","^7",[1579837703000],"^8","goog.vec.vec2f.js","^9",["^:","goog/vec/vec2f.js"],"^;","goog/vec/vec2f.js","^<","^=","^>","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n//                                                                           //\n// Any edits to this file must be applied to vec2d.js by running:            //\n//   swap_type.sh vec2f.js > vec2d.js                                        //\n//                                                                           //\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n\n\n/**\n * @fileoverview Provides functions for operating on 2 element float (32bit)\n * vectors.\n *\n * The last parameter will typically be the output object and an object\n * can be both an input and output parameter to all methods except where\n * noted.\n *\n * See the README for notes about the design and structure of the API\n * (especially related to performance).\n *\n */\n\ngoog.provide('goog.vec.vec2f');\ngoog.provide('goog.vec.vec2f.Type');\n\n/** @suppress {extraRequire} */\ngoog.require('goog.vec');\n\n\n/** @typedef {!goog.vec.Float32} */ goog.vec.vec2f.Type;\n\n\n/**\n * Creates a vec2f with all elements initialized to zero.\n *\n * @return {!goog.vec.vec2f.Type} The new vec2f.\n */\ngoog.vec.vec2f.create = function() {\n  return new Float32Array(2);\n};\n\n\n/**\n * Creates a new vec2f initialized with the value from the given array.\n *\n * @param {!Array<number>} vec The source 2 element array.\n * @return {!goog.vec.vec2f.Type} The new vec2f.\n */\ngoog.vec.vec2f.createFromArray = function(vec) {\n  var newVec = goog.vec.vec2f.create();\n  goog.vec.vec2f.setFromArray(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Creates a new vec2f initialized with the supplied values.\n *\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @return {!goog.vec.vec2f.Type} The new vector.\n */\ngoog.vec.vec2f.createFromValues = function(v0, v1) {\n  var vec = goog.vec.vec2f.create();\n  goog.vec.vec2f.setFromValues(vec, v0, v1);\n  return vec;\n};\n\n\n/**\n * Creates a clone of the given vec2f.\n *\n * @param {!goog.vec.vec2f.Type} vec The source vec2f.\n * @return {!goog.vec.vec2f.Type} The new cloned vec2f.\n */\ngoog.vec.vec2f.clone = function(vec) {\n  var newVec = goog.vec.vec2f.create();\n  goog.vec.vec2f.setFromVec2f(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Initializes the vector with the given values.\n *\n * @param {!goog.vec.vec2f.Type} vec The vector to receive the values.\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @return {!goog.vec.vec2f.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.setFromValues = function(vec, v0, v1) {\n  vec[0] = v0;\n  vec[1] = v1;\n  return vec;\n};\n\n\n/**\n * Initializes vec2f vec from vec2f src.\n *\n * @param {!goog.vec.vec2f.Type} vec The destination vector.\n * @param {!goog.vec.vec2f.Type} src The source vector.\n * @return {!goog.vec.vec2f.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.setFromVec2f = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  return vec;\n};\n\n\n/**\n * Initializes vec2f vec from vec2d src (typed as a Float64Array to\n * avoid circular goog.requires).\n *\n * @param {!goog.vec.vec2f.Type} vec The destination vector.\n * @param {Float64Array} src The source vector.\n * @return {!goog.vec.vec2f.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.setFromVec2d = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  return vec;\n};\n\n\n/**\n * Initializes vec2f vec from Array src.\n *\n * @param {!goog.vec.vec2f.Type} vec The destination vector.\n * @param {Array<number>} src The source vector.\n * @return {!goog.vec.vec2f.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.setFromArray = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  return vec;\n};\n\n\n/**\n * Performs a component-wise addition of vec0 and vec1 together storing the\n * result into resultVec.\n *\n * @param {!goog.vec.vec2f.Type} vec0 The first addend.\n * @param {!goog.vec.vec2f.Type} vec1 The second addend.\n * @param {!goog.vec.vec2f.Type} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.vec2f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.add = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] + vec1[0];\n  resultVec[1] = vec0[1] + vec1[1];\n  return resultVec;\n};\n\n\n/**\n * Performs a component-wise subtraction of vec1 from vec0 storing the\n * result into resultVec.\n *\n * @param {!goog.vec.vec2f.Type} vec0 The minuend.\n * @param {!goog.vec.vec2f.Type} vec1 The subtrahend.\n * @param {!goog.vec.vec2f.Type} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.vec2f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.subtract = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] - vec1[0];\n  resultVec[1] = vec0[1] - vec1[1];\n  return resultVec;\n};\n\n\n/**\n * Multiplies each component of vec0 with the matching element of vec0\n * storing the products into resultVec.\n *\n * @param {!goog.vec.vec2f.Type} vec0 The first vector.\n * @param {!goog.vec.vec2f.Type} vec1 The second vector.\n * @param {!goog.vec.vec2f.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec2f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.componentMultiply = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] * vec1[0];\n  resultVec[1] = vec0[1] * vec1[1];\n  return resultVec;\n};\n\n\n/**\n * Divides each component of vec0 with the matching element of vec0\n * storing the divisor into resultVec.\n *\n * @param {!goog.vec.vec2f.Type} vec0 The first vector.\n * @param {!goog.vec.vec2f.Type} vec1 The second vector.\n * @param {!goog.vec.vec2f.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec2f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.componentDivide = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] / vec1[0];\n  resultVec[1] = vec0[1] / vec1[1];\n  return resultVec;\n};\n\n\n/**\n * Negates vec0, storing the result into resultVec.\n *\n * @param {!goog.vec.vec2f.Type} vec0 The vector to negate.\n * @param {!goog.vec.vec2f.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec2f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.negate = function(vec0, resultVec) {\n  resultVec[0] = -vec0[0];\n  resultVec[1] = -vec0[1];\n  return resultVec;\n};\n\n\n/**\n * Takes the absolute value of each component of vec0 storing the result in\n * resultVec.\n *\n * @param {!goog.vec.vec2f.Type} vec0 The source vector.\n * @param {!goog.vec.vec2f.Type} resultVec The vector to receive the result.\n *     May be vec0.\n * @return {!goog.vec.vec2f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.abs = function(vec0, resultVec) {\n  resultVec[0] = Math.abs(vec0[0]);\n  resultVec[1] = Math.abs(vec0[1]);\n  return resultVec;\n};\n\n\n/**\n * Multiplies each component of vec0 with scalar storing the product into\n * resultVec.\n *\n * @param {!goog.vec.vec2f.Type} vec0 The source vector.\n * @param {number} scalar The value to multiply with each component of vec0.\n * @param {!goog.vec.vec2f.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec2f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.scale = function(vec0, scalar, resultVec) {\n  resultVec[0] = vec0[0] * scalar;\n  resultVec[1] = vec0[1] * scalar;\n  return resultVec;\n};\n\n\n/**\n * Returns the magnitudeSquared of the given vector.\n *\n * @param {!goog.vec.vec2f.Type} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.vec2f.magnitudeSquared = function(vec0) {\n  var x = vec0[0], y = vec0[1];\n  return x * x + y * y;\n};\n\n\n/**\n * Returns the magnitude of the given vector.\n *\n * @param {!goog.vec.vec2f.Type} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.vec2f.magnitude = function(vec0) {\n  var x = vec0[0], y = vec0[1];\n  return Math.sqrt(x * x + y * y);\n};\n\n\n/**\n * Normalizes the given vector storing the result into resultVec.\n *\n * @param {!goog.vec.vec2f.Type} vec0 The vector to normalize.\n * @param {!goog.vec.vec2f.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec2f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.normalize = function(vec0, resultVec) {\n  var x = vec0[0], y = vec0[1];\n  var ilen = 1 / Math.sqrt(x * x + y * y);\n  resultVec[0] = x * ilen;\n  resultVec[1] = y * ilen;\n  return resultVec;\n};\n\n\n/**\n * Returns the scalar product of vectors vec0 and vec1.\n *\n * @param {!goog.vec.vec2f.Type} vec0 The first vector.\n * @param {!goog.vec.vec2f.Type} vec1 The second vector.\n * @return {number} The scalar product.\n */\ngoog.vec.vec2f.dot = function(vec0, vec1) {\n  return vec0[0] * vec1[0] + vec0[1] * vec1[1];\n};\n\n\n/**\n * Returns the squared distance between two points.\n *\n * @param {!goog.vec.vec2f.Type} vec0 First point.\n * @param {!goog.vec.vec2f.Type} vec1 Second point.\n * @return {number} The squared distance between the points.\n */\ngoog.vec.vec2f.distanceSquared = function(vec0, vec1) {\n  var x = vec0[0] - vec1[0];\n  var y = vec0[1] - vec1[1];\n  return x * x + y * y;\n};\n\n\n/**\n * Returns the distance between two points.\n *\n * @param {!goog.vec.vec2f.Type} vec0 First point.\n * @param {!goog.vec.vec2f.Type} vec1 Second point.\n * @return {number} The distance between the points.\n */\ngoog.vec.vec2f.distance = function(vec0, vec1) {\n  return Math.sqrt(goog.vec.vec2f.distanceSquared(vec0, vec1));\n};\n\n\n/**\n * Returns a unit vector pointing from one point to another.\n * If the input points are equal then the result will be all zeros.\n *\n * @param {!goog.vec.vec2f.Type} vec0 Origin point.\n * @param {!goog.vec.vec2f.Type} vec1 Target point.\n * @param {!goog.vec.vec2f.Type} resultVec The vector to receive the\n *     results (may be vec0 or vec1).\n * @return {!goog.vec.vec2f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.direction = function(vec0, vec1, resultVec) {\n  var x = vec1[0] - vec0[0];\n  var y = vec1[1] - vec0[1];\n  var d = Math.sqrt(x * x + y * y);\n  if (d) {\n    d = 1 / d;\n    resultVec[0] = x * d;\n    resultVec[1] = y * d;\n  } else {\n    resultVec[0] = resultVec[1] = 0;\n  }\n  return resultVec;\n};\n\n\n/**\n * Linearly interpolate from vec0 to vec1 according to f. The value of f should\n * be in the range [0..1] otherwise the results are undefined.\n *\n * @param {!goog.vec.vec2f.Type} vec0 The first vector.\n * @param {!goog.vec.vec2f.Type} vec1 The second vector.\n * @param {number} f The interpolation factor.\n * @param {!goog.vec.vec2f.Type} resultVec The vector to receive the\n *     results (may be vec0 or vec1).\n * @return {!goog.vec.vec2f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.lerp = function(vec0, vec1, f, resultVec) {\n  var x = vec0[0], y = vec0[1];\n  resultVec[0] = (vec1[0] - x) * f + x;\n  resultVec[1] = (vec1[1] - y) * f + y;\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the larger values in resultVec.\n *\n * @param {!goog.vec.vec2f.Type} vec0 The source vector.\n * @param {!goog.vec.vec2f.Type|number} limit The limit vector or scalar.\n * @param {!goog.vec.vec2f.Type} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.vec2f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.max = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.max(vec0[0], limit);\n    resultVec[1] = Math.max(vec0[1], limit);\n  } else {\n    resultVec[0] = Math.max(vec0[0], limit[0]);\n    resultVec[1] = Math.max(vec0[1], limit[1]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the smaller values in resultVec.\n *\n * @param {!goog.vec.vec2f.Type} vec0 The source vector.\n * @param {!goog.vec.vec2f.Type|number} limit The limit vector or scalar.\n * @param {!goog.vec.vec2f.Type} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.vec2f.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2f.min = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.min(vec0[0], limit);\n    resultVec[1] = Math.min(vec0[1], limit);\n  } else {\n    resultVec[0] = Math.min(vec0[0], limit[0]);\n    resultVec[1] = Math.min(vec0[1], limit[1]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Returns true if the components of vec0 are equal to the components of vec1.\n *\n * @param {!goog.vec.vec2f.Type} vec0 The first vector.\n * @param {!goog.vec.vec2f.Type} vec1 The second vector.\n * @return {boolean} True if the vectors are equal, false otherwise.\n */\ngoog.vec.vec2f.equals = function(vec0, vec1) {\n  return vec0.length == vec1.length && vec0[0] == vec1[0] && vec0[1] == vec1[1];\n};\n","^?",1579837703000,"^@",["^A",["^V","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/vec2f.js"],"^S",["^A",["~$goog.vec.vec2f","~$goog.vec.vec2f.Type"]],"^1",true,"^2",["^3","^V"]],["^ ","^7",[1579837703000],"^8","goog.dom.abstractmultirange.js","^9",["^:","goog/dom/abstractmultirange.js"],"^;","goog/dom/abstractmultirange.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities for working with ranges comprised of multiple\n * sub-ranges.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.dom.AbstractMultiRange');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.AbstractRange');\ngoog.require('goog.dom.TextRange');\n\n\n\n/**\n * Creates a new multi range with no properties.  Do not use this\n * constructor: use one of the goog.dom.Range.createFrom* methods instead.\n * @constructor\n * @extends {goog.dom.AbstractRange}\n */\ngoog.dom.AbstractMultiRange = function() {};\ngoog.inherits(goog.dom.AbstractMultiRange, goog.dom.AbstractRange);\n\n\n/** @override */\ngoog.dom.AbstractMultiRange.prototype.containsRange = function(\n    otherRange, opt_allowPartial) {\n  // TODO(user): This will incorrectly return false if two (or more) adjacent\n  // elements are both in the control range, and are also in the text range\n  // being compared to.\n  var /** !Array<?goog.dom.TextRange> */ ranges = this.getTextRanges();\n  var otherRanges = otherRange.getTextRanges();\n\n  var fn = opt_allowPartial ? goog.array.some : goog.array.every;\n  return fn(otherRanges, function(otherRange) {\n    return goog.array.some(ranges, function(range) {\n      return range.containsRange(otherRange, opt_allowPartial);\n    });\n  });\n};\n\n\n/** @override */\ngoog.dom.AbstractMultiRange.prototype.containsNode = function(\n    node, opt_allowPartial) {\n  return this.containsRange(\n      goog.dom.TextRange.createFromNodeContents(node), opt_allowPartial);\n};\n\n\n\n/** @override */\ngoog.dom.AbstractMultiRange.prototype.insertNode = function(node, before) {\n  if (before) {\n    goog.dom.insertSiblingBefore(node, this.getStartNode());\n  } else {\n    goog.dom.insertSiblingAfter(node, this.getEndNode());\n  }\n  return node;\n};\n\n\n/** @override */\ngoog.dom.AbstractMultiRange.prototype.surroundWithNodes = function(\n    startNode, endNode) {\n  this.insertNode(startNode, true);\n  this.insertNode(endNode, false);\n};\n","^?",1579837703000,"^@",["^A",["^14","^4;","^3","~$goog.dom.TextRange","^1S"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/abstractmultirange.js"],"^S",["^A",["~$goog.dom.AbstractMultiRange"]],"^1",true,"^2",["^3","^1S","^14","^4;","^4S"]],["^ ","^7",[1579837703000],"^8","goog.graphics.fill.js","^9",["^:","goog/graphics/fill.js"],"^;","goog/graphics/fill.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Represents a fill goog.graphics.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.graphics.Fill');\n\n\n\n/**\n * Creates a fill object\n * @constructor\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n */\ngoog.graphics.Fill = function() {};\n\n\n/**\n * @return {string} The start color of a gradient fill.\n */\ngoog.graphics.Fill.prototype.getColor1 = goog.abstractMethod;\n\n\n/**\n * @return {string} The end color of a gradient fill.\n */\ngoog.graphics.Fill.prototype.getColor2 = goog.abstractMethod;\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/fill.js"],"^S",["^A",["~$goog.graphics.Fill"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.events.actioneventwrapper.js","^9",["^:","goog/events/actioneventwrapper.js"],"^;","goog/events/actioneventwrapper.js","^<","^=","^>","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Action event wrapper implementation.\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.events.actionEventWrapper');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.dom');\ngoog.require('goog.events');\n/** @suppress {extraRequire} */\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.EventWrapper');\ngoog.require('goog.events.KeyCodes');\n\n\n\n/**\n * Event wrapper for action handling. Fires when an element is activated either\n * by clicking it or by focusing it and pressing Enter.\n *\n * @constructor\n * @implements {goog.events.EventWrapper}\n * @private\n */\ngoog.events.ActionEventWrapper_ = function() {};\n\n/**\n * @interface\n * @private\n */\ngoog.events.ActionEventWrapper_.FunctionExtension_ = function() {};\n\n/** @type {!Object|undefined} */\ngoog.events.ActionEventWrapper_.FunctionExtension_.prototype.scope_;\n\n/** @type {function(?):?|{handleEvent:function(?):?}|null} */\ngoog.events.ActionEventWrapper_.FunctionExtension_.prototype.listener_;\n\n\n/**\n * Singleton instance of ActionEventWrapper_.\n * @type {goog.events.ActionEventWrapper_}\n */\ngoog.events.actionEventWrapper = new goog.events.ActionEventWrapper_();\n\n\n/**\n * Event types used by the wrapper.\n *\n * @type {Array<goog.events.EventType>}\n * @private\n */\ngoog.events.ActionEventWrapper_.EVENT_TYPES_ = [\n  goog.events.EventType.CLICK, goog.events.EventType.KEYDOWN,\n  goog.events.EventType.KEYUP\n];\n\n\n/**\n * Adds an event listener using the wrapper on a DOM Node or an object that has\n * implemented {@link goog.events.EventTarget}. A listener can only be added\n * once to an object.\n *\n * @param {goog.events.ListenableType} target The target to listen to events on.\n * @param {function(?):?|{handleEvent:function(?):?}|null} listener Callback\n *     method, or an object with a handleEvent function.\n * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to\n *     false).\n * @param {Object=} opt_scope Element in whose scope to call the listener.\n * @param {goog.events.EventHandler=} opt_eventHandler Event handler to add\n *     listener to.\n * @override\n */\ngoog.events.ActionEventWrapper_.prototype.listen = function(\n    target, listener, opt_capt, opt_scope, opt_eventHandler) {\n  var callback = function(e) {\n    var listenerFn = goog.events.wrapListener(listener);\n    var role = goog.dom.isElement(e.target) ?\n        goog.a11y.aria.getRole(/** @type {!Element} */ (e.target)) :\n        null;\n    if (e.type == goog.events.EventType.CLICK && e.isMouseActionButton()) {\n      listenerFn.call(opt_scope, e);\n    } else if (\n        (e.keyCode == goog.events.KeyCodes.ENTER ||\n         e.keyCode == goog.events.KeyCodes.MAC_ENTER) &&\n        e.type != goog.events.EventType.KEYUP) {\n      // convert keydown to keypress for backward compatibility.\n      e.type = goog.events.EventType.KEYPRESS;\n      listenerFn.call(opt_scope, e);\n    } else if (\n        e.keyCode == goog.events.KeyCodes.SPACE &&\n        e.type == goog.events.EventType.KEYUP &&\n        (role == goog.a11y.aria.Role.BUTTON ||\n         role == goog.a11y.aria.Role.TAB)) {\n      listenerFn.call(opt_scope, e);\n      e.preventDefault();\n    }\n  };\n  callback.listener_ = listener;\n  callback.scope_ = opt_scope;\n\n  if (opt_eventHandler) {\n    opt_eventHandler.listen(\n        target, goog.events.ActionEventWrapper_.EVENT_TYPES_, callback,\n        opt_capt);\n  } else {\n    goog.events.listen(\n        target, goog.events.ActionEventWrapper_.EVENT_TYPES_, callback,\n        opt_capt);\n  }\n};\n\n\n/**\n * Removes an event listener added using goog.events.EventWrapper.listen.\n *\n * @param {goog.events.ListenableType} target The node to remove listener from.\n * @param {function(?):?|{handleEvent:function(?):?}|null} listener Callback\n *     method, or an object with a handleEvent function.\n * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to\n *     false).\n * @param {Object=} opt_scope Element in whose scope to call the listener.\n * @param {goog.events.EventHandler=} opt_eventHandler Event handler to remove\n *     listener from.\n * @override\n */\ngoog.events.ActionEventWrapper_.prototype.unlisten = function(\n    target, listener, opt_capt, opt_scope, opt_eventHandler) {\n  for (var type, j = 0; type = goog.events.ActionEventWrapper_.EVENT_TYPES_[j];\n       j++) {\n    var listeners = goog.events.getListeners(target, type, !!opt_capt);\n    for (var obj, i = 0; obj = listeners[i]; i++) {\n      var objListener =\n          /** @type {!goog.events.ActionEventWrapper_.FunctionExtension_} */ (\n              obj.listener);\n      if (objListener.listener_ == listener &&\n          objListener.scope_ == opt_scope) {\n        if (opt_eventHandler) {\n          opt_eventHandler.unlisten(\n              target, type, obj.listener, opt_capt, opt_scope);\n        } else {\n          goog.events.unlisten(target, type, obj.listener, opt_capt, opt_scope);\n        }\n        break;\n      }\n    }\n  }\n};\n","^?",1579837703000,"^@",["^A",["^14","^2R","^3W","^33","^3","^1C","~$goog.events.EventWrapper","^45","^1N"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/actioneventwrapper.js"],"^S",["^A",["~$goog.events.actionEventWrapper"]],"^1",true,"^2",["^3","^3W","^33","^14","^1N","^2R","^1C","^4V","^45"]],["^ ","^7",[1579837703000],"^1=",true,"^8","goog.html.cssspecificity.js","^9",["^:","goog/html/cssspecificity.js"],"^;","goog/html/cssspecificity.js","^<","^=","^>","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/** @fileoverview Calculator for specificity of CSS selectors. */\n\ngoog.module('goog.html.CssSpecificity');\ngoog.module.declareLegacyNamespace();\n\nvar userAgent = goog.require('goog.userAgent');\nvar userAgentProduct = goog.require('goog.userAgent.product');\n\n\n/**\n * Cached mapping from selectors to specificities.\n * @type {!Object<string, !Array<number>>}\n */\nvar specificityCache = {};\n\n/**\n * Calculates the specificity of CSS selectors, using a global cache if\n * supported.\n * @see http://www.w3.org/TR/css3-selectors/#specificity\n * @see https://specificity.keegan.st/\n * @param {string} selector The CSS selector.\n * @return {!Array<number>} The CSS specificity.\n * @supported IE9+, other browsers.\n */\nfunction getSpecificity(selector) {\n  if (userAgentProduct.IE && !userAgent.isVersionOrHigher(9)) {\n    // IE8 has buggy regex support.\n    return [0, 0, 0, 0];\n  }\n  var specificity = specificityCache.hasOwnProperty(selector) ?\n      specificityCache[selector] :\n      null;\n  if (specificity) {\n    return specificity;\n  }\n  if (Object.keys(specificityCache).length > (1 << 16)) {\n    // Limit the size of cache to (1 << 16) == 65536. Normally HTML pages don't\n    // have such numbers of selectors.\n    specificityCache = {};\n  }\n  specificity = calculateSpecificity(selector);\n  specificityCache[selector] = specificity;\n  return specificity;\n}\n\n/**\n * Find matches for a regular expression in the selector and increase count.\n * @param {string} selector The selector to match the regex with.\n * @param {!Array<number>} specificity The current specificity.\n * @param {!RegExp} regex The regular expression.\n * @param {number} typeIndex Index of type count.\n * @return {string}\n */\nfunction replaceWithEmptyText(selector, specificity, regex, typeIndex) {\n  return selector.replace(regex, function(match) {\n    specificity[typeIndex] += 1;\n    // Replace this simple selector with whitespace so it won't be counted\n    // in further simple selectors.\n    return Array(match.length + 1).join(' ');\n  });\n}\n\n/**\n * Replace escaped characters with plain text, using the \"A\" character.\n * @see https://www.w3.org/TR/CSS21/syndata.html#characters\n * @param {string} selector\n * @param {!RegExp} regex\n * @return {string}\n */\nfunction replaceWithPlainText(selector, regex) {\n  return selector.replace(regex, function(match) {\n    return Array(match.length + 1).join('A');\n  });\n}\n\n/**\n * Calculates the specificity of CSS selectors\n * @see http://www.w3.org/TR/css3-selectors/#specificity\n * @see https://github.com/keeganstreet/specificity\n * @see https://specificity.keegan.st/\n * @param {string} selector\n * @return {!Array<number>} The CSS specificity.\n */\nfunction calculateSpecificity(selector) {\n  var specificity = [0, 0, 0, 0];\n\n  // Cannot use RegExp literals for all regular expressions, IE does not accept\n  // the syntax.\n\n  // Matches a backslash followed by six hexadecimal digits followed by an\n  // optional single whitespace character.\n  var escapeHexadecimalRegex = new RegExp('\\\\\\\\[0-9A-Fa-f]{6}\\\\s?', 'g');\n  // Matches a backslash followed by fewer than six hexadecimal digits\n  // followed by a mandatory single whitespace character.\n  var escapeHexadecimalRegex2 = new RegExp('\\\\\\\\[0-9A-Fa-f]{1,5}\\\\s', 'g');\n  // Matches a backslash followed by any character\n  var escapeSpecialCharacter = /\\\\./g;\n  selector = replaceWithPlainText(selector, escapeHexadecimalRegex);\n  selector = replaceWithPlainText(selector, escapeHexadecimalRegex2);\n  selector = replaceWithPlainText(selector, escapeSpecialCharacter);\n\n  // Remove the negation pseudo-class (:not) but leave its argument because\n  // specificity is calculated on its argument.\n  var pseudoClassWithNotRegex = new RegExp(':not\\\\(([^\\\\)]*)\\\\)', 'g');\n  selector = selector.replace(pseudoClassWithNotRegex, '     $1 ');\n\n  // Remove anything after a left brace in case a user has pasted in a rule,\n  // not just a selector.\n  var rulesRegex = new RegExp('{[^]*', 'gm');\n  selector = selector.replace(rulesRegex, '');\n\n  // The following regular expressions assume that selectors matching the\n  // preceding regular expressions have been removed.\n\n  // SPECIFICITY 2: Counts attribute selectors.\n  var attributeRegex = new RegExp('(\\\\[[^\\\\]]+\\\\])', 'g');\n  selector = replaceWithEmptyText(selector, specificity, attributeRegex, 2);\n\n  // SPECIFICITY 1: Counts ID selectors.\n  var idRegex = new RegExp('(#[^\\\\#\\\\s\\\\+>~\\\\.\\\\[:]+)', 'g');\n  selector = replaceWithEmptyText(selector, specificity, idRegex, 1);\n\n  // SPECIFICITY 2: Counts class selectors.\n  var classRegex = new RegExp('(\\\\.[^\\\\s\\\\+>~\\\\.\\\\[:]+)', 'g');\n  selector = replaceWithEmptyText(selector, specificity, classRegex, 2);\n\n  // SPECIFICITY 3: Counts pseudo-element selectors.\n  var pseudoElementRegex =\n      /(::[^\\s\\+>~\\.\\[:]+|:first-line|:first-letter|:before|:after)/gi;\n  selector = replaceWithEmptyText(selector, specificity, pseudoElementRegex, 3);\n\n  // SPECIFICITY 2: Counts pseudo-class selectors.\n  // A regex for pseudo classes with brackets. For example:\n  //   :nth-child()\n  //   :nth-last-child()\n  //   :nth-of-type()\n  //   :nth-last-type()\n  //   :lang()\n  var pseudoClassWithBracketsRegex = /(:[\\w-]+\\([^\\)]*\\))/gi;\n  selector = replaceWithEmptyText(\n      selector, specificity, pseudoClassWithBracketsRegex, 2);\n  // A regex for other pseudo classes, which don't have brackets.\n  var pseudoClassRegex = /(:[^\\s\\+>~\\.\\[:]+)/g;\n  selector = replaceWithEmptyText(selector, specificity, pseudoClassRegex, 2);\n\n  // Remove universal selector and separator characters.\n  selector = selector.replace(/[\\*\\s\\+>~]/g, ' ');\n\n  // Remove any stray dots or hashes which aren't attached to words.\n  // These may be present if the user is live-editing this selector.\n  selector = selector.replace(/[#\\.]/g, ' ');\n\n  // SPECIFICITY 3: The only things left should be element selectors.\n  var elementRegex = /([^\\s\\+>~\\.\\[:]+)/g;\n  selector = replaceWithEmptyText(selector, specificity, elementRegex, 3);\n\n  return specificity;\n}\n\nexports = {\n  getSpecificity: getSpecificity\n};\n","^?",1579837703000,"^@",["^A",["^3V","^3","^18"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/cssspecificity.js"],"^S",["^A",["~$goog.html.CssSpecificity"]],"^1",true,"^2",["^3","^18","^3V"]],["^ ","^7",[1579837703000],"^8","goog.html.sanitizer.tagblacklist.js","^9",["^:","goog/html/sanitizer/tagblacklist.js"],"^;","goog/html/sanitizer/tagblacklist.js","^<","^=","^>","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Contains the tag blacklist for use in the Html sanitizer.\n */\n\ngoog.provide('goog.html.sanitizer.TagBlacklist');\n\n\n/**\n * A list of tags which should be removed entirely from the DOM, rather than\n * merely being made inert. In that sense, this is not a \"true\" blacklist\n * because removing a tag here without adding it to the whitelist does not have\n * security implications. Tag names must be in all caps. Note that even if\n * TEMPLATE is removed from this blacklist (or even whitelisted) it will\n * continue to be removed from the HTML, as TEMPLATE is used interally to\n * denote nodes which should not be added to the sanitized HTML.\n * @const @dict {boolean}\n */\ngoog.html.sanitizer.TagBlacklist = {\n  'APPLET': true,\n  'AUDIO': true,\n  'BASE': true,\n  'BGSOUND': true,\n  'EMBED': true,\n  // Blacklisted by default, can be allowed using allowFormTag.\n  'FORM': true,\n  // NOTE: can remove this for old browser behavior\n  'IFRAME': true,\n  // Can result in network requests\n  'ISINDEX': true,\n  // Unused and just unnecessarily increase attack surface\n  'KEYGEN': true,\n  'LAYER': true,\n  'LINK': true,\n  'META': true,\n  'OBJECT': true,\n  'SCRIPT': true,\n  // Can result in an XSS in FF\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=1205631\n  'SVG': true,\n  // Blacklisted by default, can be allowed using allowStyleTag.\n  'STYLE': true,\n  // Unsafe in most cases, and sanitizing its contents is not supported by the\n  // underlying SafeDomTreeProcessor.\n  'TEMPLATE': true,\n  'VIDEO': true\n};\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/sanitizer/tagblacklist.js"],"^S",["^A",["~$goog.html.sanitizer.TagBlacklist"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.style.transform.js","^9",["^:","goog/style/transform.js"],"^;","goog/style/transform.js","^<","^=","^>","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility methods to deal with CSS3 transforms programmatically.\n */\n\ngoog.provide('goog.style.transform');\n\ngoog.require('goog.functions');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.math.Coordinate3');\ngoog.require('goog.style');\ngoog.require('goog.userAgent');\ngoog.require('goog.userAgent.product.isVersion');\n\n\n/**\n * Whether CSS3 transform translate() is supported. IE 9 supports 2D transforms\n * and IE 10 supports 3D transforms. IE 8 supports neither.\n * @return {boolean} Whether the current environment supports CSS3 transforms.\n */\ngoog.style.transform.isSupported = goog.functions.cacheReturnValue(function() {\n  return !goog.userAgent.IE || goog.userAgent.product.isVersion(9);\n});\n\n\n/**\n * Whether CSS3 transform translate3d() is supported. If the current browser\n * supports this transform strategy.\n * @return {boolean} Whether the current environment supports CSS3 transforms.\n */\ngoog.style.transform.is3dSupported =\n    goog.functions.cacheReturnValue(function() {\n      return goog.userAgent.WEBKIT || goog.userAgent.EDGE ||\n          (goog.userAgent.GECKO && goog.userAgent.product.isVersion(10)) ||\n          (goog.userAgent.IE && goog.userAgent.product.isVersion(10));\n    });\n\n\n/**\n * Returns the x,y translation component of any CSS transforms applied to the\n * element, in pixels.\n *\n * @param {!Element} element The element to get the translation of.\n * @return {!goog.math.Coordinate} The CSS translation of the element in px.\n */\ngoog.style.transform.getTranslation = function(element) {\n  var transform = goog.style.getComputedTransform(element);\n  var matrixConstructor = goog.style.transform.matrixConstructor_();\n  if (transform && matrixConstructor) {\n    var matrix = new matrixConstructor(transform);\n    if (matrix) {\n      return new goog.math.Coordinate(matrix.m41, matrix.m42);\n    }\n  }\n  return new goog.math.Coordinate(0, 0);\n};\n\n\n/**\n * Translates an element's position using the CSS3 transform property.\n * NOTE: This replaces all other transforms already defined on the element.\n * @param {Element} element The element to translate.\n * @param {number} x The horizontal translation.\n * @param {number} y The vertical translation.\n * @return {boolean} Whether the CSS translation was set.\n */\ngoog.style.transform.setTranslation = function(element, x, y) {\n  if (!goog.style.transform.isSupported()) {\n    return false;\n  }\n  // TODO(user): After http://crbug.com/324107 is fixed, it will be faster to\n  // use something like: translation = new CSSMatrix().translate(x, y, 0);\n  var translation = goog.style.transform.is3dSupported() ?\n      'translate3d(' + x + 'px,' + y + 'px,' +\n          '0px)' :\n      'translate(' + x + 'px,' + y + 'px)';\n  goog.style.setStyle(\n      element, goog.style.transform.getTransformProperty_(), translation);\n  return true;\n};\n\n\n/**\n * Returns the scale of the x, y and z dimensions of CSS transforms applied to\n * the element.\n *\n * @param {!Element} element The element to get the scale of.\n * @return {!goog.math.Coordinate3} The scale of the element.\n */\ngoog.style.transform.getScale = function(element) {\n  var transform = goog.style.getComputedTransform(element);\n  var matrixConstructor = goog.style.transform.matrixConstructor_();\n  if (transform && matrixConstructor) {\n    var matrix = new matrixConstructor(transform);\n    if (matrix) {\n      return new goog.math.Coordinate3(matrix.m11, matrix.m22, matrix.m33);\n    }\n  }\n  return new goog.math.Coordinate3(0, 0, 0);\n};\n\n\n/**\n * Scales an element using the CSS3 transform property.\n * NOTE: This replaces all other transforms already defined on the element.\n * @param {!Element} element The element to scale.\n * @param {number} x The horizontal scale.\n * @param {number} y The vertical scale.\n * @param {number} z The depth scale.\n * @return {boolean} Whether the CSS scale was set.\n */\ngoog.style.transform.setScale = function(element, x, y, z) {\n  if (!goog.style.transform.isSupported()) {\n    return false;\n  }\n  var scale = goog.style.transform.is3dSupported() ?\n      'scale3d(' + x + ',' + y + ',' + z + ')' :\n      'scale(' + x + ',' + y + ')';\n  goog.style.setStyle(\n      element, goog.style.transform.getTransformProperty_(), scale);\n  return true;\n};\n\n\n/**\n * Returns the rotation CSS transform applied to the element.\n * @param {!Element} element The element to get the rotation of.\n * @return {number} The rotation of the element in degrees.\n */\ngoog.style.transform.getRotation = function(element) {\n  var transform = goog.style.getComputedTransform(element);\n  var matrixConstructor = goog.style.transform.matrixConstructor_();\n  if (transform && matrixConstructor) {\n    var matrix = new matrixConstructor(transform);\n    if (matrix) {\n      var x = matrix.m11 + matrix.m22;\n      var y = matrix.m12 - matrix.m21;\n      return Math.atan2(y, x) * (180 / Math.PI);\n    }\n  }\n  return 0;\n};\n\n\n/**\n * Rotates an element using the CSS3 transform property.\n * NOTE: This replaces all other transforms already defined on the element.\n * @param {!Element} element The element to rotate.\n * @param {number} degrees The number of degrees to rotate by.\n * @return {boolean} Whether the CSS rotation was set.\n */\ngoog.style.transform.setRotation = function(element, degrees) {\n  if (!goog.style.transform.isSupported()) {\n    return false;\n  }\n  var rotation = goog.style.transform.is3dSupported() ?\n      'rotate3d(0,0,1,' + degrees + 'deg)' :\n      'rotate(' + degrees + 'deg)';\n  goog.style.setStyle(\n      element, goog.style.transform.getTransformProperty_(), rotation);\n  return true;\n};\n\n\n/**\n * A cached value of the transform property depending on whether the useragent\n * is IE9.\n * @return {string} The transform property depending on whether the useragent\n *     is IE9.\n * @private\n */\ngoog.style.transform.getTransformProperty_ =\n    goog.functions.cacheReturnValue(function() {\n      return goog.userAgent.IE && goog.userAgent.DOCUMENT_MODE == 9 ?\n          '-ms-transform' :\n          'transform';\n    });\n\n\n/**\n * Gets the constructor for a CSSMatrix object.\n * @return {function(new:CSSMatrix, string)?} A constructor for a CSSMatrix\n *     object (or null).\n * @private\n */\ngoog.style.transform.matrixConstructor_ =\n    goog.functions.cacheReturnValue(function() {\n      if (goog.global['WebKitCSSMatrix'] !== undefined) {\n        return goog.global['WebKitCSSMatrix'];\n      }\n      if (goog.global['MSCSSMatrix'] !== undefined) {\n        return goog.global['MSCSSMatrix'];\n      }\n      if (goog.global['CSSMatrix'] !== undefined) {\n        return goog.global['CSSMatrix'];\n      }\n      return null;\n    });\n","^?",1579837703000,"^@",["^A",["^2<","^3","^18","^22","^2Y","~$goog.userAgent.product.isVersion","~$goog.math.Coordinate3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/style/transform.js"],"^S",["^A",["~$goog.style.transform"]],"^1",true,"^2",["^3","^2<","^22","^4[","^2Y","^18","^4Z"]],["^ ","^7",[1579837703000],"^8","goog.testing.messaging.mockmessageport.js","^9",["^:","goog/testing/messaging/mockmessageport.js"],"^;","goog/testing/messaging/mockmessageport.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A simple dummy class for representing message ports in tests.\n *\n */\n\ngoog.setTestOnly('goog.testing.messaging.MockMessagePort');\ngoog.provide('goog.testing.messaging.MockMessagePort');\n\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.testing.MockControl');\n\n\n\n/**\n * Class for unit-testing code that uses MessagePorts.\n * @param {*} id An opaque identifier, used because message ports otherwise have\n *     no distinguishing characteristics.\n * @param {goog.testing.MockControl} mockControl The mock control used to create\n *     the method mock for #postMessage.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.testing.messaging.MockMessagePort = function(id, mockControl) {\n  goog.testing.messaging.MockMessagePort.base(this, 'constructor');\n\n  /**\n   * An opaque identifier, used because message ports otherwise have no\n   * distinguishing characteristics.\n   * @type {*}\n   */\n  this.id = id;\n\n  /**\n   * Whether or not the port has been started.\n   * @type {boolean}\n   */\n  this.started = false;\n\n  /**\n   * Whether or not the port has been closed.\n   * @type {boolean}\n   */\n  this.closed = false;\n\n  mockControl.createMethodMock(this, 'postMessage');\n};\ngoog.inherits(goog.testing.messaging.MockMessagePort, goog.events.EventTarget);\n\n\n/**\n * A mock postMessage funciton. Actually an instance of\n * {@link goog.testing.FunctionMock}.\n * @param {*} message The message to send.\n * @param {Array<MessagePort>=} opt_ports Ports to send with the message.\n */\ngoog.testing.messaging.MockMessagePort.prototype.postMessage = function(\n    message, opt_ports) {};\n\n\n/**\n * Starts the port.\n */\ngoog.testing.messaging.MockMessagePort.prototype.start = function() {\n  this.started = true;\n};\n\n\n/**\n * Closes the port.\n */\ngoog.testing.messaging.MockMessagePort.prototype.close = function() {\n  this.closed = true;\n};\n","^?",1579837703000,"^@",["^A",["^3","^1M","~$goog.testing.MockControl"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/messaging/mockmessageport.js"],"^S",["^A",["~$goog.testing.messaging.MockMessagePort"]],"^1",true,"^2",["^3","^1M","^51"]],["^ ","^7",[1579837703000],"^8","goog.ui.toolbarrenderer.js","^9",["^:","goog/ui/toolbarrenderer.js"],"^;","goog/ui/toolbarrenderer.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for {@link goog.ui.Toolbar}s.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ToolbarRenderer');\n\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.ui.Container');\ngoog.require('goog.ui.ContainerRenderer');\ngoog.require('goog.ui.Separator');\ngoog.require('goog.ui.ToolbarSeparatorRenderer');\n\n\n\n/**\n * Default renderer for {@link goog.ui.Toolbar}s, based on {@link\n * goog.ui.ContainerRenderer}.\n * @constructor\n * @extends {goog.ui.ContainerRenderer}\n */\ngoog.ui.ToolbarRenderer = function() {\n  goog.ui.ContainerRenderer.call(this, goog.a11y.aria.Role.TOOLBAR);\n};\ngoog.inherits(goog.ui.ToolbarRenderer, goog.ui.ContainerRenderer);\ngoog.addSingletonGetter(goog.ui.ToolbarRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of toolbars rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.ToolbarRenderer.CSS_CLASS = goog.getCssName('goog-toolbar');\n\n\n/**\n * Inspects the element, and creates an instance of {@link goog.ui.Control} or\n * an appropriate subclass best suited to decorate it.  Overrides the superclass\n * implementation by recognizing HR elements as separators.\n * @param {Element} element Element to decorate.\n * @return {goog.ui.Control?} A new control suitable to decorate the element\n *     (null if none).\n * @override\n */\ngoog.ui.ToolbarRenderer.prototype.getDecoratorForChild = function(element) {\n  return element.tagName == goog.dom.TagName.HR ?\n      new goog.ui.Separator(goog.ui.ToolbarSeparatorRenderer.getInstance()) :\n      goog.ui.ToolbarRenderer.superClass_.getDecoratorForChild.call(\n          this, element);\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of containers\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.ToolbarRenderer.prototype.getCssClass = function() {\n  return goog.ui.ToolbarRenderer.CSS_CLASS;\n};\n\n\n/**\n * Returns the default orientation of containers rendered or decorated by this\n * renderer.  This implementation returns `HORIZONTAL`.\n * @return {goog.ui.Container.Orientation} Default orientation for containers\n *     created or decorated by this renderer.\n * @override\n */\ngoog.ui.ToolbarRenderer.prototype.getDefaultOrientation = function() {\n  return goog.ui.Container.Orientation.HORIZONTAL;\n};\n","^?",1579837703000,"^@",["^A",["~$goog.ui.ContainerRenderer","~$goog.ui.Separator","^33","^3","~$goog.ui.Container","~$goog.ui.ToolbarSeparatorRenderer","^4"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/toolbarrenderer.js"],"^S",["^A",["~$goog.ui.ToolbarRenderer"]],"^1",true,"^2",["^3","^33","^4","^55","^53","^54","^56"]],["^ ","^7",[1579837703000],"^8","goog.labs.pubsub.broadcastpubsub.js","^9",["^:","goog/labs/pubsub/broadcastpubsub.js"],"^;","goog/labs/pubsub/broadcastpubsub.js","^<","^=","^>","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.labs.pubsub.BroadcastPubSub');\n\n\ngoog.require('goog.Disposable');\ngoog.require('goog.Timer');\ngoog.require('goog.array');\ngoog.require('goog.async.run');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.log');\ngoog.require('goog.math');\ngoog.require('goog.pubsub.PubSub');\ngoog.require('goog.storage.Storage');\ngoog.require('goog.storage.mechanism.HTML5LocalStorage');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Topic-based publish/subscribe messaging implementation that provides\n * communication between browsing contexts that share the same origin.\n *\n * Wrapper around PubSub that utilizes localStorage to broadcast publications to\n * all browser windows with the same origin as the publishing context. This\n * allows for topic-based publish/subscribe implementation of strings shared by\n * all browser contexts that share the same origin.\n *\n * Delivery is guaranteed on all browsers except IE8 where topics expire after a\n * timeout. Publishing of a topic within a callback function provides no\n * guarantee on ordering in that there is a possibility that separate origin\n * contexts may see topics in a different order.\n *\n * This class is not secure and in certain cases (e.g., a browser crash) data\n * that is published can persist in localStorage indefinitely. Do not use this\n * class to communicate private or confidential information.\n *\n * On IE8, localStorage is shared by the http and https origins. An attacker\n * could possibly leverage this to publish to the secure origin.\n *\n * goog.labs.pubsub.BroadcastPubSub wraps an instance of PubSub rather than\n * subclassing because the base PubSub class allows publishing of arbitrary\n * objects.\n *\n * Special handling is done for the IE8 browsers. See the IE8_EVENTS_KEY_\n * constant and the `publish` function for more information.\n *\n *\n * @constructor @struct @extends {goog.Disposable}\n */\ngoog.labs.pubsub.BroadcastPubSub = function() {\n  goog.labs.pubsub.BroadcastPubSub.base(this, 'constructor');\n  goog.labs.pubsub.BroadcastPubSub.instances_.push(this);\n\n  /** @private @const */\n  this.pubSub_ = new goog.pubsub.PubSub();\n  this.registerDisposable(this.pubSub_);\n\n  /** @private @const */\n  this.handler_ = new goog.events.EventHandler(this);\n  this.registerDisposable(this.handler_);\n\n  /** @private @const */\n  this.logger_ = goog.log.getLogger('goog.labs.pubsub.BroadcastPubSub');\n\n  /** @private @const */\n  this.mechanism_ = new goog.storage.mechanism.HTML5LocalStorage();\n\n  /** @private {?goog.storage.Storage} */\n  this.storage_ = null;\n\n  /** @private {?Object<string, number>} */\n  this.ie8LastEventTimes_ = null;\n\n  /** @private {number} */\n  this.ie8StartupTimestamp_ = goog.now() - 1;\n\n  if (this.mechanism_.isAvailable()) {\n    this.storage_ = new goog.storage.Storage(this.mechanism_);\n\n    var target = window;\n    if (goog.labs.pubsub.BroadcastPubSub.IS_IE8_) {\n      this.ie8LastEventTimes_ = {};\n\n      target = document;\n    }\n    this.handler_.listen(\n        target, goog.events.EventType.STORAGE, this.handleStorageEvent_);\n  }\n};\ngoog.inherits(goog.labs.pubsub.BroadcastPubSub, goog.Disposable);\n\n\n/** @private @const {!Array<!goog.labs.pubsub.BroadcastPubSub>} */\ngoog.labs.pubsub.BroadcastPubSub.instances_ = [];\n\n\n/**\n * SitePubSub namespace for localStorage.\n * @private @const\n */\ngoog.labs.pubsub.BroadcastPubSub.STORAGE_KEY_ = '_closure_bps';\n\n\n/**\n * Handle the storage event and possibly dispatch topics.\n * @param {!goog.events.BrowserEvent} e Event object.\n * @private\n */\ngoog.labs.pubsub.BroadcastPubSub.prototype.handleStorageEvent_ = function(e) {\n  if (goog.labs.pubsub.BroadcastPubSub.IS_IE8_) {\n    // Even though we have the event, IE8 doesn't update our localStorage until\n    // after we handle the actual event.\n    goog.async.run(this.handleIe8StorageEvent_, this);\n    return;\n  }\n\n  var browserEvent = e.getBrowserEvent();\n  if (browserEvent.key != goog.labs.pubsub.BroadcastPubSub.STORAGE_KEY_) {\n    return;\n  }\n\n  var data = JSON.parse(browserEvent.newValue);\n  var args = goog.isObject(data) && data['args'];\n  if (goog.isArray(args) && goog.array.every(args, goog.isString)) {\n    this.dispatch_(args);\n  } else {\n    goog.log.warning(this.logger_, 'storage event contained invalid arguments');\n  }\n};\n\n\n/**\n * Dispatches args on the internal pubsub queue.\n * @param {!Array<string>} args The arguments to publish.\n * @private\n */\ngoog.labs.pubsub.BroadcastPubSub.prototype.dispatch_ = function(args) {\n  goog.pubsub.PubSub.prototype.publish.apply(this.pubSub_, args);\n};\n\n\n/**\n * Publishes a message to a topic. Remote subscriptions in other tabs/windows\n * are dispatched via local storage events. Local subscriptions are called\n * asynchronously via Timer event in order to simulate remote behavior locally.\n * @param {string} topic Topic to publish to.\n * @param {...string} var_args String arguments that are applied to each\n *     subscription function.\n */\ngoog.labs.pubsub.BroadcastPubSub.prototype.publish = function(topic, var_args) {\n  var args = goog.array.toArray(arguments);\n\n  // Dispatch to localStorage.\n  if (this.storage_) {\n    // Update topics to use the optional prefix.\n    var now = goog.now();\n    var data = {'args': args, 'timestamp': now};\n\n    if (!goog.labs.pubsub.BroadcastPubSub.IS_IE8_) {\n      // Generated events will contain all the data in modern browsers.\n      this.storage_.set(goog.labs.pubsub.BroadcastPubSub.STORAGE_KEY_, data);\n      this.storage_.remove(goog.labs.pubsub.BroadcastPubSub.STORAGE_KEY_);\n    } else {\n      // With IE8 we need to manage our own events queue.\n      var events = null;\n\n      try {\n        events =\n            this.storage_.get(goog.labs.pubsub.BroadcastPubSub.IE8_EVENTS_KEY_);\n      } catch (ex) {\n        goog.log.error(\n            this.logger_, 'publish encountered invalid event queue at ' +\n                goog.labs.pubsub.BroadcastPubSub.IE8_EVENTS_KEY_);\n      }\n      if (!goog.isArray(events)) {\n        events = [];\n      }\n      // Avoid a race condition where we're publishing in the same\n      // millisecond that another event that may be getting\n      // processed. In short, we try go guarantee that whatever event\n      // we put on the event queue has a timestamp that is older than\n      // any other timestamp in the queue.\n      var lastEvent = events[events.length - 1];\n      var lastTimestamp =\n          lastEvent && lastEvent['timestamp'] || this.ie8StartupTimestamp_;\n      if (lastTimestamp >= now) {\n        now = lastTimestamp +\n            goog.labs.pubsub.BroadcastPubSub.IE8_TIMESTAMP_UNIQUE_OFFSET_MS_;\n        data['timestamp'] = now;\n      }\n      events.push(data);\n      this.storage_.set(\n          goog.labs.pubsub.BroadcastPubSub.IE8_EVENTS_KEY_, events);\n\n      // Cleanup this event in IE8_EVENT_LIFETIME_MS_ milliseconds.\n      goog.Timer.callOnce(\n          goog.bind(this.cleanupIe8StorageEvents_, this, now),\n          goog.labs.pubsub.BroadcastPubSub.IE8_EVENT_LIFETIME_MS_);\n    }\n  }\n\n  // W3C spec is to not dispatch the storage event to the same window that\n  // modified localStorage. For conforming browsers we have to manually dispatch\n  // the publish event to subscriptions on instances of BroadcastPubSub in the\n  // current window.\n  if (!goog.userAgent.IE) {\n    // Dispatch the publish event to local instances asynchronously to fix some\n    // quirks with timings. The result is that all subscriptions are dispatched\n    // before any future publishes are processed. The effect is that\n    // subscriptions in the same window are dispatched as if they are the result\n    // of a publish from another tab.\n    goog.array.forEach(\n        goog.labs.pubsub.BroadcastPubSub.instances_, function(instance) {\n          goog.async.run(goog.bind(instance.dispatch_, instance, args));\n        });\n  }\n};\n\n\n/**\n * Unsubscribes a function from a topic. Only deletes the first match found.\n * Returns a Boolean indicating whether a subscription was removed.\n * @param {string} topic Topic to unsubscribe from.\n * @param {Function} fn Function to unsubscribe.\n * @param {Object=} opt_context Object in whose context the function was to be\n *     called (the global scope if none).\n * @return {boolean} Whether a matching subscription was removed.\n */\ngoog.labs.pubsub.BroadcastPubSub.prototype.unsubscribe = function(\n    topic, fn, opt_context) {\n  return this.pubSub_.unsubscribe(topic, fn, opt_context);\n};\n\n\n/**\n * Removes a subscription based on the key returned by {@link #subscribe}. No-op\n * if no matching subscription is found. Returns a Boolean indicating whether a\n * subscription was removed.\n * @param {number} key Subscription key.\n * @return {boolean} Whether a matching subscription was removed.\n */\ngoog.labs.pubsub.BroadcastPubSub.prototype.unsubscribeByKey = function(key) {\n  return this.pubSub_.unsubscribeByKey(key);\n};\n\n\n/**\n * Subscribes a function to a topic. The function is invoked as a method on the\n * given `opt_context` object, or in the global scope if no context is\n * specified. Subscribing the same function to the same topic multiple times\n * will result in multiple function invocations while publishing. Returns a\n * subscription key that can be used to unsubscribe the function from the topic\n * via {@link #unsubscribeByKey}.\n * @param {string} topic Topic to subscribe to.\n * @param {Function} fn Function to be invoked when a message is published to\n *     the given topic.\n * @param {Object=} opt_context Object in whose context the function is to be\n *     called (the global scope if none).\n * @return {number} Subscription key.\n */\ngoog.labs.pubsub.BroadcastPubSub.prototype.subscribe = function(\n    topic, fn, opt_context) {\n  return this.pubSub_.subscribe(topic, fn, opt_context);\n};\n\n\n/**\n * Subscribes a single-use function to a topic. The function is invoked as a\n * method on the given `opt_context` object, or in the global scope if no\n * context is specified, and is then unsubscribed. Returns a subscription key\n * that can be used to unsubscribe the function from the topic via {@link\n * #unsubscribeByKey}.\n * @param {string} topic Topic to subscribe to.\n * @param {Function} fn Function to be invoked once and then unsubscribed when\n *     a message is published to the given topic.\n * @param {Object=} opt_context Object in whose context the function is to be\n *     called (the global scope if none).\n * @return {number} Subscription key.\n */\ngoog.labs.pubsub.BroadcastPubSub.prototype.subscribeOnce = function(\n    topic, fn, opt_context) {\n  return this.pubSub_.subscribeOnce(topic, fn, opt_context);\n};\n\n\n/**\n * Returns the number of subscriptions to the given topic (or all topics if\n * unspecified). This number will not change while publishing any messages.\n * @param {string=} opt_topic The topic (all topics if unspecified).\n * @return {number} Number of subscriptions to the topic.\n */\ngoog.labs.pubsub.BroadcastPubSub.prototype.getCount = function(opt_topic) {\n  return this.pubSub_.getCount(opt_topic);\n};\n\n\n/**\n * Clears the subscription list for a topic, or all topics if unspecified.\n * @param {string=} opt_topic Topic to clear (all topics if unspecified).\n */\ngoog.labs.pubsub.BroadcastPubSub.prototype.clear = function(opt_topic) {\n  this.pubSub_.clear(opt_topic);\n};\n\n\n/** @override */\ngoog.labs.pubsub.BroadcastPubSub.prototype.disposeInternal = function() {\n  goog.array.remove(goog.labs.pubsub.BroadcastPubSub.instances_, this);\n  if (goog.labs.pubsub.BroadcastPubSub.IS_IE8_ && this.storage_ != null &&\n      goog.labs.pubsub.BroadcastPubSub.instances_.length == 0) {\n    this.storage_.remove(goog.labs.pubsub.BroadcastPubSub.IE8_EVENTS_KEY_);\n  }\n  goog.labs.pubsub.BroadcastPubSub.base(this, 'disposeInternal');\n};\n\n\n/**\n * Prefix for IE8 storage event queue keys.\n * @private @const\n */\ngoog.labs.pubsub.BroadcastPubSub.IE8_EVENTS_KEY_PREFIX_ = '_closure_bps_ie8evt';\n\n\n/**\n * Time (in milliseconds) that IE8 events should live. If they are not\n * processed by other windows in this time they will be removed.\n * @private @const\n */\ngoog.labs.pubsub.BroadcastPubSub.IE8_EVENT_LIFETIME_MS_ = 1000 * 10;\n\n\n/**\n * Time (in milliseconds) that the IE8 event queue should live.\n * @private @const\n */\ngoog.labs.pubsub.BroadcastPubSub.IE8_QUEUE_LIFETIME_MS_ = 1000 * 30;\n\n\n/**\n * Time delta that is used to distinguish between timestamps of events that\n * happen in the same millisecond.\n * @private @const\n */\ngoog.labs.pubsub.BroadcastPubSub.IE8_TIMESTAMP_UNIQUE_OFFSET_MS_ = .01;\n\n\n/**\n * Name for this window/tab's storage key that stores its IE8 event queue.\n *\n * The browsers storage events are supposed to track the key which was changed,\n * the previous value for that key, and the new value of that key. Our\n * implementation is dependent on this information but IE8 doesn't provide it.\n * We implement our own event queue using local storage to track this\n * information in IE8. Since all instances share the same localStorage context\n * in a particular tab, we share the events queue.\n *\n * This key is a static member shared by all instances of BroadcastPubSub in the\n * same Window context. To avoid read-update-write contention, this key is only\n * written in a single context in the cleanupIe8StorageEvents_ function. Since\n * instances in other contexts will read this key there is code in the\n * `publish` function to make sure timestamps are unique even within the same\n * millisecond.\n *\n * @private @const {string}\n */\ngoog.labs.pubsub.BroadcastPubSub.IE8_EVENTS_KEY_ =\n    goog.labs.pubsub.BroadcastPubSub.IE8_EVENTS_KEY_PREFIX_ +\n    goog.math.randomInt(1e9);\n\n\n/**\n * All instances of this object should access elements using strings and not\n * attributes. Since we are communicating across browser tabs we could be\n * dealing with different versions of javascript and thus may have different\n * obfuscation in each tab.\n * @private @typedef {{'timestamp': number, 'args': !Array<string>}}\n */\ngoog.labs.pubsub.BroadcastPubSub.Ie8Event_;\n\n\n/** @private @const */\ngoog.labs.pubsub.BroadcastPubSub.IS_IE8_ =\n    goog.userAgent.IE && goog.userAgent.DOCUMENT_MODE == 8;\n\n\n/**\n * Validates an event object.\n * @param {!Object} obj The object to validate as an Event.\n * @return {?goog.labs.pubsub.BroadcastPubSub.Ie8Event_} A valid\n *     event object or null if the object is invalid.\n * @private\n */\ngoog.labs.pubsub.BroadcastPubSub.validateIe8Event_ = function(obj) {\n  if (goog.isObject(obj) && typeof obj['timestamp'] === 'number' &&\n      goog.array.every(obj['args'], goog.isString)) {\n    return {'timestamp': obj['timestamp'], 'args': obj['args']};\n  }\n  return null;\n};\n\n\n/**\n * Returns an array of valid IE8 events.\n * @param {!Array<!Object>} events Possible IE8 events.\n * @return {!Array<!goog.labs.pubsub.BroadcastPubSub.Ie8Event_>}\n *     Valid IE8 events.\n * @private\n */\ngoog.labs.pubsub.BroadcastPubSub.filterValidIe8Events_ = function(events) {\n  return goog.array.filter(\n      goog.array.map(\n          events, goog.labs.pubsub.BroadcastPubSub.validateIe8Event_),\n      goog.isDefAndNotNull);\n};\n\n\n/**\n * Returns the IE8 events that have a timestamp later than the provided\n * timestamp.\n * @param {number} timestamp Expired timestamp.\n * @param {!Array<!goog.labs.pubsub.BroadcastPubSub.Ie8Event_>} events\n *     Possible IE8 events.\n * @return {!Array<!goog.labs.pubsub.BroadcastPubSub.Ie8Event_>}\n *     Unexpired IE8 events.\n * @private\n */\ngoog.labs.pubsub.BroadcastPubSub.filterNewIe8Events_ = function(\n    timestamp, events) {\n  return goog.array.filter(\n      events, function(event) { return event['timestamp'] > timestamp; });\n};\n\n\n/**\n * Processes the events array for key if all elements are valid IE8 events.\n * @param {string} key The key in localStorage where the event queue is stored.\n * @param {!Array<!Object>} events Array of possible events stored at key.\n * @return {boolean} Return true if all elements in the array are valid\n *     events, false otherwise.\n * @private\n */\ngoog.labs.pubsub.BroadcastPubSub.prototype.maybeProcessIe8Events_ = function(\n    key, events) {\n  if (!events.length) {\n    return false;\n  }\n\n  var validEvents =\n      goog.labs.pubsub.BroadcastPubSub.filterValidIe8Events_(events);\n  if (validEvents.length == events.length) {\n    var lastTimestamp = goog.array.peek(validEvents)['timestamp'];\n    var previousTime =\n        this.ie8LastEventTimes_[key] || this.ie8StartupTimestamp_;\n    if (lastTimestamp > previousTime -\n            goog.labs.pubsub.BroadcastPubSub.IE8_QUEUE_LIFETIME_MS_) {\n      this.ie8LastEventTimes_[key] = lastTimestamp;\n      validEvents = goog.labs.pubsub.BroadcastPubSub.filterNewIe8Events_(\n          previousTime, validEvents);\n      for (var i = 0, event; event = validEvents[i]; i++) {\n        this.dispatch_(event['args']);\n      }\n      return true;\n    }\n  } else {\n    goog.log.warning(this.logger_, 'invalid events found in queue ' + key);\n  }\n\n  return false;\n};\n\n\n/**\n * Handle the storage event and possibly dispatch events. Looks through all keys\n * in localStorage for valid keys.\n * @private\n */\ngoog.labs.pubsub.BroadcastPubSub.prototype.handleIe8StorageEvent_ = function() {\n  var numKeys = this.mechanism_.getCount();\n  for (var idx = 0; idx < numKeys; idx++) {\n    var key = this.mechanism_.key(idx);\n    // Don't process events we generated. The W3C standard says that storage\n    // events should be queued by the browser for each window whose document's\n    // storage object is affected by a change in localStorage. Chrome, Firefox,\n    // and modern IE don't dispatch the event to the window which made the\n    // change. This code simulates that behavior in IE8.\n    if (!(typeof key === 'string' &&\n          goog.string.startsWith(\n              key, goog.labs.pubsub.BroadcastPubSub.IE8_EVENTS_KEY_PREFIX_))) {\n      continue;\n    }\n\n    var events = null;\n\n    try {\n      events = this.storage_.get(key);\n    } catch (ex) {\n      goog.log.warning(this.logger_, 'invalid remote event queue ' + key);\n    }\n\n    if (!(goog.isArray(events) && this.maybeProcessIe8Events_(key, events))) {\n      // Events is not an array, empty, contains invalid events, or expired.\n      this.storage_.remove(key);\n    }\n  }\n};\n\n\n/**\n * Cleanup our IE8 event queue by removing any events that come at or before the\n * given timestamp.\n * @param {number} timestamp Maximum timestamp to remove from the queue.\n * @private\n */\ngoog.labs.pubsub.BroadcastPubSub.prototype.cleanupIe8StorageEvents_ = function(\n    timestamp) {\n  var events = null;\n\n  try {\n    events =\n        this.storage_.get(goog.labs.pubsub.BroadcastPubSub.IE8_EVENTS_KEY_);\n  } catch (ex) {\n    goog.log.error(\n        this.logger_, 'cleanup encountered invalid event queue key ' +\n            goog.labs.pubsub.BroadcastPubSub.IE8_EVENTS_KEY_);\n  }\n  if (!goog.isArray(events)) {\n    this.storage_.remove(goog.labs.pubsub.BroadcastPubSub.IE8_EVENTS_KEY_);\n    return;\n  }\n\n  events = goog.labs.pubsub.BroadcastPubSub.filterNewIe8Events_(\n      timestamp,\n      goog.labs.pubsub.BroadcastPubSub.filterValidIe8Events_(events));\n\n  if (events.length > 0) {\n    this.storage_.set(goog.labs.pubsub.BroadcastPubSub.IE8_EVENTS_KEY_, events);\n  } else {\n    this.storage_.remove(goog.labs.pubsub.BroadcastPubSub.IE8_EVENTS_KEY_);\n  }\n};\n","^?",1579837703000,"^@",["^A",["^2R","^3U","~$goog.async.run","^16","^3","^18","^3B","^1C","~$goog.storage.Storage","~$goog.storage.mechanism.HTML5LocalStorage","^3C","^[","~$goog.pubsub.PubSub","^1S"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/pubsub/broadcastpubsub.js"],"^S",["^A",["~$goog.labs.pubsub.BroadcastPubSub"]],"^1",true,"^2",["^3","^3C","^3U","^1S","^58","^2R","^1C","^3B","^[","^5;","^59","^5:","^16","^18"]],["^ ","^7",[1579837703000],"^8","goog.math.affinetransform.js","^9",["^:","goog/math/affinetransform.js"],"^;","goog/math/affinetransform.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Provides an object representation of an AffineTransform and\n * methods for working with it.\n */\n\n\ngoog.provide('goog.math.AffineTransform');\n\n\n\n/**\n * Creates a 2D affine transform. An affine transform performs a linear\n * mapping from 2D coordinates to other 2D coordinates that preserves the\n * \"straightness\" and \"parallelness\" of lines.\n *\n * Such a coordinate transformation can be represented by a 3 row by 3 column\n * matrix with an implied last row of [ 0 0 1 ]. This matrix transforms source\n * coordinates (x,y) into destination coordinates (x',y') by considering them\n * to be a column vector and multiplying the coordinate vector by the matrix\n * according to the following process:\n * <pre>\n *      [ x']   [  m00  m01  m02  ] [ x ]   [ m00x + m01y + m02 ]\n *      [ y'] = [  m10  m11  m12  ] [ y ] = [ m10x + m11y + m12 ]\n *      [ 1 ]   [   0    0    1   ] [ 1 ]   [         1         ]\n * </pre>\n *\n * This class is optimized for speed and minimizes calculations based on its\n * knowledge of the underlying matrix (as opposed to say simply performing\n * matrix multiplication).\n *\n * @param {number=} opt_m00 The m00 coordinate of the transform.\n * @param {number=} opt_m10 The m10 coordinate of the transform.\n * @param {number=} opt_m01 The m01 coordinate of the transform.\n * @param {number=} opt_m11 The m11 coordinate of the transform.\n * @param {number=} opt_m02 The m02 coordinate of the transform.\n * @param {number=} opt_m12 The m12 coordinate of the transform.\n * @struct\n * @constructor\n * @final\n */\ngoog.math.AffineTransform = function(\n    opt_m00, opt_m10, opt_m01, opt_m11, opt_m02, opt_m12) {\n  if (arguments.length == 6) {\n    this.setTransform(\n        /** @type {number} */ (opt_m00),\n        /** @type {number} */ (opt_m10),\n        /** @type {number} */ (opt_m01),\n        /** @type {number} */ (opt_m11),\n        /** @type {number} */ (opt_m02),\n        /** @type {number} */ (opt_m12));\n  } else if (arguments.length != 0) {\n    throw new Error('Insufficient matrix parameters');\n  } else {\n    this.m00_ = this.m11_ = 1;\n    this.m10_ = this.m01_ = this.m02_ = this.m12_ = 0;\n  }\n};\n\n\n/**\n * @return {boolean} Whether this transform is the identity transform.\n */\ngoog.math.AffineTransform.prototype.isIdentity = function() {\n  return this.m00_ == 1 && this.m10_ == 0 && this.m01_ == 0 && this.m11_ == 1 &&\n      this.m02_ == 0 && this.m12_ == 0;\n};\n\n\n/**\n * @return {!goog.math.AffineTransform} A copy of this transform.\n */\ngoog.math.AffineTransform.prototype.clone = function() {\n  return new goog.math.AffineTransform(\n      this.m00_, this.m10_, this.m01_, this.m11_, this.m02_, this.m12_);\n};\n\n\n/**\n * Sets this transform to the matrix specified by the 6 values.\n *\n * @param {number} m00 The m00 coordinate of the transform.\n * @param {number} m10 The m10 coordinate of the transform.\n * @param {number} m01 The m01 coordinate of the transform.\n * @param {number} m11 The m11 coordinate of the transform.\n * @param {number} m02 The m02 coordinate of the transform.\n * @param {number} m12 The m12 coordinate of the transform.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.setTransform = function(\n    m00, m10, m01, m11, m02, m12) {\n  if (typeof m00 !== 'number' || typeof m10 !== 'number' ||\n      typeof m01 !== 'number' || typeof m11 !== 'number' ||\n      typeof m02 !== 'number' || typeof m12 !== 'number') {\n    throw new Error('Invalid transform parameters');\n  }\n  this.m00_ = m00;\n  this.m10_ = m10;\n  this.m01_ = m01;\n  this.m11_ = m11;\n  this.m02_ = m02;\n  this.m12_ = m12;\n  return this;\n};\n\n\n/**\n * Sets this transform to be identical to the given transform.\n *\n * @param {!goog.math.AffineTransform} tx The transform to copy.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.copyFrom = function(tx) {\n  this.m00_ = tx.m00_;\n  this.m10_ = tx.m10_;\n  this.m01_ = tx.m01_;\n  this.m11_ = tx.m11_;\n  this.m02_ = tx.m02_;\n  this.m12_ = tx.m12_;\n  return this;\n};\n\n\n/**\n * Concatenates this transform with a scaling transformation.\n *\n * @param {number} sx The x-axis scaling factor.\n * @param {number} sy The y-axis scaling factor.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.scale = function(sx, sy) {\n  this.m00_ *= sx;\n  this.m10_ *= sx;\n  this.m01_ *= sy;\n  this.m11_ *= sy;\n  return this;\n};\n\n\n/**\n * Pre-concatenates this transform with a scaling transformation,\n * i.e. calculates the following matrix product:\n *\n * <pre>\n * [sx  0 0] [m00 m01 m02]\n * [ 0 sy 0] [m10 m11 m12]\n * [ 0  0 1] [  0   0   1]\n * </pre>\n *\n * @param {number} sx The x-axis scaling factor.\n * @param {number} sy The y-axis scaling factor.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.preScale = function(sx, sy) {\n  this.m00_ *= sx;\n  this.m01_ *= sx;\n  this.m02_ *= sx;\n  this.m10_ *= sy;\n  this.m11_ *= sy;\n  this.m12_ *= sy;\n  return this;\n};\n\n\n/**\n * Concatenates this transform with a translate transformation.\n *\n * @param {number} dx The distance to translate in the x direction.\n * @param {number} dy The distance to translate in the y direction.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.translate = function(dx, dy) {\n  this.m02_ += dx * this.m00_ + dy * this.m01_;\n  this.m12_ += dx * this.m10_ + dy * this.m11_;\n  return this;\n};\n\n\n/**\n * Pre-concatenates this transform with a translate transformation,\n * i.e. calculates the following matrix product:\n *\n * <pre>\n * [1 0 dx] [m00 m01 m02]\n * [0 1 dy] [m10 m11 m12]\n * [0 0  1] [  0   0   1]\n * </pre>\n *\n * @param {number} dx The distance to translate in the x direction.\n * @param {number} dy The distance to translate in the y direction.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.preTranslate = function(dx, dy) {\n  this.m02_ += dx;\n  this.m12_ += dy;\n  return this;\n};\n\n\n/**\n * Concatenates this transform with a rotation transformation around an anchor\n * point.\n *\n * @param {number} theta The angle of rotation measured in radians.\n * @param {number} x The x coordinate of the anchor point.\n * @param {number} y The y coordinate of the anchor point.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.rotate = function(theta, x, y) {\n  return this.concatenate(\n      goog.math.AffineTransform.getRotateInstance(theta, x, y));\n};\n\n\n/**\n * Pre-concatenates this transform with a rotation transformation around an\n * anchor point.\n *\n * @param {number} theta The angle of rotation measured in radians.\n * @param {number} x The x coordinate of the anchor point.\n * @param {number} y The y coordinate of the anchor point.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.preRotate = function(theta, x, y) {\n  return this.preConcatenate(\n      goog.math.AffineTransform.getRotateInstance(theta, x, y));\n};\n\n\n/**\n * Concatenates this transform with a shear transformation.\n *\n * @param {number} shx The x shear factor.\n * @param {number} shy The y shear factor.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.shear = function(shx, shy) {\n  const m00 = this.m00_;\n  const m10 = this.m10_;\n  this.m00_ += shy * this.m01_;\n  this.m10_ += shy * this.m11_;\n  this.m01_ += shx * m00;\n  this.m11_ += shx * m10;\n  return this;\n};\n\n\n/**\n * Pre-concatenates this transform with a shear transformation.\n * i.e. calculates the following matrix product:\n *\n * <pre>\n * [  1 shx 0] [m00 m01 m02]\n * [shy   1 0] [m10 m11 m12]\n * [  0   0 1] [  0   0   1]\n * </pre>\n *\n * @param {number} shx The x shear factor.\n * @param {number} shy The y shear factor.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.preShear = function(shx, shy) {\n  const m00 = this.m00_;\n  const m01 = this.m01_;\n  const m02 = this.m02_;\n  this.m00_ += shx * this.m10_;\n  this.m01_ += shx * this.m11_;\n  this.m02_ += shx * this.m12_;\n  this.m10_ += shy * m00;\n  this.m11_ += shy * m01;\n  this.m12_ += shy * m02;\n  return this;\n};\n\n\n/**\n * @return {string} A string representation of this transform. The format of\n *     of the string is compatible with SVG matrix notation, i.e.\n *     \"matrix(a,b,c,d,e,f)\".\n * @override\n */\ngoog.math.AffineTransform.prototype.toString = function() {\n  return 'matrix(' +\n      [this.m00_, this.m10_, this.m01_, this.m11_, this.m02_, this.m12_].join(\n          ',') +\n      ')';\n};\n\n\n/**\n * @return {number} The scaling factor in the x-direction (m00).\n */\ngoog.math.AffineTransform.prototype.getScaleX = function() {\n  return this.m00_;\n};\n\n\n/**\n * @return {number} The scaling factor in the y-direction (m11).\n */\ngoog.math.AffineTransform.prototype.getScaleY = function() {\n  return this.m11_;\n};\n\n\n/**\n * @return {number} The translation in the x-direction (m02).\n */\ngoog.math.AffineTransform.prototype.getTranslateX = function() {\n  return this.m02_;\n};\n\n\n/**\n * @return {number} The translation in the y-direction (m12).\n */\ngoog.math.AffineTransform.prototype.getTranslateY = function() {\n  return this.m12_;\n};\n\n\n/**\n * @return {number} The shear factor in the x-direction (m01).\n */\ngoog.math.AffineTransform.prototype.getShearX = function() {\n  return this.m01_;\n};\n\n\n/**\n * @return {number} The shear factor in the y-direction (m10).\n */\ngoog.math.AffineTransform.prototype.getShearY = function() {\n  return this.m10_;\n};\n\n\n/**\n * Concatenates an affine transform to this transform.\n *\n * @param {!goog.math.AffineTransform} tx The transform to concatenate.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.concatenate = function(tx) {\n  let m0 = this.m00_;\n  let m1 = this.m01_;\n  this.m00_ = tx.m00_ * m0 + tx.m10_ * m1;\n  this.m01_ = tx.m01_ * m0 + tx.m11_ * m1;\n  this.m02_ += tx.m02_ * m0 + tx.m12_ * m1;\n\n  m0 = this.m10_;\n  m1 = this.m11_;\n  this.m10_ = tx.m00_ * m0 + tx.m10_ * m1;\n  this.m11_ = tx.m01_ * m0 + tx.m11_ * m1;\n  this.m12_ += tx.m02_ * m0 + tx.m12_ * m1;\n  return this;\n};\n\n\n/**\n * Pre-concatenates an affine transform to this transform.\n *\n * @param {!goog.math.AffineTransform} tx The transform to preconcatenate.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.preConcatenate = function(tx) {\n  let m0 = this.m00_;\n  let m1 = this.m10_;\n  this.m00_ = tx.m00_ * m0 + tx.m01_ * m1;\n  this.m10_ = tx.m10_ * m0 + tx.m11_ * m1;\n\n  m0 = this.m01_;\n  m1 = this.m11_;\n  this.m01_ = tx.m00_ * m0 + tx.m01_ * m1;\n  this.m11_ = tx.m10_ * m0 + tx.m11_ * m1;\n\n  m0 = this.m02_;\n  m1 = this.m12_;\n  this.m02_ = tx.m00_ * m0 + tx.m01_ * m1 + tx.m02_;\n  this.m12_ = tx.m10_ * m0 + tx.m11_ * m1 + tx.m12_;\n  return this;\n};\n\n\n/**\n * Transforms an array of coordinates by this transform and stores the result\n * into a destination array.\n *\n * @param {!Array<number>} src The array containing the source points\n *     as x, y value pairs.\n * @param {number} srcOff The offset to the first point to be transformed.\n * @param {!Array<number>} dst The array into which to store the transformed\n *     point pairs.\n * @param {number} dstOff The offset of the location of the first transformed\n *     point in the destination array.\n * @param {number} numPts The number of points to transform.\n */\ngoog.math.AffineTransform.prototype.transform = function(\n    src, srcOff, dst, dstOff, numPts) {\n  let i = srcOff;\n  let j = dstOff;\n  const srcEnd = srcOff + 2 * numPts;\n  while (i < srcEnd) {\n    const x = src[i++];\n    const y = src[i++];\n    dst[j++] = x * this.m00_ + y * this.m01_ + this.m02_;\n    dst[j++] = x * this.m10_ + y * this.m11_ + this.m12_;\n  }\n};\n\n\n/**\n * @return {number} The determinant of this transform.\n */\ngoog.math.AffineTransform.prototype.getDeterminant = function() {\n  return this.m00_ * this.m11_ - this.m01_ * this.m10_;\n};\n\n\n/**\n * Returns whether the transform is invertible. A transform is not invertible\n * if the determinant is 0 or any value is non-finite or NaN.\n *\n * @return {boolean} Whether the transform is invertible.\n */\ngoog.math.AffineTransform.prototype.isInvertible = function() {\n  const det = this.getDeterminant();\n  return isFinite(det) && isFinite(this.m02_) && isFinite(this.m12_) &&\n      det != 0;\n};\n\n\n/**\n * @return {!goog.math.AffineTransform} An AffineTransform object\n *     representing the inverse transformation.\n */\ngoog.math.AffineTransform.prototype.createInverse = function() {\n  const det = this.getDeterminant();\n  return new goog.math.AffineTransform(\n      this.m11_ / det, -this.m10_ / det, -this.m01_ / det, this.m00_ / det,\n      (this.m01_ * this.m12_ - this.m11_ * this.m02_) / det,\n      (this.m10_ * this.m02_ - this.m00_ * this.m12_) / det);\n};\n\n\n/**\n * Creates a transform representing a scaling transformation.\n *\n * @param {number} sx The x-axis scaling factor.\n * @param {number} sy The y-axis scaling factor.\n * @return {!goog.math.AffineTransform} A transform representing a scaling\n *     transformation.\n */\ngoog.math.AffineTransform.getScaleInstance = function(sx, sy) {\n  return new goog.math.AffineTransform().setToScale(sx, sy);\n};\n\n\n/**\n * Creates a transform representing a translation transformation.\n *\n * @param {number} dx The distance to translate in the x direction.\n * @param {number} dy The distance to translate in the y direction.\n * @return {!goog.math.AffineTransform} A transform representing a\n *     translation transformation.\n */\ngoog.math.AffineTransform.getTranslateInstance = function(dx, dy) {\n  return new goog.math.AffineTransform().setToTranslation(dx, dy);\n};\n\n\n/**\n * Creates a transform representing a shearing transformation.\n *\n * @param {number} shx The x-axis shear factor.\n * @param {number} shy The y-axis shear factor.\n * @return {!goog.math.AffineTransform} A transform representing a shearing\n *     transformation.\n */\ngoog.math.AffineTransform.getShearInstance = function(shx, shy) {\n  return new goog.math.AffineTransform().setToShear(shx, shy);\n};\n\n\n/**\n * Creates a transform representing a rotation transformation.\n *\n * @param {number} theta The angle of rotation measured in radians.\n * @param {number} x The x coordinate of the anchor point.\n * @param {number} y The y coordinate of the anchor point.\n * @return {!goog.math.AffineTransform} A transform representing a rotation\n *     transformation.\n */\ngoog.math.AffineTransform.getRotateInstance = function(theta, x, y) {\n  return new goog.math.AffineTransform().setToRotation(theta, x, y);\n};\n\n\n/**\n * Sets this transform to a scaling transformation.\n *\n * @param {number} sx The x-axis scaling factor.\n * @param {number} sy The y-axis scaling factor.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.setToScale = function(sx, sy) {\n  return this.setTransform(sx, 0, 0, sy, 0, 0);\n};\n\n\n/**\n * Sets this transform to a translation transformation.\n *\n * @param {number} dx The distance to translate in the x direction.\n * @param {number} dy The distance to translate in the y direction.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.setToTranslation = function(dx, dy) {\n  return this.setTransform(1, 0, 0, 1, dx, dy);\n};\n\n\n/**\n * Sets this transform to a shearing transformation.\n *\n * @param {number} shx The x-axis shear factor.\n * @param {number} shy The y-axis shear factor.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.setToShear = function(shx, shy) {\n  return this.setTransform(1, shy, shx, 1, 0, 0);\n};\n\n\n/**\n * Sets this transform to a rotation transformation.\n *\n * @param {number} theta The angle of rotation measured in radians.\n * @param {number} x The x coordinate of the anchor point.\n * @param {number} y The y coordinate of the anchor point.\n * @return {!goog.math.AffineTransform} This affine transform.\n */\ngoog.math.AffineTransform.prototype.setToRotation = function(theta, x, y) {\n  const cos = Math.cos(theta);\n  const sin = Math.sin(theta);\n  return this.setTransform(\n      cos, sin, -sin, cos, x - x * cos + y * sin, y - x * sin - y * cos);\n};\n\n\n/**\n * Compares two affine transforms for equality.\n *\n * @param {goog.math.AffineTransform} tx The other affine transform.\n * @return {boolean} whether the two transforms are equal.\n */\ngoog.math.AffineTransform.prototype.equals = function(tx) {\n  if (this == tx) {\n    return true;\n  }\n  if (!tx) {\n    return false;\n  }\n  return this.m00_ == tx.m00_ && this.m01_ == tx.m01_ && this.m02_ == tx.m02_ &&\n      this.m10_ == tx.m10_ && this.m11_ == tx.m11_ && this.m12_ == tx.m12_;\n};\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/affinetransform.js"],"^S",["^A",["~$goog.math.AffineTransform"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.labs.i18n.listsymbolsext.js","^9",["^:","goog/labs/i18n/listsymbolsext.js"],"^;","goog/labs/i18n/listsymbolsext.js","^<","^=","^>","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview List formatting symbols for all locales.\n *\n * This file is autogenerated by script.  See\n * http://go/generate_list_symbols.py using --for_closure\n * File generated from CLDR ver. 35\n *\n * To reduce the file size (which may cause issues in some JS\n * developing environments), this file will only contain locales\n * that are usually supported by Google products. It is a super\n * set of 40 languages. The rest of the data can be found in another file\n * named \"listsymbolsext.js\", which will be generated at the same\n * time as this file.\n * Before checkin, this file could have been manually edited. This is\n * to incorporate changes before we could correct CLDR. All manual\n * modification must be documented in this section, and should be\n * removed after those changes land to CLDR.\n * @suppress {const}\n */\n\n// clang-format off\n\ngoog.provide('goog.labs.i18n.ListFormatSymbolsExt');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_af_NA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_af_ZA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_agq');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_agq_CM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ak');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ak_GH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_am_ET');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_001');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_AE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_BH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_DJ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_EH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_ER');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_IL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_IQ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_JO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_KM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_KW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_LB');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_LY');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_MA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_MR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_OM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_PS');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_QA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_SA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_SD');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_SO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_SS');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_SY');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_TD');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_TN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_XB');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ar_YE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_as');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_as_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_asa');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_asa_TZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ast');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ast_ES');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_az_Cyrl');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_az_Cyrl_AZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_az_Latn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_az_Latn_AZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bas');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bas_CM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_be_BY');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bem');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bem_ZM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bez');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bez_TZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bg_BG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bm');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bm_ML');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bn_BD');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bn_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bo');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bo_CN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bo_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_br_FR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_brx');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_brx_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bs_Cyrl');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bs_Cyrl_BA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bs_Latn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_bs_Latn_BA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ca_AD');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ca_ES');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ca_FR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ca_IT');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ccp');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ccp_BD');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ccp_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ce');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ce_RU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ceb');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ceb_PH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_cgg');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_cgg_UG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_chr_US');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ckb');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ckb_IQ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ckb_IR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_cs_CZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_cy_GB');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_da_DK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_da_GL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_dav');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_dav_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_de_BE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_de_DE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_de_IT');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_de_LI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_de_LU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_dje');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_dje_NE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_dsb');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_dsb_DE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_dua');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_dua_CM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_dyo');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_dyo_SN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_dz');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_dz_BT');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ebu');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ebu_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ee');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ee_GH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ee_TG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_el_CY');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_el_GR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_001');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_150');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_AE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_AG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_AI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_AS');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_AT');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_BB');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_BE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_BI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_BM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_BS');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_BW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_BZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_CC');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_CH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_CK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_CM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_CX');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_CY');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_DE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_DG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_DK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_DM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_ER');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_FI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_FJ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_FK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_FM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_GD');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_GG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_GH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_GI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_GM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_GU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_GY');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_HK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_IL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_IM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_IO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_JE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_JM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_KI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_KN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_KY');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_LC');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_LR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_LS');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_MG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_MH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_MO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_MP');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_MS');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_MT');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_MU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_MW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_MY');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_NA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_NF');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_NG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_NL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_NR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_NU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_NZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_PG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_PH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_PK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_PN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_PR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_PW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_RW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_SB');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_SC');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_SD');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_SE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_SH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_SI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_SL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_SS');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_SX');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_SZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_TC');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_TK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_TO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_TT');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_TV');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_TZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_UG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_UM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_US_POSIX');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_VC');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_VG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_VI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_VU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_WS');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_XA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_ZM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_en_ZW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_eo');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_eo_001');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_AR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_BO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_BR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_BZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_CL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_CO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_CR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_CU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_DO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_EA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_EC');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_GQ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_GT');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_HN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_IC');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_NI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_PA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_PE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_PH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_PR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_PY');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_SV');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_UY');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_es_VE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_et_EE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_eu_ES');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ewo');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ewo_CM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fa_AF');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fa_IR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ff');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ff_Latn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ff_Latn_BF');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ff_Latn_CM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ff_Latn_GH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ff_Latn_GM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ff_Latn_GN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ff_Latn_GW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ff_Latn_LR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ff_Latn_MR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ff_Latn_NE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ff_Latn_NG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ff_Latn_SL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ff_Latn_SN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fi_FI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fil_PH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fo');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fo_DK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fo_FO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_BE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_BF');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_BI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_BJ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_BL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_CD');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_CF');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_CG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_CH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_CI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_CM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_DJ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_DZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_FR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_GA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_GF');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_GN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_GP');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_GQ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_HT');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_KM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_LU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_MA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_MC');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_MF');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_MG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_ML');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_MQ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_MR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_MU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_NC');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_NE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_PF');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_PM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_RE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_RW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_SC');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_SN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_SY');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_TD');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_TG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_TN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_VU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_WF');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fr_YT');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fur');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fur_IT');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fy');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_fy_NL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ga_IE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_gd');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_gd_GB');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_gl_ES');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_gsw_CH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_gsw_FR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_gsw_LI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_gu_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_guz');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_guz_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_gv');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_gv_IM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ha');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ha_GH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ha_NE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ha_NG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_haw_US');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_he_IL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_hi_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_hr_BA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_hr_HR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_hsb');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_hsb_DE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_hu_HU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_hy_AM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ia');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ia_001');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_id_ID');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ig');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ig_NG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ii');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ii_CN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_is_IS');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_it_CH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_it_IT');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_it_SM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_it_VA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ja_JP');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_jgo');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_jgo_CM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_jmc');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_jmc_TZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_jv');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_jv_ID');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ka_GE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kab');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kab_DZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kam');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kam_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kde');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kde_TZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kea');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kea_CV');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_khq');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_khq_ML');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ki');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ki_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kk_KZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kkj');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kkj_CM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kl');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kl_GL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kln');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kln_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_km_KH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kn_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ko_KP');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ko_KR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kok');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kok_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ks');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ks_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ksb');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ksb_TZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ksf');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ksf_CM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ksh');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ksh_DE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ku');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ku_TR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kw');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_kw_GB');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ky_KG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lag');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lag_TZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lb');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lb_LU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lg');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lg_UG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lkt');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lkt_US');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ln_AO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ln_CD');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ln_CF');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ln_CG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lo_LA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lrc');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lrc_IQ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lrc_IR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lt_LT');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lu');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lu_CD');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_luo');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_luo_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_luy');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_luy_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_lv_LV');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mas');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mas_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mas_TZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mer');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mer_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mfe');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mfe_MU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mg');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mg_MG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mgh');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mgh_MZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mgo');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mgo_CM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mi');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mi_NZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mk_MK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ml_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mn_MN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mr_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ms_BN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ms_MY');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ms_SG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mt_MT');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mua');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mua_CM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_my_MM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mzn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_mzn_IR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_naq');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_naq_NA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nb_NO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nb_SJ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nd');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nd_ZW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nds');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nds_DE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nds_NL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ne_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ne_NP');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nl_AW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nl_BE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nl_BQ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nl_CW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nl_NL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nl_SR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nl_SX');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nmg');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nmg_CM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nn_NO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nnh');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nnh_CM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nus');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nus_SS');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nyn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_nyn_UG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_om');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_om_ET');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_om_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_or_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_os');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_os_GE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_os_RU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pa_Arab');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pa_Arab_PK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pa_Guru');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pa_Guru_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pl_PL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ps');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ps_AF');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ps_PK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pt_AO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pt_CH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pt_CV');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pt_GQ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pt_GW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pt_LU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pt_MO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pt_MZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pt_ST');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_pt_TL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_qu');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_qu_BO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_qu_EC');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_qu_PE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_rm');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_rm_CH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_rn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_rn_BI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ro_MD');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ro_RO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_rof');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_rof_TZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ru_BY');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ru_KG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ru_KZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ru_MD');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ru_RU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ru_UA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_rw');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_rw_RW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_rwk');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_rwk_TZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sah');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sah_RU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_saq');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_saq_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sbp');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sbp_TZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sd');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sd_PK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_se');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_se_FI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_se_NO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_se_SE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_seh');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_seh_MZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ses');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ses_ML');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sg');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sg_CF');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_shi');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_shi_Latn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_shi_Latn_MA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_shi_Tfng');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_shi_Tfng_MA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_si_LK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sk_SK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sl_SI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_smn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_smn_FI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sn_ZW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_so');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_so_DJ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_so_ET');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_so_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_so_SO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sq_AL');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sq_MK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sq_XK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sr_Cyrl');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sr_Cyrl_BA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sr_Cyrl_ME');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sr_Cyrl_RS');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sr_Cyrl_XK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sr_Latn_BA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sr_Latn_ME');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sr_Latn_RS');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sr_Latn_XK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sv_AX');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sv_FI');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sv_SE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sw_CD');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sw_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sw_TZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_sw_UG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ta_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ta_LK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ta_MY');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ta_SG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_te_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_teo');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_teo_KE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_teo_UG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_tg');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_tg_TJ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_th_TH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ti');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ti_ER');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ti_ET');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_tk');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_tk_TM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_to');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_to_TO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_tr_CY');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_tr_TR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_tt');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_tt_RU');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_twq');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_twq_NE');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_tzm');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_tzm_MA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ug');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ug_CN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_uk_UA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ur_IN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_ur_PK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_uz_Arab');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_uz_Arab_AF');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_uz_Cyrl');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_uz_Cyrl_UZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_uz_Latn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_uz_Latn_UZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_vai');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_vai_Latn');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_vai_Latn_LR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_vai_Vaii');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_vai_Vaii_LR');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_vi_VN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_vun');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_vun_TZ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_wae');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_wae_CH');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_wo');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_wo_SN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_xh');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_xh_ZA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_xog');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_xog_UG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_yav');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_yav_CM');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_yi');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_yi_001');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_yo');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_yo_BJ');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_yo_NG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_yue');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_yue_Hans');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_yue_Hans_CN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_yue_Hant');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_yue_Hant_HK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zgh');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zgh_MA');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zh_Hans');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zh_Hans_CN');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zh_Hans_HK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zh_Hans_MO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zh_Hans_SG');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zh_Hant');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zh_Hant_HK');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zh_Hant_MO');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zh_Hant_TW');\ngoog.provide('goog.labs.i18n.ListFormatSymbols_zu_ZA');\n\ngoog.require('goog.labs.i18n.ListFormatSymbols');\n\n\n/**\n * List formatting symbols for locale af_NA.\n */\ngoog.labs.i18n.ListFormatSymbols_af_NA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} en {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} en {1}'\n};\n\n\n/**\n * List formatting symbols for locale af_ZA.\n */\ngoog.labs.i18n.ListFormatSymbols_af_ZA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} en {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} en {1}'\n};\n\n\n/**\n * List formatting symbols for locale agq.\n */\ngoog.labs.i18n.ListFormatSymbols_agq = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale agq_CM.\n */\ngoog.labs.i18n.ListFormatSymbols_agq_CM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ak.\n */\ngoog.labs.i18n.ListFormatSymbols_ak = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ak_GH.\n */\ngoog.labs.i18n.ListFormatSymbols_ak_GH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale am_ET.\n */\ngoog.labs.i18n.ListFormatSymbols_am_ET = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} እና {1}',\n  LIST_START: '{0}፣ {1}',\n  LIST_MIDDLE: '{0}፣ {1}',\n  LIST_END: '{0}, እና {1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_001.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_001 = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_AE.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_AE = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_BH.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_BH = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_DJ.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_DJ = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_EH.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_EH = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_ER.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_ER = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_IL.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_IL = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_IQ.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_IQ = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_JO.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_JO = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_KM.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_KM = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_KW.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_KW = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_LB.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_LB = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_LY.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_LY = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_MA.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_MA = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_MR.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_MR = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_OM.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_OM = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_PS.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_PS = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_QA.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_QA = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_SA.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_SA = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_SD.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_SD = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_SO.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_SO = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_SS.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_SS = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_SY.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_SY = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_TD.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_TD = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_TN.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_TN = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_XB.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_XB = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} ؜‮and‬؜ {1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}, ؜‮and‬؜ {1}'\n};\n\n\n/**\n * List formatting symbols for locale ar_YE.\n */\ngoog.labs.i18n.ListFormatSymbols_ar_YE = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} و{1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، و{1}'\n};\n\n\n/**\n * List formatting symbols for locale as.\n */\ngoog.labs.i18n.ListFormatSymbols_as = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} আৰু {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} আৰু {1}'\n};\n\n\n/**\n * List formatting symbols for locale as_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_as_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} আৰু {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} আৰু {1}'\n};\n\n\n/**\n * List formatting symbols for locale asa.\n */\ngoog.labs.i18n.ListFormatSymbols_asa = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale asa_TZ.\n */\ngoog.labs.i18n.ListFormatSymbols_asa_TZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ast.\n */\ngoog.labs.i18n.ListFormatSymbols_ast = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale ast_ES.\n */\ngoog.labs.i18n.ListFormatSymbols_ast_ES = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale az_Cyrl.\n */\ngoog.labs.i18n.ListFormatSymbols_az_Cyrl = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale az_Cyrl_AZ.\n */\ngoog.labs.i18n.ListFormatSymbols_az_Cyrl_AZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale az_Latn.\n */\ngoog.labs.i18n.ListFormatSymbols_az_Latn = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} və {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} və {1}'\n};\n\n\n/**\n * List formatting symbols for locale az_Latn_AZ.\n */\ngoog.labs.i18n.ListFormatSymbols_az_Latn_AZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} və {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} və {1}'\n};\n\n\n/**\n * List formatting symbols for locale bas.\n */\ngoog.labs.i18n.ListFormatSymbols_bas = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale bas_CM.\n */\ngoog.labs.i18n.ListFormatSymbols_bas_CM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale be_BY.\n */\ngoog.labs.i18n.ListFormatSymbols_be_BY = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} і {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} і {1}'\n};\n\n\n/**\n * List formatting symbols for locale bem.\n */\ngoog.labs.i18n.ListFormatSymbols_bem = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale bem_ZM.\n */\ngoog.labs.i18n.ListFormatSymbols_bem_ZM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale bez.\n */\ngoog.labs.i18n.ListFormatSymbols_bez = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale bez_TZ.\n */\ngoog.labs.i18n.ListFormatSymbols_bez_TZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale bg_BG.\n */\ngoog.labs.i18n.ListFormatSymbols_bg_BG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale bm.\n */\ngoog.labs.i18n.ListFormatSymbols_bm = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale bm_ML.\n */\ngoog.labs.i18n.ListFormatSymbols_bm_ML = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale bn_BD.\n */\ngoog.labs.i18n.ListFormatSymbols_bn_BD = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} এবং {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} এবং {1}'\n};\n\n\n/**\n * List formatting symbols for locale bn_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_bn_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} এবং {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} এবং {1}'\n};\n\n\n/**\n * List formatting symbols for locale bo.\n */\ngoog.labs.i18n.ListFormatSymbols_bo = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale bo_CN.\n */\ngoog.labs.i18n.ListFormatSymbols_bo_CN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale bo_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_bo_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale br_FR.\n */\ngoog.labs.i18n.ListFormatSymbols_br_FR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale brx.\n */\ngoog.labs.i18n.ListFormatSymbols_brx = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale brx_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_brx_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale bs_Cyrl.\n */\ngoog.labs.i18n.ListFormatSymbols_bs_Cyrl = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale bs_Cyrl_BA.\n */\ngoog.labs.i18n.ListFormatSymbols_bs_Cyrl_BA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale bs_Latn.\n */\ngoog.labs.i18n.ListFormatSymbols_bs_Latn = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale bs_Latn_BA.\n */\ngoog.labs.i18n.ListFormatSymbols_bs_Latn_BA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale ca_AD.\n */\ngoog.labs.i18n.ListFormatSymbols_ca_AD = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale ca_ES.\n */\ngoog.labs.i18n.ListFormatSymbols_ca_ES = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale ca_FR.\n */\ngoog.labs.i18n.ListFormatSymbols_ca_FR = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale ca_IT.\n */\ngoog.labs.i18n.ListFormatSymbols_ca_IT = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale ccp.\n */\ngoog.labs.i18n.ListFormatSymbols_ccp = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} \uD804\uDD03\uD804\uDD33\uD804\uDD03 {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} \uD804\uDD03\uD804\uDD33\uD804\uDD03 {1}'\n};\n\n\n/**\n * List formatting symbols for locale ccp_BD.\n */\ngoog.labs.i18n.ListFormatSymbols_ccp_BD = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} \uD804\uDD03\uD804\uDD33\uD804\uDD03 {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} \uD804\uDD03\uD804\uDD33\uD804\uDD03 {1}'\n};\n\n\n/**\n * List formatting symbols for locale ccp_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_ccp_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} \uD804\uDD03\uD804\uDD33\uD804\uDD03 {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} \uD804\uDD03\uD804\uDD33\uD804\uDD03 {1}'\n};\n\n\n/**\n * List formatting symbols for locale ce.\n */\ngoog.labs.i18n.ListFormatSymbols_ce = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ce_RU.\n */\ngoog.labs.i18n.ListFormatSymbols_ce_RU = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ceb.\n */\ngoog.labs.i18n.ListFormatSymbols_ceb = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} at {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, at {1}'\n};\n\n\n/**\n * List formatting symbols for locale ceb_PH.\n */\ngoog.labs.i18n.ListFormatSymbols_ceb_PH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} at {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, at {1}'\n};\n\n\n/**\n * List formatting symbols for locale cgg.\n */\ngoog.labs.i18n.ListFormatSymbols_cgg = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale cgg_UG.\n */\ngoog.labs.i18n.ListFormatSymbols_cgg_UG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale chr_US.\n */\ngoog.labs.i18n.ListFormatSymbols_chr_US = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ᎠᎴ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, ᎠᎴ {1}'\n};\n\n\n/**\n * List formatting symbols for locale ckb.\n */\ngoog.labs.i18n.ListFormatSymbols_ckb = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ckb_IQ.\n */\ngoog.labs.i18n.ListFormatSymbols_ckb_IQ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ckb_IR.\n */\ngoog.labs.i18n.ListFormatSymbols_ckb_IR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale cs_CZ.\n */\ngoog.labs.i18n.ListFormatSymbols_cs_CZ = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} a {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} a {1}'\n};\n\n\n/**\n * List formatting symbols for locale cy_GB.\n */\ngoog.labs.i18n.ListFormatSymbols_cy_GB = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} a(c) {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, a(c) {1}'\n};\n\n\n/**\n * List formatting symbols for locale da_DK.\n */\ngoog.labs.i18n.ListFormatSymbols_da_DK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} og {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} og {1}'\n};\n\n\n/**\n * List formatting symbols for locale da_GL.\n */\ngoog.labs.i18n.ListFormatSymbols_da_GL = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} og {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} og {1}'\n};\n\n\n/**\n * List formatting symbols for locale dav.\n */\ngoog.labs.i18n.ListFormatSymbols_dav = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale dav_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_dav_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale de_BE.\n */\ngoog.labs.i18n.ListFormatSymbols_de_BE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} und {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} und {1}'\n};\n\n\n/**\n * List formatting symbols for locale de_DE.\n */\ngoog.labs.i18n.ListFormatSymbols_de_DE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} und {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} und {1}'\n};\n\n\n/**\n * List formatting symbols for locale de_IT.\n */\ngoog.labs.i18n.ListFormatSymbols_de_IT = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} und {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} und {1}'\n};\n\n\n/**\n * List formatting symbols for locale de_LI.\n */\ngoog.labs.i18n.ListFormatSymbols_de_LI = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} und {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} und {1}'\n};\n\n\n/**\n * List formatting symbols for locale de_LU.\n */\ngoog.labs.i18n.ListFormatSymbols_de_LU = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} und {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} und {1}'\n};\n\n\n/**\n * List formatting symbols for locale dje.\n */\ngoog.labs.i18n.ListFormatSymbols_dje = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale dje_NE.\n */\ngoog.labs.i18n.ListFormatSymbols_dje_NE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale dsb.\n */\ngoog.labs.i18n.ListFormatSymbols_dsb = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} a {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} a {1}'\n};\n\n\n/**\n * List formatting symbols for locale dsb_DE.\n */\ngoog.labs.i18n.ListFormatSymbols_dsb_DE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} a {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} a {1}'\n};\n\n\n/**\n * List formatting symbols for locale dua.\n */\ngoog.labs.i18n.ListFormatSymbols_dua = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale dua_CM.\n */\ngoog.labs.i18n.ListFormatSymbols_dua_CM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale dyo.\n */\ngoog.labs.i18n.ListFormatSymbols_dyo = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale dyo_SN.\n */\ngoog.labs.i18n.ListFormatSymbols_dyo_SN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale dz.\n */\ngoog.labs.i18n.ListFormatSymbols_dz = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} དང་ {1}',\n  LIST_START: '{0} དང་ {1}',\n  LIST_MIDDLE: '{0} དང་ {1}',\n  LIST_END: '{0} དང་ {1}'\n};\n\n\n/**\n * List formatting symbols for locale dz_BT.\n */\ngoog.labs.i18n.ListFormatSymbols_dz_BT = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} དང་ {1}',\n  LIST_START: '{0} དང་ {1}',\n  LIST_MIDDLE: '{0} དང་ {1}',\n  LIST_END: '{0} དང་ {1}'\n};\n\n\n/**\n * List formatting symbols for locale ebu.\n */\ngoog.labs.i18n.ListFormatSymbols_ebu = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ebu_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_ebu_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ee.\n */\ngoog.labs.i18n.ListFormatSymbols_ee = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} kple {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, kple {1}'\n};\n\n\n/**\n * List formatting symbols for locale ee_GH.\n */\ngoog.labs.i18n.ListFormatSymbols_ee_GH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} kple {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, kple {1}'\n};\n\n\n/**\n * List formatting symbols for locale ee_TG.\n */\ngoog.labs.i18n.ListFormatSymbols_ee_TG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} kple {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, kple {1}'\n};\n\n\n/**\n * List formatting symbols for locale el_CY.\n */\ngoog.labs.i18n.ListFormatSymbols_el_CY = {\n  GENDER_STYLE: 1,\n  LIST_TWO: '{0} και {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} και {1}'\n};\n\n\n/**\n * List formatting symbols for locale el_GR.\n */\ngoog.labs.i18n.ListFormatSymbols_el_GR = {\n  GENDER_STYLE: 1,\n  LIST_TWO: '{0} και {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} και {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_001.\n */\ngoog.labs.i18n.ListFormatSymbols_en_001 = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_150.\n */\ngoog.labs.i18n.ListFormatSymbols_en_150 = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_AE.\n */\ngoog.labs.i18n.ListFormatSymbols_en_AE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_AG.\n */\ngoog.labs.i18n.ListFormatSymbols_en_AG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_AI.\n */\ngoog.labs.i18n.ListFormatSymbols_en_AI = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_AS.\n */\ngoog.labs.i18n.ListFormatSymbols_en_AS = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_AT.\n */\ngoog.labs.i18n.ListFormatSymbols_en_AT = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_BB.\n */\ngoog.labs.i18n.ListFormatSymbols_en_BB = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_BE.\n */\ngoog.labs.i18n.ListFormatSymbols_en_BE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_BI.\n */\ngoog.labs.i18n.ListFormatSymbols_en_BI = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_BM.\n */\ngoog.labs.i18n.ListFormatSymbols_en_BM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_BS.\n */\ngoog.labs.i18n.ListFormatSymbols_en_BS = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_BW.\n */\ngoog.labs.i18n.ListFormatSymbols_en_BW = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_BZ.\n */\ngoog.labs.i18n.ListFormatSymbols_en_BZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_CC.\n */\ngoog.labs.i18n.ListFormatSymbols_en_CC = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_CH.\n */\ngoog.labs.i18n.ListFormatSymbols_en_CH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_CK.\n */\ngoog.labs.i18n.ListFormatSymbols_en_CK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_CM.\n */\ngoog.labs.i18n.ListFormatSymbols_en_CM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_CX.\n */\ngoog.labs.i18n.ListFormatSymbols_en_CX = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_CY.\n */\ngoog.labs.i18n.ListFormatSymbols_en_CY = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_DE.\n */\ngoog.labs.i18n.ListFormatSymbols_en_DE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_DG.\n */\ngoog.labs.i18n.ListFormatSymbols_en_DG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_DK.\n */\ngoog.labs.i18n.ListFormatSymbols_en_DK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_DM.\n */\ngoog.labs.i18n.ListFormatSymbols_en_DM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_ER.\n */\ngoog.labs.i18n.ListFormatSymbols_en_ER = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_FI.\n */\ngoog.labs.i18n.ListFormatSymbols_en_FI = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_FJ.\n */\ngoog.labs.i18n.ListFormatSymbols_en_FJ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_FK.\n */\ngoog.labs.i18n.ListFormatSymbols_en_FK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_FM.\n */\ngoog.labs.i18n.ListFormatSymbols_en_FM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_GD.\n */\ngoog.labs.i18n.ListFormatSymbols_en_GD = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_GG.\n */\ngoog.labs.i18n.ListFormatSymbols_en_GG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_GH.\n */\ngoog.labs.i18n.ListFormatSymbols_en_GH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_GI.\n */\ngoog.labs.i18n.ListFormatSymbols_en_GI = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_GM.\n */\ngoog.labs.i18n.ListFormatSymbols_en_GM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_GU.\n */\ngoog.labs.i18n.ListFormatSymbols_en_GU = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_GY.\n */\ngoog.labs.i18n.ListFormatSymbols_en_GY = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_HK.\n */\ngoog.labs.i18n.ListFormatSymbols_en_HK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_IL.\n */\ngoog.labs.i18n.ListFormatSymbols_en_IL = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_IM.\n */\ngoog.labs.i18n.ListFormatSymbols_en_IM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_IO.\n */\ngoog.labs.i18n.ListFormatSymbols_en_IO = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_JE.\n */\ngoog.labs.i18n.ListFormatSymbols_en_JE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_JM.\n */\ngoog.labs.i18n.ListFormatSymbols_en_JM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_en_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_KI.\n */\ngoog.labs.i18n.ListFormatSymbols_en_KI = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_KN.\n */\ngoog.labs.i18n.ListFormatSymbols_en_KN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_KY.\n */\ngoog.labs.i18n.ListFormatSymbols_en_KY = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_LC.\n */\ngoog.labs.i18n.ListFormatSymbols_en_LC = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_LR.\n */\ngoog.labs.i18n.ListFormatSymbols_en_LR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_LS.\n */\ngoog.labs.i18n.ListFormatSymbols_en_LS = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_MG.\n */\ngoog.labs.i18n.ListFormatSymbols_en_MG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_MH.\n */\ngoog.labs.i18n.ListFormatSymbols_en_MH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_MO.\n */\ngoog.labs.i18n.ListFormatSymbols_en_MO = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_MP.\n */\ngoog.labs.i18n.ListFormatSymbols_en_MP = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_MS.\n */\ngoog.labs.i18n.ListFormatSymbols_en_MS = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_MT.\n */\ngoog.labs.i18n.ListFormatSymbols_en_MT = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_MU.\n */\ngoog.labs.i18n.ListFormatSymbols_en_MU = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_MW.\n */\ngoog.labs.i18n.ListFormatSymbols_en_MW = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_MY.\n */\ngoog.labs.i18n.ListFormatSymbols_en_MY = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_NA.\n */\ngoog.labs.i18n.ListFormatSymbols_en_NA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_NF.\n */\ngoog.labs.i18n.ListFormatSymbols_en_NF = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_NG.\n */\ngoog.labs.i18n.ListFormatSymbols_en_NG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_NL.\n */\ngoog.labs.i18n.ListFormatSymbols_en_NL = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_NR.\n */\ngoog.labs.i18n.ListFormatSymbols_en_NR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_NU.\n */\ngoog.labs.i18n.ListFormatSymbols_en_NU = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_NZ.\n */\ngoog.labs.i18n.ListFormatSymbols_en_NZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_PG.\n */\ngoog.labs.i18n.ListFormatSymbols_en_PG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_PH.\n */\ngoog.labs.i18n.ListFormatSymbols_en_PH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_PK.\n */\ngoog.labs.i18n.ListFormatSymbols_en_PK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_PN.\n */\ngoog.labs.i18n.ListFormatSymbols_en_PN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_PR.\n */\ngoog.labs.i18n.ListFormatSymbols_en_PR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_PW.\n */\ngoog.labs.i18n.ListFormatSymbols_en_PW = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_RW.\n */\ngoog.labs.i18n.ListFormatSymbols_en_RW = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_SB.\n */\ngoog.labs.i18n.ListFormatSymbols_en_SB = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_SC.\n */\ngoog.labs.i18n.ListFormatSymbols_en_SC = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_SD.\n */\ngoog.labs.i18n.ListFormatSymbols_en_SD = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_SE.\n */\ngoog.labs.i18n.ListFormatSymbols_en_SE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_SH.\n */\ngoog.labs.i18n.ListFormatSymbols_en_SH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_SI.\n */\ngoog.labs.i18n.ListFormatSymbols_en_SI = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_SL.\n */\ngoog.labs.i18n.ListFormatSymbols_en_SL = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_SS.\n */\ngoog.labs.i18n.ListFormatSymbols_en_SS = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_SX.\n */\ngoog.labs.i18n.ListFormatSymbols_en_SX = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_SZ.\n */\ngoog.labs.i18n.ListFormatSymbols_en_SZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_TC.\n */\ngoog.labs.i18n.ListFormatSymbols_en_TC = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_TK.\n */\ngoog.labs.i18n.ListFormatSymbols_en_TK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_TO.\n */\ngoog.labs.i18n.ListFormatSymbols_en_TO = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_TT.\n */\ngoog.labs.i18n.ListFormatSymbols_en_TT = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_TV.\n */\ngoog.labs.i18n.ListFormatSymbols_en_TV = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_TZ.\n */\ngoog.labs.i18n.ListFormatSymbols_en_TZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_UG.\n */\ngoog.labs.i18n.ListFormatSymbols_en_UG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_UM.\n */\ngoog.labs.i18n.ListFormatSymbols_en_UM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_US_POSIX.\n */\ngoog.labs.i18n.ListFormatSymbols_en_US_POSIX = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_VC.\n */\ngoog.labs.i18n.ListFormatSymbols_en_VC = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_VG.\n */\ngoog.labs.i18n.ListFormatSymbols_en_VG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_VI.\n */\ngoog.labs.i18n.ListFormatSymbols_en_VI = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_VU.\n */\ngoog.labs.i18n.ListFormatSymbols_en_VU = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_WS.\n */\ngoog.labs.i18n.ListFormatSymbols_en_WS = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_XA.\n */\ngoog.labs.i18n.ListFormatSymbols_en_XA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '[{0} åñð {1} one]',\n  LIST_START: '[{0}، {1} one]',\n  LIST_MIDDLE: '[{0}، {1} one]',\n  LIST_END: '[{0}، åñð {1} one]'\n};\n\n\n/**\n * List formatting symbols for locale en_ZM.\n */\ngoog.labs.i18n.ListFormatSymbols_en_ZM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale en_ZW.\n */\ngoog.labs.i18n.ListFormatSymbols_en_ZW = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale eo.\n */\ngoog.labs.i18n.ListFormatSymbols_eo = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale eo_001.\n */\ngoog.labs.i18n.ListFormatSymbols_eo_001 = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_AR.\n */\ngoog.labs.i18n.ListFormatSymbols_es_AR = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_BO.\n */\ngoog.labs.i18n.ListFormatSymbols_es_BO = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_BR.\n */\ngoog.labs.i18n.ListFormatSymbols_es_BR = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_BZ.\n */\ngoog.labs.i18n.ListFormatSymbols_es_BZ = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_CL.\n */\ngoog.labs.i18n.ListFormatSymbols_es_CL = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_CO.\n */\ngoog.labs.i18n.ListFormatSymbols_es_CO = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_CR.\n */\ngoog.labs.i18n.ListFormatSymbols_es_CR = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_CU.\n */\ngoog.labs.i18n.ListFormatSymbols_es_CU = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_DO.\n */\ngoog.labs.i18n.ListFormatSymbols_es_DO = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_EA.\n */\ngoog.labs.i18n.ListFormatSymbols_es_EA = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_EC.\n */\ngoog.labs.i18n.ListFormatSymbols_es_EC = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_GQ.\n */\ngoog.labs.i18n.ListFormatSymbols_es_GQ = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_GT.\n */\ngoog.labs.i18n.ListFormatSymbols_es_GT = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_HN.\n */\ngoog.labs.i18n.ListFormatSymbols_es_HN = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_IC.\n */\ngoog.labs.i18n.ListFormatSymbols_es_IC = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_NI.\n */\ngoog.labs.i18n.ListFormatSymbols_es_NI = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_PA.\n */\ngoog.labs.i18n.ListFormatSymbols_es_PA = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_PE.\n */\ngoog.labs.i18n.ListFormatSymbols_es_PE = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_PH.\n */\ngoog.labs.i18n.ListFormatSymbols_es_PH = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_PR.\n */\ngoog.labs.i18n.ListFormatSymbols_es_PR = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_PY.\n */\ngoog.labs.i18n.ListFormatSymbols_es_PY = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_SV.\n */\ngoog.labs.i18n.ListFormatSymbols_es_SV = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_UY.\n */\ngoog.labs.i18n.ListFormatSymbols_es_UY = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale es_VE.\n */\ngoog.labs.i18n.ListFormatSymbols_es_VE = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} y {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} y {1}'\n};\n\n\n/**\n * List formatting symbols for locale et_EE.\n */\ngoog.labs.i18n.ListFormatSymbols_et_EE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ja {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ja {1}'\n};\n\n\n/**\n * List formatting symbols for locale eu_ES.\n */\ngoog.labs.i18n.ListFormatSymbols_eu_ES = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} eta {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} eta {1}'\n};\n\n\n/**\n * List formatting symbols for locale ewo.\n */\ngoog.labs.i18n.ListFormatSymbols_ewo = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ewo_CM.\n */\ngoog.labs.i18n.ListFormatSymbols_ewo_CM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale fa_AF.\n */\ngoog.labs.i18n.ListFormatSymbols_fa_AF = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} و {1}',\n  LIST_START: '{0}،‏ {1}',\n  LIST_MIDDLE: '{0}،‏ {1}',\n  LIST_END: '{0}، و {1}'\n};\n\n\n/**\n * List formatting symbols for locale fa_IR.\n */\ngoog.labs.i18n.ListFormatSymbols_fa_IR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} و {1}',\n  LIST_START: '{0}،‏ {1}',\n  LIST_MIDDLE: '{0}،‏ {1}',\n  LIST_END: '{0}، و {1}'\n};\n\n\n/**\n * List formatting symbols for locale ff.\n */\ngoog.labs.i18n.ListFormatSymbols_ff = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ff_Latn.\n */\ngoog.labs.i18n.ListFormatSymbols_ff_Latn = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ff_Latn_BF.\n */\ngoog.labs.i18n.ListFormatSymbols_ff_Latn_BF = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ff_Latn_CM.\n */\ngoog.labs.i18n.ListFormatSymbols_ff_Latn_CM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ff_Latn_GH.\n */\ngoog.labs.i18n.ListFormatSymbols_ff_Latn_GH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ff_Latn_GM.\n */\ngoog.labs.i18n.ListFormatSymbols_ff_Latn_GM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ff_Latn_GN.\n */\ngoog.labs.i18n.ListFormatSymbols_ff_Latn_GN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ff_Latn_GW.\n */\ngoog.labs.i18n.ListFormatSymbols_ff_Latn_GW = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ff_Latn_LR.\n */\ngoog.labs.i18n.ListFormatSymbols_ff_Latn_LR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ff_Latn_MR.\n */\ngoog.labs.i18n.ListFormatSymbols_ff_Latn_MR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ff_Latn_NE.\n */\ngoog.labs.i18n.ListFormatSymbols_ff_Latn_NE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ff_Latn_NG.\n */\ngoog.labs.i18n.ListFormatSymbols_ff_Latn_NG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ff_Latn_SL.\n */\ngoog.labs.i18n.ListFormatSymbols_ff_Latn_SL = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ff_Latn_SN.\n */\ngoog.labs.i18n.ListFormatSymbols_ff_Latn_SN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale fi_FI.\n */\ngoog.labs.i18n.ListFormatSymbols_fi_FI = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ja {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ja {1}'\n};\n\n\n/**\n * List formatting symbols for locale fil_PH.\n */\ngoog.labs.i18n.ListFormatSymbols_fil_PH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} at {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, at {1}'\n};\n\n\n/**\n * List formatting symbols for locale fo.\n */\ngoog.labs.i18n.ListFormatSymbols_fo = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} og {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} og {1}'\n};\n\n\n/**\n * List formatting symbols for locale fo_DK.\n */\ngoog.labs.i18n.ListFormatSymbols_fo_DK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} og {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} og {1}'\n};\n\n\n/**\n * List formatting symbols for locale fo_FO.\n */\ngoog.labs.i18n.ListFormatSymbols_fo_FO = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} og {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} og {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_BE.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_BE = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_BF.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_BF = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_BI.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_BI = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_BJ.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_BJ = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_BL.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_BL = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_CD.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_CD = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_CF.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_CF = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_CG.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_CG = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_CH.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_CH = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_CI.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_CI = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_CM.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_CM = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_DJ.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_DJ = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_DZ.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_DZ = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_FR.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_FR = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_GA.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_GA = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_GF.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_GF = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_GN.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_GN = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_GP.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_GP = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_GQ.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_GQ = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_HT.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_HT = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_KM.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_KM = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_LU.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_LU = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_MA.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_MA = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_MC.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_MC = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_MF.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_MF = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_MG.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_MG = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_ML.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_ML = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_MQ.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_MQ = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_MR.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_MR = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_MU.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_MU = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_NC.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_NC = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_NE.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_NE = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_PF.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_PF = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_PM.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_PM = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_RE.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_RE = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_RW.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_RW = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_SC.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_SC = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_SN.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_SN = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_SY.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_SY = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_TD.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_TD = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_TG.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_TG = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_TN.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_TN = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_VU.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_VU = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_WF.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_WF = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fr_YT.\n */\ngoog.labs.i18n.ListFormatSymbols_fr_YT = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} et {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} et {1}'\n};\n\n\n/**\n * List formatting symbols for locale fur.\n */\ngoog.labs.i18n.ListFormatSymbols_fur = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale fur_IT.\n */\ngoog.labs.i18n.ListFormatSymbols_fur_IT = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale fy.\n */\ngoog.labs.i18n.ListFormatSymbols_fy = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} en {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} en {1}'\n};\n\n\n/**\n * List formatting symbols for locale fy_NL.\n */\ngoog.labs.i18n.ListFormatSymbols_fy_NL = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} en {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} en {1}'\n};\n\n\n/**\n * List formatting symbols for locale ga_IE.\n */\ngoog.labs.i18n.ListFormatSymbols_ga_IE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} agus {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, agus {1}'\n};\n\n\n/**\n * List formatting symbols for locale gd.\n */\ngoog.labs.i18n.ListFormatSymbols_gd = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} agus {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} agus {1}'\n};\n\n\n/**\n * List formatting symbols for locale gd_GB.\n */\ngoog.labs.i18n.ListFormatSymbols_gd_GB = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} agus {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} agus {1}'\n};\n\n\n/**\n * List formatting symbols for locale gl_ES.\n */\ngoog.labs.i18n.ListFormatSymbols_gl_ES = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale gsw_CH.\n */\ngoog.labs.i18n.ListFormatSymbols_gsw_CH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} und {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} und {1}'\n};\n\n\n/**\n * List formatting symbols for locale gsw_FR.\n */\ngoog.labs.i18n.ListFormatSymbols_gsw_FR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} und {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} und {1}'\n};\n\n\n/**\n * List formatting symbols for locale gsw_LI.\n */\ngoog.labs.i18n.ListFormatSymbols_gsw_LI = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} und {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} und {1}'\n};\n\n\n/**\n * List formatting symbols for locale gu_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_gu_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} અને {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} અને {1}'\n};\n\n\n/**\n * List formatting symbols for locale guz.\n */\ngoog.labs.i18n.ListFormatSymbols_guz = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale guz_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_guz_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale gv.\n */\ngoog.labs.i18n.ListFormatSymbols_gv = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale gv_IM.\n */\ngoog.labs.i18n.ListFormatSymbols_gv_IM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ha.\n */\ngoog.labs.i18n.ListFormatSymbols_ha = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} da {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} da {1}'\n};\n\n\n/**\n * List formatting symbols for locale ha_GH.\n */\ngoog.labs.i18n.ListFormatSymbols_ha_GH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} da {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} da {1}'\n};\n\n\n/**\n * List formatting symbols for locale ha_NE.\n */\ngoog.labs.i18n.ListFormatSymbols_ha_NE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} da {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} da {1}'\n};\n\n\n/**\n * List formatting symbols for locale ha_NG.\n */\ngoog.labs.i18n.ListFormatSymbols_ha_NG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} da {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} da {1}'\n};\n\n\n/**\n * List formatting symbols for locale haw_US.\n */\ngoog.labs.i18n.ListFormatSymbols_haw_US = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale he_IL.\n */\ngoog.labs.i18n.ListFormatSymbols_he_IL = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} ו{1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ו{1}'\n};\n\n\n/**\n * List formatting symbols for locale hi_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_hi_IN = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} और {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, और {1}'\n};\n\n\n/**\n * List formatting symbols for locale hr_BA.\n */\ngoog.labs.i18n.ListFormatSymbols_hr_BA = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale hr_HR.\n */\ngoog.labs.i18n.ListFormatSymbols_hr_HR = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale hsb.\n */\ngoog.labs.i18n.ListFormatSymbols_hsb = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} a {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} a {1}'\n};\n\n\n/**\n * List formatting symbols for locale hsb_DE.\n */\ngoog.labs.i18n.ListFormatSymbols_hsb_DE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} a {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} a {1}'\n};\n\n\n/**\n * List formatting symbols for locale hu_HU.\n */\ngoog.labs.i18n.ListFormatSymbols_hu_HU = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} és {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} és {1}'\n};\n\n\n/**\n * List formatting symbols for locale hy_AM.\n */\ngoog.labs.i18n.ListFormatSymbols_hy_AM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} և {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} և {1}'\n};\n\n\n/**\n * List formatting symbols for locale ia.\n */\ngoog.labs.i18n.ListFormatSymbols_ia = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale ia_001.\n */\ngoog.labs.i18n.ListFormatSymbols_ia_001 = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale id_ID.\n */\ngoog.labs.i18n.ListFormatSymbols_id_ID = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} dan {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, dan {1}'\n};\n\n\n/**\n * List formatting symbols for locale ig.\n */\ngoog.labs.i18n.ListFormatSymbols_ig = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} na {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, na {1}'\n};\n\n\n/**\n * List formatting symbols for locale ig_NG.\n */\ngoog.labs.i18n.ListFormatSymbols_ig_NG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} na {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, na {1}'\n};\n\n\n/**\n * List formatting symbols for locale ii.\n */\ngoog.labs.i18n.ListFormatSymbols_ii = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ii_CN.\n */\ngoog.labs.i18n.ListFormatSymbols_ii_CN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale is_IS.\n */\ngoog.labs.i18n.ListFormatSymbols_is_IS = {\n  GENDER_STYLE: 1,\n  LIST_TWO: '{0} og {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} og {1}'\n};\n\n\n/**\n * List formatting symbols for locale it_CH.\n */\ngoog.labs.i18n.ListFormatSymbols_it_CH = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale it_IT.\n */\ngoog.labs.i18n.ListFormatSymbols_it_IT = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale it_SM.\n */\ngoog.labs.i18n.ListFormatSymbols_it_SM = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale it_VA.\n */\ngoog.labs.i18n.ListFormatSymbols_it_VA = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale ja_JP.\n */\ngoog.labs.i18n.ListFormatSymbols_ja_JP = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}、{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}、{1}'\n};\n\n\n/**\n * List formatting symbols for locale jgo.\n */\ngoog.labs.i18n.ListFormatSymbols_jgo = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} pɔp {1}',\n  LIST_START: '{0}, ŋ́gɛ {1}',\n  LIST_MIDDLE: '{0}, ŋ́gɛ {1}',\n  LIST_END: '{0}, ḿbɛn ŋ́gɛ {1}'\n};\n\n\n/**\n * List formatting symbols for locale jgo_CM.\n */\ngoog.labs.i18n.ListFormatSymbols_jgo_CM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} pɔp {1}',\n  LIST_START: '{0}, ŋ́gɛ {1}',\n  LIST_MIDDLE: '{0}, ŋ́gɛ {1}',\n  LIST_END: '{0}, ḿbɛn ŋ́gɛ {1}'\n};\n\n\n/**\n * List formatting symbols for locale jmc.\n */\ngoog.labs.i18n.ListFormatSymbols_jmc = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale jmc_TZ.\n */\ngoog.labs.i18n.ListFormatSymbols_jmc_TZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale jv.\n */\ngoog.labs.i18n.ListFormatSymbols_jv = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} lan {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, lan {1}'\n};\n\n\n/**\n * List formatting symbols for locale jv_ID.\n */\ngoog.labs.i18n.ListFormatSymbols_jv_ID = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} lan {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, lan {1}'\n};\n\n\n/**\n * List formatting symbols for locale ka_GE.\n */\ngoog.labs.i18n.ListFormatSymbols_ka_GE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} და {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} და {1}'\n};\n\n\n/**\n * List formatting symbols for locale kab.\n */\ngoog.labs.i18n.ListFormatSymbols_kab = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale kab_DZ.\n */\ngoog.labs.i18n.ListFormatSymbols_kab_DZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale kam.\n */\ngoog.labs.i18n.ListFormatSymbols_kam = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale kam_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_kam_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale kde.\n */\ngoog.labs.i18n.ListFormatSymbols_kde = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale kde_TZ.\n */\ngoog.labs.i18n.ListFormatSymbols_kde_TZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale kea.\n */\ngoog.labs.i18n.ListFormatSymbols_kea = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale kea_CV.\n */\ngoog.labs.i18n.ListFormatSymbols_kea_CV = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale khq.\n */\ngoog.labs.i18n.ListFormatSymbols_khq = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale khq_ML.\n */\ngoog.labs.i18n.ListFormatSymbols_khq_ML = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ki.\n */\ngoog.labs.i18n.ListFormatSymbols_ki = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ki_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_ki_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale kk_KZ.\n */\ngoog.labs.i18n.ListFormatSymbols_kk_KZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} және {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale kkj.\n */\ngoog.labs.i18n.ListFormatSymbols_kkj = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale kkj_CM.\n */\ngoog.labs.i18n.ListFormatSymbols_kkj_CM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale kl.\n */\ngoog.labs.i18n.ListFormatSymbols_kl = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale kl_GL.\n */\ngoog.labs.i18n.ListFormatSymbols_kl_GL = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale kln.\n */\ngoog.labs.i18n.ListFormatSymbols_kln = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale kln_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_kln_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale km_KH.\n */\ngoog.labs.i18n.ListFormatSymbols_km_KH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} និង​{1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} និង {1}'\n};\n\n\n/**\n * List formatting symbols for locale kn_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_kn_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ಮತ್ತು {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, ಮತ್ತು {1}'\n};\n\n\n/**\n * List formatting symbols for locale ko_KP.\n */\ngoog.labs.i18n.ListFormatSymbols_ko_KP = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} 및 {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} 및 {1}'\n};\n\n\n/**\n * List formatting symbols for locale ko_KR.\n */\ngoog.labs.i18n.ListFormatSymbols_ko_KR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} 및 {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} 및 {1}'\n};\n\n\n/**\n * List formatting symbols for locale kok.\n */\ngoog.labs.i18n.ListFormatSymbols_kok = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale kok_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_kok_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ks.\n */\ngoog.labs.i18n.ListFormatSymbols_ks = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ks_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_ks_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ksb.\n */\ngoog.labs.i18n.ListFormatSymbols_ksb = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ksb_TZ.\n */\ngoog.labs.i18n.ListFormatSymbols_ksb_TZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ksf.\n */\ngoog.labs.i18n.ListFormatSymbols_ksf = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ksf_CM.\n */\ngoog.labs.i18n.ListFormatSymbols_ksf_CM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ksh.\n */\ngoog.labs.i18n.ListFormatSymbols_ksh = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} un {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} un {1}'\n};\n\n\n/**\n * List formatting symbols for locale ksh_DE.\n */\ngoog.labs.i18n.ListFormatSymbols_ksh_DE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} un {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} un {1}'\n};\n\n\n/**\n * List formatting symbols for locale ku.\n */\ngoog.labs.i18n.ListFormatSymbols_ku = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} û {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} û {1}'\n};\n\n\n/**\n * List formatting symbols for locale ku_TR.\n */\ngoog.labs.i18n.ListFormatSymbols_ku_TR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} û {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} û {1}'\n};\n\n\n/**\n * List formatting symbols for locale kw.\n */\ngoog.labs.i18n.ListFormatSymbols_kw = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale kw_GB.\n */\ngoog.labs.i18n.ListFormatSymbols_kw_GB = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ky_KG.\n */\ngoog.labs.i18n.ListFormatSymbols_ky_KG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} жана {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} жана {1}'\n};\n\n\n/**\n * List formatting symbols for locale lag.\n */\ngoog.labs.i18n.ListFormatSymbols_lag = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale lag_TZ.\n */\ngoog.labs.i18n.ListFormatSymbols_lag_TZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale lb.\n */\ngoog.labs.i18n.ListFormatSymbols_lb = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} a(n) {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} a(n) {1}'\n};\n\n\n/**\n * List formatting symbols for locale lb_LU.\n */\ngoog.labs.i18n.ListFormatSymbols_lb_LU = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} a(n) {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} a(n) {1}'\n};\n\n\n/**\n * List formatting symbols for locale lg.\n */\ngoog.labs.i18n.ListFormatSymbols_lg = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale lg_UG.\n */\ngoog.labs.i18n.ListFormatSymbols_lg_UG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale lkt.\n */\ngoog.labs.i18n.ListFormatSymbols_lkt = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale lkt_US.\n */\ngoog.labs.i18n.ListFormatSymbols_lkt_US = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ln_AO.\n */\ngoog.labs.i18n.ListFormatSymbols_ln_AO = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ln_CD.\n */\ngoog.labs.i18n.ListFormatSymbols_ln_CD = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ln_CF.\n */\ngoog.labs.i18n.ListFormatSymbols_ln_CF = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ln_CG.\n */\ngoog.labs.i18n.ListFormatSymbols_ln_CG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale lo_LA.\n */\ngoog.labs.i18n.ListFormatSymbols_lo_LA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ແລະ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale lrc.\n */\ngoog.labs.i18n.ListFormatSymbols_lrc = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale lrc_IQ.\n */\ngoog.labs.i18n.ListFormatSymbols_lrc_IQ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale lrc_IR.\n */\ngoog.labs.i18n.ListFormatSymbols_lrc_IR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale lt_LT.\n */\ngoog.labs.i18n.ListFormatSymbols_lt_LT = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} ir {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ir {1}'\n};\n\n\n/**\n * List formatting symbols for locale lu.\n */\ngoog.labs.i18n.ListFormatSymbols_lu = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale lu_CD.\n */\ngoog.labs.i18n.ListFormatSymbols_lu_CD = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale luo.\n */\ngoog.labs.i18n.ListFormatSymbols_luo = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale luo_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_luo_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale luy.\n */\ngoog.labs.i18n.ListFormatSymbols_luy = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale luy_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_luy_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale lv_LV.\n */\ngoog.labs.i18n.ListFormatSymbols_lv_LV = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} un {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} un {1}'\n};\n\n\n/**\n * List formatting symbols for locale mas.\n */\ngoog.labs.i18n.ListFormatSymbols_mas = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mas_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_mas_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mas_TZ.\n */\ngoog.labs.i18n.ListFormatSymbols_mas_TZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mer.\n */\ngoog.labs.i18n.ListFormatSymbols_mer = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mer_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_mer_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mfe.\n */\ngoog.labs.i18n.ListFormatSymbols_mfe = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mfe_MU.\n */\ngoog.labs.i18n.ListFormatSymbols_mfe_MU = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mg.\n */\ngoog.labs.i18n.ListFormatSymbols_mg = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mg_MG.\n */\ngoog.labs.i18n.ListFormatSymbols_mg_MG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mgh.\n */\ngoog.labs.i18n.ListFormatSymbols_mgh = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mgh_MZ.\n */\ngoog.labs.i18n.ListFormatSymbols_mgh_MZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mgo.\n */\ngoog.labs.i18n.ListFormatSymbols_mgo = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mgo_CM.\n */\ngoog.labs.i18n.ListFormatSymbols_mgo_CM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mi.\n */\ngoog.labs.i18n.ListFormatSymbols_mi = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mi_NZ.\n */\ngoog.labs.i18n.ListFormatSymbols_mi_NZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mk_MK.\n */\ngoog.labs.i18n.ListFormatSymbols_mk_MK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale ml_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_ml_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} കൂടാതെ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1} എന്നിവ'\n};\n\n\n/**\n * List formatting symbols for locale mn_MN.\n */\ngoog.labs.i18n.ListFormatSymbols_mn_MN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mr_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_mr_IN = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} आणि {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} आणि {1}'\n};\n\n\n/**\n * List formatting symbols for locale ms_BN.\n */\ngoog.labs.i18n.ListFormatSymbols_ms_BN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} dan {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} dan {1}'\n};\n\n\n/**\n * List formatting symbols for locale ms_MY.\n */\ngoog.labs.i18n.ListFormatSymbols_ms_MY = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} dan {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} dan {1}'\n};\n\n\n/**\n * List formatting symbols for locale ms_SG.\n */\ngoog.labs.i18n.ListFormatSymbols_ms_SG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} dan {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} dan {1}'\n};\n\n\n/**\n * List formatting symbols for locale mt_MT.\n */\ngoog.labs.i18n.ListFormatSymbols_mt_MT = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} u {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, u {1}'\n};\n\n\n/**\n * List formatting symbols for locale mua.\n */\ngoog.labs.i18n.ListFormatSymbols_mua = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mua_CM.\n */\ngoog.labs.i18n.ListFormatSymbols_mua_CM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale my_MM.\n */\ngoog.labs.i18n.ListFormatSymbols_my_MM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}နှင့် {1}',\n  LIST_START: '{0} {1}',\n  LIST_MIDDLE: '{0} {1}',\n  LIST_END: '{0}နှင့် {1}'\n};\n\n\n/**\n * List formatting symbols for locale mzn.\n */\ngoog.labs.i18n.ListFormatSymbols_mzn = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale mzn_IR.\n */\ngoog.labs.i18n.ListFormatSymbols_mzn_IR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale naq.\n */\ngoog.labs.i18n.ListFormatSymbols_naq = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale naq_NA.\n */\ngoog.labs.i18n.ListFormatSymbols_naq_NA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale nb_NO.\n */\ngoog.labs.i18n.ListFormatSymbols_nb_NO = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} og {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} og {1}'\n};\n\n\n/**\n * List formatting symbols for locale nb_SJ.\n */\ngoog.labs.i18n.ListFormatSymbols_nb_SJ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} og {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} og {1}'\n};\n\n\n/**\n * List formatting symbols for locale nd.\n */\ngoog.labs.i18n.ListFormatSymbols_nd = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale nd_ZW.\n */\ngoog.labs.i18n.ListFormatSymbols_nd_ZW = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale nds.\n */\ngoog.labs.i18n.ListFormatSymbols_nds = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale nds_DE.\n */\ngoog.labs.i18n.ListFormatSymbols_nds_DE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale nds_NL.\n */\ngoog.labs.i18n.ListFormatSymbols_nds_NL = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ne_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_ne_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} र {1}',\n  LIST_START: '{0},{1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} र {1}'\n};\n\n\n/**\n * List formatting symbols for locale ne_NP.\n */\ngoog.labs.i18n.ListFormatSymbols_ne_NP = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} र {1}',\n  LIST_START: '{0},{1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} र {1}'\n};\n\n\n/**\n * List formatting symbols for locale nl_AW.\n */\ngoog.labs.i18n.ListFormatSymbols_nl_AW = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} en {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} en {1}'\n};\n\n\n/**\n * List formatting symbols for locale nl_BE.\n */\ngoog.labs.i18n.ListFormatSymbols_nl_BE = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} en {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} en {1}'\n};\n\n\n/**\n * List formatting symbols for locale nl_BQ.\n */\ngoog.labs.i18n.ListFormatSymbols_nl_BQ = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} en {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} en {1}'\n};\n\n\n/**\n * List formatting symbols for locale nl_CW.\n */\ngoog.labs.i18n.ListFormatSymbols_nl_CW = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} en {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} en {1}'\n};\n\n\n/**\n * List formatting symbols for locale nl_NL.\n */\ngoog.labs.i18n.ListFormatSymbols_nl_NL = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} en {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} en {1}'\n};\n\n\n/**\n * List formatting symbols for locale nl_SR.\n */\ngoog.labs.i18n.ListFormatSymbols_nl_SR = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} en {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} en {1}'\n};\n\n\n/**\n * List formatting symbols for locale nl_SX.\n */\ngoog.labs.i18n.ListFormatSymbols_nl_SX = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} en {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} en {1}'\n};\n\n\n/**\n * List formatting symbols for locale nmg.\n */\ngoog.labs.i18n.ListFormatSymbols_nmg = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale nmg_CM.\n */\ngoog.labs.i18n.ListFormatSymbols_nmg_CM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale nn.\n */\ngoog.labs.i18n.ListFormatSymbols_nn = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} og {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} og {1}'\n};\n\n\n/**\n * List formatting symbols for locale nn_NO.\n */\ngoog.labs.i18n.ListFormatSymbols_nn_NO = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} og {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} og {1}'\n};\n\n\n/**\n * List formatting symbols for locale nnh.\n */\ngoog.labs.i18n.ListFormatSymbols_nnh = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale nnh_CM.\n */\ngoog.labs.i18n.ListFormatSymbols_nnh_CM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale nus.\n */\ngoog.labs.i18n.ListFormatSymbols_nus = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale nus_SS.\n */\ngoog.labs.i18n.ListFormatSymbols_nus_SS = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale nyn.\n */\ngoog.labs.i18n.ListFormatSymbols_nyn = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale nyn_UG.\n */\ngoog.labs.i18n.ListFormatSymbols_nyn_UG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale om.\n */\ngoog.labs.i18n.ListFormatSymbols_om = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale om_ET.\n */\ngoog.labs.i18n.ListFormatSymbols_om_ET = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale om_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_om_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale or_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_or_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ଓ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, ଓ {1}'\n};\n\n\n/**\n * List formatting symbols for locale os.\n */\ngoog.labs.i18n.ListFormatSymbols_os = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ӕмӕ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ӕмӕ {1}'\n};\n\n\n/**\n * List formatting symbols for locale os_GE.\n */\ngoog.labs.i18n.ListFormatSymbols_os_GE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ӕмӕ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ӕмӕ {1}'\n};\n\n\n/**\n * List formatting symbols for locale os_RU.\n */\ngoog.labs.i18n.ListFormatSymbols_os_RU = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ӕмӕ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ӕмӕ {1}'\n};\n\n\n/**\n * List formatting symbols for locale pa_Arab.\n */\ngoog.labs.i18n.ListFormatSymbols_pa_Arab = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale pa_Arab_PK.\n */\ngoog.labs.i18n.ListFormatSymbols_pa_Arab_PK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale pa_Guru.\n */\ngoog.labs.i18n.ListFormatSymbols_pa_Guru = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ਅਤੇ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ਅਤੇ {1}'\n};\n\n\n/**\n * List formatting symbols for locale pa_Guru_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_pa_Guru_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ਅਤੇ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ਅਤੇ {1}'\n};\n\n\n/**\n * List formatting symbols for locale pl_PL.\n */\ngoog.labs.i18n.ListFormatSymbols_pl_PL = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale ps.\n */\ngoog.labs.i18n.ListFormatSymbols_ps = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} او {1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، او {1}'\n};\n\n\n/**\n * List formatting symbols for locale ps_AF.\n */\ngoog.labs.i18n.ListFormatSymbols_ps_AF = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} او {1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، او {1}'\n};\n\n\n/**\n * List formatting symbols for locale ps_PK.\n */\ngoog.labs.i18n.ListFormatSymbols_ps_PK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} او {1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، او {1}'\n};\n\n\n/**\n * List formatting symbols for locale pt_AO.\n */\ngoog.labs.i18n.ListFormatSymbols_pt_AO = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale pt_CH.\n */\ngoog.labs.i18n.ListFormatSymbols_pt_CH = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale pt_CV.\n */\ngoog.labs.i18n.ListFormatSymbols_pt_CV = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale pt_GQ.\n */\ngoog.labs.i18n.ListFormatSymbols_pt_GQ = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale pt_GW.\n */\ngoog.labs.i18n.ListFormatSymbols_pt_GW = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale pt_LU.\n */\ngoog.labs.i18n.ListFormatSymbols_pt_LU = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale pt_MO.\n */\ngoog.labs.i18n.ListFormatSymbols_pt_MO = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale pt_MZ.\n */\ngoog.labs.i18n.ListFormatSymbols_pt_MZ = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale pt_ST.\n */\ngoog.labs.i18n.ListFormatSymbols_pt_ST = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale pt_TL.\n */\ngoog.labs.i18n.ListFormatSymbols_pt_TL = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} e {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} e {1}'\n};\n\n\n/**\n * List formatting symbols for locale qu.\n */\ngoog.labs.i18n.ListFormatSymbols_qu = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale qu_BO.\n */\ngoog.labs.i18n.ListFormatSymbols_qu_BO = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale qu_EC.\n */\ngoog.labs.i18n.ListFormatSymbols_qu_EC = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale qu_PE.\n */\ngoog.labs.i18n.ListFormatSymbols_qu_PE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale rm.\n */\ngoog.labs.i18n.ListFormatSymbols_rm = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale rm_CH.\n */\ngoog.labs.i18n.ListFormatSymbols_rm_CH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale rn.\n */\ngoog.labs.i18n.ListFormatSymbols_rn = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale rn_BI.\n */\ngoog.labs.i18n.ListFormatSymbols_rn_BI = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ro_MD.\n */\ngoog.labs.i18n.ListFormatSymbols_ro_MD = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} și {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} și {1}'\n};\n\n\n/**\n * List formatting symbols for locale ro_RO.\n */\ngoog.labs.i18n.ListFormatSymbols_ro_RO = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} și {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} și {1}'\n};\n\n\n/**\n * List formatting symbols for locale rof.\n */\ngoog.labs.i18n.ListFormatSymbols_rof = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale rof_TZ.\n */\ngoog.labs.i18n.ListFormatSymbols_rof_TZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ru_BY.\n */\ngoog.labs.i18n.ListFormatSymbols_ru_BY = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale ru_KG.\n */\ngoog.labs.i18n.ListFormatSymbols_ru_KG = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale ru_KZ.\n */\ngoog.labs.i18n.ListFormatSymbols_ru_KZ = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale ru_MD.\n */\ngoog.labs.i18n.ListFormatSymbols_ru_MD = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale ru_RU.\n */\ngoog.labs.i18n.ListFormatSymbols_ru_RU = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale ru_UA.\n */\ngoog.labs.i18n.ListFormatSymbols_ru_UA = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale rw.\n */\ngoog.labs.i18n.ListFormatSymbols_rw = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale rw_RW.\n */\ngoog.labs.i18n.ListFormatSymbols_rw_RW = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale rwk.\n */\ngoog.labs.i18n.ListFormatSymbols_rwk = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale rwk_TZ.\n */\ngoog.labs.i18n.ListFormatSymbols_rwk_TZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale sah.\n */\ngoog.labs.i18n.ListFormatSymbols_sah = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} уонна {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} уонна {1}'\n};\n\n\n/**\n * List formatting symbols for locale sah_RU.\n */\ngoog.labs.i18n.ListFormatSymbols_sah_RU = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} уонна {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} уонна {1}'\n};\n\n\n/**\n * List formatting symbols for locale saq.\n */\ngoog.labs.i18n.ListFormatSymbols_saq = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale saq_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_saq_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale sbp.\n */\ngoog.labs.i18n.ListFormatSymbols_sbp = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale sbp_TZ.\n */\ngoog.labs.i18n.ListFormatSymbols_sbp_TZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale sd.\n */\ngoog.labs.i18n.ListFormatSymbols_sd = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ۽ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}، ۽ {1}'\n};\n\n\n/**\n * List formatting symbols for locale sd_PK.\n */\ngoog.labs.i18n.ListFormatSymbols_sd_PK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ۽ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}، ۽ {1}'\n};\n\n\n/**\n * List formatting symbols for locale se.\n */\ngoog.labs.i18n.ListFormatSymbols_se = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ja {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ja {1}'\n};\n\n\n/**\n * List formatting symbols for locale se_FI.\n */\ngoog.labs.i18n.ListFormatSymbols_se_FI = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ja {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ja {1}'\n};\n\n\n/**\n * List formatting symbols for locale se_NO.\n */\ngoog.labs.i18n.ListFormatSymbols_se_NO = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ja {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ja {1}'\n};\n\n\n/**\n * List formatting symbols for locale se_SE.\n */\ngoog.labs.i18n.ListFormatSymbols_se_SE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ja {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ja {1}'\n};\n\n\n/**\n * List formatting symbols for locale seh.\n */\ngoog.labs.i18n.ListFormatSymbols_seh = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale seh_MZ.\n */\ngoog.labs.i18n.ListFormatSymbols_seh_MZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ses.\n */\ngoog.labs.i18n.ListFormatSymbols_ses = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ses_ML.\n */\ngoog.labs.i18n.ListFormatSymbols_ses_ML = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale sg.\n */\ngoog.labs.i18n.ListFormatSymbols_sg = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale sg_CF.\n */\ngoog.labs.i18n.ListFormatSymbols_sg_CF = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale shi.\n */\ngoog.labs.i18n.ListFormatSymbols_shi = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale shi_Latn.\n */\ngoog.labs.i18n.ListFormatSymbols_shi_Latn = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale shi_Latn_MA.\n */\ngoog.labs.i18n.ListFormatSymbols_shi_Latn_MA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale shi_Tfng.\n */\ngoog.labs.i18n.ListFormatSymbols_shi_Tfng = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale shi_Tfng_MA.\n */\ngoog.labs.i18n.ListFormatSymbols_shi_Tfng_MA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale si_LK.\n */\ngoog.labs.i18n.ListFormatSymbols_si_LK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} සහ {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, සහ {1}'\n};\n\n\n/**\n * List formatting symbols for locale sk_SK.\n */\ngoog.labs.i18n.ListFormatSymbols_sk_SK = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} a {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} a {1}'\n};\n\n\n/**\n * List formatting symbols for locale sl_SI.\n */\ngoog.labs.i18n.ListFormatSymbols_sl_SI = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} in {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} in {1}'\n};\n\n\n/**\n * List formatting symbols for locale smn.\n */\ngoog.labs.i18n.ListFormatSymbols_smn = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale smn_FI.\n */\ngoog.labs.i18n.ListFormatSymbols_smn_FI = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale sn.\n */\ngoog.labs.i18n.ListFormatSymbols_sn = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale sn_ZW.\n */\ngoog.labs.i18n.ListFormatSymbols_sn_ZW = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale so.\n */\ngoog.labs.i18n.ListFormatSymbols_so = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} iyo {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} iyo {1}'\n};\n\n\n/**\n * List formatting symbols for locale so_DJ.\n */\ngoog.labs.i18n.ListFormatSymbols_so_DJ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} iyo {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} iyo {1}'\n};\n\n\n/**\n * List formatting symbols for locale so_ET.\n */\ngoog.labs.i18n.ListFormatSymbols_so_ET = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} iyo {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} iyo {1}'\n};\n\n\n/**\n * List formatting symbols for locale so_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_so_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} iyo {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} iyo {1}'\n};\n\n\n/**\n * List formatting symbols for locale so_SO.\n */\ngoog.labs.i18n.ListFormatSymbols_so_SO = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} iyo {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} iyo {1}'\n};\n\n\n/**\n * List formatting symbols for locale sq_AL.\n */\ngoog.labs.i18n.ListFormatSymbols_sq_AL = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} dhe {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} dhe {1}'\n};\n\n\n/**\n * List formatting symbols for locale sq_MK.\n */\ngoog.labs.i18n.ListFormatSymbols_sq_MK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} dhe {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} dhe {1}'\n};\n\n\n/**\n * List formatting symbols for locale sq_XK.\n */\ngoog.labs.i18n.ListFormatSymbols_sq_XK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} dhe {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} dhe {1}'\n};\n\n\n/**\n * List formatting symbols for locale sr_Cyrl.\n */\ngoog.labs.i18n.ListFormatSymbols_sr_Cyrl = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale sr_Cyrl_BA.\n */\ngoog.labs.i18n.ListFormatSymbols_sr_Cyrl_BA = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale sr_Cyrl_ME.\n */\ngoog.labs.i18n.ListFormatSymbols_sr_Cyrl_ME = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale sr_Cyrl_RS.\n */\ngoog.labs.i18n.ListFormatSymbols_sr_Cyrl_RS = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale sr_Cyrl_XK.\n */\ngoog.labs.i18n.ListFormatSymbols_sr_Cyrl_XK = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} и {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} и {1}'\n};\n\n\n/**\n * List formatting symbols for locale sr_Latn_BA.\n */\ngoog.labs.i18n.ListFormatSymbols_sr_Latn_BA = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale sr_Latn_ME.\n */\ngoog.labs.i18n.ListFormatSymbols_sr_Latn_ME = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale sr_Latn_RS.\n */\ngoog.labs.i18n.ListFormatSymbols_sr_Latn_RS = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale sr_Latn_XK.\n */\ngoog.labs.i18n.ListFormatSymbols_sr_Latn_XK = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} i {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} i {1}'\n};\n\n\n/**\n * List formatting symbols for locale sv_AX.\n */\ngoog.labs.i18n.ListFormatSymbols_sv_AX = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} och {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} och {1}'\n};\n\n\n/**\n * List formatting symbols for locale sv_FI.\n */\ngoog.labs.i18n.ListFormatSymbols_sv_FI = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} och {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} och {1}'\n};\n\n\n/**\n * List formatting symbols for locale sv_SE.\n */\ngoog.labs.i18n.ListFormatSymbols_sv_SE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} och {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} och {1}'\n};\n\n\n/**\n * List formatting symbols for locale sw_CD.\n */\ngoog.labs.i18n.ListFormatSymbols_sw_CD = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} na {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} na {1}'\n};\n\n\n/**\n * List formatting symbols for locale sw_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_sw_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} na {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} na {1}'\n};\n\n\n/**\n * List formatting symbols for locale sw_TZ.\n */\ngoog.labs.i18n.ListFormatSymbols_sw_TZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} na {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} na {1}'\n};\n\n\n/**\n * List formatting symbols for locale sw_UG.\n */\ngoog.labs.i18n.ListFormatSymbols_sw_UG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} na {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} na {1}'\n};\n\n\n/**\n * List formatting symbols for locale ta_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_ta_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} மற்றும் {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} மற்றும் {1}'\n};\n\n\n/**\n * List formatting symbols for locale ta_LK.\n */\ngoog.labs.i18n.ListFormatSymbols_ta_LK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} மற்றும் {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} மற்றும் {1}'\n};\n\n\n/**\n * List formatting symbols for locale ta_MY.\n */\ngoog.labs.i18n.ListFormatSymbols_ta_MY = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} மற்றும் {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} மற்றும் {1}'\n};\n\n\n/**\n * List formatting symbols for locale ta_SG.\n */\ngoog.labs.i18n.ListFormatSymbols_ta_SG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} மற்றும் {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} மற்றும் {1}'\n};\n\n\n/**\n * List formatting symbols for locale te_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_te_IN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} మరియు {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} మరియు {1}'\n};\n\n\n/**\n * List formatting symbols for locale teo.\n */\ngoog.labs.i18n.ListFormatSymbols_teo = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale teo_KE.\n */\ngoog.labs.i18n.ListFormatSymbols_teo_KE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale teo_UG.\n */\ngoog.labs.i18n.ListFormatSymbols_teo_UG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale tg.\n */\ngoog.labs.i18n.ListFormatSymbols_tg = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale tg_TJ.\n */\ngoog.labs.i18n.ListFormatSymbols_tg_TJ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale th_TH.\n */\ngoog.labs.i18n.ListFormatSymbols_th_TH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}และ{1}',\n  LIST_START: '{0} {1}',\n  LIST_MIDDLE: '{0} {1}',\n  LIST_END: '{0} และ{1}'\n};\n\n\n/**\n * List formatting symbols for locale ti.\n */\ngoog.labs.i18n.ListFormatSymbols_ti = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ti_ER.\n */\ngoog.labs.i18n.ListFormatSymbols_ti_ER = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ti_ET.\n */\ngoog.labs.i18n.ListFormatSymbols_ti_ET = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale tk.\n */\ngoog.labs.i18n.ListFormatSymbols_tk = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} we {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} we {1}'\n};\n\n\n/**\n * List formatting symbols for locale tk_TM.\n */\ngoog.labs.i18n.ListFormatSymbols_tk_TM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} we {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} we {1}'\n};\n\n\n/**\n * List formatting symbols for locale to.\n */\ngoog.labs.i18n.ListFormatSymbols_to = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} mo {1}',\n  LIST_START: '{0} mo {1}',\n  LIST_MIDDLE: '{0} mo {1}',\n  LIST_END: '{0} mo {1}'\n};\n\n\n/**\n * List formatting symbols for locale to_TO.\n */\ngoog.labs.i18n.ListFormatSymbols_to_TO = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} mo {1}',\n  LIST_START: '{0} mo {1}',\n  LIST_MIDDLE: '{0} mo {1}',\n  LIST_END: '{0} mo {1}'\n};\n\n\n/**\n * List formatting symbols for locale tr_CY.\n */\ngoog.labs.i18n.ListFormatSymbols_tr_CY = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ve {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ve {1}'\n};\n\n\n/**\n * List formatting symbols for locale tr_TR.\n */\ngoog.labs.i18n.ListFormatSymbols_tr_TR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ve {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} ve {1}'\n};\n\n\n/**\n * List formatting symbols for locale tt.\n */\ngoog.labs.i18n.ListFormatSymbols_tt = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} һәм {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} һәм {1}'\n};\n\n\n/**\n * List formatting symbols for locale tt_RU.\n */\ngoog.labs.i18n.ListFormatSymbols_tt_RU = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} һәм {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} һәм {1}'\n};\n\n\n/**\n * List formatting symbols for locale twq.\n */\ngoog.labs.i18n.ListFormatSymbols_twq = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale twq_NE.\n */\ngoog.labs.i18n.ListFormatSymbols_twq_NE = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale tzm.\n */\ngoog.labs.i18n.ListFormatSymbols_tzm = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale tzm_MA.\n */\ngoog.labs.i18n.ListFormatSymbols_tzm_MA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale ug.\n */\ngoog.labs.i18n.ListFormatSymbols_ug = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale ug_CN.\n */\ngoog.labs.i18n.ListFormatSymbols_ug_CN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} and {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, and {1}'\n};\n\n\n/**\n * List formatting symbols for locale uk_UA.\n */\ngoog.labs.i18n.ListFormatSymbols_uk_UA = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} і {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} і {1}'\n};\n\n\n/**\n * List formatting symbols for locale ur_IN.\n */\ngoog.labs.i18n.ListFormatSymbols_ur_IN = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} اور {1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، اور {1}'\n};\n\n\n/**\n * List formatting symbols for locale ur_PK.\n */\ngoog.labs.i18n.ListFormatSymbols_ur_PK = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0} اور {1}',\n  LIST_START: '{0}، {1}',\n  LIST_MIDDLE: '{0}، {1}',\n  LIST_END: '{0}، اور {1}'\n};\n\n\n/**\n * List formatting symbols for locale uz_Arab.\n */\ngoog.labs.i18n.ListFormatSymbols_uz_Arab = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale uz_Arab_AF.\n */\ngoog.labs.i18n.ListFormatSymbols_uz_Arab_AF = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale uz_Cyrl.\n */\ngoog.labs.i18n.ListFormatSymbols_uz_Cyrl = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale uz_Cyrl_UZ.\n */\ngoog.labs.i18n.ListFormatSymbols_uz_Cyrl_UZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale uz_Latn.\n */\ngoog.labs.i18n.ListFormatSymbols_uz_Latn = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} va {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} va {1}'\n};\n\n\n/**\n * List formatting symbols for locale uz_Latn_UZ.\n */\ngoog.labs.i18n.ListFormatSymbols_uz_Latn_UZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} va {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} va {1}'\n};\n\n\n/**\n * List formatting symbols for locale vai.\n */\ngoog.labs.i18n.ListFormatSymbols_vai = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale vai_Latn.\n */\ngoog.labs.i18n.ListFormatSymbols_vai_Latn = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale vai_Latn_LR.\n */\ngoog.labs.i18n.ListFormatSymbols_vai_Latn_LR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale vai_Vaii.\n */\ngoog.labs.i18n.ListFormatSymbols_vai_Vaii = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale vai_Vaii_LR.\n */\ngoog.labs.i18n.ListFormatSymbols_vai_Vaii_LR = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale vi_VN.\n */\ngoog.labs.i18n.ListFormatSymbols_vi_VN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} và {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} và {1}'\n};\n\n\n/**\n * List formatting symbols for locale vun.\n */\ngoog.labs.i18n.ListFormatSymbols_vun = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale vun_TZ.\n */\ngoog.labs.i18n.ListFormatSymbols_vun_TZ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale wae.\n */\ngoog.labs.i18n.ListFormatSymbols_wae = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} und {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} und {1}'\n};\n\n\n/**\n * List formatting symbols for locale wae_CH.\n */\ngoog.labs.i18n.ListFormatSymbols_wae_CH = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} und {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} und {1}'\n};\n\n\n/**\n * List formatting symbols for locale wo.\n */\ngoog.labs.i18n.ListFormatSymbols_wo = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale wo_SN.\n */\ngoog.labs.i18n.ListFormatSymbols_wo_SN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale xh.\n */\ngoog.labs.i18n.ListFormatSymbols_xh = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale xh_ZA.\n */\ngoog.labs.i18n.ListFormatSymbols_xh_ZA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale xog.\n */\ngoog.labs.i18n.ListFormatSymbols_xog = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale xog_UG.\n */\ngoog.labs.i18n.ListFormatSymbols_xog_UG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale yav.\n */\ngoog.labs.i18n.ListFormatSymbols_yav = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale yav_CM.\n */\ngoog.labs.i18n.ListFormatSymbols_yav_CM = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale yi.\n */\ngoog.labs.i18n.ListFormatSymbols_yi = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} און {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} און {1}'\n};\n\n\n/**\n * List formatting symbols for locale yi_001.\n */\ngoog.labs.i18n.ListFormatSymbols_yi_001 = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} און {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0} און {1}'\n};\n\n\n/**\n * List formatting symbols for locale yo.\n */\ngoog.labs.i18n.ListFormatSymbols_yo = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale yo_BJ.\n */\ngoog.labs.i18n.ListFormatSymbols_yo_BJ = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale yo_NG.\n */\ngoog.labs.i18n.ListFormatSymbols_yo_NG = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale yue.\n */\ngoog.labs.i18n.ListFormatSymbols_yue = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}同{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}同{1}'\n};\n\n\n/**\n * List formatting symbols for locale yue_Hans.\n */\ngoog.labs.i18n.ListFormatSymbols_yue_Hans = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}同{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}同{1}'\n};\n\n\n/**\n * List formatting symbols for locale yue_Hans_CN.\n */\ngoog.labs.i18n.ListFormatSymbols_yue_Hans_CN = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}同{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}同{1}'\n};\n\n\n/**\n * List formatting symbols for locale yue_Hant.\n */\ngoog.labs.i18n.ListFormatSymbols_yue_Hant = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}同{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}同{1}'\n};\n\n\n/**\n * List formatting symbols for locale yue_Hant_HK.\n */\ngoog.labs.i18n.ListFormatSymbols_yue_Hant_HK = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}同{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}同{1}'\n};\n\n\n/**\n * List formatting symbols for locale zgh.\n */\ngoog.labs.i18n.ListFormatSymbols_zgh = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale zgh_MA.\n */\ngoog.labs.i18n.ListFormatSymbols_zgh_MA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0}, {1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, {1}'\n};\n\n\n/**\n * List formatting symbols for locale zh_Hans.\n */\ngoog.labs.i18n.ListFormatSymbols_zh_Hans = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0}和{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}和{1}'\n};\n\n\n/**\n * List formatting symbols for locale zh_Hans_CN.\n */\ngoog.labs.i18n.ListFormatSymbols_zh_Hans_CN = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0}和{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}和{1}'\n};\n\n\n/**\n * List formatting symbols for locale zh_Hans_HK.\n */\ngoog.labs.i18n.ListFormatSymbols_zh_Hans_HK = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0}和{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}和{1}'\n};\n\n\n/**\n * List formatting symbols for locale zh_Hans_MO.\n */\ngoog.labs.i18n.ListFormatSymbols_zh_Hans_MO = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0}和{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}和{1}'\n};\n\n\n/**\n * List formatting symbols for locale zh_Hans_SG.\n */\ngoog.labs.i18n.ListFormatSymbols_zh_Hans_SG = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0}和{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}和{1}'\n};\n\n\n/**\n * List formatting symbols for locale zh_Hant.\n */\ngoog.labs.i18n.ListFormatSymbols_zh_Hant = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0}和{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}和{1}'\n};\n\n\n/**\n * List formatting symbols for locale zh_Hant_HK.\n */\ngoog.labs.i18n.ListFormatSymbols_zh_Hant_HK = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0}及{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}及{1}'\n};\n\n\n/**\n * List formatting symbols for locale zh_Hant_MO.\n */\ngoog.labs.i18n.ListFormatSymbols_zh_Hant_MO = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0}及{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}及{1}'\n};\n\n\n/**\n * List formatting symbols for locale zh_Hant_TW.\n */\ngoog.labs.i18n.ListFormatSymbols_zh_Hant_TW = {\n  GENDER_STYLE: 2,\n  LIST_TWO: '{0}和{1}',\n  LIST_START: '{0}、{1}',\n  LIST_MIDDLE: '{0}、{1}',\n  LIST_END: '{0}和{1}'\n};\n\n\n/**\n * List formatting symbols for locale zu_ZA.\n */\ngoog.labs.i18n.ListFormatSymbols_zu_ZA = {\n  GENDER_STYLE: 0,\n  LIST_TWO: '{0} ne-{1}',\n  LIST_START: '{0}, {1}',\n  LIST_MIDDLE: '{0}, {1}',\n  LIST_END: '{0}, ne-{1}'\n};\n\n\n/**\n * Selecting symbols by locale.\n */\nif (goog.LOCALE == 'af_NA' || goog.LOCALE == 'af-NA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_af_NA;\n}\n\nif (goog.LOCALE == 'af_ZA' || goog.LOCALE == 'af-ZA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_af_ZA;\n}\n\nif (goog.LOCALE == 'agq') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_agq;\n}\n\nif (goog.LOCALE == 'agq_CM' || goog.LOCALE == 'agq-CM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_agq_CM;\n}\n\nif (goog.LOCALE == 'ak') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ak;\n}\n\nif (goog.LOCALE == 'ak_GH' || goog.LOCALE == 'ak-GH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ak_GH;\n}\n\nif (goog.LOCALE == 'am_ET' || goog.LOCALE == 'am-ET') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_am_ET;\n}\n\nif (goog.LOCALE == 'ar_001' || goog.LOCALE == 'ar-001') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_001;\n}\n\nif (goog.LOCALE == 'ar_AE' || goog.LOCALE == 'ar-AE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_AE;\n}\n\nif (goog.LOCALE == 'ar_BH' || goog.LOCALE == 'ar-BH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_BH;\n}\n\nif (goog.LOCALE == 'ar_DJ' || goog.LOCALE == 'ar-DJ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_DJ;\n}\n\nif (goog.LOCALE == 'ar_EH' || goog.LOCALE == 'ar-EH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_EH;\n}\n\nif (goog.LOCALE == 'ar_ER' || goog.LOCALE == 'ar-ER') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_ER;\n}\n\nif (goog.LOCALE == 'ar_IL' || goog.LOCALE == 'ar-IL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_IL;\n}\n\nif (goog.LOCALE == 'ar_IQ' || goog.LOCALE == 'ar-IQ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_IQ;\n}\n\nif (goog.LOCALE == 'ar_JO' || goog.LOCALE == 'ar-JO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_JO;\n}\n\nif (goog.LOCALE == 'ar_KM' || goog.LOCALE == 'ar-KM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_KM;\n}\n\nif (goog.LOCALE == 'ar_KW' || goog.LOCALE == 'ar-KW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_KW;\n}\n\nif (goog.LOCALE == 'ar_LB' || goog.LOCALE == 'ar-LB') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_LB;\n}\n\nif (goog.LOCALE == 'ar_LY' || goog.LOCALE == 'ar-LY') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_LY;\n}\n\nif (goog.LOCALE == 'ar_MA' || goog.LOCALE == 'ar-MA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_MA;\n}\n\nif (goog.LOCALE == 'ar_MR' || goog.LOCALE == 'ar-MR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_MR;\n}\n\nif (goog.LOCALE == 'ar_OM' || goog.LOCALE == 'ar-OM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_OM;\n}\n\nif (goog.LOCALE == 'ar_PS' || goog.LOCALE == 'ar-PS') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_PS;\n}\n\nif (goog.LOCALE == 'ar_QA' || goog.LOCALE == 'ar-QA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_QA;\n}\n\nif (goog.LOCALE == 'ar_SA' || goog.LOCALE == 'ar-SA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_SA;\n}\n\nif (goog.LOCALE == 'ar_SD' || goog.LOCALE == 'ar-SD') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_SD;\n}\n\nif (goog.LOCALE == 'ar_SO' || goog.LOCALE == 'ar-SO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_SO;\n}\n\nif (goog.LOCALE == 'ar_SS' || goog.LOCALE == 'ar-SS') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_SS;\n}\n\nif (goog.LOCALE == 'ar_SY' || goog.LOCALE == 'ar-SY') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_SY;\n}\n\nif (goog.LOCALE == 'ar_TD' || goog.LOCALE == 'ar-TD') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_TD;\n}\n\nif (goog.LOCALE == 'ar_TN' || goog.LOCALE == 'ar-TN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_TN;\n}\n\nif (goog.LOCALE == 'ar_XB' || goog.LOCALE == 'ar-XB') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_XB;\n}\n\nif (goog.LOCALE == 'ar_YE' || goog.LOCALE == 'ar-YE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ar_YE;\n}\n\nif (goog.LOCALE == 'as') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_as;\n}\n\nif (goog.LOCALE == 'as_IN' || goog.LOCALE == 'as-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_as_IN;\n}\n\nif (goog.LOCALE == 'asa') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_asa;\n}\n\nif (goog.LOCALE == 'asa_TZ' || goog.LOCALE == 'asa-TZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_asa_TZ;\n}\n\nif (goog.LOCALE == 'ast') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ast;\n}\n\nif (goog.LOCALE == 'ast_ES' || goog.LOCALE == 'ast-ES') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ast_ES;\n}\n\nif (goog.LOCALE == 'az_Cyrl' || goog.LOCALE == 'az-Cyrl') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_az_Cyrl;\n}\n\nif (goog.LOCALE == 'az_Cyrl_AZ' || goog.LOCALE == 'az-Cyrl-AZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_az_Cyrl_AZ;\n}\n\nif (goog.LOCALE == 'az_Latn' || goog.LOCALE == 'az-Latn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_az_Latn;\n}\n\nif (goog.LOCALE == 'az_Latn_AZ' || goog.LOCALE == 'az-Latn-AZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_az_Latn_AZ;\n}\n\nif (goog.LOCALE == 'bas') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bas;\n}\n\nif (goog.LOCALE == 'bas_CM' || goog.LOCALE == 'bas-CM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bas_CM;\n}\n\nif (goog.LOCALE == 'be_BY' || goog.LOCALE == 'be-BY') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_be_BY;\n}\n\nif (goog.LOCALE == 'bem') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bem;\n}\n\nif (goog.LOCALE == 'bem_ZM' || goog.LOCALE == 'bem-ZM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bem_ZM;\n}\n\nif (goog.LOCALE == 'bez') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bez;\n}\n\nif (goog.LOCALE == 'bez_TZ' || goog.LOCALE == 'bez-TZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bez_TZ;\n}\n\nif (goog.LOCALE == 'bg_BG' || goog.LOCALE == 'bg-BG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bg_BG;\n}\n\nif (goog.LOCALE == 'bm') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bm;\n}\n\nif (goog.LOCALE == 'bm_ML' || goog.LOCALE == 'bm-ML') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bm_ML;\n}\n\nif (goog.LOCALE == 'bn_BD' || goog.LOCALE == 'bn-BD') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bn_BD;\n}\n\nif (goog.LOCALE == 'bn_IN' || goog.LOCALE == 'bn-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bn_IN;\n}\n\nif (goog.LOCALE == 'bo') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bo;\n}\n\nif (goog.LOCALE == 'bo_CN' || goog.LOCALE == 'bo-CN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bo_CN;\n}\n\nif (goog.LOCALE == 'bo_IN' || goog.LOCALE == 'bo-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bo_IN;\n}\n\nif (goog.LOCALE == 'br_FR' || goog.LOCALE == 'br-FR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_br_FR;\n}\n\nif (goog.LOCALE == 'brx') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_brx;\n}\n\nif (goog.LOCALE == 'brx_IN' || goog.LOCALE == 'brx-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_brx_IN;\n}\n\nif (goog.LOCALE == 'bs_Cyrl' || goog.LOCALE == 'bs-Cyrl') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bs_Cyrl;\n}\n\nif (goog.LOCALE == 'bs_Cyrl_BA' || goog.LOCALE == 'bs-Cyrl-BA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bs_Cyrl_BA;\n}\n\nif (goog.LOCALE == 'bs_Latn' || goog.LOCALE == 'bs-Latn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bs_Latn;\n}\n\nif (goog.LOCALE == 'bs_Latn_BA' || goog.LOCALE == 'bs-Latn-BA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_bs_Latn_BA;\n}\n\nif (goog.LOCALE == 'ca_AD' || goog.LOCALE == 'ca-AD') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ca_AD;\n}\n\nif (goog.LOCALE == 'ca_ES' || goog.LOCALE == 'ca-ES') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ca_ES;\n}\n\nif (goog.LOCALE == 'ca_FR' || goog.LOCALE == 'ca-FR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ca_FR;\n}\n\nif (goog.LOCALE == 'ca_IT' || goog.LOCALE == 'ca-IT') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ca_IT;\n}\n\nif (goog.LOCALE == 'ccp') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ccp;\n}\n\nif (goog.LOCALE == 'ccp_BD' || goog.LOCALE == 'ccp-BD') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ccp_BD;\n}\n\nif (goog.LOCALE == 'ccp_IN' || goog.LOCALE == 'ccp-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ccp_IN;\n}\n\nif (goog.LOCALE == 'ce') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ce;\n}\n\nif (goog.LOCALE == 'ce_RU' || goog.LOCALE == 'ce-RU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ce_RU;\n}\n\nif (goog.LOCALE == 'ceb') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ceb;\n}\n\nif (goog.LOCALE == 'ceb_PH' || goog.LOCALE == 'ceb-PH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ceb_PH;\n}\n\nif (goog.LOCALE == 'cgg') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_cgg;\n}\n\nif (goog.LOCALE == 'cgg_UG' || goog.LOCALE == 'cgg-UG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_cgg_UG;\n}\n\nif (goog.LOCALE == 'chr_US' || goog.LOCALE == 'chr-US') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_chr_US;\n}\n\nif (goog.LOCALE == 'ckb') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ckb;\n}\n\nif (goog.LOCALE == 'ckb_IQ' || goog.LOCALE == 'ckb-IQ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ckb_IQ;\n}\n\nif (goog.LOCALE == 'ckb_IR' || goog.LOCALE == 'ckb-IR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ckb_IR;\n}\n\nif (goog.LOCALE == 'cs_CZ' || goog.LOCALE == 'cs-CZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_cs_CZ;\n}\n\nif (goog.LOCALE == 'cy_GB' || goog.LOCALE == 'cy-GB') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_cy_GB;\n}\n\nif (goog.LOCALE == 'da_DK' || goog.LOCALE == 'da-DK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_da_DK;\n}\n\nif (goog.LOCALE == 'da_GL' || goog.LOCALE == 'da-GL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_da_GL;\n}\n\nif (goog.LOCALE == 'dav') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_dav;\n}\n\nif (goog.LOCALE == 'dav_KE' || goog.LOCALE == 'dav-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_dav_KE;\n}\n\nif (goog.LOCALE == 'de_BE' || goog.LOCALE == 'de-BE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_de_BE;\n}\n\nif (goog.LOCALE == 'de_DE' || goog.LOCALE == 'de-DE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_de_DE;\n}\n\nif (goog.LOCALE == 'de_IT' || goog.LOCALE == 'de-IT') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_de_IT;\n}\n\nif (goog.LOCALE == 'de_LI' || goog.LOCALE == 'de-LI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_de_LI;\n}\n\nif (goog.LOCALE == 'de_LU' || goog.LOCALE == 'de-LU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_de_LU;\n}\n\nif (goog.LOCALE == 'dje') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_dje;\n}\n\nif (goog.LOCALE == 'dje_NE' || goog.LOCALE == 'dje-NE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_dje_NE;\n}\n\nif (goog.LOCALE == 'dsb') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_dsb;\n}\n\nif (goog.LOCALE == 'dsb_DE' || goog.LOCALE == 'dsb-DE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_dsb_DE;\n}\n\nif (goog.LOCALE == 'dua') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_dua;\n}\n\nif (goog.LOCALE == 'dua_CM' || goog.LOCALE == 'dua-CM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_dua_CM;\n}\n\nif (goog.LOCALE == 'dyo') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_dyo;\n}\n\nif (goog.LOCALE == 'dyo_SN' || goog.LOCALE == 'dyo-SN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_dyo_SN;\n}\n\nif (goog.LOCALE == 'dz') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_dz;\n}\n\nif (goog.LOCALE == 'dz_BT' || goog.LOCALE == 'dz-BT') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_dz_BT;\n}\n\nif (goog.LOCALE == 'ebu') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ebu;\n}\n\nif (goog.LOCALE == 'ebu_KE' || goog.LOCALE == 'ebu-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ebu_KE;\n}\n\nif (goog.LOCALE == 'ee') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ee;\n}\n\nif (goog.LOCALE == 'ee_GH' || goog.LOCALE == 'ee-GH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ee_GH;\n}\n\nif (goog.LOCALE == 'ee_TG' || goog.LOCALE == 'ee-TG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ee_TG;\n}\n\nif (goog.LOCALE == 'el_CY' || goog.LOCALE == 'el-CY') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_el_CY;\n}\n\nif (goog.LOCALE == 'el_GR' || goog.LOCALE == 'el-GR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_el_GR;\n}\n\nif (goog.LOCALE == 'en_001' || goog.LOCALE == 'en-001') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_001;\n}\n\nif (goog.LOCALE == 'en_150' || goog.LOCALE == 'en-150') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_150;\n}\n\nif (goog.LOCALE == 'en_AE' || goog.LOCALE == 'en-AE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_AE;\n}\n\nif (goog.LOCALE == 'en_AG' || goog.LOCALE == 'en-AG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_AG;\n}\n\nif (goog.LOCALE == 'en_AI' || goog.LOCALE == 'en-AI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_AI;\n}\n\nif (goog.LOCALE == 'en_AS' || goog.LOCALE == 'en-AS') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_AS;\n}\n\nif (goog.LOCALE == 'en_AT' || goog.LOCALE == 'en-AT') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_AT;\n}\n\nif (goog.LOCALE == 'en_BB' || goog.LOCALE == 'en-BB') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_BB;\n}\n\nif (goog.LOCALE == 'en_BE' || goog.LOCALE == 'en-BE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_BE;\n}\n\nif (goog.LOCALE == 'en_BI' || goog.LOCALE == 'en-BI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_BI;\n}\n\nif (goog.LOCALE == 'en_BM' || goog.LOCALE == 'en-BM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_BM;\n}\n\nif (goog.LOCALE == 'en_BS' || goog.LOCALE == 'en-BS') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_BS;\n}\n\nif (goog.LOCALE == 'en_BW' || goog.LOCALE == 'en-BW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_BW;\n}\n\nif (goog.LOCALE == 'en_BZ' || goog.LOCALE == 'en-BZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_BZ;\n}\n\nif (goog.LOCALE == 'en_CC' || goog.LOCALE == 'en-CC') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_CC;\n}\n\nif (goog.LOCALE == 'en_CH' || goog.LOCALE == 'en-CH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_CH;\n}\n\nif (goog.LOCALE == 'en_CK' || goog.LOCALE == 'en-CK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_CK;\n}\n\nif (goog.LOCALE == 'en_CM' || goog.LOCALE == 'en-CM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_CM;\n}\n\nif (goog.LOCALE == 'en_CX' || goog.LOCALE == 'en-CX') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_CX;\n}\n\nif (goog.LOCALE == 'en_CY' || goog.LOCALE == 'en-CY') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_CY;\n}\n\nif (goog.LOCALE == 'en_DE' || goog.LOCALE == 'en-DE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_DE;\n}\n\nif (goog.LOCALE == 'en_DG' || goog.LOCALE == 'en-DG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_DG;\n}\n\nif (goog.LOCALE == 'en_DK' || goog.LOCALE == 'en-DK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_DK;\n}\n\nif (goog.LOCALE == 'en_DM' || goog.LOCALE == 'en-DM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_DM;\n}\n\nif (goog.LOCALE == 'en_ER' || goog.LOCALE == 'en-ER') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_ER;\n}\n\nif (goog.LOCALE == 'en_FI' || goog.LOCALE == 'en-FI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_FI;\n}\n\nif (goog.LOCALE == 'en_FJ' || goog.LOCALE == 'en-FJ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_FJ;\n}\n\nif (goog.LOCALE == 'en_FK' || goog.LOCALE == 'en-FK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_FK;\n}\n\nif (goog.LOCALE == 'en_FM' || goog.LOCALE == 'en-FM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_FM;\n}\n\nif (goog.LOCALE == 'en_GD' || goog.LOCALE == 'en-GD') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_GD;\n}\n\nif (goog.LOCALE == 'en_GG' || goog.LOCALE == 'en-GG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_GG;\n}\n\nif (goog.LOCALE == 'en_GH' || goog.LOCALE == 'en-GH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_GH;\n}\n\nif (goog.LOCALE == 'en_GI' || goog.LOCALE == 'en-GI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_GI;\n}\n\nif (goog.LOCALE == 'en_GM' || goog.LOCALE == 'en-GM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_GM;\n}\n\nif (goog.LOCALE == 'en_GU' || goog.LOCALE == 'en-GU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_GU;\n}\n\nif (goog.LOCALE == 'en_GY' || goog.LOCALE == 'en-GY') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_GY;\n}\n\nif (goog.LOCALE == 'en_HK' || goog.LOCALE == 'en-HK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_HK;\n}\n\nif (goog.LOCALE == 'en_IL' || goog.LOCALE == 'en-IL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_IL;\n}\n\nif (goog.LOCALE == 'en_IM' || goog.LOCALE == 'en-IM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_IM;\n}\n\nif (goog.LOCALE == 'en_IO' || goog.LOCALE == 'en-IO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_IO;\n}\n\nif (goog.LOCALE == 'en_JE' || goog.LOCALE == 'en-JE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_JE;\n}\n\nif (goog.LOCALE == 'en_JM' || goog.LOCALE == 'en-JM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_JM;\n}\n\nif (goog.LOCALE == 'en_KE' || goog.LOCALE == 'en-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_KE;\n}\n\nif (goog.LOCALE == 'en_KI' || goog.LOCALE == 'en-KI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_KI;\n}\n\nif (goog.LOCALE == 'en_KN' || goog.LOCALE == 'en-KN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_KN;\n}\n\nif (goog.LOCALE == 'en_KY' || goog.LOCALE == 'en-KY') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_KY;\n}\n\nif (goog.LOCALE == 'en_LC' || goog.LOCALE == 'en-LC') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_LC;\n}\n\nif (goog.LOCALE == 'en_LR' || goog.LOCALE == 'en-LR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_LR;\n}\n\nif (goog.LOCALE == 'en_LS' || goog.LOCALE == 'en-LS') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_LS;\n}\n\nif (goog.LOCALE == 'en_MG' || goog.LOCALE == 'en-MG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_MG;\n}\n\nif (goog.LOCALE == 'en_MH' || goog.LOCALE == 'en-MH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_MH;\n}\n\nif (goog.LOCALE == 'en_MO' || goog.LOCALE == 'en-MO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_MO;\n}\n\nif (goog.LOCALE == 'en_MP' || goog.LOCALE == 'en-MP') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_MP;\n}\n\nif (goog.LOCALE == 'en_MS' || goog.LOCALE == 'en-MS') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_MS;\n}\n\nif (goog.LOCALE == 'en_MT' || goog.LOCALE == 'en-MT') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_MT;\n}\n\nif (goog.LOCALE == 'en_MU' || goog.LOCALE == 'en-MU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_MU;\n}\n\nif (goog.LOCALE == 'en_MW' || goog.LOCALE == 'en-MW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_MW;\n}\n\nif (goog.LOCALE == 'en_MY' || goog.LOCALE == 'en-MY') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_MY;\n}\n\nif (goog.LOCALE == 'en_NA' || goog.LOCALE == 'en-NA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_NA;\n}\n\nif (goog.LOCALE == 'en_NF' || goog.LOCALE == 'en-NF') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_NF;\n}\n\nif (goog.LOCALE == 'en_NG' || goog.LOCALE == 'en-NG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_NG;\n}\n\nif (goog.LOCALE == 'en_NL' || goog.LOCALE == 'en-NL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_NL;\n}\n\nif (goog.LOCALE == 'en_NR' || goog.LOCALE == 'en-NR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_NR;\n}\n\nif (goog.LOCALE == 'en_NU' || goog.LOCALE == 'en-NU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_NU;\n}\n\nif (goog.LOCALE == 'en_NZ' || goog.LOCALE == 'en-NZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_NZ;\n}\n\nif (goog.LOCALE == 'en_PG' || goog.LOCALE == 'en-PG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_PG;\n}\n\nif (goog.LOCALE == 'en_PH' || goog.LOCALE == 'en-PH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_PH;\n}\n\nif (goog.LOCALE == 'en_PK' || goog.LOCALE == 'en-PK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_PK;\n}\n\nif (goog.LOCALE == 'en_PN' || goog.LOCALE == 'en-PN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_PN;\n}\n\nif (goog.LOCALE == 'en_PR' || goog.LOCALE == 'en-PR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_PR;\n}\n\nif (goog.LOCALE == 'en_PW' || goog.LOCALE == 'en-PW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_PW;\n}\n\nif (goog.LOCALE == 'en_RW' || goog.LOCALE == 'en-RW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_RW;\n}\n\nif (goog.LOCALE == 'en_SB' || goog.LOCALE == 'en-SB') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_SB;\n}\n\nif (goog.LOCALE == 'en_SC' || goog.LOCALE == 'en-SC') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_SC;\n}\n\nif (goog.LOCALE == 'en_SD' || goog.LOCALE == 'en-SD') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_SD;\n}\n\nif (goog.LOCALE == 'en_SE' || goog.LOCALE == 'en-SE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_SE;\n}\n\nif (goog.LOCALE == 'en_SH' || goog.LOCALE == 'en-SH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_SH;\n}\n\nif (goog.LOCALE == 'en_SI' || goog.LOCALE == 'en-SI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_SI;\n}\n\nif (goog.LOCALE == 'en_SL' || goog.LOCALE == 'en-SL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_SL;\n}\n\nif (goog.LOCALE == 'en_SS' || goog.LOCALE == 'en-SS') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_SS;\n}\n\nif (goog.LOCALE == 'en_SX' || goog.LOCALE == 'en-SX') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_SX;\n}\n\nif (goog.LOCALE == 'en_SZ' || goog.LOCALE == 'en-SZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_SZ;\n}\n\nif (goog.LOCALE == 'en_TC' || goog.LOCALE == 'en-TC') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_TC;\n}\n\nif (goog.LOCALE == 'en_TK' || goog.LOCALE == 'en-TK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_TK;\n}\n\nif (goog.LOCALE == 'en_TO' || goog.LOCALE == 'en-TO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_TO;\n}\n\nif (goog.LOCALE == 'en_TT' || goog.LOCALE == 'en-TT') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_TT;\n}\n\nif (goog.LOCALE == 'en_TV' || goog.LOCALE == 'en-TV') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_TV;\n}\n\nif (goog.LOCALE == 'en_TZ' || goog.LOCALE == 'en-TZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_TZ;\n}\n\nif (goog.LOCALE == 'en_UG' || goog.LOCALE == 'en-UG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_UG;\n}\n\nif (goog.LOCALE == 'en_UM' || goog.LOCALE == 'en-UM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_UM;\n}\n\nif (goog.LOCALE == 'en_US_POSIX' || goog.LOCALE == 'en-US-POSIX') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_US_POSIX;\n}\n\nif (goog.LOCALE == 'en_VC' || goog.LOCALE == 'en-VC') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_VC;\n}\n\nif (goog.LOCALE == 'en_VG' || goog.LOCALE == 'en-VG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_VG;\n}\n\nif (goog.LOCALE == 'en_VI' || goog.LOCALE == 'en-VI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_VI;\n}\n\nif (goog.LOCALE == 'en_VU' || goog.LOCALE == 'en-VU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_VU;\n}\n\nif (goog.LOCALE == 'en_WS' || goog.LOCALE == 'en-WS') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_WS;\n}\n\nif (goog.LOCALE == 'en_XA' || goog.LOCALE == 'en-XA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_XA;\n}\n\nif (goog.LOCALE == 'en_ZM' || goog.LOCALE == 'en-ZM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_ZM;\n}\n\nif (goog.LOCALE == 'en_ZW' || goog.LOCALE == 'en-ZW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_en_ZW;\n}\n\nif (goog.LOCALE == 'eo') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_eo;\n}\n\nif (goog.LOCALE == 'eo_001' || goog.LOCALE == 'eo-001') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_eo_001;\n}\n\nif (goog.LOCALE == 'es_AR' || goog.LOCALE == 'es-AR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_AR;\n}\n\nif (goog.LOCALE == 'es_BO' || goog.LOCALE == 'es-BO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_BO;\n}\n\nif (goog.LOCALE == 'es_BR' || goog.LOCALE == 'es-BR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_BR;\n}\n\nif (goog.LOCALE == 'es_BZ' || goog.LOCALE == 'es-BZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_BZ;\n}\n\nif (goog.LOCALE == 'es_CL' || goog.LOCALE == 'es-CL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_CL;\n}\n\nif (goog.LOCALE == 'es_CO' || goog.LOCALE == 'es-CO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_CO;\n}\n\nif (goog.LOCALE == 'es_CR' || goog.LOCALE == 'es-CR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_CR;\n}\n\nif (goog.LOCALE == 'es_CU' || goog.LOCALE == 'es-CU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_CU;\n}\n\nif (goog.LOCALE == 'es_DO' || goog.LOCALE == 'es-DO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_DO;\n}\n\nif (goog.LOCALE == 'es_EA' || goog.LOCALE == 'es-EA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_EA;\n}\n\nif (goog.LOCALE == 'es_EC' || goog.LOCALE == 'es-EC') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_EC;\n}\n\nif (goog.LOCALE == 'es_GQ' || goog.LOCALE == 'es-GQ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_GQ;\n}\n\nif (goog.LOCALE == 'es_GT' || goog.LOCALE == 'es-GT') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_GT;\n}\n\nif (goog.LOCALE == 'es_HN' || goog.LOCALE == 'es-HN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_HN;\n}\n\nif (goog.LOCALE == 'es_IC' || goog.LOCALE == 'es-IC') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_IC;\n}\n\nif (goog.LOCALE == 'es_NI' || goog.LOCALE == 'es-NI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_NI;\n}\n\nif (goog.LOCALE == 'es_PA' || goog.LOCALE == 'es-PA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_PA;\n}\n\nif (goog.LOCALE == 'es_PE' || goog.LOCALE == 'es-PE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_PE;\n}\n\nif (goog.LOCALE == 'es_PH' || goog.LOCALE == 'es-PH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_PH;\n}\n\nif (goog.LOCALE == 'es_PR' || goog.LOCALE == 'es-PR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_PR;\n}\n\nif (goog.LOCALE == 'es_PY' || goog.LOCALE == 'es-PY') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_PY;\n}\n\nif (goog.LOCALE == 'es_SV' || goog.LOCALE == 'es-SV') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_SV;\n}\n\nif (goog.LOCALE == 'es_UY' || goog.LOCALE == 'es-UY') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_UY;\n}\n\nif (goog.LOCALE == 'es_VE' || goog.LOCALE == 'es-VE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_es_VE;\n}\n\nif (goog.LOCALE == 'et_EE' || goog.LOCALE == 'et-EE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_et_EE;\n}\n\nif (goog.LOCALE == 'eu_ES' || goog.LOCALE == 'eu-ES') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_eu_ES;\n}\n\nif (goog.LOCALE == 'ewo') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ewo;\n}\n\nif (goog.LOCALE == 'ewo_CM' || goog.LOCALE == 'ewo-CM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ewo_CM;\n}\n\nif (goog.LOCALE == 'fa_AF' || goog.LOCALE == 'fa-AF') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fa_AF;\n}\n\nif (goog.LOCALE == 'fa_IR' || goog.LOCALE == 'fa-IR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fa_IR;\n}\n\nif (goog.LOCALE == 'ff') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ff;\n}\n\nif (goog.LOCALE == 'ff_Latn' || goog.LOCALE == 'ff-Latn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ff_Latn;\n}\n\nif (goog.LOCALE == 'ff_Latn_BF' || goog.LOCALE == 'ff-Latn-BF') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ff_Latn_BF;\n}\n\nif (goog.LOCALE == 'ff_Latn_CM' || goog.LOCALE == 'ff-Latn-CM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ff_Latn_CM;\n}\n\nif (goog.LOCALE == 'ff_Latn_GH' || goog.LOCALE == 'ff-Latn-GH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ff_Latn_GH;\n}\n\nif (goog.LOCALE == 'ff_Latn_GM' || goog.LOCALE == 'ff-Latn-GM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ff_Latn_GM;\n}\n\nif (goog.LOCALE == 'ff_Latn_GN' || goog.LOCALE == 'ff-Latn-GN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ff_Latn_GN;\n}\n\nif (goog.LOCALE == 'ff_Latn_GW' || goog.LOCALE == 'ff-Latn-GW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ff_Latn_GW;\n}\n\nif (goog.LOCALE == 'ff_Latn_LR' || goog.LOCALE == 'ff-Latn-LR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ff_Latn_LR;\n}\n\nif (goog.LOCALE == 'ff_Latn_MR' || goog.LOCALE == 'ff-Latn-MR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ff_Latn_MR;\n}\n\nif (goog.LOCALE == 'ff_Latn_NE' || goog.LOCALE == 'ff-Latn-NE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ff_Latn_NE;\n}\n\nif (goog.LOCALE == 'ff_Latn_NG' || goog.LOCALE == 'ff-Latn-NG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ff_Latn_NG;\n}\n\nif (goog.LOCALE == 'ff_Latn_SL' || goog.LOCALE == 'ff-Latn-SL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ff_Latn_SL;\n}\n\nif (goog.LOCALE == 'ff_Latn_SN' || goog.LOCALE == 'ff-Latn-SN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ff_Latn_SN;\n}\n\nif (goog.LOCALE == 'fi_FI' || goog.LOCALE == 'fi-FI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fi_FI;\n}\n\nif (goog.LOCALE == 'fil_PH' || goog.LOCALE == 'fil-PH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fil_PH;\n}\n\nif (goog.LOCALE == 'fo') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fo;\n}\n\nif (goog.LOCALE == 'fo_DK' || goog.LOCALE == 'fo-DK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fo_DK;\n}\n\nif (goog.LOCALE == 'fo_FO' || goog.LOCALE == 'fo-FO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fo_FO;\n}\n\nif (goog.LOCALE == 'fr_BE' || goog.LOCALE == 'fr-BE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_BE;\n}\n\nif (goog.LOCALE == 'fr_BF' || goog.LOCALE == 'fr-BF') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_BF;\n}\n\nif (goog.LOCALE == 'fr_BI' || goog.LOCALE == 'fr-BI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_BI;\n}\n\nif (goog.LOCALE == 'fr_BJ' || goog.LOCALE == 'fr-BJ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_BJ;\n}\n\nif (goog.LOCALE == 'fr_BL' || goog.LOCALE == 'fr-BL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_BL;\n}\n\nif (goog.LOCALE == 'fr_CD' || goog.LOCALE == 'fr-CD') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_CD;\n}\n\nif (goog.LOCALE == 'fr_CF' || goog.LOCALE == 'fr-CF') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_CF;\n}\n\nif (goog.LOCALE == 'fr_CG' || goog.LOCALE == 'fr-CG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_CG;\n}\n\nif (goog.LOCALE == 'fr_CH' || goog.LOCALE == 'fr-CH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_CH;\n}\n\nif (goog.LOCALE == 'fr_CI' || goog.LOCALE == 'fr-CI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_CI;\n}\n\nif (goog.LOCALE == 'fr_CM' || goog.LOCALE == 'fr-CM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_CM;\n}\n\nif (goog.LOCALE == 'fr_DJ' || goog.LOCALE == 'fr-DJ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_DJ;\n}\n\nif (goog.LOCALE == 'fr_DZ' || goog.LOCALE == 'fr-DZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_DZ;\n}\n\nif (goog.LOCALE == 'fr_FR' || goog.LOCALE == 'fr-FR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_FR;\n}\n\nif (goog.LOCALE == 'fr_GA' || goog.LOCALE == 'fr-GA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_GA;\n}\n\nif (goog.LOCALE == 'fr_GF' || goog.LOCALE == 'fr-GF') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_GF;\n}\n\nif (goog.LOCALE == 'fr_GN' || goog.LOCALE == 'fr-GN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_GN;\n}\n\nif (goog.LOCALE == 'fr_GP' || goog.LOCALE == 'fr-GP') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_GP;\n}\n\nif (goog.LOCALE == 'fr_GQ' || goog.LOCALE == 'fr-GQ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_GQ;\n}\n\nif (goog.LOCALE == 'fr_HT' || goog.LOCALE == 'fr-HT') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_HT;\n}\n\nif (goog.LOCALE == 'fr_KM' || goog.LOCALE == 'fr-KM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_KM;\n}\n\nif (goog.LOCALE == 'fr_LU' || goog.LOCALE == 'fr-LU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_LU;\n}\n\nif (goog.LOCALE == 'fr_MA' || goog.LOCALE == 'fr-MA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_MA;\n}\n\nif (goog.LOCALE == 'fr_MC' || goog.LOCALE == 'fr-MC') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_MC;\n}\n\nif (goog.LOCALE == 'fr_MF' || goog.LOCALE == 'fr-MF') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_MF;\n}\n\nif (goog.LOCALE == 'fr_MG' || goog.LOCALE == 'fr-MG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_MG;\n}\n\nif (goog.LOCALE == 'fr_ML' || goog.LOCALE == 'fr-ML') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_ML;\n}\n\nif (goog.LOCALE == 'fr_MQ' || goog.LOCALE == 'fr-MQ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_MQ;\n}\n\nif (goog.LOCALE == 'fr_MR' || goog.LOCALE == 'fr-MR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_MR;\n}\n\nif (goog.LOCALE == 'fr_MU' || goog.LOCALE == 'fr-MU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_MU;\n}\n\nif (goog.LOCALE == 'fr_NC' || goog.LOCALE == 'fr-NC') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_NC;\n}\n\nif (goog.LOCALE == 'fr_NE' || goog.LOCALE == 'fr-NE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_NE;\n}\n\nif (goog.LOCALE == 'fr_PF' || goog.LOCALE == 'fr-PF') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_PF;\n}\n\nif (goog.LOCALE == 'fr_PM' || goog.LOCALE == 'fr-PM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_PM;\n}\n\nif (goog.LOCALE == 'fr_RE' || goog.LOCALE == 'fr-RE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_RE;\n}\n\nif (goog.LOCALE == 'fr_RW' || goog.LOCALE == 'fr-RW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_RW;\n}\n\nif (goog.LOCALE == 'fr_SC' || goog.LOCALE == 'fr-SC') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_SC;\n}\n\nif (goog.LOCALE == 'fr_SN' || goog.LOCALE == 'fr-SN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_SN;\n}\n\nif (goog.LOCALE == 'fr_SY' || goog.LOCALE == 'fr-SY') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_SY;\n}\n\nif (goog.LOCALE == 'fr_TD' || goog.LOCALE == 'fr-TD') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_TD;\n}\n\nif (goog.LOCALE == 'fr_TG' || goog.LOCALE == 'fr-TG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_TG;\n}\n\nif (goog.LOCALE == 'fr_TN' || goog.LOCALE == 'fr-TN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_TN;\n}\n\nif (goog.LOCALE == 'fr_VU' || goog.LOCALE == 'fr-VU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_VU;\n}\n\nif (goog.LOCALE == 'fr_WF' || goog.LOCALE == 'fr-WF') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_WF;\n}\n\nif (goog.LOCALE == 'fr_YT' || goog.LOCALE == 'fr-YT') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fr_YT;\n}\n\nif (goog.LOCALE == 'fur') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fur;\n}\n\nif (goog.LOCALE == 'fur_IT' || goog.LOCALE == 'fur-IT') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fur_IT;\n}\n\nif (goog.LOCALE == 'fy') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fy;\n}\n\nif (goog.LOCALE == 'fy_NL' || goog.LOCALE == 'fy-NL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_fy_NL;\n}\n\nif (goog.LOCALE == 'ga_IE' || goog.LOCALE == 'ga-IE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ga_IE;\n}\n\nif (goog.LOCALE == 'gd') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_gd;\n}\n\nif (goog.LOCALE == 'gd_GB' || goog.LOCALE == 'gd-GB') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_gd_GB;\n}\n\nif (goog.LOCALE == 'gl_ES' || goog.LOCALE == 'gl-ES') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_gl_ES;\n}\n\nif (goog.LOCALE == 'gsw_CH' || goog.LOCALE == 'gsw-CH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_gsw_CH;\n}\n\nif (goog.LOCALE == 'gsw_FR' || goog.LOCALE == 'gsw-FR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_gsw_FR;\n}\n\nif (goog.LOCALE == 'gsw_LI' || goog.LOCALE == 'gsw-LI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_gsw_LI;\n}\n\nif (goog.LOCALE == 'gu_IN' || goog.LOCALE == 'gu-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_gu_IN;\n}\n\nif (goog.LOCALE == 'guz') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_guz;\n}\n\nif (goog.LOCALE == 'guz_KE' || goog.LOCALE == 'guz-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_guz_KE;\n}\n\nif (goog.LOCALE == 'gv') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_gv;\n}\n\nif (goog.LOCALE == 'gv_IM' || goog.LOCALE == 'gv-IM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_gv_IM;\n}\n\nif (goog.LOCALE == 'ha') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ha;\n}\n\nif (goog.LOCALE == 'ha_GH' || goog.LOCALE == 'ha-GH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ha_GH;\n}\n\nif (goog.LOCALE == 'ha_NE' || goog.LOCALE == 'ha-NE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ha_NE;\n}\n\nif (goog.LOCALE == 'ha_NG' || goog.LOCALE == 'ha-NG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ha_NG;\n}\n\nif (goog.LOCALE == 'haw_US' || goog.LOCALE == 'haw-US') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_haw_US;\n}\n\nif (goog.LOCALE == 'he_IL' || goog.LOCALE == 'he-IL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_he_IL;\n}\n\nif (goog.LOCALE == 'hi_IN' || goog.LOCALE == 'hi-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_hi_IN;\n}\n\nif (goog.LOCALE == 'hr_BA' || goog.LOCALE == 'hr-BA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_hr_BA;\n}\n\nif (goog.LOCALE == 'hr_HR' || goog.LOCALE == 'hr-HR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_hr_HR;\n}\n\nif (goog.LOCALE == 'hsb') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_hsb;\n}\n\nif (goog.LOCALE == 'hsb_DE' || goog.LOCALE == 'hsb-DE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_hsb_DE;\n}\n\nif (goog.LOCALE == 'hu_HU' || goog.LOCALE == 'hu-HU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_hu_HU;\n}\n\nif (goog.LOCALE == 'hy_AM' || goog.LOCALE == 'hy-AM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_hy_AM;\n}\n\nif (goog.LOCALE == 'ia') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ia;\n}\n\nif (goog.LOCALE == 'ia_001' || goog.LOCALE == 'ia-001') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ia_001;\n}\n\nif (goog.LOCALE == 'id_ID' || goog.LOCALE == 'id-ID') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_id_ID;\n}\n\nif (goog.LOCALE == 'ig') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ig;\n}\n\nif (goog.LOCALE == 'ig_NG' || goog.LOCALE == 'ig-NG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ig_NG;\n}\n\nif (goog.LOCALE == 'ii') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ii;\n}\n\nif (goog.LOCALE == 'ii_CN' || goog.LOCALE == 'ii-CN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ii_CN;\n}\n\nif (goog.LOCALE == 'is_IS' || goog.LOCALE == 'is-IS') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_is_IS;\n}\n\nif (goog.LOCALE == 'it_CH' || goog.LOCALE == 'it-CH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_it_CH;\n}\n\nif (goog.LOCALE == 'it_IT' || goog.LOCALE == 'it-IT') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_it_IT;\n}\n\nif (goog.LOCALE == 'it_SM' || goog.LOCALE == 'it-SM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_it_SM;\n}\n\nif (goog.LOCALE == 'it_VA' || goog.LOCALE == 'it-VA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_it_VA;\n}\n\nif (goog.LOCALE == 'ja_JP' || goog.LOCALE == 'ja-JP') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ja_JP;\n}\n\nif (goog.LOCALE == 'jgo') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_jgo;\n}\n\nif (goog.LOCALE == 'jgo_CM' || goog.LOCALE == 'jgo-CM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_jgo_CM;\n}\n\nif (goog.LOCALE == 'jmc') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_jmc;\n}\n\nif (goog.LOCALE == 'jmc_TZ' || goog.LOCALE == 'jmc-TZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_jmc_TZ;\n}\n\nif (goog.LOCALE == 'jv') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_jv;\n}\n\nif (goog.LOCALE == 'jv_ID' || goog.LOCALE == 'jv-ID') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_jv_ID;\n}\n\nif (goog.LOCALE == 'ka_GE' || goog.LOCALE == 'ka-GE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ka_GE;\n}\n\nif (goog.LOCALE == 'kab') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kab;\n}\n\nif (goog.LOCALE == 'kab_DZ' || goog.LOCALE == 'kab-DZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kab_DZ;\n}\n\nif (goog.LOCALE == 'kam') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kam;\n}\n\nif (goog.LOCALE == 'kam_KE' || goog.LOCALE == 'kam-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kam_KE;\n}\n\nif (goog.LOCALE == 'kde') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kde;\n}\n\nif (goog.LOCALE == 'kde_TZ' || goog.LOCALE == 'kde-TZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kde_TZ;\n}\n\nif (goog.LOCALE == 'kea') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kea;\n}\n\nif (goog.LOCALE == 'kea_CV' || goog.LOCALE == 'kea-CV') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kea_CV;\n}\n\nif (goog.LOCALE == 'khq') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_khq;\n}\n\nif (goog.LOCALE == 'khq_ML' || goog.LOCALE == 'khq-ML') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_khq_ML;\n}\n\nif (goog.LOCALE == 'ki') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ki;\n}\n\nif (goog.LOCALE == 'ki_KE' || goog.LOCALE == 'ki-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ki_KE;\n}\n\nif (goog.LOCALE == 'kk_KZ' || goog.LOCALE == 'kk-KZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kk_KZ;\n}\n\nif (goog.LOCALE == 'kkj') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kkj;\n}\n\nif (goog.LOCALE == 'kkj_CM' || goog.LOCALE == 'kkj-CM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kkj_CM;\n}\n\nif (goog.LOCALE == 'kl') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kl;\n}\n\nif (goog.LOCALE == 'kl_GL' || goog.LOCALE == 'kl-GL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kl_GL;\n}\n\nif (goog.LOCALE == 'kln') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kln;\n}\n\nif (goog.LOCALE == 'kln_KE' || goog.LOCALE == 'kln-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kln_KE;\n}\n\nif (goog.LOCALE == 'km_KH' || goog.LOCALE == 'km-KH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_km_KH;\n}\n\nif (goog.LOCALE == 'kn_IN' || goog.LOCALE == 'kn-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kn_IN;\n}\n\nif (goog.LOCALE == 'ko_KP' || goog.LOCALE == 'ko-KP') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ko_KP;\n}\n\nif (goog.LOCALE == 'ko_KR' || goog.LOCALE == 'ko-KR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ko_KR;\n}\n\nif (goog.LOCALE == 'kok') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kok;\n}\n\nif (goog.LOCALE == 'kok_IN' || goog.LOCALE == 'kok-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kok_IN;\n}\n\nif (goog.LOCALE == 'ks') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ks;\n}\n\nif (goog.LOCALE == 'ks_IN' || goog.LOCALE == 'ks-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ks_IN;\n}\n\nif (goog.LOCALE == 'ksb') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ksb;\n}\n\nif (goog.LOCALE == 'ksb_TZ' || goog.LOCALE == 'ksb-TZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ksb_TZ;\n}\n\nif (goog.LOCALE == 'ksf') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ksf;\n}\n\nif (goog.LOCALE == 'ksf_CM' || goog.LOCALE == 'ksf-CM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ksf_CM;\n}\n\nif (goog.LOCALE == 'ksh') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ksh;\n}\n\nif (goog.LOCALE == 'ksh_DE' || goog.LOCALE == 'ksh-DE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ksh_DE;\n}\n\nif (goog.LOCALE == 'ku') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ku;\n}\n\nif (goog.LOCALE == 'ku_TR' || goog.LOCALE == 'ku-TR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ku_TR;\n}\n\nif (goog.LOCALE == 'kw') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kw;\n}\n\nif (goog.LOCALE == 'kw_GB' || goog.LOCALE == 'kw-GB') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_kw_GB;\n}\n\nif (goog.LOCALE == 'ky_KG' || goog.LOCALE == 'ky-KG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ky_KG;\n}\n\nif (goog.LOCALE == 'lag') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lag;\n}\n\nif (goog.LOCALE == 'lag_TZ' || goog.LOCALE == 'lag-TZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lag_TZ;\n}\n\nif (goog.LOCALE == 'lb') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lb;\n}\n\nif (goog.LOCALE == 'lb_LU' || goog.LOCALE == 'lb-LU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lb_LU;\n}\n\nif (goog.LOCALE == 'lg') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lg;\n}\n\nif (goog.LOCALE == 'lg_UG' || goog.LOCALE == 'lg-UG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lg_UG;\n}\n\nif (goog.LOCALE == 'lkt') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lkt;\n}\n\nif (goog.LOCALE == 'lkt_US' || goog.LOCALE == 'lkt-US') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lkt_US;\n}\n\nif (goog.LOCALE == 'ln_AO' || goog.LOCALE == 'ln-AO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ln_AO;\n}\n\nif (goog.LOCALE == 'ln_CD' || goog.LOCALE == 'ln-CD') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ln_CD;\n}\n\nif (goog.LOCALE == 'ln_CF' || goog.LOCALE == 'ln-CF') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ln_CF;\n}\n\nif (goog.LOCALE == 'ln_CG' || goog.LOCALE == 'ln-CG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ln_CG;\n}\n\nif (goog.LOCALE == 'lo_LA' || goog.LOCALE == 'lo-LA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lo_LA;\n}\n\nif (goog.LOCALE == 'lrc') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lrc;\n}\n\nif (goog.LOCALE == 'lrc_IQ' || goog.LOCALE == 'lrc-IQ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lrc_IQ;\n}\n\nif (goog.LOCALE == 'lrc_IR' || goog.LOCALE == 'lrc-IR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lrc_IR;\n}\n\nif (goog.LOCALE == 'lt_LT' || goog.LOCALE == 'lt-LT') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lt_LT;\n}\n\nif (goog.LOCALE == 'lu') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lu;\n}\n\nif (goog.LOCALE == 'lu_CD' || goog.LOCALE == 'lu-CD') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lu_CD;\n}\n\nif (goog.LOCALE == 'luo') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_luo;\n}\n\nif (goog.LOCALE == 'luo_KE' || goog.LOCALE == 'luo-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_luo_KE;\n}\n\nif (goog.LOCALE == 'luy') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_luy;\n}\n\nif (goog.LOCALE == 'luy_KE' || goog.LOCALE == 'luy-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_luy_KE;\n}\n\nif (goog.LOCALE == 'lv_LV' || goog.LOCALE == 'lv-LV') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_lv_LV;\n}\n\nif (goog.LOCALE == 'mas') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mas;\n}\n\nif (goog.LOCALE == 'mas_KE' || goog.LOCALE == 'mas-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mas_KE;\n}\n\nif (goog.LOCALE == 'mas_TZ' || goog.LOCALE == 'mas-TZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mas_TZ;\n}\n\nif (goog.LOCALE == 'mer') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mer;\n}\n\nif (goog.LOCALE == 'mer_KE' || goog.LOCALE == 'mer-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mer_KE;\n}\n\nif (goog.LOCALE == 'mfe') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mfe;\n}\n\nif (goog.LOCALE == 'mfe_MU' || goog.LOCALE == 'mfe-MU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mfe_MU;\n}\n\nif (goog.LOCALE == 'mg') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mg;\n}\n\nif (goog.LOCALE == 'mg_MG' || goog.LOCALE == 'mg-MG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mg_MG;\n}\n\nif (goog.LOCALE == 'mgh') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mgh;\n}\n\nif (goog.LOCALE == 'mgh_MZ' || goog.LOCALE == 'mgh-MZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mgh_MZ;\n}\n\nif (goog.LOCALE == 'mgo') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mgo;\n}\n\nif (goog.LOCALE == 'mgo_CM' || goog.LOCALE == 'mgo-CM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mgo_CM;\n}\n\nif (goog.LOCALE == 'mi') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mi;\n}\n\nif (goog.LOCALE == 'mi_NZ' || goog.LOCALE == 'mi-NZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mi_NZ;\n}\n\nif (goog.LOCALE == 'mk_MK' || goog.LOCALE == 'mk-MK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mk_MK;\n}\n\nif (goog.LOCALE == 'ml_IN' || goog.LOCALE == 'ml-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ml_IN;\n}\n\nif (goog.LOCALE == 'mn_MN' || goog.LOCALE == 'mn-MN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mn_MN;\n}\n\nif (goog.LOCALE == 'mr_IN' || goog.LOCALE == 'mr-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mr_IN;\n}\n\nif (goog.LOCALE == 'ms_BN' || goog.LOCALE == 'ms-BN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ms_BN;\n}\n\nif (goog.LOCALE == 'ms_MY' || goog.LOCALE == 'ms-MY') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ms_MY;\n}\n\nif (goog.LOCALE == 'ms_SG' || goog.LOCALE == 'ms-SG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ms_SG;\n}\n\nif (goog.LOCALE == 'mt_MT' || goog.LOCALE == 'mt-MT') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mt_MT;\n}\n\nif (goog.LOCALE == 'mua') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mua;\n}\n\nif (goog.LOCALE == 'mua_CM' || goog.LOCALE == 'mua-CM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mua_CM;\n}\n\nif (goog.LOCALE == 'my_MM' || goog.LOCALE == 'my-MM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_my_MM;\n}\n\nif (goog.LOCALE == 'mzn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mzn;\n}\n\nif (goog.LOCALE == 'mzn_IR' || goog.LOCALE == 'mzn-IR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_mzn_IR;\n}\n\nif (goog.LOCALE == 'naq') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_naq;\n}\n\nif (goog.LOCALE == 'naq_NA' || goog.LOCALE == 'naq-NA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_naq_NA;\n}\n\nif (goog.LOCALE == 'nb_NO' || goog.LOCALE == 'nb-NO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nb_NO;\n}\n\nif (goog.LOCALE == 'nb_SJ' || goog.LOCALE == 'nb-SJ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nb_SJ;\n}\n\nif (goog.LOCALE == 'nd') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nd;\n}\n\nif (goog.LOCALE == 'nd_ZW' || goog.LOCALE == 'nd-ZW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nd_ZW;\n}\n\nif (goog.LOCALE == 'nds') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nds;\n}\n\nif (goog.LOCALE == 'nds_DE' || goog.LOCALE == 'nds-DE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nds_DE;\n}\n\nif (goog.LOCALE == 'nds_NL' || goog.LOCALE == 'nds-NL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nds_NL;\n}\n\nif (goog.LOCALE == 'ne_IN' || goog.LOCALE == 'ne-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ne_IN;\n}\n\nif (goog.LOCALE == 'ne_NP' || goog.LOCALE == 'ne-NP') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ne_NP;\n}\n\nif (goog.LOCALE == 'nl_AW' || goog.LOCALE == 'nl-AW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nl_AW;\n}\n\nif (goog.LOCALE == 'nl_BE' || goog.LOCALE == 'nl-BE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nl_BE;\n}\n\nif (goog.LOCALE == 'nl_BQ' || goog.LOCALE == 'nl-BQ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nl_BQ;\n}\n\nif (goog.LOCALE == 'nl_CW' || goog.LOCALE == 'nl-CW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nl_CW;\n}\n\nif (goog.LOCALE == 'nl_NL' || goog.LOCALE == 'nl-NL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nl_NL;\n}\n\nif (goog.LOCALE == 'nl_SR' || goog.LOCALE == 'nl-SR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nl_SR;\n}\n\nif (goog.LOCALE == 'nl_SX' || goog.LOCALE == 'nl-SX') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nl_SX;\n}\n\nif (goog.LOCALE == 'nmg') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nmg;\n}\n\nif (goog.LOCALE == 'nmg_CM' || goog.LOCALE == 'nmg-CM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nmg_CM;\n}\n\nif (goog.LOCALE == 'nn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nn;\n}\n\nif (goog.LOCALE == 'nn_NO' || goog.LOCALE == 'nn-NO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nn_NO;\n}\n\nif (goog.LOCALE == 'nnh') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nnh;\n}\n\nif (goog.LOCALE == 'nnh_CM' || goog.LOCALE == 'nnh-CM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nnh_CM;\n}\n\nif (goog.LOCALE == 'nus') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nus;\n}\n\nif (goog.LOCALE == 'nus_SS' || goog.LOCALE == 'nus-SS') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nus_SS;\n}\n\nif (goog.LOCALE == 'nyn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nyn;\n}\n\nif (goog.LOCALE == 'nyn_UG' || goog.LOCALE == 'nyn-UG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_nyn_UG;\n}\n\nif (goog.LOCALE == 'om') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_om;\n}\n\nif (goog.LOCALE == 'om_ET' || goog.LOCALE == 'om-ET') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_om_ET;\n}\n\nif (goog.LOCALE == 'om_KE' || goog.LOCALE == 'om-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_om_KE;\n}\n\nif (goog.LOCALE == 'or_IN' || goog.LOCALE == 'or-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_or_IN;\n}\n\nif (goog.LOCALE == 'os') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_os;\n}\n\nif (goog.LOCALE == 'os_GE' || goog.LOCALE == 'os-GE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_os_GE;\n}\n\nif (goog.LOCALE == 'os_RU' || goog.LOCALE == 'os-RU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_os_RU;\n}\n\nif (goog.LOCALE == 'pa_Arab' || goog.LOCALE == 'pa-Arab') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pa_Arab;\n}\n\nif (goog.LOCALE == 'pa_Arab_PK' || goog.LOCALE == 'pa-Arab-PK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pa_Arab_PK;\n}\n\nif (goog.LOCALE == 'pa_Guru' || goog.LOCALE == 'pa-Guru') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pa_Guru;\n}\n\nif (goog.LOCALE == 'pa_Guru_IN' || goog.LOCALE == 'pa-Guru-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pa_Guru_IN;\n}\n\nif (goog.LOCALE == 'pl_PL' || goog.LOCALE == 'pl-PL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pl_PL;\n}\n\nif (goog.LOCALE == 'ps') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ps;\n}\n\nif (goog.LOCALE == 'ps_AF' || goog.LOCALE == 'ps-AF') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ps_AF;\n}\n\nif (goog.LOCALE == 'ps_PK' || goog.LOCALE == 'ps-PK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ps_PK;\n}\n\nif (goog.LOCALE == 'pt_AO' || goog.LOCALE == 'pt-AO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pt_AO;\n}\n\nif (goog.LOCALE == 'pt_CH' || goog.LOCALE == 'pt-CH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pt_CH;\n}\n\nif (goog.LOCALE == 'pt_CV' || goog.LOCALE == 'pt-CV') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pt_CV;\n}\n\nif (goog.LOCALE == 'pt_GQ' || goog.LOCALE == 'pt-GQ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pt_GQ;\n}\n\nif (goog.LOCALE == 'pt_GW' || goog.LOCALE == 'pt-GW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pt_GW;\n}\n\nif (goog.LOCALE == 'pt_LU' || goog.LOCALE == 'pt-LU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pt_LU;\n}\n\nif (goog.LOCALE == 'pt_MO' || goog.LOCALE == 'pt-MO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pt_MO;\n}\n\nif (goog.LOCALE == 'pt_MZ' || goog.LOCALE == 'pt-MZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pt_MZ;\n}\n\nif (goog.LOCALE == 'pt_ST' || goog.LOCALE == 'pt-ST') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pt_ST;\n}\n\nif (goog.LOCALE == 'pt_TL' || goog.LOCALE == 'pt-TL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_pt_TL;\n}\n\nif (goog.LOCALE == 'qu') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_qu;\n}\n\nif (goog.LOCALE == 'qu_BO' || goog.LOCALE == 'qu-BO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_qu_BO;\n}\n\nif (goog.LOCALE == 'qu_EC' || goog.LOCALE == 'qu-EC') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_qu_EC;\n}\n\nif (goog.LOCALE == 'qu_PE' || goog.LOCALE == 'qu-PE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_qu_PE;\n}\n\nif (goog.LOCALE == 'rm') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_rm;\n}\n\nif (goog.LOCALE == 'rm_CH' || goog.LOCALE == 'rm-CH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_rm_CH;\n}\n\nif (goog.LOCALE == 'rn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_rn;\n}\n\nif (goog.LOCALE == 'rn_BI' || goog.LOCALE == 'rn-BI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_rn_BI;\n}\n\nif (goog.LOCALE == 'ro_MD' || goog.LOCALE == 'ro-MD') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ro_MD;\n}\n\nif (goog.LOCALE == 'ro_RO' || goog.LOCALE == 'ro-RO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ro_RO;\n}\n\nif (goog.LOCALE == 'rof') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_rof;\n}\n\nif (goog.LOCALE == 'rof_TZ' || goog.LOCALE == 'rof-TZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_rof_TZ;\n}\n\nif (goog.LOCALE == 'ru_BY' || goog.LOCALE == 'ru-BY') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ru_BY;\n}\n\nif (goog.LOCALE == 'ru_KG' || goog.LOCALE == 'ru-KG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ru_KG;\n}\n\nif (goog.LOCALE == 'ru_KZ' || goog.LOCALE == 'ru-KZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ru_KZ;\n}\n\nif (goog.LOCALE == 'ru_MD' || goog.LOCALE == 'ru-MD') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ru_MD;\n}\n\nif (goog.LOCALE == 'ru_RU' || goog.LOCALE == 'ru-RU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ru_RU;\n}\n\nif (goog.LOCALE == 'ru_UA' || goog.LOCALE == 'ru-UA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ru_UA;\n}\n\nif (goog.LOCALE == 'rw') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_rw;\n}\n\nif (goog.LOCALE == 'rw_RW' || goog.LOCALE == 'rw-RW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_rw_RW;\n}\n\nif (goog.LOCALE == 'rwk') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_rwk;\n}\n\nif (goog.LOCALE == 'rwk_TZ' || goog.LOCALE == 'rwk-TZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_rwk_TZ;\n}\n\nif (goog.LOCALE == 'sah') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sah;\n}\n\nif (goog.LOCALE == 'sah_RU' || goog.LOCALE == 'sah-RU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sah_RU;\n}\n\nif (goog.LOCALE == 'saq') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_saq;\n}\n\nif (goog.LOCALE == 'saq_KE' || goog.LOCALE == 'saq-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_saq_KE;\n}\n\nif (goog.LOCALE == 'sbp') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sbp;\n}\n\nif (goog.LOCALE == 'sbp_TZ' || goog.LOCALE == 'sbp-TZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sbp_TZ;\n}\n\nif (goog.LOCALE == 'sd') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sd;\n}\n\nif (goog.LOCALE == 'sd_PK' || goog.LOCALE == 'sd-PK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sd_PK;\n}\n\nif (goog.LOCALE == 'se') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_se;\n}\n\nif (goog.LOCALE == 'se_FI' || goog.LOCALE == 'se-FI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_se_FI;\n}\n\nif (goog.LOCALE == 'se_NO' || goog.LOCALE == 'se-NO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_se_NO;\n}\n\nif (goog.LOCALE == 'se_SE' || goog.LOCALE == 'se-SE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_se_SE;\n}\n\nif (goog.LOCALE == 'seh') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_seh;\n}\n\nif (goog.LOCALE == 'seh_MZ' || goog.LOCALE == 'seh-MZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_seh_MZ;\n}\n\nif (goog.LOCALE == 'ses') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ses;\n}\n\nif (goog.LOCALE == 'ses_ML' || goog.LOCALE == 'ses-ML') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ses_ML;\n}\n\nif (goog.LOCALE == 'sg') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sg;\n}\n\nif (goog.LOCALE == 'sg_CF' || goog.LOCALE == 'sg-CF') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sg_CF;\n}\n\nif (goog.LOCALE == 'shi') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_shi;\n}\n\nif (goog.LOCALE == 'shi_Latn' || goog.LOCALE == 'shi-Latn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_shi_Latn;\n}\n\nif (goog.LOCALE == 'shi_Latn_MA' || goog.LOCALE == 'shi-Latn-MA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_shi_Latn_MA;\n}\n\nif (goog.LOCALE == 'shi_Tfng' || goog.LOCALE == 'shi-Tfng') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_shi_Tfng;\n}\n\nif (goog.LOCALE == 'shi_Tfng_MA' || goog.LOCALE == 'shi-Tfng-MA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_shi_Tfng_MA;\n}\n\nif (goog.LOCALE == 'si_LK' || goog.LOCALE == 'si-LK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_si_LK;\n}\n\nif (goog.LOCALE == 'sk_SK' || goog.LOCALE == 'sk-SK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sk_SK;\n}\n\nif (goog.LOCALE == 'sl_SI' || goog.LOCALE == 'sl-SI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sl_SI;\n}\n\nif (goog.LOCALE == 'smn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_smn;\n}\n\nif (goog.LOCALE == 'smn_FI' || goog.LOCALE == 'smn-FI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_smn_FI;\n}\n\nif (goog.LOCALE == 'sn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sn;\n}\n\nif (goog.LOCALE == 'sn_ZW' || goog.LOCALE == 'sn-ZW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sn_ZW;\n}\n\nif (goog.LOCALE == 'so') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_so;\n}\n\nif (goog.LOCALE == 'so_DJ' || goog.LOCALE == 'so-DJ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_so_DJ;\n}\n\nif (goog.LOCALE == 'so_ET' || goog.LOCALE == 'so-ET') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_so_ET;\n}\n\nif (goog.LOCALE == 'so_KE' || goog.LOCALE == 'so-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_so_KE;\n}\n\nif (goog.LOCALE == 'so_SO' || goog.LOCALE == 'so-SO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_so_SO;\n}\n\nif (goog.LOCALE == 'sq_AL' || goog.LOCALE == 'sq-AL') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sq_AL;\n}\n\nif (goog.LOCALE == 'sq_MK' || goog.LOCALE == 'sq-MK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sq_MK;\n}\n\nif (goog.LOCALE == 'sq_XK' || goog.LOCALE == 'sq-XK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sq_XK;\n}\n\nif (goog.LOCALE == 'sr_Cyrl' || goog.LOCALE == 'sr-Cyrl') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sr_Cyrl;\n}\n\nif (goog.LOCALE == 'sr_Cyrl_BA' || goog.LOCALE == 'sr-Cyrl-BA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sr_Cyrl_BA;\n}\n\nif (goog.LOCALE == 'sr_Cyrl_ME' || goog.LOCALE == 'sr-Cyrl-ME') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sr_Cyrl_ME;\n}\n\nif (goog.LOCALE == 'sr_Cyrl_RS' || goog.LOCALE == 'sr-Cyrl-RS') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sr_Cyrl_RS;\n}\n\nif (goog.LOCALE == 'sr_Cyrl_XK' || goog.LOCALE == 'sr-Cyrl-XK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sr_Cyrl_XK;\n}\n\nif (goog.LOCALE == 'sr_Latn_BA' || goog.LOCALE == 'sr-Latn-BA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sr_Latn_BA;\n}\n\nif (goog.LOCALE == 'sr_Latn_ME' || goog.LOCALE == 'sr-Latn-ME') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sr_Latn_ME;\n}\n\nif (goog.LOCALE == 'sr_Latn_RS' || goog.LOCALE == 'sr-Latn-RS') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sr_Latn_RS;\n}\n\nif (goog.LOCALE == 'sr_Latn_XK' || goog.LOCALE == 'sr-Latn-XK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sr_Latn_XK;\n}\n\nif (goog.LOCALE == 'sv_AX' || goog.LOCALE == 'sv-AX') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sv_AX;\n}\n\nif (goog.LOCALE == 'sv_FI' || goog.LOCALE == 'sv-FI') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sv_FI;\n}\n\nif (goog.LOCALE == 'sv_SE' || goog.LOCALE == 'sv-SE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sv_SE;\n}\n\nif (goog.LOCALE == 'sw_CD' || goog.LOCALE == 'sw-CD') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sw_CD;\n}\n\nif (goog.LOCALE == 'sw_KE' || goog.LOCALE == 'sw-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sw_KE;\n}\n\nif (goog.LOCALE == 'sw_TZ' || goog.LOCALE == 'sw-TZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sw_TZ;\n}\n\nif (goog.LOCALE == 'sw_UG' || goog.LOCALE == 'sw-UG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_sw_UG;\n}\n\nif (goog.LOCALE == 'ta_IN' || goog.LOCALE == 'ta-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ta_IN;\n}\n\nif (goog.LOCALE == 'ta_LK' || goog.LOCALE == 'ta-LK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ta_LK;\n}\n\nif (goog.LOCALE == 'ta_MY' || goog.LOCALE == 'ta-MY') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ta_MY;\n}\n\nif (goog.LOCALE == 'ta_SG' || goog.LOCALE == 'ta-SG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ta_SG;\n}\n\nif (goog.LOCALE == 'te_IN' || goog.LOCALE == 'te-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_te_IN;\n}\n\nif (goog.LOCALE == 'teo') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_teo;\n}\n\nif (goog.LOCALE == 'teo_KE' || goog.LOCALE == 'teo-KE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_teo_KE;\n}\n\nif (goog.LOCALE == 'teo_UG' || goog.LOCALE == 'teo-UG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_teo_UG;\n}\n\nif (goog.LOCALE == 'tg') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_tg;\n}\n\nif (goog.LOCALE == 'tg_TJ' || goog.LOCALE == 'tg-TJ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_tg_TJ;\n}\n\nif (goog.LOCALE == 'th_TH' || goog.LOCALE == 'th-TH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_th_TH;\n}\n\nif (goog.LOCALE == 'ti') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ti;\n}\n\nif (goog.LOCALE == 'ti_ER' || goog.LOCALE == 'ti-ER') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ti_ER;\n}\n\nif (goog.LOCALE == 'ti_ET' || goog.LOCALE == 'ti-ET') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ti_ET;\n}\n\nif (goog.LOCALE == 'tk') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_tk;\n}\n\nif (goog.LOCALE == 'tk_TM' || goog.LOCALE == 'tk-TM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_tk_TM;\n}\n\nif (goog.LOCALE == 'to') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_to;\n}\n\nif (goog.LOCALE == 'to_TO' || goog.LOCALE == 'to-TO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_to_TO;\n}\n\nif (goog.LOCALE == 'tr_CY' || goog.LOCALE == 'tr-CY') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_tr_CY;\n}\n\nif (goog.LOCALE == 'tr_TR' || goog.LOCALE == 'tr-TR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_tr_TR;\n}\n\nif (goog.LOCALE == 'tt') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_tt;\n}\n\nif (goog.LOCALE == 'tt_RU' || goog.LOCALE == 'tt-RU') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_tt_RU;\n}\n\nif (goog.LOCALE == 'twq') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_twq;\n}\n\nif (goog.LOCALE == 'twq_NE' || goog.LOCALE == 'twq-NE') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_twq_NE;\n}\n\nif (goog.LOCALE == 'tzm') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_tzm;\n}\n\nif (goog.LOCALE == 'tzm_MA' || goog.LOCALE == 'tzm-MA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_tzm_MA;\n}\n\nif (goog.LOCALE == 'ug') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ug;\n}\n\nif (goog.LOCALE == 'ug_CN' || goog.LOCALE == 'ug-CN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ug_CN;\n}\n\nif (goog.LOCALE == 'uk_UA' || goog.LOCALE == 'uk-UA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_uk_UA;\n}\n\nif (goog.LOCALE == 'ur_IN' || goog.LOCALE == 'ur-IN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ur_IN;\n}\n\nif (goog.LOCALE == 'ur_PK' || goog.LOCALE == 'ur-PK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_ur_PK;\n}\n\nif (goog.LOCALE == 'uz_Arab' || goog.LOCALE == 'uz-Arab') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_uz_Arab;\n}\n\nif (goog.LOCALE == 'uz_Arab_AF' || goog.LOCALE == 'uz-Arab-AF') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_uz_Arab_AF;\n}\n\nif (goog.LOCALE == 'uz_Cyrl' || goog.LOCALE == 'uz-Cyrl') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_uz_Cyrl;\n}\n\nif (goog.LOCALE == 'uz_Cyrl_UZ' || goog.LOCALE == 'uz-Cyrl-UZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_uz_Cyrl_UZ;\n}\n\nif (goog.LOCALE == 'uz_Latn' || goog.LOCALE == 'uz-Latn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_uz_Latn;\n}\n\nif (goog.LOCALE == 'uz_Latn_UZ' || goog.LOCALE == 'uz-Latn-UZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_uz_Latn_UZ;\n}\n\nif (goog.LOCALE == 'vai') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_vai;\n}\n\nif (goog.LOCALE == 'vai_Latn' || goog.LOCALE == 'vai-Latn') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_vai_Latn;\n}\n\nif (goog.LOCALE == 'vai_Latn_LR' || goog.LOCALE == 'vai-Latn-LR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_vai_Latn_LR;\n}\n\nif (goog.LOCALE == 'vai_Vaii' || goog.LOCALE == 'vai-Vaii') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_vai_Vaii;\n}\n\nif (goog.LOCALE == 'vai_Vaii_LR' || goog.LOCALE == 'vai-Vaii-LR') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_vai_Vaii_LR;\n}\n\nif (goog.LOCALE == 'vi_VN' || goog.LOCALE == 'vi-VN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_vi_VN;\n}\n\nif (goog.LOCALE == 'vun') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_vun;\n}\n\nif (goog.LOCALE == 'vun_TZ' || goog.LOCALE == 'vun-TZ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_vun_TZ;\n}\n\nif (goog.LOCALE == 'wae') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_wae;\n}\n\nif (goog.LOCALE == 'wae_CH' || goog.LOCALE == 'wae-CH') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_wae_CH;\n}\n\nif (goog.LOCALE == 'wo') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_wo;\n}\n\nif (goog.LOCALE == 'wo_SN' || goog.LOCALE == 'wo-SN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_wo_SN;\n}\n\nif (goog.LOCALE == 'xh') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_xh;\n}\n\nif (goog.LOCALE == 'xh_ZA' || goog.LOCALE == 'xh-ZA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_xh_ZA;\n}\n\nif (goog.LOCALE == 'xog') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_xog;\n}\n\nif (goog.LOCALE == 'xog_UG' || goog.LOCALE == 'xog-UG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_xog_UG;\n}\n\nif (goog.LOCALE == 'yav') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_yav;\n}\n\nif (goog.LOCALE == 'yav_CM' || goog.LOCALE == 'yav-CM') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_yav_CM;\n}\n\nif (goog.LOCALE == 'yi') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_yi;\n}\n\nif (goog.LOCALE == 'yi_001' || goog.LOCALE == 'yi-001') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_yi_001;\n}\n\nif (goog.LOCALE == 'yo') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_yo;\n}\n\nif (goog.LOCALE == 'yo_BJ' || goog.LOCALE == 'yo-BJ') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_yo_BJ;\n}\n\nif (goog.LOCALE == 'yo_NG' || goog.LOCALE == 'yo-NG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_yo_NG;\n}\n\nif (goog.LOCALE == 'yue') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_yue;\n}\n\nif (goog.LOCALE == 'yue_Hans' || goog.LOCALE == 'yue-Hans') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_yue_Hans;\n}\n\nif (goog.LOCALE == 'yue_Hans_CN' || goog.LOCALE == 'yue-Hans-CN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_yue_Hans_CN;\n}\n\nif (goog.LOCALE == 'yue_Hant' || goog.LOCALE == 'yue-Hant') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_yue_Hant;\n}\n\nif (goog.LOCALE == 'yue_Hant_HK' || goog.LOCALE == 'yue-Hant-HK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_yue_Hant_HK;\n}\n\nif (goog.LOCALE == 'zgh') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zgh;\n}\n\nif (goog.LOCALE == 'zgh_MA' || goog.LOCALE == 'zgh-MA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zgh_MA;\n}\n\nif (goog.LOCALE == 'zh_Hans' || goog.LOCALE == 'zh-Hans') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zh_Hans;\n}\n\nif (goog.LOCALE == 'zh_Hans_CN' || goog.LOCALE == 'zh-Hans-CN') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zh_Hans_CN;\n}\n\nif (goog.LOCALE == 'zh_Hans_HK' || goog.LOCALE == 'zh-Hans-HK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zh_Hans_HK;\n}\n\nif (goog.LOCALE == 'zh_Hans_MO' || goog.LOCALE == 'zh-Hans-MO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zh_Hans_MO;\n}\n\nif (goog.LOCALE == 'zh_Hans_SG' || goog.LOCALE == 'zh-Hans-SG') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zh_Hans_SG;\n}\n\nif (goog.LOCALE == 'zh_Hant' || goog.LOCALE == 'zh-Hant') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zh_Hant;\n}\n\nif (goog.LOCALE == 'zh_Hant_HK' || goog.LOCALE == 'zh-Hant-HK') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zh_Hant_HK;\n}\n\nif (goog.LOCALE == 'zh_Hant_MO' || goog.LOCALE == 'zh-Hant-MO') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zh_Hant_MO;\n}\n\nif (goog.LOCALE == 'zh_Hant_TW' || goog.LOCALE == 'zh-Hant-TW') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zh_Hant_TW;\n}\n\nif (goog.LOCALE == 'zu_ZA' || goog.LOCALE == 'zu-ZA') {\n  goog.labs.i18n.ListFormatSymbols = goog.labs.i18n.ListFormatSymbols_zu_ZA;\n}\n\n","^?",1579837703000,"^@",["^A",["^3","~$goog.labs.i18n.ListFormatSymbols"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/i18n/listsymbolsext.js"],"^S",["^A",["~$goog.labs.i18n.ListFormatSymbols-fr-CM","~$goog.labs.i18n.ListFormatSymbols_en_BW","~$goog.labs.i18n.ListFormatSymbols-en-AS","~$goog.labs.i18n.ListFormatSymbols_fur","~$goog.labs.i18n.ListFormatSymbols_luo_KE","~$goog.labs.i18n.ListFormatSymbols-eo","~$goog.labs.i18n.ListFormatSymbols-en-IO","~$goog.labs.i18n.ListFormatSymbols_he_IL","~$goog.labs.i18n.ListFormatSymbols_es_AR","~$goog.labs.i18n.ListFormatSymbols-zgh-MA","~$goog.labs.i18n.ListFormatSymbols-bas-CM","~$goog.labs.i18n.ListFormatSymbols-en-SB","~$goog.labs.i18n.ListFormatSymbols-guz-KE","~$goog.labs.i18n.ListFormatSymbols-eo-001","~$goog.labs.i18n.ListFormatSymbols_so_SO","~$goog.labs.i18n.ListFormatSymbols-ar-SA","~$goog.labs.i18n.ListFormatSymbols-yo-BJ","~$goog.labs.i18n.ListFormatSymbols_en_HK","~$goog.labs.i18n.ListFormatSymbols_mua","~$goog.labs.i18n.ListFormatSymbols_sbp_TZ","~$goog.labs.i18n.ListFormatSymbols_pl_PL","~$goog.labs.i18n.ListFormatSymbols-fr-BI","~$goog.labs.i18n.ListFormatSymbols_ar_KW","~$goog.labs.i18n.ListFormatSymbols-fr-SC","~$goog.labs.i18n.ListFormatSymbols_ln_AO","~$goog.labs.i18n.ListFormatSymbols-ha-GH","~$goog.labs.i18n.ListFormatSymbols-en-NZ","~$goog.labs.i18n.ListFormatSymbols_qu_EC","~$goog.labs.i18n.ListFormatSymbols-mas","~$goog.labs.i18n.ListFormatSymbols-ar-SD","~$goog.labs.i18n.ListFormatSymbols-en-GD","~$goog.labs.i18n.ListFormatSymbols_wo_SN","~$goog.labs.i18n.ListFormatSymbols_ku_TR","~$goog.labs.i18n.ListFormatSymbols-jgo","~$goog.labs.i18n.ListFormatSymbols-et-EE","~$goog.labs.i18n.ListFormatSymbols_jv_ID","~$goog.labs.i18n.ListFormatSymbols_tt_RU","~$goog.labs.i18n.ListFormatSymbols-kw","~$goog.labs.i18n.ListFormatSymbols_ccp","~$goog.labs.i18n.ListFormatSymbols-pt-MZ","~$goog.labs.i18n.ListFormatSymbols_jmc_TZ","~$goog.labs.i18n.ListFormatSymbols-en-UG","~$goog.labs.i18n.ListFormatSymbols_xog_UG","~$goog.labs.i18n.ListFormatSymbols_ta_IN","~$goog.labs.i18n.ListFormatSymbols-ckb-IR","~$goog.labs.i18n.ListFormatSymbols-ee","~$goog.labs.i18n.ListFormatSymbols-nl-BQ","~$goog.labs.i18n.ListFormatSymbols_rof","~$goog.labs.i18n.ListFormatSymbols-twq","~$goog.labs.i18n.ListFormatSymbols-qu-BO","~$goog.labs.i18n.ListFormatSymbols-dsb","~$goog.labs.i18n.ListFormatSymbols-fr-GN","~$goog.labs.i18n.ListFormatSymbols-es-SV","~$goog.labs.i18n.ListFormatSymbols-fr-NC","~$goog.labs.i18n.ListFormatSymbols-gl-ES","~$goog.labs.i18n.ListFormatSymbols_zh_Hant_MO","~$goog.labs.i18n.ListFormatSymbols_pt_CV","~$goog.labs.i18n.ListFormatSymbols_uz_Arab_AF","~$goog.labs.i18n.ListFormatSymbols_kk_KZ","~$goog.labs.i18n.ListFormatSymbols-af-ZA","~$goog.labs.i18n.ListFormatSymbols_en_PK","~$goog.labs.i18n.ListFormatSymbols_fr_ML","~$goog.labs.i18n.ListFormatSymbols_mi","~$goog.labs.i18n.ListFormatSymbols-as","~$goog.labs.i18n.ListFormatSymbols-lkt-US","~$goog.labs.i18n.ListFormatSymbols_ne_IN","~$goog.labs.i18n.ListFormatSymbols_en_ZM","~$goog.labs.i18n.ListFormatSymbols-ff-Latn-CM","~$goog.labs.i18n.ListFormatSymbols_wo","~$goog.labs.i18n.ListFormatSymbols-tr-TR","~$goog.labs.i18n.ListFormatSymbols-nb-NO","~$goog.labs.i18n.ListFormatSymbols-ccp-IN","~$goog.labs.i18n.ListFormatSymbols-ta-MY","~$goog.labs.i18n.ListFormatSymbols-saq-KE","~$goog.labs.i18n.ListFormatSymbols_ar_KM","~$goog.labs.i18n.ListFormatSymbols-ar-001","~$goog.labs.i18n.ListFormatSymbols-ln-CG","~$goog.labs.i18n.ListFormatSymbols_en_SH","~$goog.labs.i18n.ListFormatSymbols_en_FK","~$goog.labs.i18n.ListFormatSymbols_ar_SO","~$goog.labs.i18n.ListFormatSymbols_en_ZW","~$goog.labs.i18n.ListFormatSymbols_pt_ST","~$goog.labs.i18n.ListFormatSymbols-wae-CH","~$goog.labs.i18n.ListFormatSymbols-ks","~$goog.labs.i18n.ListFormatSymbols-ff","~$goog.labs.i18n.ListFormatSymbols_ta_LK","~$goog.labs.i18n.ListFormatSymbols-fr-CF","~$goog.labs.i18n.ListFormatSymbols_gsw_LI","~$goog.labs.i18n.ListFormatSymbols-kea-CV","~$goog.labs.i18n.ListFormatSymbols_es_UY","~$goog.labs.i18n.ListFormatSymbols-ceb-PH","~$goog.labs.i18n.ListFormatSymbols_nl_SX","~$goog.labs.i18n.ListFormatSymbols-shi-Tfng-MA","~$goog.labs.i18n.ListFormatSymbols-bas","~$goog.labs.i18n.ListFormatSymbols_haw_US","~$goog.labs.i18n.ListFormatSymbols_fo_DK","~$goog.labs.i18n.ListFormatSymbols_bm_ML","~$goog.labs.i18n.ListFormatSymbols-ja-JP","~$goog.labs.i18n.ListFormatSymbols-sv-FI","~$goog.labs.i18n.ListFormatSymbols_nyn_UG","~$goog.labs.i18n.ListFormatSymbols_en_PG","~$goog.labs.i18n.ListFormatSymbols-de-LI","~$goog.labs.i18n.ListFormatSymbols-ks-IN","~$goog.labs.i18n.ListFormatSymbols_fr_MQ","~$goog.labs.i18n.ListFormatSymbols-nmg-CM","~$goog.labs.i18n.ListFormatSymbols_ki","~$goog.labs.i18n.ListFormatSymbols-lrc-IQ","~$goog.labs.i18n.ListFormatSymbols_mgo","~$goog.labs.i18n.ListFormatSymbols-asa","~$goog.labs.i18n.ListFormatSymbols_ca_AD","~$goog.labs.i18n.ListFormatSymbols_yue_Hant_HK","~$goog.labs.i18n.ListFormatSymbols_ar_ER","~$goog.labs.i18n.ListFormatSymbols-rm-CH","~$goog.labs.i18n.ListFormatSymbols-en-GG","~$goog.labs.i18n.ListFormatSymbols-seh-MZ","~$goog.labs.i18n.ListFormatSymbols_dyo","~$goog.labs.i18n.ListFormatSymbols-fr-MR","~$goog.labs.i18n.ListFormatSymbols-bo-IN","~$goog.labs.i18n.ListFormatSymbols_ln_CG","~$goog.labs.i18n.ListFormatSymbols-dua-CM","~$goog.labs.i18n.ListFormatSymbols_vai_Vaii_LR","~$goog.labs.i18n.ListFormatSymbols-ar-XB","~$goog.labs.i18n.ListFormatSymbols-en-XA","~$goog.labs.i18n.ListFormatSymbols-en-CC","~$goog.labs.i18n.ListFormatSymbols-ksb","~$goog.labs.i18n.ListFormatSymbols-th-TH","~$goog.labs.i18n.ListFormatSymbols_ff_Latn","~$goog.labs.i18n.ListFormatSymbols_dz","~$goog.labs.i18n.ListFormatSymbols-ca-AD","~$goog.labs.i18n.ListFormatSymbols_pt_MO","~$goog.labs.i18n.ListFormatSymbols-vai","~$goog.labs.i18n.ListFormatSymbols-km-KH","~$goog.labs.i18n.ListFormatSymbols-vai-Latn-LR","~$goog.labs.i18n.ListFormatSymbols-jgo-CM","~$goog.labs.i18n.ListFormatSymbols-nnh-CM","~$goog.labs.i18n.ListFormatSymbols_fa_AF","~$goog.labs.i18n.ListFormatSymbols_rn","~$goog.labs.i18n.ListFormatSymbols_mgh_MZ","~$goog.labs.i18n.ListFormatSymbols_en_PW","~$goog.labs.i18n.ListFormatSymbols-en-FM","~$goog.labs.i18n.ListFormatSymbols_fil_PH","~$goog.labs.i18n.ListFormatSymbols-lg-UG","~$goog.labs.i18n.ListFormatSymbols-mg-MG","~$goog.labs.i18n.ListFormatSymbols_en_FI","~$goog.labs.i18n.ListFormatSymbols_cgg_UG","~$goog.labs.i18n.ListFormatSymbols-bm-ML","~$goog.labs.i18n.ListFormatSymbols-tt","~$goog.labs.i18n.ListFormatSymbols-sr-Cyrl","~$goog.labs.i18n.ListFormatSymbols_mr_IN","~$goog.labs.i18n.ListFormatSymbols_mgh","~$goog.labs.i18n.ListFormatSymbols-cs-CZ","~$goog.labs.i18n.ListFormatSymbols-ms-BN","~$goog.labs.i18n.ListFormatSymbols_ks","~$goog.labs.i18n.ListFormatSymbols_ff_Latn_GH","~$goog.labs.i18n.ListFormatSymbols_kea","~$goog.labs.i18n.ListFormatSymbols-fa-AF","~$goog.labs.i18n.ListFormatSymbols-bn-IN","~$goog.labs.i18n.ListFormatSymbols-en-MH","~$goog.labs.i18n.ListFormatSymbols_or_IN","~$goog.labs.i18n.ListFormatSymbols-tr-CY","~$goog.labs.i18n.ListFormatSymbols-es-PA","~$goog.labs.i18n.ListFormatSymbols_ar_BH","~$goog.labs.i18n.ListFormatSymbols-is-IS","~$goog.labs.i18n.ListFormatSymbols-ta-SG","~$goog.labs.i18n.ListFormatSymbols-ps-PK","~$goog.labs.i18n.ListFormatSymbols_fr_MU","~$goog.labs.i18n.ListFormatSymbols-ar-YE","~$goog.labs.i18n.ListFormatSymbols_en_MS","~$goog.labs.i18n.ListFormatSymbols_to_TO","~$goog.labs.i18n.ListFormatSymbols_en_CH","~$goog.labs.i18n.ListFormatSymbols_ksb_TZ","~$goog.labs.i18n.ListFormatSymbols_sr_Cyrl_ME","~$goog.labs.i18n.ListFormatSymbols-yav-CM","~$goog.labs.i18n.ListFormatSymbols-en-AT","~$goog.labs.i18n.ListFormatSymbols-mt-MT","~$goog.labs.i18n.ListFormatSymbols-so-DJ","~$goog.labs.i18n.ListFormatSymbols-kl-GL","~$goog.labs.i18n.ListFormatSymbols-ar-DJ","~$goog.labs.i18n.ListFormatSymbols_hr_BA","~$goog.labs.i18n.ListFormatSymbols-nl-NL","~$goog.labs.i18n.ListFormatSymbols_en_JM","~$goog.labs.i18n.ListFormatSymbols_ar_SD","~$goog.labs.i18n.ListFormatSymbols-wo-SN","~$goog.labs.i18n.ListFormatSymbols_jgo_CM","~$goog.labs.i18n.ListFormatSymbols_en_AS","~$goog.labs.i18n.ListFormatSymbols_uz_Cyrl_UZ","~$goog.labs.i18n.ListFormatSymbols_zgh","~$goog.labs.i18n.ListFormatSymbols-ar-SY","~$goog.labs.i18n.ListFormatSymbols-bem","~$goog.labs.i18n.ListFormatSymbols_vai_Latn","~$goog.labs.i18n.ListFormatSymbols-es-HN","~$goog.labs.i18n.ListFormatSymbols_lb_LU","~$goog.labs.i18n.ListFormatSymbols-xh","~$goog.labs.i18n.ListFormatSymbols_sah","~$goog.labs.i18n.ListFormatSymbols_bem","~$goog.labs.i18n.ListFormatSymbols_kam_KE","~$goog.labs.i18n.ListFormatSymbols_ia_001","~$goog.labs.i18n.ListFormatSymbols-rof-TZ","~$goog.labs.i18n.ListFormatSymbols_fa_IR","~$goog.labs.i18n.ListFormatSymbols-ca-IT","~$goog.labs.i18n.ListFormatSymbols-zh-Hant-MO","~$goog.labs.i18n.ListFormatSymbols-ku","~$goog.labs.i18n.ListFormatSymbols_kde","~$goog.labs.i18n.ListFormatSymbols-es-CO","~$goog.labs.i18n.ListFormatSymbols_mi_NZ","~$goog.labs.i18n.ListFormatSymbols-sg-CF","~$goog.labs.i18n.ListFormatSymbols_de_BE","~$goog.labs.i18n.ListFormatSymbols-nl-CW","~$goog.labs.i18n.ListFormatSymbols-fur","~$goog.labs.i18n.ListFormatSymbols_ko_KR","~$goog.labs.i18n.ListFormatSymbols-ko-KP","~$goog.labs.i18n.ListFormatSymbols_sq_XK","~$goog.labs.i18n.ListFormatSymbols-gsw-CH","~$goog.labs.i18n.ListFormatSymbols-en-UM","~$goog.labs.i18n.ListFormatSymbols_se","~$goog.labs.i18n.ListFormatSymbols-om-ET","~$goog.labs.i18n.ListFormatSymbols-lag","~$goog.labs.i18n.ListFormatSymbols-yue-Hans","~$goog.labs.i18n.ListFormatSymbols_en_BM","~$goog.labs.i18n.ListFormatSymbols-my-MM","~$goog.labs.i18n.ListFormatSymbols_en_IM","~$goog.labs.i18n.ListFormatSymbols-af-NA","~$goog.labs.i18n.ListFormatSymbols-fy-NL","~$goog.labs.i18n.ListFormatSymbols_pt_MZ","~$goog.labs.i18n.ListFormatSymbols_pa_Guru_IN","~$goog.labs.i18n.ListFormatSymbols_eu_ES","~$goog.labs.i18n.ListFormatSymbols_fr_BE","~$goog.labs.i18n.ListFormatSymbols_ce","~$goog.labs.i18n.ListFormatSymbols-vun-TZ","~$goog.labs.i18n.ListFormatSymbols-ff-Latn-MR","~$goog.labs.i18n.ListFormatSymbols_en_NG","~$goog.labs.i18n.ListFormatSymbols_bs_Cyrl_BA","~$goog.labs.i18n.ListFormatSymbols_bo_CN","~$goog.labs.i18n.ListFormatSymbols-chr-US","~$goog.labs.i18n.ListFormatSymbols_mn_MN","~$goog.labs.i18n.ListFormatSymbols-qu-PE","~$goog.labs.i18n.ListFormatSymbols_ca_IT","~$goog.labs.i18n.ListFormatSymbols_de_IT","~$goog.labs.i18n.ListFormatSymbols-en-MT","~$goog.labs.i18n.ListFormatSymbols-fr-TG","~$goog.labs.i18n.ListFormatSymbols_shi_Latn","~$goog.labs.i18n.ListFormatSymbols-ar-OM","~$goog.labs.i18n.ListFormatSymbols-lag-TZ","~$goog.labs.i18n.ListFormatSymbols_en_BI","~$goog.labs.i18n.ListFormatSymbols_saq","~$goog.labs.i18n.ListFormatSymbols-shi-Latn-MA","~$goog.labs.i18n.ListFormatSymbols-ta-IN","~$goog.labs.i18n.ListFormatSymbols-lkt","~$goog.labs.i18n.ListFormatSymbols_en_IO","~$goog.labs.i18n.ListFormatSymbols_yo_BJ","~$goog.labs.i18n.ListFormatSymbols_tg","~$goog.labs.i18n.ListFormatSymbols_en_KN","~$goog.labs.i18n.ListFormatSymbols_ebu","~$goog.labs.i18n.ListFormatSymbols-sd-PK","~$goog.labs.i18n.ListFormatSymbols-pt-TL","~$goog.labs.i18n.ListFormatSymbols_yav_CM","~$goog.labs.i18n.ListFormatSymbols-cgg-UG","~$goog.labs.i18n.ListFormatSymbols-ha-NG","~$goog.labs.i18n.ListFormatSymbols-fi-FI","~$goog.labs.i18n.ListFormatSymbols-fr-DJ","~$goog.labs.i18n.ListFormatSymbols-ckb-IQ","~$goog.labs.i18n.ListFormatSymbols-en-TV","~$goog.labs.i18n.ListFormatSymbols_fi_FI","~$goog.labs.i18n.ListFormatSymbols_kn_IN","~$goog.labs.i18n.ListFormatSymbols_sr_Latn_BA","~$goog.labs.i18n.ListFormatSymbols_khq_ML","~$goog.labs.i18n.ListFormatSymbols_hu_HU","~$goog.labs.i18n.ListFormatSymbols-en-TT","~$goog.labs.i18n.ListFormatSymbols-lt-LT","~$goog.labs.i18n.ListFormatSymbols_ln_CF","~$goog.labs.i18n.ListFormatSymbols-fr-SY","~$goog.labs.i18n.ListFormatSymbols_ig","~$goog.labs.i18n.ListFormatSymbols_fr_BL","~$goog.labs.i18n.ListFormatSymbols_ug_CN","~$goog.labs.i18n.ListFormatSymbols-xh-ZA","~$goog.labs.i18n.ListFormatSymbols_lu","~$goog.labs.i18n.ListFormatSymbols_en_KY","~$goog.labs.i18n.ListFormatSymbols-ru-KZ","~$goog.labs.i18n.ListFormatSymbols-dje","~$goog.labs.i18n.ListFormatSymbols_kl","~$goog.labs.i18n.ListFormatSymbols-pa-Guru","~$goog.labs.i18n.ListFormatSymbols-ru-KG","~$goog.labs.i18n.ListFormatSymbols_da_GL","~$goog.labs.i18n.ListFormatSymbols-vun","~$goog.labs.i18n.ListFormatSymbols-zh-Hant","~$goog.labs.i18n.ListFormatSymbols-bs-Cyrl-BA","~$goog.labs.i18n.ListFormatSymbols_fy","~$goog.labs.i18n.ListFormatSymbols-ru-RU","~$goog.labs.i18n.ListFormatSymbols_nus","~$goog.labs.i18n.ListFormatSymbols-fr-MC","~$goog.labs.i18n.ListFormatSymbols_ms_BN","~$goog.labs.i18n.ListFormatSymbols_id_ID","~$goog.labs.i18n.ListFormatSymbols_bas_CM","~$goog.labs.i18n.ListFormatSymbols-en-BE","~$goog.labs.i18n.ListFormatSymbols_ga_IE","~$goog.labs.i18n.ListFormatSymbols_pt_GQ","~$goog.labs.i18n.ListFormatSymbols_fr_GF","~$goog.labs.i18n.ListFormatSymbols_en_XA","~$goog.labs.i18n.ListFormatSymbols_it_CH","~$goog.labs.i18n.ListFormatSymbols_xog","~$goog.labs.i18n.ListFormatSymbols_gu_IN","~$goog.labs.i18n.ListFormatSymbols_zh_Hant_TW","~$goog.labs.i18n.ListFormatSymbols_lt_LT","~$goog.labs.i18n.ListFormatSymbols-en-MS","~$goog.labs.i18n.ListFormatSymbols_ta_MY","~$goog.labs.i18n.ListFormatSymbols-uz-Arab","~$goog.labs.i18n.ListFormatSymbols_hr_HR","~$goog.labs.i18n.ListFormatSymbols-tt-RU","~$goog.labs.i18n.ListFormatSymbols_so","~$goog.labs.i18n.ListFormatSymbols_fr_CH","~$goog.labs.i18n.ListFormatSymbols_en_001","~$goog.labs.i18n.ListFormatSymbols_sv_FI","~$goog.labs.i18n.ListFormatSymbols_gsw_FR","~$goog.labs.i18n.ListFormatSymbols_en_BE","~$goog.labs.i18n.ListFormatSymbols_en_MO","~$goog.labs.i18n.ListFormatSymbols-sq-MK","~$goog.labs.i18n.ListFormatSymbols_en_DM","~$goog.labs.i18n.ListFormatSymbols-uz-Cyrl-UZ","~$goog.labs.i18n.ListFormatSymbols-fo","~$goog.labs.i18n.ListFormatSymbols-en-BI","~$goog.labs.i18n.ListFormatSymbols-nyn","~$goog.labs.i18n.ListFormatSymbols-tk","~$goog.labs.i18n.ListFormatSymbols_brx_IN","~$goog.labs.i18n.ListFormatSymbols-haw-US","~$goog.labs.i18n.ListFormatSymbols_cy_GB","~$goog.labs.i18n.ListFormatSymbols_zu_ZA","~$goog.labs.i18n.ListFormatSymbols-en-SH","~$goog.labs.i18n.ListFormatSymbols_ewo","~$goog.labs.i18n.ListFormatSymbols_ses","~$goog.labs.i18n.ListFormatSymbols_fr_GN","~$goog.labs.i18n.ListFormatSymbols-eu-ES","~$goog.labs.i18n.ListFormatSymbols-it-SM","~$goog.labs.i18n.ListFormatSymbols-kam","~$goog.labs.i18n.ListFormatSymbols-en-FJ","~$goog.labs.i18n.ListFormatSymbols_nnh","~$goog.labs.i18n.ListFormatSymbols_ceb_PH","~$goog.labs.i18n.ListFormatSymbols-nl-SX","~$goog.labs.i18n.ListFormatSymbols_pt_GW","~$goog.labs.i18n.ListFormatSymbols-mfe","~$goog.labs.i18n.ListFormatSymbols-luy-KE","~$goog.labs.i18n.ListFormatSymbols-az-Latn","~$goog.labs.i18n.ListFormatSymbols_om_KE","~$goog.labs.i18n.ListFormatSymbols-lg","~$goog.labs.i18n.ListFormatSymbols_nn_NO","~$goog.labs.i18n.ListFormatSymbols_ff_Latn_GW","~$goog.labs.i18n.ListFormatSymbols_en_GG","~$goog.labs.i18n.ListFormatSymbols_kok","~$goog.labs.i18n.ListFormatSymbols_qu_BO","~$goog.labs.i18n.ListFormatSymbols-es-NI","~$goog.labs.i18n.ListFormatSymbols_en_PN","~$goog.labs.i18n.ListFormatSymbols_ksf","~$goog.labs.i18n.ListFormatSymbols_en_WS","~$goog.labs.i18n.ListFormatSymbols-om","~$goog.labs.i18n.ListFormatSymbols-en-KI","~$goog.labs.i18n.ListFormatSymbols-en-ZW","~$goog.labs.i18n.ListFormatSymbols-es-IC","~$goog.labs.i18n.ListFormatSymbols-en-CM","~$goog.labs.i18n.ListFormatSymbols-ff-Latn-SL","~$goog.labs.i18n.ListFormatSymbols_sw_CD","~$goog.labs.i18n.ListFormatSymbols-fr-DZ","~$goog.labs.i18n.ListFormatSymbols-tg","~$goog.labs.i18n.ListFormatSymbols-sw-CD","~$goog.labs.i18n.ListFormatSymbols_nd_ZW","~$goog.labs.i18n.ListFormatSymbols_ug","~$goog.labs.i18n.ListFormatSymbols_ig_NG","~$goog.labs.i18n.ListFormatSymbols-en-GH","~$goog.labs.i18n.ListFormatSymbols_sw_KE","~$goog.labs.i18n.ListFormatSymbols_ki_KE","~$goog.labs.i18n.ListFormatSymbols_ti_ER","~$goog.labs.i18n.ListFormatSymbols-es-AR","~$goog.labs.i18n.ListFormatSymbols-teo-UG","~$goog.labs.i18n.ListFormatSymbols_it_SM","~$goog.labs.i18n.ListFormatSymbols-ta-LK","~$goog.labs.i18n.ListFormatSymbols_wae_CH","~$goog.labs.i18n.ListFormatSymbols-zu-ZA","~$goog.labs.i18n.ListFormatSymbols_luy_KE","~$goog.labs.i18n.ListFormatSymbols_ksf_CM","~$goog.labs.i18n.ListFormatSymbols-lu-CD","~$goog.labs.i18n.ListFormatSymbols_tr_TR","~$goog.labs.i18n.ListFormatSymbols-pt-GQ","~$goog.labs.i18n.ListFormatSymbols-ckb","~$goog.labs.i18n.ListFormatSymbols_fr_SC","~$goog.labs.i18n.ListFormatSymbols_khq","~$goog.labs.i18n.ListFormatSymbols-en-PG","~$goog.labs.i18n.ListFormatSymbols_fr_BJ","~$goog.labs.i18n.ListFormatSymbols-en-GU","~$goog.labs.i18n.ListFormatSymbols_kw_GB","~$goog.labs.i18n.ListFormatSymbols-zh-Hans-MO","~$goog.labs.i18n.ListFormatSymbols_am_ET","~$goog.labs.i18n.ListFormatSymbols_ru_UA","~$goog.labs.i18n.ListFormatSymbols-en-150","~$goog.labs.i18n.ListFormatSymbols_bez_TZ","~$goog.labs.i18n.ListFormatSymbols_ar_IL","~$goog.labs.i18n.ListFormatSymbols_jmc","~$goog.labs.i18n.ListFormatSymbols-de-DE","~$goog.labs.i18n.ListFormatSymbols-se-FI","~$goog.labs.i18n.ListFormatSymbols-fr-CH","~$goog.labs.i18n.ListFormatSymbols-rw","~$goog.labs.i18n.ListFormatSymbols_ur_IN","~$goog.labs.i18n.ListFormatSymbols-es-EC","~$goog.labs.i18n.ListFormatSymbols_nl_CW","~$goog.labs.i18n.ListFormatSymbols_es_EC","~$goog.labs.i18n.ListFormatSymbols-da-DK","~$goog.labs.i18n.ListFormatSymbols_lb","~$goog.labs.i18n.ListFormatSymbols_cgg","~$goog.labs.i18n.ListFormatSymbols-en-TO","~$goog.labs.i18n.ListFormatSymbols-fr-RW","~$goog.labs.i18n.ListFormatSymbols-sah-RU","~$goog.labs.i18n.ListFormatSymbols-en-NL","~$goog.labs.i18n.ListFormatSymbols-nd","~$goog.labs.i18n.ListFormatSymbols-vai-Vaii-LR","~$goog.labs.i18n.ListFormatSymbols-gsw-FR","~$goog.labs.i18n.ListFormatSymbols_en_AT","~$goog.labs.i18n.ListFormatSymbols-ksh","~$goog.labs.i18n.ListFormatSymbols-mas-TZ","~$goog.labs.i18n.ListFormatSymbols-sq-AL","~$goog.labs.i18n.ListFormatSymbols_si_LK","~$goog.labs.i18n.ListFormatSymbols_ar_TD","~$goog.labs.i18n.ListFormatSymbols-mr-IN","~$goog.labs.i18n.ListFormatSymbols_en_VG","~$goog.labs.i18n.ListFormatSymbols-ms-MY","~$goog.labs.i18n.ListFormatSymbols_en_VI","~$goog.labs.i18n.ListFormatSymbols-rof","~$goog.labs.i18n.ListFormatSymbols_en_LR","~$goog.labs.i18n.ListFormatSymbols-yo","~$goog.labs.i18n.ListFormatSymbols_sr_Latn_RS","~$goog.labs.i18n.ListFormatSymbols-mi","~$goog.labs.i18n.ListFormatSymbols-en-MG","~$goog.labs.i18n.ListFormatSymbols-kl","~$goog.labs.i18n.ListFormatSymbols_dav","~$goog.labs.i18n.ListFormatSymbols_es_BR","~$goog.labs.i18n.ListFormatSymbols_zh_Hant_HK","~$goog.labs.i18n.ListFormatSymbols-wo","~$goog.labs.i18n.ListFormatSymbols_ff_Latn_CM","~$goog.labs.i18n.ListFormatSymbols-sr-Latn-BA","~$goog.labs.i18n.ListFormatSymbols_ar_XB","~$goog.labs.i18n.ListFormatSymbols_ee","~$goog.labs.i18n.ListFormatSymbols_en_AE","~$goog.labs.i18n.ListFormatSymbols_kam","~$goog.labs.i18n.ListFormatSymbols-pt-MO","~$goog.labs.i18n.ListFormatSymbols-en-CX","~$goog.labs.i18n.ListFormatSymbols_se_FI","~$goog.labs.i18n.ListFormatSymbols-bg-BG","~$goog.labs.i18n.ListFormatSymbols_lag","~$goog.labs.i18n.ListFormatSymbols-smn","~$goog.labs.i18n.ListFormatSymbols-ar-ER","~$goog.labs.i18n.ListFormatSymbols-kw-GB","~$goog.labs.i18n.ListFormatSymbols-fr-BE","~$goog.labs.i18n.ListFormatSymbols_ff_Latn_SL","~$goog.labs.i18n.ListFormatSymbols_ii","~$goog.labs.i18n.ListFormatSymbols-kok","~$goog.labs.i18n.ListFormatSymbols-rwk","~$goog.labs.i18n.ListFormatSymbols-fr-CI","~$goog.labs.i18n.ListFormatSymbols_sbp","~$goog.labs.i18n.ListFormatSymbols-pt-AO","~$goog.labs.i18n.ListFormatSymbols-or-IN","~$goog.labs.i18n.ListFormatSymbols_naq","~$goog.labs.i18n.ListFormatSymbols_kok_IN","~$goog.labs.i18n.ListFormatSymbols-mg","~$goog.labs.i18n.ListFormatSymbols-pa-Guru-IN","~$goog.labs.i18n.ListFormatSymbols_eo","~$goog.labs.i18n.ListFormatSymbols_en_PR","~$goog.labs.i18n.ListFormatSymbols-en-KE","~$goog.labs.i18n.ListFormatSymbols_en_DG","~$goog.labs.i18n.ListFormatSymbols-be-BY","~$goog.labs.i18n.ListFormatSymbols-dav","~$goog.labs.i18n.ListFormatSymbols_xh_ZA","~$goog.labs.i18n.ListFormatSymbols_ml_IN","~$goog.labs.i18n.ListFormatSymbols_guz","~$goog.labs.i18n.ListFormatSymbols-ru-BY","~$goog.labs.i18n.ListFormatSymbols_ee_TG","~$goog.labs.i18n.ListFormatSymbols_vun_TZ","~$goog.labs.i18n.ListFormatSymbols-ar-AE","~$goog.labs.i18n.ListFormatSymbols-am-ET","~$goog.labs.i18n.ListFormatSymbols_en_MH","~$goog.labs.i18n.ListFormatSymbols_en_LS","~$goog.labs.i18n.ListFormatSymbols_uk_UA","~$goog.labs.i18n.ListFormatSymbols-ms-SG","~$goog.labs.i18n.ListFormatSymbols_uz_Latn_UZ","~$goog.labs.i18n.ListFormatSymbols-ii-CN","~$goog.labs.i18n.ListFormatSymbols-es-BO","~$goog.labs.i18n.ListFormatSymbols-brx-IN","~$goog.labs.i18n.ListFormatSymbols_nds_NL","~$goog.labs.i18n.ListFormatSymbols_ti_ET","~$goog.labs.i18n.ListFormatSymbols-en-GY","~$goog.labs.i18n.ListFormatSymbols-sr-Latn-XK","~$goog.labs.i18n.ListFormatSymbols_yi","~$goog.labs.i18n.ListFormatSymbols_en_TK","~$goog.labs.i18n.ListFormatSymbols_en_CX","~$goog.labs.i18n.ListFormatSymbols_en_US_POSIX","~$goog.labs.i18n.ListFormatSymbols-nds","~$goog.labs.i18n.ListFormatSymbols_ln_CD","~$goog.labs.i18n.ListFormatSymbols_yue_Hans_CN","~$goog.labs.i18n.ListFormatSymbols-sw-KE","~$goog.labs.i18n.ListFormatSymbols-jmc","~$goog.labs.i18n.ListFormatSymbols_ar_PS","~$goog.labs.i18n.ListFormatSymbols-bs-Latn","~$goog.labs.i18n.ListFormatSymbols-naq-NA","~$goog.labs.i18n.ListFormatSymbols_bs_Cyrl","~$goog.labs.i18n.ListFormatSymbols_en_MY","~$goog.labs.i18n.ListFormatSymbols-gv","~$goog.labs.i18n.ListFormatSymbols-en-GI","~$goog.labs.i18n.ListFormatSymbols_ru_MD","~$goog.labs.i18n.ListFormatSymbols-pt-LU","~$goog.labs.i18n.ListFormatSymbols-guz","~$goog.labs.i18n.ListFormatSymbols_ru_BY","~$goog.labs.i18n.ListFormatSymbols-ce","~$goog.labs.i18n.ListFormatSymbols_dua_CM","~$goog.labs.i18n.ListFormatSymbols-mas-KE","~$goog.labs.i18n.ListFormatSymbols-nd-ZW","~$goog.labs.i18n.ListFormatSymbols-mzn","~$goog.labs.i18n.ListFormatSymbols-kkj-CM","~$goog.labs.i18n.ListFormatSymbols-en-LS","~$goog.labs.i18n.ListFormatSymbols-it-VA","~$goog.labs.i18n.ListFormatSymbols_fr_HT","~$goog.labs.i18n.ListFormatSymbols_ar_SY","~$goog.labs.i18n.ListFormatSymbols-pt-CV","~$goog.labs.i18n.ListFormatSymbols_fr_CM","~$goog.labs.i18n.ListFormatSymbols_zh_Hant","~$goog.labs.i18n.ListFormatSymbols_en_SC","~$goog.labs.i18n.ListFormatSymbols-lv-LV","~$goog.labs.i18n.ListFormatSymbols-naq","~$goog.labs.i18n.ListFormatSymbols_nd","~$goog.labs.i18n.ListFormatSymbols_hy_AM","~$goog.labs.i18n.ListFormatSymbols-en-TZ","~$goog.labs.i18n.ListFormatSymbols-fr-MA","~$goog.labs.i18n.ListFormatSymbols_es_CU","~$goog.labs.i18n.ListFormatSymbols-fur-IT","~$goog.labs.i18n.ListFormatSymbols-smn-FI","~$goog.labs.i18n.ListFormatSymbols_en_CK","~$goog.labs.i18n.ListFormatSymbols_brx","~$goog.labs.i18n.ListFormatSymbols-rn","~$goog.labs.i18n.ListFormatSymbols-teo-KE","~$goog.labs.i18n.ListFormatSymbols-pt-GW","~$goog.labs.i18n.ListFormatSymbols-en-WS","~$goog.labs.i18n.ListFormatSymbols-bs-Latn-BA","~$goog.labs.i18n.ListFormatSymbols_fr_TN","~$goog.labs.i18n.ListFormatSymbols_kab","~$goog.labs.i18n.ListFormatSymbols-teo","~$goog.labs.i18n.ListFormatSymbols_ccp_BD","~$goog.labs.i18n.ListFormatSymbols-en-NU","~$goog.labs.i18n.ListFormatSymbols_mer","~$goog.labs.i18n.ListFormatSymbols_ar_AE","~$goog.labs.i18n.ListFormatSymbols-it-IT","~$goog.labs.i18n.ListFormatSymbols_ca_FR","~$goog.labs.i18n.ListFormatSymbols-xog-UG","~$goog.labs.i18n.ListFormatSymbols_rwk_TZ","~$goog.labs.i18n.ListFormatSymbols_asa","~$goog.labs.i18n.ListFormatSymbols_ckb_IR","~$goog.labs.i18n.ListFormatSymbols_te_IN","~$goog.labs.i18n.ListFormatSymbols_en_TZ","~$goog.labs.i18n.ListFormatSymbols_ff_Latn_SN","~$goog.labs.i18n.ListFormatSymbols-lb-LU","~$goog.labs.i18n.ListFormatSymbols_ceb","~$goog.labs.i18n.ListFormatSymbols-fr-GF","~$goog.labs.i18n.ListFormatSymbols-brx","~$goog.labs.i18n.ListFormatSymbols-en-TC","~$goog.labs.i18n.ListFormatSymbols-en-ZM","~$goog.labs.i18n.ListFormatSymbols-zgh","~$goog.labs.i18n.ListFormatSymbols_en_TC","~$goog.labs.i18n.ListFormatSymbols_mas_TZ","~$goog.labs.i18n.ListFormatSymbols-pa-Arab-PK","~$goog.labs.i18n.ListFormatSymbols-fr-BL","~$goog.labs.i18n.ListFormatSymbols-sn-ZW","~$goog.labs.i18n.ListFormatSymbols_so_KE","~$goog.labs.i18n.ListFormatSymbols-en-VI","~$goog.labs.i18n.ListFormatSymbols-en-CY","~$goog.labs.i18n.ListFormatSymbols-es-BZ","~$goog.labs.i18n.ListFormatSymbols-en-PR","~$goog.labs.i18n.ListFormatSymbols_xh","~$goog.labs.i18n.ListFormatSymbols-os-GE","~$goog.labs.i18n.ListFormatSymbols-yue-Hans-CN","~$goog.labs.i18n.ListFormatSymbols_br_FR","~$goog.labs.i18n.ListFormatSymbols_shi_Tfng_MA","~$goog.labs.i18n.ListFormatSymbols-uz-Cyrl","~$goog.labs.i18n.ListFormatSymbols_om_ET","~$goog.labs.i18n.ListFormatSymbols_es_CO","~$goog.labs.i18n.ListFormatSymbols_yue_Hant","~$goog.labs.i18n.ListFormatSymbols_qu_PE","~$goog.labs.i18n.ListFormatSymbols-hy-AM","~$goog.labs.i18n.ListFormatSymbols-en-BM","~$goog.labs.i18n.ListFormatSymbols_fr_KM","~$goog.labs.i18n.ListFormatSymbols_teo","~$goog.labs.i18n.ListFormatSymbols-en-AE","~$goog.labs.i18n.ListFormatSymbols-ff-Latn-SN","~$goog.labs.i18n.ListFormatSymbols_en_LC","~$goog.labs.i18n.ListFormatSymbols-ast-ES","~$goog.labs.i18n.ListFormatSymbols-bez","~$goog.labs.i18n.ListFormatSymbols-de-IT","~$goog.labs.i18n.ListFormatSymbols-ne-NP","~$goog.labs.i18n.ListFormatSymbols-ps","~$goog.labs.i18n.ListFormatSymbols-uk-UA","~$goog.labs.i18n.ListFormatSymbols-yi","~$goog.labs.i18n.ListFormatSymbols_vun","~$goog.labs.i18n.ListFormatSymbols-ug","~$goog.labs.i18n.ListFormatSymbols_fr_YT","~$goog.labs.i18n.ListFormatSymbols-fil-PH","~$goog.labs.i18n.ListFormatSymbols_dav_KE","~$goog.labs.i18n.ListFormatSymbols-pt-ST","~$goog.labs.i18n.ListFormatSymbols_en_CY","~$goog.labs.i18n.ListFormatSymbols-en-SD","~$goog.labs.i18n.ListFormatSymbols_lg","~$goog.labs.i18n.ListFormatSymbols-en-BZ","~$goog.labs.i18n.ListFormatSymbols-nds-NL","~$goog.labs.i18n.ListFormatSymbols_my_MM","~$goog.labs.i18n.ListFormatSymbols_nl_AW","~$goog.labs.i18n.ListFormatSymbols_os","~$goog.labs.i18n.ListFormatSymbols_ckb","~$goog.labs.i18n.ListFormatSymbols-en-IL","~$goog.labs.i18n.ListFormatSymbols-en-NF","~$goog.labs.i18n.ListFormatSymbols_jgo","~$goog.labs.i18n.ListFormatSymbols-en-FK","~$goog.labs.i18n.ListFormatSymbols-es-PY","~$goog.labs.i18n.ListFormatSymbols_en_NL","~$goog.labs.i18n.ListFormatSymbols-asa-TZ","~$goog.labs.i18n.ListFormatSymbols_ps_AF","~$goog.labs.i18n.ListFormatSymbols_es_PE","~$goog.labs.i18n.ListFormatSymbols-fr-WF","~$goog.labs.i18n.ListFormatSymbols_bg_BG","~$goog.labs.i18n.ListFormatSymbols_cs_CZ","~$goog.labs.i18n.ListFormatSymbols_nyn","~$goog.labs.i18n.ListFormatSymbols_se_SE","~$goog.labs.i18n.ListFormatSymbols_kl_GL","~$goog.labs.i18n.ListFormatSymbols-vai-Vaii","~$goog.labs.i18n.ListFormatSymbols-ff-Latn-GW","~$goog.labs.i18n.ListFormatSymbols_to","~$goog.labs.i18n.ListFormatSymbols_sn_ZW","~$goog.labs.i18n.ListFormatSymbols_guz_KE","~$goog.labs.i18n.ListFormatSymbols_en_BZ","~$goog.labs.i18n.ListFormatSymbols_twq","~$goog.labs.i18n.ListFormatSymbols_yo_NG","~$goog.labs.i18n.ListFormatSymbols-fr-LU","~$goog.labs.i18n.ListFormatSymbols-en-NR","~$goog.labs.i18n.ListFormatSymbols-ki","~$goog.labs.i18n.ListFormatSymbols-ksf","~$goog.labs.i18n.ListFormatSymbols-ceb","~$goog.labs.i18n.ListFormatSymbols_fo_FO","~$goog.labs.i18n.ListFormatSymbols_fr_NE","~$goog.labs.i18n.ListFormatSymbols_sd","~$goog.labs.i18n.ListFormatSymbols-ro-MD","~$goog.labs.i18n.ListFormatSymbols_nb_SJ","~$goog.labs.i18n.ListFormatSymbols_mfe_MU","~$goog.labs.i18n.ListFormatSymbols_da_DK","~$goog.labs.i18n.ListFormatSymbols-sv-SE","~$goog.labs.i18n.ListFormatSymbols-pa-Arab","~$goog.labs.i18n.ListFormatSymbols_en_GY","~$goog.labs.i18n.ListFormatSymbols-kde-TZ","~$goog.labs.i18n.ListFormatSymbols_sr_Cyrl_XK","~$goog.labs.i18n.ListFormatSymbols_fr_VU","~$goog.labs.i18n.ListFormatSymbols-wae","~$goog.labs.i18n.ListFormatSymbols-ak","~$goog.labs.i18n.ListFormatSymbols_lrc_IR","~$goog.labs.i18n.ListFormatSymbols-es-PR","~$goog.labs.i18n.ListFormatSymbols-sv-AX","~$goog.labs.i18n.ListFormatSymbols-os","~$goog.labs.i18n.ListFormatSymbols_ce_RU","~$goog.labs.i18n.ListFormatSymbols_en_KE","~$goog.labs.i18n.ListFormatSymbols_bm","~$goog.labs.i18n.ListFormatSymbols_luy","~$goog.labs.i18n.ListFormatSymbols-he-IL","~$goog.labs.i18n.ListFormatSymbols_en_CM","~$goog.labs.i18n.ListFormatSymbols_yue_Hans","~$goog.labs.i18n.ListFormatSymbols_ewo_CM","~$goog.labs.i18n.ListFormatSymbols-en-DG","~$goog.labs.i18n.ListFormatSymbols_ro_MD","~$goog.labs.i18n.ListFormatSymbols_en_GU","~$goog.labs.i18n.ListFormatSymbols_ti","~$goog.labs.i18n.ListFormatSymbols_sq_AL","~$goog.labs.i18n.ListFormatSymbols-luy","~$goog.labs.i18n.ListFormatSymbols_zh_Hans_CN","~$goog.labs.i18n.ListFormatSymbols_en_SL","~$goog.labs.i18n.ListFormatSymbols-en-VG","~$goog.labs.i18n.ListFormatSymbols-shi-Tfng","~$goog.labs.i18n.ListFormatSymbols_lrc","~$goog.labs.i18n.ListFormatSymbols-nus","~$goog.labs.i18n.ListFormatSymbols-ccp","~$goog.labs.i18n.ListFormatSymbols-ee-GH","~$goog.labs.i18n.ListFormatSymbols-fr-PM","~$goog.labs.i18n.ListFormatSymbols_lrc_IQ","~$goog.labs.i18n.ListFormatSymbols-fr-CG","~$goog.labs.i18n.ListFormatSymbols-ksf-CM","~$goog.labs.i18n.ListFormatSymbols-gv-IM","~$goog.labs.i18n.ListFormatSymbols_agq","~$goog.labs.i18n.ListFormatSymbols_ii_CN","~$goog.labs.i18n.ListFormatSymbols-khq-ML","~$goog.labs.i18n.ListFormatSymbols_nl_NL","~$goog.labs.i18n.ListFormatSymbols-te-IN","~$goog.labs.i18n.ListFormatSymbols_bn_BD","~$goog.labs.i18n.ListFormatSymbols_nmg","~$goog.labs.i18n.ListFormatSymbols-mk-MK","~$goog.labs.i18n.ListFormatSymbols-ar-LB","~$goog.labs.i18n.ListFormatSymbols_ff_Latn_MR","~$goog.labs.i18n.ListFormatSymbols_en_MU","~$goog.labs.i18n.ListFormatSymbols-ca-ES","~$goog.labs.i18n.ListFormatSymbols_gsw_CH","~$goog.labs.i18n.ListFormatSymbols_es_PY","~$goog.labs.i18n.ListFormatSymbols_tzm","~$goog.labs.i18n.ListFormatSymbols_en_MW","~$goog.labs.i18n.ListFormatSymbols-nl-BE","~$goog.labs.i18n.ListFormatSymbols-fr-SN","~$goog.labs.i18n.ListFormatSymbols-bs-Cyrl","~$goog.labs.i18n.ListFormatSymbolsExt","~$goog.labs.i18n.ListFormatSymbols-fr-CD","~$goog.labs.i18n.ListFormatSymbols_es_VE","~$goog.labs.i18n.ListFormatSymbols_smn","~$goog.labs.i18n.ListFormatSymbols-en-RW","~$goog.labs.i18n.ListFormatSymbols-tzm","~$goog.labs.i18n.ListFormatSymbols_om","~$goog.labs.i18n.ListFormatSymbols_ku","~$goog.labs.i18n.ListFormatSymbols_es_CR","~$goog.labs.i18n.ListFormatSymbols-sr-Cyrl-RS","~$goog.labs.i18n.ListFormatSymbols_en_SD","~$goog.labs.i18n.ListFormatSymbols_sr_Latn_ME","~$goog.labs.i18n.ListFormatSymbols_az_Cyrl","~$goog.labs.i18n.ListFormatSymbols_fr_CF","~$goog.labs.i18n.ListFormatSymbols_en_MP","~$goog.labs.i18n.ListFormatSymbols_km_KH","~$goog.labs.i18n.ListFormatSymbols_ksb","~$goog.labs.i18n.ListFormatSymbols_pt_LU","~$goog.labs.i18n.ListFormatSymbols_ne_NP","~$goog.labs.i18n.ListFormatSymbols-sr-Latn-RS","~$goog.labs.i18n.ListFormatSymbols-en-LC","~$goog.labs.i18n.ListFormatSymbols-ast","~$goog.labs.i18n.ListFormatSymbols-mzn-IR","~$goog.labs.i18n.ListFormatSymbols_rm","~$goog.labs.i18n.ListFormatSymbols_en_DE","~$goog.labs.i18n.ListFormatSymbols-sbp","~$goog.labs.i18n.ListFormatSymbols_lkt_US","~$goog.labs.i18n.ListFormatSymbols-ar-IL","~$goog.labs.i18n.ListFormatSymbols_ckb_IQ","~$goog.labs.i18n.ListFormatSymbols-hsb-DE","~$goog.labs.i18n.ListFormatSymbols-mer","~$goog.labs.i18n.ListFormatSymbols_seh_MZ","~$goog.labs.i18n.ListFormatSymbols-en-PW","~$goog.labs.i18n.ListFormatSymbols-dsb-DE","~$goog.labs.i18n.ListFormatSymbols_hsb_DE","~$goog.labs.i18n.ListFormatSymbols-sn","~$goog.labs.i18n.ListFormatSymbols_el_CY","~$goog.labs.i18n.ListFormatSymbols_hi_IN","~$goog.labs.i18n.ListFormatSymbols-nl-SR","~$goog.labs.i18n.ListFormatSymbols-en-NG","~$goog.labs.i18n.ListFormatSymbols_ka_GE","~$goog.labs.i18n.ListFormatSymbols-yi-001","~$goog.labs.i18n.ListFormatSymbols_bo_IN","~$goog.labs.i18n.ListFormatSymbols-es-CR","~$goog.labs.i18n.ListFormatSymbols_luo","~$goog.labs.i18n.ListFormatSymbols-fo-FO","~$goog.labs.i18n.ListFormatSymbols_lg_UG","~$goog.labs.i18n.ListFormatSymbols-fo-DK","~$goog.labs.i18n.ListFormatSymbols_gd_GB","~$goog.labs.i18n.ListFormatSymbols_ff_Latn_BF","~$goog.labs.i18n.ListFormatSymbols-en-MY","~$goog.labs.i18n.ListFormatSymbols_yi_001","~$goog.labs.i18n.ListFormatSymbols-en-SE","~$goog.labs.i18n.ListFormatSymbols-ff-Latn-NE","~$goog.labs.i18n.ListFormatSymbols_ff","~$goog.labs.i18n.ListFormatSymbols_tk_TM","~$goog.labs.i18n.ListFormatSymbols_fr_MC","~$goog.labs.i18n.ListFormatSymbols_af_ZA","~$goog.labs.i18n.ListFormatSymbols-mgh-MZ","~$goog.labs.i18n.ListFormatSymbols_sv_SE","~$goog.labs.i18n.ListFormatSymbols-en-FI","~$goog.labs.i18n.ListFormatSymbols_en_SX","~$goog.labs.i18n.ListFormatSymbols-lrc","~$goog.labs.i18n.ListFormatSymbols-en-DE","~$goog.labs.i18n.ListFormatSymbols-en-SS","~$goog.labs.i18n.ListFormatSymbols-kab","~$goog.labs.i18n.ListFormatSymbols_sr_Cyrl","~$goog.labs.i18n.ListFormatSymbols-id-ID","~$goog.labs.i18n.ListFormatSymbols-az-Cyrl-AZ","~$goog.labs.i18n.ListFormatSymbols-de-BE","~$goog.labs.i18n.ListFormatSymbols_fr_PF","~$goog.labs.i18n.ListFormatSymbols_ia","~$goog.labs.i18n.ListFormatSymbols-ewo-CM","~$goog.labs.i18n.ListFormatSymbols_fr_GP","~$goog.labs.i18n.ListFormatSymbols-ff-Latn-GN","~$goog.labs.i18n.ListFormatSymbols_teo_KE","~$goog.labs.i18n.ListFormatSymbols-ff-Latn-GM","~$goog.labs.i18n.ListFormatSymbols-seh","~$goog.labs.i18n.ListFormatSymbols_ro_RO","~$goog.labs.i18n.ListFormatSymbols_es_NI","~$goog.labs.i18n.ListFormatSymbols-ru-MD","~$goog.labs.i18n.ListFormatSymbols-ar-KW","~$goog.labs.i18n.ListFormatSymbols_es_PA","~$goog.labs.i18n.ListFormatSymbols_fr_WF","~$goog.labs.i18n.ListFormatSymbols-sr-Latn-ME","~$goog.labs.i18n.ListFormatSymbols_dsb_DE","~$goog.labs.i18n.ListFormatSymbols-xog","~$goog.labs.i18n.ListFormatSymbols-sd","~$goog.labs.i18n.ListFormatSymbols-sah","~$goog.labs.i18n.ListFormatSymbols-bo","~$goog.labs.i18n.ListFormatSymbols_kln","~$goog.labs.i18n.ListFormatSymbols_ff_Latn_NG","~$goog.labs.i18n.ListFormatSymbols-zh-Hant-HK","~$goog.labs.i18n.ListFormatSymbols-en-IM","~$goog.labs.i18n.ListFormatSymbols-en-CH","~$goog.labs.i18n.ListFormatSymbols_ar_MA","~$goog.labs.i18n.ListFormatSymbols-nus-SS","~$goog.labs.i18n.ListFormatSymbols_pa_Arab_PK","~$goog.labs.i18n.ListFormatSymbols_nl_BE","~$goog.labs.i18n.ListFormatSymbols_as_IN","~$goog.labs.i18n.ListFormatSymbols-ewo","~$goog.labs.i18n.ListFormatSymbols-es-DO","~$goog.labs.i18n.ListFormatSymbols_ccp_IN","~$goog.labs.i18n.ListFormatSymbols_gv_IM","~$goog.labs.i18n.ListFormatSymbols_vai","~$goog.labs.i18n.ListFormatSymbols-sg","~$goog.labs.i18n.ListFormatSymbols_ks_IN","~$goog.labs.i18n.ListFormatSymbols_mgo_CM","~$goog.labs.i18n.ListFormatSymbols-sq-XK","~$goog.labs.i18n.ListFormatSymbols_en_NZ","~$goog.labs.i18n.ListFormatSymbols-rn-BI","~$goog.labs.i18n.ListFormatSymbols_ha_NG","~$goog.labs.i18n.ListFormatSymbols-ur-PK","~$goog.labs.i18n.ListFormatSymbols_es_GT","~$goog.labs.i18n.ListFormatSymbols-ar-SO","~$goog.labs.i18n.ListFormatSymbols-gd-GB","~$goog.labs.i18n.ListFormatSymbols_ms_MY","~$goog.labs.i18n.ListFormatSymbols_dz_BT","~$goog.labs.i18n.ListFormatSymbols-en-VC","~$goog.labs.i18n.ListFormatSymbols_os_RU","~$goog.labs.i18n.ListFormatSymbols-om-KE","~$goog.labs.i18n.ListFormatSymbols-qu","~$goog.labs.i18n.ListFormatSymbols-ru-UA","~$goog.labs.i18n.ListFormatSymbols-so-SO","~$goog.labs.i18n.ListFormatSymbols-ak-GH","~$goog.labs.i18n.ListFormatSymbols-mgo-CM","~$goog.labs.i18n.ListFormatSymbols_is_IS","~$goog.labs.i18n.ListFormatSymbols_et_EE","~$goog.labs.i18n.ListFormatSymbols-ku-TR","~$goog.labs.i18n.ListFormatSymbols-da-GL","~$goog.labs.i18n.ListFormatSymbols_de_LI","~$goog.labs.i18n.ListFormatSymbols_kab_DZ","~$goog.labs.i18n.ListFormatSymbols_en_150","~$goog.labs.i18n.ListFormatSymbols-tzm-MA","~$goog.labs.i18n.ListFormatSymbols-gd","~$goog.labs.i18n.ListFormatSymbols_en_GD","~$goog.labs.i18n.ListFormatSymbols_es_CL","~$goog.labs.i18n.ListFormatSymbols-mn-MN","~$goog.labs.i18n.ListFormatSymbols-nb-SJ","~$goog.labs.i18n.ListFormatSymbols_az_Latn","~$goog.labs.i18n.ListFormatSymbols_naq_NA","~$goog.labs.i18n.ListFormatSymbols-el-CY","~$goog.labs.i18n.ListFormatSymbols_es_EA","~$goog.labs.i18n.ListFormatSymbols-br-FR","~$goog.labs.i18n.ListFormatSymbols_ur_PK","~$goog.labs.i18n.ListFormatSymbols-fr-MG","~$goog.labs.i18n.ListFormatSymbols_tk","~$goog.labs.i18n.ListFormatSymbols_es_GQ","~$goog.labs.i18n.ListFormatSymbols_es_IC","~$goog.labs.i18n.ListFormatSymbols_en_GI","~$goog.labs.i18n.ListFormatSymbols_fr_PM","~$goog.labs.i18n.ListFormatSymbols_en_PH","~$goog.labs.i18n.ListFormatSymbols-yue","~$goog.labs.i18n.ListFormatSymbols_shi","~$goog.labs.i18n.ListFormatSymbols-it-CH","~$goog.labs.i18n.ListFormatSymbols-nmg","~$goog.labs.i18n.ListFormatSymbols_en_MT","~$goog.labs.i18n.ListFormatSymbols-sw-TZ","~$goog.labs.i18n.ListFormatSymbols_en_RW","~$goog.labs.i18n.ListFormatSymbols_pt_TL","~$goog.labs.i18n.ListFormatSymbols-en-PK","~$goog.labs.i18n.ListFormatSymbols-ug-CN","~$goog.labs.i18n.ListFormatSymbols-so","~$goog.labs.i18n.ListFormatSymbols_asa_TZ","~$goog.labs.i18n.ListFormatSymbols-rwk-TZ","~$goog.labs.i18n.ListFormatSymbols_it_IT","~$goog.labs.i18n.ListFormatSymbols-ksh-DE","~$goog.labs.i18n.ListFormatSymbols_fr_BI","~$goog.labs.i18n.ListFormatSymbols-de-LU","~$goog.labs.i18n.ListFormatSymbols-mfe-MU","~$goog.labs.i18n.ListFormatSymbols-ia","~$goog.labs.i18n.ListFormatSymbols_en_VC","~$goog.labs.i18n.ListFormatSymbols_nl_BQ","~$goog.labs.i18n.ListFormatSymbols-ff-Latn-LR","~$goog.labs.i18n.ListFormatSymbols-en-BB","~$goog.labs.i18n.ListFormatSymbols-en-KN","~$goog.labs.i18n.ListFormatSymbols-fr-YT","~$goog.labs.i18n.ListFormatSymbols-ki-KE","~$goog.labs.i18n.ListFormatSymbols-uz-Arab-AF","~$goog.labs.i18n.ListFormatSymbols_sk_SK","~$goog.labs.i18n.ListFormatSymbols-vai-Latn","~$goog.labs.i18n.ListFormatSymbols-ee-TG","~$goog.labs.i18n.ListFormatSymbols-ar-TN","~$goog.labs.i18n.ListFormatSymbols_ms_SG","~$goog.labs.i18n.ListFormatSymbols-mi-NZ","~$goog.labs.i18n.ListFormatSymbols-ar-JO","~$goog.labs.i18n.ListFormatSymbols-ln-CF","~$goog.labs.i18n.ListFormatSymbols_se_NO","~$goog.labs.i18n.ListFormatSymbols_en_NU","~$goog.labs.i18n.ListFormatSymbols-kln","~$goog.labs.i18n.ListFormatSymbols-ff-Latn-GH","~$goog.labs.i18n.ListFormatSymbols_ast","~$goog.labs.i18n.ListFormatSymbols-az-Cyrl","~$goog.labs.i18n.ListFormatSymbols-kkj","~$goog.labs.i18n.ListFormatSymbols_gl_ES","~$goog.labs.i18n.ListFormatSymbols_fr_DZ","~$goog.labs.i18n.ListFormatSymbols_mk_MK","~$goog.labs.i18n.ListFormatSymbols-es-VE","~$goog.labs.i18n.ListFormatSymbols_en_NF","~$goog.labs.i18n.ListFormatSymbols-es-GQ","~$goog.labs.i18n.ListFormatSymbols-en-MW","~$goog.labs.i18n.ListFormatSymbols_ha_GH","~$goog.labs.i18n.ListFormatSymbols_az_Cyrl_AZ","~$goog.labs.i18n.ListFormatSymbols-ar-MR","~$goog.labs.i18n.ListFormatSymbols-ps-AF","~$goog.labs.i18n.ListFormatSymbols_fr_SY","~$goog.labs.i18n.ListFormatSymbols_en_SI","~$goog.labs.i18n.ListFormatSymbols-en-JM","~$goog.labs.i18n.ListFormatSymbols_nmg_CM","~$goog.labs.i18n.ListFormatSymbols-ca-FR","~$goog.labs.i18n.ListFormatSymbols_smn_FI","~$goog.labs.i18n.ListFormatSymbols_tt","~$goog.labs.i18n.ListFormatSymbols_mfe","~$goog.labs.i18n.ListFormatSymbols_ar_OM","~$goog.labs.i18n.ListFormatSymbols-en-AG","~$goog.labs.i18n.ListFormatSymbols-se-NO","~$goog.labs.i18n.ListFormatSymbols-to-TO","~$goog.labs.i18n.ListFormatSymbols_en_TV","~$goog.labs.i18n.ListFormatSymbols-ar-SS","~$goog.labs.i18n.ListFormatSymbols_lu_CD","~$goog.labs.i18n.ListFormatSymbols-en-PH","~$goog.labs.i18n.ListFormatSymbols_wae","~$goog.labs.i18n.ListFormatSymbols_bem_ZM","~$goog.labs.i18n.ListFormatSymbols-zh-Hant-TW","~$goog.labs.i18n.ListFormatSymbols_en_BB","~$goog.labs.i18n.ListFormatSymbols_mua_CM","~$goog.labs.i18n.ListFormatSymbols-hi-IN","~$goog.labs.i18n.ListFormatSymbols_nus_SS","~$goog.labs.i18n.ListFormatSymbols-sbp-TZ","~$goog.labs.i18n.ListFormatSymbols-uz-Latn","~$goog.labs.i18n.ListFormatSymbols_so_ET","~$goog.labs.i18n.ListFormatSymbols-to","~$goog.labs.i18n.ListFormatSymbols-kam-KE","~$goog.labs.i18n.ListFormatSymbols_fr_FR","~$goog.labs.i18n.ListFormatSymbols-es-PH","~$goog.labs.i18n.ListFormatSymbols-es-CU","~$goog.labs.i18n.ListFormatSymbols_fr_LU","~$goog.labs.i18n.ListFormatSymbols-en-001","~$goog.labs.i18n.ListFormatSymbols_en_SB","~$goog.labs.i18n.ListFormatSymbols_en_AI","~$goog.labs.i18n.ListFormatSymbols_rof_TZ","~$goog.labs.i18n.ListFormatSymbols_hsb","~$goog.labs.i18n.ListFormatSymbols-ar-KM","~$goog.labs.i18n.ListFormatSymbols-shi-Latn","~$goog.labs.i18n.ListFormatSymbols_en_FM","~$goog.labs.i18n.ListFormatSymbols_pt_CH","~$goog.labs.i18n.ListFormatSymbols_fr_MG","~$goog.labs.i18n.ListFormatSymbols-ml-IN","~$goog.labs.i18n.ListFormatSymbols-ksb-TZ","~$goog.labs.i18n.ListFormatSymbols-fr-VU","~$goog.labs.i18n.ListFormatSymbols-lo-LA","~$goog.labs.i18n.ListFormatSymbols-kde","~$goog.labs.i18n.ListFormatSymbols_th_TH","~$goog.labs.i18n.ListFormatSymbols-yo-NG","~$goog.labs.i18n.ListFormatSymbols-en-VU","~$goog.labs.i18n.ListFormatSymbols_kea_CV","~$goog.labs.i18n.ListFormatSymbols-en-AI","~$goog.labs.i18n.ListFormatSymbols-ccp-BD","~$goog.labs.i18n.ListFormatSymbols_os_GE","~$goog.labs.i18n.ListFormatSymbols-sk-SK","~$goog.labs.i18n.ListFormatSymbols-fr-MQ","~$goog.labs.i18n.ListFormatSymbols_kde_TZ","~$goog.labs.i18n.ListFormatSymbols-en-JE","~$goog.labs.i18n.ListFormatSymbols_kkj","~$goog.labs.i18n.ListFormatSymbols-bm","~$goog.labs.i18n.ListFormatSymbols-ff-Latn-BF","~$goog.labs.i18n.ListFormatSymbols-si-LK","~$goog.labs.i18n.ListFormatSymbols-saq","~$goog.labs.i18n.ListFormatSymbols-en-CK","~$goog.labs.i18n.ListFormatSymbols_twq_NE","~$goog.labs.i18n.ListFormatSymbols-kn-IN","~$goog.labs.i18n.ListFormatSymbols_en_VU","~$goog.labs.i18n.ListFormatSymbols-nl-AW","~$goog.labs.i18n.ListFormatSymbols_sv_AX","~$goog.labs.i18n.ListFormatSymbols-es-PE","~$goog.labs.i18n.ListFormatSymbols_zh_Hans_SG","~$goog.labs.i18n.ListFormatSymbols-fr-BJ","~$goog.labs.i18n.ListFormatSymbols-sr-Cyrl-ME","~$goog.labs.i18n.ListFormatSymbols_en_SS","~$goog.labs.i18n.ListFormatSymbols_zgh_MA","~$goog.labs.i18n.ListFormatSymbols_en_SE","~$goog.labs.i18n.ListFormatSymbols_rw_RW","~$goog.labs.i18n.ListFormatSymbols_sg","~$goog.labs.i18n.ListFormatSymbols-es-GT","~$goog.labs.i18n.ListFormatSymbols_lo_LA","~$goog.labs.i18n.ListFormatSymbols_ar_SA","~$goog.labs.i18n.ListFormatSymbols-ig-NG","~$goog.labs.i18n.ListFormatSymbols-mgh","~$goog.labs.i18n.ListFormatSymbols_fr_GQ","~$goog.labs.i18n.ListFormatSymbols-ln-AO","~$goog.labs.i18n.ListFormatSymbols-fr-ML","~$goog.labs.i18n.ListFormatSymbols-en-MU","~$goog.labs.i18n.ListFormatSymbols_nn","~$goog.labs.i18n.ListFormatSymbols_uz_Latn","~$goog.labs.i18n.ListFormatSymbols-kab-DZ","~$goog.labs.i18n.ListFormatSymbols_mer_KE","~$goog.labs.i18n.ListFormatSymbols-agq-CM","~$goog.labs.i18n.ListFormatSymbols-en-DM","~$goog.labs.i18n.ListFormatSymbols_jv","~$goog.labs.i18n.ListFormatSymbols_fr_SN","~$goog.labs.i18n.ListFormatSymbols_en_MG","~$goog.labs.i18n.ListFormatSymbols-dyo-SN","~$goog.labs.i18n.ListFormatSymbols_en_KI","~$goog.labs.i18n.ListFormatSymbols-en-BS","~$goog.labs.i18n.ListFormatSymbols_fr_CI","~$goog.labs.i18n.ListFormatSymbols-nn","~$goog.labs.i18n.ListFormatSymbols_dyo_SN","~$goog.labs.i18n.ListFormatSymbols-ebu","~$goog.labs.i18n.ListFormatSymbols_fr_RW","~$goog.labs.i18n.ListFormatSymbols-kea","~$goog.labs.i18n.ListFormatSymbols-en-NA","~$goog.labs.i18n.ListFormatSymbols_fr_MA","~$goog.labs.i18n.ListFormatSymbols_tzm_MA","~$goog.labs.i18n.ListFormatSymbols-fr-PF","~$goog.labs.i18n.ListFormatSymbols-en-GM","~$goog.labs.i18n.ListFormatSymbols_mzn","~$goog.labs.i18n.ListFormatSymbols-ky-KG","~$goog.labs.i18n.ListFormatSymbols_ca_ES","~$goog.labs.i18n.ListFormatSymbols-ar-PS","~$goog.labs.i18n.ListFormatSymbols-nnh","~$goog.labs.i18n.ListFormatSymbols-ar-BH","~$goog.labs.i18n.ListFormatSymbols_ar_YE","~$goog.labs.i18n.ListFormatSymbols_ar_DJ","~$goog.labs.i18n.ListFormatSymbols-uz-Latn-UZ","~$goog.labs.i18n.ListFormatSymbols_so_DJ","~$goog.labs.i18n.ListFormatSymbols-rm","~$goog.labs.i18n.ListFormatSymbols_en_JE","~$goog.labs.i18n.ListFormatSymbols_as","~$goog.labs.i18n.ListFormatSymbols_tr_CY","~$goog.labs.i18n.ListFormatSymbols-pt-CH","~$goog.labs.i18n.ListFormatSymbols-en-PN","~$goog.labs.i18n.ListFormatSymbols-twq-NE","~$goog.labs.i18n.ListFormatSymbols_ses_ML","~$goog.labs.i18n.ListFormatSymbols-fa-IR","~$goog.labs.i18n.ListFormatSymbols_mzn_IR","~$goog.labs.i18n.ListFormatSymbols-os-RU","~$goog.labs.i18n.ListFormatSymbols_es_PH","~$goog.labs.i18n.ListFormatSymbols-ur-IN","~$goog.labs.i18n.ListFormatSymbols-agq","~$goog.labs.i18n.ListFormatSymbols-hr-HR","~$goog.labs.i18n.ListFormatSymbols_ebu_KE","~$goog.labs.i18n.ListFormatSymbols_ar_TN","~$goog.labs.i18n.ListFormatSymbols-ln-CD","~$goog.labs.i18n.ListFormatSymbols_kkj_CM","~$goog.labs.i18n.ListFormatSymbols_fr_TD","~$goog.labs.i18n.ListFormatSymbols-mua","~$goog.labs.i18n.ListFormatSymbols_shi_Tfng","~$goog.labs.i18n.ListFormatSymbols-sr-Cyrl-XK","~$goog.labs.i18n.ListFormatSymbols_fr_GA","~$goog.labs.i18n.ListFormatSymbols_el_GR","~$goog.labs.i18n.ListFormatSymbols_fy_NL","~$goog.labs.i18n.ListFormatSymbols_seh","~$goog.labs.i18n.ListFormatSymbols_fr_NC","~$goog.labs.i18n.ListFormatSymbols_ko_KP","~$goog.labs.i18n.ListFormatSymbols_en_TO","~$goog.labs.i18n.ListFormatSymbols_ps","~$goog.labs.i18n.ListFormatSymbols_saq_KE","~$goog.labs.i18n.ListFormatSymbols-hsb","~$goog.labs.i18n.ListFormatSymbols_sn","~$goog.labs.i18n.ListFormatSymbols-yue-Hant-HK","~$goog.labs.i18n.ListFormatSymbols-ce-RU","~$goog.labs.i18n.ListFormatSymbols_ar_LY","~$goog.labs.i18n.ListFormatSymbols-fr-TD","~$goog.labs.i18n.ListFormatSymbols_sd_PK","~$goog.labs.i18n.ListFormatSymbols-sw-UG","~$goog.labs.i18n.ListFormatSymbols_ee_GH","~$goog.labs.i18n.ListFormatSymbols-ti","~$goog.labs.i18n.ListFormatSymbols-jv-ID","~$goog.labs.i18n.ListFormatSymbols-en-BW","~$goog.labs.i18n.ListFormatSymbols_az_Latn_AZ","~$goog.labs.i18n.ListFormatSymbols_ky_KG","~$goog.labs.i18n.ListFormatSymbols-ar-QA","~$goog.labs.i18n.ListFormatSymbols_lag_TZ","~$goog.labs.i18n.ListFormatSymbols-fr-MF","~$goog.labs.i18n.ListFormatSymbols_fr_BF","~$goog.labs.i18n.ListFormatSymbols_it_VA","~$goog.labs.i18n.ListFormatSymbols_ksh_DE","~$goog.labs.i18n.ListFormatSymbols_ast_ES","~$goog.labs.i18n.ListFormatSymbols_es_HN","~$goog.labs.i18n.ListFormatSymbols_teo_UG","~$goog.labs.i18n.ListFormatSymbols-es-UY","~$goog.labs.i18n.ListFormatSymbols-en-DK","~$goog.labs.i18n.ListFormatSymbols_en_UM","~$goog.labs.i18n.ListFormatSymbols_nl_SR","~$goog.labs.i18n.ListFormatSymbols-en-US-POSIX","~$goog.labs.i18n.ListFormatSymbols-fy","~$goog.labs.i18n.ListFormatSymbols-so-KE","~$goog.labs.i18n.ListFormatSymbols-ff-Latn","~$goog.labs.i18n.ListFormatSymbols_fo","~$goog.labs.i18n.ListFormatSymbols-en-LR","~$goog.labs.i18n.ListFormatSymbols-en-ER","~$goog.labs.i18n.ListFormatSymbols_sr_Cyrl_BA","~$goog.labs.i18n.ListFormatSymbols-fr-FR","~$goog.labs.i18n.ListFormatSymbols-dua","~$goog.labs.i18n.ListFormatSymbols-en-SZ","~$goog.labs.i18n.ListFormatSymbols-fr-GA","~$goog.labs.i18n.ListFormatSymbols-qu-EC","~$goog.labs.i18n.ListFormatSymbols-es-EA","~$goog.labs.i18n.ListFormatSymbols_en_NA","~$goog.labs.i18n.ListFormatSymbols_uz_Arab","~$goog.labs.i18n.ListFormatSymbols_fr_CG","~$goog.labs.i18n.ListFormatSymbols_ps_PK","~$goog.labs.i18n.ListFormatSymbols_tg_TJ","~$goog.labs.i18n.ListFormatSymbols_ta_SG","~$goog.labs.i18n.ListFormatSymbols-nn-NO","~$goog.labs.i18n.ListFormatSymbols_nnh_CM","~$goog.labs.i18n.ListFormatSymbols-fr-RE","~$goog.labs.i18n.ListFormatSymbols_rm_CH","~$goog.labs.i18n.ListFormatSymbols_en_GM","~$goog.labs.i18n.ListFormatSymbols_zh_Hans_HK","~$goog.labs.i18n.ListFormatSymbols-ha","~$goog.labs.i18n.ListFormatSymbols_yue","~$goog.labs.i18n.ListFormatSymbols_sl_SI","~$goog.labs.i18n.ListFormatSymbols_ru_RU","~$goog.labs.i18n.ListFormatSymbols_ar_QA","~$goog.labs.i18n.ListFormatSymbols_zh_Hans","~$goog.labs.i18n.ListFormatSymbols-ses-ML","~$goog.labs.i18n.ListFormatSymbols_ar_SS","~$goog.labs.i18n.ListFormatSymbols-ka-GE","~$goog.labs.i18n.ListFormatSymbols-fr-NE","~$goog.labs.i18n.ListFormatSymbols-ebu-KE","~$goog.labs.i18n.ListFormatSymbols_sw_UG","~$goog.labs.i18n.ListFormatSymbols_en_TT","~$goog.labs.i18n.ListFormatSymbols_ak_GH","~$goog.labs.i18n.ListFormatSymbols_en_BS","~$goog.labs.i18n.ListFormatSymbols-fr-TN","~$goog.labs.i18n.ListFormatSymbols_fur_IT","~$goog.labs.i18n.ListFormatSymbols_fr_DJ","~$goog.labs.i18n.ListFormatSymbols_vai_Vaii","~$goog.labs.i18n.ListFormatSymbols-ti-ER","~$goog.labs.i18n.ListFormatSymbols_ff_Latn_NE","~$goog.labs.i18n.ListFormatSymbols_vai_Latn_LR","~$goog.labs.i18n.ListFormatSymbols-ti-ET","~$goog.labs.i18n.ListFormatSymbols_nds_DE","~$goog.labs.i18n.ListFormatSymbols-dz","~$goog.labs.i18n.ListFormatSymbols_eo_001","~$goog.labs.i18n.ListFormatSymbols-ne-IN","~$goog.labs.i18n.ListFormatSymbols_es_BZ","~$goog.labs.i18n.ListFormatSymbols_sah_RU","~$goog.labs.i18n.ListFormatSymbols_pa_Arab","~$goog.labs.i18n.ListFormatSymbols-ar-IQ","~$goog.labs.i18n.ListFormatSymbols_es_PR","~$goog.labs.i18n.ListFormatSymbols_de_DE","~$goog.labs.i18n.ListFormatSymbols_dua","~$goog.labs.i18n.ListFormatSymbols-es-CL","~$goog.labs.i18n.ListFormatSymbols_be_BY","~$goog.labs.i18n.ListFormatSymbols_fr_MF","~$goog.labs.i18n.ListFormatSymbols-mgo","~$goog.labs.i18n.ListFormatSymbols_ru_KG","~$goog.labs.i18n.ListFormatSymbols_bo","~$goog.labs.i18n.ListFormatSymbols_rn_BI","~$goog.labs.i18n.ListFormatSymbols_nds","~$goog.labs.i18n.ListFormatSymbols-ia-001","~$goog.labs.i18n.ListFormatSymbols-ro-RO","~$goog.labs.i18n.ListFormatSymbols_ar_MR","~$goog.labs.i18n.ListFormatSymbols_en_DK","~$goog.labs.i18n.ListFormatSymbols_kw","~$goog.labs.i18n.ListFormatSymbols_mg_MG","~$goog.labs.i18n.ListFormatSymbols-as-IN","~$goog.labs.i18n.ListFormatSymbols_fr_RE","~$goog.labs.i18n.ListFormatSymbols-jv","~$goog.labs.i18n.ListFormatSymbols-zh-Hans-HK","~$goog.labs.i18n.ListFormatSymbols_en_NR","~$goog.labs.i18n.ListFormatSymbols-kln-KE","~$goog.labs.i18n.ListFormatSymbols-en-SX","~$goog.labs.i18n.ListFormatSymbols_mt_MT","~$goog.labs.i18n.ListFormatSymbols_es_SV","~$goog.labs.i18n.ListFormatSymbols-ar-LY","~$goog.labs.i18n.ListFormatSymbols_sr_Cyrl_RS","~$goog.labs.i18n.ListFormatSymbols_en_CC","~$goog.labs.i18n.ListFormatSymbols_agq_CM","~$goog.labs.i18n.ListFormatSymbols-lrc-IR","~$goog.labs.i18n.ListFormatSymbols_shi_Latn_MA","~$goog.labs.i18n.ListFormatSymbols_mas_KE","~$goog.labs.i18n.ListFormatSymbols-khq","~$goog.labs.i18n.ListFormatSymbols-ko-KR","~$goog.labs.i18n.ListFormatSymbols_bez","~$goog.labs.i18n.ListFormatSymbols-kk-KZ","~$goog.labs.i18n.ListFormatSymbols_en_GH","~$goog.labs.i18n.ListFormatSymbols_ru_KZ","~$goog.labs.i18n.ListFormatSymbols-shi","~$goog.labs.i18n.ListFormatSymbols_ar_LB","~$goog.labs.i18n.ListFormatSymbols-fr-HT","~$goog.labs.i18n.ListFormatSymbols-luo","~$goog.labs.i18n.ListFormatSymbols_ar_EH","~$goog.labs.i18n.ListFormatSymbols-bo-CN","~$goog.labs.i18n.ListFormatSymbols_rwk","~$goog.labs.i18n.ListFormatSymbols_en_AG","~$goog.labs.i18n.ListFormatSymbols-fr-BF","~$goog.labs.i18n.ListFormatSymbols_dje_NE","~$goog.labs.i18n.ListFormatSymbols-tg-TJ","~$goog.labs.i18n.ListFormatSymbols-az-Latn-AZ","~$goog.labs.i18n.ListFormatSymbols-mer-KE","~$goog.labs.i18n.ListFormatSymbols-en-SC","~$goog.labs.i18n.ListFormatSymbols_ar_JO","~$goog.labs.i18n.ListFormatSymbols-hu-HU","~$goog.labs.i18n.ListFormatSymbols-en-MO","~$goog.labs.i18n.ListFormatSymbols_yav","~$goog.labs.i18n.ListFormatSymbols_en_SZ","~$goog.labs.i18n.ListFormatSymbols_fr_CD","~$goog.labs.i18n.ListFormatSymbols_vi_VN","~$goog.labs.i18n.ListFormatSymbols_ar_001","~$goog.labs.i18n.ListFormatSymbols_sg_CF","~$goog.labs.i18n.ListFormatSymbols-nyn-UG","~$goog.labs.i18n.ListFormatSymbols-ii","~$goog.labs.i18n.ListFormatSymbols-kok-IN","~$goog.labs.i18n.ListFormatSymbols-se","~$goog.labs.i18n.ListFormatSymbols-dje-NE","~$goog.labs.i18n.ListFormatSymbols-hr-BA","~$goog.labs.i18n.ListFormatSymbols_ha_NE","~$goog.labs.i18n.ListFormatSymbols_fr_MR","~$goog.labs.i18n.ListFormatSymbols-ar-EH","~$goog.labs.i18n.ListFormatSymbols-ig","~$goog.labs.i18n.ListFormatSymbols-zh-Hans","~$goog.labs.i18n.ListFormatSymbols_ja_JP","~$goog.labs.i18n.ListFormatSymbols_lv_LV","~$goog.labs.i18n.ListFormatSymbols_sr_Latn_XK","~$goog.labs.i18n.ListFormatSymbols_en_FJ","~$goog.labs.i18n.ListFormatSymbols-lu","~$goog.labs.i18n.ListFormatSymbols_gd","~$goog.labs.i18n.ListFormatSymbols-pl-PL","~$goog.labs.i18n.ListFormatSymbols-ar-TD","~$goog.labs.i18n.ListFormatSymbols-luo-KE","~$goog.labs.i18n.ListFormatSymbols-nds-DE","~$goog.labs.i18n.ListFormatSymbols-sl-SI","~$goog.labs.i18n.ListFormatSymbols_af_NA","~$goog.labs.i18n.ListFormatSymbols-cgg","~$goog.labs.i18n.ListFormatSymbols_bn_IN","~$goog.labs.i18n.ListFormatSymbols_en_UG","~$goog.labs.i18n.ListFormatSymbols_en_IL","~$goog.labs.i18n.ListFormatSymbols-ses","~$goog.labs.i18n.ListFormatSymbols_ff_Latn_GM","~$goog.labs.i18n.ListFormatSymbols_pa_Guru","~$goog.labs.i18n.ListFormatSymbols_gv","~$goog.labs.i18n.ListFormatSymbols-yue-Hant","~$goog.labs.i18n.ListFormatSymbols-se-SE","~$goog.labs.i18n.ListFormatSymbols_bas","~$goog.labs.i18n.ListFormatSymbols-yav","~$goog.labs.i18n.ListFormatSymbols_dsb","~$goog.labs.i18n.ListFormatSymbols_en_ER","~$goog.labs.i18n.ListFormatSymbols_chr_US","~$goog.labs.i18n.ListFormatSymbols-en-SL","~$goog.labs.i18n.ListFormatSymbols_ff_Latn_LR","~$goog.labs.i18n.ListFormatSymbols-en-TK","~$goog.labs.i18n.ListFormatSymbols-bez-TZ","~$goog.labs.i18n.ListFormatSymbols_dje","~$goog.labs.i18n.ListFormatSymbols-fr-MU","~$goog.labs.i18n.ListFormatSymbols-sr-Cyrl-BA","~$goog.labs.i18n.ListFormatSymbols_yo","~$goog.labs.i18n.ListFormatSymbols_uz_Cyrl","~$goog.labs.i18n.ListFormatSymbols_ar_IQ","~$goog.labs.i18n.ListFormatSymbols-dz-BT","~$goog.labs.i18n.ListFormatSymbols-el-GR","~$goog.labs.i18n.ListFormatSymbols-ga-IE","~$goog.labs.i18n.ListFormatSymbols_ff_Latn_GN","~$goog.labs.i18n.ListFormatSymbols_fr_TG","~$goog.labs.i18n.ListFormatSymbols_pt_AO","~$goog.labs.i18n.ListFormatSymbols-bem-ZM","~$goog.labs.i18n.ListFormatSymbols-jmc-TZ","~$goog.labs.i18n.ListFormatSymbols_ha","~$goog.labs.i18n.ListFormatSymbols-ha-NE","~$goog.labs.i18n.ListFormatSymbols_rw","~$goog.labs.i18n.ListFormatSymbols_sw_TZ","~$goog.labs.i18n.ListFormatSymbols-so-ET","~$goog.labs.i18n.ListFormatSymbols_zh_Hans_MO","~$goog.labs.i18n.ListFormatSymbols-en-HK","~$goog.labs.i18n.ListFormatSymbols_ak","~$goog.labs.i18n.ListFormatSymbols-lb","~$goog.labs.i18n.ListFormatSymbols-en-KY","~$goog.labs.i18n.ListFormatSymbols-dyo","~$goog.labs.i18n.ListFormatSymbols_es_DO","~$goog.labs.i18n.ListFormatSymbols-dav-KE","~$goog.labs.i18n.ListFormatSymbols-cy-GB","~$goog.labs.i18n.ListFormatSymbols_es_BO","~$goog.labs.i18n.ListFormatSymbols-mua-CM","~$goog.labs.i18n.ListFormatSymbols-tk-TM","~$goog.labs.i18n.ListFormatSymbols-ff-Latn-NG","~$goog.labs.i18n.ListFormatSymbols_ksh","~$goog.labs.i18n.ListFormatSymbols-gsw-LI","~$goog.labs.i18n.ListFormatSymbols-en-MP","~$goog.labs.i18n.ListFormatSymbols_bs_Latn","~$goog.labs.i18n.ListFormatSymbols-zh-Hans-SG","~$goog.labs.i18n.ListFormatSymbols-bn-BD","~$goog.labs.i18n.ListFormatSymbols-en-SI","~$goog.labs.i18n.ListFormatSymbols-zh-Hans-CN","~$goog.labs.i18n.ListFormatSymbols_nb_NO","~$goog.labs.i18n.ListFormatSymbols-fr-GQ","~$goog.labs.i18n.ListFormatSymbols_sq_MK","~$goog.labs.i18n.ListFormatSymbols-ar-MA","~$goog.labs.i18n.ListFormatSymbols-vi-VN","~$goog.labs.i18n.ListFormatSymbols-fr-GP","~$goog.labs.i18n.ListFormatSymbols_de_LU","~$goog.labs.i18n.ListFormatSymbols-fr-KM","~$goog.labs.i18n.ListFormatSymbols_kln_KE","~$goog.labs.i18n.ListFormatSymbols_lkt","~$goog.labs.i18n.ListFormatSymbols_bs_Latn_BA","~$goog.labs.i18n.ListFormatSymbols_mas","~$goog.labs.i18n.ListFormatSymbols_qu","~$goog.labs.i18n.ListFormatSymbols_mg","~$goog.labs.i18n.ListFormatSymbols-es-BR","~$goog.labs.i18n.ListFormatSymbols-gu-IN","~$goog.labs.i18n.ListFormatSymbols-rw-RW"]],"^1",true,"^2",["^3","^5>"]],["^ ","^7",[1579837703000],"^8","goog.structs.pool.js","^9",["^:","goog/structs/pool.js"],"^;","goog/structs/pool.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Datastructure: Pool.\n *\n *\n * A generic class for handling pools of objects.\n * When an object is released, it is attempted to be reused.\n */\n\n\ngoog.provide('goog.structs.Pool');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.structs.Queue');\ngoog.require('goog.structs.Set');\n\n\n\n/**\n * A generic pool class. If min is greater than max, an error is thrown.\n * @param {number=} opt_minCount Min. number of objects (Default: 0).\n * @param {number=} opt_maxCount Max. number of objects (Default: 10).\n * @constructor\n * @extends {goog.Disposable}\n * @template T\n */\ngoog.structs.Pool = function(opt_minCount, opt_maxCount) {\n  goog.Disposable.call(this);\n\n  /**\n   * Minimum number of objects allowed\n   * @private {number}\n   */\n  this.minCount_ = opt_minCount || 0;\n\n  /**\n   * Maximum number of objects allowed\n   * @private {number}\n   */\n  this.maxCount_ = opt_maxCount || 10;\n\n  // Make sure that the max and min constraints are valid.\n  if (this.minCount_ > this.maxCount_) {\n    throw new Error(goog.structs.Pool.ERROR_MIN_MAX_);\n  }\n\n  /**\n   * Set used to store objects that are currently in the pool and available\n   * to be used.\n   * @private {goog.structs.Queue<T>}\n   */\n  this.freeQueue_ = new goog.structs.Queue();\n\n  /**\n   * Set used to store objects that are currently in the pool and in use.\n   * @private {goog.structs.Set<T>}\n   */\n  this.inUseSet_ = new goog.structs.Set();\n\n  /**\n   * The minimum delay between objects being made available, in milliseconds. If\n   * this is 0, no minimum delay is enforced.\n   * @protected {number}\n   */\n  this.delay = 0;\n\n  /**\n   * The time of the last object being made available, in milliseconds since the\n   * epoch (i.e., the result of Date#toTime). If this is null, no access has\n   * occurred yet.\n   * @protected {number?}\n   */\n  this.lastAccess = null;\n\n  // Make sure that the minCount constraint is satisfied.\n  this.adjustForMinMax();\n};\ngoog.inherits(goog.structs.Pool, goog.Disposable);\n\n\n/**\n * Error to throw when the max/min constraint is attempted to be invalidated.\n * I.e., when it is attempted for maxCount to be less than minCount.\n * @type {string}\n * @private\n */\ngoog.structs.Pool.ERROR_MIN_MAX_ =\n    '[goog.structs.Pool] Min can not be greater than max';\n\n\n/**\n * Error to throw when the Pool is attempted to be disposed and it is asked to\n * make sure that there are no objects that are in use (i.e., haven't been\n * released).\n * @type {string}\n * @private\n */\ngoog.structs.Pool.ERROR_DISPOSE_UNRELEASED_OBJS_ =\n    '[goog.structs.Pool] Objects not released';\n\n\n/**\n * Sets the minimum count of the pool.\n * If min is greater than the max count of the pool, an error is thrown.\n * @param {number} min The minimum count of the pool.\n */\ngoog.structs.Pool.prototype.setMinimumCount = function(min) {\n  // Check count constraints.\n  if (min > this.maxCount_) {\n    throw new Error(goog.structs.Pool.ERROR_MIN_MAX_);\n  }\n  this.minCount_ = min;\n\n  // Adjust the objects in the pool as needed.\n  this.adjustForMinMax();\n};\n\n\n/**\n * Sets the maximum count of the pool.\n * If max is less than the min count of the pool, an error is thrown.\n * @param {number} max The maximum count of the pool.\n */\ngoog.structs.Pool.prototype.setMaximumCount = function(max) {\n  // Check count constraints.\n  if (max < this.minCount_) {\n    throw new Error(goog.structs.Pool.ERROR_MIN_MAX_);\n  }\n  this.maxCount_ = max;\n\n  // Adjust the objects in the pool as needed.\n  this.adjustForMinMax();\n};\n\n\n/**\n * Sets the minimum delay between objects being returned by getObject, in\n * milliseconds. This defaults to zero, meaning that no minimum delay is\n * enforced and objects may be used as soon as they're available.\n * @param {number} delay The minimum delay, in milliseconds.\n */\ngoog.structs.Pool.prototype.setDelay = function(delay) {\n  this.delay = delay;\n};\n\n\n/**\n * @return {T|undefined} A new object from the pool if there is one available,\n *     otherwise undefined.\n */\ngoog.structs.Pool.prototype.getObject = function() {\n  var time = goog.now();\n  if (this.lastAccess != null && time - this.lastAccess < this.delay) {\n    return undefined;\n  }\n\n  var obj = this.removeFreeObject_();\n  if (obj) {\n    this.lastAccess = time;\n    this.inUseSet_.add(obj);\n  }\n\n  return obj;\n};\n\n\n/**\n * Returns an object to the pool of available objects so that it can be reused.\n * @param {T} obj The object to return to the pool of free objects.\n * @return {boolean} Whether the object was found in the Pool's set of in-use\n *     objects (in other words, whether any action was taken).\n */\ngoog.structs.Pool.prototype.releaseObject = function(obj) {\n  if (this.inUseSet_.remove(obj)) {\n    this.addFreeObject(obj);\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Removes a free object from the collection of objects that are free so that it\n * can be used.\n *\n * NOTE: This method does not mark the returned object as in use.\n *\n * @return {T|undefined} The object removed from the free collection, if there\n *     is one available. Otherwise, undefined.\n * @private\n */\ngoog.structs.Pool.prototype.removeFreeObject_ = function() {\n  var obj;\n  while (this.getFreeCount() > 0) {\n    obj = this.freeQueue_.dequeue();\n\n    if (!this.objectCanBeReused(obj)) {\n      this.adjustForMinMax();\n    } else {\n      break;\n    }\n  }\n\n  if (!obj && this.getCount() < this.maxCount_) {\n    obj = this.createObject();\n  }\n\n  return obj;\n};\n\n\n/**\n * Adds an object to the collection of objects that are free. If the object can\n * not be added, then it is disposed.\n *\n * @param {T} obj The object to add to collection of free objects.\n */\ngoog.structs.Pool.prototype.addFreeObject = function(obj) {\n  this.inUseSet_.remove(obj);\n  if (this.objectCanBeReused(obj) && this.getCount() < this.maxCount_) {\n    this.freeQueue_.enqueue(obj);\n  } else {\n    this.disposeObject(obj);\n  }\n};\n\n\n/**\n * Adjusts the objects held in the pool to be within the min/max constraints.\n *\n * NOTE: It is possible that the number of objects in the pool will still be\n * greater than the maximum count of objects allowed. This will be the case\n * if no more free objects can be disposed of to get below the minimum count\n * (i.e., all objects are in use).\n */\ngoog.structs.Pool.prototype.adjustForMinMax = function() {\n  var freeQueue = this.freeQueue_;\n\n  // Make sure the at least the minimum number of objects are created.\n  while (this.getCount() < this.minCount_) {\n    freeQueue.enqueue(this.createObject());\n  }\n\n  // Make sure no more than the maximum number of objects are created.\n  while (this.getCount() > this.maxCount_ && this.getFreeCount() > 0) {\n    this.disposeObject(freeQueue.dequeue());\n  }\n};\n\n\n/**\n * Should be overridden by sub-classes to return an instance of the object type\n * that is expected in the pool.\n * @return {T} The created object.\n */\ngoog.structs.Pool.prototype.createObject = function() {\n  return {};\n};\n\n\n/**\n * Should be overridden to dispose of an object. Default implementation is to\n * remove all its members, which should render it useless. Calls the object's\n * `dispose()` method, if available.\n * @param {T} obj The object to dispose.\n */\ngoog.structs.Pool.prototype.disposeObject = function(obj) {\n  if (typeof obj.dispose == 'function') {\n    obj.dispose();\n  } else {\n    for (var i in obj) {\n      obj[i] = null;\n    }\n  }\n};\n\n\n/**\n * Should be overridden to determine whether an object has become unusable and\n * should not be returned by getObject(). Calls the object's\n * `canBeReused()`  method, if available.\n * @param {T} obj The object to test.\n * @return {boolean} Whether the object can be reused.\n */\ngoog.structs.Pool.prototype.objectCanBeReused = function(obj) {\n  if (typeof obj.canBeReused == 'function') {\n    return obj.canBeReused();\n  }\n  return true;\n};\n\n\n/**\n * Returns true if the given object is in the pool.\n * @param {T} obj The object to check the pool for.\n * @return {boolean} Whether the pool contains the object.\n */\ngoog.structs.Pool.prototype.contains = function(obj) {\n  return this.freeQueue_.contains(obj) || this.inUseSet_.contains(obj);\n};\n\n\n/**\n * Returns the number of objects currently in the pool.\n * @return {number} Number of objects currently in the pool.\n */\ngoog.structs.Pool.prototype.getCount = function() {\n  return this.freeQueue_.getCount() + this.inUseSet_.getCount();\n};\n\n\n/**\n * Returns the number of objects currently in use in the pool.\n * @return {number} Number of objects currently in use in the pool.\n */\ngoog.structs.Pool.prototype.getInUseCount = function() {\n  return this.inUseSet_.getCount();\n};\n\n\n/**\n * Returns the number of objects currently free in the pool.\n * @return {number} Number of objects currently free in the pool.\n */\ngoog.structs.Pool.prototype.getFreeCount = function() {\n  return this.freeQueue_.getCount();\n};\n\n\n/**\n * Determines if the pool contains no objects.\n * @return {boolean} Whether the pool contains no objects.\n */\ngoog.structs.Pool.prototype.isEmpty = function() {\n  return this.freeQueue_.isEmpty() && this.inUseSet_.isEmpty();\n};\n\n\n/**\n * Disposes of the pool and all objects currently held in the pool.\n * @override\n * @protected\n */\ngoog.structs.Pool.prototype.disposeInternal = function() {\n  goog.structs.Pool.superClass_.disposeInternal.call(this);\n  if (this.getInUseCount() > 0) {\n    throw new Error(goog.structs.Pool.ERROR_DISPOSE_UNRELEASED_OBJS_);\n  }\n  delete this.inUseSet_;\n\n  // Call disposeObject on each object held by the pool.\n  var freeQueue = this.freeQueue_;\n  while (!freeQueue.isEmpty()) {\n    this.disposeObject(freeQueue.dequeue());\n  }\n  delete this.freeQueue_;\n};\n","^?",1579837703000,"^@",["^A",["^3","^3C","~$goog.structs.Queue","^1T"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/pool.js"],"^S",["^A",["~$goog.structs.Pool"]],"^1",true,"^2",["^3","^3C","^RZ","^1T"]],["^ ","^7",[1579837703000],"^8","goog.ui.emoji.emoji.js","^9",["^:","goog/ui/emoji/emoji.js"],"^;","goog/ui/emoji/emoji.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Emoji implementation.\n *\n */\n\ngoog.provide('goog.ui.emoji.Emoji');\n\n\n\n/**\n * Creates an emoji.\n *\n * A simple wrapper for an emoji.\n *\n * @param {string} url URL pointing to the source image for the emoji.\n * @param {string} id The id of the emoji, e.g., 'std.1'.\n * @param {number=} opt_height The height of the emoji, if undefined the\n *     natural height of the emoji is used.\n * @param {number=} opt_width The width of the emoji, if undefined the natural\n *     width of the emoji is used.\n * @param {string=} opt_altText The alt text for the emoji image, eg. the\n *     unicode character representation of the emoji.\n * @constructor\n * @final\n */\ngoog.ui.emoji.Emoji = function(url, id, opt_height, opt_width, opt_altText) {\n  /**\n   * The URL pointing to the source image for the emoji\n   *\n   * @type {string}\n   * @private\n   */\n  this.url_ = url;\n\n  /**\n   * The id of the emoji\n   *\n   * @type {string}\n   * @private\n   */\n  this.id_ = id;\n\n  /**\n   * The height of the emoji\n   *\n   * @type {?number}\n   * @private\n   */\n  this.height_ = opt_height || null;\n\n  /**\n   * The width of the emoji\n   *\n   * @type {?number}\n   * @private\n   */\n  this.width_ = opt_width || null;\n\n  /**\n   * The unicode of the emoji\n   *\n   * @type {?string}\n   * @private\n   */\n  this.altText_ = opt_altText || null;\n};\n\n\n/**\n * The name of the goomoji attribute, used for emoji image elements.\n * @type {string}\n * @deprecated Use goog.ui.emoji.Emoji.DATA_ATTRIBUTE instead.\n */\ngoog.ui.emoji.Emoji.ATTRIBUTE = 'goomoji';\n\n\n/**\n * The name of the goomoji data-attribute, used for emoji image elements. Data\n * attributes are the preferred way in HTML5 to set custom attributes.\n * @type {string}\n */\ngoog.ui.emoji.Emoji.DATA_ATTRIBUTE = 'data-' + goog.ui.emoji.Emoji.ATTRIBUTE;\n\n\n/**\n * @return {string} The URL for this emoji.\n */\ngoog.ui.emoji.Emoji.prototype.getUrl = function() {\n  return this.url_;\n};\n\n\n/**\n * @return {string} The id of this emoji.\n */\ngoog.ui.emoji.Emoji.prototype.getId = function() {\n  return this.id_;\n};\n\n\n/**\n * @return {?number} The height of this emoji.\n */\ngoog.ui.emoji.Emoji.prototype.getHeight = function() {\n  return this.height_;\n};\n\n\n/**\n * @return {?number} The width of this emoji.\n */\ngoog.ui.emoji.Emoji.prototype.getWidth = function() {\n  return this.width_;\n};\n\n\n/**\n * @return {?string} The alt text for the emoji image, eg. the unicode character\n *     representation of the emoji.\n */\ngoog.ui.emoji.Emoji.prototype.getAltText = function() {\n  return this.altText_;\n};\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/emoji/emoji.js"],"^S",["^A",["~$goog.ui.emoji.Emoji"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.dom.animationframe.animationframe.js","^9",["^:","goog/dom/animationframe/animationframe.js"],"^;","goog/dom/animationframe/animationframe.js","^<","^=","^>","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview goog.dom.animationFrame permits work to be done in-sync with\n * the render refresh rate of the browser and to divide work up globally based\n * on whether the intent is to measure or to mutate the DOM. The latter avoids\n * repeated style recalculation which can be really slow.\n *\n * Goals of the API:\n * <ul>\n *   <li>Make it easy to schedule work for the next animation frame.\n *   <li>Make it easy to only do work once per animation frame, even if two\n *       events fire that trigger the same work.\n *   <li>Make it easy to do all work in two phases to avoid repeated style\n *       recalculation caused by interleaved reads and writes.\n *   <li>Avoid creating closures per schedule operation.\n * </ul>\n *\n *\n * Programmatic:\n * <pre>\n * let animationTask = goog.dom.animationFrame.createTask(\n *     {\n *       measure: function(state) {\n *         state.width = goog.style.getSize(elem).width;\n *         this.animationTask();\n *       },\n *       mutate: function(state) {\n *         goog.style.setWidth(elem, Math.floor(state.width / 2));\n *       },\n *     },\n *     this);\n * </pre>\n *\n * See also\n * https://developer.mozilla.org/en-US/docs/Web/API/window.requestAnimationFrame\n */\n\ngoog.provide('goog.dom.animationFrame');\ngoog.provide('goog.dom.animationFrame.Spec');\ngoog.provide('goog.dom.animationFrame.State');\n\ngoog.require('goog.dom.animationFrame.polyfill');\n\n// Install the polyfill.\ngoog.dom.animationFrame.polyfill.install();\n\n\n/**\n * @typedef {{\n *   id: number,\n *   fn: !Function,\n *   context: (!Object|undefined)\n * }}\n * @private\n */\ngoog.dom.animationFrame.Task_;\n\n\n/**\n * @typedef {{\n *   measureTask: goog.dom.animationFrame.Task_,\n *   mutateTask: goog.dom.animationFrame.Task_,\n *   state: (!Object|undefined),\n *   args: (!Array|undefined),\n *   isScheduled: boolean\n * }}\n * @private\n */\ngoog.dom.animationFrame.TaskSet_;\n\n\n/**\n * @typedef {{\n *   measure: (!Function|undefined),\n *   mutate: (!Function|undefined)\n * }}\n */\ngoog.dom.animationFrame.Spec;\n\n\n\n/**\n * A type to represent state. Users may add properties as desired.\n * @constructor\n * @final\n */\ngoog.dom.animationFrame.State = function() {};\n\n\n/**\n * Saves a set of tasks to be executed in the next requestAnimationFrame phase.\n * This list is initialized once before any event firing occurs. It is not\n * affected by the fired events or the requestAnimationFrame processing (unless\n * a new event is created during the processing).\n * @private {!Array<!Array<goog.dom.animationFrame.TaskSet_>>}\n */\ngoog.dom.animationFrame.tasks_ = [[], []];\n\n\n/**\n * Values are 0 or 1, for whether the first or second array should be used to\n * lookup or add tasks.\n * @private {number}\n */\ngoog.dom.animationFrame.doubleBufferIndex_ = 0;\n\n\n/**\n * Whether we have already requested an animation frame that hasn't happened\n * yet.\n * @private {boolean}\n */\ngoog.dom.animationFrame.requestedFrame_ = false;\n\n\n/**\n * Counter to generate IDs for tasks.\n * @private {number}\n */\ngoog.dom.animationFrame.taskId_ = 0;\n\n\n/**\n * Whether the animationframe runTasks_ loop is currently running.\n * @private {boolean}\n */\ngoog.dom.animationFrame.running_ = false;\n\n\n/**\n * Returns a function that schedules the two passed-in functions to be run upon\n * the next animation frame. Calling the function again during the same\n * animation frame does nothing.\n *\n * The function under the \"measure\" key will run first and together with all\n * other functions scheduled under this key and the function under \"mutate\" will\n * run after that.\n *\n * @param {{\n *   measure: (function(this:THIS, !goog.dom.animationFrame.State)|undefined),\n *   mutate: (function(this:THIS, !goog.dom.animationFrame.State)|undefined)\n * }} spec\n * @param {THIS=} opt_context Context in which to run the function.\n * @return {function(...?)}\n * @template THIS\n */\ngoog.dom.animationFrame.createTask = function(spec, opt_context) {\n  var id = goog.dom.animationFrame.taskId_++;\n  var measureTask = {id: id, fn: spec.measure, context: opt_context};\n  var mutateTask = {id: id, fn: spec.mutate, context: opt_context};\n\n  var taskSet = {\n    measureTask: measureTask,\n    mutateTask: mutateTask,\n    state: {},\n    args: undefined,\n    isScheduled: false\n  };\n\n  return function() {\n    // Save args and state.\n    if (arguments.length > 0) {\n      // The state argument goes last. That is kinda horrible but compatible\n      // with {@see wiz.async.method}.\n      if (!taskSet.args) {\n        taskSet.args = [];\n      }\n      taskSet.args.length = 0;\n      taskSet.args.push.apply(taskSet.args, arguments);\n      taskSet.args.push(taskSet.state);\n    } else {\n      if (!taskSet.args || taskSet.args.length == 0) {\n        taskSet.args = [taskSet.state];\n      } else {\n        taskSet.args[0] = taskSet.state;\n        taskSet.args.length = 1;\n      }\n    }\n    if (!taskSet.isScheduled) {\n      taskSet.isScheduled = true;\n      var tasksArray = goog.dom.animationFrame\n                           .tasks_[goog.dom.animationFrame.doubleBufferIndex_];\n      tasksArray.push(\n          /** @type {goog.dom.animationFrame.TaskSet_} */ (taskSet));\n    }\n    goog.dom.animationFrame.requestAnimationFrame_();\n  };\n};\n\n\n/**\n * Run scheduled tasks.\n * @private\n */\ngoog.dom.animationFrame.runTasks_ = function() {\n  goog.dom.animationFrame.running_ = true;\n  goog.dom.animationFrame.requestedFrame_ = false;\n  var tasksArray = goog.dom.animationFrame\n                       .tasks_[goog.dom.animationFrame.doubleBufferIndex_];\n  var taskLength = tasksArray.length;\n\n  // During the runTasks_, if there is a recursive call to queue up more\n  // task(s) for the next frame, we use double-buffering for that.\n  goog.dom.animationFrame.doubleBufferIndex_ =\n      (goog.dom.animationFrame.doubleBufferIndex_ + 1) % 2;\n\n  var task;\n\n  // Run all the measure tasks first.\n  for (var i = 0; i < taskLength; ++i) {\n    task = tasksArray[i];\n    var measureTask = task.measureTask;\n    task.isScheduled = false;\n    if (measureTask.fn) {\n      // TODO (perumaal): Handle any exceptions thrown by the lambda.\n      measureTask.fn.apply(measureTask.context, task.args);\n    }\n  }\n\n  // Run the mutate tasks next.\n  for (var i = 0; i < taskLength; ++i) {\n    task = tasksArray[i];\n    var mutateTask = task.mutateTask;\n    task.isScheduled = false;\n    if (mutateTask.fn) {\n      // TODO (perumaal): Handle any exceptions thrown by the lambda.\n      mutateTask.fn.apply(mutateTask.context, task.args);\n    }\n\n    // Clear state for next vsync.\n    task.state = {};\n  }\n\n  // Clear the tasks array as we have finished processing all the tasks.\n  tasksArray.length = 0;\n  goog.dom.animationFrame.running_ = false;\n};\n\n\n/**\n * @return {boolean} Whether the animationframe is currently running. For use\n *     by callers who need not to delay tasks scheduled during runTasks_ for an\n *     additional frame.\n */\ngoog.dom.animationFrame.isRunning = function() {\n  return goog.dom.animationFrame.running_;\n};\n\n\n/**\n * Request {@see goog.dom.animationFrame.runTasks_} to be called upon the\n * next animation frame if we haven't done so already.\n * @private\n */\ngoog.dom.animationFrame.requestAnimationFrame_ = function() {\n  if (goog.dom.animationFrame.requestedFrame_) {\n    return;\n  }\n  goog.dom.animationFrame.requestedFrame_ = true;\n  window.requestAnimationFrame(goog.dom.animationFrame.runTasks_);\n};\n","^?",1579837703000,"^@",["^A",["~$goog.dom.animationFrame.polyfill","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/animationframe/animationframe.js"],"^S",["^A",["~$goog.dom.animationFrame.Spec","~$goog.dom.animationFrame","~$goog.dom.animationFrame.State"]],"^1",true,"^2",["^3","^S1"]],["^ ","^7",[1579837703000],"^8","goog.ui.charcounter.js","^9",["^:","goog/ui/charcounter.js"],"^;","goog/ui/charcounter.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Character counter widget implementation.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/charcounter.html\n */\n\ngoog.provide('goog.ui.CharCounter');\ngoog.provide('goog.ui.CharCounter.Display');\n\ngoog.require('goog.dom');\ngoog.require('goog.events');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.InputHandler');\n\n\n\n/**\n * CharCounter widget. Counts the number of characters in a input field or a\n * text box and displays the number of additional characters that may be\n * entered before the maximum length is reached.\n *\n * @extends {goog.events.EventTarget}\n * @param {HTMLInputElement|HTMLTextAreaElement} elInput Input or text area\n *     element to count the number of characters in.\n * @param {Element} elCount HTML element to display the remaining number of\n *     characters in. You can pass in null for this if you don't want to expose\n *     the number of chars remaining.\n * @param {number} maxLength The maximum length.\n * @param {goog.ui.CharCounter.Display=} opt_displayMode Display mode for this\n *     char counter. Defaults to {@link goog.ui.CharCounter.Display.REMAINING}.\n * @constructor\n * @final\n */\ngoog.ui.CharCounter = function(elInput, elCount, maxLength, opt_displayMode) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * Input or text area element to count the number of characters in.\n   * @type {HTMLInputElement|HTMLTextAreaElement}\n   * @private\n   */\n  this.elInput_ = elInput;\n\n  /**\n   * HTML element to display the remaining number of characters in.\n   * @type {Element}\n   * @private\n   */\n  this.elCount_ = elCount;\n\n  /**\n   * The maximum length.\n   * @type {number}\n   * @private\n   */\n  this.maxLength_ = maxLength;\n\n  /**\n   * The display mode for this char counter.\n   * @type {!goog.ui.CharCounter.Display}\n   * @private\n   */\n  this.display_ = opt_displayMode || goog.ui.CharCounter.Display.REMAINING;\n\n  elInput.removeAttribute('maxlength');\n\n  /**\n   * The input handler that provides the input event.\n   * @type {goog.events.InputHandler}\n   * @private\n   */\n  this.inputHandler_ = new goog.events.InputHandler(elInput);\n\n  goog.events.listen(\n      this.inputHandler_, goog.events.InputHandler.EventType.INPUT,\n      this.onChange_, false, this);\n\n  this.checkLength();\n};\ngoog.inherits(goog.ui.CharCounter, goog.events.EventTarget);\n\n\n/**\n * Display mode for the char counter.\n * @enum {number}\n */\ngoog.ui.CharCounter.Display = {\n  /** Widget displays the number of characters remaining (the default). */\n  REMAINING: 0,\n  /** Widget displays the number of characters entered. */\n  INCREMENTAL: 1\n};\n\n\n/**\n * Sets the maximum length.\n *\n * @param {number} maxLength The maximum length.\n */\ngoog.ui.CharCounter.prototype.setMaxLength = function(maxLength) {\n  this.maxLength_ = maxLength;\n  this.checkLength();\n};\n\n\n/**\n * Returns the maximum length.\n *\n * @return {number} The maximum length.\n */\ngoog.ui.CharCounter.prototype.getMaxLength = function() {\n  return this.maxLength_;\n};\n\n\n/**\n * Sets the display mode.\n *\n * @param {!goog.ui.CharCounter.Display} displayMode The display mode.\n */\ngoog.ui.CharCounter.prototype.setDisplayMode = function(displayMode) {\n  this.display_ = displayMode;\n  this.checkLength();\n};\n\n\n/**\n * Returns the display mode.\n *\n * @return {!goog.ui.CharCounter.Display} The display mode.\n */\ngoog.ui.CharCounter.prototype.getDisplayMode = function() {\n  return this.display_;\n};\n\n\n/**\n * Change event handler for input field.\n *\n * @param {goog.events.BrowserEvent} event Change event.\n * @private\n */\ngoog.ui.CharCounter.prototype.onChange_ = function(event) {\n  this.checkLength();\n};\n\n\n/**\n * Checks length of text in input field and updates the counter. Truncates text\n * if the maximum lengths is exceeded.\n */\ngoog.ui.CharCounter.prototype.checkLength = function() {\n  var count = this.elInput_.value.length;\n\n  // There's no maxlength property for textareas so instead we truncate the\n  // text if it gets too long. It's also used to truncate the text in a input\n  // field if the maximum length is changed.\n  if (count > this.maxLength_) {\n    var scrollTop = this.elInput_.scrollTop;\n    var scrollLeft = this.elInput_.scrollLeft;\n\n    this.elInput_.value = this.elInput_.value.substring(0, this.maxLength_);\n    count = this.maxLength_;\n\n    this.elInput_.scrollTop = scrollTop;\n    this.elInput_.scrollLeft = scrollLeft;\n  }\n\n  if (this.elCount_) {\n    var incremental = this.display_ == goog.ui.CharCounter.Display.INCREMENTAL;\n    goog.dom.setTextContent(\n        this.elCount_, String(incremental ? count : this.maxLength_ - count));\n  }\n};\n\n\n/** @override */\ngoog.ui.CharCounter.prototype.disposeInternal = function() {\n  goog.ui.CharCounter.superClass_.disposeInternal.call(this);\n  delete this.elInput_;\n  this.inputHandler_.dispose();\n  this.inputHandler_ = null;\n};\n","^?",1579837703000,"^@",["^A",["^14","^3","^1M","~$goog.events.InputHandler","^1N"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/charcounter.js"],"^S",["^A",["~$goog.ui.CharCounter.Display","~$goog.ui.CharCounter"]],"^1",true,"^2",["^3","^14","^1N","^1M","^S5"]],["^ ","^7",[1579837703000],"^8","goog.module.basemodule.js","^9",["^:","goog/module/basemodule.js"],"^;","goog/module/basemodule.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines the base class for a module. This is used to allow the\n * code to be modularized, giving the benefits of lazy loading and loading on\n * demand.\n *\n */\n\ngoog.provide('goog.module.BaseModule');\n\ngoog.require('goog.Disposable');\n/** @suppress {extraRequire} */\ngoog.require('goog.module');\n\n\n\n/**\n * A basic module object that represents a module of JavaScript code that can\n * be dynamically loaded.\n *\n * @constructor\n * @extends {goog.Disposable}\n */\ngoog.module.BaseModule = function() {\n  goog.Disposable.call(this);\n};\ngoog.inherits(goog.module.BaseModule, goog.Disposable);\n\n\n/**\n * Performs any load-time initialization that the module requires.\n * @param {Object} context The module context.\n */\ngoog.module.BaseModule.prototype.initialize = function(context) {};\n","^?",1579837703000,"^@",["^A",["~$goog.module","^3","^3C"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/module/basemodule.js"],"^S",["^A",["~$goog.module.BaseModule"]],"^1",true,"^2",["^3","^3C","^S8"]],["^ ","^7",[1579837703000],"^8","goog.labs.mock.verificationmode.js","^9",["^:","goog/labs/mock/verificationmode.js"],"^;","goog/labs/mock/verificationmode.js","^<","^=","^>","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides an interface that defines how users can extend the\n * `goog.labs.mock` mocking framework with custom verification.\n *\n * In addition to the interface definition, it contains several static\n * factories for creating common implementations of the interface.\n */\ngoog.provide('goog.labs.mock.verification');\ngoog.provide('goog.labs.mock.verification.BaseVerificationMode');\ngoog.provide('goog.labs.mock.verification.VerificationMode');\n\n\n/**\n * A mode which defines how mock invocations should be verified.\n * When an instance of `VerificationMode` is passed to\n * `goog.labs.mock.verify`, then that instances's `#verify`\n * method will be used to verify the invocation.\n *\n * If `#verify` returns false, then the test will fail and the\n * description returned from `#describe` will be shown in the\n * test failure message.  Sample usage:\n *\n * goog.module('my.package.MyClassTest');\n * goog.setTestOnly('my.package.MyClassTest');\n *\n * var testSuite = goog.require('goog.testing.testSuite');\n * var verification = goog.require('goog.labs.mock.verification');\n *\n * var times = verification.times;\n *\n * testSuite({\n *   setUp: function() {\n *     // Code creating instances of MyClass and mockObj.\n *   },\n *\n *   testMyMethod_shouldDoSomething: function() {\n *     myClassInstance.myMethod();\n *\n *     goog.labs.mock.verify(mockObj, times(1));\n *   }\n * });\n *\n * For an example implementation, see `TimesVerificationMode_`.\n *\n * @interface\n */\ngoog.labs.mock.verification.VerificationMode = function() {};\n\n\n/**\n * Returns true if the recorded number of invocations,\n * `actualNumberOfInvocations`, meets the expectations of this mode.\n *\n * TODO(user): Have this take in an object which contains the complete\n * call record in order to allow more interesting verifications.\n *\n * @param {number} actualNumberOfInvocations\n * @return {boolean}\n */\ngoog.labs.mock.verification.VerificationMode.prototype.verify =\n    goog.abstractMethod;\n\n\n/**\n * Returns a description of what this VerificationMode expected.\n *\n * @return {string}\n */\ngoog.labs.mock.verification.VerificationMode.prototype.describe =\n    goog.abstractMethod;\n\n\n/**\n * Returns a `VerificationMode` which verifies a method was called\n * exactly `expectedNumberOfInvocations` times.\n *\n * @param {number} expectedNumberOfInvocations\n * @return {!goog.labs.mock.verification.VerificationMode}\n */\ngoog.labs.mock.verification.times = function(expectedNumberOfInvocations) {\n  return new goog.labs.mock.verification.TimesVerificationMode_(\n      expectedNumberOfInvocations);\n};\n\n\n/**\n * Returns a `VerificationMode` which verifies a method was called at\n * least `minimumNumberOfInvocations` times.\n *\n * @param {number} minimumNumberOfInvocations\n * @return {!goog.labs.mock.verification.VerificationMode}\n */\ngoog.labs.mock.verification.atLeast = function(minimumNumberOfInvocations) {\n  return new goog.labs.mock.verification.AtLeastVerificationMode_(\n      minimumNumberOfInvocations);\n};\n\n\n/**\n * Returns a `VerificationMode` which verifies a method was called at\n * most `maxNumberOfInvocations` times.\n *\n * @param {number} maxNumberOfInvocations\n * @return {!goog.labs.mock.verification.VerificationMode}\n */\ngoog.labs.mock.verification.atMost = function(maxNumberOfInvocations) {\n  return new goog.labs.mock.verification.AtMostVerificationMode_(\n      maxNumberOfInvocations);\n};\n\n\n/**\n * Returns a `VerificationMode` which verifies a method was never\n * called. An alias for `VerificatonMode.times(0)`.\n *\n * @return {!goog.labs.mock.verification.VerificationMode}\n */\ngoog.labs.mock.verification.never = function() {\n  return goog.labs.mock.verification.times(0);\n};\n\n/**\n * A base verification mode whose purpose is to allow consumers to do an\n * instanceof check on all verification modes. This class adds no additional\n * functionality to it's subclasses.\n * @package\n */\ngoog.labs.mock.verification.BaseVerificationMode =\n    goog.defineClass(null, {constructor() {}});\n\n/**\n * A `VerificationMode` which verifies a method was called\n * exactly `expectedNumberOfInvocations` times.\n *\n * @private @implements {goog.labs.mock.verification.VerificationMode}\n */\ngoog.labs.mock.verification.TimesVerificationMode_ =\n    goog.defineClass(goog.labs.mock.verification.BaseVerificationMode, {\n      /**\n       * @param {number} expectedNumberOfInvocations\n       * @constructor\n       */\n      constructor: function(expectedNumberOfInvocations) {\n        /** @private @const */\n        this.expectedNumberOfInvocations_ = expectedNumberOfInvocations;\n      },\n\n      /** @override */\n      verify: function(actualNumberOfInvocations) {\n        return actualNumberOfInvocations == this.expectedNumberOfInvocations_;\n      },\n\n      /** @override */\n      describe: function() {\n        return this.expectedNumberOfInvocations_ + ' times';\n      }\n    });\n\n\n/**\n * A `VerificationMode` which verifies a method was called at\n * least `minimumNumberOfInvocations` times.\n *\n * @private @implements {goog.labs.mock.verification.VerificationMode}\n */\ngoog.labs.mock.verification.AtLeastVerificationMode_ =\n    goog.defineClass(goog.labs.mock.verification.BaseVerificationMode, {\n      /**\n       * @param {number} minimumNumberOfInvocations\n       * @constructor\n       */\n      constructor: function(minimumNumberOfInvocations) {\n        /** @private @const */\n        this.minimumNumberOfInvocations_ = minimumNumberOfInvocations;\n      },\n\n      /** @override */\n      verify: function(actualNumberOfInvocations) {\n        return actualNumberOfInvocations >= this.minimumNumberOfInvocations_;\n      },\n\n      /** @override */\n      describe: function() {\n        return 'at least ' + this.minimumNumberOfInvocations_ + ' times';\n      }\n    });\n\n\n/**\n * A `VerificationMode` which verifies a method was called at\n * most `maxNumberOfInvocations` times.\n *\n * @private @implements {goog.labs.mock.verification.VerificationMode}\n */\ngoog.labs.mock.verification.AtMostVerificationMode_ = goog.defineClass(null, {\n  /**\n   * @param {number} maxNumberOfInvocations\n   * @constructor\n   */\n  constructor: function(maxNumberOfInvocations) {\n    /** @private */\n    this.maxNumberOfInvocations_ = maxNumberOfInvocations;\n  },\n\n  /** @override */\n  verify: function(actualNumberOfInvocations) {\n    return actualNumberOfInvocations <= this.maxNumberOfInvocations_;\n  },\n\n  /** @override */\n  describe: function() {\n    return 'at most ' + this.maxNumberOfInvocations_ + ' times';\n  }\n});\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/mock/verificationmode.js"],"^S",["^A",["^2=","^2?","^2C"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.messaging.bufferedchannel.js","^9",["^:","goog/messaging/bufferedchannel.js"],"^;","goog/messaging/bufferedchannel.js","^<","^=","^>","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A wrapper for asynchronous message-passing channels that buffer\n * their output until both ends of the channel are connected.\n *\n */\n\ngoog.provide('goog.messaging.BufferedChannel');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.Timer');\ngoog.require('goog.events');\ngoog.require('goog.log');\ngoog.require('goog.messaging.MessageChannel');\ngoog.require('goog.messaging.MultiChannel');\n\n\n\n/**\n * Creates a new BufferedChannel, which operates like its underlying channel\n * except that it buffers calls to send until it receives a message from its\n * peer claiming that the peer is ready to receive.  The peer is also expected\n * to be a BufferedChannel, though this is not enforced.\n *\n * @param {!goog.messaging.MessageChannel} messageChannel The MessageChannel\n *     we're wrapping.\n * @param {number=} opt_interval Polling interval for sending ready\n *     notifications to peer, in ms.  Default is 50.\n * @constructor\n * @extends {goog.Disposable}\n * @implements {goog.messaging.MessageChannel};\n * @final\n */\ngoog.messaging.BufferedChannel = function(messageChannel, opt_interval) {\n  goog.Disposable.call(this);\n\n  /**\n   * Buffer of messages to be sent when the channel's peer is ready.\n   *\n   * @type {Array<Object>}\n   * @private\n   */\n  this.buffer_ = [];\n\n  /**\n   * Channel dispatcher wrapping the underlying delegate channel.\n   *\n   * @type {!goog.messaging.MultiChannel}\n   * @private\n   */\n  this.multiChannel_ = new goog.messaging.MultiChannel(messageChannel);\n\n  /**\n   * Virtual channel for carrying the user's messages.\n   *\n   * @type {!goog.messaging.MessageChannel}\n   * @private\n   */\n  this.userChannel_ = this.multiChannel_.createVirtualChannel(\n      goog.messaging.BufferedChannel.USER_CHANNEL_NAME_);\n\n  /**\n   * Virtual channel for carrying control messages for BufferedChannel.\n   *\n   * @type {!goog.messaging.MessageChannel}\n   * @private\n   */\n  this.controlChannel_ = this.multiChannel_.createVirtualChannel(\n      goog.messaging.BufferedChannel.CONTROL_CHANNEL_NAME_);\n\n  /**\n   * Timer for the peer ready ping loop.\n   *\n   * @type {goog.Timer}\n   * @private\n   */\n  this.timer_ = new goog.Timer(\n      opt_interval || goog.messaging.BufferedChannel.DEFAULT_INTERVAL_MILLIS_);\n\n  this.timer_.start();\n  goog.events.listen(\n      this.timer_, goog.Timer.TICK, this.sendReadyPing_, false, this);\n\n  this.controlChannel_.registerService(\n      goog.messaging.BufferedChannel.PEER_READY_SERVICE_NAME_,\n      goog.bind(this.setPeerReady_, this));\n};\ngoog.inherits(goog.messaging.BufferedChannel, goog.Disposable);\n\n\n/**\n * Default polling interval (in ms) for setPeerReady_ notifications.\n *\n * @type {number}\n * @const\n * @private\n */\ngoog.messaging.BufferedChannel.DEFAULT_INTERVAL_MILLIS_ = 50;\n\n\n/**\n * The name of the private service which handles peer ready pings.  The\n * service registered with this name is bound to this.setPeerReady_, an internal\n * part of BufferedChannel's implementation that clients should not send to\n * directly.\n *\n * @type {string}\n * @const\n * @private\n */\ngoog.messaging.BufferedChannel.PEER_READY_SERVICE_NAME_ = 'setPeerReady_';\n\n\n/**\n * The name of the virtual channel along which user messages are sent.\n *\n * @type {string}\n * @const\n * @private\n */\ngoog.messaging.BufferedChannel.USER_CHANNEL_NAME_ = 'user';\n\n\n/**\n * The name of the virtual channel along which internal control messages are\n * sent.\n *\n * @type {string}\n * @const\n * @private\n */\ngoog.messaging.BufferedChannel.CONTROL_CHANNEL_NAME_ = 'control';\n\n\n/** @override */\ngoog.messaging.BufferedChannel.prototype.connect = function(opt_connectCb) {\n  if (opt_connectCb) {\n    opt_connectCb();\n  }\n};\n\n\n/** @override */\ngoog.messaging.BufferedChannel.prototype.isConnected = function() {\n  return true;\n};\n\n\n/**\n * @return {boolean} Whether the channel's peer is ready.\n */\ngoog.messaging.BufferedChannel.prototype.isPeerReady = function() {\n  return this.peerReady_;\n};\n\n\n/**\n * Logger.\n *\n * @type {goog.log.Logger}\n * @const\n * @private\n */\ngoog.messaging.BufferedChannel.prototype.logger_ =\n    goog.log.getLogger('goog.messaging.bufferedchannel');\n\n\n/**\n * Handles one tick of our peer ready notification loop.  This entails sending a\n * ready ping to the peer and shutting down the loop if we've received a ping\n * ourselves.\n *\n * @private\n */\ngoog.messaging.BufferedChannel.prototype.sendReadyPing_ = function() {\n  try {\n    this.controlChannel_.send(\n        goog.messaging.BufferedChannel.PEER_READY_SERVICE_NAME_,\n        /* payload */ this.isPeerReady() ? '1' : '');\n  } catch (e) {\n    this.timer_.stop();  // So we don't keep calling send and re-throwing.\n    throw e;\n  }\n};\n\n\n/**\n  * Whether or not the peer channel is ready to receive messages.\n  *\n  * @type {boolean}\n  * @private\n  */\ngoog.messaging.BufferedChannel.prototype.peerReady_;\n\n\n/** @override */\ngoog.messaging.BufferedChannel.prototype.registerService = function(\n    serviceName, callback, opt_objectPayload) {\n  this.userChannel_.registerService(serviceName, callback, opt_objectPayload);\n};\n\n\n/** @override */\ngoog.messaging.BufferedChannel.prototype.registerDefaultService = function(\n    callback) {\n  this.userChannel_.registerDefaultService(callback);\n};\n\n\n/**\n * Send a message over the channel.  If the peer is not ready, the message will\n * be buffered and sent once we've received a ready message from our peer.\n *\n * @param {string} serviceName The name of the service this message should be\n *     delivered to.\n * @param {string|!Object} payload The value of the message. If this is an\n *     Object, it is serialized to JSON before sending.  It's the responsibility\n *     of implementors of this class to perform the serialization.\n * @see goog.net.xpc.BufferedChannel.send\n * @override\n */\ngoog.messaging.BufferedChannel.prototype.send = function(serviceName, payload) {\n  if (this.isPeerReady()) {\n    this.userChannel_.send(serviceName, payload);\n  } else {\n    goog.log.fine(\n        goog.messaging.BufferedChannel.prototype.logger_,\n        'buffering message ' + serviceName);\n    this.buffer_.push({serviceName: serviceName, payload: payload});\n  }\n};\n\n\n/**\n * Marks the channel's peer as ready, then sends buffered messages and nulls the\n * buffer.  Subsequent calls to setPeerReady_ have no effect.\n *\n * @param {(!Object|string)} peerKnowsWeKnowItsReady Passed by the peer to\n *     indicate whether it knows that we've received its ping and that it's\n *     ready.  Non-empty if true, empty if false.\n * @private\n */\ngoog.messaging.BufferedChannel.prototype.setPeerReady_ = function(\n    peerKnowsWeKnowItsReady) {\n  if (peerKnowsWeKnowItsReady) {\n    this.timer_.stop();\n  } else {\n    // Our peer doesn't know we're ready, so restart (or continue) pinging.\n    // Restarting may be needed if the peer iframe was reloaded after the\n    // connection was first established.\n    this.timer_.start();\n  }\n\n  if (this.peerReady_) {\n    return;\n  }\n  this.peerReady_ = true;\n  // Send one last ping so that the peer knows we know it's ready.\n  this.sendReadyPing_();\n  for (var i = 0; i < this.buffer_.length; i++) {\n    var message = this.buffer_[i];\n    goog.log.fine(\n        goog.messaging.BufferedChannel.prototype.logger_,\n        'sending buffered message ' + message.serviceName);\n    this.userChannel_.send(message.serviceName, message.payload);\n  }\n  this.buffer_ = null;\n};\n\n\n/** @override */\ngoog.messaging.BufferedChannel.prototype.disposeInternal = function() {\n  goog.dispose(this.multiChannel_);\n  goog.dispose(this.timer_);\n  goog.messaging.BufferedChannel.base(this, 'disposeInternal');\n};\n","^?",1579837703000,"^@",["^A",["^3U","^3A","^3","^3B","^3C","^1N","~$goog.messaging.MultiChannel"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/bufferedchannel.js"],"^S",["^A",["~$goog.messaging.BufferedChannel"]],"^1",true,"^2",["^3","^3C","^3U","^1N","^3B","^3A","^S:"]],["^ ","^7",[1579837703000],"^8","goog.net.xmlhttp.js","^9",["^:","goog/net/xmlhttp.js"],"^;","goog/net/xmlhttp.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Low level handling of XMLHttpRequest.\n * @author arv@google.com (Erik Arvidsson)\n * @author dbk@google.com (David Barrett-Kahn)\n */\n\ngoog.provide('goog.net.DefaultXmlHttpFactory');\ngoog.provide('goog.net.XmlHttp');\ngoog.provide('goog.net.XmlHttp.OptionType');\ngoog.provide('goog.net.XmlHttp.ReadyState');\ngoog.provide('goog.net.XmlHttpDefines');\n\ngoog.require('goog.asserts');\ngoog.require('goog.net.WrapperXmlHttpFactory');\ngoog.require('goog.net.XmlHttpFactory');\n\n\n/**\n * Static class for creating XMLHttpRequest objects.\n * @return {!goog.net.XhrLike.OrNative} A new XMLHttpRequest object.\n */\ngoog.net.XmlHttp = function() {\n  return goog.net.XmlHttp.factory_.createInstance();\n};\n\n\n/**\n * @define {boolean} Whether to assume XMLHttpRequest exists. Setting this to\n *     true bypasses the ActiveX probing code.\n * NOTE(ruilopes): Due to the way JSCompiler works, this define *will not* strip\n * out the ActiveX probing code from binaries.  To achieve this, use\n * `goog.net.XmlHttpDefines.ASSUME_NATIVE_XHR` instead.\n * TODO(ruilopes): Collapse both defines.\n */\ngoog.net.XmlHttp.ASSUME_NATIVE_XHR =\n    goog.define('goog.net.XmlHttp.ASSUME_NATIVE_XHR', false);\n\n\n/** @const */\ngoog.net.XmlHttpDefines = {};\n\n\n/**\n * @define {boolean} Whether to assume XMLHttpRequest exists. Setting this to\n *     true eliminates the ActiveX probing code.\n */\ngoog.net.XmlHttpDefines.ASSUME_NATIVE_XHR =\n    goog.define('goog.net.XmlHttpDefines.ASSUME_NATIVE_XHR', false);\n\n\n/**\n * Gets the options to use with the XMLHttpRequest objects obtained using\n * the static methods.\n * @return {Object} The options.\n */\ngoog.net.XmlHttp.getOptions = function() {\n  return goog.net.XmlHttp.factory_.getOptions();\n};\n\n\n/**\n * Type of options that an XmlHttp object can have.\n * @enum {number}\n */\ngoog.net.XmlHttp.OptionType = {\n  /**\n   * Whether a goog.nullFunction should be used to clear the onreadystatechange\n   * handler instead of null.\n   */\n  USE_NULL_FUNCTION: 0,\n\n  /**\n   * NOTE(user): In IE if send() errors on a *local* request the readystate\n   * is still changed to COMPLETE.  We need to ignore it and allow the\n   * try/catch around send() to pick up the error.\n   */\n  LOCAL_REQUEST_ERROR: 1\n};\n\n\n/**\n * Status constants for XMLHTTP, matches:\n * https://msdn.microsoft.com/en-us/library/ms534361(v=vs.85).aspx\n * @enum {number}\n */\ngoog.net.XmlHttp.ReadyState = {\n  /**\n   * Constant for when xmlhttprequest.readyState is uninitialized\n   */\n  UNINITIALIZED: 0,\n\n  /**\n   * Constant for when xmlhttprequest.readyState is loading.\n   */\n  LOADING: 1,\n\n  /**\n   * Constant for when xmlhttprequest.readyState is loaded.\n   */\n  LOADED: 2,\n\n  /**\n   * Constant for when xmlhttprequest.readyState is in an interactive state.\n   */\n  INTERACTIVE: 3,\n\n  /**\n   * Constant for when xmlhttprequest.readyState is completed\n   */\n  COMPLETE: 4\n};\n\n\n/**\n * The global factory instance for creating XMLHttpRequest objects.\n * @type {goog.net.XmlHttpFactory}\n * @private\n */\ngoog.net.XmlHttp.factory_;\n\n\n/**\n * Sets the factories for creating XMLHttpRequest objects and their options.\n * @param {Function} factory The factory for XMLHttpRequest objects.\n * @param {Function} optionsFactory The factory for options.\n * @deprecated Use setGlobalFactory instead.\n */\ngoog.net.XmlHttp.setFactory = function(factory, optionsFactory) {\n  goog.net.XmlHttp.setGlobalFactory(\n      new goog.net.WrapperXmlHttpFactory(\n          goog.asserts.assert(factory), goog.asserts.assert(optionsFactory)));\n};\n\n\n/**\n * Sets the global factory object.\n * @param {!goog.net.XmlHttpFactory} factory New global factory object.\n */\ngoog.net.XmlHttp.setGlobalFactory = function(factory) {\n  goog.net.XmlHttp.factory_ = factory;\n};\n\n\n\n/**\n * Default factory to use when creating xhr objects.  You probably shouldn't be\n * instantiating this directly, but rather using it via goog.net.XmlHttp.\n * @extends {goog.net.XmlHttpFactory}\n * @constructor\n */\ngoog.net.DefaultXmlHttpFactory = function() {\n  goog.net.XmlHttpFactory.call(this);\n};\ngoog.inherits(goog.net.DefaultXmlHttpFactory, goog.net.XmlHttpFactory);\n\n\n/** @override */\ngoog.net.DefaultXmlHttpFactory.prototype.createInstance = function() {\n  var progId = this.getProgId_();\n  if (progId) {\n    return new ActiveXObject(progId);\n  } else {\n    return new XMLHttpRequest();\n  }\n};\n\n\n/** @override */\ngoog.net.DefaultXmlHttpFactory.prototype.internalGetOptions = function() {\n  var progId = this.getProgId_();\n  var options = {};\n  if (progId) {\n    options[goog.net.XmlHttp.OptionType.USE_NULL_FUNCTION] = true;\n    options[goog.net.XmlHttp.OptionType.LOCAL_REQUEST_ERROR] = true;\n  }\n  return options;\n};\n\n\n/**\n * The ActiveX PROG ID string to use to create xhr's in IE. Lazily initialized.\n * @type {string|undefined}\n * @private\n */\ngoog.net.DefaultXmlHttpFactory.prototype.ieProgId_;\n\n\n/**\n * Initialize the private state used by other functions.\n * @return {string} The ActiveX PROG ID string to use to create xhr's in IE.\n * @private\n */\ngoog.net.DefaultXmlHttpFactory.prototype.getProgId_ = function() {\n  if (goog.net.XmlHttp.ASSUME_NATIVE_XHR ||\n      goog.net.XmlHttpDefines.ASSUME_NATIVE_XHR) {\n    return '';\n  }\n\n  // The following blog post describes what PROG IDs to use to create the\n  // XMLHTTP object in Internet Explorer:\n  // http://blogs.msdn.com/xmlteam/archive/2006/10/23/using-the-right-version-of-msxml-in-internet-explorer.aspx\n  // However we do not (yet) fully trust that this will be OK for old versions\n  // of IE on Win9x so we therefore keep the last 2.\n  if (!this.ieProgId_ && typeof XMLHttpRequest == 'undefined' &&\n      typeof ActiveXObject != 'undefined') {\n    // Candidate Active X types.\n    var ACTIVE_X_IDENTS = [\n      'MSXML2.XMLHTTP.6.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP',\n      'Microsoft.XMLHTTP'\n    ];\n    for (var i = 0; i < ACTIVE_X_IDENTS.length; i++) {\n      var candidate = ACTIVE_X_IDENTS[i];\n\n      try {\n        new ActiveXObject(candidate);\n        // NOTE(user): cannot assign progid and return candidate in one line\n        // because JSCompiler complaings: BUG 658126\n        this.ieProgId_ = candidate;\n        return candidate;\n      } catch (e) {\n        // do nothing; try next choice\n      }\n    }\n\n    // couldn't find any matches\n    throw new Error(\n        'Could not create ActiveXObject. ActiveX might be disabled,' +\n        ' or MSXML might not be installed');\n  }\n\n  return /** @type {string} */ (this.ieProgId_);\n};\n\n\n// Set the global factory to an instance of the default factory.\ngoog.net.XmlHttp.setGlobalFactory(new goog.net.DefaultXmlHttpFactory());\n","^?",1579837703000,"^@",["^A",["^1J","^3","~$goog.net.WrapperXmlHttpFactory","~$goog.net.XmlHttpFactory"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/xmlhttp.js"],"^S",["^A",["~$goog.net.XmlHttpDefines","~$goog.net.XmlHttp.ReadyState","~$goog.net.XmlHttp.OptionType","~$goog.net.DefaultXmlHttpFactory","~$goog.net.XmlHttp"]],"^1",true,"^2",["^3","^1J","^S<","^S="]],["^ ","^7",[1579837703000],"^8","goog.ui.option.js","^9",["^:","goog/ui/option.js"],"^;","goog/ui/option.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A menu item class that supports selection state.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.Option');\n\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.MenuItem');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Class representing a menu option.  This is just a convenience class that\n * extends {@link goog.ui.MenuItem} by making it selectable.\n *\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to\n *     display as the content of the item (use to add icons or styling to\n *     menus).\n * @param {*=} opt_model Data/model associated with the menu item.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper used for\n *     document interactions.\n * @constructor\n * @extends {goog.ui.MenuItem}\n */\ngoog.ui.Option = function(content, opt_model, opt_domHelper) {\n  goog.ui.MenuItem.call(this, content, opt_model, opt_domHelper);\n  this.setSelectable(true);\n};\ngoog.inherits(goog.ui.Option, goog.ui.MenuItem);\n\n\n/**\n * Performs the appropriate action when the option is activated by the user.\n * Overrides the superclass implementation by not changing the selection state\n * of the option and not dispatching any SELECTED events, for backwards\n * compatibility with existing uses of this class.\n * @param {goog.events.Event} e Mouse or key event that triggered the action.\n * @return {boolean} True if the action was allowed to proceed, false otherwise.\n * @override\n */\ngoog.ui.Option.prototype.performActionInternal = function(e) {\n  return this.dispatchEvent(goog.ui.Component.EventType.ACTION);\n};\n\n\n// Register a decorator factory function for goog.ui.Options.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.getCssName('goog-option'), function() {\n      // Option defaults to using MenuItemRenderer.\n      return new goog.ui.Option(null);\n    });\n","^?",1579837703000,"^@",["^A",["^1B","^3","^29","^42"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/option.js"],"^S",["^A",["~$goog.ui.Option"]],"^1",true,"^2",["^3","^1B","^42","^29"]],["^ ","^7",[1579837703000],"^8","goog.crypt.sha2.js","^9",["^:","goog/crypt/sha2.js"],"^;","goog/crypt/sha2.js","^<","^=","^>","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Base class for SHA-2 cryptographic hash.\n *\n * Variable names follow the notation in FIPS PUB 180-3:\n * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf.\n *\n * Some code similar to SHA1 are borrowed from sha1.js written by mschilder@.\n *\n */\n\ngoog.provide('goog.crypt.Sha2');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.crypt.Hash');\n\n\n\n/**\n * SHA-2 cryptographic hash constructor.\n * This constructor should not be used directly to create the object. Rather,\n * one should use the constructor of the sub-classes.\n * @param {number} numHashBlocks The size of output in 16-byte blocks.\n * @param {!Array<number>} initHashBlocks The hash-specific initialization\n * @constructor\n * @extends {goog.crypt.Hash}\n * @struct\n */\ngoog.crypt.Sha2 = function(numHashBlocks, initHashBlocks) {\n  goog.crypt.Sha2.base(this, 'constructor');\n\n  this.blockSize = goog.crypt.Sha2.BLOCKSIZE_;\n\n  /**\n   * A chunk holding the currently processed message bytes. Once the chunk has\n   * 64 bytes, we feed it into computeChunk_ function and reset this.chunk_.\n   * @private {!Array<number>|!Uint8Array}\n   */\n  this.chunk_ = goog.global['Uint8Array'] ? new Uint8Array(this.blockSize) :\n                                            new Array(this.blockSize);\n\n  /**\n   * Current number of bytes in this.chunk_.\n   * @private {number}\n   */\n  this.inChunk_ = 0;\n\n  /**\n   * Total number of bytes in currently processed message.\n   * @private {number}\n   */\n  this.total_ = 0;\n\n\n  /**\n   * Holds the previous values of accumulated hash a-h in the computeChunk_\n   * function.\n   * @private {!Array<number>|!Int32Array}\n   */\n  this.hash_ = [];\n\n  /**\n   * The number of output hash blocks (each block is 4 bytes long).\n   * @private {number}\n   */\n  this.numHashBlocks_ = numHashBlocks;\n\n  /**\n   * @private {!Array<number>} initHashBlocks\n   */\n  this.initHashBlocks_ = initHashBlocks;\n\n  /**\n   * Temporary array used in chunk computation.  Allocate here as a\n   * member rather than as a local within computeChunk_() as a\n   * performance optimization to reduce the number of allocations and\n   * reduce garbage collection.\n   * @private {!Int32Array|!Array<number>}\n   */\n  this.w_ = goog.global['Int32Array'] ? new Int32Array(64) : new Array(64);\n\n  if (goog.crypt.Sha2.Kx_ === undefined) {\n    // This is the first time this constructor has been called.\n    if (goog.global['Int32Array']) {\n      // Typed arrays exist\n      goog.crypt.Sha2.Kx_ = new Int32Array(goog.crypt.Sha2.K_);\n    } else {\n      // Typed arrays do not exist\n      goog.crypt.Sha2.Kx_ = goog.crypt.Sha2.K_;\n    }\n  }\n\n  this.reset();\n};\ngoog.inherits(goog.crypt.Sha2, goog.crypt.Hash);\n\n\n/**\n * The block size\n * @private {number}\n */\ngoog.crypt.Sha2.BLOCKSIZE_ = 512 / 8;\n\n\n/**\n * Contains data needed to pad messages less than BLOCK_SIZE_ bytes.\n * @private {!Array<number>}\n */\ngoog.crypt.Sha2.PADDING_ = goog.array.concat(\n    128, goog.array.repeat(0, goog.crypt.Sha2.BLOCKSIZE_ - 1));\n\n\n/** @override */\ngoog.crypt.Sha2.prototype.reset = function() {\n  this.inChunk_ = 0;\n  this.total_ = 0;\n  this.hash_ = goog.global['Int32Array'] ?\n      new Int32Array(this.initHashBlocks_) :\n      goog.array.clone(this.initHashBlocks_);\n};\n\n\n/**\n * Helper function to compute the hashes for a given 512-bit message chunk.\n * @private\n */\ngoog.crypt.Sha2.prototype.computeChunk_ = function() {\n  var chunk = this.chunk_;\n  goog.asserts.assert(chunk.length == this.blockSize);\n  var rounds = 64;\n\n  // Divide the chunk into 16 32-bit-words.\n  var w = this.w_;\n  var index = 0;\n  var offset = 0;\n  while (offset < chunk.length) {\n    w[index++] = (chunk[offset] << 24) | (chunk[offset + 1] << 16) |\n        (chunk[offset + 2] << 8) | (chunk[offset + 3]);\n    offset = index * 4;\n  }\n\n  // Extend the w[] array to be the number of rounds.\n  for (var i = 16; i < rounds; i++) {\n    var w_15 = w[i - 15] | 0;\n    var s0 = ((w_15 >>> 7) | (w_15 << 25)) ^ ((w_15 >>> 18) | (w_15 << 14)) ^\n        (w_15 >>> 3);\n    var w_2 = w[i - 2] | 0;\n    var s1 = ((w_2 >>> 17) | (w_2 << 15)) ^ ((w_2 >>> 19) | (w_2 << 13)) ^\n        (w_2 >>> 10);\n\n    // As a performance optimization, construct the sum a pair at a time\n    // with casting to integer (bitwise OR) to eliminate unnecessary\n    // double<->integer conversions.\n    var partialSum1 = ((w[i - 16] | 0) + s0) | 0;\n    var partialSum2 = ((w[i - 7] | 0) + s1) | 0;\n    w[i] = (partialSum1 + partialSum2) | 0;\n  }\n\n  var a = this.hash_[0] | 0;\n  var b = this.hash_[1] | 0;\n  var c = this.hash_[2] | 0;\n  var d = this.hash_[3] | 0;\n  var e = this.hash_[4] | 0;\n  var f = this.hash_[5] | 0;\n  var g = this.hash_[6] | 0;\n  var h = this.hash_[7] | 0;\n  for (var i = 0; i < rounds; i++) {\n    var S0 = ((a >>> 2) | (a << 30)) ^ ((a >>> 13) | (a << 19)) ^\n        ((a >>> 22) | (a << 10));\n    var maj = ((a & b) ^ (a & c) ^ (b & c));\n    var t2 = (S0 + maj) | 0;\n    var S1 = ((e >>> 6) | (e << 26)) ^ ((e >>> 11) | (e << 21)) ^\n        ((e >>> 25) | (e << 7));\n    var ch = ((e & f) ^ ((~e) & g));\n\n    // As a performance optimization, construct the sum a pair at a time\n    // with casting to integer (bitwise OR) to eliminate unnecessary\n    // double<->integer conversions.\n    var partialSum1 = (h + S1) | 0;\n    var partialSum2 = (ch + (goog.crypt.Sha2.Kx_[i] | 0)) | 0;\n    var partialSum3 = (partialSum2 + (w[i] | 0)) | 0;\n    var t1 = (partialSum1 + partialSum3) | 0;\n\n    h = g;\n    g = f;\n    f = e;\n    e = (d + t1) | 0;\n    d = c;\n    c = b;\n    b = a;\n    a = (t1 + t2) | 0;\n  }\n\n  this.hash_[0] = (this.hash_[0] + a) | 0;\n  this.hash_[1] = (this.hash_[1] + b) | 0;\n  this.hash_[2] = (this.hash_[2] + c) | 0;\n  this.hash_[3] = (this.hash_[3] + d) | 0;\n  this.hash_[4] = (this.hash_[4] + e) | 0;\n  this.hash_[5] = (this.hash_[5] + f) | 0;\n  this.hash_[6] = (this.hash_[6] + g) | 0;\n  this.hash_[7] = (this.hash_[7] + h) | 0;\n};\n\n\n/** @override */\ngoog.crypt.Sha2.prototype.update = function(message, opt_length) {\n  if (opt_length === undefined) {\n    opt_length = message.length;\n  }\n  // Process the message from left to right up to |opt_length| bytes.\n  // When we get a 512-bit chunk, compute the hash of it and reset\n  // this.chunk_. The message might not be multiple of 512 bits so we\n  // might end up with a chunk that is less than 512 bits. We store\n  // such partial chunk in this.chunk_ and it will be filled up later\n  // in digest().\n  var n = 0;\n  var inChunk = this.inChunk_;\n\n  // The input message could be either byte array of string.\n  if (typeof message === 'string') {\n    while (n < opt_length) {\n      this.chunk_[inChunk++] = message.charCodeAt(n++);\n      if (inChunk == this.blockSize) {\n        this.computeChunk_();\n        inChunk = 0;\n      }\n    }\n  } else if (goog.isArrayLike(message)) {\n    while (n < opt_length) {\n      var b = message[n++];\n      if (!('number' == typeof b && 0 <= b && 255 >= b && b == (b | 0))) {\n        throw new Error('message must be a byte array');\n      }\n      this.chunk_[inChunk++] = b;\n      if (inChunk == this.blockSize) {\n        this.computeChunk_();\n        inChunk = 0;\n      }\n    }\n  } else {\n    throw new Error('message must be string or array');\n  }\n\n  // Record the current bytes in chunk to support partial update.\n  this.inChunk_ = inChunk;\n\n  // Record total message bytes we have processed so far.\n  this.total_ += opt_length;\n};\n\n\n/** @override */\ngoog.crypt.Sha2.prototype.digest = function() {\n  var digest = [];\n  var totalBits = this.total_ * 8;\n\n  // Append pad 0x80 0x00*.\n  if (this.inChunk_ < 56) {\n    this.update(goog.crypt.Sha2.PADDING_, 56 - this.inChunk_);\n  } else {\n    this.update(\n        goog.crypt.Sha2.PADDING_, this.blockSize - (this.inChunk_ - 56));\n  }\n\n  // Append # bits in the 64-bit big-endian format.\n  for (var i = 63; i >= 56; i--) {\n    this.chunk_[i] = totalBits & 255;\n    totalBits /= 256;  // Don't use bit-shifting here!\n  }\n  this.computeChunk_();\n\n  // Finally, output the result digest.\n  var n = 0;\n  for (var i = 0; i < this.numHashBlocks_; i++) {\n    for (var j = 24; j >= 0; j -= 8) {\n      digest[n++] = ((this.hash_[i] >> j) & 255);\n    }\n  }\n  return digest;\n};\n\n\n/**\n * Constants used in SHA-2.\n * @const\n * @private {!Array<number>}\n */\ngoog.crypt.Sha2.K_ = [\n  0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1,\n  0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,\n  0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786,\n  0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,\n  0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147,\n  0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,\n  0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b,\n  0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,\n  0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a,\n  0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,\n  0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2\n];\n\n\n/**\n * Sha2.K as an Int32Array if this JS supports typed arrays; otherwise,\n * the same array as Sha2.K.\n *\n * The compiler cannot remove an Int32Array, even if it is not needed\n * (There are certain cases where creating an Int32Array is not\n * side-effect free).  Instead, the first time we construct a Sha2\n * instance, we convert or assign Sha2.K as appropriate.\n * @private {undefined|!Array<number>|!Int32Array}\n */\ngoog.crypt.Sha2.Kx_;\n","^?",1579837703000,"^@",["^A",["^1J","^3","~$goog.crypt.Hash","^1S"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/sha2.js"],"^S",["^A",["~$goog.crypt.Sha2"]],"^1",true,"^2",["^3","^1S","^1J","^SD"]],["^ ","^7",[1579837703000],"^1=",true,"^8","goog.collections.sets.js","^9",["^:","goog/collections/sets.js"],"^;","goog/collections/sets.js","^<","^=","^>","/**\n * @license\n * Copyright The Closure Library Authors. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS-IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Set operations for ES6 Sets.\n *\n * See design doc at go/closure-es6-set\n */\n\ngoog.module('goog.collections.sets');\n\nconst iterables = goog.require('goog.labs.collections.iterables');\n\n// Note: Set operations are being proposed for EcmaScript. See proposal here:\n// https://github.com/tc39/proposal-set-methods\n\n// When these methods become available in JS engines, they should be used in\n// place of these utility methods and these methods will be deprecated.\n// Call sites can be automatically migrated. For example,\n// \"iterables.filter(a, b)\" becomes \"a.filter(b)\".\n\n/**\n * Creates a new set containing the elements that appear in both given\n * collections.\n *\n * @param {!Set<T>} a\n * @param {!Iterable<T>} b\n * @returns {!Set<T>}\n * @template T\n */\nexports.intersection = function(a, b) {\n  return new Set(iterables.filter(b, elem => a.has(elem)));\n};\n\n/**\n * Creates a new set containing the elements that appear in both given\n * collections.\n *\n * @param {!Set<T>} a\n * @param {!Iterable<T>} b\n * @return {!Set<T>}\n * @template T\n */\nexports.union = function(a, b) {\n  const set = new Set(a);\n  iterables.forEach(b, elem => set.add(elem));\n  return set;\n};\n\n\n/**\n * Creates a new set containing the elements that appear in the first collection\n * but not in the second.\n *\n * @param {!Set<T>} a\n * @param {!Iterable<T>} b\n * @return {!Set<T>}\n * @template T\n */\nexports.difference = function(a, b) {\n  const set = new Set(a);\n  iterables.forEach(b, elem => set.delete(elem));\n  return set;\n};\n\n/**\n * Creates a new set containing the elements that appear in a or b but not\n * both.\n *\n * @param {!Set<T>} a\n * @param {!Set<T>} b\n * @return {!Set<T>}\n * @template T\n */\n// TODO(nnaze): Consider widening the type of b per discussion in\n// https://github.com/tc39/proposal-set-methods/issues/56\nexports.symmetricDifference = function(a, b) {\n  const newSet = new Set(a);\n  for (const elem of b) {\n    if (a.has(elem)) {\n      newSet.delete(elem);\n    } else {\n      newSet.add(elem);\n    }\n  }\n  return newSet;\n};\n\n// TODO(nnaze): Add additional methods from\n// https://github.com/tc39/proposal-set-methods as needed.\n","^?",1579837703000,"^@",["^A",["^3","~$goog.labs.collections.iterables"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/collections/sets.js"],"^S",["^A",["~$goog.collections.sets"]],"^1",true,"^2",["^3","^SF"]],["^ ","^7",[1579837703000],"^8","goog.positioning.clientposition.js","^9",["^:","goog/positioning/clientposition.js"],"^;","goog/positioning/clientposition.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Client positioning class.\n *\n * @author eae@google.com (Emil A Eklund)\n * @author chrishenry@google.com (Chris Henry)\n */\n\ngoog.provide('goog.positioning.ClientPosition');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.positioning');\ngoog.require('goog.positioning.AbstractPosition');\ngoog.require('goog.style');\n\n\n\n/**\n * Encapsulates a popup position where the popup is positioned relative to the\n * window (client) coordinates. This calculates the correct position to\n * use even if the element is relatively positioned to some other element. This\n * is for trying to position an element at the spot of the mouse cursor in\n * a MOUSEMOVE event. Just use the event.clientX and event.clientY as the\n * parameters.\n *\n * @param {number|goog.math.Coordinate} arg1 Left position or coordinate.\n * @param {number=} opt_arg2 Top position.\n * @constructor\n * @extends {goog.positioning.AbstractPosition}\n */\ngoog.positioning.ClientPosition = function(arg1, opt_arg2) {\n  /**\n   * Coordinate to position popup at.\n   * @type {!goog.math.Coordinate}\n   */\n  this.coordinate = arg1 instanceof goog.math.Coordinate ?\n      arg1 :\n      new goog.math.Coordinate(/** @type {number} */ (arg1), opt_arg2);\n};\ngoog.inherits(\n    goog.positioning.ClientPosition, goog.positioning.AbstractPosition);\n\n\n/**\n * Repositions the popup according to the current state\n *\n * @param {Element} movableElement The DOM element of the popup.\n * @param {goog.positioning.Corner} movableElementCorner The corner of\n *     the popup element that that should be positioned adjacent to\n *     the anchorElement.  One of the goog.positioning.Corner\n *     constants.\n * @param {goog.math.Box=} opt_margin A margin specified in pixels.\n * @param {goog.math.Size=} opt_preferredSize Preferred size of the element.\n * @override\n */\ngoog.positioning.ClientPosition.prototype.reposition = function(\n    movableElement, movableElementCorner, opt_margin, opt_preferredSize) {\n  goog.asserts.assert(movableElement);\n\n  // Translates the coordinate to be relative to the page.\n  var viewportOffset = goog.style.getViewportPageOffset(\n      goog.dom.getOwnerDocument(movableElement));\n  var x = this.coordinate.x + viewportOffset.x;\n  var y = this.coordinate.y + viewportOffset.y;\n\n  // Translates the coordinate to be relative to the offset parent.\n  var movableParentTopLeft =\n      goog.positioning.getOffsetParentPageOffset(movableElement);\n  x -= movableParentTopLeft.x;\n  y -= movableParentTopLeft.y;\n\n  goog.positioning.positionAtCoordinate(\n      new goog.math.Coordinate(x, y), movableElement, movableElementCorner,\n      opt_margin, null, null, opt_preferredSize);\n};\n","^?",1579837703000,"^@",["^A",["^1J","^14","^3Y","^3","~$goog.positioning.AbstractPosition","^22","^2Y"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/positioning/clientposition.js"],"^S",["^A",["~$goog.positioning.ClientPosition"]],"^1",true,"^2",["^3","^1J","^14","^22","^3Y","^SH","^2Y"]],["^ ","^7",[1579837703000],"^8","goog.dom.rangeendpoint.js","^9",["^:","goog/dom/rangeendpoint.js"],"^;","goog/dom/rangeendpoint.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Simple struct for endpoints of a range.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.dom.RangeEndpoint');\n\n\n/**\n * Constants for selection endpoints.\n * @enum {number}\n */\ngoog.dom.RangeEndpoint = {\n  START: 1,\n  END: 0\n};\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/rangeendpoint.js"],"^S",["^A",["~$goog.dom.RangeEndpoint"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.dom.pattern.callback.test.js","^9",["^:","goog/dom/pattern/callback/test.js"],"^;","goog/dom/pattern/callback/test.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Callback object that tests if a pattern matches at least once.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.pattern.callback.Test');\n\ngoog.require('goog.iter.StopIteration');\n\n\n\n/**\n * Callback class for testing for at least one match.\n * @constructor\n * @final\n */\ngoog.dom.pattern.callback.Test = function() {\n  /**\n   * Whether or not the pattern matched.\n   *\n   * @type {boolean}\n   */\n  this.matched = false;\n\n  /**\n   * The callback function.  Suitable as a callback for\n   * {@link goog.dom.pattern.Matcher}.\n   * @private {?Function}\n   */\n  this.callback_ = null;\n};\n\n\n/**\n * Get a bound callback function that is suitable as a callback for\n * {@link goog.dom.pattern.Matcher}.\n *\n * @return {!Function} A callback function.\n */\ngoog.dom.pattern.callback.Test.prototype.getCallback = function() {\n  if (!this.callback_) {\n    this.callback_ = goog.bind(function(node, position) {\n      // Mark our match.\n      this.matched = true;\n\n      // Stop searching.\n      throw goog.iter.StopIteration;\n    }, this);\n  }\n  return this.callback_;\n};\n\n\n/**\n * Reset the counter.\n */\ngoog.dom.pattern.callback.Test.prototype.reset = function() {\n  this.matched = false;\n};\n","^?",1579837703000,"^@",["^A",["^3","~$goog.iter.StopIteration"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/callback/test.js"],"^S",["^A",["~$goog.dom.pattern.callback.Test"]],"^1",true,"^2",["^3","^SK"]],["^ ","^7",[1579837703000],"^8","goog.net.streams.xhrstreamreader.js","^9",["^:","goog/net/streams/xhrstreamreader.js"],"^;","goog/net/streams/xhrstreamreader.js","^<","^=","^>","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview the XHR stream reader implements a low-level stream\n * reader for handling a streamed XHR response body. The reader takes a\n * StreamParser which may support JSON or any other formats as confirmed by\n * the Content-Type of the response. The reader may be used as polyfill for\n * different streams APIs such as Node streams or whatwg streams (Fetch).\n *\n * The first version of this implementation only covers functions necessary\n * to support NodeReadableStream. In a later version, this reader will also\n * be adapted to whatwg streams.\n *\n * For IE, only IE-10 and above are supported.\n *\n * TODO(user): xhr polling, stream timeout, CORS and preflight optimization.\n */\n\ngoog.provide('goog.net.streams.XhrStreamReader');\n\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.log');\ngoog.require('goog.net.ErrorCode');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.HttpStatus');\ngoog.require('goog.net.XhrIo');\ngoog.require('goog.net.XmlHttp');\ngoog.require('goog.net.streams.Base64PbStreamParser');\ngoog.require('goog.net.streams.JsonStreamParser');\ngoog.require('goog.net.streams.PbJsonStreamParser');\ngoog.require('goog.net.streams.PbStreamParser');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\ngoog.scope(function() {\n\nvar Base64PbStreamParser =\n    goog.module.get('goog.net.streams.Base64PbStreamParser');\nvar PbJsonStreamParser = goog.module.get('goog.net.streams.PbJsonStreamParser');\n\n\n/**\n * The XhrStreamReader class.\n *\n * The caller must check isStreamingSupported() first.\n *\n * @param {!goog.net.XhrIo} xhr The XhrIo object with its response body to\n * be handled by NodeReadableStream.\n * @constructor\n * @struct\n * @final\n * @package\n */\ngoog.net.streams.XhrStreamReader = function(xhr) {\n  /**\n   * @const\n   * @private {?goog.log.Logger} the logger.\n   */\n  this.logger_ = goog.log.getLogger('goog.net.streams.XhrStreamReader');\n\n  /**\n   * The xhr object passed by the application.\n   *\n   * @private {?goog.net.XhrIo} the XHR object for the stream.\n   */\n  this.xhr_ = xhr;\n\n  /**\n   * To be initialized with the correct content-type.\n   *\n   * @private {?goog.net.streams.StreamParser} the parser for the stream.\n   */\n  this.parser_ = null;\n\n  /**\n   * The position of where the next unprocessed data starts in the XHR\n   * response text.\n   * @private {number}\n   */\n  this.pos_ = 0;\n\n  /**\n   * The status (error detail) of the current stream.\n   * @private {!goog.net.streams.XhrStreamReader.Status}\n   */\n  this.status_ = goog.net.streams.XhrStreamReader.Status.INIT;\n\n  /**\n   * The handler for any status change event.\n   *\n   * @private {?function()} The call back to handle the XHR status change.\n   */\n  this.statusHandler_ = null;\n\n  /**\n   * The handler for new response data.\n   *\n   * @private {?function(!Array<!Object>)} The call back to handle new\n   * response data, parsed as an array of atomic messages.\n   */\n  this.dataHandler_ = null;\n\n  /**\n   * An object to keep track of event listeners.\n   *\n   * @private {!goog.events.EventHandler<!goog.net.streams.XhrStreamReader>}\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  // register the XHR event handler\n  this.eventHandler_.listen(\n      this.xhr_, goog.net.EventType.READY_STATE_CHANGE,\n      this.readyStateChangeHandler_);\n};\n\n\n/**\n * Enum type for current stream status.\n * @enum {number}\n */\ngoog.net.streams.XhrStreamReader.Status = {\n  /**\n   * Init status, with xhr inactive.\n   */\n  INIT: 0,\n\n  /**\n   * XHR being sent.\n   */\n  ACTIVE: 1,\n\n  /**\n   * The request was successful, after the request successfully completes.\n   */\n  SUCCESS: 2,\n\n  /**\n   * Errors due to a non-200 status code or other error conditions.\n   */\n  XHR_ERROR: 3,\n\n  /**\n   * Errors due to no data being returned.\n   */\n  NO_DATA: 4,\n\n  /**\n   * Errors due to corrupted or invalid data being received.\n   */\n  BAD_DATA: 5,\n\n  /**\n   * Errors due to the handler throwing an exception.\n   */\n  HANDLER_EXCEPTION: 6,\n\n  /**\n   * Errors due to a timeout.\n   */\n  TIMEOUT: 7,\n\n  /**\n   * The request is cancelled by the application.\n   */\n  CANCELLED: 8\n};\n\n\n/**\n * Returns whether response streaming is supported on this browser.\n *\n * @return {boolean} false if response streaming is not supported.\n */\ngoog.net.streams.XhrStreamReader.isStreamingSupported = function() {\n  if (goog.userAgent.IE && !goog.userAgent.isDocumentModeOrHigher(10)) {\n    // No active-x due to security issues.\n    return false;\n  }\n\n  if (goog.userAgent.WEBKIT && !goog.userAgent.isVersionOrHigher('420+')) {\n    // Safari 3+\n    // Older versions of Safari always receive null response in INTERACTIVE.\n    return false;\n  }\n\n  if (goog.userAgent.OPERA && !goog.userAgent.WEBKIT) {\n    // Old Opera fires readyState == INTERACTIVE once.\n    // TODO(user): polling the buffer and check the exact Opera version\n    return false;\n  }\n\n  return true;\n};\n\n\n/**\n * Returns a parser that supports the given content-type (mime) and\n * content-transfer-encoding.\n *\n * @return {?goog.net.streams.StreamParser} a parser or null if the content\n *    type or transfer encoding is unsupported.\n * @private\n */\ngoog.net.streams.XhrStreamReader.prototype.getParserByResponseHeader_ =\n    function() {\n  var contentType =\n      this.xhr_.getStreamingResponseHeader(goog.net.XhrIo.CONTENT_TYPE_HEADER);\n  if (!contentType) {\n    goog.log.warning(this.logger_, 'Content-Type unavailable: ' + contentType);\n    return null;\n  }\n  contentType = contentType.toLowerCase();\n\n  if (goog.string.startsWith(contentType, 'application/json')) {\n    if (goog.string.startsWith(contentType, 'application/json+protobuf')) {\n      return new PbJsonStreamParser();\n    }\n    return new goog.net.streams.JsonStreamParser();\n  }\n\n  if (goog.string.startsWith(contentType, 'application/x-protobuf')) {\n    var encoding = this.xhr_.getStreamingResponseHeader(\n        goog.net.XhrIo.CONTENT_TRANSFER_ENCODING);\n    if (!encoding) {\n      return new goog.net.streams.PbStreamParser();\n    }\n    if (encoding.toLowerCase() == 'base64') {\n      return new Base64PbStreamParser();\n    }\n    goog.log.warning(\n        this.logger_, 'Unsupported Content-Transfer-Encoding: ' + encoding +\n            '\\nFor Content-Type: ' + contentType);\n    return null;\n  }\n\n  goog.log.warning(this.logger_, 'Unsupported Content-Type: ' + contentType);\n  return null;\n};\n\n\n/**\n * Returns the XHR request object.\n *\n * @return {goog.net.XhrIo} The XHR object associated with this reader, or\n *    null if the reader has been cleared.\n */\ngoog.net.streams.XhrStreamReader.prototype.getXhr = function() {\n  return this.xhr_;\n};\n\n\n/**\n * Gets the current stream status.\n *\n * @return {!goog.net.streams.XhrStreamReader.Status} The stream status.\n */\ngoog.net.streams.XhrStreamReader.prototype.getStatus = function() {\n  return this.status_;\n};\n\n\n/**\n * Sets the status handler.\n *\n * @param {function()} handler The handler for any status change.\n */\ngoog.net.streams.XhrStreamReader.prototype.setStatusHandler = function(\n    handler) {\n  this.statusHandler_ = handler;\n};\n\n\n/**\n * Sets the data handler.\n *\n * @param {function(!Array<!Object>)} handler The handler for new data.\n */\ngoog.net.streams.XhrStreamReader.prototype.setDataHandler = function(handler) {\n  this.dataHandler_ = handler;\n};\n\n\n/**\n * Handles XHR readystatechange events.\n *\n * TODO(user): throttling may be needed.\n *\n * @param {!goog.events.Event} event The event.\n * @private\n */\ngoog.net.streams.XhrStreamReader.prototype.readyStateChangeHandler_ = function(\n    event) {\n  var xhr = /** @type {goog.net.XhrIo} */ (event.target);\n\n\n  try {\n    if (xhr == this.xhr_) {\n      this.onReadyStateChanged_();\n    } else {\n      goog.log.warning(this.logger_, 'Called back with an unexpected xhr.');\n    }\n  } catch (ex) {\n    goog.log.error(\n        this.logger_, 'readyStateChangeHandler_ thrown exception' +\n            ' ' + ex);\n    // no rethrow\n    this.updateStatus_(\n        goog.net.streams.XhrStreamReader.Status.HANDLER_EXCEPTION);\n    this.clear_();\n  }\n};\n\n\n/**\n * Called from readyStateChangeHandler_.\n *\n * @private\n */\ngoog.net.streams.XhrStreamReader.prototype.onReadyStateChanged_ = function() {\n  var readyState = this.xhr_.getReadyState();\n  var errorCode = this.xhr_.getLastErrorCode();\n  var statusCode = this.xhr_.getStatus();\n  var responseText = this.xhr_.getResponseText();\n\n  // we get partial results in browsers that support ready state interactive.\n  // We also make sure that getResponseText is not null in interactive mode\n  // before we continue.\n  if (readyState < goog.net.XmlHttp.ReadyState.INTERACTIVE ||\n      readyState == goog.net.XmlHttp.ReadyState.INTERACTIVE && !responseText) {\n    return;\n  }\n\n  // TODO(user): white-list other 2xx responses with application payload\n  var successful =\n      (statusCode == goog.net.HttpStatus.OK ||\n       statusCode == goog.net.HttpStatus.PARTIAL_CONTENT);\n\n  if (readyState == goog.net.XmlHttp.ReadyState.COMPLETE) {\n    if (errorCode == goog.net.ErrorCode.TIMEOUT) {\n      this.updateStatus_(goog.net.streams.XhrStreamReader.Status.TIMEOUT);\n    } else if (errorCode == goog.net.ErrorCode.ABORT) {\n      this.updateStatus_(goog.net.streams.XhrStreamReader.Status.CANCELLED);\n    } else if (!successful) {\n      this.updateStatus_(goog.net.streams.XhrStreamReader.Status.XHR_ERROR);\n    }\n  }\n\n  if (successful && !responseText) {\n    goog.log.warning(\n        this.logger_, 'No response text for xhr ' + this.xhr_.getLastUri() +\n            ' status ' + statusCode);\n  }\n\n  if (!this.parser_) {\n    this.parser_ = this.getParserByResponseHeader_();\n    if (this.parser_ == null) {\n      this.updateStatus_(goog.net.streams.XhrStreamReader.Status.BAD_DATA);\n    }\n  }\n\n  if (this.status_ > goog.net.streams.XhrStreamReader.Status.SUCCESS) {\n    this.clear_();\n    return;\n  }\n\n  // Parses and delivers any new data, with error status.\n  if (responseText.length > this.pos_) {\n    var newData = responseText.substr(this.pos_);\n    this.pos_ = responseText.length;\n    try {\n      var messages = this.parser_.parse(newData);\n      if (messages != null) {\n        if (this.dataHandler_) {\n          this.dataHandler_(messages);\n        }\n      }\n    } catch (ex) {\n      goog.log.error(\n          this.logger_, 'Invalid response ' + ex + '\\n' + responseText);\n      this.updateStatus_(goog.net.streams.XhrStreamReader.Status.BAD_DATA);\n      this.clear_();\n      return;\n    }\n  }\n\n  if (readyState == goog.net.XmlHttp.ReadyState.COMPLETE) {\n    if (responseText.length == 0) {\n      this.updateStatus_(goog.net.streams.XhrStreamReader.Status.NO_DATA);\n    } else {\n      this.updateStatus_(goog.net.streams.XhrStreamReader.Status.SUCCESS);\n    }\n    this.clear_();\n    return;\n  }\n\n  this.updateStatus_(goog.net.streams.XhrStreamReader.Status.ACTIVE);\n};\n\n\n/**\n * Update the status and may call the handler.\n *\n * @param {!goog.net.streams.XhrStreamReader.Status} status The new status\n * @private\n */\ngoog.net.streams.XhrStreamReader.prototype.updateStatus_ = function(status) {\n  var current = this.status_;\n  if (current != status) {\n    this.status_ = status;\n    if (this.statusHandler_) {\n      this.statusHandler_();\n    }\n  }\n};\n\n\n/**\n * Clears after the XHR terminal state is reached.\n *\n * @private\n */\ngoog.net.streams.XhrStreamReader.prototype.clear_ = function() {\n  this.eventHandler_.removeAll();\n\n  if (this.xhr_) {\n    // clear out before aborting to avoid being reentered inside abort\n    var xhr = this.xhr_;\n    this.xhr_ = null;\n    xhr.abort();\n    xhr.dispose();\n  }\n};\n\n});  // goog.scope\n","^?",1579837703000,"^@",["^A",["~$goog.net.streams.Base64PbStreamParser","^2R","~$goog.net.HttpStatus","^4C","^16","~$goog.net.streams.PbStreamParser","^3","^18","~$goog.net.streams.JsonStreamParser","^3B","^4F","^SB","~$goog.net.streams.PbJsonStreamParser","~$goog.net.ErrorCode"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/streams/xhrstreamreader.js"],"^S",["^A",["~$goog.net.streams.XhrStreamReader"]],"^1",true,"^2",["^3","^2R","^3B","^SR","^4F","^SN","^4C","^SB","^SM","^SP","^SQ","^SO","^16","^18"]],["^ ","^7",[1579837703000],"^8","goog.ui.popupmenu.js","^9",["^:","goog/ui/popupmenu.js"],"^;","goog/ui/popupmenu.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A menu class for showing popups.  A single popup can be\n * attached to multiple anchor points.  The menu will try to reposition itself\n * if it goes outside the viewport.\n *\n * Decoration is the same as goog.ui.Menu except that the outer DIV can have a\n * 'for' property, which is the ID of the element which triggers the popup.\n *\n * Decorate Example:\n * <button id=\"dButton\">Decorated Popup</button>\n * <div id=\"dMenu\" for=\"dButton\" class=\"goog-menu\">\n *   <div class=\"goog-menuitem\">A a</div>\n *   <div class=\"goog-menuitem\">B b</div>\n *   <div class=\"goog-menuitem\">C c</div>\n *   <div class=\"goog-menuitem\">D d</div>\n *   <div class=\"goog-menuitem\">E e</div>\n *   <div class=\"goog-menuitem\">F f</div>\n * </div>\n *\n * TESTED=FireFox 2.0, IE6, Opera 9, Chrome.\n * TODO(user): Key handling is flakey in Opera and Chrome\n *\n * @see ../demos/popupmenu.html\n */\n\ngoog.provide('goog.ui.PopupMenu');\n\ngoog.require('goog.events');\ngoog.require('goog.events.BrowserEvent');\ngoog.require('goog.events.BrowserEvent.MouseButton');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.positioning.AnchoredViewportPosition');\ngoog.require('goog.positioning.Corner');\ngoog.require('goog.positioning.MenuAnchoredPosition');\ngoog.require('goog.positioning.Overflow');\ngoog.require('goog.positioning.ViewportClientPosition');\ngoog.require('goog.structs.Map');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Menu');\ngoog.require('goog.ui.PopupBase');\n\n\n\n/**\n * A basic menu class.\n * @param {?goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @param {?goog.ui.MenuRenderer=} opt_renderer Renderer used to render or\n *     decorate the container; defaults to {@link goog.ui.MenuRenderer}.\n * @extends {goog.ui.Menu}\n * @constructor\n */\ngoog.ui.PopupMenu = function(opt_domHelper, opt_renderer) {\n  goog.ui.Menu.call(this, opt_domHelper, opt_renderer);\n\n  this.setAllowAutoFocus(true);\n\n  // Popup menus are hidden by default.\n  this.setVisible(false, true);\n\n  /**\n   * Map of attachment points for the menu.  Key -> Object\n   * @type {!goog.structs.Map}\n   * @private\n   */\n  this.targets_ = new goog.structs.Map();\n};\ngoog.inherits(goog.ui.PopupMenu, goog.ui.Menu);\ngoog.tagUnsealableClass(goog.ui.PopupMenu);\n\n\n/**\n * If true, then if the menu will toggle off if it is already visible.\n * @type {boolean}\n * @private\n */\ngoog.ui.PopupMenu.prototype.toggleMode_ = false;\n\n/**\n * If true, then the browser context menu will override the menu activation when\n * the shift key is held down.\n * @type {boolean}\n * @private\n */\ngoog.ui.PopupMenu.prototype.shiftOverride_ = false;\n\n\n/**\n * Time that the menu was last shown.\n * @type {number}\n * @private\n */\ngoog.ui.PopupMenu.prototype.lastHide_ = 0;\n\n\n/**\n * Current element where the popup menu is anchored.\n * @type {?Element}\n * @private\n */\ngoog.ui.PopupMenu.prototype.currentAnchor_ = null;\n\n\n/**\n * Decorate an existing HTML structure with the menu. Menu items will be\n * constructed from elements with classname 'goog-menuitem', separators will be\n * made from HR elements.\n * @param {?Element} element Element to decorate.\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.PopupMenu.prototype.decorateInternal = function(element) {\n  goog.ui.PopupMenu.superClass_.decorateInternal.call(this, element);\n  // 'for' is a custom attribute for attaching the menu to a click target\n  var htmlFor = element.getAttribute('for') || element.htmlFor;\n  if (htmlFor) {\n    this.attach(\n        this.getDomHelper().getElement(htmlFor),\n        goog.positioning.Corner.BOTTOM_LEFT);\n  }\n};\n\n\n/** @override */\ngoog.ui.PopupMenu.prototype.enterDocument = function() {\n  goog.ui.PopupMenu.superClass_.enterDocument.call(this);\n\n  this.targets_.forEach(this.attachEvent_, this);\n\n  var handler = this.getHandler();\n  handler.listen(this, goog.ui.Component.EventType.ACTION, this.onAction_);\n  handler.listen(\n      this.getDomHelper().getDocument(), goog.events.EventType.MOUSEDOWN,\n      this.onDocClick, true);\n};\n\n\n/**\n * Attaches the menu to a new popup position and anchor element.  A menu can\n * only be attached to an element once, since attaching the same menu for\n * multiple positions doesn't make sense.\n *\n * @param {?Element} element Element whose click event should trigger the menu.\n * @param {?goog.positioning.Corner=} opt_targetCorner Corner of the target that\n *     the menu should be anchored to.\n * @param {goog.positioning.Corner=} opt_menuCorner Corner of the menu that\n *     should be anchored.\n * @param {boolean=} opt_contextMenu Whether the menu should show on\n *     {@link goog.events.EventType.CONTEXTMENU} events, false if it should\n *     show on {@link goog.events.EventType.MOUSEDOWN} events. Default is\n *     MOUSEDOWN.\n * @param {?goog.math.Box=} opt_margin Margin for the popup used in positioning\n *     algorithms.\n */\ngoog.ui.PopupMenu.prototype.attach = function(\n    element, opt_targetCorner, opt_menuCorner, opt_contextMenu, opt_margin) {\n\n  if (this.isAttachTarget(element)) {\n    // Already in the popup, so just return.\n    return;\n  }\n\n  var target = this.createAttachTarget(\n      element, opt_targetCorner, opt_menuCorner, opt_contextMenu, opt_margin);\n\n  if (this.isInDocument()) {\n    this.attachEvent_(target);\n  }\n\n  // Add a listener for keyboard actions on the menu.\n  var handler = goog.partial(this.onMenuKeyboardAction_, element);\n  if (this.getElement()) {\n    this.getHandler().listen(\n        this.getElement(), goog.events.EventType.KEYDOWN, handler);\n  }\n};\n\n\n/**\n * Handles keyboard actions on the PopupMenu, according to\n * http://www.w3.org/WAI/PF/aria-practices/#menubutton.\n *\n * <p>If the ESC key is pressed, the menu is hidden (which is handled by\n * this.onAction_), and the focus is returned to the element whose click event\n * triggered opening of the menu.\n *\n * <p>If the SPACE or ENTER keys are pressed, the highlighted menu item's\n * listeners are fired.\n *\n * @param {Element} element Element whose click event triggered the menu.\n * @param {!goog.events.BrowserEvent} e The key down event.\n * @private\n */\ngoog.ui.PopupMenu.prototype.onMenuKeyboardAction_ = function(element, e) {\n  if (e.keyCode == goog.events.KeyCodes.ESC) {\n    element.focus();\n    return;\n  }\n  var highlightedItem = this.getChildAt(this.getHighlightedIndex());\n  if (!highlightedItem) {\n    return;\n  }\n  var targetElement = highlightedItem.getElement();\n  // Create an event to pass to the menu item's listener.\n  var event = new goog.events.BrowserEvent(e.getBrowserEvent(), targetElement);\n  event.target = targetElement;\n  // If an item is highlighted and the user presses the SPACE/ENTER key, the\n  // event target is the menu rather than the menu item, so we manually fire\n  // the listener of the correct menu item.\n  if (e.keyCode == goog.events.KeyCodes.SPACE ||\n      e.keyCode == goog.events.KeyCodes.ENTER) {\n    goog.events.fireListeners(\n        targetElement, goog.events.EventType.KEYDOWN, false, event);\n  }\n  // After activating a menu item the PopupMenu should be hidden (already\n  // implemented in this.onAction_ for ENTER/MOUSEDOWN).\n  if (e.keyCode == goog.events.KeyCodes.SPACE) {\n    this.hide();\n  }\n};\n\n\n/**\n * Creates an object describing how the popup menu should be attached to the\n * anchoring element based on the given parameters. The created object is\n * stored, keyed by `element` and is retrievable later by invoking\n * {@link #getAttachTarget(element)} at a later point.\n *\n * Subclass may add more properties to the returned object, as needed.\n *\n * @param {?Element} element Element whose click event should trigger the menu.\n * @param {?goog.positioning.Corner=} opt_targetCorner Corner of the target that\n *     the menu should be anchored to.\n * @param {?goog.positioning.Corner=} opt_menuCorner Corner of the menu that\n *     should be anchored.\n * @param {boolean=} opt_contextMenu Whether the menu should show on\n *     {@link goog.events.EventType.CONTEXTMENU} events, false if it should\n *     show on {@link goog.events.EventType.MOUSEDOWN} events. Default is\n *     MOUSEDOWN.\n * @param {?goog.math.Box=} opt_margin Margin for the popup used in positioning\n *     algorithms.\n *\n * @return {?Object} An object that describes how the popup menu should be\n *     attached to the anchoring element.\n *\n * @protected\n */\ngoog.ui.PopupMenu.prototype.createAttachTarget = function(\n    element, opt_targetCorner, opt_menuCorner, opt_contextMenu, opt_margin) {\n  if (!element) {\n    return null;\n  }\n\n  var target = {\n    element_: element,\n    targetCorner_: opt_targetCorner,\n    menuCorner_: opt_menuCorner,\n    eventType_: opt_contextMenu ? goog.events.EventType.CONTEXTMENU :\n                                  goog.events.EventType.MOUSEDOWN,\n    margin_: opt_margin\n  };\n\n  this.targets_.set(goog.getUid(element), target);\n\n  return target;\n};\n\n\n/**\n * Returns the object describing how the popup menu should be attach to given\n * element or `null`. The object is created and the association is formed\n * when {@link #attach} is invoked.\n *\n * @param {?Element} element DOM element.\n * @return {?Object} The object created when {@link attach} is invoked on\n *     `element`. Returns `null` if the element does not trigger\n *     the menu (i.e. {@link attach} has never been invoked on\n *     `element`).\n * @protected\n */\ngoog.ui.PopupMenu.prototype.getAttachTarget = function(element) {\n  return element ?\n      /** @type {?Object} */ (this.targets_.get(goog.getUid(element))) :\n                             null;\n};\n\n\n/**\n * @param {?Element} element Any DOM element.\n * @return {boolean} Whether clicking on the given element will trigger the\n *     menu.\n *\n * @protected\n */\ngoog.ui.PopupMenu.prototype.isAttachTarget = function(element) {\n  return element ? this.targets_.containsKey(goog.getUid(element)) : false;\n};\n\n\n/**\n * @return {?Element} The current element where the popup is anchored, if it's\n *     visible.\n */\ngoog.ui.PopupMenu.prototype.getAttachedElement = function() {\n  return this.currentAnchor_;\n};\n\n\n/**\n * Attaches two event listeners to a target. One with corresponding event type,\n * and one with the KEYDOWN event type for accessibility purposes.\n * @param {?Object} target The target to attach an event to.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.PopupMenu.prototype.attachEvent_ = function(target) {\n  this.getHandler().listen(\n      target.element_, target.eventType_, this.onTargetClick_);\n  if (target.eventType_ != goog.events.EventType.CONTEXTMENU) {\n    this.getHandler().listen(\n        target.element_, goog.events.EventType.KEYDOWN,\n        this.onTargetKeyboardAction_);\n  }\n};\n\n\n/**\n * Detaches all listeners\n */\ngoog.ui.PopupMenu.prototype.detachAll = function() {\n  if (this.isInDocument()) {\n    var keys = this.targets_.getKeys();\n    for (var i = 0; i < keys.length; i++) {\n      this.detachEvent_(/** @type {!Object} */ (this.targets_.get(keys[i])));\n    }\n  }\n\n  this.targets_.clear();\n};\n\n\n/**\n * Detaches a menu from a given element.\n * @param {?Element} element Element whose click event should trigger the menu.\n */\ngoog.ui.PopupMenu.prototype.detach = function(element) {\n  if (!this.isAttachTarget(element)) {\n    throw new Error('Menu not attached to provided element, unable to detach.');\n  }\n\n  var key = goog.getUid(element);\n  if (this.isInDocument()) {\n    this.detachEvent_(/** @type {!Object} */ (this.targets_.get(key)));\n  }\n\n  this.targets_.remove(key);\n};\n\n\n/**\n * Detaches an event listener to a target\n * @param {!Object} target The target to detach events from.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.PopupMenu.prototype.detachEvent_ = function(target) {\n  this.getHandler().unlisten(\n      target.element_, target.eventType_, this.onTargetClick_);\n};\n\n\n/**\n * Sets whether the menu should toggle if it is already open.  For context\n * menus this should be false, for toolbar menus it makes more sense to be true.\n * @param {boolean} toggle The new toggle mode.\n */\ngoog.ui.PopupMenu.prototype.setToggleMode = function(toggle) {\n  this.toggleMode_ = toggle;\n};\n\n/**\n * Sets whether the browser context menu will override the menu activation when\n * the shift key is held down.\n * @param {boolean} shiftOverride\n */\ngoog.ui.PopupMenu.prototype.setShiftOverride = function(shiftOverride) {\n  this.shiftOverride_ = shiftOverride;\n};\n\n/**\n * Gets whether the menu is in toggle mode\n * @return {boolean} toggle.\n */\ngoog.ui.PopupMenu.prototype.getToggleMode = function() {\n  return this.toggleMode_;\n};\n\n/**\n * Gets whether the browser context menu will override the menu activation when\n * the shift key is held down.\n * @return {boolean}\n */\ngoog.ui.PopupMenu.prototype.getShiftOverride = function() {\n  return this.shiftOverride_;\n};\n\n\n/**\n * Show the menu using given positioning object.\n * @param {?goog.positioning.AbstractPosition} position The positioning\n *     instance.\n * @param {goog.positioning.Corner=} opt_menuCorner The corner of the menu to be\n *     positioned.\n * @param {?goog.math.Box=} opt_margin A margin specified in pixels.\n * @param {?Element=} opt_anchor The element which acts as visual anchor for\n *     this menu.\n */\ngoog.ui.PopupMenu.prototype.showWithPosition = function(\n    position, opt_menuCorner, opt_margin, opt_anchor) {\n  var isVisible = this.isVisible();\n  if (this.isOrWasRecentlyVisible() && this.toggleMode_) {\n    this.hide();\n    return;\n  }\n\n  // Set current anchor before dispatching BEFORE_SHOW. This is typically useful\n  // when we would need to make modifications based on the current anchor to the\n  // menu just before displaying it.\n  this.currentAnchor_ = opt_anchor || null;\n\n  // Notify event handlers that the menu is about to be shown.\n  if (!this.dispatchEvent(goog.ui.Component.EventType.BEFORE_SHOW)) {\n    return;\n  }\n\n  var menuCorner = typeof opt_menuCorner != 'undefined' ?\n      opt_menuCorner :\n      goog.positioning.Corner.TOP_START;\n\n  // This is a little hacky so that we can position the menu with minimal\n  // flicker.\n\n  if (!isVisible) {\n    // On IE, setting visibility = 'hidden' on a visible menu\n    // will cause a blur, forcing the menu to close immediately.\n    this.getElement().style.visibility = 'hidden';\n  }\n\n  goog.style.setElementShown(this.getElement(), true);\n  position.reposition(this.getElement(), menuCorner, opt_margin);\n\n  if (!isVisible) {\n    this.getElement().style.visibility = 'visible';\n  }\n\n  this.setHighlightedIndex(-1);\n\n  // setVisible dispatches a goog.ui.Component.EventType.SHOW event, which may\n  // be canceled to prevent the menu from being shown.\n  this.setVisible(true);\n};\n\n\n/**\n * Show the menu at a given attached target.\n * @param {!Object} target Popup target.\n * @param {number} x The client-X associated with the show event.\n * @param {number} y The client-Y associated with the show event.\n * @protected\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.PopupMenu.prototype.showMenu = function(target, x, y) {\n  var position = (target.targetCorner_ !== undefined) ?\n      new goog.positioning.AnchoredViewportPosition(\n          target.element_, target.targetCorner_, true) :\n      new goog.positioning.ViewportClientPosition(x, y);\n  if (position.setLastResortOverflow) {\n    // This is a ViewportClientPosition, so we can set the overflow policy.\n    // Allow the menu to slide from the corner rather than clipping if it is\n    // completely impossible to fit it otherwise.\n    position.setLastResortOverflow(\n        goog.positioning.Overflow.ADJUST_X |\n        goog.positioning.Overflow.ADJUST_Y);\n  }\n  this.showWithPosition(\n      position, target.menuCorner_, target.margin_, target.element_);\n};\n\n\n/**\n * Shows the menu immediately at the given client coordinates.\n * @param {number} x The client-X associated with the show event.\n * @param {number} y The client-Y associated with the show event.\n * @param {goog.positioning.Corner=} opt_menuCorner Corner of the menu that\n *     should be anchored.\n */\ngoog.ui.PopupMenu.prototype.showAt = function(x, y, opt_menuCorner) {\n  this.showWithPosition(\n      new goog.positioning.ViewportClientPosition(x, y), opt_menuCorner);\n};\n\n\n/**\n * Shows the menu immediately attached to the given element\n * @param {?Element} element The element to show at.\n * @param {goog.positioning.Corner} targetCorner The corner of the target to\n *     anchor to.\n * @param {goog.positioning.Corner=} opt_menuCorner Corner of the menu that\n *     should be anchored.\n */\ngoog.ui.PopupMenu.prototype.showAtElement = function(\n    element, targetCorner, opt_menuCorner) {\n  this.showWithPosition(\n      new goog.positioning.MenuAnchoredPosition(element, targetCorner, true),\n      opt_menuCorner, null, element);\n};\n\n\n/**\n * Hides the menu.\n */\ngoog.ui.PopupMenu.prototype.hide = function() {\n  if (!this.isVisible()) {\n    return;\n  }\n\n  // setVisible dispatches a goog.ui.Component.EventType.HIDE event, which may\n  // be canceled to prevent the menu from being hidden.\n  this.setVisible(false);\n  if (!this.isVisible()) {\n    // HIDE event wasn't canceled; the menu is now hidden.\n    this.lastHide_ = goog.now();\n    this.currentAnchor_ = null;\n  }\n};\n\n\n/**\n * Returns whether the menu is currently visible or was visible within about\n * 150 ms ago.  This stops the menu toggling back on if the toggleMode == false.\n * @return {boolean} Whether the popup is currently visible or was visible\n *     within about 150 ms ago.\n */\ngoog.ui.PopupMenu.prototype.isOrWasRecentlyVisible = function() {\n  return this.isVisible() || this.wasRecentlyHidden();\n};\n\n\n/**\n * Used to stop the menu toggling back on if the toggleMode == false.\n * @return {boolean} Whether the menu was recently hidden.\n * @protected\n */\ngoog.ui.PopupMenu.prototype.wasRecentlyHidden = function() {\n  return goog.now() - this.lastHide_ < goog.ui.PopupBase.DEBOUNCE_DELAY_MS;\n};\n\n\n/**\n * Dismiss the popup menu when an action fires.\n * @param {?goog.events.Event=} opt_e The optional event.\n * @private\n */\ngoog.ui.PopupMenu.prototype.onAction_ = function(opt_e) {\n  this.hide();\n};\n\n\n/**\n * Handles a browser click event on one of the popup targets.\n * @param {?goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.ui.PopupMenu.prototype.onTargetClick_ = function(e) {\n  if (this.shiftOverride_ && e.shiftKey &&\n      e.button == goog.events.BrowserEvent.MouseButton.RIGHT) {\n    return;\n  }\n  this.onTargetActivation_(e);\n};\n\n\n/**\n * Handles a KEYDOWN browser event on one of the popup targets.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @private\n */\ngoog.ui.PopupMenu.prototype.onTargetKeyboardAction_ = function(e) {\n  if (e.keyCode == goog.events.KeyCodes.SPACE ||\n      e.keyCode == goog.events.KeyCodes.ENTER ||\n      e.keyCode == goog.events.KeyCodes.DOWN) {\n    this.onTargetActivation_(e);\n  }\n  // If the popupmenu is opened using the DOWN key, the focus should be on the\n  // first menu item.\n  if (e.keyCode == goog.events.KeyCodes.DOWN) {\n    this.highlightFirst();\n  }\n};\n\n\n/**\n * Handles a browser event on one of the popup targets.\n * @param {?goog.events.BrowserEvent} e The browser event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.PopupMenu.prototype.onTargetActivation_ = function(e) {\n  var keys = this.targets_.getKeys();\n  for (var i = 0; i < keys.length; i++) {\n    var target = /** @type {!Object} */ (this.targets_.get(keys[i]));\n    if (target.element_ == e.currentTarget) {\n      this.showMenu(target, (e.clientX), (e.clientY));\n      e.preventDefault();\n      e.stopPropagation();\n      return;\n    }\n  }\n};\n\n\n/**\n * Handles click events that propagate to the document.\n * @param {!goog.events.BrowserEvent} e The browser event.\n * @protected\n */\ngoog.ui.PopupMenu.prototype.onDocClick = function(e) {\n  if (this.isVisible() &&\n      !this.containsElement(/** @type {!Element} */ (e.target))) {\n    this.hide();\n  }\n};\n\n\n/**\n * Handles the key event target losing focus.\n * @param {?goog.events.BrowserEvent} e The browser event.\n * @protected\n * @override\n */\ngoog.ui.PopupMenu.prototype.handleBlur = function(e) {\n  goog.ui.PopupMenu.superClass_.handleBlur.call(this, e);\n  this.hide();\n};\n\n\n/** @override */\ngoog.ui.PopupMenu.prototype.disposeInternal = function() {\n  // Always call the superclass' disposeInternal() first (Bug 715885).\n  goog.ui.PopupMenu.superClass_.disposeInternal.call(this);\n\n  // Disposes of the attachment target map.\n  if (this.targets_) {\n    this.targets_.clear();\n    delete this.targets_;\n  }\n};\n","^?",1579837703000,"^@",["^A",["^1@","~$goog.positioning.ViewportClientPosition","~$goog.ui.PopupBase","~$goog.positioning.AnchoredViewportPosition","^1Q","~$goog.events.BrowserEvent.MouseButton","^1B","^3","^1C","^36","^40","^2Y","^43","~$goog.events.BrowserEvent","^45","^1N"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/popupmenu.js"],"^S",["^A",["~$goog.ui.PopupMenu"]],"^1",true,"^2",["^3","^1N","^SX","^SW","^1C","^45","^SV","^1@","^43","^40","^ST","^1Q","^2Y","^1B","^36","^SU"]],["^ ","^7",[1579837703000],"^8","goog.testing.asserts.js","^9",["^:","goog/testing/asserts.js"],"^;","goog/testing/asserts.js","^<","^=","^>","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.testing.asserts');\ngoog.setTestOnly();\n\ngoog.require('goog.testing.JsUnitException');\n\n// TODO(user): Copied from JsUnit with some small modifications, we should\n// reimplement the asserters.\n\nvar DOUBLE_EQUALITY_PREDICATE = function(var1, var2) {\n  return var1 == var2;\n};\nvar JSUNIT_UNDEFINED_VALUE = void 0;\nvar TO_STRING_EQUALITY_PREDICATE = function(var1, var2) {\n  return var1.toString() === var2.toString();\n};\nvar OUTPUT_NEW_LINE_THRESHOLD = 40;\n\n\n/** @typedef {function(?, ?):boolean} */\nvar PredicateFunctionType;\n\n\n/**\n * @const {{\n *   String : PredicateFunctionType,\n *   Number : PredicateFunctionType,\n *   Boolean : PredicateFunctionType,\n *   Date : PredicateFunctionType,\n *   RegExp : PredicateFunctionType,\n *   Function : PredicateFunctionType\n * }}\n */\nvar PRIMITIVE_EQUALITY_PREDICATES = {\n  'String': DOUBLE_EQUALITY_PREDICATE,\n  'Number': DOUBLE_EQUALITY_PREDICATE,\n  'Bigint': DOUBLE_EQUALITY_PREDICATE,\n  'Boolean': DOUBLE_EQUALITY_PREDICATE,\n  'Date': function(date1, date2) {\n    return date1.getTime() == date2.getTime();\n  },\n  'RegExp': TO_STRING_EQUALITY_PREDICATE,\n  'Function': TO_STRING_EQUALITY_PREDICATE\n};\n\n\n/**\n * Compares equality of two numbers, allowing them to differ up to a given\n * tolerance.\n * @param {number} var1 A number.\n * @param {number} var2 A number.\n * @param {number} tolerance the maximum allowed difference.\n * @return {boolean} Whether the two variables are sufficiently close.\n * @private\n */\ngoog.testing.asserts.numberRoughEqualityPredicate_ = function(\n    var1, var2, tolerance) {\n  return Math.abs(var1 - var2) <= tolerance;\n};\n\n\n/**\n * @type {!Object<string, function(?, ?, number): boolean>}\n * @private\n */\ngoog.testing.asserts.primitiveRoughEqualityPredicates_ = {\n  'Number': goog.testing.asserts.numberRoughEqualityPredicate_\n};\n\n\nvar _trueTypeOf = function(something) {\n  var result = typeof something;\n  try {\n    switch (result) {\n      case 'string':\n        break;\n      case 'boolean':\n        break;\n      case 'number':\n        break;\n      case 'object':\n        if (something == null) {\n          result = 'null';\n          break;\n        }\n      case 'function':\n        switch (something.constructor) {\n          case new String('').constructor:\n            result = 'String';\n            break;\n          case new Boolean(true).constructor:\n            result = 'Boolean';\n            break;\n          case new Number(0).constructor:\n            result = 'Number';\n            break;\n          case new Array().constructor:\n            result = 'Array';\n            break;\n          case new RegExp().constructor:\n            result = 'RegExp';\n            break;\n          case new Date().constructor:\n            result = 'Date';\n            break;\n          case Function:\n            result = 'Function';\n            break;\n          default:\n            var m =\n                something.constructor.toString().match(/function\\s*([^( ]+)\\(/);\n            if (m) {\n              result = m[1];\n            } else {\n              break;\n            }\n        }\n        break;\n    }\n  } catch (e) {\n  } finally {\n    result = result.substr(0, 1).toUpperCase() + result.substr(1);\n  }\n  return result;\n};\n\nvar _displayStringForValue = function(aVar) {\n  var result;\n  try {\n    result = '<' + String(aVar) + '>';\n  } catch (ex) {\n    result = '<toString failed: ' + ex.message + '>';\n    // toString does not work on this object :-(\n  }\n  if (!(aVar === null || aVar === JSUNIT_UNDEFINED_VALUE)) {\n    result += ' (' + _trueTypeOf(aVar) + ')';\n  }\n  return result;\n};\n\n/** @param {?} failureMessage */\ngoog.testing.asserts.fail = function(failureMessage) {\n  goog.testing.asserts.raiseException('Call to fail()', failureMessage);\n};\n/** @const */\nvar fail = goog.testing.asserts.fail;\n\nvar argumentsIncludeComments = function(expectedNumberOfNonCommentArgs, args) {\n  return args.length == expectedNumberOfNonCommentArgs + 1;\n};\n\nvar commentArg = function(expectedNumberOfNonCommentArgs, args) {\n  if (argumentsIncludeComments(expectedNumberOfNonCommentArgs, args)) {\n    return args[0];\n  }\n\n  return null;\n};\n\nvar nonCommentArg = function(\n    desiredNonCommentArgIndex, expectedNumberOfNonCommentArgs, args) {\n  return argumentsIncludeComments(expectedNumberOfNonCommentArgs, args) ?\n      args[desiredNonCommentArgIndex] :\n      args[desiredNonCommentArgIndex - 1];\n};\n\nvar _validateArguments = function(expectedNumberOfNonCommentArgs, args) {\n  var valid = args.length == expectedNumberOfNonCommentArgs ||\n      args.length == expectedNumberOfNonCommentArgs + 1 &&\n          typeof args[0] === 'string';\n  if (!valid) {\n    goog.testing.asserts.raiseException(\n        'Incorrect arguments passed to assert function.\\n' +\n        'Expected ' + expectedNumberOfNonCommentArgs + ' argument(s) plus ' +\n        'optional comment; got ' + args.length + '.');\n  }\n};\n\n/**\n * @return {?} goog.testing.TestCase or null\n * We suppress the lint error and we explicitly do not goog.require()\n * goog.testing.TestCase to avoid a build time dependency cycle.\n * @suppress {missingRequire|undefinedNames|undefinedVars|missingProperties}\n * @private\n */\nvar _getCurrentTestCase = function() {\n  // Some users of goog.testing.asserts do not use goog.testing.TestRunner and\n  // they do not include goog.testing.TestCase. Exceptions will not be\n  // completely correct for these users.\n  if (!goog.testing.TestCase) {\n    if (goog.global.console) {\n      goog.global.console.error(\n          'Missing goog.testing.TestCase, ' +\n          'add /* @suppress {extraRequire} */' +\n          'goog.require(\\'goog.testing.TestCase\\'');\n    }\n    return null;\n  }\n  return goog.testing.TestCase.getActiveTestCase();\n};\n\nvar _assert = function(comment, booleanValue, failureMessage) {\n  if (!booleanValue) {\n    goog.testing.asserts.raiseException(comment, failureMessage);\n  }\n};\n\n\n/**\n * @param {*} expected The expected value.\n * @param {*} actual The actual value.\n * @return {string} A failure message of the values don't match.\n * @private\n */\ngoog.testing.asserts.getDefaultErrorMsg_ = function(expected, actual) {\n  var expectedDisplayString = _displayStringForValue(expected);\n  var actualDisplayString = _displayStringForValue(actual);\n  var shouldUseNewLines =\n      expectedDisplayString.length > OUTPUT_NEW_LINE_THRESHOLD ||\n      actualDisplayString.length > OUTPUT_NEW_LINE_THRESHOLD;\n  var msg = [\n    'Expected', expectedDisplayString, 'but was', actualDisplayString\n  ].join(shouldUseNewLines ? '\\n' : ' ');\n\n  if ((typeof expected == 'string') && (typeof actual == 'string')) {\n    // Try to find a human-readable difference.\n    var limit = Math.min(expected.length, actual.length);\n    var commonPrefix = 0;\n    while (commonPrefix < limit &&\n           expected.charAt(commonPrefix) == actual.charAt(commonPrefix)) {\n      commonPrefix++;\n    }\n\n    var commonSuffix = 0;\n    while (commonSuffix < limit &&\n           expected.charAt(expected.length - commonSuffix - 1) ==\n               actual.charAt(actual.length - commonSuffix - 1)) {\n      commonSuffix++;\n    }\n\n    if (commonPrefix + commonSuffix > limit) {\n      commonSuffix = 0;\n    }\n\n    if (commonPrefix > 2 || commonSuffix > 2) {\n      var printString = function(str) {\n        var startIndex = Math.max(0, commonPrefix - 2);\n        var endIndex = Math.min(str.length, str.length - (commonSuffix - 2));\n        return (startIndex > 0 ? '...' : '') +\n            str.substring(startIndex, endIndex) +\n            (endIndex < str.length ? '...' : '');\n      };\n\n      var expectedPrinted = printString(expected);\n      var expectedActual = printString(actual);\n      var shouldUseNewLinesInDiff =\n          expectedPrinted.length > OUTPUT_NEW_LINE_THRESHOLD ||\n          expectedActual.length > OUTPUT_NEW_LINE_THRESHOLD;\n      msg += '\\nDifference was at position ' + commonPrefix + '. ' + [\n        'Expected', '[' + expectedPrinted + ']', 'vs. actual',\n        '[' + expectedActual + ']'\n      ].join(shouldUseNewLinesInDiff ? '\\n' : ' ');\n    }\n  }\n  return msg;\n};\n\n\n/**\n * @param {*} a The value to assert (1 arg) or debug message (2 args).\n * @param {*=} opt_b The value to assert (2 args only).\n */\ngoog.testing.asserts.assert = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var comment = commentArg(1, arguments);\n  var booleanValue = nonCommentArg(1, 1, arguments);\n\n  _assert(\n      comment, typeof booleanValue === 'boolean',\n      'Bad argument to assert(boolean)');\n  _assert(comment, booleanValue, 'Call to assert(boolean) with false');\n};\n/** @const */\nvar assert = goog.testing.asserts.assert;\n\n\n/**\n * Asserts that the function throws an error.\n *\n * @param {!(string|Function)} a The assertion comment or the function to call.\n * @param {!Function=} opt_b The function to call (if the first argument of\n *     `assertThrows` was the comment).\n * @return {!Error} The error thrown by the function. Beware that code may throw\n *     other types in strange scenarios.\n * @throws {goog.testing.JsUnitException} If the assertion failed.\n */\ngoog.testing.asserts.assertThrows = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var func = nonCommentArg(1, 1, arguments);\n  var comment = commentArg(1, arguments);\n  _assert(\n      comment, typeof func == 'function',\n      'Argument passed to assertThrows is not a function');\n\n  try {\n    func();\n  } catch (e) {\n    goog.testing.asserts.removeOperaStacktrace_(e);\n\n    var testCase = _getCurrentTestCase();\n    if (e && e['isJsUnitException'] && testCase) {\n      goog.testing.asserts.raiseException(\n          comment,\n          'Function passed to assertThrows caught a JsUnitException (usually ' +\n              'from an assert or call to fail()). If this is expected, use ' +\n              'assertThrowsJsUnitException instead.');\n    }\n\n    return e;\n  }\n  goog.testing.asserts.raiseException(\n      comment, 'No exception thrown from function passed to assertThrows');\n  throw new Error('Should have thrown an error.');  // Make the compiler happy.\n};\n/** @const */\nvar assertThrows = goog.testing.asserts.assertThrows;\n\n\n/**\n * Removes a stacktrace from an Error object for Opera 10.0.\n * @param {*} e\n * @private\n */\ngoog.testing.asserts.removeOperaStacktrace_ = function(e) {\n  if (goog.isObject(e) && typeof e['stacktrace'] === 'string' &&\n      typeof e['message'] === 'string') {\n    var startIndex = e['message'].length - e['stacktrace'].length;\n    if (e['message'].indexOf(e['stacktrace'], startIndex) == startIndex) {\n      e['message'] = e['message'].substr(0, startIndex - 14);\n    }\n  }\n};\n\n\n/**\n * Asserts that the function does not throw an error.\n *\n * @param {!(string|Function)} a The assertion comment or the function to call.\n * @param {!Function=} opt_b The function to call (if the first argument of\n *     `assertNotThrows` was the comment).\n * @return {*} The return value of the function.\n * @throws {goog.testing.JsUnitException} If the assertion failed.\n */\ngoog.testing.asserts.assertNotThrows = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var comment = commentArg(1, arguments);\n  var func = nonCommentArg(1, 1, arguments);\n  _assert(\n      comment, typeof func == 'function',\n      'Argument passed to assertNotThrows is not a function');\n\n  try {\n    return func();\n  } catch (e) {\n    comment = comment ? (comment + '\\n') : '';\n    comment += 'A non expected exception was thrown from function passed to ' +\n        'assertNotThrows';\n    // Some browsers don't have a stack trace so at least have the error\n    // description.\n    var stackTrace = e['stack'] || e['stacktrace'] || e.toString();\n    goog.testing.asserts.raiseException(comment, stackTrace);\n  }\n};\n/** @const */\nvar assertNotThrows = goog.testing.asserts.assertNotThrows;\n\n\n/**\n * Asserts that the given callback function results in a JsUnitException when\n * called, and that the resulting failure message matches the given expected\n * message.\n * @param {function() : void} callback Function to be run expected to result\n *     in a JsUnitException (usually contains a call to an assert).\n * @param {string=} opt_expectedMessage Failure message expected to be given\n *     with the exception.\n * @return {!goog.testing.JsUnitException} The error thrown by the function.\n * @throws {goog.testing.JsUnitException} If the function did not throw a\n *     JsUnitException.\n */\ngoog.testing.asserts.assertThrowsJsUnitException = function(\n    callback, opt_expectedMessage) {\n  try {\n    callback();\n  } catch (e) {\n    var testCase = _getCurrentTestCase();\n    if (testCase) {\n      testCase.invalidateAssertionException(e);\n    } else {\n      goog.global.console.error(\n          'Failed to remove expected exception: no test case is installed.');\n    }\n\n    if (!e.isJsUnitException) {\n      goog.testing.asserts.fail('Expected a JsUnitException');\n    }\n\n    if (typeof opt_expectedMessage != 'undefined' &&\n        e.message != opt_expectedMessage) {\n      goog.testing.asserts.fail(\n          'Expected message [' + opt_expectedMessage + '] but got [' +\n          e.message + ']');\n    }\n\n    return e;\n  }\n\n  var msg = 'Expected a failure';\n  if (typeof opt_expectedMessage != 'undefined') {\n    msg += ': ' + opt_expectedMessage;\n  }\n  throw new goog.testing.JsUnitException(msg);\n};\n/** @const */\nvar assertThrowsJsUnitException =\n    goog.testing.asserts.assertThrowsJsUnitException;\n\n\n/**\n * Asserts that the IThenable rejects.\n *\n * This is useful for asserting that async functions throw, like an asynchronous\n * assertThrows. Example:\n *\n * ```\n *   async function shouldThrow() { throw new Error('error!'); }\n *   async function testShouldThrow() {\n *     const error = await assertRejects(shouldThrow());\n *     assertEquals('error!', error.message);\n *   }\n * ```\n *\n * @param {!(string|IThenable)} a The assertion comment or the IThenable.\n * @param {!IThenable=} opt_b The IThenable (if the first argument of\n *     `assertRejects` was the comment).\n * @return {!IThenable<*>} A child IThenable which resolves with the error that\n *     the passed in IThenable rejects with. This IThenable will reject if the\n *     passed in IThenable does not reject.\n */\ngoog.testing.asserts.assertRejects = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var thenable = nonCommentArg(1, 1, arguments);\n  var comment = commentArg(1, arguments);\n  _assert(\n      comment, goog.isObject(thenable) && goog.isFunction(thenable.then),\n      'Argument passed to assertRejects is not an IThenable');\n\n  return thenable.then(\n      function() {\n        goog.testing.asserts.raiseException(\n            comment, 'IThenable passed into assertRejects did not reject');\n      },\n      function(e) {\n        goog.testing.asserts.removeOperaStacktrace_(e);\n        return e;\n      });\n};\n/** @const */\nvar assertRejects = goog.testing.asserts.assertRejects;\n\n\n/**\n * @param {*} a The value to assert (1 arg) or debug message (2 args).\n * @param {*=} opt_b The value to assert (2 args only).\n */\ngoog.testing.asserts.assertTrue = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var comment = commentArg(1, arguments);\n  var booleanValue = nonCommentArg(1, 1, arguments);\n\n  _assert(\n      comment, typeof booleanValue === 'boolean',\n      'Bad argument to assertTrue(boolean)');\n  _assert(comment, booleanValue, 'Call to assertTrue(boolean) with false');\n};\n/** @const */\nvar assertTrue = goog.testing.asserts.assertTrue;\n\n\n/**\n * @param {*} a The value to assert (1 arg) or debug message (2 args).\n * @param {*=} opt_b The value to assert (2 args only).\n */\ngoog.testing.asserts.assertFalse = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var comment = commentArg(1, arguments);\n  var booleanValue = nonCommentArg(1, 1, arguments);\n\n  _assert(\n      comment, typeof booleanValue === 'boolean',\n      'Bad argument to assertFalse(boolean)');\n  _assert(comment, !booleanValue, 'Call to assertFalse(boolean) with true');\n};\n/** @const */\nvar assertFalse = goog.testing.asserts.assertFalse;\n\n\n/**\n * @param {*} a The expected value (2 args) or the debug message (3 args).\n * @param {*} b The actual value (2 args) or the expected value (3 args).\n * @param {*=} opt_c The actual value (3 args only).\n */\ngoog.testing.asserts.assertEquals = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var var1 = nonCommentArg(1, 2, arguments);\n  var var2 = nonCommentArg(2, 2, arguments);\n  _assert(\n      commentArg(2, arguments), var1 === var2,\n      goog.testing.asserts.getDefaultErrorMsg_(var1, var2));\n};\n/** @const */\nvar assertEquals = goog.testing.asserts.assertEquals;\n\n\n/**\n * @param {*} a The expected value (2 args) or the debug message (3 args).\n * @param {*} b The actual value (2 args) or the expected value (3 args).\n * @param {*=} opt_c The actual value (3 args only).\n */\ngoog.testing.asserts.assertNotEquals = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var var1 = nonCommentArg(1, 2, arguments);\n  var var2 = nonCommentArg(2, 2, arguments);\n  _assert(\n      commentArg(2, arguments), var1 !== var2,\n      'Expected not to be ' + _displayStringForValue(var2));\n};\n/** @const */\nvar assertNotEquals = goog.testing.asserts.assertNotEquals;\n\n/**\n * @param {*} a The value to assert (1 arg) or debug message (2 args).\n * @param {*=} opt_b The value to assert (2 args only).\n */\ngoog.testing.asserts.assertNull = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var aVar = nonCommentArg(1, 1, arguments);\n  _assert(\n      commentArg(1, arguments), aVar === null,\n      goog.testing.asserts.getDefaultErrorMsg_(null, aVar));\n};\n/** @const */\nvar assertNull = goog.testing.asserts.assertNull;\n\n\n/**\n * @param {*} a The value to assert (1 arg) or debug message (2 args).\n * @param {*=} opt_b The value to assert (2 args only).\n */\ngoog.testing.asserts.assertNotNull = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var aVar = nonCommentArg(1, 1, arguments);\n  _assert(\n      commentArg(1, arguments), aVar !== null,\n      'Expected not to be ' + _displayStringForValue(null));\n};\n/** @const */\nvar assertNotNull = goog.testing.asserts.assertNotNull;\n\n\n/**\n * @param {*} a The value to assert (1 arg) or debug message (2 args).\n * @param {*=} opt_b The value to assert (2 args only).\n */\ngoog.testing.asserts.assertUndefined = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var aVar = nonCommentArg(1, 1, arguments);\n  _assert(\n      commentArg(1, arguments), aVar === JSUNIT_UNDEFINED_VALUE,\n      goog.testing.asserts.getDefaultErrorMsg_(JSUNIT_UNDEFINED_VALUE, aVar));\n};\n/** @const */\nvar assertUndefined = goog.testing.asserts.assertUndefined;\n\n\n/**\n * @param {*} a The value to assert (1 arg) or debug message (2 args).\n * @param {*=} opt_b The value to assert (2 args only).\n */\ngoog.testing.asserts.assertNotUndefined = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var aVar = nonCommentArg(1, 1, arguments);\n  _assert(\n      commentArg(1, arguments), aVar !== JSUNIT_UNDEFINED_VALUE,\n      'Expected not to be ' + _displayStringForValue(JSUNIT_UNDEFINED_VALUE));\n};\n/** @const */\nvar assertNotUndefined = goog.testing.asserts.assertNotUndefined;\n\n/**\n * @param {*} a The value to assert (1 arg) or debug message (2 args).\n * @param {*=} opt_b The value to assert (2 args only).\n */\ngoog.testing.asserts.assertNullOrUndefined = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var aVar = nonCommentArg(1, 1, arguments);\n  _assert(\n      commentArg(1, arguments), aVar == null,\n      'Expected ' + _displayStringForValue(null) + ' or ' +\n          _displayStringForValue(JSUNIT_UNDEFINED_VALUE) + ' but was ' +\n          _displayStringForValue(aVar));\n};\n/** @const */\nvar assertNullOrUndefined = goog.testing.asserts.assertNullOrUndefined;\n\n/**\n * @param {*} a The value to assert (1 arg) or debug message (2 args).\n * @param {*=} opt_b The value to assert (2 args only).\n */\ngoog.testing.asserts.assertNotNullNorUndefined = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  goog.testing.asserts.assertNotNull.apply(null, arguments);\n  goog.testing.asserts.assertNotUndefined.apply(null, arguments);\n};\n/** @const */\nvar assertNotNullNorUndefined = goog.testing.asserts.assertNotNullNorUndefined;\n\n\n/**\n * @param {*} a The value to assert (1 arg) or debug message (2 args).\n * @param {*=} opt_b The value to assert (2 args only).\n */\ngoog.testing.asserts.assertNonEmptyString = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var aVar = nonCommentArg(1, 1, arguments);\n  _assert(\n      commentArg(1, arguments), aVar !== JSUNIT_UNDEFINED_VALUE &&\n          aVar !== null && typeof aVar == 'string' && aVar !== '',\n      'Expected non-empty string but was ' + _displayStringForValue(aVar));\n};\n/** @const */\nvar assertNonEmptyString = goog.testing.asserts.assertNonEmptyString;\n\n\n/**\n * @param {*} a The value to assert (1 arg) or debug message (2 args).\n * @param {*=} opt_b The value to assert (2 args only).\n */\ngoog.testing.asserts.assertNaN = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var aVar = nonCommentArg(1, 1, arguments);\n  _assert(\n      commentArg(1, arguments), aVar !== aVar,\n      'Expected NaN but was ' + _displayStringForValue(aVar));\n};\n/** @const */\nvar assertNaN = goog.testing.asserts.assertNaN;\n\n\n/**\n * @param {*} a The value to assert (1 arg) or debug message (2 args).\n * @param {*=} opt_b The value to assert (2 args only).\n */\ngoog.testing.asserts.assertNotNaN = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var aVar = nonCommentArg(1, 1, arguments);\n  _assert(commentArg(1, arguments), !isNaN(aVar), 'Expected not NaN');\n};\n/** @const */\nvar assertNotNaN = goog.testing.asserts.assertNotNaN;\n\n\n/**\n * The return value of the equality predicate passed to findDifferences below,\n * in cases where the predicate can't test the input variables for equality.\n * @type {?string}\n */\ngoog.testing.asserts.EQUALITY_PREDICATE_CANT_PROCESS = null;\n\n\n/**\n * The return value of the equality predicate passed to findDifferences below,\n * in cases where the input vriables are equal.\n * @type {?string}\n */\ngoog.testing.asserts.EQUALITY_PREDICATE_VARS_ARE_EQUAL = '';\n\n\n/**\n * @const {!Object<string, boolean>}\n */\ngoog.testing.asserts.ARRAY_TYPES = {\n  'Array': true,\n  'Float32Array': true,\n  'Float64Array': true,\n  'Int8Array': true,\n  'Int16Array': true,\n  'Int32Array': true,\n  'Uint8Array': true,\n  'Uint8ClampedArray': true,\n  'Uint16Array': true,\n  'Uint32Array': true,\n  'BigInt64Array': true,\n  'BigUint64Array': true\n};\n\n/**\n * Determines if two items of any type match, and formulates an error message\n * if not.\n * @param {*} expected Expected argument to match.\n * @param {*} actual Argument as a result of performing the test.\n * @param {(function(string, *, *): ?string)=} opt_equalityPredicate An optional\n *     function that can be used to check equality of variables. It accepts 3\n *     arguments: type-of-variables, var1, var2 (in that order) and returns an\n *     error message if the variables are not equal,\n *     goog.testing.asserts.EQUALITY_PREDICATE_VARS_ARE_EQUAL if the variables\n *     are equal, or\n *     goog.testing.asserts.EQUALITY_PREDICATE_CANT_PROCESS if the predicate\n *     couldn't check the input variables. The function will be called only if\n *     the types of var1 and var2 are identical.\n * @return {?string} Null on success, error message on failure.\n */\ngoog.testing.asserts.findDifferences = function(\n    expected, actual, opt_equalityPredicate) {\n  var failures = [];\n  // True if there a generic error at the root (with no path).  If so, we should\n  // fail, but not add to the failures array (because it will be included at the\n  // top anyway).\n  var rootFailed = false;\n  var seen1 = [];\n  var seen2 = [];\n\n  // To avoid infinite recursion when the two parameters are self-referential\n  // along the same path of properties, keep track of the object pairs already\n  // seen in this call subtree, and abort when a cycle is detected.\n  function innerAssertWithCycleCheck(var1, var2, path) {\n    // This is used for testing, so we can afford to be slow (but more\n    // accurate). So we just check whether var1 is in seen1. If we\n    // found var1 in index i, we simply need to check whether var2 is\n    // in seen2[i]. If it is, we do not recurse to check var1/var2. If\n    // it isn't, we know that the structures of the two objects must be\n    // different.\n    //\n    // This is based on the fact that values at index i in seen1 and\n    // seen2 will be checked for equality eventually (when\n    // innerAssertImplementation(seen1[i], seen2[i], path) finishes).\n    for (var i = 0; i < seen1.length; ++i) {\n      var match1 = seen1[i] === var1;\n      var match2 = seen2[i] === var2;\n      if (match1 || match2) {\n        if (!match1 || !match2) {\n          // Asymmetric cycles, so the objects have different structure.\n          failures.push('Asymmetric cycle detected at ' + path);\n        }\n        return;\n      }\n    }\n\n    seen1.push(var1);\n    seen2.push(var2);\n    innerAssertImplementation(var1, var2, path);\n    seen1.pop();\n    seen2.pop();\n  }\n\n  var equalityPredicate = opt_equalityPredicate || function(type, var1, var2) {\n    var typedPredicate = PRIMITIVE_EQUALITY_PREDICATES[type];\n    if (!typedPredicate) {\n      return goog.testing.asserts.EQUALITY_PREDICATE_CANT_PROCESS;\n    }\n    var equal = typedPredicate(var1, var2);\n    return equal ? goog.testing.asserts.EQUALITY_PREDICATE_VARS_ARE_EQUAL :\n                   goog.testing.asserts.getDefaultErrorMsg_(var1, var2);\n  };\n\n  /**\n   * @param {*} var1 An item in the expected object.\n   * @param {*} var2 The corresponding item in the actual object.\n   * @param {string} path Their path in the objects.\n   * @suppress {missingProperties} The map_ property is unknown to the compiler\n   *     unless goog.structs.Map is loaded.\n   */\n  function innerAssertImplementation(var1, var2, path) {\n    if (var1 === var2) {\n      return;\n    }\n\n    var typeOfVar1 = _trueTypeOf(var1);\n    var typeOfVar2 = _trueTypeOf(var2);\n\n    if (typeOfVar1 == typeOfVar2) {\n      var isArray = goog.testing.asserts.ARRAY_TYPES[typeOfVar1];\n      var errorMessage = equalityPredicate(typeOfVar1, var1, var2);\n      if (errorMessage !=\n          goog.testing.asserts.EQUALITY_PREDICATE_CANT_PROCESS) {\n        if (errorMessage !=\n            goog.testing.asserts.EQUALITY_PREDICATE_VARS_ARE_EQUAL) {\n          if (path) {\n            failures.push(path + ': ' + errorMessage);\n          } else {\n            rootFailed = true;\n          }\n        }\n      } else if (isArray && var1.length != var2.length) {\n        failures.push(\n            (path ? path + ': ' : '') + 'Expected ' + var1.length +\n            '-element array ' +\n            'but got a ' + var2.length + '-element array');\n      } else if (typeOfVar1 == 'String') {\n        // If the comparer cannot process strings (eg, roughlyEquals).\n        if (var1 != var2) {\n          if (path) {\n            failures.push(\n                path + ': ' +\n                goog.testing.asserts.getDefaultErrorMsg_(var1, var2));\n          } else {\n            rootFailed = true;\n          }\n        }\n      } else {\n        var childPath = path + (isArray ? '[%s]' : (path ? '.%s' : '%s'));\n        // These type checks do not use _trueTypeOf because that does not work\n        // for polyfilled Map/Set. Note that these checks may potentially fail\n        // if var1 comes from a different window.\n        if ((typeof Map != 'undefined' && var1 instanceof Map) ||\n            (typeof Set != 'undefined' && var1 instanceof Set)) {\n          var1.forEach(function(value, key) {\n            if (var2.has(key)) {\n              // For a map, the values must be compared, but with Set, checking\n              // that the second set contains the first set's \"keys\" is\n              // sufficient.\n              if (var2.get) {\n                innerAssertWithCycleCheck(\n                    // NOTE: replace will call functions, so stringify eagerly.\n                    value, var2.get(key), childPath.replace('%s', String(key)));\n              }\n            } else {\n              failures.push(\n                  key + ' not present in actual ' + (path || typeOfVar2));\n            }\n          });\n\n          var2.forEach(function(value, key) {\n            if (!var1.has(key)) {\n              failures.push(\n                  key + ' not present in expected ' + (path || typeOfVar1));\n            }\n          });\n        } else if (!var1['__iterator__']) {\n          // if an object has an __iterator__ property, we have no way of\n          // actually inspecting its raw properties, and JS 1.7 doesn't\n          // overload [] to make it possible for someone to generically\n          // use what the iterator returns to compare the object-managed\n          // properties. This gets us into deep poo with things like\n          // goog.structs.Map, at least on systems that support iteration.\n          for (var prop in var1) {\n            if (isArray && goog.testing.asserts.isArrayIndexProp_(prop)) {\n              // Skip array indices for now. We'll handle them later.\n              continue;\n            }\n\n            if (prop in var2) {\n              innerAssertWithCycleCheck(\n                  var1[prop], var2[prop], childPath.replace('%s', prop));\n            } else {\n              failures.push(\n                  'property ' + prop + ' not present in actual ' +\n                  (path || typeOfVar2));\n            }\n          }\n          // make sure there aren't properties in var2 that are missing\n          // from var1. if there are, then by definition they don't\n          // match.\n          for (var prop in var2) {\n            if (isArray && goog.testing.asserts.isArrayIndexProp_(prop)) {\n              // Skip array indices for now. We'll handle them later.\n              continue;\n            }\n\n            if (!(prop in var1)) {\n              failures.push(\n                  'property ' + prop + ' not present in expected ' +\n                  (path || typeOfVar1));\n            }\n          }\n\n          // Handle array indices by iterating from 0 to arr.length.\n          //\n          // Although all browsers allow holes in arrays, browsers\n          // are inconsistent in what they consider a hole. For example,\n          // \"[0,undefined,2]\" has a hole on IE but not on Firefox.\n          //\n          // Because our style guide bans for...in iteration over arrays,\n          // we assume that most users don't care about holes in arrays,\n          // and that it is ok to say that a hole is equivalent to a slot\n          // populated with 'undefined'.\n          if (isArray) {\n            for (prop = 0; prop < var1.length; prop++) {\n              innerAssertWithCycleCheck(\n                  var1[prop], var2[prop],\n                  childPath.replace('%s', String(prop)));\n            }\n          }\n        } else {\n          // special-case for closure objects that have iterators\n          if (goog.isFunction(var1.equals)) {\n            // use the object's own equals function, assuming it accepts an\n            // object and returns a boolean\n            if (!var1.equals(var2)) {\n              failures.push(\n                  'equals() returned false for ' + (path || typeOfVar1));\n            }\n          } else if (var1.map_) {\n            // assume goog.structs.Map or goog.structs.Set, where comparing\n            // their private map_ field is sufficient\n            innerAssertWithCycleCheck(\n                var1.map_, var2.map_, childPath.replace('%s', 'map_'));\n          } else {\n            // else die, so user knows we can't do anything\n            failures.push(\n                'unable to check ' + (path || typeOfVar1) +\n                ' for equality: it has an iterator we do not ' +\n                'know how to handle. please add an equals method');\n          }\n        }\n      }\n    } else if (path) {\n      failures.push(\n          path + ': ' + goog.testing.asserts.getDefaultErrorMsg_(var1, var2));\n    } else {\n      rootFailed = true;\n    }\n  }\n\n  innerAssertWithCycleCheck(expected, actual, '');\n\n  if (rootFailed) {\n    return goog.testing.asserts.getDefaultErrorMsg_(expected, actual);\n  }\n  return failures.length == 0 ? null : goog.testing.asserts.getDefaultErrorMsg_(\n                                           expected, actual) +\n          '\\n   ' + failures.join('\\n   ');\n};\n\n\n/**\n * Notes:\n * Object equality has some nasty browser quirks, and this implementation is\n * not 100% correct. For example,\n *\n * <code>\n * var a = [0, 1, 2];\n * var b = [0, 1, 2];\n * delete a[1];\n * b[1] = undefined;\n * assertObjectEquals(a, b); // should fail, but currently passes\n * </code>\n *\n * See asserts_test.html for more interesting edge cases.\n *\n * The first comparison object provided is the expected value, the second is\n * the actual.\n *\n * @param {*} a Assertion message or comparison object.\n * @param {*} b Comparison object.\n * @param {*=} opt_c Comparison object, if an assertion message was provided.\n */\ngoog.testing.asserts.assertObjectEquals = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var v1 = nonCommentArg(1, 2, arguments);\n  var v2 = nonCommentArg(2, 2, arguments);\n  var failureMessage = commentArg(2, arguments) ? commentArg(2, arguments) : '';\n  var differences = goog.testing.asserts.findDifferences(v1, v2);\n\n  _assert(failureMessage, !differences, differences);\n};\n/** @const */\nvar assertObjectEquals = goog.testing.asserts.assertObjectEquals;\n\n\n/**\n * Similar to assertObjectEquals above, but accepts a tolerance margin.\n *\n * @param {*} a Assertion message or comparison object.\n * @param {*} b Comparison object.\n * @param {*} c Comparison object or tolerance.\n * @param {*=} opt_d Tolerance, if an assertion message was provided.\n */\ngoog.testing.asserts.assertObjectRoughlyEquals = function(a, b, c, opt_d) {\n  _validateArguments(3, arguments);\n  var v1 = nonCommentArg(1, 3, arguments);\n  var v2 = nonCommentArg(2, 3, arguments);\n  var tolerance = nonCommentArg(3, 3, arguments);\n  var failureMessage = commentArg(3, arguments) ? commentArg(3, arguments) : '';\n  var equalityPredicate = function(type, var1, var2) {\n    var typedPredicate =\n        goog.testing.asserts.primitiveRoughEqualityPredicates_[type];\n    if (!typedPredicate) {\n      return goog.testing.asserts.EQUALITY_PREDICATE_CANT_PROCESS;\n    }\n    var equal = typedPredicate(var1, var2, tolerance);\n    return equal ? goog.testing.asserts.EQUALITY_PREDICATE_VARS_ARE_EQUAL :\n                   goog.testing.asserts.getDefaultErrorMsg_(var1, var2) +\n            ' which was more than ' + tolerance + ' away';\n  };\n  var differences =\n      goog.testing.asserts.findDifferences(v1, v2, equalityPredicate);\n\n  _assert(failureMessage, !differences, differences);\n};\n/** @const */\nvar assertObjectRoughlyEquals = goog.testing.asserts.assertObjectRoughlyEquals;\n\n/**\n * Compares two arbitrary objects for non-equalness.\n *\n * All the same caveats as for assertObjectEquals apply here:\n * Undefined values may be confused for missing values, or vice versa.\n *\n * @param {*} a Assertion message or comparison object.\n * @param {*} b Comparison object.\n * @param {*=} opt_c Comparison object, if an assertion message was provided.\n */\ngoog.testing.asserts.assertObjectNotEquals = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var v1 = nonCommentArg(1, 2, arguments);\n  var v2 = nonCommentArg(2, 2, arguments);\n  var failureMessage = commentArg(2, arguments) ? commentArg(2, arguments) : '';\n  var differences = goog.testing.asserts.findDifferences(v1, v2);\n\n  _assert(failureMessage, differences, 'Objects should not be equal');\n};\n/** @const */\nvar assertObjectNotEquals = goog.testing.asserts.assertObjectNotEquals;\n\n\n/**\n * Compares two arrays ignoring negative indexes and extra properties on the\n * array objects. Use case: Internet Explorer adds the index, lastIndex and\n * input enumerable fields to the result of string.match(/regexp/g), which makes\n * assertObjectEquals fail.\n * @param {*} a The expected array (2 args) or the debug message (3 args).\n * @param {*} b The actual array (2 args) or the expected array (3 args).\n * @param {*=} opt_c The actual array (3 args only).\n */\ngoog.testing.asserts.assertArrayEquals = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var v1 = nonCommentArg(1, 2, arguments);\n  var v2 = nonCommentArg(2, 2, arguments);\n  var failureMessage = commentArg(2, arguments) ? commentArg(2, arguments) : '';\n\n  var typeOfVar1 = _trueTypeOf(v1);\n  _assert(\n      failureMessage, typeOfVar1 == 'Array',\n      'Expected an array for assertArrayEquals but found a ' + typeOfVar1);\n\n  var typeOfVar2 = _trueTypeOf(v2);\n  _assert(\n      failureMessage, typeOfVar2 == 'Array',\n      'Expected an array for assertArrayEquals but found a ' + typeOfVar2);\n\n  goog.testing.asserts.assertObjectEquals(\n      failureMessage, Array.prototype.concat.call(v1),\n      Array.prototype.concat.call(v2));\n};\n/** @const */\nvar assertArrayEquals = goog.testing.asserts.assertArrayEquals;\n\n\n/**\n * Compares two objects that can be accessed like an array and assert that\n * each element is equal.\n * @param {string|Object} a Failure message (3 arguments)\n *     or object #1 (2 arguments).\n * @param {Object} b Object #2 (2 arguments) or object #1 (3 arguments).\n * @param {Object=} opt_c Object #2 (3 arguments).\n */\ngoog.testing.asserts.assertElementsEquals = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n\n  var v1 = nonCommentArg(1, 2, arguments);\n  var v2 = nonCommentArg(2, 2, arguments);\n  var failureMessage = commentArg(2, arguments) ? commentArg(2, arguments) : '';\n\n  if (!v1) {\n    goog.testing.asserts.assert(failureMessage, !v2);\n  } else {\n    goog.testing.asserts.assertEquals(\n        'length mismatch: ' + failureMessage, v1.length, v2.length);\n    for (var i = 0; i < v1.length; ++i) {\n      goog.testing.asserts.assertEquals(\n          'mismatch at index ' + i + ': ' + failureMessage, v1[i], v2[i]);\n    }\n  }\n};\n/** @const */\nvar assertElementsEquals = goog.testing.asserts.assertElementsEquals;\n\n\n/**\n * Compares two objects that can be accessed like an array and assert that\n * each element is roughly equal.\n * @param {string|Object} a Failure message (4 arguments)\n *     or object #1 (3 arguments).\n * @param {Object} b Object #1 (4 arguments) or object #2 (3 arguments).\n * @param {Object|number} c Object #2 (4 arguments) or tolerance (3 arguments).\n * @param {number=} opt_d tolerance (4 arguments).\n */\ngoog.testing.asserts.assertElementsRoughlyEqual = function(a, b, c, opt_d) {\n  _validateArguments(3, arguments);\n\n  var v1 = nonCommentArg(1, 3, arguments);\n  var v2 = nonCommentArg(2, 3, arguments);\n  var tolerance = nonCommentArg(3, 3, arguments);\n  var failureMessage = commentArg(3, arguments) ? commentArg(3, arguments) : '';\n\n  if (!v1) {\n    goog.testing.asserts.assert(failureMessage, !v2);\n  } else {\n    goog.testing.asserts.assertEquals(\n        'length mismatch: ' + failureMessage, v1.length, v2.length);\n    for (var i = 0; i < v1.length; ++i) {\n      goog.testing.asserts.assertRoughlyEquals(\n          failureMessage, v1[i], v2[i], tolerance);\n    }\n  }\n};\n/** @const */\nvar assertElementsRoughlyEqual =\n    goog.testing.asserts.assertElementsRoughlyEqual;\n\n/**\n * Compares elements of two array-like or iterable objects using strict equality\n * without taking their order into account.\n * @param {string|!IArrayLike|!Iterable} a Assertion message or the\n *     expected elements.\n * @param {!IArrayLike|!Iterable} b Expected elements or the actual\n *     elements.\n * @param {!IArrayLike|!Iterable=} opt_c Actual elements.\n */\ngoog.testing.asserts.assertSameElements = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var expected = nonCommentArg(1, 2, arguments);\n  var actual = nonCommentArg(2, 2, arguments);\n  var message = commentArg(2, arguments);\n\n  goog.testing.asserts.assertTrue(\n      'Value of \\'expected\\' should be array-like or iterable',\n      goog.testing.asserts.isArrayLikeOrIterable_(expected));\n\n  goog.testing.asserts.assertTrue(\n      'Value of \\'actual\\' should be array-like or iterable',\n      goog.testing.asserts.isArrayLikeOrIterable_(actual));\n\n  // Clones expected and actual and converts them to real arrays.\n  expected = goog.testing.asserts.toArray_(expected);\n  actual = goog.testing.asserts.toArray_(actual);\n  // TODO(user): It would be great to show only the difference\n  // between the expected and actual elements.\n  _assert(\n      message, expected.length == actual.length, 'Expected ' + expected.length +\n          ' elements: [' + expected + '], ' +\n          'got ' + actual.length + ' elements: [' + actual + ']');\n\n  var toFind = goog.testing.asserts.toArray_(expected);\n  for (var i = 0; i < actual.length; i++) {\n    var index = goog.testing.asserts.indexOf_(toFind, actual[i]);\n    _assert(\n        message, index != -1,\n        'Expected [' + expected + '], got [' + actual + ']');\n    toFind.splice(index, 1);\n  }\n};\n/** @const */\nvar assertSameElements = goog.testing.asserts.assertSameElements;\n\n/**\n * @param {*} obj Object to test.\n * @return {boolean} Whether given object is array-like or iterable.\n * @private\n */\ngoog.testing.asserts.isArrayLikeOrIterable_ = function(obj) {\n  return goog.isArrayLike(obj) || goog.testing.asserts.isIterable_(obj);\n};\n\n/**\n * @param {*} a The value to assert (1 arg) or debug message (2 args).\n * @param {*=} opt_b The value to assert (2 args only).\n */\ngoog.testing.asserts.assertEvaluatesToTrue = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var value = nonCommentArg(1, 1, arguments);\n  if (!value) {\n    _assert(commentArg(1, arguments), false, 'Expected to evaluate to true');\n  }\n};\n/** @const */\nvar assertEvaluatesToTrue = goog.testing.asserts.assertEvaluatesToTrue;\n\n/**\n * @param {*} a The value to assert (1 arg) or debug message (2 args).\n * @param {*=} opt_b The value to assert (2 args only).\n */\ngoog.testing.asserts.assertEvaluatesToFalse = function(a, opt_b) {\n  _validateArguments(1, arguments);\n  var value = nonCommentArg(1, 1, arguments);\n  if (value) {\n    _assert(commentArg(1, arguments), false, 'Expected to evaluate to false');\n  }\n};\n/** @const */\nvar assertEvaluatesToFalse = goog.testing.asserts.assertEvaluatesToFalse;\n\n/**\n * Compares two HTML snippets.\n *\n * Take extra care if attributes are involved. `assertHTMLEquals`'s\n * implementation isn't prepared for complex cases. For example, the following\n * comparisons erroneously fail:\n * <pre>\n * assertHTMLEquals('<a href=\"x\" target=\"y\">', '<a target=\"y\" href=\"x\">');\n * assertHTMLEquals('<div class=\"a b\">', '<div class=\"b a\">');\n * assertHTMLEquals('<input disabled>', '<input disabled=\"disabled\">');\n * </pre>\n *\n * When in doubt, use `goog.testing.dom.assertHtmlMatches`.\n *\n * @param {*} a The expected value (2 args) or the debug message (3 args).\n * @param {*} b The actual value (2 args) or the expected value (3 args).\n * @param {*=} opt_c The actual value (3 args only).\n */\ngoog.testing.asserts.assertHTMLEquals = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var var1 = nonCommentArg(1, 2, arguments);\n  var var2 = nonCommentArg(2, 2, arguments);\n  var var1Standardized = standardizeHTML(var1);\n  var var2Standardized = standardizeHTML(var2);\n\n  _assert(\n      commentArg(2, arguments), var1Standardized === var2Standardized,\n      goog.testing.asserts.getDefaultErrorMsg_(\n          var1Standardized, var2Standardized));\n};\n/** @const */\nvar assertHTMLEquals = goog.testing.asserts.assertHTMLEquals;\n\n\n/**\n * Compares two CSS property values to make sure that they represent the same\n * things. This will normalize values in the browser. For example, in Firefox,\n * this assertion will consider \"rgb(0, 0, 255)\" and \"#0000ff\" to be identical\n * values for the \"color\" property. This function won't normalize everything --\n * for example, in most browsers, \"blue\" will not match \"#0000ff\". It is\n * intended only to compensate for unexpected normalizations performed by\n * the browser that should also affect your expected value.\n * @param {string} a Assertion message, or the CSS property name.\n * @param {string} b CSS property name, or the expected value.\n * @param {string} c The expected value, or the actual value.\n * @param {string=} opt_d The actual value.\n */\ngoog.testing.asserts.assertCSSValueEquals = function(a, b, c, opt_d) {\n  _validateArguments(3, arguments);\n  var propertyName = nonCommentArg(1, 3, arguments);\n  var expectedValue = nonCommentArg(2, 3, arguments);\n  var actualValue = nonCommentArg(3, 3, arguments);\n  var expectedValueStandardized =\n      standardizeCSSValue(propertyName, expectedValue);\n  var actualValueStandardized = standardizeCSSValue(propertyName, actualValue);\n\n  _assert(\n      commentArg(3, arguments),\n      expectedValueStandardized == actualValueStandardized,\n      goog.testing.asserts.getDefaultErrorMsg_(\n          expectedValueStandardized, actualValueStandardized));\n};\n/** @const */\nvar assertCSSValueEquals = goog.testing.asserts.assertCSSValueEquals;\n\n\n/**\n * @param {*} a The expected value (2 args) or the debug message (3 args).\n * @param {*} b The actual value (2 args) or the expected value (3 args).\n * @param {*=} opt_c The actual value (3 args only).\n */\ngoog.testing.asserts.assertHashEquals = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var var1 = nonCommentArg(1, 2, arguments);\n  var var2 = nonCommentArg(2, 2, arguments);\n  var message = commentArg(2, arguments);\n  for (var key in var1) {\n    _assert(\n        message, key in var2,\n        'Expected hash had key ' + key + ' that was not found');\n    _assert(\n        message, var1[key] == var2[key], 'Value for key ' + key +\n            ' mismatch - expected = ' + var1[key] + ', actual = ' + var2[key]);\n  }\n\n  for (var key in var2) {\n    _assert(\n        message, key in var1,\n        'Actual hash had key ' + key + ' that was not expected');\n  }\n};\n/** @const */\nvar assertHashEquals = goog.testing.asserts.assertHashEquals;\n\n\n/**\n * @param {*} a The expected value (3 args) or the debug message (4 args).\n * @param {*} b The actual value (3 args) or the expected value (4 args).\n * @param {*} c The tolerance (3 args) or the actual value (4 args).\n * @param {*=} opt_d The tolerance (4 args only).\n */\ngoog.testing.asserts.assertRoughlyEquals = function(a, b, c, opt_d) {\n  _validateArguments(3, arguments);\n  var expected = nonCommentArg(1, 3, arguments);\n  var actual = nonCommentArg(2, 3, arguments);\n  var tolerance = nonCommentArg(3, 3, arguments);\n  _assert(\n      commentArg(3, arguments),\n      goog.testing.asserts.numberRoughEqualityPredicate_(\n          expected, actual, tolerance),\n      'Expected ' + expected + ', but got ' + actual + ' which was more than ' +\n          tolerance + ' away');\n};\n/** @const */\nvar assertRoughlyEquals = goog.testing.asserts.assertRoughlyEquals;\n\n\n/**\n * Checks if the test value is included in the given container. The container\n * can be a string (where \"included\" means a substring), an array or any\n *  `IArrayLike` (where \"included\" means a member), or any type implementing\n * `indexOf` with similar semantics (returning -1 for not included).\n *\n * @param {*} a Failure message (3 arguments) or the test value\n *     (2 arguments).\n * @param {*} b The test value (3 arguments) or the container\n *     (2 arguments).\n * @param {*=} opt_c The container.\n */\ngoog.testing.asserts.assertContains = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var contained = nonCommentArg(1, 2, arguments);\n  var container = nonCommentArg(2, 2, arguments);\n  _assert(\n      commentArg(2, arguments),\n      goog.testing.asserts.contains_(container, contained),\n      'Expected \\'' + container + '\\' to contain \\'' + contained + '\\'');\n};\n/** @const */\nvar assertContains = goog.testing.asserts.assertContains;\n\n/**\n * Checks if the test value is not included in the given container. The\n * container can be a string (where \"included\" means a substring), an array or\n * any `IArrayLike` (where \"included\" means a member), or any type implementing\n * `indexOf` with similar semantics (returning -1 for not included).\n * @param {*} a Failure message (3 arguments) or the contained element\n *     (2 arguments).\n * @param {*} b The contained element (3 arguments) or the container\n *     (2 arguments).\n * @param {*=} opt_c The container.\n */\ngoog.testing.asserts.assertNotContains = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var contained = nonCommentArg(1, 2, arguments);\n  var container = nonCommentArg(2, 2, arguments);\n  _assert(\n      commentArg(2, arguments),\n      !goog.testing.asserts.contains_(container, contained),\n      'Expected \\'' + container + '\\' not to contain \\'' + contained + '\\'');\n};\n/** @const */\nvar assertNotContains = goog.testing.asserts.assertNotContains;\n\n\n/**\n * Checks if the given string matches the given regular expression.\n * @param {*} a Failure message (3 arguments) or the expected regular\n *     expression as a string or RegExp (2 arguments).\n * @param {*} b The regular expression (3 arguments) or the string to test\n *     (2 arguments).\n * @param {*=} opt_c The string to test.\n */\ngoog.testing.asserts.assertRegExp = function(a, b, opt_c) {\n  _validateArguments(2, arguments);\n  var regexp = nonCommentArg(1, 2, arguments);\n  var string = nonCommentArg(2, 2, arguments);\n  if (typeof(regexp) == 'string') {\n    regexp = new RegExp(regexp);\n  }\n  _assert(\n      commentArg(2, arguments), regexp.test(string),\n      'Expected \\'' + string + '\\' to match RegExp ' + regexp.toString());\n};\n/** @const */\nvar assertRegExp = goog.testing.asserts.assertRegExp;\n\n\n/**\n * Converts an array-like or iterable object to an array (clones it if it's\n * already an array).\n * @param {!Iterable|!IArrayLike} obj The collection object.\n * @return {!Array<?>} Copy of the collection as array.\n * @private\n */\ngoog.testing.asserts.toArray_ = function(obj) {\n  var ret = [];\n  if (goog.testing.asserts.isIterable_(obj)) {\n    var iterator =\n        goog.testing.asserts.getIterator_(/** @type {!Iterable} */ (obj));\n\n    // Cannot use for..of syntax here as ES6 syntax is not available in Closure.\n    // See b/117231092\n    while (true) {\n      var result = iterator.next();\n      if (result.done) {\n        return ret;\n      }\n      ret.push(result.value);\n    }\n  }\n\n  for (var i = 0; i < obj.length; i++) {\n    ret[i] = obj[i];\n  }\n  return ret;\n};\n\n// TODO(nnaze): Consider moving isIterable_ and getIterator_ functionality\n// into goog.iter.es6. See discussion in cl/217356297.\n\n/**\n * @param {*} obj\n * @return {boolean} Whether the object is iterable (JS iterator protocol).\n * @private\n */\ngoog.testing.asserts.isIterable_ = function(obj) {\n  return !!(\n      typeof Symbol !== 'undefined' && Symbol.iterator && obj[Symbol.iterator]);\n};\n\n/**\n * @param {!Iterable} iterable\n * @return {!Iterator} An iterator for obj.\n * @throws {!goog.testing.JsUnitException} If the given object is not iterable.\n * @private\n */\ngoog.testing.asserts.getIterator_ = function(iterable) {\n  if (!goog.testing.asserts.isIterable_(iterable)) {\n    goog.testing.asserts.raiseException('parameter iterable is not iterable');\n  }\n\n  return iterable[Symbol.iterator]();\n};\n\n\n/**\n * Finds the position of the first occurrence of an element in a container.\n * @param {IArrayLike<?>|{indexOf: function(*): number}} container\n *     The array to find the element in.\n * @param {*} contained Element to find.\n * @return {number} Index of the first occurrence or -1 if not found.\n * @private\n */\ngoog.testing.asserts.indexOf_ = function(container, contained) {\n  if (typeof container.indexOf == 'function') {\n    return container.indexOf(contained);\n  } else {\n    // IE6/7 do not have indexOf so do a search.\n    for (var i = 0; i < container.length; i++) {\n      if (container[i] === contained) {\n        return i;\n      }\n    }\n    return -1;\n  }\n};\n\n\n/**\n * Tells whether the array contains the given element.\n * @param {IArrayLike<?>|{indexOf: function(*): number}} container The array to\n *     find the element in.\n * @param {*} contained Element to find.\n * @return {boolean} Whether the element is in the array.\n * @private\n */\ngoog.testing.asserts.contains_ = function(container, contained) {\n  // TODO(user): Can we check for container.contains as well?\n  // That would give us support for most goog.structs (though weird results\n  // with anything else with a contains method, like goog.math.Range). Falling\n  // back with container.some would catch all iterables, too.\n  return goog.testing.asserts.indexOf_(container, contained) != -1;\n};\n\nvar standardizeHTML = function(html) {\n  var translator = document.createElement('div');\n  translator.innerHTML = html;\n\n  // Trim whitespace from result (without relying on goog.string)\n  return translator.innerHTML.replace(/^\\s+|\\s+$/g, '');\n};\n\n\n/**\n * Standardizes a CSS value for a given property by applying it to an element\n * and then reading it back.\n * @param {string} propertyName CSS property name.\n * @param {string} value CSS value.\n * @return {string} Normalized CSS value.\n */\nvar standardizeCSSValue = function(propertyName, value) {\n  var styleDeclaration = document.createElement('div').style;\n  styleDeclaration[propertyName] = value;\n  return styleDeclaration[propertyName];\n};\n\n\n/**\n * Raises a JsUnit exception with the given comment. If the exception is\n * unexpectedly caught during a unit test, it will be rethrown so that it is\n * seen by the test framework.\n * @param {string} comment A summary for the exception.\n * @param {string=} opt_message A description of the exception.\n */\ngoog.testing.asserts.raiseException = function(comment, opt_message) {\n  var e = new goog.testing.JsUnitException(comment, opt_message);\n\n  var testCase = _getCurrentTestCase();\n  if (testCase) {\n    testCase.raiseAssertionException(e);\n  } else {\n    goog.global.console.error(\n        'Failed to save thrown exception: no test case is installed.');\n    throw e;\n  }\n};\n\n\n/**\n * Helper function for assertObjectEquals.\n * @param {string} prop A property name.\n * @return {boolean} If the property name is an array index.\n * @private\n */\ngoog.testing.asserts.isArrayIndexProp_ = function(prop) {\n  return prop === '0' || /^[1-9][0-9]*$/.test(prop);\n};\n\n/** @define {boolean} */\ngoog.EXPORT_ASSERTIONS = goog.define('goog.EXPORT_ASSERTIONS', true);\n/*\n * These symbols are both exported in the global namespace (for legacy\n * reasons) and as part of the goog.testing.asserts namespace. Although they\n * can be used globally in tests, these symbols are allowed to be imported for\n * cleaner typing.\n */\nif (goog.EXPORT_ASSERTIONS) {\n  goog.exportSymbol('fail', fail);\n  goog.exportSymbol('assert', assert);\n  goog.exportSymbol('assertThrows', assertThrows);\n  goog.exportSymbol('assertNotThrows', assertNotThrows);\n  goog.exportSymbol('assertThrowsJsUnitException', assertThrowsJsUnitException);\n  goog.exportSymbol('assertRejects', assertRejects);\n  goog.exportSymbol('assertTrue', assertTrue);\n  goog.exportSymbol('assertFalse', assertFalse);\n  goog.exportSymbol('assertEquals', assertEquals);\n  goog.exportSymbol('assertNotEquals', assertNotEquals);\n  goog.exportSymbol('assertNull', assertNull);\n  goog.exportSymbol('assertNotNull', assertNotNull);\n  goog.exportSymbol('assertUndefined', assertUndefined);\n  goog.exportSymbol('assertNotUndefined', assertNotUndefined);\n  goog.exportSymbol('assertNullOrUndefined', assertNullOrUndefined);\n  goog.exportSymbol('assertNotNullNorUndefined', assertNotNullNorUndefined);\n  goog.exportSymbol('assertNonEmptyString', assertNonEmptyString);\n  goog.exportSymbol('assertNaN', assertNaN);\n  goog.exportSymbol('assertNotNaN', assertNotNaN);\n  goog.exportSymbol('assertObjectEquals', assertObjectEquals);\n  goog.exportSymbol('assertObjectRoughlyEquals', assertObjectRoughlyEquals);\n  goog.exportSymbol('assertObjectNotEquals', assertObjectNotEquals);\n  goog.exportSymbol('assertArrayEquals', assertArrayEquals);\n  goog.exportSymbol('assertElementsEquals', assertElementsEquals);\n  goog.exportSymbol('assertElementsRoughlyEqual', assertElementsRoughlyEqual);\n  goog.exportSymbol('assertSameElements', assertSameElements);\n  goog.exportSymbol('assertEvaluatesToTrue', assertEvaluatesToTrue);\n  goog.exportSymbol('assertEvaluatesToFalse', assertEvaluatesToFalse);\n  goog.exportSymbol('assertHTMLEquals', assertHTMLEquals);\n  goog.exportSymbol('assertHashEquals', assertHashEquals);\n  goog.exportSymbol('assertRoughlyEquals', assertRoughlyEquals);\n  goog.exportSymbol('assertContains', assertContains);\n  goog.exportSymbol('assertNotContains', assertNotContains);\n  goog.exportSymbol('assertRegExp', assertRegExp);\n}\n","^?",1579837703000,"^@",["^A",["~$goog.testing.JsUnitException","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/asserts.js"],"^S",["^A",["^4="]],"^1",true,"^2",["^3","^SZ"]],["^ ","^7",[1579837703000],"^8","goog.net.xhrio.js","^9",["^:","goog/net/xhrio.js"],"^;","goog/net/xhrio.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Wrapper class for handling XmlHttpRequests.\n *\n * One off requests can be sent through goog.net.XhrIo.send() or an\n * instance can be created to send multiple requests.  Each request uses its\n * own XmlHttpRequest object and handles clearing of the event callback to\n * ensure no leaks.\n *\n * XhrIo is event based, it dispatches events on success, failure, finishing,\n * ready-state change, or progress (download and upload).\n *\n * The ready-state or timeout event fires first, followed by\n * a generic completed event. Then the abort, error, or success event\n * is fired as appropriate. Progress events are fired as they are\n * received. Lastly, the ready event will fire to indicate that the\n * object may be used to make another request.\n *\n * The error event may also be called before completed and\n * ready-state-change if the XmlHttpRequest.open() or .send() methods throw.\n *\n * This class does not support multiple requests, queuing, or prioritization.\n *\n * When progress events are supported by the browser, and progress is\n * enabled via .setProgressEventsEnabled(true), the\n * goog.net.EventType.PROGRESS event will be the re-dispatched browser\n * progress event. Additionally, a DOWNLOAD_PROGRESS or UPLOAD_PROGRESS event\n * will be fired for download and upload progress respectively.\n *\n */\n\n\ngoog.provide('goog.net.XhrIo');\ngoog.provide('goog.net.XhrIo.ResponseType');\n\ngoog.forwardDeclare('goog.Uri');\ngoog.require('goog.Timer');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.debug.entryPointRegistry');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.json.hybrid');\ngoog.require('goog.log');\ngoog.require('goog.net.ErrorCode');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.HttpStatus');\ngoog.require('goog.net.XmlHttp');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.structs');\ngoog.require('goog.structs.Map');\ngoog.require('goog.uri.utils');\ngoog.require('goog.userAgent');\n\ngoog.scope(function() {\n\n/**\n * Basic class for handling XMLHttpRequests.\n * @param {goog.net.XmlHttpFactory=} opt_xmlHttpFactory Factory to use when\n *     creating XMLHttpRequest objects.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.net.XhrIo = function(opt_xmlHttpFactory) {\n  XhrIo.base(this, 'constructor');\n\n  /**\n   * Map of default headers to add to every request, use:\n   * XhrIo.headers.set(name, value)\n   * @type {!goog.structs.Map}\n   */\n  this.headers = new goog.structs.Map();\n\n  /**\n   * Optional XmlHttpFactory\n   * @private {goog.net.XmlHttpFactory}\n   */\n  this.xmlHttpFactory_ = opt_xmlHttpFactory || null;\n\n  /**\n   * Whether XMLHttpRequest is active.  A request is active from the time send()\n   * is called until onReadyStateChange() is complete, or error() or abort()\n   * is called.\n   * @private {boolean}\n   */\n  this.active_ = false;\n\n  /**\n   * The XMLHttpRequest object that is being used for the transfer.\n   * @private {?goog.net.XhrLike.OrNative}\n   */\n  this.xhr_ = null;\n\n  /**\n   * The options to use with the current XMLHttpRequest object.\n   * @private {?Object}\n   */\n  this.xhrOptions_ = null;\n\n  /**\n   * Last URL that was requested.\n   * @private {string|goog.Uri}\n   */\n  this.lastUri_ = '';\n\n  /**\n   * Method for the last request.\n   * @private {string}\n   */\n  this.lastMethod_ = '';\n\n  /**\n   * Last error code.\n   * @private {!goog.net.ErrorCode}\n   */\n  this.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR;\n\n  /**\n   * Last error message.\n   * @private {Error|string}\n   */\n  this.lastError_ = '';\n\n  /**\n   * Used to ensure that we don't dispatch an multiple ERROR events. This can\n   * happen in IE when it does a synchronous load and one error is handled in\n   * the ready statte change and one is handled due to send() throwing an\n   * exception.\n   * @private {boolean}\n   */\n  this.errorDispatched_ = false;\n\n  /**\n   * Used to make sure we don't fire the complete event from inside a send call.\n   * @private {boolean}\n   */\n  this.inSend_ = false;\n\n  /**\n   * Used in determining if a call to {@link #onReadyStateChange_} is from\n   * within a call to this.xhr_.open.\n   * @private {boolean}\n   */\n  this.inOpen_ = false;\n\n  /**\n   * Used in determining if a call to {@link #onReadyStateChange_} is from\n   * within a call to this.xhr_.abort.\n   * @private {boolean}\n   */\n  this.inAbort_ = false;\n\n  /**\n   * Number of milliseconds after which an incomplete request will be aborted\n   * and a {@link goog.net.EventType.TIMEOUT} event raised; 0 means no timeout\n   * is set.\n   * @private {number}\n   */\n  this.timeoutInterval_ = 0;\n\n  /**\n   * Timer to track request timeout.\n   * @private {?number}\n   */\n  this.timeoutId_ = null;\n\n  /**\n   * The requested type for the response. The empty string means use the default\n   * XHR behavior.\n   * @private {goog.net.XhrIo.ResponseType}\n   */\n  this.responseType_ = ResponseType.DEFAULT;\n\n  /**\n   * Whether a \"credentialed\" request is to be sent (one that is aware of\n   * cookies and authentication). This is applicable only for cross-domain\n   * requests and more recent browsers that support this part of the HTTP Access\n   * Control standard.\n   *\n   * @see http://www.w3.org/TR/XMLHttpRequest/#the-withcredentials-attribute\n   *\n   * @private {boolean}\n   */\n  this.withCredentials_ = false;\n\n  /**\n   * Whether progress events are enabled for this request. This is\n   * disabled by default because setting a progress event handler\n   * causes pre-flight OPTIONS requests to be sent for CORS requests,\n   * even in cases where a pre-flight request would not otherwise be\n   * sent.\n   *\n   * @see http://xhr.spec.whatwg.org/#security-considerations\n   *\n   * Note that this can cause problems for Firefox 22 and below, as an\n   * older \"LSProgressEvent\" will be dispatched by the browser. That\n   * progress event is no longer supported, and can lead to failures,\n   * including throwing exceptions.\n   *\n   * @see http://bugzilla.mozilla.org/show_bug.cgi?id=845631\n   * @see b/23469793\n   *\n   * @private {boolean}\n   */\n  this.progressEventsEnabled_ = false;\n\n  /**\n   * True if we can use XMLHttpRequest's timeout directly.\n   * @private {boolean}\n   */\n  this.useXhr2Timeout_ = false;\n};\ngoog.inherits(goog.net.XhrIo, goog.events.EventTarget);\n\nvar XhrIo = goog.net.XhrIo;\n\n/**\n * Response types that may be requested for XMLHttpRequests.\n * @enum {string}\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-responsetype-attribute\n */\ngoog.net.XhrIo.ResponseType = {\n  DEFAULT: '',\n  TEXT: 'text',\n  DOCUMENT: 'document',\n  // Not supported as of Chrome 10.0.612.1 dev\n  BLOB: 'blob',\n  ARRAY_BUFFER: 'arraybuffer'\n};\n\nvar ResponseType = goog.net.XhrIo.ResponseType;\n\n\n/**\n * A reference to the XhrIo logger\n * @private {?goog.log.Logger}\n * @const\n */\ngoog.net.XhrIo.prototype.logger_ = goog.log.getLogger('goog.net.XhrIo');\n\n\n/**\n * The Content-Type HTTP header name\n * @type {string}\n */\ngoog.net.XhrIo.CONTENT_TYPE_HEADER = 'Content-Type';\n\n\n/**\n * The Content-Transfer-Encoding HTTP header name\n * @type {string}\n */\ngoog.net.XhrIo.CONTENT_TRANSFER_ENCODING = 'Content-Transfer-Encoding';\n\n\n/**\n * The pattern matching the 'http' and 'https' URI schemes\n * @type {!RegExp}\n */\ngoog.net.XhrIo.HTTP_SCHEME_PATTERN = /^https?$/i;\n\n\n/**\n * The methods that typically come along with form data.  We set different\n * headers depending on whether the HTTP action is one of these.\n * @type {!Array<string>}\n */\ngoog.net.XhrIo.METHODS_WITH_FORM_DATA = ['POST', 'PUT'];\n\n\n/**\n * The Content-Type HTTP header value for a url-encoded form\n * @type {string}\n */\ngoog.net.XhrIo.FORM_CONTENT_TYPE =\n    'application/x-www-form-urlencoded;charset=utf-8';\n\n\n/**\n * The XMLHttpRequest Level two timeout delay ms property name.\n *\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute\n *\n * @private {string}\n * @const\n */\ngoog.net.XhrIo.XHR2_TIMEOUT_ = 'timeout';\n\n\n/**\n * The XMLHttpRequest Level two ontimeout handler property name.\n *\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute\n *\n * @private {string}\n * @const\n */\ngoog.net.XhrIo.XHR2_ON_TIMEOUT_ = 'ontimeout';\n\n\n/**\n * All non-disposed instances of goog.net.XhrIo created\n * by {@link goog.net.XhrIo.send} are in this Array.\n * @see goog.net.XhrIo.cleanup\n * @private {!Array<!goog.net.XhrIo>}\n */\ngoog.net.XhrIo.sendInstances_ = [];\n\n\n/**\n * Static send that creates a short lived instance of XhrIo to send the\n * request.\n * @see goog.net.XhrIo.cleanup\n * @param {string|goog.Uri} url Uri to make request to.\n * @param {?function(this:goog.net.XhrIo, ?)=} opt_callback Callback function\n *     for when request is complete.\n * @param {string=} opt_method Send method, default: GET.\n * @param {ArrayBuffer|ArrayBufferView|Blob|Document|FormData|string=}\n *     opt_content Body data.\n * @param {Object|goog.structs.Map=} opt_headers Map of headers to add to the\n *     request.\n * @param {number=} opt_timeoutInterval Number of milliseconds after which an\n *     incomplete request will be aborted; 0 means no timeout is set.\n * @param {boolean=} opt_withCredentials Whether to send credentials with the\n *     request. Default to false. See {@link goog.net.XhrIo#setWithCredentials}.\n * @return {!goog.net.XhrIo} The sent XhrIo.\n */\ngoog.net.XhrIo.send = function(\n    url, opt_callback, opt_method, opt_content, opt_headers,\n    opt_timeoutInterval, opt_withCredentials) {\n  var x = new goog.net.XhrIo();\n  goog.net.XhrIo.sendInstances_.push(x);\n  if (opt_callback) {\n    x.listen(goog.net.EventType.COMPLETE, opt_callback);\n  }\n  x.listenOnce(goog.net.EventType.READY, x.cleanupSend_);\n  if (opt_timeoutInterval) {\n    x.setTimeoutInterval(opt_timeoutInterval);\n  }\n  if (opt_withCredentials) {\n    x.setWithCredentials(opt_withCredentials);\n  }\n  x.send(url, opt_method, opt_content, opt_headers);\n  return x;\n};\n\n\n/**\n * Disposes all non-disposed instances of goog.net.XhrIo created by\n * {@link goog.net.XhrIo.send}.\n * {@link goog.net.XhrIo.send} cleans up the goog.net.XhrIo instance\n * it creates when the request completes or fails.  However, if\n * the request never completes, then the goog.net.XhrIo is not disposed.\n * This can occur if the window is unloaded before the request completes.\n * We could have {@link goog.net.XhrIo.send} return the goog.net.XhrIo\n * it creates and make the client of {@link goog.net.XhrIo.send} be\n * responsible for disposing it in this case.  However, this makes things\n * significantly more complicated for the client, and the whole point\n * of {@link goog.net.XhrIo.send} is that it's simple and easy to use.\n * Clients of {@link goog.net.XhrIo.send} should call\n * {@link goog.net.XhrIo.cleanup} when doing final\n * cleanup on window unload.\n */\ngoog.net.XhrIo.cleanup = function() {\n  var instances = goog.net.XhrIo.sendInstances_;\n  while (instances.length) {\n    instances.pop().dispose();\n  }\n};\n\n\n/**\n * Installs exception protection for all entry point introduced by\n * goog.net.XhrIo instances which are not protected by\n * {@link goog.debug.ErrorHandler#protectWindowSetTimeout},\n * {@link goog.debug.ErrorHandler#protectWindowSetInterval}, or\n * {@link goog.events.protectBrowserEventEntryPoint}.\n *\n * @param {goog.debug.ErrorHandler} errorHandler Error handler with which to\n *     protect the entry point(s).\n */\ngoog.net.XhrIo.protectEntryPoints = function(errorHandler) {\n  goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ =\n      errorHandler.protectEntryPoint(\n          goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_);\n};\n\n\n/**\n * Disposes of the specified goog.net.XhrIo created by\n * {@link goog.net.XhrIo.send} and removes it from\n * {@link goog.net.XhrIo.pendingStaticSendInstances_}.\n * @private\n */\ngoog.net.XhrIo.prototype.cleanupSend_ = function() {\n  this.dispose();\n  goog.array.remove(goog.net.XhrIo.sendInstances_, this);\n};\n\n\n/**\n * Returns the number of milliseconds after which an incomplete request will be\n * aborted, or 0 if no timeout is set.\n * @return {number} Timeout interval in milliseconds.\n */\ngoog.net.XhrIo.prototype.getTimeoutInterval = function() {\n  return this.timeoutInterval_;\n};\n\n\n/**\n * Sets the number of milliseconds after which an incomplete request will be\n * aborted and a {@link goog.net.EventType.TIMEOUT} event raised; 0 means no\n * timeout is set.\n * @param {number} ms Timeout interval in milliseconds; 0 means none.\n */\ngoog.net.XhrIo.prototype.setTimeoutInterval = function(ms) {\n  this.timeoutInterval_ = Math.max(0, ms);\n};\n\n\n/**\n * Sets the desired type for the response. At time of writing, this is only\n * supported in very recent versions of WebKit (10.0.612.1 dev and later).\n *\n * If this is used, the response may only be accessed via {@link #getResponse}.\n *\n * @param {goog.net.XhrIo.ResponseType} type The desired type for the response.\n */\ngoog.net.XhrIo.prototype.setResponseType = function(type) {\n  this.responseType_ = type;\n};\n\n\n/**\n * Gets the desired type for the response.\n * @return {goog.net.XhrIo.ResponseType} The desired type for the response.\n */\ngoog.net.XhrIo.prototype.getResponseType = function() {\n  return this.responseType_;\n};\n\n\n/**\n * Sets whether a \"credentialed\" request that is aware of cookie and\n * authentication information should be made. This option is only supported by\n * browsers that support HTTP Access Control. As of this writing, this option\n * is not supported in IE.\n *\n * @param {boolean} withCredentials Whether this should be a \"credentialed\"\n *     request.\n */\ngoog.net.XhrIo.prototype.setWithCredentials = function(withCredentials) {\n  this.withCredentials_ = withCredentials;\n};\n\n\n/**\n * Gets whether a \"credentialed\" request is to be sent.\n * @return {boolean} The desired type for the response.\n */\ngoog.net.XhrIo.prototype.getWithCredentials = function() {\n  return this.withCredentials_;\n};\n\n\n/**\n * Sets whether progress events are enabled for this request. Note\n * that progress events require pre-flight OPTIONS request handling\n * for CORS requests, and may cause trouble with older browsers. See\n * progressEventsEnabled_ for details.\n * @param {boolean} enabled Whether progress events should be enabled.\n */\ngoog.net.XhrIo.prototype.setProgressEventsEnabled = function(enabled) {\n  this.progressEventsEnabled_ = enabled;\n};\n\n\n/**\n * Gets whether progress events are enabled.\n * @return {boolean} Whether progress events are enabled for this request.\n */\ngoog.net.XhrIo.prototype.getProgressEventsEnabled = function() {\n  return this.progressEventsEnabled_;\n};\n\n\n/**\n * Instance send that actually uses XMLHttpRequest to make a server call.\n * @param {string|goog.Uri} url Uri to make request to.\n * @param {string=} opt_method Send method, default: GET.\n * @param {ArrayBuffer|ArrayBufferView|Blob|Document|FormData|string=}\n *     opt_content Body data.\n * @param {Object|goog.structs.Map=} opt_headers Map of headers to add to the\n *     request.\n * @suppress {deprecated} Use deprecated goog.structs.forEach to allow different\n * types of parameters for opt_headers.\n */\ngoog.net.XhrIo.prototype.send = function(\n    url, opt_method, opt_content, opt_headers) {\n  if (this.xhr_) {\n    throw new Error(\n        '[goog.net.XhrIo] Object is active with another request=' +\n        this.lastUri_ + '; newUri=' + url);\n  }\n\n  var method = opt_method ? opt_method.toUpperCase() : 'GET';\n\n  this.lastUri_ = url;\n  this.lastError_ = '';\n  this.lastErrorCode_ = goog.net.ErrorCode.NO_ERROR;\n  this.lastMethod_ = method;\n  this.errorDispatched_ = false;\n  this.active_ = true;\n\n  // Use the factory to create the XHR object and options\n  this.xhr_ = this.createXhr();\n  this.xhrOptions_ = this.xmlHttpFactory_ ? this.xmlHttpFactory_.getOptions() :\n                                            goog.net.XmlHttp.getOptions();\n\n  // Set up the onreadystatechange callback\n  this.xhr_.onreadystatechange = goog.bind(this.onReadyStateChange_, this);\n\n  // Set up upload/download progress events, if progress events are supported.\n  if (this.getProgressEventsEnabled() && 'onprogress' in this.xhr_) {\n    this.xhr_.onprogress =\n        goog.bind(function(e) { this.onProgressHandler_(e, true); }, this);\n    if (this.xhr_.upload) {\n      this.xhr_.upload.onprogress = goog.bind(this.onProgressHandler_, this);\n    }\n  }\n\n  /**\n   * Try to open the XMLHttpRequest (always async), if an error occurs here it\n   * is generally permission denied\n   */\n  try {\n    goog.log.fine(this.logger_, this.formatMsg_('Opening Xhr'));\n    this.inOpen_ = true;\n    this.xhr_.open(method, String(url), true);  // Always async!\n    this.inOpen_ = false;\n  } catch (err) {\n    goog.log.fine(\n        this.logger_, this.formatMsg_('Error opening Xhr: ' + err.message));\n    this.error_(goog.net.ErrorCode.EXCEPTION, err);\n    return;\n  }\n\n  // We can't use null since this won't allow requests with form data to have a\n  // content length specified which will cause some proxies to return a 411\n  // error.\n  var content = opt_content || '';\n\n  var headers = this.headers.clone();\n\n  // Add headers specific to this request\n  if (opt_headers) {\n    goog.structs.forEach(\n        opt_headers, function(value, key) { headers.set(key, value); });\n  }\n\n  // Find whether a content type header is set, ignoring case.\n  // HTTP header names are case-insensitive.  See:\n  // http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2\n  var contentTypeKey =\n      goog.array.find(headers.getKeys(), goog.net.XhrIo.isContentTypeHeader_);\n\n  var contentIsFormData =\n      (goog.global['FormData'] && (content instanceof goog.global['FormData']));\n  if (goog.array.contains(goog.net.XhrIo.METHODS_WITH_FORM_DATA, method) &&\n      !contentTypeKey && !contentIsFormData) {\n    // For requests typically with form data, default to the url-encoded form\n    // content type unless this is a FormData request.  For FormData,\n    // the browser will automatically add a multipart/form-data content type\n    // with an appropriate multipart boundary.\n    headers.set(\n        goog.net.XhrIo.CONTENT_TYPE_HEADER, goog.net.XhrIo.FORM_CONTENT_TYPE);\n  }\n\n  // Add the headers to the Xhr object\n  headers.forEach(function(value, key) {\n    this.xhr_.setRequestHeader(key, value);\n  }, this);\n\n  if (this.responseType_) {\n    this.xhr_.responseType = this.responseType_;\n  }\n  // Set xhr_.withCredentials only when the value is different, or else in\n  // synchronous XMLHtppRequest.open Firefox will throw an exception.\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=736340\n  if ('withCredentials' in this.xhr_ &&\n      this.xhr_.withCredentials !== this.withCredentials_) {\n    this.xhr_.withCredentials = this.withCredentials_;\n  }\n\n  /**\n   * Try to send the request, or other wise report an error (404 not found).\n   */\n  try {\n    this.cleanUpTimeoutTimer_();  // Paranoid, should never be running.\n    if (this.timeoutInterval_ > 0) {\n      this.useXhr2Timeout_ = goog.net.XhrIo.shouldUseXhr2Timeout_(this.xhr_);\n      goog.log.fine(\n          this.logger_, this.formatMsg_(\n                            'Will abort after ' + this.timeoutInterval_ +\n                            'ms if incomplete, xhr2 ' + this.useXhr2Timeout_));\n      if (this.useXhr2Timeout_) {\n        this.xhr_[goog.net.XhrIo.XHR2_TIMEOUT_] = this.timeoutInterval_;\n        this.xhr_[goog.net.XhrIo.XHR2_ON_TIMEOUT_] =\n            goog.bind(this.timeout_, this);\n      } else {\n        this.timeoutId_ =\n            goog.Timer.callOnce(this.timeout_, this.timeoutInterval_, this);\n      }\n    }\n    goog.log.fine(this.logger_, this.formatMsg_('Sending request'));\n    this.inSend_ = true;\n    this.xhr_.send(content);\n    this.inSend_ = false;\n\n  } catch (err) {\n    goog.log.fine(this.logger_, this.formatMsg_('Send error: ' + err.message));\n    this.error_(goog.net.ErrorCode.EXCEPTION, err);\n  }\n};\n\n\n/**\n * Determines if the argument is an XMLHttpRequest that supports the level 2\n * timeout value and event.\n *\n * Currently, FF 21.0 OS X has the fields but won't actually call the timeout\n * handler.  Perhaps the confusion in the bug referenced below hasn't\n * entirely been resolved.\n *\n * @see http://www.w3.org/TR/XMLHttpRequest/#the-timeout-attribute\n * @see https://bugzilla.mozilla.org/show_bug.cgi?id=525816\n *\n * @param {!goog.net.XhrLike.OrNative} xhr The request.\n * @return {boolean} True if the request supports level 2 timeout.\n * @private\n */\ngoog.net.XhrIo.shouldUseXhr2Timeout_ = function(xhr) {\n  return goog.userAgent.IE && goog.userAgent.isVersionOrHigher(9) &&\n      typeof xhr[goog.net.XhrIo.XHR2_TIMEOUT_] === 'number' &&\n      xhr[goog.net.XhrIo.XHR2_ON_TIMEOUT_] !== undefined;\n};\n\n\n/**\n * @param {string} header An HTTP header key.\n * @return {boolean} Whether the key is a content type header (ignoring\n *     case.\n * @private\n */\ngoog.net.XhrIo.isContentTypeHeader_ = function(header) {\n  return goog.string.caseInsensitiveEquals(\n      goog.net.XhrIo.CONTENT_TYPE_HEADER, header);\n};\n\n\n/**\n * Creates a new XHR object.\n * @return {!goog.net.XhrLike.OrNative} The newly created XHR object.\n * @protected\n */\ngoog.net.XhrIo.prototype.createXhr = function() {\n  return this.xmlHttpFactory_ ? this.xmlHttpFactory_.createInstance() :\n                                goog.net.XmlHttp();\n};\n\n\n/**\n * The request didn't complete after {@link goog.net.XhrIo#timeoutInterval_}\n * milliseconds; raises a {@link goog.net.EventType.TIMEOUT} event and aborts\n * the request.\n * @private\n */\ngoog.net.XhrIo.prototype.timeout_ = function() {\n  if (typeof goog == 'undefined') {\n    // If goog is undefined then the callback has occurred as the application\n    // is unloading and will error.  Thus we let it silently fail.\n  } else if (this.xhr_) {\n    this.lastError_ =\n        'Timed out after ' + this.timeoutInterval_ + 'ms, aborting';\n    this.lastErrorCode_ = goog.net.ErrorCode.TIMEOUT;\n    goog.log.fine(this.logger_, this.formatMsg_(this.lastError_));\n    this.dispatchEvent(goog.net.EventType.TIMEOUT);\n    this.abort(goog.net.ErrorCode.TIMEOUT);\n  }\n};\n\n\n/**\n * Something errorred, so inactivate, fire error callback and clean up\n * @param {goog.net.ErrorCode} errorCode The error code.\n * @param {Error} err The error object.\n * @private\n */\ngoog.net.XhrIo.prototype.error_ = function(errorCode, err) {\n  this.active_ = false;\n  if (this.xhr_) {\n    this.inAbort_ = true;\n    this.xhr_.abort();  // Ensures XHR isn't hung (FF)\n    this.inAbort_ = false;\n  }\n  this.lastError_ = err;\n  this.lastErrorCode_ = errorCode;\n  this.dispatchErrors_();\n  this.cleanUpXhr_();\n};\n\n\n/**\n * Dispatches COMPLETE and ERROR in case of an error. This ensures that we do\n * not dispatch multiple error events.\n * @private\n */\ngoog.net.XhrIo.prototype.dispatchErrors_ = function() {\n  if (!this.errorDispatched_) {\n    this.errorDispatched_ = true;\n    this.dispatchEvent(goog.net.EventType.COMPLETE);\n    this.dispatchEvent(goog.net.EventType.ERROR);\n  }\n};\n\n\n/**\n * Abort the current XMLHttpRequest\n * @param {goog.net.ErrorCode=} opt_failureCode Optional error code to use -\n *     defaults to ABORT.\n */\ngoog.net.XhrIo.prototype.abort = function(opt_failureCode) {\n  if (this.xhr_ && this.active_) {\n    goog.log.fine(this.logger_, this.formatMsg_('Aborting'));\n    this.active_ = false;\n    this.inAbort_ = true;\n    this.xhr_.abort();\n    this.inAbort_ = false;\n    this.lastErrorCode_ = opt_failureCode || goog.net.ErrorCode.ABORT;\n    this.dispatchEvent(goog.net.EventType.COMPLETE);\n    this.dispatchEvent(goog.net.EventType.ABORT);\n    this.cleanUpXhr_();\n  }\n};\n\n\n/**\n * Nullifies all callbacks to reduce risks of leaks.\n * @override\n * @protected\n */\ngoog.net.XhrIo.prototype.disposeInternal = function() {\n  if (this.xhr_) {\n    // We explicitly do not call xhr_.abort() unless active_ is still true.\n    // This is to avoid unnecessarily aborting a successful request when\n    // dispose() is called in a callback triggered by a complete response, but\n    // in which browser cleanup has not yet finished.\n    // (See http://b/issue?id=1684217.)\n    if (this.active_) {\n      this.active_ = false;\n      this.inAbort_ = true;\n      this.xhr_.abort();\n      this.inAbort_ = false;\n    }\n    this.cleanUpXhr_(true);\n  }\n\n  XhrIo.base(this, 'disposeInternal');\n};\n\n\n/**\n * Internal handler for the XHR object's readystatechange event.  This method\n * checks the status and the readystate and fires the correct callbacks.\n * If the request has ended, the handlers are cleaned up and the XHR object is\n * nullified.\n * @private\n */\ngoog.net.XhrIo.prototype.onReadyStateChange_ = function() {\n  if (this.isDisposed()) {\n    // This method is the target of an untracked goog.Timer.callOnce().\n    return;\n  }\n  if (!this.inOpen_ && !this.inSend_ && !this.inAbort_) {\n    // Were not being called from within a call to this.xhr_.send\n    // this.xhr_.abort, or this.xhr_.open, so this is an entry point\n    this.onReadyStateChangeEntryPoint_();\n  } else {\n    this.onReadyStateChangeHelper_();\n  }\n};\n\n\n/**\n * Used to protect the onreadystatechange handler entry point.  Necessary\n * as {#onReadyStateChange_} maybe called from within send or abort, this\n * method is only called when {#onReadyStateChange_} is called as an\n * entry point.\n * {@see #protectEntryPoints}\n * @private\n */\ngoog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ = function() {\n  this.onReadyStateChangeHelper_();\n};\n\n\n/**\n * Helper for {@link #onReadyStateChange_}.  This is used so that\n * entry point calls to {@link #onReadyStateChange_} can be routed through\n * {@link #onReadyStateChangeEntryPoint_}.\n * @private\n */\ngoog.net.XhrIo.prototype.onReadyStateChangeHelper_ = function() {\n  if (!this.active_) {\n    // can get called inside abort call\n    return;\n  }\n\n  if (typeof goog == 'undefined') {\n    // NOTE(user): If goog is undefined then the callback has occurred as the\n    // application is unloading and will error.  Thus we let it silently fail.\n\n  } else if (\n      this.xhrOptions_[goog.net.XmlHttp.OptionType.LOCAL_REQUEST_ERROR] &&\n      this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE &&\n      this.getStatus() == 2) {\n    // NOTE(user): In IE if send() errors on a *local* request the readystate\n    // is still changed to COMPLETE.  We need to ignore it and allow the\n    // try/catch around send() to pick up the error.\n    goog.log.fine(\n        this.logger_,\n        this.formatMsg_('Local request error detected and ignored'));\n\n  } else {\n    // In IE when the response has been cached we sometimes get the callback\n    // from inside the send call and this usually breaks code that assumes that\n    // XhrIo is asynchronous.  If that is the case we delay the callback\n    // using a timer.\n    if (this.inSend_ &&\n        this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE) {\n      goog.Timer.callOnce(this.onReadyStateChange_, 0, this);\n      return;\n    }\n\n    this.dispatchEvent(goog.net.EventType.READY_STATE_CHANGE);\n\n    // readyState indicates the transfer has finished\n    if (this.isComplete()) {\n      goog.log.fine(this.logger_, this.formatMsg_('Request complete'));\n\n      this.active_ = false;\n\n      try {\n        // Call the specific callbacks for success or failure. Only call the\n        // success if the status is 200 (HTTP_OK) or 304 (HTTP_CACHED)\n        if (this.isSuccess()) {\n          this.dispatchEvent(goog.net.EventType.COMPLETE);\n          this.dispatchEvent(goog.net.EventType.SUCCESS);\n        } else {\n          this.lastErrorCode_ = goog.net.ErrorCode.HTTP_ERROR;\n          this.lastError_ =\n              this.getStatusText() + ' [' + this.getStatus() + ']';\n          this.dispatchErrors_();\n        }\n      } finally {\n        this.cleanUpXhr_();\n      }\n    }\n  }\n};\n\n\n/**\n * Internal handler for the XHR object's onprogress event. Fires both a generic\n * PROGRESS event and either a DOWNLOAD_PROGRESS or UPLOAD_PROGRESS event to\n * allow specific binding for each XHR progress event.\n * @param {!ProgressEvent} e XHR progress event.\n * @param {boolean=} opt_isDownload Whether the current progress event is from a\n *     download. Used to determine whether DOWNLOAD_PROGRESS or UPLOAD_PROGRESS\n *     event should be dispatched.\n * @private\n */\ngoog.net.XhrIo.prototype.onProgressHandler_ = function(e, opt_isDownload) {\n  goog.asserts.assert(\n      e.type === goog.net.EventType.PROGRESS,\n      'goog.net.EventType.PROGRESS is of the same type as raw XHR progress.');\n  this.dispatchEvent(\n      goog.net.XhrIo.buildProgressEvent_(e, goog.net.EventType.PROGRESS));\n  this.dispatchEvent(\n      goog.net.XhrIo.buildProgressEvent_(\n          e, opt_isDownload ? goog.net.EventType.DOWNLOAD_PROGRESS :\n                              goog.net.EventType.UPLOAD_PROGRESS));\n};\n\n\n/**\n * Creates a representation of the native ProgressEvent. IE doesn't support\n * constructing ProgressEvent via \"new\", and the alternatives (e.g.,\n * ProgressEvent.initProgressEvent) are non-standard or deprecated.\n * @param {!ProgressEvent} e XHR progress event.\n * @param {!goog.net.EventType} eventType The type of the event.\n * @return {!ProgressEvent} The progress event.\n * @private\n */\ngoog.net.XhrIo.buildProgressEvent_ = function(e, eventType) {\n  return /** @type {!ProgressEvent} */ ({\n    type: eventType,\n    lengthComputable: e.lengthComputable,\n    loaded: e.loaded,\n    total: e.total\n  });\n};\n\n\n/**\n * Remove the listener to protect against leaks, and nullify the XMLHttpRequest\n * object.\n * @param {boolean=} opt_fromDispose If this is from the dispose (don't want to\n *     fire any events).\n * @private\n */\ngoog.net.XhrIo.prototype.cleanUpXhr_ = function(opt_fromDispose) {\n  if (this.xhr_) {\n    // Cancel any pending timeout event handler.\n    this.cleanUpTimeoutTimer_();\n\n    // Save reference so we can mark it as closed after the READY event.  The\n    // READY event may trigger another request, thus we must nullify this.xhr_\n    var xhr = this.xhr_;\n    var clearedOnReadyStateChange =\n        this.xhrOptions_[goog.net.XmlHttp.OptionType.USE_NULL_FUNCTION] ?\n        goog.nullFunction :\n        null;\n    this.xhr_ = null;\n    this.xhrOptions_ = null;\n\n    if (!opt_fromDispose) {\n      this.dispatchEvent(goog.net.EventType.READY);\n    }\n\n    try {\n      // NOTE(user): Not nullifying in FireFox can still leak if the callbacks\n      // are defined in the same scope as the instance of XhrIo. But, IE doesn't\n      // allow you to set the onreadystatechange to NULL so nullFunction is\n      // used.\n      xhr.onreadystatechange = clearedOnReadyStateChange;\n    } catch (e) {\n      // This seems to occur with a Gears HTTP request. Delayed the setting of\n      // this onreadystatechange until after READY is sent out and catching the\n      // error to see if we can track down the problem.\n      goog.log.error(\n          this.logger_,\n          'Problem encountered resetting onreadystatechange: ' + e.message);\n    }\n  }\n};\n\n\n/**\n * Make sure the timeout timer isn't running.\n * @private\n */\ngoog.net.XhrIo.prototype.cleanUpTimeoutTimer_ = function() {\n  if (this.xhr_ && this.useXhr2Timeout_) {\n    this.xhr_[goog.net.XhrIo.XHR2_ON_TIMEOUT_] = null;\n  }\n  if (this.timeoutId_) {\n    goog.Timer.clear(this.timeoutId_);\n    this.timeoutId_ = null;\n  }\n};\n\n\n/**\n * @return {boolean} Whether there is an active request.\n */\ngoog.net.XhrIo.prototype.isActive = function() {\n  return !!this.xhr_;\n};\n\n\n/**\n * @return {boolean} Whether the request has completed.\n */\ngoog.net.XhrIo.prototype.isComplete = function() {\n  return this.getReadyState() == goog.net.XmlHttp.ReadyState.COMPLETE;\n};\n\n\n/**\n * @return {boolean} Whether the request completed with a success.\n */\ngoog.net.XhrIo.prototype.isSuccess = function() {\n  var status = this.getStatus();\n  // A zero status code is considered successful for local files.\n  return goog.net.HttpStatus.isSuccess(status) ||\n      status === 0 && !this.isLastUriEffectiveSchemeHttp_();\n};\n\n\n/**\n * @return {boolean} whether the effective scheme of the last URI that was\n *     fetched was 'http' or 'https'.\n * @private\n */\ngoog.net.XhrIo.prototype.isLastUriEffectiveSchemeHttp_ = function() {\n  var scheme = goog.uri.utils.getEffectiveScheme(String(this.lastUri_));\n  return goog.net.XhrIo.HTTP_SCHEME_PATTERN.test(scheme);\n};\n\n\n/**\n * Get the readystate from the Xhr object\n * Will only return correct result when called from the context of a callback\n * @return {goog.net.XmlHttp.ReadyState} goog.net.XmlHttp.ReadyState.*.\n */\ngoog.net.XhrIo.prototype.getReadyState = function() {\n  return this.xhr_ ?\n      /** @type {goog.net.XmlHttp.ReadyState} */ (this.xhr_.readyState) :\n                                                 goog.net.XmlHttp.ReadyState\n                                                     .UNINITIALIZED;\n};\n\n\n/**\n * Get the status from the Xhr object\n * Will only return correct result when called from the context of a callback\n * @return {number} Http status.\n */\ngoog.net.XhrIo.prototype.getStatus = function() {\n  /**\n   * IE doesn't like you checking status until the readystate is greater than 2\n   * (i.e. it is receiving or complete).  The try/catch is used for when the\n   * page is unloading and an ERROR_NOT_AVAILABLE may occur when accessing xhr_.\n   */\n  try {\n    return this.getReadyState() > goog.net.XmlHttp.ReadyState.LOADED ?\n        this.xhr_.status :\n        -1;\n  } catch (e) {\n    return -1;\n  }\n};\n\n\n/**\n * Get the status text from the Xhr object\n * Will only return correct result when called from the context of a callback\n * @return {string} Status text.\n */\ngoog.net.XhrIo.prototype.getStatusText = function() {\n  /**\n   * IE doesn't like you checking status until the readystate is greater than 2\n   * (i.e. it is receiving or complete).  The try/catch is used for when the\n   * page is unloading and an ERROR_NOT_AVAILABLE may occur when accessing xhr_.\n   */\n  try {\n    return this.getReadyState() > goog.net.XmlHttp.ReadyState.LOADED ?\n        this.xhr_.statusText :\n        '';\n  } catch (e) {\n    goog.log.fine(this.logger_, 'Can not get status: ' + e.message);\n    return '';\n  }\n};\n\n\n/**\n * Get the last Uri that was requested\n * @return {string} Last Uri.\n */\ngoog.net.XhrIo.prototype.getLastUri = function() {\n  return String(this.lastUri_);\n};\n\n\n/**\n * Get the response text from the Xhr object\n * Will only return correct result when called from the context of a callback.\n * @return {string} Result from the server, or '' if no result available.\n */\ngoog.net.XhrIo.prototype.getResponseText = function() {\n  try {\n    return this.xhr_ ? this.xhr_.responseText : '';\n  } catch (e) {\n    // http://www.w3.org/TR/XMLHttpRequest/#the-responsetext-attribute\n    // states that responseText should return '' (and responseXML null)\n    // when the state is not LOADING or DONE. Instead, IE can\n    // throw unexpected exceptions, for example when a request is aborted\n    // or no data is available yet.\n    goog.log.fine(this.logger_, 'Can not get responseText: ' + e.message);\n    return '';\n  }\n};\n\n\n/**\n * Get the response body from the Xhr object. This property is only available\n * in IE since version 7 according to MSDN:\n * http://msdn.microsoft.com/en-us/library/ie/ms534368(v=vs.85).aspx\n * Will only return correct result when called from the context of a callback.\n *\n * One option is to construct a VBArray from the returned object and convert\n * it to a JavaScript array using the toArray method:\n * `(new window['VBArray'](xhrIo.getResponseBody())).toArray()`\n * This will result in an array of numbers in the range of [0..255]\n *\n * Another option is to use the VBScript CStr method to convert it into a\n * string as outlined in http://stackoverflow.com/questions/1919972\n *\n * @return {Object} Binary result from the server or null if not available.\n */\ngoog.net.XhrIo.prototype.getResponseBody = function() {\n  try {\n    if (this.xhr_ && 'responseBody' in this.xhr_) {\n      return this.xhr_['responseBody'];\n    }\n  } catch (e) {\n    // IE can throw unexpected exceptions, for example when a request is aborted\n    // or no data is yet available.\n    goog.log.fine(this.logger_, 'Can not get responseBody: ' + e.message);\n  }\n  return null;\n};\n\n\n/**\n * Get the response XML from the Xhr object\n * Will only return correct result when called from the context of a callback.\n * @return {Document} The DOM Document representing the XML file, or null\n * if no result available.\n */\ngoog.net.XhrIo.prototype.getResponseXml = function() {\n  try {\n    return this.xhr_ ? this.xhr_.responseXML : null;\n  } catch (e) {\n    goog.log.fine(this.logger_, 'Can not get responseXML: ' + e.message);\n    return null;\n  }\n};\n\n\n/**\n * Get the response and evaluates it as JSON from the Xhr object\n * Will only return correct result when called from the context of a callback\n * @param {string=} opt_xssiPrefix Optional XSSI prefix string to use for\n *     stripping of the response before parsing. This needs to be set only if\n *     your backend server prepends the same prefix string to the JSON response.\n * @throws Error if the response text is invalid JSON.\n * @return {Object|undefined} JavaScript object.\n */\ngoog.net.XhrIo.prototype.getResponseJson = function(opt_xssiPrefix) {\n  if (!this.xhr_) {\n    return undefined;\n  }\n\n  var responseText = this.xhr_.responseText;\n  if (opt_xssiPrefix && responseText.indexOf(opt_xssiPrefix) == 0) {\n    responseText = responseText.substring(opt_xssiPrefix.length);\n  }\n\n  return goog.json.hybrid.parse(responseText);\n};\n\n\n/**\n * Get the response as the type specificed by {@link #setResponseType}. At time\n * of writing, this is only directly supported in very recent versions of WebKit\n * (10.0.612.1 dev and later). If the field is not supported directly, we will\n * try to emulate it.\n *\n * Emulating the response means following the rules laid out at\n * http://www.w3.org/TR/XMLHttpRequest/#the-response-attribute\n *\n * On browsers with no support for this (Chrome < 10, Firefox < 4, etc), only\n * response types of DEFAULT or TEXT may be used, and the response returned will\n * be the text response.\n *\n * On browsers with Mozilla's draft support for array buffers (Firefox 4, 5),\n * only response types of DEFAULT, TEXT, and ARRAY_BUFFER may be used, and the\n * response returned will be either the text response or the Mozilla\n * implementation of the array buffer response.\n *\n * On browsers will full support, any valid response type supported by the\n * browser may be used, and the response provided by the browser will be\n * returned.\n *\n * @return {*} The response.\n */\ngoog.net.XhrIo.prototype.getResponse = function() {\n  try {\n    if (!this.xhr_) {\n      return null;\n    }\n    if ('response' in this.xhr_) {\n      return this.xhr_.response;\n    }\n    switch (this.responseType_) {\n      case ResponseType.DEFAULT:\n      case ResponseType.TEXT:\n        return this.xhr_.responseText;\n      // DOCUMENT and BLOB don't need to be handled here because they are\n      // introduced in the same spec that adds the .response field, and would\n      // have been caught above.\n      // ARRAY_BUFFER needs an implementation for Firefox 4, where it was\n      // implemented using a draft spec rather than the final spec.\n      case ResponseType.ARRAY_BUFFER:\n        if ('mozResponseArrayBuffer' in this.xhr_) {\n          return this.xhr_.mozResponseArrayBuffer;\n        }\n    }\n    // Fell through to a response type that is not supported on this browser.\n    goog.log.error(\n        this.logger_, 'Response type ' + this.responseType_ + ' is not ' +\n            'supported on this browser');\n    return null;\n  } catch (e) {\n    goog.log.fine(this.logger_, 'Can not get response: ' + e.message);\n    return null;\n  }\n};\n\n\n/**\n * Get the value of the response-header with the given name from the Xhr object\n * Will only return correct result when called from the context of a callback\n * and the request has completed\n * @param {string} key The name of the response-header to retrieve.\n * @return {string|undefined} The value of the response-header named key.\n */\ngoog.net.XhrIo.prototype.getResponseHeader = function(key) {\n  if (!this.xhr_ || !this.isComplete()) {\n    return undefined;\n  }\n\n  var value = this.xhr_.getResponseHeader(key);\n  return value === null ? undefined : value;\n};\n\n\n/**\n * Gets the text of all the headers in the response.\n * Will only return correct result when called from the context of a callback\n * and the request has completed.\n * @return {string} The value of the response headers or empty string.\n */\ngoog.net.XhrIo.prototype.getAllResponseHeaders = function() {\n  // getAllResponseHeaders can return null if no response has been received,\n  // ensure we always return an empty string.\n  return this.xhr_ && this.isComplete() ?\n      (this.xhr_.getAllResponseHeaders() || '') :\n      '';\n};\n\n\n/**\n * Returns all response headers as a key-value map.\n * Multiple values for the same header key can be combined into one,\n * separated by a comma and a space.\n * Note that the native getResponseHeader method for retrieving a single header\n * does a case insensitive match on the header name. This method does not\n * include any case normalization logic, it will just return a key-value\n * representation of the headers.\n * See: http://www.w3.org/TR/XMLHttpRequest/#the-getresponseheader()-method\n * @return {!Object<string, string>} An object with the header keys as keys\n *     and header values as values.\n */\ngoog.net.XhrIo.prototype.getResponseHeaders = function() {\n  // TODO(b/120371595): Make this function parse headers as per the spec\n  // (https://tools.ietf.org/html/rfc2616#section-4.2).\n\n  var headersObject = {};\n  var headersArray = this.getAllResponseHeaders().split('\\r\\n');\n  for (var i = 0; i < headersArray.length; i++) {\n    if (goog.string.isEmptyOrWhitespace(headersArray[i])) {\n      continue;\n    }\n    var keyValue =\n        goog.string.splitLimit(headersArray[i], ':', /* maxSplitCount= */ 1);\n    var key = keyValue[0];\n    var value = keyValue[1];\n\n    if (typeof value !== 'string') {\n      // There must be a value but it can be the empty string.\n      continue;\n    }\n\n    // Whitespace at the start and end of the value is meaningless.\n    value = value.trim();\n    // The key should not contain whitespace but we currently ignore that.\n\n    var values = headersObject[key] || [];\n    headersObject[key] = values;\n    values.push(value);\n  }\n\n  return goog.object.map(headersObject, function(values) {\n    return values.join(', ');\n  });\n};\n\n\n/**\n * Get the value of the response-header with the given name from the Xhr object.\n * As opposed to {@link #getResponseHeader}, this method does not require that\n * the request has completed.\n * @param {string} key The name of the response-header to retrieve.\n * @return {?string} The value of the response-header, or null if it is\n *     unavailable.\n */\ngoog.net.XhrIo.prototype.getStreamingResponseHeader = function(key) {\n  return this.xhr_ ? this.xhr_.getResponseHeader(key) : null;\n};\n\n\n/**\n * Gets the text of all the headers in the response. As opposed to\n * {@link #getAllResponseHeaders}, this method does not require that the request\n * has completed.\n * @return {string} The value of the response headers or empty string.\n */\ngoog.net.XhrIo.prototype.getAllStreamingResponseHeaders = function() {\n  return this.xhr_ ? this.xhr_.getAllResponseHeaders() : '';\n};\n\n\n/**\n * Get the last error message\n * @return {!goog.net.ErrorCode} Last error code.\n */\ngoog.net.XhrIo.prototype.getLastErrorCode = function() {\n  return this.lastErrorCode_;\n};\n\n\n/**\n * Get the last error message\n * @return {string} Last error message.\n */\ngoog.net.XhrIo.prototype.getLastError = function() {\n  return typeof this.lastError_ === 'string' ? this.lastError_ :\n                                               String(this.lastError_);\n};\n\n\n/**\n * Adds the last method, status and URI to the message.  This is used to add\n * this information to the logging calls.\n * @param {string} msg The message text that we want to add the extra text to.\n * @return {string} The message with the extra text appended.\n * @private\n */\ngoog.net.XhrIo.prototype.formatMsg_ = function(msg) {\n  return msg + ' [' + this.lastMethod_ + ' ' + this.lastUri_ + ' ' +\n      this.getStatus() + ']';\n};\n\n\n// Register the xhr handler as an entry point, so that\n// it can be monitored for exception handling, etc.\ngoog.debug.entryPointRegistry.register(\n    /**\n     * @param {function(!Function): !Function} transformer The transforming\n     *     function.\n     */\n    function(transformer) {\n      goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_ =\n          transformer(goog.net.XhrIo.prototype.onReadyStateChangeEntryPoint_);\n    });\n});  // goog.scope\n","^?",1579837703000,"^@",["^A",["^1J","^3U","^SN","~$goog.uri.utils","^16","^1Q","^3","^21","^1M","^18","^3B","^4F","~$goog.structs","~$goog.debug.entryPointRegistry","~$goog.json.hybrid","^SB","^1S","^SR"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/xhrio.js"],"^S",["^A",["~$goog.net.XhrIo.ResponseType","^4C"]],"^1",true,"^2",["^3","^3U","^1S","^1J","^T1","^1M","^T2","^3B","^SR","^4F","^SN","^SB","^21","^16","^T0","^1Q","^S[","^18"]],["^ ","^7",[1579837703000],"^8","goog.ui.container.js","^9",["^:","goog/ui/container.js"],"^;","goog/ui/container.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Base class for containers that host {@link goog.ui.Control}s,\n * such as menus and toolbars.  Provides default keyboard and mouse event\n * handling and child management, based on a generalized version of\n * {@link goog.ui.Menu}.\n *\n * @author attila@google.com (Attila Bodis)\n * @see ../demos/container.html\n */\n// TODO(attila):  Fix code/logic duplication between this and goog.ui.Control.\n// TODO(attila):  Maybe pull common stuff all the way up into Component...?\n\ngoog.provide('goog.ui.Container');\ngoog.provide('goog.ui.Container.EventType');\ngoog.provide('goog.ui.Container.Orientation');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.events.KeyHandler');\ngoog.require('goog.object');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.ComponentUtil');\ngoog.require('goog.ui.ContainerRenderer');\ngoog.require('goog.ui.Control');\n\n\n\n/**\n * Base class for containers.  Extends {@link goog.ui.Component} by adding\n * the following:\n *  <ul>\n *    <li>a {@link goog.events.KeyHandler}, to simplify keyboard handling,\n *    <li>a pluggable <em>renderer</em> framework, to simplify the creation of\n *        containers without the need to subclass this class,\n *    <li>methods to manage child controls hosted in the container,\n *    <li>default mouse and keyboard event handling methods.\n *  </ul>\n * @param {?goog.ui.Container.Orientation=} opt_orientation Container\n *     orientation; defaults to `VERTICAL`.\n * @param {goog.ui.ContainerRenderer=} opt_renderer Renderer used to render or\n *     decorate the container; defaults to {@link goog.ui.ContainerRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for document\n *     interaction.\n * @extends {goog.ui.Component}\n * @constructor\n */\ngoog.ui.Container = function(opt_orientation, opt_renderer, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n  this.renderer_ = opt_renderer || goog.ui.ContainerRenderer.getInstance();\n  this.orientation_ = opt_orientation || this.renderer_.getDefaultOrientation();\n};\ngoog.inherits(goog.ui.Container, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.Container);\n\n\n/**\n * Container-specific events.\n * @enum {string}\n */\ngoog.ui.Container.EventType = {\n  /**\n   * Dispatched after a goog.ui.Container becomes visible. Non-cancellable.\n   * NOTE(user): This event really shouldn't exist, because the\n   * goog.ui.Component.EventType.SHOW event should behave like this one. But the\n   * SHOW event for containers has been behaving as other components'\n   * BEFORE_SHOW event for a long time, and too much code relies on that old\n   * behavior to fix it now.\n   */\n  AFTER_SHOW: 'aftershow',\n\n  /**\n   * Dispatched after a goog.ui.Container becomes invisible. Non-cancellable.\n   */\n  AFTER_HIDE: 'afterhide'\n};\n\n\n/**\n * Container orientation constants.\n * @enum {string}\n */\ngoog.ui.Container.Orientation = {\n  HORIZONTAL: 'horizontal',\n  VERTICAL: 'vertical'\n};\n\n\n/**\n * Allows an alternative element to be set to receive key events, otherwise\n * defers to the renderer's element choice.\n * @type {?Element|undefined}\n * @private\n */\ngoog.ui.Container.prototype.keyEventTarget_ = null;\n\n\n/**\n * Keyboard event handler.\n * @type {goog.events.KeyHandler?}\n * @private\n */\ngoog.ui.Container.prototype.keyHandler_ = null;\n\n\n/**\n * Renderer for the container.  Defaults to {@link goog.ui.ContainerRenderer}.\n * @type {goog.ui.ContainerRenderer?}\n * @private\n */\ngoog.ui.Container.prototype.renderer_ = null;\n\n\n/**\n * Container orientation; determines layout and default keyboard navigation.\n * @type {?goog.ui.Container.Orientation}\n * @private\n */\ngoog.ui.Container.prototype.orientation_ = null;\n\n\n/**\n * Whether the container is set to be visible.  Defaults to true.\n * @type {boolean}\n * @private\n */\ngoog.ui.Container.prototype.visible_ = true;\n\n\n/**\n * Whether the container is enabled and reacting to keyboard and mouse events.\n * Defaults to true.\n * @type {boolean}\n * @private\n */\ngoog.ui.Container.prototype.enabled_ = true;\n\n\n/**\n * Whether the container supports keyboard focus.  Defaults to true.  Focusable\n * containers have a `tabIndex` and can be navigated to via the keyboard.\n * @type {boolean}\n * @private\n */\ngoog.ui.Container.prototype.focusable_ = true;\n\n\n/**\n * The 0-based index of the currently highlighted control in the container\n * (-1 if none).\n * @type {number}\n * @private\n */\ngoog.ui.Container.prototype.highlightedIndex_ = -1;\n\n\n/**\n * The currently open (expanded) control in the container (null if none).\n * @type {goog.ui.Control?}\n * @private\n */\ngoog.ui.Container.prototype.openItem_ = null;\n\n\n/**\n * Whether the mouse button is held down.  Defaults to false.  This flag is set\n * when the user mouses down over the container, and remains set until they\n * release the mouse button.\n * @type {boolean}\n * @private\n */\ngoog.ui.Container.prototype.mouseButtonPressed_ = false;\n\n\n/**\n * Whether focus of child components should be allowed.  Only effective if\n * focusable_ is set to false.\n * @type {boolean}\n * @private\n */\ngoog.ui.Container.prototype.allowFocusableChildren_ = false;\n\n\n/**\n * Whether highlighting a child component should also open it.\n * @type {boolean}\n * @private\n */\ngoog.ui.Container.prototype.openFollowsHighlight_ = true;\n\n\n/**\n * Map of DOM IDs to child controls.  Each key is the DOM ID of a child\n * control's root element; each value is a reference to the child control\n * itself.  Used for looking up the child control corresponding to a DOM\n * node in O(1) time.\n * @type {?Object}\n * @private\n */\ngoog.ui.Container.prototype.childElementIdMap_ = null;\n\n\n// Event handler and renderer management.\n\n\n/**\n * Returns the DOM element on which the container is listening for keyboard\n * events (null if none).\n * @return {Element} Element on which the container is listening for key\n *     events.\n */\ngoog.ui.Container.prototype.getKeyEventTarget = function() {\n  // Delegate to renderer, unless we've set an explicit target.\n  return this.keyEventTarget_ || this.renderer_.getKeyEventTarget(this);\n};\n\n\n/**\n * Attaches an element on which to listen for key events.\n * @param {Element|undefined} element The element to attach, or null/undefined\n *     to attach to the default element.\n */\ngoog.ui.Container.prototype.setKeyEventTarget = function(element) {\n  if (this.focusable_) {\n    var oldTarget = this.getKeyEventTarget();\n    var inDocument = this.isInDocument();\n\n    this.keyEventTarget_ = element;\n    var newTarget = this.getKeyEventTarget();\n\n    if (inDocument) {\n      // Unlisten for events on the old key target.  Requires us to reset\n      // key target state temporarily.\n      this.keyEventTarget_ = oldTarget;\n      this.enableFocusHandling_(false);\n      this.keyEventTarget_ = element;\n\n      // Listen for events on the new key target.\n      this.getKeyHandler().attach(newTarget);\n      this.enableFocusHandling_(true);\n    }\n  } else {\n    throw new Error(\n        'Can\\'t set key event target for container ' +\n        'that doesn\\'t support keyboard focus!');\n  }\n};\n\n\n/**\n * Returns the keyboard event handler for this container, lazily created the\n * first time this method is called.  The keyboard event handler listens for\n * keyboard events on the container's key event target, as determined by its\n * renderer.\n * @return {!goog.events.KeyHandler} Keyboard event handler for this container.\n */\ngoog.ui.Container.prototype.getKeyHandler = function() {\n  return this.keyHandler_ ||\n      (this.keyHandler_ = new goog.events.KeyHandler(this.getKeyEventTarget()));\n};\n\n\n/**\n * Returns the renderer used by this container to render itself or to decorate\n * an existing element.\n * @return {goog.ui.ContainerRenderer} Renderer used by the container.\n */\ngoog.ui.Container.prototype.getRenderer = function() {\n  return this.renderer_;\n};\n\n\n/**\n * Registers the given renderer with the container.  Changing renderers after\n * the container has already been rendered or decorated is an error.\n * @param {goog.ui.ContainerRenderer} renderer Renderer used by the container.\n */\ngoog.ui.Container.prototype.setRenderer = function(renderer) {\n  if (this.getElement()) {\n    // Too late.\n    throw new Error(goog.ui.Component.Error.ALREADY_RENDERED);\n  }\n\n  this.renderer_ = renderer;\n};\n\n\n// Standard goog.ui.Component implementation.\n\n\n/**\n * Creates the container's DOM.\n * @override\n */\ngoog.ui.Container.prototype.createDom = function() {\n  // Delegate to renderer.\n  this.setElementInternal(this.renderer_.createDom(this));\n};\n\n\n/**\n * Returns the DOM element into which child components are to be rendered,\n * or null if the container itself hasn't been rendered yet.  Overrides\n * {@link goog.ui.Component#getContentElement} by delegating to the renderer.\n * @return {Element} Element to contain child elements (null if none).\n * @override\n */\ngoog.ui.Container.prototype.getContentElement = function() {\n  // Delegate to renderer.\n  return this.renderer_.getContentElement(this.getElement());\n};\n\n\n/**\n * Returns true if the given element can be decorated by this container.\n * Overrides {@link goog.ui.Component#canDecorate}.\n * @param {Element} element Element to decorate.\n * @return {boolean} True iff the element can be decorated.\n * @override\n */\ngoog.ui.Container.prototype.canDecorate = function(element) {\n  // Delegate to renderer.\n  return this.renderer_.canDecorate(element);\n};\n\n\n/**\n * Decorates the given element with this container. Overrides {@link\n * goog.ui.Component#decorateInternal}.  Considered protected.\n * @param {Element} element Element to decorate.\n * @override\n */\ngoog.ui.Container.prototype.decorateInternal = function(element) {\n  // Delegate to renderer.\n  this.setElementInternal(this.renderer_.decorate(this, element));\n  // Check whether the decorated element is explicitly styled to be invisible.\n  if (element.style.display == 'none') {\n    this.visible_ = false;\n  }\n};\n\n\n/**\n * Configures the container after its DOM has been rendered, and sets up event\n * handling.  Overrides {@link goog.ui.Component#enterDocument}.\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Container.prototype.enterDocument = function() {\n  goog.ui.Container.superClass_.enterDocument.call(this);\n\n  this.forEachChild(function(child) {\n    if (child.isInDocument()) {\n      this.registerChildId_(child);\n    }\n  }, this);\n\n  var elem = this.getElement();\n\n  // Call the renderer's initializeDom method to initialize the container's DOM.\n  this.renderer_.initializeDom(this);\n\n  // Initialize visibility (opt_force = true, so we don't dispatch events).\n  this.setVisible(this.visible_, true);\n\n  var MouseEventType = goog.ui.ComponentUtil.getMouseEventType(this);\n\n  // Handle events dispatched by child controls.\n  this.getHandler()\n      .listen(this, goog.ui.Component.EventType.ENTER, this.handleEnterItem)\n      .listen(\n          this, goog.ui.Component.EventType.HIGHLIGHT, this.handleHighlightItem)\n      .listen(\n          this, goog.ui.Component.EventType.UNHIGHLIGHT,\n          this.handleUnHighlightItem)\n      .listen(this, goog.ui.Component.EventType.OPEN, this.handleOpenItem)\n      .listen(this, goog.ui.Component.EventType.CLOSE, this.handleCloseItem)\n\n      // Handle mouse events.\n      .listen(elem, MouseEventType.MOUSEDOWN, this.handleMouseDown)\n      .listen(\n          goog.dom.getOwnerDocument(elem),\n          [MouseEventType.MOUSEUP, MouseEventType.MOUSECANCEL],\n          this.handleDocumentMouseUp)\n\n      // Handle mouse events on behalf of controls in the container.\n      .listen(\n          elem,\n          [\n            MouseEventType.MOUSEDOWN, MouseEventType.MOUSEUP,\n            MouseEventType.MOUSECANCEL, goog.events.EventType.MOUSEOVER,\n            goog.events.EventType.MOUSEOUT, goog.events.EventType.CONTEXTMENU\n          ],\n          this.handleChildMouseEvents);\n\n  if (this.pointerEventsEnabled()) {\n    // Prevent pointer events from capturing the target element so they behave\n    // more like mouse events.\n    this.getHandler().listen(\n        elem, goog.events.EventType.GOTPOINTERCAPTURE,\n        this.preventPointerCapture_);\n  }\n\n  // If the container is focusable, set up keyboard event handling.\n  if (this.isFocusable()) {\n    this.enableFocusHandling_(true);\n  }\n};\n\n\n/**\n * @param {!goog.events.BrowserEvent} e Event to handle.\n * @private\n */\ngoog.ui.Container.prototype.preventPointerCapture_ = function(e) {\n  var elem = /** @type {!Element} */ (e.target);\n  if (!!elem.releasePointerCapture) {\n    elem.releasePointerCapture(e.pointerId);\n  }\n};\n\n\n/**\n * Sets up listening for events applicable to focusable containers.\n * @param {boolean} enable Whether to enable or disable focus handling.\n * @private\n */\ngoog.ui.Container.prototype.enableFocusHandling_ = function(enable) {\n  var handler = this.getHandler();\n  var keyTarget = this.getKeyEventTarget();\n  if (enable) {\n    handler.listen(keyTarget, goog.events.EventType.FOCUS, this.handleFocus)\n        .listen(keyTarget, goog.events.EventType.BLUR, this.handleBlur)\n        .listen(\n            this.getKeyHandler(), goog.events.KeyHandler.EventType.KEY,\n            this.handleKeyEvent);\n  } else {\n    handler.unlisten(keyTarget, goog.events.EventType.FOCUS, this.handleFocus)\n        .unlisten(keyTarget, goog.events.EventType.BLUR, this.handleBlur)\n        .unlisten(\n            this.getKeyHandler(), goog.events.KeyHandler.EventType.KEY,\n            this.handleKeyEvent);\n  }\n};\n\n\n/**\n * Cleans up the container before its DOM is removed from the document, and\n * removes event handlers.  Overrides {@link goog.ui.Component#exitDocument}.\n * @override\n */\ngoog.ui.Container.prototype.exitDocument = function() {\n  // {@link #setHighlightedIndex} has to be called before\n  // {@link goog.ui.Component#exitDocument}, otherwise it has no effect.\n  this.setHighlightedIndex(-1);\n\n  if (this.openItem_) {\n    this.openItem_.setOpen(false);\n  }\n\n  this.mouseButtonPressed_ = false;\n\n  goog.ui.Container.superClass_.exitDocument.call(this);\n};\n\n\n/** @override */\ngoog.ui.Container.prototype.disposeInternal = function() {\n  goog.ui.Container.superClass_.disposeInternal.call(this);\n\n  if (this.keyHandler_) {\n    this.keyHandler_.dispose();\n    this.keyHandler_ = null;\n  }\n\n  this.keyEventTarget_ = null;\n  this.childElementIdMap_ = null;\n  this.openItem_ = null;\n  this.renderer_ = null;\n};\n\n\n// Default event handlers.\n\n\n/**\n * Handles ENTER events raised by child controls when they are navigated to.\n * @param {goog.events.Event} e ENTER event to handle.\n * @return {boolean} Whether to prevent handleMouseOver from handling\n *    the event.\n */\ngoog.ui.Container.prototype.handleEnterItem = function(e) {\n  // Allow the Control to highlight itself.\n  return true;\n};\n\n\n/**\n * Handles HIGHLIGHT events dispatched by items in the container when\n * they are highlighted.\n * @param {goog.events.Event} e Highlight event to handle.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Container.prototype.handleHighlightItem = function(e) {\n  var index = this.indexOfChild(/** @type {goog.ui.Control} */ (e.target));\n  if (index > -1 && index != this.highlightedIndex_) {\n    var item = this.getHighlighted();\n    if (item) {\n      // Un-highlight previously highlighted item.\n      item.setHighlighted(false);\n    }\n\n    this.highlightedIndex_ = index;\n    item = this.getHighlighted();\n\n    if (this.isMouseButtonPressed()) {\n      // Activate item when mouse button is pressed, to allow MacOS-style\n      // dragging to choose menu items.  Although this should only truly\n      // happen if the highlight is due to mouse movements, there is little\n      // harm in doing it for keyboard or programmatic highlights.\n      item.setActive(true);\n    }\n\n    // Update open item if open item needs follow highlight.\n    if (this.openFollowsHighlight_ && this.openItem_ &&\n        item != this.openItem_) {\n      if (item.isSupportedState(goog.ui.Component.State.OPENED)) {\n        item.setOpen(true);\n      } else {\n        this.openItem_.setOpen(false);\n      }\n    }\n  }\n\n  var element = this.getElement();\n  goog.asserts.assert(\n      element, 'The DOM element for the container cannot be null.');\n  if (e.target.getElement() != null) {\n    goog.a11y.aria.setState(\n        element, goog.a11y.aria.State.ACTIVEDESCENDANT,\n        e.target.getElement().id);\n  }\n};\n\n\n/**\n * Handles UNHIGHLIGHT events dispatched by items in the container when\n * they are unhighlighted.\n * @param {goog.events.Event} e Unhighlight event to handle.\n */\ngoog.ui.Container.prototype.handleUnHighlightItem = function(e) {\n  if (e.target == this.getHighlighted()) {\n    this.highlightedIndex_ = -1;\n  }\n  var element = this.getElement();\n  goog.asserts.assert(\n      element, 'The DOM element for the container cannot be null.');\n  // Setting certain ARIA attributes to empty strings is problematic.\n  // Just remove the attribute instead.\n  goog.a11y.aria.removeState(element, goog.a11y.aria.State.ACTIVEDESCENDANT);\n};\n\n\n/**\n * Handles OPEN events dispatched by items in the container when they are\n * opened.\n * @param {goog.events.Event} e Open event to handle.\n */\ngoog.ui.Container.prototype.handleOpenItem = function(e) {\n  var item = /** @type {goog.ui.Control} */ (e.target);\n  if (item && item != this.openItem_ && item.getParent() == this) {\n    if (this.openItem_) {\n      this.openItem_.setOpen(false);\n    }\n    this.openItem_ = item;\n  }\n};\n\n\n/**\n * Handles CLOSE events dispatched by items in the container when they are\n * closed.\n * @param {goog.events.Event} e Close event to handle.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Container.prototype.handleCloseItem = function(e) {\n  if (e.target == this.openItem_) {\n    this.openItem_ = null;\n  }\n\n  var element = this.getElement();\n  var targetEl = e.target.getElement();\n  // Set the active descendant to the menu item when its submenu is closed and\n  // it is still highlighted. This can sometimes be called when the menuitem is\n  // unhighlighted because the focus moved elsewhere, do nothing at that point.\n  if (element && e.target.isHighlighted() && targetEl) {\n    goog.a11y.aria.setActiveDescendant(element, targetEl);\n  }\n};\n\n\n/**\n * Handles mousedown events over the container.  The default implementation\n * sets the \"mouse button pressed\" flag and, if the container is focusable,\n * grabs keyboard focus.\n * @param {goog.events.BrowserEvent} e Mousedown event to handle.\n */\ngoog.ui.Container.prototype.handleMouseDown = function(e) {\n  if (this.enabled_) {\n    this.setMouseButtonPressed(true);\n  }\n\n  var keyTarget = this.getKeyEventTarget();\n  if (keyTarget && goog.dom.isFocusableTabIndex(keyTarget)) {\n    // The container is configured to receive keyboard focus.\n    keyTarget.focus();\n  } else {\n    // The control isn't configured to receive keyboard focus; prevent it\n    // from stealing focus or destroying the selection.\n    e.preventDefault();\n  }\n};\n\n\n/**\n * Handles mouseup events over the document.  The default implementation\n * clears the \"mouse button pressed\" flag.\n * @param {goog.events.BrowserEvent} e Mouseup event to handle.\n */\ngoog.ui.Container.prototype.handleDocumentMouseUp = function(e) {\n  this.setMouseButtonPressed(false);\n};\n\n\n/**\n * Handles mouse events originating from nodes belonging to the controls hosted\n * in the container.  Locates the child control based on the DOM node that\n * dispatched the event, and forwards the event to the control for handling.\n * @param {goog.events.BrowserEvent} e Mouse event to handle.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Container.prototype.handleChildMouseEvents = function(e) {\n  var MouseEventType = goog.ui.ComponentUtil.getMouseEventType(this);\n\n  var control = this.getOwnerControl(/** @type {Node} */ (e.target));\n  if (control) {\n    // Child control identified; forward the event.\n    switch (e.type) {\n      case MouseEventType.MOUSEDOWN:\n        control.handleMouseDown(e);\n        break;\n      case MouseEventType.MOUSEUP:\n      case MouseEventType.MOUSECANCEL:\n        control.handleMouseUp(e);\n        break;\n      case goog.events.EventType.MOUSEOVER:\n        control.handleMouseOver(e);\n        break;\n      case goog.events.EventType.MOUSEOUT:\n        control.handleMouseOut(e);\n        break;\n      case goog.events.EventType.CONTEXTMENU:\n        control.handleContextMenu(e);\n        break;\n    }\n  }\n};\n\n\n/**\n * Returns the child control that owns the given DOM node, or null if no such\n * control is found.\n * @param {Node} node DOM node whose owner is to be returned.\n * @return {goog.ui.Control?} Control hosted in the container to which the node\n *     belongs (if found).\n * @protected\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Container.prototype.getOwnerControl = function(node) {\n  // Ensure that this container actually has child controls before\n  // looking up the owner.\n  if (this.childElementIdMap_) {\n    var elem = this.getElement();\n    // See http://b/2964418 . IE9 appears to evaluate '!=' incorrectly, so\n    // using '!==' instead.\n    // TODO(user): Possibly revert this change if/when IE9 fixes the issue.\n    while (node && node !== elem) {\n      var id = node.id;\n      if (id in this.childElementIdMap_) {\n        return this.childElementIdMap_[id];\n      }\n      node = node.parentNode;\n    }\n  }\n  return null;\n};\n\n\n/**\n * Handles focus events raised when the container's key event target receives\n * keyboard focus.\n * @param {goog.events.BrowserEvent} e Focus event to handle.\n */\ngoog.ui.Container.prototype.handleFocus = function(e) {\n  // No-op in the base class.\n};\n\n\n/**\n * Handles blur events raised when the container's key event target loses\n * keyboard focus.  The default implementation clears the highlight index.\n * @param {goog.events.BrowserEvent} e Blur event to handle.\n */\ngoog.ui.Container.prototype.handleBlur = function(e) {\n  this.setHighlightedIndex(-1);\n  this.setMouseButtonPressed(false);\n  // If the container loses focus, and one of its children is open, close it.\n  if (this.openItem_) {\n    this.openItem_.setOpen(false);\n  }\n};\n\n\n/**\n * Attempts to handle a keyboard event, if the control is enabled, by calling\n * {@link handleKeyEventInternal}.  Considered protected; should only be used\n * within this package and by subclasses.\n * @param {goog.events.KeyEvent} e Key event to handle.\n * @return {boolean} Whether the key event was handled.\n */\ngoog.ui.Container.prototype.handleKeyEvent = function(e) {\n  if (this.isEnabled() && this.isVisible() &&\n      (this.getChildCount() != 0 || this.keyEventTarget_) &&\n      this.handleKeyEventInternal(e)) {\n    e.preventDefault();\n    e.stopPropagation();\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Attempts to handle a keyboard event; returns true if the event was handled,\n * false otherwise.  If the container is enabled, and a child is highlighted,\n * calls the child control's `handleKeyEvent` method to give the control\n * a chance to handle the event first.\n * @param {goog.events.KeyEvent} e Key event to handle.\n * @return {boolean} Whether the event was handled by the container (or one of\n *     its children).\n */\ngoog.ui.Container.prototype.handleKeyEventInternal = function(e) {\n  // Give the highlighted control the chance to handle the key event.\n  var highlighted = this.getHighlighted();\n  if (highlighted && typeof highlighted.handleKeyEvent == 'function' &&\n      highlighted.handleKeyEvent(e)) {\n    return true;\n  }\n\n  // Give the open control the chance to handle the key event.\n  if (this.openItem_ && this.openItem_ != highlighted &&\n      typeof this.openItem_.handleKeyEvent == 'function' &&\n      this.openItem_.handleKeyEvent(e)) {\n    return true;\n  }\n\n  // Do not handle the key event if any modifier key is pressed.\n  if (e.shiftKey || e.ctrlKey || e.metaKey || e.altKey) {\n    return false;\n  }\n\n  // Either nothing is highlighted, or the highlighted control didn't handle\n  // the key event, so attempt to handle it here.\n  switch (e.keyCode) {\n    case goog.events.KeyCodes.ESC:\n      if (this.isFocusable()) {\n        this.getKeyEventTarget().blur();\n      } else {\n        return false;\n      }\n      break;\n\n    case goog.events.KeyCodes.HOME:\n      this.highlightFirst();\n      break;\n\n    case goog.events.KeyCodes.END:\n      this.highlightLast();\n      break;\n\n    case goog.events.KeyCodes.UP:\n      if (this.orientation_ == goog.ui.Container.Orientation.VERTICAL) {\n        this.highlightPrevious();\n      } else {\n        return false;\n      }\n      break;\n\n    case goog.events.KeyCodes.LEFT:\n      if (this.orientation_ == goog.ui.Container.Orientation.HORIZONTAL) {\n        if (this.isRightToLeft()) {\n          this.highlightNext();\n        } else {\n          this.highlightPrevious();\n        }\n      } else {\n        return false;\n      }\n      break;\n\n    case goog.events.KeyCodes.DOWN:\n      if (this.orientation_ == goog.ui.Container.Orientation.VERTICAL) {\n        this.highlightNext();\n      } else {\n        return false;\n      }\n      break;\n\n    case goog.events.KeyCodes.RIGHT:\n      if (this.orientation_ == goog.ui.Container.Orientation.HORIZONTAL) {\n        if (this.isRightToLeft()) {\n          this.highlightPrevious();\n        } else {\n          this.highlightNext();\n        }\n      } else {\n        return false;\n      }\n      break;\n\n    default:\n      return false;\n  }\n\n  return true;\n};\n\n\n// Child component management.\n\n\n/**\n * Creates a DOM ID for the child control and registers it to an internal\n * hash table to be able to find it fast by id.\n * @param {goog.ui.Component} child The child control. Its root element has\n *     to be created yet.\n * @private\n */\ngoog.ui.Container.prototype.registerChildId_ = function(child) {\n  // Map the DOM ID of the control's root element to the control itself.\n  var childElem = child.getElement();\n\n  // If the control's root element doesn't have a DOM ID assign one.\n  var id = childElem.id || (childElem.id = child.getId());\n\n  // Lazily create the child element ID map on first use.\n  if (!this.childElementIdMap_) {\n    this.childElementIdMap_ = {};\n  }\n  this.childElementIdMap_[id] = child;\n};\n\n\n/**\n * Adds the specified control as the last child of this container.  See\n * {@link goog.ui.Container#addChildAt} for detailed semantics.\n * @param {goog.ui.Component} child The new child control.\n * @param {boolean=} opt_render Whether the new child should be rendered\n *     immediately after being added (defaults to false).\n * @override\n */\ngoog.ui.Container.prototype.addChild = function(child, opt_render) {\n  goog.asserts.assertInstanceof(\n      child, goog.ui.Control, 'The child of a container must be a control');\n  goog.ui.Container.superClass_.addChild.call(this, child, opt_render);\n};\n\n\n/**\n * Overrides {@link goog.ui.Container#getChild} to make it clear that it\n * only returns {@link goog.ui.Control}s.\n * @param {string} id Child component ID.\n * @return {goog.ui.Control} The child with the given ID; null if none.\n * @override\n */\ngoog.ui.Container.prototype.getChild;\n\n\n/**\n * Overrides {@link goog.ui.Container#getChildAt} to make it clear that it\n * only returns {@link goog.ui.Control}s.\n * @param {number} index 0-based index.\n * @return {goog.ui.Control} The child with the given ID; null if none.\n * @override\n */\ngoog.ui.Container.prototype.getChildAt;\n\n\n/**\n * Adds the control as a child of this container at the given 0-based index.\n * Overrides {@link goog.ui.Component#addChildAt} by also updating the\n * container's highlight index.  Since {@link goog.ui.Component#addChild} uses\n * {@link #addChildAt} internally, we only need to override this method.\n * @param {goog.ui.Component} control New child.\n * @param {number} index Index at which the new child is to be added.\n * @param {boolean=} opt_render Whether the new child should be rendered\n *     immediately after being added (defaults to false).\n * @override\n */\ngoog.ui.Container.prototype.addChildAt = function(control, index, opt_render) {\n  goog.asserts.assertInstanceof(control, goog.ui.Control);\n\n  // Make sure the child control dispatches HIGHLIGHT, UNHIGHLIGHT, OPEN, and\n  // CLOSE events, and that it doesn't steal keyboard focus.\n  control.setDispatchTransitionEvents(goog.ui.Component.State.HOVER, true);\n  control.setDispatchTransitionEvents(goog.ui.Component.State.OPENED, true);\n  if (this.isFocusable() || !this.isFocusableChildrenAllowed()) {\n    control.setSupportedState(goog.ui.Component.State.FOCUSED, false);\n  }\n\n  // Disable mouse event handling by child controls.\n  control.setHandleMouseEvents(false);\n\n  var srcIndex =\n      (control.getParent() == this) ? this.indexOfChild(control) : -1;\n\n  // Let the superclass implementation do the work.\n  goog.ui.Container.superClass_.addChildAt.call(\n      this, control, index, opt_render);\n\n  if (control.isInDocument() && this.isInDocument()) {\n    this.registerChildId_(control);\n  }\n\n  this.updateHighlightedIndex_(srcIndex, index);\n};\n\n\n/**\n * Updates the highlighted index when children are added or moved.\n * @param {number} fromIndex Index of the child before it was moved, or -1 if\n *     the child was added.\n * @param {number} toIndex Index of the child after it was moved or added.\n * @private\n */\ngoog.ui.Container.prototype.updateHighlightedIndex_ = function(\n    fromIndex, toIndex) {\n  if (fromIndex == -1) {\n    fromIndex = this.getChildCount();\n  }\n  if (fromIndex == this.highlightedIndex_) {\n    // The highlighted element itself was moved.\n    this.highlightedIndex_ = Math.min(this.getChildCount() - 1, toIndex);\n  } else if (\n      fromIndex > this.highlightedIndex_ && toIndex <= this.highlightedIndex_) {\n    // The control was added or moved behind the highlighted index.\n    this.highlightedIndex_++;\n  } else if (\n      fromIndex < this.highlightedIndex_ && toIndex > this.highlightedIndex_) {\n    // The control was moved from before to behind the highlighted index.\n    this.highlightedIndex_--;\n  }\n};\n\n\n/**\n * Removes a child control.  Overrides {@link goog.ui.Component#removeChild} by\n * updating the highlight index.  Since {@link goog.ui.Component#removeChildAt}\n * uses {@link #removeChild} internally, we only need to override this method.\n * @param {string|goog.ui.Component} control The ID of the child to remove, or\n *     the control itself.\n * @param {boolean=} opt_unrender Whether to call `exitDocument` on the\n *     removed control, and detach its DOM from the document (defaults to\n *     false).\n * @return {goog.ui.Control} The removed control, if any.\n * @override\n */\ngoog.ui.Container.prototype.removeChild = function(control, opt_unrender) {\n  control = (typeof control === 'string') ? this.getChild(control) : control;\n  goog.asserts.assertInstanceof(control, goog.ui.Control);\n\n  if (control) {\n    var index = this.indexOfChild(control);\n    if (index != -1) {\n      if (index == this.highlightedIndex_) {\n        control.setHighlighted(false);\n        this.highlightedIndex_ = -1;\n      } else if (index < this.highlightedIndex_) {\n        this.highlightedIndex_--;\n      }\n    }\n\n    // Remove the mapping from the child element ID map.\n    var childElem = control.getElement();\n    if (childElem && childElem.id && this.childElementIdMap_) {\n      goog.object.remove(this.childElementIdMap_, childElem.id);\n    }\n  }\n\n  control = /** @type {!goog.ui.Control} */ (\n      goog.ui.Container.superClass_.removeChild.call(\n          this, control, opt_unrender));\n\n  // Re-enable mouse event handling (in case the control is reused elsewhere).\n  control.setHandleMouseEvents(true);\n\n  return control;\n};\n\n\n// Container state management.\n\n\n/**\n * Returns the container's orientation.\n * @return {?goog.ui.Container.Orientation} Container orientation.\n */\ngoog.ui.Container.prototype.getOrientation = function() {\n  return this.orientation_;\n};\n\n\n/**\n * Sets the container's orientation.\n * @param {goog.ui.Container.Orientation} orientation Container orientation.\n */\n// TODO(attila): Do we need to support containers with dynamic orientation?\ngoog.ui.Container.prototype.setOrientation = function(orientation) {\n  if (this.getElement()) {\n    // Too late.\n    throw new Error(goog.ui.Component.Error.ALREADY_RENDERED);\n  }\n\n  this.orientation_ = orientation;\n};\n\n\n/**\n * Returns true if the container's visibility is set to visible, false if\n * it is set to hidden.  A container that is set to hidden is guaranteed\n * to be hidden from the user, but the reverse isn't necessarily true.\n * A container may be set to visible but can otherwise be obscured by another\n * element, rendered off-screen, or hidden using direct CSS manipulation.\n * @return {boolean} Whether the container is set to be visible.\n */\ngoog.ui.Container.prototype.isVisible = function() {\n  return this.visible_;\n};\n\n\n/**\n * Shows or hides the container.  Does nothing if the container already has\n * the requested visibility.  Otherwise, dispatches a SHOW or HIDE event as\n * appropriate, giving listeners a chance to prevent the visibility change.\n * @param {boolean} visible Whether to show or hide the container.\n * @param {boolean=} opt_force If true, doesn't check whether the container\n *     already has the requested visibility, and doesn't dispatch any events.\n * @return {boolean} Whether the visibility was changed.\n */\ngoog.ui.Container.prototype.setVisible = function(visible, opt_force) {\n  if (opt_force || (this.visible_ != visible &&\n                    this.dispatchEvent(\n                        visible ? goog.ui.Component.EventType.SHOW :\n                                  goog.ui.Component.EventType.HIDE))) {\n    this.visible_ = visible;\n\n    var elem = this.getElement();\n    if (elem) {\n      goog.style.setElementShown(elem, visible);\n      if (this.isFocusable()) {\n        // Enable keyboard access only for enabled & visible containers.\n        this.renderer_.enableTabIndex(\n            this.getKeyEventTarget(), this.enabled_ && this.visible_);\n      }\n      if (!opt_force) {\n        this.dispatchEvent(\n            this.visible_ ? goog.ui.Container.EventType.AFTER_SHOW :\n                            goog.ui.Container.EventType.AFTER_HIDE);\n      }\n    }\n\n    return true;\n  }\n\n  return false;\n};\n\n\n/**\n * Returns true if the container is enabled, false otherwise.\n * @return {boolean} Whether the container is enabled.\n */\ngoog.ui.Container.prototype.isEnabled = function() {\n  return this.enabled_;\n};\n\n\n/**\n * Enables/disables the container based on the `enable` argument.\n * Dispatches an `ENABLED` or `DISABLED` event prior to changing\n * the container's state, which may be caught and canceled to prevent the\n * container from changing state.  Also enables/disables child controls.\n * @param {boolean} enable Whether to enable or disable the container.\n */\ngoog.ui.Container.prototype.setEnabled = function(enable) {\n  if (this.enabled_ != enable &&\n      this.dispatchEvent(\n          enable ? goog.ui.Component.EventType.ENABLE :\n                   goog.ui.Component.EventType.DISABLE)) {\n    if (enable) {\n      // Flag the container as enabled first, then update children.  This is\n      // because controls can't be enabled if their parent is disabled.\n      this.enabled_ = true;\n      this.forEachChild(function(child) {\n        // Enable child control unless it is flagged.\n        if (child.wasDisabled) {\n          delete child.wasDisabled;\n        } else {\n          child.setEnabled(true);\n        }\n      });\n    } else {\n      // Disable children first, then flag the container as disabled.  This is\n      // because controls can't be disabled if their parent is already disabled.\n      this.forEachChild(function(child) {\n        // Disable child control, or flag it if it's already disabled.\n        if (child.isEnabled()) {\n          child.setEnabled(false);\n        } else {\n          child.wasDisabled = true;\n        }\n      });\n      this.enabled_ = false;\n      this.setMouseButtonPressed(false);\n    }\n\n    if (this.isFocusable()) {\n      // Enable keyboard access only for enabled & visible components.\n      this.renderer_.enableTabIndex(\n          this.getKeyEventTarget(), enable && this.visible_);\n    }\n  }\n};\n\n\n/**\n * Returns true if the container is focusable, false otherwise.  The default\n * is true.  Focusable containers always have a tab index and allocate a key\n * handler to handle keyboard events while focused.\n * @return {boolean} Whether the component is focusable.\n */\ngoog.ui.Container.prototype.isFocusable = function() {\n  return this.focusable_;\n};\n\n\n/**\n * Sets whether the container is focusable.  The default is true.  Focusable\n * containers always have a tab index and allocate a key handler to handle\n * keyboard events while focused.\n * @param {boolean} focusable Whether the component is to be focusable.\n */\ngoog.ui.Container.prototype.setFocusable = function(focusable) {\n  if (focusable != this.focusable_ && this.isInDocument()) {\n    this.enableFocusHandling_(focusable);\n  }\n  this.focusable_ = focusable;\n  if (this.enabled_ && this.visible_) {\n    this.renderer_.enableTabIndex(this.getKeyEventTarget(), focusable);\n  }\n};\n\n\n/**\n * Returns true if the container allows children to be focusable, false\n * otherwise.  Only effective if the container is not focusable.\n * @return {boolean} Whether children should be focusable.\n */\ngoog.ui.Container.prototype.isFocusableChildrenAllowed = function() {\n  return this.allowFocusableChildren_;\n};\n\n\n/**\n * Sets whether the container allows children to be focusable, false\n * otherwise.  Only effective if the container is not focusable.\n * @param {boolean} focusable Whether the children should be focusable.\n */\ngoog.ui.Container.prototype.setFocusableChildrenAllowed = function(focusable) {\n  this.allowFocusableChildren_ = focusable;\n};\n\n\n/**\n * @return {boolean} Whether highlighting a child component should also open it.\n */\ngoog.ui.Container.prototype.isOpenFollowsHighlight = function() {\n  return this.openFollowsHighlight_;\n};\n\n\n/**\n * Sets whether highlighting a child component should also open it.\n * @param {boolean} follow Whether highlighting a child component also opens it.\n */\ngoog.ui.Container.prototype.setOpenFollowsHighlight = function(follow) {\n  this.openFollowsHighlight_ = follow;\n};\n\n\n// Highlight management.\n\n\n/**\n * Returns the index of the currently highlighted item (-1 if none).\n * @return {number} Index of the currently highlighted item.\n */\ngoog.ui.Container.prototype.getHighlightedIndex = function() {\n  return this.highlightedIndex_;\n};\n\n\n/**\n * Highlights the item at the given 0-based index (if any).  If another item\n * was previously highlighted, it is un-highlighted.\n * @param {number} index Index of item to highlight (-1 removes the current\n *     highlight).\n */\ngoog.ui.Container.prototype.setHighlightedIndex = function(index) {\n  var child = this.getChildAt(index);\n  if (child) {\n    child.setHighlighted(true);\n  } else if (this.highlightedIndex_ > -1) {\n    this.getHighlighted().setHighlighted(false);\n  }\n};\n\n\n/**\n * Highlights the given item if it exists and is a child of the container;\n * otherwise un-highlights the currently highlighted item.\n * @param {goog.ui.Control} item Item to highlight.\n */\ngoog.ui.Container.prototype.setHighlighted = function(item) {\n  this.setHighlightedIndex(this.indexOfChild(item));\n};\n\n\n/**\n * Returns the currently highlighted item (if any).\n * @return {goog.ui.Control?} Highlighted item (null if none).\n */\ngoog.ui.Container.prototype.getHighlighted = function() {\n  return this.getChildAt(this.highlightedIndex_);\n};\n\n\n/**\n * Highlights the first highlightable item in the container\n */\ngoog.ui.Container.prototype.highlightFirst = function() {\n  this.highlightHelper(function(index, max) {\n    return (index + 1) % max;\n  }, this.getChildCount() - 1);\n};\n\n\n/**\n * Highlights the last highlightable item in the container.\n */\ngoog.ui.Container.prototype.highlightLast = function() {\n  this.highlightHelper(function(index, max) {\n    index--;\n    return index < 0 ? max - 1 : index;\n  }, 0);\n};\n\n\n/**\n * Highlights the next highlightable item (or the first if nothing is currently\n * highlighted).\n */\ngoog.ui.Container.prototype.highlightNext = function() {\n  this.highlightHelper(function(index, max) {\n    return (index + 1) % max;\n  }, this.highlightedIndex_);\n};\n\n\n/**\n * Highlights the previous highlightable item (or the last if nothing is\n * currently highlighted).\n */\ngoog.ui.Container.prototype.highlightPrevious = function() {\n  this.highlightHelper(function(index, max) {\n    index--;\n    return index < 0 ? max - 1 : index;\n  }, this.highlightedIndex_);\n};\n\n\n/**\n * Helper function that manages the details of moving the highlight among\n * child controls in response to keyboard events.\n * @param {function(this: goog.ui.Container, number, number) : number} fn\n *     Function that accepts the current and maximum indices, and returns the\n *     next index to check.\n * @param {number} startIndex Start index.\n * @return {boolean} Whether the highlight has changed.\n * @protected\n */\ngoog.ui.Container.prototype.highlightHelper = function(fn, startIndex) {\n  // If the start index is -1 (meaning there's nothing currently highlighted),\n  // try starting from the currently open item, if any.\n  var curIndex =\n      startIndex < 0 ? this.indexOfChild(this.openItem_) : startIndex;\n  var numItems = this.getChildCount();\n\n  curIndex = fn.call(this, curIndex, numItems);\n  var visited = 0;\n  while (visited <= numItems) {\n    var control = this.getChildAt(curIndex);\n    if (control && this.canHighlightItem(control)) {\n      this.setHighlightedIndexFromKeyEvent(curIndex);\n      return true;\n    }\n    visited++;\n    curIndex = fn.call(this, curIndex, numItems);\n  }\n  return false;\n};\n\n\n/**\n * Returns whether the given item can be highlighted.\n * @param {goog.ui.Control} item The item to check.\n * @return {boolean} Whether the item can be highlighted.\n * @protected\n */\ngoog.ui.Container.prototype.canHighlightItem = function(item) {\n  return item.isVisible() && item.isEnabled() &&\n      item.isSupportedState(goog.ui.Component.State.HOVER);\n};\n\n\n/**\n * Helper method that sets the highlighted index to the given index in response\n * to a keyboard event.  The base class implementation simply calls the\n * {@link #setHighlightedIndex} method, but subclasses can override this\n * behavior as needed.\n * @param {number} index Index of item to highlight.\n * @protected\n */\ngoog.ui.Container.prototype.setHighlightedIndexFromKeyEvent = function(index) {\n  this.setHighlightedIndex(index);\n};\n\n\n/**\n * Returns the currently open (expanded) control in the container (null if\n * none).\n * @return {goog.ui.Control?} The currently open control.\n */\ngoog.ui.Container.prototype.getOpenItem = function() {\n  return this.openItem_;\n};\n\n\n/**\n * Returns true if the mouse button is pressed, false otherwise.\n * @return {boolean} Whether the mouse button is pressed.\n */\ngoog.ui.Container.prototype.isMouseButtonPressed = function() {\n  return this.mouseButtonPressed_;\n};\n\n\n/**\n * Sets or clears the \"mouse button pressed\" flag.\n * @param {boolean} pressed Whether the mouse button is presed.\n */\ngoog.ui.Container.prototype.setMouseButtonPressed = function(pressed) {\n  this.mouseButtonPressed_ = pressed;\n};\n","^?",1579837703000,"^@",["^A",["^1J","^14","^53","^3W","^1B","~$goog.ui.ComponentUtil","^3Z","^3","^21","^1C","~$goog.ui.Control","^41","^2Y","^45"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/container.js"],"^S",["^A",["^55","~$goog.ui.Container.EventType","~$goog.ui.Container.Orientation"]],"^1",true,"^2",["^3","^3W","^41","^1J","^14","^1C","^45","^3Z","^21","^2Y","^1B","^T4","^53","^T5"]],["^ ","^7",[1579837703000],"^8","goog.labs.net.image.js","^9",["^:","goog/labs/net/image.js"],"^;","goog/labs/net/image.js","^<","^=","^>","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Simple image loader, used for preloading.\n * @author nnaze@google.com (Nathan Naze)\n */\n\ngoog.provide('goog.labs.net.image');\n\ngoog.require('goog.Promise');\ngoog.require('goog.dom.safe');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.html.SafeUrl');\ngoog.require('goog.net.EventType');\ngoog.require('goog.userAgent');\n\n\n/**\n * Loads a single image.  Useful for preloading images.\n *\n * @param {!goog.html.SafeUrl|string} uri URI of the image.\n * @param {(!Image|function(): !Image)=} opt_image If present, instead of\n *     creating a new Image instance the function will use the passed Image\n *     instance or the result of calling the Image factory respectively. This\n *     can be used to control exactly how Image instances are created, for\n *     example if they should be created in a particular document element, or\n *     have fields that will trigger CORS image fetches.\n * @return {!goog.Promise<!Image>} A Promise that will be resolved with the\n *     given image if the image successfully loads.\n */\ngoog.labs.net.image.load = function(uri, opt_image) {\n  return new goog.Promise(/** @suppress {strictPrimitiveOperators} Part of the go/strict_warnings_migration */\n                          function(resolve, reject) {\n    var image;\n    if (opt_image === undefined) {\n      image = new Image();\n    } else if (goog.isFunction(opt_image)) {\n      image = opt_image();\n    } else {\n      image = opt_image;\n    }\n\n    // IE's load event on images can be buggy.  For older browsers, wait for\n    // readystatechange events and check if readyState is 'complete'.\n    // See:\n    // http://msdn.microsoft.com/en-us/library/ie/ms536957(v=vs.85).aspx\n    // http://msdn.microsoft.com/en-us/library/ie/ms534359(v=vs.85).aspx\n    //\n    // Starting with IE11, start using standard 'load' events.\n    // See:\n    // http://msdn.microsoft.com/en-us/library/ie/dn467845(v=vs.85).aspx\n    var loadEvent = (goog.userAgent.IE && goog.userAgent.VERSION < 11) ?\n        goog.net.EventType.READY_STATE_CHANGE :\n        goog.events.EventType.LOAD;\n\n    var handler = new goog.events.EventHandler();\n    handler.listen(\n        image, [loadEvent, goog.net.EventType.ABORT, goog.net.EventType.ERROR],\n        function(e) {\n\n          // We only registered listeners for READY_STATE_CHANGE for IE.\n          // If readyState is now COMPLETE, the image has loaded.\n          // See related comment above.\n          if (e.type == goog.net.EventType.READY_STATE_CHANGE &&\n              image.readyState != goog.net.EventType.COMPLETE) {\n            return;\n          }\n\n          // At this point, we know whether the image load was successful\n          // and no longer care about image events.\n          goog.dispose(handler);\n\n          // Whether the image successfully loaded.\n          if (e.type == loadEvent) {\n            resolve(image);\n          } else {\n            reject(null);\n          }\n        });\n\n    // Initiate the image request.\n    goog.dom.safe.setImageSrc(image, uri);\n  });\n};\n","^?",1579837703000,"^@",["^A",["^2R","^15","^3","^18","^4F","^1C","~$goog.Promise","^1;"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/image.js"],"^S",["^A",["~$goog.labs.net.image"]],"^1",true,"^2",["^3","^T8","^1;","^2R","^1C","^15","^4F","^18"]],["^ ","^7",[1579837703000],"^1=",true,"^8","goog.streams.full_types.js","^9",["^:","goog/streams/full_types.js"],"^;","goog/streams/full_types.js","^<","^=","^>","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Types provided by the full implementation. DO NOT WRITE\n * IMPLEMANTATIONS OF THE INTERFACES PROVIDED HERE. These exist to provide\n * a super type for the native-wrapped impl and the ponyfill impl.\n */\ngoog.module('goog.streams.fullTypes');\n\nconst liteTypes = goog.require('goog.streams.liteTypes');\n\n/**\n * The underlying source for a ReadableStream.\n * @template T\n * @record\n * @extends {liteTypes.ReadableStreamUnderlyingSource}\n */\nclass ReadableStreamUnderlyingSource {\n  constructor() {\n    /**\n     * A pull method that is called when the ReadableStream's internal queue\n     * becomes not full.\n     * @type {(function(!ReadableStreamDefaultController<T>):\n     *     (!Promise<undefined>|undefined))|undefined}\n     */\n    this.pull;\n\n    /**\n     * Called when the ReadableStream is cancelled.\n     * @type {(function(*): (!Promise<undefined>|undefined))|undefined}\n     */\n    this.cancel;\n  }\n}\n\n/**\n * The strategy for the ReadableStream queue.\n * @template T\n * @record\n */\nclass ReadableStreamStrategy {\n  constructor() {\n    /**\n     * A sizing algorithm that takes a chunk of the ReadableStream and returns\n     * a size.\n     * https://streams.spec.whatwg.org/#qs-api\n     * @type {(function(T): number)|undefined}\n     */\n    this.size;\n\n    /**\n     * Used to calculate the desired size of the ReadableStream. The high-water\n     * mark minus the sum of the sizes of chunks currently in the queue is the\n     * desired size.\n     * https://streams.spec.whatwg.org/#qs-api\n     * @type {number|undefined}\n     */\n    this.highWaterMark;\n  }\n}\n\n/**\n * The implemenation of ReadableStream.\n * @template T\n * @interface\n * @extends {liteTypes.ReadableStream<T>}\n * @extends {AsyncIterable<T>}\n */\nclass ReadableStream {\n  /**\n   * Returns a ReadableStreamDefaultReader that enables reading chunks from\n   * the source.\n   * https://streams.spec.whatwg.org/#rs-get-reader\n   * @return {!ReadableStreamDefaultReader<T>}\n   * @override\n   */\n  getReader() {}\n\n  /**\n   * Cancels the ReadableStream with an optional reason.\n   * https://streams.spec.whatwg.org/#rs-cancel\n   * @param {*} reason\n   * @return {!Promise<undefined>}\n   */\n  cancel(reason) {}\n\n  /**\n   * Returns an AyncIterator over the ReadableStream.\n   *\n   * If preventCancel is passed as an option, calling the return() method on the\n   * iterator will terminate the iterator, but will not cancel the\n   * ReadableStream.\n   * https://streams.spec.whatwg.org/#rs-get-iterator\n   * @param {{preventCancel: boolean}=} options\n   * @return {!AsyncIterator<T>}\n   */\n  getIterator({preventCancel = false} = {}) {}\n\n  /**\n   * Returns an Array with two elements, both new ReadableStreams that contain\n   * the same data as this ReadableStream. This stream will become permanently\n   * locked.\n   * https://streams.spec.whatwg.org/#rs-tee\n   * @return {!Array<!ReadableStream>}\n   */\n  tee() {}\n\n  /**\n   * https://streams.spec.whatwg.org/#rs-asynciterator\n   * @param {{preventCancel: boolean}=} options\n   * @return {!AsyncIterator<T>}\n   */\n  [Symbol.asyncIterator]({preventCancel = false} = {}) {}\n}\n\n/**\n * The DefaultReader for a ReadableStream.\n * @template T\n * @interface\n * @extends {liteTypes.ReadableStreamDefaultReader<T>}\n */\nclass ReadableStreamDefaultReader {\n  /**\n   * Cancels the ReadableStream with an optional reason.\n   * https://streams.spec.whatwg.org/#default-reader-cancel\n   * @param {*} reason\n   * @return {!Promise<undefined>}\n   */\n  cancel(reason) {}\n}\n\n/**\n * @template T\n * @interface\n * @extends {AsyncIterator<T>}\n */\nclass ReadableStreamAsyncIterator {\n  /**\n   * Gets the next value from the ReadableStream.\n   * https://streams.spec.whatwg.org/#rs-asynciterator-prototype-next\n   * @override\n   */\n  next() {}\n\n  /**\n   * Cancels the underlying stream and resolves with the value.\n   * @param {*} value\n   * @return {!Promise<!IIterableResult<T>>}\n   */\n  return(value) {}\n}\n\n/**\n * The controller for a ReadableStream. Adds cancellation and backpressure.\n * @template T\n * @interface\n * @extends {liteTypes.ReadableStreamDefaultController<T>}\n */\nclass ReadableStreamDefaultController {\n  constructor() {\n    /**\n     * The desired size to fill the controlled stream's internal queue.\n     * It can be negative if the queue is full.\n     * https://streams.spec.whatwg.org/#rs-default-controller-desired-size\n     * @type {?number}\n     */\n    this.desiredSize;\n  }\n}\n\nexports = {\n  ReadableStream,\n  ReadableStreamAsyncIterator,\n  ReadableStreamDefaultController,\n  ReadableStreamDefaultReader,\n  ReadableStreamStrategy,\n  ReadableStreamUnderlyingSource,\n};\n","^?",1579837703000,"^@",["^A",["^3","~$goog.streams.liteTypes"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/streams/full_types.js"],"^S",["^A",["~$goog.streams.fullTypes"]],"^1",true,"^2",["^3","^T:"]],["^ ","^7",[1579837703000],"^8","goog.labs.i18n.listformat.js","^9",["^:","goog/labs/i18n/listformat.js"],"^;","goog/labs/i18n/listformat.js","^<","^=","^>","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview List format and gender decision library with locale support.\n *\n * ListFormat takes an array or a var_arg of objects and generates a user\n * friendly list in a locale-sensitive way (i.e. \"red, green, and blue\").\n *\n * GenderInfo can be used to determine the gender of a list of items,\n * depending on the gender of all items in the list.\n *\n * In English, lists of items don't really have gender, and in fact few things\n * have gender. But the idea is this:\n *  - for a list of \"male items\" (think \"John, Steve\") you use \"they\"\n *  - for \"Mary, Ann\" (all female) you might have a \"feminine\" form of \"they\"\n *  - and yet another form for mixed lists (\"John, Mary\") or undetermined\n *    (when you don't know the gender of the items, or when they are neutral)\n *\n * For example in Greek \"they\" will be translated as \"αυτοί\" for masculine,\n * \"αυτές\" for feminine, and \"αυτά\" for neutral/undetermined.\n * (it is in fact more complicated than that, as weak/strong forms and case\n * also matter, see http://en.wiktionary.org/wiki/Appendix:Greek_pronouns)\n *\n */\n\ngoog.provide('goog.labs.i18n.GenderInfo');\ngoog.provide('goog.labs.i18n.GenderInfo.Gender');\ngoog.provide('goog.labs.i18n.ListFormat');\n\ngoog.require('goog.asserts');\ngoog.require('goog.labs.i18n.ListFormatSymbols');\n\n\n\n/**\n * ListFormat provides a method to format a list/array of objects to a string,\n * in a user friendly way and in a locale sensitive manner.\n * If the objects are not strings, toString is called to convert them.\n * The constructor initializes the object based on the locale data from\n * the current goog.labs.i18n.ListFormatSymbols.\n *\n * Similar to the ICU4J class com.ibm.icu.text.ListFormatter:\n *   http://icu-project.org/apiref/icu4j/com/ibm/icu/text/ListFormatter.html\n * @constructor\n * @final\n */\ngoog.labs.i18n.ListFormat = function() {\n  /**\n   * String for lists of exactly two items, containing {0} for the first,\n   * and {1} for the second.\n   * For instance '{0} and {1}' will give 'black and white'.\n   * @private {string}\n   *\n   * Example: for \"black and white\" the pattern is \"{0} and {1}\"\n   * While for a longer list we have \"cyan, magenta, yellow, and black\"\n   * Think \"{0} start {1} middle {2} middle {3} end {4}\"\n   * The last pattern is \"{0}, and {1}.\" Note the comma before \"and\".\n   * So the \"Two\" pattern can be different than Start/Middle/End ones.\n   */\n  this.listTwoPattern_ = goog.labs.i18n.ListFormatSymbols.LIST_TWO;\n\n  /**\n   * String for the start of a list items, containing {0} for the first,\n   * and {1} for the rest.\n   * @private {string}\n   */\n  this.listStartPattern_ = goog.labs.i18n.ListFormatSymbols.LIST_START;\n\n  /**\n   * String for the start of a list items, containing {0} for the first part\n   * of the list, and {1} for the rest of the list.\n   * @private {string}\n   */\n  this.listMiddlePattern_ = goog.labs.i18n.ListFormatSymbols.LIST_MIDDLE;\n\n  /**\n   * String for the end of a list items, containing {0} for the first part\n   * of the list, and {1} for the last item.\n   *\n   * This is how start/middle/end come together:\n   *   start = '{0}, {1}'  middle = '{0}, {1}',  end = '{0}, and {1}'\n   * will result in the typical English list: 'one, two, three, and four'\n   * There are languages where the patterns are more complex than\n   * '{1} someText {1}' and the start pattern is different than the middle one.\n   *\n   * @private {string}\n   */\n  this.listEndPattern_ = goog.labs.i18n.ListFormatSymbols.LIST_END;\n};\n\n\n/**\n * Replaces the {0} and {1} placeholders in a pattern with the first and\n * the second parameter respectively, and returns the result.\n * It is a helper function for goog.labs.i18n.ListFormat.format.\n *\n * @param {string} pattern used for formatting.\n * @param {string} first object to add to list.\n * @param {string} second object to add to list.\n * @return {string} The formatted list string.\n * @private\n */\ngoog.labs.i18n.ListFormat.prototype.patternBasedJoinTwoStrings_ = function(\n    pattern, first, second) {\n  return pattern.replace('{0}', first).replace('{1}', second);\n};\n\n\n/**\n * Formats an array of strings into a string.\n * It is a user facing, locale-aware list (i.e. 'red, green, and blue').\n *\n * @param {!Array<string|number>} items Items to format.\n * @return {string} The items formatted into a string, as a list.\n */\ngoog.labs.i18n.ListFormat.prototype.format = function(items) {\n  var count = items.length;\n  switch (count) {\n    case 0:\n      return '';\n    case 1:\n      return String(items[0]);\n    case 2:\n      return this.patternBasedJoinTwoStrings_(\n          this.listTwoPattern_, String(items[0]), String(items[1]));\n  }\n\n  var result = this.patternBasedJoinTwoStrings_(\n      this.listStartPattern_, String(items[0]), String(items[1]));\n\n  for (var i = 2; i < count - 1; ++i) {\n    result = this.patternBasedJoinTwoStrings_(\n        this.listMiddlePattern_, result, String(items[i]));\n  }\n\n  return this.patternBasedJoinTwoStrings_(\n      this.listEndPattern_, result, String(items[count - 1]));\n};\n\n\n\n/**\n * GenderInfo provides a method to determine the gender of a list/array\n * of objects when one knows the gender of each item of the list.\n * It does this in a locale sensitive manner.\n * The constructor initializes the object based on the locale data from\n * the current goog.labs.i18n.ListFormatSymbols.\n *\n * Similar to the ICU4J class com.icu.util.GenderInfo:\n *   http://icu-project.org/apiref/icu4j/com/ibm/icu/util/GenderInfo.html\n * @constructor\n * @final\n */\ngoog.labs.i18n.GenderInfo = function() {\n  /**\n   * Stores the language-aware mode of determining the gender of a list.\n   * @private {goog.labs.i18n.GenderInfo.ListGenderStyle_}\n   */\n  this.listGenderStyle_ =\n      /** @type {goog.labs.i18n.GenderInfo.ListGenderStyle_} */ (\n          goog.labs.i18n.ListFormatSymbols.GENDER_STYLE);\n};\n\n\n/**\n * Enumeration for the possible ways to generate list genders.\n * Indicates the category for the locale.\n * This only affects gender for lists more than one. For lists of 1 item,\n * the gender of the list always equals the gender of that sole item.\n * This is for internal use, matching ICU.\n * @enum {number}\n * @private\n */\ngoog.labs.i18n.GenderInfo.ListGenderStyle_ = {\n  NEUTRAL: 0,\n  MIXED_NEUTRAL: 1,\n  MALE_TAINTS: 2\n};\n\n\n/**\n * Enumeration for the possible gender values.\n * Gender: OTHER means either the information is unavailable,\n * or the person has declined to state MALE or FEMALE.\n * @enum {number}\n */\ngoog.labs.i18n.GenderInfo.Gender = {\n  MALE: 0,\n  FEMALE: 1,\n  OTHER: 2\n};\n\n\n/**\n * Determines the overal gender of a list based on the gender of all the list\n * items, in a locale-aware way.\n * @param {!Array<!goog.labs.i18n.GenderInfo.Gender>} genders An array of\n *        genders, will give the gender of the list.\n * @return {goog.labs.i18n.GenderInfo.Gender} Get the gender of the list.\n*/\ngoog.labs.i18n.GenderInfo.prototype.getListGender = function(genders) {\n  var Gender = goog.labs.i18n.GenderInfo.Gender;\n\n  var count = genders.length;\n  if (count == 0) {\n    return Gender.OTHER;  // degenerate case\n  }\n  if (count == 1) {\n    return genders[0];  // degenerate case\n  }\n\n  switch (this.listGenderStyle_) {\n    case goog.labs.i18n.GenderInfo.ListGenderStyle_.NEUTRAL:\n      return Gender.OTHER;\n    case goog.labs.i18n.GenderInfo.ListGenderStyle_.MIXED_NEUTRAL:\n      var hasFemale = false;\n      var hasMale = false;\n      for (var i = 0; i < count; ++i) {\n        switch (genders[i]) {\n          case Gender.FEMALE:\n            if (hasMale) {\n              return Gender.OTHER;\n            }\n            hasFemale = true;\n            break;\n          case Gender.MALE:\n            if (hasFemale) {\n              return Gender.OTHER;\n            }\n            hasMale = true;\n            break;\n          case Gender.OTHER:\n            return Gender.OTHER;\n          default:  // Should never happen, but just in case\n            goog.asserts.assert(\n                false, 'Invalid genders[' + i + '] = ' + genders[i]);\n            return Gender.OTHER;\n        }\n      }\n      return hasMale ? Gender.MALE : Gender.FEMALE;\n    case goog.labs.i18n.GenderInfo.ListGenderStyle_.MALE_TAINTS:\n      for (var i = 0; i < count; ++i) {\n        if (genders[i] != Gender.FEMALE) {\n          return Gender.MALE;\n        }\n      }\n      return Gender.FEMALE;\n    default:\n      return Gender.OTHER;\n  }\n};\n","^?",1579837703000,"^@",["^A",["^1J","^3","^5>"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/i18n/listformat.js"],"^S",["^A",["~$goog.labs.i18n.GenderInfo.Gender","~$goog.labs.i18n.GenderInfo","~$goog.labs.i18n.ListFormat"]],"^1",true,"^2",["^3","^1J","^5>"]],["^ ","^7",[1579837703000],"^8","goog.ui.registry.js","^9",["^:","goog/ui/registry.js"],"^;","goog/ui/registry.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Global renderer and decorator registry.\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.registry');\n\ngoog.forwardDeclare('goog.ui.Component');\ngoog.forwardDeclare('goog.ui.ControlRenderer');\ngoog.require('goog.asserts');\ngoog.require('goog.dom.classlist');\n\n\n/**\n * Given a {@link goog.ui.Component} constructor, returns an instance of its\n * default renderer.  If the default renderer is a singleton, returns the\n * singleton instance; otherwise returns a new instance of the renderer class.\n * @param {Function} componentCtor Component constructor function (for example\n *     `goog.ui.Button`).\n * @return {goog.ui.ControlRenderer?} Renderer instance (for example the\n *     singleton instance of `goog.ui.ButtonRenderer`), or null if\n *     no default renderer was found.\n */\ngoog.ui.registry.getDefaultRenderer = function(componentCtor) {\n  // TODO(b/141512323): This should probably be implemented with a `WeakMap`.\n  // Locate the default renderer based on the constructor's unique ID.  If no\n  // renderer is registered for this class, walk up the superClass_ chain.\n  var key;\n  /** @type {Function|undefined} */ var rendererCtor;\n  while (componentCtor) {\n    key = goog.getUid(componentCtor);\n    if ((rendererCtor = goog.ui.registry.defaultRenderers_[key])) {\n      break;\n    }\n    componentCtor = componentCtor.superClass_ ?\n        componentCtor.superClass_.constructor :\n        null;\n  }\n\n  // If the renderer has a static getInstance method, return the singleton\n  // instance; otherwise create and return a new instance.\n  if (rendererCtor) {\n    return goog.isFunction(rendererCtor.getInstance) ?\n        rendererCtor.getInstance() :\n        new rendererCtor();\n  }\n\n  return null;\n};\n\n\n/**\n * Sets the default renderer for the given {@link goog.ui.Component}\n * constructor.\n * @param {Function} componentCtor Component constructor function (for example\n *     `goog.ui.Button`).\n * @param {Function} rendererCtor Renderer constructor function (for example\n *     `goog.ui.ButtonRenderer`).\n * @throws {Error} If the arguments aren't functions.\n */\ngoog.ui.registry.setDefaultRenderer = function(componentCtor, rendererCtor) {\n  // In this case, explicit validation has negligible overhead (since each\n  // renderer is only registered once), and helps catch subtle bugs.\n  if (!goog.isFunction(componentCtor)) {\n    throw new Error('Invalid component class ' + componentCtor);\n  }\n  if (!goog.isFunction(rendererCtor)) {\n    throw new Error('Invalid renderer class ' + rendererCtor);\n  }\n\n  // Map the component constructor's unique ID to the renderer constructor.\n  var key = goog.getUid(componentCtor);\n  goog.ui.registry.defaultRenderers_[key] = rendererCtor;\n};\n\n\n/**\n * Returns the {@link goog.ui.Component} instance created by the decorator\n * factory function registered for the given CSS class name, or null if no\n * decorator factory function was found.\n * @param {string} className CSS class name.\n * @return {goog.ui.Component?} Component instance.\n */\ngoog.ui.registry.getDecoratorByClassName = function(className) {\n  return className in goog.ui.registry.decoratorFunctions_ ?\n      goog.ui.registry.decoratorFunctions_[className]() :\n      null;\n};\n\n\n/**\n * Maps a CSS class name to a function that returns a new instance of\n * {@link goog.ui.Component} or a subclass, suitable to decorate an element\n * that has the specified CSS class.\n * @param {string} className CSS class name.\n * @param {Function} decoratorFn No-argument function that returns a new\n *     instance of a {@link goog.ui.Component} to decorate an element.\n * @throws {Error} If the class name or the decorator function is invalid.\n */\ngoog.ui.registry.setDecoratorByClassName = function(className, decoratorFn) {\n  // In this case, explicit validation has negligible overhead (since each\n  // decorator  is only registered once), and helps catch subtle bugs.\n  if (!className) {\n    throw new Error('Invalid class name ' + className);\n  }\n  if (!goog.isFunction(decoratorFn)) {\n    throw new Error('Invalid decorator function ' + decoratorFn);\n  }\n\n  goog.ui.registry.decoratorFunctions_[className] = decoratorFn;\n};\n\n\n/**\n * Returns an instance of {@link goog.ui.Component} or a subclass suitable to\n * decorate the given element, based on its CSS class.\n *\n * TODO(nnaze): Type of element should be {!Element}.\n *\n * @param {Element} element Element to decorate.\n * @return {goog.ui.Component?} Component to decorate the element (null if\n *     none).\n */\ngoog.ui.registry.getDecorator = function(element) {\n  var decorator;\n  goog.asserts.assert(element);\n  var classNames = goog.dom.classlist.get(element);\n  for (var i = 0, len = classNames.length; i < len; i++) {\n    if ((decorator = goog.ui.registry.getDecoratorByClassName(classNames[i]))) {\n      return decorator;\n    }\n  }\n  return null;\n};\n\n\n/**\n * Resets the global renderer and decorator registry.\n */\ngoog.ui.registry.reset = function() {\n  goog.ui.registry.defaultRenderers_ = {};\n  goog.ui.registry.decoratorFunctions_ = {};\n};\n\n\n/**\n * Map of {@link goog.ui.Component} constructor unique IDs to the constructors\n * of their default {@link goog.ui.Renderer}s.\n * @type {Object}\n * @private\n */\ngoog.ui.registry.defaultRenderers_ = {};\n\n\n/**\n * Map of CSS class names to registry factory functions.  The keys are\n * class names.  The values are function objects that return new instances\n * of {@link goog.ui.registry} or one of its subclasses, suitable to\n * decorate elements marked with the corresponding CSS class.  Used by\n * containers while decorating their children.\n * @type {Object}\n * @private\n */\ngoog.ui.registry.decoratorFunctions_ = {};\n","^?",1579837703000,"^@",["^A",["^1J","~$goog.dom.classlist","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/registry.js"],"^S",["^A",["^29"]],"^1",true,"^2",["^3","^1J","^T?"]],["^ ","^7",[1579837703000],"^8","goog.editor.plugins.firststrong.js","^9",["^:","goog/editor/plugins/firststrong.js"],"^;","goog/editor/plugins/firststrong.js","^<","^=","^>","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A plugin to enable the First Strong Bidi algorithm.  The First\n * Strong algorithm as a heuristic used to automatically set paragraph direction\n * depending on its content.\n *\n * In the documentation below, a 'paragraph' is the local element which we\n * evaluate as a whole for purposes of determining directionality. It may be a\n * block-level element (e.g. &lt;div&gt;) or a whole list (e.g. &lt;ul&gt;).\n *\n * This implementation is based on, but is not identical to, the original\n * First Strong algorithm defined in Unicode\n * @see http://www.unicode.org/reports/tr9/\n * The central difference from the original First Strong algorithm is that this\n * implementation decides the paragraph direction based on the first strong\n * character that is <em>typed</em> into the paragraph, regardless of its\n * location in the paragraph, as opposed to the original algorithm where it is\n * the first character in the paragraph <em>by location</em>, regardless of\n * whether other strong characters already appear in the paragraph, further its\n * start.\n *\n * <em>Please note</em> that this plugin does not perform the direction change\n * itself. Rather, it fires editor commands upon the key up event when a\n * direction change needs to be performed; `goog.editor.Command.DIR_RTL`\n * or `goog.editor.Command.DIR_RTL`.\n *\n */\n\ngoog.provide('goog.editor.plugins.FirstStrong');\n\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagIterator');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.editor.Command');\ngoog.require('goog.editor.Field');\ngoog.require('goog.editor.Plugin');\ngoog.require('goog.editor.node');\ngoog.require('goog.editor.range');\ngoog.require('goog.i18n.bidi');\ngoog.require('goog.i18n.uChar');\ngoog.require('goog.iter');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * First Strong plugin.\n * @constructor\n * @extends {goog.editor.Plugin}\n * @final\n */\ngoog.editor.plugins.FirstStrong = function() {\n  goog.editor.plugins.FirstStrong.base(this, 'constructor');\n\n  /**\n   * Indicates whether or not the cursor is in a paragraph we have not yet\n   * finished evaluating for directionality. This is set to true whenever the\n   * cursor is moved, and set to false after seeing a strong character in the\n   * paragraph the cursor is currently in.\n   *\n   * @type {boolean}\n   * @private\n   */\n  this.isNewBlock_ = true;\n\n  /**\n   * Indicates whether or not the current paragraph the cursor is in should be\n   * set to Right-To-Left directionality.\n   *\n   * @type {boolean}\n   * @private\n   */\n  this.switchToRtl_ = false;\n\n  /**\n   * Indicates whether or not the current paragraph the cursor is in should be\n   * set to Left-To-Right directionality.\n   *\n   * @type {boolean}\n   * @private\n   */\n  this.switchToLtr_ = false;\n};\ngoog.inherits(goog.editor.plugins.FirstStrong, goog.editor.Plugin);\n\n\n/** @override */\ngoog.editor.plugins.FirstStrong.prototype.getTrogClassId = function() {\n  return 'FirstStrong';\n};\n\n\n/** @override */\ngoog.editor.plugins.FirstStrong.prototype.queryCommandValue = function(\n    command) {\n  return false;\n};\n\n\n/** @override */\ngoog.editor.plugins.FirstStrong.prototype.handleSelectionChange = function(\n    e, node) {\n  this.isNewBlock_ = true;\n  return false;\n};\n\n\n/**\n * The name of the attribute which records the input text.\n *\n * @type {string}\n * @const\n */\ngoog.editor.plugins.FirstStrong.INPUT_ATTRIBUTE = 'fs-input';\n\n\n/** @override */\ngoog.editor.plugins.FirstStrong.prototype.handleKeyPress = function(e) {\n  if (goog.editor.Field.SELECTION_CHANGE_KEYCODES[e.keyCode]) {\n    // Key triggered selection change event (e.g. on ENTER) is throttled and a\n    // later LTR/RTL strong keypress may come before it. Need to capture it.\n    this.isNewBlock_ = true;\n    return false;  // A selection-changing key is not LTR/RTL strong.\n  }\n  if (!this.isNewBlock_) {\n    return false;  // We've already determined this paragraph's direction.\n  }\n  // Ignore non-character key press events.\n  if (e.ctrlKey || e.metaKey) {\n    return false;\n  }\n  var newInput = goog.i18n.uChar.fromCharCode(e.charCode);\n\n  // IME's may return 0 for the charCode, which is a legitimate, non-Strong\n  // charCode, or they may return an illegal charCode (for which newInput will\n  // be false).\n  if (!newInput || !e.charCode) {\n    var browserEvent = e.getBrowserEvent();\n    if (browserEvent) {\n      if (goog.userAgent.IE && browserEvent['getAttribute']) {\n        newInput = browserEvent['getAttribute'](\n            goog.editor.plugins.FirstStrong.INPUT_ATTRIBUTE);\n      } else {\n        newInput =\n            browserEvent[goog.editor.plugins.FirstStrong.INPUT_ATTRIBUTE];\n      }\n    }\n  }\n\n  if (!newInput) {\n    return false;  // Unrecognized key.\n  }\n\n  var isLtr = goog.i18n.bidi.isLtrChar(newInput);\n  var isRtl = !isLtr && goog.i18n.bidi.isRtlChar(newInput);\n  if (!isLtr && !isRtl) {\n    return false;  // This character cannot change anything (it is not Strong).\n  }\n  // This character is Strongly LTR or Strongly RTL. We might switch direction\n  // on it now, but in any case we do not need to check any more characters in\n  // this paragraph after it.\n  this.isNewBlock_ = false;\n\n  // Are there no Strong characters already in the paragraph?\n  if (this.isNeutralBlock_()) {\n    this.switchToRtl_ = isRtl;\n    this.switchToLtr_ = isLtr;\n  }\n  return false;\n};\n\n\n/**\n * Calls the flip directionality commands.  This is done here so things go into\n * the redo-undo stack at the expected order; fist enter the input, then flip\n * directionality.\n * @override\n */\ngoog.editor.plugins.FirstStrong.prototype.handleKeyUp = function(e) {\n  if (this.switchToRtl_) {\n    var field = this.getFieldObject();\n    field.dispatchChange(true);\n    field.execCommand(goog.editor.Command.DIR_RTL);\n    this.switchToRtl_ = false;\n  } else if (this.switchToLtr_) {\n    var field = this.getFieldObject();\n    field.dispatchChange(true);\n    field.execCommand(goog.editor.Command.DIR_LTR);\n    this.switchToLtr_ = false;\n  }\n  return false;\n};\n\n\n/**\n * @return {Element} The lowest Block element ancestor of the node where the\n *     next character will be placed.\n * @private\n */\ngoog.editor.plugins.FirstStrong.prototype.getBlockAncestor_ = function() {\n  var start = this.getFieldObject().getRange().getStartNode();\n  // Go up in the DOM until we reach a Block element.\n  while (!goog.editor.plugins.FirstStrong.isBlock_(start)) {\n    start = start.parentNode;\n  }\n  return /** @type {Element} */ (start);\n};\n\n\n/**\n * @return {boolean} Whether the paragraph where the next character will be\n *     entered contains only non-Strong characters.\n * @private\n */\ngoog.editor.plugins.FirstStrong.prototype.isNeutralBlock_ = function() {\n  var root = this.getBlockAncestor_();\n  // The exact node with the cursor location. Simply calling getStartNode() on\n  // the range only returns the containing block node.\n  var cursor =\n      goog.editor.range.getDeepEndPoint(this.getFieldObject().getRange(), false)\n          .node;\n\n  // In FireFox the BR tag also represents a change in paragraph if not inside a\n  // list. So we need special handling to only look at the sub-block between\n  // BR elements.\n  var blockFunction = (goog.userAgent.GECKO && !this.isList_(root)) ?\n      goog.editor.plugins.FirstStrong.isGeckoBlock_ :\n      goog.editor.plugins.FirstStrong.isBlock_;\n  var paragraph = this.getTextAround_(root, cursor, blockFunction);\n  // Not using `goog.i18n.bidi.isNeutralText` as it contains additional,\n  // unwanted checks to the content.\n  return !goog.i18n.bidi.hasAnyLtr(paragraph) &&\n      !goog.i18n.bidi.hasAnyRtl(paragraph);\n};\n\n\n/**\n * Checks if an element is a list element ('UL' or 'OL').\n *\n * @param {Element} element The element to test.\n * @return {boolean} Whether the element is a list element ('UL' or 'OL').\n * @private\n */\ngoog.editor.plugins.FirstStrong.prototype.isList_ = function(element) {\n  if (!element) {\n    return false;\n  }\n  var tagName = element.tagName;\n  return tagName == goog.dom.TagName.UL || tagName == goog.dom.TagName.OL;\n};\n\n\n/**\n * Returns the text within the local paragraph around the cursor.\n * Notice that for GECKO a BR represents a pargraph change despite not being a\n * block element.\n *\n * @param {Element} root The first block element ancestor of the node the cursor\n *     is in.\n * @param {Node} cursorLocation Node where the cursor currently is, marking the\n *     paragraph whose text we will return.\n * @param {function(Node): boolean} isParagraphBoundary The function to\n *     determine if a node represents the start or end of the paragraph.\n * @return {string} the text in the paragraph around the cursor location.\n * @private\n */\ngoog.editor.plugins.FirstStrong.prototype.getTextAround_ = function(\n    root, cursorLocation, isParagraphBoundary) {\n  // The buffer where we're collecting the text.\n  var buffer = [];\n  // Have we reached the cursor yet, or are we still before it?\n  var pastCursorLocation = false;\n\n  if (root && cursorLocation) {\n    goog.iter.some(new goog.dom.TagIterator(root), function(node) {\n      if (node == cursorLocation) {\n        pastCursorLocation = true;\n      } else if (isParagraphBoundary(node)) {\n        if (pastCursorLocation) {\n          // This is the end of the paragraph containing the cursor. We're done.\n          return true;\n        } else {\n          // All we collected so far does not count; it was in a previous\n          // paragraph that did not contain the cursor.\n          buffer = [];\n        }\n      }\n      if (node.nodeType == goog.dom.NodeType.TEXT) {\n        buffer.push(node.nodeValue);\n      }\n      return false;  // Keep going.\n    });\n  }\n  return buffer.join('');\n};\n\n\n/**\n * @param {Node} node Node to check.\n * @return {boolean} Does the given node represent a Block element? Notice we do\n *     not consider list items as Block elements in the algorithm.\n * @private\n */\ngoog.editor.plugins.FirstStrong.isBlock_ = function(node) {\n  return !!node && goog.editor.node.isBlockTag(node) &&\n      /** @type {!Element} */ (node).tagName != goog.dom.TagName.LI;\n};\n\n\n/**\n * @param {Node} node Node to check.\n * @return {boolean} Does the given node represent a Block element from the\n *     point of view of FireFox? Notice we do not consider list items as Block\n *     elements in the algorithm.\n * @private\n */\ngoog.editor.plugins.FirstStrong.isGeckoBlock_ = function(node) {\n  return !!node &&\n      (/** @type {!Element} */ (node).tagName == goog.dom.TagName.BR ||\n       goog.editor.plugins.FirstStrong.isBlock_(node));\n};\n","^?",1579837703000,"^@",["^A",["^1W","^4<","^1[","~$goog.editor.Command","~$goog.editor.range","^3","~$goog.editor.Field","~$goog.i18n.uChar","^18","^47","~$goog.editor.Plugin","~$goog.editor.node","^4"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/firststrong.js"],"^S",["^A",["~$goog.editor.plugins.FirstStrong"]],"^1",true,"^2",["^3","^1[","^4<","^4","^T@","^TB","^TD","^TE","^TA","^47","^TC","^1W","^18"]],["^ ","^7",[1579837703000],"^8","goog.vec.mat3f.js","^9",["^:","goog/vec/mat3f.js"],"^;","goog/vec/mat3f.js","^<","^=","^>","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n//                                                                           //\n// Any edits to this file must be applied to mat3d.js by running:            //\n//   swap_type.sh mat3f.js > mat3d.js                                        //\n//                                                                           //\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n\n\n/**\n * @fileoverview Provides functions for operating on 3x3 float (32bit)\n * matrices.  The matrices are stored in column-major order.\n *\n * The last parameter will typically be the output object and an object\n * can be both an input and output parameter to all methods except where\n * noted.\n *\n * See the README for notes about the design and structure of the API\n * (especially related to performance).\n *\n */\ngoog.provide('goog.vec.mat3f');\ngoog.provide('goog.vec.mat3f.Type');\n\ngoog.require('goog.vec');\ngoog.require('goog.vec.vec3f.Type');\n\n\n/** @typedef {!goog.vec.Float32} */ goog.vec.mat3f.Type;\n\n\n/**\n * Creates a mat3f with all elements initialized to zero.\n *\n * @return {!goog.vec.mat3f.Type} The new mat3f.\n */\ngoog.vec.mat3f.create = function() {\n  return new Float32Array(9);\n};\n\n\n/**\n * Creates a mat3f identity matrix.\n *\n * @return {!goog.vec.mat3f.Type} The new mat3f.\n */\ngoog.vec.mat3f.createIdentity = function() {\n  var mat = goog.vec.mat3f.create();\n  mat[0] = mat[4] = mat[8] = 1;\n  return mat;\n};\n\n\n/**\n * Initializes the matrix from the set of values. Note the values supplied are\n * in column major order.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix to receive the\n *     values.\n * @param {number} v00 The values at (0, 0).\n * @param {number} v10 The values at (1, 0).\n * @param {number} v20 The values at (2, 0).\n * @param {number} v01 The values at (0, 1).\n * @param {number} v11 The values at (1, 1).\n * @param {number} v21 The values at (2, 1).\n * @param {number} v02 The values at (0, 2).\n * @param {number} v12 The values at (1, 2).\n * @param {number} v22 The values at (2, 2).\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.setFromValues = function(\n    mat, v00, v10, v20, v01, v11, v21, v02, v12, v22) {\n  mat[0] = v00;\n  mat[1] = v10;\n  mat[2] = v20;\n  mat[3] = v01;\n  mat[4] = v11;\n  mat[5] = v21;\n  mat[6] = v02;\n  mat[7] = v12;\n  mat[8] = v22;\n  return mat;\n};\n\n\n/**\n * Initializes mat3f mat from mat3f src.\n *\n * @param {!goog.vec.mat3f.Type} mat The destination matrix.\n * @param {!goog.vec.mat3f.Type} src The source matrix.\n * @return {!goog.vec.mat3f.Type} Return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.setFromMat3f = function(mat, src) {\n  mat[0] = src[0];\n  mat[1] = src[1];\n  mat[2] = src[2];\n  mat[3] = src[3];\n  mat[4] = src[4];\n  mat[5] = src[5];\n  mat[6] = src[6];\n  mat[7] = src[7];\n  mat[8] = src[8];\n  return mat;\n};\n\n\n/**\n * Initializes mat3f mat from mat3d src (typed as a Float64Array to\n * avoid circular goog.requires).\n *\n * @param {!goog.vec.mat3f.Type} mat The destination matrix.\n * @param {Float64Array} src The source matrix.\n * @return {!goog.vec.mat3f.Type} Return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.setFromMat3d = function(mat, src) {\n  mat[0] = src[0];\n  mat[1] = src[1];\n  mat[2] = src[2];\n  mat[3] = src[3];\n  mat[4] = src[4];\n  mat[5] = src[5];\n  mat[6] = src[6];\n  mat[7] = src[7];\n  mat[8] = src[8];\n  return mat;\n};\n\n\n/**\n * Initializes mat3f mat from Array src.\n *\n * @param {!goog.vec.mat3f.Type} mat The destination matrix.\n * @param {Array<number>} src The source matrix.\n * @return {!goog.vec.mat3f.Type} Return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.setFromArray = function(mat, src) {\n  mat[0] = src[0];\n  mat[1] = src[1];\n  mat[2] = src[2];\n  mat[3] = src[3];\n  mat[4] = src[4];\n  mat[5] = src[5];\n  mat[6] = src[6];\n  mat[7] = src[7];\n  mat[8] = src[8];\n  return mat;\n};\n\n\n/**\n * Retrieves the element at the requested row and column.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix containing the value to\n *     retrieve.\n * @param {number} row The row index.\n * @param {number} column The column index.\n * @return {number} The element value at the requested row, column indices.\n */\ngoog.vec.mat3f.getElement = function(mat, row, column) {\n  return mat[row + column * 3];\n};\n\n\n/**\n * Sets the element at the requested row and column.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix containing the value to\n *     retrieve.\n * @param {number} row The row index.\n * @param {number} column The column index.\n * @param {number} value The value to set at the requested row, column.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.setElement = function(mat, row, column, value) {\n  mat[row + column * 3] = value;\n  return mat;\n};\n\n\n/**\n * Sets the diagonal values of the matrix from the given values.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix to receive the values.\n * @param {number} v00 The values for (0, 0).\n * @param {number} v11 The values for (1, 1).\n * @param {number} v22 The values for (2, 2).\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.setDiagonalValues = function(mat, v00, v11, v22) {\n  mat[0] = v00;\n  mat[4] = v11;\n  mat[8] = v22;\n  return mat;\n};\n\n\n/**\n * Sets the diagonal values of the matrix from the given vector.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix to receive the values.\n * @param {!goog.vec.vec3f.Type} vec The vector containing the values.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.setDiagonal = function(mat, vec) {\n  mat[0] = vec[0];\n  mat[4] = vec[1];\n  mat[8] = vec[2];\n  return mat;\n};\n\n\n/**\n * Sets the specified column with the supplied values.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix to receive the values.\n * @param {number} column The column index to set the values on.\n * @param {number} v0 The value for row 0.\n * @param {number} v1 The value for row 1.\n * @param {number} v2 The value for row 2.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.setColumnValues = function(mat, column, v0, v1, v2) {\n  var i = column * 3;\n  mat[i] = v0;\n  mat[i + 1] = v1;\n  mat[i + 2] = v2;\n  return mat;\n};\n\n\n/**\n * Sets the specified column with the value from the supplied array.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix to receive the values.\n * @param {number} column The column index to set the values on.\n * @param {!goog.vec.vec3f.Type} vec The vector elements for the column.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.setColumn = function(mat, column, vec) {\n  var i = column * 3;\n  mat[i] = vec[0];\n  mat[i + 1] = vec[1];\n  mat[i + 2] = vec[2];\n  return mat;\n};\n\n\n/**\n * Retrieves the specified column from the matrix into the given vector\n * array.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix supplying the values.\n * @param {number} column The column to get the values from.\n * @param {!goog.vec.vec3f.Type} vec The vector elements to receive the\n *     column.\n * @return {!goog.vec.vec3f.Type} return vec so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.getColumn = function(mat, column, vec) {\n  var i = column * 3;\n  vec[0] = mat[i];\n  vec[1] = mat[i + 1];\n  vec[2] = mat[i + 2];\n  return vec;\n};\n\n\n/**\n * Sets the columns of the matrix from the set of vector elements.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix to receive the values.\n * @param {!goog.vec.vec3f.Type} vec0 The values for column 0.\n * @param {!goog.vec.vec3f.Type} vec1 The values for column 1.\n * @param {!goog.vec.vec3f.Type} vec2 The values for column 2.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.setColumns = function(mat, vec0, vec1, vec2) {\n  goog.vec.mat3f.setColumn(mat, 0, vec0);\n  goog.vec.mat3f.setColumn(mat, 1, vec1);\n  goog.vec.mat3f.setColumn(mat, 2, vec2);\n  return /** @type {!goog.vec.mat3f.Type} */ (mat);\n};\n\n\n/**\n * Retrieves the column values from the given matrix into the given vector\n * elements.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix supplying the columns.\n * @param {!goog.vec.vec3f.Type} vec0 The vector to receive column 0.\n * @param {!goog.vec.vec3f.Type} vec1 The vector to receive column 1.\n * @param {!goog.vec.vec3f.Type} vec2 The vector to receive column 2.\n */\ngoog.vec.mat3f.getColumns = function(mat, vec0, vec1, vec2) {\n  goog.vec.mat3f.getColumn(mat, 0, vec0);\n  goog.vec.mat3f.getColumn(mat, 1, vec1);\n  goog.vec.mat3f.getColumn(mat, 2, vec2);\n};\n\n\n/**\n * Sets the row values from the supplied values.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix to receive the values.\n * @param {number} row The index of the row to receive the values.\n * @param {number} v0 The value for column 0.\n * @param {number} v1 The value for column 1.\n * @param {number} v2 The value for column 2.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.setRowValues = function(mat, row, v0, v1, v2) {\n  mat[row] = v0;\n  mat[row + 3] = v1;\n  mat[row + 6] = v2;\n  return mat;\n};\n\n\n/**\n * Sets the row values from the supplied vector.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix to receive the row values.\n * @param {number} row The index of the row.\n * @param {!goog.vec.vec3f.Type} vec The vector containing the values.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.setRow = function(mat, row, vec) {\n  mat[row] = vec[0];\n  mat[row + 3] = vec[1];\n  mat[row + 6] = vec[2];\n  return mat;\n};\n\n\n/**\n * Retrieves the row values into the given vector.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix supplying the values.\n * @param {number} row The index of the row supplying the values.\n * @param {!goog.vec.vec3f.Type} vec The vector to receive the row.\n * @return {!goog.vec.vec3f.Type} return vec so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.getRow = function(mat, row, vec) {\n  vec[0] = mat[row];\n  vec[1] = mat[row + 3];\n  vec[2] = mat[row + 6];\n  return vec;\n};\n\n\n/**\n * Sets the rows of the matrix from the supplied vectors.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix to receive the values.\n * @param {!goog.vec.vec3f.Type} vec0 The values for row 0.\n * @param {!goog.vec.vec3f.Type} vec1 The values for row 1.\n * @param {!goog.vec.vec3f.Type} vec2 The values for row 2.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.setRows = function(mat, vec0, vec1, vec2) {\n  goog.vec.mat3f.setRow(mat, 0, vec0);\n  goog.vec.mat3f.setRow(mat, 1, vec1);\n  goog.vec.mat3f.setRow(mat, 2, vec2);\n  return /** @type {!goog.vec.mat3f.Type} */ (mat);\n};\n\n\n/**\n * Retrieves the rows of the matrix into the supplied vectors.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix to supplying the values.\n * @param {!goog.vec.vec3f.Type} vec0 The vector to receive row 0.\n * @param {!goog.vec.vec3f.Type} vec1 The vector to receive row 1.\n * @param {!goog.vec.vec3f.Type} vec2 The vector to receive row 2.\n */\ngoog.vec.mat3f.getRows = function(mat, vec0, vec1, vec2) {\n  goog.vec.mat3f.getRow(mat, 0, vec0);\n  goog.vec.mat3f.getRow(mat, 1, vec1);\n  goog.vec.mat3f.getRow(mat, 2, vec2);\n};\n\n\n/**\n * Makes the given 3x3 matrix the zero matrix.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix.\n * @return {!goog.vec.mat3f.Type} return mat so operations can be chained.\n */\ngoog.vec.mat3f.makeZero = function(mat) {\n  mat[0] = 0;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = 0;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix the identity matrix.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix.\n * @return {!goog.vec.mat3f.Type} return mat so operations can be chained.\n */\ngoog.vec.mat3f.makeIdentity = function(mat) {\n  mat[0] = 1;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 1;\n  mat[5] = 0;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 1;\n  return mat;\n};\n\n\n/**\n * Performs a per-component addition of the matrices mat0 and mat1, storing\n * the result into resultMat.\n *\n * @param {!goog.vec.mat3f.Type} mat0 The first addend.\n * @param {!goog.vec.mat3f.Type} mat1 The second addend.\n * @param {!goog.vec.mat3f.Type} resultMat The matrix to\n *     receive the results (may be either mat0 or mat1).\n * @return {!goog.vec.mat3f.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.addMat = function(mat0, mat1, resultMat) {\n  resultMat[0] = mat0[0] + mat1[0];\n  resultMat[1] = mat0[1] + mat1[1];\n  resultMat[2] = mat0[2] + mat1[2];\n  resultMat[3] = mat0[3] + mat1[3];\n  resultMat[4] = mat0[4] + mat1[4];\n  resultMat[5] = mat0[5] + mat1[5];\n  resultMat[6] = mat0[6] + mat1[6];\n  resultMat[7] = mat0[7] + mat1[7];\n  resultMat[8] = mat0[8] + mat1[8];\n  return resultMat;\n};\n\n\n/**\n * Performs a per-component subtraction of the matrices mat0 and mat1,\n * storing the result into resultMat.\n *\n * @param {!goog.vec.mat3f.Type} mat0 The minuend.\n * @param {!goog.vec.mat3f.Type} mat1 The subtrahend.\n * @param {!goog.vec.mat3f.Type} resultMat The matrix to receive\n *     the results (may be either mat0 or mat1).\n * @return {!goog.vec.mat3f.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.subMat = function(mat0, mat1, resultMat) {\n  resultMat[0] = mat0[0] - mat1[0];\n  resultMat[1] = mat0[1] - mat1[1];\n  resultMat[2] = mat0[2] - mat1[2];\n  resultMat[3] = mat0[3] - mat1[3];\n  resultMat[4] = mat0[4] - mat1[4];\n  resultMat[5] = mat0[5] - mat1[5];\n  resultMat[6] = mat0[6] - mat1[6];\n  resultMat[7] = mat0[7] - mat1[7];\n  resultMat[8] = mat0[8] - mat1[8];\n  return resultMat;\n};\n\n\n/**\n * Multiplies matrix mat0 with the given scalar, storing the result\n * into resultMat.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix.\n * @param {number} scalar The scalar value to multiple to each element of mat.\n * @param {!goog.vec.mat3f.Type} resultMat The matrix to receive\n *     the results (may be mat).\n * @return {!goog.vec.mat3f.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.multScalar = function(mat, scalar, resultMat) {\n  resultMat[0] = mat[0] * scalar;\n  resultMat[1] = mat[1] * scalar;\n  resultMat[2] = mat[2] * scalar;\n  resultMat[3] = mat[3] * scalar;\n  resultMat[4] = mat[4] * scalar;\n  resultMat[5] = mat[5] * scalar;\n  resultMat[6] = mat[6] * scalar;\n  resultMat[7] = mat[7] * scalar;\n  resultMat[8] = mat[8] * scalar;\n  return resultMat;\n};\n\n\n/**\n * Multiplies the two matrices mat0 and mat1 using matrix multiplication,\n * storing the result into resultMat.\n *\n * @param {!goog.vec.mat3f.Type} mat0 The first (left hand) matrix.\n * @param {!goog.vec.mat3f.Type} mat1 The second (right hand) matrix.\n * @param {!goog.vec.mat3f.Type} resultMat The matrix to receive\n *     the results (may be either mat0 or mat1).\n * @return {!goog.vec.mat3f.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.multMat = function(mat0, mat1, resultMat) {\n  var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2];\n  var a01 = mat0[3], a11 = mat0[4], a21 = mat0[5];\n  var a02 = mat0[6], a12 = mat0[7], a22 = mat0[8];\n\n  var b00 = mat1[0], b10 = mat1[1], b20 = mat1[2];\n  var b01 = mat1[3], b11 = mat1[4], b21 = mat1[5];\n  var b02 = mat1[6], b12 = mat1[7], b22 = mat1[8];\n\n  resultMat[0] = a00 * b00 + a01 * b10 + a02 * b20;\n  resultMat[1] = a10 * b00 + a11 * b10 + a12 * b20;\n  resultMat[2] = a20 * b00 + a21 * b10 + a22 * b20;\n  resultMat[3] = a00 * b01 + a01 * b11 + a02 * b21;\n  resultMat[4] = a10 * b01 + a11 * b11 + a12 * b21;\n  resultMat[5] = a20 * b01 + a21 * b11 + a22 * b21;\n  resultMat[6] = a00 * b02 + a01 * b12 + a02 * b22;\n  resultMat[7] = a10 * b02 + a11 * b12 + a12 * b22;\n  resultMat[8] = a20 * b02 + a21 * b12 + a22 * b22;\n  return resultMat;\n};\n\n\n/**\n * Transposes the given matrix mat storing the result into resultMat.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix to transpose.\n * @param {!goog.vec.mat3f.Type} resultMat The matrix to receive\n *     the results (may be mat).\n * @return {!goog.vec.mat3f.Type} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.transpose = function(mat, resultMat) {\n  if (resultMat == mat) {\n    var a10 = mat[1], a20 = mat[2], a21 = mat[5];\n    resultMat[1] = mat[3];\n    resultMat[2] = mat[6];\n    resultMat[3] = a10;\n    resultMat[5] = mat[7];\n    resultMat[6] = a20;\n    resultMat[7] = a21;\n  } else {\n    resultMat[0] = mat[0];\n    resultMat[1] = mat[3];\n    resultMat[2] = mat[6];\n    resultMat[3] = mat[1];\n    resultMat[4] = mat[4];\n    resultMat[5] = mat[7];\n    resultMat[6] = mat[2];\n    resultMat[7] = mat[5];\n    resultMat[8] = mat[8];\n  }\n  return resultMat;\n};\n\n\n/**\n * Computes the inverse of mat0 storing the result into resultMat. If the\n * inverse is defined, this function returns true, false otherwise.\n *\n * @param {!goog.vec.mat3f.Type} mat0 The matrix to invert.\n * @param {!goog.vec.mat3f.Type} resultMat The matrix to receive\n *     the result (may be mat0).\n * @return {boolean} True if the inverse is defined. If false is returned,\n *     resultMat is not modified.\n */\ngoog.vec.mat3f.invert = function(mat0, resultMat) {\n  var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2];\n  var a01 = mat0[3], a11 = mat0[4], a21 = mat0[5];\n  var a02 = mat0[6], a12 = mat0[7], a22 = mat0[8];\n\n  var t00 = a11 * a22 - a12 * a21;\n  var t10 = a12 * a20 - a10 * a22;\n  var t20 = a10 * a21 - a11 * a20;\n  var det = a00 * t00 + a01 * t10 + a02 * t20;\n  if (det == 0) {\n    return false;\n  }\n\n  var idet = 1 / det;\n  resultMat[0] = t00 * idet;\n  resultMat[3] = (a02 * a21 - a01 * a22) * idet;\n  resultMat[6] = (a01 * a12 - a02 * a11) * idet;\n\n  resultMat[1] = t10 * idet;\n  resultMat[4] = (a00 * a22 - a02 * a20) * idet;\n  resultMat[7] = (a02 * a10 - a00 * a12) * idet;\n\n  resultMat[2] = t20 * idet;\n  resultMat[5] = (a01 * a20 - a00 * a21) * idet;\n  resultMat[8] = (a00 * a11 - a01 * a10) * idet;\n  return true;\n};\n\n\n/**\n * Returns true if the components of mat0 are equal to the components of mat1.\n *\n * @param {!goog.vec.mat3f.Type} mat0 The first matrix.\n * @param {!goog.vec.mat3f.Type} mat1 The second matrix.\n * @return {boolean} True if the the two matrices are equivalent.\n */\ngoog.vec.mat3f.equals = function(mat0, mat1) {\n  return mat0.length == mat1.length && mat0[0] == mat1[0] &&\n      mat0[1] == mat1[1] && mat0[2] == mat1[2] && mat0[3] == mat1[3] &&\n      mat0[4] == mat1[4] && mat0[5] == mat1[5] && mat0[6] == mat1[6] &&\n      mat0[7] == mat1[7] && mat0[8] == mat1[8];\n};\n\n\n/**\n * Transforms the given vector with the given matrix storing the resulting,\n * transformed matrix into resultVec.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix supplying the transformation.\n * @param {!goog.vec.vec3f.Type} vec The vector to transform.\n * @param {!goog.vec.vec3f.Type} resultVec The vector to\n *     receive the results (may be vec).\n * @return {!goog.vec.vec3f.Type} return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.multVec3 = function(mat, vec, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2];\n  resultVec[0] = x * mat[0] + y * mat[3] + z * mat[6];\n  resultVec[1] = x * mat[1] + y * mat[4] + z * mat[7];\n  resultVec[2] = x * mat[2] + y * mat[5] + z * mat[8];\n  return resultVec;\n};\n\n\n/**\n * Makes the given 3x3 matrix a translation matrix with x and y\n * translation values.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix.\n * @param {number} x The translation along the x axis.\n * @param {number} y The translation along the y axis.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3f.makeTranslate = function(mat, x, y) {\n  mat[0] = 1;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 1;\n  mat[5] = 0;\n  mat[6] = x;\n  mat[7] = y;\n  mat[8] = 1;\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix a scale matrix with x, y, and z scale factors.\n *\n * @param {!goog.vec.mat3f.Type} mat The 3x3 (9-element) matrix\n *     array to receive the new scale matrix.\n * @param {number} x The scale along the x axis.\n * @param {number} y The scale along the y axis.\n * @param {number} z The scale along the z axis.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3f.makeScale = function(mat, x, y, z) {\n  mat[0] = x;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = y;\n  mat[5] = 0;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = z;\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix a rotation matrix with the given rotation\n * angle about the axis defined by the vector (ax, ay, az).\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @param {number} ax The x component of the rotation axis.\n * @param {number} ay The y component of the rotation axis.\n * @param {number} az The z component of the rotation axis.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3f.makeRotate = function(mat, angle, ax, ay, az) {\n  var c = Math.cos(angle);\n  var d = 1 - c;\n  var s = Math.sin(angle);\n\n  mat[0] = ax * ax * d + c;\n  mat[1] = ax * ay * d + az * s;\n  mat[2] = ax * az * d - ay * s;\n  mat[3] = ax * ay * d - az * s;\n  mat[4] = ay * ay * d + c;\n  mat[5] = ay * az * d + ax * s;\n  mat[6] = ax * az * d + ay * s;\n  mat[7] = ay * az * d - ax * s;\n  mat[8] = az * az * d + c;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix a rotation matrix with the given rotation\n * angle about the X axis.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3f.makeRotateX = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = 1;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = c;\n  mat[5] = s;\n  mat[6] = 0;\n  mat[7] = -s;\n  mat[8] = c;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix a rotation matrix with the given rotation\n * angle about the Y axis.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3f.makeRotateY = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = c;\n  mat[1] = 0;\n  mat[2] = -s;\n  mat[3] = 0;\n  mat[4] = 1;\n  mat[5] = 0;\n  mat[6] = s;\n  mat[7] = 0;\n  mat[8] = c;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix a rotation matrix with the given rotation\n * angle about the Z axis.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3f.makeRotateZ = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = c;\n  mat[1] = s;\n  mat[2] = 0;\n  mat[3] = -s;\n  mat[4] = c;\n  mat[5] = 0;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 1;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the x,y,z axis.  Equivalent to:\n * goog.vec.mat3f.multMat(\n *     mat,\n *     goog.vec.mat3f.makeRotate(goog.vec.mat3f.create(), angle, x, y, z),\n *     mat);\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @param {number} x The x component of the rotation axis.\n * @param {number} y The y component of the rotation axis.\n * @param {number} z The z component of the rotation axis.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3f.rotate = function(mat, angle, x, y, z) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2];\n  var m01 = mat[3], m11 = mat[4], m21 = mat[5];\n  var m02 = mat[6], m12 = mat[7], m22 = mat[8];\n\n  var cosAngle = Math.cos(angle);\n  var sinAngle = Math.sin(angle);\n  var diffCosAngle = 1 - cosAngle;\n  var r00 = x * x * diffCosAngle + cosAngle;\n  var r10 = x * y * diffCosAngle + z * sinAngle;\n  var r20 = x * z * diffCosAngle - y * sinAngle;\n\n  var r01 = x * y * diffCosAngle - z * sinAngle;\n  var r11 = y * y * diffCosAngle + cosAngle;\n  var r21 = y * z * diffCosAngle + x * sinAngle;\n\n  var r02 = x * z * diffCosAngle + y * sinAngle;\n  var r12 = y * z * diffCosAngle - x * sinAngle;\n  var r22 = z * z * diffCosAngle + cosAngle;\n\n  mat[0] = m00 * r00 + m01 * r10 + m02 * r20;\n  mat[1] = m10 * r00 + m11 * r10 + m12 * r20;\n  mat[2] = m20 * r00 + m21 * r10 + m22 * r20;\n  mat[3] = m00 * r01 + m01 * r11 + m02 * r21;\n  mat[4] = m10 * r01 + m11 * r11 + m12 * r21;\n  mat[5] = m20 * r01 + m21 * r11 + m22 * r21;\n  mat[6] = m00 * r02 + m01 * r12 + m02 * r22;\n  mat[7] = m10 * r02 + m11 * r12 + m12 * r22;\n  mat[8] = m20 * r02 + m21 * r12 + m22 * r22;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the x axis.  Equivalent to:\n * goog.vec.mat3f.multMat(\n *     mat,\n *     goog.vec.mat3f.makeRotateX(goog.vec.mat3f.create(), angle),\n *     mat);\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3f.rotateX = function(mat, angle) {\n  var m01 = mat[3], m11 = mat[4], m21 = mat[5];\n  var m02 = mat[6], m12 = mat[7], m22 = mat[8];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[3] = m01 * c + m02 * s;\n  mat[4] = m11 * c + m12 * s;\n  mat[5] = m21 * c + m22 * s;\n  mat[6] = m01 * -s + m02 * c;\n  mat[7] = m11 * -s + m12 * c;\n  mat[8] = m21 * -s + m22 * c;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the y axis.  Equivalent to:\n * goog.vec.mat3f.multMat(\n *     mat,\n *     goog.vec.mat3f.makeRotateY(goog.vec.mat3f.create(), angle),\n *     mat);\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3f.rotateY = function(mat, angle) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2];\n  var m02 = mat[6], m12 = mat[7], m22 = mat[8];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = m00 * c + m02 * -s;\n  mat[1] = m10 * c + m12 * -s;\n  mat[2] = m20 * c + m22 * -s;\n  mat[6] = m00 * s + m02 * c;\n  mat[7] = m10 * s + m12 * c;\n  mat[8] = m20 * s + m22 * c;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the z axis.  Equivalent to:\n * goog.vec.mat3f.multMat(\n *     mat,\n *     goog.vec.mat3f.makeRotateZ(goog.vec.mat3f.create(), angle),\n *     mat);\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3f.rotateZ = function(mat, angle) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2];\n  var m01 = mat[3], m11 = mat[4], m21 = mat[5];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = m00 * c + m01 * s;\n  mat[1] = m10 * c + m11 * s;\n  mat[2] = m20 * c + m21 * s;\n  mat[3] = m00 * -s + m01 * c;\n  mat[4] = m10 * -s + m11 * c;\n  mat[5] = m20 * -s + m21 * c;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix a rotation matrix given Euler angles using\n * the ZXZ convention.\n * Given the euler angles [theta1, theta2, theta3], the rotation is defined as\n * rotation = rotation_z(theta1) * rotation_x(theta2) * rotation_z(theta3),\n * with theta1 in [0, 2 * pi], theta2 in [0, pi] and theta3 in [0, 2 * pi].\n * rotation_x(theta) means rotation around the X axis of theta radians.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix.\n * @param {number} theta1 The angle of rotation around the Z axis in radians.\n * @param {number} theta2 The angle of rotation around the X axis in radians.\n * @param {number} theta3 The angle of rotation around the Z axis in radians.\n * @return {!goog.vec.mat3f.Type} return mat so that operations can be\n *     chained.\n */\ngoog.vec.mat3f.makeEulerZXZ = function(mat, theta1, theta2, theta3) {\n  var c1 = Math.cos(theta1);\n  var s1 = Math.sin(theta1);\n\n  var c2 = Math.cos(theta2);\n  var s2 = Math.sin(theta2);\n\n  var c3 = Math.cos(theta3);\n  var s3 = Math.sin(theta3);\n\n  mat[0] = c1 * c3 - c2 * s1 * s3;\n  mat[1] = c2 * c1 * s3 + c3 * s1;\n  mat[2] = s3 * s2;\n\n  mat[3] = -c1 * s3 - c3 * c2 * s1;\n  mat[4] = c1 * c2 * c3 - s1 * s3;\n  mat[5] = c3 * s2;\n\n  mat[6] = s2 * s1;\n  mat[7] = -c1 * s2;\n  mat[8] = c2;\n\n  return mat;\n};\n\n\n/**\n * Decomposes a rotation matrix into Euler angles using the ZXZ convention so\n * that rotation = rotation_z(theta1) * rotation_x(theta2) * rotation_z(theta3),\n * with theta1 in [0, 2 * pi], theta2 in [0, pi] and theta3 in [0, 2 * pi].\n * rotation_x(theta) means rotation around the X axis of theta radians.\n *\n * @param {!goog.vec.mat3f.Type} mat The matrix.\n * @param {!goog.vec.vec3f.Type} euler The ZXZ Euler angles in\n *     radians as [theta1, theta2, theta3].\n * @param {boolean=} opt_theta2IsNegative Whether theta2 is in [-pi, 0] instead\n *     of the default [0, pi].\n * @return {!goog.vec.vec3f.Type} return euler so that operations can be\n *     chained together.\n */\ngoog.vec.mat3f.toEulerZXZ = function(mat, euler, opt_theta2IsNegative) {\n  // There is an ambiguity in the sign of sinTheta2 because of the sqrt.\n  var sinTheta2 = Math.sqrt(mat[2] * mat[2] + mat[5] * mat[5]);\n\n  // By default we explicitely constrain theta2 to be in [0, pi],\n  // so sinTheta2 is always positive. We can change the behavior and specify\n  // theta2 to be negative in [-pi, 0] with opt_Theta2IsNegative.\n  var signTheta2 = opt_theta2IsNegative ? -1 : 1;\n\n  if (sinTheta2 > goog.vec.EPSILON) {\n    euler[2] = Math.atan2(mat[2] * signTheta2, mat[5] * signTheta2);\n    euler[1] = Math.atan2(sinTheta2 * signTheta2, mat[8]);\n    euler[0] = Math.atan2(mat[6] * signTheta2, -mat[7] * signTheta2);\n  } else {\n    // There is also an arbitrary choice for theta1 = 0 or theta2 = 0 here.\n    // We assume theta1 = 0 as some applications do not allow the camera to roll\n    // (i.e. have theta1 != 0).\n    euler[0] = 0;\n    euler[1] = Math.atan2(sinTheta2 * signTheta2, mat[8]);\n    euler[2] = Math.atan2(mat[1], mat[0]);\n  }\n\n  // Atan2 outputs angles in [-pi, pi] so we bring them back to [0, 2 * pi].\n  euler[0] = (euler[0] + Math.PI * 2) % (Math.PI * 2);\n  euler[2] = (euler[2] + Math.PI * 2) % (Math.PI * 2);\n  // For theta2 we want the angle to be in [0, pi] or [-pi, 0] depending on\n  // signTheta2.\n  euler[1] =\n      ((euler[1] * signTheta2 + Math.PI * 2) % (Math.PI * 2)) * signTheta2;\n\n  return euler;\n};\n","^?",1579837703000,"^@",["^A",["^V","~$goog.vec.vec3f.Type","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/mat3f.js"],"^S",["^A",["~$goog.vec.mat3f.Type","~$goog.vec.mat3f"]],"^1",true,"^2",["^3","^V","^TG"]],["^ ","^7",[1579837703000],"^8","goog.soy.renderer.js","^9",["^:","goog/soy/renderer.js"],"^;","goog/soy/renderer.js","^<","^=","^>","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a soy renderer that allows registration of\n * injected data (\"globals\") that will be passed into the rendered\n * templates.\n *\n * There is also an interface {@link goog.soy.InjectedDataSupplier} that\n * user should implement to provide the injected data for a specific\n * application. The injected data format is a JavaScript object:\n * <pre>\n * {'dataKey': 'value', 'otherDataKey': 'otherValue'}\n * </pre>\n *\n * The injected data can then be referred to in any soy templates as\n * part of a magic \"ij\" parameter. For example, `$ij.dataKey`\n * will evaluate to 'value' with the above injected data.\n *\n * @author henrywong@google.com (Henry Wong)\n * @author chrishenry@google.com (Chris Henry)\n */\n\ngoog.provide('goog.soy.InjectedDataSupplier');\ngoog.provide('goog.soy.Renderer');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.soy');\ngoog.require('goog.soy.data.SanitizedContent');\ngoog.require('goog.soy.data.SanitizedContentKind');\n\n\n\n/**\n * Creates a new soy renderer. Note that the renderer will only be\n * guaranteed to work correctly within the document scope provided in\n * the DOM helper.\n *\n * @param {?goog.soy.InjectedDataSupplier=} opt_injectedDataSupplier A supplier\n *     that provides an injected data.\n * @param {?goog.dom.DomHelper=} opt_domHelper Optional DOM helper;\n *     defaults to that provided by `goog.dom.getDomHelper()`.\n * @constructor\n */\ngoog.soy.Renderer = function(opt_injectedDataSupplier, opt_domHelper) {\n  /**\n   * @const {!goog.dom.DomHelper}\n   * @private\n   */\n  this.dom_ = opt_domHelper || goog.dom.getDomHelper();\n\n  /**\n   * @const {?goog.soy.InjectedDataSupplier}\n   * @private\n   */\n  this.supplier_ = opt_injectedDataSupplier || null;\n};\n\n\n/**\n * Renders a Soy template into a single node or a document fragment.\n * Delegates to `goog.soy.renderAsFragment`.\n *\n * @param {?function(ARG_TYPES, ?Object<string, *>=):*|\n *     ?function(ARG_TYPES, null=, ?Object<string, *>=):*} template\n *     The Soy template defining the element's content.\n * @param {ARG_TYPES=} opt_templateData The data for the template.\n * @return {!Node} The resulting node or document fragment.\n * @template ARG_TYPES\n */\ngoog.soy.Renderer.prototype.renderAsFragment = function(\n    template, opt_templateData) {\n  var node = goog.soy.renderAsFragment(\n      template, opt_templateData, this.getInjectedData_(), this.dom_);\n  this.handleRender(node, goog.soy.data.SanitizedContentKind.HTML);\n  return node;\n};\n\n\n/**\n * Renders a Soy template into a single node. If the rendered HTML\n * string represents a single node, then that node is returned.\n * Otherwise, a DIV element is returned containing the rendered nodes.\n * Delegates to `goog.soy.renderAsElement`.\n *\n * @param {?function(ARG_TYPES, ?Object<string, *>=):*|\n *     ?function(ARG_TYPES, null=, ?Object<string, *>=):*} template\n *     The Soy template defining the element's content.\n * @param {ARG_TYPES=} opt_templateData The data for the template.\n * @return {!Element} Rendered template contents, wrapped in a parent DIV\n *     element if necessary.\n * @template ARG_TYPES\n */\ngoog.soy.Renderer.prototype.renderAsElement = function(\n    template, opt_templateData) {\n  var element = goog.soy.renderAsElement(\n      template, opt_templateData, this.getInjectedData_(), this.dom_);\n  this.handleRender(element, goog.soy.data.SanitizedContentKind.HTML);\n  return element;\n};\n\n\n/**\n * Renders a Soy template and then set the output string as the\n * innerHTML of the given element. Delegates to `goog.soy.renderElement`.\n *\n * @param {?Element} element The element whose content we are rendering.\n * @param {?function(ARG_TYPES, ?Object<string, *>=):*|\n *     ?function(ARG_TYPES, null=, ?Object<string, *>=):*} template\n *     The Soy template defining the element's content.\n * @param {ARG_TYPES=} opt_templateData The data for the template.\n * @template ARG_TYPES\n */\ngoog.soy.Renderer.prototype.renderElement = function(\n    element, template, opt_templateData) {\n  goog.soy.renderElement(\n      element, template, opt_templateData, this.getInjectedData_());\n  this.handleRender(element, goog.soy.data.SanitizedContentKind.HTML);\n};\n\n\n/**\n * Renders a Soy template and returns the output string.\n * If the template is strict, it must be of kind HTML. To render strict\n * templates of other kinds, use `renderText` (for `kind=\"text\"`) or\n * `renderStrictOfKind`.\n *\n * @param {?function(ARG_TYPES, ?Object<string, *>=):*|\n *     ?function(ARG_TYPES, null=, ?Object<string, *>=):*} template\n *     The Soy template to render.\n * @param {ARG_TYPES=} opt_templateData The data for the template.\n * @return {string} The return value of rendering the template directly.\n * @template ARG_TYPES\n */\ngoog.soy.Renderer.prototype.render = function(template, opt_templateData) {\n  var result = template(opt_templateData || {}, this.getInjectedData_());\n  goog.asserts.assert(\n      !(result instanceof goog.soy.data.SanitizedContent) ||\n          result.contentKind === goog.soy.data.SanitizedContentKind.HTML,\n      'render was called with a strict template of kind other than \"html\"' +\n          ' (consider using renderText or renderStrict)');\n  this.handleRender(null /* node */, result && result.contentKind);\n  return String(result);\n};\n\n\n/**\n * Renders a strict Soy template of kind=\"text\" and returns the output string.\n * It is an error to use renderText on templates of kinds other than \"text\".\n *\n * @param {\n *     ?function(ARG_TYPES, ?Object<string,*>=): ?string|\n *     ?function(ARG_TYPES, null=, ?Object<string, *>=): ?string}\n *     template The Soy template to render.\n * @param {ARG_TYPES=} opt_templateData The data for the template.\n * @return {string} The return value of rendering the template directly.\n * @template ARG_TYPES\n */\ngoog.soy.Renderer.prototype.renderText = function(template, opt_templateData) {\n  var result = template(opt_templateData || {}, this.getInjectedData_());\n  goog.asserts.assertString(\n      result,\n      result instanceof goog.soy.data.SanitizedContent ?\n          'renderText was called with a template of kind other than \"text\"' :\n          'renderText was called with a non-template');\n  return String(result);\n};\n\n\n/**\n * Renders a strict Soy HTML template and returns the output SanitizedHtml\n * object.\n * @param {\n *   ?function(ARG_TYPES, ?Object<string,*>=): ?goog.soy.data.SanitizedHtml|\n *   ?function(ARG_TYPES, ?Object=, ?Object<string, *>=):\n *       ?goog.soy.data.SanitizedHtml} template The Soy template to render.\n * @param {ARG_TYPES=} opt_templateData The data for the template.\n * @return {!goog.soy.data.SanitizedHtml}\n * @template ARG_TYPES\n */\ngoog.soy.Renderer.prototype.renderStrict = function(\n    template, opt_templateData) {\n  return this.renderStrictOfKind(\n      template, opt_templateData, goog.soy.data.SanitizedContentKind.HTML);\n};\n\n\n/**\n * Renders a strict Soy template and returns the output SanitizedUri object.\n *\n * @param {function(ARG_TYPES, ?Object<string, *>=):!goog.soy.data.SanitizedUri|\n *     function(ARG_TYPES, ?Object=, ?Object<string, *>=):\n *     !goog.soy.data.SanitizedUri} template The Soy template to render.\n * @param {ARG_TYPES=} opt_templateData The data for the template.\n * @return {!goog.soy.data.SanitizedUri}\n * @template ARG_TYPES\n */\ngoog.soy.Renderer.prototype.renderStrictUri = function(\n    template, opt_templateData) {\n  return this.renderStrictOfKind(\n      template, opt_templateData, goog.soy.data.SanitizedContentKind.URI);\n};\n\n\n/**\n * Renders a strict Soy template and returns the output SanitizedContent object.\n *\n * @param {?function(ARG_TYPES, ?Object<string, *>=): RETURN_TYPE|\n *     ?function(ARG_TYPES, ?Object=, ?Object<string, *>=): RETURN_TYPE}\n *     template The Soy template to render.\n * @param {ARG_TYPES=} opt_templateData The data for the template.\n * @param {?goog.soy.data.SanitizedContentKind=} opt_kind The output kind to\n *     assert. If null, the template must be of kind=\"html\" (i.e., opt_kind\n *     defaults to goog.soy.data.SanitizedContentKind.HTML).\n * @return {RETURN_TYPE} The SanitizedContent object. This return type is\n *     generic based on the return type of the template, such as\n *     goog.soy.data.SanitizedHtml.\n * @template ARG_TYPES, RETURN_TYPE\n */\ngoog.soy.Renderer.prototype.renderStrictOfKind = function(\n    template, opt_templateData, opt_kind) {\n  var result = template(\n      opt_templateData || {}, this.getInjectedData_(), this.getInjectedData_());\n  goog.asserts.assertInstanceof(\n      result, goog.soy.data.SanitizedContent,\n      'renderStrict cannot be called on a text soy template');\n  goog.asserts.assert(\n      result.contentKind ===\n          (opt_kind || goog.soy.data.SanitizedContentKind.HTML),\n      'renderStrict was called with the wrong kind of template');\n  this.handleRender(null /* node */, result.contentKind);\n  return result;\n};\n\n\n/**\n * Renders a strict Soy template of kind=\"html\" and returns the result as\n * a goog.html.SafeHtml object.\n *\n * Rendering a template that is not a strict template of kind=\"html\" results in\n * a runtime error.\n *\n * @param {?function(ARG_TYPES, ?Object<string, *>=):\n *     !goog.soy.data.SanitizedHtml| ?function(ARG_TYPES, null=, ?Object<string,\n *     *>=): !goog.soy.data.SanitizedHtml} template The Soy template to render.\n * @param {ARG_TYPES=} opt_templateData The data for the template.\n * @return {!goog.html.SafeHtml}\n * @template ARG_TYPES\n */\ngoog.soy.Renderer.prototype.renderSafeHtml = function(\n    template, opt_templateData) {\n  var result = this.renderStrict(template, opt_templateData);\n  // Convert from SanitizedHtml to SafeHtml.\n  return result.toSafeHtml();\n};\n\n\n/**\n * Renders a strict Soy template of kind=\"css\" and returns the result as\n * a goog.html.SafeStyleSheet object.\n *\n * Rendering a template that is not a strict template of kind=\"css\" results in\n * a runtime and compile-time error.\n *\n * @param {?function(ARG_TYPES, ?Object<string, *>=):\n *     !goog.soy.data.SanitizedCss| ?function(ARG_TYPES, null=, ?Object<string,\n *     *>=): !goog.soy.data.SanitizedCss} template The Soy template to render.\n * @param {ARG_TYPES=} opt_templateData The data for the template.\n * @return {!goog.html.SafeStyleSheet}\n * @template ARG_TYPES\n */\ngoog.soy.Renderer.prototype.renderSafeStyleSheet = function(\n    template, opt_templateData) {\n  var result = this.renderStrictOfKind(\n      template, opt_templateData, goog.soy.data.SanitizedContentKind.CSS);\n  return result.toSafeStyleSheet();\n};\n\n\n/**\n * @return {!goog.dom.DomHelper}\n * @protected\n */\ngoog.soy.Renderer.prototype.getDom = function() {\n  return this.dom_;\n};\n\n\n/**\n * Observes rendering of non-text templates by this renderer.\n * @param {?Node} node Relevant node, if available. The node may or may\n *     not be in the document, depending on whether Soy is creating an element\n *     or writing into an existing one.\n * @param {?goog.soy.data.SanitizedContentKind} kind of the template, or null if\n *     it was not strict.\n * @protected\n */\ngoog.soy.Renderer.prototype.handleRender = goog.nullFunction;\n\n\n/**\n * Creates the injectedParams map if necessary and calls the configuration\n * service to prepopulate it.\n * @return {?} The injected params.\n * @private\n */\ngoog.soy.Renderer.prototype.getInjectedData_ = function() {\n  return this.supplier_ ? this.supplier_.getData() : {};\n};\n\n\n\n/**\n * An interface for a supplier that provides Soy injected data.\n * @interface\n */\ngoog.soy.InjectedDataSupplier = function() {};\n\n\n/**\n * Gets the injected data. Implementation may assume that\n * `goog.soy.Renderer` will treat the returned data as\n * immutable.  The renderer will call this every time one of its\n * `render*` methods is called.\n * @return {?} A key-value pair representing the injected data.\n */\ngoog.soy.InjectedDataSupplier.prototype.getData = function() {};\n","^?",1579837703000,"^@",["^A",["^1J","^14","~$goog.soy","^3","^3F","^3I"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/soy/renderer.js"],"^S",["^A",["~$goog.soy.InjectedDataSupplier","~$goog.soy.Renderer"]],"^1",true,"^2",["^3","^1J","^14","^TJ","^3I","^3F"]],["^ ","^7",[1579837703000],"^1=",true,"^8","goog.i18n.localefeature.js","^9",["^:","goog/i18n/localefeature.js"],"^;","goog/i18n/localefeature.js","^<","^=","^>","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\ngoog.module('goog.i18n.LocaleFeature');\n\n/**\n * @fileoverview Provides flag for using ECMAScript 402 features vs.\n * native JavaScript Closure implementations for I18N purposes.\n */\n\n/**\n * @define {boolean} USE_ECMASCRIPT_I18N Evaluated at compile to select\n * ECMAScript Intl object (when true) or JavaScript implementation (false) for\n * I18N purposes.  This set of locales is common across all of the modern\n * browsers and Android implementations available in 2019.\n */\nexports.USE_ECMASCRIPT_I18N =\n    (goog.FEATURESET_YEAR >= 2019 &&\n     (goog.LOCALE == 'am' || goog.LOCALE == 'ar' || goog.LOCALE == 'bg' ||\n      goog.LOCALE == 'bn' || goog.LOCALE == 'ca' || goog.LOCALE == 'cs' ||\n      goog.LOCALE == 'da' || goog.LOCALE == 'de' || goog.LOCALE == 'el' ||\n      goog.LOCALE == 'en' || goog.LOCALE == 'es' || goog.LOCALE == 'et' ||\n      goog.LOCALE == 'fa' || goog.LOCALE == 'fi' || goog.LOCALE == 'fil' ||\n      goog.LOCALE == 'fr' || goog.LOCALE == 'gu' || goog.LOCALE == 'he' ||\n      goog.LOCALE == 'hi' || goog.LOCALE == 'hr' || goog.LOCALE == 'hu' ||\n      goog.LOCALE == 'id' || goog.LOCALE == 'it' || goog.LOCALE == 'ja' ||\n      goog.LOCALE == 'kn' || goog.LOCALE == 'ko' || goog.LOCALE == 'lt' ||\n      goog.LOCALE == 'lv' || goog.LOCALE == 'ml' || goog.LOCALE == 'mr' ||\n      goog.LOCALE == 'ms' || goog.LOCALE == 'nl' || goog.LOCALE == 'pl' ||\n      goog.LOCALE == 'ro' || goog.LOCALE == 'ru' || goog.LOCALE == 'sk' ||\n      goog.LOCALE == 'sl' || goog.LOCALE == 'sr' || goog.LOCALE == 'sv' ||\n      goog.LOCALE == 'sw' || goog.LOCALE == 'ta' || goog.LOCALE == 'te' ||\n      goog.LOCALE == 'th' || goog.LOCALE == 'tr' || goog.LOCALE == 'uk' ||\n      goog.LOCALE == 'vi' || goog.LOCALE == 'en_GB' || goog.LOCALE == 'en-GB' ||\n      goog.LOCALE == 'es_419' || goog.LOCALE == 'es-419' ||\n      goog.LOCALE == 'pt_BR' || goog.LOCALE == 'pt-BR' ||\n      goog.LOCALE == 'pt_PT' || goog.LOCALE == 'pt-PT' ||\n      goog.LOCALE == 'zh_CN' || goog.LOCALE == 'zh-CN' ||\n      goog.LOCALE == 'zh_TW' || goog.LOCALE == 'zh-TW'));\n\n/**\n * @define {boolean} USE_ECMASCRIPT_I18N_RDTF is evaluted to enable\n * ECMAScript support for Intl.RelativeTimeFormat support in\n * browsers based on the locale. Browsers that are considered include:\n * Chrome, Firefox, Edge, and Safari.\n * As of June 2019, RelativeTimeFormat is not yet supported in either\n * Edge or Safari.\n */\nexports.USE_ECMASCRIPT_I18N_RDTF = false;\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/localefeature.js"],"^S",["^A",["~$goog.i18n.LocaleFeature"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.async.run.js","^9",["^:","goog/async/run.js"],"^;","goog/async/run.js","^<","^=","^>","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.async.run');\n\ngoog.require('goog.async.WorkQueue');\ngoog.require('goog.async.nextTick');\ngoog.require('goog.async.throwException');\n\n/**\n * @define {boolean} If true, use the global Promise to implement goog.async.run\n * assuming either the native, or polyfill version will be used. Does still\n * permit tests to use forceNextTick.\n */\ngoog.ASSUME_NATIVE_PROMISE = goog.define('goog.ASSUME_NATIVE_PROMISE', false);\n\n/**\n * Fires the provided callback just before the current callstack unwinds, or as\n * soon as possible after the current JS execution context.\n * @param {function(this:THIS)} callback\n * @param {THIS=} opt_context Object to use as the \"this value\" when calling\n *     the provided function.\n * @template THIS\n */\ngoog.async.run = function(callback, opt_context) {\n  if (!goog.async.run.schedule_) {\n    goog.async.run.initializeRunner_();\n  }\n  if (!goog.async.run.workQueueScheduled_) {\n    // Nothing is currently scheduled, schedule it now.\n    goog.async.run.schedule_();\n    goog.async.run.workQueueScheduled_ = true;\n  }\n\n  goog.async.run.workQueue_.add(callback, opt_context);\n};\n\n\n/**\n * Initializes the function to use to process the work queue.\n * @private\n */\ngoog.async.run.initializeRunner_ = function() {\n  if (goog.ASSUME_NATIVE_PROMISE ||\n      (goog.global.Promise && goog.global.Promise.resolve)) {\n    // Use goog.global.Promise instead of just Promise because the relevant\n    // externs may be missing, and don't alias it because this could confuse the\n    // compiler into thinking the polyfill is required when it should be treated\n    // as optional.\n    var promise = goog.global.Promise.resolve(undefined);\n    goog.async.run.schedule_ = function() {\n      promise.then(goog.async.run.processWorkQueue);\n    };\n  } else {\n    goog.async.run.schedule_ = function() {\n      goog.async.nextTick(goog.async.run.processWorkQueue);\n    };\n  }\n};\n\n\n/**\n * Forces goog.async.run to use nextTick instead of Promise.\n *\n * This should only be done in unit tests. It's useful because MockClock\n * replaces nextTick, but not the browser Promise implementation, so it allows\n * Promise-based code to be tested with MockClock.\n *\n * However, we also want to run promises if the MockClock is no longer in\n * control so we schedule a backup \"setTimeout\" to the unmocked timeout if\n * provided.\n *\n * @param {function(function())=} opt_realSetTimeout\n */\ngoog.async.run.forceNextTick = function(opt_realSetTimeout) {\n  goog.async.run.schedule_ = function() {\n    goog.async.nextTick(goog.async.run.processWorkQueue);\n    if (opt_realSetTimeout) {\n      opt_realSetTimeout(goog.async.run.processWorkQueue);\n    }\n  };\n};\n\n\n/**\n * The function used to schedule work asynchronousely.\n * @private {function()}\n */\ngoog.async.run.schedule_;\n\n\n/** @private {boolean} */\ngoog.async.run.workQueueScheduled_ = false;\n\n\n/** @private {!goog.async.WorkQueue} */\ngoog.async.run.workQueue_ = new goog.async.WorkQueue();\n\n\nif (goog.DEBUG) {\n  /**\n   * Reset the work queue. Only available for tests in debug mode.\n   */\n  goog.async.run.resetQueue = function() {\n    goog.async.run.workQueueScheduled_ = false;\n    goog.async.run.workQueue_ = new goog.async.WorkQueue();\n  };\n}\n\n\n/**\n * Run any pending goog.async.run work items. This function is not intended\n * for general use, but for use by entry point handlers to run items ahead of\n * goog.async.nextTick.\n */\ngoog.async.run.processWorkQueue = function() {\n  // NOTE: additional work queue items may be added while processing.\n  var item = null;\n  while (item = goog.async.run.workQueue_.remove()) {\n    try {\n      item.fn.call(item.scope);\n    } catch (e) {\n      goog.async.throwException(e);\n    }\n    goog.async.run.workQueue_.returnUnused(item);\n  }\n\n  // There are no more work items, allow processing to be scheduled again.\n  goog.async.run.workQueueScheduled_ = false;\n};\n","^?",1579837703000,"^@",["^A",["~$goog.async.throwException","^3","~$goog.async.WorkQueue","~$goog.async.nextTick"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/async/run.js"],"^S",["^A",["^58"]],"^1",true,"^2",["^3","^TO","^TP","^TN"]],["^ ","^7",[1579837703000],"^8","goog.structs.treenode.js","^9",["^:","goog/structs/treenode.js"],"^;","goog/structs/treenode.js","^<","^=","^>","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Generic tree node data structure with arbitrary number of child\n * nodes.\n *\n */\n\ngoog.provide('goog.structs.TreeNode');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.structs.Node');\n\n\n\n/**\n * Generic tree node data structure with arbitrary number of child nodes.\n * It is possible to create a dynamic tree structure by overriding\n * {@link #getParent} and {@link #getChildren} in a subclass. All other getters\n * will automatically work.\n *\n * @param {KEY} key Key.\n * @param {VALUE} value Value.\n * @constructor\n * @extends {goog.structs.Node<KEY, VALUE>}\n * @template KEY, VALUE\n */\ngoog.structs.TreeNode = function(key, value) {\n  goog.structs.Node.call(this, key, value);\n\n  /**\n   * Reference to the parent node or null if it has no parent.\n   * @private {?goog.structs.TreeNode<KEY, VALUE>}\n   */\n  this.parent_ = null;\n\n  /**\n   * Child nodes or null in case of leaf node.\n   * @private {?Array<!goog.structs.TreeNode<KEY, VALUE>>}\n   */\n  this.children_ = null;\n};\ngoog.inherits(goog.structs.TreeNode, goog.structs.Node);\n\n\n/**\n * Constant for empty array to avoid unnecessary allocations.\n * @private\n */\ngoog.structs.TreeNode.EMPTY_ARRAY_ = [];\n\n\n/**\n * @return {!goog.structs.TreeNode} Clone of the tree node without its parent\n *     and child nodes. The key and the value are copied by reference.\n * @override\n */\ngoog.structs.TreeNode.prototype.clone = function() {\n  return new goog.structs.TreeNode(this.getKey(), this.getValue());\n};\n\n\n/**\n * @return {!goog.structs.TreeNode} Clone of the subtree with this node as root.\n */\ngoog.structs.TreeNode.prototype.deepClone = function() {\n  var clone = this.clone();\n  this.forEachChild(function(child) { clone.addChild(child.deepClone()); });\n  return clone;\n};\n\n\n/**\n * @return {goog.structs.TreeNode<KEY, VALUE>} Parent node or null if it has no\n *     parent.\n */\ngoog.structs.TreeNode.prototype.getParent = function() {\n  return this.parent_;\n};\n\n\n/**\n * @return {boolean} Whether the node is a leaf node.\n */\ngoog.structs.TreeNode.prototype.isLeaf = function() {\n  return !this.getChildCount();\n};\n\n\n/**\n * Tells if the node is the last child of its parent. This method helps how to\n * connect the tree nodes with lines: L shapes should be used before the last\n * children and |- shapes before the rest. Schematic tree visualization:\n *\n * <pre>\n * Node1\n * |-Node2\n * | L-Node3\n * |   |-Node4\n * |   L-Node5\n * L-Node6\n * </pre>\n *\n * @return {boolean} Whether the node has parent and is the last child of it.\n */\ngoog.structs.TreeNode.prototype.isLastChild = function() {\n  var parent = this.getParent();\n  return Boolean(parent && this == goog.array.peek(parent.getChildren()));\n};\n\n\n/**\n * @return {!Array<!goog.structs.TreeNode<KEY, VALUE>>} Immutable child nodes.\n */\ngoog.structs.TreeNode.prototype.getChildren = function() {\n  return this.children_ || goog.structs.TreeNode.EMPTY_ARRAY_;\n};\n\n\n/**\n * Gets the child node of this node at the given index.\n * @param {number} index Child index.\n * @return {goog.structs.TreeNode<KEY, VALUE>} The node at the given index or\n *     null if not found.\n */\ngoog.structs.TreeNode.prototype.getChildAt = function(index) {\n  return this.getChildren()[index] || null;\n};\n\n\n/**\n * @return {number} The number of children.\n */\ngoog.structs.TreeNode.prototype.getChildCount = function() {\n  return this.getChildren().length;\n};\n\n\n/**\n * @return {number} The number of ancestors of the node.\n */\ngoog.structs.TreeNode.prototype.getDepth = function() {\n  var depth = 0;\n  var node = this;\n  while (node.getParent()) {\n    depth++;\n    node = node.getParent();\n  }\n  return depth;\n};\n\n\n/**\n * @return {!Array<!goog.structs.TreeNode<KEY, VALUE>>} All ancestor nodes in\n *     bottom-up order.\n */\ngoog.structs.TreeNode.prototype.getAncestors = function() {\n  var ancestors = [];\n  var node = this.getParent();\n  while (node) {\n    ancestors.push(node);\n    node = node.getParent();\n  }\n  return ancestors;\n};\n\n\n/**\n * @return {!goog.structs.TreeNode<KEY, VALUE>} The root of the tree structure,\n *     i.e. the farthest ancestor of the node or the node itself if it has no\n *     parents.\n */\ngoog.structs.TreeNode.prototype.getRoot = function() {\n  var root = this;\n  while (root.getParent()) {\n    root = root.getParent();\n  }\n  return root;\n};\n\n\n/**\n * Builds a nested array structure from the node keys in this node's subtree to\n * facilitate testing tree operations that change the hierarchy.\n * @return {!Array<KEY>} The structure of this node's descendants as nested\n *     array of node keys. The number of unclosed opening brackets up to a\n *     particular node is proportional to the indentation of that node in the\n *     graphical representation of the tree. Example:\n *     <pre>\n *       this\n *       |- child1\n *       |  L- grandchild\n *       L- child2\n *     </pre>\n *     is represented as ['child1', ['grandchild'], 'child2'].\n */\ngoog.structs.TreeNode.prototype.getSubtreeKeys = function() {\n  var ret = [];\n  this.forEachChild(function(child) {\n    ret.push(child.getKey());\n    if (!child.isLeaf()) {\n      ret.push(child.getSubtreeKeys());\n    }\n  });\n  return ret;\n};\n\n\n/**\n * Tells whether this node is the ancestor of the given node.\n * @param {!goog.structs.TreeNode<KEY, VALUE>} node A node.\n * @return {boolean} Whether this node is the ancestor of `node`.\n */\ngoog.structs.TreeNode.prototype.contains = function(node) {\n  var current = node;\n  do {\n    current = current.getParent();\n  } while (current && current != this);\n  return Boolean(current);\n};\n\n\n/**\n * Finds the deepest common ancestor of the given nodes. The concept of\n * ancestor is not strict in this case, it includes the node itself.\n * @param {...!goog.structs.TreeNode<KEY, VALUE>} var_args The nodes.\n * @return {goog.structs.TreeNode<KEY, VALUE>} The common ancestor of the nodes\n *     or null if they are from different trees.\n * @template KEY, VALUE\n */\ngoog.structs.TreeNode.findCommonAncestor = function(var_args) {\n  /** @type {goog.structs.TreeNode} */\n  var ret = arguments[0];\n  if (!ret) {\n    return null;\n  }\n\n  var retDepth = ret.getDepth();\n  for (var i = 1; i < arguments.length; i++) {\n    /** @type {goog.structs.TreeNode} */\n    var node = arguments[i];\n    var depth = node.getDepth();\n    while (node != ret) {\n      if (depth <= retDepth) {\n        ret = ret.getParent();\n        retDepth--;\n      }\n      if (depth > retDepth) {\n        node = node.getParent();\n        depth--;\n      }\n    }\n  }\n\n  return ret;\n};\n\n\n/**\n * Returns a node whose key matches the given one in the hierarchy rooted at\n * this node. The hierarchy is searched using an in-order traversal.\n * @param {KEY} key The key to search for.\n * @return {goog.structs.TreeNode<KEY, VALUE>} The node with the given key, or\n *     null if no node with the given key exists in the hierarchy.\n */\ngoog.structs.TreeNode.prototype.getNodeByKey = function(key) {\n  if (this.getKey() == key) {\n    return this;\n  }\n  var children = this.getChildren();\n  for (var i = 0; i < children.length; i++) {\n    var descendant = children[i].getNodeByKey(key);\n    if (descendant) {\n      return descendant;\n    }\n  }\n  return null;\n};\n\n\n/**\n * Traverses all child nodes.\n * @param {function(this:THIS, !goog.structs.TreeNode<KEY, VALUE>, number,\n *     !Array<!goog.structs.TreeNode<KEY, VALUE>>)} f Callback function. It\n *     takes the node, its index and the array of all child nodes as arguments.\n * @param {THIS=} opt_this The object to be used as the value of `this`\n *     within `f`.\n * @template THIS\n */\ngoog.structs.TreeNode.prototype.forEachChild = function(f, opt_this) {\n  goog.array.forEach(this.getChildren(), f, opt_this);\n};\n\n\n/**\n * Traverses all child nodes recursively in preorder.\n * @param {function(this:THIS, !goog.structs.TreeNode<KEY, VALUE>)} f Callback\n *     function.  It takes the node as argument.\n * @param {THIS=} opt_this The object to be used as the value of `this`\n *     within `f`.\n * @template THIS\n */\ngoog.structs.TreeNode.prototype.forEachDescendant = function(f, opt_this) {\n  var children = this.getChildren();\n  for (var i = 0; i < children.length; i++) {\n    f.call(opt_this, children[i]);\n    children[i].forEachDescendant(f, opt_this);\n  }\n};\n\n\n/**\n * Traverses the subtree with the possibility to skip branches. Starts with\n * this node, and visits the descendant nodes depth-first, in preorder.\n * @param {function(this:THIS, !goog.structs.TreeNode<KEY, VALUE>):\n *     (boolean|undefined)} f Callback function. It takes the node as argument.\n *     The children of this node will be visited if the callback returns true or\n *     undefined, and will be skipped if the callback returns false.\n * @param {THIS=} opt_this The object to be used as the value of `this`\n *     within `f`.\n * @template THIS\n */\ngoog.structs.TreeNode.prototype.traverse = function(f, opt_this) {\n  if (f.call(opt_this, this) !== false) {\n    var children = this.getChildren();\n    for (var i = 0; i < children.length; i++) {\n      children[i].traverse(f, opt_this);\n    }\n  }\n};\n\n\n/**\n * Sets the parent node of this node. The callers must ensure that the parent\n * node and only that has this node among its children.\n * @param {goog.structs.TreeNode<KEY, VALUE>} parent The parent to set. If\n *     null, the node will be detached from the tree.\n * @protected\n */\ngoog.structs.TreeNode.prototype.setParent = function(parent) {\n  this.parent_ = parent;\n};\n\n\n/**\n * Appends a child node to this node.\n * @param {!goog.structs.TreeNode<KEY, VALUE>} child Orphan child node.\n */\ngoog.structs.TreeNode.prototype.addChild = function(child) {\n  this.addChildAt(child, this.children_ ? this.children_.length : 0);\n};\n\n\n/**\n * Inserts a child node at the given index.\n * @param {!goog.structs.TreeNode<KEY, VALUE>} child Orphan child node.\n * @param {number} index The position to insert at.\n */\ngoog.structs.TreeNode.prototype.addChildAt = function(child, index) {\n  goog.asserts.assert(!child.getParent());\n  child.setParent(this);\n  this.children_ = this.children_ || [];\n  goog.asserts.assert(index >= 0 && index <= this.children_.length);\n  goog.array.insertAt(this.children_, child, index);\n};\n\n\n/**\n * Replaces a child node at the given index.\n * @param {!goog.structs.TreeNode<KEY, VALUE>} newChild Child node to set. It\n *     must not have parent node.\n * @param {number} index Valid index of the old child to replace.\n * @return {!goog.structs.TreeNode<KEY, VALUE>} The original child node,\n *     detached from its parent.\n */\ngoog.structs.TreeNode.prototype.replaceChildAt = function(newChild, index) {\n  goog.asserts.assert(\n      !newChild.getParent(), 'newChild must not have parent node');\n  var children = this.getChildren();\n  var oldChild = children[index];\n  goog.asserts.assert(oldChild, 'Invalid child or child index is given.');\n  oldChild.setParent(null);\n  children[index] = newChild;\n  newChild.setParent(this);\n  return oldChild;\n};\n\n\n/**\n * Replaces the given child node.\n * @param {!goog.structs.TreeNode<KEY, VALUE>} newChild New node to replace\n *     `oldChild`. It must not have parent node.\n * @param {!goog.structs.TreeNode<KEY, VALUE>} oldChild Existing child node to\n *     be replaced.\n * @return {!goog.structs.TreeNode<KEY, VALUE>} The replaced child node\n *     detached from its parent.\n */\ngoog.structs.TreeNode.prototype.replaceChild = function(newChild, oldChild) {\n  return this.replaceChildAt(\n      newChild, goog.array.indexOf(this.getChildren(), oldChild));\n};\n\n\n/**\n * Removes the child node at the given index.\n * @param {number} index The position to remove from.\n * @return {goog.structs.TreeNode<KEY, VALUE>} The removed node if any.\n */\ngoog.structs.TreeNode.prototype.removeChildAt = function(index) {\n  var child = this.children_ && this.children_[index];\n  if (child) {\n    child.setParent(null);\n    goog.array.removeAt(this.children_, index);\n    if (this.children_.length == 0) {\n      this.children_ = null;\n    }\n    return child;\n  }\n  return null;\n};\n\n\n/**\n * Removes the given child node of this node.\n * @param {goog.structs.TreeNode<KEY, VALUE>} child The node to remove.\n * @return {goog.structs.TreeNode<KEY, VALUE>} The removed node if any.\n */\ngoog.structs.TreeNode.prototype.removeChild = function(child) {\n  return child &&\n      this.removeChildAt(goog.array.indexOf(this.getChildren(), child));\n};\n\n\n/**\n * Removes all child nodes of this node.\n */\ngoog.structs.TreeNode.prototype.removeChildren = function() {\n  if (this.children_) {\n    for (var i = 0; i < this.children_.length; i++) {\n      this.children_[i].setParent(null);\n    }\n    this.children_ = null;\n  }\n};\n","^?",1579837703000,"^@",["^A",["^1J","^3","^1S","~$goog.structs.Node"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/treenode.js"],"^S",["^A",["~$goog.structs.TreeNode"]],"^1",true,"^2",["^3","^1S","^1J","^TQ"]],["^ ","^7",[1579837703000],"^8","goog.net.httpstatus.js","^9",["^:","goog/net/httpstatus.js"],"^;","goog/net/httpstatus.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Constants for HTTP status codes.\n */\n\ngoog.provide('goog.net.HttpStatus');\n\n\n/**\n * HTTP Status Codes defined in RFC 2616, RFC 6585, RFC 4918 and RFC 7538.\n * @see http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html\n * @see http://tools.ietf.org/html/rfc6585\n * @see https://tools.ietf.org/html/rfc4918\n * @see https://tools.ietf.org/html/rfc7538\n * @enum {number}\n */\ngoog.net.HttpStatus = {\n  // Informational 1xx\n  CONTINUE: 100,\n  SWITCHING_PROTOCOLS: 101,\n\n  // Successful 2xx\n  OK: 200,\n  CREATED: 201,\n  ACCEPTED: 202,\n  NON_AUTHORITATIVE_INFORMATION: 203,\n  NO_CONTENT: 204,\n  RESET_CONTENT: 205,\n  PARTIAL_CONTENT: 206,\n  MULTI_STATUS: 207,\n\n  // Redirection 3xx\n  MULTIPLE_CHOICES: 300,\n  MOVED_PERMANENTLY: 301,\n  FOUND: 302,\n  SEE_OTHER: 303,\n  NOT_MODIFIED: 304,\n  USE_PROXY: 305,\n  TEMPORARY_REDIRECT: 307,\n  PERMANENT_REDIRECT: 308,\n\n  // Client Error 4xx\n  BAD_REQUEST: 400,\n  UNAUTHORIZED: 401,\n  PAYMENT_REQUIRED: 402,\n  FORBIDDEN: 403,\n  NOT_FOUND: 404,\n  METHOD_NOT_ALLOWED: 405,\n  NOT_ACCEPTABLE: 406,\n  PROXY_AUTHENTICATION_REQUIRED: 407,\n  REQUEST_TIMEOUT: 408,\n  CONFLICT: 409,\n  GONE: 410,\n  LENGTH_REQUIRED: 411,\n  PRECONDITION_FAILED: 412,\n  REQUEST_ENTITY_TOO_LARGE: 413,\n  REQUEST_URI_TOO_LONG: 414,\n  UNSUPPORTED_MEDIA_TYPE: 415,\n  REQUEST_RANGE_NOT_SATISFIABLE: 416,\n  EXPECTATION_FAILED: 417,\n  UNPROCESSABLE_ENTITY: 422,\n  LOCKED: 423,\n  FAILED_DEPENDENCY: 424,\n  PRECONDITION_REQUIRED: 428,\n  TOO_MANY_REQUESTS: 429,\n  REQUEST_HEADER_FIELDS_TOO_LARGE: 431,\n\n  // Server Error 5xx\n  INTERNAL_SERVER_ERROR: 500,\n  NOT_IMPLEMENTED: 501,\n  BAD_GATEWAY: 502,\n  SERVICE_UNAVAILABLE: 503,\n  GATEWAY_TIMEOUT: 504,\n  HTTP_VERSION_NOT_SUPPORTED: 505,\n  INSUFFICIENT_STORAGE: 507,\n  NETWORK_AUTHENTICATION_REQUIRED: 511,\n\n  /*\n   * IE returns this code for 204 due to its use of URLMon, which returns this\n   * code for 'Operation Aborted'. The status text is 'Unknown', the response\n   * headers are ''. Known to occur on IE 6 on XP through IE9 on Win7.\n   */\n  QUIRK_IE_NO_CONTENT: 1223\n};\n\n\n/**\n * Returns whether the given status should be considered successful.\n *\n * Successful codes are OK (200), CREATED (201), ACCEPTED (202),\n * NO CONTENT (204), PARTIAL CONTENT (206), NOT MODIFIED (304),\n * and IE's no content code (1223).\n *\n * @param {number} status The status code to test.\n * @return {boolean} Whether the status code should be considered successful.\n */\ngoog.net.HttpStatus.isSuccess = function(status) {\n  switch (status) {\n    case goog.net.HttpStatus.OK:\n    case goog.net.HttpStatus.CREATED:\n    case goog.net.HttpStatus.ACCEPTED:\n    case goog.net.HttpStatus.NO_CONTENT:\n    case goog.net.HttpStatus.PARTIAL_CONTENT:\n    case goog.net.HttpStatus.NOT_MODIFIED:\n    case goog.net.HttpStatus.QUIRK_IE_NO_CONTENT:\n      return true;\n\n    default:\n      return false;\n  }\n};\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/httpstatus.js"],"^S",["^A",["^SN"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.testing.stacktrace.js","^9",["^:","goog/testing/stacktrace.js"],"^;","goog/testing/stacktrace.js","^<","^=","^>","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Tools for parsing and pretty printing error stack traces.\n *\n */\n\ngoog.setTestOnly('goog.testing.stacktrace');\ngoog.provide('goog.testing.stacktrace');\ngoog.provide('goog.testing.stacktrace.Frame');\n\n\n\n/**\n * Class representing one stack frame.\n * @param {string} context Context object, empty in case of global functions or\n *     if the browser doesn't provide this information.\n * @param {string} name Function name, empty in case of anonymous functions.\n * @param {string} alias Alias of the function if available. For example the\n *     function name will be 'c' and the alias will be 'b' if the function is\n *     defined as <code>a.b = function c() {};</code>.\n * @param {string} path File path or URL including line number and optionally\n *     column number separated by colons.\n * @constructor\n * @final\n */\ngoog.testing.stacktrace.Frame = function(context, name, alias, path) {\n  this.context_ = context;\n  this.name_ = name;\n  this.alias_ = alias;\n  this.path_ = path;\n};\n\n\n/**\n * @return {string} The function name or empty string if the function is\n *     anonymous and the object field which it's assigned to is unknown.\n */\ngoog.testing.stacktrace.Frame.prototype.getName = function() {\n  return this.name_;\n};\n\n\n/**\n * @return {boolean} Whether the stack frame contains an anonymous function.\n */\ngoog.testing.stacktrace.Frame.prototype.isAnonymous = function() {\n  return !this.name_ || this.context_ == '[object Object]';\n};\n\n\n/**\n * Brings one frame of the stack trace into a common format across browsers.\n * @return {string} Pretty printed stack frame.\n */\ngoog.testing.stacktrace.Frame.prototype.toCanonicalString = function() {\n  const htmlEscape = goog.testing.stacktrace.htmlEscape_;\n  const deobfuscate = goog.testing.stacktrace.maybeDeobfuscateFunctionName_;\n\n  const canonical = [\n    this.context_ ? htmlEscape(this.context_) + '.' : '',\n    this.name_ ? htmlEscape(deobfuscate(this.name_)) : 'anonymous',\n    this.alias_ ? ' [as ' + htmlEscape(deobfuscate(this.alias_)) + ']' : ''\n  ];\n\n  if (this.path_) {\n    canonical.push(' at ');\n    canonical.push(htmlEscape(this.path_));\n  }\n  return canonical.join('');\n};\n\n\n/**\n * Maximum number of steps while the call chain is followed.\n * @private {number}\n * @const\n */\ngoog.testing.stacktrace.MAX_DEPTH_ = 20;\n\n\n/**\n * Maximum length of a string that can be matched with a RegExp on\n * Firefox 3x. Exceeding this approximate length will cause string.match\n * to exceed Firefox's stack quota. This situation can be encountered\n * when goog.globalEval is invoked with a long argument; such as\n * when loading a module.\n * @private {number}\n * @const\n */\ngoog.testing.stacktrace.MAX_FIREFOX_FRAMESTRING_LENGTH_ = 500000;\n\n\n/**\n * RegExp pattern for JavaScript identifiers. We don't support Unicode\n * identifiers defined in ECMAScript v3.\n * @private {string}\n * @const\n */\ngoog.testing.stacktrace.IDENTIFIER_PATTERN_ = '[a-zA-Z_$][\\\\w$]*';\n\n\n/**\n * RegExp pattern for function name alias in the V8 stack trace.\n * @private {string}\n * @const\n */\ngoog.testing.stacktrace.V8_ALIAS_PATTERN_ =\n    '(?: \\\\[as (' + goog.testing.stacktrace.IDENTIFIER_PATTERN_ + ')\\\\])?';\n\n\n/**\n * RegExp pattern for the context of a function call in a V8 stack trace.\n * Creates an optional submatch for the namespace identifier including the\n * \"new\" keyword for constructor calls (e.g. \"new foo.Bar\").\n * @private {string}\n * @const\n */\ngoog.testing.stacktrace.V8_CONTEXT_PATTERN_ =\n    '(?:((?:new )?(?:\\\\[object Object\\\\]|' +\n    goog.testing.stacktrace.IDENTIFIER_PATTERN_ + '(?:\\\\.' +\n    goog.testing.stacktrace.IDENTIFIER_PATTERN_ + ')*))\\\\.)?';\n\n\n/**\n * RegExp pattern for function names and constructor calls in the V8 stack\n * trace.\n * @private {string}\n * @const\n */\ngoog.testing.stacktrace.V8_FUNCTION_NAME_PATTERN_ = '(?:new )?(?:' +\n    goog.testing.stacktrace.IDENTIFIER_PATTERN_ + '|<anonymous>)';\n\n\n/**\n * RegExp pattern for function call in the V8 stack trace. Creates 3 submatches\n * with context object (optional), function name and function alias (optional).\n * @private {string}\n * @const\n */\ngoog.testing.stacktrace.V8_FUNCTION_CALL_PATTERN_ = ' ' +\n    goog.testing.stacktrace.V8_CONTEXT_PATTERN_ + '(' +\n    goog.testing.stacktrace.V8_FUNCTION_NAME_PATTERN_ + ')' +\n    goog.testing.stacktrace.V8_ALIAS_PATTERN_;\n\n\n/**\n * RegExp pattern for an URL + position inside the file.\n * @private {string}\n * @const\n */\ngoog.testing.stacktrace.URL_PATTERN_ =\n    '((?:http|https|file)://[^\\\\s)]+|javascript:.*)';\n\n\n/**\n * RegExp pattern for an URL + line number + column number in V8.\n * The URL is either in submatch 1 or submatch 2.\n * @private {string}\n * @const\n */\ngoog.testing.stacktrace.CHROME_URL_PATTERN_ = ' (?:' +\n    '\\\\(unknown source\\\\)' +\n    '|' +\n    '\\\\(native\\\\)' +\n    '|' +\n    '\\\\((.+)\\\\)|(.+))';\n\n\n/**\n * Regular expression for parsing one stack frame in V8. For more information\n * on V8 stack frame formats, see\n * https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi.\n * @private {!RegExp}\n * @const\n */\ngoog.testing.stacktrace.V8_STACK_FRAME_REGEXP_ = new RegExp(\n    '^    at' +\n    '(?:' + goog.testing.stacktrace.V8_FUNCTION_CALL_PATTERN_ + ')?' +\n    goog.testing.stacktrace.CHROME_URL_PATTERN_ + '$');\n\n\n/**\n * RegExp pattern for function call in the Firefox stack trace.\n * Creates 2 submatches with function name (optional) and arguments.\n *\n * Modern FF produces stack traces like:\n *    foo@url:1:2\n *    a.b.foo@url:3:4\n *\n * @private {string}\n * @const\n */\ngoog.testing.stacktrace.FIREFOX_FUNCTION_CALL_PATTERN_ = '(' +\n    goog.testing.stacktrace.IDENTIFIER_PATTERN_ + '(?:\\\\.' +\n    goog.testing.stacktrace.IDENTIFIER_PATTERN_ + ')*' +\n    ')?' +\n    '(\\\\(.*\\\\))?@';\n\n\n/**\n * Regular expression for parsing one stack frame in Firefox.\n * @private {!RegExp}\n * @const\n */\ngoog.testing.stacktrace.FIREFOX_STACK_FRAME_REGEXP_ = new RegExp(\n    '^' + goog.testing.stacktrace.FIREFOX_FUNCTION_CALL_PATTERN_ + '(?::0|' +\n    goog.testing.stacktrace.URL_PATTERN_ + ')$');\n\n\n/**\n * RegExp pattern for an anonymous function call in an Opera stack frame.\n * Creates 2 (optional) submatches: the context object and function name.\n * @private {string}\n * @const\n */\ngoog.testing.stacktrace.OPERA_ANONYMOUS_FUNCTION_NAME_PATTERN_ =\n    '<anonymous function(?:\\\\: ' +\n    '(?:(' + goog.testing.stacktrace.IDENTIFIER_PATTERN_ + '(?:\\\\.' +\n    goog.testing.stacktrace.IDENTIFIER_PATTERN_ + ')*)\\\\.)?' +\n    '(' + goog.testing.stacktrace.IDENTIFIER_PATTERN_ + '))?>';\n\n\n/**\n * RegExp pattern for a function call in an Opera stack frame.\n * Creates 4 (optional) submatches: the function name (if not anonymous),\n * the aliased context object and function name (if anonymous), and the\n * function call arguments.\n * @private {string}\n * @const\n */\ngoog.testing.stacktrace.OPERA_FUNCTION_CALL_PATTERN_ = '(?:(?:(' +\n    goog.testing.stacktrace.IDENTIFIER_PATTERN_ + ')|' +\n    goog.testing.stacktrace.OPERA_ANONYMOUS_FUNCTION_NAME_PATTERN_ +\n    ')(\\\\(.*\\\\)))?@';\n\n\n/**\n * Regular expression for parsing on stack frame in Opera 11.68 - 12.17.\n * Newer versions of Opera use V8 and stack frames should match against\n * goog.testing.stacktrace.V8_STACK_FRAME_REGEXP_.\n * @private {!RegExp}\n * @const\n */\ngoog.testing.stacktrace.OPERA_STACK_FRAME_REGEXP_ = new RegExp(\n    '^' + goog.testing.stacktrace.OPERA_FUNCTION_CALL_PATTERN_ +\n    goog.testing.stacktrace.URL_PATTERN_ + '?$');\n\n\n/**\n * Regular expression for finding the function name in its source.\n * @private {!RegExp}\n * @const\n */\ngoog.testing.stacktrace.FUNCTION_SOURCE_REGEXP_ = new RegExp(\n    '^function (' + goog.testing.stacktrace.IDENTIFIER_PATTERN_ + ')');\n\n\n/**\n * RegExp pattern for function call in a IE stack trace. This expression allows\n * for identifiers like 'Anonymous function', 'eval code', and 'Global code'.\n * @private {string}\n * @const\n */\ngoog.testing.stacktrace.IE_FUNCTION_CALL_PATTERN_ = '(' +\n    goog.testing.stacktrace.IDENTIFIER_PATTERN_ + '(?:\\\\.' +\n    goog.testing.stacktrace.IDENTIFIER_PATTERN_ + ')*' +\n    '(?:\\\\s+\\\\w+)*)';\n\n\n/**\n * Regular expression for parsing a stack frame in IE.\n * @private {!RegExp}\n * @const\n */\ngoog.testing.stacktrace.IE_STACK_FRAME_REGEXP_ = new RegExp(\n    '^   at ' + goog.testing.stacktrace.IE_FUNCTION_CALL_PATTERN_ + '\\\\s*\\\\(' +\n    '(' +\n    'eval code:[^)]*' +\n    '|' +\n    'Unknown script code:[^)]*' +\n    '|' + goog.testing.stacktrace.URL_PATTERN_ + ')\\\\)?$');\n\n\n/**\n * Creates a stack trace by following the call chain. Based on\n * {@link goog.debug.getStacktrace}.\n * @return {!Array<!goog.testing.stacktrace.Frame>} Stack frames.\n * @private\n * @suppress {es5Strict}\n */\ngoog.testing.stacktrace.followCallChain_ = function() {\n  const frames = [];\n  let fn = arguments.callee.caller;\n  let depth = 0;\n\n  while (fn && depth < goog.testing.stacktrace.MAX_DEPTH_) {\n    const fnString = Function.prototype.toString.call(fn);\n    const match =\n        fnString.match(goog.testing.stacktrace.FUNCTION_SOURCE_REGEXP_);\n    const functionName = match ? match[1] : '';\n\n    frames.push(new goog.testing.stacktrace.Frame('', functionName, '', ''));\n\n\n    try {\n      fn = fn.caller;\n    } catch (e) {\n      break;\n    }\n    depth++;\n  }\n\n  return frames;\n};\n\n\n/**\n * Parses one stack frame.\n * @param {string} frameStr The stack frame as string.\n * @return {goog.testing.stacktrace.Frame} Stack frame object or null if the\n *     parsing failed.\n * @private\n */\ngoog.testing.stacktrace.parseStackFrame_ = function(frameStr) {\n  // This match includes newer versions of Opera (15+).\n  let m = frameStr.match(goog.testing.stacktrace.V8_STACK_FRAME_REGEXP_);\n  if (m) {\n    return new goog.testing.stacktrace.Frame(\n        m[1] || '', m[2] || '', m[3] || '', m[4] || m[5] || m[6] || '');\n  }\n\n  // TODO(johnlenz): remove this.  It seems like if this was useful it would\n  // need to be before the V8 check.\n  if (frameStr.length >\n      goog.testing.stacktrace.MAX_FIREFOX_FRAMESTRING_LENGTH_) {\n    return null;\n  }\n\n  m = frameStr.match(goog.testing.stacktrace.FIREFOX_STACK_FRAME_REGEXP_);\n  if (m) {\n    return new goog.testing.stacktrace.Frame('', m[1] || '', '', m[3] || '');\n  }\n\n  // Match against Presto Opera 11.68 - 12.17.\n  m = frameStr.match(goog.testing.stacktrace.OPERA_STACK_FRAME_REGEXP_);\n  if (m) {\n    return new goog.testing.stacktrace.Frame(\n        m[2] || '', m[1] || m[3] || '', '', m[5] || '');\n  }\n\n  m = frameStr.match(goog.testing.stacktrace.IE_STACK_FRAME_REGEXP_);\n  if (m) {\n    return new goog.testing.stacktrace.Frame('', m[1] || '', '', m[2] || '');\n  }\n\n  return null;\n};\n\n\n/**\n * Function to deobfuscate function names.\n * @type {function(string): string}\n * @private\n */\ngoog.testing.stacktrace.deobfuscateFunctionName_;\n\n\n/**\n * Sets function to deobfuscate function names.\n * @param {function(string): string} fn function to deobfuscate function names.\n */\ngoog.testing.stacktrace.setDeobfuscateFunctionName = function(fn) {\n  goog.testing.stacktrace.deobfuscateFunctionName_ = fn;\n};\n\n\n/**\n * Deobfuscates a compiled function name with the function passed to\n * {@link #setDeobfuscateFunctionName}. Returns the original function name if\n * the deobfuscator hasn't been set.\n * @param {string} name The function name to deobfuscate.\n * @return {string} The deobfuscated function name.\n * @private\n */\ngoog.testing.stacktrace.maybeDeobfuscateFunctionName_ = function(name) {\n  return goog.testing.stacktrace.deobfuscateFunctionName_ ?\n      goog.testing.stacktrace.deobfuscateFunctionName_(name) :\n      name;\n};\n\n\n/**\n * Escapes the special character in HTML.\n * @param {string} text Plain text.\n * @return {string} Escaped text.\n * @private\n */\ngoog.testing.stacktrace.htmlEscape_ = function(text) {\n  return text.replace(/&/g, '&amp;')\n      .replace(/</g, '&lt;')\n      .replace(/>/g, '&gt;')\n      .replace(/\"/g, '&quot;');\n};\n\n\n/**\n * Converts the stack frames into canonical format. Chops the beginning and the\n * end of it which come from the testing environment, not from the test itself.\n * @param {!Array<goog.testing.stacktrace.Frame>} frames The frames.\n * @return {string} Canonical, pretty printed stack trace.\n * @private\n */\ngoog.testing.stacktrace.framesToString_ = function(frames) {\n  // Removes the anonymous calls from the end of the stack trace (they come\n  // from testrunner.js, testcase.js and asserts.js), so the stack trace will\n  // end with the test... method.\n  let lastIndex = frames.length - 1;\n  while (frames[lastIndex] && frames[lastIndex].isAnonymous()) {\n    lastIndex--;\n  }\n\n  // Removes the beginning of the stack trace until the call of the private\n  // _assert function (inclusive), so the stack trace will begin with a public\n  // asserter. Does nothing if _assert is not present in the stack trace.\n  let privateAssertIndex = -1;\n  for (let i = 0; i < frames.length; i++) {\n    if (frames[i] && frames[i].getName() == '_assert') {\n      privateAssertIndex = i;\n      break;\n    }\n  }\n\n  const canonical = [];\n  for (let i = privateAssertIndex + 1; i <= lastIndex; i++) {\n    canonical.push('> ');\n    if (frames[i]) {\n      canonical.push(frames[i].toCanonicalString());\n    } else {\n      canonical.push('(unknown)');\n    }\n    canonical.push('\\n');\n  }\n  return canonical.join('');\n};\n\n\n/**\n * Parses the browser's native stack trace.\n * @param {string} stack Stack trace.\n * @return {!Array<goog.testing.stacktrace.Frame>} Stack frames. The\n *     unrecognized frames will be nulled out.\n * @private\n */\ngoog.testing.stacktrace.parse_ = function(stack) {\n  const lines = stack.replace(/\\s*$/, '').split('\\n');\n  const frames = [];\n  for (let i = 0; i < lines.length; i++) {\n    frames.push(goog.testing.stacktrace.parseStackFrame_(lines[i]));\n  }\n  return frames;\n};\n\n\n/**\n * Brings the stack trace into a common format across browsers.\n * @param {string} stack Browser-specific stack trace.\n * @return {string} Same stack trace in common format.\n */\ngoog.testing.stacktrace.canonicalize = function(stack) {\n  const frames = goog.testing.stacktrace.parse_(stack);\n  return goog.testing.stacktrace.framesToString_(frames);\n};\n\n\n/**\n * Returns the native stack trace.\n * @return {string|!Array<!CallSite>}\n * @private\n */\ngoog.testing.stacktrace.getNativeStack_ = function() {\n  const tmpError = new Error();\n  if (tmpError.stack) {\n    return tmpError.stack;\n  }\n\n  // IE10 will only create a stack trace when the Error is thrown.\n  // We use null.x() to throw an exception because the closure compiler may\n  // replace \"throw\" with a function call in an attempt to minimize the binary\n  // size, which in turn has the side effect of adding an unwanted stack frame.\n  try {\n    null.x();\n  } catch (e) {\n    return e.stack;\n  }\n  return '';\n};\n\n\n/**\n * Gets the native stack trace if available otherwise follows the call chain.\n * @return {string} The stack trace in canonical format.\n */\ngoog.testing.stacktrace.get = function() {\n  const stack = goog.testing.stacktrace.getNativeStack_();\n  let frames;\n  if (!stack) {\n    frames = goog.testing.stacktrace.followCallChain_();\n  } else if (goog.isArray(stack)) {\n    frames = goog.testing.stacktrace.callSitesToFrames_(stack);\n  } else {\n    frames = goog.testing.stacktrace.parse_(stack);\n  }\n  return goog.testing.stacktrace.framesToString_(frames);\n};\n\n\n/**\n * Converts an array of CallSite (elements of a stack trace in V8) to an array\n * of Frames.\n * @param {!Array<!CallSite>} stack The stack as an array of CallSites.\n * @return {!Array<!goog.testing.stacktrace.Frame>} The stack as an array of\n *     Frames.\n * @private\n */\ngoog.testing.stacktrace.callSitesToFrames_ = function(stack) {\n  const frames = [];\n  for (let i = 0; i < stack.length; i++) {\n    const callSite = stack[i];\n    const functionName = callSite.getFunctionName() || 'unknown';\n    const fileName = callSite.getFileName();\n    const path = fileName ? fileName + ':' + callSite.getLineNumber() + ':' +\n            callSite.getColumnNumber() :\n                            'unknown';\n    frames.push(new goog.testing.stacktrace.Frame('', functionName, '', path));\n  }\n  return frames;\n};\n\n\ngoog.exportSymbol(\n    'setDeobfuscateFunctionName',\n    goog.testing.stacktrace.setDeobfuscateFunctionName);\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/stacktrace.js"],"^S",["^A",["~$goog.testing.stacktrace","~$goog.testing.stacktrace.Frame"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.math.range.js","^9",["^:","goog/math/range.js"],"^;","goog/math/range.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A utility class for representing a numeric range.\n */\n\n\ngoog.provide('goog.math.Range');\n\ngoog.require('goog.asserts');\n\n\n\n/**\n * A number range.\n * @param {number} a One end of the range.\n * @param {number} b The other end of the range.\n * @struct\n * @constructor\n */\ngoog.math.Range = function(a, b) {\n  /**\n   * The lowest value in the range.\n   * @type {number}\n   */\n  this.start = a < b ? a : b;\n\n  /**\n   * The highest value in the range.\n   * @type {number}\n   */\n  this.end = a < b ? b : a;\n};\n\n\n/**\n * Creates a goog.math.Range from an array of two numbers.\n * @param {!Array<number>} pair\n * @return {!goog.math.Range}\n */\ngoog.math.Range.fromPair = function(pair) {\n  goog.asserts.assert(pair.length == 2);\n  return new goog.math.Range(pair[0], pair[1]);\n};\n\n\n/**\n * @return {!goog.math.Range} A clone of this Range.\n */\ngoog.math.Range.prototype.clone = function() {\n  return new goog.math.Range(this.start, this.end);\n};\n\n\n/**\n * @return {number} Length of the range.\n */\ngoog.math.Range.prototype.getLength = function() {\n  return this.end - this.start;\n};\n\n\n/**\n * Extends this range to include the given point.\n * @param {number} point\n */\ngoog.math.Range.prototype.includePoint = function(point) {\n  this.start = Math.min(this.start, point);\n  this.end = Math.max(this.end, point);\n};\n\n\n/**\n * Extends this range to include the given range.\n * @param {!goog.math.Range} range\n */\ngoog.math.Range.prototype.includeRange = function(range) {\n  this.start = Math.min(this.start, range.start);\n  this.end = Math.max(this.end, range.end);\n};\n\n\nif (goog.DEBUG) {\n  /**\n   * Returns a string representing the range.\n   * @return {string} In the form [-3.5, 8.13].\n   * @override\n   */\n  goog.math.Range.prototype.toString = function() {\n    return '[' + this.start + ', ' + this.end + ']';\n  };\n}\n\n\n/**\n * Compares ranges for equality.\n * @param {goog.math.Range} a A Range.\n * @param {goog.math.Range} b A Range.\n * @return {boolean} True iff both the starts and the ends of the ranges are\n *     equal, or if both ranges are null.\n */\ngoog.math.Range.equals = function(a, b) {\n  if (a == b) {\n    return true;\n  }\n  if (!a || !b) {\n    return false;\n  }\n  return a.start == b.start && a.end == b.end;\n};\n\n\n/**\n * Given two ranges on the same dimension, this method returns the intersection\n * of those ranges.\n * @param {goog.math.Range} a A Range.\n * @param {goog.math.Range} b A Range.\n * @return {goog.math.Range} A new Range representing the intersection of two\n *     ranges, or null if there is no intersection. Ranges are assumed to\n *     include their end points, and the intersection can be a point.\n */\ngoog.math.Range.intersection = function(a, b) {\n  var c0 = Math.max(a.start, b.start);\n  var c1 = Math.min(a.end, b.end);\n  return (c0 <= c1) ? new goog.math.Range(c0, c1) : null;\n};\n\n\n/**\n * Given two ranges on the same dimension, determines whether they intersect.\n * @param {goog.math.Range} a A Range.\n * @param {goog.math.Range} b A Range.\n * @return {boolean} Whether they intersect.\n */\ngoog.math.Range.hasIntersection = function(a, b) {\n  return Math.max(a.start, b.start) <= Math.min(a.end, b.end);\n};\n\n\n/**\n * Given two ranges on the same dimension, this returns a range that covers\n * both ranges.\n * @param {goog.math.Range} a A Range.\n * @param {goog.math.Range} b A Range.\n * @return {!goog.math.Range} A new Range representing the bounding\n *     range.\n */\ngoog.math.Range.boundingRange = function(a, b) {\n  return new goog.math.Range(\n      Math.min(a.start, b.start), Math.max(a.end, b.end));\n};\n\n\n/**\n * Given two ranges, returns true if the first range completely overlaps the\n * second.\n * @param {goog.math.Range} a The first Range.\n * @param {goog.math.Range} b The second Range.\n * @return {boolean} True if b is contained inside a, false otherwise.\n */\ngoog.math.Range.contains = function(a, b) {\n  return a.start <= b.start && a.end >= b.end;\n};\n\n\n/**\n * Given a range and a point, returns true if the range contains the point.\n * @param {goog.math.Range} range The range.\n * @param {number} p The point.\n * @return {boolean} True if p is contained inside range, false otherwise.\n */\ngoog.math.Range.containsPoint = function(range, p) {\n  return range.start <= p && range.end >= p;\n};\n","^?",1579837703000,"^@",["^A",["^1J","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/range.js"],"^S",["^A",["~$goog.math.Range"]],"^1",true,"^2",["^3","^1J"]],["^ ","^7",[1579837703000],"^8","goog.storage.mechanism.mechanismfactory.js","^9",["^:","goog/storage/mechanism/mechanismfactory.js"],"^;","goog/storage/mechanism/mechanismfactory.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides factory methods for selecting the best storage\n * mechanism, depending on availability and needs.\n *\n */\n\ngoog.provide('goog.storage.mechanism.mechanismfactory');\n\ngoog.require('goog.storage.mechanism.HTML5LocalStorage');\ngoog.require('goog.storage.mechanism.HTML5SessionStorage');\ngoog.require('goog.storage.mechanism.IEUserData');\ngoog.require('goog.storage.mechanism.PrefixedMechanism');\n\n\n/**\n * The key to shared userData storage.\n * @type {string}\n */\ngoog.storage.mechanism.mechanismfactory.USER_DATA_SHARED_KEY =\n    'UserDataSharedStore';\n\n\n/**\n * Returns the best local storage mechanism, or null if unavailable.\n * Local storage means that the database is placed on user's computer.\n * The key-value database is normally shared between all the code paths\n * that request it, so using an optional namespace is recommended. This\n * provides separation and makes key collisions unlikely.\n *\n * @param {string=} opt_namespace Restricts the visibility to given namespace.\n * @return {goog.storage.mechanism.IterableMechanism} Created mechanism or null.\n */\ngoog.storage.mechanism.mechanismfactory.create = function(opt_namespace) {\n  return goog.storage.mechanism.mechanismfactory.createHTML5LocalStorage(\n             opt_namespace) ||\n      goog.storage.mechanism.mechanismfactory.createIEUserData(opt_namespace);\n};\n\n\n/**\n * Returns an HTML5 local storage mechanism, or null if unavailable.\n * Since the HTML5 local storage does not support namespaces natively,\n * and the key-value database is shared between all the code paths\n * that request it, it is recommended that an optional namespace is\n * used to provide key separation employing a prefix.\n *\n * @param {string=} opt_namespace Restricts the visibility to given namespace.\n * @return {goog.storage.mechanism.IterableMechanism} Created mechanism or null.\n */\ngoog.storage.mechanism.mechanismfactory.createHTML5LocalStorage = function(\n    opt_namespace) {\n  var storage = new goog.storage.mechanism.HTML5LocalStorage();\n  if (storage.isAvailable()) {\n    return opt_namespace ?\n        new goog.storage.mechanism.PrefixedMechanism(storage, opt_namespace) :\n        storage;\n  }\n  return null;\n};\n\n\n/**\n * Returns an HTML5 session storage mechanism, or null if unavailable.\n * Since the HTML5 session storage does not support namespaces natively,\n * and the key-value database is shared between all the code paths\n * that request it, it is recommended that an optional namespace is\n * used to provide key separation employing a prefix.\n *\n * @param {string=} opt_namespace Restricts the visibility to given namespace.\n * @return {goog.storage.mechanism.IterableMechanism} Created mechanism or null.\n */\ngoog.storage.mechanism.mechanismfactory.createHTML5SessionStorage = function(\n    opt_namespace) {\n  var storage = new goog.storage.mechanism.HTML5SessionStorage();\n  if (storage.isAvailable()) {\n    return opt_namespace ?\n        new goog.storage.mechanism.PrefixedMechanism(storage, opt_namespace) :\n        storage;\n  }\n  return null;\n};\n\n\n/**\n * Returns an IE userData local storage mechanism, or null if unavailable.\n * Using an optional namespace is recommended to provide separation and\n * avoid key collisions.\n *\n * @param {string=} opt_namespace Restricts the visibility to given namespace.\n * @return {goog.storage.mechanism.IterableMechanism} Created mechanism or null.\n */\ngoog.storage.mechanism.mechanismfactory.createIEUserData = function(\n    opt_namespace) {\n  var storage = new goog.storage.mechanism.IEUserData(\n      opt_namespace ||\n      goog.storage.mechanism.mechanismfactory.USER_DATA_SHARED_KEY);\n  if (storage.isAvailable()) {\n    return storage;\n  }\n  return null;\n};\n","^?",1579837703000,"^@",["^A",["~$goog.storage.mechanism.HTML5SessionStorage","^3","~$goog.storage.mechanism.PrefixedMechanism","^5:","~$goog.storage.mechanism.IEUserData"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/mechanism/mechanismfactory.js"],"^S",["^A",["~$goog.storage.mechanism.mechanismfactory"]],"^1",true,"^2",["^3","^5:","^TV","^TX","^TW"]],["^ ","^7",[1579837703000],"^1=",true,"^8","goog.testing.parallel_closure_test_suite.js","^9",["^:","goog/testing/parallel_closure_test_suite.js"],"^;","goog/testing/parallel_closure_test_suite.js","^<","^=","^>","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Parallel closure_test_suite test file. This test is not\n * intended to be ran or depended on directly.\n *\n */\n\ngoog.module('goog.testing.parallelClosureTestSuite');\ngoog.setTestOnly('goog.testing.parallelClosureTestSuite');\n\nconst MultiTestRunner = goog.require('goog.testing.MultiTestRunner');\nconst Promise = goog.require('goog.Promise');\nconst TestCase = goog.require('goog.testing.TestCase');\nconst asserts = goog.require('goog.asserts');\nconst events = goog.require('goog.events');\nconst json = goog.require('goog.json');\nconst testSuite = goog.require('goog.testing.testSuite');\n\n/** @type {?MultiTestRunner} */\nlet testRunner = null;\n\n\n/**\n * @typedef {{\n *   totalTests: number,\n *   totalFailures: number,\n *   failureReports: string,\n *   allResults: !Object<string, !Array<string>>\n * }}\n */\nlet ParallelTestResults;\n\n\n/**\n * Processes the test results returned from MultiTestRunner and creates a\n * consolidated result object that the test runner understands.\n * @param {!Array<!Object<string,!Array<string>>>} testResults The list of\n *     individual test results from MultiTestRunner.\n * @return {!ParallelTestResults} Flattened test report for all tests.\n */\nfunction processAllTestResults(testResults) {\n  let totalTests = 0;\n  let totalFailed = 0;\n  const allResults = {};\n  let failureReports = '';\n\n  for (let i = 0; i < testResults.length; i++) {\n    const result = testResults[i];\n    for (const testName in result) {\n      totalTests++;\n      allResults[testName] = result[testName];\n      const failures = result[testName];\n      if (failures.length) {\n        totalFailed++;\n        for (let j = 0; j < failures.length; j++) {\n          failureReports += failures[j] + '\\n';\n        }\n      }\n    }\n  }\n\n  return {\n    totalTests: totalTests,\n    totalFailures: totalFailed,\n    failureReports: failureReports,\n    allResults: allResults\n  };\n}\n\nconst testObj = {\n  setUpPage: function() {\n    // G_parallelTestRunner is exported in gen_parallel_test_html.py.\n    const timeout = goog.global['G_parallelTestRunner']['testTimeout'];\n    const allTests = goog.global['G_parallelTestRunner']['allTests'];\n    const parallelFrames =\n        goog.global['G_parallelTestRunner']['parallelFrames'];\n    const parallelTimeout =\n        goog.global['G_parallelTestRunner']['parallelTimeout'];\n\n    // Create a test runner and render it.\n    testRunner = new MultiTestRunner()\n                     .setName(document.title)\n                     .setBasePath('/google3/')\n                     .setPoolSize(parallelFrames)\n                     .setStatsBucketSizes(5, 500)\n                     .setTimeout(timeout * 1000)\n                     .addTests(allTests);\n\n    testRunner.render(document.getElementById('runner'));\n\n    // There's only a single test method that runs all the tests, so this\n    // promiseTimeout is effectively the timeout of the entire test suite\n    TestCase.getActiveTestCase().promiseTimeout = parallelTimeout * 1000;\n\n    // Return testRunner for testing purposes.\n    return testRunner;\n  },\n\n  testRunAllTests: function() {\n    asserts.assert(testRunner, 'Was \"setUpPage\" called?');\n\n    const failurePromise = new Promise(function(resolve, reject) {\n      events.listen(testRunner, 'testsFinished', resolve);\n    });\n\n    testRunner.start();\n\n    let allResults = {};\n    // TestPoller.java invokes this to get test results for sponge. We override\n    // it and return the results of each individual test instead of the\n    // containing \"testRunAllTests\".\n    window['G_testRunner']['getTestResults'] = function() {\n      return allResults;\n    };\n\n    window['G_testRunner']['getTestResultsAsJson'] = function() {\n      return json.serialize(allResults);\n    };\n\n    return failurePromise.then(function(failures) {\n      const testResults = processAllTestResults(failures['allTestResults']);\n      allResults = testResults.allResults;\n      if (testResults.totalFailures) {\n        fail(\n            testResults.totalFailures + ' of ' + testResults.totalTests +\n            ' test(s) failed!\\n\\n' + testResults.failureReports);\n      }\n    });\n  }\n};\n\n// G_parallelTestRunner should only be present when being run from a parallel\n// closure_test_suite target. If it's not present, we're including this file\n// to be unit tested.\nif (goog.global['G_parallelTestRunner']) {\n  testSuite(testObj);\n}\n\n// Export test methods/vars so they can also be tested.\ntestObj['processAllTestResults'] = processAllTestResults;\nexports = testObj;\n","^?",1579837703000,"^@",["^A",["^1J","^3@","^3","^T8","~$goog.testing.MultiTestRunner","~$goog.testing.testSuite","~$goog.testing.TestCase","^1N"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/parallel_closure_test_suite.js"],"^S",["^A",["~$goog.testing.parallelClosureTestSuite"]],"^1",true,"^2",["^3","^TZ","^T8","^U0","^1J","^1N","^3@","^T["]],["^ ","^7",[1579837703000],"^8","goog.dom.savedrange.js","^9",["^:","goog/dom/savedrange.js"],"^;","goog/dom/savedrange.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A generic interface for saving and restoring ranges.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\n\ngoog.provide('goog.dom.SavedRange');\n\ngoog.forwardDeclare('goog.dom.AbstractRange');\ngoog.require('goog.Disposable');\ngoog.require('goog.log');\n\n\n\n/**\n * Abstract interface for a saved range.\n * @constructor\n * @extends {goog.Disposable}\n */\ngoog.dom.SavedRange = function() {\n  goog.Disposable.call(this);\n};\ngoog.inherits(goog.dom.SavedRange, goog.Disposable);\n\n\n/**\n * Logging object.\n * @type {goog.log.Logger}\n * @private\n */\ngoog.dom.SavedRange.logger_ = goog.log.getLogger('goog.dom.SavedRange');\n\n\n/**\n * Restores the range and by default disposes of the saved copy.  Take note:\n * this means the by default SavedRange objects are single use objects.\n * @param {boolean=} opt_stayAlive Whether this SavedRange should stay alive\n *     (not be disposed) after restoring the range. Defaults to false (dispose).\n * @return {goog.dom.AbstractRange} The restored range.\n */\ngoog.dom.SavedRange.prototype.restore = function(opt_stayAlive) {\n  if (this.isDisposed()) {\n    goog.log.error(\n        goog.dom.SavedRange.logger_,\n        'Disposed SavedRange objects cannot be restored.');\n  }\n\n  var range = this.restoreInternal();\n  if (!opt_stayAlive) {\n    this.dispose();\n  }\n  return range;\n};\n\n\n/**\n * Internal method to restore the saved range.\n * @return {goog.dom.AbstractRange} The restored range.\n * @protected\n */\ngoog.dom.SavedRange.prototype.restoreInternal = goog.abstractMethod;\n","^?",1579837703000,"^@",["^A",["^3","^3B","^3C"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/savedrange.js"],"^S",["^A",["~$goog.dom.SavedRange"]],"^1",true,"^2",["^3","^3C","^3B"]],["^ ","^7",[1579837703000],"^8","goog.testing.mockstorage.js","^9",["^:","goog/testing/mockstorage.js"],"^;","goog/testing/mockstorage.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a JS storage class implementing the HTML5 Storage\n * interface.\n */\n\n\ngoog.setTestOnly('goog.testing.MockStorage');\ngoog.provide('goog.testing.MockStorage');\n\n\ngoog.require('goog.structs.Map');\n\n\n\n/**\n * A JS storage instance, implementing the HTML5 Storage interface.\n * See http://www.w3.org/TR/webstorage/ for details.\n *\n * @constructor\n * @implements {Storage}\n * @final\n */\ngoog.testing.MockStorage = function() {\n  /**\n   * The underlying storage object.\n   * @type {goog.structs.Map}\n   * @private\n   */\n  this.store_ = new goog.structs.Map();\n\n  /**\n   * The number of elements in the storage.\n   * @type {number}\n   */\n  this.length = 0;\n};\n\n\n/**\n * Sets an item to the storage.\n * @param {string} key Storage key.\n * @param {*} value Storage value. Must be convertible to string.\n * @override\n */\ngoog.testing.MockStorage.prototype.setItem = function(key, value) {\n  this.store_.set(key, String(value));\n  this.length = this.store_.getCount();\n};\n\n\n/**\n * Gets an item from the storage.  The item returned is the \"structured clone\"\n * of the value from setItem.  In practice this means it's the value cast to a\n * string.\n * @param {string} key Storage key.\n * @return {?string} Storage value for key; null if does not exist.\n * @override\n */\ngoog.testing.MockStorage.prototype.getItem = function(key) {\n  var val = this.store_.get(key);\n  // Enforce that getItem returns string values.\n  return (val != null) ? /** @type {string} */ (val) : null;\n};\n\n\n/**\n * Removes and item from the storage.\n * @param {string} key Storage key.\n * @override\n */\ngoog.testing.MockStorage.prototype.removeItem = function(key) {\n  this.store_.remove(key);\n  this.length = this.store_.getCount();\n};\n\n\n/**\n * Clears the storage.\n * @override\n */\ngoog.testing.MockStorage.prototype.clear = function() {\n  this.store_.clear();\n  this.length = 0;\n};\n\n\n/**\n * Returns the key at the given index.\n * @param {number} index The index for the key.\n * @return {?string} Key at the given index, null if not found.\n * @override\n */\ngoog.testing.MockStorage.prototype.key = function(index) {\n  return this.store_.getKeys()[index] || null;\n};\n","^?",1579837703000,"^@",["^A",["^1Q","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/mockstorage.js"],"^S",["^A",["~$goog.testing.MockStorage"]],"^1",true,"^2",["^3","^1Q"]],["^ ","^7",[1579837703000],"^8","goog.testing.net.xhriopool.js","^9",["^:","goog/testing/net/xhriopool.js"],"^;","goog/testing/net/xhriopool.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An XhrIo pool that uses a single mock XHR object for testing.\n *\n */\n\ngoog.setTestOnly('goog.testing.net.XhrIoPool');\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.testing.net.XhrIoPool');\n\ngoog.require('goog.net.XhrIoPool');\ngoog.require('goog.testing.net.XhrIo');\n\n\n\n/**\n * A pool containing a single mock XhrIo object.\n *\n * @param {goog.testing.net.XhrIo=} opt_xhr The mock XhrIo object.\n * @constructor\n * @extends {goog.net.XhrIoPool}\n * @final\n */\ngoog.testing.net.XhrIoPool = function(opt_xhr) {\n  /**\n   * The mock XhrIo object.\n   * @type {!goog.testing.net.XhrIo}\n   * @private\n   */\n  this.xhr_ = opt_xhr || new goog.testing.net.XhrIo();\n\n  // Run this after setting xhr_ because xhr_ is used to initialize the pool.\n  goog.testing.net.XhrIoPool.base(this, 'constructor', undefined, 1, 1);\n};\ngoog.inherits(goog.testing.net.XhrIoPool, goog.net.XhrIoPool);\n\n\n/**\n * @override\n * @suppress {invalidCasts}\n */\ngoog.testing.net.XhrIoPool.prototype.createObject = function() {\n  return (/** @type {!goog.net.XhrIo} */ (this.xhr_));\n};\n\n\n/**\n * Get the mock XhrIo used by this pool.\n *\n * @return {!goog.testing.net.XhrIo} The mock XhrIo.\n */\ngoog.testing.net.XhrIoPool.prototype.getXhr = function() {\n  return this.xhr_;\n};\n","^?",1579837703000,"^@",["^A",["^4A","^3","~$goog.testing.net.XhrIo"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/net/xhriopool.js"],"^S",["^A",["~$goog.testing.net.XhrIoPool"]],"^1",true,"^2",["^3","^4A","^U4"]],["^ ","^7",[1579837703000],"^8","goog.math.box.js","^9",["^:","goog/math/box.js"],"^;","goog/math/box.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A utility class for representing a numeric box.\n */\n\n\ngoog.provide('goog.math.Box');\n\ngoog.require('goog.asserts');\ngoog.require('goog.math.Coordinate');\n\n\n\n/**\n * Class for representing a box. A box is specified as a top, right, bottom,\n * and left. A box is useful for representing margins and padding.\n *\n * This class assumes 'screen coordinates': larger Y coordinates are further\n * from the top of the screen.\n *\n * @param {number} top Top.\n * @param {number} right Right.\n * @param {number} bottom Bottom.\n * @param {number} left Left.\n * @struct\n * @constructor\n */\ngoog.math.Box = function(top, right, bottom, left) {\n  /**\n   * Top\n   * @type {number}\n   */\n  this.top = top;\n\n  /**\n   * Right\n   * @type {number}\n   */\n  this.right = right;\n\n  /**\n   * Bottom\n   * @type {number}\n   */\n  this.bottom = bottom;\n\n  /**\n   * Left\n   * @type {number}\n   */\n  this.left = left;\n};\n\n\n/**\n * Creates a Box by bounding a collection of goog.math.Coordinate objects\n * @param {...goog.math.Coordinate} var_args Coordinates to be included inside\n *     the box.\n * @return {!goog.math.Box} A Box containing all the specified Coordinates.\n */\ngoog.math.Box.boundingBox = function(var_args) {\n  var box = new goog.math.Box(\n      arguments[0].y, arguments[0].x, arguments[0].y, arguments[0].x);\n  for (var i = 1; i < arguments.length; i++) {\n    box.expandToIncludeCoordinate(arguments[i]);\n  }\n  return box;\n};\n\n\n/**\n * @return {number} width The width of this Box.\n */\ngoog.math.Box.prototype.getWidth = function() {\n  return this.right - this.left;\n};\n\n\n/**\n * @return {number} height The height of this Box.\n */\ngoog.math.Box.prototype.getHeight = function() {\n  return this.bottom - this.top;\n};\n\n\n/**\n * Creates a copy of the box with the same dimensions.\n * @return {!goog.math.Box} A clone of this Box.\n */\ngoog.math.Box.prototype.clone = function() {\n  return new goog.math.Box(this.top, this.right, this.bottom, this.left);\n};\n\n\nif (goog.DEBUG) {\n  /**\n   * Returns a nice string representing the box.\n   * @return {string} In the form (50t, 73r, 24b, 13l).\n   * @override\n   */\n  goog.math.Box.prototype.toString = function() {\n    return '(' + this.top + 't, ' + this.right + 'r, ' + this.bottom + 'b, ' +\n        this.left + 'l)';\n  };\n}\n\n\n/**\n * Returns whether the box contains a coordinate or another box.\n *\n * @param {goog.math.Coordinate|goog.math.Box} other A Coordinate or a Box.\n * @return {boolean} Whether the box contains the coordinate or other box.\n */\ngoog.math.Box.prototype.contains = function(other) {\n  return goog.math.Box.contains(this, other);\n};\n\n\n/**\n * Expands box with the given margins.\n *\n * @param {number|goog.math.Box} top Top margin or box with all margins.\n * @param {number=} opt_right Right margin.\n * @param {number=} opt_bottom Bottom margin.\n * @param {number=} opt_left Left margin.\n * @return {!goog.math.Box} A reference to this Box.\n */\ngoog.math.Box.prototype.expand = function(\n    top, opt_right, opt_bottom, opt_left) {\n  if (goog.isObject(top)) {\n    this.top -= top.top;\n    this.right += top.right;\n    this.bottom += top.bottom;\n    this.left -= top.left;\n  } else {\n    this.top -= /** @type {number} */ (top);\n    this.right += Number(opt_right);\n    this.bottom += Number(opt_bottom);\n    this.left -= Number(opt_left);\n  }\n\n  return this;\n};\n\n\n/**\n * Expand this box to include another box.\n * NOTE(user): This is used in code that needs to be very fast, please don't\n * add functionality to this function at the expense of speed (variable\n * arguments, accepting multiple argument types, etc).\n * @param {goog.math.Box} box The box to include in this one.\n */\ngoog.math.Box.prototype.expandToInclude = function(box) {\n  this.left = Math.min(this.left, box.left);\n  this.top = Math.min(this.top, box.top);\n  this.right = Math.max(this.right, box.right);\n  this.bottom = Math.max(this.bottom, box.bottom);\n};\n\n\n/**\n * Expand this box to include the coordinate.\n * @param {!goog.math.Coordinate} coord The coordinate to be included\n *     inside the box.\n */\ngoog.math.Box.prototype.expandToIncludeCoordinate = function(coord) {\n  this.top = Math.min(this.top, coord.y);\n  this.right = Math.max(this.right, coord.x);\n  this.bottom = Math.max(this.bottom, coord.y);\n  this.left = Math.min(this.left, coord.x);\n};\n\n\n/**\n * Compares boxes for equality.\n * @param {goog.math.Box} a A Box.\n * @param {goog.math.Box} b A Box.\n * @return {boolean} True iff the boxes are equal, or if both are null.\n */\ngoog.math.Box.equals = function(a, b) {\n  if (a == b) {\n    return true;\n  }\n  if (!a || !b) {\n    return false;\n  }\n  return a.top == b.top && a.right == b.right && a.bottom == b.bottom &&\n      a.left == b.left;\n};\n\n\n/**\n * Returns whether a box contains a coordinate or another box.\n *\n * @param {goog.math.Box} box A Box.\n * @param {goog.math.Coordinate|goog.math.Box} other A Coordinate or a Box.\n * @return {boolean} Whether the box contains the coordinate or other box.\n */\ngoog.math.Box.contains = function(box, other) {\n  if (!box || !other) {\n    return false;\n  }\n\n  if (other instanceof goog.math.Box) {\n    return other.left >= box.left && other.right <= box.right &&\n        other.top >= box.top && other.bottom <= box.bottom;\n  }\n\n  // other is a Coordinate.\n  return other.x >= box.left && other.x <= box.right && other.y >= box.top &&\n      other.y <= box.bottom;\n};\n\n\n/**\n * Returns the relative x position of a coordinate compared to a box.  Returns\n * zero if the coordinate is inside the box.\n *\n * @param {goog.math.Box} box A Box.\n * @param {goog.math.Coordinate} coord A Coordinate.\n * @return {number} The x position of `coord` relative to the nearest\n *     side of `box`, or zero if `coord` is inside `box`.\n */\ngoog.math.Box.relativePositionX = function(box, coord) {\n  if (coord.x < box.left) {\n    return coord.x - box.left;\n  } else if (coord.x > box.right) {\n    return coord.x - box.right;\n  }\n  return 0;\n};\n\n\n/**\n * Returns the relative y position of a coordinate compared to a box.  Returns\n * zero if the coordinate is inside the box.\n *\n * @param {goog.math.Box} box A Box.\n * @param {goog.math.Coordinate} coord A Coordinate.\n * @return {number} The y position of `coord` relative to the nearest\n *     side of `box`, or zero if `coord` is inside `box`.\n */\ngoog.math.Box.relativePositionY = function(box, coord) {\n  if (coord.y < box.top) {\n    return coord.y - box.top;\n  } else if (coord.y > box.bottom) {\n    return coord.y - box.bottom;\n  }\n  return 0;\n};\n\n\n/**\n * Returns the distance between a coordinate and the nearest corner/side of a\n * box. Returns zero if the coordinate is inside the box.\n *\n * @param {goog.math.Box} box A Box.\n * @param {goog.math.Coordinate} coord A Coordinate.\n * @return {number} The distance between `coord` and the nearest\n *     corner/side of `box`, or zero if `coord` is inside\n *     `box`.\n */\ngoog.math.Box.distance = function(box, coord) {\n  var x = goog.math.Box.relativePositionX(box, coord);\n  var y = goog.math.Box.relativePositionY(box, coord);\n  return Math.sqrt(x * x + y * y);\n};\n\n\n/**\n * Returns whether two boxes intersect.\n *\n * @param {goog.math.Box} a A Box.\n * @param {goog.math.Box} b A second Box.\n * @return {boolean} Whether the boxes intersect.\n */\ngoog.math.Box.intersects = function(a, b) {\n  return (\n      a.left <= b.right && b.left <= a.right && a.top <= b.bottom &&\n      b.top <= a.bottom);\n};\n\n\n/**\n * Returns whether two boxes would intersect with additional padding.\n *\n * @param {goog.math.Box} a A Box.\n * @param {goog.math.Box} b A second Box.\n * @param {number} padding The additional padding.\n * @return {boolean} Whether the boxes intersect.\n */\ngoog.math.Box.intersectsWithPadding = function(a, b, padding) {\n  return (\n      a.left <= b.right + padding && b.left <= a.right + padding &&\n      a.top <= b.bottom + padding && b.top <= a.bottom + padding);\n};\n\n\n/**\n * Rounds the fields to the next larger integer values.\n *\n * @return {!goog.math.Box} This box with ceil'd fields.\n */\ngoog.math.Box.prototype.ceil = function() {\n  this.top = Math.ceil(this.top);\n  this.right = Math.ceil(this.right);\n  this.bottom = Math.ceil(this.bottom);\n  this.left = Math.ceil(this.left);\n  return this;\n};\n\n\n/**\n * Rounds the fields to the next smaller integer values.\n *\n * @return {!goog.math.Box} This box with floored fields.\n */\ngoog.math.Box.prototype.floor = function() {\n  this.top = Math.floor(this.top);\n  this.right = Math.floor(this.right);\n  this.bottom = Math.floor(this.bottom);\n  this.left = Math.floor(this.left);\n  return this;\n};\n\n\n/**\n * Rounds the fields to nearest integer values.\n *\n * @return {!goog.math.Box} This box with rounded fields.\n */\ngoog.math.Box.prototype.round = function() {\n  this.top = Math.round(this.top);\n  this.right = Math.round(this.right);\n  this.bottom = Math.round(this.bottom);\n  this.left = Math.round(this.left);\n  return this;\n};\n\n\n/**\n * Translates this box by the given offsets. If a `goog.math.Coordinate`\n * is given, then the left and right values are translated by the coordinate's\n * x value and the top and bottom values are translated by the coordinate's y\n * value.  Otherwise, `tx` and `opt_ty` are used to translate the x\n * and y dimension values.\n *\n * @param {number|goog.math.Coordinate} tx The value to translate the x\n *     dimension values by or the the coordinate to translate this box by.\n * @param {number=} opt_ty The value to translate y dimension values by.\n * @return {!goog.math.Box} This box after translating.\n */\ngoog.math.Box.prototype.translate = function(tx, opt_ty) {\n  if (tx instanceof goog.math.Coordinate) {\n    this.left += tx.x;\n    this.right += tx.x;\n    this.top += tx.y;\n    this.bottom += tx.y;\n  } else {\n    goog.asserts.assertNumber(tx);\n    this.left += tx;\n    this.right += tx;\n    if (typeof opt_ty === 'number') {\n      this.top += opt_ty;\n      this.bottom += opt_ty;\n    }\n  }\n  return this;\n};\n\n\n/**\n * Scales this coordinate by the given scale factors. The x and y dimension\n * values are scaled by `sx` and `opt_sy` respectively.\n * If `opt_sy` is not given, then `sx` is used for both x and y.\n *\n * @param {number} sx The scale factor to use for the x dimension.\n * @param {number=} opt_sy The scale factor to use for the y dimension.\n * @return {!goog.math.Box} This box after scaling.\n */\ngoog.math.Box.prototype.scale = function(sx, opt_sy) {\n  var sy = (typeof opt_sy === 'number') ? opt_sy : sx;\n  this.left *= sx;\n  this.right *= sx;\n  this.top *= sy;\n  this.bottom *= sy;\n  return this;\n};\n","^?",1579837703000,"^@",["^A",["^1J","^3","^22"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/box.js"],"^S",["^A",["^3["]],"^1",true,"^2",["^3","^1J","^22"]],["^ ","^7",[1579837703000],"^8","goog.proto.proto.js","^9",["^:","goog/proto/proto.js"],"^;","goog/proto/proto.js","^<","^=","^>","/**\n * @license\n * Copyright The Closure Library Authors. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS-IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Protocol buffer serializer.\n * @author arv@google.com (Erik Arvidsson)\n */\n\ngoog.provide('goog.proto');\n\n\ngoog.require('goog.proto.Serializer');\n\n\n/**\n * Instance of the serializer object.\n * @type {goog.proto.Serializer}\n * @private\n */\ngoog.proto.serializer_ = null;\n\n\n/**\n * Serializes an object or a value to a protocol buffer string.\n * @param {Object} object The object to serialize.\n * @return {string} The serialized protocol buffer string.\n */\ngoog.proto.serialize = function(object) {\n  if (!goog.proto.serializer_) {\n    goog.proto.serializer_ = new goog.proto.Serializer;\n  }\n  return goog.proto.serializer_.serialize(object);\n};\n","^?",1579837703000,"^@",["^A",["~$goog.proto.Serializer","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/proto/proto.js"],"^S",["^A",["~$goog.proto"]],"^1",true,"^2",["^3","^U6"]],["^ ","^7",[1579837703000],"^8","goog.ui.media.googlevideo.js","^9",["^:","goog/ui/media/googlevideo.js"],"^;","goog/ui/media/googlevideo.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview provides a reusable GoogleVideo UI component given a public\n * GoogleVideo video URL.\n *\n * goog.ui.media.GoogleVideo is actually a {@link goog.ui.ControlRenderer}, a\n * stateless class - that could/should be used as a Singleton with the static\n * method `goog.ui.media.GoogleVideo.getInstance` -, that knows how to\n * render GoogleVideo videos. It is designed to be used with a\n * {@link goog.ui.Control}, which will actually control the media renderer and\n * provide the {@link goog.ui.Component} base. This design guarantees that all\n * different types of medias will behave alike but will look different.\n *\n * goog.ui.media.GoogleVideo expects `goog.ui.media.GoogleVideoModel` on\n * `goog.ui.Control.getModel` as data models, and renders a flash object\n * that will show the contents of that video.\n *\n * Example of usage:\n *\n * <pre>\n *   var video = goog.ui.media.GoogleVideoModel.newInstance(\n *       'https://video.google.com/videoplay?docid=6698933542780842398');\n *   goog.ui.media.GoogleVideo.newControl(video).render();\n * </pre>\n *\n * GoogleVideo medias currently support the following states:\n *\n * <ul>\n *   <li> {@link goog.ui.Component.State.DISABLED}: shows 'flash not available'\n *   <li> {@link goog.ui.Component.State.HOVER}: mouse cursor is over the video\n *   <li> {@link goog.ui.Component.State.SELECTED}: flash video is shown\n * </ul>\n *\n * Which can be accessed by\n * <pre>\n *   video.setEnabled(true);\n *   video.setHighlighted(true);\n *   video.setSelected(true);\n * </pre>\n *\n *\n * @supported IE6+, FF2+, Chrome, Safari. Requires flash to actually work.\n */\n\n\ngoog.provide('goog.ui.media.GoogleVideo');\ngoog.provide('goog.ui.media.GoogleVideoModel');\n\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.string');\ngoog.require('goog.string.Const');\ngoog.require('goog.ui.media.FlashObject');\ngoog.require('goog.ui.media.Media');\ngoog.require('goog.ui.media.MediaModel');\ngoog.require('goog.ui.media.MediaRenderer');\n\n\n\n/**\n * Subclasses a goog.ui.media.MediaRenderer to provide a GoogleVideo specific\n * media renderer.\n *\n * This class knows how to parse GoogleVideo URLs, and render the DOM structure\n * of GoogleVideo video players. This class is meant to be used as a singleton\n * static stateless class, that takes `goog.ui.media.Media` instances and\n * renders it. It expects `goog.ui.media.Media.getModel` to return a well\n * formed, previously constructed, GoogleVideo video id, which is the data model\n * this renderer will use to construct the DOM structure.\n * {@see goog.ui.media.GoogleVideo.newControl} for a example of constructing a\n * control with this renderer.\n *\n * This design is patterned after http://go/closure_control_subclassing\n *\n * It uses {@link goog.ui.media.FlashObject} to embed the flash object.\n *\n * @constructor\n * @extends {goog.ui.media.MediaRenderer}\n * @final\n */\ngoog.ui.media.GoogleVideo = function() {\n  goog.ui.media.MediaRenderer.call(this);\n};\ngoog.inherits(goog.ui.media.GoogleVideo, goog.ui.media.MediaRenderer);\ngoog.addSingletonGetter(goog.ui.media.GoogleVideo);\n\n\n/**\n * A static convenient method to construct a goog.ui.media.Media control out of\n * a GoogleVideo model. It sets it as the data model goog.ui.media.GoogleVideo\n * renderer uses, sets the states supported by the renderer, and returns a\n * Control that binds everything together. This is what you should be using for\n * constructing GoogleVideo videos, except if you need finer control over the\n * configuration.\n *\n * @param {goog.ui.media.GoogleVideoModel} dataModel The GoogleVideo data model.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @return {!goog.ui.media.Media} A Control binded to the GoogleVideo renderer.\n */\ngoog.ui.media.GoogleVideo.newControl = function(dataModel, opt_domHelper) {\n  var control = new goog.ui.media.Media(\n      dataModel, goog.ui.media.GoogleVideo.getInstance(), opt_domHelper);\n  // GoogleVideo videos don't have any thumbnail for now, so we show the\n  // \"selected\" version of the UI at the start, which is the flash player.\n  control.setSelected(true);\n  return control;\n};\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n *\n * @type {string}\n */\ngoog.ui.media.GoogleVideo.CSS_CLASS =\n    goog.getCssName('goog-ui-media-googlevideo');\n\n\n/**\n * Creates the initial DOM structure of the GoogleVideo video, which is\n * basically a the flash object pointing to a GoogleVideo video player.\n *\n * @param {goog.ui.Control} c The media control.\n * @return {!Element} The DOM structure that represents this control.\n * @override\n */\ngoog.ui.media.GoogleVideo.prototype.createDom = function(c) {\n  var control = /** @type {goog.ui.media.Media} */ (c);\n  var div = goog.ui.media.GoogleVideo.base(this, 'createDom', control);\n\n  var dataModel =\n      /** @type {goog.ui.media.GoogleVideoModel} */ (control.getDataModel());\n\n  var flash = new goog.ui.media.FlashObject(\n      dataModel.getPlayer().getTrustedResourceUrl(), control.getDomHelper());\n  flash.render(div);\n\n  return div;\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n *\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.media.GoogleVideo.prototype.getCssClass = function() {\n  return goog.ui.media.GoogleVideo.CSS_CLASS;\n};\n\n\n\n/**\n * The `goog.ui.media.GoogleVideo` media data model. It stores a required\n * `videoId` field, sets the GoogleVideo URL, and allows a few optional\n * parameters.\n *\n * @param {string} videoId The GoogleVideo video id.\n * @param {string=} opt_caption An optional caption of the GoogleVideo video.\n * @param {string=} opt_description An optional description of the GoogleVideo\n *     video.\n * @param {boolean=} opt_autoplay Whether to autoplay video.\n * @constructor\n * @extends {goog.ui.media.MediaModel}\n * @final\n */\ngoog.ui.media.GoogleVideoModel = function(\n    videoId, opt_caption, opt_description, opt_autoplay) {\n  goog.ui.media.MediaModel.call(\n      this, goog.ui.media.GoogleVideoModel.buildUrl(videoId), opt_caption,\n      opt_description, goog.ui.media.MediaModel.MimeType.FLASH);\n\n  /**\n   * The GoogleVideo video id.\n   * @type {string}\n   * @private\n   */\n  this.videoId_ = videoId;\n\n  this.setPlayer(\n      new goog.ui.media.MediaModel.Player(\n          goog.ui.media.GoogleVideoModel.buildFlashUrl(videoId, opt_autoplay)));\n};\ngoog.inherits(goog.ui.media.GoogleVideoModel, goog.ui.media.MediaModel);\n\n\n/**\n * Regular expression used to extract the GoogleVideo video id (docid) out of\n * GoogleVideo URLs.\n *\n * @type {RegExp}\n * @private\n * @const\n */\ngoog.ui.media.GoogleVideoModel.MATCHER_ =\n    /^https?:\\/\\/(?:www\\.)?video\\.google\\.com\\/videoplay.*[\\?#]docid=(-?[0-9]+)#?$/i;\n\n\n/**\n * A auxiliary static method that parses a GoogleVideo URL, extracting the ID of\n * the video, and builds a GoogleVideoModel.\n *\n * @param {string} googleVideoUrl A GoogleVideo video URL.\n * @param {string=} opt_caption An optional caption of the GoogleVideo video.\n * @param {string=} opt_description An optional description of the GoogleVideo\n *     video.\n * @param {boolean=} opt_autoplay Whether to autoplay video.\n * @return {!goog.ui.media.GoogleVideoModel} The data model that represents the\n *     GoogleVideo URL.\n * @see goog.ui.media.GoogleVideoModel.getVideoId()\n * @throws Error in case the parsing fails.\n */\ngoog.ui.media.GoogleVideoModel.newInstance = function(\n    googleVideoUrl, opt_caption, opt_description, opt_autoplay) {\n  if (goog.ui.media.GoogleVideoModel.MATCHER_.test(googleVideoUrl)) {\n    var data = goog.ui.media.GoogleVideoModel.MATCHER_.exec(googleVideoUrl);\n    return new goog.ui.media.GoogleVideoModel(\n        data[1], opt_caption, opt_description, opt_autoplay);\n  }\n\n  throw new Error(\n      'failed to parse video id from GoogleVideo url: ' + googleVideoUrl);\n};\n\n\n/**\n * The opposite of `goog.ui.media.GoogleVideo.newInstance`: it takes a\n * videoId and returns a GoogleVideo URL.\n *\n * @param {string} videoId The GoogleVideo video ID.\n * @return {string} The GoogleVideo URL.\n */\ngoog.ui.media.GoogleVideoModel.buildUrl = function(videoId) {\n  return 'https://video.google.com/videoplay?docid=' +\n      goog.string.urlEncode(videoId);\n};\n\n\n/**\n * An auxiliary method that builds URL of the flash movie to be embedded,\n * out of the GoogleVideo video id.\n *\n * @param {string} videoId The GoogleVideo video ID.\n * @param {boolean=} opt_autoplay Whether the flash movie should start playing\n *     as soon as it is shown, or if it should show a 'play' button.\n * @return {!goog.html.TrustedResourceUrl} The flash URL to be embedded on the\n *     page.\n */\ngoog.ui.media.GoogleVideoModel.buildFlashUrl = function(videoId, opt_autoplay) {\n  return goog.html.TrustedResourceUrl.format(\n      goog.string.Const.from(\n          'https://video.google.com/googleplayer.swf?docid=%{docid}' +\n          '&hl=en&fs=true%{autoplay}'),\n      {\n        'docid': videoId,\n        'autoplay': opt_autoplay ? goog.string.Const.from('&autoplay=1') : ''\n      });\n};\n\n\n/**\n * Gets the GoogleVideo video id.\n * @return {string} The GoogleVideo video id.\n */\ngoog.ui.media.GoogleVideoModel.prototype.getVideoId = function() {\n  return this.videoId_;\n};\n","^?",1579837703000,"^@",["^A",["~$goog.html.TrustedResourceUrl","^16","~$goog.ui.media.MediaModel","^5","^6","^3","^1:","~$goog.ui.media.FlashObject"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/media/googlevideo.js"],"^S",["^A",["~$goog.ui.media.GoogleVideo","~$goog.ui.media.GoogleVideoModel"]],"^1",true,"^2",["^3","^U8","^16","^1:","^U:","^5","^U9","^6"]],["^ ","^7",[1579837703000],"^8","goog.debug.fancywindow.js","^9",["^:","goog/debug/fancywindow.js"],"^;","goog/debug/fancywindow.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the FancyWindow class. Please minimize\n * dependencies this file has on other closure classes as any dependency it\n * takes won't be able to use the logging infrastructure.\n *\n * This is a pretty hacky implementation, aimed at making debugging of large\n * applications more manageable.\n *\n * @see ../demos/debug.html\n */\n\n\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.debug.FancyWindow');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.debug.DebugWindow');\ngoog.require('goog.debug.LogManager');\ngoog.require('goog.debug.Logger');\ngoog.require('goog.dom.DomHelper');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.SafeStyleSheet');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.string.Const');\ngoog.require('goog.userAgent');\n\n\n\n// TODO(mlourenco): Introduce goog.scope for goog.html.SafeHtml once b/12014412\n// is fixed.\n/**\n * Provides a Fancy extension to the DebugWindow class.  Allows filtering based\n * on loggers and levels.\n *\n * @param {string=} opt_identifier Idenitifier for this logging class.\n * @param {string=} opt_prefix Prefix pre-pended to messages.\n * @constructor\n * @extends {goog.debug.DebugWindow}\n */\ngoog.debug.FancyWindow = function(opt_identifier, opt_prefix) {\n  this.readOptionsFromLocalStorage_();\n  goog.debug.FancyWindow.base(this, 'constructor', opt_identifier, opt_prefix);\n  /** @private {?goog.dom.DomHelper} */\n  this.dh_ = null;\n};\ngoog.inherits(goog.debug.FancyWindow, goog.debug.DebugWindow);\n\n\n/**\n * Constant indicating if we are able to use localStorage to persist filters\n * @type {boolean}\n */\ngoog.debug.FancyWindow.HAS_LOCAL_STORE = (function() {\n\n  try {\n    return !!window['localStorage'].getItem;\n  } catch (e) {\n  }\n  return false;\n})();\n\n\n/**\n * Constant defining the prefix to use when storing log levels\n * @type {string}\n */\ngoog.debug.FancyWindow.LOCAL_STORE_PREFIX = 'fancywindow.sel.';\n\n\n/** @override */\ngoog.debug.FancyWindow.prototype.writeBufferToLog = function() {\n  this.lastCall = goog.now();\n  if (this.hasActiveWindow()) {\n    var logel = /** @type {!HTMLElement} */ (this.dh_.getElement('log'));\n\n    // Work out if scrolling is needed before we add the content\n    var scroll =\n        logel.scrollHeight - (logel.scrollTop + logel.offsetHeight) <= 100;\n\n    for (var i = 0; i < this.outputBuffer.length; i++) {\n      var div = this.dh_.createDom(goog.dom.TagName.DIV, 'logmsg');\n      goog.dom.safe.setInnerHtml(div, this.outputBuffer[i]);\n      logel.appendChild(div);\n    }\n    this.outputBuffer.length = 0;\n    this.resizeStuff_();\n\n    if (scroll) {\n      logel.scrollTop = logel.scrollHeight;\n    }\n  }\n};\n\n\n/** @override */\ngoog.debug.FancyWindow.prototype.writeInitialDocument = function() {\n  if (!this.hasActiveWindow()) {\n    return;\n  }\n\n  var doc = this.win.document;\n  doc.open();\n  goog.dom.safe.documentWrite(doc, this.getHtml_());\n  doc.close();\n\n  (goog.userAgent.IE ? doc.body : this.win).onresize =\n      goog.bind(this.resizeStuff_, this);\n\n  // Create a dom helper for the logging window\n  this.dh_ = new goog.dom.DomHelper(doc);\n\n  // Don't use events system to reduce dependencies\n  this.dh_.getElement('openbutton').onclick =\n      goog.bind(this.openOptions_, this);\n  this.dh_.getElement('closebutton').onclick =\n      goog.bind(this.closeOptions_, this);\n  this.dh_.getElement('clearbutton').onclick = goog.bind(this.clear, this);\n  this.dh_.getElement('exitbutton').onclick = goog.bind(this.exit_, this);\n\n  this.writeSavedMessages();\n};\n\n\n/**\n * Show the options menu.\n * @return {boolean} false.\n * @private\n */\ngoog.debug.FancyWindow.prototype.openOptions_ = function() {\n  var el = goog.asserts.assert(this.dh_.getElement('optionsarea'));\n  goog.dom.safe.setInnerHtml(el, goog.html.SafeHtml.EMPTY);\n\n  var loggers = goog.debug.FancyWindow.getLoggers_();\n  var dh = this.dh_;\n  for (var i = 0; i < loggers.length; i++) {\n    var logger = loggers[i];\n    var curlevel = logger.getLevel() ? logger.getLevel().name : 'INHERIT';\n    var div = dh.createDom(\n        goog.dom.TagName.DIV, {},\n        this.getDropDown_('sel' + logger.getName(), curlevel),\n        dh.createDom(goog.dom.TagName.SPAN, {}, logger.getName() || '(root)'));\n    el.appendChild(div);\n  }\n\n  this.dh_.getElement('options').style.display = 'block';\n  return false;\n};\n\n\n/**\n * Make a drop down for the log levels.\n * @param {string} id Logger id.\n * @param {string} selected What log level is currently selected.\n * @return {Element} The newly created 'select' DOM element.\n * @private\n */\ngoog.debug.FancyWindow.prototype.getDropDown_ = function(id, selected) {\n  var dh = this.dh_;\n  var sel = dh.createDom(goog.dom.TagName.SELECT, {'id': id});\n  var levels = goog.debug.Logger.Level.PREDEFINED_LEVELS;\n  for (var i = 0; i < levels.length; i++) {\n    var level = levels[i];\n    var option = dh.createDom(goog.dom.TagName.OPTION, {}, level.name);\n    if (selected == level.name) {\n      option.selected = true;\n    }\n    sel.appendChild(option);\n  }\n  sel.appendChild(\n      dh.createDom(\n          goog.dom.TagName.OPTION, {'selected': selected == 'INHERIT'},\n          'INHERIT'));\n  return sel;\n};\n\n\n/**\n * Close the options menu.\n * @return {boolean} The value false.\n * @private\n */\ngoog.debug.FancyWindow.prototype.closeOptions_ = function() {\n  this.dh_.getElement('options').style.display = 'none';\n  var loggers = goog.debug.FancyWindow.getLoggers_();\n  var dh = this.dh_;\n  for (var i = 0; i < loggers.length; i++) {\n    var logger = loggers[i];\n    var sel = /** @type {!HTMLSelectElement} */ (\n        dh.getElement('sel' + logger.getName()));\n    var level = sel.options[sel.selectedIndex].text;\n    if (level == 'INHERIT') {\n      logger.setLevel(null);\n    } else {\n      logger.setLevel(goog.debug.Logger.Level.getPredefinedLevel(level));\n    }\n  }\n  this.writeOptionsToLocalStorage_();\n  return false;\n};\n\n\n/**\n * Resizes the log elements\n * @private\n */\ngoog.debug.FancyWindow.prototype.resizeStuff_ = function() {\n  var dh = this.dh_;\n  var logel = /** @type {!HTMLElement} */ (dh.getElement('log'));\n  var headel = /** @type {!HTMLElement} */ (dh.getElement('head'));\n  logel.style.top = headel.offsetHeight + 'px';\n  logel.style.height = (dh.getDocument().body.offsetHeight -\n                        headel.offsetHeight - (goog.userAgent.IE ? 4 : 0)) +\n      'px';\n};\n\n\n/**\n * Handles the user clicking the exit button, disabled the debug window and\n * closes the popup.\n * @param {Event} e Event object.\n * @private\n */\ngoog.debug.FancyWindow.prototype.exit_ = function(e) {\n  this.setEnabled(false);\n  if (this.win) {\n    this.win.close();\n  }\n};\n\n\n/** @override */\ngoog.debug.FancyWindow.prototype.getStyleRules = function() {\n  var baseRules = goog.debug.FancyWindow.base(this, 'getStyleRules');\n  var extraRules = goog.html.SafeStyleSheet.fromConstant(\n      goog.string.Const.from(\n          'html,body{height:100%;width:100%;margin:0px;padding:0px;' +\n          'background-color:#FFF;overflow:hidden}' +\n          '*{}' +\n          '.logmsg{border-bottom:1px solid #CCC;padding:2px;font:90% monospace}' +\n          '#head{position:absolute;width:100%;font:x-small arial;' +\n          'border-bottom:2px solid #999;background-color:#EEE;}' +\n          '#head p{margin:0px 5px;}' +\n          '#log{position:absolute;width:100%;background-color:#FFF;}' +\n          '#options{position:absolute;right:0px;width:50%;height:100%;' +\n          'border-left:1px solid #999;background-color:#DDD;display:none;' +\n          'padding-left: 5px;font:normal small arial;overflow:auto;}' +\n          '#openbutton,#closebutton{text-decoration:underline;color:#00F;cursor:' +\n          'pointer;position:absolute;top:0px;right:5px;font:x-small arial;}' +\n          '#clearbutton{text-decoration:underline;color:#00F;cursor:' +\n          'pointer;position:absolute;top:0px;right:80px;font:x-small arial;}' +\n          '#exitbutton{text-decoration:underline;color:#00F;cursor:' +\n          'pointer;position:absolute;top:0px;right:50px;font:x-small arial;}' +\n          'select{font:x-small arial;margin-right:10px;}' +\n          'hr{border:0;height:5px;background-color:#8c8;color:#8c8;}'));\n  return goog.html.SafeStyleSheet.concat(baseRules, extraRules);\n};\n\n\n/**\n * Return the default HTML for the debug window\n * @return {!goog.html.SafeHtml} Html.\n * @private\n */\ngoog.debug.FancyWindow.prototype.getHtml_ = function() {\n  var SafeHtml = goog.html.SafeHtml;\n  var head = SafeHtml.create(\n      'head', {},\n      SafeHtml.concat(\n          SafeHtml.create('title', {}, 'Logging: ' + this.identifier),\n          SafeHtml.createStyle(this.getStyleRules())));\n\n  var body = SafeHtml.create(\n      'body', {},\n      SafeHtml.concat(\n          SafeHtml.create(\n              'div',\n              {'id': 'log', 'style': goog.string.Const.from('overflow:auto')}),\n          SafeHtml.create(\n              'div', {'id': 'head'},\n              SafeHtml.concat(\n                  SafeHtml.create(\n                      'p', {},\n                      SafeHtml.create('b', {}, 'Logging: ' + this.identifier)),\n                  SafeHtml.create('p', {}, this.welcomeMessage),\n                  SafeHtml.create('span', {'id': 'clearbutton'}, 'clear'),\n                  SafeHtml.create('span', {'id': 'exitbutton'}, 'exit'),\n                  SafeHtml.create('span', {'id': 'openbutton'}, 'options'))),\n          SafeHtml.create(\n              'div', {'id': 'options'},\n              SafeHtml.concat(\n                  SafeHtml.create(\n                      'big', {}, SafeHtml.create('b', {}, 'Options:')),\n                  SafeHtml.create('div', {'id': 'optionsarea'}),\n                  SafeHtml.create(\n                      'span', {'id': 'closebutton'}, 'save and close')))));\n\n  return SafeHtml.create('html', {}, SafeHtml.concat(head, body));\n};\n\n\n/**\n * Write logger levels to localStorage if possible.\n * @private\n */\ngoog.debug.FancyWindow.prototype.writeOptionsToLocalStorage_ = function() {\n  if (!goog.debug.FancyWindow.HAS_LOCAL_STORE) {\n    return;\n  }\n  var loggers = goog.debug.FancyWindow.getLoggers_();\n  var storedKeys = goog.debug.FancyWindow.getStoredKeys_();\n  for (var i = 0; i < loggers.length; i++) {\n    var key = goog.debug.FancyWindow.LOCAL_STORE_PREFIX + loggers[i].getName();\n    var level = loggers[i].getLevel();\n    if (key in storedKeys) {\n      if (!level) {\n        window.localStorage.removeItem(key);\n      } else if (window.localStorage.getItem(key) != level.name) {\n        window.localStorage.setItem(key, level.name);\n      }\n    } else if (level) {\n      window.localStorage.setItem(key, level.name);\n    }\n  }\n};\n\n\n/**\n * Sync logger levels with any values stored in localStorage.\n * @private\n */\ngoog.debug.FancyWindow.prototype.readOptionsFromLocalStorage_ = function() {\n  if (!goog.debug.FancyWindow.HAS_LOCAL_STORE) {\n    return;\n  }\n  var storedKeys = goog.debug.FancyWindow.getStoredKeys_();\n  for (var key in storedKeys) {\n    var loggerName = key.replace(goog.debug.FancyWindow.LOCAL_STORE_PREFIX, '');\n    var logger = goog.debug.LogManager.getLogger(loggerName);\n    var curLevel = logger.getLevel();\n    var storedLevel = window.localStorage.getItem(key).toString();\n    if (!curLevel || curLevel.toString() != storedLevel) {\n      logger.setLevel(goog.debug.Logger.Level.getPredefinedLevel(storedLevel));\n    }\n  }\n};\n\n\n/**\n * Helper function to create a list of locally stored keys. Used to avoid\n * expensive localStorage.getItem() calls.\n * @return {!Object} List of keys.\n * @private\n */\ngoog.debug.FancyWindow.getStoredKeys_ = function() {\n  var storedKeys = {};\n  for (var i = 0, len = window.localStorage.length; i < len; i++) {\n    var key = window.localStorage.key(i);\n    if (key != null &&\n        goog.string.startsWith(\n            key, goog.debug.FancyWindow.LOCAL_STORE_PREFIX)) {\n      storedKeys[key] = true;\n    }\n  }\n  return storedKeys;\n};\n\n\n/**\n * Gets a sorted array of all the loggers registered.\n * @return {!Array<!goog.debug.Logger>} Array of logger instances.\n * @private\n */\ngoog.debug.FancyWindow.getLoggers_ = function() {\n  var loggers = goog.object.getValues(goog.debug.LogManager.getLoggers());\n\n  /**\n   * @param {!goog.debug.Logger} a\n   * @param {!goog.debug.Logger} b\n   * @return {number}\n   */\n  var loggerSort = function(a, b) {\n    return goog.array.defaultCompare(a.getName(), b.getName());\n  };\n  goog.array.sort(loggers, loggerSort);\n  return loggers;\n};\n","^?",1579837703000,"^@",["^A",["^1J","^25","^16","~$goog.debug.LogManager","^3","~$goog.debug.Logger","^21","^18","^1:","^1;","~$goog.html.SafeStyleSheet","^1S","^24","^4","~$goog.debug.DebugWindow"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/fancywindow.js"],"^S",["^A",["~$goog.debug.FancyWindow"]],"^1",true,"^2",["^3","^1S","^1J","^U@","^U=","^U>","^25","^4","^1;","^24","^U?","^21","^16","^1:","^18"]],["^ ","^7",[1579837703000],"^8","goog.ui.menubar.js","^9",["^:","goog/ui/menubar.js"],"^;","goog/ui/menubar.js","^<","^=","^>","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A base menu bar factory. Can be bound to an existing\n * HTML structure or can generate its own DOM.\n *\n * To decorate, the menu bar should be bound to an element containing children\n * with the classname 'goog-menu-button'.  See menubar.html for example.\n *\n * @see ../demos/menubar.html\n */\n\ngoog.provide('goog.ui.menuBar');\n\ngoog.require('goog.ui.Container');\ngoog.require('goog.ui.MenuBarRenderer');\n\n\n/**\n * The menuBar factory creates a new menu bar.\n * @param {goog.ui.ContainerRenderer=} opt_renderer Renderer used to render or\n *     decorate the menu bar; defaults to {@link goog.ui.MenuBarRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper, used for document\n *     interaction.\n * @return {!goog.ui.Container} The created menu bar.\n */\ngoog.ui.menuBar.create = function(opt_renderer, opt_domHelper) {\n  return new goog.ui.Container(\n      null, opt_renderer ? opt_renderer : goog.ui.MenuBarRenderer.getInstance(),\n      opt_domHelper);\n};\n","^?",1579837703000,"^@",["^A",["^3","^55","~$goog.ui.MenuBarRenderer"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/menubar.js"],"^S",["^A",["~$goog.ui.menuBar"]],"^1",true,"^2",["^3","^55","^UB"]],["^ ","^7",[1579837703000],"^8","goog.fs.filesaver.js","^9",["^:","goog/fs/filesaver.js"],"^;","goog/fs/filesaver.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A wrapper for the HTML5 FileSaver object.\n *\n */\n\ngoog.provide('goog.fs.FileSaver');\ngoog.provide('goog.fs.FileSaver.EventType');\ngoog.provide('goog.fs.FileSaver.ReadyState');\n\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.fs.Error');\ngoog.require('goog.fs.ProgressEvent');\n\n\n\n/**\n * An object for monitoring the saving of files. This emits ProgressEvents of\n * the types listed in {@link goog.fs.FileSaver.EventType}.\n *\n * This should not be instantiated directly. Instead, its subclass\n * {@link goog.fs.FileWriter} should be accessed via\n * {@link goog.fs.FileEntry#createWriter}.\n *\n * @param {!FileSaver} fileSaver The underlying FileSaver object.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.fs.FileSaver = function(fileSaver) {\n  goog.fs.FileSaver.base(this, 'constructor');\n\n  /**\n   * The underlying FileSaver object.\n   *\n   * @type {!FileSaver}\n   * @private\n   */\n  this.saver_ = fileSaver;\n\n  this.saver_.onwritestart = goog.bind(this.dispatchProgressEvent_, this);\n  this.saver_.onprogress = goog.bind(this.dispatchProgressEvent_, this);\n  this.saver_.onwrite = goog.bind(this.dispatchProgressEvent_, this);\n  this.saver_.onabort = goog.bind(this.dispatchProgressEvent_, this);\n  this.saver_.onerror = goog.bind(this.dispatchProgressEvent_, this);\n  this.saver_.onwriteend = goog.bind(this.dispatchProgressEvent_, this);\n};\ngoog.inherits(goog.fs.FileSaver, goog.events.EventTarget);\n\n\n/**\n * Possible states for a FileSaver.\n *\n * @enum {number}\n */\ngoog.fs.FileSaver.ReadyState = {\n  /**\n   * The object has been constructed, but there is no pending write.\n   */\n  INIT: 0,\n  /**\n   * Data is being written.\n   */\n  WRITING: 1,\n  /**\n   * The data has been written to the file, the write was aborted, or an error\n   * occurred.\n   */\n  DONE: 2\n};\n\n\n/**\n * Events emitted by a FileSaver.\n *\n * @enum {string}\n */\ngoog.fs.FileSaver.EventType = {\n  /**\n   * Emitted when the writing begins. readyState will be WRITING.\n   */\n  WRITE_START: 'writestart',\n  /**\n   * Emitted when progress has been made in saving the file. readyState will be\n   * WRITING.\n   */\n  PROGRESS: 'progress',\n  /**\n   * Emitted when the data has been successfully written. readyState will be\n   * WRITING.\n   */\n  WRITE: 'write',\n  /**\n   * Emitted when the writing has been aborted. readyState will be WRITING.\n   */\n  ABORT: 'abort',\n  /**\n   * Emitted when an error is encountered or the writing has been aborted.\n   * readyState will be WRITING.\n   */\n  ERROR: 'error',\n  /**\n   * Emitted when the writing is finished, whether successfully or not.\n   * readyState will be DONE.\n   */\n  WRITE_END: 'writeend'\n};\n\n\n/**\n * Abort the writing of the file.\n */\ngoog.fs.FileSaver.prototype.abort = function() {\n  try {\n    this.saver_.abort();\n  } catch (e) {\n    throw new goog.fs.Error(e, 'aborting save');\n  }\n};\n\n\n/**\n * @return {goog.fs.FileSaver.ReadyState} The current state of the FileSaver.\n */\ngoog.fs.FileSaver.prototype.getReadyState = function() {\n  return /** @type {goog.fs.FileSaver.ReadyState} */ (this.saver_.readyState);\n};\n\n\n/**\n * @return {goog.fs.Error} The error encountered while writing, if any.\n */\ngoog.fs.FileSaver.prototype.getError = function() {\n  return this.saver_.error &&\n      new goog.fs.Error(this.saver_.error, 'saving file');\n};\n\n\n/**\n * Wrap a progress event emitted by the underlying file saver and re-emit it.\n *\n * @param {!ProgressEvent} event The underlying event.\n * @private\n */\ngoog.fs.FileSaver.prototype.dispatchProgressEvent_ = function(event) {\n  this.dispatchEvent(new goog.fs.ProgressEvent(event, this));\n};\n\n\n/** @override */\ngoog.fs.FileSaver.prototype.disposeInternal = function() {\n  delete this.saver_;\n  goog.fs.FileSaver.base(this, 'disposeInternal');\n};\n","^?",1579837703000,"^@",["^A",["^4E","^3","^1M","~$goog.fs.ProgressEvent"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fs/filesaver.js"],"^S",["^A",["^4B","~$goog.fs.FileSaver.EventType","~$goog.fs.FileSaver.ReadyState"]],"^1",true,"^2",["^3","^1M","^4E","^UD"]],["^ ","^7",[1579837703000],"^8","goog.fx.dragscrollsupport.js","^9",["^:","goog/fx/dragscrollsupport.js"],"^;","goog/fx/dragscrollsupport.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class to support scrollable containers for drag and drop.\n *\n * @author dgajda@google.com (Damian Gajda)\n */\n\ngoog.provide('goog.fx.DragScrollSupport');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.Timer');\ngoog.require('goog.dom');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.style');\n\n\n\n/**\n * A scroll support class. Currently this class will automatically scroll\n * a scrollable container node and scroll it by a fixed amount at a timed\n * interval when the mouse is moved above or below the container or in vertical\n * margin areas. Intended for use in drag and drop. This could potentially be\n * made more general and could support horizontal scrolling.\n *\n * @param {Element} containerNode A container that can be scrolled.\n * @param {number=} opt_margin Optional margin to use while scrolling.\n * @param {boolean=} opt_externalMouseMoveTracking Whether mouse move events\n *     are tracked externally by the client object which calls the mouse move\n *     event handler, useful when events are generated for more than one source\n *     element and/or are not real mousemove events.\n * @constructor\n * @struct\n * @extends {goog.Disposable}\n * @see ../demos/dragscrollsupport.html\n */\ngoog.fx.DragScrollSupport = function(\n    containerNode, opt_margin, opt_externalMouseMoveTracking) {\n  goog.fx.DragScrollSupport.base(this, 'constructor');\n\n  /**\n   * Whether scrolling should be constrained to happen only when the cursor is\n   * inside the container node.\n   * @private {boolean}\n   */\n  this.constrainScroll_ = false;\n\n  /**\n   * Whether horizontal scrolling is allowed.\n   * @private {boolean}\n   */\n  this.horizontalScrolling_ = true;\n\n  /**\n   * The container to be scrolled.\n   * @type {Element}\n   * @private\n   */\n  this.containerNode_ = containerNode;\n\n  /**\n   * Scroll timer that will scroll the container until it is stopped.\n   * It will scroll when the mouse is outside the scrolling area of the\n   * container.\n   *\n   * @type {goog.Timer}\n   * @private\n   */\n  this.scrollTimer_ = new goog.Timer(goog.fx.DragScrollSupport.TIMER_STEP_);\n\n  /**\n   * EventHandler used to set up and tear down listeners.\n   * @type {goog.events.EventHandler<!goog.fx.DragScrollSupport>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  /**\n   * The current scroll delta.\n   * @type {goog.math.Coordinate}\n   * @private\n   */\n  this.scrollDelta_ = new goog.math.Coordinate();\n\n  /**\n   * The container bounds.\n   * @type {goog.math.Rect}\n   * @private\n   */\n  this.containerBounds_ = goog.style.getBounds(containerNode);\n  if (containerNode.tagName === 'BODY' || containerNode.tagName === 'HTML') {\n    var size = goog.dom.getViewportSize();\n    this.containerBounds_.height = size.height;\n    this.containerBounds_.width = size.width;\n  }\n\n  /**\n   * The margin for triggering a scroll.\n   * @type {number}\n   * @private\n   */\n  this.margin_ = opt_margin || 0;\n\n  /**\n   * The bounding rectangle which if left triggers scrolling.\n   * @type {goog.math.Rect}\n   * @private\n   */\n  this.scrollBounds_ = opt_margin ?\n      this.constrainBounds_(this.containerBounds_.clone()) :\n      this.containerBounds_;\n\n  this.setupListeners_(!!opt_externalMouseMoveTracking);\n};\ngoog.inherits(goog.fx.DragScrollSupport, goog.Disposable);\n\n\n/**\n * The scroll timer step in ms.\n * @type {number}\n * @private\n */\ngoog.fx.DragScrollSupport.TIMER_STEP_ = 50;\n\n\n/**\n * The scroll step in pixels.\n * @type {number}\n * @private\n */\ngoog.fx.DragScrollSupport.SCROLL_STEP_ = 8;\n\n\n/**\n * The suggested scrolling margin.\n * @type {number}\n */\ngoog.fx.DragScrollSupport.MARGIN = 32;\n\n\n/**\n * Sets whether scrolling should be constrained to happen only when the cursor\n * is inside the container node.\n * NOTE: If a margin is not set, then it does not make sense to\n * contain the scroll, because in that case scroll will never be triggered.\n * @param {boolean} constrain Whether scrolling should be constrained to happen\n *     only when the cursor is inside the container node.\n */\ngoog.fx.DragScrollSupport.prototype.setConstrainScroll = function(constrain) {\n  this.constrainScroll_ = !!this.margin_ && constrain;\n};\n\n\n/**\n * Sets whether horizontal scrolling is allowed.\n * @param {boolean} scrolling Whether horizontal scrolling is allowed.\n */\ngoog.fx.DragScrollSupport.prototype.setHorizontalScrolling = function(\n    scrolling) {\n  this.horizontalScrolling_ = scrolling;\n};\n\n\n/**\n * Constrains the container bounds with respect to the margin.\n *\n * @param {goog.math.Rect} bounds The container element.\n * @return {goog.math.Rect} The bounding rectangle used to calculate scrolling\n *     direction.\n * @private\n */\ngoog.fx.DragScrollSupport.prototype.constrainBounds_ = function(bounds) {\n  var margin = this.margin_;\n  if (margin) {\n    var quarterHeight = bounds.height * 0.25;\n    var yMargin = Math.min(margin, quarterHeight);\n    bounds.top += yMargin;\n    bounds.height -= 2 * yMargin;\n\n    var quarterWidth = bounds.width * 0.25;\n    var xMargin = Math.min(margin, quarterWidth);\n    bounds.left += xMargin;\n    bounds.width -= 2 * xMargin;\n  }\n  return bounds;\n};\n\n\n/**\n * Attaches listeners and activates automatic scrolling.\n * @param {boolean} externalMouseMoveTracking Whether to enable internal\n *     mouse move event handling.\n * @private\n */\ngoog.fx.DragScrollSupport.prototype.setupListeners_ = function(\n    externalMouseMoveTracking) {\n  if (!externalMouseMoveTracking) {\n    // Track mouse pointer position to determine scroll direction.\n    this.eventHandler_.listen(\n        goog.dom.getOwnerDocument(this.containerNode_),\n        goog.events.EventType.MOUSEMOVE, this.onMouseMove);\n  }\n\n  // Scroll with a constant speed.\n  this.eventHandler_.listen(this.scrollTimer_, goog.Timer.TICK, this.onTick_);\n};\n\n\n/**\n * Handler for timer tick event, scrolls the container by one scroll step if\n * needed.\n * @param {goog.events.Event} event Timer tick event.\n * @private\n */\ngoog.fx.DragScrollSupport.prototype.onTick_ = function(event) {\n  this.containerNode_.scrollTop += this.scrollDelta_.y;\n  this.containerNode_.scrollLeft += this.scrollDelta_.x;\n};\n\n\n/**\n * Handler for mouse moves events.\n * @param {goog.events.Event} event Mouse move event.\n */\ngoog.fx.DragScrollSupport.prototype.onMouseMove = function(event) {\n  var deltaX = this.horizontalScrolling_ ?\n      this.calculateScrollDelta(\n          event.clientX, this.scrollBounds_.left, this.scrollBounds_.width) :\n      0;\n  var deltaY = this.calculateScrollDelta(\n      event.clientY, this.scrollBounds_.top, this.scrollBounds_.height);\n  this.scrollDelta_.x = deltaX;\n  this.scrollDelta_.y = deltaY;\n\n  // If the scroll data is 0 or the event fired outside of the\n  // bounds of the container node.\n  if ((!deltaX && !deltaY) ||\n      (this.constrainScroll_ &&\n       !this.isInContainerBounds_(event.clientX, event.clientY))) {\n    this.scrollTimer_.stop();\n  } else if (!this.scrollTimer_.enabled) {\n    this.scrollTimer_.start();\n  }\n};\n\n\n/**\n * Gets whether the input coordinate is in the container bounds.\n * @param {number} x The x coordinate.\n * @param {number} y The y coordinate.\n * @return {boolean} Whether the input coordinate is in the container bounds.\n * @private\n */\ngoog.fx.DragScrollSupport.prototype.isInContainerBounds_ = function(x, y) {\n  var containerBounds = this.containerBounds_;\n  return containerBounds.left <= x &&\n      containerBounds.left + containerBounds.width >= x &&\n      containerBounds.top <= y &&\n      containerBounds.top + containerBounds.height >= y;\n};\n\n\n/**\n * Calculates scroll delta.\n *\n * @param {number} coordinate Current mouse pointer coordinate.\n * @param {number} min The coordinate value below which scrolling up should be\n *     started.\n * @param {number} rangeLength The length of the range in which scrolling should\n *     be disabled and above which scrolling down should be started.\n * @return {number} The calculated scroll delta.\n * @protected\n */\ngoog.fx.DragScrollSupport.prototype.calculateScrollDelta = function(\n    coordinate, min, rangeLength) {\n  var delta = 0;\n  if (coordinate < min) {\n    delta = -goog.fx.DragScrollSupport.SCROLL_STEP_;\n  } else if (coordinate > min + rangeLength) {\n    delta = goog.fx.DragScrollSupport.SCROLL_STEP_;\n  }\n  return delta;\n};\n\n\n/** @override */\ngoog.fx.DragScrollSupport.prototype.disposeInternal = function() {\n  goog.fx.DragScrollSupport.superClass_.disposeInternal.call(this);\n  this.eventHandler_.dispose();\n  this.scrollTimer_.dispose();\n};\n","^?",1579837703000,"^@",["^A",["^14","^2R","^3U","^3","^1C","^22","^3C","^2Y"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/dragscrollsupport.js"],"^S",["^A",["~$goog.fx.DragScrollSupport"]],"^1",true,"^2",["^3","^3C","^3U","^14","^2R","^1C","^22","^2Y"]],["^ ","^7",[1579837703000],"^8","goog.net.xpc.directtransport.js","^9",["^:","goog/net/xpc/directtransport.js"],"^;","goog/net/xpc/directtransport.js","^<","^=","^>","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides an implementation of a transport that can call methods\n * directly on a frame. Useful if you want to use XPC for crossdomain messaging\n * (using another transport), or same domain messaging (using this transport).\n */\n\n\ngoog.provide('goog.net.xpc.DirectTransport');\n\ngoog.require('goog.Timer');\ngoog.require('goog.async.Deferred');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.log');\ngoog.require('goog.net.xpc');\ngoog.require('goog.net.xpc.CfgFields');\ngoog.require('goog.net.xpc.CrossPageChannelRole');\ngoog.require('goog.net.xpc.Transport');\ngoog.require('goog.net.xpc.TransportTypes');\ngoog.require('goog.object');\n\n\ngoog.scope(function() {\nvar CfgFields = goog.net.xpc.CfgFields;\nvar CrossPageChannelRole = goog.net.xpc.CrossPageChannelRole;\nvar Deferred = goog.async.Deferred;\nvar EventHandler = goog.events.EventHandler;\nvar Timer = goog.Timer;\nvar Transport = goog.net.xpc.Transport;\n\n\n\n/**\n * A direct window to window method transport.\n *\n * If the windows are in the same security context, this transport calls\n * directly into the other window without using any additional mechanism. This\n * is mainly used in scenarios where you want to optionally use a cross domain\n * transport in cross security context situations, or optionally use a direct\n * transport in same security context situations.\n *\n * Note: Global properties are exported by using this transport. One to\n * communicate with the other window by, currently crosswindowmessaging.channel,\n * and by using goog.getUid on window, currently closure_uid_[0-9]+.\n *\n * @param {!goog.net.xpc.CrossPageChannel} channel The channel this\n *     transport belongs to.\n * @param {goog.dom.DomHelper=} opt_domHelper The dom helper to use for\n *     finding the correct window/document. If omitted, uses the current\n *     document.\n * @constructor\n * @extends {Transport}\n */\ngoog.net.xpc.DirectTransport = function(channel, opt_domHelper) {\n  goog.net.xpc.DirectTransport.base(this, 'constructor', opt_domHelper);\n\n  /**\n   * The channel this transport belongs to.\n   * @private {!goog.net.xpc.CrossPageChannel}\n   */\n  this.channel_ = channel;\n\n  /** @private {!EventHandler<!goog.net.xpc.DirectTransport>} */\n  this.eventHandler_ = new EventHandler(this);\n  this.registerDisposable(this.eventHandler_);\n\n  /**\n   * Timer for connection reattempts.\n   * @private {!Timer}\n   */\n  this.maybeAttemptToConnectTimer_ = new Timer(\n      DirectTransport.CONNECTION_ATTEMPT_INTERVAL_MS_, this.getWindow());\n  this.registerDisposable(this.maybeAttemptToConnectTimer_);\n\n  /**\n   * Fires once we've received our SETUP_ACK message.\n   * @private {!Deferred}\n   */\n  this.setupAckReceived_ = new Deferred();\n\n  /**\n   * Fires once we've sent our SETUP_ACK message.\n   * @private {!Deferred}\n   */\n  this.setupAckSent_ = new Deferred();\n\n  /**\n   * Fires once we're marked connected.\n   * @private {!Deferred}\n   */\n  this.connected_ = new Deferred();\n\n  /**\n   * The unique ID of this side of the connection. Used to determine when a peer\n   * is reloaded.\n   * @private {string}\n   */\n  this.endpointId_ = goog.net.xpc.getRandomString(10);\n\n  /**\n   * The unique ID of the peer. If we get a message from a peer with an ID we\n   * don't expect, we reset the connection.\n   * @private {?string}\n   */\n  this.peerEndpointId_ = null;\n\n  /**\n   * The map of sending messages.\n   * @private {Object}\n   */\n  this.asyncSendsMap_ = {};\n\n  /**\n   * The original channel name.\n   * @private {string}\n   */\n  this.originalChannelName_ = this.channel_.name;\n\n  // We reconfigure the channel name to include the role so that we can\n  // communicate in the same window between the different roles on the\n  // same channel.\n  this.channel_.updateChannelNameAndCatalog(\n      DirectTransport.getRoledChannelName_(\n          this.channel_.name, this.channel_.getRole()));\n\n  /**\n   * Flag indicating if this instance of the transport has been initialized.\n   * @private {boolean}\n   */\n  this.initialized_ = false;\n\n  // We don't want to mark ourselves connected until we have sent whatever\n  // message will cause our counterpart in the other frame to also declare\n  // itself connected, if there is such a message.  Otherwise we risk a user\n  // message being sent in advance of that message, and it being discarded.\n\n  // Two sided handshake:\n  // SETUP_ACK has to have been received, and sent.\n  this.connected_.awaitDeferred(this.setupAckReceived_);\n  this.connected_.awaitDeferred(this.setupAckSent_);\n\n  this.connected_.addCallback(this.notifyConnected_, this);\n  this.connected_.callback(true);\n\n  this.eventHandler_.listen(\n      this.maybeAttemptToConnectTimer_, Timer.TICK,\n      this.maybeAttemptToConnect_);\n\n  goog.log.info(\n      goog.net.xpc.logger,\n      'DirectTransport created. role=' + this.channel_.getRole());\n};\ngoog.inherits(goog.net.xpc.DirectTransport, Transport);\nvar DirectTransport = goog.net.xpc.DirectTransport;\n\n\n/**\n * @private {number}\n * @const\n */\nDirectTransport.CONNECTION_ATTEMPT_INTERVAL_MS_ = 100;\n\n\n/**\n * The delay to notify the xpc of a successful connection. This is used\n * to allow both parties to be connected if one party's connection callback\n * invokes an immediate send.\n * @private {number}\n * @const\n */\nDirectTransport.CONNECTION_DELAY_INTERVAL_MS_ = 0;\n\n\n/**\n * @param {!Window} peerWindow The peer window to check if DirectTranport is\n *     supported on.\n * @return {boolean} Whether this transport is supported.\n */\nDirectTransport.isSupported = function(peerWindow) {\n\n  try {\n    return window.document.domain == peerWindow.document.domain;\n  } catch (e) {\n    return false;\n  }\n};\n\n\n/**\n * Tracks the number of DirectTransport channels that have been\n * initialized but not disposed yet in a map keyed by the UID of the window\n * object.  This allows for multiple windows to be initiallized and listening\n * for messages.\n * @private {!Object<number>}\n */\nDirectTransport.activeCount_ = {};\n\n\n/**\n * Path of global message proxy.\n * @private {string}\n * @const\n */\n// TODO(user): Make this configurable using the CfgFields.\nDirectTransport.GLOBAL_TRANPORT_PATH_ = 'crosswindowmessaging.channel';\n\n\n/**\n * The delimiter used for transport service messages.\n * @private {string}\n * @const\n */\nDirectTransport.MESSAGE_DELIMITER_ = ',';\n\n\n/**\n * Initializes this transport. Registers a method for 'message'-events in the\n * global scope.\n * @param {!Window} listenWindow The window to listen to events on.\n * @private\n */\nDirectTransport.initialize_ = function(listenWindow) {\n  var uid = goog.getUid(listenWindow);\n  var value = DirectTransport.activeCount_[uid] || 0;\n  if (value == 0) {\n    // Set up a handler on the window to proxy messages to class.\n    var globalProxy = goog.getObjectByName(\n        DirectTransport.GLOBAL_TRANPORT_PATH_, listenWindow);\n    if (globalProxy == null) {\n      goog.exportSymbol(\n          DirectTransport.GLOBAL_TRANPORT_PATH_,\n          DirectTransport.messageReceivedHandler_, listenWindow);\n    }\n  }\n  DirectTransport.activeCount_[uid]++;\n};\n\n\n/**\n * @param {string} channelName The channel name.\n * @param {string|number} role The role.\n * @return {string} The formatted channel name including role.\n * @private\n */\nDirectTransport.getRoledChannelName_ = function(channelName, role) {\n  return channelName + '_' + role;\n};\n\n\n/**\n * @param {!Object} literal The literal unrenamed message.\n * @return {boolean} Whether the message was successfully delivered to a\n *     channel.\n * @private\n */\nDirectTransport.messageReceivedHandler_ = function(literal) {\n  var msg = DirectTransport.Message_.fromLiteral(literal);\n\n  var channelName = msg.channelName;\n  var service = msg.service;\n  var payload = msg.payload;\n\n  goog.log.fine(\n      goog.net.xpc.logger, 'messageReceived: channel=' + channelName +\n          ', service=' + service + ', payload=' + payload);\n\n  // Attempt to deliver message to the channel. Keep in mind that it may not\n  // exist for several reasons, including but not limited to:\n  //  - a malformed message\n  //  - the channel simply has not been created\n  //  - channel was created in a different namespace\n  //  - message was sent to the wrong window\n  //  - channel has become stale (e.g. caching iframes and back clicks)\n  var channel = goog.net.xpc.channels[channelName];\n  if (channel) {\n    channel.xpcDeliver(service, payload);\n    return true;\n  }\n\n  var transportMessageType = DirectTransport.parseTransportPayload_(payload)[0];\n\n  // Check if there are any stale channel names that can be updated.\n  for (var staleChannelName in goog.net.xpc.channels) {\n    var staleChannel = goog.net.xpc.channels[staleChannelName];\n    if (staleChannel.getRole() == CrossPageChannelRole.INNER &&\n        !staleChannel.isConnected() &&\n        service == goog.net.xpc.TRANSPORT_SERVICE_ &&\n        transportMessageType == goog.net.xpc.SETUP) {\n      // Inner peer received SETUP message but channel names did not match.\n      // Start using the channel name sent from outer peer. The channel name\n      // of the inner peer can easily become out of date, as iframe's and their\n      // JS state get cached in many browsers upon page reload or history\n      // navigation (particularly Firefox 1.5+).\n      staleChannel.updateChannelNameAndCatalog(channelName);\n      staleChannel.xpcDeliver(service, payload);\n      return true;\n    }\n  }\n\n  // Failed to find a channel to deliver this message to, so simply ignore it.\n  goog.log.info(goog.net.xpc.logger, 'channel name mismatch; message ignored.');\n  return false;\n};\n\n\n/**\n * The transport type.\n * @type {number}\n * @override\n */\nDirectTransport.prototype.transportType = goog.net.xpc.TransportTypes.DIRECT;\n\n\n/**\n * Handles transport service messages.\n * @param {string} payload The message content.\n * @override\n */\nDirectTransport.prototype.transportServiceHandler = function(payload) {\n  var transportParts = DirectTransport.parseTransportPayload_(payload);\n  var transportMessageType = transportParts[0];\n  var peerEndpointId = transportParts[1];\n  switch (transportMessageType) {\n    case goog.net.xpc.SETUP_ACK_:\n      if (!this.setupAckReceived_.hasFired()) {\n        this.setupAckReceived_.callback(true);\n      }\n      break;\n    case goog.net.xpc.SETUP:\n      this.sendSetupAckMessage_();\n      if ((this.peerEndpointId_ != null) &&\n          (this.peerEndpointId_ != peerEndpointId)) {\n        // Send a new SETUP message since the peer has been replaced.\n        goog.log.info(\n            goog.net.xpc.logger,\n            'Sending SETUP and changing peer ID to: ' + peerEndpointId);\n        this.sendSetupMessage_();\n      }\n      this.peerEndpointId_ = peerEndpointId;\n      break;\n  }\n};\n\n\n/**\n * Sends a SETUP transport service message.\n * @private\n */\nDirectTransport.prototype.sendSetupMessage_ = function() {\n  // Although we could send real objects, since some other transports are\n  // limited to strings we also keep this requirement.\n  var payload = goog.net.xpc.SETUP;\n  payload += DirectTransport.MESSAGE_DELIMITER_;\n  payload += this.endpointId_;\n  this.send(goog.net.xpc.TRANSPORT_SERVICE_, payload);\n};\n\n\n/**\n * Sends a SETUP_ACK transport service message.\n * @private\n */\nDirectTransport.prototype.sendSetupAckMessage_ = function() {\n  this.send(goog.net.xpc.TRANSPORT_SERVICE_, goog.net.xpc.SETUP_ACK_);\n  if (!this.setupAckSent_.hasFired()) {\n    this.setupAckSent_.callback(true);\n  }\n};\n\n\n/** @override */\nDirectTransport.prototype.connect = function() {\n  var win = this.getWindow();\n  if (win) {\n    DirectTransport.initialize_(win);\n    this.initialized_ = true;\n    this.maybeAttemptToConnect_();\n  } else {\n    goog.log.fine(goog.net.xpc.logger, 'connect(): no window to initialize.');\n  }\n};\n\n\n/**\n * Connects to other peer. In the case of the outer peer, the setup messages are\n * likely sent before the inner peer is ready to receive them. Therefore, this\n * function will continue trying to send the SETUP message until the inner peer\n * responds. In the case of the inner peer, it will occasionally have its\n * channel name fall out of sync with the outer peer, particularly during\n * soft-reloads and history navigations.\n * @private\n */\nDirectTransport.prototype.maybeAttemptToConnect_ = function() {\n  if (this.channel_.isConnected()) {\n    this.maybeAttemptToConnectTimer_.stop();\n    return;\n  }\n  this.maybeAttemptToConnectTimer_.start();\n  this.sendSetupMessage_();\n};\n\n\n/**\n * Prepares to send a message.\n * @param {string} service The name of the service the message is to be\n *     delivered to.\n * @param {string} payload The message content.\n * @override\n */\nDirectTransport.prototype.send = function(service, payload) {\n  if (!this.channel_.getPeerWindowObject()) {\n    goog.log.fine(goog.net.xpc.logger, 'send(): window not ready');\n    return;\n  }\n  var channelName = DirectTransport.getRoledChannelName_(\n      this.originalChannelName_, this.getPeerRole_());\n\n  var message = new DirectTransport.Message_(channelName, service, payload);\n\n  if (this.channel_.getConfig()[CfgFields.DIRECT_TRANSPORT_SYNC_MODE]) {\n    this.executeScheduledSend_(message);\n  } else {\n    // Note: goog.async.nextTick doesn't support cancelling or disposal so\n    // leaving as 0ms timer, though this may have performance implications.\n    this.asyncSendsMap_[goog.getUid(message)] =\n        Timer.callOnce(goog.bind(this.executeScheduledSend_, this, message), 0);\n  }\n};\n\n\n/**\n * Sends the message.\n * @param {!DirectTransport.Message_} message The message to send.\n * @private\n */\nDirectTransport.prototype.executeScheduledSend_ = function(message) {\n  var messageId = goog.getUid(message);\n  if (this.asyncSendsMap_[messageId]) {\n    delete this.asyncSendsMap_[messageId];\n  }\n\n\n  try {\n    var peerProxy = goog.getObjectByName(\n        DirectTransport.GLOBAL_TRANPORT_PATH_,\n        this.channel_.getPeerWindowObject());\n  } catch (error) {\n    goog.log.warning(\n        goog.net.xpc.logger, 'Can\\'t access other window, ignoring.', error);\n    return;\n  }\n\n  if (peerProxy === null) {\n    goog.log.warning(\n        goog.net.xpc.logger, 'Peer window had no global function.');\n    return;\n  }\n\n\n  try {\n    peerProxy(message.toLiteral());\n    goog.log.info(\n        goog.net.xpc.logger, 'send(): channelName=' + message.channelName +\n            ' service=' + message.service + ' payload=' + message.payload);\n  } catch (error) {\n    goog.log.warning(\n        goog.net.xpc.logger, 'Error performing call, ignoring.', error);\n  }\n};\n\n\n/**\n * @return {goog.net.xpc.CrossPageChannelRole} The role of peer channel (either\n *     inner or outer).\n * @private\n */\nDirectTransport.prototype.getPeerRole_ = function() {\n  var role = this.channel_.getRole();\n  return role == goog.net.xpc.CrossPageChannelRole.OUTER ?\n      goog.net.xpc.CrossPageChannelRole.INNER :\n      goog.net.xpc.CrossPageChannelRole.OUTER;\n};\n\n\n/**\n * Notifies the channel that this transport is connected.\n * @private\n */\nDirectTransport.prototype.notifyConnected_ = function() {\n  // Add a delay as the connection callback will break if this transport is\n  // synchronous and the callback invokes send() immediately.\n  this.channel_.notifyConnected(\n      this.channel_.getConfig()[CfgFields.DIRECT_TRANSPORT_SYNC_MODE] ?\n          DirectTransport.CONNECTION_DELAY_INTERVAL_MS_ :\n          0);\n};\n\n\n/** @override */\nDirectTransport.prototype.disposeInternal = function() {\n  if (this.initialized_) {\n    var listenWindow = this.getWindow();\n    var uid = goog.getUid(listenWindow);\n    var value = --DirectTransport.activeCount_[uid];\n    if (value == 1) {\n      goog.exportSymbol(\n          DirectTransport.GLOBAL_TRANPORT_PATH_, null, listenWindow);\n    }\n  }\n\n  if (this.asyncSendsMap_) {\n    goog.object.forEach(\n        this.asyncSendsMap_, function(timerId) { Timer.clear(timerId); });\n    this.asyncSendsMap_ = null;\n  }\n\n  // Deferred's aren't disposables.\n  if (this.setupAckReceived_) {\n    this.setupAckReceived_.cancel();\n    delete this.setupAckReceived_;\n  }\n  if (this.setupAckSent_) {\n    this.setupAckSent_.cancel();\n    delete this.setupAckSent_;\n  }\n  if (this.connected_) {\n    this.connected_.cancel();\n    delete this.connected_;\n  }\n\n  DirectTransport.base(this, 'disposeInternal');\n};\n\n\n/**\n * Parses a transport service payload message.\n * @param {string} payload The payload.\n * @return {!Array<?string>} An array with the message type as the first member\n *     and the endpoint id as the second, if one was sent, or null otherwise.\n * @private\n */\nDirectTransport.parseTransportPayload_ = function(payload) {\n  var transportParts = /** @type {!Array<?string>} */ (\n      payload.split(DirectTransport.MESSAGE_DELIMITER_));\n  transportParts[1] = transportParts[1] || null;  // Usually endpointId.\n  return transportParts;\n};\n\n\n\n/**\n * Message container that gets passed back and forth between windows.\n * @param {string} channelName The channel name to tranport messages on.\n * @param {string} service The service to send the payload to.\n * @param {string} payload The payload to send.\n * @constructor\n * @struct\n * @private\n */\nDirectTransport.Message_ = function(channelName, service, payload) {\n  /**\n   * The name of the channel.\n   * @type {string}\n   */\n  this.channelName = channelName;\n\n  /**\n   * The service on the channel.\n   * @type {string}\n   */\n  this.service = service;\n\n  /**\n   * The payload.\n   * @type {string}\n   */\n  this.payload = payload;\n};\n\n\n/**\n * Converts a message to a literal object.\n * @return {!Object} The message as a literal object.\n */\nDirectTransport.Message_.prototype.toLiteral = function() {\n  return {\n    'channelName': this.channelName,\n    'service': this.service,\n    'payload': this.payload\n  };\n};\n\n\n/**\n * Creates a Message_ from a literal object.\n * @param {!Object} literal The literal to convert to Message.\n * @return {!DirectTransport.Message_} The Message.\n */\nDirectTransport.Message_.fromLiteral = function(literal) {\n  return new DirectTransport.Message_(\n      literal['channelName'], literal['service'], literal['payload']);\n};\n\n});  // goog.scope\n","^?",1579837703000,"^@",["^A",["~$goog.net.xpc.CfgFields","~$goog.net.xpc","~$goog.net.xpc.CrossPageChannelRole","^2R","^3U","~$goog.net.xpc.TransportTypes","^3","^21","^3B","~$goog.net.xpc.Transport","^3P"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/xpc/directtransport.js"],"^S",["^A",["~$goog.net.xpc.DirectTransport"]],"^1",true,"^2",["^3","^3U","^3P","^2R","^3B","^UI","^UH","^UJ","^UL","^UK","^21"]],["^ ","^7",[1579837703000],"^8","goog.graphics.ext.graphics.js","^9",["^:","goog/graphics/ext/graphics.js"],"^;","goog/graphics/ext/graphics.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Graphics surface type.\n * @author robbyw@google.com (Robby Walker)\n */\n\n\n\n// TODO(b/130421259): We're trying to migrate all ES5 subclasses of Closure\n// Library to ES6. In ES6 this cannot be referenced before super is called. This\n// file has at least one this before a super call (in ES5) and cannot be\n// automatically upgraded to ES6 as a result. Please fix this if you have a\n// chance. Note: This can sometimes be caused by not calling the super\n// constructor at all. You can run the conversion tool yourself to see what it\n// does on this file: blaze run //javascript/refactoring/es6_classes:convert.\n\ngoog.provide('goog.graphics.ext.Graphics');\n\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.graphics');\ngoog.require('goog.graphics.ext.Group');\n\n\n\n/**\n * Wrapper for a graphics surface.\n * @param {string|number} width The width in pixels.  Strings\n *     expressing percentages of parent with (e.g. '80%') are also accepted.\n * @param {string|number} height The height in pixels.  Strings\n *     expressing percentages of parent with (e.g. '80%') are also accepted.\n * @param {?number=} opt_coordWidth The coordinate width - if\n *     omitted or null, defaults to same as width.\n * @param {?number=} opt_coordHeight The coordinate height. - if\n *     omitted or null, defaults to same as height.\n * @param {goog.dom.DomHelper=} opt_domHelper The DOM helper object for the\n *     document we want to render in.\n * @param {boolean=} opt_isSimple Flag used to indicate the graphics object will\n *     be drawn to in a single pass, and the fastest implementation for this\n *     scenario should be favored.  NOTE: Setting to true may result in\n *     degradation of text support.\n * @constructor\n * @extends {goog.graphics.ext.Group}\n * @final\n */\ngoog.graphics.ext.Graphics = function(\n    width, height, opt_coordWidth, opt_coordHeight, opt_domHelper,\n    opt_isSimple) {\n  var surface = opt_isSimple ?\n      goog.graphics.createSimpleGraphics(\n          width, height, opt_coordWidth, opt_coordHeight, opt_domHelper) :\n      goog.graphics.createGraphics(\n          width, height, opt_coordWidth, opt_coordHeight, opt_domHelper);\n  this.implementation_ = surface;\n\n  goog.graphics.ext.Group.call(this, null, surface.getCanvasElement());\n\n  goog.events.listen(\n      surface, goog.events.EventType.RESIZE, this.updateChildren, false, this);\n};\ngoog.inherits(goog.graphics.ext.Graphics, goog.graphics.ext.Group);\n\n\n/**\n * The root level graphics implementation.\n * @type {goog.graphics.AbstractGraphics}\n * @private\n */\ngoog.graphics.ext.Graphics.prototype.implementation_;\n\n\n/**\n * @return {goog.graphics.AbstractGraphics} The graphics implementation layer.\n */\ngoog.graphics.ext.Graphics.prototype.getImplementation = function() {\n  return this.implementation_;\n};\n\n\n/**\n * Changes the coordinate size.\n * @param {number} coordWidth The coordinate width.\n * @param {number} coordHeight The coordinate height.\n */\ngoog.graphics.ext.Graphics.prototype.setCoordSize = function(\n    coordWidth, coordHeight) {\n  this.implementation_.setCoordSize(coordWidth, coordHeight);\n  goog.graphics.ext.Graphics.superClass_.setSize.call(\n      this, coordWidth, coordHeight);\n};\n\n\n/**\n * @return {goog.math.Size} The coordinate size.\n */\ngoog.graphics.ext.Graphics.prototype.getCoordSize = function() {\n  return this.implementation_.getCoordSize();\n};\n\n\n/**\n * Changes the coordinate system position.\n * @param {number} left The coordinate system left bound.\n * @param {number} top The coordinate system top bound.\n */\ngoog.graphics.ext.Graphics.prototype.setCoordOrigin = function(left, top) {\n  this.implementation_.setCoordOrigin(left, top);\n};\n\n\n/**\n * @return {!goog.math.Coordinate} The coordinate system position.\n */\ngoog.graphics.ext.Graphics.prototype.getCoordOrigin = function() {\n  return this.implementation_.getCoordOrigin();\n};\n\n\n/**\n * Change the size of the canvas.\n * @param {number} pixelWidth The width in pixels.\n * @param {number} pixelHeight The height in pixels.\n */\ngoog.graphics.ext.Graphics.prototype.setPixelSize = function(\n    pixelWidth, pixelHeight) {\n  this.implementation_.setSize(pixelWidth, pixelHeight);\n\n  var coordSize = this.getCoordSize();\n  goog.graphics.ext.Graphics.superClass_.setSize.call(\n      this, coordSize.width, coordSize.height);\n};\n\n\n/**\n * @return {goog.math.Size?} Returns the number of pixels spanned by the\n *     surface, or null if the size could not be computed due to the size being\n *     specified in percentage points and the component not being in the\n *     document.\n */\ngoog.graphics.ext.Graphics.prototype.getPixelSize = function() {\n  return this.implementation_.getPixelSize();\n};\n\n\n/**\n * @return {number} The coordinate width of the canvas.\n * @override\n */\ngoog.graphics.ext.Graphics.prototype.getWidth = function() {\n  return this.implementation_.getCoordSize().width;\n};\n\n\n/**\n * @return {number} The coordinate width of the canvas.\n * @override\n */\ngoog.graphics.ext.Graphics.prototype.getHeight = function() {\n  return this.implementation_.getCoordSize().height;\n};\n\n\n/**\n * @return {number} Returns the number of pixels per unit in the x direction.\n * @override\n */\ngoog.graphics.ext.Graphics.prototype.getPixelScaleX = function() {\n  return this.implementation_.getPixelScaleX();\n};\n\n\n/**\n * @return {number} Returns the number of pixels per unit in the y direction.\n * @override\n */\ngoog.graphics.ext.Graphics.prototype.getPixelScaleY = function() {\n  return this.implementation_.getPixelScaleY();\n};\n\n\n/**\n * @return {Element} The root element of the graphics surface.\n */\ngoog.graphics.ext.Graphics.prototype.getElement = function() {\n  return this.implementation_.getElement();\n};\n\n\n/**\n * Renders the underlying graphics.\n *\n * @param {Element} parentElement Parent element to render the component into.\n */\ngoog.graphics.ext.Graphics.prototype.render = function(parentElement) {\n  this.implementation_.render(parentElement);\n};\n\n\n/**\n * Never transform a surface.\n * @override\n */\ngoog.graphics.ext.Graphics.prototype.transform = goog.nullFunction;\n\n\n/**\n * Called from the parent class, this method resets any pre-computed positions\n * and sizes.\n * @protected\n * @override\n */\ngoog.graphics.ext.Graphics.prototype.redraw = function() {\n  this.transformChildren();\n};\n","^?",1579837703000,"^@",["^A",["^3","^1C","^3T","~$goog.graphics","^1N"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/ext/graphics.js"],"^S",["^A",["~$goog.graphics.ext.Graphics"]],"^1",true,"^2",["^3","^1N","^1C","^UN","^3T"]],["^ ","^7",[1579837703000],"^8","goog.style.stylescrollbartester.js","^9",["^:","goog/style/stylescrollbartester.js"],"^;","goog/style/stylescrollbartester.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Shared unit tests for scrollbar measurement.\n *\n * @author flan@google.com (Ian Flanigan)\n */\n\ngoog.provide('goog.styleScrollbarTester');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.style');\ngoog.require('goog.testing.asserts');\ngoog.setTestOnly('goog.styleScrollbarTester');\n\n\n/**\n * Tests the scrollbar width calculation. Assumes that there is an element with\n * id 'test-scrollbarwidth' in the page.\n */\nfunction testScrollbarWidth() {\n  var width = goog.style.getScrollbarWidth();\n  assertTrue(width > 0);\n\n  var outer = goog.dom.getElement('test-scrollbarwidth');\n  var inner = goog.dom.getElementsByTagNameAndClass(\n      goog.dom.TagName.DIV, null, outer)[0];\n  assertTrue('should have a scroll bar', hasVerticalScroll(outer));\n  assertTrue('should have a scroll bar', hasHorizontalScroll(outer));\n\n  // Get the inner div absolute width\n  goog.style.setStyle(outer, 'width', '100%');\n  assertTrue('should have a scroll bar', hasVerticalScroll(outer));\n  assertFalse('should not have a scroll bar', hasHorizontalScroll(outer));\n  var innerAbsoluteWidth = inner.offsetWidth;\n\n  // Leave the vertical scroll and remove the horizontal by using the scroll\n  // bar width calculation.\n  goog.style.setStyle(outer, 'width', (innerAbsoluteWidth + width) + 'px');\n  assertTrue('should have a scroll bar', hasVerticalScroll(outer));\n  assertFalse('should not have a scroll bar', hasHorizontalScroll(outer));\n\n  // verify by adding 1 more pixel (brings back the vertical scroll bar).\n  goog.style.setStyle(outer, 'width', (innerAbsoluteWidth + width - 1) + 'px');\n  assertTrue('should have a scroll bar', hasVerticalScroll(outer));\n  assertTrue('should have a scroll bar', hasHorizontalScroll(outer));\n}\n\n\nfunction hasVerticalScroll(el) {\n  return el.clientWidth != 0 && el.offsetWidth - el.clientWidth > 0;\n}\n\n\nfunction hasHorizontalScroll(el) {\n  return el.clientHeight != 0 && el.offsetHeight - el.clientHeight > 0;\n}\n","^?",1579837703000,"^@",["^A",["^14","^4=","^3","^2Y","^4"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/style/stylescrollbartester.js"],"^S",["^A",["~$goog.styleScrollbarTester"]],"^1",true,"^2",["^3","^14","^4","^2Y","^4="]],["^ ","^7",[1579837703000],"^8","goog.ui.paletterenderer.js","^9",["^:","goog/ui/paletterenderer.js"],"^;","goog/ui/paletterenderer.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for {@link goog.ui.Palette}s.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.PaletteRenderer');\n\ngoog.forwardDeclare('goog.ui.Palette');\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeIterator');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.dom.dataset');\ngoog.require('goog.iter');\ngoog.require('goog.style');\ngoog.require('goog.ui.ControlRenderer');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Default renderer for {@link goog.ui.Palette}s.  Renders the palette as an\n * HTML table wrapped in a DIV, with one palette item per cell:\n *\n *    <div class=\"goog-palette\">\n *      <table class=\"goog-palette-table\">\n *        <tbody class=\"goog-palette-body\">\n *          <tr class=\"goog-palette-row\">\n *            <td class=\"goog-palette-cell\">...Item 0...</td>\n *            <td class=\"goog-palette-cell\">...Item 1...</td>\n *            ...\n *          </tr>\n *          <tr class=\"goog-palette-row\">\n *            ...\n *          </tr>\n *        </tbody>\n *      </table>\n *    </div>\n *\n * @constructor\n * @extends {goog.ui.ControlRenderer}\n */\ngoog.ui.PaletteRenderer = function() {\n  goog.ui.ControlRenderer.call(this);\n};\ngoog.inherits(goog.ui.PaletteRenderer, goog.ui.ControlRenderer);\ngoog.addSingletonGetter(goog.ui.PaletteRenderer);\n\n\n/**\n * Globally unique ID sequence for cells rendered by this renderer class.\n * @type {number}\n * @private\n */\ngoog.ui.PaletteRenderer.cellId_ = 0;\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.PaletteRenderer.CSS_CLASS = goog.getCssName('goog-palette');\n\n\n/**\n * Data attribute to store grid width from palette control.\n * @const {string}\n */\ngoog.ui.PaletteRenderer.GRID_WIDTH_ATTRIBUTE = 'gridWidth';\n\n\n/**\n * Returns the palette items arranged in a table wrapped in a DIV, with the\n * renderer's own CSS class and additional state-specific classes applied to\n * it.\n * @param {goog.ui.Control} palette goog.ui.Palette to render.\n * @return {!Element} Root element for the palette.\n * @override\n */\ngoog.ui.PaletteRenderer.prototype.createDom = function(palette) {\n  var classNames = this.getClassNames(palette);\n  var element = palette.getDomHelper().createDom(\n      goog.dom.TagName.DIV, classNames,\n      this.createGrid(\n          /** @type {Array<Node>} */ (palette.getContent()), palette.getSize(),\n          palette.getDomHelper()));\n  goog.a11y.aria.setRole(element, goog.a11y.aria.Role.GRID);\n  // It's safe to store grid width here since `goog.ui.Palette#setSize` cannot\n  // be called after createDom.\n  goog.dom.dataset.set(\n      element, goog.ui.PaletteRenderer.GRID_WIDTH_ATTRIBUTE,\n      palette.getSize().width);\n  return element;\n};\n\n\n/**\n * Returns the given items in a table with `size.width` columns and\n * `size.height` rows.  If the table is too big, empty cells will be\n * created as needed.  If the table is too small, the items that don't fit\n * will not be rendered.\n * @param {Array<Node>} items Palette items.\n * @param {goog.math.Size} size Palette size (columns x rows); both dimensions\n *     must be specified as numbers.\n * @param {goog.dom.DomHelper} dom DOM helper for document interaction.\n * @return {!Element} Palette table element.\n */\ngoog.ui.PaletteRenderer.prototype.createGrid = function(items, size, dom) {\n  var rows = [];\n  for (var row = 0, index = 0; row < size.height; row++) {\n    var cells = [];\n    for (var column = 0; column < size.width; column++) {\n      var item = items && items[index++];\n      cells.push(this.createCell(item, dom));\n    }\n    rows.push(this.createRow(cells, dom));\n  }\n\n  return this.createTable(rows, dom);\n};\n\n\n/**\n * Returns a table element (or equivalent) that wraps the given rows.\n * @param {Array<Element>} rows Array of row elements.\n * @param {goog.dom.DomHelper} dom DOM helper for document interaction.\n * @return {!Element} Palette table element.\n */\ngoog.ui.PaletteRenderer.prototype.createTable = function(rows, dom) {\n  var table = dom.createDom(\n      goog.dom.TagName.TABLE, goog.getCssName(this.getCssClass(), 'table'),\n      dom.createDom(\n          goog.dom.TagName.TBODY, goog.getCssName(this.getCssClass(), 'body'),\n          rows));\n  table.cellSpacing = '0';\n  table.cellPadding = '0';\n  return table;\n};\n\n\n/**\n * Returns a table row element (or equivalent) that wraps the given cells.\n * @param {Array<Element>} cells Array of cell elements.\n * @param {goog.dom.DomHelper} dom DOM helper for document interaction.\n * @return {!Element} Row element.\n */\ngoog.ui.PaletteRenderer.prototype.createRow = function(cells, dom) {\n  var row = dom.createDom(\n      goog.dom.TagName.TR, goog.getCssName(this.getCssClass(), 'row'), cells);\n  goog.a11y.aria.setRole(row, goog.a11y.aria.Role.ROW);\n  return row;\n};\n\n\n/**\n * Returns a table cell element (or equivalent) that wraps the given palette\n * item (which must be a DOM node).\n * @param {Node|string} node Palette item.\n * @param {goog.dom.DomHelper} dom DOM helper for document interaction.\n * @return {!Element} Cell element.\n */\ngoog.ui.PaletteRenderer.prototype.createCell = function(node, dom) {\n  var cell = dom.createDom(\n      goog.dom.TagName.TD, {\n        'class': goog.getCssName(this.getCssClass(), 'cell'),\n        // Cells must have an ID, for accessibility, so we generate one here.\n        'id': goog.getCssName(this.getCssClass(), 'cell-') +\n            goog.ui.PaletteRenderer.cellId_++\n      },\n      node);\n  goog.a11y.aria.setRole(cell, goog.a11y.aria.Role.GRIDCELL);\n  // Initialize to an unselected state.\n  goog.a11y.aria.setState(cell, goog.a11y.aria.State.SELECTED, false);\n  this.maybeUpdateAriaLabel_(cell);\n\n  return cell;\n};\n\n\n/**\n * Updates the aria label of the cell if it doesn't have one. Descends the DOM\n * and tries to find an aria label for a grid cell from the first child with a\n * label or title.\n * @param {!Element} cell The cell.\n * @private\n */\ngoog.ui.PaletteRenderer.prototype.maybeUpdateAriaLabel_ = function(cell) {\n  if (goog.dom.getTextContent(cell) || goog.a11y.aria.getLabel(cell)) {\n    return;\n  }\n  var iter = new goog.dom.NodeIterator(cell);\n  var label = '';\n  var node;\n  while (!label && (node = goog.iter.nextOrValue(iter, null))) {\n    if (node.nodeType == goog.dom.NodeType.ELEMENT) {\n      label =\n          goog.a11y.aria.getLabel(/** @type {!Element} */ (node)) || node.title;\n    }\n  }\n  if (label) {\n    goog.a11y.aria.setLabel(cell, label);\n  }\n\n  return;\n};\n\n\n/**\n * Overrides {@link goog.ui.ControlRenderer#canDecorate} to always return false.\n * @param {Element} element Ignored.\n * @return {boolean} False, since palettes don't support the decorate flow (for\n *     now).\n * @override\n */\ngoog.ui.PaletteRenderer.prototype.canDecorate = function(element) {\n  return false;\n};\n\n\n/**\n * Overrides {@link goog.ui.ControlRenderer#decorate} to be a no-op, since\n * palettes don't support the decorate flow (for now).\n * @param {goog.ui.Control} palette Ignored.\n * @param {Element} element Ignored.\n * @return {null} Always null.\n * @override\n */\ngoog.ui.PaletteRenderer.prototype.decorate = function(palette, element) {\n  return null;\n};\n\n\n/**\n * Overrides {@link goog.ui.ControlRenderer#setContent} for palettes.  Locates\n * the HTML table representing the palette grid, and replaces the contents of\n * each cell with a new element from the array of nodes passed as the second\n * argument.  If the new content has too many items the table will have more\n * rows added to fit, if there are less items than the table has cells, then the\n * left over cells will be empty.\n * @param {Element} element Root element of the palette control.\n * @param {goog.ui.ControlContent} content Array of items to replace existing\n *     palette items.\n * @override\n */\ngoog.ui.PaletteRenderer.prototype.setContent = function(element, content) {\n  var items = /** @type {Array<Node>} */ (content);\n  if (element) {\n    var tbody = goog.dom.getElementsByTagNameAndClass(\n        goog.dom.TagName.TBODY, goog.getCssName(this.getCssClass(), 'body'),\n        element)[0];\n    if (tbody) {\n      var index = 0;\n      goog.array.forEach(tbody.rows, function(row) {\n        goog.array.forEach(row.cells, function(cell) {\n          goog.dom.removeChildren(cell);\n          goog.a11y.aria.removeState(cell, goog.a11y.aria.State.LABEL);\n          if (items) {\n            var item = items[index++];\n            if (item) {\n              goog.dom.appendChild(cell, item);\n              this.maybeUpdateAriaLabel_(cell);\n            }\n          }\n        }, this);\n      }, this);\n\n      // Make space for any additional items.\n      if (index < items.length) {\n        var cells = [];\n        var dom = goog.dom.getDomHelper(element);\n        var width = goog.dom.dataset.get(\n            element, goog.ui.PaletteRenderer.GRID_WIDTH_ATTRIBUTE);\n        while (index < items.length) {\n          var item = items[index++];\n          cells.push(this.createCell(item, dom));\n          if (cells.length == width) {\n            var row = this.createRow(cells, dom);\n            goog.dom.appendChild(tbody, row);\n            cells.length = 0;\n          }\n        }\n        if (cells.length > 0) {\n          while (cells.length < width) {\n            cells.push(this.createCell('', dom));\n          }\n          var row = this.createRow(cells, dom);\n          goog.dom.appendChild(tbody, row);\n        }\n      }\n    }\n    // Make sure the new contents are still unselectable.\n    goog.style.setUnselectable(element, true, goog.userAgent.GECKO);\n  }\n};\n\n\n/**\n * Returns the item corresponding to the given node, or null if the node is\n * neither a palette cell nor part of a palette item.\n * @param {goog.ui.Palette} palette Palette in which to look for the item.\n * @param {Node} node Node to look for.\n * @return {Node} The corresponding palette item (null if not found).\n */\ngoog.ui.PaletteRenderer.prototype.getContainingItem = function(palette, node) {\n  var root = palette.getElement();\n  while (node && node.nodeType == goog.dom.NodeType.ELEMENT && node != root) {\n    if (node.tagName == goog.dom.TagName.TD &&\n        goog.dom.classlist.contains(\n            /** @type {!Element} */ (node),\n            goog.getCssName(this.getCssClass(), 'cell'))) {\n      return node.firstChild;\n    }\n    node = node.parentNode;\n  }\n\n  return null;\n};\n\n\n/**\n * Updates the highlight styling of the palette cell containing the given node\n * based on the value of the Boolean argument.\n * @param {goog.ui.Palette} palette Palette containing the item.\n * @param {Node} node Item whose cell is to be highlighted or un-highlighted.\n * @param {boolean} highlight If true, the cell is highlighted; otherwise it is\n *     un-highlighted.\n */\ngoog.ui.PaletteRenderer.prototype.highlightCell = function(\n    palette, node, highlight) {\n  if (node) {\n    var cell = this.getCellForItem(node);\n    goog.asserts.assert(cell);\n    goog.dom.classlist.enable(\n        cell, goog.getCssName(this.getCssClass(), 'cell-hover'), highlight);\n    // See https://www.w3.org/TR/wai-aria/#aria-activedescendant\n    // for an explanation of the activedescendant.\n    if (highlight) {\n      goog.a11y.aria.setState(\n          palette.getElementStrict(), goog.a11y.aria.State.ACTIVEDESCENDANT,\n          cell.id);\n    } else if (\n        cell.id ==\n        goog.a11y.aria.getState(\n            palette.getElementStrict(),\n            goog.a11y.aria.State.ACTIVEDESCENDANT)) {\n      goog.a11y.aria.removeState(\n          palette.getElementStrict(), goog.a11y.aria.State.ACTIVEDESCENDANT);\n    }\n  }\n};\n\n\n/**\n * @param {Node} node Item whose cell is to be returned.\n * @return {Element} The grid cell for the palette item.\n */\ngoog.ui.PaletteRenderer.prototype.getCellForItem = function(node) {\n  return /** @type {Element} */ (node ? node.parentNode : null);\n};\n\n\n/**\n * Updates the selection styling of the palette cell containing the given node\n * based on the value of the Boolean argument.\n * @param {goog.ui.Palette} palette Palette containing the item.\n * @param {Node} node Item whose cell is to be selected or deselected.\n * @param {boolean} select If true, the cell is selected; otherwise it is\n *     deselected.\n */\ngoog.ui.PaletteRenderer.prototype.selectCell = function(palette, node, select) {\n  if (node) {\n    var cell = /** @type {!Element} */ (node.parentNode);\n    goog.dom.classlist.enable(\n        cell, goog.getCssName(this.getCssClass(), 'cell-selected'), select);\n    goog.a11y.aria.setState(cell, goog.a11y.aria.State.SELECTED, select);\n  }\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of components\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.PaletteRenderer.prototype.getCssClass = function() {\n  return goog.ui.PaletteRenderer.CSS_CLASS;\n};\n","^?",1579837703000,"^@",["^A",["^1J","^1W","^14","^T?","^1[","^3W","~$goog.dom.NodeIterator","^33","~$goog.dom.dataset","^3","^18","~$goog.ui.ControlRenderer","^41","^2Y","^1S","^4"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/paletterenderer.js"],"^S",["^A",["~$goog.ui.PaletteRenderer"]],"^1",true,"^2",["^3","^3W","^33","^41","^1S","^1J","^14","^UQ","^1[","^4","^T?","^UR","^1W","^2Y","^US","^18"]],["^ ","^7",[1579837703000],"^8","goog.date.date.js","^9",["^:","goog/date/date.js"],"^;","goog/date/date.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions and objects for date representation and manipulation.\n * @suppress {checkPrototypalTypes}\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.date');\ngoog.provide('goog.date.Date');\ngoog.provide('goog.date.DateTime');\ngoog.provide('goog.date.Interval');\ngoog.provide('goog.date.month');\ngoog.provide('goog.date.weekDay');\n\ngoog.require('goog.asserts');\n/** @suppress {extraRequire} */\ngoog.require('goog.date.DateLike');\ngoog.require('goog.i18n.DateTimeSymbols');\ngoog.require('goog.string');\n\n\n/**\n * Constants for weekdays.\n * @enum {number}\n */\ngoog.date.weekDay = {\n  MON: 0,\n  TUE: 1,\n  WED: 2,\n  THU: 3,\n  FRI: 4,\n  SAT: 5,\n  SUN: 6\n};\n\n\n/**\n * Constants for months.\n * @enum {number}\n */\ngoog.date.month = {\n  JAN: 0,\n  FEB: 1,\n  MAR: 2,\n  APR: 3,\n  MAY: 4,\n  JUN: 5,\n  JUL: 6,\n  AUG: 7,\n  SEP: 8,\n  OCT: 9,\n  NOV: 10,\n  DEC: 11\n};\n\n\n/**\n * Formats a month/year string.\n * Example: \"January 2008\"\n *\n * @param {string} monthName The month name to use in the result.\n * @param {number} yearNum The numeric year to use in the result.\n * @return {string} A formatted month/year string.\n * @deprecated Use goog.i18n.DateTimeFormat with\n *     goog.i18n.DateTimeFormat.Format.YEAR_MONTH_ABBR or\n *     goog.i18n.DateTimeFormat.Format.YEAR_MONTH_FULL.\n */\ngoog.date.formatMonthAndYear = function(monthName, yearNum) {\n  /** @desc Month/year format given the month name and the numeric year. */\n  var MSG_MONTH_AND_YEAR = goog.getMsg(\n      '{$monthName} {$yearNum}',\n      {'monthName': monthName, 'yearNum': String(yearNum)});\n  return MSG_MONTH_AND_YEAR;\n};\n\n\n/**\n * Regular expression for splitting date parts from ISO 8601 styled string.\n * Examples: '20060210' or '2005-02-22' or '20050222' or '2005-08'\n * or '2005-W22' or '2005W22' or '2005-W22-4', etc.\n * For explanation and more examples, see:\n * {@link http://en.wikipedia.org/wiki/ISO_8601}\n *\n * @type {RegExp}\n * @private\n */\ngoog.date.splitDateStringRegex_ = new RegExp(\n    '^(\\\\d{4})(?:(?:-?(\\\\d{2})(?:-?(\\\\d{2}))?)|' +\n    '(?:-?(\\\\d{3}))|(?:-?W(\\\\d{2})(?:-?([1-7]))?))?$');\n\n\n/**\n * Regular expression for splitting time parts from ISO 8601 styled string.\n * Examples: '18:46:39.994' or '184639.994'\n *\n * @type {RegExp}\n * @private\n */\ngoog.date.splitTimeStringRegex_ =\n    /^(\\d{2})(?::?(\\d{2})(?::?(\\d{2})(\\.\\d+)?)?)?$/;\n\n\n/**\n * Regular expression for splitting timezone parts from ISO 8601 styled string.\n * Example: The part after the '+' in '18:46:39+07:00'.  Or '09:30Z' (UTC).\n *\n * @type {RegExp}\n * @private\n */\ngoog.date.splitTimezoneStringRegex_ = /Z|(?:([-+])(\\d{2})(?::?(\\d{2}))?)$/;\n\n\n/**\n * Regular expression for splitting duration parts from ISO 8601 styled string.\n * Example: '-P1Y2M3DT4H5M6.7S'\n *\n * @type {RegExp}\n * @private\n */\ngoog.date.splitDurationRegex_ = new RegExp(\n    '^(-)?P(?:(\\\\d+)Y)?(?:(\\\\d+)M)?(?:(\\\\d+)D)?' +\n    '(T(?:(\\\\d+)H)?(?:(\\\\d+)M)?(?:(\\\\d+(?:\\\\.\\\\d+)?)S)?)?$');\n\n\n/**\n * Number of milliseconds in a day.\n * @type {number}\n */\ngoog.date.MS_PER_DAY = 24 * 60 * 60 * 1000;\n\n\n/**\n * Returns whether the given year is a leap year.\n *\n * @param {number} year Year part of date.\n * @return {boolean} Whether the given year is a leap year.\n */\ngoog.date.isLeapYear = function(year) {\n  // Leap year logic; the 4-100-400 rule\n  return year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);\n};\n\n\n/**\n * Returns whether the given year is a long ISO year.\n * See {@link http://www.phys.uu.nl/~vgent/calendar/isocalendar_text3.htm}.\n *\n * @param {number} year Full year part of date.\n * @return {boolean} Whether the given year is a long ISO year.\n */\ngoog.date.isLongIsoYear = function(year) {\n  var n = 5 * year + 12 - 4 * (Math.floor(year / 100) - Math.floor(year / 400));\n  n += Math.floor((year - 100) / 400) - Math.floor((year - 102) / 400);\n  n += Math.floor((year - 200) / 400) - Math.floor((year - 199) / 400);\n\n  return n % 28 < 5;\n};\n\n\n/**\n * Returns the number of days for a given month.\n *\n * @param {number} year Year part of date.\n * @param {number} month Month part of date.\n * @return {number} The number of days for the given month.\n */\ngoog.date.getNumberOfDaysInMonth = function(year, month) {\n  switch (month) {\n    case goog.date.month.FEB:\n      return goog.date.isLeapYear(year) ? 29 : 28;\n    case goog.date.month.JUN:\n    case goog.date.month.SEP:\n    case goog.date.month.NOV:\n    case goog.date.month.APR:\n      return 30;\n  }\n  return 31;\n};\n\n\n/**\n * Returns true if the 2 dates are in the same day.\n * @param {goog.date.DateLike} date The time to check.\n * @param {goog.date.DateLike=} opt_now The current time.\n * @return {boolean} Whether the dates are on the same day.\n */\ngoog.date.isSameDay = function(date, opt_now) {\n  var now = opt_now || new Date(goog.now());\n  return date.getDate() == now.getDate() && goog.date.isSameMonth(date, now);\n};\n\n\n/**\n * Returns true if the 2 dates are in the same month.\n * @param {goog.date.DateLike} date The time to check.\n * @param {goog.date.DateLike=} opt_now The current time.\n * @return {boolean} Whether the dates are in the same calendar month.\n */\ngoog.date.isSameMonth = function(date, opt_now) {\n  var now = opt_now || new Date(goog.now());\n  return date.getMonth() == now.getMonth() && goog.date.isSameYear(date, now);\n};\n\n\n/**\n * Returns true if the 2 dates are in the same year.\n * @param {goog.date.DateLike} date The time to check.\n * @param {goog.date.DateLike=} opt_now The current time.\n * @return {boolean} Whether the dates are in the same calendar year.\n */\ngoog.date.isSameYear = function(date, opt_now) {\n  var now = opt_now || new Date(goog.now());\n  return date.getFullYear() == now.getFullYear();\n};\n\n\n/**\n * Static function for the day of the same week that determines the week number\n * and year of week.\n *\n * @param {number} year Year part of date.\n * @param {number} month Month part of date (0-11).\n * @param {number} date Day part of date (1-31).\n * @param {number=} opt_weekDay Cut off weekday, defaults to Thursday.\n * @param {number=} opt_firstDayOfWeek First day of the week, defaults to\n *     Monday.\n *     Monday=0, Sunday=6.\n * @return {number} the cutoff day of the same week in millis since epoch.\n * @private\n */\ngoog.date.getCutOffSameWeek_ = function(\n    year, month, date, opt_weekDay, opt_firstDayOfWeek) {\n  var d = new Date(year, month, date);\n\n  // Default to Thursday for cut off as per ISO 8601.\n  var cutoff =\n      (opt_weekDay !== undefined) ? opt_weekDay : goog.date.weekDay.THU;\n\n  // Default to Monday for first day of the week as per ISO 8601.\n  var firstday = opt_firstDayOfWeek || goog.date.weekDay.MON;\n\n  // The d.getDay() has to be converted first to ISO weekday (Monday=0).\n  var isoday = (d.getDay() + 6) % 7;\n\n  // Position of given day in the picker grid w.r.t. first day of week\n  var daypos = (isoday - firstday + 7) % 7;\n\n  // Position of cut off day in the picker grid w.r.t. first day of week\n  var cutoffpos = (cutoff - firstday + 7) % 7;\n\n  // Unix timestamp of the midnight of the cutoff day in the week of 'd'.\n  // There might be +-1 hour shift in the result due to the daylight saving,\n  // but it doesn't affect the year.\n  return d.valueOf() + (cutoffpos - daypos) * goog.date.MS_PER_DAY;\n};\n\n\n/**\n * Static function for week number calculation. ISO 8601 implementation.\n *\n * @param {number} year Year part of date.\n * @param {number} month Month part of date (0-11).\n * @param {number} date Day part of date (1-31).\n * @param {number=} opt_weekDay Cut off weekday, defaults to Thursday.\n * @param {number=} opt_firstDayOfWeek First day of the week, defaults to\n *     Monday.\n *     Monday=0, Sunday=6.\n * @return {number} The week number (1-53).\n */\ngoog.date.getWeekNumber = function(\n    year, month, date, opt_weekDay, opt_firstDayOfWeek) {\n  var cutoffSameWeek = goog.date.getCutOffSameWeek_(\n      year, month, date, opt_weekDay, opt_firstDayOfWeek);\n\n  // Unix timestamp of January 1 in the year of the week.\n  var jan1 = new Date(new Date(cutoffSameWeek).getFullYear(), 0, 1).valueOf();\n\n  // Number of week. The round() eliminates the effect of daylight saving.\n  return Math.floor(\n             Math.round((cutoffSameWeek - jan1) / goog.date.MS_PER_DAY) / 7) +\n      1;\n};\n\n\n/**\n * Static function for year of the week. ISO 8601 implementation.\n *\n * @param {number} year Year part of date.\n * @param {number} month Month part of date (0-11).\n * @param {number} date Day part of date (1-31).\n * @param {number=} opt_weekDay Cut off weekday, defaults to Thursday.\n * @param {number=} opt_firstDayOfWeek First day of the week, defaults to\n *     Monday.\n *     Monday=0, Sunday=6.\n * @return {number} The four digit year of date.\n */\ngoog.date.getYearOfWeek = function(\n    year, month, date, opt_weekDay, opt_firstDayOfWeek) {\n  var cutoffSameWeek = goog.date.getCutOffSameWeek_(\n      year, month, date, opt_weekDay, opt_firstDayOfWeek);\n\n  return new Date(cutoffSameWeek).getFullYear();\n};\n\n\n/**\n * @param {T} date1 A datelike object.\n * @param {S} date2 Another datelike object.\n * @return {T|S} The earlier of them in time.\n * @template T,S\n */\ngoog.date.min = function(date1, date2) {\n  return date1 < date2 ? date1 : date2;\n};\n\n\n/**\n * @param {T} date1 A datelike object.\n * @param {S} date2 Another datelike object.\n * @return {T|S} The later of them in time.\n * @template T,S\n */\ngoog.date.max = function(date1, date2) {\n  return date1 > date2 ? date1 : date2;\n};\n\n\n/**\n * Parses a datetime string expressed in ISO 8601 format. Overwrites the date\n * and optionally the time part of the given object with the parsed values.\n *\n * @param {!goog.date.DateTime} dateTime Object whose fields will be set.\n * @param {string} formatted A date or datetime expressed in ISO 8601 format.\n * @return {boolean} Whether the parsing succeeded.\n */\ngoog.date.setIso8601DateTime = function(dateTime, formatted) {\n  formatted = goog.string.trim(formatted);\n  var delim = formatted.indexOf('T') == -1 ? ' ' : 'T';\n  var parts = formatted.split(delim);\n  return goog.date.setIso8601DateOnly_(dateTime, parts[0]) &&\n      (parts.length < 2 || goog.date.setIso8601TimeOnly_(dateTime, parts[1]));\n};\n\n\n/**\n * Sets date fields based on an ISO 8601 format string.\n *\n * @param {!goog.date.Date} d Object whose fields will be set.\n * @param {string} formatted A date expressed in ISO 8601 format.\n * @return {boolean} Whether the parsing succeeded.\n * @private\n */\ngoog.date.setIso8601DateOnly_ = function(d, formatted) {\n  // split the formatted ISO date string into its date fields\n  var parts = formatted.match(goog.date.splitDateStringRegex_);\n  if (!parts) {\n    return false;\n  }\n\n  var year = Number(parts[1]);\n  var month = Number(parts[2]);\n  var date = Number(parts[3]);\n  var dayOfYear = Number(parts[4]);\n  var week = Number(parts[5]);\n  // ISO weekdays start with 1, native getDay() values start with 0\n  var dayOfWeek = Number(parts[6]) || 1;\n\n  d.setFullYear(year);\n\n  if (dayOfYear) {\n    d.setDate(1);\n    d.setMonth(0);\n    var offset = dayOfYear - 1;  // offset, so 1-indexed, i.e., skip day 1\n    d.add(new goog.date.Interval(goog.date.Interval.DAYS, offset));\n  } else if (week) {\n    goog.date.setDateFromIso8601Week_(d, week, dayOfWeek);\n  } else {\n    if (month) {\n      d.setDate(1);\n      d.setMonth(month - 1);\n    }\n    if (date) {\n      d.setDate(date);\n    }\n  }\n\n  return true;\n};\n\n\n/**\n * Sets date fields based on an ISO 8601 week string.\n * See {@link http://en.wikipedia.org/wiki/ISO_week_date}, \"Relation with the\n * Gregorian Calendar\".  The first week of a new ISO year is the week with the\n * majority of its days in the new Gregorian year.  I.e., ISO Week 1's Thursday\n * is in that year.  ISO weeks always start on Monday. So ISO Week 1 can\n * contain a few days from the previous Gregorian year.  And ISO weeks always\n * end on Sunday, so the last ISO week (Week 52 or 53) can have a few days from\n * the following Gregorian year.\n * Example: '1997-W01' lasts from 1996-12-30 to 1997-01-05.  January 1, 1997 is\n * a Wednesday. So W01's Monday is Dec.30, 1996, and Sunday is January 5, 1997.\n *\n * @param {!goog.date.Date} d Object whose fields will be set.\n * @param {number} week ISO week number.\n * @param {number} dayOfWeek ISO day of week.\n * @private\n */\ngoog.date.setDateFromIso8601Week_ = function(d, week, dayOfWeek) {\n  // calculate offset for first week\n  d.setMonth(0);\n  d.setDate(1);\n  var jsDay = d.getDay();\n  // switch Sunday (0) to index 7; ISO days are 1-indexed\n  var jan1WeekDay = jsDay || 7;\n\n  var THURSDAY = 4;\n  if (jan1WeekDay <= THURSDAY) {\n    // was extended back to Monday\n    var startDelta = 1 - jan1WeekDay;  // e.g., Thu(4) ==> -3\n  } else {\n    // was extended forward to Monday\n    startDelta = 8 - jan1WeekDay;  // e.g., Fri(5) ==> +3\n  }\n\n  // find the absolute number of days to offset from the start of year\n  // to arrive close to the Gregorian equivalent (pending adjustments above)\n  // Note: decrement week multiplier by one because 1st week is\n  // represented by dayOfWeek value\n  var absoluteDays = Number(dayOfWeek) + (7 * (Number(week) - 1));\n\n  // convert from ISO weekday format to Gregorian calendar date\n  // note: subtract 1 because 1-indexed; offset should not include 1st of month\n  var delta = startDelta + absoluteDays - 1;\n  var interval = new goog.date.Interval(goog.date.Interval.DAYS, delta);\n  d.add(interval);\n};\n\n\n/**\n * Sets time fields based on an ISO 8601 format string.\n * Note: only time fields, not date fields.\n *\n * @param {!goog.date.DateTime} d Object whose fields will be set.\n * @param {string} formatted A time expressed in ISO 8601 format.\n * @return {boolean} Whether the parsing succeeded.\n * @private\n */\ngoog.date.setIso8601TimeOnly_ = function(d, formatted) {\n  // first strip timezone info from the end\n  var timezoneParts = formatted.match(goog.date.splitTimezoneStringRegex_);\n\n  var offsetMinutes;  // Offset from UTC if not local time\n  var formattedTime;  // The time components of the input string; no timezone.\n\n  if (timezoneParts) {\n    // Trim off the timezone characters.\n    formattedTime =\n        formatted.substring(0, formatted.length - timezoneParts[0].length);\n\n    // 'Z' indicates a UTC timestring.\n    if (timezoneParts[0] === 'Z') {\n      offsetMinutes = 0;\n    } else {\n      offsetMinutes = Number(timezoneParts[2]) * 60 + Number(timezoneParts[3]);\n      offsetMinutes *= (timezoneParts[1] == '-') ? 1 : -1;\n    }\n  } else {\n    formattedTime = formatted;\n  }\n\n  var timeParts = formattedTime.match(goog.date.splitTimeStringRegex_);\n  if (!timeParts) {\n    return false;\n  }\n\n  // We have to branch on local vs non-local times because we can't always\n  // calculate the correct UTC offset for the specified time. Specifically, the\n  // offset for daylight-savings time depends on the date being set. Therefore,\n  // when an offset is specified, we apply it verbatim.\n  if (timezoneParts) {\n    goog.asserts.assertNumber(offsetMinutes);\n\n    // Convert the date part into UTC. This is important because the local date\n    // can differ from the UTC date, and the date part of an ISO 8601 string is\n    // always set in terms of the local date.\n    var year = d.getYear();\n    var month = d.getMonth();\n    var day = d.getDate();\n    var hour = Number(timeParts[1]);\n    var minute = Number(timeParts[2]) || 0;\n    var second = Number(timeParts[3]) || 0;\n    var millisecond = timeParts[4] ? Number(timeParts[4]) * 1000 : 0;\n    var utc = Date.UTC(year, month, day, hour, minute, second, millisecond);\n\n    d.setTime(utc + offsetMinutes * 60000);\n  } else {\n    d.setHours(Number(timeParts[1]));\n    d.setMinutes(Number(timeParts[2]) || 0);\n    d.setSeconds(Number(timeParts[3]) || 0);\n    d.setMilliseconds(timeParts[4] ? Number(timeParts[4]) * 1000 : 0);\n  }\n\n  return true;\n};\n\n\n\n/**\n * Class representing a date/time interval. Used for date calculations.\n * <pre>\n * new goog.date.Interval(0, 1) // One month\n * new goog.date.Interval(0, 0, 3, 1) // Three days and one hour\n * new goog.date.Interval(goog.date.Interval.DAYS, 1) // One day\n * </pre>\n *\n * @param {number|string=} opt_years Years or string representing date part.\n * @param {number=} opt_months Months or number of whatever date part specified\n *     by first parameter.\n * @param {number=} opt_days Days.\n * @param {number=} opt_hours Hours.\n * @param {number=} opt_minutes Minutes.\n * @param {number=} opt_seconds Seconds.\n * @constructor\n * @struct\n * @final\n */\ngoog.date.Interval = function(\n    opt_years, opt_months, opt_days, opt_hours, opt_minutes, opt_seconds) {\n  if (typeof opt_years === 'string') {\n    var type = opt_years;\n    var interval = /** @type {number} */ (opt_months);\n    /** @type {number} */\n    this.years = type == goog.date.Interval.YEARS ? interval : 0;\n    /** @type {number} */\n    this.months = type == goog.date.Interval.MONTHS ? interval : 0;\n    /** @type {number} */\n    this.days = type == goog.date.Interval.DAYS ? interval : 0;\n    /** @type {number} */\n    this.hours = type == goog.date.Interval.HOURS ? interval : 0;\n    /** @type {number} */\n    this.minutes = type == goog.date.Interval.MINUTES ? interval : 0;\n    /** @type {number} */\n    this.seconds = type == goog.date.Interval.SECONDS ? interval : 0;\n  } else {\n    this.years = /** @type {number} */ (opt_years) || 0;\n    this.months = opt_months || 0;\n    this.days = opt_days || 0;\n    this.hours = opt_hours || 0;\n    this.minutes = opt_minutes || 0;\n    this.seconds = opt_seconds || 0;\n  }\n};\n\n\n/**\n * Parses an XML Schema duration (ISO 8601 extended).\n * @see http://www.w3.org/TR/xmlschema-2/#duration\n *\n * @param  {string} duration An XML schema duration in textual format.\n *     Recurring durations and weeks are not supported.\n * @return {goog.date.Interval} The duration as a goog.date.Interval or null\n *     if the parse fails.\n */\ngoog.date.Interval.fromIsoString = function(duration) {\n  var parts = duration.match(goog.date.splitDurationRegex_);\n  if (!parts) {\n    return null;\n  }\n\n  var timeEmpty = !(parts[6] || parts[7] || parts[8]);\n  var dateTimeEmpty = timeEmpty && !(parts[2] || parts[3] || parts[4]);\n  if (dateTimeEmpty || timeEmpty && parts[5]) {\n    return null;\n  }\n\n  var negative = parts[1];\n  var years = parseInt(parts[2], 10) || 0;\n  var months = parseInt(parts[3], 10) || 0;\n  var days = parseInt(parts[4], 10) || 0;\n  var hours = parseInt(parts[6], 10) || 0;\n  var minutes = parseInt(parts[7], 10) || 0;\n  var seconds = parseFloat(parts[8]) || 0;\n  return negative ?\n      new goog.date.Interval(\n          -years, -months, -days, -hours, -minutes, -seconds) :\n      new goog.date.Interval(years, months, days, hours, minutes, seconds);\n};\n\n\n/**\n * Serializes goog.date.Interval into XML Schema duration (ISO 8601 extended).\n * @see http://www.w3.org/TR/xmlschema-2/#duration\n *\n * @param {boolean=} opt_verbose Include zero fields in the duration string.\n * @return {?string} An XML schema duration in ISO 8601 extended format,\n *     or null if the interval contains both positive and negative fields.\n */\ngoog.date.Interval.prototype.toIsoString = function(opt_verbose) {\n  var minField = Math.min(\n      this.years, this.months, this.days, this.hours, this.minutes,\n      this.seconds);\n  var maxField = Math.max(\n      this.years, this.months, this.days, this.hours, this.minutes,\n      this.seconds);\n  if (minField < 0 && maxField > 0) {\n    return null;\n  }\n\n  // Return 0 seconds if all fields are zero.\n  if (!opt_verbose && minField == 0 && maxField == 0) {\n    return 'PT0S';\n  }\n\n  var res = [];\n\n  // Add sign and 'P' prefix.\n  if (minField < 0) {\n    res.push('-');\n  }\n  res.push('P');\n\n  // Add date.\n  if (this.years || opt_verbose) {\n    res.push(Math.abs(this.years) + 'Y');\n  }\n  if (this.months || opt_verbose) {\n    res.push(Math.abs(this.months) + 'M');\n  }\n  if (this.days || opt_verbose) {\n    res.push(Math.abs(this.days) + 'D');\n  }\n\n  // Add time.\n  if (this.hours || this.minutes || this.seconds || opt_verbose) {\n    res.push('T');\n    if (this.hours || opt_verbose) {\n      res.push(Math.abs(this.hours) + 'H');\n    }\n    if (this.minutes || opt_verbose) {\n      res.push(Math.abs(this.minutes) + 'M');\n    }\n    if (this.seconds || opt_verbose) {\n      res.push(Math.abs(this.seconds) + 'S');\n    }\n  }\n\n  return res.join('');\n};\n\n\n/**\n * Tests whether the given interval is equal to this interval.\n * Note, this is a simple field-by-field comparison, it doesn't\n * account for comparisons like \"12 months == 1 year\".\n *\n * @param {goog.date.Interval} other The interval to test.\n * @return {boolean} Whether the intervals are equal.\n */\ngoog.date.Interval.prototype.equals = function(other) {\n  return other.years == this.years && other.months == this.months &&\n      other.days == this.days && other.hours == this.hours &&\n      other.minutes == this.minutes && other.seconds == this.seconds;\n};\n\n\n/**\n * @return {!goog.date.Interval} A clone of the interval object.\n */\ngoog.date.Interval.prototype.clone = function() {\n  return new goog.date.Interval(\n      this.years, this.months, this.days, this.hours, this.minutes,\n      this.seconds);\n};\n\n\n/**\n * Years constant for the date parts.\n * @type {string}\n */\ngoog.date.Interval.YEARS = 'y';\n\n\n/**\n * Months constant for the date parts.\n * @type {string}\n */\ngoog.date.Interval.MONTHS = 'm';\n\n\n/**\n * Days constant for the date parts.\n * @type {string}\n */\ngoog.date.Interval.DAYS = 'd';\n\n\n/**\n * Hours constant for the date parts.\n * @type {string}\n */\ngoog.date.Interval.HOURS = 'h';\n\n\n/**\n * Minutes constant for the date parts.\n * @type {string}\n */\ngoog.date.Interval.MINUTES = 'n';\n\n\n/**\n * Seconds constant for the date parts.\n * @type {string}\n */\ngoog.date.Interval.SECONDS = 's';\n\n\n/**\n * @return {boolean} Whether all fields of the interval are zero.\n */\ngoog.date.Interval.prototype.isZero = function() {\n  return this.years == 0 && this.months == 0 && this.days == 0 &&\n      this.hours == 0 && this.minutes == 0 && this.seconds == 0;\n};\n\n\n/**\n * @return {!goog.date.Interval} Negative of this interval.\n */\ngoog.date.Interval.prototype.getInverse = function() {\n  return this.times(-1);\n};\n\n\n/**\n * Calculates n * (this interval) by memberwise multiplication.\n * @param {number} n An integer.\n * @return {!goog.date.Interval} n * this.\n */\ngoog.date.Interval.prototype.times = function(n) {\n  return new goog.date.Interval(\n      this.years * n, this.months * n, this.days * n, this.hours * n,\n      this.minutes * n, this.seconds * n);\n};\n\n\n/**\n * Gets the total number of seconds in the time interval. Assumes that months\n * and years are empty.\n * @return {number} Total number of seconds in the interval.\n */\ngoog.date.Interval.prototype.getTotalSeconds = function() {\n  goog.asserts.assert(this.years == 0 && this.months == 0);\n  return ((this.days * 24 + this.hours) * 60 + this.minutes) * 60 +\n      this.seconds;\n};\n\n\n/**\n * Adds the Interval in the argument to this Interval field by field.\n *\n * @param {goog.date.Interval} interval The Interval to add.\n */\ngoog.date.Interval.prototype.add = function(interval) {\n  this.years += interval.years;\n  this.months += interval.months;\n  this.days += interval.days;\n  this.hours += interval.hours;\n  this.minutes += interval.minutes;\n  this.seconds += interval.seconds;\n};\n\n\n\n/**\n * Class representing a date. Defaults to current date if none is specified.\n *\n * Implements most methods of the native js Date object (except the time related\n * ones, {@see goog.date.DateTime}) and can be used interchangeably with it just\n * as if goog.date.Date was a synonym of Date. To make this more transparent,\n * Closure APIs should accept goog.date.DateLike instead of the real Date\n * object.\n *\n * @param {number|goog.date.DateLike=} opt_year Four digit year or a date-like\n *     object. If not set, the created object will contain the date\n *     determined by goog.now().\n * @param {number=} opt_month Month, 0 = Jan, 11 = Dec.\n * @param {number=} opt_date Date of month, 1 - 31.\n * @constructor\n * @struct\n * @see goog.date.DateTime\n */\ngoog.date.Date = function(opt_year, opt_month, opt_date) {\n  /** @protected {!Date} The wrapped date or datetime. */\n  this.date;\n  // goog.date.DateTime assumes that only this.date is added in this ctor.\n  if (typeof opt_year === 'number') {\n    this.date = this.buildDate_(opt_year, opt_month || 0, opt_date || 1);\n    this.maybeFixDst_(opt_date || 1);\n  } else if (goog.isObject(opt_year)) {\n    this.date = this.buildDate_(\n        opt_year.getFullYear(), opt_year.getMonth(), opt_year.getDate());\n    this.maybeFixDst_(opt_year.getDate());\n  } else {\n    this.date = new Date(goog.now());\n    var expectedDate = this.date.getDate();\n    this.date.setHours(0);\n    this.date.setMinutes(0);\n    this.date.setSeconds(0);\n    this.date.setMilliseconds(0);\n    // In some time zones there is no \"0\" hour on certain days during DST.\n    // Adjust here, if necessary. See:\n    // https://github.com/google/closure-library/issues/34.\n    this.maybeFixDst_(expectedDate);\n  }\n};\n\n\n/**\n * new Date(y, m, d) treats years in the interval [0, 100) as two digit years,\n * adding 1900 to them. This method ensures that calling the date constructor\n * as a copy constructor returns a value that is equal to the passed in\n * date value by explicitly setting the full year.\n * @private\n * @param {number} fullYear The full year (including century).\n * @param {number} month The month, from 0-11.\n * @param {number} date The day of the month.\n * @return {!Date} The constructed Date object.\n */\ngoog.date.Date.prototype.buildDate_ = function(fullYear, month, date) {\n  var d = new Date(fullYear, month, date);\n  if (fullYear >= 0 && fullYear < 100) {\n    // Can't just setFullYear as new Date() can flip over for e.g. month = 13.\n    d.setFullYear(d.getFullYear() - 1900);\n  }\n  return d;\n};\n\n\n/**\n * First day of week. 0 = Mon, 6 = Sun.\n * @type {number}\n * @private\n */\ngoog.date.Date.prototype.firstDayOfWeek_ =\n    goog.i18n.DateTimeSymbols.FIRSTDAYOFWEEK;\n\n\n/**\n * The cut off weekday used for week number calculations. 0 = Mon, 6 = Sun.\n * @type {number}\n * @private\n */\ngoog.date.Date.prototype.firstWeekCutOffDay_ =\n    goog.i18n.DateTimeSymbols.FIRSTWEEKCUTOFFDAY;\n\n\n/**\n * @return {!goog.date.Date} A clone of the date object.\n */\ngoog.date.Date.prototype.clone = function() {\n  var date = new goog.date.Date(this.date);\n  date.firstDayOfWeek_ = this.firstDayOfWeek_;\n  date.firstWeekCutOffDay_ = this.firstWeekCutOffDay_;\n\n  return date;\n};\n\n\n/**\n * @return {number} The four digit year of date.\n */\ngoog.date.Date.prototype.getFullYear = function() {\n  return this.date.getFullYear();\n};\n\n\n/**\n * Alias for getFullYear.\n *\n * @return {number} The four digit year of date.\n * @see #getFullYear\n */\ngoog.date.Date.prototype.getYear = function() {\n  return this.getFullYear();\n};\n\n\n/**\n * @return {goog.date.month} The month of date, 0 = Jan, 11 = Dec.\n */\ngoog.date.Date.prototype.getMonth = function() {\n  return /** @type {goog.date.month} */ (this.date.getMonth());\n};\n\n\n/**\n * @return {number} The date of month.\n */\ngoog.date.Date.prototype.getDate = function() {\n  return this.date.getDate();\n};\n\n\n/**\n * Returns the number of milliseconds since 1 January 1970 00:00:00.\n *\n * @return {number} The number of milliseconds since 1 January 1970 00:00:00.\n */\ngoog.date.Date.prototype.getTime = function() {\n  return this.date.getTime();\n};\n\n\n/**\n * @return {number} The day of week, US style. 0 = Sun, 6 = Sat.\n */\ngoog.date.Date.prototype.getDay = function() {\n  return this.date.getDay();\n};\n\n\n/**\n * @return {goog.date.weekDay} The day of week, ISO style. 0 = Mon, 6 = Sun.\n */\ngoog.date.Date.prototype.getIsoWeekday = function() {\n  return /** @type {goog.date.weekDay} */ ((this.getDay() + 6) % 7);\n};\n\n\n/**\n * @return {number} The day of week according to firstDayOfWeek setting.\n */\ngoog.date.Date.prototype.getWeekday = function() {\n  return (this.getIsoWeekday() - this.firstDayOfWeek_ + 7) % 7;\n};\n\n\n/**\n * @return {number} The four digit year of date according to universal time.\n */\ngoog.date.Date.prototype.getUTCFullYear = function() {\n  return this.date.getUTCFullYear();\n};\n\n\n/**\n * @return {goog.date.month} The month of date according to universal time,\n *     0 = Jan, 11 = Dec.\n */\ngoog.date.Date.prototype.getUTCMonth = function() {\n  return /** @type {goog.date.month} */ (this.date.getUTCMonth());\n};\n\n\n/**\n * @return {number} The date of month according to universal time.\n */\ngoog.date.Date.prototype.getUTCDate = function() {\n  return this.date.getUTCDate();\n};\n\n\n/**\n * @return {number} The day of week according to universal time, US style.\n *     0 = Sun, 1 = Mon, 6 = Sat.\n */\ngoog.date.Date.prototype.getUTCDay = function() {\n  return this.date.getDay();\n};\n\n\n/**\n * @return {number} The hours value according to universal time.\n */\ngoog.date.Date.prototype.getUTCHours = function() {\n  return this.date.getUTCHours();\n};\n\n\n/**\n * @return {number} The minutes value according to universal time.\n */\ngoog.date.Date.prototype.getUTCMinutes = function() {\n  return this.date.getUTCMinutes();\n};\n\n\n/**\n * @return {goog.date.weekDay} The day of week according to universal time, ISO\n *     style. 0 = Mon, 6 = Sun.\n */\ngoog.date.Date.prototype.getUTCIsoWeekday = function() {\n  return /** @type {goog.date.weekDay} */ ((this.date.getUTCDay() + 6) % 7);\n};\n\n\n/**\n * @return {number} The day of week according to universal time and\n *     firstDayOfWeek setting.\n */\ngoog.date.Date.prototype.getUTCWeekday = function() {\n  return (this.getUTCIsoWeekday() - this.firstDayOfWeek_ + 7) % 7;\n};\n\n\n/**\n * @return {number} The first day of the week. 0 = Mon, 6 = Sun.\n */\ngoog.date.Date.prototype.getFirstDayOfWeek = function() {\n  return this.firstDayOfWeek_;\n};\n\n\n/**\n * @return {number} The cut off weekday used for week number calculations.\n *     0 = Mon, 6 = Sun.\n */\ngoog.date.Date.prototype.getFirstWeekCutOffDay = function() {\n  return this.firstWeekCutOffDay_;\n};\n\n\n/**\n * @return {number} The number of days for the selected month.\n */\ngoog.date.Date.prototype.getNumberOfDaysInMonth = function() {\n  return goog.date.getNumberOfDaysInMonth(this.getFullYear(), this.getMonth());\n};\n\n\n/**\n * @return {number} The week number.\n */\ngoog.date.Date.prototype.getWeekNumber = function() {\n  return goog.date.getWeekNumber(\n      this.getFullYear(), this.getMonth(), this.getDate(),\n      this.firstWeekCutOffDay_, this.firstDayOfWeek_);\n};\n\n\n/**\n * Returns year in “Week of Year” based calendars in which the year transition\n * occurs on a week boundary.\n * @return {number} The four digit year in \"Week of Year\"\n */\ngoog.date.Date.prototype.getYearOfWeek = function() {\n  return goog.date.getYearOfWeek(\n      this.getFullYear(), this.getMonth(), this.getDate(),\n      this.firstWeekCutOffDay_, this.firstDayOfWeek_);\n};\n\n\n/**\n * @return {number} The day of year.\n */\ngoog.date.Date.prototype.getDayOfYear = function() {\n  var dayOfYear = this.getDate();\n  var year = this.getFullYear();\n  for (var m = this.getMonth() - 1; m >= 0; m--) {\n    dayOfYear += goog.date.getNumberOfDaysInMonth(year, m);\n  }\n\n  return dayOfYear;\n};\n\n\n/**\n * Returns timezone offset. The timezone offset is the delta in minutes between\n * UTC and your local time. E.g., UTC+10 returns -600. Daylight savings time\n * prevents this value from being constant.\n *\n * @return {number} The timezone offset.\n */\ngoog.date.Date.prototype.getTimezoneOffset = function() {\n  return this.date.getTimezoneOffset();\n};\n\n\n/**\n * Returns timezone offset as a string. Returns offset in [+-]HH:mm format or Z\n * for UTC.\n *\n * @return {string} The timezone offset as a string.\n */\ngoog.date.Date.prototype.getTimezoneOffsetString = function() {\n  var tz;\n  var offset = this.getTimezoneOffset();\n\n  if (offset == 0) {\n    tz = 'Z';\n  } else {\n    var n = Math.abs(offset) / 60;\n    var h = Math.floor(n);\n    var m = (n - h) * 60;\n    tz = (offset > 0 ? '-' : '+') + goog.string.padNumber(h, 2) + ':' +\n        goog.string.padNumber(m, 2);\n  }\n\n  return tz;\n};\n\n\n/**\n * Sets the date.\n *\n * @param {goog.date.Date} date Date object to set date from.\n */\ngoog.date.Date.prototype.set = function(date) {\n  this.date = new Date(date.getFullYear(), date.getMonth(), date.getDate());\n};\n\n\n/**\n * Sets the year part of the date.\n *\n * @param {number} year Four digit year.\n */\ngoog.date.Date.prototype.setFullYear = function(year) {\n  this.date.setFullYear(year);\n};\n\n\n/**\n * Alias for setFullYear.\n *\n * @param {number} year Four digit year.\n * @see #setFullYear\n */\ngoog.date.Date.prototype.setYear = function(year) {\n  this.setFullYear(year);\n};\n\n\n/**\n * Sets the month part of the date.\n *\n * TODO(nnaze): Update type to goog.date.month.\n *\n * @param {number} month The month, where 0 = Jan, 11 = Dec.\n */\ngoog.date.Date.prototype.setMonth = function(month) {\n  this.date.setMonth(month);\n};\n\n\n/**\n * Sets the day part of the date.\n *\n * @param {number} date The day part.\n */\ngoog.date.Date.prototype.setDate = function(date) {\n  this.date.setDate(date);\n};\n\n\n/**\n * Sets the value of the date object as expressed in the number of milliseconds\n * since 1 January 1970 00:00:00.\n *\n * @param {number} ms Number of milliseconds since 1 Jan 1970.\n */\ngoog.date.Date.prototype.setTime = function(ms) {\n  this.date.setTime(ms);\n};\n\n\n/**\n * Sets the year part of the date according to universal time.\n *\n * @param {number} year Four digit year.\n */\ngoog.date.Date.prototype.setUTCFullYear = function(year) {\n  this.date.setUTCFullYear(year);\n};\n\n\n/**\n * Sets the month part of the date according to universal time.\n *\n * @param {number} month The month, where 0 = Jan, 11 = Dec.\n */\ngoog.date.Date.prototype.setUTCMonth = function(month) {\n  this.date.setUTCMonth(month);\n};\n\n\n/**\n * Sets the day part of the date according to universal time.\n *\n * @param {number} date The UTC date.\n */\ngoog.date.Date.prototype.setUTCDate = function(date) {\n  this.date.setUTCDate(date);\n};\n\n\n/**\n * Sets the first day of week.\n *\n * @param {number} day 0 = Mon, 6 = Sun.\n */\ngoog.date.Date.prototype.setFirstDayOfWeek = function(day) {\n  this.firstDayOfWeek_ = day;\n};\n\n\n/**\n * Sets cut off weekday used for week number calculations. 0 = Mon, 6 = Sun.\n *\n * @param {number} day The cut off weekday.\n */\ngoog.date.Date.prototype.setFirstWeekCutOffDay = function(day) {\n  this.firstWeekCutOffDay_ = day;\n};\n\n\n/**\n * Performs date calculation by adding the supplied interval to the date.\n *\n * @param {goog.date.Interval} interval Date interval to add.\n */\ngoog.date.Date.prototype.add = function(interval) {\n  if (interval.years || interval.months) {\n    // As months have different number of days adding a month to Jan 31 by just\n    // setting the month would result in a date in early March rather than Feb\n    // 28 or 29. Doing it this way overcomes that problem.\n\n    // adjust year and month, accounting for both directions\n    var month = this.getMonth() + interval.months + interval.years * 12;\n    var year = this.getYear() + Math.floor(month / 12);\n    month %= 12;\n    if (month < 0) {\n      month += 12;\n    }\n\n    var daysInTargetMonth = goog.date.getNumberOfDaysInMonth(year, month);\n    var date = Math.min(daysInTargetMonth, this.getDate());\n\n    // avoid inadvertently causing rollovers to adjacent months\n    this.setDate(1);\n\n    this.setFullYear(year);\n    this.setMonth(month);\n    this.setDate(date);\n  }\n\n  if (interval.days) {\n    // Convert the days to milliseconds and add it to the UNIX timestamp.\n    // Taking noon helps to avoid 1 day error due to the daylight saving.\n    var noon = new Date(this.getYear(), this.getMonth(), this.getDate(), 12);\n    var result = new Date(noon.getTime() + interval.days * 86400000);\n\n    // Set date to 1 to prevent rollover caused by setting the year or month.\n    this.setDate(1);\n    this.setFullYear(result.getFullYear());\n    this.setMonth(result.getMonth());\n    this.setDate(result.getDate());\n\n    this.maybeFixDst_(result.getDate());\n  }\n};\n\n\n/**\n * Returns ISO 8601 string representation of date.\n *\n * @param {boolean=} opt_verbose Whether the verbose format should be used\n *     instead of the default compact one.\n * @param {boolean=} opt_tz Whether the timezone offset should be included\n *     in the string.\n * @return {string} ISO 8601 string representation of date.\n */\ngoog.date.Date.prototype.toIsoString = function(opt_verbose, opt_tz) {\n  var str = [\n    this.getFullYear(), goog.string.padNumber(this.getMonth() + 1, 2),\n    goog.string.padNumber(this.getDate(), 2)\n  ];\n\n  return str.join((opt_verbose) ? '-' : '') +\n      (opt_tz ? this.getTimezoneOffsetString() : '');\n};\n\n\n/**\n * Returns ISO 8601 string representation of date according to universal time.\n *\n * @param {boolean=} opt_verbose Whether the verbose format should be used\n *     instead of the default compact one.\n * @param {boolean=} opt_tz Whether the timezone offset should be included in\n *     the string.\n * @return {string} ISO 8601 string representation of date according to\n *     universal time.\n */\ngoog.date.Date.prototype.toUTCIsoString = function(opt_verbose, opt_tz) {\n  var str = [\n    this.getUTCFullYear(), goog.string.padNumber(this.getUTCMonth() + 1, 2),\n    goog.string.padNumber(this.getUTCDate(), 2)\n  ];\n\n  return str.join((opt_verbose) ? '-' : '') + (opt_tz ? 'Z' : '');\n};\n\n\n/**\n * Tests whether given date is equal to this Date.\n * Note: This ignores units more precise than days (hours and below)\n * and also ignores timezone considerations.\n *\n * @param {goog.date.Date} other The date to compare.\n * @return {boolean} Whether the given date is equal to this one.\n */\ngoog.date.Date.prototype.equals = function(other) {\n  return !!(\n      other && this.getYear() == other.getYear() &&\n      this.getMonth() == other.getMonth() && this.getDate() == other.getDate());\n};\n\n\n/**\n * Overloaded toString method for object.\n * @return {string} ISO 8601 string representation of date.\n * @override\n */\ngoog.date.Date.prototype.toString = function() {\n  return this.toIsoString();\n};\n\n\n/**\n * Fixes date to account for daylight savings time in browsers that fail to do\n * so automatically.\n * @param {number} expected Expected date.\n * @private\n */\ngoog.date.Date.prototype.maybeFixDst_ = function(expected) {\n  if (this.getDate() != expected) {\n    var dir = this.getDate() < expected ? 1 : -1;\n    this.date.setUTCHours(this.date.getUTCHours() + dir);\n  }\n};\n\n\n/**\n * @return {number} Value of wrapped date.\n * @override\n */\ngoog.date.Date.prototype.valueOf = function() {\n  return this.date.valueOf();\n};\n\n\n/**\n * Compares two dates.  May be used as a sorting function.\n * @see goog.array.sort\n * @param {!goog.date.DateLike} date1 Date to compare.\n * @param {!goog.date.DateLike} date2 Date to compare.\n * @return {number} Comparison result. 0 if dates are the same, less than 0 if\n *     date1 is earlier than date2, greater than 0 if date1 is later than date2.\n */\ngoog.date.Date.compare = function(date1, date2) {\n  return date1.getTime() - date2.getTime();\n};\n\n\n/**\n * Parses an ISO 8601 string as a `goog.date.Date`.\n * @param {string} formatted ISO 8601 string to parse.\n * @return {?goog.date.Date} Parsed date or null if parse fails.\n */\ngoog.date.Date.fromIsoString = function(formatted) {\n  var ret = new goog.date.Date(2000);\n  return goog.date.setIso8601DateOnly_(ret, formatted) ? ret : null;\n};\n\n\n\n/**\n * Class representing a date and time. Defaults to current date and time if none\n * is specified.\n *\n * Implements most methods of the native js Date object and can be used\n * interchangeably with it just as if goog.date.DateTime was a subclass of Date.\n *\n * @param {(number|{getTime:?}|null)=} opt_year Four digit year or a date-like\n *     object. If not set, the created object will contain the date determined\n *     by goog.now().\n * @param {number=} opt_month Month, 0 = Jan, 11 = Dec.\n * @param {number=} opt_date Date of month, 1 - 31.\n * @param {number=} opt_hours Hours, 0 - 23.\n * @param {number=} opt_minutes Minutes, 0 - 59.\n * @param {number=} opt_seconds Seconds, 0 - 61.\n * @param {number=} opt_milliseconds Milliseconds, 0 - 999.\n * @constructor\n * @struct\n * @extends {goog.date.Date}\n */\ngoog.date.DateTime = function(\n    opt_year, opt_month, opt_date, opt_hours, opt_minutes, opt_seconds,\n    opt_milliseconds) {\n  if (typeof opt_year === 'number') {\n    /** @override */\n    this.date = new Date(\n        opt_year, opt_month || 0, opt_date || 1, opt_hours || 0,\n        opt_minutes || 0, opt_seconds || 0, opt_milliseconds || 0);\n  } else {\n    this.date = new Date(\n        opt_year && opt_year.getTime ? opt_year.getTime() : goog.now());\n  }\n};\ngoog.inherits(goog.date.DateTime, goog.date.Date);\n\n\n/**\n * @param {number} timestamp Number of milliseconds since Epoch.\n * @return {!goog.date.DateTime}\n */\ngoog.date.DateTime.fromTimestamp = function(timestamp) {\n  var date = new goog.date.DateTime();\n  date.setTime(timestamp);\n  return date;\n};\n\n\n/**\n * Creates a DateTime from a datetime string expressed in RFC 822 format.\n *\n * @param {string} formatted A date or datetime expressed in RFC 822 format.\n * @return {goog.date.DateTime} Parsed date or null if parse fails.\n */\ngoog.date.DateTime.fromRfc822String = function(formatted) {\n  var date = new Date(formatted);\n  return !isNaN(date.getTime()) ? new goog.date.DateTime(date) : null;\n};\n\n\n/**\n * Returns the hours part of the datetime.\n *\n * @return {number} An integer between 0 and 23, representing the hour.\n */\ngoog.date.DateTime.prototype.getHours = function() {\n  return this.date.getHours();\n};\n\n\n/**\n * Returns the minutes part of the datetime.\n *\n * @return {number} An integer between 0 and 59, representing the minutes.\n */\ngoog.date.DateTime.prototype.getMinutes = function() {\n  return this.date.getMinutes();\n};\n\n\n/**\n * Returns the seconds part of the datetime.\n *\n * @return {number} An integer between 0 and 59, representing the seconds.\n */\ngoog.date.DateTime.prototype.getSeconds = function() {\n  return this.date.getSeconds();\n};\n\n\n/**\n * Returns the milliseconds part of the datetime.\n *\n * @return {number} An integer between 0 and 999, representing the milliseconds.\n */\ngoog.date.DateTime.prototype.getMilliseconds = function() {\n  return this.date.getMilliseconds();\n};\n\n\n/**\n * Returns the day of week according to universal time, US style.\n *\n * @return {goog.date.weekDay} Day of week, 0 = Sun, 1 = Mon, 6 = Sat.\n * @override\n */\ngoog.date.DateTime.prototype.getUTCDay = function() {\n  return /** @type {goog.date.weekDay} */ (this.date.getUTCDay());\n};\n\n\n/**\n * Returns the hours part of the datetime according to universal time.\n *\n * @return {number} An integer between 0 and 23, representing the hour.\n * @override\n */\ngoog.date.DateTime.prototype.getUTCHours = function() {\n  return this.date.getUTCHours();\n};\n\n\n/**\n * Returns the minutes part of the datetime according to universal time.\n *\n * @return {number} An integer between 0 and 59, representing the minutes.\n * @override\n */\ngoog.date.DateTime.prototype.getUTCMinutes = function() {\n  return this.date.getUTCMinutes();\n};\n\n\n/**\n * Returns the seconds part of the datetime according to universal time.\n *\n * @return {number} An integer between 0 and 59, representing the seconds.\n */\ngoog.date.DateTime.prototype.getUTCSeconds = function() {\n  return this.date.getUTCSeconds();\n};\n\n\n/**\n * Returns the milliseconds part of the datetime according to universal time.\n *\n * @return {number} An integer between 0 and 999, representing the milliseconds.\n */\ngoog.date.DateTime.prototype.getUTCMilliseconds = function() {\n  return this.date.getUTCMilliseconds();\n};\n\n\n/**\n * Sets the hours part of the datetime.\n *\n * @param {number} hours An integer between 0 and 23, representing the hour.\n */\ngoog.date.DateTime.prototype.setHours = function(hours) {\n  this.date.setHours(hours);\n};\n\n\n/**\n * Sets the minutes part of the datetime.\n *\n * @param {number} minutes Integer between 0 and 59, representing the minutes.\n */\ngoog.date.DateTime.prototype.setMinutes = function(minutes) {\n  this.date.setMinutes(minutes);\n};\n\n\n/**\n * Sets the seconds part of the datetime.\n *\n * @param {number} seconds Integer between 0 and 59, representing the seconds.\n */\ngoog.date.DateTime.prototype.setSeconds = function(seconds) {\n  this.date.setSeconds(seconds);\n};\n\n\n/**\n * Sets the milliseconds part of the datetime.\n *\n * @param {number} ms Integer between 0 and 999, representing the milliseconds.\n */\ngoog.date.DateTime.prototype.setMilliseconds = function(ms) {\n  this.date.setMilliseconds(ms);\n};\n\n\n/**\n * Sets the hours part of the datetime according to universal time.\n *\n * @param {number} hours An integer between 0 and 23, representing the hour.\n */\ngoog.date.DateTime.prototype.setUTCHours = function(hours) {\n  this.date.setUTCHours(hours);\n};\n\n\n/**\n * Sets the minutes part of the datetime according to universal time.\n *\n * @param {number} minutes Integer between 0 and 59, representing the minutes.\n */\ngoog.date.DateTime.prototype.setUTCMinutes = function(minutes) {\n  this.date.setUTCMinutes(minutes);\n};\n\n\n/**\n * Sets the seconds part of the datetime according to universal time.\n *\n * @param {number} seconds Integer between 0 and 59, representing the seconds.\n */\ngoog.date.DateTime.prototype.setUTCSeconds = function(seconds) {\n  this.date.setUTCSeconds(seconds);\n};\n\n\n/**\n * Sets the seconds part of the datetime according to universal time.\n *\n * @param {number} ms Integer between 0 and 999, representing the milliseconds.\n */\ngoog.date.DateTime.prototype.setUTCMilliseconds = function(ms) {\n  this.date.setUTCMilliseconds(ms);\n};\n\n\n/**\n * @return {boolean} Whether the datetime is aligned to midnight.\n */\ngoog.date.DateTime.prototype.isMidnight = function() {\n  return this.getHours() == 0 && this.getMinutes() == 0 &&\n      this.getSeconds() == 0 && this.getMilliseconds() == 0;\n};\n\n\n/**\n * Performs date calculation by adding the supplied interval to the date.\n *\n * @param {goog.date.Interval} interval Date interval to add.\n * @override\n */\ngoog.date.DateTime.prototype.add = function(interval) {\n  goog.date.Date.prototype.add.call(this, interval);\n\n  if (interval.hours) {\n    this.setUTCHours(this.date.getUTCHours() + interval.hours);\n  }\n  if (interval.minutes) {\n    this.setUTCMinutes(this.date.getUTCMinutes() + interval.minutes);\n  }\n  if (interval.seconds) {\n    this.setUTCSeconds(this.date.getUTCSeconds() + interval.seconds);\n  }\n};\n\n\n/**\n * Returns ISO 8601 string representation of date/time.\n *\n * @param {boolean=} opt_verbose Whether the verbose format should be used\n *     instead of the default compact one.\n * @param {boolean=} opt_tz Whether the timezone offset should be included\n *     in the string.\n * @return {string} ISO 8601 string representation of date/time.\n * @override\n */\ngoog.date.DateTime.prototype.toIsoString = function(opt_verbose, opt_tz) {\n  var dateString = goog.date.Date.prototype.toIsoString.call(this, opt_verbose);\n\n  if (opt_verbose) {\n    return dateString + 'T' + goog.string.padNumber(this.getHours(), 2) + ':' +\n        goog.string.padNumber(this.getMinutes(), 2) + ':' +\n        goog.string.padNumber(this.getSeconds(), 2) +\n        (opt_tz ? this.getTimezoneOffsetString() : '');\n  }\n\n  return dateString + 'T' + goog.string.padNumber(this.getHours(), 2) +\n      goog.string.padNumber(this.getMinutes(), 2) +\n      goog.string.padNumber(this.getSeconds(), 2) +\n      (opt_tz ? this.getTimezoneOffsetString() : '');\n};\n\n\n/**\n * Returns XML Schema 2 string representation of date/time.\n * The return value is also ISO 8601 compliant.\n *\n * @param {boolean=} opt_timezone Should the timezone offset be included in the\n *     string?.\n * @return {string} XML Schema 2 string representation of date/time.\n */\ngoog.date.DateTime.prototype.toXmlDateTime = function(opt_timezone) {\n  return goog.date.Date.prototype.toIsoString.call(this, true) + 'T' +\n      goog.string.padNumber(this.getHours(), 2) + ':' +\n      goog.string.padNumber(this.getMinutes(), 2) + ':' +\n      goog.string.padNumber(this.getSeconds(), 2) +\n      (opt_timezone ? this.getTimezoneOffsetString() : '');\n};\n\n\n/**\n * Returns ISO 8601 string representation of date/time according to universal\n * time.\n *\n * @param {boolean=} opt_verbose Whether the opt_verbose format should be\n *     returned instead of the default compact one.\n * @param {boolean=} opt_tz Whether the timezone offset should be included in\n *     the string.\n * @return {string} ISO 8601 string representation of date/time according to\n *     universal time.\n * @override\n */\ngoog.date.DateTime.prototype.toUTCIsoString = function(opt_verbose, opt_tz) {\n  var dateStr = goog.date.Date.prototype.toUTCIsoString.call(this, opt_verbose);\n\n  if (opt_verbose) {\n    return dateStr + 'T' + goog.string.padNumber(this.getUTCHours(), 2) + ':' +\n        goog.string.padNumber(this.getUTCMinutes(), 2) + ':' +\n        goog.string.padNumber(this.getUTCSeconds(), 2) + (opt_tz ? 'Z' : '');\n  }\n\n  return dateStr + 'T' + goog.string.padNumber(this.getUTCHours(), 2) +\n      goog.string.padNumber(this.getUTCMinutes(), 2) +\n      goog.string.padNumber(this.getUTCSeconds(), 2) + (opt_tz ? 'Z' : '');\n};\n\n\n/**\n * Returns RFC 3339 string representation of datetime in UTC.\n *\n * @return {string} A UTC datetime expressed in RFC 3339 format.\n */\ngoog.date.DateTime.prototype.toUTCRfc3339String = function() {\n  var date = this.toUTCIsoString(true);\n  var millis = this.getUTCMilliseconds();\n  return (millis ? date + '.' + goog.string.padNumber(millis, 3) : date) + 'Z';\n};\n\n\n/**\n * Tests whether given datetime is exactly equal to this DateTime.\n *\n * @param {goog.date.Date} other The datetime to compare.\n * @return {boolean} Whether the given datetime is exactly equal to this one.\n * @override\n */\ngoog.date.DateTime.prototype.equals = function(other) {\n  return this.getTime() == other.getTime();\n};\n\n\n/**\n * Overloaded toString method for object.\n * @return {string} ISO 8601 string representation of date/time.\n * @override\n */\ngoog.date.DateTime.prototype.toString = function() {\n  return this.toIsoString();\n};\n\n\n/**\n * Generates time label for the datetime, e.g., '5:30 AM'.\n * By default this does not pad hours (e.g., to '05:30') and it does add\n * an am/pm suffix.\n * TODO(user): i18n -- hardcoding time format like this is bad.  E.g., in CJK\n *               locales, need Chinese characters for hour and minute units.\n * @param {boolean=} opt_padHours Whether to pad hours, e.g., '05:30' vs '5:30'.\n * @param {boolean=} opt_showAmPm Whether to show the 'am' and 'pm' suffix.\n * @param {boolean=} opt_omitZeroMinutes E.g., '5:00pm' becomes '5pm',\n *                                      but '5:01pm' remains '5:01pm'.\n * @return {string} The time label.\n * @deprecated Use goog.i18n.DateTimeFormat with\n *     goog.i18n.DateTimeFormat.Format.FULL_TIME or\n *     goog.i18n.DateTimeFormat.Format.LONG_TIME or\n *     goog.i18n.DateTimeFormat.Format.MEDIUM_TIME or\n *     goog.i18n.DateTimeFormat.Format.SHORT_TIME.\n */\ngoog.date.DateTime.prototype.toUsTimeString = function(\n    opt_padHours, opt_showAmPm, opt_omitZeroMinutes) {\n  var hours = this.getHours();\n\n  // show am/pm marker by default\n  if (opt_showAmPm === undefined) {\n    opt_showAmPm = true;\n  }\n\n  // 12pm\n  var isPM = hours == 12;\n\n  // change from 1-24 to 1-12 basis\n  if (hours > 12) {\n    hours -= 12;\n    isPM = true;\n  }\n\n  // midnight is expressed as \"12am\", but if am/pm marker omitted, keep as '0'\n  if (hours == 0 && opt_showAmPm) {\n    hours = 12;\n  }\n\n  var label = opt_padHours ? goog.string.padNumber(hours, 2) : String(hours);\n  var minutes = this.getMinutes();\n  if (!opt_omitZeroMinutes || minutes > 0) {\n    label += ':' + goog.string.padNumber(minutes, 2);\n  }\n\n  // by default, show am/pm suffix\n  if (opt_showAmPm) {\n    label += isPM ? ' PM' : ' AM';\n  }\n  return label;\n};\n\n\n/**\n * Generates time label for the datetime in standard ISO 24-hour time format.\n * E.g., '06:00:00' or '23:30:15'.\n * @param {boolean=} opt_showSeconds Whether to shows seconds. Defaults to TRUE.\n * @return {string} The time label.\n */\ngoog.date.DateTime.prototype.toIsoTimeString = function(opt_showSeconds) {\n  var hours = this.getHours();\n  var label = goog.string.padNumber(hours, 2) + ':' +\n      goog.string.padNumber(this.getMinutes(), 2);\n  if (opt_showSeconds === undefined || opt_showSeconds) {\n    label += ':' + goog.string.padNumber(this.getSeconds(), 2);\n  }\n  return label;\n};\n\n\n/**\n * @return {!goog.date.DateTime} A clone of the datetime object.\n * @override\n */\ngoog.date.DateTime.prototype.clone = function() {\n  var date = new goog.date.DateTime(this.date);\n  date.setFirstDayOfWeek(this.getFirstDayOfWeek());\n  date.setFirstWeekCutOffDay(this.getFirstWeekCutOffDay());\n  return date;\n};\n\n\n/**\n * Parses an ISO 8601 string as a `goog.date.DateTime`.\n * @param {string} formatted ISO 8601 string to parse.\n * @return {?goog.date.DateTime} Parsed date or null if parse fails.\n * @override\n */\ngoog.date.DateTime.fromIsoString = function(formatted) {\n  var ret = new goog.date.DateTime(2000);\n  return goog.date.setIso8601DateTime(ret, formatted) ? ret : null;\n};\n","^?",1579837703000,"^@",["^A",["^1J","^16","^3","~$goog.date.DateLike","~$goog.i18n.DateTimeSymbols"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/date/date.js"],"^S",["^A",["~$goog.date.Interval","~$goog.date.weekDay","~$goog.date.month","~$goog.date.DateTime","~$goog.date.Date","~$goog.date"]],"^1",true,"^2",["^3","^1J","^UU","^UV","^16"]],["^ ","^7",[1579837703000],"^8","goog.labs.net.webchannel.netutils.js","^9",["^:","goog/labs/net/webchannel/netutils.js"],"^;","goog/labs/net/webchannel/netutils.js","^<","^=","^>","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility functions for managing networking, such as\n * testing network connectivity.\n */\n\n\ngoog.provide('goog.labs.net.webChannel.netUtils');\n\ngoog.require('goog.Uri');\ngoog.require('goog.labs.net.webChannel.WebChannelDebug');\n\ngoog.scope(function() {\nvar netUtils = goog.labs.net.webChannel.netUtils;\nvar WebChannelDebug = goog.labs.net.webChannel.WebChannelDebug;\n\n\n/**\n * Default timeout to allow for URI pings.\n * @type {number}\n */\nnetUtils.NETWORK_TIMEOUT = 10000;\n\n\n/**\n * Pings the network with an image URI to check if an error is a server error\n * or user's network error.\n *\n * The caller needs to add a 'rand' parameter to make sure the response is\n * not fulfilled by browser cache.\n *\n * @param {function(boolean)} callback The function to call back with results.\n * @param {goog.Uri=} opt_imageUri The URI (of an image) to use for the network\n *     test.\n */\nnetUtils.testNetwork = function(callback, opt_imageUri) {\n  var uri = opt_imageUri;\n  if (!uri) {\n    // default google.com image\n    uri = new goog.Uri('//www.google.com/images/cleardot.gif');\n\n    if (!(goog.global.location && goog.global.location.protocol == 'http')) {\n      uri.setScheme('https');  // e.g. chrome-extension\n    }\n    uri.makeUnique();\n  }\n\n  netUtils.testLoadImage(uri.toString(), netUtils.NETWORK_TIMEOUT, callback);\n};\n\n\n/**\n * Test loading the given image, retrying if necessary.\n * @param {string} url URL to the image.\n * @param {number} timeout Milliseconds before giving up.\n * @param {function(boolean)} callback Function to call with results.\n * @param {number} retries The number of times to retry.\n * @param {!WebChannelDebug} channelDebug The debug object\n * @param {number=} opt_pauseBetweenRetriesMS Optional number of milliseconds\n *     between retries - defaults to 0.\n */\nnetUtils.testLoadImageWithRetries = function(\n    url, timeout, callback, retries, channelDebug, opt_pauseBetweenRetriesMS) {\n  channelDebug.debug('TestLoadImageWithRetries: ' + opt_pauseBetweenRetriesMS);\n  if (retries == 0) {\n    // no more retries, give up\n    callback(false);\n    return;\n  }\n\n  var pauseBetweenRetries = opt_pauseBetweenRetriesMS || 0;\n  retries--;\n  netUtils.testLoadImage(url, timeout, function(succeeded) {\n    if (succeeded) {\n      callback(true);\n    } else {\n      // try again\n      goog.global.setTimeout(function() {\n        netUtils.testLoadImageWithRetries(\n            url, timeout, callback, retries, channelDebug, pauseBetweenRetries);\n      }, pauseBetweenRetries);\n    }\n  });\n};\n\n\n/**\n * Test loading the given image.\n * @param {string} url URL to the image.\n * @param {number} timeout Milliseconds before giving up.\n * @param {function(boolean)} callback Function to call with results.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\nnetUtils.testLoadImage = function(url, timeout, callback) {\n  var channelDebug = new WebChannelDebug();\n  channelDebug.debug('TestLoadImage: loading ' + url);\n  if (goog.global.Image) {\n    var img = new Image();\n    img.onload = goog.partial(\n        netUtils.imageCallback_, channelDebug, img, 'TestLoadImage: loaded',\n        true, callback);\n    img.onerror = goog.partial(\n        netUtils.imageCallback_, channelDebug, img, 'TestLoadImage: error',\n        false, callback);\n    img.onabort = goog.partial(\n        netUtils.imageCallback_, channelDebug, img, 'TestLoadImage: abort',\n        false, callback);\n    img.ontimeout = goog.partial(\n        netUtils.imageCallback_, channelDebug, img, 'TestLoadImage: timeout',\n        false, callback);\n\n    goog.global.setTimeout(function() {\n      if (img.ontimeout) {\n        img.ontimeout();\n      }\n    }, timeout);\n    img.src = url;\n  } else {\n    // log ERROR_OTHER from environements where Image is not supported\n    callback(false);\n  }\n};\n\n\n/**\n * Wrap the image callback with debug and cleanup logic.\n * @param {!WebChannelDebug} channelDebug The WebChannelDebug object.\n * @param {!Image} img The image element.\n * @param {string} debugText The debug text.\n * @param {boolean} result The result of image loading.\n * @param {function(boolean)} callback The image callback.\n * @private\n */\nnetUtils.imageCallback_ = function(\n    channelDebug, img, debugText, result, callback) {\n  try {\n    channelDebug.debug(debugText);\n    netUtils.clearImageCallbacks_(img);\n    callback(result);\n  } catch (e) {\n    channelDebug.dumpException(e);\n  }\n};\n\n\n/**\n * Clears handlers to avoid memory leaks.\n * @param {Image} img The image to clear handlers from.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\nnetUtils.clearImageCallbacks_ = function(img) {\n  img.onload = null;\n  img.onerror = null;\n  img.onabort = null;\n  img.ontimeout = null;\n};\n});  // goog.scope\n","^?",1579837703000,"^@",["^A",["~$goog.Uri","^3","~$goog.labs.net.webChannel.WebChannelDebug"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchannel/netutils.js"],"^S",["^A",["~$goog.labs.net.webChannel.netUtils"]],"^1",true,"^2",["^3","^V1","^V2"]],["^ ","^7",[1579837703000],"^8","goog.ui.menuseparator.js","^9",["^:","goog/ui/menuseparator.js"],"^;","goog/ui/menuseparator.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A class for representing menu separators.\n * @see goog.ui.Menu\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.MenuSeparator');\n\ngoog.require('goog.ui.MenuSeparatorRenderer');\ngoog.require('goog.ui.Separator');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Class representing a menu separator.  A menu separator extends {@link\n * goog.ui.Separator} by always setting its renderer to {@link\n * goog.ui.MenuSeparatorRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper used for\n *     document interactions.\n * @constructor\n * @extends {goog.ui.Separator}\n */\ngoog.ui.MenuSeparator = function(opt_domHelper) {\n  goog.ui.Separator.call(\n      this, goog.ui.MenuSeparatorRenderer.getInstance(), opt_domHelper);\n};\ngoog.inherits(goog.ui.MenuSeparator, goog.ui.Separator);\n\n\n// Register a decorator factory function for goog.ui.MenuSeparators.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.MenuSeparatorRenderer.CSS_CLASS, function() {\n      // Separator defaults to using MenuSeparatorRenderer.\n      return new goog.ui.Separator();\n    });\n","^?",1579837703000,"^@",["^A",["^54","^3","^29","~$goog.ui.MenuSeparatorRenderer"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/menuseparator.js"],"^S",["^A",["~$goog.ui.MenuSeparator"]],"^1",true,"^2",["^3","^V4","^54","^29"]],["^ ","^7",[1579837703000],"^8","goog.i18n.graphemebreak.js","^9",["^:","goog/i18n/graphemebreak.js"],"^;","goog/i18n/graphemebreak.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Detect Grapheme Cluster Break in a pair of codepoints. Follows\n * Unicode 10 UAX#29. Tailoring for Virama × Indic Letters is used.\n *\n * Reference: http://unicode.org/reports/tr29\n *\n */\n\ngoog.provide('goog.i18n.GraphemeBreak');\n\ngoog.require('goog.asserts');\ngoog.require('goog.i18n.uChar');\ngoog.require('goog.structs.InversionMap');\n\n/**\n * Enum for all Grapheme Cluster Break properties.\n * These enums directly corresponds to Grapheme_Cluster_Break property values\n * mentioned in http://unicode.org/reports/tr29 table 2. VIRAMA and\n * INDIC_LETTER are for the Virama × Base tailoring mentioned in the notes.\n *\n * @protected @enum {number}\n */\ngoog.i18n.GraphemeBreak.property = {\n  OTHER: 0,\n  CONTROL: 1,\n  EXTEND: 2,\n  PREPEND: 3,\n  SPACING_MARK: 4,\n  INDIC_LETTER: 5,\n  VIRAMA: 6,\n  L: 7,\n  V: 8,\n  T: 9,\n  LV: 10,\n  LVT: 11,\n  CR: 12,\n  LF: 13,\n  REGIONAL_INDICATOR: 14,\n  ZWJ: 15,\n  E_BASE: 16,\n  GLUE_AFTER_ZWJ: 17,\n  E_MODIFIER: 18,\n  E_BASE_GAZ: 19\n};\n\n\n/**\n * Grapheme Cluster Break property values for all codepoints as inversion map.\n * Constructed lazily.\n *\n * @private {?goog.structs.InversionMap}\n */\ngoog.i18n.GraphemeBreak.inversions_ = null;\n\n\n/**\n * Indicates if a and b form a grapheme cluster.\n *\n * This implements the rules in:\n * http://www.unicode.org/reports/tr29/#Grapheme_Cluster_Boundary_Rules\n *\n * @param {number|string} a Code point or string with the first side of\n *     grapheme cluster.\n * @param {number|string} b Code point or string with the second side of\n *     grapheme cluster.\n * @param {boolean} extended If true, indicates extended grapheme cluster;\n *     If false, indicates legacy cluster.\n * @return {boolean} True if a & b do not form a cluster; False otherwise.\n * @private\n */\ngoog.i18n.GraphemeBreak.applyBreakRules_ = function(a, b, extended) {\n  var prop = goog.i18n.GraphemeBreak.property;\n\n  var aCode = (typeof a === 'string') ?\n      goog.i18n.GraphemeBreak.getCodePoint_(a, a.length - 1) :\n      a;\n  var bCode =\n      (typeof b === 'string') ? goog.i18n.GraphemeBreak.getCodePoint_(b, 0) : b;\n\n  var aProp = goog.i18n.GraphemeBreak.getBreakProp_(aCode);\n  var bProp = goog.i18n.GraphemeBreak.getBreakProp_(bCode);\n\n  var isString = (typeof a === 'string');\n\n  // GB3.\n  if (aProp === prop.CR && bProp === prop.LF) {\n    return false;\n  }\n\n  // GB4.\n  if (aProp === prop.CONTROL || aProp === prop.CR || aProp === prop.LF) {\n    return true;\n  }\n\n  // GB5.\n  if (bProp === prop.CONTROL || bProp === prop.CR || bProp === prop.LF) {\n    return true;\n  }\n\n  // GB6.\n  if (aProp === prop.L &&\n      (bProp === prop.L || bProp === prop.V || bProp === prop.LV ||\n       bProp === prop.LVT)) {\n    return false;\n  }\n\n  // GB7.\n  if ((aProp === prop.LV || aProp === prop.V) &&\n      (bProp === prop.V || bProp === prop.T)) {\n    return false;\n  }\n\n  // GB8.\n  if ((aProp === prop.LVT || aProp === prop.T) && bProp === prop.T) {\n    return false;\n  }\n\n  // GB9.\n  if (bProp === prop.EXTEND || bProp === prop.ZWJ || bProp === prop.VIRAMA) {\n    return false;\n  }\n\n  // GB9a, GB9b.\n  if (extended && (aProp === prop.PREPEND || bProp === prop.SPACING_MARK)) {\n    return false;\n  }\n\n  // Tailorings for basic aksara support.\n  if (extended && aProp === prop.VIRAMA && bProp === prop.INDIC_LETTER) {\n    return false;\n  }\n\n  var aStr, index, codePoint, codePointProp;\n\n  // GB10.\n  if (isString) {\n    if (bProp === prop.E_MODIFIER) {\n      // If using new API, consume the string's code points starting from the\n      // end and test the left side of: (E_Base | EBG) Extend* × E_Modifier.\n      aStr = /** @type {string} */ (a);\n      index = aStr.length - 1;\n      codePoint = aCode;\n      codePointProp = aProp;\n      while (index > 0 && codePointProp === prop.EXTEND) {\n        index -= goog.i18n.uChar.charCount(codePoint);\n        codePoint = goog.i18n.GraphemeBreak.getCodePoint_(aStr, index);\n        codePointProp = goog.i18n.GraphemeBreak.getBreakProp_(codePoint);\n      }\n      if (codePointProp === prop.E_BASE || codePointProp === prop.E_BASE_GAZ) {\n        return false;\n      }\n    }\n  } else {\n    // If using legacy API, return best effort by testing:\n    // (E_Base | EBG) × E_Modifier.\n    if ((aProp === prop.E_BASE || aProp === prop.E_BASE_GAZ) &&\n        bProp === prop.E_MODIFIER) {\n      return false;\n    }\n  }\n\n  // GB11.\n  if (aProp === prop.ZWJ &&\n      (bProp === prop.GLUE_AFTER_ZWJ || bProp === prop.E_BASE_GAZ)) {\n    return false;\n  }\n\n  // GB12, GB13.\n  if (isString) {\n    if (bProp === prop.REGIONAL_INDICATOR) {\n      // If using new API, consume the string's code points starting from the\n      // end and test the left side of these rules:\n      // - sot (RI RI)* RI × RI\n      // - [^RI] (RI RI)* RI × RI.\n      var numberOfRi = 0;\n      aStr = /** @type {string} */ (a);\n      index = aStr.length - 1;\n      codePoint = aCode;\n      codePointProp = aProp;\n      while (index > 0 && codePointProp === prop.REGIONAL_INDICATOR) {\n        numberOfRi++;\n        index -= goog.i18n.uChar.charCount(codePoint);\n        codePoint = goog.i18n.GraphemeBreak.getCodePoint_(aStr, index);\n        codePointProp = goog.i18n.GraphemeBreak.getBreakProp_(codePoint);\n      }\n      if (codePointProp === prop.REGIONAL_INDICATOR) {\n        numberOfRi++;\n      }\n      if (numberOfRi % 2 === 1) {\n        return false;\n      }\n    }\n  } else {\n    // If using legacy API, return best effort by testing: RI × RI.\n    if (aProp === prop.REGIONAL_INDICATOR &&\n        bProp === prop.REGIONAL_INDICATOR) {\n      return false;\n    }\n  }\n\n  // GB999.\n  return true;\n};\n\n\n/**\n * Method to return property enum value of the code point. If it is Hangul LV or\n * LVT, then it is computed; for the rest it is picked from the inversion map.\n *\n * @param {number} codePoint The code point value of the character.\n * @return {number} Property enum value of code point.\n * @private\n */\ngoog.i18n.GraphemeBreak.getBreakProp_ = function(codePoint) {\n  if (0xAC00 <= codePoint && codePoint <= 0xD7A3) {\n    var prop = goog.i18n.GraphemeBreak.property;\n    if (codePoint % 0x1C === 0x10) {\n      return prop.LV;\n    }\n    return prop.LVT;\n  } else {\n    if (!goog.i18n.GraphemeBreak.inversions_) {\n      goog.i18n.GraphemeBreak.inversions_ = new goog.structs.InversionMap(\n          [\n            0,      10,   1,     2,   1,    18,   95,    33,    13,  1,\n            594,    112,  275,   7,   263,  45,   1,     1,     1,   2,\n            1,      2,    1,     1,   56,   6,    10,    11,    1,   1,\n            46,     21,   16,    1,   101,  7,    1,     1,     6,   2,\n            2,      1,    4,     33,  1,    1,    1,     30,    27,  91,\n            11,     58,   9,     34,  4,    1,    9,     1,     3,   1,\n            5,      43,   3,     120, 14,   1,    32,    1,     17,  37,\n            1,      1,    1,     1,   3,    8,    4,     1,     2,   1,\n            7,      8,    2,     2,   21,   7,    1,     1,     2,   17,\n            39,     1,    1,     1,   2,    6,    6,     1,     9,   5,\n            4,      2,    2,     12,  2,    15,   2,     1,     17,  39,\n            2,      3,    12,    4,   8,    6,    17,    2,     3,   14,\n            1,      17,   39,    1,   1,    3,    8,     4,     1,   20,\n            2,      29,   1,     2,   17,   39,   1,     1,     2,   1,\n            6,      6,    9,     6,   4,    2,    2,     13,    1,   16,\n            1,      18,   41,    1,   1,    1,    12,    1,     9,   1,\n            40,     1,    3,     17,  31,   1,    5,     4,     3,   5,\n            7,      8,    3,     2,   8,    2,    29,    1,     2,   17,\n            39,     1,    1,     1,   1,    2,    1,     3,     1,   5,\n            1,      8,    9,     1,   3,    2,    29,    1,     2,   17,\n            38,     3,    1,     2,   5,    7,    1,     1,     8,   1,\n            10,     2,    30,    2,   22,   48,   5,     1,     2,   6,\n            7,      1,    18,    2,   13,   46,   2,     1,     1,   1,\n            6,      1,    12,    8,   50,   46,   2,     1,     1,   1,\n            9,      11,   6,     14,  2,    58,   2,     27,    1,   1,\n            1,      1,    1,     4,   2,    49,   14,    1,     4,   1,\n            1,      2,    5,     48,  9,    1,    57,    33,    12,  4,\n            1,      6,    1,     2,   2,    2,    1,     16,    2,   4,\n            2,      2,    4,     3,   1,    3,    2,     7,     3,   4,\n            13,     1,    1,     1,   2,    6,    1,     1,     14,  1,\n            98,     96,   72,    88,  349,  3,    931,   15,    2,   1,\n            14,     15,   2,     1,   14,   15,   2,     15,    15,  14,\n            35,     17,   2,     1,   7,    8,    1,     2,     9,   1,\n            1,      9,    1,     45,  3,    1,    118,   2,     34,  1,\n            87,     28,   3,     3,   4,    2,    9,     1,     6,   3,\n            20,     19,   29,    44,  84,   23,   2,     2,     1,   4,\n            45,     6,    2,     1,   1,    1,    8,     1,     1,   1,\n            2,      8,    6,     13,  48,   84,   1,     14,    33,  1,\n            1,      5,    1,     1,   5,    1,    1,     1,     7,   31,\n            9,      12,   2,     1,   7,    23,   1,     4,     2,   2,\n            2,      2,    2,     11,  3,    2,    36,    2,     1,   1,\n            2,      3,    1,     1,   3,    2,    12,    36,    8,   8,\n            2,      2,    21,    3,   128,  3,    1,     13,    1,   7,\n            4,      1,    4,     2,   1,    3,    2,     198,   64,  523,\n            1,      1,    1,     2,   24,   7,    49,    16,    96,  33,\n            1324,   1,    34,    1,   1,    1,    82,    2,     98,  1,\n            14,     1,    1,     4,   86,   1,    1418,  3,     141, 1,\n            96,     32,   554,   6,   105,  2,    30164, 4,     1,   10,\n            32,     2,    80,    2,   272,  1,    3,     1,     4,   1,\n            23,     2,    2,     1,   24,   30,   4,     4,     3,   8,\n            1,      1,    13,    2,   16,   34,   16,    1,     1,   26,\n            18,     24,   24,    4,   8,    2,    23,    11,    1,   1,\n            12,     32,   3,     1,   5,    3,    3,     36,    1,   2,\n            4,      2,    1,     3,   1,    36,   1,     32,    35,  6,\n            2,      2,    2,     2,   12,   1,    8,     1,     1,   18,\n            16,     1,    3,     6,   1,    1,    1,     3,     48,  1,\n            1,      3,    2,     2,   5,    2,    1,     1,     32,  9,\n            1,      2,    2,     5,   1,    1,    201,   14,    2,   1,\n            1,      9,    8,     2,   1,    2,    1,     2,     1,   1,\n            1,      18,   11184, 27,  49,   1028, 1024,  6942,  1,   737,\n            16,     16,   16,    207, 1,    158,  2,     89,    3,   513,\n            1,      226,  1,     149, 5,    1670, 15,    40,    7,   1,\n            165,    2,    1305,  1,   1,    1,    53,    14,    1,   56,\n            1,      2,    1,     45,  3,    4,    2,     1,     1,   2,\n            1,      66,   3,     36,  5,    1,    6,     2,     62,  1,\n            12,     2,    1,     48,  3,    9,    1,     1,     1,   2,\n            6,      3,    95,    3,   3,    2,    1,     1,     2,   6,\n            1,      160,  1,     3,   7,    1,    21,    2,     2,   56,\n            1,      1,    1,     1,   1,    12,   1,     9,     1,   10,\n            4,      15,   192,   3,   8,    2,    1,     2,     1,   1,\n            105,    1,    2,     6,   1,    1,    2,     1,     1,   2,\n            1,      1,    1,     235, 1,    2,    6,     4,     2,   1,\n            1,      1,    27,    2,   82,   3,    8,     2,     1,   1,\n            1,      1,    106,   1,   1,    1,    2,     6,     1,   1,\n            101,    3,    2,     4,   1,    4,    1,     1283,  1,   14,\n            1,      1,    82,    23,  1,    7,    1,     2,     1,   2,\n            20025,  5,    59,    7,   1050, 62,   4,     19722, 2,   1,\n            4,      5313, 1,     1,   3,    3,    1,     5,     8,   8,\n            2,      7,    30,    4,   148,  3,    1979,  55,    4,   50,\n            8,      1,    14,    1,   22,   1424, 2213,  7,     109, 7,\n            2203,   26,   264,   1,   53,   1,    52,    1,     17,  1,\n            13,     1,    16,    1,   3,    1,    25,    3,     2,   1,\n            2,      3,    30,    1,   1,    1,    13,    5,     66,  2,\n            2,      11,   21,    4,   4,    1,    1,     9,     3,   1,\n            4,      3,    1,     3,   3,    1,    30,    1,     16,  2,\n            106,    1,    4,     1,   71,   2,    4,     1,     21,  1,\n            4,      2,    81,    1,   92,   3,    3,     5,     48,  1,\n            17,     1,    16,    1,   16,   3,    9,     1,     11,  1,\n            587,    5,    1,     1,   7,    1,    9,     10,    3,   2,\n            788162, 31\n          ],\n          [\n            1,  13, 1,  12, 1,  0, 1,  0, 1,  0,  2,  0, 2,  0, 2,  0,  2,  0,\n            2,  0,  2,  0,  2,  0, 3,  0, 2,  0,  1,  0, 2,  0, 2,  0,  2,  3,\n            0,  2,  0,  2,  0,  2, 0,  3, 0,  2,  0,  2, 0,  2, 0,  2,  0,  2,\n            0,  2,  0,  2,  0,  2, 0,  2, 0,  2,  3,  2, 4,  0, 5,  2,  4,  2,\n            0,  4,  2,  4,  6,  4, 0,  2, 5,  0,  2,  0, 5,  0, 2,  4,  0,  5,\n            2,  0,  2,  4,  2,  4, 6,  0, 2,  5,  0,  2, 0,  5, 0,  2,  4,  0,\n            5,  2,  4,  2,  6,  2, 5,  0, 2,  0,  2,  4, 0,  5, 2,  0,  4,  2,\n            4,  6,  0,  2,  0,  2, 4,  0, 5,  2,  0,  2, 4,  2, 4,  6,  2,  5,\n            0,  2,  0,  5,  0,  2, 0,  5, 2,  4,  2,  4, 6,  0, 2,  0,  2,  4,\n            0,  5,  0,  5,  0,  2, 4,  2, 6,  2,  5,  0, 2,  0, 2,  4,  0,  5,\n            2,  0,  4,  2,  4,  2, 4,  2, 4,  2,  6,  2, 5,  0, 2,  0,  2,  4,\n            0,  5,  0,  2,  4,  2, 4,  6, 3,  0,  2,  0, 2,  0, 4,  0,  5,  6,\n            2,  4,  2,  4,  2,  0, 4,  0, 5,  0,  2,  0, 4,  2, 6,  0,  2,  0,\n            5,  0,  2,  0,  4,  2, 0,  2, 0,  5,  0,  2, 0,  2, 0,  2,  0,  2,\n            0,  4,  5,  2,  4,  2, 6,  0, 2,  0,  2,  0, 2,  0, 5,  0,  2,  4,\n            2,  0,  6,  4,  2,  5, 0,  5, 0,  4,  2,  5, 2,  5, 0,  5,  0,  5,\n            2,  5,  2,  0,  4,  2, 0,  2, 5,  0,  2,  0, 7,  8, 9,  0,  2,  0,\n            5,  2,  6,  0,  5,  2, 6,  0, 5,  2,  0,  5, 2,  5, 0,  2,  4,  2,\n            4,  2,  4,  2,  6,  2, 0,  2, 0,  2,  1,  0, 2,  0, 2,  0,  5,  0,\n            2,  4,  2,  4,  2,  4, 2,  0, 5,  0,  5,  0, 5,  2, 4,  2,  0,  5,\n            0,  5,  4,  2,  4,  2, 6,  0, 2,  0,  2,  4, 2,  0, 2,  4,  0,  5,\n            2,  4,  2,  4,  2,  4, 2,  4, 6,  5,  0,  2, 0,  2, 4,  0,  5,  4,\n            2,  4,  2,  6,  2,  5, 0,  5, 0,  5,  0,  2, 4,  2, 4,  2,  4,  2,\n            6,  0,  5,  4,  2,  4, 2,  0, 5,  0,  2,  0, 2,  4, 2,  0,  2,  0,\n            4,  2,  0,  2,  0,  2, 0,  1, 2,  15, 1,  0, 1,  0, 1,  0,  2,  0,\n            16, 0,  17, 0,  17, 0, 17, 0, 16, 0,  17, 0, 16, 0, 17, 0,  2,  0,\n            6,  0,  2,  0,  2,  0, 2,  0, 2,  0,  2,  0, 2,  0, 2,  0,  2,  0,\n            6,  5,  2,  5,  4,  2, 4,  0, 5,  0,  5,  0, 5,  0, 5,  0,  4,  0,\n            5,  4,  6,  2,  0,  2, 0,  5, 0,  2,  0,  5, 2,  4, 6,  0,  7,  2,\n            4,  0,  5,  0,  5,  2, 4,  2, 4,  2,  4,  6, 0,  2, 0,  5,  2,  4,\n            2,  4,  2,  0,  2,  0, 2,  4, 0,  5,  0,  5, 0,  5, 0,  2,  0,  5,\n            2,  0,  2,  0,  2,  0, 2,  0, 2,  0,  5,  4, 2,  4, 0,  4,  6,  0,\n            5,  0,  5,  0,  5,  0, 4,  2, 4,  2,  4,  0, 4,  6, 0,  11, 8,  9,\n            0,  2,  0,  2,  0,  2, 0,  2, 0,  1,  0,  2, 0,  1, 0,  2,  0,  2,\n            0,  2,  0,  2,  0,  2, 6,  0, 2,  0,  4,  2, 4,  0, 2,  6,  0,  6,\n            2,  4,  0,  4,  2,  4, 6,  2, 0,  3,  0,  2, 0,  2, 4,  2,  6,  0,\n            2,  0,  2,  4,  0,  4, 2,  4, 6,  0,  3,  0, 2,  0, 4,  2,  4,  2,\n            6,  2,  0,  2,  0,  2, 4,  2, 6,  0,  2,  4, 0,  2, 0,  2,  4,  2,\n            4,  6,  0,  2,  0,  4, 2,  0, 4,  2,  4,  6, 2,  4, 2,  0,  2,  4,\n            2,  4,  2,  4,  2,  4, 2,  4, 6,  2,  0,  2, 4,  2, 4,  2,  4,  6,\n            2,  0,  2,  0,  4,  2, 4,  2, 4,  6,  2,  0, 2,  4, 2,  4,  2,  6,\n            2,  0,  2,  4,  2,  4, 2,  6, 0,  4,  2,  4, 6,  0, 2,  4,  2,  4,\n            2,  4,  2,  0,  2,  0, 2,  0, 4,  2,  0,  2, 0,  1, 0,  2,  4,  2,\n            0,  4,  2,  1,  2,  0, 2,  0, 2,  0,  2,  0, 2,  0, 2,  0,  2,  0,\n            2,  0,  2,  0,  2,  0, 2,  0, 14, 0,  17, 0, 17, 0, 17, 0,  16, 0,\n            17, 0,  17, 0,  17, 0, 16, 0, 16, 0,  16, 0, 17, 0, 17, 0,  18, 0,\n            16, 0,  16, 0,  19, 0, 16, 0, 16, 0,  16, 0, 16, 0, 16, 0,  17, 0,\n            16, 0,  17, 0,  17, 0, 17, 0, 16, 0,  16, 0, 16, 0, 16, 0,  17, 0,\n            16, 0,  16, 0,  17, 0, 17, 0, 16, 0,  16, 0, 16, 0, 16, 0,  16, 0,\n            16, 0,  16, 0,  16, 0, 16, 0, 1,  2\n          ],\n          true);\n    }\n    return /** @type {number} */ (\n        goog.i18n.GraphemeBreak.inversions_.at(codePoint));\n  }\n};\n\n/**\n * Extracts a code point from a string at the specified index.\n *\n * @param {string} str\n * @param {number} index\n * @return {number} Extracted code point.\n * @private\n */\ngoog.i18n.GraphemeBreak.getCodePoint_ = function(str, index) {\n  var codePoint = goog.i18n.uChar.getCodePointAround(str, index);\n  return (codePoint < 0) ? -codePoint : codePoint;\n};\n\n/**\n * Indicates if there is a grapheme cluster boundary between a and b.\n *\n * Legacy function. Does not cover cases where a sequence of code points is\n * required in order to decide if there is a grapheme cluster boundary, such as\n * emoji modifier sequences and emoji flag sequences. To cover all cases please\n * use `hasGraphemeBreakStrings`.\n *\n * There are two kinds of grapheme clusters: 1) Legacy 2) Extended. This method\n * is to check for both using a boolean flag to switch between them. If no flag\n * is provided rules for the extended clusters will be used by default.\n *\n * @param {number} a The code point value of the first character.\n * @param {number} b The code point value of the second character.\n * @param {boolean=} opt_extended If true, indicates extended grapheme cluster;\n *     If false, indicates legacy cluster. Default value is true.\n * @return {boolean} True if there is a grapheme cluster boundary between\n *     a and b; False otherwise.\n */\ngoog.i18n.GraphemeBreak.hasGraphemeBreak = function(a, b, opt_extended) {\n  return goog.i18n.GraphemeBreak.applyBreakRules_(a, b, opt_extended !== false);\n};\n\n/**\n * Indicates if there is a grapheme cluster boundary between a and b.\n *\n * There are two kinds of grapheme clusters: 1) Legacy 2) Extended. This method\n * is to check for both using a boolean flag to switch between them. If no flag\n * is provided rules for the extended clusters will be used by default.\n *\n * @param {string} a String with the first sequence of characters.\n * @param {string} b String with the second sequence of characters.\n * @param {boolean=} opt_extended If true, indicates extended grapheme cluster;\n *     If false, indicates legacy cluster. Default value is true.\n * @return {boolean} True if there is a grapheme cluster boundary between\n *     a and b; False otherwise.\n */\ngoog.i18n.GraphemeBreak.hasGraphemeBreakStrings = function(a, b, opt_extended) {\n  goog.asserts.assert(a !== undefined, 'First string should be defined.');\n  goog.asserts.assert(b !== undefined, 'Second string should be defined.');\n\n  // Break if any of the strings is empty.\n  if (a.length === 0 || b.length === 0) {\n    return true;\n  }\n\n  return goog.i18n.GraphemeBreak.applyBreakRules_(a, b, opt_extended !== false);\n};\n","^?",1579837703000,"^@",["^A",["^1J","^3","^TC","~$goog.structs.InversionMap"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/graphemebreak.js"],"^S",["^A",["~$goog.i18n.GraphemeBreak"]],"^1",true,"^2",["^3","^1J","^TC","^V6"]],["^ ","^7",[1579837703000],"^8","goog.labs.testing.stringmatcher.js","^9",["^:","goog/labs/testing/stringmatcher.js"],"^;","goog/labs/testing/stringmatcher.js","^<","^=","^>","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides the built-in string matchers like containsString,\n *     startsWith, endsWith, etc.\n */\n\ngoog.provide('goog.labs.testing.AnyStringMatcher');\ngoog.provide('goog.labs.testing.ContainsStringMatcher');\ngoog.provide('goog.labs.testing.EndsWithMatcher');\ngoog.provide('goog.labs.testing.EqualToIgnoringWhitespaceMatcher');\ngoog.provide('goog.labs.testing.EqualsMatcher');\ngoog.provide('goog.labs.testing.RegexMatcher');\ngoog.provide('goog.labs.testing.StartsWithMatcher');\ngoog.provide('goog.labs.testing.StringContainsInOrderMatcher');\n\ngoog.require('goog.asserts');\ngoog.require('goog.labs.testing.Matcher');\ngoog.require('goog.string');\n\n\n\n/**\n * Matches any string value.\n *\n * @constructor @struct @implements {goog.labs.testing.Matcher} @final\n */\ngoog.labs.testing.AnyStringMatcher = function() {};\n\n\n/** @override */\ngoog.labs.testing.AnyStringMatcher.prototype.matches = function(actualValue) {\n  return typeof actualValue === 'string';\n};\n\n\n/** @override */\ngoog.labs.testing.AnyStringMatcher.prototype.describe = function(actualValue) {\n  return '<' + actualValue + '> is not a string';\n};\n\n\n\n/**\n * The ContainsString matcher.\n *\n * @param {string} value The expected string.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.ContainsStringMatcher = function(value) {\n  /**\n   * @type {string}\n   * @private\n   */\n  this.value_ = value;\n};\n\n\n/**\n * Determines if input string contains the expected string.\n *\n * @override\n */\ngoog.labs.testing.ContainsStringMatcher.prototype.matches = function(\n    actualValue) {\n  goog.asserts.assertString(actualValue);\n  return goog.string.contains(actualValue, this.value_);\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.ContainsStringMatcher.prototype.describe = function(\n    actualValue) {\n  return actualValue + ' does not contain ' + this.value_;\n};\n\n\n\n/**\n * The EndsWith matcher.\n *\n * @param {string} value The expected string.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.EndsWithMatcher = function(value) {\n  /**\n   * @type {string}\n   * @private\n   */\n  this.value_ = value;\n};\n\n\n/**\n * Determines if input string ends with the expected string.\n *\n * @override\n */\ngoog.labs.testing.EndsWithMatcher.prototype.matches = function(actualValue) {\n  goog.asserts.assertString(actualValue);\n  return goog.string.endsWith(actualValue, this.value_);\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.EndsWithMatcher.prototype.describe = function(actualValue) {\n  return actualValue + ' does not end with ' + this.value_;\n};\n\n\n\n/**\n * The EqualToIgnoringWhitespace matcher.\n *\n * @param {string} value The expected string.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.EqualToIgnoringWhitespaceMatcher = function(value) {\n  /**\n   * @type {string}\n   * @private\n   */\n  this.value_ = value;\n};\n\n\n/**\n * Determines if input string contains the expected string.\n *\n * @override\n */\ngoog.labs.testing.EqualToIgnoringWhitespaceMatcher.prototype.matches = function(\n    actualValue) {\n  goog.asserts.assertString(actualValue);\n  var string1 = goog.string.collapseWhitespace(actualValue);\n\n  return goog.string.caseInsensitiveCompare(this.value_, string1) === 0;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.EqualToIgnoringWhitespaceMatcher.prototype.describe =\n    function(actualValue) {\n  return actualValue + ' is not equal(ignoring whitespace) to ' + this.value_;\n};\n\n\n\n/**\n * The Equals matcher.\n *\n * @param {string} value The expected string.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.EqualsMatcher = function(value) {\n  /**\n   * @type {string}\n   * @private\n   */\n  this.value_ = value;\n};\n\n\n/**\n * Determines if input string is equal to the expected string.\n *\n * @override\n */\ngoog.labs.testing.EqualsMatcher.prototype.matches = function(actualValue) {\n  goog.asserts.assertString(actualValue);\n  return this.value_ === actualValue;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.EqualsMatcher.prototype.describe = function(actualValue) {\n  return actualValue + ' is not equal to ' + this.value_;\n};\n\n\n\n/**\n * The MatchesRegex matcher.\n *\n * @param {!RegExp} regex The expected regex.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.RegexMatcher = function(regex) {\n  /**\n   * @type {!RegExp}\n   * @private\n   */\n  this.regex_ = regex;\n};\n\n\n/**\n * Determines if input string is equal to the expected string.\n *\n * @override\n */\ngoog.labs.testing.RegexMatcher.prototype.matches = function(actualValue) {\n  goog.asserts.assertString(actualValue);\n  return this.regex_.test(actualValue);\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.RegexMatcher.prototype.describe = function(actualValue) {\n  return actualValue + ' does not match ' + this.regex_;\n};\n\n\n\n/**\n * The StartsWith matcher.\n *\n * @param {string} value The expected string.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.StartsWithMatcher = function(value) {\n  /**\n   * @type {string}\n   * @private\n   */\n  this.value_ = value;\n};\n\n\n/**\n * Determines if input string starts with the expected string.\n *\n * @override\n */\ngoog.labs.testing.StartsWithMatcher.prototype.matches = function(actualValue) {\n  goog.asserts.assertString(actualValue);\n  return goog.string.startsWith(actualValue, this.value_);\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.StartsWithMatcher.prototype.describe = function(actualValue) {\n  return actualValue + ' does not start with ' + this.value_;\n};\n\n\n\n/**\n * The StringContainsInOrdermatcher.\n *\n * @param {Array<string>} values The expected string values.\n *\n * @constructor\n * @struct\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.StringContainsInOrderMatcher = function(values) {\n  /**\n   * @type {Array<string>}\n   * @private\n   */\n  this.values_ = values;\n};\n\n\n/**\n * Determines if input string contains, in order, the expected array of strings.\n * @override\n * @suppress {strictPrimitiveOperators} Part of the go/strict_warnings_migration\n */\ngoog.labs.testing.StringContainsInOrderMatcher.prototype.matches = function(\n    actualValue) {\n  goog.asserts.assertString(actualValue);\n  var currentIndex, previousIndex = 0;\n  for (var i = 0; i < this.values_.length; i++) {\n    currentIndex = goog.string.contains(actualValue, this.values_[i]);\n    if (currentIndex < 0 || currentIndex < previousIndex) {\n      return false;\n    }\n    previousIndex = currentIndex;\n  }\n  return true;\n};\n\n\n/**\n * @override\n */\ngoog.labs.testing.StringContainsInOrderMatcher.prototype.describe = function(\n    actualValue) {\n  return actualValue + ' does not contain the expected values in order.';\n};\n\n\n/** @return {!goog.labs.testing.AnyStringMatcher} */\nvar anyString = goog.labs.testing.AnyStringMatcher.anyString = function() {\n  return new goog.labs.testing.AnyStringMatcher();\n};\n\n\n/**\n * Matches a string containing the given string.\n *\n * @param {string} value The expected value.\n *\n * @return {!goog.labs.testing.ContainsStringMatcher} A\n *     ContainsStringMatcher.\n */\nvar containsString =\n    goog.labs.testing.ContainsStringMatcher.containsString = function(value) {\n      return new goog.labs.testing.ContainsStringMatcher(value);\n    };\n\n\n/**\n * Matches a string that ends with the given string.\n *\n * @param {string} value The expected value.\n *\n * @return {!goog.labs.testing.EndsWithMatcher} A\n *     EndsWithMatcher.\n */\nvar endsWith = goog.labs.testing.EndsWithMatcher.endsWith = function(value) {\n  return new goog.labs.testing.EndsWithMatcher(value);\n};\n\n\n/**\n * Matches a string that equals (ignoring whitespace) the given string.\n *\n * @param {string} value The expected value.\n *\n * @return {!goog.labs.testing.EqualToIgnoringWhitespaceMatcher} A\n *     EqualToIgnoringWhitespaceMatcher.\n */\nvar equalToIgnoringWhitespace =\n    goog.labs.testing.EqualToIgnoringWhitespaceMatcher\n        .equalToIgnoringWhitespace = function(value) {\n      return new goog.labs.testing.EqualToIgnoringWhitespaceMatcher(value);\n    };\n\n\n/**\n * Matches a string that equals the given string.\n *\n * @param {string} value The expected value.\n *\n * @return {!goog.labs.testing.EqualsMatcher} A EqualsMatcher.\n */\nvar equals = goog.labs.testing.EqualsMatcher.equals = function(value) {\n  return new goog.labs.testing.EqualsMatcher(value);\n};\n\n\n/**\n * Matches a string against a regular expression.\n *\n * @param {!RegExp} regex The expected regex.\n *\n * @return {!goog.labs.testing.RegexMatcher} A RegexMatcher.\n */\nvar matchesRegex =\n    goog.labs.testing.RegexMatcher.matchesRegex = function(regex) {\n      return new goog.labs.testing.RegexMatcher(regex);\n    };\n\n\n/**\n * Matches a string that starts with the given string.\n *\n * @param {string} value The expected value.\n *\n * @return {!goog.labs.testing.StartsWithMatcher} A\n *     StartsWithMatcher.\n */\nvar startsWith =\n    goog.labs.testing.StartsWithMatcher.startsWith = function(value) {\n      return new goog.labs.testing.StartsWithMatcher(value);\n    };\n\n\n/**\n * Matches a string that contains the given strings in order.\n *\n * @param {Array<string>} values The expected value.\n *\n * @return {!goog.labs.testing.StringContainsInOrderMatcher} A\n *     StringContainsInOrderMatcher.\n */\nvar stringContainsInOrder =\n    goog.labs.testing.StringContainsInOrderMatcher.stringContainsInOrder =\n        function(values) {\n      return new goog.labs.testing.StringContainsInOrderMatcher(values);\n    };\n","^?",1579837703000,"^@",["^A",["^1J","^16","~$goog.labs.testing.Matcher","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/testing/stringmatcher.js"],"^S",["^A",["~$goog.labs.testing.EqualsMatcher","~$goog.labs.testing.AnyStringMatcher","~$goog.labs.testing.RegexMatcher","~$goog.labs.testing.StringContainsInOrderMatcher","~$goog.labs.testing.ContainsStringMatcher","~$goog.labs.testing.EndsWithMatcher","~$goog.labs.testing.StartsWithMatcher","~$goog.labs.testing.EqualToIgnoringWhitespaceMatcher"]],"^1",true,"^2",["^3","^1J","^V8","^16"]],["^ ","^7",[1579837703000],"^8","goog.editor.plugins.spacestabhandler.js","^9",["^:","goog/editor/plugins/spacestabhandler.js"],"^;","goog/editor/plugins/spacestabhandler.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Editor plugin to handle tab keys not in lists to add 4 spaces.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.editor.plugins.SpacesTabHandler');\n\ngoog.require('goog.dom.TagName');\ngoog.require('goog.editor.plugins.AbstractTabHandler');\ngoog.require('goog.editor.range');\n\n\n\n/**\n * Plugin to handle tab keys when not in lists to add 4 spaces.\n * @constructor\n * @extends {goog.editor.plugins.AbstractTabHandler}\n * @final\n */\ngoog.editor.plugins.SpacesTabHandler = function() {\n  goog.editor.plugins.AbstractTabHandler.call(this);\n};\ngoog.inherits(\n    goog.editor.plugins.SpacesTabHandler,\n    goog.editor.plugins.AbstractTabHandler);\n\n\n/** @override */\ngoog.editor.plugins.SpacesTabHandler.prototype.getTrogClassId = function() {\n  return 'SpacesTabHandler';\n};\n\n\n/** @override */\ngoog.editor.plugins.SpacesTabHandler.prototype.handleTabKey = function(e) {\n  var dh = this.getFieldDomHelper();\n  var range = this.getFieldObject().getRange();\n  if (!goog.editor.range.intersectsTag(range, goog.dom.TagName.LI)) {\n    // In the shift + tab case we don't want to insert spaces, but we don't\n    // want focus to move either so skip the spacing logic and just prevent\n    // default.\n    if (!e.shiftKey) {\n      // Not in a list but we want to insert 4 spaces.\n\n      // Stop change events while we make multiple field changes.\n      this.getFieldObject().stopChangeEvents(true, true);\n\n      // Inserting nodes below completely messes up the selection, doing the\n      // deletion here before it's messed up. Only delete if text is selected,\n      // otherwise we would remove the character to the right of the cursor.\n      if (!range.isCollapsed()) {\n        dh.getDocument().execCommand('delete', false, null);\n        // Safari 3 has some DOM exceptions if we don't reget the range here,\n        // doing it all the time just to be safe.\n        range = this.getFieldObject().getRange();\n      }\n\n      // Emulate tab by removing selection and inserting 4 spaces\n      // Two breaking spaces in a row can be collapsed by the browser into one\n      // space. Inserting the string below because it is guaranteed to never\n      // collapse to less than four spaces, regardless of what is adjacent to\n      // the inserted spaces. This might make line wrapping slightly\n      // sub-optimal around a grouping of non-breaking spaces.\n      var elem =\n          dh.createDom(goog.dom.TagName.SPAN, null, '\\u00a0\\u00a0 \\u00a0');\n      elem = range.insertNode(elem, false);\n\n      this.getFieldObject().dispatchChange();\n      goog.editor.range.placeCursorNextTo(elem, false);\n      this.getFieldObject().dispatchSelectionChangeEvent();\n    }\n\n    e.preventDefault();\n    return true;\n  }\n\n  return false;\n};\n","^?",1579837703000,"^@",["^A",["~$goog.editor.plugins.AbstractTabHandler","^TA","^3","^4"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/spacestabhandler.js"],"^S",["^A",["~$goog.editor.plugins.SpacesTabHandler"]],"^1",true,"^2",["^3","^4","^VA","^TA"]],["^ ","^7",[1579837703000],"^8","goog.i18n.datetimeparse.js","^9",["^:","goog/i18n/datetimeparse.js"],"^;","goog/i18n/datetimeparse.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Date/Time parsing library with locale support.\n */\n\n\n/**\n * Namespace for locale date/time parsing functions\n */\ngoog.provide('goog.i18n.DateTimeParse');\n\ngoog.require('goog.asserts');\ngoog.require('goog.date');\ngoog.require('goog.i18n.DateTimeFormat');\ngoog.require('goog.i18n.DateTimeSymbols');\n\n\n/**\n * DateTimeParse is for parsing date in a locale-sensitive manner. It allows\n * user to use any customized patterns to parse date-time string under certain\n * locale. Things varies across locales like month name, weekname, field\n * order, etc.\n *\n * This module is the counter-part of DateTimeFormat. They use the same\n * date/time pattern specification, which is borrowed from ICU/JDK.\n *\n * This implementation could parse partial date/time.\n *\n * Time Format Syntax: To specify the time format use a time pattern string.\n * In this pattern, following letters are reserved as pattern letters, which\n * are defined as the following:\n *\n * <pre>\n * Symbol   Meaning                 Presentation        Example\n * ------   -------                 ------------        -------\n * G        era designator          (Text)              AD\n * y#       year                    (Number)            1996\n * M        month in year           (Text & Number)     July & 07\n * d        day in month            (Number)            10\n * h        hour in am/pm (1~12)    (Number)            12\n * H        hour in day (0~23)      (Number)            0\n * m        minute in hour          (Number)            30\n * s        second in minute        (Number)            55\n * S        fractional second       (Number)            978\n * E        day of week             (Text)              Tuesday\n * D        day in year             (Number)            189\n * a        am/pm marker            (Text)              PM\n * k        hour in day (1~24)      (Number)            24\n * K        hour in am/pm (0~11)    (Number)            0\n * z        time zone               (Text)              Pacific Standard Time\n * Z        time zone (RFC 822)     (Number)            -0800\n * v        time zone (generic)     (Text)              Pacific Time\n * '        escape for text         (Delimiter)         'Date='\n * ''       single quote            (Literal)           'o''clock'\n * </pre>\n *\n * The count of pattern letters determine the format. <p>\n * (Text): 4 or more pattern letters--use full form,\n *         less than 4--use short or abbreviated form if one exists.\n *         In parsing, we will always try long format, then short. <p>\n * (Number): the minimum number of digits. <p>\n * (Text & Number): 3 or over, use text, otherwise use number. <p>\n * Any characters that not in the pattern will be treated as quoted text. For\n * instance, characters like ':', '.', ' ', '#' and '@' will appear in the\n * resulting time text even they are not embraced within single quotes. In our\n * current pattern usage, we didn't use up all letters. But those unused\n * letters are strongly discouraged to be used as quoted text without quote.\n * That's because we may use other letter for pattern in future. <p>\n *\n * Examples Using the US Locale:\n *\n * Format Pattern                         Result\n * --------------                         -------\n * \"yyyy.MM.dd G 'at' HH:mm:ss vvvv\" ->>  1996.07.10 AD at 15:08:56 Pacific Time\n * \"EEE, MMM d, ''yy\"                ->>  Wed, July 10, '96\n * \"h:mm a\"                          ->>  12:08 PM\n * \"hh 'o''clock' a, zzzz\"           ->>  12 o'clock PM, Pacific Daylight Time\n * \"K:mm a, vvv\"                     ->>  0:00 PM, PT\n * \"yyyyy.MMMMM.dd GGG hh:mm aaa\"    ->>  01996.July.10 AD 12:08 PM\n *\n * <p> When parsing a date string using the abbreviated year pattern (\"yy\"),\n * DateTimeParse must interpret the abbreviated year relative to some\n * century. It does this by adjusting dates to be within 80 years before and 20\n * years after the time the parse function is called. For example, using a\n * pattern of \"MM/dd/yy\" and a DateTimeParse instance created on Jan 1, 1997,\n * the string \"01/11/12\" would be interpreted as Jan 11, 2012 while the string\n * \"05/04/64\" would be interpreted as May 4, 1964. During parsing, only\n * strings consisting of exactly two digits, as defined by {@link\n * java.lang.Character#isDigit(char)}, will be parsed into the default\n * century. Any other numeric string, such as a one digit string, a three or\n * more digit string will be interpreted as its face value.\n *\n * <p> If the year pattern does not have exactly two 'y' characters, the year is\n * interpreted literally, regardless of the number of digits. So using the\n * pattern \"MM/dd/yyyy\", \"01/11/12\" parses to Jan 11, 12 A.D.\n *\n * <p> When numeric fields abut one another directly, with no intervening\n * delimiter characters, they constitute a run of abutting numeric fields. Such\n * runs are parsed specially. For example, the format \"HHmmss\" parses the input\n * text \"123456\" to 12:34:56, parses the input text \"12345\" to 1:23:45, and\n * fails to parse \"1234\". In other words, the leftmost field of the run is\n * flexible, while the others keep a fixed width. If the parse fails anywhere in\n * the run, then the leftmost field is shortened by one character, and the\n * entire run is parsed again. This is repeated until either the parse succeeds\n * or the leftmost field is one character in length. If the parse still fails at\n * that point, the parse of the run fails.\n *\n * <p> Now timezone parsing only support GMT:hhmm, GMT:+hhmm, GMT:-hhmm\n */\n\n\n\n/**\n * Construct a DateTimeParse based on current locale.\n * @param {string|number} pattern pattern specification or pattern type.\n * @param {!Object=} opt_dateTimeSymbols Optional symbols to use for this\n *     instance rather than the global symbols.\n * @constructor\n * @final\n */\ngoog.i18n.DateTimeParse = function(pattern, opt_dateTimeSymbols) {\n  goog.asserts.assert(\n      opt_dateTimeSymbols !== undefined ||\n          goog.i18n.DateTimeSymbols !== undefined,\n      'goog.i18n.DateTimeSymbols or explicit symbols must be defined');\n\n  this.patternParts_ = [];\n\n  /**\n   * Data structure with all the locale info needed for date formatting.\n   * (day/month names, most common patterns, rules for week-end, etc.)\n   * @const @private {!goog.i18n.DateTimeSymbolsType}\n   */\n  this.dateTimeSymbols_ = /** @type {!goog.i18n.DateTimeSymbolsType} */ (\n      opt_dateTimeSymbols || goog.i18n.DateTimeSymbols);\n  if (typeof pattern == 'number') {\n    this.applyStandardPattern_(pattern);\n  } else {\n    this.applyPattern_(pattern);\n  }\n};\n\n\n/**\n * Number of years prior to now that the century used to\n * disambiguate two digit years will begin\n *\n * @type {number}\n */\ngoog.i18n.DateTimeParse.ambiguousYearCenturyStart = 80;\n\n\n/**\n * Apply a pattern to this Parser. The pattern string will be parsed and saved\n * in \"compiled\" form.\n * Note: this method is somewhat similar to the pattern parsing method in\n *       datetimeformat. If you see something wrong here, you might want\n *       to check the other.\n * @param {string} pattern It describes the format of date string that need to\n *     be parsed.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.applyPattern_ = function(pattern) {\n  var inQuote = false;\n  var buf = '';\n\n  for (var i = 0; i < pattern.length; i++) {\n    var ch = pattern.charAt(i);\n\n    // handle space, add literal part (if exist), and add space part\n    if (ch == ' ') {\n      if (buf.length > 0) {\n        this.patternParts_.push({text: buf, count: 0, abutStart: false});\n        buf = '';\n      }\n      this.patternParts_.push({text: ' ', count: 0, abutStart: false});\n      while (i < pattern.length - 1 && pattern.charAt(i + 1) == ' ') {\n        i++;\n      }\n    } else if (inQuote) {\n      // inside quote, except '', just copy or exit\n      if (ch == '\\'') {\n        if (i + 1 < pattern.length && pattern.charAt(i + 1) == '\\'') {\n          // quote appeared twice continuously, interpret as one quote.\n          buf += '\\'';\n          i++;\n        } else {\n          // exit quote\n          inQuote = false;\n        }\n      } else {\n        // literal\n        buf += ch;\n      }\n    } else if (goog.i18n.DateTimeParse.PATTERN_CHARS_.indexOf(ch) >= 0) {\n      // outside quote, it is a pattern char\n      if (buf.length > 0) {\n        this.patternParts_.push({text: buf, count: 0, abutStart: false});\n        buf = '';\n      }\n      var count = this.getNextCharCount_(pattern, i);\n      this.patternParts_.push({text: ch, count: count, abutStart: false});\n      i += count - 1;\n    } else if (ch == '\\'') {\n      // Two consecutive quotes is a quote literal, inside or outside of quotes.\n      if (i + 1 < pattern.length && pattern.charAt(i + 1) == '\\'') {\n        buf += '\\'';\n        i++;\n      } else {\n        inQuote = true;\n      }\n    } else {\n      buf += ch;\n    }\n  }\n\n  if (buf.length > 0) {\n    this.patternParts_.push({text: buf, count: 0, abutStart: false});\n  }\n\n  this.markAbutStart_();\n};\n\n\n/**\n * Apply a predefined pattern to this Parser.\n * @param {number} formatType A constant used to identified the predefined\n *     pattern string stored in locale repository.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.applyStandardPattern_ = function(formatType) {\n  var pattern;\n  // formatType constants are in consecutive numbers. So it can be used to\n  // index array in following way.\n\n  // if type is out of range, default to medium date/time format.\n  if (formatType > goog.i18n.DateTimeFormat.Format.SHORT_DATETIME) {\n    formatType = goog.i18n.DateTimeFormat.Format.MEDIUM_DATETIME;\n  }\n\n  if (formatType < 4) {\n    pattern = this.dateTimeSymbols_.DATEFORMATS[formatType];\n  } else if (formatType < 8) {\n    pattern = this.dateTimeSymbols_.TIMEFORMATS[formatType - 4];\n  } else {\n    pattern = this.dateTimeSymbols_.DATETIMEFORMATS[formatType - 8];\n    pattern = pattern.replace(\n        '{1}', this.dateTimeSymbols_.DATEFORMATS[formatType - 8]);\n    pattern = pattern.replace(\n        '{0}', this.dateTimeSymbols_.TIMEFORMATS[formatType - 8]);\n  }\n  this.applyPattern_(pattern);\n};\n\n\n/**\n * Parse the given string and fill info into date object. This version does\n * not validate the input.\n * @param {string} text The string being parsed.\n * @param {goog.date.DateLike} date The Date object to hold the parsed date.\n * @param {number=} opt_start The position from where parse should begin.\n * @return {number} How many characters parser advanced.\n */\ngoog.i18n.DateTimeParse.prototype.parse = function(text, date, opt_start) {\n  var start = opt_start || 0;\n  return this.internalParse_(text, date, start, false /*validation*/);\n};\n\n\n/**\n * Parse the given string and fill info into date object. This version will\n * validate the input and make sure it is a valid date/time.\n * @param {string} text The string being parsed.\n * @param {goog.date.DateLike} date The Date object to hold the parsed date.\n * @param {number=} opt_start The position from where parse should begin.\n * @return {number} How many characters parser advanced.\n */\ngoog.i18n.DateTimeParse.prototype.strictParse = function(\n    text, date, opt_start) {\n  var start = opt_start || 0;\n  return this.internalParse_(text, date, start, true /*validation*/);\n};\n\n\n/**\n * Parse the given string and fill info into date object.\n * @param {string} text The string being parsed.\n * @param {goog.date.DateLike} date The Date object to hold the parsed date.\n * @param {number} start The position from where parse should begin.\n * @param {boolean} validation If true, input string need to be a valid\n *     date/time string.\n * @return {number} How many characters parser advanced.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.internalParse_ = function(\n    text, date, start, validation) {\n  var cal = new goog.i18n.DateTimeParse.MyDate_();\n  var parsePos = [start];\n\n  // For parsing abutting numeric fields. 'abutPat' is the\n  // offset into 'pattern' of the first of 2 or more abutting\n  // numeric fields. 'abutStart' is the offset into 'text'\n  // where parsing the fields begins. 'abutPass' starts off as 0\n  // and increments each time we try to parse the fields.\n  var abutPat = -1;  // If >=0, we are in a run of abutting numeric fields\n  var abutStart = 0;\n  var abutPass = 0;\n\n  for (var i = 0; i < this.patternParts_.length; i++) {\n    if (this.patternParts_[i].count > 0) {\n      if (abutPat < 0 && this.patternParts_[i].abutStart) {\n        abutPat = i;\n        abutStart = start;\n        abutPass = 0;\n      }\n\n      // Handle fields within a run of abutting numeric fields. Take\n      // the pattern \"HHmmss\" as an example. We will try to parse\n      // 2/2/2 characters of the input text, then if that fails,\n      // 1/2/2. We only adjust the width of the leftmost field; the\n      // others remain fixed. This allows \"123456\" => 12:34:56, but\n      // \"12345\" => 1:23:45. Likewise, for the pattern \"yyyyMMdd\" we\n      // try 4/2/2, 3/2/2, 2/2/2, and finally 1/2/2.\n      if (abutPat >= 0) {\n        // If we are at the start of a run of abutting fields, then\n        // shorten this field in each pass. If we can't shorten\n        // this field any more, then the parse of this set of\n        // abutting numeric fields has failed.\n        var count = this.patternParts_[i].count;\n        if (i == abutPat) {\n          count -= abutPass;\n          abutPass++;\n          if (count == 0) {\n            // tried all possible width, fail now\n            return 0;\n          }\n        }\n\n        if (!this.subParse_(\n                text, parsePos, this.patternParts_[i], count, cal)) {\n          // If the parse fails anywhere in the run, back up to the\n          // start of the run and retry.\n          i = abutPat - 1;\n          parsePos[0] = abutStart;\n          continue;\n        }\n      }\n\n      // Handle non-numeric fields and non-abutting numeric fields.\n      else {\n        abutPat = -1;\n        if (!this.subParse_(text, parsePos, this.patternParts_[i], 0, cal)) {\n          return 0;\n        }\n      }\n    } else {\n      // Handle literal pattern characters. These are any\n      // quoted characters and non-alphabetic unquoted\n      // characters.\n      abutPat = -1;\n      // A run of white space in the pattern matches a run\n      // of white space in the input text.\n      if (this.patternParts_[i].text.charAt(0) == ' ') {\n        // Advance over run in input text\n        var s = parsePos[0];\n        this.skipSpace_(text, parsePos);\n\n        // Must see at least one white space char in input\n        if (parsePos[0] > s) {\n          continue;\n        }\n      } else if (\n          text.indexOf(this.patternParts_[i].text, parsePos[0]) ==\n          parsePos[0]) {\n        parsePos[0] += this.patternParts_[i].text.length;\n        continue;\n      }\n      // We fall through to this point if the match fails\n      return 0;\n    }\n  }\n\n  // return progress\n  return cal.calcDate_(date, validation) ? parsePos[0] - start : 0;\n};\n\n\n/**\n * Calculate character repeat count in pattern.\n *\n * @param {string} pattern It describes the format of date string that need to\n *     be parsed.\n * @param {number} start The position of pattern character.\n *\n * @return {number} Repeat count.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.getNextCharCount_ = function(pattern, start) {\n  var ch = pattern.charAt(start);\n  var next = start + 1;\n  while (next < pattern.length && pattern.charAt(next) == ch) {\n    next++;\n  }\n  return next - start;\n};\n\n\n/**\n * All acceptable pattern characters.\n * @private\n */\ngoog.i18n.DateTimeParse.PATTERN_CHARS_ = 'GyMdkHmsSEDahKzZvQL';\n\n\n/**\n * Pattern characters that specify numerical field.\n * @private\n */\ngoog.i18n.DateTimeParse.NUMERIC_FORMAT_CHARS_ = 'MydhHmsSDkK';\n\n\n/**\n * Check if the pattern part is a numeric field.\n *\n * @param {Object} part pattern part to be examined.\n *\n * @return {boolean} true if the pattern part is numeric field.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.isNumericField_ = function(part) {\n  if (part.count <= 0) {\n    return false;\n  }\n  var i = goog.i18n.DateTimeParse.NUMERIC_FORMAT_CHARS_.indexOf(\n      part.text.charAt(0));\n  return i > 0 || i == 0 && part.count < 3;\n};\n\n\n/**\n * Identify the start of an abutting numeric fields' run. Taking pattern\n * \"HHmmss\" as an example. It will try to parse 2/2/2 characters of the input\n * text, then if that fails, 1/2/2. We only adjust the width of the leftmost\n * field; the others remain fixed. This allows \"123456\" => 12:34:56, but\n * \"12345\" => 1:23:45. Likewise, for the pattern \"yyyyMMdd\" we try 4/2/2,\n * 3/2/2, 2/2/2, and finally 1/2/2. The first field of connected numeric\n * fields will be marked as abutStart, its width can be reduced to accommodate\n * others.\n *\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.markAbutStart_ = function() {\n  // abut parts are continuous numeric parts. abutStart is the switch\n  // point from non-abut to abut\n  var abut = false;\n\n  for (var i = 0; i < this.patternParts_.length; i++) {\n    if (this.isNumericField_(this.patternParts_[i])) {\n      // if next part is not following abut sequence, and isNumericField_\n      if (!abut && i + 1 < this.patternParts_.length &&\n          this.isNumericField_(this.patternParts_[i + 1])) {\n        abut = true;\n        this.patternParts_[i].abutStart = true;\n      }\n    } else {\n      abut = false;\n    }\n  }\n};\n\n\n/**\n * Skip space in the string.\n *\n * @param {string} text input string.\n * @param {Array<number>} pos where skip start, and return back where the skip\n *     stops.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.skipSpace_ = function(text, pos) {\n  var m = text.substring(pos[0]).match(/^\\s+/);\n  if (m) {\n    pos[0] += m[0].length;\n  }\n};\n\n\n/**\n * Protected method that converts one field of the input string into a\n * numeric field value.\n *\n * @param {string} text the time text to be parsed.\n * @param {Array<number>} pos Parse position.\n * @param {Object} part the pattern part for this field.\n * @param {number} digitCount when > 0, numeric parsing must obey the count.\n * @param {goog.i18n.DateTimeParse.MyDate_} cal object that holds parsed value.\n *\n * @return {boolean} True if it parses successfully.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.subParse_ = function(\n    text, pos, part, digitCount, cal) {\n  this.skipSpace_(text, pos);\n\n  var start = pos[0];\n  var ch = part.text.charAt(0);\n\n  // parse integer value if it is a numeric field\n  var value = -1;\n  if (this.isNumericField_(part)) {\n    if (digitCount > 0) {\n      if ((start + digitCount) > text.length) {\n        return false;\n      }\n      value = this.parseInt_(text.substring(0, start + digitCount), pos);\n    } else {\n      value = this.parseInt_(text, pos);\n    }\n  }\n\n  switch (ch) {\n    case 'G':  // ERA\n      value = this.matchString_(text, pos, this.dateTimeSymbols_.ERAS);\n      if (value >= 0) {\n        cal.era = value;\n      }\n      return true;\n    case 'M':  // MONTH\n    case 'L':  // STANDALONEMONTH\n      return this.subParseMonth_(text, pos, cal, value);\n    case 'E':\n      return this.subParseDayOfWeek_(text, pos, cal);\n    case 'a':  // AM_PM\n      value = this.matchString_(text, pos, this.dateTimeSymbols_.AMPMS);\n      if (value >= 0) {\n        cal.ampm = value;\n      }\n      return true;\n    case 'y':  // YEAR\n      return this.subParseYear_(text, pos, start, value, part, cal);\n    case 'Q':  // QUARTER\n      return this.subParseQuarter_(text, pos, cal, value);\n    case 'd':  // DATE\n      if (value >= 0) {\n        cal.day = value;\n      }\n      return true;\n    case 'S':  // FRACTIONAL_SECOND\n      return this.subParseFractionalSeconds_(value, pos, start, cal);\n    case 'h':  // HOUR (1..12)\n      if (value == 12) {\n        value = 0;\n      }\n    case 'K':  // HOUR (0..11)\n    case 'H':  // HOUR_OF_DAY (0..23)\n    case 'k':  // HOUR_OF_DAY (1..24)\n      if (value >= 0) {\n        cal.hours = value;\n      }\n      return true;\n    case 'm':  // MINUTE\n      if (value >= 0) {\n        cal.minutes = value;\n      }\n      return true;\n    case 's':  // SECOND\n      if (value >= 0) {\n        cal.seconds = value;\n      }\n      return true;\n\n    case 'z':  // ZONE_OFFSET\n    case 'Z':  // TIMEZONE_RFC\n    case 'v':  // TIMEZONE_GENERIC\n      return this.subparseTimeZoneInGMT_(text, pos, cal);\n    default:\n      return false;\n  }\n};\n\n\n/**\n * Parse year field. Year field is special because\n * 1) two digit year need to be resolved.\n * 2) we allow year to take a sign.\n * 3) year field participate in abut processing.\n *\n * @param {string} text the time text to be parsed.\n * @param {Array<number>} pos Parse position.\n * @param {number} start where this field start.\n * @param {number} value integer value of year.\n * @param {Object} part the pattern part for this field.\n * @param {goog.i18n.DateTimeParse.MyDate_} cal object to hold parsed value.\n *\n * @return {boolean} True if successful.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.subParseYear_ = function(\n    text, pos, start, value, part, cal) {\n  var ch;\n  if (value < 0) {\n    // possible sign\n    ch = text.charAt(pos[0]);\n    if (ch != '+' && ch != '-') {\n      return false;\n    }\n    pos[0]++;\n    value = this.parseInt_(text, pos);\n    if (value < 0) {\n      return false;\n    }\n    if (ch == '-') {\n      value = -value;\n    }\n  }\n\n  // only if 2 digit was actually parsed, and pattern say it has 2 digit.\n  if (!ch && pos[0] - start == 2 && part.count == 2) {\n    cal.setTwoDigitYear_(value);\n  } else {\n    cal.year = value;\n  }\n  return true;\n};\n\n\n/**\n * Parse Month field.\n *\n * @param {string} text the time text to be parsed.\n * @param {Array<number>} pos Parse position.\n * @param {goog.i18n.DateTimeParse.MyDate_} cal object to hold parsed value.\n * @param {number} value numeric value if this field is expressed using\n *      numeric pattern, or -1 if not.\n *\n * @return {boolean} True if parsing successful.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.subParseMonth_ = function(\n    text, pos, cal, value) {\n  // when month is symbols, i.e., MMM, MMMM, LLL or LLLL, value will be -1\n  if (value < 0) {\n    // Want to be able to parse both short and long forms.\n    // Try count == 4 first\n    var months = this.dateTimeSymbols_.MONTHS\n                     .concat(this.dateTimeSymbols_.STANDALONEMONTHS)\n                     .concat(this.dateTimeSymbols_.SHORTMONTHS)\n                     .concat(this.dateTimeSymbols_.STANDALONESHORTMONTHS);\n    value = this.matchString_(text, pos, months);\n    if (value < 0) {\n      return false;\n    }\n    // The months variable is multiple of 12, so we have to get the actual\n    // month index by modulo 12.\n    cal.month = (value % 12);\n    return true;\n  } else {\n    cal.month = value - 1;\n    return true;\n  }\n};\n\n\n/**\n * Parse Quarter field.\n *\n * @param {string} text the time text to be parsed.\n * @param {Array<number>} pos Parse position.\n * @param {goog.i18n.DateTimeParse.MyDate_} cal object to hold parsed value.\n * @param {number} value numeric value if this field is expressed using\n *      numeric pattern, or -1 if not.\n *\n * @return {boolean} True if parsing successful.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.subParseQuarter_ = function(\n    text, pos, cal, value) {\n  // value should be -1, since this is a non-numeric field.\n  if (value < 0) {\n    // Want to be able to parse both short and long forms.\n    // Try count == 4 first:\n    value = this.matchString_(text, pos, this.dateTimeSymbols_.QUARTERS);\n    if (value < 0) {  // count == 4 failed, now try count == 3\n      value = this.matchString_(text, pos, this.dateTimeSymbols_.SHORTQUARTERS);\n    }\n    if (value < 0) {\n      return false;\n    }\n    cal.month = value * 3;  // First month of quarter.\n    cal.day = 1;\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Parse Day of week field.\n * @param {string} text the time text to be parsed.\n * @param {Array<number>} pos Parse position.\n * @param {goog.i18n.DateTimeParse.MyDate_} cal object to hold parsed value.\n *\n * @return {boolean} True if successful.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.subParseDayOfWeek_ = function(\n    text, pos, cal) {\n  // Handle both short and long forms.\n  // Try count == 4 (DDDD) first:\n  var value = this.matchString_(text, pos, this.dateTimeSymbols_.WEEKDAYS);\n  if (value < 0) {\n    value = this.matchString_(text, pos, this.dateTimeSymbols_.SHORTWEEKDAYS);\n  }\n  if (value < 0) {\n    return false;\n  }\n  cal.dayOfWeek = value;\n  return true;\n};\n\n\n/**\n * Parse fractional seconds field.\n *\n * @param {number} value parsed numeric value.\n * @param {Array<number>} pos current parse position.\n * @param {number} start where this field start.\n * @param {goog.i18n.DateTimeParse.MyDate_} cal object to hold parsed value.\n *\n * @return {boolean} True if successful.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.subParseFractionalSeconds_ = function(\n    value, pos, start, cal) {\n  // Fractional seconds left-justify\n  var len = pos[0] - start;\n  cal.milliseconds = len < 3 ? value * Math.pow(10, 3 - len) :\n                               Math.round(value / Math.pow(10, len - 3));\n  return true;\n};\n\n\n/**\n * Parse GMT type timezone.\n *\n * @param {string} text the time text to be parsed.\n * @param {Array<number>} pos Parse position.\n * @param {goog.i18n.DateTimeParse.MyDate_} cal object to hold parsed value.\n *\n * @return {boolean} True if successful.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.subparseTimeZoneInGMT_ = function(\n    text, pos, cal) {\n  // First try to parse generic forms such as GMT-07:00. Do this first\n  // in case localized DateFormatZoneData contains the string \"GMT\"\n  // for a zone; in that case, we don't want to match the first three\n  // characters of GMT+/-HH:MM etc.\n\n  // For time zones that have no known names, look for strings\n  // of the form:\n  //    GMT[+-]hours:minutes or\n  //    GMT[+-]hhmm or\n  //    GMT.\n  if (text.indexOf('GMT', pos[0]) == pos[0]) {\n    pos[0] += 3;  // 3 is the length of GMT\n    return this.parseTimeZoneOffset_(text, pos, cal);\n  }\n\n  // TODO(user): check for named time zones by looking through the locale\n  // data from the DateFormatZoneData strings. Should parse both short and long\n  // forms.\n  // subParseZoneString(text, start, cal);\n\n  // As a last resort, look for numeric timezones of the form\n  // [+-]hhmm as specified by RFC 822.  This code is actually\n  // a little more permissive than RFC 822.  It will try to do\n  // its best with numbers that aren't strictly 4 digits long.\n  return this.parseTimeZoneOffset_(text, pos, cal);\n};\n\n\n/**\n * Parse time zone offset.\n *\n * @param {string} text the time text to be parsed.\n * @param {Array<number>} pos Parse position.\n * @param {goog.i18n.DateTimeParse.MyDate_} cal object to hold parsed value.\n *\n * @return {boolean} True if successful.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.parseTimeZoneOffset_ = function(\n    text, pos, cal) {\n  if (pos[0] >= text.length) {\n    cal.tzOffset = 0;\n    return true;\n  }\n\n  var sign = 1;\n  switch (text.charAt(pos[0])) {\n    case '-':\n      sign = -1;  // fall through\n    case '+':\n      pos[0]++;\n  }\n\n  // Look for hours:minutes or hhmm.\n  var st = pos[0];\n  var value = this.parseInt_(text, pos);\n  if (value < 0) {\n    return false;\n  }\n\n  var offset;\n  if (pos[0] < text.length && text.charAt(pos[0]) == ':') {\n    // This is the hours:minutes case\n    offset = value * 60;\n    pos[0]++;\n    value = this.parseInt_(text, pos);\n    if (value < 0) {\n      return false;\n    }\n    offset += value;\n  } else {\n    // This is the hhmm case.\n    offset = value;\n    // Assume \"-23\"..\"+23\" refers to hours.\n    if (offset < 24 && (pos[0] - st) <= 2) {\n      offset *= 60;\n    } else {\n      // todo: this looks questionable, should have more error checking\n      offset = offset % 100 + offset / 100 * 60;\n    }\n  }\n\n  offset *= sign;\n  cal.tzOffset = -offset;\n  return true;\n};\n\n\n/**\n * Parse an integer string and return integer value.\n *\n * @param {string} text string being parsed.\n * @param {Array<number>} pos parse position.\n *\n * @return {number} Converted integer value or -1 if the integer cannot be\n *     parsed.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.parseInt_ = function(text, pos) {\n  // Delocalizes the string containing native digits specified by the locale,\n  // replaces the native digits with ASCII digits. Leaves other characters.\n  // This is the reverse operation of localizeNumbers_ in datetimeformat.js.\n  if (this.dateTimeSymbols_.ZERODIGIT) {\n    var parts = [];\n    for (var i = pos[0]; i < text.length; i++) {\n      var c = text.charCodeAt(i) - this.dateTimeSymbols_.ZERODIGIT;\n      parts.push(\n          (0 <= c && c <= 9) ? String.fromCharCode(c + 0x30) : text.charAt(i));\n    }\n    text = parts.join('');\n  } else {\n    text = text.substring(pos[0]);\n  }\n\n  var m = text.match(/^\\d+/);\n  if (!m) {\n    return -1;\n  }\n  pos[0] += m[0].length;\n  return parseInt(m[0], 10);\n};\n\n\n/**\n * Attempt to match the text at a given position against an array of strings.\n * Since multiple strings in the array may match (for example, if the array\n * contains \"a\", \"ab\", and \"abc\", all will match the input string \"abcd\") the\n * longest match is returned.\n *\n * @param {string} text The string to match to.\n * @param {Array<number>} pos parsing position.\n * @param {Array<string>} data The string array of matching patterns.\n *\n * @return {number} the new start position if matching succeeded; a negative\n *     number indicating matching failure.\n * @private\n */\ngoog.i18n.DateTimeParse.prototype.matchString_ = function(text, pos, data) {\n  // There may be multiple strings in the data[] array which begin with\n  // the same prefix (e.g., Cerven and Cervenec (June and July) in Czech).\n  // We keep track of the longest match, and return that. Note that this\n  // unfortunately requires us to test all array elements.\n  var bestMatchLength = 0;\n  var bestMatch = -1;\n  var lower_text = text.substring(pos[0]).toLowerCase();\n  for (var i = 0; i < data.length; i++) {\n    var len = data[i].length;\n    // Always compare if we have no match yet; otherwise only compare\n    // against potentially better matches (longer strings).\n    if (len > bestMatchLength &&\n        lower_text.indexOf(data[i].toLowerCase()) == 0) {\n      bestMatch = i;\n      bestMatchLength = len;\n    }\n  }\n  if (bestMatch >= 0) {\n    pos[0] += bestMatchLength;\n  }\n  return bestMatch;\n};\n\n\n\n/**\n * This class hold the intermediate parsing result. After all fields are\n * consumed, final result will be resolved from this class.\n * @constructor\n * @private\n */\ngoog.i18n.DateTimeParse.MyDate_ = function() {};\n\n\n/**\n * The date's era.\n * @type {?number}\n */\ngoog.i18n.DateTimeParse.MyDate_.prototype.era;\n\n\n/**\n * The date's year.\n * @type {?number}\n */\ngoog.i18n.DateTimeParse.MyDate_.prototype.year;\n\n\n/**\n * The date's month.\n * @type {?number}\n */\ngoog.i18n.DateTimeParse.MyDate_.prototype.month;\n\n\n/**\n * The date's day of month.\n * @type {?number}\n */\ngoog.i18n.DateTimeParse.MyDate_.prototype.day;\n\n\n/**\n * The date's hour.\n * @type {?number}\n */\ngoog.i18n.DateTimeParse.MyDate_.prototype.hours;\n\n\n/**\n * The date's before/afternoon denominator.\n * @type {?number}\n */\ngoog.i18n.DateTimeParse.MyDate_.prototype.ampm;\n\n\n/**\n * The date's minutes.\n * @type {?number}\n */\ngoog.i18n.DateTimeParse.MyDate_.prototype.minutes;\n\n\n/**\n * The date's seconds.\n * @type {?number}\n */\ngoog.i18n.DateTimeParse.MyDate_.prototype.seconds;\n\n\n/**\n * The date's milliseconds.\n * @type {?number}\n */\ngoog.i18n.DateTimeParse.MyDate_.prototype.milliseconds;\n\n\n/**\n * The date's timezone offset.\n * @type {?number}\n */\ngoog.i18n.DateTimeParse.MyDate_.prototype.tzOffset;\n\n\n/**\n * The date's day of week. Sunday is 0, Saturday is 6.\n * @type {?number}\n */\ngoog.i18n.DateTimeParse.MyDate_.prototype.dayOfWeek;\n\n\n/**\n * 2 digit year special handling. Assuming for example that the\n * defaultCenturyStart is 6/18/1903. This means that two-digit years will be\n * forced into the range 6/18/1903 to 6/17/2003. As a result, years 00, 01, and\n * 02 correspond to 2000, 2001, and 2002. Years 04, 05, etc. correspond\n * to 1904, 1905, etc. If the year is 03, then it is 2003 if the\n * other fields specify a date before 6/18, or 1903 if they specify a\n * date afterwards. As a result, 03 is an ambiguous year. All other\n * two-digit years are unambiguous.\n *\n * @param {number} year 2 digit year value before adjustment.\n * @return {number} disambiguated year.\n * @private\n */\ngoog.i18n.DateTimeParse.MyDate_.prototype.setTwoDigitYear_ = function(year) {\n  var now = new Date();\n  var defaultCenturyStartYear =\n      now.getFullYear() - goog.i18n.DateTimeParse.ambiguousYearCenturyStart;\n  var ambiguousTwoDigitYear = defaultCenturyStartYear % 100;\n  this.ambiguousYear = (year == ambiguousTwoDigitYear);\n  year += Math.floor(defaultCenturyStartYear / 100) * 100 +\n      (year < ambiguousTwoDigitYear ? 100 : 0);\n  return this.year = year;\n};\n\n\n/**\n * Based on the fields set, fill a Date object. For those fields that not\n * set, use the passed in date object's value.\n *\n * @param {goog.date.DateLike} date Date object to be filled.\n * @param {boolean} validation If true, input string will be checked to make\n *     sure it is valid.\n *\n * @return {boolean} false if fields specify a invalid date.\n * @private\n */\ngoog.i18n.DateTimeParse.MyDate_.prototype.calcDate_ = function(\n    date, validation) {\n  // Throw exception if date if null.\n  if (date == null) {\n    throw new Error('Parameter \\'date\\' should not be null.');\n  }\n\n  // year 0 is 1 BC, and so on.\n  if (this.era != undefined && this.year != undefined && this.era == 0 &&\n      this.year > 0) {\n    this.year = -(this.year - 1);\n  }\n\n  if (this.year != undefined) {\n    date.setFullYear(this.year);\n  }\n\n  // The setMonth and setDate logic is a little tricky. We need to make sure\n  // day of month is smaller enough so that it won't cause a month switch when\n  // setting month. For example, if data in date is Nov 30, when month is set\n  // to Feb, because there is no Feb 30, JS adjust it to Mar 2. So Feb 12 will\n  // become  Mar 12.\n  var orgDate = date.getDate();\n\n  // Every month has a 1st day, this can actually be anything less than 29.\n  date.setDate(1);\n\n  if (this.month != undefined) {\n    date.setMonth(this.month);\n  }\n\n  if (this.day != undefined) {\n    date.setDate(this.day);\n  } else {\n    var maxDate =\n        goog.date.getNumberOfDaysInMonth(date.getFullYear(), date.getMonth());\n    date.setDate(orgDate > maxDate ? maxDate : orgDate);\n  }\n\n  if (goog.isFunction(date.setHours)) {\n    if (this.hours == undefined) {\n      this.hours = date.getHours();\n    }\n    // adjust ampm\n    if (this.ampm != undefined && this.ampm > 0 && this.hours < 12) {\n      this.hours += 12;\n    }\n    date.setHours(this.hours);\n  }\n\n  if (goog.isFunction(date.setMinutes) && this.minutes != undefined) {\n    date.setMinutes(this.minutes);\n  }\n\n  if (goog.isFunction(date.setSeconds) && this.seconds != undefined) {\n    date.setSeconds(this.seconds);\n  }\n\n  if (goog.isFunction(date.setMilliseconds) && this.milliseconds != undefined) {\n    date.setMilliseconds(this.milliseconds);\n  }\n\n  // If validation is needed, verify that the uncalculated date fields\n  // match the calculated date fields.  We do this before we set the\n  // timezone offset, which will skew all of the dates.\n  //\n  // Don't need to check the day of week as it is guaranteed to be\n  // correct or return false below.\n  if (validation &&\n      (this.year != undefined && this.year != date.getFullYear() ||\n       this.month != undefined && this.month != date.getMonth() ||\n       this.day != undefined && this.day != date.getDate() ||\n       this.hours >= 24 || this.minutes >= 60 || this.seconds >= 60 ||\n       this.milliseconds >= 1000)) {\n    return false;\n  }\n\n  // adjust time zone\n  if (this.tzOffset != undefined) {\n    var offset = date.getTimezoneOffset();\n    date.setTime(date.getTime() + (this.tzOffset - offset) * 60 * 1000);\n  }\n\n  // resolve ambiguous year if needed\n  if (this.ambiguousYear) {  // the two-digit year == the default start year\n    var defaultCenturyStart = new Date();\n    defaultCenturyStart.setFullYear(\n        defaultCenturyStart.getFullYear() -\n        goog.i18n.DateTimeParse.ambiguousYearCenturyStart);\n    if (date.getTime() < defaultCenturyStart.getTime()) {\n      date.setFullYear(defaultCenturyStart.getFullYear() + 100);\n    }\n  }\n\n  // dayOfWeek, validation only\n  if (this.dayOfWeek != undefined) {\n    if (this.day == undefined) {\n      // adjust to the nearest day of the week\n      var adjustment = (7 + this.dayOfWeek - date.getDay()) % 7;\n      if (adjustment > 3) {\n        adjustment -= 7;\n      }\n      var orgMonth = date.getMonth();\n      date.setDate(date.getDate() + adjustment);\n\n      // don't let it switch month\n      if (date.getMonth() != orgMonth) {\n        date.setDate(date.getDate() + (adjustment > 0 ? -7 : 7));\n      }\n    } else if (this.dayOfWeek != date.getDay()) {\n      return false;\n    }\n  }\n  return true;\n};\n","^?",1579837703000,"^@",["^A",["^1J","~$goog.i18n.DateTimeFormat","^3","^UV","^V0"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/datetimeparse.js"],"^S",["^A",["~$goog.i18n.DateTimeParse"]],"^1",true,"^2",["^3","^1J","^V0","^VC","^UV"]],["^ ","^7",[1579837703000],"^8","goog.storage.richstorage.js","^9",["^:","goog/storage/richstorage.js"],"^;","goog/storage/richstorage.js","^<","^=","^>","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a convenient API for data with attached metadata\n * persistence. You probably don't want to use this class directly as it\n * does not save any metadata by itself. It only provides the necessary\n * infrastructure for subclasses that need to save metadata along with\n * values stored.\n *\n */\n\ngoog.provide('goog.storage.RichStorage');\ngoog.provide('goog.storage.RichStorage.Wrapper');\n\ngoog.forwardDeclare('goog.storage.mechanism.Mechanism');\ngoog.require('goog.storage.ErrorCode');\ngoog.require('goog.storage.Storage');\n\n\n\n/**\n * Provides a storage for data with attached metadata.\n *\n * @param {!goog.storage.mechanism.Mechanism} mechanism The underlying\n *     storage mechanism.\n * @constructor\n * @struct\n * @extends {goog.storage.Storage}\n */\ngoog.storage.RichStorage = function(mechanism) {\n  goog.storage.RichStorage.base(this, 'constructor', mechanism);\n};\ngoog.inherits(goog.storage.RichStorage, goog.storage.Storage);\n\n\n/**\n * Metadata key under which the actual data is stored.\n *\n * @type {string}\n * @protected\n */\ngoog.storage.RichStorage.DATA_KEY = 'data';\n\n\n\n/**\n * Wraps a value so metadata can be associated with it. You probably want\n * to use goog.storage.RichStorage.Wrapper.wrapIfNecessary to avoid multiple\n * embeddings.\n *\n * @param {*} value The value to wrap.\n * @constructor\n * @final\n */\ngoog.storage.RichStorage.Wrapper = function(value) {\n  this[goog.storage.RichStorage.DATA_KEY] = value;\n};\n\n\n/**\n * Convenience method for wrapping a value so metadata can be associated with\n * it. No-op if the value is already wrapped or is undefined.\n *\n * @param {*} value The value to wrap.\n * @return {(!goog.storage.RichStorage.Wrapper|undefined)} The wrapper.\n */\ngoog.storage.RichStorage.Wrapper.wrapIfNecessary = function(value) {\n  if (value === undefined ||\n      value instanceof goog.storage.RichStorage.Wrapper) {\n    return /** @type {(!goog.storage.RichStorage.Wrapper|undefined)} */ (value);\n  }\n  return new goog.storage.RichStorage.Wrapper(value);\n};\n\n\n/**\n * Unwraps a value, any metadata is discarded (not returned). You might want to\n * use goog.storage.RichStorage.Wrapper.unwrapIfPossible to handle cases where\n * the wrapper is missing.\n *\n * @param {!Object} wrapper The wrapper.\n * @return {*} The wrapped value.\n */\ngoog.storage.RichStorage.Wrapper.unwrap = function(wrapper) {\n  var value = wrapper[goog.storage.RichStorage.DATA_KEY];\n  if (value === undefined) {\n    throw goog.storage.ErrorCode.INVALID_VALUE;\n  }\n  return value;\n};\n\n\n/**\n * Convenience method for unwrapping a value. Returns undefined if the\n * wrapper is missing.\n *\n * @param {(!Object|undefined)} wrapper The wrapper.\n * @return {*} The wrapped value or undefined.\n */\ngoog.storage.RichStorage.Wrapper.unwrapIfPossible = function(wrapper) {\n  if (!wrapper) {\n    return undefined;\n  }\n  return goog.storage.RichStorage.Wrapper.unwrap(wrapper);\n};\n\n\n/** @override */\ngoog.storage.RichStorage.prototype.set = function(key, value) {\n  goog.storage.RichStorage.base(\n      this, 'set', key,\n      goog.storage.RichStorage.Wrapper.wrapIfNecessary(value));\n};\n\n\n/**\n * Get an item wrapper (the item and its metadata) from the storage.\n *\n * WARNING: This returns an Object, which once used to be\n * goog.storage.RichStorage.Wrapper. This is due to the fact\n * that deserialized objects lose type information and it\n * is hard to do proper typecasting in JavaScript. Be sure\n * you know what you are doing when using the returned value.\n *\n * @param {string} key The key to get.\n * @return {(!Object|undefined)} The wrapper, or undefined if not found.\n */\ngoog.storage.RichStorage.prototype.getWrapper = function(key) {\n  var wrapper = goog.storage.RichStorage.superClass_.get.call(this, key);\n  if (wrapper === undefined || wrapper instanceof Object) {\n    return /** @type {(!Object|undefined)} */ (wrapper);\n  }\n  throw goog.storage.ErrorCode.INVALID_VALUE;\n};\n\n\n/** @override */\ngoog.storage.RichStorage.prototype.get = function(key) {\n  return goog.storage.RichStorage.Wrapper.unwrapIfPossible(\n      this.getWrapper(key));\n};\n","^?",1579837703000,"^@",["^A",["~$goog.storage.ErrorCode","^3","^59"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/richstorage.js"],"^S",["^A",["^4?","~$goog.storage.RichStorage.Wrapper"]],"^1",true,"^2",["^3","^VE","^59"]],["^ ","^7",[1579837703000],"^8","goog.testing.testrunner.js","^9",["^:","goog/testing/testrunner.js"],"^;","goog/testing/testrunner.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The test runner is a singleton object that is used to execute\n * a goog.testing.TestCases, display the results, and expose the results to\n * Selenium for automation.  If a TestCase hasn't been registered with the\n * runner by the time window.onload occurs, the testRunner will try to auto-\n * discover JsUnit style test pages.\n *\n * The hooks for selenium are (see http://go/selenium-hook-setup):-\n *  - Boolean G_testRunner.isFinished()\n *  - Boolean G_testRunner.isSuccess()\n *  - String G_testRunner.getReport()\n *  - number G_testRunner.getRunTime()\n *  - Object<string, Array<string>> G_testRunner.getTestResults()\n *\n * Testing code should not have dependencies outside of goog.testing so as to\n * reduce the chance of masking missing dependencies.\n *\n */\n\ngoog.setTestOnly('goog.testing.TestRunner');\ngoog.provide('goog.testing.TestRunner');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.json');\ngoog.require('goog.testing.TestCase');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Construct a test runner.\n *\n * NOTE(user): This is currently pretty weird, I'm essentially trying to\n * create a wrapper that the Selenium test can hook into to query the state of\n * the running test case, while making goog.testing.TestCase general.\n *\n * @constructor\n */\ngoog.testing.TestRunner = function() {\n  /**\n   * Errors that occurred in the window.\n   * @type {!Array<string>}\n   */\n  this.errors = [];\n\n  /**\n   * Reference to the active test case.\n   * @type {?goog.testing.TestCase}\n   */\n  this.testCase = null;\n\n  /**\n   * Whether the test runner has been initialized yet.\n   * @type {boolean}\n   */\n  this.initialized = false;\n\n  /**\n   * Element created in the document to add test results to.\n   * @private {?Element}\n   */\n  this.logEl_ = null;\n\n  /**\n   * Function to use when filtering errors.\n   * @private {(function(string))?}\n   */\n  this.errorFilter_ = null;\n\n  /**\n   * Whether an empty test case counts as an error.\n   * @private {boolean}\n   */\n  this.strict_ = true;\n\n  /**\n   * Store the serializer to avoid it being overwritten by a mock.\n   * @private {function(!Object): string}\n   */\n  this.jsonStringify_ = goog.json.serialize;\n\n  /**\n   * An id unique to this runner. Checked by the server during polling to\n   * verify that the page was not reloaded.\n   * @private {string}\n   */\n  this.uniqueId_ = ((Math.random() * 1e9) >>> 0) + '-' +\n      window.location.pathname.replace(/.*\\//, '').replace(/\\.html.*$/, '');\n\n  if (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher(11)) {\n    return;\n  }\n\n  var self = this;\n  function onPageHide() {\n    self.clearUniqueId();\n  }\n  window.addEventListener('pagehide', onPageHide);\n\n};\n\n/**\n * The uuid is embedded in the URL search. This function allows us to mock\n * the search in the test.\n * @return {string}\n */\ngoog.testing.TestRunner.prototype.getSearchString = function() {\n  return window.location.search;\n};\n\n/**\n * Returns the unique id for this test page.\n * @return {string}\n */\ngoog.testing.TestRunner.prototype.getUniqueId = function() {\n  return this.uniqueId_;\n};\n\n/**\n * Clears the unique id for this page. The value will hint the reason.\n */\ngoog.testing.TestRunner.prototype.clearUniqueId = function() {\n  this.uniqueId_ = 'pagehide';\n};\n\n/**\n * Initializes the test runner.\n * @param {goog.testing.TestCase} testCase The test case to initialize with.\n */\ngoog.testing.TestRunner.prototype.initialize = function(testCase) {\n  if (this.testCase && this.testCase.running) {\n    throw new Error(\n        'The test runner is already waiting for a test to complete');\n  }\n  this.testCase = testCase;\n  this.initialized = true;\n};\n\n\n/**\n * By default, the test runner is strict, and fails if it runs an empty\n * test case.\n * @param {boolean} strict Whether the test runner should fail on an empty\n *     test case.\n */\ngoog.testing.TestRunner.prototype.setStrict = function(strict) {\n  this.strict_ = strict;\n};\n\n\n/**\n * @return {boolean} Whether the test runner should fail on an empty\n *     test case.\n */\ngoog.testing.TestRunner.prototype.isStrict = function() {\n  return this.strict_;\n};\n\n\n/**\n * Returns true if the test runner is initialized.\n * Used by Selenium Hooks.\n * @return {boolean} Whether the test runner is active.\n */\ngoog.testing.TestRunner.prototype.isInitialized = function() {\n  return this.initialized;\n};\n\n\n/**\n * Returns false if the test runner has not finished successfully.\n * Used by Selenium Hooks.\n * @return {boolean} Whether the test runner is not active.\n */\ngoog.testing.TestRunner.prototype.isFinished = function() {\n  return this.errors.length > 0 || this.isComplete();\n};\n\n\n/**\n * Returns true if the test runner is finished.\n * @return {boolean} True if the test runner started and subsequently completed.\n */\ngoog.testing.TestRunner.prototype.isComplete = function() {\n  return this.initialized && !!this.testCase && this.testCase.started &&\n      !this.testCase.running;\n};\n\n/**\n * Returns true if the test case didn't fail.\n * Used by Selenium Hooks.\n * @return {boolean} Whether the current test returned successfully.\n */\ngoog.testing.TestRunner.prototype.isSuccess = function() {\n  return !this.hasErrors() && !!this.testCase && this.testCase.isSuccess();\n};\n\n\n/**\n * Returns true if the test case runner has errors that were caught outside of\n * the test case.\n * @return {boolean} Whether there were JS errors.\n */\ngoog.testing.TestRunner.prototype.hasErrors = function() {\n  return this.errors.length > 0;\n};\n\n\n/**\n * Logs an error that occurred.  Used in the case of environment setting up\n * an onerror handler.\n * @param {string} msg Error message.\n */\ngoog.testing.TestRunner.prototype.logError = function(msg) {\n  if (this.isComplete()) {\n    // Once the user has checked their code, subsequent errors can occur\n    // because of tearDown actions. For now, log these but do not fail the test.\n    this.log('Error after test completed: ' + msg);\n    return;\n  }\n  if (!this.errorFilter_ || this.errorFilter_.call(null, msg)) {\n    this.errors.push(msg);\n  }\n};\n\n\n/**\n * Log failure in current running test.\n * @param {Error} ex Exception.\n */\ngoog.testing.TestRunner.prototype.logTestFailure = function(ex) {\n  var testName = /** @type {string} */ (goog.testing.TestCase.currentTestName);\n  if (this.testCase) {\n    this.testCase.logError(testName, ex);\n  } else {\n    // NOTE: Do not forget to log the original exception raised.\n    throw new Error(\n        'Test runner not initialized with a test case. Original ' +\n        'exception: ' + ex.message);\n  }\n};\n\n\n/**\n * Sets a function to use as a filter for errors.\n * @param {function(string)} fn Filter function.\n */\ngoog.testing.TestRunner.prototype.setErrorFilter = function(fn) {\n  this.errorFilter_ = fn;\n};\n\n\n/**\n * Returns a report of the test case that ran.\n * Used by Selenium Hooks.\n * @param {boolean=} opt_verbose If true results will include data about all\n *     tests, not just what failed.\n * @return {string} A report summary of the test.\n */\ngoog.testing.TestRunner.prototype.getReport = function(opt_verbose) {\n  var report = [];\n  if (this.testCase) {\n    report.push(this.testCase.getReport(opt_verbose));\n  }\n  if (this.errors.length > 0) {\n    report.push('JavaScript errors detected by test runner:');\n    report.push.apply(report, this.errors);\n    report.push('\\n');\n  }\n  return report.join('\\n');\n};\n\n\n/**\n * Returns the amount of time it took for the test to run.\n * Used by Selenium Hooks.\n * @return {number} The run time, in milliseconds.\n */\ngoog.testing.TestRunner.prototype.getRunTime = function() {\n  return this.testCase ? this.testCase.getRunTime() : 0;\n};\n\n\n/**\n * Returns the number of script files that were loaded in order to run the test.\n * @return {number} The number of script files.\n */\ngoog.testing.TestRunner.prototype.getNumFilesLoaded = function() {\n  return this.testCase ? this.testCase.getNumFilesLoaded() : 0;\n};\n\n\n/**\n * Executes a test case and prints the results to the window.\n */\ngoog.testing.TestRunner.prototype.execute = function() {\n  if (!this.testCase) {\n    throw new Error(\n        'The test runner must be initialized with a test case ' +\n        'before execute can be called.');\n  }\n\n  if (this.strict_ && this.testCase.getCount() == 0) {\n    throw new Error(\n        'No tests found in given test case: ' + this.testCase.getName() + '. ' +\n        'By default, the test runner fails if a test case has no tests. ' +\n        'To modify this behavior, see goog.testing.TestRunner\\'s ' +\n        'setStrict() method, or G_testRunner.setStrict()');\n  }\n\n  this.testCase.addCompletedCallback(goog.bind(this.onComplete_, this));\n  if (goog.testing.TestRunner.shouldUsePromises_(this.testCase)) {\n    this.testCase.runTestsReturningPromise();\n  } else {\n    this.testCase.runTests();\n  }\n};\n\n\n/**\n * @param {!goog.testing.TestCase} testCase\n * @return {boolean}\n * @private\n */\ngoog.testing.TestRunner.shouldUsePromises_ = function(testCase) {\n  return testCase.constructor === goog.testing.TestCase;\n};\n\n\n/** @const {string} The ID of the element to log output to. */\ngoog.testing.TestRunner.TEST_LOG_ID = 'closureTestRunnerLog';\n\n\n/**\n * Writes the results to the document when the test case completes.\n * @private\n */\ngoog.testing.TestRunner.prototype.onComplete_ = function() {\n  var log = this.testCase.getReport(true);\n  if (this.errors.length > 0) {\n    log += '\\n' + this.errors.join('\\n');\n  }\n\n  if (!this.logEl_) {\n    var el = document.getElementById(goog.testing.TestRunner.TEST_LOG_ID);\n    if (el == null) {\n      el = goog.dom.createElement(goog.dom.TagName.DIV);\n      el.id = goog.testing.TestRunner.TEST_LOG_ID;\n      el.dir = 'ltr';\n      document.body.appendChild(el);\n    }\n    this.logEl_ = el;\n  }\n\n  // Highlight the page to indicate the overall outcome.\n  this.writeLog(log);\n\n  // TODO(chrishenry): Make this work with multiple test cases (b/8603638).\n  var runAgainLink = goog.dom.createElement(goog.dom.TagName.A);\n  runAgainLink.style.display = 'inline-block';\n  runAgainLink.style.fontSize = 'small';\n  runAgainLink.style.marginBottom = '16px';\n  runAgainLink.href = '';\n  runAgainLink.onclick = goog.bind(function() {\n    this.execute();\n    return false;\n  }, this);\n  runAgainLink.innerHTML = 'Run again without reloading';\n  this.logEl_.appendChild(runAgainLink);\n};\n\n\n/**\n * Writes a nicely formatted log out to the document.\n * @param {string} log The string to write.\n */\ngoog.testing.TestRunner.prototype.writeLog = function(log) {\n  var lines = log.split('\\n');\n  for (var i = 0; i < lines.length; i++) {\n    var line = lines[i];\n    var color;\n    var isPassed = /PASSED/.test(line);\n    var isSkipped = /SKIPPED/.test(line);\n    var isFailOrError =\n        /FAILED/.test(line) || /ERROR/.test(line) || /NO TESTS RUN/.test(line);\n    if (isPassed) {\n      color = 'darkgreen';\n    } else if (isSkipped) {\n      color = 'slategray';\n    } else if (isFailOrError) {\n      color = 'darkred';\n    } else {\n      color = '#333';\n    }\n    var div = goog.dom.createElement(goog.dom.TagName.DIV);\n    // Empty divs don't take up any space, use \\n to take up space and preserve\n    // newlines when copying the logs.\n    if (line == '') {\n      line = '\\n';\n    }\n    if (line.substr(0, 2) == '> ') {\n      // The stack trace may contain links so it has to be interpreted as HTML.\n      div.innerHTML = line;\n    } else {\n      div.appendChild(document.createTextNode(line));\n    }\n\n    var testNameMatch = /(\\S+) (\\[[^\\]]*] )?: (FAILED|ERROR|PASSED)/.exec(line);\n    if (testNameMatch) {\n      // Build a URL to run the test individually.  If this test was already\n      // part of another subset test, we need to overwrite the old runTests\n      // query parameter.  We also need to do this without bringing in any\n      // extra dependencies, otherwise we could mask missing dependency bugs.\n      var newSearch = 'runTests=' + testNameMatch[1];\n      var search = window.location.search;\n      if (search) {\n        var oldTests = /runTests=([^&]*)/.exec(search);\n        if (oldTests) {\n          newSearch = search.substr(0, oldTests.index) + newSearch +\n              search.substr(oldTests.index + oldTests[0].length);\n        } else {\n          newSearch = search + '&' + newSearch;\n        }\n      } else {\n        newSearch = '?' + newSearch;\n      }\n      var href = window.location.href;\n      var hash = window.location.hash;\n      if (hash && hash.charAt(0) != '#') {\n        hash = '#' + hash;\n      }\n      href = href.split('#')[0].split('?')[0] + newSearch + hash;\n\n      // Add the link.\n      var a = goog.dom.createElement(goog.dom.TagName.A);\n      a.innerHTML = '(run individually)';\n      a.style.fontSize = '0.8em';\n      a.style.color = '#888';\n      goog.dom.safe.setAnchorHref(a, href);\n      div.appendChild(document.createTextNode(' '));\n      div.appendChild(a);\n    }\n\n    div.style.color = color;\n    div.style.font = 'normal 100% monospace';\n    div.style.wordWrap = 'break-word';\n    if (i == 0) {\n      // Highlight the first line as a header that indicates the test outcome.\n      div.style.padding = '20px';\n      div.style.marginBottom = '10px';\n      if (isPassed) {\n        div.style.border = '1px solid ' + color;\n        div.style.backgroundColor = '#eeffee';\n      } else if (isFailOrError) {\n        div.style.border = '5px solid ' + color;\n        div.style.backgroundColor = '#ffeeee';\n      } else {\n        div.style.border = '1px solid black';\n        div.style.backgroundColor = '#eeeeee';\n      }\n    }\n\n    try {\n      div.style.whiteSpace = 'pre-wrap';\n    } catch (e) {\n      // NOTE(brenneman): IE raises an exception when assigning to pre-wrap.\n      // Thankfully, it doesn't collapse whitespace when using monospace fonts,\n      // so it will display correctly if we ignore the exception.\n    }\n\n    if (i < 2) {\n      div.style.fontWeight = 'bold';\n    }\n    this.logEl_.appendChild(div);\n  }\n};\n\n\n/**\n * Logs a message to the current test case.\n * @param {string} s The text to output to the log.\n */\ngoog.testing.TestRunner.prototype.log = function(s) {\n  if (this.testCase) {\n    this.testCase.log(s);\n  }\n};\n\n\n// TODO(nnaze): Properly handle serving test results when multiple test cases\n// are run.\n/**\n * @return {Object<string, !Array<!goog.testing.TestCase.IResult>>} A map of\n * test names to a list of test failures (if any) to provide formatted data\n * for the test runner.\n */\ngoog.testing.TestRunner.prototype.getTestResults = function() {\n  if (this.testCase) {\n    return this.testCase.getTestResults();\n  }\n  return null;\n};\n\n\n/**\n * Returns the test results as json.\n * This is called by the testing infrastructure through G_testrunner.\n * @return {?string} Tests results object.\n */\ngoog.testing.TestRunner.prototype.getTestResultsAsJson = function() {\n  if (this.testCase) {\n    var testCaseResults\n        /** {Object<string, !Array<!goog.testing.TestCase.IResult>>} */\n        = this.testCase.getTestResults();\n    if (this.hasErrors()) {\n      var globalErrors = [];\n      for (var i = 0; i < this.errors.length; i++) {\n        globalErrors.push(\n            {source: '', message: this.errors[i], stacktrace: ''});\n      }\n      // We are writing on our testCase results, but the test is over.\n      testCaseResults['globalErrors'] = globalErrors;\n    }\n    return this.jsonStringify_(testCaseResults);\n  }\n  return null;\n};\n","^?",1579837703000,"^@",["^A",["^14","^3@","^3","^18","^1;","^U0","^4"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/testrunner.js"],"^S",["^A",["~$goog.testing.TestRunner"]],"^1",true,"^2",["^3","^14","^4","^1;","^3@","^U0","^18"]],["^ ","^7",[1579837703000],"^8","goog.dom.iter.js","^9",["^:","goog/dom/iter.js"],"^;","goog/dom/iter.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Iterators over DOM nodes.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.iter.AncestorIterator');\ngoog.provide('goog.dom.iter.ChildIterator');\ngoog.provide('goog.dom.iter.SiblingIterator');\n\ngoog.require('goog.iter.Iterator');\ngoog.require('goog.iter.StopIteration');\n\n\n\n/**\n * Iterator over a Node's siblings.\n * @param {Node} node The node to start with.\n * @param {boolean=} opt_includeNode Whether to return the given node as the\n *     first return value from next.\n * @param {boolean=} opt_reverse Whether to traverse siblings in reverse\n *     document order.\n * @constructor\n * @extends {goog.iter.Iterator}\n */\ngoog.dom.iter.SiblingIterator = function(node, opt_includeNode, opt_reverse) {\n  /**\n   * The current node, or null if iteration is finished.\n   * @type {Node}\n   * @private\n   */\n  this.node_ = node;\n\n  /**\n   * Whether to iterate in reverse.\n   * @type {boolean}\n   * @private\n   */\n  this.reverse_ = !!opt_reverse;\n\n  if (node && !opt_includeNode) {\n    this.next();\n  }\n};\ngoog.inherits(goog.dom.iter.SiblingIterator, goog.iter.Iterator);\n\n\n/** @override */\ngoog.dom.iter.SiblingIterator.prototype.next = function() {\n  var node = this.node_;\n  if (!node) {\n    throw goog.iter.StopIteration;\n  }\n  this.node_ = this.reverse_ ? node.previousSibling : node.nextSibling;\n  return node;\n};\n\n\n\n/**\n * Iterator over an Element's children.\n * @param {Element} element The element to iterate over.\n * @param {boolean=} opt_reverse Optionally traverse children from last to\n *     first.\n * @param {number=} opt_startIndex Optional starting index.\n * @constructor\n * @extends {goog.dom.iter.SiblingIterator}\n * @final\n */\ngoog.dom.iter.ChildIterator = function(element, opt_reverse, opt_startIndex) {\n  if (opt_startIndex === undefined) {\n    opt_startIndex = opt_reverse && element.childNodes.length ?\n        element.childNodes.length - 1 :\n        0;\n  }\n  goog.dom.iter.SiblingIterator.call(\n      this, element.childNodes[opt_startIndex], true, opt_reverse);\n};\ngoog.inherits(goog.dom.iter.ChildIterator, goog.dom.iter.SiblingIterator);\n\n\n\n/**\n * Iterator over a Node's ancestors, stopping after the document body.\n * @param {Node} node The node to start with.\n * @param {boolean=} opt_includeNode Whether to return the given node as the\n *     first return value from next.\n * @constructor\n * @extends {goog.iter.Iterator}\n * @final\n */\ngoog.dom.iter.AncestorIterator = function(node, opt_includeNode) {\n  /**\n   * The current node, or null if iteration is finished.\n   * @type {Node}\n   * @private\n   */\n  this.node_ = node;\n\n  if (node && !opt_includeNode) {\n    this.next();\n  }\n};\ngoog.inherits(goog.dom.iter.AncestorIterator, goog.iter.Iterator);\n\n\n/** @override */\ngoog.dom.iter.AncestorIterator.prototype.next = function() {\n  var node = this.node_;\n  if (!node) {\n    throw goog.iter.StopIteration;\n  }\n  this.node_ = node.parentNode;\n  return node;\n};\n","^?",1579837703000,"^@",["^A",["^3","^SK","~$goog.iter.Iterator"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/iter.js"],"^S",["^A",["~$goog.dom.iter.ChildIterator","~$goog.dom.iter.SiblingIterator","~$goog.dom.iter.AncestorIterator"]],"^1",true,"^2",["^3","^VH","^SK"]],["^ ","^7",[1579837703000],"^8","goog.ui.emoji.spriteinfo.js","^9",["^:","goog/ui/emoji/spriteinfo.js"],"^;","goog/ui/emoji/spriteinfo.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview SpriteInfo implementation. This is a simple wrapper class to\n * hold CSS metadata needed for sprited emoji.\n *\n * @see ../demos/popupemojipicker.html or emojipicker_test.html for examples\n * of how to use this class.\n *\n */\ngoog.provide('goog.ui.emoji.SpriteInfo');\n\n\n\n/**\n * Creates a SpriteInfo object with the specified properties. If the image is\n * sprited via CSS, then only the first parameter needs a value. If the image\n * is sprited via metadata, then the first parameter should be left null.\n *\n * @param {?string} cssClass CSS class to properly display the sprited image.\n * @param {string=} opt_url Url of the sprite image.\n * @param {number=} opt_width Width of the image being sprited.\n * @param {number=} opt_height Height of the image being sprited.\n * @param {number=} opt_xOffset Positive x offset of the image being sprited\n *     within the sprite.\n * @param {number=} opt_yOffset Positive y offset of the image being sprited\n *     within the sprite.\n * @param {boolean=} opt_animated Whether the sprite is animated.\n * @constructor\n * @final\n */\ngoog.ui.emoji.SpriteInfo = function(\n    cssClass, opt_url, opt_width, opt_height, opt_xOffset, opt_yOffset,\n    opt_animated) {\n  if (cssClass != null) {\n    this.cssClass_ = cssClass;\n  } else {\n    if (opt_url == undefined || opt_width === undefined ||\n        opt_height === undefined || opt_xOffset == undefined ||\n        opt_yOffset === undefined) {\n      throw new Error('Sprite info is not fully specified');\n    }\n\n    this.url_ = opt_url;\n    this.width_ = opt_width;\n    this.height_ = opt_height;\n    this.xOffset_ = opt_xOffset;\n    this.yOffset_ = opt_yOffset;\n  }\n\n  this.animated_ = !!opt_animated;\n};\n\n\n/**\n * Name of the CSS class to properly display the sprited image.\n * @type {string}\n * @private\n */\ngoog.ui.emoji.SpriteInfo.prototype.cssClass_;\n\n\n/**\n * Url of the sprite image.\n * @type {string|undefined}\n * @private\n */\ngoog.ui.emoji.SpriteInfo.prototype.url_;\n\n\n/**\n * Width of the image being sprited.\n * @type {number|undefined}\n * @private\n */\ngoog.ui.emoji.SpriteInfo.prototype.width_;\n\n\n/**\n * Height of the image being sprited.\n * @type {number|undefined}\n * @private\n */\ngoog.ui.emoji.SpriteInfo.prototype.height_;\n\n\n/**\n * Positive x offset of the image being sprited within the sprite.\n * @type {number|undefined}\n * @private\n */\ngoog.ui.emoji.SpriteInfo.prototype.xOffset_;\n\n\n/**\n * Positive y offset of the image being sprited within the sprite.\n * @type {number|undefined}\n * @private\n */\ngoog.ui.emoji.SpriteInfo.prototype.yOffset_;\n\n\n/**\n * Whether the emoji specified by the sprite is animated.\n * @type {boolean}\n * @private\n */\ngoog.ui.emoji.SpriteInfo.prototype.animated_;\n\n\n/**\n * Returns the css class of the sprited image.\n * @return {?string} Name of the CSS class to properly display the sprited\n *     image.\n */\ngoog.ui.emoji.SpriteInfo.prototype.getCssClass = function() {\n  return this.cssClass_ || null;\n};\n\n\n/**\n * Returns the url of the sprite image.\n * @return {?string} Url of the sprite image.\n */\ngoog.ui.emoji.SpriteInfo.prototype.getUrl = function() {\n  return this.url_ || null;\n};\n\n\n/**\n * Returns whether the emoji specified by this sprite is animated.\n * @return {boolean} Whether the emoji is animated.\n */\ngoog.ui.emoji.SpriteInfo.prototype.isAnimated = function() {\n  return this.animated_;\n};\n\n\n/**\n * Returns the width of the image being sprited, appropriate for a CSS value.\n * @return {string} The width of the image being sprited.\n */\ngoog.ui.emoji.SpriteInfo.prototype.getWidthCssValue = function() {\n  return goog.ui.emoji.SpriteInfo.getCssPixelValue_(this.width_);\n};\n\n\n/**\n * Returns the height of the image being sprited, appropriate for a CSS value.\n * @return {string} The height of the image being sprited.\n */\ngoog.ui.emoji.SpriteInfo.prototype.getHeightCssValue = function() {\n  return goog.ui.emoji.SpriteInfo.getCssPixelValue_(this.height_);\n};\n\n\n/**\n * Returns the x offset of the image being sprited within the sprite,\n * appropriate for a CSS value.\n * @return {string} The x offset of the image being sprited within the sprite.\n */\ngoog.ui.emoji.SpriteInfo.prototype.getXOffsetCssValue = function() {\n  return goog.ui.emoji.SpriteInfo.getOffsetCssValue_(this.xOffset_);\n};\n\n\n/**\n * Returns the positive y offset of the image being sprited within the sprite,\n * appropriate for a CSS value.\n * @return {string} The y offset of the image being sprited within the sprite.\n */\ngoog.ui.emoji.SpriteInfo.prototype.getYOffsetCssValue = function() {\n  return goog.ui.emoji.SpriteInfo.getOffsetCssValue_(this.yOffset_);\n};\n\n\n/**\n * Returns a string appropriate for use as a CSS value. If the value is zero,\n * then there is no unit appended.\n *\n * @param {number|undefined} value A number to be turned into a\n *     CSS size/location value.\n * @return {string} A string appropriate for use as a CSS value.\n * @private\n */\ngoog.ui.emoji.SpriteInfo.getCssPixelValue_ = function(value) {\n  return !value ? '0' : value + 'px';\n};\n\n\n/**\n * Returns a string appropriate for use as a CSS value for a position offset,\n * such as the position argument for sprites.\n *\n * @param {number|undefined} posOffset A positive offset for a position.\n * @return {string} A string appropriate for use as a CSS value.\n * @private\n */\ngoog.ui.emoji.SpriteInfo.getOffsetCssValue_ = function(posOffset) {\n  const offset = goog.ui.emoji.SpriteInfo.getCssPixelValue_(posOffset);\n  return offset == '0' ? offset : '-' + offset;\n};\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/emoji/spriteinfo.js"],"^S",["^A",["~$goog.ui.emoji.SpriteInfo"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.messaging.messagechannel.js","^9",["^:","goog/messaging/messagechannel.js"],"^;","goog/messaging/messagechannel.js","^<","^=","^>","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An interface for asynchronous message-passing channels.\n *\n * This interface is useful for writing code in a message-passing style that's\n * independent of the underlying communication medium. It's also useful for\n * adding decorators that wrap message channels and add extra functionality on\n * top. For example, {@link goog.messaging.BufferedChannel} enqueues messages\n * until communication is established, while {@link goog.messaging.MultiChannel}\n * splits a single underlying channel into multiple virtual ones.\n *\n * Decorators should be passed their underlying channel(s) in the constructor,\n * and should assume that those channels are already connected. Decorators are\n * responsible for disposing of the channels they wrap when the decorators\n * themselves are disposed. Decorators should also follow the APIs of the\n * individual methods listed below.\n *\n */\n\n\ngoog.provide('goog.messaging.MessageChannel');\n\n\n\n/**\n * @interface\n */\ngoog.messaging.MessageChannel = function() {};\n\n\n/**\n * Initiates the channel connection. When this method is called, all the\n * information needed to connect the channel has to be available.\n *\n * Implementers should only require this method to be called if the channel\n * needs to be configured in some way between when it's created and when it\n * becomes active. Otherwise, the channel should be immediately active and this\n * method should do nothing but immediately call opt_connectCb.\n *\n * @param {Function=} opt_connectCb Called when the channel has been connected\n *     and is ready to use.\n */\ngoog.messaging.MessageChannel.prototype.connect = function(opt_connectCb) {};\n\n\n/**\n * Gets whether the channel is connected.\n *\n * If {@link #connect} is not required for this class, this should always return\n * true. Otherwise, this should return true by the time the callback passed to\n * {@link #connect} has been called and always after that.\n *\n * @return {boolean} Whether the channel is connected.\n */\ngoog.messaging.MessageChannel.prototype.isConnected = function() {};\n\n\n/**\n * Registers a service to be called when a message is received.\n *\n * Implementers shouldn't impose any restrictions on the service names that may\n * be registered. If some services are needed as control codes,\n * {@link goog.messaging.MultiMessageChannel} can be used to safely split the\n * channel into \"public\" and \"control\" virtual channels.\n *\n * @param {string} serviceName The name of the service.\n * @param {function((string|!Object))} callback The callback to process the\n *     incoming messages. Passed the payload. If opt_objectPayload is set, the\n *     payload is decoded and passed as an object.\n * @param {boolean=} opt_objectPayload If true, incoming messages for this\n *     service are expected to contain an object, and will be deserialized from\n *     a string automatically if necessary. It's the responsibility of\n *     implementors of this class to perform the deserialization.\n */\ngoog.messaging.MessageChannel.prototype.registerService = function(\n    serviceName, callback, opt_objectPayload) {};\n\n\n/**\n * Registers a service to be called when a message is received that doesn't\n * match any other services.\n *\n * @param {function(string, (string|!Object))} callback The callback to process\n *     the incoming messages. Passed the service name and the payload. Since\n *     some channels can pass objects natively, the payload may be either an\n *     object or a string.\n */\ngoog.messaging.MessageChannel.prototype.registerDefaultService = function(\n    callback) {};\n\n\n/**\n * Sends a message over the channel.\n *\n * @param {string} serviceName The name of the service this message should be\n *     delivered to.\n * @param {string|!Object} payload The value of the message. If this is an\n *     Object, it is serialized to a string before sending if necessary. It's\n *     the responsibility of implementors of this class to perform the\n *     serialization.\n */\ngoog.messaging.MessageChannel.prototype.send = function(serviceName, payload) {\n};\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/messagechannel.js"],"^S",["^A",["^3A"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.crypt.sha512_256.js","^9",["^:","goog/crypt/sha512_256.js"],"^;","goog/crypt/sha512_256.js","^<","^=","^>","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview SHA-512/256 cryptographic hash.\n *\n * WARNING:  SHA-256 and SHA-512/256 are different members of the SHA-2\n * family of hashes.  Although both give 32-byte results, the two results\n * should bear no relationship to each other.\n *\n * Please be careful before using this hash function.\n * <p>\n * Usage:\n *   var sha512_256 = new goog.crypt.Sha512_256();\n *   sha512_256.update(bytes);\n *   var hash = sha512_256.digest();\n *\n * @author fy@google.com (Frank Yellin)\n */\n\ngoog.provide('goog.crypt.Sha512_256');\n\ngoog.require('goog.crypt.Sha2_64bit');\n\n\n\n/**\n * Constructs a SHA-512/256 cryptographic hash.\n *\n * @constructor\n * @extends {goog.crypt.Sha2_64bit}\n * @final\n * @struct\n */\ngoog.crypt.Sha512_256 = function() {\n  goog.crypt.Sha512_256.base(\n      this, 'constructor', 4 /* numHashBlocks */,\n      goog.crypt.Sha512_256.INIT_HASH_BLOCK_);\n};\ngoog.inherits(goog.crypt.Sha512_256, goog.crypt.Sha2_64bit);\n\n\n/** @private {!Array<number>} */\ngoog.crypt.Sha512_256.INIT_HASH_BLOCK_ = [\n  // Section 5.3.6.2 of\n  // csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf\n  0x22312194, 0xFC2BF72C,  // H0\n  0x9F555FA3, 0xC84C64C2,  // H1\n  0x2393B86B, 0x6F53B151,  // H2\n  0x96387719, 0x5940EABD,  // H3\n  0x96283EE2, 0xA88EFFE3,  // H4\n  0xBE5E1E25, 0x53863992,  // H5\n  0x2B0199FC, 0x2C85B8AA,  // H6\n  0x0EB72DDC, 0x81C52CA2   // H7\n];\n","^?",1579837703000,"^@",["^A",["~$goog.crypt.Sha2-64bit","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/sha512_256.js"],"^S",["^A",["~$goog.crypt.Sha512-256","~$goog.crypt.Sha512_256"]],"^1",true,"^2",["^3","^VM"]],["^ ","^7",[1579837703000],"^8","goog.ui.gaugetheme.js","^9",["^:","goog/ui/gaugetheme.js"],"^;","goog/ui/gaugetheme.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview The color theme used by a gauge (goog.ui.Gauge).\n */\n\n\ngoog.provide('goog.ui.GaugeTheme');\n\n\ngoog.require('goog.graphics.LinearGradient');\ngoog.require('goog.graphics.SolidFill');\ngoog.require('goog.graphics.Stroke');\n\n\n\n/**\n * A class for the default color theme for a Gauge.\n * Users can extend this class to provide a custom color theme, and apply the\n * custom color theme by calling  {@link goog.ui.Gauge#setTheme}.\n * @constructor\n * @final\n */\ngoog.ui.GaugeTheme = function() {};\n\n\n/**\n * Returns the stroke for the external border of the gauge.\n * @return {!goog.graphics.Stroke} The stroke to use.\n */\ngoog.ui.GaugeTheme.prototype.getExternalBorderStroke = function() {\n  return new goog.graphics.Stroke(1, '#333333');\n};\n\n\n/**\n * Returns the fill for the external border of the gauge.\n * @param {number} cx X coordinate of the center of the gauge.\n * @param {number} cy Y coordinate of the center of the gauge.\n * @param {number} r Radius of the gauge.\n * @return {!goog.graphics.Fill} The fill to use.\n */\ngoog.ui.GaugeTheme.prototype.getExternalBorderFill = function(cx, cy, r) {\n  return new goog.graphics.LinearGradient(\n      cx + r, cy - r, cx - r, cy + r, '#f7f7f7', '#cccccc');\n};\n\n\n/**\n * Returns the stroke for the internal border of the gauge.\n * @return {!goog.graphics.Stroke} The stroke to use.\n */\ngoog.ui.GaugeTheme.prototype.getInternalBorderStroke = function() {\n  return new goog.graphics.Stroke(2, '#e0e0e0');\n};\n\n\n/**\n * Returns the fill for the internal border of the gauge.\n * @param {number} cx X coordinate of the center of the gauge.\n * @param {number} cy Y coordinate of the center of the gauge.\n * @param {number} r Radius of the gauge.\n * @return {!goog.graphics.Fill} The fill to use.\n */\ngoog.ui.GaugeTheme.prototype.getInternalBorderFill = function(cx, cy, r) {\n  return new goog.graphics.SolidFill('#f7f7f7');\n};\n\n\n/**\n * Returns the stroke for the major ticks of the gauge.\n * @return {!goog.graphics.Stroke} The stroke to use.\n */\ngoog.ui.GaugeTheme.prototype.getMajorTickStroke = function() {\n  return new goog.graphics.Stroke(2, '#333333');\n};\n\n\n/**\n * Returns the stroke for the minor ticks of the gauge.\n * @return {!goog.graphics.Stroke} The stroke to use.\n */\ngoog.ui.GaugeTheme.prototype.getMinorTickStroke = function() {\n  return new goog.graphics.Stroke(1, '#666666');\n};\n\n\n/**\n * Returns the stroke for the hinge at the center of the gauge.\n * @return {!goog.graphics.Stroke} The stroke to use.\n */\ngoog.ui.GaugeTheme.prototype.getHingeStroke = function() {\n  return new goog.graphics.Stroke(1, '#666666');\n};\n\n\n/**\n * Returns the fill for the hinge at the center of the gauge.\n * @param {number} cx  X coordinate of the center of the gauge.\n * @param {number} cy  Y coordinate of the center of the gauge.\n * @param {number} r  Radius of the hinge.\n * @return {!goog.graphics.Fill} The fill to use.\n */\ngoog.ui.GaugeTheme.prototype.getHingeFill = function(cx, cy, r) {\n  return new goog.graphics.LinearGradient(\n      cx + r, cy - r, cx - r, cy + r, '#4684ee', '#3776d6');\n};\n\n\n/**\n * Returns the stroke for the gauge needle.\n * @return {!goog.graphics.Stroke} The stroke to use.\n */\ngoog.ui.GaugeTheme.prototype.getNeedleStroke = function() {\n  return new goog.graphics.Stroke(1, '#c63310');\n};\n\n\n/**\n * Returns the fill for the hinge at the center of the gauge.\n * @param {number} cx X coordinate of the center of the gauge.\n * @param {number} cy Y coordinate of the center of the gauge.\n * @param {number} r Radius of the gauge.\n * @return {!goog.graphics.Fill} The fill to use.\n */\ngoog.ui.GaugeTheme.prototype.getNeedleFill = function(cx, cy, r) {\n  // Make needle a bit transparent so that text underneeth is still visible.\n  return new goog.graphics.SolidFill('#dc3912', 0.7);\n};\n\n\n/**\n * Returns the color for the gauge title.\n * @return {string} The color to use.\n */\ngoog.ui.GaugeTheme.prototype.getTitleColor = function() {\n  return '#333333';\n};\n\n\n/**\n * Returns the color for the gauge value.\n * @return {string} The color to use.\n */\ngoog.ui.GaugeTheme.prototype.getValueColor = function() {\n  return 'black';\n};\n\n\n/**\n * Returns the color for the labels (formatted values) of tick marks.\n * @return {string} The color to use.\n */\ngoog.ui.GaugeTheme.prototype.getTickLabelColor = function() {\n  return '#333333';\n};\n","^?",1579837703000,"^@",["^A",["^3","^2Z","~$goog.graphics.Stroke","^31"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/gaugetheme.js"],"^S",["^A",["~$goog.ui.GaugeTheme"]],"^1",true,"^2",["^3","^2Z","^31","^VP"]],["^ ","^7",[1579837703000],"^1=",true,"^8","goog.events.eventtargettester.js","^9",["^:","goog/events/eventtargettester.js"],"^;","goog/events/eventtargettester.js","^<","^=","^>","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.module('goog.events.eventTargetTester');\ngoog.setTestOnly();\n\nconst GoogEventsEvent = goog.require('goog.events.Event');\nconst GoogEventsEventTarget = goog.require('goog.events.EventTarget');\nconst GoogEventsListenable = goog.require('goog.events.Listenable');\nconst googArray = goog.require('goog.array');\nconst recordFunction = goog.require('goog.testing.recordFunction');\n/** @suppress {extraRequire} */\ngoog.require('goog.testing.asserts');\n\nlet dispatchEvent;\nlet eventTargets;\nlet getListener;\nlet getListeners;\nlet hasListener;\nlet keyType;\nlet listen;\nlet listenOnce;\nlet listenableFactory;\nlet listeners;\nlet objectTypeListenerSupported;\nlet removeAll;\nlet unlisten;\nlet unlistenByKey;\nlet unlistenReturnType;\n\n/**\n * The maximum number of initialized event targets (in eventTargets\n * array) and listeners (in listeners array).\n * @type {number}\n * @private\n */\nconst MAX_INSTANCE_COUNT = 10;\n\n/**\n * The number of times a listener should have been executed. This\n * exists to make assertListenerIsCalled more readable.  This is used\n * like so: assertListenerIsCalled(listener, times(2));\n * @param {number} n The number of times a listener should have been\n *     executed.\n * @return {number} The number n.\n */\nfunction times(n) {\n  return n;\n}\n\n/**\n * Creates a listener that executes the given function (optional).\n * @param {!Function=} opt_listenerFn The optional function to execute.\n * @return {!Function} The listener function.\n */\nfunction createListener(opt_listenerFn) {\n  return recordFunction(opt_listenerFn);\n}\n\n/**\n * Asserts that the given listener is called numCount number of times.\n * @param {!Function} listener The listener to check.\n * @param {number} numCount The number of times. See also the times()\n *     function below.\n */\nfunction assertListenerIsCalled(listener, numCount) {\n  assertEquals(\n      'Listeners is not called the correct number of times.', numCount,\n      listener.getCallCount());\n  listener[exports.ALREADY_CHECKED_PROP] = true;\n  listener[exports.NUM_CALLED_PROP] = numCount;\n}\n\n\n/**\n * Asserts that no other listeners, other than those verified via\n * assertListenerIsCalled, have been called since the last\n * resetListeners().\n */\nfunction assertNoOtherListenerIsCalled() {\n  googArray.forEach(listeners, function(l, index) {\n    if (!l[exports.ALREADY_CHECKED_PROP]) {\n      assertEquals(\n          'Listeners ' + index + ' is unexpectedly called.', 0,\n          l.getCallCount());\n    } else {\n      assertEquals(\n          'Listeners ' + index + ' is unexpectedly called.',\n          l[exports.NUM_CALLED_PROP], l.getCallCount());\n    }\n  });\n}\n\n\n/**\n * Resets all listeners call count to 0.\n */\nfunction resetListeners() {\n  googArray.forEach(listeners, function(l) {\n    l.reset();\n    l[exports.ALREADY_CHECKED_PROP] = false;\n  });\n}\n\n\n/**\n * The type of key returned by key-returning functions (listen).\n * @enum {number}\n */\nconst KeyType = {\n  /**\n   * Returns number for key.\n   */\n  NUMBER: 0,\n\n  /**\n   * Returns undefined (no return value).\n   */\n  UNDEFINED: 1\n};\n\n/**\n * The type of unlisten function's return value.\n * @enum {number}\n */\nconst UnlistenReturnType = {\n  /**\n   * Returns boolean indicating whether unlisten is successful.\n   */\n  BOOLEAN: 0,\n\n  /**\n   * Returns undefind (no return value).\n   */\n  UNDEFINED: 1\n};\n\n/**\n * Contains test event types.\n * @enum {string}\n */\nvar EventType = {\n  A: goog.events.getUniqueId('a'),\n  B: goog.events.getUniqueId('b'),\n  C: goog.events.getUniqueId('c')\n};\n\n/**\n * Custom event object for testing.\n * @final\n */\nclass TestEvent extends GoogEventsEvent {\n  constructor() {\n    super(EventType.A);\n  }\n}\n\nexports = {\n  assertListenerIsCalled,\n  assertNoOtherListenerIsCalled,\n  createListener,\n  times,\n  resetListeners,\n\n  /** @return {!Array<?>} */\n  getListeners() {\n    return listeners;\n  },\n\n  /** @return {!Array<?>} */\n  getTargets() {\n    return eventTargets;\n  },\n\n  /**\n   * Setup step for the test functions. This needs to be called from the\n   * test setUp.\n   * @param {function():!GoogEventsListenable} listenableFactoryFn Function\n   *     that will return a new Listenable instance each time it is called.\n   * @param {Function} listenFn Function that, given the same signature\n   *     as goog.events.listen, will add listener to the given event\n   *     target.\n   * @param {Function} unlistenFn Function that, given the same\n   *     signature as goog.events.unlisten, will remove listener from\n   *     the given event target.\n   * @param {Function} unlistenByKeyFn Function that, given 2\n   *     parameters: src and key, will remove the corresponding\n   *     listener.\n   * @param {Function} listenOnceFn Function that, given the same\n   *     signature as goog.events.listenOnce, will add a one-time\n   *     listener to the given event target.\n   * @param {Function} dispatchEventFn Function that, given the same\n   *     signature as goog.events.dispatchEvent, will dispatch the event\n   *     on the given event target.\n   * @param {Function} removeAllFn Function that, given the same\n   *     signature as goog.events.removeAll, will remove all listeners\n   *     according to the contract of goog.events.removeAll.\n   * @param {Function} getListenersFn Function that, given the same\n   *     signature as goog.events.getListeners, will retrieve listeners.\n   * @param {Function} getListenerFn Function that, given the same\n   *     signature as goog.events.getListener, will retrieve the\n   *     listener object.\n   * @param {Function} hasListenerFn Function that, given the same\n   *     signature as goog.events.hasListener, will determine whether\n   *     listeners exist.\n   * @param {KeyType} listenKeyType The\n   *     key type returned by listen call.\n   * @param {UnlistenReturnType}\n   *     unlistenFnReturnType\n   *     Whether we should check return value from\n   *     unlisten call. If unlisten does not return a value, this should\n   *     be set to false.\n   * @param {boolean} objectListenerSupported Whether listener of type\n   *     Object is supported.\n   */\n  setUp(\n      listenableFactoryFn, listenFn, unlistenFn, unlistenByKeyFn, listenOnceFn,\n      dispatchEventFn, removeAllFn, getListenersFn, getListenerFn,\n      hasListenerFn, listenKeyType, unlistenFnReturnType,\n      objectListenerSupported) {\n    listenableFactory = listenableFactoryFn;\n    listen = listenFn;\n    unlisten = unlistenFn;\n    unlistenByKey = unlistenByKeyFn;\n    listenOnce = listenOnceFn;\n    dispatchEvent = dispatchEventFn;\n    removeAll = removeAllFn;\n    getListeners = getListenersFn;\n    getListener = getListenerFn;\n    hasListener = hasListenerFn;\n    keyType = listenKeyType;\n    unlistenReturnType = unlistenFnReturnType;\n    objectTypeListenerSupported = objectListenerSupported;\n\n    listeners = [];\n    for (var i = 0; i < MAX_INSTANCE_COUNT; i++) {\n      listeners[i] = createListener();\n    }\n\n    eventTargets = [];\n    for (i = 0; i < MAX_INSTANCE_COUNT; i++) {\n      eventTargets[i] = listenableFactory();\n    }\n  },\n\n\n  /**\n   * Teardown step for the test functions. This needs to be called from\n   * test teardown.\n   */\n  tearDown() {\n    for (var i = 0; i < MAX_INSTANCE_COUNT; i++) {\n      goog.dispose(eventTargets[i]);\n    }\n  },\n\n  /** @const */\n  KeyType,\n\n  /** @const */\n  EventType,\n\n\n  /** @const */\n  UnlistenReturnType,\n\n  /** @const */\n  TestEvent,\n\n  /**\n   * Expando property used on \"listener\" function to determine if a\n   * listener has already been checked. This is what allows us to\n   * implement assertNoOtherListenerIsCalled.\n   * @type {string}\n   */\n  ALREADY_CHECKED_PROP: '__alreadyChecked',\n\n\n  /**\n   * Expando property used on \"listener\" function to record the number\n   * of times it has been called the last time assertListenerIsCalled is\n   * done. This allows us to verify that it has not been called more\n   * times in assertNoOtherListenerIsCalled.\n   */\n  NUM_CALLED_PROP: '__numCalled',\n\n  commonTests: {\n    testNoListener() {\n      dispatchEvent(eventTargets[0], EventType.A);\n      assertNoOtherListenerIsCalled();\n    },\n\n    testOneListener() {\n      listen(eventTargets[0], EventType.A, listeners[0]);\n      dispatchEvent(eventTargets[0], EventType.A);\n      assertListenerIsCalled(listeners[0], times(1));\n      assertNoOtherListenerIsCalled();\n\n      resetListeners();\n\n      dispatchEvent(eventTargets[0], EventType.B);\n      dispatchEvent(eventTargets[0], EventType.C);\n      assertNoOtherListenerIsCalled();\n    },\n\n    testTwoListenersOfSameType() {\n      var key1 = listen(eventTargets[0], EventType.A, listeners[0]);\n      var key2 = listen(eventTargets[0], EventType.A, listeners[1]);\n\n      if (keyType == KeyType.NUMBER) {\n        assertNotEquals(key1, key2);\n      } else {\n        assertUndefined(key1);\n        assertUndefined(key2);\n      }\n\n      dispatchEvent(eventTargets[0], EventType.A);\n      assertListenerIsCalled(listeners[0], times(1));\n      assertListenerIsCalled(listeners[1], times(1));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testInstallingSameListeners() {\n      var key1 = listen(eventTargets[0], EventType.A, listeners[0]);\n      var key2 = listen(eventTargets[0], EventType.A, listeners[0]);\n      var key3 = listen(eventTargets[0], EventType.B, listeners[0]);\n\n      if (keyType == KeyType.NUMBER) {\n        assertEquals(key1, key2);\n        assertNotEquals(key1, key3);\n      } else {\n        assertUndefined(key1);\n        assertUndefined(key2);\n        assertUndefined(key3);\n      }\n\n      dispatchEvent(eventTargets[0], EventType.A);\n      assertListenerIsCalled(listeners[0], times(1));\n\n      dispatchEvent(eventTargets[0], EventType.B);\n      assertListenerIsCalled(listeners[0], times(2));\n\n      assertNoOtherListenerIsCalled();\n    },\n\n    testScope() {\n      listeners[0] = createListener(function(e) {\n        assertEquals('Wrong scope with undefined scope', eventTargets[0], this);\n      });\n      listeners[1] = createListener(function(e) {\n        assertEquals('Wrong scope with null scope', eventTargets[0], this);\n      });\n      var scope = {};\n      listeners[2] = createListener(function(e) {\n        assertEquals('Wrong scope with specific scope object', scope, this);\n      });\n      listen(eventTargets[0], EventType.A, listeners[0]);\n      listen(eventTargets[0], EventType.A, listeners[1], false, null);\n      listen(eventTargets[0], EventType.A, listeners[2], false, scope);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n      assertListenerIsCalled(listeners[0], times(1));\n      assertListenerIsCalled(listeners[1], times(1));\n      assertListenerIsCalled(listeners[2], times(1));\n    },\n\n    testDispatchEventDoesNotThrowWithDisposedEventTarget() {\n      goog.dispose(eventTargets[0]);\n      assertTrue(dispatchEvent(eventTargets[0], EventType.A));\n    },\n\n    testDispatchEventWithObjectLiteral() {\n      listen(eventTargets[0], EventType.A, listeners[0]);\n\n      assertTrue(dispatchEvent(eventTargets[0], {type: EventType.A}));\n      assertListenerIsCalled(listeners[0], times(1));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testDispatchEventWithCustomEventObject() {\n      listen(eventTargets[0], EventType.A, listeners[0]);\n\n      var e = new TestEvent();\n      assertTrue(dispatchEvent(eventTargets[0], e));\n      assertListenerIsCalled(listeners[0], times(1));\n      assertNoOtherListenerIsCalled();\n\n      var actualEvent = listeners[0].getLastCall().getArgument(0);\n\n      assertEquals(e, actualEvent);\n      assertEquals(eventTargets[0], actualEvent.target);\n    },\n\n    testDisposingEventTargetRemovesListeners() {\n      if (!(listenableFactory() instanceof GoogEventsEventTarget)) {\n        return;\n      }\n      listen(eventTargets[0], EventType.A, listeners[0]);\n      goog.dispose(eventTargets[0]);\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      assertNoOtherListenerIsCalled();\n    },\n\n\n    /**\n     * Unlisten/unlistenByKey should still work after disposal. There are\n     * many circumstances when this is actually necessary. For example, a\n     * user may have listened to an event target and stored the key\n     * (e.g. in a goog.events.EventHandler) and only unlisten after the\n     * target has been disposed.\n     */\n    testUnlistenWorksAfterDisposal() {\n      var key = listen(eventTargets[0], EventType.A, listeners[0]);\n      goog.dispose(eventTargets[0]);\n      unlisten(eventTargets[0], EventType.A, listeners[1]);\n      if (unlistenByKey) {\n        unlistenByKey(eventTargets[0], key);\n      }\n    },\n\n    testRemovingListener() {\n      var ret1 = unlisten(eventTargets[0], EventType.A, listeners[0]);\n      listen(eventTargets[0], EventType.A, listeners[0]);\n      var ret2 = unlisten(eventTargets[0], EventType.A, listeners[1]);\n      var ret3 = unlisten(eventTargets[0], EventType.B, listeners[0]);\n      var ret4 = unlisten(eventTargets[1], EventType.A, listeners[0]);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n      assertListenerIsCalled(listeners[0], times(1));\n\n      var ret5 = unlisten(eventTargets[0], EventType.A, listeners[0]);\n      var ret6 = unlisten(eventTargets[0], EventType.A, listeners[0]);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n      assertListenerIsCalled(listeners[0], times(1));\n\n      assertNoOtherListenerIsCalled();\n\n      if (unlistenReturnType == UnlistenReturnType.BOOLEAN) {\n        assertFalse(ret1);\n        assertFalse(ret2);\n        assertFalse(ret3);\n        assertFalse(ret4);\n        assertTrue(ret5);\n        assertFalse(ret6);\n      } else {\n        assertUndefined(ret1);\n        assertUndefined(ret2);\n        assertUndefined(ret3);\n        assertUndefined(ret4);\n        assertUndefined(ret5);\n        assertUndefined(ret6);\n      }\n    },\n\n    testCapture() {\n      eventTargets[0].setParentEventTarget(eventTargets[1]);\n      eventTargets[1].setParentEventTarget(eventTargets[2]);\n\n      eventTargets[9].setParentEventTarget(eventTargets[0]);\n\n      var ordering = 0;\n      listeners[0] = createListener(function(e) {\n        assertEquals(eventTargets[2], e.currentTarget);\n        assertEquals(eventTargets[0], e.target);\n        assertEquals('First capture listener is not called first', 0, ordering);\n        ordering++;\n      });\n      listeners[1] = createListener(function(e) {\n        assertEquals(eventTargets[1], e.currentTarget);\n        assertEquals(eventTargets[0], e.target);\n        assertEquals('2nd capture listener is not called 2nd', 1, ordering);\n        ordering++;\n      });\n      listeners[2] = createListener(function(e) {\n        assertEquals(eventTargets[0], e.currentTarget);\n        assertEquals(eventTargets[0], e.target);\n        assertEquals('3rd capture listener is not called 3rd', 2, ordering);\n        ordering++;\n      });\n\n      listen(eventTargets[2], EventType.A, listeners[0], true);\n      listen(eventTargets[1], EventType.A, listeners[1], true);\n      listen(eventTargets[0], EventType.A, listeners[2], true);\n\n      // These should not be called.\n      listen(eventTargets[3], EventType.A, listeners[3], true);\n\n      listen(eventTargets[0], EventType.B, listeners[4], true);\n      listen(eventTargets[0], EventType.C, listeners[5], true);\n      listen(eventTargets[1], EventType.B, listeners[6], true);\n      listen(eventTargets[1], EventType.C, listeners[7], true);\n      listen(eventTargets[2], EventType.B, listeners[8], true);\n      listen(eventTargets[2], EventType.C, listeners[9], true);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n      assertListenerIsCalled(listeners[0], times(1));\n      assertListenerIsCalled(listeners[1], times(1));\n      assertListenerIsCalled(listeners[2], times(1));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testBubble() {\n      eventTargets[0].setParentEventTarget(eventTargets[1]);\n      eventTargets[1].setParentEventTarget(eventTargets[2]);\n\n      eventTargets[9].setParentEventTarget(eventTargets[0]);\n\n      var ordering = 0;\n      listeners[0] = createListener(function(e) {\n        assertEquals(eventTargets[0], e.currentTarget);\n        assertEquals(eventTargets[0], e.target);\n        assertEquals('First bubble listener is not called first', 0, ordering);\n        ordering++;\n      });\n      listeners[1] = createListener(function(e) {\n        assertEquals(eventTargets[1], e.currentTarget);\n        assertEquals(eventTargets[0], e.target);\n        assertEquals('2nd bubble listener is not called 2nd', 1, ordering);\n        ordering++;\n      });\n      listeners[2] = createListener(function(e) {\n        assertEquals(eventTargets[2], e.currentTarget);\n        assertEquals(eventTargets[0], e.target);\n        assertEquals('3rd bubble listener is not called 3rd', 2, ordering);\n        ordering++;\n      });\n\n      listen(eventTargets[0], EventType.A, listeners[0]);\n      listen(eventTargets[1], EventType.A, listeners[1]);\n      listen(eventTargets[2], EventType.A, listeners[2]);\n\n      // These should not be called.\n      listen(eventTargets[3], EventType.A, listeners[3]);\n\n      listen(eventTargets[0], EventType.B, listeners[4]);\n      listen(eventTargets[0], EventType.C, listeners[5]);\n      listen(eventTargets[1], EventType.B, listeners[6]);\n      listen(eventTargets[1], EventType.C, listeners[7]);\n      listen(eventTargets[2], EventType.B, listeners[8]);\n      listen(eventTargets[2], EventType.C, listeners[9]);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n      assertListenerIsCalled(listeners[0], times(1));\n      assertListenerIsCalled(listeners[1], times(1));\n      assertListenerIsCalled(listeners[2], times(1));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testCaptureAndBubble() {\n      eventTargets[0].setParentEventTarget(eventTargets[1]);\n      eventTargets[1].setParentEventTarget(eventTargets[2]);\n\n      listen(eventTargets[0], EventType.A, listeners[0], true);\n      listen(eventTargets[1], EventType.A, listeners[1], true);\n      listen(eventTargets[2], EventType.A, listeners[2], true);\n\n      listen(eventTargets[0], EventType.A, listeners[3]);\n      listen(eventTargets[1], EventType.A, listeners[4]);\n      listen(eventTargets[2], EventType.A, listeners[5]);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n      assertListenerIsCalled(listeners[0], times(1));\n      assertListenerIsCalled(listeners[1], times(1));\n      assertListenerIsCalled(listeners[2], times(1));\n      assertListenerIsCalled(listeners[3], times(1));\n      assertListenerIsCalled(listeners[4], times(1));\n      assertListenerIsCalled(listeners[5], times(1));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testPreventDefaultByReturningFalse() {\n      listeners[0] = createListener(function(e) {\n        return false;\n      });\n      listeners[1] = createListener(function(e) {\n        return true;\n      });\n      listen(eventTargets[0], EventType.A, listeners[0]);\n      listen(eventTargets[0], EventType.A, listeners[1]);\n\n      var result = dispatchEvent(eventTargets[0], EventType.A);\n      assertFalse(result);\n    },\n\n    testPreventDefault() {\n      listeners[0] = createListener(function(e) {\n        e.preventDefault();\n      });\n      listeners[1] = createListener(function(e) {\n        return true;\n      });\n      listen(eventTargets[0], EventType.A, listeners[0]);\n      listen(eventTargets[0], EventType.A, listeners[1]);\n\n      var result = dispatchEvent(eventTargets[0], EventType.A);\n      assertFalse(result);\n    },\n\n    testPreventDefaultAtCapture() {\n      listeners[0] = createListener(function(e) {\n        e.preventDefault();\n      });\n      listeners[1] = createListener(function(e) {\n        return true;\n      });\n      listen(eventTargets[0], EventType.A, listeners[0], true);\n      listen(eventTargets[0], EventType.A, listeners[1], true);\n\n      var result = dispatchEvent(eventTargets[0], EventType.A);\n      assertFalse(result);\n    },\n\n    testStopPropagation() {\n      eventTargets[0].setParentEventTarget(eventTargets[1]);\n      eventTargets[1].setParentEventTarget(eventTargets[2]);\n\n      listeners[0] = createListener(function(e) {\n        e.stopPropagation();\n      });\n      listen(eventTargets[0], EventType.A, listeners[0]);\n      listen(eventTargets[0], EventType.A, listeners[1]);\n      listen(eventTargets[1], EventType.A, listeners[2]);\n      listen(eventTargets[2], EventType.A, listeners[3]);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      assertListenerIsCalled(listeners[0], times(1));\n      assertListenerIsCalled(listeners[1], times(1));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testStopPropagation2() {\n      eventTargets[0].setParentEventTarget(eventTargets[1]);\n      eventTargets[1].setParentEventTarget(eventTargets[2]);\n\n      listeners[1] = createListener(function(e) {\n        e.stopPropagation();\n      });\n      listen(eventTargets[0], EventType.A, listeners[0]);\n      listen(eventTargets[0], EventType.A, listeners[1]);\n      listen(eventTargets[1], EventType.A, listeners[2]);\n      listen(eventTargets[2], EventType.A, listeners[3]);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      assertListenerIsCalled(listeners[0], times(1));\n      assertListenerIsCalled(listeners[1], times(1));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testStopPropagation3() {\n      eventTargets[0].setParentEventTarget(eventTargets[1]);\n      eventTargets[1].setParentEventTarget(eventTargets[2]);\n\n      listeners[2] = createListener(function(e) {\n        e.stopPropagation();\n      });\n      listen(eventTargets[0], EventType.A, listeners[0]);\n      listen(eventTargets[0], EventType.A, listeners[1]);\n      listen(eventTargets[1], EventType.A, listeners[2]);\n      listen(eventTargets[2], EventType.A, listeners[3]);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      assertListenerIsCalled(listeners[0], times(1));\n      assertListenerIsCalled(listeners[1], times(1));\n      assertListenerIsCalled(listeners[2], times(1));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testStopPropagationAtCapture() {\n      eventTargets[0].setParentEventTarget(eventTargets[1]);\n      eventTargets[1].setParentEventTarget(eventTargets[2]);\n\n      listeners[0] = createListener(function(e) {\n        e.stopPropagation();\n      });\n      listen(eventTargets[2], EventType.A, listeners[0], true);\n      listen(eventTargets[1], EventType.A, listeners[1], true);\n      listen(eventTargets[0], EventType.A, listeners[2], true);\n      listen(eventTargets[0], EventType.A, listeners[3]);\n      listen(eventTargets[1], EventType.A, listeners[4]);\n      listen(eventTargets[2], EventType.A, listeners[5]);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      assertListenerIsCalled(listeners[0], times(1));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testHandleEvent() {\n      if (!objectTypeListenerSupported) {\n        return;\n      }\n\n      var obj = {};\n      obj.handleEvent = recordFunction();\n\n      listen(eventTargets[0], EventType.A, obj);\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      assertEquals(1, obj.handleEvent.getCallCount());\n    },\n\n    testListenOnce() {\n      if (!listenOnce) {\n        return;\n      }\n\n      listenOnce(eventTargets[0], EventType.A, listeners[0], true);\n      listenOnce(eventTargets[0], EventType.A, listeners[1]);\n      listenOnce(eventTargets[0], EventType.B, listeners[2]);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      assertListenerIsCalled(listeners[0], times(1));\n      assertListenerIsCalled(listeners[1], times(1));\n      assertListenerIsCalled(listeners[2], times(0));\n      assertNoOtherListenerIsCalled();\n      resetListeners();\n\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      assertListenerIsCalled(listeners[0], times(0));\n      assertListenerIsCalled(listeners[1], times(0));\n      assertListenerIsCalled(listeners[2], times(0));\n\n      dispatchEvent(eventTargets[0], EventType.B);\n      assertListenerIsCalled(listeners[2], times(1));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testUnlistenInListen() {\n      listeners[1] = createListener(function(e) {\n        unlisten(eventTargets[0], EventType.A, listeners[1]);\n        unlisten(eventTargets[0], EventType.A, listeners[2]);\n      });\n      listen(eventTargets[0], EventType.A, listeners[0]);\n      listen(eventTargets[0], EventType.A, listeners[1]);\n      listen(eventTargets[0], EventType.A, listeners[2]);\n      listen(eventTargets[0], EventType.A, listeners[3]);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      assertListenerIsCalled(listeners[0], times(1));\n      assertListenerIsCalled(listeners[1], times(1));\n      assertListenerIsCalled(listeners[2], times(0));\n      assertListenerIsCalled(listeners[3], times(1));\n      assertNoOtherListenerIsCalled();\n      resetListeners();\n\n      dispatchEvent(eventTargets[0], EventType.A);\n      assertListenerIsCalled(listeners[0], times(1));\n      assertListenerIsCalled(listeners[1], times(0));\n      assertListenerIsCalled(listeners[2], times(0));\n      assertListenerIsCalled(listeners[3], times(1));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testUnlistenByKeyInListen() {\n      if (!unlistenByKey) {\n        return;\n      }\n\n      var key1, key2;\n      listeners[1] = createListener(function(e) {\n        unlistenByKey(eventTargets[0], key1);\n        unlistenByKey(eventTargets[0], key2);\n      });\n      listen(eventTargets[0], EventType.A, listeners[0]);\n      key1 = listen(eventTargets[0], EventType.A, listeners[1]);\n      key2 = listen(eventTargets[0], EventType.A, listeners[2]);\n      listen(eventTargets[0], EventType.A, listeners[3]);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      assertListenerIsCalled(listeners[0], times(1));\n      assertListenerIsCalled(listeners[1], times(1));\n      assertListenerIsCalled(listeners[2], times(0));\n      assertListenerIsCalled(listeners[3], times(1));\n      assertNoOtherListenerIsCalled();\n      resetListeners();\n\n      dispatchEvent(eventTargets[0], EventType.A);\n      assertListenerIsCalled(listeners[0], times(1));\n      assertListenerIsCalled(listeners[1], times(0));\n      assertListenerIsCalled(listeners[2], times(0));\n      assertListenerIsCalled(listeners[3], times(1));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testSetParentEventTarget() {\n      assertNull(eventTargets[0].getParentEventTarget());\n\n      eventTargets[0].setParentEventTarget(eventTargets[1]);\n      assertEquals(eventTargets[1], eventTargets[0].getParentEventTarget());\n      assertNull(eventTargets[1].getParentEventTarget());\n\n      eventTargets[0].setParentEventTarget(null);\n      assertNull(eventTargets[0].getParentEventTarget());\n    },\n\n    testListenOnceAfterListenDoesNotChangeExistingListener() {\n      if (!listenOnce) {\n        return;\n      }\n\n      listen(eventTargets[0], EventType.A, listeners[0]);\n      listenOnce(eventTargets[0], EventType.A, listeners[0]);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n      dispatchEvent(eventTargets[0], EventType.A);\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      assertListenerIsCalled(listeners[0], times(3));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testListenOnceAfterListenOnceDoesNotChangeExistingListener() {\n      if (!listenOnce) {\n        return;\n      }\n\n      listenOnce(eventTargets[0], EventType.A, listeners[0]);\n      listenOnce(eventTargets[0], EventType.A, listeners[0]);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n      dispatchEvent(eventTargets[0], EventType.A);\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      assertListenerIsCalled(listeners[0], times(1));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testListenAfterListenOnceRemoveOnceness() {\n      if (!listenOnce) {\n        return;\n      }\n\n      listenOnce(eventTargets[0], EventType.A, listeners[0]);\n      listen(eventTargets[0], EventType.A, listeners[0]);\n\n      dispatchEvent(eventTargets[0], EventType.A);\n      dispatchEvent(eventTargets[0], EventType.A);\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      assertListenerIsCalled(listeners[0], times(3));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testUnlistenAfterListenOnce() {\n      if (!listenOnce) {\n        return;\n      }\n\n      listenOnce(eventTargets[0], EventType.A, listeners[0]);\n      unlisten(eventTargets[0], EventType.A, listeners[0]);\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      listen(eventTargets[0], EventType.A, listeners[0]);\n      listenOnce(eventTargets[0], EventType.A, listeners[0]);\n      unlisten(eventTargets[0], EventType.A, listeners[0]);\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      listenOnce(eventTargets[0], EventType.A, listeners[0]);\n      listen(eventTargets[0], EventType.A, listeners[0]);\n      unlisten(eventTargets[0], EventType.A, listeners[0]);\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      listenOnce(eventTargets[0], EventType.A, listeners[0]);\n      listenOnce(eventTargets[0], EventType.A, listeners[0]);\n      unlisten(eventTargets[0], EventType.A, listeners[0]);\n      dispatchEvent(eventTargets[0], EventType.A);\n\n      assertNoOtherListenerIsCalled();\n    },\n\n    testRemoveAllWithType() {\n      if (!removeAll) {\n        return;\n      }\n\n      listen(eventTargets[0], EventType.A, listeners[0], true);\n      listen(eventTargets[0], EventType.A, listeners[1]);\n      listen(eventTargets[0], EventType.C, listeners[2], true);\n      listen(eventTargets[0], EventType.C, listeners[3]);\n      listen(eventTargets[0], EventType.B, listeners[4], true);\n      listen(eventTargets[0], EventType.B, listeners[5], true);\n      listen(eventTargets[0], EventType.B, listeners[6]);\n      listen(eventTargets[0], EventType.B, listeners[7]);\n\n      assertEquals(4, removeAll(eventTargets[0], EventType.B));\n\n      dispatchEvent(eventTargets[0], EventType.A);\n      dispatchEvent(eventTargets[0], EventType.B);\n      dispatchEvent(eventTargets[0], EventType.C);\n\n      assertListenerIsCalled(listeners[0], times(1));\n      assertListenerIsCalled(listeners[1], times(1));\n      assertListenerIsCalled(listeners[2], times(1));\n      assertListenerIsCalled(listeners[3], times(1));\n      assertNoOtherListenerIsCalled();\n    },\n\n    testRemoveAll() {\n      if (!removeAll) {\n        return;\n      }\n\n      listen(eventTargets[0], EventType.A, listeners[0], true);\n      listen(eventTargets[0], EventType.A, listeners[1]);\n      listen(eventTargets[0], EventType.C, listeners[2], true);\n      listen(eventTargets[0], EventType.C, listeners[3]);\n      listen(eventTargets[0], EventType.B, listeners[4], true);\n      listen(eventTargets[0], EventType.B, listeners[5], true);\n      listen(eventTargets[0], EventType.B, listeners[6]);\n      listen(eventTargets[0], EventType.B, listeners[7]);\n\n      assertEquals(8, removeAll(eventTargets[0]));\n\n      dispatchEvent(eventTargets[0], EventType.A);\n      dispatchEvent(eventTargets[0], EventType.B);\n      dispatchEvent(eventTargets[0], EventType.C);\n\n      assertNoOtherListenerIsCalled();\n    },\n\n    testRemoveAllCallsMarkAsRemoved() {\n      if (!removeAll) {\n        return;\n      }\n\n      var key0 = listen(eventTargets[0], EventType.A, listeners[0]);\n      var key1 = listen(eventTargets[1], EventType.A, listeners[1]);\n\n      assertNotNullNorUndefined(key0.listener);\n      assertFalse(key0.removed);\n      assertNotNullNorUndefined(key1.listener);\n      assertFalse(key1.removed);\n\n      assertEquals(1, removeAll(eventTargets[0]));\n      assertNull(key0.listener);\n      assertTrue(key0.removed);\n      assertNotNullNorUndefined(key1.listener);\n      assertFalse(key1.removed);\n\n      assertEquals(1, removeAll(eventTargets[1]));\n      assertNull(key1.listener);\n      assertTrue(key1.removed);\n    },\n\n    testGetListeners() {\n      if (!getListeners) {\n        return;\n      }\n\n      listen(eventTargets[0], EventType.A, listeners[0], true);\n      listen(eventTargets[0], EventType.A, listeners[1], true);\n      listen(eventTargets[0], EventType.A, listeners[2]);\n      listen(eventTargets[0], EventType.A, listeners[3]);\n\n      var l = getListeners(eventTargets[0], EventType.A, true);\n      assertEquals(2, l.length);\n      assertEquals(listeners[0], l[0].listener);\n      assertEquals(listeners[1], l[1].listener);\n\n      l = getListeners(eventTargets[0], EventType.A, false);\n      assertEquals(2, l.length);\n      assertEquals(listeners[2], l[0].listener);\n      assertEquals(listeners[3], l[1].listener);\n\n      l = getListeners(eventTargets[0], EventType.B, true);\n      assertEquals(0, l.length);\n    },\n\n    testGetListener() {\n      if (!getListener) {\n        return;\n      }\n\n      listen(eventTargets[0], EventType.A, listeners[0], true);\n\n      assertNotNull(\n          getListener(eventTargets[0], EventType.A, listeners[0], true));\n      assertNull(\n          getListener(eventTargets[0], EventType.A, listeners[0], true, {}));\n      assertNull(getListener(eventTargets[1], EventType.A, listeners[0], true));\n      assertNull(getListener(eventTargets[0], EventType.B, listeners[0], true));\n      assertNull(getListener(eventTargets[0], EventType.A, listeners[1], true));\n    },\n\n    testHasListener() {\n      if (!hasListener) {\n        return;\n      }\n\n      assertFalse(hasListener(eventTargets[0]));\n\n      listen(eventTargets[0], EventType.A, listeners[0], true);\n\n      assertTrue(hasListener(eventTargets[0]));\n      assertTrue(hasListener(eventTargets[0], EventType.A));\n      assertTrue(hasListener(eventTargets[0], EventType.A, true));\n      assertTrue(hasListener(eventTargets[0], undefined, true));\n      assertFalse(hasListener(eventTargets[0], EventType.A, false));\n      assertFalse(hasListener(eventTargets[0], undefined, false));\n      assertFalse(hasListener(eventTargets[0], EventType.B));\n      assertFalse(hasListener(eventTargets[0], EventType.B, true));\n      assertFalse(hasListener(eventTargets[1]));\n    },\n\n    testFiringEventBeforeDisposeInternalWorks() {\n      /**\n       * @extends {GoogEventsEventTarget}\n       * @constructor\n       * @final\n       */\n      var MockTarget = function() {\n        MockTarget.base(this, 'constructor');\n      };\n      goog.inherits(MockTarget, GoogEventsEventTarget);\n\n      MockTarget.prototype.disposeInternal = function() {\n        dispatchEvent(this, EventType.A);\n        MockTarget.base(this, 'disposeInternal');\n      };\n\n      var t = new MockTarget();\n      try {\n        listen(t, EventType.A, listeners[0]);\n        t.dispose();\n        assertListenerIsCalled(listeners[0], times(1));\n      } catch (e) {\n        goog.dispose(t);\n      }\n    },\n\n    testLoopDetection() {\n      var target = listenableFactory();\n      target.setParentEventTarget(target);\n\n      try {\n        target.dispatchEvent('string');\n        fail('expected error');\n      } catch (e) {\n        assertContains('infinite', e.message);\n      }\n    }\n  }\n};\n","^?",1579837703000,"^@",["^A",["^1L","^4=","^3","^1M","~$goog.testing.recordFunction","~$goog.events.Event","^1S"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/eventtargettester.js"],"^S",["^A",["~$goog.events.eventTargetTester"]],"^1",true,"^2",["^3","^VS","^1M","^1L","^1S","^VR","^4="]],["^ ","^7",[1579837703000],"^8","goog.ui.palette.js","^9",["^:","goog/ui/palette.js"],"^;","goog/ui/palette.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A palette control.  A palette is a grid that the user can\n * highlight or select via the keyboard or the mouse.\n *\n * @author attila@google.com (Attila Bodis)\n * @see ../demos/palette.html\n */\n\ngoog.provide('goog.ui.Palette');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.math.Size');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Control');\ngoog.require('goog.ui.PaletteRenderer');\ngoog.require('goog.ui.SelectionModel');\n\n\n\n/**\n * A palette is a grid of DOM nodes that the user can highlight or select via\n * the keyboard or the mouse.  The selection state of the palette is controlled\n * an ACTION event.  Event listeners may retrieve the selected item using the\n * {@link #getSelectedItem} or {@link #getSelectedIndex} method.\n *\n * Use this class as the base for components like color palettes or emoticon\n * pickers.  Use {@link #setContent} to set/change the items in the palette\n * after construction.  See palette.html demo for example usage.\n *\n * @param {Array<Node>} items Array of DOM nodes to be displayed as items\n *     in the palette grid (limited to one per cell).\n * @param {goog.ui.PaletteRenderer=} opt_renderer Renderer used to render or\n *     decorate the palette; defaults to {@link goog.ui.PaletteRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.Control}\n */\ngoog.ui.Palette = function(items, opt_renderer, opt_domHelper) {\n  goog.ui.Palette.base(\n      this, 'constructor', items,\n      opt_renderer || goog.ui.PaletteRenderer.getInstance(), opt_domHelper);\n  this.setAutoStates(\n      goog.ui.Component.State.CHECKED | goog.ui.Component.State.SELECTED |\n          goog.ui.Component.State.OPENED,\n      false);\n\n  /**\n   * A fake component for dispatching events on palette cell changes.\n   * @type {!goog.ui.Palette.CurrentCell_}\n   * @private\n   */\n  this.currentCellControl_ = new goog.ui.Palette.CurrentCell_();\n  this.currentCellControl_.setParentEventTarget(this);\n\n  /**\n   * @private {number} The last highlighted index, or -1 if it never had one.\n   */\n  this.lastHighlightedIndex_ = -1;\n};\ngoog.inherits(goog.ui.Palette, goog.ui.Control);\ngoog.tagUnsealableClass(goog.ui.Palette);\n\n\n/**\n * Events fired by the palette object\n * @enum {string}\n */\ngoog.ui.Palette.EventType = {\n  AFTER_HIGHLIGHT: goog.events.getUniqueId('afterhighlight')\n};\n\n\n/**\n * Palette dimensions (columns x rows).  If the number of rows is undefined,\n * it is calculated on first use.\n * @type {?goog.math.Size}\n * @private\n */\ngoog.ui.Palette.prototype.size_ = null;\n\n\n/**\n * Index of the currently highlighted item (-1 if none).\n * @type {number}\n * @private\n */\ngoog.ui.Palette.prototype.highlightedIndex_ = -1;\n\n\n/**\n * Selection model controlling the palette's selection state.\n * @type {?goog.ui.SelectionModel}\n * @private\n */\ngoog.ui.Palette.prototype.selectionModel_ = null;\n\n\n// goog.ui.Component / goog.ui.Control implementation.\n\n\n/** @override */\ngoog.ui.Palette.prototype.disposeInternal = function() {\n  goog.ui.Palette.superClass_.disposeInternal.call(this);\n\n  if (this.selectionModel_) {\n    this.selectionModel_.dispose();\n    this.selectionModel_ = null;\n  }\n\n  this.size_ = null;\n\n  this.currentCellControl_.dispose();\n};\n\n\n/**\n * Overrides {@link goog.ui.Control#setContentInternal} by also updating the\n * grid size and the selection model.  Considered protected.\n * @param {goog.ui.ControlContent} content Array of DOM nodes to be displayed\n *     as items in the palette grid (one item per cell).\n * @protected\n * @override\n */\ngoog.ui.Palette.prototype.setContentInternal = function(content) {\n  var items = /** @type {Array<Node>} */ (content);\n  goog.ui.Palette.superClass_.setContentInternal.call(this, items);\n\n  // Adjust the palette size.\n  this.adjustSize_();\n\n  // Add the items to the selection model, replacing previous items (if any).\n  if (this.selectionModel_) {\n    // We already have a selection model; just replace the items.\n    this.selectionModel_.clear();\n    this.selectionModel_.addItems(items);\n  } else {\n    // Create a selection model, initialize the items, and hook up handlers.\n    this.selectionModel_ = new goog.ui.SelectionModel(items);\n    this.selectionModel_.setSelectionHandler(goog.bind(this.selectItem_, this));\n    this.getHandler().listen(\n        this.selectionModel_, goog.events.EventType.SELECT,\n        this.handleSelectionChange);\n  }\n\n  // In all cases, clear the highlight.\n  this.highlightedIndex_ = -1;\n};\n\n\n/**\n * Overrides {@link goog.ui.Control#getCaption} to return the empty string,\n * since palettes don't have text captions.\n * @return {string} The empty string.\n * @override\n */\ngoog.ui.Palette.prototype.getCaption = function() {\n  return '';\n};\n\n\n/**\n * Overrides {@link goog.ui.Control#setCaption} to be a no-op, since palettes\n * don't have text captions.\n * @param {string} caption Ignored.\n * @override\n */\ngoog.ui.Palette.prototype.setCaption = function(caption) {\n  // Do nothing.\n};\n\n\n// Palette event handling.\n\n\n/**\n * Handles mouseover events.  Overrides {@link goog.ui.Control#handleMouseOver}\n * by determining which palette item (if any) was moused over, highlighting it,\n * and un-highlighting any previously-highlighted item.\n * @param {goog.events.BrowserEvent} e Mouse event to handle.\n * @override\n */\ngoog.ui.Palette.prototype.handleMouseOver = function(e) {\n  goog.ui.Palette.superClass_.handleMouseOver.call(this, e);\n\n  var item = this.getRenderer().getContainingItem(this, e.target);\n  if (item && e.relatedTarget && goog.dom.contains(item, e.relatedTarget)) {\n    // Ignore internal mouse moves.\n    return;\n  }\n\n  if (item != this.getHighlightedItem()) {\n    this.setHighlightedItem(item);\n  }\n};\n\n\n/**\n * Handles mousedown events.  Overrides {@link goog.ui.Control#handleMouseDown}\n * by ensuring that the item on which the user moused down is highlighted.\n * @param {goog.events.Event} e Mouse event to handle.\n * @override\n */\ngoog.ui.Palette.prototype.handleMouseDown = function(e) {\n  goog.ui.Palette.superClass_.handleMouseDown.call(this, e);\n\n  if (this.isActive()) {\n    // Make sure we move the highlight to the cell on which the user moused\n    // down.\n    var item = this.getRenderer().getContainingItem(this, e.target);\n    if (item != this.getHighlightedItem()) {\n      this.setHighlightedItem(item);\n    }\n  }\n};\n\n\n/**\n * Selects the currently highlighted palette item (triggered by mouseup or by\n * keyboard action).  Overrides {@link goog.ui.Control#performActionInternal}\n * by selecting the highlighted item and dispatching an ACTION event.\n * @param {goog.events.Event} e Mouse or key event that triggered the action.\n * @return {boolean} True if the action was allowed to proceed, false otherwise.\n * @override\n */\ngoog.ui.Palette.prototype.performActionInternal = function(e) {\n  var highlightedItem = this.getHighlightedItem();\n  if (highlightedItem) {\n    if (e && this.shouldSelectHighlightedItem_(e)) {\n      this.setSelectedItem(highlightedItem);\n    }\n    return goog.ui.Palette.base(this, 'performActionInternal', e);\n  }\n  return false;\n};\n\n\n/**\n * Determines whether to select the highlighted item while handling an internal\n * action. The highlighted item should not be selected if the action is a mouse\n * event occurring outside the palette or in an \"empty\" cell.\n * @param {!goog.events.Event} e Mouseup or key event being handled.\n * @return {boolean} True if the highlighted item should be selected.\n * @private\n */\ngoog.ui.Palette.prototype.shouldSelectHighlightedItem_ = function(e) {\n  if (!this.getSelectedItem()) {\n    // It's always ok to select when nothing is selected yet.\n    return true;\n  } else if (e.type != 'mouseup') {\n    // Keyboard can only act on valid cells.\n    return true;\n  } else {\n    // Return whether or not the mouse action was in the palette.\n    return !!this.getRenderer().getContainingItem(this, e.target);\n  }\n};\n\n\n/**\n * Handles keyboard events dispatched while the palette has focus.  Moves the\n * highlight on arrow keys, and selects the highlighted item on Enter or Space.\n * Returns true if the event was handled, false otherwise.  In particular, if\n * the user attempts to navigate out of the grid, the highlight isn't changed,\n * and this method returns false; it is then up to the parent component to\n * handle the event (e.g. by wrapping the highlight around).  Overrides {@link\n * goog.ui.Control#handleKeyEvent}.\n * @param {goog.events.KeyEvent} e Key event to handle.\n * @return {boolean} True iff the key event was handled by the component.\n * @override\n */\ngoog.ui.Palette.prototype.handleKeyEvent = function(e) {\n  var items = this.getContent();\n  var numItems = items ? items.length : 0;\n  var numColumns = this.size_.width;\n\n  // If the component is disabled or the palette is empty, bail.\n  if (numItems == 0 || !this.isEnabled()) {\n    return false;\n  }\n\n  // User hit ENTER or SPACE; trigger action.\n  if (e.keyCode == goog.events.KeyCodes.ENTER ||\n      e.keyCode == goog.events.KeyCodes.SPACE) {\n    return this.performActionInternal(e);\n  }\n\n  // User hit HOME or END; move highlight.\n  if (e.keyCode == goog.events.KeyCodes.HOME) {\n    this.setHighlightedIndex(0);\n    return true;\n  } else if (e.keyCode == goog.events.KeyCodes.END) {\n    this.setHighlightedIndex(numItems - 1);\n    return true;\n  }\n\n  // If nothing is highlighted, start from the selected index.  If nothing is\n  // selected either, highlightedIndex is -1.\n  var highlightedIndex = this.highlightedIndex_ < 0 ? this.getSelectedIndex() :\n                                                      this.highlightedIndex_;\n\n  switch (e.keyCode) {\n    case goog.events.KeyCodes.LEFT:\n      // If the highlighted index is uninitialized, or is at the beginning, move\n      // it to the end.\n      if (highlightedIndex == -1 || highlightedIndex == 0) {\n        highlightedIndex = numItems;\n      }\n      this.setHighlightedIndex(highlightedIndex - 1);\n      e.preventDefault();\n      return true;\n      break;\n\n    case goog.events.KeyCodes.RIGHT:\n      // If the highlighted index at the end, move it to the beginning.\n      if (highlightedIndex == numItems - 1) {\n        highlightedIndex = -1;\n      }\n      this.setHighlightedIndex(highlightedIndex + 1);\n      e.preventDefault();\n      return true;\n      break;\n\n    case goog.events.KeyCodes.UP:\n      if (highlightedIndex == -1) {\n        highlightedIndex = numItems + numColumns - 1;\n      }\n      if (highlightedIndex >= numColumns) {\n        this.setHighlightedIndex(highlightedIndex - numColumns);\n        e.preventDefault();\n        return true;\n      }\n      break;\n\n    case goog.events.KeyCodes.DOWN:\n      if (highlightedIndex == -1) {\n        highlightedIndex = -numColumns;\n      }\n      if (highlightedIndex < numItems - numColumns) {\n        this.setHighlightedIndex(highlightedIndex + numColumns);\n        e.preventDefault();\n        return true;\n      }\n      break;\n  }\n\n  return false;\n};\n\n\n/**\n * Handles selection change events dispatched by the selection model.\n * @param {goog.events.Event} e Selection event to handle.\n */\ngoog.ui.Palette.prototype.handleSelectionChange = function(e) {\n  // No-op in the base class.\n};\n\n\n// Palette management.\n\n\n/**\n * Returns the size of the palette grid.\n * @return {goog.math.Size} Palette size (columns x rows).\n */\ngoog.ui.Palette.prototype.getSize = function() {\n  return this.size_;\n};\n\n\n/**\n * Sets the size of the palette grid to the given size.  Callers can either\n * pass a single {@link goog.math.Size} or a pair of numbers (first the number\n * of columns, then the number of rows) to this method.  In both cases, the\n * number of rows is optional and will be calculated automatically if needed.\n * It is an error to attempt to change the size of the palette after it has\n * been rendered.\n * @param {goog.math.Size|number} size Either a size object or the number of\n *     columns.\n * @param {number=} opt_rows The number of rows (optional).\n */\ngoog.ui.Palette.prototype.setSize = function(size, opt_rows) {\n  if (this.getElement()) {\n    throw new Error(goog.ui.Component.Error.ALREADY_RENDERED);\n  }\n\n  this.size_ = (typeof size === 'number') ?\n      new goog.math.Size(size, /** @type {number} */ (opt_rows)) :\n      size;\n\n  // Adjust size, if needed.\n  this.adjustSize_();\n};\n\n\n/**\n * Returns the 0-based index of the currently highlighted palette item, or -1\n * if no item is highlighted.\n * @return {number} Index of the highlighted item (-1 if none).\n */\ngoog.ui.Palette.prototype.getHighlightedIndex = function() {\n  return this.highlightedIndex_;\n};\n\n\n/**\n * Returns the currently highlighted palette item, or null if no item is\n * highlighted.\n * @return {Node} The highlighted item (undefined if none).\n */\ngoog.ui.Palette.prototype.getHighlightedItem = function() {\n  var items = this.getContent();\n  return items && items[this.highlightedIndex_];\n};\n\n\n/**\n * @return {Element} The highlighted cell.\n * @private\n */\ngoog.ui.Palette.prototype.getHighlightedCellElement_ = function() {\n  return this.getRenderer().getCellForItem(this.getHighlightedItem());\n};\n\n\n/**\n * Highlights the item at the given 0-based index, or removes the highlight\n * if the argument is -1 or out of range.  Any previously-highlighted item\n * will be un-highlighted.\n * @param {number} index 0-based index of the item to highlight.\n */\ngoog.ui.Palette.prototype.setHighlightedIndex = function(index) {\n  if (index != this.highlightedIndex_) {\n    this.highlightIndex_(this.highlightedIndex_, false);\n    this.lastHighlightedIndex_ = this.highlightedIndex_;\n    this.highlightedIndex_ = index;\n    this.highlightIndex_(index, true);\n    this.dispatchEvent(goog.ui.Palette.EventType.AFTER_HIGHLIGHT);\n  }\n};\n\n\n/**\n * Highlights the given item, or removes the highlight if the argument is null\n * or invalid.  Any previously-highlighted item will be un-highlighted.\n * @param {Node|undefined} item Item to highlight.\n */\ngoog.ui.Palette.prototype.setHighlightedItem = function(item) {\n  var items = /** @type {Array<Node>} */ (this.getContent());\n  this.setHighlightedIndex(\n      (items && item) ? goog.array.indexOf(items, item) : -1);\n};\n\n\n/**\n * Returns the 0-based index of the currently selected palette item, or -1\n * if no item is selected.\n * @return {number} Index of the selected item (-1 if none).\n */\ngoog.ui.Palette.prototype.getSelectedIndex = function() {\n  return this.selectionModel_ ? this.selectionModel_.getSelectedIndex() : -1;\n};\n\n\n/**\n * Returns the currently selected palette item, or null if no item is selected.\n * @return {Node} The selected item (null if none).\n */\ngoog.ui.Palette.prototype.getSelectedItem = function() {\n  return this.selectionModel_ ?\n      /** @type {Node} */ (this.selectionModel_.getSelectedItem()) :\n                          null;\n};\n\n\n/**\n * Selects the item at the given 0-based index, or clears the selection\n * if the argument is -1 or out of range.  Any previously-selected item\n * will be deselected.\n * @param {number} index 0-based index of the item to select.\n */\ngoog.ui.Palette.prototype.setSelectedIndex = function(index) {\n  if (this.selectionModel_) {\n    this.selectionModel_.setSelectedIndex(index);\n  }\n};\n\n\n/**\n * Selects the given item, or clears the selection if the argument is null or\n * invalid.  Any previously-selected item will be deselected.\n * @param {Node} item Item to select.\n */\ngoog.ui.Palette.prototype.setSelectedItem = function(item) {\n  if (this.selectionModel_) {\n    this.selectionModel_.setSelectedItem(item);\n  }\n};\n\n\n/**\n * Private helper; highlights or un-highlights the item at the given index\n * based on the value of the Boolean argument.  This implementation simply\n * applies highlight styling to the cell containing the item to be highighted.\n * Does nothing if the palette hasn't been rendered yet.\n * @param {number} index 0-based index of item to highlight or un-highlight.\n * @param {boolean} highlight If true, the item is highlighted; otherwise it\n *     is un-highlighted.\n * @private\n */\ngoog.ui.Palette.prototype.highlightIndex_ = function(index, highlight) {\n  if (this.getElement()) {\n    var items = this.getContent();\n    if (items && index >= 0 && index < items.length) {\n      var cellEl = this.getHighlightedCellElement_();\n      if (this.currentCellControl_.getElement() != cellEl) {\n        this.currentCellControl_.setElementInternal(cellEl);\n      }\n      if (this.currentCellControl_.tryHighlight(highlight)) {\n        this.getRenderer().highlightCell(this, items[index], highlight);\n      }\n    }\n  }\n};\n\n\n/** @override */\ngoog.ui.Palette.prototype.setHighlighted = function(highlight) {\n  if (highlight && this.highlightedIndex_ == -1) {\n    // If there was a last highlighted index, use that. Otherwise, highlight the\n    // first cell.\n    this.setHighlightedIndex(\n        this.lastHighlightedIndex_ > -1 ? this.lastHighlightedIndex_ : 0);\n  } else if (!highlight) {\n    this.setHighlightedIndex(-1);\n  }\n  // The highlight event should be fired once the component has updated its own\n  // state.\n  goog.ui.Palette.base(this, 'setHighlighted', highlight);\n};\n\n\n/**\n * Private helper; selects or deselects the given item based on the value of\n * the Boolean argument.  This implementation simply applies selection styling\n * to the cell containing the item to be selected.  Does nothing if the palette\n * hasn't been rendered yet.\n * @param {Node} item Item to select or deselect.\n * @param {boolean} select If true, the item is selected; otherwise it is\n *     deselected.\n * @private\n */\ngoog.ui.Palette.prototype.selectItem_ = function(item, select) {\n  if (this.getElement()) {\n    this.getRenderer().selectCell(this, item, select);\n  }\n};\n\n\n/**\n * Calculates and updates the size of the palette based on any preset values\n * and the number of palette items.  If there is no preset size, sets the\n * palette size to the smallest square big enough to contain all items.  If\n * there is a preset number of columns, increases the number of rows to hold\n * all items if needed.  (If there are too many rows, does nothing.)\n * @private\n */\ngoog.ui.Palette.prototype.adjustSize_ = function() {\n  var items = this.getContent();\n  if (items) {\n    if (this.size_ && this.size_.width) {\n      // There is already a size set; honor the number of columns (if >0), but\n      // increase the number of rows if needed.\n      var minRows = Math.ceil(items.length / this.size_.width);\n      if (typeof this.size_.height !== 'number' ||\n          this.size_.height < minRows) {\n        this.size_.height = minRows;\n      }\n    } else {\n      // No size has been set; size the grid to the smallest square big enough\n      // to hold all items (hey, why not?).\n      var length = Math.ceil(Math.sqrt(items.length));\n      this.size_ = new goog.math.Size(length, length);\n    }\n  } else {\n    // No items; set size to 0x0.\n    this.size_ = new goog.math.Size(0, 0);\n  }\n};\n\n\n\n/**\n * A component to represent the currently highlighted cell.\n * @constructor\n * @extends {goog.ui.Control}\n * @private\n */\ngoog.ui.Palette.CurrentCell_ = function() {\n  goog.ui.Palette.CurrentCell_.base(this, 'constructor', null);\n  this.setDispatchTransitionEvents(goog.ui.Component.State.HOVER, true);\n};\ngoog.inherits(goog.ui.Palette.CurrentCell_, goog.ui.Control);\n\n\n/**\n * @param {boolean} highlight Whether to highlight or unhighlight the component.\n * @return {boolean} Whether it was successful.\n */\ngoog.ui.Palette.CurrentCell_.prototype.tryHighlight = function(highlight) {\n  this.setHighlighted(highlight);\n  return this.isHighlighted() == highlight;\n};\n","^?",1579837703000,"^@",["^A",["^14","^1B","^20","^3","^1C","^UT","^T5","~$goog.ui.SelectionModel","^45","^1S","^1N"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/palette.js"],"^S",["^A",["~$goog.ui.Palette"]],"^1",true,"^2",["^3","^1S","^14","^1N","^1C","^45","^20","^1B","^T5","^UT","^VU"]],["^ ","^7",[1579837703000],"^8","goog.datasource.datamanager.js","^9",["^:","goog/datasource/datamanager.js"],"^;","goog/datasource/datamanager.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview\n * Central class for registering and accessing data sources\n * Also handles processing of data events.\n *\n * There is a shared global instance that most client code should access via\n * goog.ds.DataManager.getInstance(). However you can also create your own\n * DataManager using new\n *\n * Implements DataNode to provide the top element in a data registry\n * Prepends '$' to top level data names in path to denote they are root object\n *\n */\ngoog.provide('goog.ds.DataManager');\n\ngoog.require('goog.ds.BasicNodeList');\ngoog.require('goog.ds.DataNode');\ngoog.require('goog.ds.Expr');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.structs');\ngoog.require('goog.structs.Map');\n\n\n\n/**\n * Create a DataManger\n * @extends {goog.ds.DataNode}\n * @constructor\n * @final\n */\ngoog.ds.DataManager = function() {\n  this.dataSources_ = new goog.ds.BasicNodeList();\n  this.autoloads_ = new goog.structs.Map();\n  this.listenerMap_ = {};\n  this.listenersByFunction_ = {};\n  this.aliases_ = {};\n  this.eventCount_ = 0;\n  this.indexedListenersByFunction_ = {};\n};\n\n\n/**\n * Global instance\n * @private\n */\ngoog.ds.DataManager.instance_ = null;\ngoog.inherits(goog.ds.DataManager, goog.ds.DataNode);\n\n\n/**\n * Get the global instance\n * @return {!goog.ds.DataManager} The data manager singleton.\n */\ngoog.ds.DataManager.getInstance = function() {\n  if (!goog.ds.DataManager.instance_) {\n    goog.ds.DataManager.instance_ = new goog.ds.DataManager();\n  }\n  return goog.ds.DataManager.instance_;\n};\n\n\n/**\n * Clears the global instance (for unit tests to reset state).\n */\ngoog.ds.DataManager.clearInstance = function() {\n  goog.ds.DataManager.instance_ = null;\n};\n\n\n/**\n * Add a data source\n * @param {goog.ds.DataNode} ds The data source.\n * @param {boolean=} opt_autoload Whether to automatically load the data,\n *   defaults to false.\n * @param {string=} opt_name Optional name, can also get name\n *   from the datasource.\n */\ngoog.ds.DataManager.prototype.addDataSource = function(\n    ds, opt_autoload, opt_name) {\n  var autoload = !!opt_autoload;\n  var name = opt_name || ds.getDataName();\n  if (!goog.string.startsWith(name, '$')) {\n    name = '$' + name;\n  }\n  ds.setDataName(name);\n  this.dataSources_.add(ds);\n  this.autoloads_.set(name, autoload);\n};\n\n\n/**\n * Create an alias for a data path, very similar to assigning a variable.\n * For example, you can set $CurrentContact -> $Request/Contacts[5], and all\n * references to $CurrentContact will be procesed on $Request/Contacts[5].\n *\n * Aliases will hide datasources of the same name.\n *\n * @param {string} name Alias name, must be a top level path ($Foo).\n * @param {string} dataPath Data path being aliased.\n */\ngoog.ds.DataManager.prototype.aliasDataSource = function(name, dataPath) {\n  if (!this.aliasListener_) {\n    this.aliasListener_ = goog.bind(this.listenForAlias_, this);\n  }\n  if (this.aliases_[name]) {\n    var oldPath = this.aliases_[name].getSource();\n    this.removeListeners(this.aliasListener_, oldPath + '/...', name);\n  }\n  this.aliases_[name] = goog.ds.Expr.create(dataPath);\n  this.addListener(this.aliasListener_, dataPath + '/...', name);\n  this.fireDataChange(name);\n};\n\n\n/**\n * Listener function for matches of paths that have been aliased.\n * Fires a data change on the alias as well.\n *\n * @param {string} dataPath Path of data event fired.\n * @param {string} name Name of the alias.\n * @private\n */\ngoog.ds.DataManager.prototype.listenForAlias_ = function(dataPath, name) {\n  var aliasedExpr = this.aliases_[name];\n\n  if (aliasedExpr) {\n    // If it's a subpath, appends the subpath to the alias name\n    // otherwise just fires on the top level alias\n    var aliasedPath = aliasedExpr.getSource();\n    if (dataPath.indexOf(aliasedPath) == 0) {\n      this.fireDataChange(name + dataPath.substring(aliasedPath.length));\n    } else {\n      this.fireDataChange(name);\n    }\n  }\n};\n\n\n/**\n * Gets a named child node of the current node.\n *\n * @param {string} name The node name.\n * @return {goog.ds.DataNode} The child node,\n *   or null if no node of this name exists.\n */\ngoog.ds.DataManager.prototype.getDataSource = function(name) {\n  if (this.aliases_[name]) {\n    return this.aliases_[name].getNode();\n  } else {\n    return this.dataSources_.get(name);\n  }\n};\n\n\n/**\n * Get the value of the node\n * @return {!Object} The value of the node.\n * @override\n */\ngoog.ds.DataManager.prototype.get = function() {\n  return this.dataSources_;\n};\n\n\n/** @override */\ngoog.ds.DataManager.prototype.set = function(value) {\n  throw new Error('Can\\'t set on DataManager');\n};\n\n\n/** @override */\ngoog.ds.DataManager.prototype.getChildNodes = function(opt_selector) {\n  if (opt_selector) {\n    return new goog.ds.BasicNodeList(\n        [this.getChildNode(/** @type {string} */ (opt_selector))]);\n  } else {\n    return this.dataSources_;\n  }\n};\n\n\n/**\n * Gets a named child node of the current node\n * @param {string} name The node name.\n * @return {goog.ds.DataNode} The child node,\n *     or null if no node of this name exists.\n * @override\n */\ngoog.ds.DataManager.prototype.getChildNode = function(name) {\n  return this.getDataSource(name);\n};\n\n\n/** @override */\ngoog.ds.DataManager.prototype.getChildNodeValue = function(name) {\n  var ds = this.getDataSource(name);\n  return ds ? ds.get() : null;\n};\n\n\n/**\n * Get the name of the node relative to the parent node\n * @return {string} The name of the node.\n * @override\n */\ngoog.ds.DataManager.prototype.getDataName = function() {\n  return '';\n};\n\n\n/**\n * Gets the a qualified data path to this node\n * @return {string} The data path.\n * @override\n */\ngoog.ds.DataManager.prototype.getDataPath = function() {\n  return '';\n};\n\n\n/**\n * Load or reload the backing data for this node\n * only loads datasources flagged with autoload\n * @override\n */\ngoog.ds.DataManager.prototype.load = function() {\n  var len = this.dataSources_.getCount();\n  for (var i = 0; i < len; i++) {\n    var ds = this.dataSources_.getByIndex(i);\n    var autoload = this.autoloads_.get(ds.getDataName());\n    if (autoload) {\n      ds.load();\n    }\n  }\n};\n\n\n/**\n * Gets the state of the backing data for this node\n * @return {goog.ds.LoadState} The state.\n * @override\n */\ngoog.ds.DataManager.prototype.getLoadState = goog.abstractMethod;\n\n\n/**\n * Whether the value of this node is a homogeneous list of data\n * @return {boolean} True if a list.\n * @override\n */\ngoog.ds.DataManager.prototype.isList = function() {\n  return false;\n};\n\n\n/**\n * Get the total count of events fired (mostly for debugging)\n * @return {number} Count of events.\n */\ngoog.ds.DataManager.prototype.getEventCount = function() {\n  return this.eventCount_;\n};\n\n\n/**\n * Adds a listener\n * Listeners should fire when any data with path that has dataPath as substring\n * is changed.\n * TODO(user) Look into better listener handling\n *\n * @param {Function} fn Callback function, signature function(dataPath, id).\n * @param {string} dataPath Fully qualified data path.\n * @param {string=} opt_id A value passed back to the listener when the dataPath\n *   is matched.\n */\ngoog.ds.DataManager.prototype.addListener = function(fn, dataPath, opt_id) {\n  // maxAncestor sets how distant an ancestor you can be of the fired event\n  // and still fire (you always fire if you are a descendant).\n  // 0 means you don't fire if you are an ancestor\n  // 1 means you only fire if you are parent\n  // 1000 means you will fire if you are ancestor (effectively infinite)\n  var maxAncestors = 0;\n  if (goog.string.endsWith(dataPath, '/...')) {\n    maxAncestors = 1000;\n    dataPath = dataPath.substring(0, dataPath.length - 4);\n  } else if (goog.string.endsWith(dataPath, '/*')) {\n    maxAncestors = 1;\n    dataPath = dataPath.substring(0, dataPath.length - 2);\n  }\n\n  opt_id = opt_id || '';\n  var key = dataPath + ':' + opt_id + ':' + goog.getUid(fn);\n  var listener = {dataPath: dataPath, id: opt_id, fn: fn};\n  var expr = goog.ds.Expr.create(dataPath);\n\n  var fnUid = goog.getUid(fn);\n  if (!this.listenersByFunction_[fnUid]) {\n    this.listenersByFunction_[fnUid] = {};\n  }\n  this.listenersByFunction_[fnUid][key] = {listener: listener, items: []};\n\n  while (expr) {\n    var listenerSpec = {listener: listener, maxAncestors: maxAncestors};\n    var matchingListeners = this.listenerMap_[expr.getSource()];\n    if (matchingListeners == null) {\n      matchingListeners = {};\n      this.listenerMap_[expr.getSource()] = matchingListeners;\n    }\n    matchingListeners[key] = listenerSpec;\n    maxAncestors = 0;\n    expr = expr.getParent();\n    this.listenersByFunction_[fnUid][key].items.push(\n        {key: key, obj: matchingListeners});\n  }\n};\n\n\n/**\n * Adds an indexed listener.\n *\n * Indexed listeners allow for '*' in data paths. If a * exists, will match\n * all values and return the matched values in an array to the callback.\n *\n * Currently uses a promiscuous match algorithm: Matches everything before the\n * first '*', and then does a regex match for all of the returned events.\n * Although this isn't optimized, it is still an improvement as you can collapse\n * 100's of listeners into a single regex match\n *\n * @param {Function} fn Callback function, signature (dataPath, id, indexes).\n * @param {string} dataPath Fully qualified data path.\n * @param {string=} opt_id A value passed back to the listener when the dataPath\n *   is matched.\n */\ngoog.ds.DataManager.prototype.addIndexedListener = function(\n    fn, dataPath, opt_id) {\n  var firstStarPos = dataPath.indexOf('*');\n  // Just need a regular listener\n  if (firstStarPos == -1) {\n    this.addListener(fn, dataPath, opt_id);\n    return;\n  }\n\n  var listenPath = dataPath.substring(0, firstStarPos) + '...';\n\n  // Create regex that matches * to any non '\\' character\n  var ext = '$';\n  if (goog.string.endsWith(dataPath, '/...')) {\n    dataPath = dataPath.substring(0, dataPath.length - 4);\n    ext = '';\n  }\n  var regExpPath = goog.string.regExpEscape(dataPath);\n  var matchRegExp = regExpPath.replace(/\\\\\\*/g, '([^\\\\\\/]+)') + ext;\n\n  // Matcher function applies the regex and calls back the original function\n  // if the regex matches, passing in an array of the matched values\n  var matchRegExpRe = new RegExp(matchRegExp);\n  var matcher = function(path, id) {\n    var match = matchRegExpRe.exec(path);\n    if (match) {\n      match.shift();\n      fn(path, opt_id, match);\n    }\n  };\n  this.addListener(matcher, listenPath, opt_id);\n\n  // Add the indexed listener to the map so that we can remove it later.\n  var fnUid = goog.getUid(fn);\n  if (!this.indexedListenersByFunction_[fnUid]) {\n    this.indexedListenersByFunction_[fnUid] = {};\n  }\n  var key = dataPath + ':' + opt_id;\n  this.indexedListenersByFunction_[fnUid][key] = {\n    listener: {dataPath: listenPath, fn: matcher, id: opt_id}\n  };\n};\n\n\n/**\n * Removes indexed listeners with a given callback function, and optional\n * matching datapath and matching id.\n *\n * @param {Function} fn Callback function, signature function(dataPath, id).\n * @param {string=} opt_dataPath Fully qualified data path.\n * @param {string=} opt_id A value passed back to the listener when the dataPath\n *   is matched.\n */\ngoog.ds.DataManager.prototype.removeIndexedListeners = function(\n    fn, opt_dataPath, opt_id) {\n  this.removeListenersByFunction_(\n      this.indexedListenersByFunction_, true, fn, opt_dataPath, opt_id);\n};\n\n\n/**\n * Removes listeners with a given callback function, and optional\n * matching dataPath and matching id\n *\n * @param {Function} fn Callback function, signature function(dataPath, id).\n * @param {string=} opt_dataPath Fully qualified data path.\n * @param {string=} opt_id A value passed back to the listener when the dataPath\n *   is matched.\n */\ngoog.ds.DataManager.prototype.removeListeners = function(\n    fn, opt_dataPath, opt_id) {\n\n  // Normalize data path root\n  if (opt_dataPath && goog.string.endsWith(opt_dataPath, '/...')) {\n    opt_dataPath = opt_dataPath.substring(0, opt_dataPath.length - 4);\n  } else if (opt_dataPath && goog.string.endsWith(opt_dataPath, '/*')) {\n    opt_dataPath = opt_dataPath.substring(0, opt_dataPath.length - 2);\n  }\n\n  this.removeListenersByFunction_(\n      this.listenersByFunction_, false, fn, opt_dataPath, opt_id);\n};\n\n\n/**\n * Removes listeners with a given callback function, and optional\n * matching dataPath and matching id from the given listenersByFunction\n * data structure.\n *\n * @param {Object} listenersByFunction The listeners by function.\n * @param {boolean} indexed Indicates whether the listenersByFunction are\n *     indexed or not.\n * @param {Function} fn Callback function, signature function(dataPath, id).\n * @param {string=} opt_dataPath Fully qualified data path.\n * @param {string=} opt_id A value passed back to the listener when the dataPath\n *   is matched.\n * @private\n */\ngoog.ds.DataManager.prototype.removeListenersByFunction_ = function(\n    listenersByFunction, indexed, fn, opt_dataPath, opt_id) {\n  var fnUid = goog.getUid(fn);\n  var functionMatches = listenersByFunction[fnUid];\n  if (functionMatches != null) {\n    for (var key in functionMatches) {\n      var functionMatch = functionMatches[key];\n      var listener = functionMatch.listener;\n      if ((!opt_dataPath || opt_dataPath == listener.dataPath) &&\n          (!opt_id || opt_id == listener.id)) {\n        if (indexed) {\n          this.removeListeners(listener.fn, listener.dataPath, listener.id);\n        }\n        if (functionMatch.items) {\n          for (var i = 0; i < functionMatch.items.length; i++) {\n            var item = functionMatch.items[i];\n            delete item.obj[item.key];\n          }\n        }\n        delete functionMatches[key];\n      }\n    }\n  }\n};\n\n\n/**\n * Get the total number of listeners (per expression listened to, so may be\n * more than number of times addListener() has been called\n * @return {number} Number of listeners.\n */\ngoog.ds.DataManager.prototype.getListenerCount = function() {\n  var /** number */ count = 0;\n  goog.object.forEach(this.listenerMap_, function(matchingListeners) {\n    count += goog.structs.getCount(matchingListeners);\n  });\n  return count;\n};\n\n\n/**\n * Disables the sending of all data events during the execution of the given\n * callback. This provides a way to avoid useless notifications of small changes\n * when you will eventually send a data event manually that encompasses them\n * all.\n *\n * Note that this function can not be called reentrantly.\n *\n * @param {Function} callback Zero-arg function to execute.\n */\ngoog.ds.DataManager.prototype.runWithoutFiringDataChanges = function(callback) {\n  if (this.disableFiring_) {\n    throw new Error('Can not nest calls to runWithoutFiringDataChanges');\n  }\n\n  this.disableFiring_ = true;\n  try {\n    callback();\n  } finally {\n    this.disableFiring_ = false;\n  }\n};\n\n\n/**\n * Fire a data change event to all listeners\n *\n * If the path matches the path of a listener, the listener will fire\n *\n * If your path is the parent of a listener, the listener will fire. I.e.\n * if $Contacts/bob@bob.com changes, then we will fire listener for\n * $Contacts/bob@bob.com/Name as well, as the assumption is that when\n * a parent changes, all children are invalidated.\n *\n * If your path is the child of a listener, the listener may fire, depending\n * on the ancestor depth.\n *\n * A listener for $Contacts might only be interested if the contact name changes\n * (i.e. $Contacts doesn't fire on $Contacts/bob@bob.com/Name),\n * while a listener for a specific contact might\n * (i.e. $Contacts/bob@bob.com would fire on $Contacts/bob@bob.com/Name).\n * Adding \"/...\" to a lisetener path listens to all children, and adding \"/*\" to\n * a listener path listens only to direct children\n *\n * @param {string} dataPath Fully qualified data path.\n */\ngoog.ds.DataManager.prototype.fireDataChange = function(dataPath) {\n  if (this.disableFiring_) {\n    return;\n  }\n\n  var expr = goog.ds.Expr.create(dataPath);\n  var ancestorDepth = 0;\n\n  // Look for listeners for expression and all its parents.\n  // Parents of listener expressions are all added to the listenerMap as well,\n  // so this will evaluate inner loop every time the dataPath is a child or\n  // an ancestor of the original listener path\n  while (expr) {\n    var matchingListeners = this.listenerMap_[expr.getSource()];\n    if (matchingListeners) {\n      for (var id in matchingListeners) {\n        var match = matchingListeners[id];\n        var listener = match.listener;\n        if (ancestorDepth <= match.maxAncestors) {\n          listener.fn(dataPath, listener.id);\n        }\n      }\n    }\n    ancestorDepth++;\n    expr = expr.getParent();\n  }\n  this.eventCount_++;\n};\n","^?",1579837703000,"^@",["^A",["^16","^1Q","~$goog.ds.BasicNodeList","^3","^21","^T0","~$goog.ds.Expr","~$goog.ds.DataNode"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/datasource/datamanager.js"],"^S",["^A",["~$goog.ds.DataManager"]],"^1",true,"^2",["^3","^VW","^VY","^VX","^21","^16","^T0","^1Q"]],["^ ","^7",[1579837703000],"^8","goog.labs.net.webchannel.channelrequest.js","^9",["^:","goog/labs/net/webchannel/channelrequest.js"],"^;","goog/labs/net/webchannel/channelrequest.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the ChannelRequest class. The request\n * object encapsulates the logic for making a single request, either for the\n * forward channel, back channel, or test channel, to the server. It contains\n * the logic for the two types of transports we use:\n * XMLHTTP and Image request. It provides timeout detection. More transports\n * to be added in future, such as Fetch, WebSocket.\n */\n\n\ngoog.provide('goog.labs.net.webChannel.ChannelRequest');\n\ngoog.forwardDeclare('goog.Uri');\ngoog.forwardDeclare('goog.net.XhrIo');\ngoog.require('goog.Timer');\ngoog.require('goog.async.Throttle');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.labs.net.webChannel.Channel');\ngoog.require('goog.labs.net.webChannel.WebChannelDebug');\ngoog.require('goog.labs.net.webChannel.environment');\ngoog.require('goog.labs.net.webChannel.requestStats');\ngoog.require('goog.net.ErrorCode');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.WebChannel');\ngoog.require('goog.net.XmlHttp');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * A new ChannelRequest is created for each request to the server.\n *\n * @param {goog.labs.net.webChannel.Channel} channel\n *     The channel that owns this request.\n * @param {goog.labs.net.webChannel.WebChannelDebug} channelDebug A\n *     WebChannelDebug to use for logging.\n * @param {string=} opt_sessionId The session id for the channel.\n * @param {string|number=} opt_requestId The request id for this request.\n * @param {number=} opt_retryId The retry id for this request.\n * @constructor\n * @struct\n * @final\n */\ngoog.labs.net.webChannel.ChannelRequest = function(\n    channel, channelDebug, opt_sessionId, opt_requestId, opt_retryId) {\n  /**\n   * The channel object that owns the request.\n   * @private {goog.labs.net.webChannel.Channel}\n   */\n  this.channel_ = channel;\n\n  /**\n   * The channel debug to use for logging\n   * @private {goog.labs.net.webChannel.WebChannelDebug}\n   */\n  this.channelDebug_ = channelDebug;\n\n  /**\n   * The Session ID for the channel.\n   * @private {string|undefined}\n   */\n  this.sid_ = opt_sessionId;\n\n  /**\n   * The RID (request ID) for the request.\n   * @private {string|number|undefined}\n   */\n  this.rid_ = opt_requestId;\n\n  /**\n   * The attempt number of the current request.\n   * @private {number}\n   */\n  this.retryId_ = opt_retryId || 1;\n\n  /**\n   * An object to keep track of the channel request event listeners.\n   * @private {!goog.events.EventHandler<\n   *     !goog.labs.net.webChannel.ChannelRequest>}\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  /**\n   * The timeout in ms before failing the request.\n   * @private {number}\n   */\n  this.timeout_ = goog.labs.net.webChannel.ChannelRequest.TIMEOUT_MS_;\n\n  /**\n   * A timer for polling responseText in browsers that don't fire\n   * onreadystatechange during incremental loading of responseText.\n   * @private {goog.Timer}\n   */\n  this.pollingTimer_ =\n      new goog.Timer(goog.labs.net.webChannel.environment.getPollingInterval());\n\n  /**\n   * Extra HTTP headers to add to all the requests sent to the server.\n   * @private {?Object}\n   */\n  this.extraHeaders_ = null;\n\n\n  /**\n   * Whether the request was successful. This is only set to true after the\n   * request successfully completes.\n   * @private {boolean}\n   */\n  this.successful_ = false;\n\n\n  /**\n   * The TimerID of the timer used to detect if the request has timed-out.\n   * @type {?number}\n   * @private\n   */\n  this.watchDogTimerId_ = null;\n\n  /**\n   * The time in the future when the request will timeout.\n   * @private {?number}\n   */\n  this.watchDogTimeoutTime_ = null;\n\n  /**\n   * The time the request started.\n   * @private {?number}\n   */\n  this.requestStartTime_ = null;\n\n  /**\n   * The type of request (XMLHTTP, IMG)\n   * @private {?number}\n   */\n  this.type_ = null;\n\n  /**\n   * The base Uri for the request. The includes all the parameters except the\n   * one that indicates the retry number.\n   * @private {?goog.Uri}\n   */\n  this.baseUri_ = null;\n\n  /**\n   * The request Uri that was actually used for the most recent request attempt.\n   * @private {?goog.Uri}\n   */\n  this.requestUri_ = null;\n\n  /**\n   * The post data, if the request is a post.\n   * @private {?string}\n   */\n  this.postData_ = null;\n\n  /**\n   * An array of pending messages that we have either received a non-successful\n   * response for, or no response at all, and which therefore may or may not\n   * have been received by the server.\n   * @private {!Array<goog.labs.net.webChannel.Wire.QueuedMap>}\n   */\n  this.pendingMessages_ = [];\n\n  /**\n   * The XhrLte request if the request is using XMLHTTP\n   * @private {?goog.net.XhrIo}\n   */\n  this.xmlHttp_ = null;\n\n  /**\n   * The position of where the next unprocessed chunk starts in the response\n   * text.\n   * @private {number}\n   */\n  this.xmlHttpChunkStart_ = 0;\n\n  /**\n   * The verb (Get or Post) for the request.\n   * @private {?string}\n   */\n  this.verb_ = null;\n\n  /**\n   * The last error if the request failed.\n   * @private {?goog.labs.net.webChannel.ChannelRequest.Error}\n   */\n  this.lastError_ = null;\n\n  /**\n   * The last status code received.\n   * @private {number}\n   */\n  this.lastStatusCode_ = -1;\n\n  /**\n   * Whether the request has been cancelled due to a call to cancel.\n   * @private {boolean}\n   */\n  this.cancelled_ = false;\n\n  /**\n   * A throttle time in ms for readystatechange events for the backchannel.\n   * Useful for throttling when ready state is INTERACTIVE (partial data).\n   * If set to zero no throttle is used.\n   *\n   * See WebChannelBase.prototype.readyStateChangeThrottleMs_\n   *\n   * @private {number}\n   */\n  this.readyStateChangeThrottleMs_ = 0;\n\n  /**\n   * The throttle for readystatechange events for the current request, or null\n   * if there is none.\n   * @private {?goog.async.Throttle}\n   */\n  this.readyStateChangeThrottle_ = null;\n\n  /**\n   * Whether to the result is expected to be encoded for chunking and thus\n   * requires decoding.\n   * @private {boolean}\n   */\n  this.decodeChunks_ = false;\n\n  /**\n   * Whether to decode x-http-initial-response.\n   * @private {boolean}\n   */\n  this.decodeInitialResponse_ = false;\n\n  /**\n   * Whether x-http-initial-response has been decoded (dispatched).\n   * @private {boolean}\n   */\n  this.initialResponseDecoded_ = false;\n};\n\n\ngoog.scope(function() {\nvar WebChannel = goog.net.WebChannel;\nvar Channel = goog.labs.net.webChannel.Channel;\nvar ChannelRequest = goog.labs.net.webChannel.ChannelRequest;\nvar requestStats = goog.labs.net.webChannel.requestStats;\nvar WebChannelDebug = goog.labs.net.webChannel.WebChannelDebug;\nvar environment = goog.labs.net.webChannel.environment;\n\n\n/**\n * Default timeout in MS for a request. The server must return data within this\n * time limit for the request to not timeout.\n * @private {number}\n */\nChannelRequest.TIMEOUT_MS_ = 45 * 1000;\n\n\n/**\n * Enum for channel requests type\n * @enum {number}\n * @private\n */\nChannelRequest.Type_ = {\n  /**\n   * XMLHTTP requests.\n   */\n  XML_HTTP: 1,\n\n  /**\n   * IMG requests.\n   */\n  CLOSE_REQUEST: 2\n};\n\n\n/**\n * Enum type for identifying an error.\n * @enum {number}\n */\nChannelRequest.Error = {\n  /**\n   * Errors due to a non-200 status code.\n   */\n  STATUS: 0,\n\n  /**\n   * Errors due to no data being returned.\n   */\n  NO_DATA: 1,\n\n  /**\n   * Errors due to a timeout.\n   */\n  TIMEOUT: 2,\n\n  /**\n   * Errors due to the server returning an unknown.\n   */\n  UNKNOWN_SESSION_ID: 3,\n\n  /**\n   * Errors due to bad data being received.\n   */\n  BAD_DATA: 4,\n\n  /**\n   * Errors due to the handler throwing an exception.\n   */\n  HANDLER_EXCEPTION: 5,\n\n  /**\n   * The browser declared itself offline during the request.\n   */\n  BROWSER_OFFLINE: 6\n};\n\n\n/**\n * Returns a useful error string for debugging based on the specified error\n * code.\n * @param {?ChannelRequest.Error} errorCode The error code.\n * @param {number} statusCode The HTTP status code.\n * @return {string} The error string for the given code combination.\n */\nChannelRequest.errorStringFromCode = function(errorCode, statusCode) {\n  switch (errorCode) {\n    case ChannelRequest.Error.STATUS:\n      return 'Non-200 return code (' + statusCode + ')';\n    case ChannelRequest.Error.NO_DATA:\n      return 'XMLHTTP failure (no data)';\n    case ChannelRequest.Error.TIMEOUT:\n      return 'HttpConnection timeout';\n    default:\n      return 'Unknown error';\n  }\n};\n\n\n/**\n * Sentinel value used to indicate an invalid chunk in a multi-chunk response.\n * @private {Object}\n */\nChannelRequest.INVALID_CHUNK_ = {};\n\n\n/**\n * Sentinel value used to indicate an incomplete chunk in a multi-chunk\n * response.\n * @private {Object}\n */\nChannelRequest.INCOMPLETE_CHUNK_ = {};\n\n\n/**\n * Returns whether XHR streaming is supported on this browser.\n *\n * @return {boolean} Whether XHR streaming is supported.\n * @see http://code.google.com/p/closure-library/issues/detail?id=346\n */\nChannelRequest.supportsXhrStreaming = function() {\n  return !goog.userAgent.IE || goog.userAgent.isDocumentModeOrHigher(10);\n};\n\n\n/**\n * Sets extra HTTP headers to add to all the requests sent to the server.\n *\n * @param {Object} extraHeaders The HTTP headers.\n */\nChannelRequest.prototype.setExtraHeaders = function(extraHeaders) {\n  this.extraHeaders_ = extraHeaders;\n};\n\n\n/**\n * Overrides the default HTTP method.\n *\n * @param {string} verb The HTTP method\n */\nChannelRequest.prototype.setVerb = function(verb) {\n  this.verb_ = verb;\n};\n\n\n/**\n * Sets the timeout for a request\n *\n * @param {number} timeout   The timeout in MS for when we fail the request.\n */\nChannelRequest.prototype.setTimeout = function(timeout) {\n  this.timeout_ = timeout;\n};\n\n\n/**\n * Sets the throttle for handling onreadystatechange events for the request.\n *\n * @param {number} throttle The throttle in ms.  A value of zero indicates\n *     no throttle.\n */\nChannelRequest.prototype.setReadyStateChangeThrottle = function(throttle) {\n  this.readyStateChangeThrottleMs_ = throttle;\n};\n\n\n/**\n * Sets the pending messages that this request is handling.\n *\n * @param {!Array<goog.labs.net.webChannel.Wire.QueuedMap>} pendingMessages\n *     The pending messages for this request.\n */\nChannelRequest.prototype.setPendingMessages = function(pendingMessages) {\n  this.pendingMessages_ = pendingMessages;\n};\n\n\n/**\n * Gets the pending messages that this request is handling, in case of a retry.\n *\n * @return {!Array<goog.labs.net.webChannel.Wire.QueuedMap>} The pending\n *     messages for this request.\n */\nChannelRequest.prototype.getPendingMessages = function() {\n  return this.pendingMessages_;\n};\n\n\n/**\n * Uses XMLHTTP to send an HTTP POST to the server.\n *\n * @param {goog.Uri} uri  The uri of the request.\n * @param {?string} postData  The data for the post body.\n * @param {boolean} decodeChunks  Whether to the result is expected to be\n *     encoded for chunking and thus requires decoding.\n */\nChannelRequest.prototype.xmlHttpPost = function(uri, postData, decodeChunks) {\n  this.type_ = ChannelRequest.Type_.XML_HTTP;\n  this.baseUri_ = uri.clone().makeUnique();\n  this.postData_ = postData;\n  this.decodeChunks_ = decodeChunks;\n  this.sendXmlHttp_(null /* hostPrefix */);\n};\n\n\n/**\n * Uses XMLHTTP to send an HTTP GET to the server.\n *\n * @param {goog.Uri} uri  The uri of the request.\n * @param {boolean} decodeChunks  Whether to the result is expected to be\n *     encoded for chunking and thus requires decoding.\n * @param {?string} hostPrefix  The host prefix, if we might be using a\n *     secondary domain.  Note that it should also be in the URL, adding this\n *     won't cause it to be added to the URL.\n */\nChannelRequest.prototype.xmlHttpGet = function(uri, decodeChunks, hostPrefix) {\n  this.type_ = ChannelRequest.Type_.XML_HTTP;\n  this.baseUri_ = uri.clone().makeUnique();\n  this.postData_ = null;\n  this.decodeChunks_ = decodeChunks;\n\n  this.sendXmlHttp_(hostPrefix);\n};\n\n\n/**\n * Sends a request via XMLHTTP according to the current state of the request\n * object.\n *\n * @param {?string} hostPrefix The host prefix, if we might be using a secondary\n *     domain.\n * @private\n */\nChannelRequest.prototype.sendXmlHttp_ = function(hostPrefix) {\n  this.requestStartTime_ = goog.now();\n  this.ensureWatchDogTimer_();\n\n  // clone the base URI to create the request URI. The request uri has the\n  // attempt number as a parameter which helps in debugging.\n  this.requestUri_ = this.baseUri_.clone();\n  this.requestUri_.setParameterValues('t', this.retryId_);\n\n  // send the request either as a POST or GET\n  this.xmlHttpChunkStart_ = 0;\n  var useSecondaryDomains = this.channel_.shouldUseSecondaryDomains();\n  this.xmlHttp_ =\n      this.channel_.createXhrIo(useSecondaryDomains ? hostPrefix : null);\n\n  if (this.readyStateChangeThrottleMs_ > 0) {\n    this.readyStateChangeThrottle_ = new goog.async.Throttle(\n        goog.bind(this.xmlHttpHandler_, this, this.xmlHttp_),\n        this.readyStateChangeThrottleMs_);\n  }\n\n  this.eventHandler_.listen(\n      this.xmlHttp_, goog.net.EventType.READY_STATE_CHANGE,\n      this.readyStateChangeHandler_);\n\n  var headers = this.extraHeaders_ ? goog.object.clone(this.extraHeaders_) : {};\n  if (this.postData_) {\n    if (!this.verb_) {\n      this.verb_ = 'POST';\n    }\n    headers['Content-Type'] = 'application/x-www-form-urlencoded';\n    this.xmlHttp_.send(this.requestUri_, this.verb_, this.postData_, headers);\n  } else {\n    this.verb_ = 'GET';\n    this.xmlHttp_.send(this.requestUri_, this.verb_, null, headers);\n  }\n  requestStats.notifyServerReachabilityEvent(\n      requestStats.ServerReachability.REQUEST_MADE);\n  this.channelDebug_.xmlHttpChannelRequest(\n      this.verb_, this.requestUri_, this.rid_, this.retryId_, this.postData_);\n};\n\n\n/**\n * Handles a readystatechange event.\n * @param {goog.events.Event} evt The event.\n * @private\n */\nChannelRequest.prototype.readyStateChangeHandler_ = function(evt) {\n  var xhr = /** @type {goog.net.XhrIo} */ (evt.target);\n  var throttle = this.readyStateChangeThrottle_;\n  if (throttle &&\n      xhr.getReadyState() == goog.net.XmlHttp.ReadyState.INTERACTIVE) {\n    // Only throttle in the partial data case.\n    this.channelDebug_.debug('Throttling readystatechange.');\n    throttle.fire();\n  } else {\n    // If we haven't throttled, just handle response directly.\n    this.xmlHttpHandler_(xhr);\n  }\n};\n\n\n/**\n * XmlHttp handler\n * @param {goog.net.XhrIo} xmlhttp The XhrIo object for the current request.\n * @private\n */\nChannelRequest.prototype.xmlHttpHandler_ = function(xmlhttp) {\n  requestStats.onStartExecution();\n\n\n  try {\n    if (xmlhttp == this.xmlHttp_) {\n      this.onXmlHttpReadyStateChanged_();\n    } else {\n      this.channelDebug_.warning(\n          'Called back with an ' +\n          'unexpected xmlhttp');\n    }\n  } catch (ex) {\n    this.channelDebug_.debug('Failed call to OnXmlHttpReadyStateChanged_');\n    if (this.xmlHttp_ && this.xmlHttp_.getResponseText()) {\n      var channelRequest = this;\n      this.channelDebug_.dumpException(ex, function() {\n        return 'ResponseText: ' + channelRequest.xmlHttp_.getResponseText();\n      });\n    } else {\n      this.channelDebug_.dumpException(ex, 'No response text');\n    }\n  } finally {\n    requestStats.onEndExecution();\n  }\n};\n\n\n/**\n * Called by the readystate handler for XMLHTTP requests.\n *\n * @private\n */\nChannelRequest.prototype.onXmlHttpReadyStateChanged_ = function() {\n  var readyState = this.xmlHttp_.getReadyState();\n  var errorCode = this.xmlHttp_.getLastErrorCode();\n  var statusCode = this.xmlHttp_.getStatus();\n\n  // we get partial results in browsers that support ready state interactive.\n  // We also make sure that getResponseText is not null in interactive mode\n  // before we continue.\n  if (readyState < goog.net.XmlHttp.ReadyState.INTERACTIVE ||\n      (readyState == goog.net.XmlHttp.ReadyState.INTERACTIVE &&\n       !environment.isPollingRequired() &&  // otherwise, go on to startPolling\n       !this.xmlHttp_.getResponseText())) {\n    return;  // not yet ready\n  }\n\n  // Dispatch any appropriate network events.\n  if (!this.cancelled_ && readyState == goog.net.XmlHttp.ReadyState.COMPLETE &&\n      errorCode != goog.net.ErrorCode.ABORT) {\n    // Pretty conservative, these are the only known scenarios which we'd\n    // consider indicative of a truly non-functional network connection.\n    if (errorCode == goog.net.ErrorCode.TIMEOUT || statusCode <= 0) {\n      requestStats.notifyServerReachabilityEvent(\n          requestStats.ServerReachability.REQUEST_FAILED);\n    } else {\n      requestStats.notifyServerReachabilityEvent(\n          requestStats.ServerReachability.REQUEST_SUCCEEDED);\n    }\n  }\n\n  // got some data so cancel the watchdog timer\n  this.cancelWatchDogTimer_();\n\n  var status = this.xmlHttp_.getStatus();\n  this.lastStatusCode_ = status;\n  var responseText = this.xmlHttp_.getResponseText();\n  if (!responseText) {\n    var channelRequest = this;\n    this.channelDebug_.debug(function() {\n      return 'No response text for uri ' + channelRequest.requestUri_ +\n          ' status ' + status;\n    });\n  }\n  this.successful_ = (status == 200);\n\n  this.channelDebug_.xmlHttpChannelResponseMetaData(\n      /** @type {string} */ (this.verb_), this.requestUri_, this.rid_,\n      this.retryId_, readyState, status);\n\n  if (!this.successful_) {\n    if (status == 400 && responseText.indexOf('Unknown SID') > 0) {\n      // the server error string will include 'Unknown SID' which indicates the\n      // server doesn't know about the session (maybe it got restarted, maybe\n      // the user got moved to another server, etc.,). Handlers can special\n      // case this error\n      this.lastError_ = ChannelRequest.Error.UNKNOWN_SESSION_ID;\n      requestStats.notifyStatEvent(\n          requestStats.Stat.REQUEST_UNKNOWN_SESSION_ID);\n      this.channelDebug_.warning('XMLHTTP Unknown SID (' + this.rid_ + ')');\n    } else {\n      this.lastError_ = ChannelRequest.Error.STATUS;\n      requestStats.notifyStatEvent(requestStats.Stat.REQUEST_BAD_STATUS);\n      this.channelDebug_.warning(\n          'XMLHTTP Bad status ' + status + ' (' + this.rid_ + ')');\n    }\n    this.cleanup_();\n    this.dispatchFailure_();\n    return;\n  }\n\n  if (this.shouldCheckInitialResponse_()) {\n    var initialResponse = this.getInitialResponse_();\n    if (initialResponse) {\n      this.channelDebug_.xmlHttpChannelResponseText(\n          this.rid_, initialResponse,\n          'Initial handshake response via ' +\n              WebChannel.X_HTTP_INITIAL_RESPONSE);\n      this.initialResponseDecoded_ = true;\n      this.safeOnRequestData_(initialResponse);\n    } else {\n      this.successful_ = false;\n      this.lastError_ = ChannelRequest.Error.UNKNOWN_SESSION_ID;  // fail-fast\n      requestStats.notifyStatEvent(\n          requestStats.Stat.REQUEST_UNKNOWN_SESSION_ID);\n      this.channelDebug_.warning(\n          'XMLHTTP Missing X_HTTP_INITIAL_RESPONSE' +\n          ' (' + this.rid_ + ')');\n      this.cleanup_();\n      this.dispatchFailure_();\n      return;\n    }\n  }\n\n  if (this.decodeChunks_) {\n    this.decodeNextChunks_(readyState, responseText);\n    if (environment.isPollingRequired() && this.successful_ &&\n        readyState == goog.net.XmlHttp.ReadyState.INTERACTIVE) {\n      this.startPolling_();\n    }\n  } else {\n    this.channelDebug_.xmlHttpChannelResponseText(\n        this.rid_, responseText, null);\n    this.safeOnRequestData_(responseText);\n  }\n\n  if (readyState == goog.net.XmlHttp.ReadyState.COMPLETE) {\n    this.cleanup_();\n  }\n\n  if (!this.successful_) {\n    return;\n  }\n\n  if (!this.cancelled_) {\n    if (readyState == goog.net.XmlHttp.ReadyState.COMPLETE) {\n      this.channel_.onRequestComplete(this);\n    } else {\n      // The default is false, the result from this callback shouldn't carry\n      // over to the next callback, otherwise the request looks successful if\n      // the watchdog timer gets called\n      this.successful_ = false;\n      this.ensureWatchDogTimer_();\n    }\n  }\n};\n\n\n/**\n * Whether we need check the initial-response header that is sent during the\n * fast handshake.\n *\n * @return {boolean} true if the initial-response header is yet to be processed.\n * @private\n */\nChannelRequest.prototype.shouldCheckInitialResponse_ = function() {\n  return this.decodeInitialResponse_ && !this.initialResponseDecoded_;\n};\n\n\n/**\n * Queries the initial response header that is sent during the handshake.\n *\n * @return {?string} The non-empty header value or null.\n * @private\n */\nChannelRequest.prototype.getInitialResponse_ = function() {\n  if (this.xmlHttp_) {\n    var value = this.xmlHttp_.getStreamingResponseHeader(\n        WebChannel.X_HTTP_INITIAL_RESPONSE);\n    if (value && !goog.string.isEmptyOrWhitespace(value)) {\n      return value;\n    }\n  }\n\n  return null;\n};\n\n\n/**\n * Check if the initial response header has been handled.\n *\n * @return {boolean} true if X_HTTP_INITIAL_RESPONSE has been handled.\n */\nChannelRequest.prototype.isInitialResponseDecoded = function() {\n  return this.initialResponseDecoded_;\n};\n\n\n/**\n * Decodes X_HTTP_INITIAL_RESPONSE if present.\n */\nChannelRequest.prototype.setDecodeInitialResponse = function() {\n  this.decodeInitialResponse_ = true;\n};\n\n\n/**\n * Decodes the next set of available chunks in the response.\n * @param {number} readyState The value of readyState.\n * @param {string} responseText The value of responseText.\n * @private\n */\nChannelRequest.prototype.decodeNextChunks_ = function(\n    readyState, responseText) {\n  var decodeNextChunksSuccessful = true;\n  while (!this.cancelled_ && this.xmlHttpChunkStart_ < responseText.length) {\n    var chunkText = this.getNextChunk_(responseText);\n    if (chunkText == ChannelRequest.INCOMPLETE_CHUNK_) {\n      if (readyState == goog.net.XmlHttp.ReadyState.COMPLETE) {\n        // should have consumed entire response when the request is done\n        this.lastError_ = ChannelRequest.Error.BAD_DATA;\n        requestStats.notifyStatEvent(requestStats.Stat.REQUEST_INCOMPLETE_DATA);\n        decodeNextChunksSuccessful = false;\n      }\n      this.channelDebug_.xmlHttpChannelResponseText(\n          this.rid_, null, '[Incomplete Response]');\n      break;\n    } else if (chunkText == ChannelRequest.INVALID_CHUNK_) {\n      this.lastError_ = ChannelRequest.Error.BAD_DATA;\n      requestStats.notifyStatEvent(requestStats.Stat.REQUEST_BAD_DATA);\n      this.channelDebug_.xmlHttpChannelResponseText(\n          this.rid_, responseText, '[Invalid Chunk]');\n      decodeNextChunksSuccessful = false;\n      break;\n    } else {\n      this.channelDebug_.xmlHttpChannelResponseText(\n          this.rid_, /** @type {string} */ (chunkText), null);\n      this.safeOnRequestData_(/** @type {string} */ (chunkText));\n    }\n  }\n  if (readyState == goog.net.XmlHttp.ReadyState.COMPLETE &&\n      responseText.length == 0) {\n    // also an error if we didn't get any response\n    this.lastError_ = ChannelRequest.Error.NO_DATA;\n    requestStats.notifyStatEvent(requestStats.Stat.REQUEST_NO_DATA);\n    decodeNextChunksSuccessful = false;\n  }\n  this.successful_ = this.successful_ && decodeNextChunksSuccessful;\n  if (!decodeNextChunksSuccessful) {\n    // malformed response - we make this trigger retry logic\n    this.channelDebug_.xmlHttpChannelResponseText(\n        this.rid_, responseText, '[Invalid Chunked Response]');\n    this.cleanup_();\n    this.dispatchFailure_();\n  }\n};\n\n\n/**\n * Polls the response for new data.\n * @private\n */\nChannelRequest.prototype.pollResponse_ = function() {\n  if (!this.xmlHttp_) {\n    return;  // already closed\n  }\n  var readyState = this.xmlHttp_.getReadyState();\n  var responseText = this.xmlHttp_.getResponseText();\n  if (this.xmlHttpChunkStart_ < responseText.length) {\n    this.cancelWatchDogTimer_();\n    this.decodeNextChunks_(readyState, responseText);\n    if (this.successful_ &&\n        readyState != goog.net.XmlHttp.ReadyState.COMPLETE) {\n      this.ensureWatchDogTimer_();\n    }\n  }\n};\n\n\n/**\n * Starts a polling interval for changes to responseText of the\n * XMLHttpRequest, for browsers that don't fire onreadystatechange\n * as data comes in incrementally.  This timer is disabled in\n * cleanup_().\n * @private\n */\nChannelRequest.prototype.startPolling_ = function() {\n  this.eventHandler_.listen(\n      this.pollingTimer_, goog.Timer.TICK, this.pollResponse_);\n  this.pollingTimer_.start();\n};\n\n\n/**\n * Returns the next chunk of a chunk-encoded response. This is not standard\n * HTTP chunked encoding because browsers don't expose the chunk boundaries to\n * the application through XMLHTTP. So we have an additional chunk encoding at\n * the application level that lets us tell where the beginning and end of\n * individual responses are so that we can only try to eval a complete JS array.\n *\n * The encoding is the size of the chunk encoded as a decimal string followed\n * by a newline followed by the data.\n *\n * @param {string} responseText The response text from the XMLHTTP response.\n * @return {string|Object} The next chunk string or a sentinel object\n *                         indicating a special condition.\n * @private\n */\nChannelRequest.prototype.getNextChunk_ = function(responseText) {\n  var sizeStartIndex = this.xmlHttpChunkStart_;\n  var sizeEndIndex = responseText.indexOf('\\n', sizeStartIndex);\n  if (sizeEndIndex == -1) {\n    return ChannelRequest.INCOMPLETE_CHUNK_;\n  }\n\n  var sizeAsString = responseText.substring(sizeStartIndex, sizeEndIndex);\n  var size = Number(sizeAsString);\n  if (isNaN(size)) {\n    return ChannelRequest.INVALID_CHUNK_;\n  }\n\n  var chunkStartIndex = sizeEndIndex + 1;\n  if (chunkStartIndex + size > responseText.length) {\n    return ChannelRequest.INCOMPLETE_CHUNK_;\n  }\n\n  var chunkText = responseText.substr(chunkStartIndex, size);\n  this.xmlHttpChunkStart_ = chunkStartIndex + size;\n  return chunkText;\n};\n\n\n/**\n * Uses an IMG tag or navigator.sendBeacon to send an HTTP get to the server.\n *\n * This is only currently used to terminate the connection, as an IMG tag is\n * the most reliable way to send something to the server while the page\n * is getting torn down.\n *\n * Navigator.sendBeacon is available on Chrome and Firefox as a formal\n * solution to ensure delivery without blocking window close. See\n * https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon\n *\n * For Chrome Apps, sendBeacon is always necessary due to Content Security\n * Policy (CSP) violation of using an IMG tag.\n *\n * For react-native, we use xhr to send the actual close request, and assume\n * there is no page-close issue with react-native.\n *\n * @param {goog.Uri} uri The uri to send a request to.\n */\nChannelRequest.prototype.sendCloseRequest = function(uri) {\n  this.type_ = ChannelRequest.Type_.CLOSE_REQUEST;\n  this.baseUri_ = uri.clone().makeUnique();\n\n  var requestSent = false;\n\n  if (goog.global.navigator && goog.global.navigator.sendBeacon) {\n    // empty string body to avoid 413 error on chrome < 41\n    requestSent =\n        goog.global.navigator.sendBeacon(this.baseUri_.toString(), '');\n  }\n\n  if (!requestSent && goog.global.Image) {\n    var eltImg = new Image();\n    eltImg.src = this.baseUri_;\n    requestSent = true;\n  }\n\n  if (!requestSent) {\n    // no handler is set to match the sendBeacon/Image behavior\n    this.xmlHttp_ = this.channel_.createXhrIo(null);\n    this.xmlHttp_.send(this.baseUri_);\n  }\n\n  this.requestStartTime_ = goog.now();\n  this.ensureWatchDogTimer_();\n};\n\n\n/**\n * Cancels the request no matter what the underlying transport is.\n */\nChannelRequest.prototype.cancel = function() {\n  this.cancelled_ = true;\n  this.cleanup_();\n};\n\n\n/**\n * Resets the timeout.\n *\n * @param {number=} opt_timeout The new timeout\n */\nChannelRequest.prototype.resetTimeout = function(opt_timeout) {\n  if (opt_timeout) {\n    this.setTimeout(opt_timeout);\n  }\n  // restart only if a timer is currently set\n  if (this.watchDogTimerId_) {\n    this.cancelWatchDogTimer_();\n    this.ensureWatchDogTimer_();\n  }\n};\n\n\n/**\n * Ensures that there is watchdog timeout which is used to ensure that\n * the connection completes in time.\n *\n * @private\n */\nChannelRequest.prototype.ensureWatchDogTimer_ = function() {\n  this.watchDogTimeoutTime_ = goog.now() + this.timeout_;\n  this.startWatchDogTimer_(this.timeout_);\n};\n\n\n/**\n * Starts the watchdog timer which is used to ensure that the connection\n * completes in time.\n * @param {number} time The number of milliseconds to wait.\n * @private\n */\nChannelRequest.prototype.startWatchDogTimer_ = function(time) {\n  if (this.watchDogTimerId_ != null) {\n    // assertion\n    throw new Error('WatchDog timer not null');\n  }\n  this.watchDogTimerId_ =\n      requestStats.setTimeout(goog.bind(this.onWatchDogTimeout_, this), time);\n};\n\n\n/**\n * Cancels the watchdog timer if it has been started.\n *\n * @private\n */\nChannelRequest.prototype.cancelWatchDogTimer_ = function() {\n  if (this.watchDogTimerId_) {\n    goog.global.clearTimeout(this.watchDogTimerId_);\n    this.watchDogTimerId_ = null;\n  }\n};\n\n\n/**\n * Called when the watchdog timer is triggered. It also handles a case where it\n * is called too early which we suspect may be happening sometimes\n * (not sure why)\n *\n * @private\n */\nChannelRequest.prototype.onWatchDogTimeout_ = function() {\n  this.watchDogTimerId_ = null;\n  var now = goog.now();\n  if (now - this.watchDogTimeoutTime_ >= 0) {\n    this.handleTimeout_();\n  } else {\n    // got called too early for some reason\n    this.channelDebug_.warning('WatchDog timer called too early');\n    this.startWatchDogTimer_(this.watchDogTimeoutTime_ - now);\n  }\n};\n\n\n/**\n * Called when the request has actually timed out. Will cleanup and notify the\n * channel of the failure.\n *\n * @private\n */\nChannelRequest.prototype.handleTimeout_ = function() {\n  if (this.successful_) {\n    // Should never happen.\n    this.channelDebug_.severe(\n        'Received watchdog timeout even though request loaded successfully');\n  }\n\n  this.channelDebug_.timeoutResponse(this.requestUri_);\n\n  // IMG or SendBeacon requests never notice if they were successful,\n  // and always 'time out'. This fact says nothing about reachability.\n  if (this.type_ != ChannelRequest.Type_.CLOSE_REQUEST) {\n    requestStats.notifyServerReachabilityEvent(\n        requestStats.ServerReachability.REQUEST_FAILED);\n    requestStats.notifyStatEvent(requestStats.Stat.REQUEST_TIMEOUT);\n  }\n\n  this.cleanup_();\n\n  // Set error and dispatch failure.\n  // This is called for CLOSE_REQUEST too to ensure channel_.onRequestComplete.\n  this.lastError_ = ChannelRequest.Error.TIMEOUT;\n  this.dispatchFailure_();\n};\n\n\n/**\n * Notifies the channel that this request failed.\n * @private\n */\nChannelRequest.prototype.dispatchFailure_ = function() {\n  if (this.channel_.isClosed() || this.cancelled_) {\n    return;\n  }\n\n  this.channel_.onRequestComplete(this);\n};\n\n\n/**\n * Cleans up the objects used to make the request. This function is\n * idempotent.\n *\n * @private\n */\nChannelRequest.prototype.cleanup_ = function() {\n  this.cancelWatchDogTimer_();\n\n  goog.dispose(this.readyStateChangeThrottle_);\n  this.readyStateChangeThrottle_ = null;\n\n  // Stop the polling timer, if necessary.\n  this.pollingTimer_.stop();\n\n  // Unhook all event handlers.\n  this.eventHandler_.removeAll();\n\n  if (this.xmlHttp_) {\n    // clear out this.xmlHttp_ before aborting so we handle getting reentered\n    // inside abort\n    var xmlhttp = this.xmlHttp_;\n    this.xmlHttp_ = null;\n    xmlhttp.abort();\n    xmlhttp.dispose();\n  }\n};\n\n\n/**\n * Indicates whether the request was successful. Only valid after the handler\n * is called to indicate completion of the request.\n *\n * @return {boolean} True if the request succeeded.\n */\nChannelRequest.prototype.getSuccess = function() {\n  return this.successful_;\n};\n\n\n/**\n * If the request was not successful, returns the reason.\n *\n * @return {?ChannelRequest.Error}  The last error.\n */\nChannelRequest.prototype.getLastError = function() {\n  return this.lastError_;\n};\n\n\n/**\n * Returns the status code of the last request.\n * @return {number} The status code of the last request.\n */\nChannelRequest.prototype.getLastStatusCode = function() {\n  return this.lastStatusCode_;\n};\n\n\n/**\n * Returns the session id for this channel.\n *\n * @return {string|undefined} The session ID.\n */\nChannelRequest.prototype.getSessionId = function() {\n  return this.sid_;\n};\n\n\n/**\n * Returns the request id for this request. Each request has a unique request\n * id and the request IDs are a sequential increasing count.\n *\n * @return {string|number|undefined} The request ID.\n */\nChannelRequest.prototype.getRequestId = function() {\n  return this.rid_;\n};\n\n\n/**\n * Returns the data for a post, if this request is a post.\n *\n * @return {?string} The POST data provided by the request initiator.\n */\nChannelRequest.prototype.getPostData = function() {\n  return this.postData_;\n};\n\n\n/**\n * Returns the XhrIo request object.\n *\n * @return {?goog.net.XhrIo} Any XhrIo request created for this object.\n */\nChannelRequest.prototype.getXhr = function() {\n  return this.xmlHttp_;\n};\n\n\n/**\n * Returns the time that the request started, if it has started.\n *\n * @return {?number} The time the request started, as returned by goog.now().\n */\nChannelRequest.prototype.getRequestStartTime = function() {\n  return this.requestStartTime_;\n};\n\n\n/**\n * Helper to call the callback's onRequestData, which catches any\n * exception.\n * @param {string} data The request data.\n * @private\n */\nChannelRequest.prototype.safeOnRequestData_ = function(data) {\n  try {\n    this.channel_.onRequestData(this, data);\n    var stats = requestStats.ServerReachability;\n    requestStats.notifyServerReachabilityEvent(stats.BACK_CHANNEL_ACTIVITY);\n  } catch (e) {\n    // Dump debug info, but keep going without closing the channel.\n    this.channelDebug_.dumpException(e, 'Error in httprequest callback');\n  }\n};\n\n\n/**\n * Convenience factory method.\n *\n * @param {Channel} channel The channel object that owns this request.\n * @param {WebChannelDebug} channelDebug A WebChannelDebug to use for logging.\n * @param {string=} opt_sessionId  The session id for the channel.\n * @param {string|number=} opt_requestId  The request id for this request.\n * @param {number=} opt_retryId  The retry id for this request.\n * @return {!ChannelRequest} The created channel request.\n */\nChannelRequest.createChannelRequest = function(\n    channel, channelDebug, opt_sessionId, opt_requestId, opt_retryId) {\n  return new ChannelRequest(\n      channel, channelDebug, opt_sessionId, opt_requestId, opt_retryId);\n};\n});  // goog.scope\n","^?",1579837703000,"^@",["^A",["^2R","^3U","~$goog.labs.net.webChannel.environment","~$goog.async.Throttle","^16","^3","~$goog.labs.net.webChannel.Channel","^21","^18","^4F","^V2","~$goog.net.WebChannel","~$goog.labs.net.webChannel.requestStats","^SB","^SR"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchannel/channelrequest.js"],"^S",["^A",["~$goog.labs.net.webChannel.ChannelRequest"]],"^1",true,"^2",["^3","^3U","^W0","^2R","^W1","^V2","^V[","^W3","^SR","^4F","^W2","^SB","^21","^16","^18"]],["^ ","^7",[1579837703000],"^8","goog.net.xhriopool.js","^9",["^:","goog/net/xhriopool.js"],"^;","goog/net/xhriopool.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Creates a pool of XhrIo objects to use. This allows multiple\n * XhrIo objects to be grouped together and requests will use next available\n * XhrIo object.\n *\n */\n\ngoog.provide('goog.net.XhrIoPool');\n\ngoog.require('goog.net.XhrIo');\ngoog.require('goog.structs.PriorityPool');\n\n\n\n/**\n * A pool of XhrIo objects.\n * @param {goog.structs.Map=} opt_headers Map of default headers to add to every\n *     request.\n * @param {number=} opt_minCount Minimum number of objects (Default: 0).\n * @param {number=} opt_maxCount Maximum number of objects (Default: 10).\n * @param {boolean=} opt_withCredentials Add credentials to every request\n *     (Default: false).\n * @constructor\n * @extends {goog.structs.PriorityPool}\n */\ngoog.net.XhrIoPool = function(\n    opt_headers, opt_minCount, opt_maxCount, opt_withCredentials) {\n  /**\n   * Map of default headers to add to every request.\n   * @type {goog.structs.Map|undefined}\n   * @private\n   */\n  this.headers_ = opt_headers;\n\n  /**\n   * Whether a \"credentialed\" requests are to be sent (ones that is aware of\n   * cookies and authentication). This is applicable only for cross-domain\n   * requests and more recent browsers that support this part of the HTTP Access\n   * Control standard.\n   *\n   * @see http://www.w3.org/TR/XMLHttpRequest/#the-withcredentials-attribute\n   *\n   * @private {boolean}\n   */\n  this.withCredentials_ = !!opt_withCredentials;\n\n  // Must break convention of putting the super-class's constructor first. This\n  // is because the super-class constructor calls adjustForMinMax, which calls\n  // this class' createObject. In this class's implementation, it assumes that\n  // there is a headers_, and will lack those if not yet present.\n  goog.structs.PriorityPool.call(this, opt_minCount, opt_maxCount);\n};\ngoog.inherits(goog.net.XhrIoPool, goog.structs.PriorityPool);\n\n\n/**\n * Creates an instance of an XhrIo object to use in the pool.\n * @return {!goog.net.XhrIo} The created object.\n * @override\n */\ngoog.net.XhrIoPool.prototype.createObject = function() {\n  var xhrIo = new goog.net.XhrIo();\n  var headers = this.headers_;\n  if (headers) {\n    headers.forEach(function(value, key) { xhrIo.headers.set(key, value); });\n  }\n  if (this.withCredentials_) {\n    xhrIo.setWithCredentials(true);\n  }\n  return xhrIo;\n};\n\n\n/**\n * Determine if an object has become unusable and should not be used.\n * @param {Object} obj The object to test.\n * @return {boolean} Whether the object can be reused, which is true if the\n *     object is not disposed and not active.\n * @override\n */\ngoog.net.XhrIoPool.prototype.objectCanBeReused = function(obj) {\n  // An active XhrIo object should never be used.\n  var xhr = /** @type {goog.net.XhrIo} */ (obj);\n  return !xhr.isDisposed() && !xhr.isActive();\n};\n","^?",1579837703000,"^@",["^A",["^4C","~$goog.structs.PriorityPool","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/xhriopool.js"],"^S",["^A",["^4A"]],"^1",true,"^2",["^3","^4C","^W5"]],["^ ","^7",[1579837703000],"^8","goog.ui.datepicker.js","^9",["^:","goog/ui/datepicker.js"],"^;","goog/ui/datepicker.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Date picker implementation.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/datepicker.html\n */\n\ngoog.provide('goog.ui.DatePicker');\ngoog.provide('goog.ui.DatePicker.Events');\ngoog.provide('goog.ui.DatePickerEvent');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.asserts');\ngoog.require('goog.date.Date');\ngoog.require('goog.date.DateRange');\ngoog.require('goog.date.Interval');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyHandler');\ngoog.require('goog.i18n.DateTimeFormat');\ngoog.require('goog.i18n.DateTimePatterns');\ngoog.require('goog.i18n.DateTimeSymbols');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.DefaultDatePickerRenderer');\ngoog.require('goog.ui.IdGenerator');\n\n\n\n/**\n * DatePicker widget. Allows a single date to be selected from a calendar like\n * view.\n *\n * @param {goog.date.Date|Date=} opt_date Date to initialize the date picker\n *     with, defaults to the current date.\n * @param {Object=} opt_dateTimeSymbols Date and time symbols to use.\n *     Defaults to goog.i18n.DateTimeSymbols if not set.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @param {goog.ui.DatePickerRenderer=} opt_renderer Optional Date picker\n *     renderer.\n * @constructor\n * @extends {goog.ui.Component}\n */\ngoog.ui.DatePicker = function(\n    opt_date, opt_dateTimeSymbols, opt_domHelper, opt_renderer) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * Date and time symbols to use.\n   * @type {!goog.i18n.DateTimeSymbolsType}\n   * @private\n   */\n  this.symbols_ = /** @type {!goog.i18n.DateTimeSymbolsType} */ (\n      opt_dateTimeSymbols || goog.i18n.DateTimeSymbols);\n\n  this.wdayNames_ = this.symbols_.STANDALONESHORTWEEKDAYS;\n\n  // Formatters for the various areas of the picker\n  this.i18nDateFormatterDay_ = new goog.i18n.DateTimeFormat('d', this.symbols_);\n  this.i18nDateFormatterDay2_ =\n      new goog.i18n.DateTimeFormat('dd', this.symbols_);\n  this.i18nDateFormatterWeek_ =\n      new goog.i18n.DateTimeFormat('w', this.symbols_);\n  // Formatter for day grid aria label. This should always have the day first so\n  // that a screenreader user can rapidly navigate within a month without always\n  // hearing the month. It should read the month name instead of number to avoid\n  // confusing people who are used to different orders.\n  this.i18nDateFormatterDayAriaLabel_ =\n      new goog.i18n.DateTimeFormat('d MMM', this.symbols_);\n\n  // Previous implementation did not use goog.i18n.DateTimePatterns,\n  // so it is likely most developers did not set it.\n  // This is why the fallback to a hard-coded string (just in case).\n  var patYear = goog.i18n.DateTimePatterns.YEAR_FULL || 'y';\n  this.i18nDateFormatterYear_ =\n      new goog.i18n.DateTimeFormat(patYear, this.symbols_);\n  var patMMMMy = goog.i18n.DateTimePatterns.YEAR_MONTH_FULL || 'MMMM y';\n  this.i18nDateFormatterMonthYear_ =\n      new goog.i18n.DateTimeFormat(patMMMMy, this.symbols_);\n\n  /**\n   * @type {!goog.ui.DatePickerRenderer}\n   * @private\n   */\n  this.renderer_ = opt_renderer ||\n      new goog.ui.DefaultDatePickerRenderer(\n          this.getBaseCssClass(), this.getDomHelper());\n\n  /**\n   * Selected date.\n   * @type {goog.date.Date}\n   * @private\n   */\n  this.date_ = new goog.date.Date(opt_date);\n  this.date_.setFirstWeekCutOffDay(this.symbols_.FIRSTWEEKCUTOFFDAY);\n  this.date_.setFirstDayOfWeek(this.symbols_.FIRSTDAYOFWEEK);\n\n  /**\n   * Active month.\n   * @type {goog.date.Date}\n   * @private\n   */\n  this.activeMonth_ = this.date_.clone();\n  this.activeMonth_.setDate(1);\n\n  /**\n   * Class names to apply to the weekday columns.\n   * @type {Array<string>}\n   * @private\n   */\n  this.wdayStyles_ = ['', '', '', '', '', '', ''];\n  this.wdayStyles_[this.symbols_.WEEKENDRANGE[0]] =\n      goog.getCssName(this.getBaseCssClass(), 'wkend-start');\n  this.wdayStyles_[this.symbols_.WEEKENDRANGE[1]] =\n      goog.getCssName(this.getBaseCssClass(), 'wkend-end');\n\n  /**\n   * Object that is being used to cache key handlers.\n   * @type {Object}\n   * @private\n   */\n  this.keyHandlers_ = {};\n\n  /**\n   * Collection of dates that make up the date picker.\n   * @type {!Array<!Array<!goog.date.Date>>}\n   * @private\n   */\n  this.grid_ = [];\n\n  /** @private {Array<!Array<Element>>} */\n  this.elTable_;\n\n  /**\n   * TODO(tbreisacher): Remove external references to this field,\n   * and make it private.\n   * @type {Element}\n   */\n  this.tableBody_;\n\n  /** @private {Element} */\n  this.tableFoot_;\n\n  /** @private {Element} */\n  this.elYear_;\n\n  /** @private {Element} */\n  this.elMonth_;\n\n  /** @private {Element} */\n  this.elToday_;\n\n  /** @private {Element} */\n  this.elNone_;\n\n  /** @private {Element} */\n  this.menu_;\n  /** @private {Element} */\n  this.menuSelected_;\n\n  /** @private {?Element} */\n  this.selectedCell_;\n\n  /** @private {function(Element)} */\n  this.menuCallback_;\n\n  /**\n   * Number of rows in the picker table. Used for detecting size changes.\n   * @private {number}\n   */\n  this.lastNumberOfRowsInGrid_ = 0;\n};\ngoog.inherits(goog.ui.DatePicker, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.DatePicker);\n\n\n/**\n * Flag indicating if the number of weeks shown should be fixed.\n * @type {boolean}\n * @private\n */\ngoog.ui.DatePicker.prototype.showFixedNumWeeks_ = true;\n\n\n/**\n * Flag indicating if days from other months should be shown.\n * @type {boolean}\n * @private\n */\ngoog.ui.DatePicker.prototype.showOtherMonths_ = true;\n\n\n/**\n * Range of dates which are selectable by the user.\n * @type {!goog.date.DateRange}\n * @private\n */\ngoog.ui.DatePicker.prototype.userSelectableDateRange_ =\n    goog.date.DateRange.allTime();\n\n\n/**\n * Flag indicating if extra week(s) always should be added at the end. If not\n * set the extra week is added at the beginning if the number of days shown\n * from the previous month is less than the number from the next month.\n * @type {boolean}\n * @private\n */\ngoog.ui.DatePicker.prototype.extraWeekAtEnd_ = true;\n\n\n/**\n * Flag indicating if week numbers should be shown.\n * @type {boolean}\n * @private\n */\ngoog.ui.DatePicker.prototype.showWeekNum_ = true;\n\n\n/**\n * Flag indicating if weekday names should be shown.\n * @type {boolean}\n * @private\n */\ngoog.ui.DatePicker.prototype.showWeekdays_ = true;\n\n\n/**\n * Flag indicating if none is a valid selection. Also controls if the none\n * button should be shown or not.\n * @type {boolean}\n * @private\n */\ngoog.ui.DatePicker.prototype.allowNone_ = true;\n\n\n/**\n * Flag indicating if the today button should be shown.\n * @type {boolean}\n * @private\n */\ngoog.ui.DatePicker.prototype.showToday_ = true;\n\n\n/**\n * Flag indicating if the picker should use a simple navigation menu that only\n * contains controls for navigating to the next and previous month. The default\n * navigation menu contains controls for navigating to the next/previous month,\n * next/previous year, and menus for jumping to specific months and years.\n * @type {boolean}\n * @private\n */\ngoog.ui.DatePicker.prototype.simpleNavigation_ = false;\n\n\n/**\n * Custom decorator function. Takes a goog.date.Date object, returns a String\n * representing a CSS class or null if no special styling applies\n * @type {?Function}\n * @private\n */\ngoog.ui.DatePicker.prototype.decoratorFunction_ = null;\n\n\n/**\n * Flag indicating if the dates should be printed as a two charater date.\n * @type {boolean}\n * @private\n */\ngoog.ui.DatePicker.prototype.longDateFormat_ = false;\n\n\n/**\n * Element for navigation row on a datepicker.\n * @type {?Element}\n * @private\n */\ngoog.ui.DatePicker.prototype.elNavRow_ = null;\n\n\n/**\n * Element for the month/year in the navigation row.\n * @type {?Element}\n * @private\n */\ngoog.ui.DatePicker.prototype.elMonthYear_ = null;\n\n\n/**\n * Element for footer row on a datepicker.\n * @type {?Element}\n * @private\n */\ngoog.ui.DatePicker.prototype.elFootRow_ = null;\n\n\n/**\n * Generator for unique table cell IDs.\n * @type {goog.ui.IdGenerator}\n * @private\n */\ngoog.ui.DatePicker.prototype.cellIdGenerator_ =\n    goog.ui.IdGenerator.getInstance();\n\n\n/**\n * Name of base CSS class of datepicker.\n * @type {string}\n * @private\n */\ngoog.ui.DatePicker.BASE_CSS_CLASS_ = goog.getCssName('goog-date-picker');\n\n\n/**\n * The numbers of years to show before and after the current one in the\n * year pull-down menu. A total of YEAR_MENU_RANGE * 2 + 1 will be shown.\n * Example: for range = 2 and year 2013 => [2011, 2012, 2013, 2014, 2015]\n * @const {number}\n * @private\n */\ngoog.ui.DatePicker.YEAR_MENU_RANGE_ = 5;\n\n\n/**\n * The maximum number of rendered weeks a month can have.\n * @const {number}\n * @private\n */\ngoog.ui.DatePicker.MAX_NUM_WEEKS_ = 6;\n\n\n/**\n * Constants for event names\n *\n * @enum {string}\n */\ngoog.ui.DatePicker.Events = {\n  CHANGE: 'change',\n  CHANGE_ACTIVE_MONTH: 'changeActiveMonth',\n  GRID_SIZE_INCREASE: 'gridSizeIncrease',\n  SELECT: 'select'\n};\n\n\n/**\n * @deprecated Use isInDocument.\n */\ngoog.ui.DatePicker.prototype.isCreated =\n    goog.ui.DatePicker.prototype.isInDocument;\n\n\n/**\n * @return {number} The first day of week, 0 = Monday, 6 = Sunday.\n */\ngoog.ui.DatePicker.prototype.getFirstWeekday = function() {\n  return this.activeMonth_.getFirstDayOfWeek();\n};\n\n\n/**\n * Returns the class name associated with specified weekday.\n * @param {number} wday The week day number to get the class name for.\n * @return {string} The class name associated with specified weekday.\n */\ngoog.ui.DatePicker.prototype.getWeekdayClass = function(wday) {\n  return this.wdayStyles_[wday];\n};\n\n\n/**\n * @return {boolean} Whether a fixed number of weeks should be showed. If not\n *     only weeks for the current month will be shown.\n */\ngoog.ui.DatePicker.prototype.getShowFixedNumWeeks = function() {\n  return this.showFixedNumWeeks_;\n};\n\n\n/**\n * @return {boolean} Whether a days from the previous and/or next month should\n *     be shown.\n */\ngoog.ui.DatePicker.prototype.getShowOtherMonths = function() {\n  return this.showOtherMonths_;\n};\n\n\n/**\n * @return {boolean} Whether a the extra week(s) added always should be at the\n *     end. Only applicable if a fixed number of weeks are shown.\n */\ngoog.ui.DatePicker.prototype.getExtraWeekAtEnd = function() {\n  return this.extraWeekAtEnd_;\n};\n\n\n/**\n * @return {boolean} Whether week numbers should be shown.\n */\ngoog.ui.DatePicker.prototype.getShowWeekNum = function() {\n  return this.showWeekNum_;\n};\n\n\n/**\n * @return {boolean} Whether weekday names should be shown.\n */\ngoog.ui.DatePicker.prototype.getShowWeekdayNames = function() {\n  return this.showWeekdays_;\n};\n\n\n/**\n * @return {boolean} Whether none is a valid selection.\n */\ngoog.ui.DatePicker.prototype.getAllowNone = function() {\n  return this.allowNone_;\n};\n\n\n/**\n * @return {boolean} Whether the today button should be shown.\n */\ngoog.ui.DatePicker.prototype.getShowToday = function() {\n  return this.showToday_;\n};\n\n\n/**\n * Returns base CSS class. This getter is used to get base CSS class part.\n * All CSS class names in component are created as:\n *   goog.getCssName(this.getBaseCssClass(), 'CLASS_NAME')\n * @return {string} Base CSS class.\n */\ngoog.ui.DatePicker.prototype.getBaseCssClass = function() {\n  return goog.ui.DatePicker.BASE_CSS_CLASS_;\n};\n\n\n/**\n * Sets the first day of week\n *\n * @param {number} wday Week day, 0 = Monday, 6 = Sunday.\n */\ngoog.ui.DatePicker.prototype.setFirstWeekday = function(wday) {\n  this.activeMonth_.setFirstDayOfWeek(wday);\n  this.updateCalendarGrid_();\n  this.redrawWeekdays_();\n};\n\n\n/**\n * Sets class name associated with specified weekday.\n *\n * @param {number} wday Week day, 0 = Monday, 6 = Sunday.\n * @param {string} className Class name.\n */\ngoog.ui.DatePicker.prototype.setWeekdayClass = function(wday, className) {\n  this.wdayStyles_[wday] = className;\n  this.redrawCalendarGrid_();\n};\n\n\n/**\n * Sets whether a fixed number of weeks should be showed. If not only weeks\n * for the current month will be showed.\n *\n * @param {boolean} b Whether a fixed number of weeks should be showed.\n */\ngoog.ui.DatePicker.prototype.setShowFixedNumWeeks = function(b) {\n  this.showFixedNumWeeks_ = b;\n  this.updateCalendarGrid_();\n};\n\n\n/**\n * Sets whether a days from the previous and/or next month should be shown.\n *\n * @param {boolean} b Whether a days from the previous and/or next month should\n *     be shown.\n */\ngoog.ui.DatePicker.prototype.setShowOtherMonths = function(b) {\n  this.showOtherMonths_ = b;\n  this.redrawCalendarGrid_();\n};\n\n\n/**\n * Sets the range of dates which may be selected by the user.\n *\n * @param {!goog.date.DateRange} dateRange The range of selectable dates.\n */\ngoog.ui.DatePicker.prototype.setUserSelectableDateRange = function(dateRange) {\n  this.userSelectableDateRange_ = dateRange;\n};\n\n\n/**\n * Gets the range of dates which may be selected by the user.\n *\n * @return {!goog.date.DateRange} The range of selectable dates.\n */\ngoog.ui.DatePicker.prototype.getUserSelectableDateRange = function() {\n  return this.userSelectableDateRange_;\n};\n\n\n/**\n * Determine if a date may be selected by the user.\n *\n * @param {!goog.date.Date} date The date to be tested.\n * @return {boolean} Whether the user may select this date.\n * @private\n */\ngoog.ui.DatePicker.prototype.isUserSelectableDate_ = function(date) {\n  return this.userSelectableDateRange_.contains(date);\n};\n\n\n/**\n * Sets whether the picker should use a simple navigation menu that only\n * contains controls for navigating to the next and previous month. The default\n * navigation menu contains controls for navigating to the next/previous month,\n * next/previous year, and menus for jumping to specific months and years.\n *\n * @param {boolean} b Whether to use a simple navigation menu.\n */\ngoog.ui.DatePicker.prototype.setUseSimpleNavigationMenu = function(b) {\n  this.simpleNavigation_ = b;\n  this.updateNavigationRow_();\n  this.updateCalendarGrid_();\n};\n\n\n/**\n * Sets whether a the extra week(s) added always should be at the end. Only\n * applicable if a fixed number of weeks are shown.\n *\n * @param {boolean} b Whether a the extra week(s) added always should be at the\n *     end.\n */\ngoog.ui.DatePicker.prototype.setExtraWeekAtEnd = function(b) {\n  this.extraWeekAtEnd_ = b;\n  this.updateCalendarGrid_();\n};\n\n\n/**\n * Sets whether week numbers should be shown.\n *\n * @param {boolean} b Whether week numbers should be shown.\n */\ngoog.ui.DatePicker.prototype.setShowWeekNum = function(b) {\n  this.showWeekNum_ = b;\n  // The navigation and footer rows may rely on the number of visible columns,\n  // so we update them when adding/removing the weeknum column.\n  this.updateNavigationRow_();\n  this.updateFooterRow_();\n  this.updateCalendarGrid_();\n};\n\n\n/**\n * Sets whether weekday names should be shown.\n *\n * @param {boolean} b Whether weekday names should be shown.\n */\ngoog.ui.DatePicker.prototype.setShowWeekdayNames = function(b) {\n  this.showWeekdays_ = b;\n  this.redrawWeekdays_();\n  this.redrawCalendarGrid_();\n};\n\n\n/**\n * Sets whether the picker uses narrow weekday names ('M', 'T', 'W', ...).\n *\n * The default behavior is to use short names ('Mon', 'Tue', 'Wed', ...).\n *\n * @param {boolean} b Whether to use narrow weekday names.\n */\ngoog.ui.DatePicker.prototype.setUseNarrowWeekdayNames = function(b) {\n  this.wdayNames_ = b ? this.symbols_.STANDALONENARROWWEEKDAYS :\n                        this.symbols_.STANDALONESHORTWEEKDAYS;\n  this.redrawWeekdays_();\n};\n\n\n/**\n * Sets whether none is a valid selection.\n *\n * @param {boolean} b Whether none is a valid selection.\n */\ngoog.ui.DatePicker.prototype.setAllowNone = function(b) {\n  this.allowNone_ = b;\n  if (this.elNone_) {\n    this.updateTodayAndNone_();\n  }\n};\n\n\n/**\n * Sets whether the today button should be shown.\n *\n * @param {boolean} b Whether the today button should be shown.\n */\ngoog.ui.DatePicker.prototype.setShowToday = function(b) {\n  this.showToday_ = b;\n  if (this.elToday_) {\n    this.updateTodayAndNone_();\n  }\n};\n\n\n/**\n * Updates the display style of the None and Today buttons as well as hides the\n * table foot if both are hidden.\n * @private\n */\ngoog.ui.DatePicker.prototype.updateTodayAndNone_ = function() {\n  goog.style.setElementShown(this.elToday_, this.showToday_);\n  goog.style.setElementShown(this.elNone_, this.allowNone_);\n  goog.style.setElementShown(\n      this.tableFoot_, this.showToday_ || this.allowNone_);\n};\n\n\n/**\n * Sets the decorator function. The function should have the interface of\n *   {string} f({goog.date.Date});\n * and return a String representing a CSS class to decorate the cell\n * corresponding to the date specified.\n *\n * @param {Function} f The decorator function.\n */\ngoog.ui.DatePicker.prototype.setDecorator = function(f) {\n  this.decoratorFunction_ = f;\n};\n\n\n/**\n * Sets whether the date will be printed in long format. In long format, dates\n * such as '1' will be printed as '01'.\n *\n * @param {boolean} b Whethere dates should be printed in long format.\n */\ngoog.ui.DatePicker.prototype.setLongDateFormat = function(b) {\n  this.longDateFormat_ = b;\n  this.redrawCalendarGrid_();\n};\n\n\n/**\n * Changes the active month to the previous one.\n */\ngoog.ui.DatePicker.prototype.previousMonth = function() {\n  this.activeMonth_.add(new goog.date.Interval(goog.date.Interval.MONTHS, -1));\n  this.updateCalendarGrid_();\n  this.fireChangeActiveMonthEvent_();\n};\n\n\n/**\n * Changes the active month to the next one.\n */\ngoog.ui.DatePicker.prototype.nextMonth = function() {\n  this.activeMonth_.add(new goog.date.Interval(goog.date.Interval.MONTHS, 1));\n  this.updateCalendarGrid_();\n  this.fireChangeActiveMonthEvent_();\n};\n\n\n/**\n * Changes the active year to the previous one.\n */\ngoog.ui.DatePicker.prototype.previousYear = function() {\n  this.activeMonth_.add(new goog.date.Interval(goog.date.Interval.YEARS, -1));\n  this.updateCalendarGrid_();\n  this.fireChangeActiveMonthEvent_();\n};\n\n\n/**\n * Changes the active year to the next one.\n */\ngoog.ui.DatePicker.prototype.nextYear = function() {\n  this.activeMonth_.add(new goog.date.Interval(goog.date.Interval.YEARS, 1));\n  this.updateCalendarGrid_();\n  this.fireChangeActiveMonthEvent_();\n};\n\n\n/**\n * Selects the current date.\n */\ngoog.ui.DatePicker.prototype.selectToday = function() {\n  this.setDate(new goog.date.Date());\n};\n\n\n/**\n * Clears the selection.\n */\ngoog.ui.DatePicker.prototype.selectNone = function() {\n  if (this.allowNone_) {\n    this.setDate(null);\n  }\n};\n\n\n/**\n * @return {!goog.date.Date} The active month displayed.\n */\ngoog.ui.DatePicker.prototype.getActiveMonth = function() {\n  return this.activeMonth_.clone();\n};\n\n\n/**\n * @return {goog.date.Date} The selected date or null if nothing is selected.\n */\ngoog.ui.DatePicker.prototype.getDate = function() {\n  return this.date_ && this.date_.clone();\n};\n\n\n/**\n * @param {number} row The row in the grid.\n * @param {number} col The column in the grid.\n * @return {goog.date.Date} The date in the grid or null if there is none.\n */\ngoog.ui.DatePicker.prototype.getDateAt = function(row, col) {\n  return this.grid_[row] ?\n      this.grid_[row][col] ? this.grid_[row][col].clone() : null :\n      null;\n};\n\n\n/**\n * Returns a date element given a row and column. In elTable_, the elements that\n * represent dates are 1 indexed because of other elements such as headers.\n * This corrects for the offset and makes the API 0 indexed.\n *\n * @param {number} row The row in the element table.\n * @param {number} col The column in the element table.\n * @return {Element} The element in the grid or null if there is none.\n * @protected\n */\ngoog.ui.DatePicker.prototype.getDateElementAt = function(row, col) {\n  if (row < 0 || col < 0) {\n    return null;\n  }\n  var adjustedRow = row + 1;\n  return this.elTable_[adjustedRow] ?\n      this.elTable_[adjustedRow][col + 1] || null :\n      null;\n};\n\n\n/**\n * Sets the selected date. Will always fire the SELECT event.\n *\n * @param {goog.date.Date|Date} date Date to select or null to select nothing.\n */\ngoog.ui.DatePicker.prototype.setDate = function(date) {\n  this.setDate_(date, true);\n};\n\n\n/**\n * Sets the selected date, and optionally fires the SELECT event based on param.\n *\n * @param {goog.date.Date|Date} date Date to select or null to select nothing.\n * @param {boolean} fireSelection Whether to fire the selection event.\n * @private\n */\ngoog.ui.DatePicker.prototype.setDate_ = function(date, fireSelection) {\n  // Check if the month has been changed.\n  var sameMonth = date == this.date_ ||\n      date && this.date_ && date.getFullYear() == this.date_.getFullYear() &&\n          date.getMonth() == this.date_.getMonth();\n\n  // Check if the date has been changed.\n  var sameDate =\n      date == this.date_ || sameMonth && date.getDate() == this.date_.getDate();\n\n  // Set current date to clone of supplied goog.date.Date or Date.\n  this.date_ = date && new goog.date.Date(date);\n\n  // Set current month\n  if (date) {\n    this.activeMonth_.set(this.date_);\n    // Set years with two digits to their full year, not 19XX.\n    this.activeMonth_.setFullYear(this.date_.getFullYear());\n    this.activeMonth_.setDate(1);\n  }\n\n  // Update calendar grid even if the date has not changed as even if today is\n  // selected another month can be displayed.\n  this.updateCalendarGrid_();\n\n  if (fireSelection) {\n    // TODO(eae): Standardize selection and change events with other components.\n    // Fire select event.\n    var selectEvent = new goog.ui.DatePickerEvent(\n        goog.ui.DatePicker.Events.SELECT, this, this.date_);\n    this.dispatchEvent(selectEvent);\n  }\n\n  // Fire change event.\n  if (!sameDate) {\n    var changeEvent = new goog.ui.DatePickerEvent(\n        goog.ui.DatePicker.Events.CHANGE, this, this.date_);\n    this.dispatchEvent(changeEvent);\n  }\n\n  // Fire change active month event.\n  if (!sameMonth) {\n    this.fireChangeActiveMonthEvent_();\n  }\n};\n\n\n/**\n * Updates the navigation row (navigating months and maybe years) in the navRow_\n * element of a created picker.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.DatePicker.prototype.updateNavigationRow_ = function() {\n  if (!this.elNavRow_) {\n    return;\n  }\n  var row = this.elNavRow_;\n\n  // Clear the navigation row.\n  while (row.firstChild) {\n    row.removeChild(row.firstChild);\n  }\n\n  var fullDateFormat =\n      this.symbols_.DATEFORMATS[goog.i18n.DateTimeFormat.Format.FULL_DATE]\n          .toLowerCase();\n  this.renderer_.renderNavigationRow(\n      row, this.simpleNavigation_, this.showWeekNum_, fullDateFormat);\n\n  if (this.simpleNavigation_) {\n    this.addPreventDefaultClickHandler_(\n        row, goog.getCssName(this.getBaseCssClass(), 'previousMonth'),\n        this.previousMonth);\n    var previousMonthElement = goog.dom.getElementByClass(\n        goog.getCssName(this.getBaseCssClass(), 'previousMonth'), row);\n    if (previousMonthElement) {\n      // Note: we're hiding the next and previous month buttons from screen\n      // readers because keyboard navigation doesn't currently work correctly\n      // with them. If that is fixed, we can show the buttons again.\n      goog.a11y.aria.setState(\n          previousMonthElement, goog.a11y.aria.State.HIDDEN, true);\n      previousMonthElement.tabIndex = -1;\n    }\n\n    this.addPreventDefaultClickHandler_(\n        row, goog.getCssName(this.getBaseCssClass(), 'nextMonth'),\n        this.nextMonth);\n    var nextMonthElement = goog.dom.getElementByClass(\n        goog.getCssName(this.getBaseCssClass(), 'nextMonth'), row);\n    if (nextMonthElement) {\n      goog.a11y.aria.setState(\n          nextMonthElement, goog.a11y.aria.State.HIDDEN, true);\n      nextMonthElement.tabIndex = -1;\n    }\n\n    this.elMonthYear_ = goog.dom.getElementByClass(\n        goog.getCssName(this.getBaseCssClass(), 'monthyear'), row);\n  } else {\n    this.addPreventDefaultClickHandler_(\n        row, goog.getCssName(this.getBaseCssClass(), 'previousMonth'),\n        this.previousMonth);\n    this.addPreventDefaultClickHandler_(\n        row, goog.getCssName(this.getBaseCssClass(), 'nextMonth'),\n        this.nextMonth);\n    this.addPreventDefaultClickHandler_(\n        row, goog.getCssName(this.getBaseCssClass(), 'month'),\n        this.showMonthMenu_);\n\n    this.addPreventDefaultClickHandler_(\n        row, goog.getCssName(this.getBaseCssClass(), 'previousYear'),\n        this.previousYear);\n    this.addPreventDefaultClickHandler_(\n        row, goog.getCssName(this.getBaseCssClass(), 'nextYear'),\n        this.nextYear);\n    this.addPreventDefaultClickHandler_(\n        row, goog.getCssName(this.getBaseCssClass(), 'year'),\n        this.showYearMenu_);\n\n    this.elMonth_ = goog.dom.getElementByClass(\n        goog.getCssName(this.getBaseCssClass(), 'month'), row);\n    this.elYear_ = goog.dom.getDomHelper().getElementByClass(\n        goog.getCssName(this.getBaseCssClass(), 'year'), row);\n  }\n};\n\n\n/**\n * Setup click handler with prevent default.\n *\n * @param {!Element} parentElement The parent element of the element. This is\n *     needed because the element in question might not be in the dom yet.\n * @param {string} cssName The CSS class name of the element to attach a click\n *     handler.\n * @param {Function} handlerFunction The click handler function.\n * @private\n */\ngoog.ui.DatePicker.prototype.addPreventDefaultClickHandler_ = function(\n    parentElement, cssName, handlerFunction) {\n  var element = goog.dom.getElementByClass(cssName, parentElement);\n  this.getHandler().listen(element, goog.events.EventType.CLICK, function(e) {\n    e.preventDefault();\n    handlerFunction.call(this, e);\n  });\n};\n\n\n/**\n * Updates the footer row (with select buttons) in the footRow_ element of a\n * created picker.\n * @private\n */\ngoog.ui.DatePicker.prototype.updateFooterRow_ = function() {\n  if (!this.elFootRow_) {\n    return;\n  }\n\n  var row = this.elFootRow_;\n\n  // Clear the footer row.\n  goog.dom.removeChildren(row);\n\n  this.renderer_.renderFooterRow(row, this.showWeekNum_);\n\n  this.addPreventDefaultClickHandler_(\n      row, goog.getCssName(this.getBaseCssClass(), 'today-btn'),\n      this.selectToday);\n  this.addPreventDefaultClickHandler_(\n      row, goog.getCssName(this.getBaseCssClass(), 'none-btn'),\n      this.selectNone);\n\n  this.elToday_ = goog.dom.getElementByClass(\n      goog.getCssName(this.getBaseCssClass(), 'today-btn'), row);\n  this.elNone_ = goog.dom.getElementByClass(\n      goog.getCssName(this.getBaseCssClass(), 'none-btn'), row);\n\n  this.updateTodayAndNone_();\n};\n\n\n/**\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.DatePicker.prototype.decorateInternal = function(el) {\n  goog.ui.DatePicker.superClass_.decorateInternal.call(this, el);\n  goog.asserts.assert(el);\n  goog.dom.classlist.add(el, this.getBaseCssClass());\n\n  var table =\n      this.dom_.createDom(goog.dom.TagName.TABLE, {'role': 'presentation'});\n  var thead = this.dom_.createDom(goog.dom.TagName.THEAD);\n  var tbody = this.dom_.createDom(goog.dom.TagName.TBODY, {'role': 'grid'});\n  var tfoot = this.dom_.createDom(goog.dom.TagName.TFOOT);\n\n  tbody.tabIndex = 0;\n\n  // As per comment in colorpicker: table.tBodies and table.tFoot should not be\n  // used because of a bug in Safari, hence using an instance variable\n  this.tableBody_ = tbody;\n  this.tableFoot_ = tfoot;\n\n  var row = this.dom_.createDom(goog.dom.TagName.TR, {'role': 'row'});\n  row.className = goog.getCssName(this.getBaseCssClass(), 'head');\n  this.elNavRow_ = row;\n  this.updateNavigationRow_();\n\n  thead.appendChild(row);\n\n  var cell;\n  this.elTable_ = [];\n  for (var i = 0; i < 7; i++) {\n    row = this.dom_.createElement(goog.dom.TagName.TR);\n    this.elTable_[i] = [];\n    for (var j = 0; j < 8; j++) {\n      cell = this.dom_.createElement(j == 0 || i == 0 ? 'th' : 'td');\n      if ((j == 0 || i == 0) && j != i) {\n        cell.className = (j == 0) ?\n            goog.getCssName(this.getBaseCssClass(), 'week') :\n            goog.getCssName(this.getBaseCssClass(), 'wday');\n        goog.a11y.aria.setRole(cell, j == 0 ? 'rowheader' : 'columnheader');\n      } else if (i !== 0 && j !== 0) {\n        goog.a11y.aria.setRole(cell, 'gridcell');\n        // Make the cells programmatically-focusable (see focus() call below).\n        cell.setAttribute('tabindex', '-1');\n      }\n      row.appendChild(cell);\n      this.elTable_[i][j] = cell;\n    }\n    tbody.appendChild(row);\n  }\n\n  row = this.dom_.createElement(goog.dom.TagName.TR);\n  row.className = goog.getCssName(this.getBaseCssClass(), 'foot');\n  this.elFootRow_ = row;\n  this.updateFooterRow_();\n  tfoot.appendChild(row);\n\n\n  table.cellSpacing = '0';\n  table.cellPadding = '0';\n  table.appendChild(thead);\n  table.appendChild(tbody);\n  table.appendChild(tfoot);\n  el.appendChild(table);\n\n  this.redrawWeekdays_();\n  this.updateCalendarGrid_();\n\n  el.tabIndex = 0;\n};\n\n\n/** @override */\ngoog.ui.DatePicker.prototype.createDom = function() {\n  goog.ui.DatePicker.superClass_.createDom.call(this);\n  this.decorateInternal(this.getElement());\n};\n\n\n/** @override */\ngoog.ui.DatePicker.prototype.enterDocument = function() {\n  goog.ui.DatePicker.superClass_.enterDocument.call(this);\n\n  var eh = this.getHandler();\n  eh.listen(\n      this.tableBody_, goog.events.EventType.CLICK, this.handleGridClick_);\n  eh.listen(\n      this.getKeyHandlerForElement_(this.getElement()),\n      goog.events.KeyHandler.EventType.KEY, this.handleGridKeyPress_);\n};\n\n\n/** @override */\ngoog.ui.DatePicker.prototype.exitDocument = function() {\n  goog.ui.DatePicker.superClass_.exitDocument.call(this);\n  this.destroyMenu_();\n  for (var uid in this.keyHandlers_) {\n    this.keyHandlers_[uid].dispose();\n  }\n  this.keyHandlers_ = {};\n};\n\n\n/**\n * @deprecated Use decorate instead.\n */\ngoog.ui.DatePicker.prototype.create = goog.ui.DatePicker.prototype.decorate;\n\n\n/** @override */\ngoog.ui.DatePicker.prototype.disposeInternal = function() {\n  goog.ui.DatePicker.superClass_.disposeInternal.call(this);\n\n  this.elTable_ = null;\n  this.tableBody_ = null;\n  this.tableFoot_ = null;\n  this.elNavRow_ = null;\n  this.elFootRow_ = null;\n  this.elMonth_ = null;\n  this.elMonthYear_ = null;\n  this.elYear_ = null;\n  this.elToday_ = null;\n  this.elNone_ = null;\n};\n\n\n/**\n * Click handler for date grid.\n * @param {goog.events.BrowserEvent} event Click event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.DatePicker.prototype.handleGridClick_ = function(event) {\n  if (event.target.tagName == goog.dom.TagName.TD) {\n    // colIndex/rowIndex is broken in Safari, find position by looping\n    var el, x = -2, y = -2;  // first col/row is for weekday/weeknum\n    for (el = event.target; el; el = el.previousSibling, x++) {\n    }\n    for (el = event.target.parentNode; el; el = el.previousSibling, y++) {\n    }\n    var obj = this.grid_[y][x];\n    if (this.isUserSelectableDate_(obj)) {\n      this.setDate(obj.clone());\n    }\n  }\n};\n\n\n/**\n * Keypress handler for date grid.\n *\n * @param {goog.events.BrowserEvent} event Keypress event.\n * @private\n */\ngoog.ui.DatePicker.prototype.handleGridKeyPress_ = function(event) {\n  var months, days;\n  switch (event.keyCode) {\n    case 33:  // Page up\n      event.preventDefault();\n      months = -1;\n      break;\n    case 34:  // Page down\n      event.preventDefault();\n      months = 1;\n      break;\n    case 37:  // Left\n      event.preventDefault();\n      days = -1;\n      break;\n    case 39:  // Right\n      event.preventDefault();\n      days = 1;\n      break;\n    case 38:  // Down\n      event.preventDefault();\n      days = -7;\n      break;\n    case 40:  // Up\n      event.preventDefault();\n      days = 7;\n      break;\n    case 36:  // Home\n      event.preventDefault();\n      this.selectToday();\n      break;\n    case 46:  // Delete\n      event.preventDefault();\n      this.selectNone();\n      break;\n    case 13:  // Enter\n    case 32:  // Space\n      event.preventDefault();\n      this.setDate_(this.date_, true /* fireSelection */);\n    default:\n      return;\n  }\n  var date;\n  if (this.date_) {\n    date = this.date_.clone();\n    date.add(new goog.date.Interval(0, months, days));\n  } else {\n    date = this.activeMonth_.clone();\n    date.setDate(1);\n  }\n  if (this.isUserSelectableDate_(date)) {\n    this.setDate_(date, false /* fireSelection */);\n    // Focus the currently-selected cell to surface its aria-label for assistive\n    // tech, (eg) allowing unsighted users to see what the arrow keys are doing.\n    this.selectedCell_.focus();\n  }\n};\n\n\n/**\n * Click handler for month button. Opens month selection menu.\n *\n * @param {goog.events.BrowserEvent} event Click event.\n * @private\n */\ngoog.ui.DatePicker.prototype.showMonthMenu_ = function(event) {\n  event.stopPropagation();\n\n  var list = [];\n  for (var i = 0; i < 12; i++) {\n    list.push(this.symbols_.STANDALONEMONTHS[i]);\n  }\n  this.createMenu_(\n      this.elMonth_, list, this.handleMonthMenuClick_,\n      this.symbols_.STANDALONEMONTHS[this.activeMonth_.getMonth()]);\n};\n\n\n/**\n * Click handler for year button. Opens year selection menu.\n *\n * @param {goog.events.BrowserEvent} event Click event.\n * @private\n */\ngoog.ui.DatePicker.prototype.showYearMenu_ = function(event) {\n  event.stopPropagation();\n\n  var list = [];\n  var year = this.activeMonth_.getFullYear();\n  var loopDate = this.activeMonth_.clone();\n  for (var i = -goog.ui.DatePicker.YEAR_MENU_RANGE_;\n       i <= goog.ui.DatePicker.YEAR_MENU_RANGE_; i++) {\n    loopDate.setFullYear(year + i);\n    list.push(this.i18nDateFormatterYear_.format(loopDate));\n  }\n  this.createMenu_(\n      this.elYear_, list, this.handleYearMenuClick_,\n      this.i18nDateFormatterYear_.format(this.activeMonth_));\n};\n\n\n/**\n * Call back function for month menu.\n *\n * @param {Element} target Selected item.\n * @private\n */\ngoog.ui.DatePicker.prototype.handleMonthMenuClick_ = function(target) {\n  var itemIndex = Number(target.getAttribute('itemIndex'));\n  this.activeMonth_.setMonth(itemIndex);\n  this.updateCalendarGrid_();\n\n  if (this.elMonth_.focus) {\n    this.elMonth_.focus();\n  }\n};\n\n\n/**\n * Call back function for year menu.\n *\n * @param {Element} target Selected item.\n * @private\n */\ngoog.ui.DatePicker.prototype.handleYearMenuClick_ = function(target) {\n  if (target.firstChild.nodeType == goog.dom.NodeType.TEXT) {\n    // We use the same technique used for months to get the position of the\n    // item in the menu, as the year is not necessarily numeric.\n    var itemIndex = Number(target.getAttribute('itemIndex'));\n    var year = this.activeMonth_.getFullYear();\n    this.activeMonth_.setFullYear(\n        year + itemIndex - goog.ui.DatePicker.YEAR_MENU_RANGE_);\n    this.updateCalendarGrid_();\n  }\n\n  this.elYear_.focus();\n};\n\n\n/**\n * Support function for menu creation.\n * @param {Element} srcEl Button to create menu for.\n * @param {Array<string>} items List of items to populate menu with.\n * @param {function(Element)} method Call back method.\n * @param {string} selected Item to mark as selected in menu.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.DatePicker.prototype.createMenu_ = function(\n    srcEl, items, method, selected) {\n  this.destroyMenu_();\n\n  var el = this.dom_.createElement(goog.dom.TagName.DIV);\n  el.className = goog.getCssName(this.getBaseCssClass(), 'menu');\n\n  this.menuSelected_ = null;\n\n  var ul = this.dom_.createElement(goog.dom.TagName.UL);\n  for (var i = 0; i < items.length; i++) {\n    var li = this.dom_.createDom(goog.dom.TagName.LI, null, items[i]);\n    li.setAttribute('itemIndex', i);\n    if (items[i] == selected) {\n      this.menuSelected_ = li;\n    }\n    ul.appendChild(li);\n  }\n  el.appendChild(ul);\n  srcEl = /** @type {!HTMLElement} */ (srcEl);\n  el.style.left = srcEl.offsetLeft + srcEl.parentNode.offsetLeft + 'px';\n  el.style.top = srcEl.offsetTop + 'px';\n  el.style.width = srcEl.clientWidth + 'px';\n  this.elMonth_.parentNode.appendChild(el);\n\n  this.menu_ = el;\n  if (!this.menuSelected_) {\n    this.menuSelected_ = /** @type {Element} */ (ul.firstChild);\n  }\n  this.menuSelected_.className =\n      goog.getCssName(this.getBaseCssClass(), 'menu-selected');\n  this.menuCallback_ = method;\n\n  var eh = this.getHandler();\n  eh.listen(this.menu_, goog.events.EventType.CLICK, this.handleMenuClick_);\n  eh.listen(\n      this.getKeyHandlerForElement_(this.menu_),\n      goog.events.KeyHandler.EventType.KEY, this.handleMenuKeyPress_);\n  eh.listen(\n      this.dom_.getDocument(), goog.events.EventType.CLICK, this.destroyMenu_);\n  el.tabIndex = 0;\n  el.focus();\n};\n\n\n/**\n * Click handler for menu.\n *\n * @param {goog.events.BrowserEvent} event Click event.\n * @private\n */\ngoog.ui.DatePicker.prototype.handleMenuClick_ = function(event) {\n  event.stopPropagation();\n\n  this.destroyMenu_();\n  if (this.menuCallback_) {\n    this.menuCallback_(/** @type {Element} */ (event.target));\n  }\n};\n\n\n/**\n * Keypress handler for menu.\n * @param {goog.events.BrowserEvent} event Keypress event.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.DatePicker.prototype.handleMenuKeyPress_ = function(event) {\n  // Prevent the grid keypress handler from catching the keypress event.\n  event.stopPropagation();\n\n  var el;\n  var menuSelected = this.menuSelected_;\n  switch (event.keyCode) {\n    case 35:  // End\n      event.preventDefault();\n      el = menuSelected.parentNode.lastChild;\n      break;\n    case 36:  // Home\n      event.preventDefault();\n      el = menuSelected.parentNode.firstChild;\n      break;\n    case 38:  // Up\n      event.preventDefault();\n      el = menuSelected.previousSibling;\n      break;\n    case 40:  // Down\n      event.preventDefault();\n      el = menuSelected.nextSibling;\n      break;\n    case 13:  // Enter\n    case 9:   // Tab\n    case 0:   // Space\n      event.preventDefault();\n      this.destroyMenu_();\n      this.menuCallback_(menuSelected);\n      break;\n  }\n  if (el && el != menuSelected) {\n    menuSelected.className = '';\n    el.className = goog.getCssName(this.getBaseCssClass(), 'menu-selected');\n    this.menuSelected_ = /** @type {!Element} */ (el);\n  }\n};\n\n\n/**\n * Support function for menu destruction.\n * @private\n */\ngoog.ui.DatePicker.prototype.destroyMenu_ = function() {\n  if (this.menu_) {\n    var eh = this.getHandler();\n    eh.unlisten(this.menu_, goog.events.EventType.CLICK, this.handleMenuClick_);\n    eh.unlisten(\n        this.getKeyHandlerForElement_(this.menu_),\n        goog.events.KeyHandler.EventType.KEY, this.handleMenuKeyPress_);\n    eh.unlisten(\n        this.dom_.getDocument(), goog.events.EventType.CLICK,\n        this.destroyMenu_);\n    goog.dom.removeNode(this.menu_);\n    delete this.menu_;\n  }\n};\n\n\n/**\n * Determines the dates/weekdays for the current month and builds an in memory\n * representation of the calendar.\n *\n * @private\n */\ngoog.ui.DatePicker.prototype.updateCalendarGrid_ = function() {\n  if (!this.getElement()) {\n    return;\n  }\n\n  var date = this.activeMonth_.clone();\n  date.setDate(1);\n\n  // Show year name of select month\n  if (this.elMonthYear_) {\n    goog.dom.setTextContent(\n        this.elMonthYear_, this.i18nDateFormatterMonthYear_.format(date));\n  }\n  if (this.elMonth_) {\n    goog.dom.setTextContent(\n        this.elMonth_, this.symbols_.STANDALONEMONTHS[date.getMonth()]);\n  }\n  if (this.elYear_) {\n    goog.dom.setTextContent(\n        this.elYear_, this.i18nDateFormatterYear_.format(date));\n  }\n\n  var wday = date.getWeekday();\n  var days = date.getNumberOfDaysInMonth();\n\n  // Determine how many days to show for previous month\n  date.add(new goog.date.Interval(goog.date.Interval.MONTHS, -1));\n  date.setDate(date.getNumberOfDaysInMonth() - (wday - 1));\n\n  if (this.showFixedNumWeeks_ && !this.extraWeekAtEnd_ && days + wday < 33) {\n    date.add(new goog.date.Interval(goog.date.Interval.DAYS, -7));\n  }\n\n  // Create weekday/day grid\n  var dayInterval = new goog.date.Interval(goog.date.Interval.DAYS, 1);\n  this.grid_ = [];\n  for (var y = 0; y < 6; y++) {  // Weeks\n    this.grid_[y] = [];\n    for (var x = 0; x < 7; x++) {  // Weekdays\n      this.grid_[y][x] = date.clone();\n      // Date.add breaks dates before year 100 by adding 1900 to the year\n      // value. As a workaround we store the year before the add and reapply it\n      // after (with special handling for January 1st).\n      var year = date.getFullYear();\n      date.add(dayInterval);\n      if (date.getMonth() == 0 && date.getDate() == 1) {\n        // Increase year on January 1st.\n        year++;\n      }\n      date.setFullYear(year);\n    }\n  }\n\n  this.redrawCalendarGrid_();\n};\n\n\n/**\n * Draws calendar view from in memory representation and applies class names\n * depending on the selection, weekday and whatever the day belongs to the\n * active month or not.\n * @private\n */\ngoog.ui.DatePicker.prototype.redrawCalendarGrid_ = function() {\n  if (!this.getElement()) {\n    return;\n  }\n\n  var month = this.activeMonth_.getMonth();\n  var today = new goog.date.Date();\n  var todayYear = today.getFullYear();\n  var todayMonth = today.getMonth();\n  var todayDate = today.getDate();\n  // The maximum number of weeks a month can have is 6. This is decreased below\n  // if weeks are hidden.\n  var numberOfWeeksInThisMonth = goog.ui.DatePicker.MAX_NUM_WEEKS_;\n\n  // Draw calendar week by week, a worst case month has six weeks.\n  for (var y = 0; y < goog.ui.DatePicker.MAX_NUM_WEEKS_; y++) {\n    // Draw week number, if enabled\n    if (this.showWeekNum_) {\n      goog.dom.setTextContent(\n          this.elTable_[y + 1][0],\n          this.i18nDateFormatterWeek_.format(this.grid_[y][0]));\n      goog.dom.classlist.set(\n          this.elTable_[y + 1][0],\n          goog.getCssName(this.getBaseCssClass(), 'week'));\n    } else {\n      goog.dom.setTextContent(this.elTable_[y + 1][0], '');\n      goog.dom.classlist.set(this.elTable_[y + 1][0], '');\n    }\n\n    for (var x = 0; x < 7; x++) {\n      var o = this.grid_[y][x];\n      var el = this.elTable_[y + 1][x + 1];\n\n      // Assign a unique element id (required for setting the active descendant\n      // ARIA role) unless already set.\n      if (!el.id) {\n        el.id = this.cellIdGenerator_.getNextUniqueId();\n      }\n      goog.asserts.assert(el, 'The table DOM element cannot be null.');\n      goog.a11y.aria.setRole(el, 'gridcell');\n      // Set the aria label of the grid cell to the month plus the day.\n      goog.a11y.aria.setLabel(\n          el, this.i18nDateFormatterDayAriaLabel_.format(o));\n\n      var classes = [goog.getCssName(this.getBaseCssClass(), 'date')];\n      if (!this.isUserSelectableDate_(o)) {\n        classes.push(\n            goog.getCssName(this.getBaseCssClass(), 'unavailable-date'));\n      }\n      if (this.showOtherMonths_ || o.getMonth() == month) {\n        // Date belongs to previous or next month\n        if (o.getMonth() != month) {\n          classes.push(goog.getCssName(this.getBaseCssClass(), 'other-month'));\n        }\n\n        // Apply styles set by setWeekdayClass\n        var wday = (x + this.activeMonth_.getFirstDayOfWeek() + 7) % 7;\n        if (this.wdayStyles_[wday]) {\n          classes.push(this.wdayStyles_[wday]);\n        }\n\n        // Current date\n        if (o.getDate() == todayDate && o.getMonth() == todayMonth &&\n            o.getFullYear() == todayYear) {\n          classes.push(goog.getCssName(this.getBaseCssClass(), 'today'));\n        }\n\n        // Selected date\n        if (this.date_ && o.getDate() == this.date_.getDate() &&\n            o.getMonth() == this.date_.getMonth() &&\n            o.getFullYear() == this.date_.getFullYear()) {\n          classes.push(goog.getCssName(this.getBaseCssClass(), 'selected'));\n          goog.asserts.assert(\n              this.tableBody_, 'The table body DOM element cannot be null');\n          this.selectedCell_ = el;\n        }\n\n        // Custom decorator\n        if (this.decoratorFunction_) {\n          var customClass = this.decoratorFunction_(o);\n          if (customClass) {\n            classes.push(customClass);\n          }\n        }\n\n        // Set cell text to the date and apply classes.\n        var formattedDate = this.longDateFormat_ ?\n            this.i18nDateFormatterDay2_.format(o) :\n            this.i18nDateFormatterDay_.format(o);\n        goog.dom.setTextContent(el, formattedDate);\n        // Date belongs to previous or next month and showOtherMonths is false,\n        // clear text and classes.\n      } else {\n        goog.dom.setTextContent(el, '');\n      }\n      goog.dom.classlist.set(el, classes.join(' '));\n    }\n\n    // Hide either the last one or last two weeks if they contain no days from\n    // the active month and the showFixedNumWeeks is false. The first four weeks\n    // are always shown as no month has less than 28 days).\n    if (y >= 4) {\n      var parentEl = /** @type {Element} */ (\n          this.elTable_[y + 1][0].parentElement ||\n          this.elTable_[y + 1][0].parentNode);\n      var doesMonthHaveThisWeek = this.grid_[y][0].getMonth() == month;\n      goog.style.setElementShown(\n          parentEl, doesMonthHaveThisWeek || this.showFixedNumWeeks_);\n\n      if (!doesMonthHaveThisWeek) {\n        numberOfWeeksInThisMonth = Math.min(numberOfWeeksInThisMonth, y);\n      }\n    }\n  }\n\n  var numberOfRowsInGrid =\n      (this.showFixedNumWeeks_ ? goog.ui.DatePicker.MAX_NUM_WEEKS_ :\n                                 numberOfWeeksInThisMonth) +\n      (this.showWeekdays_ ? 1 : 0);\n\n  if (this.lastNumberOfRowsInGrid_ != numberOfRowsInGrid) {\n    if (this.lastNumberOfRowsInGrid_ < numberOfRowsInGrid) {\n      this.dispatchEvent(goog.ui.DatePicker.Events.GRID_SIZE_INCREASE);\n    }\n    this.lastNumberOfRowsInGrid_ = numberOfRowsInGrid;\n  }\n};\n\n\n/**\n * Fires the CHANGE_ACTIVE_MONTH event.\n * @private\n */\ngoog.ui.DatePicker.prototype.fireChangeActiveMonthEvent_ = function() {\n  var changeMonthEvent = new goog.ui.DatePickerEvent(\n      goog.ui.DatePicker.Events.CHANGE_ACTIVE_MONTH, this,\n      this.getActiveMonth());\n  this.dispatchEvent(changeMonthEvent);\n};\n\n\n/**\n * Draw weekday names, if enabled. Start with whatever day has been set as the\n * first day of week.\n * @private\n */\ngoog.ui.DatePicker.prototype.redrawWeekdays_ = function() {\n  if (!this.getElement()) {\n    return;\n  }\n  if (this.showWeekdays_) {\n    for (var x = 0; x < 7; x++) {\n      var el = this.elTable_[0][x + 1];\n      var wday = (x + this.activeMonth_.getFirstDayOfWeek() + 7) % 7;\n      goog.dom.setTextContent(el, this.wdayNames_[(wday + 1) % 7]);\n    }\n  }\n  var parentEl = /** @type {Element} */ (\n      this.elTable_[0][0].parentElement || this.elTable_[0][0].parentNode);\n  goog.style.setElementShown(parentEl, this.showWeekdays_);\n};\n\n\n/**\n * Returns the key handler for an element and caches it so that it can be\n * retrieved at a later point.\n * @param {Element} el The element to get the key handler for.\n * @return {goog.events.KeyHandler} The key handler for the element.\n * @private\n */\ngoog.ui.DatePicker.prototype.getKeyHandlerForElement_ = function(el) {\n  var uid = goog.getUid(el);\n  if (!(uid in this.keyHandlers_)) {\n    this.keyHandlers_[uid] = new goog.events.KeyHandler(el);\n  }\n  return this.keyHandlers_[uid];\n};\n\n\n\n/**\n * Object representing a date picker event.\n *\n * @param {string} type Event type.\n * @param {goog.ui.DatePicker} target Date picker initiating event.\n * @param {goog.date.Date} date Selected date.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.ui.DatePickerEvent = function(type, target, date) {\n  goog.events.Event.call(this, type, target);\n\n  /**\n   * The selected date\n   * @type {goog.date.Date}\n   */\n  this.date = date;\n};\ngoog.inherits(goog.ui.DatePickerEvent, goog.events.Event);\n","^?",1579837703000,"^@",["^A",["^1J","^14","^T?","^1[","^3W","^1B","^VC","^3Z","^3","^UW","~$goog.ui.DefaultDatePickerRenderer","~$goog.date.DateRange","~$goog.i18n.DateTimePatterns","^1C","^UV","^2Y","^38","^VS","^U[","^4"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/datepicker.js"],"^S",["^A",["~$goog.ui.DatePicker","~$goog.ui.DatePickerEvent","~$goog.ui.DatePicker.Events"]],"^1",true,"^2",["^3","^3W","^1J","^U[","^W7","^UW","^14","^1[","^4","^T?","^VS","^1C","^3Z","^VC","^W8","^UV","^2Y","^1B","^W6","^38"]],["^ ","^7",[1579837703000],"^8","goog.ui.hsvpalette.js","^9",["^:","goog/ui/hsvpalette.js"],"^;","goog/ui/hsvpalette.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An HSV (hue/saturation/value) color palette/picker\n * implementation. Inspired by examples like\n * http://johndyer.name/lab/colorpicker/ and the author's initial work. This\n * control allows for more control in picking colors than a simple swatch-based\n * palette. Without the styles from the demo css file, only a hex color label\n * and input field show up.\n *\n * @author arv@google.com (Erik Arvidsson)\n * @see ../demos/hsvpalette.html\n */\n\ngoog.provide('goog.ui.HsvPalette');\n\ngoog.require('goog.color');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.InputHandler');\ngoog.require('goog.style');\ngoog.require('goog.style.bidi');\ngoog.require('goog.ui.Component');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Creates an HSV palette. Allows a user to select the hue, saturation and\n * value/brightness.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @param {string=} opt_color Optional initial color (default is red).\n * @param {string=} opt_class Optional base for creating classnames (default is\n *     goog.getCssName('goog-hsv-palette')).\n * @extends {goog.ui.Component}\n * @constructor\n */\ngoog.ui.HsvPalette = function(opt_domHelper, opt_color, opt_class) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  this.setColorInternal(opt_color || '#f00');\n\n  /**\n   * The base class name for the component.\n   * @type {string}\n   * @protected\n   */\n  this.className = opt_class || goog.getCssName('goog-hsv-palette');\n\n  /**\n   * The document which is being listened to.\n   * type {HTMLDocument}\n   * @private\n   */\n  this.document_ = this.getDomHelper().getDocument();\n};\ngoog.inherits(goog.ui.HsvPalette, goog.ui.Component);\n// TODO(user): Make this inherit from goog.ui.Control and split this into\n// a control and a renderer.\ngoog.tagUnsealableClass(goog.ui.HsvPalette);\n\n\n/**\n * @desc Label for an input field where a user can enter a hexadecimal color\n * specification, such as #ff0000 for red.\n * @private\n */\ngoog.ui.HsvPalette.MSG_HSV_PALETTE_HEX_COLOR_ = goog.getMsg('Hex color');\n\n\n/**\n * DOM element representing the hue/saturation background image.\n * @type {HTMLElement}\n * @private\n */\ngoog.ui.HsvPalette.prototype.hsImageEl_;\n\n\n/**\n * DOM element representing the hue/saturation handle.\n * @type {HTMLElement}\n * @private\n */\ngoog.ui.HsvPalette.prototype.hsHandleEl_;\n\n\n/**\n * DOM element representing the value background image.\n * @type {HTMLElement}\n * @protected\n */\ngoog.ui.HsvPalette.prototype.valueBackgroundImageElement;\n\n\n/**\n * DOM element representing the value handle.\n * @type {HTMLElement}\n * @private\n */\ngoog.ui.HsvPalette.prototype.vHandleEl_;\n\n\n/**\n * DOM element representing the current color swatch.\n * @type {Element}\n * @protected\n */\ngoog.ui.HsvPalette.prototype.swatchElement;\n\n\n/**\n * DOM element representing the hex color input text field.\n * @type {Element}\n * @protected\n */\ngoog.ui.HsvPalette.prototype.inputElement;\n\n\n/**\n * Input handler object for the hex value input field.\n * @type {goog.events.InputHandler}\n * @private\n */\ngoog.ui.HsvPalette.prototype.inputHandler_;\n\n\n/**\n * Listener key for the mousemove event (during a drag operation).\n * @type {goog.events.Key}\n * @protected\n */\ngoog.ui.HsvPalette.prototype.mouseMoveListener;\n\n\n/**\n * Listener key for the mouseup event (during a drag operation).\n * @type {goog.events.Key}\n * @protected\n */\ngoog.ui.HsvPalette.prototype.mouseUpListener;\n\n\n/** @private {!goog.color.Hsv} */\ngoog.ui.HsvPalette.prototype.hsv_;\n\n\n/**\n * Hex representation of the color.\n * @protected {string}\n */\ngoog.ui.HsvPalette.prototype.color;\n\n\n/**\n * Gets the color that is currently selected in this color picker.\n * @return {string} The string of the selected color.\n */\ngoog.ui.HsvPalette.prototype.getColor = function() {\n  return this.color;\n};\n\n\n/**\n * Alpha transparency of the currently selected color, in [0, 1].\n * For the HSV palette this always returns 1. The HSVA palette overrides\n * this method.\n * @return {number} The current alpha value.\n */\ngoog.ui.HsvPalette.prototype.getAlpha = function() {\n  return 1;\n};\n\n\n/**\n * Updates the text entry field.\n * @protected\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.HsvPalette.prototype.updateInput = function() {\n  var parsed;\n  try {\n    parsed = goog.color.parse(this.inputElement.value).hex;\n  } catch (e) {\n    // ignore\n  }\n  if (this.color != parsed) {\n    this.inputElement.value = this.color;\n  }\n};\n\n\n/**\n * Sets which color is selected and update the UI.\n * @param {string} color The selected color.\n * @param {boolean=} opt_disableDispatchEvent (optional) Whether the event\n * should not be fired.\n */\ngoog.ui.HsvPalette.prototype.setColor = function(\n    color, opt_disableDispatchEvent) {\n  if (color != this.color) {\n    this.setColorInternal(color);\n    this.updateUi();\n    if (!opt_disableDispatchEvent) {\n      this.dispatchEvent(goog.ui.Component.EventType.ACTION);\n    }\n  }\n};\n\n\n/**\n * Sets which color is selected.\n * @param {string} color The selected color.\n * @protected\n */\ngoog.ui.HsvPalette.prototype.setColorInternal = function(color) {\n  var rgbHex = goog.color.parse(color).hex;\n  var rgbArray = goog.color.hexToRgb(rgbHex);\n  this.hsv_ = goog.color.rgbArrayToHsv(rgbArray);\n  // Hue is divided by 360 because the documentation for goog.color is currently\n  // incorrect.\n  // TODO(user): Fix this, see http://1324469 .\n  this.hsv_[0] = this.hsv_[0] / 360;\n  this.color = rgbHex;\n};\n\n\n/**\n * Alters the hue, saturation, and/or value of the currently selected color and\n * updates the UI.\n * @param {?number=} opt_hue (optional) hue in [0, 1].\n * @param {?number=} opt_saturation (optional) saturation in [0, 1].\n * @param {?number=} opt_value (optional) value in [0, 255].\n */\ngoog.ui.HsvPalette.prototype.setHsv = function(\n    opt_hue, opt_saturation, opt_value) {\n  if (opt_hue != null || opt_saturation != null || opt_value != null) {\n    this.setHsv_(opt_hue, opt_saturation, opt_value);\n    this.updateUi();\n    this.dispatchEvent(goog.ui.Component.EventType.ACTION);\n  }\n};\n\n\n/**\n * Alters the hue, saturation, and/or value of the currently selected color.\n * @param {?number=} opt_hue (optional) hue in [0, 1].\n * @param {?number=} opt_saturation (optional) saturation in [0, 1].\n * @param {?number=} opt_value (optional) value in [0, 255].\n * @private\n */\ngoog.ui.HsvPalette.prototype.setHsv_ = function(\n    opt_hue, opt_saturation, opt_value) {\n  this.hsv_[0] = (opt_hue != null) ? opt_hue : this.hsv_[0];\n  this.hsv_[1] = (opt_saturation != null) ? opt_saturation : this.hsv_[1];\n  this.hsv_[2] = (opt_value != null) ? opt_value : this.hsv_[2];\n  // Hue is multiplied by 360 because the documentation for goog.color is\n  // currently incorrect.\n  // TODO(user): Fix this, see http://1324469 .\n  this.color = goog.color.hsvArrayToHex(\n      [this.hsv_[0] * 360, this.hsv_[1], this.hsv_[2]]);\n};\n\n\n/**\n * HsvPalettes cannot be used to decorate pre-existing html, since the\n * structure they build is fairly complicated.\n * @param {Element} element Element to decorate.\n * @return {boolean} Returns always false.\n * @override\n */\ngoog.ui.HsvPalette.prototype.canDecorate = function(element) {\n  return false;\n};\n\n\n/** @override */\ngoog.ui.HsvPalette.prototype.createDom = function() {\n  var dom = this.getDomHelper();\n  var noalpha = (goog.userAgent.IE && !goog.userAgent.isVersionOrHigher('7')) ?\n      ' ' + goog.getCssName(this.className, 'noalpha') :\n      '';\n\n  var backdrop = dom.createDom(\n      goog.dom.TagName.DIV, goog.getCssName(this.className, 'hs-backdrop'));\n\n  this.hsHandleEl_ = /** @type {!HTMLElement} */ (\n      dom.createDom(\n          goog.dom.TagName.DIV, goog.getCssName(this.className, 'hs-handle')));\n\n  this.hsImageEl_ = /** @type {!HTMLElement} */ (\n      dom.createDom(\n          goog.dom.TagName.DIV, goog.getCssName(this.className, 'hs-image'),\n          this.hsHandleEl_));\n\n  this.valueBackgroundImageElement = /** @type {!HTMLElement} */ (\n      dom.createDom(\n          goog.dom.TagName.DIV, goog.getCssName(this.className, 'v-image')));\n\n  this.vHandleEl_ = /** @type {!HTMLElement} */ (\n      dom.createDom(\n          goog.dom.TagName.DIV, goog.getCssName(this.className, 'v-handle')));\n\n  this.swatchElement = dom.createDom(\n      goog.dom.TagName.DIV, goog.getCssName(this.className, 'swatch'));\n\n  this.inputElement = dom.createDom(goog.dom.TagName.INPUT, {\n    'class': goog.getCssName(this.className, 'input'),\n    'aria-label': goog.ui.HsvPalette.MSG_HSV_PALETTE_HEX_COLOR_,\n    'type': goog.dom.InputType.TEXT,\n    'dir': 'ltr'\n  });\n  // Spellcheck is not necessary, so setting it to false on the inputElement.\n  this.inputElement.spellcheck = false;\n\n  var labelElement =\n      dom.createDom(goog.dom.TagName.LABEL, null, this.inputElement);\n\n  var element = dom.createDom(\n      goog.dom.TagName.DIV, this.className + noalpha, backdrop, this.hsImageEl_,\n      this.valueBackgroundImageElement, this.vHandleEl_, this.swatchElement,\n      labelElement);\n\n  this.setElementInternal(element);\n\n  // TODO(arv): Set tabIndex\n};\n\n\n/**\n * Renders the color picker inside the provided element. This will override the\n * current content of the element.\n * @override\n */\ngoog.ui.HsvPalette.prototype.enterDocument = function() {\n  goog.ui.HsvPalette.superClass_.enterDocument.call(this);\n\n  // TODO(user): Accessibility.\n\n  this.updateUi();\n\n  var handler = this.getHandler();\n  handler.listen(\n      this.getElement(), goog.events.EventType.MOUSEDOWN, this.handleMouseDown);\n\n  // Cannot create InputHandler in createDom because IE throws an exception\n  // on document.activeElement\n  if (!this.inputHandler_) {\n    this.inputHandler_ = new goog.events.InputHandler(this.inputElement);\n  }\n\n  handler.listen(\n      this.inputHandler_, goog.events.InputHandler.EventType.INPUT,\n      this.handleInput);\n};\n\n\n/** @override */\ngoog.ui.HsvPalette.prototype.disposeInternal = function() {\n  goog.ui.HsvPalette.superClass_.disposeInternal.call(this);\n\n  delete this.hsImageEl_;\n  delete this.hsHandleEl_;\n  delete this.valueBackgroundImageElement;\n  delete this.vHandleEl_;\n  delete this.swatchElement;\n  delete this.inputElement;\n  if (this.inputHandler_) {\n    this.inputHandler_.dispose();\n    delete this.inputHandler_;\n  }\n  goog.events.unlistenByKey(this.mouseMoveListener);\n  goog.events.unlistenByKey(this.mouseUpListener);\n};\n\n\n/**\n * Updates the position, opacity, and styles for the UI representation of the\n * palette.\n * @protected\n */\ngoog.ui.HsvPalette.prototype.updateUi = function() {\n  if (this.isInDocument()) {\n    var h = this.hsv_[0];\n    var s = this.hsv_[1];\n    var v = this.hsv_[2];\n\n    var left = this.hsImageEl_.offsetWidth * h;\n\n    // We don't use a flipped gradient image in RTL, so we need to flip the\n    // offset in RTL so that it still hovers over the correct color on the\n    // gradiant.\n    if (this.isRightToLeft()) {\n      left = this.hsImageEl_.offsetWidth - left;\n    }\n\n    // We also need to account for the handle size.\n    var handleOffset = Math.ceil(this.hsHandleEl_.offsetWidth / 2);\n    left -= handleOffset;\n\n    var top = this.hsImageEl_.offsetHeight * (1 - s);\n    // Account for the handle size.\n    top -= Math.ceil(this.hsHandleEl_.offsetHeight / 2);\n\n    goog.style.bidi.setPosition(\n        this.hsHandleEl_, left, top, this.isRightToLeft());\n\n    top = this.valueBackgroundImageElement.offsetTop -\n        Math.floor(this.vHandleEl_.offsetHeight / 2) +\n        this.valueBackgroundImageElement.offsetHeight * ((255 - v) / 255);\n\n    this.vHandleEl_.style.top = top + 'px';\n    goog.style.setOpacity(this.hsImageEl_, (v / 255));\n\n    goog.style.setStyle(\n        this.valueBackgroundImageElement, 'background-color',\n        goog.color.hsvToHex(this.hsv_[0] * 360, this.hsv_[1], 255));\n\n    goog.style.setStyle(this.swatchElement, 'background-color', this.color);\n    goog.style.setStyle(\n        this.swatchElement, 'color',\n        (this.hsv_[2] > 255 / 2) ? '#000' : '#fff');\n    this.updateInput();\n  }\n};\n\n\n/**\n * Handles mousedown events on palette UI elements.\n * @param {goog.events.BrowserEvent} e Event object.\n * @protected\n */\ngoog.ui.HsvPalette.prototype.handleMouseDown = function(e) {\n  if (e.target == this.valueBackgroundImageElement ||\n      e.target == this.vHandleEl_) {\n    // Setup value change listeners\n    var b = goog.style.getBounds(this.valueBackgroundImageElement);\n    this.handleMouseMoveV_(b, e);\n    this.mouseMoveListener = goog.events.listen(\n        this.document_, goog.events.EventType.MOUSEMOVE,\n        goog.bind(this.handleMouseMoveV_, this, b));\n    this.mouseUpListener = goog.events.listen(\n        this.document_, goog.events.EventType.MOUSEUP, this.handleMouseUp,\n        false, this);\n  } else if (e.target == this.hsImageEl_ || e.target == this.hsHandleEl_) {\n    // Setup hue/saturation change listeners\n    var b = goog.style.getBounds(this.hsImageEl_);\n    this.handleMouseMoveHs_(b, e);\n    this.mouseMoveListener = goog.events.listen(\n        this.document_, goog.events.EventType.MOUSEMOVE,\n        goog.bind(this.handleMouseMoveHs_, this, b));\n    this.mouseUpListener = goog.events.listen(\n        this.document_, goog.events.EventType.MOUSEUP, this.handleMouseUp,\n        false, this);\n  }\n};\n\n\n/**\n * Handles mousemove events on the document once a drag operation on the value\n * slider has started.\n * @param {goog.math.Rect} b Boundaries of the value slider object at the start\n *     of the drag operation.\n * @param {goog.events.BrowserEvent} e Event object.\n * @private\n */\ngoog.ui.HsvPalette.prototype.handleMouseMoveV_ = function(b, e) {\n  e.preventDefault();\n  var vportPos = this.getDomHelper().getDocumentScroll();\n\n  var height =\n      Math.min(Math.max(vportPos.y + e.clientY, b.top), b.top + b.height);\n\n  var newV = Math.round(255 * (b.top + b.height - height) / b.height);\n\n  this.setHsv(null, null, newV);\n};\n\n\n/**\n * Handles mousemove events on the document once a drag operation on the\n * hue/saturation slider has started.\n * @param {goog.math.Rect} b Boundaries of the value slider object at the start\n *     of the drag operation.\n * @param {goog.events.BrowserEvent} e Event object.\n * @private\n */\ngoog.ui.HsvPalette.prototype.handleMouseMoveHs_ = function(b, e) {\n  e.preventDefault();\n  var vportPos = this.getDomHelper().getDocumentScroll();\n  var newH =\n      (Math.min(Math.max(vportPos.x + e.clientX, b.left), b.left + b.width) -\n       b.left) /\n      b.width;\n  var newS =\n      (-Math.min(Math.max(vportPos.y + e.clientY, b.top), b.top + b.height) +\n       b.top + b.height) /\n      b.height;\n  this.setHsv(newH, newS, null);\n};\n\n\n/**\n * Handles mouseup events on the document, which ends a drag operation.\n * @param {goog.events.Event} e Event object.\n * @protected\n */\ngoog.ui.HsvPalette.prototype.handleMouseUp = function(e) {\n  goog.events.unlistenByKey(this.mouseMoveListener);\n  goog.events.unlistenByKey(this.mouseUpListener);\n};\n\n\n/**\n * Handles input events on the hex value input field.\n * @param {goog.events.Event} e Event object.\n * @protected\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.HsvPalette.prototype.handleInput = function(e) {\n  if (/^#?[0-9a-f]{6}$/i.test(this.inputElement.value)) {\n    this.setColor(this.inputElement.value);\n  }\n};\n","^?",1579837703000,"^@",["^A",["~$goog.style.bidi","^10","^1B","~$goog.dom.InputType","^3","^18","^1C","^S5","^2Y","^1N","^4"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/hsvpalette.js"],"^S",["^A",["~$goog.ui.HsvPalette"]],"^1",true,"^2",["^3","^10","^W=","^4","^1N","^1C","^S5","^2Y","^W<","^1B","^18"]],["^ ","^7",[1579837703000],"^8","goog.ui.media.mediamodel.js","^9",["^:","goog/ui/media/mediamodel.js"],"^;","goog/ui/media/mediamodel.js","^<","^=","^>","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides the base media model consistent with the Yahoo Media\n * RSS specification {@link http://search.yahoo.com/mrss/}.\n */\n\ngoog.provide('goog.ui.media.MediaModel');\ngoog.provide('goog.ui.media.MediaModel.Category');\ngoog.provide('goog.ui.media.MediaModel.Credit');\ngoog.provide('goog.ui.media.MediaModel.Credit.Role');\ngoog.provide('goog.ui.media.MediaModel.Credit.Scheme');\ngoog.provide('goog.ui.media.MediaModel.Medium');\ngoog.provide('goog.ui.media.MediaModel.MimeType');\ngoog.provide('goog.ui.media.MediaModel.Player');\ngoog.provide('goog.ui.media.MediaModel.SubTitle');\ngoog.provide('goog.ui.media.MediaModel.Thumbnail');\n\ngoog.forwardDeclare('goog.math.Size');\ngoog.require('goog.array');\ngoog.require('goog.html.TrustedResourceUrl');\n\n\n\n/**\n * An base data value class for all media data models.\n *\n * MediaModels are exact matches to the fields defined in the Yahoo RSS media\n * specification {@link http://search.yahoo.com/mrss/}.\n *\n * The current common data shared by medias is to have URLs, mime types,\n * captions, descriptions, thumbnails and players. Some of these may not be\n * available, or applications may not want to render them, so `null`\n * values are allowed. `goog.ui.media.MediaRenderer` checks whether the\n * values are available before creating DOMs for them.\n *\n * @param {string=} opt_url An optional URL of the media.\n * @param {string=} opt_caption An optional caption of the media.\n * @param {string=} opt_description An optional description of the media.\n * @param {goog.ui.media.MediaModel.MimeType=} opt_type The type of the media.\n * @param {goog.ui.media.MediaModel.Medium=} opt_medium The medium of the media.\n * @param {number=} opt_duration The duration of the media in seconds.\n * @param {number=} opt_width The width of the media in pixels.\n * @param {number=} opt_height The height of the media in pixels.\n * @constructor\n */\ngoog.ui.media.MediaModel = function(\n    opt_url, opt_caption, opt_description, opt_type, opt_medium, opt_duration,\n    opt_width, opt_height) {\n  /**\n   * The URL of the media.\n   * @type {string|undefined}\n   * @private\n   */\n  this.url_ = opt_url;\n\n  /**\n   * The caption of the media.\n   * @type {string|undefined}\n   * @private\n   */\n  this.caption_ = opt_caption;\n\n  /**\n   * A description of the media, typically user generated comments about it.\n   * @type {string|undefined}\n   * @private\n   */\n  this.description_ = opt_description;\n\n  /**\n   * The mime type of the media.\n   * @type {goog.ui.media.MediaModel.MimeType|undefined}\n   * @private\n   */\n  this.type_ = opt_type;\n\n  /**\n   * The medium of the media.\n   * @type {goog.ui.media.MediaModel.Medium|undefined}\n   * @private\n   */\n  this.medium_ = opt_medium;\n\n  /**\n   * The duration of the media in seconds.\n   * @type {number|undefined}\n   * @private\n   */\n  this.duration_ = opt_duration;\n\n  /**\n   * The width of the media in pixels.\n   * @type {number|undefined}\n   * @private\n   */\n  this.width_ = opt_width;\n\n  /**\n   * The height of the media in pixels.\n   * @type {number|undefined}\n   * @private\n   */\n  this.height_ = opt_height;\n\n  /**\n   * A list of thumbnails representations of the media (eg different sizes of\n   * the same photo, etc).\n   * @type {Array<goog.ui.media.MediaModel.Thumbnail>}\n   * @private\n   */\n  this.thumbnails_ = [];\n\n  /**\n   * The list of categories that are applied to this media.\n   * @type {Array<goog.ui.media.MediaModel.Category>}\n   * @private\n   */\n  this.categories_ = [];\n\n  /**\n   * The list of credits that pertain to this media object.\n   * @type {!Array<goog.ui.media.MediaModel.Credit>}\n   * @private\n   */\n  this.credits_ = [];\n\n  /**\n   * The list of subtitles for the media object.\n   * @type {Array<goog.ui.media.MediaModel.SubTitle>}\n   * @private\n   */\n  this.subTitles_ = [];\n};\n\n\n/**\n * The supported media mime types, a subset of the media types found here:\n * {@link http://www.iana.org/assignments/media-types/} and here\n * {@link http://en.wikipedia.org/wiki/Internet_media_type}\n * @enum {string}\n */\ngoog.ui.media.MediaModel.MimeType = {\n  HTML: 'text/html',\n  PLAIN: 'text/plain',\n  FLASH: 'application/x-shockwave-flash',\n  JPEG: 'image/jpeg',\n  GIF: 'image/gif',\n  PNG: 'image/png'\n};\n\n\n/**\n * Supported mediums, found here:\n * {@link http://video.search.yahoo.com/mrss}\n * @enum {string}\n */\ngoog.ui.media.MediaModel.Medium = {\n  IMAGE: 'image',\n  AUDIO: 'audio',\n  VIDEO: 'video',\n  DOCUMENT: 'document',\n  EXECUTABLE: 'executable'\n};\n\n\n/**\n * The media player.\n * @type {goog.ui.media.MediaModel.Player}\n * @private\n */\ngoog.ui.media.MediaModel.prototype.player_;\n\n\n/**\n * Gets the URL of this media.\n * @return {string|undefined} The URL of the media.\n */\ngoog.ui.media.MediaModel.prototype.getUrl = function() {\n  return this.url_;\n};\n\n\n/**\n * Sets the URL of this media.\n * @param {string} url The URL of the media.\n * @return {!goog.ui.media.MediaModel} The object itself, used for chaining.\n */\ngoog.ui.media.MediaModel.prototype.setUrl = function(url) {\n  this.url_ = url;\n  return this;\n};\n\n\n/**\n * Gets the caption of this media.\n * @return {string|undefined} The caption of the media.\n */\ngoog.ui.media.MediaModel.prototype.getCaption = function() {\n  return this.caption_;\n};\n\n\n/**\n * Sets the caption of this media.\n * @param {string} caption The caption of the media.\n * @return {!goog.ui.media.MediaModel} The object itself, used for chaining.\n */\ngoog.ui.media.MediaModel.prototype.setCaption = function(caption) {\n  this.caption_ = caption;\n  return this;\n};\n\n\n/**\n * Gets the media mime type.\n * @return {goog.ui.media.MediaModel.MimeType|undefined} The media mime type.\n */\ngoog.ui.media.MediaModel.prototype.getType = function() {\n  return this.type_;\n};\n\n\n/**\n * Sets the media mime type.\n * @param {goog.ui.media.MediaModel.MimeType} type The media mime type.\n * @return {!goog.ui.media.MediaModel} The object itself, used for chaining.\n */\ngoog.ui.media.MediaModel.prototype.setType = function(type) {\n  this.type_ = type;\n  return this;\n};\n\n\n/**\n * Gets the media medium.\n * @return {goog.ui.media.MediaModel.Medium|undefined} The media medium.\n */\ngoog.ui.media.MediaModel.prototype.getMedium = function() {\n  return this.medium_;\n};\n\n\n/**\n * Sets the media medium.\n * @param {goog.ui.media.MediaModel.Medium} medium The media medium.\n * @return {!goog.ui.media.MediaModel} The object itself, used for chaining.\n */\ngoog.ui.media.MediaModel.prototype.setMedium = function(medium) {\n  this.medium_ = medium;\n  return this;\n};\n\n\n/**\n * Gets the description of this media.\n * @return {string|undefined} The description of the media.\n */\ngoog.ui.media.MediaModel.prototype.getDescription = function() {\n  return this.description_;\n};\n\n\n/**\n * Sets the description of this media.\n * @param {string} description The description of the media.\n * @return {!goog.ui.media.MediaModel} The object itself, used for chaining.\n */\ngoog.ui.media.MediaModel.prototype.setDescription = function(description) {\n  this.description_ = description;\n  return this;\n};\n\n\n/**\n * Gets the thumbnail urls.\n * @return {Array<goog.ui.media.MediaModel.Thumbnail>} The list of thumbnails.\n */\ngoog.ui.media.MediaModel.prototype.getThumbnails = function() {\n  return this.thumbnails_;\n};\n\n\n/**\n * Sets the thumbnail list.\n * @param {Array<goog.ui.media.MediaModel.Thumbnail>} thumbnails The list of\n *     thumbnail.\n * @return {!goog.ui.media.MediaModel} The object itself, used for chaining.\n */\ngoog.ui.media.MediaModel.prototype.setThumbnails = function(thumbnails) {\n  this.thumbnails_ = thumbnails;\n  return this;\n};\n\n\n/**\n * Gets the duration of the media.\n * @return {number|undefined} The duration in seconds.\n */\ngoog.ui.media.MediaModel.prototype.getDuration = function() {\n  return this.duration_;\n};\n\n\n/**\n * Sets duration of the media.\n * @param {number} duration The duration of the media, in seconds.\n * @return {!goog.ui.media.MediaModel} The object itself, used for chaining.\n */\ngoog.ui.media.MediaModel.prototype.setDuration = function(duration) {\n  this.duration_ = duration;\n  return this;\n};\n\n\n/**\n * Gets the width of the media in pixels.\n * @return {number|undefined} The width in pixels.\n */\ngoog.ui.media.MediaModel.prototype.getWidth = function() {\n  return this.width_;\n};\n\n\n/**\n * Sets the width of the media.\n * @param {number} width The width of the media, in pixels.\n * @return {!goog.ui.media.MediaModel} The object itself, used for chaining.\n */\ngoog.ui.media.MediaModel.prototype.setWidth = function(width) {\n  this.width_ = width;\n  return this;\n};\n\n\n/**\n * Gets the height of the media in pixels.\n * @return {number|undefined} The height in pixels.\n */\ngoog.ui.media.MediaModel.prototype.getHeight = function() {\n  return this.height_;\n};\n\n\n/**\n * Sets the height of the media.\n * @param {number} height The height of the media, in pixels.\n * @return {!goog.ui.media.MediaModel} The object itself, used for chaining.\n */\ngoog.ui.media.MediaModel.prototype.setHeight = function(height) {\n  this.height_ = height;\n  return this;\n};\n\n\n/**\n * Gets the player data.\n * @return {goog.ui.media.MediaModel.Player|undefined} The media player data.\n */\ngoog.ui.media.MediaModel.prototype.getPlayer = function() {\n  return this.player_;\n};\n\n\n/**\n * Sets the player data.\n * @param {goog.ui.media.MediaModel.Player} player The media player data.\n * @return {!goog.ui.media.MediaModel} The object itself, used for chaining.\n */\ngoog.ui.media.MediaModel.prototype.setPlayer = function(player) {\n  this.player_ = player;\n  return this;\n};\n\n\n/**\n * Gets the categories of the media.\n * @return {Array<goog.ui.media.MediaModel.Category>} The categories of the\n *     media.\n */\ngoog.ui.media.MediaModel.prototype.getCategories = function() {\n  return this.categories_;\n};\n\n\n/**\n * Sets the categories of the media\n * @param {Array<goog.ui.media.MediaModel.Category>} categories The categories\n *     of the media.\n * @return {!goog.ui.media.MediaModel} The object itself, used for chaining.\n */\ngoog.ui.media.MediaModel.prototype.setCategories = function(categories) {\n  this.categories_ = categories;\n  return this;\n};\n\n\n/**\n * Finds the first category with the given scheme.\n * @param {string} scheme The scheme to search for.\n * @return {goog.ui.media.MediaModel.Category} The category that has the\n *     given scheme. May be null.\n */\ngoog.ui.media.MediaModel.prototype.findCategoryWithScheme = function(scheme) {\n  if (!this.categories_) {\n    return null;\n  }\n  var category = goog.array.find(this.categories_, function(category) {\n    return category ? (scheme == category.getScheme()) : false;\n  });\n  return /** @type {goog.ui.media.MediaModel.Category} */ (category);\n};\n\n\n/**\n * Gets the credits of the media.\n * @return {!Array<goog.ui.media.MediaModel.Credit>} The credits of the media.\n */\ngoog.ui.media.MediaModel.prototype.getCredits = function() {\n  return this.credits_;\n};\n\n\n/**\n * Sets the credits of the media\n * @param {!Array<goog.ui.media.MediaModel.Credit>} credits The credits of the\n *     media.\n * @return {!goog.ui.media.MediaModel} The object itself, used for chaining.\n */\ngoog.ui.media.MediaModel.prototype.setCredits = function(credits) {\n  this.credits_ = credits;\n  return this;\n};\n\n\n/**\n * Finds all credits with the given role.\n * @param {string} role The role to search for.\n * @return {!Array<!goog.ui.media.MediaModel.Credit>} An array of credits\n *     with the given role. May be empty.\n */\ngoog.ui.media.MediaModel.prototype.findCreditsWithRole = function(role) {\n  var credits = goog.array.filter(\n      this.credits_, function(credit) { return role == credit.getRole(); });\n  return /** @type {!Array<!goog.ui.media.MediaModel.Credit>} */ (credits);\n};\n\n\n/**\n * Gets the subtitles for the media.\n * @return {Array<goog.ui.media.MediaModel.SubTitle>} The subtitles.\n */\ngoog.ui.media.MediaModel.prototype.getSubTitles = function() {\n  return this.subTitles_;\n};\n\n\n/**\n * Sets the subtitles for the media\n * @param {Array<goog.ui.media.MediaModel.SubTitle>} subtitles The subtitles.\n * @return {!goog.ui.media.MediaModel} The object itself.\n */\ngoog.ui.media.MediaModel.prototype.setSubTitles = function(subtitles) {\n  this.subTitles_ = subtitles;\n  return this;\n};\n\n\n\n/**\n * Constructs a thumbnail containing details of the thumbnail's image URL and\n * optionally its size.\n * @param {string} url The URL of the thumbnail's image.\n * @param {goog.math.Size=} opt_size The size of the thumbnail's image if known.\n * @constructor\n * @final\n */\ngoog.ui.media.MediaModel.Thumbnail = function(url, opt_size) {\n  /**\n   * The thumbnail's image URL.\n   * @type {string}\n   * @private\n   */\n  this.url_ = url;\n\n  /**\n   * The size of the thumbnail's image if known.\n   * @type {goog.math.Size}\n   * @private\n   */\n  this.size_ = opt_size || null;\n};\n\n\n/**\n * Gets the thumbnail URL.\n * @return {string} The thumbnail's image URL.\n */\ngoog.ui.media.MediaModel.Thumbnail.prototype.getUrl = function() {\n  return this.url_;\n};\n\n\n/**\n * Sets the thumbnail URL.\n * @param {string} url The thumbnail's image URL.\n * @return {!goog.ui.media.MediaModel.Thumbnail} The object itself, used for\n *     chaining.\n */\ngoog.ui.media.MediaModel.Thumbnail.prototype.setUrl = function(url) {\n  this.url_ = url;\n  return this;\n};\n\n\n/**\n * Gets the thumbnail size.\n * @return {goog.math.Size} The size of the thumbnail's image if known.\n */\ngoog.ui.media.MediaModel.Thumbnail.prototype.getSize = function() {\n  return this.size_;\n};\n\n\n/**\n * Sets the thumbnail size.\n * @param {goog.math.Size} size The size of the thumbnail's image.\n * @return {!goog.ui.media.MediaModel.Thumbnail} The object itself, used for\n *     chaining.\n */\ngoog.ui.media.MediaModel.Thumbnail.prototype.setSize = function(size) {\n  this.size_ = size;\n  return this;\n};\n\n\n\n/**\n * Constructs a player containing details of the player's URL and\n * optionally its size.\n * @param {!goog.html.TrustedResourceUrl} url The URL of the player.\n * @param {Object=} opt_vars Optional map of arguments to the player.\n * @param {goog.math.Size=} opt_size The size of the player if known.\n * @constructor\n * @final\n */\ngoog.ui.media.MediaModel.Player = function(url, opt_vars, opt_size) {\n  /**\n   * The player's URL.\n   * @type {!goog.html.TrustedResourceUrl}\n   * @private\n   */\n  this.trustedResourceUrl_ = url;\n\n  /**\n   * Player arguments, typically flash arguments.\n   * @type {Object}\n   * @private\n   */\n  this.vars_ = opt_vars || null;\n\n  /**\n   * The size of the player if known.\n   * @type {goog.math.Size}\n   * @private\n   */\n  this.size_ = opt_size || null;\n};\n\n\n/**\n * Gets the player URL.\n * @return {!goog.html.TrustedResourceUrl} The player's URL.\n */\ngoog.ui.media.MediaModel.Player.prototype.getTrustedResourceUrl = function() {\n  return this.trustedResourceUrl_;\n};\n\n\n/**\n * Gets the player URL.\n * @return {string} The player's URL.\n */\ngoog.ui.media.MediaModel.Player.prototype.getUrl = function() {\n  return this.trustedResourceUrl_.getTypedStringValue();\n};\n\n\n/**\n * Sets the player URL.\n * @param {!goog.html.TrustedResourceUrl} url The player's URL.\n * @return {!goog.ui.media.MediaModel.Player} The object itself, used for\n *     chaining.\n */\ngoog.ui.media.MediaModel.Player.prototype.setUrl = function(url) {\n  this.trustedResourceUrl_ = url;\n  return this;\n};\n\n\n/**\n * Gets the player arguments.\n * @return {Object} The media player arguments.\n */\ngoog.ui.media.MediaModel.Player.prototype.getVars = function() {\n  return this.vars_;\n};\n\n\n/**\n * Sets the player arguments.\n * @param {Object} vars The media player arguments.\n * @return {!goog.ui.media.MediaModel.Player} The object itself, used for\n *     chaining.\n */\ngoog.ui.media.MediaModel.Player.prototype.setVars = function(vars) {\n  this.vars_ = vars;\n  return this;\n};\n\n\n/**\n * Gets the size of the player.\n * @return {goog.math.Size} The size of the player if known.\n */\ngoog.ui.media.MediaModel.Player.prototype.getSize = function() {\n  return this.size_;\n};\n\n\n/**\n * Sets the size of the player.\n * @param {goog.math.Size} size The size of the player.\n * @return {!goog.ui.media.MediaModel.Player} The object itself, used for\n *     chaining.\n */\ngoog.ui.media.MediaModel.Player.prototype.setSize = function(size) {\n  this.size_ = size;\n  return this;\n};\n\n\n\n/**\n * A taxonomy to be set that gives an indication of the type of media content,\n * and its particular contents.\n * @param {string} scheme The URI that identifies the categorization scheme.\n * @param {string} value The value of the category.\n * @param {string=} opt_label The human readable label that can be displayed in\n *     end user applications.\n * @constructor\n * @final\n */\ngoog.ui.media.MediaModel.Category = function(scheme, value, opt_label) {\n  /**\n   * The URI that identifies the categorization scheme.\n   * @type {string}\n   * @private\n   */\n  this.scheme_ = scheme;\n\n  /**\n   * The value of the category.\n   * @type {string}\n   * @private\n   */\n  this.value_ = value;\n\n  /**\n   * The human readable label that can be displayed in end user applications.\n   * @type {string}\n   * @private\n   */\n  this.label_ = opt_label || '';\n};\n\n\n/**\n * Gets the category scheme.\n * @return {string} The category scheme URI.\n */\ngoog.ui.media.MediaModel.Category.prototype.getScheme = function() {\n  return this.scheme_;\n};\n\n\n/**\n * Sets the category scheme.\n * @param {string} scheme The category's scheme.\n * @return {!goog.ui.media.MediaModel.Category} The object itself, used for\n *     chaining.\n */\ngoog.ui.media.MediaModel.Category.prototype.setScheme = function(scheme) {\n  this.scheme_ = scheme;\n  return this;\n};\n\n\n/**\n * Gets the categor's value.\n * @return {string} The category's value.\n */\ngoog.ui.media.MediaModel.Category.prototype.getValue = function() {\n  return this.value_;\n};\n\n\n/**\n * Sets the category value.\n * @param {string} value The category value to be set.\n * @return {!goog.ui.media.MediaModel.Category} The object itself, used for\n *     chaining.\n */\ngoog.ui.media.MediaModel.Category.prototype.setValue = function(value) {\n  this.value_ = value;\n  return this;\n};\n\n\n/**\n * Gets the label of the category.\n * @return {string} The label of the category.\n */\ngoog.ui.media.MediaModel.Category.prototype.getLabel = function() {\n  return this.label_;\n};\n\n\n/**\n * Sets the label of the category.\n * @param {string} label The label of the category.\n * @return {!goog.ui.media.MediaModel.Category} The object itself, used for\n *     chaining.\n */\ngoog.ui.media.MediaModel.Category.prototype.setLabel = function(label) {\n  this.label_ = label;\n  return this;\n};\n\n\n\n/**\n * Indicates an entity that has contributed to a media object. Based on\n * 'media.credit' in the rss spec.\n * @param {string} value The name of the entity being credited.\n * @param {goog.ui.media.MediaModel.Credit.Role=} opt_role The role the entity\n *     played.\n * @param {goog.ui.media.MediaModel.Credit.Scheme=} opt_scheme The URI that\n *     identifies the role scheme.\n * @constructor\n * @final\n */\ngoog.ui.media.MediaModel.Credit = function(value, opt_role, opt_scheme) {\n  /**\n   * The name of entity being credited.\n   * @type {string}\n   * @private\n   */\n  this.value_ = value;\n\n  /**\n   * The role the entity played.\n   * @type {goog.ui.media.MediaModel.Credit.Role|undefined}\n   * @private\n   */\n  this.role_ = opt_role;\n\n  /**\n   * The URI that identifies the role scheme\n   * @type {goog.ui.media.MediaModel.Credit.Scheme|undefined}\n   * @private\n   */\n  this.scheme_ = opt_scheme;\n};\n\n\n/**\n * The types of known roles.\n * @enum {string}\n */\ngoog.ui.media.MediaModel.Credit.Role = {\n  UPLOADER: 'uploader',\n  OWNER: 'owner'\n};\n\n\n/**\n * The types of known schemes.\n * @enum {string}\n */\ngoog.ui.media.MediaModel.Credit.Scheme = {\n  EUROPEAN_BROADCASTING: 'urn:ebu',\n  YAHOO: 'urn:yvs',\n  YOUTUBE: 'urn:youtube'\n};\n\n\n/**\n * Gets the name of the entity being credited.\n * @return {string} The name of the entity.\n */\ngoog.ui.media.MediaModel.Credit.prototype.getValue = function() {\n  return this.value_;\n};\n\n\n/**\n * Sets the value of the credit object.\n * @param {string} value The value.\n * @return {!goog.ui.media.MediaModel.Credit} The object itself.\n */\ngoog.ui.media.MediaModel.Credit.prototype.setValue = function(value) {\n  this.value_ = value;\n  return this;\n};\n\n\n/**\n * Gets the role of the entity being credited.\n * @return {goog.ui.media.MediaModel.Credit.Role|undefined} The role of the\n *     entity.\n */\ngoog.ui.media.MediaModel.Credit.prototype.getRole = function() {\n  return this.role_;\n};\n\n\n/**\n * Sets the role of the credit object.\n * @param {goog.ui.media.MediaModel.Credit.Role} role The role.\n * @return {!goog.ui.media.MediaModel.Credit} The object itself.\n */\ngoog.ui.media.MediaModel.Credit.prototype.setRole = function(role) {\n  this.role_ = role;\n  return this;\n};\n\n\n/**\n * Gets the scheme of the credit object.\n * @return {goog.ui.media.MediaModel.Credit.Scheme|undefined} The URI that\n *     identifies the role scheme.\n */\ngoog.ui.media.MediaModel.Credit.prototype.getScheme = function() {\n  return this.scheme_;\n};\n\n\n/**\n * Sets the scheme of the credit object.\n * @param {goog.ui.media.MediaModel.Credit.Scheme} scheme The scheme.\n * @return {!goog.ui.media.MediaModel.Credit} The object itself.\n */\ngoog.ui.media.MediaModel.Credit.prototype.setScheme = function(scheme) {\n  this.scheme_ = scheme;\n  return this;\n};\n\n\n\n/**\n * A reference to the subtitle URI for a media object.\n * Implements the 'media.subTitle' in the rss spec.\n *\n * @param {string} href The subtitle's URI.\n *     to fetch the subtitle file.\n * @param {string} lang An RFC 3066 language.\n * @param {string} type The MIME type of the URI.\n * @constructor\n * @final\n */\ngoog.ui.media.MediaModel.SubTitle = function(href, lang, type) {\n  /**\n   * The subtitle href.\n   * @type {string}\n   * @private\n   */\n  this.href_ = href;\n\n  /**\n   * The RFC 3066 language.\n   * @type {string}\n   * @private\n   */\n  this.lang_ = lang;\n\n  /**\n   * The MIME type of the resource.\n   * @type {string}\n   * @private\n   */\n  this.type_ = type;\n};\n\n\n/**\n * Sets the href for the subtitle object.\n * @param {string} href The subtitle's URI.\n * @return {!goog.ui.media.MediaModel.SubTitle} The object itself.\n */\ngoog.ui.media.MediaModel.SubTitle.prototype.setHref = function(href) {\n  this.href_ = href;\n  return this;\n};\n\n\n/**\n * Get the href for the subtitle object.\n * @return {string} href The subtitle's URI.\n */\ngoog.ui.media.MediaModel.SubTitle.prototype.getHref = function() {\n  return this.href_;\n};\n\n\n/**\n * Sets the language for the subtitle object.\n * @param {string} lang The RFC 3066 language.\n * @return {!goog.ui.media.MediaModel.SubTitle} The object itself.\n */\ngoog.ui.media.MediaModel.SubTitle.prototype.setLang = function(lang) {\n  this.lang_ = lang;\n  return this;\n};\n\n\n/**\n * Get the lang for the subtitle object.\n * @return {string} lang The RFC 3066 language.\n */\ngoog.ui.media.MediaModel.SubTitle.prototype.getLang = function() {\n  return this.lang_;\n};\n\n\n/**\n * Sets the type for the subtitle object.\n * @param {string} type The MIME type.\n * @return {!goog.ui.media.MediaModel.SubTitle} The object itself.\n */\ngoog.ui.media.MediaModel.SubTitle.prototype.setType = function(type) {\n  this.type_ = type;\n  return this;\n};\n\n\n/**\n * Get the type for the subtitle object.\n * @return {string} type The MIME type.\n */\ngoog.ui.media.MediaModel.SubTitle.prototype.getType = function() {\n  return this.type_;\n};\n","^?",1579837703000,"^@",["^A",["^U8","^3","^1S"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/media/mediamodel.js"],"^S",["^A",["~$goog.ui.media.MediaModel.Medium","~$goog.ui.media.MediaModel.Credit.Role","~$goog.ui.media.MediaModel.MimeType","~$goog.ui.media.MediaModel.Credit","^U9","~$goog.ui.media.MediaModel.Player","~$goog.ui.media.MediaModel.SubTitle","~$goog.ui.media.MediaModel.Thumbnail","~$goog.ui.media.MediaModel.Category","~$goog.ui.media.MediaModel.Credit.Scheme"]],"^1",true,"^2",["^3","^1S","^U8"]],["^ ","^7",[1579837703000],"^8","goog.ui.emoji.progressiveemojipaletterenderer.js","^9",["^:","goog/ui/emoji/progressiveemojipaletterenderer.js"],"^;","goog/ui/emoji/progressiveemojipaletterenderer.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Progressive Emoji Palette renderer implementation.\n *\n */\n\ngoog.provide('goog.ui.emoji.ProgressiveEmojiPaletteRenderer');\n\ngoog.require('goog.dom.TagName');\ngoog.require('goog.style');\ngoog.require('goog.ui.emoji.EmojiPaletteRenderer');\n\n\n\n/**\n * Progressively renders an emoji palette. The progressive renderer tries to\n * use img tags instead of background-image for sprited emoji, since most\n * browsers render img tags progressively (i.e., as the data comes in), while\n * only very new browsers render background-image progressively.\n *\n * @param {string} defaultImgUrl Url of the img that should be used to fill up\n *     the cells in the emoji table, to prevent jittering. Will be stretched\n *     to the emoji cell size. A good image is a transparent dot.\n * @constructor\n * @extends {goog.ui.emoji.EmojiPaletteRenderer}\n * @final\n */\ngoog.ui.emoji.ProgressiveEmojiPaletteRenderer = function(defaultImgUrl) {\n  goog.ui.emoji.EmojiPaletteRenderer.call(this, defaultImgUrl);\n};\ngoog.inherits(\n    goog.ui.emoji.ProgressiveEmojiPaletteRenderer,\n    goog.ui.emoji.EmojiPaletteRenderer);\n\n\n/** @override */\ngoog.ui.emoji.ProgressiveEmojiPaletteRenderer.prototype\n    .buildElementFromSpriteMetadata = function(dom, spriteInfo, displayUrl) {\n  var width = spriteInfo.getWidthCssValue();\n  var height = spriteInfo.getHeightCssValue();\n  var x = spriteInfo.getXOffsetCssValue();\n  var y = spriteInfo.getYOffsetCssValue();\n  // Need this extra div for proper vertical centering.\n  var inner = dom.createDom(goog.dom.TagName.IMG, {'src': displayUrl});\n  var el = dom.createDom(\n      goog.dom.TagName.DIV, goog.getCssName('goog-palette-cell-extra'), inner);\n  goog.style.setStyle(el, {\n    'width': width,\n    'height': height,\n    'overflow': 'hidden',\n    'position': 'relative'\n  });\n  goog.style.setStyle(inner, {'left': x, 'top': y, 'position': 'absolute'});\n\n  return el;\n};\n\n\n/** @override */\ngoog.ui.emoji.ProgressiveEmojiPaletteRenderer.prototype\n    .updateAnimatedPaletteItem = function(item, animatedImg) {\n  // Just to be safe, we check for the existence of the img element within this\n  // palette item before attempting to modify it.\n  /** @type {!HTMLImageElement|undefined} */\n  var img;\n  var el = item.firstChild;\n  while (el) {\n    if ('IMG' == /** @type {!Element} */ (el).tagName) {\n      img = /** @type {!HTMLImageElement} */ (el);\n      break;\n    }\n    el = el.firstChild;\n  }\n  if (!img) {\n    return;\n  }\n\n  img.width = animatedImg.width;\n  img.height = animatedImg.height;\n  goog.style.setStyle(img, {'left': 0, 'top': 0});\n  img.src = animatedImg.src;\n};\n","^?",1579837703000,"^@",["^A",["~$goog.ui.emoji.EmojiPaletteRenderer","^3","^2Y","^4"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/emoji/progressiveemojipaletterenderer.js"],"^S",["^A",["~$goog.ui.emoji.ProgressiveEmojiPaletteRenderer"]],"^1",true,"^2",["^3","^4","^2Y","^WH"]],["^ ","^7",[1579837703000],"^8","goog.debug.error.js","^9",["^:","goog/debug/error.js"],"^;","goog/debug/error.js","^<","^=","^>","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a base class for custom Error objects such that the\n * stack is correctly maintained.\n *\n * You should never need to throw goog.debug.Error(msg) directly, Error(msg) is\n * sufficient.\n *\n */\n\ngoog.provide('goog.debug.Error');\n\n\n\n/**\n * Base class for custom error objects.\n * @param {*=} opt_msg The message associated with the error.\n * @constructor\n * @extends {Error}\n */\ngoog.debug.Error = function(opt_msg) {\n\n  // Attempt to ensure there is a stack trace.\n  if (Error.captureStackTrace) {\n    Error.captureStackTrace(this, goog.debug.Error);\n  } else {\n    const stack = new Error().stack;\n    if (stack) {\n      /** @override */\n      this.stack = stack;\n    }\n  }\n\n  if (opt_msg) {\n    /** @override */\n    this.message = String(opt_msg);\n  }\n\n  /**\n   * Whether to report this error to the server. Setting this to false will\n   * cause the error reporter to not report the error back to the server,\n   * which can be useful if the client knows that the error has already been\n   * logged on the server.\n   * @type {boolean}\n   */\n  this.reportErrorToServer = true;\n};\ngoog.inherits(goog.debug.Error, Error);\n\n\n/** @override */\ngoog.debug.Error.prototype.name = 'CustomError';\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/error.js"],"^S",["^A",["^2@"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.dom.attr.js","^9",["^:","goog/dom/attr.js"],"^;","goog/dom/attr.js","^<","^=","^>","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\ngoog.provide('goog.dom.Attr');\n\n\n/**\n * Enum of all html attribute names specified by the HTML specifications.\n * @enum {string}\n */\ngoog.dom.Attr = {\n  ACCEPT: 'accept',\n  ACCEPT_CHARSET: 'accept-charset',\n  ACCESSKEY: 'accesskey',\n  ACTION: 'action',\n  ALIGN: 'align',\n  ALT: 'alt',\n  ASYNC: 'async',\n  AUTOCOMPLETE: 'autocomplete',\n  AUTOFOCUS: 'autofocus',\n  AUTOPLAY: 'autoplay',\n  AUTOSAVE: 'autosave',\n  BGCOLOR: 'bgcolor',\n  BORDER: 'border',\n  BUFFERED: 'buffered',\n  CHALLENGE: 'challenge',\n  CHARSET: 'charset',\n  CHECKED: 'checked',\n  CITE: 'cite',\n  CLASS: 'class',\n  CODE: 'code',\n  CODEBASE: 'codebase',\n  COLOR: 'color',\n  COLS: 'cols',\n  COLSPAN: 'colspan',\n  CONTENT: 'content',\n  CONTENTEDITABLE: 'contenteditable',\n  CONTEXTMENU: 'contextmenu',\n  CONTROLS: 'controls',\n  COORDS: 'coords',\n  DATA: 'data',\n  DATETIME: 'datetime',\n  DEFAULT: 'default',\n  DEFER: 'defer',\n  DIR: 'dir',\n  DIRNAME: 'dirname',\n  DISABLED: 'disabled',\n  DOWNLOAD: 'download',\n  DRAGGABLE: 'draggable',\n  DROPZONE: 'dropzone',\n  ENCTYPE: 'enctype',\n  FOR: 'for',\n  FORM: 'form',\n  FORMACTION: 'formaction',\n  HEADERS: 'headers',\n  HEIGHT: 'height',\n  HIDDEN: 'hidden',\n  HIGH: 'high',\n  HREF: 'href',\n  HREFLANG: 'hreflang',\n  HTTP_EQUIV: 'http-equiv',\n  ICON: 'icon',\n  ID: 'id',\n  ISMAP: 'ismap',\n  ITEMPROP: 'itemprop',\n  KEYTYPE: 'keytype',\n  KIND: 'kind',\n  LABEL: 'label',\n  LANG: 'lang',\n  LANGUAGE: 'language',\n  LIST: 'list',\n  LOOP: 'loop',\n  LOW: 'low',\n  MANIFEST: 'manifest',\n  MAX: 'max',\n  MAXLENGTH: 'maxlength',\n  MEDIA: 'media',\n  METHOD: 'method',\n  MIN: 'min',\n  MULTIPLE: 'multiple',\n  MUTED: 'muted',\n  NAME: 'name',\n  NOVALIDATE: 'novalidate',\n  OPEN: 'open',\n  OPTIMUM: 'optimum',\n  PATTERN: 'pattern',\n  PING: 'ping',\n  PLACEHOLDER: 'placeholder',\n  POSTER: 'poster',\n  PRELOAD: 'preload',\n  RADIOGROUP: 'radiogroup',\n  READONLY: 'readonly',\n  REL: 'rel',\n  REQUIRED: 'required',\n  REVERSED: 'reversed',\n  ROWS: 'rows',\n  ROWSPAN: 'rowspan',\n  SANDBOX: 'sandbox',\n  SCOPE: 'scope',\n  SCOPED: 'scoped',\n  SEAMLESS: 'seamless',\n  SELECTED: 'selected',\n  SHAPE: 'shape',\n  SIZE: 'size',\n  SIZES: 'sizes',\n  SPAN: 'span',\n  SPELLCHECK: 'spellcheck',\n  SRC: 'src',\n  SRCDOC: 'srcdoc',\n  SRCLANG: 'srclang',\n  SRCSET: 'srcset',\n  START: 'start',\n  STEP: 'step',\n  STYLE: 'style',\n  SUMMARY: 'summary',\n  TABINDEX: 'tabindex',\n  TARGET: 'target',\n  TITLE: 'title',\n  TYPE: 'type',\n  USEMAP: 'usemap',\n  VALUE: 'value',\n  WIDTH: 'width',\n  WRAP: 'wrap'\n};\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/attr.js"],"^S",["^A",["~$goog.dom.Attr"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.module.moduleloader.js","^9",["^:","goog/module/moduleloader.js"],"^;","goog/module/moduleloader.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The module loader for loading modules across the network.\n *\n * Browsers do not guarantee that scripts appended to the document\n * are executed in the order they are added. For production mode, we use\n * XHRs to load scripts, because they do not have this problem and they\n * have superior mechanisms for handling failure. However, XHR-evaled\n * scripts are harder to debug.\n *\n * In debugging mode, we use normal script tags. In order to make this work,\n * we load the scripts in serial: we do not execute script B to the document\n * until we are certain that script A is finished loading.\n *\n */\n\ngoog.provide('goog.module.ModuleLoader');\n\ngoog.require('goog.Timer');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.safe');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventId');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.functions');\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.labs.userAgent.browser');\ngoog.require('goog.log');\ngoog.require('goog.module.AbstractModuleLoader');\ngoog.require('goog.net.BulkLoader');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.jsloader');\ngoog.require('goog.userAgent');\ngoog.require('goog.userAgent.product');\n\n\n\n/**\n * A class that loads JavaScript modules.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @implements {goog.module.AbstractModuleLoader}\n */\ngoog.module.ModuleLoader = function() {\n  goog.module.ModuleLoader.base(this, 'constructor');\n\n  /**\n   * Event handler for managing handling events.\n   * @type {goog.events.EventHandler<!goog.module.ModuleLoader>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n  this.registerDisposable(this.eventHandler_);\n\n  /**\n   * A map from module IDs to goog.module.ModuleLoader.LoadStatus.\n   * @type {!Object<Array<string>, goog.module.ModuleLoader.LoadStatus>}\n   * @private\n   */\n  this.loadingModulesStatus_ = {};\n};\ngoog.inherits(goog.module.ModuleLoader, goog.events.EventTarget);\n\n\n/**\n * A logger.\n * @type {goog.log.Logger}\n * @protected\n */\ngoog.module.ModuleLoader.prototype.logger =\n    goog.log.getLogger('goog.module.ModuleLoader');\n\n\n/**\n * Whether debug mode is enabled.\n * @type {boolean}\n * @private\n */\ngoog.module.ModuleLoader.prototype.debugMode_ = false;\n\n\n/**\n * Whether source url injection is enabled.\n * @type {boolean}\n * @private\n */\ngoog.module.ModuleLoader.prototype.sourceUrlInjection_ = false;\n\n\n/**\n * Whether to load modules with non-async script tags.\n * @type {boolean}\n * @private\n */\ngoog.module.ModuleLoader.prototype.useScriptTags_ = false;\n\n\n/**\n * @return {boolean} Whether sourceURL affects stack traces.\n */\ngoog.module.ModuleLoader.supportsSourceUrlStackTraces = function() {\n  return goog.userAgent.product.CHROME ||\n      (goog.labs.userAgent.browser.isFirefox() &&\n       goog.labs.userAgent.browser.isVersionOrHigher('36'));\n};\n\n\n/**\n * @return {boolean} Whether sourceURL affects the debugger.\n */\ngoog.module.ModuleLoader.supportsSourceUrlDebugger = function() {\n  return goog.userAgent.product.CHROME || goog.userAgent.GECKO;\n};\n\n\n/**\n * URLs have a browser-dependent max character limit. IE9-IE11 are the lowest\n * common denominators for what we support - with a limit of 4043:\n * https://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers#31250734\n * If the URL constructed by the loader exceeds this limit, we will try to split\n * it into multiple requests.\n * TODO(user): Make this configurable since not all users care about IE.\n * @const {number}\n * @private\n */\ngoog.module.ModuleLoader.URL_MAX_LENGTH_ = 4043;\n\n\n/**\n * Error code for javascript syntax and network errors.\n * TODO(user): Detect more accurate error info.\n * @const {number}\n * @private\n */\ngoog.module.ModuleLoader.SYNTAX_OR_NETWORK_ERROR_CODE_ = -1;\n\n\n\n/**\n * @param {!goog.html.TrustedResourceUrl} url The url to be loaded.\n * @return {!HTMLScriptElement}\n * @private\n */\ngoog.module.ModuleLoader.createScriptElement_ = function(url) {\n  const script = goog.dom.createElement(goog.dom.TagName.SCRIPT);\n  goog.dom.safe.setScriptSrc(script, url);\n\n  // Set scriptElt.async = false to guarantee\n  // that scripts are loaded in parallel but executed in the insertion order.\n  // For more details, check\n  // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script\n  script.async = false;\n  return script;\n};\n\n\n/**\n * @param {!goog.html.TrustedResourceUrl} url The url to be pre-loaded.\n * @return {!HTMLLinkElement}\n * @private\n */\ngoog.module.ModuleLoader.createPreloadScriptElement_ = function(url) {\n  const link = goog.dom.createElement(goog.dom.TagName.LINK);\n  goog.dom.safe.setLinkHrefAndRel(link, url, 'preload');\n  link.as = 'script';\n  return link;\n};\n\n\n/**\n * Gets the debug mode for the loader.\n * @return {boolean} Whether the debug mode is enabled.\n */\ngoog.module.ModuleLoader.prototype.getDebugMode = function() {\n  return this.debugMode_;\n};\n\n\n/**\n * @param {boolean} useScriptTags Whether or not to use script tags\n *     (with async=false) for loading.\n */\ngoog.module.ModuleLoader.prototype.setUseScriptTags = function(useScriptTags) {\n  this.useScriptTags_ = useScriptTags;\n};\n\n\n/**\n * Gets whether we're using non-async script tags for loading.\n * @return {boolean} Whether or not we're using non-async script tags for\n *     loading.\n */\ngoog.module.ModuleLoader.prototype.getUseScriptTags = function() {\n  return this.useScriptTags_;\n};\n\n\n/**\n * Sets whether we're using non-async script tags for loading.\n * @param {boolean} debugMode Whether the debug mode is enabled.\n */\ngoog.module.ModuleLoader.prototype.setDebugMode = function(debugMode) {\n  this.debugMode_ = debugMode;\n};\n\n\n/**\n * When enabled, we will add a sourceURL comment to the end of all scripts\n * to mark their origin.\n *\n * On WebKit, stack traces will reflect the sourceURL comment, so this is\n * useful for debugging webkit stack traces in production.\n *\n * Notice that in debug mode, we will use source url injection + eval rather\n * then appending script nodes to the DOM, because the scripts will load far\n * faster.  (Appending script nodes is very slow, because we can't parallelize\n * the downloading and evaling of the script).\n *\n * The cost of appending sourceURL information is negligible when compared to\n * the cost of evaling the script. Almost all clients will want this on.\n *\n * TODO(nicksantos): Turn this on by default. We may want to turn this off\n * for clients that inject their own sourceURL.\n *\n * @param {boolean} enabled Whether source url injection is enabled.\n */\ngoog.module.ModuleLoader.prototype.setSourceUrlInjection = function(enabled) {\n  this.sourceUrlInjection_ = enabled;\n};\n\n\n/**\n * @return {boolean} Whether we're using source url injection.\n * @private\n */\ngoog.module.ModuleLoader.prototype.usingSourceUrlInjection_ = function() {\n  return this.sourceUrlInjection_ ||\n      (this.getDebugMode() &&\n       goog.module.ModuleLoader.supportsSourceUrlStackTraces());\n};\n\n\n/** @override */\ngoog.module.ModuleLoader.prototype.loadModules = function(\n    ids, moduleInfoMap, opt_successFn, opt_errorFn, opt_timeoutFn,\n    opt_forceReload) {\n  var loadStatus = this.loadingModulesStatus_[ids] ||\n      goog.module.ModuleLoader.LoadStatus.createForIds_(ids, moduleInfoMap);\n  loadStatus.loadRequested = true;\n  if (loadStatus.successFn && opt_successFn) {\n    // If there already exists a success function, chain it before the passed\n    // success functon.\n    loadStatus.successFn =\n        goog.functions.sequence(loadStatus.successFn, opt_successFn);\n  } else {\n    loadStatus.successFn = opt_successFn || loadStatus.successFn;\n  }\n  loadStatus.errorFn = opt_errorFn || null;\n\n  if (!this.loadingModulesStatus_[ids]) {\n    // Modules were not prefetched.\n    this.loadingModulesStatus_[ids] = loadStatus;\n    this.downloadModules_(ids);\n    // TODO(user): Need to handle timeouts in the module loading code.\n  } else if (this.getUseScriptTags()) {\n    // We started prefetching but we used <link rel=\"preload\".../> tags, so we\n    // rely on the browser to reconcile the (existing) prefetch request and the\n    // script tag we're about to insert.\n    this.downloadModules_(ids);\n  } else if (loadStatus.responseTexts != null) {\n    // Modules prefetch is complete.\n    this.evaluateCode_(ids);\n  }\n  // Otherwise modules prefetch is in progress, and these modules will be\n  // executed after the prefetch is complete.\n};\n\n\n/**\n * Evaluate the JS code.\n * @param {Array<string>} moduleIds The module ids.\n * @private\n */\ngoog.module.ModuleLoader.prototype.evaluateCode_ = function(moduleIds) {\n  this.dispatchEvent(\n      new goog.module.ModuleLoader.RequestSuccessEvent(moduleIds));\n\n  goog.log.info(this.logger, 'evaluateCode ids:' + moduleIds);\n  var loadStatus = this.loadingModulesStatus_[moduleIds];\n  var uris = loadStatus.requestUris;\n  var texts = loadStatus.responseTexts;\n  var error = null;\n  try {\n    if (this.usingSourceUrlInjection_()) {\n      for (var i = 0; i < uris.length; i++) {\n        var uri = uris[i];\n        goog.globalEval(texts[i] + ' //# sourceURL=' + uri);\n      }\n    } else {\n      goog.globalEval(texts.join('\\n'));\n    }\n  } catch (e) {\n    error = e;\n    // TODO(user): Consider throwing an exception here.\n    goog.log.warning(\n        this.logger, 'Loaded incomplete code for module(s): ' + moduleIds, e);\n  }\n\n  this.dispatchEvent(new goog.module.ModuleLoader.EvaluateCodeEvent(moduleIds));\n\n  if (error) {\n    this.handleErrorHelper_(\n        moduleIds, loadStatus.errorFn, null /* status */, error);\n  } else if (loadStatus.successFn) {\n    loadStatus.successFn();\n  }\n  delete this.loadingModulesStatus_[moduleIds];\n};\n\n\n/**\n * Handles a successful response to a request for prefetch or load one or more\n * modules.\n *\n * @param {goog.net.BulkLoader} bulkLoader The bulk loader.\n * @param {Array<string>} moduleIds The ids of the modules requested.\n * @private\n */\ngoog.module.ModuleLoader.prototype.handleSuccess_ = function(\n    bulkLoader, moduleIds) {\n  goog.log.info(this.logger, 'Code loaded for module(s): ' + moduleIds);\n\n  var loadStatus = this.loadingModulesStatus_[moduleIds];\n  loadStatus.responseTexts = bulkLoader.getResponseTexts();\n\n  if (loadStatus.loadRequested) {\n    this.evaluateCode_(moduleIds);\n  }\n\n  // NOTE: A bulk loader instance is used for loading a set of module ids.\n  // Once these modules have been loaded successfully or in error the bulk\n  // loader should be disposed as it is not needed anymore. A new bulk loader\n  // is instantiated for any new modules to be loaded. The dispose is called\n  // on a timer so that the bulkloader has a chance to release its\n  // objects.\n  goog.Timer.callOnce(bulkLoader.dispose, 5, bulkLoader);\n};\n\n\n/** @override */\ngoog.module.ModuleLoader.prototype.prefetchModule = function(id, moduleInfo) {\n  // Do not prefetch in debug mode\n  if (this.getDebugMode()) {\n    return;\n  }\n  goog.log.info(this.logger, `Prefetching module: ${id}`);\n  var loadStatus = this.loadingModulesStatus_[[id]];\n  if (loadStatus) {\n    return;\n  }\n  var moduleInfoMap = {};\n  moduleInfoMap[id] = moduleInfo;\n  loadStatus =\n      goog.module.ModuleLoader.LoadStatus.createForIds_([id], moduleInfoMap);\n  this.loadingModulesStatus_[[id]] = loadStatus;\n  if (this.getUseScriptTags()) {\n    const links = [];\n    const insertPos = document.head || document.documentElement;\n    for (var i = 0; i < loadStatus.trustedRequestUris.length; i++) {\n      const link = goog.module.ModuleLoader.createPreloadScriptElement_(\n          loadStatus.trustedRequestUris[i]);\n      links.push(link);\n      insertPos.insertBefore(link, insertPos.firstChild);\n    }\n    loadStatus.successFn = () => {\n      for (var i = 0; i < links.length; i++) {\n        const link = links[i];\n        goog.dom.removeNode(link);\n      }\n    };\n  } else {\n    this.downloadModules_([id]);\n  }\n};\n\n\n/**\n * Downloads a list of JavaScript modules.\n *\n * @param {?Array<string>} ids The module ids in dependency order.\n * @private\n */\ngoog.module.ModuleLoader.prototype.downloadModules_ = function(ids) {\n  const debugMode = this.getDebugMode();\n  const sourceUrlInjection = this.usingSourceUrlInjection_();\n  const useScriptTags = this.getUseScriptTags();\n  if ((debugMode + sourceUrlInjection + useScriptTags) > 1) {\n    const effectiveFlag = useScriptTags ?\n        'useScriptTags' :\n        (debugMode && !sourceUrlInjection) ? 'debug' : 'sourceUrlInjection';\n    goog.log.warning(\n        this.logger,\n        `More than one of debugMode (set to ${debugMode}), ` +\n            `useScriptTags (set to ${useScriptTags}), ` +\n            `and sourceUrlInjection (set to ${sourceUrlInjection}) ` +\n            `is enabled. Proceeding with download as if ` +\n            `${effectiveFlag} is set to true and the rest to false.`);\n  }\n  const loadStatus = goog.asserts.assert(this.loadingModulesStatus_[ids]);\n\n  if (useScriptTags) {\n    this.loadWithNonAsyncScriptTag_(loadStatus, ids);\n  } else if (debugMode && !sourceUrlInjection) {\n    // In debug mode use <script> tags rather than XHRs to load the files.\n    // This makes it possible to debug and inspect stack traces more easily.\n    // It's also possible to use it to load JavaScript files that are hosted on\n    // another domain.\n    // The scripts need to load serially, so this is much slower than parallel\n    // script loads with source url injection.\n    goog.net.jsloader.safeLoadMany(loadStatus.trustedRequestUris);\n  } else {\n    goog.log.info(\n        this.logger,\n        'downloadModules ids:' + ids + ' uris:' + loadStatus.requestUris);\n\n    var bulkLoader = new goog.net.BulkLoader(loadStatus.requestUris);\n\n    var eventHandler = this.eventHandler_;\n    eventHandler.listen(\n        bulkLoader, goog.net.EventType.SUCCESS,\n        goog.bind(this.handleSuccess_, this, bulkLoader, ids));\n    eventHandler.listen(\n        bulkLoader, goog.net.EventType.ERROR,\n        goog.bind(this.handleError_, this, bulkLoader, ids));\n    bulkLoader.load();\n  }\n};\n\n\n/**\n * Downloads a list of script URIS using <script async=false.../>, which\n * guarantees executuion order.\n * @param {!goog.module.ModuleLoader.LoadStatus} loadStatus The load status\n *     object for this module-load.\n *  @param {?Array<string>} ids The module ids in dependency order.\n * @private\n */\ngoog.module.ModuleLoader.prototype.loadWithNonAsyncScriptTag_ = function(\n    loadStatus, ids) {\n  goog.log.info(this.logger, `Loading initiated for: ${ids}`);\n  if (loadStatus.trustedRequestUris.length == 0) {\n    if (loadStatus.successFn) {\n      loadStatus.successFn();\n      return;\n    }\n  }\n\n  // We'll execute the success callback when the last script enqueed reaches\n  // onLoad.\n  let lastScript = null;\n  const insertPos = document.head || document.documentElement;\n\n  for (var i = 0; i < loadStatus.trustedRequestUris.length; i++) {\n    const url = loadStatus.trustedRequestUris[i];\n    const urlLength = loadStatus.requestUris[i].length;\n    goog.asserts.assert(\n        urlLength <= goog.module.ModuleLoader.URL_MAX_LENGTH_,\n        `Module url length is ${urlLength}, which is greater than limit of ` +\n            `${goog.module.ModuleLoader.URL_MAX_LENGTH_}. This should never ` +\n            `happen.`);\n\n    const scriptElement = goog.module.ModuleLoader.createScriptElement_(url);\n\n    scriptElement.onload = () => {\n      scriptElement.onload = null;\n      scriptElement.onerror = null;\n      goog.dom.removeNode(scriptElement);\n      if (scriptElement == lastScript) {\n        goog.log.info(this.logger, `Loading complete for: ${ids}`);\n        lastScript = null;\n        if (loadStatus.successFn) {\n          loadStatus.successFn();\n        }\n      }\n    };\n\n    scriptElement.onerror = () => {\n      goog.log.error(\n          this.logger, `Network error when loading module(s): ${ids}`);\n      scriptElement.onload = null;\n      scriptElement.onerror = null;\n      goog.dom.removeNode(scriptElement);\n      this.handleErrorHelper_(\n          ids, loadStatus.errorFn,\n          goog.module.ModuleLoader.SYNTAX_OR_NETWORK_ERROR_CODE_);\n      if (lastScript == scriptElement) {\n        lastScript = null;\n      } else {\n        goog.log.error(\n            this.logger,\n            `Dependent requests were made in parallel with failed request ` +\n                `for module(s) \"${ids}\". Non-recoverable out-of-order ` +\n                `execution may occur.`);\n      }\n    };\n    lastScript = scriptElement;\n    insertPos.insertBefore(scriptElement, insertPos.firstChild);\n  }\n};\n\n\n/**\n * Handles an error during a request for one or more modules.\n * @param {goog.net.BulkLoader} bulkLoader The bulk loader.\n * @param {Array<string>} moduleIds The ids of the modules requested.\n * @param {!goog.net.BulkLoader.LoadErrorEvent} event The load error event.\n * @private\n */\ngoog.module.ModuleLoader.prototype.handleError_ = function(\n    bulkLoader, moduleIds, event) {\n  var loadStatus = this.loadingModulesStatus_[moduleIds];\n  // The bulk loader doesn't cancel other requests when a request fails. We will\n  // delete the loadStatus in the first failure, so it will be undefined in\n  // subsequent errors.\n  if (loadStatus) {\n    delete this.loadingModulesStatus_[moduleIds];\n    this.handleErrorHelper_(moduleIds, loadStatus.errorFn, event.status);\n  }\n\n  // NOTE: A bulk loader instance is used for loading a set of module ids. Once\n  // these modules have been loaded successfully or in error the bulk loader\n  // should be disposed as it is not needed anymore. A new bulk loader is\n  // instantiated for any new modules to be loaded. The dispose is called\n  // on another thread so that the bulkloader has a chance to release its\n  // objects.\n  goog.Timer.callOnce(bulkLoader.dispose, 5, bulkLoader);\n};\n\n\n/**\n * Handles an error during a request for one or more modules.\n * @param {Array<string>} moduleIds The ids of the modules requested.\n * @param {?function(?number)} errorFn The function to call on failure.\n * @param {?number} status The response status.\n * @param {!Error=} opt_error The error encountered, if available.\n * @private\n */\ngoog.module.ModuleLoader.prototype.handleErrorHelper_ = function(\n    moduleIds, errorFn, status, opt_error) {\n  this.dispatchEvent(new goog.module.ModuleLoader.RequestErrorEvent(\n      moduleIds, status, opt_error));\n\n  goog.log.warning(this.logger, 'Request failed for module(s): ' + moduleIds);\n\n  if (errorFn) {\n    errorFn(status);\n  }\n};\n\n\n/**\n * Events dispatched by the ModuleLoader.\n * @const\n */\ngoog.module.ModuleLoader.EventType = {\n  /**\n   * @const {!goog.events.EventId<\n   *     !goog.module.ModuleLoader.EvaluateCodeEvent>} Called after the code for\n   *     a module is evaluated.\n   */\n  EVALUATE_CODE:\n      new goog.events.EventId(goog.events.getUniqueId('evaluateCode')),\n\n  /**\n   * @const {!goog.events.EventId<\n   *     !goog.module.ModuleLoader.RequestSuccessEvent>} Called when the\n   *     BulkLoader finishes successfully.\n   */\n  REQUEST_SUCCESS:\n      new goog.events.EventId(goog.events.getUniqueId('requestSuccess')),\n\n  /**\n   * @const {!goog.events.EventId<\n   *     !goog.module.ModuleLoader.RequestErrorEvent>} Called when the\n   *     BulkLoader fails, or code loading fails.\n   */\n  REQUEST_ERROR:\n      new goog.events.EventId(goog.events.getUniqueId('requestError'))\n};\n\n\n\n/**\n * @param {Array<string>} moduleIds The ids of the modules being evaluated.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n * @protected\n */\ngoog.module.ModuleLoader.EvaluateCodeEvent = function(moduleIds) {\n  goog.module.ModuleLoader.EvaluateCodeEvent.base(\n      this, 'constructor', goog.module.ModuleLoader.EventType.EVALUATE_CODE);\n\n  /**\n   * @type {Array<string>}\n   */\n  this.moduleIds = moduleIds;\n};\ngoog.inherits(goog.module.ModuleLoader.EvaluateCodeEvent, goog.events.Event);\n\n\n\n/**\n * @param {Array<string>} moduleIds The ids of the modules being evaluated.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n * @protected\n */\ngoog.module.ModuleLoader.RequestSuccessEvent = function(moduleIds) {\n  goog.module.ModuleLoader.RequestSuccessEvent.base(\n      this, 'constructor', goog.module.ModuleLoader.EventType.REQUEST_SUCCESS);\n\n  /**\n   * @type {Array<string>}\n   */\n  this.moduleIds = moduleIds;\n};\ngoog.inherits(goog.module.ModuleLoader.RequestSuccessEvent, goog.events.Event);\n\n\n\n/**\n * @param {?Array<string>} moduleIds The ids of the modules being evaluated.\n * @param {?number} status The response status.\n * @param {!Error=} opt_error The error encountered, if available.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n * @protected\n */\ngoog.module.ModuleLoader.RequestErrorEvent = function(\n    moduleIds, status, opt_error) {\n  goog.module.ModuleLoader.RequestErrorEvent.base(\n      this, 'constructor', goog.module.ModuleLoader.EventType.REQUEST_ERROR);\n\n  /**\n   * @type {?Array<string>}\n   */\n  this.moduleIds = moduleIds;\n\n  /** @type {?number} */\n  this.status = status;\n\n  /** @type {?Error} */\n  this.error = opt_error || null;\n};\ngoog.inherits(goog.module.ModuleLoader.RequestErrorEvent, goog.events.Event);\n\n\n\n/**\n * A class that keeps the state of the module during the loading process. It is\n * used to save loading information between modules download and evaluation.\n *  @param {!Array<!goog.html.TrustedResourceUrl>} trustedRequestUris the uris\n containing the modules implementing ids.\n\n * @constructor\n * @final\n */\ngoog.module.ModuleLoader.LoadStatus = function(trustedRequestUris) {\n  /**\n   * The request uris.\n   * @final {!Array<string>}\n   */\n  this.requestUris =\n      goog.array.map(trustedRequestUris, goog.html.TrustedResourceUrl.unwrap);\n\n  /**\n   * A TrustedResourceUrl version of `this.requestUris`\n   * @final {!Array<!goog.html.TrustedResourceUrl>}\n   */\n  this.trustedRequestUris = trustedRequestUris;\n\n  /**\n   * The response texts.\n   * @type {?Array<string>}\n   */\n  this.responseTexts = null;\n\n  /**\n   * Whether loadModules was called for the set of modules referred by this\n   * status.\n   * @type {boolean}\n   */\n  this.loadRequested = false;\n\n  /**\n   * Success callback.\n   * @type {?function()}\n   */\n  this.successFn = null;\n\n  /**\n   * Error callback.\n   * @type {?function(?number)}\n   */\n  this.errorFn = null;\n};\n\n\n/**\n * Creates a `LoadStatus` object for tracking state during the loading of the\n * modules indexed in `ids`.\n *\n * @param {?Array<string>} ids the ids for this module load in dependency\n *   order.\n * @param {!Object<string, !goog.module.ModuleInfo>} moduleInfoMap A mapping\n *     from module id to ModuleInfo object.\n * @return {!goog.module.ModuleLoader.LoadStatus}\n * @private\n */\ngoog.module.ModuleLoader.LoadStatus.createForIds_ = function(\n    ids, moduleInfoMap) {\n  if (!ids) {\n    return new goog.module.ModuleLoader.LoadStatus([]);\n  }\n  const trustedRequestUris = [];\n  for (var i = 0; i < ids.length; i++) {\n    goog.array.extend(trustedRequestUris, moduleInfoMap[ids[i]].getUris());\n  }\n  return new goog.module.ModuleLoader.LoadStatus(trustedRequestUris);\n};\n","^?",1579837703000,"^@",["^A",["^1J","^14","^U8","~$goog.module.AbstractModuleLoader","^2R","^3U","^2<","^3V","~$goog.events.EventId","~$goog.net.BulkLoader","~$goog.net.jsloader","^3","^1M","^18","^3B","^4F","^1;","~$goog.labs.userAgent.browser","^VS","^1S","^1N"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/module/moduleloader.js"],"^S",["^A",["~$goog.module.ModuleLoader"]],"^1",true,"^2",["^3","^3U","^1S","^1J","^14","^1;","^1N","^VS","^2R","^WL","^1M","^2<","^U8","^WO","^3B","^WK","^WM","^4F","^WN","^18","^3V"]],["^ ","^7",[1579837703000],"^8","goog.editor.plugins.undoredostate.js","^9",["^:","goog/editor/plugins/undoredostate.js"],"^;","goog/editor/plugins/undoredostate.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Code for an UndoRedoState interface representing an undo and\n * redo action for a particular state change. To be used by\n * {@link goog.editor.plugins.UndoRedoManager}.\n *\n */\n\n\ngoog.provide('goog.editor.plugins.UndoRedoState');\n\ngoog.require('goog.events.EventTarget');\n\n\n\n/**\n * Represents an undo and redo action for a particular state transition.\n *\n * @param {boolean} asynchronous Whether the undo or redo actions for this\n *     state complete asynchronously. If true, then this state must fire\n *     an ACTION_COMPLETED event when undo or redo is complete.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.editor.plugins.UndoRedoState = function(asynchronous) {\n  goog.editor.plugins.UndoRedoState.base(this, 'constructor');\n\n  /**\n   * Indicates if the undo or redo actions for this state complete\n   * asynchronously.\n   * @type {boolean}\n   * @private\n   */\n  this.asynchronous_ = asynchronous;\n};\ngoog.inherits(goog.editor.plugins.UndoRedoState, goog.events.EventTarget);\n\n\n/**\n * Event type for events indicating that this state has completed an undo or\n * redo operation.\n */\ngoog.editor.plugins.UndoRedoState.ACTION_COMPLETED = 'action_completed';\n\n\n/**\n * @return {boolean} Whether or not the undo and redo actions of this state\n *     complete asynchronously. If true, the state will fire an ACTION_COMPLETED\n *     event when an undo or redo action is complete.\n */\ngoog.editor.plugins.UndoRedoState.prototype.isAsynchronous = function() {\n  return this.asynchronous_;\n};\n\n\n/**\n * Undoes the action represented by this state.\n */\ngoog.editor.plugins.UndoRedoState.prototype.undo = goog.abstractMethod;\n\n\n/**\n * Redoes the action represented by this state.\n */\ngoog.editor.plugins.UndoRedoState.prototype.redo = goog.abstractMethod;\n\n\n/**\n * Checks if two undo-redo states are the same.\n * @param {goog.editor.plugins.UndoRedoState} state The state to compare.\n * @return {boolean} Wether the two states are equal.\n */\ngoog.editor.plugins.UndoRedoState.prototype.equals = goog.abstractMethod;\n","^?",1579837703000,"^@",["^A",["^3","^1M"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/undoredostate.js"],"^S",["^A",["~$goog.editor.plugins.UndoRedoState"]],"^1",true,"^2",["^3","^1M"]],["^ ","^7",[1579837703000],"^8","goog.ui.animatedzippy.js","^9",["^:","goog/ui/animatedzippy.js"],"^;","goog/ui/animatedzippy.js","^<","^=","^>","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Animated zippy widget implementation.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/zippy.html\n */\n\ngoog.provide('goog.ui.AnimatedZippy');\n\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events');\ngoog.require('goog.fx.Animation');\ngoog.require('goog.fx.Transition');\ngoog.require('goog.fx.easing');\ngoog.require('goog.ui.Zippy');\ngoog.require('goog.ui.ZippyEvent');\n\n\n\n/**\n * Zippy widget. Expandable/collapsible container, clicking the header toggles\n * the visibility of the content.\n *\n * @param {Element|string|null} header Header element, either element\n *     reference, string id or null if no header exists.\n * @param {Element|string} content Content element, either element reference or\n *     string id.\n * @param {boolean=} opt_expanded Initial expanded/visibility state. Defaults to\n *     false.\n * @param {goog.dom.DomHelper=} opt_domHelper An optional DOM helper.\n * @param {goog.a11y.aria.Role<string>=} opt_role ARIA role, default TAB.\n * @constructor\n * @extends {goog.ui.Zippy}\n */\ngoog.ui.AnimatedZippy = function(\n    header, content, opt_expanded, opt_domHelper, opt_role) {\n  var domHelper = opt_domHelper || goog.dom.getDomHelper();\n\n  // Create wrapper element and move content into it.\n  var elWrapper =\n      domHelper.createDom(goog.dom.TagName.DIV, {'style': 'overflow:hidden'});\n  var elContent = domHelper.getElement(content);\n  elContent.parentNode.replaceChild(elWrapper, elContent);\n  elWrapper.appendChild(elContent);\n\n  /**\n   * Content wrapper, used for animation.\n   * @type {Element}\n   * @private\n   */\n  this.elWrapper_ = elWrapper;\n\n  /**\n   * Reference to animation or null if animation is not active.\n   * @type {?goog.fx.Animation}\n   * @private\n   */\n  this.anim_ = null;\n\n  // Call constructor of super class.\n  goog.ui.Zippy.call(\n      this, header, elContent, opt_expanded, undefined, domHelper, opt_role);\n\n  // Set initial state.\n  // NOTE: Set the class names as well otherwise animated zippys\n  // start with empty class names.\n  var expanded = this.isExpanded();\n  this.elWrapper_.style.display = expanded ? '' : 'none';\n  this.updateHeaderClassName(expanded);\n};\ngoog.inherits(goog.ui.AnimatedZippy, goog.ui.Zippy);\ngoog.tagUnsealableClass(goog.ui.AnimatedZippy);\n\n\n/**\n * Constants for event names.\n *\n * @const\n */\ngoog.ui.AnimatedZippy.Events = {\n  // The beginning of the animation when the zippy state toggles.\n  TOGGLE_ANIMATION_BEGIN: goog.events.getUniqueId('toggleanimationbegin'),\n  // The end of the animation when the zippy state toggles.\n  TOGGLE_ANIMATION_END: goog.events.getUniqueId('toggleanimationend')\n};\n\n\n/**\n * Duration of expand/collapse animation, in milliseconds.\n * @type {number}\n */\ngoog.ui.AnimatedZippy.prototype.animationDuration = 500;\n\n\n/**\n * Acceleration function for expand/collapse animation.\n * @type {!Function}\n */\ngoog.ui.AnimatedZippy.prototype.animationAcceleration = goog.fx.easing.easeOut;\n\n\n/**\n * @return {boolean} Whether the zippy is in the process of being expanded or\n *     collapsed.\n */\ngoog.ui.AnimatedZippy.prototype.isBusy = function() {\n  return this.anim_ != null;\n};\n\n\n/**\n * Sets expanded state.\n *\n * @param {boolean} expanded Expanded/visibility state.\n * @override\n */\ngoog.ui.AnimatedZippy.prototype.setExpanded = function(expanded) {\n  if (this.isExpanded() == expanded && !this.anim_) {\n    return;\n  }\n\n  // Reset display property of wrapper to allow content element to be\n  // measured.\n  if (this.elWrapper_.style.display == 'none') {\n    this.elWrapper_.style.display = '';\n  }\n\n  // Measure content element.\n  var h = this.getContentElement().offsetHeight;\n\n  // Stop active animation (if any) and determine starting height.\n  var startH = 0;\n  if (this.anim_) {\n    expanded = this.isExpanded();\n    goog.events.removeAll(this.anim_);\n    this.anim_.stop(false);\n\n    var marginTop = parseInt(this.getContentElement().style.marginTop, 10);\n    startH = h - Math.abs(marginTop);\n  } else {\n    startH = expanded ? 0 : h;\n  }\n\n  // Updates header class name after the animation has been stopped.\n  this.updateHeaderClassName(expanded);\n\n  // Set up expand/collapse animation.\n  this.anim_ = new goog.fx.Animation(\n      [0, startH], [0, expanded ? h : 0], this.animationDuration,\n      this.animationAcceleration);\n\n  var events = [\n    goog.fx.Transition.EventType.BEGIN, goog.fx.Animation.EventType.ANIMATE,\n    goog.fx.Transition.EventType.END\n  ];\n  goog.events.listen(this.anim_, events, this.onAnimate_, false, this);\n  goog.events.listen(\n      this.anim_, goog.fx.Transition.EventType.BEGIN,\n      goog.bind(this.onAnimationBegin_, this, expanded));\n  goog.events.listen(\n      this.anim_, goog.fx.Transition.EventType.END,\n      goog.bind(this.onAnimationCompleted_, this, expanded));\n\n  // Start animation.\n  this.anim_.play(false);\n};\n\n\n/**\n * Called during animation\n *\n * @param {goog.events.Event} e The event.\n * @private\n */\ngoog.ui.AnimatedZippy.prototype.onAnimate_ = function(e) {\n  var contentElement = this.getContentElement();\n  var h = contentElement.offsetHeight;\n  contentElement.style.marginTop = (e.y - h) + 'px';\n};\n\n\n/**\n * Called once the expand/collapse animation has started.\n *\n * @param {boolean} expanding Expanded/visibility state.\n * @private\n */\ngoog.ui.AnimatedZippy.prototype.onAnimationBegin_ = function(expanding) {\n  this.dispatchEvent(new goog.ui.ZippyEvent(\n      goog.ui.AnimatedZippy.Events.TOGGLE_ANIMATION_BEGIN, this, expanding));\n};\n\n\n/**\n * Called once the expand/collapse animation has completed.\n *\n * @param {boolean} expanded Expanded/visibility state.\n * @private\n */\ngoog.ui.AnimatedZippy.prototype.onAnimationCompleted_ = function(expanded) {\n  // Fix wrong end position if the content has changed during the animation.\n  if (expanded) {\n    this.getContentElement().style.marginTop = '0';\n  }\n\n  goog.events.removeAll(/** @type {!goog.fx.Animation} */ (this.anim_));\n  this.setExpandedInternal(expanded);\n  this.anim_ = null;\n\n  if (!expanded) {\n    this.elWrapper_.style.display = 'none';\n  }\n\n  // Fire toggle event.\n  this.dispatchEvent(\n      new goog.ui.ZippyEvent(goog.ui.Zippy.Events.TOGGLE, this, expanded));\n  this.dispatchEvent(new goog.ui.ZippyEvent(\n      goog.ui.AnimatedZippy.Events.TOGGLE_ANIMATION_END, this, expanded));\n};\n","^?",1579837703000,"^@",["^A",["^14","~$goog.ui.ZippyEvent","^33","^3","~$goog.fx.Animation","~$goog.fx.Transition","~$goog.fx.easing","~$goog.ui.Zippy","^1N","^4"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/animatedzippy.js"],"^S",["^A",["~$goog.ui.AnimatedZippy"]],"^1",true,"^2",["^3","^33","^14","^4","^1N","^WS","^WT","^WU","^WV","^WR"]],["^ ","^7",[1579837703000],"^8","goog.graphics.ext.coordinates.js","^9",["^:","goog/graphics/ext/coordinates.js"],"^;","goog/graphics/ext/coordinates.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Graphics utility functions for advanced coordinates.\n *\n * This file assists the use of advanced coordinates in goog.graphics.  Coords\n * can be specified as simple numbers which will correspond to units in the\n * graphics element's coordinate space.  Alternately, coords can be expressed\n * in pixels, meaning no matter what tranformations or coordinate system changes\n * are present, the number of pixel changes will remain constant.  Coords can\n * also be expressed as percentages of their parent's size.\n *\n * This file also allows for elements to have margins, expressable in any of\n * the ways described above.\n *\n * Additional pieces of advanced coordinate functionality can (soon) be found in\n * element.js and groupelement.js.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.graphics.ext.coordinates');\n\ngoog.require('goog.string');\n\n\n/**\n * Cache of boolean values.  For a given string (key), is it special? (value)\n * @type {Object}\n * @private\n */\ngoog.graphics.ext.coordinates.specialCoordinateCache_ = {};\n\n\n/**\n * Determines if the given coordinate is a percent based coordinate or an\n * expression with a percent based component.\n * @param {string} coord The coordinate to test.\n * @return {boolean} Whether the coordinate contains the string '%'.\n * @private\n */\ngoog.graphics.ext.coordinates.isPercent_ = function(coord) {\n  return goog.string.contains(coord, '%');\n};\n\n\n/**\n * Determines if the given coordinate is a pixel based coordinate or an\n * expression with a pixel based component.\n * @param {string} coord The coordinate to test.\n * @return {boolean} Whether the coordinate contains the string 'px'.\n * @private\n */\ngoog.graphics.ext.coordinates.isPixels_ = function(coord) {\n  return goog.string.contains(coord, 'px');\n};\n\n\n/**\n * Determines if the given coordinate is special - i.e. not just a number.\n * @param {string|number|null} coord The coordinate to test.\n * @return {boolean} Whether the coordinate is special.\n */\ngoog.graphics.ext.coordinates.isSpecial = function(coord) {\n  var cache = goog.graphics.ext.coordinates.specialCoordinateCache_;\n\n  if (!(coord in cache)) {\n    cache[coord] = (typeof coord === 'string') &&\n        (goog.graphics.ext.coordinates.isPercent_(coord) ||\n         goog.graphics.ext.coordinates.isPixels_(coord));\n  }\n\n  return cache[coord];\n};\n\n\n/**\n * Returns the value of the given expression in the given context.\n *\n * Should be treated as package scope.\n *\n * @param {string|number} coord The coordinate to convert.\n * @param {number} size The size of the parent element.\n * @param {number} scale The ratio of pixels to units.\n * @return {number} The number of coordinate space units that corresponds to\n *     this coordinate.\n */\ngoog.graphics.ext.coordinates.computeValue = function(coord, size, scale) {\n  var number = parseFloat(String(coord));\n  if (typeof coord === 'string') {\n    if (goog.graphics.ext.coordinates.isPercent_(coord)) {\n      return number * size / 100;\n    } else if (goog.graphics.ext.coordinates.isPixels_(coord)) {\n      return number / scale;\n    }\n  }\n\n  return number;\n};\n\n\n/**\n * Converts the given coordinate to a number value in units.\n *\n * Should be treated as package scope.\n *\n * @param {string|number} coord The coordinate to retrieve the value for.\n * @param {boolean|undefined} forMaximum Whether we are computing the largest\n *     value this coordinate would be in a parent of no size.  The container\n *     size in this case should be set to the size of the current element.\n * @param {number} containerSize The unit value of the size of the container of\n *     this element.  Should be set to the minimum width of this element if\n *     forMaximum is true.\n * @param {number} scale The ratio of pixels to units.\n * @param {Object=} opt_cache Optional (but highly recommend) object to store\n *     cached computations in.  The calling class should manage clearing out\n *     the cache when the scale or containerSize changes.\n * @return {number} The correct number of coordinate space units.\n */\ngoog.graphics.ext.coordinates.getValue = function(\n    coord, forMaximum, containerSize, scale, opt_cache) {\n  if (typeof coord !== 'number') {\n    var cacheString = opt_cache && ((forMaximum ? 'X' : '') + coord);\n\n    if (opt_cache && cacheString in opt_cache) {\n      coord = opt_cache[cacheString];\n    } else {\n      if (goog.graphics.ext.coordinates.isSpecial(\n              /** @type {string} */ (coord))) {\n        coord = goog.graphics.ext.coordinates.computeValue(\n            coord, containerSize, scale);\n      } else {\n        // Simple coordinates just need to be converted from a string to a\n        // number.\n        coord = parseFloat(/** @type {string} */ (coord));\n      }\n\n      // Cache the result.\n      if (opt_cache) {\n        opt_cache[cacheString] = coord;\n      }\n    }\n  }\n\n  return coord;\n};\n","^?",1579837703000,"^@",["^A",["^16","^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/ext/coordinates.js"],"^S",["^A",["~$goog.graphics.ext.coordinates"]],"^1",true,"^2",["^3","^16"]],["^ ","^7",[1579837703000],"^8","goog.editor.command.js","^9",["^:","goog/editor/command.js"],"^;","goog/editor/command.js","^<","^=","^>","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Commands that the editor can execute.\n * @see ../demos/editor/editor.html\n */\ngoog.provide('goog.editor.Command');\n\n\n/**\n * Commands that the editor can excute via execCommand or queryCommandValue.\n * @enum {string}\n */\ngoog.editor.Command = {\n  // Prepend all the strings of built in execCommands with a plus to ensure\n  // that there's no conflict if a client wants to use the\n  // browser's execCommand.\n  UNDO: '+undo',\n  REDO: '+redo',\n  LINK: '+link',\n  FORMAT_BLOCK: '+formatBlock',\n  INDENT: '+indent',\n  OUTDENT: '+outdent',\n  REMOVE_FORMAT: '+removeFormat',\n  STRIKE_THROUGH: '+strikeThrough',\n  HORIZONTAL_RULE: '+insertHorizontalRule',\n  SUBSCRIPT: '+subscript',\n  SUPERSCRIPT: '+superscript',\n  UNDERLINE: '+underline',\n  BOLD: '+bold',\n  ITALIC: '+italic',\n  FONT_SIZE: '+fontSize',\n  FONT_FACE: '+fontName',\n  FONT_COLOR: '+foreColor',\n  EMOTICON: '+emoticon',\n  EQUATION: '+equation',\n  BACKGROUND_COLOR: '+backColor',\n  ORDERED_LIST: '+insertOrderedList',\n  UNORDERED_LIST: '+insertUnorderedList',\n  TABLE: '+table',\n  JUSTIFY_CENTER: '+justifyCenter',\n  JUSTIFY_FULL: '+justifyFull',\n  JUSTIFY_RIGHT: '+justifyRight',\n  JUSTIFY_LEFT: '+justifyLeft',\n  BLOCKQUOTE: '+BLOCKQUOTE',  // This is a nodename. Should be all caps.\n  DIR_LTR: 'ltr',  // should be exactly 'ltr' as it becomes dir attribute value\n  DIR_RTL: 'rtl',  // same here\n  IMAGE: 'image',\n  EDIT_HTML: 'editHtml',\n  UPDATE_LINK_BUBBLE: 'updateLinkBubble',\n\n  // queryCommandValue only: returns the default tag name used in the field.\n  // DIV should be considered the default if no plugin responds.\n  DEFAULT_TAG: '+defaultTag',\n\n  // TODO(nicksantos): Try to give clients an API so that they don't need\n  // these execCommands.\n  CLEAR_LOREM: 'clearlorem',\n  UPDATE_LOREM: 'updatelorem',\n  USING_LOREM: 'usinglorem',\n\n  // Modal editor commands (usually dialogs).\n  MODAL_LINK_EDITOR: 'link'\n};\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/command.js"],"^S",["^A",["^T@"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.ui.toolbarbutton.js","^9",["^:","goog/ui/toolbarbutton.js"],"^;","goog/ui/toolbarbutton.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A toolbar button control.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ToolbarButton');\n\ngoog.require('goog.ui.Button');\ngoog.require('goog.ui.ToolbarButtonRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * A button control for a toolbar.\n *\n * @param {goog.ui.ControlContent} content Text caption or existing DOM\n *     structure to display as the button's caption.\n * @param {goog.ui.ButtonRenderer=} opt_renderer Optional renderer used to\n *     render or decorate the button; defaults to\n *     {@link goog.ui.ToolbarButtonRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.Button}\n */\ngoog.ui.ToolbarButton = function(content, opt_renderer, opt_domHelper) {\n  goog.ui.Button.call(\n      this, content,\n      opt_renderer || goog.ui.ToolbarButtonRenderer.getInstance(),\n      opt_domHelper);\n};\ngoog.inherits(goog.ui.ToolbarButton, goog.ui.Button);\n\n\n// Registers a decorator factory function for toolbar buttons.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.ToolbarButtonRenderer.CSS_CLASS,\n    function() { return new goog.ui.ToolbarButton(null); });\n","^?",1579837703000,"^@",["^A",["^3","^29","~$goog.ui.ToolbarButtonRenderer","^44"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/toolbarbutton.js"],"^S",["^A",["~$goog.ui.ToolbarButton"]],"^1",true,"^2",["^3","^44","^WY","^29"]],["^ ","^7",[1579837703000],"^8","goog.net.xpc.crosspagechannelrole.js","^9",["^:","goog/net/xpc/crosspagechannelrole.js"],"^;","goog/net/xpc/crosspagechannelrole.js","^<","^=","^>","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides the enum for the role of the CrossPageChannel.\n *\n */\n\ngoog.provide('goog.net.xpc.CrossPageChannelRole');\n\n\n/**\n * The role of the peer.\n * @enum {number}\n */\ngoog.net.xpc.CrossPageChannelRole = {\n  OUTER: 0,\n  INNER: 1\n};\n","^?",1579837703000,"^@",["^A",["^3"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/xpc/crosspagechannelrole.js"],"^S",["^A",["^UJ"]],"^1",true,"^2",["^3"]],["^ ","^7",[1579837703000],"^8","goog.ui.toolbarcolormenubuttonrenderer.js","^9",["^:","goog/ui/toolbarcolormenubuttonrenderer.js"],"^;","goog/ui/toolbarcolormenubuttonrenderer.js","^<","^=","^>","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A toolbar-style renderer for {@link goog.ui.ColorMenuButton}.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ToolbarColorMenuButtonRenderer');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.ui.ColorMenuButtonRenderer');\ngoog.require('goog.ui.MenuButtonRenderer');\ngoog.require('goog.ui.ToolbarMenuButtonRenderer');\n\n\n\n/**\n * Toolbar-style renderer for {@link goog.ui.ColorMenuButton}s.\n * @constructor\n * @extends {goog.ui.ToolbarMenuButtonRenderer}\n * @final\n */\ngoog.ui.ToolbarColorMenuButtonRenderer = function() {\n  goog.ui.ToolbarMenuButtonRenderer.call(this);\n};\ngoog.inherits(\n    goog.ui.ToolbarColorMenuButtonRenderer, goog.ui.ToolbarMenuButtonRenderer);\ngoog.addSingletonGetter(goog.ui.ToolbarColorMenuButtonRenderer);\n\n\n/**\n * Overrides the superclass implementation by wrapping the caption text or DOM\n * structure in a color indicator element.  Creates the following DOM structure:\n *\n *    <div class=\"goog-inline-block goog-toolbar-menu-button-caption\">\n *      <div class=\"goog-color-menu-button-indicator\">\n *        Contents...\n *      </div>\n *    </div>\n *\n * @param {goog.ui.ControlContent} content Text caption or DOM structure.\n * @param {goog.dom.DomHelper} dom DOM helper, used for document interaction.\n * @return {!Element} Caption element.\n * @see goog.ui.ToolbarColorMenuButtonRenderer#createColorIndicator\n * @override\n */\ngoog.ui.ToolbarColorMenuButtonRenderer.prototype.createCaption = function(\n    content, dom) {\n  return goog.ui.MenuButtonRenderer.wrapCaption(\n      goog.ui.ColorMenuButtonRenderer.wrapCaption(content, dom),\n      this.getCssClass(), dom);\n};\n\n\n/**\n * Takes a color menu button control's root element and a value object\n * (which is assumed to be a color), and updates the button's DOM to reflect\n * the new color.  Overrides {@link goog.ui.ButtonRenderer#setValue}.\n * @param {Element} element The button control's root element (if rendered).\n * @param {*} value New value; assumed to be a color spec string.\n * @override\n */\ngoog.ui.ToolbarColorMenuButtonRenderer.prototype.setValue = function(\n    element, value) {\n  if (element) {\n    goog.ui.ColorMenuButtonRenderer.setCaptionValue(\n        this.getContentElement(element), value);\n  }\n};\n\n\n/**\n * Initializes the button's DOM when it enters the document.  Overrides the\n * superclass implementation by making sure the button's color indicator is\n * initialized.\n * @param {goog.ui.Control} button goog.ui.ColorMenuButton whose DOM is to be\n *     initialized as it enters the document.\n * @override\n */\ngoog.ui.ToolbarColorMenuButtonRenderer.prototype.initializeDom = function(\n    button) {\n  this.setValue(button.getElement(), button.getValue());\n  goog.dom.classlist.add(\n      goog.asserts.assert(button.getElement()),\n      goog.getCssName('goog-toolbar-color-menu-button'));\n  goog.ui.ToolbarColorMenuButtonRenderer.superClass_.initializeDom.call(\n      this, button);\n};\n","^?",1579837703000,"^@",["^A",["^1J","^T?","^3","^28","^4K","~$goog.ui.ColorMenuButtonRenderer"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/toolbarcolormenubuttonrenderer.js"],"^S",["^A",["~$goog.ui.ToolbarColorMenuButtonRenderer"]],"^1",true,"^2",["^3","^1J","^T?","^W[","^28","^4K"]],["^ ","^7",[1579837703000],"^8","goog.testing.shardingtestcase.js","^9",["^:","goog/testing/shardingtestcase.js"],"^;","goog/testing/shardingtestcase.js","^<","^=","^>","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility for sharding tests.\n *\n * Usage instructions:\n * <ol>\n *   <li>Instead of writing your large test in foo_test.html, write it in\n * foo_test_template.html</li>\n *   <li>Add a call to `goog.testing.ShardingTestCase.shardByFileName()`\n * near the top of your test, before any test cases or setup methods.</li>\n *   <li>Symlink foo_test_template.html into different sharded test files\n * named foo_1of4_test.html, foo_2of4_test.html, etc, using `ln -s`.</li>\n *   <li>Add the symlinks as foo_1of4_test.html.\n *       In perforce, run the command `g4 add foo_1of4_test.html` followed\n * by `g4 reopen -t symlink foo_1of4_test.html` so that perforce treats the file\n * as a symlink\n *   </li>\n * </ol>\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.setTestOnly('goog.testing.ShardingTestCase');\ngoog.provide('goog.testing.ShardingTestCase');\n\ngoog.require('goog.asserts');\ngoog.require('goog.testing.TestCase');\n\n\n\n/**\n * A test case that runs tests in per-file shards.\n * @param {number} shardIndex Shard index for this page,\n *     <strong>1-indexed</strong>.\n * @param {number} numShards Number of shards to split up test cases into.\n * @param {string=} opt_name The name of the test case.\n * @extends {goog.testing.TestCase}\n * @constructor\n * @final\n */\ngoog.testing.ShardingTestCase = function(shardIndex, numShards, opt_name) {\n  goog.testing.ShardingTestCase.base(this, 'constructor', opt_name);\n\n  goog.asserts.assert(shardIndex > 0, 'Shard index should be positive');\n  goog.asserts.assert(numShards > 0, 'Number of shards should be positive');\n  goog.asserts.assert(shardIndex <= numShards, 'Shard index out of bounds');\n\n  /**\n   * @type {number}\n   * @private\n   */\n  this.shardIndex_ = shardIndex;\n\n  /**\n   * @type {number}\n   * @private\n   */\n  this.numShards_ = numShards;\n};\ngoog.inherits(goog.testing.ShardingTestCase, goog.testing.TestCase);\n\n\n/**\n * Whether we've actually partitioned the tests yet. We may execute twice\n * ('Run again without reloading') without failing.\n * @type {boolean}\n * @private\n */\ngoog.testing.ShardingTestCase.prototype.sharded_ = false;\n\n\n/**\n * Installs a runTests global function that goog.testing.JsUnit will use to\n * run tests, which will run a single shard of the tests present on the page.\n * @override\n */\ngoog.testing.ShardingTestCase.prototype.runTests = function() {\n  if (!this.sharded_) {\n    var numTests = this.getCount();\n    goog.asserts.assert(\n        numTests >= this.numShards_,\n        'Must have at least as many tests as shards!');\n    var shardSize = Math.ceil(numTests / this.numShards_);\n    var startIndex = (this.shardIndex_ - 1) * shardSize;\n    var endIndex = startIndex + shardSize;\n    goog.asserts.assert(\n        this.order == goog.testing.TestCase.Order.SORTED,\n        'Only SORTED order is allowed for sharded tests');\n    this.setTests(this.getTests().slice(startIndex, endIndex));\n    this.sharded_ = true;\n  }\n\n  // Call original runTests method to execute the tests.\n  goog.testing.ShardingTestCase.base(this, 'runTests');\n};\n\n\n/**\n * Shards tests based on the test filename. Assumes that the filename is\n * formatted like 'foo_1of5_test.html'.\n * @param {string=} opt_name A descriptive name for the test case.\n */\ngoog.testing.ShardingTestCase.shardByFileName = function(opt_name) {\n  var path = window.location.pathname;\n  var shardMatch = path.match(/_(\\d+)of(\\d+)_test\\.(js|html)/);\n  goog.asserts.assert(\n      shardMatch, 'Filename must be of the form \"foo_1of5_test.{js,html}\"');\n  var shardIndex = parseInt(shardMatch[1], 10);\n  var numShards = parseInt(shardMatch[2], 10);\n\n  var testCase =\n      new goog.testing.ShardingTestCase(shardIndex, numShards, opt_name);\n  goog.testing.TestCase.initializeTestRunner(testCase);\n};\n","^?",1579837703000,"^@",["^A",["^1J","^3","^U0"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/shardingtestcase.js"],"^S",["^A",["~$goog.testing.ShardingTestCase"]],"^1",true,"^2",["^3","^1J","^U0"]],["^ ","^7",[1579837703000],"^8","goog.html.testing.js","^9",["^:","goog/html/testing.js"],"^;","goog/html/testing.js","^<","^=","^>","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities to create arbitrary values of goog.html types for\n * testing purposes. These utility methods perform no validation, and the\n * resulting instances may violate type contracts.\n *\n * These methods are useful when types are constructed in a manner where using\n * the production API is too inconvenient. Please do use the production API\n * whenever possible; there is value in having tests reflect common usage and it\n * avoids, by design, non-contract complying instances from being created.\n */\n\n\ngoog.provide('goog.html.testing');\ngoog.setTestOnly();\n\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.SafeScript');\ngoog.require('goog.html.SafeStyle');\ngoog.require('goog.html.SafeStyleSheet');\ngoog.require('goog.html.SafeUrl');\ngoog.require('goog.html.TrustedResourceUrl');\ngoog.require('goog.testing.mockmatchers.ArgumentMatcher');\n\n\n/**\n * Creates a SafeHtml wrapping the given value. No validation is performed.\n *\n * This function is for use in tests only and must never be used in production\n * code.\n *\n * @param {string} html The string to wrap into a SafeHtml.\n * @param {?goog.i18n.bidi.Dir=} opt_dir The optional directionality of the\n *     SafeHtml to be constructed. A null or undefined value signifies an\n *     unknown directionality.\n * @return {!goog.html.SafeHtml}\n */\ngoog.html.testing.newSafeHtmlForTest = function(html, opt_dir) {\n  return goog.html.SafeHtml.createSafeHtmlSecurityPrivateDoNotAccessOrElse(\n      html, (opt_dir == undefined ? null : opt_dir));\n};\n\n\n/**\n * Creates a SafeScript wrapping the given value. No validation is performed.\n *\n * This function is for use in tests only and must never be used in production\n * code.\n *\n * @param {string} script The string to wrap into a SafeScript.\n * @return {!goog.html.SafeScript}\n */\ngoog.html.testing.newSafeScriptForTest = function(script) {\n  return goog.html.SafeScript.createSafeScriptSecurityPrivateDoNotAccessOrElse(\n      script);\n};\n\n\n/**\n * Creates a SafeStyle wrapping the given value. No validation is performed.\n *\n * This function is for use in tests only and must never be used in production\n * code.\n *\n * @param {string} style String to wrap into a SafeStyle.\n * @return {!goog.html.SafeStyle}\n */\ngoog.html.testing.newSafeStyleForTest = function(style) {\n  return goog.html.SafeStyle.createSafeStyleSecurityPrivateDoNotAccessOrElse(\n      style);\n};\n\n\n/**\n * Creates a SafeStyleSheet wrapping the given value. No validation is\n * performed.\n *\n * This function is for use in tests only and must never be used in production\n * code.\n *\n * @param {string} styleSheet String to wrap into a SafeStyleSheet.\n * @return {!goog.html.SafeStyleSheet}\n */\ngoog.html.testing.newSafeStyleSheetForTest = function(styleSheet) {\n  return goog.html.SafeStyleSheet\n      .createSafeStyleSheetSecurityPrivateDoNotAccessOrElse(styleSheet);\n};\n\n\n/**\n * Creates a SafeUrl wrapping the given value. No validation is performed.\n *\n * This function is for use in tests only and must never be used in production\n * code.\n *\n * @param {string} url String to wrap into a SafeUrl.\n * @return {!goog.html.SafeUrl}\n */\ngoog.html.testing.newSafeUrlForTest = function(url) {\n  return goog.html.SafeUrl.createSafeUrlSecurityPrivateDoNotAccessOrElse(url);\n};\n\n\n/**\n * Creates a TrustedResourceUrl wrapping the given value. No validation is\n * performed.\n *\n * This function is for use in tests only and must never be used in production\n * code.\n *\n * @param {string} url String to wrap into a TrustedResourceUrl.\n * @return {!goog.html.TrustedResourceUrl}\n */\ngoog.html.testing.newTrustedResourceUrlForTest = function(url) {\n  return goog.html.TrustedResourceUrl\n      .createTrustedResourceUrlSecurityPrivateDoNotAccessOrElse(url);\n};\n\n\n/**\n * Creates an argument matcher for SafeHtml.\n * @param {string|!goog.html.SafeHtml} expected\n * @return {!goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.html.testing.matchSafeHtml = function(expected) {\n  if (expected instanceof goog.html.SafeHtml) {\n    expected = goog.html.SafeHtml.unwrap(expected);\n  }\n  return new goog.testing.mockmatchers.ArgumentMatcher(function(actual) {\n    return goog.html.SafeHtml.unwrap(actual) == expected;\n  });\n};\n\n\n/**\n * Creates an argument matcher for SafeScript.\n * @param {string|!goog.html.SafeScript} expected\n * @return {!goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.html.testing.matchSafeScript = function(expected) {\n  if (expected instanceof goog.html.SafeScript) {\n    expected = goog.html.SafeScript.unwrap(expected);\n  }\n  return new goog.testing.mockmatchers.ArgumentMatcher(function(actual) {\n    return goog.html.SafeScript.unwrap(actual) == expected;\n  });\n};\n\n\n/**\n * Creates an argument matcher for SafeStyle.\n * @param {string|!goog.html.SafeStyle} expected\n * @return {!goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.html.testing.matchSafeStyle = function(expected) {\n  if (expected instanceof goog.html.SafeStyle) {\n    expected = goog.html.SafeStyle.unwrap(expected);\n  }\n  return new goog.testing.mockmatchers.ArgumentMatcher(function(actual) {\n    return goog.html.SafeStyle.unwrap(actual) == expected;\n  });\n};\n\n\n/**\n * Creates an argument matcher for SafeStyleSheet.\n * @param {string|!goog.html.SafeStyleSheet} expected\n * @return {!goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.html.testing.matchSafeStyleSheet = function(expected) {\n  if (expected instanceof goog.html.SafeStyleSheet) {\n    expected = goog.html.SafeStyleSheet.unwrap(expected);\n  }\n  return new goog.testing.mockmatchers.ArgumentMatcher(function(actual) {\n    return goog.html.SafeStyleSheet.unwrap(actual) == expected;\n  });\n};\n\n\n/**\n * Creates an argument matcher for SafeUrl.\n * @param {string|!goog.html.SafeUrl} expected\n * @return {!goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.html.testing.matchSafeUrl = function(expected) {\n  if (expected instanceof goog.html.SafeUrl) {\n    expected = goog.html.SafeUrl.unwrap(expected);\n  }\n  return new goog.testing.mockmatchers.ArgumentMatcher(function(actual) {\n    return goog.html.SafeUrl.unwrap(actual) == expected;\n  });\n};\n\n\n/**\n * Creates an argument matcher for TrustedResourceUrl.\n * @param {string|!goog.html.TrustedResourceUrl} expected\n * @return {!goog.testing.mockmatchers.ArgumentMatcher}\n */\ngoog.html.testing.matchTrustedResourceUrl = function(expected) {\n  if (expected instanceof goog.html.TrustedResourceUrl) {\n    expected = goog.html.TrustedResourceUrl.unwrap(expected);\n  }\n  return new goog.testing.mockmatchers.ArgumentMatcher(function(actual) {\n    return goog.html.TrustedResourceUrl.unwrap(actual) == expected;\n  });\n};\n\n\n/**\n * Equality tester to be used in Jasmine tests. Example:\n *\n *     beforeEach(function() {\n *       jasmine.addCustomEqualityTester(\n *           goog.html.testing.checkTypedStringEquality);\n *     });\n *\n *     it('typed string value matches same string', function() {\n *       expect(f).toHaveBeenCalledWith('expected');\n *     });\n *\n *     it('typed string value matches same type and string', function() {\n *       expect(f).toHaveBeenCalledWith(goog.string.Const.from('expected'));\n *     });\n *\n * @param {*} actual Handles goog.string.TypedString.\n * @param {*} expected Handles goog.string.TypedString or string.\n * @return {boolean|undefined} Undefined if not called with\n *     goog.string.TypedString, true if typed strings equal, false if not.\n */\ngoog.html.testing.checkTypedStringEquality = function(actual, expected) {\n  if (actual && actual.implementsGoogStringTypedString) {\n    if (expected != null && expected.implementsGoogStringTypedString) {\n      if (!(actual instanceof expected.constructor)) {\n        return false;\n      }\n      expected = expected.getTypedStringValue();\n    }\n    return actual.getTypedStringValue() == expected;\n  }\n};\n","^?",1579837703000,"^@",["^A",["~$goog.html.SafeScript","^U8","~$goog.testing.mockmatchers.ArgumentMatcher","^15","^3","~$goog.html.SafeStyle","^U?","^24"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/testing.js"],"^S",["^A",["~$goog.html.testing"]],"^1",true,"^2",["^3","^24","^X2","^X4","^U?","^15","^U8","^X3"]],["^ ","^7",[1579837703000],"^8","goog.i18n.compactnumberformatsymbolsext.js","^9",["^:","goog/i18n/compactnumberformatsymbolsext.js"],"^;","goog/i18n/compactnumberformatsymbolsext.js","^<","^=","^>","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Compact number formatting symbols.\n *\n * File generated from CLDR ver. 35\n *\n * This file covers those locales that are not covered in\n * \"compactnumberformatsymbols.js\".\n *\n * @suppress {const,missingRequire} Suppress \"missing require\" warnings for\n *     names like goog.i18n.CompactNumberFormatSymbols_af. They are included\n *     by requiring goog.i18n.CompactNumberFormatSymbols.\n */\n\n// clang-format off\n\ngoog.provide('goog.i18n.CompactNumberFormatSymbolsExt');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_af_NA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_af_ZA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_agq');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_agq_CM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ak');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ak_GH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_am_ET');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_001');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_AE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_BH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_DJ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_EH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_ER');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_IL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_IQ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_JO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_KM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_KW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_LB');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_LY');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_MA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_MR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_OM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_PS');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_QA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_SA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_SD');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_SO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_SS');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_SY');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_TD');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_TN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_XB');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ar_YE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_as');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_as_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_asa');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_asa_TZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ast');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ast_ES');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_az_Cyrl');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_az_Cyrl_AZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_az_Latn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_az_Latn_AZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bas');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bas_CM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_be_BY');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bem');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bem_ZM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bez');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bez_TZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bg_BG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bm');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bm_ML');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bn_BD');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bn_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bo');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bo_CN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bo_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_br_FR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_brx');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_brx_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bs_Cyrl');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bs_Cyrl_BA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bs_Latn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_bs_Latn_BA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ca_AD');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ca_ES');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ca_FR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ca_IT');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ccp');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ccp_BD');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ccp_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ce');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ce_RU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ceb');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ceb_PH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_cgg');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_cgg_UG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_chr_US');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ckb');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ckb_IQ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ckb_IR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_cs_CZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_cy_GB');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_da_DK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_da_GL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_dav');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_dav_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_de_BE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_de_DE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_de_IT');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_de_LI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_de_LU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_dje');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_dje_NE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_dsb');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_dsb_DE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_dua');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_dua_CM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_dyo');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_dyo_SN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_dz');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_dz_BT');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ebu');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ebu_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ee');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ee_GH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ee_TG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_el_CY');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_el_GR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_001');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_150');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_AE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_AG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_AI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_AS');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_AT');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_BB');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_BE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_BI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_BM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_BS');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_BW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_BZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_CC');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_CH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_CK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_CM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_CX');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_CY');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_DE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_DG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_DK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_DM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_ER');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_FI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_FJ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_FK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_FM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_GD');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_GG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_GH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_GI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_GM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_GU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_GY');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_HK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_IL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_IM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_IO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_JE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_JM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_KI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_KN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_KY');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_LC');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_LR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_LS');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_MG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_MH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_MO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_MP');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_MS');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_MT');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_MU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_MW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_MY');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_NA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_NF');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_NG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_NL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_NR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_NU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_NZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_PG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_PH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_PK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_PN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_PR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_PW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_RW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_SB');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_SC');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_SD');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_SE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_SH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_SI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_SL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_SS');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_SX');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_SZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_TC');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_TK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_TO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_TT');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_TV');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_TZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_UG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_UM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_US_POSIX');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_VC');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_VG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_VI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_VU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_WS');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_XA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_ZM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_en_ZW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_eo');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_eo_001');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_AR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_BO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_BR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_BZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_CL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_CO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_CR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_CU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_DO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_EA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_EC');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_GQ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_GT');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_HN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_IC');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_NI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_PA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_PE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_PH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_PR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_PY');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_SV');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_UY');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_es_VE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_et_EE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_eu_ES');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ewo');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ewo_CM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fa_AF');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fa_IR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ff');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ff_Latn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ff_Latn_BF');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ff_Latn_CM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ff_Latn_GH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ff_Latn_GM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ff_Latn_GN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ff_Latn_GW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ff_Latn_LR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ff_Latn_MR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ff_Latn_NE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ff_Latn_NG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ff_Latn_SL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ff_Latn_SN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fi_FI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fil_PH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fo');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fo_DK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fo_FO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_BE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_BF');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_BI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_BJ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_BL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_CD');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_CF');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_CG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_CH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_CI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_CM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_DJ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_DZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_FR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_GA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_GF');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_GN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_GP');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_GQ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_HT');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_KM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_LU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_MA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_MC');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_MF');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_MG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_ML');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_MQ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_MR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_MU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_NC');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_NE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_PF');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_PM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_RE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_RW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_SC');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_SN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_SY');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_TD');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_TG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_TN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_VU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_WF');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fr_YT');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fur');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fur_IT');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fy');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_fy_NL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ga_IE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_gd');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_gd_GB');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_gl_ES');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_gsw_CH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_gsw_FR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_gsw_LI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_gu_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_guz');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_guz_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_gv');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_gv_IM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ha');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ha_GH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ha_NE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ha_NG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_haw_US');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_he_IL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_hi_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_hr_BA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_hr_HR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_hsb');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_hsb_DE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_hu_HU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_hy_AM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ia');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ia_001');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_id_ID');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ig');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ig_NG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ii');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ii_CN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_is_IS');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_it_CH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_it_IT');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_it_SM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_it_VA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ja_JP');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_jgo');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_jgo_CM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_jmc');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_jmc_TZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_jv');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_jv_ID');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ka_GE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kab');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kab_DZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kam');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kam_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kde');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kde_TZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kea');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kea_CV');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_khq');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_khq_ML');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ki');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ki_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kk_KZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kkj');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kkj_CM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kl');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kl_GL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kln');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kln_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_km_KH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kn_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ko_KP');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ko_KR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kok');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kok_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ks');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ks_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ksb');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ksb_TZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ksf');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ksf_CM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ksh');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ksh_DE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ku');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ku_TR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kw');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_kw_GB');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ky_KG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lag');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lag_TZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lb');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lb_LU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lg');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lg_UG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lkt');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lkt_US');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ln_AO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ln_CD');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ln_CF');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ln_CG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lo_LA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lrc');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lrc_IQ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lrc_IR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lt_LT');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lu');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lu_CD');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_luo');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_luo_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_luy');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_luy_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_lv_LV');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mas');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mas_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mas_TZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mer');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mer_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mfe');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mfe_MU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mg');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mg_MG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mgh');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mgh_MZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mgo');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mgo_CM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mi');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mi_NZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mk_MK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ml_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mn_MN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mr_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ms_BN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ms_MY');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ms_SG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mt_MT');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mua');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mua_CM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_my_MM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mzn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_mzn_IR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_naq');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_naq_NA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nb_NO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nb_SJ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nd');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nd_ZW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nds');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nds_DE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nds_NL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ne_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ne_NP');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nl_AW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nl_BE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nl_BQ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nl_CW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nl_NL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nl_SR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nl_SX');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nmg');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nmg_CM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nn_NO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nnh');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nnh_CM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nus');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nus_SS');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nyn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_nyn_UG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_om');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_om_ET');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_om_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_or_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_os');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_os_GE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_os_RU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pa_Arab');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pa_Arab_PK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pa_Guru');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pa_Guru_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pl_PL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ps');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ps_AF');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ps_PK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pt_AO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pt_CH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pt_CV');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pt_GQ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pt_GW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pt_LU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pt_MO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pt_MZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pt_ST');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_pt_TL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_qu');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_qu_BO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_qu_EC');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_qu_PE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_rm');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_rm_CH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_rn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_rn_BI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ro_MD');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ro_RO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_rof');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_rof_TZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ru_BY');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ru_KG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ru_KZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ru_MD');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ru_RU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ru_UA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_rw');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_rw_RW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_rwk');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_rwk_TZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sah');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sah_RU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_saq');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_saq_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sbp');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sbp_TZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sd');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sd_PK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_se');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_se_FI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_se_NO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_se_SE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_seh');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_seh_MZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ses');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ses_ML');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sg');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sg_CF');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_shi');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_shi_Latn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_shi_Latn_MA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_shi_Tfng');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_shi_Tfng_MA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_si_LK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sk_SK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sl_SI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_smn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_smn_FI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sn_ZW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_so');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_so_DJ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_so_ET');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_so_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_so_SO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sq_AL');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sq_MK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sq_XK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sr_Cyrl');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_BA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_ME');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_RS');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_XK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sr_Latn_BA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sr_Latn_ME');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sr_Latn_RS');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sr_Latn_XK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sv_AX');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sv_FI');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sv_SE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sw_CD');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sw_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sw_TZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_sw_UG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ta_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ta_LK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ta_MY');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ta_SG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_te_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_teo');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_teo_KE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_teo_UG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_tg');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_tg_TJ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_th_TH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ti');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ti_ER');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ti_ET');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_tk');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_tk_TM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_to');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_to_TO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_tr_CY');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_tr_TR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_tt');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_tt_RU');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_twq');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_twq_NE');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_tzm');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_tzm_MA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ug');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ug_CN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_uk_UA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ur_IN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_ur_PK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_uz_Arab');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_uz_Arab_AF');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_uz_Cyrl');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_uz_Cyrl_UZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_uz_Latn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_uz_Latn_UZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_vai');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_vai_Latn');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_vai_Latn_LR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_vai_Vaii');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_vai_Vaii_LR');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_vi_VN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_vun');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_vun_TZ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_wae');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_wae_CH');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_wo');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_wo_SN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_xh');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_xh_ZA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_xog');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_xog_UG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_yav');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_yav_CM');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_yi');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_yi_001');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_yo');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_yo_BJ');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_yo_NG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_yue');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_yue_Hans');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_yue_Hans_CN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_yue_Hant');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_yue_Hant_HK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zgh');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zgh_MA');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zh_Hans');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zh_Hans_CN');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zh_Hans_HK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zh_Hans_MO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zh_Hans_SG');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zh_Hant');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zh_Hant_HK');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zh_Hant_MO');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zh_Hant_TW');\ngoog.provide('goog.i18n.CompactNumberFormatSymbols_zu_ZA');\ngoog.require('goog.i18n.CompactNumberFormatSymbols');\n\n\n/**\n * Compact number formatting symbols for locale af_NA.\n */\ngoog.i18n.CompactNumberFormatSymbols_af_NA = goog.i18n.CompactNumberFormatSymbols_af;\n\n\n/**\n * Compact number formatting symbols for locale af_ZA.\n */\ngoog.i18n.CompactNumberFormatSymbols_af_ZA = goog.i18n.CompactNumberFormatSymbols_af;\n\n\n/**\n * Compact number formatting symbols for locale agq.\n */\ngoog.i18n.CompactNumberFormatSymbols_agq = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale agq_CM.\n */\ngoog.i18n.CompactNumberFormatSymbols_agq_CM = goog.i18n.CompactNumberFormatSymbols_agq;\n\n\n/**\n * Compact number formatting symbols for locale ak.\n */\ngoog.i18n.CompactNumberFormatSymbols_ak = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ak_GH.\n */\ngoog.i18n.CompactNumberFormatSymbols_ak_GH = goog.i18n.CompactNumberFormatSymbols_ak;\n\n\n/**\n * Compact number formatting symbols for locale am_ET.\n */\ngoog.i18n.CompactNumberFormatSymbols_am_ET = goog.i18n.CompactNumberFormatSymbols_am;\n\n\n/**\n * Compact number formatting symbols for locale ar_001.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_001 = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_AE.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_AE = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_BH.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_BH = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_DJ.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_DJ = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_EH.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_EH = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_ER.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_ER = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_IL.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_IL = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_IQ.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_IQ = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_JO.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_JO = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_KM.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_KM = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_KW.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_KW = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_LB.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_LB = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_LY.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_LY = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_MA.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_MA = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_MR.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_MR = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_OM.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_OM = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_PS.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_PS = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_QA.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_QA = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_SA.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_SA = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_SD.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_SD = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_SO.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_SO = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_SS.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_SS = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_SY.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_SY = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_TD.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_TD = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_TN.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_TN = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_XB.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_XB = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale ar_YE.\n */\ngoog.i18n.CompactNumberFormatSymbols_ar_YE = goog.i18n.CompactNumberFormatSymbols_ar;\n\n\n/**\n * Compact number formatting symbols for locale as.\n */\ngoog.i18n.CompactNumberFormatSymbols_as = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 হাজাৰ'\n    },\n    '10000': {\n      'other': '00 হাজাৰ'\n    },\n    '100000': {\n      'other': '0 লাখ'\n    },\n    '1000000': {\n      'other': '0 নিযুত'\n    },\n    '10000000': {\n      'other': '00 নিযুত'\n    },\n    '100000000': {\n      'other': '000 নিঃ'\n    },\n    '1000000000': {\n      'other': '0 শঃ কোঃ'\n    },\n    '10000000000': {\n      'other': '00 শঃ কোঃ'\n    },\n    '100000000000': {\n      'other': '000 শঃ কঃ'\n    },\n    '1000000000000': {\n      'other': '0 শঃ পঃ'\n    },\n    '10000000000000': {\n      'other': '00 শঃ পঃ'\n    },\n    '100000000000000': {\n      'other': '000 শঃ পঃ'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 হাজাৰ'\n    },\n    '10000': {\n      'other': '00 হাজাৰ'\n    },\n    '100000': {\n      'other': '0 লাখ'\n    },\n    '1000000': {\n      'other': '0 নিযুত'\n    },\n    '10000000': {\n      'other': '00 নিযুত'\n    },\n    '100000000': {\n      'other': '000 নিযুত'\n    },\n    '1000000000': {\n      'other': '0 শত কোটি'\n    },\n    '10000000000': {\n      'other': '00 শত কোটি'\n    },\n    '100000000000': {\n      'other': '000 শত কোটি'\n    },\n    '1000000000000': {\n      'other': '0 শত পৰাৰ্দ্ধ'\n    },\n    '10000000000000': {\n      'other': '00 শত পৰাৰ্দ্ধ'\n    },\n    '100000000000000': {\n      'other': '000 শত পৰাৰ্দ্ধ'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale as_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_as_IN = goog.i18n.CompactNumberFormatSymbols_as;\n\n\n/**\n * Compact number formatting symbols for locale asa.\n */\ngoog.i18n.CompactNumberFormatSymbols_asa = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale asa_TZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_asa_TZ = goog.i18n.CompactNumberFormatSymbols_asa;\n\n\n/**\n * Compact number formatting symbols for locale ast.\n */\ngoog.i18n.CompactNumberFormatSymbols_ast = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 millares'\n    },\n    '10000': {\n      'other': '00 millares'\n    },\n    '100000': {\n      'other': '000 millares'\n    },\n    '1000000': {\n      'other': '0 millones'\n    },\n    '10000000': {\n      'other': '00 millones'\n    },\n    '100000000': {\n      'other': '000 millones'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ast_ES.\n */\ngoog.i18n.CompactNumberFormatSymbols_ast_ES = goog.i18n.CompactNumberFormatSymbols_ast;\n\n\n/**\n * Compact number formatting symbols for locale az_Cyrl.\n */\ngoog.i18n.CompactNumberFormatSymbols_az_Cyrl = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale az_Cyrl_AZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_az_Cyrl_AZ = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale az_Latn.\n */\ngoog.i18n.CompactNumberFormatSymbols_az_Latn = goog.i18n.CompactNumberFormatSymbols_az;\n\n\n/**\n * Compact number formatting symbols for locale az_Latn_AZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_az_Latn_AZ = goog.i18n.CompactNumberFormatSymbols_az;\n\n\n/**\n * Compact number formatting symbols for locale bas.\n */\ngoog.i18n.CompactNumberFormatSymbols_bas = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale bas_CM.\n */\ngoog.i18n.CompactNumberFormatSymbols_bas_CM = goog.i18n.CompactNumberFormatSymbols_bas;\n\n\n/**\n * Compact number formatting symbols for locale be_BY.\n */\ngoog.i18n.CompactNumberFormatSymbols_be_BY = goog.i18n.CompactNumberFormatSymbols_be;\n\n\n/**\n * Compact number formatting symbols for locale bem.\n */\ngoog.i18n.CompactNumberFormatSymbols_bem = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale bem_ZM.\n */\ngoog.i18n.CompactNumberFormatSymbols_bem_ZM = goog.i18n.CompactNumberFormatSymbols_bem;\n\n\n/**\n * Compact number formatting symbols for locale bez.\n */\ngoog.i18n.CompactNumberFormatSymbols_bez = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale bez_TZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_bez_TZ = goog.i18n.CompactNumberFormatSymbols_bez;\n\n\n/**\n * Compact number formatting symbols for locale bg_BG.\n */\ngoog.i18n.CompactNumberFormatSymbols_bg_BG = goog.i18n.CompactNumberFormatSymbols_bg;\n\n\n/**\n * Compact number formatting symbols for locale bm.\n */\ngoog.i18n.CompactNumberFormatSymbols_bm = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale bm_ML.\n */\ngoog.i18n.CompactNumberFormatSymbols_bm_ML = goog.i18n.CompactNumberFormatSymbols_bm;\n\n\n/**\n * Compact number formatting symbols for locale bn_BD.\n */\ngoog.i18n.CompactNumberFormatSymbols_bn_BD = goog.i18n.CompactNumberFormatSymbols_bn;\n\n\n/**\n * Compact number formatting symbols for locale bn_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_bn_IN = goog.i18n.CompactNumberFormatSymbols_bn;\n\n\n/**\n * Compact number formatting symbols for locale bo.\n */\ngoog.i18n.CompactNumberFormatSymbols_bo = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale bo_CN.\n */\ngoog.i18n.CompactNumberFormatSymbols_bo_CN = goog.i18n.CompactNumberFormatSymbols_bo;\n\n\n/**\n * Compact number formatting symbols for locale bo_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_bo_IN = goog.i18n.CompactNumberFormatSymbols_bo;\n\n\n/**\n * Compact number formatting symbols for locale br_FR.\n */\ngoog.i18n.CompactNumberFormatSymbols_br_FR = goog.i18n.CompactNumberFormatSymbols_br;\n\n\n/**\n * Compact number formatting symbols for locale brx.\n */\ngoog.i18n.CompactNumberFormatSymbols_brx = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale brx_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_brx_IN = goog.i18n.CompactNumberFormatSymbols_brx;\n\n\n/**\n * Compact number formatting symbols for locale bs_Cyrl.\n */\ngoog.i18n.CompactNumberFormatSymbols_bs_Cyrl = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '00 хиљ'\n    },\n    '100000': {\n      'other': '000 хиљ'\n    },\n    '1000000': {\n      'other': '0 мил'\n    },\n    '10000000': {\n      'other': '00 мил'\n    },\n    '100000000': {\n      'other': '000 мил'\n    },\n    '1000000000': {\n      'other': '0 млрд'\n    },\n    '10000000000': {\n      'other': '00 млрд'\n    },\n    '100000000000': {\n      'other': '000 млрд'\n    },\n    '1000000000000': {\n      'other': '0 бил'\n    },\n    '10000000000000': {\n      'other': '00 бил'\n    },\n    '100000000000000': {\n      'other': '000 бил'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '00 хиљ'\n    },\n    '100000': {\n      'other': '000 хиљ'\n    },\n    '1000000': {\n      'other': '0 мил'\n    },\n    '10000000': {\n      'other': '00 мил'\n    },\n    '100000000': {\n      'other': '000 мил'\n    },\n    '1000000000': {\n      'other': '0 млрд'\n    },\n    '10000000000': {\n      'other': '00 млрд'\n    },\n    '100000000000': {\n      'other': '000 млрд'\n    },\n    '1000000000000': {\n      'other': '0 бил'\n    },\n    '10000000000000': {\n      'other': '00 бил'\n    },\n    '100000000000000': {\n      'other': '000 бил'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale bs_Cyrl_BA.\n */\ngoog.i18n.CompactNumberFormatSymbols_bs_Cyrl_BA = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '00 хиљ'\n    },\n    '100000': {\n      'other': '000 хиљ'\n    },\n    '1000000': {\n      'other': '0 мил'\n    },\n    '10000000': {\n      'other': '00 мил'\n    },\n    '100000000': {\n      'other': '000 мил'\n    },\n    '1000000000': {\n      'other': '0 млрд'\n    },\n    '10000000000': {\n      'other': '00 млрд'\n    },\n    '100000000000': {\n      'other': '000 млрд'\n    },\n    '1000000000000': {\n      'other': '0 бил'\n    },\n    '10000000000000': {\n      'other': '00 бил'\n    },\n    '100000000000000': {\n      'other': '000 бил'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '00 хиљ'\n    },\n    '100000': {\n      'other': '000 хиљ'\n    },\n    '1000000': {\n      'other': '0 мил'\n    },\n    '10000000': {\n      'other': '00 мил'\n    },\n    '100000000': {\n      'other': '000 мил'\n    },\n    '1000000000': {\n      'other': '0 млрд'\n    },\n    '10000000000': {\n      'other': '00 млрд'\n    },\n    '100000000000': {\n      'other': '000 млрд'\n    },\n    '1000000000000': {\n      'other': '0 бил'\n    },\n    '10000000000000': {\n      'other': '00 бил'\n    },\n    '100000000000000': {\n      'other': '000 бил'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale bs_Latn.\n */\ngoog.i18n.CompactNumberFormatSymbols_bs_Latn = goog.i18n.CompactNumberFormatSymbols_bs;\n\n\n/**\n * Compact number formatting symbols for locale bs_Latn_BA.\n */\ngoog.i18n.CompactNumberFormatSymbols_bs_Latn_BA = goog.i18n.CompactNumberFormatSymbols_bs;\n\n\n/**\n * Compact number formatting symbols for locale ca_AD.\n */\ngoog.i18n.CompactNumberFormatSymbols_ca_AD = goog.i18n.CompactNumberFormatSymbols_ca;\n\n\n/**\n * Compact number formatting symbols for locale ca_ES.\n */\ngoog.i18n.CompactNumberFormatSymbols_ca_ES = goog.i18n.CompactNumberFormatSymbols_ca;\n\n\n/**\n * Compact number formatting symbols for locale ca_FR.\n */\ngoog.i18n.CompactNumberFormatSymbols_ca_FR = goog.i18n.CompactNumberFormatSymbols_ca;\n\n\n/**\n * Compact number formatting symbols for locale ca_IT.\n */\ngoog.i18n.CompactNumberFormatSymbols_ca_IT = goog.i18n.CompactNumberFormatSymbols_ca;\n\n\n/**\n * Compact number formatting symbols for locale ccp.\n */\ngoog.i18n.CompactNumberFormatSymbols_ccp = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ccp_BD.\n */\ngoog.i18n.CompactNumberFormatSymbols_ccp_BD = goog.i18n.CompactNumberFormatSymbols_ccp;\n\n\n/**\n * Compact number formatting symbols for locale ccp_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_ccp_IN = goog.i18n.CompactNumberFormatSymbols_ccp;\n\n\n/**\n * Compact number formatting symbols for locale ce.\n */\ngoog.i18n.CompactNumberFormatSymbols_ce = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 эзар'\n    },\n    '10000': {\n      'other': '00 эзар'\n    },\n    '100000': {\n      'other': '000 эзар'\n    },\n    '1000000': {\n      'other': '0 млн'\n    },\n    '10000000': {\n      'other': '00 млн'\n    },\n    '100000000': {\n      'other': '000 млн'\n    },\n    '1000000000': {\n      'other': '0 млрд'\n    },\n    '10000000000': {\n      'other': '00 млрд'\n    },\n    '100000000000': {\n      'other': '000 млрд'\n    },\n    '1000000000000': {\n      'other': '0 трлн'\n    },\n    '10000000000000': {\n      'other': '00 трлн'\n    },\n    '100000000000000': {\n      'other': '000 трлн'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 эзар'\n    },\n    '10000': {\n      'other': '00 эзар'\n    },\n    '100000': {\n      'other': '000 эзар'\n    },\n    '1000000': {\n      'other': '0 миллион'\n    },\n    '10000000': {\n      'other': '00 миллион'\n    },\n    '100000000': {\n      'other': '000 миллион'\n    },\n    '1000000000': {\n      'other': '0 миллиард'\n    },\n    '10000000000': {\n      'other': '00 миллиард'\n    },\n    '100000000000': {\n      'other': '000 миллиард'\n    },\n    '1000000000000': {\n      'other': '0 триллион'\n    },\n    '10000000000000': {\n      'other': '00 триллион'\n    },\n    '100000000000000': {\n      'other': '000 триллион'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ce_RU.\n */\ngoog.i18n.CompactNumberFormatSymbols_ce_RU = goog.i18n.CompactNumberFormatSymbols_ce;\n\n\n/**\n * Compact number formatting symbols for locale ceb.\n */\ngoog.i18n.CompactNumberFormatSymbols_ceb = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ceb_PH.\n */\ngoog.i18n.CompactNumberFormatSymbols_ceb_PH = goog.i18n.CompactNumberFormatSymbols_ceb;\n\n\n/**\n * Compact number formatting symbols for locale cgg.\n */\ngoog.i18n.CompactNumberFormatSymbols_cgg = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale cgg_UG.\n */\ngoog.i18n.CompactNumberFormatSymbols_cgg_UG = goog.i18n.CompactNumberFormatSymbols_cgg;\n\n\n/**\n * Compact number formatting symbols for locale chr_US.\n */\ngoog.i18n.CompactNumberFormatSymbols_chr_US = goog.i18n.CompactNumberFormatSymbols_chr;\n\n\n/**\n * Compact number formatting symbols for locale ckb.\n */\ngoog.i18n.CompactNumberFormatSymbols_ckb = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ckb_IQ.\n */\ngoog.i18n.CompactNumberFormatSymbols_ckb_IQ = goog.i18n.CompactNumberFormatSymbols_ckb;\n\n\n/**\n * Compact number formatting symbols for locale ckb_IR.\n */\ngoog.i18n.CompactNumberFormatSymbols_ckb_IR = goog.i18n.CompactNumberFormatSymbols_ckb;\n\n\n/**\n * Compact number formatting symbols for locale cs_CZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_cs_CZ = goog.i18n.CompactNumberFormatSymbols_cs;\n\n\n/**\n * Compact number formatting symbols for locale cy_GB.\n */\ngoog.i18n.CompactNumberFormatSymbols_cy_GB = goog.i18n.CompactNumberFormatSymbols_cy;\n\n\n/**\n * Compact number formatting symbols for locale da_DK.\n */\ngoog.i18n.CompactNumberFormatSymbols_da_DK = goog.i18n.CompactNumberFormatSymbols_da;\n\n\n/**\n * Compact number formatting symbols for locale da_GL.\n */\ngoog.i18n.CompactNumberFormatSymbols_da_GL = goog.i18n.CompactNumberFormatSymbols_da;\n\n\n/**\n * Compact number formatting symbols for locale dav.\n */\ngoog.i18n.CompactNumberFormatSymbols_dav = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale dav_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_dav_KE = goog.i18n.CompactNumberFormatSymbols_dav;\n\n\n/**\n * Compact number formatting symbols for locale de_BE.\n */\ngoog.i18n.CompactNumberFormatSymbols_de_BE = goog.i18n.CompactNumberFormatSymbols_de;\n\n\n/**\n * Compact number formatting symbols for locale de_DE.\n */\ngoog.i18n.CompactNumberFormatSymbols_de_DE = goog.i18n.CompactNumberFormatSymbols_de;\n\n\n/**\n * Compact number formatting symbols for locale de_IT.\n */\ngoog.i18n.CompactNumberFormatSymbols_de_IT = goog.i18n.CompactNumberFormatSymbols_de;\n\n\n/**\n * Compact number formatting symbols for locale de_LI.\n */\ngoog.i18n.CompactNumberFormatSymbols_de_LI = goog.i18n.CompactNumberFormatSymbols_de;\n\n\n/**\n * Compact number formatting symbols for locale de_LU.\n */\ngoog.i18n.CompactNumberFormatSymbols_de_LU = goog.i18n.CompactNumberFormatSymbols_de;\n\n\n/**\n * Compact number formatting symbols for locale dje.\n */\ngoog.i18n.CompactNumberFormatSymbols_dje = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale dje_NE.\n */\ngoog.i18n.CompactNumberFormatSymbols_dje_NE = goog.i18n.CompactNumberFormatSymbols_dje;\n\n\n/**\n * Compact number formatting symbols for locale dsb.\n */\ngoog.i18n.CompactNumberFormatSymbols_dsb = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 tys.'\n    },\n    '10000': {\n      'other': '00 tys.'\n    },\n    '100000': {\n      'other': '000 tys.'\n    },\n    '1000000': {\n      'other': '0 mio.'\n    },\n    '10000000': {\n      'other': '00 mio.'\n    },\n    '100000000': {\n      'other': '000 mio.'\n    },\n    '1000000000': {\n      'other': '0 mrd.'\n    },\n    '10000000000': {\n      'other': '00 mrd.'\n    },\n    '100000000000': {\n      'other': '000 mrd.'\n    },\n    '1000000000000': {\n      'other': '0 bil.'\n    },\n    '10000000000000': {\n      'other': '00 bil.'\n    },\n    '100000000000000': {\n      'other': '000 bil.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tysac'\n    },\n    '10000': {\n      'other': '00 tysac'\n    },\n    '100000': {\n      'other': '000 tysac'\n    },\n    '1000000': {\n      'other': '0 milionow'\n    },\n    '10000000': {\n      'other': '00 milionow'\n    },\n    '100000000': {\n      'other': '000 milionow'\n    },\n    '1000000000': {\n      'other': '0 miliardow'\n    },\n    '10000000000': {\n      'other': '00 miliardow'\n    },\n    '100000000000': {\n      'other': '000 miliardow'\n    },\n    '1000000000000': {\n      'other': '0 bilionow'\n    },\n    '10000000000000': {\n      'other': '00 bilionow'\n    },\n    '100000000000000': {\n      'other': '000 bilionow'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale dsb_DE.\n */\ngoog.i18n.CompactNumberFormatSymbols_dsb_DE = goog.i18n.CompactNumberFormatSymbols_dsb;\n\n\n/**\n * Compact number formatting symbols for locale dua.\n */\ngoog.i18n.CompactNumberFormatSymbols_dua = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale dua_CM.\n */\ngoog.i18n.CompactNumberFormatSymbols_dua_CM = goog.i18n.CompactNumberFormatSymbols_dua;\n\n\n/**\n * Compact number formatting symbols for locale dyo.\n */\ngoog.i18n.CompactNumberFormatSymbols_dyo = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale dyo_SN.\n */\ngoog.i18n.CompactNumberFormatSymbols_dyo_SN = goog.i18n.CompactNumberFormatSymbols_dyo;\n\n\n/**\n * Compact number formatting symbols for locale dz.\n */\ngoog.i18n.CompactNumberFormatSymbols_dz = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': 'སྟོང་ཕྲག 0'\n    },\n    '10000': {\n      'other': 'ཁྲི་ཕྲག 0'\n    },\n    '100000': {\n      'other': 'འབུམ་ཕྲག 0'\n    },\n    '1000000': {\n      'other': 'ས་ཡ་ 0'\n    },\n    '10000000': {\n      'other': 'བྱེ་བ་ 0'\n    },\n    '100000000': {\n      'other': 'དུང་ཕྱུར་ 0'\n    },\n    '1000000000': {\n      'other': 'དུང་ཕྱུར་ 00'\n    },\n    '10000000000': {\n      'other': 'དུང་ཕྱུར་བརྒྱ་ 0'\n    },\n    '100000000000': {\n      'other': 'དུང་ཕྱུར་སྟོང 0'\n    },\n    '1000000000000': {\n      'other': 'དུང་ཕྱུར་ཁྲི་ 0'\n    },\n    '10000000000000': {\n      'other': 'དུང་ཕྱུར་འབུམ་ 0'\n    },\n    '100000000000000': {\n      'other': 'དུང་ཕྱུར་ས་ཡ་ 0'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale dz_BT.\n */\ngoog.i18n.CompactNumberFormatSymbols_dz_BT = goog.i18n.CompactNumberFormatSymbols_dz;\n\n\n/**\n * Compact number formatting symbols for locale ebu.\n */\ngoog.i18n.CompactNumberFormatSymbols_ebu = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ebu_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_ebu_KE = goog.i18n.CompactNumberFormatSymbols_ebu;\n\n\n/**\n * Compact number formatting symbols for locale ee.\n */\ngoog.i18n.CompactNumberFormatSymbols_ee = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': 'akpe 0'\n    },\n    '10000': {\n      'other': 'akpe 00'\n    },\n    '100000': {\n      'other': 'akpe 000'\n    },\n    '1000000': {\n      'other': 'miliɔn 0'\n    },\n    '10000000': {\n      'other': 'miliɔn 00'\n    },\n    '100000000': {\n      'other': 'miliɔn 000'\n    },\n    '1000000000': {\n      'other': 'biliɔn 0'\n    },\n    '10000000000': {\n      'other': 'biliɔn 00'\n    },\n    '100000000000': {\n      'other': 'biliɔn 000'\n    },\n    '1000000000000': {\n      'other': '0 triliɔn'\n    },\n    '10000000000000': {\n      'other': 'triliɔn 00'\n    },\n    '100000000000000': {\n      'other': 'triliɔn 000'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ee_GH.\n */\ngoog.i18n.CompactNumberFormatSymbols_ee_GH = goog.i18n.CompactNumberFormatSymbols_ee;\n\n\n/**\n * Compact number formatting symbols for locale ee_TG.\n */\ngoog.i18n.CompactNumberFormatSymbols_ee_TG = goog.i18n.CompactNumberFormatSymbols_ee;\n\n\n/**\n * Compact number formatting symbols for locale el_CY.\n */\ngoog.i18n.CompactNumberFormatSymbols_el_CY = goog.i18n.CompactNumberFormatSymbols_el;\n\n\n/**\n * Compact number formatting symbols for locale el_GR.\n */\ngoog.i18n.CompactNumberFormatSymbols_el_GR = goog.i18n.CompactNumberFormatSymbols_el;\n\n\n/**\n * Compact number formatting symbols for locale en_001.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_001 = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_150.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_150 = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_AE.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_AE = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_AG.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_AG = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_AI.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_AI = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_AS.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_AS = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_AT.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_AT = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_BB.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_BB = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_BE.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_BE = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_BI.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_BI = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_BM.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_BM = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_BS.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_BS = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_BW.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_BW = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_BZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_BZ = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_CC.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_CC = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_CH.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_CH = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_CK.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_CK = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_CM.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_CM = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_CX.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_CX = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_CY.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_CY = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_DE.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_DE = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_DG.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_DG = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_DK.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_DK = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_DM.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_DM = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_ER.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_ER = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_FI.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_FI = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_FJ.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_FJ = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_FK.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_FK = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_FM.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_FM = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_GD.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_GD = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_GG.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_GG = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_GH.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_GH = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_GI.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_GI = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_GM.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_GM = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_GU.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_GU = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_GY.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_GY = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_HK.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_HK = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_IL.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_IL = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_IM.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_IM = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_IO.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_IO = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_JE.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_JE = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_JM.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_JM = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_KE = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_KI.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_KI = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_KN.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_KN = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_KY.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_KY = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_LC.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_LC = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_LR.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_LR = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_LS.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_LS = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_MG.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_MG = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_MH.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_MH = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_MO.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_MO = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_MP.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_MP = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_MS.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_MS = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_MT.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_MT = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_MU.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_MU = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_MW.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_MW = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_MY.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_MY = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_NA.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_NA = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_NF.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_NF = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_NG.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_NG = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_NL.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_NL = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_NR.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_NR = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_NU.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_NU = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_NZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_NZ = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_PG.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_PG = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_PH.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_PH = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_PK.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_PK = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_PN.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_PN = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_PR.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_PR = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_PW.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_PW = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_RW.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_RW = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_SB.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_SB = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_SC.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_SC = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_SD.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_SD = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_SE.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_SE = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_SH.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_SH = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_SI.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_SI = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_SL.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_SL = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_SS.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_SS = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_SX.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_SX = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_SZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_SZ = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_TC.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_TC = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_TK.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_TK = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_TO.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_TO = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_TT.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_TT = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_TV.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_TV = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_TZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_TZ = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_UG.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_UG = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_UM.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_UM = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_US_POSIX.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_US_POSIX = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_VC.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_VC = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_VG.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_VG = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_VI.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_VI = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_VU.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_VU = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_WS.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_WS = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_XA.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_XA = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_ZM.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_ZM = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale en_ZW.\n */\ngoog.i18n.CompactNumberFormatSymbols_en_ZW = goog.i18n.CompactNumberFormatSymbols_en;\n\n\n/**\n * Compact number formatting symbols for locale eo.\n */\ngoog.i18n.CompactNumberFormatSymbols_eo = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale eo_001.\n */\ngoog.i18n.CompactNumberFormatSymbols_eo_001 = goog.i18n.CompactNumberFormatSymbols_eo;\n\n\n/**\n * Compact number formatting symbols for locale es_AR.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_AR = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_BO.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_BO = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_BR.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_BR = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_BZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_BZ = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_CL.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_CL = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_CO.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_CO = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_CR.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_CR = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_CU.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_CU = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_DO.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_DO = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_EA.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_EA = goog.i18n.CompactNumberFormatSymbols_es;\n\n\n/**\n * Compact number formatting symbols for locale es_EC.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_EC = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_GQ.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_GQ = goog.i18n.CompactNumberFormatSymbols_es;\n\n\n/**\n * Compact number formatting symbols for locale es_GT.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_GT = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_HN.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_HN = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_IC.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_IC = goog.i18n.CompactNumberFormatSymbols_es;\n\n\n/**\n * Compact number formatting symbols for locale es_NI.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_NI = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_PA.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_PA = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_PE.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_PE = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_PH.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_PH = goog.i18n.CompactNumberFormatSymbols_es;\n\n\n/**\n * Compact number formatting symbols for locale es_PR.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_PR = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_PY.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_PY = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_SV.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_SV = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_UY.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_UY = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale es_VE.\n */\ngoog.i18n.CompactNumberFormatSymbols_es_VE = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 K'\n    },\n    '10000': {\n      'other': '00 k'\n    },\n    '100000': {\n      'other': '000 k'\n    },\n    '1000000000': {\n      'other': '0k M'\n    },\n    '10000000000': {\n      'other': '00k M'\n    },\n    '100000000000': {\n      'other': '000k M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0 billón'\n    },\n    '10000000000000': {\n      'other': '00 billones'\n    },\n    '100000000000000': {\n      'other': '000 billones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale et_EE.\n */\ngoog.i18n.CompactNumberFormatSymbols_et_EE = goog.i18n.CompactNumberFormatSymbols_et;\n\n\n/**\n * Compact number formatting symbols for locale eu_ES.\n */\ngoog.i18n.CompactNumberFormatSymbols_eu_ES = goog.i18n.CompactNumberFormatSymbols_eu;\n\n\n/**\n * Compact number formatting symbols for locale ewo.\n */\ngoog.i18n.CompactNumberFormatSymbols_ewo = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ewo_CM.\n */\ngoog.i18n.CompactNumberFormatSymbols_ewo_CM = goog.i18n.CompactNumberFormatSymbols_ewo;\n\n\n/**\n * Compact number formatting symbols for locale fa_AF.\n */\ngoog.i18n.CompactNumberFormatSymbols_fa_AF = goog.i18n.CompactNumberFormatSymbols_fa;\n\n\n/**\n * Compact number formatting symbols for locale fa_IR.\n */\ngoog.i18n.CompactNumberFormatSymbols_fa_IR = goog.i18n.CompactNumberFormatSymbols_fa;\n\n\n/**\n * Compact number formatting symbols for locale ff.\n */\ngoog.i18n.CompactNumberFormatSymbols_ff = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ff_Latn.\n */\ngoog.i18n.CompactNumberFormatSymbols_ff_Latn = goog.i18n.CompactNumberFormatSymbols_ff;\n\n\n/**\n * Compact number formatting symbols for locale ff_Latn_BF.\n */\ngoog.i18n.CompactNumberFormatSymbols_ff_Latn_BF = goog.i18n.CompactNumberFormatSymbols_ff;\n\n\n/**\n * Compact number formatting symbols for locale ff_Latn_CM.\n */\ngoog.i18n.CompactNumberFormatSymbols_ff_Latn_CM = goog.i18n.CompactNumberFormatSymbols_ff;\n\n\n/**\n * Compact number formatting symbols for locale ff_Latn_GH.\n */\ngoog.i18n.CompactNumberFormatSymbols_ff_Latn_GH = goog.i18n.CompactNumberFormatSymbols_ff;\n\n\n/**\n * Compact number formatting symbols for locale ff_Latn_GM.\n */\ngoog.i18n.CompactNumberFormatSymbols_ff_Latn_GM = goog.i18n.CompactNumberFormatSymbols_ff;\n\n\n/**\n * Compact number formatting symbols for locale ff_Latn_GN.\n */\ngoog.i18n.CompactNumberFormatSymbols_ff_Latn_GN = goog.i18n.CompactNumberFormatSymbols_ff;\n\n\n/**\n * Compact number formatting symbols for locale ff_Latn_GW.\n */\ngoog.i18n.CompactNumberFormatSymbols_ff_Latn_GW = goog.i18n.CompactNumberFormatSymbols_ff;\n\n\n/**\n * Compact number formatting symbols for locale ff_Latn_LR.\n */\ngoog.i18n.CompactNumberFormatSymbols_ff_Latn_LR = goog.i18n.CompactNumberFormatSymbols_ff;\n\n\n/**\n * Compact number formatting symbols for locale ff_Latn_MR.\n */\ngoog.i18n.CompactNumberFormatSymbols_ff_Latn_MR = goog.i18n.CompactNumberFormatSymbols_ff;\n\n\n/**\n * Compact number formatting symbols for locale ff_Latn_NE.\n */\ngoog.i18n.CompactNumberFormatSymbols_ff_Latn_NE = goog.i18n.CompactNumberFormatSymbols_ff;\n\n\n/**\n * Compact number formatting symbols for locale ff_Latn_NG.\n */\ngoog.i18n.CompactNumberFormatSymbols_ff_Latn_NG = goog.i18n.CompactNumberFormatSymbols_ff;\n\n\n/**\n * Compact number formatting symbols for locale ff_Latn_SL.\n */\ngoog.i18n.CompactNumberFormatSymbols_ff_Latn_SL = goog.i18n.CompactNumberFormatSymbols_ff;\n\n\n/**\n * Compact number formatting symbols for locale ff_Latn_SN.\n */\ngoog.i18n.CompactNumberFormatSymbols_ff_Latn_SN = goog.i18n.CompactNumberFormatSymbols_ff;\n\n\n/**\n * Compact number formatting symbols for locale fi_FI.\n */\ngoog.i18n.CompactNumberFormatSymbols_fi_FI = goog.i18n.CompactNumberFormatSymbols_fi;\n\n\n/**\n * Compact number formatting symbols for locale fil_PH.\n */\ngoog.i18n.CompactNumberFormatSymbols_fil_PH = goog.i18n.CompactNumberFormatSymbols_fil;\n\n\n/**\n * Compact number formatting symbols for locale fo.\n */\ngoog.i18n.CompactNumberFormatSymbols_fo = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 tús.'\n    },\n    '10000': {\n      'other': '00 tús.'\n    },\n    '100000': {\n      'other': '000 tús.'\n    },\n    '1000000': {\n      'other': '0 mió.'\n    },\n    '10000000': {\n      'other': '00 mió.'\n    },\n    '100000000': {\n      'other': '000 mió.'\n    },\n    '1000000000': {\n      'other': '0 mia.'\n    },\n    '10000000000': {\n      'other': '00 mia.'\n    },\n    '100000000000': {\n      'other': '000 mia.'\n    },\n    '1000000000000': {\n      'other': '0 bió.'\n    },\n    '10000000000000': {\n      'other': '00 bió.'\n    },\n    '100000000000000': {\n      'other': '000 bió.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 túsund'\n    },\n    '10000': {\n      'other': '00 túsund'\n    },\n    '100000': {\n      'other': '000 túsund'\n    },\n    '1000000': {\n      'other': '0 milliónir'\n    },\n    '10000000': {\n      'other': '00 milliónir'\n    },\n    '100000000': {\n      'other': '000 milliónir'\n    },\n    '1000000000': {\n      'other': '0 milliardir'\n    },\n    '10000000000': {\n      'other': '00 milliardir'\n    },\n    '100000000000': {\n      'other': '000 milliardir'\n    },\n    '1000000000000': {\n      'other': '0 billiónir'\n    },\n    '10000000000000': {\n      'other': '00 billiónir'\n    },\n    '100000000000000': {\n      'other': '000 billiónir'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale fo_DK.\n */\ngoog.i18n.CompactNumberFormatSymbols_fo_DK = goog.i18n.CompactNumberFormatSymbols_fo;\n\n\n/**\n * Compact number formatting symbols for locale fo_FO.\n */\ngoog.i18n.CompactNumberFormatSymbols_fo_FO = goog.i18n.CompactNumberFormatSymbols_fo;\n\n\n/**\n * Compact number formatting symbols for locale fr_BE.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_BE = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_BF.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_BF = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_BI.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_BI = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_BJ.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_BJ = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_BL.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_BL = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_CD.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_CD = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_CF.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_CF = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_CG.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_CG = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_CH.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_CH = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_CI.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_CI = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_CM.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_CM = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_DJ.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_DJ = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_DZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_DZ = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_FR.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_FR = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_GA.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_GA = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_GF.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_GF = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_GN.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_GN = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_GP.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_GP = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_GQ.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_GQ = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_HT.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_HT = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_KM.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_KM = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_LU.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_LU = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_MA.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_MA = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_MC.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_MC = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_MF.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_MF = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_MG.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_MG = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_ML.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_ML = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_MQ.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_MQ = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_MR.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_MR = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_MU.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_MU = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_NC.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_NC = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_NE.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_NE = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_PF.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_PF = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_PM.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_PM = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_RE.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_RE = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_RW.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_RW = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_SC.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_SC = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_SN.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_SN = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_SY.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_SY = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_TD.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_TD = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_TG.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_TG = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_TN.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_TN = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_VU.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_VU = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_WF.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_WF = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fr_YT.\n */\ngoog.i18n.CompactNumberFormatSymbols_fr_YT = goog.i18n.CompactNumberFormatSymbols_fr;\n\n\n/**\n * Compact number formatting symbols for locale fur.\n */\ngoog.i18n.CompactNumberFormatSymbols_fur = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale fur_IT.\n */\ngoog.i18n.CompactNumberFormatSymbols_fur_IT = goog.i18n.CompactNumberFormatSymbols_fur;\n\n\n/**\n * Compact number formatting symbols for locale fy.\n */\ngoog.i18n.CompactNumberFormatSymbols_fy = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0 mln.'\n    },\n    '10000000': {\n      'other': '00 mln.'\n    },\n    '100000000': {\n      'other': '000 mln.'\n    },\n    '1000000000': {\n      'other': '0 mld.'\n    },\n    '10000000000': {\n      'other': '00 mld.'\n    },\n    '100000000000': {\n      'other': '000 mld.'\n    },\n    '1000000000000': {\n      'other': '0 bln.'\n    },\n    '10000000000000': {\n      'other': '00 bln.'\n    },\n    '100000000000000': {\n      'other': '000 bln.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tûzen'\n    },\n    '10000': {\n      'other': '00 tûzen'\n    },\n    '100000': {\n      'other': '000 tûzen'\n    },\n    '1000000': {\n      'other': '0 miljoen'\n    },\n    '10000000': {\n      'other': '00 miljoen'\n    },\n    '100000000': {\n      'other': '000 miljoen'\n    },\n    '1000000000': {\n      'other': '0 miljard'\n    },\n    '10000000000': {\n      'other': '00 miljard'\n    },\n    '100000000000': {\n      'other': '000 miljard'\n    },\n    '1000000000000': {\n      'other': '0 biljoen'\n    },\n    '10000000000000': {\n      'other': '00 biljoen'\n    },\n    '100000000000000': {\n      'other': '000 biljoen'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale fy_NL.\n */\ngoog.i18n.CompactNumberFormatSymbols_fy_NL = goog.i18n.CompactNumberFormatSymbols_fy;\n\n\n/**\n * Compact number formatting symbols for locale ga_IE.\n */\ngoog.i18n.CompactNumberFormatSymbols_ga_IE = goog.i18n.CompactNumberFormatSymbols_ga;\n\n\n/**\n * Compact number formatting symbols for locale gd.\n */\ngoog.i18n.CompactNumberFormatSymbols_gd = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 mìle'\n    },\n    '10000': {\n      'other': '00 mìle'\n    },\n    '100000': {\n      'other': '000 mìle'\n    },\n    '1000000': {\n      'other': '0 millean'\n    },\n    '10000000': {\n      'other': '00 millean'\n    },\n    '100000000': {\n      'other': '000 millean'\n    },\n    '1000000000': {\n      'other': '0 billean'\n    },\n    '10000000000': {\n      'other': '00 billean'\n    },\n    '100000000000': {\n      'other': '000 billean'\n    },\n    '1000000000000': {\n      'other': '0 trillean'\n    },\n    '10000000000000': {\n      'other': '00 trillean'\n    },\n    '100000000000000': {\n      'other': '000 trillean'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale gd_GB.\n */\ngoog.i18n.CompactNumberFormatSymbols_gd_GB = goog.i18n.CompactNumberFormatSymbols_gd;\n\n\n/**\n * Compact number formatting symbols for locale gl_ES.\n */\ngoog.i18n.CompactNumberFormatSymbols_gl_ES = goog.i18n.CompactNumberFormatSymbols_gl;\n\n\n/**\n * Compact number formatting symbols for locale gsw_CH.\n */\ngoog.i18n.CompactNumberFormatSymbols_gsw_CH = goog.i18n.CompactNumberFormatSymbols_gsw;\n\n\n/**\n * Compact number formatting symbols for locale gsw_FR.\n */\ngoog.i18n.CompactNumberFormatSymbols_gsw_FR = goog.i18n.CompactNumberFormatSymbols_gsw;\n\n\n/**\n * Compact number formatting symbols for locale gsw_LI.\n */\ngoog.i18n.CompactNumberFormatSymbols_gsw_LI = goog.i18n.CompactNumberFormatSymbols_gsw;\n\n\n/**\n * Compact number formatting symbols for locale gu_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_gu_IN = goog.i18n.CompactNumberFormatSymbols_gu;\n\n\n/**\n * Compact number formatting symbols for locale guz.\n */\ngoog.i18n.CompactNumberFormatSymbols_guz = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale guz_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_guz_KE = goog.i18n.CompactNumberFormatSymbols_guz;\n\n\n/**\n * Compact number formatting symbols for locale gv.\n */\ngoog.i18n.CompactNumberFormatSymbols_gv = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale gv_IM.\n */\ngoog.i18n.CompactNumberFormatSymbols_gv_IM = goog.i18n.CompactNumberFormatSymbols_gv;\n\n\n/**\n * Compact number formatting symbols for locale ha.\n */\ngoog.i18n.CompactNumberFormatSymbols_ha = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0D'\n    },\n    '10000': {\n      'other': '00D'\n    },\n    '100000': {\n      'other': '000D'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': 'Dubu 0'\n    },\n    '10000': {\n      'other': 'Dubu 00'\n    },\n    '100000': {\n      'other': 'Dubu 000'\n    },\n    '1000000': {\n      'other': 'Miliyan 0'\n    },\n    '10000000': {\n      'other': 'Miliyan 00'\n    },\n    '100000000': {\n      'other': 'Miliyan 000'\n    },\n    '1000000000': {\n      'other': 'Biliyan 0'\n    },\n    '10000000000': {\n      'other': 'Biliyan 00'\n    },\n    '100000000000': {\n      'other': 'Biliyan 000'\n    },\n    '1000000000000': {\n      'other': 'Triliyan 0'\n    },\n    '10000000000000': {\n      'other': 'Triliyan 00'\n    },\n    '100000000000000': {\n      'other': 'Triliyan 000'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ha_GH.\n */\ngoog.i18n.CompactNumberFormatSymbols_ha_GH = goog.i18n.CompactNumberFormatSymbols_ha;\n\n\n/**\n * Compact number formatting symbols for locale ha_NE.\n */\ngoog.i18n.CompactNumberFormatSymbols_ha_NE = goog.i18n.CompactNumberFormatSymbols_ha;\n\n\n/**\n * Compact number formatting symbols for locale ha_NG.\n */\ngoog.i18n.CompactNumberFormatSymbols_ha_NG = goog.i18n.CompactNumberFormatSymbols_ha;\n\n\n/**\n * Compact number formatting symbols for locale haw_US.\n */\ngoog.i18n.CompactNumberFormatSymbols_haw_US = goog.i18n.CompactNumberFormatSymbols_haw;\n\n\n/**\n * Compact number formatting symbols for locale he_IL.\n */\ngoog.i18n.CompactNumberFormatSymbols_he_IL = goog.i18n.CompactNumberFormatSymbols_he;\n\n\n/**\n * Compact number formatting symbols for locale hi_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_hi_IN = goog.i18n.CompactNumberFormatSymbols_hi;\n\n\n/**\n * Compact number formatting symbols for locale hr_BA.\n */\ngoog.i18n.CompactNumberFormatSymbols_hr_BA = goog.i18n.CompactNumberFormatSymbols_hr;\n\n\n/**\n * Compact number formatting symbols for locale hr_HR.\n */\ngoog.i18n.CompactNumberFormatSymbols_hr_HR = goog.i18n.CompactNumberFormatSymbols_hr;\n\n\n/**\n * Compact number formatting symbols for locale hsb.\n */\ngoog.i18n.CompactNumberFormatSymbols_hsb = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 tys.'\n    },\n    '10000': {\n      'other': '00 tys.'\n    },\n    '100000': {\n      'other': '000 tys.'\n    },\n    '1000000': {\n      'other': '0 mio.'\n    },\n    '10000000': {\n      'other': '00 mio.'\n    },\n    '100000000': {\n      'other': '000 mio.'\n    },\n    '1000000000': {\n      'other': '0 mrd.'\n    },\n    '10000000000': {\n      'other': '00 mrd.'\n    },\n    '100000000000': {\n      'other': '000 mrd.'\n    },\n    '1000000000000': {\n      'other': '0 bil.'\n    },\n    '10000000000000': {\n      'other': '00 bil.'\n    },\n    '100000000000000': {\n      'other': '000 bil.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tysac'\n    },\n    '10000': {\n      'other': '00 tysac'\n    },\n    '100000': {\n      'other': '000 tysac'\n    },\n    '1000000': {\n      'other': '0 milionow'\n    },\n    '10000000': {\n      'other': '00 milionow'\n    },\n    '100000000': {\n      'other': '000 milionow'\n    },\n    '1000000000': {\n      'other': '0 miliardow'\n    },\n    '10000000000': {\n      'other': '00 miliardow'\n    },\n    '100000000000': {\n      'other': '000 miliardow'\n    },\n    '1000000000000': {\n      'other': '0 bilionow'\n    },\n    '10000000000000': {\n      'other': '00 bilionow'\n    },\n    '100000000000000': {\n      'other': '000 bilionow'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale hsb_DE.\n */\ngoog.i18n.CompactNumberFormatSymbols_hsb_DE = goog.i18n.CompactNumberFormatSymbols_hsb;\n\n\n/**\n * Compact number formatting symbols for locale hu_HU.\n */\ngoog.i18n.CompactNumberFormatSymbols_hu_HU = goog.i18n.CompactNumberFormatSymbols_hu;\n\n\n/**\n * Compact number formatting symbols for locale hy_AM.\n */\ngoog.i18n.CompactNumberFormatSymbols_hy_AM = goog.i18n.CompactNumberFormatSymbols_hy;\n\n\n/**\n * Compact number formatting symbols for locale ia.\n */\ngoog.i18n.CompactNumberFormatSymbols_ia = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 mil'\n    },\n    '10000': {\n      'other': '00 mil'\n    },\n    '100000': {\n      'other': '000 mil'\n    },\n    '1000000': {\n      'other': '0 mln'\n    },\n    '10000000': {\n      'other': '00 mln'\n    },\n    '100000000': {\n      'other': '000 mln'\n    },\n    '1000000000': {\n      'other': '0 mld'\n    },\n    '10000000000': {\n      'other': '00 mld'\n    },\n    '100000000000': {\n      'other': '000 mld'\n    },\n    '1000000000000': {\n      'other': '0 bln'\n    },\n    '10000000000000': {\n      'other': '00 bln'\n    },\n    '100000000000000': {\n      'other': '000 bln'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 milles'\n    },\n    '10000': {\n      'other': '00 milles'\n    },\n    '100000': {\n      'other': '000 milles'\n    },\n    '1000000': {\n      'other': '0 milliones'\n    },\n    '10000000': {\n      'other': '00 milliones'\n    },\n    '100000000': {\n      'other': '000 milliones'\n    },\n    '1000000000': {\n      'other': '0 milliardos'\n    },\n    '10000000000': {\n      'other': '00 milliardos'\n    },\n    '100000000000': {\n      'other': '000 milliardos'\n    },\n    '1000000000000': {\n      'other': '0 billiones'\n    },\n    '10000000000000': {\n      'other': '00 billiones'\n    },\n    '100000000000000': {\n      'other': '000 billiones'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ia_001.\n */\ngoog.i18n.CompactNumberFormatSymbols_ia_001 = goog.i18n.CompactNumberFormatSymbols_ia;\n\n\n/**\n * Compact number formatting symbols for locale id_ID.\n */\ngoog.i18n.CompactNumberFormatSymbols_id_ID = goog.i18n.CompactNumberFormatSymbols_id;\n\n\n/**\n * Compact number formatting symbols for locale ig.\n */\ngoog.i18n.CompactNumberFormatSymbols_ig = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ig_NG.\n */\ngoog.i18n.CompactNumberFormatSymbols_ig_NG = goog.i18n.CompactNumberFormatSymbols_ig;\n\n\n/**\n * Compact number formatting symbols for locale ii.\n */\ngoog.i18n.CompactNumberFormatSymbols_ii = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ii_CN.\n */\ngoog.i18n.CompactNumberFormatSymbols_ii_CN = goog.i18n.CompactNumberFormatSymbols_ii;\n\n\n/**\n * Compact number formatting symbols for locale is_IS.\n */\ngoog.i18n.CompactNumberFormatSymbols_is_IS = goog.i18n.CompactNumberFormatSymbols_is;\n\n\n/**\n * Compact number formatting symbols for locale it_CH.\n */\ngoog.i18n.CompactNumberFormatSymbols_it_CH = goog.i18n.CompactNumberFormatSymbols_it;\n\n\n/**\n * Compact number formatting symbols for locale it_IT.\n */\ngoog.i18n.CompactNumberFormatSymbols_it_IT = goog.i18n.CompactNumberFormatSymbols_it;\n\n\n/**\n * Compact number formatting symbols for locale it_SM.\n */\ngoog.i18n.CompactNumberFormatSymbols_it_SM = goog.i18n.CompactNumberFormatSymbols_it;\n\n\n/**\n * Compact number formatting symbols for locale it_VA.\n */\ngoog.i18n.CompactNumberFormatSymbols_it_VA = goog.i18n.CompactNumberFormatSymbols_it;\n\n\n/**\n * Compact number formatting symbols for locale ja_JP.\n */\ngoog.i18n.CompactNumberFormatSymbols_ja_JP = goog.i18n.CompactNumberFormatSymbols_ja;\n\n\n/**\n * Compact number formatting symbols for locale jgo.\n */\ngoog.i18n.CompactNumberFormatSymbols_jgo = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale jgo_CM.\n */\ngoog.i18n.CompactNumberFormatSymbols_jgo_CM = goog.i18n.CompactNumberFormatSymbols_jgo;\n\n\n/**\n * Compact number formatting symbols for locale jmc.\n */\ngoog.i18n.CompactNumberFormatSymbols_jmc = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale jmc_TZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_jmc_TZ = goog.i18n.CompactNumberFormatSymbols_jmc;\n\n\n/**\n * Compact number formatting symbols for locale jv.\n */\ngoog.i18n.CompactNumberFormatSymbols_jv = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0È'\n    },\n    '10000': {\n      'other': '00È'\n    },\n    '100000': {\n      'other': '000È'\n    },\n    '1000000': {\n      'other': '0Y'\n    },\n    '10000000': {\n      'other': '00Y'\n    },\n    '100000000': {\n      'other': '000Y'\n    },\n    '1000000000': {\n      'other': '0M'\n    },\n    '10000000000': {\n      'other': '00M'\n    },\n    '100000000000': {\n      'other': '000M'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 èwu'\n    },\n    '10000': {\n      'other': '00 èwu'\n    },\n    '100000': {\n      'other': '000 èwu'\n    },\n    '1000000': {\n      'other': '0 yuta'\n    },\n    '10000000': {\n      'other': '00 yuta'\n    },\n    '100000000': {\n      'other': '000 yuta'\n    },\n    '1000000000': {\n      'other': '0 milyar'\n    },\n    '10000000000': {\n      'other': '00 milyar'\n    },\n    '100000000000': {\n      'other': '000 milyar'\n    },\n    '1000000000000': {\n      'other': '0 trilyun'\n    },\n    '10000000000000': {\n      'other': '00 trilyun'\n    },\n    '100000000000000': {\n      'other': '000 trilyun'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale jv_ID.\n */\ngoog.i18n.CompactNumberFormatSymbols_jv_ID = goog.i18n.CompactNumberFormatSymbols_jv;\n\n\n/**\n * Compact number formatting symbols for locale ka_GE.\n */\ngoog.i18n.CompactNumberFormatSymbols_ka_GE = goog.i18n.CompactNumberFormatSymbols_ka;\n\n\n/**\n * Compact number formatting symbols for locale kab.\n */\ngoog.i18n.CompactNumberFormatSymbols_kab = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale kab_DZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_kab_DZ = goog.i18n.CompactNumberFormatSymbols_kab;\n\n\n/**\n * Compact number formatting symbols for locale kam.\n */\ngoog.i18n.CompactNumberFormatSymbols_kam = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale kam_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_kam_KE = goog.i18n.CompactNumberFormatSymbols_kam;\n\n\n/**\n * Compact number formatting symbols for locale kde.\n */\ngoog.i18n.CompactNumberFormatSymbols_kde = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale kde_TZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_kde_TZ = goog.i18n.CompactNumberFormatSymbols_kde;\n\n\n/**\n * Compact number formatting symbols for locale kea.\n */\ngoog.i18n.CompactNumberFormatSymbols_kea = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 mil'\n    },\n    '10000': {\n      'other': '00 mil'\n    },\n    '100000': {\n      'other': '000 mil'\n    },\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0 MM'\n    },\n    '10000000000': {\n      'other': '00 MM'\n    },\n    '100000000000': {\n      'other': '000 MM'\n    },\n    '1000000000000': {\n      'other': '0 Bi'\n    },\n    '10000000000000': {\n      'other': '00 Bi'\n    },\n    '100000000000000': {\n      'other': '000 Bi'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 mil'\n    },\n    '10000': {\n      'other': '00 mil'\n    },\n    '100000': {\n      'other': '000 mil'\n    },\n    '1000000': {\n      'other': '0 milhãu'\n    },\n    '10000000': {\n      'other': '00 milhãu'\n    },\n    '100000000': {\n      'other': '000 milhãu'\n    },\n    '1000000000': {\n      'other': '0 mil milhãu'\n    },\n    '10000000000': {\n      'other': '00 mil milhãu'\n    },\n    '100000000000': {\n      'other': '000 mil milhãu'\n    },\n    '1000000000000': {\n      'other': '0 bilhãu'\n    },\n    '10000000000000': {\n      'other': '00 bilhãu'\n    },\n    '100000000000000': {\n      'other': '000 bilhãu'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale kea_CV.\n */\ngoog.i18n.CompactNumberFormatSymbols_kea_CV = goog.i18n.CompactNumberFormatSymbols_kea;\n\n\n/**\n * Compact number formatting symbols for locale khq.\n */\ngoog.i18n.CompactNumberFormatSymbols_khq = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale khq_ML.\n */\ngoog.i18n.CompactNumberFormatSymbols_khq_ML = goog.i18n.CompactNumberFormatSymbols_khq;\n\n\n/**\n * Compact number formatting symbols for locale ki.\n */\ngoog.i18n.CompactNumberFormatSymbols_ki = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ki_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_ki_KE = goog.i18n.CompactNumberFormatSymbols_ki;\n\n\n/**\n * Compact number formatting symbols for locale kk_KZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_kk_KZ = goog.i18n.CompactNumberFormatSymbols_kk;\n\n\n/**\n * Compact number formatting symbols for locale kkj.\n */\ngoog.i18n.CompactNumberFormatSymbols_kkj = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale kkj_CM.\n */\ngoog.i18n.CompactNumberFormatSymbols_kkj_CM = goog.i18n.CompactNumberFormatSymbols_kkj;\n\n\n/**\n * Compact number formatting symbols for locale kl.\n */\ngoog.i18n.CompactNumberFormatSymbols_kl = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale kl_GL.\n */\ngoog.i18n.CompactNumberFormatSymbols_kl_GL = goog.i18n.CompactNumberFormatSymbols_kl;\n\n\n/**\n * Compact number formatting symbols for locale kln.\n */\ngoog.i18n.CompactNumberFormatSymbols_kln = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale kln_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_kln_KE = goog.i18n.CompactNumberFormatSymbols_kln;\n\n\n/**\n * Compact number formatting symbols for locale km_KH.\n */\ngoog.i18n.CompactNumberFormatSymbols_km_KH = goog.i18n.CompactNumberFormatSymbols_km;\n\n\n/**\n * Compact number formatting symbols for locale kn_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_kn_IN = goog.i18n.CompactNumberFormatSymbols_kn;\n\n\n/**\n * Compact number formatting symbols for locale ko_KP.\n */\ngoog.i18n.CompactNumberFormatSymbols_ko_KP = goog.i18n.CompactNumberFormatSymbols_ko;\n\n\n/**\n * Compact number formatting symbols for locale ko_KR.\n */\ngoog.i18n.CompactNumberFormatSymbols_ko_KR = goog.i18n.CompactNumberFormatSymbols_ko;\n\n\n/**\n * Compact number formatting symbols for locale kok.\n */\ngoog.i18n.CompactNumberFormatSymbols_kok = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale kok_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_kok_IN = goog.i18n.CompactNumberFormatSymbols_kok;\n\n\n/**\n * Compact number formatting symbols for locale ks.\n */\ngoog.i18n.CompactNumberFormatSymbols_ks = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ks_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_ks_IN = goog.i18n.CompactNumberFormatSymbols_ks;\n\n\n/**\n * Compact number formatting symbols for locale ksb.\n */\ngoog.i18n.CompactNumberFormatSymbols_ksb = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ksb_TZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_ksb_TZ = goog.i18n.CompactNumberFormatSymbols_ksb;\n\n\n/**\n * Compact number formatting symbols for locale ksf.\n */\ngoog.i18n.CompactNumberFormatSymbols_ksf = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ksf_CM.\n */\ngoog.i18n.CompactNumberFormatSymbols_ksf_CM = goog.i18n.CompactNumberFormatSymbols_ksf;\n\n\n/**\n * Compact number formatting symbols for locale ksh.\n */\ngoog.i18n.CompactNumberFormatSymbols_ksh = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 tsd'\n    },\n    '10000': {\n      'other': '00 tsd'\n    },\n    '100000': {\n      'other': '000 tsd'\n    },\n    '1000000': {\n      'other': '0 Mio'\n    },\n    '10000000': {\n      'other': '00 Mio'\n    },\n    '100000000': {\n      'other': '000 Mio'\n    },\n    '1000000000': {\n      'other': '0 Mrd'\n    },\n    '10000000000': {\n      'other': '00 Mrd'\n    },\n    '100000000000': {\n      'other': '000 Mrd'\n    },\n    '1000000000000': {\n      'other': '0 Bio'\n    },\n    '10000000000000': {\n      'other': '00 Bio'\n    },\n    '100000000000000': {\n      'other': '000 Bio'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 Dousend'\n    },\n    '10000': {\n      'other': '00 Dousend'\n    },\n    '100000': {\n      'other': '000 Dousend'\n    },\n    '1000000': {\n      'other': '0 Milljuhne'\n    },\n    '10000000': {\n      'other': '00 Millionen'\n    },\n    '100000000': {\n      'other': '000 Millionen'\n    },\n    '1000000000': {\n      'other': '0 Milljarde'\n    },\n    '10000000000': {\n      'other': '00 Milliarden'\n    },\n    '100000000000': {\n      'other': '000 Milliarden'\n    },\n    '1000000000000': {\n      'other': '0 Billjuhn'\n    },\n    '10000000000000': {\n      'other': '00 Billionen'\n    },\n    '100000000000000': {\n      'other': '000 Billionen'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ksh_DE.\n */\ngoog.i18n.CompactNumberFormatSymbols_ksh_DE = goog.i18n.CompactNumberFormatSymbols_ksh;\n\n\n/**\n * Compact number formatting symbols for locale ku.\n */\ngoog.i18n.CompactNumberFormatSymbols_ku = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ku_TR.\n */\ngoog.i18n.CompactNumberFormatSymbols_ku_TR = goog.i18n.CompactNumberFormatSymbols_ku;\n\n\n/**\n * Compact number formatting symbols for locale kw.\n */\ngoog.i18n.CompactNumberFormatSymbols_kw = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale kw_GB.\n */\ngoog.i18n.CompactNumberFormatSymbols_kw_GB = goog.i18n.CompactNumberFormatSymbols_kw;\n\n\n/**\n * Compact number formatting symbols for locale ky_KG.\n */\ngoog.i18n.CompactNumberFormatSymbols_ky_KG = goog.i18n.CompactNumberFormatSymbols_ky;\n\n\n/**\n * Compact number formatting symbols for locale lag.\n */\ngoog.i18n.CompactNumberFormatSymbols_lag = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale lag_TZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_lag_TZ = goog.i18n.CompactNumberFormatSymbols_lag;\n\n\n/**\n * Compact number formatting symbols for locale lb.\n */\ngoog.i18n.CompactNumberFormatSymbols_lb = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 Dsd.'\n    },\n    '10000': {\n      'other': '00 Dsd.'\n    },\n    '100000': {\n      'other': '000 Dsd.'\n    },\n    '1000000': {\n      'other': '0 Mio.'\n    },\n    '10000000': {\n      'other': '00 Mio.'\n    },\n    '100000000': {\n      'other': '000 Mio.'\n    },\n    '1000000000': {\n      'other': '0 Mrd.'\n    },\n    '10000000000': {\n      'other': '00 Mrd.'\n    },\n    '100000000000': {\n      'other': '000 Mrd.'\n    },\n    '1000000000000': {\n      'other': '0 Bio.'\n    },\n    '10000000000000': {\n      'other': '00 Bio.'\n    },\n    '100000000000000': {\n      'other': '000 Bio.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 Dausend'\n    },\n    '10000': {\n      'other': '00 Dausend'\n    },\n    '100000': {\n      'other': '000 Dausend'\n    },\n    '1000000': {\n      'other': '0 Milliounen'\n    },\n    '10000000': {\n      'other': '00 Milliounen'\n    },\n    '100000000': {\n      'other': '000 Milliounen'\n    },\n    '1000000000': {\n      'other': '0 Milliarden'\n    },\n    '10000000000': {\n      'other': '00 Milliarden'\n    },\n    '100000000000': {\n      'other': '000 Milliarden'\n    },\n    '1000000000000': {\n      'other': '0 Billiounen'\n    },\n    '10000000000000': {\n      'other': '00 Billiounen'\n    },\n    '100000000000000': {\n      'other': '000 Billiounen'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale lb_LU.\n */\ngoog.i18n.CompactNumberFormatSymbols_lb_LU = goog.i18n.CompactNumberFormatSymbols_lb;\n\n\n/**\n * Compact number formatting symbols for locale lg.\n */\ngoog.i18n.CompactNumberFormatSymbols_lg = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale lg_UG.\n */\ngoog.i18n.CompactNumberFormatSymbols_lg_UG = goog.i18n.CompactNumberFormatSymbols_lg;\n\n\n/**\n * Compact number formatting symbols for locale lkt.\n */\ngoog.i18n.CompactNumberFormatSymbols_lkt = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale lkt_US.\n */\ngoog.i18n.CompactNumberFormatSymbols_lkt_US = goog.i18n.CompactNumberFormatSymbols_lkt;\n\n\n/**\n * Compact number formatting symbols for locale ln_AO.\n */\ngoog.i18n.CompactNumberFormatSymbols_ln_AO = goog.i18n.CompactNumberFormatSymbols_ln;\n\n\n/**\n * Compact number formatting symbols for locale ln_CD.\n */\ngoog.i18n.CompactNumberFormatSymbols_ln_CD = goog.i18n.CompactNumberFormatSymbols_ln;\n\n\n/**\n * Compact number formatting symbols for locale ln_CF.\n */\ngoog.i18n.CompactNumberFormatSymbols_ln_CF = goog.i18n.CompactNumberFormatSymbols_ln;\n\n\n/**\n * Compact number formatting symbols for locale ln_CG.\n */\ngoog.i18n.CompactNumberFormatSymbols_ln_CG = goog.i18n.CompactNumberFormatSymbols_ln;\n\n\n/**\n * Compact number formatting symbols for locale lo_LA.\n */\ngoog.i18n.CompactNumberFormatSymbols_lo_LA = goog.i18n.CompactNumberFormatSymbols_lo;\n\n\n/**\n * Compact number formatting symbols for locale lrc.\n */\ngoog.i18n.CompactNumberFormatSymbols_lrc = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale lrc_IQ.\n */\ngoog.i18n.CompactNumberFormatSymbols_lrc_IQ = goog.i18n.CompactNumberFormatSymbols_lrc;\n\n\n/**\n * Compact number formatting symbols for locale lrc_IR.\n */\ngoog.i18n.CompactNumberFormatSymbols_lrc_IR = goog.i18n.CompactNumberFormatSymbols_lrc;\n\n\n/**\n * Compact number formatting symbols for locale lt_LT.\n */\ngoog.i18n.CompactNumberFormatSymbols_lt_LT = goog.i18n.CompactNumberFormatSymbols_lt;\n\n\n/**\n * Compact number formatting symbols for locale lu.\n */\ngoog.i18n.CompactNumberFormatSymbols_lu = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale lu_CD.\n */\ngoog.i18n.CompactNumberFormatSymbols_lu_CD = goog.i18n.CompactNumberFormatSymbols_lu;\n\n\n/**\n * Compact number formatting symbols for locale luo.\n */\ngoog.i18n.CompactNumberFormatSymbols_luo = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale luo_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_luo_KE = goog.i18n.CompactNumberFormatSymbols_luo;\n\n\n/**\n * Compact number formatting symbols for locale luy.\n */\ngoog.i18n.CompactNumberFormatSymbols_luy = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale luy_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_luy_KE = goog.i18n.CompactNumberFormatSymbols_luy;\n\n\n/**\n * Compact number formatting symbols for locale lv_LV.\n */\ngoog.i18n.CompactNumberFormatSymbols_lv_LV = goog.i18n.CompactNumberFormatSymbols_lv;\n\n\n/**\n * Compact number formatting symbols for locale mas.\n */\ngoog.i18n.CompactNumberFormatSymbols_mas = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale mas_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_mas_KE = goog.i18n.CompactNumberFormatSymbols_mas;\n\n\n/**\n * Compact number formatting symbols for locale mas_TZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_mas_TZ = goog.i18n.CompactNumberFormatSymbols_mas;\n\n\n/**\n * Compact number formatting symbols for locale mer.\n */\ngoog.i18n.CompactNumberFormatSymbols_mer = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale mer_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_mer_KE = goog.i18n.CompactNumberFormatSymbols_mer;\n\n\n/**\n * Compact number formatting symbols for locale mfe.\n */\ngoog.i18n.CompactNumberFormatSymbols_mfe = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale mfe_MU.\n */\ngoog.i18n.CompactNumberFormatSymbols_mfe_MU = goog.i18n.CompactNumberFormatSymbols_mfe;\n\n\n/**\n * Compact number formatting symbols for locale mg.\n */\ngoog.i18n.CompactNumberFormatSymbols_mg = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale mg_MG.\n */\ngoog.i18n.CompactNumberFormatSymbols_mg_MG = goog.i18n.CompactNumberFormatSymbols_mg;\n\n\n/**\n * Compact number formatting symbols for locale mgh.\n */\ngoog.i18n.CompactNumberFormatSymbols_mgh = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale mgh_MZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_mgh_MZ = goog.i18n.CompactNumberFormatSymbols_mgh;\n\n\n/**\n * Compact number formatting symbols for locale mgo.\n */\ngoog.i18n.CompactNumberFormatSymbols_mgo = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale mgo_CM.\n */\ngoog.i18n.CompactNumberFormatSymbols_mgo_CM = goog.i18n.CompactNumberFormatSymbols_mgo;\n\n\n/**\n * Compact number formatting symbols for locale mi.\n */\ngoog.i18n.CompactNumberFormatSymbols_mi = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale mi_NZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_mi_NZ = goog.i18n.CompactNumberFormatSymbols_mi;\n\n\n/**\n * Compact number formatting symbols for locale mk_MK.\n */\ngoog.i18n.CompactNumberFormatSymbols_mk_MK = goog.i18n.CompactNumberFormatSymbols_mk;\n\n\n/**\n * Compact number formatting symbols for locale ml_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_ml_IN = goog.i18n.CompactNumberFormatSymbols_ml;\n\n\n/**\n * Compact number formatting symbols for locale mn_MN.\n */\ngoog.i18n.CompactNumberFormatSymbols_mn_MN = goog.i18n.CompactNumberFormatSymbols_mn;\n\n\n/**\n * Compact number formatting symbols for locale mr_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_mr_IN = goog.i18n.CompactNumberFormatSymbols_mr;\n\n\n/**\n * Compact number formatting symbols for locale ms_BN.\n */\ngoog.i18n.CompactNumberFormatSymbols_ms_BN = goog.i18n.CompactNumberFormatSymbols_ms;\n\n\n/**\n * Compact number formatting symbols for locale ms_MY.\n */\ngoog.i18n.CompactNumberFormatSymbols_ms_MY = goog.i18n.CompactNumberFormatSymbols_ms;\n\n\n/**\n * Compact number formatting symbols for locale ms_SG.\n */\ngoog.i18n.CompactNumberFormatSymbols_ms_SG = goog.i18n.CompactNumberFormatSymbols_ms;\n\n\n/**\n * Compact number formatting symbols for locale mt_MT.\n */\ngoog.i18n.CompactNumberFormatSymbols_mt_MT = goog.i18n.CompactNumberFormatSymbols_mt;\n\n\n/**\n * Compact number formatting symbols for locale mua.\n */\ngoog.i18n.CompactNumberFormatSymbols_mua = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale mua_CM.\n */\ngoog.i18n.CompactNumberFormatSymbols_mua_CM = goog.i18n.CompactNumberFormatSymbols_mua;\n\n\n/**\n * Compact number formatting symbols for locale my_MM.\n */\ngoog.i18n.CompactNumberFormatSymbols_my_MM = goog.i18n.CompactNumberFormatSymbols_my;\n\n\n/**\n * Compact number formatting symbols for locale mzn.\n */\ngoog.i18n.CompactNumberFormatSymbols_mzn = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale mzn_IR.\n */\ngoog.i18n.CompactNumberFormatSymbols_mzn_IR = goog.i18n.CompactNumberFormatSymbols_mzn;\n\n\n/**\n * Compact number formatting symbols for locale naq.\n */\ngoog.i18n.CompactNumberFormatSymbols_naq = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale naq_NA.\n */\ngoog.i18n.CompactNumberFormatSymbols_naq_NA = goog.i18n.CompactNumberFormatSymbols_naq;\n\n\n/**\n * Compact number formatting symbols for locale nb_NO.\n */\ngoog.i18n.CompactNumberFormatSymbols_nb_NO = goog.i18n.CompactNumberFormatSymbols_nb;\n\n\n/**\n * Compact number formatting symbols for locale nb_SJ.\n */\ngoog.i18n.CompactNumberFormatSymbols_nb_SJ = goog.i18n.CompactNumberFormatSymbols_nb;\n\n\n/**\n * Compact number formatting symbols for locale nd.\n */\ngoog.i18n.CompactNumberFormatSymbols_nd = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale nd_ZW.\n */\ngoog.i18n.CompactNumberFormatSymbols_nd_ZW = goog.i18n.CompactNumberFormatSymbols_nd;\n\n\n/**\n * Compact number formatting symbols for locale nds.\n */\ngoog.i18n.CompactNumberFormatSymbols_nds = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale nds_DE.\n */\ngoog.i18n.CompactNumberFormatSymbols_nds_DE = goog.i18n.CompactNumberFormatSymbols_nds;\n\n\n/**\n * Compact number formatting symbols for locale nds_NL.\n */\ngoog.i18n.CompactNumberFormatSymbols_nds_NL = goog.i18n.CompactNumberFormatSymbols_nds;\n\n\n/**\n * Compact number formatting symbols for locale ne_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_ne_IN = goog.i18n.CompactNumberFormatSymbols_ne;\n\n\n/**\n * Compact number formatting symbols for locale ne_NP.\n */\ngoog.i18n.CompactNumberFormatSymbols_ne_NP = goog.i18n.CompactNumberFormatSymbols_ne;\n\n\n/**\n * Compact number formatting symbols for locale nl_AW.\n */\ngoog.i18n.CompactNumberFormatSymbols_nl_AW = goog.i18n.CompactNumberFormatSymbols_nl;\n\n\n/**\n * Compact number formatting symbols for locale nl_BE.\n */\ngoog.i18n.CompactNumberFormatSymbols_nl_BE = goog.i18n.CompactNumberFormatSymbols_nl;\n\n\n/**\n * Compact number formatting symbols for locale nl_BQ.\n */\ngoog.i18n.CompactNumberFormatSymbols_nl_BQ = goog.i18n.CompactNumberFormatSymbols_nl;\n\n\n/**\n * Compact number formatting symbols for locale nl_CW.\n */\ngoog.i18n.CompactNumberFormatSymbols_nl_CW = goog.i18n.CompactNumberFormatSymbols_nl;\n\n\n/**\n * Compact number formatting symbols for locale nl_NL.\n */\ngoog.i18n.CompactNumberFormatSymbols_nl_NL = goog.i18n.CompactNumberFormatSymbols_nl;\n\n\n/**\n * Compact number formatting symbols for locale nl_SR.\n */\ngoog.i18n.CompactNumberFormatSymbols_nl_SR = goog.i18n.CompactNumberFormatSymbols_nl;\n\n\n/**\n * Compact number formatting symbols for locale nl_SX.\n */\ngoog.i18n.CompactNumberFormatSymbols_nl_SX = goog.i18n.CompactNumberFormatSymbols_nl;\n\n\n/**\n * Compact number formatting symbols for locale nmg.\n */\ngoog.i18n.CompactNumberFormatSymbols_nmg = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale nmg_CM.\n */\ngoog.i18n.CompactNumberFormatSymbols_nmg_CM = goog.i18n.CompactNumberFormatSymbols_nmg;\n\n\n/**\n * Compact number formatting symbols for locale nn.\n */\ngoog.i18n.CompactNumberFormatSymbols_nn = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tusen'\n    },\n    '10000': {\n      'other': '00 tusen'\n    },\n    '100000': {\n      'other': '000 tusen'\n    },\n    '1000000': {\n      'other': '0 millionar'\n    },\n    '10000000': {\n      'other': '00 millionar'\n    },\n    '100000000': {\n      'other': '000 millionar'\n    },\n    '1000000000': {\n      'other': '0 milliardar'\n    },\n    '10000000000': {\n      'other': '00 milliardar'\n    },\n    '100000000000': {\n      'other': '000 milliardar'\n    },\n    '1000000000000': {\n      'other': '0 billionar'\n    },\n    '10000000000000': {\n      'other': '00 billionar'\n    },\n    '100000000000000': {\n      'other': '000 billionar'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale nn_NO.\n */\ngoog.i18n.CompactNumberFormatSymbols_nn_NO = goog.i18n.CompactNumberFormatSymbols_nn;\n\n\n/**\n * Compact number formatting symbols for locale nnh.\n */\ngoog.i18n.CompactNumberFormatSymbols_nnh = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale nnh_CM.\n */\ngoog.i18n.CompactNumberFormatSymbols_nnh_CM = goog.i18n.CompactNumberFormatSymbols_nnh;\n\n\n/**\n * Compact number formatting symbols for locale nus.\n */\ngoog.i18n.CompactNumberFormatSymbols_nus = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale nus_SS.\n */\ngoog.i18n.CompactNumberFormatSymbols_nus_SS = goog.i18n.CompactNumberFormatSymbols_nus;\n\n\n/**\n * Compact number formatting symbols for locale nyn.\n */\ngoog.i18n.CompactNumberFormatSymbols_nyn = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale nyn_UG.\n */\ngoog.i18n.CompactNumberFormatSymbols_nyn_UG = goog.i18n.CompactNumberFormatSymbols_nyn;\n\n\n/**\n * Compact number formatting symbols for locale om.\n */\ngoog.i18n.CompactNumberFormatSymbols_om = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale om_ET.\n */\ngoog.i18n.CompactNumberFormatSymbols_om_ET = goog.i18n.CompactNumberFormatSymbols_om;\n\n\n/**\n * Compact number formatting symbols for locale om_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_om_KE = goog.i18n.CompactNumberFormatSymbols_om;\n\n\n/**\n * Compact number formatting symbols for locale or_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_or_IN = goog.i18n.CompactNumberFormatSymbols_or;\n\n\n/**\n * Compact number formatting symbols for locale os.\n */\ngoog.i18n.CompactNumberFormatSymbols_os = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale os_GE.\n */\ngoog.i18n.CompactNumberFormatSymbols_os_GE = goog.i18n.CompactNumberFormatSymbols_os;\n\n\n/**\n * Compact number formatting symbols for locale os_RU.\n */\ngoog.i18n.CompactNumberFormatSymbols_os_RU = goog.i18n.CompactNumberFormatSymbols_os;\n\n\n/**\n * Compact number formatting symbols for locale pa_Arab.\n */\ngoog.i18n.CompactNumberFormatSymbols_pa_Arab = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale pa_Arab_PK.\n */\ngoog.i18n.CompactNumberFormatSymbols_pa_Arab_PK = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale pa_Guru.\n */\ngoog.i18n.CompactNumberFormatSymbols_pa_Guru = goog.i18n.CompactNumberFormatSymbols_pa;\n\n\n/**\n * Compact number formatting symbols for locale pa_Guru_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_pa_Guru_IN = goog.i18n.CompactNumberFormatSymbols_pa;\n\n\n/**\n * Compact number formatting symbols for locale pl_PL.\n */\ngoog.i18n.CompactNumberFormatSymbols_pl_PL = goog.i18n.CompactNumberFormatSymbols_pl;\n\n\n/**\n * Compact number formatting symbols for locale ps.\n */\ngoog.i18n.CompactNumberFormatSymbols_ps = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ps_AF.\n */\ngoog.i18n.CompactNumberFormatSymbols_ps_AF = goog.i18n.CompactNumberFormatSymbols_ps;\n\n\n/**\n * Compact number formatting symbols for locale ps_PK.\n */\ngoog.i18n.CompactNumberFormatSymbols_ps_PK = goog.i18n.CompactNumberFormatSymbols_ps;\n\n\n/**\n * Compact number formatting symbols for locale pt_AO.\n */\ngoog.i18n.CompactNumberFormatSymbols_pt_AO = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0 mM'\n    },\n    '10000000000': {\n      'other': '00 mM'\n    },\n    '100000000000': {\n      'other': '000 mM'\n    },\n    '1000000000000': {\n      'other': '0 Bi'\n    },\n    '10000000000000': {\n      'other': '00 Bi'\n    },\n    '100000000000000': {\n      'other': '000 Bi'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000': {\n      'other': '0 milhões'\n    },\n    '10000000': {\n      'other': '00 milhões'\n    },\n    '100000000': {\n      'other': '000 milhões'\n    },\n    '1000000000': {\n      'other': '0 mil milhões'\n    },\n    '10000000000': {\n      'other': '00 mil milhões'\n    },\n    '100000000000': {\n      'other': '000 mil milhões'\n    },\n    '1000000000000': {\n      'other': '0 biliões'\n    },\n    '10000000000000': {\n      'other': '00 biliões'\n    },\n    '100000000000000': {\n      'other': '000 biliões'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale pt_CH.\n */\ngoog.i18n.CompactNumberFormatSymbols_pt_CH = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0 mM'\n    },\n    '10000000000': {\n      'other': '00 mM'\n    },\n    '100000000000': {\n      'other': '000 mM'\n    },\n    '1000000000000': {\n      'other': '0 Bi'\n    },\n    '10000000000000': {\n      'other': '00 Bi'\n    },\n    '100000000000000': {\n      'other': '000 Bi'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000': {\n      'other': '0 milhões'\n    },\n    '10000000': {\n      'other': '00 milhões'\n    },\n    '100000000': {\n      'other': '000 milhões'\n    },\n    '1000000000': {\n      'other': '0 mil milhões'\n    },\n    '10000000000': {\n      'other': '00 mil milhões'\n    },\n    '100000000000': {\n      'other': '000 mil milhões'\n    },\n    '1000000000000': {\n      'other': '0 biliões'\n    },\n    '10000000000000': {\n      'other': '00 biliões'\n    },\n    '100000000000000': {\n      'other': '000 biliões'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale pt_CV.\n */\ngoog.i18n.CompactNumberFormatSymbols_pt_CV = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0 mM'\n    },\n    '10000000000': {\n      'other': '00 mM'\n    },\n    '100000000000': {\n      'other': '000 mM'\n    },\n    '1000000000000': {\n      'other': '0 Bi'\n    },\n    '10000000000000': {\n      'other': '00 Bi'\n    },\n    '100000000000000': {\n      'other': '000 Bi'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000': {\n      'other': '0 milhões'\n    },\n    '10000000': {\n      'other': '00 milhões'\n    },\n    '100000000': {\n      'other': '000 milhões'\n    },\n    '1000000000': {\n      'other': '0 mil milhões'\n    },\n    '10000000000': {\n      'other': '00 mil milhões'\n    },\n    '100000000000': {\n      'other': '000 mil milhões'\n    },\n    '1000000000000': {\n      'other': '0 biliões'\n    },\n    '10000000000000': {\n      'other': '00 biliões'\n    },\n    '100000000000000': {\n      'other': '000 biliões'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale pt_GQ.\n */\ngoog.i18n.CompactNumberFormatSymbols_pt_GQ = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0 mM'\n    },\n    '10000000000': {\n      'other': '00 mM'\n    },\n    '100000000000': {\n      'other': '000 mM'\n    },\n    '1000000000000': {\n      'other': '0 Bi'\n    },\n    '10000000000000': {\n      'other': '00 Bi'\n    },\n    '100000000000000': {\n      'other': '000 Bi'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000': {\n      'other': '0 milhões'\n    },\n    '10000000': {\n      'other': '00 milhões'\n    },\n    '100000000': {\n      'other': '000 milhões'\n    },\n    '1000000000': {\n      'other': '0 mil milhões'\n    },\n    '10000000000': {\n      'other': '00 mil milhões'\n    },\n    '100000000000': {\n      'other': '000 mil milhões'\n    },\n    '1000000000000': {\n      'other': '0 biliões'\n    },\n    '10000000000000': {\n      'other': '00 biliões'\n    },\n    '100000000000000': {\n      'other': '000 biliões'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale pt_GW.\n */\ngoog.i18n.CompactNumberFormatSymbols_pt_GW = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0 mM'\n    },\n    '10000000000': {\n      'other': '00 mM'\n    },\n    '100000000000': {\n      'other': '000 mM'\n    },\n    '1000000000000': {\n      'other': '0 Bi'\n    },\n    '10000000000000': {\n      'other': '00 Bi'\n    },\n    '100000000000000': {\n      'other': '000 Bi'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000': {\n      'other': '0 milhões'\n    },\n    '10000000': {\n      'other': '00 milhões'\n    },\n    '100000000': {\n      'other': '000 milhões'\n    },\n    '1000000000': {\n      'other': '0 mil milhões'\n    },\n    '10000000000': {\n      'other': '00 mil milhões'\n    },\n    '100000000000': {\n      'other': '000 mil milhões'\n    },\n    '1000000000000': {\n      'other': '0 biliões'\n    },\n    '10000000000000': {\n      'other': '00 biliões'\n    },\n    '100000000000000': {\n      'other': '000 biliões'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale pt_LU.\n */\ngoog.i18n.CompactNumberFormatSymbols_pt_LU = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0 mM'\n    },\n    '10000000000': {\n      'other': '00 mM'\n    },\n    '100000000000': {\n      'other': '000 mM'\n    },\n    '1000000000000': {\n      'other': '0 Bi'\n    },\n    '10000000000000': {\n      'other': '00 Bi'\n    },\n    '100000000000000': {\n      'other': '000 Bi'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000': {\n      'other': '0 milhões'\n    },\n    '10000000': {\n      'other': '00 milhões'\n    },\n    '100000000': {\n      'other': '000 milhões'\n    },\n    '1000000000': {\n      'other': '0 mil milhões'\n    },\n    '10000000000': {\n      'other': '00 mil milhões'\n    },\n    '100000000000': {\n      'other': '000 mil milhões'\n    },\n    '1000000000000': {\n      'other': '0 biliões'\n    },\n    '10000000000000': {\n      'other': '00 biliões'\n    },\n    '100000000000000': {\n      'other': '000 biliões'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale pt_MO.\n */\ngoog.i18n.CompactNumberFormatSymbols_pt_MO = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0 mM'\n    },\n    '10000000000': {\n      'other': '00 mM'\n    },\n    '100000000000': {\n      'other': '000 mM'\n    },\n    '1000000000000': {\n      'other': '0 Bi'\n    },\n    '10000000000000': {\n      'other': '00 Bi'\n    },\n    '100000000000000': {\n      'other': '000 Bi'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000': {\n      'other': '0 milhões'\n    },\n    '10000000': {\n      'other': '00 milhões'\n    },\n    '100000000': {\n      'other': '000 milhões'\n    },\n    '1000000000': {\n      'other': '0 mil milhões'\n    },\n    '10000000000': {\n      'other': '00 mil milhões'\n    },\n    '100000000000': {\n      'other': '000 mil milhões'\n    },\n    '1000000000000': {\n      'other': '0 biliões'\n    },\n    '10000000000000': {\n      'other': '00 biliões'\n    },\n    '100000000000000': {\n      'other': '000 biliões'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale pt_MZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_pt_MZ = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0 mM'\n    },\n    '10000000000': {\n      'other': '00 mM'\n    },\n    '100000000000': {\n      'other': '000 mM'\n    },\n    '1000000000000': {\n      'other': '0 Bi'\n    },\n    '10000000000000': {\n      'other': '00 Bi'\n    },\n    '100000000000000': {\n      'other': '000 Bi'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000': {\n      'other': '0 milhões'\n    },\n    '10000000': {\n      'other': '00 milhões'\n    },\n    '100000000': {\n      'other': '000 milhões'\n    },\n    '1000000000': {\n      'other': '0 mil milhões'\n    },\n    '10000000000': {\n      'other': '00 mil milhões'\n    },\n    '100000000000': {\n      'other': '000 mil milhões'\n    },\n    '1000000000000': {\n      'other': '0 biliões'\n    },\n    '10000000000000': {\n      'other': '00 biliões'\n    },\n    '100000000000000': {\n      'other': '000 biliões'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale pt_ST.\n */\ngoog.i18n.CompactNumberFormatSymbols_pt_ST = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0 mM'\n    },\n    '10000000000': {\n      'other': '00 mM'\n    },\n    '100000000000': {\n      'other': '000 mM'\n    },\n    '1000000000000': {\n      'other': '0 Bi'\n    },\n    '10000000000000': {\n      'other': '00 Bi'\n    },\n    '100000000000000': {\n      'other': '000 Bi'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000': {\n      'other': '0 milhões'\n    },\n    '10000000': {\n      'other': '00 milhões'\n    },\n    '100000000': {\n      'other': '000 milhões'\n    },\n    '1000000000': {\n      'other': '0 mil milhões'\n    },\n    '10000000000': {\n      'other': '00 mil milhões'\n    },\n    '100000000000': {\n      'other': '000 mil milhões'\n    },\n    '1000000000000': {\n      'other': '0 biliões'\n    },\n    '10000000000000': {\n      'other': '00 biliões'\n    },\n    '100000000000000': {\n      'other': '000 biliões'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale pt_TL.\n */\ngoog.i18n.CompactNumberFormatSymbols_pt_TL = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000000': {\n      'other': '0 M'\n    },\n    '10000000': {\n      'other': '00 M'\n    },\n    '100000000': {\n      'other': '000 M'\n    },\n    '1000000000': {\n      'other': '0 mM'\n    },\n    '10000000000': {\n      'other': '00 mM'\n    },\n    '100000000000': {\n      'other': '000 mM'\n    },\n    '1000000000000': {\n      'other': '0 Bi'\n    },\n    '10000000000000': {\n      'other': '00 Bi'\n    },\n    '100000000000000': {\n      'other': '000 Bi'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000': {\n      'other': '0 milhões'\n    },\n    '10000000': {\n      'other': '00 milhões'\n    },\n    '100000000': {\n      'other': '000 milhões'\n    },\n    '1000000000': {\n      'other': '0 mil milhões'\n    },\n    '10000000000': {\n      'other': '00 mil milhões'\n    },\n    '100000000000': {\n      'other': '000 mil milhões'\n    },\n    '1000000000000': {\n      'other': '0 biliões'\n    },\n    '10000000000000': {\n      'other': '00 biliões'\n    },\n    '100000000000000': {\n      'other': '000 biliões'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale qu.\n */\ngoog.i18n.CompactNumberFormatSymbols_qu = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale qu_BO.\n */\ngoog.i18n.CompactNumberFormatSymbols_qu_BO = goog.i18n.CompactNumberFormatSymbols_qu;\n\n\n/**\n * Compact number formatting symbols for locale qu_EC.\n */\ngoog.i18n.CompactNumberFormatSymbols_qu_EC = goog.i18n.CompactNumberFormatSymbols_qu;\n\n\n/**\n * Compact number formatting symbols for locale qu_PE.\n */\ngoog.i18n.CompactNumberFormatSymbols_qu_PE = goog.i18n.CompactNumberFormatSymbols_qu;\n\n\n/**\n * Compact number formatting symbols for locale rm.\n */\ngoog.i18n.CompactNumberFormatSymbols_rm = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale rm_CH.\n */\ngoog.i18n.CompactNumberFormatSymbols_rm_CH = goog.i18n.CompactNumberFormatSymbols_rm;\n\n\n/**\n * Compact number formatting symbols for locale rn.\n */\ngoog.i18n.CompactNumberFormatSymbols_rn = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale rn_BI.\n */\ngoog.i18n.CompactNumberFormatSymbols_rn_BI = goog.i18n.CompactNumberFormatSymbols_rn;\n\n\n/**\n * Compact number formatting symbols for locale ro_MD.\n */\ngoog.i18n.CompactNumberFormatSymbols_ro_MD = goog.i18n.CompactNumberFormatSymbols_ro;\n\n\n/**\n * Compact number formatting symbols for locale ro_RO.\n */\ngoog.i18n.CompactNumberFormatSymbols_ro_RO = goog.i18n.CompactNumberFormatSymbols_ro;\n\n\n/**\n * Compact number formatting symbols for locale rof.\n */\ngoog.i18n.CompactNumberFormatSymbols_rof = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale rof_TZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_rof_TZ = goog.i18n.CompactNumberFormatSymbols_rof;\n\n\n/**\n * Compact number formatting symbols for locale ru_BY.\n */\ngoog.i18n.CompactNumberFormatSymbols_ru_BY = goog.i18n.CompactNumberFormatSymbols_ru;\n\n\n/**\n * Compact number formatting symbols for locale ru_KG.\n */\ngoog.i18n.CompactNumberFormatSymbols_ru_KG = goog.i18n.CompactNumberFormatSymbols_ru;\n\n\n/**\n * Compact number formatting symbols for locale ru_KZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_ru_KZ = goog.i18n.CompactNumberFormatSymbols_ru;\n\n\n/**\n * Compact number formatting symbols for locale ru_MD.\n */\ngoog.i18n.CompactNumberFormatSymbols_ru_MD = goog.i18n.CompactNumberFormatSymbols_ru;\n\n\n/**\n * Compact number formatting symbols for locale ru_RU.\n */\ngoog.i18n.CompactNumberFormatSymbols_ru_RU = goog.i18n.CompactNumberFormatSymbols_ru;\n\n\n/**\n * Compact number formatting symbols for locale ru_UA.\n */\ngoog.i18n.CompactNumberFormatSymbols_ru_UA = goog.i18n.CompactNumberFormatSymbols_ru;\n\n\n/**\n * Compact number formatting symbols for locale rw.\n */\ngoog.i18n.CompactNumberFormatSymbols_rw = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale rw_RW.\n */\ngoog.i18n.CompactNumberFormatSymbols_rw_RW = goog.i18n.CompactNumberFormatSymbols_rw;\n\n\n/**\n * Compact number formatting symbols for locale rwk.\n */\ngoog.i18n.CompactNumberFormatSymbols_rwk = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale rwk_TZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_rwk_TZ = goog.i18n.CompactNumberFormatSymbols_rwk;\n\n\n/**\n * Compact number formatting symbols for locale sah.\n */\ngoog.i18n.CompactNumberFormatSymbols_sah = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 тыһ.'\n    },\n    '10000': {\n      'other': '00 тыһ.'\n    },\n    '100000': {\n      'other': '000 тыһ.'\n    },\n    '1000000': {\n      'other': '0 мөл'\n    },\n    '10000000': {\n      'other': '00 мөл'\n    },\n    '100000000': {\n      'other': '000 мөл'\n    },\n    '1000000000': {\n      'other': '0 млрд'\n    },\n    '10000000000': {\n      'other': '00 млрд'\n    },\n    '100000000000': {\n      'other': '000 млрд'\n    },\n    '1000000000000': {\n      'other': '0 трлн'\n    },\n    '10000000000000': {\n      'other': '00 трлн'\n    },\n    '100000000000000': {\n      'other': '000 трлн'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 тыһыынча'\n    },\n    '10000': {\n      'other': '00 тыһыынча'\n    },\n    '100000': {\n      'other': '000 тыһыынча'\n    },\n    '1000000': {\n      'other': '0 мөлүйүөн'\n    },\n    '10000000': {\n      'other': '00 мөлүйүөн'\n    },\n    '100000000': {\n      'other': '000 мөлүйүөн'\n    },\n    '1000000000': {\n      'other': '0 миллиард'\n    },\n    '10000000000': {\n      'other': '00 миллиард'\n    },\n    '100000000000': {\n      'other': '000 миллиард'\n    },\n    '1000000000000': {\n      'other': '0 триллион'\n    },\n    '10000000000000': {\n      'other': '00 триллион'\n    },\n    '100000000000000': {\n      'other': '000 триллион'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sah_RU.\n */\ngoog.i18n.CompactNumberFormatSymbols_sah_RU = goog.i18n.CompactNumberFormatSymbols_sah;\n\n\n/**\n * Compact number formatting symbols for locale saq.\n */\ngoog.i18n.CompactNumberFormatSymbols_saq = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale saq_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_saq_KE = goog.i18n.CompactNumberFormatSymbols_saq;\n\n\n/**\n * Compact number formatting symbols for locale sbp.\n */\ngoog.i18n.CompactNumberFormatSymbols_sbp = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sbp_TZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_sbp_TZ = goog.i18n.CompactNumberFormatSymbols_sbp;\n\n\n/**\n * Compact number formatting symbols for locale sd.\n */\ngoog.i18n.CompactNumberFormatSymbols_sd = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 ھزار'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sd_PK.\n */\ngoog.i18n.CompactNumberFormatSymbols_sd_PK = goog.i18n.CompactNumberFormatSymbols_sd;\n\n\n/**\n * Compact number formatting symbols for locale se.\n */\ngoog.i18n.CompactNumberFormatSymbols_se = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 dt'\n    },\n    '10000': {\n      'other': '00 dt'\n    },\n    '100000': {\n      'other': '000 dt'\n    },\n    '1000000': {\n      'other': '0 mn'\n    },\n    '10000000': {\n      'other': '00 mn'\n    },\n    '100000000': {\n      'other': '000 mn'\n    },\n    '1000000000': {\n      'other': '0 md'\n    },\n    '10000000000': {\n      'other': '00 md'\n    },\n    '100000000000': {\n      'other': '000 md'\n    },\n    '1000000000000': {\n      'other': '0 bn'\n    },\n    '10000000000000': {\n      'other': '00 bn'\n    },\n    '100000000000000': {\n      'other': '000 bn'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 duháhat'\n    },\n    '10000': {\n      'other': '00 duháhat'\n    },\n    '100000': {\n      'other': '000 duháhat'\n    },\n    '1000000': {\n      'other': '0 miljonat'\n    },\n    '10000000': {\n      'other': '00 miljonat'\n    },\n    '100000000': {\n      'other': '000 miljonat'\n    },\n    '1000000000': {\n      'other': '0 miljardit'\n    },\n    '10000000000': {\n      'other': '00 miljardit'\n    },\n    '100000000000': {\n      'other': '000 miljardit'\n    },\n    '1000000000000': {\n      'other': '0 biljonat'\n    },\n    '10000000000000': {\n      'other': '00 biljonat'\n    },\n    '100000000000000': {\n      'other': '000 biljonat'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale se_FI.\n */\ngoog.i18n.CompactNumberFormatSymbols_se_FI = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 dt'\n    },\n    '10000': {\n      'other': '00 dt'\n    },\n    '100000': {\n      'other': '000 dt'\n    },\n    '1000000': {\n      'other': '0 mn'\n    },\n    '10000000': {\n      'other': '00 mn'\n    },\n    '100000000': {\n      'other': '000 mn'\n    },\n    '1000000000': {\n      'other': '0 md'\n    },\n    '10000000000': {\n      'other': '00 md'\n    },\n    '100000000000': {\n      'other': '000 md'\n    },\n    '1000000000000': {\n      'other': '0 bn'\n    },\n    '10000000000000': {\n      'other': '00 bn'\n    },\n    '100000000000000': {\n      'other': '000 bn'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale se_NO.\n */\ngoog.i18n.CompactNumberFormatSymbols_se_NO = goog.i18n.CompactNumberFormatSymbols_se;\n\n\n/**\n * Compact number formatting symbols for locale se_SE.\n */\ngoog.i18n.CompactNumberFormatSymbols_se_SE = goog.i18n.CompactNumberFormatSymbols_se;\n\n\n/**\n * Compact number formatting symbols for locale seh.\n */\ngoog.i18n.CompactNumberFormatSymbols_seh = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale seh_MZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_seh_MZ = goog.i18n.CompactNumberFormatSymbols_seh;\n\n\n/**\n * Compact number formatting symbols for locale ses.\n */\ngoog.i18n.CompactNumberFormatSymbols_ses = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ses_ML.\n */\ngoog.i18n.CompactNumberFormatSymbols_ses_ML = goog.i18n.CompactNumberFormatSymbols_ses;\n\n\n/**\n * Compact number formatting symbols for locale sg.\n */\ngoog.i18n.CompactNumberFormatSymbols_sg = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sg_CF.\n */\ngoog.i18n.CompactNumberFormatSymbols_sg_CF = goog.i18n.CompactNumberFormatSymbols_sg;\n\n\n/**\n * Compact number formatting symbols for locale shi.\n */\ngoog.i18n.CompactNumberFormatSymbols_shi = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale shi_Latn.\n */\ngoog.i18n.CompactNumberFormatSymbols_shi_Latn = goog.i18n.CompactNumberFormatSymbols_shi;\n\n\n/**\n * Compact number formatting symbols for locale shi_Latn_MA.\n */\ngoog.i18n.CompactNumberFormatSymbols_shi_Latn_MA = goog.i18n.CompactNumberFormatSymbols_shi;\n\n\n/**\n * Compact number formatting symbols for locale shi_Tfng.\n */\ngoog.i18n.CompactNumberFormatSymbols_shi_Tfng = goog.i18n.CompactNumberFormatSymbols_shi;\n\n\n/**\n * Compact number formatting symbols for locale shi_Tfng_MA.\n */\ngoog.i18n.CompactNumberFormatSymbols_shi_Tfng_MA = goog.i18n.CompactNumberFormatSymbols_shi;\n\n\n/**\n * Compact number formatting symbols for locale si_LK.\n */\ngoog.i18n.CompactNumberFormatSymbols_si_LK = goog.i18n.CompactNumberFormatSymbols_si;\n\n\n/**\n * Compact number formatting symbols for locale sk_SK.\n */\ngoog.i18n.CompactNumberFormatSymbols_sk_SK = goog.i18n.CompactNumberFormatSymbols_sk;\n\n\n/**\n * Compact number formatting symbols for locale sl_SI.\n */\ngoog.i18n.CompactNumberFormatSymbols_sl_SI = goog.i18n.CompactNumberFormatSymbols_sl;\n\n\n/**\n * Compact number formatting symbols for locale smn.\n */\ngoog.i18n.CompactNumberFormatSymbols_smn = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 tuhháát'\n    },\n    '10000': {\n      'other': '00 tuhháát'\n    },\n    '100000': {\n      'other': '000 tuhháát'\n    },\n    '1000000': {\n      'other': '0 miljovn'\n    },\n    '10000000': {\n      'other': '00 miljovn'\n    },\n    '100000000': {\n      'other': '000 miljovn'\n    },\n    '1000000000': {\n      'other': '0 miljard'\n    },\n    '10000000000': {\n      'other': '00 miljard'\n    },\n    '100000000000': {\n      'other': '000 miljard'\n    },\n    '1000000000000': {\n      'other': '0 biljovn'\n    },\n    '10000000000000': {\n      'other': '00 biljovn'\n    },\n    '100000000000000': {\n      'other': '000 biljovn'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale smn_FI.\n */\ngoog.i18n.CompactNumberFormatSymbols_smn_FI = goog.i18n.CompactNumberFormatSymbols_smn;\n\n\n/**\n * Compact number formatting symbols for locale sn.\n */\ngoog.i18n.CompactNumberFormatSymbols_sn = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sn_ZW.\n */\ngoog.i18n.CompactNumberFormatSymbols_sn_ZW = goog.i18n.CompactNumberFormatSymbols_sn;\n\n\n/**\n * Compact number formatting symbols for locale so.\n */\ngoog.i18n.CompactNumberFormatSymbols_so = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 Kun'\n    },\n    '10000': {\n      'other': '00 Kun'\n    },\n    '100000': {\n      'other': '000 Kun'\n    },\n    '1000000': {\n      'other': '0 Milyan'\n    },\n    '10000000': {\n      'other': '00 Milyan'\n    },\n    '100000000': {\n      'other': '000 Milyan'\n    },\n    '1000000000': {\n      'other': '0 Bilyan'\n    },\n    '10000000000': {\n      'other': '00 Bilyan'\n    },\n    '100000000000': {\n      'other': '000 Bilyan'\n    },\n    '1000000000000': {\n      'other': '0 Tirilyan'\n    },\n    '10000000000000': {\n      'other': '00 Tirilyan'\n    },\n    '100000000000000': {\n      'other': '000 Tirilyan'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale so_DJ.\n */\ngoog.i18n.CompactNumberFormatSymbols_so_DJ = goog.i18n.CompactNumberFormatSymbols_so;\n\n\n/**\n * Compact number formatting symbols for locale so_ET.\n */\ngoog.i18n.CompactNumberFormatSymbols_so_ET = goog.i18n.CompactNumberFormatSymbols_so;\n\n\n/**\n * Compact number formatting symbols for locale so_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_so_KE = goog.i18n.CompactNumberFormatSymbols_so;\n\n\n/**\n * Compact number formatting symbols for locale so_SO.\n */\ngoog.i18n.CompactNumberFormatSymbols_so_SO = goog.i18n.CompactNumberFormatSymbols_so;\n\n\n/**\n * Compact number formatting symbols for locale sq_AL.\n */\ngoog.i18n.CompactNumberFormatSymbols_sq_AL = goog.i18n.CompactNumberFormatSymbols_sq;\n\n\n/**\n * Compact number formatting symbols for locale sq_MK.\n */\ngoog.i18n.CompactNumberFormatSymbols_sq_MK = goog.i18n.CompactNumberFormatSymbols_sq;\n\n\n/**\n * Compact number formatting symbols for locale sq_XK.\n */\ngoog.i18n.CompactNumberFormatSymbols_sq_XK = goog.i18n.CompactNumberFormatSymbols_sq;\n\n\n/**\n * Compact number formatting symbols for locale sr_Cyrl.\n */\ngoog.i18n.CompactNumberFormatSymbols_sr_Cyrl = goog.i18n.CompactNumberFormatSymbols_sr;\n\n\n/**\n * Compact number formatting symbols for locale sr_Cyrl_BA.\n */\ngoog.i18n.CompactNumberFormatSymbols_sr_Cyrl_BA = goog.i18n.CompactNumberFormatSymbols_sr;\n\n\n/**\n * Compact number formatting symbols for locale sr_Cyrl_ME.\n */\ngoog.i18n.CompactNumberFormatSymbols_sr_Cyrl_ME = goog.i18n.CompactNumberFormatSymbols_sr;\n\n\n/**\n * Compact number formatting symbols for locale sr_Cyrl_RS.\n */\ngoog.i18n.CompactNumberFormatSymbols_sr_Cyrl_RS = goog.i18n.CompactNumberFormatSymbols_sr;\n\n\n/**\n * Compact number formatting symbols for locale sr_Cyrl_XK.\n */\ngoog.i18n.CompactNumberFormatSymbols_sr_Cyrl_XK = goog.i18n.CompactNumberFormatSymbols_sr;\n\n\n/**\n * Compact number formatting symbols for locale sr_Latn_BA.\n */\ngoog.i18n.CompactNumberFormatSymbols_sr_Latn_BA = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 hilj.'\n    },\n    '10000': {\n      'other': '00 hilj.'\n    },\n    '100000': {\n      'other': '000 hilj.'\n    },\n    '1000000': {\n      'other': '0 mil.'\n    },\n    '10000000': {\n      'other': '00 mil.'\n    },\n    '100000000': {\n      'other': '000 mil.'\n    },\n    '1000000000': {\n      'other': '0 mlrd.'\n    },\n    '10000000000': {\n      'other': '00 mlrd.'\n    },\n    '100000000000': {\n      'other': '000 mlrd.'\n    },\n    '1000000000000': {\n      'other': '0 bil.'\n    },\n    '10000000000000': {\n      'other': '00 bil.'\n    },\n    '100000000000000': {\n      'other': '000 bil.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 hiljada'\n    },\n    '10000': {\n      'other': '00 hiljada'\n    },\n    '100000': {\n      'other': '000 hiljada'\n    },\n    '1000000': {\n      'other': '0 miliona'\n    },\n    '10000000': {\n      'other': '00 miliona'\n    },\n    '100000000': {\n      'other': '000 miliona'\n    },\n    '1000000000': {\n      'other': '0 milijardi'\n    },\n    '10000000000': {\n      'other': '00 milijardi'\n    },\n    '100000000000': {\n      'other': '000 milijardi'\n    },\n    '1000000000000': {\n      'other': '0 biliona'\n    },\n    '10000000000000': {\n      'other': '00 biliona'\n    },\n    '100000000000000': {\n      'other': '000 biliona'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sr_Latn_ME.\n */\ngoog.i18n.CompactNumberFormatSymbols_sr_Latn_ME = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 hilj.'\n    },\n    '10000': {\n      'other': '00 hilj.'\n    },\n    '100000': {\n      'other': '000 hilj.'\n    },\n    '1000000': {\n      'other': '0 mil.'\n    },\n    '10000000': {\n      'other': '00 mil.'\n    },\n    '100000000': {\n      'other': '000 mil.'\n    },\n    '1000000000': {\n      'other': '0 mlrd.'\n    },\n    '10000000000': {\n      'other': '00 mlrd.'\n    },\n    '100000000000': {\n      'other': '000 mlrd.'\n    },\n    '1000000000000': {\n      'other': '0 bil.'\n    },\n    '10000000000000': {\n      'other': '00 bil.'\n    },\n    '100000000000000': {\n      'other': '000 bil.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 hiljada'\n    },\n    '10000': {\n      'other': '00 hiljada'\n    },\n    '100000': {\n      'other': '000 hiljada'\n    },\n    '1000000': {\n      'other': '0 miliona'\n    },\n    '10000000': {\n      'other': '00 miliona'\n    },\n    '100000000': {\n      'other': '000 miliona'\n    },\n    '1000000000': {\n      'other': '0 milijardi'\n    },\n    '10000000000': {\n      'other': '00 milijardi'\n    },\n    '100000000000': {\n      'other': '000 milijardi'\n    },\n    '1000000000000': {\n      'other': '0 biliona'\n    },\n    '10000000000000': {\n      'other': '00 biliona'\n    },\n    '100000000000000': {\n      'other': '000 biliona'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sr_Latn_RS.\n */\ngoog.i18n.CompactNumberFormatSymbols_sr_Latn_RS = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 hilj.'\n    },\n    '10000': {\n      'other': '00 hilj.'\n    },\n    '100000': {\n      'other': '000 hilj.'\n    },\n    '1000000': {\n      'other': '0 mil.'\n    },\n    '10000000': {\n      'other': '00 mil.'\n    },\n    '100000000': {\n      'other': '000 mil.'\n    },\n    '1000000000': {\n      'other': '0 mlrd.'\n    },\n    '10000000000': {\n      'other': '00 mlrd.'\n    },\n    '100000000000': {\n      'other': '000 mlrd.'\n    },\n    '1000000000000': {\n      'other': '0 bil.'\n    },\n    '10000000000000': {\n      'other': '00 bil.'\n    },\n    '100000000000000': {\n      'other': '000 bil.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 hiljada'\n    },\n    '10000': {\n      'other': '00 hiljada'\n    },\n    '100000': {\n      'other': '000 hiljada'\n    },\n    '1000000': {\n      'other': '0 miliona'\n    },\n    '10000000': {\n      'other': '00 miliona'\n    },\n    '100000000': {\n      'other': '000 miliona'\n    },\n    '1000000000': {\n      'other': '0 milijardi'\n    },\n    '10000000000': {\n      'other': '00 milijardi'\n    },\n    '100000000000': {\n      'other': '000 milijardi'\n    },\n    '1000000000000': {\n      'other': '0 biliona'\n    },\n    '10000000000000': {\n      'other': '00 biliona'\n    },\n    '100000000000000': {\n      'other': '000 biliona'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sr_Latn_XK.\n */\ngoog.i18n.CompactNumberFormatSymbols_sr_Latn_XK = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 hilj.'\n    },\n    '10000': {\n      'other': '00 hilj.'\n    },\n    '100000': {\n      'other': '000 hilj.'\n    },\n    '1000000': {\n      'other': '0 mil.'\n    },\n    '10000000': {\n      'other': '00 mil.'\n    },\n    '100000000': {\n      'other': '000 mil.'\n    },\n    '1000000000': {\n      'other': '0 mlrd.'\n    },\n    '10000000000': {\n      'other': '00 mlrd.'\n    },\n    '100000000000': {\n      'other': '000 mlrd.'\n    },\n    '1000000000000': {\n      'other': '0 bil.'\n    },\n    '10000000000000': {\n      'other': '00 bil.'\n    },\n    '100000000000000': {\n      'other': '000 bil.'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 hiljada'\n    },\n    '10000': {\n      'other': '00 hiljada'\n    },\n    '100000': {\n      'other': '000 hiljada'\n    },\n    '1000000': {\n      'other': '0 miliona'\n    },\n    '10000000': {\n      'other': '00 miliona'\n    },\n    '100000000': {\n      'other': '000 miliona'\n    },\n    '1000000000': {\n      'other': '0 milijardi'\n    },\n    '10000000000': {\n      'other': '00 milijardi'\n    },\n    '100000000000': {\n      'other': '000 milijardi'\n    },\n    '1000000000000': {\n      'other': '0 biliona'\n    },\n    '10000000000000': {\n      'other': '00 biliona'\n    },\n    '100000000000000': {\n      'other': '000 biliona'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale sv_AX.\n */\ngoog.i18n.CompactNumberFormatSymbols_sv_AX = goog.i18n.CompactNumberFormatSymbols_sv;\n\n\n/**\n * Compact number formatting symbols for locale sv_FI.\n */\ngoog.i18n.CompactNumberFormatSymbols_sv_FI = goog.i18n.CompactNumberFormatSymbols_sv;\n\n\n/**\n * Compact number formatting symbols for locale sv_SE.\n */\ngoog.i18n.CompactNumberFormatSymbols_sv_SE = goog.i18n.CompactNumberFormatSymbols_sv;\n\n\n/**\n * Compact number formatting symbols for locale sw_CD.\n */\ngoog.i18n.CompactNumberFormatSymbols_sw_CD = goog.i18n.CompactNumberFormatSymbols_sw;\n\n\n/**\n * Compact number formatting symbols for locale sw_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_sw_KE = goog.i18n.CompactNumberFormatSymbols_sw;\n\n\n/**\n * Compact number formatting symbols for locale sw_TZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_sw_TZ = goog.i18n.CompactNumberFormatSymbols_sw;\n\n\n/**\n * Compact number formatting symbols for locale sw_UG.\n */\ngoog.i18n.CompactNumberFormatSymbols_sw_UG = goog.i18n.CompactNumberFormatSymbols_sw;\n\n\n/**\n * Compact number formatting symbols for locale ta_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_ta_IN = goog.i18n.CompactNumberFormatSymbols_ta;\n\n\n/**\n * Compact number formatting symbols for locale ta_LK.\n */\ngoog.i18n.CompactNumberFormatSymbols_ta_LK = goog.i18n.CompactNumberFormatSymbols_ta;\n\n\n/**\n * Compact number formatting symbols for locale ta_MY.\n */\ngoog.i18n.CompactNumberFormatSymbols_ta_MY = goog.i18n.CompactNumberFormatSymbols_ta;\n\n\n/**\n * Compact number formatting symbols for locale ta_SG.\n */\ngoog.i18n.CompactNumberFormatSymbols_ta_SG = goog.i18n.CompactNumberFormatSymbols_ta;\n\n\n/**\n * Compact number formatting symbols for locale te_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_te_IN = goog.i18n.CompactNumberFormatSymbols_te;\n\n\n/**\n * Compact number formatting symbols for locale teo.\n */\ngoog.i18n.CompactNumberFormatSymbols_teo = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale teo_KE.\n */\ngoog.i18n.CompactNumberFormatSymbols_teo_KE = goog.i18n.CompactNumberFormatSymbols_teo;\n\n\n/**\n * Compact number formatting symbols for locale teo_UG.\n */\ngoog.i18n.CompactNumberFormatSymbols_teo_UG = goog.i18n.CompactNumberFormatSymbols_teo;\n\n\n/**\n * Compact number formatting symbols for locale tg.\n */\ngoog.i18n.CompactNumberFormatSymbols_tg = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale tg_TJ.\n */\ngoog.i18n.CompactNumberFormatSymbols_tg_TJ = goog.i18n.CompactNumberFormatSymbols_tg;\n\n\n/**\n * Compact number formatting symbols for locale th_TH.\n */\ngoog.i18n.CompactNumberFormatSymbols_th_TH = goog.i18n.CompactNumberFormatSymbols_th;\n\n\n/**\n * Compact number formatting symbols for locale ti.\n */\ngoog.i18n.CompactNumberFormatSymbols_ti = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ti_ER.\n */\ngoog.i18n.CompactNumberFormatSymbols_ti_ER = goog.i18n.CompactNumberFormatSymbols_ti;\n\n\n/**\n * Compact number formatting symbols for locale ti_ET.\n */\ngoog.i18n.CompactNumberFormatSymbols_ti_ET = goog.i18n.CompactNumberFormatSymbols_ti;\n\n\n/**\n * Compact number formatting symbols for locale tk.\n */\ngoog.i18n.CompactNumberFormatSymbols_tk = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0 müň'\n    },\n    '10000': {\n      'other': '00 müň'\n    },\n    '100000': {\n      'other': '000 müň'\n    },\n    '1000000': {\n      'other': '0 mln'\n    },\n    '10000000': {\n      'other': '00 mln'\n    },\n    '100000000': {\n      'other': '000 mln'\n    },\n    '1000000000': {\n      'other': '0 mlrd'\n    },\n    '10000000000': {\n      'other': '00 mlrd'\n    },\n    '100000000000': {\n      'other': '000 mlrd'\n    },\n    '1000000000000': {\n      'other': '0 trln'\n    },\n    '10000000000000': {\n      'other': '00 trln'\n    },\n    '100000000000000': {\n      'other': '000 trln'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 müň'\n    },\n    '10000': {\n      'other': '00 müň'\n    },\n    '100000': {\n      'other': '000 müň'\n    },\n    '1000000': {\n      'other': '0 million'\n    },\n    '10000000': {\n      'other': '00 million'\n    },\n    '100000000': {\n      'other': '000 million'\n    },\n    '1000000000': {\n      'other': '0 milliard'\n    },\n    '10000000000': {\n      'other': '00 milliard'\n    },\n    '100000000000': {\n      'other': '000 milliard'\n    },\n    '1000000000000': {\n      'other': '0 trillion'\n    },\n    '10000000000000': {\n      'other': '00 trillion'\n    },\n    '100000000000000': {\n      'other': '000 trillion'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale tk_TM.\n */\ngoog.i18n.CompactNumberFormatSymbols_tk_TM = goog.i18n.CompactNumberFormatSymbols_tk;\n\n\n/**\n * Compact number formatting symbols for locale to.\n */\ngoog.i18n.CompactNumberFormatSymbols_to = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0a'\n    },\n    '10000': {\n      'other': '0m'\n    },\n    '100000': {\n      'other': '0k'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0P'\n    },\n    '10000000000': {\n      'other': '00P'\n    },\n    '100000000000': {\n      'other': '000P'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 afe'\n    },\n    '10000': {\n      'other': '0 mano'\n    },\n    '100000': {\n      'other': '0 kilu'\n    },\n    '1000000': {\n      'other': '0 miliona'\n    },\n    '10000000': {\n      'other': '00 miliona'\n    },\n    '100000000': {\n      'other': '000 miliona'\n    },\n    '1000000000': {\n      'other': '0 piliona'\n    },\n    '10000000000': {\n      'other': '00 piliona'\n    },\n    '100000000000': {\n      'other': '000 piliona'\n    },\n    '1000000000000': {\n      'other': '0 tiliona'\n    },\n    '10000000000000': {\n      'other': '00 tiliona'\n    },\n    '100000000000000': {\n      'other': '000 tiliona'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale to_TO.\n */\ngoog.i18n.CompactNumberFormatSymbols_to_TO = goog.i18n.CompactNumberFormatSymbols_to;\n\n\n/**\n * Compact number formatting symbols for locale tr_CY.\n */\ngoog.i18n.CompactNumberFormatSymbols_tr_CY = goog.i18n.CompactNumberFormatSymbols_tr;\n\n\n/**\n * Compact number formatting symbols for locale tr_TR.\n */\ngoog.i18n.CompactNumberFormatSymbols_tr_TR = goog.i18n.CompactNumberFormatSymbols_tr;\n\n\n/**\n * Compact number formatting symbols for locale tt.\n */\ngoog.i18n.CompactNumberFormatSymbols_tt = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale tt_RU.\n */\ngoog.i18n.CompactNumberFormatSymbols_tt_RU = goog.i18n.CompactNumberFormatSymbols_tt;\n\n\n/**\n * Compact number formatting symbols for locale twq.\n */\ngoog.i18n.CompactNumberFormatSymbols_twq = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale twq_NE.\n */\ngoog.i18n.CompactNumberFormatSymbols_twq_NE = goog.i18n.CompactNumberFormatSymbols_twq;\n\n\n/**\n * Compact number formatting symbols for locale tzm.\n */\ngoog.i18n.CompactNumberFormatSymbols_tzm = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale tzm_MA.\n */\ngoog.i18n.CompactNumberFormatSymbols_tzm_MA = goog.i18n.CompactNumberFormatSymbols_tzm;\n\n\n/**\n * Compact number formatting symbols for locale ug.\n */\ngoog.i18n.CompactNumberFormatSymbols_ug = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0مىڭ'\n    },\n    '10000': {\n      'other': '00مىڭ'\n    },\n    '100000': {\n      'other': '000مىڭ'\n    },\n    '1000000': {\n      'other': '0مىليون'\n    },\n    '10000000': {\n      'other': '00مىليون'\n    },\n    '100000000': {\n      'other': '000مىليون'\n    },\n    '1000000000': {\n      'other': '0مىليارد'\n    },\n    '10000000000': {\n      'other': '00مىليارد'\n    },\n    '100000000000': {\n      'other': '000مىليارد'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 مىڭ'\n    },\n    '10000': {\n      'other': '00 مىڭ'\n    },\n    '100000': {\n      'other': '000 مىڭ'\n    },\n    '1000000': {\n      'other': '0 مىليون'\n    },\n    '10000000': {\n      'other': '00 مىليون'\n    },\n    '100000000': {\n      'other': '000 مىليون'\n    },\n    '1000000000': {\n      'other': '0 مىليارد'\n    },\n    '10000000000': {\n      'other': '00 مىليارد'\n    },\n    '100000000000': {\n      'other': '000 مىليارد'\n    },\n    '1000000000000': {\n      'other': '0 تىرىليون'\n    },\n    '10000000000000': {\n      'other': '00 تىرىليون'\n    },\n    '100000000000000': {\n      'other': '000 تىرىليون'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale ug_CN.\n */\ngoog.i18n.CompactNumberFormatSymbols_ug_CN = goog.i18n.CompactNumberFormatSymbols_ug;\n\n\n/**\n * Compact number formatting symbols for locale uk_UA.\n */\ngoog.i18n.CompactNumberFormatSymbols_uk_UA = goog.i18n.CompactNumberFormatSymbols_uk;\n\n\n/**\n * Compact number formatting symbols for locale ur_IN.\n */\ngoog.i18n.CompactNumberFormatSymbols_ur_IN = goog.i18n.CompactNumberFormatSymbols_ur;\n\n\n/**\n * Compact number formatting symbols for locale ur_PK.\n */\ngoog.i18n.CompactNumberFormatSymbols_ur_PK = goog.i18n.CompactNumberFormatSymbols_ur;\n\n\n/**\n * Compact number formatting symbols for locale uz_Arab.\n */\ngoog.i18n.CompactNumberFormatSymbols_uz_Arab = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale uz_Arab_AF.\n */\ngoog.i18n.CompactNumberFormatSymbols_uz_Arab_AF = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale uz_Cyrl.\n */\ngoog.i18n.CompactNumberFormatSymbols_uz_Cyrl = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0минг'\n    },\n    '10000': {\n      'other': '00минг'\n    },\n    '100000': {\n      'other': '000минг'\n    },\n    '1000000': {\n      'other': '0млн'\n    },\n    '10000000': {\n      'other': '00млн'\n    },\n    '100000000': {\n      'other': '000млн'\n    },\n    '1000000000': {\n      'other': '0млрд'\n    },\n    '10000000000': {\n      'other': '00млрд'\n    },\n    '100000000000': {\n      'other': '000млрд'\n    },\n    '1000000000000': {\n      'other': '0трлн'\n    },\n    '10000000000000': {\n      'other': '00трлн'\n    },\n    '100000000000000': {\n      'other': '000трлн'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 минг'\n    },\n    '10000': {\n      'other': '00 минг'\n    },\n    '100000': {\n      'other': '000 минг'\n    },\n    '1000000': {\n      'other': '0 миллион'\n    },\n    '10000000': {\n      'other': '00 миллион'\n    },\n    '100000000': {\n      'other': '000 миллион'\n    },\n    '1000000000': {\n      'other': '0 миллиард'\n    },\n    '10000000000': {\n      'other': '00 миллиард'\n    },\n    '100000000000': {\n      'other': '000 миллиард'\n    },\n    '1000000000000': {\n      'other': '0 трилион'\n    },\n    '10000000000000': {\n      'other': '00 трилион'\n    },\n    '100000000000000': {\n      'other': '000 трилион'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale uz_Cyrl_UZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_uz_Cyrl_UZ = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0минг'\n    },\n    '10000': {\n      'other': '00минг'\n    },\n    '100000': {\n      'other': '000минг'\n    },\n    '1000000': {\n      'other': '0млн'\n    },\n    '10000000': {\n      'other': '00млн'\n    },\n    '100000000': {\n      'other': '000млн'\n    },\n    '1000000000': {\n      'other': '0млрд'\n    },\n    '10000000000': {\n      'other': '00млрд'\n    },\n    '100000000000': {\n      'other': '000млрд'\n    },\n    '1000000000000': {\n      'other': '0трлн'\n    },\n    '10000000000000': {\n      'other': '00трлн'\n    },\n    '100000000000000': {\n      'other': '000трлн'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0 минг'\n    },\n    '10000': {\n      'other': '00 минг'\n    },\n    '100000': {\n      'other': '000 минг'\n    },\n    '1000000': {\n      'other': '0 миллион'\n    },\n    '10000000': {\n      'other': '00 миллион'\n    },\n    '100000000': {\n      'other': '000 миллион'\n    },\n    '1000000000': {\n      'other': '0 миллиард'\n    },\n    '10000000000': {\n      'other': '00 миллиард'\n    },\n    '100000000000': {\n      'other': '000 миллиард'\n    },\n    '1000000000000': {\n      'other': '0 трилион'\n    },\n    '10000000000000': {\n      'other': '00 трилион'\n    },\n    '100000000000000': {\n      'other': '000 трилион'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale uz_Latn.\n */\ngoog.i18n.CompactNumberFormatSymbols_uz_Latn = goog.i18n.CompactNumberFormatSymbols_uz;\n\n\n/**\n * Compact number formatting symbols for locale uz_Latn_UZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_uz_Latn_UZ = goog.i18n.CompactNumberFormatSymbols_uz;\n\n\n/**\n * Compact number formatting symbols for locale vai.\n */\ngoog.i18n.CompactNumberFormatSymbols_vai = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale vai_Latn.\n */\ngoog.i18n.CompactNumberFormatSymbols_vai_Latn = goog.i18n.CompactNumberFormatSymbols_vai;\n\n\n/**\n * Compact number formatting symbols for locale vai_Latn_LR.\n */\ngoog.i18n.CompactNumberFormatSymbols_vai_Latn_LR = goog.i18n.CompactNumberFormatSymbols_vai;\n\n\n/**\n * Compact number formatting symbols for locale vai_Vaii.\n */\ngoog.i18n.CompactNumberFormatSymbols_vai_Vaii = goog.i18n.CompactNumberFormatSymbols_vai;\n\n\n/**\n * Compact number formatting symbols for locale vai_Vaii_LR.\n */\ngoog.i18n.CompactNumberFormatSymbols_vai_Vaii_LR = goog.i18n.CompactNumberFormatSymbols_vai;\n\n\n/**\n * Compact number formatting symbols for locale vi_VN.\n */\ngoog.i18n.CompactNumberFormatSymbols_vi_VN = goog.i18n.CompactNumberFormatSymbols_vi;\n\n\n/**\n * Compact number formatting symbols for locale vun.\n */\ngoog.i18n.CompactNumberFormatSymbols_vun = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale vun_TZ.\n */\ngoog.i18n.CompactNumberFormatSymbols_vun_TZ = goog.i18n.CompactNumberFormatSymbols_vun;\n\n\n/**\n * Compact number formatting symbols for locale wae.\n */\ngoog.i18n.CompactNumberFormatSymbols_wae = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale wae_CH.\n */\ngoog.i18n.CompactNumberFormatSymbols_wae_CH = goog.i18n.CompactNumberFormatSymbols_wae;\n\n\n/**\n * Compact number formatting symbols for locale wo.\n */\ngoog.i18n.CompactNumberFormatSymbols_wo = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale wo_SN.\n */\ngoog.i18n.CompactNumberFormatSymbols_wo_SN = goog.i18n.CompactNumberFormatSymbols_wo;\n\n\n/**\n * Compact number formatting symbols for locale xh.\n */\ngoog.i18n.CompactNumberFormatSymbols_xh = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale xh_ZA.\n */\ngoog.i18n.CompactNumberFormatSymbols_xh_ZA = goog.i18n.CompactNumberFormatSymbols_xh;\n\n\n/**\n * Compact number formatting symbols for locale xog.\n */\ngoog.i18n.CompactNumberFormatSymbols_xog = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale xog_UG.\n */\ngoog.i18n.CompactNumberFormatSymbols_xog_UG = goog.i18n.CompactNumberFormatSymbols_xog;\n\n\n/**\n * Compact number formatting symbols for locale yav.\n */\ngoog.i18n.CompactNumberFormatSymbols_yav = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale yav_CM.\n */\ngoog.i18n.CompactNumberFormatSymbols_yav_CM = goog.i18n.CompactNumberFormatSymbols_yav;\n\n\n/**\n * Compact number formatting symbols for locale yi.\n */\ngoog.i18n.CompactNumberFormatSymbols_yi = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale yi_001.\n */\ngoog.i18n.CompactNumberFormatSymbols_yi_001 = goog.i18n.CompactNumberFormatSymbols_yi;\n\n\n/**\n * Compact number formatting symbols for locale yo.\n */\ngoog.i18n.CompactNumberFormatSymbols_yo = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale yo_BJ.\n */\ngoog.i18n.CompactNumberFormatSymbols_yo_BJ = goog.i18n.CompactNumberFormatSymbols_yo;\n\n\n/**\n * Compact number formatting symbols for locale yo_NG.\n */\ngoog.i18n.CompactNumberFormatSymbols_yo_NG = goog.i18n.CompactNumberFormatSymbols_yo;\n\n\n/**\n * Compact number formatting symbols for locale yue.\n */\ngoog.i18n.CompactNumberFormatSymbols_yue = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0萬'\n    },\n    '100000': {\n      'other': '00萬'\n    },\n    '1000000': {\n      'other': '000萬'\n    },\n    '10000000': {\n      'other': '0000萬'\n    },\n    '100000000': {\n      'other': '0億'\n    },\n    '1000000000': {\n      'other': '00億'\n    },\n    '10000000000': {\n      'other': '000億'\n    },\n    '100000000000': {\n      'other': '0000億'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0萬'\n    },\n    '100000': {\n      'other': '00萬'\n    },\n    '1000000': {\n      'other': '000萬'\n    },\n    '10000000': {\n      'other': '0000萬'\n    },\n    '100000000': {\n      'other': '0億'\n    },\n    '1000000000': {\n      'other': '00億'\n    },\n    '10000000000': {\n      'other': '000億'\n    },\n    '100000000000': {\n      'other': '0000億'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale yue_Hans.\n */\ngoog.i18n.CompactNumberFormatSymbols_yue_Hans = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0万'\n    },\n    '100000': {\n      'other': '00万'\n    },\n    '1000000': {\n      'other': '000万'\n    },\n    '10000000': {\n      'other': '0000万'\n    },\n    '100000000': {\n      'other': '0亿'\n    },\n    '1000000000': {\n      'other': '00亿'\n    },\n    '10000000000': {\n      'other': '000亿'\n    },\n    '100000000000': {\n      'other': '0000亿'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0万'\n    },\n    '100000': {\n      'other': '00万'\n    },\n    '1000000': {\n      'other': '000万'\n    },\n    '10000000': {\n      'other': '0000万'\n    },\n    '100000000': {\n      'other': '0亿'\n    },\n    '1000000000': {\n      'other': '00亿'\n    },\n    '10000000000': {\n      'other': '000亿'\n    },\n    '100000000000': {\n      'other': '0000亿'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale yue_Hans_CN.\n */\ngoog.i18n.CompactNumberFormatSymbols_yue_Hans_CN = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0万'\n    },\n    '100000': {\n      'other': '00万'\n    },\n    '1000000': {\n      'other': '000万'\n    },\n    '10000000': {\n      'other': '0000万'\n    },\n    '100000000': {\n      'other': '0亿'\n    },\n    '1000000000': {\n      'other': '00亿'\n    },\n    '10000000000': {\n      'other': '000亿'\n    },\n    '100000000000': {\n      'other': '0000亿'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0万'\n    },\n    '100000': {\n      'other': '00万'\n    },\n    '1000000': {\n      'other': '000万'\n    },\n    '10000000': {\n      'other': '0000万'\n    },\n    '100000000': {\n      'other': '0亿'\n    },\n    '1000000000': {\n      'other': '00亿'\n    },\n    '10000000000': {\n      'other': '000亿'\n    },\n    '100000000000': {\n      'other': '0000亿'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale yue_Hant.\n */\ngoog.i18n.CompactNumberFormatSymbols_yue_Hant = goog.i18n.CompactNumberFormatSymbols_yue;\n\n\n/**\n * Compact number formatting symbols for locale yue_Hant_HK.\n */\ngoog.i18n.CompactNumberFormatSymbols_yue_Hant_HK = goog.i18n.CompactNumberFormatSymbols_yue;\n\n\n/**\n * Compact number formatting symbols for locale zgh.\n */\ngoog.i18n.CompactNumberFormatSymbols_zgh = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0G'\n    },\n    '10000000000': {\n      'other': '00G'\n    },\n    '100000000000': {\n      'other': '000G'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale zgh_MA.\n */\ngoog.i18n.CompactNumberFormatSymbols_zgh_MA = goog.i18n.CompactNumberFormatSymbols_zgh;\n\n\n/**\n * Compact number formatting symbols for locale zh_Hans.\n */\ngoog.i18n.CompactNumberFormatSymbols_zh_Hans = goog.i18n.CompactNumberFormatSymbols_zh;\n\n\n/**\n * Compact number formatting symbols for locale zh_Hans_CN.\n */\ngoog.i18n.CompactNumberFormatSymbols_zh_Hans_CN = goog.i18n.CompactNumberFormatSymbols_zh;\n\n\n/**\n * Compact number formatting symbols for locale zh_Hans_HK.\n */\ngoog.i18n.CompactNumberFormatSymbols_zh_Hans_HK = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000000000000': {\n      'other': '0万亿'\n    },\n    '10000000000000': {\n      'other': '00万亿'\n    },\n    '100000000000000': {\n      'other': '000万亿'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000000000000': {\n      'other': '0万亿'\n    },\n    '10000000000000': {\n      'other': '00万亿'\n    },\n    '100000000000000': {\n      'other': '000万亿'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale zh_Hans_MO.\n */\ngoog.i18n.CompactNumberFormatSymbols_zh_Hans_MO = goog.i18n.CompactNumberFormatSymbols_zh;\n\n\n/**\n * Compact number formatting symbols for locale zh_Hans_SG.\n */\ngoog.i18n.CompactNumberFormatSymbols_zh_Hans_SG = goog.i18n.CompactNumberFormatSymbols_zh;\n\n\n/**\n * Compact number formatting symbols for locale zh_Hant.\n */\ngoog.i18n.CompactNumberFormatSymbols_zh_Hant = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0萬'\n    },\n    '100000': {\n      'other': '00萬'\n    },\n    '1000000': {\n      'other': '000萬'\n    },\n    '10000000': {\n      'other': '0000萬'\n    },\n    '100000000': {\n      'other': '0億'\n    },\n    '1000000000': {\n      'other': '00億'\n    },\n    '10000000000': {\n      'other': '000億'\n    },\n    '100000000000': {\n      'other': '0000億'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0萬'\n    },\n    '100000': {\n      'other': '00萬'\n    },\n    '1000000': {\n      'other': '000萬'\n    },\n    '10000000': {\n      'other': '0000萬'\n    },\n    '100000000': {\n      'other': '0億'\n    },\n    '1000000000': {\n      'other': '00億'\n    },\n    '10000000000': {\n      'other': '000億'\n    },\n    '100000000000': {\n      'other': '0000億'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale zh_Hant_HK.\n */\ngoog.i18n.CompactNumberFormatSymbols_zh_Hant_HK = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0萬'\n    },\n    '100000': {\n      'other': '00萬'\n    },\n    '1000000': {\n      'other': '000萬'\n    },\n    '10000000': {\n      'other': '0000萬'\n    },\n    '100000000': {\n      'other': '0億'\n    },\n    '1000000000': {\n      'other': '00億'\n    },\n    '10000000000': {\n      'other': '000億'\n    },\n    '100000000000': {\n      'other': '0000億'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale zh_Hant_MO.\n */\ngoog.i18n.CompactNumberFormatSymbols_zh_Hant_MO = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0K'\n    },\n    '10000': {\n      'other': '00K'\n    },\n    '100000': {\n      'other': '000K'\n    },\n    '1000000': {\n      'other': '0M'\n    },\n    '10000000': {\n      'other': '00M'\n    },\n    '100000000': {\n      'other': '000M'\n    },\n    '1000000000': {\n      'other': '0B'\n    },\n    '10000000000': {\n      'other': '00B'\n    },\n    '100000000000': {\n      'other': '000B'\n    },\n    '1000000000000': {\n      'other': '0T'\n    },\n    '10000000000000': {\n      'other': '00T'\n    },\n    '100000000000000': {\n      'other': '000T'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0萬'\n    },\n    '100000': {\n      'other': '00萬'\n    },\n    '1000000': {\n      'other': '000萬'\n    },\n    '10000000': {\n      'other': '0000萬'\n    },\n    '100000000': {\n      'other': '0億'\n    },\n    '1000000000': {\n      'other': '00億'\n    },\n    '10000000000': {\n      'other': '000億'\n    },\n    '100000000000': {\n      'other': '0000億'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale zh_Hant_TW.\n */\ngoog.i18n.CompactNumberFormatSymbols_zh_Hant_TW = {\n  COMPACT_DECIMAL_SHORT_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0萬'\n    },\n    '100000': {\n      'other': '00萬'\n    },\n    '1000000': {\n      'other': '000萬'\n    },\n    '10000000': {\n      'other': '0000萬'\n    },\n    '100000000': {\n      'other': '0億'\n    },\n    '1000000000': {\n      'other': '00億'\n    },\n    '10000000000': {\n      'other': '000億'\n    },\n    '100000000000': {\n      'other': '0000億'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  },\n  COMPACT_DECIMAL_LONG_PATTERN: {\n    '1000': {\n      'other': '0'\n    },\n    '10000': {\n      'other': '0萬'\n    },\n    '100000': {\n      'other': '00萬'\n    },\n    '1000000': {\n      'other': '000萬'\n    },\n    '10000000': {\n      'other': '0000萬'\n    },\n    '100000000': {\n      'other': '0億'\n    },\n    '1000000000': {\n      'other': '00億'\n    },\n    '10000000000': {\n      'other': '000億'\n    },\n    '100000000000': {\n      'other': '0000億'\n    },\n    '1000000000000': {\n      'other': '0兆'\n    },\n    '10000000000000': {\n      'other': '00兆'\n    },\n    '100000000000000': {\n      'other': '000兆'\n    }\n  }\n};\n\n\n/**\n * Compact number formatting symbols for locale zu_ZA.\n */\ngoog.i18n.CompactNumberFormatSymbols_zu_ZA = goog.i18n.CompactNumberFormatSymbols_zu;\n\n\n/**\n * Select compact number formatting symbols by locale.\n */\nswitch (goog.LOCALE) {\n  case 'af_NA':\n  case 'af-NA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_af_NA;\n    break;\n  case 'af_ZA':\n  case 'af-ZA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_af_ZA;\n    break;\n  case 'agq':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_agq;\n    break;\n  case 'agq_CM':\n  case 'agq-CM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_agq_CM;\n    break;\n  case 'ak':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ak;\n    break;\n  case 'ak_GH':\n  case 'ak-GH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ak_GH;\n    break;\n  case 'am_ET':\n  case 'am-ET':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_am_ET;\n    break;\n  case 'ar_001':\n  case 'ar-001':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_001;\n    break;\n  case 'ar_AE':\n  case 'ar-AE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_AE;\n    break;\n  case 'ar_BH':\n  case 'ar-BH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_BH;\n    break;\n  case 'ar_DJ':\n  case 'ar-DJ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_DJ;\n    break;\n  case 'ar_EH':\n  case 'ar-EH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_EH;\n    break;\n  case 'ar_ER':\n  case 'ar-ER':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_ER;\n    break;\n  case 'ar_IL':\n  case 'ar-IL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_IL;\n    break;\n  case 'ar_IQ':\n  case 'ar-IQ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_IQ;\n    break;\n  case 'ar_JO':\n  case 'ar-JO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_JO;\n    break;\n  case 'ar_KM':\n  case 'ar-KM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_KM;\n    break;\n  case 'ar_KW':\n  case 'ar-KW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_KW;\n    break;\n  case 'ar_LB':\n  case 'ar-LB':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_LB;\n    break;\n  case 'ar_LY':\n  case 'ar-LY':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_LY;\n    break;\n  case 'ar_MA':\n  case 'ar-MA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_MA;\n    break;\n  case 'ar_MR':\n  case 'ar-MR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_MR;\n    break;\n  case 'ar_OM':\n  case 'ar-OM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_OM;\n    break;\n  case 'ar_PS':\n  case 'ar-PS':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_PS;\n    break;\n  case 'ar_QA':\n  case 'ar-QA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_QA;\n    break;\n  case 'ar_SA':\n  case 'ar-SA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_SA;\n    break;\n  case 'ar_SD':\n  case 'ar-SD':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_SD;\n    break;\n  case 'ar_SO':\n  case 'ar-SO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_SO;\n    break;\n  case 'ar_SS':\n  case 'ar-SS':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_SS;\n    break;\n  case 'ar_SY':\n  case 'ar-SY':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_SY;\n    break;\n  case 'ar_TD':\n  case 'ar-TD':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_TD;\n    break;\n  case 'ar_TN':\n  case 'ar-TN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_TN;\n    break;\n  case 'ar_XB':\n  case 'ar-XB':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_XB;\n    break;\n  case 'ar_YE':\n  case 'ar-YE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ar_YE;\n    break;\n  case 'as':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_as;\n    break;\n  case 'as_IN':\n  case 'as-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_as_IN;\n    break;\n  case 'asa':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_asa;\n    break;\n  case 'asa_TZ':\n  case 'asa-TZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_asa_TZ;\n    break;\n  case 'ast':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ast;\n    break;\n  case 'ast_ES':\n  case 'ast-ES':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ast_ES;\n    break;\n  case 'az_Cyrl':\n  case 'az-Cyrl':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_az_Cyrl;\n    break;\n  case 'az_Cyrl_AZ':\n  case 'az-Cyrl-AZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_az_Cyrl_AZ;\n    break;\n  case 'az_Latn':\n  case 'az-Latn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_az_Latn;\n    break;\n  case 'az_Latn_AZ':\n  case 'az-Latn-AZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_az_Latn_AZ;\n    break;\n  case 'bas':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bas;\n    break;\n  case 'bas_CM':\n  case 'bas-CM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bas_CM;\n    break;\n  case 'be_BY':\n  case 'be-BY':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_be_BY;\n    break;\n  case 'bem':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bem;\n    break;\n  case 'bem_ZM':\n  case 'bem-ZM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bem_ZM;\n    break;\n  case 'bez':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bez;\n    break;\n  case 'bez_TZ':\n  case 'bez-TZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bez_TZ;\n    break;\n  case 'bg_BG':\n  case 'bg-BG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bg_BG;\n    break;\n  case 'bm':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bm;\n    break;\n  case 'bm_ML':\n  case 'bm-ML':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bm_ML;\n    break;\n  case 'bn_BD':\n  case 'bn-BD':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bn_BD;\n    break;\n  case 'bn_IN':\n  case 'bn-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bn_IN;\n    break;\n  case 'bo':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bo;\n    break;\n  case 'bo_CN':\n  case 'bo-CN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bo_CN;\n    break;\n  case 'bo_IN':\n  case 'bo-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bo_IN;\n    break;\n  case 'br_FR':\n  case 'br-FR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_br_FR;\n    break;\n  case 'brx':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_brx;\n    break;\n  case 'brx_IN':\n  case 'brx-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_brx_IN;\n    break;\n  case 'bs_Cyrl':\n  case 'bs-Cyrl':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bs_Cyrl;\n    break;\n  case 'bs_Cyrl_BA':\n  case 'bs-Cyrl-BA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bs_Cyrl_BA;\n    break;\n  case 'bs_Latn':\n  case 'bs-Latn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bs_Latn;\n    break;\n  case 'bs_Latn_BA':\n  case 'bs-Latn-BA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_bs_Latn_BA;\n    break;\n  case 'ca_AD':\n  case 'ca-AD':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ca_AD;\n    break;\n  case 'ca_ES':\n  case 'ca-ES':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ca_ES;\n    break;\n  case 'ca_FR':\n  case 'ca-FR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ca_FR;\n    break;\n  case 'ca_IT':\n  case 'ca-IT':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ca_IT;\n    break;\n  case 'ccp':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ccp;\n    break;\n  case 'ccp_BD':\n  case 'ccp-BD':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ccp_BD;\n    break;\n  case 'ccp_IN':\n  case 'ccp-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ccp_IN;\n    break;\n  case 'ce':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ce;\n    break;\n  case 'ce_RU':\n  case 'ce-RU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ce_RU;\n    break;\n  case 'ceb':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ceb;\n    break;\n  case 'ceb_PH':\n  case 'ceb-PH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ceb_PH;\n    break;\n  case 'cgg':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_cgg;\n    break;\n  case 'cgg_UG':\n  case 'cgg-UG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_cgg_UG;\n    break;\n  case 'chr_US':\n  case 'chr-US':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_chr_US;\n    break;\n  case 'ckb':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ckb;\n    break;\n  case 'ckb_IQ':\n  case 'ckb-IQ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ckb_IQ;\n    break;\n  case 'ckb_IR':\n  case 'ckb-IR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ckb_IR;\n    break;\n  case 'cs_CZ':\n  case 'cs-CZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_cs_CZ;\n    break;\n  case 'cy_GB':\n  case 'cy-GB':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_cy_GB;\n    break;\n  case 'da_DK':\n  case 'da-DK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_da_DK;\n    break;\n  case 'da_GL':\n  case 'da-GL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_da_GL;\n    break;\n  case 'dav':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_dav;\n    break;\n  case 'dav_KE':\n  case 'dav-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_dav_KE;\n    break;\n  case 'de_BE':\n  case 'de-BE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_de_BE;\n    break;\n  case 'de_DE':\n  case 'de-DE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_de_DE;\n    break;\n  case 'de_IT':\n  case 'de-IT':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_de_IT;\n    break;\n  case 'de_LI':\n  case 'de-LI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_de_LI;\n    break;\n  case 'de_LU':\n  case 'de-LU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_de_LU;\n    break;\n  case 'dje':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_dje;\n    break;\n  case 'dje_NE':\n  case 'dje-NE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_dje_NE;\n    break;\n  case 'dsb':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_dsb;\n    break;\n  case 'dsb_DE':\n  case 'dsb-DE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_dsb_DE;\n    break;\n  case 'dua':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_dua;\n    break;\n  case 'dua_CM':\n  case 'dua-CM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_dua_CM;\n    break;\n  case 'dyo':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_dyo;\n    break;\n  case 'dyo_SN':\n  case 'dyo-SN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_dyo_SN;\n    break;\n  case 'dz':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_dz;\n    break;\n  case 'dz_BT':\n  case 'dz-BT':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_dz_BT;\n    break;\n  case 'ebu':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ebu;\n    break;\n  case 'ebu_KE':\n  case 'ebu-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ebu_KE;\n    break;\n  case 'ee':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ee;\n    break;\n  case 'ee_GH':\n  case 'ee-GH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ee_GH;\n    break;\n  case 'ee_TG':\n  case 'ee-TG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ee_TG;\n    break;\n  case 'el_CY':\n  case 'el-CY':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_el_CY;\n    break;\n  case 'el_GR':\n  case 'el-GR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_el_GR;\n    break;\n  case 'en_001':\n  case 'en-001':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_001;\n    break;\n  case 'en_150':\n  case 'en-150':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_150;\n    break;\n  case 'en_AE':\n  case 'en-AE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_AE;\n    break;\n  case 'en_AG':\n  case 'en-AG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_AG;\n    break;\n  case 'en_AI':\n  case 'en-AI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_AI;\n    break;\n  case 'en_AS':\n  case 'en-AS':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_AS;\n    break;\n  case 'en_AT':\n  case 'en-AT':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_AT;\n    break;\n  case 'en_BB':\n  case 'en-BB':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_BB;\n    break;\n  case 'en_BE':\n  case 'en-BE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_BE;\n    break;\n  case 'en_BI':\n  case 'en-BI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_BI;\n    break;\n  case 'en_BM':\n  case 'en-BM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_BM;\n    break;\n  case 'en_BS':\n  case 'en-BS':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_BS;\n    break;\n  case 'en_BW':\n  case 'en-BW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_BW;\n    break;\n  case 'en_BZ':\n  case 'en-BZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_BZ;\n    break;\n  case 'en_CC':\n  case 'en-CC':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_CC;\n    break;\n  case 'en_CH':\n  case 'en-CH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_CH;\n    break;\n  case 'en_CK':\n  case 'en-CK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_CK;\n    break;\n  case 'en_CM':\n  case 'en-CM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_CM;\n    break;\n  case 'en_CX':\n  case 'en-CX':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_CX;\n    break;\n  case 'en_CY':\n  case 'en-CY':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_CY;\n    break;\n  case 'en_DE':\n  case 'en-DE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_DE;\n    break;\n  case 'en_DG':\n  case 'en-DG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_DG;\n    break;\n  case 'en_DK':\n  case 'en-DK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_DK;\n    break;\n  case 'en_DM':\n  case 'en-DM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_DM;\n    break;\n  case 'en_ER':\n  case 'en-ER':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_ER;\n    break;\n  case 'en_FI':\n  case 'en-FI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_FI;\n    break;\n  case 'en_FJ':\n  case 'en-FJ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_FJ;\n    break;\n  case 'en_FK':\n  case 'en-FK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_FK;\n    break;\n  case 'en_FM':\n  case 'en-FM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_FM;\n    break;\n  case 'en_GD':\n  case 'en-GD':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_GD;\n    break;\n  case 'en_GG':\n  case 'en-GG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_GG;\n    break;\n  case 'en_GH':\n  case 'en-GH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_GH;\n    break;\n  case 'en_GI':\n  case 'en-GI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_GI;\n    break;\n  case 'en_GM':\n  case 'en-GM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_GM;\n    break;\n  case 'en_GU':\n  case 'en-GU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_GU;\n    break;\n  case 'en_GY':\n  case 'en-GY':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_GY;\n    break;\n  case 'en_HK':\n  case 'en-HK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_HK;\n    break;\n  case 'en_IL':\n  case 'en-IL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_IL;\n    break;\n  case 'en_IM':\n  case 'en-IM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_IM;\n    break;\n  case 'en_IO':\n  case 'en-IO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_IO;\n    break;\n  case 'en_JE':\n  case 'en-JE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_JE;\n    break;\n  case 'en_JM':\n  case 'en-JM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_JM;\n    break;\n  case 'en_KE':\n  case 'en-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_KE;\n    break;\n  case 'en_KI':\n  case 'en-KI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_KI;\n    break;\n  case 'en_KN':\n  case 'en-KN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_KN;\n    break;\n  case 'en_KY':\n  case 'en-KY':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_KY;\n    break;\n  case 'en_LC':\n  case 'en-LC':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_LC;\n    break;\n  case 'en_LR':\n  case 'en-LR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_LR;\n    break;\n  case 'en_LS':\n  case 'en-LS':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_LS;\n    break;\n  case 'en_MG':\n  case 'en-MG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_MG;\n    break;\n  case 'en_MH':\n  case 'en-MH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_MH;\n    break;\n  case 'en_MO':\n  case 'en-MO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_MO;\n    break;\n  case 'en_MP':\n  case 'en-MP':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_MP;\n    break;\n  case 'en_MS':\n  case 'en-MS':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_MS;\n    break;\n  case 'en_MT':\n  case 'en-MT':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_MT;\n    break;\n  case 'en_MU':\n  case 'en-MU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_MU;\n    break;\n  case 'en_MW':\n  case 'en-MW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_MW;\n    break;\n  case 'en_MY':\n  case 'en-MY':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_MY;\n    break;\n  case 'en_NA':\n  case 'en-NA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_NA;\n    break;\n  case 'en_NF':\n  case 'en-NF':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_NF;\n    break;\n  case 'en_NG':\n  case 'en-NG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_NG;\n    break;\n  case 'en_NL':\n  case 'en-NL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_NL;\n    break;\n  case 'en_NR':\n  case 'en-NR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_NR;\n    break;\n  case 'en_NU':\n  case 'en-NU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_NU;\n    break;\n  case 'en_NZ':\n  case 'en-NZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_NZ;\n    break;\n  case 'en_PG':\n  case 'en-PG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_PG;\n    break;\n  case 'en_PH':\n  case 'en-PH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_PH;\n    break;\n  case 'en_PK':\n  case 'en-PK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_PK;\n    break;\n  case 'en_PN':\n  case 'en-PN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_PN;\n    break;\n  case 'en_PR':\n  case 'en-PR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_PR;\n    break;\n  case 'en_PW':\n  case 'en-PW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_PW;\n    break;\n  case 'en_RW':\n  case 'en-RW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_RW;\n    break;\n  case 'en_SB':\n  case 'en-SB':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_SB;\n    break;\n  case 'en_SC':\n  case 'en-SC':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_SC;\n    break;\n  case 'en_SD':\n  case 'en-SD':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_SD;\n    break;\n  case 'en_SE':\n  case 'en-SE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_SE;\n    break;\n  case 'en_SH':\n  case 'en-SH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_SH;\n    break;\n  case 'en_SI':\n  case 'en-SI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_SI;\n    break;\n  case 'en_SL':\n  case 'en-SL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_SL;\n    break;\n  case 'en_SS':\n  case 'en-SS':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_SS;\n    break;\n  case 'en_SX':\n  case 'en-SX':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_SX;\n    break;\n  case 'en_SZ':\n  case 'en-SZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_SZ;\n    break;\n  case 'en_TC':\n  case 'en-TC':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_TC;\n    break;\n  case 'en_TK':\n  case 'en-TK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_TK;\n    break;\n  case 'en_TO':\n  case 'en-TO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_TO;\n    break;\n  case 'en_TT':\n  case 'en-TT':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_TT;\n    break;\n  case 'en_TV':\n  case 'en-TV':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_TV;\n    break;\n  case 'en_TZ':\n  case 'en-TZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_TZ;\n    break;\n  case 'en_UG':\n  case 'en-UG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_UG;\n    break;\n  case 'en_UM':\n  case 'en-UM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_UM;\n    break;\n  case 'en_US_POSIX':\n  case 'en-US-POSIX':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_US_POSIX;\n    break;\n  case 'en_VC':\n  case 'en-VC':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_VC;\n    break;\n  case 'en_VG':\n  case 'en-VG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_VG;\n    break;\n  case 'en_VI':\n  case 'en-VI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_VI;\n    break;\n  case 'en_VU':\n  case 'en-VU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_VU;\n    break;\n  case 'en_WS':\n  case 'en-WS':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_WS;\n    break;\n  case 'en_XA':\n  case 'en-XA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_XA;\n    break;\n  case 'en_ZM':\n  case 'en-ZM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_ZM;\n    break;\n  case 'en_ZW':\n  case 'en-ZW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_en_ZW;\n    break;\n  case 'eo':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_eo;\n    break;\n  case 'eo_001':\n  case 'eo-001':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_eo_001;\n    break;\n  case 'es_AR':\n  case 'es-AR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_AR;\n    break;\n  case 'es_BO':\n  case 'es-BO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_BO;\n    break;\n  case 'es_BR':\n  case 'es-BR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_BR;\n    break;\n  case 'es_BZ':\n  case 'es-BZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_BZ;\n    break;\n  case 'es_CL':\n  case 'es-CL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_CL;\n    break;\n  case 'es_CO':\n  case 'es-CO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_CO;\n    break;\n  case 'es_CR':\n  case 'es-CR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_CR;\n    break;\n  case 'es_CU':\n  case 'es-CU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_CU;\n    break;\n  case 'es_DO':\n  case 'es-DO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_DO;\n    break;\n  case 'es_EA':\n  case 'es-EA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_EA;\n    break;\n  case 'es_EC':\n  case 'es-EC':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_EC;\n    break;\n  case 'es_GQ':\n  case 'es-GQ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_GQ;\n    break;\n  case 'es_GT':\n  case 'es-GT':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_GT;\n    break;\n  case 'es_HN':\n  case 'es-HN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_HN;\n    break;\n  case 'es_IC':\n  case 'es-IC':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_IC;\n    break;\n  case 'es_NI':\n  case 'es-NI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_NI;\n    break;\n  case 'es_PA':\n  case 'es-PA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_PA;\n    break;\n  case 'es_PE':\n  case 'es-PE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_PE;\n    break;\n  case 'es_PH':\n  case 'es-PH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_PH;\n    break;\n  case 'es_PR':\n  case 'es-PR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_PR;\n    break;\n  case 'es_PY':\n  case 'es-PY':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_PY;\n    break;\n  case 'es_SV':\n  case 'es-SV':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_SV;\n    break;\n  case 'es_UY':\n  case 'es-UY':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_UY;\n    break;\n  case 'es_VE':\n  case 'es-VE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_es_VE;\n    break;\n  case 'et_EE':\n  case 'et-EE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_et_EE;\n    break;\n  case 'eu_ES':\n  case 'eu-ES':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_eu_ES;\n    break;\n  case 'ewo':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ewo;\n    break;\n  case 'ewo_CM':\n  case 'ewo-CM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ewo_CM;\n    break;\n  case 'fa_AF':\n  case 'fa-AF':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fa_AF;\n    break;\n  case 'fa_IR':\n  case 'fa-IR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fa_IR;\n    break;\n  case 'ff':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ff;\n    break;\n  case 'ff_Latn':\n  case 'ff-Latn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ff_Latn;\n    break;\n  case 'ff_Latn_BF':\n  case 'ff-Latn-BF':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ff_Latn_BF;\n    break;\n  case 'ff_Latn_CM':\n  case 'ff-Latn-CM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ff_Latn_CM;\n    break;\n  case 'ff_Latn_GH':\n  case 'ff-Latn-GH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ff_Latn_GH;\n    break;\n  case 'ff_Latn_GM':\n  case 'ff-Latn-GM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ff_Latn_GM;\n    break;\n  case 'ff_Latn_GN':\n  case 'ff-Latn-GN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ff_Latn_GN;\n    break;\n  case 'ff_Latn_GW':\n  case 'ff-Latn-GW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ff_Latn_GW;\n    break;\n  case 'ff_Latn_LR':\n  case 'ff-Latn-LR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ff_Latn_LR;\n    break;\n  case 'ff_Latn_MR':\n  case 'ff-Latn-MR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ff_Latn_MR;\n    break;\n  case 'ff_Latn_NE':\n  case 'ff-Latn-NE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ff_Latn_NE;\n    break;\n  case 'ff_Latn_NG':\n  case 'ff-Latn-NG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ff_Latn_NG;\n    break;\n  case 'ff_Latn_SL':\n  case 'ff-Latn-SL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ff_Latn_SL;\n    break;\n  case 'ff_Latn_SN':\n  case 'ff-Latn-SN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ff_Latn_SN;\n    break;\n  case 'fi_FI':\n  case 'fi-FI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fi_FI;\n    break;\n  case 'fil_PH':\n  case 'fil-PH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fil_PH;\n    break;\n  case 'fo':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fo;\n    break;\n  case 'fo_DK':\n  case 'fo-DK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fo_DK;\n    break;\n  case 'fo_FO':\n  case 'fo-FO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fo_FO;\n    break;\n  case 'fr_BE':\n  case 'fr-BE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_BE;\n    break;\n  case 'fr_BF':\n  case 'fr-BF':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_BF;\n    break;\n  case 'fr_BI':\n  case 'fr-BI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_BI;\n    break;\n  case 'fr_BJ':\n  case 'fr-BJ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_BJ;\n    break;\n  case 'fr_BL':\n  case 'fr-BL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_BL;\n    break;\n  case 'fr_CD':\n  case 'fr-CD':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_CD;\n    break;\n  case 'fr_CF':\n  case 'fr-CF':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_CF;\n    break;\n  case 'fr_CG':\n  case 'fr-CG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_CG;\n    break;\n  case 'fr_CH':\n  case 'fr-CH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_CH;\n    break;\n  case 'fr_CI':\n  case 'fr-CI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_CI;\n    break;\n  case 'fr_CM':\n  case 'fr-CM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_CM;\n    break;\n  case 'fr_DJ':\n  case 'fr-DJ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_DJ;\n    break;\n  case 'fr_DZ':\n  case 'fr-DZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_DZ;\n    break;\n  case 'fr_FR':\n  case 'fr-FR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_FR;\n    break;\n  case 'fr_GA':\n  case 'fr-GA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_GA;\n    break;\n  case 'fr_GF':\n  case 'fr-GF':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_GF;\n    break;\n  case 'fr_GN':\n  case 'fr-GN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_GN;\n    break;\n  case 'fr_GP':\n  case 'fr-GP':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_GP;\n    break;\n  case 'fr_GQ':\n  case 'fr-GQ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_GQ;\n    break;\n  case 'fr_HT':\n  case 'fr-HT':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_HT;\n    break;\n  case 'fr_KM':\n  case 'fr-KM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_KM;\n    break;\n  case 'fr_LU':\n  case 'fr-LU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_LU;\n    break;\n  case 'fr_MA':\n  case 'fr-MA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_MA;\n    break;\n  case 'fr_MC':\n  case 'fr-MC':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_MC;\n    break;\n  case 'fr_MF':\n  case 'fr-MF':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_MF;\n    break;\n  case 'fr_MG':\n  case 'fr-MG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_MG;\n    break;\n  case 'fr_ML':\n  case 'fr-ML':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_ML;\n    break;\n  case 'fr_MQ':\n  case 'fr-MQ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_MQ;\n    break;\n  case 'fr_MR':\n  case 'fr-MR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_MR;\n    break;\n  case 'fr_MU':\n  case 'fr-MU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_MU;\n    break;\n  case 'fr_NC':\n  case 'fr-NC':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_NC;\n    break;\n  case 'fr_NE':\n  case 'fr-NE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_NE;\n    break;\n  case 'fr_PF':\n  case 'fr-PF':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_PF;\n    break;\n  case 'fr_PM':\n  case 'fr-PM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_PM;\n    break;\n  case 'fr_RE':\n  case 'fr-RE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_RE;\n    break;\n  case 'fr_RW':\n  case 'fr-RW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_RW;\n    break;\n  case 'fr_SC':\n  case 'fr-SC':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_SC;\n    break;\n  case 'fr_SN':\n  case 'fr-SN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_SN;\n    break;\n  case 'fr_SY':\n  case 'fr-SY':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_SY;\n    break;\n  case 'fr_TD':\n  case 'fr-TD':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_TD;\n    break;\n  case 'fr_TG':\n  case 'fr-TG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_TG;\n    break;\n  case 'fr_TN':\n  case 'fr-TN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_TN;\n    break;\n  case 'fr_VU':\n  case 'fr-VU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_VU;\n    break;\n  case 'fr_WF':\n  case 'fr-WF':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_WF;\n    break;\n  case 'fr_YT':\n  case 'fr-YT':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fr_YT;\n    break;\n  case 'fur':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fur;\n    break;\n  case 'fur_IT':\n  case 'fur-IT':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fur_IT;\n    break;\n  case 'fy':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fy;\n    break;\n  case 'fy_NL':\n  case 'fy-NL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_fy_NL;\n    break;\n  case 'ga_IE':\n  case 'ga-IE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ga_IE;\n    break;\n  case 'gd':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_gd;\n    break;\n  case 'gd_GB':\n  case 'gd-GB':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_gd_GB;\n    break;\n  case 'gl_ES':\n  case 'gl-ES':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_gl_ES;\n    break;\n  case 'gsw_CH':\n  case 'gsw-CH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_gsw_CH;\n    break;\n  case 'gsw_FR':\n  case 'gsw-FR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_gsw_FR;\n    break;\n  case 'gsw_LI':\n  case 'gsw-LI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_gsw_LI;\n    break;\n  case 'gu_IN':\n  case 'gu-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_gu_IN;\n    break;\n  case 'guz':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_guz;\n    break;\n  case 'guz_KE':\n  case 'guz-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_guz_KE;\n    break;\n  case 'gv':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_gv;\n    break;\n  case 'gv_IM':\n  case 'gv-IM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_gv_IM;\n    break;\n  case 'ha':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ha;\n    break;\n  case 'ha_GH':\n  case 'ha-GH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ha_GH;\n    break;\n  case 'ha_NE':\n  case 'ha-NE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ha_NE;\n    break;\n  case 'ha_NG':\n  case 'ha-NG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ha_NG;\n    break;\n  case 'haw_US':\n  case 'haw-US':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_haw_US;\n    break;\n  case 'he_IL':\n  case 'he-IL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_he_IL;\n    break;\n  case 'hi_IN':\n  case 'hi-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_hi_IN;\n    break;\n  case 'hr_BA':\n  case 'hr-BA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_hr_BA;\n    break;\n  case 'hr_HR':\n  case 'hr-HR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_hr_HR;\n    break;\n  case 'hsb':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_hsb;\n    break;\n  case 'hsb_DE':\n  case 'hsb-DE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_hsb_DE;\n    break;\n  case 'hu_HU':\n  case 'hu-HU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_hu_HU;\n    break;\n  case 'hy_AM':\n  case 'hy-AM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_hy_AM;\n    break;\n  case 'ia':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ia;\n    break;\n  case 'ia_001':\n  case 'ia-001':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ia_001;\n    break;\n  case 'id_ID':\n  case 'id-ID':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_id_ID;\n    break;\n  case 'ig':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ig;\n    break;\n  case 'ig_NG':\n  case 'ig-NG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ig_NG;\n    break;\n  case 'ii':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ii;\n    break;\n  case 'ii_CN':\n  case 'ii-CN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ii_CN;\n    break;\n  case 'is_IS':\n  case 'is-IS':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_is_IS;\n    break;\n  case 'it_CH':\n  case 'it-CH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_it_CH;\n    break;\n  case 'it_IT':\n  case 'it-IT':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_it_IT;\n    break;\n  case 'it_SM':\n  case 'it-SM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_it_SM;\n    break;\n  case 'it_VA':\n  case 'it-VA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_it_VA;\n    break;\n  case 'ja_JP':\n  case 'ja-JP':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ja_JP;\n    break;\n  case 'jgo':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_jgo;\n    break;\n  case 'jgo_CM':\n  case 'jgo-CM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_jgo_CM;\n    break;\n  case 'jmc':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_jmc;\n    break;\n  case 'jmc_TZ':\n  case 'jmc-TZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_jmc_TZ;\n    break;\n  case 'jv':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_jv;\n    break;\n  case 'jv_ID':\n  case 'jv-ID':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_jv_ID;\n    break;\n  case 'ka_GE':\n  case 'ka-GE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ka_GE;\n    break;\n  case 'kab':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kab;\n    break;\n  case 'kab_DZ':\n  case 'kab-DZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kab_DZ;\n    break;\n  case 'kam':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kam;\n    break;\n  case 'kam_KE':\n  case 'kam-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kam_KE;\n    break;\n  case 'kde':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kde;\n    break;\n  case 'kde_TZ':\n  case 'kde-TZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kde_TZ;\n    break;\n  case 'kea':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kea;\n    break;\n  case 'kea_CV':\n  case 'kea-CV':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kea_CV;\n    break;\n  case 'khq':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_khq;\n    break;\n  case 'khq_ML':\n  case 'khq-ML':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_khq_ML;\n    break;\n  case 'ki':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ki;\n    break;\n  case 'ki_KE':\n  case 'ki-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ki_KE;\n    break;\n  case 'kk_KZ':\n  case 'kk-KZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kk_KZ;\n    break;\n  case 'kkj':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kkj;\n    break;\n  case 'kkj_CM':\n  case 'kkj-CM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kkj_CM;\n    break;\n  case 'kl':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kl;\n    break;\n  case 'kl_GL':\n  case 'kl-GL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kl_GL;\n    break;\n  case 'kln':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kln;\n    break;\n  case 'kln_KE':\n  case 'kln-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kln_KE;\n    break;\n  case 'km_KH':\n  case 'km-KH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_km_KH;\n    break;\n  case 'kn_IN':\n  case 'kn-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kn_IN;\n    break;\n  case 'ko_KP':\n  case 'ko-KP':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ko_KP;\n    break;\n  case 'ko_KR':\n  case 'ko-KR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ko_KR;\n    break;\n  case 'kok':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kok;\n    break;\n  case 'kok_IN':\n  case 'kok-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kok_IN;\n    break;\n  case 'ks':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ks;\n    break;\n  case 'ks_IN':\n  case 'ks-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ks_IN;\n    break;\n  case 'ksb':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ksb;\n    break;\n  case 'ksb_TZ':\n  case 'ksb-TZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ksb_TZ;\n    break;\n  case 'ksf':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ksf;\n    break;\n  case 'ksf_CM':\n  case 'ksf-CM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ksf_CM;\n    break;\n  case 'ksh':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ksh;\n    break;\n  case 'ksh_DE':\n  case 'ksh-DE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ksh_DE;\n    break;\n  case 'ku':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ku;\n    break;\n  case 'ku_TR':\n  case 'ku-TR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ku_TR;\n    break;\n  case 'kw':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kw;\n    break;\n  case 'kw_GB':\n  case 'kw-GB':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_kw_GB;\n    break;\n  case 'ky_KG':\n  case 'ky-KG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ky_KG;\n    break;\n  case 'lag':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lag;\n    break;\n  case 'lag_TZ':\n  case 'lag-TZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lag_TZ;\n    break;\n  case 'lb':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lb;\n    break;\n  case 'lb_LU':\n  case 'lb-LU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lb_LU;\n    break;\n  case 'lg':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lg;\n    break;\n  case 'lg_UG':\n  case 'lg-UG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lg_UG;\n    break;\n  case 'lkt':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lkt;\n    break;\n  case 'lkt_US':\n  case 'lkt-US':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lkt_US;\n    break;\n  case 'ln_AO':\n  case 'ln-AO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ln_AO;\n    break;\n  case 'ln_CD':\n  case 'ln-CD':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ln_CD;\n    break;\n  case 'ln_CF':\n  case 'ln-CF':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ln_CF;\n    break;\n  case 'ln_CG':\n  case 'ln-CG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ln_CG;\n    break;\n  case 'lo_LA':\n  case 'lo-LA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lo_LA;\n    break;\n  case 'lrc':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lrc;\n    break;\n  case 'lrc_IQ':\n  case 'lrc-IQ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lrc_IQ;\n    break;\n  case 'lrc_IR':\n  case 'lrc-IR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lrc_IR;\n    break;\n  case 'lt_LT':\n  case 'lt-LT':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lt_LT;\n    break;\n  case 'lu':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lu;\n    break;\n  case 'lu_CD':\n  case 'lu-CD':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lu_CD;\n    break;\n  case 'luo':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_luo;\n    break;\n  case 'luo_KE':\n  case 'luo-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_luo_KE;\n    break;\n  case 'luy':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_luy;\n    break;\n  case 'luy_KE':\n  case 'luy-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_luy_KE;\n    break;\n  case 'lv_LV':\n  case 'lv-LV':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_lv_LV;\n    break;\n  case 'mas':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mas;\n    break;\n  case 'mas_KE':\n  case 'mas-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mas_KE;\n    break;\n  case 'mas_TZ':\n  case 'mas-TZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mas_TZ;\n    break;\n  case 'mer':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mer;\n    break;\n  case 'mer_KE':\n  case 'mer-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mer_KE;\n    break;\n  case 'mfe':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mfe;\n    break;\n  case 'mfe_MU':\n  case 'mfe-MU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mfe_MU;\n    break;\n  case 'mg':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mg;\n    break;\n  case 'mg_MG':\n  case 'mg-MG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mg_MG;\n    break;\n  case 'mgh':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mgh;\n    break;\n  case 'mgh_MZ':\n  case 'mgh-MZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mgh_MZ;\n    break;\n  case 'mgo':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mgo;\n    break;\n  case 'mgo_CM':\n  case 'mgo-CM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mgo_CM;\n    break;\n  case 'mi':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mi;\n    break;\n  case 'mi_NZ':\n  case 'mi-NZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mi_NZ;\n    break;\n  case 'mk_MK':\n  case 'mk-MK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mk_MK;\n    break;\n  case 'ml_IN':\n  case 'ml-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ml_IN;\n    break;\n  case 'mn_MN':\n  case 'mn-MN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mn_MN;\n    break;\n  case 'mr_IN':\n  case 'mr-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mr_IN;\n    break;\n  case 'ms_BN':\n  case 'ms-BN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ms_BN;\n    break;\n  case 'ms_MY':\n  case 'ms-MY':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ms_MY;\n    break;\n  case 'ms_SG':\n  case 'ms-SG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ms_SG;\n    break;\n  case 'mt_MT':\n  case 'mt-MT':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mt_MT;\n    break;\n  case 'mua':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mua;\n    break;\n  case 'mua_CM':\n  case 'mua-CM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mua_CM;\n    break;\n  case 'my_MM':\n  case 'my-MM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_my_MM;\n    break;\n  case 'mzn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mzn;\n    break;\n  case 'mzn_IR':\n  case 'mzn-IR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_mzn_IR;\n    break;\n  case 'naq':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_naq;\n    break;\n  case 'naq_NA':\n  case 'naq-NA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_naq_NA;\n    break;\n  case 'nb_NO':\n  case 'nb-NO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nb_NO;\n    break;\n  case 'nb_SJ':\n  case 'nb-SJ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nb_SJ;\n    break;\n  case 'nd':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nd;\n    break;\n  case 'nd_ZW':\n  case 'nd-ZW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nd_ZW;\n    break;\n  case 'nds':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nds;\n    break;\n  case 'nds_DE':\n  case 'nds-DE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nds_DE;\n    break;\n  case 'nds_NL':\n  case 'nds-NL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nds_NL;\n    break;\n  case 'ne_IN':\n  case 'ne-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ne_IN;\n    break;\n  case 'ne_NP':\n  case 'ne-NP':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ne_NP;\n    break;\n  case 'nl_AW':\n  case 'nl-AW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nl_AW;\n    break;\n  case 'nl_BE':\n  case 'nl-BE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nl_BE;\n    break;\n  case 'nl_BQ':\n  case 'nl-BQ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nl_BQ;\n    break;\n  case 'nl_CW':\n  case 'nl-CW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nl_CW;\n    break;\n  case 'nl_NL':\n  case 'nl-NL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nl_NL;\n    break;\n  case 'nl_SR':\n  case 'nl-SR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nl_SR;\n    break;\n  case 'nl_SX':\n  case 'nl-SX':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nl_SX;\n    break;\n  case 'nmg':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nmg;\n    break;\n  case 'nmg_CM':\n  case 'nmg-CM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nmg_CM;\n    break;\n  case 'nn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nn;\n    break;\n  case 'nn_NO':\n  case 'nn-NO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nn_NO;\n    break;\n  case 'nnh':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nnh;\n    break;\n  case 'nnh_CM':\n  case 'nnh-CM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nnh_CM;\n    break;\n  case 'nus':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nus;\n    break;\n  case 'nus_SS':\n  case 'nus-SS':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nus_SS;\n    break;\n  case 'nyn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nyn;\n    break;\n  case 'nyn_UG':\n  case 'nyn-UG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_nyn_UG;\n    break;\n  case 'om':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_om;\n    break;\n  case 'om_ET':\n  case 'om-ET':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_om_ET;\n    break;\n  case 'om_KE':\n  case 'om-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_om_KE;\n    break;\n  case 'or_IN':\n  case 'or-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_or_IN;\n    break;\n  case 'os':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_os;\n    break;\n  case 'os_GE':\n  case 'os-GE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_os_GE;\n    break;\n  case 'os_RU':\n  case 'os-RU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_os_RU;\n    break;\n  case 'pa_Arab':\n  case 'pa-Arab':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pa_Arab;\n    break;\n  case 'pa_Arab_PK':\n  case 'pa-Arab-PK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pa_Arab_PK;\n    break;\n  case 'pa_Guru':\n  case 'pa-Guru':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pa_Guru;\n    break;\n  case 'pa_Guru_IN':\n  case 'pa-Guru-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pa_Guru_IN;\n    break;\n  case 'pl_PL':\n  case 'pl-PL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pl_PL;\n    break;\n  case 'ps':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ps;\n    break;\n  case 'ps_AF':\n  case 'ps-AF':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ps_AF;\n    break;\n  case 'ps_PK':\n  case 'ps-PK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ps_PK;\n    break;\n  case 'pt_AO':\n  case 'pt-AO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pt_AO;\n    break;\n  case 'pt_CH':\n  case 'pt-CH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pt_CH;\n    break;\n  case 'pt_CV':\n  case 'pt-CV':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pt_CV;\n    break;\n  case 'pt_GQ':\n  case 'pt-GQ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pt_GQ;\n    break;\n  case 'pt_GW':\n  case 'pt-GW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pt_GW;\n    break;\n  case 'pt_LU':\n  case 'pt-LU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pt_LU;\n    break;\n  case 'pt_MO':\n  case 'pt-MO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pt_MO;\n    break;\n  case 'pt_MZ':\n  case 'pt-MZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pt_MZ;\n    break;\n  case 'pt_ST':\n  case 'pt-ST':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pt_ST;\n    break;\n  case 'pt_TL':\n  case 'pt-TL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_pt_TL;\n    break;\n  case 'qu':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_qu;\n    break;\n  case 'qu_BO':\n  case 'qu-BO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_qu_BO;\n    break;\n  case 'qu_EC':\n  case 'qu-EC':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_qu_EC;\n    break;\n  case 'qu_PE':\n  case 'qu-PE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_qu_PE;\n    break;\n  case 'rm':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_rm;\n    break;\n  case 'rm_CH':\n  case 'rm-CH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_rm_CH;\n    break;\n  case 'rn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_rn;\n    break;\n  case 'rn_BI':\n  case 'rn-BI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_rn_BI;\n    break;\n  case 'ro_MD':\n  case 'ro-MD':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ro_MD;\n    break;\n  case 'ro_RO':\n  case 'ro-RO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ro_RO;\n    break;\n  case 'rof':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_rof;\n    break;\n  case 'rof_TZ':\n  case 'rof-TZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_rof_TZ;\n    break;\n  case 'ru_BY':\n  case 'ru-BY':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ru_BY;\n    break;\n  case 'ru_KG':\n  case 'ru-KG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ru_KG;\n    break;\n  case 'ru_KZ':\n  case 'ru-KZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ru_KZ;\n    break;\n  case 'ru_MD':\n  case 'ru-MD':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ru_MD;\n    break;\n  case 'ru_RU':\n  case 'ru-RU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ru_RU;\n    break;\n  case 'ru_UA':\n  case 'ru-UA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ru_UA;\n    break;\n  case 'rw':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_rw;\n    break;\n  case 'rw_RW':\n  case 'rw-RW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_rw_RW;\n    break;\n  case 'rwk':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_rwk;\n    break;\n  case 'rwk_TZ':\n  case 'rwk-TZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_rwk_TZ;\n    break;\n  case 'sah':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sah;\n    break;\n  case 'sah_RU':\n  case 'sah-RU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sah_RU;\n    break;\n  case 'saq':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_saq;\n    break;\n  case 'saq_KE':\n  case 'saq-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_saq_KE;\n    break;\n  case 'sbp':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sbp;\n    break;\n  case 'sbp_TZ':\n  case 'sbp-TZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sbp_TZ;\n    break;\n  case 'sd':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sd;\n    break;\n  case 'sd_PK':\n  case 'sd-PK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sd_PK;\n    break;\n  case 'se':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_se;\n    break;\n  case 'se_FI':\n  case 'se-FI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_se_FI;\n    break;\n  case 'se_NO':\n  case 'se-NO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_se_NO;\n    break;\n  case 'se_SE':\n  case 'se-SE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_se_SE;\n    break;\n  case 'seh':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_seh;\n    break;\n  case 'seh_MZ':\n  case 'seh-MZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_seh_MZ;\n    break;\n  case 'ses':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ses;\n    break;\n  case 'ses_ML':\n  case 'ses-ML':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ses_ML;\n    break;\n  case 'sg':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sg;\n    break;\n  case 'sg_CF':\n  case 'sg-CF':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sg_CF;\n    break;\n  case 'shi':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_shi;\n    break;\n  case 'shi_Latn':\n  case 'shi-Latn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_shi_Latn;\n    break;\n  case 'shi_Latn_MA':\n  case 'shi-Latn-MA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_shi_Latn_MA;\n    break;\n  case 'shi_Tfng':\n  case 'shi-Tfng':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_shi_Tfng;\n    break;\n  case 'shi_Tfng_MA':\n  case 'shi-Tfng-MA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_shi_Tfng_MA;\n    break;\n  case 'si_LK':\n  case 'si-LK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_si_LK;\n    break;\n  case 'sk_SK':\n  case 'sk-SK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sk_SK;\n    break;\n  case 'sl_SI':\n  case 'sl-SI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sl_SI;\n    break;\n  case 'smn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_smn;\n    break;\n  case 'smn_FI':\n  case 'smn-FI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_smn_FI;\n    break;\n  case 'sn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sn;\n    break;\n  case 'sn_ZW':\n  case 'sn-ZW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sn_ZW;\n    break;\n  case 'so':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_so;\n    break;\n  case 'so_DJ':\n  case 'so-DJ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_so_DJ;\n    break;\n  case 'so_ET':\n  case 'so-ET':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_so_ET;\n    break;\n  case 'so_KE':\n  case 'so-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_so_KE;\n    break;\n  case 'so_SO':\n  case 'so-SO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_so_SO;\n    break;\n  case 'sq_AL':\n  case 'sq-AL':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sq_AL;\n    break;\n  case 'sq_MK':\n  case 'sq-MK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sq_MK;\n    break;\n  case 'sq_XK':\n  case 'sq-XK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sq_XK;\n    break;\n  case 'sr_Cyrl':\n  case 'sr-Cyrl':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sr_Cyrl;\n    break;\n  case 'sr_Cyrl_BA':\n  case 'sr-Cyrl-BA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_BA;\n    break;\n  case 'sr_Cyrl_ME':\n  case 'sr-Cyrl-ME':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_ME;\n    break;\n  case 'sr_Cyrl_RS':\n  case 'sr-Cyrl-RS':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_RS;\n    break;\n  case 'sr_Cyrl_XK':\n  case 'sr-Cyrl-XK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_XK;\n    break;\n  case 'sr_Latn_BA':\n  case 'sr-Latn-BA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sr_Latn_BA;\n    break;\n  case 'sr_Latn_ME':\n  case 'sr-Latn-ME':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sr_Latn_ME;\n    break;\n  case 'sr_Latn_RS':\n  case 'sr-Latn-RS':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sr_Latn_RS;\n    break;\n  case 'sr_Latn_XK':\n  case 'sr-Latn-XK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sr_Latn_XK;\n    break;\n  case 'sv_AX':\n  case 'sv-AX':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sv_AX;\n    break;\n  case 'sv_FI':\n  case 'sv-FI':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sv_FI;\n    break;\n  case 'sv_SE':\n  case 'sv-SE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sv_SE;\n    break;\n  case 'sw_CD':\n  case 'sw-CD':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sw_CD;\n    break;\n  case 'sw_KE':\n  case 'sw-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sw_KE;\n    break;\n  case 'sw_TZ':\n  case 'sw-TZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sw_TZ;\n    break;\n  case 'sw_UG':\n  case 'sw-UG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_sw_UG;\n    break;\n  case 'ta_IN':\n  case 'ta-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ta_IN;\n    break;\n  case 'ta_LK':\n  case 'ta-LK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ta_LK;\n    break;\n  case 'ta_MY':\n  case 'ta-MY':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ta_MY;\n    break;\n  case 'ta_SG':\n  case 'ta-SG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ta_SG;\n    break;\n  case 'te_IN':\n  case 'te-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_te_IN;\n    break;\n  case 'teo':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_teo;\n    break;\n  case 'teo_KE':\n  case 'teo-KE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_teo_KE;\n    break;\n  case 'teo_UG':\n  case 'teo-UG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_teo_UG;\n    break;\n  case 'tg':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_tg;\n    break;\n  case 'tg_TJ':\n  case 'tg-TJ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_tg_TJ;\n    break;\n  case 'th_TH':\n  case 'th-TH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_th_TH;\n    break;\n  case 'ti':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ti;\n    break;\n  case 'ti_ER':\n  case 'ti-ER':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ti_ER;\n    break;\n  case 'ti_ET':\n  case 'ti-ET':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ti_ET;\n    break;\n  case 'tk':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_tk;\n    break;\n  case 'tk_TM':\n  case 'tk-TM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_tk_TM;\n    break;\n  case 'to':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_to;\n    break;\n  case 'to_TO':\n  case 'to-TO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_to_TO;\n    break;\n  case 'tr_CY':\n  case 'tr-CY':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_tr_CY;\n    break;\n  case 'tr_TR':\n  case 'tr-TR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_tr_TR;\n    break;\n  case 'tt':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_tt;\n    break;\n  case 'tt_RU':\n  case 'tt-RU':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_tt_RU;\n    break;\n  case 'twq':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_twq;\n    break;\n  case 'twq_NE':\n  case 'twq-NE':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_twq_NE;\n    break;\n  case 'tzm':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_tzm;\n    break;\n  case 'tzm_MA':\n  case 'tzm-MA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_tzm_MA;\n    break;\n  case 'ug':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ug;\n    break;\n  case 'ug_CN':\n  case 'ug-CN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ug_CN;\n    break;\n  case 'uk_UA':\n  case 'uk-UA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_uk_UA;\n    break;\n  case 'ur_IN':\n  case 'ur-IN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ur_IN;\n    break;\n  case 'ur_PK':\n  case 'ur-PK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_ur_PK;\n    break;\n  case 'uz_Arab':\n  case 'uz-Arab':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_uz_Arab;\n    break;\n  case 'uz_Arab_AF':\n  case 'uz-Arab-AF':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_uz_Arab_AF;\n    break;\n  case 'uz_Cyrl':\n  case 'uz-Cyrl':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_uz_Cyrl;\n    break;\n  case 'uz_Cyrl_UZ':\n  case 'uz-Cyrl-UZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_uz_Cyrl_UZ;\n    break;\n  case 'uz_Latn':\n  case 'uz-Latn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_uz_Latn;\n    break;\n  case 'uz_Latn_UZ':\n  case 'uz-Latn-UZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_uz_Latn_UZ;\n    break;\n  case 'vai':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_vai;\n    break;\n  case 'vai_Latn':\n  case 'vai-Latn':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_vai_Latn;\n    break;\n  case 'vai_Latn_LR':\n  case 'vai-Latn-LR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_vai_Latn_LR;\n    break;\n  case 'vai_Vaii':\n  case 'vai-Vaii':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_vai_Vaii;\n    break;\n  case 'vai_Vaii_LR':\n  case 'vai-Vaii-LR':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_vai_Vaii_LR;\n    break;\n  case 'vi_VN':\n  case 'vi-VN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_vi_VN;\n    break;\n  case 'vun':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_vun;\n    break;\n  case 'vun_TZ':\n  case 'vun-TZ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_vun_TZ;\n    break;\n  case 'wae':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_wae;\n    break;\n  case 'wae_CH':\n  case 'wae-CH':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_wae_CH;\n    break;\n  case 'wo':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_wo;\n    break;\n  case 'wo_SN':\n  case 'wo-SN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_wo_SN;\n    break;\n  case 'xh':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_xh;\n    break;\n  case 'xh_ZA':\n  case 'xh-ZA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_xh_ZA;\n    break;\n  case 'xog':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_xog;\n    break;\n  case 'xog_UG':\n  case 'xog-UG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_xog_UG;\n    break;\n  case 'yav':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_yav;\n    break;\n  case 'yav_CM':\n  case 'yav-CM':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_yav_CM;\n    break;\n  case 'yi':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_yi;\n    break;\n  case 'yi_001':\n  case 'yi-001':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_yi_001;\n    break;\n  case 'yo':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_yo;\n    break;\n  case 'yo_BJ':\n  case 'yo-BJ':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_yo_BJ;\n    break;\n  case 'yo_NG':\n  case 'yo-NG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_yo_NG;\n    break;\n  case 'yue':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_yue;\n    break;\n  case 'yue_Hans':\n  case 'yue-Hans':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_yue_Hans;\n    break;\n  case 'yue_Hans_CN':\n  case 'yue-Hans-CN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_yue_Hans_CN;\n    break;\n  case 'yue_Hant':\n  case 'yue-Hant':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_yue_Hant;\n    break;\n  case 'yue_Hant_HK':\n  case 'yue-Hant-HK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_yue_Hant_HK;\n    break;\n  case 'zgh':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zgh;\n    break;\n  case 'zgh_MA':\n  case 'zgh-MA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zgh_MA;\n    break;\n  case 'zh_Hans':\n  case 'zh-Hans':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zh_Hans;\n    break;\n  case 'zh_Hans_CN':\n  case 'zh-Hans-CN':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zh_Hans_CN;\n    break;\n  case 'zh_Hans_HK':\n  case 'zh-Hans-HK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zh_Hans_HK;\n    break;\n  case 'zh_Hans_MO':\n  case 'zh-Hans-MO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zh_Hans_MO;\n    break;\n  case 'zh_Hans_SG':\n  case 'zh-Hans-SG':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zh_Hans_SG;\n    break;\n  case 'zh_Hant':\n  case 'zh-Hant':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zh_Hant;\n    break;\n  case 'zh_Hant_HK':\n  case 'zh-Hant-HK':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zh_Hant_HK;\n    break;\n  case 'zh_Hant_MO':\n  case 'zh-Hant-MO':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zh_Hant_MO;\n    break;\n  case 'zh_Hant_TW':\n  case 'zh-Hant-TW':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zh_Hant_TW;\n    break;\n  case 'zu_ZA':\n  case 'zu-ZA':\n    goog.i18n.CompactNumberFormatSymbols = goog.i18n.CompactNumberFormatSymbols_zu_ZA;\n    break;\n}\n","^?",1579837703000,"^@",["^A",["^3","~$goog.i18n.CompactNumberFormatSymbols"]],"^D",["^ ","^E","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^F","^G","^H","^I","^J","Google Closure Library","^K","^L","^M","http://code.google.com/p/closure-library/","^N","^O","^P",["^L","0.0-20191016-6ae1f72f"],"^Q","0.0-20191016-6ae1f72f"],"^M",["^R","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/compactnumberformatsymbolsext.js"],"^S",["^A",["~$goog.i18n.CompactNumberFormatSymbols-ta-MY","~$goog.i18n.CompactNumberFormatSymbols-sr-Cyrl-BA","~$goog.i18n.CompactNumberFormatSymbols_naq","~$goog.i18n.CompactNumberFormatSymbols-fo-DK","~$goog.i18n.CompactNumberFormatSymbols_so_ET","~$goog.i18n.CompactNumberFormatSymbols_zh_Hant_HK","~$goog.i18n.CompactNumberFormatSymbols_en_GU","~$goog.i18n.CompactNumberFormatSymbols-mua","~$goog.i18n.CompactNumberFormatSymbols_brx_IN","~$goog.i18n.CompactNumberFormatSymbols-sr-Latn-XK","~$goog.i18n.CompactNumberFormatSymbols_sg","~$goog.i18n.CompactNumberFormatSymbols-en-SS","~$goog.i18n.CompactNumberFormatSymbols_en_SE","~$goog.i18n.CompactNumberFormatSymbols-es-BO","~$goog.i18n.CompactNumberFormatSymbols-ar-ER","~$goog.i18n.CompactNumberFormatSymbols_pt_GQ","~$goog.i18n.CompactNumberFormatSymbols-kok-IN","~$goog.i18n.CompactNumberFormatSymbols_rwk_TZ","~$goog.i18n.CompactNumberFormatSymbols-en-KN","~$goog.i18n.CompactNumberFormatSymbols-bez","~$goog.i18n.CompactNumberFormatSymbols-ml-IN","~$goog.i18n.CompactNumberFormatSymbols-en-150","~$goog.i18n.CompactNumberFormatSymbols-smn","~$goog.i18n.CompactNumberFormatSymbols_en_SH","~$goog.i18n.CompactNumberFormatSymbols_ar_LB","~$goog.i18n.CompactNumberFormatSymbols_en_MT","~$goog.i18n.CompactNumberFormatSymbols_mzn","~$goog.i18n.CompactNumberFormatSymbols_mgo_CM","~$goog.i18n.CompactNumberFormatSymbols-en-FM","~$goog.i18n.CompactNumberFormatSymbols-nb-SJ","~$goog.i18n.CompactNumberFormatSymbols-bm-ML","~$goog.i18n.CompactNumberFormatSymbols_asa","~$goog.i18n.CompactNumberFormatSymbols-wae-CH","~$goog.i18n.CompactNumberFormatSymbols_jgo_CM","~$goog.i18n.CompactNumberFormatSymbols_en_GI","~$goog.i18n.CompactNumberFormatSymbols-el-CY","~$goog.i18n.CompactNumberFormatSymbols-zh-Hans","~$goog.i18n.CompactNumberFormatSymbols_wae_CH","~$goog.i18n.CompactNumberFormatSymbols-tt","~$goog.i18n.CompactNumberFormatSymbols-ar-BH","~$goog.i18n.CompactNumberFormatSymbols-ff-Latn-MR","~$goog.i18n.CompactNumberFormatSymbols_dyo_SN","~$goog.i18n.CompactNumberFormatSymbols-bo-CN","~$goog.i18n.CompactNumberFormatSymbols-ee-GH","~$goog.i18n.CompactNumberFormatSymbols_sr_Latn_XK","~$goog.i18n.CompactNumberFormatSymbols_cs_CZ","~$goog.i18n.CompactNumberFormatSymbols_fr_BF","~$goog.i18n.CompactNumberFormatSymbols-nnh-CM","~$goog.i18n.CompactNumberFormatSymbolsExt","~$goog.i18n.CompactNumberFormatSymbols_wae","~$goog.i18n.CompactNumberFormatSymbols_en_SZ","~$goog.i18n.CompactNumberFormatSymbols-gsw-CH","~$goog.i18n.CompactNumberFormatSymbols-en-VC","~$goog.i18n.CompactNumberFormatSymbols-bo","~$goog.i18n.CompactNumberFormatSymbols-sv-FI","~$goog.i18n.CompactNumberFormatSymbols_en_US_POSIX","~$goog.i18n.CompactNumberFormatSymbols_en_RW","~$goog.i18n.CompactNumberFormatSymbols-rof-TZ","~$goog.i18n.CompactNumberFormatSymbols_ku","~$goog.i18n.CompactNumberFormatSymbols_fr_PM","~$goog.i18n.CompactNumberFormatSymbols_nl_NL","~$goog.i18n.CompactNumberFormatSymbols-lag-TZ","~$goog.i18n.CompactNumberFormatSymbols_en_UM","~$goog.i18n.CompactNumberFormatSymbols-ga-IE","~$goog.i18n.CompactNumberFormatSymbols-fr-CF","~$goog.i18n.CompactNumberFormatSymbols-es-UY","~$goog.i18n.CompactNumberFormatSymbols_be_BY","~$goog.i18n.CompactNumberFormatSymbols-en-DE","~$goog.i18n.CompactNumberFormatSymbols-es-PA","~$goog.i18n.CompactNumberFormatSymbols-fr-GN","~$goog.i18n.CompactNumberFormatSymbols-es-CO","~$goog.i18n.CompactNumberFormatSymbols-ru-KG","~$goog.i18n.CompactNumberFormatSymbols_dyo","~$goog.i18n.CompactNumberFormatSymbols-om","~$goog.i18n.CompactNumberFormatSymbols-brx-IN","~$goog.i18n.CompactNumberFormatSymbols_shi_Latn_MA","~$goog.i18n.CompactNumberFormatSymbols_bas","~$goog.i18n.CompactNumberFormatSymbols_eo_001","~$goog.i18n.CompactNumberFormatSymbols_yi","~$goog.i18n.CompactNumberFormatSymbols-ff-Latn-GW","~$goog.i18n.CompactNumberFormatSymbols-tg-TJ","~$goog.i18n.CompactNumberFormatSymbols-seh","~$goog.i18n.CompactNumberFormatSymbols-wae","~$goog.i18n.CompactNumberFormatSymbols-lb","~$goog.i18n.CompactNumberFormatSymbols_ta_LK","~$goog.i18n.CompactNumberFormatSymbols-km-KH","~$goog.i18n.CompactNumberFormatSymbols-fr-GF","~$goog.i18n.CompactNumberFormatSymbols-ar-SO","~$goog.i18n.CompactNumberFormatSymbols-mg","~$goog.i18n.CompactNumberFormatSymbols-fr-TG","~$goog.i18n.CompactNumberFormatSymbols-en-WS","~$goog.i18n.CompactNumberFormatSymbols-en-MU","~$goog.i18n.CompactNumberFormatSymbols-ccp","~$goog.i18n.CompactNumberFormatSymbols_en_LR","~$goog.i18n.CompactNumberFormatSymbols_en_LS","~$goog.i18n.CompactNumberFormatSymbols_ar_ER","~$goog.i18n.CompactNumberFormatSymbols-en-GG","~$goog.i18n.CompactNumberFormatSymbols-ln-CF","~$goog.i18n.CompactNumberFormatSymbols_sr_Cyrl","~$goog.i18n.CompactNumberFormatSymbols_ig","~$goog.i18n.CompactNumberFormatSymbols-ig-NG","~$goog.i18n.CompactNumberFormatSymbols_agq_CM","~$goog.i18n.CompactNumberFormatSymbols-asa-TZ","~$goog.i18n.CompactNumberFormatSymbols_en_FI","~$goog.i18n.CompactNumberFormatSymbols_en_SC","~$goog.i18n.CompactNumberFormatSymbols-es-AR","~$goog.i18n.CompactNumberFormatSymbols-uz-Arab-AF","~$goog.i18n.CompactNumberFormatSymbols-ur-PK","~$goog.i18n.CompactNumberFormatSymbols-dav-KE","~$goog.i18n.CompactNumberFormatSymbols_mfe","~$goog.i18n.CompactNumberFormatSymbols-fr-LU","~$goog.i18n.CompactNumberFormatSymbols-sah-RU","~$goog.i18n.CompactNumberFormatSymbols_gd","~$goog.i18n.CompactNumberFormatSymbols_pa_Arab","~$goog.i18n.CompactNumberFormatSymbols_en_DK","~$goog.i18n.CompactNumberFormatSymbols_am_ET","~$goog.i18n.CompactNumberFormatSymbols_ne_IN","~$goog.i18n.CompactNumberFormatSymbols-sd","~$goog.i18n.CompactNumberFormatSymbols-agq","~$goog.i18n.CompactNumberFormatSymbols-en-NU","~$goog.i18n.CompactNumberFormatSymbols_ms_MY","~$goog.i18n.CompactNumberFormatSymbols_os_RU","~$goog.i18n.CompactNumberFormatSymbols-ku-TR","~$goog.i18n.CompactNumberFormatSymbols_ms_BN","~$goog.i18n.CompactNumberFormatSymbols_gu_IN","~$goog.i18n.CompactNumberFormatSymbols-zgh","~$goog.i18n.CompactNumberFormatSymbols-es-PH","~$goog.i18n.CompactNumberFormatSymbols-qu-PE","~$goog.i18n.CompactNumberFormatSymbols-ar-OM","~$goog.i18n.CompactNumberFormatSymbols-tk","~$goog.i18n.CompactNumberFormatSymbols_bem","~$goog.i18n.CompactNumberFormatSymbols-seh-MZ","~$goog.i18n.CompactNumberFormatSymbols_nl_BE","~$goog.i18n.CompactNumberFormatSymbols_en_CX","~$goog.i18n.CompactNumberFormatSymbols_om_ET","~$goog.i18n.CompactNumberFormatSymbols_en_NG","~$goog.i18n.CompactNumberFormatSymbols_yue_Hans_CN","~$goog.i18n.CompactNumberFormatSymbols_pt_TL","~$goog.i18n.CompactNumberFormatSymbols-pt-MO","~$goog.i18n.CompactNumberFormatSymbols_ckb","~$goog.i18n.CompactNumberFormatSymbols-ksb","~$goog.i18n.CompactNumberFormatSymbols_sl_SI","~$goog.i18n.CompactNumberFormatSymbols-mas-KE","~$goog.i18n.CompactNumberFormatSymbols-es-CU","~$goog.i18n.CompactNumberFormatSymbols-nyn","~$goog.i18n.CompactNumberFormatSymbols_lb_LU","~$goog.i18n.CompactNumberFormatSymbols-luy","~$goog.i18n.CompactNumberFormatSymbols_ast","~$goog.i18n.CompactNumberFormatSymbols_ar_TN","~$goog.i18n.CompactNumberFormatSymbols_en_LC","~$goog.i18n.CompactNumberFormatSymbols-zh-Hant","~$goog.i18n.CompactNumberFormatSymbols_es_EA","~$goog.i18n.CompactNumberFormatSymbols_or_IN","~$goog.i18n.CompactNumberFormatSymbols-gu-IN","~$goog.i18n.CompactNumberFormatSymbols_kea_CV","~$goog.i18n.CompactNumberFormatSymbols_gl_ES","~$goog.i18n.CompactNumberFormatSymbols-mfe-MU","~$goog.i18n.CompactNumberFormatSymbols-en-ZM","~$goog.i18n.CompactNumberFormatSymbols-ff-Latn-GH","~$goog.i18n.CompactNumberFormatSymbols-fr-NC","~$goog.i18n.CompactNumberFormatSymbols-pt-GW","~$goog.i18n.CompactNumberFormatSymbols_ar_EH","~$goog.i18n.CompactNumberFormatSymbols-mua-CM","~$goog.i18n.CompactNumberFormatSymbols-en-CH","~$goog.i18n.CompactNumberFormatSymbols_es_SV","~$goog.i18n.CompactNumberFormatSymbols_dav","~$goog.i18n.CompactNumberFormatSymbols-en-SX","~$goog.i18n.CompactNumberFormatSymbols_fr_GN","~$goog.i18n.CompactNumberFormatSymbols_kl","~$goog.i18n.CompactNumberFormatSymbols-en-KI","~$goog.i18n.CompactNumberFormatSymbols_mg_MG","~$goog.i18n.CompactNumberFormatSymbols-lv-LV","~$goog.i18n.CompactNumberFormatSymbols-qu-EC","~$goog.i18n.CompactNumberFormatSymbols-en-PK","~$goog.i18n.CompactNumberFormatSymbols_en_BM","~$goog.i18n.CompactNumberFormatSymbols-fr-CD","~$goog.i18n.CompactNumberFormatSymbols-sd-PK","~$goog.i18n.CompactNumberFormatSymbols-luo","~$goog.i18n.CompactNumberFormatSymbols_qu_PE","~$goog.i18n.CompactNumberFormatSymbols-gl-ES","~$goog.i18n.CompactNumberFormatSymbols_pa_Arab_PK","~$goog.i18n.CompactNumberFormatSymbols-fr-MU","~$goog.i18n.CompactNumberFormatSymbols-es-PR","~$goog.i18n.CompactNumberFormatSymbols-en-PW","~$goog.i18n.CompactNumberFormatSymbols-es-BZ","~$goog.i18n.CompactNumberFormatSymbols_es_PA","~$goog.i18n.CompactNumberFormatSymbols-mfe","~$goog.i18n.CompactNumberFormatSymbols-ia-001","~$goog.i18n.CompactNumberFormatSymbols-en-BZ","~$goog.i18n.CompactNumberFormatSymbols-ln-AO","~$goog.i18n.CompactNumberFormatSymbols_ar_LY","~$goog.i18n.CompactNumberFormatSymbols-es-VE","~$goog.i18n.CompactNumberFormatSymbols_fr_NE","~$goog.i18n.CompactNumberFormatSymbols-gd-GB","~$goog.i18n.CompactNumberFormatSymbols_sw_TZ","~$goog.i18n.CompactNumberFormatSymbols-th-TH","~$goog.i18n.CompactNumberFormatSymbols_en_KN","~$goog.i18n.CompactNumberFormatSymbols-lg","~$goog.i18n.CompactNumberFormatSymbols_fr_FR","~$goog.i18n.CompactNumberFormatSymbols_kln","~$goog.i18n.CompactNumberFormatSymbols_en_VG","~$goog.i18n.CompactNumberFormatSymbols-nb-NO","~$goog.i18n.CompactNumberFormatSymbols_sk_SK","~$goog.i18n.CompactNumberFormatSymbols_luy","~$goog.i18n.CompactNumberFormatSymbols-hu-HU","~$goog.i18n.CompactNumberFormatSymbols_ru_BY","~$goog.i18n.CompactNumberFormatSymbols-ar-DJ","~$goog.i18n.CompactNumberFormatSymbols_en_AS","~$goog.i18n.CompactNumberFormatSymbols-kln-KE","~$goog.i18n.CompactNumberFormatSymbols_jv","~$goog.i18n.CompactNumberFormatSymbols-mzn-IR","~$goog.i18n.CompactNumberFormatSymbols_nl_AW","~$goog.i18n.CompactNumberFormatSymbols_ia","~$goog.i18n.CompactNumberFormatSymbols-fr-MQ","~$goog.i18n.CompactNumberFormatSymbols-fr-CI","~$goog.i18n.CompactNumberFormatSymbols_fa_AF","~$goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_ME","~$goog.i18n.CompactNumberFormatSymbols_hi_IN","~$goog.i18n.CompactNumberFormatSymbols_pa_Guru","~$goog.i18n.CompactNumberFormatSymbols_kea","~$goog.i18n.CompactNumberFormatSymbols_tk","~$goog.i18n.CompactNumberFormatSymbols_kab_DZ","~$goog.i18n.CompactNumberFormatSymbols-lrc","~$goog.i18n.CompactNumberFormatSymbols_ar_MA","~$goog.i18n.CompactNumberFormatSymbols_nmg","~$goog.i18n.CompactNumberFormatSymbols_en_VI","~$goog.i18n.CompactNumberFormatSymbols-ar-MR","~$goog.i18n.CompactNumberFormatSymbols_ksb_TZ","~$goog.i18n.CompactNumberFormatSymbols_en_AG","~$goog.i18n.CompactNumberFormatSymbols-vai-Vaii","~$goog.i18n.CompactNumberFormatSymbols-wo","~$goog.i18n.CompactNumberFormatSymbols-ka-GE","~$goog.i18n.CompactNumberFormatSymbols_gd_GB","~$goog.i18n.CompactNumberFormatSymbols-en-SL","~$goog.i18n.CompactNumberFormatSymbols_pt_AO","~$goog.i18n.CompactNumberFormatSymbols-en-TK","~$goog.i18n.CompactNumberFormatSymbols-ar-SY","~$goog.i18n.CompactNumberFormatSymbols_fr_CH","~$goog.i18n.CompactNumberFormatSymbols_en_MU","~$goog.i18n.CompactNumberFormatSymbols-smn-FI","~$goog.i18n.CompactNumberFormatSymbols-tt-RU","~$goog.i18n.CompactNumberFormatSymbols-ff","~$goog.i18n.CompactNumberFormatSymbols_rw","~$goog.i18n.CompactNumberFormatSymbols-en-TV","~$goog.i18n.CompactNumberFormatSymbols-mgh","~$goog.i18n.CompactNumberFormatSymbols_zh_Hans_MO","~$goog.i18n.CompactNumberFormatSymbols-fr-DZ","~$goog.i18n.CompactNumberFormatSymbols_brx","~$goog.i18n.CompactNumberFormatSymbols-zh-Hant-HK","~$goog.i18n.CompactNumberFormatSymbols-ar-KM","~$goog.i18n.CompactNumberFormatSymbols-ar-SS","~$goog.i18n.CompactNumberFormatSymbols_ccp_BD","~$goog.i18n.CompactNumberFormatSymbols-fr-YT","~$goog.i18n.CompactNumberFormatSymbols_se_SE","~$goog.i18n.CompactNumberFormatSymbols-en-VU","~$goog.i18n.CompactNumberFormatSymbols_ebu","~$goog.i18n.CompactNumberFormatSymbols_gsw_CH","~$goog.i18n.CompactNumberFormatSymbols_rm_CH","~$goog.i18n.CompactNumberFormatSymbols_en_BZ","~$goog.i18n.CompactNumberFormatSymbols-wo-SN","~$goog.i18n.CompactNumberFormatSymbols_vai","~$goog.i18n.CompactNumberFormatSymbols_fil_PH","~$goog.i18n.CompactNumberFormatSymbols-es-CR","~$goog.i18n.CompactNumberFormatSymbols_fy_NL","~$goog.i18n.CompactNumberFormatSymbols-en-CX","~$goog.i18n.CompactNumberFormatSymbols-tr-CY","~$goog.i18n.CompactNumberFormatSymbols-sr-Cyrl-XK","~$goog.i18n.CompactNumberFormatSymbols_ff_Latn_GH","~$goog.i18n.CompactNumberFormatSymbols_bas_CM","~$goog.i18n.CompactNumberFormatSymbols-en-PR","~$goog.i18n.CompactNumberFormatSymbols_es_PE","~$goog.i18n.CompactNumberFormatSymbols-sw-UG","~$goog.i18n.CompactNumberFormatSymbols_bs_Latn_BA","~$goog.i18n.CompactNumberFormatSymbols-gv-IM","~$goog.i18n.CompactNumberFormatSymbols_ia_001","~$goog.i18n.CompactNumberFormatSymbols-br-FR","~$goog.i18n.CompactNumberFormatSymbols-fr-MF","~$goog.i18n.CompactNumberFormatSymbols-kn-IN","~$goog.i18n.CompactNumberFormatSymbols-ks","~$goog.i18n.CompactNumberFormatSymbols_chr_US","~$goog.i18n.CompactNumberFormatSymbols-fr-BL","~$goog.i18n.CompactNumberFormatSymbols-ksf","~$goog.i18n.CompactNumberFormatSymbols-mgh-MZ","~$goog.i18n.CompactNumberFormatSymbols-uz-Latn-UZ","~$goog.i18n.CompactNumberFormatSymbols_kk_KZ","~$goog.i18n.CompactNumberFormatSymbols-mn-MN","~$goog.i18n.CompactNumberFormatSymbols-vai-Vaii-LR","~$goog.i18n.CompactNumberFormatSymbols-de-IT","~$goog.i18n.CompactNumberFormatSymbols-zu-ZA","~$goog.i18n.CompactNumberFormatSymbols-dje-NE","~$goog.i18n.CompactNumberFormatSymbols-ar-EH","~$goog.i18n.CompactNumberFormatSymbols_en_ZM","~$goog.i18n.CompactNumberFormatSymbols-tzm","~$goog.i18n.CompactNumberFormatSymbols_en_PK","~$goog.i18n.CompactNumberFormatSymbols_gv_IM","~$goog.i18n.CompactNumberFormatSymbols_ses_ML","~$goog.i18n.CompactNumberFormatSymbols_luy_KE","~$goog.i18n.CompactNumberFormatSymbols-agq-CM","~$goog.i18n.CompactNumberFormatSymbols-mt-MT","~$goog.i18n.CompactNumberFormatSymbols_ff_Latn_GN","~$goog.i18n.CompactNumberFormatSymbols-en-VI","~$goog.i18n.CompactNumberFormatSymbols_en_SD","~$goog.i18n.CompactNumberFormatSymbols-en-BE","~$goog.i18n.CompactNumberFormatSymbols_es_PR","~$goog.i18n.CompactNumberFormatSymbols-ar-AE","~$goog.i18n.CompactNumberFormatSymbols-en-BI","~$goog.i18n.CompactNumberFormatSymbols-en-XA","~$goog.i18n.CompactNumberFormatSymbols-ii","~$goog.i18n.CompactNumberFormatSymbols_ar_SA","~$goog.i18n.CompactNumberFormatSymbols-tzm-MA","~$goog.i18n.CompactNumberFormatSymbols_fr_MA","~$goog.i18n.CompactNumberFormatSymbols-ar-QA","~$goog.i18n.CompactNumberFormatSymbols-bs-Latn","~$goog.i18n.CompactNumberFormatSymbols_fo","~$goog.i18n.CompactNumberFormatSymbols-pa-Guru","~$goog.i18n.CompactNumberFormatSymbols_ca_FR","~$goog.i18n.CompactNumberFormatSymbols_sah","~$goog.i18n.CompactNumberFormatSymbols-ta-IN","~$goog.i18n.CompactNumberFormatSymbols-en-NF","~$goog.i18n.CompactNumberFormatSymbols-to","~$goog.i18n.CompactNumberFormatSymbols_ar_KM","~$goog.i18n.CompactNumberFormatSymbols-sq-MK","~$goog.i18n.CompactNumberFormatSymbols-ca-AD","~$goog.i18n.CompactNumberFormatSymbols_ka_GE","~$goog.i18n.CompactNumberFormatSymbols_it_SM","~$goog.i18n.CompactNumberFormatSymbols_ar_YE","~$goog.i18n.CompactNumberFormatSymbols-it-CH","~$goog.i18n.CompactNumberFormatSymbols_tg","~$goog.i18n.CompactNumberFormatSymbols_de_LI","~$goog.i18n.CompactNumberFormatSymbols_ewo_CM","~$goog.i18n.CompactNumberFormatSymbols-sw-TZ","~$goog.i18n.CompactNumberFormatSymbols-so","~$goog.i18n.CompactNumberFormatSymbols-om-KE","~$goog.i18n.CompactNumberFormatSymbols_ar_DJ","~$goog.i18n.CompactNumberFormatSymbols-ms-BN","~$goog.i18n.CompactNumberFormatSymbols_ar_XB","~$goog.i18n.CompactNumberFormatSymbols_lt_LT","~$goog.i18n.CompactNumberFormatSymbols_en_TK","~$goog.i18n.CompactNumberFormatSymbols_ha_NE","~$goog.i18n.CompactNumberFormatSymbols-fr-MA","~$goog.i18n.CompactNumberFormatSymbols_rw_RW","~$goog.i18n.CompactNumberFormatSymbols-ksb-TZ","~$goog.i18n.CompactNumberFormatSymbols_vun","~$goog.i18n.CompactNumberFormatSymbols-ewo","~$goog.i18n.CompactNumberFormatSymbols_vai_Vaii_LR","~$goog.i18n.CompactNumberFormatSymbols-yue-Hant-HK","~$goog.i18n.CompactNumberFormatSymbols-ce","~$goog.i18n.CompactNumberFormatSymbols_uz_Arab","~$goog.i18n.CompactNumberFormatSymbols_pt_GW","~$goog.i18n.CompactNumberFormatSymbols-ug-CN","~$goog.i18n.CompactNumberFormatSymbols-yue","~$goog.i18n.CompactNumberFormatSymbols_ar_SY","~$goog.i18n.CompactNumberFormatSymbols_de_LU","~$goog.i18n.CompactNumberFormatSymbols_yue_Hant_HK","~$goog.i18n.CompactNumberFormatSymbols-en-MG","~$goog.i18n.CompactNumberFormatSymbols_es_VE","~$goog.i18n.CompactNumberFormatSymbols_fr_MF","~$goog.i18n.CompactNumberFormatSymbols_bez","~$goog.i18n.CompactNumberFormatSymbols-ar-TN","~$goog.i18n.CompactNumberFormatSymbols-ak","~$goog.i18n.CompactNumberFormatSymbols_fi_FI","~$goog.i18n.CompactNumberFormatSymbols_fr_TD","~$goog.i18n.CompactNumberFormatSymbols-ms-SG","~$goog.i18n.CompactNumberFormatSymbols_es_BZ","~$goog.i18n.CompactNumberFormatSymbols-pt-AO","~$goog.i18n.CompactNumberFormatSymbols-en-MY","~$goog.i18n.CompactNumberFormatSymbols_ar_BH","~$goog.i18n.CompactNumberFormatSymbols_el_GR","~$goog.i18n.CompactNumberFormatSymbols-ar-TD","~$goog.i18n.CompactNumberFormatSymbols-en-MW","~$goog.i18n.CompactNumberFormatSymbols-ff-Latn-SN","~$goog.i18n.CompactNumberFormatSymbols_ha_NG","~$goog.i18n.CompactNumberFormatSymbols_ti","~$goog.i18n.CompactNumberFormatSymbols-ff-Latn-CM","~$goog.i18n.CompactNumberFormatSymbols-nus-SS","~$goog.i18n.CompactNumberFormatSymbols-ak-GH","~$goog.i18n.CompactNumberFormatSymbols-kkj-CM","~$goog.i18n.CompactNumberFormatSymbols-lb-LU","~$goog.i18n.CompactNumberFormatSymbols_ar_IL","~$goog.i18n.CompactNumberFormatSymbols_sw_UG","~$goog.i18n.CompactNumberFormatSymbols_ca_IT","~$goog.i18n.CompactNumberFormatSymbols_tr_CY","~$goog.i18n.CompactNumberFormatSymbols_en_MW","~$goog.i18n.CompactNumberFormatSymbols-sr-Cyrl","~$goog.i18n.CompactNumberFormatSymbols-pl-PL","~$goog.i18n.CompactNumberFormatSymbols-en-TZ","~$goog.i18n.CompactNumberFormatSymbols_ff_Latn_CM","~$goog.i18n.CompactNumberFormatSymbols_shi","~$goog.i18n.CompactNumberFormatSymbols_uz_Arab_AF","~$goog.i18n.CompactNumberFormatSymbols_so_DJ","~$goog.i18n.CompactNumberFormatSymbols_sn","~$goog.i18n.CompactNumberFormatSymbols_en_PH","~$goog.i18n.CompactNumberFormatSymbols_om","~$goog.i18n.CompactNumberFormatSymbols_nl_SX","~$goog.i18n.CompactNumberFormatSymbols-ne-NP","~$goog.i18n.CompactNumberFormatSymbols-te-IN","~$goog.i18n.CompactNumberFormatSymbols_en_TC","~$goog.i18n.CompactNumberFormatSymbols_naq_NA","~$goog.i18n.CompactNumberFormatSymbols_yo_BJ","~$goog.i18n.CompactNumberFormatSymbols_en_DE","~$goog.i18n.CompactNumberFormatSymbols_smn","~$goog.i18n.CompactNumberFormatSymbols-nds","~$goog.i18n.CompactNumberFormatSymbols_nds_NL","~$goog.i18n.CompactNumberFormatSymbols-rwk","~$goog.i18n.CompactNumberFormatSymbols_en_MY","~$goog.i18n.CompactNumberFormatSymbols-dav","~$goog.i18n.CompactNumberFormatSymbols_sr_Latn_RS","~$goog.i18n.CompactNumberFormatSymbols-ff-Latn-BF","~$goog.i18n.CompactNumberFormatSymbols_nyn","~$goog.i18n.CompactNumberFormatSymbols-fr-GQ","~$goog.i18n.CompactNumberFormatSymbols-ia","~$goog.i18n.CompactNumberFormatSymbols-ccp-IN","~$goog.i18n.CompactNumberFormatSymbols_en_VC","~$goog.i18n.CompactNumberFormatSymbols-es-EA","~$goog.i18n.CompactNumberFormatSymbols_ee_GH","~$goog.i18n.CompactNumberFormatSymbols_fr_SY","~$goog.i18n.CompactNumberFormatSymbols-ki-KE","~$goog.i18n.CompactNumberFormatSymbols-nus","~$goog.i18n.CompactNumberFormatSymbols_ff_Latn_NG","~$goog.i18n.CompactNumberFormatSymbols-pt-ST","~$goog.i18n.CompactNumberFormatSymbols_en_PG","~$goog.i18n.CompactNumberFormatSymbols_en_IO","~$goog.i18n.CompactNumberFormatSymbols_ak","~$goog.i18n.CompactNumberFormatSymbols-az-Cyrl","~$goog.i18n.CompactNumberFormatSymbols_ast_ES","~$goog.i18n.CompactNumberFormatSymbols-nl-CW","~$goog.i18n.CompactNumberFormatSymbols-guz","~$goog.i18n.CompactNumberFormatSymbols_ii_CN","~$goog.i18n.CompactNumberFormatSymbols-uz-Cyrl-UZ","~$goog.i18n.CompactNumberFormatSymbols_en_JE","~$goog.i18n.CompactNumberFormatSymbols-kln","~$goog.i18n.CompactNumberFormatSymbols_es_IC","~$goog.i18n.CompactNumberFormatSymbols_fr_MU","~$goog.i18n.CompactNumberFormatSymbols_om_KE","~$goog.i18n.CompactNumberFormatSymbols-lt-LT","~$goog.i18n.CompactNumberFormatSymbols_so_SO","~$goog.i18n.CompactNumberFormatSymbols-fr-MC","~$goog.i18n.CompactNumberFormatSymbols-as","~$goog.i18n.CompactNumberFormatSymbols-da-GL","~$goog.i18n.CompactNumberFormatSymbols-en-AT","~$goog.i18n.CompactNumberFormatSymbols_az_Latn","~$goog.i18n.CompactNumberFormatSymbols-ar-IL","~$goog.i18n.CompactNumberFormatSymbols_es_PH","~$goog.i18n.CompactNumberFormatSymbols_ff_Latn","~$goog.i18n.CompactNumberFormatSymbols-yue-Hans-CN","~$goog.i18n.CompactNumberFormatSymbols-naq","~$goog.i18n.CompactNumberFormatSymbols_te_IN","~$goog.i18n.CompactNumberFormatSymbols-xh","~$goog.i18n.CompactNumberFormatSymbols-en-SH","~$goog.i18n.CompactNumberFormatSymbols_luo","~$goog.i18n.CompactNumberFormatSymbols_ckb_IQ","~$goog.i18n.CompactNumberFormatSymbols_vai_Latn_LR","~$goog.i18n.CompactNumberFormatSymbols-en-FI","~$goog.i18n.CompactNumberFormatSymbols_fr_CM","~$goog.i18n.CompactNumberFormatSymbols-de-LI","~$goog.i18n.CompactNumberFormatSymbols-yav","~$goog.i18n.CompactNumberFormatSymbols_haw_US","~$goog.i18n.CompactNumberFormatSymbols-rn-BI","~$goog.i18n.CompactNumberFormatSymbols_fr_MQ","~$goog.i18n.CompactNumberFormatSymbols_lu","~$goog.i18n.CompactNumberFormatSymbols-nd-ZW","~$goog.i18n.CompactNumberFormatSymbols_fr_ML","~$goog.i18n.CompactNumberFormatSymbols_en_MO","~$goog.i18n.CompactNumberFormatSymbols_mer_KE","~$goog.i18n.CompactNumberFormatSymbols_gsw_FR","~$goog.i18n.CompactNumberFormatSymbols_en_TO","~$goog.i18n.CompactNumberFormatSymbols_nus_SS","~$goog.i18n.CompactNumberFormatSymbols_kok_IN","~$goog.i18n.CompactNumberFormatSymbols_lag_TZ","~$goog.i18n.CompactNumberFormatSymbols-ar-MA","~$goog.i18n.CompactNumberFormatSymbols_rn","~$goog.i18n.CompactNumberFormatSymbols_fy","~$goog.i18n.CompactNumberFormatSymbols_en_BI","~$goog.i18n.CompactNumberFormatSymbols-fy-NL","~$goog.i18n.CompactNumberFormatSymbols_ar_PS","~$goog.i18n.CompactNumberFormatSymbols_zu_ZA","~$goog.i18n.CompactNumberFormatSymbols-af-NA","~$goog.i18n.CompactNumberFormatSymbols-kl-GL","~$goog.i18n.CompactNumberFormatSymbols-es-GT","~$goog.i18n.CompactNumberFormatSymbols-en-MO","~$goog.i18n.CompactNumberFormatSymbols-fr-PM","~$goog.i18n.CompactNumberFormatSymbols-en-NL","~$goog.i18n.CompactNumberFormatSymbols_sah_RU","~$goog.i18n.CompactNumberFormatSymbols_fr_SC","~$goog.i18n.CompactNumberFormatSymbols-ff-Latn","~$goog.i18n.CompactNumberFormatSymbols-nnh","~$goog.i18n.CompactNumberFormatSymbols_ff_Latn_MR","~$goog.i18n.CompactNumberFormatSymbols-en-KY","~$goog.i18n.CompactNumberFormatSymbols-fr-GA","~$goog.i18n.CompactNumberFormatSymbols-es-IC","~$goog.i18n.CompactNumberFormatSymbols_ses","~$goog.i18n.CompactNumberFormatSymbols-ceb-PH","~$goog.i18n.CompactNumberFormatSymbols-sr-Latn-RS","~$goog.i18n.CompactNumberFormatSymbols_zh_Hant_MO","~$goog.i18n.CompactNumberFormatSymbols_tt_RU","~$goog.i18n.CompactNumberFormatSymbols_teo","~$goog.i18n.CompactNumberFormatSymbols-af-ZA","~$goog.i18n.CompactNumberFormatSymbols_en_GD","~$goog.i18n.CompactNumberFormatSymbols-es-DO","~$goog.i18n.CompactNumberFormatSymbols-fr-GP","~$goog.i18n.CompactNumberFormatSymbols-en-DG","~$goog.i18n.CompactNumberFormatSymbols_en_BS","~$goog.i18n.CompactNumberFormatSymbols_bez_TZ","~$goog.i18n.CompactNumberFormatSymbols_ar_001","~$goog.i18n.CompactNumberFormatSymbols-pa-Guru-IN","~$goog.i18n.CompactNumberFormatSymbols_en_PW","~$goog.i18n.CompactNumberFormatSymbols_zh_Hans_CN","~$goog.i18n.CompactNumberFormatSymbols-fr-PF","~$goog.i18n.CompactNumberFormatSymbols_vun_TZ","~$goog.i18n.CompactNumberFormatSymbols_lu_CD","~$goog.i18n.CompactNumberFormatSymbols-ru-BY","~$goog.i18n.CompactNumberFormatSymbols-bs-Cyrl","~$goog.i18n.CompactNumberFormatSymbols_se_FI","~$goog.i18n.CompactNumberFormatSymbols_lg","~$goog.i18n.CompactNumberFormatSymbols_tg_TJ","~$goog.i18n.CompactNumberFormatSymbols_fr_BE","~$goog.i18n.CompactNumberFormatSymbols_en_AI","~$goog.i18n.CompactNumberFormatSymbols_pt_LU","~$goog.i18n.CompactNumberFormatSymbols_en_MH","~$goog.i18n.CompactNumberFormatSymbols-de-DE","~$goog.i18n.CompactNumberFormatSymbols-xog","~$goog.i18n.CompactNumberFormatSymbols_twq_NE","~$goog.i18n.CompactNumberFormatSymbols-kkj","~$goog.i18n.CompactNumberFormatSymbols-ha-NG","~$goog.i18n.CompactNumberFormatSymbols-cgg","~$goog.i18n.CompactNumberFormatSymbols_jv_ID","~$goog.i18n.CompactNumberFormatSymbols_gsw_LI","~$goog.i18n.CompactNumberFormatSymbols_en_PN","~$goog.i18n.CompactNumberFormatSymbols-se-FI","~$goog.i18n.CompactNumberFormatSymbols_en_001","~$goog.i18n.CompactNumberFormatSymbols-en-DK","~$goog.i18n.CompactNumberFormatSymbols_fr_GQ","~$goog.i18n.CompactNumberFormatSymbols_rn_BI","~$goog.i18n.CompactNumberFormatSymbols_is_IS","~$goog.i18n.CompactNumberFormatSymbols_bs_Cyrl","~$goog.i18n.CompactNumberFormatSymbols-ru-RU","~$goog.i18n.CompactNumberFormatSymbols_en_PR","~$goog.i18n.CompactNumberFormatSymbols_ff_Latn_GM","~$goog.i18n.CompactNumberFormatSymbols_fur_IT","~$goog.i18n.CompactNumberFormatSymbols_teo_UG","~$goog.i18n.CompactNumberFormatSymbols-en-VG","~$goog.i18n.CompactNumberFormatSymbols_fr_GF","~$goog.i18n.CompactNumberFormatSymbols-sr-Latn-ME","~$goog.i18n.CompactNumberFormatSymbols-lkt","~$goog.i18n.CompactNumberFormatSymbols-nl-NL","~$goog.i18n.CompactNumberFormatSymbols_as_IN","~$goog.i18n.CompactNumberFormatSymbols_ml_IN","~$goog.i18n.CompactNumberFormatSymbols-en-CC","~$goog.i18n.CompactNumberFormatSymbols-os-GE","~$goog.i18n.CompactNumberFormatSymbols_es_GQ","~$goog.i18n.CompactNumberFormatSymbols-fr-TD","~$goog.i18n.CompactNumberFormatSymbols-sah","~$goog.i18n.CompactNumberFormatSymbols-sr-Cyrl-RS","~$goog.i18n.CompactNumberFormatSymbols_ug_CN","~$goog.i18n.CompactNumberFormatSymbols_ru_KZ","~$goog.i18n.CompactNumberFormatSymbols_en_KE","~$goog.i18n.CompactNumberFormatSymbols_bg_BG","~$goog.i18n.CompactNumberFormatSymbols-en-NR","~$goog.i18n.CompactNumberFormatSymbols-en-CK","~$goog.i18n.CompactNumberFormatSymbols_en_GY","~$goog.i18n.CompactNumberFormatSymbols-fr-BF","~$goog.i18n.CompactNumberFormatSymbols-ebu-KE","~$goog.i18n.CompactNumberFormatSymbols_fr_BL","~$goog.i18n.CompactNumberFormatSymbols-ta-SG","~$goog.i18n.CompactNumberFormatSymbols_lv_LV","~$goog.i18n.CompactNumberFormatSymbols_ja_JP","~$goog.i18n.CompactNumberFormatSymbols_en_AT","~$goog.i18n.CompactNumberFormatSymbols_uz_Cyrl_UZ","~$goog.i18n.CompactNumberFormatSymbols-ti-ET","~$goog.i18n.CompactNumberFormatSymbols-sk-SK","~$goog.i18n.CompactNumberFormatSymbols_mt_MT","~$goog.i18n.CompactNumberFormatSymbols_hsb","~$goog.i18n.CompactNumberFormatSymbols_to_TO","~$goog.i18n.CompactNumberFormatSymbols-saq-KE","~$goog.i18n.CompactNumberFormatSymbols-mzn","~$goog.i18n.CompactNumberFormatSymbols_si_LK","~$goog.i18n.CompactNumberFormatSymbols-sbp","~$goog.i18n.CompactNumberFormatSymbols-es-EC","~$goog.i18n.CompactNumberFormatSymbols_saq_KE","~$goog.i18n.CompactNumberFormatSymbols_az_Latn_AZ","~$goog.i18n.CompactNumberFormatSymbols_sr_Latn_BA","~$goog.i18n.CompactNumberFormatSymbols-ta-LK","~$goog.i18n.CompactNumberFormatSymbols_dsb_DE","~$goog.i18n.CompactNumberFormatSymbols-kam-KE","~$goog.i18n.CompactNumberFormatSymbols_de_IT","~$goog.i18n.CompactNumberFormatSymbols_fr_NC","~$goog.i18n.CompactNumberFormatSymbols_sbp_TZ","~$goog.i18n.CompactNumberFormatSymbols_ky_KG","~$goog.i18n.CompactNumberFormatSymbols_asa_TZ","~$goog.i18n.CompactNumberFormatSymbols-nds-NL","~$goog.i18n.CompactNumberFormatSymbols-en-NG","~$goog.i18n.CompactNumberFormatSymbols-rn","~$goog.i18n.CompactNumberFormatSymbols-rw-RW","~$goog.i18n.CompactNumberFormatSymbols_en_FK","~$goog.i18n.CompactNumberFormatSymbols_ug","~$goog.i18n.CompactNumberFormatSymbols-shi","~$goog.i18n.CompactNumberFormatSymbols_ln_CG","~$goog.i18n.CompactNumberFormatSymbols_fa_IR","~$goog.i18n.CompactNumberFormatSymbols_fr_GA","~$goog.i18n.CompactNumberFormatSymbols-lkt-US","~$goog.i18n.CompactNumberFormatSymbols-en-MT","~$goog.i18n.CompactNumberFormatSymbols-az-Cyrl-AZ","~$goog.i18n.CompactNumberFormatSymbols-mk-MK","~$goog.i18n.CompactNumberFormatSymbols-sq-AL","~$goog.i18n.CompactNumberFormatSymbols_xh_ZA","~$goog.i18n.CompactNumberFormatSymbols_en_FM","~$goog.i18n.CompactNumberFormatSymbols-es-BR","~$goog.i18n.CompactNumberFormatSymbols-teo-KE","~$goog.i18n.CompactNumberFormatSymbols-uz-Latn","~$goog.i18n.CompactNumberFormatSymbols_zh_Hans_HK","~$goog.i18n.CompactNumberFormatSymbols_dje_NE","~$goog.i18n.CompactNumberFormatSymbols_kab","~$goog.i18n.CompactNumberFormatSymbols-en-AE","~$goog.i18n.CompactNumberFormatSymbols-ar-YE","~$goog.i18n.CompactNumberFormatSymbols-teo","~$goog.i18n.CompactNumberFormatSymbols-khq-ML","~$goog.i18n.CompactNumberFormatSymbols-ug","~$goog.i18n.CompactNumberFormatSymbols_eu_ES","~$goog.i18n.CompactNumberFormatSymbols_en_IM","~$goog.i18n.CompactNumberFormatSymbols_hr_BA","~$goog.i18n.CompactNumberFormatSymbols_et_EE","~$goog.i18n.CompactNumberFormatSymbols_pt_CH","~$goog.i18n.CompactNumberFormatSymbols-en-ZW","~$goog.i18n.CompactNumberFormatSymbols-en-SZ","~$goog.i18n.CompactNumberFormatSymbols_mas_KE","~$goog.i18n.CompactNumberFormatSymbols_ar_KW","~$goog.i18n.CompactNumberFormatSymbols_kl_GL","~$goog.i18n.CompactNumberFormatSymbols_ii","~$goog.i18n.CompactNumberFormatSymbols_ro_RO","~$goog.i18n.CompactNumberFormatSymbols_nd_ZW","~$goog.i18n.CompactNumberFormatSymbols_es_CR","~$goog.i18n.CompactNumberFormatSymbols-pt-GQ","~$goog.i18n.CompactNumberFormatSymbols-tk-TM","~$goog.i18n.CompactNumberFormatSymbols_ms_SG","~$goog.i18n.CompactNumberFormatSymbols_en_NU","~$goog.i18n.CompactNumberFormatSymbols_en_GM","~$goog.i18n.CompactNumberFormatSymbols_fr_DZ","~$goog.i18n.CompactNumberFormatSymbols_xog_UG","~$goog.i18n.CompactNumberFormatSymbols-bo-IN","~$goog.i18n.CompactNumberFormatSymbols_ccp","~$goog.i18n.CompactNumberFormatSymbols-pa-Arab-PK","~$goog.i18n.CompactNumberFormatSymbols_seh_MZ","~$goog.i18n.CompactNumberFormatSymbols-kam","~$goog.i18n.CompactNumberFormatSymbols-as-IN","~$goog.i18n.CompactNumberFormatSymbols-shi-Tfng-MA","~$goog.i18n.CompactNumberFormatSymbols_af_NA","~$goog.i18n.CompactNumberFormatSymbols_ln_CD","~$goog.i18n.CompactNumberFormatSymbols-cy-GB","~$goog.i18n.CompactNumberFormatSymbols_mgh_MZ","~$goog.i18n.CompactNumberFormatSymbols_yo_NG","~$goog.i18n.CompactNumberFormatSymbols_yav_CM","~$goog.i18n.CompactNumberFormatSymbols_vi_VN","~$goog.i18n.CompactNumberFormatSymbols_ksb","~$goog.i18n.CompactNumberFormatSymbols_sbp","~$goog.i18n.CompactNumberFormatSymbols_luo_KE","~$goog.i18n.CompactNumberFormatSymbols-lrc-IQ","~$goog.i18n.CompactNumberFormatSymbols-lu","~$goog.i18n.CompactNumberFormatSymbols-ps","~$goog.i18n.CompactNumberFormatSymbols_uz_Latn_UZ","~$goog.i18n.CompactNumberFormatSymbols-twq","~$goog.i18n.CompactNumberFormatSymbols-guz-KE","~$goog.i18n.CompactNumberFormatSymbols-en-TO","~$goog.i18n.CompactNumberFormatSymbols-zgh-MA","~$goog.i18n.CompactNumberFormatSymbols-fa-AF","~$goog.i18n.CompactNumberFormatSymbols_lb","~$goog.i18n.CompactNumberFormatSymbols-fr-FR","~$goog.i18n.CompactNumberFormatSymbols_he_IL","~$goog.i18n.CompactNumberFormatSymbols_kn_IN","~$goog.i18n.CompactNumberFormatSymbols-zh-Hant-TW","~$goog.i18n.CompactNumberFormatSymbols-pa-Arab","~$goog.i18n.CompactNumberFormatSymbols-mi-NZ","~$goog.i18n.CompactNumberFormatSymbols_guz_KE","~$goog.i18n.CompactNumberFormatSymbols-ar-IQ","~$goog.i18n.CompactNumberFormatSymbols_zgh","~$goog.i18n.CompactNumberFormatSymbols-dyo","~$goog.i18n.CompactNumberFormatSymbols-es-PE","~$goog.i18n.CompactNumberFormatSymbols_so","~$goog.i18n.CompactNumberFormatSymbols-shi-Latn","~$goog.i18n.CompactNumberFormatSymbols-zh-Hans-CN","~$goog.i18n.CompactNumberFormatSymbols_nmg_CM","~$goog.i18n.CompactNumberFormatSymbols_agq","~$goog.i18n.CompactNumberFormatSymbols_ff_Latn_GW","~$goog.i18n.CompactNumberFormatSymbols_pa_Guru_IN","~$goog.i18n.CompactNumberFormatSymbols-fil-PH","~$goog.i18n.CompactNumberFormatSymbols-ses-ML","~$goog.i18n.CompactNumberFormatSymbols_es_BO","~$goog.i18n.CompactNumberFormatSymbols-nn-NO","~$goog.i18n.CompactNumberFormatSymbols_en_NA","~$goog.i18n.CompactNumberFormatSymbols-hsb","~$goog.i18n.CompactNumberFormatSymbols-om-ET","~$goog.i18n.CompactNumberFormatSymbols_jgo","~$goog.i18n.CompactNumberFormatSymbols_ff_Latn_BF","~$goog.i18n.CompactNumberFormatSymbols_tzm","~$goog.i18n.CompactNumberFormatSymbols_es_NI","~$goog.i18n.CompactNumberFormatSymbols_kde_TZ","~$goog.i18n.CompactNumberFormatSymbols-vai","~$goog.i18n.CompactNumberFormatSymbols_uk_UA","~$goog.i18n.CompactNumberFormatSymbols-ks-IN","~$goog.i18n.CompactNumberFormatSymbols-fy","~$goog.i18n.CompactNumberFormatSymbols_sw_KE","~$goog.i18n.CompactNumberFormatSymbols-mas-TZ","~$goog.i18n.CompactNumberFormatSymbols_ee_TG","~$goog.i18n.CompactNumberFormatSymbols-yue-Hans","~$goog.i18n.CompactNumberFormatSymbols_zgh_MA","~$goog.i18n.CompactNumberFormatSymbols-fr-BJ","~$goog.i18n.CompactNumberFormatSymbols_nnh_CM","~$goog.i18n.CompactNumberFormatSymbols_es_BR","~$goog.i18n.CompactNumberFormatSymbols-nn","~$goog.i18n.CompactNumberFormatSymbols-ff-Latn-SL","~$goog.i18n.CompactNumberFormatSymbols_bs_Cyrl_BA","~$goog.i18n.CompactNumberFormatSymbols_en_GG","~$goog.i18n.CompactNumberFormatSymbols-sbp-TZ","~$goog.i18n.CompactNumberFormatSymbols-uk-UA","~$goog.i18n.CompactNumberFormatSymbols_rm","~$goog.i18n.CompactNumberFormatSymbols_dav_KE","~$goog.i18n.CompactNumberFormatSymbols_fr_TN","~$goog.i18n.CompactNumberFormatSymbols-fr-SN","~$goog.i18n.CompactNumberFormatSymbols-bs-Cyrl-BA","~$goog.i18n.CompactNumberFormatSymbols-fo-FO","~$goog.i18n.CompactNumberFormatSymbols_fr_CI","~$goog.i18n.CompactNumberFormatSymbols-am-ET","~$goog.i18n.CompactNumberFormatSymbols_ar_QA","~$goog.i18n.CompactNumberFormatSymbols_ca_AD","~$goog.i18n.CompactNumberFormatSymbols_se","~$goog.i18n.CompactNumberFormatSymbols_twq","~$goog.i18n.CompactNumberFormatSymbols_en_ER","~$goog.i18n.CompactNumberFormatSymbols-es-NI","~$goog.i18n.CompactNumberFormatSymbols-eo","~$goog.i18n.CompactNumberFormatSymbols_ak_GH","~$goog.i18n.CompactNumberFormatSymbols-ti-ER","~$goog.i18n.CompactNumberFormatSymbols-en-BB","~$goog.i18n.CompactNumberFormatSymbols-en-LC","~$goog.i18n.CompactNumberFormatSymbols-kea","~$goog.i18n.CompactNumberFormatSymbols_kde","~$goog.i18n.CompactNumberFormatSymbols_br_FR","~$goog.i18n.CompactNumberFormatSymbols-en-JE","~$goog.i18n.CompactNumberFormatSymbols_shi_Tfng","~$goog.i18n.CompactNumberFormatSymbols-twq-NE","~$goog.i18n.CompactNumberFormatSymbols_yi_001","~$goog.i18n.CompactNumberFormatSymbols-naq-NA","~$goog.i18n.CompactNumberFormatSymbols-os","~$goog.i18n.CompactNumberFormatSymbols_fo_FO","~$goog.i18n.CompactNumberFormatSymbols-de-LU","~$goog.i18n.CompactNumberFormatSymbols_en_CK","~$goog.i18n.CompactNumberFormatSymbols_zh_Hans_SG","~$goog.i18n.CompactNumberFormatSymbols_ta_SG","~$goog.i18n.CompactNumberFormatSymbols_it_VA","~$goog.i18n.CompactNumberFormatSymbols-haw-US","~$goog.i18n.CompactNumberFormatSymbols_mi_NZ","~$goog.i18n.CompactNumberFormatSymbols_nn_NO","~$goog.i18n.CompactNumberFormatSymbols_uz_Latn","~$goog.i18n.CompactNumberFormatSymbols-ii-CN","~$goog.i18n.CompactNumberFormatSymbols-eo-001","~$goog.i18n.CompactNumberFormatSymbols-ceb","~$goog.i18n.CompactNumberFormatSymbols-ln-CD","~$goog.i18n.CompactNumberFormatSymbols-et-EE","~$goog.i18n.CompactNumberFormatSymbols_ebu_KE","~$goog.i18n.CompactNumberFormatSymbols-bn-IN","~$goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_XK","~$goog.i18n.CompactNumberFormatSymbols_bn_BD","~$goog.i18n.CompactNumberFormatSymbols-en-PH","~$goog.i18n.CompactNumberFormatSymbols_en_NR","~$goog.i18n.CompactNumberFormatSymbols_az_Cyrl_AZ","~$goog.i18n.CompactNumberFormatSymbols-jv","~$goog.i18n.CompactNumberFormatSymbols_fr_MC","~$goog.i18n.CompactNumberFormatSymbols_fr_MG","~$goog.i18n.CompactNumberFormatSymbols_ru_KG","~$goog.i18n.CompactNumberFormatSymbols-es-PY","~$goog.i18n.CompactNumberFormatSymbols_en_150","~$goog.i18n.CompactNumberFormatSymbols-bem","~$goog.i18n.CompactNumberFormatSymbols-dyo-SN","~$goog.i18n.CompactNumberFormatSymbols-eu-ES","~$goog.i18n.CompactNumberFormatSymbols-sv-SE","~$goog.i18n.CompactNumberFormatSymbols-en-SB","~$goog.i18n.CompactNumberFormatSymbols_ps_AF","~$goog.i18n.CompactNumberFormatSymbols-rw","~$goog.i18n.CompactNumberFormatSymbols-en-001","~$goog.i18n.CompactNumberFormatSymbols-ca-IT","~$goog.i18n.CompactNumberFormatSymbols_jmc_TZ","~$goog.i18n.CompactNumberFormatSymbols_ps","~$goog.i18n.CompactNumberFormatSymbols_el_CY","~$goog.i18n.CompactNumberFormatSymbols_cgg","~$goog.i18n.CompactNumberFormatSymbols-ko-KR","~$goog.i18n.CompactNumberFormatSymbols-fur-IT","~$goog.i18n.CompactNumberFormatSymbols_ff_Latn_SN","~$goog.i18n.CompactNumberFormatSymbols-luo-KE","~$goog.i18n.CompactNumberFormatSymbols-pt-MZ","~$goog.i18n.CompactNumberFormatSymbols-mas","~$goog.i18n.CompactNumberFormatSymbols-shi-Tfng","~$goog.i18n.CompactNumberFormatSymbols-nl-SX","~$goog.i18n.CompactNumberFormatSymbols_kln_KE","~$goog.i18n.CompactNumberFormatSymbols-fr-MG","~$goog.i18n.CompactNumberFormatSymbols-dsb-DE","~$goog.i18n.CompactNumberFormatSymbols-fo","~$goog.i18n.CompactNumberFormatSymbols-ar-LY","~$goog.i18n.CompactNumberFormatSymbols_lkt","~$goog.i18n.CompactNumberFormatSymbols-sl-SI","~$goog.i18n.CompactNumberFormatSymbols-nl-BE","~$goog.i18n.CompactNumberFormatSymbols-en-DM","~$goog.i18n.CompactNumberFormatSymbols-rm-CH","~$goog.i18n.CompactNumberFormatSymbols_ccp_IN","~$goog.i18n.CompactNumberFormatSymbols-fr-SC","~$goog.i18n.CompactNumberFormatSymbols_kam_KE","~$goog.i18n.CompactNumberFormatSymbols_es_UY","~$goog.i18n.CompactNumberFormatSymbols-uz-Arab","~$goog.i18n.CompactNumberFormatSymbols_cgg_UG","~$goog.i18n.CompactNumberFormatSymbols-sn","~$goog.i18n.CompactNumberFormatSymbols_bn_IN","~$goog.i18n.CompactNumberFormatSymbols_en_CC","~$goog.i18n.CompactNumberFormatSymbols_tt","~$goog.i18n.CompactNumberFormatSymbols_yav","~$goog.i18n.CompactNumberFormatSymbols_gv","~$goog.i18n.CompactNumberFormatSymbols-kw","~$goog.i18n.CompactNumberFormatSymbols-khq","~$goog.i18n.CompactNumberFormatSymbols-es-SV","~$goog.i18n.CompactNumberFormatSymbols-en-FJ","~$goog.i18n.CompactNumberFormatSymbols-dz","~$goog.i18n.CompactNumberFormatSymbols-vun","~$goog.i18n.CompactNumberFormatSymbols_ur_PK","~$goog.i18n.CompactNumberFormatSymbols-ar-XB","~$goog.i18n.CompactNumberFormatSymbols-en-CY","~$goog.i18n.CompactNumberFormatSymbols_it_CH","~$goog.i18n.CompactNumberFormatSymbols_es_EC","~$goog.i18n.CompactNumberFormatSymbols_ckb_IR","~$goog.i18n.CompactNumberFormatSymbols-si-LK","~$goog.i18n.CompactNumberFormatSymbols_mzn_IR","~$goog.i18n.CompactNumberFormatSymbols_uz_Cyrl","~$goog.i18n.CompactNumberFormatSymbols_ku_TR","~$goog.i18n.CompactNumberFormatSymbols-chr-US","~$goog.i18n.CompactNumberFormatSymbols_mk_MK","~$goog.i18n.CompactNumberFormatSymbols_en_BB","~$goog.i18n.CompactNumberFormatSymbols-so-DJ","~$goog.i18n.CompactNumberFormatSymbols-nds-DE","~$goog.i18n.CompactNumberFormatSymbols_en_XA","~$goog.i18n.CompactNumberFormatSymbols-ru-UA","~$goog.i18n.CompactNumberFormatSymbols-fa-IR","~$goog.i18n.CompactNumberFormatSymbols-fr-NE","~$goog.i18n.CompactNumberFormatSymbols-it-VA","~$goog.i18n.CompactNumberFormatSymbols-ewo-CM","~$goog.i18n.CompactNumberFormatSymbols-az-Latn","~$goog.i18n.CompactNumberFormatSymbols_fr_CD","~$goog.i18n.CompactNumberFormatSymbols_vai_Vaii","~$goog.i18n.CompactNumberFormatSymbols_fr_VU","~$goog.i18n.CompactNumberFormatSymbols-fr-ML","~$goog.i18n.CompactNumberFormatSymbols-zh-Hans-HK","~$goog.i18n.CompactNumberFormatSymbols_fr_YT","~$goog.i18n.CompactNumberFormatSymbols_ha_GH","~$goog.i18n.CompactNumberFormatSymbols-se-SE","~$goog.i18n.CompactNumberFormatSymbols_en_UG","~$goog.i18n.CompactNumberFormatSymbols-dua","~$goog.i18n.CompactNumberFormatSymbols_km_KH","~$goog.i18n.CompactNumberFormatSymbols-ur-IN","~$goog.i18n.CompactNumberFormatSymbols_lrc_IQ","~$goog.i18n.CompactNumberFormatSymbols_fr_CF","~$goog.i18n.CompactNumberFormatSymbols-fur","~$goog.i18n.CompactNumberFormatSymbols_bm","~$goog.i18n.CompactNumberFormatSymbols_en_MG","~$goog.i18n.CompactNumberFormatSymbols_ceb_PH","~$goog.i18n.CompactNumberFormatSymbols_pt_CV","~$goog.i18n.CompactNumberFormatSymbols-nl-AW","~$goog.i18n.CompactNumberFormatSymbols-kea-CV","~$goog.i18n.CompactNumberFormatSymbols-ff-Latn-GM","~$goog.i18n.CompactNumberFormatSymbols-ro-RO","~$goog.i18n.CompactNumberFormatSymbols-yo-BJ","~$goog.i18n.CompactNumberFormatSymbols-ksh","~$goog.i18n.CompactNumberFormatSymbols-en-IL","~$goog.i18n.CompactNumberFormatSymbols-en-GI","~$goog.i18n.CompactNumberFormatSymbols-mi","~$goog.i18n.CompactNumberFormatSymbols-ru-KZ","~$goog.i18n.CompactNumberFormatSymbols_mi","~$goog.i18n.CompactNumberFormatSymbols_lo_LA","~$goog.i18n.CompactNumberFormatSymbols-ig","~$goog.i18n.CompactNumberFormatSymbols-jmc","~$goog.i18n.CompactNumberFormatSymbols_sv_SE","~$goog.i18n.CompactNumberFormatSymbols_nds_DE","~$goog.i18n.CompactNumberFormatSymbols_lrc","~$goog.i18n.CompactNumberFormatSymbols_fr_BJ","~$goog.i18n.CompactNumberFormatSymbols-en-GH","~$goog.i18n.CompactNumberFormatSymbols_pt_ST","~$goog.i18n.CompactNumberFormatSymbols_nd","~$goog.i18n.CompactNumberFormatSymbols-ha-GH","~$goog.i18n.CompactNumberFormatSymbols_fr_TG","~$goog.i18n.CompactNumberFormatSymbols_es_HN","~$goog.i18n.CompactNumberFormatSymbols-kok","~$goog.i18n.CompactNumberFormatSymbols-ccp-BD","~$goog.i18n.CompactNumberFormatSymbols-en-SE","~$goog.i18n.CompactNumberFormatSymbols-rof","~$goog.i18n.CompactNumberFormatSymbols-en-HK","~$goog.i18n.CompactNumberFormatSymbols_nb_NO","~$goog.i18n.CompactNumberFormatSymbols_kw_GB","~$goog.i18n.CompactNumberFormatSymbols_nnh","~$goog.i18n.CompactNumberFormatSymbols_fr_WF","~$goog.i18n.CompactNumberFormatSymbols_en_TZ","~$goog.i18n.CompactNumberFormatSymbols-gv","~$goog.i18n.CompactNumberFormatSymbols_en_VU","~$goog.i18n.CompactNumberFormatSymbols_sw_CD","~$goog.i18n.CompactNumberFormatSymbols_yue_Hant","~$goog.i18n.CompactNumberFormatSymbols_ru_UA","~$goog.i18n.CompactNumberFormatSymbols-os-RU","~$goog.i18n.CompactNumberFormatSymbols_as","~$goog.i18n.CompactNumberFormatSymbols_lrc_IR","~$goog.i18n.CompactNumberFormatSymbols-az-Latn-AZ","~$goog.i18n.CompactNumberFormatSymbols_en_SI","~$goog.i18n.CompactNumberFormatSymbols-gsw-LI","~$goog.i18n.CompactNumberFormatSymbols-ff-Latn-NG","~$goog.i18n.CompactNumberFormatSymbols_dua","~$goog.i18n.CompactNumberFormatSymbols-en-NZ","~$goog.i18n.CompactNumberFormatSymbols-kab","~$goog.i18n.CompactNumberFormatSymbols_rof_TZ","~$goog.i18n.CompactNumberFormatSymbols-kk-KZ","~$goog.i18n.CompactNumberFormatSymbols-ebu","~$goog.i18n.CompactNumberFormatSymbols-ses","~$goog.i18n.CompactNumberFormatSymbols-mgo","~$goog.i18n.CompactNumberFormatSymbols-nmg-CM","~$goog.i18n.CompactNumberFormatSymbols-en-GM","~$goog.i18n.CompactNumberFormatSymbols-tg","~$goog.i18n.CompactNumberFormatSymbols-saq","~$goog.i18n.CompactNumberFormatSymbols-pt-CV","~$goog.i18n.CompactNumberFormatSymbols-fr-SY","~$goog.i18n.CompactNumberFormatSymbols_ne_NP","~$goog.i18n.CompactNumberFormatSymbols-zh-Hans-MO","~$goog.i18n.CompactNumberFormatSymbols-ckb-IR","~$goog.i18n.CompactNumberFormatSymbols-nyn-UG","~$goog.i18n.CompactNumberFormatSymbols_sd","~$goog.i18n.CompactNumberFormatSymbols_nl_CW","~$goog.i18n.CompactNumberFormatSymbols-sr-Latn-BA","~$goog.i18n.CompactNumberFormatSymbols_shi_Latn","~$goog.i18n.CompactNumberFormatSymbols_es_CO","~$goog.i18n.CompactNumberFormatSymbols_en_DM","~$goog.i18n.CompactNumberFormatSymbols-kl","~$goog.i18n.CompactNumberFormatSymbols_pt_MO","~$goog.i18n.CompactNumberFormatSymbols_fr_GP","~$goog.i18n.CompactNumberFormatSymbols_hy_AM","~$goog.i18n.CompactNumberFormatSymbols-ar-PS","~$goog.i18n.CompactNumberFormatSymbols_mg","~$goog.i18n.CompactNumberFormatSymbols-asa","~$goog.i18n.CompactNumberFormatSymbols-pt-TL","~$goog.i18n.CompactNumberFormatSymbols-en-MP","~$goog.i18n.CompactNumberFormatSymbols_khq_ML","~$goog.i18n.CompactNumberFormatSymbols-mer-KE","~$goog.i18n.CompactNumberFormatSymbols-en-FK","~$goog.i18n.CompactNumberFormatSymbols_lag","~$goog.i18n.CompactNumberFormatSymbols-luy-KE","~$goog.i18n.CompactNumberFormatSymbols_fr_PF","~$goog.i18n.CompactNumberFormatSymbols-so-KE","~$goog.i18n.CompactNumberFormatSymbols_ca_ES","~$goog.i18n.CompactNumberFormatSymbols_ko_KR","~$goog.i18n.CompactNumberFormatSymbols-ar-001","~$goog.i18n.CompactNumberFormatSymbols-ko-KP","~$goog.i18n.CompactNumberFormatSymbols_mfe_MU","~$goog.i18n.CompactNumberFormatSymbols_ki_KE","~$goog.i18n.CompactNumberFormatSymbols_en_IL","~$goog.i18n.CompactNumberFormatSymbols_es_DO","~$goog.i18n.CompactNumberFormatSymbols_se_NO","~$goog.i18n.CompactNumberFormatSymbols_bo","~$goog.i18n.CompactNumberFormatSymbols_en_SL","~$goog.i18n.CompactNumberFormatSymbols-gsw-FR","~$goog.i18n.CompactNumberFormatSymbols_es_GT","~$goog.i18n.CompactNumberFormatSymbols_ks_IN","~$goog.i18n.CompactNumberFormatSymbols_eo","~$goog.i18n.CompactNumberFormatSymbols_qu_BO","~$goog.i18n.CompactNumberFormatSymbols_rof","~$goog.i18n.CompactNumberFormatSymbols-ja-JP","~$goog.i18n.CompactNumberFormatSymbols-sg-CF","~$goog.i18n.CompactNumberFormatSymbols-dz-BT","~$goog.i18n.CompactNumberFormatSymbols_ar_SD","~$goog.i18n.CompactNumberFormatSymbols-bs-Latn-BA","~$goog.i18n.CompactNumberFormatSymbols-brx","~$goog.i18n.CompactNumberFormatSymbols-is-IS","~$goog.i18n.CompactNumberFormatSymbols_pt_MZ","~$goog.i18n.CompactNumberFormatSymbols-ps-PK","~$goog.i18n.CompactNumberFormatSymbols_en_NZ","~$goog.i18n.CompactNumberFormatSymbols-en-BM","~$goog.i18n.CompactNumberFormatSymbols-en-AS","~$goog.i18n.CompactNumberFormatSymbols_sn_ZW","~$goog.i18n.CompactNumberFormatSymbols_sd_PK","~$goog.i18n.CompactNumberFormatSymbols_kw","~$goog.i18n.CompactNumberFormatSymbols-zh-Hans-SG","~$goog.i18n.CompactNumberFormatSymbols-en-IO","~$goog.i18n.CompactNumberFormatSymbols_zh_Hant_TW","~$goog.i18n.CompactNumberFormatSymbols_es_AR","~$goog.i18n.CompactNumberFormatSymbols_mn_MN","~$goog.i18n.CompactNumberFormatSymbols_ce","~$goog.i18n.CompactNumberFormatSymbols_nn","~$goog.i18n.CompactNumberFormatSymbols-ff-Latn-GN","~$goog.i18n.CompactNumberFormatSymbols-ar-SD","~$goog.i18n.CompactNumberFormatSymbols-en-MH","~$goog.i18n.CompactNumberFormatSymbols-fr-CH","~$goog.i18n.CompactNumberFormatSymbols-pt-LU","~$goog.i18n.CompactNumberFormatSymbols_en_CY","~$goog.i18n.CompactNumberFormatSymbols_so_KE","~$goog.i18n.CompactNumberFormatSymbols_tr_TR","~$goog.i18n.CompactNumberFormatSymbols-vi-VN","~$goog.i18n.CompactNumberFormatSymbols-zh-Hant-MO","~$goog.i18n.CompactNumberFormatSymbols_ksh","~$goog.i18n.CompactNumberFormatSymbols_ko_KP","~$goog.i18n.CompactNumberFormatSymbols_qu_EC","~$goog.i18n.CompactNumberFormatSymbols-bas-CM","~$goog.i18n.CompactNumberFormatSymbols_kkj_CM","~$goog.i18n.CompactNumberFormatSymbols_ru_RU","~$goog.i18n.CompactNumberFormatSymbols_en_CM","~$goog.i18n.CompactNumberFormatSymbols_mer","~$goog.i18n.CompactNumberFormatSymbols-es-HN","~$goog.i18n.CompactNumberFormatSymbols_da_GL","~$goog.i18n.CompactNumberFormatSymbols_sv_AX","~$goog.i18n.CompactNumberFormatSymbols_sr_Latn_ME","~$goog.i18n.CompactNumberFormatSymbols_os","~$goog.i18n.CompactNumberFormatSymbols-so-ET","~$goog.i18n.CompactNumberFormatSymbols_ti_ER","~$goog.i18n.CompactNumberFormatSymbols_mr_IN","~$goog.i18n.CompactNumberFormatSymbols-sv-AX","~$goog.i18n.CompactNumberFormatSymbols-da-DK","~$goog.i18n.CompactNumberFormatSymbols-en-ER","~$goog.i18n.CompactNumberFormatSymbols-fr-CM","~$goog.i18n.CompactNumberFormatSymbols_ln_AO","~$goog.i18n.CompactNumberFormatSymbols_sv_FI","~$goog.i18n.CompactNumberFormatSymbols_xh","~$goog.i18n.CompactNumberFormatSymbols_ff","~$goog.i18n.CompactNumberFormatSymbols-ce-RU","~$goog.i18n.CompactNumberFormatSymbols_ee","~$goog.i18n.CompactNumberFormatSymbols-en-LR","~$goog.i18n.CompactNumberFormatSymbols_ceb","~$goog.i18n.CompactNumberFormatSymbols_ig_NG","~$goog.i18n.CompactNumberFormatSymbols_en_WS","~$goog.i18n.CompactNumberFormatSymbols_it_IT","~$goog.i18n.CompactNumberFormatSymbols-bn-BD","~$goog.i18n.CompactNumberFormatSymbols_ki","~$goog.i18n.CompactNumberFormatSymbols_ti_ET","~$goog.i18n.CompactNumberFormatSymbols-yue-Hant","~$goog.i18n.CompactNumberFormatSymbols_sq_MK","~$goog.i18n.CompactNumberFormatSymbols_en_BW","~$goog.i18n.CompactNumberFormatSymbols-hr-HR","~$goog.i18n.CompactNumberFormatSymbols-fr-WF","~$goog.i18n.CompactNumberFormatSymbols_seh","~$goog.i18n.CompactNumberFormatSymbols-bg-BG","~$goog.i18n.CompactNumberFormatSymbols_qu","~$goog.i18n.CompactNumberFormatSymbols_ru_MD","~$goog.i18n.CompactNumberFormatSymbols-nl-BQ","~$goog.i18n.CompactNumberFormatSymbols_yue_Hans","~$goog.i18n.CompactNumberFormatSymbols_af_ZA","~$goog.i18n.CompactNumberFormatSymbols_de_BE","~$goog.i18n.CompactNumberFormatSymbols-my-MM","~$goog.i18n.CompactNumberFormatSymbols-ti","~$goog.i18n.CompactNumberFormatSymbols-fr-MR","~$goog.i18n.CompactNumberFormatSymbols-nl-SR","~$goog.i18n.CompactNumberFormatSymbols_saq","~$goog.i18n.CompactNumberFormatSymbols-jv-ID","~$goog.i18n.CompactNumberFormatSymbols-it-SM","~$goog.i18n.CompactNumberFormatSymbols_ps_PK","~$goog.i18n.CompactNumberFormatSymbols_fr_CG","~$goog.i18n.CompactNumberFormatSymbols-id-ID","~$goog.i18n.CompactNumberFormatSymbols-en-JM","~$goog.i18n.CompactNumberFormatSymbols_nyn_UG","~$goog.i18n.CompactNumberFormatSymbols_en_TT","~$goog.i18n.CompactNumberFormatSymbols-de-BE","~$goog.i18n.CompactNumberFormatSymbols_es_PY","~$goog.i18n.CompactNumberFormatSymbols_wo_SN","~$goog.i18n.CompactNumberFormatSymbols_zh_Hans","~$goog.i18n.CompactNumberFormatSymbols-en-UG","~$goog.i18n.CompactNumberFormatSymbols_hr_HR","~$goog.i18n.CompactNumberFormatSymbols_mua_CM","~$goog.i18n.CompactNumberFormatSymbols_en_DG","~$goog.i18n.CompactNumberFormatSymbols-en-BS","~$goog.i18n.CompactNumberFormatSymbols-es-CL","~$goog.i18n.CompactNumberFormatSymbols_fr_BI","~$goog.i18n.CompactNumberFormatSymbols_ar_JO","~$goog.i18n.CompactNumberFormatSymbols-ru-MD","~$goog.i18n.CompactNumberFormatSymbols_ce_RU","~$goog.i18n.CompactNumberFormatSymbols_kam","~$goog.i18n.CompactNumberFormatSymbols-cgg-UG","~$goog.i18n.CompactNumberFormatSymbols-lag","~$goog.i18n.CompactNumberFormatSymbols_bo_IN","~$goog.i18n.CompactNumberFormatSymbols-en-MS","~$goog.i18n.CompactNumberFormatSymbols_ewo","~$goog.i18n.CompactNumberFormatSymbols-nmg","~$goog.i18n.CompactNumberFormatSymbols_nus","~$goog.i18n.CompactNumberFormatSymbols-ar-SA","~$goog.i18n.CompactNumberFormatSymbols-mgo-CM","~$goog.i18n.CompactNumberFormatSymbols_nb_SJ","~$goog.i18n.CompactNumberFormatSymbols_hu_HU","~$goog.i18n.CompactNumberFormatSymbols-bem-ZM","~$goog.i18n.CompactNumberFormatSymbols_vai_Latn","~$goog.i18n.CompactNumberFormatSymbols_ta_IN","~$goog.i18n.CompactNumberFormatSymbols-or-IN","~$goog.i18n.CompactNumberFormatSymbols_yo","~$goog.i18n.CompactNumberFormatSymbols-yo-NG","~$goog.i18n.CompactNumberFormatSymbols-vun-TZ","~$goog.i18n.CompactNumberFormatSymbols-ar-KW","~$goog.i18n.CompactNumberFormatSymbols_smn_FI","~$goog.i18n.CompactNumberFormatSymbols_en_MP","~$goog.i18n.CompactNumberFormatSymbols_ar_SO","~$goog.i18n.CompactNumberFormatSymbols-ckb","~$goog.i18n.CompactNumberFormatSymbols_ar_TD","~$goog.i18n.CompactNumberFormatSymbols-en-KE","~$goog.i18n.CompactNumberFormatSymbols_en_BE","~$goog.i18n.CompactNumberFormatSymbols_en_KY","~$goog.i18n.CompactNumberFormatSymbols-fr-DJ","~$goog.i18n.CompactNumberFormatSymbols-bez-TZ","~$goog.i18n.CompactNumberFormatSymbols-yo","~$goog.i18n.CompactNumberFormatSymbols_sq_XK","~$goog.i18n.CompactNumberFormatSymbols_jmc","~$goog.i18n.CompactNumberFormatSymbols-ee","~$goog.i18n.CompactNumberFormatSymbols-en-IM","~$goog.i18n.CompactNumberFormatSymbols-hr-BA","~$goog.i18n.CompactNumberFormatSymbols-jgo-CM","~$goog.i18n.CompactNumberFormatSymbols-bas","~$goog.i18n.CompactNumberFormatSymbols-ksh-DE","~$goog.i18n.CompactNumberFormatSymbols-it-IT","~$goog.i18n.CompactNumberFormatSymbols_bm_ML","~$goog.i18n.CompactNumberFormatSymbols-to-TO","~$goog.i18n.CompactNumberFormatSymbols_fo_DK","~$goog.i18n.CompactNumberFormatSymbols-ro-MD","~$goog.i18n.CompactNumberFormatSymbols-lrc-IR","~$goog.i18n.CompactNumberFormatSymbols_mua","~$goog.i18n.CompactNumberFormatSymbols-mg-MG","~$goog.i18n.CompactNumberFormatSymbols_dz","~$goog.i18n.CompactNumberFormatSymbols-shi-Latn-MA","~$goog.i18n.CompactNumberFormatSymbols-ff-Latn-NE","~$goog.i18n.CompactNumberFormatSymbols-en-GD","~$goog.i18n.CompactNumberFormatSymbols-lu-CD","~$goog.i18n.CompactNumberFormatSymbols-he-IL","~$goog.i18n.CompactNumberFormatSymbols_fr_RE","~$goog.i18n.CompactNumberFormatSymbols-ff-Latn-LR","~$goog.i18n.CompactNumberFormatSymbols-ar-JO","~$goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_BA","~$goog.i18n.CompactNumberFormatSymbols-nd","~$goog.i18n.CompactNumberFormatSymbols_zh_Hant","~$goog.i18n.CompactNumberFormatSymbols_de_DE","~$goog.i18n.CompactNumberFormatSymbols_ar_SS","~$goog.i18n.CompactNumberFormatSymbols-ee-TG","~$goog.i18n.CompactNumberFormatSymbols_ff_Latn_SL","~$goog.i18n.CompactNumberFormatSymbols-yav-CM","~$goog.i18n.CompactNumberFormatSymbols_shi_Tfng_MA","~$goog.i18n.CompactNumberFormatSymbols-kw-GB","~$goog.i18n.CompactNumberFormatSymbols-en-GY","~$goog.i18n.CompactNumberFormatSymbols_en_SX","~$goog.i18n.CompactNumberFormatSymbols-fr-HT","~$goog.i18n.CompactNumberFormatSymbols_ff_Latn_LR","~$goog.i18n.CompactNumberFormatSymbols_en_AE","~$goog.i18n.CompactNumberFormatSymbols_ta_MY","~$goog.i18n.CompactNumberFormatSymbols_kkj","~$goog.i18n.CompactNumberFormatSymbols_nl_SR","~$goog.i18n.CompactNumberFormatSymbols-sw-CD","~$goog.i18n.CompactNumberFormatSymbols_xog","~$goog.i18n.CompactNumberFormatSymbols_en_KI","~$goog.i18n.CompactNumberFormatSymbols_ff_Latn_NE","~$goog.i18n.CompactNumberFormatSymbols-ki","~$goog.i18n.CompactNumberFormatSymbols-en-RW","~$goog.i18n.CompactNumberFormatSymbols-en-TT","~$goog.i18n.CompactNumberFormatSymbols-jmc-TZ","~$goog.i18n.CompactNumberFormatSymbols-xh-ZA","~$goog.i18n.CompactNumberFormatSymbols-ku","~$goog.i18n.CompactNumberFormatSymbols-fr-BE","~$goog.i18n.CompactNumberFormatSymbols_tk_TM","~$goog.i18n.CompactNumberFormatSymbols-dje","~$goog.i18n.CompactNumberFormatSymbols-en-SI","~$goog.i18n.CompactNumberFormatSymbols_ksh_DE","~$goog.i18n.CompactNumberFormatSymbols_ks","~$goog.i18n.CompactNumberFormatSymbols-vai-Latn","~$goog.i18n.CompactNumberFormatSymbols_dje","~$goog.i18n.CompactNumberFormatSymbols-ha","~$goog.i18n.CompactNumberFormatSymbols-hi-IN","~$goog.i18n.CompactNumberFormatSymbols_ksf","~$goog.i18n.CompactNumberFormatSymbols-pt-CH","~$goog.i18n.CompactNumberFormatSymbols_nl_BQ","~$goog.i18n.CompactNumberFormatSymbols-cs-CZ","~$goog.i18n.CompactNumberFormatSymbols-tr-TR","~$goog.i18n.CompactNumberFormatSymbols_fr_LU","~$goog.i18n.CompactNumberFormatSymbols_dua_CM","~$goog.i18n.CompactNumberFormatSymbols-en-US-POSIX","~$goog.i18n.CompactNumberFormatSymbols-xog-UG","~$goog.i18n.CompactNumberFormatSymbols_en_CH","~$goog.i18n.CompactNumberFormatSymbols_sr_Cyrl_RS","~$goog.i18n.CompactNumberFormatSymbols-se","~$goog.i18n.CompactNumberFormatSymbols-en-PN","~$goog.i18n.CompactNumberFormatSymbols_mas_TZ","~$goog.i18n.CompactNumberFormatSymbols_rwk","~$goog.i18n.CompactNumberFormatSymbols-mr-IN","~$goog.i18n.CompactNumberFormatSymbols_az_Cyrl","~$goog.i18n.CompactNumberFormatSymbols-ar-LB","~$goog.i18n.CompactNumberFormatSymbols-kab-DZ","~$goog.i18n.CompactNumberFormatSymbols_ar_IQ","~$goog.i18n.CompactNumberFormatSymbols_fr_SN","~$goog.i18n.CompactNumberFormatSymbols-sn-ZW","~$goog.i18n.CompactNumberFormatSymbols-fr-RW","~$goog.i18n.CompactNumberFormatSymbols_ga_IE","~$goog.i18n.CompactNumberFormatSymbols-fr-KM","~$goog.i18n.CompactNumberFormatSymbols-rwk-TZ","~$goog.i18n.CompactNumberFormatSymbols-ky-KG","~$goog.i18n.CompactNumberFormatSymbols_en_HK","~$goog.i18n.CompactNumberFormatSymbols_os_GE","~$goog.i18n.CompactNumberFormatSymbols-fr-RE","~$goog.i18n.CompactNumberFormatSymbols_id_ID","~$goog.i18n.CompactNumberFormatSymbols-ne-IN","~$goog.i18n.CompactNumberFormatSymbols-fr-VU","~$goog.i18n.CompactNumberFormatSymbols_en_NL","~$goog.i18n.CompactNumberFormatSymbols-qu-BO","~$goog.i18n.CompactNumberFormatSymbols-ksf-CM","~$goog.i18n.CompactNumberFormatSymbols_ro_MD","~$goog.i18n.CompactNumberFormatSymbols-teo-UG","~$goog.i18n.CompactNumberFormatSymbols_ln_CF","~$goog.i18n.CompactNumberFormatSymbols-sq-XK","~$goog.i18n.CompactNumberFormatSymbols-uz-Cyrl","~$goog.i18n.CompactNumberFormatSymbols-en-GU","~$goog.i18n.CompactNumberFormatSymbols-sg","~$goog.i18n.CompactNumberFormatSymbols_sg_CF","~$goog.i18n.CompactNumberFormatSymbols-en-NA","~$goog.i18n.CompactNumberFormatSymbols_fur","~$goog.i18n.CompactNumberFormatSymbols-ha-NE","~$goog.i18n.CompactNumberFormatSymbols-en-AG","~$goog.i18n.CompactNumberFormatSymbols_ur_IN","~$goog.i18n.CompactNumberFormatSymbols-vai-Latn-LR","~$goog.i18n.CompactNumberFormatSymbols_ar_AE","~$goog.i18n.CompactNumberFormatSymbols_dsb","~$goog.i18n.CompactNumberFormatSymbols-hsb-DE","~$goog.i18n.CompactNumberFormatSymbols_es_CL","~$goog.i18n.CompactNumberFormatSymbols-dsb","~$goog.i18n.CompactNumberFormatSymbols_fr_RW","~$goog.i18n.CompactNumberFormatSymbols_th_TH","~$goog.i18n.CompactNumberFormatSymbols_fr_HT","~$goog.i18n.CompactNumberFormatSymbols_fr_DJ","~$goog.i18n.CompactNumberFormatSymbols_pl_PL","~$goog.i18n.CompactNumberFormatSymbols_guz","~$goog.i18n.CompactNumberFormatSymbols_bem_ZM","~$goog.i18n.CompactNumberFormatSymbols-jgo","~$goog.i18n.CompactNumberFormatSymbols-en-PG","~$goog.i18n.CompactNumberFormatSymbols_da_DK","~$goog.i18n.CompactNumberFormatSymbols_my_MM","~$goog.i18n.CompactNumberFormatSymbols_ksf_CM","~$goog.i18n.CompactNumberFormatSymbols_khq","~$goog.i18n.CompactNumberFormatSymbols_nds","~$goog.i18n.CompactNumberFormatSymbols-lo-LA","~$goog.i18n.CompactNumberFormatSymbols_mgo","~$goog.i18n.CompactNumberFormatSymbols_en_JM","~$goog.i18n.CompactNumberFormatSymbols-fr-CG","~$goog.i18n.CompactNumberFormatSymbols_ar_MR","~$goog.i18n.CompactNumberFormatSymbols-el-GR","~$goog.i18n.CompactNumberFormatSymbols-fr-TN","~$goog.i18n.CompactNumberFormatSymbols-en-LS","~$goog.i18n.CompactNumberFormatSymbols_hsb_DE","~$goog.i18n.CompactNumberFormatSymbols-sw-KE","~$goog.i18n.CompactNumberFormatSymbols_teo_KE","~$goog.i18n.CompactNumberFormatSymbols-ca-ES","~$goog.i18n.CompactNumberFormatSymbols_mas","~$goog.i18n.CompactNumberFormatSymbols-en-BW","~$goog.i18n.CompactNumberFormatSymbols-yi","~$goog.i18n.CompactNumberFormatSymbols-be-BY","~$goog.i18n.CompactNumberFormatSymbols-gd","~$goog.i18n.CompactNumberFormatSymbols_lg_UG","~$goog.i18n.CompactNumberFormatSymbols-fi-FI","~$goog.i18n.CompactNumberFormatSymbols_es_CU","~$goog.i18n.CompactNumberFormatSymbols-ast","~$goog.i18n.CompactNumberFormatSymbols_wo","~$goog.i18n.CompactNumberFormatSymbols_ha","~$goog.i18n.CompactNumberFormatSymbols-se-NO","~$goog.i18n.CompactNumberFormatSymbols_en_NF","~$goog.i18n.CompactNumberFormatSymbols-ca-FR","~$goog.i18n.CompactNumberFormatSymbols_en_FJ","~$goog.i18n.CompactNumberFormatSymbols_lkt_US","~$goog.i18n.CompactNumberFormatSymbols-so-SO","~$goog.i18n.CompactNumberFormatSymbols-sr-Cyrl-ME","~$goog.i18n.CompactNumberFormatSymbols_sq_AL","~$goog.i18n.CompactNumberFormatSymbols-qu","~$goog.i18n.CompactNumberFormatSymbols-kde-TZ","~$goog.i18n.CompactNumberFormatSymbols-en-SC","~$goog.i18n.CompactNumberFormatSymbols_yue","~$goog.i18n.CompactNumberFormatSymbols-es-GQ","~$goog.i18n.CompactNumberFormatSymbols-bm","~$goog.i18n.CompactNumberFormatSymbols-ast-ES","~$goog.i18n.CompactNumberFormatSymbols-hy-AM","~$goog.i18n.CompactNumberFormatSymbols_bo_CN","~$goog.i18n.CompactNumberFormatSymbols-ps-AF","~$goog.i18n.CompactNumberFormatSymbols-ckb-IQ","~$goog.i18n.CompactNumberFormatSymbols_en_ZW","~$goog.i18n.CompactNumberFormatSymbols_mgh","~$goog.i18n.CompactNumberFormatSymbols_en_TV","~$goog.i18n.CompactNumberFormatSymbols-en-AI","~$goog.i18n.CompactNumberFormatSymbols-rm","~$goog.i18n.CompactNumberFormatSymbols_tzm_MA","~$goog.i18n.CompactNumberFormatSymbols_dz_BT","~$goog.i18n.CompactNumberFormatSymbols_ar_OM","~$goog.i18n.CompactNumberFormatSymbols-en-CM","~$goog.i18n.CompactNumberFormatSymbols_kok","~$goog.i18n.CompactNumberFormatSymbols-lg-UG","~$goog.i18n.CompactNumberFormatSymbols-en-UM","~$goog.i18n.CompactNumberFormatSymbols-fr-BI","~$goog.i18n.CompactNumberFormatSymbols_fr_MR","~$goog.i18n.CompactNumberFormatSymbols-ln-CG","~$goog.i18n.CompactNumberFormatSymbols_bs_Latn","~$goog.i18n.CompactNumberFormatSymbols-mer","~$goog.i18n.CompactNumberFormatSymbols_fr_KM","~$goog.i18n.CompactNumberFormatSymbols_en_GH","~$goog.i18n.CompactNumberFormatSymbols-yi-001","~$goog.i18n.CompactNumberFormatSymbols-dua-CM","~$goog.i18n.CompactNumberFormatSymbols-kde","~$goog.i18n.CompactNumberFormatSymbols-ms-MY","~$goog.i18n.CompactNumberFormatSymbols_en_MS","~$goog.i18n.CompactNumberFormatSymbols_en_SB","~$goog.i18n.CompactNumberFormatSymbols-en-SD","~$goog.i18n.CompactNumberFormatSymbols-en-TC","~$goog.i18n.CompactNumberFormatSymbols_en_SS","~$goog.i18n.CompactNumberFormatSymbols_cy_GB","~$goog.i18n.CompactNumberFormatSymbols_to"]],"~:from-jar",true,"~:deps",["~$goog","~$goog.i18n.CompactNumberFormatSymbols"]],["^ ","~:cache-key",[1579837703000],"~:output-name","goog.locale.countries.js","~:resource-id",["~:shadow.build.classpath/resource","goog/locale/countries.js"],"~:resource-name","goog/locale/countries.js","~:type","~:goog","~:source","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Current list of countries of the world. This is generated from\n * CLDR data using ICU. The algorithm is to list only country codes (not\n * containments representing a groups of countries).\n *\n * File generated from CLDR ver. 35\n */\n\n// clang-format off\n\n/**\n * Namespace for current country codes.\n */\ngoog.provide('goog.locale.countries');\n\n/**\n * List of codes for countries valid today.\n * @type {!Array<string>}\n */\ngoog.locale.countries = [\n  'AC', // Ascension Island\n  'AD', // Andorra\n  'AE', // United Arab Emirates\n  'AF', // Afghanistan\n  'AG', // Antigua & Barbuda\n  'AI', // Anguilla\n  'AL', // Albania\n  'AM', // Armenia\n  'AO', // Angola\n  'AQ', // Antarctica\n  'AR', // Argentina\n  'AS', // American Samoa\n  'AT', // Austria\n  'AU', // Australia\n  'AW', // Aruba\n  'AX', // Åland Islands\n  'AZ', // Azerbaijan\n  'BA', // Bosnia & Herzegovina\n  'BB', // Barbados\n  'BD', // Bangladesh\n  'BE', // Belgium\n  'BF', // Burkina Faso\n  'BG', // Bulgaria\n  'BH', // Bahrain\n  'BI', // Burundi\n  'BJ', // Benin\n  'BL', // St. Barthélemy\n  'BM', // Bermuda\n  'BN', // Brunei\n  'BO', // Bolivia\n  'BQ', // Caribbean Netherlands\n  'BR', // Brazil\n  'BS', // Bahamas\n  'BT', // Bhutan\n  'BV', // Bouvet Island\n  'BW', // Botswana\n  'BY', // Belarus\n  'BZ', // Belize\n  'CA', // Canada\n  'CC', // Cocos (Keeling) Islands\n  'CD', // Congo - Kinshasa\n  'CF', // Central African Republic\n  'CG', // Congo - Brazzaville\n  'CH', // Switzerland\n  'CI', // Côte d’Ivoire\n  'CK', // Cook Islands\n  'CL', // Chile\n  'CM', // Cameroon\n  'CN', // China\n  'CO', // Colombia\n  'CP', // Clipperton Island\n  'CR', // Costa Rica\n  'CU', // Cuba\n  'CV', // Cape Verde\n  'CW', // Curaçao\n  'CX', // Christmas Island\n  'CY', // Cyprus\n  'CZ', // Czechia\n  'DE', // Germany\n  'DG', // Diego Garcia\n  'DJ', // Djibouti\n  'DK', // Denmark\n  'DM', // Dominica\n  'DO', // Dominican Republic\n  'DZ', // Algeria\n  'EA', // Ceuta & Melilla\n  'EC', // Ecuador\n  'EE', // Estonia\n  'EG', // Egypt\n  'EH', // Western Sahara\n  'ER', // Eritrea\n  'ES', // Spain\n  'ET', // Ethiopia\n  'FI', // Finland\n  'FJ', // Fiji\n  'FK', // Falkland Islands (Islas Malvinas)\n  'FM', // Micronesia\n  'FO', // Faroe Islands\n  'FR', // France\n  'GA', // Gabon\n  'GB', // United Kingdom\n  'GD', // Grenada\n  'GE', // Georgia\n  'GF', // French Guiana\n  'GG', // Guernsey\n  'GH', // Ghana\n  'GI', // Gibraltar\n  'GL', // Greenland\n  'GM', // Gambia\n  'GN', // Guinea\n  'GP', // Guadeloupe\n  'GQ', // Equatorial Guinea\n  'GR', // Greece\n  'GS', // South Georgia & South Sandwich Islands\n  'GT', // Guatemala\n  'GU', // Guam\n  'GW', // Guinea-Bissau\n  'GY', // Guyana\n  'HK', // Hong Kong\n  'HM', // Heard & McDonald Islands\n  'HN', // Honduras\n  'HR', // Croatia\n  'HT', // Haiti\n  'HU', // Hungary\n  'IC', // Canary Islands\n  'ID', // Indonesia\n  'IE', // Ireland\n  'IL', // Israel\n  'IM', // Isle of Man\n  'IN', // India\n  'IO', // British Indian Ocean Territory\n  'IQ', // Iraq\n  'IR', // Iran\n  'IS', // Iceland\n  'IT', // Italy\n  'JE', // Jersey\n  'JM', // Jamaica\n  'JO', // Jordan\n  'JP', // Japan\n  'KE', // Kenya\n  'KG', // Kyrgyzstan\n  'KH', // Cambodia\n  'KI', // Kiribati\n  'KM', // Comoros\n  'KN', // St. Kitts & Nevis\n  'KP', // North Korea\n  'KR', // South Korea\n  'KW', // Kuwait\n  'KY', // Cayman Islands\n  'KZ', // Kazakhstan\n  'LA', // Laos\n  'LB', // Lebanon\n  'LC', // St. Lucia\n  'LI', // Liechtenstein\n  'LK', // Sri Lanka\n  'LR', // Liberia\n  'LS', // Lesotho\n  'LT', // Lithuania\n  'LU', // Luxembourg\n  'LV', // Latvia\n  'LY', // Libya\n  'MA', // Morocco\n  'MC', // Monaco\n  'MD', // Moldova\n  'ME', // Montenegro\n  'MF', // St. Martin\n  'MG', // Madagascar\n  'MH', // Marshall Islands\n  'MK', // North Macedonia\n  'ML', // Mali\n  'MM', // Myanmar (Burma)\n  'MN', // Mongolia\n  'MO', // Macao\n  'MP', // Northern Mariana Islands\n  'MQ', // Martinique\n  'MR', // Mauritania\n  'MS', // Montserrat\n  'MT', // Malta\n  'MU', // Mauritius\n  'MV', // Maldives\n  'MW', // Malawi\n  'MX', // Mexico\n  'MY', // Malaysia\n  'MZ', // Mozambique\n  'NA', // Namibia\n  'NC', // New Caledonia\n  'NE', // Niger\n  'NF', // Norfolk Island\n  'NG', // Nigeria\n  'NI', // Nicaragua\n  'NL', // Netherlands\n  'NO', // Norway\n  'NP', // Nepal\n  'NR', // Nauru\n  'NU', // Niue\n  'NZ', // New Zealand\n  'OM', // Oman\n  'PA', // Panama\n  'PE', // Peru\n  'PF', // French Polynesia\n  'PG', // Papua New Guinea\n  'PH', // Philippines\n  'PK', // Pakistan\n  'PL', // Poland\n  'PM', // St. Pierre & Miquelon\n  'PN', // Pitcairn Islands\n  'PR', // Puerto Rico\n  'PS', // Palestine\n  'PT', // Portugal\n  'PW', // Palau\n  'PY', // Paraguay\n  'QA', // Qatar\n  'RE', // Réunion\n  'RO', // Romania\n  'RS', // Serbia\n  'RU', // Russia\n  'RW', // Rwanda\n  'SA', // Saudi Arabia\n  'SB', // Solomon Islands\n  'SC', // Seychelles\n  'SD', // Sudan\n  'SE', // Sweden\n  'SG', // Singapore\n  'SH', // St. Helena\n  'SI', // Slovenia\n  'SJ', // Svalbard & Jan Mayen\n  'SK', // Slovakia\n  'SL', // Sierra Leone\n  'SM', // San Marino\n  'SN', // Senegal\n  'SO', // Somalia\n  'SR', // Suriname\n  'SS', // South Sudan\n  'ST', // São Tomé & Príncipe\n  'SV', // El Salvador\n  'SX', // Sint Maarten\n  'SY', // Syria\n  'SZ', // Eswatini\n  'TA', // Tristan da Cunha\n  'TC', // Turks & Caicos Islands\n  'TD', // Chad\n  'TF', // French Southern Territories\n  'TG', // Togo\n  'TH', // Thailand\n  'TJ', // Tajikistan\n  'TK', // Tokelau\n  'TL', // Timor-Leste\n  'TM', // Turkmenistan\n  'TN', // Tunisia\n  'TO', // Tonga\n  'TR', // Turkey\n  'TT', // Trinidad & Tobago\n  'TV', // Tuvalu\n  'TW', // Taiwan\n  'TZ', // Tanzania\n  'UA', // Ukraine\n  'UG', // Uganda\n  'UM', // U.S. Outlying Islands\n  'US', // United States\n  'UY', // Uruguay\n  'UZ', // Uzbekistan\n  'VA', // Vatican City\n  'VC', // St. Vincent & Grenadines\n  'VE', // Venezuela\n  'VG', // British Virgin Islands\n  'VI', // U.S. Virgin Islands\n  'VN', // Vietnam\n  'VU', // Vanuatu\n  'WF', // Wallis & Futuna\n  'WS', // Samoa\n  'XK', // Kosovo\n  'YE', // Yemen\n  'YT', // Mayotte\n  'ZA', // South Africa\n  'ZM', // Zambia\n  'ZW' // Zimbabwe\n];\n","~:last-modified",1579837703000,"~:requires",["~#set",["^IT"]],"~:pom-info",["^ ","~:description","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","~:group-id","~$org.clojure","~:artifact-id","~$google-closure-library","~:name","Google Closure Library","~:id","~$org.clojure/google-closure-library","~:url","http://code.google.com/p/closure-library/","~:parent-group-id","~$org.sonatype.oss","~:coordinate",["^J=","0.0-20191016-6ae1f72f"],"~:version","0.0-20191016-6ae1f72f"],"^J>",["~#url","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/locale/countries.js"],"~:provides",["^J4",["~$goog.locale.countries"]],"^IR",true,"^IS",["^IT"]],["^ ","^IV",[1579837703000],"^IW","goog.crypt.pbkdf2.js","^IX",["^IY","goog/crypt/pbkdf2.js"],"^IZ","goog/crypt/pbkdf2.js","^I[","^J0","^J1","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implementation of PBKDF2 in JavaScript.\n * @see http://en.wikipedia.org/wiki/PBKDF2\n *\n * Currently we only support HMAC-SHA1 as the underlying hash function. To add a\n * new hash function, add a static method similar to deriveKeyFromPasswordSha1()\n * and implement the specific computeBlockCallback() using the hash function.\n *\n * Usage:\n *   var key = pbkdf2.deriveKeySha1(\n *       stringToByteArray('password'), stringToByteArray('salt'), 1000, 128);\n *\n */\n\ngoog.provide('goog.crypt.pbkdf2');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.crypt');\ngoog.require('goog.crypt.Hmac');\ngoog.require('goog.crypt.Sha1');\n\n\n/**\n * Derives key from password using PBKDF2-SHA1\n * @param {!Array<number>} password Byte array representation of the password\n *     from which the key is derived.\n * @param {!Array<number>} initialSalt Byte array representation of the salt.\n * @param {number} iterations Number of interations when computing the key.\n * @param {number} keyLength Length of the output key in bits.\n *     Must be multiple of 8.\n * @return {!Array<number>} Byte array representation of the output key.\n */\ngoog.crypt.pbkdf2.deriveKeySha1 = function(\n    password, initialSalt, iterations, keyLength) {\n  // Length of the HMAC-SHA1 output in bits.\n  var HASH_LENGTH = 160;\n\n  /**\n   * Compute each block of the key using HMAC-SHA1.\n   * @param {!Array<number>} index Byte array representation of the index of\n   *     the block to be computed.\n   * @return {!Array<number>} Byte array representation of the output block.\n   */\n  var computeBlock = function(index) {\n    // Initialize the result to be array of 0 such that its xor with the first\n    // block would be the first block.\n    var result = goog.array.repeat(0, HASH_LENGTH / 8);\n    // Initialize the salt of the first iteration to initialSalt || i.\n    var salt = initialSalt.concat(index);\n    var hmac = new goog.crypt.Hmac(new goog.crypt.Sha1(), password, 64);\n    // Compute and XOR each iteration.\n    for (var i = 0; i < iterations; i++) {\n      // The salt of the next iteration is the result of the current iteration.\n      salt = hmac.getHmac(salt);\n      result = goog.crypt.xorByteArray(result, salt);\n    }\n    return result;\n  };\n\n  return goog.crypt.pbkdf2.deriveKeyFromPassword_(\n      computeBlock, HASH_LENGTH, keyLength);\n};\n\n\n/**\n * Compute each block of the key using PBKDF2.\n * @param {Function} computeBlock Function to compute each block of the output\n *     key.\n * @param {number} hashLength Length of each block in bits. This is determined\n *     by the specific hash function used. Must be multiple of 8.\n * @param {number} keyLength Length of the output key in bits.\n *     Must be multiple of 8.\n * @return {!Array<number>} Byte array representation of the output key.\n * @private\n */\ngoog.crypt.pbkdf2.deriveKeyFromPassword_ = function(\n    computeBlock, hashLength, keyLength) {\n  goog.asserts.assert(keyLength % 8 == 0, 'invalid output key length');\n\n  // Compute and concactate each block of the output key.\n  var numBlocks = Math.ceil(keyLength / hashLength);\n  goog.asserts.assert(numBlocks >= 1, 'invalid number of blocks');\n  var result = [];\n  for (var i = 1; i <= numBlocks; i++) {\n    var indexBytes = goog.crypt.pbkdf2.integerToByteArray_(i);\n    result = result.concat(computeBlock(indexBytes));\n  }\n\n  // Trim the last block if needed.\n  var lastBlockSize = keyLength % hashLength;\n  if (lastBlockSize != 0) {\n    var desiredBytes = ((numBlocks - 1) * hashLength + lastBlockSize) / 8;\n    result.splice(desiredBytes, (hashLength - lastBlockSize) / 8);\n  }\n  return result;\n};\n\n\n/**\n * Converts an integer number to a 32-bit big endian byte array.\n * @param {number} n Integer number to be converted.\n * @return {!Array<number>} Byte Array representation of the 32-bit big endian\n *     encoding of n.\n * @private\n */\ngoog.crypt.pbkdf2.integerToByteArray_ = function(n) {\n  var result = new Array(4);\n  result[0] = n >> 24 & 0xFF;\n  result[1] = n >> 16 & 0xFF;\n  result[2] = n >> 8 & 0xFF;\n  result[3] = n & 0xFF;\n  return result;\n};\n","^J2",1579837703000,"^J3",["^J4",["~$goog.asserts","~$goog.crypt","~$goog.crypt.Hmac","~$goog.crypt.Sha1","^IT","~$goog.array"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/pbkdf2.js"],"^JD",["^J4",["~$goog.crypt.pbkdf2"]],"^IR",true,"^IS",["^IT","^JJ","^JF","^JG","^JH","^JI"]],["^ ","^IV",[1579837703000],"^IW","goog.color.alpha.js","^IX",["^IY","goog/color/alpha.js"],"^IZ","goog/color/alpha.js","^I[","^J0","^J1","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utilities related to alpha/transparent colors and alpha color\n * conversion.\n */\n\ngoog.provide('goog.color.alpha');\n\ngoog.require('goog.color');\n\n\n/**\n * Parses an alpha color out of a string.\n * @param {string} str Color in some format.\n * @return {{hex: string, type: string}} 'hex' is a string containing\n *     a hex representation of the color, and 'type' is a string\n *     containing the type of color format passed in ('hex', 'rgb', 'named').\n */\ngoog.color.alpha.parse = function(str) {\n  var result = {};\n  str = String(str);\n\n  var maybeHex = goog.color.prependHashIfNecessaryHelper(str);\n  if (goog.color.alpha.isValidAlphaHexColor_(maybeHex)) {\n    result.hex = goog.color.alpha.normalizeAlphaHex_(maybeHex);\n    result.type = 'hex';\n    return result;\n  } else {\n    var rgba = goog.color.alpha.isValidRgbaColor_(str);\n    if (rgba.length) {\n      result.hex = goog.color.alpha.rgbaArrayToHex(rgba);\n      result.type = 'rgba';\n      return result;\n    } else {\n      var hsla = goog.color.alpha.isValidHslaColor_(str);\n      if (hsla.length) {\n        result.hex = goog.color.alpha.hslaArrayToHex(hsla);\n        result.type = 'hsla';\n        return result;\n      }\n    }\n  }\n  throw new Error(str + ' is not a valid color string');\n};\n\n\n/**\n * Converts a hex representation of a color to RGBA.\n * @param {string} hexColor Color to convert.\n * @return {string} string of the form 'rgba(R,G,B,A)' which can be used in\n *    styles.\n */\ngoog.color.alpha.hexToRgbaStyle = function(hexColor) {\n  return goog.color.alpha.rgbaStyle_(goog.color.alpha.hexToRgba(hexColor));\n};\n\n\n/**\n * Extracts a substring, from startIdx to endIdx, of the normalized (lowercase\n * #rrggbbaa) form of a hex-with-alpha color.\n * @param {string} colorWithAlpha The alpha hex color to get the hex color from.\n *     This may be four or eight digits.\n * @param {number} startIdx The start index within the #rrggbbaa color.\n * @param {number} endIdx The end index within the #rrggbbbaa color.\n * @return {string} The requested startIdx-to-endIdx substring from the color.\n * @private\n */\ngoog.color.alpha.extractColor_ = function(colorWithAlpha, startIdx, endIdx) {\n  if (goog.color.alpha.isValidAlphaHexColor_(colorWithAlpha)) {\n    var fullColor = goog.color.prependHashIfNecessaryHelper(colorWithAlpha);\n    var normalizedColor = goog.color.alpha.normalizeAlphaHex_(fullColor);\n    return normalizedColor.substring(startIdx, endIdx);\n  } else {\n    throw new Error(colorWithAlpha + ' is not a valid 8-hex color string');\n  }\n};\n\n\n/**\n * Gets the hex color part of an alpha hex color. For example, both '#abcd' and\n * '#AABBCC12' return '#aabbcc'.\n * @param {string} colorWithAlpha The alpha hex color to get the hex color from.\n * @return {string} The hex color where the alpha part has been stripped off.\n */\ngoog.color.alpha.extractHexColor = function(colorWithAlpha) {\n  return goog.color.alpha.extractColor_(colorWithAlpha, 0, 7);\n};\n\n\n/**\n * Gets the alpha color part of an alpha hex color. For example, both '#123A'\n * and '#123456aa' return 'aa'. The result is always two characters long.\n * @param {string} colorWithAlpha The alpha hex color to get the hex color from.\n * @return {string} The two-character alpha from the given color.\n */\ngoog.color.alpha.extractAlpha = function(colorWithAlpha) {\n  return goog.color.alpha.extractColor_(colorWithAlpha, 7, 9);\n};\n\n\n/**\n * Regular expression for extracting the digits in a hex color quadruplet.\n * @const {!RegExp}\n * @private\n */\ngoog.color.alpha.hexQuadrupletRe_ = /#(.)(.)(.)(.)/;\n\n\n/**\n * Normalize a hex representation of an alpha color.\n * @param {string} hexColor an alpha hex color string.\n * @return {string} hex color in the format '#rrggbbaa' with all lowercase\n *     literals.\n * @private\n */\ngoog.color.alpha.normalizeAlphaHex_ = function(hexColor) {\n  if (!goog.color.alpha.isValidAlphaHexColor_(hexColor)) {\n    throw new Error('\\'' + hexColor + '\\' is not a valid alpha hex color');\n  }\n  if (hexColor.length == 5) {  // of the form #RGBA\n    hexColor = hexColor.replace(\n        goog.color.alpha.hexQuadrupletRe_, '#$1$1$2$2$3$3$4$4');\n  }\n  return hexColor.toLowerCase();\n};\n\n\n/**\n * Converts an 8-hex representation of a color to RGBA.\n * @param {string} hexColor Color to convert.\n * @return {!Array<number>} array containing [r, g, b, a].\n *     r, g, b are ints between 0\n *     and 255, and a is a value between 0 and 1.\n */\ngoog.color.alpha.hexToRgba = function(hexColor) {\n  // TODO(user): Enhance code sharing with goog.color, for example by\n  //     adding a goog.color.genericHexToRgb method.\n  hexColor = goog.color.alpha.normalizeAlphaHex_(hexColor);\n  var r = parseInt(hexColor.substr(1, 2), 16);\n  var g = parseInt(hexColor.substr(3, 2), 16);\n  var b = parseInt(hexColor.substr(5, 2), 16);\n  var a = parseInt(hexColor.substr(7, 2), 16);\n\n  return [r, g, b, a / 255];\n};\n\n\n/**\n * Converts a color from RGBA to hex representation.\n * @param {number} r Amount of red, int between 0 and 255.\n * @param {number} g Amount of green, int between 0 and 255.\n * @param {number} b Amount of blue, int between 0 and 255.\n * @param {number} a Amount of alpha, float between 0 and 1.\n * @return {string} hex representation of the color.\n */\ngoog.color.alpha.rgbaToHex = function(r, g, b, a) {\n  var intAlpha = Math.floor(a * 255);\n  if (isNaN(intAlpha) || intAlpha < 0 || intAlpha > 255) {\n    // TODO(user): The CSS spec says the value should be clamped.\n    throw new Error(\n        '\"(' + r + ',' + g + ',' + b + ',' + a +\n        '\") is not a valid RGBA color');\n  }\n  var hexA = goog.color.prependZeroIfNecessaryHelper(intAlpha.toString(16));\n  return goog.color.rgbToHex(r, g, b) + hexA;\n};\n\n\n/**\n * Converts a color from HSLA to hex representation.\n * @param {number} h Amount of hue, int between 0 and 360.\n * @param {number} s Amount of saturation, int between 0 and 100.\n * @param {number} l Amount of lightness, int between 0 and 100.\n * @param {number} a Amount of alpha, float between 0 and 1.\n * @return {string} hex representation of the color.\n */\ngoog.color.alpha.hslaToHex = function(h, s, l, a) {\n  var intAlpha = Math.floor(a * 255);\n  if (isNaN(intAlpha) || intAlpha < 0 || intAlpha > 255) {\n    // TODO(user): The CSS spec says the value should be clamped.\n    throw new Error(\n        '\"(' + h + ',' + s + ',' + l + ',' + a +\n        '\") is not a valid HSLA color');\n  }\n  var hexA = goog.color.prependZeroIfNecessaryHelper(intAlpha.toString(16));\n  return goog.color.hslToHex(h, s / 100, l / 100) + hexA;\n};\n\n\n/**\n * Converts a color from RGBA to hex representation.\n * @param {!Array<number>} rgba Array of [r, g, b, a], with r, g, b in [0, 255]\n *     and a in [0, 1].\n * @return {string} hex representation of the color.\n */\ngoog.color.alpha.rgbaArrayToHex = function(rgba) {\n  return goog.color.alpha.rgbaToHex(rgba[0], rgba[1], rgba[2], rgba[3]);\n};\n\n\n/**\n * Converts a color from RGBA to an RGBA style string.\n * @param {number} r Value of red, in [0, 255].\n * @param {number} g Value of green, in [0, 255].\n * @param {number} b Value of blue, in [0, 255].\n * @param {number} a Value of alpha, in [0, 1].\n * @return {string} An 'rgba(r,g,b,a)' string ready for use in a CSS rule.\n */\ngoog.color.alpha.rgbaToRgbaStyle = function(r, g, b, a) {\n  if (isNaN(r) || r < 0 || r > 255 || isNaN(g) || g < 0 || g > 255 ||\n      isNaN(b) || b < 0 || b > 255 || isNaN(a) || a < 0 || a > 1) {\n    throw new Error(\n        '\"(' + r + ',' + g + ',' + b + ',' + a +\n        ')\" is not a valid RGBA color');\n  }\n  return goog.color.alpha.rgbaStyle_([r, g, b, a]);\n};\n\n\n/**\n * Converts a color from RGBA to an RGBA style string.\n * @param {(!Array<number>|!Float32Array)} rgba Array of [r, g, b, a],\n *     with r, g, b in [0, 255] and a in [0, 1].\n * @return {string} An 'rgba(r,g,b,a)' string ready for use in a CSS rule.\n */\ngoog.color.alpha.rgbaArrayToRgbaStyle = function(rgba) {\n  return goog.color.alpha.rgbaToRgbaStyle(rgba[0], rgba[1], rgba[2], rgba[3]);\n};\n\n\n/**\n * Converts a color from HSLA to hex representation.\n * @param {!Array<number>} hsla Array of [h, s, l, a], where h is an integer in\n *     [0, 360], s and l are integers in [0, 100], and a is in [0, 1].\n * @return {string} hex representation of the color, such as '#af457eff'.\n */\ngoog.color.alpha.hslaArrayToHex = function(hsla) {\n  return goog.color.alpha.hslaToHex(hsla[0], hsla[1], hsla[2], hsla[3]);\n};\n\n\n/**\n * Converts a color from HSLA to an RGBA style string.\n * @param {!Array<number>} hsla Array of [h, s, l, a], where h is and integer in\n *     [0, 360], s and l are integers in [0, 100], and a is in [0, 1].\n * @return {string} An 'rgba(r,g,b,a)' string ready for use in a CSS rule.\n */\ngoog.color.alpha.hslaArrayToRgbaStyle = function(hsla) {\n  return goog.color.alpha.hslaToRgbaStyle(hsla[0], hsla[1], hsla[2], hsla[3]);\n};\n\n\n/**\n * Converts a color from HSLA to an RGBA style string.\n * @param {number} h Amount of hue, int between 0 and 360.\n * @param {number} s Amount of saturation, int between 0 and 100.\n * @param {number} l Amount of lightness, int between 0 and 100.\n * @param {number} a Amount of alpha, float between 0 and 1.\n * @return {string} An 'rgba(r,g,b,a)' string ready for use in a CSS rule.\n *     styles.\n */\ngoog.color.alpha.hslaToRgbaStyle = function(h, s, l, a) {\n  return goog.color.alpha.rgbaStyle_(goog.color.alpha.hslaToRgba(h, s, l, a));\n};\n\n\n/**\n * Converts a color from HSLA color space to RGBA color space.\n * @param {number} h Amount of hue, int between 0 and 360.\n * @param {number} s Amount of saturation, int between 0 and 100.\n * @param {number} l Amount of lightness, int between 0 and 100.\n * @param {number} a Amount of alpha, float between 0 and 1.\n * @return {!Array<number>} [r, g, b, a] values for the color, where r, g, b\n *     are integers in [0, 255] and a is a float in [0, 1].\n */\ngoog.color.alpha.hslaToRgba = function(h, s, l, a) {\n  return goog.color.hslToRgb(h, s / 100, l / 100).concat(a);\n};\n\n\n/**\n * Converts a color from RGBA color space to HSLA color space.\n * Modified from {@link http://en.wikipedia.org/wiki/HLS_color_space}.\n * @param {number} r Value of red, in [0, 255].\n * @param {number} g Value of green, in [0, 255].\n * @param {number} b Value of blue, in [0, 255].\n * @param {number} a Value of alpha, in [0, 255].\n * @return {!Array<number>} [h, s, l, a] values for the color, with h an int in\n *     [0, 360] and s, l and a in [0, 1].\n */\ngoog.color.alpha.rgbaToHsla = function(r, g, b, a) {\n  return goog.color.rgbToHsl(r, g, b).concat(a);\n};\n\n\n/**\n * Converts a color from RGBA color space to HSLA color space.\n * @param {!Array<number>} rgba [r, g, b, a] values for the color, each in\n *     [0, 255].\n * @return {!Array<number>} [h, s, l, a] values for the color, with h in\n *     [0, 360] and s, l and a in [0, 1].\n */\ngoog.color.alpha.rgbaArrayToHsla = function(rgba) {\n  return goog.color.alpha.rgbaToHsla(rgba[0], rgba[1], rgba[2], rgba[3]);\n};\n\n\n/**\n * Helper for isValidAlphaHexColor_.\n * @const {!RegExp}\n * @private\n */\ngoog.color.alpha.validAlphaHexColorRe_ = /^#(?:[0-9a-f]{4}){1,2}$/i;\n\n\n/**\n * Checks if a string is a valid alpha hex color.  We expect strings of the\n * format #RRGGBBAA (ex: #1b3d5f5b) or #RGBA (ex: #3CAF == #33CCAAFF).\n * @param {string} str String to check.\n * @return {boolean} Whether the string is a valid alpha hex color.\n * @private\n */\n// TODO(user): Support percentages when goog.color also supports them.\ngoog.color.alpha.isValidAlphaHexColor_ = function(str) {\n  return goog.color.alpha.validAlphaHexColorRe_.test(str);\n};\n\n\n/**\n * Helper for isNormalizedAlphaHexColor_.\n * @const {!RegExp}\n * @private\n */\ngoog.color.alpha.normalizedAlphaHexColorRe_ = /^#[0-9a-f]{8}$/;\n\n\n/**\n * Checks if a string is a normalized alpha hex color.\n * We expect strings of the format #RRGGBBAA (ex: #1b3d5f5b)\n * using only lowercase letters.\n * @param {string} str String to check.\n * @return {boolean} Whether the string is a normalized hex color.\n * @private\n */\ngoog.color.alpha.isNormalizedAlphaHexColor_ = function(str) {\n  return goog.color.alpha.normalizedAlphaHexColorRe_.test(str);\n};\n\n\n/**\n * A pattern capturing any 3-digit number (without leading 0s).\n * @const {!RegExp}\n * @private\n */\ngoog.color.alpha.re0_999_ = /(0|[1-9]\\d{0,2})/;\n\n/**\n * A pattern capturing [0.0000000000...1.0000000000].\n * @const {!RegExp}\n * @private\n */\ngoog.color.alpha.re0_1_ = /(0|1|0\\.\\d{1,10}|1\\.0{1,10})/;\n\n/**\n * Regular expression for matching and capturing RGBA style strings. Helper for\n * isValidRgbaColor_.\n * @type {!RegExp}\n * @private\n */\ngoog.color.alpha.rgbaColorRe_ = new RegExp(\n    '^\\\\s*(?:rgba)?\\\\(' +                             //\n        goog.color.alpha.re0_999_.source + ',\\\\s*' +  //\n        goog.color.alpha.re0_999_.source + ',\\\\s*' +  //\n        goog.color.alpha.re0_999_.source + ',\\\\s*' +  //\n        goog.color.alpha.re0_1_.source + '\\\\)\\\\s*$',\n    'i');\n\n\n/**\n * Regular expression for matching and capturing HSLA style strings. Helper for\n * isValidHslaColor_.\n * @type {!RegExp}\n * @private\n */\ngoog.color.alpha.hslaColorRe_ = new RegExp(\n    '^\\\\s*(?:hsla)?\\\\(' +                              //\n        goog.color.alpha.re0_999_.source + ',\\\\s*' +   //\n        goog.color.alpha.re0_999_.source + '%,\\\\s*' +  //\n        goog.color.alpha.re0_999_.source + '%,\\\\s*' +  //\n        goog.color.alpha.re0_1_.source + '\\\\)\\\\s*$',\n    'i');\n\n/**\n * Checks if a string is a valid rgba color.  We expect strings of the format\n * '(r, g, b, a)', or 'rgba(r, g, b, a)', where r, g, b are ints in [0, 255]\n *     and a is a float in [0, 1].\n * @param {string} str String to check.\n * @return {!Array<number>} the integers [r, g, b, a] for valid colors or the\n *     empty array for invalid colors.\n * @private\n */\ngoog.color.alpha.isValidRgbaColor_ = function(str) {\n  // Each component is separate (rather than using a repeater) so we can\n  // capture the match. Also, we explicitly set each component to be either 0,\n  // or start with a non-zero, to prevent octal numbers from slipping through.\n  var regExpResultArray = str.match(goog.color.alpha.rgbaColorRe_);\n  if (regExpResultArray) {\n    var r = Number(regExpResultArray[1]);\n    var g = Number(regExpResultArray[2]);\n    var b = Number(regExpResultArray[3]);\n    var a = Number(regExpResultArray[4]);\n    if (r >= 0 && r <= 255 && g >= 0 && g <= 255 && b >= 0 && b <= 255 &&\n        a >= 0 && a <= 1) {\n      return [r, g, b, a];\n    }\n  }\n  return [];\n};\n\n\n/**\n * Checks if a string is a valid hsla color.  We expect strings of the format\n * 'hsla(h, s, l, a)', where s in an int in [0, 360], s and l are percentages\n *     between 0 and 100 such as '50%' or '70%', and a is a float in [0, 1].\n * @param {string} str String to check.\n * @return {!Array<number>} the integers [h, s, l, a] for valid colors or the\n *     empty array for invalid colors.\n * @private\n */\ngoog.color.alpha.isValidHslaColor_ = function(str) {\n  // Each component is separate (rather than using a repeater) so we can\n  // capture the match. Also, we explicitly set each component to be either 0,\n  // or start with a non-zero, to prevent octal numbers from slipping through.\n  var regExpResultArray = str.match(goog.color.alpha.hslaColorRe_);\n  if (regExpResultArray) {\n    var h = Number(regExpResultArray[1]);\n    var s = Number(regExpResultArray[2]);\n    var l = Number(regExpResultArray[3]);\n    var a = Number(regExpResultArray[4]);\n    if (h >= 0 && h <= 360 && s >= 0 && s <= 100 && l >= 0 && l <= 100 &&\n        a >= 0 && a <= 1) {\n      return [h, s, l, a];\n    }\n  }\n  return [];\n};\n\n\n/**\n * Takes an array of [r, g, b, a] and converts it into a string appropriate for\n * CSS styles. The alpha channel value is rounded to 3 decimal places to make\n * sure the produced string is not too long.\n * @param {!Array<number>} rgba [r, g, b, a] with r, g, b in [0, 255] and a\n *     in [0, 1].\n * @return {string} string of the form 'rgba(r,g,b,a)'.\n * @private\n */\ngoog.color.alpha.rgbaStyle_ = function(rgba) {\n  var roundedRgba = rgba.slice(0);\n  roundedRgba[3] = Math.round(rgba[3] * 1000) / 1000;\n  return 'rgba(' + roundedRgba.join(',') + ')';\n};\n\n\n/**\n * Converts from h,s,v,a values to a hex string\n * @param {number} h Hue, in [0, 1].\n * @param {number} s Saturation, in [0, 1].\n * @param {number} v Value, in [0, 255].\n * @param {number} a Alpha, in [0, 1].\n * @return {string} hex representation of the color.\n */\ngoog.color.alpha.hsvaToHex = function(h, s, v, a) {\n  var alpha = Math.floor(a * 255);\n  return goog.color.hsvArrayToHex([h, s, v]) +\n      goog.color.prependZeroIfNecessaryHelper(alpha.toString(16));\n};\n\n\n/**\n * Converts from an HSVA array to a hex string\n * @param {!Array<number>} hsva Array of [h, s, v, a] in\n *     [[0, 1], [0, 1], [0, 255], [0, 1]].\n * @return {string} hex representation of the color.\n */\ngoog.color.alpha.hsvaArrayToHex = function(hsva) {\n  return goog.color.alpha.hsvaToHex(hsva[0], hsva[1], hsva[2], hsva[3]);\n};\n","^J2",1579837703000,"^J3",["^J4",["~$goog.color","^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/color/alpha.js"],"^JD",["^J4",["~$goog.color.alpha"]],"^IR",true,"^IS",["^IT","^JL"]],["^ ","^IV",[1579837703000],"^IW","goog.positioning.positioning.js","^IX",["^IY","goog/positioning/positioning.js"],"^IZ","goog/positioning/positioning.js","^I[","^J0","^J1","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Common positioning code.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.positioning');\ngoog.provide('goog.positioning.Corner');\ngoog.provide('goog.positioning.CornerBit');\ngoog.provide('goog.positioning.Overflow');\ngoog.provide('goog.positioning.OverflowStatus');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.math.Rect');\ngoog.require('goog.math.Size');\ngoog.require('goog.style');\ngoog.require('goog.style.bidi');\n\n\n/**\n * Enum for bits in the {@see goog.positioning.Corner) bitmap.\n *\n * @enum {number}\n */\ngoog.positioning.CornerBit = {\n  BOTTOM: 1,\n  CENTER: 2,\n  RIGHT: 4,\n  FLIP_RTL: 8\n};\n\n\n/**\n * Enum for representing an element corner for positioning the popup.\n *\n * The START constants map to LEFT if element directionality is left\n * to right and RIGHT if the directionality is right to left.\n * Likewise END maps to RIGHT or LEFT depending on the directionality.\n *\n * @enum {number}\n */\ngoog.positioning.Corner = {\n  TOP_LEFT: 0,\n  TOP_RIGHT: goog.positioning.CornerBit.RIGHT,\n  BOTTOM_LEFT: goog.positioning.CornerBit.BOTTOM,\n  BOTTOM_RIGHT:\n      goog.positioning.CornerBit.BOTTOM | goog.positioning.CornerBit.RIGHT,\n  TOP_START: goog.positioning.CornerBit.FLIP_RTL,\n  TOP_END:\n      goog.positioning.CornerBit.FLIP_RTL | goog.positioning.CornerBit.RIGHT,\n  BOTTOM_START:\n      goog.positioning.CornerBit.BOTTOM | goog.positioning.CornerBit.FLIP_RTL,\n  BOTTOM_END: goog.positioning.CornerBit.BOTTOM |\n      goog.positioning.CornerBit.RIGHT | goog.positioning.CornerBit.FLIP_RTL,\n  TOP_CENTER: goog.positioning.CornerBit.CENTER,\n  BOTTOM_CENTER:\n      goog.positioning.CornerBit.BOTTOM | goog.positioning.CornerBit.CENTER\n};\n\n\n/**\n * Enum for representing position handling in cases where the element would be\n * positioned outside the viewport.\n *\n * @enum {number}\n */\ngoog.positioning.Overflow = {\n  /** Ignore overflow */\n  IGNORE: 0,\n\n  /** Try to fit horizontally in the viewport at all costs. */\n  ADJUST_X: 1,\n\n  /** If the element can't fit horizontally, report positioning failure. */\n  FAIL_X: 2,\n\n  /** Try to fit vertically in the viewport at all costs. */\n  ADJUST_Y: 4,\n\n  /** If the element can't fit vertically, report positioning failure. */\n  FAIL_Y: 8,\n\n  /** Resize the element's width to fit in the viewport. */\n  RESIZE_WIDTH: 16,\n\n  /** Resize the element's height to fit in the viewport. */\n  RESIZE_HEIGHT: 32,\n\n  /**\n   * If the anchor goes off-screen in the x-direction, position the movable\n   * element off-screen. Otherwise, try to fit horizontally in the viewport.\n   */\n  ADJUST_X_EXCEPT_OFFSCREEN: 64 | 1,\n\n  /**\n   * If the anchor goes off-screen in the y-direction, position the movable\n   * element off-screen. Otherwise, try to fit vertically in the viewport.\n   */\n  ADJUST_Y_EXCEPT_OFFSCREEN: 128 | 4\n};\n\n\n/**\n * Enum for representing the outcome of a positioning call.\n *\n * @enum {number}\n */\ngoog.positioning.OverflowStatus = {\n  NONE: 0,\n  ADJUSTED_X: 1,\n  ADJUSTED_Y: 2,\n  WIDTH_ADJUSTED: 4,\n  HEIGHT_ADJUSTED: 8,\n  FAILED_LEFT: 16,\n  FAILED_RIGHT: 32,\n  FAILED_TOP: 64,\n  FAILED_BOTTOM: 128,\n  FAILED_OUTSIDE_VIEWPORT: 256\n};\n\n\n/**\n * Shorthand to check if a status code contains any fail code.\n * @type {number}\n */\ngoog.positioning.OverflowStatus.FAILED =\n    goog.positioning.OverflowStatus.FAILED_LEFT |\n    goog.positioning.OverflowStatus.FAILED_RIGHT |\n    goog.positioning.OverflowStatus.FAILED_TOP |\n    goog.positioning.OverflowStatus.FAILED_BOTTOM |\n    goog.positioning.OverflowStatus.FAILED_OUTSIDE_VIEWPORT;\n\n\n/**\n * Shorthand to check if horizontal positioning failed.\n * @type {number}\n */\ngoog.positioning.OverflowStatus.FAILED_HORIZONTAL =\n    goog.positioning.OverflowStatus.FAILED_LEFT |\n    goog.positioning.OverflowStatus.FAILED_RIGHT;\n\n\n/**\n * Shorthand to check if vertical positioning failed.\n * @type {number}\n */\ngoog.positioning.OverflowStatus.FAILED_VERTICAL =\n    goog.positioning.OverflowStatus.FAILED_TOP |\n    goog.positioning.OverflowStatus.FAILED_BOTTOM;\n\n\n/**\n * Positions a movable element relative to an anchor element. The caller\n * specifies the corners that should touch. This functions then moves the\n * movable element accordingly.\n *\n * @param {Element} anchorElement The element that is the anchor for where\n *    the movable element should position itself.\n * @param {goog.positioning.Corner} anchorElementCorner The corner of the\n *     anchorElement for positioning the movable element.\n * @param {Element} movableElement The element to move.\n * @param {goog.positioning.Corner} movableElementCorner The corner of the\n *     movableElement that that should be positioned adjacent to the anchor\n *     element.\n * @param {goog.math.Coordinate=} opt_offset An offset specified in pixels.\n *    After the normal positioning algorithm is applied, the offset is then\n *    applied. Positive coordinates move the popup closer to the center of the\n *    anchor element. Negative coordinates move the popup away from the center\n *    of the anchor element.\n * @param {goog.math.Box=} opt_margin A margin specified in pixels.\n *    After the normal positioning algorithm is applied and any offset, the\n *    margin is then applied. Positive coordinates move the popup away from the\n *    spot it was positioned towards its center. Negative coordinates move it\n *    towards the spot it was positioned away from its center.\n * @param {?number=} opt_overflow Overflow handling mode. Defaults to IGNORE if\n *     not specified. Bitmap, {@see goog.positioning.Overflow}.\n * @param {goog.math.Size=} opt_preferredSize The preferred size of the\n *     movableElement.\n * @param {goog.math.Box=} opt_viewport Box object describing the dimensions of\n *     the viewport. The viewport is specified relative to offsetParent of\n *     `movableElement`. In other words, the viewport can be thought of as\n *     describing a \"position: absolute\" element contained in the offsetParent.\n *     It defaults to visible area of nearest scrollable ancestor of\n *     `movableElement` (see `goog.style.getVisibleRectForElement`).\n * @return {goog.positioning.OverflowStatus} Status bitmap,\n *     {@see goog.positioning.OverflowStatus}.\n */\ngoog.positioning.positionAtAnchor = function(\n    anchorElement, anchorElementCorner, movableElement, movableElementCorner,\n    opt_offset, opt_margin, opt_overflow, opt_preferredSize, opt_viewport) {\n\n  goog.asserts.assert(movableElement);\n  var movableParentTopLeft =\n      goog.positioning.getOffsetParentPageOffset(movableElement);\n\n  // Get the visible part of the anchor element.  anchorRect is\n  // relative to anchorElement's page.\n  var anchorRect = goog.positioning.getVisiblePart_(anchorElement);\n\n  // Translate anchorRect to be relative to movableElement's page.\n  goog.style.translateRectForAnotherFrame(\n      anchorRect, goog.dom.getDomHelper(anchorElement),\n      goog.dom.getDomHelper(movableElement));\n\n  // Offset based on which corner of the element we want to position against.\n  var corner =\n      goog.positioning.getEffectiveCorner(anchorElement, anchorElementCorner);\n  var offsetLeft = anchorRect.left;\n  if (corner & goog.positioning.CornerBit.RIGHT) {\n    offsetLeft += anchorRect.width;\n  } else if (corner & goog.positioning.CornerBit.CENTER) {\n    offsetLeft += anchorRect.width / 2;\n  }\n\n  // absolutePos is a candidate position relative to the\n  // movableElement's window.\n  var absolutePos = new goog.math.Coordinate(\n      offsetLeft, anchorRect.top +\n          (corner & goog.positioning.CornerBit.BOTTOM ? anchorRect.height : 0));\n\n  // Translate absolutePos to be relative to the offsetParent.\n  absolutePos =\n      goog.math.Coordinate.difference(absolutePos, movableParentTopLeft);\n\n  // Apply offset, if specified\n  if (opt_offset) {\n    absolutePos.x +=\n        (corner & goog.positioning.CornerBit.RIGHT ? -1 : 1) * opt_offset.x;\n    absolutePos.y +=\n        (corner & goog.positioning.CornerBit.BOTTOM ? -1 : 1) * opt_offset.y;\n  }\n\n  // Determine dimension of viewport.\n  var viewport;\n  if (opt_overflow) {\n    if (opt_viewport) {\n      viewport = opt_viewport;\n    } else {\n      viewport = goog.style.getVisibleRectForElement(movableElement);\n      if (viewport) {\n        viewport.top -= movableParentTopLeft.y;\n        viewport.right -= movableParentTopLeft.x;\n        viewport.bottom -= movableParentTopLeft.y;\n        viewport.left -= movableParentTopLeft.x;\n      }\n    }\n  }\n\n  return goog.positioning.positionAtCoordinate(\n      absolutePos, movableElement, movableElementCorner, opt_margin, viewport,\n      opt_overflow, opt_preferredSize);\n};\n\n\n/**\n * Calculates the page offset of the given element's\n * offsetParent. This value can be used to translate any x- and\n * y-offset relative to the page to an offset relative to the\n * offsetParent, which can then be used directly with as position\n * coordinate for `positionWithCoordinate`.\n * @param {!Element} movableElement The element to calculate.\n * @return {!goog.math.Coordinate} The page offset, may be (0, 0).\n */\ngoog.positioning.getOffsetParentPageOffset = function(movableElement) {\n  // Ignore offset for the BODY element unless its position is non-static.\n  // For cases where the offset parent is HTML rather than the BODY (such as in\n  // IE strict mode) there's no need to get the position of the BODY as it\n  // doesn't affect the page offset.\n  var movableParentTopLeft;\n  var parent = /** @type {?} */ (movableElement).offsetParent;\n  if (parent) {\n    var isBody = parent.tagName == goog.dom.TagName.HTML ||\n        parent.tagName == goog.dom.TagName.BODY;\n    if (!isBody || goog.style.getComputedPosition(parent) != 'static') {\n      // Get the top-left corner of the parent, in page coordinates.\n      movableParentTopLeft = goog.style.getPageOffset(parent);\n\n      if (!isBody) {\n        movableParentTopLeft = goog.math.Coordinate.difference(\n            movableParentTopLeft,\n            new goog.math.Coordinate(\n                goog.style.bidi.getScrollLeft(parent), parent.scrollTop));\n      }\n    }\n  }\n\n  return movableParentTopLeft || new goog.math.Coordinate();\n};\n\n\n/**\n * Returns intersection of the specified element and\n * goog.style.getVisibleRectForElement for it.\n *\n * @param {Element} el The target element.\n * @return {!goog.math.Rect} Intersection of getVisibleRectForElement\n *     and the current bounding rectangle of the element.  If the\n *     intersection is empty, returns the bounding rectangle.\n * @private\n */\ngoog.positioning.getVisiblePart_ = function(el) {\n  var rect = goog.style.getBounds(el);\n  var visibleBox = goog.style.getVisibleRectForElement(el);\n  if (visibleBox) {\n    rect.intersection(goog.math.Rect.createFromBox(visibleBox));\n  }\n  return rect;\n};\n\n\n/**\n * Positions the specified corner of the movable element at the\n * specified coordinate.\n *\n * @param {goog.math.Coordinate} absolutePos The coordinate to position the\n *     element at.\n * @param {Element} movableElement The element to be positioned.\n * @param {goog.positioning.Corner} movableElementCorner The corner of the\n *     movableElement that that should be positioned.\n * @param {goog.math.Box=} opt_margin A margin specified in pixels.\n *    After the normal positioning algorithm is applied and any offset, the\n *    margin is then applied. Positive coordinates move the popup away from the\n *    spot it was positioned towards its center. Negative coordinates move it\n *    towards the spot it was positioned away from its center.\n * @param {goog.math.Box=} opt_viewport Box object describing the dimensions of\n *     the viewport. Required if opt_overflow is specified.\n * @param {?number=} opt_overflow Overflow handling mode. Defaults to IGNORE if\n *     not specified, {@see goog.positioning.Overflow}.\n * @param {goog.math.Size=} opt_preferredSize The preferred size of the\n *     movableElement. Defaults to the current size.\n * @return {goog.positioning.OverflowStatus} Status bitmap.\n */\ngoog.positioning.positionAtCoordinate = function(\n    absolutePos, movableElement, movableElementCorner, opt_margin, opt_viewport,\n    opt_overflow, opt_preferredSize) {\n  absolutePos = absolutePos.clone();\n\n  // Offset based on attached corner and desired margin.\n  var corner =\n      goog.positioning.getEffectiveCorner(movableElement, movableElementCorner);\n  var elementSize = goog.style.getSize(movableElement);\n  var size =\n      opt_preferredSize ? opt_preferredSize.clone() : elementSize.clone();\n\n  var positionResult = goog.positioning.getPositionAtCoordinate(\n      absolutePos, size, corner, opt_margin, opt_viewport, opt_overflow);\n\n  if (positionResult.status & goog.positioning.OverflowStatus.FAILED) {\n    return positionResult.status;\n  }\n\n  goog.style.setPosition(movableElement, positionResult.rect.getTopLeft());\n  size = positionResult.rect.getSize();\n  if (!goog.math.Size.equals(elementSize, size)) {\n    goog.style.setBorderBoxSize(movableElement, size);\n  }\n\n  return positionResult.status;\n};\n\n\n/**\n * Computes the position for an element to be placed on-screen at the\n * specified coordinates. Returns an object containing both the resulting\n * rectangle, and the overflow status bitmap.\n *\n * @param {!goog.math.Coordinate} absolutePos The coordinate to position the\n *     element at.\n * @param {!goog.math.Size} elementSize The size of the element to be\n *     positioned.\n * @param {goog.positioning.Corner} elementCorner The corner of the\n *     movableElement that that should be positioned.\n * @param {goog.math.Box=} opt_margin A margin specified in pixels.\n *    After the normal positioning algorithm is applied and any offset, the\n *    margin is then applied. Positive coordinates move the popup away from the\n *    spot it was positioned towards its center. Negative coordinates move it\n *    towards the spot it was positioned away from its center.\n * @param {goog.math.Box=} opt_viewport Box object describing the dimensions of\n *     the viewport. Required if opt_overflow is specified.\n * @param {?number=} opt_overflow Overflow handling mode. Defaults to IGNORE\n *     if not specified, {@see goog.positioning.Overflow}.\n * @return {{rect:!goog.math.Rect, status:goog.positioning.OverflowStatus}}\n *     Object containing the computed position and status bitmap.\n */\ngoog.positioning.getPositionAtCoordinate = function(\n    absolutePos, elementSize, elementCorner, opt_margin, opt_viewport,\n    opt_overflow) {\n  absolutePos = absolutePos.clone();\n  elementSize = elementSize.clone();\n  var status = goog.positioning.OverflowStatus.NONE;\n\n  if (opt_margin || elementCorner != goog.positioning.Corner.TOP_LEFT) {\n    if (elementCorner & goog.positioning.CornerBit.RIGHT) {\n      absolutePos.x -= elementSize.width + (opt_margin ? opt_margin.right : 0);\n    } else if (elementCorner & goog.positioning.CornerBit.CENTER) {\n      absolutePos.x -= elementSize.width / 2;\n    } else if (opt_margin) {\n      absolutePos.x += opt_margin.left;\n    }\n    if (elementCorner & goog.positioning.CornerBit.BOTTOM) {\n      absolutePos.y -=\n          elementSize.height + (opt_margin ? opt_margin.bottom : 0);\n    } else if (opt_margin) {\n      absolutePos.y += opt_margin.top;\n    }\n  }\n\n  // Adjust position to fit inside viewport.\n  if (opt_overflow) {\n    status = opt_viewport ?\n        goog.positioning.adjustForViewport_(\n            absolutePos, elementSize, opt_viewport, opt_overflow) :\n        goog.positioning.OverflowStatus.FAILED_OUTSIDE_VIEWPORT;\n  }\n\n  var rect = new goog.math.Rect(0, 0, 0, 0);\n  rect.left = absolutePos.x;\n  rect.top = absolutePos.y;\n  rect.width = elementSize.width;\n  rect.height = elementSize.height;\n  return {rect: rect, status: status};\n};\n\n\n/**\n * Adjusts the position and/or size of an element, identified by its position\n * and size, to fit inside the viewport. If the position or size of the element\n * is adjusted the pos or size objects, respectively, are modified.\n *\n * @param {goog.math.Coordinate} pos Position of element, updated if the\n *     position is adjusted.\n * @param {goog.math.Size} size Size of element, updated if the size is\n *     adjusted.\n * @param {goog.math.Box} viewport Bounding box describing the viewport.\n * @param {number} overflow Overflow handling mode,\n *     {@see goog.positioning.Overflow}.\n * @return {goog.positioning.OverflowStatus} Status bitmap,\n *     {@see goog.positioning.OverflowStatus}.\n * @private\n */\ngoog.positioning.adjustForViewport_ = function(pos, size, viewport, overflow) {\n  var status = goog.positioning.OverflowStatus.NONE;\n\n  var ADJUST_X_EXCEPT_OFFSCREEN =\n      goog.positioning.Overflow.ADJUST_X_EXCEPT_OFFSCREEN;\n  var ADJUST_Y_EXCEPT_OFFSCREEN =\n      goog.positioning.Overflow.ADJUST_Y_EXCEPT_OFFSCREEN;\n  if ((overflow & ADJUST_X_EXCEPT_OFFSCREEN) == ADJUST_X_EXCEPT_OFFSCREEN &&\n      (pos.x < viewport.left || pos.x >= viewport.right)) {\n    overflow &= ~goog.positioning.Overflow.ADJUST_X;\n  }\n  if ((overflow & ADJUST_Y_EXCEPT_OFFSCREEN) == ADJUST_Y_EXCEPT_OFFSCREEN &&\n      (pos.y < viewport.top || pos.y >= viewport.bottom)) {\n    overflow &= ~goog.positioning.Overflow.ADJUST_Y;\n  }\n\n  // Left edge outside viewport, try to move it.\n  if (pos.x < viewport.left && overflow & goog.positioning.Overflow.ADJUST_X) {\n    pos.x = viewport.left;\n    status |= goog.positioning.OverflowStatus.ADJUSTED_X;\n  }\n\n  // Ensure object is inside the viewport width if required.\n  if (overflow & goog.positioning.Overflow.RESIZE_WIDTH) {\n    // Move left edge inside viewport.\n    var originalX = pos.x;\n    if (pos.x < viewport.left) {\n      pos.x = viewport.left;\n      status |= goog.positioning.OverflowStatus.WIDTH_ADJUSTED;\n    }\n\n    // Shrink width to inside right of viewport.\n    if (pos.x + size.width > viewport.right) {\n      // Set the width to be either the new maximum width within the viewport\n      // or the width originally within the viewport, whichever is less.\n      size.width = Math.min(\n          viewport.right - pos.x, originalX + size.width - viewport.left);\n      size.width = Math.max(size.width, 0);\n      status |= goog.positioning.OverflowStatus.WIDTH_ADJUSTED;\n    }\n  }\n\n  // Right edge outside viewport, try to move it.\n  if (pos.x + size.width > viewport.right &&\n      overflow & goog.positioning.Overflow.ADJUST_X) {\n    pos.x = Math.max(viewport.right - size.width, viewport.left);\n    status |= goog.positioning.OverflowStatus.ADJUSTED_X;\n  }\n\n  // Left or right edge still outside viewport, fail if the FAIL_X option was\n  // specified, ignore it otherwise.\n  if (overflow & goog.positioning.Overflow.FAIL_X) {\n    status |=\n        (pos.x < viewport.left ? goog.positioning.OverflowStatus.FAILED_LEFT :\n                                 0) |\n        (pos.x + size.width > viewport.right ?\n             goog.positioning.OverflowStatus.FAILED_RIGHT :\n             0);\n  }\n\n  // Top edge outside viewport, try to move it.\n  if (pos.y < viewport.top && overflow & goog.positioning.Overflow.ADJUST_Y) {\n    pos.y = viewport.top;\n    status |= goog.positioning.OverflowStatus.ADJUSTED_Y;\n  }\n\n  // Ensure object is inside the viewport height if required.\n  if (overflow & goog.positioning.Overflow.RESIZE_HEIGHT) {\n    // Move top edge inside viewport.\n    var originalY = pos.y;\n    if (pos.y < viewport.top) {\n      pos.y = viewport.top;\n      status |= goog.positioning.OverflowStatus.HEIGHT_ADJUSTED;\n    }\n\n    // Shrink height to inside bottom of viewport.\n    if (pos.y + size.height > viewport.bottom) {\n      // Set the height to be either the new maximum height within the viewport\n      // or the height originally within the viewport, whichever is less.\n      size.height = Math.min(\n          viewport.bottom - pos.y, originalY + size.height - viewport.top);\n      size.height = Math.max(size.height, 0);\n      status |= goog.positioning.OverflowStatus.HEIGHT_ADJUSTED;\n    }\n  }\n\n  // Bottom edge outside viewport, try to move it.\n  if (pos.y + size.height > viewport.bottom &&\n      overflow & goog.positioning.Overflow.ADJUST_Y) {\n    pos.y = Math.max(viewport.bottom - size.height, viewport.top);\n    status |= goog.positioning.OverflowStatus.ADJUSTED_Y;\n  }\n\n  // Top or bottom edge still outside viewport, fail if the FAIL_Y option was\n  // specified, ignore it otherwise.\n  if (overflow & goog.positioning.Overflow.FAIL_Y) {\n    status |=\n        (pos.y < viewport.top ? goog.positioning.OverflowStatus.FAILED_TOP :\n                                0) |\n        (pos.y + size.height > viewport.bottom ?\n             goog.positioning.OverflowStatus.FAILED_BOTTOM :\n             0);\n  }\n\n  return /** @type {!goog.positioning.OverflowStatus} */ (status);\n};\n\n\n/**\n * Returns an absolute corner (top/bottom left/right) given an absolute\n * or relative (top/bottom start/end) corner and the direction of an element.\n * Absolute corners remain unchanged.\n * @param {Element} element DOM element to test for RTL direction.\n * @param {goog.positioning.Corner} corner The popup corner used for\n *     positioning.\n * @return {goog.positioning.Corner} Effective corner.\n */\ngoog.positioning.getEffectiveCorner = function(element, corner) {\n  return /** @type {goog.positioning.Corner} */ (\n      (corner & goog.positioning.CornerBit.FLIP_RTL &&\n               goog.style.isRightToLeft(element) ?\n           corner ^ goog.positioning.CornerBit.RIGHT :\n           corner) &\n      ~goog.positioning.CornerBit.FLIP_RTL);\n};\n\n\n/**\n * Returns the corner opposite the given one horizontally.\n * @param {goog.positioning.Corner} corner The popup corner used to flip.\n * @return {goog.positioning.Corner} The opposite corner horizontally.\n */\ngoog.positioning.flipCornerHorizontal = function(corner) {\n  return /** @type {goog.positioning.Corner} */ (\n      corner ^ goog.positioning.CornerBit.RIGHT);\n};\n\n\n/**\n * Returns the corner opposite the given one vertically.\n * @param {goog.positioning.Corner} corner The popup corner used to flip.\n * @return {goog.positioning.Corner} The opposite corner vertically.\n */\ngoog.positioning.flipCornerVertical = function(corner) {\n  return /** @type {goog.positioning.Corner} */ (\n      corner ^ goog.positioning.CornerBit.BOTTOM);\n};\n\n\n/**\n * Returns the corner opposite the given one horizontally and vertically.\n * @param {goog.positioning.Corner} corner The popup corner used to flip.\n * @return {goog.positioning.Corner} The opposite corner horizontally and\n *     vertically.\n */\ngoog.positioning.flipCorner = function(corner) {\n  return /** @type {goog.positioning.Corner} */ (\n      corner ^ goog.positioning.CornerBit.BOTTOM ^\n      goog.positioning.CornerBit.RIGHT);\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","~$goog.dom","~$goog.style.bidi","~$goog.math.Size","^IT","~$goog.math.Coordinate","~$goog.math.Rect","~$goog.style","~$goog.dom.TagName"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/positioning/positioning.js"],"^JD",["^J4",["~$goog.positioning.Corner","~$goog.positioning","~$goog.positioning.Overflow","~$goog.positioning.OverflowStatus","~$goog.positioning.CornerBit"]],"^IR",true,"^IS",["^IT","^JF","^JN","^JT","^JQ","^JR","^JP","^JS","^JO"]],["^ ","^IV",[1579837703000],"^IW","goog.dom.xml.js","^IX",["^IY","goog/dom/xml.js"],"^IZ","goog/dom/xml.js","^I[","^J0","^J1","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview\n * XML utilities.\n *\n */\n\ngoog.provide('goog.dom.xml');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.legacyconversions');\ngoog.require('goog.userAgent');\n\n\n/**\n * Max XML size for MSXML2.  Used to prevent potential DoS attacks.\n * @type {number}\n */\ngoog.dom.xml.MAX_XML_SIZE_KB = 2 * 1024;  // In kB\n\n\n/**\n * Max XML size for MSXML2.  Used to prevent potential DoS attacks.\n * @type {number}\n */\ngoog.dom.xml.MAX_ELEMENT_DEPTH = 256;  // Same default as MSXML6.\n\n\n/**\n * Check for ActiveXObject support by the browser.\n * @return {boolean} true if browser has ActiveXObject support.\n * @private\n */\ngoog.dom.xml.hasActiveXObjectSupport_ = function() {\n  if (!goog.userAgent.IE) {\n    // Avoid raising useless exception in case code is not compiled\n    // and browser is not MSIE.\n    return false;\n  }\n  try {\n    // Due to lot of changes in IE 9, 10 & 11 behaviour and ActiveX being\n    // totally disableable using MSIE's security level, trying to create the\n    // ActiveXOjbect is a lot more reliable than testing for the existence of\n    // window.ActiveXObject\n    new ActiveXObject('MSXML2.DOMDocument');\n    return true;\n  } catch (e) {\n    return false;\n  }\n};\n\n\n/**\n * True if browser has ActiveXObject support.\n * Possible override if this test become wrong in coming IE versions.\n * @type {boolean}\n */\ngoog.dom.xml.ACTIVEX_SUPPORT =\n    goog.userAgent.IE && goog.dom.xml.hasActiveXObjectSupport_();\n\n\n/**\n * Creates an XML document appropriate for the current JS runtime\n * @param {string=} opt_rootTagName The root tag name.\n * @param {string=} opt_namespaceUri Namespace URI of the document element.\n * @param {boolean=} opt_preferActiveX Whether to default to ActiveXObject to\n * create Document in IE. Use this if you need xpath support in IE (e.g.,\n * selectSingleNode or selectNodes), but be aware that the ActiveXObject does\n * not support various DOM-specific Document methods and attributes.\n * @return {Document} The new document.\n * @throws {Error} if browser does not support creating new documents or\n * namespace is provided without a root tag name.\n */\ngoog.dom.xml.createDocument = function(\n    opt_rootTagName, opt_namespaceUri, opt_preferActiveX) {\n  if (opt_namespaceUri && !opt_rootTagName) {\n    throw new Error('Can\\'t create document with namespace and no root tag');\n  }\n  // If document.implementation.createDocument is available and they haven't\n  // explicitly opted to use ActiveXObject when possible.\n  if (document.implementation && document.implementation.createDocument &&\n      !(goog.dom.xml.ACTIVEX_SUPPORT && opt_preferActiveX)) {\n    return document.implementation.createDocument(\n        opt_namespaceUri || '', opt_rootTagName || '', null);\n  } else if (goog.dom.xml.ACTIVEX_SUPPORT) {\n    var doc = goog.dom.xml.createMsXmlDocument_();\n    if (doc) {\n      if (opt_rootTagName) {\n        doc.appendChild(\n            doc.createNode(\n                goog.dom.NodeType.ELEMENT, opt_rootTagName,\n                opt_namespaceUri || ''));\n      }\n      return doc;\n    }\n  }\n  throw new Error('Your browser does not support creating new documents');\n};\n\n\n/**\n * Creates an XML document from a string\n * @param {string} xml The text.\n * @param {boolean=} opt_preferActiveX Whether to default to ActiveXObject to\n * create Document in IE. Use this if you need xpath support in IE (e.g.,\n * selectSingleNode or selectNodes), but be aware that the ActiveXObject does\n * not support various DOM-specific Document methods and attributes.\n * @return {Document} XML document from the text.\n * @throws {Error} if browser does not support loading XML documents.\n */\ngoog.dom.xml.loadXml = function(xml, opt_preferActiveX) {\n  if (typeof DOMParser != 'undefined' &&\n      !(goog.dom.xml.ACTIVEX_SUPPORT && opt_preferActiveX)) {\n    return goog.dom.safe.parseFromString(\n        new DOMParser(), goog.html.legacyconversions.safeHtmlFromString(xml),\n        'application/xml');\n  } else if (goog.dom.xml.ACTIVEX_SUPPORT) {\n    var doc = goog.dom.xml.createMsXmlDocument_();\n    doc.loadXML(xml);\n    return doc;\n  }\n  throw new Error('Your browser does not support loading xml documents');\n};\n\n\n/**\n * Serializes an XML document or subtree to string.\n * @param {Document|Element} xml The document or the root node of the subtree.\n * @return {string} The serialized XML.\n * @throws {Error} if browser does not support XML serialization.\n */\ngoog.dom.xml.serialize = function(xml) {\n  // Compatible with IE/ActiveXObject.\n  var text = xml.xml;\n  if (text) {\n    return text;\n  }\n  // Compatible with Firefox, Opera and WebKit.\n  if (typeof XMLSerializer != 'undefined') {\n    return new XMLSerializer().serializeToString(xml);\n  }\n  throw new Error('Your browser does not support serializing XML documents');\n};\n\n\n/**\n * Selects a single node using an Xpath expression and a root node\n * @param {Node} node The root node.\n * @param {string} path Xpath selector.\n * @return {Node} The selected node, or null if no matching node.\n */\ngoog.dom.xml.selectSingleNode = function(node, path) {\n  if (typeof node.selectSingleNode != 'undefined') {\n    var doc = goog.dom.getOwnerDocument(node);\n    if (typeof doc.setProperty != 'undefined') {\n      doc.setProperty('SelectionLanguage', 'XPath');\n    }\n    return node.selectSingleNode(path);\n  } else if (document.implementation.hasFeature('XPath', '3.0')) {\n    var doc = goog.dom.getOwnerDocument(node);\n    var resolver = doc.createNSResolver(doc.documentElement);\n    var result = doc.evaluate(\n        path, node, resolver, XPathResult.FIRST_ORDERED_NODE_TYPE, null);\n    return result.singleNodeValue;\n  }\n  // This browser does not support xpath for the given node. If IE, ensure XML\n  // Document was created using ActiveXObject\n  // TODO(joeltine): This should throw instead of return null.\n  return null;\n};\n\n\n/**\n * Selects multiple nodes using an Xpath expression and a root node\n * @param {Node} node The root node.\n * @param {string} path Xpath selector.\n * @return {(!NodeList<!Node>|!Array<!Node>)} The selected nodes, or empty array\n *     if no matching nodes.\n */\ngoog.dom.xml.selectNodes = function(node, path) {\n  if (typeof node.selectNodes != 'undefined') {\n    var doc = goog.dom.getOwnerDocument(node);\n    if (typeof doc.setProperty != 'undefined') {\n      doc.setProperty('SelectionLanguage', 'XPath');\n    }\n    return node.selectNodes(path);\n  } else if (document.implementation.hasFeature('XPath', '3.0')) {\n    var doc = goog.dom.getOwnerDocument(node);\n    var resolver = doc.createNSResolver(doc.documentElement);\n    var nodes = doc.evaluate(\n        path, node, resolver, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);\n    var results = [];\n    var count = nodes.snapshotLength;\n    for (var i = 0; i < count; i++) {\n      results.push(nodes.snapshotItem(i));\n    }\n    return results;\n  } else {\n    // This browser does not support xpath for the given node. If IE, ensure XML\n    // Document was created using ActiveXObject.\n    // TODO(joeltine): This should throw instead of return empty array.\n    return [];\n  }\n};\n\n\n/**\n * Sets multiple attributes on an element. Differs from goog.dom.setProperties\n * in that it exclusively uses the element's setAttributes method. Use this\n * when you need to ensure that the exact property is available as an attribute\n * and can be read later by the native getAttribute method.\n * @param {!Element} element XML or DOM element to set attributes on.\n * @param {!Object<string, string>} attributes Map of property:value pairs.\n */\ngoog.dom.xml.setAttributes = function(element, attributes) {\n  for (var key in attributes) {\n    if (attributes.hasOwnProperty(key)) {\n      element.setAttribute(key, attributes[key]);\n    }\n  }\n};\n\n\n/**\n * Creates an instance of the MSXML2.DOMDocument.\n * @return {!XMLDOMDocument} The new document.\n * @private\n */\ngoog.dom.xml.createMsXmlDocument_ = function() {\n  var doc = new ActiveXObject('MSXML2.DOMDocument');\n  if (doc) {\n    // Prevent potential vulnerabilities exposed by MSXML2, see\n    // http://b/1707300 and http://go/xxe-attacks for details.\n    doc.resolveExternals = false;\n    doc.validateOnParse = false;\n    // Add a try catch block because accessing these properties will throw an\n    // error on unsupported MSXML versions. This affects Windows machines\n    // running IE6 or IE7 that are on XP SP2 or earlier without MSXML updates.\n    // See http://msdn.microsoft.com/en-us/library/ms766391(VS.85).aspx for\n    // specific details on which MSXML versions support these properties.\n    try {\n      doc.setProperty('ProhibitDTD', true);\n      doc.setProperty('MaxXMLSize', goog.dom.xml.MAX_XML_SIZE_KB);\n      doc.setProperty('MaxElementDepth', goog.dom.xml.MAX_ELEMENT_DEPTH);\n    } catch (e) {\n      // No-op.\n    }\n  }\n  return doc;\n};\n","^J2",1579837703000,"^J3",["^J4",["^JN","~$goog.dom.NodeType","^IT","~$goog.userAgent","~$goog.html.legacyconversions","~$goog.dom.safe"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/xml.js"],"^JD",["^J4",["~$goog.dom.xml"]],"^IR",true,"^IS",["^IT","^JN","^JZ","^K1","^K0","^J["]],["^ ","^IV",[1579837703000],"^IW","goog.history.event.js","^IX",["^IY","goog/history/event.js"],"^IZ","goog/history/event.js","^I[","^J0","^J1","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The event object dispatched when the history changes.\n *\n */\n\n\ngoog.provide('goog.history.Event');\n\ngoog.require('goog.events.Event');\ngoog.require('goog.history.EventType');\n\n\n\n/**\n * Event object dispatched after the history state has changed.\n * @param {string} token The string identifying the new history state.\n * @param {boolean} isNavigation True if the event was triggered by a browser\n *     action, such as forward or back, clicking on a link, editing the URL, or\n *     calling {@code window.history.(go|back|forward)}.\n *     False if the token has been changed by a `setToken` or\n *     `replaceToken` call.\n * @constructor\n * @extends {goog.events.Event}\n * @final\n */\ngoog.history.Event = function(token, isNavigation) {\n  goog.events.Event.call(this, goog.history.EventType.NAVIGATE);\n\n  /**\n   * The current history state.\n   * @type {string}\n   */\n  this.token = token;\n\n  /**\n   * Whether the event was triggered by browser navigation.\n   * @type {boolean}\n   */\n  this.isNavigation = isNavigation;\n};\ngoog.inherits(goog.history.Event, goog.events.Event);\n","^J2",1579837703000,"^J3",["^J4",["~$goog.history.EventType","^IT","~$goog.events.Event"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/history/event.js"],"^JD",["^J4",["~$goog.history.Event"]],"^IR",true,"^IS",["^IT","^K4","^K3"]],["^ ","^IV",[1579837703000],"^IW","goog.uri.uri.js","^IX",["^IY","goog/uri/uri.js"],"^IZ","goog/uri/uri.js","^I[","^J0","^J1","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class for parsing and formatting URIs.\n *\n * Use goog.Uri(string) to parse a URI string.  Use goog.Uri.create(...) to\n * create a new instance of the goog.Uri object from Uri parts.\n *\n * e.g: <code>var myUri = new goog.Uri(window.location);</code>\n *\n * Implements RFC 3986 for parsing/formatting URIs.\n * http://www.ietf.org/rfc/rfc3986.txt\n *\n * Some changes have been made to the interface (more like .NETs), though the\n * internal representation is now of un-encoded parts, this will change the\n * behavior slightly.\n *\n * @author msamuel@google.com (Mike Samuel)\n */\n\ngoog.provide('goog.Uri');\ngoog.provide('goog.Uri.QueryData');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.string');\ngoog.require('goog.structs');\ngoog.require('goog.structs.Map');\ngoog.require('goog.uri.utils');\ngoog.require('goog.uri.utils.ComponentIndex');\ngoog.require('goog.uri.utils.StandardQueryParam');\n\n\n\n/**\n * This class contains setters and getters for the parts of the URI.\n * The <code>getXyz</code>/<code>setXyz</code> methods return the decoded part\n * -- so<code>goog.Uri.parse('/foo%20bar').getPath()</code> will return the\n * decoded path, <code>/foo bar</code>.\n *\n * Reserved characters (see RFC 3986 section 2.2) can be present in\n * their percent-encoded form in scheme, domain, and path URI components and\n * will not be auto-decoded. For example:\n * <code>goog.Uri.parse('rel%61tive/path%2fto/resource').getPath()</code> will\n * return <code>relative/path%2fto/resource</code>.\n *\n * The constructor accepts an optional unparsed, raw URI string.  The parser\n * is relaxed, so special characters that aren't escaped but don't cause\n * ambiguities will not cause parse failures.\n *\n * All setters return <code>this</code> and so may be chained, a la\n * <code>goog.Uri.parse('/foo').setFragment('part').toString()</code>.\n *\n * @param {*=} opt_uri Optional string URI to parse\n *        (use goog.Uri.create() to create a URI from parts), or if\n *        a goog.Uri is passed, a clone is created.\n * @param {boolean=} opt_ignoreCase If true, #getParameterValue will ignore\n * the case of the parameter name.\n *\n * @throws URIError If opt_uri is provided and URI is malformed (that is,\n *     if decodeURIComponent fails on any of the URI components).\n * @constructor\n * @struct\n */\ngoog.Uri = function(opt_uri, opt_ignoreCase) {\n  /**\n   * Scheme such as \"http\".\n   * @private {string}\n   */\n  this.scheme_ = '';\n\n  /**\n   * User credentials in the form \"username:password\".\n   * @private {string}\n   */\n  this.userInfo_ = '';\n\n  /**\n   * Domain part, e.g. \"www.google.com\".\n   * @private {string}\n   */\n  this.domain_ = '';\n\n  /**\n   * Port, e.g. 8080.\n   * @private {?number}\n   */\n  this.port_ = null;\n\n  /**\n   * Path, e.g. \"/tests/img.png\".\n   * @private {string}\n   */\n  this.path_ = '';\n\n  /**\n   * The fragment without the #.\n   * @private {string}\n   */\n  this.fragment_ = '';\n\n  /**\n   * Whether or not this Uri should be treated as Read Only.\n   * @private {boolean}\n   */\n  this.isReadOnly_ = false;\n\n  /**\n   * Whether or not to ignore case when comparing query params.\n   * @private {boolean}\n   */\n  this.ignoreCase_ = false;\n\n  /**\n   * Object representing query data.\n   * @private {!goog.Uri.QueryData}\n   */\n  this.queryData_;\n\n  // Parse in the uri string\n  var m;\n  if (opt_uri instanceof goog.Uri) {\n    this.ignoreCase_ = (opt_ignoreCase !== undefined) ? opt_ignoreCase :\n                                                        opt_uri.getIgnoreCase();\n    this.setScheme(opt_uri.getScheme());\n    this.setUserInfo(opt_uri.getUserInfo());\n    this.setDomain(opt_uri.getDomain());\n    this.setPort(opt_uri.getPort());\n    this.setPath(opt_uri.getPath());\n    this.setQueryData(opt_uri.getQueryData().clone());\n    this.setFragment(opt_uri.getFragment());\n  } else if (opt_uri && (m = goog.uri.utils.split(String(opt_uri)))) {\n    this.ignoreCase_ = !!opt_ignoreCase;\n\n    // Set the parts -- decoding as we do so.\n    // COMPATIBILITY NOTE - In IE, unmatched fields may be empty strings,\n    // whereas in other browsers they will be undefined.\n    this.setScheme(m[goog.uri.utils.ComponentIndex.SCHEME] || '', true);\n    this.setUserInfo(m[goog.uri.utils.ComponentIndex.USER_INFO] || '', true);\n    this.setDomain(m[goog.uri.utils.ComponentIndex.DOMAIN] || '', true);\n    this.setPort(m[goog.uri.utils.ComponentIndex.PORT]);\n    this.setPath(m[goog.uri.utils.ComponentIndex.PATH] || '', true);\n    this.setQueryData(m[goog.uri.utils.ComponentIndex.QUERY_DATA] || '', true);\n    this.setFragment(m[goog.uri.utils.ComponentIndex.FRAGMENT] || '', true);\n\n  } else {\n    this.ignoreCase_ = !!opt_ignoreCase;\n    this.queryData_ = new goog.Uri.QueryData(null, null, this.ignoreCase_);\n  }\n};\n\n\n/**\n * Parameter name added to stop caching.\n * @type {string}\n */\ngoog.Uri.RANDOM_PARAM = goog.uri.utils.StandardQueryParam.RANDOM;\n\n\n/**\n * @return {string} The string form of the url.\n * @override\n */\ngoog.Uri.prototype.toString = function() {\n  var out = [];\n\n  var scheme = this.getScheme();\n  if (scheme) {\n    out.push(\n        goog.Uri.encodeSpecialChars_(\n            scheme, goog.Uri.reDisallowedInSchemeOrUserInfo_, true),\n        ':');\n  }\n\n  var domain = this.getDomain();\n  if (domain || scheme == 'file') {\n    out.push('//');\n\n    var userInfo = this.getUserInfo();\n    if (userInfo) {\n      out.push(\n          goog.Uri.encodeSpecialChars_(\n              userInfo, goog.Uri.reDisallowedInSchemeOrUserInfo_, true),\n          '@');\n    }\n\n    out.push(goog.Uri.removeDoubleEncoding_(goog.string.urlEncode(domain)));\n\n    var port = this.getPort();\n    if (port != null) {\n      out.push(':', String(port));\n    }\n  }\n\n  var path = this.getPath();\n  if (path) {\n    if (this.hasDomain() && path.charAt(0) != '/') {\n      out.push('/');\n    }\n    out.push(\n        goog.Uri.encodeSpecialChars_(\n            path, path.charAt(0) == '/' ? goog.Uri.reDisallowedInAbsolutePath_ :\n                                          goog.Uri.reDisallowedInRelativePath_,\n            true));\n  }\n\n  var query = this.getEncodedQuery();\n  if (query) {\n    out.push('?', query);\n  }\n\n  var fragment = this.getFragment();\n  if (fragment) {\n    out.push(\n        '#', goog.Uri.encodeSpecialChars_(\n                 fragment, goog.Uri.reDisallowedInFragment_));\n  }\n  return out.join('');\n};\n\n\n/**\n * Resolves the given relative URI (a goog.Uri object), using the URI\n * represented by this instance as the base URI.\n *\n * There are several kinds of relative URIs:<br>\n * 1. foo - replaces the last part of the path, the whole query and fragment<br>\n * 2. /foo - replaces the path, the query and fragment<br>\n * 3. //foo - replaces everything from the domain on.  foo is a domain name<br>\n * 4. ?foo - replace the query and fragment<br>\n * 5. #foo - replace the fragment only\n *\n * Additionally, if relative URI has a non-empty path, all \"..\" and \".\"\n * segments will be resolved, as described in RFC 3986.\n *\n * @param {!goog.Uri} relativeUri The relative URI to resolve.\n * @return {!goog.Uri} The resolved URI.\n */\ngoog.Uri.prototype.resolve = function(relativeUri) {\n\n  var absoluteUri = this.clone();\n\n  // we satisfy these conditions by looking for the first part of relativeUri\n  // that is not blank and applying defaults to the rest\n\n  var overridden = relativeUri.hasScheme();\n\n  if (overridden) {\n    absoluteUri.setScheme(relativeUri.getScheme());\n  } else {\n    overridden = relativeUri.hasUserInfo();\n  }\n\n  if (overridden) {\n    absoluteUri.setUserInfo(relativeUri.getUserInfo());\n  } else {\n    overridden = relativeUri.hasDomain();\n  }\n\n  if (overridden) {\n    absoluteUri.setDomain(relativeUri.getDomain());\n  } else {\n    overridden = relativeUri.hasPort();\n  }\n\n  var path = relativeUri.getPath();\n  if (overridden) {\n    absoluteUri.setPort(relativeUri.getPort());\n  } else {\n    overridden = relativeUri.hasPath();\n    if (overridden) {\n      // resolve path properly\n      if (path.charAt(0) != '/') {\n        // path is relative\n        if (this.hasDomain() && !this.hasPath()) {\n          // RFC 3986, section 5.2.3, case 1\n          path = '/' + path;\n        } else {\n          // RFC 3986, section 5.2.3, case 2\n          var lastSlashIndex = absoluteUri.getPath().lastIndexOf('/');\n          if (lastSlashIndex != -1) {\n            path = absoluteUri.getPath().substr(0, lastSlashIndex + 1) + path;\n          }\n        }\n      }\n      path = goog.Uri.removeDotSegments(path);\n    }\n  }\n\n  if (overridden) {\n    absoluteUri.setPath(path);\n  } else {\n    overridden = relativeUri.hasQuery();\n  }\n\n  if (overridden) {\n    absoluteUri.setQueryData(relativeUri.getQueryData().clone());\n  } else {\n    overridden = relativeUri.hasFragment();\n  }\n\n  if (overridden) {\n    absoluteUri.setFragment(relativeUri.getFragment());\n  }\n\n  return absoluteUri;\n};\n\n\n/**\n * Clones the URI instance.\n * @return {!goog.Uri} New instance of the URI object.\n */\ngoog.Uri.prototype.clone = function() {\n  return new goog.Uri(this);\n};\n\n\n/**\n * @return {string} The encoded scheme/protocol for the URI.\n */\ngoog.Uri.prototype.getScheme = function() {\n  return this.scheme_;\n};\n\n\n/**\n * Sets the scheme/protocol.\n * @throws URIError If opt_decode is true and newScheme is malformed (that is,\n *     if decodeURIComponent fails).\n * @param {string} newScheme New scheme value.\n * @param {boolean=} opt_decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setScheme = function(newScheme, opt_decode) {\n  this.enforceReadOnly();\n  this.scheme_ =\n      opt_decode ? goog.Uri.decodeOrEmpty_(newScheme, true) : newScheme;\n\n  // remove an : at the end of the scheme so somebody can pass in\n  // window.location.protocol\n  if (this.scheme_) {\n    this.scheme_ = this.scheme_.replace(/:$/, '');\n  }\n  return this;\n};\n\n\n/**\n * @return {boolean} Whether the scheme has been set.\n */\ngoog.Uri.prototype.hasScheme = function() {\n  return !!this.scheme_;\n};\n\n\n/**\n * @return {string} The decoded user info.\n */\ngoog.Uri.prototype.getUserInfo = function() {\n  return this.userInfo_;\n};\n\n\n/**\n * Sets the userInfo.\n * @throws URIError If opt_decode is true and newUserInfo is malformed (that is,\n *     if decodeURIComponent fails).\n * @param {string} newUserInfo New userInfo value.\n * @param {boolean=} opt_decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setUserInfo = function(newUserInfo, opt_decode) {\n  this.enforceReadOnly();\n  this.userInfo_ =\n      opt_decode ? goog.Uri.decodeOrEmpty_(newUserInfo) : newUserInfo;\n  return this;\n};\n\n\n/**\n * @return {boolean} Whether the user info has been set.\n */\ngoog.Uri.prototype.hasUserInfo = function() {\n  return !!this.userInfo_;\n};\n\n\n/**\n * @return {string} The decoded domain.\n */\ngoog.Uri.prototype.getDomain = function() {\n  return this.domain_;\n};\n\n\n/**\n * Sets the domain.\n * @throws URIError If opt_decode is true and newDomain is malformed (that is,\n *     if decodeURIComponent fails).\n * @param {string} newDomain New domain value.\n * @param {boolean=} opt_decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setDomain = function(newDomain, opt_decode) {\n  this.enforceReadOnly();\n  this.domain_ =\n      opt_decode ? goog.Uri.decodeOrEmpty_(newDomain, true) : newDomain;\n  return this;\n};\n\n\n/**\n * @return {boolean} Whether the domain has been set.\n */\ngoog.Uri.prototype.hasDomain = function() {\n  return !!this.domain_;\n};\n\n\n/**\n * @return {?number} The port number.\n */\ngoog.Uri.prototype.getPort = function() {\n  return this.port_;\n};\n\n\n/**\n * Sets the port number.\n * @param {*} newPort Port number. Will be explicitly casted to a number.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setPort = function(newPort) {\n  this.enforceReadOnly();\n\n  if (newPort) {\n    newPort = Number(newPort);\n    if (isNaN(newPort) || newPort < 0) {\n      throw new Error('Bad port number ' + newPort);\n    }\n    this.port_ = newPort;\n  } else {\n    this.port_ = null;\n  }\n\n  return this;\n};\n\n\n/**\n * @return {boolean} Whether the port has been set.\n */\ngoog.Uri.prototype.hasPort = function() {\n  return this.port_ != null;\n};\n\n\n/**\n  * @return {string} The decoded path.\n */\ngoog.Uri.prototype.getPath = function() {\n  return this.path_;\n};\n\n\n/**\n * Sets the path.\n * @throws URIError If opt_decode is true and newPath is malformed (that is,\n *     if decodeURIComponent fails).\n * @param {string} newPath New path value.\n * @param {boolean=} opt_decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setPath = function(newPath, opt_decode) {\n  this.enforceReadOnly();\n  this.path_ = opt_decode ? goog.Uri.decodeOrEmpty_(newPath, true) : newPath;\n  return this;\n};\n\n\n/**\n * @return {boolean} Whether the path has been set.\n */\ngoog.Uri.prototype.hasPath = function() {\n  return !!this.path_;\n};\n\n\n/**\n * @return {boolean} Whether the query string has been set.\n */\ngoog.Uri.prototype.hasQuery = function() {\n  return this.queryData_.toString() !== '';\n};\n\n\n/**\n * Sets the query data.\n * @param {goog.Uri.QueryData|string|undefined} queryData QueryData object.\n * @param {boolean=} opt_decode Optional param for whether to decode new value.\n *     Applies only if queryData is a string.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setQueryData = function(queryData, opt_decode) {\n  this.enforceReadOnly();\n\n  if (queryData instanceof goog.Uri.QueryData) {\n    this.queryData_ = queryData;\n    this.queryData_.setIgnoreCase(this.ignoreCase_);\n  } else {\n    if (!opt_decode) {\n      // QueryData accepts encoded query string, so encode it if\n      // opt_decode flag is not true.\n      queryData = goog.Uri.encodeSpecialChars_(\n          queryData, goog.Uri.reDisallowedInQuery_);\n    }\n    this.queryData_ = new goog.Uri.QueryData(queryData, null, this.ignoreCase_);\n  }\n\n  return this;\n};\n\n\n/**\n * Sets the URI query.\n * @param {string} newQuery New query value.\n * @param {boolean=} opt_decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setQuery = function(newQuery, opt_decode) {\n  return this.setQueryData(newQuery, opt_decode);\n};\n\n\n/**\n * @return {string} The encoded URI query, not including the ?.\n */\ngoog.Uri.prototype.getEncodedQuery = function() {\n  return this.queryData_.toString();\n};\n\n\n/**\n * @return {string} The decoded URI query, not including the ?.\n */\ngoog.Uri.prototype.getDecodedQuery = function() {\n  return this.queryData_.toDecodedString();\n};\n\n\n/**\n * Returns the query data.\n * @return {!goog.Uri.QueryData} QueryData object.\n */\ngoog.Uri.prototype.getQueryData = function() {\n  return this.queryData_;\n};\n\n\n/**\n * @return {string} The encoded URI query, not including the ?.\n *\n * Warning: This method, unlike other getter methods, returns encoded\n * value, instead of decoded one.\n */\ngoog.Uri.prototype.getQuery = function() {\n  return this.getEncodedQuery();\n};\n\n\n/**\n * Sets the value of the named query parameters, clearing previous values for\n * that key.\n *\n * @param {string} key The parameter to set.\n * @param {*} value The new value. Value does not need to be encoded.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setParameterValue = function(key, value) {\n  this.enforceReadOnly();\n  this.queryData_.set(key, value);\n  return this;\n};\n\n\n/**\n * Sets the values of the named query parameters, clearing previous values for\n * that key.  Not new values will currently be moved to the end of the query\n * string.\n *\n * So, <code>goog.Uri.parse('foo?a=b&c=d&e=f').setParameterValues('c', ['new'])\n * </code> yields <tt>foo?a=b&e=f&c=new</tt>.</p>\n *\n * @param {string} key The parameter to set.\n * @param {*} values The new values. If values is a single\n *     string then it will be treated as the sole value. Values do not need to\n *     be encoded.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setParameterValues = function(key, values) {\n  this.enforceReadOnly();\n\n  if (!goog.isArray(values)) {\n    values = [String(values)];\n  }\n\n  this.queryData_.setValues(key, values);\n\n  return this;\n};\n\n\n/**\n * Returns the value<b>s</b> for a given cgi parameter as a list of decoded\n * query parameter values.\n * @param {string} name The parameter to get values for.\n * @return {!Array<?>} The values for a given cgi parameter as a list of\n *     decoded query parameter values.\n */\ngoog.Uri.prototype.getParameterValues = function(name) {\n  return this.queryData_.getValues(name);\n};\n\n\n/**\n * Returns the first value for a given cgi parameter or undefined if the given\n * parameter name does not appear in the query string.\n * @param {string} paramName Unescaped parameter name.\n * @return {string|undefined} The first value for a given cgi parameter or\n *     undefined if the given parameter name does not appear in the query\n *     string.\n */\ngoog.Uri.prototype.getParameterValue = function(paramName) {\n  return /** @type {string|undefined} */ (this.queryData_.get(paramName));\n};\n\n\n/**\n * @return {string} The URI fragment, not including the #.\n */\ngoog.Uri.prototype.getFragment = function() {\n  return this.fragment_;\n};\n\n\n/**\n * Sets the URI fragment.\n * @throws URIError If opt_decode is true and newFragment is malformed (that is,\n *     if decodeURIComponent fails).\n * @param {string} newFragment New fragment value.\n * @param {boolean=} opt_decode Optional param for whether to decode new value.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.setFragment = function(newFragment, opt_decode) {\n  this.enforceReadOnly();\n  this.fragment_ =\n      opt_decode ? goog.Uri.decodeOrEmpty_(newFragment) : newFragment;\n  return this;\n};\n\n\n/**\n * @return {boolean} Whether the URI has a fragment set.\n */\ngoog.Uri.prototype.hasFragment = function() {\n  return !!this.fragment_;\n};\n\n\n/**\n * Returns true if this has the same domain as that of uri2.\n * @param {!goog.Uri} uri2 The URI object to compare to.\n * @return {boolean} true if same domain; false otherwise.\n */\ngoog.Uri.prototype.hasSameDomainAs = function(uri2) {\n  return ((!this.hasDomain() && !uri2.hasDomain()) ||\n          this.getDomain() == uri2.getDomain()) &&\n      ((!this.hasPort() && !uri2.hasPort()) ||\n       this.getPort() == uri2.getPort());\n};\n\n\n/**\n * Adds a random parameter to the Uri.\n * @return {!goog.Uri} Reference to this Uri object.\n */\ngoog.Uri.prototype.makeUnique = function() {\n  this.enforceReadOnly();\n  this.setParameterValue(goog.Uri.RANDOM_PARAM, goog.string.getRandomString());\n\n  return this;\n};\n\n\n/**\n * Removes the named query parameter.\n *\n * @param {string} key The parameter to remove.\n * @return {!goog.Uri} Reference to this URI object.\n */\ngoog.Uri.prototype.removeParameter = function(key) {\n  this.enforceReadOnly();\n  this.queryData_.remove(key);\n  return this;\n};\n\n\n/**\n * Sets whether Uri is read only. If this goog.Uri is read-only,\n * enforceReadOnly_ will be called at the start of any function that may modify\n * this Uri.\n * @param {boolean} isReadOnly whether this goog.Uri should be read only.\n * @return {!goog.Uri} Reference to this Uri object.\n */\ngoog.Uri.prototype.setReadOnly = function(isReadOnly) {\n  this.isReadOnly_ = isReadOnly;\n  return this;\n};\n\n\n/**\n * @return {boolean} Whether the URI is read only.\n */\ngoog.Uri.prototype.isReadOnly = function() {\n  return this.isReadOnly_;\n};\n\n\n/**\n * Checks if this Uri has been marked as read only, and if so, throws an error.\n * This should be called whenever any modifying function is called.\n */\ngoog.Uri.prototype.enforceReadOnly = function() {\n  if (this.isReadOnly_) {\n    throw new Error('Tried to modify a read-only Uri');\n  }\n};\n\n\n/**\n * Sets whether to ignore case.\n * NOTE: If there are already key/value pairs in the QueryData, and\n * ignoreCase_ is set to false, the keys will all be lower-cased.\n * @param {boolean} ignoreCase whether this goog.Uri should ignore case.\n * @return {!goog.Uri} Reference to this Uri object.\n */\ngoog.Uri.prototype.setIgnoreCase = function(ignoreCase) {\n  this.ignoreCase_ = ignoreCase;\n  if (this.queryData_) {\n    this.queryData_.setIgnoreCase(ignoreCase);\n  }\n  return this;\n};\n\n\n/**\n * @return {boolean} Whether to ignore case.\n */\ngoog.Uri.prototype.getIgnoreCase = function() {\n  return this.ignoreCase_;\n};\n\n\n//==============================================================================\n// Static members\n//==============================================================================\n\n\n/**\n * Creates a uri from the string form.  Basically an alias of new goog.Uri().\n * If a Uri object is passed to parse then it will return a clone of the object.\n *\n * @throws URIError If parsing the URI is malformed. The passed URI components\n *     should all be parseable by decodeURIComponent.\n * @param {*} uri Raw URI string or instance of Uri\n *     object.\n * @param {boolean=} opt_ignoreCase Whether to ignore the case of parameter\n * names in #getParameterValue.\n * @return {!goog.Uri} The new URI object.\n */\ngoog.Uri.parse = function(uri, opt_ignoreCase) {\n  return uri instanceof goog.Uri ? uri.clone() :\n                                   new goog.Uri(uri, opt_ignoreCase);\n};\n\n\n/**\n * Creates a new goog.Uri object from unencoded parts.\n *\n * @param {?string=} opt_scheme Scheme/protocol or full URI to parse.\n * @param {?string=} opt_userInfo username:password.\n * @param {?string=} opt_domain www.google.com.\n * @param {?number=} opt_port 9830.\n * @param {?string=} opt_path /some/path/to/a/file.html.\n * @param {string|goog.Uri.QueryData=} opt_query a=1&b=2.\n * @param {?string=} opt_fragment The fragment without the #.\n * @param {boolean=} opt_ignoreCase Whether to ignore parameter name case in\n *     #getParameterValue.\n *\n * @return {!goog.Uri} The new URI object.\n */\ngoog.Uri.create = function(\n    opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_query,\n    opt_fragment, opt_ignoreCase) {\n\n  var uri = new goog.Uri(null, opt_ignoreCase);\n\n  // Only set the parts if they are defined and not empty strings.\n  opt_scheme && uri.setScheme(opt_scheme);\n  opt_userInfo && uri.setUserInfo(opt_userInfo);\n  opt_domain && uri.setDomain(opt_domain);\n  opt_port && uri.setPort(opt_port);\n  opt_path && uri.setPath(opt_path);\n  opt_query && uri.setQueryData(opt_query);\n  opt_fragment && uri.setFragment(opt_fragment);\n\n  return uri;\n};\n\n\n/**\n * Resolves a relative Uri against a base Uri, accepting both strings and\n * Uri objects.\n *\n * @param {*} base Base Uri.\n * @param {*} rel Relative Uri.\n * @return {!goog.Uri} Resolved uri.\n */\ngoog.Uri.resolve = function(base, rel) {\n  if (!(base instanceof goog.Uri)) {\n    base = goog.Uri.parse(base);\n  }\n\n  if (!(rel instanceof goog.Uri)) {\n    rel = goog.Uri.parse(rel);\n  }\n\n  return base.resolve(rel);\n};\n\n\n/**\n * Removes dot segments in given path component, as described in\n * RFC 3986, section 5.2.4.\n *\n * @param {string} path A non-empty path component.\n * @return {string} Path component with removed dot segments.\n */\ngoog.Uri.removeDotSegments = function(path) {\n  if (path == '..' || path == '.') {\n    return '';\n\n  } else if (\n      !goog.string.contains(path, './') && !goog.string.contains(path, '/.')) {\n    // This optimization detects uris which do not contain dot-segments,\n    // and as a consequence do not require any processing.\n    return path;\n\n  } else {\n    var leadingSlash = goog.string.startsWith(path, '/');\n    var segments = path.split('/');\n    var out = [];\n\n    for (var pos = 0; pos < segments.length;) {\n      var segment = segments[pos++];\n\n      if (segment == '.') {\n        if (leadingSlash && pos == segments.length) {\n          out.push('');\n        }\n      } else if (segment == '..') {\n        if (out.length > 1 || out.length == 1 && out[0] != '') {\n          out.pop();\n        }\n        if (leadingSlash && pos == segments.length) {\n          out.push('');\n        }\n      } else {\n        out.push(segment);\n        leadingSlash = true;\n      }\n    }\n\n    return out.join('/');\n  }\n};\n\n\n/**\n * Decodes a value or returns the empty string if it isn't defined or empty.\n * @throws URIError If decodeURIComponent fails to decode val.\n * @param {string|undefined} val Value to decode.\n * @param {boolean=} opt_preserveReserved If true, restricted characters will\n *     not be decoded.\n * @return {string} Decoded value.\n * @private\n */\ngoog.Uri.decodeOrEmpty_ = function(val, opt_preserveReserved) {\n  // Don't use UrlDecode() here because val is not a query parameter.\n  if (!val) {\n    return '';\n  }\n\n  // decodeURI has the same output for '%2f' and '%252f'. We double encode %25\n  // so that we can distinguish between the 2 inputs. This is later undone by\n  // removeDoubleEncoding_.\n  return opt_preserveReserved ? decodeURI(val.replace(/%25/g, '%2525')) :\n                                decodeURIComponent(val);\n};\n\n\n/**\n * If unescapedPart is non null, then escapes any characters in it that aren't\n * valid characters in a url and also escapes any special characters that\n * appear in extra.\n *\n * @param {*} unescapedPart The string to encode.\n * @param {RegExp} extra A character set of characters in [\\01-\\177].\n * @param {boolean=} opt_removeDoubleEncoding If true, remove double percent\n *     encoding.\n * @return {?string} null iff unescapedPart == null.\n * @private\n */\ngoog.Uri.encodeSpecialChars_ = function(\n    unescapedPart, extra, opt_removeDoubleEncoding) {\n  if (typeof unescapedPart === 'string') {\n    var encoded = encodeURI(unescapedPart).replace(extra, goog.Uri.encodeChar_);\n    if (opt_removeDoubleEncoding) {\n      // encodeURI double-escapes %XX sequences used to represent restricted\n      // characters in some URI components, remove the double escaping here.\n      encoded = goog.Uri.removeDoubleEncoding_(encoded);\n    }\n    return encoded;\n  }\n  return null;\n};\n\n\n/**\n * Converts a character in [\\01-\\177] to its unicode character equivalent.\n * @param {string} ch One character string.\n * @return {string} Encoded string.\n * @private\n */\ngoog.Uri.encodeChar_ = function(ch) {\n  var n = ch.charCodeAt(0);\n  return '%' + ((n >> 4) & 0xf).toString(16) + (n & 0xf).toString(16);\n};\n\n\n/**\n * Removes double percent-encoding from a string.\n * @param  {string} doubleEncodedString String\n * @return {string} String with double encoding removed.\n * @private\n */\ngoog.Uri.removeDoubleEncoding_ = function(doubleEncodedString) {\n  return doubleEncodedString.replace(/%25([0-9a-fA-F]{2})/g, '%$1');\n};\n\n\n/**\n * Regular expression for characters that are disallowed in the scheme or\n * userInfo part of the URI.\n * @type {RegExp}\n * @private\n */\ngoog.Uri.reDisallowedInSchemeOrUserInfo_ = /[#\\/\\?@]/g;\n\n\n/**\n * Regular expression for characters that are disallowed in a relative path.\n * Colon is included due to RFC 3986 3.3.\n * @type {RegExp}\n * @private\n */\ngoog.Uri.reDisallowedInRelativePath_ = /[\\#\\?:]/g;\n\n\n/**\n * Regular expression for characters that are disallowed in an absolute path.\n * @type {RegExp}\n * @private\n */\ngoog.Uri.reDisallowedInAbsolutePath_ = /[\\#\\?]/g;\n\n\n/**\n * Regular expression for characters that are disallowed in the query.\n * @type {RegExp}\n * @private\n */\ngoog.Uri.reDisallowedInQuery_ = /[\\#\\?@]/g;\n\n\n/**\n * Regular expression for characters that are disallowed in the fragment.\n * @type {RegExp}\n * @private\n */\ngoog.Uri.reDisallowedInFragment_ = /#/g;\n\n\n/**\n * Checks whether two URIs have the same domain.\n * @param {string} uri1String First URI string.\n * @param {string} uri2String Second URI string.\n * @return {boolean} true if the two URIs have the same domain; false otherwise.\n */\ngoog.Uri.haveSameDomain = function(uri1String, uri2String) {\n  // Differs from goog.uri.utils.haveSameDomain, since this ignores scheme.\n  // TODO(gboyer): Have this just call goog.uri.util.haveSameDomain.\n  var pieces1 = goog.uri.utils.split(uri1String);\n  var pieces2 = goog.uri.utils.split(uri2String);\n  return pieces1[goog.uri.utils.ComponentIndex.DOMAIN] ==\n      pieces2[goog.uri.utils.ComponentIndex.DOMAIN] &&\n      pieces1[goog.uri.utils.ComponentIndex.PORT] ==\n      pieces2[goog.uri.utils.ComponentIndex.PORT];\n};\n\n\n\n/**\n * Class used to represent URI query parameters.  It is essentially a hash of\n * name-value pairs, though a name can be present more than once.\n *\n * Has the same interface as the collections in goog.structs.\n *\n * @param {?string=} opt_query Optional encoded query string to parse into\n *     the object.\n * @param {goog.Uri=} opt_uri Optional uri object that should have its\n *     cache invalidated when this object updates. Deprecated -- this\n *     is no longer required.\n * @param {boolean=} opt_ignoreCase If true, ignore the case of the parameter\n *     name in #get.\n * @constructor\n * @struct\n * @final\n */\ngoog.Uri.QueryData = function(opt_query, opt_uri, opt_ignoreCase) {\n  /**\n   * The map containing name/value or name/array-of-values pairs.\n   * May be null if it requires parsing from the query string.\n   *\n   * We need to use a Map because we cannot guarantee that the key names will\n   * not be problematic for IE.\n   *\n   * @private {?goog.structs.Map<string, !Array<*>>}\n   */\n  this.keyMap_ = null;\n\n  /**\n   * The number of params, or null if it requires computing.\n   * @private {?number}\n   */\n  this.count_ = null;\n\n  /**\n   * Encoded query string, or null if it requires computing from the key map.\n   * @private {?string}\n   */\n  this.encodedQuery_ = opt_query || null;\n\n  /**\n   * If true, ignore the case of the parameter name in #get.\n   * @private {boolean}\n   */\n  this.ignoreCase_ = !!opt_ignoreCase;\n};\n\n\n/**\n * If the underlying key map is not yet initialized, it parses the\n * query string and fills the map with parsed data.\n * @private\n */\ngoog.Uri.QueryData.prototype.ensureKeyMapInitialized_ = function() {\n  if (!this.keyMap_) {\n    this.keyMap_ = new goog.structs.Map();\n    this.count_ = 0;\n    if (this.encodedQuery_) {\n      var self = this;\n      goog.uri.utils.parseQueryData(this.encodedQuery_, function(name, value) {\n        self.add(goog.string.urlDecode(name), value);\n      });\n    }\n  }\n};\n\n\n/**\n * Creates a new query data instance from a map of names and values.\n *\n * @param {!goog.structs.Map<string, ?>|!Object} map Map of string parameter\n *     names to parameter value. If parameter value is an array, it is\n *     treated as if the key maps to each individual value in the\n *     array.\n * @param {goog.Uri=} opt_uri URI object that should have its cache\n *     invalidated when this object updates.\n * @param {boolean=} opt_ignoreCase If true, ignore the case of the parameter\n *     name in #get.\n * @return {!goog.Uri.QueryData} The populated query data instance.\n */\ngoog.Uri.QueryData.createFromMap = function(map, opt_uri, opt_ignoreCase) {\n  var keys = goog.structs.getKeys(map);\n  if (typeof keys == 'undefined') {\n    throw new Error('Keys are undefined');\n  }\n\n  var queryData = new goog.Uri.QueryData(null, null, opt_ignoreCase);\n  var values = goog.structs.getValues(map);\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    var value = values[i];\n    if (!goog.isArray(value)) {\n      queryData.add(key, value);\n    } else {\n      queryData.setValues(key, value);\n    }\n  }\n  return queryData;\n};\n\n\n/**\n * Creates a new query data instance from parallel arrays of parameter names\n * and values. Allows for duplicate parameter names. Throws an error if the\n * lengths of the arrays differ.\n *\n * @param {!Array<string>} keys Parameter names.\n * @param {!Array<?>} values Parameter values.\n * @param {goog.Uri=} opt_uri URI object that should have its cache\n *     invalidated when this object updates.\n * @param {boolean=} opt_ignoreCase If true, ignore the case of the parameter\n *     name in #get.\n * @return {!goog.Uri.QueryData} The populated query data instance.\n */\ngoog.Uri.QueryData.createFromKeysValues = function(\n    keys, values, opt_uri, opt_ignoreCase) {\n  if (keys.length != values.length) {\n    throw new Error('Mismatched lengths for keys/values');\n  }\n  var queryData = new goog.Uri.QueryData(null, null, opt_ignoreCase);\n  for (var i = 0; i < keys.length; i++) {\n    queryData.add(keys[i], values[i]);\n  }\n  return queryData;\n};\n\n\n/**\n * @return {?number} The number of parameters.\n */\ngoog.Uri.QueryData.prototype.getCount = function() {\n  this.ensureKeyMapInitialized_();\n  return this.count_;\n};\n\n\n/**\n * Adds a key value pair.\n * @param {string} key Name.\n * @param {*} value Value.\n * @return {!goog.Uri.QueryData} Instance of this object.\n */\ngoog.Uri.QueryData.prototype.add = function(key, value) {\n  this.ensureKeyMapInitialized_();\n  this.invalidateCache_();\n\n  key = this.getKeyName_(key);\n  var values = this.keyMap_.get(key);\n  if (!values) {\n    this.keyMap_.set(key, (values = []));\n  }\n  values.push(value);\n  this.count_ = goog.asserts.assertNumber(this.count_) + 1;\n  return this;\n};\n\n\n/**\n * Removes all the params with the given key.\n * @param {string} key Name.\n * @return {boolean} Whether any parameter was removed.\n */\ngoog.Uri.QueryData.prototype.remove = function(key) {\n  this.ensureKeyMapInitialized_();\n\n  key = this.getKeyName_(key);\n  if (this.keyMap_.containsKey(key)) {\n    this.invalidateCache_();\n\n    // Decrement parameter count.\n    this.count_ =\n        goog.asserts.assertNumber(this.count_) - this.keyMap_.get(key).length;\n    return this.keyMap_.remove(key);\n  }\n  return false;\n};\n\n\n/**\n * Clears the parameters.\n */\ngoog.Uri.QueryData.prototype.clear = function() {\n  this.invalidateCache_();\n  this.keyMap_ = null;\n  this.count_ = 0;\n};\n\n\n/**\n * @return {boolean} Whether we have any parameters.\n */\ngoog.Uri.QueryData.prototype.isEmpty = function() {\n  this.ensureKeyMapInitialized_();\n  return this.count_ == 0;\n};\n\n\n/**\n * Whether there is a parameter with the given name\n * @param {string} key The parameter name to check for.\n * @return {boolean} Whether there is a parameter with the given name.\n */\ngoog.Uri.QueryData.prototype.containsKey = function(key) {\n  this.ensureKeyMapInitialized_();\n  key = this.getKeyName_(key);\n  return this.keyMap_.containsKey(key);\n};\n\n\n/**\n * Whether there is a parameter with the given value.\n * @param {*} value The value to check for.\n * @return {boolean} Whether there is a parameter with the given value.\n */\ngoog.Uri.QueryData.prototype.containsValue = function(value) {\n  // NOTE(arv): This solution goes through all the params even if it was the\n  // first param. We can get around this by not reusing code or by switching to\n  // iterators.\n  var vals = this.getValues();\n  return goog.array.contains(vals, value);\n};\n\n\n/**\n * Runs a callback on every key-value pair in the map, including duplicate keys.\n * This won't maintain original order when duplicate keys are interspersed (like\n * getKeys() / getValues()).\n * @param {function(this:SCOPE, ?, string, !goog.Uri.QueryData)} f\n * @param {SCOPE=} opt_scope The value of \"this\" inside f.\n * @template SCOPE\n */\ngoog.Uri.QueryData.prototype.forEach = function(f, opt_scope) {\n  this.ensureKeyMapInitialized_();\n  this.keyMap_.forEach(function(values, key) {\n    goog.array.forEach(values, function(value) {\n      f.call(opt_scope, value, key, this);\n    }, this);\n  }, this);\n};\n\n\n/**\n * Returns all the keys of the parameters. If a key is used multiple times\n * it will be included multiple times in the returned array\n * @return {!Array<string>} All the keys of the parameters.\n */\ngoog.Uri.QueryData.prototype.getKeys = function() {\n  this.ensureKeyMapInitialized_();\n  // We need to get the values to know how many keys to add.\n  var vals = this.keyMap_.getValues();\n  var keys = this.keyMap_.getKeys();\n  var rv = [];\n  for (var i = 0; i < keys.length; i++) {\n    var val = vals[i];\n    for (var j = 0; j < val.length; j++) {\n      rv.push(keys[i]);\n    }\n  }\n  return rv;\n};\n\n\n/**\n * Returns all the values of the parameters with the given name. If the query\n * data has no such key this will return an empty array. If no key is given\n * all values wil be returned.\n * @param {string=} opt_key The name of the parameter to get the values for.\n * @return {!Array<?>} All the values of the parameters with the given name.\n */\ngoog.Uri.QueryData.prototype.getValues = function(opt_key) {\n  this.ensureKeyMapInitialized_();\n  var rv = [];\n  if (typeof opt_key === 'string') {\n    if (this.containsKey(opt_key)) {\n      rv = goog.array.concat(rv, this.keyMap_.get(this.getKeyName_(opt_key)));\n    }\n  } else {\n    // Return all values.\n    var values = this.keyMap_.getValues();\n    for (var i = 0; i < values.length; i++) {\n      rv = goog.array.concat(rv, values[i]);\n    }\n  }\n  return rv;\n};\n\n\n/**\n * Sets a key value pair and removes all other keys with the same value.\n *\n * @param {string} key Name.\n * @param {*} value Value.\n * @return {!goog.Uri.QueryData} Instance of this object.\n */\ngoog.Uri.QueryData.prototype.set = function(key, value) {\n  this.ensureKeyMapInitialized_();\n  this.invalidateCache_();\n\n  // TODO(chrishenry): This could be better written as\n  // this.remove(key), this.add(key, value), but that would reorder\n  // the key (since the key is first removed and then added at the\n  // end) and we would have to fix unit tests that depend on key\n  // ordering.\n  key = this.getKeyName_(key);\n  if (this.containsKey(key)) {\n    this.count_ =\n        goog.asserts.assertNumber(this.count_) - this.keyMap_.get(key).length;\n  }\n  this.keyMap_.set(key, [value]);\n  this.count_ = goog.asserts.assertNumber(this.count_) + 1;\n  return this;\n};\n\n\n/**\n * Returns the first value associated with the key. If the query data has no\n * such key this will return undefined or the optional default.\n * @param {string} key The name of the parameter to get the value for.\n * @param {*=} opt_default The default value to return if the query data\n *     has no such key.\n * @return {*} The first string value associated with the key, or opt_default\n *     if there's no value.\n */\ngoog.Uri.QueryData.prototype.get = function(key, opt_default) {\n  if (!key) {\n    return opt_default;\n  }\n  var values = this.getValues(key);\n  return values.length > 0 ? String(values[0]) : opt_default;\n};\n\n\n/**\n * Sets the values for a key. If the key already exists, this will\n * override all of the existing values that correspond to the key.\n * @param {string} key The key to set values for.\n * @param {!Array<?>} values The values to set.\n */\ngoog.Uri.QueryData.prototype.setValues = function(key, values) {\n  this.remove(key);\n\n  if (values.length > 0) {\n    this.invalidateCache_();\n    this.keyMap_.set(this.getKeyName_(key), goog.array.clone(values));\n    this.count_ = goog.asserts.assertNumber(this.count_) + values.length;\n  }\n};\n\n\n/**\n * @return {string} Encoded query string.\n * @override\n */\ngoog.Uri.QueryData.prototype.toString = function() {\n  if (this.encodedQuery_) {\n    return this.encodedQuery_;\n  }\n\n  if (!this.keyMap_) {\n    return '';\n  }\n\n  var sb = [];\n\n  // In the past, we use this.getKeys() and this.getVals(), but that\n  // generates a lot of allocations as compared to simply iterating\n  // over the keys.\n  var keys = this.keyMap_.getKeys();\n  for (var i = 0; i < keys.length; i++) {\n    var key = keys[i];\n    var encodedKey = goog.string.urlEncode(key);\n    var val = this.getValues(key);\n    for (var j = 0; j < val.length; j++) {\n      var param = encodedKey;\n      // Ensure that null and undefined are encoded into the url as\n      // literal strings.\n      if (val[j] !== '') {\n        param += '=' + goog.string.urlEncode(val[j]);\n      }\n      sb.push(param);\n    }\n  }\n\n  return this.encodedQuery_ = sb.join('&');\n};\n\n\n/**\n * @throws URIError If URI is malformed (that is, if decodeURIComponent fails on\n *     any of the URI components).\n * @return {string} Decoded query string.\n */\ngoog.Uri.QueryData.prototype.toDecodedString = function() {\n  return goog.Uri.decodeOrEmpty_(this.toString());\n};\n\n\n/**\n * Invalidate the cache.\n * @private\n */\ngoog.Uri.QueryData.prototype.invalidateCache_ = function() {\n  this.encodedQuery_ = null;\n};\n\n\n/**\n * Removes all keys that are not in the provided list. (Modifies this object.)\n * @param {Array<string>} keys The desired keys.\n * @return {!goog.Uri.QueryData} a reference to this object.\n */\ngoog.Uri.QueryData.prototype.filterKeys = function(keys) {\n  this.ensureKeyMapInitialized_();\n  this.keyMap_.forEach(function(value, key) {\n    if (!goog.array.contains(keys, key)) {\n      this.remove(key);\n    }\n  }, this);\n  return this;\n};\n\n\n/**\n * Clone the query data instance.\n * @return {!goog.Uri.QueryData} New instance of the QueryData object.\n */\ngoog.Uri.QueryData.prototype.clone = function() {\n  var rv = new goog.Uri.QueryData();\n  rv.encodedQuery_ = this.encodedQuery_;\n  if (this.keyMap_) {\n    rv.keyMap_ = this.keyMap_.clone();\n    rv.count_ = this.count_;\n  }\n  return rv;\n};\n\n\n/**\n * Helper function to get the key name from a JavaScript object. Converts\n * the object to a string, and to lower case if necessary.\n * @private\n * @param {*} arg The object to get a key name from.\n * @return {string} valid key name which can be looked up in #keyMap_.\n */\ngoog.Uri.QueryData.prototype.getKeyName_ = function(arg) {\n  var keyName = String(arg);\n  if (this.ignoreCase_) {\n    keyName = keyName.toLowerCase();\n  }\n  return keyName;\n};\n\n\n/**\n * Ignore case in parameter names.\n * NOTE: If there are already key/value pairs in the QueryData, and\n * ignoreCase_ is set to false, the keys will all be lower-cased.\n * @param {boolean} ignoreCase whether this goog.Uri should ignore case.\n */\ngoog.Uri.QueryData.prototype.setIgnoreCase = function(ignoreCase) {\n  var resetKeys = ignoreCase && !this.ignoreCase_;\n  if (resetKeys) {\n    this.ensureKeyMapInitialized_();\n    this.invalidateCache_();\n    this.keyMap_.forEach(function(value, key) {\n      var lowerCase = key.toLowerCase();\n      if (key != lowerCase) {\n        this.remove(key);\n        this.setValues(lowerCase, value);\n      }\n    }, this);\n  }\n  this.ignoreCase_ = ignoreCase;\n};\n\n\n/**\n * Extends a query data object with another query data or map like object. This\n * operates 'in-place', it does not create a new QueryData object.\n *\n * @param {...(?goog.Uri.QueryData|?goog.structs.Map<?, ?>|?Object)} var_args\n *     The object from which key value pairs will be copied. Note: does not\n *     accept null.\n * @suppress {deprecated} Use deprecated goog.structs.forEach to allow different\n * types of parameters.\n */\ngoog.Uri.QueryData.prototype.extend = function(var_args) {\n  for (var i = 0; i < arguments.length; i++) {\n    var data = arguments[i];\n    goog.structs.forEach(\n        data, function(value, key) { this.add(key, value); }, this);\n  }\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","~$goog.uri.utils","~$goog.string","~$goog.structs.Map","^IT","~$goog.uri.utils.StandardQueryParam","~$goog.uri.utils.ComponentIndex","~$goog.structs","^JJ"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/uri/uri.js"],"^JD",["^J4",["~$goog.Uri.QueryData","~$goog.Uri"]],"^IR",true,"^IS",["^IT","^JJ","^JF","^K7","^K;","^K8","^K6","^K:","^K9"]],["^ ","^IV",[1579837703000],"^IW","goog.i18n.charlistdecompressor.js","^IX",["^IY","goog/i18n/charlistdecompressor.js"],"^IZ","goog/i18n/charlistdecompressor.js","^I[","^J0","^J1","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The decompressor for Base88 compressed character lists.\n *\n * The compression is by base 88 encoding the delta between two adjacent\n * characters in ths list. The deltas can be positive or negative. Also, there\n * would be character ranges. These three types of values\n * are given enum values 0, 1 and 2 respectively. Initial 3 bits are used for\n * encoding the type and total length of the encoded value. Length enums 0, 1\n * and 2 represents lengths 1, 2 and 4. So (value * 8 + type * 3 + length enum)\n * is encoded in base 88 by following characters for numbers from 0 to 87:\n * 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ (continued in next line)\n * abcdefghijklmnopqrstuvwxyz!#$%()*+,-.:;<=>?@[]^_`{|}~\n *\n * Value uses 0 based counting. That is value for the range [a, b] is 0 and\n * that of [a, c] is 1. Simillarly, the delta of \"ab\" is 0.\n *\n * Following python script can be used to compress character lists taken\n * standard input: http://go/charlistcompressor.py\n *\n */\n\ngoog.provide('goog.i18n.CharListDecompressor');\n\ngoog.require('goog.array');\ngoog.require('goog.i18n.uChar');\n\n\n\n/**\n * Class to decompress base88 compressed character list.\n * @constructor\n * @final\n */\ngoog.i18n.CharListDecompressor = function() {\n  this.buildCharMap_(\n      '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr' +\n      'stuvwxyz!#$%()*+,-.:;<=>?@[]^_`{|}~');\n};\n\n\n/**\n * 1-1 mapping from ascii characters used in encoding to an integer in the\n * range 0 to 87.\n * @type {?Object}\n * @private\n */\ngoog.i18n.CharListDecompressor.prototype.charMap_ = null;\n\n\n/**\n * Builds the map from ascii characters used for the base88 scheme to number\n * each character represents.\n * @param {string} str The string of characters used in base88 scheme.\n * @private\n */\ngoog.i18n.CharListDecompressor.prototype.buildCharMap_ = function(str) {\n  if (!this.charMap_) {\n    this.charMap_ = {};\n    for (var i = 0; i < str.length; i++) {\n      this.charMap_[str.charAt(i)] = i;\n    }\n  }\n};\n\n\n/**\n * Gets the number encoded in base88 scheme by a substring of given length\n * and placed at the a given position of the string.\n * @param {string} str String containing sequence of characters encoding a\n *     number in base 88 scheme.\n * @param {number} start Starting position of substring encoding the number.\n * @param {number} leng Length of the substring encoding the number.\n * @return {number} The encoded number.\n * @private\n */\ngoog.i18n.CharListDecompressor.prototype.getCodeAt_ = function(\n    str, start, leng) {\n  var result = 0;\n  for (var i = 0; i < leng; i++) {\n    var c = this.charMap_[str.charAt(start + i)];\n    result += c * Math.pow(88, i);\n  }\n  return result;\n};\n\n\n/**\n * Add character(s) specified by the value and type to given list and return\n * the next character in the sequence.\n * @param {Array<string>} list The list of characters to which the specified\n *     characters are appended.\n * @param {number} lastcode The last codepoint that was added to the list.\n * @param {number} value The value component that representing the delta or\n *      range.\n * @param {number} type The type component that representing whether the value\n *      is a positive or negative delta or range.\n * @return {number} Last codepoint that is added to the list.\n * @private\n */\ngoog.i18n.CharListDecompressor.prototype.addChars_ = function(\n    list, lastcode, value, type) {\n  if (type == 0) {\n    lastcode += value + 1;\n    goog.array.extend(list, goog.i18n.uChar.fromCharCode(lastcode));\n  } else if (type == 1) {\n    lastcode -= value + 1;\n    goog.array.extend(list, goog.i18n.uChar.fromCharCode(lastcode));\n  } else if (type == 2) {\n    for (var i = 0; i <= value; i++) {\n      lastcode++;\n      goog.array.extend(list, goog.i18n.uChar.fromCharCode(lastcode));\n    }\n  }\n  return lastcode;\n};\n\n\n/**\n * Gets the list of characters specified in the given string by base 88 scheme.\n * @param {string} str The string encoding character list.\n * @return {!Array<string>} The list of characters specified by the given\n *     string in base 88 scheme.\n */\ngoog.i18n.CharListDecompressor.prototype.toCharList = function(str) {\n  var metasize = 8;\n  var result = [];\n  var lastcode = 0;\n  var i = 0;\n  while (i < str.length) {\n    var c = this.charMap_[str.charAt(i)];\n    var meta = c % metasize;\n    var type = Math.floor(meta / 3);\n    var leng = (meta % 3) + 1;\n    if (leng == 3) {\n      leng++;\n    }\n    var code = this.getCodeAt_(str, i, leng);\n    var value = Math.floor(code / metasize);\n    lastcode = this.addChars_(result, lastcode, value, type);\n\n    i += leng;\n  }\n  return result;\n};\n","^J2",1579837703000,"^J3",["^J4",["^IT","~$goog.i18n.uChar","^JJ"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/charlistdecompressor.js"],"^JD",["^J4",["~$goog.i18n.CharListDecompressor"]],"^IR",true,"^IS",["^IT","^JJ","^K>"]],["^ ","^IV",[1579837703000],"^IW","goog.crypt.sha2_64bit.js","^IX",["^IY","goog/crypt/sha2_64bit.js"],"^IZ","goog/crypt/sha2_64bit.js","^I[","^J0","^J1","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Base class for the 64-bit SHA-2 cryptographic hashes.\n *\n * Variable names follow the notation in FIPS PUB 180-3:\n * http://csrc.nist.gov/publications/fips/fips180-3/fips180-3_final.pdf.\n *\n * This code borrows heavily from the 32-bit SHA2 implementation written by\n * Yue Zhang (zysxqn@).\n *\n * @author fy@google.com (Frank Yellin)\n */\n\ngoog.provide('goog.crypt.Sha2_64bit');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.crypt.Hash');\ngoog.require('goog.math.Long');\n\n\n\n/**\n * Constructs a SHA-2 64-bit cryptographic hash.\n * This class should not be used. Rather, one should use one of its\n * subclasses.\n * @constructor\n * @param {number} numHashBlocks The size of the output in 16-byte blocks\n * @param {!Array<number>} initHashBlocks The hash-specific initialization\n *     vector, as a sequence of sixteen 32-bit numbers.\n * @extends {goog.crypt.Hash}\n * @struct\n */\ngoog.crypt.Sha2_64bit = function(numHashBlocks, initHashBlocks) {\n  goog.crypt.Sha2_64bit.base(this, 'constructor');\n\n  /**\n   * The number of bytes that are digested in each pass of this hasher.\n   * @const {number}\n   */\n  this.blockSize = goog.crypt.Sha2_64bit.BLOCK_SIZE_;\n\n  /**\n   * A chunk holding the currently processed message bytes. Once the chunk has\n   * `this.blocksize` bytes, we feed it into [@code computeChunk_}.\n   * @private {!Uint8Array|!Array<number>}\n   */\n  this.chunk_ = goog.global['Uint8Array'] ? new Uint8Array(this.blockSize) :\n                                            new Array(this.blockSize);\n\n  /**\n   * Current number of bytes in `this.chunk_`.\n   * @private {number}\n   */\n  this.chunkBytes_ = 0;\n\n  /**\n   * Total number of bytes in currently processed message.\n   * @private {number}\n   */\n  this.total_ = 0;\n\n  /**\n   * Holds the previous values of accumulated hash a-h in the\n   * `computeChunk_` function.\n   * @private {!Array<!goog.math.Long>}\n   */\n  this.hash_ = [];\n\n  /**\n   * The number of blocks of output produced by this hash function, where each\n   * block is eight bytes long.\n   * @private {number}\n   */\n  this.numHashBlocks_ = numHashBlocks;\n\n  /**\n   * Temporary array used in chunk computation.  Allocate here as a\n   * member rather than as a local within computeChunk_() as a\n   * performance optimization to reduce the number of allocations and\n   * reduce garbage collection.\n   * @type {!Array<!goog.math.Long>}\n   * @private\n   */\n  this.w_ = [];\n\n  /**\n   * The value to which `this.hash_` should be reset when this\n   * Hasher is reset.\n   * @private @const {!Array<!goog.math.Long>}\n   */\n  this.initHashBlocks_ = goog.crypt.Sha2_64bit.toLongArray_(initHashBlocks);\n\n  /**\n   * If true, we have taken the digest from this hasher, but we have not\n   * yet reset it.\n   *\n   * @private {boolean}\n   */\n  this.needsReset_ = false;\n\n  this.reset();\n};\ngoog.inherits(goog.crypt.Sha2_64bit, goog.crypt.Hash);\n\n\n/**\n * The number of bytes that are digested in each pass of this hasher.\n * @private @const {number}\n */\ngoog.crypt.Sha2_64bit.BLOCK_SIZE_ = 1024 / 8;\n\n\n/**\n * Contains data needed to pad messages less than `blocksize` bytes.\n * @private {!Array<number>}\n */\ngoog.crypt.Sha2_64bit.PADDING_ = goog.array.concat(\n    [0x80], goog.array.repeat(0, goog.crypt.Sha2_64bit.BLOCK_SIZE_ - 1));\n\n\n/**\n * Resets this hash function.\n * @override\n */\ngoog.crypt.Sha2_64bit.prototype.reset = function() {\n  this.chunkBytes_ = 0;\n  this.total_ = 0;\n  this.hash_ = goog.array.clone(this.initHashBlocks_);\n  this.needsReset_ = false;\n};\n\n\n/** @override */\ngoog.crypt.Sha2_64bit.prototype.update = function(message, opt_length) {\n  var length = (opt_length !== undefined) ? opt_length : message.length;\n\n  // Make sure this hasher is usable.\n  if (this.needsReset_) {\n    throw new Error('this hasher needs to be reset');\n  }\n  // Process the message from left to right up to |length| bytes.\n  // When we get a 512-bit chunk, compute the hash of it and reset\n  // this.chunk_. The message might not be multiple of 512 bits so we\n  // might end up with a chunk that is less than 512 bits. We store\n  // such partial chunk in chunk_ and it will be filled up later\n  // in digest().\n  var chunkBytes = this.chunkBytes_;\n\n  // The input message could be either byte array or string.\n  if (typeof message === 'string') {\n    for (var i = 0; i < length; i++) {\n      var b = message.charCodeAt(i);\n      if (b > 255) {\n        throw new Error('Characters must be in range [0,255]');\n      }\n      this.chunk_[chunkBytes++] = b;\n      if (chunkBytes == this.blockSize) {\n        this.computeChunk_();\n        chunkBytes = 0;\n      }\n    }\n  } else if (goog.isArrayLike(message)) {\n    for (var i = 0; i < length; i++) {\n      var b = message[i];\n      // Hack:  b|0 coerces b to an integer, so the last part confirms that\n      // b has no fractional part.\n      if (typeof b !== 'number' || b < 0 || b > 255 || b != (b | 0)) {\n        throw new Error('message must be a byte array');\n      }\n      this.chunk_[chunkBytes++] = b;\n      if (chunkBytes == this.blockSize) {\n        this.computeChunk_();\n        chunkBytes = 0;\n      }\n    }\n  } else {\n    throw new Error('message must be string or array');\n  }\n\n  // Record the current bytes in chunk to support partial update.\n  this.chunkBytes_ = chunkBytes;\n\n  // Record total message bytes we have processed so far.\n  this.total_ += length;\n};\n\n\n/** @override */\ngoog.crypt.Sha2_64bit.prototype.digest = function() {\n  if (this.needsReset_) {\n    throw new Error('this hasher needs to be reset');\n  }\n  var totalBits = this.total_ * 8;\n\n  // Append pad 0x80 0x00* until this.chunkBytes_ == 112\n  if (this.chunkBytes_ < 112) {\n    this.update(goog.crypt.Sha2_64bit.PADDING_, 112 - this.chunkBytes_);\n  } else {\n    // the rest of this block, plus 112 bytes of next block\n    this.update(\n        goog.crypt.Sha2_64bit.PADDING_,\n        this.blockSize - this.chunkBytes_ + 112);\n  }\n\n  // Append # bits in the 64-bit big-endian format.\n  for (var i = 127; i >= 112; i--) {\n    this.chunk_[i] = totalBits & 255;\n    totalBits /= 256;  // Don't use bit-shifting here!\n  }\n  this.computeChunk_();\n\n  // Finally, output the result digest.\n  var n = 0;\n  var digest = new Array(8 * this.numHashBlocks_);\n  for (var i = 0; i < this.numHashBlocks_; i++) {\n    var block = this.hash_[i];\n    var high = block.getHighBits();\n    var low = block.getLowBits();\n    for (var j = 24; j >= 0; j -= 8) {\n      digest[n++] = ((high >> j) & 255);\n    }\n    for (var j = 24; j >= 0; j -= 8) {\n      digest[n++] = ((low >> j) & 255);\n    }\n  }\n\n  // The next call to this hasher must be a reset\n  this.needsReset_ = true;\n  return digest;\n};\n\n\n/**\n * Updates this hash by processing the 1024-bit message chunk in this.chunk_.\n * @private\n */\ngoog.crypt.Sha2_64bit.prototype.computeChunk_ = function() {\n  var chunk = this.chunk_;\n  var K_ = goog.crypt.Sha2_64bit.K_;\n\n  // Divide the chunk into 16 64-bit-words.\n  var w = this.w_;\n  for (var i = 0; i < 16; i++) {\n    var offset = i * 8;\n    w[i] = new goog.math.Long(\n        (chunk[offset + 4] << 24) | (chunk[offset + 5] << 16) |\n            (chunk[offset + 6] << 8) | (chunk[offset + 7]),\n        (chunk[offset] << 24) | (chunk[offset + 1] << 16) |\n            (chunk[offset + 2] << 8) | (chunk[offset + 3]));\n  }\n\n  // Extend the w[] array to be the number of rounds.\n  for (var i = 16; i < 80; i++) {\n    var s0 = this.sigma0_(w[i - 15]);\n    var s1 = this.sigma1_(w[i - 2]);\n    w[i] = this.sum_(w[i - 16], w[i - 7], s0, s1);\n  }\n\n  var a = this.hash_[0];\n  var b = this.hash_[1];\n  var c = this.hash_[2];\n  var d = this.hash_[3];\n  var e = this.hash_[4];\n  var f = this.hash_[5];\n  var g = this.hash_[6];\n  var h = this.hash_[7];\n  for (var i = 0; i < 80; i++) {\n    var S0 = this.Sigma0_(a);\n    var maj = this.majority_(a, b, c);\n    var t2 = S0.add(maj);\n    var S1 = this.Sigma1_(e);\n    var ch = this.choose_(e, f, g);\n    var t1 = this.sum_(h, S1, ch, K_[i], w[i]);\n    h = g;\n    g = f;\n    f = e;\n    e = d.add(t1);\n    d = c;\n    c = b;\n    b = a;\n    a = t1.add(t2);\n  }\n\n  this.hash_[0] = this.hash_[0].add(a);\n  this.hash_[1] = this.hash_[1].add(b);\n  this.hash_[2] = this.hash_[2].add(c);\n  this.hash_[3] = this.hash_[3].add(d);\n  this.hash_[4] = this.hash_[4].add(e);\n  this.hash_[5] = this.hash_[5].add(f);\n  this.hash_[6] = this.hash_[6].add(g);\n  this.hash_[7] = this.hash_[7].add(h);\n};\n\n\n/**\n * Calculates the SHA2 64-bit sigma0 function.\n * rotateRight(value, 1) ^ rotateRight(value, 8) ^ (value >>> 7)\n *\n * @private\n * @param {!goog.math.Long} value\n * @return {!goog.math.Long}\n */\ngoog.crypt.Sha2_64bit.prototype.sigma0_ = function(value) {\n  var valueLow = value.getLowBits();\n  var valueHigh = value.getHighBits();\n  // Implementation note: We purposely do not use the shift operations defined\n  // in goog.math.Long.  Inlining the code for specific values of shifting and\n  // not generating the intermediate results doubles the speed of this code.\n  var low = (valueLow >>> 1) ^ (valueHigh << 31) ^ (valueLow >>> 8) ^\n      (valueHigh << 24) ^ (valueLow >>> 7) ^ (valueHigh << 25);\n  var high = (valueHigh >>> 1) ^ (valueLow << 31) ^ (valueHigh >>> 8) ^\n      (valueLow << 24) ^ (valueHigh >>> 7);\n  return new goog.math.Long(low, high);\n};\n\n\n/**\n * Calculates the SHA2 64-bit sigma1 function.\n * rotateRight(value, 19) ^ rotateRight(value, 61) ^ (value >>> 6)\n *\n * @private\n * @param {!goog.math.Long} value\n * @return {!goog.math.Long}\n */\ngoog.crypt.Sha2_64bit.prototype.sigma1_ = function(value) {\n  var valueLow = value.getLowBits();\n  var valueHigh = value.getHighBits();\n  // Implementation note:  See _sigma0() above\n  var low = (valueLow >>> 19) ^ (valueHigh << 13) ^ (valueHigh >>> 29) ^\n      (valueLow << 3) ^ (valueLow >>> 6) ^ (valueHigh << 26);\n  var high = (valueHigh >>> 19) ^ (valueLow << 13) ^ (valueLow >>> 29) ^\n      (valueHigh << 3) ^ (valueHigh >>> 6);\n  return new goog.math.Long(low, high);\n};\n\n\n/**\n * Calculates the SHA2 64-bit Sigma0 function.\n * rotateRight(value, 28) ^ rotateRight(value, 34) ^ rotateRight(value, 39)\n *\n * @private\n * @param {!goog.math.Long} value\n * @return {!goog.math.Long}\n */\ngoog.crypt.Sha2_64bit.prototype.Sigma0_ = function(value) {\n  var valueLow = value.getLowBits();\n  var valueHigh = value.getHighBits();\n  // Implementation note:  See _sigma0() above\n  var low = (valueLow >>> 28) ^ (valueHigh << 4) ^ (valueHigh >>> 2) ^\n      (valueLow << 30) ^ (valueHigh >>> 7) ^ (valueLow << 25);\n  var high = (valueHigh >>> 28) ^ (valueLow << 4) ^ (valueLow >>> 2) ^\n      (valueHigh << 30) ^ (valueLow >>> 7) ^ (valueHigh << 25);\n  return new goog.math.Long(low, high);\n};\n\n\n/**\n * Calculates the SHA2 64-bit Sigma1 function.\n * rotateRight(value, 14) ^ rotateRight(value, 18) ^ rotateRight(value, 41)\n *\n * @private\n * @param {!goog.math.Long} value\n * @return {!goog.math.Long}\n */\ngoog.crypt.Sha2_64bit.prototype.Sigma1_ = function(value) {\n  var valueLow = value.getLowBits();\n  var valueHigh = value.getHighBits();\n  // Implementation note:  See _sigma0() above\n  var low = (valueLow >>> 14) ^ (valueHigh << 18) ^ (valueLow >>> 18) ^\n      (valueHigh << 14) ^ (valueHigh >>> 9) ^ (valueLow << 23);\n  var high = (valueHigh >>> 14) ^ (valueLow << 18) ^ (valueHigh >>> 18) ^\n      (valueLow << 14) ^ (valueLow >>> 9) ^ (valueHigh << 23);\n  return new goog.math.Long(low, high);\n};\n\n\n/**\n * Calculates the SHA-2 64-bit choose function.\n *\n * This function uses `value` as a mask to choose bits from either\n * `one` if the bit is set or `two` if the bit is not set.\n *\n * @private\n * @param {!goog.math.Long} value\n * @param {!goog.math.Long} one\n * @param {!goog.math.Long} two\n * @return {!goog.math.Long}\n */\ngoog.crypt.Sha2_64bit.prototype.choose_ = function(value, one, two) {\n  var valueLow = value.getLowBits();\n  var valueHigh = value.getHighBits();\n  return new goog.math.Long(\n      (valueLow & one.getLowBits()) | (~valueLow & two.getLowBits()),\n      (valueHigh & one.getHighBits()) | (~valueHigh & two.getHighBits()));\n};\n\n\n/**\n * Calculates the SHA-2 64-bit majority function.\n * This function returns, for each bit position, the bit held by the majority\n * of its three arguments.\n *\n * @private\n * @param {!goog.math.Long} one\n * @param {!goog.math.Long} two\n * @param {!goog.math.Long} three\n * @return {!goog.math.Long}\n */\ngoog.crypt.Sha2_64bit.prototype.majority_ = function(one, two, three) {\n  return new goog.math.Long(\n      (one.getLowBits() & two.getLowBits()) |\n          (two.getLowBits() & three.getLowBits()) |\n          (one.getLowBits() & three.getLowBits()),\n      (one.getHighBits() & two.getHighBits()) |\n          (two.getHighBits() & three.getHighBits()) |\n          (one.getHighBits() & three.getHighBits()));\n};\n\n\n/**\n * Adds two or more goog.math.Long values.\n *\n * @private\n * @param {!goog.math.Long} one first summand\n * @param {!goog.math.Long} two second summand\n * @param {...goog.math.Long} var_args more arguments to sum\n * @return {!goog.math.Long} The resulting sum.\n */\ngoog.crypt.Sha2_64bit.prototype.sum_ = function(one, two, var_args) {\n  // The low bits may be signed, but they represent a 32-bit unsigned quantity.\n  // We must be careful to normalize them.\n  // This doesn't matter for the high bits.\n  // Implementation note:  Performance testing shows that this method runs\n  // fastest when the first two arguments are pulled out of the loop.\n  var low = (one.getLowBits() ^ 0x80000000) + (two.getLowBits() ^ 0x80000000);\n  var high = one.getHighBits() + two.getHighBits();\n  for (var i = arguments.length - 1; i >= 2; --i) {\n    low += arguments[i].getLowBits() ^ 0x80000000;\n    high += arguments[i].getHighBits();\n  }\n  // Because of the ^0x80000000, each value we added is 0x80000000 too small.\n  // Add arguments.length * 0x80000000 to the current sum.  We can do this\n  // quickly by adding 0x80000000 to low when the number of arguments is\n  // odd, and adding (number of arguments) >> 1 to high.\n  if (arguments.length & 1) {\n    low += 0x80000000;\n  }\n  high += arguments.length >> 1;\n\n  // If low is outside the range [0, 0xFFFFFFFF], its overflow or underflow\n  // should be added to high.  We don't actually need to modify low or\n  // normalize high because the goog.math.Long constructor already does that.\n  high += Math.floor(low / 0x100000000);\n  return new goog.math.Long(low, high);\n};\n\n\n/**\n * Converts an array of 32-bit integers into an array of goog.math.Long\n * elements.\n *\n * @private\n * @param {!Array<number>} values An array of 32-bit numbers.  Its length\n *     must be even.  Each pair of numbers represents a 64-bit integer\n *     in big-endian order\n * @return {!Array<!goog.math.Long>}\n */\ngoog.crypt.Sha2_64bit.toLongArray_ = function(values) {\n  goog.asserts.assert(values.length % 2 == 0);\n  var result = [];\n  for (var i = 0; i < values.length; i += 2) {\n    result.push(new goog.math.Long(values[i + 1], values[i]));\n  }\n  return result;\n};\n\n\n/**\n * Fixed constants used in SHA-512 variants.\n *\n * These values are from Section 4.2.3 of\n * http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf\n * @const\n * @private {!Array<!goog.math.Long>}\n */\ngoog.crypt.Sha2_64bit.K_ = goog.crypt.Sha2_64bit.toLongArray_([\n  0x428a2f98, 0xd728ae22, 0x71374491, 0x23ef65cd, 0xb5c0fbcf, 0xec4d3b2f,\n  0xe9b5dba5, 0x8189dbbc, 0x3956c25b, 0xf348b538, 0x59f111f1, 0xb605d019,\n  0x923f82a4, 0xaf194f9b, 0xab1c5ed5, 0xda6d8118, 0xd807aa98, 0xa3030242,\n  0x12835b01, 0x45706fbe, 0x243185be, 0x4ee4b28c, 0x550c7dc3, 0xd5ffb4e2,\n  0x72be5d74, 0xf27b896f, 0x80deb1fe, 0x3b1696b1, 0x9bdc06a7, 0x25c71235,\n  0xc19bf174, 0xcf692694, 0xe49b69c1, 0x9ef14ad2, 0xefbe4786, 0x384f25e3,\n  0x0fc19dc6, 0x8b8cd5b5, 0x240ca1cc, 0x77ac9c65, 0x2de92c6f, 0x592b0275,\n  0x4a7484aa, 0x6ea6e483, 0x5cb0a9dc, 0xbd41fbd4, 0x76f988da, 0x831153b5,\n  0x983e5152, 0xee66dfab, 0xa831c66d, 0x2db43210, 0xb00327c8, 0x98fb213f,\n  0xbf597fc7, 0xbeef0ee4, 0xc6e00bf3, 0x3da88fc2, 0xd5a79147, 0x930aa725,\n  0x06ca6351, 0xe003826f, 0x14292967, 0x0a0e6e70, 0x27b70a85, 0x46d22ffc,\n  0x2e1b2138, 0x5c26c926, 0x4d2c6dfc, 0x5ac42aed, 0x53380d13, 0x9d95b3df,\n  0x650a7354, 0x8baf63de, 0x766a0abb, 0x3c77b2a8, 0x81c2c92e, 0x47edaee6,\n  0x92722c85, 0x1482353b, 0xa2bfe8a1, 0x4cf10364, 0xa81a664b, 0xbc423001,\n  0xc24b8b70, 0xd0f89791, 0xc76c51a3, 0x0654be30, 0xd192e819, 0xd6ef5218,\n  0xd6990624, 0x5565a910, 0xf40e3585, 0x5771202a, 0x106aa070, 0x32bbd1b8,\n  0x19a4c116, 0xb8d2d0c8, 0x1e376c08, 0x5141ab53, 0x2748774c, 0xdf8eeb99,\n  0x34b0bcb5, 0xe19b48a8, 0x391c0cb3, 0xc5c95a63, 0x4ed8aa4a, 0xe3418acb,\n  0x5b9cca4f, 0x7763e373, 0x682e6ff3, 0xd6b2b8a3, 0x748f82ee, 0x5defb2fc,\n  0x78a5636f, 0x43172f60, 0x84c87814, 0xa1f0ab72, 0x8cc70208, 0x1a6439ec,\n  0x90befffa, 0x23631e28, 0xa4506ceb, 0xde82bde9, 0xbef9a3f7, 0xb2c67915,\n  0xc67178f2, 0xe372532b, 0xca273ece, 0xea26619c, 0xd186b8c7, 0x21c0c207,\n  0xeada7dd6, 0xcde0eb1e, 0xf57d4f7f, 0xee6ed178, 0x06f067aa, 0x72176fba,\n  0x0a637dc5, 0xa2c898a6, 0x113f9804, 0xbef90dae, 0x1b710b35, 0x131c471b,\n  0x28db77f5, 0x23047d84, 0x32caab7b, 0x40c72493, 0x3c9ebe0a, 0x15c9bebc,\n  0x431d67c4, 0x9c100d4c, 0x4cc5d4be, 0xcb3e42b6, 0x597f299c, 0xfc657e2a,\n  0x5fcb6fab, 0x3ad6faec, 0x6c44198c, 0x4a475817\n]);\n","^J2",1579837703000,"^J3",["^J4",["^JF","^IT","~$goog.crypt.Hash","^JJ","~$goog.math.Long"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/sha2_64bit.js"],"^JD",["^J4",["~$goog.crypt.Sha2-64bit","~$goog.crypt.Sha2_64bit"]],"^IR",true,"^IS",["^IT","^JJ","^JF","^K@","^KA"]],["^ ","^IV",[1579837703000],"^IW","goog.storage.mechanism.iterablemechanismtester.js","^IX",["^IY","goog/storage/mechanism/iterablemechanismtester.js"],"^IZ","goog/storage/mechanism/iterablemechanismtester.js","^I[","^J0","^J1","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Unit tests for the iterable storage mechanism interface.\n *\n * These tests should be included in tests of any class extending\n * goog.storage.mechanism.IterableMechanism.\n *\n */\n\ngoog.provide('goog.storage.mechanism.iterableMechanismTester');\n\ngoog.require('goog.iter');\ngoog.require('goog.iter.StopIteration');\ngoog.require('goog.testing.asserts');\ngoog.setTestOnly('iterableMechanismTester');\n\n\nvar mechanism = null;\n\n\nfunction testCount() {\n  if (!mechanism) {\n    return;\n  }\n  assertEquals(0, mechanism.getCount());\n  mechanism.set('first', 'one');\n  assertEquals(1, mechanism.getCount());\n  mechanism.set('second', 'two');\n  assertEquals(2, mechanism.getCount());\n  mechanism.set('first', 'three');\n  assertEquals(2, mechanism.getCount());\n}\n\n\nfunction testIteratorBasics() {\n  if (!mechanism) {\n    return;\n  }\n  mechanism.set('first', 'one');\n  assertEquals('first', mechanism.__iterator__(true).next());\n  assertEquals('one', mechanism.__iterator__(false).next());\n  var iterator = mechanism.__iterator__();\n  assertEquals('one', iterator.next());\n  assertEquals(goog.iter.StopIteration, assertThrows(iterator.next));\n}\n\n\nfunction testIteratorWithTwoValues() {\n  if (!mechanism) {\n    return;\n  }\n  mechanism.set('first', 'one');\n  mechanism.set('second', 'two');\n  assertSameElements(['one', 'two'], goog.iter.toArray(mechanism));\n  assertSameElements(\n      ['first', 'second'], goog.iter.toArray(mechanism.__iterator__(true)));\n}\n\n\nfunction testClear() {\n  if (!mechanism) {\n    return;\n  }\n  mechanism.set('first', 'one');\n  mechanism.set('second', 'two');\n  mechanism.clear();\n  assertNull(mechanism.get('first'));\n  assertNull(mechanism.get('second'));\n  assertEquals(0, mechanism.getCount());\n  assertEquals(\n      goog.iter.StopIteration, assertThrows(mechanism.__iterator__(true).next));\n  assertEquals(\n      goog.iter.StopIteration,\n      assertThrows(mechanism.__iterator__(false).next));\n}\n\n\nfunction testClearClear() {\n  if (!mechanism) {\n    return;\n  }\n  mechanism.clear();\n  mechanism.clear();\n  assertEquals(0, mechanism.getCount());\n}\n\n\nfunction testIteratorWithWeirdKeys() {\n  if (!mechanism) {\n    return;\n  }\n  mechanism.set(' ', 'space');\n  mechanism.set('=+!@#$%^&*()-_\\\\|;:\\'\",./<>?[]{}~`', 'control');\n  mechanism.set(\n      '\\u4e00\\u4e8c\\u4e09\\u56db\\u4e94\\u516d\\u4e03\\u516b\\u4e5d\\u5341', 'ten');\n  assertEquals(3, mechanism.getCount());\n  assertSameElements(\n      [\n        ' ', '=+!@#$%^&*()-_\\\\|;:\\'\",./<>?[]{}~`',\n        '\\u4e00\\u4e8c\\u4e09\\u56db\\u4e94\\u516d\\u4e03\\u516b\\u4e5d\\u5341'\n      ],\n      goog.iter.toArray(mechanism.__iterator__(true)));\n  mechanism.clear();\n  assertEquals(0, mechanism.getCount());\n}\n","^J2",1579837703000,"^J3",["^J4",["~$goog.iter","~$goog.testing.asserts","^IT","~$goog.iter.StopIteration"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/mechanism/iterablemechanismtester.js"],"^JD",["^J4",["~$goog.storage.mechanism.iterableMechanismTester"]],"^IR",true,"^IS",["^IT","^KD","^KF","^KE"]],["^ ","^IV",[1579837703000],"^IW","goog.i18n.datetimeformat.js","^IX",["^IY","goog/i18n/datetimeformat.js"],"^IZ","goog/i18n/datetimeformat.js","^I[","^J0","^J1","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions for dealing with date/time formatting.\n */\n\n\n/**\n * Namespace for i18n date/time formatting functions\n */\ngoog.provide('goog.i18n.DateTimeFormat');\ngoog.provide('goog.i18n.DateTimeFormat.Format');\n\ngoog.require('goog.asserts');\ngoog.require('goog.date');\ngoog.require('goog.i18n.DateTimeSymbols');\ngoog.require('goog.i18n.TimeZone');\ngoog.require('goog.string');\n\n\n/**\n * Datetime formatting functions following the pattern specification as defined\n * in JDK, ICU and CLDR, with minor modification for typical usage in JS.\n * Pattern specification:\n * {@link http://userguide.icu-project.org/formatparse/datetime}\n * <pre>\n * Symbol   Meaning                    Presentation       Example\n * ------   -------                    ------------       -------\n * G#       era designator             (Text)             AD\n * y#       year                       (Number)           1996\n * Y        year (week of year)        (Number)           1997\n * u*       extended year              (Number)           4601\n * Q#       quarter                    (Text)             Q3 & 3rd quarter\n * M        month in year              (Text & Number)    July & 07\n * L        month in year (standalone) (Text & Number)    July & 07\n * d        day in month               (Number)           10\n * h        hour in am/pm (1~12)       (Number)           12\n * H        hour in day (0~23)         (Number)           0\n * m        minute in hour             (Number)           30\n * s        second in minute           (Number)           55\n * S        fractional second          (Number)           978\n * E#       day of week                (Text)             Tue & Tuesday\n * e*       day of week (local 1~7)    (Number)           2\n * c#       day of week (standalone)   (Text & Number)    2 & Tues & Tuesday & T\n * D*       day in year                (Number)           189\n * F*       day of week in month       (Number)           2 (2nd Wed in July)\n * w        week in year               (Number)           27\n * W*       week in month              (Number)           2\n * a        am/pm marker               (Text)             PM\n * k        hour in day (1~24)         (Number)           24\n * K        hour in am/pm (0~11)       (Number)           0\n * z        time zone                  (Text)             Pacific Standard Time\n * Z#       time zone (RFC 822)        (Number)           -0800\n * v#       time zone (generic)        (Text)             America/Los_Angeles\n * V#       time zone                  (Text)             Los Angeles Time\n * g*       Julian day                 (Number)           2451334\n * A*       milliseconds in day        (Number)           69540000\n * '        escape for text            (Delimiter)        'Date='\n * ''       single quote               (Literal)          'o''clock'\n *\n * Item marked with '*' are not supported yet.\n * Item marked with '#' works different than java\n *\n * The count of pattern letters determine the format.\n * (Text): 4 or more, use full form, <4, use short or abbreviated form if it\n * exists. (e.g., \"EEEE\" produces \"Monday\", \"EEE\" produces \"Mon\")\n *\n * (Number): the minimum number of digits. Shorter numbers are zero-padded to\n * this amount (e.g. if \"m\" produces \"6\", \"mm\" produces \"06\"). Year is handled\n * specially; that is, if the count of 'y' is 2, the Year will be truncated to\n * 2 digits. (e.g., if \"yyyy\" produces \"1997\", \"yy\" produces \"97\".) Unlike other\n * fields, fractional seconds are padded on the right with zero.\n *\n * :(Text & Number) 3 or over, use text, otherwise use number. (e.g., \"M\"\n * produces \"1\", \"MM\" produces \"01\", \"MMM\" produces \"Jan\", and \"MMMM\" produces\n * \"January\".)\n *\n * Any characters in the pattern that are not in the ranges of ['a'..'z'] and\n * ['A'..'Z'] will be treated as quoted text. For instance, characters like ':',\n * '.', ' ', '#' and '@' will appear in the resulting time text even they are\n * not embraced within single quotes.\n * </pre>\n */\n\n/**\n * Construct a DateTimeFormat object based on current locale.\n * @constructor\n * @param {string|number} pattern pattern specification or pattern type.\n * @param {!Object=} opt_dateTimeSymbols Optional symbols to use for this\n *     instance rather than the global symbols.\n *     You can use some of the predefined SHORT / MEDIUM / LONG / FULL patterns,\n *     or the common patterns defined in goog.i18n.DateTimePatterns.\n *     Examples:\n *     <code><pre>\n *       var fmt = new goog.i18n.DateTimeFormat(\n *           goog.i18n.DateTimeFormat.Format.FULL_DATE);\n *       var fmt = new goog.i18n.DateTimeFormat(\n *           goog.i18n.DateTimePatterns.MONTH_DAY_YEAR_MEDIUM);\n *     </pre></code>\n *\n * {@see goog.i18n.DateTimeFormat.Format}\n * {@see goog.i18n.DateTimePatterns}\n * @final\n */\ngoog.i18n.DateTimeFormat = function(pattern, opt_dateTimeSymbols) {\n  goog.asserts.assert(pattern !== undefined, 'Pattern must be defined');\n  goog.asserts.assert(\n      opt_dateTimeSymbols !== undefined ||\n          goog.i18n.DateTimeSymbols !== undefined,\n      'goog.i18n.DateTimeSymbols or explicit symbols must be defined');\n\n  this.patternParts_ = [];\n\n  /**\n   * Data structure that with all the locale info needed for date formatting.\n   * (day/month names, most common patterns, rules for week-end, etc.)\n   * @private {!goog.i18n.DateTimeSymbolsType}\n   */\n  this.dateTimeSymbols_ = /** @type {!goog.i18n.DateTimeSymbolsType} */ (\n      opt_dateTimeSymbols || goog.i18n.DateTimeSymbols);\n  if (typeof pattern == 'number') {\n    this.applyStandardPattern_(pattern);\n  } else {\n    this.applyPattern_(pattern);\n  }\n};\n\n\n/**\n * Enum to identify predefined Date/Time format pattern.\n * @enum {number}\n */\ngoog.i18n.DateTimeFormat.Format = {\n  FULL_DATE: 0,\n  LONG_DATE: 1,\n  MEDIUM_DATE: 2,\n  SHORT_DATE: 3,\n  FULL_TIME: 4,\n  LONG_TIME: 5,\n  MEDIUM_TIME: 6,\n  SHORT_TIME: 7,\n  FULL_DATETIME: 8,\n  LONG_DATETIME: 9,\n  MEDIUM_DATETIME: 10,\n  SHORT_DATETIME: 11\n};\n\n\n/**\n * regular expression pattern for parsing pattern string\n * @type {Array<RegExp>}\n * @private\n */\ngoog.i18n.DateTimeFormat.TOKENS_ = [\n  // quote string\n  /^\\'(?:[^\\']|\\'\\')*(\\'|$)/,\n  // pattern chars\n  /^(?:G+|y+|Y+|M+|k+|S+|E+|a+|h+|K+|H+|c+|L+|Q+|d+|m+|s+|v+|V+|w+|z+|Z+)/,\n  // and all the other chars\n  /^[^\\'GyYMkSEahKHcLQdmsvVwzZ]+/  // and all the other chars\n];\n\n\n/**\n * These are token types, corresponding to above token definitions.\n * @enum {number}\n * @private\n */\ngoog.i18n.DateTimeFormat.PartTypes_ = {\n  QUOTED_STRING: 0,\n  FIELD: 1,\n  LITERAL: 2\n};\n\n\n/**\n * @param {!goog.date.DateLike} date\n * @return {number}\n * @private\n */\ngoog.i18n.DateTimeFormat.getHours_ = function(date) {\n  return date.getHours ? date.getHours() : 0;\n};\n\n\n/**\n * Apply specified pattern to this formatter object.\n * @param {string} pattern String specifying how the date should be formatted.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.applyPattern_ = function(pattern) {\n  if (goog.i18n.DateTimeFormat.removeRlmInPatterns_) {\n    // Remove RLM unicode control character from pattern.\n    pattern = pattern.replace(/\\u200f/g, '');\n  }\n  // lex the pattern, once for all uses\n  while (pattern) {\n    var previousPattern = pattern;\n    for (var i = 0; i < goog.i18n.DateTimeFormat.TOKENS_.length; ++i) {\n      var m = pattern.match(goog.i18n.DateTimeFormat.TOKENS_[i]);\n      if (m) {\n        var part = m[0];\n        pattern = pattern.substring(part.length);\n        if (i == goog.i18n.DateTimeFormat.PartTypes_.QUOTED_STRING) {\n          if (part == '\\'\\'') {\n            part = '\\'';  // '' -> '\n          } else {\n            part = part.substring(\n                1,\n                m[1] == '\\'' ? part.length - 1 : part.length);  // strip quotes\n            part = part.replace(/\\'\\'/g, '\\'');\n          }\n        }\n        this.patternParts_.push({text: part, type: i});\n        break;\n      }\n    }\n    if (previousPattern === pattern) {\n      // On every iteration, part of the pattern string must be consumed.\n      throw new Error('Malformed pattern part: ' + pattern);\n    }\n  }\n};\n\n\n/**\n * Format the given date object according to preset pattern and current locale.\n * @param {goog.date.DateLike} date The Date object that is being formatted.\n * @param {goog.i18n.TimeZone=} opt_timeZone optional, if specified, time\n *    related fields will be formatted based on its setting. When this field\n *    is not specified, \"undefined\" will be pass around and those function\n *    that really need time zone service will create a default one.\n * @return {string} Formatted string for the given date.\n *    Throws an error if the date is null or if one tries to format a date-only\n *    object (for instance goog.date.Date) using a pattern with time fields.\n */\ngoog.i18n.DateTimeFormat.prototype.format = function(date, opt_timeZone) {\n  if (!date) throw new Error('The date to format must be non-null.');\n\n  // We don't want to write code to calculate each date field because we\n  // want to maximize performance and minimize code size.\n  // JavaScript only provide API to render local time.\n  // Suppose target date is: 16:00 GMT-0400\n  // OS local time is:       12:00 GMT-0800\n  // We want to create a Local Date Object : 16:00 GMT-0800, and fix the\n  // time zone display ourselves.\n  // Thing get a little bit tricky when daylight time transition happens. For\n  // example, suppose OS timeZone is America/Los_Angeles, it is impossible to\n  // represent \"2006/4/2 02:30\" even for those timeZone that has no transition\n  // at this time. Because 2:00 to 3:00 on that day does not exist in\n  // America/Los_Angeles time zone. To avoid calculating date field through\n  // our own code, we uses 3 Date object instead, one for \"Year, month, day\",\n  // one for time within that day, and one for timeZone object since it need\n  // the real time to figure out actual time zone offset.\n  var diff = opt_timeZone ?\n      (date.getTimezoneOffset() - opt_timeZone.getOffset(date)) * 60000 :\n      0;\n  var dateForDate = diff ? new Date(date.getTime() + diff) : date;\n  var dateForTime = dateForDate;\n  // When the time manipulation applied above spans the DST on/off hour, this\n  // could alter the time incorrectly by adding or subtracting an additional\n  // hour.\n  // We can mitigate this by:\n  // - Adding the difference in timezone offset to the date. This ensures that\n  //   the dateForDate is still within the right day if the extra DST hour\n  //   affected the date.\n  // - Move the time one day forward if we applied a timezone offset backwards,\n  //   or vice versa. This trick ensures that the time is in the same offset\n  //   as the original date, so we remove the additional hour added or\n  //   subtracted by the DST switch.\n  if (opt_timeZone &&\n      dateForDate.getTimezoneOffset() != date.getTimezoneOffset()) {\n    var dstDiff =\n        (dateForDate.getTimezoneOffset() - date.getTimezoneOffset()) * 60000;\n    dateForDate = new Date(dateForDate.getTime() + dstDiff);\n\n    diff += diff > 0 ? -goog.date.MS_PER_DAY : goog.date.MS_PER_DAY;\n    dateForTime = new Date(date.getTime() + diff);\n  }\n\n  var out = [];\n  for (var i = 0; i < this.patternParts_.length; ++i) {\n    var text = this.patternParts_[i].text;\n    if (goog.i18n.DateTimeFormat.PartTypes_.FIELD ==\n        this.patternParts_[i].type) {\n      out.push(this.formatField_(\n          text, date, dateForDate, dateForTime, opt_timeZone));\n    } else {\n      out.push(text);\n    }\n  }\n  return out.join('');\n};\n\n\n/**\n * Apply a predefined pattern as identified by formatType, which is stored in\n * locale specific repository.\n * @param {number} formatType A number that identified the predefined pattern.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.applyStandardPattern_ = function(\n    formatType) {\n  var pattern;\n  if (formatType < 4) {\n    pattern = this.dateTimeSymbols_.DATEFORMATS[formatType];\n  } else if (formatType < 8) {\n    pattern = this.dateTimeSymbols_.TIMEFORMATS[formatType - 4];\n  } else if (formatType < 12) {\n    pattern = this.dateTimeSymbols_.DATETIMEFORMATS[formatType - 8];\n    pattern = pattern.replace(\n        '{1}', this.dateTimeSymbols_.DATEFORMATS[formatType - 8]);\n    pattern = pattern.replace(\n        '{0}', this.dateTimeSymbols_.TIMEFORMATS[formatType - 8]);\n  } else {\n    this.applyStandardPattern_(goog.i18n.DateTimeFormat.Format.MEDIUM_DATETIME);\n    return;\n  }\n  this.applyPattern_(pattern);\n};\n\n\n/**\n * Localizes a string potentially containing numbers, replacing ASCII digits\n * with native digits if specified so by the locale. Leaves other characters.\n * @param {string} input the string to be localized, using ASCII digits.\n * @return {string} localized string, potentially using native digits.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.localizeNumbers_ = function(input) {\n  return goog.i18n.DateTimeFormat.localizeNumbers(input, this.dateTimeSymbols_);\n};\n\n\n/**\n * If the usage of Ascii digits should be enforced regardless of locale.\n * @type {boolean}\n * @private\n */\ngoog.i18n.DateTimeFormat.enforceAsciiDigits_ = false;\n\n\n/**\n * If RLM unicode characters should be removed from date/time patterns (useful\n * when enforcing ASCII digits for Arabic). See `#setEnforceAsciiDigits`.\n * @type {boolean}\n * @private\n */\ngoog.i18n.DateTimeFormat.removeRlmInPatterns_ = false;\n\n\n/**\n * Sets if the usage of Ascii digits in formatting should be enforced in\n * formatted date/time even for locales where native digits are indicated.\n * Also sets whether to remove RLM unicode control characters when using\n * standard enumerated patterns (they exist e.g. in standard d/M/y for Arabic).\n * Production code should call this once before any `DateTimeFormat`\n * object is instantiated.\n * Caveats:\n *    * Enforcing ASCII digits affects all future formatting by new or existing\n * `DateTimeFormat` objects.\n *    * Removal of RLM characters only applies to `DateTimeFormat` objects\n * instantiated after this call.\n * @param {boolean} enforceAsciiDigits Whether Ascii digits should be enforced.\n */\ngoog.i18n.DateTimeFormat.setEnforceAsciiDigits = function(enforceAsciiDigits) {\n  goog.i18n.DateTimeFormat.enforceAsciiDigits_ = enforceAsciiDigits;\n\n  // Also setting removal of RLM chracters when forcing ASCII digits since it's\n  // the right thing to do for Arabic standard patterns. One could add an\n  // optional argument here or to the `DateTimeFormat` constructor to\n  // enable an alternative behavior.\n  goog.i18n.DateTimeFormat.removeRlmInPatterns_ = enforceAsciiDigits;\n};\n\n\n/**\n * @return {boolean} Whether enforcing ASCII digits for all locales. See\n *     `#setEnforceAsciiDigits` for more details.\n */\ngoog.i18n.DateTimeFormat.isEnforceAsciiDigits = function() {\n  return goog.i18n.DateTimeFormat.enforceAsciiDigits_;\n};\n\n\n/**\n * Localizes a string potentially containing numbers, replacing ASCII digits\n * with native digits if specified so by the locale. Leaves other characters.\n * @param {number|string} input the string to be localized, using ASCII digits.\n * @param {!Object=} opt_dateTimeSymbols Optional symbols to use rather than\n *     the global symbols.\n * @return {string} localized string, potentially using native digits.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.i18n.DateTimeFormat.localizeNumbers = function(\n    input, opt_dateTimeSymbols) {\n  input = String(input);\n  var dateTimeSymbols = opt_dateTimeSymbols || goog.i18n.DateTimeSymbols;\n  if (dateTimeSymbols.ZERODIGIT === undefined ||\n      goog.i18n.DateTimeFormat.enforceAsciiDigits_) {\n    return input;\n  }\n\n  var parts = [];\n  for (var i = 0; i < input.length; i++) {\n    var c = input.charCodeAt(i);\n    parts.push(\n        (0x30 <= c && c <= 0x39) ?  // '0' <= c <= '9'\n            String.fromCharCode(dateTimeSymbols.ZERODIGIT + c - 0x30) :\n            input.charAt(i));\n  }\n  return parts.join('');\n};\n\n\n/**\n * Formats Era field according to pattern specified.\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} Formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatEra_ = function(count, date) {\n  var value = date.getFullYear() > 0 ? 1 : 0;\n  return count >= 4 ? this.dateTimeSymbols_.ERANAMES[value] :\n                      this.dateTimeSymbols_.ERAS[value];\n};\n\n\n/**\n * Formats Year field according to pattern specified\n *   JavaScript Date object seems incapable handling 1BC and\n *   year before. It can show you year 0 which does not exists.\n *   following we just keep consistent with javascript's\n *   toString method. But keep in mind those things should be\n *   unsupported.\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} Formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatYear_ = function(count, date) {\n  var value = date.getFullYear();\n  if (value < 0) {\n    value = -value;\n  }\n  if (count == 2) {\n    // See comment about special casing 'yy' at the start of the file, this\n    // matches ICU and CLDR behaviour. See also:\n    // http://icu-project.org/apiref/icu4j/com/ibm/icu/text/SimpleDateFormat.html\n    // http://www.unicode.org/reports/tr35/tr35-dates.html\n    value = value % 100;\n  }\n  return this.localizeNumbers_(goog.string.padNumber(value, count));\n};\n\n\n/**\n * Formats Year (Week of Year) field according to pattern specified\n *   JavaScript Date object seems incapable handling 1BC and\n *   year before. It can show you year 0 which does not exists.\n *   following we just keep consistent with javascript's\n *   toString method. But keep in mind those things should be\n *   unsupported.\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} Formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatYearOfWeek_ = function(count, date) {\n  var value = goog.date.getYearOfWeek(\n      date.getFullYear(), date.getMonth(), date.getDate(),\n      this.dateTimeSymbols_.FIRSTWEEKCUTOFFDAY,\n      this.dateTimeSymbols_.FIRSTDAYOFWEEK);\n\n  if (value < 0) {\n    value = -value;\n  }\n  if (count == 2) {\n    // See comment about special casing 'yy' at the start of the file, this\n    // matches ICU and CLDR behaviour. See also:\n    // http://icu-project.org/apiref/icu4j/com/ibm/icu/text/SimpleDateFormat.html\n    // http://www.unicode.org/reports/tr35/tr35-dates.html\n    value = value % 100;\n  }\n  return this.localizeNumbers_(goog.string.padNumber(value, count));\n};\n\n\n/**\n * Formats Month field according to pattern specified\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} Formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatMonth_ = function(count, date) {\n  var value = date.getMonth();\n  switch (count) {\n    case 5:\n      return this.dateTimeSymbols_.NARROWMONTHS[value];\n    case 4:\n      return this.dateTimeSymbols_.MONTHS[value];\n    case 3:\n      return this.dateTimeSymbols_.SHORTMONTHS[value];\n    default:\n      return this.localizeNumbers_(goog.string.padNumber(value + 1, count));\n  }\n};\n\n\n/**\n * Validates is the goog.date.DateLike object to format has a time.\n * DateLike means Date|goog.date.Date, and goog.date.DateTime inherits\n * from goog.date.Date. But goog.date.Date does not have time related\n * members (getHours, getMinutes, getSeconds).\n * Formatting can be done, if there are no time placeholders in the pattern.\n *\n * @param {!goog.date.DateLike} date the object to validate.\n * @private\n */\ngoog.i18n.DateTimeFormat.validateDateHasTime_ = function(date) {\n  if (date.getHours && date.getSeconds && date.getMinutes) return;\n  // if (date instanceof Date || date instanceof goog.date.DateTime)\n  throw new Error(\n      'The date to format has no time (probably a goog.date.Date). ' +\n      'Use Date or goog.date.DateTime, or use a pattern without time fields.');\n};\n\n\n/**\n * Formats (1..24) Hours field according to pattern specified\n *\n * @param {number} count Number of time pattern char repeats. This controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} Formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.format24Hours_ = function(count, date) {\n  goog.i18n.DateTimeFormat.validateDateHasTime_(date);\n  var hours = goog.i18n.DateTimeFormat.getHours_(date) || 24;\n  return this.localizeNumbers_(goog.string.padNumber(hours, count));\n};\n\n\n/**\n * Formats Fractional seconds field according to pattern\n * specified\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n *\n * @return {string} Formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatFractionalSeconds_ = function(\n    count, date) {\n  // Fractional seconds left-justify, append 0 for precision beyond 3\n  var value = date.getMilliseconds() / 1000;\n  return this.localizeNumbers_(\n      value.toFixed(Math.min(3, count)).substr(2) +\n      (count > 3 ? goog.string.padNumber(0, count - 3) : ''));\n};\n\n\n/**\n * Formats Day of week field according to pattern specified\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} Formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatDayOfWeek_ = function(count, date) {\n  var value = date.getDay();\n  return count >= 4 ? this.dateTimeSymbols_.WEEKDAYS[value] :\n                      this.dateTimeSymbols_.SHORTWEEKDAYS[value];\n};\n\n\n/**\n * Formats Am/Pm field according to pattern specified\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} Formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatAmPm_ = function(count, date) {\n  goog.i18n.DateTimeFormat.validateDateHasTime_(date);\n  var hours = goog.i18n.DateTimeFormat.getHours_(date);\n  return this.dateTimeSymbols_.AMPMS[hours >= 12 && hours < 24 ? 1 : 0];\n};\n\n\n/**\n * Formats (1..12) Hours field according to pattern specified\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.format1To12Hours_ = function(count, date) {\n  goog.i18n.DateTimeFormat.validateDateHasTime_(date);\n  var hours = goog.i18n.DateTimeFormat.getHours_(date) % 12 || 12;\n  return this.localizeNumbers_(goog.string.padNumber(hours, count));\n};\n\n\n/**\n * Formats (0..11) Hours field according to pattern specified\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.format0To11Hours_ = function(count, date) {\n  goog.i18n.DateTimeFormat.validateDateHasTime_(date);\n  var hours = goog.i18n.DateTimeFormat.getHours_(date) % 12;\n  return this.localizeNumbers_(goog.string.padNumber(hours, count));\n};\n\n\n/**\n * Formats (0..23) Hours field according to pattern specified\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.format0To23Hours_ = function(count, date) {\n  goog.i18n.DateTimeFormat.validateDateHasTime_(date);\n  var hours = goog.i18n.DateTimeFormat.getHours_(date);\n  return this.localizeNumbers_(goog.string.padNumber(hours, count));\n};\n\n\n/**\n * Formats Standalone weekday field according to pattern specified\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatStandaloneDay_ = function(\n    count, date) {\n  var value = date.getDay();\n  switch (count) {\n    case 5:\n      return this.dateTimeSymbols_.STANDALONENARROWWEEKDAYS[value];\n    case 4:\n      return this.dateTimeSymbols_.STANDALONEWEEKDAYS[value];\n    case 3:\n      return this.dateTimeSymbols_.STANDALONESHORTWEEKDAYS[value];\n    default:\n      return this.localizeNumbers_(goog.string.padNumber(value, 1));\n  }\n};\n\n\n/**\n * Formats Standalone Month field according to pattern specified\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatStandaloneMonth_ = function(\n    count, date) {\n  var value = date.getMonth();\n  switch (count) {\n    case 5:\n      return this.dateTimeSymbols_.STANDALONENARROWMONTHS[value];\n    case 4:\n      return this.dateTimeSymbols_.STANDALONEMONTHS[value];\n    case 3:\n      return this.dateTimeSymbols_.STANDALONESHORTMONTHS[value];\n    default:\n      return this.localizeNumbers_(goog.string.padNumber(value + 1, count));\n  }\n};\n\n\n/**\n * Formats Quarter field according to pattern specified\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} Formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatQuarter_ = function(count, date) {\n  var value = Math.floor(date.getMonth() / 3);\n  return count < 4 ? this.dateTimeSymbols_.SHORTQUARTERS[value] :\n                     this.dateTimeSymbols_.QUARTERS[value];\n};\n\n\n/**\n * Formats Date field according to pattern specified\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} Formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatDate_ = function(count, date) {\n  return this.localizeNumbers_(goog.string.padNumber(date.getDate(), count));\n};\n\n\n/**\n * Formats Minutes field according to pattern specified\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} Formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatMinutes_ = function(count, date) {\n  goog.i18n.DateTimeFormat.validateDateHasTime_(date);\n  return this.localizeNumbers_(goog.string.padNumber(\n      /** @type {!goog.date.DateTime} */ (date).getMinutes(), count));\n};\n\n\n/**\n * Formats Seconds field according to pattern specified\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} Formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatSeconds_ = function(count, date) {\n  goog.i18n.DateTimeFormat.validateDateHasTime_(date);\n  return this.localizeNumbers_(goog.string.padNumber(\n      /** @type {!goog.date.DateTime} */ (date).getSeconds(), count));\n};\n\n\n/**\n * Formats the week of year field according to pattern specified\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @return {string} Formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatWeekOfYear_ = function(count, date) {\n  var weekNum = goog.date.getWeekNumber(\n      date.getFullYear(), date.getMonth(), date.getDate(),\n      this.dateTimeSymbols_.FIRSTWEEKCUTOFFDAY,\n      this.dateTimeSymbols_.FIRSTDAYOFWEEK);\n\n  return this.localizeNumbers_(goog.string.padNumber(weekNum, count));\n};\n\n\n/**\n * Formats TimeZone field following RFC\n *\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date It holds the date object to be formatted.\n * @param {goog.i18n.TimeZone=} opt_timeZone This holds current time zone info.\n * @return {string} Formatted string that represent this field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatTimeZoneRFC_ = function(\n    count, date, opt_timeZone) {\n  opt_timeZone = opt_timeZone ||\n      goog.i18n.TimeZone.createTimeZone(date.getTimezoneOffset());\n\n  // RFC 822 formats should be kept in ASCII, but localized GMT formats may need\n  // to use native digits.\n  return count < 4 ? opt_timeZone.getRFCTimeZoneString(date) :\n                     this.localizeNumbers_(opt_timeZone.getGMTString(date));\n};\n\n\n/**\n * Generate GMT timeZone string for given date\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date Whose value being evaluated.\n * @param {goog.i18n.TimeZone=} opt_timeZone This holds current time zone info.\n * @return {string} GMT timeZone string.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatTimeZone_ = function(\n    count, date, opt_timeZone) {\n  opt_timeZone = opt_timeZone ||\n      goog.i18n.TimeZone.createTimeZone(date.getTimezoneOffset());\n  return count < 4 ? opt_timeZone.getShortName(date) :\n                     opt_timeZone.getLongName(date);\n};\n\n\n/**\n * Generate GMT timeZone string for given date\n * @param {!goog.date.DateLike} date Whose value being evaluated.\n * @param {goog.i18n.TimeZone=} opt_timeZone This holds current time zone info.\n * @return {string} GMT timeZone string.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatTimeZoneId_ = function(\n    date, opt_timeZone) {\n  opt_timeZone = opt_timeZone ||\n      goog.i18n.TimeZone.createTimeZone(date.getTimezoneOffset());\n  return opt_timeZone.getTimeZoneId();\n};\n\n\n/**\n * Generate localized, location dependent time zone id\n * @param {number} count Number of time pattern char repeats, it controls\n *     how a field should be formatted.\n * @param {!goog.date.DateLike} date Whose value being evaluated.\n * @param {goog.i18n.TimeZone=} opt_timeZone This holds current time zone info.\n * @return {string} GMT timeZone string.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatTimeZoneLocationId_ = function(\n    count, date, opt_timeZone) {\n  opt_timeZone = opt_timeZone ||\n      goog.i18n.TimeZone.createTimeZone(date.getTimezoneOffset());\n  return count <= 2 ? opt_timeZone.getTimeZoneId() :\n                      opt_timeZone.getGenericLocation(date);\n};\n\n\n/**\n * Formatting one date field.\n * @param {string} patternStr The pattern string for the field being formatted.\n * @param {!goog.date.DateLike} date represents the real date to be formatted.\n * @param {!goog.date.DateLike} dateForDate used to resolve date fields\n *     for formatting.\n * @param {!goog.date.DateLike} dateForTime used to resolve time fields\n *     for formatting.\n * @param {goog.i18n.TimeZone=} opt_timeZone This holds current time zone info.\n * @return {string} string representation for the given field.\n * @private\n */\ngoog.i18n.DateTimeFormat.prototype.formatField_ = function(\n    patternStr, date, dateForDate, dateForTime, opt_timeZone) {\n  var count = patternStr.length;\n  switch (patternStr.charAt(0)) {\n    case 'G':\n      return this.formatEra_(count, dateForDate);\n    case 'y':\n      return this.formatYear_(count, dateForDate);\n    case 'Y':\n      return this.formatYearOfWeek_(count, dateForDate);\n    case 'M':\n      return this.formatMonth_(count, dateForDate);\n    case 'k':\n      return this.format24Hours_(count, dateForTime);\n    case 'S':\n      return this.formatFractionalSeconds_(count, dateForTime);\n    case 'E':\n      return this.formatDayOfWeek_(count, dateForDate);\n    case 'a':\n      return this.formatAmPm_(count, dateForTime);\n    case 'h':\n      return this.format1To12Hours_(count, dateForTime);\n    case 'K':\n      return this.format0To11Hours_(count, dateForTime);\n    case 'H':\n      return this.format0To23Hours_(count, dateForTime);\n    case 'c':\n      return this.formatStandaloneDay_(count, dateForDate);\n    case 'L':\n      return this.formatStandaloneMonth_(count, dateForDate);\n    case 'Q':\n      return this.formatQuarter_(count, dateForDate);\n    case 'd':\n      return this.formatDate_(count, dateForDate);\n    case 'm':\n      return this.formatMinutes_(count, dateForTime);\n    case 's':\n      return this.formatSeconds_(count, dateForTime);\n    case 'v':\n      return this.formatTimeZoneId_(date, opt_timeZone);\n    case 'V':\n      return this.formatTimeZoneLocationId_(count, date, opt_timeZone);\n    case 'w':\n      return this.formatWeekOfYear_(count, dateForTime);\n    case 'z':\n      return this.formatTimeZone_(count, date, opt_timeZone);\n    case 'Z':\n      return this.formatTimeZoneRFC_(count, date, opt_timeZone);\n    default:\n      return '';\n  }\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","^K7","^IT","~$goog.i18n.TimeZone","~$goog.i18n.DateTimeSymbols","~$goog.date"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/datetimeformat.js"],"^JD",["^J4",["~$goog.i18n.DateTimeFormat","~$goog.i18n.DateTimeFormat.Format"]],"^IR",true,"^IS",["^IT","^JF","^KJ","^KI","^KH","^K7"]],["^ ","^IV",[1579837703000],"^IW","goog.module.testdata.modA_2.js","^IX",["^IY","goog/module/testdata/modA_2.js"],"^IZ","goog/module/testdata/modA_2.js","^I[","^J0","^J1","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved\n\n/**\n * @fileoverview File #2 of module A.\n */\n\ngoog.provide('goog.module.testdata.modA_2');\n\ngoog.setTestOnly('goog.module.testdata.modA_2');\n\ngoog.require('goog.module.ModuleManager');\n\ngoog.module.ModuleManager.getInstance().beforeLoadModuleCode('modA');\n\nif (window.modA2Loaded) throw new Error('modA_2 loaded twice');\nwindow.modA2Loaded = true;\n\ngoog.module.ModuleManager.getInstance().setLoaded();\n","^J2",1579837703000,"^J3",["^J4",["~$goog.module.ModuleManager","^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/module/testdata/modA_2.js"],"^JD",["^J4",["~$goog.module.testdata.modA-2","~$goog.module.testdata.modA_2"]],"^IR",true,"^IS",["^IT","^KM"]],["^ ","^IV",[1579837703000],"^IW","goog.ui.checkboxrenderer.js","^IX",["^IY","goog/ui/checkboxrenderer.js"],"^IZ","goog/ui/checkboxrenderer.js","^I[","^J0","^J1","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Default renderer for {@link goog.ui.Checkbox}s.\n *\n */\n\ngoog.provide('goog.ui.CheckboxRenderer');\n\ngoog.forwardDeclare('goog.ui.Checkbox.State');\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.object');\ngoog.require('goog.ui.ControlRenderer');\n\n\n\n/**\n * Default renderer for {@link goog.ui.Checkbox}s.  Extends the superclass\n * to support checkbox states:\n * @constructor\n * @extends {goog.ui.ControlRenderer}\n */\ngoog.ui.CheckboxRenderer = function() {\n  goog.ui.CheckboxRenderer.base(this, 'constructor');\n};\ngoog.inherits(goog.ui.CheckboxRenderer, goog.ui.ControlRenderer);\ngoog.addSingletonGetter(goog.ui.CheckboxRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.CheckboxRenderer.CSS_CLASS = goog.getCssName('goog-checkbox');\n\n\n/** @override */\ngoog.ui.CheckboxRenderer.prototype.createDom = function(checkbox) {\n  var element = checkbox.getDomHelper().createDom(\n      goog.dom.TagName.SPAN, this.getClassNames(checkbox).join(' '));\n\n  var state = checkbox.getChecked();\n  this.setCheckboxState(element, state);\n\n  return element;\n};\n\n\n/** @override */\ngoog.ui.CheckboxRenderer.prototype.decorate = function(checkbox, element) {\n  // The superclass implementation takes care of common attributes; we only\n  // need to set the checkbox state.\n  element = goog.ui.CheckboxRenderer.base(this, 'decorate', checkbox, element);\n  goog.asserts.assert(element);\n  var classes = goog.dom.classlist.get(element);\n  // Update the checked state of the element based on its css classNames\n  // with the following order: undetermined -> checked -> unchecked.\n  var checked =\n      /** @suppress {missingRequire} */ (goog.ui.Checkbox.State.UNCHECKED);\n  if (goog.array.contains(\n          classes, this.getClassForCheckboxState(\n                       /** @suppress {missingRequire} */\n                       goog.ui.Checkbox.State.UNDETERMINED))) {\n    checked =\n        (/** @suppress {missingRequire} */\n         goog.ui.Checkbox.State.UNDETERMINED);\n  } else if (\n      goog.array.contains(\n          classes, this.getClassForCheckboxState(\n                       /** @suppress {missingRequire} */ goog.ui.Checkbox.State\n                           .CHECKED))) {\n    checked = /** @suppress {missingRequire} */ goog.ui.Checkbox.State.CHECKED;\n  } else if (goog.array.contains(classes,\n      this.getClassForCheckboxState(/** @suppress {missingRequire} */\n          goog.ui.Checkbox.State.UNCHECKED))) {\n    checked =\n        (/** @suppress {missingRequire} */\n         goog.ui.Checkbox.State.UNCHECKED);\n  }\n  checkbox.setCheckedInternal(checked);\n  goog.asserts.assert(element, 'The element cannot be null.');\n  goog.a11y.aria.setState(\n      element, goog.a11y.aria.State.CHECKED,\n      this.ariaStateFromCheckState_(checked));\n\n  return element;\n};\n\n\n/**\n * Returns the ARIA role to be applied to checkboxes.\n * @return {goog.a11y.aria.Role} ARIA role.\n * @override\n */\ngoog.ui.CheckboxRenderer.prototype.getAriaRole = function() {\n  return goog.a11y.aria.Role.CHECKBOX;\n};\n\n\n/**\n * Updates the appearance of the control in response to a checkbox state\n * change.\n * @param {Element} element Checkbox element.\n * @param {goog.ui.Checkbox.State} state Updated checkbox state.\n */\ngoog.ui.CheckboxRenderer.prototype.setCheckboxState = function(element, state) {\n  if (element) {\n    goog.asserts.assert(element);\n    var classToAdd = this.getClassForCheckboxState(state);\n    goog.asserts.assert(classToAdd);\n    goog.asserts.assert(element);\n    if (goog.dom.classlist.contains(element, classToAdd)) {\n      return;\n    }\n    goog.object.forEach(\n        /** @suppress {missingRequire} */ goog.ui.Checkbox.State,\n        function(state) {\n          var className = this.getClassForCheckboxState(state);\n          goog.asserts.assert(element);\n          goog.dom.classlist.enable(\n              element, className, className == classToAdd);\n        },\n        this);\n    goog.a11y.aria.setState(\n        element, goog.a11y.aria.State.CHECKED,\n        this.ariaStateFromCheckState_(state));\n  }\n};\n\n\n/**\n * Gets the checkbox's ARIA (accessibility) state from its checked state.\n * @param {goog.ui.Checkbox.State} state Checkbox state.\n * @return {string} The value of goog.a11y.aria.state.CHECKED. Either 'true',\n *     'false', or 'mixed'.\n * @private\n */\ngoog.ui.CheckboxRenderer.prototype.ariaStateFromCheckState_ = function(state) {\n  if (state ==\n      /** @suppress {missingRequire} */ goog.ui.Checkbox.State.UNDETERMINED) {\n    return 'mixed';\n  } else if (\n      state ==\n      /** @suppress {missingRequire} */ goog.ui.Checkbox.State.CHECKED) {\n    return 'true';\n  } else {\n    return 'false';\n  }\n};\n\n\n/** @override */\ngoog.ui.CheckboxRenderer.prototype.getCssClass = function() {\n  return goog.ui.CheckboxRenderer.CSS_CLASS;\n};\n\n\n/**\n * Takes a single {@link goog.ui.Checkbox.State}, and returns the\n * corresponding CSS class name.\n * @param {goog.ui.Checkbox.State} state Checkbox state.\n * @return {string} CSS class representing the given state.\n * @protected\n * @suppress {missingRequire} goog.ui.Checkbox\n */\ngoog.ui.CheckboxRenderer.prototype.getClassForCheckboxState = function(state) {\n  var baseClass = this.getStructuralCssClass();\n  if (state == goog.ui.Checkbox.State.CHECKED) {\n    return goog.getCssName(baseClass, 'checked');\n  } else if (state == goog.ui.Checkbox.State.UNCHECKED) {\n    return goog.getCssName(baseClass, 'unchecked');\n  } else if (state == goog.ui.Checkbox.State.UNDETERMINED) {\n    return goog.getCssName(baseClass, 'undetermined');\n  }\n  throw new Error('Invalid checkbox state: ' + state);\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","~$goog.dom.classlist","~$goog.a11y.aria","~$goog.a11y.aria.Role","^IT","~$goog.object","~$goog.ui.ControlRenderer","~$goog.a11y.aria.State","^JJ","^JT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/checkboxrenderer.js"],"^JD",["^J4",["~$goog.ui.CheckboxRenderer"]],"^IR",true,"^IS",["^IT","^KQ","^KR","^KU","^JJ","^JF","^JT","^KP","^KS","^KT"]],["^ ","^IV",[1579837703000],"^IW","goog.net.testdata.jsloader_test3.js","^IX",["^IY","goog/net/testdata/jsloader_test3.js"],"^IZ","goog/net/testdata/jsloader_test3.js","^I[","^J0","^J1","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n// All Rights Reserved\n\n/**\n * @fileoverview Test #3 of jsloader.\n */\n\ngoog.provide('goog.net.testdata.jsloader_test3');\ngoog.setTestOnly('jsloader_test3');\n\nwindow['test3Callback']('Test #3 loaded');\n","^J2",1579837703000,"^J3",["^J4",["^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/testdata/jsloader_test3.js"],"^JD",["^J4",["~$goog.net.testdata.jsloader-test3","~$goog.net.testdata.jsloader_test3"]],"^IR",true,"^IS",["^IT"]],["^ ","~:js-str-offsets",[],"~:classpath",true,"~:js-esm",true,"^IV",[1579837703000],"~:js-imports",[],"~:js-invalid-requires",[],"~:goog-provides",[],"~:js-language","es6","~:goog-module",null,"~:ns","~$module$goog$goog","^IW","module$goog$goog.js","^IX",["^IY","goog/goog.js"],"^IZ","goog/goog.js","^I[","~:js","~:js-requires",[],"^J1","// Copyright 2018 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview ES6 module that exports symbols from base.js so that ES6\n * modules do not need to use globals and so that is clear if a project is using\n * Closure's base.js file. It is also a subset of properties in base.js, meaning\n * it should be clearer what should not be used in ES6 modules\n * (goog.module/provide are not exported here, for example). Though that is not\n * to say that everything in this file should be used in an ES6 module; some\n * depreciated functions are exported to make migration easier (e.g.\n * goog.scope).\n *\n * Note that this does not load Closure's base.js file, it is still up to the\n * programmer to include it. Nor does the fact that this is an ES6 module mean\n * that projects no longer require deps.js files for debug loading - they do.\n * Closure will need to load your ES6 modules for you if you have any Closure\n * file (goog.provide/goog.module) dependencies, as they need to be available\n * before the ES6 module evaluates.\n *\n * Also note that this file has special compiler handling! It is okay to export\n * anything from this file, but the name also needs to exist on the global goog.\n * This special compiler pass enforces that you always import this file as\n * `import * as goog`, as many tools use regex based parsing to find\n * goog.require calls.\n */\n\nexport const global = goog.global;\nexport const require = goog.require;\nexport const isString = goog.isString;\nexport const isBoolean = goog.isBoolean;\nexport const isNumber = goog.isNumber;\nexport const define = goog.define;\nexport const DEBUG = goog.DEBUG;\nexport const LOCALE = goog.LOCALE;\nexport const TRUSTED_SITE = goog.TRUSTED_SITE;\nexport const STRICT_MODE_COMPATIBLE = goog.STRICT_MODE_COMPATIBLE;\nexport const DISALLOW_TEST_ONLY_CODE = goog.DISALLOW_TEST_ONLY_CODE;\nexport const getGoogModule = goog.module.get;\nexport const setTestOnly = goog.setTestOnly;\nexport const forwardDeclare = goog.forwardDeclare;\nexport const getObjectByName = goog.getObjectByName;\nexport const basePath = goog.basePath;\nexport const addSingletonGetter = goog.addSingletonGetter;\nexport const typeOf = goog.typeOf;\nexport const isArray = goog.isArray;\nexport const isArrayLike = goog.isArrayLike;\nexport const isDateLike = goog.isDateLike;\nexport const isFunction = goog.isFunction;\nexport const isObject = goog.isObject;\nexport const getUid = goog.getUid;\nexport const hasUid = goog.hasUid;\nexport const removeUid = goog.removeUid;\nexport const mixin = goog.mixin;\nexport const now = goog.now;\nexport const globalEval = goog.globalEval;\nexport const getCssName = goog.getCssName;\nexport const setCssNameMapping = goog.setCssNameMapping;\nexport const getMsg = goog.getMsg;\nexport const getMsgWithFallback = goog.getMsgWithFallback;\nexport const exportSymbol = goog.exportSymbol;\nexport const exportProperty = goog.exportProperty;\nexport const isDef = goog.isDef;\nexport const isNull = goog.isNull;\nexport const isDefAndNotNull = goog.isDefAndNotNull;\nexport const globalize = goog.globalize;\nexport const nullFunction = goog.nullFunction;\nexport const abstractMethod = goog.abstractMethod;\nexport const removeHashCode = goog.removeHashCode;\nexport const getHashCode = goog.getHashCode;\nexport const cloneObject = goog.cloneObject;\nexport const bind = goog.bind;\nexport const partial = goog.partial;\nexport const inherits = goog.inherits;\nexport const base = goog.base;\nexport const scope = goog.scope;\nexport const defineClass = goog.defineClass;\nexport const declareModuleId = goog.declareModuleId;\n\n// Export select properties of module. Do not export the function itself or\n// goog.module.declareLegacyNamespace.\nexport const module = {\n  get: goog.module.get,\n};\n\n// Omissions include:\n// goog.ENABLE_DEBUG_LOADER - define only used in base.\n// goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING - define only used in base.\n// goog.provide - ES6 modules do not provide anything.\n// goog.module - ES6 modules cannot be goog.modules.\n// goog.module.declareLegacyNamespace - ES6 modules cannot declare namespaces.\n// goog.addDependency - meant to only be used by dependency files.\n// goog.DEPENDENCIES_ENABLED - constant only used in base.\n// goog.TRANSPILE - define only used in base.\n// goog.TRANSPILER - define only used in base.\n// goog.loadModule - should not be called by any ES6 module; exists for\n//   generated bundles.\n// goog.LOAD_MODULE_USING_EVAL - define only used in base.\n// goog.SEAL_MODULE_EXPORTS - define only used in base.\n// goog.DebugLoader - used rarely, only outside of compiled code.\n// goog.Transpiler - used rarely, only outside of compiled code.\n","^J2",1579837703000,"^J3",["^J4",[]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"~:goog-requires",[],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/goog.js"],"^JD",["^J4",["^L6"]],"~:uses-global-buffer",false,"^IR",true,"^IS",[],"~:uses-global-process",false],["^ ","^IV",[1579837703000],"^IW","goog.proto2.lazydeserializer.js","^IX",["^IY","goog/proto2/lazydeserializer.js"],"^IZ","goog/proto2/lazydeserializer.js","^I[","^J0","^J1","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Base class for all PB2 lazy deserializer. A lazy deserializer\n *   is a serializer whose deserialization occurs on the fly as data is\n *   requested. In order to use a lazy deserializer, the serialized form\n *   of the data must be an object or array that can be indexed by the tag\n *   number.\n *\n */\n\ngoog.provide('goog.proto2.LazyDeserializer');\n\ngoog.require('goog.asserts');\ngoog.require('goog.proto2.Message');\ngoog.require('goog.proto2.Serializer');\n\n\n\n/**\n * Base class for all lazy deserializers.\n *\n * @constructor\n * @extends {goog.proto2.Serializer}\n */\ngoog.proto2.LazyDeserializer = function() {};\ngoog.inherits(goog.proto2.LazyDeserializer, goog.proto2.Serializer);\n\n\n/** @override */\ngoog.proto2.LazyDeserializer.prototype.deserialize = function(\n    descriptor, data) {\n  var message = descriptor.createMessageInstance();\n  message.initializeForLazyDeserializer(this, data);\n  goog.asserts.assert(message instanceof goog.proto2.Message);\n  return message;\n};\n\n\n/** @override */\ngoog.proto2.LazyDeserializer.prototype.deserializeTo = function(message, data) {\n  throw new Error('Unimplemented');\n};\n\n\n/**\n * Deserializes a message field from the expected format and places the\n * data in the given message\n *\n * @param {goog.proto2.Message} message The message in which to\n *     place the information.\n * @param {goog.proto2.FieldDescriptor} field The field for which to set the\n *     message value.\n * @param {*} data The serialized data for the field.\n *\n * @return {*} The deserialized data or null for no value found.\n */\ngoog.proto2.LazyDeserializer.prototype.deserializeField = goog.abstractMethod;\n","^J2",1579837703000,"^J3",["^J4",["^JF","~$goog.proto2.Serializer","^IT","~$goog.proto2.Message"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/proto2/lazydeserializer.js"],"^JD",["^J4",["~$goog.proto2.LazyDeserializer"]],"^IR",true,"^IS",["^IT","^JF","^L=","^L<"]],["^ ","^IV",[1579837703000],"^L4",true,"^IW","goog.loader.activemodulemanager.js","^IX",["^IY","goog/loader/activemodulemanager.js"],"^IZ","goog/loader/activemodulemanager.js","^I[","^J0","^J1","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A singleton interface for managing JavaScript code modules.\n */\n\ngoog.module('goog.loader.activeModuleManager');\ngoog.module.declareLegacyNamespace();\n\nconst AbstractModuleManager = goog.require('goog.loader.AbstractModuleManager');\nconst asserts = goog.require('goog.asserts');\n\n\n/** @type {?AbstractModuleManager} */\nlet moduleManager = null;\n\n/** @type {?function(): !AbstractModuleManager} */\nlet getDefault = null;\n\n/**\n * Gets the active module manager, instantiating one if necessary.\n * @return {!AbstractModuleManager}\n */\nfunction get() {\n  if (!moduleManager && getDefault) {\n    moduleManager = getDefault();\n  }\n  asserts.assert(\n      moduleManager != null, 'The module manager has not yet been set.');\n  return moduleManager;\n}\n\n/**\n * Sets the active module manager. This should never be used to override an\n * existing manager.\n *\n * @param {!AbstractModuleManager} newModuleManager\n */\nfunction set(newModuleManager) {\n  asserts.assert(\n      moduleManager == null, 'The module manager cannot be redefined.');\n  moduleManager = newModuleManager;\n}\n\n/**\n * Stores a callback that will be used  to get an AbstractModuleManager instance\n * if set() is not called before the first get() call.\n * @param {function(): !AbstractModuleManager} fn\n */\nfunction setDefault(fn) {\n  getDefault = fn;\n}\n\n/** Test-only method for removing the active module manager. */\nconst reset = function() {\n  moduleManager = null;\n};\n\nexports = {\n  get,\n  set,\n  setDefault,\n  reset,\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","~$goog.loader.AbstractModuleManager","^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/loader/activemodulemanager.js"],"^JD",["^J4",["~$goog.loader.activeModuleManager"]],"^IR",true,"^IS",["^IT","^L?","^JF"]],["^ ","^IV",[1579837703000],"^IW","goog.labs.testing.decoratormatcher.js","^IX",["^IY","goog/labs/testing/decoratormatcher.js"],"^IZ","goog/labs/testing/decoratormatcher.js","^I[","^J0","^J1","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides the built-in decorators: is, describedAs, anything.\n */\n\ngoog.provide('goog.labs.testing.AnythingMatcher');\n\ngoog.require('goog.labs.testing.Matcher');\n\n\n/**\n * The Anything matcher. Matches all possible inputs.\n *\n * @constructor\n * @implements {goog.labs.testing.Matcher}\n * @final\n */\ngoog.labs.testing.AnythingMatcher = function() {};\n\n\n/**\n * Matches anything. Useful if one doesn't care what the object under test is.\n *\n * @override\n */\ngoog.labs.testing.AnythingMatcher.prototype.matches = function(actualObject) {\n  return true;\n};\n\n\n/**\n * This method is never called but is needed so AnythingMatcher implements the\n * Matcher interface.\n *\n * @override\n */\ngoog.labs.testing.AnythingMatcher.prototype.describe = function(actualObject) {\n  throw new Error('AnythingMatcher should never fail!');\n};\n\n\n/**\n * Returns a matcher that matches anything.\n *\n * @return {!goog.labs.testing.AnythingMatcher} A AnythingMatcher.\n */\nvar anything = goog.labs.testing.AnythingMatcher.anything = function() {\n  return new goog.labs.testing.AnythingMatcher();\n};\n\n\n/**\n * Returns any matcher that is passed to it (aids readability).\n *\n * @param {!goog.labs.testing.Matcher} matcher A matcher.\n * @return {!goog.labs.testing.Matcher} The wrapped matcher.\n */\nvar is = goog.labs.testing.AnythingMatcher.is = function(matcher) {\n  return matcher;\n};\n\n\n/**\n * Returns a matcher with a customized description for the given matcher.\n *\n * @param {string} description The custom description for the matcher.\n * @param {!goog.labs.testing.Matcher} matcher The matcher.\n * @return {!goog.labs.testing.Matcher} The matcher with custom description.\n */\nvar describedAs = goog.labs.testing.AnythingMatcher.describedAs = function(\n    description, matcher) {\n  return /** @type {!goog.labs.testing.Matcher} */ ({\n    matches: function(value) {\n      return matcher.matches(value);\n    },\n    describe: function() {\n      return description;\n    }\n  });\n};\n","^J2",1579837703000,"^J3",["^J4",["~$goog.labs.testing.Matcher","^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/testing/decoratormatcher.js"],"^JD",["^J4",["~$goog.labs.testing.AnythingMatcher"]],"^IR",true,"^IS",["^IT","^LA"]],["^ ","^IV",[1579837703000],"^IW","goog.ui.tabrenderer.js","^IX",["^IY","goog/ui/tabrenderer.js"],"^IZ","goog/ui/tabrenderer.js","^I[","^J0","^J1","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Default renderer for {@link goog.ui.Tab}s.  Based on the\n * original `TabPane` code.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.TabRenderer');\n\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.ControlRenderer');\n\n\n\n/**\n * Default renderer for {@link goog.ui.Tab}s, based on the `TabPane` code.\n * @constructor\n * @extends {goog.ui.ControlRenderer}\n */\ngoog.ui.TabRenderer = function() {\n  goog.ui.ControlRenderer.call(this);\n};\ngoog.inherits(goog.ui.TabRenderer, goog.ui.ControlRenderer);\ngoog.addSingletonGetter(goog.ui.TabRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.TabRenderer.CSS_CLASS = goog.getCssName('goog-tab');\n\n\n/**\n * Returns the CSS class name to be applied to the root element of all tabs\n * rendered or decorated using this renderer.\n * @return {string} Renderer-specific CSS class name.\n * @override\n */\ngoog.ui.TabRenderer.prototype.getCssClass = function() {\n  return goog.ui.TabRenderer.CSS_CLASS;\n};\n\n\n/**\n * Returns the ARIA role to be applied to the tab element.\n * See http://wiki/Main/ARIA for more info.\n * @return {goog.a11y.aria.Role} ARIA role.\n * @override\n */\ngoog.ui.TabRenderer.prototype.getAriaRole = function() {\n  return goog.a11y.aria.Role.TAB;\n};\n\n\n/**\n * Returns the tab's contents wrapped in a DIV, with the renderer's own CSS\n * class and additional state-specific classes applied to it.  Creates the\n * following DOM structure:\n *\n *    <div class=\"goog-tab\" title=\"Title\">Content</div>\n *\n * @param {goog.ui.Control} tab Tab to render.\n * @return {Element} Root element for the tab.\n * @override\n */\ngoog.ui.TabRenderer.prototype.createDom = function(tab) {\n  var element = goog.ui.TabRenderer.superClass_.createDom.call(this, tab);\n\n  var tooltip = tab.getTooltip();\n  if (tooltip) {\n    // Only update the element if the tab has a tooltip.\n    this.setTooltip(element, tooltip);\n  }\n\n  return element;\n};\n\n\n/**\n * Decorates the element with the tab.  Initializes the tab's ID, content,\n * tooltip, and state based on the ID of the element, its title, child nodes,\n * and CSS classes, respectively.  Returns the element.\n * @param {goog.ui.Control} tab Tab to decorate the element.\n * @param {Element} element Element to decorate.\n * @return {Element} Decorated element.\n * @override\n */\ngoog.ui.TabRenderer.prototype.decorate = function(tab, element) {\n  element = goog.ui.TabRenderer.superClass_.decorate.call(this, tab, element);\n\n  var tooltip = this.getTooltip(element);\n  if (tooltip) {\n    // Only update the tab if the element has a tooltip.\n    tab.setTooltipInternal(tooltip);\n  }\n\n  // If the tab is selected and hosted in a tab bar, update the tab bar's\n  // selection model.\n  if (tab.isSelected()) {\n    var tabBar = tab.getParent();\n    if (tabBar && goog.isFunction(tabBar.setSelectedTab)) {\n      // We need to temporarily deselect the tab, so the tab bar can re-select\n      // it and thereby correctly initialize its state.  We use the protected\n      // setState() method to avoid dispatching useless events.\n      tab.setState(goog.ui.Component.State.SELECTED, false);\n      tabBar.setSelectedTab(tab);\n    }\n  }\n\n  return element;\n};\n\n\n/**\n * Takes a tab's root element, and returns its tooltip text, or the empty\n * string if the element has no tooltip.\n * @param {Element} element The tab's root element.\n * @return {string} The tooltip text (empty string if none).\n */\ngoog.ui.TabRenderer.prototype.getTooltip = function(element) {\n  return element.title || '';\n};\n\n\n/**\n * Takes a tab's root element and a tooltip string, and updates the element\n * with the new tooltip.  If the new tooltip is null or undefined, sets the\n * element's title to the empty string.\n * @param {Element} element The tab's root element.\n * @param {string|null|undefined} tooltip New tooltip text (if any).\n */\ngoog.ui.TabRenderer.prototype.setTooltip = function(element, tooltip) {\n  if (element) {\n    element.title = tooltip || '';\n  }\n};\n","^J2",1579837703000,"^J3",["^J4",["~$goog.ui.Component","^KR","^IT","^KT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/tabrenderer.js"],"^JD",["^J4",["~$goog.ui.TabRenderer"]],"^IR",true,"^IS",["^IT","^KR","^LC","^KT"]],["^ ","^IV",[1579837703000],"^IW","goog.testing.mockinterface.js","^IX",["^IY","goog/testing/mockinterface.js"],"^IZ","goog/testing/mockinterface.js","^I[","^J0","^J1","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview An interface that all mocks should share.\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.setTestOnly('goog.testing.MockInterface');\ngoog.provide('goog.testing.MockInterface');\n\ngoog.require('goog.Promise');\n\n\n\n/** @interface */\ngoog.testing.MockInterface = function() {};\n\n\n/**\n * Write down all the expected functions that have been called on the\n * mock so far. From here on out, future function calls will be\n * compared against this list.\n */\ngoog.testing.MockInterface.prototype.$replay = function() {};\n\n\n/**\n * Reset the mock.\n */\ngoog.testing.MockInterface.prototype.$reset = function() {};\n\n\n/**\n * Waits for the Mock to gather expectations and then performs verify.\n * @return {!goog.Promise<undefined>}\n */\ngoog.testing.MockInterface.prototype.$waitAndVerify = function() {};\n\n\n/**\n * Assert that the expected function calls match the actual calls.\n */\ngoog.testing.MockInterface.prototype.$verify = function() {};\n","^J2",1579837703000,"^J3",["^J4",["^IT","~$goog.Promise"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/mockinterface.js"],"^JD",["^J4",["~$goog.testing.MockInterface"]],"^IR",true,"^IS",["^IT","^LE"]],["^ ","^IV",[1579837703000],"^IW","goog.datasource.datasource.js","^IX",["^IY","goog/datasource/datasource.js"],"^IZ","goog/datasource/datasource.js","^I[","^J0","^J1","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Generic rich data access API.\n *\n * Abstraction for data sources that allows listening for changes at different\n * levels of the data tree and updating the data via XHR requests\n *\n */\n\n\ngoog.provide('goog.ds.BaseDataNode');\ngoog.provide('goog.ds.BasicNodeList');\ngoog.provide('goog.ds.DataNode');\ngoog.provide('goog.ds.DataNodeList');\ngoog.provide('goog.ds.EmptyNodeList');\ngoog.provide('goog.ds.LoadState');\ngoog.provide('goog.ds.SortedNodeList');\ngoog.provide('goog.ds.Util');\ngoog.provide('goog.ds.logger');\n\ngoog.require('goog.array');\ngoog.require('goog.log');\n\n\n\n/**\n * Interface for node in rich data tree.\n *\n * Names that are reserved for system use and shouldn't be used for data node\n * names: eval, toSource, toString, unwatch, valueOf, watch. Behavior is\n * undefined if these names are used.\n *\n * @constructor\n */\ngoog.ds.DataNode = function() {};\n\n\n/**\n * Get the value of the node\n * @param {...?} var_args Do not check arity of arguments, because\n *     some subclasses require args.\n * @return {*} The value of the node, or null if no value.\n */\ngoog.ds.DataNode.prototype.get = goog.abstractMethod;\n\n\n/**\n * Set the value of the node\n * @param {*} value The new value of the node.\n */\ngoog.ds.DataNode.prototype.set = goog.abstractMethod;\n\n\n/**\n * Gets all of the child nodes of the current node.\n * Should return an empty DataNode list if no child nodes.\n * @param {string=} opt_selector String selector to choose child nodes.\n * @return {!goog.ds.DataNodeList} The child nodes.\n */\ngoog.ds.DataNode.prototype.getChildNodes = goog.abstractMethod;\n\n\n/**\n * Gets a named child node of the current node\n * @param {string} name The node name.\n * @param {boolean=} opt_canCreate Whether to create a child node if it does not\n *     exist.\n * @return {goog.ds.DataNode} The child node, or null\n * if no node of this name exists.\n */\ngoog.ds.DataNode.prototype.getChildNode = goog.abstractMethod;\n\n\n/**\n * Gets the value of a child node\n * @param {string} name The node name.\n * @return {*} The value of the node, or null if no value or the child node\n *     doesn't exist.\n */\ngoog.ds.DataNode.prototype.getChildNodeValue = goog.abstractMethod;\n\n\n/**\n * Sets a named child node of the current node.\n *\n * @param {string} name The node name.\n * @param {Object} value The value to set, can be DataNode, object, property,\n *     or null. If value is null, removes the child node.\n * @return {Object} The child node, if the node was set.\n */\ngoog.ds.DataNode.prototype.setChildNode = goog.abstractMethod;\n\n\n/**\n * Get the name of the node relative to the parent node\n * @return {string} The name of the node.\n */\ngoog.ds.DataNode.prototype.getDataName = goog.abstractMethod;\n\n\n/**\n * Set the name of the node relative to the parent node\n * @param {string} name The name of the node.\n */\ngoog.ds.DataNode.prototype.setDataName = goog.abstractMethod;\n\n\n/**\n * Gets the a qualified data path to this node\n * @return {string} The data path.\n */\ngoog.ds.DataNode.prototype.getDataPath = goog.abstractMethod;\n\n\n/**\n * Load or reload the backing data for this node\n */\ngoog.ds.DataNode.prototype.load = goog.abstractMethod;\n\n\n/**\n * Gets the state of the backing data for this node\n * @return {goog.ds.LoadState} The state.\n */\ngoog.ds.DataNode.prototype.getLoadState = goog.abstractMethod;\n\n\n/**\n * Whether the value of this node is a homogeneous list of data\n * @return {boolean} True if a list.\n */\ngoog.ds.DataNode.prototype.isList = goog.abstractMethod;\n\n\n/**\n * Enum for load state of a DataNode.\n * @enum {string}\n */\ngoog.ds.LoadState = {\n  LOADED: 'LOADED',\n  LOADING: 'LOADING',\n  FAILED: 'FAILED',\n  NOT_LOADED: 'NOT_LOADED'\n};\n\n\n\n/**\n * Base class for data node functionality, has default implementations for\n * many of the functions.\n *\n * implements {goog.ds.DataNode}\n * @constructor\n */\ngoog.ds.BaseDataNode = function() {};\n\n\n/**\n * Set the value of the node\n * @param {Object} value The new value of the node.\n */\ngoog.ds.BaseDataNode.prototype.set = goog.abstractMethod;\n\n\n/**\n * Gets all of the child nodes of the current node.\n * Should return an empty DataNode list if no child nodes.\n * @param {string=} opt_selector String selector to choose child nodes.\n * @return {!goog.ds.DataNodeList} The child nodes.\n */\ngoog.ds.BaseDataNode.prototype.getChildNodes = function(opt_selector) {\n  return new goog.ds.EmptyNodeList();\n};\n\n\n/**\n * Gets a named child node of the current node\n * @param {string} name The node name.\n * @param {boolean=} opt_canCreate Whether you can create the child node if\n *     it doesn't exist already.\n * @return {goog.ds.DataNode} The child node, or null if no node of\n *     this name exists and opt_create is false.\n */\ngoog.ds.BaseDataNode.prototype.getChildNode = function(name, opt_canCreate) {\n  return null;\n};\n\n\n/**\n * Gets the value of a child node\n * @param {string} name The node name.\n * @return {Object} The value of the node, or null if no value or the\n *     child node doesn't exist.\n */\ngoog.ds.BaseDataNode.prototype.getChildNodeValue = function(name) {\n  return null;\n};\n\n\n/**\n * Get the name of the node relative to the parent node\n * @return {string} The name of the node.\n */\ngoog.ds.BaseDataNode.prototype.getDataName = goog.abstractMethod;\n\n\n/**\n * Gets the a qualified data path to this node\n * @return {string} The data path.\n */\ngoog.ds.BaseDataNode.prototype.getDataPath = function() {\n  var parentPath = '';\n  var myName = this.getDataName();\n  if (this.getParent()) {\n    parentPath = this.getParent().getDataPath() +\n        (myName.indexOf(\n             /** @suppress {missingRequire} */ goog.ds.STR_ARRAY_START) != -1 ?\n             '' :\n             /** @suppress {missingRequire} */ goog.ds.STR_PATH_SEPARATOR);\n  }\n\n  return parentPath + myName;\n};\n\n\n/**\n * Load or reload the backing data for this node\n */\ngoog.ds.BaseDataNode.prototype.load = goog.nullFunction;\n\n\n/**\n * Gets the state of the backing data for this node\n * @return {goog.ds.LoadState} The state.\n */\ngoog.ds.BaseDataNode.prototype.getLoadState = function() {\n  return goog.ds.LoadState.LOADED;\n};\n\n\n/**\n * Gets the parent node. Subclasses implement this function\n * @return {?goog.ds.DataNode}\n * @protected\n */\ngoog.ds.BaseDataNode.prototype.getParent = goog.abstractMethod;\n\n\n/**\n * Interface for node list in rich data tree.\n *\n * Has both map and list-style accessors\n *\n * @constructor\n * @extends {goog.ds.DataNode}\n */\n// TODO(arv): Use interfaces when available.\ngoog.ds.DataNodeList = function() {};\n\n\n/**\n * Add a node to the node list.\n * If the node has a dataName, uses this for the key in the map.\n *\n * @param {goog.ds.DataNode} node The node to add.\n */\ngoog.ds.DataNodeList.prototype.add = goog.abstractMethod;\n\n\n/**\n * Get a node by string key.\n * Returns null if node doesn't exist.\n *\n * @param {string} key String lookup key.\n * @return {*} The node, or null if doesn't exist.\n * @override\n */\ngoog.ds.DataNodeList.prototype.get = goog.abstractMethod;\n\n\n/**\n * Get a node by index\n * Returns null if the index is out of range\n *\n * @param {number} index The index of the node.\n * @return {goog.ds.DataNode} The node, or null if doesn't exist.\n */\ngoog.ds.DataNodeList.prototype.getByIndex = goog.abstractMethod;\n\n\n/**\n * Gets the size of the node list\n *\n * @return {number} The size of the list.\n */\ngoog.ds.DataNodeList.prototype.getCount = goog.abstractMethod;\n\n\n/**\n * Sets a node in the list of a given name\n * @param {string} name Name of the node.\n * @param {goog.ds.DataNode} node The node.\n */\ngoog.ds.DataNodeList.prototype.setNode = goog.abstractMethod;\n\n\n/**\n * Removes a node in the list of a given name\n * @param {string} name Name of the node.\n * @return {boolean} True if node existed and was deleted.\n */\ngoog.ds.DataNodeList.prototype.removeNode = goog.abstractMethod;\n\n\n/**\n * Simple node list implementation with underlying array and map\n * implements goog.ds.DataNodeList.\n *\n * Names that are reserved for system use and shouldn't be used for data node\n * names: eval, toSource, toString, unwatch, valueOf, watch. Behavior is\n * undefined if these names are used.\n *\n * @param {Array<goog.ds.DataNode>=} opt_nodes optional nodes to add to list.\n * @constructor\n * @extends {goog.ds.DataNodeList}\n */\n// TODO(arv): Use interfaces when available.\ngoog.ds.BasicNodeList = function(opt_nodes) {\n  this.map_ = {};\n  this.list_ = [];\n  this.indexMap_ = {};\n  if (opt_nodes) {\n    for (var i = 0, node; node = opt_nodes[i]; i++) {\n      this.add(node);\n    }\n  }\n};\n\n\n/**\n * Add a node to the node list.\n * If the node has a dataName, uses this for the key in the map.\n * TODO(user) Remove function as well\n *\n * @param {goog.ds.DataNode} node The node to add.\n * @override\n */\ngoog.ds.BasicNodeList.prototype.add = function(node) {\n  this.list_.push(node);\n  var dataName = node.getDataName();\n  if (dataName) {\n    this.map_[dataName] = node;\n    this.indexMap_[dataName] = this.list_.length - 1;\n  }\n};\n\n\n/**\n * Get a node by string key.\n * Returns null if node doesn't exist.\n *\n * @param {string} key String lookup key.\n * @return {goog.ds.DataNode} The node, or null if doesn't exist.\n * @override\n */\ngoog.ds.BasicNodeList.prototype.get = function(key) {\n  return this.map_[key] || null;\n};\n\n\n/**\n * Get a node by index\n * Returns null if the index is out of range\n *\n * @param {number} index The index of the node.\n * @return {goog.ds.DataNode} The node, or null if doesn't exist.\n * @override\n */\ngoog.ds.BasicNodeList.prototype.getByIndex = function(index) {\n  return this.list_[index] || null;\n};\n\n\n/**\n * Gets the size of the node list\n *\n * @return {number} The size of the list.\n * @override\n */\ngoog.ds.BasicNodeList.prototype.getCount = function() {\n  return this.list_.length;\n};\n\n\n/**\n * Sets a node in the list of a given name\n * @param {string} name Name of the node.\n * @param {goog.ds.DataNode} node The node.\n * @override\n */\ngoog.ds.BasicNodeList.prototype.setNode = function(name, node) {\n  if (node == null) {\n    this.removeNode(name);\n  } else {\n    var existingNode = this.indexMap_[name];\n    if (existingNode != null) {\n      this.map_[name] = node;\n      this.list_[existingNode] = node;\n    } else {\n      this.add(node);\n    }\n  }\n};\n\n\n/**\n * Removes a node in the list of a given name\n * @param {string} name Name of the node.\n * @return {boolean} True if node existed and was deleted.\n * @override\n */\ngoog.ds.BasicNodeList.prototype.removeNode = function(name) {\n  var existingNode = this.indexMap_[name];\n  if (existingNode != null) {\n    this.list_.splice(existingNode, 1);\n    delete this.map_[name];\n    delete this.indexMap_[name];\n    for (var index in this.indexMap_) {\n      if (this.indexMap_[index] > existingNode) {\n        this.indexMap_[index]--;\n      }\n    }\n  }\n  return existingNode != null;\n};\n\n\n/**\n * Get the index of a named node\n * @param {string} name The name of the node to get the index of.\n * @return {number|undefined} The index.\n */\ngoog.ds.BasicNodeList.prototype.indexOf = function(name) {\n  return this.indexMap_[name];\n};\n\n\n/**\n * Immulatable empty node list\n * @extends {goog.ds.BasicNodeList}\n * @constructor\n * @final\n */\n\ngoog.ds.EmptyNodeList = function() {\n  goog.ds.BasicNodeList.call(this);\n};\ngoog.inherits(goog.ds.EmptyNodeList, goog.ds.BasicNodeList);\n\n\n/**\n * Add a node to the node list.\n * If the node has a dataName, uses this for the key in the map.\n *\n * @param {goog.ds.DataNode} node The node to add.\n * @override\n */\ngoog.ds.EmptyNodeList.prototype.add = function(node) {\n  throw new Error('Can\\'t add to EmptyNodeList');\n};\n\n\n\n/**\n * Node list implementation which maintains sort order during insertion and\n * modification operations based on a comparison function.\n *\n * The SortedNodeList does not guarantee sort order will be maintained if\n * the underlying data nodes are modified externally.\n *\n * Names that are reserved for system use and shouldn't be used for data node\n * names: eval, toSource, toString, unwatch, valueOf, watch. Behavior is\n * undefined if these names are used.\n *\n * @param {Function} compareFn Comparison function by which the\n *     node list is sorted. Should take 2 arguments to compare, and return a\n *     negative integer, zero, or a positive integer depending on whether the\n *     first argument is less than, equal to, or greater than the second.\n * @param {Array<goog.ds.DataNode>=} opt_nodes optional nodes to add to list;\n *    these are assumed to be in sorted order.\n * @extends {goog.ds.BasicNodeList}\n * @constructor\n */\ngoog.ds.SortedNodeList = function(compareFn, opt_nodes) {\n  this.compareFn_ = compareFn;\n  goog.ds.BasicNodeList.call(this, opt_nodes);\n};\ngoog.inherits(goog.ds.SortedNodeList, goog.ds.BasicNodeList);\n\n\n/**\n * Add a node to the node list, maintaining sort order.\n * If the node has a dataName, uses this for the key in the map.\n *\n * @param {goog.ds.DataNode} node The node to add.\n * @override\n */\ngoog.ds.SortedNodeList.prototype.add = function(node) {\n  if (!this.compareFn_) {\n    this.append(node);\n    return;\n  }\n\n  var searchLoc = goog.array.binarySearch(this.list_, node, this.compareFn_);\n\n  // if there is another node that is \"equal\" according to the comparison\n  // function, insert before that one; otherwise insert at the location\n  // goog.array.binarySearch indicated\n  if (searchLoc < 0) {\n    searchLoc = -(searchLoc + 1);\n  }\n\n  // update any indexes that are after the insertion point\n  for (var index in this.indexMap_) {\n    if (this.indexMap_[index] >= searchLoc) {\n      this.indexMap_[index]++;\n    }\n  }\n\n  goog.array.insertAt(this.list_, node, searchLoc);\n  var dataName = node.getDataName();\n  if (dataName) {\n    this.map_[dataName] = node;\n    this.indexMap_[dataName] = searchLoc;\n  }\n};\n\n\n/**\n * Adds the given node to the end of the SortedNodeList. This should\n * only be used when the caller can guarantee that the sort order will\n * be maintained according to this SortedNodeList's compareFn (e.g.\n * when initializing a new SortedNodeList from a list of nodes that has\n * already been sorted).\n * @param {goog.ds.DataNode} node The node to append.\n */\ngoog.ds.SortedNodeList.prototype.append = function(node) {\n  goog.ds.SortedNodeList.superClass_.add.call(this, node);\n};\n\n\n/**\n * Sets a node in the list of a given name, maintaining sort order.\n * @param {string} name Name of the node.\n * @param {goog.ds.DataNode} node The node.\n * @override\n */\ngoog.ds.SortedNodeList.prototype.setNode = function(name, node) {\n  if (node == null) {\n    this.removeNode(name);\n  } else {\n    var existingNode = this.indexMap_[name];\n    if (existingNode != null) {\n      if (this.compareFn_) {\n        var compareResult = this.compareFn_(this.list_[existingNode], node);\n        if (compareResult == 0) {\n          // the new node can just replace the old one\n          this.map_[name] = node;\n          this.list_[existingNode] = node;\n        } else {\n          // remove the old node, then add the new one\n          this.removeNode(name);\n          this.add(node);\n        }\n      }\n    } else {\n      this.add(node);\n    }\n  }\n};\n\n\n/**\n * The character denoting an attribute.\n * @type {string}\n */\ngoog.ds.STR_ATTRIBUTE_START = '@';\n\n\n/**\n * The character denoting all children.\n * @type {string}\n */\ngoog.ds.STR_ALL_CHILDREN_SELECTOR = '*';\n\n\n/**\n * The wildcard character.\n * @type {string}\n */\ngoog.ds.STR_WILDCARD = '*';\n\n\n/**\n * The character denoting path separation.\n * @type {string}\n */\ngoog.ds.STR_PATH_SEPARATOR = '/';\n\n\n/**\n * The character denoting the start of an array.\n * @type {string}\n */\ngoog.ds.STR_ARRAY_START = '[';\n\n\n/**\n * Shared logger instance for data package\n * @type {goog.log.Logger}\n */\ngoog.ds.logger = goog.log.getLogger('goog.ds');\n\n\n/**\n * Create a data node that references another data node,\n * useful for pointer-like functionality.\n * All functions will return same values as the original node except for\n * getDataName()\n * @param {!goog.ds.DataNode} node The original node.\n * @param {string} name The new name.\n * @return {!goog.ds.DataNode} The new data node.\n */\ngoog.ds.Util.makeReferenceNode = function(node, name) {\n  /**\n   * @constructor\n   * @extends {goog.ds.DataNode}\n   * @final\n   */\n  var nodeCreator = function() {};\n  nodeCreator.prototype = node;\n  var newNode = new nodeCreator();\n  newNode.getDataName = function() { return name; };\n  return newNode;\n};\n","^J2",1579837703000,"^J3",["^J4",["^IT","~$goog.log","^JJ"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/datasource/datasource.js"],"^JD",["^J4",["~$goog.ds.logger","~$goog.ds.SortedNodeList","~$goog.ds.EmptyNodeList","~$goog.ds.BasicNodeList","~$goog.ds.BaseDataNode","~$goog.ds.DataNodeList","~$goog.ds.LoadState","~$goog.ds.Util","~$goog.ds.DataNode"]],"^IR",true,"^IS",["^IT","^JJ","^LG"]],["^ ","^IV",[1579837703000],"^IW","goog.fx.dragdrop.js","^IX",["^IY","goog/fx/dragdrop.js"],"^IZ","goog/fx/dragdrop.js","^I[","^J0","^J1","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Single Element Drag and Drop.\n *\n * Drag and drop implementation for sources/targets consisting of a single\n * element.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/dragdrop.html\n */\n\ngoog.provide('goog.fx.DragDrop');\n\ngoog.require('goog.fx.AbstractDragDrop');\ngoog.require('goog.fx.DragDropItem');\n\n\n\n/**\n * Drag/drop implementation for creating drag sources/drop targets consisting of\n * a single HTML Element.\n *\n * @param {Element|string} element Dom Node, or string representation of node\n *     id, to be used as drag source/drop target.\n * @param {Object=} opt_data Data associated with the source/target.\n * @throws Error If no element argument is provided or if the type is invalid\n * @extends {goog.fx.AbstractDragDrop}\n * @constructor\n * @struct\n */\ngoog.fx.DragDrop = function(element, opt_data) {\n  goog.fx.AbstractDragDrop.call(this);\n\n  var item = new goog.fx.DragDropItem(element, opt_data);\n  item.setParent(this);\n  this.items_.push(item);\n};\ngoog.inherits(goog.fx.DragDrop, goog.fx.AbstractDragDrop);\n","^J2",1579837703000,"^J3",["^J4",["^IT","~$goog.fx.AbstractDragDrop","~$goog.fx.DragDropItem"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/fx/dragdrop.js"],"^JD",["^J4",["~$goog.fx.DragDrop"]],"^IR",true,"^IS",["^IT","^LQ","^LR"]],["^ ","^IV",[1579837703000],"^IW","goog.messaging.portoperator.js","^IX",["^IY","goog/messaging/portoperator.js"],"^IZ","goog/messaging/portoperator.js","^I[","^J0","^J1","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The central node of a {@link goog.messaging.PortNetwork}. The\n * operator is responsible for providing the two-way communication channels (via\n * {@link MessageChannel}s) between each pair of nodes in the network that need\n * to communicate with one another. Each network should have one and only one\n * operator.\n *\n */\n\ngoog.provide('goog.messaging.PortOperator');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.asserts');\ngoog.require('goog.log');\ngoog.require('goog.messaging.PortChannel');\ngoog.require('goog.messaging.PortNetwork');  // interface\ngoog.require('goog.object');\n\n\n\n/**\n * The central node of a PortNetwork.\n *\n * @param {string} name The name of this node.\n * @constructor\n * @extends {goog.Disposable}\n * @implements {goog.messaging.PortNetwork}\n * @final\n */\ngoog.messaging.PortOperator = function(name) {\n  goog.messaging.PortOperator.base(this, 'constructor');\n\n  /**\n   * The collection of channels for communicating with other contexts in the\n   * network. These are the channels that are returned to the user, as opposed\n   * to the channels used for internal network communication. This is lazily\n   * populated as the user requests communication with other contexts, or other\n   * contexts request communication with the operator.\n   *\n   * @type {!Object<!goog.messaging.PortChannel>}\n   * @private\n   */\n  this.connections_ = {};\n\n  /**\n   * The collection of channels for internal network communication with other\n   * contexts. This is not lazily populated, and always contains entries for\n   * each member of the network.\n   *\n   * @type {!Object<!goog.messaging.MessageChannel>}\n   * @private\n   */\n  this.switchboard_ = {};\n\n  /**\n   * The name of the operator context.\n   *\n   * @type {string}\n   * @private\n   */\n  this.name_ = name;\n};\ngoog.inherits(goog.messaging.PortOperator, goog.Disposable);\n\n\n/**\n * The logger for PortOperator.\n * @type {goog.log.Logger}\n * @private\n */\ngoog.messaging.PortOperator.prototype.logger_ =\n    goog.log.getLogger('goog.messaging.PortOperator');\n\n\n/** @override */\ngoog.messaging.PortOperator.prototype.dial = function(name) {\n  this.connectSelfToPort_(name);\n  return this.connections_[name];\n};\n\n\n/**\n * Adds a caller to the network with the given name. This port should have no\n * services registered on it. It will be disposed along with the PortOperator.\n *\n * @param {string} name The name of the port to add.\n * @param {!goog.messaging.MessageChannel} port The port to add. Must be either\n *     a {@link goog.messaging.PortChannel} or a decorator wrapping a\n *     PortChannel; in particular, it must be able to send and receive\n *     {@link MessagePort}s.\n */\ngoog.messaging.PortOperator.prototype.addPort = function(name, port) {\n  this.switchboard_[name] = port;\n  port.registerService(\n      goog.messaging.PortNetwork.REQUEST_CONNECTION_SERVICE,\n      goog.bind(this.requestConnection_, this, name));\n};\n\n\n/**\n * Connects two contexts by creating a {@link MessageChannel} and sending one\n * end to one context and the other end to the other. Called when we receive a\n * request from a caller to connect it to another context (including potentially\n * the operator).\n *\n * @param {string} sourceName The name of the context requesting the connection.\n * @param {!Object|string} message The name of the context to which\n *     the connection is requested.\n * @private\n */\ngoog.messaging.PortOperator.prototype.requestConnection_ = function(\n    sourceName, message) {\n  var requestedName = /** @type {string} */ (message);\n  if (requestedName == this.name_) {\n    this.connectSelfToPort_(sourceName);\n    return;\n  }\n\n  var sourceChannel = this.switchboard_[sourceName];\n  var requestedChannel = this.switchboard_[requestedName];\n\n  goog.asserts.assert(sourceChannel != null);\n  if (!requestedChannel) {\n    var err = 'Port \"' + sourceName + '\" requested a connection to port \"' +\n        requestedName + '\", which doesn\\'t exist';\n    goog.log.warning(this.logger_, err);\n    sourceChannel.send(\n        goog.messaging.PortNetwork.GRANT_CONNECTION_SERVICE,\n        {'success': false, 'message': err});\n    return;\n  }\n\n  var messageChannel = new MessageChannel();\n  sourceChannel.send(\n      goog.messaging.PortNetwork.GRANT_CONNECTION_SERVICE,\n      {'success': true, 'name': requestedName, 'port': messageChannel.port1});\n  requestedChannel.send(\n      goog.messaging.PortNetwork.GRANT_CONNECTION_SERVICE,\n      {'success': true, 'name': sourceName, 'port': messageChannel.port2});\n};\n\n\n/**\n * Connects together the operator and a caller by creating a\n * {@link MessageChannel} and sending one end to the remote context.\n *\n * @param {string} contextName The name of the context to which to connect the\n *     operator.\n * @private\n */\ngoog.messaging.PortOperator.prototype.connectSelfToPort_ = function(\n    contextName) {\n  if (contextName in this.connections_) {\n    // We've already established a connection with this port.\n    return;\n  }\n\n  var contextChannel = this.switchboard_[contextName];\n  if (!contextChannel) {\n    throw new Error('Port \"' + contextName + '\" doesn\\'t exist');\n  }\n\n  var messageChannel = new MessageChannel();\n  contextChannel.send(\n      goog.messaging.PortNetwork.GRANT_CONNECTION_SERVICE,\n      {'success': true, 'name': this.name_, 'port': messageChannel.port1});\n  messageChannel.port2.start();\n  this.connections_[contextName] =\n      new goog.messaging.PortChannel(messageChannel.port2);\n};\n\n\n/** @override */\ngoog.messaging.PortOperator.prototype.disposeInternal = function() {\n  goog.object.forEach(this.switchboard_, goog.dispose);\n  goog.object.forEach(this.connections_, goog.dispose);\n  delete this.switchboard_;\n  delete this.connections_;\n  goog.messaging.PortOperator.base(this, 'disposeInternal');\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","~$goog.messaging.PortNetwork","~$goog.messaging.PortChannel","^IT","^KS","^LG","~$goog.Disposable"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/messaging/portoperator.js"],"^JD",["^J4",["~$goog.messaging.PortOperator"]],"^IR",true,"^IS",["^IT","^LV","^JF","^LG","^LU","^LT","^KS"]],["^ ","^IV",[1579837703000],"^IW","goog.i18n.numberformat.js","^IX",["^IY","goog/i18n/numberformat.js"],"^IZ","goog/i18n/numberformat.js","^I[","^J0","^J1","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Number format/parse library with locale support.\n */\n\n\n/**\n * Namespace for locale number format functions\n */\ngoog.provide('goog.i18n.NumberFormat');\ngoog.provide('goog.i18n.NumberFormat.CurrencyStyle');\ngoog.provide('goog.i18n.NumberFormat.Format');\n\ngoog.require('goog.asserts');\ngoog.require('goog.i18n.CompactNumberFormatSymbols');\ngoog.require('goog.i18n.NumberFormatSymbols');\ngoog.require('goog.i18n.NumberFormatSymbols_u_nu_latn');\ngoog.require('goog.i18n.currency');\ngoog.require('goog.math');\ngoog.require('goog.string');\n\n\n\n/**\n * Constructor of NumberFormat.\n * @param {number|string} pattern The number that indicates a predefined\n *     number format pattern.\n * @param {string=} opt_currency Optional international currency\n *     code. This determines the currency code/symbol used in format/parse. If\n *     not given, the currency code for the current locale will be used.\n * @param {number=} opt_currencyStyle currency style, value defined in\n *     goog.i18n.NumberFormat.CurrencyStyle. If not given, the currency style\n *     for the current locale will be used.\n * @param {!Object<string, string>=} opt_symbols Optional number format symbols\n *     map, analogous to goog.i18n.NumberFormatSymbols. If present, this\n *     overrides the symbols from the current locale, such as the percent sign\n *     and minus sign.\n * @constructor\n */\ngoog.i18n.NumberFormat = function(\n    pattern, opt_currency, opt_currencyStyle, opt_symbols) {\n  if (opt_currency && !goog.i18n.currency.isValid(opt_currency)) {\n    throw new TypeError('Currency must be valid ISO code');\n  }\n\n  /** @const @private {?string} */\n  this.intlCurrencyCode_ = opt_currency ? opt_currency.toUpperCase() : null;\n\n  /** @const @private {number} */\n  this.currencyStyle_ =\n      opt_currencyStyle || goog.i18n.NumberFormat.CurrencyStyle.LOCAL;\n\n  /** @const @private {?Object<string, string>} */\n  this.overrideNumberFormatSymbols_ = opt_symbols || null;\n\n  /** @private {number} */\n  this.maximumIntegerDigits_ = 40;\n  /** @private {number} */\n  this.minimumIntegerDigits_ = 1;\n  /** @private {number} */\n  this.significantDigits_ = 0;  // invariant, <= maximumFractionDigits\n  /** @private {number} */\n  this.maximumFractionDigits_ = 3;  // invariant, >= minFractionDigits\n  /** @private {number} */\n  this.minimumFractionDigits_ = 0;\n  /** @private {number} */\n  this.minExponentDigits_ = 0;\n  /** @private {boolean} */\n  this.useSignForPositiveExponent_ = false;\n\n  /**\n   * Whether to show trailing zeros in the fraction when significantDigits_ is\n   * positive.\n   * @private {boolean}\n   */\n  this.showTrailingZeros_ = false;\n\n  /** @private {string} */\n  this.positivePrefix_ = '';\n  /** @private {string} */\n  this.positiveSuffix_ = '';\n  /** @private {string} */\n  this.negativePrefix_ = this.getNumberFormatSymbols_().MINUS_SIGN;\n  /** @private {string} */\n  this.negativeSuffix_ = '';\n\n  // The multiplier for use in percent, per mille, etc.\n  /** @private {number} */\n  this.multiplier_ = 1;\n\n  /**\n   * True if the percent/permill sign of the negative pattern is expected.\n   * @private {boolean}\n   */\n  this.negativePercentSignExpected_ = false;\n\n  /**\n   * The grouping array is used to store the values of each number group\n   * following left of the decimal place. For example, a number group with\n   * goog.i18n.NumberFormat('#,##,###') should have [3,2] where 2 is the\n   * repeated number group following a fixed number grouping of size 3.\n   * @private {!Array<number>}\n   */\n  this.groupingArray_ = [];\n\n  /** @private {boolean} */\n  this.decimalSeparatorAlwaysShown_ = false;\n  /** @private {boolean} */\n  this.useExponentialNotation_ = false;\n  /** @private {goog.i18n.NumberFormat.CompactStyle} */\n  this.compactStyle_ = goog.i18n.NumberFormat.CompactStyle.NONE;\n\n  /**\n   * The number to base the formatting on when using compact styles, or null\n   * if formatting should not be based on another number.\n   * @type {?number}\n   * @private\n   */\n  this.baseFormattingNumber_ = null;\n\n  /** @private {string} */\n  this.pattern_;\n\n  if (typeof pattern == 'number') {\n    this.applyStandardPattern_(pattern);\n  } else {\n    this.applyPattern_(pattern);\n  }\n};\n\n\n/**\n * Standard number formatting patterns.\n * @enum {number}\n */\ngoog.i18n.NumberFormat.Format = {\n  DECIMAL: 1,\n  SCIENTIFIC: 2,\n  PERCENT: 3,\n  CURRENCY: 4,\n  COMPACT_SHORT: 5,\n  COMPACT_LONG: 6\n};\n\n\n/**\n * Currency styles.\n * @enum {number}\n */\ngoog.i18n.NumberFormat.CurrencyStyle = {\n  LOCAL: 0,     // currency style as it is used in its circulating country.\n  PORTABLE: 1,  // currency style that differentiate it from other popular ones.\n  GLOBAL: 2     // currency style that is unique among all currencies.\n};\n\n\n/**\n * Compacting styles.\n * @enum {number}\n */\ngoog.i18n.NumberFormat.CompactStyle = {\n  NONE: 0,   // Don't compact.\n  SHORT: 1,  // Short compact form, such as 1.2B.\n  LONG: 2    // Long compact form, such as 1.2 billion.\n};\n\n\n/**\n * If the usage of Ascii digits should be enforced.\n * @type {boolean}\n * @private\n */\ngoog.i18n.NumberFormat.enforceAsciiDigits_ = false;\n\n\n/**\n * Set if the usage of Ascii digits in formatting should be enforced.\n * NOTE: This function must be called before constructing NumberFormat.\n *\n * @param {boolean} doEnforce Boolean value about if Ascii digits should be\n *     enforced.\n */\ngoog.i18n.NumberFormat.setEnforceAsciiDigits = function(doEnforce) {\n  goog.i18n.NumberFormat.enforceAsciiDigits_ = doEnforce;\n};\n\n\n/**\n * Return if Ascii digits is enforced.\n * @return {boolean} If Ascii digits is enforced.\n */\ngoog.i18n.NumberFormat.isEnforceAsciiDigits = function() {\n  return goog.i18n.NumberFormat.enforceAsciiDigits_;\n};\n\n\n/**\n * Returns the current NumberFormatSymbols.\n * @return {?}\n * @private\n */\ngoog.i18n.NumberFormat.prototype.getNumberFormatSymbols_ = function() {\n  return this.overrideNumberFormatSymbols_ ||\n      (goog.i18n.NumberFormat.enforceAsciiDigits_ ?\n           goog.i18n.NumberFormatSymbols_u_nu_latn :\n           goog.i18n.NumberFormatSymbols);\n};\n\n\n/**\n * Returns the currency code.\n * @return {string}\n * @private\n */\ngoog.i18n.NumberFormat.prototype.getCurrencyCode_ = function() {\n  return this.intlCurrencyCode_ ||\n      this.getNumberFormatSymbols_().DEF_CURRENCY_CODE;\n};\n\n\n/**\n * Sets minimum number of fraction digits.\n * @param {number} min the minimum.\n * @return {!goog.i18n.NumberFormat} Reference to this NumberFormat object.\n */\ngoog.i18n.NumberFormat.prototype.setMinimumFractionDigits = function(min) {\n  if (this.significantDigits_ > 0 && min > 0) {\n    throw new Error(\n        'Can\\'t combine significant digits and minimum fraction digits');\n  }\n  this.minimumFractionDigits_ = min;\n  return this;\n};\n\n\n/**\n * Gets minimum number of fraction digits.\n * @return {number} The number of minimum fraction digits.\n */\ngoog.i18n.NumberFormat.prototype.getMinimumFractionDigits = function() {\n  return this.minimumFractionDigits_;\n};\n\n\n/**\n * Sets maximum number of fraction digits.\n * @param {number} max the maximum.\n * @return {!goog.i18n.NumberFormat} Reference to this NumberFormat object.\n */\ngoog.i18n.NumberFormat.prototype.setMaximumFractionDigits = function(max) {\n  if (max > 308) {\n    // Math.pow(10, 309) becomes Infinity which breaks the logic in this class.\n    throw new Error('Unsupported maximum fraction digits: ' + max);\n  }\n  this.maximumFractionDigits_ = max;\n  return this;\n};\n\n\n/**\n * Gets maximum number of fraction digits.\n * @return {number} The number of maximum fraction digits.\n */\ngoog.i18n.NumberFormat.prototype.getMaximumFractionDigits = function() {\n  return this.maximumFractionDigits_;\n};\n\n/**\n * Sets number of significant digits to show. Only fractions will be rounded.\n * Regardless of the number of significant digits set, the number of fractional\n * digits shown will always be capped by the maximum number of fractional digits\n * set on {@link #setMaximumFractionDigits}.\n * @param {number} number The number of significant digits to include.\n * @return {!goog.i18n.NumberFormat} Reference to this NumberFormat object.\n */\ngoog.i18n.NumberFormat.prototype.setSignificantDigits = function(number) {\n  if (this.minimumFractionDigits_ > 0 && number >= 0) {\n    throw new Error(\n        'Can\\'t combine significant digits and minimum fraction digits');\n  }\n  this.significantDigits_ = number;\n  return this;\n};\n\n\n/**\n * Gets number of significant digits to show. Only fractions will be rounded.\n * @return {number} The number of significant digits to include.\n */\ngoog.i18n.NumberFormat.prototype.getSignificantDigits = function() {\n  return this.significantDigits_;\n};\n\n\n/**\n * Sets whether trailing fraction zeros should be shown when significantDigits_\n * is positive. If this is true and significantDigits_ is 2, 1 will be formatted\n * as '1.0'.\n * @param {boolean} showTrailingZeros Whether trailing zeros should be shown.\n * @return {!goog.i18n.NumberFormat} Reference to this NumberFormat object.\n */\ngoog.i18n.NumberFormat.prototype.setShowTrailingZeros = function(\n    showTrailingZeros) {\n  this.showTrailingZeros_ = showTrailingZeros;\n  return this;\n};\n\n\n/**\n * Sets a number to base the formatting on when compact style formatting is\n * used. If this is null, the formatting should be based only on the number to\n * be formatting.\n *\n * This base formatting number can be used to format the target number as\n * another number would be formatted. For example, 100,000 is normally formatted\n * as \"100K\" in the COMPACT_SHORT format. To instead format it as '0.1M', the\n * base number could be set to 1,000,000 in order to force all numbers to be\n * formatted in millions. Similarly, 1,000,000,000 would normally be formatted\n * as '1B' and setting the base formatting number to 1,000,000, would cause it\n * to be formatted instead as '1,000M'.\n *\n * @param {?number} baseFormattingNumber The number to base formatting on, or\n * null if formatting should not be based on another number.\n * @return {!goog.i18n.NumberFormat} Reference to this NumberFormat object.\n */\ngoog.i18n.NumberFormat.prototype.setBaseFormatting = function(\n    baseFormattingNumber) {\n  goog.asserts.assert(\n      baseFormattingNumber === null || isFinite(baseFormattingNumber));\n  this.baseFormattingNumber_ = baseFormattingNumber;\n  return this;\n};\n\n\n/**\n * Gets the number on which compact formatting is currently based, or null if\n * no such number is set. See setBaseFormatting() for more information.\n * @return {?number}\n */\ngoog.i18n.NumberFormat.prototype.getBaseFormatting = function() {\n  return this.baseFormattingNumber_;\n};\n\n\n/**\n * Apply provided pattern, result are stored in member variables.\n *\n * @param {string} pattern String pattern being applied.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.applyPattern_ = function(pattern) {\n  this.pattern_ = pattern.replace(/ /g, '\\u00a0');\n  var pos = [0];\n\n  this.positivePrefix_ = this.parseAffix_(pattern, pos);\n  var trunkStart = pos[0];\n  this.parseTrunk_(pattern, pos);\n  var trunkLen = pos[0] - trunkStart;\n  this.positiveSuffix_ = this.parseAffix_(pattern, pos);\n  if (pos[0] < pattern.length &&\n      pattern.charAt(pos[0]) == goog.i18n.NumberFormat.PATTERN_SEPARATOR_) {\n    pos[0]++;\n    if (this.multiplier_ != 1) this.negativePercentSignExpected_ = true;\n    this.negativePrefix_ = this.parseAffix_(pattern, pos);\n    // we assume this part is identical to positive part.\n    // user must make sure the pattern is correctly constructed.\n    pos[0] += trunkLen;\n    this.negativeSuffix_ = this.parseAffix_(pattern, pos);\n  } else {\n    // if no negative affix specified, they share the same positive affix\n    this.negativePrefix_ += this.positivePrefix_;\n    this.negativeSuffix_ += this.positiveSuffix_;\n  }\n};\n\n\n/**\n * Apply a predefined pattern to NumberFormat object.\n * @param {number} patternType The number that indicates a predefined number\n *     format pattern.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.applyStandardPattern_ = function(patternType) {\n  switch (patternType) {\n    case goog.i18n.NumberFormat.Format.DECIMAL:\n      this.applyPattern_(this.getNumberFormatSymbols_().DECIMAL_PATTERN);\n      break;\n    case goog.i18n.NumberFormat.Format.SCIENTIFIC:\n      this.applyPattern_(this.getNumberFormatSymbols_().SCIENTIFIC_PATTERN);\n      break;\n    case goog.i18n.NumberFormat.Format.PERCENT:\n      this.applyPattern_(this.getNumberFormatSymbols_().PERCENT_PATTERN);\n      break;\n    case goog.i18n.NumberFormat.Format.CURRENCY:\n      this.applyPattern_(goog.i18n.currency.adjustPrecision(\n          this.getNumberFormatSymbols_().CURRENCY_PATTERN,\n          this.getCurrencyCode_()));\n      break;\n    case goog.i18n.NumberFormat.Format.COMPACT_SHORT:\n      this.applyCompactStyle_(goog.i18n.NumberFormat.CompactStyle.SHORT);\n      break;\n    case goog.i18n.NumberFormat.Format.COMPACT_LONG:\n      this.applyCompactStyle_(goog.i18n.NumberFormat.CompactStyle.LONG);\n      break;\n    default:\n      throw new Error('Unsupported pattern type.');\n  }\n};\n\n\n/**\n * Apply a predefined pattern for shorthand formats.\n * @param {goog.i18n.NumberFormat.CompactStyle} style the compact style to\n *     set defaults for.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.applyCompactStyle_ = function(style) {\n  this.compactStyle_ = style;\n  this.applyPattern_(this.getNumberFormatSymbols_().DECIMAL_PATTERN);\n  this.setMinimumFractionDigits(0);\n  this.setMaximumFractionDigits(2);\n  this.setSignificantDigits(2);\n};\n\n\n/**\n * Parses text string to produce a Number.\n *\n * This method attempts to parse text starting from position \"opt_pos\" if it\n * is given. Otherwise the parse will start from the beginning of the text.\n * When opt_pos presents, opt_pos will be updated to the character next to where\n * parsing stops after the call. If an error occurs, opt_pos won't be updated.\n *\n * @param {string} text The string to be parsed.\n * @param {Array<number>=} opt_pos Position to pass in and get back.\n * @return {number} Parsed number. This throws an error if the text cannot be\n *     parsed.\n */\ngoog.i18n.NumberFormat.prototype.parse = function(text, opt_pos) {\n  var pos = opt_pos || [0];\n\n  if (this.compactStyle_ != goog.i18n.NumberFormat.CompactStyle.NONE) {\n    throw new Error('Parsing of compact numbers is unimplemented');\n  }\n\n  var ret = NaN;\n\n  // We don't want to handle multiple kinds of space in parsing, normalize the\n  // regular and narrow nbsp to nbsp.\n  text = text.replace(/ |\\u202f/g, '\\u00a0');\n\n  var gotPositive = text.indexOf(this.positivePrefix_, pos[0]) == pos[0];\n  var gotNegative = text.indexOf(this.negativePrefix_, pos[0]) == pos[0];\n\n  // check for the longest match\n  if (gotPositive && gotNegative) {\n    if (this.positivePrefix_.length > this.negativePrefix_.length) {\n      gotNegative = false;\n    } else if (this.positivePrefix_.length < this.negativePrefix_.length) {\n      gotPositive = false;\n    }\n  }\n\n  if (gotPositive) {\n    pos[0] += this.positivePrefix_.length;\n  } else if (gotNegative) {\n    pos[0] += this.negativePrefix_.length;\n  }\n\n  // process digits or Inf, find decimal position\n  if (text.indexOf(this.getNumberFormatSymbols_().INFINITY, pos[0]) == pos[0]) {\n    pos[0] += this.getNumberFormatSymbols_().INFINITY.length;\n    ret = Infinity;\n  } else {\n    ret = this.parseNumber_(text, pos);\n  }\n\n  // check for suffix\n  if (gotPositive) {\n    if (!(text.indexOf(this.positiveSuffix_, pos[0]) == pos[0])) {\n      return NaN;\n    }\n    pos[0] += this.positiveSuffix_.length;\n  } else if (gotNegative) {\n    if (!(text.indexOf(this.negativeSuffix_, pos[0]) == pos[0])) {\n      return NaN;\n    }\n    pos[0] += this.negativeSuffix_.length;\n  }\n\n  return gotNegative ? -ret : ret;\n};\n\n\n/**\n * This function will parse a \"localized\" text into a Number. It needs to\n * handle locale specific decimal, grouping, exponent and digits.\n *\n * @param {string} text The text that need to be parsed.\n * @param {Array<number>} pos  In/out parsing position. In case of failure,\n *    pos value won't be changed.\n * @return {number} Number value, or NaN if nothing can be parsed.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.parseNumber_ = function(text, pos) {\n  var sawDecimal = false;\n  var sawExponent = false;\n  var sawDigit = false;\n  var exponentPos = -1;\n  var scale = 1;\n  var decimal = this.getNumberFormatSymbols_().DECIMAL_SEP;\n  var grouping = this.getNumberFormatSymbols_().GROUP_SEP;\n  var exponentChar = this.getNumberFormatSymbols_().EXP_SYMBOL;\n\n  if (this.compactStyle_ != goog.i18n.NumberFormat.CompactStyle.NONE) {\n    throw new Error('Parsing of compact style numbers is not implemented');\n  }\n\n  // We don't want to handle multiple kinds of space in parsing, normalize the\n  // narrow nbsp to nbsp.\n  grouping = grouping.replace(/\\u202f/g, '\\u00a0');\n\n  var normalizedText = '';\n  for (; pos[0] < text.length; pos[0]++) {\n    var ch = text.charAt(pos[0]);\n    var digit = this.getDigit_(ch);\n    if (digit >= 0 && digit <= 9) {\n      normalizedText += digit;\n      sawDigit = true;\n    } else if (ch == decimal.charAt(0)) {\n      if (sawDecimal || sawExponent) {\n        break;\n      }\n      normalizedText += '.';\n      sawDecimal = true;\n    } else if (\n        ch == grouping.charAt(0) &&\n        ('\\u00a0' != grouping.charAt(0) ||\n         pos[0] + 1 < text.length &&\n             this.getDigit_(text.charAt(pos[0] + 1)) >= 0)) {\n      // Got a grouping character here. When grouping character is nbsp, need\n      // to make sure the character following it is a digit.\n      if (sawDecimal || sawExponent) {\n        break;\n      }\n      continue;\n    } else if (ch == exponentChar.charAt(0)) {\n      if (sawExponent) {\n        break;\n      }\n      normalizedText += 'E';\n      sawExponent = true;\n      exponentPos = pos[0];\n    } else if (ch == '+' || ch == '-') {\n      // Stop parsing if a '+' or '-' sign is found after digits have been found\n      // but it's not located right after an exponent sign.\n      if (sawDigit && exponentPos != pos[0] - 1) {\n        break;\n      }\n      normalizedText += ch;\n    } else if (\n        this.multiplier_ == 1 &&\n        ch == this.getNumberFormatSymbols_().PERCENT.charAt(0)) {\n      // Parse the percent character as part of the number only when it's\n      // not already included in the pattern.\n      if (scale != 1) {\n        break;\n      }\n      scale = 100;\n      if (sawDigit) {\n        pos[0]++;  // eat this character if parse end here\n        break;\n      }\n    } else if (\n        this.multiplier_ == 1 &&\n        ch == this.getNumberFormatSymbols_().PERMILL.charAt(0)) {\n      // Parse the permill character as part of the number only when it's\n      // not already included in the pattern.\n      if (scale != 1) {\n        break;\n      }\n      scale = 1000;\n      if (sawDigit) {\n        pos[0]++;  // eat this character if parse end here\n        break;\n      }\n    } else {\n      break;\n    }\n  }\n\n  // Scale the number when the percent/permill character was included in\n  // the pattern.\n  if (this.multiplier_ != 1) {\n    scale = this.multiplier_;\n  }\n\n  return parseFloat(normalizedText) / scale;\n};\n\n\n/**\n * Formats a Number to produce a string.\n *\n * @param {number} number The Number to be formatted.\n * @return {string} The formatted number string.\n */\ngoog.i18n.NumberFormat.prototype.format = function(number) {\n  if (isNaN(number)) {\n    return this.getNumberFormatSymbols_().NAN;\n  }\n\n  var parts = [];\n  var baseFormattingNumber = (this.baseFormattingNumber_ === null) ?\n      number :\n      this.baseFormattingNumber_;\n  var unit = this.getUnitAfterRounding_(baseFormattingNumber, number);\n  number = goog.i18n.NumberFormat.decimalShift_(number, -unit.divisorBase);\n\n  parts.push(unit.prefix);\n\n  // in icu code, it is commented that certain computation need to keep the\n  // negative sign for 0.\n  var isNegative = number < 0.0 || number == 0.0 && 1 / number < 0.0;\n\n  parts.push(isNegative ? this.negativePrefix_ : this.positivePrefix_);\n\n  if (!isFinite(number)) {\n    parts.push(this.getNumberFormatSymbols_().INFINITY);\n  } else {\n    // convert number to non-negative value\n    number *= isNegative ? -1 : 1;\n\n    number *= this.multiplier_;\n    this.useExponentialNotation_ ?\n        this.subformatExponential_(number, parts) :\n        this.subformatFixed_(number, this.minimumIntegerDigits_, parts);\n  }\n\n  parts.push(isNegative ? this.negativeSuffix_ : this.positiveSuffix_);\n  parts.push(unit.suffix);\n\n  return parts.join('');\n};\n\n\n/**\n * Round a number into an integer and fractional part\n * based on the rounding rules for this NumberFormat.\n * @param {number} number The number to round.\n * @return {{intValue: number, fracValue: number}} The integer and fractional\n *     part after rounding.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.roundNumber_ = function(number) {\n  var shift = goog.i18n.NumberFormat.decimalShift_;\n\n  var shiftedNumber = shift(number, this.maximumFractionDigits_);\n  if (this.significantDigits_ > 0) {\n    shiftedNumber = this.roundToSignificantDigits_(\n        shiftedNumber, this.significantDigits_, this.maximumFractionDigits_);\n  }\n  shiftedNumber = Math.round(shiftedNumber);\n\n  var intValue, fracValue;\n  if (isFinite(shiftedNumber)) {\n    intValue = Math.floor(shift(shiftedNumber, -this.maximumFractionDigits_));\n    fracValue = Math.floor(\n        shiftedNumber - shift(intValue, this.maximumFractionDigits_));\n  } else {\n    intValue = number;\n    fracValue = 0;\n  }\n  return {intValue: intValue, fracValue: fracValue};\n};\n\n\n/**\n * Formats a number with the appropriate groupings when there are repeating\n * digits present. Repeating digits exists when the length of the digits left\n * of the decimal place exceeds the number of non-repeating digits.\n *\n * Formats a number by iterating through the integer number (intPart) from the\n * most left of the decimal place by inserting the appropriate number grouping\n * separator for the repeating digits until all of the repeating digits is\n * iterated. Then iterate through the non-repeating digits by inserting the\n * appropriate number grouping separator until all the non-repeating digits\n * is iterated through.\n *\n * In the number grouping concept, anything left of the decimal\n * place is followed by non-repeating digits and then repeating digits. If the\n * pattern is #,##,###, then we first (from the left of the decimal place) have\n * a non-repeating digit of size 3 followed by repeating digits of size 2\n * separated by a thousand separator. If the length of the digits are six or\n * more, there may be repeating digits required. For example, the value of\n * 12345678 would format as 1,23,45,678 where the repeating digit is length 2.\n *\n * @param {!Array<string>} parts An array to build the 'parts' of the formatted\n *  number including the values and separators.\n * @param {number} zeroCode The value of the zero digit whether or not\n *  goog.i18n.NumberFormat.enforceAsciiDigits_ is enforced.\n * @param {string} intPart The integer representation of the number to be\n *  formatted and referenced.\n * @param {!Array<number>} groupingArray The array of numbers to determine the\n *  grouping of repeated and non-repeated digits.\n * @param {number} repeatedDigitLen The length of the repeated digits left of\n *  the non-repeating digits left of the decimal.\n * @return {!Array<string>} Returns the resulting parts variable containing\n *  how numbers are to be grouped and appear.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.formatNumberGroupingRepeatingDigitsParts_ =\n    function(parts, zeroCode, intPart, groupingArray, repeatedDigitLen) {\n  // Keep track of how much has been completed on the non repeated groups\n  var nonRepeatedGroupCompleteCount = 0;\n  var currentGroupSizeIndex = 0;\n  var currentGroupSize = 0;\n\n  var grouping = this.getNumberFormatSymbols_().GROUP_SEP;\n  var digitLen = intPart.length;\n\n  // There are repeating digits and non-repeating digits\n  for (var i = 0; i < digitLen; i++) {\n    parts.push(String.fromCharCode(zeroCode + Number(intPart.charAt(i)) * 1));\n    if (digitLen - i > 1) {\n      currentGroupSize = groupingArray[currentGroupSizeIndex];\n      if (i < repeatedDigitLen) {\n        // Process the left side (the repeated number groups)\n        var repeatedDigitIndex = repeatedDigitLen - i;\n        // Edge case if there's a number grouping asking for \"1\" group at\n        // a time; otherwise, if the remainder is 1, there's the separator\n        if (currentGroupSize === 1 ||\n            (currentGroupSize > 0 &&\n             (repeatedDigitIndex % currentGroupSize) === 1)) {\n          parts.push(grouping);\n        }\n      } else if (currentGroupSizeIndex < groupingArray.length) {\n        // Process the right side (the non-repeated fixed number groups)\n        if (i === repeatedDigitLen) {\n          // Increase the group index because a separator\n          // has previously added in the earlier logic\n          currentGroupSizeIndex += 1;\n        } else if (\n            currentGroupSize ===\n            i - repeatedDigitLen - nonRepeatedGroupCompleteCount + 1) {\n          // Otherwise, just iterate to the right side and\n          // add a separator once the length matches to the expected\n          parts.push(grouping);\n          // Keep track of what has been completed on the right\n          nonRepeatedGroupCompleteCount += currentGroupSize;\n          currentGroupSizeIndex += 1;  // Get to the next number grouping\n        }\n      }\n    }\n  }\n  return parts;\n};\n\n\n/**\n * Formats a number with the appropriate groupings when there are no repeating\n * digits present. Non-repeating digits exists when the length of the digits\n * left of the decimal place is equal or lesser than the length of\n * non-repeating digits.\n *\n * Formats a number by iterating through the integer number (intPart) from the\n * right most non-repeating number group of the decimal place. For each group,\n * inserting the appropriate number grouping separator for the non-repeating\n * digits until the number is completely iterated.\n *\n * In the number grouping concept, anything left of the decimal\n * place is followed by non-repeating digits and then repeating digits. If the\n * pattern is #,##,###, then we first (from the left of the decimal place) have\n * a non-repeating digit of size 3 followed by repeating digits of size 2\n * separated by a thousand separator. If the length of the digits are five or\n * less, there won't be any repeating digits required. For example, the value\n * of 12345 would be formatted as 12,345 where the non-repeating digit is of\n * length 3.\n *\n * @param {!Array<string>} parts An array to build the 'parts' of the formatted\n *  number including the values and separators.\n * @param {number} zeroCode The value of the zero digit whether or not\n *  goog.i18n.NumberFormat.enforceAsciiDigits_ is enforced.\n * @param {string} intPart The integer representation of the number to be\n *  formatted and referenced.\n * @param {!Array<number>} groupingArray The array of numbers to determine the\n *  grouping of repeated and non-repeated digits.\n * @return {!Array<string>} Returns the resulting parts variable containing\n *  how numbers are to be grouped and appear.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.formatNumberGroupingNonRepeatingDigitsParts_ =\n    function(parts, zeroCode, intPart, groupingArray) {\n  // Keep track of how much has been completed on the non repeated groups\n  var grouping = this.getNumberFormatSymbols_().GROUP_SEP;\n  var currentGroupSizeIndex;\n  var currentGroupSize = 0;\n  var digitLenLeft = intPart.length;\n  var rightToLeftParts = [];\n\n  // Start from the right most non-repeating group and work inwards\n  for (currentGroupSizeIndex = groupingArray.length - 1;\n       currentGroupSizeIndex >= 0 && digitLenLeft > 0;\n       currentGroupSizeIndex--) {\n    currentGroupSize = groupingArray[currentGroupSizeIndex];\n    // Iterate from the right most digit\n    for (var rightDigitIndex = 0; rightDigitIndex < currentGroupSize &&\n         ((digitLenLeft - rightDigitIndex - 1) >= 0);\n         rightDigitIndex++) {\n      rightToLeftParts.push(String.fromCharCode(\n          zeroCode +\n          Number(intPart.charAt(digitLenLeft - rightDigitIndex - 1)) * 1));\n    }\n    // Update the number of digits left\n    digitLenLeft -= currentGroupSize;\n    if (digitLenLeft > 0) {\n      rightToLeftParts.push(grouping);\n    }\n  }\n  // Reverse and push onto the remaining parts\n  parts.push.apply(parts, rightToLeftParts.reverse());\n\n  return parts;\n};\n\n\n/**\n * Formats a Number in fraction format.\n *\n * @param {number} number\n * @param {number} minIntDigits Minimum integer digits.\n * @param {Array<string>} parts\n *     This array holds the pieces of formatted string.\n *     This function will add its formatted pieces to the array.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.subformatFixed_ = function(\n    number, minIntDigits, parts) {\n  if (this.minimumFractionDigits_ > this.maximumFractionDigits_) {\n    throw new Error('Min value must be less than max value');\n  }\n\n  if (!parts) {\n    parts = [];\n  }\n\n  var rounded = this.roundNumber_(number);\n  var intValue = rounded.intValue;\n  var fracValue = rounded.fracValue;\n\n  var numIntDigits = (intValue == 0) ? 0 : this.intLog10_(intValue) + 1;\n  var fractionPresent = this.minimumFractionDigits_ > 0 || fracValue > 0 ||\n      (this.showTrailingZeros_ && numIntDigits < this.significantDigits_);\n  var minimumFractionDigits = this.minimumFractionDigits_;\n  if (fractionPresent) {\n    if (this.showTrailingZeros_ && this.significantDigits_ > 0) {\n      minimumFractionDigits = this.significantDigits_ - numIntDigits;\n    } else {\n      minimumFractionDigits = this.minimumFractionDigits_;\n    }\n  }\n\n  var intPart = '';\n  var translatableInt = intValue;\n  while (translatableInt > 1E20) {\n    // here it goes beyond double precision, add '0' make it look better\n    intPart = '0' + intPart;\n    translatableInt =\n        Math.round(goog.i18n.NumberFormat.decimalShift_(translatableInt, -1));\n  }\n  intPart = translatableInt + intPart;\n\n  var decimal = this.getNumberFormatSymbols_().DECIMAL_SEP;\n  var zeroCode = this.getNumberFormatSymbols_().ZERO_DIGIT.charCodeAt(0);\n  var digitLen = intPart.length;\n  var nonRepeatedGroupCount = 0;\n\n  if (intValue > 0 || minIntDigits > 0) {\n    for (var i = digitLen; i < minIntDigits; i++) {\n      parts.push(String.fromCharCode(zeroCode));\n    }\n\n    // If there's more than 1 number grouping,\n    // figure out the length of the non-repeated groupings (on the right)\n    if (this.groupingArray_.length >= 2) {\n      for (var j = 1; j < this.groupingArray_.length; j++) {\n        nonRepeatedGroupCount += this.groupingArray_[j];\n      }\n    }\n\n    // Anything left of the fixed number grouping is repeated,\n    // figure out the length of repeated groupings (on the left)\n    var repeatedDigitLen = digitLen - nonRepeatedGroupCount;\n    if (repeatedDigitLen > 0) {\n      // There are repeating digits and non-repeating digits\n      parts = this.formatNumberGroupingRepeatingDigitsParts_(\n          parts, zeroCode, intPart, this.groupingArray_, repeatedDigitLen);\n    } else {\n      // There are no repeating digits and only non-repeating digits\n      parts = this.formatNumberGroupingNonRepeatingDigitsParts_(\n          parts, zeroCode, intPart, this.groupingArray_);\n    }\n  } else if (!fractionPresent) {\n    // If there is no fraction present, and we haven't printed any\n    // integer digits, then print a zero.\n    parts.push(String.fromCharCode(zeroCode));\n  }\n\n  // Output the decimal separator if we always do so.\n  if (this.decimalSeparatorAlwaysShown_ || fractionPresent) {\n    parts.push(decimal);\n  }\n\n  var fracPart = String(fracValue);\n  // Handle case where fracPart is in scientific notation.\n  var fracPartSplit = fracPart.split('e+');\n  if (fracPartSplit.length == 2) {\n    // Only keep significant digits.\n    var floatFrac = parseFloat(fracPartSplit[0]);\n    fracPart = String(\n        this.roundToSignificantDigits_(floatFrac, this.significantDigits_, 1));\n    fracPart = fracPart.replace('.', '');\n    // Append zeroes based on the exponent.\n    var exp = parseInt(fracPartSplit[1], 10);\n    fracPart += goog.string.repeat('0', exp - fracPart.length + 1);\n  }\n\n  // Add Math.pow(10, this.maximumFractionDigits) to fracPart. Uses string ops\n  // to avoid complexity with scientific notation and overflows.\n  if (this.maximumFractionDigits_ + 1 > fracPart.length) {\n    var zeroesToAdd = this.maximumFractionDigits_ - fracPart.length;\n    fracPart = '1' + goog.string.repeat('0', zeroesToAdd) + fracPart;\n  }\n\n  var fracLen = fracPart.length;\n  while (fracPart.charAt(fracLen - 1) == '0' &&\n         fracLen > minimumFractionDigits + 1) {\n    fracLen--;\n  }\n\n  for (var i = 1; i < fracLen; i++) {\n    parts.push(String.fromCharCode(zeroCode + Number(fracPart.charAt(i)) * 1));\n  }\n};\n\n\n/**\n * Formats exponent part of a Number.\n *\n * @param {number} exponent Exponential value.\n * @param {Array<string>} parts The array that holds the pieces of formatted\n *     string. This function will append more formatted pieces to the array.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.addExponentPart_ = function(exponent, parts) {\n  parts.push(this.getNumberFormatSymbols_().EXP_SYMBOL);\n\n  if (exponent < 0) {\n    exponent = -exponent;\n    parts.push(this.getNumberFormatSymbols_().MINUS_SIGN);\n  } else if (this.useSignForPositiveExponent_) {\n    parts.push(this.getNumberFormatSymbols_().PLUS_SIGN);\n  }\n\n  var exponentDigits = '' + exponent;\n  var zeroChar = this.getNumberFormatSymbols_().ZERO_DIGIT;\n  for (var i = exponentDigits.length; i < this.minExponentDigits_; i++) {\n    parts.push(zeroChar);\n  }\n  parts.push(exponentDigits);\n};\n\n/**\n * Returns the mantissa for the given value and its exponent.\n *\n * @param {number} value\n * @param {number} exponent\n * @return {number}\n * @private\n */\ngoog.i18n.NumberFormat.prototype.getMantissa_ = function(value, exponent) {\n  return goog.i18n.NumberFormat.decimalShift_(value, -exponent);\n};\n\n/**\n * Formats Number in exponential format.\n *\n * @param {number} number Value need to be formatted.\n * @param {Array<string>} parts The array that holds the pieces of formatted\n *     string. This function will append more formatted pieces to the array.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.subformatExponential_ = function(\n    number, parts) {\n  if (number == 0.0) {\n    this.subformatFixed_(number, this.minimumIntegerDigits_, parts);\n    this.addExponentPart_(0, parts);\n    return;\n  }\n\n  var exponent = goog.math.safeFloor(Math.log(number) / Math.log(10));\n  number = this.getMantissa_(number, exponent);\n\n  var minIntDigits = this.minimumIntegerDigits_;\n  if (this.maximumIntegerDigits_ > 1 &&\n      this.maximumIntegerDigits_ > this.minimumIntegerDigits_) {\n    // A repeating range is defined; adjust to it as follows.\n    // If repeat == 3, we have 6,5,4=>3; 3,2,1=>0; 0,-1,-2=>-3;\n    // -3,-4,-5=>-6, etc. This takes into account that the\n    // exponent we have here is off by one from what we expect;\n    // it is for the format 0.MMMMMx10^n.\n    var remainder = exponent % this.maximumIntegerDigits_;\n    if (remainder < 0) {\n      remainder = this.maximumIntegerDigits_ + remainder;\n    }\n\n    number = goog.i18n.NumberFormat.decimalShift_(number, remainder);\n    exponent -= remainder;\n\n    minIntDigits = 1;\n  } else {\n    // No repeating range is defined; use minimum integer digits.\n    if (this.minimumIntegerDigits_ < 1) {\n      exponent++;\n      number = goog.i18n.NumberFormat.decimalShift_(number, -1);\n    } else {\n      exponent -= this.minimumIntegerDigits_ - 1;\n      number = goog.i18n.NumberFormat.decimalShift_(\n          number, this.minimumIntegerDigits_ - 1);\n    }\n  }\n  this.subformatFixed_(number, minIntDigits, parts);\n  this.addExponentPart_(exponent, parts);\n};\n\n\n/**\n * Returns the digit value of current character. The character could be either\n * '0' to '9', or a locale specific digit.\n *\n * @param {string} ch Character that represents a digit.\n * @return {number} The digit value, or -1 on error.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.getDigit_ = function(ch) {\n  var code = ch.charCodeAt(0);\n  // between '0' to '9'\n  if (48 <= code && code < 58) {\n    return code - 48;\n  } else {\n    var zeroCode = this.getNumberFormatSymbols_().ZERO_DIGIT.charCodeAt(0);\n    return zeroCode <= code && code < zeroCode + 10 ? code - zeroCode : -1;\n  }\n};\n\n\n// ----------------------------------------------------------------------\n// CONSTANTS\n// ----------------------------------------------------------------------\n// Constants for characters used in programmatic (unlocalized) patterns.\n/**\n * A zero digit character.\n * @type {string}\n * @private\n */\ngoog.i18n.NumberFormat.PATTERN_ZERO_DIGIT_ = '0';\n\n\n/**\n * A grouping separator character.\n * @type {string}\n * @private\n */\ngoog.i18n.NumberFormat.PATTERN_GROUPING_SEPARATOR_ = ',';\n\n\n/**\n * A decimal separator character.\n * @type {string}\n * @private\n */\ngoog.i18n.NumberFormat.PATTERN_DECIMAL_SEPARATOR_ = '.';\n\n\n/**\n * A per mille character.\n * @type {string}\n * @private\n */\ngoog.i18n.NumberFormat.PATTERN_PER_MILLE_ = '\\u2030';\n\n\n/**\n * A percent character.\n * @type {string}\n * @private\n */\ngoog.i18n.NumberFormat.PATTERN_PERCENT_ = '%';\n\n\n/**\n * A digit character.\n * @type {string}\n * @private\n */\ngoog.i18n.NumberFormat.PATTERN_DIGIT_ = '#';\n\n\n/**\n * A separator character.\n * @type {string}\n * @private\n */\ngoog.i18n.NumberFormat.PATTERN_SEPARATOR_ = ';';\n\n\n/**\n * An exponent character.\n * @type {string}\n * @private\n */\ngoog.i18n.NumberFormat.PATTERN_EXPONENT_ = 'E';\n\n\n/**\n * A plus character.\n * @type {string}\n * @private\n */\ngoog.i18n.NumberFormat.PATTERN_PLUS_ = '+';\n\n\n/**\n * A generic currency sign character.\n * @type {string}\n * @private\n */\ngoog.i18n.NumberFormat.PATTERN_CURRENCY_SIGN_ = '\\u00A4';\n\n\n/**\n * A quote character.\n * @type {string}\n * @private\n */\ngoog.i18n.NumberFormat.QUOTE_ = '\\'';\n\n\n/**\n * Parses affix part of pattern.\n *\n * @param {string} pattern Pattern string that need to be parsed.\n * @param {Array<number>} pos One element position array to set and receive\n *     parsing position.\n *\n * @return {string} Affix received from parsing.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.parseAffix_ = function(pattern, pos) {\n  var affix = '';\n  var inQuote = false;\n  var len = pattern.length;\n\n  for (; pos[0] < len; pos[0]++) {\n    var ch = pattern.charAt(pos[0]);\n    if (ch == goog.i18n.NumberFormat.QUOTE_) {\n      if (pos[0] + 1 < len &&\n          pattern.charAt(pos[0] + 1) == goog.i18n.NumberFormat.QUOTE_) {\n        pos[0]++;\n        affix += '\\'';  // 'don''t'\n      } else {\n        inQuote = !inQuote;\n      }\n      continue;\n    }\n\n    if (inQuote) {\n      affix += ch;\n    } else {\n      switch (ch) {\n        case goog.i18n.NumberFormat.PATTERN_DIGIT_:\n        case goog.i18n.NumberFormat.PATTERN_ZERO_DIGIT_:\n        case goog.i18n.NumberFormat.PATTERN_GROUPING_SEPARATOR_:\n        case goog.i18n.NumberFormat.PATTERN_DECIMAL_SEPARATOR_:\n        case goog.i18n.NumberFormat.PATTERN_SEPARATOR_:\n          return affix;\n        case goog.i18n.NumberFormat.PATTERN_CURRENCY_SIGN_:\n          if ((pos[0] + 1) < len &&\n              pattern.charAt(pos[0] + 1) ==\n                  goog.i18n.NumberFormat.PATTERN_CURRENCY_SIGN_) {\n            pos[0]++;\n            affix += this.getCurrencyCode_();\n          } else {\n            switch (this.currencyStyle_) {\n              case goog.i18n.NumberFormat.CurrencyStyle.LOCAL:\n                affix += goog.i18n.currency.getLocalCurrencySignWithFallback(\n                    this.getCurrencyCode_());\n                break;\n              case goog.i18n.NumberFormat.CurrencyStyle.GLOBAL:\n                affix += goog.i18n.currency.getGlobalCurrencySignWithFallback(\n                    this.getCurrencyCode_());\n                break;\n              case goog.i18n.NumberFormat.CurrencyStyle.PORTABLE:\n                affix += goog.i18n.currency.getPortableCurrencySignWithFallback(\n                    this.getCurrencyCode_());\n                break;\n              default:\n                break;\n            }\n          }\n          break;\n        case goog.i18n.NumberFormat.PATTERN_PERCENT_:\n          if (!this.negativePercentSignExpected_ && this.multiplier_ != 1) {\n            throw new Error('Too many percent/permill');\n          } else if (\n              this.negativePercentSignExpected_ && this.multiplier_ != 100) {\n            throw new Error('Inconsistent use of percent/permill characters');\n          }\n          this.multiplier_ = 100;\n          this.negativePercentSignExpected_ = false;\n          affix += this.getNumberFormatSymbols_().PERCENT;\n          break;\n        case goog.i18n.NumberFormat.PATTERN_PER_MILLE_:\n          if (!this.negativePercentSignExpected_ && this.multiplier_ != 1) {\n            throw new Error('Too many percent/permill');\n          } else if (\n              this.negativePercentSignExpected_ && this.multiplier_ != 1000) {\n            throw new Error('Inconsistent use of percent/permill characters');\n          }\n          this.multiplier_ = 1000;\n          this.negativePercentSignExpected_ = false;\n          affix += this.getNumberFormatSymbols_().PERMILL;\n          break;\n        default:\n          affix += ch;\n      }\n    }\n  }\n\n  return affix;\n};\n\n\n/**\n * Parses the trunk part of a pattern.\n *\n * @param {string} pattern Pattern string that need to be parsed.\n * @param {Array<number>} pos One element position array to set and receive\n *     parsing position.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.parseTrunk_ = function(pattern, pos) {\n  var decimalPos = -1;\n  var digitLeftCount = 0;\n  var zeroDigitCount = 0;\n  var digitRightCount = 0;\n  var groupingCount = -1;\n  var len = pattern.length;\n  for (var loop = true; pos[0] < len && loop; pos[0]++) {\n    var ch = pattern.charAt(pos[0]);\n    switch (ch) {\n      case goog.i18n.NumberFormat.PATTERN_DIGIT_:\n        if (zeroDigitCount > 0) {\n          digitRightCount++;\n        } else {\n          digitLeftCount++;\n        }\n        if (groupingCount >= 0 && decimalPos < 0) {\n          groupingCount++;\n        }\n        break;\n      case goog.i18n.NumberFormat.PATTERN_ZERO_DIGIT_:\n        if (digitRightCount > 0) {\n          throw new Error('Unexpected \"0\" in pattern \"' + pattern + '\"');\n        }\n        zeroDigitCount++;\n        if (groupingCount >= 0 && decimalPos < 0) {\n          groupingCount++;\n        }\n        break;\n      case goog.i18n.NumberFormat.PATTERN_GROUPING_SEPARATOR_:\n        if (groupingCount > 0) {\n          this.groupingArray_.push(groupingCount);\n        }\n        groupingCount = 0;\n        break;\n      case goog.i18n.NumberFormat.PATTERN_DECIMAL_SEPARATOR_:\n        if (decimalPos >= 0) {\n          throw new Error(\n              'Multiple decimal separators in pattern \"' + pattern + '\"');\n        }\n        decimalPos = digitLeftCount + zeroDigitCount + digitRightCount;\n        break;\n      case goog.i18n.NumberFormat.PATTERN_EXPONENT_:\n        if (this.useExponentialNotation_) {\n          throw new Error(\n              'Multiple exponential symbols in pattern \"' + pattern + '\"');\n        }\n        this.useExponentialNotation_ = true;\n        this.minExponentDigits_ = 0;\n\n        // exponent pattern can have a optional '+'.\n        if ((pos[0] + 1) < len &&\n            pattern.charAt(pos[0] + 1) ==\n                goog.i18n.NumberFormat.PATTERN_PLUS_) {\n          pos[0]++;\n          this.useSignForPositiveExponent_ = true;\n        }\n\n        // Use lookahead to parse out the exponential part\n        // of the pattern, then jump into phase 2.\n        while ((pos[0] + 1) < len &&\n               pattern.charAt(pos[0] + 1) ==\n                   goog.i18n.NumberFormat.PATTERN_ZERO_DIGIT_) {\n          pos[0]++;\n          this.minExponentDigits_++;\n        }\n\n        if ((digitLeftCount + zeroDigitCount) < 1 ||\n            this.minExponentDigits_ < 1) {\n          throw new Error('Malformed exponential pattern \"' + pattern + '\"');\n        }\n        loop = false;\n        break;\n      default:\n        pos[0]--;\n        loop = false;\n        break;\n    }\n  }\n\n  if (zeroDigitCount == 0 && digitLeftCount > 0 && decimalPos >= 0) {\n    // Handle '###.###' and '###.' and '.###'\n    var n = decimalPos;\n    if (n == 0) {  // Handle '.###'\n      n++;\n    }\n    digitRightCount = digitLeftCount - n;\n    digitLeftCount = n - 1;\n    zeroDigitCount = 1;\n  }\n\n  // Do syntax checking on the digits.\n  if (decimalPos < 0 && digitRightCount > 0 ||\n      decimalPos >= 0 && (decimalPos < digitLeftCount ||\n                          decimalPos > digitLeftCount + zeroDigitCount) ||\n      groupingCount == 0) {\n    throw new Error('Malformed pattern \"' + pattern + '\"');\n  }\n  var totalDigits = digitLeftCount + zeroDigitCount + digitRightCount;\n\n  this.maximumFractionDigits_ = decimalPos >= 0 ? totalDigits - decimalPos : 0;\n  if (decimalPos >= 0) {\n    this.minimumFractionDigits_ = digitLeftCount + zeroDigitCount - decimalPos;\n    if (this.minimumFractionDigits_ < 0) {\n      this.minimumFractionDigits_ = 0;\n    }\n  }\n\n  // The effectiveDecimalPos is the position the decimal is at or would be at\n  // if there is no decimal. Note that if decimalPos<0, then digitTotalCount ==\n  // digitLeftCount + zeroDigitCount.\n  var effectiveDecimalPos = decimalPos >= 0 ? decimalPos : totalDigits;\n  this.minimumIntegerDigits_ = effectiveDecimalPos - digitLeftCount;\n  if (this.useExponentialNotation_) {\n    this.maximumIntegerDigits_ = digitLeftCount + this.minimumIntegerDigits_;\n\n    // in exponential display, we need to at least show something.\n    if (this.maximumFractionDigits_ == 0 && this.minimumIntegerDigits_ == 0) {\n      this.minimumIntegerDigits_ = 1;\n    }\n  }\n\n  // Add another number grouping at the end\n  this.groupingArray_.push(Math.max(0, groupingCount));\n  this.decimalSeparatorAlwaysShown_ =\n      decimalPos == 0 || decimalPos == totalDigits;\n};\n\n\n/**\n * Alias for the compact format 'unit' object.\n * @typedef {{\n *     prefix: string,\n *     suffix: string,\n *     divisorBase: number\n * }}\n */\ngoog.i18n.NumberFormat.CompactNumberUnit;\n\n\n/**\n * The empty unit, corresponding to a base of 0.\n * @private {!goog.i18n.NumberFormat.CompactNumberUnit}\n */\ngoog.i18n.NumberFormat.NULL_UNIT_ = {\n  prefix: '',\n  suffix: '',\n  divisorBase: 0\n};\n\n\n/**\n * Get compact unit for a certain number of digits\n *\n * @param {number} base The number of digits to get the unit for.\n * @param {string} plurality The plurality of the number.\n * @return {!goog.i18n.NumberFormat.CompactNumberUnit} The compact unit.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.getUnitFor_ = function(base, plurality) {\n  var table = this.compactStyle_ == goog.i18n.NumberFormat.CompactStyle.SHORT ?\n      goog.i18n.CompactNumberFormatSymbols.COMPACT_DECIMAL_SHORT_PATTERN :\n      goog.i18n.CompactNumberFormatSymbols.COMPACT_DECIMAL_LONG_PATTERN;\n\n  if (table == null) {\n    table = goog.i18n.CompactNumberFormatSymbols.COMPACT_DECIMAL_SHORT_PATTERN;\n  }\n\n  if (base < 3) {\n    return goog.i18n.NumberFormat.NULL_UNIT_;\n  } else {\n    var shift = goog.i18n.NumberFormat.decimalShift_;\n\n    base = Math.min(14, base);\n    var patterns = table[shift(1, base)];\n    var previousNonNullBase = base - 1;\n    while (!patterns && previousNonNullBase >= 3) {\n      patterns = table[shift(1, previousNonNullBase)];\n      previousNonNullBase--;\n    }\n    if (!patterns) {\n      return goog.i18n.NumberFormat.NULL_UNIT_;\n    }\n\n    var pattern = patterns[plurality];\n    if (!pattern || pattern == '0') {\n      return goog.i18n.NumberFormat.NULL_UNIT_;\n    }\n\n    var parts = /([^0]*)(0+)(.*)/.exec(pattern);\n    if (!parts) {\n      return goog.i18n.NumberFormat.NULL_UNIT_;\n    }\n\n    return {\n      prefix: parts[1],\n      suffix: parts[3],\n      divisorBase: (previousNonNullBase + 1) - (parts[2].length - 1)\n    };\n  }\n};\n\n\n/**\n * Get the compact unit divisor, accounting for rounding of the quantity.\n *\n * @param {number} formattingNumber The number to base the formatting on. The\n *     unit will be calculated from this number.\n * @param {number} pluralityNumber The number to use for calculating the\n *     plurality.\n * @return {!goog.i18n.NumberFormat.CompactNumberUnit} The unit after rounding.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.getUnitAfterRounding_ = function(\n    formattingNumber, pluralityNumber) {\n  if (this.compactStyle_ == goog.i18n.NumberFormat.CompactStyle.NONE) {\n    return goog.i18n.NumberFormat.NULL_UNIT_;\n  }\n\n  formattingNumber = Math.abs(formattingNumber);\n  pluralityNumber = Math.abs(pluralityNumber);\n\n  var initialPlurality = this.pluralForm_(formattingNumber);\n  // Compute the exponent from the formattingNumber, to compute the unit.\n  var base = formattingNumber <= 1 ? 0 : this.intLog10_(formattingNumber);\n  var initialDivisor = this.getUnitFor_(base, initialPlurality).divisorBase;\n  // Round both numbers based on the unit used.\n  var pluralityAttempt =\n      goog.i18n.NumberFormat.decimalShift_(pluralityNumber, -initialDivisor);\n  var pluralityRounded = this.roundNumber_(pluralityAttempt);\n  var formattingAttempt =\n      goog.i18n.NumberFormat.decimalShift_(formattingNumber, -initialDivisor);\n  var formattingRounded = this.roundNumber_(formattingAttempt);\n  // Compute the plurality of the pluralityNumber when formatted using the name\n  // units as the formattingNumber.\n  var finalPlurality =\n      this.pluralForm_(pluralityRounded.intValue + pluralityRounded.fracValue);\n  // Get the final unit, using the rounded formatting number to get the correct\n  // unit, and the plurality computed from the pluralityNumber.\n  return this.getUnitFor_(\n      initialDivisor + this.intLog10_(formattingRounded.intValue),\n      finalPlurality);\n};\n\n\n/**\n * Get the integer base 10 logarithm of a number.\n *\n * @param {number} number The number to log.\n * @return {number} The lowest integer n such that 10^n >= number.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.intLog10_ = function(number) {\n  // Handle infinity.\n  if (!isFinite(number)) {\n    return number > 0 ? number : 0;\n  }\n  // Turns out Math.log(1000000)/Math.LN10 is strictly less than 6.\n  // TODO(nickreid): Make this use `decimalShift_` or use another more effecient\n  // string-based method.\n  var i = 0;\n  while ((number /= 10) >= 1) i++;\n  return i;\n};\n\n/**\n * Shifts `number` by `digitCount` decimal digits.\n *\n * This function corrects for rounding error that may occur when naively\n * multiplying or dividing by a power of 10. See:\n * https://en.wikipedia.org/wiki/Floating-point_arithmetic#Accuracy_problems\n * Example: `1.1e27 / Math.pow(10, 12)  != 1.1e15`.\n *\n * This function does not correct for inherent limitations in the precision of\n * JavaScript numbers.\n *\n * @param {number} number The number to shift.\n * @param {number} digitCount The number of places by which to shift number.\n *     Must be an integer. May be positive or negative.\n * @return {number}\n * @private\n */\ngoog.i18n.NumberFormat.decimalShift_ = function(number, digitCount) {\n  goog.asserts.assert(\n      digitCount % 1 == 0, 'Cannot shift by fractional digits \"%s\".',\n      digitCount);\n\n  // Make sure to cover all numbers that stringify to something that doesn't\n  // look like a number.\n  if (!number || !isFinite(number) || digitCount == 0) {\n    return number;\n  }\n\n  // This method isn't efficient, but it has the exact behaviour we want without\n  // worrying about floating-point math edge cases.\n  var numParts = String(number).split('e');\n  var magnitude = parseInt(numParts[1] || 0, 10) + digitCount;\n  return parseFloat(numParts[0] + 'e' + magnitude);\n};\n\n/**\n * Rounds `number` to `decimalCount` decimal places.\n *\n * Negative values of `decimalCount` will eliminate integeral digits.\n *\n * This function corrects for rounding error that may occur when naively\n * multiplying by a power of 10.\n *\n * This function does not correct for inherent limitations in the precision of\n * JavaScript numbers.\n *\n * @param {number} number The number to round.\n * @param {number} decimalCount The number of decimal places to retain.\n *     Must be an integer. May be positive or negative.\n * @return {number}\n * @private\n */\ngoog.i18n.NumberFormat.decimalRound_ = function(number, decimalCount) {\n  goog.asserts.assert(\n      decimalCount % 1 == 0, 'Cannot round to fractional digits \"%s\".',\n      decimalCount);\n\n  if (!number || !isFinite(number)) {\n    return number;\n  }\n\n  var shift = goog.i18n.NumberFormat.decimalShift_;\n  return shift(Math.round(shift(number, decimalCount)), -decimalCount);\n};\n\n\n/**\n * Round to a certain number of significant digits.\n *\n * @param {number} number The number to round.\n * @param {number} significantDigits The number of significant digits\n *     to round to.\n * @param {number} scale Treat number as fixed point times 10^scale.\n * @return {number} The rounded number.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.roundToSignificantDigits_ = function(\n    number, significantDigits, scale) {\n  if (!number) return number;\n\n  var digits = this.intLog10_(number);\n  var magnitude = significantDigits - digits - 1;\n\n  // Only round fraction, not (potentially shifted) integers.\n  if (magnitude < -scale) {\n    return goog.i18n.NumberFormat.decimalRound_(number, -scale);\n  } else {\n    return goog.i18n.NumberFormat.decimalRound_(number, magnitude);\n  }\n};\n\n\n/**\n * Get the plural form of a number.\n * @param {number} quantity The quantity to find plurality of.\n * @return {string} One of 'zero', 'one', 'two', 'few', 'many', 'other'.\n * @private\n */\ngoog.i18n.NumberFormat.prototype.pluralForm_ = function(quantity) {\n  /* TODO: Implement */\n  return 'other';\n};\n\n\n/**\n * Checks if the currency symbol comes before the value ($12) or after (12$)\n * Handy for applications that need to have separate UI fields for the currency\n * value and symbol, especially for input: Price: [USD] [123.45]\n * The currency symbol might be a combo box, or a label.\n *\n * @return {boolean} true if currency is before value.\n */\ngoog.i18n.NumberFormat.prototype.isCurrencyCodeBeforeValue = function() {\n  var posCurrSymbol = this.pattern_.indexOf('\\u00A4');  // '¤' Currency sign\n  var posPound = this.pattern_.indexOf('#');\n  var posZero = this.pattern_.indexOf('0');\n\n  // posCurrValue is the first '#' or '0' found.\n  // If none of them is found (not possible, but still),\n  // the result is true (postCurrSymbol < MAX_VALUE)\n  // That is OK, matches the en_US and ROOT locales.\n  var posCurrValue = Number.MAX_VALUE;\n  if (posPound >= 0 && posPound < posCurrValue) {\n    posCurrValue = posPound;\n  }\n  if (posZero >= 0 && posZero < posCurrValue) {\n    posCurrValue = posZero;\n  }\n\n  // No need to test, it is guaranteed that both these symbols exist.\n  // If not, we have bigger problems than this.\n  return posCurrSymbol < posCurrValue;\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","~$goog.i18n.currency","^K7","^IT","~$goog.i18n.NumberFormatSymbols-u-nu-latn","~$goog.math","^IU","~$goog.i18n.NumberFormatSymbols"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/numberformat.js"],"^JD",["^J4",["~$goog.i18n.NumberFormat.Format","~$goog.i18n.NumberFormat","~$goog.i18n.NumberFormat.CurrencyStyle"]],"^IR",true,"^IS",["^IT","^JF","^IU","^L[","^LY","^LX","^LZ","^K7"]],["^ ","^KY",[],"^KZ",true,"^K[",false,"^IV",[1579837703000],"^L0",[],"^L1",[],"^L2",[],"^L3","es3","^L4",null,"^L5","~$module$goog$transitionalforwarddeclarations","^IW","module$goog$transitionalforwarddeclarations.js","^IX",["^IY","goog/transitionalforwarddeclarations.js"],"^IZ","goog/transitionalforwarddeclarations.js","^I[","^L7","^L8",[],"^J1","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview The forward declarations in this file are here to faciliate\n * the removal of \"deps.js\" from the \"base\" rule.  These types are\n * included in various extern files.  These rules should be cleaned up\n * so that these declarations aren't necessary.\n * @suppress {extraRequire}\n */\n\ngoog.forwardDeclare('goog.Promise');\ngoog.forwardDeclare('goog.date.DateLike');\ngoog.forwardDeclare('goog.date.DateTime');\ngoog.forwardDeclare('goog.events.EventId');\ngoog.forwardDeclare('goog.events.Key');\ngoog.forwardDeclare('goog.events.KeyCodes');\ngoog.forwardDeclare('goog.i18n.TimeZone');\ngoog.forwardDeclare('goog.math.Range');\ngoog.forwardDeclare('goog.math.Size');\ngoog.forwardDeclare('goog.structs.Map');\n","^J2",1579837703000,"^J3",["^J4",[]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^L9",[],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/transitionalforwarddeclarations.js"],"^JD",["^J4",["^M3"]],"^L:",false,"^IR",true,"^IS",[],"^L;",false],["^ ","^IV",[1579837703000],"^IW","goog.events.eventhandler.js","^IX",["^IY","goog/events/eventhandler.js"],"^IZ","goog/events/eventhandler.js","^I[","^J0","^J1","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class to create objects which want to handle multiple events\n * and have their listeners easily cleaned up via a dispose method.\n *\n * Example:\n * <pre>\n * function Something() {\n *   Something.base(this);\n *\n *   ... set up object ...\n *\n *   // Add event listeners\n *   this.listen(this.starEl, goog.events.EventType.CLICK, this.handleStar);\n *   this.listen(this.headerEl, goog.events.EventType.CLICK, this.expand);\n *   this.listen(this.collapseEl, goog.events.EventType.CLICK, this.collapse);\n *   this.listen(this.infoEl, goog.events.EventType.MOUSEOVER, this.showHover);\n *   this.listen(this.infoEl, goog.events.EventType.MOUSEOUT, this.hideHover);\n * }\n * goog.inherits(Something, goog.events.EventHandler);\n *\n * Something.prototype.disposeInternal = function() {\n *   Something.base(this, 'disposeInternal');\n *   goog.dom.removeNode(this.container);\n * };\n *\n *\n * // Then elsewhere:\n *\n * var activeSomething = null;\n * function openSomething() {\n *   activeSomething = new Something();\n * }\n *\n * function closeSomething() {\n *   if (activeSomething) {\n *     activeSomething.dispose();  // Remove event listeners\n *     activeSomething = null;\n *   }\n * }\n * </pre>\n *\n */\n\ngoog.provide('goog.events.EventHandler');\n\ngoog.forwardDeclare('goog.events.EventWrapper');\ngoog.require('goog.Disposable');\ngoog.require('goog.events');\ngoog.require('goog.object');\n\n\n\n/**\n * Super class for objects that want to easily manage a number of event\n * listeners.  It allows a short cut to listen and also provides a quick way\n * to remove all events listeners belonging to this object.\n * @param {SCOPE=} opt_scope Object in whose scope to call the listeners.\n * @constructor\n * @extends {goog.Disposable}\n * @template SCOPE\n */\ngoog.events.EventHandler = function(opt_scope) {\n  goog.Disposable.call(this);\n  // TODO(mknichel): Rename this to this.scope_ and fix the classes in google3\n  // that access this private variable. :(\n  this.handler_ = opt_scope;\n\n  /**\n   * Keys for events that are being listened to.\n   * @type {!Object<!goog.events.Key>}\n   * @private\n   */\n  this.keys_ = {};\n};\ngoog.inherits(goog.events.EventHandler, goog.Disposable);\n\n\n/**\n * Utility array used to unify the cases of listening for an array of types\n * and listening for a single event, without using recursion or allocating\n * an array each time.\n * @type {!Array<string>}\n * @const\n * @private\n */\ngoog.events.EventHandler.typeArray_ = [];\n\n\n/**\n * Listen to an event on a Listenable.  If the function is omitted then the\n * EventHandler's handleEvent method will be used.\n * @param {goog.events.ListenableType} src Event source.\n * @param {string|Array<string>|\n *     !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n *     type Event type to listen for or array of event types.\n * @param {function(this:SCOPE, EVENTOBJ):?|{handleEvent:function(?):?}|null=}\n *     opt_fn Optional callback function to be used as the listener or an object\n *     with handleEvent function.\n * @param {(boolean|!AddEventListenerOptions)=} opt_options\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template EVENTOBJ, THIS\n */\ngoog.events.EventHandler.prototype.listen = function(\n    src, type, opt_fn, opt_options) {\n  var self = /** @type {!goog.events.EventHandler} */ (this);\n  return self.listen_(src, type, opt_fn, opt_options);\n};\n\n\n/**\n * Listen to an event on a Listenable.  If the function is omitted then the\n * EventHandler's handleEvent method will be used.\n * @param {goog.events.ListenableType} src Event source.\n * @param {string|Array<string>|\n *     !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n *     type Event type to listen for or array of event types.\n * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(this:T, ?):?}|\n *     null|undefined} fn Optional callback function to be used as the\n *     listener or an object with handleEvent function.\n * @param {boolean|!AddEventListenerOptions|undefined} options\n * @param {T} scope Object in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template T, EVENTOBJ, THIS\n */\ngoog.events.EventHandler.prototype.listenWithScope = function(\n    src, type, fn, options, scope) {\n  var self = /** @type {!goog.events.EventHandler} */ (this);\n  // TODO(mknichel): Deprecate this function.\n  return self.listen_(src, type, fn, options, scope);\n};\n\n\n/**\n * Listen to an event on a Listenable.  If the function is omitted then the\n * EventHandler's handleEvent method will be used.\n * @param {goog.events.ListenableType} src Event source.\n * @param {string|Array<string>|\n *     !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n *     type Event type to listen for or array of event types.\n * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null=} opt_fn\n *     Optional callback function to be used as the listener or an object with\n *     handleEvent function.\n * @param {(boolean|!AddEventListenerOptions)=} opt_options\n * @param {Object=} opt_scope Object in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template EVENTOBJ, THIS\n * @private\n */\ngoog.events.EventHandler.prototype.listen_ = function(\n    src, type, opt_fn, opt_options, opt_scope) {\n  var self = /** @type {!goog.events.EventHandler} */ (this);\n  if (!goog.isArray(type)) {\n    if (type) {\n      goog.events.EventHandler.typeArray_[0] = type.toString();\n    }\n    type = goog.events.EventHandler.typeArray_;\n  }\n  for (var i = 0; i < type.length; i++) {\n    var listenerObj = goog.events.listen(\n        src, type[i], opt_fn || self.handleEvent, opt_options || false,\n        opt_scope || self.handler_ || self);\n\n    if (!listenerObj) {\n      // When goog.events.listen run on OFF_AND_FAIL or OFF_AND_SILENT\n      // (goog.events.CaptureSimulationMode) in IE8-, it will return null\n      // value.\n      return self;\n    }\n\n    var key = listenerObj.key;\n    self.keys_[key] = listenerObj;\n  }\n\n  return self;\n};\n\n\n/**\n * Listen to an event on a Listenable.  If the function is omitted, then the\n * EventHandler's handleEvent method will be used. After the event has fired the\n * event listener is removed from the target. If an array of event types is\n * provided, each event type will be listened to once.\n * @param {goog.events.ListenableType} src Event source.\n * @param {string|Array<string>|\n *     !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n *     type Event type to listen for or array of event types.\n * @param {function(this:SCOPE, EVENTOBJ):?|{handleEvent:function(?):?}|null=}\n * opt_fn\n *    Optional callback function to be used as the listener or an object with\n *    handleEvent function.\n * @param {(boolean|!AddEventListenerOptions)=} opt_options\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template EVENTOBJ, THIS\n */\ngoog.events.EventHandler.prototype.listenOnce = function(\n    src, type, opt_fn, opt_options) {\n  var self = /** @type {!goog.events.EventHandler} */ (this);\n  return self.listenOnce_(src, type, opt_fn, opt_options);\n};\n\n\n/**\n * Listen to an event on a Listenable.  If the function is omitted, then the\n * EventHandler's handleEvent method will be used. After the event has fired the\n * event listener is removed from the target. If an array of event types is\n * provided, each event type will be listened to once.\n * @param {goog.events.ListenableType} src Event source.\n * @param {string|Array<string>|\n *     !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n *     type Event type to listen for or array of event types.\n * @param {function(this:T, EVENTOBJ):?|{handleEvent:function(this:T, ?):?}|\n *     null|undefined} fn Optional callback function to be used as the\n *     listener or an object with handleEvent function.\n * @param {boolean|undefined} capture Optional whether to use capture phase.\n * @param {T} scope Object in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template T, EVENTOBJ, THIS\n */\ngoog.events.EventHandler.prototype.listenOnceWithScope = function(\n    src, type, fn, capture, scope) {\n  var self = /** @type {!goog.events.EventHandler} */ (this);\n  // TODO(mknichel): Deprecate this function.\n  return self.listenOnce_(src, type, fn, capture, scope);\n};\n\n\n/**\n * Listen to an event on a Listenable.  If the function is omitted, then the\n * EventHandler's handleEvent method will be used. After the event has fired\n * the event listener is removed from the target. If an array of event types is\n * provided, each event type will be listened to once.\n * @param {goog.events.ListenableType} src Event source.\n * @param {string|Array<string>|\n *     !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n *     type Event type to listen for or array of event types.\n * @param {function(EVENTOBJ):?|{handleEvent:function(?):?}|null=} opt_fn\n *    Optional callback function to be used as the listener or an object with\n *    handleEvent function.\n * @param {(boolean|!AddEventListenerOptions)=} opt_options\n * @param {Object=} opt_scope Object in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template EVENTOBJ, THIS\n * @private\n */\ngoog.events.EventHandler.prototype.listenOnce_ = function(\n    src, type, opt_fn, opt_options, opt_scope) {\n  var self = /** @type {!goog.events.EventHandler} */ (this);\n  if (goog.isArray(type)) {\n    for (var i = 0; i < type.length; i++) {\n      self.listenOnce_(src, type[i], opt_fn, opt_options, opt_scope);\n    }\n  } else {\n    var listenerObj = goog.events.listenOnce(\n        src, type, opt_fn || self.handleEvent, opt_options,\n        opt_scope || self.handler_ || self);\n    if (!listenerObj) {\n      // When goog.events.listen run on OFF_AND_FAIL or OFF_AND_SILENT\n      // (goog.events.CaptureSimulationMode) in IE8-, it will return null\n      // value.\n      return self;\n    }\n\n    var key = listenerObj.key;\n    self.keys_[key] = listenerObj;\n  }\n\n  return self;\n};\n\n\n/**\n * Adds an event listener with a specific event wrapper on a DOM Node or an\n * object that has implemented {@link goog.events.EventTarget}. A listener can\n * only be added once to an object.\n *\n * @param {EventTarget|goog.events.EventTarget} src The node to listen to\n *     events on.\n * @param {goog.events.EventWrapper} wrapper Event wrapper to use.\n * @param {function(this:SCOPE, ?):?|{handleEvent:function(?):?}|null} listener\n *     Callback method, or an object with a handleEvent function.\n * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to\n *     false).\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template THIS\n */\ngoog.events.EventHandler.prototype.listenWithWrapper = function(\n    src, wrapper, listener, opt_capt) {\n  var self = /** @type {!goog.events.EventHandler} */ (this);\n  // TODO(mknichel): Remove the opt_scope from this function and then\n  // templatize it.\n  return self.listenWithWrapper_(src, wrapper, listener, opt_capt);\n};\n\n\n/**\n * Adds an event listener with a specific event wrapper on a DOM Node or an\n * object that has implemented {@link goog.events.EventTarget}. A listener can\n * only be added once to an object.\n *\n * @param {EventTarget|goog.events.EventTarget} src The node to listen to\n *     events on.\n * @param {goog.events.EventWrapper} wrapper Event wrapper to use.\n * @param {function(this:T, ?):?|{handleEvent:function(this:T, ?):?}|null}\n *     listener Optional callback function to be used as the\n *     listener or an object with handleEvent function.\n * @param {boolean|undefined} capture Optional whether to use capture phase.\n * @param {T} scope Object in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template T, THIS\n */\ngoog.events.EventHandler.prototype.listenWithWrapperAndScope = function(\n    src, wrapper, listener, capture, scope) {\n  var self = /** @type {!goog.events.EventHandler} */ (this);\n  // TODO(mknichel): Deprecate this function.\n  return self.listenWithWrapper_(src, wrapper, listener, capture, scope);\n};\n\n\n/**\n * Adds an event listener with a specific event wrapper on a DOM Node or an\n * object that has implemented {@link goog.events.EventTarget}. A listener can\n * only be added once to an object.\n *\n * @param {EventTarget|goog.events.EventTarget} src The node to listen to\n *     events on.\n * @param {goog.events.EventWrapper} wrapper Event wrapper to use.\n * @param {function(?):?|{handleEvent:function(?):?}|null} listener Callback\n *     method, or an object with a handleEvent function.\n * @param {boolean=} opt_capt Whether to fire in capture phase (defaults to\n *     false).\n * @param {Object=} opt_scope Element in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template THIS\n * @private\n */\ngoog.events.EventHandler.prototype.listenWithWrapper_ = function(\n    src, wrapper, listener, opt_capt, opt_scope) {\n  var self = /** @type {!goog.events.EventHandler} */ (this);\n  wrapper.listen(\n      src, listener, opt_capt, opt_scope || self.handler_ || self, self);\n  return self;\n};\n\n\n/**\n * @return {number} Number of listeners registered by this handler.\n */\ngoog.events.EventHandler.prototype.getListenerCount = function() {\n  var count = 0;\n  for (var key in this.keys_) {\n    if (Object.prototype.hasOwnProperty.call(this.keys_, key)) {\n      count++;\n    }\n  }\n  return count;\n};\n\n\n/**\n * Unlistens on an event.\n * @param {goog.events.ListenableType} src Event source.\n * @param {string|Array<string>|\n *     !goog.events.EventId<EVENTOBJ>|!Array<!goog.events.EventId<EVENTOBJ>>}\n *     type Event type or array of event types to unlisten to.\n * @param {function(this:?, EVENTOBJ):?|{handleEvent:function(?):?}|null=}\n *     opt_fn Optional callback function to be used as the listener or an object\n *     with handleEvent function.\n * @param {(boolean|!EventListenerOptions)=} opt_options\n * @param {Object=} opt_scope Object in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template EVENTOBJ, THIS\n */\ngoog.events.EventHandler.prototype.unlisten = function(\n    src, type, opt_fn, opt_options, opt_scope) {\n  var self = /** @type {!goog.events.EventHandler} */ (this);\n  if (goog.isArray(type)) {\n    for (var i = 0; i < type.length; i++) {\n      self.unlisten(src, type[i], opt_fn, opt_options, opt_scope);\n    }\n  } else {\n    var capture =\n        goog.isObject(opt_options) ? !!opt_options.capture : !!opt_options;\n    var listener = goog.events.getListener(\n        src, type, opt_fn || self.handleEvent, capture,\n        opt_scope || self.handler_ || self);\n\n    if (listener) {\n      goog.events.unlistenByKey(listener);\n      delete self.keys_[listener.key];\n    }\n  }\n\n  return self;\n};\n\n\n/**\n * Removes an event listener which was added with listenWithWrapper().\n *\n * @param {EventTarget|goog.events.EventTarget} src The target to stop\n *     listening to events on.\n * @param {goog.events.EventWrapper} wrapper Event wrapper to use.\n * @param {function(?):?|{handleEvent:function(?):?}|null} listener The\n *     listener function to remove.\n * @param {boolean=} opt_capt In DOM-compliant browsers, this determines\n *     whether the listener is fired during the capture or bubble phase of the\n *     event.\n * @param {Object=} opt_scope Element in whose scope to call the listener.\n * @return {THIS} This object, allowing for chaining of calls.\n * @this {THIS}\n * @template THIS\n */\ngoog.events.EventHandler.prototype.unlistenWithWrapper = function(\n    src, wrapper, listener, opt_capt, opt_scope) {\n  var self = /** @type {!goog.events.EventHandler} */ (this);\n  wrapper.unlisten(\n      src, listener, opt_capt, opt_scope || self.handler_ || self, self);\n  return self;\n};\n\n\n/**\n * Unlistens to all events.\n */\ngoog.events.EventHandler.prototype.removeAll = function() {\n  goog.object.forEach(this.keys_, function(listenerObj, key) {\n    if (this.keys_.hasOwnProperty(key)) {\n      goog.events.unlistenByKey(listenerObj);\n    }\n  }, this);\n\n  this.keys_ = {};\n};\n\n\n/**\n * Disposes of this EventHandler and removes all listeners that it registered.\n * @override\n * @protected\n */\ngoog.events.EventHandler.prototype.disposeInternal = function() {\n  goog.events.EventHandler.superClass_.disposeInternal.call(this);\n  this.removeAll();\n};\n\n\n/**\n * Default event handler\n * @param {goog.events.Event} e Event object.\n */\ngoog.events.EventHandler.prototype.handleEvent = function(e) {\n  throw new Error('EventHandler.handleEvent not implemented');\n};\n","^J2",1579837703000,"^J3",["^J4",["^IT","^KS","^LV","~$goog.events"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/eventhandler.js"],"^JD",["^J4",["~$goog.events.EventHandler"]],"^IR",true,"^IS",["^IT","^LV","^M4","^KS"]],["^ ","^IV",[1579837703000],"^IW","goog.testing.testqueue.js","^IX",["^IY","goog/testing/testqueue.js"],"^IZ","goog/testing/testqueue.js","^I[","^J0","^J1","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Generic queue for writing unit tests.\n */\n\ngoog.setTestOnly('goog.testing.TestQueue');\ngoog.provide('goog.testing.TestQueue');\n\n\n\n/**\n * Generic queue for writing unit tests\n * @constructor\n */\ngoog.testing.TestQueue = function() {\n  /**\n   * Events that have accumulated\n   * @type {Array<Object>}\n   * @private\n   */\n  this.events_ = [];\n};\n\n\n/**\n * Adds a new event onto the queue.\n * @param {Object} event The event to queue.\n */\ngoog.testing.TestQueue.prototype.enqueue = function(event) {\n  this.events_.push(event);\n};\n\n\n/**\n * Returns whether the queue is empty.\n * @return {boolean} Whether the queue is empty.\n */\ngoog.testing.TestQueue.prototype.isEmpty = function() {\n  return this.events_.length == 0;\n};\n\n\n/**\n * Gets the next event from the queue. Throws an exception if the queue is\n * empty.\n * @param {string=} opt_comment Comment if the queue is empty.\n * @return {Object} The next event from the queue.\n */\ngoog.testing.TestQueue.prototype.dequeue = function(opt_comment) {\n  if (this.isEmpty()) {\n    throw new Error('Handler is empty: ' + opt_comment);\n  }\n  return this.events_.shift();\n};\n","^J2",1579837703000,"^J3",["^J4",["^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/testqueue.js"],"^JD",["^J4",["~$goog.testing.TestQueue"]],"^IR",true,"^IS",["^IT"]],["^ ","^IV",[1579837703000],"^IW","goog.ui.drilldownrow.js","^IX",["^IY","goog/ui/drilldownrow.js"],"^IZ","goog/ui/drilldownrow.js","^I[","^J0","^J1","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Tree-like drilldown components for HTML tables.\n *\n * This component supports expanding and collapsing groups of rows in\n * HTML tables.  The behavior is like typical Tree widgets, but tables\n * need special support to enable the tree behaviors.\n *\n * Any row or rows in an HTML table can be DrilldownRows.  The root\n * DrilldownRow nodes are always visible in the table, but the rest show\n * or hide as input events expand and collapse their ancestors.\n *\n * Programming them:  Top-level DrilldownRows are made by decorating\n * a TR element.  Children are made with addChild or addChildAt, and\n * are entered into the document by the render() method.\n *\n * A DrilldownRow can have any number of children.  If it has no children\n * it can be loaded, not loaded, or with a load in progress.\n * Top-level DrilldownRows are always displayed (though setting\n * style.display on a containing DOM node could make one be not\n * visible to the user).  A DrilldownRow can be expanded, or not.  A\n * DrilldownRow displays if all of its ancestors are expanded.\n *\n * Set up event handlers and style each row for the application in an\n * enterDocument method.\n *\n * Children normally render into the document lazily, at the first\n * moment when all ancestors are expanded.\n *\n * @see ../demos/drilldownrow.html\n */\n\n// TODO(user): Build support for dynamically loading DrilldownRows,\n// probably using automplete as an example to follow.\n\n// TODO(user): Make DrilldownRows accessible through the keyboard.\n\n// The render method is redefined in this class because when addChildAt renders\n// the new child it assumes that the child's DOM node will be a child\n// of the parent component's DOM node, but all DOM nodes of DrilldownRows\n// in the same tree of DrilldownRows are siblings to each other.\n//\n// Arguments (or lack of arguments) to the render methods in Component\n// all determine the place of the new DOM node in the DOM tree, but\n// the place of a new DrilldownRow in the DOM needs to be determined by\n// its position in the tree of DrilldownRows.\n\ngoog.provide('goog.ui.DrilldownRow');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.string.Unicode');\ngoog.require('goog.ui.Component');\n\n\n\n/**\n * Builds a DrilldownRow component, which can overlay a tree\n * structure onto sections of an HTML table.\n *\n * @param {!goog.ui.DrilldownRow.DrilldownRowProperties=} opt_properties\n *   Optional properties.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.Component}\n * @final\n */\ngoog.ui.DrilldownRow = function(opt_properties, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n  var properties = opt_properties || {};\n\n  // Initialize instance variables.\n\n  var html;\n  if (properties.html == null) {\n    html = goog.html.SafeHtml.EMPTY;\n  } else {\n    goog.asserts.assert(properties.html instanceof goog.html.SafeHtml);\n    html = properties.html;\n  }\n  /**\n   * String of HTML to initialize the DOM structure for the table row.\n   * Should have the form '<tr attr=\"etc\">Row contents here</tr>'.\n   * @type {!goog.html.SafeHtml}\n   * @private\n   */\n  this.html_ = html;\n\n  /**\n   * Controls whether this component's children will show when it shows.\n   * @type {boolean}\n   * @private\n   */\n  this.expanded_ =\n      typeof properties.expanded != 'undefined' ? properties.expanded : true;\n\n  /**\n   * If this component's DOM element is created from a string of\n   * HTML, this is the function to call when it is entered into the DOM tree.\n   * @type {Function} args are DrilldownRow and goog.events.EventHandler\n   *   of the DrilldownRow.\n   * @private\n   */\n  this.decoratorFn_ = properties.decorator || goog.ui.DrilldownRow.decorate;\n\n  /**\n   * Is the DrilldownRow to be displayed?  If it is rendered, this mirrors\n   * the style.display of the DrilldownRow's row.\n   * @type {boolean}\n   * @private\n   */\n  this.displayed_ = true;\n};\ngoog.inherits(goog.ui.DrilldownRow, goog.ui.Component);\n\n\n/**\n * Used to define properties for a new DrilldownRow. Properties can contain:\n *   loaded: initializes the isLoaded property, defaults to true.\n *   expanded: DrilldownRow expanded or not, default is true.\n *   html: Relevant and required for DrilldownRows to be added as\n *     children.  Ignored when decorating an existing table row.\n *   decorator: Function that accepts one DrilldownRow argument, and\n *     should customize and style the row.  The default is to call\n *     goog.ui.DrilldownRow.decorator.\n * @typedef {{\n *   loaded: (boolean|undefined),\n *   expanded: (boolean|undefined),\n *   html: (!goog.html.SafeHtml|undefined),\n *   decorator: (Function|undefined)\n * }}\n */\ngoog.ui.DrilldownRow.DrilldownRowProperties;\n\n\n/**\n * Example object with properties of the form accepted by the class\n * constructor.  These are educational and show the compiler that\n * these properties can be set so it doesn't emit warnings.\n */\ngoog.ui.DrilldownRow.sampleProperties = {\n  html: goog.html.SafeHtml.create(\n      goog.dom.TagName.TR, {},\n      goog.html.SafeHtml.concat(\n          goog.html.SafeHtml.create(goog.dom.TagName.TD, {}, 'Sample'),\n          goog.html.SafeHtml.create(goog.dom.TagName.TD, {}, 'Sample'))),\n  loaded: true,\n  decorator: function(selfObj, handler) {\n    // When the mouse is hovering, add CSS class goog-drilldown-hover.\n    goog.ui.DrilldownRow.decorate(selfObj);\n    var row = selfObj.getElement();\n    handler.listen(row, 'mouseover', function() {\n      goog.dom.classlist.add(row, goog.getCssName('goog-drilldown-hover'));\n    });\n    handler.listen(row, 'mouseout', function() {\n      goog.dom.classlist.remove(row, goog.getCssName('goog-drilldown-hover'));\n    });\n  }\n};\n\n\n//\n// Implementations of Component methods.\n//\n\n\n/**\n * The base class method calls its superclass method and this\n * drilldown's 'decorator' method as defined in the constructor.\n * @override\n */\ngoog.ui.DrilldownRow.prototype.enterDocument = function() {\n  goog.ui.DrilldownRow.superClass_.enterDocument.call(this);\n  this.decoratorFn_(this, this.getHandler());\n};\n\n\n/** @override */\ngoog.ui.DrilldownRow.prototype.createDom = function() {\n  this.setElementInternal(\n      goog.ui.DrilldownRow.createRowNode_(this.html_, this.getDomHelper()));\n};\n\n\n/**\n * A top-level DrilldownRow decorates a TR element.\n *\n * @param {Element} node The element to test for decorability.\n * @return {boolean} true iff the node is a TR.\n * @override\n */\ngoog.ui.DrilldownRow.prototype.canDecorate = function(node) {\n  return node.tagName == goog.dom.TagName.TR;\n};\n\n\n/**\n * Child drilldowns are rendered when needed.\n *\n * @param {goog.ui.Component} child New DrilldownRow child to be added.\n * @param {number} index position to be occupied by the child.\n * @param {boolean=} opt_render true to force immediate rendering.\n * @override\n */\ngoog.ui.DrilldownRow.prototype.addChildAt = function(child, index, opt_render) {\n  goog.asserts.assertInstanceof(child, goog.ui.DrilldownRow);\n  goog.ui.DrilldownRow.superClass_.addChildAt.call(this, child, index, false);\n  child.setDisplayable_(this.isVisible_() && this.isExpanded());\n  if (opt_render && !child.isInDocument()) {\n    child.render();\n  }\n};\n\n\n/** @override */\ngoog.ui.DrilldownRow.prototype.removeChild = function(child) {\n  goog.dom.removeNode(child.getElement());\n  return goog.ui.DrilldownRow.superClass_.removeChild.call(this, child);\n};\n\n\n/**\n * Rendering of DrilldownRow's is on need, do not call this directly\n * from application code.\n *\n * Rendering a DrilldownRow places it according to its position in its\n * tree of DrilldownRows.  DrilldownRows cannot be placed any other\n * way so this method does not use any arguments.  This does not call\n * the base class method and does not modify any of this\n * DrilldownRow's children.\n * @override\n */\ngoog.ui.DrilldownRow.prototype.render = function() {\n  if (arguments.length) {\n    throw new Error('A DrilldownRow cannot be placed under a specific parent.');\n  } else {\n    var parent = this.getParent();\n    if (!parent.isInDocument()) {\n      throw new Error('Cannot render child of un-rendered parent');\n    }\n    // The new child's TR node needs to go just after the last TR\n    // of the part of the parent's subtree that is to the left\n    // of this.  The subtree includes the parent.\n    goog.asserts.assertInstanceof(parent, goog.ui.DrilldownRow);\n    var previous = parent.previousRenderedChild_(this);\n    var row;\n    if (previous) {\n      goog.asserts.assertInstanceof(previous, goog.ui.DrilldownRow);\n      row = previous.lastRenderedLeaf_().getElement();\n    } else {\n      row = parent.getElement();\n    }\n    row = /** @type {Element} */ (row.nextSibling);\n    // Render the child row component into the document.\n    if (row) {\n      this.renderBefore(row);\n    } else {\n      // Render at the end of the parent of this DrilldownRow's\n      // DOM element.\n      var tbody = /** @type {Element} */ (parent.getElement().parentNode);\n      goog.ui.DrilldownRow.superClass_.render.call(this, tbody);\n    }\n  }\n};\n\n\n/**\n * Finds the numeric index of this child within its parent Component.\n * Throws an exception if it has no parent.\n *\n * @return {number} index of this within the children of the parent Component.\n */\ngoog.ui.DrilldownRow.prototype.findIndex = function() {\n  var parent = this.getParent();\n  if (!parent) {\n    throw new Error('Component has no parent');\n  }\n  return parent.indexOfChild(this);\n};\n\n\n//\n// Type-specific operations\n//\n\n\n/**\n * Returns the expanded state of the DrilldownRow.\n *\n * @return {boolean} true iff this is expanded.\n */\ngoog.ui.DrilldownRow.prototype.isExpanded = function() {\n  return this.expanded_;\n};\n\n\n/**\n * Sets the expanded state of this DrilldownRow: makes all children\n * displayable or not displayable corresponding to the expanded state.\n *\n * @param {boolean} expanded whether this should be expanded or not.\n */\ngoog.ui.DrilldownRow.prototype.setExpanded = function(expanded) {\n  if (expanded != this.expanded_) {\n    this.expanded_ = expanded;\n    var elem = this.getElement();\n    goog.asserts.assert(elem);\n    goog.dom.classlist.toggle(elem, goog.getCssName('goog-drilldown-expanded'));\n    goog.dom.classlist.toggle(\n        elem, goog.getCssName('goog-drilldown-collapsed'));\n    if (this.isVisible_()) {\n      this.forEachChild(function(child) { child.setDisplayable_(expanded); });\n    }\n  }\n};\n\n\n/**\n * Returns this DrilldownRow's level in the tree.  Top level is 1.\n *\n * @return {number} depth of this DrilldownRow in its tree of drilldowns.\n */\ngoog.ui.DrilldownRow.prototype.getDepth = function() {\n  for (var component = this, depth = 0;\n       component instanceof goog.ui.DrilldownRow;\n       component = component.getParent(), depth++) {\n  }\n  return depth;\n};\n\n\n/**\n * This static function is a default decorator that adds HTML at the\n * beginning of the first cell to display indentation and an expander\n * image; sets up a click handler on the toggler; initializes a class\n * for the row: either goog-drilldown-expanded or\n * goog-drilldown-collapsed, depending on the initial state of the\n * DrilldownRow; and sets up a click event handler on the toggler\n * element.\n *\n * This creates a DIV with class=toggle.  Your application can set up\n * CSS style rules something like this:\n *\n * tr.goog-drilldown-expanded .toggle {\n *   background-image: url('minus.png');\n * }\n *\n * tr.goog-drilldown-collapsed .toggle {\n *   background-image: url('plus.png');\n * }\n *\n * These background images show whether the DrilldownRow is expanded.\n * @param {goog.ui.DrilldownRow} selfObj DrilldownRow to be decorated.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.DrilldownRow.decorate = function(selfObj) {\n  var depth = selfObj.getDepth();\n  var row = selfObj.getElement();\n  goog.asserts.assert(row);\n  if (!row.cells) {\n    throw new Error('No cells');\n  }\n  var cell = row.cells[0];\n  var dom = selfObj.getDomHelper();\n  var fragment = dom.createDom(\n      goog.dom.TagName.DIV, {'style': 'float: left; width: ' + depth + 'em;'},\n      dom.createDom(\n          goog.dom.TagName.DIV,\n          {'class': 'toggle', 'style': 'width: 1em; float: right;'},\n          // NOTE: NBSP is probably only needed by IE6. This div can probably be\n          // made contentless.\n          goog.string.Unicode.NBSP));\n  cell.insertBefore(fragment, cell.firstChild);\n  goog.dom.classlist.add(\n      row, selfObj.isExpanded() ? goog.getCssName('goog-drilldown-expanded') :\n                                  goog.getCssName('goog-drilldown-collapsed'));\n  // Default mouse event handling:\n  var toggler =\n      goog.dom.getElementsByTagName(goog.dom.TagName.DIV, fragment)[0];\n  selfObj.getHandler().listen(toggler, 'click', function(event) {\n    selfObj.setExpanded(!selfObj.isExpanded());\n  });\n};\n\n\n//\n// Private methods\n//\n\n\n/**\n * Turn display of a DrilldownRow on or off.  If the DrilldownRow has not\n * yet been rendered, this renders it.  This propagates the effect\n * of the change recursively as needed -- children displaying iff the\n * parent is displayed and expanded.\n *\n * @param {boolean} display state, true iff display is desired.\n * @private\n */\ngoog.ui.DrilldownRow.prototype.setDisplayable_ = function(display) {\n  if (display && !this.isInDocument()) {\n    this.render();\n  }\n  if (this.displayed_ == display) {\n    return;\n  }\n  this.displayed_ = display;\n  if (this.isInDocument()) {\n    this.getElement().style.display = display ? '' : 'none';\n  }\n  var selfObj = this;\n  this.forEachChild(function(child) {\n    child.setDisplayable_(display && selfObj.expanded_);\n  });\n};\n\n\n/**\n * True iff this and all its DrilldownRow parents are displayable.  The\n * value is an approximation to actual visibility, since it does not\n * look at whether DOM nodes containing the top-level component have\n * display: none, visibility: hidden or are otherwise not displayable.\n * So this visibility is relative to the top-level component.\n *\n * @return {boolean} visibility of this relative to its top-level drilldown.\n * @private\n */\ngoog.ui.DrilldownRow.prototype.isVisible_ = function() {\n  for (var component = this; component instanceof goog.ui.DrilldownRow;\n       component = component.getParent()) {\n    if (!component.displayed_) return false;\n  }\n  return true;\n};\n\n\n/**\n * Create and return a TR element from HTML that looks like\n * \"<tr> ... </tr>\".\n * @param {!goog.html.SafeHtml} html for one row.\n * @param {!goog.dom.DomHelper} dom DOM to hold the Element.\n * @return {Element} table row node created from the HTML.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.DrilldownRow.createRowNode_ = function(html, dom) {\n  // Note: this may be slow.\n  var tableHtml = goog.html.SafeHtml.create(goog.dom.TagName.TABLE, {}, html);\n  var div = dom.createElement(goog.dom.TagName.DIV);\n  goog.dom.safe.setInnerHtml(div, tableHtml);\n  return div.firstChild.rows[0];\n};\n\n\n/**\n * Get the recursively rightmost child that is in the document.\n *\n * @return {goog.ui.DrilldownRow} rightmost child currently entered in\n *     the document, potentially this DrilldownRow.  If this is in the\n *     document, result is non-null.\n * @private\n */\ngoog.ui.DrilldownRow.prototype.lastRenderedLeaf_ = function() {\n  var leaf = null;\n  for (var node = this; node && node.isInDocument();\n       // Node will become undefined if parent has no children.\n       node = node.getChildAt(node.getChildCount() - 1)) {\n    leaf = node;\n  }\n  return /** @type {goog.ui.DrilldownRow} */ (leaf);\n};\n\n\n/**\n * Search this node's direct children for the last one that is in the\n * document and is before the given child.\n * @param {goog.ui.DrilldownRow} child The child to stop the search at.\n * @return {goog.ui.Component?} The last child component before the given child\n *     that is in the document.\n * @private\n */\ngoog.ui.DrilldownRow.prototype.previousRenderedChild_ = function(child) {\n  for (var i = this.getChildCount() - 1; i >= 0; i--) {\n    if (this.getChildAt(i) == child) {\n      for (var j = i - 1; j >= 0; j--) {\n        var prev = this.getChildAt(j);\n        if (prev.isInDocument()) {\n          return prev;\n        }\n      }\n    }\n  }\n  return null;\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","^JN","^KP","^LC","^IT","^K1","~$goog.string.Unicode","~$goog.html.SafeHtml","^JT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/drilldownrow.js"],"^JD",["^J4",["~$goog.ui.DrilldownRow"]],"^IR",true,"^IS",["^IT","^JF","^JN","^JT","^KP","^K1","^M8","^M7","^LC"]],["^ ","^IV",[1579837703000],"^IW","goog.events.onlinehandler.js","^IX",["^IY","goog/events/onlinehandler.js"],"^IZ","goog/events/onlinehandler.js","^I[","^J0","^J1","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview This event handler will dispatch events when\n * `navigator.onLine` changes.  HTML5 defines two events, online and\n * offline that is fired on the window.  As of today 3 browsers support these\n * events: Firefox 3 (Gecko 1.9), Opera 9.5, and IE8.  If we have any of these\n * we listen to the 'online' and 'offline' events on the current window\n * object.  Otherwise we poll the navigator.onLine property to detect changes.\n *\n * Note that this class only reflects what the browser tells us and this usually\n * only reflects changes to the File -> Work Offline menu item.\n *\n * @author arv@google.com (Erik Arvidsson)\n * @see ../demos/onlinehandler.html\n */\n\n// TODO(arv): We should probably implement some kind of polling service and/or\n// a poll for changes event handler that can be used to fire events when a state\n// changes.\n\ngoog.provide('goog.events.OnlineHandler');\ngoog.provide('goog.events.OnlineHandler.EventType');\n\ngoog.require('goog.Timer');\ngoog.require('goog.events.BrowserFeature');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.net.NetworkStatusMonitor');\n\n\n\n/**\n * Basic object for detecting whether the online state changes.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @implements {goog.net.NetworkStatusMonitor}\n */\ngoog.events.OnlineHandler = function() {\n  goog.events.OnlineHandler.base(this, 'constructor');\n\n  /**\n   * @private {goog.events.EventHandler<!goog.events.OnlineHandler>}\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  // Some browsers do not support navigator.onLine and therefore we don't\n  // bother setting up events or timers.\n  if (!goog.events.BrowserFeature.HAS_NAVIGATOR_ONLINE_PROPERTY) {\n    return;\n  }\n\n  if (goog.events.BrowserFeature.HAS_HTML5_NETWORK_EVENT_SUPPORT) {\n    var target = goog.events.BrowserFeature.HTML5_NETWORK_EVENTS_FIRE_ON_BODY ?\n        document.body :\n        window;\n    this.eventHandler_.listen(\n        target, [goog.events.EventType.ONLINE, goog.events.EventType.OFFLINE],\n        this.handleChange_);\n  } else {\n    this.online_ = this.isOnline();\n    this.timer_ = new goog.Timer(goog.events.OnlineHandler.POLL_INTERVAL_);\n    this.eventHandler_.listen(this.timer_, goog.Timer.TICK, this.handleTick_);\n    this.timer_.start();\n  }\n};\ngoog.inherits(goog.events.OnlineHandler, goog.events.EventTarget);\n\n\n/**\n * Enum for the events dispatched by the OnlineHandler.\n * @enum {string}\n * @deprecated Use goog.net.NetworkStatusMonitor.EventType instead.\n */\ngoog.events.OnlineHandler.EventType = goog.net.NetworkStatusMonitor.EventType;\n\n\n/**\n * The time to wait before checking the `navigator.onLine` again.\n * @type {number}\n * @private\n */\ngoog.events.OnlineHandler.POLL_INTERVAL_ = 250;\n\n\n/**\n * Stores the last value of the online state so we can detect if this has\n * changed.\n * @type {boolean}\n * @private\n */\ngoog.events.OnlineHandler.prototype.online_;\n\n\n/**\n * The timer object used to poll the online state.\n * @type {goog.Timer}\n * @private\n */\ngoog.events.OnlineHandler.prototype.timer_;\n\n\n/** @override */\ngoog.events.OnlineHandler.prototype.isOnline = function() {\n  return goog.events.BrowserFeature.HAS_NAVIGATOR_ONLINE_PROPERTY ?\n      navigator.onLine :\n      true;\n};\n\n\n/**\n * Called every time the timer ticks to see if the state has changed and when\n * the online state changes the method handleChange_ is called.\n * @private\n */\ngoog.events.OnlineHandler.prototype.handleTick_ = function() {\n  var online = this.isOnline();\n  if (online != this.online_) {\n    this.online_ = online;\n    this.handleChange_();\n  }\n};\n\n\n/**\n * Called when the online state changes.  This dispatches the\n * `ONLINE` and `OFFLINE` events respectively.\n * @private\n */\ngoog.events.OnlineHandler.prototype.handleChange_ = function() {\n  var type = this.isOnline() ? goog.net.NetworkStatusMonitor.EventType.ONLINE :\n                               goog.net.NetworkStatusMonitor.EventType.OFFLINE;\n  this.dispatchEvent(type);\n};\n\n\n/** @override */\ngoog.events.OnlineHandler.prototype.disposeInternal = function() {\n  goog.events.OnlineHandler.base(this, 'disposeInternal');\n  this.eventHandler_.dispose();\n  this.eventHandler_ = null;\n  if (this.timer_) {\n    this.timer_.dispose();\n    this.timer_ = null;\n  }\n};\n","^J2",1579837703000,"^J3",["^J4",["^M5","~$goog.Timer","^IT","~$goog.events.EventTarget","~$goog.events.EventType","~$goog.events.BrowserFeature","~$goog.net.NetworkStatusMonitor"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/onlinehandler.js"],"^JD",["^J4",["~$goog.events.OnlineHandler","~$goog.events.OnlineHandler.EventType"]],"^IR",true,"^IS",["^IT","^M:","^M=","^M5","^M;","^M<","^M>"]],["^ ","^IV",[1579837703000],"^IW","goog.useragent.product.js","^IX",["^IY","goog/useragent/product.js"],"^IZ","goog/useragent/product.js","^I[","^J0","^J1","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Detects the specific browser and not just the rendering engine.\n *\n */\n\ngoog.provide('goog.userAgent.product');\n\ngoog.require('goog.labs.userAgent.browser');\ngoog.require('goog.labs.userAgent.platform');\ngoog.require('goog.userAgent');\n\n\n/**\n * @define {boolean} Whether the code is running on the Firefox web browser.\n */\ngoog.userAgent.product.ASSUME_FIREFOX =\n    goog.define('goog.userAgent.product.ASSUME_FIREFOX', false);\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the product is an\n *     iPhone.\n */\ngoog.userAgent.product.ASSUME_IPHONE =\n    goog.define('goog.userAgent.product.ASSUME_IPHONE', false);\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the product is an\n *     iPad.\n */\ngoog.userAgent.product.ASSUME_IPAD =\n    goog.define('goog.userAgent.product.ASSUME_IPAD', false);\n\n\n/**\n * @define {boolean} Whether we know at compile-time that the product is an\n *     AOSP browser or WebView inside a pre KitKat Android phone or tablet.\n */\ngoog.userAgent.product.ASSUME_ANDROID =\n    goog.define('goog.userAgent.product.ASSUME_ANDROID', false);\n\n\n/**\n * @define {boolean} Whether the code is running on the Chrome web browser on\n * any platform or AOSP browser or WebView in a KitKat+ Android phone or tablet.\n */\ngoog.userAgent.product.ASSUME_CHROME =\n    goog.define('goog.userAgent.product.ASSUME_CHROME', false);\n\n\n/**\n * @define {boolean} Whether the code is running on the Safari web browser.\n */\ngoog.userAgent.product.ASSUME_SAFARI =\n    goog.define('goog.userAgent.product.ASSUME_SAFARI', false);\n\n\n/**\n * Whether we know the product type at compile-time.\n * @type {boolean}\n * @private\n */\ngoog.userAgent.product.PRODUCT_KNOWN_ = goog.userAgent.ASSUME_IE ||\n    goog.userAgent.ASSUME_EDGE || goog.userAgent.ASSUME_OPERA ||\n    goog.userAgent.product.ASSUME_FIREFOX ||\n    goog.userAgent.product.ASSUME_IPHONE ||\n    goog.userAgent.product.ASSUME_IPAD ||\n    goog.userAgent.product.ASSUME_ANDROID ||\n    goog.userAgent.product.ASSUME_CHROME ||\n    goog.userAgent.product.ASSUME_SAFARI;\n\n\n/**\n * Whether the code is running on the Opera web browser.\n * @type {boolean}\n */\ngoog.userAgent.product.OPERA = goog.userAgent.OPERA;\n\n\n/**\n * Whether the code is running on an IE web browser.\n * @type {boolean}\n */\ngoog.userAgent.product.IE = goog.userAgent.IE;\n\n\n/**\n * Whether the code is running on an Edge web browser (EdgeHTML based).\n * @type {boolean}\n */\ngoog.userAgent.product.EDGE = goog.userAgent.EDGE;\n\n\n/**\n * Whether the code is running on the Firefox web browser.\n * @type {boolean}\n */\ngoog.userAgent.product.FIREFOX = goog.userAgent.product.PRODUCT_KNOWN_ ?\n    goog.userAgent.product.ASSUME_FIREFOX :\n    goog.labs.userAgent.browser.isFirefox();\n\n\n/**\n * Whether the user agent is an iPhone or iPod (as in iPod touch).\n * @return {boolean}\n * @private\n */\ngoog.userAgent.product.isIphoneOrIpod_ = function() {\n  return goog.labs.userAgent.platform.isIphone() ||\n      goog.labs.userAgent.platform.isIpod();\n};\n\n\n/**\n * Whether the code is running on an iPhone or iPod touch.\n *\n * iPod touch is considered an iPhone for legacy reasons.\n * @type {boolean}\n */\ngoog.userAgent.product.IPHONE = goog.userAgent.product.PRODUCT_KNOWN_ ?\n    goog.userAgent.product.ASSUME_IPHONE :\n    goog.userAgent.product.isIphoneOrIpod_();\n\n\n/**\n * Whether the code is running on an iPad.\n * @type {boolean}\n */\ngoog.userAgent.product.IPAD = goog.userAgent.product.PRODUCT_KNOWN_ ?\n    goog.userAgent.product.ASSUME_IPAD :\n    goog.labs.userAgent.platform.isIpad();\n\n\n/**\n * Whether the code is running on AOSP browser or WebView inside\n * a pre KitKat Android phone or tablet.\n * @type {boolean}\n */\ngoog.userAgent.product.ANDROID = goog.userAgent.product.PRODUCT_KNOWN_ ?\n    goog.userAgent.product.ASSUME_ANDROID :\n    goog.labs.userAgent.browser.isAndroidBrowser();\n\n\n/**\n * Whether the code is running on any Chromium-based web browser on any platform\n * or AOSP browser or WebView in a KitKat+ Android phone or tablet.\n * @type {boolean}\n */\ngoog.userAgent.product.CHROME = goog.userAgent.product.PRODUCT_KNOWN_ ?\n    goog.userAgent.product.ASSUME_CHROME :\n    goog.labs.userAgent.browser.isChrome();\n\n\n/**\n * @return {boolean} Whether the browser is Safari on desktop.\n * @private\n */\ngoog.userAgent.product.isSafariDesktop_ = function() {\n  return goog.labs.userAgent.browser.isSafari() &&\n      !goog.labs.userAgent.platform.isIos();\n};\n\n\n/**\n * Whether the code is running on the desktop Safari web browser.\n * Note: the legacy behavior here is only true for Safari not running\n * on iOS.\n * @type {boolean}\n */\ngoog.userAgent.product.SAFARI = goog.userAgent.product.PRODUCT_KNOWN_ ?\n    goog.userAgent.product.ASSUME_SAFARI :\n    goog.userAgent.product.isSafariDesktop_();\n","^J2",1579837703000,"^J3",["^J4",["^IT","^J[","~$goog.labs.userAgent.platform","~$goog.labs.userAgent.browser"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/useragent/product.js"],"^JD",["^J4",["~$goog.userAgent.product"]],"^IR",true,"^IS",["^IT","^MB","^MA","^J["]],["^ ","^IV",[1579837703000],"^IW","goog.proto2.textformatserializer.js","^IX",["^IY","goog/proto2/textformatserializer.js"],"^IZ","goog/proto2/textformatserializer.js","^I[","^J0","^J1","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Protocol Buffer 2 Serializer which serializes messages\n *  into a user-friendly text format. Note that this code can run a bit\n *  slowly (especially for parsing) and should therefore not be used for\n *  time or space-critical applications.\n *\n * @see http://goo.gl/QDmDr\n */\n\ngoog.provide('goog.proto2.TextFormatSerializer');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.math');\ngoog.require('goog.object');\ngoog.require('goog.proto2.FieldDescriptor');\ngoog.require('goog.proto2.Message');\ngoog.require('goog.proto2.Serializer');\ngoog.require('goog.string');\n\n\n\n/**\n * TextFormatSerializer, a serializer which turns Messages into the human\n * readable text format.\n * @param {boolean=} opt_ignoreMissingFields If true, then fields that cannot be\n *     found on the proto when parsing the text format will be ignored.\n * @param {boolean=} opt_useEnumValues If true, serialization code for enums\n *     will use enum integer values instead of human-readable symbolic names.\n * @constructor\n * @extends {goog.proto2.Serializer}\n * @final\n */\ngoog.proto2.TextFormatSerializer = function(\n    opt_ignoreMissingFields, opt_useEnumValues) {\n  /**\n   * Whether to ignore fields not defined on the proto when parsing the text\n   * format.\n   * @type {boolean}\n   * @private\n   */\n  this.ignoreMissingFields_ = !!opt_ignoreMissingFields;\n\n  /**\n   * Whether to use integer enum values during enum serialization.\n   * If false, symbolic names will be used.\n   * @type {boolean}\n   * @private\n   */\n  this.useEnumValues_ = !!opt_useEnumValues;\n};\ngoog.inherits(goog.proto2.TextFormatSerializer, goog.proto2.Serializer);\n\n\n/**\n * Deserializes a message from text format and places the data in the message.\n * @param {goog.proto2.Message} message The message in which to\n *     place the information.\n * @param {*} data The text format data.\n * @return {?string} The parse error or null on success.\n * @override\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.proto2.TextFormatSerializer.prototype.deserializeTo = function(\n    message, data) {\n  var textData = data.toString();\n  var parser = new goog.proto2.TextFormatSerializer.Parser();\n  if (!parser.parse(message, textData, this.ignoreMissingFields_)) {\n    return parser.getError();\n  }\n\n  return null;\n};\n\n\n/**\n * Serializes a message to a string.\n * @param {goog.proto2.Message} message The message to be serialized.\n * @return {string} The serialized form of the message.\n * @override\n */\ngoog.proto2.TextFormatSerializer.prototype.serialize = function(message) {\n  var printer = new goog.proto2.TextFormatSerializer.Printer_();\n  this.serializeMessage_(message, printer);\n  return printer.toString();\n};\n\n\n/**\n * Serializes the message and prints the text form into the given printer.\n * @param {goog.proto2.Message} message The message to serialize.\n * @param {goog.proto2.TextFormatSerializer.Printer_} printer The printer to\n *    which the text format will be printed.\n * @private\n */\ngoog.proto2.TextFormatSerializer.prototype.serializeMessage_ = function(\n    message, printer) {\n  var descriptor = message.getDescriptor();\n  var fields = descriptor.getFields();\n\n  // Add the defined fields, recursively.\n  goog.array.forEach(fields, function(field) {\n    this.printField_(message, field, printer);\n  }, this);\n\n  // Add the unknown fields, if any.\n  message.forEachUnknown(function(tag, value) {\n    this.serializeUnknown_(tag, value, goog.asserts.assert(printer));\n  }, this);\n};\n\n\n/**\n * Serializes an unknown field. When parsed from the JsPb object format, this\n * manifests as either a primitive type, an array, or a raw object with integer\n * keys. There is no descriptor available to interpret the types of nested\n * messages.\n * @param {number} tag The tag for the field. Since it's unknown, this is a\n *     number rather than a string.\n * @param {*} value The value of the field.\n * @param {!goog.proto2.TextFormatSerializer.Printer_} printer The printer to\n *     which the text format will be serialized.\n * @private\n */\ngoog.proto2.TextFormatSerializer.prototype.serializeUnknown_ = function(\n    tag, value, printer) {\n  if (value == null) {\n    return;\n  }\n\n  if (goog.isArray(value)) {\n    goog.array.forEach(value, function(val) {\n      this.serializeUnknown_(tag, val, printer);\n    }, this);\n    return;\n  }\n\n  if (goog.isObject(value)) {\n    printer.append(tag);\n    printer.append(' {');\n    printer.appendLine();\n    printer.indent();\n    if (value instanceof goog.proto2.Message) {\n      // Note(user): This conditional is here to make the\n      // testSerializationOfUnknown unit test pass, but in practice we should\n      // never have a Message for an \"unknown\" field.\n      this.serializeMessage_(value, printer);\n    } else {\n      // For an unknown message, fields are keyed by positive integers. We\n      // don't have a 'length' property to use for enumeration, so go through\n      // all properties and ignore the ones that aren't legal keys.\n      for (var key in value) {\n        var keyAsNumber = goog.string.parseInt(key);\n        goog.asserts.assert(goog.math.isInt(keyAsNumber));\n        this.serializeUnknown_(keyAsNumber, value[key], printer);\n      }\n    }\n    printer.dedent();\n    printer.append('}');\n    printer.appendLine();\n    return;\n  }\n\n  if (typeof value === 'string') {\n    value = goog.string.quote(value);\n  }\n  printer.append(tag);\n  printer.append(': ');\n  printer.append(value.toString());\n  printer.appendLine();\n};\n\n\n/**\n * Prints the serialized value for the given field to the printer.\n * @param {*} value The field's value.\n * @param {goog.proto2.FieldDescriptor} field The field whose value is being\n *    printed.\n * @param {goog.proto2.TextFormatSerializer.Printer_} printer The printer to\n *    which the value will be printed.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.proto2.TextFormatSerializer.prototype.printFieldValue_ = function(\n    value, field, printer) {\n  switch (field.getFieldType()) {\n    case goog.proto2.FieldDescriptor.FieldType.DOUBLE:\n    case goog.proto2.FieldDescriptor.FieldType.FLOAT:\n    case goog.proto2.FieldDescriptor.FieldType.INT64:\n    case goog.proto2.FieldDescriptor.FieldType.UINT64:\n    case goog.proto2.FieldDescriptor.FieldType.INT32:\n    case goog.proto2.FieldDescriptor.FieldType.UINT32:\n    case goog.proto2.FieldDescriptor.FieldType.FIXED64:\n    case goog.proto2.FieldDescriptor.FieldType.FIXED32:\n    case goog.proto2.FieldDescriptor.FieldType.BOOL:\n    case goog.proto2.FieldDescriptor.FieldType.SFIXED32:\n    case goog.proto2.FieldDescriptor.FieldType.SFIXED64:\n    case goog.proto2.FieldDescriptor.FieldType.SINT32:\n    case goog.proto2.FieldDescriptor.FieldType.SINT64:\n      printer.append(value);\n      break;\n\n    case goog.proto2.FieldDescriptor.FieldType.BYTES:\n    case goog.proto2.FieldDescriptor.FieldType.STRING:\n      value = goog.string.quote(value.toString());\n      printer.append(value);\n      break;\n\n    case goog.proto2.FieldDescriptor.FieldType.ENUM:\n      if (!this.useEnumValues_) {\n        // Search the enum type for a matching key.\n        var found = false;\n        goog.object.forEach(field.getNativeType(), function(eValue, key) {\n          if (!found && eValue == value) {\n            printer.append(key);\n            found = true;\n          }\n        });\n      }\n\n      if (!found || this.useEnumValues_) {\n        // Otherwise, just print the numeric value.\n        printer.append(value.toString());\n      }\n      break;\n\n    case goog.proto2.FieldDescriptor.FieldType.GROUP:\n    case goog.proto2.FieldDescriptor.FieldType.MESSAGE:\n      this.serializeMessage_(\n          /** @type {goog.proto2.Message} */ (value), printer);\n      break;\n  }\n};\n\n\n/**\n * Prints the serialized field to the printer.\n * @param {goog.proto2.Message} message The parent message.\n * @param {goog.proto2.FieldDescriptor} field The field to print.\n * @param {goog.proto2.TextFormatSerializer.Printer_} printer The printer to\n *    which the field will be printed.\n * @private\n */\ngoog.proto2.TextFormatSerializer.prototype.printField_ = function(\n    message, field, printer) {\n  // Skip fields not present.\n  if (!message.has(field)) {\n    return;\n  }\n\n  var count = message.countOf(field);\n  for (var i = 0; i < count; ++i) {\n    // Field name.\n    printer.append(field.getName());\n\n    // Field delimiter.\n    if (field.getFieldType() == goog.proto2.FieldDescriptor.FieldType.MESSAGE ||\n        field.getFieldType() == goog.proto2.FieldDescriptor.FieldType.GROUP) {\n      printer.append(' {');\n      printer.appendLine();\n      printer.indent();\n    } else {\n      printer.append(': ');\n    }\n\n    // Write the field value.\n    this.printFieldValue_(message.get(field, i), field, printer);\n\n    // Close the field.\n    if (field.getFieldType() == goog.proto2.FieldDescriptor.FieldType.MESSAGE ||\n        field.getFieldType() == goog.proto2.FieldDescriptor.FieldType.GROUP) {\n      printer.dedent();\n      printer.append('}');\n      printer.appendLine();\n    } else {\n      printer.appendLine();\n    }\n  }\n};\n\n\n////////////////////////////////////////////////////////////////////////////////\n\n\n\n/**\n * Helper class used by the text format serializer for pretty-printing text.\n * @constructor\n * @private\n */\ngoog.proto2.TextFormatSerializer.Printer_ = function() {\n  /**\n   * The current indentation count.\n   * @type {number}\n   * @private\n   */\n  this.indentation_ = 0;\n\n  /**\n   * The buffer of string pieces.\n   * @type {Array<string>}\n   * @private\n   */\n  this.buffer_ = [];\n\n  /**\n   * Whether indentation is required before the next append of characters.\n   * @type {boolean}\n   * @private\n   */\n  this.requiresIndentation_ = true;\n};\n\n\n/**\n * @return {string} The contents of the printer.\n * @override\n */\ngoog.proto2.TextFormatSerializer.Printer_.prototype.toString = function() {\n  return this.buffer_.join('');\n};\n\n\n/**\n * Increases the indentation in the printer.\n */\ngoog.proto2.TextFormatSerializer.Printer_.prototype.indent = function() {\n  this.indentation_ += 2;\n};\n\n\n/**\n * Decreases the indentation in the printer.\n */\ngoog.proto2.TextFormatSerializer.Printer_.prototype.dedent = function() {\n  this.indentation_ -= 2;\n  goog.asserts.assert(this.indentation_ >= 0);\n};\n\n\n/**\n * Appends the given value to the printer.\n * @param {*} value The value to append.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.proto2.TextFormatSerializer.Printer_.prototype.append = function(value) {\n  if (this.requiresIndentation_) {\n    for (var i = 0; i < this.indentation_; ++i) {\n      this.buffer_.push(' ');\n    }\n    this.requiresIndentation_ = false;\n  }\n\n  this.buffer_.push(value.toString());\n};\n\n\n/**\n * Appends a newline to the printer.\n */\ngoog.proto2.TextFormatSerializer.Printer_.prototype.appendLine = function() {\n  this.buffer_.push('\\n');\n  this.requiresIndentation_ = true;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////\n\n\n\n/**\n * Helper class for tokenizing the text format.\n * @param {string} data The string data to tokenize.\n * @param {boolean=} opt_ignoreWhitespace If true, whitespace tokens will not\n *    be reported by the tokenizer.\n * @param {boolean=} opt_ignoreComments If true, comment tokens will not be\n *    reported by the tokenizer.\n * @constructor\n * @private\n */\ngoog.proto2.TextFormatSerializer.Tokenizer_ = function(\n    data, opt_ignoreWhitespace, opt_ignoreComments) {\n\n  /**\n   * Whether to skip whitespace tokens on output.\n   * @private {boolean}\n   */\n  this.ignoreWhitespace_ = !!opt_ignoreWhitespace;\n\n  /**\n   * Whether to skip comment tokens on output.\n   * @private {boolean}\n   */\n  this.ignoreComments_ = !!opt_ignoreComments;\n\n  /**\n   * The data being tokenized.\n   * @private {string}\n   */\n  this.data_ = data;\n\n  /**\n   * The current index in the data.\n   * @private {number}\n   */\n  this.index_ = 0;\n\n  /**\n   * The data string starting at the current index.\n   * @private {string}\n   */\n  this.currentData_ = data;\n\n  /**\n   * The current token type.\n   * @private {goog.proto2.TextFormatSerializer.Tokenizer_.Token}\n   */\n  this.current_ = {\n    type: goog.proto2.TextFormatSerializer.Tokenizer_.TokenTypes.END,\n    value: null\n  };\n};\n\n\n/**\n * @typedef {{type: goog.proto2.TextFormatSerializer.Tokenizer_.TokenTypes,\n *            value: ?string}}\n */\ngoog.proto2.TextFormatSerializer.Tokenizer_.Token;\n\n\n/**\n * @return {goog.proto2.TextFormatSerializer.Tokenizer_.Token} The current\n *     token.\n */\ngoog.proto2.TextFormatSerializer.Tokenizer_.prototype.getCurrent = function() {\n  return this.current_;\n};\n\n\n/**\n * An enumeration of all the token types.\n * @enum {!RegExp}\n */\ngoog.proto2.TextFormatSerializer.Tokenizer_.TokenTypes = {\n  END: /---end---/,\n  // Leading \"-\" to identify \"-infinity\".\"\n  IDENTIFIER: /^-?[a-zA-Z][a-zA-Z0-9_]*/,\n  NUMBER: /^(0x[0-9a-f]+)|(([-])?[0-9][0-9]*(\\.?[0-9]+)?(e[+-]?[0-9]+|[f])?)/,\n  COMMENT: /^#.*/,\n  OPEN_BRACE: /^{/,\n  CLOSE_BRACE: /^}/,\n  OPEN_TAG: /^</,\n  CLOSE_TAG: /^>/,\n  OPEN_LIST: /^\\[/,\n  CLOSE_LIST: /^\\]/,\n  STRING: new RegExp('^\"([^\"\\\\\\\\]|\\\\\\\\.)*\"'),\n  COLON: /^:/,\n  COMMA: /^,/,\n  SEMI: /^;/,\n  WHITESPACE: /^\\s/\n};\n\n\n/**\n * Advances to the next token.\n * @return {boolean} True if a valid token was found, false if the end was\n *    reached or no valid token was found.\n */\ngoog.proto2.TextFormatSerializer.Tokenizer_.prototype.next = function() {\n  var types = goog.proto2.TextFormatSerializer.Tokenizer_.TokenTypes;\n\n  // Skip any whitespace if requested.\n  while (this.nextInternal_()) {\n    var type = this.getCurrent().type;\n    if ((type != types.WHITESPACE && type != types.COMMENT) ||\n        (type == types.WHITESPACE && !this.ignoreWhitespace_) ||\n        (type == types.COMMENT && !this.ignoreComments_)) {\n      return true;\n    }\n  }\n\n  // If we reach this point, set the current token to END.\n  this.current_ = {\n    type: goog.proto2.TextFormatSerializer.Tokenizer_.TokenTypes.END,\n    value: null\n  };\n\n  return false;\n};\n\n\n/**\n * Internal method for determining the next token.\n * @return {boolean} True if a next token was found, false otherwise.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Tokenizer_.prototype.nextInternal_ =\n    function() {\n  if (this.index_ >= this.data_.length) {\n    return false;\n  }\n\n  var data = this.currentData_;\n  var types = goog.proto2.TextFormatSerializer.Tokenizer_.TokenTypes;\n  var next = null;\n\n  // Loop through each token type and try to match the beginning of the string\n  // with the token's regular expression.\n  goog.object.some(types, function(type, id) {\n    if (next || type == types.END) {\n      return false;\n    }\n\n    // Note: This regular expression check is at, minimum, O(n).\n    var info = type.exec(data);\n    if (info && info.index == 0) {\n      next = {type: type, value: info[0]};\n    }\n\n    return !!next;\n  });\n\n  // Advance the index by the length of the token.\n  if (next) {\n    this.current_ =\n        /** @type {goog.proto2.TextFormatSerializer.Tokenizer_.Token} */ (next);\n    this.index_ += next.value.length;\n    this.currentData_ = this.currentData_.substring(next.value.length);\n  }\n\n  return !!next;\n};\n\n\n////////////////////////////////////////////////////////////////////////////////\n\n\n\n/**\n * Helper class for parsing the text format.\n * @constructor\n * @final\n */\ngoog.proto2.TextFormatSerializer.Parser = function() {\n  /**\n   * The error during parsing, if any.\n   * @type {?string}\n   * @private\n   */\n  this.error_ = null;\n\n  /**\n   * The current tokenizer.\n   * @type {?goog.proto2.TextFormatSerializer.Tokenizer_}\n   * @private\n   */\n  this.tokenizer_ = null;\n\n  /**\n   * Whether to ignore missing fields in the proto when parsing.\n   * @type {boolean}\n   * @private\n   */\n  this.ignoreMissingFields_ = false;\n};\n\n\n/**\n * Parses the given data, filling the message as it goes.\n * @param {goog.proto2.Message} message The message to fill.\n * @param {string} data The text format data.\n * @param {boolean=} opt_ignoreMissingFields If true, fields missing in the\n *     proto will be ignored.\n * @return {boolean} True on success, false on failure. On failure, the\n *     getError method can be called to get the reason for failure.\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.parse = function(\n    message, data, opt_ignoreMissingFields) {\n  this.error_ = null;\n  this.ignoreMissingFields_ = !!opt_ignoreMissingFields;\n  this.tokenizer_ =\n      new goog.proto2.TextFormatSerializer.Tokenizer_(data, true, true);\n  this.tokenizer_.next();\n  return this.consumeMessage_(message, '');\n};\n\n\n/**\n * @return {?string} The parse error, if any.\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.getError = function() {\n  return this.error_;\n};\n\n\n/**\n * Reports a parse error.\n * @param {string} msg The error message.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.reportError_ = function(msg) {\n  this.error_ = msg;\n};\n\n\n/**\n * Attempts to consume the given message.\n * @param {goog.proto2.Message} message The message to consume and fill. If\n *    null, then the message contents will be consumed without ever being set\n *    to anything.\n * @param {string} delimiter The delimiter expected at the end of the message.\n * @return {boolean} True on success, false otherwise.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.consumeMessage_ = function(\n    message, delimiter) {\n  var types = goog.proto2.TextFormatSerializer.Tokenizer_.TokenTypes;\n  while (!this.lookingAt_('>') && !this.lookingAt_('}') &&\n         !this.lookingAtType_(types.END)) {\n    if (!this.consumeField_(message)) {\n      return false;\n    }\n  }\n\n  if (delimiter) {\n    if (!this.consume_(delimiter)) {\n      return false;\n    }\n  } else {\n    if (!this.lookingAtType_(types.END)) {\n      this.reportError_('Expected END token');\n    }\n  }\n\n  return true;\n};\n\n\n/**\n * Attempts to consume the value of the given field.\n * @param {goog.proto2.Message} message The parent message.\n * @param {goog.proto2.FieldDescriptor} field The field.\n * @return {boolean} True on success, false otherwise.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.consumeFieldValue_ = function(\n    message, field) {\n  var value = this.getFieldValue_(field);\n  if (value === null) {\n    return false;\n  }\n\n  if (field.isRepeated()) {\n    message.add(field, value);\n  } else {\n    message.set(field, value);\n  }\n\n  return true;\n};\n\n\n/**\n * Attempts to convert a string to a number.\n * @param {string} num in hexadecimal or float format.\n * @return {number} The converted number or null on error.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.getNumberFromString_ = function(num) {\n\n  var returnValue = goog.string.contains(num, '.') ?\n      parseFloat(num) :           // num is a float.\n      goog.string.parseInt(num);  // num is an int.\n\n  goog.asserts.assert(!isNaN(returnValue));\n  goog.asserts.assert(isFinite(returnValue));\n\n  return returnValue;\n};\n\n\n/**\n * Parse NaN, positive infinity, or negative infinity from a string.\n * @param {string} identifier An identifier string to check.\n * @return {?number} Infinity, negative infinity, NaN, or null if none\n *     of the constants could be parsed.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.parseNumericalConstant_ = function(\n    identifier) {\n  if (/^-?inf(?:inity)?f?$/i.test(identifier)) {\n    return Infinity * (goog.string.startsWith(identifier, '-') ? -1 : 1);\n  }\n\n  if (/^nanf?$/i.test(identifier)) {\n    return NaN;\n  }\n\n  return null;\n};\n\n\n/**\n * Attempts to parse the given field's value from the stream.\n * @param {goog.proto2.FieldDescriptor} field The field.\n * @return {*} The field's value or null if none.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.getFieldValue_ = function(\n    field) {\n  var types = goog.proto2.TextFormatSerializer.Tokenizer_.TokenTypes;\n  switch (field.getFieldType()) {\n    case goog.proto2.FieldDescriptor.FieldType.DOUBLE:\n    case goog.proto2.FieldDescriptor.FieldType.FLOAT:\n\n      var identifier = this.consumeIdentifier_();\n      if (identifier) {\n        var numericalIdentifier =\n            goog.proto2.TextFormatSerializer.Parser.parseNumericalConstant_(\n                identifier);\n        // Use isDefAndNotNull since !!NaN is false.\n        if (numericalIdentifier != null) {\n          return numericalIdentifier;\n        }\n      }\n\n    case goog.proto2.FieldDescriptor.FieldType.INT32:\n    case goog.proto2.FieldDescriptor.FieldType.UINT32:\n    case goog.proto2.FieldDescriptor.FieldType.FIXED32:\n    case goog.proto2.FieldDescriptor.FieldType.SFIXED32:\n    case goog.proto2.FieldDescriptor.FieldType.SINT32:\n      var num = this.consumeNumber_();\n      if (!num) {\n        return null;\n      }\n\n      return goog.proto2.TextFormatSerializer.Parser.getNumberFromString_(num);\n\n    case goog.proto2.FieldDescriptor.FieldType.INT64:\n    case goog.proto2.FieldDescriptor.FieldType.UINT64:\n    case goog.proto2.FieldDescriptor.FieldType.FIXED64:\n    case goog.proto2.FieldDescriptor.FieldType.SFIXED64:\n    case goog.proto2.FieldDescriptor.FieldType.SINT64:\n      var num = this.consumeNumber_();\n      if (!num) {\n        return null;\n      }\n\n      if (field.getNativeType() == Number) {\n        // 64-bit number stored as a number.\n        return goog.proto2.TextFormatSerializer.Parser.getNumberFromString_(\n            num);\n      }\n\n      return num;  // 64-bit numbers are by default stored as strings.\n\n    case goog.proto2.FieldDescriptor.FieldType.BOOL:\n      var ident = this.consumeIdentifier_();\n      if (!ident) {\n        return null;\n      }\n\n      switch (ident) {\n        case 'true':\n          return true;\n        case 'false':\n          return false;\n        default:\n          this.reportError_('Unknown type for bool: ' + ident);\n          return null;\n      }\n\n    case goog.proto2.FieldDescriptor.FieldType.ENUM:\n      if (this.lookingAtType_(types.NUMBER)) {\n        var num = this.consumeNumber_();\n        if (!num) {\n          return null;\n        }\n\n        return goog.proto2.TextFormatSerializer.Parser.getNumberFromString_(\n            num);\n      } else {\n        // Search the enum type for a matching key.\n        var name = this.consumeIdentifier_();\n        if (!name) {\n          return null;\n        }\n\n        var enumValue = field.getNativeType()[name];\n        if (enumValue == null) {\n          this.reportError_('Unknown enum value: ' + name);\n          return null;\n        }\n\n        return enumValue;\n      }\n\n    case goog.proto2.FieldDescriptor.FieldType.BYTES:\n    case goog.proto2.FieldDescriptor.FieldType.STRING:\n      return this.consumeString_();\n  }\n};\n\n\n/**\n * Attempts to consume a nested message.\n * @param {goog.proto2.Message} message The parent message.\n * @param {goog.proto2.FieldDescriptor} field The field.\n * @return {boolean} True on success, false otherwise.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.consumeNestedMessage_ =\n    function(message, field) {\n  var delimiter = '';\n\n  // Messages support both < > and { } as delimiters for legacy reasons.\n  if (this.tryConsume_('<')) {\n    delimiter = '>';\n  } else {\n    if (!this.consume_('{')) {\n      return false;\n    }\n    delimiter = '}';\n  }\n\n  var msg = field.getFieldMessageType().createMessageInstance();\n  var result = this.consumeMessage_(msg, delimiter);\n  if (!result) {\n    return false;\n  }\n\n  // Add the message to the parent message.\n  if (field.isRepeated()) {\n    message.add(field, msg);\n  } else {\n    message.set(field, msg);\n  }\n\n  return true;\n};\n\n\n/**\n * Attempts to consume the value of an unknown field. This method uses\n * heuristics to try to consume just the right tokens.\n * @return {boolean} True on success, false otherwise.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.consumeUnknownFieldValue_ =\n    function() {\n  // : is optional.\n  this.tryConsume_(':');\n\n  // Handle form: [.. , ... , ..]\n  if (this.tryConsume_('[')) {\n    while (true) {\n      this.tokenizer_.next();\n      if (this.tryConsume_(']')) {\n        break;\n      }\n      if (!this.consume_(',')) {\n        return false;\n      }\n    }\n\n    return true;\n  }\n\n  // Handle nested messages/groups.\n  if (this.tryConsume_('<')) {\n    return this.consumeMessage_(null /* unknown */, '>');\n  } else if (this.tryConsume_('{')) {\n    return this.consumeMessage_(null /* unknown */, '}');\n  } else {\n    // Otherwise, consume a single token for the field value.\n    this.tokenizer_.next();\n  }\n\n  return true;\n};\n\n\n/**\n * Attempts to consume a field under a message.\n * @param {goog.proto2.Message} message The parent message. If null, then the\n *     field value will be consumed without being assigned to anything.\n * @return {boolean} True on success, false otherwise.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.consumeField_ = function(\n    message) {\n  var fieldName = this.consumeIdentifier_();\n  if (!fieldName) {\n    this.reportError_('Missing field name');\n    return false;\n  }\n\n  var field = null;\n  if (message) {\n    field = message.getDescriptor().findFieldByName(fieldName.toString());\n  }\n\n  if (field == null) {\n    if (this.ignoreMissingFields_) {\n      return this.consumeUnknownFieldValue_();\n    } else {\n      this.reportError_('Unknown field: ' + fieldName);\n      return false;\n    }\n  }\n\n  if (field.getFieldType() == goog.proto2.FieldDescriptor.FieldType.MESSAGE ||\n      field.getFieldType() == goog.proto2.FieldDescriptor.FieldType.GROUP) {\n    // : is optional here.\n    this.tryConsume_(':');\n    if (!this.consumeNestedMessage_(message, field)) {\n      return false;\n    }\n  } else {\n    // Long Format: \"someField: 123\"\n    // Short Format: \"someField: [123, 456, 789]\"\n    if (!this.consume_(':')) {\n      return false;\n    }\n\n    if (field.isRepeated() && this.tryConsume_('[')) {\n      // Short repeated format, e.g.  \"foo: [1, 2, 3]\"\n      while (true) {\n        if (!this.consumeFieldValue_(message, field)) {\n          return false;\n        }\n        if (this.tryConsume_(']')) {\n          break;\n        }\n        if (!this.consume_(',')) {\n          return false;\n        }\n      }\n    } else {\n      // Normal field format.\n      if (!this.consumeFieldValue_(message, field)) {\n        return false;\n      }\n    }\n  }\n\n  // For historical reasons, fields may optionally be separated by commas or\n  // semicolons.\n  this.tryConsume_(',') || this.tryConsume_(';');\n  return true;\n};\n\n\n/**\n * Attempts to consume a token with the given string value.\n * @param {string} value The string value for the token.\n * @return {boolean} True if the token matches and was consumed, false\n *    otherwise.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.tryConsume_ = function(\n    value) {\n  if (this.lookingAt_(value)) {\n    this.tokenizer_.next();\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Consumes a token of the given type.\n * @param {goog.proto2.TextFormatSerializer.Tokenizer_.TokenTypes} type The type\n *     of the token to consume.\n * @return {?string} The string value of the token or null on error.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.consumeToken_ = function(\n    type) {\n  if (!this.lookingAtType_(type)) {\n    this.reportError_('Expected token type: ' + type);\n    return null;\n  }\n\n  var value = this.tokenizer_.getCurrent().value;\n  this.tokenizer_.next();\n  return value;\n};\n\n\n/**\n * Consumes an IDENTIFIER token.\n * @return {?string} The string value or null on error.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.consumeIdentifier_ =\n    function() {\n  var types = goog.proto2.TextFormatSerializer.Tokenizer_.TokenTypes;\n  return this.consumeToken_(types.IDENTIFIER);\n};\n\n\n/**\n * Consumes a NUMBER token.\n * @return {?string} The string value or null on error.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.consumeNumber_ = function() {\n  var types = goog.proto2.TextFormatSerializer.Tokenizer_.TokenTypes;\n  return this.consumeToken_(types.NUMBER);\n};\n\n\n/**\n * Consumes a STRING token. Strings may come in multiple adjacent tokens which\n * are automatically concatenated, like in C or Python.\n * @return {?string} The *deescaped* string value or null on error.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.consumeString_ = function() {\n  var types = goog.proto2.TextFormatSerializer.Tokenizer_.TokenTypes;\n  var value = this.consumeToken_(types.STRING);\n  if (!value) {\n    return null;\n  }\n\n  var stringValue = JSON.parse(/** @type {string} */ (value)).toString();\n  while (this.lookingAtType_(types.STRING)) {\n    value = this.consumeToken_(types.STRING);\n    stringValue += JSON.parse(/** @type {string} */ (value)).toString();\n  }\n\n  return stringValue;\n};\n\n\n/**\n * Consumes a token with the given value. If not found, reports an error.\n * @param {string} value The string value expected for the token.\n * @return {boolean} True on success, false otherwise.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.consume_ = function(value) {\n  if (!this.tryConsume_(value)) {\n    this.reportError_('Expected token \"' + value + '\"');\n    return false;\n  }\n\n  return true;\n};\n\n\n/**\n * @param {string} value The value to check against.\n * @return {boolean} True if the current token has the given string value.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.lookingAt_ = function(value) {\n  return this.tokenizer_.getCurrent().value == value;\n};\n\n\n/**\n * @param {goog.proto2.TextFormatSerializer.Tokenizer_.TokenTypes} type The\n *     token type.\n * @return {boolean} True if the current token has the given type.\n * @private\n */\ngoog.proto2.TextFormatSerializer.Parser.prototype.lookingAtType_ = function(\n    type) {\n  return this.tokenizer_.getCurrent().type == type;\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","^L<","^K7","^IT","^KS","~$goog.proto2.FieldDescriptor","^LZ","^JJ","^L="]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/proto2/textformatserializer.js"],"^JD",["^J4",["~$goog.proto2.TextFormatSerializer"]],"^IR",true,"^IS",["^IT","^JJ","^JF","^LZ","^KS","^MD","^L=","^L<","^K7"]],["^ ","^IV",[1579837703000],"^IW","goog.dom.tagiterator.js","^IX",["^IY","goog/dom/tagiterator.js"],"^IZ","goog/dom/tagiterator.js","^I[","^J0","^J1","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Iterator subclass for DOM tree traversal.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.TagIterator');\ngoog.provide('goog.dom.TagWalkType');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.iter.Iterator');\ngoog.require('goog.iter.StopIteration');\n\n\n/**\n * There are three types of token:\n *  <ol>\n *    <li>`START_TAG` - The beginning of a tag.\n *    <li>`OTHER` - Any non-element node position.\n *    <li>`END_TAG` - The end of a tag.\n *  </ol>\n * Users of this enumeration can rely on {@code START_TAG + END_TAG = 0} and\n * that {@code OTHER = 0}.\n *\n * @enum {number}\n */\ngoog.dom.TagWalkType = {\n  START_TAG: 1,\n  OTHER: 0,\n  END_TAG: -1\n};\n\n\n\n/**\n * A DOM tree traversal iterator.\n *\n * Starting with the given node, the iterator walks the DOM in order, reporting\n * events for the start and end of Elements, and the presence of text nodes. For\n * example:\n *\n * <pre>\n * &lt;div&gt;1&lt;span&gt;2&lt;/span&gt;3&lt;/div&gt;\n * </pre>\n *\n * Will return the following nodes:\n *\n * <code>[div, 1, span, 2, span, 3, div]</code>\n *\n * With the following states:\n *\n * <code>[START, OTHER, START, OTHER, END, OTHER, END]</code>\n *\n * And the following depths\n *\n * <code>[1, 1, 2, 2, 1, 1, 0]</code>\n *\n * Imagining <code>|</code> represents iterator position, the traversal stops at\n * each of the following locations:\n *\n * <pre>\n * &lt;div&gt;|1|&lt;span&gt;|2|&lt;/span&gt;|3|&lt;/div&gt;|\n * </pre>\n *\n * The iterator can also be used in reverse mode, which will return the nodes\n * and states in the opposite order.  The depths will be slightly different\n * since, like in normal mode, the depth is computed *after* the given node.\n *\n * Lastly, it is possible to create an iterator that is unconstrained, meaning\n * that it will continue iterating until the end of the document instead of\n * until exiting the start node.\n *\n * @param {Node=} opt_node The start node.  If unspecified or null, defaults to\n *     an empty iterator.\n * @param {boolean=} opt_reversed Whether to traverse the tree in reverse.\n * @param {boolean=} opt_unconstrained Whether the iterator is not constrained\n *     to the starting node and its children.\n * @param {goog.dom.TagWalkType?=} opt_tagType The type of the position.\n *     Defaults to the start of the given node for forward iterators, and\n *     the end of the node for reverse iterators.\n * @param {number=} opt_depth The starting tree depth.\n * @constructor\n * @extends {goog.iter.Iterator<Node>}\n */\ngoog.dom.TagIterator = function(\n    opt_node, opt_reversed, opt_unconstrained, opt_tagType, opt_depth) {\n  /**\n   * Whether the node iterator is moving in reverse.\n   * @type {boolean}\n   */\n  this.reversed = !!opt_reversed;\n\n  /**\n   * The node this position is located on.\n   * @type {?Node}\n   */\n  this.node = null;\n\n  /**\n   * The type of this position.\n   * @type {goog.dom.TagWalkType}\n   */\n  this.tagType = goog.dom.TagWalkType.OTHER;\n\n  /**\n   * The tree depth of this position relative to where the iterator started.\n   * The depth is considered to be the tree depth just past the current node,\n   * so if an iterator is at position\n   * <pre>\n   *     <div>|</div>\n   * </pre>\n   * (i.e. the node is the div and the type is START_TAG) its depth will be 1.\n   * @type {number}\n   */\n  this.depth;\n\n  /**\n   * Whether iteration has started.\n   * @private {boolean}\n   */\n  this.started_ = false;\n\n  /**\n   * Whether the iterator is constrained to the starting node and its children.\n   * @type {boolean}\n   */\n  this.constrained = !opt_unconstrained;\n\n  if (opt_node) {\n    this.setPosition(opt_node, opt_tagType);\n  }\n  this.depth = opt_depth != undefined ? opt_depth : this.tagType || 0;\n  if (this.reversed) {\n    this.depth *= -1;\n  }\n};\ngoog.inherits(goog.dom.TagIterator, goog.iter.Iterator);\n\n\n/**\n * Set the position of the iterator.  Overwrite the tree node and the position\n * type which can be one of the {@link goog.dom.TagWalkType} token types.\n * Only overwrites the tree depth when the parameter is specified.\n * @param {Node} node The node to set the position to.\n * @param {goog.dom.TagWalkType?=} opt_tagType The type of the position\n *     Defaults to the start of the given node.\n * @param {number=} opt_depth The tree depth.\n */\ngoog.dom.TagIterator.prototype.setPosition = function(\n    node, opt_tagType, opt_depth) {\n  this.node = node;\n\n  if (node) {\n    if (typeof opt_tagType === 'number') {\n      this.tagType = opt_tagType;\n    } else {\n      // Auto-determine the proper type\n      this.tagType = this.node.nodeType != goog.dom.NodeType.ELEMENT ?\n          goog.dom.TagWalkType.OTHER :\n          this.reversed ? goog.dom.TagWalkType.END_TAG :\n                          goog.dom.TagWalkType.START_TAG;\n    }\n  }\n\n  if (typeof opt_depth === 'number') {\n    this.depth = opt_depth;\n  }\n};\n\n\n/**\n * Replace this iterator's values with values from another. The two iterators\n * must be of the same type.\n * @param {goog.dom.TagIterator} other The iterator to copy.\n * @protected\n */\ngoog.dom.TagIterator.prototype.copyFrom = function(other) {\n  this.node = other.node;\n  this.tagType = other.tagType;\n  this.depth = other.depth;\n  this.reversed = other.reversed;\n  this.constrained = other.constrained;\n};\n\n\n/**\n * @return {!goog.dom.TagIterator} A copy of this iterator.\n */\ngoog.dom.TagIterator.prototype.clone = function() {\n  return new goog.dom.TagIterator(\n      this.node, this.reversed, !this.constrained, this.tagType, this.depth);\n};\n\n\n/**\n * Skip the current tag.\n */\ngoog.dom.TagIterator.prototype.skipTag = function() {\n  var check = this.reversed ? goog.dom.TagWalkType.END_TAG :\n                              goog.dom.TagWalkType.START_TAG;\n  if (this.tagType == check) {\n    this.tagType = /** @type {goog.dom.TagWalkType} */ (check * -1);\n    this.depth += this.tagType * (this.reversed ? -1 : 1);\n  }\n};\n\n\n/**\n * Restart the current tag.\n */\ngoog.dom.TagIterator.prototype.restartTag = function() {\n  var check = this.reversed ? goog.dom.TagWalkType.START_TAG :\n                              goog.dom.TagWalkType.END_TAG;\n  if (this.tagType == check) {\n    this.tagType = /** @type {goog.dom.TagWalkType} */ (check * -1);\n    this.depth += this.tagType * (this.reversed ? -1 : 1);\n  }\n};\n\n\n/**\n * Move to the next position in the DOM tree.\n * @return {Node} Returns the next node, or throws a goog.iter.StopIteration\n *     exception if the end of the iterator's range has been reached.\n * @override\n */\ngoog.dom.TagIterator.prototype.next = function() {\n  var node;\n\n  if (this.started_) {\n    if (!this.node || this.constrained && this.depth == 0) {\n      throw goog.iter.StopIteration;\n    }\n    node = this.node;\n\n    var startType = this.reversed ? goog.dom.TagWalkType.END_TAG :\n                                    goog.dom.TagWalkType.START_TAG;\n\n    if (this.tagType == startType) {\n      // If we have entered the tag, test if there are any children to move to.\n      var child = this.reversed ? node.lastChild : node.firstChild;\n      if (child) {\n        this.setPosition(child);\n      } else {\n        // If not, move on to exiting this tag.\n        this.setPosition(\n            node,\n            /** @type {goog.dom.TagWalkType} */ (startType * -1));\n      }\n    } else {\n      var sibling = this.reversed ? node.previousSibling : node.nextSibling;\n      if (sibling) {\n        // Try to move to the next node.\n        this.setPosition(sibling);\n      } else {\n        // If no such node exists, exit our parent.\n        this.setPosition(\n            node.parentNode,\n            /** @type {goog.dom.TagWalkType} */ (startType * -1));\n      }\n    }\n\n    this.depth += this.tagType * (this.reversed ? -1 : 1);\n  } else {\n    this.started_ = true;\n  }\n\n  // Check the new position for being last, and return it if it's not.\n  node = this.node;\n  if (!this.node) {\n    throw goog.iter.StopIteration;\n  }\n  return node;\n};\n\n\n/**\n * @return {boolean} Whether next has ever been called on this iterator.\n * @protected\n */\ngoog.dom.TagIterator.prototype.isStarted = function() {\n  return this.started_;\n};\n\n\n/**\n * @return {boolean} Whether this iterator's position is a start tag position.\n */\ngoog.dom.TagIterator.prototype.isStartTag = function() {\n  return this.tagType == goog.dom.TagWalkType.START_TAG;\n};\n\n\n/**\n * @return {boolean} Whether this iterator's position is an end tag position.\n */\ngoog.dom.TagIterator.prototype.isEndTag = function() {\n  return this.tagType == goog.dom.TagWalkType.END_TAG;\n};\n\n\n/**\n * @return {boolean} Whether this iterator's position is not at an element node.\n */\ngoog.dom.TagIterator.prototype.isNonElement = function() {\n  return this.tagType == goog.dom.TagWalkType.OTHER;\n};\n\n\n/**\n * Test if two iterators are at the same position - i.e. if the node and tagType\n * is the same.  This will still return true if the two iterators are moving in\n * opposite directions or have different constraints.\n * @param {goog.dom.TagIterator} other The iterator to compare to.\n * @return {boolean} Whether the two iterators are at the same position.\n */\ngoog.dom.TagIterator.prototype.equals = function(other) {\n  // Nodes must be equal, and we must either have reached the end of our tree\n  // or be at the same position.\n  return other.node == this.node &&\n      (!this.node || other.tagType == this.tagType);\n};\n\n\n/**\n * Replace the current node with the list of nodes. Reset the iterator so that\n * it visits the first of the nodes next.\n * @param {...Object} var_args A list of nodes to replace the current node with.\n *     If the first argument is array-like, it will be used, otherwise all the\n *     arguments are assumed to be nodes.\n */\ngoog.dom.TagIterator.prototype.splice = function(var_args) {\n  // Reset the iterator so that it iterates over the first replacement node in\n  // the arguments on the next iteration.\n  var node = this.node;\n  this.restartTag();\n  this.reversed = !this.reversed;\n  goog.dom.TagIterator.prototype.next.call(this);\n  this.reversed = !this.reversed;\n\n  // Replace the node with the arguments.\n  var arr = goog.isArrayLike(arguments[0]) ? arguments[0] : arguments;\n  for (var i = arr.length - 1; i >= 0; i--) {\n    goog.dom.insertSiblingAfter(arr[i], node);\n  }\n  goog.dom.removeNode(node);\n};\n","^J2",1579837703000,"^J3",["^J4",["^JN","^JZ","^IT","^KF","~$goog.iter.Iterator"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/tagiterator.js"],"^JD",["^J4",["~$goog.dom.TagIterator","~$goog.dom.TagWalkType"]],"^IR",true,"^IS",["^IT","^JN","^JZ","^MF","^KF"]],["^ ","^IV",[1579837703000],"^IW","goog.crypt.md5.js","^IX",["^IY","goog/crypt/md5.js"],"^IZ","goog/crypt/md5.js","^I[","^J0","^J1","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview MD5 cryptographic hash.\n * Implementation of http://tools.ietf.org/html/rfc1321 with common\n * optimizations and tweaks (see http://en.wikipedia.org/wiki/MD5).\n *\n * Usage:\n *   var md5 = new goog.crypt.Md5();\n *   md5.update(bytes);\n *   var hash = md5.digest();\n *\n * Performance:\n *   Chrome 23              ~680 Mbit/s\n *   Chrome 13 (in a VM)    ~250 Mbit/s\n *   Firefox 6.0 (in a VM)  ~100 Mbit/s\n *   IE9 (in a VM)           ~27 Mbit/s\n *   Firefox 3.6             ~15 Mbit/s\n *   IE8 (in a VM)           ~13 Mbit/s\n *\n */\n\ngoog.provide('goog.crypt.Md5');\n\ngoog.require('goog.crypt.Hash');\n\n\n\n/**\n * MD5 cryptographic hash constructor.\n * @constructor\n * @extends {goog.crypt.Hash}\n * @final\n * @struct\n */\ngoog.crypt.Md5 = function() {\n  goog.crypt.Md5.base(this, 'constructor');\n\n  this.blockSize = 512 / 8;\n\n  /**\n   * Holds the current values of accumulated A-D variables (MD buffer).\n   * @type {!Array<number>}\n   * @private\n   */\n  this.chain_ = new Array(4);\n\n  /**\n   * A buffer holding the data until the whole block can be processed.\n   * @type {!Array<number>}\n   * @private\n   */\n  this.block_ = new Array(this.blockSize);\n\n  /**\n   * The length of yet-unprocessed data as collected in the block.\n   * @type {number}\n   * @private\n   */\n  this.blockLength_ = 0;\n\n  /**\n   * The total length of the message so far.\n   * @type {number}\n   * @private\n   */\n  this.totalLength_ = 0;\n\n  this.reset();\n};\ngoog.inherits(goog.crypt.Md5, goog.crypt.Hash);\n\n\n/**\n * Integer rotation constants used by the abbreviated implementation.\n * They are hardcoded in the unrolled implementation, so it is left\n * here commented out.\n * @type {Array<number>}\n * @private\n *\ngoog.crypt.Md5.S_ = [\n  7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22,\n  5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20,\n  4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23,\n  6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21\n];\n */\n\n/**\n * Sine function constants used by the abbreviated implementation.\n * They are hardcoded in the unrolled implementation, so it is left\n * here commented out.\n * @type {Array<number>}\n * @private\n *\ngoog.crypt.Md5.T_ = [\n  0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,\n  0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,\n  0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,\n  0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,\n  0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,\n  0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,\n  0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,\n  0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,\n  0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,\n  0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,\n  0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,\n  0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,\n  0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,\n  0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,\n  0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,\n  0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391\n];\n */\n\n\n/** @override */\ngoog.crypt.Md5.prototype.reset = function() {\n  this.chain_[0] = 0x67452301;\n  this.chain_[1] = 0xefcdab89;\n  this.chain_[2] = 0x98badcfe;\n  this.chain_[3] = 0x10325476;\n\n  this.blockLength_ = 0;\n  this.totalLength_ = 0;\n};\n\n\n/**\n * Internal compress helper function. It takes a block of data (64 bytes)\n * and updates the accumulator.\n * @param {Array<number>|Uint8Array|string} buf The block to compress.\n * @param {number=} opt_offset Offset of the block in the buffer.\n * @private\n */\ngoog.crypt.Md5.prototype.compress_ = function(buf, opt_offset) {\n  if (!opt_offset) {\n    opt_offset = 0;\n  }\n\n  // We allocate the array every time, but it's cheap in practice.\n  var X = new Array(16);\n\n  // Get 16 little endian words. It is not worth unrolling this for Chrome 11.\n  if (typeof buf === 'string') {\n    for (var i = 0; i < 16; ++i) {\n      X[i] = (buf.charCodeAt(opt_offset++)) |\n          (buf.charCodeAt(opt_offset++) << 8) |\n          (buf.charCodeAt(opt_offset++) << 16) |\n          (buf.charCodeAt(opt_offset++) << 24);\n    }\n  } else {\n    for (var i = 0; i < 16; ++i) {\n      X[i] = (buf[opt_offset++]) | (buf[opt_offset++] << 8) |\n          (buf[opt_offset++] << 16) | (buf[opt_offset++] << 24);\n    }\n  }\n\n  var A = this.chain_[0];\n  var B = this.chain_[1];\n  var C = this.chain_[2];\n  var D = this.chain_[3];\n  var sum = 0;\n\n  /*\n   * This is an abbreviated implementation, it is left here commented out for\n   * reference purposes. See below for an unrolled version in use.\n   *\n  var f, n, tmp;\n  for (var i = 0; i < 64; ++i) {\n\n    if (i < 16) {\n      f = (D ^ (B & (C ^ D)));\n      n = i;\n    } else if (i < 32) {\n      f = (C ^ (D & (B ^ C)));\n      n = (5 * i + 1) % 16;\n    } else if (i < 48) {\n      f = (B ^ C ^ D);\n      n = (3 * i + 5) % 16;\n    } else {\n      f = (C ^ (B | (~D)));\n      n = (7 * i) % 16;\n    }\n\n    tmp = D;\n    D = C;\n    C = B;\n    sum = (A + f + goog.crypt.Md5.T_[i] + X[n]) & 0xffffffff;\n    B += ((sum << goog.crypt.Md5.S_[i]) & 0xffffffff) |\n         (sum >>> (32 - goog.crypt.Md5.S_[i]));\n    A = tmp;\n  }\n   */\n\n  /*\n   * This is an unrolled MD5 implementation, which gives ~30% speedup compared\n   * to the abbreviated implementation above, as measured on Chrome 11. It is\n   * important to keep 32-bit croppings to minimum and inline the integer\n   * rotation.\n   */\n  sum = (A + (D ^ (B & (C ^ D))) + X[0] + 0xd76aa478) & 0xffffffff;\n  A = B + (((sum << 7) & 0xffffffff) | (sum >>> 25));\n  sum = (D + (C ^ (A & (B ^ C))) + X[1] + 0xe8c7b756) & 0xffffffff;\n  D = A + (((sum << 12) & 0xffffffff) | (sum >>> 20));\n  sum = (C + (B ^ (D & (A ^ B))) + X[2] + 0x242070db) & 0xffffffff;\n  C = D + (((sum << 17) & 0xffffffff) | (sum >>> 15));\n  sum = (B + (A ^ (C & (D ^ A))) + X[3] + 0xc1bdceee) & 0xffffffff;\n  B = C + (((sum << 22) & 0xffffffff) | (sum >>> 10));\n  sum = (A + (D ^ (B & (C ^ D))) + X[4] + 0xf57c0faf) & 0xffffffff;\n  A = B + (((sum << 7) & 0xffffffff) | (sum >>> 25));\n  sum = (D + (C ^ (A & (B ^ C))) + X[5] + 0x4787c62a) & 0xffffffff;\n  D = A + (((sum << 12) & 0xffffffff) | (sum >>> 20));\n  sum = (C + (B ^ (D & (A ^ B))) + X[6] + 0xa8304613) & 0xffffffff;\n  C = D + (((sum << 17) & 0xffffffff) | (sum >>> 15));\n  sum = (B + (A ^ (C & (D ^ A))) + X[7] + 0xfd469501) & 0xffffffff;\n  B = C + (((sum << 22) & 0xffffffff) | (sum >>> 10));\n  sum = (A + (D ^ (B & (C ^ D))) + X[8] + 0x698098d8) & 0xffffffff;\n  A = B + (((sum << 7) & 0xffffffff) | (sum >>> 25));\n  sum = (D + (C ^ (A & (B ^ C))) + X[9] + 0x8b44f7af) & 0xffffffff;\n  D = A + (((sum << 12) & 0xffffffff) | (sum >>> 20));\n  sum = (C + (B ^ (D & (A ^ B))) + X[10] + 0xffff5bb1) & 0xffffffff;\n  C = D + (((sum << 17) & 0xffffffff) | (sum >>> 15));\n  sum = (B + (A ^ (C & (D ^ A))) + X[11] + 0x895cd7be) & 0xffffffff;\n  B = C + (((sum << 22) & 0xffffffff) | (sum >>> 10));\n  sum = (A + (D ^ (B & (C ^ D))) + X[12] + 0x6b901122) & 0xffffffff;\n  A = B + (((sum << 7) & 0xffffffff) | (sum >>> 25));\n  sum = (D + (C ^ (A & (B ^ C))) + X[13] + 0xfd987193) & 0xffffffff;\n  D = A + (((sum << 12) & 0xffffffff) | (sum >>> 20));\n  sum = (C + (B ^ (D & (A ^ B))) + X[14] + 0xa679438e) & 0xffffffff;\n  C = D + (((sum << 17) & 0xffffffff) | (sum >>> 15));\n  sum = (B + (A ^ (C & (D ^ A))) + X[15] + 0x49b40821) & 0xffffffff;\n  B = C + (((sum << 22) & 0xffffffff) | (sum >>> 10));\n  sum = (A + (C ^ (D & (B ^ C))) + X[1] + 0xf61e2562) & 0xffffffff;\n  A = B + (((sum << 5) & 0xffffffff) | (sum >>> 27));\n  sum = (D + (B ^ (C & (A ^ B))) + X[6] + 0xc040b340) & 0xffffffff;\n  D = A + (((sum << 9) & 0xffffffff) | (sum >>> 23));\n  sum = (C + (A ^ (B & (D ^ A))) + X[11] + 0x265e5a51) & 0xffffffff;\n  C = D + (((sum << 14) & 0xffffffff) | (sum >>> 18));\n  sum = (B + (D ^ (A & (C ^ D))) + X[0] + 0xe9b6c7aa) & 0xffffffff;\n  B = C + (((sum << 20) & 0xffffffff) | (sum >>> 12));\n  sum = (A + (C ^ (D & (B ^ C))) + X[5] + 0xd62f105d) & 0xffffffff;\n  A = B + (((sum << 5) & 0xffffffff) | (sum >>> 27));\n  sum = (D + (B ^ (C & (A ^ B))) + X[10] + 0x02441453) & 0xffffffff;\n  D = A + (((sum << 9) & 0xffffffff) | (sum >>> 23));\n  sum = (C + (A ^ (B & (D ^ A))) + X[15] + 0xd8a1e681) & 0xffffffff;\n  C = D + (((sum << 14) & 0xffffffff) | (sum >>> 18));\n  sum = (B + (D ^ (A & (C ^ D))) + X[4] + 0xe7d3fbc8) & 0xffffffff;\n  B = C + (((sum << 20) & 0xffffffff) | (sum >>> 12));\n  sum = (A + (C ^ (D & (B ^ C))) + X[9] + 0x21e1cde6) & 0xffffffff;\n  A = B + (((sum << 5) & 0xffffffff) | (sum >>> 27));\n  sum = (D + (B ^ (C & (A ^ B))) + X[14] + 0xc33707d6) & 0xffffffff;\n  D = A + (((sum << 9) & 0xffffffff) | (sum >>> 23));\n  sum = (C + (A ^ (B & (D ^ A))) + X[3] + 0xf4d50d87) & 0xffffffff;\n  C = D + (((sum << 14) & 0xffffffff) | (sum >>> 18));\n  sum = (B + (D ^ (A & (C ^ D))) + X[8] + 0x455a14ed) & 0xffffffff;\n  B = C + (((sum << 20) & 0xffffffff) | (sum >>> 12));\n  sum = (A + (C ^ (D & (B ^ C))) + X[13] + 0xa9e3e905) & 0xffffffff;\n  A = B + (((sum << 5) & 0xffffffff) | (sum >>> 27));\n  sum = (D + (B ^ (C & (A ^ B))) + X[2] + 0xfcefa3f8) & 0xffffffff;\n  D = A + (((sum << 9) & 0xffffffff) | (sum >>> 23));\n  sum = (C + (A ^ (B & (D ^ A))) + X[7] + 0x676f02d9) & 0xffffffff;\n  C = D + (((sum << 14) & 0xffffffff) | (sum >>> 18));\n  sum = (B + (D ^ (A & (C ^ D))) + X[12] + 0x8d2a4c8a) & 0xffffffff;\n  B = C + (((sum << 20) & 0xffffffff) | (sum >>> 12));\n  sum = (A + (B ^ C ^ D) + X[5] + 0xfffa3942) & 0xffffffff;\n  A = B + (((sum << 4) & 0xffffffff) | (sum >>> 28));\n  sum = (D + (A ^ B ^ C) + X[8] + 0x8771f681) & 0xffffffff;\n  D = A + (((sum << 11) & 0xffffffff) | (sum >>> 21));\n  sum = (C + (D ^ A ^ B) + X[11] + 0x6d9d6122) & 0xffffffff;\n  C = D + (((sum << 16) & 0xffffffff) | (sum >>> 16));\n  sum = (B + (C ^ D ^ A) + X[14] + 0xfde5380c) & 0xffffffff;\n  B = C + (((sum << 23) & 0xffffffff) | (sum >>> 9));\n  sum = (A + (B ^ C ^ D) + X[1] + 0xa4beea44) & 0xffffffff;\n  A = B + (((sum << 4) & 0xffffffff) | (sum >>> 28));\n  sum = (D + (A ^ B ^ C) + X[4] + 0x4bdecfa9) & 0xffffffff;\n  D = A + (((sum << 11) & 0xffffffff) | (sum >>> 21));\n  sum = (C + (D ^ A ^ B) + X[7] + 0xf6bb4b60) & 0xffffffff;\n  C = D + (((sum << 16) & 0xffffffff) | (sum >>> 16));\n  sum = (B + (C ^ D ^ A) + X[10] + 0xbebfbc70) & 0xffffffff;\n  B = C + (((sum << 23) & 0xffffffff) | (sum >>> 9));\n  sum = (A + (B ^ C ^ D) + X[13] + 0x289b7ec6) & 0xffffffff;\n  A = B + (((sum << 4) & 0xffffffff) | (sum >>> 28));\n  sum = (D + (A ^ B ^ C) + X[0] + 0xeaa127fa) & 0xffffffff;\n  D = A + (((sum << 11) & 0xffffffff) | (sum >>> 21));\n  sum = (C + (D ^ A ^ B) + X[3] + 0xd4ef3085) & 0xffffffff;\n  C = D + (((sum << 16) & 0xffffffff) | (sum >>> 16));\n  sum = (B + (C ^ D ^ A) + X[6] + 0x04881d05) & 0xffffffff;\n  B = C + (((sum << 23) & 0xffffffff) | (sum >>> 9));\n  sum = (A + (B ^ C ^ D) + X[9] + 0xd9d4d039) & 0xffffffff;\n  A = B + (((sum << 4) & 0xffffffff) | (sum >>> 28));\n  sum = (D + (A ^ B ^ C) + X[12] + 0xe6db99e5) & 0xffffffff;\n  D = A + (((sum << 11) & 0xffffffff) | (sum >>> 21));\n  sum = (C + (D ^ A ^ B) + X[15] + 0x1fa27cf8) & 0xffffffff;\n  C = D + (((sum << 16) & 0xffffffff) | (sum >>> 16));\n  sum = (B + (C ^ D ^ A) + X[2] + 0xc4ac5665) & 0xffffffff;\n  B = C + (((sum << 23) & 0xffffffff) | (sum >>> 9));\n  sum = (A + (C ^ (B | (~D))) + X[0] + 0xf4292244) & 0xffffffff;\n  A = B + (((sum << 6) & 0xffffffff) | (sum >>> 26));\n  sum = (D + (B ^ (A | (~C))) + X[7] + 0x432aff97) & 0xffffffff;\n  D = A + (((sum << 10) & 0xffffffff) | (sum >>> 22));\n  sum = (C + (A ^ (D | (~B))) + X[14] + 0xab9423a7) & 0xffffffff;\n  C = D + (((sum << 15) & 0xffffffff) | (sum >>> 17));\n  sum = (B + (D ^ (C | (~A))) + X[5] + 0xfc93a039) & 0xffffffff;\n  B = C + (((sum << 21) & 0xffffffff) | (sum >>> 11));\n  sum = (A + (C ^ (B | (~D))) + X[12] + 0x655b59c3) & 0xffffffff;\n  A = B + (((sum << 6) & 0xffffffff) | (sum >>> 26));\n  sum = (D + (B ^ (A | (~C))) + X[3] + 0x8f0ccc92) & 0xffffffff;\n  D = A + (((sum << 10) & 0xffffffff) | (sum >>> 22));\n  sum = (C + (A ^ (D | (~B))) + X[10] + 0xffeff47d) & 0xffffffff;\n  C = D + (((sum << 15) & 0xffffffff) | (sum >>> 17));\n  sum = (B + (D ^ (C | (~A))) + X[1] + 0x85845dd1) & 0xffffffff;\n  B = C + (((sum << 21) & 0xffffffff) | (sum >>> 11));\n  sum = (A + (C ^ (B | (~D))) + X[8] + 0x6fa87e4f) & 0xffffffff;\n  A = B + (((sum << 6) & 0xffffffff) | (sum >>> 26));\n  sum = (D + (B ^ (A | (~C))) + X[15] + 0xfe2ce6e0) & 0xffffffff;\n  D = A + (((sum << 10) & 0xffffffff) | (sum >>> 22));\n  sum = (C + (A ^ (D | (~B))) + X[6] + 0xa3014314) & 0xffffffff;\n  C = D + (((sum << 15) & 0xffffffff) | (sum >>> 17));\n  sum = (B + (D ^ (C | (~A))) + X[13] + 0x4e0811a1) & 0xffffffff;\n  B = C + (((sum << 21) & 0xffffffff) | (sum >>> 11));\n  sum = (A + (C ^ (B | (~D))) + X[4] + 0xf7537e82) & 0xffffffff;\n  A = B + (((sum << 6) & 0xffffffff) | (sum >>> 26));\n  sum = (D + (B ^ (A | (~C))) + X[11] + 0xbd3af235) & 0xffffffff;\n  D = A + (((sum << 10) & 0xffffffff) | (sum >>> 22));\n  sum = (C + (A ^ (D | (~B))) + X[2] + 0x2ad7d2bb) & 0xffffffff;\n  C = D + (((sum << 15) & 0xffffffff) | (sum >>> 17));\n  sum = (B + (D ^ (C | (~A))) + X[9] + 0xeb86d391) & 0xffffffff;\n  B = C + (((sum << 21) & 0xffffffff) | (sum >>> 11));\n\n  this.chain_[0] = (this.chain_[0] + A) & 0xffffffff;\n  this.chain_[1] = (this.chain_[1] + B) & 0xffffffff;\n  this.chain_[2] = (this.chain_[2] + C) & 0xffffffff;\n  this.chain_[3] = (this.chain_[3] + D) & 0xffffffff;\n};\n\n\n/** @override */\ngoog.crypt.Md5.prototype.update = function(bytes, opt_length) {\n  if (opt_length === undefined) {\n    opt_length = bytes.length;\n  }\n  var lengthMinusBlock = opt_length - this.blockSize;\n\n  // Copy some object properties to local variables in order to save on access\n  // time from inside the loop (~10% speedup was observed on Chrome 11).\n  var block = this.block_;\n  var blockLength = this.blockLength_;\n  var i = 0;\n\n  // The outer while loop should execute at most twice.\n  while (i < opt_length) {\n    // When we have no data in the block to top up, we can directly process the\n    // input buffer (assuming it contains sufficient data). This gives ~30%\n    // speedup on Chrome 14 and ~70% speedup on Firefox 6.0, but requires that\n    // the data is provided in large chunks (or in multiples of 64 bytes).\n    if (blockLength == 0) {\n      while (i <= lengthMinusBlock) {\n        this.compress_(bytes, i);\n        i += this.blockSize;\n      }\n    }\n\n    if (typeof bytes === 'string') {\n      while (i < opt_length) {\n        block[blockLength++] = bytes.charCodeAt(i++);\n        if (blockLength == this.blockSize) {\n          this.compress_(block);\n          blockLength = 0;\n          // Jump to the outer loop so we use the full-block optimization.\n          break;\n        }\n      }\n    } else {\n      while (i < opt_length) {\n        block[blockLength++] = bytes[i++];\n        if (blockLength == this.blockSize) {\n          this.compress_(block);\n          blockLength = 0;\n          // Jump to the outer loop so we use the full-block optimization.\n          break;\n        }\n      }\n    }\n  }\n\n  this.blockLength_ = blockLength;\n  this.totalLength_ += opt_length;\n};\n\n\n/** @override */\ngoog.crypt.Md5.prototype.digest = function() {\n  // This must accommodate at least 1 padding byte (0x80), 8 bytes of\n  // total bitlength, and must end at a 64-byte boundary.\n  var pad = new Array(\n      (this.blockLength_ < 56 ? this.blockSize : this.blockSize * 2) -\n      this.blockLength_);\n\n  // Add padding: 0x80 0x00*\n  pad[0] = 0x80;\n  for (var i = 1; i < pad.length - 8; ++i) {\n    pad[i] = 0;\n  }\n  // Add the total number of bits, little endian 64-bit integer.\n  var totalBits = this.totalLength_ * 8;\n  for (var i = pad.length - 8; i < pad.length; ++i) {\n    pad[i] = totalBits & 0xff;\n    totalBits /= 0x100;  // Don't use bit-shifting here!\n  }\n  this.update(pad);\n\n  var digest = new Array(16);\n  var n = 0;\n  for (var i = 0; i < 4; ++i) {\n    for (var j = 0; j < 32; j += 8) {\n      digest[n++] = (this.chain_[i] >>> j) & 0xff;\n    }\n  }\n  return digest;\n};\n","^J2",1579837703000,"^J3",["^J4",["^IT","^K@"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/md5.js"],"^JD",["^J4",["~$goog.crypt.Md5"]],"^IR",true,"^IS",["^IT","^K@"]],["^ ","^IV",[1579837703000],"^IW","goog.base.js","^IX",["^IY","goog/base.js"],"^IZ","goog/base.js","^I[","^J0","^J1","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Bootstrap for the Google JS Library (Closure).\n *\n * In uncompiled mode base.js will attempt to load Closure's deps file, unless\n * the global <code>CLOSURE_NO_DEPS</code> is set to true.  This allows projects\n * to include their own deps file(s) from different locations.\n *\n * Avoid including base.js more than once. This is strictly discouraged and not\n * supported. goog.require(...) won't work properly in that case.\n *\n * @provideGoog\n */\n\n\n/**\n * @define {boolean} Overridden to true by the compiler.\n */\nvar COMPILED = false;\n\n\n/**\n * Base namespace for the Closure library.  Checks to see goog is already\n * defined in the current scope before assigning to prevent clobbering if\n * base.js is loaded more than once.\n *\n * @const\n */\nvar goog = goog || {};\n\n/**\n * Reference to the global object.\n * https://www.ecma-international.org/ecma-262/9.0/index.html#sec-global-object\n *\n * More info on this implementation here:\n * https://docs.google.com/document/d/1NAeW4Wk7I7FV0Y2tcUFvQdGMc89k2vdgSXInw8_nvCI/edit\n *\n * @const\n * @suppress {undefinedVars} self won't be referenced unless `this` is falsy.\n * @type {!Global}\n */\ngoog.global =\n    // Check `this` first for backwards compatibility.\n    // Valid unless running as an ES module or in a function wrapper called\n    //   without setting `this` properly.\n    // Note that base.js can't usefully be imported as an ES module, but it may\n    // be compiled into bundles that are loadable as ES modules.\n    this ||\n    // https://developer.mozilla.org/en-US/docs/Web/API/Window/self\n    // For in-page browser environments and workers.\n    self;\n\n\n/**\n * A hook for overriding the define values in uncompiled mode.\n *\n * In uncompiled mode, `CLOSURE_UNCOMPILED_DEFINES` may be defined before\n * loading base.js.  If a key is defined in `CLOSURE_UNCOMPILED_DEFINES`,\n * `goog.define` will use the value instead of the default value.  This\n * allows flags to be overwritten without compilation (this is normally\n * accomplished with the compiler's \"define\" flag).\n *\n * Example:\n * <pre>\n *   var CLOSURE_UNCOMPILED_DEFINES = {'goog.DEBUG': false};\n * </pre>\n *\n * @type {Object<string, (string|number|boolean)>|undefined}\n */\ngoog.global.CLOSURE_UNCOMPILED_DEFINES;\n\n\n/**\n * A hook for overriding the define values in uncompiled or compiled mode,\n * like CLOSURE_UNCOMPILED_DEFINES but effective in compiled code.  In\n * uncompiled code CLOSURE_UNCOMPILED_DEFINES takes precedence.\n *\n * Also unlike CLOSURE_UNCOMPILED_DEFINES the values must be number, boolean or\n * string literals or the compiler will emit an error.\n *\n * While any @define value may be set, only those set with goog.define will be\n * effective for uncompiled code.\n *\n * Example:\n * <pre>\n *   var CLOSURE_DEFINES = {'goog.DEBUG': false} ;\n * </pre>\n *\n * @type {Object<string, (string|number|boolean)>|undefined}\n */\ngoog.global.CLOSURE_DEFINES;\n\n\n/**\n * Returns true if the specified value is not undefined.\n *\n * @param {?} val Variable to test.\n * @return {boolean} Whether variable is defined.\n * @deprecated Use `val !== undefined` instead.\n */\ngoog.isDef = function(val) {\n  // void 0 always evaluates to undefined and hence we do not need to depend on\n  // the definition of the global variable named 'undefined'.\n  return val !== void 0;\n};\n\n/**\n * Returns true if the specified value is a string.\n * @param {?} val Variable to test.\n * @return {boolean} Whether variable is a string.\n * @deprecated Use `typeof val === 'string'` instead.\n */\ngoog.isString = function(val) {\n  return typeof val == 'string';\n};\n\n\n/**\n * Returns true if the specified value is a boolean.\n * @param {?} val Variable to test.\n * @return {boolean} Whether variable is boolean.\n * @deprecated Use `typeof val === 'boolean'` instead.\n */\ngoog.isBoolean = function(val) {\n  return typeof val == 'boolean';\n};\n\n\n/**\n * Returns true if the specified value is a number.\n * @param {?} val Variable to test.\n * @return {boolean} Whether variable is a number.\n * @deprecated Use `typeof val === 'number'` instead.\n */\ngoog.isNumber = function(val) {\n  return typeof val == 'number';\n};\n\n\n/**\n * Builds an object structure for the provided namespace path, ensuring that\n * names that already exist are not overwritten. For example:\n * \"a.b.c\" -> a = {};a.b={};a.b.c={};\n * Used by goog.provide and goog.exportSymbol.\n * @param {string} name name of the object that this file defines.\n * @param {*=} opt_object the object to expose at the end of the path.\n * @param {Object=} opt_objectToExportTo The object to add the path to; default\n *     is `goog.global`.\n * @private\n */\ngoog.exportPath_ = function(name, opt_object, opt_objectToExportTo) {\n  var parts = name.split('.');\n  var cur = opt_objectToExportTo || goog.global;\n\n  // Internet Explorer exhibits strange behavior when throwing errors from\n  // methods externed in this manner.  See the testExportSymbolExceptions in\n  // base_test.html for an example.\n  if (!(parts[0] in cur) && typeof cur.execScript != 'undefined') {\n    cur.execScript('var ' + parts[0]);\n  }\n\n  for (var part; parts.length && (part = parts.shift());) {\n    if (!parts.length && opt_object !== undefined) {\n      // last part and we have an object; use it\n      cur[part] = opt_object;\n    } else if (cur[part] && cur[part] !== Object.prototype[part]) {\n      cur = cur[part];\n    } else {\n      cur = cur[part] = {};\n    }\n  }\n};\n\n\n/**\n * Defines a named value. In uncompiled mode, the value is retrieved from\n * CLOSURE_DEFINES or CLOSURE_UNCOMPILED_DEFINES if the object is defined and\n * has the property specified, and otherwise used the defined defaultValue.\n * When compiled the default can be overridden using the compiler options or the\n * value set in the CLOSURE_DEFINES object. Returns the defined value so that it\n * can be used safely in modules. Note that the value type MUST be either\n * boolean, number, or string.\n *\n * @param {string} name The distinguished name to provide.\n * @param {T} defaultValue\n * @return {T} The defined value.\n * @template T\n */\ngoog.define = function(name, defaultValue) {\n  var value = defaultValue;\n  if (!COMPILED) {\n    var uncompiledDefines = goog.global.CLOSURE_UNCOMPILED_DEFINES;\n    var defines = goog.global.CLOSURE_DEFINES;\n    if (uncompiledDefines &&\n        // Anti DOM-clobbering runtime check (b/37736576).\n        /** @type {?} */ (uncompiledDefines).nodeType === undefined &&\n        Object.prototype.hasOwnProperty.call(uncompiledDefines, name)) {\n      value = uncompiledDefines[name];\n    } else if (\n        defines &&\n        // Anti DOM-clobbering runtime check (b/37736576).\n        /** @type {?} */ (defines).nodeType === undefined &&\n        Object.prototype.hasOwnProperty.call(defines, name)) {\n      value = defines[name];\n    }\n  }\n  return value;\n};\n\n\n/**\n * @define {number} Integer year indicating the set of browser features that are\n * guaranteed to be present.  This is defined to include exactly features that\n * work correctly on all \"modern\" browsers that are stable on January 1 of the\n * specified year.  For example,\n * ```js\n * if (goog.FEATURESET_YEAR >= 2019) {\n *   // use APIs known to be available on all major stable browsers Jan 1, 2019\n * } else {\n *   // polyfill for older browsers\n * }\n * ```\n * This is intended to be the primary define for removing\n * unnecessary browser compatibility code (such as ponyfills and workarounds),\n * and should inform the default value for most other defines:\n * ```js\n * const ASSUME_NATIVE_PROMISE =\n *     goog.define('ASSUME_NATIVE_PROMISE', goog.FEATURESET_YEAR >= 2016);\n * ```\n *\n * The default assumption is that IE9 is the lowest supported browser, which was\n * first available Jan 1, 2012.\n *\n * TODO(user): Reference more thorough documentation when it's available.\n */\ngoog.FEATURESET_YEAR = goog.define('goog.FEATURESET_YEAR', 2012);\n\n\n/**\n * @define {boolean} DEBUG is provided as a convenience so that debugging code\n * that should not be included in a production. It can be easily stripped\n * by specifying --define goog.DEBUG=false to the Closure Compiler aka\n * JSCompiler. For example, most toString() methods should be declared inside an\n * \"if (goog.DEBUG)\" conditional because they are generally used for debugging\n * purposes and it is difficult for the JSCompiler to statically determine\n * whether they are used.\n */\ngoog.DEBUG = goog.define('goog.DEBUG', true);\n\n\n/**\n * @define {string} LOCALE defines the locale being used for compilation. It is\n * used to select locale specific data to be compiled in js binary. BUILD rule\n * can specify this value by \"--define goog.LOCALE=<locale_name>\" as a compiler\n * option.\n *\n * Take into account that the locale code format is important. You should use\n * the canonical Unicode format with hyphen as a delimiter. Language must be\n * lowercase, Language Script - Capitalized, Region - UPPERCASE.\n * There are few examples: pt-BR, en, en-US, sr-Latin-BO, zh-Hans-CN.\n *\n * See more info about locale codes here:\n * http://www.unicode.org/reports/tr35/#Unicode_Language_and_Locale_Identifiers\n *\n * For language codes you should use values defined by ISO 693-1. See it here\n * http://www.w3.org/WAI/ER/IG/ert/iso639.htm. There is only one exception from\n * this rule: the Hebrew language. For legacy reasons the old code (iw) should\n * be used instead of the new code (he).\n *\n */\ngoog.LOCALE = goog.define('goog.LOCALE', 'en');  // default to en\n\n\n/**\n * @define {boolean} Whether this code is running on trusted sites.\n *\n * On untrusted sites, several native functions can be defined or overridden by\n * external libraries like Prototype, Datejs, and JQuery and setting this flag\n * to false forces closure to use its own implementations when possible.\n *\n * If your JavaScript can be loaded by a third party site and you are wary about\n * relying on non-standard implementations, specify\n * \"--define goog.TRUSTED_SITE=false\" to the compiler.\n */\ngoog.TRUSTED_SITE = goog.define('goog.TRUSTED_SITE', true);\n\n\n/**\n * @define {boolean} Whether a project is expected to be running in strict mode.\n *\n * This define can be used to trigger alternate implementations compatible with\n * running in EcmaScript Strict mode or warn about unavailable functionality.\n * @see https://goo.gl/PudQ4y\n *\n */\ngoog.STRICT_MODE_COMPATIBLE = goog.define('goog.STRICT_MODE_COMPATIBLE', false);\n\n\n/**\n * @define {boolean} Whether code that calls {@link goog.setTestOnly} should\n *     be disallowed in the compilation unit.\n */\ngoog.DISALLOW_TEST_ONLY_CODE =\n    goog.define('goog.DISALLOW_TEST_ONLY_CODE', COMPILED && !goog.DEBUG);\n\n\n/**\n * @define {boolean} Whether to use a Chrome app CSP-compliant method for\n *     loading scripts via goog.require. @see appendScriptSrcNode_.\n */\ngoog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING =\n    goog.define('goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING', false);\n\n\n/**\n * Defines a namespace in Closure.\n *\n * A namespace may only be defined once in a codebase. It may be defined using\n * goog.provide() or goog.module().\n *\n * The presence of one or more goog.provide() calls in a file indicates\n * that the file defines the given objects/namespaces.\n * Provided symbols must not be null or undefined.\n *\n * In addition, goog.provide() creates the object stubs for a namespace\n * (for example, goog.provide(\"goog.foo.bar\") will create the object\n * goog.foo.bar if it does not already exist).\n *\n * Build tools also scan for provide/require/module statements\n * to discern dependencies, build dependency files (see deps.js), etc.\n *\n * @see goog.require\n * @see goog.module\n * @param {string} name Namespace provided by this file in the form\n *     \"goog.package.part\".\n */\ngoog.provide = function(name) {\n  if (goog.isInModuleLoader_()) {\n    throw new Error('goog.provide cannot be used within a module.');\n  }\n  if (!COMPILED) {\n    // Ensure that the same namespace isn't provided twice.\n    // A goog.module/goog.provide maps a goog.require to a specific file\n    if (goog.isProvided_(name)) {\n      throw new Error('Namespace \"' + name + '\" already declared.');\n    }\n  }\n\n  goog.constructNamespace_(name);\n};\n\n\n/**\n * @param {string} name Namespace provided by this file in the form\n *     \"goog.package.part\".\n * @param {Object=} opt_obj The object to embed in the namespace.\n * @private\n */\ngoog.constructNamespace_ = function(name, opt_obj) {\n  if (!COMPILED) {\n    delete goog.implicitNamespaces_[name];\n\n    var namespace = name;\n    while ((namespace = namespace.substring(0, namespace.lastIndexOf('.')))) {\n      if (goog.getObjectByName(namespace)) {\n        break;\n      }\n      goog.implicitNamespaces_[namespace] = true;\n    }\n  }\n\n  goog.exportPath_(name, opt_obj);\n};\n\n\n/**\n * Returns CSP nonce, if set for any script tag.\n * @param {?Window=} opt_window The window context used to retrieve the nonce.\n *     Defaults to global context.\n * @return {string} CSP nonce or empty string if no nonce is present.\n */\ngoog.getScriptNonce = function(opt_window) {\n  if (opt_window && opt_window != goog.global) {\n    return goog.getScriptNonce_(opt_window.document);\n  }\n  if (goog.cspNonce_ === null) {\n    goog.cspNonce_ = goog.getScriptNonce_(goog.global.document);\n  }\n  return goog.cspNonce_;\n};\n\n\n/**\n * According to the CSP3 spec a nonce must be a valid base64 string.\n * @see https://www.w3.org/TR/CSP3/#grammardef-base64-value\n * @private @const\n */\ngoog.NONCE_PATTERN_ = /^[\\w+/_-]+[=]{0,2}$/;\n\n\n/**\n * @private {?string}\n */\ngoog.cspNonce_ = null;\n\n\n/**\n * Returns CSP nonce, if set for any script tag.\n * @param {!Document} doc\n * @return {string} CSP nonce or empty string if no nonce is present.\n * @private\n */\ngoog.getScriptNonce_ = function(doc) {\n  var script = doc.querySelector && doc.querySelector('script[nonce]');\n  if (script) {\n    // Try to get the nonce from the IDL property first, because browsers that\n    // implement additional nonce protection features (currently only Chrome) to\n    // prevent nonce stealing via CSS do not expose the nonce via attributes.\n    // See https://github.com/whatwg/html/issues/2369\n    var nonce = script['nonce'] || script.getAttribute('nonce');\n    if (nonce && goog.NONCE_PATTERN_.test(nonce)) {\n      return nonce;\n    }\n  }\n  return '';\n};\n\n\n/**\n * Module identifier validation regexp.\n * Note: This is a conservative check, it is very possible to be more lenient,\n *   the primary exclusion here is \"/\" and \"\\\" and a leading \".\", these\n *   restrictions are intended to leave the door open for using goog.require\n *   with relative file paths rather than module identifiers.\n * @private\n */\ngoog.VALID_MODULE_RE_ = /^[a-zA-Z_$][a-zA-Z0-9._$]*$/;\n\n\n/**\n * Defines a module in Closure.\n *\n * Marks that this file must be loaded as a module and claims the namespace.\n *\n * A namespace may only be defined once in a codebase. It may be defined using\n * goog.provide() or goog.module().\n *\n * goog.module() has three requirements:\n * - goog.module may not be used in the same file as goog.provide.\n * - goog.module must be the first statement in the file.\n * - only one goog.module is allowed per file.\n *\n * When a goog.module annotated file is loaded, it is enclosed in\n * a strict function closure. This means that:\n * - any variables declared in a goog.module file are private to the file\n * (not global), though the compiler is expected to inline the module.\n * - The code must obey all the rules of \"strict\" JavaScript.\n * - the file will be marked as \"use strict\"\n *\n * NOTE: unlike goog.provide, goog.module does not declare any symbols by\n * itself. If declared symbols are desired, use\n * goog.module.declareLegacyNamespace().\n *\n *\n * See the public goog.module proposal: http://goo.gl/Va1hin\n *\n * @param {string} name Namespace provided by this file in the form\n *     \"goog.package.part\", is expected but not required.\n * @return {void}\n */\ngoog.module = function(name) {\n  if (typeof name !== 'string' || !name ||\n      name.search(goog.VALID_MODULE_RE_) == -1) {\n    throw new Error('Invalid module identifier');\n  }\n  if (!goog.isInGoogModuleLoader_()) {\n    throw new Error(\n        'Module ' + name + ' has been loaded incorrectly. Note, ' +\n        'modules cannot be loaded as normal scripts. They require some kind of ' +\n        'pre-processing step. You\\'re likely trying to load a module via a ' +\n        'script tag or as a part of a concatenated bundle without rewriting the ' +\n        'module. For more info see: ' +\n        'https://github.com/google/closure-library/wiki/goog.module:-an-ES6-module-like-alternative-to-goog.provide.');\n  }\n  if (goog.moduleLoaderState_.moduleName) {\n    throw new Error('goog.module may only be called once per module.');\n  }\n\n  // Store the module name for the loader.\n  goog.moduleLoaderState_.moduleName = name;\n  if (!COMPILED) {\n    // Ensure that the same namespace isn't provided twice.\n    // A goog.module/goog.provide maps a goog.require to a specific file\n    if (goog.isProvided_(name)) {\n      throw new Error('Namespace \"' + name + '\" already declared.');\n    }\n    delete goog.implicitNamespaces_[name];\n  }\n};\n\n\n/**\n * @param {string} name The module identifier.\n * @return {?} The module exports for an already loaded module or null.\n *\n * Note: This is not an alternative to goog.require, it does not\n * indicate a hard dependency, instead it is used to indicate\n * an optional dependency or to access the exports of a module\n * that has already been loaded.\n * @suppress {missingProvide}\n */\ngoog.module.get = function(name) {\n  return goog.module.getInternal_(name);\n};\n\n\n/**\n * @param {string} name The module identifier.\n * @return {?} The module exports for an already loaded module or null.\n * @private\n */\ngoog.module.getInternal_ = function(name) {\n  if (!COMPILED) {\n    if (name in goog.loadedModules_) {\n      return goog.loadedModules_[name].exports;\n    } else if (!goog.implicitNamespaces_[name]) {\n      var ns = goog.getObjectByName(name);\n      return ns != null ? ns : null;\n    }\n  }\n  return null;\n};\n\n\n/**\n * Types of modules the debug loader can load.\n * @enum {string}\n */\ngoog.ModuleType = {\n  ES6: 'es6',\n  GOOG: 'goog'\n};\n\n\n/**\n * @private {?{\n *   moduleName: (string|undefined),\n *   declareLegacyNamespace:boolean,\n *   type: ?goog.ModuleType\n * }}\n */\ngoog.moduleLoaderState_ = null;\n\n\n/**\n * @private\n * @return {boolean} Whether a goog.module or an es6 module is currently being\n *     initialized.\n */\ngoog.isInModuleLoader_ = function() {\n  return goog.isInGoogModuleLoader_() || goog.isInEs6ModuleLoader_();\n};\n\n\n/**\n * @private\n * @return {boolean} Whether a goog.module is currently being initialized.\n */\ngoog.isInGoogModuleLoader_ = function() {\n  return !!goog.moduleLoaderState_ &&\n      goog.moduleLoaderState_.type == goog.ModuleType.GOOG;\n};\n\n\n/**\n * @private\n * @return {boolean} Whether an es6 module is currently being initialized.\n */\ngoog.isInEs6ModuleLoader_ = function() {\n  var inLoader = !!goog.moduleLoaderState_ &&\n      goog.moduleLoaderState_.type == goog.ModuleType.ES6;\n\n  if (inLoader) {\n    return true;\n  }\n\n  var jscomp = goog.global['$jscomp'];\n\n  if (jscomp) {\n    // jscomp may not have getCurrentModulePath if this is a compiled bundle\n    // that has some of the runtime, but not all of it. This can happen if\n    // optimizations are turned on so the unused runtime is removed but renaming\n    // and Closure pass are off (so $jscomp is still named $jscomp and the\n    // goog.provide/require calls still exist).\n    if (typeof jscomp.getCurrentModulePath != 'function') {\n      return false;\n    }\n\n    // Bundled ES6 module.\n    return !!jscomp.getCurrentModulePath();\n  }\n\n  return false;\n};\n\n\n/**\n * Provide the module's exports as a globally accessible object under the\n * module's declared name.  This is intended to ease migration to goog.module\n * for files that have existing usages.\n * @suppress {missingProvide}\n */\ngoog.module.declareLegacyNamespace = function() {\n  if (!COMPILED && !goog.isInGoogModuleLoader_()) {\n    throw new Error(\n        'goog.module.declareLegacyNamespace must be called from ' +\n        'within a goog.module');\n  }\n  if (!COMPILED && !goog.moduleLoaderState_.moduleName) {\n    throw new Error(\n        'goog.module must be called prior to ' +\n        'goog.module.declareLegacyNamespace.');\n  }\n  goog.moduleLoaderState_.declareLegacyNamespace = true;\n};\n\n\n/**\n * Associates an ES6 module with a Closure module ID so that is available via\n * goog.require. The associated ID  acts like a goog.module ID - it does not\n * create any global names, it is merely available via goog.require /\n * goog.module.get / goog.forwardDeclare / goog.requireType. goog.require and\n * goog.module.get will return the entire module as if it was import *'d. This\n * allows Closure files to reference ES6 modules for the sake of migration.\n *\n * @param {string} namespace\n * @suppress {missingProvide}\n */\ngoog.declareModuleId = function(namespace) {\n  if (!COMPILED) {\n    if (!goog.isInEs6ModuleLoader_()) {\n      throw new Error(\n          'goog.declareModuleId may only be called from ' +\n          'within an ES6 module');\n    }\n    if (goog.moduleLoaderState_ && goog.moduleLoaderState_.moduleName) {\n      throw new Error(\n          'goog.declareModuleId may only be called once per module.');\n    }\n    if (namespace in goog.loadedModules_) {\n      throw new Error(\n          'Module with namespace \"' + namespace + '\" already exists.');\n    }\n  }\n  if (goog.moduleLoaderState_) {\n    // Not bundled - debug loading.\n    goog.moduleLoaderState_.moduleName = namespace;\n  } else {\n    // Bundled - not debug loading, no module loader state.\n    var jscomp = goog.global['$jscomp'];\n    if (!jscomp || typeof jscomp.getCurrentModulePath != 'function') {\n      throw new Error(\n          'Module with namespace \"' + namespace +\n          '\" has been loaded incorrectly.');\n    }\n    var exports = jscomp.require(jscomp.getCurrentModulePath());\n    goog.loadedModules_[namespace] = {\n      exports: exports,\n      type: goog.ModuleType.ES6,\n      moduleId: namespace\n    };\n  }\n};\n\n\n/**\n * Marks that the current file should only be used for testing, and never for\n * live code in production.\n *\n * In the case of unit tests, the message may optionally be an exact namespace\n * for the test (e.g. 'goog.stringTest'). The linter will then ignore the extra\n * provide (if not explicitly defined in the code).\n *\n * @param {string=} opt_message Optional message to add to the error that's\n *     raised when used in production code.\n */\ngoog.setTestOnly = function(opt_message) {\n  if (goog.DISALLOW_TEST_ONLY_CODE) {\n    opt_message = opt_message || '';\n    throw new Error(\n        'Importing test-only code into non-debug environment' +\n        (opt_message ? ': ' + opt_message : '.'));\n  }\n};\n\n\n/**\n * Forward declares a symbol. This is an indication to the compiler that the\n * symbol may be used in the source yet is not required and may not be provided\n * in compilation.\n *\n * The most common usage of forward declaration is code that takes a type as a\n * function parameter but does not need to require it. By forward declaring\n * instead of requiring, no hard dependency is made, and (if not required\n * elsewhere) the namespace may never be required and thus, not be pulled\n * into the JavaScript binary. If it is required elsewhere, it will be type\n * checked as normal.\n *\n * Before using goog.forwardDeclare, please read the documentation at\n * https://github.com/google/closure-compiler/wiki/Bad-Type-Annotation to\n * understand the options and tradeoffs when working with forward declarations.\n *\n * @param {string} name The namespace to forward declare in the form of\n *     \"goog.package.part\".\n */\ngoog.forwardDeclare = function(name) {};\n\n\n/**\n * Forward declare type information. Used to assign types to goog.global\n * referenced object that would otherwise result in unknown type references\n * and thus block property disambiguation.\n */\ngoog.forwardDeclare('Document');\ngoog.forwardDeclare('HTMLScriptElement');\ngoog.forwardDeclare('XMLHttpRequest');\n\n\nif (!COMPILED) {\n  /**\n   * Check if the given name has been goog.provided. This will return false for\n   * names that are available only as implicit namespaces.\n   * @param {string} name name of the object to look for.\n   * @return {boolean} Whether the name has been provided.\n   * @private\n   */\n  goog.isProvided_ = function(name) {\n    return (name in goog.loadedModules_) ||\n        (!goog.implicitNamespaces_[name] && goog.getObjectByName(name) != null);\n  };\n\n  /**\n   * Namespaces implicitly defined by goog.provide. For example,\n   * goog.provide('goog.events.Event') implicitly declares that 'goog' and\n   * 'goog.events' must be namespaces.\n   *\n   * @type {!Object<string, (boolean|undefined)>}\n   * @private\n   */\n  goog.implicitNamespaces_ = {'goog.module': true};\n\n  // NOTE: We add goog.module as an implicit namespace as goog.module is defined\n  // here and because the existing module package has not been moved yet out of\n  // the goog.module namespace. This satisifies both the debug loader and\n  // ahead-of-time dependency management.\n}\n\n\n/**\n * Returns an object based on its fully qualified external name.  The object\n * is not found if null or undefined.  If you are using a compilation pass that\n * renames property names beware that using this function will not find renamed\n * properties.\n *\n * @param {string} name The fully qualified name.\n * @param {Object=} opt_obj The object within which to look; default is\n *     |goog.global|.\n * @return {?} The value (object or primitive) or, if not found, null.\n */\ngoog.getObjectByName = function(name, opt_obj) {\n  var parts = name.split('.');\n  var cur = opt_obj || goog.global;\n  for (var i = 0; i < parts.length; i++) {\n    cur = cur[parts[i]];\n    if (cur == null) {\n      return null;\n    }\n  }\n  return cur;\n};\n\n\n/**\n * Globalizes a whole namespace, such as goog or goog.lang.\n *\n * @param {!Object} obj The namespace to globalize.\n * @param {Object=} opt_global The object to add the properties to.\n * @deprecated Properties may be explicitly exported to the global scope, but\n *     this should no longer be done in bulk.\n */\ngoog.globalize = function(obj, opt_global) {\n  var global = opt_global || goog.global;\n  for (var x in obj) {\n    global[x] = obj[x];\n  }\n};\n\n\n/**\n * Adds a dependency from a file to the files it requires.\n * @param {string} relPath The path to the js file.\n * @param {!Array<string>} provides An array of strings with\n *     the names of the objects this file provides.\n * @param {!Array<string>} requires An array of strings with\n *     the names of the objects this file requires.\n * @param {boolean|!Object<string>=} opt_loadFlags Parameters indicating\n *     how the file must be loaded.  The boolean 'true' is equivalent\n *     to {'module': 'goog'} for backwards-compatibility.  Valid properties\n *     and values include {'module': 'goog'} and {'lang': 'es6'}.\n */\ngoog.addDependency = function(relPath, provides, requires, opt_loadFlags) {\n  if (!COMPILED && goog.DEPENDENCIES_ENABLED) {\n    goog.debugLoader_.addDependency(relPath, provides, requires, opt_loadFlags);\n  }\n};\n\n\n\n\n// NOTE(nnaze): The debug DOM loader was included in base.js as an original way\n// to do \"debug-mode\" development.  The dependency system can sometimes be\n// confusing, as can the debug DOM loader's asynchronous nature.\n//\n// With the DOM loader, a call to goog.require() is not blocking -- the script\n// will not load until some point after the current script.  If a namespace is\n// needed at runtime, it needs to be defined in a previous script, or loaded via\n// require() with its registered dependencies.\n//\n// User-defined namespaces may need their own deps file. For a reference on\n// creating a deps file, see:\n// Externally: https://developers.google.com/closure/library/docs/depswriter\n//\n// Because of legacy clients, the DOM loader can't be easily removed from\n// base.js.  Work was done to make it disableable or replaceable for\n// different environments (DOM-less JavaScript interpreters like Rhino or V8,\n// for example). See bootstrap/ for more information.\n\n\n/**\n * @define {boolean} Whether to enable the debug loader.\n *\n * If enabled, a call to goog.require() will attempt to load the namespace by\n * appending a script tag to the DOM (if the namespace has been registered).\n *\n * If disabled, goog.require() will simply assert that the namespace has been\n * provided (and depend on the fact that some outside tool correctly ordered\n * the script).\n */\ngoog.ENABLE_DEBUG_LOADER = goog.define('goog.ENABLE_DEBUG_LOADER', true);\n\n\n/**\n * @param {string} msg\n * @private\n */\ngoog.logToConsole_ = function(msg) {\n  if (goog.global.console) {\n    goog.global.console['error'](msg);\n  }\n};\n\n\n/**\n * Implements a system for the dynamic resolution of dependencies that works in\n * parallel with the BUILD system.\n *\n * Note that all calls to goog.require will be stripped by the compiler.\n *\n * @see goog.provide\n * @param {string} namespace Namespace (as was given in goog.provide,\n *     goog.module, or goog.declareModuleId) in the form\n *     \"goog.package.part\".\n * @return {?} If called within a goog.module or ES6 module file, the associated\n *     namespace or module otherwise null.\n */\ngoog.require = function(namespace) {\n  if (!COMPILED) {\n    // Might need to lazy load on old IE.\n    if (goog.ENABLE_DEBUG_LOADER) {\n      goog.debugLoader_.requested(namespace);\n    }\n\n    // If the object already exists we do not need to do anything.\n    if (goog.isProvided_(namespace)) {\n      if (goog.isInModuleLoader_()) {\n        return goog.module.getInternal_(namespace);\n      }\n    } else if (goog.ENABLE_DEBUG_LOADER) {\n      var moduleLoaderState = goog.moduleLoaderState_;\n      goog.moduleLoaderState_ = null;\n      try {\n        goog.debugLoader_.load_(namespace);\n      } finally {\n        goog.moduleLoaderState_ = moduleLoaderState;\n      }\n    }\n\n    return null;\n  }\n};\n\n\n/**\n * Requires a symbol for its type information. This is an indication to the\n * compiler that the symbol may appear in type annotations, yet it is not\n * referenced at runtime.\n *\n * When called within a goog.module or ES6 module file, the return value may be\n * assigned to or destructured into a variable, but it may not be otherwise used\n * in code outside of a type annotation.\n *\n * Note that all calls to goog.requireType will be stripped by the compiler.\n *\n * @param {string} namespace Namespace (as was given in goog.provide,\n *     goog.module, or goog.declareModuleId) in the form\n *     \"goog.package.part\".\n * @return {?}\n */\ngoog.requireType = function(namespace) {\n  // Return an empty object so that single-level destructuring of the return\n  // value doesn't crash at runtime when using the debug loader. Multi-level\n  // destructuring isn't supported.\n  return {};\n};\n\n\n/**\n * Path for included scripts.\n * @type {string}\n */\ngoog.basePath = '';\n\n\n/**\n * A hook for overriding the base path.\n * @type {string|undefined}\n */\ngoog.global.CLOSURE_BASE_PATH;\n\n\n/**\n * Whether to attempt to load Closure's deps file. By default, when uncompiled,\n * deps files will attempt to be loaded.\n * @type {boolean|undefined}\n */\ngoog.global.CLOSURE_NO_DEPS;\n\n\n/**\n * A function to import a single script. This is meant to be overridden when\n * Closure is being run in non-HTML contexts, such as web workers. It's defined\n * in the global scope so that it can be set before base.js is loaded, which\n * allows deps.js to be imported properly.\n *\n * The first parameter the script source, which is a relative URI. The second,\n * optional parameter is the script contents, in the event the script needed\n * transformation. It should return true if the script was imported, false\n * otherwise.\n * @type {(function(string, string=): boolean)|undefined}\n */\ngoog.global.CLOSURE_IMPORT_SCRIPT;\n\n\n/**\n * Null function used for default values of callbacks, etc.\n * @return {void} Nothing.\n */\ngoog.nullFunction = function() {};\n\n\n/**\n * When defining a class Foo with an abstract method bar(), you can do:\n * Foo.prototype.bar = goog.abstractMethod\n *\n * Now if a subclass of Foo fails to override bar(), an error will be thrown\n * when bar() is invoked.\n *\n * @type {!Function}\n * @throws {Error} when invoked to indicate the method should be overridden.\n * @deprecated Use \"@abstract\" annotation instead of goog.abstractMethod in new\n *     code. See\n *     https://github.com/google/closure-compiler/wiki/@abstract-classes-and-methods\n */\ngoog.abstractMethod = function() {\n  throw new Error('unimplemented abstract method');\n};\n\n\n/**\n * Adds a `getInstance` static method that always returns the same\n * instance object.\n * @param {!Function} ctor The constructor for the class to add the static\n *     method to.\n * @suppress {missingProperties} 'instance_' isn't a property on 'Function'\n *     but we don't have a better type to use here.\n */\ngoog.addSingletonGetter = function(ctor) {\n  // instance_ is immediately set to prevent issues with sealed constructors\n  // such as are encountered when a constructor is returned as the export object\n  // of a goog.module in unoptimized code.\n  // Delcare type to avoid conformance violations that ctor.instance_ is unknown\n  /** @type {undefined|!Object} @suppress {underscore} */\n  ctor.instance_ = undefined;\n  ctor.getInstance = function() {\n    if (ctor.instance_) {\n      return ctor.instance_;\n    }\n    if (goog.DEBUG) {\n      // NOTE: JSCompiler can't optimize away Array#push.\n      goog.instantiatedSingletons_[goog.instantiatedSingletons_.length] = ctor;\n    }\n    // Cast to avoid conformance violations that ctor.instance_ is unknown\n    return /** @type {!Object|undefined} */ (ctor.instance_) = new ctor;\n  };\n};\n\n\n/**\n * All singleton classes that have been instantiated, for testing. Don't read\n * it directly, use the `goog.testing.singleton` module. The compiler\n * removes this variable if unused.\n * @type {!Array<!Function>}\n * @private\n */\ngoog.instantiatedSingletons_ = [];\n\n\n/**\n * @define {boolean} Whether to load goog.modules using `eval` when using\n * the debug loader.  This provides a better debugging experience as the\n * source is unmodified and can be edited using Chrome Workspaces or similar.\n * However in some environments the use of `eval` is banned\n * so we provide an alternative.\n */\ngoog.LOAD_MODULE_USING_EVAL = goog.define('goog.LOAD_MODULE_USING_EVAL', true);\n\n\n/**\n * @define {boolean} Whether the exports of goog.modules should be sealed when\n * possible.\n */\ngoog.SEAL_MODULE_EXPORTS = goog.define('goog.SEAL_MODULE_EXPORTS', goog.DEBUG);\n\n\n/**\n * The registry of initialized modules:\n * The module identifier or path to module exports map.\n * @private @const {!Object<string, {exports:?,type:string,moduleId:string}>}\n */\ngoog.loadedModules_ = {};\n\n\n/**\n * True if the debug loader enabled and used.\n * @const {boolean}\n */\ngoog.DEPENDENCIES_ENABLED = !COMPILED && goog.ENABLE_DEBUG_LOADER;\n\n\n/**\n * @define {string} How to decide whether to transpile.  Valid values\n * are 'always', 'never', and 'detect'.  The default ('detect') is to\n * use feature detection to determine which language levels need\n * transpilation.\n */\n// NOTE(sdh): we could expand this to accept a language level to bypass\n// detection: e.g. goog.TRANSPILE == 'es5' would transpile ES6 files but\n// would leave ES3 and ES5 files alone.\ngoog.TRANSPILE = goog.define('goog.TRANSPILE', 'detect');\n\n/**\n * @define {boolean} If true assume that ES modules have already been\n * transpiled by the jscompiler (in the same way that transpile.js would\n * transpile them - to jscomp modules). Useful only for servers that wish to use\n * the debug loader and transpile server side. Thus this is only respected if\n * goog.TRANSPILE is \"never\".\n */\ngoog.ASSUME_ES_MODULES_TRANSPILED =\n    goog.define('goog.ASSUME_ES_MODULES_TRANSPILED', false);\n\n\n/**\n * @define {string} If a file needs to be transpiled what the output language\n * should be. By default this is the highest language level this file detects\n * the current environment supports. Generally this flag should not be set, but\n * it could be useful to override. Example: If the current environment supports\n * ES6 then by default ES7+ files will be transpiled to ES6, unless this is\n * overridden.\n *\n * Valid values include: es3, es5, es6, es7, and es8. Anything not recognized\n * is treated as es3.\n *\n * Note that setting this value does not force transpilation. Just if\n * transpilation occurs this will be the output. So this is most useful when\n * goog.TRANSPILE is set to 'always' and then forcing the language level to be\n * something lower than what the environment detects.\n */\ngoog.TRANSPILE_TO_LANGUAGE = goog.define('goog.TRANSPILE_TO_LANGUAGE', '');\n\n\n/**\n * @define {string} Path to the transpiler.  Executing the script at this\n * path (relative to base.js) should define a function $jscomp.transpile.\n */\ngoog.TRANSPILER = goog.define('goog.TRANSPILER', 'transpile.js');\n\n\n/**\n * @package {?boolean}\n * Visible for testing.\n */\ngoog.hasBadLetScoping = null;\n\n\n/**\n * @return {boolean}\n * @package Visible for testing.\n */\ngoog.useSafari10Workaround = function() {\n  if (goog.hasBadLetScoping == null) {\n    var hasBadLetScoping;\n    try {\n      hasBadLetScoping = !eval(\n          '\"use strict\";' +\n          'let x = 1; function f() { return typeof x; };' +\n          'f() == \"number\";');\n    } catch (e) {\n      // Assume that ES6 syntax isn't supported.\n      hasBadLetScoping = false;\n    }\n    goog.hasBadLetScoping = hasBadLetScoping;\n  }\n  return goog.hasBadLetScoping;\n};\n\n\n/**\n * @param {string} moduleDef\n * @return {string}\n * @package Visible for testing.\n */\ngoog.workaroundSafari10EvalBug = function(moduleDef) {\n  return '(function(){' + moduleDef +\n      '\\n' +  // Terminate any trailing single line comment.\n      ';' +   // Terminate any trailing expression.\n      '})();\\n';\n};\n\n\n/**\n * @param {function(?):?|string} moduleDef The module definition.\n */\ngoog.loadModule = function(moduleDef) {\n  // NOTE: we allow function definitions to be either in the from\n  // of a string to eval (which keeps the original source intact) or\n  // in a eval forbidden environment (CSP) we allow a function definition\n  // which in its body must call `goog.module`, and return the exports\n  // of the module.\n  var previousState = goog.moduleLoaderState_;\n  try {\n    goog.moduleLoaderState_ = {\n      moduleName: '',\n      declareLegacyNamespace: false,\n      type: goog.ModuleType.GOOG\n    };\n    var exports;\n    if (goog.isFunction(moduleDef)) {\n      exports = moduleDef.call(undefined, {});\n    } else if (typeof moduleDef === 'string') {\n      if (goog.useSafari10Workaround()) {\n        moduleDef = goog.workaroundSafari10EvalBug(moduleDef);\n      }\n\n      exports = goog.loadModuleFromSource_.call(undefined, moduleDef);\n    } else {\n      throw new Error('Invalid module definition');\n    }\n\n    var moduleName = goog.moduleLoaderState_.moduleName;\n    if (typeof moduleName === 'string' && moduleName) {\n      // Don't seal legacy namespaces as they may be used as a parent of\n      // another namespace\n      if (goog.moduleLoaderState_.declareLegacyNamespace) {\n        goog.constructNamespace_(moduleName, exports);\n      } else if (\n          goog.SEAL_MODULE_EXPORTS && Object.seal &&\n          typeof exports == 'object' && exports != null) {\n        Object.seal(exports);\n      }\n\n      var data = {\n        exports: exports,\n        type: goog.ModuleType.GOOG,\n        moduleId: goog.moduleLoaderState_.moduleName\n      };\n      goog.loadedModules_[moduleName] = data;\n    } else {\n      throw new Error('Invalid module name \\\"' + moduleName + '\\\"');\n    }\n  } finally {\n    goog.moduleLoaderState_ = previousState;\n  }\n};\n\n\n/**\n * @private @const\n */\ngoog.loadModuleFromSource_ = /** @type {function(string):?} */ (function() {\n  // NOTE: we avoid declaring parameters or local variables here to avoid\n  // masking globals or leaking values into the module definition.\n  'use strict';\n  var exports = {};\n  eval(arguments[0]);\n  return exports;\n});\n\n\n/**\n * Normalize a file path by removing redundant \"..\" and extraneous \".\" file\n * path components.\n * @param {string} path\n * @return {string}\n * @private\n */\ngoog.normalizePath_ = function(path) {\n  var components = path.split('/');\n  var i = 0;\n  while (i < components.length) {\n    if (components[i] == '.') {\n      components.splice(i, 1);\n    } else if (\n        i && components[i] == '..' && components[i - 1] &&\n        components[i - 1] != '..') {\n      components.splice(--i, 2);\n    } else {\n      i++;\n    }\n  }\n  return components.join('/');\n};\n\n\n/**\n * Provides a hook for loading a file when using Closure's goog.require() API\n * with goog.modules.  In particular this hook is provided to support Node.js.\n *\n * @type {(function(string):string)|undefined}\n */\ngoog.global.CLOSURE_LOAD_FILE_SYNC;\n\n\n/**\n * Loads file by synchronous XHR. Should not be used in production environments.\n * @param {string} src Source URL.\n * @return {?string} File contents, or null if load failed.\n * @private\n */\ngoog.loadFileSync_ = function(src) {\n  if (goog.global.CLOSURE_LOAD_FILE_SYNC) {\n    return goog.global.CLOSURE_LOAD_FILE_SYNC(src);\n  } else {\n    try {\n      /** @type {XMLHttpRequest} */\n      var xhr = new goog.global['XMLHttpRequest']();\n      xhr.open('get', src, false);\n      xhr.send();\n      // NOTE: Successful http: requests have a status of 200, but successful\n      // file: requests may have a status of zero.  Any other status, or a\n      // thrown exception (particularly in case of file: requests) indicates\n      // some sort of error, which we treat as a missing or unavailable file.\n      return xhr.status == 0 || xhr.status == 200 ? xhr.responseText : null;\n    } catch (err) {\n      // No need to rethrow or log, since errors should show up on their own.\n      return null;\n    }\n  }\n};\n\n\n/**\n * Lazily retrieves the transpiler and applies it to the source.\n * @param {string} code JS code.\n * @param {string} path Path to the code.\n * @param {string} target Language level output.\n * @return {string} The transpiled code.\n * @private\n */\ngoog.transpile_ = function(code, path, target) {\n  var jscomp = goog.global['$jscomp'];\n  if (!jscomp) {\n    goog.global['$jscomp'] = jscomp = {};\n  }\n  var transpile = jscomp.transpile;\n  if (!transpile) {\n    var transpilerPath = goog.basePath + goog.TRANSPILER;\n    var transpilerCode = goog.loadFileSync_(transpilerPath);\n    if (transpilerCode) {\n      // This must be executed synchronously, since by the time we know we\n      // need it, we're about to load and write the ES6 code synchronously,\n      // so a normal script-tag load will be too slow. Wrapped in a function\n      // so that code is eval'd in the global scope.\n      (function() {\n        (0, eval)(transpilerCode + '\\n//# sourceURL=' + transpilerPath);\n      }).call(goog.global);\n      // Even though the transpiler is optional, if $gwtExport is found, it's\n      // a sign the transpiler was loaded and the $jscomp.transpile *should*\n      // be there.\n      if (goog.global['$gwtExport'] && goog.global['$gwtExport']['$jscomp'] &&\n          !goog.global['$gwtExport']['$jscomp']['transpile']) {\n        throw new Error(\n            'The transpiler did not properly export the \"transpile\" ' +\n            'method. $gwtExport: ' + JSON.stringify(goog.global['$gwtExport']));\n      }\n      // transpile.js only exports a single $jscomp function, transpile. We\n      // grab just that and add it to the existing definition of $jscomp which\n      // contains the polyfills.\n      goog.global['$jscomp'].transpile =\n          goog.global['$gwtExport']['$jscomp']['transpile'];\n      jscomp = goog.global['$jscomp'];\n      transpile = jscomp.transpile;\n    }\n  }\n  if (!transpile) {\n    // The transpiler is an optional component.  If it's not available then\n    // replace it with a pass-through function that simply logs.\n    var suffix = ' requires transpilation but no transpiler was found.';\n    transpile = jscomp.transpile = function(code, path) {\n      // TODO(sdh): figure out some way to get this error to show up\n      // in test results, noting that the failure may occur in many\n      // different ways, including in loadModule() before the test\n      // runner even comes up.\n      goog.logToConsole_(path + suffix);\n      return code;\n    };\n  }\n  // Note: any transpilation errors/warnings will be logged to the console.\n  return transpile(code, path, target);\n};\n\n//==============================================================================\n// Language Enhancements\n//==============================================================================\n\n\n/**\n * This is a \"fixed\" version of the typeof operator.  It differs from the typeof\n * operator in such a way that null returns 'null' and arrays return 'array'.\n * @param {?} value The value to get the type of.\n * @return {string} The name of the type.\n */\ngoog.typeOf = function(value) {\n  var s = typeof value;\n  if (s == 'object') {\n    if (value) {\n      // Check these first, so we can avoid calling Object.prototype.toString if\n      // possible.\n      //\n      // IE improperly marshals typeof across execution contexts, but a\n      // cross-context object will still return false for \"instanceof Object\".\n      if (value instanceof Array) {\n        return 'array';\n      } else if (value instanceof Object) {\n        return s;\n      }\n\n      // HACK: In order to use an Object prototype method on the arbitrary\n      //   value, the compiler requires the value be cast to type Object,\n      //   even though the ECMA spec explicitly allows it.\n      var className = Object.prototype.toString.call(\n          /** @type {!Object} */ (value));\n      // In Firefox 3.6, attempting to access iframe window objects' length\n      // property throws an NS_ERROR_FAILURE, so we need to special-case it\n      // here.\n      if (className == '[object Window]') {\n        return 'object';\n      }\n\n      // We cannot always use constructor == Array or instanceof Array because\n      // different frames have different Array objects. In IE6, if the iframe\n      // where the array was created is destroyed, the array loses its\n      // prototype. Then dereferencing val.splice here throws an exception, so\n      // we can't use goog.isFunction. Calling typeof directly returns 'unknown'\n      // so that will work. In this case, this function will return false and\n      // most array functions will still work because the array is still\n      // array-like (supports length and []) even though it has lost its\n      // prototype.\n      // Mark Miller noticed that Object.prototype.toString\n      // allows access to the unforgeable [[Class]] property.\n      //  15.2.4.2 Object.prototype.toString ( )\n      //  When the toString method is called, the following steps are taken:\n      //      1. Get the [[Class]] property of this object.\n      //      2. Compute a string value by concatenating the three strings\n      //         \"[object \", Result(1), and \"]\".\n      //      3. Return Result(2).\n      // and this behavior survives the destruction of the execution context.\n      if ((className == '[object Array]' ||\n           // In IE all non value types are wrapped as objects across window\n           // boundaries (not iframe though) so we have to do object detection\n           // for this edge case.\n           typeof value.length == 'number' &&\n               typeof value.splice != 'undefined' &&\n               typeof value.propertyIsEnumerable != 'undefined' &&\n               !value.propertyIsEnumerable('splice')\n\n               )) {\n        return 'array';\n      }\n      // HACK: There is still an array case that fails.\n      //     function ArrayImpostor() {}\n      //     ArrayImpostor.prototype = [];\n      //     var impostor = new ArrayImpostor;\n      // this can be fixed by getting rid of the fast path\n      // (value instanceof Array) and solely relying on\n      // (value && Object.prototype.toString.vall(value) === '[object Array]')\n      // but that would require many more function calls and is not warranted\n      // unless closure code is receiving objects from untrusted sources.\n\n      // IE in cross-window calls does not correctly marshal the function type\n      // (it appears just as an object) so we cannot use just typeof val ==\n      // 'function'. However, if the object has a call property, it is a\n      // function.\n      if ((className == '[object Function]' ||\n           typeof value.call != 'undefined' &&\n               typeof value.propertyIsEnumerable != 'undefined' &&\n               !value.propertyIsEnumerable('call'))) {\n        return 'function';\n      }\n\n    } else {\n      return 'null';\n    }\n\n  } else if (s == 'function' && typeof value.call == 'undefined') {\n    // In Safari typeof nodeList returns 'function', and on Firefox typeof\n    // behaves similarly for HTML{Applet,Embed,Object}, Elements and RegExps. We\n    // would like to return object for those and we can detect an invalid\n    // function by making sure that the function object has a call method.\n    return 'object';\n  }\n  return s;\n};\n\n\n/**\n * Returns true if the specified value is null.\n * @param {?} val Variable to test.\n * @return {boolean} Whether variable is null.\n * @deprecated Use `val === null` instead.\n */\ngoog.isNull = function(val) {\n  return val === null;\n};\n\n\n/**\n * Returns true if the specified value is defined and not null.\n * @param {?} val Variable to test.\n * @return {boolean} Whether variable is defined and not null.\n * @deprecated Use `val != null` instead.\n */\ngoog.isDefAndNotNull = function(val) {\n  // Note that undefined == null.\n  return val != null;\n};\n\n\n/**\n * Returns true if the specified value is an array.\n * @param {?} val Variable to test.\n * @return {boolean} Whether variable is an array.\n */\ngoog.isArray = function(val) {\n  return goog.typeOf(val) == 'array';\n};\n\n\n/**\n * Returns true if the object looks like an array. To qualify as array like\n * the value needs to be either a NodeList or an object with a Number length\n * property. Note that for this function neither strings nor functions are\n * considered \"array-like\".\n *\n * @param {?} val Variable to test.\n * @return {boolean} Whether variable is an array.\n */\ngoog.isArrayLike = function(val) {\n  var type = goog.typeOf(val);\n  // We do not use goog.isObject here in order to exclude function values.\n  return type == 'array' || type == 'object' && typeof val.length == 'number';\n};\n\n\n/**\n * Returns true if the object looks like a Date. To qualify as Date-like the\n * value needs to be an object and have a getFullYear() function.\n * @param {?} val Variable to test.\n * @return {boolean} Whether variable is a like a Date.\n */\ngoog.isDateLike = function(val) {\n  return goog.isObject(val) && typeof val.getFullYear == 'function';\n};\n\n\n/**\n * Returns true if the specified value is a function.\n * @param {?} val Variable to test.\n * @return {boolean} Whether variable is a function.\n */\ngoog.isFunction = function(val) {\n  return goog.typeOf(val) == 'function';\n};\n\n\n/**\n * Returns true if the specified value is an object.  This includes arrays and\n * functions.\n * @param {?} val Variable to test.\n * @return {boolean} Whether variable is an object.\n */\ngoog.isObject = function(val) {\n  var type = typeof val;\n  return type == 'object' && val != null || type == 'function';\n  // return Object(val) === val also works, but is slower, especially if val is\n  // not an object.\n};\n\n\n/**\n * Gets a unique ID for an object. This mutates the object so that further calls\n * with the same object as a parameter returns the same value. The unique ID is\n * guaranteed to be unique across the current session amongst objects that are\n * passed into `getUid`. There is no guarantee that the ID is unique or\n * consistent across sessions. It is unsafe to generate unique ID for function\n * prototypes.\n *\n * @param {Object} obj The object to get the unique ID for.\n * @return {number} The unique ID for the object.\n */\ngoog.getUid = function(obj) {\n  // TODO(arv): Make the type stricter, do not accept null.\n\n  // In Opera window.hasOwnProperty exists but always returns false so we avoid\n  // using it. As a consequence the unique ID generated for BaseClass.prototype\n  // and SubClass.prototype will be the same.\n  // TODO(b/141512323): UUIDs are broken for ctors with class-side inheritance.\n  return obj[goog.UID_PROPERTY_] ||\n      (obj[goog.UID_PROPERTY_] = ++goog.uidCounter_);\n};\n\n\n/**\n * Whether the given object is already assigned a unique ID.\n *\n * This does not modify the object.\n *\n * @param {!Object} obj The object to check.\n * @return {boolean} Whether there is an assigned unique id for the object.\n */\ngoog.hasUid = function(obj) {\n  return !!obj[goog.UID_PROPERTY_];\n};\n\n\n/**\n * Removes the unique ID from an object. This is useful if the object was\n * previously mutated using `goog.getUid` in which case the mutation is\n * undone.\n * @param {Object} obj The object to remove the unique ID field from.\n */\ngoog.removeUid = function(obj) {\n  // TODO(arv): Make the type stricter, do not accept null.\n\n  // In IE, DOM nodes are not instances of Object and throw an exception if we\n  // try to delete.  Instead we try to use removeAttribute.\n  if (obj !== null && 'removeAttribute' in obj) {\n    obj.removeAttribute(goog.UID_PROPERTY_);\n  }\n\n  try {\n    delete obj[goog.UID_PROPERTY_];\n  } catch (ex) {\n  }\n};\n\n\n/**\n * Name for unique ID property. Initialized in a way to help avoid collisions\n * with other closure JavaScript on the same page.\n * @type {string}\n * @private\n */\ngoog.UID_PROPERTY_ = 'closure_uid_' + ((Math.random() * 1e9) >>> 0);\n\n\n/**\n * Counter for UID.\n * @type {number}\n * @private\n */\ngoog.uidCounter_ = 0;\n\n\n/**\n * Adds a hash code field to an object. The hash code is unique for the\n * given object.\n * @param {Object} obj The object to get the hash code for.\n * @return {number} The hash code for the object.\n * @deprecated Use goog.getUid instead.\n */\ngoog.getHashCode = goog.getUid;\n\n\n/**\n * Removes the hash code field from an object.\n * @param {Object} obj The object to remove the field from.\n * @deprecated Use goog.removeUid instead.\n */\ngoog.removeHashCode = goog.removeUid;\n\n\n/**\n * Clones a value. The input may be an Object, Array, or basic type. Objects and\n * arrays will be cloned recursively.\n *\n * WARNINGS:\n * <code>goog.cloneObject</code> does not detect reference loops. Objects that\n * refer to themselves will cause infinite recursion.\n *\n * <code>goog.cloneObject</code> is unaware of unique identifiers, and copies\n * UIDs created by <code>getUid</code> into cloned results.\n *\n * @param {*} obj The value to clone.\n * @return {*} A clone of the input value.\n * @deprecated goog.cloneObject is unsafe. Prefer the goog.object methods.\n */\ngoog.cloneObject = function(obj) {\n  var type = goog.typeOf(obj);\n  if (type == 'object' || type == 'array') {\n    if (typeof obj.clone === 'function') {\n      return obj.clone();\n    }\n    var clone = type == 'array' ? [] : {};\n    for (var key in obj) {\n      clone[key] = goog.cloneObject(obj[key]);\n    }\n    return clone;\n  }\n\n  return obj;\n};\n\n\n/**\n * A native implementation of goog.bind.\n * @param {?function(this:T, ...)} fn A function to partially apply.\n * @param {T} selfObj Specifies the object which this should point to when the\n *     function is run.\n * @param {...*} var_args Additional arguments that are partially applied to the\n *     function.\n * @return {!Function} A partially-applied form of the function goog.bind() was\n *     invoked as a method of.\n * @template T\n * @private\n */\ngoog.bindNative_ = function(fn, selfObj, var_args) {\n  return /** @type {!Function} */ (fn.call.apply(fn.bind, arguments));\n};\n\n\n/**\n * A pure-JS implementation of goog.bind.\n * @param {?function(this:T, ...)} fn A function to partially apply.\n * @param {T} selfObj Specifies the object which this should point to when the\n *     function is run.\n * @param {...*} var_args Additional arguments that are partially applied to the\n *     function.\n * @return {!Function} A partially-applied form of the function goog.bind() was\n *     invoked as a method of.\n * @template T\n * @private\n */\ngoog.bindJs_ = function(fn, selfObj, var_args) {\n  if (!fn) {\n    throw new Error();\n  }\n\n  if (arguments.length > 2) {\n    var boundArgs = Array.prototype.slice.call(arguments, 2);\n    return function() {\n      // Prepend the bound arguments to the current arguments.\n      var newArgs = Array.prototype.slice.call(arguments);\n      Array.prototype.unshift.apply(newArgs, boundArgs);\n      return fn.apply(selfObj, newArgs);\n    };\n\n  } else {\n    return function() {\n      return fn.apply(selfObj, arguments);\n    };\n  }\n};\n\n\n/**\n * Partially applies this function to a particular 'this object' and zero or\n * more arguments. The result is a new function with some arguments of the first\n * function pre-filled and the value of this 'pre-specified'.\n *\n * Remaining arguments specified at call-time are appended to the pre-specified\n * ones.\n *\n * Also see: {@link #partial}.\n *\n * Usage:\n * <pre>var barMethBound = goog.bind(myFunction, myObj, 'arg1', 'arg2');\n * barMethBound('arg3', 'arg4');</pre>\n *\n * @param {?function(this:T, ...)} fn A function to partially apply.\n * @param {T} selfObj Specifies the object which this should point to when the\n *     function is run.\n * @param {...*} var_args Additional arguments that are partially applied to the\n *     function.\n * @return {!Function} A partially-applied form of the function goog.bind() was\n *     invoked as a method of.\n * @template T\n * @suppress {deprecated} See above.\n */\ngoog.bind = function(fn, selfObj, var_args) {\n  // TODO(nicksantos): narrow the type signature.\n  if (Function.prototype.bind &&\n      // NOTE(nicksantos): Somebody pulled base.js into the default Chrome\n      // extension environment. This means that for Chrome extensions, they get\n      // the implementation of Function.prototype.bind that calls goog.bind\n      // instead of the native one. Even worse, we don't want to introduce a\n      // circular dependency between goog.bind and Function.prototype.bind, so\n      // we have to hack this to make sure it works correctly.\n      Function.prototype.bind.toString().indexOf('native code') != -1) {\n    goog.bind = goog.bindNative_;\n  } else {\n    goog.bind = goog.bindJs_;\n  }\n  return goog.bind.apply(null, arguments);\n};\n\n\n/**\n * Like goog.bind(), except that a 'this object' is not required. Useful when\n * the target function is already bound.\n *\n * Usage:\n * var g = goog.partial(f, arg1, arg2);\n * g(arg3, arg4);\n *\n * @param {Function} fn A function to partially apply.\n * @param {...*} var_args Additional arguments that are partially applied to fn.\n * @return {!Function} A partially-applied form of the function goog.partial()\n *     was invoked as a method of.\n */\ngoog.partial = function(fn, var_args) {\n  var args = Array.prototype.slice.call(arguments, 1);\n  return function() {\n    // Clone the array (with slice()) and append additional arguments\n    // to the existing arguments.\n    var newArgs = args.slice();\n    newArgs.push.apply(newArgs, arguments);\n    return fn.apply(/** @type {?} */ (this), newArgs);\n  };\n};\n\n\n/**\n * Copies all the members of a source object to a target object. This method\n * does not work on all browsers for all objects that contain keys such as\n * toString or hasOwnProperty. Use goog.object.extend for this purpose.\n *\n * NOTE: Some have advocated for the use of goog.mixin to setup classes\n * with multiple inheritence (traits, mixins, etc).  However, as it simply\n * uses \"for in\", this is not compatible with ES6 classes whose methods are\n * non-enumerable.  Changing this, would break cases where non-enumerable\n * properties are not expected.\n *\n * @param {Object} target Target.\n * @param {Object} source Source.\n * @deprecated Prefer Object.assign\n */\ngoog.mixin = function(target, source) {\n  for (var x in source) {\n    target[x] = source[x];\n  }\n\n  // For IE7 or lower, the for-in-loop does not contain any properties that are\n  // not enumerable on the prototype object (for example, isPrototypeOf from\n  // Object.prototype) but also it will not include 'replace' on objects that\n  // extend String and change 'replace' (not that it is common for anyone to\n  // extend anything except Object).\n};\n\n\n/**\n * @return {number} An integer value representing the number of milliseconds\n *     between midnight, January 1, 1970 and the current time.\n * @deprecated Use Date.now\n */\ngoog.now = (goog.TRUSTED_SITE && Date.now) || (function() {\n             // Unary plus operator converts its operand to a number which in\n             // the case of\n             // a date is done by calling getTime().\n             return +new Date();\n           });\n\n\n/**\n * Evals JavaScript in the global scope.  In IE this uses execScript, other\n * browsers use goog.global.eval. If goog.global.eval does not evaluate in the\n * global scope (for example, in Safari), appends a script tag instead.\n * Throws an exception if neither execScript or eval is defined.\n * @param {string} script JavaScript string.\n */\ngoog.globalEval = function(script) {\n  if (goog.global.execScript) {\n    goog.global.execScript(script, 'JavaScript');\n  } else if (goog.global.eval) {\n    // Test to see if eval works\n    if (goog.evalWorksForGlobals_ == null) {\n      try {\n        goog.global.eval('var _evalTest_ = 1;');\n      } catch (ignore) {\n      }\n      if (typeof goog.global['_evalTest_'] != 'undefined') {\n        try {\n          delete goog.global['_evalTest_'];\n        } catch (ignore) {\n          // Microsoft edge fails the deletion above in strict mode.\n        }\n        goog.evalWorksForGlobals_ = true;\n      } else {\n        goog.evalWorksForGlobals_ = false;\n      }\n    }\n\n    if (goog.evalWorksForGlobals_) {\n      goog.global.eval(script);\n    } else {\n      /** @type {!Document} */\n      var doc = goog.global.document;\n      var scriptElt =\n          /** @type {!HTMLScriptElement} */ (doc.createElement('script'));\n      scriptElt.type = 'text/javascript';\n      scriptElt.defer = false;\n      // Note(user): can't use .innerHTML since \"t('<test>')\" will fail and\n      // .text doesn't work in Safari 2.  Therefore we append a text node.\n      scriptElt.appendChild(doc.createTextNode(script));\n      doc.head.appendChild(scriptElt);\n      doc.head.removeChild(scriptElt);\n    }\n  } else {\n    throw new Error('goog.globalEval not available');\n  }\n};\n\n\n/**\n * Indicates whether or not we can call 'eval' directly to eval code in the\n * global scope. Set to a Boolean by the first call to goog.globalEval (which\n * empirically tests whether eval works for globals). @see goog.globalEval\n * @type {?boolean}\n * @private\n */\ngoog.evalWorksForGlobals_ = null;\n\n\n/**\n * Optional map of CSS class names to obfuscated names used with\n * goog.getCssName().\n * @private {!Object<string, string>|undefined}\n * @see goog.setCssNameMapping\n */\ngoog.cssNameMapping_;\n\n\n/**\n * Optional obfuscation style for CSS class names. Should be set to either\n * 'BY_WHOLE' or 'BY_PART' if defined.\n * @type {string|undefined}\n * @private\n * @see goog.setCssNameMapping\n */\ngoog.cssNameMappingStyle_;\n\n\n\n/**\n * A hook for modifying the default behavior goog.getCssName. The function\n * if present, will receive the standard output of the goog.getCssName as\n * its input.\n *\n * @type {(function(string):string)|undefined}\n */\ngoog.global.CLOSURE_CSS_NAME_MAP_FN;\n\n\n/**\n * Handles strings that are intended to be used as CSS class names.\n *\n * This function works in tandem with @see goog.setCssNameMapping.\n *\n * Without any mapping set, the arguments are simple joined with a hyphen and\n * passed through unaltered.\n *\n * When there is a mapping, there are two possible styles in which these\n * mappings are used. In the BY_PART style, each part (i.e. in between hyphens)\n * of the passed in css name is rewritten according to the map. In the BY_WHOLE\n * style, the full css name is looked up in the map directly. If a rewrite is\n * not specified by the map, the compiler will output a warning.\n *\n * When the mapping is passed to the compiler, it will replace calls to\n * goog.getCssName with the strings from the mapping, e.g.\n *     var x = goog.getCssName('foo');\n *     var y = goog.getCssName(this.baseClass, 'active');\n *  becomes:\n *     var x = 'foo';\n *     var y = this.baseClass + '-active';\n *\n * If one argument is passed it will be processed, if two are passed only the\n * modifier will be processed, as it is assumed the first argument was generated\n * as a result of calling goog.getCssName.\n *\n * @param {string} className The class name.\n * @param {string=} opt_modifier A modifier to be appended to the class name.\n * @return {string} The class name or the concatenation of the class name and\n *     the modifier.\n */\ngoog.getCssName = function(className, opt_modifier) {\n  // String() is used for compatibility with compiled soy where the passed\n  // className can be non-string objects.\n  if (String(className).charAt(0) == '.') {\n    throw new Error(\n        'className passed in goog.getCssName must not start with \".\".' +\n        ' You passed: ' + className);\n  }\n\n  var getMapping = function(cssName) {\n    return goog.cssNameMapping_[cssName] || cssName;\n  };\n\n  var renameByParts = function(cssName) {\n    // Remap all the parts individually.\n    var parts = cssName.split('-');\n    var mapped = [];\n    for (var i = 0; i < parts.length; i++) {\n      mapped.push(getMapping(parts[i]));\n    }\n    return mapped.join('-');\n  };\n\n  var rename;\n  if (goog.cssNameMapping_) {\n    rename =\n        goog.cssNameMappingStyle_ == 'BY_WHOLE' ? getMapping : renameByParts;\n  } else {\n    rename = function(a) {\n      return a;\n    };\n  }\n\n  var result =\n      opt_modifier ? className + '-' + rename(opt_modifier) : rename(className);\n\n  // The special CLOSURE_CSS_NAME_MAP_FN allows users to specify further\n  // processing of the class name.\n  if (goog.global.CLOSURE_CSS_NAME_MAP_FN) {\n    return goog.global.CLOSURE_CSS_NAME_MAP_FN(result);\n  }\n\n  return result;\n};\n\n\n/**\n * Sets the map to check when returning a value from goog.getCssName(). Example:\n * <pre>\n * goog.setCssNameMapping({\n *   \"goog\": \"a\",\n *   \"disabled\": \"b\",\n * });\n *\n * var x = goog.getCssName('goog');\n * // The following evaluates to: \"a a-b\".\n * goog.getCssName('goog') + ' ' + goog.getCssName(x, 'disabled')\n * </pre>\n * When declared as a map of string literals to string literals, the JSCompiler\n * will replace all calls to goog.getCssName() using the supplied map if the\n * --process_closure_primitives flag is set.\n *\n * @param {!Object} mapping A map of strings to strings where keys are possible\n *     arguments to goog.getCssName() and values are the corresponding values\n *     that should be returned.\n * @param {string=} opt_style The style of css name mapping. There are two valid\n *     options: 'BY_PART', and 'BY_WHOLE'.\n * @see goog.getCssName for a description.\n */\ngoog.setCssNameMapping = function(mapping, opt_style) {\n  goog.cssNameMapping_ = mapping;\n  goog.cssNameMappingStyle_ = opt_style;\n};\n\n\n/**\n * To use CSS renaming in compiled mode, one of the input files should have a\n * call to goog.setCssNameMapping() with an object literal that the JSCompiler\n * can extract and use to replace all calls to goog.getCssName(). In uncompiled\n * mode, JavaScript code should be loaded before this base.js file that declares\n * a global variable, CLOSURE_CSS_NAME_MAPPING, which is used below. This is\n * to ensure that the mapping is loaded before any calls to goog.getCssName()\n * are made in uncompiled mode.\n *\n * A hook for overriding the CSS name mapping.\n * @type {!Object<string, string>|undefined}\n */\ngoog.global.CLOSURE_CSS_NAME_MAPPING;\n\n\nif (!COMPILED && goog.global.CLOSURE_CSS_NAME_MAPPING) {\n  // This does not call goog.setCssNameMapping() because the JSCompiler\n  // requires that goog.setCssNameMapping() be called with an object literal.\n  goog.cssNameMapping_ = goog.global.CLOSURE_CSS_NAME_MAPPING;\n}\n\n\n/**\n * Gets a localized message.\n *\n * This function is a compiler primitive. If you give the compiler a localized\n * message bundle, it will replace the string at compile-time with a localized\n * version, and expand goog.getMsg call to a concatenated string.\n *\n * Messages must be initialized in the form:\n * <code>\n * var MSG_NAME = goog.getMsg('Hello {$placeholder}', {'placeholder': 'world'});\n * </code>\n *\n * This function produces a string which should be treated as plain text. Use\n * {@link goog.html.SafeHtmlFormatter} in conjunction with goog.getMsg to\n * produce SafeHtml.\n *\n * @param {string} str Translatable string, places holders in the form {$foo}.\n * @param {Object<string, string>=} opt_values Maps place holder name to value.\n * @param {{html: boolean}=} opt_options Options:\n *     html: Escape '<' in str to '&lt;'. Used by Closure Templates where the\n *     generated code size and performance is critical which is why {@link\n *     goog.html.SafeHtmlFormatter} is not used. The value must be literal true\n *     or false.\n * @return {string} message with placeholders filled.\n */\ngoog.getMsg = function(str, opt_values, opt_options) {\n  if (opt_options && opt_options.html) {\n    // Note that '&' is not replaced because the translation can contain HTML\n    // entities.\n    str = str.replace(/</g, '&lt;');\n  }\n  if (opt_values) {\n    str = str.replace(/\\{\\$([^}]+)}/g, function(match, key) {\n      return (opt_values != null && key in opt_values) ? opt_values[key] :\n                                                         match;\n    });\n  }\n  return str;\n};\n\n\n/**\n * Gets a localized message. If the message does not have a translation, gives a\n * fallback message.\n *\n * This is useful when introducing a new message that has not yet been\n * translated into all languages.\n *\n * This function is a compiler primitive. Must be used in the form:\n * <code>var x = goog.getMsgWithFallback(MSG_A, MSG_B);</code>\n * where MSG_A and MSG_B were initialized with goog.getMsg.\n *\n * @param {string} a The preferred message.\n * @param {string} b The fallback message.\n * @return {string} The best translated message.\n */\ngoog.getMsgWithFallback = function(a, b) {\n  return a;\n};\n\n\n/**\n * Exposes an unobfuscated global namespace path for the given object.\n * Note that fields of the exported object *will* be obfuscated, unless they are\n * exported in turn via this function or goog.exportProperty.\n *\n * Also handy for making public items that are defined in anonymous closures.\n *\n * ex. goog.exportSymbol('public.path.Foo', Foo);\n *\n * ex. goog.exportSymbol('public.path.Foo.staticFunction', Foo.staticFunction);\n *     public.path.Foo.staticFunction();\n *\n * ex. goog.exportSymbol('public.path.Foo.prototype.myMethod',\n *                       Foo.prototype.myMethod);\n *     new public.path.Foo().myMethod();\n *\n * @param {string} publicPath Unobfuscated name to export.\n * @param {*} object Object the name should point to.\n * @param {Object=} opt_objectToExportTo The object to add the path to; default\n *     is goog.global.\n */\ngoog.exportSymbol = function(publicPath, object, opt_objectToExportTo) {\n  goog.exportPath_(publicPath, object, opt_objectToExportTo);\n};\n\n\n/**\n * Exports a property unobfuscated into the object's namespace.\n * ex. goog.exportProperty(Foo, 'staticFunction', Foo.staticFunction);\n * ex. goog.exportProperty(Foo.prototype, 'myMethod', Foo.prototype.myMethod);\n * @param {Object} object Object whose static property is being exported.\n * @param {string} publicName Unobfuscated name to export.\n * @param {*} symbol Object the name should point to.\n */\ngoog.exportProperty = function(object, publicName, symbol) {\n  object[publicName] = symbol;\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * Usage:\n * <pre>\n * function ParentClass(a, b) { }\n * ParentClass.prototype.foo = function(a) { };\n *\n * function ChildClass(a, b, c) {\n *   ChildClass.base(this, 'constructor', a, b);\n * }\n * goog.inherits(ChildClass, ParentClass);\n *\n * var child = new ChildClass('a', 'b', 'see');\n * child.foo(); // This works.\n * </pre>\n *\n * @param {!Function} childCtor Child class.\n * @param {!Function} parentCtor Parent class.\n * @suppress {strictMissingProperties} superClass_ and base is not defined on\n *    Function.\n */\ngoog.inherits = function(childCtor, parentCtor) {\n  /** @constructor */\n  function tempCtor() {}\n  tempCtor.prototype = parentCtor.prototype;\n  childCtor.superClass_ = parentCtor.prototype;\n  childCtor.prototype = new tempCtor();\n  /** @override */\n  childCtor.prototype.constructor = childCtor;\n\n  /**\n   * Calls superclass constructor/method.\n   *\n   * This function is only available if you use goog.inherits to\n   * express inheritance relationships between classes.\n   *\n   * NOTE: This is a replacement for goog.base and for superClass_\n   * property defined in childCtor.\n   *\n   * @param {!Object} me Should always be \"this\".\n   * @param {string} methodName The method name to call. Calling\n   *     superclass constructor can be done with the special string\n   *     'constructor'.\n   * @param {...*} var_args The arguments to pass to superclass\n   *     method/constructor.\n   * @return {*} The return value of the superclass method/constructor.\n   */\n  childCtor.base = function(me, methodName, var_args) {\n    // Copying using loop to avoid deop due to passing arguments object to\n    // function. This is faster in many JS engines as of late 2014.\n    var args = new Array(arguments.length - 2);\n    for (var i = 2; i < arguments.length; i++) {\n      args[i - 2] = arguments[i];\n    }\n    return parentCtor.prototype[methodName].apply(me, args);\n  };\n};\n\n\n/**\n * Call up to the superclass.\n *\n * If this is called from a constructor, then this calls the superclass\n * constructor with arguments 1-N.\n *\n * If this is called from a prototype method, then you must pass the name of the\n * method as the second argument to this function. If you do not, you will get a\n * runtime error. This calls the superclass' method with arguments 2-N.\n *\n * This function only works if you use goog.inherits to express inheritance\n * relationships between your classes.\n *\n * This function is a compiler primitive. At compile-time, the compiler will do\n * macro expansion to remove a lot of the extra overhead that this function\n * introduces. The compiler will also enforce a lot of the assumptions that this\n * function makes, and treat it as a compiler error if you break them.\n *\n * @param {!Object} me Should always be \"this\".\n * @param {*=} opt_methodName The method name if calling a super method.\n * @param {...*} var_args The rest of the arguments.\n * @return {*} The return value of the superclass method.\n * @suppress {es5Strict} This method can not be used in strict mode, but\n *     all Closure Library consumers must depend on this file.\n * @deprecated goog.base is not strict mode compatible.  Prefer the static\n *     \"base\" method added to the constructor by goog.inherits\n *     or ES6 classes and the \"super\" keyword.\n */\ngoog.base = function(me, opt_methodName, var_args) {\n  var caller = arguments.callee.caller;\n\n  if (goog.STRICT_MODE_COMPATIBLE || (goog.DEBUG && !caller)) {\n    throw new Error(\n        'arguments.caller not defined.  goog.base() cannot be used ' +\n        'with strict mode code. See ' +\n        'http://www.ecma-international.org/ecma-262/5.1/#sec-C');\n  }\n\n  if (typeof caller.superClass_ !== 'undefined') {\n    // Copying using loop to avoid deop due to passing arguments object to\n    // function. This is faster in many JS engines as of late 2014.\n    var ctorArgs = new Array(arguments.length - 1);\n    for (var i = 1; i < arguments.length; i++) {\n      ctorArgs[i - 1] = arguments[i];\n    }\n    // This is a constructor. Call the superclass constructor.\n    return /** @type {!Function} */ (caller.superClass_)\n        .constructor.apply(me, ctorArgs);\n  }\n\n  if (typeof opt_methodName != 'string' && typeof opt_methodName != 'symbol') {\n    throw new Error(\n        'method names provided to goog.base must be a string or a symbol');\n  }\n\n  // Copying using loop to avoid deop due to passing arguments object to\n  // function. This is faster in many JS engines as of late 2014.\n  var args = new Array(arguments.length - 2);\n  for (var i = 2; i < arguments.length; i++) {\n    args[i - 2] = arguments[i];\n  }\n  var foundCaller = false;\n  for (var proto = me.constructor.prototype; proto;\n       proto = Object.getPrototypeOf(proto)) {\n    if (proto[opt_methodName] === caller) {\n      foundCaller = true;\n    } else if (foundCaller) {\n      return proto[opt_methodName].apply(me, args);\n    }\n  }\n\n  // If we did not find the caller in the prototype chain, then one of two\n  // things happened:\n  // 1) The caller is an instance method.\n  // 2) This method was not called by the right caller.\n  if (me[opt_methodName] === caller) {\n    return me.constructor.prototype[opt_methodName].apply(me, args);\n  } else {\n    throw new Error(\n        'goog.base called from a method of one name ' +\n        'to a method of a different name');\n  }\n};\n\n\n/**\n * Allow for aliasing within scope functions.  This function exists for\n * uncompiled code - in compiled code the calls will be inlined and the aliases\n * applied.  In uncompiled code the function is simply run since the aliases as\n * written are valid JavaScript.\n *\n *\n * @param {function()} fn Function to call.  This function can contain aliases\n *     to namespaces (e.g. \"var dom = goog.dom\") or classes\n *     (e.g. \"var Timer = goog.Timer\").\n */\ngoog.scope = function(fn) {\n  if (goog.isInModuleLoader_()) {\n    throw new Error('goog.scope is not supported within a module.');\n  }\n  fn.call(goog.global);\n};\n\n\n/*\n * To support uncompiled, strict mode bundles that use eval to divide source\n * like so:\n *    eval('someSource;//# sourceUrl sourcefile.js');\n * We need to export the globally defined symbols \"goog\" and \"COMPILED\".\n * Exporting \"goog\" breaks the compiler optimizations, so we required that\n * be defined externally.\n * NOTE: We don't use goog.exportSymbol here because we don't want to trigger\n * extern generation when that compiler option is enabled.\n */\nif (!COMPILED) {\n  goog.global['COMPILED'] = COMPILED;\n}\n\n\n//==============================================================================\n// goog.defineClass implementation\n//==============================================================================\n\n\n/**\n * Creates a restricted form of a Closure \"class\":\n *   - from the compiler's perspective, the instance returned from the\n *     constructor is sealed (no new properties may be added).  This enables\n *     better checks.\n *   - the compiler will rewrite this definition to a form that is optimal\n *     for type checking and optimization (initially this will be a more\n *     traditional form).\n *\n * @param {Function} superClass The superclass, Object or null.\n * @param {goog.defineClass.ClassDescriptor} def\n *     An object literal describing\n *     the class.  It may have the following properties:\n *     \"constructor\": the constructor function\n *     \"statics\": an object literal containing methods to add to the constructor\n *        as \"static\" methods or a function that will receive the constructor\n *        function as its only parameter to which static properties can\n *        be added.\n *     all other properties are added to the prototype.\n * @return {!Function} The class constructor.\n * @deprecated Use ES6 class syntax instead.\n */\ngoog.defineClass = function(superClass, def) {\n  // TODO(johnlenz): consider making the superClass an optional parameter.\n  var constructor = def.constructor;\n  var statics = def.statics;\n  // Wrap the constructor prior to setting up the prototype and static methods.\n  if (!constructor || constructor == Object.prototype.constructor) {\n    constructor = function() {\n      throw new Error(\n          'cannot instantiate an interface (no constructor defined).');\n    };\n  }\n\n  var cls = goog.defineClass.createSealingConstructor_(constructor, superClass);\n  if (superClass) {\n    goog.inherits(cls, superClass);\n  }\n\n  // Remove all the properties that should not be copied to the prototype.\n  delete def.constructor;\n  delete def.statics;\n\n  goog.defineClass.applyProperties_(cls.prototype, def);\n  if (statics != null) {\n    if (statics instanceof Function) {\n      statics(cls);\n    } else {\n      goog.defineClass.applyProperties_(cls, statics);\n    }\n  }\n\n  return cls;\n};\n\n\n/**\n * @typedef {{\n *   constructor: (!Function|undefined),\n *   statics: (Object|undefined|function(Function):void)\n * }}\n */\ngoog.defineClass.ClassDescriptor;\n\n\n/**\n * @define {boolean} Whether the instances returned by goog.defineClass should\n *     be sealed when possible.\n *\n * When sealing is disabled the constructor function will not be wrapped by\n * goog.defineClass, making it incompatible with ES6 class methods.\n */\ngoog.defineClass.SEAL_CLASS_INSTANCES =\n    goog.define('goog.defineClass.SEAL_CLASS_INSTANCES', goog.DEBUG);\n\n\n/**\n * If goog.defineClass.SEAL_CLASS_INSTANCES is enabled and Object.seal is\n * defined, this function will wrap the constructor in a function that seals the\n * results of the provided constructor function.\n *\n * @param {!Function} ctr The constructor whose results maybe be sealed.\n * @param {Function} superClass The superclass constructor.\n * @return {!Function} The replacement constructor.\n * @private\n */\ngoog.defineClass.createSealingConstructor_ = function(ctr, superClass) {\n  if (!goog.defineClass.SEAL_CLASS_INSTANCES) {\n    // Do now wrap the constructor when sealing is disabled. Angular code\n    // depends on this for injection to work properly.\n    return ctr;\n  }\n\n  // Compute whether the constructor is sealable at definition time, rather\n  // than when the instance is being constructed.\n  var superclassSealable = !goog.defineClass.isUnsealable_(superClass);\n\n  /**\n   * @this {Object}\n   * @return {?}\n   */\n  var wrappedCtr = function() {\n    // Don't seal an instance of a subclass when it calls the constructor of\n    // its super class as there is most likely still setup to do.\n    var instance = ctr.apply(this, arguments) || this;\n    instance[goog.UID_PROPERTY_] = instance[goog.UID_PROPERTY_];\n\n    if (this.constructor === wrappedCtr && superclassSealable &&\n        Object.seal instanceof Function) {\n      Object.seal(instance);\n    }\n    return instance;\n  };\n\n  return wrappedCtr;\n};\n\n\n/**\n * @param {Function} ctr The constructor to test.\n * @return {boolean} Whether the constructor has been tagged as unsealable\n *     using goog.tagUnsealableClass.\n * @private\n */\ngoog.defineClass.isUnsealable_ = function(ctr) {\n  return ctr && ctr.prototype &&\n      ctr.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_];\n};\n\n\n// TODO(johnlenz): share these values with the goog.object\n/**\n * The names of the fields that are defined on Object.prototype.\n * @type {!Array<string>}\n * @private\n * @const\n */\ngoog.defineClass.OBJECT_PROTOTYPE_FIELDS_ = [\n  'constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable',\n  'toLocaleString', 'toString', 'valueOf'\n];\n\n\n// TODO(johnlenz): share this function with the goog.object\n/**\n * @param {!Object} target The object to add properties to.\n * @param {!Object} source The object to copy properties from.\n * @private\n */\ngoog.defineClass.applyProperties_ = function(target, source) {\n  // TODO(johnlenz): update this to support ES5 getters/setters\n\n  var key;\n  for (key in source) {\n    if (Object.prototype.hasOwnProperty.call(source, key)) {\n      target[key] = source[key];\n    }\n  }\n\n  // For IE the for-in-loop does not contain any properties that are not\n  // enumerable on the prototype object (for example isPrototypeOf from\n  // Object.prototype) and it will also not include 'replace' on objects that\n  // extend String and change 'replace' (not that it is common for anyone to\n  // extend anything except Object).\n  for (var i = 0; i < goog.defineClass.OBJECT_PROTOTYPE_FIELDS_.length; i++) {\n    key = goog.defineClass.OBJECT_PROTOTYPE_FIELDS_[i];\n    if (Object.prototype.hasOwnProperty.call(source, key)) {\n      target[key] = source[key];\n    }\n  }\n};\n\n\n/**\n * Sealing classes breaks the older idiom of assigning properties on the\n * prototype rather than in the constructor. As such, goog.defineClass\n * must not seal subclasses of these old-style classes until they are fixed.\n * Until then, this marks a class as \"broken\", instructing defineClass\n * not to seal subclasses.\n * @param {!Function} ctr The legacy constructor to tag as unsealable.\n */\ngoog.tagUnsealableClass = function(ctr) {\n  if (!COMPILED && goog.defineClass.SEAL_CLASS_INSTANCES) {\n    ctr.prototype[goog.UNSEALABLE_CONSTRUCTOR_PROPERTY_] = true;\n  }\n};\n\n\n/**\n * Name for unsealable tag property.\n * @const @private {string}\n */\ngoog.UNSEALABLE_CONSTRUCTOR_PROPERTY_ = 'goog_defineClass_legacy_unsealable';\n\n\n// There's a bug in the compiler where without collapse properties the\n// Closure namespace defines do not guard code correctly. To help reduce code\n// size also check for !COMPILED even though it redundant until this is fixed.\nif (!COMPILED && goog.DEPENDENCIES_ENABLED) {\n\n  /**\n   * Tries to detect whether is in the context of an HTML document.\n   * @return {boolean} True if it looks like HTML document.\n   * @private\n   */\n  goog.inHtmlDocument_ = function() {\n    /** @type {!Document} */\n    var doc = goog.global.document;\n    return doc != null && 'write' in doc;  // XULDocument misses write.\n  };\n\n\n  /**\n   * We'd like to check for if the document readyState is 'loading'; however\n   * there are bugs on IE 10 and below where the readyState being anything other\n   * than 'complete' is not reliable.\n   * @return {boolean}\n   * @private\n   */\n  goog.isDocumentLoading_ = function() {\n    // attachEvent is available on IE 6 thru 10 only, and thus can be used to\n    // detect those browsers.\n    /** @type {!HTMLDocument} */\n    var doc = goog.global.document;\n    return doc.attachEvent ? doc.readyState != 'complete' :\n                             doc.readyState == 'loading';\n  };\n\n\n  /**\n   * Tries to detect the base path of base.js script that bootstraps Closure.\n   * @private\n   */\n  goog.findBasePath_ = function() {\n    if (goog.global.CLOSURE_BASE_PATH != undefined &&\n        // Anti DOM-clobbering runtime check (b/37736576).\n        typeof goog.global.CLOSURE_BASE_PATH === 'string') {\n      goog.basePath = goog.global.CLOSURE_BASE_PATH;\n      return;\n    } else if (!goog.inHtmlDocument_()) {\n      return;\n    }\n    /** @type {!Document} */\n    var doc = goog.global.document;\n    // If we have a currentScript available, use it exclusively.\n    var currentScript = doc.currentScript;\n    if (currentScript) {\n      var scripts = [currentScript];\n    } else {\n      var scripts = doc.getElementsByTagName('SCRIPT');\n    }\n    // Search backwards since the current script is in almost all cases the one\n    // that has base.js.\n    for (var i = scripts.length - 1; i >= 0; --i) {\n      var script = /** @type {!HTMLScriptElement} */ (scripts[i]);\n      var src = script.src;\n      var qmark = src.lastIndexOf('?');\n      var l = qmark == -1 ? src.length : qmark;\n      if (src.substr(l - 7, 7) == 'base.js') {\n        goog.basePath = src.substr(0, l - 7);\n        return;\n      }\n    }\n  };\n\n  goog.findBasePath_();\n\n  /** @struct @constructor @final */\n  goog.Transpiler = function() {\n    /** @private {?Object<string, boolean>} */\n    this.requiresTranspilation_ = null;\n    /** @private {string} */\n    this.transpilationTarget_ = goog.TRANSPILE_TO_LANGUAGE;\n  };\n\n\n  /**\n   * Returns a newly created map from language mode string to a boolean\n   * indicating whether transpilation should be done for that mode as well as\n   * the highest level language that this environment supports.\n   *\n   * Guaranteed invariant:\n   * For any two modes, l1 and l2 where l2 is a newer mode than l1,\n   * `map[l1] == true` implies that `map[l2] == true`.\n   *\n   * Note this method is extracted and used elsewhere, so it cannot rely on\n   * anything external (it should easily be able to be transformed into a\n   * standalone, top level function).\n   *\n   * @private\n   * @return {{\n   *   target: string,\n   *   map: !Object<string, boolean>\n   * }}\n   */\n  goog.Transpiler.prototype.createRequiresTranspilation_ = function() {\n    var transpilationTarget = 'es3';\n    var /** !Object<string, boolean> */ requiresTranspilation = {'es3': false};\n    var transpilationRequiredForAllLaterModes = false;\n\n    /**\n     * Adds an entry to requiresTranspliation for the given language mode.\n     *\n     * IMPORTANT: Calls must be made in order from oldest to newest language\n     * mode.\n     * @param {string} modeName\n     * @param {function(): boolean} isSupported Returns true if the JS engine\n     *     supports the given mode.\n     */\n    function addNewerLanguageTranspilationCheck(modeName, isSupported) {\n      if (transpilationRequiredForAllLaterModes) {\n        requiresTranspilation[modeName] = true;\n      } else if (isSupported()) {\n        transpilationTarget = modeName;\n        requiresTranspilation[modeName] = false;\n      } else {\n        requiresTranspilation[modeName] = true;\n        transpilationRequiredForAllLaterModes = true;\n      }\n    }\n\n    /**\n     * Does the given code evaluate without syntax errors and return a truthy\n     * result?\n     */\n    function /** boolean */ evalCheck(/** string */ code) {\n      try {\n        return !!eval(code);\n      } catch (ignored) {\n        return false;\n      }\n    }\n\n    var userAgent = goog.global.navigator && goog.global.navigator.userAgent ?\n        goog.global.navigator.userAgent :\n        '';\n\n    // Identify ES3-only browsers by their incorrect treatment of commas.\n    addNewerLanguageTranspilationCheck('es5', function() {\n      return evalCheck('[1,].length==1');\n    });\n    addNewerLanguageTranspilationCheck('es6', function() {\n      // Edge has a non-deterministic (i.e., not reproducible) bug with ES6:\n      // https://github.com/Microsoft/ChakraCore/issues/1496.\n      var re = /Edge\\/(\\d+)(\\.\\d)*/i;\n      var edgeUserAgent = userAgent.match(re);\n      if (edgeUserAgent) {\n        // The Reflect.construct test below is flaky on Edge. It can sometimes\n        // pass or fail on 40 15.15063, so just exit early for Edge and treat\n        // it as ES5. Until we're on a more up to date version just always use\n        // ES5. See https://github.com/Microsoft/ChakraCore/issues/3217.\n        return false;\n      }\n      // Test es6: [FF50 (?), Edge 14 (?), Chrome 50]\n      //   (a) default params (specifically shadowing locals),\n      //   (b) destructuring, (c) block-scoped functions,\n      //   (d) for-of (const), (e) new.target/Reflect.construct\n      var es6fullTest =\n          'class X{constructor(){if(new.target!=String)throw 1;this.x=42}}' +\n          'let q=Reflect.construct(X,[],String);if(q.x!=42||!(q instanceof ' +\n          'String))throw 1;for(const a of[2,3]){if(a==2)continue;function ' +\n          'f(z={a}){let a=0;return z.a}{function f(){return 0;}}return f()' +\n          '==3}';\n\n      return evalCheck('(()=>{\"use strict\";' + es6fullTest + '})()');\n    });\n    // ** and **= are the only new features in 'es7'\n    addNewerLanguageTranspilationCheck('es7', function() {\n      return evalCheck('2 ** 2 == 4');\n    });\n    // async functions are the only new features in 'es8'\n    addNewerLanguageTranspilationCheck('es8', function() {\n      return evalCheck('async () => 1, true');\n    });\n    addNewerLanguageTranspilationCheck('es9', function() {\n      return evalCheck('({...rest} = {}), true');\n    });\n    addNewerLanguageTranspilationCheck('es_next', function() {\n      return false;  // assume it always need to transpile\n    });\n    return {target: transpilationTarget, map: requiresTranspilation};\n  };\n\n\n  /**\n   * Determines whether the given language needs to be transpiled.\n   * @param {string} lang\n   * @param {string|undefined} module\n   * @return {boolean}\n   */\n  goog.Transpiler.prototype.needsTranspile = function(lang, module) {\n    if (goog.TRANSPILE == 'always') {\n      return true;\n    } else if (goog.TRANSPILE == 'never') {\n      return false;\n    } else if (!this.requiresTranspilation_) {\n      var obj = this.createRequiresTranspilation_();\n      this.requiresTranspilation_ = obj.map;\n      this.transpilationTarget_ = this.transpilationTarget_ || obj.target;\n    }\n    if (lang in this.requiresTranspilation_) {\n      if (this.requiresTranspilation_[lang]) {\n        return true;\n      } else if (\n          goog.inHtmlDocument_() && module == 'es6' &&\n          !('noModule' in goog.global.document.createElement('script'))) {\n        return true;\n      } else {\n        return false;\n      }\n    } else {\n      throw new Error('Unknown language mode: ' + lang);\n    }\n  };\n\n\n  /**\n   * Lazily retrieves the transpiler and applies it to the source.\n   * @param {string} code JS code.\n   * @param {string} path Path to the code.\n   * @return {string} The transpiled code.\n   */\n  goog.Transpiler.prototype.transpile = function(code, path) {\n    // TODO(johnplaisted): We should delete goog.transpile_ and just have this\n    // function. But there's some compile error atm where goog.global is being\n    // stripped incorrectly without this.\n    return goog.transpile_(code, path, this.transpilationTarget_);\n  };\n\n\n  /** @private @final {!goog.Transpiler} */\n  goog.transpiler_ = new goog.Transpiler();\n\n  /**\n   * Rewrites closing script tags in input to avoid ending an enclosing script\n   * tag.\n   *\n   * @param {string} str\n   * @return {string}\n   * @private\n   */\n  goog.protectScriptTag_ = function(str) {\n    return str.replace(/<\\/(SCRIPT)/ig, '\\\\x3c/$1');\n  };\n\n\n  /**\n   * A debug loader is responsible for downloading and executing javascript\n   * files in an unbundled, uncompiled environment.\n   *\n   * This can be custimized via the setDependencyFactory method, or by\n   * CLOSURE_IMPORT_SCRIPT/CLOSURE_LOAD_FILE_SYNC.\n   *\n   * @struct @constructor @final @private\n   */\n  goog.DebugLoader_ = function() {\n    /** @private @const {!Object<string, !goog.Dependency>} */\n    this.dependencies_ = {};\n    /** @private @const {!Object<string, string>} */\n    this.idToPath_ = {};\n    /** @private @const {!Object<string, boolean>} */\n    this.written_ = {};\n    /** @private @const {!Array<!goog.Dependency>} */\n    this.loadingDeps_ = [];\n    /** @private {!Array<!goog.Dependency>} */\n    this.depsToLoad_ = [];\n    /** @private {boolean} */\n    this.paused_ = false;\n    /** @private {!goog.DependencyFactory} */\n    this.factory_ = new goog.DependencyFactory(goog.transpiler_);\n    /** @private @const {!Object<string, !Function>} */\n    this.deferredCallbacks_ = {};\n    /** @private @const {!Array<string>} */\n    this.deferredQueue_ = [];\n  };\n\n  /**\n   * @param {!Array<string>} namespaces\n   * @param {function(): undefined} callback Function to call once all the\n   *     namespaces have loaded.\n   */\n  goog.DebugLoader_.prototype.bootstrap = function(namespaces, callback) {\n    var cb = callback;\n    function resolve() {\n      if (cb) {\n        goog.global.setTimeout(cb, 0);\n        cb = null;\n      }\n    }\n\n    if (!namespaces.length) {\n      resolve();\n      return;\n    }\n\n    var deps = [];\n    for (var i = 0; i < namespaces.length; i++) {\n      var path = this.getPathFromDeps_(namespaces[i]);\n      if (!path) {\n        throw new Error('Unregonized namespace: ' + namespaces[i]);\n      }\n      deps.push(this.dependencies_[path]);\n    }\n\n    var require = goog.require;\n    var loaded = 0;\n    for (var i = 0; i < namespaces.length; i++) {\n      require(namespaces[i]);\n      deps[i].onLoad(function() {\n        if (++loaded == namespaces.length) {\n          resolve();\n        }\n      });\n    }\n  };\n\n\n  /**\n   * Loads the Closure Dependency file.\n   *\n   * Exposed a public function so CLOSURE_NO_DEPS can be set to false, base\n   * loaded, setDependencyFactory called, and then this called. i.e. allows\n   * custom loading of the deps file.\n   */\n  goog.DebugLoader_.prototype.loadClosureDeps = function() {\n    // Circumvent addDependency, which would try to transpile deps.js if\n    // transpile is set to always.\n    var relPath = 'deps.js';\n    this.depsToLoad_.push(this.factory_.createDependency(\n        goog.normalizePath_(goog.basePath + relPath), relPath, [], [], {},\n        false));\n    this.loadDeps_();\n  };\n\n\n  /**\n   * Notifies the debug loader when a dependency has been requested.\n   *\n   * @param {string} absPathOrId Path of the dependency or goog id.\n   * @param {boolean=} opt_force\n   */\n  goog.DebugLoader_.prototype.requested = function(absPathOrId, opt_force) {\n    var path = this.getPathFromDeps_(absPathOrId);\n    if (path &&\n        (opt_force || this.areDepsLoaded_(this.dependencies_[path].requires))) {\n      var callback = this.deferredCallbacks_[path];\n      if (callback) {\n        delete this.deferredCallbacks_[path];\n        callback();\n      }\n    }\n  };\n\n\n  /**\n   * Sets the dependency factory, which can be used to create custom\n   * goog.Dependency implementations to control how dependencies are loaded.\n   *\n   * @param {!goog.DependencyFactory} factory\n   */\n  goog.DebugLoader_.prototype.setDependencyFactory = function(factory) {\n    this.factory_ = factory;\n  };\n\n\n  /**\n   * Travserses the dependency graph and queues the given dependency, and all of\n   * its transitive dependencies, for loading and then starts loading if not\n   * paused.\n   *\n   * @param {string} namespace\n   * @private\n   */\n  goog.DebugLoader_.prototype.load_ = function(namespace) {\n    if (!this.getPathFromDeps_(namespace)) {\n      var errorMessage = 'goog.require could not find: ' + namespace;\n\n      goog.logToConsole_(errorMessage);\n      throw Error(errorMessage);\n    } else {\n      var loader = this;\n\n      var deps = [];\n\n      /** @param {string} namespace */\n      var visit = function(namespace) {\n        var path = loader.getPathFromDeps_(namespace);\n\n        if (!path) {\n          throw new Error('Bad dependency path or symbol: ' + namespace);\n        }\n\n        if (loader.written_[path]) {\n          return;\n        }\n\n        loader.written_[path] = true;\n\n        var dep = loader.dependencies_[path];\n        for (var i = 0; i < dep.requires.length; i++) {\n          if (!goog.isProvided_(dep.requires[i])) {\n            visit(dep.requires[i]);\n          }\n        }\n\n        deps.push(dep);\n      };\n\n      visit(namespace);\n\n      var wasLoading = !!this.depsToLoad_.length;\n      this.depsToLoad_ = this.depsToLoad_.concat(deps);\n\n      if (!this.paused_ && !wasLoading) {\n        this.loadDeps_();\n      }\n    }\n  };\n\n\n  /**\n   * Loads any queued dependencies until they are all loaded or paused.\n   *\n   * @private\n   */\n  goog.DebugLoader_.prototype.loadDeps_ = function() {\n    var loader = this;\n    var paused = this.paused_;\n\n    while (this.depsToLoad_.length && !paused) {\n      (function() {\n        var loadCallDone = false;\n        var dep = loader.depsToLoad_.shift();\n\n        var loaded = false;\n        loader.loading_(dep);\n\n        var controller = {\n          pause: function() {\n            if (loadCallDone) {\n              throw new Error('Cannot call pause after the call to load.');\n            } else {\n              paused = true;\n            }\n          },\n          resume: function() {\n            if (loadCallDone) {\n              loader.resume_();\n            } else {\n              // Some dep called pause and then resume in the same load call.\n              // Just keep running this same loop.\n              paused = false;\n            }\n          },\n          loaded: function() {\n            if (loaded) {\n              throw new Error('Double call to loaded.');\n            }\n\n            loaded = true;\n            loader.loaded_(dep);\n          },\n          pending: function() {\n            // Defensive copy.\n            var pending = [];\n            for (var i = 0; i < loader.loadingDeps_.length; i++) {\n              pending.push(loader.loadingDeps_[i]);\n            }\n            return pending;\n          },\n          /**\n           * @param {goog.ModuleType} type\n           */\n          setModuleState: function(type) {\n            goog.moduleLoaderState_ = {\n              type: type,\n              moduleName: '',\n              declareLegacyNamespace: false\n            };\n          },\n          /** @type {function(string, string, string=)} */\n          registerEs6ModuleExports: function(\n              path, exports, opt_closureNamespace) {\n            if (opt_closureNamespace) {\n              goog.loadedModules_[opt_closureNamespace] = {\n                exports: exports,\n                type: goog.ModuleType.ES6,\n                moduleId: opt_closureNamespace || ''\n              };\n            }\n          },\n          /** @type {function(string, ?)} */\n          registerGoogModuleExports: function(moduleId, exports) {\n            goog.loadedModules_[moduleId] = {\n              exports: exports,\n              type: goog.ModuleType.GOOG,\n              moduleId: moduleId\n            };\n          },\n          clearModuleState: function() {\n            goog.moduleLoaderState_ = null;\n          },\n          defer: function(callback) {\n            if (loadCallDone) {\n              throw new Error(\n                  'Cannot register with defer after the call to load.');\n            }\n            loader.defer_(dep, callback);\n          },\n          areDepsLoaded: function() {\n            return loader.areDepsLoaded_(dep.requires);\n          }\n        };\n\n        try {\n          dep.load(controller);\n        } finally {\n          loadCallDone = true;\n        }\n      })();\n    }\n\n    if (paused) {\n      this.pause_();\n    }\n  };\n\n\n  /** @private */\n  goog.DebugLoader_.prototype.pause_ = function() {\n    this.paused_ = true;\n  };\n\n\n  /** @private */\n  goog.DebugLoader_.prototype.resume_ = function() {\n    if (this.paused_) {\n      this.paused_ = false;\n      this.loadDeps_();\n    }\n  };\n\n\n  /**\n   * Marks the given dependency as loading (load has been called but it has not\n   * yet marked itself as finished). Useful for dependencies that want to know\n   * what else is loading. Example: goog.modules cannot eval if there are\n   * loading dependencies.\n   *\n   * @param {!goog.Dependency} dep\n   * @private\n   */\n  goog.DebugLoader_.prototype.loading_ = function(dep) {\n    this.loadingDeps_.push(dep);\n  };\n\n\n  /**\n   * Marks the given dependency as having finished loading and being available\n   * for require.\n   *\n   * @param {!goog.Dependency} dep\n   * @private\n   */\n  goog.DebugLoader_.prototype.loaded_ = function(dep) {\n    for (var i = 0; i < this.loadingDeps_.length; i++) {\n      if (this.loadingDeps_[i] == dep) {\n        this.loadingDeps_.splice(i, 1);\n        break;\n      }\n    }\n\n    for (var i = 0; i < this.deferredQueue_.length; i++) {\n      if (this.deferredQueue_[i] == dep.path) {\n        this.deferredQueue_.splice(i, 1);\n        break;\n      }\n    }\n\n    if (this.loadingDeps_.length == this.deferredQueue_.length &&\n        !this.depsToLoad_.length) {\n      // Something has asked to load these, but they may not be directly\n      // required again later, so load them now that we know we're done loading\n      // everything else. e.g. a goog module entry point.\n      while (this.deferredQueue_.length) {\n        this.requested(this.deferredQueue_.shift(), true);\n      }\n    }\n\n    dep.loaded();\n  };\n\n\n  /**\n   * @param {!Array<string>} pathsOrIds\n   * @return {boolean}\n   * @private\n   */\n  goog.DebugLoader_.prototype.areDepsLoaded_ = function(pathsOrIds) {\n    for (var i = 0; i < pathsOrIds.length; i++) {\n      var path = this.getPathFromDeps_(pathsOrIds[i]);\n      if (!path ||\n          (!(path in this.deferredCallbacks_) &&\n           !goog.isProvided_(pathsOrIds[i]))) {\n        return false;\n      }\n    }\n\n    return true;\n  };\n\n\n  /**\n   * @param {string} absPathOrId\n   * @return {?string}\n   * @private\n   */\n  goog.DebugLoader_.prototype.getPathFromDeps_ = function(absPathOrId) {\n    if (absPathOrId in this.idToPath_) {\n      return this.idToPath_[absPathOrId];\n    } else if (absPathOrId in this.dependencies_) {\n      return absPathOrId;\n    } else {\n      return null;\n    }\n  };\n\n\n  /**\n   * @param {!goog.Dependency} dependency\n   * @param {!Function} callback\n   * @private\n   */\n  goog.DebugLoader_.prototype.defer_ = function(dependency, callback) {\n    this.deferredCallbacks_[dependency.path] = callback;\n    this.deferredQueue_.push(dependency.path);\n  };\n\n\n  /**\n   * Interface for goog.Dependency implementations to have some control over\n   * loading of dependencies.\n   *\n   * @record\n   */\n  goog.LoadController = function() {};\n\n\n  /**\n   * Tells the controller to halt loading of more dependencies.\n   */\n  goog.LoadController.prototype.pause = function() {};\n\n\n  /**\n   * Tells the controller to resume loading of more dependencies if paused.\n   */\n  goog.LoadController.prototype.resume = function() {};\n\n\n  /**\n   * Tells the controller that this dependency has finished loading.\n   *\n   * This causes this to be removed from pending() and any load callbacks to\n   * fire.\n   */\n  goog.LoadController.prototype.loaded = function() {};\n\n\n  /**\n   * List of dependencies on which load has been called but which have not\n   * called loaded on their controller. This includes the current dependency.\n   *\n   * @return {!Array<!goog.Dependency>}\n   */\n  goog.LoadController.prototype.pending = function() {};\n\n\n  /**\n   * Registers an object as an ES6 module's exports so that goog.modules may\n   * require it by path.\n   *\n   * @param {string} path Full path of the module.\n   * @param {?} exports\n   * @param {string=} opt_closureNamespace Closure namespace to associate with\n   *     this module.\n   */\n  goog.LoadController.prototype.registerEs6ModuleExports = function(\n      path, exports, opt_closureNamespace) {};\n\n\n  /**\n   * Sets the current module state.\n   *\n   * @param {goog.ModuleType} type Type of module.\n   */\n  goog.LoadController.prototype.setModuleState = function(type) {};\n\n\n  /**\n   * Clears the current module state.\n   */\n  goog.LoadController.prototype.clearModuleState = function() {};\n\n\n  /**\n   * Registers a callback to call once the dependency is actually requested\n   * via goog.require + all of the immediate dependencies have been loaded or\n   * all other files have been loaded. Allows for lazy loading until\n   * require'd without pausing dependency loading, which is needed on old IE.\n   *\n   * @param {!Function} callback\n   */\n  goog.LoadController.prototype.defer = function(callback) {};\n\n\n  /**\n   * @return {boolean}\n   */\n  goog.LoadController.prototype.areDepsLoaded = function() {};\n\n\n  /**\n   * Basic super class for all dependencies Closure Library can load.\n   *\n   * This default implementation is designed to load untranspiled, non-module\n   * scripts in a web broswer.\n   *\n   * For transpiled non-goog.module files {@see goog.TranspiledDependency}.\n   * For goog.modules see {@see goog.GoogModuleDependency}.\n   * For untranspiled ES6 modules {@see goog.Es6ModuleDependency}.\n   *\n   * @param {string} path Absolute path of this script.\n   * @param {string} relativePath Path of this script relative to goog.basePath.\n   * @param {!Array<string>} provides goog.provided or goog.module symbols\n   *     in this file.\n   * @param {!Array<string>} requires goog symbols or relative paths to Closure\n   *     this depends on.\n   * @param {!Object<string, string>} loadFlags\n   * @struct @constructor\n   */\n  goog.Dependency = function(\n      path, relativePath, provides, requires, loadFlags) {\n    /** @const */\n    this.path = path;\n    /** @const */\n    this.relativePath = relativePath;\n    /** @const */\n    this.provides = provides;\n    /** @const */\n    this.requires = requires;\n    /** @const */\n    this.loadFlags = loadFlags;\n    /** @private {boolean} */\n    this.loaded_ = false;\n    /** @private {!Array<function()>} */\n    this.loadCallbacks_ = [];\n  };\n\n\n  /**\n   * @return {string} The pathname part of this dependency's path if it is a\n   *     URI.\n   */\n  goog.Dependency.prototype.getPathName = function() {\n    var pathName = this.path;\n    var protocolIndex = pathName.indexOf('://');\n    if (protocolIndex >= 0) {\n      pathName = pathName.substring(protocolIndex + 3);\n      var slashIndex = pathName.indexOf('/');\n      if (slashIndex >= 0) {\n        pathName = pathName.substring(slashIndex + 1);\n      }\n    }\n    return pathName;\n  };\n\n\n  /**\n   * @param {function()} callback Callback to fire as soon as this has loaded.\n   * @final\n   */\n  goog.Dependency.prototype.onLoad = function(callback) {\n    if (this.loaded_) {\n      callback();\n    } else {\n      this.loadCallbacks_.push(callback);\n    }\n  };\n\n\n  /**\n   * Marks this dependency as loaded and fires any callbacks registered with\n   * onLoad.\n   * @final\n   */\n  goog.Dependency.prototype.loaded = function() {\n    this.loaded_ = true;\n    var callbacks = this.loadCallbacks_;\n    this.loadCallbacks_ = [];\n    for (var i = 0; i < callbacks.length; i++) {\n      callbacks[i]();\n    }\n  };\n\n\n  /**\n   * Whether or not document.written / appended script tags should be deferred.\n   *\n   * @private {boolean}\n   */\n  goog.Dependency.defer_ = false;\n\n\n  /**\n   * Map of script ready / state change callbacks. Old IE cannot handle putting\n   * these properties on goog.global.\n   *\n   * @private @const {!Object<string, function(?):undefined>}\n   */\n  goog.Dependency.callbackMap_ = {};\n\n\n  /**\n   * @param {function(...?):?} callback\n   * @return {string}\n   * @private\n   */\n  goog.Dependency.registerCallback_ = function(callback) {\n    var key = Math.random().toString(32);\n    goog.Dependency.callbackMap_[key] = callback;\n    return key;\n  };\n\n\n  /**\n   * @param {string} key\n   * @private\n   */\n  goog.Dependency.unregisterCallback_ = function(key) {\n    delete goog.Dependency.callbackMap_[key];\n  };\n\n\n  /**\n   * @param {string} key\n   * @param {...?} var_args\n   * @private\n   * @suppress {unusedPrivateMembers}\n   */\n  goog.Dependency.callback_ = function(key, var_args) {\n    if (key in goog.Dependency.callbackMap_) {\n      var callback = goog.Dependency.callbackMap_[key];\n      var args = [];\n      for (var i = 1; i < arguments.length; i++) {\n        args.push(arguments[i]);\n      }\n      callback.apply(undefined, args);\n    } else {\n      var errorMessage = 'Callback key ' + key +\n          ' does not exist (was base.js loaded more than once?).';\n      throw Error(errorMessage);\n    }\n  };\n\n\n  /**\n   * Starts loading this dependency. This dependency can pause loading if it\n   * needs to and resume it later via the controller interface.\n   *\n   * When this is loaded it should call controller.loaded(). Note that this will\n   * end up calling the loaded method of this dependency; there is no need to\n   * call it explicitly.\n   *\n   * @param {!goog.LoadController} controller\n   */\n  goog.Dependency.prototype.load = function(controller) {\n    if (goog.global.CLOSURE_IMPORT_SCRIPT) {\n      if (goog.global.CLOSURE_IMPORT_SCRIPT(this.path)) {\n        controller.loaded();\n      } else {\n        controller.pause();\n      }\n      return;\n    }\n\n    if (!goog.inHtmlDocument_()) {\n      goog.logToConsole_(\n          'Cannot use default debug loader outside of HTML documents.');\n      if (this.relativePath == 'deps.js') {\n        // Some old code is relying on base.js auto loading deps.js failing with\n        // no error before later setting CLOSURE_IMPORT_SCRIPT.\n        // CLOSURE_IMPORT_SCRIPT should be set *before* base.js is loaded, or\n        // CLOSURE_NO_DEPS set to true.\n        goog.logToConsole_(\n            'Consider setting CLOSURE_IMPORT_SCRIPT before loading base.js, ' +\n            'or setting CLOSURE_NO_DEPS to true.');\n        controller.loaded();\n      } else {\n        controller.pause();\n      }\n      return;\n    }\n\n    /** @type {!HTMLDocument} */\n    var doc = goog.global.document;\n\n    // If the user tries to require a new symbol after document load,\n    // something has gone terribly wrong. Doing a document.write would\n    // wipe out the page. This does not apply to the CSP-compliant method\n    // of writing script tags.\n    if (doc.readyState == 'complete' &&\n        !goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING) {\n      // Certain test frameworks load base.js multiple times, which tries\n      // to write deps.js each time. If that happens, just fail silently.\n      // These frameworks wipe the page between each load of base.js, so this\n      // is OK.\n      var isDeps = /\\bdeps.js$/.test(this.path);\n      if (isDeps) {\n        controller.loaded();\n        return;\n      } else {\n        throw Error('Cannot write \"' + this.path + '\" after document load');\n      }\n    }\n\n    if (!goog.ENABLE_CHROME_APP_SAFE_SCRIPT_LOADING &&\n        goog.isDocumentLoading_()) {\n      var key = goog.Dependency.registerCallback_(function(script) {\n        if (!goog.DebugLoader_.IS_OLD_IE_ || script.readyState == 'complete') {\n          goog.Dependency.unregisterCallback_(key);\n          controller.loaded();\n        }\n      });\n      var nonceAttr = !goog.DebugLoader_.IS_OLD_IE_ && goog.getScriptNonce() ?\n          ' nonce=\"' + goog.getScriptNonce() + '\"' :\n          '';\n      var event =\n          goog.DebugLoader_.IS_OLD_IE_ ? 'onreadystatechange' : 'onload';\n      var defer = goog.Dependency.defer_ ? 'defer' : '';\n      var script = '<script src=\"' + this.path + '\" ' + event +\n          '=\"goog.Dependency.callback_(\\'' + key +\n          '\\', this)\" type=\"text/javascript\" ' + defer + nonceAttr + '><' +\n          '/script>';\n      doc.write(\n          goog.TRUSTED_TYPES_POLICY_ ?\n              goog.TRUSTED_TYPES_POLICY_.createHTML(script) :\n              script);\n    } else {\n      var scriptEl =\n          /** @type {!HTMLScriptElement} */ (doc.createElement('script'));\n      scriptEl.defer = goog.Dependency.defer_;\n      scriptEl.async = false;\n      scriptEl.type = 'text/javascript';\n\n      // If CSP nonces are used, propagate them to dynamically created scripts.\n      // This is necessary to allow nonce-based CSPs without 'strict-dynamic'.\n      var nonce = goog.getScriptNonce();\n      if (nonce) {\n        scriptEl.setAttribute('nonce', nonce);\n      }\n\n      if (goog.DebugLoader_.IS_OLD_IE_) {\n        // Execution order is not guaranteed on old IE, halt loading and write\n        // these scripts one at a time, after each loads.\n        controller.pause();\n        scriptEl.onreadystatechange = function() {\n          if (scriptEl.readyState == 'loaded' ||\n              scriptEl.readyState == 'complete') {\n            controller.loaded();\n            controller.resume();\n          }\n        };\n      } else {\n        scriptEl.onload = function() {\n          scriptEl.onload = null;\n          controller.loaded();\n        };\n      }\n\n      scriptEl.src = goog.TRUSTED_TYPES_POLICY_ ?\n          goog.TRUSTED_TYPES_POLICY_.createScriptURL(this.path) :\n          this.path;\n      doc.head.appendChild(scriptEl);\n    }\n  };\n\n\n  /**\n   * @param {string} path Absolute path of this script.\n   * @param {string} relativePath Path of this script relative to goog.basePath.\n   * @param {!Array<string>} provides Should be an empty array.\n   *     TODO(johnplaisted) add support for adding closure namespaces to ES6\n   *     modules for interop purposes.\n   * @param {!Array<string>} requires goog symbols or relative paths to Closure\n   *     this depends on.\n   * @param {!Object<string, string>} loadFlags\n   * @struct @constructor\n   * @extends {goog.Dependency}\n   */\n  goog.Es6ModuleDependency = function(\n      path, relativePath, provides, requires, loadFlags) {\n    goog.Es6ModuleDependency.base(\n        this, 'constructor', path, relativePath, provides, requires, loadFlags);\n  };\n  goog.inherits(goog.Es6ModuleDependency, goog.Dependency);\n\n\n  /** @override */\n  goog.Es6ModuleDependency.prototype.load = function(controller) {\n    if (goog.global.CLOSURE_IMPORT_SCRIPT) {\n      if (goog.global.CLOSURE_IMPORT_SCRIPT(this.path)) {\n        controller.loaded();\n      } else {\n        controller.pause();\n      }\n      return;\n    }\n\n    if (!goog.inHtmlDocument_()) {\n      goog.logToConsole_(\n          'Cannot use default debug loader outside of HTML documents.');\n      controller.pause();\n      return;\n    }\n\n    /** @type {!HTMLDocument} */\n    var doc = goog.global.document;\n\n    var dep = this;\n\n    // TODO(johnplaisted): Does document.writing really speed up anything? Any\n    // difference between this and just waiting for interactive mode and then\n    // appending?\n    function write(src, contents) {\n      if (contents) {\n        var script = '<script type=\"module\" crossorigin>' + contents + '</' +\n            'script>';\n        doc.write(\n            goog.TRUSTED_TYPES_POLICY_ ?\n                goog.TRUSTED_TYPES_POLICY_.createHTML(script) :\n                script);\n      } else {\n        var script = '<script type=\"module\" crossorigin src=\"' + src + '\"></' +\n            'script>';\n        doc.write(\n            goog.TRUSTED_TYPES_POLICY_ ?\n                goog.TRUSTED_TYPES_POLICY_.createHTML(script) :\n                script);\n      }\n    }\n\n    function append(src, contents) {\n      var scriptEl =\n          /** @type {!HTMLScriptElement} */ (doc.createElement('script'));\n      scriptEl.defer = true;\n      scriptEl.async = false;\n      scriptEl.type = 'module';\n      scriptEl.setAttribute('crossorigin', true);\n\n      // If CSP nonces are used, propagate them to dynamically created scripts.\n      // This is necessary to allow nonce-based CSPs without 'strict-dynamic'.\n      var nonce = goog.getScriptNonce();\n      if (nonce) {\n        scriptEl.setAttribute('nonce', nonce);\n      }\n\n      if (contents) {\n        scriptEl.textContent = goog.TRUSTED_TYPES_POLICY_ ?\n            goog.TRUSTED_TYPES_POLICY_.createScript(contents) :\n            contents;\n      } else {\n        scriptEl.src = goog.TRUSTED_TYPES_POLICY_ ?\n            goog.TRUSTED_TYPES_POLICY_.createScriptURL(src) :\n            src;\n      }\n\n      doc.head.appendChild(scriptEl);\n    }\n\n    var create;\n\n    if (goog.isDocumentLoading_()) {\n      create = write;\n      // We can ONLY call document.write if we are guaranteed that any\n      // non-module script tags document.written after this are deferred.\n      // Small optimization, in theory document.writing is faster.\n      goog.Dependency.defer_ = true;\n    } else {\n      create = append;\n    }\n\n    // Write 4 separate tags here:\n    // 1) Sets the module state at the correct time (just before execution).\n    // 2) A src node for this, which just hopefully lets the browser load it a\n    //    little early (no need to parse #3).\n    // 3) Import the module and register it.\n    // 4) Clear the module state at the correct time. Guaranteed to run even\n    //    if there is an error in the module (#3 will not run if there is an\n    //    error in the module).\n    var beforeKey = goog.Dependency.registerCallback_(function() {\n      goog.Dependency.unregisterCallback_(beforeKey);\n      controller.setModuleState(goog.ModuleType.ES6);\n    });\n    create(undefined, 'goog.Dependency.callback_(\"' + beforeKey + '\")');\n\n    // TODO(johnplaisted): Does this really speed up anything?\n    create(this.path, undefined);\n\n    var registerKey = goog.Dependency.registerCallback_(function(exports) {\n      goog.Dependency.unregisterCallback_(registerKey);\n      controller.registerEs6ModuleExports(\n          dep.path, exports, goog.moduleLoaderState_.moduleName);\n    });\n    create(\n        undefined,\n        'import * as m from \"' + this.path + '\"; goog.Dependency.callback_(\"' +\n            registerKey + '\", m)');\n\n    var afterKey = goog.Dependency.registerCallback_(function() {\n      goog.Dependency.unregisterCallback_(afterKey);\n      controller.clearModuleState();\n      controller.loaded();\n    });\n    create(undefined, 'goog.Dependency.callback_(\"' + afterKey + '\")');\n  };\n\n\n  /**\n   * Superclass of any dependency that needs to be loaded into memory,\n   * transformed, and then eval'd (goog.modules and transpiled files).\n   *\n   * @param {string} path Absolute path of this script.\n   * @param {string} relativePath Path of this script relative to goog.basePath.\n   * @param {!Array<string>} provides goog.provided or goog.module symbols\n   *     in this file.\n   * @param {!Array<string>} requires goog symbols or relative paths to Closure\n   *     this depends on.\n   * @param {!Object<string, string>} loadFlags\n   * @struct @constructor @abstract\n   * @extends {goog.Dependency}\n   */\n  goog.TransformedDependency = function(\n      path, relativePath, provides, requires, loadFlags) {\n    goog.TransformedDependency.base(\n        this, 'constructor', path, relativePath, provides, requires, loadFlags);\n    /** @private {?string} */\n    this.contents_ = null;\n\n    /**\n     * Whether to lazily make the synchronous XHR (when goog.require'd) or make\n     * the synchronous XHR when initially loading. On FireFox 61 there is a bug\n     * where an ES6 module cannot make a synchronous XHR (rather, it can, but if\n     * it does then no other ES6 modules will load after).\n     *\n     * tl;dr we lazy load due to bugs on older browsers and eager load due to\n     * bugs on newer ones.\n     *\n     * https://bugzilla.mozilla.org/show_bug.cgi?id=1477090\n     *\n     * @private @const {boolean}\n     */\n    this.lazyFetch_ = !goog.inHtmlDocument_() ||\n        !('noModule' in goog.global.document.createElement('script'));\n  };\n  goog.inherits(goog.TransformedDependency, goog.Dependency);\n\n\n  /** @override */\n  goog.TransformedDependency.prototype.load = function(controller) {\n    var dep = this;\n\n    function fetch() {\n      dep.contents_ = goog.loadFileSync_(dep.path);\n\n      if (dep.contents_) {\n        dep.contents_ = dep.transform(dep.contents_);\n        if (dep.contents_) {\n          dep.contents_ += '\\n//# sourceURL=' + dep.path;\n        }\n      }\n    }\n\n    if (goog.global.CLOSURE_IMPORT_SCRIPT) {\n      fetch();\n      if (this.contents_ &&\n          goog.global.CLOSURE_IMPORT_SCRIPT('', this.contents_)) {\n        this.contents_ = null;\n        controller.loaded();\n      } else {\n        controller.pause();\n      }\n      return;\n    }\n\n\n    var isEs6 = this.loadFlags['module'] == goog.ModuleType.ES6;\n\n    if (!this.lazyFetch_) {\n      fetch();\n    }\n\n    function load() {\n      if (dep.lazyFetch_) {\n        fetch();\n      }\n\n      if (!dep.contents_) {\n        // loadFileSync_ or transform are responsible. Assume they logged an\n        // error.\n        return;\n      }\n\n      if (isEs6) {\n        controller.setModuleState(goog.ModuleType.ES6);\n      }\n\n      var namespace;\n\n      try {\n        var contents = dep.contents_;\n        dep.contents_ = null;\n        goog.globalEval(contents);\n        if (isEs6) {\n          namespace = goog.moduleLoaderState_.moduleName;\n        }\n      } finally {\n        if (isEs6) {\n          controller.clearModuleState();\n        }\n      }\n\n      if (isEs6) {\n        // Due to circular dependencies this may not be available for require\n        // right now.\n        goog.global['$jscomp']['require']['ensure'](\n            [dep.getPathName()], function() {\n              controller.registerEs6ModuleExports(\n                  dep.path,\n                  goog.global['$jscomp']['require'](dep.getPathName()),\n                  namespace);\n            });\n      }\n\n      controller.loaded();\n    }\n\n    // Do not fetch now; in FireFox 47 the synchronous XHR doesn't block all\n    // events. If we fetched now and then document.write'd the contents the\n    // document.write would be an eval and would execute too soon! Instead write\n    // a script tag to fetch and eval synchronously at the correct time.\n    function fetchInOwnScriptThenLoad() {\n      /** @type {!HTMLDocument} */\n      var doc = goog.global.document;\n\n      var key = goog.Dependency.registerCallback_(function() {\n        goog.Dependency.unregisterCallback_(key);\n        load();\n      });\n\n      var script = '<script type=\"text/javascript\">' +\n          goog.protectScriptTag_('goog.Dependency.callback_(\"' + key + '\");') +\n          '</' +\n          'script>';\n      doc.write(\n          goog.TRUSTED_TYPES_POLICY_ ?\n              goog.TRUSTED_TYPES_POLICY_.createHTML(script) :\n              script);\n    }\n\n    // If one thing is pending it is this.\n    var anythingElsePending = controller.pending().length > 1;\n\n    // If anything else is loading we need to lazy load due to bugs in old IE.\n    // Specifically script tags with src and script tags with contents could\n    // execute out of order if document.write is used, so we cannot use\n    // document.write. Do not pause here; it breaks old IE as well.\n    var useOldIeWorkAround =\n        anythingElsePending && goog.DebugLoader_.IS_OLD_IE_;\n\n    // Additionally if we are meant to defer scripts but the page is still\n    // loading (e.g. an ES6 module is loading) then also defer. Or if we are\n    // meant to defer and anything else is pending then defer (those may be\n    // scripts that did not need transformation and are just script tags with\n    // defer set to true, and we need to evaluate after that deferred script).\n    var needsAsyncLoading = goog.Dependency.defer_ &&\n        (anythingElsePending || goog.isDocumentLoading_());\n\n    if (useOldIeWorkAround || needsAsyncLoading) {\n      // Note that we only defer when we have to rather than 100% of the time.\n      // Always defering would work, but then in theory the order of\n      // goog.require calls would then matter. We want to enforce that most of\n      // the time the order of the require calls does not matter.\n      controller.defer(function() {\n        load();\n      });\n      return;\n    }\n    // TODO(johnplaisted): Externs are missing onreadystatechange for\n    // HTMLDocument.\n    /** @type {?} */\n    var doc = goog.global.document;\n\n    var isInternetExplorer =\n        goog.inHtmlDocument_() && 'ActiveXObject' in goog.global;\n\n    // Don't delay in any version of IE. There's bug around this that will\n    // cause out of order script execution. This means that on older IE ES6\n    // modules will load too early (while the document is still loading + the\n    // dom is not available). The other option is to load too late (when the\n    // document is complete and the onload even will never fire). This seems\n    // to be the lesser of two evils as scripts already act like the former.\n    if (isEs6 && goog.inHtmlDocument_() && goog.isDocumentLoading_() &&\n        !isInternetExplorer) {\n      goog.Dependency.defer_ = true;\n      // Transpiled ES6 modules still need to load like regular ES6 modules,\n      // aka only after the document is interactive.\n      controller.pause();\n      var oldCallback = doc.onreadystatechange;\n      doc.onreadystatechange = function() {\n        if (doc.readyState == 'interactive') {\n          doc.onreadystatechange = oldCallback;\n          load();\n          controller.resume();\n        }\n        if (goog.isFunction(oldCallback)) {\n          oldCallback.apply(undefined, arguments);\n        }\n      };\n    } else {\n      // Always eval on old IE.\n      if (goog.DebugLoader_.IS_OLD_IE_ || !goog.inHtmlDocument_() ||\n          !goog.isDocumentLoading_()) {\n        load();\n      } else {\n        fetchInOwnScriptThenLoad();\n      }\n    }\n  };\n\n\n  /**\n   * @param {string} contents\n   * @return {string}\n   * @abstract\n   */\n  goog.TransformedDependency.prototype.transform = function(contents) {};\n\n\n  /**\n   * Any non-goog.module dependency which needs to be transpiled before eval.\n   *\n   * @param {string} path Absolute path of this script.\n   * @param {string} relativePath Path of this script relative to goog.basePath.\n   * @param {!Array<string>} provides goog.provided or goog.module symbols\n   *     in this file.\n   * @param {!Array<string>} requires goog symbols or relative paths to Closure\n   *     this depends on.\n   * @param {!Object<string, string>} loadFlags\n   * @param {!goog.Transpiler} transpiler\n   * @struct @constructor\n   * @extends {goog.TransformedDependency}\n   */\n  goog.TranspiledDependency = function(\n      path, relativePath, provides, requires, loadFlags, transpiler) {\n    goog.TranspiledDependency.base(\n        this, 'constructor', path, relativePath, provides, requires, loadFlags);\n    /** @protected @const*/\n    this.transpiler = transpiler;\n  };\n  goog.inherits(goog.TranspiledDependency, goog.TransformedDependency);\n\n\n  /** @override */\n  goog.TranspiledDependency.prototype.transform = function(contents) {\n    // Transpile with the pathname so that ES6 modules are domain agnostic.\n    return this.transpiler.transpile(contents, this.getPathName());\n  };\n\n\n  /**\n   * An ES6 module dependency that was transpiled to a jscomp module outside\n   * of the debug loader, e.g. server side.\n   *\n   * @param {string} path Absolute path of this script.\n   * @param {string} relativePath Path of this script relative to goog.basePath.\n   * @param {!Array<string>} provides goog.provided or goog.module symbols\n   *     in this file.\n   * @param {!Array<string>} requires goog symbols or relative paths to Closure\n   *     this depends on.\n   * @param {!Object<string, string>} loadFlags\n   * @struct @constructor\n   * @extends {goog.TransformedDependency}\n   */\n  goog.PreTranspiledEs6ModuleDependency = function(\n      path, relativePath, provides, requires, loadFlags) {\n    goog.PreTranspiledEs6ModuleDependency.base(\n        this, 'constructor', path, relativePath, provides, requires, loadFlags);\n  };\n  goog.inherits(\n      goog.PreTranspiledEs6ModuleDependency, goog.TransformedDependency);\n\n\n  /** @override */\n  goog.PreTranspiledEs6ModuleDependency.prototype.transform = function(\n      contents) {\n    return contents;\n  };\n\n\n  /**\n   * A goog.module, transpiled or not. Will always perform some minimal\n   * transformation even when not transpiled to wrap in a goog.loadModule\n   * statement.\n   *\n   * @param {string} path Absolute path of this script.\n   * @param {string} relativePath Path of this script relative to goog.basePath.\n   * @param {!Array<string>} provides goog.provided or goog.module symbols\n   *     in this file.\n   * @param {!Array<string>} requires goog symbols or relative paths to Closure\n   *     this depends on.\n   * @param {!Object<string, string>} loadFlags\n   * @param {boolean} needsTranspile\n   * @param {!goog.Transpiler} transpiler\n   * @struct @constructor\n   * @extends {goog.TransformedDependency}\n   */\n  goog.GoogModuleDependency = function(\n      path, relativePath, provides, requires, loadFlags, needsTranspile,\n      transpiler) {\n    goog.GoogModuleDependency.base(\n        this, 'constructor', path, relativePath, provides, requires, loadFlags);\n    /** @private @const */\n    this.needsTranspile_ = needsTranspile;\n    /** @private @const */\n    this.transpiler_ = transpiler;\n  };\n  goog.inherits(goog.GoogModuleDependency, goog.TransformedDependency);\n\n\n  /** @override */\n  goog.GoogModuleDependency.prototype.transform = function(contents) {\n    if (this.needsTranspile_) {\n      contents = this.transpiler_.transpile(contents, this.getPathName());\n    }\n\n    if (!goog.LOAD_MODULE_USING_EVAL || goog.global.JSON === undefined) {\n      return '' +\n          'goog.loadModule(function(exports) {' +\n          '\"use strict\";' + contents +\n          '\\n' +  // terminate any trailing single line comment.\n          ';return exports' +\n          '});' +\n          '\\n//# sourceURL=' + this.path + '\\n';\n    } else {\n      return '' +\n          'goog.loadModule(' +\n          goog.global.JSON.stringify(\n              contents + '\\n//# sourceURL=' + this.path + '\\n') +\n          ');';\n    }\n  };\n\n\n  /**\n   * Whether the browser is IE9 or earlier, which needs special handling\n   * for deferred modules.\n   * @const @private {boolean}\n   */\n  goog.DebugLoader_.IS_OLD_IE_ = !!(\n      !goog.global.atob && goog.global.document && goog.global.document['all']);\n\n\n  /**\n   * @param {string} relPath\n   * @param {!Array<string>|undefined} provides\n   * @param {!Array<string>} requires\n   * @param {boolean|!Object<string>=} opt_loadFlags\n   * @see goog.addDependency\n   */\n  goog.DebugLoader_.prototype.addDependency = function(\n      relPath, provides, requires, opt_loadFlags) {\n    provides = provides || [];\n    relPath = relPath.replace(/\\\\/g, '/');\n    var path = goog.normalizePath_(goog.basePath + relPath);\n    if (!opt_loadFlags || typeof opt_loadFlags === 'boolean') {\n      opt_loadFlags = opt_loadFlags ? {'module': goog.ModuleType.GOOG} : {};\n    }\n    var dep = this.factory_.createDependency(\n        path, relPath, provides, requires, opt_loadFlags,\n        goog.transpiler_.needsTranspile(\n            opt_loadFlags['lang'] || 'es3', opt_loadFlags['module']));\n    this.dependencies_[path] = dep;\n    for (var i = 0; i < provides.length; i++) {\n      this.idToPath_[provides[i]] = path;\n    }\n    this.idToPath_[relPath] = path;\n  };\n\n\n  /**\n   * Creates goog.Dependency instances for the debug loader to load.\n   *\n   * Should be overridden to have the debug loader use custom subclasses of\n   * goog.Dependency.\n   *\n   * @param {!goog.Transpiler} transpiler\n   * @struct @constructor\n   */\n  goog.DependencyFactory = function(transpiler) {\n    /** @protected @const */\n    this.transpiler = transpiler;\n  };\n\n\n  /**\n   * @param {string} path Absolute path of the file.\n   * @param {string} relativePath Path relative to closure’s base.js.\n   * @param {!Array<string>} provides Array of provided goog.provide/module ids.\n   * @param {!Array<string>} requires Array of required goog.provide/module /\n   *     relative ES6 module paths.\n   * @param {!Object<string, string>} loadFlags\n   * @param {boolean} needsTranspile True if the file needs to be transpiled\n   *     per the goog.Transpiler.\n   * @return {!goog.Dependency}\n   */\n  goog.DependencyFactory.prototype.createDependency = function(\n      path, relativePath, provides, requires, loadFlags, needsTranspile) {\n\n    if (loadFlags['module'] == goog.ModuleType.GOOG) {\n      return new goog.GoogModuleDependency(\n          path, relativePath, provides, requires, loadFlags, needsTranspile,\n          this.transpiler);\n    } else if (needsTranspile) {\n      return new goog.TranspiledDependency(\n          path, relativePath, provides, requires, loadFlags, this.transpiler);\n    } else {\n      if (loadFlags['module'] == goog.ModuleType.ES6) {\n        if (goog.TRANSPILE == 'never' && goog.ASSUME_ES_MODULES_TRANSPILED) {\n          return new goog.PreTranspiledEs6ModuleDependency(\n              path, relativePath, provides, requires, loadFlags);\n        } else {\n          return new goog.Es6ModuleDependency(\n              path, relativePath, provides, requires, loadFlags);\n        }\n      } else {\n        return new goog.Dependency(\n            path, relativePath, provides, requires, loadFlags);\n      }\n    }\n  };\n\n\n  /** @private @const */\n  goog.debugLoader_ = new goog.DebugLoader_();\n\n\n  /**\n   * Loads the Closure Dependency file.\n   *\n   * Exposed a public function so CLOSURE_NO_DEPS can be set to false, base\n   * loaded, setDependencyFactory called, and then this called. i.e. allows\n   * custom loading of the deps file.\n   */\n  goog.loadClosureDeps = function() {\n    goog.debugLoader_.loadClosureDeps();\n  };\n\n\n  /**\n   * Sets the dependency factory, which can be used to create custom\n   * goog.Dependency implementations to control how dependencies are loaded.\n   *\n   * Note: if you wish to call this function and provide your own implemnetation\n   * it is a wise idea to set CLOSURE_NO_DEPS to true, otherwise the dependency\n   * file and all of its goog.addDependency calls will use the default factory.\n   * You can call goog.loadClosureDeps to load the Closure dependency file\n   * later, after your factory is injected.\n   *\n   * @param {!goog.DependencyFactory} factory\n   */\n  goog.setDependencyFactory = function(factory) {\n    goog.debugLoader_.setDependencyFactory(factory);\n  };\n\n\n  if (!goog.global.CLOSURE_NO_DEPS) {\n    goog.debugLoader_.loadClosureDeps();\n  }\n\n\n  /**\n   * Bootstraps the given namespaces and calls the callback once they are\n   * available either via goog.require. This is a replacement for using\n   * `goog.require` to bootstrap Closure JavaScript. Previously a `goog.require`\n   * in an HTML file would guarantee that the require'd namespace was available\n   * in the next immediate script tag. With ES6 modules this no longer a\n   * guarantee.\n   *\n   * @param {!Array<string>} namespaces\n   * @param {function(): ?} callback Function to call once all the namespaces\n   *     have loaded. Always called asynchronously.\n   */\n  goog.bootstrap = function(namespaces, callback) {\n    goog.debugLoader_.bootstrap(namespaces, callback);\n  };\n}\n\n\n/**\n * @define {string} Trusted Types policy name. If non-empty then Closure will\n * use Trusted Types.\n */\ngoog.TRUSTED_TYPES_POLICY_NAME =\n    goog.define('goog.TRUSTED_TYPES_POLICY_NAME', '');\n\n\n/**\n * Returns the parameter.\n * @param {string} s\n * @return {string}\n * @private\n */\ngoog.identity_ = function(s) {\n  return s;\n};\n\n\n/**\n * Creates Trusted Types policy if Trusted Types are supported by the browser.\n * The policy just blesses any string as a Trusted Type. It is not visibility\n * restricted because anyone can also call TrustedTypes.createPolicy directly.\n * However, the allowed names should be restricted by a HTTP header and the\n * reference to the created policy should be visibility restricted.\n * @param {string} name\n * @return {?TrustedTypePolicy}\n */\ngoog.createTrustedTypesPolicy = function(name) {\n  var policy = null;\n  // TODO(koto): Remove window.TrustedTypes variant when the newer API ships.\n  var policyFactory = goog.global.trustedTypes || goog.global.TrustedTypes;\n  if (!policyFactory || !policyFactory.createPolicy) {\n    return policy;\n  }\n  // TrustedTypes.createPolicy throws if called with a name that is already\n  // registered, even in report-only mode. Until the API changes, catch the\n  // error not to break the applications functionally. In such case, the code\n  // will fall back to using regular Safe Types.\n  // TODO(koto): Remove catching once createPolicy API stops throwing.\n  try {\n    policy = policyFactory.createPolicy(name, {\n      createHTML: goog.identity_,\n      createScript: goog.identity_,\n      createScriptURL: goog.identity_,\n      createURL: goog.identity_\n    });\n  } catch (e) {\n    goog.logToConsole_(e.message);\n  }\n  return policy;\n};\n\n\n/** @private @const {?TrustedTypePolicy} */\ngoog.TRUSTED_TYPES_POLICY_ = goog.TRUSTED_TYPES_POLICY_NAME ?\n    goog.createTrustedTypesPolicy(goog.TRUSTED_TYPES_POLICY_NAME + '#base') :\n    null;\n","^J2",1579837703000,"^J3",["^J4",[]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/base.js"],"^JD",["^J4",["^IT"]],"^IR",true,"^IS",[]],["^ ","^IV",[1579837703000],"^IW","goog.debug.entrypointregistry.js","^IX",["^IY","goog/debug/entrypointregistry.js"],"^IZ","goog/debug/entrypointregistry.js","^I[","^J0","^J1","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A global registry for entry points into a program,\n * so that they can be instrumented. Each module should register their\n * entry points with this registry. Designed to be compiled out\n * if no instrumentation is requested.\n *\n * Entry points may be registered before or after a call to\n * goog.debug.entryPointRegistry.monitorAll. If an entry point is registered\n * later, the existing monitor will instrument the new entry point.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.provide('goog.debug.EntryPointMonitor');\ngoog.provide('goog.debug.entryPointRegistry');\n\ngoog.require('goog.asserts');\n\n\n\n/**\n * @interface\n */\ngoog.debug.EntryPointMonitor = function() {};\n\n\n/**\n * Instruments a function.\n *\n * @param {!Function} fn A function to instrument.\n * @return {!Function} The instrumented function.\n */\ngoog.debug.EntryPointMonitor.prototype.wrap;\n\n\n/**\n * Try to remove an instrumentation wrapper created by this monitor.\n * If the function passed to unwrap is not a wrapper created by this\n * monitor, then we will do nothing.\n *\n * Notice that some wrappers may not be unwrappable. For example, if other\n * monitors have applied their own wrappers, then it will be impossible to\n * unwrap them because their wrappers will have captured our wrapper.\n *\n * So it is important that entry points are unwrapped in the reverse\n * order that they were wrapped.\n *\n * @param {!Function} fn A function to unwrap.\n * @return {!Function} The unwrapped function, or `fn` if it was not\n *     a wrapped function created by this monitor.\n */\ngoog.debug.EntryPointMonitor.prototype.unwrap;\n\n\n/**\n * An array of entry point callbacks.\n * @type {!Array<function(!Function)>}\n * @private\n */\ngoog.debug.entryPointRegistry.refList_ = [];\n\n\n/**\n * Monitors that should wrap all the entry points.\n * @type {!Array<!goog.debug.EntryPointMonitor>}\n * @private\n */\ngoog.debug.entryPointRegistry.monitors_ = [];\n\n\n/**\n * Whether goog.debug.entryPointRegistry.monitorAll has ever been called.\n * Checking this allows the compiler to optimize out the registrations.\n * @type {boolean}\n * @private\n */\ngoog.debug.entryPointRegistry.monitorsMayExist_ = false;\n\n\n/**\n * Register an entry point with this module.\n *\n * The entry point will be instrumented when a monitor is passed to\n * goog.debug.entryPointRegistry.monitorAll. If this has already occurred, the\n * entry point is instrumented immediately.\n *\n * @param {function(!Function)} callback A callback function which is called\n *     with a transforming function to instrument the entry point. The callback\n *     is responsible for wrapping the relevant entry point with the\n *     transforming function.\n */\ngoog.debug.entryPointRegistry.register = function(callback) {\n  // Don't use push(), so that this can be compiled out.\n  goog.debug.entryPointRegistry\n      .refList_[goog.debug.entryPointRegistry.refList_.length] = callback;\n  // If no one calls monitorAll, this can be compiled out.\n  if (goog.debug.entryPointRegistry.monitorsMayExist_) {\n    var monitors = goog.debug.entryPointRegistry.monitors_;\n    for (var i = 0; i < monitors.length; i++) {\n      callback(goog.bind(monitors[i].wrap, monitors[i]));\n    }\n  }\n};\n\n\n/**\n * Configures a monitor to wrap all entry points.\n *\n * Entry points that have already been registered are immediately wrapped by\n * the monitor. When an entry point is registered in the future, it will also\n * be wrapped by the monitor when it is registered.\n *\n * @param {!goog.debug.EntryPointMonitor} monitor An entry point monitor.\n */\ngoog.debug.entryPointRegistry.monitorAll = function(monitor) {\n  goog.debug.entryPointRegistry.monitorsMayExist_ = true;\n  var transformer = goog.bind(monitor.wrap, monitor);\n  for (var i = 0; i < goog.debug.entryPointRegistry.refList_.length; i++) {\n    goog.debug.entryPointRegistry.refList_[i](transformer);\n  }\n  goog.debug.entryPointRegistry.monitors_.push(monitor);\n};\n\n\n/**\n * Try to unmonitor all the entry points that have already been registered. If\n * an entry point is registered in the future, it will not be wrapped by the\n * monitor when it is registered. Note that this may fail if the entry points\n * have additional wrapping.\n *\n * @param {!goog.debug.EntryPointMonitor} monitor The last monitor to wrap\n *     the entry points.\n * @throws {Error} If the monitor is not the most recently configured monitor.\n */\ngoog.debug.entryPointRegistry.unmonitorAllIfPossible = function(monitor) {\n  var monitors = goog.debug.entryPointRegistry.monitors_;\n  goog.asserts.assert(\n      monitor == monitors[monitors.length - 1],\n      'Only the most recent monitor can be unwrapped.');\n  var transformer = goog.bind(monitor.unwrap, monitor);\n  for (var i = 0; i < goog.debug.entryPointRegistry.refList_.length; i++) {\n    goog.debug.entryPointRegistry.refList_[i](transformer);\n  }\n  monitors.length--;\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/entrypointregistry.js"],"^JD",["^J4",["~$goog.debug.entryPointRegistry","~$goog.debug.EntryPointMonitor"]],"^IR",true,"^IS",["^IT","^JF"]],["^ ","^IV",[1579837703000],"^IW","goog.graphics.ellipseelement.js","^IX",["^IY","goog/graphics/ellipseelement.js"],"^IZ","goog/graphics/ellipseelement.js","^I[","^J0","^J1","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview A thin wrapper around the DOM element for ellipses.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.graphics.EllipseElement');\n\ngoog.require('goog.graphics.StrokeAndFillElement');\n\n\n\n/**\n * Interface for a graphics ellipse element.\n * You should not construct objects from this constructor. The graphics\n * will return an implementation of this interface for you.\n * @param {Element} element The DOM element to wrap.\n * @param {goog.graphics.AbstractGraphics} graphics The graphics creating\n *     this element.\n * @param {goog.graphics.Stroke?} stroke The stroke to use for this element.\n * @param {goog.graphics.Fill?} fill The fill to use for this element.\n * @constructor\n * @extends {goog.graphics.StrokeAndFillElement}\n * @deprecated goog.graphics is deprecated. It existed to abstract over browser\n *     differences before the canvas tag was widely supported.  See\n *     http://en.wikipedia.org/wiki/Canvas_element for details.\n */\ngoog.graphics.EllipseElement = function(element, graphics, stroke, fill) {\n  goog.graphics.StrokeAndFillElement.call(\n      this, element, graphics, stroke, fill);\n};\ngoog.inherits(goog.graphics.EllipseElement, goog.graphics.StrokeAndFillElement);\n\n\n/**\n * Update the center point of the ellipse.\n * @param {number} cx  Center X coordinate.\n * @param {number} cy  Center Y coordinate.\n */\ngoog.graphics.EllipseElement.prototype.setCenter = goog.abstractMethod;\n\n\n/**\n * Update the radius of the ellipse.\n * @param {number} rx  Radius length for the x-axis.\n * @param {number} ry  Radius length for the y-axis.\n */\ngoog.graphics.EllipseElement.prototype.setRadius = goog.abstractMethod;\n","^J2",1579837703000,"^J3",["^J4",["^IT","~$goog.graphics.StrokeAndFillElement"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/graphics/ellipseelement.js"],"^JD",["^J4",["~$goog.graphics.EllipseElement"]],"^IR",true,"^IS",["^IT","^ML"]],["^ ","^IV",[1579837703000],"^IW","goog.ui.twothumbslider.js","^IX",["^IY","goog/ui/twothumbslider.js"],"^IZ","goog/ui/twothumbslider.js","^I[","^J0","^J1","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Twothumbslider is a slider that allows to select a subrange\n * within a range by dragging two thumbs. The selected sub-range is exposed\n * through getValue() and getExtent().\n *\n * To decorate, the twothumbslider should be bound to an element with the class\n * name 'goog-twothumbslider-[vertical / horizontal]' containing children with\n * the classname 'goog-twothumbslider-value-thumb' and\n * 'goog-twothumbslider-extent-thumb', respectively.\n *\n * Decorate Example:\n * <div id=\"twothumbslider\" class=\"goog-twothumbslider-horizontal\">\n *   <div class=\"goog-twothumbslider-value-thumb\">\n *   <div class=\"goog-twothumbslider-extent-thumb\">\n * </div>\n * <script>\n *\n * var slider = new goog.ui.TwoThumbSlider;\n * slider.decorate(document.getElementById('twothumbslider'));\n *\n * TODO(user): add a11y once we know what this element is\n *\n * @see ../demos/twothumbslider.html\n */\n\ngoog.provide('goog.ui.TwoThumbSlider');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.ui.SliderBase');\n\n\n\n/**\n * This creates a TwoThumbSlider object.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.SliderBase}\n */\ngoog.ui.TwoThumbSlider = function(opt_domHelper) {\n  goog.ui.SliderBase.call(this, opt_domHelper);\n  this.rangeModel.setValue(this.getMinimum());\n  this.rangeModel.setExtent(this.getMaximum() - this.getMinimum());\n};\ngoog.inherits(goog.ui.TwoThumbSlider, goog.ui.SliderBase);\ngoog.tagUnsealableClass(goog.ui.TwoThumbSlider);\n\n\n/**\n * The prefix we use for the CSS class names for the slider and its elements.\n * @type {string}\n */\ngoog.ui.TwoThumbSlider.CSS_CLASS_PREFIX =\n    goog.getCssName('goog-twothumbslider');\n\n\n/**\n * CSS class name for the value thumb element.\n * @type {string}\n */\ngoog.ui.TwoThumbSlider.VALUE_THUMB_CSS_CLASS =\n    goog.getCssName(goog.ui.TwoThumbSlider.CSS_CLASS_PREFIX, 'value-thumb');\n\n\n/**\n * CSS class name for the extent thumb element.\n * @type {string}\n */\ngoog.ui.TwoThumbSlider.EXTENT_THUMB_CSS_CLASS =\n    goog.getCssName(goog.ui.TwoThumbSlider.CSS_CLASS_PREFIX, 'extent-thumb');\n\n\n/**\n * CSS class name for the range highlight element.\n * @type {string}\n */\ngoog.ui.TwoThumbSlider.RANGE_HIGHLIGHT_CSS_CLASS =\n    goog.getCssName(goog.ui.TwoThumbSlider.CSS_CLASS_PREFIX, 'rangehighlight');\n\n\n/**\n * @param {goog.ui.SliderBase.Orientation} orient orientation of the slider.\n * @return {string} The CSS class applied to the twothumbslider element.\n * @protected\n * @override\n */\ngoog.ui.TwoThumbSlider.prototype.getCssClass = function(orient) {\n  return orient == goog.ui.SliderBase.Orientation.VERTICAL ?\n      goog.getCssName(goog.ui.TwoThumbSlider.CSS_CLASS_PREFIX, 'vertical') :\n      goog.getCssName(goog.ui.TwoThumbSlider.CSS_CLASS_PREFIX, 'horizontal');\n};\n\n\n/**\n * This creates a thumb element with the specified CSS class name.\n * @param {string} cs  CSS class name of the thumb to be created.\n * @return {!HTMLDivElement} The created thumb element.\n * @private\n */\ngoog.ui.TwoThumbSlider.prototype.createThumb_ = function(cs) {\n  var thumb = this.getDomHelper().createDom(goog.dom.TagName.DIV, cs);\n  goog.a11y.aria.setRole(thumb, goog.a11y.aria.Role.BUTTON);\n  return /** @type {!HTMLDivElement} */ (thumb);\n};\n\n\n/**\n * Creates the thumb members for a twothumbslider. If the\n * element contains a child with a class name 'goog-twothumbslider-value-thumb'\n * (or 'goog-twothumbslider-extent-thumb', respectively), then that will be used\n * as the valueThumb (or as the extentThumb, respectively). If the element\n * contains a child with a class name 'goog-twothumbslider-rangehighlight',\n * then that will be used as the range highlight.\n * @override\n */\ngoog.ui.TwoThumbSlider.prototype.createThumbs = function() {\n  // find range highlight and thumbs\n  var valueThumb = goog.dom.getElementsByTagNameAndClass(\n      null, goog.ui.TwoThumbSlider.VALUE_THUMB_CSS_CLASS, this.getElement())[0];\n  var extentThumb = goog.dom.getElementsByTagNameAndClass(\n      null, goog.ui.TwoThumbSlider.EXTENT_THUMB_CSS_CLASS,\n      this.getElement())[0];\n  var rangeHighlight = goog.dom.getElementsByTagNameAndClass(\n      null, goog.ui.TwoThumbSlider.RANGE_HIGHLIGHT_CSS_CLASS,\n      this.getElement())[0];\n  if (!valueThumb) {\n    valueThumb =\n        this.createThumb_(goog.ui.TwoThumbSlider.VALUE_THUMB_CSS_CLASS);\n    this.getElement().appendChild(valueThumb);\n  }\n  if (!extentThumb) {\n    extentThumb =\n        this.createThumb_(goog.ui.TwoThumbSlider.EXTENT_THUMB_CSS_CLASS);\n    this.getElement().appendChild(extentThumb);\n  }\n  if (!rangeHighlight) {\n    rangeHighlight = this.getDomHelper().createDom(\n        goog.dom.TagName.DIV, goog.ui.TwoThumbSlider.RANGE_HIGHLIGHT_CSS_CLASS);\n    // Insert highlight before value thumb so that it renders under the thumbs.\n    this.getDomHelper().insertSiblingBefore(rangeHighlight, valueThumb);\n  }\n  this.valueThumb = /** @type {!HTMLDivElement} */ (valueThumb);\n  this.extentThumb = /** @type {!HTMLDivElement} */ (extentThumb);\n  this.rangeHighlight = /** @type {!HTMLDivElement} */ (rangeHighlight);\n};\n","^J2",1579837703000,"^J3",["^J4",["^JN","^KQ","^KR","^IT","~$goog.ui.SliderBase","^JT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/twothumbslider.js"],"^JD",["^J4",["~$goog.ui.TwoThumbSlider"]],"^IR",true,"^IS",["^IT","^KQ","^KR","^JN","^JT","^MN"]],["^ ","^IV",[1579837703000],"^L4",true,"^IW","goog.streams.full_native_impl.js","^IX",["^IY","goog/streams/full_native_impl.js"],"^IZ","goog/streams/full_native_impl.js","^I[","^J0","^J1","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A native implementation of the ponyfill.\n */\ngoog.module('goog.streams.fullNativeImpl');\n\nconst fullTypes = goog.require('goog.streams.fullTypes');\nconst liteNativeImpl = goog.require('goog.streams.liteNativeImpl');\n\n/**\n * The implemenation of ReadableStream.\n * @template T\n * @implements {fullTypes.ReadableStream<T>}\n */\nclass NativeReadableStream extends liteNativeImpl.NativeReadableStream {\n  /**\n   * @param {!ReadableStream} stream\n   */\n  constructor(stream) {\n    super(stream);\n\n    /**\n     * Returns an AsyncIterator over the ReadableStream.\n     * https://streams.spec.whatwg.org/#rs-asynciterator\n     * @return {!AsyncIterator<!IIterableResult<T>>}\n     */\n    this[Symbol.asyncIterator] = this.getIterator;\n  }\n\n  /**\n   * @return {!NativeReadableStreamDefaultReader}\n   * @override\n   */\n  getReader() {\n    return new NativeReadableStreamDefaultReader(\n        /** @type {!ReadableStreamDefaultReader} */ (this.stream.getReader()));\n  }\n\n  /** @override */\n  cancel(reason) {\n    return this.stream.cancel(reason);\n  }\n\n  /** @override */\n  getIterator(options = undefined) {\n    return this.stream.getIterator(options);\n  }\n\n  /** @override */\n  tee() {\n    return this.stream.tee().map((stream) => new NativeReadableStream(stream));\n  }\n}\n\n/**\n * @param {!fullTypes.ReadableStreamUnderlyingSource<T>=} underlyingSource\n * @param {!fullTypes.ReadableStreamStrategy<T>=} strategy\n * @return {!NativeReadableStream<T>}\n * @suppress {strictMissingProperties}\n * @template T\n */\nfunction newReadableStream(underlyingSource = {}, strategy = {}) {\n  /** @const {!ReadableStreamSource} */\n  const source = {};\n  if (underlyingSource.start) {\n    source.start = (controller) => {\n      return underlyingSource.start(\n          new NativeReadableStreamDefaultController(controller));\n    };\n  }\n  if (underlyingSource.pull) {\n    source.pull = (controller) => {\n      return underlyingSource.pull(\n          new NativeReadableStreamDefaultController(controller));\n    };\n  }\n  if (underlyingSource.cancel) {\n    source.cancel = underlyingSource.cancel;\n  }\n  const stream = new ReadableStream(source, strategy);\n  return new NativeReadableStream(stream);\n}\n\n/**\n * The DefaultReader for a ReadableStream.\n * @template T\n * @implements {fullTypes.ReadableStreamDefaultReader<T>}\n */\nclass NativeReadableStreamDefaultReader extends\n    liteNativeImpl.NativeReadableStreamDefaultReader {\n  /** @override */\n  cancel(reason) {\n    return /** @type {!Promise<undefined>} */ (this.reader.cancel(reason));\n  }\n}\n\n/**\n * @template T\n * @implements {fullTypes.ReadableStreamAsyncIterator<T>}\n */\nclass NativeReadableStreamAsyncIterator {\n  /**\n   * @param {!AsyncIterator<T>} iterator\n   */\n  constructor(iterator) {\n    /** @private @const {!AsyncIterator<T>} */\n    this.iterator_ = iterator;\n  }\n\n  /** @override */\n  next() {\n    return this.iterator_.next();\n  }\n\n  /** @override */\n  return(value) {\n    return /** @type {{return: function(*): !Promise<!IIterableResult<T>>}} */ (\n               this.iterator_)\n        .return(value);\n  }\n}\n\n/**\n * The controller for a ReadableStream. Adds cancellation and backpressure.\n * @template T\n * @implements {fullTypes.ReadableStreamDefaultController<T>}\n */\nclass NativeReadableStreamDefaultController extends\n    liteNativeImpl.NativeReadableStreamDefaultController {\n  /** @override */\n  get desiredSize() {\n    return this.controller.desiredSize;\n  }\n}\n\nexports = {\n  NativeReadableStream,\n  NativeReadableStreamAsyncIterator,\n  NativeReadableStreamDefaultController,\n  NativeReadableStreamDefaultReader,\n  newReadableStream,\n};\n","^J2",1579837703000,"^J3",["^J4",["^IT","~$goog.streams.liteNativeImpl","~$goog.streams.fullTypes"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/streams/full_native_impl.js"],"^JD",["^J4",["~$goog.streams.fullNativeImpl"]],"^IR",true,"^IS",["^IT","^MQ","^MP"]],["^ ","^IV",[1579837703000],"^IW","goog.db.objectstore.js","^IX",["^IY","goog/db/objectstore.js"],"^IZ","goog/db/objectstore.js","^I[","^J0","^J1","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Wrapper for an IndexedDB object store.\n *\n */\n\n\ngoog.provide('goog.db.ObjectStore');\n\ngoog.require('goog.async.Deferred');\ngoog.require('goog.db.Cursor');\ngoog.require('goog.db.Error');\ngoog.require('goog.db.Index');\ngoog.require('goog.db.KeyRange');\ngoog.require('goog.debug');\n\n\n\n/**\n * Creates an IDBObjectStore wrapper object. Object stores have methods for\n * storing and retrieving records, and are accessed through a transaction\n * object. They also have methods for creating indexes associated with the\n * object store. They can only be created when setting the version of the\n * database. Should not be created directly, access object stores through\n * transactions.\n * @see goog.db.UpgradeNeededCallback\n * @see goog.db.Transaction#objectStore\n *\n * @param {!IDBObjectStore} store The backing IndexedDb object.\n * @constructor\n * @final\n *\n * TODO(arthurhsu): revisit msg in exception and errors in this class. In newer\n *     Chrome (v22+) the error/request come with a DOM error string that is\n *     already very descriptive.\n */\ngoog.db.ObjectStore = function(store) {\n  /**\n   * Underlying IndexedDB object store object.\n   *\n   * @type {!IDBObjectStore}\n   * @private\n   */\n  this.store_ = store;\n};\n\n\n/**\n * @return {string} The name of the object store.\n */\ngoog.db.ObjectStore.prototype.getName = function() {\n  return this.store_.name;\n};\n\n\n/**\n * Helper function for put and add.\n *\n * @param {string} fn Function name to call on the object store.\n * @param {string} msg Message to give to the error.\n * @param {*} value Value to insert into the object store.\n * @param {IDBKeyType=} opt_key The key to use.\n * @return {!goog.async.Deferred} The resulting deferred request.\n * @private\n */\ngoog.db.ObjectStore.prototype.insert_ = function(fn, msg, value, opt_key) {\n  // TODO(user): refactor wrapping an IndexedDB request in a Deferred by\n  // creating a higher-level abstraction for it (mostly affects here and\n  // goog.db.Index)\n  var d = new goog.async.Deferred();\n  var request;\n  try {\n    // put or add with (value, undefined) throws an error, so we need to check\n    // for undefined ourselves\n    if (opt_key) {\n      request = this.store_[fn](value, opt_key);\n    } else {\n      request = this.store_[fn](value);\n    }\n  } catch (ex) {\n    msg += goog.debug.deepExpose(value);\n    if (opt_key) {\n      msg += ', with key ' + goog.debug.deepExpose(opt_key);\n    }\n    d.errback(goog.db.Error.fromException(ex, msg));\n    return d;\n  }\n  request.onsuccess = function(ev) {\n    d.callback(ev.target.result);\n  };\n  request.onerror = function(ev) {\n    msg += goog.debug.deepExpose(value);\n    if (opt_key) {\n      msg += ', with key ' + goog.debug.deepExpose(opt_key);\n    }\n    d.errback(goog.db.Error.fromRequest(ev.target, msg));\n  };\n  return d;\n};\n\n\n/**\n * Adds an object to the object store. Replaces existing objects with the\n * same key.\n *\n * @param {*} value The value to put.\n * @param {IDBKeyType=} opt_key The key to use. Cannot be used if the\n *     keyPath was specified for the object store. If the keyPath was not\n *     specified but autoIncrement was not enabled, it must be used.\n * @return {!goog.async.Deferred} The deferred put request.\n */\ngoog.db.ObjectStore.prototype.put = function(value, opt_key) {\n  return this.insert_(\n      'put', 'putting into ' + this.getName() + ' with value', value, opt_key);\n};\n\n\n/**\n * Adds an object to the object store. Requires that there is no object with\n * the same key already present.\n *\n * @param {*} value The value to add.\n * @param {IDBKeyType=} opt_key The key to use. Cannot be used if the\n *     keyPath was specified for the object store. If the keyPath was not\n *     specified but autoIncrement was not enabled, it must be used.\n * @return {!goog.async.Deferred} The deferred add request.\n */\ngoog.db.ObjectStore.prototype.add = function(value, opt_key) {\n  return this.insert_(\n      'add', 'adding into ' + this.getName() + ' with value ', value, opt_key);\n};\n\n\n/**\n * Removes an object from the store. No-op if there is no object present with\n * the given key.\n *\n * @param {IDBKeyType|!goog.db.KeyRange} keyOrRange The key or range to remove\n *     objects under.\n * @return {!goog.async.Deferred} The deferred remove request.\n */\ngoog.db.ObjectStore.prototype.remove = function(keyOrRange) {\n  var d = new goog.async.Deferred();\n  var request;\n  try {\n    request = this.store_['delete'](\n        keyOrRange instanceof goog.db.KeyRange ? keyOrRange.range() :\n                                                 keyOrRange);\n  } catch (err) {\n    var msg = 'removing from ' + this.getName() + ' with key ' +\n        goog.debug.deepExpose(keyOrRange);\n    d.errback(goog.db.Error.fromException(err, msg));\n    return d;\n  }\n  request.onsuccess = function(ev) { d.callback(); };\n  var self = this;\n  request.onerror = function(ev) {\n    var msg = 'removing from ' + self.getName() + ' with key ' +\n        goog.debug.deepExpose(keyOrRange);\n    d.errback(goog.db.Error.fromRequest(ev.target, msg));\n  };\n  return d;\n};\n\n\n/**\n * Gets an object from the store. If no object is present with that key\n * the result is `undefined`.\n *\n * @param {IDBKeyType} key The key to look up.\n * @return {!goog.async.Deferred} The deferred get request.\n */\ngoog.db.ObjectStore.prototype.get = function(key) {\n  var d = new goog.async.Deferred();\n  var request;\n  try {\n    request = this.store_.get(key);\n  } catch (err) {\n    var msg = 'getting from ' + this.getName() + ' with key ' +\n        goog.debug.deepExpose(key);\n    d.errback(goog.db.Error.fromException(err, msg));\n    return d;\n  }\n  request.onsuccess = function(ev) { d.callback(ev.target.result); };\n  var self = this;\n  request.onerror = function(ev) {\n    var msg = 'getting from ' + self.getName() + ' with key ' +\n        goog.debug.deepExpose(key);\n    d.errback(goog.db.Error.fromRequest(ev.target, msg));\n  };\n  return d;\n};\n\n\n/**\n * Returns the values matching `opt_key` up to `opt_count`.\n *\n * If `obt_key` is a `KeyRange`, returns all keys in that range. If it is\n * `undefined`, returns all known keys.\n *\n * @param {!IDBKeyType|!goog.db.KeyRange=} opt_key Key or KeyRange to look up in\n *     the index.\n * @param {number=} opt_count The number records to return\n * @return {!goog.async.Deferred} A deferred array of objects that match the\n *     key.\n */\ngoog.db.ObjectStore.prototype.getAll = function(opt_key, opt_count) {\n  return this.getAllInternal_(\n      'getAll', 'getting all from index ' + this.getName(), opt_key, opt_count);\n};\n\n\n/**\n * Returns the keys matching `opt_key` up to `opt_count`.\n *\n * If `obt_key` is a `KeyRange`, returns all keys in that range. If it is\n * `undefined`, returns all known keys.\n *\n * @param {!IDBKeyType|!goog.db.KeyRange=} opt_key Key or KeyRange to look up in\n *     the index.\n * @param {number=} opt_count The number records to return\n * @return {!goog.async.Deferred} A deferred array of keys for objects that\n *     match the key.\n */\ngoog.db.ObjectStore.prototype.getAllKeys = function(opt_key, opt_count) {\n  return this.getAllInternal_(\n      'getAllKeys', 'getting all keys index ' + this.getName(), opt_key,\n      opt_count);\n};\n\n/**\n * Helper function for native `getAll` and `getAllKeys` on `IDBObjectStore` that\n * takes in `IDBKeyRange` as params.\n *\n * Returns the result of the native method in a `Deferred` object.\n *\n * @param {string} fn Function name to call on the index to get the request.\n * @param {string} msg Message to give to the error.\n * @param {!IDBKeyType|!goog.db.KeyRange|undefined} keyOrRange\n *     Key or KeyRange to look up in the index.\n * @param {number|undefined} count The number records to return\n * @return {!goog.async.Deferred} The resulting deferred array of objects.\n * @private\n */\ngoog.db.ObjectStore.prototype.getAllInternal_ = function(\n    fn, msg, keyOrRange, count) {\n  var nativeRange;\n  if (keyOrRange === undefined) {\n    nativeRange = undefined;\n  } else if (keyOrRange instanceof goog.db.KeyRange) {\n    nativeRange = keyOrRange.range();\n  } else {\n    nativeRange = goog.db.KeyRange.only(keyOrRange).range();\n  }\n\n  var d = new goog.async.Deferred();\n  var request;\n  try {\n    request = this.store_[fn](nativeRange, count);\n  } catch (err) {\n    msg += ' for range ' +\n        (nativeRange ? goog.debug.deepExpose(nativeRange) : '<all>');\n    d.errback(goog.db.Error.fromException(err, msg));\n    return d;\n  }\n  request.onsuccess = function() {\n    d.callback(request.result);\n  };\n  request.onerror = function(ev) {\n    msg += ' for range ' +\n        (nativeRange ? goog.debug.deepExpose(nativeRange) : '<all>');\n    d.errback(goog.db.Error.fromRequest(ev.target, msg));\n  };\n  return d;\n};\n\n/**\n * Opens a cursor over the specified key range. Returns a cursor object which is\n * able to iterate over the given range.\n *\n * Example usage:\n *\n * <code>\n *  var cursor = objectStore.openCursor(goog.db.Range.bound('a', 'c'));\n *\n *  var key = goog.events.listen(\n *      cursor, goog.db.Cursor.EventType.NEW_DATA, function() {\n *    // Do something with data.\n *    cursor.next();\n *  });\n *\n *  goog.events.listenOnce(\n *      cursor, goog.db.Cursor.EventType.COMPLETE, function() {\n *    // Clean up listener, and perform a finishing operation on the data.\n *    goog.events.unlistenByKey(key);\n *  });\n * </code>\n *\n * @param {!goog.db.KeyRange=} opt_range The key range. If undefined iterates\n *     over the whole object store.\n * @param {!goog.db.Cursor.Direction=} opt_direction The direction. If undefined\n *     moves in a forward direction with duplicates.\n * @return {!goog.db.Cursor} The cursor.\n * @throws {goog.db.Error} If there was a problem opening the cursor.\n */\ngoog.db.ObjectStore.prototype.openCursor = function(opt_range, opt_direction) {\n  return goog.db.Cursor.openCursor(this.store_, opt_range, opt_direction);\n};\n\n\n/**\n * Deletes all objects from the store.\n *\n * @return {!goog.async.Deferred} The deferred clear request.\n */\ngoog.db.ObjectStore.prototype.clear = function() {\n  var msg = 'clearing store ' + this.getName();\n  var d = new goog.async.Deferred();\n  var request;\n  try {\n    request = this.store_.clear();\n  } catch (err) {\n    d.errback(goog.db.Error.fromException(err, msg));\n    return d;\n  }\n  request.onsuccess = function(ev) { d.callback(); };\n  request.onerror = function(ev) {\n    d.errback(goog.db.Error.fromRequest(ev.target, msg));\n  };\n  return d;\n};\n\n\n/**\n * Creates an index in this object store. Can only be called inside a\n * {@link goog.db.UpgradeNeededCallback}.\n *\n * @param {string} name Name of the index to create.\n * @param {string|!Array<string>} keyPath Attribute or array of attributes to\n *     index on.\n * @param {!Object=} opt_parameters Optional parameters object. The only\n *     available option is unique, which defaults to false. If unique is true,\n *     the index will enforce that there is only ever one object in the object\n *     store for each unique value it indexes on.\n * @return {!goog.db.Index} The newly created, wrapped index.\n * @throws {goog.db.Error} In case of an error creating the index.\n */\ngoog.db.ObjectStore.prototype.createIndex = function(\n    name, keyPath, opt_parameters) {\n  try {\n    return new goog.db.Index(\n        this.store_.createIndex(name, keyPath, opt_parameters));\n  } catch (ex) {\n    var msg = 'creating new index ' + name + ' with key path ' + keyPath;\n    throw goog.db.Error.fromException(ex, msg);\n  }\n};\n\n\n/**\n * Gets an index.\n *\n * @param {string} name Name of the index to fetch.\n * @return {!goog.db.Index} The requested wrapped index.\n * @throws {goog.db.Error} In case of an error getting the index.\n */\ngoog.db.ObjectStore.prototype.getIndex = function(name) {\n  try {\n    return new goog.db.Index(this.store_.index(name));\n  } catch (ex) {\n    var msg = 'getting index ' + name;\n    throw goog.db.Error.fromException(ex, msg);\n  }\n};\n\n\n/**\n * Deletes an index from the object store. Can only be called inside a\n * {@link goog.db.UpgradeNeededCallback}.\n *\n * @param {string} name Name of the index to delete.\n * @throws {goog.db.Error} In case of an error deleting the index.\n */\ngoog.db.ObjectStore.prototype.deleteIndex = function(name) {\n  try {\n    this.store_.deleteIndex(name);\n  } catch (ex) {\n    var msg = 'deleting index ' + name;\n    throw goog.db.Error.fromException(ex, msg);\n  }\n};\n\n\n/**\n * Gets number of records within a key range.\n *\n * @param {!goog.db.KeyRange=} opt_range The key range. If undefined, this will\n *     count all records in the object store.\n * @return {!goog.async.Deferred} The deferred number of records.\n */\ngoog.db.ObjectStore.prototype.count = function(opt_range) {\n  var d = new goog.async.Deferred();\n\n  try {\n    var range = opt_range ? opt_range.range() : null;\n    var request = this.store_.count(range);\n    request.onsuccess = function(ev) { d.callback(ev.target.result); };\n    var self = this;\n    request.onerror = function(ev) {\n      d.errback(goog.db.Error.fromRequest(ev.target, self.getName()));\n    };\n  } catch (ex) {\n    d.errback(goog.db.Error.fromException(ex, this.getName()));\n  }\n\n  return d;\n};\n","^J2",1579837703000,"^J3",["^J4",["~$goog.db.Error","~$goog.db.Index","^IT","~$goog.debug","~$goog.db.Cursor","~$goog.db.KeyRange","~$goog.async.Deferred"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/db/objectstore.js"],"^JD",["^J4",["~$goog.db.ObjectStore"]],"^IR",true,"^IS",["^IT","^MX","^MV","^MS","^MT","^MW","^MU"]],["^ ","^IV",[1579837703000],"^IW","goog.datasource.jsxmlhttpdatasource.js","^IX",["^IY","goog/datasource/jsxmlhttpdatasource.js"],"^IZ","goog/datasource/jsxmlhttpdatasource.js","^I[","^J0","^J1","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview\n * DataSource implementation that uses XMLHttpRequest as transport, with\n * response as valid JSON.\n *\n * Response can have unexecutable starting/ending text to prevent inclusion\n * using <script src=\"...\">\n *\n */\n\n\ngoog.provide('goog.ds.JsXmlHttpDataSource');\n\ngoog.require('goog.Uri');\ngoog.require('goog.ds.DataManager');\ngoog.require('goog.ds.FastDataNode');\ngoog.require('goog.ds.LoadState');\ngoog.require('goog.ds.logger');\ngoog.require('goog.events');\ngoog.require('goog.log');\ngoog.require('goog.net.EventType');\ngoog.require('goog.net.XhrIo');\n\n\n\n/**\n * Similar to JsonDataSource, with using XMLHttpRequest for transport\n * Currently requires the result be a valid JSON.\n *\n * @param {(string|goog.Uri)} uri URI for the request.\n * @param {string} name Name of the datasource.\n * @param {string=} opt_startText Text to expect/strip before JS response.\n * @param {string=} opt_endText Text to expect/strip after JS response.\n * @param {boolean=} opt_usePost If true, use POST. Defaults to false (GET).\n *\n * @extends {goog.ds.FastDataNode}\n * @constructor\n * @final\n */\ngoog.ds.JsXmlHttpDataSource = function(\n    uri, name, opt_startText, opt_endText, opt_usePost) {\n  goog.ds.FastDataNode.call(this, {}, name, null);\n  if (uri) {\n    this.uri_ = new goog.Uri(uri);\n    this.xhr_ = new goog.net.XhrIo();\n    this.usePost_ = !!opt_usePost;\n\n    goog.events.listen(\n        this.xhr_, goog.net.EventType.COMPLETE, this.completed_, false, this);\n  } else {\n    this.uri_ = null;\n  }\n  this.startText_ = opt_startText;\n  this.endText_ = opt_endText;\n};\ngoog.inherits(goog.ds.JsXmlHttpDataSource, goog.ds.FastDataNode);\n\n\n/**\n * Delimiter for start of JSON data in response.\n * null = starts at first character of response\n * @type {string|undefined}\n * @private\n */\ngoog.ds.JsXmlHttpDataSource.prototype.startText_;\n\n\n/**\n * Delimiter for end of JSON data in response.\n * null = ends at last character of response\n * @type {string|undefined}\n * @private\n */\ngoog.ds.JsXmlHttpDataSource.prototype.endText_;\n\n\n/**\n * Gets the state of the backing data for this node\n * @return {goog.ds.LoadState} The state.\n * @override\n */\ngoog.ds.JsXmlHttpDataSource.prototype.getLoadState = function() {\n  return this.loadState_;\n};\n\n\n/**\n * Sets the request data. This can be used if it is required to\n * send a specific body rather than build the body from the query\n * parameters. Only used in POST requests.\n * @param {string} data The data to send in the request body.\n */\ngoog.ds.JsXmlHttpDataSource.prototype.setQueryData = function(data) {\n  this.queryData_ = data;\n};\n\n\n/**\n * Load or reload the backing data for this node.\n * Fires the JsonDataSource\n * @override\n */\ngoog.ds.JsXmlHttpDataSource.prototype.load = function() {\n  goog.log.info(\n      goog.ds.logger, 'Sending JS request for DataSource ' +\n          this.getDataName() + ' to ' + this.uri_);\n\n  if (this.uri_) {\n    if (this.usePost_) {\n      var queryData;\n      if (!this.queryData_) {\n        queryData = this.uri_.getQueryData().toString();\n      } else {\n        queryData = this.queryData_;\n      }\n\n      var uriNoQuery = this.uri_.clone();\n      uriNoQuery.setQueryData(null);\n      this.xhr_.send(String(uriNoQuery), 'POST', queryData);\n    } else {\n      this.xhr_.send(String(this.uri_));\n    }\n  } else {\n    this.loadState_ = goog.ds.LoadState.NOT_LOADED;\n  }\n};\n\n\n/**\n * Called on successful request.\n * @private\n */\ngoog.ds.JsXmlHttpDataSource.prototype.success_ = function() {\n  goog.ds.DataManager.getInstance().fireDataChange(this.getDataName());\n};\n\n\n/**\n * Completed callback. Loads data if successful, otherwise sets\n * state to FAILED\n * @param {goog.events.Event} e Event object, Xhr is target.\n * @private\n */\ngoog.ds.JsXmlHttpDataSource.prototype.completed_ = function(e) {\n  if (this.xhr_.isSuccess()) {\n    goog.log.info(\n        goog.ds.logger, 'Got data for DataSource ' + this.getDataName());\n    var text = this.xhr_.getResponseText();\n\n    // Look for start and end token and trim text\n    if (this.startText_) {\n      var startpos = text.indexOf(this.startText_);\n      text = text.substring(startpos + this.startText_.length);\n    }\n    if (this.endText_) {\n      var endpos = text.lastIndexOf(this.endText_);\n      text = text.substring(0, endpos);\n    }\n\n    // Parse result.\n\n    try {\n      var jsonObj = /** @type {!Object} */ (JSON.parse(text));\n      this.extendWith(jsonObj);\n      this.loadState_ = goog.ds.LoadState.LOADED;\n    } catch (ex) {\n      // Invalid JSON.\n      this.loadState_ = goog.ds.LoadState.FAILED;\n      goog.log.error(goog.ds.logger, 'Failed to parse data: ' + ex.message);\n    }\n\n    // Call on a timer to avoid threading issues on IE.\n    goog.global.setTimeout(goog.bind(this.success_, this), 0);\n  } else {\n    goog.log.info(\n        goog.ds.logger,\n        'Data retrieve failed for DataSource ' + this.getDataName());\n    this.loadState_ = goog.ds.LoadState.FAILED;\n  }\n};\n","^J2",1579837703000,"^J3",["^J4",["^LH","~$goog.net.XhrIo","^K=","^IT","^LG","~$goog.ds.DataManager","~$goog.net.EventType","^LN","^M4","~$goog.ds.FastDataNode"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/datasource/jsxmlhttpdatasource.js"],"^JD",["^J4",["~$goog.ds.JsXmlHttpDataSource"]],"^IR",true,"^IS",["^IT","^K=","^M[","^N1","^LN","^LH","^M4","^LG","^N0","^MZ"]],["^ ","^IV",[1579837703000],"^IW","goog.structs.node.js","^IX",["^IY","goog/structs/node.js"],"^IZ","goog/structs/node.js","^I[","^J0","^J1","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Generic immutable node object to be used in collections.\n *\n */\n\n\ngoog.provide('goog.structs.Node');\n\n\n\n/**\n * A generic immutable node. This can be used in various collections that\n * require a node object for its item (such as a heap).\n * @param {K} key Key.\n * @param {V} value Value.\n * @constructor\n * @template K, V\n */\ngoog.structs.Node = function(key, value) {\n  /**\n   * The key.\n   * @private {K}\n   */\n  this.key_ = key;\n\n  /**\n   * The value.\n   * @private {V}\n   */\n  this.value_ = value;\n};\n\n\n/**\n * Gets the key.\n * @return {K} The key.\n */\ngoog.structs.Node.prototype.getKey = function() {\n  return this.key_;\n};\n\n\n/**\n * Gets the value.\n * @return {V} The value.\n */\ngoog.structs.Node.prototype.getValue = function() {\n  return this.value_;\n};\n\n\n/**\n * Clones a node and returns a new node.\n * @return {!goog.structs.Node<K, V>} A new goog.structs.Node with the same\n *     key value pair.\n */\ngoog.structs.Node.prototype.clone = function() {\n  return new goog.structs.Node(this.key_, this.value_);\n};\n","^J2",1579837703000,"^J3",["^J4",["^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/node.js"],"^JD",["^J4",["~$goog.structs.Node"]],"^IR",true,"^IS",["^IT"]],["^ ","^IV",[1579837703000],"^IW","goog.dom.pattern.pattern.js","^IX",["^IY","goog/dom/pattern/pattern.js"],"^IZ","goog/dom/pattern/pattern.js","^I[","^J0","^J1","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview DOM patterns.  Allows for description of complex DOM patterns\n * using regular expression like constructs.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.pattern');\ngoog.provide('goog.dom.pattern.MatchType');\n\n\n/**\n * Utility function to match a string against either a string or a regular\n * expression.\n *\n * @param {string|RegExp} obj Either a string or a regular expression.\n * @param {string} str The string to match.\n * @return {boolean} Whether the strings are equal, or if the string matches\n *     the regular expression.\n */\ngoog.dom.pattern.matchStringOrRegex = function(obj, str) {\n  if (typeof obj === 'string') {\n    // Match a string\n    return str == obj;\n  } else {\n    // Match a regular expression\n    return !!(str && str.match(obj));\n  }\n};\n\n\n/**\n * Utility function to match a DOM attribute against either a string or a\n * regular expression.  Conforms to the interface spec for\n * {@link goog.object#every}.\n *\n * @param {string|RegExp} elem Either a string or a regular expression.\n * @param {string} index The attribute name to match.\n * @param {Object} orig The original map of matches to test.\n * @return {boolean} Whether the strings are equal, or if the attribute matches\n *     the regular expression.\n * @this {Element} Called using goog.object every on an Element.\n */\ngoog.dom.pattern.matchStringOrRegexMap = function(elem, index, orig) {\n  return goog.dom.pattern.matchStringOrRegex(\n      elem, index in this ?\n          this[index] :\n          (this.getAttribute ? this.getAttribute(index) : null));\n};\n\n\n/**\n * When matched to a token, a pattern may return any of the following statuses:\n *  <ol>\n *    <li><code>NO_MATCH</code> - The pattern does not match.  This is the only\n *      value that evaluates to <code>false</code> in a boolean context.\n *    <li><code>MATCHING</code> - The token is part of an incomplete match.\n *    <li><code>MATCH</code> - The token completes a match.\n *    <li><code>BACKTRACK_MATCH</code> - The token does not match, but indicates\n *      the end of a repetitive match.  For instance, in regular expressions,\n *      the pattern <code>/a+/</code> would match <code>'aaaaaaaab'</code>.\n *      Every <code>'a'</code> token would give a status of\n *      <code>MATCHING</code> while the <code>'b'</code> token would give a\n *      status of <code>BACKTRACK_MATCH</code>.\n *  </ol>\n * @enum {number}\n */\ngoog.dom.pattern.MatchType = {\n  NO_MATCH: 0,\n  MATCHING: 1,\n  MATCH: 2,\n  BACKTRACK_MATCH: 3\n};\n","^J2",1579837703000,"^J3",["^J4",["^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/pattern/pattern.js"],"^JD",["^J4",["~$goog.dom.pattern","~$goog.dom.pattern.MatchType"]],"^IR",true,"^IS",["^IT"]],["^ ","^IV",[1579837703000],"^IW","goog.testing.ui.rendererasserts.js","^IX",["^IY","goog/testing/ui/rendererasserts.js"],"^IZ","goog/testing/ui/rendererasserts.js","^I[","^J0","^J1","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Additional asserts for testing ControlRenderers.\n *\n * @author mkretzschmar@google.com (Martin Kretzschmar)\n */\n\ngoog.setTestOnly('goog.testing.ui.rendererasserts');\ngoog.provide('goog.testing.ui.rendererasserts');\n\ngoog.require('goog.testing.asserts');\ngoog.require('goog.ui.ControlRenderer');\n\n\n/**\n * Assert that a control renderer constructor doesn't call getCssClass.\n *\n * @param {function(new:goog.ui.ControlRenderer)} rendererClassUnderTest The\n *     renderer constructor to test.\n */\ngoog.testing.ui.rendererasserts.assertNoGetCssClassCallsInConstructor =\n    function(rendererClassUnderTest) {\n  var getCssClassCalls = 0;\n\n  /**\n   * @constructor\n   * @extends {goog.ui.ControlRenderer}\n   * @final\n   */\n  function TestControlRenderer() { rendererClassUnderTest.call(this); }\n  goog.inherits(TestControlRenderer, rendererClassUnderTest);\n\n  /** @override */\n  TestControlRenderer.prototype.getCssClass = function() {\n    getCssClassCalls++;\n    return TestControlRenderer.superClass_.getCssClass.call(this);\n  };\n\n  // Looking for the side-effects caused by the construction here:\n  new TestControlRenderer();\n\n  assertEquals(\n      'Constructors should not call getCssClass, ' +\n          'getCustomRenderer must be able to override it post construction.',\n      0, getCssClassCalls);\n};\n","^J2",1579837703000,"^J3",["^J4",["^KE","^IT","^KT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/ui/rendererasserts.js"],"^JD",["^J4",["~$goog.testing.ui.rendererasserts"]],"^IR",true,"^IS",["^IT","^KE","^KT"]],["^ ","^IV",[1579837703000],"^IW","goog.events.eventtype.js","^IX",["^IY","goog/events/eventtype.js"],"^IZ","goog/events/eventtype.js","^I[","^J0","^J1","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Event Types.\n *\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.events.EventType');\ngoog.provide('goog.events.MouseAsMouseEventType');\ngoog.provide('goog.events.MouseEvents');\ngoog.provide('goog.events.PointerAsMouseEventType');\ngoog.provide('goog.events.PointerAsTouchEventType');\ngoog.provide('goog.events.PointerFallbackEventType');\ngoog.provide('goog.events.PointerTouchFallbackEventType');\n\ngoog.require('goog.events.BrowserFeature');\ngoog.require('goog.userAgent');\n\n\n/**\n * Returns a prefixed event name for the current browser.\n * @param {string} eventName The name of the event.\n * @return {string} The prefixed event name.\n * @suppress {missingRequire|missingProvide}\n * @private\n */\ngoog.events.getVendorPrefixedName_ = function(eventName) {\n  return goog.userAgent.WEBKIT ?\n      'webkit' + eventName :\n      (goog.userAgent.OPERA ? 'o' + eventName.toLowerCase() :\n                              eventName.toLowerCase());\n};\n\n\n/**\n * Constants for event names.\n * @enum {string}\n */\ngoog.events.EventType = {\n  // Mouse events\n  CLICK: 'click',\n  RIGHTCLICK: 'rightclick',\n  DBLCLICK: 'dblclick',\n  AUXCLICK: 'auxclick',\n  MOUSEDOWN: 'mousedown',\n  MOUSEUP: 'mouseup',\n  MOUSEOVER: 'mouseover',\n  MOUSEOUT: 'mouseout',\n  MOUSEMOVE: 'mousemove',\n  MOUSEENTER: 'mouseenter',\n  MOUSELEAVE: 'mouseleave',\n\n  // Non-existent event; will never fire. This exists as a mouse counterpart to\n  // POINTERCANCEL.\n  MOUSECANCEL: 'mousecancel',\n\n  // Selection events.\n  // https://www.w3.org/TR/selection-api/\n  SELECTIONCHANGE: 'selectionchange',\n  SELECTSTART: 'selectstart',  // IE, Safari, Chrome\n\n  // Wheel events\n  // http://www.w3.org/TR/DOM-Level-3-Events/#events-wheelevents\n  WHEEL: 'wheel',\n\n  // Key events\n  KEYPRESS: 'keypress',\n  KEYDOWN: 'keydown',\n  KEYUP: 'keyup',\n\n  // Focus\n  BLUR: 'blur',\n  FOCUS: 'focus',\n  DEACTIVATE: 'deactivate',  // IE only\n  FOCUSIN: 'focusin',\n  FOCUSOUT: 'focusout',\n\n  // Forms\n  CHANGE: 'change',\n  RESET: 'reset',\n  SELECT: 'select',\n  SUBMIT: 'submit',\n  INPUT: 'input',\n  PROPERTYCHANGE: 'propertychange',  // IE only\n\n  // Drag and drop\n  DRAGSTART: 'dragstart',\n  DRAG: 'drag',\n  DRAGENTER: 'dragenter',\n  DRAGOVER: 'dragover',\n  DRAGLEAVE: 'dragleave',\n  DROP: 'drop',\n  DRAGEND: 'dragend',\n\n  // Touch events\n  // Note that other touch events exist, but we should follow the W3C list here.\n  // http://www.w3.org/TR/touch-events/#list-of-touchevent-types\n  TOUCHSTART: 'touchstart',\n  TOUCHMOVE: 'touchmove',\n  TOUCHEND: 'touchend',\n  TOUCHCANCEL: 'touchcancel',\n\n  // Misc\n  BEFOREUNLOAD: 'beforeunload',\n  CONSOLEMESSAGE: 'consolemessage',\n  CONTEXTMENU: 'contextmenu',\n  DEVICECHANGE: 'devicechange',\n  DEVICEMOTION: 'devicemotion',\n  DEVICEORIENTATION: 'deviceorientation',\n  DOMCONTENTLOADED: 'DOMContentLoaded',\n  ERROR: 'error',\n  HELP: 'help',\n  LOAD: 'load',\n  LOSECAPTURE: 'losecapture',\n  ORIENTATIONCHANGE: 'orientationchange',\n  READYSTATECHANGE: 'readystatechange',\n  RESIZE: 'resize',\n  SCROLL: 'scroll',\n  UNLOAD: 'unload',\n\n  // Media events\n  CANPLAY: 'canplay',\n  CANPLAYTHROUGH: 'canplaythrough',\n  DURATIONCHANGE: 'durationchange',\n  EMPTIED: 'emptied',\n  ENDED: 'ended',\n  LOADEDDATA: 'loadeddata',\n  LOADEDMETADATA: 'loadedmetadata',\n  PAUSE: 'pause',\n  PLAY: 'play',\n  PLAYING: 'playing',\n  PROGRESS: 'progress',\n  RATECHANGE: 'ratechange',\n  SEEKED: 'seeked',\n  SEEKING: 'seeking',\n  STALLED: 'stalled',\n  SUSPEND: 'suspend',\n  TIMEUPDATE: 'timeupdate',\n  VOLUMECHANGE: 'volumechange',\n  WAITING: 'waiting',\n\n  // Media Source Extensions events\n  // https://www.w3.org/TR/media-source/#mediasource-events\n  SOURCEOPEN: 'sourceopen',\n  SOURCEENDED: 'sourceended',\n  SOURCECLOSED: 'sourceclosed',\n  // https://www.w3.org/TR/media-source/#sourcebuffer-events\n  ABORT: 'abort',\n  UPDATE: 'update',\n  UPDATESTART: 'updatestart',\n  UPDATEEND: 'updateend',\n\n  // HTML 5 History events\n  // See http://www.w3.org/TR/html5/browsers.html#event-definitions-0\n  HASHCHANGE: 'hashchange',\n  PAGEHIDE: 'pagehide',\n  PAGESHOW: 'pageshow',\n  POPSTATE: 'popstate',\n\n  // Copy and Paste\n  // Support is limited. Make sure it works on your favorite browser\n  // before using.\n  // http://www.quirksmode.org/dom/events/cutcopypaste.html\n  COPY: 'copy',\n  PASTE: 'paste',\n  CUT: 'cut',\n  BEFORECOPY: 'beforecopy',\n  BEFORECUT: 'beforecut',\n  BEFOREPASTE: 'beforepaste',\n\n  // HTML5 online/offline events.\n  // http://www.w3.org/TR/offline-webapps/#related\n  ONLINE: 'online',\n  OFFLINE: 'offline',\n\n  // HTML 5 worker events\n  MESSAGE: 'message',\n  CONNECT: 'connect',\n\n  // Service Worker Events - ServiceWorkerGlobalScope context\n  // See https://w3c.github.io/ServiceWorker/#execution-context-events\n  // Note: message event defined in worker events section\n  INSTALL: 'install',\n  ACTIVATE: 'activate',\n  FETCH: 'fetch',\n  FOREIGNFETCH: 'foreignfetch',\n  MESSAGEERROR: 'messageerror',\n\n  // Service Worker Events - Document context\n  // See https://w3c.github.io/ServiceWorker/#document-context-events\n  STATECHANGE: 'statechange',\n  UPDATEFOUND: 'updatefound',\n  CONTROLLERCHANGE: 'controllerchange',\n\n  // CSS animation events.\n  /** @suppress {missingRequire} */\n  ANIMATIONSTART: goog.events.getVendorPrefixedName_('AnimationStart'),\n  /** @suppress {missingRequire} */\n  ANIMATIONEND: goog.events.getVendorPrefixedName_('AnimationEnd'),\n  /** @suppress {missingRequire} */\n  ANIMATIONITERATION: goog.events.getVendorPrefixedName_('AnimationIteration'),\n\n  // CSS transition events. Based on the browser support described at:\n  // https://developer.mozilla.org/en/css/css_transitions#Browser_compatibility\n  /** @suppress {missingRequire} */\n  TRANSITIONEND: goog.events.getVendorPrefixedName_('TransitionEnd'),\n\n  // W3C Pointer Events\n  // http://www.w3.org/TR/pointerevents/\n  POINTERDOWN: 'pointerdown',\n  POINTERUP: 'pointerup',\n  POINTERCANCEL: 'pointercancel',\n  POINTERMOVE: 'pointermove',\n  POINTEROVER: 'pointerover',\n  POINTEROUT: 'pointerout',\n  POINTERENTER: 'pointerenter',\n  POINTERLEAVE: 'pointerleave',\n  GOTPOINTERCAPTURE: 'gotpointercapture',\n  LOSTPOINTERCAPTURE: 'lostpointercapture',\n\n  // IE specific events.\n  // See http://msdn.microsoft.com/en-us/library/ie/hh772103(v=vs.85).aspx\n  // Note: these events will be supplanted in IE11.\n  MSGESTURECHANGE: 'MSGestureChange',\n  MSGESTUREEND: 'MSGestureEnd',\n  MSGESTUREHOLD: 'MSGestureHold',\n  MSGESTURESTART: 'MSGestureStart',\n  MSGESTURETAP: 'MSGestureTap',\n  MSGOTPOINTERCAPTURE: 'MSGotPointerCapture',\n  MSINERTIASTART: 'MSInertiaStart',\n  MSLOSTPOINTERCAPTURE: 'MSLostPointerCapture',\n  MSPOINTERCANCEL: 'MSPointerCancel',\n  MSPOINTERDOWN: 'MSPointerDown',\n  MSPOINTERENTER: 'MSPointerEnter',\n  MSPOINTERHOVER: 'MSPointerHover',\n  MSPOINTERLEAVE: 'MSPointerLeave',\n  MSPOINTERMOVE: 'MSPointerMove',\n  MSPOINTEROUT: 'MSPointerOut',\n  MSPOINTEROVER: 'MSPointerOver',\n  MSPOINTERUP: 'MSPointerUp',\n\n  // Native IMEs/input tools events.\n  TEXT: 'text',\n  // The textInput event is supported in IE9+, but only in lower case. All other\n  // browsers use the camel-case event name.\n  TEXTINPUT: goog.userAgent.IE ? 'textinput' : 'textInput',\n  COMPOSITIONSTART: 'compositionstart',\n  COMPOSITIONUPDATE: 'compositionupdate',\n  COMPOSITIONEND: 'compositionend',\n\n  // The beforeinput event is initially only supported in Safari. See\n  // https://bugs.chromium.org/p/chromium/issues/detail?id=342670 for Chrome\n  // implementation tracking.\n  BEFOREINPUT: 'beforeinput',\n\n  // Webview tag events\n  // See https://developer.chrome.com/apps/tags/webview\n  EXIT: 'exit',\n  LOADABORT: 'loadabort',\n  LOADCOMMIT: 'loadcommit',\n  LOADREDIRECT: 'loadredirect',\n  LOADSTART: 'loadstart',\n  LOADSTOP: 'loadstop',\n  RESPONSIVE: 'responsive',\n  SIZECHANGED: 'sizechanged',\n  UNRESPONSIVE: 'unresponsive',\n\n  // HTML5 Page Visibility API.  See details at\n  // `goog.labs.dom.PageVisibilityMonitor`.\n  VISIBILITYCHANGE: 'visibilitychange',\n\n  // LocalStorage event.\n  STORAGE: 'storage',\n\n  // DOM Level 2 mutation events (deprecated).\n  DOMSUBTREEMODIFIED: 'DOMSubtreeModified',\n  DOMNODEINSERTED: 'DOMNodeInserted',\n  DOMNODEREMOVED: 'DOMNodeRemoved',\n  DOMNODEREMOVEDFROMDOCUMENT: 'DOMNodeRemovedFromDocument',\n  DOMNODEINSERTEDINTODOCUMENT: 'DOMNodeInsertedIntoDocument',\n  DOMATTRMODIFIED: 'DOMAttrModified',\n  DOMCHARACTERDATAMODIFIED: 'DOMCharacterDataModified',\n\n  // Print events.\n  BEFOREPRINT: 'beforeprint',\n  AFTERPRINT: 'afterprint',\n\n  // Web app manifest events.\n  BEFOREINSTALLPROMPT: 'beforeinstallprompt',\n  APPINSTALLED: 'appinstalled'\n};\n\n\n/**\n * Returns one of the given pointer fallback event names in order of preference:\n *   1. pointerEventName\n *   2. msPointerEventName\n *   3. fallbackEventName\n * @param {string} pointerEventName\n * @param {string} msPointerEventName\n * @param {string} fallbackEventName\n * @return {string} The supported pointer or fallback (mouse or touch) event\n *     name.\n * @private\n */\ngoog.events.getPointerFallbackEventName_ = function(\n    pointerEventName, msPointerEventName, fallbackEventName) {\n  if (goog.events.BrowserFeature.POINTER_EVENTS) {\n    return pointerEventName;\n  }\n  if (goog.events.BrowserFeature.MSPOINTER_EVENTS) {\n    return msPointerEventName;\n  }\n  return fallbackEventName;\n};\n\n\n/**\n * Constants for pointer event names that fall back to corresponding mouse event\n * names on unsupported platforms. These are intended to be drop-in replacements\n * for corresponding values in `goog.events.EventType`.\n * @enum {string}\n */\ngoog.events.PointerFallbackEventType = {\n  POINTERDOWN: goog.events.getPointerFallbackEventName_(\n      goog.events.EventType.POINTERDOWN, goog.events.EventType.MSPOINTERDOWN,\n      goog.events.EventType.MOUSEDOWN),\n  POINTERUP: goog.events.getPointerFallbackEventName_(\n      goog.events.EventType.POINTERUP, goog.events.EventType.MSPOINTERUP,\n      goog.events.EventType.MOUSEUP),\n  POINTERCANCEL: goog.events.getPointerFallbackEventName_(\n      goog.events.EventType.POINTERCANCEL,\n      goog.events.EventType.MSPOINTERCANCEL,\n      // When falling back to mouse events, there is no MOUSECANCEL equivalent\n      // of POINTERCANCEL. In this case POINTERUP already falls back to MOUSEUP\n      // which represents both UP and CANCEL. POINTERCANCEL does not fall back\n      // to MOUSEUP to prevent listening twice on the same event.\n      goog.events.EventType.MOUSECANCEL),\n  POINTERMOVE: goog.events.getPointerFallbackEventName_(\n      goog.events.EventType.POINTERMOVE, goog.events.EventType.MSPOINTERMOVE,\n      goog.events.EventType.MOUSEMOVE),\n  POINTEROVER: goog.events.getPointerFallbackEventName_(\n      goog.events.EventType.POINTEROVER, goog.events.EventType.MSPOINTEROVER,\n      goog.events.EventType.MOUSEOVER),\n  POINTEROUT: goog.events.getPointerFallbackEventName_(\n      goog.events.EventType.POINTEROUT, goog.events.EventType.MSPOINTEROUT,\n      goog.events.EventType.MOUSEOUT),\n  POINTERENTER: goog.events.getPointerFallbackEventName_(\n      goog.events.EventType.POINTERENTER, goog.events.EventType.MSPOINTERENTER,\n      goog.events.EventType.MOUSEENTER),\n  POINTERLEAVE: goog.events.getPointerFallbackEventName_(\n      goog.events.EventType.POINTERLEAVE, goog.events.EventType.MSPOINTERLEAVE,\n      goog.events.EventType.MOUSELEAVE)\n};\n\n\n/**\n * Constants for pointer event names that fall back to corresponding touch event\n * names on unsupported platforms. These are intended to be drop-in replacements\n * for corresponding values in `goog.events.EventType`.\n * @enum {string}\n */\ngoog.events.PointerTouchFallbackEventType = {\n  POINTERDOWN: goog.events.getPointerFallbackEventName_(\n      goog.events.EventType.POINTERDOWN, goog.events.EventType.MSPOINTERDOWN,\n      goog.events.EventType.TOUCHSTART),\n  POINTERUP: goog.events.getPointerFallbackEventName_(\n      goog.events.EventType.POINTERUP, goog.events.EventType.MSPOINTERUP,\n      goog.events.EventType.TOUCHEND),\n  POINTERCANCEL: goog.events.getPointerFallbackEventName_(\n      goog.events.EventType.POINTERCANCEL,\n      goog.events.EventType.MSPOINTERCANCEL, goog.events.EventType.TOUCHCANCEL),\n  POINTERMOVE: goog.events.getPointerFallbackEventName_(\n      goog.events.EventType.POINTERMOVE, goog.events.EventType.MSPOINTERMOVE,\n      goog.events.EventType.TOUCHMOVE)\n};\n\n\n/**\n * Mapping of mouse event names to underlying browser event names.\n * @typedef {{\n *     MOUSEDOWN: string,\n *     MOUSEUP: string,\n *     MOUSECANCEL:string,\n *     MOUSEMOVE:string,\n *     MOUSEOVER:string,\n *     MOUSEOUT:string,\n *     MOUSEENTER:string,\n *     MOUSELEAVE: string,\n * }}\n */\ngoog.events.MouseEvents;\n\n\n/**\n * An alias for `goog.events.EventType.MOUSE*` event types that is overridden by\n * corresponding `POINTER*` event types.\n * @const {!goog.events.MouseEvents}\n */\ngoog.events.PointerAsMouseEventType = {\n  MOUSEDOWN: goog.events.PointerFallbackEventType.POINTERDOWN,\n  MOUSEUP: goog.events.PointerFallbackEventType.POINTERUP,\n  MOUSECANCEL: goog.events.PointerFallbackEventType.POINTERCANCEL,\n  MOUSEMOVE: goog.events.PointerFallbackEventType.POINTERMOVE,\n  MOUSEOVER: goog.events.PointerFallbackEventType.POINTEROVER,\n  MOUSEOUT: goog.events.PointerFallbackEventType.POINTEROUT,\n  MOUSEENTER: goog.events.PointerFallbackEventType.POINTERENTER,\n  MOUSELEAVE: goog.events.PointerFallbackEventType.POINTERLEAVE\n};\n\n\n/**\n * An alias for `goog.events.EventType.MOUSE*` event types that continue to use\n * mouse events.\n * @const {!goog.events.MouseEvents}\n */\ngoog.events.MouseAsMouseEventType = {\n  MOUSEDOWN: goog.events.EventType.MOUSEDOWN,\n  MOUSEUP: goog.events.EventType.MOUSEUP,\n  MOUSECANCEL: goog.events.EventType.MOUSECANCEL,\n  MOUSEMOVE: goog.events.EventType.MOUSEMOVE,\n  MOUSEOVER: goog.events.EventType.MOUSEOVER,\n  MOUSEOUT: goog.events.EventType.MOUSEOUT,\n  MOUSEENTER: goog.events.EventType.MOUSEENTER,\n  MOUSELEAVE: goog.events.EventType.MOUSELEAVE\n};\n\n\n/**\n * An alias for `goog.events.EventType.TOUCH*` event types that is overridden by\n * corresponding `POINTER*` event types.\n * @enum {string}\n */\ngoog.events.PointerAsTouchEventType = {\n  TOUCHCANCEL: goog.events.PointerTouchFallbackEventType.POINTERCANCEL,\n  TOUCHEND: goog.events.PointerTouchFallbackEventType.POINTERUP,\n  TOUCHMOVE: goog.events.PointerTouchFallbackEventType.POINTERMOVE,\n  TOUCHSTART: goog.events.PointerTouchFallbackEventType.POINTERDOWN\n};\n","^J2",1579837703000,"^J3",["^J4",["^IT","^J[","^M="]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/eventtype.js"],"^JD",["^J4",["^M<","~$goog.events.MouseAsMouseEventType","~$goog.events.PointerAsTouchEventType","~$goog.events.PointerTouchFallbackEventType","~$goog.events.PointerAsMouseEventType","~$goog.events.PointerFallbackEventType","~$goog.events.MouseEvents"]],"^IR",true,"^IS",["^IT","^M=","^J["]],["^ ","^IV",[1579837703000],"^IW","goog.iter.iter.js","^IX",["^IY","goog/iter/iter.js"],"^IZ","goog/iter/iter.js","^I[","^J0","^J1","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Python style iteration utilities.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.iter');\ngoog.provide('goog.iter.Iterable');\ngoog.provide('goog.iter.Iterator');\ngoog.provide('goog.iter.StopIteration');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.functions');\ngoog.require('goog.math');\n\n\n/**\n * @typedef {{length:number}|{__iterator__}}\n */\ngoog.iter.Iterable;\n\n\n/**\n * Singleton Error object that is used to terminate iterations.\n * @const {!Error}\n */\ngoog.iter.StopIteration = ('StopIteration' in goog.global) ?\n    // For script engines that support legacy iterators.\n    goog.global['StopIteration'] :\n    {message: 'StopIteration', stack: ''};\n\n\n\n/**\n * Class/interface for iterators.  An iterator needs to implement a `next`\n * method and it needs to throw a `goog.iter.StopIteration` when the\n * iteration passes beyond the end.  Iterators have no `hasNext` method.\n * It is recommended to always use the helper functions to iterate over the\n * iterator or in case you are only targeting JavaScript 1.7 for in loops.\n * @constructor\n * @template VALUE\n */\ngoog.iter.Iterator = function() {};\n\n\n/**\n * Returns the next value of the iteration.  This will throw the object\n * {@see goog.iter.StopIteration} when the iteration passes the end.\n * @return {VALUE} Any object or value.\n */\ngoog.iter.Iterator.prototype.next = function() {\n  throw goog.iter.StopIteration;\n};\n\n\n/**\n * Returns the `Iterator` object itself.  This is used to implement\n * the iterator protocol in JavaScript 1.7\n * @param {boolean=} opt_keys  Whether to return the keys or values. Default is\n *     to only return the values.  This is being used by the for-in loop (true)\n *     and the for-each-in loop (false).  Even though the param gives a hint\n *     about what the iterator will return there is no guarantee that it will\n *     return the keys when true is passed.\n * @return {!goog.iter.Iterator<VALUE>} The object itself.\n */\ngoog.iter.Iterator.prototype.__iterator__ = function(opt_keys) {\n  return this;\n};\n\n\n/**\n * Returns an iterator that knows how to iterate over the values in the object.\n * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable  If the\n *     object is an iterator it will be returned as is.  If the object has an\n *     `__iterator__` method that will be called to get the value\n *     iterator.  If the object is an array-like object we create an iterator\n *     for that.\n * @return {!goog.iter.Iterator<VALUE>} An iterator that knows how to iterate\n *     over the values in `iterable`.\n * @template VALUE\n */\ngoog.iter.toIterator = function(iterable) {\n  if (iterable instanceof goog.iter.Iterator) {\n    return iterable;\n  }\n  if (typeof iterable.__iterator__ == 'function') {\n    return /** @type {{__iterator__:function(this:?, boolean=)}} */ (iterable)\n        .__iterator__(false);\n  }\n  if (goog.isArrayLike(iterable)) {\n    var like = /** @type {!IArrayLike<number|string>} */ (iterable);\n    var i = 0;\n    var newIter = new goog.iter.Iterator;\n    newIter.next = function() {\n      while (true) {\n        if (i >= like.length) {\n          throw goog.iter.StopIteration;\n        }\n        // Don't include deleted elements.\n        if (!(i in like)) {\n          i++;\n          continue;\n        }\n        return like[i++];\n      }\n    };\n    return newIter;\n  }\n\n\n  // TODO(arv): Should we fall back on goog.structs.getValues()?\n  throw new Error('Not implemented');\n};\n\n\n/**\n * Calls a function for each element in the iterator with the element of the\n * iterator passed as argument.\n *\n * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable  The iterator\n *     to iterate over. If the iterable is an object `toIterator` will be\n *     called on it.\n * @param {function(this:THIS,VALUE,?,!goog.iter.Iterator<VALUE>)} f\n *     The function to call for every element.  This function takes 3 arguments\n *     (the element, undefined, and the iterator) and the return value is\n *     irrelevant.  The reason for passing undefined as the second argument is\n *     so that the same function can be used in {@see goog.array.forEach} as\n *     well as others.  The third parameter is of type \"number\" for\n *     arraylike objects, undefined, otherwise.\n * @param {THIS=} opt_obj  The object to be used as the value of 'this' within\n *     `f`.\n * @template THIS, VALUE\n */\ngoog.iter.forEach = function(iterable, f, opt_obj) {\n  if (goog.isArrayLike(iterable)) {\n\n    try {\n      // NOTES: this passes the index number to the second parameter\n      // of the callback contrary to the documentation above.\n      goog.array.forEach(\n          /** @type {IArrayLike<?>} */ (iterable), f, opt_obj);\n    } catch (ex) {\n      if (ex !== goog.iter.StopIteration) {\n        throw ex;\n      }\n    }\n  } else {\n    iterable = goog.iter.toIterator(iterable);\n\n    try {\n      while (true) {\n        f.call(opt_obj, iterable.next(), undefined, iterable);\n      }\n    } catch (ex) {\n      if (ex !== goog.iter.StopIteration) {\n        throw ex;\n      }\n    }\n  }\n};\n\n\n/**\n * Calls a function for every element in the iterator, and if the function\n * returns true adds the element to a new iterator.\n *\n * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator\n *     to iterate over.\n * @param {\n *     function(this:THIS,VALUE,undefined,!goog.iter.Iterator<VALUE>):boolean} f\n *     The function to call for every element. This function takes 3 arguments\n *     (the element, undefined, and the iterator) and should return a boolean.\n *     If the return value is true the element will be included in the returned\n *     iterator.  If it is false the element is not included.\n * @param {THIS=} opt_obj The object to be used as the value of 'this' within\n *     `f`.\n * @return {!goog.iter.Iterator<VALUE>} A new iterator in which only elements\n *     that passed the test are present.\n * @template THIS, VALUE\n */\ngoog.iter.filter = function(iterable, f, opt_obj) {\n  var iterator = goog.iter.toIterator(iterable);\n  var newIter = new goog.iter.Iterator;\n  newIter.next = function() {\n    while (true) {\n      var val = iterator.next();\n      if (f.call(opt_obj, val, undefined, iterator)) {\n        return val;\n      }\n    }\n  };\n  return newIter;\n};\n\n\n/**\n * Calls a function for every element in the iterator, and if the function\n * returns false adds the element to a new iterator.\n *\n * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator\n *     to iterate over.\n * @param {\n *     function(this:THIS,VALUE,undefined,!goog.iter.Iterator<VALUE>):boolean} f\n *     The function to call for every element. This function takes 3 arguments\n *     (the element, undefined, and the iterator) and should return a boolean.\n *     If the return value is false the element will be included in the returned\n *     iterator.  If it is true the element is not included.\n * @param {THIS=} opt_obj The object to be used as the value of 'this' within\n *     `f`.\n * @return {!goog.iter.Iterator<VALUE>} A new iterator in which only elements\n *     that did not pass the test are present.\n * @template THIS, VALUE\n */\ngoog.iter.filterFalse = function(iterable, f, opt_obj) {\n  return goog.iter.filter(iterable, goog.functions.not(f), opt_obj);\n};\n\n\n/**\n * Creates a new iterator that returns the values in a range.  This function\n * can take 1, 2 or 3 arguments:\n * <pre>\n * range(5) same as range(0, 5, 1)\n * range(2, 5) same as range(2, 5, 1)\n * </pre>\n *\n * @param {number} startOrStop  The stop value if only one argument is provided.\n *     The start value if 2 or more arguments are provided.  If only one\n *     argument is used the start value is 0.\n * @param {number=} opt_stop  The stop value.  If left out then the first\n *     argument is used as the stop value.\n * @param {number=} opt_step  The number to increment with between each call to\n *     next.  This can be negative.\n * @return {!goog.iter.Iterator<number>} A new iterator that returns the values\n *     in the range.\n */\ngoog.iter.range = function(startOrStop, opt_stop, opt_step) {\n  var start = 0;\n  var stop = startOrStop;\n  var step = opt_step || 1;\n  if (arguments.length > 1) {\n    start = startOrStop;\n    stop = +opt_stop;\n  }\n  if (step == 0) {\n    throw new Error('Range step argument must not be zero');\n  }\n\n  var newIter = new goog.iter.Iterator;\n  newIter.next = function() {\n    if (step > 0 && start >= stop || step < 0 && start <= stop) {\n      throw goog.iter.StopIteration;\n    }\n    var rv = start;\n    start += step;\n    return rv;\n  };\n  return newIter;\n};\n\n\n/**\n * Joins the values in a iterator with a delimiter.\n * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator\n *     to get the values from.\n * @param {string} deliminator  The text to put between the values.\n * @return {string} The joined value string.\n * @template VALUE\n */\ngoog.iter.join = function(iterable, deliminator) {\n  return goog.iter.toArray(iterable).join(deliminator);\n};\n\n\n/**\n * For every element in the iterator call a function and return a new iterator\n * with that value.\n *\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The\n *     iterator to iterate over.\n * @param {\n *     function(this:THIS,VALUE,undefined,!goog.iter.Iterator<VALUE>):RESULT} f\n *     The function to call for every element.  This function takes 3 arguments\n *     (the element, undefined, and the iterator) and should return a new value.\n * @param {THIS=} opt_obj The object to be used as the value of 'this' within\n *     `f`.\n * @return {!goog.iter.Iterator<RESULT>} A new iterator that returns the\n *     results of applying the function to each element in the original\n *     iterator.\n * @template THIS, VALUE, RESULT\n */\ngoog.iter.map = function(iterable, f, opt_obj) {\n  var iterator = goog.iter.toIterator(iterable);\n  var newIter = new goog.iter.Iterator;\n  newIter.next = function() {\n    var val = iterator.next();\n    return f.call(opt_obj, val, undefined, iterator);\n  };\n  return newIter;\n};\n\n\n/**\n * Passes every element of an iterator into a function and accumulates the\n * result.\n *\n * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator\n *     to iterate over.\n * @param {function(this:THIS,VALUE,VALUE):VALUE} f The function to call for\n *     every element. This function takes 2 arguments (the function's previous\n *     result or the initial value, and the value of the current element).\n *     function(previousValue, currentElement) : newValue.\n * @param {VALUE} val The initial value to pass into the function on the first\n *     call.\n * @param {THIS=} opt_obj  The object to be used as the value of 'this' within\n *     f.\n * @return {VALUE} Result of evaluating f repeatedly across the values of\n *     the iterator.\n * @template THIS, VALUE\n */\ngoog.iter.reduce = function(iterable, f, val, opt_obj) {\n  var rval = val;\n  goog.iter.forEach(\n      iterable, function(val) { rval = f.call(opt_obj, rval, val); });\n  return rval;\n};\n\n\n/**\n * Goes through the values in the iterator. Calls f for each of these, and if\n * any of them returns true, this returns true (without checking the rest). If\n * all return false this will return false.\n *\n * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator\n *     object.\n * @param {\n *     function(this:THIS,VALUE,undefined,!goog.iter.Iterator<VALUE>):boolean} f\n *     The function to call for every value. This function takes 3 arguments\n *     (the value, undefined, and the iterator) and should return a boolean.\n * @param {THIS=} opt_obj The object to be used as the value of 'this' within\n *     `f`.\n * @return {boolean} true if any value passes the test.\n * @template THIS, VALUE\n */\ngoog.iter.some = function(iterable, f, opt_obj) {\n  iterable = goog.iter.toIterator(iterable);\n\n  try {\n    while (true) {\n      if (f.call(opt_obj, iterable.next(), undefined, iterable)) {\n        return true;\n      }\n    }\n  } catch (ex) {\n    if (ex !== goog.iter.StopIteration) {\n      throw ex;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Goes through the values in the iterator. Calls f for each of these and if any\n * of them returns false this returns false (without checking the rest). If all\n * return true this will return true.\n *\n * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator\n *     object.\n * @param {\n *     function(this:THIS,VALUE,undefined,!goog.iter.Iterator<VALUE>):boolean} f\n *     The function to call for every value. This function takes 3 arguments\n *     (the value, undefined, and the iterator) and should return a boolean.\n * @param {THIS=} opt_obj The object to be used as the value of 'this' within\n *     `f`.\n * @return {boolean} true if every value passes the test.\n * @template THIS, VALUE\n */\ngoog.iter.every = function(iterable, f, opt_obj) {\n  iterable = goog.iter.toIterator(iterable);\n\n  try {\n    while (true) {\n      if (!f.call(opt_obj, iterable.next(), undefined, iterable)) {\n        return false;\n      }\n    }\n  } catch (ex) {\n    if (ex !== goog.iter.StopIteration) {\n      throw ex;\n    }\n  }\n  return true;\n};\n\n\n/**\n * Takes zero or more iterables and returns one iterator that will iterate over\n * them in the order chained.\n * @param {...!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} var_args Any\n *     number of iterable objects.\n * @return {!goog.iter.Iterator<VALUE>} Returns a new iterator that will\n *     iterate over all the given iterables' contents.\n * @template VALUE\n */\ngoog.iter.chain = function(var_args) {\n  return goog.iter.chainFromIterable(arguments);\n};\n\n\n/**\n * Takes a single iterable containing zero or more iterables and returns one\n * iterator that will iterate over each one in the order given.\n * @see https://goo.gl/5NRp5d\n * @param {goog.iter.Iterator<?>|goog.iter.Iterable} iterable The iterable of\n *     iterables to chain.\n * @return {!goog.iter.Iterator<VALUE>} Returns a new iterator that will\n *     iterate over all the contents of the iterables contained within\n *     `iterable`.\n * @template VALUE\n */\ngoog.iter.chainFromIterable = function(iterable) {\n  var iterator = goog.iter.toIterator(iterable);\n  var iter = new goog.iter.Iterator();\n  var current = null;\n\n  iter.next = function() {\n    while (true) {\n      if (current == null) {\n        var it = iterator.next();\n        current = goog.iter.toIterator(it);\n      }\n      try {\n        return current.next();\n      } catch (ex) {\n        if (ex !== goog.iter.StopIteration) {\n          throw ex;\n        }\n        current = null;\n      }\n    }\n  };\n\n  return iter;\n};\n\n\n/**\n * Builds a new iterator that iterates over the original, but skips elements as\n * long as a supplied function returns true.\n * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator\n *     object.\n * @param {\n *     function(this:THIS,VALUE,undefined,!goog.iter.Iterator<VALUE>):boolean} f\n *     The function to call for every value. This function takes 3 arguments\n *     (the value, undefined, and the iterator) and should return a boolean.\n * @param {THIS=} opt_obj The object to be used as the value of 'this' within\n *     `f`.\n * @return {!goog.iter.Iterator<VALUE>} A new iterator that drops elements from\n *     the original iterator as long as `f` is true.\n * @template THIS, VALUE\n */\ngoog.iter.dropWhile = function(iterable, f, opt_obj) {\n  var iterator = goog.iter.toIterator(iterable);\n  var newIter = new goog.iter.Iterator;\n  var dropping = true;\n  newIter.next = function() {\n    while (true) {\n      var val = iterator.next();\n      if (dropping && f.call(opt_obj, val, undefined, iterator)) {\n        continue;\n      } else {\n        dropping = false;\n      }\n      return val;\n    }\n  };\n  return newIter;\n};\n\n\n/**\n * Builds a new iterator that iterates over the original, but only as long as a\n * supplied function returns true.\n * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator\n *     object.\n * @param {\n *     function(this:THIS,VALUE,undefined,!goog.iter.Iterator<VALUE>):boolean} f\n *     The function to call for every value. This function takes 3 arguments\n *     (the value, undefined, and the iterator) and should return a boolean.\n * @param {THIS=} opt_obj This is used as the 'this' object in f when called.\n * @return {!goog.iter.Iterator<VALUE>} A new iterator that keeps elements in\n *     the original iterator as long as the function is true.\n * @template THIS, VALUE\n */\ngoog.iter.takeWhile = function(iterable, f, opt_obj) {\n  var iterator = goog.iter.toIterator(iterable);\n  var iter = new goog.iter.Iterator();\n  iter.next = function() {\n    var val = iterator.next();\n    if (f.call(opt_obj, val, undefined, iterator)) {\n      return val;\n    }\n    throw goog.iter.StopIteration;\n  };\n  return iter;\n};\n\n\n/**\n * Converts the iterator to an array\n * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterator\n *     to convert to an array.\n * @return {!Array<VALUE>} An array of the elements the iterator iterates over.\n * @template VALUE\n */\ngoog.iter.toArray = function(iterable) {\n  // Fast path for array-like.\n  if (goog.isArrayLike(iterable)) {\n    return goog.array.toArray(/** @type {!IArrayLike<?>} */ (iterable));\n  }\n  iterable = goog.iter.toIterator(iterable);\n  var array = [];\n  goog.iter.forEach(iterable, function(val) { array.push(val); });\n  return array;\n};\n\n\n/**\n * Iterates over two iterables and returns true if they contain the same\n * sequence of elements and have the same length.\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable1 The first\n *     iterable object.\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable2 The second\n *     iterable object.\n * @param {function(VALUE,VALUE):boolean=} opt_equalsFn Optional comparison\n *     function.\n *     Should take two arguments to compare, and return true if the arguments\n *     are equal. Defaults to {@link goog.array.defaultCompareEquality} which\n *     compares the elements using the built-in '===' operator.\n * @return {boolean} true if the iterables contain the same sequence of elements\n *     and have the same length.\n * @template VALUE\n */\ngoog.iter.equals = function(iterable1, iterable2, opt_equalsFn) {\n  var fillValue = {};\n  var pairs = goog.iter.zipLongest(fillValue, iterable1, iterable2);\n  var equalsFn = opt_equalsFn || goog.array.defaultCompareEquality;\n  return goog.iter.every(\n      pairs, function(pair) { return equalsFn(pair[0], pair[1]); });\n};\n\n\n/**\n * Advances the iterator to the next position, returning the given default value\n * instead of throwing an exception if the iterator has no more entries.\n * @param {goog.iter.Iterator<VALUE>|goog.iter.Iterable} iterable The iterable\n *     object.\n * @param {VALUE} defaultValue The value to return if the iterator is empty.\n * @return {VALUE} The next item in the iteration, or defaultValue if the\n *     iterator was empty.\n * @template VALUE\n */\ngoog.iter.nextOrValue = function(iterable, defaultValue) {\n  try {\n    return goog.iter.toIterator(iterable).next();\n  } catch (e) {\n    if (e != goog.iter.StopIteration) {\n      throw e;\n    }\n    return defaultValue;\n  }\n};\n\n\n/**\n * Cartesian product of zero or more sets.  Gives an iterator that gives every\n * combination of one element chosen from each set.  For example,\n * ([1, 2], [3, 4]) gives ([1, 3], [1, 4], [2, 3], [2, 4]).\n * @see http://docs.python.org/library/itertools.html#itertools.product\n * @param {...!IArrayLike<VALUE>} var_args Zero or more sets, as\n *     arrays.\n * @return {!goog.iter.Iterator<!Array<VALUE>>} An iterator that gives each\n *     n-tuple (as an array).\n * @template VALUE\n */\ngoog.iter.product = function(var_args) {\n  var someArrayEmpty =\n      goog.array.some(arguments, function(arr) { return !arr.length; });\n\n  // An empty set in a cartesian product gives an empty set.\n  if (someArrayEmpty || !arguments.length) {\n    return new goog.iter.Iterator();\n  }\n\n  var iter = new goog.iter.Iterator();\n  var arrays = arguments;\n\n  // The first indices are [0, 0, ...]\n  /** @type {?Array<number>} */\n  var indicies = goog.array.repeat(0, arrays.length);\n\n  iter.next = function() {\n\n    if (indicies) {\n      var retVal = goog.array.map(indicies, function(valueIndex, arrayIndex) {\n        return arrays[arrayIndex][valueIndex];\n      });\n\n      // Generate the next-largest indices for the next call.\n      // Increase the rightmost index. If it goes over, increase the next\n      // rightmost (like carry-over addition).\n      for (var i = indicies.length - 1; i >= 0; i--) {\n        // Assertion prevents compiler warning below.\n        goog.asserts.assert(indicies);\n        if (indicies[i] < arrays[i].length - 1) {\n          indicies[i]++;\n          break;\n        }\n\n        // We're at the last indices (the last element of every array), so\n        // the iteration is over on the next call.\n        if (i == 0) {\n          indicies = null;\n          break;\n        }\n        // Reset the index in this column and loop back to increment the\n        // next one.\n        indicies[i] = 0;\n      }\n      return retVal;\n    }\n\n    throw goog.iter.StopIteration;\n  };\n\n  return iter;\n};\n\n\n/**\n * Create an iterator to cycle over the iterable's elements indefinitely.\n * For example, ([1, 2, 3]) would return : 1, 2, 3, 1, 2, 3, ...\n * @see: http://docs.python.org/library/itertools.html#itertools.cycle.\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The\n *     iterable object.\n * @return {!goog.iter.Iterator<VALUE>} An iterator that iterates indefinitely\n *     over the values in `iterable`.\n * @template VALUE\n */\ngoog.iter.cycle = function(iterable) {\n  var baseIterator = goog.iter.toIterator(iterable);\n\n  // We maintain a cache to store the iterable elements as we iterate\n  // over them. The cache is used to return elements once we have\n  // iterated over the iterable once.\n  var cache = [];\n  var cacheIndex = 0;\n\n  var iter = new goog.iter.Iterator();\n\n  // This flag is set after the iterable is iterated over once\n  var useCache = false;\n\n  iter.next = function() {\n    var returnElement = null;\n\n    // Pull elements off the original iterator if not using cache\n    if (!useCache) {\n      try {\n        // Return the element from the iterable\n        returnElement = baseIterator.next();\n        cache.push(returnElement);\n        return returnElement;\n      } catch (e) {\n        // If an exception other than StopIteration is thrown\n        // or if there are no elements to iterate over (the iterable was empty)\n        // throw an exception\n        if (e != goog.iter.StopIteration || goog.array.isEmpty(cache)) {\n          throw e;\n        }\n        // set useCache to true after we know that a 'StopIteration' exception\n        // was thrown and the cache is not empty (to handle the 'empty iterable'\n        // use case)\n        useCache = true;\n      }\n    }\n\n    returnElement = cache[cacheIndex];\n    cacheIndex = (cacheIndex + 1) % cache.length;\n\n    return returnElement;\n  };\n\n  return iter;\n};\n\n\n/**\n * Creates an iterator that counts indefinitely from a starting value.\n * @see http://docs.python.org/2/library/itertools.html#itertools.count\n * @param {number=} opt_start The starting value. Default is 0.\n * @param {number=} opt_step The number to increment with between each call to\n *     next. Negative and floating point numbers are allowed. Default is 1.\n * @return {!goog.iter.Iterator<number>} A new iterator that returns the values\n *     in the series.\n */\ngoog.iter.count = function(opt_start, opt_step) {\n  var counter = opt_start || 0;\n  var step = (opt_step !== undefined) ? opt_step : 1;\n  var iter = new goog.iter.Iterator();\n\n  iter.next = function() {\n    var returnValue = counter;\n    counter += step;\n    return returnValue;\n  };\n\n  return iter;\n};\n\n\n/**\n * Creates an iterator that returns the same object or value repeatedly.\n * @param {VALUE} value Any object or value to repeat.\n * @return {!goog.iter.Iterator<VALUE>} A new iterator that returns the\n *     repeated value.\n * @template VALUE\n */\ngoog.iter.repeat = function(value) {\n  var iter = new goog.iter.Iterator();\n\n  iter.next = goog.functions.constant(value);\n\n  return iter;\n};\n\n\n/**\n * Creates an iterator that returns running totals from the numbers in\n * `iterable`. For example, the array {@code [1, 2, 3, 4, 5]} yields\n * {@code 1 -> 3 -> 6 -> 10 -> 15}.\n * @see http://docs.python.org/3.2/library/itertools.html#itertools.accumulate\n * @param {!goog.iter.Iterator<number>|!goog.iter.Iterable} iterable The\n *     iterable of numbers to accumulate.\n * @return {!goog.iter.Iterator<number>} A new iterator that returns the\n *     numbers in the series.\n */\ngoog.iter.accumulate = function(iterable) {\n  var iterator = goog.iter.toIterator(iterable);\n  var total = 0;\n  var iter = new goog.iter.Iterator();\n\n  iter.next = function() {\n    total += iterator.next();\n    return total;\n  };\n\n  return iter;\n};\n\n\n/**\n * Creates an iterator that returns arrays containing the ith elements from the\n * provided iterables. The returned arrays will be the same size as the number\n * of iterables given in `var_args`. Once the shortest iterable is\n * exhausted, subsequent calls to `next()` will throw\n * `goog.iter.StopIteration`.\n * @see http://docs.python.org/2/library/itertools.html#itertools.izip\n * @param {...!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} var_args Any\n *     number of iterable objects.\n * @return {!goog.iter.Iterator<!Array<VALUE>>} A new iterator that returns\n *     arrays of elements from the provided iterables.\n * @template VALUE\n */\ngoog.iter.zip = function(var_args) {\n  var args = arguments;\n  var iter = new goog.iter.Iterator();\n\n  if (args.length > 0) {\n    var iterators = goog.array.map(args, goog.iter.toIterator);\n    iter.next = function() {\n      var arr = goog.array.map(iterators, function(it) { return it.next(); });\n      return arr;\n    };\n  }\n\n  return iter;\n};\n\n\n/**\n * Creates an iterator that returns arrays containing the ith elements from the\n * provided iterables. The returned arrays will be the same size as the number\n * of iterables given in `var_args`. Shorter iterables will be extended\n * with `fillValue`. Once the longest iterable is exhausted, subsequent\n * calls to `next()` will throw `goog.iter.StopIteration`.\n * @see http://docs.python.org/2/library/itertools.html#itertools.izip_longest\n * @param {VALUE} fillValue The object or value used to fill shorter iterables.\n * @param {...!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} var_args Any\n *     number of iterable objects.\n * @return {!goog.iter.Iterator<!Array<VALUE>>} A new iterator that returns\n *     arrays of elements from the provided iterables.\n * @template VALUE\n */\ngoog.iter.zipLongest = function(fillValue, var_args) {\n  var args = goog.array.slice(arguments, 1);\n  var iter = new goog.iter.Iterator();\n\n  if (args.length > 0) {\n    var iterators = goog.array.map(args, goog.iter.toIterator);\n\n    iter.next = function() {\n      var iteratorsHaveValues = false;  // false when all iterators are empty.\n      var arr = goog.array.map(iterators, function(it) {\n        var returnValue;\n        try {\n          returnValue = it.next();\n          // Iterator had a value, so we've not exhausted the iterators.\n          // Set flag accordingly.\n          iteratorsHaveValues = true;\n        } catch (ex) {\n          if (ex !== goog.iter.StopIteration) {\n            throw ex;\n          }\n          returnValue = fillValue;\n        }\n        return returnValue;\n      });\n\n      if (!iteratorsHaveValues) {\n        throw goog.iter.StopIteration;\n      }\n      return arr;\n    };\n  }\n\n  return iter;\n};\n\n\n/**\n * Creates an iterator that filters `iterable` based on a series of\n * `selectors`. On each call to `next()`, one item is taken from\n * both the `iterable` and `selectors` iterators. If the item from\n * `selectors` evaluates to true, the item from `iterable` is given.\n * Otherwise, it is skipped. Once either `iterable` or `selectors`\n * is exhausted, subsequent calls to `next()` will throw\n * `goog.iter.StopIteration`.\n * @see http://docs.python.org/2/library/itertools.html#itertools.compress\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The\n *     iterable to filter.\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} selectors An\n *     iterable of items to be evaluated in a boolean context to determine if\n *     the corresponding element in `iterable` should be included in the\n *     result.\n * @return {!goog.iter.Iterator<VALUE>} A new iterator that returns the\n *     filtered values.\n * @template VALUE\n */\ngoog.iter.compress = function(iterable, selectors) {\n  var selectorIterator = goog.iter.toIterator(selectors);\n\n  return goog.iter.filter(\n      iterable, function() { return !!selectorIterator.next(); });\n};\n\n\n\n/**\n * Implements the `goog.iter.groupBy` iterator.\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The\n *     iterable to group.\n * @param {function(VALUE): KEY=} opt_keyFunc  Optional function for\n *     determining the key value for each group in the `iterable`. Default\n *     is the identity function.\n * @constructor\n * @extends {goog.iter.Iterator<!Array<?>>}\n * @template KEY, VALUE\n * @private\n */\ngoog.iter.GroupByIterator_ = function(iterable, opt_keyFunc) {\n\n  /**\n   * The iterable to group, coerced to an iterator.\n   * @type {!goog.iter.Iterator}\n   */\n  this.iterator = goog.iter.toIterator(iterable);\n\n  /**\n   * A function for determining the key value for each element in the iterable.\n   * If no function is provided, the identity function is used and returns the\n   * element unchanged.\n   * @type {function(VALUE): KEY}\n   */\n  this.keyFunc = opt_keyFunc || goog.functions.identity;\n\n  /**\n   * The target key for determining the start of a group.\n   * @type {KEY}\n   */\n  this.targetKey;\n\n  /**\n   * The current key visited during iteration.\n   * @type {KEY}\n   */\n  this.currentKey;\n\n  /**\n   * The current value being added to the group.\n   * @type {VALUE}\n   */\n  this.currentValue;\n};\ngoog.inherits(goog.iter.GroupByIterator_, goog.iter.Iterator);\n\n\n/** @override */\ngoog.iter.GroupByIterator_.prototype.next = function() {\n  while (this.currentKey == this.targetKey) {\n    this.currentValue = this.iterator.next();  // Exits on StopIteration\n    this.currentKey = this.keyFunc(this.currentValue);\n  }\n  this.targetKey = this.currentKey;\n  return [this.currentKey, this.groupItems_(this.targetKey)];\n};\n\n\n/**\n * Performs the grouping of objects using the given key.\n * @param {KEY} targetKey  The target key object for the group.\n * @return {!Array<VALUE>} An array of grouped objects.\n * @private\n */\ngoog.iter.GroupByIterator_.prototype.groupItems_ = function(targetKey) {\n  var arr = [];\n  while (this.currentKey == targetKey) {\n    arr.push(this.currentValue);\n    try {\n      this.currentValue = this.iterator.next();\n    } catch (ex) {\n      if (ex !== goog.iter.StopIteration) {\n        throw ex;\n      }\n      break;\n    }\n    this.currentKey = this.keyFunc(this.currentValue);\n  }\n  return arr;\n};\n\n\n/**\n * Creates an iterator that returns arrays containing elements from the\n * `iterable` grouped by a key value. For iterables with repeated\n * elements (i.e. sorted according to a particular key function), this function\n * has a `uniq`-like effect. For example, grouping the array:\n * {@code [A, B, B, C, C, A]} produces\n * {@code [A, [A]], [B, [B, B]], [C, [C, C]], [A, [A]]}.\n * @see http://docs.python.org/2/library/itertools.html#itertools.groupby\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The\n *     iterable to group.\n * @param {function(VALUE): KEY=} opt_keyFunc  Optional function for\n *     determining the key value for each group in the `iterable`. Default\n *     is the identity function.\n * @return {!goog.iter.Iterator<!Array<?>>} A new iterator that returns\n *     arrays of consecutive key and groups.\n * @template KEY, VALUE\n */\ngoog.iter.groupBy = function(iterable, opt_keyFunc) {\n  return new goog.iter.GroupByIterator_(iterable, opt_keyFunc);\n};\n\n\n/**\n * Gives an iterator that gives the result of calling the given function\n * <code>f</code> with the arguments taken from the next element from\n * <code>iterable</code> (the elements are expected to also be iterables).\n *\n * Similar to {@see goog.iter.map} but allows the function to accept multiple\n * arguments from the iterable.\n *\n * @param {!goog.iter.Iterator<?>|!goog.iter.Iterable} iterable The iterable of\n *     iterables to iterate over.\n * @param {function(this:THIS,...*):RESULT} f The function to call for every\n *     element.  This function takes N+2 arguments, where N represents the\n *     number of items from the next element of the iterable. The two\n *     additional arguments passed to the function are undefined and the\n *     iterator itself. The function should return a new value.\n * @param {THIS=} opt_obj The object to be used as the value of 'this' within\n *     `f`.\n * @return {!goog.iter.Iterator<RESULT>} A new iterator that returns the\n *     results of applying the function to each element in the original\n *     iterator.\n * @template THIS, RESULT\n */\ngoog.iter.starMap = function(iterable, f, opt_obj) {\n  var iterator = goog.iter.toIterator(iterable);\n  var iter = new goog.iter.Iterator();\n\n  iter.next = function() {\n    var args = goog.iter.toArray(iterator.next());\n    return f.apply(opt_obj, goog.array.concat(args, undefined, iterator));\n  };\n\n  return iter;\n};\n\n\n/**\n * Returns an array of iterators each of which can iterate over the values in\n * `iterable` without advancing the others.\n * @see http://docs.python.org/2/library/itertools.html#itertools.tee\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The\n *     iterable to tee.\n * @param {number=} opt_num  The number of iterators to create. Default is 2.\n * @return {!Array<goog.iter.Iterator<VALUE>>} An array of iterators.\n * @template VALUE\n */\ngoog.iter.tee = function(iterable, opt_num) {\n  var iterator = goog.iter.toIterator(iterable);\n  var num = (typeof opt_num === 'number') ? opt_num : 2;\n  var buffers =\n      goog.array.map(goog.array.range(num), function() { return []; });\n\n  var addNextIteratorValueToBuffers = function() {\n    var val = iterator.next();\n    goog.array.forEach(buffers, function(buffer) { buffer.push(val); });\n  };\n\n  var createIterator = function(buffer) {\n    // Each tee'd iterator has an associated buffer (initially empty). When a\n    // tee'd iterator's buffer is empty, it calls\n    // addNextIteratorValueToBuffers(), adding the next value to all tee'd\n    // iterators' buffers, and then returns that value. This allows each\n    // iterator to be advanced independently.\n    var iter = new goog.iter.Iterator();\n\n    iter.next = function() {\n      if (goog.array.isEmpty(buffer)) {\n        addNextIteratorValueToBuffers();\n      }\n      goog.asserts.assert(!goog.array.isEmpty(buffer));\n      return buffer.shift();\n    };\n\n    return iter;\n  };\n\n  return goog.array.map(buffers, createIterator);\n};\n\n\n/**\n * Creates an iterator that returns arrays containing a count and an element\n * obtained from the given `iterable`.\n * @see http://docs.python.org/2/library/functions.html#enumerate\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The\n *     iterable to enumerate.\n * @param {number=} opt_start  Optional starting value. Default is 0.\n * @return {!goog.iter.Iterator<!Array<?>>} A new iterator containing\n *     count/item pairs.\n * @template VALUE\n */\ngoog.iter.enumerate = function(iterable, opt_start) {\n  return goog.iter.zip(goog.iter.count(opt_start), iterable);\n};\n\n\n/**\n * Creates an iterator that returns the first `limitSize` elements from an\n * iterable. If this number is greater than the number of elements in the\n * iterable, all the elements are returned.\n * @see http://goo.gl/V0sihp Inspired by the limit iterator in Guava.\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The\n *     iterable to limit.\n * @param {number} limitSize  The maximum number of elements to return.\n * @return {!goog.iter.Iterator<VALUE>} A new iterator containing\n *     `limitSize` elements.\n * @template VALUE\n */\ngoog.iter.limit = function(iterable, limitSize) {\n  goog.asserts.assert(goog.math.isInt(limitSize) && limitSize >= 0);\n\n  var iterator = goog.iter.toIterator(iterable);\n\n  var iter = new goog.iter.Iterator();\n  var remaining = limitSize;\n\n  iter.next = function() {\n    if (remaining-- > 0) {\n      return iterator.next();\n    }\n    throw goog.iter.StopIteration;\n  };\n\n  return iter;\n};\n\n\n/**\n * Creates an iterator that is advanced `count` steps ahead. Consumed\n * values are silently discarded. If `count` is greater than the number\n * of elements in `iterable`, an empty iterator is returned. Subsequent\n * calls to `next()` will throw `goog.iter.StopIteration`.\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The\n *     iterable to consume.\n * @param {number} count  The number of elements to consume from the iterator.\n * @return {!goog.iter.Iterator<VALUE>} An iterator advanced zero or more steps\n *     ahead.\n * @template VALUE\n */\ngoog.iter.consume = function(iterable, count) {\n  goog.asserts.assert(goog.math.isInt(count) && count >= 0);\n\n  var iterator = goog.iter.toIterator(iterable);\n\n  while (count-- > 0) {\n    goog.iter.nextOrValue(iterator, null);\n  }\n\n  return iterator;\n};\n\n\n/**\n * Creates an iterator that returns a range of elements from an iterable.\n * Similar to {@see goog.array.slice} but does not support negative indexes.\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The\n *     iterable to slice.\n * @param {number} start  The index of the first element to return.\n * @param {number=} opt_end  The index after the last element to return. If\n *     defined, must be greater than or equal to `start`.\n * @return {!goog.iter.Iterator<VALUE>} A new iterator containing a slice of\n *     the original.\n * @template VALUE\n */\ngoog.iter.slice = function(iterable, start, opt_end) {\n  goog.asserts.assert(goog.math.isInt(start) && start >= 0);\n\n  var iterator = goog.iter.consume(iterable, start);\n\n  if (typeof opt_end === 'number') {\n    goog.asserts.assert(goog.math.isInt(opt_end) && opt_end >= start);\n    iterator = goog.iter.limit(iterator, opt_end - start /* limitSize */);\n  }\n\n  return iterator;\n};\n\n\n/**\n * Checks an array for duplicate elements.\n * @param {?IArrayLike<VALUE>} arr The array to check for\n *     duplicates.\n * @return {boolean} True, if the array contains duplicates, false otherwise.\n * @private\n * @template VALUE\n */\n// TODO(user): Consider moving this into goog.array as a public function.\ngoog.iter.hasDuplicates_ = function(arr) {\n  var deduped = [];\n  goog.array.removeDuplicates(arr, deduped);\n  return arr.length != deduped.length;\n};\n\n\n/**\n * Creates an iterator that returns permutations of elements in\n * `iterable`.\n *\n * Permutations are obtained by taking the Cartesian product of\n * `opt_length` iterables and filtering out those with repeated\n * elements. For example, the permutations of {@code [1,2,3]} are\n * {@code [[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]]}.\n * @see http://docs.python.org/2/library/itertools.html#itertools.permutations\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The\n *     iterable from which to generate permutations.\n * @param {number=} opt_length Length of each permutation. If omitted, defaults\n *     to the length of `iterable`.\n * @return {!goog.iter.Iterator<!Array<VALUE>>} A new iterator containing the\n *     permutations of `iterable`.\n * @template VALUE\n */\ngoog.iter.permutations = function(iterable, opt_length) {\n  var elements = goog.iter.toArray(iterable);\n  var length = (typeof opt_length === 'number') ? opt_length : elements.length;\n\n  var sets = goog.array.repeat(elements, length);\n  var product = goog.iter.product.apply(undefined, sets);\n\n  return goog.iter.filter(\n      product, function(arr) { return !goog.iter.hasDuplicates_(arr); });\n};\n\n\n/**\n * Creates an iterator that returns combinations of elements from\n * `iterable`.\n *\n * Combinations are obtained by taking the {@see goog.iter.permutations} of\n * `iterable` and filtering those whose elements appear in the order they\n * are encountered in `iterable`. For example, the 3-length combinations\n * of {@code [0,1,2,3]} are {@code [[0,1,2], [0,1,3], [0,2,3], [1,2,3]]}.\n * @see http://docs.python.org/2/library/itertools.html#itertools.combinations\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The\n *     iterable from which to generate combinations.\n * @param {number} length The length of each combination.\n * @return {!goog.iter.Iterator<!Array<VALUE>>} A new iterator containing\n *     combinations from the `iterable`.\n * @template VALUE\n */\ngoog.iter.combinations = function(iterable, length) {\n  var elements = goog.iter.toArray(iterable);\n  var indexes = goog.iter.range(elements.length);\n  var indexIterator = goog.iter.permutations(indexes, length);\n  // sortedIndexIterator will now give arrays of with the given length that\n  // indicate what indexes into \"elements\" should be returned on each iteration.\n  var sortedIndexIterator = goog.iter.filter(\n      indexIterator, function(arr) { return goog.array.isSorted(arr); });\n\n  var iter = new goog.iter.Iterator();\n\n  function getIndexFromElements(index) { return elements[index]; }\n\n  iter.next = function() {\n    return goog.array.map(sortedIndexIterator.next(), getIndexFromElements);\n  };\n\n  return iter;\n};\n\n\n/**\n * Creates an iterator that returns combinations of elements from\n * `iterable`, with repeated elements possible.\n *\n * Combinations are obtained by taking the Cartesian product of `length`\n * iterables and filtering those whose elements appear in the order they are\n * encountered in `iterable`. For example, the 2-length combinations of\n * {@code [1,2,3]} are {@code [[1,1], [1,2], [1,3], [2,2], [2,3], [3,3]]}.\n * @see https://goo.gl/C0yXe4\n * @see https://goo.gl/djOCsk\n * @param {!goog.iter.Iterator<VALUE>|!goog.iter.Iterable} iterable The\n *     iterable to combine.\n * @param {number} length The length of each combination.\n * @return {!goog.iter.Iterator<!Array<VALUE>>} A new iterator containing\n *     combinations from the `iterable`.\n * @template VALUE\n */\ngoog.iter.combinationsWithReplacement = function(iterable, length) {\n  var elements = goog.iter.toArray(iterable);\n  var indexes = goog.array.range(elements.length);\n  var sets = goog.array.repeat(indexes, length);\n  var indexIterator = goog.iter.product.apply(undefined, sets);\n  // sortedIndexIterator will now give arrays of with the given length that\n  // indicate what indexes into \"elements\" should be returned on each iteration.\n  var sortedIndexIterator = goog.iter.filter(\n      indexIterator, function(arr) { return goog.array.isSorted(arr); });\n\n  var iter = new goog.iter.Iterator();\n\n  function getIndexFromElements(index) { return elements[index]; }\n\n  iter.next = function() {\n    return goog.array.map(\n        /** @type {!Array<number>} */\n        (sortedIndexIterator.next()), getIndexFromElements);\n  };\n\n  return iter;\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","~$goog.functions","^IT","^LZ","^JJ"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/iter/iter.js"],"^JD",["^J4",["^KD","^KF","^MF","~$goog.iter.Iterable"]],"^IR",true,"^IS",["^IT","^JJ","^JF","^N=","^LZ"]],["^ ","^IV",[1579837703000],"^IW","goog.testing.multitestrunner.js","^IX",["^IY","goog/testing/multitestrunner.js"],"^IZ","goog/testing/multitestrunner.js","^I[","^J0","^J1","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility for running multiple test files that utilize the same\n * interface as goog.testing.TestRunner.  Each test is run in series and their\n * results aggregated.  The main usecase for the MultiTestRunner is to allow\n * the testing of all tests in a project locally.\n *\n */\n\ngoog.setTestOnly('goog.testing.MultiTestRunner');\ngoog.provide('goog.testing.MultiTestRunner');\ngoog.provide('goog.testing.MultiTestRunner.TestFrame');\n\ngoog.require('goog.Timer');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.functions');\ngoog.require('goog.object');\ngoog.require('goog.string');\ngoog.require('goog.testing.TestCase');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.ServerChart');\ngoog.require('goog.ui.TableSorter');\n\n\n\n/**\n * A component for running multiple tests within the browser.\n * @param {goog.dom.DomHelper=} opt_domHelper A DOM helper.\n * @extends {goog.ui.Component}\n * @constructor\n * @final\n */\ngoog.testing.MultiTestRunner = function(opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * Array of tests to execute, when combined with the base path this should be\n   * a relative path to the test from the page containing the multi testrunner.\n   * @type {Array<string>}\n   * @private\n   */\n  this.allTests_ = [];\n\n  /**\n   * Tests that match the filter function.\n   * @type {Array<string>}\n   * @private\n   */\n  this.activeTests_ = [];\n\n  /**\n   * An event handler for handling events.\n   * @type {goog.events.EventHandler<!goog.testing.MultiTestRunner>}\n   * @private\n   */\n  this.eh_ = new goog.events.EventHandler(this);\n\n  /**\n   * A table sorter for the stats.\n   * @type {goog.ui.TableSorter}\n   * @private\n   */\n  this.tableSorter_ = new goog.ui.TableSorter(this.dom_);\n\n  /**\n   * Array to hold individual test reports for tests that failed.\n   * @type {!Array<string>}\n   * @private\n   */\n  this.failureReports_ = [];\n\n  /**\n   * Array of test result objects returned from G_testRunner.getTestResults for\n   * each individual test run.\n   * @private {!Array<!Object<string,!Array<!goog.testing.TestCase.IResult>>>}\n   */\n  this.allTestResults_ = [];\n};\ngoog.inherits(goog.testing.MultiTestRunner, goog.ui.Component);\n\n\n/**\n * Default maximimum amount of time to spend at each stage of the test.\n * @type {number}\n */\ngoog.testing.MultiTestRunner.DEFAULT_TIMEOUT_MS = 45 * 1000;\n\n\n/**\n * Messages corresponding to the numeric states.\n * @type {Array<string>}\n */\ngoog.testing.MultiTestRunner.STATES = [\n  'waiting for test runner', 'initializing tests', 'waiting for tests to finish'\n];\n\n\n/**\n * Event type dispatched when tests are completed.\n * @const\n */\ngoog.testing.MultiTestRunner.TESTS_FINISHED = 'testsFinished';\n\n\n/**\n * The test suite's name.\n * @type {string} name\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.name_ = '';\n\n\n/**\n * The base path used to resolve files within the allTests_ array.\n * @type {string}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.basePath_ = '';\n\n\n/**\n * A set of tests that have finished.  All extant keys map to true.\n * @type {?Object<boolean>}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.finished_ = null;\n\n\n/**\n * Whether the report should contain verbose information about the passes.\n * @type {boolean}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.verbosePasses_ = false;\n\n\n/**\n * Whether to hide passing tests completely in the report, makes verbosePasses_\n * obsolete.\n * @type {boolean}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.hidePasses_ = false;\n\n\n/**\n * Flag used to tell the test runner to stop after the current test.\n * @type {boolean}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.stopped_ = false;\n\n\n/**\n * Flag indicating whether the test runner is active.\n * @type {boolean}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.active_ = false;\n\n\n/**\n * Index of the next test to run.\n * @type {number}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.startedCount_ = 0;\n\n\n/**\n * Count of the results received so far.\n * @type {number}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.resultCount_ = 0;\n\n\n/**\n * Number of passes so far.\n * @type {number}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.passes_ = 0;\n\n\n/**\n * Timestamp for the current start time.\n * @type {number}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.startTime_ = 0;\n\n\n/**\n * Only tests whose paths patch this filter function will be\n * executed.\n * @type {function(string): boolean}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.filterFn_ = goog.functions.TRUE;\n\n\n/**\n * Number of milliseconds to wait for loading and initialization steps.\n * @type {number}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.timeoutMs_ =\n    goog.testing.MultiTestRunner.DEFAULT_TIMEOUT_MS;\n\n\n/**\n * @typedef {{\n *   testFile: string,\n *   success: ?boolean,\n *   runTime: number,\n *   totalTime: number,\n *   numFilesLoaded: number\n * }}\n * @private\n */\ngoog.testing.MultiTestRunner.StatsType_;\n\n\n/**\n * An array of objects containing stats about the tests.\n * @type {?Array<!goog.testing.MultiTestRunner.StatsType_>}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.stats_ = null;\n\n\n/**\n * Reference to the start button element.\n * @type {?HTMLButtonElement}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.startButtonEl_ = null;\n\n\n/**\n * Reference to the stop button element.\n * @type {?HTMLButtonElement}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.stopButtonEl_ = null;\n\n\n/**\n * Reference to the log element.\n * @type {?Element}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.logEl_ = null;\n\n\n/**\n * Reference to the report element.\n * @type {?Element}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.reportEl_ = null;\n\n\n/**\n * Reference to the stats element.\n * @type {?Element}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.statsEl_ = null;\n\n\n/**\n * Reference to the progress bar's element.\n * @type {?Element}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.progressEl_ = null;\n\n\n/**\n * Reference to the progress bar's inner row element.\n * @type {?HTMLTableRowElement}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.progressRow_ = null;\n\n\n/**\n * Reference to the log tab.\n * @type {?Element}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.logTabEl_ = null;\n\n\n/**\n * Reference to the report tab.\n * @type {?Element}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.reportTabEl_ = null;\n\n\n/**\n * Reference to the stats tab.\n * @type {?Element}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.statsTabEl_ = null;\n\n\n/**\n * The number of tests to run at a time.\n * @type {number}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.poolSize_ = 1;\n\n\n/**\n * The size of the stats bucket for the number of files loaded histogram.\n * @type {number}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.numFilesStatsBucketSize_ = 20;\n\n\n/**\n * The size of the stats bucket in ms for the run time histogram.\n * @type {number}\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.runTimeStatsBucketSize_ = 500;\n\n\n/**\n * Sets the name for the test suite.\n * @param {string} name The suite's name.\n * @return {!goog.testing.MultiTestRunner} Instance for chaining.\n */\ngoog.testing.MultiTestRunner.prototype.setName = function(name) {\n  this.name_ = name;\n  return this;\n};\n\n\n/**\n * Returns the name for the test suite.\n * @return {string} The name for the test suite.\n */\ngoog.testing.MultiTestRunner.prototype.getName = function() {\n  return this.name_;\n};\n\n\n/**\n * Sets the basepath that tests added using addTests are resolved with.\n * @param {string} path The relative basepath.\n * @return {!goog.testing.MultiTestRunner} Instance for chaining.\n */\ngoog.testing.MultiTestRunner.prototype.setBasePath = function(path) {\n  this.basePath_ = path;\n  return this;\n};\n\n\n/**\n * Returns the basepath that tests added using addTests are resolved with.\n * @return {string} The basepath that tests added using addTests are resolved\n *     with.\n */\ngoog.testing.MultiTestRunner.prototype.getBasePath = function() {\n  return this.basePath_;\n};\n\n\n/**\n * Sets whether the report should contain verbose information for tests that\n * pass.\n * @param {boolean} verbose Whether report should be verbose.\n * @return {!goog.testing.MultiTestRunner} Instance for chaining.\n */\ngoog.testing.MultiTestRunner.prototype.setVerbosePasses = function(verbose) {\n  this.verbosePasses_ = verbose;\n  return this;\n};\n\n\n/**\n * Returns whether the report should contain verbose information for tests that\n * pass.\n * @return {boolean} Whether the report should contain verbose information for\n *     tests that pass.\n */\ngoog.testing.MultiTestRunner.prototype.getVerbosePasses = function() {\n  return this.verbosePasses_;\n};\n\n\n/**\n * Sets whether the report should contain passing tests at all, makes\n * setVerbosePasses obsolete.\n * @param {boolean} hide Whether report should not contain passing tests.\n * @return {!goog.testing.MultiTestRunner} Instance for chaining.\n */\ngoog.testing.MultiTestRunner.prototype.setHidePasses = function(hide) {\n  this.hidePasses_ = hide;\n  return this;\n};\n\n\n/**\n * Returns whether the report should contain passing tests at all, makes\n * setVerbosePasses obsolete.\n * @return {boolean} Whether the report should contain passing tests at all,\n *     makes setVerbosePasses obsolete.\n */\ngoog.testing.MultiTestRunner.prototype.getHidePasses = function() {\n  return this.hidePasses_;\n};\n\n\n/**\n * Sets the bucket sizes for the histograms.\n * @param {number} f Bucket size for num files loaded histogram.\n * @param {number} t Bucket size for run time histogram.\n * @return {!goog.testing.MultiTestRunner} Instance for chaining.\n */\ngoog.testing.MultiTestRunner.prototype.setStatsBucketSizes = function(f, t) {\n  this.numFilesStatsBucketSize_ = f;\n  this.runTimeStatsBucketSize_ = t;\n  return this;\n};\n\n\n/**\n * Sets the number of milliseconds to wait for the page to load, initialize and\n * run the tests.\n * @param {number} timeout Time in milliseconds.\n * @return {!goog.testing.MultiTestRunner} Instance for chaining.\n */\ngoog.testing.MultiTestRunner.prototype.setTimeout = function(timeout) {\n  this.timeoutMs_ = timeout;\n  return this;\n};\n\n\n/**\n * Returns the number of milliseconds to wait for the page to load, initialize\n * and run the tests.\n * @return {number} The number of milliseconds to wait for the page to load,\n *     initialize and run the tests.\n */\ngoog.testing.MultiTestRunner.prototype.getTimeout = function() {\n  return this.timeoutMs_;\n};\n\n\n/**\n * Sets the number of tests that can be run at the same time. This only improves\n * performance due to the amount of time spent loading the tests.\n * @param {number} size The number of tests to run at a time.\n * @return {!goog.testing.MultiTestRunner} Instance for chaining.\n */\ngoog.testing.MultiTestRunner.prototype.setPoolSize = function(size) {\n  this.poolSize_ = size;\n  return this;\n};\n\n\n/**\n * Returns the number of tests that can be run at the same time. This only\n * improves performance due to the amount of time spent loading the tests.\n * @return {number} The number of tests that can be run at the same time. This\n *     only improves performance due to the amount of time spent loading the\n *     tests.\n */\ngoog.testing.MultiTestRunner.prototype.getPoolSize = function() {\n  return this.poolSize_;\n};\n\n\n/**\n * Sets a filter function. Only test paths that match the filter function\n * will be executed.\n * @param {function(string): boolean} filterFn Filters test paths.\n * @return {!goog.testing.MultiTestRunner} Instance for chaining.\n */\ngoog.testing.MultiTestRunner.prototype.setFilterFunction = function(filterFn) {\n  this.filterFn_ = filterFn;\n  return this;\n};\n\n\n/**\n * Returns a filter function. Only test paths that match the filter function\n * will be executed.\n * @return {function(string): boolean} A filter function. Only test paths that\n *     match the filter function will be executed.\n\n */\ngoog.testing.MultiTestRunner.prototype.getFilterFunction = function() {\n  return this.filterFn_;\n};\n\n\n/**\n * Adds an array of tests to the tests that the test runner should execute.\n * @param {Array<string>} tests Adds tests to the test runner.\n * @return {!goog.testing.MultiTestRunner} Instance for chaining.\n */\ngoog.testing.MultiTestRunner.prototype.addTests = function(tests) {\n  goog.array.extend(this.allTests_, tests);\n  return this;\n};\n\n\n/**\n * Returns the list of all tests added to the runner.\n * @return {Array<string>} The list of all tests added to the runner.\n */\ngoog.testing.MultiTestRunner.prototype.getAllTests = function() {\n  return this.allTests_;\n};\n\n\n/**\n * Returns the list of tests that will be run when start() is called.\n * @return {!Array<string>} The list of tests that will be run when start() is\n *     called.\n */\ngoog.testing.MultiTestRunner.prototype.getTestsToRun = function() {\n  return goog.array.filter(this.allTests_, this.filterFn_);\n};\n\n\n/**\n * Returns a list of tests from runner that have been marked as failed.\n * @return {!Array<string>} A list of tests from runner that have been marked\n *     as failed.\n */\ngoog.testing.MultiTestRunner.prototype.getTestsThatFailed = function() {\n  var stats = this.stats_;\n  var failedTests = [];\n  if (stats) {\n    for (var i = 0, stat; stat = stats[i]; i++) {\n      if (!stat.success) {\n        failedTests.push(stat.testFile);\n      }\n    }\n  }\n  return failedTests;\n};\n\n\n/**\n * Returns a list of reports for tests that have finished since last \"start\".\n * @return {!Array<string>} A list of tests reports.\n */\ngoog.testing.MultiTestRunner.prototype.getFailureReports = function() {\n  return this.failureReports_;\n};\n\n\n/**\n * Returns list of each frame's test results.\n * @return {!Array<!Object<string,!Array<!goog.testing.TestCase.IResult>>>}\n */\ngoog.testing.MultiTestRunner.prototype.getAllTestResults = function() {\n  return this.allTestResults_;\n};\n\n\n/**\n * Deletes and re-creates the progress table inside the progess element.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.resetProgressDom_ = function() {\n  goog.dom.removeChildren(this.progressEl_);\n  var progressTable = this.dom_.createDom(goog.dom.TagName.TABLE);\n  var progressTBody = this.dom_.createDom(goog.dom.TagName.TBODY);\n  this.progressRow_ = this.dom_.createDom(goog.dom.TagName.TR);\n  for (var i = 0; i < this.activeTests_.length; i++) {\n    var progressCell = this.dom_.createDom(goog.dom.TagName.TD);\n    this.progressRow_.appendChild(progressCell);\n  }\n  progressTBody.appendChild(this.progressRow_);\n  progressTable.appendChild(progressTBody);\n  this.progressEl_.appendChild(progressTable);\n};\n\n\n/** @override */\ngoog.testing.MultiTestRunner.prototype.createDom = function() {\n  goog.testing.MultiTestRunner.superClass_.createDom.call(this);\n  var el = this.getElement();\n  el.className = goog.getCssName('goog-testrunner');\n\n  this.progressEl_ = this.dom_.createDom(goog.dom.TagName.DIV);\n  this.progressEl_.className = goog.getCssName('goog-testrunner-progress');\n  el.appendChild(this.progressEl_);\n\n  var buttons = this.dom_.createDom(goog.dom.TagName.DIV);\n  buttons.className = goog.getCssName('goog-testrunner-buttons');\n  this.startButtonEl_ =\n      this.dom_.createDom(goog.dom.TagName.BUTTON, null, 'Start');\n  this.stopButtonEl_ =\n      this.dom_.createDom(goog.dom.TagName.BUTTON, {'disabled': true}, 'Stop');\n  buttons.appendChild(this.startButtonEl_);\n  buttons.appendChild(this.stopButtonEl_);\n  el.appendChild(buttons);\n\n  this.eh_.listen(this.startButtonEl_, 'click', this.onStartClicked_);\n  this.eh_.listen(this.stopButtonEl_, 'click', this.onStopClicked_);\n\n  this.logEl_ = this.dom_.createElement(goog.dom.TagName.DIV);\n  this.logEl_.className = goog.getCssName('goog-testrunner-log');\n  el.appendChild(this.logEl_);\n\n  this.reportEl_ = this.dom_.createElement(goog.dom.TagName.DIV);\n  this.reportEl_.className = goog.getCssName('goog-testrunner-report');\n  this.reportEl_.style.display = 'none';\n  el.appendChild(this.reportEl_);\n\n  this.statsEl_ = this.dom_.createElement(goog.dom.TagName.DIV);\n  this.statsEl_.className = goog.getCssName('goog-testrunner-stats');\n  this.statsEl_.style.display = 'none';\n  el.appendChild(this.statsEl_);\n\n  this.logTabEl_ = this.dom_.createDom(goog.dom.TagName.DIV, null, 'Log');\n  this.logTabEl_.className = goog.getCssName('goog-testrunner-logtab') + ' ' +\n      goog.getCssName('goog-testrunner-activetab');\n  el.appendChild(this.logTabEl_);\n\n  this.reportTabEl_ = this.dom_.createDom(goog.dom.TagName.DIV, null, 'Report');\n  this.reportTabEl_.className = goog.getCssName('goog-testrunner-reporttab');\n  el.appendChild(this.reportTabEl_);\n\n  this.statsTabEl_ = this.dom_.createDom(goog.dom.TagName.DIV, null, 'Stats');\n  this.statsTabEl_.className = goog.getCssName('goog-testrunner-statstab');\n  el.appendChild(this.statsTabEl_);\n\n  this.eh_.listen(this.logTabEl_, 'click', this.onLogTabClicked_);\n  this.eh_.listen(this.reportTabEl_, 'click', this.onReportTabClicked_);\n  this.eh_.listen(this.statsTabEl_, 'click', this.onStatsTabClicked_);\n\n};\n\n\n/** @override */\ngoog.testing.MultiTestRunner.prototype.disposeInternal = function() {\n  goog.testing.MultiTestRunner.superClass_.disposeInternal.call(this);\n  this.tableSorter_.dispose();\n  this.eh_.dispose();\n  this.startButtonEl_ = null;\n  this.stopButtonEl_ = null;\n  this.logEl_ = null;\n  this.reportEl_ = null;\n  this.progressEl_ = null;\n  this.logTabEl_ = null;\n  this.reportTabEl_ = null;\n  this.statsTabEl_ = null;\n  this.statsEl_ = null;\n};\n\n\n/**\n * Starts executing the tests.\n */\ngoog.testing.MultiTestRunner.prototype.start = function() {\n  this.startButtonEl_.disabled = true;\n  this.stopButtonEl_.disabled = false;\n  this.stopped_ = false;\n  this.active_ = true;\n  this.finished_ = {};\n  this.activeTests_ = this.getTestsToRun();\n  this.startedCount_ = 0;\n  this.resultCount_ = 0;\n  this.passes_ = 0;\n  this.stats_ = [];\n  this.startTime_ = goog.now();\n  this.failureReports_ = [];\n\n  this.resetProgressDom_();\n  goog.dom.removeChildren(this.logEl_);\n\n  this.resetReport_();\n  this.clearStats_();\n  this.showTab_(0);\n\n  // No tests to run, finish early and return.\n  if (this.activeTests_.length == 0) {\n    this.finish_();\n    return;\n  }\n\n  // Ensure the pool isn't too big.\n  while (this.getChildCount() > this.poolSize_) {\n    this.removeChildAt(0, true).dispose();\n  }\n\n  // Start a test in each runner.\n  for (var i = 0; i < this.poolSize_; i++) {\n    if (i >= this.getChildCount()) {\n      var testFrame = new goog.testing.MultiTestRunner.TestFrame(\n          this.basePath_, this.timeoutMs_, this.verbosePasses_, this.dom_);\n      this.addChild(testFrame, true);\n    }\n    this.runNextTest_(\n        /** @type {goog.testing.MultiTestRunner.TestFrame} */\n        (this.getChildAt(i)));\n  }\n};\n\n\n/**\n * Logs a message to the log window.\n * @param {string} msg A message to log.\n */\ngoog.testing.MultiTestRunner.prototype.log = function(msg) {\n  if (msg != '.') {\n    msg = this.getTimeStamp_() + ' : ' + msg;\n  }\n\n  this.logEl_.appendChild(this.dom_.createDom(goog.dom.TagName.DIV, null, msg));\n\n  // Autoscroll if we're near the bottom.\n  var top = this.logEl_.scrollTop;\n  var height = /** @type {!HTMLElement} */ (this.logEl_).scrollHeight -\n      /** @type {!HTMLElement} */ (this.logEl_).offsetHeight;\n  if (top == 0 || top > height - 50) {\n    this.logEl_.scrollTop = height;\n  }\n};\n\n\n/**\n * Processes a result returned from a TestFrame.  If there are tests remaining\n * it will trigger the next one to be run, otherwise if there are no tests and\n * all results have been received then it will call finish.\n * @param {goog.testing.MultiTestRunner.TestFrame} frame The frame that just\n *     finished.\n */\ngoog.testing.MultiTestRunner.prototype.processResult = function(frame) {\n  var success = frame.isSuccess();\n  var report = frame.getReport();\n  var test = frame.getTestFile();\n  var stats = frame.getStats();\n\n  if (!stats.success) {\n    this.failureReports_.push(report);\n  }\n\n  this.allTestResults_.push(frame.getTestResults());\n  this.stats_.push(/** @type {?} */ (stats));\n  this.finished_[test] = true;\n\n  var prefix = success ? '' : '*** FAILURE *** ';\n  this.log(\n      prefix + this.trimFileName_(test) + ' : ' +\n      (success ? 'Passed' : 'Failed'));\n\n  this.resultCount_++;\n\n  if (success) {\n    this.passes_++;\n  }\n\n  this.drawProgressSegment_(test, success);\n  this.writeCurrentSummary_();\n  if (!(success && this.hidePasses_)) {\n    this.drawTestResult_(test, success, report);\n  }\n\n  if (!this.stopped_ && this.startedCount_ < this.activeTests_.length) {\n    this.runNextTest_(frame);\n  } else if (this.resultCount_ == this.activeTests_.length) {\n    this.finish_();\n  }\n};\n\n\n/**\n * Runs the next available test, if there are any left.\n * @param {goog.testing.MultiTestRunner.TestFrame} frame Where to run the test.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.runNextTest_ = function(frame) {\n  if (this.startedCount_ < this.activeTests_.length) {\n    var nextTest = this.activeTests_[this.startedCount_++];\n    this.log(this.trimFileName_(nextTest) + ' : Loading');\n    frame.runTest(nextTest);\n  }\n};\n\n\n/**\n * Handles the test finishing, processing the results and rendering the report.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.finish_ = function() {\n  if (this.stopped_) {\n    this.log('Stopped');\n  } else {\n    this.log('Finished');\n  }\n\n  this.startButtonEl_.disabled = false;\n  this.stopButtonEl_.disabled = true;\n  this.active_ = false;\n\n  this.showTab_(1);\n  this.drawStats_();\n\n  // Remove all the test frames\n  while (this.getChildCount() > 0) {\n    this.removeChildAt(0, true).dispose();\n  }\n\n  // Compute tests that did not finish before the stop button was hit.\n  var unfinished = [];\n  for (var i = 0; i < this.activeTests_.length; i++) {\n    var test = this.activeTests_[i];\n    if (!this.finished_[test]) {\n      unfinished.push(test);\n    }\n  }\n\n  if (unfinished.length) {\n    this.reportEl_.appendChild(\n        goog.dom.createDom(\n            goog.dom.TagName.PRE, undefined,\n            'These tests did not finish:\\n' + unfinished.join('\\n')));\n  }\n\n  this.dispatchEvent({\n    'type': goog.testing.MultiTestRunner.TESTS_FINISHED,\n    'allTestResults': this.getAllTestResults()\n  });\n};\n\n\n/**\n * Resets the report, clearing out all children and drawing the initial summary.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.resetReport_ = function() {\n  goog.dom.removeChildren(this.reportEl_);\n  var summary = this.dom_.createDom(goog.dom.TagName.DIV);\n  summary.className = goog.getCssName('goog-testrunner-progress-summary');\n  this.reportEl_.appendChild(summary);\n  this.writeCurrentSummary_();\n};\n\n\n/**\n * Draws the stats for the test run.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.drawStats_ = function() {\n  this.drawFilesHistogram_();\n\n  // Only show time stats if pool size is 1, otherwise times are wrong.\n  if (this.poolSize_ == 1) {\n    this.drawRunTimePie_();\n    this.drawTimeHistogram_();\n  }\n\n  this.drawWorstTestsTable_();\n};\n\n\n/**\n * Draws the histogram showing number of files loaded.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.drawFilesHistogram_ = function() {\n  this.drawStatsHistogram_(\n      'numFilesLoaded', this.numFilesStatsBucketSize_, goog.functions.identity,\n      500,\n      'Histogram showing distribution of\\nnumber of files loaded per test');\n};\n\n\n/**\n * Draws the histogram showing how long each test took to complete.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.drawTimeHistogram_ = function() {\n  this.drawStatsHistogram_(\n      'totalTime', this.runTimeStatsBucketSize_,\n      function(x) { return x / 1000; }, 500,\n      'Histogram showing distribution of\\ntime spent running tests in s');\n};\n\n\n/**\n * Draws a stats histogram.\n * @param {string} statsField Field of the stats object to graph.\n * @param {number} bucketSize The size for the histogram's buckets.\n * @param {function(number, ...*): *} valueTransformFn Function for\n *     transforming the x-labels value for display.\n * @param {number} width The width in pixels of the graph.\n * @param {string} title The graph's title.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.drawStatsHistogram_ = function(\n    statsField, bucketSize, valueTransformFn, width, title) {\n\n  var hist = {}, data = [], xlabels = [], ylabels = [];\n  var max = 0;\n  for (var i = 0; i < this.stats_.length; i++) {\n    var num = this.stats_[i][statsField];\n    var bucket = Math.floor(num / bucketSize) * bucketSize;\n    if (bucket > max) {\n      max = bucket;\n    }\n    if (!hist[bucket]) {\n      hist[bucket] = 1;\n    } else {\n      hist[bucket]++;\n    }\n  }\n  var maxBucketSize = 0;\n  for (var i = 0; i <= max; i += bucketSize) {\n    xlabels.push(valueTransformFn(i));\n    var count = hist[i] || 0;\n    if (count > maxBucketSize) {\n      maxBucketSize = count;\n    }\n    data.push(count);\n  }\n  var diff = Math.max(1, Math.ceil(maxBucketSize / 10));\n  for (var i = 0; i <= maxBucketSize; i += diff) {\n    ylabels.push(i);\n  }\n  var chart = new goog.ui.ServerChart(\n      goog.ui.ServerChart.ChartType.VERTICAL_STACKED_BAR, width, 250, null,\n      goog.ui.ServerChart.CHART_SERVER_HTTPS_URI);\n  chart.setTitle(title);\n  chart.addDataSet(data, 'ff9900');\n  chart.setLeftLabels(ylabels);\n  chart.setGridY(ylabels.length - 1);\n  chart.setXLabels(xlabels);\n  chart.render(this.statsEl_);\n};\n\n\n/**\n * Draws a pie chart showing the percentage of time spent running the tests\n * compared to loading them etc.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.drawRunTimePie_ = function() {\n  var totalTime = 0, runTime = 0;\n  for (var i = 0; i < this.stats_.length; i++) {\n    var stat = this.stats_[i];\n    totalTime += stat.totalTime;\n    runTime += stat.runTime;\n  }\n  var loadTime = totalTime - runTime;\n  var pie = new goog.ui.ServerChart(\n      goog.ui.ServerChart.ChartType.PIE, 500, 250, null,\n      goog.ui.ServerChart.CHART_SERVER_HTTPS_URI);\n  pie.setMinValue(0);\n  pie.setMaxValue(totalTime);\n  pie.addDataSet([runTime, loadTime], 'ff9900');\n  pie.setXLabels(\n      ['Test execution (' + runTime + 'ms)', 'Loading (' + loadTime + 'ms)']);\n  pie.render(this.statsEl_);\n};\n\n\n/**\n * Draws a pie chart showing the percentage of time spent running the tests\n * compared to loading them etc.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.drawWorstTestsTable_ = function() {\n  this.stats_.sort(function(a, b) {\n    return b['numFilesLoaded'] - a['numFilesLoaded'];\n  });\n\n  var tbody = goog.bind(this.dom_.createDom, this.dom_, 'tbody');\n  var thead = goog.bind(this.dom_.createDom, this.dom_, 'thead');\n  var tr = goog.bind(this.dom_.createDom, this.dom_, 'tr');\n  var th = goog.bind(this.dom_.createDom, this.dom_, 'th');\n  var td = goog.bind(this.dom_.createDom, this.dom_, 'td');\n  var a = goog.bind(this.dom_.createDom, this.dom_, 'a');\n\n  var head = thead(\n      {'style': 'cursor: pointer'},\n      tr(null, th(null, ' '), th(null, 'Test file'),\n         th('center', 'Num files loaded'), th('center', 'Run time (ms)'),\n         th('center', 'Total time (ms)')));\n  var body = tbody();\n  var table = this.dom_.createDom(goog.dom.TagName.TABLE, null, head, body);\n\n  for (var i = 0; i < this.stats_.length; i++) {\n    var stat = this.stats_[i];\n    body.appendChild(\n        tr(null, td('center', String(i + 1)),\n           td(null,\n              a({'href': this.basePath_ + stat['testFile'], 'target': '_blank'},\n                stat['testFile'])),\n           td('center', String(stat['numFilesLoaded'])),\n           td('center', String(stat['runTime'])),\n           td('center', String(stat['totalTime']))));\n  }\n\n  this.statsEl_.appendChild(table);\n\n  this.tableSorter_.setDefaultSortFunction(goog.ui.TableSorter.numericSort);\n  this.tableSorter_.setSortFunction(\n      1 /* test file name */, goog.ui.TableSorter.alphaSort);\n  this.tableSorter_.decorate(table);\n};\n\n\n/**\n * Clears the stats page.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.clearStats_ = function() {\n  goog.dom.removeChildren(this.statsEl_);\n  this.tableSorter_.exitDocument();\n};\n\n\n/**\n * Updates the report's summary.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.writeCurrentSummary_ = function() {\n  var total = this.activeTests_.length;\n  var executed = this.resultCount_;\n  var passes = this.passes_;\n  var duration = Math.round((goog.now() - this.startTime_) / 1000);\n  var text = executed + ' of ' + total + ' tests executed.<br>' + passes +\n      ' passed, ' + (executed - passes) + ' failed.<br>' +\n      'Duration: ' + duration + 's.';\n  goog.dom.getFirstElementChild(this.reportEl_).innerHTML = text;\n};\n\n\n/**\n * Adds a segment to the progress bar.\n * @param {string} title Title for the segment.\n * @param {*} success Whether the segment should indicate a success.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.drawProgressSegment_ = function(\n    title, success) {\n  var part = this.progressRow_.cells[this.resultCount_ - 1];\n  part.title = title + ' : ' + (success ? 'SUCCESS' : 'FAILURE');\n  part.style.backgroundColor = success ? '#090' : '#900';\n};\n\n\n/**\n * Draws a test result in the report pane.\n * @param {string} test Test name.\n * @param {*} success Whether the test succeeded.\n * @param {string} report The report.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.drawTestResult_ = function(\n    test, success, report) {\n  var text = goog.string.isEmptyOrWhitespace(report) ?\n      'No report for ' + test + '\\n' :\n      report;\n  var el = this.dom_.createDom(goog.dom.TagName.DIV);\n  text = goog.string.htmlEscape(text).replace(/\\n/g, '<br>');\n  if (success) {\n    el.className = goog.getCssName('goog-testrunner-report-success');\n  } else {\n    text += '<a href=\"' + this.basePath_ + test +\n        '\">Run individually &raquo;</a><br>&nbsp;';\n    el.className = goog.getCssName('goog-testrunner-report-failure');\n  }\n  el.innerHTML = text;\n  this.reportEl_.appendChild(el);\n};\n\n\n/**\n * Returns the current timestamp.\n * @return {string} HH:MM:SS.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.getTimeStamp_ = function() {\n  var d = new Date;\n  return goog.string.padNumber(d.getHours(), 2) + ':' +\n      goog.string.padNumber(d.getMinutes(), 2) + ':' +\n      goog.string.padNumber(d.getSeconds(), 2);\n};\n\n\n/**\n * Trims a filename to be less than 35-characters, ensuring that we do not break\n * a path part.\n * @param {string} name The file name.\n * @return {string} The shortened name.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.trimFileName_ = function(name) {\n  if (name.length < 35) {\n    return name;\n  }\n  var parts = name.split('/');\n  var result = '';\n  while (result.length < 35 && parts.length > 0) {\n    result = '/' + parts.pop() + result;\n  }\n  return '...' + result;\n};\n\n\n/**\n * Shows the report and hides the log if the argument is true.\n * @param {number} tab Which tab to show.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.showTab_ = function(tab) {\n  var activeTabCssClass = goog.getCssName('goog-testrunner-activetab');\n\n  var logTabElement = goog.asserts.assert(this.logTabEl_);\n  var reportTabElement = goog.asserts.assert(this.reportTabEl_);\n  var statsTabElement = goog.asserts.assert(this.statsTabEl_);\n\n  if (tab == 0) {\n    this.logEl_.style.display = '';\n    goog.dom.classlist.add(logTabElement, activeTabCssClass);\n  } else {\n    this.logEl_.style.display = 'none';\n    goog.dom.classlist.remove(logTabElement, activeTabCssClass);\n  }\n\n  if (tab == 1) {\n    this.reportEl_.style.display = '';\n    goog.dom.classlist.add(reportTabElement, activeTabCssClass);\n  } else {\n    this.reportEl_.style.display = 'none';\n    goog.dom.classlist.remove(reportTabElement, activeTabCssClass);\n  }\n\n  if (tab == 2) {\n    this.statsEl_.style.display = '';\n    goog.dom.classlist.add(statsTabElement, activeTabCssClass);\n  } else {\n    this.statsEl_.style.display = 'none';\n    goog.dom.classlist.remove(statsTabElement, activeTabCssClass);\n  }\n};\n\n\n/**\n * Handles the start button being clicked.\n * @param {goog.events.BrowserEvent} e The click event.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.onStartClicked_ = function(e) {\n  this.start();\n};\n\n\n/**\n * Handles the stop button being clicked.\n * @param {goog.events.BrowserEvent} e The click event.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.onStopClicked_ = function(e) {\n  this.stopped_ = true;\n  this.finish_();\n};\n\n\n/**\n * Handles the log tab being clicked.\n * @param {goog.events.BrowserEvent} e The click event.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.onLogTabClicked_ = function(e) {\n  this.showTab_(0);\n};\n\n\n/**\n * Handles the log tab being clicked.\n * @param {goog.events.BrowserEvent} e The click event.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.onReportTabClicked_ = function(e) {\n  this.showTab_(1);\n};\n\n\n/**\n * Handles the stats tab being clicked.\n * @param {goog.events.BrowserEvent} e The click event.\n * @private\n */\ngoog.testing.MultiTestRunner.prototype.onStatsTabClicked_ = function(e) {\n  this.showTab_(2);\n};\n\n\n\n/**\n * Class used to manage the interaction with a single iframe.\n * @param {string} basePath The base path for tests.\n * @param {number} timeoutMs The time to wait for the test to load and run.\n * @param {boolean} verbosePasses Whether to show results for passes.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional dom helper.\n * @constructor\n * @extends {goog.ui.Component}\n * @final\n */\ngoog.testing.MultiTestRunner.TestFrame = function(\n    basePath, timeoutMs, verbosePasses, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  /**\n   * Base path where tests should be resolved from.\n   * @type {string}\n   * @private\n   */\n  this.basePath_ = basePath;\n\n  /**\n   * The timeout for the test.\n   * @type {number}\n   * @private\n   */\n  this.timeoutMs_ = timeoutMs;\n\n  /**\n   * Whether to show a summary for passing tests.\n   * @type {boolean}\n   * @private\n   */\n  this.verbosePasses_ = verbosePasses;\n\n  /**\n   * An event handler for handling events.\n   * @type {goog.events.EventHandler<!goog.testing.MultiTestRunner.TestFrame>}\n   * @private\n   */\n  this.eh_ = new goog.events.EventHandler(this);\n\n  /**\n   * Object to hold test results. Key is test method or file name (depending on\n   * failure mode) and the value is an array of failure messages.\n   * @private {!Object<string,!Array<!goog.testing.TestCase.IResult>>}\n   */\n  this.testResults_ = {};\n};\ngoog.inherits(goog.testing.MultiTestRunner.TestFrame, goog.ui.Component);\n\n\n/**\n * Reference to the iframe.\n * @type {?HTMLIFrameElement}\n * @private\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.iframeEl_ = null;\n\n\n/**\n * Whether the iframe for the current test has loaded.\n * @type {boolean}\n * @private\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.iframeLoaded_ = false;\n\n\n/**\n * The test file being run.\n * @type {string}\n * @private\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.testFile_ = '';\n\n\n/**\n * The report returned from the test.\n * @type {string}\n * @private\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.report_ = '';\n\n\n/**\n * The total time loading and running the test in milliseconds.\n * @type {number}\n * @private\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.totalTime_ = 0;\n\n\n/**\n * The actual runtime of the test in milliseconds.\n * @type {number}\n * @private\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.runTime_ = 0;\n\n\n/**\n * The number of files loaded by the test.\n * @type {number}\n * @private\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.numFilesLoaded_ = 0;\n\n\n/**\n * Whether the test was successful, null if no result has been returned yet.\n * @type {?boolean}\n * @private\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.isSuccess_ = null;\n\n\n/**\n * Timestamp for the when the test was started.\n * @type {number}\n * @private\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.startTime_ = 0;\n\n\n/**\n * Timestamp for the last state, used to determine timeouts.\n * @type {number}\n * @private\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.lastStateTime_ = 0;\n\n\n/**\n * The state of the active test.\n * @type {number}\n * @private\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.currentState_ = 0;\n\n\n/** @override */\ngoog.testing.MultiTestRunner.TestFrame.prototype.disposeInternal = function() {\n  goog.testing.MultiTestRunner.TestFrame.superClass_.disposeInternal.call(this);\n  this.dom_.removeNode(this.iframeEl_);\n  this.eh_.dispose();\n  this.iframeEl_ = null;\n};\n\n\n/**\n * Runs a test file in this test frame.\n * @param {string} testFile The test to run.\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.runTest = function(testFile) {\n  this.lastStateTime_ = this.startTime_ = goog.now();\n\n  if (!this.iframeEl_) {\n    this.createIframe_();\n  }\n\n  this.iframeLoaded_ = false;\n  this.currentState_ = 0;\n  this.isSuccess_ = null;\n  this.report_ = '';\n  this.testResults_ = {};\n  this.testFile_ = testFile;\n\n  try {\n    this.iframeEl_.src = this.basePath_ + testFile;\n  } catch (e) {\n    // Failures will trigger a JS exception on the local file system.\n    this.report_ = this.testFile_ + ' failed to load : ' + e.message;\n    this.isSuccess_ = false;\n    this.finish_();\n    return;\n  }\n\n  this.checkForCompletion_();\n};\n\n\n/**\n * @return {string} The test file the TestFrame is running.\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.getTestFile = function() {\n  return this.testFile_;\n};\n\n\n/**\n * @return {!goog.testing.MultiTestRunner.StatsType_} Stats about the test run.\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.getStats = function() {\n  return {\n    'testFile': this.testFile_,\n    'success': this.isSuccess_,\n    'runTime': this.runTime_,\n    'totalTime': this.totalTime_,\n    'numFilesLoaded': this.numFilesLoaded_\n  };\n};\n\n\n/**\n * @return {string} The report for the test run.\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.getReport = function() {\n  return this.report_;\n};\n\n\n/**\n * @return {!Object<string,!Array<!goog.testing.TestCase.IResult>>} The results\n *     per individual test in the file. Key is the test filename concatenated\n *     with the test name, and the array holds failures.\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.getTestResults = function() {\n  var results = {};\n  for (var testName in this.testResults_) {\n    var testKey = this.testFile_.replace(/\\.html$/, '');\n    // Concatenate with \":<testName>\" unless the testName is equivalent to\n    // testFile_, which means the test timed out or had no test methods and\n    // there's no way to get the test method name.\n    if (testName != this.testFile_) {\n      testKey += ':' + testName;\n    }\n    results[testKey] = this.testResults_[testName];\n  }\n  return results;\n};\n\n\n/**\n * @return {?boolean} Whether the test frame had a success.\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.isSuccess = function() {\n  return this.isSuccess_;\n};\n\n\n/**\n * Handles the TestFrame finishing a single test.\n * @private\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.finish_ = function() {\n  this.totalTime_ = goog.now() - this.startTime_;\n  var parent = this.getParent();\n  if (parent instanceof goog.testing.MultiTestRunner) {\n    parent.processResult(this);\n  }\n};\n\n\n/**\n * Creates an iframe to run the tests in.  For overriding in unit tests.\n * @private\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.createIframe_ = function() {\n  this.iframeEl_ = this.dom_.createDom(goog.dom.TagName.IFRAME);\n  this.getElement().appendChild(this.iframeEl_);\n  this.eh_.listen(this.iframeEl_, 'load', this.onIframeLoaded_);\n};\n\n\n/**\n * Handles the iframe loading.\n * @param {goog.events.BrowserEvent} e The load event.\n * @private\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.onIframeLoaded_ = function(e) {\n  this.iframeLoaded_ = true;\n};\n\n\n/**\n * Checks the active test for completion, keeping track of the tests' various\n * execution stages.\n * @private\n */\ngoog.testing.MultiTestRunner.TestFrame.prototype.checkForCompletion_ =\n    function() {\n  var js = goog.dom.getFrameContentWindow(this.iframeEl_);\n  switch (this.currentState_) {\n    case 0:\n      if (this.iframeLoaded_ && js['G_testRunner']) {\n        this.lastStateTime_ = goog.now();\n        this.currentState_++;\n      }\n      break;\n    case 1:\n      if (js['G_testRunner']['isInitialized']()) {\n        this.lastStateTime_ = goog.now();\n        this.currentState_++;\n      }\n      break;\n    case 2:\n      if (js['G_testRunner']['isFinished']()) {\n        var tr = js['G_testRunner'];\n        this.isSuccess_ = tr['isSuccess']();\n        this.report_ = tr['getReport'](this.verbosePasses_);\n        this.testResults_ = tr['getTestResults']();\n        // If there is a syntax error, or no tests, it's not possible to get the\n        // individual test method results from TestCase. So just create one here\n        // based on the test report and filename.\n        if (goog.object.isEmpty(this.testResults_)) {\n          // Existence of a report is a signal of a test failure by the test\n          // runner.\n          this.testResults_[this.testFile_] = this.isSuccess_ ? [] : [{\n            'message': this.report_,\n            'source': this.testFile_,\n            'stacktrace': ''\n          }];\n        }\n        this.runTime_ = tr['getRunTime']();\n        this.numFilesLoaded_ = tr['getNumFilesLoaded']();\n        this.finish_();\n        return;\n      }\n  }\n\n  // Check to see if the test has timed out.\n  if (goog.now() - this.lastStateTime_ > this.timeoutMs_) {\n    this.report_ = this.testFile_ + ' timed out  ' +\n        goog.testing.MultiTestRunner.STATES[this.currentState_];\n    this.testResults_[this.testFile_] =\n        [{'message': this.report_, 'source': this.testFile_, 'stacktrace': ''}];\n    this.isSuccess_ = false;\n    this.finish_();\n    return;\n  }\n\n  // Check again in 100ms.\n  goog.Timer.callOnce(this.checkForCompletion_, 100, this);\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","^JN","^M5","^M:","^N=","^KP","^K7","^LC","^IT","^KS","~$goog.ui.TableSorter","~$goog.testing.TestCase","~$goog.ui.ServerChart","^JJ","^JT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/multitestrunner.js"],"^JD",["^J4",["~$goog.testing.MultiTestRunner","~$goog.testing.MultiTestRunner.TestFrame"]],"^IR",true,"^IS",["^IT","^M:","^JJ","^JF","^JN","^JT","^KP","^M5","^N=","^KS","^K7","^N@","^LC","^NA","^N?"]],["^ ","^IV",[1579837703000],"^IW","goog.net.streams.nodereadablestream.js","^IX",["^IY","goog/net/streams/nodereadablestream.js"],"^IZ","goog/net/streams/nodereadablestream.js","^I[","^J0","^J1","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview the API spec for the closure polyfill of Node stream.Readable.\n *\n * Node streams API is specified at https://nodejs.org/api/stream.html\n *\n * Only a subset of Node streams API (under the object mode) will be supported.\n *\n * It's our belief that Node and whatwg streams will eventually\n * converge. As it happens, we will add a whatwg streams polyfill too.\n * (https://github.com/whatwg/streams)\n *\n * This API requires no special server-side support other than the standard\n * HTTP semantics. Message framing only relies on MIME types such as JSON\n * to support atomic message delivery (e.g. elements of a JSON array).\n * Other streaming-related features such as cancellation and keep-alive are\n * exposed/constrained by the Node streams API semantics.\n *\n * Flow-control support is limited due to the underlying use of XHR. That is,\n * this version will assume the \"flowing mode\", and the read method is not\n * provided.\n *\n */\n\ngoog.provide('goog.net.streams.NodeReadableStream');\n\n\n\n/**\n * This interface represents a readable stream.\n *\n * @interface\n */\ngoog.net.streams.NodeReadableStream = function() {};\n\n\n/**\n * Read events for the stream.\n * @enum {string}\n */\ngoog.net.streams.NodeReadableStream.EventType = {\n  READABLE: 'readable',\n  DATA: 'data',\n  END: 'end',\n  CLOSE: 'close',\n  ERROR: 'error'\n};\n\n\n/**\n * Register a callback to handle I/O events.\n *\n * See https://iojs.org/api/events.html\n *\n * Note that under the object mode, an event of DATA will deliver a message\n * of 1) JSON compliant JS object, including arrays; or 2) an ArrayBuffer.\n *\n * Ordering: messages will be delivered to callbacks in their registration\n * order. There is no ordering between on() and once() callbacks.\n *\n * Exceptions from callbacks will be caught and ignored.\n *\n * @param {string} eventType The event type\n * @param {function(!Object=)} callback The call back to handle the event with\n * an optional input object\n * @return {goog.net.streams.NodeReadableStream} this object\n */\ngoog.net.streams.NodeReadableStream.prototype.on = goog.abstractMethod;\n\n\n/**\n * Register a callback to handle I/O events. This is an alias to on().\n *\n * @param {string} eventType The event type\n * @param {function(!Object=)} callback The call back to handle the event with\n * an optional input object\n * @return {goog.net.streams.NodeReadableStream} this object\n */\ngoog.net.streams.NodeReadableStream.prototype.addListener = goog.abstractMethod;\n\n\n/**\n * Unregister an existing callback, including one-time callbacks.\n *\n * @param {string} eventType The event type\n * @param {function(!Object=)} callback The call back to unregister\n * @return {goog.net.streams.NodeReadableStream} this object\n */\ngoog.net.streams.NodeReadableStream.prototype.removeListener =\n    goog.abstractMethod;\n\n\n/**\n * Register a one-time callback to handle I/O events.\n *\n * @param {string} eventType The event type\n * @param {function(!Object=)} callback The call back to handle the event with\n * an optional input object\n * @return {goog.net.streams.NodeReadableStream} this object\n */\ngoog.net.streams.NodeReadableStream.prototype.once = goog.abstractMethod;\n","^J2",1579837703000,"^J3",["^J4",["^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/streams/nodereadablestream.js"],"^JD",["^J4",["~$goog.net.streams.NodeReadableStream"]],"^IR",true,"^IS",["^IT"]],["^ ","^IV",[1579837703000],"^IW","goog.ui.filterobservingmenuitemrenderer.js","^IX",["^IY","goog/ui/filterobservingmenuitemrenderer.js"],"^IZ","goog/ui/filterobservingmenuitemrenderer.js","^I[","^J0","^J1","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Menu item observing the filter text in a\n * {@link goog.ui.FilteredMenu}. The observer method is called when the filter\n * text changes and allows the menu item to update its content and state based\n * on the filter.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.ui.FilterObservingMenuItemRenderer');\n\ngoog.require('goog.ui.MenuItemRenderer');\n\n\n\n/**\n * Default renderer for {@link goog.ui.FilterObservingMenuItem}s. Each item has\n * the following structure:\n *\n *    <div class=\"goog-filterobsmenuitem\"><div>...(content)...</div></div>\n *\n * @constructor\n * @extends {goog.ui.MenuItemRenderer}\n * @final\n */\ngoog.ui.FilterObservingMenuItemRenderer = function() {\n  goog.ui.MenuItemRenderer.call(this);\n};\ngoog.inherits(\n    goog.ui.FilterObservingMenuItemRenderer, goog.ui.MenuItemRenderer);\ngoog.addSingletonGetter(goog.ui.FilterObservingMenuItemRenderer);\n\n\n/**\n * CSS class name the renderer applies to menu item elements.\n * @type {string}\n */\ngoog.ui.FilterObservingMenuItemRenderer.CSS_CLASS =\n    goog.getCssName('goog-filterobsmenuitem');\n\n\n/**\n * Returns the CSS class to be applied to menu items rendered using this\n * renderer.\n * @return {string} Renderer-specific CSS class.\n * @override\n */\ngoog.ui.FilterObservingMenuItemRenderer.prototype.getCssClass = function() {\n  return goog.ui.FilterObservingMenuItemRenderer.CSS_CLASS;\n};\n","^J2",1579837703000,"^J3",["^J4",["^IT","~$goog.ui.MenuItemRenderer"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/filterobservingmenuitemrenderer.js"],"^JD",["^J4",["~$goog.ui.FilterObservingMenuItemRenderer"]],"^IR",true,"^IS",["^IT","^NE"]],["^ ","^IV",[1579837703000],"^L4",true,"^IW","goog.test_module.js","^IX",["^IY","goog/test_module.js"],"^IZ","goog/test_module.js","^I[","^J0","^J1","// Copyright 2014 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A test file for testing goog.module.\n * @suppress {unusedLocalVariables}\n */\n\ngoog.module('goog.test_module');\ngoog.module.declareLegacyNamespace();\ngoog.setTestOnly('goog.test_module');\n\n\n/** @suppress {extraRequire} */\nvar testModuleDep = goog.require('goog.test_module_dep');\n\n// Verify that when this module loads the script tag in the next\n// line doesn't cause the script tag it is loaded in to be closed\n// prematurely.\nvar aScriptTagShouldntBreakAnything = '<script>hello</script>world';\n\n\n\n/** @constructor */\nvar test = function() {};\n\n// Verify that when this module loads the script tag is not modified by\n// escaping code in base.js.\ntest.CLOSING_SCRIPT_TAG = '</script>';\n\nexports = test;\n","^J2",1579837703000,"^J3",["^J4",["~$goog.test-module-dep","^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/test_module.js"],"^JD",["^J4",["~$goog.test_module","~$goog.test-module"]],"^IR",true,"^IS",["^IT","^NG"]],["^ ","^IV",[1579837703000],"^L4",true,"^IW","goog.html.sanitizer.noclobber.js","^IX",["^IY","goog/html/sanitizer/noclobber.js"],"^IZ","goog/html/sanitizer/noclobber.js","^I[","^J0","^J1","// Copyright 2017 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Utility DOM functions resistant to DOM clobbering. Clobbering\n * resistance is offered as a best-effort feature -- it is not available on\n * older browsers such as IE <10, Chrome <43, etc. In some cases, we can at\n * least detect clobbering attempts and abort. Note that this is not intended to\n * be a general-purpose library -- it is only used by the HTML sanitizer to\n * accept and sanitize clobbered input. If your projects needs to protect\n * against clobbered content, consider using the HTML sanitizer and configuring\n * it to defuse clobbering by prefixing all element ids and names in the\n * output.\n * @supported Unless specified in the method documentation, IE 10 and newer.\n */\n\ngoog.module('goog.html.sanitizer.noclobber');\ngoog.module.declareLegacyNamespace();\n\nvar NodeType = goog.require('goog.dom.NodeType');\nvar googAsserts = goog.require('goog.asserts');\nvar userAgentProduct = goog.require('goog.userAgent.product');\n\n/**\n * Note about browser support:\n * - IE 8 and 9 don't have DOM prototypes. There is no simple way of saving\n *   the methods and accessors for a clobber-safe call.\n * - Chrome <43 doesn't have attributes on DOM prototypes, so there is no way of\n *   making clobber-safe calls for attribute descriptors.\n * - IE 8 and 9 don't even have Node and HTMLElement, so there is no\n *   straightforward way of checking if the result was clobbered for many of the\n *   methods.\n * - IE 8 and 9 have alternate names for getPropertyValue/setProperty in\n *   CSSStyleDeclaration.\n * For simplicity, we don't support IE 8 and 9 for anything but the CSS methods\n * which already had IE8 and IE9 support. Chrome 41 must still be supported.\n */\n\n/**\n * Shorthand for `Object.getOwnPropertyDescriptor(...).get` to improve\n * readability during initialization of `Methods`.\n * @param {string} className\n * @param {string} property\n * @return {?Function}\n */\nfunction getterOrNull(className, property) {\n  var ctor = goog.global[className];\n  if (!ctor || !ctor.prototype) {\n    return null;\n  }\n  var descriptor = Object.getOwnPropertyDescriptor(ctor.prototype, property);\n  return (descriptor && descriptor.get) || null;\n}\n\n/**\n * Shorthand for `DOMInterface.prototype.method` to improve readability\n * during initialization of `Methods`.\n * @param {string} className\n * @param {string} method\n * @return {?Function}\n */\nfunction prototypeMethodOrNull(className, method) {\n  var ctor = goog.global[className];\n  return (ctor && ctor.prototype && ctor.prototype[method]) || null;\n}\n\n// Functions we use to avoid looking up the prototypes and the descriptors\n// multiple times.\n/** @const @enum {?Function} */\nvar Methods = {\n  ATTRIBUTES_GETTER: getterOrNull('Element', 'attributes') ||\n      // Edge and IE10 define this Element property on Node instead of\n      // Element.\n      getterOrNull('Node', 'attributes'),\n  HAS_ATTRIBUTE: prototypeMethodOrNull('Element', 'hasAttribute'),\n  GET_ATTRIBUTE: prototypeMethodOrNull('Element', 'getAttribute'),\n  SET_ATTRIBUTE: prototypeMethodOrNull('Element', 'setAttribute'),\n  REMOVE_ATTRIBUTE: prototypeMethodOrNull('Element', 'removeAttribute'),\n  INNER_HTML_GETTER: getterOrNull('Element', 'innerHTML') ||\n      // IE 10 defines this Element property on HTMLElement.\n      getterOrNull('HTMLElement', 'innerHTML'),\n  GET_ELEMENTS_BY_TAG_NAME:\n      prototypeMethodOrNull('Element', 'getElementsByTagName'),\n  MATCHES: prototypeMethodOrNull('Element', 'matches') ||\n      prototypeMethodOrNull('Element', 'msMatchesSelector'),\n  NODE_NAME_GETTER: getterOrNull('Node', 'nodeName'),\n  NODE_TYPE_GETTER: getterOrNull('Node', 'nodeType'),\n  PARENT_NODE_GETTER: getterOrNull('Node', 'parentNode'),\n  CHILD_NODES_GETTER: getterOrNull('Node', 'childNodes'),\n  APPEND_CHILD: prototypeMethodOrNull('Node', 'appendChild'),\n  STYLE_GETTER: getterOrNull('HTMLElement', 'style') ||\n      // Safari 10 defines the property on Element instead of\n      // HTMLElement.\n      getterOrNull('Element', 'style'),\n  SHEET_GETTER: getterOrNull('HTMLStyleElement', 'sheet'),\n  GET_PROPERTY_VALUE:\n      prototypeMethodOrNull('CSSStyleDeclaration', 'getPropertyValue'),\n  SET_PROPERTY: prototypeMethodOrNull('CSSStyleDeclaration', 'setProperty')\n};\n\n/**\n * Calls the provided DOM property descriptor and returns its result. If the\n * descriptor is not available, use fallbackPropertyName to get the property\n * value in a clobber-vulnerable way, and use fallbackTest to check if the\n * property was clobbered, throwing an exception if so.\n * @param {?Function} fn\n * @param {*} object\n * @param {string} fallbackPropertyName\n * @param {function(*):boolean} fallbackTest\n * @return {?}\n */\nfunction genericPropertyGet(fn, object, fallbackPropertyName, fallbackTest) {\n  if (fn) {\n    return fn.apply(object);\n  }\n  var propertyValue = object[fallbackPropertyName];\n  if (!fallbackTest(propertyValue)) {\n    throw new Error('Clobbering detected');\n  }\n  return propertyValue;\n}\n\n/**\n * Calls the provided DOM prototype method and returns its result. If the\n * method is not available, use fallbackMethodName to call the method in a\n * clobber-vulnerable way, and use fallbackTest to check if the\n * method was clobbered, throwing an exception if so.\n * @param {?Function} fn\n * @param {*} object\n * @param {string} fallbackMethodName\n * @param {!Array<*>} args\n * @return {?}\n */\nfunction genericMethodCall(fn, object, fallbackMethodName, args) {\n  if (fn) {\n    return fn.apply(object, args);\n  }\n  // IE8 and IE9 will return 'object' for\n  // CSSStyleDeclaration.(get|set)Attribute, so we can't use typeof.\n  if (userAgentProduct.IE && document.documentMode < 10) {\n    if (!object[fallbackMethodName].call) {\n      throw new Error('IE Clobbering detected');\n    }\n  } else if (typeof object[fallbackMethodName] != 'function') {\n    throw new Error('Clobbering detected');\n  }\n  return object[fallbackMethodName].apply(object, args);\n}\n\n/**\n * Returns an element's attributes without falling prey to things like\n * <form><input name=\"attributes\"></form>. Equivalent to\n * `node.attributes`.\n * @param {!Element} element\n * @return {!NamedNodeMap}\n */\nfunction getElementAttributes(element) {\n  return genericPropertyGet(\n      Methods.ATTRIBUTES_GETTER, element, 'attributes', function(attributes) {\n        return attributes instanceof NamedNodeMap;\n      });\n}\n\n/**\n * Returns whether an element has a specific attribute, without falling prey to\n * things like <form><input name=\"hasAttribute\"></form>.\n * Equivalent to {@code element.hasAttribute(\"foo\")}.\n * @param {!Element} element\n * @param {string} attrName\n * @return {boolean}\n */\nfunction hasElementAttribute(element, attrName) {\n  return genericMethodCall(\n      Methods.HAS_ATTRIBUTE, element, 'hasAttribute', [attrName]);\n}\n\n/**\n * Returns a specific attribute from an element without falling prey to\n * things like <form><input name=\"getAttribute\"></form>.\n * Equivalent to {@code element.getAttribute(\"foo\")}.\n * @param {!Element} element\n * @param {string} attrName\n * @return {?string}\n */\nfunction getElementAttribute(element, attrName) {\n  // Older browsers might return empty string instead of null to follow the\n  // DOM 3 Core Specification.\n  return genericMethodCall(\n             Methods.GET_ATTRIBUTE, element, 'getAttribute', [attrName]) ||\n      null;\n}\n\n/**\n * Sets an element's attributes without falling prey to things like\n * <form><input name=\"setAttribute\"></form>. Equivalent to {@code\n * element.setAttribute(\"foo\", \"bar\")}.\n * @param {!Element} element\n * @param {string} name\n * @param {string} value\n */\nfunction setElementAttribute(element, name, value) {\n  try {\n    genericMethodCall(\n        Methods.SET_ATTRIBUTE, element, 'setAttribute', [name, value]);\n  } catch (e) {\n    // IE throws an exception if the src attribute contains HTTP credentials.\n    // However the attribute gets set anyway.\n    if (e.message.indexOf('A security problem occurred') != -1) {\n      return;\n    }\n    throw e;\n  }\n}\n\n/**\n * Deletes a specific attribute from an element without falling prey to\n * things like <form><input name=\"removeAttribute\"></form>.\n * Equivalent to {@code element.removeAttribute(\"foo\")}.\n * @param {!Element} element\n * @param {string} attrName\n */\nfunction removeElementAttribute(element, attrName) {\n  genericMethodCall(\n      Methods.REMOVE_ATTRIBUTE, element, 'removeAttribute', [attrName]);\n}\n\n/**\n * Returns a node's innerHTML property value without falling prey to things like\n * <form><input name=\"innerHTML\"></form>. Equivalent to\n * `element.innerHTML`.\n * @param {!Element} element\n * @return {string}\n */\nfunction getElementInnerHTML(element) {\n  return genericPropertyGet(\n      Methods.INNER_HTML_GETTER, element, 'innerHTML', function(html) {\n        return typeof html == 'string';\n      });\n}\n\n/**\n * Returns an element's style without falling prey to things like\n * <form><input name=\"style\"></form>.\n * @param {!Element} element\n * @return {!CSSStyleDeclaration}\n */\nfunction getElementStyle(element) {\n  assertHTMLElement(element);\n  return genericPropertyGet(\n      Methods.STYLE_GETTER, element, 'style', function(style) {\n        return style instanceof CSSStyleDeclaration;\n      });\n}\n\n/**\n * Asserts that the Element is an HTMLElement, or throws an exception.\n * @param {!Element} element\n */\nfunction assertHTMLElement(element) {\n  if (googAsserts.ENABLE_ASSERTS && !(element instanceof HTMLElement)) {\n    throw new Error('Not an HTMLElement');\n  }\n}\n\n/**\n * Get the children of a specific tag matching the provided tag name without\n * falling prey to things like <form><input name=\"getElementsByTagName\"></form>.\n * Equivalent to {@code element.getElementsByTagName(\"foo\")}.\n * @param {!Element} element\n * @param {string} name\n * @return {!Array<!Element>}\n */\nfunction getElementsByTagName(element, name) {\n  return Array.from(genericMethodCall(\n      Methods.GET_ELEMENTS_BY_TAG_NAME, element, 'getElementsByTagName',\n      [name]));\n}\n\n/**\n * Returns an element's style without falling prey to things like\n * <form><input name=\"style\"></form>.\n * @param {!Element} element\n * @return {!CSSStyleSheet}\n */\nfunction getElementStyleSheet(element) {\n  assertHTMLElement(element);\n  return genericPropertyGet(\n      Methods.SHEET_GETTER, element, 'sheet', function(sheet) {\n        return sheet instanceof CSSStyleSheet;\n      });\n}\n\n/**\n * Returns true if the element would be selected by the provided selector,\n * without falling prey to things like <form><input name=\"setAttribute\"></form>.\n * Equivalent to {@code element.matches(\"foo\")}.\n * @param {!Element} element\n * @param {string} selector\n * @return {boolean}\n */\nfunction elementMatches(element, selector) {\n  return genericMethodCall(\n      Methods.MATCHES, element,\n      element.matches ? 'matches' : 'msMatchesSelector', [selector]);\n}\n\n/**\n * Asserts that a Node is an Element, without falling prey to things like\n * <form><input name=\"nodeType\"></form>.\n * @param {!Node} node\n * @return {!Element}\n */\nfunction assertNodeIsElement(node) {\n  if (googAsserts.ENABLE_ASSERTS && !isNodeElement(node)) {\n    googAsserts.fail(\n        'Expected Node of type Element but got Node of type %s',\n        getNodeType(node));\n  }\n  return /** @type {!Element} */ (node);\n}\n\n/**\n * Returns whether the node is an Element, without falling prey to things like\n * <form><input name=\"nodeType\"></form>.\n * @param {!Node} node\n * @return {boolean}\n */\nfunction isNodeElement(node) {\n  return getNodeType(node) == NodeType.ELEMENT;\n}\n\n/**\n * Returns a node's nodeName without falling prey to things like\n * <form><input name=\"nodeName\"></form>.\n * @param {!Node} node\n * @return {string}\n */\nfunction getNodeName(node) {\n  return genericPropertyGet(\n      Methods.NODE_NAME_GETTER, node, 'nodeName', function(name) {\n        return typeof name == 'string';\n      });\n}\n\n/**\n * Returns a node's nodeType without falling prey to things like\n * `<form><input name=\"nodeType\"></form>`.\n * @param {!Node} node\n * @return {number}\n */\nfunction getNodeType(node) {\n  return genericPropertyGet(\n      Methods.NODE_TYPE_GETTER, node, 'nodeType', function(type) {\n        return typeof type == 'number';\n      });\n}\n\n/**\n * Returns a node's parentNode without falling prey to things like\n * <form><input name=\"parentNode\"></form>.\n * @param {!Node} node\n * @return {?Node}\n */\nfunction getParentNode(node) {\n  return genericPropertyGet(\n      Methods.PARENT_NODE_GETTER, node, 'parentNode', function(parentNode) {\n        // We need to ensure that parentNode is returning the actual parent node\n        // and not a child node that happens to have a name of \"parentNode\".\n        // We check that the node returned by parentNode is itself not named\n        // \"parentNode\" - this could happen legitimately but on IE we have no\n        // better means of avoiding the pitfall.\n        return !(\n            parentNode && typeof parentNode.name == 'string' &&\n            parentNode.name && parentNode.name.toLowerCase() == 'parentnode');\n      });\n}\n\n/**\n * Returns the value of node.childNodes without falling prey to things like\n * <form><input name=\"childNodes\"></form>.\n * @param {!Node} node\n * @return {!NodeList<!Node>}\n */\nfunction getChildNodes(node) {\n  return genericPropertyGet(\n      Methods.CHILD_NODES_GETTER, node, 'childNodes', function(childNodes) {\n        return childNodes instanceof NodeList;\n      });\n}\n\n/**\n * Appends a child to a node without falling prey to things like\n * <form><input name=\"appendChild\"></form>.\n * @param {!Node} parent\n * @param {!Node} child\n * @return {!Node}\n */\nfunction appendNodeChild(parent, child) {\n  return genericMethodCall(\n      Methods.APPEND_CHILD, parent, 'appendChild', [child]);\n}\n\n/**\n * Provides a way cross-browser way to get a CSS value from a CSS declaration.\n * @param {!CSSStyleDeclaration} cssStyle A CSS style object.\n * @param {string} propName A property name.\n * @return {string} Value of the property as parsed by the browser.\n * @supported IE8 and newer.\n */\nfunction getCssPropertyValue(cssStyle, propName) {\n  return genericMethodCall(\n             Methods.GET_PROPERTY_VALUE, cssStyle,\n             cssStyle.getPropertyValue ? 'getPropertyValue' : 'getAttribute',\n             [propName]) ||\n      '';\n}\n\n/**\n * Provides a cross-browser way to set a CSS value on a CSS declaration.\n * @param {!CSSStyleDeclaration} cssStyle A CSS style object.\n * @param {string} propName A property name.\n * @param {string} sanitizedValue Sanitized value of the property to be set\n *     on the CSS style object.\n * @supported IE8 and newer.\n */\nfunction setCssProperty(cssStyle, propName, sanitizedValue) {\n  genericMethodCall(\n      Methods.SET_PROPERTY, cssStyle,\n      cssStyle.setProperty ? 'setProperty' : 'setAttribute',\n      [propName, sanitizedValue]);\n}\n\nexports = {\n  getElementAttributes: getElementAttributes,\n  hasElementAttribute: hasElementAttribute,\n  getElementAttribute: getElementAttribute,\n  setElementAttribute: setElementAttribute,\n  removeElementAttribute: removeElementAttribute,\n  getElementInnerHTML: getElementInnerHTML,\n  getElementStyle: getElementStyle,\n  getElementsByTagName: getElementsByTagName,\n  getElementStyleSheet: getElementStyleSheet,\n  elementMatches: elementMatches,\n  assertNodeIsElement: assertNodeIsElement,\n  isNodeElement: isNodeElement,\n  getNodeName: getNodeName,\n  getNodeType: getNodeType,\n  getParentNode: getParentNode,\n  getChildNodes: getChildNodes,\n  appendNodeChild: appendNodeChild,\n  getCssPropertyValue: getCssPropertyValue,\n  setCssProperty: setCssProperty,\n  /** @package */\n  Methods: Methods,\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","^MC","^JZ","^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/html/sanitizer/noclobber.js"],"^JD",["^J4",["~$goog.html.sanitizer.noclobber"]],"^IR",true,"^IS",["^IT","^JZ","^JF","^MC"]],["^ ","^IV",[1579837703000],"^IW","goog.proto.serializer.js","^IX",["^IY","goog/proto/serializer.js"],"^IZ","goog/proto/serializer.js","^I[","^J0","^J1","/**\n * @license\n * Copyright The Closure Library Authors. All Rights Reserved.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS-IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Protocol buffer serializer.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\n// TODO(arv): Serialize booleans as 0 and 1\n\n\ngoog.provide('goog.proto.Serializer');\n\n\ngoog.require('goog.json.Serializer');\ngoog.require('goog.string');\n\n\n\n/**\n * Object that can serialize objects or values to a protocol buffer string.\n * @constructor\n * @extends {goog.json.Serializer}\n * @final\n */\ngoog.proto.Serializer = function() {\n  goog.json.Serializer.call(this);\n};\ngoog.inherits(goog.proto.Serializer, goog.json.Serializer);\n\n\n/**\n * Serializes an array to a protocol buffer string. This overrides the JSON\n * method to don't output trailing null or undefined.\n * @param {Array<*>} arr The array to serialize.\n * @param {Array<string>} sb Array used as a string builder.\n * @override\n */\ngoog.proto.Serializer.prototype.serializeArray = function(arr, sb) {\n  var l = arr.length;\n  sb.push('[');\n  var emptySlots = 0;\n  var sep = '';\n  for (var i = 0; i < l; i++) {\n    if (arr[i] == null) {  // catches undefined as well\n      emptySlots++;\n    } else {\n      sb.push(sep);\n      if (emptySlots > 0) {\n        sb.push(goog.string.repeat('null,', emptySlots));\n        emptySlots = 0;\n      }\n      this.serializeInternal(arr[i], sb);\n      sep = ',';\n    }\n  }\n  sb.push(']');\n};\n","^J2",1579837703000,"^J3",["^J4",["^K7","^IT","~$goog.json.Serializer"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/proto/serializer.js"],"^JD",["^J4",["~$goog.proto.Serializer"]],"^IR",true,"^IS",["^IT","^NK","^K7"]],["^ ","^IV",[1579837703000],"^IW","goog.locale.genericfontnames.js","^IX",["^IY","goog/locale/genericfontnames.js"],"^IZ","goog/locale/genericfontnames.js","^I[","^J0","^J1","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions to list locale-specific font list and generic name.\n * Generic name used for a font family would be locale dependent. For example,\n * for 'zh'(Chinese) users, the name for Serif family would be in Chinese.\n * Further documentation at: http://go/genericfontnames.\n */\n\ngoog.provide('goog.locale.genericFontNames');\n\n\n/**\n * This object maps (resourceName, localeName) to a resourceObj.\n * @type {Object}\n * @private\n */\ngoog.locale.genericFontNames.data_ = {};\n\n\n/**\n * Normalizes the given locale id to standard form. eg: zh_Hant_TW.\n * Many a times, input locale would be like: zh-tw, zh-hant-tw.\n * @param {string} locale The locale id to be normalized.\n * @return {string} Normalized locale id.\n * @private\n */\ngoog.locale.genericFontNames.normalize_ = function(locale) {\n  locale = locale.replace(/-/g, '_');\n  locale =\n      locale.replace(/_[a-z]{2}$/, function(str) { return str.toUpperCase(); });\n\n  locale = locale.replace(/[a-z]{4}/, function(str) {\n    return str.substring(0, 1).toUpperCase() + str.substring(1);\n  });\n  return locale;\n};\n\n\n/**\n * Gets the list of fonts and their generic names for the given locale.\n * @param {string} locale The locale for which font lists and font family names\n *     to be produced. The expected locale id is as described in\n *     http://wiki/Main/IIISynonyms in all lowercase for easy matching.\n *     Smallest possible id is expected.\n *     Examples: 'zh', 'zh-tw', 'iw' instead of 'zh-CN', 'zh-Hant-TW', 'he'.\n * @return {Array<Object>} List of objects with generic name as 'caption' and\n *     corresponding font name lists as 'value' property.\n */\ngoog.locale.genericFontNames.getList = function(locale) {\n\n  locale = goog.locale.genericFontNames.normalize_(locale);\n  if (locale in goog.locale.genericFontNames.data_) {\n    return goog.locale.genericFontNames.data_[locale];\n  }\n  return [];\n};\n","^J2",1579837703000,"^J3",["^J4",["^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/locale/genericfontnames.js"],"^JD",["^J4",["~$goog.locale.genericFontNames"]],"^IR",true,"^IS",["^IT"]],["^ ","^IV",[1579837703000],"^IW","goog.labs.net.webchannel.wire.js","^IX",["^IY","goog/labs/net/webchannel/wire.js"],"^IZ","goog/labs/net/webchannel/wire.js","^I[","^J0","^J1","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Interface and shared data structures for implementing\n * different wire protocol versions.\n */\ngoog.provide('goog.labs.net.webChannel.Wire');\n\ngoog.forwardDeclare('goog.structs.Map');\n\n\n\n/**\n * The interface class.\n *\n * @interface\n */\ngoog.labs.net.webChannel.Wire = function() {};\n\n\n/**\n * The latest protocol version that this class supports. We request this version\n * from the server when opening the connection. Should match\n * LATEST_CHANNEL_VERSION on the server code.\n * @type {number}\n */\ngoog.labs.net.webChannel.Wire.LATEST_CHANNEL_VERSION = 8;\n\n\n/**\n * The JSON field key for the raw data wrapper object.\n * @type {string}\n */\ngoog.labs.net.webChannel.Wire.RAW_DATA_KEY = '__data__';\n\n\n\n/**\n * Simple container class for a (mapId, map) pair.\n * @param {number} mapId The id for this map.\n * @param {!Object|!goog.structs.Map} map The map itself.\n * @param {!Object=} opt_context The context associated with the map.\n * @constructor\n * @struct\n */\ngoog.labs.net.webChannel.Wire.QueuedMap = function(mapId, map, opt_context) {\n  /**\n   * The id for this map.\n   * @type {number}\n   */\n  this.mapId = mapId;\n\n  /**\n   * The map itself.\n   * @type {!Object|!goog.structs.Map}\n   */\n  this.map = map;\n\n  /**\n   * The context for the map.\n   * @type {Object}\n   */\n  this.context = opt_context || null;\n};\n\n\n/**\n * @return {number|undefined} the size of the raw JSON message or\n * undefined if the message is not encoded as a raw JSON message\n */\ngoog.labs.net.webChannel.Wire.QueuedMap.prototype.getRawDataSize = function() {\n  if (goog.labs.net.webChannel.Wire.RAW_DATA_KEY in this.map) {\n    const data = this.map[goog.labs.net.webChannel.Wire.RAW_DATA_KEY];\n    if (typeof data === 'string') {\n      return data.length;\n    }\n  }\n\n  return undefined;\n};\n","^J2",1579837703000,"^J3",["^J4",["^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchannel/wire.js"],"^JD",["^J4",["~$goog.labs.net.webChannel.Wire"]],"^IR",true,"^IS",["^IT"]],["^ ","^IV",[1579837703000],"^IW","goog.ui.togglebutton.js","^IX",["^IY","goog/ui/togglebutton.js"],"^IZ","goog/ui/togglebutton.js","^I[","^J0","^J1","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A toggle button control.  Extends {@link goog.ui.Button} by\n * providing checkbox-like semantics.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ToggleButton');\n\ngoog.require('goog.ui.Button');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.CustomButtonRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * A toggle button, with checkbox-like semantics.  Rendered using\n * {@link goog.ui.CustomButtonRenderer} by default, though any\n * {@link goog.ui.ButtonRenderer} would work.\n *\n * @param {goog.ui.ControlContent} content Text caption or existing DOM\n *     structure to display as the button's caption.\n * @param {goog.ui.ButtonRenderer=} opt_renderer Renderer used to render or\n *     decorate the button; defaults to {@link goog.ui.CustomButtonRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.Button}\n */\ngoog.ui.ToggleButton = function(content, opt_renderer, opt_domHelper) {\n  goog.ui.Button.call(\n      this, content, opt_renderer || goog.ui.CustomButtonRenderer.getInstance(),\n      opt_domHelper);\n  this.setSupportedState(goog.ui.Component.State.CHECKED, true);\n};\ngoog.inherits(goog.ui.ToggleButton, goog.ui.Button);\n\n\n// Register a decorator factory function for goog.ui.ToggleButtons.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.getCssName('goog-toggle-button'), function() {\n      // ToggleButton defaults to using CustomButtonRenderer.\n      return new goog.ui.ToggleButton(null);\n    });\n","^J2",1579837703000,"^J3",["^J4",["^LC","^IT","~$goog.ui.registry","~$goog.ui.CustomButtonRenderer","~$goog.ui.Button"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/togglebutton.js"],"^JD",["^J4",["~$goog.ui.ToggleButton"]],"^IR",true,"^IS",["^IT","^NQ","^LC","^NP","^NO"]],["^ ","^IV",[1579837703000],"^IW","goog.a11y.aria.datatables.js","^IX",["^IY","goog/a11y/aria/datatables.js"],"^IZ","goog/a11y/aria/datatables.js","^I[","^J0","^J1","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n\n/**\n * @fileoverview The file contains data tables generated from the ARIA\n * standard schema http://www.w3.org/TR/wai-aria/.\n *\n * This is auto-generated code. Do not manually edit!\n */\n\ngoog.provide('goog.a11y.aria.datatables');\n\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.object');\n\n\n/**\n * A map that contains mapping between an ARIA state and the default value\n * for it. Note that not all ARIA states have default values.\n *\n * @type {Object<!(goog.a11y.aria.State|string), (string|boolean|number)>}\n */\ngoog.a11y.aria.DefaultStateValueMap_;\n\n\n/**\n * A method that creates a map that contains mapping between an ARIA state and\n * the default value for it. Note that not all ARIA states have default values.\n *\n * @return {!Object<!(goog.a11y.aria.State|string), (string|boolean|number)>}\n *      The names for each of the notification methods.\n */\ngoog.a11y.aria.datatables.getDefaultValuesMap = function() {\n  if (!goog.a11y.aria.DefaultStateValueMap_) {\n    goog.a11y.aria.DefaultStateValueMap_ = goog.object.create(\n        goog.a11y.aria.State.ATOMIC, false, goog.a11y.aria.State.AUTOCOMPLETE,\n        'none', goog.a11y.aria.State.DROPEFFECT, 'none',\n        goog.a11y.aria.State.HASPOPUP, false, goog.a11y.aria.State.LIVE, 'off',\n        goog.a11y.aria.State.MULTILINE, false,\n        goog.a11y.aria.State.MULTISELECTABLE, false,\n        goog.a11y.aria.State.ORIENTATION, 'vertical',\n        goog.a11y.aria.State.READONLY, false, goog.a11y.aria.State.RELEVANT,\n        'additions text', goog.a11y.aria.State.REQUIRED, false,\n        goog.a11y.aria.State.SORT, 'none', goog.a11y.aria.State.BUSY, false,\n        goog.a11y.aria.State.DISABLED, false, goog.a11y.aria.State.HIDDEN,\n        false, goog.a11y.aria.State.INVALID, 'false');\n  }\n\n  return goog.a11y.aria.DefaultStateValueMap_;\n};\n","^J2",1579837703000,"^J3",["^J4",["^IT","^KS","^KU"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/a11y/aria/datatables.js"],"^JD",["^J4",["~$goog.a11y.aria.datatables"]],"^IR",true,"^IS",["^IT","^KU","^KS"]],["^ ","^IV",[1579837703000],"^IW","goog.i18n.timezone.js","^IX",["^IY","goog/i18n/timezone.js"],"^IZ","goog/i18n/timezone.js","^I[","^J0","^J1","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions to provide timezone information for use with\n * date/time format.\n */\n\ngoog.provide('goog.i18n.TimeZone');\n\ngoog.require('goog.array');\n/**\n * @suppress {extraRequire} goog.date.DateLike represents a Date or a\n * goog.Date object. It is a parameter in the following methods:\n * - getDaylightAdjustment\n * - getGMTString\n * - getLongName\n * - getOffset\n * - getRFCTimeZoneString\n * - getShortName\n * - getUTCString\n * - isDaylightTime\n * - getLongNameGMT\n * - getGenericLocation\n * Lint warns that this require is unnecessary but the closure compiler needs\n * it in order to accept a Date or a goog.Date object as a goog.date.DateLike\n * parameter in any of these methods.\n */\ngoog.require('goog.date.DateLike');\ngoog.require('goog.object');\ngoog.require('goog.string');\n\n\n\n/**\n * TimeZone class implemented a time zone resolution and name information\n * source for client applications. The time zone object is initiated from\n * a time zone information object. Application can initiate a time zone\n * statically, or it may choose to initiate from a data obtained from server.\n * Each time zone information array is small, but the whole set of data\n * is too much for client application to download. If end user is allowed to\n * change time zone setting, dynamic retrieval should be the method to use.\n * In case only time zone offset is known, there is a decent fallback\n * that only use the time zone offset to create a TimeZone object.\n *\n * @constructor\n * @final\n */\ngoog.i18n.TimeZone = function() {\n  /**\n   * The standard time zone id.\n   * @type {string}\n   * @private\n   */\n  this.timeZoneId_;\n\n\n  /**\n   * The standard, non-daylight time zone offset, in minutes WEST of UTC.\n   * @type {number}\n   * @private\n   */\n  this.standardOffset_;\n\n\n  /**\n   * An array of strings that can have 2 or 4 elements.  The first two elements\n   * are the long and short names for standard time in this time zone, and the\n   * last two elements (if present) are the long and short names for daylight\n   * time in this time zone.\n   * @type {Array<string>}\n   * @private\n   */\n  this.tzNames_;\n\n\n  /**\n   * An object of 2 to 4 elements. The STD_* are always available, while the\n   * DST_* are only available when daylight saving time is available for this\n   * time zone.\n   * <ul>\n   * <li>STD_LONG_NAME_GMT: long GMT name for standard time</li>\n   * <li>STD_GENERIC_LOCATION: generic location for standard time</li>\n   * <li>DST_LONG_NAME_GMT: long GMT for daylight saving time</li>\n   * <li>DST_GENERIC_LOCATION: generic location for daylight saving time</li>\n   * </ul>\n   * @type {{\n   *   STD_LONG_NAME_GMT: string,\n   *   STD_GENERIC_LOCATION: string,\n   *   DST_LONG_NAME_GMT: (string|undefined),\n   *   DST_GENERIC_LOCATION: (string|undefined)\n   * }}\n   * @private\n   */\n  this.tzNamesExt_;\n\n\n  /**\n   * This array specifies the Daylight Saving Time transitions for this time\n   * zone.  This is a flat array of numbers which are interpreted in pairs:\n   * [time1, adjustment1, time2, adjustment2, ...] where each time is a DST\n   * transition point given as a number of hours since 00:00 UTC, January 1,\n   * 1970, and each adjustment is the adjustment to apply for times after the\n   * DST transition, given as minutes EAST of UTC.\n   * @type {Array<number>}\n   * @private\n   */\n  this.transitions_;\n};\n\n\n/**\n * The number of milliseconds in an hour.\n * @type {number}\n * @private\n */\ngoog.i18n.TimeZone.MILLISECONDS_PER_HOUR_ = 3600 * 1000;\n\n\n/**\n * Indices into the array of time zone names.\n * @enum {number}\n */\ngoog.i18n.TimeZone.NameType = {\n  STD_SHORT_NAME: 0,\n  STD_LONG_NAME: 1,\n  DLT_SHORT_NAME: 2,\n  DLT_LONG_NAME: 3\n};\n\n\n/**\n * This factory method creates a time zone instance.  It takes either an object\n * containing complete time zone information, or a single number representing a\n * constant time zone offset.  If the latter form is used, DST functionality is\n * not available.\n *\n * @param {number|Object} timeZoneData If this parameter is a number, it should\n *     indicate minutes WEST of UTC to be used as a constant time zone offset.\n *     Otherwise, it should be an object with these four fields:\n *     <ul>\n *     <li>id: A string ID for the time zone.\n *     <li>std_offset: The standard time zone offset in minutes EAST of UTC.\n *     <li>names: An array of four names (standard short name, standard long\n *           name, daylight short name, daylight long, name)\n *     <li>names_ext: A hash of four fields (standard long name gmt, daylight\n *           long name gmt, standard generic location, daylight generic\n *           location)\n *     <li>transitions: An array of numbers which are interpreted in pairs:\n *           [time1, adjustment1, time2, adjustment2, ...] where each time is\n *           a DST transition point given as a number of hours since 00:00 UTC,\n *           January 1, 1970, and each adjustment is the adjustment to apply\n *           for times after the DST transition, given as minutes EAST of UTC.\n *     </ul>\n * @return {!goog.i18n.TimeZone} A goog.i18n.TimeZone object for the given\n *     time zone data.\n */\ngoog.i18n.TimeZone.createTimeZone = function(timeZoneData) {\n  if (typeof timeZoneData == 'number') {\n    return goog.i18n.TimeZone.createSimpleTimeZone_(timeZoneData);\n  }\n  var tz = new goog.i18n.TimeZone();\n  tz.timeZoneId_ = timeZoneData['id'];\n  tz.standardOffset_ = -timeZoneData['std_offset'];\n  tz.tzNames_ = timeZoneData['names'];\n  tz.tzNamesExt_ = timeZoneData['names_ext'];\n  tz.transitions_ = timeZoneData['transitions'];\n  return tz;\n};\n\n\n/**\n * This factory method creates a time zone object with a constant offset.\n * @param {number} timeZoneOffsetInMinutes Offset in minutes WEST of UTC.\n * @return {!goog.i18n.TimeZone} A time zone object with the given constant\n *     offset.  Note that the time zone ID of this object will use the POSIX\n *     convention, which has a reversed sign (\"Etc/GMT+8\" means UTC-8 or PST).\n * @private\n */\ngoog.i18n.TimeZone.createSimpleTimeZone_ = function(timeZoneOffsetInMinutes) {\n  var tz = new goog.i18n.TimeZone();\n  tz.standardOffset_ = timeZoneOffsetInMinutes;\n  tz.timeZoneId_ =\n      goog.i18n.TimeZone.composePosixTimeZoneID_(timeZoneOffsetInMinutes);\n  var str = goog.i18n.TimeZone.composeUTCString_(timeZoneOffsetInMinutes);\n  var strGMT = goog.i18n.TimeZone.composeGMTString_(timeZoneOffsetInMinutes);\n  tz.tzNames_ = [str, str];\n  tz.tzNamesExt_ = {STD_LONG_NAME_GMT: strGMT, STD_GENERIC_LOCATION: strGMT};\n  tz.transitions_ = [];\n  return tz;\n};\n\n\n/**\n * Generate a GMT-relative string for a constant time zone offset.\n * @param {number} offset The time zone offset in minutes WEST of UTC.\n * @return {string} The GMT string for this offset, which will indicate\n *     hours EAST of UTC.\n * @private\n */\ngoog.i18n.TimeZone.composeGMTString_ = function(offset) {\n  var parts = ['GMT'];\n  parts.push(offset <= 0 ? '+' : '-');\n  offset = Math.abs(offset);\n  parts.push(\n      goog.string.padNumber(Math.floor(offset / 60) % 100, 2), ':',\n      goog.string.padNumber(offset % 60, 2));\n  return parts.join('');\n};\n\n\n/**\n * Generate a POSIX time zone ID for a constant time zone offset.\n * @param {number} offset The time zone offset in minutes WEST of UTC.\n * @return {string} The POSIX time zone ID for this offset, which will indicate\n *     hours WEST of UTC.\n * @private\n */\ngoog.i18n.TimeZone.composePosixTimeZoneID_ = function(offset) {\n  if (offset == 0) {\n    return 'Etc/GMT';\n  }\n  var parts = ['Etc/GMT', offset < 0 ? '-' : '+'];\n  offset = Math.abs(offset);\n  parts.push(Math.floor(offset / 60) % 100);\n  offset = offset % 60;\n  if (offset != 0) {\n    parts.push(':', goog.string.padNumber(offset, 2));\n  }\n  return parts.join('');\n};\n\n\n/**\n * Generate a UTC-relative string for a constant time zone offset.\n * @param {number} offset The time zone offset in minutes WEST of UTC.\n * @return {string} The UTC string for this offset, which will indicate\n *     hours EAST of UTC.\n * @private\n */\ngoog.i18n.TimeZone.composeUTCString_ = function(offset) {\n  if (offset == 0) {\n    return 'UTC';\n  }\n  var parts = ['UTC', offset < 0 ? '+' : '-'];\n  offset = Math.abs(offset);\n  parts.push(Math.floor(offset / 60) % 100);\n  offset = offset % 60;\n  if (offset != 0) {\n    parts.push(':', offset);\n  }\n  return parts.join('');\n};\n\n\n/**\n * Convert the contents of time zone object to a timeZoneData object, suitable\n * for passing to goog.i18n.TimeZone.createTimeZone.\n * @return {!Object} A timeZoneData object (see the documentation for\n *     goog.i18n.TimeZone.createTimeZone).\n */\ngoog.i18n.TimeZone.prototype.getTimeZoneData = function() {\n  return {\n    'id': this.timeZoneId_,\n    'std_offset': -this.standardOffset_,  // note createTimeZone flips the sign\n    'names': goog.array.clone(this.tzNames_),  // avoid aliasing the array\n    'names_ext': goog.object.clone(this.tzNamesExt_),   // avoid aliasing\n    'transitions': goog.array.clone(this.transitions_)  // avoid aliasing\n  };\n};\n\n\n/**\n * Return the DST adjustment to the time zone offset for a given time.\n * While Daylight Saving Time is in effect, this number is positive.\n * Otherwise, it is zero.\n * @param {goog.date.DateLike} date The time to check.\n * @return {number} The DST adjustment in minutes EAST of UTC.\n */\ngoog.i18n.TimeZone.prototype.getDaylightAdjustment = function(date) {\n  var timeInMs = Date.UTC(\n      date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(),\n      date.getUTCHours(), date.getUTCMinutes());\n  var timeInHours = timeInMs / goog.i18n.TimeZone.MILLISECONDS_PER_HOUR_;\n  var index = 0;\n  while (index < this.transitions_.length &&\n         timeInHours >= this.transitions_[index]) {\n    index += 2;\n  }\n  return (index == 0) ? 0 : this.transitions_[index - 1];\n};\n\n\n/**\n * Return the GMT representation of this time zone object.\n * @param {goog.date.DateLike} date The date for which time to retrieve\n *     GMT string.\n * @return {string} GMT representation string.\n */\ngoog.i18n.TimeZone.prototype.getGMTString = function(date) {\n  return goog.i18n.TimeZone.composeGMTString_(this.getOffset(date));\n};\n\n/**\n * Return the UTC representation of this time zone object.\n * @param {!goog.date.DateLike} date The date for which time to retrieve\n *     UTC string.\n * @return {string} UTC representation string.\n */\ngoog.i18n.TimeZone.prototype.getUTCString = function(date) {\n  return goog.i18n.TimeZone.composeUTCString_(this.getOffset(date));\n};\n\n\n/**\n * Get the long time zone name for a given date/time.\n * @param {goog.date.DateLike} date The time for which to retrieve\n *     the long time zone name.\n * @return {string} The long time zone name.\n */\ngoog.i18n.TimeZone.prototype.getLongName = function(date) {\n  return this.tzNames_[this.isDaylightTime(date) ?\n                           goog.i18n.TimeZone.NameType.DLT_LONG_NAME :\n                           goog.i18n.TimeZone.NameType.STD_LONG_NAME];\n};\n\n\n/**\n * Get the time zone offset in minutes WEST of UTC for a given date/time.\n * @param {goog.date.DateLike} date The time for which to retrieve\n *     the time zone offset.\n * @return {number} The time zone offset in minutes WEST of UTC.\n */\ngoog.i18n.TimeZone.prototype.getOffset = function(date) {\n  return this.standardOffset_ - this.getDaylightAdjustment(date);\n};\n\n\n/**\n * Get the RFC representation of the time zone for a given date/time.\n * @param {goog.date.DateLike} date The time for which to retrieve the\n *     RFC time zone string.\n * @return {string} The RFC time zone string.\n */\ngoog.i18n.TimeZone.prototype.getRFCTimeZoneString = function(date) {\n  var offset = -this.getOffset(date);\n  var parts = [offset < 0 ? '-' : '+'];\n  offset = Math.abs(offset);\n  parts.push(\n      goog.string.padNumber(Math.floor(offset / 60) % 100, 2),\n      goog.string.padNumber(offset % 60, 2));\n  return parts.join('');\n};\n\n\n/**\n * Get the short time zone name for given date/time.\n * @param {goog.date.DateLike} date The time for which to retrieve\n *     the short time zone name.\n * @return {string} The short time zone name.\n */\ngoog.i18n.TimeZone.prototype.getShortName = function(date) {\n  return this.tzNames_[this.isDaylightTime(date) ?\n                           goog.i18n.TimeZone.NameType.DLT_SHORT_NAME :\n                           goog.i18n.TimeZone.NameType.STD_SHORT_NAME];\n};\n\n\n/**\n * Return the time zone ID for this time zone.\n * @return {string} The time zone ID.\n */\ngoog.i18n.TimeZone.prototype.getTimeZoneId = function() {\n  return this.timeZoneId_;\n};\n\n\n/**\n * Check if Daylight Saving Time is in effect at a given time in this time zone.\n * @param {goog.date.DateLike} date The time to check.\n * @return {boolean} True if Daylight Saving Time is in effect.\n */\ngoog.i18n.TimeZone.prototype.isDaylightTime = function(date) {\n  return this.getDaylightAdjustment(date) > 0;\n};\n\n\n/**\n * Get the long GMT time zone name for a given date/time.\n * @param {!goog.date.DateLike} date The time for which to retrieve\n *     the long GMT time zone name.\n * @return {string} The long GMT time zone name.\n */\ngoog.i18n.TimeZone.prototype.getLongNameGMT = function(date) {\n  if (this.isDaylightTime(date)) {\n    return (this.tzNamesExt_.DST_LONG_NAME_GMT !== undefined) ?\n        this.tzNamesExt_.DST_LONG_NAME_GMT :\n        this.tzNamesExt_['DST_LONG_NAME_GMT'];\n  } else {\n    return (this.tzNamesExt_.STD_LONG_NAME_GMT !== undefined) ?\n        this.tzNamesExt_.STD_LONG_NAME_GMT :\n        this.tzNamesExt_['STD_LONG_NAME_GMT'];\n  }\n};\n\n\n/**\n * Get the generic location time zone name for a given date/time.\n * @param {!goog.date.DateLike} date The time for which to retrieve\n *     the generic location time zone name.\n * @return {string} The generic location time zone name.\n */\ngoog.i18n.TimeZone.prototype.getGenericLocation = function(date) {\n  if (this.isDaylightTime(date)) {\n    return (this.tzNamesExt_.DST_GENERIC_LOCATION !== undefined) ?\n        this.tzNamesExt_.DST_GENERIC_LOCATION :\n        this.tzNamesExt_['DST_GENERIC_LOCATION'];\n  } else {\n    return (this.tzNamesExt_.STD_GENERIC_LOCATION !== undefined) ?\n        this.tzNamesExt_.STD_GENERIC_LOCATION :\n        this.tzNamesExt_['STD_GENERIC_LOCATION'];\n  }\n};\n","^J2",1579837703000,"^J3",["^J4",["^K7","^IT","^KS","~$goog.date.DateLike","^JJ"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/timezone.js"],"^JD",["^J4",["^KH"]],"^IR",true,"^IS",["^IT","^JJ","^NT","^KS","^K7"]],["^ ","^IV",[1579837703000],"^IW","goog.testing.storage.fakemechanism.js","^IX",["^IY","goog/testing/storage/fakemechanism.js"],"^IZ","goog/testing/storage/fakemechanism.js","^I[","^J0","^J1","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a fake storage mechanism for testing.\n * @author chrishenry@google.com (Chris Henry)\n */\n\ngoog.provide('goog.testing.storage.FakeMechanism');\ngoog.setTestOnly('goog.testing.storage.FakeMechanism');\n\ngoog.require('goog.storage.mechanism.IterableMechanism');\ngoog.require('goog.structs.Map');\n\n\n\n/**\n * Creates a fake iterable mechanism.\n *\n * @constructor\n * @extends {goog.storage.mechanism.IterableMechanism}\n * @final\n */\ngoog.testing.storage.FakeMechanism = function() {\n  /**\n   * @type {goog.structs.Map}\n   * @private\n   */\n  this.storage_ = new goog.structs.Map();\n};\ngoog.inherits(\n    goog.testing.storage.FakeMechanism,\n    goog.storage.mechanism.IterableMechanism);\n\n\n/** @override */\ngoog.testing.storage.FakeMechanism.prototype.set = function(key, value) {\n  this.storage_.set(key, value);\n};\n\n\n/** @override */\ngoog.testing.storage.FakeMechanism.prototype.get = function(key) {\n  return /** @type {?string} */ (\n      this.storage_.get(key, null /* default value */));\n};\n\n\n/** @override */\ngoog.testing.storage.FakeMechanism.prototype.remove = function(key) {\n  this.storage_.remove(key);\n};\n\n\n/** @override */\ngoog.testing.storage.FakeMechanism.prototype.__iterator__ = function(opt_keys) {\n  return this.storage_.__iterator__(opt_keys);\n};\n","^J2",1579837703000,"^J3",["^J4",["~$goog.storage.mechanism.IterableMechanism","^K8","^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/storage/fakemechanism.js"],"^JD",["^J4",["~$goog.testing.storage.FakeMechanism"]],"^IR",true,"^IS",["^IT","^NU","^K8"]],["^ ","^IV",[1579837703000],"^IW","goog.events.eventtarget.js","^IX",["^IY","goog/events/eventtarget.js"],"^IZ","goog/events/eventtarget.js","^I[","^J0","^J1","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A disposable implementation of a custom\n * listenable/event target. See also: documentation for\n * `goog.events.Listenable`.\n *\n * @author arv@google.com (Erik Arvidsson) [Original implementation]\n * @see ../demos/eventtarget.html\n * @see goog.events.Listenable\n */\n\ngoog.provide('goog.events.EventTarget');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.asserts');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.Listenable');\ngoog.require('goog.events.ListenerMap');\ngoog.require('goog.object');\n\n\n\n/**\n * An implementation of `goog.events.Listenable` with full W3C\n * EventTarget-like support (capture/bubble mechanism, stopping event\n * propagation, preventing default actions).\n *\n * You may subclass this class to turn your class into a Listenable.\n *\n * Unless propagation is stopped, an event dispatched by an\n * EventTarget will bubble to the parent returned by\n * `getParentEventTarget`. To set the parent, call\n * `setParentEventTarget`. Subclasses that don't support\n * changing the parent can override the setter to throw an error.\n *\n * Example usage:\n * <pre>\n *   var source = new goog.events.EventTarget();\n *   function handleEvent(e) {\n *     alert('Type: ' + e.type + '; Target: ' + e.target);\n *   }\n *   source.listen('foo', handleEvent);\n *   // Or: goog.events.listen(source, 'foo', handleEvent);\n *   ...\n *   source.dispatchEvent('foo');  // will call handleEvent\n *   ...\n *   source.unlisten('foo', handleEvent);\n *   // Or: goog.events.unlisten(source, 'foo', handleEvent);\n * </pre>\n *\n * @constructor\n * @extends {goog.Disposable}\n * @implements {goog.events.Listenable}\n */\ngoog.events.EventTarget = function() {\n  goog.Disposable.call(this);\n\n  /**\n   * Maps of event type to an array of listeners.\n   * @private {!goog.events.ListenerMap}\n   */\n  this.eventTargetListeners_ = new goog.events.ListenerMap(this);\n\n  /**\n   * The object to use for event.target. Useful when mixing in an\n   * EventTarget to another object.\n   * @private {!Object}\n   */\n  this.actualEventTarget_ = this;\n\n  /**\n   * Parent event target, used during event bubbling.\n   *\n   * TODO(chrishenry): Change this to goog.events.Listenable. This\n   * currently breaks people who expect getParentEventTarget to return\n   * goog.events.EventTarget.\n   *\n   * @private {?goog.events.EventTarget}\n   */\n  this.parentEventTarget_ = null;\n};\ngoog.inherits(goog.events.EventTarget, goog.Disposable);\ngoog.events.Listenable.addImplementation(goog.events.EventTarget);\n\n\n/**\n * An artificial cap on the number of ancestors you can have. This is mainly\n * for loop detection.\n * @const {number}\n * @private\n */\ngoog.events.EventTarget.MAX_ANCESTORS_ = 1000;\n\n\n/**\n * Returns the parent of this event target to use for bubbling.\n *\n * @return {goog.events.EventTarget} The parent EventTarget or null if\n *     there is no parent.\n * @override\n */\ngoog.events.EventTarget.prototype.getParentEventTarget = function() {\n  return this.parentEventTarget_;\n};\n\n\n/**\n * Sets the parent of this event target to use for capture/bubble\n * mechanism.\n * @param {goog.events.EventTarget} parent Parent listenable (null if none).\n */\ngoog.events.EventTarget.prototype.setParentEventTarget = function(parent) {\n  this.parentEventTarget_ = parent;\n};\n\n\n/**\n * Adds an event listener to the event target. The same handler can only be\n * added once per the type. Even if you add the same handler multiple times\n * using the same type then it will only be called once when the event is\n * dispatched.\n *\n * @param {string|!goog.events.EventId} type The type of the event to listen for\n * @param {function(?):?|{handleEvent:function(?):?}|null} handler The function\n *     to handle the event. The handler can also be an object that implements\n *     the handleEvent method which takes the event object as argument.\n * @param {boolean=} opt_capture In DOM-compliant browsers, this determines\n *     whether the listener is fired during the capture or bubble phase\n *     of the event.\n * @param {Object=} opt_handlerScope Object in whose scope to call\n *     the listener.\n * @deprecated Use `#listen` instead, when possible. Otherwise, use\n *     `goog.events.listen` if you are passing Object\n *     (instead of Function) as handler.\n */\ngoog.events.EventTarget.prototype.addEventListener = function(\n    type, handler, opt_capture, opt_handlerScope) {\n  goog.events.listen(this, type, handler, opt_capture, opt_handlerScope);\n};\n\n\n/**\n * Removes an event listener from the event target. The handler must be the\n * same object as the one added. If the handler has not been added then\n * nothing is done.\n *\n * @param {string} type The type of the event to listen for.\n * @param {function(?):?|{handleEvent:function(?):?}|null} handler The function\n *     to handle the event. The handler can also be an object that implements\n *     the handleEvent method which takes the event object as argument.\n * @param {boolean=} opt_capture In DOM-compliant browsers, this determines\n *     whether the listener is fired during the capture or bubble phase\n *     of the event.\n * @param {Object=} opt_handlerScope Object in whose scope to call\n *     the listener.\n * @deprecated Use `#unlisten` instead, when possible. Otherwise, use\n *     `goog.events.unlisten` if you are passing Object\n *     (instead of Function) as handler.\n */\ngoog.events.EventTarget.prototype.removeEventListener = function(\n    type, handler, opt_capture, opt_handlerScope) {\n  goog.events.unlisten(this, type, handler, opt_capture, opt_handlerScope);\n};\n\n\n/** @override */\ngoog.events.EventTarget.prototype.dispatchEvent = function(e) {\n  this.assertInitialized_();\n\n  var ancestorsTree, ancestor = this.getParentEventTarget();\n  if (ancestor) {\n    ancestorsTree = [];\n    var ancestorCount = 1;\n    for (; ancestor; ancestor = ancestor.getParentEventTarget()) {\n      ancestorsTree.push(ancestor);\n      goog.asserts.assert(\n          (++ancestorCount < goog.events.EventTarget.MAX_ANCESTORS_),\n          'infinite loop');\n    }\n  }\n\n  return goog.events.EventTarget.dispatchEventInternal_(\n      this.actualEventTarget_, e, ancestorsTree);\n};\n\n\n/**\n * Removes listeners from this object.  Classes that extend EventTarget may\n * need to override this method in order to remove references to DOM Elements\n * and additional listeners.\n * @override\n * @protected\n */\ngoog.events.EventTarget.prototype.disposeInternal = function() {\n  goog.events.EventTarget.superClass_.disposeInternal.call(this);\n\n  this.removeAllListeners();\n  this.parentEventTarget_ = null;\n};\n\n\n/** @override */\ngoog.events.EventTarget.prototype.listen = function(\n    type, listener, opt_useCapture, opt_listenerScope) {\n  this.assertInitialized_();\n  return this.eventTargetListeners_.add(\n      String(type), listener, false /* callOnce */, opt_useCapture,\n      opt_listenerScope);\n};\n\n\n/** @override */\ngoog.events.EventTarget.prototype.listenOnce = function(\n    type, listener, opt_useCapture, opt_listenerScope) {\n  return this.eventTargetListeners_.add(\n      String(type), listener, true /* callOnce */, opt_useCapture,\n      opt_listenerScope);\n};\n\n\n/** @override */\ngoog.events.EventTarget.prototype.unlisten = function(\n    type, listener, opt_useCapture, opt_listenerScope) {\n  return this.eventTargetListeners_.remove(\n      String(type), listener, opt_useCapture, opt_listenerScope);\n};\n\n\n/** @override */\ngoog.events.EventTarget.prototype.unlistenByKey = function(key) {\n  return this.eventTargetListeners_.removeByKey(key);\n};\n\n\n/** @override */\ngoog.events.EventTarget.prototype.removeAllListeners = function(opt_type) {\n  // TODO(chrishenry): Previously, removeAllListeners can be called on\n  // uninitialized EventTarget, so we preserve that behavior. We\n  // should remove this when usages that rely on that fact are purged.\n  if (!this.eventTargetListeners_) {\n    return 0;\n  }\n  return this.eventTargetListeners_.removeAll(opt_type);\n};\n\n\n/** @override */\ngoog.events.EventTarget.prototype.fireListeners = function(\n    type, capture, eventObject) {\n  // TODO(chrishenry): Original code avoids array creation when there\n  // is no listener, so we do the same. If this optimization turns\n  // out to be not required, we can replace this with\n  // getListeners(type, capture) instead, which is simpler.\n  var listenerArray = this.eventTargetListeners_.listeners[String(type)];\n  if (!listenerArray) {\n    return true;\n  }\n  listenerArray = listenerArray.concat();\n\n  var rv = true;\n  for (var i = 0; i < listenerArray.length; ++i) {\n    var listener = listenerArray[i];\n    // We might not have a listener if the listener was removed.\n    if (listener && !listener.removed && listener.capture == capture) {\n      var listenerFn = listener.listener;\n      var listenerHandler = listener.handler || listener.src;\n\n      if (listener.callOnce) {\n        this.unlistenByKey(listener);\n      }\n      rv = listenerFn.call(listenerHandler, eventObject) !== false && rv;\n    }\n  }\n\n  return rv && eventObject.returnValue_ != false;\n};\n\n\n/** @override */\ngoog.events.EventTarget.prototype.getListeners = function(type, capture) {\n  return this.eventTargetListeners_.getListeners(String(type), capture);\n};\n\n\n/** @override */\ngoog.events.EventTarget.prototype.getListener = function(\n    type, listener, capture, opt_listenerScope) {\n  return this.eventTargetListeners_.getListener(\n      String(type), listener, capture, opt_listenerScope);\n};\n\n\n/** @override */\ngoog.events.EventTarget.prototype.hasListener = function(\n    opt_type, opt_capture) {\n  var id = (opt_type !== undefined) ? String(opt_type) : undefined;\n  return this.eventTargetListeners_.hasListener(id, opt_capture);\n};\n\n\n/**\n * Sets the target to be used for `event.target` when firing\n * event. Mainly used for testing. For example, see\n * `goog.testing.events.mixinListenable`.\n * @param {!Object} target The target.\n */\ngoog.events.EventTarget.prototype.setTargetForTesting = function(target) {\n  this.actualEventTarget_ = target;\n};\n\n\n/**\n * Asserts that the event target instance is initialized properly.\n * @private\n */\ngoog.events.EventTarget.prototype.assertInitialized_ = function() {\n  goog.asserts.assert(\n      this.eventTargetListeners_,\n      'Event target is not initialized. Did you call the superclass ' +\n          '(goog.events.EventTarget) constructor?');\n};\n\n\n/**\n * Dispatches the given event on the ancestorsTree.\n *\n * @param {!Object} target The target to dispatch on.\n * @param {goog.events.Event|Object|string} e The event object.\n * @param {Array<goog.events.Listenable>=} opt_ancestorsTree The ancestors\n *     tree of the target, in reverse order from the closest ancestor\n *     to the root event target. May be null if the target has no ancestor.\n * @return {boolean} If anyone called preventDefault on the event object (or\n *     if any of the listeners returns false) this will also return false.\n * @private\n */\ngoog.events.EventTarget.dispatchEventInternal_ = function(\n    target, e, opt_ancestorsTree) {\n  /** @suppress {missingProperties} */\n  var type = e.type || /** @type {string} */ (e);\n\n  // If accepting a string or object, create a custom event object so that\n  // preventDefault and stopPropagation work with the event.\n  if (typeof e === 'string') {\n    e = new goog.events.Event(e, target);\n  } else if (!(e instanceof goog.events.Event)) {\n    var oldEvent = e;\n    e = new goog.events.Event(type, target);\n    goog.object.extend(e, oldEvent);\n  } else {\n    e.target = e.target || target;\n  }\n\n  var rv = true, currentTarget;\n\n  // Executes all capture listeners on the ancestors, if any.\n  if (opt_ancestorsTree) {\n    for (var i = opt_ancestorsTree.length - 1; !e.propagationStopped_ && i >= 0;\n         i--) {\n      currentTarget = e.currentTarget = opt_ancestorsTree[i];\n      rv = currentTarget.fireListeners(type, true, e) && rv;\n    }\n  }\n\n  // Executes capture and bubble listeners on the target.\n  if (!e.propagationStopped_) {\n    currentTarget = /** @type {?} */ (e.currentTarget = target);\n    rv = currentTarget.fireListeners(type, true, e) && rv;\n    if (!e.propagationStopped_) {\n      rv = currentTarget.fireListeners(type, false, e) && rv;\n    }\n  }\n\n  // Executes all bubble listeners on the ancestors, if any.\n  if (opt_ancestorsTree) {\n    for (i = 0; !e.propagationStopped_ && i < opt_ancestorsTree.length; i++) {\n      currentTarget = e.currentTarget = opt_ancestorsTree[i];\n      rv = currentTarget.fireListeners(type, false, e) && rv;\n    }\n  }\n\n  return rv;\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","~$goog.events.Listenable","^IT","^KS","^LV","~$goog.events.ListenerMap","^K4","^M4"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/eventtarget.js"],"^JD",["^J4",["^M;"]],"^IR",true,"^IS",["^IT","^LV","^JF","^M4","^K4","^NW","^NX","^KS"]],["^ ","^IV",[1579837703000],"^IW","goog.ui.style.app.primaryactionbuttonrenderer.js","^IX",["^IY","goog/ui/style/app/primaryactionbuttonrenderer.js"],"^IZ","goog/ui/style/app/primaryactionbuttonrenderer.js","^I[","^J0","^J1","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Renderer for {@link goog.ui.Button}s in App style. This\n * type of button is typically used for an application's \"primary action,\" eg\n * in Gmail, it's \"Compose,\" in Calendar, it's \"Create Event\".\n *\n */\n\ngoog.provide('goog.ui.style.app.PrimaryActionButtonRenderer');\n\ngoog.require('goog.ui.Button');\ngoog.require('goog.ui.registry');\ngoog.require('goog.ui.style.app.ButtonRenderer');\n\n\n\n/**\n * Custom renderer for {@link goog.ui.Button}s. This renderer supports the\n * \"primary action\" style for buttons.\n *\n * @constructor\n * @extends {goog.ui.style.app.ButtonRenderer}\n * @final\n */\ngoog.ui.style.app.PrimaryActionButtonRenderer = function() {\n  goog.ui.style.app.ButtonRenderer.call(this);\n};\ngoog.inherits(\n    goog.ui.style.app.PrimaryActionButtonRenderer,\n    goog.ui.style.app.ButtonRenderer);\ngoog.addSingletonGetter(goog.ui.style.app.PrimaryActionButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.style.app.PrimaryActionButtonRenderer.CSS_CLASS =\n    'goog-primaryactionbutton';\n\n\n/**\n * Array of arrays of CSS classes that we want composite classes added and\n * removed for in IE6 and lower as a workaround for lack of multi-class CSS\n * selector support.\n * @type {Array<Array<string>>}\n */\ngoog.ui.style.app.PrimaryActionButtonRenderer.IE6_CLASS_COMBINATIONS = [\n  ['goog-button-base-disabled', 'goog-primaryactionbutton'],\n  ['goog-button-base-focused', 'goog-primaryactionbutton'],\n  ['goog-button-base-hover', 'goog-primaryactionbutton']\n];\n\n\n/** @override */\ngoog.ui.style.app.PrimaryActionButtonRenderer.prototype.getCssClass =\n    function() {\n  return goog.ui.style.app.PrimaryActionButtonRenderer.CSS_CLASS;\n};\n\n\n/** @override */\ngoog.ui.style.app.PrimaryActionButtonRenderer.prototype\n    .getIe6ClassCombinations = function() {\n  return goog.ui.style.app.PrimaryActionButtonRenderer.IE6_CLASS_COMBINATIONS;\n};\n\n\n// Register a decorator factory function for\n// goog.ui.style.app.PrimaryActionButtonRenderer.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.style.app.PrimaryActionButtonRenderer.CSS_CLASS, function() {\n      return new goog.ui.Button(\n          null, goog.ui.style.app.PrimaryActionButtonRenderer.getInstance());\n    });\n","^J2",1579837703000,"^J3",["^J4",["^IT","^NO","~$goog.ui.style.app.ButtonRenderer","^NQ"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/style/app/primaryactionbuttonrenderer.js"],"^JD",["^J4",["~$goog.ui.style.app.PrimaryActionButtonRenderer"]],"^IR",true,"^IS",["^IT","^NQ","^NO","^NY"]],["^ ","^IV",[1579837703000],"^IW","goog.crypt.ctr.js","^IX",["^IY","goog/crypt/ctr.js"],"^IZ","goog/crypt/ctr.js","^I[","^J0","^J1","// Copyright 2016 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\ngoog.provide('goog.crypt.Ctr');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.crypt');\n\n/**\n * Implementation of Ctr mode for block ciphers.  See\n * http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation\n * #Cipher-block_chaining_.28Ctr.29. for an overview, and\n * http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf\n * for the spec.\n *\n * @param {!goog.crypt.BlockCipher} cipher The block cipher to use.\n * @constructor\n * @final\n * @struct\n */\ngoog.crypt.Ctr = function(cipher) {\n\n  /**\n   * Block cipher.\n   * @type {!goog.crypt.BlockCipher}\n   * @private\n   */\n  this.cipher_ = cipher;\n};\n\n/**\n * Encrypts a message.\n *\n * @param {!Array<number>|!Uint8Array} plainText Message to encrypt. An array of\n *     bytes. The length does not have to be a multiple of the blocksize.\n * @param {!Array<number>|!Uint8Array} initialVector Initial vector for the Ctr\n *     mode. An array of bytes with the same length as the block size, that\n *     should be not reused when using the same key.\n * @return {!Array<number>} Encrypted message.\n */\ngoog.crypt.Ctr.prototype.encrypt = function(plainText, initialVector) {\n\n  goog.asserts.assert(\n      initialVector.length == this.cipher_.BLOCK_SIZE,\n      'Initial vector must be size of one block.');\n\n  // Copy the IV, so it's not modified.\n  var counter = goog.array.clone(initialVector);\n\n  var keyStreamBlock = [];\n  var encryptedArray = [];\n  var plainTextBlock = [];\n\n  while (encryptedArray.length < plainText.length) {\n    keyStreamBlock = this.cipher_.encrypt(counter);\n    goog.crypt.Ctr.incrementBigEndianCounter_(counter);\n\n    plainTextBlock = goog.array.slice(\n        plainText, encryptedArray.length,\n        encryptedArray.length + this.cipher_.BLOCK_SIZE);\n    goog.array.extend(\n        encryptedArray,\n        goog.crypt.xorByteArray(\n            plainTextBlock,\n            goog.array.slice(keyStreamBlock, 0, plainTextBlock.length)));\n  }\n\n  return encryptedArray;\n};\n\n\n/**\n * Decrypts a message. In CTR, this is the same as encrypting.\n *\n * @param {!Array<number>|!Uint8Array} cipherText Message to decrypt. The length\n *     does not have to be a multiple of the blocksize.\n * @param {!Array<number>|!Uint8Array} initialVector Initial vector for the Ctr\n *     mode. An array of bytes with the same length as the block size.\n * @return {!Array<number>} Decrypted message.\n */\ngoog.crypt.Ctr.prototype.decrypt = goog.crypt.Ctr.prototype.encrypt;\n\n/**\n * Increments the big-endian integer represented in counter in-place.\n *\n * @param {!Array<number>|!Uint8Array} counter The array of bytes to modify.\n * @private\n */\ngoog.crypt.Ctr.incrementBigEndianCounter_ = function(counter) {\n  for (var i = counter.length - 1; i >= 0; i--) {\n    var currentByte = counter[i];\n    currentByte = (currentByte + 1) & 0xFF;  // Allow wrapping around.\n    counter[i] = currentByte;\n    if (currentByte != 0) {\n      // This iteration hasn't wrapped around, which means there is\n      // no carry to add to the next byte.\n      return;\n    }  // else, repeat with next byte.\n  }\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","^JG","^IT","^JJ"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/ctr.js"],"^JD",["^J4",["~$goog.crypt.Ctr"]],"^IR",true,"^IS",["^IT","^JJ","^JF","^JG"]],["^ ","^IV",[1579837703000],"^IW","goog.locale.locale.js","^IX",["^IY","goog/locale/locale.js"],"^IZ","goog/locale/locale.js","^I[","^J0","^J1","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions for dealing with Date formatting & Parsing,\n * County and language name, TimeZone list.\n * @suppress {deprecated} Use goog.i18n instead.\n */\n\n\n/**\n * Namespace for locale related functions.\n */\ngoog.provide('goog.locale');\n\ngoog.require('goog.locale.nativeNameConstants');\n\n\n/**\n * Set current locale to the specified one.\n * @param {string} localeName Locale name string. We are following the usage\n *     in CLDR, but can make a few compromise for existing name compatibility.\n */\ngoog.locale.setLocale = function(localeName) {\n  // it is common to see people use '-' as locale part separator, normalize it.\n  localeName = localeName.replace(/-/g, '_');\n  goog.locale.activeLocale_ = localeName;\n};\n\n\n/**\n * Retrieve the current locale\n * @return {string} Current locale name string.\n * @deprecated Use goog.LOCALE and goog.i18n instead.\n */\ngoog.locale.getLocale = function() {\n  if (!goog.locale.activeLocale_) {\n    goog.locale.activeLocale_ = 'en';\n  }\n  return goog.locale.activeLocale_;\n};\n\n\n// Couple of constants to represent predefined Date/Time format type.\n/**\n * Enum of resources that can be registered.\n * @enum {string}\n */\ngoog.locale.Resource = {\n  DATE_TIME_CONSTANTS: 'DateTimeConstants',\n  NUMBER_FORMAT_CONSTANTS: 'NumberFormatConstants',\n  TIME_ZONE_CONSTANTS: 'TimeZoneConstants',\n  LOCAL_NAME_CONSTANTS: 'LocaleNameConstants',\n\n  TIME_ZONE_SELECTED_IDS: 'TimeZoneSelectedIds',\n  TIME_ZONE_SELECTED_SHORT_NAMES: 'TimeZoneSelectedShortNames',\n  TIME_ZONE_SELECTED_LONG_NAMES: 'TimeZoneSelectedLongNames',\n  TIME_ZONE_ALL_LONG_NAMES: 'TimeZoneAllLongNames'\n};\n\n\n// BCP 47 language code:\n//\n// LanguageCode := LanguageSubtag\n//                (\"-\" ScriptSubtag)?\n//                (\"-\" RegionSubtag)?\n//                (\"-\" VariantSubtag)?\n//                (\"@\" Keyword \"=\" Value (\",\" Keyword \"=\" Value)* )?\n//\n// e.g. en-Latn-GB\n//\n// NOTICE:\n// No special format checking is performed. If you pass an invalid\n// language code as a parameter to the following functions,\n// you might get an unexpected result.\n\n\n/**\n * Returns the language-subtag of the given language code.\n *\n * @param {string} languageCode Language code to extract language subtag from.\n * @return {string} Language subtag (in lowercase).\n */\ngoog.locale.getLanguageSubTag = function(languageCode) {\n  var result = languageCode.match(/^\\w{2,3}([-_]|$)/);\n  return result ? result[0].replace(/[_-]/g, '') : '';\n};\n\n\n/**\n * Returns the region-sub-tag of the given language code.\n *\n * @param {string} languageCode Language code to extract region subtag from.\n * @return {string} Region sub-tag (in uppercase).\n */\ngoog.locale.getRegionSubTag = function(languageCode) {\n  var result = languageCode.match(/[-_]([a-zA-Z]{2}|\\d{3})([-_]|$)/);\n  return result ? result[0].replace(/[_-]/g, '') : '';\n};\n\n\n/**\n * Returns the script subtag of the locale with the first alphabet in uppercase\n * and the rest 3 characters in lower case.\n *\n * @param {string} languageCode Language Code to extract script subtag from.\n * @return {string} Script subtag.\n */\ngoog.locale.getScriptSubTag = function(languageCode) {\n  var result = languageCode.split(/[-_]/g);\n  return result.length > 1 && result[1].match(/^[a-zA-Z]{4}$/) ? result[1] : '';\n};\n\n\n/**\n * Returns the variant-sub-tag of the given language code.\n *\n * @param {string} languageCode Language code to extract variant subtag from.\n * @return {string} Variant sub-tag.\n */\ngoog.locale.getVariantSubTag = function(languageCode) {\n  var result = languageCode.match(/[-_]([a-z]{2,})/);\n  return result ? result[1] : '';\n};\n\n\n/**\n * Returns the country name of the provided language code in its native\n * language.\n *\n * This method depends on goog.locale.nativeNameConstants available from\n * nativenameconstants.js. User of this method has to add dependency to this.\n *\n * @param {string} countryCode Code to lookup the country name for.\n *\n * @return {string} Country name for the provided language code.\n */\ngoog.locale.getNativeCountryName = function(countryCode) {\n  var key = goog.locale.getLanguageSubTag(countryCode) + '_' +\n      goog.locale.getRegionSubTag(countryCode);\n  return key in goog.locale.nativeNameConstants['COUNTRY'] ?\n      goog.locale.nativeNameConstants['COUNTRY'][key] :\n      countryCode;\n};\n\n\n/**\n * Returns the localized country name for the provided language code in the\n * current or provided locale symbols set.\n *\n * This method depends on `goog.locale.LocaleNameConstants__<locale>` available\n * from http://go/js_locale_data. User of this method has to add dependency to\n * this.\n *\n * @param {string} languageCode Language code to lookup the country name for.\n * @param {Object=} opt_localeSymbols If omitted the current locale symbol\n *     set is used.\n *\n * @return {string} Localized country name.\n */\ngoog.locale.getLocalizedCountryName = function(\n    languageCode, opt_localeSymbols) {\n  var code = goog.locale.getRegionSubTag(languageCode);\n  var name =\n      goog.locale.getLocalizedRegionNameFromRegionCode(code, opt_localeSymbols);\n  return name == code ? languageCode : name;\n};\n\n/**\n * Returns the localized country name for the provided language code in the\n * current or provided locale symbols set.\n *\n * This method depends on `goog.locale.LocaleNameConstants__<locale>` available\n * from http://go/js_locale_data. User of this method has to add dependency to\n * this.\n *\n * @param {string} regionCode Two character country code or three digit region\n *      code to look up the country name for.\n * @param {?Object=} opt_localeSymbols If omitted the current locale symbol\n *     set is used.\n *\n * @return {string} Localized region name.\n */\ngoog.locale.getLocalizedRegionNameFromRegionCode = function(\n    regionCode, opt_localeSymbols) {\n  if (!opt_localeSymbols) {\n    opt_localeSymbols =\n        goog.locale.getResource('LocaleNameConstants', goog.locale.getLocale());\n  }\n  return regionCode in opt_localeSymbols['COUNTRY'] ?\n      opt_localeSymbols['COUNTRY'][regionCode] :\n      regionCode;\n};\n\n/**\n * Returns the language name of the provided language code in its native\n * language.\n *\n * This method depends on goog.locale.nativeNameConstants available from\n * nativenameconstants.js. User of this method has to add dependency to this.\n *\n * @param {string} languageCode Language code to lookup the language name for.\n *\n * @return {string} Language name for the provided language code.\n */\ngoog.locale.getNativeLanguageName = function(languageCode) {\n  if (languageCode in goog.locale.nativeNameConstants['LANGUAGE'])\n    return goog.locale.nativeNameConstants['LANGUAGE'][languageCode];\n  var code = goog.locale.getLanguageSubTag(languageCode);\n  return code in goog.locale.nativeNameConstants['LANGUAGE'] ?\n      goog.locale.nativeNameConstants['LANGUAGE'][code] :\n      languageCode;\n};\n\n\n/**\n * Returns the localized language name for the provided language code in\n * the current or provided locale symbols set.\n *\n * This method depends on `goog.locale.LocaleNameConstants__<locale>` available\n * from http://go/js_locale_data. User of this method has to add dependency to\n * this.\n *\n * @param {string} languageCode Language code to lookup the language name for.\n * @param {Object=} opt_localeSymbols locale symbol set if given.\n *\n * @return {string} Localized language name of the provided language code.\n */\ngoog.locale.getLocalizedLanguageName = function(\n    languageCode, opt_localeSymbols) {\n  if (!opt_localeSymbols) {\n    opt_localeSymbols =\n        goog.locale.getResource('LocaleNameConstants', goog.locale.getLocale());\n  }\n  if (languageCode in opt_localeSymbols['LANGUAGE'])\n    return opt_localeSymbols['LANGUAGE'][languageCode];\n  var code = goog.locale.getLanguageSubTag(languageCode);\n  return code in opt_localeSymbols['LANGUAGE'] ?\n      opt_localeSymbols['LANGUAGE'][code] :\n      languageCode;\n};\n\n\n/**\n * Register a resource object for certain locale.\n * @param {Object} dataObj The resource object being registered.\n * @param {goog.locale.Resource|string} resourceName String that represents\n *     the type of resource.\n * @param {string} localeName Locale ID.\n */\ngoog.locale.registerResource = function(dataObj, resourceName, localeName) {\n  if (!goog.locale.resourceRegistry_[resourceName]) {\n    goog.locale.resourceRegistry_[resourceName] = {};\n  }\n  goog.locale.resourceRegistry_[resourceName][localeName] = dataObj;\n  // the first registered locale becomes active one. Usually there will be\n  // only one locale per js binary bundle.\n  if (!goog.locale.activeLocale_) {\n    goog.locale.activeLocale_ = localeName;\n  }\n};\n\n\n/**\n * Returns true if the required resource has already been registered.\n * @param {goog.locale.Resource|string} resourceName String that represents\n *     the type of resource.\n * @param {string} localeName Locale ID.\n * @return {boolean} Whether the required resource has already been registered.\n */\ngoog.locale.isResourceRegistered = function(resourceName, localeName) {\n  return resourceName in goog.locale.resourceRegistry_ &&\n      localeName in goog.locale.resourceRegistry_[resourceName];\n};\n\n\n/**\n * This object maps (resourceName, localeName) to a resourceObj.\n * @type {Object}\n * @private\n */\ngoog.locale.resourceRegistry_ = {};\n\n\n/**\n * Registers the timezone constants object for a given locale name.\n * @param {Object} dataObj The resource object.\n * @param {string} localeName Locale ID.\n * @deprecated Use goog.i18n.TimeZone, no longer need this.\n */\ngoog.locale.registerTimeZoneConstants = function(dataObj, localeName) {\n  goog.locale.registerResource(\n      dataObj, goog.locale.Resource.TIME_ZONE_CONSTANTS, localeName);\n};\n\n\n/**\n * Registers the LocaleNameConstants constants object for a given locale name.\n * @param {Object} dataObj The resource object.\n * @param {string} localeName Locale ID.\n */\ngoog.locale.registerLocaleNameConstants = function(dataObj, localeName) {\n  goog.locale.registerResource(\n      dataObj, goog.locale.Resource.LOCAL_NAME_CONSTANTS, localeName);\n};\n\n\n/**\n * Registers the TimeZoneSelectedIds constants object for a given locale name.\n * @param {Object} dataObj The resource object.\n * @param {string} localeName Locale ID.\n */\ngoog.locale.registerTimeZoneSelectedIds = function(dataObj, localeName) {\n  goog.locale.registerResource(\n      dataObj, goog.locale.Resource.TIME_ZONE_SELECTED_IDS, localeName);\n};\n\n\n/**\n * Registers the TimeZoneSelectedShortNames constants object for a given\n *     locale name.\n * @param {Object} dataObj The resource object.\n * @param {string} localeName Locale ID.\n */\ngoog.locale.registerTimeZoneSelectedShortNames = function(dataObj, localeName) {\n  goog.locale.registerResource(\n      dataObj, goog.locale.Resource.TIME_ZONE_SELECTED_SHORT_NAMES, localeName);\n};\n\n\n/**\n * Registers the TimeZoneSelectedLongNames constants object for a given locale\n *     name.\n * @param {Object} dataObj The resource object.\n * @param {string} localeName Locale ID.\n */\ngoog.locale.registerTimeZoneSelectedLongNames = function(dataObj, localeName) {\n  goog.locale.registerResource(\n      dataObj, goog.locale.Resource.TIME_ZONE_SELECTED_LONG_NAMES, localeName);\n};\n\n\n/**\n * Registers the TimeZoneAllLongNames constants object for a given locale name.\n * @param {Object} dataObj The resource object.\n * @param {string} localeName Locale ID.\n */\ngoog.locale.registerTimeZoneAllLongNames = function(dataObj, localeName) {\n  goog.locale.registerResource(\n      dataObj, goog.locale.Resource.TIME_ZONE_ALL_LONG_NAMES, localeName);\n};\n\n\n/**\n * Retrieve specified resource for certain locale.\n * @param {string} resourceName String that represents the type of resource.\n * @param {string=} opt_locale Locale ID, if not given, current locale\n *     will be assumed.\n * @return {Object|undefined} The resource object that hold all the resource\n *     data, or undefined if not available.\n */\ngoog.locale.getResource = function(resourceName, opt_locale) {\n  var locale = opt_locale ? opt_locale : goog.locale.getLocale();\n\n  if (!(resourceName in goog.locale.resourceRegistry_)) {\n    return undefined;\n  }\n  return goog.locale.resourceRegistry_[resourceName][locale];\n};\n\n\n/**\n * Retrieve specified resource for certain locale with fallback. For example,\n * request of 'zh_CN' will be resolved in following order: zh_CN, zh, en.\n * If none of the above succeeds, of if the resource as indicated by\n * resourceName does not exist at all, undefined will be returned.\n *\n * @param {string} resourceName String that represents the type of resource.\n * @param {string=} opt_locale locale ID, if not given, current locale\n *     will be assumed.\n * @return {Object|undefined} The resource object for desired locale.\n */\ngoog.locale.getResourceWithFallback = function(resourceName, opt_locale) {\n  var locale = opt_locale ? opt_locale : goog.locale.getLocale();\n\n  if (!(resourceName in goog.locale.resourceRegistry_)) {\n    return undefined;\n  }\n\n  if (locale in goog.locale.resourceRegistry_[resourceName]) {\n    return goog.locale.resourceRegistry_[resourceName][locale];\n  }\n\n  // if locale has multiple parts (2 atmost in reality), fallback to base part.\n  var locale_parts = locale.split('_');\n  if (locale_parts.length > 1 &&\n      locale_parts[0] in goog.locale.resourceRegistry_[resourceName]) {\n    return goog.locale.resourceRegistry_[resourceName][locale_parts[0]];\n  }\n\n  // otherwise, fallback to 'en'\n  return goog.locale.resourceRegistry_[resourceName]['en'];\n};\n\n\n// Export global functions that are used by the date time constants files.\n// See http://go/js_locale_data\n\n/**\n * Registers the LocaleNameConstants constants object for a given locale name.\n * @param {!Object} dataObj The resource object.\n * @param {string} localeName Locale ID.\n */\nvar registerLocalNameConstants = goog.locale.registerLocaleNameConstants;\n\n/**\n * Registers the TimeZoneSelectedIds constants object for a given locale name.\n * @param {?Object} dataObj The resource object.\n * @param {string} localeName Locale ID.\n */\nvar registerTimeZoneSelectedIds = goog.locale.registerTimeZoneSelectedIds;\n\n/**\n * Registers the TimeZoneSelectedShortNames constants object for a given\n *     locale name.\n * @param {!Object} dataObj The resource object.\n * @param {string} localeName Locale ID.\n */\nvar registerTimeZoneSelectedShortNames =\n    goog.locale.registerTimeZoneSelectedShortNames;\n\n/**\n * Registers the TimeZoneSelectedLongNames constants object for a given locale\n *     name.\n * @param {!Object} dataObj The resource object.\n * @param {string} localeName Locale ID.\n */\nvar registerTimeZoneSelectedLongNames =\n    goog.locale.registerTimeZoneSelectedLongNames;\n\n/**\n * Registers the TimeZoneAllLongNames constants object for a given locale name.\n * @param {!Object} dataObj The resource object.\n * @param {string} localeName Locale ID.\n */\nvar registerTimeZoneAllLongNames = goog.locale.registerTimeZoneAllLongNames;\n","^J2",1579837703000,"^J3",["^J4",["^IT","~$goog.locale.nativeNameConstants"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/locale/locale.js"],"^JD",["^J4",["~$goog.locale"]],"^IR",true,"^IS",["^IT","^O0"]],["^ ","^IV",[1579837703000],"^IW","goog.crypt.hash.js","^IX",["^IY","goog/crypt/hash.js"],"^IZ","goog/crypt/hash.js","^I[","^J0","^J1","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Abstract cryptographic hash interface.\n *\n * See goog.crypt.Sha1 and goog.crypt.Md5 for sample implementations.\n *\n */\n\ngoog.provide('goog.crypt.Hash');\n\n\n\n/**\n * Create a cryptographic hash instance.\n *\n * @constructor\n * @struct\n */\ngoog.crypt.Hash = function() {\n  /**\n   * The block size for the hasher.\n   * @type {number}\n   */\n  this.blockSize = -1;\n};\n\n\n/**\n * Resets the internal accumulator.\n */\ngoog.crypt.Hash.prototype.reset = goog.abstractMethod;\n\n\n/**\n * Adds a byte array (array with values in [0-255] range) or a string (must\n * only contain 8-bit, i.e., Latin1 characters) to the internal accumulator.\n *\n * Many hash functions operate on blocks of data and implement optimizations\n * when a full chunk of data is readily available. Hence it is often preferable\n * to provide large chunks of data (a kilobyte or more) than to repeatedly\n * call the update method with few tens of bytes. If this is not possible, or\n * not feasible, it might be good to provide data in multiplies of hash block\n * size (often 64 bytes). Please see the implementation and performance tests\n * of your favourite hash.\n *\n * @param {Array<number>|Uint8Array|string} bytes Data used for the update.\n * @param {number=} opt_length Number of bytes to use.\n */\ngoog.crypt.Hash.prototype.update = goog.abstractMethod;\n\n\n/**\n * @return {!Array<number>} The finalized hash computed\n *     from the internal accumulator.\n */\ngoog.crypt.Hash.prototype.digest = goog.abstractMethod;\n","^J2",1579837703000,"^J3",["^J4",["^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/hash.js"],"^JD",["^J4",["^K@"]],"^IR",true,"^IS",["^IT"]],["^ ","^IV",[1579837703000],"^IW","goog.testing.fs.filesystem.js","^IX",["^IY","goog/testing/fs/filesystem.js"],"^IZ","goog/testing/fs/filesystem.js","^I[","^J0","^J1","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Mock filesystem object.\n *\n */\n\ngoog.setTestOnly('goog.testing.fs.FileSystem');\ngoog.provide('goog.testing.fs.FileSystem');\n\ngoog.require('goog.fs.FileSystem');\ngoog.require('goog.testing.fs.DirectoryEntry');\n\n\n\n/**\n * A mock filesystem object.\n *\n * @param {string=} opt_name The name of the filesystem.\n * @constructor\n * @implements {goog.fs.FileSystem}\n * @final\n */\ngoog.testing.fs.FileSystem = function(opt_name) {\n  /**\n   * The name of the filesystem.\n   * @type {string}\n   * @private\n   */\n  this.name_ = opt_name || 'goog.testing.fs.FileSystem';\n\n  /**\n   * The root entry of the filesystem.\n   * @type {!goog.testing.fs.DirectoryEntry}\n   * @private\n   */\n  this.root_ = new goog.testing.fs.DirectoryEntry(this, null, '', {});\n};\n\n\n/** @override */\ngoog.testing.fs.FileSystem.prototype.getName = function() {\n  return this.name_;\n};\n\n\n/**\n * @override\n * @return {!goog.testing.fs.DirectoryEntry}\n */\ngoog.testing.fs.FileSystem.prototype.getRoot = function() {\n  return this.root_;\n};\n","^J2",1579837703000,"^J3",["^J4",["~$goog.testing.fs.DirectoryEntry","^IT","~$goog.fs.FileSystem"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/fs/filesystem.js"],"^JD",["^J4",["~$goog.testing.fs.FileSystem"]],"^IR",true,"^IS",["^IT","^O3","^O2"]],["^ ","^IV",[1579837703000],"^IW","goog.ui.menuheader.js","^IX",["^IY","goog/ui/menuheader.js"],"^IZ","goog/ui/menuheader.js","^I[","^J0","^J1","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A class for representing menu headers.\n * @see goog.ui.Menu\n *\n */\n\ngoog.provide('goog.ui.MenuHeader');\n\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Control');\ngoog.require('goog.ui.MenuHeaderRenderer');\ngoog.require('goog.ui.registry');\n\n\n\n/**\n * Class representing a menu header.\n * @param {goog.ui.ControlContent} content Text caption or DOM structure to\n *     display as the content of the item (use to add icons or styling to\n *     menus).\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper used for\n *     document interactions.\n * @param {goog.ui.MenuHeaderRenderer=} opt_renderer Optional renderer.\n * @constructor\n * @extends {goog.ui.Control}\n */\ngoog.ui.MenuHeader = function(content, opt_domHelper, opt_renderer) {\n  goog.ui.Control.call(\n      this, content, opt_renderer || goog.ui.MenuHeaderRenderer.getInstance(),\n      opt_domHelper);\n\n  this.setSupportedState(goog.ui.Component.State.DISABLED, false);\n  this.setSupportedState(goog.ui.Component.State.HOVER, false);\n  this.setSupportedState(goog.ui.Component.State.ACTIVE, false);\n  this.setSupportedState(goog.ui.Component.State.FOCUSED, false);\n\n  // Headers are always considered disabled.\n  this.setStateInternal(goog.ui.Component.State.DISABLED);\n};\ngoog.inherits(goog.ui.MenuHeader, goog.ui.Control);\n\n\n// Register a decorator factory function for goog.ui.MenuHeaders.\ngoog.ui.registry.setDecoratorByClassName(\n    goog.ui.MenuHeaderRenderer.CSS_CLASS, function() {\n      // MenuHeader defaults to using MenuHeaderRenderer.\n      return new goog.ui.MenuHeader(null);\n    });\n","^J2",1579837703000,"^J3",["^J4",["~$goog.ui.MenuHeaderRenderer","^LC","^IT","^NO","~$goog.ui.Control"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/menuheader.js"],"^JD",["^J4",["~$goog.ui.MenuHeader"]],"^IR",true,"^IS",["^IT","^LC","^O6","^O5","^NO"]],["^ ","^IV",[1579837703000],"^IW","goog.labs.net.webchannel.channel.js","^IX",["^IY","goog/labs/net/webchannel/channel.js"],"^IZ","goog/labs/net/webchannel/channel.js","^I[","^J0","^J1","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A shared interface for WebChannelBase and BaseTestChannel.\n */\n\n\ngoog.provide('goog.labs.net.webChannel.Channel');\n\ngoog.forwardDeclare('goog.Uri');\ngoog.forwardDeclare('goog.labs.net.webChannel.BaseTestChannel');\ngoog.forwardDeclare('goog.labs.net.webChannel.ChannelRequest');\ngoog.forwardDeclare('goog.labs.net.webChannel.ChannelRequest.Error');\ngoog.forwardDeclare('goog.labs.net.webChannel.ConnectionState');\ngoog.forwardDeclare('goog.net.XhrIo');\n\n\n/**\n * Shared interface between Channel and TestChannel to support callbacks\n * between WebChannelBase and BaseTestChannel and between Channel and\n * ChannelRequest.\n *\n * @interface\n */\ngoog.labs.net.webChannel.Channel = function() {};\n\n\ngoog.scope(function() {\nconst Channel = goog.labs.net.webChannel.Channel;\n\n\n/**\n * Determines whether to use a secondary domain when the server gives us\n * a host prefix. This allows us to work around browser per-domain\n * connection limits.\n *\n * If you need to use secondary domains on different browsers and IE10,\n * you have two choices:\n *     1) If you only care about browsers that support CORS\n *        (https://developer.mozilla.org/en-US/docs/HTTP_access_control), you\n *        can use {@link #setSupportsCrossDomainXhrs} and set the appropriate\n *        CORS response headers on the server.\n *     2) Or, override this method in a subclass, and make sure that those\n *        browsers use some messaging mechanism that works cross-domain (e.g\n *        iframes and window.postMessage).\n *\n * @return {boolean} Whether to use secondary domains.\n * @see http://code.google.com/p/closure-library/issues/detail?id=339\n */\nChannel.prototype.shouldUseSecondaryDomains = goog.abstractMethod;\n\n\n/**\n * Called when creating an XhrIo object.  Override in a subclass if\n * you need to customize the behavior, for example to enable the creation of\n * XHR's capable of calling a secondary domain. Will also allow calling\n * a secondary domain if withCredentials (CORS) is enabled.\n * @param {?string} hostPrefix The host prefix, if we need an XhrIo object\n *     capable of calling a secondary domain.\n * @return {!goog.net.XhrIo} A new XhrIo object.\n */\nChannel.prototype.createXhrIo = goog.abstractMethod;\n\n\n/**\n * Callback from ChannelRequest that indicates a request has completed.\n * @param {!goog.labs.net.webChannel.ChannelRequest} request\n *     The request object.\n */\nChannel.prototype.onRequestComplete = goog.abstractMethod;\n\n\n/**\n * Returns whether the channel is closed\n * @return {boolean} true if the channel is closed.\n */\nChannel.prototype.isClosed = goog.abstractMethod;\n\n\n/**\n * Callback from ChannelRequest for when new data is received\n * @param {goog.labs.net.webChannel.ChannelRequest} request\n *     The request object.\n * @param {string} responseText The text of the response.\n */\nChannel.prototype.onRequestData = goog.abstractMethod;\n\n\n/**\n * Gets whether this channel is currently active. This is used to determine the\n * length of time to wait before retrying. This call delegates to the handler.\n * @return {boolean} Whether the channel is currently active.\n */\nChannel.prototype.isActive = goog.abstractMethod;\n\n\n/**\n * Not needed for testchannel.\n *\n * Gets the Uri used for the connection that sends data to the server.\n * @param {string} path The path on the host.\n * @return {goog.Uri} The forward channel URI.\n */\nChannel.prototype.getForwardChannelUri = goog.abstractMethod;\n\n\n/**\n * Not needed for testchannel.\n *\n * Gets the Uri used for the connection that receives data from the server.\n * @param {?string} hostPrefix The host prefix.\n * @param {string} path The path on the host.\n * @return {goog.Uri} The back channel URI.\n */\nChannel.prototype.getBackChannelUri = goog.abstractMethod;\n\n\n/**\n * Not needed for testchannel.\n *\n * Allows the handler to override a host prefix provided by the server.  Will\n * be called whenever the channel has received such a prefix and is considering\n * its use.\n * @param {?string} serverHostPrefix The host prefix provided by the server.\n * @return {?string} The host prefix the client should use.\n */\nChannel.prototype.correctHostPrefix = goog.abstractMethod;\n\n\n/**\n * Not needed for testchannel.\n *\n * Creates a data Uri applying logic for secondary hostprefix, port\n * overrides, and versioning.\n * @param {?string} hostPrefix The host prefix.\n * @param {string} path The path on the host (may be absolute or relative).\n * @param {number=} opt_overridePort Optional override port.\n * @return {goog.Uri} The data URI.\n */\nChannel.prototype.createDataUri = goog.abstractMethod;\n\n\n/**\n * Not needed for testchannel.\n *\n * Callback from TestChannel for when the channel is finished.\n * @param {goog.labs.net.webChannel.BaseTestChannel} testChannel\n *     The TestChannel.\n * @param {boolean} useChunked  Whether we can chunk responses.\n */\nChannel.prototype.testConnectionFinished = goog.abstractMethod;\n\n\n/**\n * Not needed for testchannel.\n *\n * Callback from TestChannel for when the channel has an error.\n * @param {goog.labs.net.webChannel.BaseTestChannel} testChannel\n *     The TestChannel.\n * @param {goog.labs.net.webChannel.ChannelRequest.Error} errorCode\n *     The error code of the failure.\n */\nChannel.prototype.testConnectionFailure = goog.abstractMethod;\n\n\n/**\n * Not needed for testchannel.\n * Gets the result of previous connectivity tests.\n *\n * @return {!goog.labs.net.webChannel.ConnectionState} The connectivity state.\n */\nChannel.prototype.getConnectionState = goog.abstractMethod;\n\n\n/**\n * Sets the parameter name for the http session id.\n *\n * @param {?string} httpSessionIdParam The parameter name for http session id\n */\nChannel.prototype.setHttpSessionIdParam = goog.abstractMethod;\n\n\n/**\n * Gets the parameter name for the http session id.\n *\n * @return {?string} The parameter name for the http session id.\n */\nChannel.prototype.getHttpSessionIdParam = goog.abstractMethod;\n\n\n/**\n * Sets the http session id.\n *\n * @param {string} httpSessionId The http session id\n */\nChannel.prototype.setHttpSessionId = goog.abstractMethod;\n\n\n/**\n * Gets the http session id.\n *\n * @return {?string} The http session id if there is one in effect.\n */\nChannel.prototype.getHttpSessionId = goog.abstractMethod;\n\n\n/**\n * Returns true if the channel-test is done in background.\n *\n * @return {boolean} if the channel-test is done in background.\n */\nChannel.prototype.getBackgroundChannelTest = goog.abstractMethod;\n});  // goog.scope\n","^J2",1579837703000,"^J3",["^J4",["^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchannel/channel.js"],"^JD",["^J4",["~$goog.labs.net.webChannel.Channel"]],"^IR",true,"^IS",["^IT"]],["^ ","^IV",[1579837703000],"^IW","goog.crypt.cbc.js","^IX",["^IY","goog/crypt/cbc.js"],"^IZ","goog/crypt/cbc.js","^I[","^J0","^J1","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implementation of CBC mode for block ciphers.  See\n *     http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation\n *     #Cipher-block_chaining_.28CBC.29. for description.\n *\n * @author nnaze@google.com (Nathan Naze)\n */\n\ngoog.provide('goog.crypt.Cbc');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.crypt');\ngoog.require('goog.crypt.BlockCipher');\n\n\n\n/**\n * Implements the CBC mode for block ciphers. See\n * http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation\n * #Cipher-block_chaining_.28CBC.29\n *\n * @param {!goog.crypt.BlockCipher} cipher The block cipher to use.\n * @constructor\n * @final\n * @struct\n */\ngoog.crypt.Cbc = function(cipher) {\n\n  /**\n   * Block cipher.\n   * @type {!goog.crypt.BlockCipher}\n   * @private\n   */\n  this.cipher_ = cipher;\n};\n\n\n/**\n * Encrypt a message.\n *\n * @param {!Array<number>|!Uint8Array} plainText Message to encrypt. An array of\n *     bytes. The length should be a multiple of the block size.\n * @param {!Array<number>|!Uint8Array} initialVector Initial vector for the CBC\n *     mode. An array of bytes with the same length as the block size.\n * @return {!Array<number>} Encrypted message.\n */\ngoog.crypt.Cbc.prototype.encrypt = function(plainText, initialVector) {\n\n  goog.asserts.assert(\n      plainText.length % this.cipher_.BLOCK_SIZE == 0,\n      'Data\\'s length must be multiple of block size.');\n\n  goog.asserts.assert(\n      initialVector.length == this.cipher_.BLOCK_SIZE,\n      'Initial vector must be size of one block.');\n\n  // Implementation of\n  // http://en.wikipedia.org/wiki/File:Cbc_encryption.png\n\n  var cipherText = [];\n  var vector = initialVector;\n\n  // Generate each block of the encrypted cypher text.\n  for (var blockStartIndex = 0; blockStartIndex < plainText.length;\n       blockStartIndex += this.cipher_.BLOCK_SIZE) {\n    // Takes one block from the input message.\n    var plainTextBlock = goog.array.slice(\n        plainText, blockStartIndex, blockStartIndex + this.cipher_.BLOCK_SIZE);\n\n    var input = goog.crypt.xorByteArray(plainTextBlock, vector);\n    var resultBlock = this.cipher_.encrypt(input);\n\n    goog.array.extend(cipherText, resultBlock);\n    vector = resultBlock;\n  }\n\n  return cipherText;\n};\n\n\n/**\n * Decrypt a message.\n *\n * @param {!Array<number>|!Uint8Array} cipherText Message to decrypt. An array\n *     of bytes. The length should be a multiple of the block size.\n * @param {!Array<number>|!Uint8Array} initialVector Initial vector for the CBC\n *     mode. An array of bytes with the same length as the block size.\n * @return {!Array<number>} Decrypted message.\n */\ngoog.crypt.Cbc.prototype.decrypt = function(cipherText, initialVector) {\n\n  goog.asserts.assert(\n      cipherText.length % this.cipher_.BLOCK_SIZE == 0,\n      'Data\\'s length must be multiple of block size.');\n\n  goog.asserts.assert(\n      initialVector.length == this.cipher_.BLOCK_SIZE,\n      'Initial vector must be size of one block.');\n\n  // Implementation of\n  // http://en.wikipedia.org/wiki/File:Cbc_decryption.png\n\n  var plainText = [];\n  var blockStartIndex = 0;\n  var vector = initialVector;\n\n  // Generate each block of the decrypted plain text.\n  while (blockStartIndex < cipherText.length) {\n    // Takes one block.\n    var cipherTextBlock = goog.array.slice(\n        cipherText, blockStartIndex, blockStartIndex + this.cipher_.BLOCK_SIZE);\n\n    var resultBlock = this.cipher_.decrypt(cipherTextBlock);\n    var plainTextBlock = goog.crypt.xorByteArray(vector, resultBlock);\n\n    goog.array.extend(plainText, plainTextBlock);\n    vector = cipherTextBlock;\n\n    blockStartIndex += this.cipher_.BLOCK_SIZE;\n  }\n\n  return plainText;\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","^JG","~$goog.crypt.BlockCipher","^IT","^JJ"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/crypt/cbc.js"],"^JD",["^J4",["~$goog.crypt.Cbc"]],"^IR",true,"^IS",["^IT","^JJ","^JF","^JG","^O9"]],["^ ","^IV",[1579837703000],"^IW","goog.ui.customcolorpalette.js","^IX",["^IY","goog/ui/customcolorpalette.js"],"^IZ","goog/ui/customcolorpalette.js","^I[","^J0","^J1","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A color palette with a button for adding additional colors\n * manually.\n *\n */\n\ngoog.provide('goog.ui.CustomColorPalette');\n\ngoog.require('goog.color');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.ui.ColorPalette');\ngoog.require('goog.ui.Component');\n\n\n\n/**\n * A custom color palette is a grid of color swatches and a button that allows\n * the user to add additional colors to the palette\n *\n * @param {Array<string>} initColors Array of initial colors to populate the\n *     palette with.\n * @param {goog.ui.PaletteRenderer=} opt_renderer Renderer used to render or\n *     decorate the palette; defaults to {@link goog.ui.PaletteRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper, used for\n *     document interaction.\n * @constructor\n * @extends {goog.ui.ColorPalette}\n * @final\n */\ngoog.ui.CustomColorPalette = function(initColors, opt_renderer, opt_domHelper) {\n  goog.ui.ColorPalette.call(this, initColors, opt_renderer, opt_domHelper);\n  this.setSupportedState(goog.ui.Component.State.OPENED, true);\n};\ngoog.inherits(goog.ui.CustomColorPalette, goog.ui.ColorPalette);\n\n\n/**\n * Returns an array of DOM nodes for each color, and an additional cell with a\n * '+'.\n * @override\n */\ngoog.ui.CustomColorPalette.prototype.createColorNodes = function() {\n  /** @desc Hover caption for the button that allows the user to add a color. */\n  var MSG_CLOSURE_CUSTOM_COLOR_BUTTON = goog.getMsg('Add a color');\n\n  var nl = goog.ui.CustomColorPalette.base(this, 'createColorNodes');\n  nl.push(\n      goog.dom.createDom(\n          goog.dom.TagName.DIV, {\n            'class': goog.getCssName('goog-palette-customcolor'),\n            'title': MSG_CLOSURE_CUSTOM_COLOR_BUTTON\n          },\n          '+'));\n  return nl;\n};\n\n\n/**\n * @override\n * @param {goog.events.Event} e Mouse or key event that triggered the action.\n * @return {boolean} True if the action was allowed to proceed, false otherwise.\n */\ngoog.ui.CustomColorPalette.prototype.performActionInternal = function(e) {\n  var item = /** @type {Element} */ (this.getHighlightedItem());\n  if (item) {\n    if (goog.dom.classlist.contains(\n            item, goog.getCssName('goog-palette-customcolor'))) {\n      // User activated the special \"add custom color\" swatch.\n      this.promptForCustomColor();\n    } else {\n      // User activated a normal color swatch.\n      this.setSelectedItem(item);\n      return this.dispatchEvent(goog.ui.Component.EventType.ACTION);\n    }\n  }\n  return false;\n};\n\n\n/**\n * Prompts the user to enter a custom color.  Currently uses a window.prompt\n * but could be updated to use a dialog box with a WheelColorPalette.\n */\ngoog.ui.CustomColorPalette.prototype.promptForCustomColor = function() {\n  /** @desc Default custom color dialog. */\n  var MSG_CLOSURE_CUSTOM_COLOR_PROMPT = goog.getMsg(\n      'Input custom color, i.e. pink, #F00, #D015FF or rgb(100, 50, 25)');\n\n  // A CustomColorPalette is considered \"open\" while the color selection prompt\n  // is open.  Enabling state transition events for the OPENED state and\n  // listening for OPEN events allows clients to save the selection before\n  // it is destroyed (see e.g. bug 1064701).\n  var response = null;\n  this.setOpen(true);\n  if (this.isOpen()) {\n    // The OPEN event wasn't canceled; prompt for custom color.\n    response = window.prompt(MSG_CLOSURE_CUSTOM_COLOR_PROMPT, '#FFFFFF');\n    this.setOpen(false);\n  }\n\n  if (!response) {\n    // The user hit cancel\n    return;\n  }\n\n  var color;\n\n  try {\n    color = goog.color.parse(response).hex;\n  } catch (er) {\n    /** @desc Alert message sent when the input string is not a valid color. */\n    var MSG_CLOSURE_CUSTOM_COLOR_INVALID_INPUT = goog.getMsg(\n        'ERROR: \"{$color}\" is not a valid color.', {'color': response});\n    alert(MSG_CLOSURE_CUSTOM_COLOR_INVALID_INPUT);\n    return;\n  }\n\n  // TODO(user): This is relatively inefficient.  Consider adding\n  // functionality to palette to add individual items after render time.\n  var colors = this.getColors();\n  colors.push(color);\n  this.setColors(colors);\n\n  // Set the selected color to the new color and notify listeners of the action.\n  this.setSelectedColor(color);\n  this.dispatchEvent(goog.ui.Component.EventType.ACTION);\n};\n","^J2",1579837703000,"^J3",["^J4",["^JN","^KP","^JL","^LC","^IT","~$goog.ui.ColorPalette","^JT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/customcolorpalette.js"],"^JD",["^J4",["~$goog.ui.CustomColorPalette"]],"^IR",true,"^IS",["^IT","^JL","^JN","^JT","^KP","^O;","^LC"]],["^ ","^IV",[1579837703000],"^IW","goog.proto2.descriptor.js","^IX",["^IY","goog/proto2/descriptor.js"],"^IZ","goog/proto2/descriptor.js","^I[","^J0","^J1","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Protocol Buffer (Message) Descriptor class.\n */\n\ngoog.provide('goog.proto2.Descriptor');\ngoog.provide('goog.proto2.Metadata');\n\ngoog.forwardDeclare('goog.proto2.FieldDescriptor');\ngoog.forwardDeclare('goog.proto2.Message');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.object');\ngoog.require('goog.string');\n\n\n/**\n * @typedef {{name: (string|undefined),\n *            fullName: (string|undefined),\n *            containingType: (goog.proto2.Message|undefined)}}\n */\ngoog.proto2.Metadata;\n\n\n\n/**\n * A class which describes a Protocol Buffer 2 Message.\n *\n * @param {function(new:goog.proto2.Message)} messageType Constructor for\n *      the message class that this descriptor describes.\n * @param {!goog.proto2.Metadata} metadata The metadata about the message that\n *      will be used to construct this descriptor.\n * @param {Array<!goog.proto2.FieldDescriptor>} fields The fields of the\n *      message described by this descriptor.\n *\n * @constructor\n * @final\n */\ngoog.proto2.Descriptor = function(messageType, metadata, fields) {\n\n  /**\n   * @type {function(new:goog.proto2.Message)}\n   * @private\n   */\n  this.messageType_ = messageType;\n\n  /**\n   * @type {?string}\n   * @private\n   */\n  this.name_ = metadata.name || null;\n\n  /**\n   * @type {?string}\n   * @private\n   */\n  this.fullName_ = metadata.fullName || null;\n\n  /**\n   * @type {goog.proto2.Message|undefined}\n   * @private\n   */\n  this.containingType_ = metadata.containingType;\n\n  /**\n   * The fields of the message described by this descriptor.\n   * @type {!Object<number, !goog.proto2.FieldDescriptor>}\n   * @private\n   */\n  this.fields_ = {};\n\n  for (var i = 0; i < fields.length; i++) {\n    var field = fields[i];\n    this.fields_[field.getTag()] = field;\n  }\n};\n\n\n/**\n * Returns the name of the message, if any.\n *\n * @return {?string} The name.\n */\ngoog.proto2.Descriptor.prototype.getName = function() {\n  return this.name_;\n};\n\n\n/**\n * Returns the full name of the message, if any.\n *\n * @return {?string} The name.\n */\ngoog.proto2.Descriptor.prototype.getFullName = function() {\n  return this.fullName_;\n};\n\n\n/**\n * Returns the descriptor of the containing message type or null if none.\n *\n * @return {goog.proto2.Descriptor} The descriptor.\n */\ngoog.proto2.Descriptor.prototype.getContainingType = function() {\n  if (!this.containingType_) {\n    return null;\n  }\n\n  return this.containingType_.getDescriptor();\n};\n\n\n/**\n * Returns the fields in the message described by this descriptor ordered by\n * tag.\n *\n * @return {!Array<!goog.proto2.FieldDescriptor>} The array of field\n *     descriptors.\n */\ngoog.proto2.Descriptor.prototype.getFields = function() {\n  /**\n   * @param {!goog.proto2.FieldDescriptor} fieldA First field.\n   * @param {!goog.proto2.FieldDescriptor} fieldB Second field.\n   * @return {number} Negative if fieldA's tag number is smaller, positive\n   *     if greater, zero if the same.\n   */\n  function tagComparator(fieldA, fieldB) {\n    return fieldA.getTag() - fieldB.getTag();\n  }\n\n  var fields = goog.object.getValues(this.fields_);\n  goog.array.sort(fields, tagComparator);\n\n  return fields;\n};\n\n\n/**\n * Returns the fields in the message as a key/value map, where the key is\n * the tag number of the field. DO NOT MODIFY THE RETURNED OBJECT. We return\n * the actual, internal, fields map for performance reasons, and changing the\n * map can result in undefined behavior of this library.\n *\n * @return {!Object<number, !goog.proto2.FieldDescriptor>} The field map.\n */\ngoog.proto2.Descriptor.prototype.getFieldsMap = function() {\n  return this.fields_;\n};\n\n\n/**\n * Returns the field matching the given name, if any. Note that\n * this method searches over the *original* name of the field,\n * not the camelCase version.\n *\n * @param {string} name The field name for which to search.\n *\n * @return {goog.proto2.FieldDescriptor} The field found, if any.\n */\ngoog.proto2.Descriptor.prototype.findFieldByName = function(name) {\n  var valueFound = goog.object.findValue(\n      this.fields_,\n      function(field, key, obj) { return field.getName() == name; });\n\n  return /** @type {goog.proto2.FieldDescriptor} */ (valueFound) || null;\n};\n\n\n/**\n * Returns the field matching the given tag number, if any.\n *\n * @param {number|string} tag The field tag number for which to search.\n *\n * @return {goog.proto2.FieldDescriptor} The field found, if any.\n */\ngoog.proto2.Descriptor.prototype.findFieldByTag = function(tag) {\n  goog.asserts.assert(goog.string.isNumeric(tag));\n  return this.fields_[parseInt(tag, 10)] || null;\n};\n\n\n/**\n * Creates an instance of the message type that this descriptor\n * describes.\n *\n * @return {!goog.proto2.Message} The instance of the message.\n */\ngoog.proto2.Descriptor.prototype.createMessageInstance = function() {\n  return new this.messageType_;\n};\n","^J2",1579837703000,"^J3",["^J4",["^JF","^K7","^IT","^KS","^JJ"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/proto2/descriptor.js"],"^JD",["^J4",["~$goog.proto2.Descriptor","~$goog.proto2.Metadata"]],"^IR",true,"^IS",["^IT","^JJ","^JF","^KS","^K7"]],["^ ","^KY",[],"^KZ",true,"^K[",false,"^IV",[1579837703000],"^L0",[],"^L1",[],"^L2",[],"^L3","es3","^L4",null,"^L5","~$module$goog$bootstrap$webworkers","^IW","module$goog$bootstrap$webworkers.js","^IX",["^IY","goog/bootstrap/webworkers.js"],"^IZ","goog/bootstrap/webworkers.js","^I[","^L7","^L8",[],"^J1","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A bootstrap for dynamically requiring Closure within an HTML5\n * Web Worker context. To use this, first set CLOSURE_BASE_PATH to the directory\n * containing base.js (relative to the main script), then use importScripts to\n * load this file and base.js (in that order). After this you can use\n * goog.require for further imports.\n *\n * @nocompile\n */\n\n\n/**\n * Imports a script using the Web Worker importScript API.\n *\n * @param {string} src The script source.\n * @return {boolean} True if the script was imported, false otherwise.\n */\nthis.CLOSURE_IMPORT_SCRIPT = (function(global) {\n  return function(src, opt_sourceText) {\n    if (opt_sourceText) {\n      eval(opt_sourceText)\n    } else {\n      global['importScripts'](src);\n    }\n    return true;\n  };\n})(this);\n","^J2",1579837703000,"^J3",["^J4",[]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^L9",[],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/bootstrap/webworkers.js"],"^JD",["^J4",["^O?"]],"^L:",false,"^IR",true,"^IS",[],"^L;",false],["^ ","^IV",[1579837703000],"^IW","goog.editor.defines.js","^IX",["^IY","goog/editor/defines.js"],"^IZ","goog/editor/defines.js","^I[","^J0","^J1","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Text editor constants for compile time feature selection.\n *\n */\n\ngoog.provide('goog.editor.defines');\n\n\n/**\n * @define {boolean} Use contentEditable in FF.\n * There are a number of known bugs when the only content in your field is\n * inline (e.g. just text, no block elements):\n * -indent is a noop and then DOMSubtreeModified events stop firing until\n *    the structure of the DOM is changed (e.g. make something bold).\n * -inserting lists inserts just a NBSP, no list!\n * Once those two are fixed, we should have one client guinea pig it and put\n * it through a QA run. If we can file the bugs with Mozilla, there's a chance\n * they'll fix them for a dot release of Firefox 3.\n */\ngoog.editor.defines.USE_CONTENTEDITABLE_IN_FIREFOX_3 =\n    goog.define('goog.editor.defines.USE_CONTENTEDITABLE_IN_FIREFOX_3', false);\n","^J2",1579837703000,"^J3",["^J4",["^IT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/defines.js"],"^JD",["^J4",["~$goog.editor.defines"]],"^IR",true,"^IS",["^IT"]],["^ ","^IV",[1579837703000],"^IW","goog.labs.useragent.device.js","^IX",["^IY","goog/labs/useragent/device.js"],"^IZ","goog/labs/useragent/device.js","^I[","^J0","^J1","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Closure user device detection (based on user agent).\n * @see http://en.wikipedia.org/wiki/User_agent\n * For more information on browser brand, platform, or engine see the other\n * sub-namespaces in goog.labs.userAgent (browser, platform, and engine).\n *\n */\n\ngoog.provide('goog.labs.userAgent.device');\n\ngoog.require('goog.labs.userAgent.util');\n\n\n/**\n * Currently we detect the iPhone, iPod and Android mobiles (devices that have\n * both Android and Mobile in the user agent string).\n *\n * @return {boolean} Whether the user is using a mobile device.\n */\ngoog.labs.userAgent.device.isMobile = function() {\n  return !goog.labs.userAgent.device.isTablet() &&\n      (goog.labs.userAgent.util.matchUserAgent('iPod') ||\n       goog.labs.userAgent.util.matchUserAgent('iPhone') ||\n       goog.labs.userAgent.util.matchUserAgent('Android') ||\n       goog.labs.userAgent.util.matchUserAgent('IEMobile'));\n};\n\n\n/**\n * Currently we detect Kindle Fire, iPad, and Android tablets (devices that have\n * Android but not Mobile in the user agent string).\n *\n * @return {boolean} Whether the user is using a tablet.\n */\ngoog.labs.userAgent.device.isTablet = function() {\n  return goog.labs.userAgent.util.matchUserAgent('iPad') ||\n      (goog.labs.userAgent.util.matchUserAgent('Android') &&\n       !goog.labs.userAgent.util.matchUserAgent('Mobile')) ||\n      goog.labs.userAgent.util.matchUserAgent('Silk');\n};\n\n\n/**\n * @return {boolean} Whether the user is using a desktop computer (which we\n *     assume to be the case if they are not using either a mobile or tablet\n *     device).\n */\ngoog.labs.userAgent.device.isDesktop = function() {\n  return !goog.labs.userAgent.device.isMobile() &&\n      !goog.labs.userAgent.device.isTablet();\n};\n","^J2",1579837703000,"^J3",["^J4",["^IT","~$goog.labs.userAgent.util"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/useragent/device.js"],"^JD",["^J4",["~$goog.labs.userAgent.device"]],"^IR",true,"^IS",["^IT","^OA"]],["^ ","^IV",[1579837703000],"^IW","goog.spell.spellcheck.js","^IX",["^IY","goog/spell/spellcheck.js"],"^IZ","goog/spell/spellcheck.js","^I[","^J0","^J1","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Support class for spell checker components.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.spell.SpellCheck');\ngoog.provide('goog.spell.SpellCheck.WordChangedEvent');\n\ngoog.require('goog.Timer');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.structs.Set');\n\n\n\n/**\n * Support class for spell checker components. Provides basic functionality\n * such as word lookup and caching.\n *\n * @param {function(!Array<string>, !goog.spell.SpellCheck, !Function)=}\n *     opt_lookupFunction Function to use for word lookup. Must\n *     accept an array of words, an object reference and a callback function as\n *     parameters. It must also call the callback function (as a method on the\n *     object), once ready, with an array containing the original words, their\n *     spelling status and optionally an array of suggestions.\n * @param {string=} opt_language Content language.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.spell.SpellCheck = function(opt_lookupFunction, opt_language) {\n  goog.events.EventTarget.call(this);\n\n  /**\n   * Function used to lookup spelling of words.\n   * @private {?function(!Array<string>, !goog.spell.SpellCheck, !Function)}\n   */\n  this.lookupFunction_ = opt_lookupFunction || null;\n\n  /**\n   * Cache for words not yet checked with lookup function.\n   * @type {goog.structs.Set}\n   * @private\n   */\n  this.unknownWords_ = new goog.structs.Set();\n\n  this.setLanguage(opt_language);\n};\ngoog.inherits(goog.spell.SpellCheck, goog.events.EventTarget);\n\n\n/**\n * Delay, in ms, to wait for additional words to be entered before a lookup\n * operation is triggered.\n *\n * @type {number}\n * @private\n */\ngoog.spell.SpellCheck.LOOKUP_DELAY_ = 100;\n\n\n/**\n * Constants for event names\n *\n * @enum {string}\n */\ngoog.spell.SpellCheck.EventType = {\n  /**\n   * Fired when all pending words have been processed.\n   */\n  READY: 'ready',\n\n  /**\n   * Fired when all lookup function failed.\n   */\n  ERROR: 'error',\n\n  /**\n   * Fired when a word's status is changed.\n   */\n  WORD_CHANGED: 'wordchanged'\n};\n\n\n/**\n * Cache. Shared across all spell checker instances. Map with language as the\n * key and a cache for that language as the value.\n *\n * @type {Object}\n * @private\n */\ngoog.spell.SpellCheck.cache_ = {};\n\n\n/**\n * Content Language.\n * @type {string}\n * @private\n */\ngoog.spell.SpellCheck.prototype.language_ = '';\n\n\n/**\n * Cache for set language. Reference to the element corresponding to the set\n * language in the static goog.spell.SpellCheck.cache_.\n *\n * @type {Object|undefined}\n * @private\n */\ngoog.spell.SpellCheck.prototype.cache_;\n\n\n/**\n * Id for timer processing the pending queue.\n *\n * @type {number}\n * @private\n */\ngoog.spell.SpellCheck.prototype.queueTimer_ = 0;\n\n\n/**\n * Whether a lookup operation is in progress.\n *\n * @type {boolean}\n * @private\n */\ngoog.spell.SpellCheck.prototype.lookupInProgress_ = false;\n\n\n/**\n * Codes representing the status of an individual word.\n *\n * @enum {number}\n */\ngoog.spell.SpellCheck.WordStatus = {\n  UNKNOWN: 0,\n  VALID: 1,\n  INVALID: 2,\n  IGNORED: 3,\n  CORRECTED: 4  // Temporary status, not stored in cache\n};\n\n\n/**\n * Fields for word array in cache.\n *\n * @enum {number}\n */\ngoog.spell.SpellCheck.CacheIndex = {\n  STATUS: 0,\n  SUGGESTIONS: 1\n};\n\n\n/**\n * Regular expression for identifying word boundaries.\n *\n * @type {string}\n */\ngoog.spell.SpellCheck.WORD_BOUNDARY_CHARS =\n    '\\t\\r\\n\\u00A0 !\\\"#$%&()*+,-./\\\\\\\\:;<=>?@\\\\[\\\\]^_`{|}~';\n\n\n/**\n * Regular expression for identifying word boundaries.\n *\n * @type {RegExp}\n */\ngoog.spell.SpellCheck.WORD_BOUNDARY_REGEX =\n    new RegExp('[' + goog.spell.SpellCheck.WORD_BOUNDARY_CHARS + ']');\n\n\n/**\n * Regular expression for splitting a string into individual words and blocks of\n * separators. Matches zero or one word followed by zero or more separators.\n *\n * @type {RegExp}\n */\ngoog.spell.SpellCheck.SPLIT_REGEX = new RegExp(\n    '([^' + goog.spell.SpellCheck.WORD_BOUNDARY_CHARS + ']*)' +\n    '([' + goog.spell.SpellCheck.WORD_BOUNDARY_CHARS + ']*)');\n\n\n/**\n * Sets the lookup function.\n *\n * @param {Function} f Function to use for word lookup. Must accept an array of\n *     words, an object reference and a callback function as parameters.\n *     It must also call the callback function (as a method on the object),\n *     once ready, with an array containing the original words, their\n *     spelling status and optionally an array of suggestions.\n */\ngoog.spell.SpellCheck.prototype.setLookupFunction = function(f) {\n  this.lookupFunction_ = f;\n};\n\n\n/**\n * Sets language.\n *\n * @param {string=} opt_language Content language.\n */\ngoog.spell.SpellCheck.prototype.setLanguage = function(opt_language) {\n  this.language_ = opt_language || '';\n\n  if (!goog.spell.SpellCheck.cache_[this.language_]) {\n    goog.spell.SpellCheck.cache_[this.language_] = {};\n  }\n  this.cache_ = goog.spell.SpellCheck.cache_[this.language_];\n};\n\n\n/**\n * Returns language.\n *\n * @return {string} Content language.\n */\ngoog.spell.SpellCheck.prototype.getLanguage = function() {\n  return this.language_;\n};\n\n\n/**\n * Checks spelling for a block of text.\n *\n * @param {string} text Block of text to spell check.\n */\ngoog.spell.SpellCheck.prototype.checkBlock = function(text) {\n  var words = text.split(goog.spell.SpellCheck.WORD_BOUNDARY_REGEX);\n\n  var len = words.length;\n  for (var word, i = 0; i < len; i++) {\n    word = words[i];\n    this.checkWord_(word);\n  }\n\n  if (!this.queueTimer_ && !this.lookupInProgress_ &&\n      this.unknownWords_.getCount()) {\n    this.processPending_();\n  } else if (this.unknownWords_.getCount() == 0) {\n    this.dispatchEvent(goog.spell.SpellCheck.EventType.READY);\n  }\n};\n\n\n/**\n * Checks spelling for a single word. Returns the status of the supplied word,\n * or UNKNOWN if it's not cached. If it's not cached the word is added to a\n * queue and checked with the verification implementation with a short delay.\n *\n * @param {string} word Word to check spelling of.\n * @return {goog.spell.SpellCheck.WordStatus} The status of the supplied word,\n *     or UNKNOWN if it's not cached.\n */\ngoog.spell.SpellCheck.prototype.checkWord = function(word) {\n  var status = this.checkWord_(word);\n\n  if (status == goog.spell.SpellCheck.WordStatus.UNKNOWN && !this.queueTimer_ &&\n      !this.lookupInProgress_) {\n    this.queueTimer_ = goog.Timer.callOnce(\n        this.processPending_, goog.spell.SpellCheck.LOOKUP_DELAY_, this);\n  }\n\n  return status;\n};\n\n\n/**\n * Checks spelling for a single word. Returns the status of the supplied word,\n * or UNKNOWN if it's not cached.\n *\n * @param {string} word Word to check spelling of.\n * @return {goog.spell.SpellCheck.WordStatus} The status of the supplied word,\n *     or UNKNOWN if it's not cached.\n * @private\n */\ngoog.spell.SpellCheck.prototype.checkWord_ = function(word) {\n  if (!word) {\n    return goog.spell.SpellCheck.WordStatus.INVALID;\n  }\n\n  var cacheEntry = this.cache_[word];\n  if (!cacheEntry) {\n    this.unknownWords_.add(word);\n    return goog.spell.SpellCheck.WordStatus.UNKNOWN;\n  }\n\n  return cacheEntry[goog.spell.SpellCheck.CacheIndex.STATUS];\n};\n\n\n/**\n * Processes pending words unless a lookup operation has already been queued or\n * is in progress.\n *\n * @throws {Error}\n */\ngoog.spell.SpellCheck.prototype.processPending = function() {\n  if (this.unknownWords_.getCount()) {\n    if (!this.queueTimer_ && !this.lookupInProgress_) {\n      this.processPending_();\n    }\n  } else {\n    this.dispatchEvent(goog.spell.SpellCheck.EventType.READY);\n  }\n};\n\n\n/**\n * Processes pending words using the verification callback.\n *\n * @throws {Error}\n * @private\n */\ngoog.spell.SpellCheck.prototype.processPending_ = function() {\n  if (!this.lookupFunction_) {\n    throw new Error('No lookup function provided for spell checker.');\n  }\n\n  if (this.unknownWords_.getCount()) {\n    this.lookupInProgress_ = true;\n    var func = this.lookupFunction_;\n    func(this.unknownWords_.getValues(), this, this.lookupCallback_);\n  } else {\n    this.dispatchEvent(goog.spell.SpellCheck.EventType.READY);\n  }\n\n  this.queueTimer_ = 0;\n};\n\n\n/**\n * Callback for lookup function.\n *\n * @param {Array<Array<?>>} data Data array. Each word is represented by an\n *     array containing the word, the status and optionally an array of\n *     suggestions. Passing null indicates that the operation failed.\n * @private\n *\n * Example:\n * obj.lookupCallback_([\n *   ['word', VALID],\n *   ['wrod', INVALID, ['word', 'wood', 'rod']]\n * ]);\n */\ngoog.spell.SpellCheck.prototype.lookupCallback_ = function(data) {\n\n  // Lookup function failed; abort then dispatch error event.\n  if (data == null) {\n    if (this.queueTimer_) {\n      goog.Timer.clear(this.queueTimer_);\n      this.queueTimer_ = 0;\n    }\n    this.lookupInProgress_ = false;\n\n    this.dispatchEvent(goog.spell.SpellCheck.EventType.ERROR);\n    return;\n  }\n\n  for (var a, i = 0; a = data[i]; i++) {\n    this.setWordStatus_(a[0], a[1], a[2]);\n  }\n  this.lookupInProgress_ = false;\n\n  // Fire ready event if all pending words have been processed.\n  if (this.unknownWords_.getCount() == 0) {\n    this.dispatchEvent(goog.spell.SpellCheck.EventType.READY);\n\n    // Process pending\n  } else if (!this.queueTimer_) {\n    this.queueTimer_ = goog.Timer.callOnce(\n        this.processPending_, goog.spell.SpellCheck.LOOKUP_DELAY_, this);\n  }\n};\n\n\n/**\n * Sets a words spelling status.\n *\n * @param {string} word Word to set status for.\n * @param {goog.spell.SpellCheck.WordStatus} status Status of word.\n * @param {Array<string>=} opt_suggestions Suggestions.\n *\n * Example:\n * obj.setWordStatus('word', VALID);\n * obj.setWordStatus('wrod', INVALID, ['word', 'wood', 'rod']);.\n */\ngoog.spell.SpellCheck.prototype.setWordStatus = function(\n    word, status, opt_suggestions) {\n  this.setWordStatus_(word, status, opt_suggestions);\n};\n\n\n/**\n * Sets a words spelling status.\n *\n * @param {string} word Word to set status for.\n * @param {goog.spell.SpellCheck.WordStatus} status Status of word.\n * @param {Array<string>=} opt_suggestions Suggestions.\n * @private\n */\ngoog.spell.SpellCheck.prototype.setWordStatus_ = function(\n    word, status, opt_suggestions) {\n  var suggestions = opt_suggestions || [];\n  this.cache_[word] = [status, suggestions];\n  this.unknownWords_.remove(word);\n\n  this.dispatchEvent(\n      new goog.spell.SpellCheck.WordChangedEvent(this, word, status));\n};\n\n\n/**\n * Returns suggestions for the given word.\n *\n * @param {string} word Word to get suggestions for.\n * @return {Array<string>} An array of suggestions for the given word.\n */\ngoog.spell.SpellCheck.prototype.getSuggestions = function(word) {\n  var cacheEntry = this.cache_[word];\n\n  if (!cacheEntry) {\n    this.checkWord(word);\n    return [];\n  }\n\n  return cacheEntry[goog.spell.SpellCheck.CacheIndex.STATUS] ==\n          goog.spell.SpellCheck.WordStatus.INVALID ?\n      cacheEntry[goog.spell.SpellCheck.CacheIndex.SUGGESTIONS] :\n      [];\n};\n\n\n\n/**\n * Object representing a word changed event. Fired when the status of a word\n * changes.\n *\n * @param {goog.spell.SpellCheck} target Spellcheck object initiating event.\n * @param {string} word Word to set status for.\n * @param {goog.spell.SpellCheck.WordStatus} status Status of word.\n * @extends {goog.events.Event}\n * @constructor\n * @final\n */\ngoog.spell.SpellCheck.WordChangedEvent = function(target, word, status) {\n  goog.events.Event.call(\n      this, goog.spell.SpellCheck.EventType.WORD_CHANGED, target);\n\n  /**\n   * Word the status has changed for.\n   * @type {string}\n   */\n  this.word = word;\n\n  /**\n   * New status\n   * @type {goog.spell.SpellCheck.WordStatus}\n   */\n  this.status = status;\n};\ngoog.inherits(goog.spell.SpellCheck.WordChangedEvent, goog.events.Event);\n","^J2",1579837703000,"^J3",["^J4",["^M:","^IT","^M;","^K4","~$goog.structs.Set"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/spell/spellcheck.js"],"^JD",["^J4",["~$goog.spell.SpellCheck","~$goog.spell.SpellCheck.WordChangedEvent"]],"^IR",true,"^IS",["^IT","^M:","^K4","^M;","^OC"]],["^ ","^IV",[1579837703000],"^IW","goog.db.index.js","^IX",["^IY","goog/db/index.js"],"^IZ","goog/db/index.js","^I[","^J0","^J1","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Wrapper for an IndexedDB index.\n *\n */\n\n\ngoog.provide('goog.db.Index');\n\ngoog.require('goog.async.Deferred');\ngoog.require('goog.db.Cursor');\ngoog.require('goog.db.Error');\ngoog.require('goog.db.KeyRange');\ngoog.require('goog.debug');\n\n\n\n/**\n * Creates an IDBIndex wrapper object. Indexes are associated with object\n * stores and provide methods for looking up objects based on their non-key\n * properties. Should not be created directly, access through the object store\n * it belongs to.\n * @see goog.db.ObjectStore#getIndex\n *\n * @param {!IDBIndex} index Underlying IDBIndex object.\n * @constructor\n * @final\n */\ngoog.db.Index = function(index) {\n  /**\n   * Underlying IndexedDB index object.\n   *\n   * @type {!IDBIndex}\n   * @private\n   */\n  this.index_ = index;\n};\n\n\n/**\n * @return {string} Name of the index.\n */\ngoog.db.Index.prototype.getName = function() {\n  return this.index_.name;\n};\n\n\n/**\n * @return {*} Key path of the index.\n */\ngoog.db.Index.prototype.getKeyPath = function() {\n  return this.index_.keyPath;\n};\n\n\n/**\n * @return {boolean} True if the index enforces that there is only one object\n *     for each unique value it indexes on.\n */\ngoog.db.Index.prototype.isUnique = function() {\n  return this.index_.unique;\n};\n\n\n/**\n * Helper function for get and getKey.\n *\n * @param {string} fn Function name to call on the index to get the request.\n * @param {string} msg Message to give to the error.\n * @param {!IDBKeyType} key The key to look up in the index.\n * @return {!goog.async.Deferred} The resulting deferred object.\n * @private\n */\ngoog.db.Index.prototype.get_ = function(fn, msg, key) {\n  var d = new goog.async.Deferred();\n  var request;\n  try {\n    request = this.index_[fn](key);\n  } catch (err) {\n    msg += ' with key ' + goog.debug.deepExpose(key);\n    d.errback(goog.db.Error.fromException(err, msg));\n    return d;\n  }\n  request.onsuccess = function(ev) { d.callback(ev.target.result); };\n  request.onerror = function(ev) {\n    msg += ' with key ' + goog.debug.deepExpose(key);\n    d.errback(goog.db.Error.fromRequest(ev.target, msg));\n  };\n  return d;\n};\n\n\n/**\n * Fetches a single object from the object store. Even if there are multiple\n * objects that match the given key, this method will get only one of them.\n *\n * @param {!IDBKeyType} key Key to look up in the index.\n * @return {!goog.async.Deferred} The deferred object for the given record.\n */\ngoog.db.Index.prototype.get = function(key) {\n  return this.get_('get', 'getting from index ' + this.getName(), key);\n};\n\n\n/**\n * Looks up a single object from the object store and gives back the key that\n * it's listed under in the object store. Even if there are multiple records\n * that match the given key, this method returns the first.\n *\n * @param {!IDBKeyType} key Key to look up in the index.\n * @return {!goog.async.Deferred} The deferred key for the record that matches\n *     the key.\n */\ngoog.db.Index.prototype.getKey = function(key) {\n  return this.get_('getKey', 'getting key from index ' + this.getName(), key);\n};\n\n\n/**\n * Returns the values matching `opt_key` up to `opt_count`.\n *\n * If `obt_key` is a `KeyRange`, returns all keys in that range. If it is\n * `undefined`, returns all known keys.\n *\n * @param {!IDBKeyType|!goog.db.KeyRange=} opt_key Key or KeyRange to look up in\n *     the index.\n * @param {number=} opt_count The number records to return\n * @return {!goog.async.Deferred} A deferred array of objects that match the\n *     key.\n */\ngoog.db.Index.prototype.getAll = function(opt_key, opt_count) {\n  return this.getAll_(\n      'getAll', 'getting all from index ' + this.getName(), opt_key, opt_count);\n};\n\n\n/**\n * Returns the keys matching `opt_key` up to `opt_count`.\n *\n * If `obt_key` is a `KeyRange`, returns all keys in that range. If it is\n * `undefined`, returns all known keys.\n *\n * @param {!IDBKeyType|!goog.db.KeyRange=} opt_key Key or KeyRange to look up in\n *     the index.\n * @param {number=} opt_count The number records to return\n * @return {!goog.async.Deferred} A deferred array of keys for objects that\n *     match the key.\n */\ngoog.db.Index.prototype.getAllKeys = function(opt_key, opt_count) {\n  return this.getAll_(\n      'getAllKeys', 'getting all keys index ' + this.getName(), opt_key,\n      opt_count);\n};\n\n\n/**\n * Helper function for native `getAll` and `getAllKeys` on `IDBObjectStore` that\n * takes in `IDBKeyRange` as params.\n *\n * Returns the result of the native method in a `Deferred` object.\n *\n * @param {string} fn Function name to call on the index to get the request.\n * @param {string} msg Message to give to the error.\n * @param {!IDBKeyType|!goog.db.KeyRange|undefined} keyOrRange\n *     Key or KeyRange to look up in the index.\n * @param {number|undefined} count The number records to return\n * @return {!goog.async.Deferred} The resulting deferred array of objects.\n * @private\n */\ngoog.db.Index.prototype.getAll_ = function(fn, msg, keyOrRange, count) {\n  var nativeRange;\n  if (keyOrRange === undefined) {\n    nativeRange = undefined;\n  } else if (keyOrRange instanceof goog.db.KeyRange) {\n    nativeRange = keyOrRange.range();\n  } else {\n    nativeRange = goog.db.KeyRange.only(keyOrRange).range();\n  }\n\n  var d = new goog.async.Deferred();\n  var request;\n  try {\n    request = this.index_[fn](nativeRange, count);\n  } catch (err) {\n    msg += ' for range ' +\n        (nativeRange ? goog.debug.deepExpose(nativeRange) : '<all>');\n    d.errback(goog.db.Error.fromException(err, msg));\n    return d;\n  }\n  request.onsuccess = function() {\n    d.callback(request.result);\n  };\n  request.onerror = function(ev) {\n    msg += ' for range ' +\n        (nativeRange ? goog.debug.deepExpose(nativeRange) : '<all>');\n    d.errback(goog.db.Error.fromRequest(ev.target, msg));\n  };\n  return d;\n};\n\n\n/**\n * Opens a cursor over the specified key range. Returns a cursor object which is\n * able to iterate over the given range.\n *\n * Example usage:\n *\n * <code>\n *  var cursor = index.openCursor(goog.db.KeyRange.bound('a', 'c'));\n *\n *  var key = goog.events.listen(\n *      cursor, goog.db.Cursor.EventType.NEW_DATA,\n *      function() {\n *        // Do something with data.\n *        cursor.next();\n *      });\n *\n *  goog.events.listenOnce(\n *      cursor, goog.db.Cursor.EventType.COMPLETE,\n *      function() {\n *        // Clean up listener, and perform a finishing operation on the data.\n *        goog.events.unlistenByKey(key);\n *      });\n * </code>\n *\n * @param {!goog.db.KeyRange=} opt_range The key range. If undefined iterates\n *     over the whole object store.\n * @param {!goog.db.Cursor.Direction=} opt_direction The direction. If undefined\n *     moves in a forward direction with duplicates.\n * @return {!goog.db.Cursor} The cursor.\n * @throws {!goog.db.Error} If there was a problem opening the cursor.\n */\ngoog.db.Index.prototype.openCursor = function(opt_range, opt_direction) {\n  return goog.db.Cursor.openCursor(this.index_, opt_range, opt_direction);\n};\n","^J2",1579837703000,"^J3",["^J4",["^MS","^IT","^MU","^MV","^MW","^MX"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/db/index.js"],"^JD",["^J4",["^MT"]],"^IR",true,"^IS",["^IT","^MX","^MV","^MS","^MW","^MU"]],["^ ","^IV",[1579837703000],"^IW","goog.ui.containerscroller.js","^IX",["^IY","goog/ui/containerscroller.js"],"^IZ","goog/ui/containerscroller.js","^I[","^J0","^J1","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Scroll behavior that can be added onto a container.\n * @author gboyer@google.com (Garry Boyer)\n */\n\ngoog.provide('goog.ui.ContainerScroller');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.Timer');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.Container');\n\n\n\n/**\n * Plug-on scrolling behavior for a container.\n *\n * Use this to style containers, such as pop-up menus, to be scrolling, and\n * automatically keep the highlighted element visible.\n *\n * To use this, first style your container with the desired overflow\n * properties and height to achieve vertical scrolling.  Also, the scrolling\n * div should have no vertical padding, for two reasons: it is difficult to\n * compensate for, and is generally not what you want due to the strange way\n * CSS handles padding on the scrolling dimension.\n *\n * The container must already be rendered before this may be constructed.\n *\n * @param {!goog.ui.Container} container The container to attach behavior to.\n * @constructor\n * @extends {goog.Disposable}\n * @final\n */\ngoog.ui.ContainerScroller = function(container) {\n  goog.Disposable.call(this);\n\n  /**\n   * The container that we are bestowing scroll behavior on.\n   * @type {!goog.ui.Container}\n   * @private\n   */\n  this.container_ = container;\n\n  /**\n   * Event handler for this object.\n   * @type {!goog.events.EventHandler<!goog.ui.ContainerScroller>}\n   * @private\n   */\n  this.eventHandler_ = new goog.events.EventHandler(this);\n\n  this.eventHandler_.listen(\n      container, goog.ui.Component.EventType.HIGHLIGHT, this.onHighlight_);\n  this.eventHandler_.listen(\n      container, goog.ui.Component.EventType.ENTER, this.onEnter_);\n  this.eventHandler_.listen(\n      container, goog.ui.Container.EventType.AFTER_SHOW, this.onAfterShow_);\n  this.eventHandler_.listen(\n      container, goog.ui.Component.EventType.HIDE, this.onHide_);\n\n  // TODO(gboyer): Allow a ContainerScroller to be attached with a Container\n  // before the container is rendered.\n\n  this.doScrolling_(true);\n};\ngoog.inherits(goog.ui.ContainerScroller, goog.Disposable);\n\n\n/**\n * The last target the user hovered over.\n *\n * @see #onEnter_\n * @type {?goog.ui.Component}\n * @private\n */\ngoog.ui.ContainerScroller.prototype.lastEnterTarget_ = null;\n\n\n/**\n * The scrollTop of the container before it was hidden.\n * Used to restore the scroll position when the container is shown again.\n * @type {?number}\n * @private\n */\ngoog.ui.ContainerScroller.prototype.scrollTopBeforeHide_ = null;\n\n\n/**\n * Whether we are disabling the default handler for hovering.\n *\n * @see #onEnter_\n * @see #temporarilyDisableHover_\n * @type {boolean}\n * @private\n */\ngoog.ui.ContainerScroller.prototype.disableHover_ = false;\n\n\n/**\n * Handles hover events on the container's children.\n *\n * Helps enforce two constraints: scrolling should not cause mouse highlights,\n * and mouse highlights should not cause scrolling.\n *\n * @param {goog.events.Event} e The container's ENTER event.\n * @private\n */\ngoog.ui.ContainerScroller.prototype.onEnter_ = function(e) {\n  if (this.disableHover_) {\n    // The container was scrolled recently.  Since the mouse may be over the\n    // container, stop the default action of the ENTER event from causing\n    // highlights.\n    e.preventDefault();\n  } else {\n    // The mouse is moving and causing hover events.  Stop the resulting\n    // highlight (if it happens) from causing a scroll.\n    this.lastEnterTarget_ = /** @type {goog.ui.Component} */ (e.target);\n  }\n};\n\n\n/**\n * Handles highlight events on the container's children.\n * @param {goog.events.Event} e The container's highlight event.\n * @private\n */\ngoog.ui.ContainerScroller.prototype.onHighlight_ = function(e) {\n  this.doScrolling_();\n};\n\n\n/**\n * Handles AFTER_SHOW events on the container. Makes the container\n * scroll to the previously scrolled position (if there was one),\n * then adjust it to make the highlighted element be in view (if there is one).\n * If there was no previous scroll position, then center the highlighted\n * element (if there is one).\n * @param {goog.events.Event} e The container's AFTER_SHOW event.\n * @private\n */\ngoog.ui.ContainerScroller.prototype.onAfterShow_ = function(e) {\n  if (this.scrollTopBeforeHide_ != null) {\n    this.container_.getElement().scrollTop = this.scrollTopBeforeHide_;\n    // Make sure the highlighted item is still visible, in case the list\n    // or its hilighted item has changed.\n    this.doScrolling_(false);\n  } else {\n    this.doScrolling_(true);\n  }\n};\n\n\n/**\n * Handles hide events on the container. Clears out the last enter target,\n * since it is no longer applicable, and remembers the scroll position of\n * the menu so that it can be restored when the menu is reopened.\n * @param {goog.events.Event} e The container's hide event.\n * @private\n */\ngoog.ui.ContainerScroller.prototype.onHide_ = function(e) {\n  if (e.target == this.container_) {\n    this.lastEnterTarget_ = null;\n    this.scrollTopBeforeHide_ = this.container_.getElement().scrollTop;\n  }\n};\n\n\n/**\n * Centers the currently highlighted item, if this is scrollable.\n * @param {boolean=} opt_center Whether to center the highlighted element\n *     rather than simply ensure it is in view.  Useful for the first\n *     render.\n * @private\n */\ngoog.ui.ContainerScroller.prototype.doScrolling_ = function(opt_center) {\n  var highlighted = this.container_.getHighlighted();\n\n  // Only scroll if we're visible and there is a highlighted item.\n  if (this.container_.isVisible() && highlighted &&\n      highlighted != this.lastEnterTarget_) {\n    var element = this.container_.getElement();\n    goog.style.scrollIntoContainerView(\n        highlighted.getElement(), element, opt_center);\n    this.temporarilyDisableHover_();\n    this.lastEnterTarget_ = null;\n  }\n};\n\n\n/**\n * Temporarily disables hover events from changing highlight.\n * @see #onEnter_\n * @private\n */\ngoog.ui.ContainerScroller.prototype.temporarilyDisableHover_ = function() {\n  this.disableHover_ = true;\n  goog.Timer.callOnce(function() { this.disableHover_ = false; }, 0, this);\n};\n\n\n/** @override */\ngoog.ui.ContainerScroller.prototype.disposeInternal = function() {\n  goog.ui.ContainerScroller.superClass_.disposeInternal.call(this);\n  this.eventHandler_.dispose();\n  this.lastEnterTarget_ = null;\n};\n","^J2",1579837703000,"^J3",["^J4",["^M5","^M:","^LC","^IT","~$goog.ui.Container","^LV","^JS"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/containerscroller.js"],"^JD",["^J4",["~$goog.ui.ContainerScroller"]],"^IR",true,"^IS",["^IT","^LV","^M:","^M5","^JS","^LC","^OF"]],["^ ","^IV",[1579837703000],"^IW","goog.editor.link.js","^IX",["^IY","goog/editor/link.js"],"^IZ","goog/editor/link.js","^I[","^J0","^J1","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A utility class for managing editable links.\n *\n * @author nicksantos@google.com (Nick Santos)\n */\n\ngoog.provide('goog.editor.Link');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.Range');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.editor.BrowserFeature');\ngoog.require('goog.editor.Command');\ngoog.require('goog.editor.Field');\ngoog.require('goog.editor.node');\ngoog.require('goog.editor.range');\ngoog.require('goog.string');\ngoog.require('goog.string.Unicode');\ngoog.require('goog.uri.utils');\ngoog.require('goog.uri.utils.ComponentIndex');\n\n\n\n/**\n * Wrap an editable link.\n * @param {HTMLAnchorElement} anchor The anchor element.\n * @param {boolean} isNew Whether this is a new link.\n * @constructor\n * @final\n */\ngoog.editor.Link = function(anchor, isNew) {\n  /**\n   * The link DOM element.\n   * @type {HTMLAnchorElement}\n   * @private\n   */\n  this.anchor_ = anchor;\n\n  /**\n   * Whether this link represents a link just added to the document.\n   * @type {boolean}\n   * @private\n   */\n  this.isNew_ = isNew;\n\n\n  /**\n   * Any extra anchors created by the browser from a selection in the same\n   * operation that created the primary link\n   * @type {!Array<HTMLAnchorElement>}\n   * @private\n   */\n  this.extraAnchors_ = [];\n};\n\n\n/**\n * @return {HTMLAnchorElement} The anchor element.\n */\ngoog.editor.Link.prototype.getAnchor = function() {\n  return this.anchor_;\n};\n\n\n/**\n * @return {!Array<HTMLAnchorElement>} The extra anchor elements, if any,\n *     created by the browser from a selection.\n */\ngoog.editor.Link.prototype.getExtraAnchors = function() {\n  return this.extraAnchors_;\n};\n\n\n/**\n * @return {string} The inner text for the anchor.\n */\ngoog.editor.Link.prototype.getCurrentText = function() {\n  if (!this.currentText_) {\n    var anchor = this.getAnchor();\n\n    var leaf = goog.editor.node.getLeftMostLeaf(anchor);\n    if (leaf.tagName && leaf.tagName == goog.dom.TagName.IMG) {\n      this.currentText_ = leaf.getAttribute('alt') || '';\n    } else {\n      this.currentText_ = goog.dom.getRawTextContent(this.getAnchor());\n    }\n  }\n  return this.currentText_;\n};\n\n\n/**\n * @return {boolean} Whether the link is new.\n */\ngoog.editor.Link.prototype.isNew = function() {\n  return this.isNew_;\n};\n\n\n/**\n * Set the url without affecting the isNew() status of the link.\n * @param {string} url A URL.\n */\ngoog.editor.Link.prototype.initializeUrl = function(url) {\n  this.getAnchor().href = url;\n};\n\n\n/**\n * Removes the link, leaving its contents in the document.  Note that this\n * object will no longer be usable/useful after this call.\n */\ngoog.editor.Link.prototype.removeLink = function() {\n  goog.dom.flattenElement(this.anchor_);\n  this.anchor_ = null;\n  while (this.extraAnchors_.length) {\n    goog.dom.flattenElement(/** @type {Element} */ (this.extraAnchors_.pop()));\n  }\n};\n\n\n/**\n * Change the link.\n * @param {string} newText New text for the link. If the link contains all its\n *     text in one descendant, newText will only replace the text in that\n *     one node. Otherwise, we'll change the innerHTML of the whole\n *     link to newText.\n * @param {string} newUrl A new URL.\n */\ngoog.editor.Link.prototype.setTextAndUrl = function(newText, newUrl) {\n  var anchor = this.getAnchor();\n  anchor.href = newUrl;\n\n  // If the text did not change, don't update link text.\n  var currentText = this.getCurrentText();\n  if (newText != currentText) {\n    var leaf = goog.editor.node.getLeftMostLeaf(anchor);\n\n    if (leaf.tagName && leaf.tagName == goog.dom.TagName.IMG) {\n      leaf.setAttribute('alt', newText ? newText : '');\n    } else {\n      if (leaf.nodeType == goog.dom.NodeType.TEXT) {\n        leaf = leaf.parentNode;\n      }\n\n      if (goog.dom.getRawTextContent(leaf) != currentText) {\n        leaf = anchor;\n      }\n\n      goog.dom.removeChildren(leaf);\n      var domHelper = goog.dom.getDomHelper(leaf);\n      goog.dom.appendChild(leaf, domHelper.createTextNode(newText));\n    }\n\n    // The text changed, so force getCurrentText to recompute.\n    this.currentText_ = null;\n  }\n\n  this.isNew_ = false;\n};\n\n\n/**\n * Places the cursor to the right of the anchor.\n * Note that this is different from goog.editor.range's placeCursorNextTo\n * in that it specifically handles the placement of a cursor in browsers\n * that trap you in links, by adding a space when necessary and placing the\n * cursor after that space.\n */\ngoog.editor.Link.prototype.placeCursorRightOf = function() {\n  var anchor = this.getAnchor();\n  // If the browser gets stuck in a link if we place the cursor next to it,\n  // we'll place the cursor after a space instead.\n  if (goog.editor.BrowserFeature.GETS_STUCK_IN_LINKS) {\n    var spaceNode;\n    var nextSibling = anchor.nextSibling;\n\n    // Check if there is already a space after the link.  Only handle the\n    // simple case - the next node is a text node that starts with a space.\n    if (nextSibling && nextSibling.nodeType == goog.dom.NodeType.TEXT &&\n        (goog.string.startsWith(nextSibling.data, goog.string.Unicode.NBSP) ||\n         goog.string.startsWith(nextSibling.data, ' '))) {\n      spaceNode = nextSibling;\n    } else {\n      // If there isn't an obvious space to use, create one after the link.\n      var dh = goog.dom.getDomHelper(anchor);\n      spaceNode = dh.createTextNode(goog.string.Unicode.NBSP);\n      goog.dom.insertSiblingAfter(spaceNode, anchor);\n    }\n\n    // Move the selection after the space.\n    var range = goog.dom.Range.createCaret(spaceNode, 1);\n    range.select();\n  } else {\n    goog.editor.range.placeCursorNextTo(anchor, false);\n  }\n};\n\n\n/**\n * Updates the cursor position and link bubble for this link.\n * @param {goog.editor.Field} field The field in which the link is created.\n * @param {string} url The link url.\n * @private\n */\ngoog.editor.Link.prototype.updateLinkDisplay_ = function(field, url) {\n  this.initializeUrl(url);\n  this.placeCursorRightOf();\n  field.execCommand(goog.editor.Command.UPDATE_LINK_BUBBLE);\n};\n\n\n/**\n * @return {string?} The modified string for the link if the link\n *     text appears to be a valid link. Returns null if this is not\n *     a valid link address.\n */\ngoog.editor.Link.prototype.getValidLinkFromText = function() {\n  var text = goog.string.trim(this.getCurrentText());\n  if (goog.editor.Link.isLikelyUrl(text)) {\n    if (text.search(/:/) < 0) {\n      return 'http://' + goog.string.trimLeft(text);\n    }\n    return text;\n  } else if (goog.editor.Link.isLikelyEmailAddress(text)) {\n    return 'mailto:' + text;\n  }\n  return null;\n};\n\n\n/**\n * After link creation, finish creating the link depending on the type\n * of link being created.\n * @param {goog.editor.Field} field The field where this link is being created.\n */\ngoog.editor.Link.prototype.finishLinkCreation = function(field) {\n  var linkFromText = this.getValidLinkFromText();\n  if (linkFromText) {\n    this.updateLinkDisplay_(field, linkFromText);\n  } else {\n    field.execCommand(goog.editor.Command.MODAL_LINK_EDITOR, this);\n  }\n};\n\n\n/**\n * Initialize a new link.\n * @param {HTMLAnchorElement} anchor The anchor element.\n * @param {string} url The initial URL.\n * @param {string=} opt_target The target.\n * @param {Array<HTMLAnchorElement>=} opt_extraAnchors Extra anchors created\n *     by the browser when parsing a selection.\n * @return {!goog.editor.Link} The link.\n */\ngoog.editor.Link.createNewLink = function(\n    anchor, url, opt_target, opt_extraAnchors) {\n  var link = new goog.editor.Link(anchor, true);\n  link.initializeUrl(url);\n\n  if (opt_target) {\n    anchor.target = opt_target;\n  }\n  if (opt_extraAnchors) {\n    link.extraAnchors_ = opt_extraAnchors;\n  }\n\n  return link;\n};\n\n\n/**\n * Initialize a new link using text in anchor, or empty string if there is no\n * likely url in the anchor.\n * @param {HTMLAnchorElement} anchor The anchor element with likely url content.\n * @param {string=} opt_target The target.\n * @return {!goog.editor.Link} The link.\n */\ngoog.editor.Link.createNewLinkFromText = function(anchor, opt_target) {\n  var link = new goog.editor.Link(anchor, true);\n  var text = link.getValidLinkFromText();\n  link.initializeUrl(text ? text : '');\n  if (opt_target) {\n    anchor.target = opt_target;\n  }\n  return link;\n};\n\n\n/**\n * Returns true if str could be a URL, false otherwise\n *\n * Ex: TR_Util.isLikelyUrl_(\"http://www.google.com\") == true\n *     TR_Util.isLikelyUrl_(\"www.google.com\") == true\n *\n * @param {string} str String to check if it looks like a URL.\n * @return {boolean} Whether str could be a URL.\n */\ngoog.editor.Link.isLikelyUrl = function(str) {\n  // Whitespace means this isn't a domain.\n  if (/\\s/.test(str)) {\n    return false;\n  }\n\n  if (goog.editor.Link.isLikelyEmailAddress(str)) {\n    return false;\n  }\n\n  // Add a scheme if the url doesn't have one - this helps the parser.\n  var addedScheme = false;\n  if (!/^[^:\\/?#.]+:/.test(str)) {\n    str = 'http://' + str;\n    addedScheme = true;\n  }\n\n  // Parse the domain.\n  var parts = goog.uri.utils.split(str);\n\n  // Relax the rules for special schemes.\n  var scheme = parts[goog.uri.utils.ComponentIndex.SCHEME];\n  if (goog.array.indexOf(['mailto', 'aim'], scheme) != -1) {\n    return true;\n  }\n\n  // Require domains to contain a '.', unless the domain is fully qualified and\n  // forbids domains from containing invalid characters.\n  var domain = parts[goog.uri.utils.ComponentIndex.DOMAIN];\n  if (!domain ||\n      (addedScheme && (domain.indexOf('.') === -1 || domain.length < 3)) ||\n      (/[^\\w\\d\\-\\u0100-\\uffff.%]/.test(domain))) {\n    return false;\n  }\n\n  // Require http and ftp paths to start with '/'.\n  var path = parts[goog.uri.utils.ComponentIndex.PATH];\n  return !path || path.indexOf('/') == 0;\n};\n\n\n/**\n * Regular expression that matches strings that could be an email address.\n * @type {RegExp}\n * @private\n */\ngoog.editor.Link.LIKELY_EMAIL_ADDRESS_ = new RegExp(\n    '^' +                         // Test from start of string\n        '[\\\\w-]+(\\\\.[\\\\w-]+)*' +  // Dot-delimited alphanumerics and dashes\n                                  // (name)\n        '\\\\@' +                   // @\n        '([\\\\w-]+\\\\.)+' +         // Alphanumerics, dashes and dots (domain)\n        '(\\\\d+|\\\\w\\\\w+)$',  // Domain ends in at least one number or 2 letters\n    'i');\n\n\n/**\n * Returns true if str could be an email address, false otherwise\n *\n * Ex: goog.editor.Link.isLikelyEmailAddress_(\"some word\") == false\n *     goog.editor.Link.isLikelyEmailAddress_(\"foo@foo.com\") == true\n *\n * @param {string} str String to test for being email address.\n * @return {boolean} Whether \"str\" looks like an email address.\n */\ngoog.editor.Link.isLikelyEmailAddress = function(str) {\n  return goog.editor.Link.LIKELY_EMAIL_ADDRESS_.test(str);\n};\n\n\n/**\n * Determines whether or not a url is an email link.\n * @param {string} url A url.\n * @return {boolean} Whether the url is a mailto link.\n */\ngoog.editor.Link.isMailto = function(url) {\n  return !!url && goog.string.startsWith(url, 'mailto:');\n};\n","^J2",1579837703000,"^J3",["^J4",["^JN","^K6","^JZ","~$goog.editor.Command","^K7","~$goog.editor.range","~$goog.editor.BrowserFeature","^IT","~$goog.editor.Field","^K:","~$goog.editor.node","^M7","~$goog.dom.Range","^JJ","^JT"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/link.js"],"^JD",["^J4",["~$goog.editor.Link"]],"^IR",true,"^IS",["^IT","^JJ","^JN","^JZ","^OM","^JT","^OJ","^OH","^OK","^OL","^OI","^K7","^M7","^K6","^K:"]],["^ ","^IV",[1579837703000],"^IW","goog.i18n.datetimepatternsext.js","^IX",["^IY","goog/i18n/datetimepatternsext.js"],"^IZ","goog/i18n/datetimepatternsext.js","^I[","^J0","^J1","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Extended date/time patterns.\n *\n * File generated from CLDR ver. 35\n *\n * This file covers those locales that are not covered in\n * \"datetimepatterns.js\".\n *\n * @suppress {const,missingRequire} Suppress \"missing require\" warnings for\n *     names like goog.i18n.DateTimePatterns_af. They are included\n *     by requiring goog.i18n.DateTimePatterns.\n */\n\n// clang-format off\n\n/**\n * Only locales that can be enumerated in ICU are supported. For the rest\n * of the locales, it will fallback to 'en'.\n * The code is designed to work with Closure compiler using\n * ADVANCED_OPTIMIZATIONS. We will continue to add popular date/time\n * patterns over time. There is no intention to cover all possible\n * usages. If simple pattern works fine, it won't be covered here either.\n * For example, pattern 'MMM' will work well to get short month name for\n * almost all locales thus won't be included here.\n */\n\n\ngoog.provide('goog.i18n.DateTimePatternsExt');\ngoog.provide('goog.i18n.DateTimePatterns_af_NA');\ngoog.provide('goog.i18n.DateTimePatterns_af_ZA');\ngoog.provide('goog.i18n.DateTimePatterns_agq');\ngoog.provide('goog.i18n.DateTimePatterns_agq_CM');\ngoog.provide('goog.i18n.DateTimePatterns_ak');\ngoog.provide('goog.i18n.DateTimePatterns_ak_GH');\ngoog.provide('goog.i18n.DateTimePatterns_am_ET');\ngoog.provide('goog.i18n.DateTimePatterns_ar_001');\ngoog.provide('goog.i18n.DateTimePatterns_ar_AE');\ngoog.provide('goog.i18n.DateTimePatterns_ar_BH');\ngoog.provide('goog.i18n.DateTimePatterns_ar_DJ');\ngoog.provide('goog.i18n.DateTimePatterns_ar_EH');\ngoog.provide('goog.i18n.DateTimePatterns_ar_ER');\ngoog.provide('goog.i18n.DateTimePatterns_ar_IL');\ngoog.provide('goog.i18n.DateTimePatterns_ar_IQ');\ngoog.provide('goog.i18n.DateTimePatterns_ar_JO');\ngoog.provide('goog.i18n.DateTimePatterns_ar_KM');\ngoog.provide('goog.i18n.DateTimePatterns_ar_KW');\ngoog.provide('goog.i18n.DateTimePatterns_ar_LB');\ngoog.provide('goog.i18n.DateTimePatterns_ar_LY');\ngoog.provide('goog.i18n.DateTimePatterns_ar_MA');\ngoog.provide('goog.i18n.DateTimePatterns_ar_MR');\ngoog.provide('goog.i18n.DateTimePatterns_ar_OM');\ngoog.provide('goog.i18n.DateTimePatterns_ar_PS');\ngoog.provide('goog.i18n.DateTimePatterns_ar_QA');\ngoog.provide('goog.i18n.DateTimePatterns_ar_SA');\ngoog.provide('goog.i18n.DateTimePatterns_ar_SD');\ngoog.provide('goog.i18n.DateTimePatterns_ar_SO');\ngoog.provide('goog.i18n.DateTimePatterns_ar_SS');\ngoog.provide('goog.i18n.DateTimePatterns_ar_SY');\ngoog.provide('goog.i18n.DateTimePatterns_ar_TD');\ngoog.provide('goog.i18n.DateTimePatterns_ar_TN');\ngoog.provide('goog.i18n.DateTimePatterns_ar_XB');\ngoog.provide('goog.i18n.DateTimePatterns_ar_YE');\ngoog.provide('goog.i18n.DateTimePatterns_as');\ngoog.provide('goog.i18n.DateTimePatterns_as_IN');\ngoog.provide('goog.i18n.DateTimePatterns_asa');\ngoog.provide('goog.i18n.DateTimePatterns_asa_TZ');\ngoog.provide('goog.i18n.DateTimePatterns_ast');\ngoog.provide('goog.i18n.DateTimePatterns_ast_ES');\ngoog.provide('goog.i18n.DateTimePatterns_az_Cyrl');\ngoog.provide('goog.i18n.DateTimePatterns_az_Cyrl_AZ');\ngoog.provide('goog.i18n.DateTimePatterns_az_Latn');\ngoog.provide('goog.i18n.DateTimePatterns_az_Latn_AZ');\ngoog.provide('goog.i18n.DateTimePatterns_bas');\ngoog.provide('goog.i18n.DateTimePatterns_bas_CM');\ngoog.provide('goog.i18n.DateTimePatterns_be_BY');\ngoog.provide('goog.i18n.DateTimePatterns_bem');\ngoog.provide('goog.i18n.DateTimePatterns_bem_ZM');\ngoog.provide('goog.i18n.DateTimePatterns_bez');\ngoog.provide('goog.i18n.DateTimePatterns_bez_TZ');\ngoog.provide('goog.i18n.DateTimePatterns_bg_BG');\ngoog.provide('goog.i18n.DateTimePatterns_bm');\ngoog.provide('goog.i18n.DateTimePatterns_bm_ML');\ngoog.provide('goog.i18n.DateTimePatterns_bn_BD');\ngoog.provide('goog.i18n.DateTimePatterns_bn_IN');\ngoog.provide('goog.i18n.DateTimePatterns_bo');\ngoog.provide('goog.i18n.DateTimePatterns_bo_CN');\ngoog.provide('goog.i18n.DateTimePatterns_bo_IN');\ngoog.provide('goog.i18n.DateTimePatterns_br_FR');\ngoog.provide('goog.i18n.DateTimePatterns_brx');\ngoog.provide('goog.i18n.DateTimePatterns_brx_IN');\ngoog.provide('goog.i18n.DateTimePatterns_bs_Cyrl');\ngoog.provide('goog.i18n.DateTimePatterns_bs_Cyrl_BA');\ngoog.provide('goog.i18n.DateTimePatterns_bs_Latn');\ngoog.provide('goog.i18n.DateTimePatterns_bs_Latn_BA');\ngoog.provide('goog.i18n.DateTimePatterns_ca_AD');\ngoog.provide('goog.i18n.DateTimePatterns_ca_ES');\ngoog.provide('goog.i18n.DateTimePatterns_ca_FR');\ngoog.provide('goog.i18n.DateTimePatterns_ca_IT');\ngoog.provide('goog.i18n.DateTimePatterns_ccp');\ngoog.provide('goog.i18n.DateTimePatterns_ccp_BD');\ngoog.provide('goog.i18n.DateTimePatterns_ccp_IN');\ngoog.provide('goog.i18n.DateTimePatterns_ce');\ngoog.provide('goog.i18n.DateTimePatterns_ce_RU');\ngoog.provide('goog.i18n.DateTimePatterns_ceb');\ngoog.provide('goog.i18n.DateTimePatterns_ceb_PH');\ngoog.provide('goog.i18n.DateTimePatterns_cgg');\ngoog.provide('goog.i18n.DateTimePatterns_cgg_UG');\ngoog.provide('goog.i18n.DateTimePatterns_chr_US');\ngoog.provide('goog.i18n.DateTimePatterns_ckb');\ngoog.provide('goog.i18n.DateTimePatterns_ckb_IQ');\ngoog.provide('goog.i18n.DateTimePatterns_ckb_IR');\ngoog.provide('goog.i18n.DateTimePatterns_cs_CZ');\ngoog.provide('goog.i18n.DateTimePatterns_cy_GB');\ngoog.provide('goog.i18n.DateTimePatterns_da_DK');\ngoog.provide('goog.i18n.DateTimePatterns_da_GL');\ngoog.provide('goog.i18n.DateTimePatterns_dav');\ngoog.provide('goog.i18n.DateTimePatterns_dav_KE');\ngoog.provide('goog.i18n.DateTimePatterns_de_BE');\ngoog.provide('goog.i18n.DateTimePatterns_de_DE');\ngoog.provide('goog.i18n.DateTimePatterns_de_IT');\ngoog.provide('goog.i18n.DateTimePatterns_de_LI');\ngoog.provide('goog.i18n.DateTimePatterns_de_LU');\ngoog.provide('goog.i18n.DateTimePatterns_dje');\ngoog.provide('goog.i18n.DateTimePatterns_dje_NE');\ngoog.provide('goog.i18n.DateTimePatterns_dsb');\ngoog.provide('goog.i18n.DateTimePatterns_dsb_DE');\ngoog.provide('goog.i18n.DateTimePatterns_dua');\ngoog.provide('goog.i18n.DateTimePatterns_dua_CM');\ngoog.provide('goog.i18n.DateTimePatterns_dyo');\ngoog.provide('goog.i18n.DateTimePatterns_dyo_SN');\ngoog.provide('goog.i18n.DateTimePatterns_dz');\ngoog.provide('goog.i18n.DateTimePatterns_dz_BT');\ngoog.provide('goog.i18n.DateTimePatterns_ebu');\ngoog.provide('goog.i18n.DateTimePatterns_ebu_KE');\ngoog.provide('goog.i18n.DateTimePatterns_ee');\ngoog.provide('goog.i18n.DateTimePatterns_ee_GH');\ngoog.provide('goog.i18n.DateTimePatterns_ee_TG');\ngoog.provide('goog.i18n.DateTimePatterns_el_CY');\ngoog.provide('goog.i18n.DateTimePatterns_el_GR');\ngoog.provide('goog.i18n.DateTimePatterns_en_001');\ngoog.provide('goog.i18n.DateTimePatterns_en_150');\ngoog.provide('goog.i18n.DateTimePatterns_en_AE');\ngoog.provide('goog.i18n.DateTimePatterns_en_AG');\ngoog.provide('goog.i18n.DateTimePatterns_en_AI');\ngoog.provide('goog.i18n.DateTimePatterns_en_AS');\ngoog.provide('goog.i18n.DateTimePatterns_en_AT');\ngoog.provide('goog.i18n.DateTimePatterns_en_BB');\ngoog.provide('goog.i18n.DateTimePatterns_en_BE');\ngoog.provide('goog.i18n.DateTimePatterns_en_BI');\ngoog.provide('goog.i18n.DateTimePatterns_en_BM');\ngoog.provide('goog.i18n.DateTimePatterns_en_BS');\ngoog.provide('goog.i18n.DateTimePatterns_en_BW');\ngoog.provide('goog.i18n.DateTimePatterns_en_BZ');\ngoog.provide('goog.i18n.DateTimePatterns_en_CC');\ngoog.provide('goog.i18n.DateTimePatterns_en_CH');\ngoog.provide('goog.i18n.DateTimePatterns_en_CK');\ngoog.provide('goog.i18n.DateTimePatterns_en_CM');\ngoog.provide('goog.i18n.DateTimePatterns_en_CX');\ngoog.provide('goog.i18n.DateTimePatterns_en_CY');\ngoog.provide('goog.i18n.DateTimePatterns_en_DE');\ngoog.provide('goog.i18n.DateTimePatterns_en_DG');\ngoog.provide('goog.i18n.DateTimePatterns_en_DK');\ngoog.provide('goog.i18n.DateTimePatterns_en_DM');\ngoog.provide('goog.i18n.DateTimePatterns_en_ER');\ngoog.provide('goog.i18n.DateTimePatterns_en_FI');\ngoog.provide('goog.i18n.DateTimePatterns_en_FJ');\ngoog.provide('goog.i18n.DateTimePatterns_en_FK');\ngoog.provide('goog.i18n.DateTimePatterns_en_FM');\ngoog.provide('goog.i18n.DateTimePatterns_en_GD');\ngoog.provide('goog.i18n.DateTimePatterns_en_GG');\ngoog.provide('goog.i18n.DateTimePatterns_en_GH');\ngoog.provide('goog.i18n.DateTimePatterns_en_GI');\ngoog.provide('goog.i18n.DateTimePatterns_en_GM');\ngoog.provide('goog.i18n.DateTimePatterns_en_GU');\ngoog.provide('goog.i18n.DateTimePatterns_en_GY');\ngoog.provide('goog.i18n.DateTimePatterns_en_HK');\ngoog.provide('goog.i18n.DateTimePatterns_en_IL');\ngoog.provide('goog.i18n.DateTimePatterns_en_IM');\ngoog.provide('goog.i18n.DateTimePatterns_en_IO');\ngoog.provide('goog.i18n.DateTimePatterns_en_JE');\ngoog.provide('goog.i18n.DateTimePatterns_en_JM');\ngoog.provide('goog.i18n.DateTimePatterns_en_KE');\ngoog.provide('goog.i18n.DateTimePatterns_en_KI');\ngoog.provide('goog.i18n.DateTimePatterns_en_KN');\ngoog.provide('goog.i18n.DateTimePatterns_en_KY');\ngoog.provide('goog.i18n.DateTimePatterns_en_LC');\ngoog.provide('goog.i18n.DateTimePatterns_en_LR');\ngoog.provide('goog.i18n.DateTimePatterns_en_LS');\ngoog.provide('goog.i18n.DateTimePatterns_en_MG');\ngoog.provide('goog.i18n.DateTimePatterns_en_MH');\ngoog.provide('goog.i18n.DateTimePatterns_en_MO');\ngoog.provide('goog.i18n.DateTimePatterns_en_MP');\ngoog.provide('goog.i18n.DateTimePatterns_en_MS');\ngoog.provide('goog.i18n.DateTimePatterns_en_MT');\ngoog.provide('goog.i18n.DateTimePatterns_en_MU');\ngoog.provide('goog.i18n.DateTimePatterns_en_MW');\ngoog.provide('goog.i18n.DateTimePatterns_en_MY');\ngoog.provide('goog.i18n.DateTimePatterns_en_NA');\ngoog.provide('goog.i18n.DateTimePatterns_en_NF');\ngoog.provide('goog.i18n.DateTimePatterns_en_NG');\ngoog.provide('goog.i18n.DateTimePatterns_en_NL');\ngoog.provide('goog.i18n.DateTimePatterns_en_NR');\ngoog.provide('goog.i18n.DateTimePatterns_en_NU');\ngoog.provide('goog.i18n.DateTimePatterns_en_NZ');\ngoog.provide('goog.i18n.DateTimePatterns_en_PG');\ngoog.provide('goog.i18n.DateTimePatterns_en_PH');\ngoog.provide('goog.i18n.DateTimePatterns_en_PK');\ngoog.provide('goog.i18n.DateTimePatterns_en_PN');\ngoog.provide('goog.i18n.DateTimePatterns_en_PR');\ngoog.provide('goog.i18n.DateTimePatterns_en_PW');\ngoog.provide('goog.i18n.DateTimePatterns_en_RW');\ngoog.provide('goog.i18n.DateTimePatterns_en_SB');\ngoog.provide('goog.i18n.DateTimePatterns_en_SC');\ngoog.provide('goog.i18n.DateTimePatterns_en_SD');\ngoog.provide('goog.i18n.DateTimePatterns_en_SE');\ngoog.provide('goog.i18n.DateTimePatterns_en_SH');\ngoog.provide('goog.i18n.DateTimePatterns_en_SI');\ngoog.provide('goog.i18n.DateTimePatterns_en_SL');\ngoog.provide('goog.i18n.DateTimePatterns_en_SS');\ngoog.provide('goog.i18n.DateTimePatterns_en_SX');\ngoog.provide('goog.i18n.DateTimePatterns_en_SZ');\ngoog.provide('goog.i18n.DateTimePatterns_en_TC');\ngoog.provide('goog.i18n.DateTimePatterns_en_TK');\ngoog.provide('goog.i18n.DateTimePatterns_en_TO');\ngoog.provide('goog.i18n.DateTimePatterns_en_TT');\ngoog.provide('goog.i18n.DateTimePatterns_en_TV');\ngoog.provide('goog.i18n.DateTimePatterns_en_TZ');\ngoog.provide('goog.i18n.DateTimePatterns_en_UG');\ngoog.provide('goog.i18n.DateTimePatterns_en_UM');\ngoog.provide('goog.i18n.DateTimePatterns_en_US_POSIX');\ngoog.provide('goog.i18n.DateTimePatterns_en_VC');\ngoog.provide('goog.i18n.DateTimePatterns_en_VG');\ngoog.provide('goog.i18n.DateTimePatterns_en_VI');\ngoog.provide('goog.i18n.DateTimePatterns_en_VU');\ngoog.provide('goog.i18n.DateTimePatterns_en_WS');\ngoog.provide('goog.i18n.DateTimePatterns_en_XA');\ngoog.provide('goog.i18n.DateTimePatterns_en_ZM');\ngoog.provide('goog.i18n.DateTimePatterns_en_ZW');\ngoog.provide('goog.i18n.DateTimePatterns_eo');\ngoog.provide('goog.i18n.DateTimePatterns_eo_001');\ngoog.provide('goog.i18n.DateTimePatterns_es_AR');\ngoog.provide('goog.i18n.DateTimePatterns_es_BO');\ngoog.provide('goog.i18n.DateTimePatterns_es_BR');\ngoog.provide('goog.i18n.DateTimePatterns_es_BZ');\ngoog.provide('goog.i18n.DateTimePatterns_es_CL');\ngoog.provide('goog.i18n.DateTimePatterns_es_CO');\ngoog.provide('goog.i18n.DateTimePatterns_es_CR');\ngoog.provide('goog.i18n.DateTimePatterns_es_CU');\ngoog.provide('goog.i18n.DateTimePatterns_es_DO');\ngoog.provide('goog.i18n.DateTimePatterns_es_EA');\ngoog.provide('goog.i18n.DateTimePatterns_es_EC');\ngoog.provide('goog.i18n.DateTimePatterns_es_GQ');\ngoog.provide('goog.i18n.DateTimePatterns_es_GT');\ngoog.provide('goog.i18n.DateTimePatterns_es_HN');\ngoog.provide('goog.i18n.DateTimePatterns_es_IC');\ngoog.provide('goog.i18n.DateTimePatterns_es_NI');\ngoog.provide('goog.i18n.DateTimePatterns_es_PA');\ngoog.provide('goog.i18n.DateTimePatterns_es_PE');\ngoog.provide('goog.i18n.DateTimePatterns_es_PH');\ngoog.provide('goog.i18n.DateTimePatterns_es_PR');\ngoog.provide('goog.i18n.DateTimePatterns_es_PY');\ngoog.provide('goog.i18n.DateTimePatterns_es_SV');\ngoog.provide('goog.i18n.DateTimePatterns_es_UY');\ngoog.provide('goog.i18n.DateTimePatterns_es_VE');\ngoog.provide('goog.i18n.DateTimePatterns_et_EE');\ngoog.provide('goog.i18n.DateTimePatterns_eu_ES');\ngoog.provide('goog.i18n.DateTimePatterns_ewo');\ngoog.provide('goog.i18n.DateTimePatterns_ewo_CM');\ngoog.provide('goog.i18n.DateTimePatterns_fa_AF');\ngoog.provide('goog.i18n.DateTimePatterns_fa_IR');\ngoog.provide('goog.i18n.DateTimePatterns_ff');\ngoog.provide('goog.i18n.DateTimePatterns_ff_Latn');\ngoog.provide('goog.i18n.DateTimePatterns_ff_Latn_BF');\ngoog.provide('goog.i18n.DateTimePatterns_ff_Latn_CM');\ngoog.provide('goog.i18n.DateTimePatterns_ff_Latn_GH');\ngoog.provide('goog.i18n.DateTimePatterns_ff_Latn_GM');\ngoog.provide('goog.i18n.DateTimePatterns_ff_Latn_GN');\ngoog.provide('goog.i18n.DateTimePatterns_ff_Latn_GW');\ngoog.provide('goog.i18n.DateTimePatterns_ff_Latn_LR');\ngoog.provide('goog.i18n.DateTimePatterns_ff_Latn_MR');\ngoog.provide('goog.i18n.DateTimePatterns_ff_Latn_NE');\ngoog.provide('goog.i18n.DateTimePatterns_ff_Latn_NG');\ngoog.provide('goog.i18n.DateTimePatterns_ff_Latn_SL');\ngoog.provide('goog.i18n.DateTimePatterns_ff_Latn_SN');\ngoog.provide('goog.i18n.DateTimePatterns_fi_FI');\ngoog.provide('goog.i18n.DateTimePatterns_fil_PH');\ngoog.provide('goog.i18n.DateTimePatterns_fo');\ngoog.provide('goog.i18n.DateTimePatterns_fo_DK');\ngoog.provide('goog.i18n.DateTimePatterns_fo_FO');\ngoog.provide('goog.i18n.DateTimePatterns_fr_BE');\ngoog.provide('goog.i18n.DateTimePatterns_fr_BF');\ngoog.provide('goog.i18n.DateTimePatterns_fr_BI');\ngoog.provide('goog.i18n.DateTimePatterns_fr_BJ');\ngoog.provide('goog.i18n.DateTimePatterns_fr_BL');\ngoog.provide('goog.i18n.DateTimePatterns_fr_CD');\ngoog.provide('goog.i18n.DateTimePatterns_fr_CF');\ngoog.provide('goog.i18n.DateTimePatterns_fr_CG');\ngoog.provide('goog.i18n.DateTimePatterns_fr_CH');\ngoog.provide('goog.i18n.DateTimePatterns_fr_CI');\ngoog.provide('goog.i18n.DateTimePatterns_fr_CM');\ngoog.provide('goog.i18n.DateTimePatterns_fr_DJ');\ngoog.provide('goog.i18n.DateTimePatterns_fr_DZ');\ngoog.provide('goog.i18n.DateTimePatterns_fr_FR');\ngoog.provide('goog.i18n.DateTimePatterns_fr_GA');\ngoog.provide('goog.i18n.DateTimePatterns_fr_GF');\ngoog.provide('goog.i18n.DateTimePatterns_fr_GN');\ngoog.provide('goog.i18n.DateTimePatterns_fr_GP');\ngoog.provide('goog.i18n.DateTimePatterns_fr_GQ');\ngoog.provide('goog.i18n.DateTimePatterns_fr_HT');\ngoog.provide('goog.i18n.DateTimePatterns_fr_KM');\ngoog.provide('goog.i18n.DateTimePatterns_fr_LU');\ngoog.provide('goog.i18n.DateTimePatterns_fr_MA');\ngoog.provide('goog.i18n.DateTimePatterns_fr_MC');\ngoog.provide('goog.i18n.DateTimePatterns_fr_MF');\ngoog.provide('goog.i18n.DateTimePatterns_fr_MG');\ngoog.provide('goog.i18n.DateTimePatterns_fr_ML');\ngoog.provide('goog.i18n.DateTimePatterns_fr_MQ');\ngoog.provide('goog.i18n.DateTimePatterns_fr_MR');\ngoog.provide('goog.i18n.DateTimePatterns_fr_MU');\ngoog.provide('goog.i18n.DateTimePatterns_fr_NC');\ngoog.provide('goog.i18n.DateTimePatterns_fr_NE');\ngoog.provide('goog.i18n.DateTimePatterns_fr_PF');\ngoog.provide('goog.i18n.DateTimePatterns_fr_PM');\ngoog.provide('goog.i18n.DateTimePatterns_fr_RE');\ngoog.provide('goog.i18n.DateTimePatterns_fr_RW');\ngoog.provide('goog.i18n.DateTimePatterns_fr_SC');\ngoog.provide('goog.i18n.DateTimePatterns_fr_SN');\ngoog.provide('goog.i18n.DateTimePatterns_fr_SY');\ngoog.provide('goog.i18n.DateTimePatterns_fr_TD');\ngoog.provide('goog.i18n.DateTimePatterns_fr_TG');\ngoog.provide('goog.i18n.DateTimePatterns_fr_TN');\ngoog.provide('goog.i18n.DateTimePatterns_fr_VU');\ngoog.provide('goog.i18n.DateTimePatterns_fr_WF');\ngoog.provide('goog.i18n.DateTimePatterns_fr_YT');\ngoog.provide('goog.i18n.DateTimePatterns_fur');\ngoog.provide('goog.i18n.DateTimePatterns_fur_IT');\ngoog.provide('goog.i18n.DateTimePatterns_fy');\ngoog.provide('goog.i18n.DateTimePatterns_fy_NL');\ngoog.provide('goog.i18n.DateTimePatterns_ga_IE');\ngoog.provide('goog.i18n.DateTimePatterns_gd');\ngoog.provide('goog.i18n.DateTimePatterns_gd_GB');\ngoog.provide('goog.i18n.DateTimePatterns_gl_ES');\ngoog.provide('goog.i18n.DateTimePatterns_gsw_CH');\ngoog.provide('goog.i18n.DateTimePatterns_gsw_FR');\ngoog.provide('goog.i18n.DateTimePatterns_gsw_LI');\ngoog.provide('goog.i18n.DateTimePatterns_gu_IN');\ngoog.provide('goog.i18n.DateTimePatterns_guz');\ngoog.provide('goog.i18n.DateTimePatterns_guz_KE');\ngoog.provide('goog.i18n.DateTimePatterns_gv');\ngoog.provide('goog.i18n.DateTimePatterns_gv_IM');\ngoog.provide('goog.i18n.DateTimePatterns_ha');\ngoog.provide('goog.i18n.DateTimePatterns_ha_GH');\ngoog.provide('goog.i18n.DateTimePatterns_ha_NE');\ngoog.provide('goog.i18n.DateTimePatterns_ha_NG');\ngoog.provide('goog.i18n.DateTimePatterns_haw_US');\ngoog.provide('goog.i18n.DateTimePatterns_he_IL');\ngoog.provide('goog.i18n.DateTimePatterns_hi_IN');\ngoog.provide('goog.i18n.DateTimePatterns_hr_BA');\ngoog.provide('goog.i18n.DateTimePatterns_hr_HR');\ngoog.provide('goog.i18n.DateTimePatterns_hsb');\ngoog.provide('goog.i18n.DateTimePatterns_hsb_DE');\ngoog.provide('goog.i18n.DateTimePatterns_hu_HU');\ngoog.provide('goog.i18n.DateTimePatterns_hy_AM');\ngoog.provide('goog.i18n.DateTimePatterns_ia');\ngoog.provide('goog.i18n.DateTimePatterns_ia_001');\ngoog.provide('goog.i18n.DateTimePatterns_id_ID');\ngoog.provide('goog.i18n.DateTimePatterns_ig');\ngoog.provide('goog.i18n.DateTimePatterns_ig_NG');\ngoog.provide('goog.i18n.DateTimePatterns_ii');\ngoog.provide('goog.i18n.DateTimePatterns_ii_CN');\ngoog.provide('goog.i18n.DateTimePatterns_is_IS');\ngoog.provide('goog.i18n.DateTimePatterns_it_CH');\ngoog.provide('goog.i18n.DateTimePatterns_it_IT');\ngoog.provide('goog.i18n.DateTimePatterns_it_SM');\ngoog.provide('goog.i18n.DateTimePatterns_it_VA');\ngoog.provide('goog.i18n.DateTimePatterns_ja_JP');\ngoog.provide('goog.i18n.DateTimePatterns_jgo');\ngoog.provide('goog.i18n.DateTimePatterns_jgo_CM');\ngoog.provide('goog.i18n.DateTimePatterns_jmc');\ngoog.provide('goog.i18n.DateTimePatterns_jmc_TZ');\ngoog.provide('goog.i18n.DateTimePatterns_jv');\ngoog.provide('goog.i18n.DateTimePatterns_jv_ID');\ngoog.provide('goog.i18n.DateTimePatterns_ka_GE');\ngoog.provide('goog.i18n.DateTimePatterns_kab');\ngoog.provide('goog.i18n.DateTimePatterns_kab_DZ');\ngoog.provide('goog.i18n.DateTimePatterns_kam');\ngoog.provide('goog.i18n.DateTimePatterns_kam_KE');\ngoog.provide('goog.i18n.DateTimePatterns_kde');\ngoog.provide('goog.i18n.DateTimePatterns_kde_TZ');\ngoog.provide('goog.i18n.DateTimePatterns_kea');\ngoog.provide('goog.i18n.DateTimePatterns_kea_CV');\ngoog.provide('goog.i18n.DateTimePatterns_khq');\ngoog.provide('goog.i18n.DateTimePatterns_khq_ML');\ngoog.provide('goog.i18n.DateTimePatterns_ki');\ngoog.provide('goog.i18n.DateTimePatterns_ki_KE');\ngoog.provide('goog.i18n.DateTimePatterns_kk_KZ');\ngoog.provide('goog.i18n.DateTimePatterns_kkj');\ngoog.provide('goog.i18n.DateTimePatterns_kkj_CM');\ngoog.provide('goog.i18n.DateTimePatterns_kl');\ngoog.provide('goog.i18n.DateTimePatterns_kl_GL');\ngoog.provide('goog.i18n.DateTimePatterns_kln');\ngoog.provide('goog.i18n.DateTimePatterns_kln_KE');\ngoog.provide('goog.i18n.DateTimePatterns_km_KH');\ngoog.provide('goog.i18n.DateTimePatterns_kn_IN');\ngoog.provide('goog.i18n.DateTimePatterns_ko_KP');\ngoog.provide('goog.i18n.DateTimePatterns_ko_KR');\ngoog.provide('goog.i18n.DateTimePatterns_kok');\ngoog.provide('goog.i18n.DateTimePatterns_kok_IN');\ngoog.provide('goog.i18n.DateTimePatterns_ks');\ngoog.provide('goog.i18n.DateTimePatterns_ks_IN');\ngoog.provide('goog.i18n.DateTimePatterns_ksb');\ngoog.provide('goog.i18n.DateTimePatterns_ksb_TZ');\ngoog.provide('goog.i18n.DateTimePatterns_ksf');\ngoog.provide('goog.i18n.DateTimePatterns_ksf_CM');\ngoog.provide('goog.i18n.DateTimePatterns_ksh');\ngoog.provide('goog.i18n.DateTimePatterns_ksh_DE');\ngoog.provide('goog.i18n.DateTimePatterns_ku');\ngoog.provide('goog.i18n.DateTimePatterns_ku_TR');\ngoog.provide('goog.i18n.DateTimePatterns_kw');\ngoog.provide('goog.i18n.DateTimePatterns_kw_GB');\ngoog.provide('goog.i18n.DateTimePatterns_ky_KG');\ngoog.provide('goog.i18n.DateTimePatterns_lag');\ngoog.provide('goog.i18n.DateTimePatterns_lag_TZ');\ngoog.provide('goog.i18n.DateTimePatterns_lb');\ngoog.provide('goog.i18n.DateTimePatterns_lb_LU');\ngoog.provide('goog.i18n.DateTimePatterns_lg');\ngoog.provide('goog.i18n.DateTimePatterns_lg_UG');\ngoog.provide('goog.i18n.DateTimePatterns_lkt');\ngoog.provide('goog.i18n.DateTimePatterns_lkt_US');\ngoog.provide('goog.i18n.DateTimePatterns_ln_AO');\ngoog.provide('goog.i18n.DateTimePatterns_ln_CD');\ngoog.provide('goog.i18n.DateTimePatterns_ln_CF');\ngoog.provide('goog.i18n.DateTimePatterns_ln_CG');\ngoog.provide('goog.i18n.DateTimePatterns_lo_LA');\ngoog.provide('goog.i18n.DateTimePatterns_lrc');\ngoog.provide('goog.i18n.DateTimePatterns_lrc_IQ');\ngoog.provide('goog.i18n.DateTimePatterns_lrc_IR');\ngoog.provide('goog.i18n.DateTimePatterns_lt_LT');\ngoog.provide('goog.i18n.DateTimePatterns_lu');\ngoog.provide('goog.i18n.DateTimePatterns_lu_CD');\ngoog.provide('goog.i18n.DateTimePatterns_luo');\ngoog.provide('goog.i18n.DateTimePatterns_luo_KE');\ngoog.provide('goog.i18n.DateTimePatterns_luy');\ngoog.provide('goog.i18n.DateTimePatterns_luy_KE');\ngoog.provide('goog.i18n.DateTimePatterns_lv_LV');\ngoog.provide('goog.i18n.DateTimePatterns_mas');\ngoog.provide('goog.i18n.DateTimePatterns_mas_KE');\ngoog.provide('goog.i18n.DateTimePatterns_mas_TZ');\ngoog.provide('goog.i18n.DateTimePatterns_mer');\ngoog.provide('goog.i18n.DateTimePatterns_mer_KE');\ngoog.provide('goog.i18n.DateTimePatterns_mfe');\ngoog.provide('goog.i18n.DateTimePatterns_mfe_MU');\ngoog.provide('goog.i18n.DateTimePatterns_mg');\ngoog.provide('goog.i18n.DateTimePatterns_mg_MG');\ngoog.provide('goog.i18n.DateTimePatterns_mgh');\ngoog.provide('goog.i18n.DateTimePatterns_mgh_MZ');\ngoog.provide('goog.i18n.DateTimePatterns_mgo');\ngoog.provide('goog.i18n.DateTimePatterns_mgo_CM');\ngoog.provide('goog.i18n.DateTimePatterns_mi');\ngoog.provide('goog.i18n.DateTimePatterns_mi_NZ');\ngoog.provide('goog.i18n.DateTimePatterns_mk_MK');\ngoog.provide('goog.i18n.DateTimePatterns_ml_IN');\ngoog.provide('goog.i18n.DateTimePatterns_mn_MN');\ngoog.provide('goog.i18n.DateTimePatterns_mr_IN');\ngoog.provide('goog.i18n.DateTimePatterns_ms_BN');\ngoog.provide('goog.i18n.DateTimePatterns_ms_MY');\ngoog.provide('goog.i18n.DateTimePatterns_ms_SG');\ngoog.provide('goog.i18n.DateTimePatterns_mt_MT');\ngoog.provide('goog.i18n.DateTimePatterns_mua');\ngoog.provide('goog.i18n.DateTimePatterns_mua_CM');\ngoog.provide('goog.i18n.DateTimePatterns_my_MM');\ngoog.provide('goog.i18n.DateTimePatterns_mzn');\ngoog.provide('goog.i18n.DateTimePatterns_mzn_IR');\ngoog.provide('goog.i18n.DateTimePatterns_naq');\ngoog.provide('goog.i18n.DateTimePatterns_naq_NA');\ngoog.provide('goog.i18n.DateTimePatterns_nb_NO');\ngoog.provide('goog.i18n.DateTimePatterns_nb_SJ');\ngoog.provide('goog.i18n.DateTimePatterns_nd');\ngoog.provide('goog.i18n.DateTimePatterns_nd_ZW');\ngoog.provide('goog.i18n.DateTimePatterns_nds');\ngoog.provide('goog.i18n.DateTimePatterns_nds_DE');\ngoog.provide('goog.i18n.DateTimePatterns_nds_NL');\ngoog.provide('goog.i18n.DateTimePatterns_ne_IN');\ngoog.provide('goog.i18n.DateTimePatterns_ne_NP');\ngoog.provide('goog.i18n.DateTimePatterns_nl_AW');\ngoog.provide('goog.i18n.DateTimePatterns_nl_BE');\ngoog.provide('goog.i18n.DateTimePatterns_nl_BQ');\ngoog.provide('goog.i18n.DateTimePatterns_nl_CW');\ngoog.provide('goog.i18n.DateTimePatterns_nl_NL');\ngoog.provide('goog.i18n.DateTimePatterns_nl_SR');\ngoog.provide('goog.i18n.DateTimePatterns_nl_SX');\ngoog.provide('goog.i18n.DateTimePatterns_nmg');\ngoog.provide('goog.i18n.DateTimePatterns_nmg_CM');\ngoog.provide('goog.i18n.DateTimePatterns_nn');\ngoog.provide('goog.i18n.DateTimePatterns_nn_NO');\ngoog.provide('goog.i18n.DateTimePatterns_nnh');\ngoog.provide('goog.i18n.DateTimePatterns_nnh_CM');\ngoog.provide('goog.i18n.DateTimePatterns_nus');\ngoog.provide('goog.i18n.DateTimePatterns_nus_SS');\ngoog.provide('goog.i18n.DateTimePatterns_nyn');\ngoog.provide('goog.i18n.DateTimePatterns_nyn_UG');\ngoog.provide('goog.i18n.DateTimePatterns_om');\ngoog.provide('goog.i18n.DateTimePatterns_om_ET');\ngoog.provide('goog.i18n.DateTimePatterns_om_KE');\ngoog.provide('goog.i18n.DateTimePatterns_or_IN');\ngoog.provide('goog.i18n.DateTimePatterns_os');\ngoog.provide('goog.i18n.DateTimePatterns_os_GE');\ngoog.provide('goog.i18n.DateTimePatterns_os_RU');\ngoog.provide('goog.i18n.DateTimePatterns_pa_Arab');\ngoog.provide('goog.i18n.DateTimePatterns_pa_Arab_PK');\ngoog.provide('goog.i18n.DateTimePatterns_pa_Guru');\ngoog.provide('goog.i18n.DateTimePatterns_pa_Guru_IN');\ngoog.provide('goog.i18n.DateTimePatterns_pl_PL');\ngoog.provide('goog.i18n.DateTimePatterns_ps');\ngoog.provide('goog.i18n.DateTimePatterns_ps_AF');\ngoog.provide('goog.i18n.DateTimePatterns_ps_PK');\ngoog.provide('goog.i18n.DateTimePatterns_pt_AO');\ngoog.provide('goog.i18n.DateTimePatterns_pt_CH');\ngoog.provide('goog.i18n.DateTimePatterns_pt_CV');\ngoog.provide('goog.i18n.DateTimePatterns_pt_GQ');\ngoog.provide('goog.i18n.DateTimePatterns_pt_GW');\ngoog.provide('goog.i18n.DateTimePatterns_pt_LU');\ngoog.provide('goog.i18n.DateTimePatterns_pt_MO');\ngoog.provide('goog.i18n.DateTimePatterns_pt_MZ');\ngoog.provide('goog.i18n.DateTimePatterns_pt_ST');\ngoog.provide('goog.i18n.DateTimePatterns_pt_TL');\ngoog.provide('goog.i18n.DateTimePatterns_qu');\ngoog.provide('goog.i18n.DateTimePatterns_qu_BO');\ngoog.provide('goog.i18n.DateTimePatterns_qu_EC');\ngoog.provide('goog.i18n.DateTimePatterns_qu_PE');\ngoog.provide('goog.i18n.DateTimePatterns_rm');\ngoog.provide('goog.i18n.DateTimePatterns_rm_CH');\ngoog.provide('goog.i18n.DateTimePatterns_rn');\ngoog.provide('goog.i18n.DateTimePatterns_rn_BI');\ngoog.provide('goog.i18n.DateTimePatterns_ro_MD');\ngoog.provide('goog.i18n.DateTimePatterns_ro_RO');\ngoog.provide('goog.i18n.DateTimePatterns_rof');\ngoog.provide('goog.i18n.DateTimePatterns_rof_TZ');\ngoog.provide('goog.i18n.DateTimePatterns_ru_BY');\ngoog.provide('goog.i18n.DateTimePatterns_ru_KG');\ngoog.provide('goog.i18n.DateTimePatterns_ru_KZ');\ngoog.provide('goog.i18n.DateTimePatterns_ru_MD');\ngoog.provide('goog.i18n.DateTimePatterns_ru_RU');\ngoog.provide('goog.i18n.DateTimePatterns_ru_UA');\ngoog.provide('goog.i18n.DateTimePatterns_rw');\ngoog.provide('goog.i18n.DateTimePatterns_rw_RW');\ngoog.provide('goog.i18n.DateTimePatterns_rwk');\ngoog.provide('goog.i18n.DateTimePatterns_rwk_TZ');\ngoog.provide('goog.i18n.DateTimePatterns_sah');\ngoog.provide('goog.i18n.DateTimePatterns_sah_RU');\ngoog.provide('goog.i18n.DateTimePatterns_saq');\ngoog.provide('goog.i18n.DateTimePatterns_saq_KE');\ngoog.provide('goog.i18n.DateTimePatterns_sbp');\ngoog.provide('goog.i18n.DateTimePatterns_sbp_TZ');\ngoog.provide('goog.i18n.DateTimePatterns_sd');\ngoog.provide('goog.i18n.DateTimePatterns_sd_PK');\ngoog.provide('goog.i18n.DateTimePatterns_se');\ngoog.provide('goog.i18n.DateTimePatterns_se_FI');\ngoog.provide('goog.i18n.DateTimePatterns_se_NO');\ngoog.provide('goog.i18n.DateTimePatterns_se_SE');\ngoog.provide('goog.i18n.DateTimePatterns_seh');\ngoog.provide('goog.i18n.DateTimePatterns_seh_MZ');\ngoog.provide('goog.i18n.DateTimePatterns_ses');\ngoog.provide('goog.i18n.DateTimePatterns_ses_ML');\ngoog.provide('goog.i18n.DateTimePatterns_sg');\ngoog.provide('goog.i18n.DateTimePatterns_sg_CF');\ngoog.provide('goog.i18n.DateTimePatterns_shi');\ngoog.provide('goog.i18n.DateTimePatterns_shi_Latn');\ngoog.provide('goog.i18n.DateTimePatterns_shi_Latn_MA');\ngoog.provide('goog.i18n.DateTimePatterns_shi_Tfng');\ngoog.provide('goog.i18n.DateTimePatterns_shi_Tfng_MA');\ngoog.provide('goog.i18n.DateTimePatterns_si_LK');\ngoog.provide('goog.i18n.DateTimePatterns_sk_SK');\ngoog.provide('goog.i18n.DateTimePatterns_sl_SI');\ngoog.provide('goog.i18n.DateTimePatterns_smn');\ngoog.provide('goog.i18n.DateTimePatterns_smn_FI');\ngoog.provide('goog.i18n.DateTimePatterns_sn');\ngoog.provide('goog.i18n.DateTimePatterns_sn_ZW');\ngoog.provide('goog.i18n.DateTimePatterns_so');\ngoog.provide('goog.i18n.DateTimePatterns_so_DJ');\ngoog.provide('goog.i18n.DateTimePatterns_so_ET');\ngoog.provide('goog.i18n.DateTimePatterns_so_KE');\ngoog.provide('goog.i18n.DateTimePatterns_so_SO');\ngoog.provide('goog.i18n.DateTimePatterns_sq_AL');\ngoog.provide('goog.i18n.DateTimePatterns_sq_MK');\ngoog.provide('goog.i18n.DateTimePatterns_sq_XK');\ngoog.provide('goog.i18n.DateTimePatterns_sr_Cyrl');\ngoog.provide('goog.i18n.DateTimePatterns_sr_Cyrl_BA');\ngoog.provide('goog.i18n.DateTimePatterns_sr_Cyrl_ME');\ngoog.provide('goog.i18n.DateTimePatterns_sr_Cyrl_RS');\ngoog.provide('goog.i18n.DateTimePatterns_sr_Cyrl_XK');\ngoog.provide('goog.i18n.DateTimePatterns_sr_Latn_BA');\ngoog.provide('goog.i18n.DateTimePatterns_sr_Latn_ME');\ngoog.provide('goog.i18n.DateTimePatterns_sr_Latn_RS');\ngoog.provide('goog.i18n.DateTimePatterns_sr_Latn_XK');\ngoog.provide('goog.i18n.DateTimePatterns_sv_AX');\ngoog.provide('goog.i18n.DateTimePatterns_sv_FI');\ngoog.provide('goog.i18n.DateTimePatterns_sv_SE');\ngoog.provide('goog.i18n.DateTimePatterns_sw_CD');\ngoog.provide('goog.i18n.DateTimePatterns_sw_KE');\ngoog.provide('goog.i18n.DateTimePatterns_sw_TZ');\ngoog.provide('goog.i18n.DateTimePatterns_sw_UG');\ngoog.provide('goog.i18n.DateTimePatterns_ta_IN');\ngoog.provide('goog.i18n.DateTimePatterns_ta_LK');\ngoog.provide('goog.i18n.DateTimePatterns_ta_MY');\ngoog.provide('goog.i18n.DateTimePatterns_ta_SG');\ngoog.provide('goog.i18n.DateTimePatterns_te_IN');\ngoog.provide('goog.i18n.DateTimePatterns_teo');\ngoog.provide('goog.i18n.DateTimePatterns_teo_KE');\ngoog.provide('goog.i18n.DateTimePatterns_teo_UG');\ngoog.provide('goog.i18n.DateTimePatterns_tg');\ngoog.provide('goog.i18n.DateTimePatterns_tg_TJ');\ngoog.provide('goog.i18n.DateTimePatterns_th_TH');\ngoog.provide('goog.i18n.DateTimePatterns_ti');\ngoog.provide('goog.i18n.DateTimePatterns_ti_ER');\ngoog.provide('goog.i18n.DateTimePatterns_ti_ET');\ngoog.provide('goog.i18n.DateTimePatterns_tk');\ngoog.provide('goog.i18n.DateTimePatterns_tk_TM');\ngoog.provide('goog.i18n.DateTimePatterns_to');\ngoog.provide('goog.i18n.DateTimePatterns_to_TO');\ngoog.provide('goog.i18n.DateTimePatterns_tr_CY');\ngoog.provide('goog.i18n.DateTimePatterns_tr_TR');\ngoog.provide('goog.i18n.DateTimePatterns_tt');\ngoog.provide('goog.i18n.DateTimePatterns_tt_RU');\ngoog.provide('goog.i18n.DateTimePatterns_twq');\ngoog.provide('goog.i18n.DateTimePatterns_twq_NE');\ngoog.provide('goog.i18n.DateTimePatterns_tzm');\ngoog.provide('goog.i18n.DateTimePatterns_tzm_MA');\ngoog.provide('goog.i18n.DateTimePatterns_ug');\ngoog.provide('goog.i18n.DateTimePatterns_ug_CN');\ngoog.provide('goog.i18n.DateTimePatterns_uk_UA');\ngoog.provide('goog.i18n.DateTimePatterns_ur_IN');\ngoog.provide('goog.i18n.DateTimePatterns_ur_PK');\ngoog.provide('goog.i18n.DateTimePatterns_uz_Arab');\ngoog.provide('goog.i18n.DateTimePatterns_uz_Arab_AF');\ngoog.provide('goog.i18n.DateTimePatterns_uz_Cyrl');\ngoog.provide('goog.i18n.DateTimePatterns_uz_Cyrl_UZ');\ngoog.provide('goog.i18n.DateTimePatterns_uz_Latn');\ngoog.provide('goog.i18n.DateTimePatterns_uz_Latn_UZ');\ngoog.provide('goog.i18n.DateTimePatterns_vai');\ngoog.provide('goog.i18n.DateTimePatterns_vai_Latn');\ngoog.provide('goog.i18n.DateTimePatterns_vai_Latn_LR');\ngoog.provide('goog.i18n.DateTimePatterns_vai_Vaii');\ngoog.provide('goog.i18n.DateTimePatterns_vai_Vaii_LR');\ngoog.provide('goog.i18n.DateTimePatterns_vi_VN');\ngoog.provide('goog.i18n.DateTimePatterns_vun');\ngoog.provide('goog.i18n.DateTimePatterns_vun_TZ');\ngoog.provide('goog.i18n.DateTimePatterns_wae');\ngoog.provide('goog.i18n.DateTimePatterns_wae_CH');\ngoog.provide('goog.i18n.DateTimePatterns_wo');\ngoog.provide('goog.i18n.DateTimePatterns_wo_SN');\ngoog.provide('goog.i18n.DateTimePatterns_xh');\ngoog.provide('goog.i18n.DateTimePatterns_xh_ZA');\ngoog.provide('goog.i18n.DateTimePatterns_xog');\ngoog.provide('goog.i18n.DateTimePatterns_xog_UG');\ngoog.provide('goog.i18n.DateTimePatterns_yav');\ngoog.provide('goog.i18n.DateTimePatterns_yav_CM');\ngoog.provide('goog.i18n.DateTimePatterns_yi');\ngoog.provide('goog.i18n.DateTimePatterns_yi_001');\ngoog.provide('goog.i18n.DateTimePatterns_yo');\ngoog.provide('goog.i18n.DateTimePatterns_yo_BJ');\ngoog.provide('goog.i18n.DateTimePatterns_yo_NG');\ngoog.provide('goog.i18n.DateTimePatterns_yue');\ngoog.provide('goog.i18n.DateTimePatterns_yue_Hans');\ngoog.provide('goog.i18n.DateTimePatterns_yue_Hans_CN');\ngoog.provide('goog.i18n.DateTimePatterns_yue_Hant');\ngoog.provide('goog.i18n.DateTimePatterns_yue_Hant_HK');\ngoog.provide('goog.i18n.DateTimePatterns_zgh');\ngoog.provide('goog.i18n.DateTimePatterns_zgh_MA');\ngoog.provide('goog.i18n.DateTimePatterns_zh_Hans');\ngoog.provide('goog.i18n.DateTimePatterns_zh_Hans_CN');\ngoog.provide('goog.i18n.DateTimePatterns_zh_Hans_HK');\ngoog.provide('goog.i18n.DateTimePatterns_zh_Hans_MO');\ngoog.provide('goog.i18n.DateTimePatterns_zh_Hans_SG');\ngoog.provide('goog.i18n.DateTimePatterns_zh_Hant');\ngoog.provide('goog.i18n.DateTimePatterns_zh_Hant_HK');\ngoog.provide('goog.i18n.DateTimePatterns_zh_Hant_MO');\ngoog.provide('goog.i18n.DateTimePatterns_zh_Hant_TW');\ngoog.provide('goog.i18n.DateTimePatterns_zu_ZA');\ngoog.require('goog.i18n.DateTimePatterns');\n\n\n/**\n * Extended set of localized date/time patterns for locale af_NA.\n */\ngoog.i18n.DateTimePatterns_af_NA = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd-MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale af_ZA.\n */\ngoog.i18n.DateTimePatterns_af_ZA = goog.i18n.DateTimePatterns_af;\n\n\n/**\n * Extended set of localized date/time patterns for locale agq.\n */\ngoog.i18n.DateTimePatterns_agq = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale agq_CM.\n */\ngoog.i18n.DateTimePatterns_agq_CM = goog.i18n.DateTimePatterns_agq;\n\n\n/**\n * Extended set of localized date/time patterns for locale ak.\n */\ngoog.i18n.DateTimePatterns_ak = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ak_GH.\n */\ngoog.i18n.DateTimePatterns_ak_GH = goog.i18n.DateTimePatterns_ak;\n\n\n/**\n * Extended set of localized date/time patterns for locale am_ET.\n */\ngoog.i18n.DateTimePatterns_am_ET = goog.i18n.DateTimePatterns_am;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_001.\n */\ngoog.i18n.DateTimePatterns_ar_001 = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_AE.\n */\ngoog.i18n.DateTimePatterns_ar_AE = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_BH.\n */\ngoog.i18n.DateTimePatterns_ar_BH = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_DJ.\n */\ngoog.i18n.DateTimePatterns_ar_DJ = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_EH.\n */\ngoog.i18n.DateTimePatterns_ar_EH = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_ER.\n */\ngoog.i18n.DateTimePatterns_ar_ER = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_IL.\n */\ngoog.i18n.DateTimePatterns_ar_IL = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM‏/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/‏M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE، d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE، d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_IQ.\n */\ngoog.i18n.DateTimePatterns_ar_IQ = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_JO.\n */\ngoog.i18n.DateTimePatterns_ar_JO = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_KM.\n */\ngoog.i18n.DateTimePatterns_ar_KM = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM‏/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/‏M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE، d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE، d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_KW.\n */\ngoog.i18n.DateTimePatterns_ar_KW = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_LB.\n */\ngoog.i18n.DateTimePatterns_ar_LB = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_LY.\n */\ngoog.i18n.DateTimePatterns_ar_LY = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_MA.\n */\ngoog.i18n.DateTimePatterns_ar_MA = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM‏/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/‏M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE، d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE، d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_MR.\n */\ngoog.i18n.DateTimePatterns_ar_MR = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_OM.\n */\ngoog.i18n.DateTimePatterns_ar_OM = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_PS.\n */\ngoog.i18n.DateTimePatterns_ar_PS = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_QA.\n */\ngoog.i18n.DateTimePatterns_ar_QA = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_SA.\n */\ngoog.i18n.DateTimePatterns_ar_SA = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_SD.\n */\ngoog.i18n.DateTimePatterns_ar_SD = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_SO.\n */\ngoog.i18n.DateTimePatterns_ar_SO = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_SS.\n */\ngoog.i18n.DateTimePatterns_ar_SS = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_SY.\n */\ngoog.i18n.DateTimePatterns_ar_SY = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_TD.\n */\ngoog.i18n.DateTimePatterns_ar_TD = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_TN.\n */\ngoog.i18n.DateTimePatterns_ar_TN = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_XB.\n */\ngoog.i18n.DateTimePatterns_ar_XB = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale ar_YE.\n */\ngoog.i18n.DateTimePatterns_ar_YE = goog.i18n.DateTimePatterns_ar;\n\n\n/**\n * Extended set of localized date/time patterns for locale as.\n */\ngoog.i18n.DateTimePatterns_as = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd-MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM a h:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale as_IN.\n */\ngoog.i18n.DateTimePatterns_as_IN = goog.i18n.DateTimePatterns_as;\n\n\n/**\n * Extended set of localized date/time patterns for locale asa.\n */\ngoog.i18n.DateTimePatterns_asa = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale asa_TZ.\n */\ngoog.i18n.DateTimePatterns_asa_TZ = goog.i18n.DateTimePatterns_asa;\n\n\n/**\n * Extended set of localized date/time patterns for locale ast.\n */\ngoog.i18n.DateTimePatterns_ast = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'LLLL \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ast_ES.\n */\ngoog.i18n.DateTimePatterns_ast_ES = goog.i18n.DateTimePatterns_ast;\n\n\n/**\n * Extended set of localized date/time patterns for locale az_Cyrl.\n */\ngoog.i18n.DateTimePatterns_az_Cyrl = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM, y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'dd.MM',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'd MMM, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'd MMM y, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale az_Cyrl_AZ.\n */\ngoog.i18n.DateTimePatterns_az_Cyrl_AZ = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM, y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'dd.MM',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'd MMM, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'd MMM y, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale az_Latn.\n */\ngoog.i18n.DateTimePatterns_az_Latn = goog.i18n.DateTimePatterns_az;\n\n\n/**\n * Extended set of localized date/time patterns for locale az_Latn_AZ.\n */\ngoog.i18n.DateTimePatterns_az_Latn_AZ = goog.i18n.DateTimePatterns_az;\n\n\n/**\n * Extended set of localized date/time patterns for locale bas.\n */\ngoog.i18n.DateTimePatterns_bas = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale bas_CM.\n */\ngoog.i18n.DateTimePatterns_bas_CM = goog.i18n.DateTimePatterns_bas;\n\n\n/**\n * Extended set of localized date/time patterns for locale be_BY.\n */\ngoog.i18n.DateTimePatterns_be_BY = goog.i18n.DateTimePatterns_be;\n\n\n/**\n * Extended set of localized date/time patterns for locale bem.\n */\ngoog.i18n.DateTimePatterns_bem = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale bem_ZM.\n */\ngoog.i18n.DateTimePatterns_bem_ZM = goog.i18n.DateTimePatterns_bem;\n\n\n/**\n * Extended set of localized date/time patterns for locale bez.\n */\ngoog.i18n.DateTimePatterns_bez = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale bez_TZ.\n */\ngoog.i18n.DateTimePatterns_bez_TZ = goog.i18n.DateTimePatterns_bez;\n\n\n/**\n * Extended set of localized date/time patterns for locale bg_BG.\n */\ngoog.i18n.DateTimePatterns_bg_BG = goog.i18n.DateTimePatterns_bg;\n\n\n/**\n * Extended set of localized date/time patterns for locale bm.\n */\ngoog.i18n.DateTimePatterns_bm = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale bm_ML.\n */\ngoog.i18n.DateTimePatterns_bm_ML = goog.i18n.DateTimePatterns_bm;\n\n\n/**\n * Extended set of localized date/time patterns for locale bn_BD.\n */\ngoog.i18n.DateTimePatterns_bn_BD = goog.i18n.DateTimePatterns_bn;\n\n\n/**\n * Extended set of localized date/time patterns for locale bn_IN.\n */\ngoog.i18n.DateTimePatterns_bn_IN = goog.i18n.DateTimePatterns_bn;\n\n\n/**\n * Extended set of localized date/time patterns for locale bo.\n */\ngoog.i18n.DateTimePatterns_bo = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y LLL',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMMཚེས་d',\n  MONTH_DAY_FULL: 'MMMMའི་ཚེས་dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMMའི་ཚེས་d',\n  MONTH_DAY_YEAR_MEDIUM: 'y ལོའི་MMMཚེས་d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMMཚེས་d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMMཚེས་d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale bo_CN.\n */\ngoog.i18n.DateTimePatterns_bo_CN = goog.i18n.DateTimePatterns_bo;\n\n\n/**\n * Extended set of localized date/time patterns for locale bo_IN.\n */\ngoog.i18n.DateTimePatterns_bo_IN = goog.i18n.DateTimePatterns_bo;\n\n\n/**\n * Extended set of localized date/time patterns for locale br_FR.\n */\ngoog.i18n.DateTimePatterns_br_FR = goog.i18n.DateTimePatterns_br;\n\n\n/**\n * Extended set of localized date/time patterns for locale brx.\n */\ngoog.i18n.DateTimePatterns_brx = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd-MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd-MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale brx_IN.\n */\ngoog.i18n.DateTimePatterns_brx_IN = goog.i18n.DateTimePatterns_brx;\n\n\n/**\n * Extended set of localized date/time patterns for locale bs_Cyrl.\n */\ngoog.i18n.DateTimePatterns_bs_Cyrl = {\n  YEAR_FULL: 'y.',\n  YEAR_FULL_WITH_ERA: 'y. G',\n  YEAR_MONTH_ABBR: 'MMM y.',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM.y.',\n  MONTH_DAY_ABBR: 'dd. MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'dd.MM.',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'dd. MMM y.',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, dd. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, dd. MMM y.',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'dd. MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale bs_Cyrl_BA.\n */\ngoog.i18n.DateTimePatterns_bs_Cyrl_BA = {\n  YEAR_FULL: 'y.',\n  YEAR_FULL_WITH_ERA: 'y. G',\n  YEAR_MONTH_ABBR: 'MMM y.',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM.y.',\n  MONTH_DAY_ABBR: 'dd. MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'dd.MM.',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'dd. MMM y.',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, dd. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, dd. MMM y.',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'dd. MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale bs_Latn.\n */\ngoog.i18n.DateTimePatterns_bs_Latn = goog.i18n.DateTimePatterns_bs;\n\n\n/**\n * Extended set of localized date/time patterns for locale bs_Latn_BA.\n */\ngoog.i18n.DateTimePatterns_bs_Latn_BA = goog.i18n.DateTimePatterns_bs;\n\n\n/**\n * Extended set of localized date/time patterns for locale ca_AD.\n */\ngoog.i18n.DateTimePatterns_ca_AD = goog.i18n.DateTimePatterns_ca;\n\n\n/**\n * Extended set of localized date/time patterns for locale ca_ES.\n */\ngoog.i18n.DateTimePatterns_ca_ES = goog.i18n.DateTimePatterns_ca;\n\n\n/**\n * Extended set of localized date/time patterns for locale ca_FR.\n */\ngoog.i18n.DateTimePatterns_ca_FR = goog.i18n.DateTimePatterns_ca;\n\n\n/**\n * Extended set of localized date/time patterns for locale ca_IT.\n */\ngoog.i18n.DateTimePatterns_ca_IT = goog.i18n.DateTimePatterns_ca;\n\n\n/**\n * Extended set of localized date/time patterns for locale ccp.\n */\ngoog.i18n.DateTimePatterns_ccp = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ccp_BD.\n */\ngoog.i18n.DateTimePatterns_ccp_BD = goog.i18n.DateTimePatterns_ccp;\n\n\n/**\n * Extended set of localized date/time patterns for locale ccp_IN.\n */\ngoog.i18n.DateTimePatterns_ccp_IN = goog.i18n.DateTimePatterns_ccp;\n\n\n/**\n * Extended set of localized date/time patterns for locale ce.\n */\ngoog.i18n.DateTimePatterns_ce = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ce_RU.\n */\ngoog.i18n.DateTimePatterns_ce_RU = goog.i18n.DateTimePatterns_ce;\n\n\n/**\n * Extended set of localized date/time patterns for locale ceb.\n */\ngoog.i18n.DateTimePatterns_ceb = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ceb_PH.\n */\ngoog.i18n.DateTimePatterns_ceb_PH = goog.i18n.DateTimePatterns_ceb;\n\n\n/**\n * Extended set of localized date/time patterns for locale cgg.\n */\ngoog.i18n.DateTimePatterns_cgg = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale cgg_UG.\n */\ngoog.i18n.DateTimePatterns_cgg_UG = goog.i18n.DateTimePatterns_cgg;\n\n\n/**\n * Extended set of localized date/time patterns for locale chr_US.\n */\ngoog.i18n.DateTimePatterns_chr_US = goog.i18n.DateTimePatterns_chr;\n\n\n/**\n * Extended set of localized date/time patterns for locale ckb.\n */\ngoog.i18n.DateTimePatterns_ckb = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMMی y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'dی MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'dی MMMی y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE، dی MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE، dی MMMی y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'dی MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ckb_IQ.\n */\ngoog.i18n.DateTimePatterns_ckb_IQ = goog.i18n.DateTimePatterns_ckb;\n\n\n/**\n * Extended set of localized date/time patterns for locale ckb_IR.\n */\ngoog.i18n.DateTimePatterns_ckb_IR = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMMی y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'dی MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'dی MMMی y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE، dی MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE، dی MMMی y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'dی MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale cs_CZ.\n */\ngoog.i18n.DateTimePatterns_cs_CZ = goog.i18n.DateTimePatterns_cs;\n\n\n/**\n * Extended set of localized date/time patterns for locale cy_GB.\n */\ngoog.i18n.DateTimePatterns_cy_GB = goog.i18n.DateTimePatterns_cy;\n\n\n/**\n * Extended set of localized date/time patterns for locale da_DK.\n */\ngoog.i18n.DateTimePatterns_da_DK = goog.i18n.DateTimePatterns_da;\n\n\n/**\n * Extended set of localized date/time patterns for locale da_GL.\n */\ngoog.i18n.DateTimePatterns_da_GL = goog.i18n.DateTimePatterns_da;\n\n\n/**\n * Extended set of localized date/time patterns for locale dav.\n */\ngoog.i18n.DateTimePatterns_dav = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale dav_KE.\n */\ngoog.i18n.DateTimePatterns_dav_KE = goog.i18n.DateTimePatterns_dav;\n\n\n/**\n * Extended set of localized date/time patterns for locale de_BE.\n */\ngoog.i18n.DateTimePatterns_de_BE = goog.i18n.DateTimePatterns_de;\n\n\n/**\n * Extended set of localized date/time patterns for locale de_DE.\n */\ngoog.i18n.DateTimePatterns_de_DE = goog.i18n.DateTimePatterns_de;\n\n\n/**\n * Extended set of localized date/time patterns for locale de_IT.\n */\ngoog.i18n.DateTimePatterns_de_IT = goog.i18n.DateTimePatterns_de;\n\n\n/**\n * Extended set of localized date/time patterns for locale de_LI.\n */\ngoog.i18n.DateTimePatterns_de_LI = goog.i18n.DateTimePatterns_de;\n\n\n/**\n * Extended set of localized date/time patterns for locale de_LU.\n */\ngoog.i18n.DateTimePatterns_de_LU = goog.i18n.DateTimePatterns_de;\n\n\n/**\n * Extended set of localized date/time patterns for locale dje.\n */\ngoog.i18n.DateTimePatterns_dje = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale dje_NE.\n */\ngoog.i18n.DateTimePatterns_dje_NE = goog.i18n.DateTimePatterns_dje;\n\n\n/**\n * Extended set of localized date/time patterns for locale dsb.\n */\ngoog.i18n.DateTimePatterns_dsb = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd.M.',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d. MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale dsb_DE.\n */\ngoog.i18n.DateTimePatterns_dsb_DE = goog.i18n.DateTimePatterns_dsb;\n\n\n/**\n * Extended set of localized date/time patterns for locale dua.\n */\ngoog.i18n.DateTimePatterns_dua = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale dua_CM.\n */\ngoog.i18n.DateTimePatterns_dua_CM = goog.i18n.DateTimePatterns_dua;\n\n\n/**\n * Extended set of localized date/time patterns for locale dyo.\n */\ngoog.i18n.DateTimePatterns_dyo = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale dyo_SN.\n */\ngoog.i18n.DateTimePatterns_dyo_SN = goog.i18n.DateTimePatterns_dyo;\n\n\n/**\n * Extended set of localized date/time patterns for locale dz.\n */\ngoog.i18n.DateTimePatterns_dz = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y སྤྱི་ཟླ་MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'སྤྱི་LLL ཚེ་d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M-d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, སྤྱི་LLL ཚེ་d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'གཟའ་EEE, ལོy ཟླ་MMM ཚེ་d',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'སྤྱི་LLL ཚེ་d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale dz_BT.\n */\ngoog.i18n.DateTimePatterns_dz_BT = goog.i18n.DateTimePatterns_dz;\n\n\n/**\n * Extended set of localized date/time patterns for locale ebu.\n */\ngoog.i18n.DateTimePatterns_ebu = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ebu_KE.\n */\ngoog.i18n.DateTimePatterns_ebu_KE = goog.i18n.DateTimePatterns_ebu;\n\n\n/**\n * Extended set of localized date/time patterns for locale ee.\n */\ngoog.i18n.DateTimePatterns_ee = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d \\'lia\\'',\n  MONTH_DAY_FULL: 'MMMM dd \\'lia\\'',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d \\'lia\\'',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d \\'lia\\', y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d \\'lia\\'',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'a \\'ga\\' h:mm \\'le\\' zzzz MMM d \\'lia\\''\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ee_GH.\n */\ngoog.i18n.DateTimePatterns_ee_GH = goog.i18n.DateTimePatterns_ee;\n\n\n/**\n * Extended set of localized date/time patterns for locale ee_TG.\n */\ngoog.i18n.DateTimePatterns_ee_TG = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d \\'lia\\'',\n  MONTH_DAY_FULL: 'MMMM dd \\'lia\\'',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d \\'lia\\'',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d \\'lia\\', y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d \\'lia\\'',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: '\\'ga\\' HH:mm \\'le\\' zzzz MMM d \\'lia\\''\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale el_CY.\n */\ngoog.i18n.DateTimePatterns_el_CY = goog.i18n.DateTimePatterns_el;\n\n\n/**\n * Extended set of localized date/time patterns for locale el_GR.\n */\ngoog.i18n.DateTimePatterns_el_GR = goog.i18n.DateTimePatterns_el;\n\n\n/**\n * Extended set of localized date/time patterns for locale en_001.\n */\ngoog.i18n.DateTimePatterns_en_001 = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_150.\n */\ngoog.i18n.DateTimePatterns_en_150 = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_AE.\n */\ngoog.i18n.DateTimePatterns_en_AE = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_AG.\n */\ngoog.i18n.DateTimePatterns_en_AG = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_AI.\n */\ngoog.i18n.DateTimePatterns_en_AI = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_AS.\n */\ngoog.i18n.DateTimePatterns_en_AS = goog.i18n.DateTimePatterns_en;\n\n\n/**\n * Extended set of localized date/time patterns for locale en_AT.\n */\ngoog.i18n.DateTimePatterns_en_AT = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_BB.\n */\ngoog.i18n.DateTimePatterns_en_BB = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_BE.\n */\ngoog.i18n.DateTimePatterns_en_BE = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_BI.\n */\ngoog.i18n.DateTimePatterns_en_BI = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_BM.\n */\ngoog.i18n.DateTimePatterns_en_BM = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_BS.\n */\ngoog.i18n.DateTimePatterns_en_BS = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_BW.\n */\ngoog.i18n.DateTimePatterns_en_BW = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'dd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'dd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, dd MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, dd MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'dd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_BZ.\n */\ngoog.i18n.DateTimePatterns_en_BZ = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'dd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'dd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, dd MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, dd MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'dd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_CC.\n */\ngoog.i18n.DateTimePatterns_en_CC = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_CH.\n */\ngoog.i18n.DateTimePatterns_en_CH = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_CK.\n */\ngoog.i18n.DateTimePatterns_en_CK = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_CM.\n */\ngoog.i18n.DateTimePatterns_en_CM = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_CX.\n */\ngoog.i18n.DateTimePatterns_en_CX = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_CY.\n */\ngoog.i18n.DateTimePatterns_en_CY = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_DE.\n */\ngoog.i18n.DateTimePatterns_en_DE = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_DG.\n */\ngoog.i18n.DateTimePatterns_en_DG = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_DK.\n */\ngoog.i18n.DateTimePatterns_en_DK = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH.mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_DM.\n */\ngoog.i18n.DateTimePatterns_en_DM = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_ER.\n */\ngoog.i18n.DateTimePatterns_en_ER = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_FI.\n */\ngoog.i18n.DateTimePatterns_en_FI = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, H.mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_FJ.\n */\ngoog.i18n.DateTimePatterns_en_FJ = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_FK.\n */\ngoog.i18n.DateTimePatterns_en_FK = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_FM.\n */\ngoog.i18n.DateTimePatterns_en_FM = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_GD.\n */\ngoog.i18n.DateTimePatterns_en_GD = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_GG.\n */\ngoog.i18n.DateTimePatterns_en_GG = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_GH.\n */\ngoog.i18n.DateTimePatterns_en_GH = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_GI.\n */\ngoog.i18n.DateTimePatterns_en_GI = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_GM.\n */\ngoog.i18n.DateTimePatterns_en_GM = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_GU.\n */\ngoog.i18n.DateTimePatterns_en_GU = goog.i18n.DateTimePatterns_en;\n\n\n/**\n * Extended set of localized date/time patterns for locale en_GY.\n */\ngoog.i18n.DateTimePatterns_en_GY = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_HK.\n */\ngoog.i18n.DateTimePatterns_en_HK = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_IL.\n */\ngoog.i18n.DateTimePatterns_en_IL = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_IM.\n */\ngoog.i18n.DateTimePatterns_en_IM = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_IO.\n */\ngoog.i18n.DateTimePatterns_en_IO = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_JE.\n */\ngoog.i18n.DateTimePatterns_en_JE = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_JM.\n */\ngoog.i18n.DateTimePatterns_en_JM = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_KE.\n */\ngoog.i18n.DateTimePatterns_en_KE = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_KI.\n */\ngoog.i18n.DateTimePatterns_en_KI = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_KN.\n */\ngoog.i18n.DateTimePatterns_en_KN = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_KY.\n */\ngoog.i18n.DateTimePatterns_en_KY = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_LC.\n */\ngoog.i18n.DateTimePatterns_en_LC = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_LR.\n */\ngoog.i18n.DateTimePatterns_en_LR = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_LS.\n */\ngoog.i18n.DateTimePatterns_en_LS = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_MG.\n */\ngoog.i18n.DateTimePatterns_en_MG = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_MH.\n */\ngoog.i18n.DateTimePatterns_en_MH = goog.i18n.DateTimePatterns_en;\n\n\n/**\n * Extended set of localized date/time patterns for locale en_MO.\n */\ngoog.i18n.DateTimePatterns_en_MO = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_MP.\n */\ngoog.i18n.DateTimePatterns_en_MP = goog.i18n.DateTimePatterns_en;\n\n\n/**\n * Extended set of localized date/time patterns for locale en_MS.\n */\ngoog.i18n.DateTimePatterns_en_MS = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_MT.\n */\ngoog.i18n.DateTimePatterns_en_MT = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'dd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'dd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, dd MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'dd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_MU.\n */\ngoog.i18n.DateTimePatterns_en_MU = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_MW.\n */\ngoog.i18n.DateTimePatterns_en_MW = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_MY.\n */\ngoog.i18n.DateTimePatterns_en_MY = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_NA.\n */\ngoog.i18n.DateTimePatterns_en_NA = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_NF.\n */\ngoog.i18n.DateTimePatterns_en_NF = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_NG.\n */\ngoog.i18n.DateTimePatterns_en_NG = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_NL.\n */\ngoog.i18n.DateTimePatterns_en_NL = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_NR.\n */\ngoog.i18n.DateTimePatterns_en_NR = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_NU.\n */\ngoog.i18n.DateTimePatterns_en_NU = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_NZ.\n */\ngoog.i18n.DateTimePatterns_en_NZ = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_PG.\n */\ngoog.i18n.DateTimePatterns_en_PG = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_PH.\n */\ngoog.i18n.DateTimePatterns_en_PH = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_PK.\n */\ngoog.i18n.DateTimePatterns_en_PK = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_PN.\n */\ngoog.i18n.DateTimePatterns_en_PN = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_PR.\n */\ngoog.i18n.DateTimePatterns_en_PR = goog.i18n.DateTimePatterns_en;\n\n\n/**\n * Extended set of localized date/time patterns for locale en_PW.\n */\ngoog.i18n.DateTimePatterns_en_PW = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_RW.\n */\ngoog.i18n.DateTimePatterns_en_RW = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_SB.\n */\ngoog.i18n.DateTimePatterns_en_SB = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_SC.\n */\ngoog.i18n.DateTimePatterns_en_SC = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_SD.\n */\ngoog.i18n.DateTimePatterns_en_SD = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_SE.\n */\ngoog.i18n.DateTimePatterns_en_SE = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_SH.\n */\ngoog.i18n.DateTimePatterns_en_SH = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_SI.\n */\ngoog.i18n.DateTimePatterns_en_SI = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_SL.\n */\ngoog.i18n.DateTimePatterns_en_SL = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_SS.\n */\ngoog.i18n.DateTimePatterns_en_SS = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_SX.\n */\ngoog.i18n.DateTimePatterns_en_SX = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_SZ.\n */\ngoog.i18n.DateTimePatterns_en_SZ = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_TC.\n */\ngoog.i18n.DateTimePatterns_en_TC = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_TK.\n */\ngoog.i18n.DateTimePatterns_en_TK = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_TO.\n */\ngoog.i18n.DateTimePatterns_en_TO = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_TT.\n */\ngoog.i18n.DateTimePatterns_en_TT = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_TV.\n */\ngoog.i18n.DateTimePatterns_en_TV = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_TZ.\n */\ngoog.i18n.DateTimePatterns_en_TZ = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_UG.\n */\ngoog.i18n.DateTimePatterns_en_UG = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_UM.\n */\ngoog.i18n.DateTimePatterns_en_UM = goog.i18n.DateTimePatterns_en;\n\n\n/**\n * Extended set of localized date/time patterns for locale en_US_POSIX.\n */\ngoog.i18n.DateTimePatterns_en_US_POSIX = goog.i18n.DateTimePatterns_en;\n\n\n/**\n * Extended set of localized date/time patterns for locale en_VC.\n */\ngoog.i18n.DateTimePatterns_en_VC = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_VG.\n */\ngoog.i18n.DateTimePatterns_en_VG = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_VI.\n */\ngoog.i18n.DateTimePatterns_en_VI = goog.i18n.DateTimePatterns_en;\n\n\n/**\n * Extended set of localized date/time patterns for locale en_VU.\n */\ngoog.i18n.DateTimePatterns_en_VU = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_WS.\n */\ngoog.i18n.DateTimePatterns_en_WS = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_XA.\n */\ngoog.i18n.DateTimePatterns_en_XA = {\n  YEAR_FULL: '[y]',\n  YEAR_FULL_WITH_ERA: '[y G]',\n  YEAR_MONTH_ABBR: '[MMM y]',\n  YEAR_MONTH_FULL: '[MMMM y]',\n  YEAR_MONTH_SHORT: '[MM/y]',\n  MONTH_DAY_ABBR: '[MMM d]',\n  MONTH_DAY_FULL: '[MMMM dd]',\n  MONTH_DAY_SHORT: '[M/d]',\n  MONTH_DAY_MEDIUM: '[MMMM d]',\n  MONTH_DAY_YEAR_MEDIUM: '[MMM d, y]',\n  WEEKDAY_MONTH_DAY_MEDIUM: '[EEE, MMM d]',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: '[EEE, MMM d, y]',\n  DAY_ABBR: '[d]',\n  MONTH_DAY_TIME_ZONE_SHORT: '[[MMM d], [h:mm a zzzz]]'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_ZM.\n */\ngoog.i18n.DateTimePatterns_en_ZM = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale en_ZW.\n */\ngoog.i18n.DateTimePatterns_en_ZW = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'dd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'dd MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, dd MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, dd MMM, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'dd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale eo.\n */\ngoog.i18n.DateTimePatterns_eo = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y-MMM-d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale eo_001.\n */\ngoog.i18n.DateTimePatterns_eo_001 = goog.i18n.DateTimePatterns_eo;\n\n\n/**\n * Extended set of localized date/time patterns for locale es_AR.\n */\ngoog.i18n.DateTimePatterns_es_AR = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_BO.\n */\ngoog.i18n.DateTimePatterns_es_BO = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_BR.\n */\ngoog.i18n.DateTimePatterns_es_BR = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_BZ.\n */\ngoog.i18n.DateTimePatterns_es_BZ = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_CL.\n */\ngoog.i18n.DateTimePatterns_es_CL = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'dd-MM',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_CO.\n */\ngoog.i18n.DateTimePatterns_es_CO = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd \\'de\\' MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d \\'de\\' MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd \\'de\\' MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_CR.\n */\ngoog.i18n.DateTimePatterns_es_CR = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_CU.\n */\ngoog.i18n.DateTimePatterns_es_CU = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_DO.\n */\ngoog.i18n.DateTimePatterns_es_DO = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_EA.\n */\ngoog.i18n.DateTimePatterns_es_EA = goog.i18n.DateTimePatterns_es;\n\n\n/**\n * Extended set of localized date/time patterns for locale es_EC.\n */\ngoog.i18n.DateTimePatterns_es_EC = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_GQ.\n */\ngoog.i18n.DateTimePatterns_es_GQ = goog.i18n.DateTimePatterns_es;\n\n\n/**\n * Extended set of localized date/time patterns for locale es_GT.\n */\ngoog.i18n.DateTimePatterns_es_GT = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_HN.\n */\ngoog.i18n.DateTimePatterns_es_HN = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_IC.\n */\ngoog.i18n.DateTimePatterns_es_IC = goog.i18n.DateTimePatterns_es;\n\n\n/**\n * Extended set of localized date/time patterns for locale es_NI.\n */\ngoog.i18n.DateTimePatterns_es_NI = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_PA.\n */\ngoog.i18n.DateTimePatterns_es_PA = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'MM/dd',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_PE.\n */\ngoog.i18n.DateTimePatterns_es_PE = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_PH.\n */\ngoog.i18n.DateTimePatterns_es_PH = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_PR.\n */\ngoog.i18n.DateTimePatterns_es_PR = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'MM/dd',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_PY.\n */\ngoog.i18n.DateTimePatterns_es_PY = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_SV.\n */\ngoog.i18n.DateTimePatterns_es_SV = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_UY.\n */\ngoog.i18n.DateTimePatterns_es_UY = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM H:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale es_VE.\n */\ngoog.i18n.DateTimePatterns_es_VE = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'M/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale et_EE.\n */\ngoog.i18n.DateTimePatterns_et_EE = goog.i18n.DateTimePatterns_et;\n\n\n/**\n * Extended set of localized date/time patterns for locale eu_ES.\n */\ngoog.i18n.DateTimePatterns_eu_ES = goog.i18n.DateTimePatterns_eu;\n\n\n/**\n * Extended set of localized date/time patterns for locale ewo.\n */\ngoog.i18n.DateTimePatterns_ewo = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ewo_CM.\n */\ngoog.i18n.DateTimePatterns_ewo_CM = goog.i18n.DateTimePatterns_ewo;\n\n\n/**\n * Extended set of localized date/time patterns for locale fa_AF.\n */\ngoog.i18n.DateTimePatterns_fa_AF = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d،‏ HH:mm (zzzz)'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fa_IR.\n */\ngoog.i18n.DateTimePatterns_fa_IR = goog.i18n.DateTimePatterns_fa;\n\n\n/**\n * Extended set of localized date/time patterns for locale ff.\n */\ngoog.i18n.DateTimePatterns_ff = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ff_Latn.\n */\ngoog.i18n.DateTimePatterns_ff_Latn = goog.i18n.DateTimePatterns_ff;\n\n\n/**\n * Extended set of localized date/time patterns for locale ff_Latn_BF.\n */\ngoog.i18n.DateTimePatterns_ff_Latn_BF = goog.i18n.DateTimePatterns_ff;\n\n\n/**\n * Extended set of localized date/time patterns for locale ff_Latn_CM.\n */\ngoog.i18n.DateTimePatterns_ff_Latn_CM = goog.i18n.DateTimePatterns_ff;\n\n\n/**\n * Extended set of localized date/time patterns for locale ff_Latn_GH.\n */\ngoog.i18n.DateTimePatterns_ff_Latn_GH = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ff_Latn_GM.\n */\ngoog.i18n.DateTimePatterns_ff_Latn_GM = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ff_Latn_GN.\n */\ngoog.i18n.DateTimePatterns_ff_Latn_GN = goog.i18n.DateTimePatterns_ff;\n\n\n/**\n * Extended set of localized date/time patterns for locale ff_Latn_GW.\n */\ngoog.i18n.DateTimePatterns_ff_Latn_GW = goog.i18n.DateTimePatterns_ff;\n\n\n/**\n * Extended set of localized date/time patterns for locale ff_Latn_LR.\n */\ngoog.i18n.DateTimePatterns_ff_Latn_LR = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ff_Latn_MR.\n */\ngoog.i18n.DateTimePatterns_ff_Latn_MR = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ff_Latn_NE.\n */\ngoog.i18n.DateTimePatterns_ff_Latn_NE = goog.i18n.DateTimePatterns_ff;\n\n\n/**\n * Extended set of localized date/time patterns for locale ff_Latn_NG.\n */\ngoog.i18n.DateTimePatterns_ff_Latn_NG = goog.i18n.DateTimePatterns_ff;\n\n\n/**\n * Extended set of localized date/time patterns for locale ff_Latn_SL.\n */\ngoog.i18n.DateTimePatterns_ff_Latn_SL = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ff_Latn_SN.\n */\ngoog.i18n.DateTimePatterns_ff_Latn_SN = goog.i18n.DateTimePatterns_ff;\n\n\n/**\n * Extended set of localized date/time patterns for locale fi_FI.\n */\ngoog.i18n.DateTimePatterns_fi_FI = goog.i18n.DateTimePatterns_fi;\n\n\n/**\n * Extended set of localized date/time patterns for locale fil_PH.\n */\ngoog.i18n.DateTimePatterns_fil_PH = goog.i18n.DateTimePatterns_fil;\n\n\n/**\n * Extended set of localized date/time patterns for locale fo.\n */\ngoog.i18n.DateTimePatterns_fo = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'dd.MM',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d. MMM y',\n  DAY_ABBR: 'd.',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fo_DK.\n */\ngoog.i18n.DateTimePatterns_fo_DK = goog.i18n.DateTimePatterns_fo;\n\n\n/**\n * Extended set of localized date/time patterns for locale fo_FO.\n */\ngoog.i18n.DateTimePatterns_fo_FO = goog.i18n.DateTimePatterns_fo;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_BE.\n */\ngoog.i18n.DateTimePatterns_fr_BE = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_BF.\n */\ngoog.i18n.DateTimePatterns_fr_BF = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_BI.\n */\ngoog.i18n.DateTimePatterns_fr_BI = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_BJ.\n */\ngoog.i18n.DateTimePatterns_fr_BJ = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_BL.\n */\ngoog.i18n.DateTimePatterns_fr_BL = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_CD.\n */\ngoog.i18n.DateTimePatterns_fr_CD = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_CF.\n */\ngoog.i18n.DateTimePatterns_fr_CF = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_CG.\n */\ngoog.i18n.DateTimePatterns_fr_CG = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_CH.\n */\ngoog.i18n.DateTimePatterns_fr_CH = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd.MM.',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM \\'à\\' HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_CI.\n */\ngoog.i18n.DateTimePatterns_fr_CI = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_CM.\n */\ngoog.i18n.DateTimePatterns_fr_CM = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_DJ.\n */\ngoog.i18n.DateTimePatterns_fr_DJ = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM \\'à\\' h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_DZ.\n */\ngoog.i18n.DateTimePatterns_fr_DZ = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM \\'à\\' h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_FR.\n */\ngoog.i18n.DateTimePatterns_fr_FR = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_GA.\n */\ngoog.i18n.DateTimePatterns_fr_GA = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_GF.\n */\ngoog.i18n.DateTimePatterns_fr_GF = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_GN.\n */\ngoog.i18n.DateTimePatterns_fr_GN = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_GP.\n */\ngoog.i18n.DateTimePatterns_fr_GP = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_GQ.\n */\ngoog.i18n.DateTimePatterns_fr_GQ = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_HT.\n */\ngoog.i18n.DateTimePatterns_fr_HT = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_KM.\n */\ngoog.i18n.DateTimePatterns_fr_KM = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_LU.\n */\ngoog.i18n.DateTimePatterns_fr_LU = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_MA.\n */\ngoog.i18n.DateTimePatterns_fr_MA = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_MC.\n */\ngoog.i18n.DateTimePatterns_fr_MC = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_MF.\n */\ngoog.i18n.DateTimePatterns_fr_MF = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_MG.\n */\ngoog.i18n.DateTimePatterns_fr_MG = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_ML.\n */\ngoog.i18n.DateTimePatterns_fr_ML = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_MQ.\n */\ngoog.i18n.DateTimePatterns_fr_MQ = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_MR.\n */\ngoog.i18n.DateTimePatterns_fr_MR = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM \\'à\\' h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_MU.\n */\ngoog.i18n.DateTimePatterns_fr_MU = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_NC.\n */\ngoog.i18n.DateTimePatterns_fr_NC = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_NE.\n */\ngoog.i18n.DateTimePatterns_fr_NE = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_PF.\n */\ngoog.i18n.DateTimePatterns_fr_PF = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_PM.\n */\ngoog.i18n.DateTimePatterns_fr_PM = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_RE.\n */\ngoog.i18n.DateTimePatterns_fr_RE = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_RW.\n */\ngoog.i18n.DateTimePatterns_fr_RW = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_SC.\n */\ngoog.i18n.DateTimePatterns_fr_SC = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_SN.\n */\ngoog.i18n.DateTimePatterns_fr_SN = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_SY.\n */\ngoog.i18n.DateTimePatterns_fr_SY = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM \\'à\\' h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_TD.\n */\ngoog.i18n.DateTimePatterns_fr_TD = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM \\'à\\' h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_TG.\n */\ngoog.i18n.DateTimePatterns_fr_TG = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_TN.\n */\ngoog.i18n.DateTimePatterns_fr_TN = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM \\'à\\' h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_VU.\n */\ngoog.i18n.DateTimePatterns_fr_VU = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM \\'à\\' h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_WF.\n */\ngoog.i18n.DateTimePatterns_fr_WF = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fr_YT.\n */\ngoog.i18n.DateTimePatterns_fr_YT = goog.i18n.DateTimePatterns_fr;\n\n\n/**\n * Extended set of localized date/time patterns for locale fur.\n */\ngoog.i18n.DateTimePatterns_fur = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'LLLL \\'dal\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'di\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd \\'di\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fur_IT.\n */\ngoog.i18n.DateTimePatterns_fur_IT = goog.i18n.DateTimePatterns_fur;\n\n\n/**\n * Extended set of localized date/time patterns for locale fy.\n */\ngoog.i18n.DateTimePatterns_fy = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd-M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale fy_NL.\n */\ngoog.i18n.DateTimePatterns_fy_NL = goog.i18n.DateTimePatterns_fy;\n\n\n/**\n * Extended set of localized date/time patterns for locale ga_IE.\n */\ngoog.i18n.DateTimePatterns_ga_IE = goog.i18n.DateTimePatterns_ga;\n\n\n/**\n * Extended set of localized date/time patterns for locale gd.\n */\ngoog.i18n.DateTimePatterns_gd = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'LLL Y',\n  YEAR_MONTH_FULL: 'LLLL y',\n  YEAR_MONTH_SHORT: 'LL/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd\\'mh\\' MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd\\'mh\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale gd_GB.\n */\ngoog.i18n.DateTimePatterns_gd_GB = goog.i18n.DateTimePatterns_gd;\n\n\n/**\n * Extended set of localized date/time patterns for locale gl_ES.\n */\ngoog.i18n.DateTimePatterns_gl_ES = goog.i18n.DateTimePatterns_gl;\n\n\n/**\n * Extended set of localized date/time patterns for locale gsw_CH.\n */\ngoog.i18n.DateTimePatterns_gsw_CH = goog.i18n.DateTimePatterns_gsw;\n\n\n/**\n * Extended set of localized date/time patterns for locale gsw_FR.\n */\ngoog.i18n.DateTimePatterns_gsw_FR = goog.i18n.DateTimePatterns_gsw;\n\n\n/**\n * Extended set of localized date/time patterns for locale gsw_LI.\n */\ngoog.i18n.DateTimePatterns_gsw_LI = goog.i18n.DateTimePatterns_gsw;\n\n\n/**\n * Extended set of localized date/time patterns for locale gu_IN.\n */\ngoog.i18n.DateTimePatterns_gu_IN = goog.i18n.DateTimePatterns_gu;\n\n\n/**\n * Extended set of localized date/time patterns for locale guz.\n */\ngoog.i18n.DateTimePatterns_guz = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale guz_KE.\n */\ngoog.i18n.DateTimePatterns_guz_KE = goog.i18n.DateTimePatterns_guz;\n\n\n/**\n * Extended set of localized date/time patterns for locale gv.\n */\ngoog.i18n.DateTimePatterns_gv = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale gv_IM.\n */\ngoog.i18n.DateTimePatterns_gv_IM = goog.i18n.DateTimePatterns_gv;\n\n\n/**\n * Extended set of localized date/time patterns for locale ha.\n */\ngoog.i18n.DateTimePatterns_ha = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ha_GH.\n */\ngoog.i18n.DateTimePatterns_ha_GH = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ha_NE.\n */\ngoog.i18n.DateTimePatterns_ha_NE = goog.i18n.DateTimePatterns_ha;\n\n\n/**\n * Extended set of localized date/time patterns for locale ha_NG.\n */\ngoog.i18n.DateTimePatterns_ha_NG = goog.i18n.DateTimePatterns_ha;\n\n\n/**\n * Extended set of localized date/time patterns for locale haw_US.\n */\ngoog.i18n.DateTimePatterns_haw_US = goog.i18n.DateTimePatterns_haw;\n\n\n/**\n * Extended set of localized date/time patterns for locale he_IL.\n */\ngoog.i18n.DateTimePatterns_he_IL = goog.i18n.DateTimePatterns_he;\n\n\n/**\n * Extended set of localized date/time patterns for locale hi_IN.\n */\ngoog.i18n.DateTimePatterns_hi_IN = goog.i18n.DateTimePatterns_hi;\n\n\n/**\n * Extended set of localized date/time patterns for locale hr_BA.\n */\ngoog.i18n.DateTimePatterns_hr_BA = goog.i18n.DateTimePatterns_hr;\n\n\n/**\n * Extended set of localized date/time patterns for locale hr_HR.\n */\ngoog.i18n.DateTimePatterns_hr_HR = goog.i18n.DateTimePatterns_hr;\n\n\n/**\n * Extended set of localized date/time patterns for locale hsb.\n */\ngoog.i18n.DateTimePatterns_hsb = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd.M.',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d. MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale hsb_DE.\n */\ngoog.i18n.DateTimePatterns_hsb_DE = goog.i18n.DateTimePatterns_hsb;\n\n\n/**\n * Extended set of localized date/time patterns for locale hu_HU.\n */\ngoog.i18n.DateTimePatterns_hu_HU = goog.i18n.DateTimePatterns_hu;\n\n\n/**\n * Extended set of localized date/time patterns for locale hy_AM.\n */\ngoog.i18n.DateTimePatterns_hy_AM = goog.i18n.DateTimePatterns_hy;\n\n\n/**\n * Extended set of localized date/time patterns for locale ia.\n */\ngoog.i18n.DateTimePatterns_ia = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'dd-MM',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ia_001.\n */\ngoog.i18n.DateTimePatterns_ia_001 = goog.i18n.DateTimePatterns_ia;\n\n\n/**\n * Extended set of localized date/time patterns for locale id_ID.\n */\ngoog.i18n.DateTimePatterns_id_ID = goog.i18n.DateTimePatterns_id;\n\n\n/**\n * Extended set of localized date/time patterns for locale ig.\n */\ngoog.i18n.DateTimePatterns_ig = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ig_NG.\n */\ngoog.i18n.DateTimePatterns_ig_NG = goog.i18n.DateTimePatterns_ig;\n\n\n/**\n * Extended set of localized date/time patterns for locale ii.\n */\ngoog.i18n.DateTimePatterns_ii = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ii_CN.\n */\ngoog.i18n.DateTimePatterns_ii_CN = goog.i18n.DateTimePatterns_ii;\n\n\n/**\n * Extended set of localized date/time patterns for locale is_IS.\n */\ngoog.i18n.DateTimePatterns_is_IS = goog.i18n.DateTimePatterns_is;\n\n\n/**\n * Extended set of localized date/time patterns for locale it_CH.\n */\ngoog.i18n.DateTimePatterns_it_CH = goog.i18n.DateTimePatterns_it;\n\n\n/**\n * Extended set of localized date/time patterns for locale it_IT.\n */\ngoog.i18n.DateTimePatterns_it_IT = goog.i18n.DateTimePatterns_it;\n\n\n/**\n * Extended set of localized date/time patterns for locale it_SM.\n */\ngoog.i18n.DateTimePatterns_it_SM = goog.i18n.DateTimePatterns_it;\n\n\n/**\n * Extended set of localized date/time patterns for locale it_VA.\n */\ngoog.i18n.DateTimePatterns_it_VA = goog.i18n.DateTimePatterns_it;\n\n\n/**\n * Extended set of localized date/time patterns for locale ja_JP.\n */\ngoog.i18n.DateTimePatterns_ja_JP = goog.i18n.DateTimePatterns_ja;\n\n\n/**\n * Extended set of localized date/time patterns for locale jgo.\n */\ngoog.i18n.DateTimePatterns_jgo = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd.M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale jgo_CM.\n */\ngoog.i18n.DateTimePatterns_jgo_CM = goog.i18n.DateTimePatterns_jgo;\n\n\n/**\n * Extended set of localized date/time patterns for locale jmc.\n */\ngoog.i18n.DateTimePatterns_jmc = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale jmc_TZ.\n */\ngoog.i18n.DateTimePatterns_jmc_TZ = goog.i18n.DateTimePatterns_jmc;\n\n\n/**\n * Extended set of localized date/time patterns for locale jv.\n */\ngoog.i18n.DateTimePatterns_jv = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale jv_ID.\n */\ngoog.i18n.DateTimePatterns_jv_ID = goog.i18n.DateTimePatterns_jv;\n\n\n/**\n * Extended set of localized date/time patterns for locale ka_GE.\n */\ngoog.i18n.DateTimePatterns_ka_GE = goog.i18n.DateTimePatterns_ka;\n\n\n/**\n * Extended set of localized date/time patterns for locale kab.\n */\ngoog.i18n.DateTimePatterns_kab = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale kab_DZ.\n */\ngoog.i18n.DateTimePatterns_kab_DZ = goog.i18n.DateTimePatterns_kab;\n\n\n/**\n * Extended set of localized date/time patterns for locale kam.\n */\ngoog.i18n.DateTimePatterns_kam = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale kam_KE.\n */\ngoog.i18n.DateTimePatterns_kam_KE = goog.i18n.DateTimePatterns_kam;\n\n\n/**\n * Extended set of localized date/time patterns for locale kde.\n */\ngoog.i18n.DateTimePatterns_kde = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale kde_TZ.\n */\ngoog.i18n.DateTimePatterns_kde_TZ = goog.i18n.DateTimePatterns_kde;\n\n\n/**\n * Extended set of localized date/time patterns for locale kea.\n */\ngoog.i18n.DateTimePatterns_kea = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM \\'di\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd \\'di\\' MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd \\'di\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm (zzzz)'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale kea_CV.\n */\ngoog.i18n.DateTimePatterns_kea_CV = goog.i18n.DateTimePatterns_kea;\n\n\n/**\n * Extended set of localized date/time patterns for locale khq.\n */\ngoog.i18n.DateTimePatterns_khq = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale khq_ML.\n */\ngoog.i18n.DateTimePatterns_khq_ML = goog.i18n.DateTimePatterns_khq;\n\n\n/**\n * Extended set of localized date/time patterns for locale ki.\n */\ngoog.i18n.DateTimePatterns_ki = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ki_KE.\n */\ngoog.i18n.DateTimePatterns_ki_KE = goog.i18n.DateTimePatterns_ki;\n\n\n/**\n * Extended set of localized date/time patterns for locale kk_KZ.\n */\ngoog.i18n.DateTimePatterns_kk_KZ = goog.i18n.DateTimePatterns_kk;\n\n\n/**\n * Extended set of localized date/time patterns for locale kkj.\n */\ngoog.i18n.DateTimePatterns_kkj = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale kkj_CM.\n */\ngoog.i18n.DateTimePatterns_kkj_CM = goog.i18n.DateTimePatterns_kkj;\n\n\n/**\n * Extended set of localized date/time patterns for locale kl.\n */\ngoog.i18n.DateTimePatterns_kl = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale kl_GL.\n */\ngoog.i18n.DateTimePatterns_kl_GL = goog.i18n.DateTimePatterns_kl;\n\n\n/**\n * Extended set of localized date/time patterns for locale kln.\n */\ngoog.i18n.DateTimePatterns_kln = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale kln_KE.\n */\ngoog.i18n.DateTimePatterns_kln_KE = goog.i18n.DateTimePatterns_kln;\n\n\n/**\n * Extended set of localized date/time patterns for locale km_KH.\n */\ngoog.i18n.DateTimePatterns_km_KH = goog.i18n.DateTimePatterns_km;\n\n\n/**\n * Extended set of localized date/time patterns for locale kn_IN.\n */\ngoog.i18n.DateTimePatterns_kn_IN = goog.i18n.DateTimePatterns_kn;\n\n\n/**\n * Extended set of localized date/time patterns for locale ko_KP.\n */\ngoog.i18n.DateTimePatterns_ko_KP = goog.i18n.DateTimePatterns_ko;\n\n\n/**\n * Extended set of localized date/time patterns for locale ko_KR.\n */\ngoog.i18n.DateTimePatterns_ko_KR = goog.i18n.DateTimePatterns_ko;\n\n\n/**\n * Extended set of localized date/time patterns for locale kok.\n */\ngoog.i18n.DateTimePatterns_kok = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale kok_IN.\n */\ngoog.i18n.DateTimePatterns_kok_IN = goog.i18n.DateTimePatterns_kok;\n\n\n/**\n * Extended set of localized date/time patterns for locale ks.\n */\ngoog.i18n.DateTimePatterns_ks = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'Gy',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd-MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd-MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ks_IN.\n */\ngoog.i18n.DateTimePatterns_ks_IN = goog.i18n.DateTimePatterns_ks;\n\n\n/**\n * Extended set of localized date/time patterns for locale ksb.\n */\ngoog.i18n.DateTimePatterns_ksb = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ksb_TZ.\n */\ngoog.i18n.DateTimePatterns_ksb_TZ = goog.i18n.DateTimePatterns_ksb;\n\n\n/**\n * Extended set of localized date/time patterns for locale ksf.\n */\ngoog.i18n.DateTimePatterns_ksf = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ksf_CM.\n */\ngoog.i18n.DateTimePatterns_ksf_CM = goog.i18n.DateTimePatterns_ksf;\n\n\n/**\n * Extended set of localized date/time patterns for locale ksh.\n */\ngoog.i18n.DateTimePatterns_ksh = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'Y-MM',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM. y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d. MMM. y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ksh_DE.\n */\ngoog.i18n.DateTimePatterns_ksh_DE = goog.i18n.DateTimePatterns_ksh;\n\n\n/**\n * Extended set of localized date/time patterns for locale ku.\n */\ngoog.i18n.DateTimePatterns_ku = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ku_TR.\n */\ngoog.i18n.DateTimePatterns_ku_TR = goog.i18n.DateTimePatterns_ku;\n\n\n/**\n * Extended set of localized date/time patterns for locale kw.\n */\ngoog.i18n.DateTimePatterns_kw = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale kw_GB.\n */\ngoog.i18n.DateTimePatterns_kw_GB = goog.i18n.DateTimePatterns_kw;\n\n\n/**\n * Extended set of localized date/time patterns for locale ky_KG.\n */\ngoog.i18n.DateTimePatterns_ky_KG = goog.i18n.DateTimePatterns_ky;\n\n\n/**\n * Extended set of localized date/time patterns for locale lag.\n */\ngoog.i18n.DateTimePatterns_lag = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale lag_TZ.\n */\ngoog.i18n.DateTimePatterns_lag_TZ = goog.i18n.DateTimePatterns_lag;\n\n\n/**\n * Extended set of localized date/time patterns for locale lb.\n */\ngoog.i18n.DateTimePatterns_lb = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd.M.',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d. MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale lb_LU.\n */\ngoog.i18n.DateTimePatterns_lb_LU = goog.i18n.DateTimePatterns_lb;\n\n\n/**\n * Extended set of localized date/time patterns for locale lg.\n */\ngoog.i18n.DateTimePatterns_lg = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale lg_UG.\n */\ngoog.i18n.DateTimePatterns_lg_UG = goog.i18n.DateTimePatterns_lg;\n\n\n/**\n * Extended set of localized date/time patterns for locale lkt.\n */\ngoog.i18n.DateTimePatterns_lkt = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale lkt_US.\n */\ngoog.i18n.DateTimePatterns_lkt_US = goog.i18n.DateTimePatterns_lkt;\n\n\n/**\n * Extended set of localized date/time patterns for locale ln_AO.\n */\ngoog.i18n.DateTimePatterns_ln_AO = goog.i18n.DateTimePatterns_ln;\n\n\n/**\n * Extended set of localized date/time patterns for locale ln_CD.\n */\ngoog.i18n.DateTimePatterns_ln_CD = goog.i18n.DateTimePatterns_ln;\n\n\n/**\n * Extended set of localized date/time patterns for locale ln_CF.\n */\ngoog.i18n.DateTimePatterns_ln_CF = goog.i18n.DateTimePatterns_ln;\n\n\n/**\n * Extended set of localized date/time patterns for locale ln_CG.\n */\ngoog.i18n.DateTimePatterns_ln_CG = goog.i18n.DateTimePatterns_ln;\n\n\n/**\n * Extended set of localized date/time patterns for locale lo_LA.\n */\ngoog.i18n.DateTimePatterns_lo_LA = goog.i18n.DateTimePatterns_lo;\n\n\n/**\n * Extended set of localized date/time patterns for locale lrc.\n */\ngoog.i18n.DateTimePatterns_lrc = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale lrc_IQ.\n */\ngoog.i18n.DateTimePatterns_lrc_IQ = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale lrc_IR.\n */\ngoog.i18n.DateTimePatterns_lrc_IR = goog.i18n.DateTimePatterns_lrc;\n\n\n/**\n * Extended set of localized date/time patterns for locale lt_LT.\n */\ngoog.i18n.DateTimePatterns_lt_LT = goog.i18n.DateTimePatterns_lt;\n\n\n/**\n * Extended set of localized date/time patterns for locale lu.\n */\ngoog.i18n.DateTimePatterns_lu = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale lu_CD.\n */\ngoog.i18n.DateTimePatterns_lu_CD = goog.i18n.DateTimePatterns_lu;\n\n\n/**\n * Extended set of localized date/time patterns for locale luo.\n */\ngoog.i18n.DateTimePatterns_luo = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale luo_KE.\n */\ngoog.i18n.DateTimePatterns_luo_KE = goog.i18n.DateTimePatterns_luo;\n\n\n/**\n * Extended set of localized date/time patterns for locale luy.\n */\ngoog.i18n.DateTimePatterns_luy = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale luy_KE.\n */\ngoog.i18n.DateTimePatterns_luy_KE = goog.i18n.DateTimePatterns_luy;\n\n\n/**\n * Extended set of localized date/time patterns for locale lv_LV.\n */\ngoog.i18n.DateTimePatterns_lv_LV = goog.i18n.DateTimePatterns_lv;\n\n\n/**\n * Extended set of localized date/time patterns for locale mas.\n */\ngoog.i18n.DateTimePatterns_mas = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale mas_KE.\n */\ngoog.i18n.DateTimePatterns_mas_KE = goog.i18n.DateTimePatterns_mas;\n\n\n/**\n * Extended set of localized date/time patterns for locale mas_TZ.\n */\ngoog.i18n.DateTimePatterns_mas_TZ = goog.i18n.DateTimePatterns_mas;\n\n\n/**\n * Extended set of localized date/time patterns for locale mer.\n */\ngoog.i18n.DateTimePatterns_mer = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale mer_KE.\n */\ngoog.i18n.DateTimePatterns_mer_KE = goog.i18n.DateTimePatterns_mer;\n\n\n/**\n * Extended set of localized date/time patterns for locale mfe.\n */\ngoog.i18n.DateTimePatterns_mfe = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale mfe_MU.\n */\ngoog.i18n.DateTimePatterns_mfe_MU = goog.i18n.DateTimePatterns_mfe;\n\n\n/**\n * Extended set of localized date/time patterns for locale mg.\n */\ngoog.i18n.DateTimePatterns_mg = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale mg_MG.\n */\ngoog.i18n.DateTimePatterns_mg_MG = goog.i18n.DateTimePatterns_mg;\n\n\n/**\n * Extended set of localized date/time patterns for locale mgh.\n */\ngoog.i18n.DateTimePatterns_mgh = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale mgh_MZ.\n */\ngoog.i18n.DateTimePatterns_mgh_MZ = goog.i18n.DateTimePatterns_mgh;\n\n\n/**\n * Extended set of localized date/time patterns for locale mgo.\n */\ngoog.i18n.DateTimePatterns_mgo = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale mgo_CM.\n */\ngoog.i18n.DateTimePatterns_mgo_CM = goog.i18n.DateTimePatterns_mgo;\n\n\n/**\n * Extended set of localized date/time patterns for locale mi.\n */\ngoog.i18n.DateTimePatterns_mi = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale mi_NZ.\n */\ngoog.i18n.DateTimePatterns_mi_NZ = goog.i18n.DateTimePatterns_mi;\n\n\n/**\n * Extended set of localized date/time patterns for locale mk_MK.\n */\ngoog.i18n.DateTimePatterns_mk_MK = goog.i18n.DateTimePatterns_mk;\n\n\n/**\n * Extended set of localized date/time patterns for locale ml_IN.\n */\ngoog.i18n.DateTimePatterns_ml_IN = goog.i18n.DateTimePatterns_ml;\n\n\n/**\n * Extended set of localized date/time patterns for locale mn_MN.\n */\ngoog.i18n.DateTimePatterns_mn_MN = goog.i18n.DateTimePatterns_mn;\n\n\n/**\n * Extended set of localized date/time patterns for locale mr_IN.\n */\ngoog.i18n.DateTimePatterns_mr_IN = goog.i18n.DateTimePatterns_mr;\n\n\n/**\n * Extended set of localized date/time patterns for locale ms_BN.\n */\ngoog.i18n.DateTimePatterns_ms_BN = goog.i18n.DateTimePatterns_ms;\n\n\n/**\n * Extended set of localized date/time patterns for locale ms_MY.\n */\ngoog.i18n.DateTimePatterns_ms_MY = goog.i18n.DateTimePatterns_ms;\n\n\n/**\n * Extended set of localized date/time patterns for locale ms_SG.\n */\ngoog.i18n.DateTimePatterns_ms_SG = goog.i18n.DateTimePatterns_ms;\n\n\n/**\n * Extended set of localized date/time patterns for locale mt_MT.\n */\ngoog.i18n.DateTimePatterns_mt_MT = goog.i18n.DateTimePatterns_mt;\n\n\n/**\n * Extended set of localized date/time patterns for locale mua.\n */\ngoog.i18n.DateTimePatterns_mua = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale mua_CM.\n */\ngoog.i18n.DateTimePatterns_mua_CM = goog.i18n.DateTimePatterns_mua;\n\n\n/**\n * Extended set of localized date/time patterns for locale my_MM.\n */\ngoog.i18n.DateTimePatterns_my_MM = goog.i18n.DateTimePatterns_my;\n\n\n/**\n * Extended set of localized date/time patterns for locale mzn.\n */\ngoog.i18n.DateTimePatterns_mzn = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale mzn_IR.\n */\ngoog.i18n.DateTimePatterns_mzn_IR = goog.i18n.DateTimePatterns_mzn;\n\n\n/**\n * Extended set of localized date/time patterns for locale naq.\n */\ngoog.i18n.DateTimePatterns_naq = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale naq_NA.\n */\ngoog.i18n.DateTimePatterns_naq_NA = goog.i18n.DateTimePatterns_naq;\n\n\n/**\n * Extended set of localized date/time patterns for locale nb_NO.\n */\ngoog.i18n.DateTimePatterns_nb_NO = goog.i18n.DateTimePatterns_nb;\n\n\n/**\n * Extended set of localized date/time patterns for locale nb_SJ.\n */\ngoog.i18n.DateTimePatterns_nb_SJ = goog.i18n.DateTimePatterns_nb;\n\n\n/**\n * Extended set of localized date/time patterns for locale nd.\n */\ngoog.i18n.DateTimePatterns_nd = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale nd_ZW.\n */\ngoog.i18n.DateTimePatterns_nd_ZW = goog.i18n.DateTimePatterns_nd;\n\n\n/**\n * Extended set of localized date/time patterns for locale nds.\n */\ngoog.i18n.DateTimePatterns_nds = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale nds_DE.\n */\ngoog.i18n.DateTimePatterns_nds_DE = goog.i18n.DateTimePatterns_nds;\n\n\n/**\n * Extended set of localized date/time patterns for locale nds_NL.\n */\ngoog.i18n.DateTimePatterns_nds_NL = goog.i18n.DateTimePatterns_nds;\n\n\n/**\n * Extended set of localized date/time patterns for locale ne_IN.\n */\ngoog.i18n.DateTimePatterns_ne_IN = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ne_NP.\n */\ngoog.i18n.DateTimePatterns_ne_NP = goog.i18n.DateTimePatterns_ne;\n\n\n/**\n * Extended set of localized date/time patterns for locale nl_AW.\n */\ngoog.i18n.DateTimePatterns_nl_AW = goog.i18n.DateTimePatterns_nl;\n\n\n/**\n * Extended set of localized date/time patterns for locale nl_BE.\n */\ngoog.i18n.DateTimePatterns_nl_BE = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale nl_BQ.\n */\ngoog.i18n.DateTimePatterns_nl_BQ = goog.i18n.DateTimePatterns_nl;\n\n\n/**\n * Extended set of localized date/time patterns for locale nl_CW.\n */\ngoog.i18n.DateTimePatterns_nl_CW = goog.i18n.DateTimePatterns_nl;\n\n\n/**\n * Extended set of localized date/time patterns for locale nl_NL.\n */\ngoog.i18n.DateTimePatterns_nl_NL = goog.i18n.DateTimePatterns_nl;\n\n\n/**\n * Extended set of localized date/time patterns for locale nl_SR.\n */\ngoog.i18n.DateTimePatterns_nl_SR = goog.i18n.DateTimePatterns_nl;\n\n\n/**\n * Extended set of localized date/time patterns for locale nl_SX.\n */\ngoog.i18n.DateTimePatterns_nl_SX = goog.i18n.DateTimePatterns_nl;\n\n\n/**\n * Extended set of localized date/time patterns for locale nmg.\n */\ngoog.i18n.DateTimePatterns_nmg = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale nmg_CM.\n */\ngoog.i18n.DateTimePatterns_nmg_CM = goog.i18n.DateTimePatterns_nmg;\n\n\n/**\n * Extended set of localized date/time patterns for locale nn.\n */\ngoog.i18n.DateTimePatterns_nn = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd.M.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d. MMM y',\n  DAY_ABBR: 'd.',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale nn_NO.\n */\ngoog.i18n.DateTimePatterns_nn_NO = goog.i18n.DateTimePatterns_nn;\n\n\n/**\n * Extended set of localized date/time patterns for locale nnh.\n */\ngoog.i18n.DateTimePatterns_nnh = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: '\\'lyɛ\\'̌ʼ d \\'na\\' MMMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE , \\'lyɛ\\'̌ʼ d \\'na\\' MMM, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale nnh_CM.\n */\ngoog.i18n.DateTimePatterns_nnh_CM = goog.i18n.DateTimePatterns_nnh;\n\n\n/**\n * Extended set of localized date/time patterns for locale nus.\n */\ngoog.i18n.DateTimePatterns_nus = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE، d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale nus_SS.\n */\ngoog.i18n.DateTimePatterns_nus_SS = goog.i18n.DateTimePatterns_nus;\n\n\n/**\n * Extended set of localized date/time patterns for locale nyn.\n */\ngoog.i18n.DateTimePatterns_nyn = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale nyn_UG.\n */\ngoog.i18n.DateTimePatterns_nyn_UG = goog.i18n.DateTimePatterns_nyn;\n\n\n/**\n * Extended set of localized date/time patterns for locale om.\n */\ngoog.i18n.DateTimePatterns_om = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale om_ET.\n */\ngoog.i18n.DateTimePatterns_om_ET = goog.i18n.DateTimePatterns_om;\n\n\n/**\n * Extended set of localized date/time patterns for locale om_KE.\n */\ngoog.i18n.DateTimePatterns_om_KE = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale or_IN.\n */\ngoog.i18n.DateTimePatterns_or_IN = goog.i18n.DateTimePatterns_or;\n\n\n/**\n * Extended set of localized date/time patterns for locale os.\n */\ngoog.i18n.DateTimePatterns_os = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'LLL y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'dd.MM',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y \\'аз\\'',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'ccc, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale os_GE.\n */\ngoog.i18n.DateTimePatterns_os_GE = goog.i18n.DateTimePatterns_os;\n\n\n/**\n * Extended set of localized date/time patterns for locale os_RU.\n */\ngoog.i18n.DateTimePatterns_os_RU = goog.i18n.DateTimePatterns_os;\n\n\n/**\n * Extended set of localized date/time patterns for locale pa_Arab.\n */\ngoog.i18n.DateTimePatterns_pa_Arab = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pa_Arab_PK.\n */\ngoog.i18n.DateTimePatterns_pa_Arab_PK = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pa_Guru.\n */\ngoog.i18n.DateTimePatterns_pa_Guru = goog.i18n.DateTimePatterns_pa;\n\n\n/**\n * Extended set of localized date/time patterns for locale pa_Guru_IN.\n */\ngoog.i18n.DateTimePatterns_pa_Guru_IN = goog.i18n.DateTimePatterns_pa;\n\n\n/**\n * Extended set of localized date/time patterns for locale pl_PL.\n */\ngoog.i18n.DateTimePatterns_pl_PL = goog.i18n.DateTimePatterns_pl;\n\n\n/**\n * Extended set of localized date/time patterns for locale ps.\n */\ngoog.i18n.DateTimePatterns_ps = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ps_AF.\n */\ngoog.i18n.DateTimePatterns_ps_AF = goog.i18n.DateTimePatterns_ps;\n\n\n/**\n * Extended set of localized date/time patterns for locale ps_PK.\n */\ngoog.i18n.DateTimePatterns_ps_PK = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pt_AO.\n */\ngoog.i18n.DateTimePatterns_pt_AO = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MM/y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd/MM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd/MM/y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d/MM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d/MM/y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd/MM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pt_CH.\n */\ngoog.i18n.DateTimePatterns_pt_CH = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MM/y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd/MM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd/MM/y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d/MM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d/MM/y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd/MM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pt_CV.\n */\ngoog.i18n.DateTimePatterns_pt_CV = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MM/y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd/MM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd/MM/y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d/MM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d/MM/y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd/MM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pt_GQ.\n */\ngoog.i18n.DateTimePatterns_pt_GQ = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MM/y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd/MM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd/MM/y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d/MM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d/MM/y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd/MM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pt_GW.\n */\ngoog.i18n.DateTimePatterns_pt_GW = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MM/y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd/MM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd/MM/y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d/MM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d/MM/y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd/MM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pt_LU.\n */\ngoog.i18n.DateTimePatterns_pt_LU = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MM/y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd/MM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd/MM/y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d/MM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d/MM/y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd/MM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pt_MO.\n */\ngoog.i18n.DateTimePatterns_pt_MO = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MM/y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd/MM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd/MM/y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d/MM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d/MM/y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd/MM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pt_MZ.\n */\ngoog.i18n.DateTimePatterns_pt_MZ = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MM/y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd/MM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd/MM/y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d/MM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d/MM/y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd/MM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pt_ST.\n */\ngoog.i18n.DateTimePatterns_pt_ST = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MM/y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd/MM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd/MM/y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d/MM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d/MM/y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd/MM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale pt_TL.\n */\ngoog.i18n.DateTimePatterns_pt_TL = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MM/y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd/MM',\n  MONTH_DAY_FULL: 'dd \\'de\\' MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd \\'de\\' MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd/MM/y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d/MM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d/MM/y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd/MM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale qu.\n */\ngoog.i18n.DateTimePatterns_qu = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale qu_BO.\n */\ngoog.i18n.DateTimePatterns_qu_BO = goog.i18n.DateTimePatterns_qu;\n\n\n/**\n * Extended set of localized date/time patterns for locale qu_EC.\n */\ngoog.i18n.DateTimePatterns_qu_EC = goog.i18n.DateTimePatterns_qu;\n\n\n/**\n * Extended set of localized date/time patterns for locale qu_PE.\n */\ngoog.i18n.DateTimePatterns_qu_PE = goog.i18n.DateTimePatterns_qu;\n\n\n/**\n * Extended set of localized date/time patterns for locale rm.\n */\ngoog.i18n.DateTimePatterns_rm = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'dd. MMMM',\n  MONTH_DAY_SHORT: 'd.M.',\n  MONTH_DAY_MEDIUM: 'd. MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale rm_CH.\n */\ngoog.i18n.DateTimePatterns_rm_CH = goog.i18n.DateTimePatterns_rm;\n\n\n/**\n * Extended set of localized date/time patterns for locale rn.\n */\ngoog.i18n.DateTimePatterns_rn = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale rn_BI.\n */\ngoog.i18n.DateTimePatterns_rn_BI = goog.i18n.DateTimePatterns_rn;\n\n\n/**\n * Extended set of localized date/time patterns for locale ro_MD.\n */\ngoog.i18n.DateTimePatterns_ro_MD = goog.i18n.DateTimePatterns_ro;\n\n\n/**\n * Extended set of localized date/time patterns for locale ro_RO.\n */\ngoog.i18n.DateTimePatterns_ro_RO = goog.i18n.DateTimePatterns_ro;\n\n\n/**\n * Extended set of localized date/time patterns for locale rof.\n */\ngoog.i18n.DateTimePatterns_rof = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale rof_TZ.\n */\ngoog.i18n.DateTimePatterns_rof_TZ = goog.i18n.DateTimePatterns_rof;\n\n\n/**\n * Extended set of localized date/time patterns for locale ru_BY.\n */\ngoog.i18n.DateTimePatterns_ru_BY = goog.i18n.DateTimePatterns_ru;\n\n\n/**\n * Extended set of localized date/time patterns for locale ru_KG.\n */\ngoog.i18n.DateTimePatterns_ru_KG = goog.i18n.DateTimePatterns_ru;\n\n\n/**\n * Extended set of localized date/time patterns for locale ru_KZ.\n */\ngoog.i18n.DateTimePatterns_ru_KZ = goog.i18n.DateTimePatterns_ru;\n\n\n/**\n * Extended set of localized date/time patterns for locale ru_MD.\n */\ngoog.i18n.DateTimePatterns_ru_MD = goog.i18n.DateTimePatterns_ru;\n\n\n/**\n * Extended set of localized date/time patterns for locale ru_RU.\n */\ngoog.i18n.DateTimePatterns_ru_RU = goog.i18n.DateTimePatterns_ru;\n\n\n/**\n * Extended set of localized date/time patterns for locale ru_UA.\n */\ngoog.i18n.DateTimePatterns_ru_UA = goog.i18n.DateTimePatterns_ru;\n\n\n/**\n * Extended set of localized date/time patterns for locale rw.\n */\ngoog.i18n.DateTimePatterns_rw = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale rw_RW.\n */\ngoog.i18n.DateTimePatterns_rw_RW = goog.i18n.DateTimePatterns_rw;\n\n\n/**\n * Extended set of localized date/time patterns for locale rwk.\n */\ngoog.i18n.DateTimePatterns_rwk = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale rwk_TZ.\n */\ngoog.i18n.DateTimePatterns_rwk_TZ = goog.i18n.DateTimePatterns_rwk;\n\n\n/**\n * Extended set of localized date/time patterns for locale sah.\n */\ngoog.i18n.DateTimePatterns_sah = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y \\'с\\'. G',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale sah_RU.\n */\ngoog.i18n.DateTimePatterns_sah_RU = goog.i18n.DateTimePatterns_sah;\n\n\n/**\n * Extended set of localized date/time patterns for locale saq.\n */\ngoog.i18n.DateTimePatterns_saq = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale saq_KE.\n */\ngoog.i18n.DateTimePatterns_saq_KE = goog.i18n.DateTimePatterns_saq;\n\n\n/**\n * Extended set of localized date/time patterns for locale sbp.\n */\ngoog.i18n.DateTimePatterns_sbp = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale sbp_TZ.\n */\ngoog.i18n.DateTimePatterns_sbp_TZ = goog.i18n.DateTimePatterns_sbp;\n\n\n/**\n * Extended set of localized date/time patterns for locale sd.\n */\ngoog.i18n.DateTimePatterns_sd = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale sd_PK.\n */\ngoog.i18n.DateTimePatterns_sd_PK = goog.i18n.DateTimePatterns_sd;\n\n\n/**\n * Extended set of localized date/time patterns for locale se.\n */\ngoog.i18n.DateTimePatterns_se = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale se_FI.\n */\ngoog.i18n.DateTimePatterns_se_FI = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale se_NO.\n */\ngoog.i18n.DateTimePatterns_se_NO = goog.i18n.DateTimePatterns_se;\n\n\n/**\n * Extended set of localized date/time patterns for locale se_SE.\n */\ngoog.i18n.DateTimePatterns_se_SE = goog.i18n.DateTimePatterns_se;\n\n\n/**\n * Extended set of localized date/time patterns for locale seh.\n */\ngoog.i18n.DateTimePatterns_seh = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM \\'de\\' y',\n  YEAR_MONTH_FULL: 'MMMM \\'de\\' y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd \\'de\\' MMM \\'de\\' y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d \\'de\\' MMM \\'de\\' y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale seh_MZ.\n */\ngoog.i18n.DateTimePatterns_seh_MZ = goog.i18n.DateTimePatterns_seh;\n\n\n/**\n * Extended set of localized date/time patterns for locale ses.\n */\ngoog.i18n.DateTimePatterns_ses = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ses_ML.\n */\ngoog.i18n.DateTimePatterns_ses_ML = goog.i18n.DateTimePatterns_ses;\n\n\n/**\n * Extended set of localized date/time patterns for locale sg.\n */\ngoog.i18n.DateTimePatterns_sg = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale sg_CF.\n */\ngoog.i18n.DateTimePatterns_sg_CF = goog.i18n.DateTimePatterns_sg;\n\n\n/**\n * Extended set of localized date/time patterns for locale shi.\n */\ngoog.i18n.DateTimePatterns_shi = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale shi_Latn.\n */\ngoog.i18n.DateTimePatterns_shi_Latn = goog.i18n.DateTimePatterns_shi;\n\n\n/**\n * Extended set of localized date/time patterns for locale shi_Latn_MA.\n */\ngoog.i18n.DateTimePatterns_shi_Latn_MA = goog.i18n.DateTimePatterns_shi;\n\n\n/**\n * Extended set of localized date/time patterns for locale shi_Tfng.\n */\ngoog.i18n.DateTimePatterns_shi_Tfng = goog.i18n.DateTimePatterns_shi;\n\n\n/**\n * Extended set of localized date/time patterns for locale shi_Tfng_MA.\n */\ngoog.i18n.DateTimePatterns_shi_Tfng_MA = goog.i18n.DateTimePatterns_shi;\n\n\n/**\n * Extended set of localized date/time patterns for locale si_LK.\n */\ngoog.i18n.DateTimePatterns_si_LK = goog.i18n.DateTimePatterns_si;\n\n\n/**\n * Extended set of localized date/time patterns for locale sk_SK.\n */\ngoog.i18n.DateTimePatterns_sk_SK = goog.i18n.DateTimePatterns_sk;\n\n\n/**\n * Extended set of localized date/time patterns for locale sl_SI.\n */\ngoog.i18n.DateTimePatterns_sl_SI = goog.i18n.DateTimePatterns_sl;\n\n\n/**\n * Extended set of localized date/time patterns for locale smn.\n */\ngoog.i18n.DateTimePatterns_smn = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'LLL y',\n  YEAR_MONTH_FULL: 'LLLL y',\n  YEAR_MONTH_SHORT: 'LL.y',\n  MONTH_DAY_ABBR: 'MMM d.',\n  MONTH_DAY_FULL: 'MMMM dd.',\n  MONTH_DAY_SHORT: 'd.M.',\n  MONTH_DAY_MEDIUM: 'MMMM d.',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d. y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d.',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'ccc, MMM d. y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d. \\'tme\\' H.mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale smn_FI.\n */\ngoog.i18n.DateTimePatterns_smn_FI = goog.i18n.DateTimePatterns_smn;\n\n\n/**\n * Extended set of localized date/time patterns for locale sn.\n */\ngoog.i18n.DateTimePatterns_sn = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale sn_ZW.\n */\ngoog.i18n.DateTimePatterns_sn_ZW = goog.i18n.DateTimePatterns_sn;\n\n\n/**\n * Extended set of localized date/time patterns for locale so.\n */\ngoog.i18n.DateTimePatterns_so = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale so_DJ.\n */\ngoog.i18n.DateTimePatterns_so_DJ = goog.i18n.DateTimePatterns_so;\n\n\n/**\n * Extended set of localized date/time patterns for locale so_ET.\n */\ngoog.i18n.DateTimePatterns_so_ET = goog.i18n.DateTimePatterns_so;\n\n\n/**\n * Extended set of localized date/time patterns for locale so_KE.\n */\ngoog.i18n.DateTimePatterns_so_KE = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale so_SO.\n */\ngoog.i18n.DateTimePatterns_so_SO = goog.i18n.DateTimePatterns_so;\n\n\n/**\n * Extended set of localized date/time patterns for locale sq_AL.\n */\ngoog.i18n.DateTimePatterns_sq_AL = goog.i18n.DateTimePatterns_sq;\n\n\n/**\n * Extended set of localized date/time patterns for locale sq_MK.\n */\ngoog.i18n.DateTimePatterns_sq_MK = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd.M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm, zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale sq_XK.\n */\ngoog.i18n.DateTimePatterns_sq_XK = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd.M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm, zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale sr_Cyrl.\n */\ngoog.i18n.DateTimePatterns_sr_Cyrl = goog.i18n.DateTimePatterns_sr;\n\n\n/**\n * Extended set of localized date/time patterns for locale sr_Cyrl_BA.\n */\ngoog.i18n.DateTimePatterns_sr_Cyrl_BA = goog.i18n.DateTimePatterns_sr;\n\n\n/**\n * Extended set of localized date/time patterns for locale sr_Cyrl_ME.\n */\ngoog.i18n.DateTimePatterns_sr_Cyrl_ME = goog.i18n.DateTimePatterns_sr;\n\n\n/**\n * Extended set of localized date/time patterns for locale sr_Cyrl_RS.\n */\ngoog.i18n.DateTimePatterns_sr_Cyrl_RS = goog.i18n.DateTimePatterns_sr;\n\n\n/**\n * Extended set of localized date/time patterns for locale sr_Cyrl_XK.\n */\ngoog.i18n.DateTimePatterns_sr_Cyrl_XK = goog.i18n.DateTimePatterns_sr;\n\n\n/**\n * Extended set of localized date/time patterns for locale sr_Latn_BA.\n */\ngoog.i18n.DateTimePatterns_sr_Latn_BA = goog.i18n.DateTimePatterns_sr;\n\n\n/**\n * Extended set of localized date/time patterns for locale sr_Latn_ME.\n */\ngoog.i18n.DateTimePatterns_sr_Latn_ME = goog.i18n.DateTimePatterns_sr;\n\n\n/**\n * Extended set of localized date/time patterns for locale sr_Latn_RS.\n */\ngoog.i18n.DateTimePatterns_sr_Latn_RS = goog.i18n.DateTimePatterns_sr;\n\n\n/**\n * Extended set of localized date/time patterns for locale sr_Latn_XK.\n */\ngoog.i18n.DateTimePatterns_sr_Latn_XK = goog.i18n.DateTimePatterns_sr;\n\n\n/**\n * Extended set of localized date/time patterns for locale sv_AX.\n */\ngoog.i18n.DateTimePatterns_sv_AX = goog.i18n.DateTimePatterns_sv;\n\n\n/**\n * Extended set of localized date/time patterns for locale sv_FI.\n */\ngoog.i18n.DateTimePatterns_sv_FI = goog.i18n.DateTimePatterns_sv;\n\n\n/**\n * Extended set of localized date/time patterns for locale sv_SE.\n */\ngoog.i18n.DateTimePatterns_sv_SE = goog.i18n.DateTimePatterns_sv;\n\n\n/**\n * Extended set of localized date/time patterns for locale sw_CD.\n */\ngoog.i18n.DateTimePatterns_sw_CD = goog.i18n.DateTimePatterns_sw;\n\n\n/**\n * Extended set of localized date/time patterns for locale sw_KE.\n */\ngoog.i18n.DateTimePatterns_sw_KE = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale sw_TZ.\n */\ngoog.i18n.DateTimePatterns_sw_TZ = goog.i18n.DateTimePatterns_sw;\n\n\n/**\n * Extended set of localized date/time patterns for locale sw_UG.\n */\ngoog.i18n.DateTimePatterns_sw_UG = goog.i18n.DateTimePatterns_sw;\n\n\n/**\n * Extended set of localized date/time patterns for locale ta_IN.\n */\ngoog.i18n.DateTimePatterns_ta_IN = goog.i18n.DateTimePatterns_ta;\n\n\n/**\n * Extended set of localized date/time patterns for locale ta_LK.\n */\ngoog.i18n.DateTimePatterns_ta_LK = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ta_MY.\n */\ngoog.i18n.DateTimePatterns_ta_MY = goog.i18n.DateTimePatterns_ta;\n\n\n/**\n * Extended set of localized date/time patterns for locale ta_SG.\n */\ngoog.i18n.DateTimePatterns_ta_SG = goog.i18n.DateTimePatterns_ta;\n\n\n/**\n * Extended set of localized date/time patterns for locale te_IN.\n */\ngoog.i18n.DateTimePatterns_te_IN = goog.i18n.DateTimePatterns_te;\n\n\n/**\n * Extended set of localized date/time patterns for locale teo.\n */\ngoog.i18n.DateTimePatterns_teo = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale teo_KE.\n */\ngoog.i18n.DateTimePatterns_teo_KE = goog.i18n.DateTimePatterns_teo;\n\n\n/**\n * Extended set of localized date/time patterns for locale teo_UG.\n */\ngoog.i18n.DateTimePatterns_teo_UG = goog.i18n.DateTimePatterns_teo;\n\n\n/**\n * Extended set of localized date/time patterns for locale tg.\n */\ngoog.i18n.DateTimePatterns_tg = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd-MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale tg_TJ.\n */\ngoog.i18n.DateTimePatterns_tg_TJ = goog.i18n.DateTimePatterns_tg;\n\n\n/**\n * Extended set of localized date/time patterns for locale th_TH.\n */\ngoog.i18n.DateTimePatterns_th_TH = goog.i18n.DateTimePatterns_th;\n\n\n/**\n * Extended set of localized date/time patterns for locale ti.\n */\ngoog.i18n.DateTimePatterns_ti = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ti_ER.\n */\ngoog.i18n.DateTimePatterns_ti_ER = goog.i18n.DateTimePatterns_ti;\n\n\n/**\n * Extended set of localized date/time patterns for locale ti_ET.\n */\ngoog.i18n.DateTimePatterns_ti_ET = goog.i18n.DateTimePatterns_ti;\n\n\n/**\n * Extended set of localized date/time patterns for locale tk.\n */\ngoog.i18n.DateTimePatterns_tk = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd.MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'd MMM EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'd MMM y EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale tk_TM.\n */\ngoog.i18n.DateTimePatterns_tk_TM = goog.i18n.DateTimePatterns_tk;\n\n\n/**\n * Extended set of localized date/time patterns for locale to.\n */\ngoog.i18n.DateTimePatterns_to = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale to_TO.\n */\ngoog.i18n.DateTimePatterns_to_TO = goog.i18n.DateTimePatterns_to;\n\n\n/**\n * Extended set of localized date/time patterns for locale tr_CY.\n */\ngoog.i18n.DateTimePatterns_tr_CY = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'd MMMM EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'd MMM y EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM a h:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale tr_TR.\n */\ngoog.i18n.DateTimePatterns_tr_TR = goog.i18n.DateTimePatterns_tr;\n\n\n/**\n * Extended set of localized date/time patterns for locale tt.\n */\ngoog.i18n.DateTimePatterns_tt = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y \\'ел\\'',\n  YEAR_MONTH_ABBR: 'MMM, y \\'ел\\'',\n  YEAR_MONTH_FULL: 'MMMM, y \\'ел\\'',\n  YEAR_MONTH_SHORT: 'MM.y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd.MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y \\'ел\\'',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM, y \\'ел\\'',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale tt_RU.\n */\ngoog.i18n.DateTimePatterns_tt_RU = goog.i18n.DateTimePatterns_tt;\n\n\n/**\n * Extended set of localized date/time patterns for locale twq.\n */\ngoog.i18n.DateTimePatterns_twq = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale twq_NE.\n */\ngoog.i18n.DateTimePatterns_twq_NE = goog.i18n.DateTimePatterns_twq;\n\n\n/**\n * Extended set of localized date/time patterns for locale tzm.\n */\ngoog.i18n.DateTimePatterns_tzm = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale tzm_MA.\n */\ngoog.i18n.DateTimePatterns_tzm_MA = goog.i18n.DateTimePatterns_tzm;\n\n\n/**\n * Extended set of localized date/time patterns for locale ug.\n */\ngoog.i18n.DateTimePatterns_ug = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd-MMM',\n  MONTH_DAY_FULL: 'dd-MMMM',\n  MONTH_DAY_SHORT: 'd-M',\n  MONTH_DAY_MEDIUM: 'd-MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'y d-MMM',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'd-MMM، EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y d-MMM، EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd-MMM، h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale ug_CN.\n */\ngoog.i18n.DateTimePatterns_ug_CN = goog.i18n.DateTimePatterns_ug;\n\n\n/**\n * Extended set of localized date/time patterns for locale uk_UA.\n */\ngoog.i18n.DateTimePatterns_uk_UA = goog.i18n.DateTimePatterns_uk;\n\n\n/**\n * Extended set of localized date/time patterns for locale ur_IN.\n */\ngoog.i18n.DateTimePatterns_ur_IN = goog.i18n.DateTimePatterns_ur;\n\n\n/**\n * Extended set of localized date/time patterns for locale ur_PK.\n */\ngoog.i18n.DateTimePatterns_ur_PK = goog.i18n.DateTimePatterns_ur;\n\n\n/**\n * Extended set of localized date/time patterns for locale uz_Arab.\n */\ngoog.i18n.DateTimePatterns_uz_Arab = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale uz_Arab_AF.\n */\ngoog.i18n.DateTimePatterns_uz_Arab_AF = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale uz_Cyrl.\n */\ngoog.i18n.DateTimePatterns_uz_Cyrl = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM, y',\n  YEAR_MONTH_FULL: 'MMMM, y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d-MMM, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm (zzzz)'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale uz_Cyrl_UZ.\n */\ngoog.i18n.DateTimePatterns_uz_Cyrl_UZ = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM, y',\n  YEAR_MONTH_FULL: 'MMMM, y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd/MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM, y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d-MMM, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm (zzzz)'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale uz_Latn.\n */\ngoog.i18n.DateTimePatterns_uz_Latn = goog.i18n.DateTimePatterns_uz;\n\n\n/**\n * Extended set of localized date/time patterns for locale uz_Latn_UZ.\n */\ngoog.i18n.DateTimePatterns_uz_Latn_UZ = goog.i18n.DateTimePatterns_uz;\n\n\n/**\n * Extended set of localized date/time patterns for locale vai.\n */\ngoog.i18n.DateTimePatterns_vai = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale vai_Latn.\n */\ngoog.i18n.DateTimePatterns_vai_Latn = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale vai_Latn_LR.\n */\ngoog.i18n.DateTimePatterns_vai_Latn_LR = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'MMM d y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d h:mm a zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale vai_Vaii.\n */\ngoog.i18n.DateTimePatterns_vai_Vaii = goog.i18n.DateTimePatterns_vai;\n\n\n/**\n * Extended set of localized date/time patterns for locale vai_Vaii_LR.\n */\ngoog.i18n.DateTimePatterns_vai_Vaii_LR = goog.i18n.DateTimePatterns_vai;\n\n\n/**\n * Extended set of localized date/time patterns for locale vi_VN.\n */\ngoog.i18n.DateTimePatterns_vi_VN = goog.i18n.DateTimePatterns_vi;\n\n\n/**\n * Extended set of localized date/time patterns for locale vun.\n */\ngoog.i18n.DateTimePatterns_vun = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale vun_TZ.\n */\ngoog.i18n.DateTimePatterns_vun_TZ = goog.i18n.DateTimePatterns_vun;\n\n\n/**\n * Extended set of localized date/time patterns for locale wae.\n */\ngoog.i18n.DateTimePatterns_wae = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'd. MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd. MMM',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd. MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d. MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d. MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd. MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale wae_CH.\n */\ngoog.i18n.DateTimePatterns_wae_CH = goog.i18n.DateTimePatterns_wae;\n\n\n/**\n * Extended set of localized date/time patterns for locale wo.\n */\ngoog.i18n.DateTimePatterns_wo = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'y G',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM-y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'dd-MM',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM - HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale wo_SN.\n */\ngoog.i18n.DateTimePatterns_wo_SN = goog.i18n.DateTimePatterns_wo;\n\n\n/**\n * Extended set of localized date/time patterns for locale xh.\n */\ngoog.i18n.DateTimePatterns_xh = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'y MMM',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'y-MM',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y MMM d, EEE',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale xh_ZA.\n */\ngoog.i18n.DateTimePatterns_xh_ZA = goog.i18n.DateTimePatterns_xh;\n\n\n/**\n * Extended set of localized date/time patterns for locale xog.\n */\ngoog.i18n.DateTimePatterns_xog = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE, MMM d',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, MMM d, y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale xog_UG.\n */\ngoog.i18n.DateTimePatterns_xog_UG = goog.i18n.DateTimePatterns_xog;\n\n\n/**\n * Extended set of localized date/time patterns for locale yav.\n */\ngoog.i18n.DateTimePatterns_yav = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale yav_CM.\n */\ngoog.i18n.DateTimePatterns_yav_CM = goog.i18n.DateTimePatterns_yav;\n\n\n/**\n * Extended set of localized date/time patterns for locale yi.\n */\ngoog.i18n.DateTimePatterns_yi = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'MMM d',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'MM-dd',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'dטן MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'MMM d, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, dטן MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'MMM d, HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale yi_001.\n */\ngoog.i18n.DateTimePatterns_yi_001 = goog.i18n.DateTimePatterns_yi;\n\n\n/**\n * Extended set of localized date/time patterns for locale yo.\n */\ngoog.i18n.DateTimePatterns_yo = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'MMMM y',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'dd MMMM',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'd MMMM',\n  MONTH_DAY_YEAR_MEDIUM: 'd MMM y',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'd MMM, EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE, d MMM , y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale yo_BJ.\n */\ngoog.i18n.DateTimePatterns_yo_BJ = goog.i18n.DateTimePatterns_yo;\n\n\n/**\n * Extended set of localized date/time patterns for locale yo_NG.\n */\ngoog.i18n.DateTimePatterns_yo_NG = goog.i18n.DateTimePatterns_yo;\n\n\n/**\n * Extended set of localized date/time patterns for locale yue.\n */\ngoog.i18n.DateTimePatterns_yue = {\n  YEAR_FULL: 'y年',\n  YEAR_FULL_WITH_ERA: 'Gy年',\n  YEAR_MONTH_ABBR: 'y年M月',\n  YEAR_MONTH_FULL: 'y年M月',\n  YEAR_MONTH_SHORT: 'y/MM',\n  MONTH_DAY_ABBR: 'M月d日',\n  MONTH_DAY_FULL: 'M月dd日',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'M月d日',\n  MONTH_DAY_YEAR_MEDIUM: 'y年M月d日',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'M月d日 EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y年M月d日 EEE',\n  DAY_ABBR: 'd日',\n  MONTH_DAY_TIME_ZONE_SHORT: 'M月d日 ah:mm [zzzz]'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale yue_Hans.\n */\ngoog.i18n.DateTimePatterns_yue_Hans = {\n  YEAR_FULL: 'y年',\n  YEAR_FULL_WITH_ERA: 'Gy年',\n  YEAR_MONTH_ABBR: 'y年M月',\n  YEAR_MONTH_FULL: 'y年M月',\n  YEAR_MONTH_SHORT: 'y年M月',\n  MONTH_DAY_ABBR: 'M月d日',\n  MONTH_DAY_FULL: 'M月dd日',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'M月d日',\n  MONTH_DAY_YEAR_MEDIUM: 'y年M月d日',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'M月d日EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y年M月d日EEE',\n  DAY_ABBR: 'd日',\n  MONTH_DAY_TIME_ZONE_SHORT: 'M月d日 zzzz ah:mm'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale yue_Hans_CN.\n */\ngoog.i18n.DateTimePatterns_yue_Hans_CN = {\n  YEAR_FULL: 'y年',\n  YEAR_FULL_WITH_ERA: 'Gy年',\n  YEAR_MONTH_ABBR: 'y年M月',\n  YEAR_MONTH_FULL: 'y年M月',\n  YEAR_MONTH_SHORT: 'y年M月',\n  MONTH_DAY_ABBR: 'M月d日',\n  MONTH_DAY_FULL: 'M月dd日',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'M月d日',\n  MONTH_DAY_YEAR_MEDIUM: 'y年M月d日',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'M月d日EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y年M月d日EEE',\n  DAY_ABBR: 'd日',\n  MONTH_DAY_TIME_ZONE_SHORT: 'M月d日 zzzz ah:mm'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale yue_Hant.\n */\ngoog.i18n.DateTimePatterns_yue_Hant = goog.i18n.DateTimePatterns_yue;\n\n\n/**\n * Extended set of localized date/time patterns for locale yue_Hant_HK.\n */\ngoog.i18n.DateTimePatterns_yue_Hant_HK = goog.i18n.DateTimePatterns_yue;\n\n\n/**\n * Extended set of localized date/time patterns for locale zgh.\n */\ngoog.i18n.DateTimePatterns_zgh = {\n  YEAR_FULL: 'y',\n  YEAR_FULL_WITH_ERA: 'G y',\n  YEAR_MONTH_ABBR: 'MMM y',\n  YEAR_MONTH_FULL: 'y MMMM',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'd MMM',\n  MONTH_DAY_FULL: 'MMMM dd',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'MMMM d',\n  MONTH_DAY_YEAR_MEDIUM: 'y MMM d',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'EEE d MMM',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'EEE d MMM y',\n  DAY_ABBR: 'd',\n  MONTH_DAY_TIME_ZONE_SHORT: 'd MMM HH:mm zzzz'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale zgh_MA.\n */\ngoog.i18n.DateTimePatterns_zgh_MA = goog.i18n.DateTimePatterns_zgh;\n\n\n/**\n * Extended set of localized date/time patterns for locale zh_Hans.\n */\ngoog.i18n.DateTimePatterns_zh_Hans = goog.i18n.DateTimePatterns_zh;\n\n\n/**\n * Extended set of localized date/time patterns for locale zh_Hans_CN.\n */\ngoog.i18n.DateTimePatterns_zh_Hans_CN = goog.i18n.DateTimePatterns_zh;\n\n\n/**\n * Extended set of localized date/time patterns for locale zh_Hans_HK.\n */\ngoog.i18n.DateTimePatterns_zh_Hans_HK = {\n  YEAR_FULL: 'y年',\n  YEAR_FULL_WITH_ERA: 'Gy年',\n  YEAR_MONTH_ABBR: 'y年M月',\n  YEAR_MONTH_FULL: 'y年M月',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'M月d日',\n  MONTH_DAY_FULL: 'M月d日',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'M月d日',\n  MONTH_DAY_YEAR_MEDIUM: 'y年M月d日',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'M月d日EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y年M月d日EEE',\n  DAY_ABBR: 'd日',\n  MONTH_DAY_TIME_ZONE_SHORT: 'M月d日 zzzz ah:mm'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale zh_Hans_MO.\n */\ngoog.i18n.DateTimePatterns_zh_Hans_MO = {\n  YEAR_FULL: 'y年',\n  YEAR_FULL_WITH_ERA: 'Gy年',\n  YEAR_MONTH_ABBR: 'y年M月',\n  YEAR_MONTH_FULL: 'y年M月',\n  YEAR_MONTH_SHORT: 'y年M月',\n  MONTH_DAY_ABBR: 'M月d日',\n  MONTH_DAY_FULL: 'M月d日',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'M月d日',\n  MONTH_DAY_YEAR_MEDIUM: 'y年M月d日',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'M月d日EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y年M月d日EEE',\n  DAY_ABBR: 'd日',\n  MONTH_DAY_TIME_ZONE_SHORT: 'M月d日 zzzz ah:mm'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale zh_Hans_SG.\n */\ngoog.i18n.DateTimePatterns_zh_Hans_SG = {\n  YEAR_FULL: 'y年',\n  YEAR_FULL_WITH_ERA: 'Gy年',\n  YEAR_MONTH_ABBR: 'y年M月',\n  YEAR_MONTH_FULL: 'y年M月',\n  YEAR_MONTH_SHORT: 'y年M月',\n  MONTH_DAY_ABBR: 'M月d日',\n  MONTH_DAY_FULL: 'M月d日',\n  MONTH_DAY_SHORT: 'M-d',\n  MONTH_DAY_MEDIUM: 'M月d日',\n  MONTH_DAY_YEAR_MEDIUM: 'y年M月d日',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'M月d日EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y年M月d日EEE',\n  DAY_ABBR: 'd日',\n  MONTH_DAY_TIME_ZONE_SHORT: 'M月d日 zzzz ah:mm'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale zh_Hant.\n */\ngoog.i18n.DateTimePatterns_zh_Hant = {\n  YEAR_FULL: 'y年',\n  YEAR_FULL_WITH_ERA: 'Gy年',\n  YEAR_MONTH_ABBR: 'y年M月',\n  YEAR_MONTH_FULL: 'y年M月',\n  YEAR_MONTH_SHORT: 'y/MM',\n  MONTH_DAY_ABBR: 'M月d日',\n  MONTH_DAY_FULL: 'M月dd日',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'M月d日',\n  MONTH_DAY_YEAR_MEDIUM: 'y年M月d日',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'M月d日 EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y年M月d日 EEE',\n  DAY_ABBR: 'd日',\n  MONTH_DAY_TIME_ZONE_SHORT: 'M月d日 ah:mm [zzzz]'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale zh_Hant_HK.\n */\ngoog.i18n.DateTimePatterns_zh_Hant_HK = {\n  YEAR_FULL: 'y年',\n  YEAR_FULL_WITH_ERA: 'Gy年',\n  YEAR_MONTH_ABBR: 'y年M月',\n  YEAR_MONTH_FULL: 'y年M月',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'M月d日',\n  MONTH_DAY_FULL: 'M月dd日',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'M月d日',\n  MONTH_DAY_YEAR_MEDIUM: 'y年M月d日',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'M月d日EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y年M月d日EEE',\n  DAY_ABBR: 'd日',\n  MONTH_DAY_TIME_ZONE_SHORT: 'M月d日 ah:mm [zzzz]'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale zh_Hant_MO.\n */\ngoog.i18n.DateTimePatterns_zh_Hant_MO = {\n  YEAR_FULL: 'y年',\n  YEAR_FULL_WITH_ERA: 'Gy年',\n  YEAR_MONTH_ABBR: 'y年M月',\n  YEAR_MONTH_FULL: 'y年M月',\n  YEAR_MONTH_SHORT: 'MM/y',\n  MONTH_DAY_ABBR: 'M月d日',\n  MONTH_DAY_FULL: 'M月dd日',\n  MONTH_DAY_SHORT: 'd/M',\n  MONTH_DAY_MEDIUM: 'M月d日',\n  MONTH_DAY_YEAR_MEDIUM: 'y年M月d日',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'M月d日EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y年M月d日EEE',\n  DAY_ABBR: 'd日',\n  MONTH_DAY_TIME_ZONE_SHORT: 'M月d日 ah:mm [zzzz]'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale zh_Hant_TW.\n */\ngoog.i18n.DateTimePatterns_zh_Hant_TW = {\n  YEAR_FULL: 'y年',\n  YEAR_FULL_WITH_ERA: 'Gy年',\n  YEAR_MONTH_ABBR: 'y年M月',\n  YEAR_MONTH_FULL: 'y年M月',\n  YEAR_MONTH_SHORT: 'y/MM',\n  MONTH_DAY_ABBR: 'M月d日',\n  MONTH_DAY_FULL: 'M月dd日',\n  MONTH_DAY_SHORT: 'M/d',\n  MONTH_DAY_MEDIUM: 'M月d日',\n  MONTH_DAY_YEAR_MEDIUM: 'y年M月d日',\n  WEEKDAY_MONTH_DAY_MEDIUM: 'M月d日 EEE',\n  WEEKDAY_MONTH_DAY_YEAR_MEDIUM: 'y年M月d日 EEE',\n  DAY_ABBR: 'd日',\n  MONTH_DAY_TIME_ZONE_SHORT: 'M月d日 ah:mm [zzzz]'\n};\n\n\n/**\n * Extended set of localized date/time patterns for locale zu_ZA.\n */\ngoog.i18n.DateTimePatterns_zu_ZA = goog.i18n.DateTimePatterns_zu;\n\n\n/**\n * Select date/time pattern by locale.\n */\nswitch (goog.LOCALE) {\n  case 'af_NA':\n  case 'af-NA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_af_NA;\n    break;\n  case 'af_ZA':\n  case 'af-ZA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_af_ZA;\n    break;\n  case 'agq':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_agq;\n    break;\n  case 'agq_CM':\n  case 'agq-CM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_agq_CM;\n    break;\n  case 'ak':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ak;\n    break;\n  case 'ak_GH':\n  case 'ak-GH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ak_GH;\n    break;\n  case 'am_ET':\n  case 'am-ET':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_am_ET;\n    break;\n  case 'ar_001':\n  case 'ar-001':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_001;\n    break;\n  case 'ar_AE':\n  case 'ar-AE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_AE;\n    break;\n  case 'ar_BH':\n  case 'ar-BH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_BH;\n    break;\n  case 'ar_DJ':\n  case 'ar-DJ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_DJ;\n    break;\n  case 'ar_EH':\n  case 'ar-EH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_EH;\n    break;\n  case 'ar_ER':\n  case 'ar-ER':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_ER;\n    break;\n  case 'ar_IL':\n  case 'ar-IL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_IL;\n    break;\n  case 'ar_IQ':\n  case 'ar-IQ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_IQ;\n    break;\n  case 'ar_JO':\n  case 'ar-JO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_JO;\n    break;\n  case 'ar_KM':\n  case 'ar-KM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_KM;\n    break;\n  case 'ar_KW':\n  case 'ar-KW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_KW;\n    break;\n  case 'ar_LB':\n  case 'ar-LB':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_LB;\n    break;\n  case 'ar_LY':\n  case 'ar-LY':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_LY;\n    break;\n  case 'ar_MA':\n  case 'ar-MA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_MA;\n    break;\n  case 'ar_MR':\n  case 'ar-MR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_MR;\n    break;\n  case 'ar_OM':\n  case 'ar-OM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_OM;\n    break;\n  case 'ar_PS':\n  case 'ar-PS':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_PS;\n    break;\n  case 'ar_QA':\n  case 'ar-QA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_QA;\n    break;\n  case 'ar_SA':\n  case 'ar-SA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_SA;\n    break;\n  case 'ar_SD':\n  case 'ar-SD':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_SD;\n    break;\n  case 'ar_SO':\n  case 'ar-SO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_SO;\n    break;\n  case 'ar_SS':\n  case 'ar-SS':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_SS;\n    break;\n  case 'ar_SY':\n  case 'ar-SY':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_SY;\n    break;\n  case 'ar_TD':\n  case 'ar-TD':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_TD;\n    break;\n  case 'ar_TN':\n  case 'ar-TN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_TN;\n    break;\n  case 'ar_XB':\n  case 'ar-XB':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_XB;\n    break;\n  case 'ar_YE':\n  case 'ar-YE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ar_YE;\n    break;\n  case 'as':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_as;\n    break;\n  case 'as_IN':\n  case 'as-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_as_IN;\n    break;\n  case 'asa':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_asa;\n    break;\n  case 'asa_TZ':\n  case 'asa-TZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_asa_TZ;\n    break;\n  case 'ast':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ast;\n    break;\n  case 'ast_ES':\n  case 'ast-ES':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ast_ES;\n    break;\n  case 'az_Cyrl':\n  case 'az-Cyrl':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_az_Cyrl;\n    break;\n  case 'az_Cyrl_AZ':\n  case 'az-Cyrl-AZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_az_Cyrl_AZ;\n    break;\n  case 'az_Latn':\n  case 'az-Latn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_az_Latn;\n    break;\n  case 'az_Latn_AZ':\n  case 'az-Latn-AZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_az_Latn_AZ;\n    break;\n  case 'bas':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bas;\n    break;\n  case 'bas_CM':\n  case 'bas-CM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bas_CM;\n    break;\n  case 'be_BY':\n  case 'be-BY':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_be_BY;\n    break;\n  case 'bem':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bem;\n    break;\n  case 'bem_ZM':\n  case 'bem-ZM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bem_ZM;\n    break;\n  case 'bez':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bez;\n    break;\n  case 'bez_TZ':\n  case 'bez-TZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bez_TZ;\n    break;\n  case 'bg_BG':\n  case 'bg-BG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bg_BG;\n    break;\n  case 'bm':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bm;\n    break;\n  case 'bm_ML':\n  case 'bm-ML':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bm_ML;\n    break;\n  case 'bn_BD':\n  case 'bn-BD':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bn_BD;\n    break;\n  case 'bn_IN':\n  case 'bn-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bn_IN;\n    break;\n  case 'bo':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bo;\n    break;\n  case 'bo_CN':\n  case 'bo-CN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bo_CN;\n    break;\n  case 'bo_IN':\n  case 'bo-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bo_IN;\n    break;\n  case 'br_FR':\n  case 'br-FR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_br_FR;\n    break;\n  case 'brx':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_brx;\n    break;\n  case 'brx_IN':\n  case 'brx-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_brx_IN;\n    break;\n  case 'bs_Cyrl':\n  case 'bs-Cyrl':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bs_Cyrl;\n    break;\n  case 'bs_Cyrl_BA':\n  case 'bs-Cyrl-BA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bs_Cyrl_BA;\n    break;\n  case 'bs_Latn':\n  case 'bs-Latn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bs_Latn;\n    break;\n  case 'bs_Latn_BA':\n  case 'bs-Latn-BA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_bs_Latn_BA;\n    break;\n  case 'ca_AD':\n  case 'ca-AD':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ca_AD;\n    break;\n  case 'ca_ES':\n  case 'ca-ES':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ca_ES;\n    break;\n  case 'ca_FR':\n  case 'ca-FR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ca_FR;\n    break;\n  case 'ca_IT':\n  case 'ca-IT':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ca_IT;\n    break;\n  case 'ccp':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ccp;\n    break;\n  case 'ccp_BD':\n  case 'ccp-BD':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ccp_BD;\n    break;\n  case 'ccp_IN':\n  case 'ccp-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ccp_IN;\n    break;\n  case 'ce':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ce;\n    break;\n  case 'ce_RU':\n  case 'ce-RU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ce_RU;\n    break;\n  case 'ceb':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ceb;\n    break;\n  case 'ceb_PH':\n  case 'ceb-PH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ceb_PH;\n    break;\n  case 'cgg':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_cgg;\n    break;\n  case 'cgg_UG':\n  case 'cgg-UG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_cgg_UG;\n    break;\n  case 'chr_US':\n  case 'chr-US':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_chr_US;\n    break;\n  case 'ckb':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ckb;\n    break;\n  case 'ckb_IQ':\n  case 'ckb-IQ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ckb_IQ;\n    break;\n  case 'ckb_IR':\n  case 'ckb-IR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ckb_IR;\n    break;\n  case 'cs_CZ':\n  case 'cs-CZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_cs_CZ;\n    break;\n  case 'cy_GB':\n  case 'cy-GB':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_cy_GB;\n    break;\n  case 'da_DK':\n  case 'da-DK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_da_DK;\n    break;\n  case 'da_GL':\n  case 'da-GL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_da_GL;\n    break;\n  case 'dav':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_dav;\n    break;\n  case 'dav_KE':\n  case 'dav-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_dav_KE;\n    break;\n  case 'de_BE':\n  case 'de-BE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_de_BE;\n    break;\n  case 'de_DE':\n  case 'de-DE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_de_DE;\n    break;\n  case 'de_IT':\n  case 'de-IT':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_de_IT;\n    break;\n  case 'de_LI':\n  case 'de-LI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_de_LI;\n    break;\n  case 'de_LU':\n  case 'de-LU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_de_LU;\n    break;\n  case 'dje':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_dje;\n    break;\n  case 'dje_NE':\n  case 'dje-NE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_dje_NE;\n    break;\n  case 'dsb':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_dsb;\n    break;\n  case 'dsb_DE':\n  case 'dsb-DE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_dsb_DE;\n    break;\n  case 'dua':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_dua;\n    break;\n  case 'dua_CM':\n  case 'dua-CM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_dua_CM;\n    break;\n  case 'dyo':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_dyo;\n    break;\n  case 'dyo_SN':\n  case 'dyo-SN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_dyo_SN;\n    break;\n  case 'dz':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_dz;\n    break;\n  case 'dz_BT':\n  case 'dz-BT':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_dz_BT;\n    break;\n  case 'ebu':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ebu;\n    break;\n  case 'ebu_KE':\n  case 'ebu-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ebu_KE;\n    break;\n  case 'ee':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ee;\n    break;\n  case 'ee_GH':\n  case 'ee-GH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ee_GH;\n    break;\n  case 'ee_TG':\n  case 'ee-TG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ee_TG;\n    break;\n  case 'el_CY':\n  case 'el-CY':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_el_CY;\n    break;\n  case 'el_GR':\n  case 'el-GR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_el_GR;\n    break;\n  case 'en_001':\n  case 'en-001':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_001;\n    break;\n  case 'en_150':\n  case 'en-150':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_150;\n    break;\n  case 'en_AE':\n  case 'en-AE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_AE;\n    break;\n  case 'en_AG':\n  case 'en-AG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_AG;\n    break;\n  case 'en_AI':\n  case 'en-AI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_AI;\n    break;\n  case 'en_AS':\n  case 'en-AS':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_AS;\n    break;\n  case 'en_AT':\n  case 'en-AT':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_AT;\n    break;\n  case 'en_BB':\n  case 'en-BB':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_BB;\n    break;\n  case 'en_BE':\n  case 'en-BE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_BE;\n    break;\n  case 'en_BI':\n  case 'en-BI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_BI;\n    break;\n  case 'en_BM':\n  case 'en-BM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_BM;\n    break;\n  case 'en_BS':\n  case 'en-BS':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_BS;\n    break;\n  case 'en_BW':\n  case 'en-BW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_BW;\n    break;\n  case 'en_BZ':\n  case 'en-BZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_BZ;\n    break;\n  case 'en_CC':\n  case 'en-CC':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_CC;\n    break;\n  case 'en_CH':\n  case 'en-CH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_CH;\n    break;\n  case 'en_CK':\n  case 'en-CK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_CK;\n    break;\n  case 'en_CM':\n  case 'en-CM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_CM;\n    break;\n  case 'en_CX':\n  case 'en-CX':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_CX;\n    break;\n  case 'en_CY':\n  case 'en-CY':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_CY;\n    break;\n  case 'en_DE':\n  case 'en-DE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_DE;\n    break;\n  case 'en_DG':\n  case 'en-DG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_DG;\n    break;\n  case 'en_DK':\n  case 'en-DK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_DK;\n    break;\n  case 'en_DM':\n  case 'en-DM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_DM;\n    break;\n  case 'en_ER':\n  case 'en-ER':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_ER;\n    break;\n  case 'en_FI':\n  case 'en-FI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_FI;\n    break;\n  case 'en_FJ':\n  case 'en-FJ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_FJ;\n    break;\n  case 'en_FK':\n  case 'en-FK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_FK;\n    break;\n  case 'en_FM':\n  case 'en-FM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_FM;\n    break;\n  case 'en_GD':\n  case 'en-GD':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_GD;\n    break;\n  case 'en_GG':\n  case 'en-GG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_GG;\n    break;\n  case 'en_GH':\n  case 'en-GH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_GH;\n    break;\n  case 'en_GI':\n  case 'en-GI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_GI;\n    break;\n  case 'en_GM':\n  case 'en-GM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_GM;\n    break;\n  case 'en_GU':\n  case 'en-GU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_GU;\n    break;\n  case 'en_GY':\n  case 'en-GY':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_GY;\n    break;\n  case 'en_HK':\n  case 'en-HK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_HK;\n    break;\n  case 'en_IL':\n  case 'en-IL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_IL;\n    break;\n  case 'en_IM':\n  case 'en-IM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_IM;\n    break;\n  case 'en_IO':\n  case 'en-IO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_IO;\n    break;\n  case 'en_JE':\n  case 'en-JE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_JE;\n    break;\n  case 'en_JM':\n  case 'en-JM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_JM;\n    break;\n  case 'en_KE':\n  case 'en-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_KE;\n    break;\n  case 'en_KI':\n  case 'en-KI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_KI;\n    break;\n  case 'en_KN':\n  case 'en-KN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_KN;\n    break;\n  case 'en_KY':\n  case 'en-KY':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_KY;\n    break;\n  case 'en_LC':\n  case 'en-LC':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_LC;\n    break;\n  case 'en_LR':\n  case 'en-LR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_LR;\n    break;\n  case 'en_LS':\n  case 'en-LS':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_LS;\n    break;\n  case 'en_MG':\n  case 'en-MG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_MG;\n    break;\n  case 'en_MH':\n  case 'en-MH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_MH;\n    break;\n  case 'en_MO':\n  case 'en-MO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_MO;\n    break;\n  case 'en_MP':\n  case 'en-MP':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_MP;\n    break;\n  case 'en_MS':\n  case 'en-MS':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_MS;\n    break;\n  case 'en_MT':\n  case 'en-MT':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_MT;\n    break;\n  case 'en_MU':\n  case 'en-MU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_MU;\n    break;\n  case 'en_MW':\n  case 'en-MW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_MW;\n    break;\n  case 'en_MY':\n  case 'en-MY':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_MY;\n    break;\n  case 'en_NA':\n  case 'en-NA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_NA;\n    break;\n  case 'en_NF':\n  case 'en-NF':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_NF;\n    break;\n  case 'en_NG':\n  case 'en-NG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_NG;\n    break;\n  case 'en_NL':\n  case 'en-NL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_NL;\n    break;\n  case 'en_NR':\n  case 'en-NR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_NR;\n    break;\n  case 'en_NU':\n  case 'en-NU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_NU;\n    break;\n  case 'en_NZ':\n  case 'en-NZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_NZ;\n    break;\n  case 'en_PG':\n  case 'en-PG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_PG;\n    break;\n  case 'en_PH':\n  case 'en-PH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_PH;\n    break;\n  case 'en_PK':\n  case 'en-PK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_PK;\n    break;\n  case 'en_PN':\n  case 'en-PN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_PN;\n    break;\n  case 'en_PR':\n  case 'en-PR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_PR;\n    break;\n  case 'en_PW':\n  case 'en-PW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_PW;\n    break;\n  case 'en_RW':\n  case 'en-RW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_RW;\n    break;\n  case 'en_SB':\n  case 'en-SB':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_SB;\n    break;\n  case 'en_SC':\n  case 'en-SC':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_SC;\n    break;\n  case 'en_SD':\n  case 'en-SD':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_SD;\n    break;\n  case 'en_SE':\n  case 'en-SE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_SE;\n    break;\n  case 'en_SH':\n  case 'en-SH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_SH;\n    break;\n  case 'en_SI':\n  case 'en-SI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_SI;\n    break;\n  case 'en_SL':\n  case 'en-SL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_SL;\n    break;\n  case 'en_SS':\n  case 'en-SS':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_SS;\n    break;\n  case 'en_SX':\n  case 'en-SX':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_SX;\n    break;\n  case 'en_SZ':\n  case 'en-SZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_SZ;\n    break;\n  case 'en_TC':\n  case 'en-TC':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_TC;\n    break;\n  case 'en_TK':\n  case 'en-TK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_TK;\n    break;\n  case 'en_TO':\n  case 'en-TO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_TO;\n    break;\n  case 'en_TT':\n  case 'en-TT':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_TT;\n    break;\n  case 'en_TV':\n  case 'en-TV':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_TV;\n    break;\n  case 'en_TZ':\n  case 'en-TZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_TZ;\n    break;\n  case 'en_UG':\n  case 'en-UG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_UG;\n    break;\n  case 'en_UM':\n  case 'en-UM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_UM;\n    break;\n  case 'en_US_POSIX':\n  case 'en-US-POSIX':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_US_POSIX;\n    break;\n  case 'en_VC':\n  case 'en-VC':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_VC;\n    break;\n  case 'en_VG':\n  case 'en-VG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_VG;\n    break;\n  case 'en_VI':\n  case 'en-VI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_VI;\n    break;\n  case 'en_VU':\n  case 'en-VU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_VU;\n    break;\n  case 'en_WS':\n  case 'en-WS':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_WS;\n    break;\n  case 'en_XA':\n  case 'en-XA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_XA;\n    break;\n  case 'en_ZM':\n  case 'en-ZM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_ZM;\n    break;\n  case 'en_ZW':\n  case 'en-ZW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_en_ZW;\n    break;\n  case 'eo':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_eo;\n    break;\n  case 'eo_001':\n  case 'eo-001':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_eo_001;\n    break;\n  case 'es_AR':\n  case 'es-AR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_AR;\n    break;\n  case 'es_BO':\n  case 'es-BO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_BO;\n    break;\n  case 'es_BR':\n  case 'es-BR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_BR;\n    break;\n  case 'es_BZ':\n  case 'es-BZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_BZ;\n    break;\n  case 'es_CL':\n  case 'es-CL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_CL;\n    break;\n  case 'es_CO':\n  case 'es-CO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_CO;\n    break;\n  case 'es_CR':\n  case 'es-CR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_CR;\n    break;\n  case 'es_CU':\n  case 'es-CU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_CU;\n    break;\n  case 'es_DO':\n  case 'es-DO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_DO;\n    break;\n  case 'es_EA':\n  case 'es-EA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_EA;\n    break;\n  case 'es_EC':\n  case 'es-EC':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_EC;\n    break;\n  case 'es_GQ':\n  case 'es-GQ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_GQ;\n    break;\n  case 'es_GT':\n  case 'es-GT':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_GT;\n    break;\n  case 'es_HN':\n  case 'es-HN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_HN;\n    break;\n  case 'es_IC':\n  case 'es-IC':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_IC;\n    break;\n  case 'es_NI':\n  case 'es-NI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_NI;\n    break;\n  case 'es_PA':\n  case 'es-PA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_PA;\n    break;\n  case 'es_PE':\n  case 'es-PE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_PE;\n    break;\n  case 'es_PH':\n  case 'es-PH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_PH;\n    break;\n  case 'es_PR':\n  case 'es-PR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_PR;\n    break;\n  case 'es_PY':\n  case 'es-PY':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_PY;\n    break;\n  case 'es_SV':\n  case 'es-SV':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_SV;\n    break;\n  case 'es_UY':\n  case 'es-UY':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_UY;\n    break;\n  case 'es_VE':\n  case 'es-VE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_es_VE;\n    break;\n  case 'et_EE':\n  case 'et-EE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_et_EE;\n    break;\n  case 'eu_ES':\n  case 'eu-ES':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_eu_ES;\n    break;\n  case 'ewo':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ewo;\n    break;\n  case 'ewo_CM':\n  case 'ewo-CM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ewo_CM;\n    break;\n  case 'fa_AF':\n  case 'fa-AF':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fa_AF;\n    break;\n  case 'fa_IR':\n  case 'fa-IR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fa_IR;\n    break;\n  case 'ff':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ff;\n    break;\n  case 'ff_Latn':\n  case 'ff-Latn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ff_Latn;\n    break;\n  case 'ff_Latn_BF':\n  case 'ff-Latn-BF':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ff_Latn_BF;\n    break;\n  case 'ff_Latn_CM':\n  case 'ff-Latn-CM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ff_Latn_CM;\n    break;\n  case 'ff_Latn_GH':\n  case 'ff-Latn-GH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ff_Latn_GH;\n    break;\n  case 'ff_Latn_GM':\n  case 'ff-Latn-GM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ff_Latn_GM;\n    break;\n  case 'ff_Latn_GN':\n  case 'ff-Latn-GN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ff_Latn_GN;\n    break;\n  case 'ff_Latn_GW':\n  case 'ff-Latn-GW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ff_Latn_GW;\n    break;\n  case 'ff_Latn_LR':\n  case 'ff-Latn-LR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ff_Latn_LR;\n    break;\n  case 'ff_Latn_MR':\n  case 'ff-Latn-MR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ff_Latn_MR;\n    break;\n  case 'ff_Latn_NE':\n  case 'ff-Latn-NE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ff_Latn_NE;\n    break;\n  case 'ff_Latn_NG':\n  case 'ff-Latn-NG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ff_Latn_NG;\n    break;\n  case 'ff_Latn_SL':\n  case 'ff-Latn-SL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ff_Latn_SL;\n    break;\n  case 'ff_Latn_SN':\n  case 'ff-Latn-SN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ff_Latn_SN;\n    break;\n  case 'fi_FI':\n  case 'fi-FI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fi_FI;\n    break;\n  case 'fil_PH':\n  case 'fil-PH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fil_PH;\n    break;\n  case 'fo':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fo;\n    break;\n  case 'fo_DK':\n  case 'fo-DK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fo_DK;\n    break;\n  case 'fo_FO':\n  case 'fo-FO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fo_FO;\n    break;\n  case 'fr_BE':\n  case 'fr-BE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_BE;\n    break;\n  case 'fr_BF':\n  case 'fr-BF':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_BF;\n    break;\n  case 'fr_BI':\n  case 'fr-BI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_BI;\n    break;\n  case 'fr_BJ':\n  case 'fr-BJ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_BJ;\n    break;\n  case 'fr_BL':\n  case 'fr-BL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_BL;\n    break;\n  case 'fr_CD':\n  case 'fr-CD':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_CD;\n    break;\n  case 'fr_CF':\n  case 'fr-CF':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_CF;\n    break;\n  case 'fr_CG':\n  case 'fr-CG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_CG;\n    break;\n  case 'fr_CH':\n  case 'fr-CH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_CH;\n    break;\n  case 'fr_CI':\n  case 'fr-CI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_CI;\n    break;\n  case 'fr_CM':\n  case 'fr-CM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_CM;\n    break;\n  case 'fr_DJ':\n  case 'fr-DJ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_DJ;\n    break;\n  case 'fr_DZ':\n  case 'fr-DZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_DZ;\n    break;\n  case 'fr_FR':\n  case 'fr-FR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_FR;\n    break;\n  case 'fr_GA':\n  case 'fr-GA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_GA;\n    break;\n  case 'fr_GF':\n  case 'fr-GF':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_GF;\n    break;\n  case 'fr_GN':\n  case 'fr-GN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_GN;\n    break;\n  case 'fr_GP':\n  case 'fr-GP':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_GP;\n    break;\n  case 'fr_GQ':\n  case 'fr-GQ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_GQ;\n    break;\n  case 'fr_HT':\n  case 'fr-HT':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_HT;\n    break;\n  case 'fr_KM':\n  case 'fr-KM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_KM;\n    break;\n  case 'fr_LU':\n  case 'fr-LU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_LU;\n    break;\n  case 'fr_MA':\n  case 'fr-MA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_MA;\n    break;\n  case 'fr_MC':\n  case 'fr-MC':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_MC;\n    break;\n  case 'fr_MF':\n  case 'fr-MF':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_MF;\n    break;\n  case 'fr_MG':\n  case 'fr-MG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_MG;\n    break;\n  case 'fr_ML':\n  case 'fr-ML':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_ML;\n    break;\n  case 'fr_MQ':\n  case 'fr-MQ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_MQ;\n    break;\n  case 'fr_MR':\n  case 'fr-MR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_MR;\n    break;\n  case 'fr_MU':\n  case 'fr-MU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_MU;\n    break;\n  case 'fr_NC':\n  case 'fr-NC':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_NC;\n    break;\n  case 'fr_NE':\n  case 'fr-NE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_NE;\n    break;\n  case 'fr_PF':\n  case 'fr-PF':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_PF;\n    break;\n  case 'fr_PM':\n  case 'fr-PM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_PM;\n    break;\n  case 'fr_RE':\n  case 'fr-RE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_RE;\n    break;\n  case 'fr_RW':\n  case 'fr-RW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_RW;\n    break;\n  case 'fr_SC':\n  case 'fr-SC':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_SC;\n    break;\n  case 'fr_SN':\n  case 'fr-SN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_SN;\n    break;\n  case 'fr_SY':\n  case 'fr-SY':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_SY;\n    break;\n  case 'fr_TD':\n  case 'fr-TD':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_TD;\n    break;\n  case 'fr_TG':\n  case 'fr-TG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_TG;\n    break;\n  case 'fr_TN':\n  case 'fr-TN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_TN;\n    break;\n  case 'fr_VU':\n  case 'fr-VU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_VU;\n    break;\n  case 'fr_WF':\n  case 'fr-WF':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_WF;\n    break;\n  case 'fr_YT':\n  case 'fr-YT':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fr_YT;\n    break;\n  case 'fur':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fur;\n    break;\n  case 'fur_IT':\n  case 'fur-IT':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fur_IT;\n    break;\n  case 'fy':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fy;\n    break;\n  case 'fy_NL':\n  case 'fy-NL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_fy_NL;\n    break;\n  case 'ga_IE':\n  case 'ga-IE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ga_IE;\n    break;\n  case 'gd':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_gd;\n    break;\n  case 'gd_GB':\n  case 'gd-GB':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_gd_GB;\n    break;\n  case 'gl_ES':\n  case 'gl-ES':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_gl_ES;\n    break;\n  case 'gsw_CH':\n  case 'gsw-CH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_gsw_CH;\n    break;\n  case 'gsw_FR':\n  case 'gsw-FR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_gsw_FR;\n    break;\n  case 'gsw_LI':\n  case 'gsw-LI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_gsw_LI;\n    break;\n  case 'gu_IN':\n  case 'gu-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_gu_IN;\n    break;\n  case 'guz':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_guz;\n    break;\n  case 'guz_KE':\n  case 'guz-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_guz_KE;\n    break;\n  case 'gv':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_gv;\n    break;\n  case 'gv_IM':\n  case 'gv-IM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_gv_IM;\n    break;\n  case 'ha':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ha;\n    break;\n  case 'ha_GH':\n  case 'ha-GH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ha_GH;\n    break;\n  case 'ha_NE':\n  case 'ha-NE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ha_NE;\n    break;\n  case 'ha_NG':\n  case 'ha-NG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ha_NG;\n    break;\n  case 'haw_US':\n  case 'haw-US':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_haw_US;\n    break;\n  case 'he_IL':\n  case 'he-IL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_he_IL;\n    break;\n  case 'hi_IN':\n  case 'hi-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_hi_IN;\n    break;\n  case 'hr_BA':\n  case 'hr-BA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_hr_BA;\n    break;\n  case 'hr_HR':\n  case 'hr-HR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_hr_HR;\n    break;\n  case 'hsb':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_hsb;\n    break;\n  case 'hsb_DE':\n  case 'hsb-DE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_hsb_DE;\n    break;\n  case 'hu_HU':\n  case 'hu-HU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_hu_HU;\n    break;\n  case 'hy_AM':\n  case 'hy-AM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_hy_AM;\n    break;\n  case 'ia':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ia;\n    break;\n  case 'ia_001':\n  case 'ia-001':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ia_001;\n    break;\n  case 'id_ID':\n  case 'id-ID':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_id_ID;\n    break;\n  case 'ig':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ig;\n    break;\n  case 'ig_NG':\n  case 'ig-NG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ig_NG;\n    break;\n  case 'ii':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ii;\n    break;\n  case 'ii_CN':\n  case 'ii-CN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ii_CN;\n    break;\n  case 'is_IS':\n  case 'is-IS':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_is_IS;\n    break;\n  case 'it_CH':\n  case 'it-CH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_it_CH;\n    break;\n  case 'it_IT':\n  case 'it-IT':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_it_IT;\n    break;\n  case 'it_SM':\n  case 'it-SM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_it_SM;\n    break;\n  case 'it_VA':\n  case 'it-VA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_it_VA;\n    break;\n  case 'ja_JP':\n  case 'ja-JP':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ja_JP;\n    break;\n  case 'jgo':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_jgo;\n    break;\n  case 'jgo_CM':\n  case 'jgo-CM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_jgo_CM;\n    break;\n  case 'jmc':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_jmc;\n    break;\n  case 'jmc_TZ':\n  case 'jmc-TZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_jmc_TZ;\n    break;\n  case 'jv':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_jv;\n    break;\n  case 'jv_ID':\n  case 'jv-ID':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_jv_ID;\n    break;\n  case 'ka_GE':\n  case 'ka-GE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ka_GE;\n    break;\n  case 'kab':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kab;\n    break;\n  case 'kab_DZ':\n  case 'kab-DZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kab_DZ;\n    break;\n  case 'kam':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kam;\n    break;\n  case 'kam_KE':\n  case 'kam-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kam_KE;\n    break;\n  case 'kde':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kde;\n    break;\n  case 'kde_TZ':\n  case 'kde-TZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kde_TZ;\n    break;\n  case 'kea':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kea;\n    break;\n  case 'kea_CV':\n  case 'kea-CV':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kea_CV;\n    break;\n  case 'khq':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_khq;\n    break;\n  case 'khq_ML':\n  case 'khq-ML':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_khq_ML;\n    break;\n  case 'ki':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ki;\n    break;\n  case 'ki_KE':\n  case 'ki-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ki_KE;\n    break;\n  case 'kk_KZ':\n  case 'kk-KZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kk_KZ;\n    break;\n  case 'kkj':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kkj;\n    break;\n  case 'kkj_CM':\n  case 'kkj-CM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kkj_CM;\n    break;\n  case 'kl':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kl;\n    break;\n  case 'kl_GL':\n  case 'kl-GL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kl_GL;\n    break;\n  case 'kln':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kln;\n    break;\n  case 'kln_KE':\n  case 'kln-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kln_KE;\n    break;\n  case 'km_KH':\n  case 'km-KH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_km_KH;\n    break;\n  case 'kn_IN':\n  case 'kn-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kn_IN;\n    break;\n  case 'ko_KP':\n  case 'ko-KP':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ko_KP;\n    break;\n  case 'ko_KR':\n  case 'ko-KR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ko_KR;\n    break;\n  case 'kok':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kok;\n    break;\n  case 'kok_IN':\n  case 'kok-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kok_IN;\n    break;\n  case 'ks':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ks;\n    break;\n  case 'ks_IN':\n  case 'ks-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ks_IN;\n    break;\n  case 'ksb':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ksb;\n    break;\n  case 'ksb_TZ':\n  case 'ksb-TZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ksb_TZ;\n    break;\n  case 'ksf':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ksf;\n    break;\n  case 'ksf_CM':\n  case 'ksf-CM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ksf_CM;\n    break;\n  case 'ksh':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ksh;\n    break;\n  case 'ksh_DE':\n  case 'ksh-DE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ksh_DE;\n    break;\n  case 'ku':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ku;\n    break;\n  case 'ku_TR':\n  case 'ku-TR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ku_TR;\n    break;\n  case 'kw':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kw;\n    break;\n  case 'kw_GB':\n  case 'kw-GB':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_kw_GB;\n    break;\n  case 'ky_KG':\n  case 'ky-KG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ky_KG;\n    break;\n  case 'lag':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lag;\n    break;\n  case 'lag_TZ':\n  case 'lag-TZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lag_TZ;\n    break;\n  case 'lb':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lb;\n    break;\n  case 'lb_LU':\n  case 'lb-LU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lb_LU;\n    break;\n  case 'lg':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lg;\n    break;\n  case 'lg_UG':\n  case 'lg-UG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lg_UG;\n    break;\n  case 'lkt':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lkt;\n    break;\n  case 'lkt_US':\n  case 'lkt-US':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lkt_US;\n    break;\n  case 'ln_AO':\n  case 'ln-AO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ln_AO;\n    break;\n  case 'ln_CD':\n  case 'ln-CD':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ln_CD;\n    break;\n  case 'ln_CF':\n  case 'ln-CF':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ln_CF;\n    break;\n  case 'ln_CG':\n  case 'ln-CG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ln_CG;\n    break;\n  case 'lo_LA':\n  case 'lo-LA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lo_LA;\n    break;\n  case 'lrc':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lrc;\n    break;\n  case 'lrc_IQ':\n  case 'lrc-IQ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lrc_IQ;\n    break;\n  case 'lrc_IR':\n  case 'lrc-IR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lrc_IR;\n    break;\n  case 'lt_LT':\n  case 'lt-LT':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lt_LT;\n    break;\n  case 'lu':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lu;\n    break;\n  case 'lu_CD':\n  case 'lu-CD':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lu_CD;\n    break;\n  case 'luo':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_luo;\n    break;\n  case 'luo_KE':\n  case 'luo-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_luo_KE;\n    break;\n  case 'luy':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_luy;\n    break;\n  case 'luy_KE':\n  case 'luy-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_luy_KE;\n    break;\n  case 'lv_LV':\n  case 'lv-LV':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_lv_LV;\n    break;\n  case 'mas':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mas;\n    break;\n  case 'mas_KE':\n  case 'mas-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mas_KE;\n    break;\n  case 'mas_TZ':\n  case 'mas-TZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mas_TZ;\n    break;\n  case 'mer':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mer;\n    break;\n  case 'mer_KE':\n  case 'mer-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mer_KE;\n    break;\n  case 'mfe':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mfe;\n    break;\n  case 'mfe_MU':\n  case 'mfe-MU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mfe_MU;\n    break;\n  case 'mg':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mg;\n    break;\n  case 'mg_MG':\n  case 'mg-MG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mg_MG;\n    break;\n  case 'mgh':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mgh;\n    break;\n  case 'mgh_MZ':\n  case 'mgh-MZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mgh_MZ;\n    break;\n  case 'mgo':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mgo;\n    break;\n  case 'mgo_CM':\n  case 'mgo-CM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mgo_CM;\n    break;\n  case 'mi':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mi;\n    break;\n  case 'mi_NZ':\n  case 'mi-NZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mi_NZ;\n    break;\n  case 'mk_MK':\n  case 'mk-MK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mk_MK;\n    break;\n  case 'ml_IN':\n  case 'ml-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ml_IN;\n    break;\n  case 'mn_MN':\n  case 'mn-MN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mn_MN;\n    break;\n  case 'mr_IN':\n  case 'mr-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mr_IN;\n    break;\n  case 'ms_BN':\n  case 'ms-BN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ms_BN;\n    break;\n  case 'ms_MY':\n  case 'ms-MY':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ms_MY;\n    break;\n  case 'ms_SG':\n  case 'ms-SG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ms_SG;\n    break;\n  case 'mt_MT':\n  case 'mt-MT':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mt_MT;\n    break;\n  case 'mua':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mua;\n    break;\n  case 'mua_CM':\n  case 'mua-CM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mua_CM;\n    break;\n  case 'my_MM':\n  case 'my-MM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_my_MM;\n    break;\n  case 'mzn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mzn;\n    break;\n  case 'mzn_IR':\n  case 'mzn-IR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_mzn_IR;\n    break;\n  case 'naq':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_naq;\n    break;\n  case 'naq_NA':\n  case 'naq-NA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_naq_NA;\n    break;\n  case 'nb_NO':\n  case 'nb-NO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nb_NO;\n    break;\n  case 'nb_SJ':\n  case 'nb-SJ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nb_SJ;\n    break;\n  case 'nd':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nd;\n    break;\n  case 'nd_ZW':\n  case 'nd-ZW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nd_ZW;\n    break;\n  case 'nds':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nds;\n    break;\n  case 'nds_DE':\n  case 'nds-DE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nds_DE;\n    break;\n  case 'nds_NL':\n  case 'nds-NL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nds_NL;\n    break;\n  case 'ne_IN':\n  case 'ne-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ne_IN;\n    break;\n  case 'ne_NP':\n  case 'ne-NP':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ne_NP;\n    break;\n  case 'nl_AW':\n  case 'nl-AW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nl_AW;\n    break;\n  case 'nl_BE':\n  case 'nl-BE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nl_BE;\n    break;\n  case 'nl_BQ':\n  case 'nl-BQ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nl_BQ;\n    break;\n  case 'nl_CW':\n  case 'nl-CW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nl_CW;\n    break;\n  case 'nl_NL':\n  case 'nl-NL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nl_NL;\n    break;\n  case 'nl_SR':\n  case 'nl-SR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nl_SR;\n    break;\n  case 'nl_SX':\n  case 'nl-SX':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nl_SX;\n    break;\n  case 'nmg':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nmg;\n    break;\n  case 'nmg_CM':\n  case 'nmg-CM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nmg_CM;\n    break;\n  case 'nn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nn;\n    break;\n  case 'nn_NO':\n  case 'nn-NO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nn_NO;\n    break;\n  case 'nnh':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nnh;\n    break;\n  case 'nnh_CM':\n  case 'nnh-CM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nnh_CM;\n    break;\n  case 'nus':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nus;\n    break;\n  case 'nus_SS':\n  case 'nus-SS':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nus_SS;\n    break;\n  case 'nyn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nyn;\n    break;\n  case 'nyn_UG':\n  case 'nyn-UG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_nyn_UG;\n    break;\n  case 'om':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_om;\n    break;\n  case 'om_ET':\n  case 'om-ET':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_om_ET;\n    break;\n  case 'om_KE':\n  case 'om-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_om_KE;\n    break;\n  case 'or_IN':\n  case 'or-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_or_IN;\n    break;\n  case 'os':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_os;\n    break;\n  case 'os_GE':\n  case 'os-GE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_os_GE;\n    break;\n  case 'os_RU':\n  case 'os-RU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_os_RU;\n    break;\n  case 'pa_Arab':\n  case 'pa-Arab':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pa_Arab;\n    break;\n  case 'pa_Arab_PK':\n  case 'pa-Arab-PK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pa_Arab_PK;\n    break;\n  case 'pa_Guru':\n  case 'pa-Guru':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pa_Guru;\n    break;\n  case 'pa_Guru_IN':\n  case 'pa-Guru-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pa_Guru_IN;\n    break;\n  case 'pl_PL':\n  case 'pl-PL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pl_PL;\n    break;\n  case 'ps':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ps;\n    break;\n  case 'ps_AF':\n  case 'ps-AF':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ps_AF;\n    break;\n  case 'ps_PK':\n  case 'ps-PK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ps_PK;\n    break;\n  case 'pt_AO':\n  case 'pt-AO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pt_AO;\n    break;\n  case 'pt_CH':\n  case 'pt-CH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pt_CH;\n    break;\n  case 'pt_CV':\n  case 'pt-CV':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pt_CV;\n    break;\n  case 'pt_GQ':\n  case 'pt-GQ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pt_GQ;\n    break;\n  case 'pt_GW':\n  case 'pt-GW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pt_GW;\n    break;\n  case 'pt_LU':\n  case 'pt-LU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pt_LU;\n    break;\n  case 'pt_MO':\n  case 'pt-MO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pt_MO;\n    break;\n  case 'pt_MZ':\n  case 'pt-MZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pt_MZ;\n    break;\n  case 'pt_ST':\n  case 'pt-ST':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pt_ST;\n    break;\n  case 'pt_TL':\n  case 'pt-TL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_pt_TL;\n    break;\n  case 'qu':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_qu;\n    break;\n  case 'qu_BO':\n  case 'qu-BO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_qu_BO;\n    break;\n  case 'qu_EC':\n  case 'qu-EC':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_qu_EC;\n    break;\n  case 'qu_PE':\n  case 'qu-PE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_qu_PE;\n    break;\n  case 'rm':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_rm;\n    break;\n  case 'rm_CH':\n  case 'rm-CH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_rm_CH;\n    break;\n  case 'rn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_rn;\n    break;\n  case 'rn_BI':\n  case 'rn-BI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_rn_BI;\n    break;\n  case 'ro_MD':\n  case 'ro-MD':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ro_MD;\n    break;\n  case 'ro_RO':\n  case 'ro-RO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ro_RO;\n    break;\n  case 'rof':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_rof;\n    break;\n  case 'rof_TZ':\n  case 'rof-TZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_rof_TZ;\n    break;\n  case 'ru_BY':\n  case 'ru-BY':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ru_BY;\n    break;\n  case 'ru_KG':\n  case 'ru-KG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ru_KG;\n    break;\n  case 'ru_KZ':\n  case 'ru-KZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ru_KZ;\n    break;\n  case 'ru_MD':\n  case 'ru-MD':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ru_MD;\n    break;\n  case 'ru_RU':\n  case 'ru-RU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ru_RU;\n    break;\n  case 'ru_UA':\n  case 'ru-UA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ru_UA;\n    break;\n  case 'rw':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_rw;\n    break;\n  case 'rw_RW':\n  case 'rw-RW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_rw_RW;\n    break;\n  case 'rwk':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_rwk;\n    break;\n  case 'rwk_TZ':\n  case 'rwk-TZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_rwk_TZ;\n    break;\n  case 'sah':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sah;\n    break;\n  case 'sah_RU':\n  case 'sah-RU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sah_RU;\n    break;\n  case 'saq':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_saq;\n    break;\n  case 'saq_KE':\n  case 'saq-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_saq_KE;\n    break;\n  case 'sbp':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sbp;\n    break;\n  case 'sbp_TZ':\n  case 'sbp-TZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sbp_TZ;\n    break;\n  case 'sd':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sd;\n    break;\n  case 'sd_PK':\n  case 'sd-PK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sd_PK;\n    break;\n  case 'se':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_se;\n    break;\n  case 'se_FI':\n  case 'se-FI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_se_FI;\n    break;\n  case 'se_NO':\n  case 'se-NO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_se_NO;\n    break;\n  case 'se_SE':\n  case 'se-SE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_se_SE;\n    break;\n  case 'seh':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_seh;\n    break;\n  case 'seh_MZ':\n  case 'seh-MZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_seh_MZ;\n    break;\n  case 'ses':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ses;\n    break;\n  case 'ses_ML':\n  case 'ses-ML':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ses_ML;\n    break;\n  case 'sg':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sg;\n    break;\n  case 'sg_CF':\n  case 'sg-CF':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sg_CF;\n    break;\n  case 'shi':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_shi;\n    break;\n  case 'shi_Latn':\n  case 'shi-Latn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_shi_Latn;\n    break;\n  case 'shi_Latn_MA':\n  case 'shi-Latn-MA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_shi_Latn_MA;\n    break;\n  case 'shi_Tfng':\n  case 'shi-Tfng':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_shi_Tfng;\n    break;\n  case 'shi_Tfng_MA':\n  case 'shi-Tfng-MA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_shi_Tfng_MA;\n    break;\n  case 'si_LK':\n  case 'si-LK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_si_LK;\n    break;\n  case 'sk_SK':\n  case 'sk-SK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sk_SK;\n    break;\n  case 'sl_SI':\n  case 'sl-SI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sl_SI;\n    break;\n  case 'smn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_smn;\n    break;\n  case 'smn_FI':\n  case 'smn-FI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_smn_FI;\n    break;\n  case 'sn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sn;\n    break;\n  case 'sn_ZW':\n  case 'sn-ZW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sn_ZW;\n    break;\n  case 'so':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_so;\n    break;\n  case 'so_DJ':\n  case 'so-DJ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_so_DJ;\n    break;\n  case 'so_ET':\n  case 'so-ET':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_so_ET;\n    break;\n  case 'so_KE':\n  case 'so-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_so_KE;\n    break;\n  case 'so_SO':\n  case 'so-SO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_so_SO;\n    break;\n  case 'sq_AL':\n  case 'sq-AL':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sq_AL;\n    break;\n  case 'sq_MK':\n  case 'sq-MK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sq_MK;\n    break;\n  case 'sq_XK':\n  case 'sq-XK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sq_XK;\n    break;\n  case 'sr_Cyrl':\n  case 'sr-Cyrl':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sr_Cyrl;\n    break;\n  case 'sr_Cyrl_BA':\n  case 'sr-Cyrl-BA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sr_Cyrl_BA;\n    break;\n  case 'sr_Cyrl_ME':\n  case 'sr-Cyrl-ME':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sr_Cyrl_ME;\n    break;\n  case 'sr_Cyrl_RS':\n  case 'sr-Cyrl-RS':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sr_Cyrl_RS;\n    break;\n  case 'sr_Cyrl_XK':\n  case 'sr-Cyrl-XK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sr_Cyrl_XK;\n    break;\n  case 'sr_Latn_BA':\n  case 'sr-Latn-BA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sr_Latn_BA;\n    break;\n  case 'sr_Latn_ME':\n  case 'sr-Latn-ME':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sr_Latn_ME;\n    break;\n  case 'sr_Latn_RS':\n  case 'sr-Latn-RS':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sr_Latn_RS;\n    break;\n  case 'sr_Latn_XK':\n  case 'sr-Latn-XK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sr_Latn_XK;\n    break;\n  case 'sv_AX':\n  case 'sv-AX':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sv_AX;\n    break;\n  case 'sv_FI':\n  case 'sv-FI':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sv_FI;\n    break;\n  case 'sv_SE':\n  case 'sv-SE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sv_SE;\n    break;\n  case 'sw_CD':\n  case 'sw-CD':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sw_CD;\n    break;\n  case 'sw_KE':\n  case 'sw-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sw_KE;\n    break;\n  case 'sw_TZ':\n  case 'sw-TZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sw_TZ;\n    break;\n  case 'sw_UG':\n  case 'sw-UG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_sw_UG;\n    break;\n  case 'ta_IN':\n  case 'ta-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ta_IN;\n    break;\n  case 'ta_LK':\n  case 'ta-LK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ta_LK;\n    break;\n  case 'ta_MY':\n  case 'ta-MY':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ta_MY;\n    break;\n  case 'ta_SG':\n  case 'ta-SG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ta_SG;\n    break;\n  case 'te_IN':\n  case 'te-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_te_IN;\n    break;\n  case 'teo':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_teo;\n    break;\n  case 'teo_KE':\n  case 'teo-KE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_teo_KE;\n    break;\n  case 'teo_UG':\n  case 'teo-UG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_teo_UG;\n    break;\n  case 'tg':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_tg;\n    break;\n  case 'tg_TJ':\n  case 'tg-TJ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_tg_TJ;\n    break;\n  case 'th_TH':\n  case 'th-TH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_th_TH;\n    break;\n  case 'ti':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ti;\n    break;\n  case 'ti_ER':\n  case 'ti-ER':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ti_ER;\n    break;\n  case 'ti_ET':\n  case 'ti-ET':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ti_ET;\n    break;\n  case 'tk':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_tk;\n    break;\n  case 'tk_TM':\n  case 'tk-TM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_tk_TM;\n    break;\n  case 'to':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_to;\n    break;\n  case 'to_TO':\n  case 'to-TO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_to_TO;\n    break;\n  case 'tr_CY':\n  case 'tr-CY':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_tr_CY;\n    break;\n  case 'tr_TR':\n  case 'tr-TR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_tr_TR;\n    break;\n  case 'tt':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_tt;\n    break;\n  case 'tt_RU':\n  case 'tt-RU':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_tt_RU;\n    break;\n  case 'twq':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_twq;\n    break;\n  case 'twq_NE':\n  case 'twq-NE':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_twq_NE;\n    break;\n  case 'tzm':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_tzm;\n    break;\n  case 'tzm_MA':\n  case 'tzm-MA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_tzm_MA;\n    break;\n  case 'ug':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ug;\n    break;\n  case 'ug_CN':\n  case 'ug-CN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ug_CN;\n    break;\n  case 'uk_UA':\n  case 'uk-UA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_uk_UA;\n    break;\n  case 'ur_IN':\n  case 'ur-IN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ur_IN;\n    break;\n  case 'ur_PK':\n  case 'ur-PK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_ur_PK;\n    break;\n  case 'uz_Arab':\n  case 'uz-Arab':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_uz_Arab;\n    break;\n  case 'uz_Arab_AF':\n  case 'uz-Arab-AF':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_uz_Arab_AF;\n    break;\n  case 'uz_Cyrl':\n  case 'uz-Cyrl':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_uz_Cyrl;\n    break;\n  case 'uz_Cyrl_UZ':\n  case 'uz-Cyrl-UZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_uz_Cyrl_UZ;\n    break;\n  case 'uz_Latn':\n  case 'uz-Latn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_uz_Latn;\n    break;\n  case 'uz_Latn_UZ':\n  case 'uz-Latn-UZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_uz_Latn_UZ;\n    break;\n  case 'vai':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_vai;\n    break;\n  case 'vai_Latn':\n  case 'vai-Latn':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_vai_Latn;\n    break;\n  case 'vai_Latn_LR':\n  case 'vai-Latn-LR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_vai_Latn_LR;\n    break;\n  case 'vai_Vaii':\n  case 'vai-Vaii':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_vai_Vaii;\n    break;\n  case 'vai_Vaii_LR':\n  case 'vai-Vaii-LR':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_vai_Vaii_LR;\n    break;\n  case 'vi_VN':\n  case 'vi-VN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_vi_VN;\n    break;\n  case 'vun':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_vun;\n    break;\n  case 'vun_TZ':\n  case 'vun-TZ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_vun_TZ;\n    break;\n  case 'wae':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_wae;\n    break;\n  case 'wae_CH':\n  case 'wae-CH':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_wae_CH;\n    break;\n  case 'wo':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_wo;\n    break;\n  case 'wo_SN':\n  case 'wo-SN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_wo_SN;\n    break;\n  case 'xh':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_xh;\n    break;\n  case 'xh_ZA':\n  case 'xh-ZA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_xh_ZA;\n    break;\n  case 'xog':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_xog;\n    break;\n  case 'xog_UG':\n  case 'xog-UG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_xog_UG;\n    break;\n  case 'yav':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_yav;\n    break;\n  case 'yav_CM':\n  case 'yav-CM':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_yav_CM;\n    break;\n  case 'yi':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_yi;\n    break;\n  case 'yi_001':\n  case 'yi-001':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_yi_001;\n    break;\n  case 'yo':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_yo;\n    break;\n  case 'yo_BJ':\n  case 'yo-BJ':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_yo_BJ;\n    break;\n  case 'yo_NG':\n  case 'yo-NG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_yo_NG;\n    break;\n  case 'yue':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_yue;\n    break;\n  case 'yue_Hans':\n  case 'yue-Hans':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_yue_Hans;\n    break;\n  case 'yue_Hans_CN':\n  case 'yue-Hans-CN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_yue_Hans_CN;\n    break;\n  case 'yue_Hant':\n  case 'yue-Hant':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_yue_Hant;\n    break;\n  case 'yue_Hant_HK':\n  case 'yue-Hant-HK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_yue_Hant_HK;\n    break;\n  case 'zgh':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zgh;\n    break;\n  case 'zgh_MA':\n  case 'zgh-MA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zgh_MA;\n    break;\n  case 'zh_Hans':\n  case 'zh-Hans':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zh_Hans;\n    break;\n  case 'zh_Hans_CN':\n  case 'zh-Hans-CN':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zh_Hans_CN;\n    break;\n  case 'zh_Hans_HK':\n  case 'zh-Hans-HK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zh_Hans_HK;\n    break;\n  case 'zh_Hans_MO':\n  case 'zh-Hans-MO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zh_Hans_MO;\n    break;\n  case 'zh_Hans_SG':\n  case 'zh-Hans-SG':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zh_Hans_SG;\n    break;\n  case 'zh_Hant':\n  case 'zh-Hant':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zh_Hant;\n    break;\n  case 'zh_Hant_HK':\n  case 'zh-Hant-HK':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zh_Hant_HK;\n    break;\n  case 'zh_Hant_MO':\n  case 'zh-Hant-MO':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zh_Hant_MO;\n    break;\n  case 'zh_Hant_TW':\n  case 'zh-Hant-TW':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zh_Hant_TW;\n    break;\n  case 'zu_ZA':\n  case 'zu-ZA':\n    goog.i18n.DateTimePatterns = goog.i18n.DateTimePatterns_zu_ZA;\n    break;\n}\n","^J2",1579837703000,"^J3",["^J4",["^IT","~$goog.i18n.DateTimePatterns"]],"^J5",["^ ","^J6","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^J7","^J8","^J9","^J:","^J;","Google Closure Library","^J<","^J=","^J>","http://code.google.com/p/closure-library/","^J?","^J@","^JA",["^J=","0.0-20191016-6ae1f72f"],"^JB","0.0-20191016-6ae1f72f"],"^J>",["^JC","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/datetimepatternsext.js"],"^JD",["^J4",["~$goog.i18n.DateTimePatterns-zh-Hans","~$goog.i18n.DateTimePatterns_en_UG","~$goog.i18n.DateTimePatterns_fo","~$goog.i18n.DateTimePatterns-en-UM","~$goog.i18n.DateTimePatterns_ro_RO","~$goog.i18n.DateTimePatterns_en_GG","~$goog.i18n.DateTimePatterns_ln_CD","~$goog.i18n.DateTimePatterns_en_TK","~$goog.i18n.DateTimePatterns_en_UM","~$goog.i18n.DateTimePatterns-de-LI","~$goog.i18n.DateTimePatterns-vun","~$goog.i18n.DateTimePatterns_bs_Latn","~$goog.i18n.DateTimePatterns_lrc","~$goog.i18n.DateTimePatterns_ia","~$goog.i18n.DateTimePatterns_ff","~$goog.i18n.DateTimePatterns-uz-Arab","~$goog.i18n.DateTimePatterns_es_UY","~$goog.i18n.DateTimePatterns-bez-TZ","~$goog.i18n.DateTimePatterns_fr_GA","~$goog.i18n.DateTimePatterns-nnh","~$goog.i18n.DateTimePatterns-en-DE","~$goog.i18n.DateTimePatterns-es-CO","~$goog.i18n.DateTimePatterns_pa_Arab_PK","~$goog.i18n.DateTimePatterns_lrc_IR","~$goog.i18n.DateTimePatterns-uz-Arab-AF","~$goog.i18n.DateTimePatterns_uk_UA","~$goog.i18n.DateTimePatterns_fr_DZ","~$goog.i18n.DateTimePatterns_ckb","~$goog.i18n.DateTimePatterns-en-KI","~$goog.i18n.DateTimePatterns_es_AR","~$goog.i18n.DateTimePatterns_nl_CW","~$goog.i18n.DateTimePatterns-yav","~$goog.i18n.DateTimePatterns-dua-CM","~$goog.i18n.DateTimePatterns_bs_Cyrl_BA","~$goog.i18n.DateTimePatterns-kea-CV","~$goog.i18n.DateTimePatterns_lu","~$goog.i18n.DateTimePatterns_af_ZA","~$goog.i18n.DateTimePatterns_zgh","~$goog.i18n.DateTimePatterns-en-CX","~$goog.i18n.DateTimePatterns_he_IL","~$goog.i18n.DateTimePatterns_shi_Tfng","~$goog.i18n.DateTimePatterns_mfe","~$goog.i18n.DateTimePatterns_mas_KE","~$goog.i18n.DateTimePatterns-dje-NE","~$goog.i18n.DateTimePatterns-yue-Hant","~$goog.i18n.DateTimePatterns_en_LS","~$goog.i18n.DateTimePatterns_en_AG","~$goog.i18n.DateTimePatterns-kea","~$goog.i18n.DateTimePatterns_nb_NO","~$goog.i18n.DateTimePatterns-ar-SS","~$goog.i18n.DateTimePatterns-fr-GQ","~$goog.i18n.DateTimePatterns-ar-IL","~$goog.i18n.DateTimePatterns-be-BY","~$goog.i18n.DateTimePatterns-es-CL","~$goog.i18n.DateTimePatterns_en_SZ","~$goog.i18n.DateTimePatterns_ti_ER","~$goog.i18n.DateTimePatterns-ar-YE","~$goog.i18n.DateTimePatterns_my_MM","~$goog.i18n.DateTimePatterns-ar-PS","~$goog.i18n.DateTimePatterns-sn","~$goog.i18n.DateTimePatterns_fr_CM","~$goog.i18n.DateTimePatterns-fr-KM","~$goog.i18n.DateTimePatterns_en_VI","~$goog.i18n.DateTimePatterns_en_US_POSIX","~$goog.i18n.DateTimePatterns_yi_001","~$goog.i18n.DateTimePatterns-ar-SD","~$goog.i18n.DateTimePatterns-vai-Vaii-LR","~$goog.i18n.DateTimePatterns-lv-LV","~$goog.i18n.DateTimePatterns_sk_SK","~$goog.i18n.DateTimePatterns-fr-MF","~$goog.i18n.DateTimePatterns-pa-Guru-IN","~$goog.i18n.DateTimePatterns_ccp_BD","~$goog.i18n.DateTimePatterns-uz-Latn-UZ","~$goog.i18n.DateTimePatterns-fa-IR","~$goog.i18n.DateTimePatterns-gl-ES","~$goog.i18n.DateTimePatterns-shi-Latn","~$goog.i18n.DateTimePatterns-en-PK","~$goog.i18n.DateTimePatterns_fy","~$goog.i18n.DateTimePatterns-sl-SI","~$goog.i18n.DateTimePatterns-az-Cyrl","~$goog.i18n.DateTimePatterns-ru-MD","~$goog.i18n.DateTimePatterns-hy-AM","~$goog.i18n.DateTimePatterns-ps","~$goog.i18n.DateTimePatterns_pt_GW","~$goog.i18n.DateTimePatterns-pt-MZ","~$goog.i18n.DateTimePatterns_uz_Cyrl_UZ","~$goog.i18n.DateTimePatterns-ca-ES","~$goog.i18n.DateTimePatterns-xog","~$goog.i18n.DateTimePatterns-lrc-IR","~$goog.i18n.DateTimePatterns-es-VE","~$goog.i18n.DateTimePatterns_de_IT","~$goog.i18n.DateTimePatterns_ug","~$goog.i18n.DateTimePatterns_en_001","~$goog.i18n.DateTimePatterns-ar-SO","~$goog.i18n.DateTimePatterns-ee-GH","~$goog.i18n.DateTimePatterns_ar_SY","~$goog.i18n.DateTimePatterns-fr-MC","~$goog.i18n.DateTimePatterns_ar_EH","~$goog.i18n.DateTimePatterns_yo","~$goog.i18n.DateTimePatterns-hr-BA","~$goog.i18n.DateTimePatterns-yav-CM","~$goog.i18n.DateTimePatterns-ha-GH","~$goog.i18n.DateTimePatterns_luo_KE","~$goog.i18n.DateTimePatterns_ky_KG","~$goog.i18n.DateTimePatterns-xh-ZA","~$goog.i18n.DateTimePatterns_ses","~$goog.i18n.DateTimePatterns_wo","~$goog.i18n.DateTimePatterns_cgg_UG","~$goog.i18n.DateTimePatterns_wae_CH","~$goog.i18n.DateTimePatterns-lt-LT","~$goog.i18n.DateTimePatterns_or_IN","~$goog.i18n.DateTimePatterns_vai_Latn_LR","~$goog.i18n.DateTimePatterns-zgh-MA","~$goog.i18n.DateTimePatterns-pt-AO","~$goog.i18n.DateTimePatterns_sw_TZ","~$goog.i18n.DateTimePatterns-en-XA","~$goog.i18n.DateTimePatterns_so_KE","~$goog.i18n.DateTimePatterns_ar_SS","~$goog.i18n.DateTimePatterns_yav_CM","~$goog.i18n.DateTimePatterns_lg_UG","~$goog.i18n.DateTimePatterns-en-KE","~$goog.i18n.DateTimePatterns_ig","~$goog.i18n.DateTimePatterns_ca_ES","~$goog.i18n.DateTimePatterns_sw_CD","~$goog.i18n.DateTimePatterns-sv-SE","~$goog.i18n.DateTimePatterns_en_NA","~$goog.i18n.DateTimePatterns_mi_NZ","~$goog.i18n.DateTimePatterns_en_KE","~$goog.i18n.DateTimePatterns_kkj","~$goog.i18n.DateTimePatterns-ceb","~$goog.i18n.DateTimePatterns-ar-SY","~$goog.i18n.DateTimePatterns-ar-SA","~$goog.i18n.DateTimePatterns-fr-TD","~$goog.i18n.DateTimePatterns-fr-CG","~$goog.i18n.DateTimePatterns_en_MY","~$goog.i18n.DateTimePatterns_mgh","~$goog.i18n.DateTimePatterns_es_IC","~$goog.i18n.DateTimePatterns-en-CY","~$goog.i18n.DateTimePatterns-en-TT","~$goog.i18n.DateTimePatterns-es-BO","~$goog.i18n.DateTimePatterns-sv-AX","~$goog.i18n.DateTimePatterns-ms-BN","~$goog.i18n.DateTimePatterns-ff-Latn-SL","~$goog.i18n.DateTimePatterns_en_BE","~$goog.i18n.DateTimePatterns_fo_DK","~$goog.i18n.DateTimePatterns_et_EE","~$goog.i18n.DateTimePatterns_sr_Latn_BA","~$goog.i18n.DateTimePatterns-af-ZA","~$goog.i18n.DateTimePatterns-ur-PK","~$goog.i18n.DateTimePatterns-nn-NO","~$goog.i18n.DateTimePatterns_yue_Hans_CN","~$goog.i18n.DateTimePatterns_ar_OM","~$goog.i18n.DateTimePatterns_ee_GH","~$goog.i18n.DateTimePatterns-bn-IN","~$goog.i18n.DateTimePatterns_en_TC","~$goog.i18n.DateTimePatterns_ta_IN","~$goog.i18n.DateTimePatterns_zh_Hans","~$goog.i18n.DateTimePatterns-yue-Hans","~$goog.i18n.DateTimePatterns_mgo_CM","~$goog.i18n.DateTimePatterns_uz_Arab_AF","~$goog.i18n.DateTimePatterns_kea","~$goog.i18n.DateTimePatterns-ff-Latn-GH","~$goog.i18n.DateTimePatterns-uz-Latn","~$goog.i18n.DateTimePatterns-eu-ES","~$goog.i18n.DateTimePatterns-de-LU","~$goog.i18n.DateTimePatterns-mi","~$goog.i18n.DateTimePatterns-fr-SN","~$goog.i18n.DateTimePatterns_de_LU","~$goog.i18n.DateTimePatterns-en-US-POSIX","~$goog.i18n.DateTimePatterns_es_PE","~$goog.i18n.DateTimePatterns_ia_001","~$goog.i18n.DateTimePatterns_ak_GH","~$goog.i18n.DateTimePatterns_it_VA","~$goog.i18n.DateTimePatterns-vai-Vaii","~$goog.i18n.DateTimePatterns-en-SS","~$goog.i18n.DateTimePatterns_ff_Latn_GM","~$goog.i18n.DateTimePatterns_kab","~$goog.i18n.DateTimePatterns_pa_Arab","~$goog.i18n.DateTimePatterns-en-BS","~$goog.i18n.DateTimePatterns_en_NU","~$goog.i18n.DateTimePatterns_en_MW","~$goog.i18n.DateTimePatterns_se_SE","~$goog.i18n.DateTimePatterns_fr_GN","~$goog.i18n.DateTimePatterns-pt-TL","~$goog.i18n.DateTimePatterns_teo_KE","~$goog.i18n.DateTimePatterns_os_RU","~$goog.i18n.DateTimePatterns_en_PK","~$goog.i18n.DateTimePatterns_se","~$goog.i18n.DateTimePatterns-ff-Latn-NE","~$goog.i18n.DateTimePatterns-zh-Hans-CN","~$goog.i18n.DateTimePatterns-nd-ZW","~$goog.i18n.DateTimePatterns-kde-TZ","~$goog.i18n.DateTimePatterns-ff-Latn-LR","~$goog.i18n.DateTimePatterns-ksb-TZ","~$goog.i18n.DateTimePatterns_en_CC","~$goog.i18n.DateTimePatterns-os-GE","~$goog.i18n.DateTimePatterns-so-DJ","~$goog.i18n.DateTimePatterns_fr_DJ","~$goog.i18n.DateTimePatterns-lg","~$goog.i18n.DateTimePatterns_kkj_CM","~$goog.i18n.DateTimePatterns-dz","~$goog.i18n.DateTimePatterns-rwk-TZ","~$goog.i18n.DateTimePatterns_mas","~$goog.i18n.DateTimePatterns_vun","~$goog.i18n.DateTimePatterns-en-FM","~$goog.i18n.DateTimePatterns-en-VI","~$goog.i18n.DateTimePatterns_sg","~$goog.i18n.DateTimePatterns_ug_CN","~$goog.i18n.DateTimePatterns_fr_PM","~$goog.i18n.DateTimePatterns_en_PW","~$goog.i18n.DateTimePatterns_ro_MD","~$goog.i18n.DateTimePatterns-qu","~$goog.i18n.DateTimePatterns_rn","~$goog.i18n.DateTimePatterns-ti-ER","~$goog.i18n.DateTimePatterns_kam","~$goog.i18n.DateTimePatterns_shi_Latn","~$goog.i18n.DateTimePatterns-eo-001","~$goog.i18n.DateTimePatterns-es-DO","~$goog.i18n.DateTimePatterns-bo","~$goog.i18n.DateTimePatterns_pt_CH","~$goog.i18n.DateTimePatterns_lkt","~$goog.i18n.DateTimePatterns_da_GL","~$goog.i18n.DateTimePatterns-fr-PM","~$goog.i18n.DateTimePatterns-en-TK","~$goog.i18n.DateTimePatterns-fr-YT","~$goog.i18n.DateTimePatterns-en-KY","~$goog.i18n.DateTimePatterns_en_VG","~$goog.i18n.DateTimePatterns-es-IC","~$goog.i18n.DateTimePatterns-ca-AD","~$goog.i18n.DateTimePatterns-lu-CD","~$goog.i18n.DateTimePatterns-en-CK","~$goog.i18n.DateTimePatterns_yav","~$goog.i18n.DateTimePatterns_sv_SE","~$goog.i18n.DateTimePatterns-et-EE","~$goog.i18n.DateTimePatterns_ff_Latn_MR","~$goog.i18n.DateTimePatterns_dz_BT","~$goog.i18n.DateTimePatterns-jv","~$goog.i18n.DateTimePatterns-en-DM","~$goog.i18n.DateTimePatterns_ar_YE","~$goog.i18n.DateTimePatterns-fr-GA","~$goog.i18n.DateTimePatterns-bg-BG","~$goog.i18n.DateTimePatterns_ar_ER","~$goog.i18n.DateTimePatterns_luo","~$goog.i18n.DateTimePatterns-nn","~$goog.i18n.DateTimePatterns_en_TT","~$goog.i18n.DateTimePatterns-br-FR","~$goog.i18n.DateTimePatterns_en_AE","~$goog.i18n.DateTimePatterns-ak","~$goog.i18n.DateTimePatterns-en-BM","~$goog.i18n.DateTimePatterns-gv-IM","~$goog.i18n.DateTimePatterns_ff_Latn_GN","~$goog.i18n.DateTimePatterns-fr-NC","~$goog.i18n.DateTimePatterns_fr_MF","~$goog.i18n.DateTimePatterns_saq","~$goog.i18n.DateTimePatterns_sah","~$goog.i18n.DateTimePatterns-fr-BF","~$goog.i18n.DateTimePatterns-sk-SK","~$goog.i18n.DateTimePatterns_yue_Hans","~$goog.i18n.DateTimePatterns-rwk","~$goog.i18n.DateTimePatterns_qu_BO","~$goog.i18n.DateTimePatterns-en-NG","~$goog.i18n.DateTimePatterns-sd-PK","~$goog.i18n.DateTimePatterns_mer_KE","~$goog.i18n.DateTimePatterns_az_Cyrl","~$goog.i18n.DateTimePatterns-nl-NL","~$goog.i18n.DateTimePatterns_ff_Latn_GW","~$goog.i18n.DateTimePatterns-en-150","~$goog.i18n.DateTimePatterns_hr_HR","~$goog.i18n.DateTimePatterns-ar-IQ","~$goog.i18n.DateTimePatterns_ha_NE","~$goog.i18n.DateTimePatterns-fur","~$goog.i18n.DateTimePatterns_ar_IL","~$goog.i18n.DateTimePatterns_bas","~$goog.i18n.DateTimePatterns-zu-ZA","~$goog.i18n.DateTimePatterns-luy-KE","~$goog.i18n.DateTimePatterns-en-AG","~$goog.i18n.DateTimePatterns-en-BI","~$goog.i18n.DateTimePatterns-nl-BE","~$goog.i18n.DateTimePatterns_es_PY","~$goog.i18n.DateTimePatterns-es-PA","~$goog.i18n.DateTimePatterns-fy","~$goog.i18n.DateTimePatterns_brx_IN","~$goog.i18n.DateTimePatterns-ps-PK","~$goog.i18n.DateTimePatterns-om","~$goog.i18n.DateTimePatterns-vai-Latn-LR","~$goog.i18n.DateTimePatterns_en_LR","~$goog.i18n.DateTimePatterns_am_ET","~$goog.i18n.DateTimePatterns-en-GD","~$goog.i18n.DateTimePatterns_mk_MK","~$goog.i18n.DateTimePatterns-ar-DJ","~$goog.i18n.DateTimePatterns-ar-MA","~$goog.i18n.DateTimePatterns-ff-Latn-SN","~$goog.i18n.DateTimePatterns_fr_FR","~$goog.i18n.DateTimePatterns_fr_SC","~$goog.i18n.DateTimePatterns_kl_GL","~$goog.i18n.DateTimePatterns_yo_NG","~$goog.i18n.DateTimePatterns_es_VE","~$goog.i18n.DateTimePatterns_ce_RU","~$goog.i18n.DateTimePatterns_sq_MK","~$goog.i18n.DateTimePatterns_fr_WF","~$goog.i18n.DateTimePatterns-en-NZ","~$goog.i18n.DateTimePatterns_en_VC","~$goog.i18n.DateTimePatterns_lb_LU","~$goog.i18n.DateTimePatterns-bm","~$goog.i18n.DateTimePatterns-so-KE","~$goog.i18n.DateTimePatterns_ti","~$goog.i18n.DateTimePatterns-ar-EH","~$goog.i18n.DateTimePatterns-cs-CZ","~$goog.i18n.DateTimePatterns-ln-CG","~$goog.i18n.DateTimePatterns_mzn_IR","~$goog.i18n.DateTimePatterns_sr_Cyrl","~$goog.i18n.DateTimePatterns-agq","~$goog.i18n.DateTimePatterns-kok-IN","~$goog.i18n.DateTimePatterns-uz-Cyrl","~$goog.i18n.DateTimePatterns_en_WS","~$goog.i18n.DateTimePatterns-ur-IN","~$goog.i18n.DateTimePatterns-kw","~$goog.i18n.DateTimePatterns_qu","~$goog.i18n.DateTimePatterns-wo-SN","~$goog.i18n.DateTimePatterns-kok","~$goog.i18n.DateTimePatterns-shi-Tfng-MA","~$goog.i18n.DateTimePatterns-tt-RU","~$goog.i18n.DateTimePatterns_jmc_TZ","~$goog.i18n.DateTimePatterns-fr-RW","~$goog.i18n.DateTimePatterns-pt-MO","~$goog.i18n.DateTimePatterns-kln-KE","~$goog.i18n.DateTimePatterns_de_DE","~$goog.i18n.DateTimePatterns-ln-AO","~$goog.i18n.DateTimePatterns-xog-UG","~$goog.i18n.DateTimePatterns_en_PG","~$goog.i18n.DateTimePatterns-en-IO","~$goog.i18n.DateTimePatterns_zu_ZA","~$goog.i18n.DateTimePatterns-en-BW","~$goog.i18n.DateTimePatterns-ha-NG","~$goog.i18n.DateTimePatterns_ru_KG","~$goog.i18n.DateTimePatterns_mas_TZ","~$goog.i18n.DateTimePatterns-shi-Tfng","~$goog.i18n.DateTimePatterns-dyo","~$goog.i18n.DateTimePatterns-en-GG","~$goog.i18n.DateTimePatterns-saq-KE","~$goog.i18n.DateTimePatterns_ak","~$goog.i18n.DateTimePatterns-en-DG","~$goog.i18n.DateTimePatterns_en_MG","~$goog.i18n.DateTimePatterns_sw_KE","~$goog.i18n.DateTimePatterns-hr-HR","~$goog.i18n.DateTimePatterns-tg-TJ","~$goog.i18n.DateTimePatterns_pl_PL","~$goog.i18n.DateTimePatterns_es_GQ","~$goog.i18n.DateTimePatterns_ne_NP","~$goog.i18n.DateTimePatterns_fr_RW","~$goog.i18n.DateTimePatterns_ar_KW","~$goog.i18n.DateTimePatterns-sr-Latn-ME","~$goog.i18n.DateTimePatterns-ff","~$goog.i18n.DateTimePatterns_ru_RU","~$goog.i18n.DateTimePatterns_en_AI","~$goog.i18n.DateTimePatterns_bs_Latn_BA","~$goog.i18n.DateTimePatterns-pa-Guru","~$goog.i18n.DateTimePatterns-en-AE","~$goog.i18n.DateTimePatterns_uz_Latn_UZ","~$goog.i18n.DateTimePatterns-ce-RU","~$goog.i18n.DateTimePatterns_rwk","~$goog.i18n.DateTimePatterns-en-BZ","~$goog.i18n.DateTimePatterns_fr_ML","~$goog.i18n.DateTimePatterns-es-NI","~$goog.i18n.DateTimePatterns-ro-RO","~$goog.i18n.DateTimePatterns-is-IS","~$goog.i18n.DateTimePatterns_as_IN","~$goog.i18n.DateTimePatterns-se-SE","~$goog.i18n.DateTimePatterns_en_NG","~$goog.i18n.DateTimePatterns-ru-RU","~$goog.i18n.DateTimePatterns-nyn-UG","~$goog.i18n.DateTimePatterns-hsb","~$goog.i18n.DateTimePatterns_so_DJ","~$goog.i18n.DateTimePatterns-fr-LU","~$goog.i18n.DateTimePatterns_shi_Latn_MA","~$goog.i18n.DateTimePatterns-ckb-IQ","~$goog.i18n.DateTimePatterns-ewo","~$goog.i18n.DateTimePatterns_th_TH","~$goog.i18n.DateTimePatterns-qu-BO","~$goog.i18n.DateTimePatterns-bo-IN","~$goog.i18n.DateTimePatterns_nl_BE","~$goog.i18n.DateTimePatterns_ksb","~$goog.i18n.DateTimePatterns_ewo","~$goog.i18n.DateTimePatterns-es-BZ","~$goog.i18n.DateTimePatterns-kab","~$goog.i18n.DateTimePatterns_fr_SN","~$goog.i18n.DateTimePatterns_seh_MZ","~$goog.i18n.DateTimePatterns_twq","~$goog.i18n.DateTimePatterns-el-CY","~$goog.i18n.DateTimePatterns_ne_IN","~$goog.i18n.DateTimePatterns-en-SH","~$goog.i18n.DateTimePatterns-es-PY","~$goog.i18n.DateTimePatterns_en_SS","~$goog.i18n.DateTimePatterns-fr-MR","~$goog.i18n.DateTimePatterns-nnh-CM","~$goog.i18n.DateTimePatterns-tr-TR","~$goog.i18n.DateTimePatterns_en_FM","~$goog.i18n.DateTimePatterns_bm","~$goog.i18n.DateTimePatterns-ps-AF","~$goog.i18n.DateTimePatterns-ks","~$goog.i18n.DateTimePatterns-de-DE","~$goog.i18n.DateTimePatterns-fy-NL","~$goog.i18n.DateTimePatterns-gv","~$goog.i18n.DateTimePatterns-sbp-TZ","~$goog.i18n.DateTimePatterns_ka_GE","~$goog.i18n.DateTimePatterns-lb-LU","~$goog.i18n.DateTimePatterns-ff-Latn-GN","~$goog.i18n.DateTimePatterns-tk-TM","~$goog.i18n.DateTimePatterns-en-VC","~$goog.i18n.DateTimePatterns-it-SM","~$goog.i18n.DateTimePatterns-sd","~$goog.i18n.DateTimePatterns_fr_CI","~$goog.i18n.DateTimePatterns-ta-IN","~$goog.i18n.DateTimePatterns_pt_MZ","~$goog.i18n.DateTimePatterns-luo-KE","~$goog.i18n.DateTimePatterns_en_TV","~$goog.i18n.DateTimePatterns-en-ZM","~$goog.i18n.DateTimePatterns-nl-CW","~$goog.i18n.DateTimePatterns-se-FI","~$goog.i18n.DateTimePatterns-gsw-FR","~$goog.i18n.DateTimePatterns_sr_Cyrl_ME","~$goog.i18n.DateTimePatterns-en-PR","~$goog.i18n.DateTimePatterns_nmg","~$goog.i18n.DateTimePatterns_chr_US","~$goog.i18n.DateTimePatterns-en-TZ","~$goog.i18n.DateTimePatterns-af-NA","~$goog.i18n.DateTimePatterns_es_GT","~$goog.i18n.DateTimePatterns-qu-EC","~$goog.i18n.DateTimePatterns_fil_PH","~$goog.i18n.DateTimePatterns_to_TO","~$goog.i18n.DateTimePatterns_sv_FI","~$goog.i18n.DateTimePatterns-mfe","~$goog.i18n.DateTimePatterns-ar-TN","~$goog.i18n.DateTimePatterns_en_MS","~$goog.i18n.DateTimePatterns-te-IN","~$goog.i18n.DateTimePatterns_en_GY","~$goog.i18n.DateTimePatterns-en-NU","~$goog.i18n.DateTimePatterns_ceb_PH","~$goog.i18n.DateTimePatterns-dsb","~$goog.i18n.DateTimePatterns_agq","~$goog.i18n.DateTimePatterns-ar-OM","~$goog.i18n.DateTimePatterns_rm_CH","~$goog.i18n.DateTimePatterns_fr_CF","~$goog.i18n.DateTimePatterns_fr_MG","~$goog.i18n.DateTimePatterns-lrc","~$goog.i18n.DateTimePatterns-hsb-DE","~$goog.i18n.DateTimePatterns_khq_ML","~$goog.i18n.DateTimePatterns-yo","~$goog.i18n.DateTimePatterns_ps_AF","~$goog.i18n.DateTimePatterns_ebu_KE","~$goog.i18n.DateTimePatterns-nus-SS","~$goog.i18n.DateTimePatterns_de_LI","~$goog.i18n.DateTimePatterns_gu_IN","~$goog.i18n.DateTimePatterns_ar_SD","~$goog.i18n.DateTimePatterns_wae","~$goog.i18n.DateTimePatterns-nds-NL","~$goog.i18n.DateTimePatterns-es-PH","~$goog.i18n.DateTimePatterns_en_SB","~$goog.i18n.DateTimePatterns-rw","~$goog.i18n.DateTimePatterns_sn_ZW","~$goog.i18n.DateTimePatterns_bem","~$goog.i18n.DateTimePatterns-da-GL","~$goog.i18n.DateTimePatterns_ha_GH","~$goog.i18n.DateTimePatterns_as","~$goog.i18n.DateTimePatterns-en-001","~$goog.i18n.DateTimePatterns-pt-GQ","~$goog.i18n.DateTimePatterns-rm","~$goog.i18n.DateTimePatterns_fr_BE","~$goog.i18n.DateTimePatterns_mfe_MU","~$goog.i18n.DateTimePatterns-ga-IE","~$goog.i18n.DateTimePatterns-bs-Cyrl","~$goog.i18n.DateTimePatterns-it-CH","~$goog.i18n.DateTimePatterns-fr-GN","~$goog.i18n.DateTimePatterns_ks_IN","~$goog.i18n.DateTimePatterns-sr-Latn-BA","~$goog.i18n.DateTimePatterns-mk-MK","~$goog.i18n.DateTimePatterns_nnh","~$goog.i18n.DateTimePatterns_es_BO","~$goog.i18n.DateTimePatterns-kkj-CM","~$goog.i18n.DateTimePatterns-ig","~$goog.i18n.DateTimePatterns-sr-Cyrl","~$goog.i18n.DateTimePatterns_dz","~$goog.i18n.DateTimePatterns_es_PA","~$goog.i18n.DateTimePatterns_dje","~$goog.i18n.DateTimePatterns-to","~$goog.i18n.DateTimePatterns_dyo_SN","~$goog.i18n.DateTimePatterns-ro-MD","~$goog.i18n.DateTimePatterns-ne-NP","~$goog.i18n.DateTimePatterns_en_BM","~$goog.i18n.DateTimePatterns_ee_TG","~$goog.i18n.DateTimePatterns-wae-CH","~$goog.i18n.DateTimePatterns_fr_VU","~$goog.i18n.DateTimePatterns_hsb_DE","~$goog.i18n.DateTimePatterns-hu-HU","~$goog.i18n.DateTimePatterns_zh_Hant_MO","~$goog.i18n.DateTimePatterns-ar-KM","~$goog.i18n.DateTimePatterns-fr-PF","~$goog.i18n.DateTimePatterns_kok","~$goog.i18n.DateTimePatterns_sd","~$goog.i18n.DateTimePatterns-lu","~$goog.i18n.DateTimePatterns-en-GM","~$goog.i18n.DateTimePatterns-fr-RE","~$goog.i18n.DateTimePatterns-yue-Hant-HK","~$goog.i18n.DateTimePatterns-lkt","~$goog.i18n.DateTimePatterns_fr_MA","~$goog.i18n.DateTimePatterns_bm_ML","~$goog.i18n.DateTimePatterns_sg_CF","~$goog.i18n.DateTimePatterns_cs_CZ","~$goog.i18n.DateTimePatterns_es_CR","~$goog.i18n.DateTimePatterns_asa","~$goog.i18n.DateTimePatterns_es_DO","~$goog.i18n.DateTimePatterns-so-SO","~$goog.i18n.DateTimePatterns_mgh_MZ","~$goog.i18n.DateTimePatterns_gsw_LI","~$goog.i18n.DateTimePatterns-tr-CY","~$goog.i18n.DateTimePatterns-sg-CF","~$goog.i18n.DateTimePatterns-fr-NE","~$goog.i18n.DateTimePatterns-gd-GB","~$goog.i18n.DateTimePatterns-fr-DJ","~$goog.i18n.DateTimePatterns-jmc","~$goog.i18n.DateTimePatterns_ar_KM","~$goog.i18n.DateTimePatterns_mgo","~$goog.i18n.DateTimePatterns_ru_UA","~$goog.i18n.DateTimePatterns_fr_MR","~$goog.i18n.DateTimePatterns_ff_Latn_BF","~$goog.i18n.DateTimePatterns-zgh","~$goog.i18n.DateTimePatterns_shi","~$goog.i18n.DateTimePatterns-ar-LB","~$goog.i18n.DateTimePatterns-ff-Latn-CM","~$goog.i18n.DateTimePatterns-fr-TG","~$goog.i18n.DateTimePatterns_ff_Latn_CM","~$goog.i18n.DateTimePatterns-en-MG","~$goog.i18n.DateTimePatterns_luy_KE","~$goog.i18n.DateTimePatterns-rof","~$goog.i18n.DateTimePatterns_en_CH","~$goog.i18n.DateTimePatterns-dav-KE","~$goog.i18n.DateTimePatterns_eu_ES","~$goog.i18n.DateTimePatterns_hi_IN","~$goog.i18n.DateTimePatterns_jgo","~$goog.i18n.DateTimePatterns_bs_Cyrl","~$goog.i18n.DateTimePatterns_km_KH","~$goog.i18n.DateTimePatterns_qu_EC","~$goog.i18n.DateTimePatterns-en-PG","~$goog.i18n.DateTimePatterns-mer","~$goog.i18n.DateTimePatterns_kk_KZ","~$goog.i18n.DateTimePatterns-sw-KE","~$goog.i18n.DateTimePatterns_en_MU","~$goog.i18n.DateTimePatterns-ms-SG","~$goog.i18n.DateTimePatterns_gl_ES","~$goog.i18n.DateTimePatterns-hi-IN","~$goog.i18n.DateTimePatterns_lg","~$goog.i18n.DateTimePatterns-de-BE","~$goog.i18n.DateTimePatterns_es_EA","~$goog.i18n.DateTimePatterns_ru_KZ","~$goog.i18n.DateTimePatterns-en-VU","~$goog.i18n.DateTimePatterns_mg","~$goog.i18n.DateTimePatterns-chr-US","~$goog.i18n.DateTimePatterns-en-MO","~$goog.i18n.DateTimePatterns-naq","~$goog.i18n.DateTimePatterns-guz-KE","~$goog.i18n.DateTimePatterns-vai","~$goog.i18n.DateTimePatterns-en-AI","~$goog.i18n.DateTimePatterns_en_PN","~$goog.i18n.DateTimePatterns-rn-BI","~$goog.i18n.DateTimePatterns_zh_Hans_SG","~$goog.i18n.DateTimePatterns-ii","~$goog.i18n.DateTimePatterns_en_BZ","~$goog.i18n.DateTimePatterns_fr_TN","~$goog.i18n.DateTimePatterns-bem","~$goog.i18n.DateTimePatterns-en-PW","~$goog.i18n.DateTimePatterns-da-DK","~$goog.i18n.DateTimePatterns_id_ID","~$goog.i18n.DateTimePatterns-pt-LU","~$goog.i18n.DateTimePatterns-fr-FR","~$goog.i18n.DateTimePatterns_vai_Latn","~$goog.i18n.DateTimePatterns_mzn","~$goog.i18n.DateTimePatterns_ff_Latn_NE","~$goog.i18n.DateTimePatterns-kln","~$goog.i18n.DateTimePatterns-agq-CM","~$goog.i18n.DateTimePatterns_zh_Hans_MO","~$goog.i18n.DateTimePatterns-en-TV","~$goog.i18n.DateTimePatterns_dav","~$goog.i18n.DateTimePatterns_tr_TR","~$goog.i18n.DateTimePatterns_ii","~$goog.i18n.DateTimePatterns_ar_SO","~$goog.i18n.DateTimePatterns-es-CU","~$goog.i18n.DateTimePatterns-kab-DZ","~$goog.i18n.DateTimePatterns_tk","~$goog.i18n.DateTimePatterns-en-UG","~$goog.i18n.DateTimePatterns_ar_MR","~$goog.i18n.DateTimePatterns_vun_TZ","~$goog.i18n.DateTimePatterns_en_IO","~$goog.i18n.DateTimePatterns-ksb","~$goog.i18n.DateTimePatterns-ki","~$goog.i18n.DateTimePatterns-fr-GP","~$goog.i18n.DateTimePatterns_sr_Cyrl_BA","~$goog.i18n.DateTimePatterns_vai_Vaii_LR","~$goog.i18n.DateTimePatterns-ms-MY","~$goog.i18n.DateTimePatterns-id-ID","~$goog.i18n.DateTimePatterns_mn_MN","~$goog.i18n.DateTimePatterns_ta_SG","~$goog.i18n.DateTimePatterns-en-GY","~$goog.i18n.DateTimePatterns-jmc-TZ","~$goog.i18n.DateTimePatterns-luo","~$goog.i18n.DateTimePatterns-ha-NE","~$goog.i18n.DateTimePatterns_teo_UG","~$goog.i18n.DateTimePatterns-khq","~$goog.i18n.DateTimePatterns-en-GU","~$goog.i18n.DateTimePatterns_en_GH","~$goog.i18n.DateTimePatterns-zh-Hant","~$goog.i18n.DateTimePatterns-ak-GH","~$goog.i18n.DateTimePatterns-fr-BI","~$goog.i18n.DateTimePatterns-fr-MU","~$goog.i18n.DateTimePatterns-lb","~$goog.i18n.DateTimePatterns-ko-KR","~$goog.i18n.DateTimePatterns_da_DK","~$goog.i18n.DateTimePatterns_ca_AD","~$goog.i18n.DateTimePatterns_es_EC","~$goog.i18n.DateTimePatterns_gsw_CH","~$goog.i18n.DateTimePatterns_zgh_MA","~$goog.i18n.DateTimePatterns_en_DG","~$goog.i18n.DateTimePatterns_saq_KE","~$goog.i18n.DateTimePatterns_rn_BI","~$goog.i18n.DateTimePatterns-seh-MZ","~$goog.i18n.DateTimePatterns_lrc_IQ","~$goog.i18n.DateTimePatterns-ti","~$goog.i18n.DateTimePatterns-dav","~$goog.i18n.DateTimePatterns_teo","~$goog.i18n.DateTimePatterns_ml_IN","~$goog.i18n.DateTimePatterns-ig-NG","~$goog.i18n.DateTimePatterns_en_SD","~$goog.i18n.DateTimePatterns_fr_MU","~$goog.i18n.DateTimePatterns_en_CM","~$goog.i18n.DateTimePatterns_nnh_CM","~$goog.i18n.DateTimePatterns-es-EC","~$goog.i18n.DateTimePatterns_en_TO","~$goog.i18n.DateTimePatterns-en-JE","~$goog.i18n.DateTimePatterns-az-Cyrl-AZ","~$goog.i18n.DateTimePatterns_lag","~$goog.i18n.DateTimePatterns-dyo-SN","~$goog.i18n.DateTimePatterns_vai","~$goog.i18n.DateTimePatterns-fr-SC","~$goog.i18n.DateTimePatterns-en-KN","~$goog.i18n.DateTimePatterns-ka-GE","~$goog.i18n.DateTimePatterns_ses_ML","~$goog.i18n.DateTimePatterns-en-TO","~$goog.i18n.DateTimePatterns_ar_JO","~$goog.i18n.DateTimePatterns_en_GM","~$goog.i18n.DateTimePatterns_sbp","~$goog.i18n.DateTimePatterns-en-HK","~$goog.i18n.DateTimePatterns_sv_AX","~$goog.i18n.DateTimePatterns_fr_BL","~$goog.i18n.DateTimePatterns_guz","~$goog.i18n.DateTimePatterns-zh-Hant-HK","~$goog.i18n.DateTimePatterns-tt","~$goog.i18n.DateTimePatterns_bez","~$goog.i18n.DateTimePatterns_sn","~$goog.i18n.DateTimePatterns-ar-KW","~$goog.i18n.DateTimePatterns-fi-FI","~$goog.i18n.DateTimePatterns_ff_Latn_SN","~$goog.i18n.DateTimePatterns-twq","~$goog.i18n.DateTimePatterns-en-AT","~$goog.i18n.DateTimePatterns-rn","~$goog.i18n.DateTimePatterns_ga_IE","~$goog.i18n.DateTimePatterns-ii-CN","~$goog.i18n.DateTimePatterns_ps","~$goog.i18n.DateTimePatterns-bas","~$goog.i18n.DateTimePatterns-ar-ER","~$goog.i18n.DateTimePatterns-se","~$goog.i18n.DateTimePatterns-en-PH","~$goog.i18n.DateTimePatterns_smn","~$goog.i18n.DateTimePatterns-sr-Cyrl-ME","~$goog.i18n.DateTimePatterns-en-IM","~$goog.i18n.DateTimePatterns_en_ZM","~$goog.i18n.DateTimePatterns-ar-BH","~$goog.i18n.DateTimePatterns_lkt_US","~$goog.i18n.DateTimePatterns-mg-MG","~$goog.i18n.DateTimePatterns-om-ET","~$goog.i18n.DateTimePatterns-en-FJ","~$goog.i18n.DateTimePatterns-en-NL","~$goog.i18n.DateTimePatterns-tzm-MA","~$goog.i18n.DateTimePatterns_tt_RU","~$goog.i18n.DateTimePatterns-ca-IT","~$goog.i18n.DateTimePatterns_en_GU","~$goog.i18n.DateTimePatterns_bem_ZM","~$goog.i18n.DateTimePatterns_os","~$goog.i18n.DateTimePatterns_nn_NO","~$goog.i18n.DateTimePatterns_om_KE","~$goog.i18n.DateTimePatterns_ii_CN","~$goog.i18n.DateTimePatterns_nb_SJ","~$goog.i18n.DateTimePatterns-fr-GF","~$goog.i18n.DateTimePatterns_kw_GB","~$goog.i18n.DateTimePatterns_sr_Latn_RS","~$goog.i18n.DateTimePatterns-ru-BY","~$goog.i18n.DateTimePatterns_en_NR","~$goog.i18n.DateTimePatterns-mua-CM","~$goog.i18n.DateTimePatterns-ff-Latn","~$goog.i18n.DateTimePatterns-yo-BJ","~$goog.i18n.DateTimePatterns_ar_TD","~$goog.i18n.DateTimePatterns_sq_XK","~$goog.i18n.DateTimePatterns-lg-UG","~$goog.i18n.DateTimePatterns_pt_LU","~$goog.i18n.DateTimePatterns-es-UY","~$goog.i18n.DateTimePatterns_fr_MQ","~$goog.i18n.DateTimePatterns-nds-DE","~$goog.i18n.DateTimePatterns_bo_IN","~$goog.i18n.DateTimePatterns-mt-MT","~$goog.i18n.DateTimePatterns_dsb_DE","~$goog.i18n.DateTimePatterns-pl-PL","~$goog.i18n.DateTimePatterns-guz","~$goog.i18n.DateTimePatterns-luy","~$goog.i18n.DateTimePatterns-yue","~$goog.i18n.DateTimePatterns_ar_AE","~$goog.i18n.DateTimePatterns-bo-CN","~$goog.i18n.DateTimePatterns_pt_CV","~$goog.i18n.DateTimePatterns-kam","~$goog.i18n.DateTimePatterns_zh_Hant_TW","~$goog.i18n.DateTimePatterns_sq_AL","~$goog.i18n.DateTimePatterns_yue","~$goog.i18n.DateTimePatterns-mn-MN","~$goog.i18n.DateTimePatterns_hr_BA","~$goog.i18n.DateTimePatterns_br_FR","~$goog.i18n.DateTimePatterns-zh-Hans-MO","~$goog.i18n.DateTimePatterns_naq_NA","~$goog.i18n.DateTimePatterns_kln","~$goog.i18n.DateTimePatterns_mer","~$goog.i18n.DateTimePatterns_kl","~$goog.i18n.DateTimePatterns-fil-PH","~$goog.i18n.DateTimePatterns-lag","~$goog.i18n.DateTimePatterns_en_IL","~$goog.i18n.DateTimePatterns_lo_LA","~$goog.i18n.DateTimePatterns_ast","~$goog.i18n.DateTimePatterns_en_JE","~$goog.i18n.DateTimePatterns-es-SV","~$goog.i18n.DateTimePatterns_uz_Latn","~$goog.i18n.DateTimePatterns-ne-IN","~$goog.i18n.DateTimePatterns-nb-NO","~$goog.i18n.DateTimePatterns_tt","~$goog.i18n.DateTimePatterns_it_SM","~$goog.i18n.DateTimePatterns_en_AS","~$goog.i18n.DateTimePatterns-en-FI","~$goog.i18n.DateTimePatterns-bn-BD","~$goog.i18n.DateTimePatterns-sah-RU","~$goog.i18n.DateTimePatterns-ses-ML","~$goog.i18n.DateTimePatterns-teo-KE","~$goog.i18n.DateTimePatterns_en_RW","~$goog.i18n.DateTimePatterns-se-NO","~$goog.i18n.DateTimePatterns_nyn_UG","~$goog.i18n.DateTimePatterns_pt_GQ","~$goog.i18n.DateTimePatterns_tg_TJ","~$goog.i18n.DateTimePatterns_gv_IM","~$goog.i18n.DateTimePatterns_dje_NE","~$goog.i18n.DateTimePatterns_ewo_CM","~$goog.i18n.DateTimePatterns-so-ET","~$goog.i18n.DateTimePatterns_jgo_CM","~$goog.i18n.DateTimePatterns-ha","~$goog.i18n.DateTimePatterns_en_ZW","~$goog.i18n.DateTimePatterns-ar-MR","~$goog.i18n.DateTimePatterns_ta_MY","~$goog.i18n.DateTimePatterns_tg","~$goog.i18n.DateTimePatterns-nl-AW","~$goog.i18n.DateTimePatterns-ta-MY","~$goog.i18n.DateTimePatterns-ar-TD","~$goog.i18n.DateTimePatterns-zh-Hans-SG","~$goog.i18n.DateTimePatterns-mr-IN","~$goog.i18n.DateTimePatterns_dyo","~$goog.i18n.DateTimePatterns-mzn-IR","~$goog.i18n.DateTimePatterns_ta_LK","~$goog.i18n.DateTimePatterns-dz-BT","~$goog.i18n.DateTimePatterns_en_KY","~$goog.i18n.DateTimePatterns-es-GQ","~$goog.i18n.DateTimePatterns_so","~$goog.i18n.DateTimePatterns_en_IM","~$goog.i18n.DateTimePatterns-es-EA","~$goog.i18n.DateTimePatterns-my-MM","~$goog.i18n.DateTimePatterns-tzm","~$goog.i18n.DateTimePatterns-shi","~$goog.i18n.DateTimePatterns-sw-CD","~$goog.i18n.DateTimePatterns_te_IN","~$goog.i18n.DateTimePatterns_en_SI","~$goog.i18n.DateTimePatterns_wo_SN","~$goog.i18n.DateTimePatterns-ff-Latn-MR","~$goog.i18n.DateTimePatterns-mgo-CM","~$goog.i18n.DateTimePatternsExt","~$goog.i18n.DateTimePatterns-uk-UA","~$goog.i18n.DateTimePatterns-ia-001","~$goog.i18n.DateTimePatterns-el-GR","~$goog.i18n.DateTimePatterns_fur","~$goog.i18n.DateTimePatterns_el_CY","~$goog.i18n.DateTimePatterns_sl_SI","~$goog.i18n.DateTimePatterns-xh","~$goog.i18n.DateTimePatterns_fr_PF","~$goog.i18n.DateTimePatterns-ta-SG","~$goog.i18n.DateTimePatterns-wo","~$goog.i18n.DateTimePatterns_en_AT","~$goog.i18n.DateTimePatterns-es-BR","~$goog.i18n.DateTimePatterns_ks","~$goog.i18n.DateTimePatterns-sr-Cyrl-RS","~$goog.i18n.DateTimePatterns_fr_GF","~$goog.i18n.DateTimePatterns_ar_BH","~$goog.i18n.DateTimePatterns-fr-VU","~$goog.i18n.DateTimePatterns_zh_Hant_HK","~$goog.i18n.DateTimePatterns_az_Latn_AZ","~$goog.i18n.DateTimePatterns-fr-CH","~$goog.i18n.DateTimePatterns-en-MS","~$goog.i18n.DateTimePatterns-naq-NA","~$goog.i18n.DateTimePatterns_ha_NG","~$goog.i18n.DateTimePatterns_ur_PK","~$goog.i18n.DateTimePatterns_es_CU","~$goog.i18n.DateTimePatterns-it-IT","~$goog.i18n.DateTimePatterns_en_FI","~$goog.i18n.DateTimePatterns_fr_RE","~$goog.i18n.DateTimePatterns_es_BZ","~$goog.i18n.DateTimePatterns_tzm_MA","~$goog.i18n.DateTimePatterns-sr-Latn-RS","~$goog.i18n.DateTimePatterns-tg","~$goog.i18n.DateTimePatterns-ff-Latn-GW","~$goog.i18n.DateTimePatterns_nus_SS","~$goog.i18n.DateTimePatterns-nus","~$goog.i18n.DateTimePatterns-en-VG","~$goog.i18n.DateTimePatterns_nmg_CM","~$goog.i18n.DateTimePatterns_ff_Latn_SL","~$goog.i18n.DateTimePatterns_vi_VN","~$goog.i18n.DateTimePatterns-bm-ML","~$goog.i18n.DateTimePatterns-pa-Arab","~$goog.i18n.DateTimePatterns_agq_CM","~$goog.i18n.DateTimePatterns_es_CO","~$goog.i18n.DateTimePatterns-ln-CF","~$goog.i18n.DateTimePatterns_nd_ZW","~$goog.i18n.DateTimePatterns-sg","~$goog.i18n.DateTimePatterns_en_DM","~$goog.i18n.DateTimePatterns-bas-CM","~$goog.i18n.DateTimePatterns-kam-KE","~$goog.i18n.DateTimePatterns-sr-Latn-XK","~$goog.i18n.DateTimePatterns-kl-GL","~$goog.i18n.DateTimePatterns_cgg","~$goog.i18n.DateTimePatterns-en-RW","~$goog.i18n.DateTimePatterns_jv_ID","~$goog.i18n.DateTimePatterns_dua","~$goog.i18n.DateTimePatterns-mer-KE","~$goog.i18n.DateTimePatterns-ksf-CM","~$goog.i18n.DateTimePatterns_hu_HU","~$goog.i18n.DateTimePatterns-zh-Hans-HK","~$goog.i18n.DateTimePatterns_dsb","~$goog.i18n.DateTimePatterns-ia","~$goog.i18n.DateTimePatterns-fr-SY","~$goog.i18n.DateTimePatterns_el_GR","~$goog.i18n.DateTimePatterns-as","~$goog.i18n.DateTimePatterns-fr-MG","~$goog.i18n.DateTimePatterns-eo","~$goog.i18n.DateTimePatterns-fr-BE","~$goog.i18n.DateTimePatterns_sr_Cyrl_XK","~$goog.i18n.DateTimePatterns_luy","~$goog.i18n.DateTimePatterns_ff_Latn","~$goog.i18n.DateTimePatterns-ku","~$goog.i18n.DateTimePatterns-rof-TZ","~$goog.i18n.DateTimePatterns_es_PR","~$goog.i18n.DateTimePatterns-teo-UG","~$goog.i18n.DateTimePatterns-ug","~$goog.i18n.DateTimePatterns_kab_DZ","~$goog.i18n.DateTimePatterns-pa-Arab-PK","~$goog.i18n.DateTimePatterns_mr_IN","~$goog.i18n.DateTimePatterns-sw-TZ","~$goog.i18n.DateTimePatterns-nd","~$goog.i18n.DateTimePatterns_haw_US","~$goog.i18n.DateTimePatterns-ar-LY","~$goog.i18n.DateTimePatterns-ff-Latn-NG","~$goog.i18n.DateTimePatterns_sah_RU","~$goog.i18n.DateTimePatterns-en-FK","~$goog.i18n.DateTimePatterns_hsb","~$goog.i18n.DateTimePatterns_zh_Hant","~$goog.i18n.DateTimePatterns-en-MH","~$goog.i18n.DateTimePatterns_en_NF","~$goog.i18n.DateTimePatterns_fr_CG","~$goog.i18n.DateTimePatterns-en-JM","~$goog.i18n.DateTimePatterns_xog_UG","~$goog.i18n.DateTimePatterns-ar-AE","~$goog.i18n.DateTimePatterns-ee-TG","~$goog.i18n.DateTimePatterns_nds_NL","~$goog.i18n.DateTimePatterns_es_HN","~$goog.i18n.DateTimePatterns-ff-Latn-GM","~$goog.i18n.DateTimePatterns-khq-ML","~$goog.i18n.DateTimePatterns_en_NL","~$goog.i18n.DateTimePatterns-ar-XB","~$goog.i18n.DateTimePatterns-en-CC","~$goog.i18n.DateTimePatterns-ccp-IN","~$goog.i18n.DateTimePatterns_ku_TR","~$goog.i18n.DateTimePatterns-mi-NZ","~$goog.i18n.DateTimePatterns-am-ET","~$goog.i18n.DateTimePatterns-teo","~$goog.i18n.DateTimePatterns-nl-BQ","~$goog.i18n.DateTimePatterns-bez","~$goog.i18n.DateTimePatterns_es_BR","~$goog.i18n.DateTimePatterns-az-Latn-AZ","~$goog.i18n.DateTimePatterns_es_PH","~$goog.i18n.DateTimePatterns-de-IT","~$goog.i18n.DateTimePatterns-as-IN","~$goog.i18n.DateTimePatterns_bas_CM","~$goog.i18n.DateTimePatterns_nl_SR","~$goog.i18n.DateTimePatterns_ln_CG","~$goog.i18n.DateTimePatterns-ses","~$goog.i18n.DateTimePatterns_kde","~$goog.i18n.DateTimePatterns-ru-KZ","~$goog.i18n.DateTimePatterns-en-NR","~$goog.i18n.DateTimePatterns-so","~$goog.i18n.DateTimePatterns-en-SZ","~$goog.i18n.DateTimePatterns-it-VA","~$goog.i18n.DateTimePatterns-fr-CM","~$goog.i18n.DateTimePatterns-ti-ET","~$goog.i18n.DateTimePatterns-ug-CN","~$goog.i18n.DateTimePatterns-gsw-LI","~$goog.i18n.DateTimePatterns-ckb","~$goog.i18n.DateTimePatterns_jmc","~$goog.i18n.DateTimePatterns-nl-SR","~$goog.i18n.DateTimePatterns-kkj","~$goog.i18n.DateTimePatterns_en_TZ","~$goog.i18n.DateTimePatterns_gv","~$goog.i18n.DateTimePatterns-lo-LA","~$goog.i18n.DateTimePatterns_fa_AF","~$goog.i18n.DateTimePatterns-saq","~$goog.i18n.DateTimePatterns_pt_ST","~$goog.i18n.DateTimePatterns_ce","~$goog.i18n.DateTimePatterns_nl_BQ","~$goog.i18n.DateTimePatterns_uz_Arab","~$goog.i18n.DateTimePatterns_so_ET","~$goog.i18n.DateTimePatterns-pt-ST","~$goog.i18n.DateTimePatterns_smn_FI","~$goog.i18n.DateTimePatterns-ru-KG","~$goog.i18n.DateTimePatterns_ar_LB","~$goog.i18n.DateTimePatterns-vi-VN","~$goog.i18n.DateTimePatterns_zh_Hans_CN","~$goog.i18n.DateTimePatterns_ckb_IR","~$goog.i18n.DateTimePatterns_ast_ES","~$goog.i18n.DateTimePatterns_mua_CM","~$goog.i18n.DateTimePatterns_ti_ET","~$goog.i18n.DateTimePatterns-yue-Hans-CN","~$goog.i18n.DateTimePatterns-smn","~$goog.i18n.DateTimePatterns_nl_NL","~$goog.i18n.DateTimePatterns_en_DE","~$goog.i18n.DateTimePatterns_fr_YT","~$goog.i18n.DateTimePatterns_lu_CD","~$goog.i18n.DateTimePatterns_ar_IQ","~$goog.i18n.DateTimePatterns_bo_CN","~$goog.i18n.DateTimePatterns-fr-MQ","~$goog.i18n.DateTimePatterns-nmg","~$goog.i18n.DateTimePatterns-ru-UA","~$goog.i18n.DateTimePatterns_sw_UG","~$goog.i18n.DateTimePatterns_ff_Latn_LR","~$goog.i18n.DateTimePatterns_xh_ZA","~$goog.i18n.DateTimePatterns_ksh","~$goog.i18n.DateTimePatterns-vun-TZ","~$goog.i18n.DateTimePatterns_eo_001","~$goog.i18n.DateTimePatterns-sah","~$goog.i18n.DateTimePatterns-sr-Cyrl-XK","~$goog.i18n.DateTimePatterns-smn-FI","~$goog.i18n.DateTimePatterns_bg_BG","~$goog.i18n.DateTimePatterns_en_XA","~$goog.i18n.DateTimePatterns_en_KI","~$goog.i18n.DateTimePatterns-cy-GB","~$goog.i18n.DateTimePatterns-th-TH","~$goog.i18n.DateTimePatterns-ebu-KE","~$goog.i18n.DateTimePatterns_ms_BN","~$goog.i18n.DateTimePatterns-mgh-MZ","~$goog.i18n.DateTimePatterns_fr_BJ","~$goog.i18n.DateTimePatterns_ca_IT","~$goog.i18n.DateTimePatterns-rw-RW","~$goog.i18n.DateTimePatterns_en_GD","~$goog.i18n.DateTimePatterns-fr-BL","~$goog.i18n.DateTimePatterns_en_PH","~$goog.i18n.DateTimePatterns-en-LS","~$goog.i18n.DateTimePatterns-jv-ID","~$goog.i18n.DateTimePatterns-ky-KG","~$goog.i18n.DateTimePatterns-sr-Cyrl-BA","~$goog.i18n.DateTimePatterns-gd","~$goog.i18n.DateTimePatterns_mua","~$goog.i18n.DateTimePatterns_hy_AM","~$goog.i18n.DateTimePatterns-vai-Latn","~$goog.i18n.DateTimePatterns-ml-IN","~$goog.i18n.DateTimePatterns-lag-TZ","~$goog.i18n.DateTimePatterns-pt-CH","~$goog.i18n.DateTimePatterns_ps_PK","~$goog.i18n.DateTimePatterns_es_NI","~$goog.i18n.DateTimePatterns_ko_KR","~$goog.i18n.DateTimePatterns_en_MH","~$goog.i18n.DateTimePatterns_en_PR","~$goog.i18n.DateTimePatterns_rm","~$goog.i18n.DateTimePatterns_mt_MT","~$goog.i18n.DateTimePatterns-en-PN","~$goog.i18n.DateTimePatterns_nds_DE","~$goog.i18n.DateTimePatterns_pt_TL","~$goog.i18n.DateTimePatterns-sq-AL","~$goog.i18n.DateTimePatterns_ln_CF","~$goog.i18n.DateTimePatterns_bn_IN","~$goog.i18n.DateTimePatterns-lkt-US","~$goog.i18n.DateTimePatterns-en-WS","~$goog.i18n.DateTimePatterns-jgo-CM","~$goog.i18n.DateTimePatterns_dua_CM","~$goog.i18n.DateTimePatterns-en-IL","~$goog.i18n.DateTimePatterns_en_FJ","~$goog.i18n.DateTimePatterns_en_HK","~$goog.i18n.DateTimePatterns_kn_IN","~$goog.i18n.DateTimePatterns-os","~$goog.i18n.DateTimePatterns-en-MU","~$goog.i18n.DateTimePatterns_sr_Cyrl_RS","~$goog.i18n.DateTimePatterns_nds","~$goog.i18n.DateTimePatterns_ar_001","~$goog.i18n.DateTimePatterns_mi","~$goog.i18n.DateTimePatterns_ccp","~$goog.i18n.DateTimePatterns_ja_JP","~$goog.i18n.DateTimePatterns_cy_GB","~$goog.i18n.DateTimePatterns-ksh-DE","~$goog.i18n.DateTimePatterns-twq-NE","~$goog.i18n.DateTimePatterns_tk_TM","~$goog.i18n.DateTimePatterns-ar-QA","~$goog.i18n.DateTimePatterns-fr-WF","~$goog.i18n.DateTimePatterns-os-RU","~$goog.i18n.DateTimePatterns_en_VU","~$goog.i18n.DateTimePatterns_naq","~$goog.i18n.DateTimePatterns-mas-TZ","~$goog.i18n.DateTimePatterns-en-SB","~$goog.i18n.DateTimePatterns_nl_SX","~$goog.i18n.DateTimePatterns-es-CR","~$goog.i18n.DateTimePatterns-ewo-CM","~$goog.i18n.DateTimePatterns_pa_Guru","~$goog.i18n.DateTimePatterns_bez_TZ","~$goog.i18n.DateTimePatterns-nds","~$goog.i18n.DateTimePatterns_ksb_TZ","~$goog.i18n.DateTimePatterns-si-LK","~$goog.i18n.DateTimePatterns-bem-ZM","~$goog.i18n.DateTimePatterns-sq-MK","~$goog.i18n.DateTimePatterns-en-SE","~$goog.i18n.DateTimePatterns-cgg-UG","~$goog.i18n.DateTimePatterns_en_SX","~$goog.i18n.DateTimePatterns_ar_PS","~$goog.i18n.DateTimePatterns-or-IN","~$goog.i18n.DateTimePatterns-bs-Cyrl-BA","~$goog.i18n.DateTimePatterns_en_FK","~$goog.i18n.DateTimePatterns_nyn","~$goog.i18n.DateTimePatterns-en-ZW","~$goog.i18n.DateTimePatterns_zh_Hans_HK","~$goog.i18n.DateTimePatterns_be_BY","~$goog.i18n.DateTimePatterns-en-GH","~$goog.i18n.DateTimePatterns_gsw_FR","~$goog.i18n.DateTimePatterns-yo-NG","~$goog.i18n.DateTimePatterns-lrc-IQ","~$goog.i18n.DateTimePatterns_fr_LU","~$goog.i18n.DateTimePatterns_khq","~$goog.i18n.DateTimePatterns_ar_TN","~$goog.i18n.DateTimePatterns_ru_MD","~$goog.i18n.DateTimePatterns_xh","~$goog.i18n.DateTimePatterns_yue_Hant_HK","~$goog.i18n.DateTimePatterns_fr_MC","~$goog.i18n.DateTimePatterns-fr-MA","~$goog.i18n.DateTimePatterns_fr_GP","~$goog.i18n.DateTimePatterns-uz-Cyrl-UZ","~$goog.i18n.DateTimePatterns-dje","~$goog.i18n.DateTimePatterns_en_SC","~$goog.i18n.DateTimePatterns-shi-Latn-MA","~$goog.i18n.DateTimePatterns_az_Cyrl_AZ","~$goog.i18n.DateTimePatterns-brx-IN","~$goog.i18n.DateTimePatterns-en-CH","~$goog.i18n.DateTimePatterns_qu_PE","~$goog.i18n.DateTimePatterns-mua","~$goog.i18n.DateTimePatterns-fr-ML","~$goog.i18n.DateTimePatterns_ar_DJ","~$goog.i18n.DateTimePatterns-ast-ES","~$goog.i18n.DateTimePatterns_rw","~$goog.i18n.DateTimePatterns_vai_Vaii","~$goog.i18n.DateTimePatterns_to","~$goog.i18n.DateTimePatterns_az_Latn","~$goog.i18n.DateTimePatterns-sbp","~$goog.i18n.DateTimePatterns_en_NZ","~$goog.i18n.DateTimePatterns-kw-GB","~$goog.i18n.DateTimePatterns_ki_KE","~$goog.i18n.DateTimePatterns-yi-001","~$goog.i18n.DateTimePatterns_ar_LY","~$goog.i18n.DateTimePatterns_fa_IR","~$goog.i18n.DateTimePatterns-fr-HT","~$goog.i18n.DateTimePatterns_gd","~$goog.i18n.DateTimePatterns-en-MW","~$goog.i18n.DateTimePatterns_fy_NL","~$goog.i18n.DateTimePatterns_es_SV","~$goog.i18n.DateTimePatterns-mas-KE","~$goog.i18n.DateTimePatterns_en_CK","~$goog.i18n.DateTimePatterns-ar-001","~$goog.i18n.DateTimePatterns_en_CX","~$goog.i18n.DateTimePatterns_kok_IN","~$goog.i18n.DateTimePatterns_asa_TZ","~$goog.i18n.DateTimePatterns_ms_SG","~$goog.i18n.DateTimePatterns-fr-CF","~$goog.i18n.DateTimePatterns-bs-Latn-BA","~$goog.i18n.DateTimePatterns_om_ET","~$goog.i18n.DateTimePatterns-ceb-PH","~$goog.i18n.DateTimePatterns_en_BB","~$goog.i18n.DateTimePatterns-om-KE","~$goog.i18n.DateTimePatterns_ki","~$goog.i18n.DateTimePatterns-pt-CV","~$goog.i18n.DateTimePatterns-sw-UG","~$goog.i18n.DateTimePatterns_fr_KM","~$goog.i18n.DateTimePatterns-cgg","~$goog.i18n.DateTimePatterns-ebu","~$goog.i18n.DateTimePatterns_lb","~$goog.i18n.DateTimePatterns_gd_GB","~$goog.i18n.DateTimePatterns_xog","~$goog.i18n.DateTimePatterns-brx","~$goog.i18n.DateTimePatterns-en-SL","~$goog.i18n.DateTimePatterns-fo-DK","~$goog.i18n.DateTimePatterns_it_IT","~$goog.i18n.DateTimePatterns-kde","~$goog.i18n.DateTimePatterns_ar_MA","~$goog.i18n.DateTimePatterns-en-MP","~$goog.i18n.DateTimePatterns-nb-SJ","~$goog.i18n.DateTimePatterns_en_ER","~$goog.i18n.DateTimePatterns_nus","~$goog.i18n.DateTimePatterns-en-MY","~$goog.i18n.DateTimePatterns-fr-DZ","~$goog.i18n.DateTimePatterns_tzm","~$goog.i18n.DateTimePatterns_en_LC","~$goog.i18n.DateTimePatterns_eo","~$goog.i18n.DateTimePatterns_lv_LV","~$goog.i18n.DateTimePatterns_tr_CY","~$goog.i18n.DateTimePatterns-en-DK","~$goog.i18n.DateTimePatterns-haw-US","~$goog.i18n.DateTimePatterns-fa-AF","~$goog.i18n.DateTimePatterns_om","~$goog.i18n.DateTimePatterns_kde_TZ","~$goog.i18n.DateTimePatterns-en-TC","~$goog.i18n.DateTimePatterns_nn","~$goog.i18n.DateTimePatterns_kam_KE","~$goog.i18n.DateTimePatterns_is_IS","~$goog.i18n.DateTimePatterns_bo","~$goog.i18n.DateTimePatterns_en_SE","~$goog.i18n.DateTimePatterns-qu-PE","~$goog.i18n.DateTimePatterns-mas","~$goog.i18n.DateTimePatterns-ks-IN","~$goog.i18n.DateTimePatterns-en-LC","~$goog.i18n.DateTimePatterns-sv-FI","~$goog.i18n.DateTimePatterns-sq-XK","~$goog.i18n.DateTimePatterns-ccp-BD","~$goog.i18n.DateTimePatterns_de_BE","~$goog.i18n.DateTimePatterns-en-BB","~$goog.i18n.DateTimePatterns_ig_NG","~$goog.i18n.DateTimePatterns-fur-IT","~$goog.i18n.DateTimePatterns-mzn","~$goog.i18n.DateTimePatterns-ast","~$goog.i18n.DateTimePatterns_fr_SY","~$goog.i18n.DateTimePatterns-fr-TN","~$goog.i18n.DateTimePatterns-nl-SX","~$goog.i18n.DateTimePatterns_kln_KE","~$goog.i18n.DateTimePatterns-ee","~$goog.i18n.DateTimePatterns_fr_CD","~$goog.i18n.DateTimePatterns_fr_NE","~$goog.i18n.DateTimePatterns_en_KN","~$goog.i18n.DateTimePatterns-ku-TR","~$goog.i18n.DateTimePatterns-tk","~$goog.i18n.DateTimePatterns-ccp","~$goog.i18n.DateTimePatterns_fr_TD","~$goog.i18n.DateTimePatterns-kk-KZ","~$goog.i18n.DateTimePatterns-fr-CD","~$goog.i18n.DateTimePatterns_fr_HT","~$goog.i18n.DateTimePatterns_nd","~$goog.i18n.DateTimePatterns_ur_IN","~$goog.i18n.DateTimePatterns-he-IL","~$goog.i18n.DateTimePatterns-pt-GW","~$goog.i18n.DateTimePatterns_guz_KE","~$goog.i18n.DateTimePatterns-dua","~$goog.i18n.DateTimePatterns-es-GT","~$goog.i18n.DateTimePatterns_en_DK","~$goog.i18n.DateTimePatterns-ko-KP","~$goog.i18n.DateTimePatterns_fr_CH","~$goog.i18n.DateTimePatterns_pa_Guru_IN","~$goog.i18n.DateTimePatterns-to-TO","~$goog.i18n.DateTimePatterns-en-SC","~$goog.i18n.DateTimePatterns_se_NO","~$goog.i18n.DateTimePatterns_fr_BI","~$goog.i18n.DateTimePatterns_seh","~$goog.i18n.DateTimePatterns-ja-JP","~$goog.i18n.DateTimePatterns-ckb-IR","~$goog.i18n.DateTimePatterns-zh-Hant-MO","~$goog.i18n.DateTimePatterns_yi","~$goog.i18n.DateTimePatterns_ru_BY","~$goog.i18n.DateTimePatterns_sd_PK","~$goog.i18n.DateTimePatterns_fr_GQ","~$goog.i18n.DateTimePatterns-az-Latn","~$goog.i18n.DateTimePatterns-en-SX","~$goog.i18n.DateTimePatterns_sr_Latn_ME","~$goog.i18n.DateTimePatterns-en-ER","~$goog.i18n.DateTimePatterns_ku","~$goog.i18n.DateTimePatterns_ckb_IQ","~$goog.i18n.DateTimePatterns-kn-IN","~$goog.i18n.DateTimePatterns_en_CY","~$goog.i18n.DateTimePatterns_en_MP","~$goog.i18n.DateTimePatterns_os_GE","~$goog.i18n.DateTimePatterns_pt_AO","~$goog.i18n.DateTimePatterns-rm-CH","~$goog.i18n.DateTimePatterns-fo-FO","~$goog.i18n.DateTimePatterns_yue_Hant","~$goog.i18n.DateTimePatterns-en-GI","~$goog.i18n.DateTimePatterns_en_SH","~$goog.i18n.DateTimePatterns-es-PR","~$goog.i18n.DateTimePatterns_kw","~$goog.i18n.DateTimePatterns_en_SL","~$goog.i18n.DateTimePatterns_ksf","~$goog.i18n.DateTimePatterns_dav_KE","~$goog.i18n.DateTimePatterns_sbp_TZ","~$goog.i18n.DateTimePatterns_ceb","~$goog.i18n.DateTimePatterns_rof","~$goog.i18n.DateTimePatterns-fo","~$goog.i18n.DateTimePatterns-en-AS","~$goog.i18n.DateTimePatterns-gsw-CH","~$goog.i18n.DateTimePatterns_jv","~$goog.i18n.DateTimePatterns_fo_FO","~$goog.i18n.DateTimePatterns_uz_Cyrl","~$goog.i18n.DateTimePatterns_ar_QA","~$goog.i18n.DateTimePatterns-jgo","~$goog.i18n.DateTimePatterns-ca-FR","~$goog.i18n.DateTimePatterns-en-MT","~$goog.i18n.DateTimePatterns_en_BS","~$goog.i18n.DateTimePatterns_lt_LT","~$goog.i18n.DateTimePatterns-nmg-CM","~$goog.i18n.DateTimePatterns_en_JM","~$goog.i18n.DateTimePatterns-ta-LK","~$goog.i18n.DateTimePatterns-seh","~$goog.i18n.DateTimePatterns_yo_BJ","~$goog.i18n.DateTimePatterns-en-CM","~$goog.i18n.DateTimePatterns-zh-Hant-TW","~$goog.i18n.DateTimePatterns_ebu","~$goog.i18n.DateTimePatterns-ksf","~$goog.i18n.DateTimePatterns-wae","~$goog.i18n.DateTimePatterns_en_GI","~$goog.i18n.DateTimePatterns_ko_KP","~$goog.i18n.DateTimePatterns-mgh","~$goog.i18n.DateTimePatterns-es-HN","~$goog.i18n.DateTimePatterns_ln_AO","~$goog.i18n.DateTimePatterns-en-SI","~$goog.i18n.DateTimePatterns_ksf_CM","~$goog.i18n.DateTimePatterns-fr-BJ","~$goog.i18n.DateTimePatterns-es-AR","~$goog.i18n.DateTimePatterns_kea_CV","~$goog.i18n.DateTimePatterns_ca_FR","~$goog.i18n.DateTimePatterns-mfe-MU","~$goog.i18n.DateTimePatterns-ki-KE","~$goog.i18n.DateTimePatterns_bn_BD","~$goog.i18n.DateTimePatterns_it_CH","~$goog.i18n.DateTimePatterns-en-NF","~$goog.i18n.DateTimePatterns-asa-TZ","~$goog.i18n.DateTimePatterns_mg_MG","~$goog.i18n.DateTimePatterns-en-NA","~$goog.i18n.DateTimePatterns_sr_Latn_XK","~$goog.i18n.DateTimePatterns_ha","~$goog.i18n.DateTimePatterns-en-SD","~$goog.i18n.DateTimePatterns_af_NA","~$goog.i18n.DateTimePatterns_ar_XB","~$goog.i18n.DateTimePatterns-nyn","~$goog.i18n.DateTimePatterns_fr_TG","~$goog.i18n.DateTimePatterns-es-PE","~$goog.i18n.DateTimePatterns-en-LR","~$goog.i18n.DateTimePatterns_ksh_DE","~$goog.i18n.DateTimePatterns_en_MT","~$goog.i18n.DateTimePatterns-ar-JO","~$goog.i18n.DateTimePatterns-ln-CD","~$goog.i18n.DateTimePatterns_ff_Latn_NG","~$goog.i18n.DateTimePatterns-ff-Latn-BF","~$goog.i18n.DateTimePatterns_brx","~$goog.i18n.DateTimePatterns-bs-Latn","~$goog.i18n.DateTimePatterns-mgo","~$goog.i18n.DateTimePatterns-asa","~$goog.i18n.DateTimePatterns-mg","~$goog.i18n.DateTimePatterns-ce","~$goog.i18n.DateTimePatterns_rwk_TZ","~$goog.i18n.DateTimePatterns-gu-IN","~$goog.i18n.DateTimePatterns_fur_IT","~$goog.i18n.DateTimePatterns_ar_SA","~$goog.i18n.DateTimePatterns-yi","~$goog.i18n.DateTimePatterns_fr_BF","~$goog.i18n.DateTimePatterns_ee","~$goog.i18n.DateTimePatterns_fi_FI","~$goog.i18n.DateTimePatterns_rw_RW","~$goog.i18n.DateTimePatterns_twq_NE","~$goog.i18n.DateTimePatterns_ccp_IN","~$goog.i18n.DateTimePatterns-en-BE","~$goog.i18n.DateTimePatterns-sn-ZW","~$goog.i18n.DateTimePatterns_so_SO","~$goog.i18n.DateTimePatterns_se_FI","~$goog.i18n.DateTimePatterns_fr_NC","~$goog.i18n.DateTimePatterns-fr-CI","~$goog.i18n.DateTimePatterns_ff_Latn_GH","~$goog.i18n.DateTimePatterns_en_MO","~$goog.i18n.DateTimePatterns_ms_MY","~$goog.i18n.DateTimePatterns-dsb-DE","~$goog.i18n.DateTimePatterns_en_150","~$goog.i18n.DateTimePatterns-km-KH","~$goog.i18n.DateTimePatterns_shi_Tfng_MA","~$goog.i18n.DateTimePatterns_rof_TZ","~$goog.i18n.DateTimePatterns_en_BW","~$goog.i18n.DateTimePatterns_lag_TZ","~$goog.i18n.DateTimePatterns_si_LK","~$goog.i18n.DateTimePatterns_es_CL","~$goog.i18n.DateTimePatterns_pt_MO","~$goog.i18n.DateTimePatterns-kl","~$goog.i18n.DateTimePatterns_nl_AW","~$goog.i18n.DateTimePatterns-ksh","~$goog.i18n.DateTimePatterns_en_BI"]],"~:from-jar",true,"~:deps",["~$goog","~$goog.i18n.DateTimePatterns"]],["^ ","~:cache-key",[1579837703000],"~:output-name","goog.testing.continuationtestcase.js","~:resource-id",["~:shadow.build.classpath/resource","goog/testing/continuationtestcase.js"],"~:resource-name","goog/testing/continuationtestcase.js","~:type","~:goog","~:source","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines test classes for tests that can wait for conditions.\n *\n * Normal unit tests must complete their test logic within a single function\n * execution. This is ideal for most tests, but makes it difficult to test\n * routines that require real time to complete. The tests and TestCase in this\n * file allow for tests that can wait until a condition is true before\n * continuing execution.\n *\n * Each test has the typical three phases of execution: setUp, the test itself,\n * and tearDown. During each phase, the test function may add wait conditions,\n * which result in new test steps being added for that phase. All steps in a\n * given phase must complete before moving on to the next phase. An error in\n * any phase will stop that test and report the error to the test runner.\n *\n * This class should not be used where adequate mocks exist. Time-based routines\n * should use the MockClock, which runs much faster and provides equivalent\n * results. Continuation tests should be used for testing code that depends on\n * browser behaviors that are difficult to mock. For example, testing code that\n * relies on Iframe load events, event or layout code that requires a setTimeout\n * to become valid, and other browser-dependent native object interactions for\n * which mocks are insufficient.\n *\n * Sample usage:\n *\n * <pre>\n * var testCase = new goog.testing.ContinuationTestCase();\n * testCase.autoDiscoverTests();\n *\n * if (typeof G_testRunner != 'undefined') {\n *   G_testRunner.initialize(testCase);\n * }\n *\n * function testWaiting() {\n *   var someVar = true;\n *   waitForTimeout(function() {\n *     assertTrue(someVar)\n *   }, 500);\n * }\n *\n * function testWaitForEvent() {\n *   var et = goog.events.EventTarget();\n *   waitForEvent(et, 'test', function() {\n *     // Test step runs after the event fires.\n *   })\n *   et.dispatchEvent(et, 'test');\n * }\n *\n * function testWaitForCondition() {\n *   var counter = 0;\n *\n *   waitForCondition(function() {\n *     // This function is evaluated periodically until it returns true, or it\n *     // times out.\n *     return ++counter >= 3;\n *   }, function() {\n *     // This test step is run once the condition becomes true.\n *     assertEquals(3, counter);\n *   });\n * }\n * </pre>\n *\n * @author brenneman@google.com (Shawn Brenneman)\n */\n\n\ngoog.setTestOnly('goog.testing.ContinuationTestCase');\ngoog.provide('goog.testing.ContinuationTestCase');\ngoog.provide('goog.testing.ContinuationTestCase.ContinuationTest');\ngoog.provide('goog.testing.ContinuationTestCase.Step');\n\ngoog.require('goog.array');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.testing.TestCase');\ngoog.require('goog.testing.asserts');\n\n\n\n/**\n * Constructs a test case that supports tests with continuations. Test functions\n * may issue \"wait\" commands that suspend the test temporarily and continue once\n * the wait condition is met.\n *\n * @param {string=} opt_name Optional name for the test case.\n * @constructor\n * @extends {goog.testing.TestCase}\n * @deprecated ContinuationTestCase is deprecated. Prefer returning Promises\n *     for tests that assert Asynchronous behavior.\n * @final\n */\ngoog.testing.ContinuationTestCase = function(opt_name) {\n  goog.testing.TestCase.call(this, opt_name);\n\n  /**\n   * An event handler for waiting on Closure or browser events during tests.\n   * @type {goog.events.EventHandler<!goog.testing.ContinuationTestCase>}\n   * @private\n   */\n  this.handler_ = new goog.events.EventHandler(this);\n};\ngoog.inherits(goog.testing.ContinuationTestCase, goog.testing.TestCase);\n\n\n/**\n * The default maximum time to wait for a single test step in milliseconds.\n * @type {number}\n */\ngoog.testing.ContinuationTestCase.MAX_TIMEOUT = 1000;\n\n\n/**\n * Lock used to prevent multiple test steps from running recursively.\n * @type {boolean}\n * @private\n */\ngoog.testing.ContinuationTestCase.prototype.locked_;\n\n\n/**\n * The current test being run.\n * @type {?goog.testing.ContinuationTestCase.ContinuationTest}\n * @private\n */\ngoog.testing.ContinuationTestCase.prototype.currentTest_ = null;\n\n\n/**\n * Enables or disables the wait functions in the global scope.\n * @param {boolean} enable Whether the wait functions should be exported.\n * @private\n */\ngoog.testing.ContinuationTestCase.prototype.enableWaitFunctions_ = function(\n    enable) {\n  if (enable) {\n    goog.exportSymbol(\n        'waitForCondition', goog.bind(this.waitForCondition, this));\n    goog.exportSymbol('waitForEvent', goog.bind(this.waitForEvent, this));\n    goog.exportSymbol('waitForTimeout', goog.bind(this.waitForTimeout, this));\n  } else {\n    // Internet Explorer doesn't allow deletion of properties on the window.\n    goog.global['waitForCondition'] = undefined;\n    goog.global['waitForEvent'] = undefined;\n    goog.global['waitForTimeout'] = undefined;\n  }\n};\n\n\n/** @override */\ngoog.testing.ContinuationTestCase.prototype.runTests = function() {\n  this.enableWaitFunctions_(true);\n  goog.testing.ContinuationTestCase.superClass_.runTests.call(this);\n};\n\n\n/** @override */\ngoog.testing.ContinuationTestCase.prototype.finalize = function() {\n  this.enableWaitFunctions_(false);\n  goog.testing.ContinuationTestCase.superClass_.finalize.call(this);\n};\n\n\n/** @override */\ngoog.testing.ContinuationTestCase.prototype.cycleTests = function() {\n  // Get the next test in the queue.\n  if (!this.currentTest_) {\n    this.currentTest_ = this.createNextTest_();\n  }\n\n  // Run the next step of the current test, or exit if all tests are complete.\n  if (this.currentTest_) {\n    this.runNextStep_();\n  } else {\n    this.finalize();\n  }\n};\n\n\n/**\n * Creates the next test in the queue.\n * @return {goog.testing.ContinuationTestCase.ContinuationTest} The next test to\n *     execute, or null if no pending tests remain.\n * @private\n */\ngoog.testing.ContinuationTestCase.prototype.createNextTest_ = function() {\n  var test = this.next();\n  if (!test) {\n    return null;\n  }\n\n\n  var name = test.name;\n  goog.testing.TestCase.currentTestName = name;\n  this.result_.runCount++;\n  this.log('Running test: ' + name);\n\n  return new goog.testing.ContinuationTestCase.ContinuationTest(\n      new goog.testing.TestCase.Test(name, this.setUp, this), test,\n      new goog.testing.TestCase.Test(name, this.tearDown, this));\n};\n\n\n/**\n * Cleans up a finished test and cycles to the next test.\n * @private\n */\ngoog.testing.ContinuationTestCase.prototype.finishTest_ = function() {\n  var err = this.currentTest_.getError();\n  if (err) {\n    this.recordError(this.currentTest_.name, err);\n    this.doError(this.currentTest_);\n  } else {\n    this.doSuccess(this.currentTest_);\n  }\n\n  goog.testing.TestCase.currentTestName = null;\n  this.currentTest_ = null;\n  this.locked_ = false;\n  this.handler_.removeAll();\n\n  this.timeout(goog.bind(this.cycleTests, this), 0);\n};\n\n\n/**\n * Executes the next step in the current phase, advancing through each phase as\n * all steps are completed.\n * @private\n */\ngoog.testing.ContinuationTestCase.prototype.runNextStep_ = function() {\n  if (this.locked_) {\n    // Attempting to run a step before the previous step has finished. Try again\n    // after that step has released the lock.\n    return;\n  }\n\n  var phase = this.currentTest_.getCurrentPhase();\n\n  if (!phase || !phase.length) {\n    // No more steps for this test.\n    this.finishTest_();\n    return;\n  }\n\n  // Find the next step that is not in a wait state.\n  var stepIndex =\n      goog.array.findIndex(phase, function(step) { return !step.waiting; });\n\n  if (stepIndex < 0) {\n    // All active steps are currently waiting. Return until one wakes up.\n    return;\n  }\n\n  this.locked_ = true;\n  var step = phase[stepIndex];\n\n  try {\n    step.execute();\n    // Remove the successfully completed step. If an error is thrown, all steps\n    // will be removed for this phase.\n    goog.array.removeAt(phase, stepIndex);\n\n  } catch (e) {\n    this.currentTest_.setError(e);\n\n    // An assertion has failed, or an exception was raised. Clear the current\n    // phase, whether it is setUp, test, or tearDown.\n    this.currentTest_.cancelCurrentPhase();\n\n    // Cancel the setUp and test phase no matter where the error occurred. The\n    // tearDown phase will still run if it has pending steps.\n    this.currentTest_.cancelTestPhase();\n  }\n\n  this.locked_ = false;\n  this.runNextStep_();\n};\n\n\n/**\n * Creates a new test step that will run after a user-specified\n * timeout.  No guarantee is made on the execution order of the\n * continuation, except for those provided by each browser's\n * window.setTimeout. In particular, if two continuations are\n * registered at the same time with very small delta for their\n * durations, this class can not guarantee that the continuation with\n * the smaller duration will be executed first.\n * @param {function()} continuation The test function to invoke after the timeout.\n * @param {number=} opt_duration The length of the timeout in milliseconds.\n */\ngoog.testing.ContinuationTestCase.prototype.waitForTimeout = function(\n    continuation, opt_duration) {\n  var step = this.addStep_(continuation);\n  step.setTimeout(\n      goog.bind(this.handleComplete_, this, step), opt_duration || 0);\n};\n\n\n/**\n * Creates a new test step that will run after an event has fired. If the event\n * does not fire within a reasonable timeout, the test will fail.\n * @param {goog.events.EventTarget|EventTarget} eventTarget The target that will\n *     fire the event.\n * @param {string} eventType The type of event to listen for.\n * @param {function()} continuation The test function to invoke after the event\n *     fires.\n */\ngoog.testing.ContinuationTestCase.prototype.waitForEvent = function(\n    eventTarget, eventType, continuation) {\n\n  var step = this.addStep_(continuation);\n\n  var duration = goog.testing.ContinuationTestCase.MAX_TIMEOUT;\n  step.setTimeout(\n      goog.bind(this.handleTimeout_, this, step, duration), duration);\n\n  this.handler_.listenOnce(\n      eventTarget, eventType, goog.bind(this.handleComplete_, this, step));\n};\n\n\n/**\n * Creates a new test step which will run once a condition becomes true. The\n * condition will be polled at a user-specified interval until it becomes true,\n * or until a maximum timeout is reached.\n * @param {Function} condition The condition to poll.\n * @param {function()} continuation The test code to evaluate once the condition\n *     becomes true.\n * @param {number=} opt_interval The polling interval in milliseconds.\n * @param {number=} opt_maxTimeout The maximum amount of time to wait for the\n *     condition in milliseconds (defaults to 1000).\n */\ngoog.testing.ContinuationTestCase.prototype.waitForCondition = function(\n    condition, continuation, opt_interval, opt_maxTimeout) {\n\n  var interval = opt_interval || 100;\n  var timeout = opt_maxTimeout || goog.testing.ContinuationTestCase.MAX_TIMEOUT;\n\n  var step = this.addStep_(continuation);\n  this.testCondition_(step, condition, goog.now(), interval, timeout);\n};\n\n\n/**\n * Creates a new asynchronous test step which will be added to the current test\n * phase.\n * @param {function()} func The test function that will be executed for this step.\n * @return {!goog.testing.ContinuationTestCase.Step} A new test step.\n * @private\n */\ngoog.testing.ContinuationTestCase.prototype.addStep_ = function(func) {\n  if (!this.currentTest_) {\n    throw new Error('Cannot add test steps outside of a running test.');\n  }\n\n  var step = new goog.testing.ContinuationTestCase.Step(\n      this.currentTest_.name, func, this.currentTest_.scope);\n  this.currentTest_.addStep(step);\n  return step;\n};\n\n\n/**\n * Handles completion of a step's wait condition. Advances the test, allowing\n * the step's test method to run.\n * @param {goog.testing.ContinuationTestCase.Step} step The step that has\n *     finished waiting.\n * @private\n */\ngoog.testing.ContinuationTestCase.prototype.handleComplete_ = function(step) {\n  step.clearTimeout();\n  step.waiting = false;\n  this.runNextStep_();\n};\n\n\n/**\n * Handles the timeout event for a step that has exceeded the maximum time. This\n * causes the current test to fail.\n * @param {goog.testing.ContinuationTestCase.Step} step The timed-out step.\n * @param {number} duration The length of the timeout in milliseconds.\n * @private\n */\ngoog.testing.ContinuationTestCase.prototype.handleTimeout_ = function(\n    step, duration) {\n  step.ref = function() {\n    fail('Continuation timed out after ' + duration + 'ms.');\n  };\n\n  // Since the test is failing, cancel any other pending event listeners.\n  this.handler_.removeAll();\n  this.handleComplete_(step);\n};\n\n\n/**\n * Tests a wait condition and executes the associated test step once the\n * condition is true.\n *\n * If the condition does not become true before the maximum duration, the\n * interval will stop and the test step will fail in the kill timer.\n *\n * @param {goog.testing.ContinuationTestCase.Step} step The waiting test step.\n * @param {Function} condition The test condition.\n * @param {number} startTime Time when the test step began waiting.\n * @param {number} interval The duration in milliseconds to wait between tests.\n * @param {number} timeout The maximum amount of time to wait for the condition\n *     to become true. Measured from the startTime in milliseconds.\n * @private\n */\ngoog.testing.ContinuationTestCase.prototype.testCondition_ = function(\n    step, condition, startTime, interval, timeout) {\n\n  var duration = goog.now() - startTime;\n\n  if (condition()) {\n    this.handleComplete_(step);\n  } else if (duration < timeout) {\n    step.setTimeout(\n        goog.bind(\n            this.testCondition_, this, step, condition, startTime, interval,\n            timeout),\n        interval);\n  } else {\n    this.handleTimeout_(step, duration);\n  }\n};\n\n\n\n/**\n * Creates a continuation test case, which consists of multiple test steps that\n * occur in several phases.\n *\n * The steps are distributed between setUp, test, and tearDown phases. During\n * the execution of each step, 0 or more steps may be added to the current\n * phase. Once all steps in a phase have completed, the next phase will be\n * executed.\n *\n * If any errors occur (such as an assertion failure), the setUp and Test phases\n * will be cancelled immediately. The tearDown phase will always start, but may\n * be cancelled as well if it raises an error.\n *\n * @param {goog.testing.TestCase.Test} setUp A setUp test method to run before\n *     the main test phase.\n * @param {goog.testing.TestCase.Test} test A test method to run.\n * @param {goog.testing.TestCase.Test} tearDown A tearDown test method to run\n *     after the test method completes or fails.\n * @constructor\n * @extends {goog.testing.TestCase.Test}\n * @final\n */\ngoog.testing.ContinuationTestCase.ContinuationTest = function(\n    setUp, test, tearDown) {\n  // This test container has a name, but no evaluation function or scope.\n  goog.testing.TestCase.Test.call(this, test.name, function() {}, null);\n\n  /**\n   * The list of test steps to run during setUp.\n   * @type {Array<goog.testing.TestCase.Test>}\n   * @private\n   */\n  this.setUp_ = [setUp];\n\n  /**\n   * The list of test steps to run for the actual test.\n   * @type {Array<goog.testing.TestCase.Test>}\n   * @private\n   */\n  this.test_ = [test];\n\n  /**\n   * The list of test steps to run during the tearDown phase.\n   * @type {Array<goog.testing.TestCase.Test>}\n   * @private\n   */\n  this.tearDown_ = [tearDown];\n};\ngoog.inherits(\n    goog.testing.ContinuationTestCase.ContinuationTest,\n    goog.testing.TestCase.Test);\n\n\n/**\n * The first error encountered during the test run, if any.\n * @type {?Error}\n * @private\n */\ngoog.testing.ContinuationTestCase.ContinuationTest.prototype.error_ = null;\n\n\n/**\n * @return {Error} The first error to be raised during the test run or null if\n *     no errors occurred.\n */\ngoog.testing.ContinuationTestCase.ContinuationTest.prototype.getError =\n    function() {\n  return this.error_;\n};\n\n\n/**\n * Sets an error for the test so it can be reported. Only the first error set\n * during a test will be reported. Additional errors that occur in later test\n * phases will be discarded.\n * @param {Error} e An error.\n */\ngoog.testing.ContinuationTestCase.ContinuationTest.prototype.setError =\n    function(e) {\n  this.error_ = this.error_ || e;\n};\n\n\n/**\n * @return {Array<!goog.testing.TestCase.Test>} The current phase of steps\n *    being processed. Returns null if all steps have been completed.\n */\ngoog.testing.ContinuationTestCase.ContinuationTest.prototype.getCurrentPhase =\n    function() {\n  if (this.setUp_.length) {\n    return this.setUp_;\n  }\n\n  if (this.test_.length) {\n    return this.test_;\n  }\n\n  if (this.tearDown_.length) {\n    return this.tearDown_;\n  }\n\n  return null;\n};\n\n\n/**\n * Adds a new test step to the end of the current phase. The new step will wait\n * for a condition to be met before running, or will fail after a timeout.\n * @param {!goog.testing.ContinuationTestCase.Step} step The test step to add.\n */\ngoog.testing.ContinuationTestCase.ContinuationTest.prototype.addStep = function(\n    step) {\n  var phase = this.getCurrentPhase();\n  if (phase) {\n    phase.push(step);\n  } else {\n    throw new Error('Attempted to add a step to a completed test.');\n  }\n};\n\n\n/**\n * Cancels all remaining steps in the current phase. Called after an error in\n * any phase occurs.\n */\ngoog.testing.ContinuationTestCase.ContinuationTest.prototype\n    .cancelCurrentPhase = function() {\n  this.cancelPhase_(this.getCurrentPhase());\n};\n\n\n/**\n * Skips the rest of the setUp and test phases, but leaves the tearDown phase to\n * clean up.\n */\ngoog.testing.ContinuationTestCase.ContinuationTest.prototype.cancelTestPhase =\n    function() {\n  this.cancelPhase_(this.setUp_);\n  this.cancelPhase_(this.test_);\n};\n\n\n/**\n * Clears a test phase and cancels any pending steps found.\n * @param {Array<goog.testing.TestCase.Test>} phase A list of test steps.\n * @private\n */\ngoog.testing.ContinuationTestCase.ContinuationTest.prototype.cancelPhase_ =\n    function(phase) {\n  while (phase && phase.length) {\n    var step = phase.pop();\n    if (step instanceof goog.testing.ContinuationTestCase.Step) {\n      step.clearTimeout();\n    }\n  }\n};\n\n\n\n/**\n * Constructs a single step in a larger continuation test. Each step is similar\n * to a typical TestCase test, except it may wait for an event or timeout to\n * occur before running the test function.\n *\n * @param {string} name The test name.\n * @param {function()} ref The test function to run.\n * @param {Object=} opt_scope The object context to run the test in.\n * @constructor\n * @extends {goog.testing.TestCase.Test}\n * @final\n */\ngoog.testing.ContinuationTestCase.Step = function(name, ref, opt_scope) {\n  goog.testing.TestCase.Test.call(this, name, ref, opt_scope);\n};\ngoog.inherits(\n    goog.testing.ContinuationTestCase.Step, goog.testing.TestCase.Test);\n\n\n/**\n * Whether the step is currently waiting for a condition to continue. All new\n * steps begin in wait state.\n * @override\n */\ngoog.testing.ContinuationTestCase.Step.prototype.waiting = true;\n\n\n/**\n * A saved reference to window.clearTimeout so that MockClock or other overrides\n * don't affect continuation timeouts.\n * @type {Function}\n * @private\n */\ngoog.testing.ContinuationTestCase.Step.protectedClearTimeout_ =\n    window.clearTimeout;\n\n\n/**\n * A saved reference to window.setTimeout so that MockClock or other overrides\n * don't affect continuation timeouts.\n * @type {Function}\n * @private\n */\ngoog.testing.ContinuationTestCase.Step.protectedSetTimeout_ = window.setTimeout;\n\n\n/**\n * Key to this step's timeout. If the step is waiting for an event, the timeout\n * will be used as a kill timer. If the step is waiting\n * @type {number}\n * @private\n */\ngoog.testing.ContinuationTestCase.Step.prototype.timeout_;\n\n\n/**\n * Starts a timeout for this step. Each step may have only one timeout active at\n * a time.\n * @param {Function} func The function to call after the timeout.\n * @param {number} duration The number of milliseconds to wait before invoking\n *     the function.\n */\ngoog.testing.ContinuationTestCase.Step.prototype.setTimeout = function(\n    func, duration) {\n\n  this.clearTimeout();\n\n  var setTimeout = goog.testing.ContinuationTestCase.Step.protectedSetTimeout_;\n  this.timeout_ = setTimeout(func, duration);\n};\n\n\n/**\n * Clears the current timeout if it is active.\n */\ngoog.testing.ContinuationTestCase.Step.prototype.clearTimeout = function() {\n  if (this.timeout_) {\n    var clear = goog.testing.ContinuationTestCase.Step.protectedClearTimeout_;\n\n    clear(this.timeout_);\n    delete this.timeout_;\n  }\n};\n","~:last-modified",1579837703000,"~:requires",["~#set",["~$goog.events.EventHandler","~$goog.testing.asserts","^AA","~$goog.events.EventTarget","~$goog.testing.TestCase","~$goog.array"]],"~:pom-info",["^ ","~:description","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","~:group-id","~$org.clojure","~:artifact-id","~$google-closure-library","~:name","Google Closure Library","~:id","~$org.clojure/google-closure-library","~:url","http://code.google.com/p/closure-library/","~:parent-group-id","~$org.sonatype.oss","~:coordinate",["^A[","0.0-20191016-6ae1f72f"],"~:version","0.0-20191016-6ae1f72f"],"^B0",["~#url","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/continuationtestcase.js"],"~:provides",["^AM",["~$goog.testing.ContinuationTestCase","~$goog.testing.ContinuationTestCase.Step","~$goog.testing.ContinuationTestCase.ContinuationTest"]],"^A?",true,"^A@",["^AA","^AR","^AN","^AP","^AQ","^AO"]],["^ ","^AC",[1579837703000],"^AD","goog.labs.useragent.browser.js","^AE",["^AF","goog/labs/useragent/browser.js"],"^AG","goog/labs/useragent/browser.js","^AH","^AI","^AJ","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Closure user agent detection (Browser).\n * @see <a href=\"http://www.useragentstring.com/\">User agent strings</a>\n * For more information on rendering engine, platform, or device see the other\n * sub-namespaces in goog.labs.userAgent, goog.labs.userAgent.platform,\n * goog.labs.userAgent.device respectively.)\n *\n * @author martone@google.com (Andy Martone)\n */\n\ngoog.provide('goog.labs.userAgent.browser');\n\ngoog.require('goog.array');\ngoog.require('goog.labs.userAgent.util');\ngoog.require('goog.object');\ngoog.require('goog.string.internal');\n\n\n// TODO(nnaze): Refactor to remove excessive exclusion logic in matching\n// functions.\n\n\n/**\n * @return {boolean} Whether the user's browser is Opera.  Note: Chromium\n *     based Opera (Opera 15+) is detected as Chrome to avoid unnecessary\n *     special casing.\n * @private\n */\ngoog.labs.userAgent.browser.matchOpera_ = function() {\n  return goog.labs.userAgent.util.matchUserAgent('Opera');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is IE.\n * @private\n */\ngoog.labs.userAgent.browser.matchIE_ = function() {\n  return goog.labs.userAgent.util.matchUserAgent('Trident') ||\n      goog.labs.userAgent.util.matchUserAgent('MSIE');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is Edge. This refers to EdgeHTML\n * based Edge.\n * @private\n */\ngoog.labs.userAgent.browser.matchEdgeHtml_ = function() {\n  return goog.labs.userAgent.util.matchUserAgent('Edge');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is Chromium based Edge.\n * @private\n */\ngoog.labs.userAgent.browser.matchEdgeChromium_ = function() {\n  return goog.labs.userAgent.util.matchUserAgent('Edg/');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is Chromium based Opera.\n * @private\n */\ngoog.labs.userAgent.browser.matchOperaChromium_ = function() {\n  return goog.labs.userAgent.util.matchUserAgent('OPR');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is Firefox.\n * @private\n */\ngoog.labs.userAgent.browser.matchFirefox_ = function() {\n  return goog.labs.userAgent.util.matchUserAgent('Firefox') ||\n      goog.labs.userAgent.util.matchUserAgent('FxiOS');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is Safari.\n * @private\n */\ngoog.labs.userAgent.browser.matchSafari_ = function() {\n  return goog.labs.userAgent.util.matchUserAgent('Safari') &&\n      !(goog.labs.userAgent.browser.matchChrome_() ||\n        goog.labs.userAgent.browser.matchCoast_() ||\n        goog.labs.userAgent.browser.matchOpera_() ||\n        goog.labs.userAgent.browser.matchEdgeHtml_() ||\n        goog.labs.userAgent.browser.matchEdgeChromium_() ||\n        goog.labs.userAgent.browser.matchOperaChromium_() ||\n        goog.labs.userAgent.browser.matchFirefox_() ||\n        goog.labs.userAgent.browser.isSilk() ||\n        goog.labs.userAgent.util.matchUserAgent('Android'));\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is Coast (Opera's Webkit-based\n *     iOS browser).\n * @private\n */\ngoog.labs.userAgent.browser.matchCoast_ = function() {\n  return goog.labs.userAgent.util.matchUserAgent('Coast');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is iOS Webview.\n * @private\n */\ngoog.labs.userAgent.browser.matchIosWebview_ = function() {\n  // iOS Webview does not show up as Chrome or Safari. Also check for Opera's\n  // WebKit-based iOS browser, Coast.\n  return (goog.labs.userAgent.util.matchUserAgent('iPad') ||\n          goog.labs.userAgent.util.matchUserAgent('iPhone')) &&\n      !goog.labs.userAgent.browser.matchSafari_() &&\n      !goog.labs.userAgent.browser.matchChrome_() &&\n      !goog.labs.userAgent.browser.matchCoast_() &&\n      !goog.labs.userAgent.browser.matchFirefox_() &&\n      goog.labs.userAgent.util.matchUserAgent('AppleWebKit');\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is any Chromium browser. This\n * returns true for Chrome, Opera 15+, and Edge Chromium.\n * @private\n */\ngoog.labs.userAgent.browser.matchChrome_ = function() {\n  return (goog.labs.userAgent.util.matchUserAgent('Chrome') ||\n          goog.labs.userAgent.util.matchUserAgent('CriOS')) &&\n      !goog.labs.userAgent.browser.matchEdgeHtml_();\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is the Android browser.\n * @private\n */\ngoog.labs.userAgent.browser.matchAndroidBrowser_ = function() {\n  // Android can appear in the user agent string for Chrome on Android.\n  // This is not the Android standalone browser if it does.\n  return goog.labs.userAgent.util.matchUserAgent('Android') &&\n      !(goog.labs.userAgent.browser.isChrome() ||\n        goog.labs.userAgent.browser.isFirefox() ||\n        goog.labs.userAgent.browser.isOpera() ||\n        goog.labs.userAgent.browser.isSilk());\n};\n\n\n/**\n * @return {boolean} Whether the user's browser is Opera.\n */\ngoog.labs.userAgent.browser.isOpera = goog.labs.userAgent.browser.matchOpera_;\n\n\n/**\n * @return {boolean} Whether the user's browser is IE.\n */\ngoog.labs.userAgent.browser.isIE = goog.labs.userAgent.browser.matchIE_;\n\n\n/**\n * @return {boolean} Whether the user's browser is EdgeHTML based Edge.\n */\ngoog.labs.userAgent.browser.isEdge = goog.labs.userAgent.browser.matchEdgeHtml_;\n\n\n/**\n * @return {boolean} Whether the user's browser is Chromium based Edge.\n */\ngoog.labs.userAgent.browser.isEdgeChromium =\n    goog.labs.userAgent.browser.matchEdgeChromium_;\n\n/**\n * @return {boolean} Whether the user's browser is Chromium based Opera.\n */\ngoog.labs.userAgent.browser.isOperaChromium =\n    goog.labs.userAgent.browser.matchOperaChromium_;\n\n/**\n * @return {boolean} Whether the user's browser is Firefox.\n */\ngoog.labs.userAgent.browser.isFirefox =\n    goog.labs.userAgent.browser.matchFirefox_;\n\n\n/**\n * @return {boolean} Whether the user's browser is Safari.\n */\ngoog.labs.userAgent.browser.isSafari = goog.labs.userAgent.browser.matchSafari_;\n\n\n/**\n * @return {boolean} Whether the user's browser is Coast (Opera's Webkit-based\n *     iOS browser).\n */\ngoog.labs.userAgent.browser.isCoast = goog.labs.userAgent.browser.matchCoast_;\n\n\n/**\n * @return {boolean} Whether the user's browser is iOS Webview.\n */\ngoog.labs.userAgent.browser.isIosWebview =\n    goog.labs.userAgent.browser.matchIosWebview_;\n\n\n/**\n * @return {boolean} Whether the user's browser is any Chromium based browser (\n * Chrome, Blink-based Opera (15+) and Edge Chromium).\n */\ngoog.labs.userAgent.browser.isChrome = goog.labs.userAgent.browser.matchChrome_;\n\n\n/**\n * @return {boolean} Whether the user's browser is the Android browser.\n */\ngoog.labs.userAgent.browser.isAndroidBrowser =\n    goog.labs.userAgent.browser.matchAndroidBrowser_;\n\n\n/**\n * For more information, see:\n * http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html\n * @return {boolean} Whether the user's browser is Silk.\n */\ngoog.labs.userAgent.browser.isSilk = function() {\n  return goog.labs.userAgent.util.matchUserAgent('Silk');\n};\n\n\n/**\n * @return {string} The browser version or empty string if version cannot be\n *     determined. Note that for Internet Explorer, this returns the version of\n *     the browser, not the version of the rendering engine. (IE 8 in\n *     compatibility mode will return 8.0 rather than 7.0. To determine the\n *     rendering engine version, look at document.documentMode instead. See\n *     http://msdn.microsoft.com/en-us/library/cc196988(v=vs.85).aspx for more\n *     details.)\n */\ngoog.labs.userAgent.browser.getVersion = function() {\n  var userAgentString = goog.labs.userAgent.util.getUserAgent();\n  // Special case IE since IE's version is inside the parenthesis and\n  // without the '/'.\n  if (goog.labs.userAgent.browser.isIE()) {\n    return goog.labs.userAgent.browser.getIEVersion_(userAgentString);\n  }\n\n  var versionTuples =\n      goog.labs.userAgent.util.extractVersionTuples(userAgentString);\n\n  // Construct a map for easy lookup.\n  var versionMap = {};\n  goog.array.forEach(versionTuples, function(tuple) {\n    // Note that the tuple is of length three, but we only care about the\n    // first two.\n    var key = tuple[0];\n    var value = tuple[1];\n    versionMap[key] = value;\n  });\n\n  var versionMapHasKey = goog.partial(goog.object.containsKey, versionMap);\n\n  // Gives the value with the first key it finds, otherwise empty string.\n  function lookUpValueWithKeys(keys) {\n    var key = goog.array.find(keys, versionMapHasKey);\n    return versionMap[key] || '';\n  }\n\n  // Check Opera before Chrome since Opera 15+ has \"Chrome\" in the string.\n  // See\n  // http://my.opera.com/ODIN/blog/2013/07/15/opera-user-agent-strings-opera-15-and-beyond\n  if (goog.labs.userAgent.browser.isOpera()) {\n    // Opera 10 has Version/10.0 but Opera/9.8, so look for \"Version\" first.\n    // Opera uses 'OPR' for more recent UAs.\n    return lookUpValueWithKeys(['Version', 'Opera']);\n  }\n\n  // Check Edge before Chrome since it has Chrome in the string.\n  if (goog.labs.userAgent.browser.isEdge()) {\n    return lookUpValueWithKeys(['Edge']);\n  }\n\n  // Check Chromium Edge before Chrome since it has Chrome in the string.\n  if (goog.labs.userAgent.browser.isEdgeChromium()) {\n    return lookUpValueWithKeys(['Edg']);\n  }\n\n  if (goog.labs.userAgent.browser.isChrome()) {\n    return lookUpValueWithKeys(['Chrome', 'CriOS']);\n  }\n\n  // Usually products browser versions are in the third tuple after \"Mozilla\"\n  // and the engine.\n  var tuple = versionTuples[2];\n  return tuple && tuple[1] || '';\n};\n\n\n/**\n * @param {string|number} version The version to check.\n * @return {boolean} Whether the browser version is higher or the same as the\n *     given version.\n */\ngoog.labs.userAgent.browser.isVersionOrHigher = function(version) {\n  return goog.string.internal.compareVersions(\n             goog.labs.userAgent.browser.getVersion(), version) >= 0;\n};\n\n\n/**\n * Determines IE version. More information:\n * http://msdn.microsoft.com/en-us/library/ie/bg182625(v=vs.85).aspx#uaString\n * http://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx\n * http://blogs.msdn.com/b/ie/archive/2010/03/23/introducing-ie9-s-user-agent-string.aspx\n * http://blogs.msdn.com/b/ie/archive/2009/01/09/the-internet-explorer-8-user-agent-string-updated-edition.aspx\n *\n * @param {string} userAgent the User-Agent.\n * @return {string}\n * @private\n */\ngoog.labs.userAgent.browser.getIEVersion_ = function(userAgent) {\n  // IE11 may identify itself as MSIE 9.0 or MSIE 10.0 due to an IE 11 upgrade\n  // bug. Example UA:\n  // Mozilla/5.0 (MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0; rv:11.0)\n  // like Gecko.\n  // See http://www.whatismybrowser.com/developers/unknown-user-agent-fragments.\n  var rv = /rv: *([\\d\\.]*)/.exec(userAgent);\n  if (rv && rv[1]) {\n    return rv[1];\n  }\n\n  var version = '';\n  var msie = /MSIE +([\\d\\.]+)/.exec(userAgent);\n  if (msie && msie[1]) {\n    // IE in compatibility mode usually identifies itself as MSIE 7.0; in this\n    // case, use the Trident version to determine the version of IE. For more\n    // details, see the links above.\n    var tridentVersion = /Trident\\/(\\d.\\d)/.exec(userAgent);\n    if (msie[1] == '7.0') {\n      if (tridentVersion && tridentVersion[1]) {\n        switch (tridentVersion[1]) {\n          case '4.0':\n            version = '8.0';\n            break;\n          case '5.0':\n            version = '9.0';\n            break;\n          case '6.0':\n            version = '10.0';\n            break;\n          case '7.0':\n            version = '11.0';\n            break;\n        }\n      } else {\n        version = '7.0';\n      }\n    } else {\n      version = msie[1];\n    }\n  }\n  return version;\n};\n","^AK",1579837703000,"^AL",["^AM",["^AA","~$goog.object","~$goog.string.internal","^AR","~$goog.labs.userAgent.util"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/useragent/browser.js"],"^B6",["^AM",["~$goog.labs.userAgent.browser"]],"^A?",true,"^A@",["^AA","^AR","^B<","^B:","^B;"]],["^ ","^AC",[1579837703000],"^AD","goog.net.eventtype.js","^AE",["^AF","goog/net/eventtype.js"],"^AG","goog/net/eventtype.js","^AH","^AI","^AJ","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Common events for the network classes.\n */\n\n\ngoog.provide('goog.net.EventType');\n\n\n/**\n * Event names for network events\n * @enum {string}\n */\ngoog.net.EventType = {\n  COMPLETE: 'complete',\n  SUCCESS: 'success',\n  ERROR: 'error',\n  ABORT: 'abort',\n  READY: 'ready',\n  READY_STATE_CHANGE: 'readystatechange',\n  TIMEOUT: 'timeout',\n  INCREMENTAL_DATA: 'incrementaldata',\n  PROGRESS: 'progress',\n  // DOWNLOAD_PROGRESS and UPLOAD_PROGRESS are special events dispatched by\n  // goog.net.XhrIo to allow binding listeners specific to each type of\n  // progress.\n  DOWNLOAD_PROGRESS: 'downloadprogress',\n  UPLOAD_PROGRESS: 'uploadprogress'\n};\n","^AK",1579837703000,"^AL",["^AM",["^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/eventtype.js"],"^B6",["^AM",["~$goog.net.EventType"]],"^A?",true,"^A@",["^AA"]],["^ ","^AC",[1579837703000],"~:goog-module",true,"^AD","goog.streams.defines.js","^AE",["^AF","goog/streams/defines.js"],"^AG","goog/streams/defines.js","^AH","^AI","^AJ","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines used by streams.\n */\ngoog.module('goog.streams.defines');\n\n/**\n * 'false', 'true', or 'detect'. Detect does runtime feature detection.\n * @define {string}\n */\nconst USE_NATIVE_IMPLEMENTATION =\n    goog.define('goog.streams.USE_NATIVE_IMPLEMENTATION', 'false');\n\nexports = {\n  USE_NATIVE_IMPLEMENTATION,\n};\n","^AK",1579837703000,"^AL",["^AM",["^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/streams/defines.js"],"^B6",["^AM",["~$goog.streams.defines"]],"^A?",true,"^A@",["^AA"]],["^ ","^AC",[1579837703000],"^AD","goog.memoize.memoize.js","^AE",["^AF","goog/memoize/memoize.js"],"^AG","goog/memoize/memoize.js","^AH","^AI","^AJ","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Tool for caching the result of expensive deterministic\n * functions.\n *\n * @see http://en.wikipedia.org/wiki/Memoization\n *\n */\n\ngoog.provide('goog.memoize');\n\n\n/**\n * Decorator around functions that caches the inner function's return values.\n *\n * To cache parameterless functions, see goog.functions.cacheReturnValue.\n *\n * @param {Function} f The function to wrap. Its return value may only depend\n *     on its arguments and 'this' context. There may be further restrictions\n *     on the arguments depending on the capabilities of the serializer used.\n * @param {function(number, Object): string=} opt_serializer A function to\n *     serialize f's arguments. It must have the same signature as\n *     goog.memoize.simpleSerializer. It defaults to that function.\n * @return {!Function} The wrapped function.\n */\ngoog.memoize = function(f, opt_serializer) {\n  const serializer = opt_serializer || goog.memoize.simpleSerializer;\n\n  return (/**\n           * @this {Object} The object whose function is being wrapped.\n           * @return {?} the return value of the original function.\n           */\n          function() {\n            if (goog.memoize.ENABLE_MEMOIZE) {\n              // In the strict mode, when this function is called as a global\n              // function, the value of 'this' is undefined instead of a global\n              // object. See:\n              // https://developer.mozilla.org/en/JavaScript/Strict_mode\n              // Otherwise, if memoize wraps a method of an object, `this` will\n              // be the context object, causing memoize to cache its values on\n              // the object instance, instead of on the global object.\n              // This (ha!) is a very surprising API, but retained for backwards\n              // compatibility.\n              const thisOrGlobal = this || goog.global;\n              // Maps the serialized list of args to the corresponding return\n              // value.\n              const cache = thisOrGlobal[goog.memoize.CACHE_PROPERTY_] ||\n                  (thisOrGlobal[goog.memoize.CACHE_PROPERTY_] = {});\n              const key = serializer(goog.getUid(f), arguments);\n              return cache.hasOwnProperty(key) ?\n                  cache[key] :\n                  (cache[key] = f.apply(this, arguments));\n            } else {\n              return f.apply(this, arguments);\n            }\n          });\n};\n\n\n/**\n * @define {boolean} Flag to disable memoization in unit tests.\n */\ngoog.memoize.ENABLE_MEMOIZE = goog.define('goog.memoize.ENABLE_MEMOIZE', true);\n\n\n/**\n * Clears the memoization cache on the given object.\n * @param {Object} cacheOwner The owner of the cache. This is the `this`\n *     context of the memoized function.\n */\ngoog.memoize.clearCache = function(cacheOwner) {\n  cacheOwner[goog.memoize.CACHE_PROPERTY_] = {};\n};\n\n\n/**\n * Name of the property used by goog.memoize as cache.\n * @type {string}\n * @private\n */\ngoog.memoize.CACHE_PROPERTY_ = 'closure_memoize_cache_';\n\n\n/**\n * Simple and fast argument serializer function for goog.memoize.\n * Supports string, number, boolean, null and undefined arguments. Doesn't\n * support \\x0B characters in the strings.\n * @param {number} functionUid Unique identifier of the function whose result\n *     is cached.\n * @param {?{length:number}} args The arguments that the function to memoize is\n *     called with. Note: it is an array-like object, because it supports\n *     indexing and has the length property.\n * @return {string} The list of arguments with type information concatenated\n *     with the functionUid argument, serialized as \\x0B-separated string.\n */\ngoog.memoize.simpleSerializer = function(functionUid, args) {\n  const context = [functionUid];\n  for (let i = args.length - 1; i >= 0; --i) {\n    context.push(typeof args[i], args[i]);\n  }\n  return context.join('\\x0B');\n};\n","^AK",1579837703000,"^AL",["^AM",["^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/memoize/memoize.js"],"^B6",["^AM",["~$goog.memoize"]],"^A?",true,"^A@",["^AA"]],["^ ","^AC",[1579837703000],"^AD","goog.ui.containerrenderer.js","^AE",["^AF","goog/ui/containerrenderer.js"],"^AG","goog/ui/containerrenderer.js","^AH","^AI","^AJ","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Base class for container renderers.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ContainerRenderer');\n\ngoog.forwardDeclare('goog.ui.Container');\ngoog.forwardDeclare('goog.ui.Container.Orientation');\ngoog.forwardDeclare('goog.ui.Control');\ngoog.require('goog.a11y.aria');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.string');\ngoog.require('goog.style');\ngoog.require('goog.ui.registry');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Default renderer for {@link goog.ui.Container}.  Can be used as-is, but\n * subclasses of Container will probably want to use renderers specifically\n * tailored for them by extending this class.\n * @param {string=} opt_ariaRole Optional ARIA role used for the element.\n * @constructor\n */\ngoog.ui.ContainerRenderer = function(opt_ariaRole) {\n  // By default, the ARIA role is unspecified.\n  /** @private {string|undefined} */\n  this.ariaRole_ = opt_ariaRole;\n};\ngoog.addSingletonGetter(goog.ui.ContainerRenderer);\n\n\n/**\n * Constructs a new renderer and sets the CSS class that the renderer will use\n * as the base CSS class to apply to all elements rendered by that renderer.\n * An example to use this function using a menu is:\n *\n * <pre>\n * var myCustomRenderer = goog.ui.ContainerRenderer.getCustomRenderer(\n *     goog.ui.MenuRenderer, 'my-special-menu');\n * var newMenu = new goog.ui.Menu(opt_domHelper, myCustomRenderer);\n * </pre>\n *\n * Your styles for the menu can now be:\n * <pre>\n * .my-special-menu { }\n * </pre>\n *\n * <em>instead</em> of\n * <pre>\n * .CSS_MY_SPECIAL_MENU .goog-menu { }\n * </pre>\n *\n * You would want to use this functionality when you want an instance of a\n * component to have specific styles different than the other components of the\n * same type in your application.  This avoids using descendant selectors to\n * apply the specific styles to this component.\n *\n * @param {Function} ctor The constructor of the renderer you want to create.\n * @param {string} cssClassName The name of the CSS class for this renderer.\n * @return {goog.ui.ContainerRenderer} An instance of the desired renderer with\n *     its getCssClass() method overridden to return the supplied custom CSS\n *     class name.\n */\ngoog.ui.ContainerRenderer.getCustomRenderer = function(ctor, cssClassName) {\n  var renderer = new ctor();\n\n  /**\n   * Returns the CSS class to be applied to the root element of components\n   * rendered using this renderer.\n   * @return {string} Renderer-specific CSS class.\n   */\n  renderer.getCssClass = function() { return cssClassName; };\n\n  return renderer;\n};\n\n\n/**\n * Default CSS class to be applied to the root element of containers rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.ContainerRenderer.CSS_CLASS = goog.getCssName('goog-container');\n\n\n/**\n * Returns the ARIA role to be applied to the container.\n * See http://wiki/Main/ARIA for more info.\n * @return {undefined|string} ARIA role.\n */\ngoog.ui.ContainerRenderer.prototype.getAriaRole = function() {\n  return this.ariaRole_;\n};\n\n\n/**\n * Enables or disables the tab index of the element.  Only elements with a\n * valid tab index can receive focus.\n * @param {Element} element Element whose tab index is to be changed.\n * @param {boolean} enable Whether to add or remove the element's tab index.\n */\ngoog.ui.ContainerRenderer.prototype.enableTabIndex = function(element, enable) {\n  if (element) {\n    element.tabIndex = enable ? 0 : -1;\n  }\n};\n\n\n/**\n * Creates and returns the container's root element.  The default\n * simply creates a DIV and applies the renderer's own CSS class name to it.\n * To be overridden in subclasses.\n * @param {goog.ui.Container} container Container to render.\n * @return {Element} Root element for the container.\n */\ngoog.ui.ContainerRenderer.prototype.createDom = function(container) {\n  return container.getDomHelper().createDom(\n      goog.dom.TagName.DIV, this.getClassNames(container).join(' '));\n};\n\n\n/**\n * Returns the DOM element into which child components are to be rendered,\n * or null if the container hasn't been rendered yet.\n * @param {Element} element Root element of the container whose content element\n *     is to be returned.\n * @return {Element} Element to contain child elements (null if none).\n */\ngoog.ui.ContainerRenderer.prototype.getContentElement = function(element) {\n  return element;\n};\n\n\n/**\n * Default implementation of `canDecorate`; returns true if the element\n * is a DIV, false otherwise.\n * @param {Element} element Element to decorate.\n * @return {boolean} Whether the renderer can decorate the element.\n */\ngoog.ui.ContainerRenderer.prototype.canDecorate = function(element) {\n  return element.tagName == 'DIV';\n};\n\n\n/**\n * Default implementation of `decorate` for {@link goog.ui.Container}s.\n * Decorates the element with the container, and attempts to decorate its child\n * elements.  Returns the decorated element.\n * @param {goog.ui.Container} container Container to decorate the element.\n * @param {Element} element Element to decorate.\n * @return {!Element} Decorated element.\n */\ngoog.ui.ContainerRenderer.prototype.decorate = function(container, element) {\n  // Set the container's ID to the decorated element's DOM ID, if any.\n  if (element.id) {\n    container.setId(element.id);\n  }\n\n  // Configure the container's state based on the CSS class names it has.\n  var baseClass = this.getCssClass();\n  var hasBaseClass = false;\n  var classNames = goog.dom.classlist.get(element);\n  if (classNames) {\n    goog.array.forEach(classNames, function(className) {\n      if (className == baseClass) {\n        hasBaseClass = true;\n      } else if (className) {\n        this.setStateFromClassName(container, className, baseClass);\n      }\n    }, this);\n  }\n\n  if (!hasBaseClass) {\n    // Make sure the container's root element has the renderer's own CSS class.\n    goog.dom.classlist.add(element, baseClass);\n  }\n\n  // Decorate the element's children, if applicable.  This should happen after\n  // the container's own state has been initialized, since how children are\n  // decorated may depend on the state of the container.\n  this.decorateChildren(container, this.getContentElement(element));\n\n  return element;\n};\n\n\n/**\n * Sets the container's state based on the given CSS class name, encountered\n * during decoration.  CSS class names that don't represent container states\n * are ignored.  Considered protected; subclasses should override this method\n * to support more states and CSS class names.\n * @param {goog.ui.Container} container Container to update.\n * @param {string} className CSS class name.\n * @param {string} baseClass Base class name used as the root of state-specific\n *     class names (typically the renderer's own class name).\n * @protected\n * @suppress {missingRequire} goog.ui.Container\n */\ngoog.ui.ContainerRenderer.prototype.setStateFromClassName = function(\n    container, className, baseClass) {\n  if (className == goog.getCssName(baseClass, 'disabled')) {\n    container.setEnabled(false);\n  } else if (className == goog.getCssName(baseClass, 'horizontal')) {\n    container.setOrientation(goog.ui.Container.Orientation.HORIZONTAL);\n  } else if (className == goog.getCssName(baseClass, 'vertical')) {\n    container.setOrientation(goog.ui.Container.Orientation.VERTICAL);\n  }\n};\n\n\n/**\n * Takes a container and an element that may contain child elements, decorates\n * the child elements, and adds the corresponding components to the container\n * as child components.  Any non-element child nodes (e.g. empty text nodes\n * introduced by line breaks in the HTML source) are removed from the element.\n * @param {goog.ui.Container} container Container whose children are to be\n *     discovered.\n * @param {Element} element Element whose children are to be decorated.\n * @param {Element=} opt_firstChild the first child to be decorated.\n */\ngoog.ui.ContainerRenderer.prototype.decorateChildren = function(\n    container, element, opt_firstChild) {\n  if (element) {\n    var node = opt_firstChild || element.firstChild, next;\n    // Tag soup HTML may result in a DOM where siblings have different parents.\n    while (node && node.parentNode == element) {\n      // Get the next sibling here, since the node may be replaced or removed.\n      next = node.nextSibling;\n      if (node.nodeType == goog.dom.NodeType.ELEMENT) {\n        // Decorate element node.\n        var child = this.getDecoratorForChild(/** @type {!Element} */ (node));\n        if (child) {\n          // addChild() may need to look at the element.\n          child.setElementInternal(/** @type {!Element} */ (node));\n          // If the container is disabled, mark the child disabled too.  See\n          // bug 1263729.  Note that this must precede the call to addChild().\n          if (!container.isEnabled()) {\n            child.setEnabled(false);\n          }\n          container.addChild(child);\n          child.decorate(/** @type {!Element} */ (node));\n        }\n      } else if (!node.nodeValue || goog.string.trim(node.nodeValue) == '') {\n        // Remove empty text node, otherwise madness ensues (e.g. controls that\n        // use goog-inline-block will flicker and shift on hover on Gecko).\n        element.removeChild(node);\n      }\n      node = next;\n    }\n  }\n};\n\n\n/**\n * Inspects the element, and creates an instance of {@link goog.ui.Control} or\n * an appropriate subclass best suited to decorate it.  Returns the control (or\n * null if no suitable class was found).  This default implementation uses the\n * element's CSS class to find the appropriate control class to instantiate.\n * May be overridden in subclasses.\n * @param {Element} element Element to decorate.\n * @return {goog.ui.Control?} A new control suitable to decorate the element\n *     (null if none).\n */\ngoog.ui.ContainerRenderer.prototype.getDecoratorForChild = function(element) {\n  return /** @type {goog.ui.Control} */ (\n      goog.ui.registry.getDecorator(element));\n};\n\n\n/**\n * Initializes the container's DOM when the container enters the document.\n * Called from {@link goog.ui.Container#enterDocument}.\n * @param {goog.ui.Container} container Container whose DOM is to be initialized\n *     as it enters the document.\n */\ngoog.ui.ContainerRenderer.prototype.initializeDom = function(container) {\n  var elem = container.getElement();\n  goog.asserts.assert(elem, 'The container DOM element cannot be null.');\n  // Make sure the container's element isn't selectable.  On Gecko, recursively\n  // marking each child element unselectable is expensive and unnecessary, so\n  // only mark the root element unselectable.\n  goog.style.setUnselectable(elem, true, goog.userAgent.GECKO);\n\n  // IE doesn't support outline:none, so we have to use the hideFocus property.\n  if (goog.userAgent.IE) {\n    elem.hideFocus = true;\n  }\n\n  // Set the ARIA role.\n  var ariaRole = this.getAriaRole();\n  if (ariaRole) {\n    goog.a11y.aria.setRole(elem, ariaRole);\n  }\n};\n\n\n/**\n * Returns the element within the container's DOM that should receive keyboard\n * focus (null if none).  The default implementation returns the container's\n * root element.\n * @param {goog.ui.Container} container Container whose key event target is\n *     to be returned.\n * @return {Element} Key event target (null if none).\n */\ngoog.ui.ContainerRenderer.prototype.getKeyEventTarget = function(container) {\n  return container.getElement();\n};\n\n\n/**\n * Returns the CSS class to be applied to the root element of containers\n * rendered using this renderer.\n * @return {string} Renderer-specific CSS class.\n */\ngoog.ui.ContainerRenderer.prototype.getCssClass = function() {\n  return goog.ui.ContainerRenderer.CSS_CLASS;\n};\n\n\n/**\n * Returns all CSS class names applicable to the given container, based on its\n * state.  The array of class names returned includes the renderer's own CSS\n * class, followed by a CSS class indicating the container's orientation,\n * followed by any state-specific CSS classes.\n * @param {goog.ui.Container} container Container whose CSS classes are to be\n *     returned.\n * @return {!Array<string>} Array of CSS class names applicable to the\n *     container.\n */\ngoog.ui.ContainerRenderer.prototype.getClassNames = function(container) {\n  var baseClass = this.getCssClass();\n  var isHorizontal =\n      container.getOrientation() == goog.ui.Container.Orientation.HORIZONTAL;\n  var classNames = [\n    baseClass, (isHorizontal ? goog.getCssName(baseClass, 'horizontal') :\n                               goog.getCssName(baseClass, 'vertical'))\n  ];\n  if (!container.isEnabled()) {\n    classNames.push(goog.getCssName(baseClass, 'disabled'));\n  }\n  return classNames;\n};\n\n\n/**\n * Returns the default orientation of containers rendered or decorated by this\n * renderer.  The base class implementation returns `VERTICAL`.\n * @return {goog.ui.Container.Orientation} Default orientation for containers\n *     created or decorated by this renderer.\n * @suppress {missingRequire} goog.ui.Container\n */\ngoog.ui.ContainerRenderer.prototype.getDefaultOrientation = function() {\n  return goog.ui.Container.Orientation.VERTICAL;\n};\n","^AK",1579837703000,"^AL",["^AM",["~$goog.asserts","~$goog.dom.classlist","~$goog.dom.NodeType","~$goog.a11y.aria","~$goog.string","^AA","~$goog.ui.registry","~$goog.userAgent","~$goog.style","^AR","~$goog.dom.TagName"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/containerrenderer.js"],"^B6",["^AM",["~$goog.ui.ContainerRenderer"]],"^A?",true,"^A@",["^AA","^BE","^AR","^BB","^BD","^BJ","^BC","^BF","^BI","^BG","^BH"]],["^ ","^AC",[1579837703000],"^AD","goog.json.json_perf.js","^AE",["^AF","goog/json/json_perf.js"],"^AG","goog/json/json_perf.js","^AH","^AI","^AJ","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview JSON performance tests.\n */\n\ngoog.provide('goog.jsonPerf');\n\ngoog.require('goog.dom');\ngoog.require('goog.json');\ngoog.require('goog.math');\ngoog.require('goog.string');\ngoog.require('goog.testing.PerformanceTable');\ngoog.require('goog.testing.PropertyReplacer');\ngoog.require('goog.testing.jsunit');\n\ngoog.setTestOnly('goog.jsonPerf');\n\nvar table = new goog.testing.PerformanceTable(goog.dom.getElement('perfTable'));\n\nvar stubs = new goog.testing.PropertyReplacer();\n\nfunction tearDown() {\n  stubs.reset();\n}\n\nfunction testSerialize() {\n  var obj = populateObject({}, 50, 4);\n\n  table.run(function() {\n    var s = JSON.stringify(obj);\n  }, 'Stringify using JSON.stringify');\n\n  table.run(function() {\n    var s = goog.json.serialize(obj);\n  }, 'Stringify using goog.json.serialize');\n}\n\nfunction testParse() {\n  var obj = populateObject({}, 50, 4);\n  var s = JSON.stringify(obj);\n\n  table.run(function() { var o = JSON.parse(s); }, 'Parse using JSON.parse');\n\n  table.run(function() {\n    var o = goog.json.parse(s);\n  }, 'Parse using goog.json.parse');\n}\n\n\n/**\n * @param {!Object} obj The object to add properties to.\n * @param {number} numProperties The number of properties to add.\n * @param {number} depth The depth at which to recursively add properties.\n * @return {!Object} The object given in obj (for convenience).\n */\nfunction populateObject(obj, numProperties, depth) {\n  if (depth == 0) {\n    return randomLiteral();\n  }\n\n  // Make an object with a mix of strings, numbers, arrays, objects, booleans\n  // nulls as children.\n  for (var i = 0; i < numProperties; i++) {\n    var bucket = goog.math.randomInt(3);\n    switch (bucket) {\n      case 0:\n        obj[i] = randomLiteral();\n        break;\n      case 1:\n        obj[i] = populateObject({}, numProperties, depth - 1);\n        break;\n      case 2:\n        obj[i] = populateObject([], numProperties, depth - 1);\n        break;\n    }\n  }\n  return obj;\n}\n\n\nfunction randomLiteral() {\n  var bucket = goog.math.randomInt(3);\n  switch (bucket) {\n    case 0:\n      return goog.string.getRandomString();\n    case 1:\n      return Math.random();\n    case 2:\n      return Math.random() >= .5;\n  }\n  return null;\n}\n","^AK",1579837703000,"^AL",["^AM",["~$goog.dom","~$goog.json","^BF","^AA","~$goog.testing.PerformanceTable","~$goog.testing.PropertyReplacer","~$goog.testing.jsunit","~$goog.math"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/json/json_perf.js"],"^B6",["^AM",["~$goog.jsonPerf"]],"^A?",true,"^A@",["^AA","^BL","^BM","^BQ","^BF","^BN","^BO","^BP"]],["^ ","^AC",[1579837703000],"^AD","goog.ui.cookieeditor.js","^AE",["^AF","goog/ui/cookieeditor.js"],"^AG","goog/ui/cookieeditor.js","^AH","^AI","^AJ","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Displays and edits the value of a cookie.\n * Intended only for debugging.\n */\ngoog.provide('goog.ui.CookieEditor');\n\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events.EventType');\ngoog.require('goog.net.cookies');\ngoog.require('goog.string');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\n\n\n\n/**\n * Displays and edits the value of a cookie.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.Component}\n * @final\n */\ngoog.ui.CookieEditor = function(opt_domHelper) {\n  goog.ui.CookieEditor.base(this, 'constructor', opt_domHelper);\n};\ngoog.inherits(goog.ui.CookieEditor, goog.ui.Component);\n\n\n/**\n * Cookie key.\n * @type {?string}\n * @private\n */\ngoog.ui.CookieEditor.prototype.cookieKey_;\n\n\n/**\n * Text area.\n * @type {HTMLTextAreaElement}\n * @private\n */\ngoog.ui.CookieEditor.prototype.textAreaElem_;\n\n\n/**\n * Clear button.\n * @type {HTMLButtonElement}\n * @private\n */\ngoog.ui.CookieEditor.prototype.clearButtonElem_;\n\n\n/**\n * Invalid value warning text.\n * @type {HTMLSpanElement}\n * @private\n */\ngoog.ui.CookieEditor.prototype.valueWarningElem_;\n\n\n/**\n * Update button.\n * @type {HTMLButtonElement}\n * @private\n */\ngoog.ui.CookieEditor.prototype.updateButtonElem_;\n\n\n// TODO(user): add combobox for user to select different cookies\n/**\n * Sets the cookie which this component will edit.\n * @param {string} cookieKey Cookie key.\n */\ngoog.ui.CookieEditor.prototype.selectCookie = function(cookieKey) {\n  goog.asserts.assert(goog.net.cookies.isValidName(cookieKey));\n  this.cookieKey_ = cookieKey;\n  if (this.textAreaElem_) {\n    this.textAreaElem_.value = goog.net.cookies.get(cookieKey) || '';\n  }\n};\n\n\n/** @override */\ngoog.ui.CookieEditor.prototype.canDecorate = function() {\n  return false;\n};\n\n\n/** @override */\ngoog.ui.CookieEditor.prototype.createDom = function() {\n  // Debug-only, so we don't need i18n.\n  this.clearButtonElem_ = goog.dom.createDom(\n      goog.dom.TagName.BUTTON, /* attributes */ null, 'Clear');\n  this.updateButtonElem_ = goog.dom.createDom(\n      goog.dom.TagName.BUTTON, /* attributes */ null, 'Update');\n  var value = this.cookieKey_ && goog.net.cookies.get(this.cookieKey_);\n  this.textAreaElem_ = goog.dom.createDom(\n      goog.dom.TagName.TEXTAREA, /* attibutes */ null, value || '');\n  this.valueWarningElem_ = goog.dom.createDom(\n      goog.dom.TagName.SPAN,\n      /* attibutes */ {'style': 'display:none;color:red'},\n      'Invalid cookie value.');\n  this.setElementInternal(\n      goog.dom.createDom(\n          goog.dom.TagName.DIV,\n          /* attibutes */ null, this.valueWarningElem_,\n          goog.dom.createDom(goog.dom.TagName.BR), this.textAreaElem_,\n          goog.dom.createDom(goog.dom.TagName.BR), this.clearButtonElem_,\n          this.updateButtonElem_));\n};\n\n\n/** @override */\ngoog.ui.CookieEditor.prototype.enterDocument = function() {\n  goog.ui.CookieEditor.base(this, 'enterDocument');\n  this.getHandler().listen(\n      this.clearButtonElem_, goog.events.EventType.CLICK, this.handleClear_);\n  this.getHandler().listen(\n      this.updateButtonElem_, goog.events.EventType.CLICK, this.handleUpdate_);\n};\n\n\n/**\n * Handles user clicking clear button.\n * @param {!goog.events.Event} e The click event.\n * @private\n */\ngoog.ui.CookieEditor.prototype.handleClear_ = function(e) {\n  if (this.cookieKey_) {\n    goog.net.cookies.remove(this.cookieKey_);\n  }\n  this.textAreaElem_.value = '';\n};\n\n\n/**\n * Handles user clicking update button.\n * @param {!goog.events.Event} e The click event.\n * @private\n */\ngoog.ui.CookieEditor.prototype.handleUpdate_ = function(e) {\n  if (this.cookieKey_) {\n    var value = this.textAreaElem_.value;\n    if (value) {\n      // Strip line breaks.\n      value = goog.string.stripNewlines(value);\n    }\n    if (goog.net.cookies.isValidValue(value)) {\n      goog.net.cookies.set(this.cookieKey_, value);\n      goog.style.setElementShown(this.valueWarningElem_, false);\n    } else {\n      goog.style.setElementShown(this.valueWarningElem_, true);\n    }\n  }\n};\n\n\n/** @override */\ngoog.ui.CookieEditor.prototype.disposeInternal = function() {\n  this.clearButtonElem_ = null;\n  this.cookieKey_ = null;\n  this.textAreaElem_ = null;\n  this.updateButtonElem_ = null;\n  this.valueWarningElem_ = null;\n};\n","^AK",1579837703000,"^AL",["^AM",["^BB","^BL","~$goog.net.cookies","^BF","~$goog.ui.Component","^AA","~$goog.events.EventType","^BI","^BJ"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/cookieeditor.js"],"^B6",["^AM",["~$goog.ui.CookieEditor"]],"^A?",true,"^A@",["^AA","^BB","^BL","^BJ","^BU","^BS","^BF","^BI","^BT"]],["^ ","^AC",[1579837703000],"^B?",true,"^AD","goog.math.long.js","^AE",["^AF","goog/math/long.js"],"^AG","goog/math/long.js","^AH","^AI","^AJ","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines a Long class for representing a 64-bit two's-complement\n * integer value, which faithfully simulates the behavior of a Java \"long\". This\n * implementation is derived from LongLib in GWT.\n *\n */\n\ngoog.module('goog.math.Long');\ngoog.module.declareLegacyNamespace();\n\nconst asserts = goog.require('goog.asserts');\nconst reflect = goog.require('goog.reflect');\n\n/**\n * Represents a 64-bit two's-complement integer, given its low and high 32-bit\n * values as *signed* integers.  See the from* functions below for more\n * convenient ways of constructing Longs.\n *\n * The internal representation of a long is the two given signed, 32-bit values.\n * We use 32-bit pieces because these are the size of integers on which\n * JavaScript performs bit-operations.  For operations like addition and\n * multiplication, we split each number into 16-bit pieces, which can easily be\n * multiplied within JavaScript's floating-point representation without overflow\n * or change in sign.\n *\n * In the algorithms below, we frequently reduce the negative case to the\n * positive case by negating the input(s) and then post-processing the result.\n * Note that we must ALWAYS check specially whether those values are MIN_VALUE\n * (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\n * a positive number, it overflows back into a negative).  Not handling this\n * case would often result in infinite recursion.\n * @final\n */\nclass Long {\n  /**\n   * @param {number} low  The low (signed) 32 bits of the long.\n   * @param {number} high  The high (signed) 32 bits of the long.\n   */\n  constructor(low, high) {\n    /**\n     * @const {number}\n     * @private\n     */\n    this.low_ = low | 0;  // force into 32 signed bits.\n\n    /**\n     * @const {number}\n     * @private\n     */\n    this.high_ = high | 0;  // force into 32 signed bits.\n  }\n\n  /** @return {number} The value, assuming it is a 32-bit integer. */\n  toInt() {\n    return this.low_;\n  }\n\n  /**\n   * @return {number} The closest floating-point representation to this value.\n   */\n  toNumber() {\n    return this.high_ * TWO_PWR_32_DBL_ + this.getLowBitsUnsigned();\n  }\n\n  /**\n   * @return {boolean} if can be exactly represented using number (i.e.\n   *     abs(value) < 2^53).\n   */\n  isSafeInteger() {\n    var top11Bits = this.high_ >> 21;\n    // If top11Bits are all 0s, then the number is between [0, 2^53-1]\n    return top11Bits == 0\n        // If top11Bits are all 1s, then the number is between [-1, -2^53]\n        || (top11Bits == -1\n            // and exclude -2^53\n            && !(this.low_ == 0 && this.high_ == (0xffe00000 | 0)));\n  }\n\n  /**\n   * @param {number=} opt_radix The radix in which the text should be written.\n   * @return {string} The textual representation of this value.\n   * @override\n   */\n  toString(opt_radix) {\n    var radix = opt_radix || 10;\n    if (radix < 2 || 36 < radix) {\n      throw new Error('radix out of range: ' + radix);\n    }\n\n    // We can avoid very expensive division based code path for some common\n    // cases.\n    if (this.isSafeInteger()) {\n      var asNumber = this.toNumber();\n      // Shortcutting for radix 10 (common case) to avoid boxing via toString:\n      // https://jsperf.com/tostring-vs-vs-if\n      return radix == 10 ? ('' + asNumber) : asNumber.toString(radix);\n    }\n\n    // We need to split 64bit integer into: `a * radix**safeDigits + b` where\n    // neither `a` nor `b` exceeds 53 bits, meaning that safeDigits can be any\n    // number in a range: [(63 - 53) / log2(radix); 53 / log2(radix)].\n\n    // Other options that need to be benchmarked:\n    //   11..16 - (radix >> 2);\n    //   10..13 - (radix >> 3);\n    //   10..11 - (radix >> 4);\n    var safeDigits = 14 - (radix >> 2);\n\n    var radixPowSafeDigits = Math.pow(radix, safeDigits);\n    var radixToPower =\n        Long.fromBits(radixPowSafeDigits, radixPowSafeDigits / TWO_PWR_32_DBL_);\n\n    var remDiv = this.div(radixToPower);\n    var val = Math.abs(this.subtract(remDiv.multiply(radixToPower)).toNumber());\n    var digits = radix == 10 ? ('' + val) : val.toString(radix);\n\n    if (digits.length < safeDigits) {\n      // Up to 13 leading 0s we might need to insert as the greatest safeDigits\n      // value is 14 (for radix 2).\n      digits = '0000000000000'.substr(digits.length - safeDigits) + digits;\n    }\n\n    val = remDiv.toNumber();\n    return (radix == 10 ? val : val.toString(radix)) + digits;\n  }\n\n  /** @return {number} The high 32-bits as a signed value. */\n  getHighBits() {\n    return this.high_;\n  }\n\n  /** @return {number} The low 32-bits as a signed value. */\n  getLowBits() {\n    return this.low_;\n  }\n\n  /** @return {number} The low 32-bits as an unsigned value. */\n  getLowBitsUnsigned() {\n    // The right shifting fixes negative values in the case when\n    // intval >= 2^31; for more details see\n    // https://github.com/google/closure-library/pull/498\n    return this.low_ >>> 0;\n  }\n\n  /**\n   * @return {number} Returns the number of bits needed to represent the\n   *     absolute value of this Long.\n   */\n  getNumBitsAbs() {\n    if (this.isNegative()) {\n      if (this.equals(Long.getMinValue())) {\n        return 64;\n      } else {\n        return this.negate().getNumBitsAbs();\n      }\n    } else {\n      var val = this.high_ != 0 ? this.high_ : this.low_;\n      for (var bit = 31; bit > 0; bit--) {\n        if ((val & (1 << bit)) != 0) {\n          break;\n        }\n      }\n      return this.high_ != 0 ? bit + 33 : bit + 1;\n    }\n  }\n\n  /** @return {boolean} Whether this value is zero. */\n  isZero() {\n    // Check low part first as there is high chance it's not 0.\n    return this.low_ == 0 && this.high_ == 0;\n  }\n\n  /** @return {boolean} Whether this value is negative. */\n  isNegative() {\n    return this.high_ < 0;\n  }\n\n  /** @return {boolean} Whether this value is odd. */\n  isOdd() {\n    return (this.low_ & 1) == 1;\n  }\n\n  /**\n   * @param {?Long} other Long to compare against.\n   * @return {boolean} Whether this Long equals the other.\n   */\n  equals(other) {\n    // Compare low parts first as there is higher chance they are different.\n    return (this.low_ == other.low_) && (this.high_ == other.high_);\n  }\n\n  /**\n   * @param {?Long} other Long to compare against.\n   * @return {boolean} Whether this Long does not equal the other.\n   */\n  notEquals(other) {\n    return !this.equals(other);\n  }\n\n  /**\n   * @param {?Long} other Long to compare against.\n   * @return {boolean} Whether this Long is less than the other.\n   */\n  lessThan(other) {\n    return this.compare(other) < 0;\n  }\n\n  /**\n   * @param {?Long} other Long to compare against.\n   * @return {boolean} Whether this Long is less than or equal to the other.\n   */\n  lessThanOrEqual(other) {\n    return this.compare(other) <= 0;\n  }\n\n  /**\n   * @param {?Long} other Long to compare against.\n   * @return {boolean} Whether this Long is greater than the other.\n   */\n  greaterThan(other) {\n    return this.compare(other) > 0;\n  }\n\n  /**\n   * @param {?Long} other Long to compare against.\n   * @return {boolean} Whether this Long is greater than or equal to the other.\n   */\n  greaterThanOrEqual(other) {\n    return this.compare(other) >= 0;\n  }\n\n  /**\n   * Compares this Long with the given one.\n   * @param {?Long} other Long to compare against.\n   * @return {number} 0 if they are the same, 1 if the this is greater, and -1\n   *     if the given one is greater.\n   */\n  compare(other) {\n    if (this.high_ == other.high_) {\n      if (this.low_ == other.low_) {\n        return 0;\n      }\n      return this.getLowBitsUnsigned() > other.getLowBitsUnsigned() ? 1 : -1;\n    }\n    return this.high_ > other.high_ ? 1 : -1;\n  }\n\n  /** @return {!Long} The negation of this value. */\n  negate() {\n    var negLow = (~this.low_ + 1) | 0;\n    var overflowFromLow = !negLow;\n    var negHigh = (~this.high_ + overflowFromLow) | 0;\n    return Long.fromBits(negLow, negHigh);\n  }\n\n  /**\n   * Returns the sum of this and the given Long.\n   * @param {?Long} other Long to add to this one.\n   * @return {!Long} The sum of this and the given Long.\n   */\n  add(other) {\n    // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\n\n    var a48 = this.high_ >>> 16;\n    var a32 = this.high_ & 0xFFFF;\n    var a16 = this.low_ >>> 16;\n    var a00 = this.low_ & 0xFFFF;\n\n    var b48 = other.high_ >>> 16;\n    var b32 = other.high_ & 0xFFFF;\n    var b16 = other.low_ >>> 16;\n    var b00 = other.low_ & 0xFFFF;\n\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n    c00 += a00 + b00;\n    c16 += c00 >>> 16;\n    c00 &= 0xFFFF;\n    c16 += a16 + b16;\n    c32 += c16 >>> 16;\n    c16 &= 0xFFFF;\n    c32 += a32 + b32;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c48 += a48 + b48;\n    c48 &= 0xFFFF;\n    return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\n  }\n\n  /**\n   * Returns the difference of this and the given Long.\n   * @param {?Long} other Long to subtract from this.\n   * @return {!Long} The difference of this and the given Long.\n   */\n  subtract(other) {\n    return this.add(other.negate());\n  }\n\n  /**\n   * Returns the product of this and the given long.\n   * @param {?Long} other Long to multiply with this.\n   * @return {!Long} The product of this and the other.\n   */\n  multiply(other) {\n    if (this.isZero()) {\n      return this;\n    }\n    if (other.isZero()) {\n      return other;\n    }\n\n    // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\n    // We can skip products that would overflow.\n\n    var a48 = this.high_ >>> 16;\n    var a32 = this.high_ & 0xFFFF;\n    var a16 = this.low_ >>> 16;\n    var a00 = this.low_ & 0xFFFF;\n\n    var b48 = other.high_ >>> 16;\n    var b32 = other.high_ & 0xFFFF;\n    var b16 = other.low_ >>> 16;\n    var b00 = other.low_ & 0xFFFF;\n\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\n    c00 += a00 * b00;\n    c16 += c00 >>> 16;\n    c00 &= 0xFFFF;\n    c16 += a16 * b00;\n    c32 += c16 >>> 16;\n    c16 &= 0xFFFF;\n    c16 += a00 * b16;\n    c32 += c16 >>> 16;\n    c16 &= 0xFFFF;\n    c32 += a32 * b00;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c32 += a16 * b16;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c32 += a00 * b32;\n    c48 += c32 >>> 16;\n    c32 &= 0xFFFF;\n    c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\n    c48 &= 0xFFFF;\n    return Long.fromBits((c16 << 16) | c00, (c48 << 16) | c32);\n  }\n\n  /**\n   * Returns this Long divided by the given one.\n   * @param {?Long} other Long by which to divide.\n   * @return {!Long} This Long divided by the given one.\n   */\n  div(other) {\n    if (other.isZero()) {\n      throw new Error('division by zero');\n    }\n    if (this.isNegative()) {\n      if (this.equals(Long.getMinValue())) {\n        if (other.equals(Long.getOne()) || other.equals(Long.getNegOne())) {\n          return Long.getMinValue();  // recall -MIN_VALUE == MIN_VALUE\n        }\n        if (other.equals(Long.getMinValue())) {\n          return Long.getOne();\n        }\n        // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\n        var halfThis = this.shiftRight(1);\n        var approx = halfThis.div(other).shiftLeft(1);\n        if (approx.equals(Long.getZero())) {\n          return other.isNegative() ? Long.getOne() : Long.getNegOne();\n        }\n        var rem = this.subtract(other.multiply(approx));\n        var result = approx.add(rem.div(other));\n        return result;\n      }\n      if (other.isNegative()) {\n        return this.negate().div(other.negate());\n      }\n      return this.negate().div(other).negate();\n    }\n    if (this.isZero()) {\n      return Long.getZero();\n    }\n    if (other.isNegative()) {\n      if (other.equals(Long.getMinValue())) {\n        return Long.getZero();\n      }\n      return this.div(other.negate()).negate();\n    }\n\n    // Repeat the following until the remainder is less than other:  find a\n    // floating-point that approximates remainder / other *from below*, add this\n    // into the result, and subtract it from the remainder.  It is critical that\n    // the approximate value is less than or equal to the real value so that the\n    // remainder never becomes negative.\n    var res = Long.getZero();\n    var rem = this;\n    while (rem.greaterThanOrEqual(other)) {\n      // Approximate the result of division. This may be a little greater or\n      // smaller than the actual value.\n      var approx = Math.max(1, Math.floor(rem.toNumber() / other.toNumber()));\n\n      // We will tweak the approximate result by changing it in the 48-th digit\n      // or the smallest non-fractional digit, whichever is larger.\n      var log2 = Math.ceil(Math.log(approx) / Math.LN2);\n      var delta = (log2 <= 48) ? 1 : Math.pow(2, log2 - 48);\n\n      // Decrease the approximation until it is smaller than the remainder. Note\n      // that if it is too large, the product overflows and is negative.\n      var approxRes = Long.fromNumber(approx);\n      var approxRem = approxRes.multiply(other);\n      while (approxRem.isNegative() || approxRem.greaterThan(rem)) {\n        approx -= delta;\n        approxRes = Long.fromNumber(approx);\n        approxRem = approxRes.multiply(other);\n      }\n\n      // We know the answer can't be zero... and actually, zero would cause\n      // infinite recursion since we would make no progress.\n      if (approxRes.isZero()) {\n        approxRes = Long.getOne();\n      }\n\n      res = res.add(approxRes);\n      rem = rem.subtract(approxRem);\n    }\n    return res;\n  }\n\n  /**\n   * Returns this Long modulo the given one.\n   * @param {?Long} other Long by which to mod.\n   * @return {!Long} This Long modulo the given one.\n   */\n  modulo(other) {\n    return this.subtract(this.div(other).multiply(other));\n  }\n\n  /** @return {!Long} The bitwise-NOT of this value. */\n  not() {\n    return Long.fromBits(~this.low_, ~this.high_);\n  }\n\n  /**\n   * Returns the bitwise-AND of this Long and the given one.\n   * @param {?Long} other The Long with which to AND.\n   * @return {!Long} The bitwise-AND of this and the other.\n   */\n  and(other) {\n    return Long.fromBits(this.low_ & other.low_, this.high_ & other.high_);\n  }\n\n  /**\n   * Returns the bitwise-OR of this Long and the given one.\n   * @param {?Long} other The Long with which to OR.\n   * @return {!Long} The bitwise-OR of this and the other.\n   */\n  or(other) {\n    return Long.fromBits(this.low_ | other.low_, this.high_ | other.high_);\n  }\n\n  /**\n   * Returns the bitwise-XOR of this Long and the given one.\n   * @param {?Long} other The Long with which to XOR.\n   * @return {!Long} The bitwise-XOR of this and the other.\n   */\n  xor(other) {\n    return Long.fromBits(this.low_ ^ other.low_, this.high_ ^ other.high_);\n  }\n\n  /**\n   * Returns this Long with bits shifted to the left by the given amount.\n   * @param {number} numBits The number of bits by which to shift.\n   * @return {!Long} This shifted to the left by the given amount.\n   */\n  shiftLeft(numBits) {\n    numBits &= 63;\n    if (numBits == 0) {\n      return this;\n    } else {\n      var low = this.low_;\n      if (numBits < 32) {\n        var high = this.high_;\n        return Long.fromBits(\n            low << numBits, (high << numBits) | (low >>> (32 - numBits)));\n      } else {\n        return Long.fromBits(0, low << (numBits - 32));\n      }\n    }\n  }\n\n  /**\n   * Returns this Long with bits shifted to the right by the given amount.\n   * The new leading bits match the current sign bit.\n   * @param {number} numBits The number of bits by which to shift.\n   * @return {!Long} This shifted to the right by the given amount.\n   */\n  shiftRight(numBits) {\n    numBits &= 63;\n    if (numBits == 0) {\n      return this;\n    } else {\n      var high = this.high_;\n      if (numBits < 32) {\n        var low = this.low_;\n        return Long.fromBits(\n            (low >>> numBits) | (high << (32 - numBits)), high >> numBits);\n      } else {\n        return Long.fromBits(high >> (numBits - 32), high >= 0 ? 0 : -1);\n      }\n    }\n  }\n\n  /**\n   * Returns this Long with bits shifted to the right by the given amount, with\n   * zeros placed into the new leading bits.\n   * @param {number} numBits The number of bits by which to shift.\n   * @return {!Long} This shifted to the right by the given amount,\n   *     with zeros placed into the new leading bits.\n   */\n  shiftRightUnsigned(numBits) {\n    numBits &= 63;\n    if (numBits == 0) {\n      return this;\n    } else {\n      var high = this.high_;\n      if (numBits < 32) {\n        var low = this.low_;\n        return Long.fromBits(\n            (low >>> numBits) | (high << (32 - numBits)), high >>> numBits);\n      } else if (numBits == 32) {\n        return Long.fromBits(high, 0);\n      } else {\n        return Long.fromBits(high >>> (numBits - 32), 0);\n      }\n    }\n  }\n\n  /**\n   * Returns a Long representing the given (32-bit) integer value.\n   * @param {number} value The 32-bit integer in question.\n   * @return {!Long} The corresponding Long value.\n   */\n  static fromInt(value) {\n    var intValue = value | 0;\n    asserts.assert(value === intValue, 'value should be a 32-bit integer');\n\n    if (-128 <= intValue && intValue < 128) {\n      return getCachedIntValue_(intValue);\n    } else {\n      return new Long(intValue, intValue < 0 ? -1 : 0);\n    }\n  }\n\n  /**\n   * Returns a Long representing the given value.\n   * NaN will be returned as zero. Infinity is converted to max value and\n   * -Infinity to min value.\n   * @param {number} value The number in question.\n   * @return {!Long} The corresponding Long value.\n   */\n  static fromNumber(value) {\n    if (value > 0) {\n      if (value >= TWO_PWR_63_DBL_) {\n        return Long.getMaxValue();\n      }\n      return new Long(value, value / TWO_PWR_32_DBL_);\n    } else if (value < 0) {\n      if (value <= -TWO_PWR_63_DBL_) {\n        return Long.getMinValue();\n      }\n      return new Long(-value, -value / TWO_PWR_32_DBL_).negate();\n    } else {\n      // NaN or 0.\n      return Long.getZero();\n    }\n  }\n\n  /**\n   * Returns a Long representing the 64-bit integer that comes by concatenating\n   * the given high and low bits.  Each is assumed to use 32 bits.\n   * @param {number} lowBits The low 32-bits.\n   * @param {number} highBits The high 32-bits.\n   * @return {!Long} The corresponding Long value.\n   */\n  static fromBits(lowBits, highBits) {\n    return new Long(lowBits, highBits);\n  }\n\n  /**\n   * Returns a Long representation of the given string, written using the given\n   * radix.\n   * @param {string} str The textual representation of the Long.\n   * @param {number=} opt_radix The radix in which the text is written.\n   * @return {!Long} The corresponding Long value.\n   */\n  static fromString(str, opt_radix) {\n    if (str.charAt(0) == '-') {\n      return Long.fromString(str.substring(1), opt_radix).negate();\n    }\n\n    // We can avoid very expensive multiply based code path for some common\n    // cases.\n    var numberValue = parseInt(str, opt_radix || 10);\n    if (numberValue <= MAX_SAFE_INTEGER_) {\n      return new Long(\n          (numberValue % TWO_PWR_32_DBL_) | 0,\n          (numberValue / TWO_PWR_32_DBL_) | 0);\n    }\n\n    if (str.length == 0) {\n      throw new Error('number format error: empty string');\n    }\n    if (str.indexOf('-') >= 0) {\n      throw new Error('number format error: interior \"-\" character: ' + str);\n    }\n\n    var radix = opt_radix || 10;\n    if (radix < 2 || 36 < radix) {\n      throw new Error('radix out of range: ' + radix);\n    }\n\n    // Do several (8) digits each time through the loop, so as to\n    // minimize the calls to the very expensive emulated multiply.\n    var radixToPower = Long.fromNumber(Math.pow(radix, 8));\n\n    var result = Long.getZero();\n    for (var i = 0; i < str.length; i += 8) {\n      var size = Math.min(8, str.length - i);\n      var value = parseInt(str.substring(i, i + size), radix);\n      if (size < 8) {\n        var power = Long.fromNumber(Math.pow(radix, size));\n        result = result.multiply(power).add(Long.fromNumber(value));\n      } else {\n        result = result.multiply(radixToPower);\n        result = result.add(Long.fromNumber(value));\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Returns the boolean value of whether the input string is within a Long's\n   * range. Assumes an input string containing only numeric characters with an\n   * optional preceding '-'.\n   * @param {string} str The textual representation of the Long.\n   * @param {number=} opt_radix The radix in which the text is written.\n   * @return {boolean} Whether the string is within the range of a Long.\n   */\n  static isStringInRange(str, opt_radix) {\n    var radix = opt_radix || 10;\n    if (radix < 2 || 36 < radix) {\n      throw new Error('radix out of range: ' + radix);\n    }\n\n    var extremeValue = (str.charAt(0) == '-') ? MIN_VALUE_FOR_RADIX_[radix] :\n                                                MAX_VALUE_FOR_RADIX_[radix];\n\n    if (str.length < extremeValue.length) {\n      return true;\n    } else if (str.length == extremeValue.length && str <= extremeValue) {\n      return true;\n    } else {\n      return false;\n    }\n  }\n\n  /**\n   * @return {!Long}\n   * @public\n   */\n  static getZero() {\n    return ZERO_;\n  }\n\n  /**\n   * @return {!Long}\n   * @public\n   */\n  static getOne() {\n    return ONE_;\n  }\n\n  /**\n   * @return {!Long}\n   * @public\n   */\n  static getNegOne() {\n    return NEG_ONE_;\n  }\n\n  /**\n   * @return {!Long}\n   * @public\n   */\n  static getMaxValue() {\n    return MAX_VALUE_;\n  }\n\n  /**\n   * @return {!Long}\n   * @public\n   */\n  static getMinValue() {\n    return MIN_VALUE_;\n  }\n\n  /**\n   * @return {!Long}\n   * @public\n   */\n  static getTwoPwr24() {\n    return TWO_PWR_24_;\n  }\n}\n\nexports = Long;\n\n// NOTE: Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the\n// from* methods on which they depend.\n\n\n/**\n * A cache of the Long representations of small integer values.\n * @type {!Object<number, !Long>}\n * @private @const\n */\nconst IntCache_ = {};\n\n\n/**\n * Returns a cached long number representing the given (32-bit) integer value.\n * @param {number} value The 32-bit integer in question.\n * @return {!Long} The corresponding Long value.\n * @private\n */\nfunction getCachedIntValue_(value) {\n  return reflect.cache(IntCache_, value, function(val) {\n    return new Long(val, val < 0 ? -1 : 0);\n  });\n}\n\n/**\n * The array of maximum values of a Long in string representation for a given\n * radix between 2 and 36, inclusive.\n * @private @const {!Array<string>}\n */\nconst MAX_VALUE_FOR_RADIX_ = [\n  '', '',  // unused\n  '111111111111111111111111111111111111111111111111111111111111111',\n  // base 2\n  '2021110011022210012102010021220101220221',  // base 3\n  '13333333333333333333333333333333',          // base 4\n  '1104332401304422434310311212',              // base 5\n  '1540241003031030222122211',                 // base 6\n  '22341010611245052052300',                   // base 7\n  '777777777777777777777',                     // base 8\n  '67404283172107811827',                      // base 9\n  '9223372036854775807',                       // base 10\n  '1728002635214590697',                       // base 11\n  '41a792678515120367',                        // base 12\n  '10b269549075433c37',                        // base 13\n  '4340724c6c71dc7a7',                         // base 14\n  '160e2ad3246366807',                         // base 15\n  '7fffffffffffffff',                          // base 16\n  '33d3d8307b214008',                          // base 17\n  '16agh595df825fa7',                          // base 18\n  'ba643dci0ffeehh',                           // base 19\n  '5cbfjia3fh26ja7',                           // base 20\n  '2heiciiie82dh97',                           // base 21\n  '1adaibb21dckfa7',                           // base 22\n  'i6k448cf4192c2',                            // base 23\n  'acd772jnc9l0l7',                            // base 24\n  '64ie1focnn5g77',                            // base 25\n  '3igoecjbmca687',                            // base 26\n  '27c48l5b37oaop',                            // base 27\n  '1bk39f3ah3dmq7',                            // base 28\n  'q1se8f0m04isb',                             // base 29\n  'hajppbc1fc207',                             // base 30\n  'bm03i95hia437',                             // base 31\n  '7vvvvvvvvvvvv',                             // base 32\n  '5hg4ck9jd4u37',                             // base 33\n  '3tdtk1v8j6tpp',                             // base 34\n  '2pijmikexrxp7',                             // base 35\n  '1y2p0ij32e8e7'                              // base 36\n];\n\n\n/**\n * The array of minimum values of a Long in string representation for a given\n * radix between 2 and 36, inclusive.\n * @private @const {!Array<string>}\n */\nconst MIN_VALUE_FOR_RADIX_ = [\n  '', '',  // unused\n  '-1000000000000000000000000000000000000000000000000000000000000000',\n  // base 2\n  '-2021110011022210012102010021220101220222',  // base 3\n  '-20000000000000000000000000000000',          // base 4\n  '-1104332401304422434310311213',              // base 5\n  '-1540241003031030222122212',                 // base 6\n  '-22341010611245052052301',                   // base 7\n  '-1000000000000000000000',                    // base 8\n  '-67404283172107811828',                      // base 9\n  '-9223372036854775808',                       // base 10\n  '-1728002635214590698',                       // base 11\n  '-41a792678515120368',                        // base 12\n  '-10b269549075433c38',                        // base 13\n  '-4340724c6c71dc7a8',                         // base 14\n  '-160e2ad3246366808',                         // base 15\n  '-8000000000000000',                          // base 16\n  '-33d3d8307b214009',                          // base 17\n  '-16agh595df825fa8',                          // base 18\n  '-ba643dci0ffeehi',                           // base 19\n  '-5cbfjia3fh26ja8',                           // base 20\n  '-2heiciiie82dh98',                           // base 21\n  '-1adaibb21dckfa8',                           // base 22\n  '-i6k448cf4192c3',                            // base 23\n  '-acd772jnc9l0l8',                            // base 24\n  '-64ie1focnn5g78',                            // base 25\n  '-3igoecjbmca688',                            // base 26\n  '-27c48l5b37oaoq',                            // base 27\n  '-1bk39f3ah3dmq8',                            // base 28\n  '-q1se8f0m04isc',                             // base 29\n  '-hajppbc1fc208',                             // base 30\n  '-bm03i95hia438',                             // base 31\n  '-8000000000000',                             // base 32\n  '-5hg4ck9jd4u38',                             // base 33\n  '-3tdtk1v8j6tpq',                             // base 34\n  '-2pijmikexrxp8',                             // base 35\n  '-1y2p0ij32e8e8'                              // base 36\n];\n\n/**\n * TODO(goktug): Replace with Number.MAX_SAFE_INTEGER when polyfil is guaranteed\n * to be removed.\n * @type {number}\n * @private @const\n */\nconst MAX_SAFE_INTEGER_ = 0x1fffffffffffff;\n\n// NOTE: the compiler should inline these constant values below and then remove\n// these variables, so there should be no runtime penalty for these.\n\n/**\n * Number used repeated below in calculations.  This must appear before the\n * first call to any from* function above.\n * @const {number}\n * @private\n */\nconst TWO_PWR_32_DBL_ = 0x100000000;\n\n\n/**\n * @const {number}\n * @private\n */\nconst TWO_PWR_63_DBL_ = 0x8000000000000000;\n\n\n/**\n * @private @const {!Long}\n */\nconst ZERO_ = Long.fromBits(0, 0);\n\n\n/**\n * @private @const {!Long}\n */\nconst ONE_ = Long.fromBits(1, 0);\n\n/**\n * @private @const {!Long}\n */\nconst NEG_ONE_ = Long.fromBits(-1, -1);\n\n/**\n * @private @const {!Long}\n */\nconst MAX_VALUE_ = Long.fromBits(0xFFFFFFFF, 0x7FFFFFFF);\n\n/**\n * @private @const {!Long}\n */\nconst MIN_VALUE_ = Long.fromBits(0, 0x80000000);\n\n/**\n * @private @const {!Long}\n */\nconst TWO_PWR_24_ = Long.fromBits(1 << 24, 0);\n","^AK",1579837703000,"^AL",["^AM",["^BB","~$goog.reflect","^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/long.js"],"^B6",["^AM",["~$goog.math.Long"]],"^A?",true,"^A@",["^AA","^BB","^BW"]],["^ ","^AC",[1579837703000],"^AD","goog.ui.rangemodel.js","^AE",["^AF","goog/ui/rangemodel.js"],"^AG","goog/ui/rangemodel.js","^AH","^AI","^AJ","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implementation of a range model. This is an implementation of\n * the BoundedRangeModel as described by Java at\n * http://java.sun.com/javase/6/docs/api/javax/swing/BoundedRangeModel.html.\n *\n * One good way to understand the range model is to think of a scroll bar for\n * a scrollable element. In that case minimum is 0, maximum is scrollHeight,\n * value is scrollTop and extent is clientHeight.\n *\n * Based on http://webfx.eae.net/dhtml/slider/js/range.js\n *\n * @author arv@google.com (Erik Arvidsson)\n */\n\ngoog.provide('goog.ui.RangeModel');\n\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.ui.Component');\n\n\n\n/**\n * Creates a range model\n * @extends {goog.events.EventTarget}\n * @constructor\n */\ngoog.ui.RangeModel = function() {\n  goog.events.EventTarget.call(this);\n};\ngoog.inherits(goog.ui.RangeModel, goog.events.EventTarget);\ngoog.tagUnsealableClass(goog.ui.RangeModel);\n\n\n/**\n * @type {number}\n * @private\n */\ngoog.ui.RangeModel.prototype.value_ = 0;\n\n\n/**\n * @type {number}\n * @private\n */\ngoog.ui.RangeModel.prototype.minimum_ = 0;\n\n\n/**\n * @type {number}\n * @private\n */\ngoog.ui.RangeModel.prototype.maximum_ = 100;\n\n\n/**\n * @type {number}\n * @private\n */\ngoog.ui.RangeModel.prototype.extent_ = 0;\n\n\n/**\n * @type {?number}\n * @private\n */\ngoog.ui.RangeModel.prototype.step_ = 1;\n\n\n/**\n * This is true if something is changed as a side effect. This happens when for\n * example we set the maximum below the current value.\n * @type {boolean}\n * @private\n */\ngoog.ui.RangeModel.prototype.isChanging_ = false;\n\n\n/**\n * If set to true, we do not fire any change events.\n * @type {boolean}\n * @private\n */\ngoog.ui.RangeModel.prototype.mute_ = false;\n\n\n/**\n * Sets the model to mute / unmute.\n * @param {boolean} muteValue Whether or not to mute the range, i.e.,\n *     suppress any CHANGE events.\n */\ngoog.ui.RangeModel.prototype.setMute = function(muteValue) {\n  this.mute_ = muteValue;\n};\n\n\n/**\n * Sets the value.\n * @param {number} value The new value.\n */\ngoog.ui.RangeModel.prototype.setValue = function(value) {\n  value = this.roundToStepWithMin(value);\n  if (this.value_ != value) {\n    if (value + this.extent_ > this.maximum_) {\n      this.value_ = this.maximum_ - this.extent_;\n    } else if (value < this.minimum_) {\n      this.value_ = this.minimum_;\n    } else {\n      this.value_ = value;\n    }\n    if (!this.isChanging_ && !this.mute_) {\n      this.dispatchEvent(goog.ui.Component.EventType.CHANGE);\n    }\n  }\n};\n\n\n/**\n * @return {number} the current value.\n */\ngoog.ui.RangeModel.prototype.getValue = function() {\n  return this.roundToStepWithMin(this.value_);\n};\n\n\n/**\n * Sets the extent. The extent is the 'size' of the value.\n * @param {number} extent The new extent.\n */\ngoog.ui.RangeModel.prototype.setExtent = function(extent) {\n  extent = this.roundToStepWithMin(extent);\n  if (this.extent_ != extent) {\n    if (extent < 0) {\n      this.extent_ = 0;\n    } else if (this.value_ + extent > this.maximum_) {\n      this.extent_ = this.maximum_ - this.value_;\n    } else {\n      this.extent_ = extent;\n    }\n    if (!this.isChanging_ && !this.mute_) {\n      this.dispatchEvent(goog.ui.Component.EventType.CHANGE);\n    }\n  }\n};\n\n\n/**\n * @return {number} The extent for the range model.\n */\ngoog.ui.RangeModel.prototype.getExtent = function() {\n  return this.roundToStep(this.extent_);\n};\n\n\n/**\n * Sets the minimum\n * @param {number} minimum The new minimum.\n */\ngoog.ui.RangeModel.prototype.setMinimum = function(minimum) {\n  // Don't round minimum because it is the base\n  if (this.minimum_ != minimum) {\n    var oldIsChanging = this.isChanging_;\n    this.isChanging_ = true;\n\n    this.minimum_ = minimum;\n\n    if (minimum + this.extent_ > this.maximum_) {\n      this.extent_ = this.maximum_ - this.minimum_;\n    }\n    if (minimum > this.value_) {\n      this.setValue(minimum);\n    }\n    if (minimum > this.maximum_) {\n      this.extent_ = 0;\n      this.setMaximum(minimum);\n      this.setValue(minimum);\n    }\n\n\n    this.isChanging_ = oldIsChanging;\n    if (!this.isChanging_ && !this.mute_) {\n      this.dispatchEvent(goog.ui.Component.EventType.CHANGE);\n    }\n  }\n};\n\n\n/**\n * @return {number} The minimum value for the range model.\n */\ngoog.ui.RangeModel.prototype.getMinimum = function() {\n  return this.roundToStepWithMin(this.minimum_);\n};\n\n\n/**\n * Sets the maximum\n * @param {number} maximum The new maximum.\n */\ngoog.ui.RangeModel.prototype.setMaximum = function(maximum) {\n  maximum = this.roundToStepWithMin(maximum);\n  if (this.maximum_ != maximum) {\n    var oldIsChanging = this.isChanging_;\n    this.isChanging_ = true;\n\n    this.maximum_ = maximum;\n\n    if (maximum < this.value_ + this.extent_) {\n      this.setValue(maximum - this.extent_);\n    }\n    if (maximum < this.minimum_) {\n      this.extent_ = 0;\n      this.setMinimum(maximum);\n      this.setValue(this.maximum_);\n    }\n    if (maximum < this.minimum_ + this.extent_) {\n      this.extent_ = this.maximum_ - this.minimum_;\n    }\n\n    this.isChanging_ = oldIsChanging;\n    if (!this.isChanging_ && !this.mute_) {\n      this.dispatchEvent(goog.ui.Component.EventType.CHANGE);\n    }\n  }\n};\n\n\n/**\n * @return {number} The maximimum value for the range model.\n */\ngoog.ui.RangeModel.prototype.getMaximum = function() {\n  return this.roundToStepWithMin(this.maximum_);\n};\n\n\n/**\n * Returns the step value. The step value is used to determine how to round the\n * value.\n * @return {?number} The maximimum value for the range model.\n */\ngoog.ui.RangeModel.prototype.getStep = function() {\n  return this.step_;\n};\n\n\n/**\n * Sets the step. The step value is used to determine how to round the value.\n * @param {?number} step  The step size.\n */\ngoog.ui.RangeModel.prototype.setStep = function(step) {\n  if (this.step_ != step) {\n    this.step_ = step;\n\n    // adjust value, extent and maximum\n    var oldIsChanging = this.isChanging_;\n    this.isChanging_ = true;\n\n    this.setMaximum(this.getMaximum());\n    this.setExtent(this.getExtent());\n    this.setValue(this.getValue());\n\n    this.isChanging_ = oldIsChanging;\n    if (!this.isChanging_ && !this.mute_) {\n      this.dispatchEvent(goog.ui.Component.EventType.CHANGE);\n    }\n  }\n};\n\n\n/**\n * Rounds to the closest step using the minimum value as the base.\n * @param {number} value  The number to round.\n * @return {number} The number rounded to the closest step.\n */\ngoog.ui.RangeModel.prototype.roundToStepWithMin = function(value) {\n  if (this.step_ == null) return value;\n  return this.minimum_ +\n      Math.round((value - this.minimum_) / this.step_) * this.step_;\n};\n\n\n/**\n * Rounds to the closest step.\n * @param {number} value  The number to round.\n * @return {number} The number rounded to the closest step.\n */\ngoog.ui.RangeModel.prototype.roundToStep = function(value) {\n  if (this.step_ == null) return value;\n  return Math.round(value / this.step_) * this.step_;\n};\n","^AK",1579837703000,"^AL",["^AM",["^BT","^AA","^AP"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/rangemodel.js"],"^B6",["^AM",["~$goog.ui.RangeModel"]],"^A?",true,"^A@",["^AA","^AP","^BT"]],["^ ","^AC",[1579837703000],"^AD","goog.useragent.useragenttestutil.js","^AE",["^AF","goog/useragent/useragenttestutil.js"],"^AG","goog/useragent/useragenttestutil.js","^AH","^AI","^AJ","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Shared test function to reset the constants in\n * goog.userAgent.*\n */\n\ngoog.provide('goog.userAgentTestUtil');\ngoog.provide('goog.userAgentTestUtil.UserAgents');\n\ngoog.require('goog.labs.userAgent.browser');\ngoog.require('goog.labs.userAgent.engine');\ngoog.require('goog.labs.userAgent.platform');\ngoog.require('goog.object');\ngoog.require('goog.userAgent');\ngoog.require('goog.userAgent.keyboard');\ngoog.require('goog.userAgent.platform');\ngoog.require('goog.userAgent.product');\n/** @suppress {extraRequire} */\ngoog.require('goog.userAgent.product.isVersion');\n\ngoog.setTestOnly('goog.userAgentTestUtil');\n\n\n/**\n * Rerun the initialization code to set all of the goog.userAgent constants.\n * @suppress {accessControls}\n */\ngoog.userAgentTestUtil.reinitializeUserAgent = function() {\n  // Unfortunately we can't isolate the useragent setting in a function\n  // we can call, because things rely on it compiling to nothing when\n  // one of the ASSUME flags is set, and the compiler isn't smart enough\n  // to do that when the setting is done inside a function that's inlined.\n  goog.userAgent.OPERA = goog.labs.userAgent.browser.isOpera();\n  goog.userAgent.IE = goog.labs.userAgent.browser.isIE();\n  goog.userAgent.EDGE = goog.labs.userAgent.engine.isEdge();\n  goog.userAgent.EDGE_OR_IE = goog.userAgent.EDGE || goog.userAgent.IE;\n  goog.userAgent.GECKO = goog.labs.userAgent.engine.isGecko();\n  goog.userAgent.WEBKIT = goog.labs.userAgent.engine.isWebKit();\n  goog.userAgent.MOBILE = goog.userAgent.isMobile_();\n  goog.userAgent.SAFARI = goog.userAgent.WEBKIT;\n\n  // Platform in goog.userAgent.\n  goog.userAgent.PLATFORM = goog.userAgent.determinePlatform_();\n\n  goog.userAgent.MAC = goog.labs.userAgent.platform.isMacintosh();\n  goog.userAgent.WINDOWS = goog.labs.userAgent.platform.isWindows();\n  goog.userAgent.LINUX = goog.userAgent.isLegacyLinux_();\n  goog.userAgent.X11 = goog.userAgent.isX11_();\n  goog.userAgent.ANDROID = goog.labs.userAgent.platform.isAndroid();\n  goog.userAgent.IPAD = goog.labs.userAgent.platform.isIpad();\n  goog.userAgent.IPHONE = goog.labs.userAgent.platform.isIphone();\n  goog.userAgent.IPOD = goog.labs.userAgent.platform.isIpod();\n  goog.userAgent.KAIOS = goog.labs.userAgent.platform.isKaiOS();\n  goog.userAgent.GO2PHONE = goog.labs.userAgent.platform.isGo2Phone();\n  goog.userAgent.VERSION = goog.userAgent.determineVersion_();\n\n  // Platform in goog.userAgent.platform.\n  goog.userAgent.platform.VERSION = goog.userAgent.platform.determineVersion_();\n\n  // Update goog.userAgent.product\n  goog.userAgent.product.ANDROID =\n      goog.labs.userAgent.browser.isAndroidBrowser();\n  goog.userAgent.product.CHROME = goog.labs.userAgent.browser.isChrome();\n  goog.userAgent.product.EDGE = goog.labs.userAgent.browser.isEdge();\n  goog.userAgent.product.FIREFOX = goog.labs.userAgent.browser.isFirefox();\n  goog.userAgent.product.IE = goog.labs.userAgent.browser.isIE();\n  goog.userAgent.product.IPAD = goog.labs.userAgent.platform.isIpad();\n  goog.userAgent.product.IPHONE = goog.userAgent.product.isIphoneOrIpod_();\n  goog.userAgent.product.OPERA = goog.labs.userAgent.browser.isOpera();\n  goog.userAgent.product.SAFARI = goog.userAgent.product.isSafariDesktop_();\n\n  // Still uses its own implementation.\n  goog.userAgent.product.VERSION = goog.userAgent.product.determineVersion_();\n\n  // goog.userAgent.keyboard\n  goog.userAgent.keyboard.MAC_KEYBOARD =\n      goog.userAgent.keyboard.determineMacKeyboard_();\n\n  // Reset cache so calls to isVersionOrHigher don't use cached version.\n  goog.object.clear(goog.userAgent.isVersionOrHigherCache_);\n};\n\n\n/**\n * Browser definitions.\n * @enum {string}\n */\ngoog.userAgentTestUtil.UserAgents = {\n  GECKO: 'GECKO',\n  IE: 'IE',\n  OPERA: 'OPERA',\n  WEBKIT: 'WEBKIT',\n  EDGE: 'EDGE'\n};\n\n\n/**\n * Return whether a given user agent has been detected.\n * @param {string} agent Value in UserAgents.\n * @return {boolean} Whether the user agent has been detected.\n */\ngoog.userAgentTestUtil.getUserAgentDetected = function(agent) {\n  switch (agent) {\n    case goog.userAgentTestUtil.UserAgents.GECKO:\n      return goog.userAgent.GECKO;\n    case goog.userAgentTestUtil.UserAgents.IE:\n      return goog.userAgent.IE;\n    case goog.userAgentTestUtil.UserAgents.EDGE:\n      return goog.userAgent.EDGE;\n    case goog.userAgentTestUtil.UserAgents.OPERA:\n      return goog.userAgent.OPERA;\n    case goog.userAgentTestUtil.UserAgents.WEBKIT:\n      return goog.userAgent.WEBKIT;\n  }\n\n  throw new Error('Unrecognized user agent');\n};\n","^AK",1579837703000,"^AL",["^AM",["~$goog.userAgent.product","~$goog.userAgent.platform","~$goog.userAgent.keyboard","^AA","^B:","^BH","~$goog.labs.userAgent.platform","~$goog.labs.userAgent.engine","^B=","~$goog.userAgent.product.isVersion"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/useragent/useragenttestutil.js"],"^B6",["^AM",["~$goog.userAgentTestUtil.UserAgents","~$goog.userAgentTestUtil"]],"^A?",true,"^A@",["^AA","^B=","^C2","^C1","^B:","^BH","^C0","^B[","^BZ","^C3"]],["^ ","^AC",[1579837703000],"^AD","goog.debug.formatter.js","^AE",["^AF","goog/debug/formatter.js"],"^AG","goog/debug/formatter.js","^AH","^AI","^AJ","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of various formatters for logging. Please minimize\n * dependencies this file has on other closure classes as any dependency it\n * takes won't be able to use the logging infrastructure.\n *\n */\n\ngoog.provide('goog.debug.Formatter');\ngoog.provide('goog.debug.HtmlFormatter');\ngoog.provide('goog.debug.TextFormatter');\n\ngoog.require('goog.debug');\ngoog.require('goog.debug.Logger');\ngoog.require('goog.debug.RelativeTimeProvider');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.SafeUrl');\ngoog.require('goog.html.uncheckedconversions');\ngoog.require('goog.string.Const');\n\n\n\n/**\n * Base class for Formatters. A Formatter is used to format a LogRecord into\n * something that can be displayed to the user.\n *\n * @param {string=} opt_prefix The prefix to place before text records.\n * @constructor\n */\ngoog.debug.Formatter = function(opt_prefix) {\n  this.prefix_ = opt_prefix || '';\n\n  /**\n   * A provider that returns the relative start time.\n   * @type {goog.debug.RelativeTimeProvider}\n   * @private\n   */\n  this.startTimeProvider_ =\n      goog.debug.RelativeTimeProvider.getDefaultInstance();\n};\n\n\n/**\n * Whether to append newlines to the end of formatted log records.\n * @type {boolean}\n */\ngoog.debug.Formatter.prototype.appendNewline = true;\n\n\n/**\n * Whether to show absolute time in the DebugWindow.\n * @type {boolean}\n */\ngoog.debug.Formatter.prototype.showAbsoluteTime = true;\n\n\n/**\n * Whether to show relative time in the DebugWindow.\n * @type {boolean}\n */\ngoog.debug.Formatter.prototype.showRelativeTime = true;\n\n\n/**\n * Whether to show the logger name in the DebugWindow.\n * @type {boolean}\n */\ngoog.debug.Formatter.prototype.showLoggerName = true;\n\n\n/**\n * Whether to show the logger exception text.\n * @type {boolean}\n */\ngoog.debug.Formatter.prototype.showExceptionText = false;\n\n\n/**\n * Whether to show the severity level.\n * @type {boolean}\n */\ngoog.debug.Formatter.prototype.showSeverityLevel = false;\n\n\n/**\n * Formats a record.\n * @param {goog.debug.LogRecord} logRecord the logRecord to format.\n * @return {string} The formatted string.\n */\ngoog.debug.Formatter.prototype.formatRecord = goog.abstractMethod;\n\n\n/**\n * Formats a record as SafeHtml.\n * @param {goog.debug.LogRecord} logRecord the logRecord to format.\n * @return {!goog.html.SafeHtml} The formatted string as SafeHtml.\n */\ngoog.debug.Formatter.prototype.formatRecordAsHtml = goog.abstractMethod;\n\n\n/**\n * Sets the start time provider. By default, this is the default instance\n * but can be changed.\n * @param {goog.debug.RelativeTimeProvider} provider The provider to use.\n */\ngoog.debug.Formatter.prototype.setStartTimeProvider = function(provider) {\n  this.startTimeProvider_ = provider;\n};\n\n\n/**\n * Returns the start time provider. By default, this is the default instance\n * but can be changed.\n * @return {goog.debug.RelativeTimeProvider} The start time provider.\n */\ngoog.debug.Formatter.prototype.getStartTimeProvider = function() {\n  return this.startTimeProvider_;\n};\n\n\n/**\n * Resets the start relative time.\n */\ngoog.debug.Formatter.prototype.resetRelativeTimeStart = function() {\n  this.startTimeProvider_.reset();\n};\n\n\n/**\n * Returns a string for the time/date of the LogRecord.\n * @param {goog.debug.LogRecord} logRecord The record to get a time stamp for.\n * @return {string} A string representation of the time/date of the LogRecord.\n * @private\n */\ngoog.debug.Formatter.getDateTimeStamp_ = function(logRecord) {\n  var time = new Date(logRecord.getMillis());\n  return goog.debug.Formatter.getTwoDigitString_((time.getFullYear() - 2000)) +\n      goog.debug.Formatter.getTwoDigitString_((time.getMonth() + 1)) +\n      goog.debug.Formatter.getTwoDigitString_(time.getDate()) + ' ' +\n      goog.debug.Formatter.getTwoDigitString_(time.getHours()) + ':' +\n      goog.debug.Formatter.getTwoDigitString_(time.getMinutes()) + ':' +\n      goog.debug.Formatter.getTwoDigitString_(time.getSeconds()) + '.' +\n      goog.debug.Formatter.getTwoDigitString_(\n          Math.floor(time.getMilliseconds() / 10));\n};\n\n\n/**\n * Returns the number as a two-digit string, meaning it prepends a 0 if the\n * number if less than 10.\n * @param {number} n The number to format.\n * @return {string} A two-digit string representation of `n`.\n * @private\n */\ngoog.debug.Formatter.getTwoDigitString_ = function(n) {\n  if (n < 10) {\n    return '0' + n;\n  }\n  return String(n);\n};\n\n\n/**\n * Returns a string for the number of seconds relative to the start time.\n * Prepads with spaces so that anything less than 1000 seconds takes up the\n * same number of characters for better formatting.\n * @param {goog.debug.LogRecord} logRecord The log to compare time to.\n * @param {number} relativeTimeStart The start time to compare to.\n * @return {string} The number of seconds of the LogRecord relative to the\n *     start time.\n * @private\n */\ngoog.debug.Formatter.getRelativeTime_ = function(logRecord, relativeTimeStart) {\n  var ms = logRecord.getMillis() - relativeTimeStart;\n  var sec = ms / 1000;\n  var str = sec.toFixed(3);\n\n  var spacesToPrepend = 0;\n  if (sec < 1) {\n    spacesToPrepend = 2;\n  } else {\n    while (sec < 100) {\n      spacesToPrepend++;\n      sec *= 10;\n    }\n  }\n  while (spacesToPrepend-- > 0) {\n    str = ' ' + str;\n  }\n  return str;\n};\n\n\n\n/**\n * Formatter that returns formatted html. See formatRecord for the classes\n * it uses for various types of formatted output.\n *\n * @param {string=} opt_prefix The prefix to place before text records.\n * @constructor\n * @extends {goog.debug.Formatter}\n */\ngoog.debug.HtmlFormatter = function(opt_prefix) {\n  goog.debug.Formatter.call(this, opt_prefix);\n};\ngoog.inherits(goog.debug.HtmlFormatter, goog.debug.Formatter);\n\n\n/**\n * Exposes an exception that has been caught by a try...catch and outputs the\n * error as HTML with a stack trace.\n *\n * @param {*} err Error object or string.\n * @param {?Function=} fn If provided, when collecting the stack trace all\n *     frames above the topmost call to this function, including that call,\n *     will be left out of the stack trace.\n * @return {string} Details of exception, as HTML.\n */\ngoog.debug.HtmlFormatter.exposeException = function(err, fn) {\n  var html = goog.debug.HtmlFormatter.exposeExceptionAsHtml(err, fn);\n  return goog.html.SafeHtml.unwrap(html);\n};\n\n\n/**\n * Exposes an exception that has been caught by a try...catch and outputs the\n * error with a stack trace.\n *\n * @param {*} err Error object or string.\n * @param {?Function=} fn If provided, when collecting the stack trace all\n *     frames above the topmost call to this function, including that call,\n *     will be left out of the stack trace.\n * @return {!goog.html.SafeHtml} Details of exception.\n */\ngoog.debug.HtmlFormatter.exposeExceptionAsHtml = function(err, fn) {\n  try {\n    var e = goog.debug.normalizeErrorObject(err);\n    // Create the error message\n    var viewSourceUrl =\n        goog.debug.HtmlFormatter.createViewSourceUrl_(e.fileName);\n    var error = goog.html.SafeHtml.concat(\n        goog.html.SafeHtml.htmlEscapePreservingNewlinesAndSpaces(\n            'Message: ' + e.message + '\\nUrl: '),\n        goog.html.SafeHtml.create(\n            'a', {href: viewSourceUrl, target: '_new'}, e.fileName),\n        goog.html.SafeHtml.htmlEscapePreservingNewlinesAndSpaces(\n            '\\nLine: ' + e.lineNumber + '\\n\\nBrowser stack:\\n' + e.stack +\n            '-> ' +\n            '[end]\\n\\nJS stack traversal:\\n' + goog.debug.getStacktrace(fn) +\n            '-> '));\n    return error;\n  } catch (e2) {\n    return goog.html.SafeHtml.htmlEscapePreservingNewlinesAndSpaces(\n        'Exception trying to expose exception! You win, we lose. ' + e2);\n  }\n};\n\n\n/**\n * @param {?string=} fileName\n * @return {!goog.html.SafeUrl} SafeUrl with view-source scheme, pointing at\n *     fileName.\n * @private\n */\ngoog.debug.HtmlFormatter.createViewSourceUrl_ = function(fileName) {\n  if (fileName == null) {\n    fileName = '';\n  }\n  if (!/^https?:\\/\\//i.test(fileName)) {\n    return goog.html.SafeUrl.fromConstant(\n        goog.string.Const.from('sanitizedviewsrc'));\n  }\n  var sanitizedFileName = goog.html.SafeUrl.sanitize(fileName);\n  return goog.html.uncheckedconversions\n      .safeUrlFromStringKnownToSatisfyTypeContract(\n          goog.string.Const.from('view-source scheme plus HTTP/HTTPS URL'),\n          'view-source:' + goog.html.SafeUrl.unwrap(sanitizedFileName));\n};\n\n\n\n/**\n * Whether to show the logger exception text\n * @type {boolean}\n * @override\n */\ngoog.debug.HtmlFormatter.prototype.showExceptionText = true;\n\n\n/**\n * Formats a record\n * @param {goog.debug.LogRecord} logRecord the logRecord to format.\n * @return {string} The formatted string as html.\n * @override\n */\ngoog.debug.HtmlFormatter.prototype.formatRecord = function(logRecord) {\n  if (!logRecord) {\n    return '';\n  }\n  // OK not to use goog.html.SafeHtml.unwrap() here.\n  return this.formatRecordAsHtml(logRecord).getTypedStringValue();\n};\n\n\n/**\n * Formats a record.\n * @param {goog.debug.LogRecord} logRecord the logRecord to format.\n * @return {!goog.html.SafeHtml} The formatted string as SafeHtml.\n * @override\n */\ngoog.debug.HtmlFormatter.prototype.formatRecordAsHtml = function(logRecord) {\n  if (!logRecord) {\n    return goog.html.SafeHtml.EMPTY;\n  }\n\n  var className;\n  switch (logRecord.getLevel().value) {\n    case goog.debug.Logger.Level.SHOUT.value:\n      className = 'dbg-sh';\n      break;\n    case goog.debug.Logger.Level.SEVERE.value:\n      className = 'dbg-sev';\n      break;\n    case goog.debug.Logger.Level.WARNING.value:\n      className = 'dbg-w';\n      break;\n    case goog.debug.Logger.Level.INFO.value:\n      className = 'dbg-i';\n      break;\n    case goog.debug.Logger.Level.FINE.value:\n    default:\n      className = 'dbg-f';\n      break;\n  }\n\n  // HTML for user defined prefix, time, logger name, and severity.\n  var sb = [];\n  sb.push(this.prefix_, ' ');\n  if (this.showAbsoluteTime) {\n    sb.push('[', goog.debug.Formatter.getDateTimeStamp_(logRecord), '] ');\n  }\n  if (this.showRelativeTime) {\n    sb.push(\n        '[', goog.debug.Formatter.getRelativeTime_(\n                 logRecord, this.startTimeProvider_.get()),\n        's] ');\n  }\n  if (this.showLoggerName) {\n    sb.push('[', logRecord.getLoggerName(), '] ');\n  }\n  if (this.showSeverityLevel) {\n    sb.push('[', logRecord.getLevel().name, '] ');\n  }\n  var fullPrefixHtml =\n      goog.html.SafeHtml.htmlEscapePreservingNewlinesAndSpaces(sb.join(''));\n\n  // HTML for exception text and log record.\n  var exceptionHtml = goog.html.SafeHtml.EMPTY;\n  if (this.showExceptionText && logRecord.getException()) {\n    exceptionHtml = goog.html.SafeHtml.concat(\n        goog.html.SafeHtml.BR,\n        goog.debug.HtmlFormatter.exposeExceptionAsHtml(\n            logRecord.getException()));\n  }\n  var logRecordHtml = goog.html.SafeHtml.htmlEscapePreservingNewlinesAndSpaces(\n      logRecord.getMessage());\n  var recordAndExceptionHtml = goog.html.SafeHtml.create(\n      'span', {'class': className},\n      goog.html.SafeHtml.concat(logRecordHtml, exceptionHtml));\n\n\n  // Combine both pieces of HTML and, if needed, append a final newline.\n  var html;\n  if (this.appendNewline) {\n    html = goog.html.SafeHtml.concat(\n        fullPrefixHtml, recordAndExceptionHtml, goog.html.SafeHtml.BR);\n  } else {\n    html = goog.html.SafeHtml.concat(fullPrefixHtml, recordAndExceptionHtml);\n  }\n  return html;\n};\n\n\n\n/**\n * Formatter that returns formatted plain text\n *\n * @param {string=} opt_prefix The prefix to place before text records.\n * @constructor\n * @extends {goog.debug.Formatter}\n * @final\n */\ngoog.debug.TextFormatter = function(opt_prefix) {\n  goog.debug.Formatter.call(this, opt_prefix);\n};\ngoog.inherits(goog.debug.TextFormatter, goog.debug.Formatter);\n\n\n/**\n * Formats a record as text\n * @param {goog.debug.LogRecord} logRecord the logRecord to format.\n * @return {string} The formatted string.\n * @override\n */\ngoog.debug.TextFormatter.prototype.formatRecord = function(logRecord) {\n  var sb = [];\n  sb.push(this.prefix_, ' ');\n  if (this.showAbsoluteTime) {\n    sb.push('[', goog.debug.Formatter.getDateTimeStamp_(logRecord), '] ');\n  }\n  if (this.showRelativeTime) {\n    sb.push(\n        '[', goog.debug.Formatter.getRelativeTime_(\n                 logRecord, this.startTimeProvider_.get()),\n        's] ');\n  }\n\n  if (this.showLoggerName) {\n    sb.push('[', logRecord.getLoggerName(), '] ');\n  }\n  if (this.showSeverityLevel) {\n    sb.push('[', logRecord.getLevel().name, '] ');\n  }\n  sb.push(logRecord.getMessage());\n  if (this.showExceptionText) {\n    var exception = logRecord.getException();\n    if (exception) {\n      var exceptionText =\n          exception instanceof Error ? exception.message : exception.toString();\n      sb.push('\\n', exceptionText);\n    }\n  }\n  if (this.appendNewline) {\n    sb.push('\\n');\n  }\n  return sb.join('');\n};\n\n\n/**\n * Formats a record as text\n * @param {goog.debug.LogRecord} logRecord the logRecord to format.\n * @return {!goog.html.SafeHtml} The formatted string as SafeHtml. This is\n *     just an HTML-escaped version of the text obtained from formatRecord().\n * @override\n */\ngoog.debug.TextFormatter.prototype.formatRecordAsHtml = function(logRecord) {\n  return goog.html.SafeHtml.htmlEscapePreservingNewlinesAndSpaces(\n      goog.debug.TextFormatter.prototype.formatRecord(logRecord));\n};\n","^AK",1579837703000,"^AL",["^AM",["~$goog.html.SafeUrl","^AA","~$goog.debug.Logger","~$goog.html.uncheckedconversions","~$goog.string.Const","~$goog.debug","~$goog.debug.RelativeTimeProvider","~$goog.html.SafeHtml"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/formatter.js"],"^B6",["^AM",["~$goog.debug.TextFormatter","~$goog.debug.HtmlFormatter","~$goog.debug.Formatter"]],"^A?",true,"^A@",["^AA","^C:","^C7","^C;","^C<","^C6","^C8","^C9"]],["^ ","^AC",[1579837703000],"^AD","goog.ui.menu.js","^AE",["^AF","goog/ui/menu.js"],"^AG","goog/ui/menu.js","^AH","^AI","^AJ","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A base menu class that supports key and mouse events. The menu\n * can be bound to an existing HTML structure or can generate its own DOM.\n *\n * To decorate, the menu should be bound to an element containing children\n * with the classname 'goog-menuitem'.  HRs will be classed as separators.\n *\n * Decorate Example:\n * <div id=\"menu\" class=\"goog-menu\" tabIndex=\"0\">\n *   <div class=\"goog-menuitem\">Google</div>\n *   <div class=\"goog-menuitem\">Yahoo</div>\n *   <div class=\"goog-menuitem\">MSN</div>\n *   <hr>\n *   <div class=\"goog-menuitem\">New...</div>\n * </div>\n * <script>\n *\n * var menu = new goog.ui.Menu();\n * menu.decorate(goog.dom.getElement('menu'));\n *\n * TESTED=FireFox 2.0, IE6, Opera 9, Chrome.\n * TODO(user): Key handling is flaky in Opera and Chrome\n * TODO(user): Rename all references of \"item\" to child since menu is\n * essentially very generic and could, in theory, host a date or color picker.\n *\n * @see ../demos/menu.html\n * @see ../demos/menus.html\n */\n\ngoog.provide('goog.ui.Menu');\ngoog.provide('goog.ui.Menu.EventType');\n\ngoog.require('goog.dom.TagName');\ngoog.require('goog.math.Coordinate');\ngoog.require('goog.string');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component.EventType');\ngoog.require('goog.ui.Component.State');\ngoog.require('goog.ui.Container');\ngoog.require('goog.ui.Container.Orientation');\ngoog.require('goog.ui.MenuHeader');\ngoog.require('goog.ui.MenuItem');\ngoog.require('goog.ui.MenuRenderer');\ngoog.require('goog.ui.MenuSeparator');\n\n// The dependencies MenuHeader, MenuItem, and MenuSeparator are implicit.\n// There are no references in the code, but we need to load these\n// classes before goog.ui.Menu.\n\n\n\n// TODO(robbyw): Reverse constructor argument order for consistency.\n/**\n * A basic menu class.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @param {goog.ui.MenuRenderer=} opt_renderer Renderer used to render or\n *     decorate the container; defaults to {@link goog.ui.MenuRenderer}.\n * @constructor\n * @extends {goog.ui.Container}\n */\ngoog.ui.Menu = function(opt_domHelper, opt_renderer) {\n  goog.ui.Container.call(\n      this, goog.ui.Container.Orientation.VERTICAL,\n      opt_renderer || goog.ui.MenuRenderer.getInstance(), opt_domHelper);\n\n  // Unlike Containers, Menus aren't keyboard-accessible by default.  This line\n  // preserves backwards compatibility with code that depends on menus not\n  // receiving focus - e.g. `goog.ui.MenuButton`.\n  this.setFocusable(false);\n};\ngoog.inherits(goog.ui.Menu, goog.ui.Container);\ngoog.tagUnsealableClass(goog.ui.Menu);\n\n\n// TODO(robbyw): Remove this and all references to it.\n// Please ensure that BEFORE_SHOW behavior is not disrupted as a result.\n/**\n * Event types dispatched by the menu.\n * @enum {string}\n * @deprecated Use goog.ui.Component.EventType.\n */\ngoog.ui.Menu.EventType = {\n  /** Dispatched before the menu becomes visible */\n  BEFORE_SHOW: goog.ui.Component.EventType.BEFORE_SHOW,\n\n  /** Dispatched when the menu is shown */\n  SHOW: goog.ui.Component.EventType.SHOW,\n\n  /** Dispatched before the menu becomes hidden */\n  BEFORE_HIDE: goog.ui.Component.EventType.HIDE,\n\n  /** Dispatched when the menu is hidden */\n  HIDE: goog.ui.Component.EventType.HIDE\n};\n\n\n// TODO(robbyw): Remove this and all references to it.\n/**\n * CSS class for menus.\n * @type {string}\n * @deprecated Use goog.ui.MenuRenderer.CSS_CLASS.\n */\ngoog.ui.Menu.CSS_CLASS = goog.ui.MenuRenderer.CSS_CLASS;\n\n\n/**\n * Coordinates of the mousedown event that caused this menu to be made visible.\n * Used to prevent the consequent mouseup event due to a simple click from\n * activating a menu item immediately. Considered protected; should only be used\n * within this package or by subclasses.\n * @type {goog.math.Coordinate|undefined}\n */\ngoog.ui.Menu.prototype.openingCoords;\n\n\n/**\n * Whether the menu can move the focus to its key event target when it is\n * shown.  Default = true\n * @type {boolean}\n * @private\n */\ngoog.ui.Menu.prototype.allowAutoFocus_ = true;\n\n\n/**\n * Whether the menu should use windows style behavior and allow disabled menu\n * items to be highlighted (though not selectable).  Defaults to false\n * @type {boolean}\n * @private\n */\ngoog.ui.Menu.prototype.allowHighlightDisabled_ = false;\n\n\n/**\n * Returns the CSS class applied to menu elements, also used as the prefix for\n * derived styles, if any.  Subclasses should override this method as needed.\n * Considered protected.\n * @return {string} The CSS class applied to menu elements.\n * @protected\n * @deprecated Use getRenderer().getCssClass().\n */\ngoog.ui.Menu.prototype.getCssClass = function() {\n  return this.getRenderer().getCssClass();\n};\n\n\n/**\n * Returns whether the provided element is to be considered inside the menu for\n * purposes such as dismissing the menu on an event.  This is so submenus can\n * make use of elements outside their own DOM.\n * @param {Element} element The element to test for.\n * @return {boolean} Whether the provided element is to be considered inside\n *     the menu.\n */\ngoog.ui.Menu.prototype.containsElement = function(element) {\n  if (this.getRenderer().containsElement(this, element)) {\n    return true;\n  }\n\n  for (var i = 0, count = this.getChildCount(); i < count; i++) {\n    var child = this.getChildAt(i);\n    if (typeof child.containsElement == 'function' &&\n        child.containsElement(element)) {\n      return true;\n    }\n  }\n\n  return false;\n};\n\n\n/**\n * Adds a new menu item at the end of the menu.\n * @param {goog.ui.MenuHeader|goog.ui.MenuItem|goog.ui.MenuSeparator} item Menu\n *     item to add to the menu.\n * @deprecated Use {@link #addChild} instead, with true for the second argument.\n */\ngoog.ui.Menu.prototype.addItem = function(item) {\n  this.addChild(item, true);\n};\n\n\n/**\n * Adds a new menu item at a specific index in the menu.\n * @param {goog.ui.MenuHeader|goog.ui.MenuItem|goog.ui.MenuSeparator} item Menu\n *     item to add to the menu.\n * @param {number} n Index at which to insert the menu item.\n * @deprecated Use {@link #addChildAt} instead, with true for the third\n *     argument.\n */\ngoog.ui.Menu.prototype.addItemAt = function(item, n) {\n  this.addChildAt(item, n, true);\n};\n\n\n/**\n * Removes an item from the menu and disposes of it.\n * @param {goog.ui.MenuHeader|goog.ui.MenuItem|goog.ui.MenuSeparator} item The\n *     menu item to remove.\n * @deprecated Use {@link #removeChild} instead.\n */\ngoog.ui.Menu.prototype.removeItem = function(item) {\n  var removedChild = this.removeChild(item, true);\n  if (removedChild) {\n    removedChild.dispose();\n  }\n};\n\n\n/**\n * Removes a menu item at a given index in the menu and disposes of it.\n * @param {number} n Index of item.\n * @deprecated Use {@link #removeChildAt} instead.\n */\ngoog.ui.Menu.prototype.removeItemAt = function(n) {\n  var removedChild = this.removeChildAt(n, true);\n  if (removedChild) {\n    removedChild.dispose();\n  }\n};\n\n\n/**\n * Returns a reference to the menu item at a given index.\n * @param {number} n Index of menu item.\n * @return {goog.ui.MenuHeader|goog.ui.MenuItem|goog.ui.MenuSeparator|null}\n *     Reference to the menu item.\n * @deprecated Use {@link #getChildAt} instead.\n */\ngoog.ui.Menu.prototype.getItemAt = function(n) {\n  return /** @type {goog.ui.MenuItem?} */ (this.getChildAt(n));\n};\n\n\n/**\n * Returns the number of items in the menu (including separators).\n * @return {number} The number of items in the menu.\n * @deprecated Use {@link #getChildCount} instead.\n */\ngoog.ui.Menu.prototype.getItemCount = function() {\n  return this.getChildCount();\n};\n\n\n/**\n * Returns an array containing the menu items contained in the menu.\n * @return {!Array<goog.ui.MenuItem>} An array of menu items.\n * @deprecated Use getChildAt, forEachChild, and getChildCount.\n */\ngoog.ui.Menu.prototype.getItems = function() {\n  // TODO(user): Remove reference to getItems and instead use getChildAt,\n  // forEachChild, and getChildCount\n  var children = [];\n  this.forEachChild(function(child) { children.push(child); });\n  return children;\n};\n\n\n/**\n * Sets the position of the menu relative to the view port.\n * @param {number|goog.math.Coordinate} x Left position or coordinate obj.\n * @param {number=} opt_y Top position.\n */\ngoog.ui.Menu.prototype.setPosition = function(x, opt_y) {\n  // NOTE(user): It is necessary to temporarily set the display from none, so\n  // that the position gets set correctly.\n  var visible = this.isVisible();\n  if (!visible) {\n    goog.style.setElementShown(this.getElement(), true);\n  }\n  goog.style.setPageOffset(this.getElement(), x, opt_y);\n  if (!visible) {\n    goog.style.setElementShown(this.getElement(), false);\n  }\n};\n\n\n/**\n * Gets the page offset of the menu, or null if the menu isn't visible\n * @return {goog.math.Coordinate?} Object holding the x-y coordinates of the\n *     menu or null if the menu is not visible.\n */\ngoog.ui.Menu.prototype.getPosition = function() {\n  return this.isVisible() ? goog.style.getPageOffset(this.getElement()) : null;\n};\n\n\n/**\n * Sets whether the menu can automatically move focus to its key event target\n * when it is set to visible.\n * @param {boolean} allow Whether the menu can automatically move focus to its\n *     key event target when it is set to visible.\n */\ngoog.ui.Menu.prototype.setAllowAutoFocus = function(allow) {\n  this.allowAutoFocus_ = allow;\n  if (allow) {\n    this.setFocusable(true);\n  }\n};\n\n\n/**\n * @return {boolean} Whether the menu can automatically move focus to its key\n *     event target when it is set to visible.\n */\ngoog.ui.Menu.prototype.getAllowAutoFocus = function() {\n  return this.allowAutoFocus_;\n};\n\n\n/**\n * Sets whether the menu will highlight disabled menu items or skip to the next\n * active item.\n * @param {boolean} allow Whether the menu will highlight disabled menu items or\n *     skip to the next active item.\n */\ngoog.ui.Menu.prototype.setAllowHighlightDisabled = function(allow) {\n  this.allowHighlightDisabled_ = allow;\n};\n\n\n/**\n * @return {boolean} Whether the menu will highlight disabled menu items or skip\n *     to the next active item.\n */\ngoog.ui.Menu.prototype.getAllowHighlightDisabled = function() {\n  return this.allowHighlightDisabled_;\n};\n\n\n/**\n * @override\n * @param {boolean} show Whether to show or hide the menu.\n * @param {boolean=} opt_force If true, doesn't check whether the menu\n *     already has the requested visibility, and doesn't dispatch any events.\n * @param {goog.events.Event=} opt_e Mousedown event that caused this menu to\n *     be made visible (ignored if show is false).\n */\ngoog.ui.Menu.prototype.setVisible = function(show, opt_force, opt_e) {\n  var visibilityChanged =\n      goog.ui.Menu.superClass_.setVisible.call(this, show, opt_force);\n  if (visibilityChanged && show && this.isInDocument() &&\n      this.allowAutoFocus_) {\n    this.getKeyEventTarget().focus();\n  }\n  if (show && opt_e && typeof opt_e.clientX === 'number') {\n    this.openingCoords = new goog.math.Coordinate(opt_e.clientX, opt_e.clientY);\n  } else {\n    this.openingCoords = null;\n  }\n  return visibilityChanged;\n};\n\n\n/** @override */\ngoog.ui.Menu.prototype.handleEnterItem = function(e) {\n  if (this.allowAutoFocus_) {\n    this.getKeyEventTarget().focus();\n  }\n\n  return goog.ui.Menu.superClass_.handleEnterItem.call(this, e);\n};\n\n\n/**\n * Highlights the next item that begins with the specified string.  If no\n * (other) item begins with the given string, the selection is unchanged.\n * @param {string} charStr The prefix to match.\n * @return {boolean} Whether a matching prefix was found.\n */\ngoog.ui.Menu.prototype.highlightNextPrefix = function(charStr) {\n  var re = new RegExp('^' + goog.string.regExpEscape(charStr), 'i');\n  return this.highlightHelper(function(index, max) {\n    // Index is >= -1 because it is set to -1 when nothing is selected.\n    var start = index < 0 ? 0 : index;\n    var wrapped = false;\n\n    // We always start looking from one after the current, because we\n    // keep the current selection only as a last resort. This makes the\n    // loop a little awkward in the case where there is no current\n    // selection, as we need to stop somewhere but can't just stop\n    // when index == start, which is why we need the 'wrapped' flag.\n    do {\n      ++index;\n      if (index == max) {\n        index = 0;\n        wrapped = true;\n      }\n      var name = this.getChildAt(index).getCaption();\n      if (name && name.match(re)) {\n        return index;\n      }\n    } while (!wrapped || index != start);\n    return this.getHighlightedIndex();\n  }, this.getHighlightedIndex());\n};\n\n\n/** @override */\ngoog.ui.Menu.prototype.canHighlightItem = function(item) {\n  return (this.allowHighlightDisabled_ || item.isEnabled()) &&\n      item.isVisible() && item.isSupportedState(goog.ui.Component.State.HOVER);\n};\n\n\n/** @override */\ngoog.ui.Menu.prototype.decorateInternal = function(element) {\n  this.decorateContent(element);\n  goog.ui.Menu.superClass_.decorateInternal.call(this, element);\n};\n\n\n/** @override */\ngoog.ui.Menu.prototype.handleKeyEventInternal = function(e) {\n  var handled = goog.ui.Menu.base(this, 'handleKeyEventInternal', e);\n  if (!handled) {\n    // Loop through all child components, and for each menu item call its\n    // key event handler so that keyboard mnemonics can be handled.\n    this.forEachChild(function(menuItem) {\n      if (!handled && menuItem.getMnemonic &&\n          menuItem.getMnemonic() == e.keyCode) {\n        if (this.isEnabled()) {\n          this.setHighlighted(menuItem);\n        }\n        // We still delegate to handleKeyEvent, so that it can handle\n        // enabled/disabled state.\n        handled = menuItem.handleKeyEvent(e);\n      }\n    }, this);\n  }\n  return handled;\n};\n\n\n/** @override */\ngoog.ui.Menu.prototype.setHighlightedIndex = function(index) {\n  goog.ui.Menu.base(this, 'setHighlightedIndex', index);\n\n  // Bring the highlighted item into view. This has no effect if the menu is not\n  // scrollable.\n  var child = this.getChildAt(index);\n  if (child) {\n    goog.style.scrollIntoContainerView(child.getElement(), this.getElement());\n  }\n};\n\n\n/**\n * Decorate menu items located in any descendant node which as been explicitly\n * marked as a 'content' node.\n * @param {Element} element Element to decorate.\n * @protected\n */\ngoog.ui.Menu.prototype.decorateContent = function(element) {\n  var renderer = this.getRenderer();\n  var contentElements = this.getDomHelper().getElementsByTagNameAndClass(\n      goog.dom.TagName.DIV, goog.getCssName(renderer.getCssClass(), 'content'),\n      element);\n\n  // Some versions of IE do not like it when you access this nodeList\n  // with invalid indices. See\n  // http://code.google.com/p/closure-library/issues/detail?id=373\n  var length = contentElements.length;\n  for (var i = 0; i < length; i++) {\n    renderer.decorateChildren(this, contentElements[i]);\n  }\n};\n","^AK",1579837703000,"^AL",["^AM",["~$goog.ui.MenuSeparator","~$goog.ui.Component.EventType","^BF","~$goog.ui.Component.State","^AA","~$goog.ui.Container","~$goog.ui.MenuRenderer","~$goog.ui.Container.Orientation","~$goog.math.Coordinate","~$goog.ui.MenuItem","^BI","^BJ","~$goog.ui.MenuHeader"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/menu.js"],"^B6",["^AM",["~$goog.ui.Menu.EventType","~$goog.ui.Menu"]],"^A?",true,"^A@",["^AA","^BJ","^CF","^BF","^BI","^CA","^CB","^CC","^CE","^CH","^CG","^CD","^C@"]],["^ ","^AC",[1579837703000],"^AD","goog.testing.testsuite.js","^AE",["^AF","goog/testing/testsuite.js"],"^AG","goog/testing/testsuite.js","^AH","^AI","^AJ","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\ngoog.provide('goog.testing.testSuite');\ngoog.setTestOnly('goog.testing.testSuite');\n\ngoog.require('goog.labs.testing.Environment');\ngoog.require('goog.testing.TestCase');\n\n/**\n * @typedef {{order: (!goog.testing.TestCase.Order|undefined)}}\n */\nvar TestSuiteOptions;\n\n/**\n * Runs the lifecycle methods (setUp, tearDown, etc.) and test* methods from\n * the given object. For use in tests that are written as JavaScript modules\n * or goog.modules.\n *\n * @param {!Object<string, function()|!Object>} obj An object with one or more\n *     test methods, and optional setUp, tearDown and getTestName methods. The\n *     object may also have nested Objects (named like tests, i.e.\n *     `testNestedSuite: {}`) that will be treated as nested testSuites. Any\n *     additional setUp will run after parent setUps, any additional tearDown\n *     will run before parent tearDowns. The this object refers to the object\n *     that the functions were defined on, not the full testSuite object.\n * @param {!TestSuiteOptions=} opt_options Optional options object which can\n *     be used to set the sort order for running tests.\n */\ngoog.testing.testSuite = function(obj, opt_options) {\n  if (goog.isFunction(obj)) {\n    throw new Error(\n        'testSuite should be called with an object. ' +\n        'Did you forget to initialize a class?');\n  }\n\n  if (goog.testing.testSuite.initialized_) {\n    throw new Error('Only one TestSuite can be active');\n  }\n  goog.testing.testSuite.initialized_ = true;\n\n  var testCase = goog.labs.testing.Environment.getTestCaseIfActive() ||\n      new goog.testing.TestCase(document.title);\n  testCase.setTestObj(obj);\n\n  var options = opt_options || {};\n  if (options.order) {\n    testCase.setOrder(options.order);\n  }\n  goog.testing.TestCase.initializeTestRunner(testCase);\n};\n\n/**\n * True iff the testSuite has been created.\n * @private {boolean}\n */\ngoog.testing.testSuite.initialized_ = false;\n","^AK",1579837703000,"^AL",["^AM",["^AA","^AQ","~$goog.labs.testing.Environment"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/testing/testsuite.js"],"^B6",["^AM",["~$goog.testing.testSuite"]],"^A?",true,"^A@",["^AA","^CK","^AQ"]],["^ ","^AC",[1579837703000],"^AD","goog.format.emailaddress.js","^AE",["^AF","goog/format/emailaddress.js"],"^AG","goog/format/emailaddress.js","^AH","^AI","^AJ","// Copyright 2010 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides functions to parse and manipulate email addresses.\n *\n */\n\ngoog.provide('goog.format.EmailAddress');\n\ngoog.require('goog.string');\n\n\n\n/**\n * Formats an email address string for display, and allows for extraction of\n * the individual components of the address.\n * @param {string=} opt_address The email address.\n * @param {string=} opt_name The name associated with the email address.\n * @constructor\n */\ngoog.format.EmailAddress = function(opt_address, opt_name) {\n  /**\n   * The name or personal string associated with the address.\n   * @type {string}\n   * @private\n   */\n  this.name_ = opt_name || '';\n\n  /**\n   * The email address.\n   * @type {string}\n   * @protected\n   */\n  this.address = opt_address || '';\n};\n\n\n/**\n * Match string for opening tokens.\n * @type {string}\n * @private\n */\ngoog.format.EmailAddress.OPENERS_ = '\"<([';\n\n\n/**\n * Match string for closing tokens.\n * @type {string}\n * @private\n */\ngoog.format.EmailAddress.CLOSERS_ = '\">)]';\n\n\n/**\n * Match string for characters that require display names to be quoted and are\n * not address separators.\n * @type {string}\n * @const\n * @package\n */\ngoog.format.EmailAddress.SPECIAL_CHARS = '()<>@:\\\\\\\".[]';\n\n\n/**\n * Match string for address separators.\n * @type {string}\n * @const\n * @private\n */\ngoog.format.EmailAddress.ADDRESS_SEPARATORS_ = ',;';\n\n\n/**\n * Match string for characters that, when in a display name, require it to be\n * quoted.\n * @type {string}\n * @const\n * @private\n */\ngoog.format.EmailAddress.CHARS_REQUIRE_QUOTES_ =\n    goog.format.EmailAddress.SPECIAL_CHARS +\n    goog.format.EmailAddress.ADDRESS_SEPARATORS_;\n\n\n/**\n * A RegExp to match all double quotes.  Used in cleanAddress().\n * @type {RegExp}\n * @private\n */\ngoog.format.EmailAddress.ALL_DOUBLE_QUOTES_ = /\\\"/g;\n\n\n/**\n * A RegExp to match escaped double quotes.  Used in parse().\n * @type {RegExp}\n * @private\n */\ngoog.format.EmailAddress.ESCAPED_DOUBLE_QUOTES_ = /\\\\\\\"/g;\n\n\n/**\n * A RegExp to match all backslashes.  Used in cleanAddress().\n * @type {RegExp}\n * @private\n */\ngoog.format.EmailAddress.ALL_BACKSLASHES_ = /\\\\/g;\n\n\n/**\n * A RegExp to match escaped backslashes.  Used in parse().\n * @type {RegExp}\n * @private\n */\ngoog.format.EmailAddress.ESCAPED_BACKSLASHES_ = /\\\\\\\\/g;\n\n\n/**\n * A string representing the RegExp for the local part of an email address.\n * @private {string}\n */\ngoog.format.EmailAddress.LOCAL_PART_REGEXP_STR_ =\n    '[+a-zA-Z0-9_.!#$%&\\'*\\\\/=?^`{|}~-]+';\n\n\n/**\n * A string representing the RegExp for the domain part of an email address.\n * @private {string}\n */\ngoog.format.EmailAddress.DOMAIN_PART_REGEXP_STR_ =\n    '([a-zA-Z0-9-]+\\\\.)+[a-zA-Z0-9]{2,63}';\n\n\n/**\n * A RegExp to match the local part of an email address.\n * @private {!RegExp}\n */\ngoog.format.EmailAddress.LOCAL_PART_ =\n    new RegExp('^' + goog.format.EmailAddress.LOCAL_PART_REGEXP_STR_ + '$');\n\n\n/**\n * A RegExp to match the domain part of an email address.\n * @private {!RegExp}\n */\ngoog.format.EmailAddress.DOMAIN_PART_ =\n    new RegExp('^' + goog.format.EmailAddress.DOMAIN_PART_REGEXP_STR_ + '$');\n\n\n/**\n * A RegExp to match an email address.\n * @private {!RegExp}\n */\ngoog.format.EmailAddress.EMAIL_ADDRESS_ = new RegExp(\n    '^' + goog.format.EmailAddress.LOCAL_PART_REGEXP_STR_ + '@' +\n    goog.format.EmailAddress.DOMAIN_PART_REGEXP_STR_ + '$');\n\n\n/**\n * Get the name associated with the email address.\n * @return {string} The name or personal portion of the address.\n * @final\n */\ngoog.format.EmailAddress.prototype.getName = function() {\n  return this.name_;\n};\n\n\n/**\n * Get the email address.\n * @return {string} The email address.\n * @final\n */\ngoog.format.EmailAddress.prototype.getAddress = function() {\n  return this.address;\n};\n\n\n/**\n * Set the name associated with the email address.\n * @param {string} name The name to associate.\n * @final\n */\ngoog.format.EmailAddress.prototype.setName = function(name) {\n  this.name_ = name;\n};\n\n\n/**\n * Set the email address.\n * @param {string} address The email address.\n * @final\n */\ngoog.format.EmailAddress.prototype.setAddress = function(address) {\n  this.address = address;\n};\n\n\n/**\n * Return the address in a standard format:\n *  - remove extra spaces.\n *  - Surround name with quotes if it contains special characters.\n * @return {string} The cleaned address.\n * @override\n */\ngoog.format.EmailAddress.prototype.toString = function() {\n  return this.toStringInternal(goog.format.EmailAddress.CHARS_REQUIRE_QUOTES_);\n};\n\n\n/**\n * Check if a display name requires quoting.\n * @param {string} name The display name\n * @param {string} specialChars String that contains the characters that require\n *  the display name to be quoted. This may change based in whereas we are\n *  in EAI context or not.\n * @return {boolean}\n * @private\n */\ngoog.format.EmailAddress.isQuoteNeeded_ = function(name, specialChars) {\n  for (var i = 0; i < specialChars.length; i++) {\n    var specialChar = specialChars[i];\n    if (goog.string.contains(name, specialChar)) {\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Return the address in a standard format:\n *  - remove extra spaces.\n *  - Surround name with quotes if it contains special characters.\n * @param {string} specialChars String that contains the characters that require\n *  the display name to be quoted.\n * @return {string} The cleaned address.\n * @protected\n */\ngoog.format.EmailAddress.prototype.toStringInternal = function(specialChars) {\n  var name = this.getName();\n\n  // We intentionally remove double quotes in the name because escaping\n  // them to \\\" looks ugly.\n  name = name.replace(goog.format.EmailAddress.ALL_DOUBLE_QUOTES_, '');\n\n  // If the name has special characters, we need to quote it and escape \\'s.\n  if (goog.format.EmailAddress.isQuoteNeeded_(name, specialChars)) {\n    name = '\"' +\n        name.replace(goog.format.EmailAddress.ALL_BACKSLASHES_, '\\\\\\\\') + '\"';\n  }\n\n  if (name == '') {\n    return this.address;\n  }\n  if (this.address == '') {\n    return name;\n  }\n  return name + ' <' + this.address + '>';\n};\n\n\n/**\n * Determines if the current object is a valid email address.\n * @return {boolean} Whether the email address is valid.\n */\ngoog.format.EmailAddress.prototype.isValid = function() {\n  return goog.format.EmailAddress.isValidAddrSpec(this.address);\n};\n\n\n/**\n * Checks if the provided string is a valid email address. Supports both\n * simple email addresses (address specs) and addresses that contain display\n * names.\n * @param {string} str The email address to check.\n * @return {boolean} Whether the provided string is a valid address.\n */\ngoog.format.EmailAddress.isValidAddress = function(str) {\n  return goog.format.EmailAddress.parse(str).isValid();\n};\n\n\n/**\n * Checks if the provided string is a valid address spec (local@domain.com).\n * @param {string} str The email address to check.\n * @return {boolean} Whether the provided string is a valid address spec.\n */\ngoog.format.EmailAddress.isValidAddrSpec = function(str) {\n  // This is a fairly naive implementation, but it covers 99% of use cases.\n  // For more details, see http://en.wikipedia.org/wiki/Email_address#Syntax\n  return goog.format.EmailAddress.EMAIL_ADDRESS_.test(str);\n};\n\n\n/**\n * Checks if the provided string is a valid local part (part before the '@') of\n * an email address.\n * @param {string} str The local part to check.\n * @return {boolean} Whether the provided string is a valid local part.\n */\ngoog.format.EmailAddress.isValidLocalPartSpec = function(str) {\n  return goog.format.EmailAddress.LOCAL_PART_.test(str);\n};\n\n\n/**\n * Checks if the provided string is a valid domain part (part after the '@') of\n * an email address.\n * @param {string} str The domain part to check.\n * @return {boolean} Whether the provided string is a valid domain part.\n */\ngoog.format.EmailAddress.isValidDomainPartSpec = function(str) {\n  return goog.format.EmailAddress.DOMAIN_PART_.test(str);\n};\n\n\n/**\n * Parses an email address of the form \"name\" &lt;address&gt; (\"name\" is\n * optional) into an email address.\n * @param {string} addr The address string.\n * @param {function(new: goog.format.EmailAddress, string=,string=)} ctor\n *     EmailAddress constructor to instantiate the output address.\n * @return {!goog.format.EmailAddress} The parsed address.\n * @protected\n */\ngoog.format.EmailAddress.parseInternal = function(addr, ctor) {\n  // TODO(ecattell): Strip bidi markers.\n  var name = '';\n  var address = '';\n  for (var i = 0; i < addr.length;) {\n    var token = goog.format.EmailAddress.getToken_(addr, i);\n    if (token.charAt(0) == '<' && token.indexOf('>') != -1) {\n      var end = token.indexOf('>');\n      address = token.substring(1, end);\n    } else if (address == '') {\n      name += token;\n    }\n    i += token.length;\n  }\n\n  // Check if it's a simple email address of the form \"jlim@google.com\".\n  if (address == '' && name.indexOf('@') != -1) {\n    address = name;\n    name = '';\n  }\n\n  name = goog.string.collapseWhitespace(name);\n  name = goog.string.stripQuotes(name, '\\'');\n  name = goog.string.stripQuotes(name, '\"');\n  // Replace escaped quotes and slashes.\n  name = name.replace(goog.format.EmailAddress.ESCAPED_DOUBLE_QUOTES_, '\"');\n  name = name.replace(goog.format.EmailAddress.ESCAPED_BACKSLASHES_, '\\\\');\n  address = goog.string.collapseWhitespace(address);\n  return new ctor(address, name);\n};\n\n\n/**\n * Parses an email address of the form \"name\" &lt;address&gt; into\n * an email address.\n * @param {string} addr The address string.\n * @return {!goog.format.EmailAddress} The parsed address.\n */\ngoog.format.EmailAddress.parse = function(addr) {\n  return goog.format.EmailAddress.parseInternal(addr, goog.format.EmailAddress);\n};\n\n\n/**\n * Parse a string containing email addresses of the form\n * \"name\" &lt;address&gt; into an array of email addresses.\n * @param {string} str The address list.\n * @param {function(string)} parser The parser to employ.\n * @param {function(string):boolean} separatorChecker Accepts a character and\n *    returns whether it should be considered an address separator.\n * @return {!Array<!goog.format.EmailAddress>} The parsed emails.\n * @protected\n */\ngoog.format.EmailAddress.parseListInternal = function(\n    str, parser, separatorChecker) {\n  var result = [];\n  var email = '';\n  var token;\n\n  // Remove non-UNIX-style newlines that would otherwise cause getToken_ to\n  // choke. Remove multiple consecutive whitespace characters for the same\n  // reason.\n  str = goog.string.collapseWhitespace(str);\n\n  for (var i = 0; i < str.length;) {\n    token = goog.format.EmailAddress.getToken_(str, i);\n    if (separatorChecker(token) || (token == ' ' && parser(email).isValid())) {\n      if (!goog.string.isEmptyOrWhitespace(email)) {\n        result.push(parser(email));\n      }\n      email = '';\n      i++;\n      continue;\n    }\n    email += token;\n    i += token.length;\n  }\n\n  // Add the final token.\n  if (!goog.string.isEmptyOrWhitespace(email)) {\n    result.push(parser(email));\n  }\n  return result;\n};\n\n\n/**\n * Parses a string containing email addresses of the form\n * \"name\" &lt;address&gt; into an array of email addresses.\n * @param {string} str The address list.\n * @return {!Array<!goog.format.EmailAddress>} The parsed emails.\n */\ngoog.format.EmailAddress.parseList = function(str) {\n  return goog.format.EmailAddress.parseListInternal(\n      str, goog.format.EmailAddress.parse,\n      goog.format.EmailAddress.isAddressSeparator);\n};\n\n\n/**\n * Get the next token from a position in an address string.\n * @param {string} str the string.\n * @param {number} pos the position.\n * @return {string} the token.\n * @private\n */\ngoog.format.EmailAddress.getToken_ = function(str, pos) {\n  var ch = str.charAt(pos);\n  var p = goog.format.EmailAddress.OPENERS_.indexOf(ch);\n  if (p == -1) {\n    return ch;\n  }\n  if (goog.format.EmailAddress.isEscapedDlQuote_(str, pos)) {\n    // If an opener is an escaped quote we do not treat it as a real opener\n    // and keep accumulating the token.\n    return ch;\n  }\n  var closerChar = goog.format.EmailAddress.CLOSERS_.charAt(p);\n  var endPos = str.indexOf(closerChar, pos + 1);\n\n  // If the closer is a quote we go forward skipping escaped quotes until we\n  // hit the real closing one.\n  while (endPos >= 0 &&\n         goog.format.EmailAddress.isEscapedDlQuote_(str, endPos)) {\n    endPos = str.indexOf(closerChar, endPos + 1);\n  }\n  var token = (endPos >= 0) ? str.substring(pos, endPos + 1) : ch;\n  return token;\n};\n\n\n/**\n * Checks if the character in the current position is an escaped double quote\n * ( \\\" ).\n * @param {string} str the string.\n * @param {number} pos the position.\n * @return {boolean} true if the char is escaped double quote.\n * @private\n */\ngoog.format.EmailAddress.isEscapedDlQuote_ = function(str, pos) {\n  if (str.charAt(pos) != '\"') {\n    return false;\n  }\n  var slashCount = 0;\n  for (var idx = pos - 1; idx >= 0 && str.charAt(idx) == '\\\\'; idx--) {\n    slashCount++;\n  }\n  return ((slashCount % 2) != 0);\n};\n\n\n/**\n * @param {string} ch The character to test.\n * @return {boolean} Whether the provided character is an address separator.\n */\ngoog.format.EmailAddress.isAddressSeparator = function(ch) {\n  return goog.string.contains(goog.format.EmailAddress.ADDRESS_SEPARATORS_, ch);\n};\n","^AK",1579837703000,"^AL",["^AM",["^BF","^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/format/emailaddress.js"],"^B6",["^AM",["~$goog.format.EmailAddress"]],"^A?",true,"^A@",["^AA","^BF"]],["^ ","^AC",[1579837703000],"^AD","goog.storage.mechanism.errorcode.js","^AE",["^AF","goog/storage/mechanism/errorcode.js"],"^AG","goog/storage/mechanism/errorcode.js","^AH","^AI","^AJ","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Defines error codes to be thrown by storage mechanisms.\n *\n */\n\ngoog.provide('goog.storage.mechanism.ErrorCode');\n\n\n/**\n * Errors thrown by storage mechanisms.\n * @enum {string}\n */\ngoog.storage.mechanism.ErrorCode = {\n  INVALID_VALUE: 'Storage mechanism: Invalid value was encountered',\n  QUOTA_EXCEEDED: 'Storage mechanism: Quota exceeded',\n  STORAGE_DISABLED: 'Storage mechanism: Storage disabled'\n};\n","^AK",1579837703000,"^AL",["^AM",["^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/mechanism/errorcode.js"],"^B6",["^AM",["~$goog.storage.mechanism.ErrorCode"]],"^A?",true,"^A@",["^AA"]],["^ ","^AC",[1579837703000],"^AD","goog.net.websocket.js","^AE",["^AF","goog/net/websocket.js"],"^AG","goog/net/websocket.js","^AH","^AI","^AJ","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the WebSocket class.  A WebSocket provides a\n * bi-directional, full-duplex communications channel, over a single TCP socket.\n *\n * See http://dev.w3.org/html5/websockets/\n * for the full HTML5 WebSocket API.\n *\n * Typical usage will look like this:\n *\n *  var ws = new goog.net.WebSocket();\n *\n *  var handler = new goog.events.EventHandler();\n *  handler.listen(ws, goog.net.WebSocket.EventType.OPENED, onOpen);\n *  handler.listen(ws, goog.net.WebSocket.EventType.MESSAGE, onMessage);\n *\n *  try {\n *    ws.open('ws://127.0.0.1:4200');\n *  } catch (e) {\n *    ...\n *  }\n *\n */\n\ngoog.provide('goog.net.WebSocket');\ngoog.provide('goog.net.WebSocket.ErrorEvent');\ngoog.provide('goog.net.WebSocket.EventType');\ngoog.provide('goog.net.WebSocket.MessageEvent');\n\ngoog.require('goog.Timer');\ngoog.require('goog.asserts');\ngoog.require('goog.debug.entryPointRegistry');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.log');\n\n\n/**\n * Class encapsulating the logic for using a WebSocket.\n *\n * @param {boolean|!goog.net.WebSocket.Options=} opt_params\n *     Parameters describing behavior of the WebSocket. The boolean 'true' is\n *     equivalent to setting Options.autoReconnect to be true.\n * @param {function(number): number=} opt_getNextReconnect\n *     @see goog.net.WebSocket.Options.getNextReconnect. This parameter is\n *     ignored if Options is passed for the first argument.\n * @constructor\n * @extends {goog.events.EventTarget}\n */\ngoog.net.WebSocket = function(opt_params, opt_getNextReconnect) {\n  goog.net.WebSocket.base(this, 'constructor');\n  if (typeof opt_params != 'object') {\n    opt_params = /**@type {!goog.net.WebSocket.Options} */ ({\n      autoReconnect: opt_params,\n      getNextReconnect: opt_getNextReconnect,\n    });\n  }\n  /** @private {boolean} @see goog.net.WebSocket.Options.autoReconnect */\n  this.autoReconnect_ = opt_params.autoReconnect != false;\n  /**\n   * @private {function(number): number}\n   * @see goog.net.WebSocket.Options.getNextReconnect\n   */\n  this.getNextReconnect_ =\n      opt_params.getNextReconnect || goog.net.WebSocket.EXPONENTIAL_BACKOFF_;\n  /**\n   * @private {goog.net.WebSocket.BinaryType}\n   * @see goog.net.WebSocket.Options.binaryType\n   */\n  this.binaryType_ =\n      opt_params.binaryType || goog.net.WebSocket.BinaryType.BLOB;\n\n  /**\n   * The time, in milliseconds, that must elapse before the next attempt to\n   * reconnect.\n   * @type {number}\n   * @private\n   */\n  this.nextReconnect_ = this.getNextReconnect_(this.reconnectAttempt_);\n};\ngoog.inherits(goog.net.WebSocket, goog.events.EventTarget);\n\n\n/** @enum {string} */\ngoog.net.WebSocket.BinaryType = {\n  ARRAY_BUFFER: 'arraybuffer',\n  BLOB: 'blob',\n};\n\n\n/** @record */\ngoog.net.WebSocket.Options = function() {\n\n  /**\n   * True if the web socket should automatically reconnect or not.  This is\n   * true by default.\n   * @type {boolean|undefined}\n   */\n  this.autoReconnect;\n\n  /**\n   * A function for obtaining the time until the next reconnect attempt. Given\n   * the reconnect attempt count (which is a positive integer), the function\n   * should return a positive integer representing the milliseconds to the\n   * next reconnect attempt.  The default function used is an exponential\n   * back-off. Note that this function is never called if auto reconnect is\n   * disabled.\n   * @type {(function(number): number)|undefined}\n   */\n  this.getNextReconnect;\n\n  /**\n   * Specifies the type of incoming binary messages, either Blob or\n   * ArrayBuffer.\n   * @type {!goog.net.WebSocket.BinaryType|undefined}\n   */\n  this.binaryType;\n};\n\n/**\n * The actual web socket that will be used to send/receive messages.\n * @type {?WebSocket}\n * @private\n */\ngoog.net.WebSocket.prototype.webSocket_ = null;\n\n\n/**\n * The URL to which the web socket will connect.\n * @type {?string}\n * @private\n */\ngoog.net.WebSocket.prototype.url_ = null;\n\n\n/**\n * The subprotocol name used when establishing the web socket connection.\n * @type {string|undefined}\n * @private\n */\ngoog.net.WebSocket.prototype.protocol_ = undefined;\n\n\n/**\n * True if a call to the close callback is expected or not.\n * @type {boolean}\n * @private\n */\ngoog.net.WebSocket.prototype.closeExpected_ = false;\n\n\n/**\n * Keeps track of the number of reconnect attempts made since the last\n * successful connection.\n * @type {number}\n * @private\n */\ngoog.net.WebSocket.prototype.reconnectAttempt_ = 0;\n\n\n/** @private {?number} */\ngoog.net.WebSocket.prototype.reconnectTimer_ = null;\n\n\n/**\n * The logger for this class.\n * @type {?goog.log.Logger}\n * @private\n */\ngoog.net.WebSocket.prototype.logger_ = goog.log.getLogger('goog.net.WebSocket');\n\n\n/**\n * The events fired by the web socket.\n * @enum {string} The event types for the web socket.\n */\ngoog.net.WebSocket.EventType = {\n\n  /**\n   * Fired when an attempt to open the WebSocket fails or there is a connection\n   * failure after a successful connection has been established.\n   */\n  CLOSED: goog.events.getUniqueId('closed'),\n\n  /**\n   * Fired when the WebSocket encounters an error.\n   */\n  ERROR: goog.events.getUniqueId('error'),\n\n  /**\n   * Fired when a new message arrives from the WebSocket.\n   */\n  MESSAGE: goog.events.getUniqueId('message'),\n\n  /**\n   * Fired when the WebSocket connection has been established.\n   */\n  OPENED: goog.events.getUniqueId('opened')\n};\n\n\n/**\n * The various states of the web socket.\n * @enum {number} The states of the web socket.\n * @private\n */\ngoog.net.WebSocket.ReadyState_ = {\n  // This is the initial state during construction.\n  CONNECTING: 0,\n  // This is when the socket is actually open and ready for data.\n  OPEN: 1,\n  // This is when the socket is in the middle of a close handshake.\n  // Note that this is a valid state even if the OPEN state was never achieved.\n  CLOSING: 2,\n  // This is when the socket is actually closed.\n  CLOSED: 3\n};\n\n/**\n * The maximum amount of time between reconnect attempts for the exponential\n * back-off in milliseconds.\n * @type {number}\n * @private\n */\ngoog.net.WebSocket.EXPONENTIAL_BACKOFF_CEILING_ = 60 * 1000;\n\n\n/**\n * Computes the next reconnect time given the number of reconnect attempts since\n * the last successful connection.\n *\n * @param {number} attempt The number of reconnect attempts since the last\n *     connection.\n * @return {number} The time, in milliseconds, until the next reconnect attempt.\n * @const\n * @private\n */\ngoog.net.WebSocket.EXPONENTIAL_BACKOFF_ = function(attempt) {\n  var time = Math.pow(2, attempt) * 1000;\n  return Math.min(time, goog.net.WebSocket.EXPONENTIAL_BACKOFF_CEILING_);\n};\n\n\n/**\n * Installs exception protection for all entry points introduced by\n * goog.net.WebSocket instances which are not protected by\n * {@link goog.debug.ErrorHandler#protectWindowSetTimeout},\n * {@link goog.debug.ErrorHandler#protectWindowSetInterval}, or\n * {@link goog.events.protectBrowserEventEntryPoint}.\n *\n * @param {!goog.debug.ErrorHandler} errorHandler Error handler with which to\n *     protect the entry points.\n */\ngoog.net.WebSocket.protectEntryPoints = function(errorHandler) {\n  goog.net.WebSocket.prototype.onOpen_ =\n      errorHandler.protectEntryPoint(goog.net.WebSocket.prototype.onOpen_);\n  goog.net.WebSocket.prototype.onClose_ =\n      errorHandler.protectEntryPoint(goog.net.WebSocket.prototype.onClose_);\n  goog.net.WebSocket.prototype.onMessage_ =\n      errorHandler.protectEntryPoint(goog.net.WebSocket.prototype.onMessage_);\n  goog.net.WebSocket.prototype.onError_ =\n      errorHandler.protectEntryPoint(goog.net.WebSocket.prototype.onError_);\n};\n\n\n/**\n * Creates and opens the actual WebSocket.  Only call this after attaching the\n * appropriate listeners to this object.  If listeners aren't registered, then\n * the `goog.net.WebSocket.EventType.OPENED` event might be missed.\n *\n * @param {string} url The URL to which to connect.\n * @param {string=} opt_protocol The subprotocol to use.  The connection will\n *     only be established if the server reports that it has selected this\n *     subprotocol. The subprotocol name must all be a non-empty ASCII string\n *     with no control characters and no spaces in them (i.e. only characters\n *     in the range U+0021 to U+007E).\n */\ngoog.net.WebSocket.prototype.open = function(url, opt_protocol) {\n  // Sanity check.  This works only in modern browsers.\n  goog.asserts.assert(\n      goog.global['WebSocket'], 'This browser does not support WebSocket');\n\n  // Don't do anything if the web socket is already open.\n  goog.asserts.assert(!this.isOpen(), 'The WebSocket is already open');\n\n  // Clear any pending attempts to reconnect.\n  this.clearReconnectTimer_();\n\n  // Construct the web socket.\n  this.url_ = url;\n  this.protocol_ = opt_protocol;\n\n  // This check has to be made otherwise you get protocol mismatch exceptions\n  // for passing undefined, null, '', or [].\n  if (this.protocol_) {\n    goog.log.info(\n        this.logger_, 'Opening the WebSocket on ' + this.url_ +\n            ' with protocol ' + this.protocol_);\n    this.webSocket_ = new WebSocket(this.url_, this.protocol_);\n  } else {\n    goog.log.info(this.logger_, 'Opening the WebSocket on ' + this.url_);\n    this.webSocket_ = new WebSocket(this.url_);\n  }\n  this.webSocket_.binaryType = this.binaryType_;\n  // Register the event handlers.  Note that it is not possible for these\n  // callbacks to be missed because it is registered after the web socket is\n  // instantiated.  Because of the synchronous nature of JavaScript, this code\n  // will execute before the browser creates the resource and makes any calls\n  // to these callbacks.\n  this.webSocket_.onopen = goog.bind(this.onOpen_, this);\n  this.webSocket_.onclose = goog.bind(this.onClose_, this);\n  this.webSocket_.onmessage = goog.bind(this.onMessage_, this);\n  this.webSocket_.onerror = goog.bind(this.onError_, this);\n};\n\n\n/**\n * Closes the web socket connection.\n */\ngoog.net.WebSocket.prototype.close = function() {\n\n  // Clear any pending attempts to reconnect.\n  this.clearReconnectTimer_();\n\n  // Attempt to close only if the web socket was created.\n  if (this.webSocket_) {\n    goog.log.info(this.logger_, 'Closing the WebSocket.');\n\n    // Close is expected here since it was a direct call.  Close is considered\n    // unexpected when opening the connection fails or there is some other form\n    // of connection loss after being connected.\n    this.closeExpected_ = true;\n    this.webSocket_.close();\n    this.webSocket_ = null;\n  }\n};\n\n\n/**\n * Sends the message over the web socket.\n *\n * @param {string|!ArrayBuffer|!ArrayBufferView} message The message to send.\n */\ngoog.net.WebSocket.prototype.send = function(message) {\n  // Make sure the socket is ready to go before sending a message.\n  goog.asserts.assert(this.isOpen(), 'Cannot send without an open socket');\n\n  // Send the message and let onError_ be called if it fails thereafter.\n  this.webSocket_.send(message);\n};\n\n\n/**\n * Checks to see if the web socket is open or not.\n *\n * @return {boolean} True if the web socket is open, false otherwise.\n */\ngoog.net.WebSocket.prototype.isOpen = function() {\n  return !!this.webSocket_ &&\n      this.webSocket_.readyState == goog.net.WebSocket.ReadyState_.OPEN;\n};\n\n\n/**\n * Gets the number of bytes of data that have been queued using calls to send()\n * but not yet transmitted to the network.\n *\n * @return {number} Number of bytes of data that have been queued.\n */\ngoog.net.WebSocket.prototype.getBufferedAmount = function() {\n  return this.webSocket_.bufferedAmount;\n};\n\n\n/**\n * Called when the web socket has connected.\n *\n * @private\n */\ngoog.net.WebSocket.prototype.onOpen_ = function() {\n  goog.log.info(this.logger_, 'WebSocket opened on ' + this.url_);\n  this.dispatchEvent(goog.net.WebSocket.EventType.OPENED);\n\n  // Set the next reconnect interval.\n  this.reconnectAttempt_ = 0;\n  this.nextReconnect_ = this.getNextReconnect_(this.reconnectAttempt_);\n};\n\n\n/**\n * Called when the web socket has closed.\n *\n * @param {!Event} event The close event.\n * @private\n */\ngoog.net.WebSocket.prototype.onClose_ = function(event) {\n  goog.log.info(this.logger_, 'The WebSocket on ' + this.url_ + ' closed.');\n\n  // Firing this event allows handlers to query the URL.\n  this.dispatchEvent(goog.net.WebSocket.EventType.CLOSED);\n\n  // Always clear out the web socket on a close event.\n  this.webSocket_ = null;\n\n  // See if this is an expected call to onClose_.\n  if (this.closeExpected_) {\n    goog.log.info(this.logger_, 'The WebSocket closed normally.');\n    // Only clear out the URL if this is a normal close.\n    this.url_ = null;\n    this.protocol_ = undefined;\n  } else {\n    // Unexpected, so try to reconnect.\n    goog.log.error(\n        this.logger_, 'The WebSocket disconnected unexpectedly: ' + event.data);\n\n    // Only try to reconnect if it is enabled.\n    if (this.autoReconnect_) {\n      // Log the reconnect attempt.\n      var seconds = Math.floor(this.nextReconnect_ / 1000);\n      goog.log.info(\n          this.logger_, 'Seconds until next reconnect attempt: ' + seconds);\n\n      // Actually schedule the timer.\n      this.reconnectTimer_ = goog.Timer.callOnce(\n          goog.bind(this.open, this, this.url_, this.protocol_),\n          this.nextReconnect_, this);\n\n      // Set the next reconnect interval.\n      this.reconnectAttempt_++;\n      this.nextReconnect_ = this.getNextReconnect_(this.reconnectAttempt_);\n    }\n  }\n  this.closeExpected_ = false;\n};\n\n\n/**\n * Called when a new message arrives from the server.\n *\n * @param {!MessageEvent<string|!ArrayBuffer|!Blob>} event The web socket\n *     message event.\n * @return {void}\n * @private\n */\ngoog.net.WebSocket.prototype.onMessage_ = function(event) {\n  this.dispatchEvent(new goog.net.WebSocket.MessageEvent(event.data));\n};\n\n\n/**\n * Called when there is any error in communication.\n *\n * @param {Event} event The error event containing the error data.\n * @private\n */\ngoog.net.WebSocket.prototype.onError_ = function(event) {\n  var data = /** @type {string} */ (event.data);\n  goog.log.error(this.logger_, 'An error occurred: ' + data);\n  this.dispatchEvent(new goog.net.WebSocket.ErrorEvent(data));\n};\n\n\n/**\n * Clears the reconnect timer.\n *\n * @private\n */\ngoog.net.WebSocket.prototype.clearReconnectTimer_ = function() {\n  if (this.reconnectTimer_ != null) {\n    goog.Timer.clear(this.reconnectTimer_);\n  }\n  this.reconnectTimer_ = null;\n};\n\n\n/** @override */\ngoog.net.WebSocket.prototype.disposeInternal = function() {\n  goog.net.WebSocket.base(this, 'disposeInternal');\n  this.close();\n};\n\n\n/**\n * Object representing a new incoming message event.\n *\n * @param {string|!ArrayBuffer|!Blob} message The raw message coming from the\n *     web socket.\n * @extends {goog.events.Event}\n * @constructor\n * @final\n */\ngoog.net.WebSocket.MessageEvent = function(message) {\n  goog.net.WebSocket.MessageEvent.base(\n      this, 'constructor', goog.net.WebSocket.EventType.MESSAGE);\n\n  // TODO this used to be just `string`, but that is incorrect. Until all usages\n  // have been cleaned up we need to leave this as ?.\n  /**\n   * The new message from the web socket.\n   * @type {?}\n   */\n  this.message = message;\n};\ngoog.inherits(goog.net.WebSocket.MessageEvent, goog.events.Event);\n\n\n/**\n * Object representing an error event. This is fired whenever an error occurs\n * on the web socket.\n *\n * @param {string} data The error data.\n * @extends {goog.events.Event}\n * @constructor\n * @final\n */\ngoog.net.WebSocket.ErrorEvent = function(data) {\n  goog.net.WebSocket.ErrorEvent.base(\n      this, 'constructor', goog.net.WebSocket.EventType.ERROR);\n\n  /**\n   * The error data coming from the web socket.\n   * @type {string}\n   */\n  this.data = data;\n};\ngoog.inherits(goog.net.WebSocket.ErrorEvent, goog.events.Event);\n\n\n// Register the WebSocket as an entry point, so that it can be monitored for\n// exception handling, etc.\ngoog.debug.entryPointRegistry.register(\n    /**\n     * @param {function(!Function): !Function} transformer The transforming\n     *     function.\n     */\n    function(transformer) {\n      goog.net.WebSocket.prototype.onOpen_ =\n          transformer(goog.net.WebSocket.prototype.onOpen_);\n      goog.net.WebSocket.prototype.onClose_ =\n          transformer(goog.net.WebSocket.prototype.onClose_);\n      goog.net.WebSocket.prototype.onMessage_ =\n          transformer(goog.net.WebSocket.prototype.onMessage_);\n      goog.net.WebSocket.prototype.onError_ =\n          transformer(goog.net.WebSocket.prototype.onError_);\n    });\n","^AK",1579837703000,"^AL",["^AM",["^BB","~$goog.Timer","^AA","^AP","~$goog.log","~$goog.debug.entryPointRegistry","~$goog.events.Event","~$goog.events"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/websocket.js"],"^B6",["^AM",["~$goog.net.WebSocket.MessageEvent","~$goog.net.WebSocket.EventType","~$goog.net.WebSocket","~$goog.net.WebSocket.ErrorEvent"]],"^A?",true,"^A@",["^AA","^CO","^BB","^CQ","^CS","^CR","^AP","^CP"]],["^ ","^AC",[1579837703000],"^AD","goog.labs.storage.boundedcollectablestorage.js","^AE",["^AF","goog/labs/storage/boundedcollectablestorage.js"],"^AG","goog/labs/storage/boundedcollectablestorage.js","^AH","^AI","^AJ","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Provides a convenient API for data persistence with data\n * expiration and number of items limit.\n *\n * Setting and removing values keeps a max number of items invariant.\n * Collecting values can be user initiated. If oversize, first removes\n * expired items, if still oversize than removes the oldest items until a size\n * constraint is fulfilled.\n *\n */\n\ngoog.provide('goog.labs.storage.BoundedCollectableStorage');\n\ngoog.forwardDeclare('goog.storage.mechanism.IterableMechanism');\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.iter');\ngoog.require('goog.storage.CollectableStorage');\ngoog.require('goog.storage.ErrorCode');\ngoog.require('goog.storage.ExpiringStorage');\n\n\n\n/**\n * Provides a storage with bounded number of elements, expiring keys and\n * a collection method.\n *\n * @param {!goog.storage.mechanism.IterableMechanism} mechanism The underlying\n *     storage mechanism.\n * @param {number} maxItems Maximum number of items in storage.\n * @constructor\n * @struct\n * @extends {goog.storage.CollectableStorage}\n * @final\n */\ngoog.labs.storage.BoundedCollectableStorage = function(mechanism, maxItems) {\n  goog.labs.storage.BoundedCollectableStorage.base(\n      this, 'constructor', mechanism);\n\n  /**\n   * A maximum number of items that should be stored.\n   * @private {number}\n   */\n  this.maxItems_ = maxItems;\n};\ngoog.inherits(\n    goog.labs.storage.BoundedCollectableStorage,\n    goog.storage.CollectableStorage);\n\n\n/**\n * An item key used to store a list of keys.\n * @const\n * @private\n */\ngoog.labs.storage.BoundedCollectableStorage.KEY_LIST_KEY_ =\n    'bounded-collectable-storage';\n\n\n/**\n * Recreates a list of keys in order of creation.\n *\n * @return {!Array<string>} a list of unexpired keys.\n * @private\n */\ngoog.labs.storage.BoundedCollectableStorage.prototype.rebuildIndex_ =\n    function() {\n  var keys = [];\n  goog.iter.forEach(\n      /** @type {goog.storage.mechanism.IterableMechanism} */ (this.mechanism)\n          .__iterator__(true),\n      function(key) {\n        if (goog.labs.storage.BoundedCollectableStorage.KEY_LIST_KEY_ == key) {\n          return;\n        }\n\n        var wrapper;\n\n        try {\n          wrapper = this.getWrapper(key, true);\n        } catch (ex) {\n          if (ex == goog.storage.ErrorCode.INVALID_VALUE) {\n            // Skip over bad wrappers and continue.\n            return;\n          }\n          // Unknown error, escalate.\n          throw ex;\n        }\n        goog.asserts.assert(wrapper);\n\n        var creationTime =\n            goog.storage.ExpiringStorage.getCreationTime(wrapper);\n        keys.push({key: key, created: creationTime});\n      },\n      this);\n\n  goog.array.sort(keys, function(a, b) { return a.created - b.created; });\n\n  return goog.array.map(keys, function(v) { return v.key; });\n};\n\n\n/**\n * Gets key list from a local storage. If an item does not exist,\n * may recreate it.\n *\n * @param {boolean} rebuild Whether to rebuild a index if no index item exists.\n * @return {!Array<string>} a list of keys if index exist, otherwise undefined.\n * @private\n */\ngoog.labs.storage.BoundedCollectableStorage.prototype.getKeys_ = function(\n    rebuild) {\n  var keys =\n      goog.labs.storage.BoundedCollectableStorage.superClass_.get.call(\n          this, goog.labs.storage.BoundedCollectableStorage.KEY_LIST_KEY_) ||\n      null;\n  if (!keys || !goog.isArray(keys)) {\n    if (rebuild) {\n      keys = this.rebuildIndex_();\n    } else {\n      keys = [];\n    }\n  }\n  return /** @type {!Array<string>} */ (keys);\n};\n\n\n/**\n * Saves a list of keys in a local storage.\n *\n * @param {Array<string>} keys a list of keys to save.\n * @private\n */\ngoog.labs.storage.BoundedCollectableStorage.prototype.setKeys_ = function(\n    keys) {\n  goog.labs.storage.BoundedCollectableStorage.superClass_.set.call(\n      this, goog.labs.storage.BoundedCollectableStorage.KEY_LIST_KEY_, keys);\n};\n\n\n/**\n * Remove subsequence from a sequence.\n *\n * @param {!Array<string>} keys is a sequence.\n * @param {!Array<string>} keysToRemove subsequence of keys, the order must\n *     be kept.\n * @return {!Array<string>} a keys sequence after removing keysToRemove.\n * @private\n */\ngoog.labs.storage.BoundedCollectableStorage.removeSubsequence_ = function(\n    keys, keysToRemove) {\n  if (keysToRemove.length == 0) {\n    return goog.array.clone(keys);\n  }\n  var keysToKeep = [];\n  var keysIdx = 0;\n  var keysToRemoveIdx = 0;\n\n  while (keysToRemoveIdx < keysToRemove.length && keysIdx < keys.length) {\n    var key = keysToRemove[keysToRemoveIdx];\n    while (keysIdx < keys.length && keys[keysIdx] != key) {\n      keysToKeep.push(keys[keysIdx]);\n      ++keysIdx;\n    }\n    ++keysToRemoveIdx;\n  }\n\n  goog.asserts.assert(keysToRemoveIdx == keysToRemove.length);\n  goog.asserts.assert(keysIdx < keys.length);\n  return goog.array.concat(keysToKeep, goog.array.slice(keys, keysIdx + 1));\n};\n\n\n/**\n * Keeps the number of items in storage under maxItems. Removes elements in the\n * order of creation.\n *\n * @param {!Array<string>} keys a list of keys in order of creation.\n * @param {number} maxSize a number of items to keep.\n * @return {!Array<string>} keys left after removing oversize data.\n * @private\n */\ngoog.labs.storage.BoundedCollectableStorage.prototype.collectOversize_ =\n    function(keys, maxSize) {\n  if (keys.length <= maxSize) {\n    return goog.array.clone(keys);\n  }\n  var keysToRemove = goog.array.slice(keys, 0, keys.length - maxSize);\n  goog.array.forEach(keysToRemove, function(key) {\n    goog.labs.storage.BoundedCollectableStorage.superClass_.remove.call(\n        this, key);\n  }, this);\n  return goog.labs.storage.BoundedCollectableStorage.removeSubsequence_(\n      keys, keysToRemove);\n};\n\n\n/**\n * Cleans up the storage by removing expired keys.\n *\n * @param {boolean=} opt_strict Also remove invalid keys.\n * @override\n */\ngoog.labs.storage.BoundedCollectableStorage.prototype.collect = function(\n    opt_strict) {\n  var keys = this.getKeys_(true);\n  var keysToRemove = this.collectInternal(keys, opt_strict);\n  keys = goog.labs.storage.BoundedCollectableStorage.removeSubsequence_(\n      keys, keysToRemove);\n  this.setKeys_(keys);\n};\n\n\n/**\n * Ensures that we keep only maxItems number of items in a local storage.\n * @param {boolean=} opt_skipExpired skip removing expired items first.\n * @param {boolean=} opt_strict Also remove invalid keys.\n */\ngoog.labs.storage.BoundedCollectableStorage.prototype.collectOversize =\n    function(opt_skipExpired, opt_strict) {\n  var keys = this.getKeys_(true);\n  if (!opt_skipExpired) {\n    var keysToRemove = this.collectInternal(keys, opt_strict);\n    keys = goog.labs.storage.BoundedCollectableStorage.removeSubsequence_(\n        keys, keysToRemove);\n  }\n  keys = this.collectOversize_(keys, this.maxItems_);\n  this.setKeys_(keys);\n};\n\n\n/**\n * Set an item in the storage.\n *\n * @param {string} key The key to set.\n * @param {*} value The value to serialize to a string and save.\n * @param {number=} opt_expiration The number of miliseconds since epoch\n *     (as in goog.now()) when the value is to expire. If the expiration\n *     time is not provided, the value will persist as long as possible.\n * @override\n */\ngoog.labs.storage.BoundedCollectableStorage.prototype.set = function(\n    key, value, opt_expiration) {\n  goog.labs.storage.BoundedCollectableStorage.base(\n      this, 'set', key, value, opt_expiration);\n  var keys = this.getKeys_(true);\n  goog.array.remove(keys, key);\n\n  if (value !== undefined) {\n    keys.push(key);\n    if (keys.length >= this.maxItems_) {\n      var keysToRemove = this.collectInternal(keys);\n      keys = goog.labs.storage.BoundedCollectableStorage.removeSubsequence_(\n          keys, keysToRemove);\n      keys = this.collectOversize_(keys, this.maxItems_);\n    }\n  }\n  this.setKeys_(keys);\n};\n\n\n/**\n * Remove an item from the data storage.\n *\n * @param {string} key The key to remove.\n * @override\n */\ngoog.labs.storage.BoundedCollectableStorage.prototype.remove = function(key) {\n  goog.labs.storage.BoundedCollectableStorage.base(this, 'remove', key);\n\n  var keys = this.getKeys_(false);\n  if (keys !== undefined) {\n    goog.array.remove(keys, key);\n    this.setKeys_(keys);\n  }\n};\n","^AK",1579837703000,"^AL",["^AM",["^BB","~$goog.iter","~$goog.storage.ErrorCode","^AA","~$goog.storage.CollectableStorage","^AR","~$goog.storage.ExpiringStorage"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/storage/boundedcollectablestorage.js"],"^B6",["^AM",["~$goog.labs.storage.BoundedCollectableStorage"]],"^A?",true,"^A@",["^AA","^AR","^BB","^CX","^CZ","^CY","^C["]],["^ ","^AC",[1579837703000],"^AD","goog.dom.fontsizemonitor.js","^AE",["^AF","goog/dom/fontsizemonitor.js"],"^AG","goog/dom/fontsizemonitor.js","^AH","^AI","^AJ","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A class that can be used to listen to font size changes.\n * @author arv@google.com (Erik Arvidsson)\n */\n\ngoog.provide('goog.dom.FontSizeMonitor');\ngoog.provide('goog.dom.FontSizeMonitor.EventType');\n\ngoog.require('goog.dom');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events');\ngoog.require('goog.events.EventTarget');\ngoog.require('goog.events.EventType');\ngoog.require('goog.userAgent');\n\n\n// TODO(arv): Move this to goog.events instead.\n\n\n\n/**\n * This class can be used to monitor changes in font size.  Instances will\n * dispatch a `goog.dom.FontSizeMonitor.EventType.CHANGE` event.\n * Example usage:\n * <pre>\n * var fms = new goog.dom.FontSizeMonitor();\n * goog.events.listen(fms, goog.dom.FontSizeMonitor.EventType.CHANGE,\n *     function(e) {\n *       alert('Font size was changed');\n *     });\n * </pre>\n * @param {goog.dom.DomHelper=} opt_domHelper DOM helper object that is used to\n *     determine where to insert the DOM nodes used to determine when the font\n *     size changes.\n * @constructor\n * @extends {goog.events.EventTarget}\n * @final\n */\ngoog.dom.FontSizeMonitor = function(opt_domHelper) {\n  goog.events.EventTarget.call(this);\n\n  var dom = opt_domHelper || goog.dom.getDomHelper();\n\n  /**\n   * Offscreen iframe which we use to detect resize events.\n   * @type {HTMLElement}\n   * @private\n   */\n  this.sizeElement_ = /** @type {!HTMLElement} */ (\n      dom.createDom(\n          // The size of the iframe is expressed in em, which are font size\n          // relative\n          // which will cause the iframe to be resized when the font size\n          // changes.\n          // The actual values are not relevant as long as we can ensure that\n          // the\n          // iframe has a non zero size and is completely off screen.\n          goog.userAgent.IE ? goog.dom.TagName.DIV : goog.dom.TagName.IFRAME, {\n            'style': 'position:absolute;width:9em;height:9em;top:-99em',\n            'tabIndex': -1,\n            'aria-hidden': 'true'\n          }));\n  var p = dom.getDocument().body;\n  p.insertBefore(this.sizeElement_, p.firstChild);\n\n  /**\n   * The object that we listen to resize events on.\n   * @type {Element|Window}\n   * @private\n   */\n  var resizeTarget = this.resizeTarget_ = goog.userAgent.IE ?\n      this.sizeElement_ :\n      goog.dom.getFrameContentWindow(\n          /** @type {HTMLIFrameElement} */ (this.sizeElement_));\n\n  // We need to open and close the document to get Firefox 2 to work.  We must\n  // not do this for IE in case we are using HTTPS since accessing the document\n  // on an about:blank iframe in IE using HTTPS raises a Permission Denied\n  // error.\n  if (goog.userAgent.GECKO) {\n    var doc = resizeTarget.document;\n    doc.open();\n    doc.close();\n  }\n\n  // Listen to resize event on the window inside the iframe.\n  goog.events.listen(\n      resizeTarget, goog.events.EventType.RESIZE, this.handleResize_, false,\n      this);\n\n  /**\n   * Last measured width of the iframe element.\n   * @type {number}\n   * @private\n   */\n  this.lastWidth_ = this.sizeElement_.offsetWidth;\n};\ngoog.inherits(goog.dom.FontSizeMonitor, goog.events.EventTarget);\n\n\n/**\n * The event types that the FontSizeMonitor fires.\n * @enum {string}\n */\ngoog.dom.FontSizeMonitor.EventType = {\n  // TODO(arv): Change value to 'change' after updating the callers.\n  CHANGE: 'fontsizechange'\n};\n\n\n/**\n * Constant for the change event.\n * @type {string}\n * @deprecated Use `goog.dom.FontSizeMonitor.EventType.CHANGE` instead.\n */\ngoog.dom.FontSizeMonitor.CHANGE_EVENT =\n    goog.dom.FontSizeMonitor.EventType.CHANGE;\n\n\n/** @override */\ngoog.dom.FontSizeMonitor.prototype.disposeInternal = function() {\n  goog.dom.FontSizeMonitor.superClass_.disposeInternal.call(this);\n\n  goog.events.unlisten(\n      this.resizeTarget_, goog.events.EventType.RESIZE, this.handleResize_,\n      false, this);\n  this.resizeTarget_ = null;\n\n  // Firefox 2 crashes if the iframe is removed during the unload phase.\n  if (!goog.userAgent.GECKO || goog.userAgent.isVersionOrHigher('1.9')) {\n    goog.dom.removeNode(this.sizeElement_);\n  }\n  delete this.sizeElement_;\n};\n\n\n/**\n * Handles the onresize event of the iframe and dispatches a change event in\n * case its size really changed.\n * @param {goog.events.BrowserEvent} e The event object.\n * @private\n */\ngoog.dom.FontSizeMonitor.prototype.handleResize_ = function(e) {\n  // Only dispatch the event if the size really changed.  Some newer browsers do\n  // not really change the font-size,  instead they zoom the whole page.  This\n  // does trigger window resize events on the iframe but the logical pixel size\n  // remains the same (the device pixel size changes but that is irrelevant).\n  var currentWidth = this.sizeElement_.offsetWidth;\n  if (this.lastWidth_ != currentWidth) {\n    this.lastWidth_ = currentWidth;\n    this.dispatchEvent(goog.dom.FontSizeMonitor.EventType.CHANGE);\n  }\n};\n","^AK",1579837703000,"^AL",["^AM",["^BL","^AA","^AP","^BH","^BU","^CS","^BJ"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/fontsizemonitor.js"],"^B6",["^AM",["~$goog.dom.FontSizeMonitor","~$goog.dom.FontSizeMonitor.EventType"]],"^A?",true,"^A@",["^AA","^BL","^BJ","^CS","^AP","^BU","^BH"]],["^ ","^AC",[1579837703000],"^AD","goog.math.line.js","^AE",["^AF","goog/math/line.js"],"^AG","goog/math/line.js","^AH","^AI","^AJ","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Represents a line in 2D space.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.math.Line');\n\ngoog.require('goog.math');\ngoog.require('goog.math.Coordinate');\n\n\n\n/**\n * Object representing a line.\n * @param {number} x0 X coordinate of the start point.\n * @param {number} y0 Y coordinate of the start point.\n * @param {number} x1 X coordinate of the end point.\n * @param {number} y1 Y coordinate of the end point.\n * @struct\n * @constructor\n * @final\n */\ngoog.math.Line = function(x0, y0, x1, y1) {\n  /**\n   * X coordinate of the first point.\n   * @type {number}\n   */\n  this.x0 = x0;\n\n  /**\n   * Y coordinate of the first point.\n   * @type {number}\n   */\n  this.y0 = y0;\n\n  /**\n   * X coordinate of the first control point.\n   * @type {number}\n   */\n  this.x1 = x1;\n\n  /**\n   * Y coordinate of the first control point.\n   * @type {number}\n   */\n  this.y1 = y1;\n};\n\n\n/**\n * @return {!goog.math.Line} A copy of this line.\n */\ngoog.math.Line.prototype.clone = function() {\n  return new goog.math.Line(this.x0, this.y0, this.x1, this.y1);\n};\n\n\n/**\n * Tests whether the given line is exactly the same as this one.\n * @param {goog.math.Line} other The other line.\n * @return {boolean} Whether the given line is the same as this one.\n */\ngoog.math.Line.prototype.equals = function(other) {\n  return this.x0 == other.x0 && this.y0 == other.y0 && this.x1 == other.x1 &&\n      this.y1 == other.y1;\n};\n\n\n/**\n * @return {number} The squared length of the line segment used to define the\n *     line.\n */\ngoog.math.Line.prototype.getSegmentLengthSquared = function() {\n  var xdist = this.x1 - this.x0;\n  var ydist = this.y1 - this.y0;\n  return xdist * xdist + ydist * ydist;\n};\n\n\n/**\n * @return {number} The length of the line segment used to define the line.\n */\ngoog.math.Line.prototype.getSegmentLength = function() {\n  return Math.sqrt(this.getSegmentLengthSquared());\n};\n\n\n/**\n * Computes the interpolation parameter for the point on the line closest to\n * a given point.\n * @param {number|goog.math.Coordinate} x The x coordinate of the point, or\n *     a coordinate object.\n * @param {number=} opt_y The y coordinate of the point - required if x is a\n *     number, ignored if x is a goog.math.Coordinate.\n * @return {number} The interpolation parameter of the point on the line\n *     closest to the given point.\n * @private\n */\ngoog.math.Line.prototype.getClosestLinearInterpolation_ = function(x, opt_y) {\n  var y;\n  if (x instanceof goog.math.Coordinate) {\n    y = x.y;\n    x = x.x;\n  } else {\n    y = opt_y;\n  }\n\n  var x0 = this.x0;\n  var y0 = this.y0;\n\n  var xChange = this.x1 - x0;\n  var yChange = this.y1 - y0;\n\n  return ((Number(x) - x0) * xChange + (Number(y) - y0) * yChange) /\n      this.getSegmentLengthSquared();\n};\n\n\n/**\n * Returns the point on the line segment proportional to t, where for t = 0 we\n * return the starting point and for t = 1 we return the end point.  For t < 0\n * or t > 1 we extrapolate along the line defined by the line segment.\n * @param {number} t The interpolation parameter along the line segment.\n * @return {!goog.math.Coordinate} The point on the line segment at t.\n */\ngoog.math.Line.prototype.getInterpolatedPoint = function(t) {\n  return new goog.math.Coordinate(\n      goog.math.lerp(this.x0, this.x1, t), goog.math.lerp(this.y0, this.y1, t));\n};\n\n\n/**\n * Computes the point on the line closest to a given point.  Note that a line\n * in this case is defined as the infinite line going through the start and end\n * points.  To find the closest point on the line segment itself see\n * {@see #getClosestSegmentPoint}.\n * @param {number|goog.math.Coordinate} x The x coordinate of the point, or\n *     a coordinate object.\n * @param {number=} opt_y The y coordinate of the point - required if x is a\n *     number, ignored if x is a goog.math.Coordinate.\n * @return {!goog.math.Coordinate} The point on the line closest to the given\n *     point.\n */\ngoog.math.Line.prototype.getClosestPoint = function(x, opt_y) {\n  return this.getInterpolatedPoint(\n      this.getClosestLinearInterpolation_(x, opt_y));\n};\n\n\n/**\n * Computes the point on the line segment closest to a given point.\n * @param {number|goog.math.Coordinate} x The x coordinate of the point, or\n *     a coordinate object.\n * @param {number=} opt_y The y coordinate of the point - required if x is a\n *     number, ignored if x is a goog.math.Coordinate.\n * @return {!goog.math.Coordinate} The point on the line segment closest to the\n *     given point.\n */\ngoog.math.Line.prototype.getClosestSegmentPoint = function(x, opt_y) {\n  return this.getInterpolatedPoint(\n      goog.math.clamp(this.getClosestLinearInterpolation_(x, opt_y), 0, 1));\n};\n","^AK",1579837703000,"^AL",["^AM",["^AA","^CF","^BQ"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/math/line.js"],"^B6",["^AM",["~$goog.math.Line"]],"^A?",true,"^A@",["^AA","^BQ","^CF"]],["^ ","^AC",[1579837703000],"^AD","goog.events.listenermap.js","^AE",["^AF","goog/events/listenermap.js"],"^AG","goog/events/listenermap.js","^AH","^AI","^AJ","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A map of listeners that provides utility functions to\n * deal with listeners on an event target. Used by\n * `goog.events.EventTarget`.\n *\n * WARNING: Do not use this class from outside goog.events package.\n */\n\ngoog.provide('goog.events.ListenerMap');\n\ngoog.require('goog.array');\ngoog.require('goog.events.Listener');\ngoog.require('goog.object');\n\n\n\n/**\n * Creates a new listener map.\n * @param {EventTarget|goog.events.Listenable} src The src object.\n * @constructor\n * @final\n */\ngoog.events.ListenerMap = function(src) {\n  /** @type {EventTarget|goog.events.Listenable} */\n  this.src = src;\n\n  /**\n   * Maps of event type to an array of listeners.\n   * @type {!Object<string, !Array<!goog.events.Listener>>}\n   */\n  this.listeners = {};\n\n  /**\n   * The count of types in this map that have registered listeners.\n   * @private {number}\n   */\n  this.typeCount_ = 0;\n};\n\n\n/**\n * @return {number} The count of event types in this map that actually\n *     have registered listeners.\n */\ngoog.events.ListenerMap.prototype.getTypeCount = function() {\n  return this.typeCount_;\n};\n\n\n/**\n * @return {number} Total number of registered listeners.\n */\ngoog.events.ListenerMap.prototype.getListenerCount = function() {\n  var count = 0;\n  for (var type in this.listeners) {\n    count += this.listeners[type].length;\n  }\n  return count;\n};\n\n\n/**\n * Adds an event listener. A listener can only be added once to an\n * object and if it is added again the key for the listener is\n * returned.\n *\n * Note that a one-off listener will not change an existing listener,\n * if any. On the other hand a normal listener will change existing\n * one-off listener to become a normal listener.\n *\n * @param {string|!goog.events.EventId} type The listener event type.\n * @param {!Function} listener This listener callback method.\n * @param {boolean} callOnce Whether the listener is a one-off\n *     listener.\n * @param {boolean=} opt_useCapture The capture mode of the listener.\n * @param {Object=} opt_listenerScope Object in whose scope to call the\n *     listener.\n * @return {!goog.events.ListenableKey} Unique key for the listener.\n */\ngoog.events.ListenerMap.prototype.add = function(\n    type, listener, callOnce, opt_useCapture, opt_listenerScope) {\n  var typeStr = type.toString();\n  var listenerArray = this.listeners[typeStr];\n  if (!listenerArray) {\n    listenerArray = this.listeners[typeStr] = [];\n    this.typeCount_++;\n  }\n\n  var listenerObj;\n  var index = goog.events.ListenerMap.findListenerIndex_(\n      listenerArray, listener, opt_useCapture, opt_listenerScope);\n  if (index > -1) {\n    listenerObj = listenerArray[index];\n    if (!callOnce) {\n      // Ensure that, if there is an existing callOnce listener, it is no\n      // longer a callOnce listener.\n      listenerObj.callOnce = false;\n    }\n  } else {\n    listenerObj = new goog.events.Listener(\n        listener, null, this.src, typeStr, !!opt_useCapture, opt_listenerScope);\n    listenerObj.callOnce = callOnce;\n    listenerArray.push(listenerObj);\n  }\n  return listenerObj;\n};\n\n\n/**\n * Removes a matching listener.\n * @param {string|!goog.events.EventId} type The listener event type.\n * @param {!Function} listener This listener callback method.\n * @param {boolean=} opt_useCapture The capture mode of the listener.\n * @param {Object=} opt_listenerScope Object in whose scope to call the\n *     listener.\n * @return {boolean} Whether any listener was removed.\n */\ngoog.events.ListenerMap.prototype.remove = function(\n    type, listener, opt_useCapture, opt_listenerScope) {\n  var typeStr = type.toString();\n  if (!(typeStr in this.listeners)) {\n    return false;\n  }\n\n  var listenerArray = this.listeners[typeStr];\n  var index = goog.events.ListenerMap.findListenerIndex_(\n      listenerArray, listener, opt_useCapture, opt_listenerScope);\n  if (index > -1) {\n    var listenerObj = listenerArray[index];\n    listenerObj.markAsRemoved();\n    goog.array.removeAt(listenerArray, index);\n    if (listenerArray.length == 0) {\n      delete this.listeners[typeStr];\n      this.typeCount_--;\n    }\n    return true;\n  }\n  return false;\n};\n\n\n/**\n * Removes the given listener object.\n * @param {!goog.events.ListenableKey} listener The listener to remove.\n * @return {boolean} Whether the listener is removed.\n */\ngoog.events.ListenerMap.prototype.removeByKey = function(listener) {\n  var type = listener.type;\n  if (!(type in this.listeners)) {\n    return false;\n  }\n\n  var removed = goog.array.remove(this.listeners[type], listener);\n  if (removed) {\n    /** @type {!goog.events.Listener} */ (listener).markAsRemoved();\n    if (this.listeners[type].length == 0) {\n      delete this.listeners[type];\n      this.typeCount_--;\n    }\n  }\n  return removed;\n};\n\n\n/**\n * Removes all listeners from this map. If opt_type is provided, only\n * listeners that match the given type are removed.\n * @param {string|!goog.events.EventId=} opt_type Type of event to remove.\n * @return {number} Number of listeners removed.\n */\ngoog.events.ListenerMap.prototype.removeAll = function(opt_type) {\n  var typeStr = opt_type && opt_type.toString();\n  var count = 0;\n  for (var type in this.listeners) {\n    if (!typeStr || type == typeStr) {\n      var listenerArray = this.listeners[type];\n      for (var i = 0; i < listenerArray.length; i++) {\n        ++count;\n        listenerArray[i].markAsRemoved();\n      }\n      delete this.listeners[type];\n      this.typeCount_--;\n    }\n  }\n  return count;\n};\n\n\n/**\n * Gets all listeners that match the given type and capture mode. The\n * returned array is a copy (but the listener objects are not).\n * @param {string|!goog.events.EventId} type The type of the listeners\n *     to retrieve.\n * @param {boolean} capture The capture mode of the listeners to retrieve.\n * @return {!Array<!goog.events.ListenableKey>} An array of matching\n *     listeners.\n */\ngoog.events.ListenerMap.prototype.getListeners = function(type, capture) {\n  var listenerArray = this.listeners[type.toString()];\n  var rv = [];\n  if (listenerArray) {\n    for (var i = 0; i < listenerArray.length; ++i) {\n      var listenerObj = listenerArray[i];\n      if (listenerObj.capture == capture) {\n        rv.push(listenerObj);\n      }\n    }\n  }\n  return rv;\n};\n\n\n/**\n * Gets the goog.events.ListenableKey for the event or null if no such\n * listener is in use.\n *\n * @param {string|!goog.events.EventId} type The type of the listener\n *     to retrieve.\n * @param {!Function} listener The listener function to get.\n * @param {boolean} capture Whether the listener is a capturing listener.\n * @param {Object=} opt_listenerScope Object in whose scope to call the\n *     listener.\n * @return {goog.events.ListenableKey} the found listener or null if not found.\n */\ngoog.events.ListenerMap.prototype.getListener = function(\n    type, listener, capture, opt_listenerScope) {\n  var listenerArray = this.listeners[type.toString()];\n  var i = -1;\n  if (listenerArray) {\n    i = goog.events.ListenerMap.findListenerIndex_(\n        listenerArray, listener, capture, opt_listenerScope);\n  }\n  return i > -1 ? listenerArray[i] : null;\n};\n\n\n/**\n * Whether there is a matching listener. If either the type or capture\n * parameters are unspecified, the function will match on the\n * remaining criteria.\n *\n * @param {string|!goog.events.EventId=} opt_type The type of the listener.\n * @param {boolean=} opt_capture The capture mode of the listener.\n * @return {boolean} Whether there is an active listener matching\n *     the requested type and/or capture phase.\n */\ngoog.events.ListenerMap.prototype.hasListener = function(\n    opt_type, opt_capture) {\n  var hasType = (opt_type !== undefined);\n  var typeStr = hasType ? opt_type.toString() : '';\n  var hasCapture = (opt_capture !== undefined);\n\n  return goog.object.some(this.listeners, function(listenerArray, type) {\n    for (var i = 0; i < listenerArray.length; ++i) {\n      if ((!hasType || listenerArray[i].type == typeStr) &&\n          (!hasCapture || listenerArray[i].capture == opt_capture)) {\n        return true;\n      }\n    }\n\n    return false;\n  });\n};\n\n\n/**\n * Finds the index of a matching goog.events.Listener in the given\n * listenerArray.\n * @param {!Array<!goog.events.Listener>} listenerArray Array of listener.\n * @param {!Function} listener The listener function.\n * @param {boolean=} opt_useCapture The capture flag for the listener.\n * @param {Object=} opt_listenerScope The listener scope.\n * @return {number} The index of the matching listener within the\n *     listenerArray.\n * @private\n */\ngoog.events.ListenerMap.findListenerIndex_ = function(\n    listenerArray, listener, opt_useCapture, opt_listenerScope) {\n  for (var i = 0; i < listenerArray.length; ++i) {\n    var listenerObj = listenerArray[i];\n    if (!listenerObj.removed && listenerObj.listener == listener &&\n        listenerObj.capture == !!opt_useCapture &&\n        listenerObj.handler == opt_listenerScope) {\n      return i;\n    }\n  }\n  return -1;\n};\n","^AK",1579837703000,"^AL",["^AM",["~$goog.events.Listener","^AA","^B:","^AR"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/events/listenermap.js"],"^B6",["^AM",["~$goog.events.ListenerMap"]],"^A?",true,"^A@",["^AA","^AR","^D4","^B:"]],["^ ","^AC",[1579837703000],"^AD","goog.labs.net.webchannel.requeststats.js","^AE",["^AF","goog/labs/net/webchannel/requeststats.js"],"^AG","goog/labs/net/webchannel/requeststats.js","^AH","^AI","^AJ","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Static utilities for collecting stats associated with\n * ChannelRequest.\n */\n\n\ngoog.provide('goog.labs.net.webChannel.requestStats');\ngoog.provide('goog.labs.net.webChannel.requestStats.Event');\ngoog.provide('goog.labs.net.webChannel.requestStats.ServerReachability');\ngoog.provide('goog.labs.net.webChannel.requestStats.ServerReachabilityEvent');\ngoog.provide('goog.labs.net.webChannel.requestStats.Stat');\ngoog.provide('goog.labs.net.webChannel.requestStats.StatEvent');\ngoog.provide('goog.labs.net.webChannel.requestStats.TimingEvent');\n\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventTarget');\n\n\ngoog.scope(function() {\nvar requestStats = goog.labs.net.webChannel.requestStats;\n\n\n/**\n * Events fired.\n * @const\n */\nrequestStats.Event = {};\n\n\n/**\n * Singleton event target for firing stat events\n * @type {?goog.events.EventTarget}\n * @private\n */\nrequestStats.eventTarget_ = null;\n\n/**\n * Singleton event target for firing stat events\n * @return {!goog.events.EventTarget}\n * @private\n */\nrequestStats.getStatEventTarget_ = function() {\n  requestStats.eventTarget_ =\n      requestStats.eventTarget_ || new goog.events.EventTarget();\n  return requestStats.eventTarget_;\n};\n\n/**\n * The type of event that occurs every time some information about how reachable\n * the server is is discovered.\n */\nrequestStats.Event.SERVER_REACHABILITY_EVENT = 'serverreachability';\n\n\n/**\n * Types of events which reveal information about the reachability of the\n * server.\n * @enum {number}\n */\nrequestStats.ServerReachability = {\n  REQUEST_MADE: 1,\n  REQUEST_SUCCEEDED: 2,\n  REQUEST_FAILED: 3,\n  BACK_CHANNEL_ACTIVITY: 4  // any response data received\n};\n\n\n\n/**\n * Event class for SERVER_REACHABILITY_EVENT.\n *\n * @param {goog.events.EventTarget} target The stat event target for\n       the channel.\n * @param {requestStats.ServerReachability} reachabilityType\n *     The reachability event type.\n * @constructor\n * @extends {goog.events.Event}\n */\nrequestStats.ServerReachabilityEvent = function(target, reachabilityType) {\n  goog.events.Event.call(\n      this, requestStats.Event.SERVER_REACHABILITY_EVENT, target);\n\n  /**\n   * @type {requestStats.ServerReachability}\n   */\n  this.reachabilityType = reachabilityType;\n};\ngoog.inherits(requestStats.ServerReachabilityEvent, goog.events.Event);\n\n\n/**\n * Notify the channel that a particular fine grained network event has occurred.\n * Should be considered package-private.\n * @param {requestStats.ServerReachability} reachabilityType\n *     The reachability event type.\n */\nrequestStats.notifyServerReachabilityEvent = function(reachabilityType) {\n  var target = requestStats.getStatEventTarget_();\n  target.dispatchEvent(\n      new requestStats.ServerReachabilityEvent(target, reachabilityType));\n};\n\n\n/**\n * Stat Event that fires when things of interest happen that may be useful for\n * applications to know about for stats or debugging purposes.\n */\nrequestStats.Event.STAT_EVENT = 'statevent';\n\n\n/**\n * Enum that identifies events for statistics that are interesting to track.\n * @enum {number}\n */\nrequestStats.Stat = {\n  /** Event indicating a new connection attempt. */\n  CONNECT_ATTEMPT: 0,\n\n  /** Event indicating a connection error due to a general network problem. */\n  ERROR_NETWORK: 1,\n\n  /**\n   * Event indicating a connection error that isn't due to a general network\n   * problem.\n   */\n  ERROR_OTHER: 2,\n\n  /** Event indicating the start of test stage one. */\n  TEST_STAGE_ONE_START: 3,\n\n  /** Event indicating the start of test stage two. */\n  TEST_STAGE_TWO_START: 4,\n\n  /** Event indicating the first piece of test data was received. */\n  TEST_STAGE_TWO_DATA_ONE: 5,\n\n  /**\n   * Event indicating that the second piece of test data was received and it was\n   * received separately from the first.\n   */\n  TEST_STAGE_TWO_DATA_TWO: 6,\n\n  /** Event indicating both pieces of test data were received simultaneously. */\n  TEST_STAGE_TWO_DATA_BOTH: 7,\n\n  /** Event indicating stage one of the test request failed. */\n  TEST_STAGE_ONE_FAILED: 8,\n\n  /** Event indicating stage two of the test request failed. */\n  TEST_STAGE_TWO_FAILED: 9,\n\n  /**\n   * Event indicating that a buffering proxy is likely between the client and\n   * the server.\n   */\n  PROXY: 10,\n\n  /**\n   * Event indicating that no buffering proxy is likely between the client and\n   * the server.\n   */\n  NOPROXY: 11,\n\n  /** Event indicating an unknown SID error. */\n  REQUEST_UNKNOWN_SESSION_ID: 12,\n\n  /** Event indicating a bad status code was received. */\n  REQUEST_BAD_STATUS: 13,\n\n  /** Event indicating incomplete data was received */\n  REQUEST_INCOMPLETE_DATA: 14,\n\n  /** Event indicating bad data was received */\n  REQUEST_BAD_DATA: 15,\n\n  /** Event indicating no data was received when data was expected. */\n  REQUEST_NO_DATA: 16,\n\n  /** Event indicating a request timeout. */\n  REQUEST_TIMEOUT: 17,\n\n  /**\n   * Event indicating that the server never received our hanging GET and so it\n   * is being retried.\n   */\n  BACKCHANNEL_MISSING: 18,\n\n  /**\n   * Event indicating that we have determined that our hanging GET is not\n   * receiving data when it should be. Thus it is dead dead and will be retried.\n   */\n  BACKCHANNEL_DEAD: 19,\n\n  /**\n   * The browser declared itself offline during the lifetime of a request, or\n   * was offline when a request was initially made.\n   */\n  BROWSER_OFFLINE: 20\n};\n\n\n\n/**\n * Event class for STAT_EVENT.\n *\n * @param {goog.events.EventTarget} eventTarget The stat event target for\n       the channel.\n * @param {requestStats.Stat} stat The stat.\n * @constructor\n * @extends {goog.events.Event}\n */\nrequestStats.StatEvent = function(eventTarget, stat) {\n  goog.events.Event.call(this, requestStats.Event.STAT_EVENT, eventTarget);\n\n  /**\n   * The stat\n   * @type {requestStats.Stat}\n   */\n  this.stat = stat;\n\n};\ngoog.inherits(requestStats.StatEvent, goog.events.Event);\n\n\n/**\n * Returns the singleton event target for stat events.\n * @return {goog.events.EventTarget} The event target for stat events.\n */\nrequestStats.getStatEventTarget = function() {\n  return requestStats.getStatEventTarget_();\n};\n\n\n/**\n * Helper function to call the stat event callback.\n * @param {requestStats.Stat} stat The stat.\n */\nrequestStats.notifyStatEvent = function(stat) {\n  var target = requestStats.getStatEventTarget_();\n  target.dispatchEvent(new requestStats.StatEvent(target, stat));\n};\n\n\n/**\n * An event that fires when POST requests complete successfully, indicating\n * the size of the POST and the round trip time.\n */\nrequestStats.Event.TIMING_EVENT = 'timingevent';\n\n\n\n/**\n * Event class for requestStats.Event.TIMING_EVENT\n *\n * @param {goog.events.EventTarget} target The stat event target for\n       the channel.\n * @param {number} size The number of characters in the POST data.\n * @param {number} rtt The total round trip time from POST to response in MS.\n * @param {number} retries The number of times the POST had to be retried.\n * @constructor\n * @extends {goog.events.Event}\n */\nrequestStats.TimingEvent = function(target, size, rtt, retries) {\n  goog.events.Event.call(this, requestStats.Event.TIMING_EVENT, target);\n\n  /**\n   * @type {number}\n   */\n  this.size = size;\n\n  /**\n   * @type {number}\n   */\n  this.rtt = rtt;\n\n  /**\n   * @type {number}\n   */\n  this.retries = retries;\n\n};\ngoog.inherits(requestStats.TimingEvent, goog.events.Event);\n\n\n/**\n * Helper function to notify listeners about POST request performance.\n *\n * @param {number} size Number of characters in the POST data.\n * @param {number} rtt The amount of time from POST start to response.\n * @param {number} retries The number of times the POST had to be retried.\n */\nrequestStats.notifyTimingEvent = function(size, rtt, retries) {\n  var target = requestStats.getStatEventTarget_();\n  target.dispatchEvent(\n      new requestStats.TimingEvent(target, size, rtt, retries));\n};\n\n\n/**\n * Allows the application to set an execution hooks for when a channel\n * starts processing requests. This is useful to track timing or logging\n * special information. The function takes no parameters and return void.\n * @param {Function} startHook  The function for the start hook.\n */\nrequestStats.setStartThreadExecutionHook = function(startHook) {\n  requestStats.startExecutionHook_ = startHook;\n};\n\n\n/**\n * Allows the application to set an execution hooks for when a channel\n * stops processing requests. This is useful to track timing or logging\n * special information. The function takes no parameters and return void.\n * @param {Function} endHook  The function for the end hook.\n */\nrequestStats.setEndThreadExecutionHook = function(endHook) {\n  requestStats.endExecutionHook_ = endHook;\n};\n\n\n/**\n * Application provided execution hook for the start hook.\n *\n * @type {Function}\n * @private\n */\nrequestStats.startExecutionHook_ = function() {};\n\n\n/**\n * Application provided execution hook for the end hook.\n *\n * @type {Function}\n * @private\n */\nrequestStats.endExecutionHook_ = function() {};\n\n\n/**\n * Helper function to call the start hook\n */\nrequestStats.onStartExecution = function() {\n  requestStats.startExecutionHook_();\n};\n\n\n/**\n * Helper function to call the end hook\n */\nrequestStats.onEndExecution = function() {\n  requestStats.endExecutionHook_();\n};\n\n\n/**\n * Wrapper around SafeTimeout which calls the start and end execution hooks\n * with a try...finally block.\n * @param {Function} fn The callback function.\n * @param {number} ms The time in MS for the timer.\n * @return {number} The ID of the timer.\n */\nrequestStats.setTimeout = function(fn, ms) {\n  if (!goog.isFunction(fn)) {\n    throw new Error('Fn must not be null and must be a function');\n  }\n  return goog.global.setTimeout(function() {\n    requestStats.onStartExecution();\n    try {\n      fn();\n    } finally {\n      requestStats.onEndExecution();\n    }\n  }, ms);\n};\n});  // goog.scope\n","^AK",1579837703000,"^AL",["^AM",["^AA","^AP","^CR"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/net/webchannel/requeststats.js"],"^B6",["^AM",["~$goog.labs.net.webChannel.requestStats.StatEvent","~$goog.labs.net.webChannel.requestStats.Event","~$goog.labs.net.webChannel.requestStats.ServerReachabilityEvent","~$goog.labs.net.webChannel.requestStats","~$goog.labs.net.webChannel.requestStats.Stat","~$goog.labs.net.webChannel.requestStats.TimingEvent","~$goog.labs.net.webChannel.requestStats.ServerReachability"]],"^A?",true,"^A@",["^AA","^CR","^AP"]],["^ ","^AC",[1579837703000],"^AD","goog.debug.divconsole.js","^AE",["^AF","goog/debug/divconsole.js"],"^AG","goog/debug/divconsole.js","^AH","^AI","^AJ","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Simple logger that logs a Div Element.\n *\n */\n\ngoog.provide('goog.debug.DivConsole');\n\ngoog.require('goog.debug.HtmlFormatter');\ngoog.require('goog.debug.LogManager');\ngoog.require('goog.dom.DomHelper');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.safe');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.html.SafeStyleSheet');\ngoog.require('goog.string.Const');\ngoog.require('goog.style');\n\n\n/**\n * A class for visualising logger calls in a div element.\n * @param {Element} element The element to append to.\n * @constructor\n */\ngoog.debug.DivConsole = function(element) {\n  this.publishHandler_ = goog.bind(this.addLogRecord, this);\n  this.formatter_ = new goog.debug.HtmlFormatter();\n  this.formatter_.showAbsoluteTime = false;\n  this.isCapturing_ = false;\n  this.element_ = element;\n  this.elementOwnerDocument_ =\n      this.element_.ownerDocument || this.element_.document;\n  this.domHelper_ = new goog.dom.DomHelper(this.elementOwnerDocument_);\n\n  this.installStyles();\n};\n\n\n/**\n * Installs styles for the log messages and its div\n */\ngoog.debug.DivConsole.prototype.installStyles = function() {\n  goog.style.installSafeStyleSheet(\n      goog.html.SafeStyleSheet.fromConstant(goog.string.Const.from(\n          '.dbg-sev{color:#F00}' +\n          '.dbg-w{color:#C40}' +\n          '.dbg-sh{font-weight:bold;color:#000}' +\n          '.dbg-i{color:#444}' +\n          '.dbg-f{color:#999}' +\n          '.dbg-ev{color:#0A0}' +\n          '.dbg-m{color:#990}' +\n          '.logmsg{border-bottom:1px solid #CCC;padding:2px}' +\n          '.logsep{background-color: #8C8;}' +\n          '.logdiv{border:1px solid #CCC;background-color:#FCFCFC;' +\n          'font:medium monospace}')),\n      this.element_);\n  this.element_.className += ' logdiv';\n};\n\n\n/**\n * Sets whether we are currently capturing logger output.\n * @param {boolean} capturing Whether to capture logger output.\n */\ngoog.debug.DivConsole.prototype.setCapturing = function(capturing) {\n  if (capturing == this.isCapturing_) {\n    return;\n  }\n\n  // attach or detach handler from the root logger\n  var rootLogger = goog.debug.LogManager.getRoot();\n  if (capturing) {\n    rootLogger.addHandler(this.publishHandler_);\n  } else {\n    rootLogger.removeHandler(this.publishHandler_);\n  }\n  this.isCapturing_ = capturing;\n};\n\n\n/**\n * Adds a log record.\n * @param {goog.debug.LogRecord} logRecord The log entry.\n */\ngoog.debug.DivConsole.prototype.addLogRecord = function(logRecord) {\n  if (!logRecord) {\n    return;\n  }\n  var scroll = this.element_.scrollHeight - this.element_.scrollTop -\n          this.element_.clientHeight <=\n      100;\n\n  var div = this.domHelper_.createElement(goog.dom.TagName.DIV);\n  div.className = 'logmsg';\n  goog.dom.safe.setInnerHtml(\n      div, this.formatter_.formatRecordAsHtml(logRecord));\n  this.element_.appendChild(div);\n\n  if (scroll) {\n    this.element_.scrollTop = this.element_.scrollHeight;\n  }\n};\n\n\n/**\n * Gets the formatter for outputting to the console. The default formatter\n * is an instance of goog.debug.HtmlFormatter\n * @return {!goog.debug.Formatter} The formatter in use.\n */\ngoog.debug.DivConsole.prototype.getFormatter = function() {\n  return this.formatter_;\n};\n\n\n/**\n * Sets the formatter for outputting to the console.\n * @param {goog.debug.HtmlFormatter} formatter The formatter to use.\n */\ngoog.debug.DivConsole.prototype.setFormatter = function(formatter) {\n  this.formatter_ = formatter;\n};\n\n\n/**\n * Adds a separator to the debug window.\n */\ngoog.debug.DivConsole.prototype.addSeparator = function() {\n  var div = this.domHelper_.createElement(goog.dom.TagName.DIV);\n  div.className = 'logmsg logsep';\n  this.element_.appendChild(div);\n};\n\n\n/**\n * Clears the console.\n */\ngoog.debug.DivConsole.prototype.clear = function() {\n  if (this.element_) {\n    goog.dom.safe.setInnerHtml(this.element_, goog.html.SafeHtml.EMPTY);\n  }\n};\n","^AK",1579837703000,"^AL",["^AM",["^C>","~$goog.dom.DomHelper","~$goog.debug.LogManager","^AA","^C9","~$goog.dom.safe","^BI","~$goog.html.SafeStyleSheet","^C<","^BJ"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/divconsole.js"],"^B6",["^AM",["~$goog.debug.DivConsole"]],"^A?",true,"^A@",["^AA","^C>","^D>","^D=","^BJ","^D?","^C<","^D@","^C9","^BI"]],["^ ","^AC",[1579837703000],"^AD","goog.labs.useragent.engine.js","^AE",["^AF","goog/labs/useragent/engine.js"],"^AG","goog/labs/useragent/engine.js","^AH","^AI","^AJ","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Closure user agent detection.\n * @see http://en.wikipedia.org/wiki/User_agent\n * For more information on browser brand, platform, or device see the other\n * sub-namespaces in goog.labs.userAgent (browser, platform, and device).\n *\n */\n\ngoog.provide('goog.labs.userAgent.engine');\n\ngoog.require('goog.array');\ngoog.require('goog.labs.userAgent.util');\ngoog.require('goog.string');\n\n\n/**\n * @return {boolean} Whether the rendering engine is Presto.\n */\ngoog.labs.userAgent.engine.isPresto = function() {\n  return goog.labs.userAgent.util.matchUserAgent('Presto');\n};\n\n\n/**\n * @return {boolean} Whether the rendering engine is Trident.\n */\ngoog.labs.userAgent.engine.isTrident = function() {\n  // IE only started including the Trident token in IE8.\n  return goog.labs.userAgent.util.matchUserAgent('Trident') ||\n      goog.labs.userAgent.util.matchUserAgent('MSIE');\n};\n\n\n/**\n * @return {boolean} Whether the rendering engine is EdgeHTML.\n */\ngoog.labs.userAgent.engine.isEdge = function() {\n  return goog.labs.userAgent.util.matchUserAgent('Edge');\n};\n\n\n/**\n * @return {boolean} Whether the rendering engine is WebKit. This will return\n * true for Chrome, Blink-based Opera (15+), Edge Chromium and Safari.\n */\ngoog.labs.userAgent.engine.isWebKit = function() {\n  return goog.labs.userAgent.util.matchUserAgentIgnoreCase('WebKit') &&\n      !goog.labs.userAgent.engine.isEdge();\n};\n\n\n/**\n * @return {boolean} Whether the rendering engine is Gecko.\n */\ngoog.labs.userAgent.engine.isGecko = function() {\n  return goog.labs.userAgent.util.matchUserAgent('Gecko') &&\n      !goog.labs.userAgent.engine.isWebKit() &&\n      !goog.labs.userAgent.engine.isTrident() &&\n      !goog.labs.userAgent.engine.isEdge();\n};\n\n\n/**\n * @return {string} The rendering engine's version or empty string if version\n *     can't be determined.\n */\ngoog.labs.userAgent.engine.getVersion = function() {\n  var userAgentString = goog.labs.userAgent.util.getUserAgent();\n  if (userAgentString) {\n    var tuples = goog.labs.userAgent.util.extractVersionTuples(userAgentString);\n\n    var engineTuple = goog.labs.userAgent.engine.getEngineTuple_(tuples);\n    if (engineTuple) {\n      // In Gecko, the version string is either in the browser info or the\n      // Firefox version.  See Gecko user agent string reference:\n      // http://goo.gl/mULqa\n      if (engineTuple[0] == 'Gecko') {\n        return goog.labs.userAgent.engine.getVersionForKey_(tuples, 'Firefox');\n      }\n\n      return engineTuple[1];\n    }\n\n    // MSIE has only one version identifier, and the Trident version is\n    // specified in the parenthetical. IE Edge is covered in the engine tuple\n    // detection.\n    var browserTuple = tuples[0];\n    var info;\n    if (browserTuple && (info = browserTuple[2])) {\n      var match = /Trident\\/([^\\s;]+)/.exec(info);\n      if (match) {\n        return match[1];\n      }\n    }\n  }\n  return '';\n};\n\n\n/**\n * @param {!Array<!Array<string>>} tuples Extracted version tuples.\n * @return {!Array<string>|undefined} The engine tuple or undefined if not\n *     found.\n * @private\n */\ngoog.labs.userAgent.engine.getEngineTuple_ = function(tuples) {\n  if (!goog.labs.userAgent.engine.isEdge()) {\n    return tuples[1];\n  }\n  for (var i = 0; i < tuples.length; i++) {\n    var tuple = tuples[i];\n    if (tuple[0] == 'Edge') {\n      return tuple;\n    }\n  }\n};\n\n\n/**\n * @param {string|number} version The version to check.\n * @return {boolean} Whether the rendering engine version is higher or the same\n *     as the given version.\n */\ngoog.labs.userAgent.engine.isVersionOrHigher = function(version) {\n  return goog.string.compareVersions(\n             goog.labs.userAgent.engine.getVersion(), version) >= 0;\n};\n\n\n/**\n * @param {!Array<!Array<string>>} tuples Version tuples.\n * @param {string} key The key to look for.\n * @return {string} The version string of the given key, if present.\n *     Otherwise, the empty string.\n * @private\n */\ngoog.labs.userAgent.engine.getVersionForKey_ = function(tuples, key) {\n  // TODO(nnaze): Move to util if useful elsewhere.\n\n  var pair = goog.array.find(tuples, function(pair) { return key == pair[0]; });\n\n  return pair && pair[1] || '';\n};\n","^AK",1579837703000,"^AL",["^AM",["^BF","^AA","^AR","^B<"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/labs/useragent/engine.js"],"^B6",["^AM",["^C2"]],"^A?",true,"^A@",["^AA","^AR","^B<","^BF"]],["^ ","^AC",[1579837703000],"^AD","goog.ui.dialog.js","^AE",["^AF","goog/ui/dialog.js"],"^AG","goog/ui/dialog.js","^AH","^AI","^AJ","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Class for showing simple modal dialog boxes.\n *\n * TODO(user):\n *   * Standardize CSS class names with other components\n *   * Add functionality to \"host\" other components in content area\n *   * Abstract out ButtonSet and make it more general\n * @see ../demos/dialog.html\n */\n\ngoog.provide('goog.ui.Dialog');\ngoog.provide('goog.ui.Dialog.ButtonSet');\ngoog.provide('goog.ui.Dialog.ButtonSet.DefaultButtons');\ngoog.provide('goog.ui.Dialog.DefaultButtonCaptions');\ngoog.provide('goog.ui.Dialog.DefaultButtonKeys');\ngoog.provide('goog.ui.Dialog.Event');\ngoog.provide('goog.ui.Dialog.EventType');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.asserts');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.dom.safe');\ngoog.require('goog.events');\ngoog.require('goog.events.Event');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.events.Keys');\ngoog.require('goog.fx.Dragger');\ngoog.require('goog.html.SafeHtml');\ngoog.require('goog.math.Rect');\ngoog.require('goog.string');\ngoog.require('goog.structs.Map');\ngoog.require('goog.style');\ngoog.require('goog.ui.ModalPopup');\n\n\n\n/**\n * Class for showing simple dialog boxes.\n * The Html structure of the dialog box is:\n * <pre>\n *  Element         Function                Class-name, modal-dialog = default\n * ----------------------------------------------------------------------------\n * - iframe         Iframe mask              modal-dialog-bg\n * - div            Background mask          modal-dialog-bg\n * - div            Dialog area              modal-dialog\n *     - div        Title bar                modal-dialog-title\n *        - span                             modal-dialog-title-text\n *          - text  Title text               N/A\n *        - span                             modal-dialog-title-close\n *          - ??    Close box                N/A\n *     - div        Content area             modal-dialog-content\n *        - ??      User specified content   N/A\n *     - div        Button area              modal-dialog-buttons\n *        - button                           N/A\n *        - button\n *        - ...\n * </pre>\n * @constructor\n * @param {string=} opt_class CSS class name for the dialog element, also used\n *     as a class name prefix for related elements; defaults to modal-dialog.\n *     This should be a single, valid CSS class name.\n * @param {boolean=} opt_useIframeMask Work around windowed controls z-index\n *     issue by using an iframe instead of a div for bg element.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper; see {@link\n *     goog.ui.Component} for semantics.\n * @extends {goog.ui.ModalPopup}\n */\ngoog.ui.Dialog = function(opt_class, opt_useIframeMask, opt_domHelper) {\n  goog.ui.Dialog.base(this, 'constructor', opt_useIframeMask, opt_domHelper);\n\n  /**\n   * CSS class name for the dialog element, also used as a class name prefix for\n   * related elements.  Defaults to goog.getCssName('modal-dialog').\n   * @type {string}\n   * @private\n   */\n  this.class_ = opt_class || goog.getCssName('modal-dialog');\n\n  this.buttons_ = goog.ui.Dialog.ButtonSet.createOkCancel();\n};\ngoog.inherits(goog.ui.Dialog, goog.ui.ModalPopup);\ngoog.tagUnsealableClass(goog.ui.Dialog);\n\n\n/**\n * Button set.  Default to Ok/Cancel.\n * @type {goog.ui.Dialog.ButtonSet}\n * @private\n */\ngoog.ui.Dialog.prototype.buttons_;\n\n\n/**\n * Whether the escape key closes this dialog.\n * @type {boolean}\n * @private\n */\ngoog.ui.Dialog.prototype.escapeToCancel_ = true;\n\n\n/**\n * Whether this dialog should include a title close button.\n * @type {boolean}\n * @private\n */\ngoog.ui.Dialog.prototype.hasTitleCloseButton_ = true;\n\n\n/**\n * Whether the dialog is modal. Defaults to true.\n * @type {boolean}\n * @private\n */\ngoog.ui.Dialog.prototype.modal_ = true;\n\n\n/**\n * Whether the dialog is draggable. Defaults to true.\n * @type {boolean}\n * @private\n */\ngoog.ui.Dialog.prototype.draggable_ = true;\n\n\n/**\n * Opacity for background mask.  Defaults to 50%.\n * @type {number}\n * @private\n */\ngoog.ui.Dialog.prototype.backgroundElementOpacity_ = 0.50;\n\n\n/**\n * Dialog's title.\n * @type {string}\n * @private\n */\ngoog.ui.Dialog.prototype.title_ = '';\n\n\n/**\n * Dialog's content (HTML).\n * @type {?goog.html.SafeHtml}\n * @private\n */\ngoog.ui.Dialog.prototype.content_ = null;\n\n\n/**\n * Dragger.\n * @type {?goog.fx.Dragger}\n * @private\n */\ngoog.ui.Dialog.prototype.dragger_ = null;\n\n\n/**\n * Whether the dialog should be disposed when it is hidden.\n * @type {boolean}\n * @private\n */\ngoog.ui.Dialog.prototype.disposeOnHide_ = false;\n\n\n/**\n * Element for the title bar.\n * @type {?Element}\n * @private\n */\ngoog.ui.Dialog.prototype.titleEl_ = null;\n\n\n/**\n * Element for the text area of the title bar.\n * @type {?Element}\n * @private\n */\ngoog.ui.Dialog.prototype.titleTextEl_ = null;\n\n\n/**\n * Id of element for the text area of the title bar.\n * @type {?string}\n * @private\n */\ngoog.ui.Dialog.prototype.titleTextId_ = null;\n\n\n/**\n * Element for the close box area of the title bar.\n * @type {?Element}\n * @private\n */\ngoog.ui.Dialog.prototype.titleCloseEl_ = null;\n\n\n/**\n * Element for the content area.\n * @type {?Element}\n * @private\n */\ngoog.ui.Dialog.prototype.contentEl_ = null;\n\n\n/**\n * Element for the button bar.\n * @type {?Element}\n * @private\n */\ngoog.ui.Dialog.prototype.buttonEl_ = null;\n\n\n/**\n * The dialog's preferred ARIA role.\n * @type {goog.a11y.aria.Role}\n * @private\n */\ngoog.ui.Dialog.prototype.preferredAriaRole_ = goog.a11y.aria.Role.DIALOG;\n\n\n/** @override */\ngoog.ui.Dialog.prototype.getCssClass = function() {\n  return this.class_;\n};\n\n\n/**\n * Sets the title.\n * @param {string} title The title text.\n */\ngoog.ui.Dialog.prototype.setTitle = function(title) {\n  this.title_ = title;\n  if (this.titleTextEl_) {\n    goog.dom.setTextContent(this.titleTextEl_, title);\n  }\n};\n\n\n/**\n * Gets the title.\n * @return {string} The title.\n */\ngoog.ui.Dialog.prototype.getTitle = function() {\n  return this.title_;\n};\n\n\n/**\n * Allows plain text to be set in the content element.\n * @param {string} text Content plain text. Newlines are preserved.\n */\ngoog.ui.Dialog.prototype.setTextContent = function(text) {\n  this.setSafeHtmlContent(\n      goog.html.SafeHtml.htmlEscapePreservingNewlines(text));\n};\n\n\n/**\n * Allows arbitrary HTML to be set in the content element.\n * @param {!goog.html.SafeHtml} html Content HTML.\n */\ngoog.ui.Dialog.prototype.setSafeHtmlContent = function(html) {\n  this.content_ = html;\n  if (this.contentEl_) {\n    goog.dom.safe.setInnerHtml(this.contentEl_, html);\n  }\n};\n\n\n/**\n * Gets the content HTML of the content element as a plain string.\n *\n * Note that this method returns the HTML markup that was previously set via\n * setSafeHtmlContent() or setTextContent(). In particular, the HTML returned by\n * this method does not reflect any changes to the content element's DOM that\n * were made by other means.\n *\n * @return {string} Content HTML.\n */\ngoog.ui.Dialog.prototype.getContent = function() {\n  return this.content_ != null ? goog.html.SafeHtml.unwrap(this.content_) : '';\n};\n\n\n/**\n * Gets the content HTML of the content element.\n * @return {goog.html.SafeHtml} Content HTML.\n */\ngoog.ui.Dialog.prototype.getSafeHtmlContent = function() {\n  return this.content_;\n};\n\n\n/**\n * Returns the dialog's preferred ARIA role. This can be used to override the\n * default dialog role, e.g. with an ARIA role of ALERTDIALOG for a simple\n * warning or confirmation dialog.\n * @return {goog.a11y.aria.Role} This dialog's preferred ARIA role.\n */\ngoog.ui.Dialog.prototype.getPreferredAriaRole = function() {\n  return this.preferredAriaRole_;\n};\n\n\n/**\n * Sets the dialog's preferred ARIA role. This can be used to override the\n * default dialog role, e.g. with an ARIA role of ALERTDIALOG for a simple\n * warning or confirmation dialog.\n * @param {goog.a11y.aria.Role} role This dialog's preferred ARIA role.\n */\ngoog.ui.Dialog.prototype.setPreferredAriaRole = function(role) {\n  this.preferredAriaRole_ = role;\n};\n\n\n/**\n * Renders if the DOM is not created.\n * @private\n */\ngoog.ui.Dialog.prototype.renderIfNoDom_ = function() {\n  if (!this.getElement()) {\n    // TODO(gboyer): Ideally we'd only create the DOM, but many applications\n    // are requiring this behavior.  Eventually, it would be best if the\n    // element getters could return null if the elements have not been\n    // created.\n    this.render();\n  }\n};\n\n\n/**\n * Returns the content element so that more complicated things can be done with\n * the content area.  Renders if the DOM is not yet created.  Overrides\n * {@link goog.ui.Component#getContentElement}.\n * @return {Element} The content element.\n * @override\n */\ngoog.ui.Dialog.prototype.getContentElement = function() {\n  this.renderIfNoDom_();\n  return this.contentEl_;\n};\n\n\n/**\n * Returns the title element so that more complicated things can be done with\n * the title.  Renders if the DOM is not yet created.\n * @return {Element} The title element.\n */\ngoog.ui.Dialog.prototype.getTitleElement = function() {\n  this.renderIfNoDom_();\n  return this.titleEl_;\n};\n\n\n/**\n * Returns the title text element so that more complicated things can be done\n * with the text of the title.  Renders if the DOM is not yet created.\n * @return {Element} The title text element.\n */\ngoog.ui.Dialog.prototype.getTitleTextElement = function() {\n  this.renderIfNoDom_();\n  return this.titleTextEl_;\n};\n\n\n/**\n * Returns the title close element so that more complicated things can be done\n * with the close area of the title.  Renders if the DOM is not yet created.\n * @return {Element} The close box.\n */\ngoog.ui.Dialog.prototype.getTitleCloseElement = function() {\n  this.renderIfNoDom_();\n  return this.titleCloseEl_;\n};\n\n/**\n * Get the dialog close message.\n * @return {string}\n * @protected\n */\ngoog.ui.Dialog.prototype.getDialogCloseMessage = function() {\n  return goog.ui.Dialog.MSG_GOOG_UI_DIALOG_CLOSE_;\n};\n\n/**\n * Returns the button element so that more complicated things can be done with\n * the button area.  Renders if the DOM is not yet created.\n * @return {Element} The button container element.\n */\ngoog.ui.Dialog.prototype.getButtonElement = function() {\n  this.renderIfNoDom_();\n  return this.buttonEl_;\n};\n\n\n/**\n * Returns the dialog element so that more complicated things can be done with\n * the dialog box.  Renders if the DOM is not yet created.\n * @return {Element} The dialog element.\n */\ngoog.ui.Dialog.prototype.getDialogElement = function() {\n  this.renderIfNoDom_();\n  return this.getElement();\n};\n\n\n/**\n * Returns the background mask element so that more complicated things can be\n * done with the background region.  Renders if the DOM is not yet created.\n * @return {Element} The background mask element.\n * @override\n */\ngoog.ui.Dialog.prototype.getBackgroundElement = function() {\n  this.renderIfNoDom_();\n  return goog.ui.Dialog.base(this, 'getBackgroundElement');\n};\n\n\n/**\n * Gets the opacity of the background mask.\n * @return {number} Background mask opacity.\n */\ngoog.ui.Dialog.prototype.getBackgroundElementOpacity = function() {\n  return this.backgroundElementOpacity_;\n};\n\n\n/**\n * Sets the opacity of the background mask.\n * @param {number} opacity Background mask opacity.\n */\ngoog.ui.Dialog.prototype.setBackgroundElementOpacity = function(opacity) {\n  this.backgroundElementOpacity_ = opacity;\n\n  if (this.getElement()) {\n    var bgEl = this.getBackgroundElement();\n    if (bgEl) {\n      goog.style.setOpacity(bgEl, this.backgroundElementOpacity_);\n    }\n  }\n};\n\n\n/**\n * Sets the modal property of the dialog. In case the dialog is already\n * inDocument, renders the modal background elements according to the specified\n * modal parameter.\n *\n * Note that non-modal dialogs cannot use an iframe mask.\n *\n * @param {boolean} modal Whether the dialog is modal.\n */\ngoog.ui.Dialog.prototype.setModal = function(modal) {\n  if (modal != this.modal_) {\n    this.setModalInternal_(modal);\n  }\n};\n\n\n/**\n * Sets the modal property of the dialog.\n * @param {boolean} modal Whether the dialog is modal.\n * @private\n */\ngoog.ui.Dialog.prototype.setModalInternal_ = function(modal) {\n  this.modal_ = modal;\n  if (this.isInDocument()) {\n    var dom = this.getDomHelper();\n    var bg = this.getBackgroundElement();\n    var bgIframe = this.getBackgroundIframe();\n    if (modal) {\n      if (bgIframe) {\n        dom.insertSiblingBefore(bgIframe, this.getElement());\n      }\n      dom.insertSiblingBefore(bg, this.getElement());\n    } else {\n      dom.removeNode(bgIframe);\n      dom.removeNode(bg);\n    }\n  }\n  if (this.isVisible()) {\n    this.setA11YDetectBackground(modal);\n  }\n};\n\n\n/**\n * @return {boolean} modal Whether the dialog is modal.\n */\ngoog.ui.Dialog.prototype.getModal = function() {\n  return this.modal_;\n};\n\n\n/**\n * @return {string} The CSS class name for the dialog element.\n */\ngoog.ui.Dialog.prototype.getClass = function() {\n  return this.getCssClass();\n};\n\n\n/**\n * Sets whether the dialog can be dragged.\n * @param {boolean} draggable Whether the dialog can be dragged.\n */\ngoog.ui.Dialog.prototype.setDraggable = function(draggable) {\n  this.draggable_ = draggable;\n  this.setDraggingEnabled_(draggable && this.isInDocument());\n};\n\n\n/**\n * Returns a dragger for moving the dialog and adds a class for the move cursor.\n * Defaults to allow dragging of the title only, but can be overridden if\n * different drag targets or dragging behavior is desired.\n * @return {!goog.fx.Dragger} The created dragger instance.\n * @protected\n */\ngoog.ui.Dialog.prototype.createDragger = function() {\n  return new goog.fx.Dragger(this.getElement(), this.titleEl_);\n};\n\n\n/**\n * @return {boolean} Whether the dialog is draggable.\n */\ngoog.ui.Dialog.prototype.getDraggable = function() {\n  return this.draggable_;\n};\n\n\n/**\n * Enables or disables dragging.\n * @param {boolean} enabled Whether to enable it.\n * @private\n */\ngoog.ui.Dialog.prototype.setDraggingEnabled_ = function(enabled) {\n  // This isn't ideal, but the quickest and easiest way to append\n  // title-draggable to the last class in the class_ string, then trim and\n  // split the string into an array (in case the dialog was set up with\n  // multiple, space-separated class names).\n  var classNames =\n      goog.string.trim(goog.getCssName(this.class_, 'title-draggable'))\n          .split(' ');\n\n  if (this.getElement()) {\n    if (enabled) {\n      goog.dom.classlist.addAll(goog.asserts.assert(this.titleEl_), classNames);\n    } else {\n      goog.dom.classlist.removeAll(\n          goog.asserts.assert(this.titleEl_), classNames);\n    }\n  }\n\n  if (enabled && !this.dragger_) {\n    this.dragger_ = this.createDragger();\n    goog.dom.classlist.addAll(goog.asserts.assert(this.titleEl_), classNames);\n    goog.events.listen(\n        this.dragger_, goog.fx.Dragger.EventType.START, this.setDraggerLimits_,\n        false, this);\n  } else if (!enabled && this.dragger_) {\n    this.dragger_.dispose();\n    this.dragger_ = null;\n  }\n};\n\n\n/** @override */\ngoog.ui.Dialog.prototype.createDom = function() {\n  goog.ui.Dialog.base(this, 'createDom');\n  var element = this.getElement();\n  goog.asserts.assert(element, 'getElement() returns null');\n\n  var dom = this.getDomHelper();\n  this.titleEl_ = dom.createDom(\n      goog.dom.TagName.DIV, goog.getCssName(this.class_, 'title'),\n      this.titleTextEl_ = dom.createDom(\n          goog.dom.TagName.SPAN, {\n            'className': goog.getCssName(this.class_, 'title-text'),\n            'id': this.getId()\n          },\n          this.title_),\n      this.titleCloseEl_ = dom.createDom(\n          goog.dom.TagName.SPAN, goog.getCssName(this.class_, 'title-close'))),\n  goog.dom.append(\n      element, this.titleEl_,\n      this.contentEl_ = dom.createDom(\n          goog.dom.TagName.DIV, goog.getCssName(this.class_, 'content')),\n      this.buttonEl_ = dom.createDom(\n          goog.dom.TagName.DIV, goog.getCssName(this.class_, 'buttons')));\n\n  // Make the title and close button behave correctly with screen readers.\n  // Note: this is only being added if the dialog is not decorated. Decorators\n  // are expected to add aria label, role, and tab indexing in their templates.\n  goog.a11y.aria.setRole(this.titleTextEl_, goog.a11y.aria.Role.HEADING);\n  goog.a11y.aria.setRole(this.titleCloseEl_, goog.a11y.aria.Role.BUTTON);\n  goog.dom.setFocusableTabIndex(this.titleCloseEl_, true);\n  goog.a11y.aria.setLabel(\n      this.titleCloseEl_, goog.ui.Dialog.MSG_GOOG_UI_DIALOG_CLOSE_);\n\n  this.titleTextId_ = this.titleTextEl_.id;\n  goog.a11y.aria.setRole(element, this.getPreferredAriaRole());\n  goog.a11y.aria.setState(\n      element, goog.a11y.aria.State.LABELLEDBY, this.titleTextId_ || '');\n  // If setContent() was called before createDom(), make sure the inner HTML of\n  // the content element is initialized.\n  if (this.content_) {\n    goog.dom.safe.setInnerHtml(this.contentEl_, this.content_);\n  }\n  goog.style.setElementShown(this.titleCloseEl_, this.hasTitleCloseButton_);\n\n  // Render the buttons.\n  if (this.buttons_) {\n    this.buttons_.attachToElement(this.buttonEl_);\n  }\n  goog.style.setElementShown(this.buttonEl_, !!this.buttons_);\n  this.setBackgroundElementOpacity(this.backgroundElementOpacity_);\n};\n\n\n/** @override */\ngoog.ui.Dialog.prototype.decorateInternal = function(element) {\n  goog.ui.Dialog.base(this, 'decorateInternal', element);\n  var dialogElement = this.getElement();\n  goog.asserts.assert(\n      dialogElement, 'The DOM element for dialog cannot be null.');\n  // Decorate or create the content element.\n  var contentClass = goog.getCssName(this.class_, 'content');\n  this.contentEl_ = goog.dom.getElementsByTagNameAndClass(\n      null, contentClass, dialogElement)[0];\n  if (!this.contentEl_) {\n    this.contentEl_ =\n        this.getDomHelper().createDom(goog.dom.TagName.DIV, contentClass);\n    if (this.content_) {\n      goog.dom.safe.setInnerHtml(this.contentEl_, this.content_);\n    }\n    dialogElement.appendChild(this.contentEl_);\n  }\n\n  // Decorate or create the title bar element.\n  var titleClass = goog.getCssName(this.class_, 'title');\n  var titleTextClass = goog.getCssName(this.class_, 'title-text');\n  var titleCloseClass = goog.getCssName(this.class_, 'title-close');\n  this.titleEl_ =\n      goog.dom.getElementsByTagNameAndClass(null, titleClass, dialogElement)[0];\n  if (this.titleEl_) {\n    // Only look for title text & title close elements if a title bar element\n    // was found.  Otherwise assume that the entire title bar has to be\n    // created from scratch.\n    this.titleTextEl_ = goog.dom.getElementsByTagNameAndClass(\n        null, titleTextClass, this.titleEl_)[0];\n    this.titleCloseEl_ = goog.dom.getElementsByTagNameAndClass(\n        null, titleCloseClass, this.titleEl_)[0];\n  } else {\n    // Create the title bar element and insert it before the content area.\n    // This is useful if the element to decorate only includes a content area.\n    this.titleEl_ =\n        this.getDomHelper().createDom(goog.dom.TagName.DIV, titleClass);\n    dialogElement.insertBefore(this.titleEl_, this.contentEl_);\n  }\n\n  // Decorate or create the title text element.\n  if (this.titleTextEl_) {\n    this.title_ = goog.dom.getTextContent(this.titleTextEl_);\n    // Give the title text element an id if it doesn't already have one.\n    if (!this.titleTextEl_.id) {\n      this.titleTextEl_.id = this.getId();\n    }\n  } else {\n    this.titleTextEl_ = goog.dom.createDom(\n        goog.dom.TagName.SPAN,\n        {'className': titleTextClass, 'id': this.getId()});\n    this.titleEl_.appendChild(this.titleTextEl_);\n  }\n  this.titleTextId_ = this.titleTextEl_.id;\n  goog.a11y.aria.setState(\n      dialogElement, goog.a11y.aria.State.LABELLEDBY, this.titleTextId_ || '');\n  // Decorate or create the title close element.\n  if (!this.titleCloseEl_) {\n    this.titleCloseEl_ =\n        this.getDomHelper().createDom(goog.dom.TagName.SPAN, titleCloseClass);\n    this.titleEl_.appendChild(this.titleCloseEl_);\n  }\n  goog.style.setElementShown(this.titleCloseEl_, this.hasTitleCloseButton_);\n\n  // Decorate or create the button container element.\n  var buttonsClass = goog.getCssName(this.class_, 'buttons');\n  this.buttonEl_ = goog.dom.getElementsByTagNameAndClass(\n      null, buttonsClass, dialogElement)[0];\n  if (this.buttonEl_) {\n    // Button container element found.  Create empty button set and use it to\n    // decorate the button container.\n    this.buttons_ = new goog.ui.Dialog.ButtonSet(this.getDomHelper());\n    this.buttons_.decorate(this.buttonEl_);\n  } else {\n    // Create new button container element, and render a button set into it.\n    this.buttonEl_ =\n        this.getDomHelper().createDom(goog.dom.TagName.DIV, buttonsClass);\n    dialogElement.appendChild(this.buttonEl_);\n    if (this.buttons_) {\n      this.buttons_.attachToElement(this.buttonEl_);\n    }\n    goog.style.setElementShown(this.buttonEl_, !!this.buttons_);\n  }\n  this.setBackgroundElementOpacity(this.backgroundElementOpacity_);\n};\n\n\n/** @override */\ngoog.ui.Dialog.prototype.enterDocument = function() {\n  goog.ui.Dialog.base(this, 'enterDocument');\n\n  // Listen for keyboard events while the dialog is visible.\n  this.getHandler()\n      .listen(this.getElement(), goog.events.EventType.KEYDOWN, this.onKey_)\n      .listen(this.getElement(), goog.events.EventType.KEYPRESS, this.onKey_);\n\n  // NOTE: see bug 1163154 for an example of an edge case where making the\n  // dialog visible in response to a KEYDOWN will result in a CLICK event\n  // firing on the default button (immediately closing the dialog) if the key\n  // that fired the KEYDOWN is also normally used to activate controls\n  // (i.e. SPACE/ENTER).\n  //\n  // This could be worked around by attaching the onButtonClick_ handler in a\n  // setTimeout, but that was deemed undesirable.\n  this.getHandler().listen(\n      this.buttonEl_, goog.events.EventType.CLICK, this.onButtonClick_);\n\n  // Add drag support.\n  this.setDraggingEnabled_(this.draggable_);\n\n  // Add event listeners to the close box and the button container.\n  this.getHandler().listen(\n      this.titleCloseEl_, goog.events.EventType.CLICK, this.onTitleCloseClick_);\n\n  var element = this.getElement();\n  goog.asserts.assert(element, 'The DOM element for dialog cannot be null');\n  goog.a11y.aria.setRole(element, this.getPreferredAriaRole());\n  if (this.titleTextEl_.id !== '') {\n    goog.a11y.aria.setState(\n        element, goog.a11y.aria.State.LABELLEDBY, this.titleTextEl_.id);\n  }\n\n  if (!this.modal_) {\n    this.setModalInternal_(false);\n  }\n};\n\n\n/** @override */\ngoog.ui.Dialog.prototype.exitDocument = function() {\n  if (this.isVisible()) {\n    this.setVisible(false);\n  }\n\n  // Remove drag support.\n  this.setDraggingEnabled_(false);\n\n  goog.ui.Dialog.base(this, 'exitDocument');\n};\n\n\n/**\n * Sets the visibility of the dialog box and moves focus to the\n * default button. Lazily renders the component if needed. After this\n * method returns, isVisible() will always return the new state, even\n * if there is a transition.\n * @param {boolean} visible Whether the dialog should be visible.\n * @override\n */\ngoog.ui.Dialog.prototype.setVisible = function(visible) {\n  if (visible == this.isVisible()) {\n    return;\n  }\n\n  // If the dialog hasn't been rendered yet, render it now.\n  if (!this.isInDocument()) {\n    this.render();\n  }\n\n  goog.ui.Dialog.base(this, 'setVisible', visible);\n};\n\n\n/**\n * @override\n * @suppress {deprecated} AFTER_SHOW is deprecated earlier in this file.\n */\ngoog.ui.Dialog.prototype.onShow = function() {\n  goog.ui.Dialog.base(this, 'onShow');\n  this.dispatchEvent(goog.ui.Dialog.EventType.AFTER_SHOW);\n};\n\n\n/**\n * @override\n * @suppress {deprecated} AFTER_HIDE is deprecated earlier in this file.\n */\ngoog.ui.Dialog.prototype.onHide = function() {\n  goog.ui.Dialog.base(this, 'onHide');\n  this.dispatchEvent(goog.ui.Dialog.EventType.AFTER_HIDE);\n  if (this.disposeOnHide_) {\n    this.dispose();\n  }\n};\n\n\n/**\n * Sets dragger limits when dragging is started.\n * @param {!goog.events.Event} e goog.fx.Dragger.EventType.START event.\n * @private\n */\ngoog.ui.Dialog.prototype.setDraggerLimits_ = function(e) {\n  var doc = this.getDomHelper().getDocument();\n  var win = goog.dom.getWindow(doc) || window;\n\n  // Take the max of scroll height and view height for cases in which document\n  // does not fill screen.\n  var viewSize = goog.dom.getViewportSize(win);\n  var w = Math.max(doc.body.scrollWidth, viewSize.width);\n  var h = Math.max(doc.body.scrollHeight, viewSize.height);\n\n  var dialogSize = goog.style.getSize(this.getElement());\n  if (goog.style.getComputedPosition(this.getElement()) == 'fixed') {\n    // Ensure position:fixed dialogs can't be dragged beyond the viewport.\n    this.dragger_.setLimits(\n        new goog.math.Rect(\n            0, 0, Math.max(0, viewSize.width - dialogSize.width),\n            Math.max(0, viewSize.height - dialogSize.height)));\n  } else {\n    this.dragger_.setLimits(\n        new goog.math.Rect(0, 0, w - dialogSize.width, h - dialogSize.height));\n  }\n};\n\n\n/**\n * Handles a click on the title close area.\n * @param {goog.events.BrowserEvent} e Browser's event object.\n * @private\n */\ngoog.ui.Dialog.prototype.onTitleCloseClick_ = function(e) {\n  this.handleTitleClose_();\n};\n\n\n/**\n * Performs the action of closing the dialog in response to the title close\n * button being interacted with. General purpose method to be called by click\n * and button event handlers.\n * @private\n */\ngoog.ui.Dialog.prototype.handleTitleClose_ = function() {\n  if (!this.hasTitleCloseButton_) {\n    return;\n  }\n\n  var bs = this.getButtonSet();\n  var key = bs && bs.getCancel();\n  // Only if there is a valid cancel button is an event dispatched.\n  if (key) {\n    var caption = /** @type {Element|string} */ (bs.get(key));\n    if (this.dispatchEvent(new goog.ui.Dialog.Event(key, caption))) {\n      this.setVisible(false);\n    }\n  } else {\n    this.setVisible(false);\n  }\n};\n\n\n/**\n * @return {boolean} Whether this dialog has a title close button.\n */\ngoog.ui.Dialog.prototype.getHasTitleCloseButton = function() {\n  return this.hasTitleCloseButton_;\n};\n\n\n/**\n * Sets whether the dialog should have a close button in the title bar. There\n * will always be an element for the title close button, but setting this\n * parameter to false will cause it to be hidden and have no active listener.\n * @param {boolean} b Whether this dialog should have a title close button.\n */\ngoog.ui.Dialog.prototype.setHasTitleCloseButton = function(b) {\n  this.hasTitleCloseButton_ = b;\n  if (this.titleCloseEl_) {\n    goog.style.setElementShown(this.titleCloseEl_, this.hasTitleCloseButton_);\n  }\n};\n\n\n/**\n * @return {boolean} Whether the escape key should close this dialog.\n */\ngoog.ui.Dialog.prototype.isEscapeToCancel = function() {\n  return this.escapeToCancel_;\n};\n\n\n/**\n * @param {boolean} b Whether the escape key should close this dialog.\n */\ngoog.ui.Dialog.prototype.setEscapeToCancel = function(b) {\n  this.escapeToCancel_ = b;\n};\n\n\n/**\n * Sets whether the dialog should be disposed when it is hidden.  By default\n * dialogs are not disposed when they are hidden.\n * @param {boolean} b Whether the dialog should get disposed when it gets\n *     hidden.\n */\ngoog.ui.Dialog.prototype.setDisposeOnHide = function(b) {\n  this.disposeOnHide_ = b;\n};\n\n\n/**\n * @return {boolean} Whether the dialog should be disposed when it is hidden.\n */\ngoog.ui.Dialog.prototype.getDisposeOnHide = function() {\n  return this.disposeOnHide_;\n};\n\n\n/** @override */\ngoog.ui.Dialog.prototype.disposeInternal = function() {\n  this.titleCloseEl_ = null;\n  this.buttonEl_ = null;\n  goog.ui.Dialog.base(this, 'disposeInternal');\n};\n\n\n/**\n * Sets the button set to use.\n * Note: Passing in null will cause no button set to be rendered.\n * @param {goog.ui.Dialog.ButtonSet?} buttons The button set to use.\n */\ngoog.ui.Dialog.prototype.setButtonSet = function(buttons) {\n  this.buttons_ = buttons;\n  if (this.buttonEl_) {\n    if (this.buttons_) {\n      this.buttons_.attachToElement(this.buttonEl_);\n    } else {\n      goog.dom.safe.setInnerHtml(this.buttonEl_, goog.html.SafeHtml.EMPTY);\n    }\n    goog.style.setElementShown(this.buttonEl_, !!this.buttons_);\n  }\n};\n\n\n/**\n * Returns the button set being used.\n * @return {goog.ui.Dialog.ButtonSet?} The button set being used.\n */\ngoog.ui.Dialog.prototype.getButtonSet = function() {\n  return this.buttons_;\n};\n\n\n/**\n * Handles a click on the button container.\n * @param {goog.events.BrowserEvent} e Browser's event object.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Dialog.prototype.onButtonClick_ = function(e) {\n  var button = this.findParentButton_(/** @type {Element} */ (e.target));\n  if (button && !button.disabled) {\n    var key = button.name;\n    var caption = /** @type {Element|string} */ (this.getButtonSet().get(key));\n    if (this.dispatchEvent(new goog.ui.Dialog.Event(key, caption))) {\n      this.setVisible(false);\n    }\n  }\n};\n\n\n/**\n * Finds the parent button of an element (or null if there was no button\n * parent).\n * @param {Element} element The element that was clicked on.\n * @return {Element} Returns the parent button or null if not found.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Dialog.prototype.findParentButton_ = function(element) {\n  var el = element;\n  while (el != null && el != this.buttonEl_) {\n    if (el.tagName == goog.dom.TagName.BUTTON) {\n      return /** @type {Element} */ (el);\n    }\n    el = el.parentNode;\n  }\n  return null;\n};\n\n\n/**\n * Handles keydown and keypress events, and dismisses the popup if cancel is\n * pressed.  If there is a cancel action in the ButtonSet, than that will be\n * fired.  Also prevents tabbing out of the dialog.\n * @param {goog.events.BrowserEvent} e Browser's event object.\n * @private\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Dialog.prototype.onKey_ = function(e) {\n  var close = false;\n  var hasHandler = false;\n  var buttonSet = this.getButtonSet();\n  var target = e.target;\n\n  if (e.type == goog.events.EventType.KEYDOWN) {\n    // Escape and tab can only properly be handled in keydown handlers.\n    if (this.escapeToCancel_ && e.keyCode == goog.events.KeyCodes.ESC) {\n      // Only if there is a valid cancel button is an event dispatched.\n      var cancel = buttonSet && buttonSet.getCancel();\n\n      // Users may expect to hit escape on a SELECT element.\n      var isSpecialFormElement =\n          target.tagName == goog.dom.TagName.SELECT && !target.disabled;\n\n      if (cancel && !isSpecialFormElement) {\n        hasHandler = true;\n\n        var caption = buttonSet.get(cancel);\n        close = this.dispatchEvent(\n            new goog.ui.Dialog.Event(\n                cancel,\n                /** @type {Element|null|string} */ (caption)));\n      } else if (!isSpecialFormElement) {\n        close = true;\n      }\n    } else if (\n        e.keyCode == goog.events.KeyCodes.TAB && e.shiftKey &&\n        target == this.getElement()) {\n      // Prevent the user from shift-tabbing backwards out of the dialog box.\n      // Instead, set up a wrap in focus backward to the end of the dialog.\n      this.setupBackwardTabWrap();\n    }\n  } else if (e.keyCode == goog.events.KeyCodes.ENTER) {\n    // Only handle ENTER in keypress events, in case the action opens a\n    // popup window.\n    var key;\n    if (target.tagName == goog.dom.TagName.BUTTON && !target.disabled) {\n      // If the target is a button and it's enabled, we can fire that button's\n      // handler.\n      key = target.name;\n    } else if (target == this.titleCloseEl_) {\n      // if the title 'close' button is in focus, close the dialog\n      this.handleTitleClose_();\n    } else if (buttonSet) {\n      // Try to fire the default button's handler (if one exists), but only if\n      // the button is enabled.\n      var defaultKey = buttonSet.getDefault();\n      var defaultButton = defaultKey && buttonSet.getButton(defaultKey);\n\n      // Users may expect to hit enter on a TEXTAREA, SELECT or an A element.\n      var isSpecialFormElement = (target.tagName == goog.dom.TagName.TEXTAREA ||\n                                  target.tagName == goog.dom.TagName.SELECT ||\n                                  target.tagName == goog.dom.TagName.A) &&\n          !target.disabled;\n\n      if (defaultButton && !defaultButton.disabled && !isSpecialFormElement) {\n        key = defaultKey;\n      }\n    }\n    if (key && buttonSet) {\n      hasHandler = true;\n      close = this.dispatchEvent(\n          new goog.ui.Dialog.Event(key, String(buttonSet.get(key))));\n    }\n  } else if (\n      target == this.titleCloseEl_ &&\n      (e.keyCode == goog.events.KeyCodes.SPACE ||\n       e.key == goog.events.Keys.SPACE)) {\n    // if the title 'close' button is in focus on 'SPACE,' close the dialog\n    this.handleTitleClose_();\n  }\n\n  if (close || hasHandler) {\n    e.stopPropagation();\n    e.preventDefault();\n  }\n\n  if (close) {\n    this.setVisible(false);\n  }\n};\n\n\n\n/**\n * Dialog event class.\n * @param {string} key Key identifier for the button.\n * @param {string|Element} caption Caption on the button (might be i18nlized).\n * @constructor\n * @extends {goog.events.Event}\n */\ngoog.ui.Dialog.Event = function(key, caption) {\n  /** @const {!goog.ui.Dialog.EventType} */\n  this.type = goog.ui.Dialog.EventType.SELECT;\n  /** @const */\n  this.key = key;\n  /** @const */\n  this.caption = caption;\n};\ngoog.inherits(goog.ui.Dialog.Event, goog.events.Event);\n\n\n/**\n * Event type constant for dialog events.\n * TODO(attila): Change this to goog.ui.Dialog.EventType.SELECT.\n * @type {string}\n * @deprecated Use goog.ui.Dialog.EventType.SELECT.\n */\ngoog.ui.Dialog.SELECT_EVENT = 'dialogselect';\n\n\n/**\n * Events dispatched by dialogs.\n * @enum {string}\n */\ngoog.ui.Dialog.EventType = {\n  /**\n   * Dispatched when the user closes the dialog.\n   * The dispatched event will always be of type {@link goog.ui.Dialog.Event}.\n   * Canceling the event will prevent the dialog from closing.\n   */\n  SELECT: 'dialogselect',\n\n  /**\n   * Dispatched after the dialog is closed. Not cancelable.\n   * @deprecated Use goog.ui.PopupBase.EventType.HIDE.\n   */\n  AFTER_HIDE: 'afterhide',\n\n  /**\n   * Dispatched after the dialog is shown. Not cancelable.\n   * @deprecated Use goog.ui.PopupBase.EventType.SHOW.\n   */\n  AFTER_SHOW: 'aftershow'\n};\n\n\n\n/**\n * A button set defines the behaviour of a set of buttons that the dialog can\n * show.  Uses the {@link goog.structs.Map} interface.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper; see {@link\n *    goog.ui.Component} for semantics.\n * @constructor\n * @extends {goog.structs.Map}\n * @suppress {deprecated} Underlying extended goog.structs.Map is deprecated but\n *    this class is not. Suppress warnings until refactored.\n */\ngoog.ui.Dialog.ButtonSet = function(opt_domHelper) {\n  // TODO(attila):  Refactor ButtonSet to extend goog.ui.Component?\n  this.dom_ = opt_domHelper || goog.dom.getDomHelper();\n  goog.structs.Map.call(this);\n};\ngoog.inherits(goog.ui.Dialog.ButtonSet, goog.structs.Map);\ngoog.tagUnsealableClass(goog.ui.Dialog.ButtonSet);\n\n\n/**\n * A CSS className for this component.\n * @type {string}\n * @private\n */\ngoog.ui.Dialog.ButtonSet.prototype.class_ = goog.getCssName('goog-buttonset');\n\n\n/**\n * The button that has default focus (references key in buttons_ map).\n * @type {?string}\n * @private\n */\ngoog.ui.Dialog.ButtonSet.prototype.defaultButton_ = null;\n\n\n/**\n * Optional container the button set should be rendered into.\n * @type {?Element}\n * @private\n */\ngoog.ui.Dialog.ButtonSet.prototype.element_ = null;\n\n\n/**\n * The button whose action is associated with the escape key and the X button\n * on the dialog.\n * @type {?string}\n * @private\n */\ngoog.ui.Dialog.ButtonSet.prototype.cancelButton_ = null;\n\n\n/** @override */\ngoog.ui.Dialog.ButtonSet.prototype.clear = function() {\n  goog.structs.Map.prototype.clear.call(this);\n  this.defaultButton_ = this.cancelButton_ = null;\n};\n\n\n/**\n * Adds a button to the button set.  Buttons will be displayed in the order they\n * are added.\n *\n * @param {*} key Key used to identify the button in events.\n * @param {*} caption A string caption or a DOM node that can be\n *     appended to a button element.\n * @param {boolean=} opt_isDefault Whether this button is the default button,\n *     Dialog will dispatch for this button if enter is pressed.\n * @param {boolean=} opt_isCancel Whether this button has the same behaviour as\n *    cancel.  If escape is pressed this button will fire.\n * @return {!goog.ui.Dialog.ButtonSet} The button set, to make it easy to chain\n *    \"set\" calls and build new ButtonSets.\n * @override\n */\ngoog.ui.Dialog.ButtonSet.prototype.set = function(\n    key, caption, opt_isDefault, opt_isCancel) {\n  goog.structs.Map.prototype.set.call(this, key, caption);\n\n  if (opt_isDefault) {\n    this.defaultButton_ = /** @type {?string} */ (key);\n  }\n  if (opt_isCancel) {\n    this.cancelButton_ = /** @type {?string} */ (key);\n  }\n\n  return this;\n};\n\n\n/**\n * Adds a button (an object with a key and caption) to this button set. Buttons\n * will be displayed in the order they are added.\n * @see goog.ui.Dialog.DefaultButtons\n * @param {{key: string, caption: string}} button The button key and caption.\n * @param {boolean=} opt_isDefault Whether this button is the default button.\n *     Dialog will dispatch for this button if enter is pressed.\n * @param {boolean=} opt_isCancel Whether this button has the same behavior as\n *     cancel. If escape is pressed this button will fire.\n * @return {!goog.ui.Dialog.ButtonSet} The button set, to make it easy to chain\n *     \"addButton\" calls and build new ButtonSets.\n */\ngoog.ui.Dialog.ButtonSet.prototype.addButton = function(\n    button, opt_isDefault, opt_isCancel) {\n  return this.set(button.key, button.caption, opt_isDefault, opt_isCancel);\n};\n\n\n/**\n * Attaches the button set to an element, rendering it inside.\n * @param {Element} el Container.\n */\ngoog.ui.Dialog.ButtonSet.prototype.attachToElement = function(el) {\n  this.element_ = el;\n  this.render();\n};\n\n\n/**\n * Renders the button set inside its container element.\n */\ngoog.ui.Dialog.ButtonSet.prototype.render = function() {\n  if (this.element_) {\n    goog.dom.safe.setInnerHtml(this.element_, goog.html.SafeHtml.EMPTY);\n    var domHelper = goog.dom.getDomHelper(this.element_);\n    this.forEach(function(caption, key) {\n      var button =\n          domHelper.createDom(goog.dom.TagName.BUTTON, {'name': key}, caption);\n      if (key == this.defaultButton_) {\n        button.className = goog.getCssName(this.class_, 'default');\n      }\n      this.element_.appendChild(button);\n    }, this);\n  }\n};\n\n\n/**\n * Decorates the given element by adding any `button` elements found\n * among its descendants to the button set.  The first button found is assumed\n * to be the default and will receive focus when the button set is rendered.\n * If a button with a name of {@link goog.ui.Dialog.DefaultButtonKeys.CANCEL}\n * is found, it is assumed to have \"Cancel\" semantics.\n * TODO(attila):  ButtonSet should be a goog.ui.Component.  Really.\n * @param {Element} element The element to decorate; should contain buttons.\n */\ngoog.ui.Dialog.ButtonSet.prototype.decorate = function(element) {\n  if (!element || element.nodeType != goog.dom.NodeType.ELEMENT) {\n    return;\n  }\n\n  this.element_ = element;\n  var buttons =\n      goog.dom.getElementsByTagName(goog.dom.TagName.BUTTON, this.element_);\n  for (var i = 0, button, key, caption; button = buttons[i]; i++) {\n    // Buttons should have a \"name\" attribute and have their caption defined by\n    // their innerHTML, but not everyone knows this, and we should play nice.\n    key = button.name || button.id;\n    caption = goog.dom.getTextContent(button) || button.value;\n    if (key) {\n      var isDefault = i == 0;\n      var isCancel = button.name == goog.ui.Dialog.DefaultButtonKeys.CANCEL;\n      this.set(key, caption, isDefault, isCancel);\n      if (isDefault) {\n        goog.dom.classlist.add(button, goog.getCssName(this.class_, 'default'));\n      }\n    }\n  }\n};\n\n\n/**\n * Gets the component's element.\n * @return {Element} The element for the component.\n * TODO(user): Remove after refactoring to goog.ui.Component.\n */\ngoog.ui.Dialog.ButtonSet.prototype.getElement = function() {\n  return this.element_;\n};\n\n\n/**\n * Returns the dom helper that is being used on this component.\n * @return {!goog.dom.DomHelper} The dom helper used on this component.\n * TODO(user): Remove after refactoring to goog.ui.Component.\n */\ngoog.ui.Dialog.ButtonSet.prototype.getDomHelper = function() {\n  return this.dom_;\n};\n\n\n/**\n * Sets the default button.\n * @param {?string} key The default button.\n */\ngoog.ui.Dialog.ButtonSet.prototype.setDefault = function(key) {\n  this.defaultButton_ = key;\n};\n\n\n/**\n * Returns the default button.\n * @return {?string} The default button.\n */\ngoog.ui.Dialog.ButtonSet.prototype.getDefault = function() {\n  return this.defaultButton_;\n};\n\n\n/**\n * Sets the cancel button.\n * @param {?string} key The cancel button.\n */\ngoog.ui.Dialog.ButtonSet.prototype.setCancel = function(key) {\n  this.cancelButton_ = key;\n};\n\n\n/**\n * Returns the cancel button.\n * @return {?string} The cancel button.\n */\ngoog.ui.Dialog.ButtonSet.prototype.getCancel = function() {\n  return this.cancelButton_;\n};\n\n\n/**\n * Returns the HTML Button element.\n * @param {string} key The button to return.\n * @return {Element} The button, if found else null.\n */\ngoog.ui.Dialog.ButtonSet.prototype.getButton = function(key) {\n  var buttons = this.getAllButtons();\n  for (var i = 0, nextButton; nextButton = buttons[i]; i++) {\n    if (nextButton.name == key || nextButton.id == key) {\n      return nextButton;\n    }\n  }\n  return null;\n};\n\n\n/**\n * Returns all the HTML Button elements in the button set container.\n * @return {!IArrayLike<!Element>} A live NodeList of the buttons.\n */\ngoog.ui.Dialog.ButtonSet.prototype.getAllButtons = function() {\n  return goog.dom.getElementsByTagName(\n      goog.dom.TagName.BUTTON, goog.asserts.assert(this.element_));\n};\n\n\n/**\n * Enables or disables a button in this set by key. If the button is not found,\n * does nothing.\n * @param {string} key The button to enable or disable.\n * @param {boolean} enabled True to enable; false to disable.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Dialog.ButtonSet.prototype.setButtonEnabled = function(key, enabled) {\n  var button = this.getButton(key);\n  if (button) {\n    button.disabled = !enabled;\n  }\n};\n\n\n/**\n * Enables or disables all of the buttons in this set.\n * @param {boolean} enabled True to enable; false to disable.\n * @suppress {strictMissingProperties} Part of the go/strict_warnings_migration\n */\ngoog.ui.Dialog.ButtonSet.prototype.setAllButtonsEnabled = function(enabled) {\n  var allButtons = this.getAllButtons();\n  for (var i = 0, button; button = allButtons[i]; i++) {\n    button.disabled = !enabled;\n  }\n};\n\n\n/**\n * The keys used to identify standard buttons in events.\n * @enum {string}\n */\ngoog.ui.Dialog.DefaultButtonKeys = {\n  OK: 'ok',\n  CANCEL: 'cancel',\n  YES: 'yes',\n  NO: 'no',\n  SAVE: 'save',\n  CONTINUE: 'continue'\n};\n\n\n/**\n * @desc Standard caption for the dialog 'OK' button.\n * @private\n */\ngoog.ui.Dialog.MSG_DIALOG_OK_ = goog.getMsg('OK');\n\n\n/**\n * @desc Standard caption for the dialog 'Cancel' button.\n * @private\n */\ngoog.ui.Dialog.MSG_DIALOG_CANCEL_ = goog.getMsg('Cancel');\n\n\n/**\n * @desc Standard caption for the dialog 'Yes' button.\n * @private\n */\ngoog.ui.Dialog.MSG_DIALOG_YES_ = goog.getMsg('Yes');\n\n\n/**\n * @desc Standard caption for the dialog 'No' button.\n * @private\n */\ngoog.ui.Dialog.MSG_DIALOG_NO_ = goog.getMsg('No');\n\n\n/**\n * @desc Standard caption for the dialog 'Save' button.\n * @private\n */\ngoog.ui.Dialog.MSG_DIALOG_SAVE_ = goog.getMsg('Save');\n\n\n/**\n * @desc Standard caption for the dialog 'Continue' button.\n * @private\n */\ngoog.ui.Dialog.MSG_DIALOG_CONTINUE_ = goog.getMsg('Continue');\n\n\n/**\n * @desc Standard label for the dialog 'X' (close) button.\n * @private\n */\ngoog.ui.Dialog.MSG_GOOG_UI_DIALOG_CLOSE_ = goog.getMsg('Close');\n\n\n/**\n * The default captions for the default buttons.\n * @enum {string}\n */\ngoog.ui.Dialog.DefaultButtonCaptions = {\n  OK: goog.ui.Dialog.MSG_DIALOG_OK_,\n  CANCEL: goog.ui.Dialog.MSG_DIALOG_CANCEL_,\n  YES: goog.ui.Dialog.MSG_DIALOG_YES_,\n  NO: goog.ui.Dialog.MSG_DIALOG_NO_,\n  SAVE: goog.ui.Dialog.MSG_DIALOG_SAVE_,\n  CONTINUE: goog.ui.Dialog.MSG_DIALOG_CONTINUE_\n};\n\n\n/**\n * The standard buttons (keys associated with captions).\n * @enum {{key: string, caption: string}}\n */\ngoog.ui.Dialog.ButtonSet.DefaultButtons = {\n  OK: {\n    key: goog.ui.Dialog.DefaultButtonKeys.OK,\n    caption: goog.ui.Dialog.DefaultButtonCaptions.OK\n  },\n  CANCEL: {\n    key: goog.ui.Dialog.DefaultButtonKeys.CANCEL,\n    caption: goog.ui.Dialog.DefaultButtonCaptions.CANCEL\n  },\n  YES: {\n    key: goog.ui.Dialog.DefaultButtonKeys.YES,\n    caption: goog.ui.Dialog.DefaultButtonCaptions.YES\n  },\n  NO: {\n    key: goog.ui.Dialog.DefaultButtonKeys.NO,\n    caption: goog.ui.Dialog.DefaultButtonCaptions.NO\n  },\n  SAVE: {\n    key: goog.ui.Dialog.DefaultButtonKeys.SAVE,\n    caption: goog.ui.Dialog.DefaultButtonCaptions.SAVE\n  },\n  CONTINUE: {\n    key: goog.ui.Dialog.DefaultButtonKeys.CONTINUE,\n    caption: goog.ui.Dialog.DefaultButtonCaptions.CONTINUE\n  }\n};\n\n\n/**\n * Creates a new ButtonSet with a single 'OK' button, which is also set with\n * cancel button semantics so that pressing escape will close the dialog.\n * @return {!goog.ui.Dialog.ButtonSet} The created ButtonSet.\n */\ngoog.ui.Dialog.ButtonSet.createOk = function() {\n  return new goog.ui.Dialog.ButtonSet().addButton(\n      goog.ui.Dialog.ButtonSet.DefaultButtons.OK, true, true);\n};\n\n\n/**\n * Creates a new ButtonSet with 'OK' (default) and 'Cancel' buttons.\n * @return {!goog.ui.Dialog.ButtonSet} The created ButtonSet.\n */\ngoog.ui.Dialog.ButtonSet.createOkCancel = function() {\n  return new goog.ui.Dialog.ButtonSet()\n      .addButton(goog.ui.Dialog.ButtonSet.DefaultButtons.OK, true)\n      .addButton(goog.ui.Dialog.ButtonSet.DefaultButtons.CANCEL, false, true);\n};\n\n\n/**\n * Creates a new ButtonSet with 'Yes' (default) and 'No' buttons.\n * @return {!goog.ui.Dialog.ButtonSet} The created ButtonSet.\n */\ngoog.ui.Dialog.ButtonSet.createYesNo = function() {\n  return new goog.ui.Dialog.ButtonSet()\n      .addButton(goog.ui.Dialog.ButtonSet.DefaultButtons.YES, true)\n      .addButton(goog.ui.Dialog.ButtonSet.DefaultButtons.NO, false, true);\n};\n\n\n/**\n * Creates a new ButtonSet with 'Yes', 'No' (default), and 'Cancel' buttons.\n * @return {!goog.ui.Dialog.ButtonSet} The created ButtonSet.\n */\ngoog.ui.Dialog.ButtonSet.createYesNoCancel = function() {\n  return new goog.ui.Dialog.ButtonSet()\n      .addButton(goog.ui.Dialog.ButtonSet.DefaultButtons.YES)\n      .addButton(goog.ui.Dialog.ButtonSet.DefaultButtons.NO, true)\n      .addButton(goog.ui.Dialog.ButtonSet.DefaultButtons.CANCEL, false, true);\n};\n\n\n/**\n * Creates a new ButtonSet with 'Continue', 'Save', and 'Cancel' (default)\n * buttons.\n * @return {!goog.ui.Dialog.ButtonSet} The created ButtonSet.\n */\ngoog.ui.Dialog.ButtonSet.createContinueSaveCancel = function() {\n  return new goog.ui.Dialog.ButtonSet()\n      .addButton(goog.ui.Dialog.ButtonSet.DefaultButtons.CONTINUE)\n      .addButton(goog.ui.Dialog.ButtonSet.DefaultButtons.SAVE)\n      .addButton(goog.ui.Dialog.ButtonSet.DefaultButtons.CANCEL, true, true);\n};\n\n\n// TODO(user): These shared instances should be phased out.\n(function() {\n  if (typeof document != 'undefined') {\n    /** @deprecated Use goog.ui.Dialog.ButtonSet#createOk. */\n    goog.ui.Dialog.ButtonSet.OK = goog.ui.Dialog.ButtonSet.createOk();\n\n    /** @deprecated Use goog.ui.Dialog.ButtonSet#createOkCancel. */\n    goog.ui.Dialog.ButtonSet.OK_CANCEL =\n        goog.ui.Dialog.ButtonSet.createOkCancel();\n\n    /** @deprecated Use goog.ui.Dialog.ButtonSet#createYesNo. */\n    goog.ui.Dialog.ButtonSet.YES_NO = goog.ui.Dialog.ButtonSet.createYesNo();\n\n    /** @deprecated Use goog.ui.Dialog.ButtonSet#createYesNoCancel. */\n    goog.ui.Dialog.ButtonSet.YES_NO_CANCEL =\n        goog.ui.Dialog.ButtonSet.createYesNoCancel();\n\n    /** @deprecated Use goog.ui.Dialog.ButtonSet#createContinueSaveCancel. */\n    goog.ui.Dialog.ButtonSet.CONTINUE_SAVE_CANCEL =\n        goog.ui.Dialog.ButtonSet.createContinueSaveCancel();\n  }\n})();\n","^AK",1579837703000,"^AL",["^AM",["^BB","^BL","^BC","^BD","^BE","^BF","~$goog.structs.Map","~$goog.a11y.aria.Role","^AA","~$goog.fx.Dragger","^BU","~$goog.math.Rect","^D?","~$goog.a11y.aria.State","^BI","^CR","~$goog.events.Keys","~$goog.events.KeyCodes","^CS","^C<","^BJ","~$goog.ui.ModalPopup"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/dialog.js"],"^B6",["^AM",["~$goog.ui.Dialog.DefaultButtonCaptions","~$goog.ui.Dialog.ButtonSet.DefaultButtons","~$goog.ui.Dialog.EventType","~$goog.ui.Dialog","~$goog.ui.Dialog.ButtonSet","~$goog.ui.Dialog.Event","~$goog.ui.Dialog.DefaultButtonKeys"]],"^A?",true,"^A@",["^AA","^BE","^DC","^DF","^BB","^BL","^BD","^BJ","^BC","^D?","^CS","^CR","^BU","^DH","^DG","^DD","^C<","^DE","^BF","^DB","^BI","^DI"]],["^ ","^AC",[1579837703000],"^AD","goog.locale.genericfontnamesdata.js","^AE",["^AF","goog/locale/genericfontnamesdata.js"],"^AG","goog/locale/genericfontnamesdata.js","^AH","^AI","^AJ","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview List of generic font names and font fallbacks.\n * This file lists the font fallback for each font family for each locale or\n * script. In this map, each value is an array of pair. The pair is stored\n * as an array of two elements.\n *\n * First element of the pair is the generic name\n * for the font family in that locale. In case of script indexed entries,\n * It will be just font family name. Second element in the pair is a string\n * comma separated list of font names. API to access this data is provided\n * through goog.locale.genericFontNames.\n *\n * Warning: this file is automatically generated from CLDR.\n * Please contact i18n team or change the script and regenerate data.\n * Code location: http://go/generate_genericfontnames\n *\n */\n\n// clang-format off\n\n/**\n * Namespace for Generic Font Names\n */\ngoog.provide('goog.locale.genericFontNamesData');\n\n\n/**\n * Map from script code or language code to list of pairs of (generic name,\n * font name fallback list).\n * @const {!Object<string, !Object>}\n */\n\n/* ~!@# genmethods.genericFontNamesData() #@!~ */\ngoog.locale.genericFontNamesData = {\n  'Arab': [\n    [\n      'sans-serif',\n      'Arial,Al Bayan'\n    ],\n    [\n      'serif',\n      'Arabic Typesetting,Times New Roman'\n    ]\n  ],\n  'Armn': [[\n    'serif',\n    'Sylfaen,Mshtakan'\n  ]],\n  'Beng': [[\n    'sans-serif',\n    'Vrinda,Lohit Bengali'\n  ]],\n  'Cans': [[\n    'sans-serif',\n    'Euphemia,Euphemia UCAS'\n  ]],\n  'Cher': [[\n    'serif',\n    'Plantagenet,Plantagenet Cherokee'\n  ]],\n  'Deva': [\n    [\n      'sans-serif',\n      'Mangal,Lohit Hindi'\n    ],\n    [\n      'serif',\n      'Arial Unicode MS,Devanagari'\n    ]\n  ],\n  'Ethi': [[\n    'serif',\n    'Nyala'\n  ]],\n  'Geor': [[\n    'serif',\n    'Sylfaen'\n  ]],\n  'Gujr': [\n    [\n      'sans-serif',\n      'Shruti,Lohit Gujarati'\n    ],\n    [\n      'serif',\n      'Gujarati'\n    ]\n  ],\n  'Guru': [\n    [\n      'sans-serif',\n      'Raavi,Lohit Punjabi'\n    ],\n    [\n      'serif',\n      'Gurmukhi'\n    ]\n  ],\n  'Hebr': [\n    [\n      'sans-serif',\n      'Gisha,Aharoni,Arial Hebrew'\n    ],\n    [\n      'serif',\n      'David'\n    ],\n    [\n      'monospace',\n      'Miriam Fixed'\n    ]\n  ],\n  'Khmr': [\n    [\n      'sans-serif',\n      'MoolBoran,Khmer OS'\n    ],\n    [\n      'serif',\n      'DaunPenh'\n    ]\n  ],\n  'Knda': [\n    [\n      'sans-serif',\n      'Tunga'\n    ],\n    [\n      'serif',\n      'Kedage'\n    ]\n  ],\n  'Laoo': [[\n    'sans-serif',\n    'DokChampa,Phetsarath OT'\n  ]],\n  'Mlym': [\n    [\n      'sans-serif',\n      'AnjaliOldLipi,Kartika'\n    ],\n    [\n      'serif',\n      'Rachana'\n    ]\n  ],\n  'Mong': [[\n    'serif',\n    'Mongolian Baiti'\n  ]],\n  'Nkoo': [[\n    'serif',\n    'Conakry'\n  ]],\n  'Orya': [[\n    'sans-serif',\n    'Kalinga,utkal'\n  ]],\n  'Sinh': [[\n    'serif',\n    'Iskoola Pota,Malithi Web'\n  ]],\n  'Syrc': [[\n    'sans-serif',\n    'Estrangelo Edessa'\n  ]],\n  'Taml': [\n    [\n      'sans-serif',\n      'Latha,Lohit Tamil'\n    ],\n    [\n      'serif',\n      'Inai Mathi'\n    ]\n  ],\n  'Telu': [\n    [\n      'sans-serif',\n      'Gautami'\n    ],\n    [\n      'serif',\n      'Pothana'\n    ]\n  ],\n  'Thaa': [[\n    'sans-serif',\n    'MV Boli'\n  ]],\n  'Thai': [\n    [\n      'sans-serif',\n      'Tahoma,Thonburi'\n    ],\n    [\n      'monospace',\n      'Tahoma,Ayuthaya'\n    ]\n  ],\n  'Tibt': [[\n    'serif',\n    'Microsoft Himalaya'\n  ]],\n  'Yiii': [[\n    'sans-serif',\n    'Microsoft Yi Baiti'\n  ]],\n  'Zsym': [[\n    'sans-serif',\n    'Apple Symbols'\n  ]],\n  'jp': [\n    [\n      '\\uff30\\u30b4\\u30b7\\u30c3\\u30af',\n      'MS PGothic,\\uff2d\\uff33 \\uff30\\u30b4\\u30b7\\u30c3\\u30af,Hiragino Kaku G' +\n     'othic Pro,\\u30d2\\u30e9\\u30ae\\u30ce\\u89d2\\u30b4 Pro W3,Sazanami Gothic' +\n     ',\\u3055\\u3056\\u306a\\u307f\\u30b4\\u30b7\\u30c3\\u30af,sans-serif'\n    ],\n    [\n      '\\u30e1\\u30a4\\u30ea\\u30aa',\n      'Meiryo,\\u30e1\\u30a4\\u30ea\\u30aa,sans-serif'\n    ],\n    [\n      '\\uff30\\u660e\\u671d',\n      'MS PMincho,\\uff2d\\uff33 \\uff30\\u660e\\u671d,Hiragino Mincho Pro,\\u30d2' +\n     '\\u30e9\\u30ae\\u30ce\\u660e\\u671d Pro W3,Sazanami Mincho,\\u3055\\u3056' +\n     '\\u306a\\u307f\\u660e\\u671d,serif'\n    ],\n    [\n      '\\u7b49\\u5e45',\n      'MS Gothic,\\uff2d\\uff33 \\u30b4\\u30b7\\u30c3\\u30af,Osaka-Mono,Osaka\\uff0d' +\n     '\\u7b49\\u5e45,monospace'\n    ]\n  ],\n  'ko': [\n    [\n      '\\uace0\\ub515',\n      'Gulim,\\uad74\\ub9bc,AppleGothic,\\uc560\\ud50c\\uace0\\ub515,UnDotum,\\uc740' +\n     ' \\ub3cb\\uc6c0,Baekmuk Gulim,\\ubc31\\ubb35 \\uad74\\ub9bc,sans-serif'\n    ],\n    [\n      '\\ub9d1\\uc740\\uace0\\ub515',\n      'Malgun Gothic,\\ub9d1\\uc740\\uace0\\ub515,sans-serif'\n    ],\n    [\n      '\\ubc14\\ud0d5',\n      'Batang,\\ubc14\\ud0d5,AppleMyungjo,\\uc560\\ud50c\\uba85\\uc870,UnBatang,' +\n     '\\uc740 \\ubc14\\ud0d5,Baekmuk Batang,\\ubc31\\ubb35 \\ubc14\\ud0d5,serif'\n    ],\n    [\n      '\\uad81\\uc11c',\n      'Gungseo,\\uad81\\uc11c,serif'\n    ],\n    [\n      '\\uace0\\uc815\\ud3ed',\n      'GulimChe,\\uad74\\ub9bc\\uccb4,AppleGothic,\\uc560\\ud50c\\uace0\\ub515,monos' +\n     'pace'\n    ]\n  ],\n  'root': [\n    [\n      'sans-serif',\n      'FreeSans'\n    ],\n    [\n      'serif',\n      'FreeSerif'\n    ],\n    [\n      'monospace',\n      'FreeMono'\n    ]\n  ],\n  'transpose': {\n    'zh': {\n      'zh_Hant': {\n        '\\u5b8b\\u4f53': '\\u65b0\\u7d30\\u660e\\u9ad4',\n        '\\u9ed1\\u4f53': '\\u5fae\\u8edf\\u6b63\\u9ed1\\u9ad4'\n      }\n    }\n  },\n  'ug': [[\n    'serif',\n    'Microsoft Uighur'\n  ]],\n  'zh': [\n    [\n      '\\u9ed1\\u4f53',\n      'Microsoft JhengHei,\\u5fae\\u8edf\\u6b63\\u9ed1\\u9ad4,SimHei,\\u9ed1\\u4f53,' +\n     'MS Hei,STHeiti,\\u534e\\u6587\\u9ed1\\u4f53,Apple LiGothic Medium,\\u860b' +\n     '\\u679c\\u5137\\u4e2d\\u9ed1,LiHei Pro Medium,\\u5137\\u9ed1 Pro,STHeiti Li' +\n     'ght,\\u534e\\u6587\\u7ec6\\u9ed1,AR PL ZenKai Uni,\\u6587\\u9f0ePL\\u4e2d' +\n     '\\u6977Uni,sans-serif'\n    ],\n    [\n      '\\u5fae\\u8f6f\\u96c5\\u9ed1\\u5b57\\u4f53',\n      'Microsoft YaHei,\\u5fae\\u8f6f\\u96c5\\u9ed1\\u5b57\\u4f53,sans-serif'\n    ],\n    [\n      '\\u5b8b\\u4f53',\n      'SimSun,\\u5b8b\\u4f53,MS Song,STSong,\\u534e\\u6587\\u5b8b\\u4f53,Apple LiSu' +\n     'ng Light,\\u860b\\u679c\\u5137\\u7d30\\u5b8b,LiSong Pro Light,\\u5137\\u5b8b' +\n     ' Pro,STFangSong,\\u534e\\u6587\\u4eff\\u5b8b,AR PL ShanHeiSun Uni,\\u6587' +\n     '\\u9f0ePL\\u7ec6\\u4e0a\\u6d77\\u5b8bUni,AR PL New Sung,\\u6587\\u9f0e PL ' +\n     '\\u65b0\\u5b8b,serif'\n    ],\n    [\n      '\\u7d30\\u660e\\u9ad4',\n      'NSimsun,\\u65b0\\u5b8b\\u4f53,monospace'\n    ]\n  ]\n};\n/* ~!@# END #@!~ */\n","^AK",1579837703000,"^AL",["^AM",["^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/locale/genericfontnamesdata.js"],"^B6",["^AM",["~$goog.locale.genericFontNamesData"]],"^A?",true,"^A@",["^AA"]],["^ ","^AC",[1579837703000],"^AD","goog.ui.buttonrenderer.js","^AE",["^AF","goog/ui/buttonrenderer.js"],"^AG","goog/ui/buttonrenderer.js","^AH","^AI","^AJ","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Default renderer for {@link goog.ui.Button}s.\n *\n * @author attila@google.com (Attila Bodis)\n */\n\ngoog.provide('goog.ui.ButtonRenderer');\n\ngoog.forwardDeclare('goog.ui.Button');\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.Role');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.asserts');\ngoog.require('goog.ui.ButtonSide');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.ControlRenderer');  // circular\n\n\n\n/**\n * Default renderer for {@link goog.ui.Button}s.  Extends the superclass with\n * the following button-specific API methods:\n * <ul>\n *   <li>`getValue` - returns the button element's value\n *   <li>`setValue` - updates the button element to reflect its new value\n *   <li>`getTooltip` - returns the button element's tooltip text\n *   <li>`setTooltip` - updates the button element's tooltip text\n *   <li>`setCollapsed` - removes one or both of the button element's\n *       borders\n * </ul>\n * For alternate renderers, see {@link goog.ui.NativeButtonRenderer},\n * {@link goog.ui.CustomButtonRenderer}, and {@link goog.ui.FlatButtonRenderer}.\n * @constructor\n * @extends {goog.ui.ControlRenderer}\n */\ngoog.ui.ButtonRenderer = function() {\n  goog.ui.ControlRenderer.call(this);\n};\ngoog.inherits(goog.ui.ButtonRenderer, goog.ui.ControlRenderer);\ngoog.addSingletonGetter(goog.ui.ButtonRenderer);\n\n\n/**\n * Default CSS class to be applied to the root element of components rendered\n * by this renderer.\n * @type {string}\n */\ngoog.ui.ButtonRenderer.CSS_CLASS = goog.getCssName('goog-button');\n\n\n/**\n * Returns the ARIA role to be applied to buttons.\n * @return {goog.a11y.aria.Role|undefined} ARIA role.\n * @override\n */\ngoog.ui.ButtonRenderer.prototype.getAriaRole = function() {\n  return goog.a11y.aria.Role.BUTTON;\n};\n\n\n/**\n * Updates the button's ARIA (accessibility) state if the button is being\n * treated as a checkbox. Also makes sure that attributes which aren't\n * supported by buttons aren't being added.\n * @param {Element} element Element whose ARIA state is to be updated.\n * @param {goog.ui.Component.State} state Component state being enabled or\n *     disabled.\n * @param {boolean} enable Whether the state is being enabled or disabled.\n * @protected\n * @override\n */\ngoog.ui.ButtonRenderer.prototype.updateAriaState = function(\n    element, state, enable) {\n  switch (state) {\n    // If button has CHECKED or SELECTED state, assign aria-pressed\n    case goog.ui.Component.State.SELECTED:\n    case goog.ui.Component.State.CHECKED:\n      goog.asserts.assert(element, 'The button DOM element cannot be null.');\n      goog.a11y.aria.setState(element, goog.a11y.aria.State.PRESSED, enable);\n      break;\n    default:\n    case goog.ui.Component.State.OPENED:\n    case goog.ui.Component.State.DISABLED:\n      goog.ui.ButtonRenderer.base(\n          this, 'updateAriaState', element, state, enable);\n      break;\n  }\n};\n\n\n/** @override */\ngoog.ui.ButtonRenderer.prototype.createDom = function(button) {\n  var element = goog.ui.ButtonRenderer.base(this, 'createDom', button);\n  this.setTooltip(element, button.getTooltip());\n\n  var value = button.getValue();\n  if (value) {\n    this.setValue(element, value);\n  }\n\n  // If this is a toggle button, set ARIA state\n  if (button.isSupportedState(goog.ui.Component.State.CHECKED)) {\n    this.updateAriaState(\n        element, goog.ui.Component.State.CHECKED, button.isChecked());\n  }\n\n  return element;\n};\n\n\n/** @override */\ngoog.ui.ButtonRenderer.prototype.decorate = function(button, element) {\n  // The superclass implementation takes care of common attributes; we only\n  // need to set the value and the tooltip.\n  element =\n      goog.ui.ButtonRenderer.superClass_.decorate.call(this, button, element);\n\n  button.setValueInternal(this.getValue(element));\n  button.setTooltipInternal(this.getTooltip(element));\n\n  // If this is a toggle button, set ARIA state\n  if (button.isSupportedState(goog.ui.Component.State.CHECKED)) {\n    this.updateAriaState(\n        element, goog.ui.Component.State.CHECKED, button.isChecked());\n  }\n\n  return element;\n};\n\n\n/**\n * Takes a button's root element, and returns the value associated with it.\n * No-op in the base class.\n * @param {Element} element The button's root element.\n * @return {string|undefined} The button's value (undefined if none).\n */\ngoog.ui.ButtonRenderer.prototype.getValue = goog.nullFunction;\n\n\n/**\n * Takes a button's root element and a value, and updates the element to reflect\n * the new value.  No-op in the base class.\n * @param {Element} element The button's root element.\n * @param {string} value New value.\n */\ngoog.ui.ButtonRenderer.prototype.setValue = goog.nullFunction;\n\n\n/**\n * Takes a button's root element, and returns its tooltip text.\n * @param {Element} element The button's root element.\n * @return {string|undefined} The tooltip text.\n */\ngoog.ui.ButtonRenderer.prototype.getTooltip = function(element) {\n  return element.title;\n};\n\n\n/**\n * Takes a button's root element and a tooltip string, and updates the element\n * with the new tooltip.\n * @param {Element} element The button's root element.\n * @param {string} tooltip New tooltip text.\n * @protected\n */\ngoog.ui.ButtonRenderer.prototype.setTooltip = function(element, tooltip) {\n  if (element) {\n    // Don't set a title attribute if there isn't a tooltip. Blank title\n    // attributes can be interpreted incorrectly by screen readers.\n    if (tooltip) {\n      element.title = tooltip;\n    } else {\n      element.removeAttribute('title');\n    }\n  }\n};\n\n\n/**\n * Collapses the border on one or both sides of the button, allowing it to be\n * combined with the adjacent button(s), forming a single UI componenet with\n * multiple targets.\n * @param {goog.ui.Button} button Button to update.\n * @param {number} sides Bitmap of one or more {@link goog.ui.ButtonSide}s for\n *     which borders should be collapsed.\n * @protected\n */\ngoog.ui.ButtonRenderer.prototype.setCollapsed = function(button, sides) {\n  var isRtl = button.isRightToLeft();\n  var collapseLeftClassName =\n      goog.getCssName(this.getStructuralCssClass(), 'collapse-left');\n  var collapseRightClassName =\n      goog.getCssName(this.getStructuralCssClass(), 'collapse-right');\n\n  button.enableClassName(\n      isRtl ? collapseRightClassName : collapseLeftClassName,\n      !!(sides & goog.ui.ButtonSide.START));\n  button.enableClassName(\n      isRtl ? collapseLeftClassName : collapseRightClassName,\n      !!(sides & goog.ui.ButtonSide.END));\n};\n\n\n/** @override */\ngoog.ui.ButtonRenderer.prototype.getCssClass = function() {\n  return goog.ui.ButtonRenderer.CSS_CLASS;\n};\n","^AK",1579837703000,"^AL",["^AM",["^BB","~$goog.ui.ButtonSide","^BE","^BT","^DC","^AA","~$goog.ui.ControlRenderer","^DF"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/buttonrenderer.js"],"^B6",["^AM",["~$goog.ui.ButtonRenderer"]],"^A?",true,"^A@",["^AA","^BE","^DC","^DF","^BB","^DR","^BT","^DS"]],["^ ","^AC",[1579837703000],"^AD","goog.net.browsertestchannel.js","^AE",["^AF","goog/net/browsertestchannel.js"],"^AG","goog/net/browsertestchannel.js","^AH","^AI","^AJ","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the BrowserTestChannel class.  A\n * BrowserTestChannel is used during the first part of channel negotiation\n * with the server to create the channel. It helps us determine whether we're\n * behind a buffering proxy. It also runs the logic to see if the channel\n * has been blocked by a network administrator. This class is part of the\n * BrowserChannel implementation and is not for use by normal application code.\n *\n */\n\n\n\ngoog.provide('goog.net.BrowserTestChannel');\n\ngoog.forwardDeclare('goog.net.BrowserChannel');\ngoog.forwardDeclare('goog.net.BrowserChannel.ServerReachability');\ngoog.forwardDeclare('goog.net.XhrIo');\ngoog.require('goog.json.NativeJsonProcessor');\ngoog.require('goog.net.ChannelRequest');\ngoog.require('goog.net.ChannelRequest.Error');\ngoog.require('goog.net.tmpnetwork');\ngoog.require('goog.string.Parser');\n\n\n\n/**\n * Encapsulates the logic for a single BrowserTestChannel.\n *\n * @constructor\n * @param {goog.net.BrowserChannel} channel  The BrowserChannel that owns this\n *     test channel.\n * @param {goog.net.ChannelDebug} channelDebug A ChannelDebug to use for\n *     logging.\n * @final\n */\ngoog.net.BrowserTestChannel = function(channel, channelDebug) {\n  /**\n   * The BrowserChannel that owns this test channel\n   * @type {goog.net.BrowserChannel}\n   * @private\n   */\n  this.channel_ = channel;\n\n  /**\n   * The channel debug to use for logging\n   * @type {goog.net.ChannelDebug}\n   * @private\n   */\n  this.channelDebug_ = channelDebug;\n\n  /**\n   * Parser for a response payload. The parser should return an array.\n   * @type {goog.string.Parser}\n   * @private\n   */\n  this.parser_ = new goog.json.NativeJsonProcessor();\n};\n\n\n/**\n * Extra HTTP headers to add to all the requests sent to the server.\n * @type {?Object}\n * @private\n */\ngoog.net.BrowserTestChannel.prototype.extraHeaders_ = null;\n\n\n/**\n * The test request.\n * @type {?goog.net.ChannelRequest}\n * @private\n */\ngoog.net.BrowserTestChannel.prototype.request_ = null;\n\n\n/**\n * Whether we have received the first result as an intermediate result. This\n * helps us determine whether we're behind a buffering proxy.\n * @type {boolean}\n * @private\n */\ngoog.net.BrowserTestChannel.prototype.receivedIntermediateResult_ = false;\n\n\n/**\n * The time when the test request was started. We use timing in IE as\n * a heuristic for whether we're behind a buffering proxy.\n * @type {?number}\n * @private\n */\ngoog.net.BrowserTestChannel.prototype.startTime_ = null;\n\n\n/**\n * The time for of the first result part. We use timing in IE as a\n * heuristic for whether we're behind a buffering proxy.\n * @type {?number}\n * @private\n */\ngoog.net.BrowserTestChannel.prototype.firstTime_ = null;\n\n\n/**\n * The time for of the last result part. We use timing in IE as a\n * heuristic for whether we're behind a buffering proxy.\n * @type {?number}\n * @private\n */\ngoog.net.BrowserTestChannel.prototype.lastTime_ = null;\n\n\n/**\n * The relative path for test requests.\n * @type {?string}\n * @private\n */\ngoog.net.BrowserTestChannel.prototype.path_ = null;\n\n\n/**\n * The state of the state machine for this object.\n *\n * @type {?number}\n * @private\n */\ngoog.net.BrowserTestChannel.prototype.state_ = null;\n\n\n/**\n * The last status code received.\n * @type {number}\n * @private\n */\ngoog.net.BrowserTestChannel.prototype.lastStatusCode_ = -1;\n\n\n/**\n * A subdomain prefix for using a subdomain in IE for the backchannel\n * requests.\n * @type {?string}\n * @private\n */\ngoog.net.BrowserTestChannel.prototype.hostPrefix_ = null;\n\n\n/**\n * A subdomain prefix for testing whether the channel was disabled by\n * a network administrator;\n * @type {?string}\n * @private\n */\ngoog.net.BrowserTestChannel.prototype.blockedPrefix_ = null;\n\n\n/**\n * Enum type for the browser test channel state machine\n * @enum {number}\n * @private\n */\ngoog.net.BrowserTestChannel.State_ = {\n  /**\n   * The state for the BrowserTestChannel state machine where we making the\n   * initial call to get the server configured parameters.\n   */\n  INIT: 0,\n\n  /**\n   * The state for the BrowserTestChannel state machine where we're checking to\n   * see if the channel has been blocked.\n   */\n  CHECKING_BLOCKED: 1,\n\n  /**\n   * The  state for the BrowserTestChannel state machine where we're checking to\n   * se if we're behind a buffering proxy.\n   */\n  CONNECTION_TESTING: 2\n};\n\n\n/**\n * Time in MS for waiting for the request to see if the channel is blocked.\n * If the response takes longer than this many ms, we assume the request has\n * failed.\n * @type {number}\n * @private\n */\ngoog.net.BrowserTestChannel.BLOCKED_TIMEOUT_ = 5000;\n\n\n/**\n * Number of attempts to try to see if the check to see if we're blocked\n * succeeds. Sometimes the request can fail because of flaky network conditions\n * and checking multiple times reduces false positives.\n * @type {number}\n * @private\n */\ngoog.net.BrowserTestChannel.BLOCKED_RETRIES_ = 3;\n\n\n/**\n * Time in ms between retries of the blocked request\n * @type {number}\n * @private\n */\ngoog.net.BrowserTestChannel.BLOCKED_PAUSE_BETWEEN_RETRIES_ = 2000;\n\n\n/**\n * Time between chunks in the test connection that indicates that we\n * are not behind a buffering proxy. This value should be less than or\n * equals to the time between chunks sent from the server.\n * @type {number}\n * @private\n */\ngoog.net.BrowserTestChannel.MIN_TIME_EXPECTED_BETWEEN_DATA_ = 500;\n\n\n/**\n * Sets extra HTTP headers to add to all the requests sent to the server.\n *\n * @param {Object} extraHeaders The HTTP headers.\n */\ngoog.net.BrowserTestChannel.prototype.setExtraHeaders = function(extraHeaders) {\n  this.extraHeaders_ = extraHeaders;\n};\n\n\n/**\n * Sets a new parser for the response payload.\n * @param {!goog.string.Parser} parser Parser.\n */\ngoog.net.BrowserTestChannel.prototype.setParser = function(parser) {\n  this.parser_ = parser;\n};\n\n\n/**\n * Starts the test channel. This initiates connections to the server.\n *\n * @param {string} path The relative uri for the test connection.\n */\ngoog.net.BrowserTestChannel.prototype.connect = function(path) {\n  this.path_ = path;\n  var sendDataUri = this.channel_.getForwardChannelUri(this.path_);\n\n  goog.net.BrowserChannel.notifyStatEvent(\n      goog.net.BrowserChannel.Stat.TEST_STAGE_ONE_START);\n  this.startTime_ = goog.now();\n\n  // If the channel already has the result of the first test, then skip it.\n  var firstTestResults = this.channel_.getFirstTestResults();\n  if (firstTestResults != null) {\n    this.hostPrefix_ = this.channel_.correctHostPrefix(firstTestResults[0]);\n    this.blockedPrefix_ = firstTestResults[1];\n    if (this.blockedPrefix_) {\n      this.state_ = goog.net.BrowserTestChannel.State_.CHECKING_BLOCKED;\n      this.checkBlocked_();\n    } else {\n      this.state_ = goog.net.BrowserTestChannel.State_.CONNECTION_TESTING;\n      this.connectStage2_();\n    }\n    return;\n  }\n\n  // the first request returns server specific parameters\n  sendDataUri.setParameterValues('MODE', 'init');\n  this.request_ =\n      goog.net.BrowserChannel.createChannelRequest(this, this.channelDebug_);\n  this.request_.setExtraHeaders(this.extraHeaders_);\n  this.request_.xmlHttpGet(\n      sendDataUri, false /* decodeChunks */, null /* hostPrefix */,\n      true /* opt_noClose */);\n  this.state_ = goog.net.BrowserTestChannel.State_.INIT;\n};\n\n\n/**\n * Checks to see whether the channel is blocked. This is for implementing the\n * feature that allows network administrators to block Gmail Chat. The\n * strategy to determine if we're blocked is to try to load an image off a\n * special subdomain that network administrators will block access to if they\n * are trying to block chat. For Gmail Chat, the subdomain is\n * chatenabled.mail.google.com.\n * @private\n */\ngoog.net.BrowserTestChannel.prototype.checkBlocked_ = function() {\n  var uri = this.channel_.createDataUri(\n      this.blockedPrefix_, '/mail/images/cleardot.gif');\n  uri.makeUnique();\n  goog.net.tmpnetwork.testLoadImageWithRetries(\n      uri.toString(), goog.net.BrowserTestChannel.BLOCKED_TIMEOUT_,\n      goog.bind(this.checkBlockedCallback_, this),\n      goog.net.BrowserTestChannel.BLOCKED_RETRIES_,\n      goog.net.BrowserTestChannel.BLOCKED_PAUSE_BETWEEN_RETRIES_);\n  this.notifyServerReachabilityEvent(\n      goog.net.BrowserChannel.ServerReachability.REQUEST_MADE);\n};\n\n\n/**\n * Callback for testLoadImageWithRetries to check if browser channel is\n * blocked.\n * @param {boolean} succeeded Whether the request succeeded.\n * @private\n */\ngoog.net.BrowserTestChannel.prototype.checkBlockedCallback_ = function(\n    succeeded) {\n  if (succeeded) {\n    this.state_ = goog.net.BrowserTestChannel.State_.CONNECTION_TESTING;\n    this.connectStage2_();\n  } else {\n    goog.net.BrowserChannel.notifyStatEvent(\n        goog.net.BrowserChannel.Stat.CHANNEL_BLOCKED);\n    this.channel_.testConnectionBlocked(this);\n  }\n\n  // We don't dispatch a REQUEST_FAILED server reachability event when the\n  // block request fails, as such a failure is not a good signal that the\n  // server has actually become unreachable.\n  if (succeeded) {\n    this.notifyServerReachabilityEvent(\n        goog.net.BrowserChannel.ServerReachability.REQUEST_SUCCEEDED);\n  }\n};\n\n\n/**\n * Begins the second stage of the test channel where we test to see if we're\n * behind a buffering proxy. The server sends back a multi-chunked response\n * with the first chunk containing the content '1' and then two seconds later\n * sending the second chunk containing the content '2'. Depending on how we\n * receive the content, we can tell if we're behind a buffering proxy.\n * @private\n * @suppress {missingRequire} goog.net.BrowserChannel\n */\ngoog.net.BrowserTestChannel.prototype.connectStage2_ = function() {\n  this.channelDebug_.debug('TestConnection: starting stage 2');\n\n  // If the second test results are available, skip its execution.\n  var secondTestResults = this.channel_.getSecondTestResults();\n  if (secondTestResults != null) {\n    this.channelDebug_.debug(\n        'TestConnection: skipping stage 2, precomputed result is ' +\n                secondTestResults ?\n            'Buffered' :\n            'Unbuffered');\n    goog.net.BrowserChannel.notifyStatEvent(\n        goog.net.BrowserChannel.Stat.TEST_STAGE_TWO_START);\n    if (secondTestResults) {  // Buffered/Proxy connection\n      goog.net.BrowserChannel.notifyStatEvent(\n          goog.net.BrowserChannel.Stat.PROXY);\n      this.channel_.testConnectionFinished(this, false);\n    } else {  // Unbuffered/NoProxy connection\n      goog.net.BrowserChannel.notifyStatEvent(\n          goog.net.BrowserChannel.Stat.NOPROXY);\n      this.channel_.testConnectionFinished(this, true);\n    }\n    return;  // Skip the test\n  }\n  /** @private @suppress {missingRequire} Circular dep. */\n  this.request_ =\n      goog.net.BrowserChannel.createChannelRequest(this, this.channelDebug_);\n  this.request_.setExtraHeaders(this.extraHeaders_);\n  var recvDataUri = this.channel_.getBackChannelUri(\n      this.hostPrefix_,\n      /** @type {string} */ (this.path_));\n\n  goog.net.BrowserChannel.notifyStatEvent(\n      goog.net.BrowserChannel.Stat.TEST_STAGE_TWO_START);\n  if (!goog.net.ChannelRequest.supportsXhrStreaming()) {\n    recvDataUri.setParameterValues('TYPE', 'html');\n    this.request_.tridentGet(recvDataUri, Boolean(this.hostPrefix_));\n  } else {\n    recvDataUri.setParameterValues('TYPE', 'xmlhttp');\n    this.request_.xmlHttpGet(\n        recvDataUri, false /** decodeChunks */, this.hostPrefix_,\n        false /** opt_noClose */);\n  }\n};\n\n\n/**\n * Factory method for XhrIo objects.\n * @param {?string} hostPrefix The host prefix, if we need an XhrIo object\n *     capable of calling a secondary domain.\n * @return {!goog.net.XhrIo} New XhrIo object.\n */\ngoog.net.BrowserTestChannel.prototype.createXhrIo = function(hostPrefix) {\n  return this.channel_.createXhrIo(hostPrefix);\n};\n\n\n/**\n * Aborts the test channel.\n */\ngoog.net.BrowserTestChannel.prototype.abort = function() {\n  if (this.request_) {\n    this.request_.cancel();\n    this.request_ = null;\n  }\n  this.lastStatusCode_ = -1;\n};\n\n\n/**\n * Returns whether the test channel is closed. The ChannelRequest object expects\n * this method to be implemented on its handler.\n *\n * @return {boolean} Whether the channel is closed.\n */\ngoog.net.BrowserTestChannel.prototype.isClosed = function() {\n  return false;\n};\n\n\n/**\n * Callback from ChannelRequest for when new data is received\n *\n * @param {goog.net.ChannelRequest} req  The request object.\n * @param {string} responseText The text of the response.\n */\ngoog.net.BrowserTestChannel.prototype.onRequestData = function(\n    req, responseText) {\n  this.lastStatusCode_ = req.getLastStatusCode();\n  if (this.state_ == goog.net.BrowserTestChannel.State_.INIT) {\n    this.channelDebug_.debug('TestConnection: Got data for stage 1');\n    if (!responseText) {\n      this.channelDebug_.debug('TestConnection: Null responseText');\n      // The server should always send text; something is wrong here\n      this.channel_.testConnectionFailure(\n          this, goog.net.ChannelRequest.Error.BAD_DATA);\n      return;\n    }\n\n    try {\n      var respArray = this.parser_.parse(responseText);\n    } catch (e) {\n      this.channelDebug_.dumpException(e);\n      this.channel_.testConnectionFailure(\n          this, goog.net.ChannelRequest.Error.BAD_DATA);\n      return;\n    }\n    this.hostPrefix_ = this.channel_.correctHostPrefix(respArray[0]);\n    this.blockedPrefix_ = respArray[1];\n  } else if (\n      this.state_ == goog.net.BrowserTestChannel.State_.CONNECTION_TESTING) {\n    if (this.receivedIntermediateResult_) {\n      goog.net.BrowserChannel.notifyStatEvent(\n          goog.net.BrowserChannel.Stat.TEST_STAGE_TWO_DATA_TWO);\n      this.lastTime_ = goog.now();\n    } else {\n      // '11111' is used instead of '1' to prevent a small amount of buffering\n      // by Safari.\n      if (responseText == '11111') {\n        goog.net.BrowserChannel.notifyStatEvent(\n            goog.net.BrowserChannel.Stat.TEST_STAGE_TWO_DATA_ONE);\n        this.receivedIntermediateResult_ = true;\n        this.firstTime_ = goog.now();\n        if (this.checkForEarlyNonBuffered_()) {\n          // If early chunk detection is on, and we passed the tests,\n          // assume HTTP_OK, cancel the test and turn on noproxy mode.\n          this.lastStatusCode_ = 200;\n          this.request_.cancel();\n          this.channelDebug_.debug(\n              'Test connection succeeded; using streaming connection');\n          goog.net.BrowserChannel.notifyStatEvent(\n              goog.net.BrowserChannel.Stat.NOPROXY);\n          this.channel_.testConnectionFinished(this, true);\n        }\n      } else {\n        goog.net.BrowserChannel.notifyStatEvent(\n            goog.net.BrowserChannel.Stat.TEST_STAGE_TWO_DATA_BOTH);\n        this.firstTime_ = this.lastTime_ = goog.now();\n        this.receivedIntermediateResult_ = false;\n      }\n    }\n  }\n};\n\n\n/**\n * Callback from ChannelRequest that indicates a request has completed.\n *\n * @param {goog.net.ChannelRequest} req  The request object.\n * @suppress {missingRequire} Cannot depend on goog.net.BrowserChannel because\n *     it creates a circular dependency.\n */\ngoog.net.BrowserTestChannel.prototype.onRequestComplete = function(req) {\n  this.lastStatusCode_ = this.request_.getLastStatusCode();\n  if (!this.request_.getSuccess()) {\n    this.channelDebug_.debug(\n        'TestConnection: request failed, in state ' + this.state_);\n    if (this.state_ == goog.net.BrowserTestChannel.State_.INIT) {\n      goog.net.BrowserChannel.notifyStatEvent(\n          goog.net.BrowserChannel.Stat.TEST_STAGE_ONE_FAILED);\n    } else if (\n        this.state_ == goog.net.BrowserTestChannel.State_.CONNECTION_TESTING) {\n      goog.net.BrowserChannel.notifyStatEvent(\n          goog.net.BrowserChannel.Stat.TEST_STAGE_TWO_FAILED);\n    }\n    this.channel_.testConnectionFailure(\n        this,\n        /** @type {goog.net.ChannelRequest.Error} */\n        (this.request_.getLastError()));\n    return;\n  }\n\n  if (this.state_ == goog.net.BrowserTestChannel.State_.INIT) {\n    this.channelDebug_.debug(\n        'TestConnection: request complete for initial check');\n    if (this.blockedPrefix_) {\n      this.state_ = goog.net.BrowserTestChannel.State_.CHECKING_BLOCKED;\n      this.checkBlocked_();\n    } else {\n      this.state_ = goog.net.BrowserTestChannel.State_.CONNECTION_TESTING;\n      this.connectStage2_();\n    }\n  } else if (\n      this.state_ == goog.net.BrowserTestChannel.State_.CONNECTION_TESTING) {\n    this.channelDebug_.debug('TestConnection: request complete for stage 2');\n    var goodConn = false;\n\n    if (!goog.net.ChannelRequest.supportsXhrStreaming()) {\n      // we always get Trident responses in separate calls to\n      // onRequestData, so we have to check the time they came\n      var ms = this.lastTime_ - this.firstTime_;\n      if (ms < 200) {\n        // TODO: need to empirically verify that this number is OK\n        // for slow computers\n        goodConn = false;\n      } else {\n        goodConn = true;\n      }\n    } else {\n      goodConn = this.receivedIntermediateResult_;\n    }\n\n    if (goodConn) {\n      this.channelDebug_.debug(\n          'Test connection succeeded; using streaming connection');\n      goog.net.BrowserChannel.notifyStatEvent(\n          goog.net.BrowserChannel.Stat.NOPROXY);\n      this.channel_.testConnectionFinished(this, true);\n    } else {\n      this.channelDebug_.debug('Test connection failed; not using streaming');\n      /** @suppress {missingRequire} Circular dep */\n      goog.net.BrowserChannel.notifyStatEvent(\n          goog.net.BrowserChannel.Stat.PROXY);\n      this.channel_.testConnectionFinished(this, false);\n    }\n  }\n};\n\n\n/**\n * Returns the last status code received for a request.\n * @return {number} The last status code received for a request.\n */\ngoog.net.BrowserTestChannel.prototype.getLastStatusCode = function() {\n  return this.lastStatusCode_;\n};\n\n\n/**\n * @return {boolean} Whether we should be using secondary domains when the\n *     server instructs us to do so.\n */\ngoog.net.BrowserTestChannel.prototype.shouldUseSecondaryDomains = function() {\n  return this.channel_.shouldUseSecondaryDomains();\n};\n\n\n/**\n * Gets whether this channel is currently active. This is used to determine the\n * length of time to wait before retrying.\n *\n * @param {goog.net.BrowserChannel} browserChannel The browser channel.\n * @return {boolean} Whether the channel is currently active.\n */\ngoog.net.BrowserTestChannel.prototype.isActive = function(browserChannel) {\n  return this.channel_.isActive();\n};\n\n\n/**\n * @return {boolean} True if test stage 2 detected a non-buffered\n *     channel early and early no buffering detection is enabled.\n * @private\n */\ngoog.net.BrowserTestChannel.prototype.checkForEarlyNonBuffered_ = function() {\n  var ms = this.firstTime_ - this.startTime_;\n\n  // we always get Trident responses in separate calls to\n  // onRequestData, so we have to check the time that the first came in\n  // and verify that the data arrived before the second portion could\n  // have been sent. For all other browser's we skip the timing test.\n  return goog.net.ChannelRequest.supportsXhrStreaming() ||\n      ms < goog.net.BrowserTestChannel.MIN_TIME_EXPECTED_BETWEEN_DATA_;\n};\n\n\n/**\n * Notifies the channel of a fine grained network event.\n * @param {goog.net.BrowserChannel.ServerReachability} reachabilityType The\n *     reachability event type.\n */\ngoog.net.BrowserTestChannel.prototype.notifyServerReachabilityEvent = function(\n    reachabilityType) {\n  this.channel_.notifyServerReachabilityEvent(reachabilityType);\n};\n","^AK",1579837703000,"^AL",["^AM",["~$goog.json.NativeJsonProcessor","~$goog.string.Parser","^AA","~$goog.net.tmpnetwork","~$goog.net.ChannelRequest","~$goog.net.ChannelRequest.Error"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/browsertestchannel.js"],"^B6",["^AM",["~$goog.net.BrowserTestChannel"]],"^A?",true,"^A@",["^AA","^DU","^DX","^DY","^DW","^DV"]],["^ ","^AC",[1579837703000],"^AD","goog.net.errorcode.js","^AE",["^AF","goog/net/errorcode.js"],"^AG","goog/net/errorcode.js","^AH","^AI","^AJ","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Error codes shared between goog.net.IframeIo and\n * goog.net.XhrIo.\n */\n\ngoog.provide('goog.net.ErrorCode');\n\n\n/**\n * Error codes\n * @enum {number}\n */\ngoog.net.ErrorCode = {\n\n  /**\n   * There is no error condition.\n   */\n  NO_ERROR: 0,\n\n  /**\n   * The most common error from iframeio, unfortunately, is that the browser\n   * responded with an error page that is classed as a different domain. The\n   * situations, are when a browser error page  is shown -- 404, access denied,\n   * DNS failure, connection reset etc.)\n   *\n   */\n  ACCESS_DENIED: 1,\n\n  /**\n   * Currently the only case where file not found will be caused is when the\n   * code is running on the local file system and a non-IE browser makes a\n   * request to a file that doesn't exist.\n   */\n  FILE_NOT_FOUND: 2,\n\n  /**\n   * If Firefox shows a browser error page, such as a connection reset by\n   * server or access denied, then it will fail silently without the error or\n   * load handlers firing.\n   */\n  FF_SILENT_ERROR: 3,\n\n  /**\n   * Custom error provided by the client through the error check hook.\n   */\n  CUSTOM_ERROR: 4,\n\n  /**\n   * Exception was thrown while processing the request.\n   */\n  EXCEPTION: 5,\n\n  /**\n   * The Http response returned a non-successful http status code.\n   */\n  HTTP_ERROR: 6,\n\n  /**\n   * The request was aborted.\n   */\n  ABORT: 7,\n\n  /**\n   * The request timed out.\n   */\n  TIMEOUT: 8,\n\n  /**\n   * The resource is not available offline.\n   */\n  OFFLINE: 9\n};\n\n\n/**\n * Returns a friendly error message for an error code. These messages are for\n * debugging and are not localized.\n * @param {goog.net.ErrorCode} errorCode An error code.\n * @return {string} A message for debugging.\n */\ngoog.net.ErrorCode.getDebugMessage = function(errorCode) {\n  switch (errorCode) {\n    case goog.net.ErrorCode.NO_ERROR:\n      return 'No Error';\n\n    case goog.net.ErrorCode.ACCESS_DENIED:\n      return 'Access denied to content document';\n\n    case goog.net.ErrorCode.FILE_NOT_FOUND:\n      return 'File not found';\n\n    case goog.net.ErrorCode.FF_SILENT_ERROR:\n      return 'Firefox silently errored';\n\n    case goog.net.ErrorCode.CUSTOM_ERROR:\n      return 'Application custom error';\n\n    case goog.net.ErrorCode.EXCEPTION:\n      return 'An exception occurred';\n\n    case goog.net.ErrorCode.HTTP_ERROR:\n      return 'Http response at 400 or 500 level';\n\n    case goog.net.ErrorCode.ABORT:\n      return 'Request was aborted';\n\n    case goog.net.ErrorCode.TIMEOUT:\n      return 'Request timed out';\n\n    case goog.net.ErrorCode.OFFLINE:\n      return 'The resource is not available offline';\n\n    default:\n      return 'Unrecognized error code';\n  }\n};\n","^AK",1579837703000,"^AL",["^AM",["^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/errorcode.js"],"^B6",["^AM",["~$goog.net.ErrorCode"]],"^A?",true,"^A@",["^AA"]],["^ ","^AC",[1579837703000],"^AD","goog.disposable.disposable.js","^AE",["^AF","goog/disposable/disposable.js"],"^AG","goog/disposable/disposable.js","^AH","^AI","^AJ","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implements the disposable interface. The dispose method is used\n * to clean up references and resources.\n * @author arv@google.com (Erik Arvidsson)\n */\n\n\ngoog.provide('goog.Disposable');\ngoog.provide('goog.dispose');\ngoog.provide('goog.disposeAll');\n\ngoog.require('goog.disposable.IDisposable');\n\n\n\n/**\n * Class that provides the basic implementation for disposable objects. If your\n * class holds one or more references to COM objects, DOM nodes, or other\n * disposable objects, it should extend this class or implement the disposable\n * interface (defined in goog.disposable.IDisposable).\n * @constructor\n * @implements {goog.disposable.IDisposable}\n */\ngoog.Disposable = function() {\n  /**\n   * If monitoring the goog.Disposable instances is enabled, stores the creation\n   * stack trace of the Disposable instance.\n   * @type {string|undefined}\n   */\n  this.creationStack;\n\n  if (goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) {\n    if (goog.Disposable.INCLUDE_STACK_ON_CREATION) {\n      this.creationStack = new Error().stack;\n    }\n    goog.Disposable.instances_[goog.getUid(this)] = this;\n  }\n  // Support sealing\n  this.disposed_ = this.disposed_;\n  this.onDisposeCallbacks_ = this.onDisposeCallbacks_;\n};\n\n\n/**\n * @enum {number} Different monitoring modes for Disposable.\n */\ngoog.Disposable.MonitoringMode = {\n  /**\n   * No monitoring.\n   */\n  OFF: 0,\n  /**\n   * Creating and disposing the goog.Disposable instances is monitored. All\n   * disposable objects need to call the `goog.Disposable` base\n   * constructor. The PERMANENT mode must be switched on before creating any\n   * goog.Disposable instances.\n   */\n  PERMANENT: 1,\n  /**\n   * INTERACTIVE mode can be switched on and off on the fly without producing\n   * errors. It also doesn't warn if the disposable objects don't call the\n   * `goog.Disposable` base constructor.\n   */\n  INTERACTIVE: 2\n};\n\n\n/**\n * @define {number} The monitoring mode of the goog.Disposable\n *     instances. Default is OFF. Switching on the monitoring is only\n *     recommended for debugging because it has a significant impact on\n *     performance and memory usage. If switched off, the monitoring code\n *     compiles down to 0 bytes.\n */\ngoog.Disposable.MONITORING_MODE =\n    goog.define('goog.Disposable.MONITORING_MODE', 0);\n\n\n/**\n * @define {boolean} Whether to attach creation stack to each created disposable\n *     instance; This is only relevant for when MonitoringMode != OFF.\n */\ngoog.Disposable.INCLUDE_STACK_ON_CREATION =\n    goog.define('goog.Disposable.INCLUDE_STACK_ON_CREATION', true);\n\n\n/**\n * Maps the unique ID of every undisposed `goog.Disposable` object to\n * the object itself.\n * @type {!Object<number, !goog.Disposable>}\n * @private\n */\ngoog.Disposable.instances_ = {};\n\n\n/**\n * @return {!Array<!goog.Disposable>} All `goog.Disposable` objects that\n *     haven't been disposed of.\n */\ngoog.Disposable.getUndisposedObjects = function() {\n  var ret = [];\n  for (var id in goog.Disposable.instances_) {\n    if (goog.Disposable.instances_.hasOwnProperty(id)) {\n      ret.push(goog.Disposable.instances_[Number(id)]);\n    }\n  }\n  return ret;\n};\n\n\n/**\n * Clears the registry of undisposed objects but doesn't dispose of them.\n */\ngoog.Disposable.clearUndisposedObjects = function() {\n  goog.Disposable.instances_ = {};\n};\n\n\n/**\n * Whether the object has been disposed of.\n * @type {boolean}\n * @private\n */\ngoog.Disposable.prototype.disposed_ = false;\n\n\n/**\n * Callbacks to invoke when this object is disposed.\n * @type {Array<!Function>}\n * @private\n */\ngoog.Disposable.prototype.onDisposeCallbacks_;\n\n\n/**\n * @return {boolean} Whether the object has been disposed of.\n * @override\n */\ngoog.Disposable.prototype.isDisposed = function() {\n  return this.disposed_;\n};\n\n\n/**\n * @return {boolean} Whether the object has been disposed of.\n * @deprecated Use {@link #isDisposed} instead.\n */\ngoog.Disposable.prototype.getDisposed = goog.Disposable.prototype.isDisposed;\n\n\n/**\n * Disposes of the object. If the object hasn't already been disposed of, calls\n * {@link #disposeInternal}. Classes that extend `goog.Disposable` should\n * override {@link #disposeInternal} in order to delete references to COM\n * objects, DOM nodes, and other disposable objects. Reentrant.\n *\n * @return {void} Nothing.\n * @override\n */\ngoog.Disposable.prototype.dispose = function() {\n  if (!this.disposed_) {\n    // Set disposed_ to true first, in case during the chain of disposal this\n    // gets disposed recursively.\n    this.disposed_ = true;\n    this.disposeInternal();\n    if (goog.Disposable.MONITORING_MODE != goog.Disposable.MonitoringMode.OFF) {\n      var uid = goog.getUid(this);\n      if (goog.Disposable.MONITORING_MODE ==\n              goog.Disposable.MonitoringMode.PERMANENT &&\n          !goog.Disposable.instances_.hasOwnProperty(uid)) {\n        throw new Error(\n            this + ' did not call the goog.Disposable base ' +\n            'constructor or was disposed of after a clearUndisposedObjects ' +\n            'call');\n      }\n      if (goog.Disposable.MONITORING_MODE !=\n              goog.Disposable.MonitoringMode.OFF &&\n          this.onDisposeCallbacks_ && this.onDisposeCallbacks_.length > 0) {\n        throw new Error(\n            this + ' did not empty its onDisposeCallbacks queue. This ' +\n            'probably means it overrode dispose() or disposeInternal() ' +\n            'without calling the superclass\\' method.');\n      }\n      delete goog.Disposable.instances_[uid];\n    }\n  }\n};\n\n\n/**\n * Associates a disposable object with this object so that they will be disposed\n * together.\n * @param {goog.disposable.IDisposable} disposable that will be disposed when\n *     this object is disposed.\n */\ngoog.Disposable.prototype.registerDisposable = function(disposable) {\n  this.addOnDisposeCallback(goog.partial(goog.dispose, disposable));\n};\n\n\n/**\n * Invokes a callback function when this object is disposed. Callbacks are\n * invoked in the order in which they were added. If a callback is added to\n * an already disposed Disposable, it will be called immediately.\n * @param {function(this:T):?} callback The callback function.\n * @param {T=} opt_scope An optional scope to call the callback in.\n * @template T\n */\ngoog.Disposable.prototype.addOnDisposeCallback = function(callback, opt_scope) {\n  if (this.disposed_) {\n    opt_scope !== undefined ? callback.call(opt_scope) : callback();\n    return;\n  }\n  if (!this.onDisposeCallbacks_) {\n    this.onDisposeCallbacks_ = [];\n  }\n\n  this.onDisposeCallbacks_.push(\n      opt_scope !== undefined ? goog.bind(callback, opt_scope) : callback);\n};\n\n\n/**\n * Deletes or nulls out any references to COM objects, DOM nodes, or other\n * disposable objects. Classes that extend `goog.Disposable` should\n * override this method.\n * Not reentrant. To avoid calling it twice, it must only be called from the\n * subclass' `disposeInternal` method. Everywhere else the public\n * `dispose` method must be used.\n * For example:\n * <pre>\n *   mypackage.MyClass = function() {\n *     mypackage.MyClass.base(this, 'constructor');\n *     // Constructor logic specific to MyClass.\n *     ...\n *   };\n *   goog.inherits(mypackage.MyClass, goog.Disposable);\n *\n *   mypackage.MyClass.prototype.disposeInternal = function() {\n *     // Dispose logic specific to MyClass.\n *     ...\n *     // Call superclass's disposeInternal at the end of the subclass's, like\n *     // in C++, to avoid hard-to-catch issues.\n *     mypackage.MyClass.base(this, 'disposeInternal');\n *   };\n * </pre>\n * @protected\n */\ngoog.Disposable.prototype.disposeInternal = function() {\n  if (this.onDisposeCallbacks_) {\n    while (this.onDisposeCallbacks_.length) {\n      this.onDisposeCallbacks_.shift()();\n    }\n  }\n};\n\n\n/**\n * Returns True if we can verify the object is disposed.\n * Calls `isDisposed` on the argument if it supports it.  If obj\n * is not an object with an isDisposed() method, return false.\n * @param {*} obj The object to investigate.\n * @return {boolean} True if we can verify the object is disposed.\n */\ngoog.Disposable.isDisposed = function(obj) {\n  if (obj && typeof obj.isDisposed == 'function') {\n    return obj.isDisposed();\n  }\n  return false;\n};\n\n\n/**\n * Calls `dispose` on the argument if it supports it. If obj is not an\n *     object with a dispose() method, this is a no-op.\n * @param {*} obj The object to dispose of.\n */\ngoog.dispose = function(obj) {\n  if (obj && typeof obj.dispose == 'function') {\n    obj.dispose();\n  }\n};\n\n\n/**\n * Calls `dispose` on each member of the list that supports it. (If the\n * member is an ArrayLike, then `goog.disposeAll()` will be called\n * recursively on each of its members.) If the member is not an object with a\n * `dispose()` method, then it is ignored.\n * @param {...*} var_args The list.\n */\ngoog.disposeAll = function(var_args) {\n  for (var i = 0, len = arguments.length; i < len; ++i) {\n    var disposable = arguments[i];\n    if (goog.isArrayLike(disposable)) {\n      goog.disposeAll.apply(null, disposable);\n    } else {\n      goog.dispose(disposable);\n    }\n  }\n};\n","^AK",1579837703000,"^AL",["^AM",["^AA","~$goog.disposable.IDisposable"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/disposable/disposable.js"],"^B6",["^AM",["~$goog.disposeAll","~$goog.Disposable","~$goog.dispose"]],"^A?",true,"^A@",["^AA","^E0"]],["^ ","^AC",[1579837703000],"^AD","goog.positioning.abstractposition.js","^AE",["^AF","goog/positioning/abstractposition.js"],"^AG","goog/positioning/abstractposition.js","^AH","^AI","^AJ","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Abstract base class for positioning implementations.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.positioning.AbstractPosition');\n\ngoog.forwardDeclare('goog.math.Box');\ngoog.forwardDeclare('goog.math.Size');\ngoog.forwardDeclare('goog.positioning.Corner');\n\n\n\n/**\n * Abstract position object. Encapsulates position and overflow handling.\n *\n * @constructor\n */\ngoog.positioning.AbstractPosition = function() {};\n\n\n/**\n * Repositions the element. Abstract method, should be overloaded.\n *\n * @param {Element} movableElement Element to position.\n * @param {goog.positioning.Corner} corner Corner of the movable element that\n *     should be positioned adjacent to the anchored element.\n * @param {goog.math.Box=} opt_margin A margin specified in pixels.\n * @param {goog.math.Size=} opt_preferredSize PreferredSize of the\n *     movableElement.\n */\ngoog.positioning.AbstractPosition.prototype.reposition = function(\n    movableElement, corner, opt_margin, opt_preferredSize) {};\n","^AK",1579837703000,"^AL",["^AM",["^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/positioning/abstractposition.js"],"^B6",["^AM",["~$goog.positioning.AbstractPosition"]],"^A?",true,"^A@",["^AA"]],["^ ","^AC",[1579837703000],"^AD","goog.i18n.pluralrules.js","^AE",["^AF","goog/i18n/pluralrules.js"],"^AG","goog/i18n/pluralrules.js","^AH","^AI","^AJ","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Plural rules.\n *\n *\n * File generated from CLDR ver. 35\n *\n * Before check in, this file could have been manually edited. This is to\n * incorporate changes before we could fix CLDR. All manual modification must be\n * documented in this section, and should be removed after those changes land to\n * CLDR.\n */\n\n// clang-format off\n\ngoog.provide('goog.i18n.pluralRules');\n/**\n * Plural pattern keyword\n * @enum {string}\n */\ngoog.i18n.pluralRules.Keyword = {\n  ZERO: 'zero',\n  ONE: 'one',\n  TWO: 'two',\n  FEW: 'few',\n  MANY: 'many',\n  OTHER: 'other'\n};\n\n\n/**\n * Plural selection function.\n *\n * The actual implementation is locale-dependent.\n *\n * @param {number} n The count of items.\n * @param {number=} opt_precision optional, precision.\n * @return {goog.i18n.pluralRules.Keyword}\n */\ngoog.i18n.pluralRules.select;\n\n/**\n * Default Plural select rule.\n * @param {number} n The count of items.\n * @param {number=} opt_precision optional, precision.\n * @return {goog.i18n.pluralRules.Keyword} Default value.\n * @private\n */\ngoog.i18n.pluralRules.defaultSelect_ = function(n, opt_precision) {\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Returns the fractional part of a number (3.1416 => 1416)\n * @param {number} n The count of items.\n * @return {number} The fractional part.\n * @private\n */\ngoog.i18n.pluralRules.decimals_ = function(n) {\n  const str = n + '';\n  const result = str.indexOf('.');\n  return (result == -1) ? 0 : str.length - result - 1;\n};\n\n/**\n * Calculates v and f as per CLDR plural rules.\n * The short names for parameters / return match the CLDR syntax and UTS #35\n *     (https://unicode.org/reports/tr35/tr35-numbers.html#Plural_rules_syntax)\n * @param {number} n The count of items.\n * @param {number=} opt_precision optional, precision.\n * @return {{v:number, f:number}} The v and f.\n * @private\n */\ngoog.i18n.pluralRules.get_vf_ = function(n, opt_precision) {\n  const DEFAULT_DIGITS = 3;\n\n  let v;\n  if (undefined === opt_precision) {\n    v = Math.min(goog.i18n.pluralRules.decimals_(n), DEFAULT_DIGITS);\n  } else {\n    v = opt_precision;\n  }\n\n  const base = Math.pow(10, v);\n  const f = ((n * base) | 0) % base;\n\n  return {v: v, f: f};\n};\n\n/**\n * Calculates w and t as per CLDR plural rules.\n * The short names for parameters / return match the CLDR syntax and UTS #35\n *     (https://unicode.org/reports/tr35/tr35-numbers.html#Plural_rules_syntax)\n * @param {number} v Calculated previously.\n * @param {number} f Calculated previously.\n * @return {{w:number, t:number}} The w and t.\n * @private\n */\ngoog.i18n.pluralRules.get_wt_ = function(v, f) {\n  if (f === 0) {\n    return {w: 0, t: 0};\n  }\n\n  while ((f % 10) === 0) {\n    f /= 10;\n    v--;\n  }\n\n  return {w: v, t: f};\n};\n\n/**\n * Plural select rules for fil locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.filSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  if (vf.v == 0 && (i == 1 || i == 2 || i == 3) || vf.v == 0 && i % 10 != 4 && i % 10 != 6 && i % 10 != 9 || vf.v != 0 && vf.f % 10 != 4 && vf.f % 10 != 6 && vf.f % 10 != 9) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for br locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.brSelect_ = function(n, opt_precision) {\n  if (n % 10 == 1 && n % 100 != 11 && n % 100 != 71 && n % 100 != 91) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (n % 10 == 2 && n % 100 != 12 && n % 100 != 72 && n % 100 != 92) {\n    return goog.i18n.pluralRules.Keyword.TWO;\n  }\n  if ((n % 10 >= 3 && n % 10 <= 4 || n % 10 == 9) && (n % 100 < 10 || n % 100 > 19) && (n % 100 < 70 || n % 100 > 79) && (n % 100 < 90 || n % 100 > 99)) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  if (n != 0 && n % 1000000 == 0) {\n    return goog.i18n.pluralRules.Keyword.MANY;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for sr locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.srSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14) || vf.f % 10 >= 2 && vf.f % 10 <= 4 && (vf.f % 100 < 12 || vf.f % 100 > 14)) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for hi locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.hiSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  if (i == 0 || n == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for fr locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.frSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  if (i == 0 || i == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for pt locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.ptSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  if (i >= 0 && i <= 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for cs locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.csSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  if (i == 1 && vf.v == 0) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (i >= 2 && i <= 4 && vf.v == 0) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  if (vf.v != 0) {\n    return goog.i18n.pluralRules.Keyword.MANY;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for pl locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.plSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  if (i == 1 && vf.v == 0) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14)) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  if (vf.v == 0 && i != 1 && i % 10 >= 0 && i % 10 <= 1 || vf.v == 0 && i % 10 >= 5 && i % 10 <= 9 || vf.v == 0 && i % 100 >= 12 && i % 100 <= 14) {\n    return goog.i18n.pluralRules.Keyword.MANY;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for shi locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.shiSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  if (i == 0 || n == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (n >= 2 && n <= 10) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for lv locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.lvSelect_ = function(n, opt_precision) {\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  if (n % 10 == 0 || n % 100 >= 11 && n % 100 <= 19 || vf.v == 2 && vf.f % 100 >= 11 && vf.f % 100 <= 19) {\n    return goog.i18n.pluralRules.Keyword.ZERO;\n  }\n  if (n % 10 == 1 && n % 100 != 11 || vf.v == 2 && vf.f % 10 == 1 && vf.f % 100 != 11 || vf.v != 2 && vf.f % 10 == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for iu locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.iuSelect_ = function(n, opt_precision) {\n  if (n == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (n == 2) {\n    return goog.i18n.pluralRules.Keyword.TWO;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for he locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.heSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  if (i == 1 && vf.v == 0) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (i == 2 && vf.v == 0) {\n    return goog.i18n.pluralRules.Keyword.TWO;\n  }\n  if (vf.v == 0 && (n < 0 || n > 10) && n % 10 == 0) {\n    return goog.i18n.pluralRules.Keyword.MANY;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for mt locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.mtSelect_ = function(n, opt_precision) {\n  if (n == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (n == 0 || n % 100 >= 2 && n % 100 <= 10) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  if (n % 100 >= 11 && n % 100 <= 19) {\n    return goog.i18n.pluralRules.Keyword.MANY;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for si locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.siSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  if ((n == 0 || n == 1) || i == 0 && vf.f == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for cy locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.cySelect_ = function(n, opt_precision) {\n  if (n == 0) {\n    return goog.i18n.pluralRules.Keyword.ZERO;\n  }\n  if (n == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (n == 2) {\n    return goog.i18n.pluralRules.Keyword.TWO;\n  }\n  if (n == 3) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  if (n == 6) {\n    return goog.i18n.pluralRules.Keyword.MANY;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for da locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.daSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  const wt = goog.i18n.pluralRules.get_wt_(vf.v, vf.f);\n  if (n == 1 || wt.t != 0 && (i == 0 || i == 1)) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for ru locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.ruSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (vf.v == 0 && i % 10 >= 2 && i % 10 <= 4 && (i % 100 < 12 || i % 100 > 14)) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  if (vf.v == 0 && i % 10 == 0 || vf.v == 0 && i % 10 >= 5 && i % 10 <= 9 || vf.v == 0 && i % 100 >= 11 && i % 100 <= 14) {\n    return goog.i18n.pluralRules.Keyword.MANY;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for gv locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.gvSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  if (vf.v == 0 && i % 10 == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (vf.v == 0 && i % 10 == 2) {\n    return goog.i18n.pluralRules.Keyword.TWO;\n  }\n  if (vf.v == 0 && (i % 100 == 0 || i % 100 == 20 || i % 100 == 40 || i % 100 == 60 || i % 100 == 80)) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  if (vf.v != 0) {\n    return goog.i18n.pluralRules.Keyword.MANY;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for be locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.beSelect_ = function(n, opt_precision) {\n  if (n % 10 == 1 && n % 100 != 11) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  if (n % 10 == 0 || n % 10 >= 5 && n % 10 <= 9 || n % 100 >= 11 && n % 100 <= 14) {\n    return goog.i18n.pluralRules.Keyword.MANY;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for ga locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.gaSelect_ = function(n, opt_precision) {\n  if (n == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (n == 2) {\n    return goog.i18n.pluralRules.Keyword.TWO;\n  }\n  if (n >= 3 && n <= 6) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  if (n >= 7 && n <= 10) {\n    return goog.i18n.pluralRules.Keyword.MANY;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for es locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.esSelect_ = function(n, opt_precision) {\n  if (n == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for dsb locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.dsbSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  if (vf.v == 0 && i % 100 == 1 || vf.f % 100 == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (vf.v == 0 && i % 100 == 2 || vf.f % 100 == 2) {\n    return goog.i18n.pluralRules.Keyword.TWO;\n  }\n  if (vf.v == 0 && i % 100 >= 3 && i % 100 <= 4 || vf.f % 100 >= 3 && vf.f % 100 <= 4) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for lag locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.lagSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  if (n == 0) {\n    return goog.i18n.pluralRules.Keyword.ZERO;\n  }\n  if ((i == 0 || i == 1) && n != 0) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for mk locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.mkSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  if (vf.v == 0 && i % 10 == 1 && i % 100 != 11 || vf.f % 10 == 1 && vf.f % 100 != 11) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for is locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.isSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  const wt = goog.i18n.pluralRules.get_wt_(vf.v, vf.f);\n  if (wt.t == 0 && i % 10 == 1 && i % 100 != 11 || wt.t != 0) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for ksh locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.kshSelect_ = function(n, opt_precision) {\n  if (n == 0) {\n    return goog.i18n.pluralRules.Keyword.ZERO;\n  }\n  if (n == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for ro locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.roSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  if (i == 1 && vf.v == 0) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (vf.v != 0 || n == 0 || n % 100 >= 2 && n % 100 <= 19) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for ar locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.arSelect_ = function(n, opt_precision) {\n  if (n == 0) {\n    return goog.i18n.pluralRules.Keyword.ZERO;\n  }\n  if (n == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (n == 2) {\n    return goog.i18n.pluralRules.Keyword.TWO;\n  }\n  if (n % 100 >= 3 && n % 100 <= 10) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  if (n % 100 >= 11 && n % 100 <= 99) {\n    return goog.i18n.pluralRules.Keyword.MANY;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for gd locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.gdSelect_ = function(n, opt_precision) {\n  if (n == 1 || n == 11) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (n == 2 || n == 12) {\n    return goog.i18n.pluralRules.Keyword.TWO;\n  }\n  if (n >= 3 && n <= 10 || n >= 13 && n <= 19) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for sl locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.slSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  if (vf.v == 0 && i % 100 == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (vf.v == 0 && i % 100 == 2) {\n    return goog.i18n.pluralRules.Keyword.TWO;\n  }\n  if (vf.v == 0 && i % 100 >= 3 && i % 100 <= 4 || vf.v != 0) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for lt locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.ltSelect_ = function(n, opt_precision) {\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  if (n % 10 == 1 && (n % 100 < 11 || n % 100 > 19)) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if (n % 10 >= 2 && n % 10 <= 9 && (n % 100 < 11 || n % 100 > 19)) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  if (vf.f != 0) {\n    return goog.i18n.pluralRules.Keyword.MANY;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for tzm locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.tzmSelect_ = function(n, opt_precision) {\n  if (n >= 0 && n <= 1 || n >= 11 && n <= 99) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for en locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.enSelect_ = function(n, opt_precision) {\n  const i = n | 0;\n  const vf = goog.i18n.pluralRules.get_vf_(n, opt_precision);\n  if (i == 1 && vf.v == 0) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for kw locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.kwSelect_ = function(n, opt_precision) {\n  if (n == 0) {\n    return goog.i18n.pluralRules.Keyword.ZERO;\n  }\n  if (n == 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  if ((n % 100 == 2 || n % 100 == 22 || n % 100 == 42 || n % 100 == 62 || n % 100 == 82) || n % 1000 == 0 && (n % 100000 >= 1000 && n % 100000 <= 20000 || n % 100000 == 40000 || n % 100000 == 60000 || n % 100000 == 80000) || n != 0 && n % 1000000 == 100000) {\n    return goog.i18n.pluralRules.Keyword.TWO;\n  }\n  if (n % 100 == 3 || n % 100 == 23 || n % 100 == 43 || n % 100 == 63 || n % 100 == 83) {\n    return goog.i18n.pluralRules.Keyword.FEW;\n  }\n  if (n != 1 && (n % 100 == 1 || n % 100 == 21 || n % 100 == 41 || n % 100 == 61 || n % 100 == 81)) {\n    return goog.i18n.pluralRules.Keyword.MANY;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Plural select rules for ak locale\n *\n * @param {number} n  The count of items.\n * @param {number=} opt_precision Precision for number formatting, if not default.\n * @return {goog.i18n.pluralRules.Keyword} Locale-specific plural value.\n * @private\n */\ngoog.i18n.pluralRules.akSelect_ = function(n, opt_precision) {\n  if (n >= 0 && n <= 1) {\n    return goog.i18n.pluralRules.Keyword.ONE;\n  }\n  return goog.i18n.pluralRules.Keyword.OTHER;\n};\n\n/**\n * Selected Plural rules by locale.\n */\ngoog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\nif (goog.LOCALE == 'af') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'am') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.hiSelect_;\n}\nif (goog.LOCALE == 'ar') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.arSelect_;\n}\nif (goog.LOCALE == 'ar_DZ' || goog.LOCALE == 'ar-DZ') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.arSelect_;\n}\nif (goog.LOCALE == 'ar_EG' || goog.LOCALE == 'ar-EG') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.arSelect_;\n}\nif (goog.LOCALE == 'az') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'be') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.beSelect_;\n}\nif (goog.LOCALE == 'bg') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'bn') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.hiSelect_;\n}\nif (goog.LOCALE == 'br') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.brSelect_;\n}\nif (goog.LOCALE == 'bs') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.srSelect_;\n}\nif (goog.LOCALE == 'ca') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'chr') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'cs') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.csSelect_;\n}\nif (goog.LOCALE == 'cy') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.cySelect_;\n}\nif (goog.LOCALE == 'da') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.daSelect_;\n}\nif (goog.LOCALE == 'de') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'de_AT' || goog.LOCALE == 'de-AT') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'de_CH' || goog.LOCALE == 'de-CH') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'el') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'en') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'en_AU' || goog.LOCALE == 'en-AU') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'en_CA' || goog.LOCALE == 'en-CA') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'en_GB' || goog.LOCALE == 'en-GB') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'en_IE' || goog.LOCALE == 'en-IE') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'en_IN' || goog.LOCALE == 'en-IN') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'en_SG' || goog.LOCALE == 'en-SG') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'en_US' || goog.LOCALE == 'en-US') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'en_ZA' || goog.LOCALE == 'en-ZA') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'es') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'es_419' || goog.LOCALE == 'es-419') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'es_ES' || goog.LOCALE == 'es-ES') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'es_MX' || goog.LOCALE == 'es-MX') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'es_US' || goog.LOCALE == 'es-US') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'et') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'eu') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'fa') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.hiSelect_;\n}\nif (goog.LOCALE == 'fi') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'fil') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.filSelect_;\n}\nif (goog.LOCALE == 'fr') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.frSelect_;\n}\nif (goog.LOCALE == 'fr_CA' || goog.LOCALE == 'fr-CA') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.frSelect_;\n}\nif (goog.LOCALE == 'ga') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.gaSelect_;\n}\nif (goog.LOCALE == 'gl') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'gsw') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'gu') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.hiSelect_;\n}\nif (goog.LOCALE == 'haw') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'he') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.heSelect_;\n}\nif (goog.LOCALE == 'hi') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.hiSelect_;\n}\nif (goog.LOCALE == 'hr') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.srSelect_;\n}\nif (goog.LOCALE == 'hu') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'hy') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.frSelect_;\n}\nif (goog.LOCALE == 'id') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.defaultSelect_;\n}\nif (goog.LOCALE == 'in') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.defaultSelect_;\n}\nif (goog.LOCALE == 'is') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.isSelect_;\n}\nif (goog.LOCALE == 'it') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'iw') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.heSelect_;\n}\nif (goog.LOCALE == 'ja') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.defaultSelect_;\n}\nif (goog.LOCALE == 'ka') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'kk') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'km') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.defaultSelect_;\n}\nif (goog.LOCALE == 'kn') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.hiSelect_;\n}\nif (goog.LOCALE == 'ko') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.defaultSelect_;\n}\nif (goog.LOCALE == 'ky') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'ln') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.akSelect_;\n}\nif (goog.LOCALE == 'lo') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.defaultSelect_;\n}\nif (goog.LOCALE == 'lt') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.ltSelect_;\n}\nif (goog.LOCALE == 'lv') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.lvSelect_;\n}\nif (goog.LOCALE == 'mk') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.mkSelect_;\n}\nif (goog.LOCALE == 'ml') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'mn') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'mo') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.roSelect_;\n}\nif (goog.LOCALE == 'mr') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'ms') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.defaultSelect_;\n}\nif (goog.LOCALE == 'mt') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.mtSelect_;\n}\nif (goog.LOCALE == 'my') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.defaultSelect_;\n}\nif (goog.LOCALE == 'nb') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'ne') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'nl') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'no') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'no_NO' || goog.LOCALE == 'no-NO') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'or') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'pa') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.akSelect_;\n}\nif (goog.LOCALE == 'pl') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.plSelect_;\n}\nif (goog.LOCALE == 'pt') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.ptSelect_;\n}\nif (goog.LOCALE == 'pt_BR' || goog.LOCALE == 'pt-BR') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.ptSelect_;\n}\nif (goog.LOCALE == 'pt_PT' || goog.LOCALE == 'pt-PT') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'ro') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.roSelect_;\n}\nif (goog.LOCALE == 'ru') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.ruSelect_;\n}\nif (goog.LOCALE == 'sh') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.srSelect_;\n}\nif (goog.LOCALE == 'si') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.siSelect_;\n}\nif (goog.LOCALE == 'sk') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.csSelect_;\n}\nif (goog.LOCALE == 'sl') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.slSelect_;\n}\nif (goog.LOCALE == 'sq') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'sr') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.srSelect_;\n}\nif (goog.LOCALE == 'sr_Latn' || goog.LOCALE == 'sr-Latn') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.srSelect_;\n}\nif (goog.LOCALE == 'sv') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'sw') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'ta') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'te') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'th') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.defaultSelect_;\n}\nif (goog.LOCALE == 'tl') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.filSelect_;\n}\nif (goog.LOCALE == 'tr') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'uk') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.ruSelect_;\n}\nif (goog.LOCALE == 'ur') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.enSelect_;\n}\nif (goog.LOCALE == 'uz') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.esSelect_;\n}\nif (goog.LOCALE == 'vi') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.defaultSelect_;\n}\nif (goog.LOCALE == 'zh') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.defaultSelect_;\n}\nif (goog.LOCALE == 'zh_CN' || goog.LOCALE == 'zh-CN') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.defaultSelect_;\n}\nif (goog.LOCALE == 'zh_HK' || goog.LOCALE == 'zh-HK') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.defaultSelect_;\n}\nif (goog.LOCALE == 'zh_TW' || goog.LOCALE == 'zh-TW') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.defaultSelect_;\n}\nif (goog.LOCALE == 'zu') {\n  goog.i18n.pluralRules.select = goog.i18n.pluralRules.hiSelect_;\n}\n","^AK",1579837703000,"^AL",["^AM",["^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/i18n/pluralrules.js"],"^B6",["^AM",["~$goog.i18n.pluralRules"]],"^A?",true,"^A@",["^AA"]],["^ ","^AC",[1579837703000],"^AD","goog.tweak.entries.js","^AE",["^AF","goog/tweak/entries.js"],"^AG","goog/tweak/entries.js","^AH","^AI","^AJ","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definitions for all tweak entries.\n * The class hierarchy is as follows (abstract entries are denoted with a *):\n * BaseEntry(id, description) *\n *   -> ButtonAction(buttons in the UI)\n *   -> BaseSetting(query parameter) *\n *     -> BooleanGroup(child booleans)\n *     -> BasePrimitiveSetting(value, defaultValue) *\n *       -> BooleanSetting\n *       -> StringSetting\n *       -> NumericSetting\n *       -> BooleanInGroupSetting(token)\n * Most clients should not use these classes directly, but instead use the API\n * defined in tweak.js. One possible use case for directly using them is to\n * register tweaks that are not known at compile time.\n *\n * @author agrieve@google.com (Andrew Grieve)\n */\n\ngoog.provide('goog.tweak.BaseEntry');\ngoog.provide('goog.tweak.BasePrimitiveSetting');\ngoog.provide('goog.tweak.BaseSetting');\ngoog.provide('goog.tweak.BooleanGroup');\ngoog.provide('goog.tweak.BooleanInGroupSetting');\ngoog.provide('goog.tweak.BooleanSetting');\ngoog.provide('goog.tweak.ButtonAction');\ngoog.provide('goog.tweak.NumericSetting');\ngoog.provide('goog.tweak.StringSetting');\n\ngoog.require('goog.array');\ngoog.require('goog.asserts');\ngoog.require('goog.log');\ngoog.require('goog.object');\n\n\n\n/**\n * Base class for all Registry entries.\n * @param {string} id The ID for the entry. Must contain only letters,\n *     numbers, underscores and periods.\n * @param {string} description A description of what the entry does.\n * @constructor\n */\ngoog.tweak.BaseEntry = function(id, description) {\n  /**\n   * An ID to uniquely identify the entry.\n   * @type {string}\n   * @private\n   */\n  this.id_ = id;\n\n  /**\n   * A descriptive label for the entry.\n   * @type {string}\n   */\n  this.label = id;\n\n  /**\n   * A description of what this entry does.\n   * @type {string}\n   */\n  this.description = description;\n\n  /**\n   * Functions to be called whenever a setting is changed or a button is\n   * clicked.\n   * @type {!Array<!Function>}\n   * @private\n   */\n  this.callbacks_ = [];\n};\n\n\n/**\n * The logger for this class.\n * @type {goog.log.Logger}\n * @protected\n */\ngoog.tweak.BaseEntry.prototype.logger =\n    goog.log.getLogger('goog.tweak.BaseEntry');\n\n\n/**\n * Whether a restart is required for changes to the setting to take effect.\n * @type {boolean}\n * @private\n */\ngoog.tweak.BaseEntry.prototype.restartRequired_ = true;\n\n\n/**\n * @return {string} Returns the entry's ID.\n */\ngoog.tweak.BaseEntry.prototype.getId = function() {\n  return this.id_;\n};\n\n\n/**\n * Returns whether a restart is required for changes to the setting to take\n * effect.\n * @return {boolean} The value.\n */\ngoog.tweak.BaseEntry.prototype.isRestartRequired = function() {\n  return this.restartRequired_;\n};\n\n\n/**\n * Sets whether a restart is required for changes to the setting to take\n * effect.\n * @param {boolean} value The new value.\n */\ngoog.tweak.BaseEntry.prototype.setRestartRequired = function(value) {\n  this.restartRequired_ = value;\n};\n\n\n/**\n * Adds a callback that should be called when the setting has changed (or when\n * an action has been clicked).\n * @param {!Function} callback The callback to add.\n */\ngoog.tweak.BaseEntry.prototype.addCallback = function(callback) {\n  this.callbacks_.push(callback);\n};\n\n\n/**\n * Removes a callback that was added by addCallback.\n * @param {!Function} callback The callback to add.\n */\ngoog.tweak.BaseEntry.prototype.removeCallback = function(callback) {\n  goog.array.remove(this.callbacks_, callback);\n};\n\n\n/**\n * Calls all registered callbacks.\n */\ngoog.tweak.BaseEntry.prototype.fireCallbacks = function() {\n  for (var i = 0, callback; callback = this.callbacks_[i]; ++i) {\n    callback(this);\n  }\n};\n\n\n\n/**\n * Base class for all tweak entries that are settings. Settings are entries\n * that are associated with a query parameter.\n * @param {string} id The ID for the setting.\n * @param {string} description A description of what the setting does.\n * @constructor\n * @extends {goog.tweak.BaseEntry}\n */\ngoog.tweak.BaseSetting = function(id, description) {\n  goog.tweak.BaseEntry.call(this, id, description);\n  // Apply this restriction for settings since they turn in to query\n  // parameters. For buttons, it's not really important.\n  goog.asserts.assert(\n      !/[^A-Za-z0-9._]/.test(id), 'Tweak id contains illegal characters: ', id);\n\n  /**\n   * The value of this setting's query parameter.\n   * @type {string|undefined}\n   * @protected\n   */\n  this.initialQueryParamValue;\n\n  /**\n   * The query parameter that controls this setting.\n   * @type {?string}\n   * @private\n   */\n  this.paramName_ = this.getId().toLowerCase();\n};\ngoog.inherits(goog.tweak.BaseSetting, goog.tweak.BaseEntry);\n\n\n/**\n * States of initialization. Entries are initialized lazily in order to allow\n * their initialization to happen in multiple statements.\n * @enum {number}\n * @private\n */\ngoog.tweak.BaseSetting.InitializeState_ = {\n  // The start state for all settings.\n  NOT_INITIALIZED: 0,\n  // This is used to allow concrete classes to call assertNotInitialized()\n  // during their initialize() function.\n  INITIALIZING: 1,\n  // One a setting is initialized, it may no longer change its configuration\n  // settings (associated query parameter, token, etc).\n  INITIALIZED: 2\n};\n\n\n/**\n * The logger for this class.\n * @type {goog.log.Logger}\n * @protected\n * @override\n */\ngoog.tweak.BaseSetting.prototype.logger =\n    goog.log.getLogger('goog.tweak.BaseSetting');\n\n\n/**\n * Whether initialize() has been called (or is in the middle of being called).\n * @type {goog.tweak.BaseSetting.InitializeState_}\n * @private\n */\ngoog.tweak.BaseSetting.prototype.initializeState_ =\n    goog.tweak.BaseSetting.InitializeState_.NOT_INITIALIZED;\n\n\n/**\n * Sets the value of the entry based on the value of the query parameter. Once\n * this is called, configuration settings (associated query parameter, token,\n * etc) may not be changed.\n * @param {?string} value The part of the query param for this setting after\n *     the '='. Null if it is not present.\n * @protected\n */\ngoog.tweak.BaseSetting.prototype.initialize = goog.abstractMethod;\n\n\n/**\n * Returns the value to be used in the query parameter for this tweak.\n * @return {?string} The encoded value. Null if the value is set to its\n *     default.\n */\ngoog.tweak.BaseSetting.prototype.getNewValueEncoded = goog.abstractMethod;\n\n\n/**\n * Asserts that this tweak has not been initialized yet.\n * @param {string} funcName Function name to use in the assertion message.\n * @protected\n */\ngoog.tweak.BaseSetting.prototype.assertNotInitialized = function(funcName) {\n  goog.asserts.assert(\n      this.initializeState_ !=\n          goog.tweak.BaseSetting.InitializeState_.INITIALIZED,\n      'Cannot call ' + funcName + ' after the tweak as been initialized.');\n};\n\n\n/**\n * Returns whether the setting is currently being initialized.\n * @return {boolean} Whether the setting is currently being initialized.\n * @protected\n */\ngoog.tweak.BaseSetting.prototype.isInitializing = function() {\n  return this.initializeState_ ==\n      goog.tweak.BaseSetting.InitializeState_.INITIALIZING;\n};\n\n\n/**\n * Sets the initial query parameter value for this setting. May not be called\n * after the setting has been initialized.\n * @param {string} value The initial query parameter value for this setting.\n */\ngoog.tweak.BaseSetting.prototype.setInitialQueryParamValue = function(value) {\n  this.assertNotInitialized('setInitialQueryParamValue');\n  this.initialQueryParamValue = value;\n};\n\n\n/**\n * Returns the name of the query parameter used for this setting.\n * @return {?string} The param name. Null if no query parameter is directly\n *     associated with the setting.\n */\ngoog.tweak.BaseSetting.prototype.getParamName = function() {\n  return this.paramName_;\n};\n\n\n/**\n * Sets the name of the query parameter used for this setting. If null is\n * passed the the setting will not appear in the top-level query string.\n * @param {?string} value The new value.\n */\ngoog.tweak.BaseSetting.prototype.setParamName = function(value) {\n  this.assertNotInitialized('setParamName');\n  this.paramName_ = value;\n};\n\n\n/**\n * Applies the default value or query param value if this is the first time\n * that the function has been called.\n * @protected\n */\ngoog.tweak.BaseSetting.prototype.ensureInitialized = function() {\n  if (this.initializeState_ ==\n      goog.tweak.BaseSetting.InitializeState_.NOT_INITIALIZED) {\n    // Instead of having only initialized / not initialized, there is a\n    // separate in-between state so that functions that call\n    // assertNotInitialized() will not fail when called inside of the\n    // initialize().\n    this.initializeState_ =\n        goog.tweak.BaseSetting.InitializeState_.INITIALIZING;\n    var value = this.initialQueryParamValue == undefined ?\n        null :\n        this.initialQueryParamValue;\n    this.initialize(value);\n    this.initializeState_ = goog.tweak.BaseSetting.InitializeState_.INITIALIZED;\n  }\n};\n\n\n\n/**\n * Base class for all settings that wrap primitive values.\n * @param {string} id The ID for the setting.\n * @param {string} description A description of what the setting does.\n * @param {*} defaultValue The default value for this setting.\n * @constructor\n * @extends {goog.tweak.BaseSetting}\n */\ngoog.tweak.BasePrimitiveSetting = function(id, description, defaultValue) {\n  goog.tweak.BaseSetting.call(this, id, description);\n  /**\n   * The default value of the setting.\n   * @type {?}\n   * @private\n   */\n  this.defaultValue_ = defaultValue;\n\n  /**\n   * The value of the tweak.\n   * @type {?}\n   * @private\n   */\n  this.value_;\n\n  /**\n   * The value of the tweak once \"Apply Tweaks\" is pressed.\n   * @type {?}\n   * @private\n   */\n  this.newValue_;\n};\ngoog.inherits(goog.tweak.BasePrimitiveSetting, goog.tweak.BaseSetting);\n\n\n/**\n * The logger for this class.\n * @type {goog.log.Logger}\n * @protected\n * @override\n */\ngoog.tweak.BasePrimitiveSetting.prototype.logger =\n    goog.log.getLogger('goog.tweak.BasePrimitiveSetting');\n\n\n/**\n * Returns the query param encoded representation of the setting's value.\n * @return {string} The encoded value.\n * @protected\n */\ngoog.tweak.BasePrimitiveSetting.prototype.encodeNewValue = goog.abstractMethod;\n\n\n/**\n * If the setting has the restartRequired option, then returns its initial\n * value. Otherwise, returns its current value.\n * @return {?} The value.\n */\ngoog.tweak.BasePrimitiveSetting.prototype.getValue = function() {\n  this.ensureInitialized();\n  return this.value_;\n};\n\n\n/**\n * Returns the value of the setting to use once \"Apply Tweaks\" is clicked.\n * @return {?} The value.\n */\ngoog.tweak.BasePrimitiveSetting.prototype.getNewValue = function() {\n  this.ensureInitialized();\n  return this.newValue_;\n};\n\n\n/**\n * Sets the value of the setting. If the setting has the restartRequired\n * option, then the value will not be changed until the \"Apply Tweaks\" button\n * is clicked. If it does not have the option, the value will be update\n * immediately and all registered callbacks will be called.\n * @param {?} value The value.\n */\ngoog.tweak.BasePrimitiveSetting.prototype.setValue = function(value) {\n  this.ensureInitialized();\n  var changed = this.newValue_ != value;\n  this.newValue_ = value;\n  // Don't fire callbacks if we are currently in the initialize() method.\n  if (this.isInitializing()) {\n    this.value_ = value;\n  } else {\n    if (!this.isRestartRequired()) {\n      // Update the current value only if the tweak has been marked as not\n      // needing a restart.\n      this.value_ = value;\n    }\n    if (changed) {\n      this.fireCallbacks();\n    }\n  }\n};\n\n\n/**\n * Returns the default value for this setting.\n * @return {?} The default value.\n */\ngoog.tweak.BasePrimitiveSetting.prototype.getDefaultValue = function() {\n  return this.defaultValue_;\n};\n\n\n/**\n * Sets the default value for the tweak.\n * @param {?} value The new value.\n */\ngoog.tweak.BasePrimitiveSetting.prototype.setDefaultValue = function(value) {\n  this.assertNotInitialized('setDefaultValue');\n  this.defaultValue_ = value;\n};\n\n\n/**\n * @override\n */\ngoog.tweak.BasePrimitiveSetting.prototype.getNewValueEncoded = function() {\n  this.ensureInitialized();\n  return this.newValue_ == this.defaultValue_ ? null : this.encodeNewValue();\n};\n\n\n\n/**\n * A registry setting for string values.\n * @param {string} id The ID for the setting.\n * @param {string} description A description of what the setting does.\n * @constructor\n * @extends {goog.tweak.BasePrimitiveSetting}\n * @final\n */\ngoog.tweak.StringSetting = function(id, description) {\n  goog.tweak.BasePrimitiveSetting.call(this, id, description, '');\n  /**\n   * Valid values for the setting.\n   * @type {Array<string>|undefined}\n   */\n  this.validValues_;\n};\ngoog.inherits(goog.tweak.StringSetting, goog.tweak.BasePrimitiveSetting);\n\n\n/**\n * The logger for this class.\n * @type {goog.log.Logger}\n * @protected\n * @override\n */\ngoog.tweak.StringSetting.prototype.logger =\n    goog.log.getLogger('goog.tweak.StringSetting');\n\n\n/**\n * @override\n * @return {string} The tweaks's value.\n */\ngoog.tweak.StringSetting.prototype.getValue;\n\n\n/**\n * @override\n * @return {string} The tweaks's new value.\n */\ngoog.tweak.StringSetting.prototype.getNewValue;\n\n\n/**\n * @override\n * @param {string} value The tweaks's value.\n */\ngoog.tweak.StringSetting.prototype.setValue;\n\n\n/**\n * @override\n * @param {string} value The default value.\n */\ngoog.tweak.StringSetting.prototype.setDefaultValue;\n\n\n/**\n * @override\n * @return {string} The default value.\n */\ngoog.tweak.StringSetting.prototype.getDefaultValue;\n\n\n/**\n * @override\n */\ngoog.tweak.StringSetting.prototype.encodeNewValue = function() {\n  return this.getNewValue();\n};\n\n\n/**\n * Sets the valid values for the setting.\n * @param {Array<string>|undefined} values Valid values.\n */\ngoog.tweak.StringSetting.prototype.setValidValues = function(values) {\n  this.assertNotInitialized('setValidValues');\n  this.validValues_ = values;\n  // Set the default value to the first value in the list if the current\n  // default value is not within it.\n  if (values && !goog.array.contains(values, this.getDefaultValue())) {\n    this.setDefaultValue(values[0]);\n  }\n};\n\n\n/**\n * Returns the valid values for the setting.\n * @return {Array<string>|undefined} Valid values.\n */\ngoog.tweak.StringSetting.prototype.getValidValues = function() {\n  return this.validValues_;\n};\n\n\n/**\n * @override\n */\ngoog.tweak.StringSetting.prototype.initialize = function(value) {\n  if (value == null) {\n    this.setValue(this.getDefaultValue());\n  } else {\n    var validValues = this.validValues_;\n    if (validValues) {\n      // Make the query parameter values case-insensitive since users might\n      // type them by hand. Make the capitalization that is actual used come\n      // from the list of valid values.\n      value = value.toLowerCase();\n      for (var i = 0, il = validValues.length; i < il; ++i) {\n        if (value == validValues[i].toLowerCase()) {\n          this.setValue(validValues[i]);\n          return;\n        }\n      }\n      // Warn if the value is not in the list of allowed values.\n      goog.log.warning(\n          this.logger, 'Tweak ' + this.getId() +\n              ' has value outside of expected range:' + value);\n    }\n    this.setValue(value);\n  }\n};\n\n\n\n/**\n * A registry setting for numeric values.\n * @param {string} id The ID for the setting.\n * @param {string} description A description of what the setting does.\n * @constructor\n * @extends {goog.tweak.BasePrimitiveSetting}\n * @final\n */\ngoog.tweak.NumericSetting = function(id, description) {\n  goog.tweak.BasePrimitiveSetting.call(this, id, description, 0);\n  /**\n   * Valid values for the setting.\n   * @type {Array<number>|undefined}\n   */\n  this.validValues_;\n};\ngoog.inherits(goog.tweak.NumericSetting, goog.tweak.BasePrimitiveSetting);\n\n\n/**\n * The logger for this class.\n * @type {goog.log.Logger}\n * @protected\n * @override\n */\ngoog.tweak.NumericSetting.prototype.logger =\n    goog.log.getLogger('goog.tweak.NumericSetting');\n\n\n/**\n * @override\n * @return {number} The tweaks's value.\n */\ngoog.tweak.NumericSetting.prototype.getValue;\n\n\n/**\n * @override\n * @return {number} The tweaks's new value.\n */\ngoog.tweak.NumericSetting.prototype.getNewValue;\n\n\n/**\n * @override\n * @param {number} value The tweaks's value.\n */\ngoog.tweak.NumericSetting.prototype.setValue;\n\n\n/**\n * @override\n * @param {number} value The default value.\n */\ngoog.tweak.NumericSetting.prototype.setDefaultValue;\n\n\n/**\n * @override\n * @return {number} The default value.\n */\ngoog.tweak.NumericSetting.prototype.getDefaultValue;\n\n\n/**\n * @override\n */\ngoog.tweak.NumericSetting.prototype.encodeNewValue = function() {\n  return '' + this.getNewValue();\n};\n\n\n/**\n * Sets the valid values for the setting.\n * @param {Array<number>|undefined} values Valid values.\n */\ngoog.tweak.NumericSetting.prototype.setValidValues = function(values) {\n  this.assertNotInitialized('setValidValues');\n  this.validValues_ = values;\n  // Set the default value to the first value in the list if the current\n  // default value is not within it.\n  if (values && !goog.array.contains(values, this.getDefaultValue())) {\n    this.setDefaultValue(values[0]);\n  }\n};\n\n\n/**\n * Returns the valid values for the setting.\n * @return {Array<number>|undefined} Valid values.\n */\ngoog.tweak.NumericSetting.prototype.getValidValues = function() {\n  return this.validValues_;\n};\n\n\n/**\n * @override\n */\ngoog.tweak.NumericSetting.prototype.initialize = function(value) {\n  if (value == null) {\n    this.setValue(this.getDefaultValue());\n  } else {\n    var coercedValue = +value;\n    // Warn if the value is not in the list of allowed values.\n    if (this.validValues_ &&\n        !goog.array.contains(this.validValues_, coercedValue)) {\n      goog.log.warning(\n          this.logger, 'Tweak ' + this.getId() +\n              ' has value outside of expected range: ' + value);\n    }\n\n    if (isNaN(coercedValue)) {\n      goog.log.warning(\n          this.logger, 'Tweak ' + this.getId() +\n              ' has value of NaN, resetting to ' + this.getDefaultValue());\n      this.setValue(this.getDefaultValue());\n    } else {\n      this.setValue(coercedValue);\n    }\n  }\n};\n\n\n\n/**\n * A registry setting that can be either true of false.\n * @param {string} id The ID for the setting.\n * @param {string} description A description of what the setting does.\n * @constructor\n * @extends {goog.tweak.BasePrimitiveSetting}\n */\ngoog.tweak.BooleanSetting = function(id, description) {\n  goog.tweak.BasePrimitiveSetting.call(this, id, description, false);\n};\ngoog.inherits(goog.tweak.BooleanSetting, goog.tweak.BasePrimitiveSetting);\n\n\n/**\n * The logger for this class.\n * @type {goog.log.Logger}\n * @protected\n * @override\n */\ngoog.tweak.BooleanSetting.prototype.logger =\n    goog.log.getLogger('goog.tweak.BooleanSetting');\n\n\n/**\n * @override\n * @return {boolean} The tweaks's value.\n */\ngoog.tweak.BooleanSetting.prototype.getValue;\n\n\n/**\n * @override\n * @return {boolean} The tweaks's new value.\n */\ngoog.tweak.BooleanSetting.prototype.getNewValue;\n\n\n/**\n * @override\n * @param {boolean} value The tweaks's value.\n */\ngoog.tweak.BooleanSetting.prototype.setValue;\n\n\n/**\n * @override\n * @param {boolean} value The default value.\n */\ngoog.tweak.BooleanSetting.prototype.setDefaultValue;\n\n\n/**\n * @override\n * @return {boolean} The default value.\n */\ngoog.tweak.BooleanSetting.prototype.getDefaultValue;\n\n\n/**\n * @override\n */\ngoog.tweak.BooleanSetting.prototype.encodeNewValue = function() {\n  return this.getNewValue() ? '1' : '0';\n};\n\n\n/**\n * @override\n */\ngoog.tweak.BooleanSetting.prototype.initialize = function(value) {\n  if (value == null) {\n    this.setValue(this.getDefaultValue());\n  } else {\n    value = value.toLowerCase();\n    this.setValue(value == 'true' || value == '1');\n  }\n};\n\n\n\n/**\n * An entry in a BooleanGroup.\n * @param {string} id The ID for the setting.\n * @param {string} description A description of what the setting does.\n * @param {!goog.tweak.BooleanGroup} group The group that this entry belongs\n *     to.\n * @constructor\n * @extends {goog.tweak.BooleanSetting}\n * @final\n */\ngoog.tweak.BooleanInGroupSetting = function(id, description, group) {\n  goog.tweak.BooleanSetting.call(this, id, description);\n\n  /**\n   * The token to use in the query parameter.\n   * @type {string}\n   * @private\n   */\n  this.token_ = this.getId().toLowerCase();\n\n  /**\n   * The BooleanGroup that this setting belongs to.\n   * @type {!goog.tweak.BooleanGroup}\n   * @private\n   */\n  this.group_ = group;\n\n  // Take setting out of top-level query parameter list.\n  goog.tweak.BooleanInGroupSetting.superClass_.setParamName.call(this, null);\n};\ngoog.inherits(goog.tweak.BooleanInGroupSetting, goog.tweak.BooleanSetting);\n\n\n/**\n * The logger for this class.\n * @type {goog.log.Logger}\n * @protected\n * @override\n */\ngoog.tweak.BooleanInGroupSetting.prototype.logger =\n    goog.log.getLogger('goog.tweak.BooleanInGroupSetting');\n\n\n/**\n * @override\n */\ngoog.tweak.BooleanInGroupSetting.prototype.setParamName = function(value) {\n  goog.asserts.fail('Use setToken() for BooleanInGroupSetting.');\n};\n\n\n/**\n * Sets the token to use in the query parameter.\n * @param {string} value The value.\n */\ngoog.tweak.BooleanInGroupSetting.prototype.setToken = function(value) {\n  this.token_ = value;\n};\n\n\n/**\n * Returns the token to use in the query parameter.\n * @return {string} The value.\n */\ngoog.tweak.BooleanInGroupSetting.prototype.getToken = function() {\n  return this.token_;\n};\n\n\n/**\n * Returns the BooleanGroup that this setting belongs to.\n * @return {!goog.tweak.BooleanGroup} The BooleanGroup that this setting\n *     belongs to.\n */\ngoog.tweak.BooleanInGroupSetting.prototype.getGroup = function() {\n  return this.group_;\n};\n\n\n\n/**\n * A registry setting that contains a group of boolean subfield, where all\n * entries modify the same query parameter. For example:\n *     ?foo=setting1,-setting2\n * @param {string} id The ID for the setting.\n * @param {string} description A description of what the setting does.\n * @constructor\n * @extends {goog.tweak.BaseSetting}\n * @final\n */\ngoog.tweak.BooleanGroup = function(id, description) {\n  goog.tweak.BaseSetting.call(this, id, description);\n\n  /**\n   * A map of token->child entry.\n   * @type {!Object<!goog.tweak.BooleanSetting>}\n   * @private\n   */\n  this.entriesByToken_ = {};\n\n\n  /**\n   * A map of token->true/false for all tokens that appeared in the query\n   * parameter.\n   * @type {!Object<boolean>}\n   * @private\n   */\n  this.queryParamValues_ = {};\n\n};\ngoog.inherits(goog.tweak.BooleanGroup, goog.tweak.BaseSetting);\n\n\n/**\n * The logger for this class.\n * @type {goog.log.Logger}\n * @protected\n * @override\n */\ngoog.tweak.BooleanGroup.prototype.logger =\n    goog.log.getLogger('goog.tweak.BooleanGroup');\n\n\n/**\n * Returns the map of token->boolean settings.\n * @return {!Object<!goog.tweak.BooleanSetting>} The child settings.\n */\ngoog.tweak.BooleanGroup.prototype.getChildEntries = function() {\n  return this.entriesByToken_;\n};\n\n\n/**\n * Adds the given BooleanSetting to the group.\n * @param {goog.tweak.BooleanInGroupSetting} boolEntry The entry.\n */\ngoog.tweak.BooleanGroup.prototype.addChild = function(boolEntry) {\n  this.ensureInitialized();\n\n  var token = boolEntry.getToken();\n  var lcToken = token.toLowerCase();\n  goog.asserts.assert(\n      !this.entriesByToken_[lcToken],\n      'Multiple bools registered with token \"%s\" in group: %s', token,\n      this.getId());\n  this.entriesByToken_[lcToken] = boolEntry;\n\n  // Initialize from query param.\n  var value = this.queryParamValues_[lcToken];\n  if (value != undefined) {\n    boolEntry.initialQueryParamValue = value ? '1' : '0';\n  }\n};\n\n\n/**\n * @override\n */\ngoog.tweak.BooleanGroup.prototype.initialize = function(value) {\n  var queryParamValues = {};\n\n  if (value) {\n    var tokens = value.split(/\\s*,\\s*/);\n    for (var i = 0; i < tokens.length; ++i) {\n      var token = tokens[i].toLowerCase();\n      var negative = token.charAt(0) == '-';\n      if (negative) {\n        token = token.substr(1);\n      }\n      queryParamValues[token] = !negative;\n    }\n  }\n  this.queryParamValues_ = queryParamValues;\n};\n\n\n/**\n * @override\n */\ngoog.tweak.BooleanGroup.prototype.getNewValueEncoded = function() {\n  this.ensureInitialized();\n  var nonDefaultValues = [];\n  // Sort the keys so that the generate value is stable.\n  var keys = goog.object.getKeys(this.entriesByToken_);\n  keys.sort();\n  for (var i = 0, entry; entry = this.entriesByToken_[keys[i]]; ++i) {\n    var encodedValue = entry.getNewValueEncoded();\n    if (encodedValue != null) {\n      nonDefaultValues.push(\n          (entry.getNewValue() ? '' : '-') + entry.getToken());\n    }\n  }\n  return nonDefaultValues.length ? nonDefaultValues.join(',') : null;\n};\n\n\n\n/**\n * A registry action (a button).\n * @param {string} id The ID for the setting.\n * @param {string} description A description of what the setting does.\n * @param {!Function} callback Function to call when the button is clicked.\n * @constructor\n * @extends {goog.tweak.BaseEntry}\n * @final\n */\ngoog.tweak.ButtonAction = function(id, description, callback) {\n  goog.tweak.BaseEntry.call(this, id, description);\n  this.addCallback(callback);\n  this.setRestartRequired(false);\n};\ngoog.inherits(goog.tweak.ButtonAction, goog.tweak.BaseEntry);\n","^AK",1579837703000,"^AL",["^AM",["^BB","^AA","^B:","^CP","^AR"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/tweak/entries.js"],"^B6",["^AM",["~$goog.tweak.BaseSetting","~$goog.tweak.StringSetting","~$goog.tweak.NumericSetting","~$goog.tweak.BooleanInGroupSetting","~$goog.tweak.BooleanSetting","~$goog.tweak.BooleanGroup","~$goog.tweak.BaseEntry","~$goog.tweak.ButtonAction","~$goog.tweak.BasePrimitiveSetting"]],"^A?",true,"^A@",["^AA","^AR","^BB","^CP","^B:"]],["^ ","^AC",[1579837703000],"^AD","goog.vec.vec2d.js","^AE",["^AF","goog/vec/vec2d.js"],"^AG","goog/vec/vec2d.js","^AH","^AI","^AJ","// Copyright 2013 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n//                                                                           //\n// Any edits to this file must be applied to vec2f.js by running:            //\n//   swap_type.sh vec2d.js > vec2f.js                                        //\n//                                                                           //\n////////////////////////// NOTE ABOUT EDITING THIS FILE ///////////////////////\n\n\n/**\n * @fileoverview Provides functions for operating on 2 element double (64bit)\n * vectors.\n *\n * The last parameter will typically be the output object and an object\n * can be both an input and output parameter to all methods except where\n * noted.\n *\n * See the README for notes about the design and structure of the API\n * (especially related to performance).\n *\n */\n\ngoog.provide('goog.vec.vec2d');\ngoog.provide('goog.vec.vec2d.Type');\n\n/** @suppress {extraRequire} */\ngoog.require('goog.vec');\n\n\n/** @typedef {!goog.vec.Float64} */ goog.vec.vec2d.Type;\n\n\n/**\n * Creates a vec2d with all elements initialized to zero.\n *\n * @return {!goog.vec.vec2d.Type} The new vec2d.\n */\ngoog.vec.vec2d.create = function() {\n  return new Float64Array(2);\n};\n\n\n/**\n * Creates a new vec2d initialized with the value from the given array.\n *\n * @param {!Array<number>} vec The source 2 element array.\n * @return {!goog.vec.vec2d.Type} The new vec2d.\n */\ngoog.vec.vec2d.createFromArray = function(vec) {\n  var newVec = goog.vec.vec2d.create();\n  goog.vec.vec2d.setFromArray(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Creates a new vec2d initialized with the supplied values.\n *\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @return {!goog.vec.vec2d.Type} The new vector.\n */\ngoog.vec.vec2d.createFromValues = function(v0, v1) {\n  var vec = goog.vec.vec2d.create();\n  goog.vec.vec2d.setFromValues(vec, v0, v1);\n  return vec;\n};\n\n\n/**\n * Creates a clone of the given vec2d.\n *\n * @param {!goog.vec.vec2d.Type} vec The source vec2d.\n * @return {!goog.vec.vec2d.Type} The new cloned vec2d.\n */\ngoog.vec.vec2d.clone = function(vec) {\n  var newVec = goog.vec.vec2d.create();\n  goog.vec.vec2d.setFromVec2d(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Initializes the vector with the given values.\n *\n * @param {!goog.vec.vec2d.Type} vec The vector to receive the values.\n * @param {number} v0 The value for element at index 0.\n * @param {number} v1 The value for element at index 1.\n * @return {!goog.vec.vec2d.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.setFromValues = function(vec, v0, v1) {\n  vec[0] = v0;\n  vec[1] = v1;\n  return vec;\n};\n\n\n/**\n * Initializes vec2d vec from vec2d src.\n *\n * @param {!goog.vec.vec2d.Type} vec The destination vector.\n * @param {!goog.vec.vec2d.Type} src The source vector.\n * @return {!goog.vec.vec2d.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.setFromVec2d = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  return vec;\n};\n\n\n/**\n * Initializes vec2d vec from vec2f src (typed as a Float32Array to\n * avoid circular goog.requires).\n *\n * @param {!goog.vec.vec2d.Type} vec The destination vector.\n * @param {Float32Array} src The source vector.\n * @return {!goog.vec.vec2d.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.setFromVec2f = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  return vec;\n};\n\n\n/**\n * Initializes vec2d vec from Array src.\n *\n * @param {!goog.vec.vec2d.Type} vec The destination vector.\n * @param {Array<number>} src The source vector.\n * @return {!goog.vec.vec2d.Type} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.setFromArray = function(vec, src) {\n  vec[0] = src[0];\n  vec[1] = src[1];\n  return vec;\n};\n\n\n/**\n * Performs a component-wise addition of vec0 and vec1 together storing the\n * result into resultVec.\n *\n * @param {!goog.vec.vec2d.Type} vec0 The first addend.\n * @param {!goog.vec.vec2d.Type} vec1 The second addend.\n * @param {!goog.vec.vec2d.Type} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.vec2d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.add = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] + vec1[0];\n  resultVec[1] = vec0[1] + vec1[1];\n  return resultVec;\n};\n\n\n/**\n * Performs a component-wise subtraction of vec1 from vec0 storing the\n * result into resultVec.\n *\n * @param {!goog.vec.vec2d.Type} vec0 The minuend.\n * @param {!goog.vec.vec2d.Type} vec1 The subtrahend.\n * @param {!goog.vec.vec2d.Type} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.vec2d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.subtract = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] - vec1[0];\n  resultVec[1] = vec0[1] - vec1[1];\n  return resultVec;\n};\n\n\n/**\n * Multiplies each component of vec0 with the matching element of vec0\n * storing the products into resultVec.\n *\n * @param {!goog.vec.vec2d.Type} vec0 The first vector.\n * @param {!goog.vec.vec2d.Type} vec1 The second vector.\n * @param {!goog.vec.vec2d.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec2d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.componentMultiply = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] * vec1[0];\n  resultVec[1] = vec0[1] * vec1[1];\n  return resultVec;\n};\n\n\n/**\n * Divides each component of vec0 with the matching element of vec0\n * storing the divisor into resultVec.\n *\n * @param {!goog.vec.vec2d.Type} vec0 The first vector.\n * @param {!goog.vec.vec2d.Type} vec1 The second vector.\n * @param {!goog.vec.vec2d.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec2d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.componentDivide = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] / vec1[0];\n  resultVec[1] = vec0[1] / vec1[1];\n  return resultVec;\n};\n\n\n/**\n * Negates vec0, storing the result into resultVec.\n *\n * @param {!goog.vec.vec2d.Type} vec0 The vector to negate.\n * @param {!goog.vec.vec2d.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec2d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.negate = function(vec0, resultVec) {\n  resultVec[0] = -vec0[0];\n  resultVec[1] = -vec0[1];\n  return resultVec;\n};\n\n\n/**\n * Takes the absolute value of each component of vec0 storing the result in\n * resultVec.\n *\n * @param {!goog.vec.vec2d.Type} vec0 The source vector.\n * @param {!goog.vec.vec2d.Type} resultVec The vector to receive the result.\n *     May be vec0.\n * @return {!goog.vec.vec2d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.abs = function(vec0, resultVec) {\n  resultVec[0] = Math.abs(vec0[0]);\n  resultVec[1] = Math.abs(vec0[1]);\n  return resultVec;\n};\n\n\n/**\n * Multiplies each component of vec0 with scalar storing the product into\n * resultVec.\n *\n * @param {!goog.vec.vec2d.Type} vec0 The source vector.\n * @param {number} scalar The value to multiply with each component of vec0.\n * @param {!goog.vec.vec2d.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec2d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.scale = function(vec0, scalar, resultVec) {\n  resultVec[0] = vec0[0] * scalar;\n  resultVec[1] = vec0[1] * scalar;\n  return resultVec;\n};\n\n\n/**\n * Returns the magnitudeSquared of the given vector.\n *\n * @param {!goog.vec.vec2d.Type} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.vec2d.magnitudeSquared = function(vec0) {\n  var x = vec0[0], y = vec0[1];\n  return x * x + y * y;\n};\n\n\n/**\n * Returns the magnitude of the given vector.\n *\n * @param {!goog.vec.vec2d.Type} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.vec2d.magnitude = function(vec0) {\n  var x = vec0[0], y = vec0[1];\n  return Math.sqrt(x * x + y * y);\n};\n\n\n/**\n * Normalizes the given vector storing the result into resultVec.\n *\n * @param {!goog.vec.vec2d.Type} vec0 The vector to normalize.\n * @param {!goog.vec.vec2d.Type} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.vec2d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.normalize = function(vec0, resultVec) {\n  var x = vec0[0], y = vec0[1];\n  var ilen = 1 / Math.sqrt(x * x + y * y);\n  resultVec[0] = x * ilen;\n  resultVec[1] = y * ilen;\n  return resultVec;\n};\n\n\n/**\n * Returns the scalar product of vectors vec0 and vec1.\n *\n * @param {!goog.vec.vec2d.Type} vec0 The first vector.\n * @param {!goog.vec.vec2d.Type} vec1 The second vector.\n * @return {number} The scalar product.\n */\ngoog.vec.vec2d.dot = function(vec0, vec1) {\n  return vec0[0] * vec1[0] + vec0[1] * vec1[1];\n};\n\n\n/**\n * Returns the squared distance between two points.\n *\n * @param {!goog.vec.vec2d.Type} vec0 First point.\n * @param {!goog.vec.vec2d.Type} vec1 Second point.\n * @return {number} The squared distance between the points.\n */\ngoog.vec.vec2d.distanceSquared = function(vec0, vec1) {\n  var x = vec0[0] - vec1[0];\n  var y = vec0[1] - vec1[1];\n  return x * x + y * y;\n};\n\n\n/**\n * Returns the distance between two points.\n *\n * @param {!goog.vec.vec2d.Type} vec0 First point.\n * @param {!goog.vec.vec2d.Type} vec1 Second point.\n * @return {number} The distance between the points.\n */\ngoog.vec.vec2d.distance = function(vec0, vec1) {\n  return Math.sqrt(goog.vec.vec2d.distanceSquared(vec0, vec1));\n};\n\n\n/**\n * Returns a unit vector pointing from one point to another.\n * If the input points are equal then the result will be all zeros.\n *\n * @param {!goog.vec.vec2d.Type} vec0 Origin point.\n * @param {!goog.vec.vec2d.Type} vec1 Target point.\n * @param {!goog.vec.vec2d.Type} resultVec The vector to receive the\n *     results (may be vec0 or vec1).\n * @return {!goog.vec.vec2d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.direction = function(vec0, vec1, resultVec) {\n  var x = vec1[0] - vec0[0];\n  var y = vec1[1] - vec0[1];\n  var d = Math.sqrt(x * x + y * y);\n  if (d) {\n    d = 1 / d;\n    resultVec[0] = x * d;\n    resultVec[1] = y * d;\n  } else {\n    resultVec[0] = resultVec[1] = 0;\n  }\n  return resultVec;\n};\n\n\n/**\n * Linearly interpolate from vec0 to vec1 according to f. The value of f should\n * be in the range [0..1] otherwise the results are undefined.\n *\n * @param {!goog.vec.vec2d.Type} vec0 The first vector.\n * @param {!goog.vec.vec2d.Type} vec1 The second vector.\n * @param {number} f The interpolation factor.\n * @param {!goog.vec.vec2d.Type} resultVec The vector to receive the\n *     results (may be vec0 or vec1).\n * @return {!goog.vec.vec2d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.lerp = function(vec0, vec1, f, resultVec) {\n  var x = vec0[0], y = vec0[1];\n  resultVec[0] = (vec1[0] - x) * f + x;\n  resultVec[1] = (vec1[1] - y) * f + y;\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the larger values in resultVec.\n *\n * @param {!goog.vec.vec2d.Type} vec0 The source vector.\n * @param {!goog.vec.vec2d.Type|number} limit The limit vector or scalar.\n * @param {!goog.vec.vec2d.Type} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.vec2d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.max = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.max(vec0[0], limit);\n    resultVec[1] = Math.max(vec0[1], limit);\n  } else {\n    resultVec[0] = Math.max(vec0[0], limit[0]);\n    resultVec[1] = Math.max(vec0[1], limit[1]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the smaller values in resultVec.\n *\n * @param {!goog.vec.vec2d.Type} vec0 The source vector.\n * @param {!goog.vec.vec2d.Type|number} limit The limit vector or scalar.\n * @param {!goog.vec.vec2d.Type} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.vec2d.Type} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.vec2d.min = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.min(vec0[0], limit);\n    resultVec[1] = Math.min(vec0[1], limit);\n  } else {\n    resultVec[0] = Math.min(vec0[0], limit[0]);\n    resultVec[1] = Math.min(vec0[1], limit[1]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Returns true if the components of vec0 are equal to the components of vec1.\n *\n * @param {!goog.vec.vec2d.Type} vec0 The first vector.\n * @param {!goog.vec.vec2d.Type} vec1 The second vector.\n * @return {boolean} True if the vectors are equal, false otherwise.\n */\ngoog.vec.vec2d.equals = function(vec0, vec1) {\n  return vec0.length == vec1.length && vec0[0] == vec1[0] && vec0[1] == vec1[1];\n};\n","^AK",1579837703000,"^AL",["^AM",["~$goog.vec","^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/vec2d.js"],"^B6",["^AM",["~$goog.vec.vec2d","~$goog.vec.vec2d.Type"]],"^A?",true,"^A@",["^AA","^E?"]],["^ ","^AC",[1579837703000],"^AD","goog.date.relative.js","^AE",["^AF","goog/date/relative.js"],"^AG","goog/date/relative.js","^AH","^AI","^AJ","// Copyright 2009 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Functions for formatting relative dates.  Such as \"3 days ago\"\n * \"3 hours ago\", \"14 minutes ago\", \"12 days ago\", \"Today\", \"Yesterday\".\n *\n * Closure's I18N formatter for relative dates and times is by default to\n * format strings function. It provides plural forms and many locales\n * using standard data from the Common Data Locale Repository (CLDR).\n *\n */\n\ngoog.provide('goog.date.relative');\ngoog.provide('goog.date.relative.TimeDeltaFormatter');\ngoog.provide('goog.date.relative.Unit');\n\ngoog.require('goog.i18n.DateTimeFormat');\ngoog.require('goog.i18n.DateTimePatterns');\ngoog.require('goog.i18n.RelativeDateTimeFormat');\n\ngoog.scope(function() {\n// For referencing this module.\nvar RelativeDateTimeFormat =\n    goog.module.get('goog.i18n.RelativeDateTimeFormat');\n\n/**\n * Number of milliseconds in a minute.\n * @type {number}\n * @private\n */\ngoog.date.relative.MINUTE_MS_ = 60000;\n\n\n/**\n * Number of milliseconds in a day.\n * @type {number}\n * @private\n */\ngoog.date.relative.DAY_MS_ = 86400000;\n\n\n/**\n * Limit on number of days in past or future for formatting.\n * Since the timestamp is in milliseconds, the difference in days\n * is limited (10^9 milliseconds = 11.6 days.)\n * @type {number}\n * @private\n */\ngoog.date.relative.FORTNIGHT_ = 14;\n\n\n/**\n * Unicode UTF-16 surrogate range minimum\n * @type {number}\n * @private\n */\ngoog.date.relative.SURROGATE_LOW_ = 0xd800;\n\n\n/**\n * Unicode UTF-16 surrogate range maximum\n * @type {number}\n * @private\n */\ngoog.date.relative.SURROGATE_HIGH_ = 0xdfff;\n\n\n/**\n * Enumeration used to identify time units internally.\n * @enum {number}\n */\ngoog.date.relative.Unit = {\n  MINUTES: 0,\n  HOURS: 1,\n  DAYS: 2\n};\n\n\n/**\n * Full date formatter.\n * @type {?goog.i18n.DateTimeFormat}\n * @private\n */\ngoog.date.relative.fullDateFormatter_;\n\n\n/**\n * Short time formatter.\n * @type {?goog.i18n.DateTimeFormat}\n * @private\n */\ngoog.date.relative.shortTimeFormatter_;\n\n\n/**\n * Month-date formatter.\n * @type {?goog.i18n.DateTimeFormat}\n * @private\n */\ngoog.date.relative.monthDateFormatter_;\n\n\n/**\n * Casing mode: default true for backward compatibility\n * True causes formatDay to capitalize first character of\n * the returned string.\n * If false, the string is not changed.\n * @type {boolean}\n * @private\n */\ngoog.date.relative.casingMode_ = true;\n\n\n/**\n * Handles formatting of time deltas.\n * @private {?goog.date.relative.TimeDeltaFormatter}\n */\ngoog.date.relative.formatTimeDelta_;\n\n\n/**\n * Caller-settable function for formatting time. Default is internal\n * formatting using goog.i18n.RelativeDateTimeFormat\n * @typedef {function(number, boolean, !goog.date.relative.Unit): string}\n */\ngoog.date.relative.TimeDeltaFormatter;\n\n\n/**\n * Sets a different formatting function for time deltas (\"3 days ago\").\n * While its visibility is public, this function is Closure-internal and should\n * not be used in application code.\n * @param {!goog.date.relative.TimeDeltaFormatter} formatter The function to use\n *     for formatting time deltas (i.e. relative times).\n */\ngoog.date.relative.setTimeDeltaFormatter = function(formatter) {\n  goog.date.relative.formatTimeDelta_ = formatter;\n};\n\n\n/**\n * Sets casing mode to a boolean.\n * If true, the first letter of day formats (\"today\", \"yesterday\", \"tommorow\")\n * is capitalized using locale-aware toUpper.\n * If false, no casing is done on basic data.\n * @param {boolean} capitalizeMode\n */\ngoog.date.relative.setCasingMode = function(capitalizeMode) {\n  goog.date.relative.casingMode_ = capitalizeMode;\n};\n\n\n/**\n * Converts first letter of a string to upper case.\n * @param {string} text\n * @return {string}\n * @package Visible for testing\n */\ngoog.date.relative.upcase = function(text) {\n  // Note: Casing is harder than just handling the first character, so\n  // this is an approximation.\n\n  var codepointLength = 1;\n  // Check for surrogate values.\n  var codePoint0 = text.charCodeAt(0);\n  if (codePoint0 >= goog.date.relative.SURROGATE_LOW_ &&\n      codePoint0 <= goog.date.relative.SURROGATE_HIGH_) {\n    // It's a surrogate.\n    codepointLength = 2;\n  }\n  text = text.substring(0, codepointLength).toLocaleUpperCase() +\n      text.substring(codepointLength);\n  return text;\n};\n\n\n/**\n * Returns string with \"sentence casing\" for the input string, i.e.,\n * Finds Day unit in relative date time compatible values, if available.\n * then formats the result using that data.\n * If codepoints are surrogate code points, returns the string unchanged.\n * If no relative non-numeric data is available, returns null.\n *\n * @param {number} dayOffset Offset of day unit for lookup in rdtf symbols data.\n * @return {string|null}\n * @private\n */\ngoog.date.relative.relativeCasedString_ = function(dayOffset) {\n  var rdtf_formatter =\n      new RelativeDateTimeFormat(RelativeDateTimeFormat.NumericOption.AUTO);\n\n  var result =\n      rdtf_formatter.format(dayOffset, RelativeDateTimeFormat.Unit.DAY);\n\n  // Check for a digit in expected Auto results, which implies a Numeric\n  // result was actually returned.\n  // Limitation: This checks only for ASCII, Arabic, ArabicExtended digits.\n  if (!result || result.match(/[0-9\\u0660-\\u0669\\u06f0-\\u06f9]/g)) {\n    return null;\n  }\n\n  if (goog.date.relative.casingMode_) {\n    return goog.date.relative.upcase(result);\n  }\n  return result;\n};\n\n\n/**\n * Returns a date in month format, e.g. Mar 15.\n * @param {!Date} date The date object.\n * @return {string} The formatted string.\n * @private\n */\ngoog.date.relative.formatMonth_ = function(date) {\n  if (!goog.date.relative.monthDateFormatter_) {\n    goog.date.relative.monthDateFormatter_ =\n        new goog.i18n.DateTimeFormat(goog.i18n.DateTimePatterns.MONTH_DAY_ABBR);\n  }\n  return goog.date.relative.monthDateFormatter_.format(date);\n};\n\n\n/**\n * Returns a date in short-time format, e.g. 2:50 PM.\n * @param {!Date|!goog.date.DateTime} date The date object.\n * @return {string} The formatted string.\n * @private\n */\ngoog.date.relative.formatShortTime_ = function(date) {\n  if (!goog.date.relative.shortTimeFormatter_) {\n    goog.date.relative.shortTimeFormatter_ = new goog.i18n.DateTimeFormat(\n        goog.i18n.DateTimeFormat.Format.SHORT_TIME);\n  }\n  return goog.date.relative.shortTimeFormatter_.format(date);\n};\n\n\n/**\n * Returns a date in full date format, e.g. Tuesday, March 24, 2009.\n * @param {!Date|!goog.date.DateTime} date The date object.\n * @return {string} The formatted string.\n * @private\n */\ngoog.date.relative.formatFullDate_ = function(date) {\n  if (!goog.date.relative.fullDateFormatter_) {\n    goog.date.relative.fullDateFormatter_ =\n        new goog.i18n.DateTimeFormat(goog.i18n.DateTimeFormat.Format.FULL_DATE);\n  }\n  return goog.date.relative.fullDateFormatter_.format(date);\n};\n\n\n/**\n * Formats quantity and relative unit using i18n.relativedatetimeformat.\n * Converts absolute quantity and unit to relative date time compatible values,\n * then formats the result using that data.\n *\n * @param {number} absQuantity\n * @param {boolean} futureFlag\n * @param {!goog.date.relative.Unit} relUnit\n * @return {string}\n * @private\n */\ngoog.date.relative.rdtformat_ = function(absQuantity, futureFlag, relUnit) {\n  // Convert absolute value to negative for past, non-negative for future.\n  var quantity = futureFlag ? absQuantity : -absQuantity;\n\n  var rdtfFormatter = new RelativeDateTimeFormat();\n\n  var rdtfUnit;\n  switch (relUnit) {\n    case goog.date.relative.Unit.MINUTES:\n      rdtfUnit = RelativeDateTimeFormat.Unit.MINUTE;\n      break;\n    case goog.date.relative.Unit.HOURS:\n      rdtfUnit = RelativeDateTimeFormat.Unit.HOUR;\n      break;\n    default:\n    case goog.date.relative.Unit.DAYS:\n      rdtfUnit = RelativeDateTimeFormat.Unit.DAY;\n      break;\n  }\n  // Use locale-aware relatve date time formatter, compatible with ICU4C/ICU4J.\n  return rdtfFormatter.format(quantity, rdtfUnit);\n};\n\n\n/**\n * Accepts a timestamp in milliseconds and outputs a relative time in the form\n * of \"1 hour ago\", \"1 day ago\", \"in 1 hour\", \"in 2 days\" etc.  If the date\n * delta is over 2 weeks, then the output string will be empty.\n * @param {number} dateMs Date in milliseconds.\n * @return {string} The formatted date.\n */\ngoog.date.relative.format = function(dateMs) {\n  var now = goog.now();\n  var delta = Math.floor((now - dateMs) / goog.date.relative.MINUTE_MS_);\n\n  var future = false;\n\n  if (delta < 0) {\n    future = true;\n    delta *= -1;\n  }\n\n  if (delta < 60) {  // Minutes.\n    return goog.date.relative.formatTimeDelta_(\n        delta, future, goog.date.relative.Unit.MINUTES);\n\n  } else {\n    delta = Math.floor(delta / 60);\n    if (delta < 24) {  // Hours.\n      return goog.date.relative.formatTimeDelta_(\n          delta, future, goog.date.relative.Unit.HOURS);\n\n    } else {\n      // We can be more than 24 hours apart but still only 1 day apart, so we\n      // compare the closest time from today against the target time to find\n      // the number of days in the delta.\n      var midnight = new Date(goog.now());\n      midnight.setHours(0);\n      midnight.setMinutes(0);\n      midnight.setSeconds(0);\n      midnight.setMilliseconds(0);\n\n      // Convert to days ago.\n      delta =\n          Math.ceil((midnight.getTime() - dateMs) / goog.date.relative.DAY_MS_);\n\n      if (future) {\n        delta *= -1;\n      }\n\n      // Uses days for less than 2-weeks.\n      if (delta < goog.date.relative.FORTNIGHT_) {\n        return goog.date.relative.formatTimeDelta_(\n            delta, future, goog.date.relative.Unit.DAYS);\n\n      } else {\n        // For messages older than 2 weeks do not show anything.  The client\n        // should decide the date format to show.\n        return '';\n      }\n    }\n  }\n};\n\n\n/**\n * Accepts a timestamp in milliseconds and outputs a relative time in the form\n * of \"1 hour ago\", \"1 day ago\".  All future times will be returned as 0 minutes\n * ago.\n *\n * This is provided for compatibility with users of the previous incarnation of\n * the above {@see #format} method who relied on it protecting against\n * future dates.\n *\n * @param {number} dateMs Date in milliseconds.\n * @return {string} The formatted date.\n */\ngoog.date.relative.formatPast = function(dateMs) {\n  var now = goog.now();\n  if (now < dateMs) {\n    dateMs = now;\n  }\n  return goog.date.relative.format(dateMs);\n};\n\n\n/**\n * Accepts a timestamp in milliseconds and outputs a relative day. i.e. \"Today\",\n * \"Yesterday\", \"Tomorrow\", or \"Sept 15\".\n *\n * @param {number} dateMs Date in milliseconds.\n * @param {function(!Date):string=} opt_formatter Formatter for the date.\n *     Defaults to form 'MMM dd'.\n * @return {string} The formatted date.\n */\ngoog.date.relative.formatDay = function(dateMs, opt_formatter) {\n  var today = new Date(goog.now());\n\n  today.setHours(0);\n  today.setMinutes(0);\n  today.setSeconds(0);\n  today.setMilliseconds(0);\n\n  var dayOffset = (dateMs - today.getTime()) / goog.date.relative.DAY_MS_;\n\n  dayOffset = Math.floor(dayOffset);\n\n  var relativeResult = goog.date.relative.relativeCasedString_(dayOffset);\n\n  if (relativeResult) {\n    // Return the non-numeric answer such as \"ayer\" or \"tomorrow\".\n    return relativeResult;\n  }\n\n  // Use specialized formatting such as day and month when no\n  // special form for the offset is available.\n  var formatFunction = opt_formatter || goog.date.relative.formatMonth_;\n  return formatFunction(new Date(dateMs));\n};\n\n\n/**\n * Formats a date, adding the relative date in parenthesis.  If the date is less\n * than 24 hours then the time will be printed, otherwise the full-date will be\n * used.  Examples:\n *   2:20 PM (1 minute ago)\n *   Monday, February 27, 2009 (4 days ago)\n *   Tuesday, March 20, 2005    // Too long ago for a relative date.\n *\n * @param {!Date|!goog.date.DateTime} date A date object.\n * @param {string=} opt_shortTimeMsg An optional short time message can be\n *     provided if available, so that it's not recalculated in this function.\n * @param {string=} opt_fullDateMsg An optional date message can be\n *     provided if available, so that it's not recalculated in this function.\n * @return {string} The date string in the above form.\n */\ngoog.date.relative.getDateString = function(\n    date, opt_shortTimeMsg, opt_fullDateMsg) {\n  return goog.date.relative.getDateString_(\n      date, goog.date.relative.format, opt_shortTimeMsg, opt_fullDateMsg);\n};\n\n\n/**\n * Formats a date, adding the relative date in parenthesis.   Functions the same\n * as #getDateString but ensures that the date is always seen to be in the past.\n * If the date is in the future, it will be shown as 0 minutes ago.\n *\n * This is provided for compatibility with users of the previous incarnation of\n * the above {@see #getDateString} method who relied on it protecting against\n * future dates.\n *\n * @param {Date|goog.date.DateTime} date A date object.\n * @param {string=} opt_shortTimeMsg An optional short time message can be\n *     provided if available, so that it's not recalculated in this function.\n * @param {string=} opt_fullDateMsg An optional date message can be\n *     provided if available, so that it's not recalculated in this function.\n * @return {string} The date string in the above form.\n */\ngoog.date.relative.getPastDateString = function(\n    date, opt_shortTimeMsg, opt_fullDateMsg) {\n  return goog.date.relative.getDateString_(\n      date, goog.date.relative.formatPast, opt_shortTimeMsg, opt_fullDateMsg);\n};\n\n\n/**\n * Formats a date, adding the relative date in parenthesis.  If the date is less\n * than 24 hours then the time will be printed, otherwise the full-date will be\n * used.  Examples:\n *   2:20 PM (1 minute ago)\n *   Monday, February 27, 2009 (4 days ago)\n *   Tuesday, March 20, 2005    // Too long ago for a relative date.\n *\n * @param {Date|goog.date.DateTime} date A date object.\n * @param {function(number) : string} relativeFormatter Function to use when\n *     formatting the relative date.\n * @param {string=} opt_shortTimeMsg An optional short time message can be\n *     provided if available, so that it's not recalculated in this function.\n * @param {string=} opt_fullDateMsg An optional date message can be\n *     provided if available, so that it's not recalculated in this function.\n * @return {string} The date string in the above form.\n * @private\n */\ngoog.date.relative.getDateString_ = function(\n    date, relativeFormatter, opt_shortTimeMsg, opt_fullDateMsg) {\n  var dateMs = date.getTime();\n\n  var relativeDate = relativeFormatter(dateMs);\n\n  if (relativeDate) {\n    relativeDate = ' (' + relativeDate + ')';\n  }\n\n  var delta = Math.floor((goog.now() - dateMs) / goog.date.relative.MINUTE_MS_);\n  if (delta < 60 * 24) {\n    // TODO(user): this call raises an exception if date is a goog.date.Date.\n    return (opt_shortTimeMsg || goog.date.relative.formatShortTime_(date)) +\n        relativeDate;\n  } else {\n    return (opt_fullDateMsg || goog.date.relative.formatFullDate_(date)) +\n        relativeDate;\n  }\n};\n});  // End of scope for RelativeDateTimeFormat.\n\n// Set default formatter for date/time.\ngoog.date.relative.setTimeDeltaFormatter(goog.date.relative.rdtformat_);\n","^AK",1579837703000,"^AL",["^AM",["~$goog.i18n.RelativeDateTimeFormat","~$goog.i18n.DateTimeFormat","^AA","^AB"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/date/relative.js"],"^B6",["^AM",["~$goog.date.relative.TimeDeltaFormatter","~$goog.date.relative","~$goog.date.relative.Unit"]],"^A?",true,"^A@",["^AA","^EC","^AB","^EB"]],["^ ","^AC",[1579837703000],"^AD","goog.debug.errorhandlerweakdep.js","^AE",["^AF","goog/debug/errorhandlerweakdep.js"],"^AG","goog/debug/errorhandlerweakdep.js","^AH","^AI","^AJ","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview File which defines dummy object to work around undefined\n * properties compiler warning for weak dependencies on\n * {@link goog.debug.ErrorHandler#protectEntryPoint}.\n *\n */\n\ngoog.provide('goog.debug.errorHandlerWeakDep');\n\n\n/**\n * Dummy object to work around undefined properties compiler warning.\n * @type {!Object<string,Function>}\n */\ngoog.debug.errorHandlerWeakDep = {\n  /**\n   * @param {Function} fn An entry point function to be protected.\n   * @param {boolean=} opt_tracers Whether to install tracers around the\n   *     fn.\n   * @return {Function} A protected wrapper function that calls the\n   *     entry point function.\n   */\n  protectEntryPoint: function(fn, opt_tracers) { return fn; }\n};\n","^AK",1579837703000,"^AL",["^AM",["^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/debug/errorhandlerweakdep.js"],"^B6",["^AM",["~$goog.debug.errorHandlerWeakDep"]],"^A?",true,"^A@",["^AA"]],["^ ","^AC",[1579837703000],"^AD","goog.net.streams.xhrnodereadablestream.js","^AE",["^AF","goog/net/streams/xhrnodereadablestream.js"],"^AG","goog/net/streams/xhrnodereadablestream.js","^AH","^AI","^AJ","// Copyright 2015 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview adaptor of XhrStreamReader to the NodeReadableStream interface.\n */\n\ngoog.provide('goog.net.streams.XhrNodeReadableStream');\n\ngoog.require('goog.array');\ngoog.require('goog.log');\ngoog.require('goog.net.streams.NodeReadableStream');\ngoog.require('goog.net.streams.XhrStreamReader');\n\n\n\n/**\n * The XhrNodeReadableStream class.\n *\n * @param {!goog.net.streams.XhrStreamReader} xhrReader The XhrStreamReader\n *    object that handles the events of the underlying Xhr.\n * @constructor\n * @implements {goog.net.streams.NodeReadableStream}\n * @struct\n * @final\n * @package\n */\ngoog.net.streams.XhrNodeReadableStream = function(xhrReader) {\n  /**\n   * @const\n   * @private {?goog.log.Logger} the logger.\n   */\n  this.logger_ = goog.log.getLogger('goog.net.streams.XhrNodeReadableStream');\n\n\n  /**\n   * The xhr reader.\n   *\n   * @private {!goog.net.streams.XhrStreamReader} the xhr reader.\n   */\n  this.xhrReader_ = xhrReader;\n\n  this.xhrReader_.setDataHandler(goog.bind(this.onData_, this));\n  this.xhrReader_.setStatusHandler(goog.bind(this.onStatusChange_, this));\n\n  /**\n   * The callback map, keyed by eventTypes.\n   *\n   * @private {!Object<Array<function(!Object=)>>}\n   */\n  this.callbackMap_ = {};\n\n  /**\n   * The callback-once map, keyed by eventTypes.\n   *\n   * @private {!Object<Array<function(!Object=)>>}\n   */\n  this.callbackOnceMap_ = {};\n};\n\n\n/**\n * @override\n */\ngoog.net.streams.XhrNodeReadableStream.prototype.on = function(\n    eventType, callback) {\n  var callbacks = this.callbackMap_[eventType];\n  if (!callbacks) {\n    callbacks = [];\n    this.callbackMap_[eventType] = callbacks;\n  }\n\n  callbacks.push(callback);\n  return this;\n};\n\n\n/**\n * @override\n */\ngoog.net.streams.XhrNodeReadableStream.prototype.addListener = function(\n    eventType, callback) {\n  this.on(eventType, callback);\n  return this;\n};\n\n\n/**\n * @override\n */\ngoog.net.streams.XhrNodeReadableStream.prototype.removeListener = function(\n    eventType, callback) {\n  var callbacks = this.callbackMap_[eventType];\n  if (callbacks) {\n    goog.array.remove(callbacks, callback);  // keep the empty array\n  }\n\n  var onceCallbacks = this.callbackOnceMap_[eventType];\n  if (onceCallbacks) {\n    goog.array.remove(onceCallbacks, callback);\n  }\n\n  return this;\n};\n\n\n/**\n * @override\n */\ngoog.net.streams.XhrNodeReadableStream.prototype.once = function(\n    eventType, callback) {\n  var callbacks = this.callbackOnceMap_[eventType];\n  if (!callbacks) {\n    callbacks = [];\n    this.callbackOnceMap_[eventType] = callbacks;\n  }\n\n  callbacks.push(callback);\n  return this;\n};\n\n\n/**\n * Handles any new data from XHR.\n *\n * @param {!Array<!Object>} messages New messages, to be delivered in order\n *    and atomically.\n * @private\n */\ngoog.net.streams.XhrNodeReadableStream.prototype.onData_ = function(messages) {\n  var callbacks =\n      this.callbackMap_[goog.net.streams.NodeReadableStream.EventType.DATA];\n  if (callbacks) {\n    this.doMessages_(messages, callbacks);\n  }\n\n  var onceCallbacks =\n      this.callbackOnceMap_[goog.net.streams.NodeReadableStream.EventType.DATA];\n  if (onceCallbacks) {\n    this.doMessages_(messages, onceCallbacks);\n  }\n  this.callbackOnceMap_[goog.net.streams.NodeReadableStream.EventType.DATA] =\n      [];\n};\n\n\n/**\n * Deliver messages to registered callbacks.\n *\n * Exceptions are caught and logged (debug), and ignored otherwise.\n *\n * @param {!Array<!Object>} messages The messages to be delivered\n * @param {!Array<function(!Object=)>} callbacks The callbacks.\n * @private\n */\ngoog.net.streams.XhrNodeReadableStream.prototype.doMessages_ = function(\n    messages, callbacks) {\n  var self = this;\n  for (var i = 0; i < messages.length; i++) {\n    var message = messages[i];\n\n    goog.array.forEach(callbacks, function(callback) {\n      try {\n        callback(message);\n      } catch (ex) {\n        self.handleError_('message-callback exception (ignored) ' + ex);\n      }\n    });\n  }\n};\n\n\n/**\n * Handles any state changes from XHR.\n *\n * @private\n */\ngoog.net.streams.XhrNodeReadableStream.prototype.onStatusChange_ = function() {\n  var currentStatus = this.xhrReader_.getStatus();\n  var Status = goog.net.streams.XhrStreamReader.Status;\n  var EventType = goog.net.streams.NodeReadableStream.EventType;\n\n  switch (currentStatus) {\n    case Status.ACTIVE:\n      this.doStatus_(EventType.READABLE);\n      break;\n\n    case Status.BAD_DATA:\n    case Status.HANDLER_EXCEPTION:\n    case Status.NO_DATA:\n    case Status.TIMEOUT:\n    case Status.XHR_ERROR:\n      this.doStatus_(EventType.ERROR);\n      break;\n\n    case Status.CANCELLED:\n      this.doStatus_(EventType.CLOSE);\n      break;\n\n    case Status.SUCCESS:\n      this.doStatus_(EventType.END);\n      break;\n  }\n};\n\n\n/**\n * Run status change callbacks.\n *\n * @param {string} eventType The event type\n * @private\n */\ngoog.net.streams.XhrNodeReadableStream.prototype.doStatus_ = function(\n    eventType) {\n  var callbacks = this.callbackMap_[eventType];\n  var self = this;\n  if (callbacks) {\n    goog.array.forEach(callbacks, function(callback) {\n      try {\n        callback();\n      } catch (ex) {\n        self.handleError_('status-callback exception (ignored) ' + ex);\n      }\n    });\n  }\n\n  var onceCallbacks = this.callbackOnceMap_[eventType];\n  if (onceCallbacks) {\n    goog.array.forEach(onceCallbacks, function(callback) { callback(); });\n  }\n\n  this.callbackOnceMap_[eventType] = [];\n};\n\n\n/**\n * Log an error\n *\n * @param {string} message The error message\n * @private\n */\ngoog.net.streams.XhrNodeReadableStream.prototype.handleError_ = function(\n    message) {\n  goog.log.error(this.logger_, message);\n};\n","^AK",1579837703000,"^AL",["^AM",["~$goog.net.streams.NodeReadableStream","^AA","^CP","~$goog.net.streams.XhrStreamReader","^AR"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/net/streams/xhrnodereadablestream.js"],"^B6",["^AM",["~$goog.net.streams.XhrNodeReadableStream"]],"^A?",true,"^A@",["^AA","^AR","^CP","^EH","^EI"]],["^ ","^AC",[1579837703000],"^B?",true,"^AD","goog.streams.lite_native_impl.js","^AE",["^AF","goog/streams/lite_native_impl.js"],"^AG","goog/streams/lite_native_impl.js","^AH","^AI","^AJ","// Copyright 2019 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview A lite polyfill of the ReadableStream native API with a subset\n * of methods supported that uses the native ReadableStream.\n */\ngoog.module('goog.streams.liteNativeImpl');\n\nconst liteTypes = goog.require('goog.streams.liteTypes');\n\n/**\n * @template T\n * @implements {liteTypes.ReadableStream<T>}\n */\nclass NativeReadableStream {\n  /**\n   * @param {!ReadableStream} stream\n   */\n  constructor(stream) {\n    /** @protected @const {!ReadableStream} */\n    this.stream = stream;\n  }\n\n  /** @override */\n  get locked() {\n    return this.stream.locked;\n  }\n\n  /** @override */\n  getReader() {\n    return new NativeReadableStreamDefaultReader(\n        /** @type {!ReadableStreamDefaultReader} */ (this.stream.getReader()));\n  }\n}\n\n/**\n * @param {!liteTypes.ReadableStreamUnderlyingSource<T>} underlyingSource\n * @return {!NativeReadableStream<T>}\n * @suppress {strictMissingProperties}\n * @template T\n */\nfunction newReadableStream(underlyingSource) {\n  /** @const {!ReadableStreamSource} */\n  const source = {\n    start(controller) {\n      return underlyingSource.start(\n          new NativeReadableStreamDefaultController(controller));\n    },\n  };\n  const stream = new ReadableStream(source);\n  return new NativeReadableStream(stream);\n}\n\n/**\n * @template T\n * @implements {liteTypes.ReadableStreamDefaultReader<T>}\n */\nclass NativeReadableStreamDefaultReader {\n  /**\n   * @param {!ReadableStreamDefaultReader} reader\n   */\n  constructor(reader) {\n    /** @protected @const {!ReadableStreamDefaultReader} */\n    this.reader = reader;\n  }\n\n  /** @override */\n  get closed() {\n    return this.reader.closed;\n  }\n\n  /** @override */\n  read() {\n    return this.reader.read();\n  }\n\n  /** @override */\n  releaseLock() {\n    this.reader.releaseLock();\n  }\n}\n\n/**\n * @template T\n * @implements {liteTypes.ReadableStreamDefaultController<T>}\n */\nclass NativeReadableStreamDefaultController {\n  /**\n   * @param {!ReadableStreamDefaultController} controller\n   */\n  constructor(controller) {\n    /** @protected @const {!ReadableStreamDefaultController} */\n    this.controller = controller;\n  }\n\n  /** @override */\n  close() {\n    this.controller.close();\n  }\n\n  /** @override */\n  enqueue(chunk) {\n    this.controller.enqueue(chunk);\n  }\n\n  /** @override */\n  error(e) {\n    this.controller.error(e);\n  }\n}\n\nexports = {\n  NativeReadableStream,\n  NativeReadableStreamDefaultController,\n  NativeReadableStreamDefaultReader,\n  newReadableStream,\n};\n","^AK",1579837703000,"^AL",["^AM",["^AA","~$goog.streams.liteTypes"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/streams/lite_native_impl.js"],"^B6",["^AM",["~$goog.streams.liteNativeImpl"]],"^A?",true,"^A@",["^AA","^EK"]],["^ ","^AC",[1579837703000],"^AD","goog.dom.nodeoffset.js","^AE",["^AF","goog/dom/nodeoffset.js"],"^AG","goog/dom/nodeoffset.js","^AH","^AI","^AJ","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Object to store the offset from one node to another in a way\n * that works on any similar DOM structure regardless of whether it is the same\n * actual nodes.\n *\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.dom.NodeOffset');\n\ngoog.require('goog.Disposable');\ngoog.require('goog.dom.TagName');\n\n\n\n/**\n * Object to store the offset from one node to another in a way that works on\n * any similar DOM structure regardless of whether it is the same actual nodes.\n * @param {Node} node The node to get the offset for.\n * @param {Node} baseNode The node to calculate the offset from.\n * @extends {goog.Disposable}\n * @constructor\n * @final\n */\ngoog.dom.NodeOffset = function(node, baseNode) {\n  goog.Disposable.call(this);\n\n  /**\n   * A stack of childNode offsets.\n   * @type {Array<number>}\n   * @private\n   */\n  this.offsetStack_ = [];\n\n  /**\n   * A stack of childNode names.\n   * @type {Array<string>}\n   * @private\n   */\n  this.nameStack_ = [];\n\n  while (node && node.nodeName != goog.dom.TagName.BODY && node != baseNode) {\n    // Compute the sibling offset.\n    var siblingOffset = 0;\n    var sib = node.previousSibling;\n    while (sib) {\n      sib = sib.previousSibling;\n      ++siblingOffset;\n    }\n    this.offsetStack_.unshift(siblingOffset);\n    this.nameStack_.unshift(node.nodeName);\n\n    node = node.parentNode;\n  }\n};\ngoog.inherits(goog.dom.NodeOffset, goog.Disposable);\n\n\n/**\n * @return {string} A string representation of this object.\n * @override\n */\ngoog.dom.NodeOffset.prototype.toString = function() {\n  var strs = [];\n  var name;\n  for (var i = 0; name = this.nameStack_[i]; i++) {\n    strs.push(this.offsetStack_[i] + ',' + name);\n  }\n  return strs.join('\\n');\n};\n\n\n/**\n * Walk the dom and find the node relative to baseNode.  Returns null on\n * failure.\n * @param {Node} baseNode The node to start walking from.  Should be equivalent\n *     to the node passed in to the constructor, in that it should have the\n *     same contents.\n * @return {Node} The node relative to baseNode, or null on failure.\n */\ngoog.dom.NodeOffset.prototype.findTargetNode = function(baseNode) {\n  var name;\n  var curNode = baseNode;\n  for (var i = 0; name = this.nameStack_[i]; ++i) {\n    curNode = curNode.childNodes[this.offsetStack_[i]];\n\n    // Sanity check and make sure the element names match.\n    if (!curNode || curNode.nodeName != name) {\n      return null;\n    }\n  }\n  return curNode;\n};\n\n\n/** @override */\ngoog.dom.NodeOffset.prototype.disposeInternal = function() {\n  delete this.offsetStack_;\n  delete this.nameStack_;\n};\n","^AK",1579837703000,"^AL",["^AM",["^AA","^E2","^BJ"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/dom/nodeoffset.js"],"^B6",["^AM",["~$goog.dom.NodeOffset"]],"^A?",true,"^A@",["^AA","^E2","^BJ"]],["^ ","^AC",[1579837703000],"^AD","goog.ui.popupdatepicker.js","^AE",["^AF","goog/ui/popupdatepicker.js"],"^AG","goog/ui/popupdatepicker.js","^AH","^AI","^AJ","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Popup Date Picker implementation.  Pairs a goog.ui.DatePicker\n * with a goog.ui.Popup allowing the DatePicker to be attached to elements.\n *\n * @see ../demos/popupdatepicker.html\n */\n\ngoog.provide('goog.ui.PopupDatePicker');\n\ngoog.require('goog.events.EventType');\ngoog.require('goog.positioning.AnchoredViewportPosition');\ngoog.require('goog.positioning.Corner');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.DatePicker');\ngoog.require('goog.ui.Popup');\ngoog.require('goog.ui.PopupBase');\n\n\n\n/**\n * Popup date picker widget. Fires goog.ui.PopupBase.EventType.SHOW or HIDE\n * events when its visibility changes.\n *\n * @param {goog.ui.DatePicker=} opt_datePicker Optional DatePicker.  This\n *     enables the use of a custom date-picker instance.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @extends {goog.ui.Component}\n * @constructor\n */\ngoog.ui.PopupDatePicker = function(opt_datePicker, opt_domHelper) {\n  goog.ui.Component.call(this, opt_domHelper);\n\n  this.datePicker_ = opt_datePicker || new goog.ui.DatePicker();\n\n  /**\n   * Whether to reposition the popup when the date picker size changes (due to\n   * going to a different month with more weeks) so that all weeks are visible\n   * in the viewport.\n   * @private {boolean}\n   */\n  this.keepAllWeeksInViewport_ = false;\n};\ngoog.inherits(goog.ui.PopupDatePicker, goog.ui.Component);\ngoog.tagUnsealableClass(goog.ui.PopupDatePicker);\n\n\n/**\n * Instance of a date picker control.\n * @type {goog.ui.DatePicker?}\n * @private\n */\ngoog.ui.PopupDatePicker.prototype.datePicker_ = null;\n\n\n/**\n * Instance of goog.ui.Popup used to manage the behavior of the date picker.\n * @type {goog.ui.Popup?}\n * @private\n */\ngoog.ui.PopupDatePicker.prototype.popup_ = null;\n\n\n/**\n * Reference to the element that triggered the last popup.\n * @type {?Element}\n * @private\n */\ngoog.ui.PopupDatePicker.prototype.lastTarget_ = null;\n\n\n/**\n * Whether the date picker can move the focus to its key event target when it\n * is shown.  The default is true.  Setting to false can break keyboard\n * navigation, but this is needed for certain scenarios, for example the\n * toolbar menu in trogedit which can't have the selection changed.\n * @type {boolean}\n * @private\n */\ngoog.ui.PopupDatePicker.prototype.allowAutoFocus_ = true;\n\n\n/** @override */\ngoog.ui.PopupDatePicker.prototype.createDom = function() {\n  goog.ui.PopupDatePicker.superClass_.createDom.call(this);\n  this.getElement().className = goog.getCssName('goog-popupdatepicker');\n  this.popup_ = new goog.ui.Popup(this.getElement());\n  this.popup_.setParentEventTarget(this);\n};\n\n\n/**\n * @return {boolean} Whether the date picker is visible.\n */\ngoog.ui.PopupDatePicker.prototype.isVisible = function() {\n  return this.popup_ ? this.popup_.isVisible() : false;\n};\n\n\n/** @override */\ngoog.ui.PopupDatePicker.prototype.enterDocument = function() {\n  goog.ui.PopupDatePicker.superClass_.enterDocument.call(this);\n  // Create the DatePicker, if it isn't already.\n  // Done here as DatePicker assumes that the element passed to it is attached\n  // to a document.\n  if (!this.datePicker_.isInDocument()) {\n    var el = this.getElement();\n    // Make it initially invisible\n    el.style.visibility = 'hidden';\n    goog.style.setElementShown(el, false);\n    this.datePicker_.decorate(el);\n  }\n  this.getHandler()\n      .listen(\n          this.datePicker_, goog.ui.DatePicker.Events.CHANGE,\n          this.onDateChanged_)\n      .listen(\n          this.datePicker_, goog.ui.DatePicker.Events.SELECT,\n          this.onDateSelected_);\n};\n\n\n/** @override */\ngoog.ui.PopupDatePicker.prototype.disposeInternal = function() {\n  goog.ui.PopupDatePicker.superClass_.disposeInternal.call(this);\n  if (this.popup_) {\n    this.popup_.dispose();\n    this.popup_ = null;\n  }\n  this.datePicker_.dispose();\n  this.datePicker_ = null;\n  this.lastTarget_ = null;\n};\n\n\n/**\n * DatePicker cannot be used to decorate pre-existing html, since they're\n * not based on Components.\n * @param {Element} element Element to decorate.\n * @return {boolean} Returns always false.\n * @override\n */\ngoog.ui.PopupDatePicker.prototype.canDecorate = function(element) {\n  return false;\n};\n\n\n/**\n * @return {goog.ui.DatePicker} The date picker instance.\n */\ngoog.ui.PopupDatePicker.prototype.getDatePicker = function() {\n  return this.datePicker_;\n};\n\n/**\n * @return {?goog.ui.Popup} The popup instance.\n */\ngoog.ui.PopupDatePicker.prototype.getPopup = function() {\n  return this.popup_;\n};\n\n\n/**\n * @return {goog.date.Date?} The selected date, if any.  See\n *     goog.ui.DatePicker.getDate().\n */\ngoog.ui.PopupDatePicker.prototype.getDate = function() {\n  return this.datePicker_.getDate();\n};\n\n\n/**\n * Sets the selected date.  See goog.ui.DatePicker.setDate().\n * @param {goog.date.Date?} date The date to select.\n */\ngoog.ui.PopupDatePicker.prototype.setDate = function(date) {\n  this.datePicker_.setDate(date);\n};\n\n\n/**\n * @return {Element} The last element that triggered the popup.\n */\ngoog.ui.PopupDatePicker.prototype.getLastTarget = function() {\n  return this.lastTarget_;\n};\n\n\n/**\n * Attaches the popup date picker to an element.\n * @param {Element} element The element to attach to.\n */\ngoog.ui.PopupDatePicker.prototype.attach = function(element) {\n  this.getHandler().listen(\n      element, goog.events.EventType.MOUSEDOWN, this.showPopup_);\n};\n\n\n/**\n * Detatches the popup date picker from an element.\n * @param {Element} element The element to detach from.\n */\ngoog.ui.PopupDatePicker.prototype.detach = function(element) {\n  this.getHandler().unlisten(\n      element, goog.events.EventType.MOUSEDOWN, this.showPopup_);\n};\n\n\n/**\n * Sets whether the date picker can automatically move focus to its key event\n * target when it is set to visible.\n * @param {boolean} allow Whether to allow auto focus.\n */\ngoog.ui.PopupDatePicker.prototype.setAllowAutoFocus = function(allow) {\n  this.allowAutoFocus_ = allow;\n};\n\n\n/**\n * @return {boolean} Whether the date picker can automatically move focus to\n * its key event target when it is set to visible.\n */\ngoog.ui.PopupDatePicker.prototype.getAllowAutoFocus = function() {\n  return this.allowAutoFocus_;\n};\n\n\n/**\n * Sets whether to reposition the popup when the date picker size changes so\n * that all weeks are visible in the viewport.\n * @param {boolean} keepAllWeeksInViewport\n */\ngoog.ui.PopupDatePicker.prototype.setKeepAllWeeksInViewport = function(\n    keepAllWeeksInViewport) {\n  this.keepAllWeeksInViewport_ = keepAllWeeksInViewport;\n};\n\n\n/**\n * @return {boolean} Whether to reposition the popup when the date picker size\n *     changes so that all weeks are visible in the viewport.\n */\ngoog.ui.PopupDatePicker.prototype.getKeepAllWeeksInViewport = function() {\n  return this.keepAllWeeksInViewport_;\n};\n\n\n/**\n * Show the popup at the bottom-left corner of the specified element.\n * @param {Element} element Reference element for displaying the popup -- popup\n *     will appear at the bottom-left corner of this element.\n * @param {boolean=} opt_keepDate Whether to keep the date picker's current\n *     date. If false, the date is set to null. Defaults to false.\n */\ngoog.ui.PopupDatePicker.prototype.showPopup = function(element, opt_keepDate) {\n  this.lastTarget_ = element;\n  this.popup_.setPosition(new goog.positioning.AnchoredViewportPosition(\n      element, goog.positioning.Corner.BOTTOM_START, true));\n\n  // Don't listen to date changes while we're setting up the popup so we don't\n  // have to worry about change events when we call setDate(). Don't listen to\n  // grid size changes since the popup will position itself when we call\n  // setVisible().\n  this.getHandler()\n      .unlisten(\n          this.datePicker_, goog.ui.DatePicker.Events.CHANGE,\n          this.onDateChanged_)\n      .unlisten(\n          this.datePicker_, goog.ui.DatePicker.Events.SELECT,\n          this.onDateSelected_)\n      .unlisten(\n          this.datePicker_, goog.ui.DatePicker.Events.GRID_SIZE_INCREASE,\n          this.onGridSizeIncrease_);\n\n  var keepDate = !!opt_keepDate;\n  if (!keepDate) {\n    this.datePicker_.setDate(null);\n  }\n\n  // Forward the change event onto our listeners.  Done before we start\n  // listening to date changes again, so that listeners can change the date\n  // without firing more events.\n  this.dispatchEvent(goog.ui.PopupBase.EventType.SHOW);\n\n  this.popup_.setVisible(true);\n  if (this.allowAutoFocus_) {\n    this.getElement().focus();  // Our element contains the date picker.\n  }\n\n  this.getHandler()\n      .listen(\n          this.datePicker_, goog.ui.DatePicker.Events.CHANGE,\n          this.onDateChanged_)\n      .listen(\n          this.datePicker_, goog.ui.DatePicker.Events.SELECT,\n          this.onDateSelected_);\n\n  if (this.keepAllWeeksInViewport_) {\n    this.getHandler().listen(\n        this.datePicker_, goog.ui.DatePicker.Events.GRID_SIZE_INCREASE,\n        this.onGridSizeIncrease_);\n  }\n};\n\n\n/**\n * Handles click events on the targets and shows the date picker.\n * @param {goog.events.Event} event The click event.\n * @private\n */\ngoog.ui.PopupDatePicker.prototype.showPopup_ = function(event) {\n  this.showPopup(/** @type {Element} */ (event.currentTarget));\n};\n\n\n/**\n * Hides this popup.\n */\ngoog.ui.PopupDatePicker.prototype.hidePopup = function() {\n  this.popup_.setVisible(false);\n  if (this.allowAutoFocus_ && this.lastTarget_) {\n    this.lastTarget_.focus();\n  }\n};\n\n\n/**\n * Called when date selection is made.\n *\n * @param {!goog.events.Event} event The date change event.\n * @private\n */\ngoog.ui.PopupDatePicker.prototype.onDateSelected_ = function(event) {\n  this.hidePopup();\n\n  // Forward the change event onto our listeners.\n  this.dispatchEvent(event);\n};\n\n\n/**\n * Called when the date is changed.\n *\n * @param {!goog.events.Event} event The date change event.\n * @private\n */\ngoog.ui.PopupDatePicker.prototype.onDateChanged_ = function(event) {\n  // Forward the change event onto our listeners.\n  this.dispatchEvent(event);\n};\n\n\n/**\n * Called when the container DatePicker's size increases.\n * @private\n */\ngoog.ui.PopupDatePicker.prototype.onGridSizeIncrease_ = function() {\n  this.popup_ && this.popup_.reposition();\n};\n","^AK",1579837703000,"^AL",["^AM",["~$goog.positioning.Corner","~$goog.ui.DatePicker","~$goog.ui.PopupBase","~$goog.positioning.AnchoredViewportPosition","^BT","^AA","^BU","^BI","~$goog.ui.Popup"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/popupdatepicker.js"],"^B6",["^AM",["~$goog.ui.PopupDatePicker"]],"^A?",true,"^A@",["^AA","^BU","^EQ","^EN","^BI","^BT","^EO","^ER","^EP"]],["^ ","^AC",[1579837703000],"^AD","goog.vec.vec2.js","^AE",["^AF","goog/vec/vec2.js"],"^AG","goog/vec/vec2.js","^AH","^AI","^AJ","// Copyright 2012 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of 2 element vectors.  This follows the same design\n * patterns as Vec3 and Vec4.\n *\n */\n\ngoog.provide('goog.vec.Vec2');\n\n/** @suppress {extraRequire} */\ngoog.require('goog.vec');\n\n\n/** @typedef {!goog.vec.Float32} */ goog.vec.Vec2.Float32;\n/** @typedef {!goog.vec.Float64} */ goog.vec.Vec2.Float64;\n/** @typedef {!goog.vec.Number} */ goog.vec.Vec2.Number;\n/** @typedef {!goog.vec.AnyType} */ goog.vec.Vec2.AnyType;\n\n\n/**\n * Creates a 2 element vector of Float32. The array is initialized to zero.\n *\n * @return {!goog.vec.Vec2.Float32} The new 2 element array.\n */\ngoog.vec.Vec2.createFloat32 = function() {\n  return new Float32Array(2);\n};\n\n\n/**\n * Creates a 2 element vector of Float64. The array is initialized to zero.\n *\n * @return {!goog.vec.Vec2.Float64} The new 2 element array.\n */\ngoog.vec.Vec2.createFloat64 = function() {\n  return new Float64Array(2);\n};\n\n\n/**\n * Creates a 2 element vector of Number. The array is initialized to zero.\n *\n * @return {!goog.vec.Vec2.Number} The new 2 element array.\n */\ngoog.vec.Vec2.createNumber = function() {\n  var a = new Array(2);\n  goog.vec.Vec2.setFromValues(a, 0, 0);\n  return a;\n};\n\n\n/**\n * Creates a new 2 element FLoat32 vector initialized with the value from the\n * given array.\n *\n * @param {goog.vec.Vec2.AnyType} vec The source 2 element array.\n * @return {!goog.vec.Vec2.Float32} The new 2 element array.\n */\ngoog.vec.Vec2.createFloat32FromArray = function(vec) {\n  var newVec = goog.vec.Vec2.createFloat32();\n  goog.vec.Vec2.setFromArray(newVec, vec);\n  return newVec;\n};\n\n\n/**\n * Creates a new 2 element Float32 vector initialized with the supplied values.\n *\n * @param {number} vec0 The value for element at index 0.\n * @param {number} vec1 The value for element at index 1.\n * @return {!goog.vec.Vec2.Float32} The new vector.\n */\ngoog.vec.Vec2.createFloat32FromValues = function(vec0, vec1) {\n  var a = goog.vec.Vec2.createFloat32();\n  goog.vec.Vec2.setFromValues(a, vec0, vec1);\n  return a;\n};\n\n\n/**\n * Creates a clone of the given 2 element Float32 vector.\n *\n * @param {goog.vec.Vec2.Float32} vec The source 2 element vector.\n * @return {!goog.vec.Vec2.Float32} The new cloned vector.\n */\ngoog.vec.Vec2.cloneFloat32 = goog.vec.Vec2.createFloat32FromArray;\n\n\n/**\n * Creates a new 2 element Float64 vector initialized with the value from the\n * given array.\n *\n * @param {goog.vec.Vec2.AnyType} vec The source 2 element array.\n * @return {!goog.vec.Vec2.Float64} The new 2 element array.\n */\ngoog.vec.Vec2.createFloat64FromArray = function(vec) {\n  var newVec = goog.vec.Vec2.createFloat64();\n  goog.vec.Vec2.setFromArray(newVec, vec);\n  return newVec;\n};\n\n\n/**\n* Creates a new 2 element Float64 vector initialized with the supplied values.\n*\n* @param {number} vec0 The value for element at index 0.\n* @param {number} vec1 The value for element at index 1.\n* @return {!goog.vec.Vec2.Float64} The new vector.\n*/\ngoog.vec.Vec2.createFloat64FromValues = function(vec0, vec1) {\n  var vec = goog.vec.Vec2.createFloat64();\n  goog.vec.Vec2.setFromValues(vec, vec0, vec1);\n  return vec;\n};\n\n\n/**\n * Creates a clone of the given 2 element vector.\n *\n * @param {goog.vec.Vec2.Float64} vec The source 2 element vector.\n * @return {!goog.vec.Vec2.Float64} The new cloned vector.\n */\ngoog.vec.Vec2.cloneFloat64 = goog.vec.Vec2.createFloat64FromArray;\n\n\n/**\n * Initializes the vector with the given values.\n *\n * @param {goog.vec.Vec2.AnyType} vec The vector to receive the values.\n * @param {number} vec0 The value for element at index 0.\n * @param {number} vec1 The value for element at index 1.\n * @return {!goog.vec.Vec2.AnyType} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec2.setFromValues = function(vec, vec0, vec1) {\n  vec[0] = vec0;\n  vec[1] = vec1;\n  return vec;\n};\n\n\n/**\n * Initializes the vector with the given array of values.\n *\n * @param {goog.vec.Vec2.AnyType} vec The vector to receive the\n *     values.\n * @param {goog.vec.Vec2.AnyType} values The array of values.\n * @return {!goog.vec.Vec2.AnyType} Return vec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec2.setFromArray = function(vec, values) {\n  vec[0] = values[0];\n  vec[1] = values[1];\n  return vec;\n};\n\n\n/**\n * Performs a component-wise addition of vec0 and vec1 together storing the\n * result into resultVec.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 The first addend.\n * @param {goog.vec.Vec2.AnyType} vec1 The second addend.\n * @param {goog.vec.Vec2.AnyType} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.Vec2.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec2.add = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] + vec1[0];\n  resultVec[1] = vec0[1] + vec1[1];\n  return resultVec;\n};\n\n\n/**\n * Performs a component-wise subtraction of vec1 from vec0 storing the\n * result into resultVec.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 The minuend.\n * @param {goog.vec.Vec2.AnyType} vec1 The subtrahend.\n * @param {goog.vec.Vec2.AnyType} resultVec The vector to\n *     receive the result. May be vec0 or vec1.\n * @return {!goog.vec.Vec2.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec2.subtract = function(vec0, vec1, resultVec) {\n  resultVec[0] = vec0[0] - vec1[0];\n  resultVec[1] = vec0[1] - vec1[1];\n  return resultVec;\n};\n\n\n/**\n * Negates vec0, storing the result into resultVec.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 The vector to negate.\n * @param {goog.vec.Vec2.AnyType} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.Vec2.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec2.negate = function(vec0, resultVec) {\n  resultVec[0] = -vec0[0];\n  resultVec[1] = -vec0[1];\n  return resultVec;\n};\n\n\n/**\n * Takes the absolute value of each component of vec0 storing the result in\n * resultVec.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 The source vector.\n * @param {goog.vec.Vec2.AnyType} resultVec The vector to receive the result.\n *     May be vec0.\n * @return {!goog.vec.Vec2.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec2.abs = function(vec0, resultVec) {\n  resultVec[0] = Math.abs(vec0[0]);\n  resultVec[1] = Math.abs(vec0[1]);\n  return resultVec;\n};\n\n\n/**\n * Multiplies each component of vec0 with scalar storing the product into\n * resultVec.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 The source vector.\n * @param {number} scalar The value to multiply with each component of vec0.\n * @param {goog.vec.Vec2.AnyType} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.Vec2.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec2.scale = function(vec0, scalar, resultVec) {\n  resultVec[0] = vec0[0] * scalar;\n  resultVec[1] = vec0[1] * scalar;\n  return resultVec;\n};\n\n\n/**\n * Returns the magnitudeSquared of the given vector.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.Vec2.magnitudeSquared = function(vec0) {\n  var x = vec0[0], y = vec0[1];\n  return x * x + y * y;\n};\n\n\n/**\n * Returns the magnitude of the given vector.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 The vector.\n * @return {number} The magnitude of the vector.\n */\ngoog.vec.Vec2.magnitude = function(vec0) {\n  var x = vec0[0], y = vec0[1];\n  return Math.sqrt(x * x + y * y);\n};\n\n\n/**\n * Normalizes the given vector storing the result into resultVec.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 The vector to normalize.\n * @param {goog.vec.Vec2.AnyType} resultVec The vector to\n *     receive the result. May be vec0.\n * @return {!goog.vec.Vec2.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec2.normalize = function(vec0, resultVec) {\n  var ilen = 1 / goog.vec.Vec2.magnitude(vec0);\n  resultVec[0] = vec0[0] * ilen;\n  resultVec[1] = vec0[1] * ilen;\n  return resultVec;\n};\n\n\n/**\n * Returns the scalar product of vectors vec0 and vec1.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 The first vector.\n * @param {goog.vec.Vec2.AnyType} vec1 The second vector.\n * @return {number} The scalar product.\n */\ngoog.vec.Vec2.dot = function(vec0, vec1) {\n  return vec0[0] * vec1[0] + vec0[1] * vec1[1];\n};\n\n\n/**\n * Returns the squared distance between two points.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 First point.\n * @param {goog.vec.Vec2.AnyType} vec1 Second point.\n * @return {number} The squared distance between the points.\n */\ngoog.vec.Vec2.distanceSquared = function(vec0, vec1) {\n  var x = vec0[0] - vec1[0];\n  var y = vec0[1] - vec1[1];\n  return x * x + y * y;\n};\n\n\n/**\n * Returns the distance between two points.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 First point.\n * @param {goog.vec.Vec2.AnyType} vec1 Second point.\n * @return {number} The distance between the points.\n */\ngoog.vec.Vec2.distance = function(vec0, vec1) {\n  return Math.sqrt(goog.vec.Vec2.distanceSquared(vec0, vec1));\n};\n\n\n/**\n * Returns a unit vector pointing from one point to another.\n * If the input points are equal then the result will be all zeros.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 Origin point.\n * @param {goog.vec.Vec2.AnyType} vec1 Target point.\n * @param {goog.vec.Vec2.AnyType} resultVec The vector to receive the\n *     results (may be vec0 or vec1).\n * @return {!goog.vec.Vec2.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec2.direction = function(vec0, vec1, resultVec) {\n  var x = vec1[0] - vec0[0];\n  var y = vec1[1] - vec0[1];\n  var d = Math.sqrt(x * x + y * y);\n  if (d) {\n    d = 1 / d;\n    resultVec[0] = x * d;\n    resultVec[1] = y * d;\n  } else {\n    resultVec[0] = resultVec[1] = 0;\n  }\n  return resultVec;\n};\n\n\n/**\n * Linearly interpolate from vec0 to vec1 according to f. The value of f should\n * be in the range [0..1] otherwise the results are undefined.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 The first vector.\n * @param {goog.vec.Vec2.AnyType} vec1 The second vector.\n * @param {number} f The interpolation factor.\n * @param {goog.vec.Vec2.AnyType} resultVec The vector to receive the\n *     results (may be vec0 or vec1).\n * @return {!goog.vec.Vec2.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec2.lerp = function(vec0, vec1, f, resultVec) {\n  var x = vec0[0], y = vec0[1];\n  resultVec[0] = (vec1[0] - x) * f + x;\n  resultVec[1] = (vec1[1] - y) * f + y;\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the larger values in resultVec.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 The source vector.\n * @param {goog.vec.Vec2.AnyType|number} limit The limit vector or scalar.\n * @param {goog.vec.Vec2.AnyType} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.Vec2.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec2.max = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.max(vec0[0], limit);\n    resultVec[1] = Math.max(vec0[1], limit);\n  } else {\n    resultVec[0] = Math.max(vec0[0], limit[0]);\n    resultVec[1] = Math.max(vec0[1], limit[1]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Compares the components of vec0 with the components of another vector or\n * scalar, storing the smaller values in resultVec.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 The source vector.\n * @param {goog.vec.Vec2.AnyType|number} limit The limit vector or scalar.\n * @param {goog.vec.Vec2.AnyType} resultVec The vector to receive the\n *     results (may be vec0 or limit).\n * @return {!goog.vec.Vec2.AnyType} Return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Vec2.min = function(vec0, limit, resultVec) {\n  if (typeof limit === 'number') {\n    resultVec[0] = Math.min(vec0[0], limit);\n    resultVec[1] = Math.min(vec0[1], limit);\n  } else {\n    resultVec[0] = Math.min(vec0[0], limit[0]);\n    resultVec[1] = Math.min(vec0[1], limit[1]);\n  }\n  return resultVec;\n};\n\n\n/**\n * Returns true if the components of vec0 are equal to the components of vec1.\n *\n * @param {goog.vec.Vec2.AnyType} vec0 The first vector.\n * @param {goog.vec.Vec2.AnyType} vec1 The second vector.\n * @return {boolean} True if the vectors are equal, false otherwise.\n */\ngoog.vec.Vec2.equals = function(vec0, vec1) {\n  return vec0.length == vec1.length && vec0[0] == vec1[0] && vec0[1] == vec1[1];\n};\n","^AK",1579837703000,"^AL",["^AM",["^E?","^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/vec2.js"],"^B6",["^AM",["~$goog.vec.Vec2"]],"^A?",true,"^A@",["^AA","^E?"]],["^ ","^AC",[1579837703000],"^AD","goog.storage.mechanism.mechanismsharingtester.js","^AE",["^AF","goog/storage/mechanism/mechanismsharingtester.js"],"^AG","goog/storage/mechanism/mechanismsharingtester.js","^AH","^AI","^AJ","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Unit tests for storage mechanism sharing.\n *\n * These tests should be included in tests of any storage mechanism in which\n * separate mechanism instances share the same underlying storage. Most (if\n * not all) storage mechanisms should have this property. If the mechanism\n * employs namespaces, make sure the same namespace is used for both objects.\n *\n */\n\ngoog.provide('goog.storage.mechanism.mechanismSharingTester');\n\ngoog.require('goog.iter.StopIteration');\n/** @suppress {extraRequire} */\ngoog.require('goog.storage.mechanism.mechanismTestDefinition');\ngoog.require('goog.testing.asserts');\n\n\ngoog.setTestOnly('goog.storage.mechanism.mechanismSharingTester');\n\nfunction testSharedSet() {\n  if (!mechanism || !mechanism_shared) {\n    return;\n  }\n  mechanism.set('first', 'one');\n  assertEquals('one', mechanism_shared.get('first'));\n  assertEquals(1, mechanism_shared.getCount());\n  var iterator = mechanism_shared.__iterator__();\n  assertEquals('one', iterator.next());\n  assertEquals(goog.iter.StopIteration, assertThrows(iterator.next));\n}\n\n\nfunction testSharedSetInverse() {\n  if (!mechanism || !mechanism_shared) {\n    return;\n  }\n  mechanism_shared.set('first', 'two');\n  assertEquals('two', mechanism.get('first'));\n  assertEquals(1, mechanism.getCount());\n  var iterator = mechanism.__iterator__();\n  assertEquals('two', iterator.next());\n  assertEquals(goog.iter.StopIteration, assertThrows(iterator.next));\n}\n\n\nfunction testSharedRemove() {\n  if (!mechanism || !mechanism_shared) {\n    return;\n  }\n  mechanism_shared.set('first', 'three');\n  mechanism.remove('first');\n  assertNull(mechanism_shared.get('first'));\n  assertEquals(0, mechanism_shared.getCount());\n  assertEquals(\n      goog.iter.StopIteration,\n      assertThrows(mechanism_shared.__iterator__().next));\n}\n\n\nfunction testSharedClean() {\n  if (!mechanism || !mechanism_shared) {\n    return;\n  }\n  mechanism.set('first', 'four');\n  mechanism_shared.clear();\n  assertEquals(0, mechanism.getCount());\n  assertEquals(\n      goog.iter.StopIteration, assertThrows(mechanism.__iterator__().next));\n}\n","^AK",1579837703000,"^AL",["^AM",["^AO","^AA","~$goog.storage.mechanism.mechanismTestDefinition","~$goog.iter.StopIteration"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/storage/mechanism/mechanismsharingtester.js"],"^B6",["^AM",["~$goog.storage.mechanism.mechanismSharingTester"]],"^A?",true,"^A@",["^AA","^EV","^EU","^AO"]],["^ ","^AC",[1579837703000],"^AD","goog.disposable.idisposable.js","^AE",["^AF","goog/disposable/idisposable.js"],"^AG","goog/disposable/idisposable.js","^AH","^AI","^AJ","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Definition of the disposable interface.  A disposable object\n * has a dispose method to to clean up references and resources.\n * @author nnaze@google.com (Nathan Naze)\n */\n\n\ngoog.provide('goog.disposable.IDisposable');\n\n\n\n/**\n * Interface for a disposable object.  If a instance requires cleanup\n * (references COM objects, DOM nodes, or other disposable objects), it should\n * implement this interface (it may subclass goog.Disposable).\n * @record\n */\ngoog.disposable.IDisposable = function() {};\n\n\n/**\n * Disposes of the object and its resources.\n * @return {void} Nothing.\n */\ngoog.disposable.IDisposable.prototype.dispose = goog.abstractMethod;\n\n\n/**\n * @return {boolean} Whether the object has been disposed of.\n */\ngoog.disposable.IDisposable.prototype.isDisposed = goog.abstractMethod;\n","^AK",1579837703000,"^AL",["^AM",["^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/disposable/idisposable.js"],"^B6",["^AM",["^E0"]],"^A?",true,"^A@",["^AA"]],["^ ","^AC",[1579837703000],"^AD","goog.ui.filteredmenu.js","^AE",["^AF","goog/ui/filteredmenu.js"],"^AG","goog/ui/filteredmenu.js","^AH","^AI","^AJ","// Copyright 2007 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Menu where items can be filtered based on user keyboard input.\n * If a filter is specified only the items matching it will be displayed.\n *\n * @author eae@google.com (Emil A Eklund)\n * @see ../demos/filteredmenu.html\n */\n\n\ngoog.provide('goog.ui.FilteredMenu');\n\ngoog.require('goog.a11y.aria');\ngoog.require('goog.a11y.aria.AutoCompleteValues');\ngoog.require('goog.a11y.aria.State');\ngoog.require('goog.dom');\ngoog.require('goog.dom.InputType');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.events');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.InputHandler');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.string');\ngoog.require('goog.style');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.FilterObservingMenuItem');\ngoog.require('goog.ui.Menu');\ngoog.require('goog.ui.MenuItem');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Filtered menu class.\n * @param {goog.ui.MenuRenderer=} opt_renderer Renderer used to render filtered\n *     menu; defaults to {@link goog.ui.MenuRenderer}.\n * @param {goog.dom.DomHelper=} opt_domHelper Optional DOM helper.\n * @constructor\n * @extends {goog.ui.Menu}\n */\ngoog.ui.FilteredMenu = function(opt_renderer, opt_domHelper) {\n  goog.ui.Menu.call(this, opt_domHelper, opt_renderer);\n};\ngoog.inherits(goog.ui.FilteredMenu, goog.ui.Menu);\ngoog.tagUnsealableClass(goog.ui.FilteredMenu);\n\n\n/**\n * Events fired by component.\n * @enum {string}\n */\ngoog.ui.FilteredMenu.EventType = {\n  /** Dispatched after the component filter criteria has been changed. */\n  FILTER_CHANGED: 'filterchange'\n};\n\n\n/**\n * Filter menu element ids.\n * @enum {string}\n * @private\n */\ngoog.ui.FilteredMenu.Id_ = {\n  CONTENT_ELEMENT: 'content-el'\n};\n\n\n/**\n * Filter input element.\n * @type {Element|undefined}\n * @private\n */\ngoog.ui.FilteredMenu.prototype.filterInput_;\n\n\n/**\n * The input handler that provides the input event.\n * @type {goog.events.InputHandler|undefined}\n * @private\n */\ngoog.ui.FilteredMenu.prototype.inputHandler_;\n\n\n/**\n * Maximum number of characters for filter input.\n * @type {number}\n * @private\n */\ngoog.ui.FilteredMenu.prototype.maxLength_ = 0;\n\n\n/**\n * Label displayed in the filter input when no text has been entered.\n * @type {string}\n * @private\n */\ngoog.ui.FilteredMenu.prototype.label_ = '';\n\n\n/**\n * Label element.\n * @type {Element|undefined}\n * @private\n */\ngoog.ui.FilteredMenu.prototype.labelEl_;\n\n\n/**\n * Whether multiple items can be entered comma separated.\n * @type {boolean}\n * @private\n */\ngoog.ui.FilteredMenu.prototype.allowMultiple_ = false;\n\n\n/**\n * List of items entered in the search box if multiple entries are allowed.\n * @type {Array<string>|undefined}\n * @private\n */\ngoog.ui.FilteredMenu.prototype.enteredItems_;\n\n\n/**\n * Index of first item that should be affected by the filter. Menu items with\n * a lower index will not be affected by the filter.\n * @type {number}\n * @private\n */\ngoog.ui.FilteredMenu.prototype.filterFromIndex_ = 0;\n\n\n/**\n * Filter applied to the menu.\n * @type {string|undefined|null}\n * @private\n */\ngoog.ui.FilteredMenu.prototype.filterStr_;\n\n\n/**\n * @private {Element}\n */\ngoog.ui.FilteredMenu.prototype.contentElement_;\n\n\n/**\n * Map of child nodes that shouldn't be affected by filtering.\n * @type {Object|undefined}\n * @private\n */\ngoog.ui.FilteredMenu.prototype.persistentChildren_;\n\n\n/** @override */\ngoog.ui.FilteredMenu.prototype.createDom = function() {\n  goog.ui.FilteredMenu.superClass_.createDom.call(this);\n\n  var dom = this.getDomHelper();\n  var el = dom.createDom(\n      goog.dom.TagName.DIV,\n      goog.getCssName(this.getRenderer().getCssClass(), 'filter'),\n      this.labelEl_ = dom.createDom(goog.dom.TagName.DIV, null, this.label_),\n      this.filterInput_ = dom.createDom(\n          goog.dom.TagName.INPUT, {'type': goog.dom.InputType.TEXT}));\n  var element = this.getElement();\n  dom.appendChild(element, el);\n  var contentElementId = this.makeId(goog.ui.FilteredMenu.Id_.CONTENT_ELEMENT);\n  this.contentElement_ = dom.createDom(goog.dom.TagName.DIV, {\n    'class': goog.getCssName(this.getRenderer().getCssClass(), 'content'),\n    'id': contentElementId\n  });\n  dom.appendChild(element, this.contentElement_);\n\n  this.initFilterInput_();\n\n  goog.a11y.aria.setState(\n      this.filterInput_, goog.a11y.aria.State.AUTOCOMPLETE,\n      goog.a11y.aria.AutoCompleteValues.LIST);\n  goog.a11y.aria.setState(\n      this.filterInput_, goog.a11y.aria.State.OWNS, contentElementId);\n  goog.a11y.aria.setState(\n      this.filterInput_, goog.a11y.aria.State.EXPANDED, true);\n};\n\n\n/**\n * Helper method that initializes the filter input element.\n * @private\n */\ngoog.ui.FilteredMenu.prototype.initFilterInput_ = function() {\n  this.setFocusable(true);\n  this.setKeyEventTarget(this.filterInput_);\n\n  // Workaround for mozilla bug #236791.\n  if (goog.userAgent.GECKO) {\n    this.filterInput_.setAttribute('autocomplete', 'off');\n  }\n\n  if (this.maxLength_) {\n    this.filterInput_.maxLength = this.maxLength_;\n  }\n};\n\n\n/**\n * Sets up listeners and prepares the filter functionality.\n * @private\n */\ngoog.ui.FilteredMenu.prototype.setUpFilterListeners_ = function() {\n  if (!this.inputHandler_ && this.filterInput_) {\n    this.inputHandler_ = new goog.events.InputHandler(\n        /** @type {Element} */ (this.filterInput_));\n    goog.style.setUnselectable(this.filterInput_, false);\n    goog.events.listen(\n        this.inputHandler_, goog.events.InputHandler.EventType.INPUT,\n        this.handleFilterEvent, false, this);\n    goog.events.listen(\n        this.filterInput_.parentNode, goog.events.EventType.CLICK,\n        this.onFilterLabelClick_, false, this);\n    if (this.allowMultiple_) {\n      this.enteredItems_ = [];\n    }\n  }\n};\n\n\n/**\n * Tears down listeners and resets the filter functionality.\n * @private\n */\ngoog.ui.FilteredMenu.prototype.tearDownFilterListeners_ = function() {\n  if (this.inputHandler_) {\n    goog.events.unlisten(\n        this.inputHandler_, goog.events.InputHandler.EventType.INPUT,\n        this.handleFilterEvent, false, this);\n    goog.events.unlisten(\n        this.filterInput_.parentNode, goog.events.EventType.CLICK,\n        this.onFilterLabelClick_, false, this);\n\n    this.inputHandler_.dispose();\n    this.inputHandler_ = undefined;\n    this.enteredItems_ = undefined;\n  }\n};\n\n\n/** @override */\ngoog.ui.FilteredMenu.prototype.setVisible = function(show, opt_force, opt_e) {\n  var visibilityChanged = goog.ui.FilteredMenu.superClass_.setVisible.call(\n      this, show, opt_force, opt_e);\n  if (visibilityChanged && show && this.isInDocument()) {\n    this.setFilter('');\n    this.setUpFilterListeners_();\n  } else if (visibilityChanged && !show) {\n    this.tearDownFilterListeners_();\n  }\n\n  return visibilityChanged;\n};\n\n\n/** @override */\ngoog.ui.FilteredMenu.prototype.disposeInternal = function() {\n  this.tearDownFilterListeners_();\n  this.filterInput_ = undefined;\n  this.labelEl_ = undefined;\n  goog.ui.FilteredMenu.superClass_.disposeInternal.call(this);\n};\n\n\n/**\n * Sets the filter label (the label displayed in the filter input element if no\n * text has been entered).\n * @param {?string} label Label text.\n */\ngoog.ui.FilteredMenu.prototype.setFilterLabel = function(label) {\n  this.label_ = label || '';\n  if (this.labelEl_) {\n    goog.dom.setTextContent(this.labelEl_, this.label_);\n  }\n};\n\n\n/**\n * @return {string} The filter label.\n */\ngoog.ui.FilteredMenu.prototype.getFilterLabel = function() {\n  return this.label_;\n};\n\n\n/**\n * Sets the filter string.\n * @param {?string} str Filter string.\n */\ngoog.ui.FilteredMenu.prototype.setFilter = function(str) {\n  if (this.filterInput_) {\n    this.filterInput_.value = str;\n    this.filterItems_(str);\n  }\n};\n\n\n/**\n * Returns the filter string.\n * @return {string} Current filter or an an empty string.\n */\ngoog.ui.FilteredMenu.prototype.getFilter = function() {\n  return this.filterInput_ && typeof this.filterInput_.value === 'string' ?\n      this.filterInput_.value :\n      '';\n};\n\n\n/**\n * Sets the index of first item that should be affected by the filter. Menu\n * items with a lower index will not be affected by the filter.\n * @param {number} index Index of first item that should be affected by filter.\n */\ngoog.ui.FilteredMenu.prototype.setFilterFromIndex = function(index) {\n  this.filterFromIndex_ = index;\n};\n\n\n/**\n * Returns the index of first item that is affected by the filter.\n * @return {number} Index of first item that is affected by filter.\n */\ngoog.ui.FilteredMenu.prototype.getFilterFromIndex = function() {\n  return this.filterFromIndex_;\n};\n\n\n/**\n * Gets a list of items entered in the search box.\n * @return {!Array<string>} The entered items.\n */\ngoog.ui.FilteredMenu.prototype.getEnteredItems = function() {\n  return this.enteredItems_ || [];\n};\n\n\n/**\n * Sets whether multiple items can be entered comma separated.\n * @param {boolean} b Whether multiple items can be entered.\n */\ngoog.ui.FilteredMenu.prototype.setAllowMultiple = function(b) {\n  this.allowMultiple_ = b;\n};\n\n\n/**\n * @return {boolean} Whether multiple items can be entered comma separated.\n */\ngoog.ui.FilteredMenu.prototype.getAllowMultiple = function() {\n  return this.allowMultiple_;\n};\n\n\n/**\n * Sets whether the specified child should be affected (shown/hidden) by the\n * filter criteria.\n * @param {goog.ui.Component} child Child to change.\n * @param {boolean} persistent Whether the child should be persistent.\n */\ngoog.ui.FilteredMenu.prototype.setPersistentVisibility = function(\n    child, persistent) {\n  if (!this.persistentChildren_) {\n    this.persistentChildren_ = {};\n  }\n  this.persistentChildren_[child.getId()] = persistent;\n};\n\n\n/**\n * Returns whether the specified child should be affected (shown/hidden) by the\n * filter criteria.\n * @param {goog.ui.Component} child Menu item to check.\n * @return {boolean} Whether the menu item is persistent.\n */\ngoog.ui.FilteredMenu.prototype.hasPersistentVisibility = function(child) {\n  return !!(\n      this.persistentChildren_ && this.persistentChildren_[child.getId()]);\n};\n\n\n/**\n * Handles filter input events.\n * @param {goog.events.BrowserEvent} e The event object.\n */\ngoog.ui.FilteredMenu.prototype.handleFilterEvent = function(e) {\n  this.filterItems_(this.filterInput_.value);\n\n  // Highlight the first visible item unless there's already a highlighted item.\n  var highlighted = this.getHighlighted();\n  if (!highlighted || !highlighted.isVisible()) {\n    this.highlightFirst();\n  }\n  this.dispatchEvent(goog.ui.FilteredMenu.EventType.FILTER_CHANGED);\n};\n\n\n/**\n * Shows/hides elements based on the supplied filter.\n * @param {?string} str Filter string.\n * @private\n */\ngoog.ui.FilteredMenu.prototype.filterItems_ = function(str) {\n  // Do nothing unless the filter string has changed.\n  if (this.filterStr_ == str) {\n    return;\n  }\n\n  if (this.labelEl_) {\n    this.labelEl_.style.visibility = str == '' ? 'visible' : 'hidden';\n  }\n\n  if (this.allowMultiple_ && this.enteredItems_) {\n    // Matches all non space characters after the last comma.\n    var lastWordRegExp = /^(.+),[ ]*([^,]*)$/;\n    var matches = str.match(lastWordRegExp);\n    // matches[1] is the string up to, but not including, the last comma and\n    // matches[2] the part after the last comma. If there are no non-space\n    // characters after the last comma matches[2] is undefined.\n    var items = matches && matches[1] ? matches[1].split(',') : [];\n\n    // If the number of comma separated items has changes recreate the\n    // entered items array and fire a change event.\n    if (str.substr(str.length - 1, 1) == ',' ||\n        items.length != this.enteredItems_.length) {\n      var lastItem = items[items.length - 1] || '';\n\n      // Auto complete text in input box based on the highlighted item.\n      if (this.getHighlighted() && lastItem != '') {\n        var caption = this.getHighlighted().getCaption();\n        if (caption.toLowerCase().indexOf(lastItem.toLowerCase()) == 0) {\n          items[items.length - 1] = caption;\n          this.filterInput_.value = items.join(',') + ',';\n        }\n      }\n      this.enteredItems_ = items;\n      this.dispatchEvent(goog.ui.Component.EventType.CHANGE);\n      this.setHighlightedIndex(-1);\n    }\n\n    if (matches) {\n      str = matches.length > 2 ? goog.string.trim(matches[2]) : '';\n    }\n  }\n\n  var matcher =\n      new RegExp('(^|[- ,_/.:])' + goog.string.regExpEscape(str), 'i');\n  for (var child, i = this.filterFromIndex_; child = this.getChildAt(i); i++) {\n    if (child instanceof goog.ui.FilterObservingMenuItem) {\n      child.callObserver(str);\n    } else if (!this.hasPersistentVisibility(child)) {\n      // Only show items matching the filter and highlight the part of the\n      // caption that matches.\n      var caption = child.getCaption();\n      if (caption) {\n        var matchArray = caption.match(matcher);\n        if (str == '' || matchArray) {\n          child.setVisible(true);\n          var pos = caption.indexOf(matchArray[0]);\n\n          // If position is non zero increase by one to skip the separator.\n          if (pos) {\n            pos++;\n          }\n          this.boldContent(child, pos, str.length);\n        } else {\n          child.setVisible(false);\n        }\n      } else {\n        // Hide separators and other items without a caption if a filter string\n        // has been entered.\n        child.setVisible(str == '');\n      }\n    }\n  }\n  this.filterStr_ = str;\n};\n\n\n/**\n * Updates the content of the given menu item, bolding the part of its caption\n * from start and through the next len characters.\n * @param {!goog.ui.Control} child The control to bold content on.\n * @param {number} start The index at which to start bolding.\n * @param {number} len How many characters to bold.\n * @protected\n */\ngoog.ui.FilteredMenu.prototype.boldContent = function(child, start, len) {\n  var caption = child.getCaption();\n  var boldedCaption;\n  if (len == 0) {\n    boldedCaption = this.getDomHelper().createTextNode(caption);\n  } else {\n    var preMatch = caption.substr(0, start);\n    var match = caption.substr(start, len);\n    var postMatch = caption.substr(start + len);\n    boldedCaption = this.getDomHelper().createDom(\n        goog.dom.TagName.SPAN, null, preMatch,\n        this.getDomHelper().createDom(goog.dom.TagName.B, null, match),\n        postMatch);\n  }\n  var accelerator = child.getAccelerator && child.getAccelerator();\n  if (accelerator) {\n    child.setContent([\n      boldedCaption, this.getDomHelper().createDom(\n                         goog.dom.TagName.SPAN,\n                         goog.ui.MenuItem.ACCELERATOR_CLASS, accelerator)\n    ]);\n  } else {\n    child.setContent(boldedCaption);\n  }\n};\n\n\n/**\n * Handles the menu's behavior for a key event. The highlighted menu item will\n * be given the opportunity to handle the key behavior.\n * @param {goog.events.KeyEvent} e A browser event.\n * @return {boolean} Whether the event was handled.\n * @override\n */\ngoog.ui.FilteredMenu.prototype.handleKeyEventInternal = function(e) {\n  // Home, end and the arrow keys are normally used to change the selected menu\n  // item. Return false here to prevent the menu from preventing the default\n  // behavior for HOME, END and any key press with a modifier.\n  if (e.shiftKey || e.ctrlKey || e.altKey ||\n      e.keyCode == goog.events.KeyCodes.HOME ||\n      e.keyCode == goog.events.KeyCodes.END) {\n    return false;\n  }\n\n  if (e.keyCode == goog.events.KeyCodes.ESC) {\n    this.dispatchEvent(goog.ui.Component.EventType.BLUR);\n    return true;\n  }\n\n  return goog.ui.FilteredMenu.superClass_.handleKeyEventInternal.call(this, e);\n};\n\n\n/**\n * Sets the highlighted index, unless the HIGHLIGHT event is intercepted and\n * cancelled.  -1 = no highlight. Also scrolls the menu item into view.\n * @param {number} index Index of menu item to highlight.\n * @override\n */\ngoog.ui.FilteredMenu.prototype.setHighlightedIndex = function(index) {\n  goog.ui.FilteredMenu.superClass_.setHighlightedIndex.call(this, index);\n  var contentEl = this.getContentElement();\n  var el = /** @type {!HTMLElement} */ (\n      this.getHighlighted() ? this.getHighlighted().getElement() : null);\n  if (this.filterInput_) {\n    goog.a11y.aria.setActiveDescendant(this.filterInput_, el);\n  }\n\n  if (el && goog.dom.contains(contentEl, el)) {\n    var contentTop = goog.userAgent.IE && !goog.userAgent.isVersionOrHigher(8) ?\n        0 :\n        contentEl.offsetTop;\n\n    // IE (tested on IE8) sometime does not scroll enough by about\n    // 1px. So we add 1px to the scroll amount. This still looks ok in\n    // other browser except for the most degenerate case (menu height <=\n    // item height).\n\n    // Scroll down if the highlighted item is below the bottom edge.\n    var diff = (el.offsetTop + el.offsetHeight - contentTop) -\n        (contentEl.clientHeight + contentEl.scrollTop) + 1;\n    contentEl.scrollTop += Math.max(diff, 0);\n\n    // Scroll up if the highlighted item is above the top edge.\n    diff = contentEl.scrollTop - (el.offsetTop - contentTop) + 1;\n    contentEl.scrollTop -= Math.max(diff, 0);\n  }\n};\n\n\n/**\n * Handles clicks on the filter label. Focuses the input element.\n * @param {goog.events.BrowserEvent} e A browser event.\n * @private\n */\ngoog.ui.FilteredMenu.prototype.onFilterLabelClick_ = function(e) {\n  this.filterInput_.focus();\n};\n\n\n/** @override */\ngoog.ui.FilteredMenu.prototype.getContentElement = function() {\n  return this.contentElement_ || this.getElement();\n};\n\n\n/**\n * Returns the filter input element.\n * @return {Element} Input element.\n */\ngoog.ui.FilteredMenu.prototype.getFilterInputElement = function() {\n  return this.filterInput_ || null;\n};\n\n\n/** @override */\ngoog.ui.FilteredMenu.prototype.decorateInternal = function(element) {\n  this.setElementInternal(element);\n\n  // Decorate the menu content.\n  this.decorateContent(element);\n\n  // Locate internally managed elements.\n  var el = this.getDomHelper().getElementsByTagNameAndClass(\n      goog.dom.TagName.DIV,\n      goog.getCssName(this.getRenderer().getCssClass(), 'filter'), element)[0];\n  this.labelEl_ = goog.dom.getFirstElementChild(el);\n  this.filterInput_ = goog.dom.getNextElementSibling(this.labelEl_);\n  this.contentElement_ = goog.dom.getNextElementSibling(el);\n\n  // Decorate additional menu items (like 'apply').\n  this.getRenderer().decorateChildren(\n      this,\n      /** @type {!Element} */ (el.parentNode), this.contentElement_);\n\n  this.initFilterInput_();\n};\n","^AK",1579837703000,"^AL",["^AM",["^BL","^BE","^BF","^BT","~$goog.dom.InputType","^AA","^BH","~$goog.a11y.aria.AutoCompleteValues","^BU","^CJ","~$goog.events.InputHandler","^DF","^CG","^BI","~$goog.ui.FilterObservingMenuItem","^DH","^CS","^BJ"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/ui/filteredmenu.js"],"^B6",["^AM",["~$goog.ui.FilteredMenu"]],"^A?",true,"^A@",["^AA","^BE","^EY","^DF","^BL","^EX","^BJ","^CS","^BU","^EZ","^DH","^BF","^BI","^BT","^E[","^CJ","^CG","^BH"]],["^ ","^AC",[1579837703000],"^AD","goog.vec.float64array.js","^AE",["^AF","goog/vec/float64array.js"],"^AG","goog/vec/float64array.js","^AH","^AI","^AJ","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n\n/**\n * @fileoverview Supplies a Float64Array implementation that implements\n * most of the Float64Array spec and that can be used when a built-in\n * implementation is not available.\n *\n * Note that if no existing Float64Array implementation is found then this\n * class and all its public properties are exported as Float64Array.\n *\n * Adding support for the other TypedArray classes here does not make sense\n * since this vector math library only needs Float32Array and Float64Array.\n *\n */\ngoog.provide('goog.vec.Float64Array');\n\n\n\n/**\n * Constructs a new Float64Array. The new array is initialized to all zeros.\n *\n * @param {goog.vec.Float64Array|Array|ArrayBuffer|number} p0\n *     The length of the array, or an array to initialize the contents of the\n *     new Float64Array.\n * @constructor\n * @implements {IArrayLike<number>}\n * @final\n */\ngoog.vec.Float64Array = function(p0) {\n  /** @type {number} */\n  this.length = /** @type {number} */ (p0.length || p0);\n  for (let i = 0; i < this.length; i++) {\n    this[i] = p0[i] || 0;\n  }\n};\n\n\n/**\n * The number of bytes in an element (as defined by the Typed Array\n * specification).\n *\n * @type {number}\n */\ngoog.vec.Float64Array.BYTES_PER_ELEMENT = 8;\n\n\n/**\n * The number of bytes in an element (as defined by the Typed Array\n * specification).\n *\n * @type {number}\n */\ngoog.vec.Float64Array.prototype.BYTES_PER_ELEMENT = 8;\n\n\n/**\n * Sets elements of the array.\n * @param {Array<number>|Float64Array} values The array of values.\n * @param {number=} opt_offset The offset in this array to start.\n */\ngoog.vec.Float64Array.prototype.set = function(values, opt_offset) {\n  opt_offset = opt_offset || 0;\n  for (let i = 0; i < values.length && opt_offset + i < this.length; i++) {\n    this[opt_offset + i] = values[i];\n  }\n};\n\n\n/**\n * Creates a string representation of this array.\n * @return {string} The string version of this array.\n * @override\n */\ngoog.vec.Float64Array.prototype.toString = Array.prototype.join;\n\n\n/**\n * Note that we cannot implement the subarray() or (deprecated) slice()\n * methods properly since doing so would require being able to overload\n * the [] operator which is not possible in javascript.  So we leave\n * them unimplemented.  Any attempt to call these methods will just result\n * in a javascript error since we leave them undefined.\n */\n\n\n/**\n * If no existing Float64Array implementation is found then we export\n * goog.vec.Float64Array as Float64Array.\n */\nif (typeof Float64Array == 'undefined') {\n  try {\n    goog.exportProperty(\n        goog.vec.Float64Array, 'BYTES_PER_ELEMENT',\n        goog.vec.Float64Array.BYTES_PER_ELEMENT);\n  } catch (float64ArrayError) {\n    // Do nothing.  This code is in place to fix b/7225850, in which an error\n    // is incorrectly thrown for Google TV on an old Chrome.\n    // TODO(user): remove after that version is retired.\n  }\n\n  goog.exportProperty(\n      goog.vec.Float64Array.prototype, 'BYTES_PER_ELEMENT',\n      goog.vec.Float64Array.prototype.BYTES_PER_ELEMENT);\n  goog.exportProperty(\n      goog.vec.Float64Array.prototype, 'set',\n      goog.vec.Float64Array.prototype.set);\n  goog.exportProperty(\n      goog.vec.Float64Array.prototype, 'toString',\n      goog.vec.Float64Array.prototype.toString);\n  goog.exportSymbol('Float64Array', goog.vec.Float64Array);\n}\n","^AK",1579837703000,"^AL",["^AM",["^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/float64array.js"],"^B6",["^AM",["~$goog.vec.Float64Array"]],"^A?",true,"^A@",["^AA"]],["^ ","^AC",[1579837703000],"^AD","goog.vec.mat3.js","^AE",["^AF","goog/vec/mat3.js"],"^AG","goog/vec/mat3.js","^AH","^AI","^AJ","// Copyright 2011 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Implements 3x3 matrices and their related functions which are\n * compatible with WebGL. The API is structured to avoid unnecessary memory\n * allocations.  The last parameter will typically be the output vector and\n * an object can be both an input and output parameter to all methods except\n * where noted. Matrix operations follow the mathematical form when multiplying\n * vectors as follows: resultVec = matrix * vec.\n *\n * The matrices are stored in column-major order.\n *\n */\ngoog.provide('goog.vec.Mat3');\n\ngoog.require('goog.vec');\n\n\n/** @typedef {!goog.vec.Float32} */ goog.vec.Mat3.Float32;\n/** @typedef {!goog.vec.Float64} */ goog.vec.Mat3.Float64;\n/** @typedef {!goog.vec.Number} */ goog.vec.Mat3.Number;\n/** @typedef {!goog.vec.AnyType} */ goog.vec.Mat3.AnyType;\n\n// The following two types are deprecated - use the above types instead.\n/** @typedef {!Float32Array} */ goog.vec.Mat3.Type;\n/** @typedef {!goog.vec.ArrayType} */ goog.vec.Mat3.Mat3Like;\n\n\n/**\n * Creates the array representation of a 3x3 matrix of Float32.\n * The use of the array directly instead of a class reduces overhead.\n * The returned matrix is cleared to all zeros.\n *\n * @return {!goog.vec.Mat3.Float32} The new matrix.\n */\ngoog.vec.Mat3.createFloat32 = function() {\n  return new Float32Array(9);\n};\n\n\n/**\n * Creates the array representation of a 3x3 matrix of Float64.\n * The returned matrix is cleared to all zeros.\n *\n * @return {!goog.vec.Mat3.Float64} The new matrix.\n */\ngoog.vec.Mat3.createFloat64 = function() {\n  return new Float64Array(9);\n};\n\n\n/**\n * Creates the array representation of a 3x3 matrix of Number.\n * The returned matrix is cleared to all zeros.\n *\n * @return {!goog.vec.Mat3.Number} The new matrix.\n */\ngoog.vec.Mat3.createNumber = function() {\n  var a = new Array(9);\n  goog.vec.Mat3.setFromValues(a, 0, 0, 0, 0, 0, 0, 0, 0, 0);\n  return a;\n};\n\n\n/**\n * Creates the array representation of a 3x3 matrix of Float32.\n * The returned matrix is cleared to all zeros.\n *\n * @deprecated Use createFloat32.\n * @return {!goog.vec.Mat3.Type} The new matrix.\n */\ngoog.vec.Mat3.create = function() {\n  return goog.vec.Mat3.createFloat32();\n};\n\n\n/**\n * Creates a 3x3 identity matrix of Float32.\n *\n * @return {!goog.vec.Mat3.Float32} The new 9 element array.\n */\ngoog.vec.Mat3.createFloat32Identity = function() {\n  var mat = goog.vec.Mat3.createFloat32();\n  mat[0] = mat[4] = mat[8] = 1;\n  return mat;\n};\n\n\n/**\n * Creates a 3x3 identity matrix of Float64.\n *\n * @return {!goog.vec.Mat3.Float64} The new 9 element array.\n */\ngoog.vec.Mat3.createFloat64Identity = function() {\n  var mat = goog.vec.Mat3.createFloat64();\n  mat[0] = mat[4] = mat[8] = 1;\n  return mat;\n};\n\n\n/**\n * Creates a 3x3 identity matrix of Number.\n * The returned matrix is cleared to all zeros.\n *\n * @return {!goog.vec.Mat3.Number} The new 9 element array.\n */\ngoog.vec.Mat3.createNumberIdentity = function() {\n  var a = new Array(9);\n  goog.vec.Mat3.setFromValues(a, 1, 0, 0, 0, 1, 0, 0, 0, 1);\n  return a;\n};\n\n\n/**\n * Creates the array representation of a 3x3 matrix of Float32.\n * The returned matrix is cleared to all zeros.\n *\n * @deprecated Use createFloat32Identity.\n * @return {!goog.vec.Mat3.Type} The new 9 element array.\n */\ngoog.vec.Mat3.createIdentity = function() {\n  return goog.vec.Mat3.createFloat32Identity();\n};\n\n\n/**\n * Creates a 3x3 matrix of Float32 initialized from the given array.\n *\n * @param {goog.vec.Mat3.AnyType} matrix The array containing the\n *     matrix values in column major order.\n * @return {!goog.vec.Mat3.Float32} The new, nine element array.\n */\ngoog.vec.Mat3.createFloat32FromArray = function(matrix) {\n  var newMatrix = goog.vec.Mat3.createFloat32();\n  goog.vec.Mat3.setFromArray(newMatrix, matrix);\n  return newMatrix;\n};\n\n\n/**\n * Creates a 3x3 matrix of Float32 initialized from the given values.\n *\n * @param {number} v00 The values at (0, 0).\n * @param {number} v10 The values at (1, 0).\n * @param {number} v20 The values at (2, 0).\n * @param {number} v01 The values at (0, 1).\n * @param {number} v11 The values at (1, 1).\n * @param {number} v21 The values at (2, 1).\n * @param {number} v02 The values at (0, 2).\n * @param {number} v12 The values at (1, 2).\n * @param {number} v22 The values at (2, 2).\n * @return {!goog.vec.Mat3.Float32} The new, nine element array.\n */\ngoog.vec.Mat3.createFloat32FromValues = function(\n    v00, v10, v20, v01, v11, v21, v02, v12, v22) {\n  var newMatrix = goog.vec.Mat3.createFloat32();\n  goog.vec.Mat3.setFromValues(\n      newMatrix, v00, v10, v20, v01, v11, v21, v02, v12, v22);\n  return newMatrix;\n};\n\n\n/**\n * Creates a clone of a 3x3 matrix of Float32.\n *\n * @param {goog.vec.Mat3.Float32} matrix The source 3x3 matrix.\n * @return {!goog.vec.Mat3.Float32} The new 3x3 element matrix.\n */\ngoog.vec.Mat3.cloneFloat32 = goog.vec.Mat3.createFloat32FromArray;\n\n\n/**\n * Creates a 3x3 matrix of Float64 initialized from the given array.\n *\n * @param {goog.vec.Mat3.AnyType} matrix The array containing the\n *     matrix values in column major order.\n * @return {!goog.vec.Mat3.Float64} The new, nine element array.\n */\ngoog.vec.Mat3.createFloat64FromArray = function(matrix) {\n  var newMatrix = goog.vec.Mat3.createFloat64();\n  goog.vec.Mat3.setFromArray(newMatrix, matrix);\n  return newMatrix;\n};\n\n\n/**\n * Creates a 3x3 matrix of Float64 initialized from the given values.\n *\n * @param {number} v00 The values at (0, 0).\n * @param {number} v10 The values at (1, 0).\n * @param {number} v20 The values at (2, 0).\n * @param {number} v01 The values at (0, 1).\n * @param {number} v11 The values at (1, 1).\n * @param {number} v21 The values at (2, 1).\n * @param {number} v02 The values at (0, 2).\n * @param {number} v12 The values at (1, 2).\n * @param {number} v22 The values at (2, 2).\n * @return {!goog.vec.Mat3.Float64} The new, nine element array.\n */\ngoog.vec.Mat3.createFloat64FromValues = function(\n    v00, v10, v20, v01, v11, v21, v02, v12, v22) {\n  var newMatrix = goog.vec.Mat3.createFloat64();\n  goog.vec.Mat3.setFromValues(\n      newMatrix, v00, v10, v20, v01, v11, v21, v02, v12, v22);\n  return newMatrix;\n};\n\n\n/**\n * Creates a clone of a 3x3 matrix of Float64.\n *\n * @param {goog.vec.Mat3.Float64} matrix The source 3x3 matrix.\n * @return {!goog.vec.Mat3.Float64} The new 3x3 element matrix.\n */\ngoog.vec.Mat3.cloneFloat64 = goog.vec.Mat3.createFloat64FromArray;\n\n\n/**\n * Creates a 3x3 matrix of Float32 initialized from the given array.\n *\n * @deprecated Use createFloat32FromArray.\n * @param {goog.vec.Mat3.Mat3Like} matrix The array containing the\n *     matrix values in column major order.\n * @return {!goog.vec.Mat3.Type} The new, nine element array.\n */\ngoog.vec.Mat3.createFromArray = function(matrix) {\n  var newMatrix = goog.vec.Mat3.createFloat32();\n  goog.vec.Mat3.setFromArray(newMatrix, matrix);\n  return newMatrix;\n};\n\n\n/**\n * Creates a 3x3 matrix of Float32 initialized from the given values.\n *\n * @deprecated Use createFloat32FromValues.\n * @param {number} v00 The values at (0, 0).\n * @param {number} v10 The values at (1, 0).\n * @param {number} v20 The values at (2, 0).\n * @param {number} v01 The values at (0, 1).\n * @param {number} v11 The values at (1, 1).\n * @param {number} v21 The values at (2, 1).\n * @param {number} v02 The values at (0, 2).\n * @param {number} v12 The values at (1, 2).\n * @param {number} v22 The values at (2, 2).\n * @return {!goog.vec.Mat3.Type} The new, nine element array.\n */\ngoog.vec.Mat3.createFromValues = function(\n    v00, v10, v20, v01, v11, v21, v02, v12, v22) {\n  var newMatrix = goog.vec.Mat3.create();\n  goog.vec.Mat3.setFromValues(\n      newMatrix, v00, v10, v20, v01, v11, v21, v02, v12, v22);\n  return newMatrix;\n};\n\n\n/**\n * Creates a clone of a 3x3 matrix of Float32.\n *\n * @deprecated Use cloneFloat32.\n * @param {goog.vec.Mat3.Mat3Like} matrix The source 3x3 matrix.\n * @return {!goog.vec.Mat3.Type} The new 3x3 element matrix.\n */\ngoog.vec.Mat3.clone = goog.vec.Mat3.createFromArray;\n\n\n/**\n * Retrieves the element at the requested row and column.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix containing the value to\n *     retrieve.\n * @param {number} row The row index.\n * @param {number} column The column index.\n * @return {number} The element value at the requested row, column indices.\n */\ngoog.vec.Mat3.getElement = function(mat, row, column) {\n  return mat[row + column * 3];\n};\n\n\n/**\n * Sets the element at the requested row and column.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix containing the value to\n *     retrieve.\n * @param {number} row The row index.\n * @param {number} column The column index.\n * @param {number} value The value to set at the requested row, column.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.setElement = function(mat, row, column, value) {\n  mat[row + column * 3] = value;\n  return mat;\n};\n\n\n/**\n * Initializes the matrix from the set of values. Note the values supplied are\n * in column major order.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix to receive the\n *     values.\n * @param {number} v00 The values at (0, 0).\n * @param {number} v10 The values at (1, 0).\n * @param {number} v20 The values at (2, 0).\n * @param {number} v01 The values at (0, 1).\n * @param {number} v11 The values at (1, 1).\n * @param {number} v21 The values at (2, 1).\n * @param {number} v02 The values at (0, 2).\n * @param {number} v12 The values at (1, 2).\n * @param {number} v22 The values at (2, 2).\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.setFromValues = function(\n    mat, v00, v10, v20, v01, v11, v21, v02, v12, v22) {\n  mat[0] = v00;\n  mat[1] = v10;\n  mat[2] = v20;\n  mat[3] = v01;\n  mat[4] = v11;\n  mat[5] = v21;\n  mat[6] = v02;\n  mat[7] = v12;\n  mat[8] = v22;\n  return mat;\n};\n\n\n/**\n * Sets the matrix from the array of values stored in column major order.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix to receive the values.\n * @param {goog.vec.Mat3.AnyType} values The column major ordered\n *     array of values to store in the matrix.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.setFromArray = function(mat, values) {\n  mat[0] = values[0];\n  mat[1] = values[1];\n  mat[2] = values[2];\n  mat[3] = values[3];\n  mat[4] = values[4];\n  mat[5] = values[5];\n  mat[6] = values[6];\n  mat[7] = values[7];\n  mat[8] = values[8];\n  return mat;\n};\n\n\n/**\n * Sets the matrix from the array of values stored in row major order.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix to receive the values.\n * @param {goog.vec.Mat3.AnyType} values The row major ordered array\n *     of values to store in the matrix.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.setFromRowMajorArray = function(mat, values) {\n  mat[0] = values[0];\n  mat[1] = values[3];\n  mat[2] = values[6];\n  mat[3] = values[1];\n  mat[4] = values[4];\n  mat[5] = values[7];\n  mat[6] = values[2];\n  mat[7] = values[5];\n  mat[8] = values[8];\n  return mat;\n};\n\n\n/**\n * Sets the diagonal values of the matrix from the given values.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix to receive the values.\n * @param {number} v00 The values for (0, 0).\n * @param {number} v11 The values for (1, 1).\n * @param {number} v22 The values for (2, 2).\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.setDiagonalValues = function(mat, v00, v11, v22) {\n  mat[0] = v00;\n  mat[4] = v11;\n  mat[8] = v22;\n  return mat;\n};\n\n\n/**\n * Sets the diagonal values of the matrix from the given vector.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix to receive the values.\n * @param {goog.vec.Vec3.AnyType} vec The vector containing the values.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.setDiagonal = function(mat, vec) {\n  mat[0] = vec[0];\n  mat[4] = vec[1];\n  mat[8] = vec[2];\n  return mat;\n};\n\n\n/**\n * Sets the specified column with the supplied values.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix to receive the values.\n * @param {number} column The column index to set the values on.\n * @param {number} v0 The value for row 0.\n * @param {number} v1 The value for row 1.\n * @param {number} v2 The value for row 2.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.setColumnValues = function(mat, column, v0, v1, v2) {\n  var i = column * 3;\n  mat[i] = v0;\n  mat[i + 1] = v1;\n  mat[i + 2] = v2;\n  return mat;\n};\n\n\n/**\n * Sets the specified column with the value from the supplied array.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix to receive the values.\n * @param {number} column The column index to set the values on.\n * @param {goog.vec.Vec3.AnyType} vec The vector elements for the column.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.setColumn = function(mat, column, vec) {\n  var i = column * 3;\n  mat[i] = vec[0];\n  mat[i + 1] = vec[1];\n  mat[i + 2] = vec[2];\n  return mat;\n};\n\n\n/**\n * Retrieves the specified column from the matrix into the given vector\n * array.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix supplying the values.\n * @param {number} column The column to get the values from.\n * @param {goog.vec.Vec3.AnyType} vec The vector elements to receive the\n *     column.\n * @return {goog.vec.Vec3.AnyType} return vec so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.getColumn = function(mat, column, vec) {\n  var i = column * 3;\n  vec[0] = mat[i];\n  vec[1] = mat[i + 1];\n  vec[2] = mat[i + 2];\n  return vec;\n};\n\n\n/**\n * Sets the columns of the matrix from the set of vector elements.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix to receive the values.\n * @param {goog.vec.Vec3.AnyType} vec0 The values for column 0.\n * @param {goog.vec.Vec3.AnyType} vec1 The values for column 1.\n * @param {goog.vec.Vec3.AnyType} vec2 The values for column 2.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.setColumns = function(mat, vec0, vec1, vec2) {\n  goog.vec.Mat3.setColumn(mat, 0, vec0);\n  goog.vec.Mat3.setColumn(mat, 1, vec1);\n  goog.vec.Mat3.setColumn(mat, 2, vec2);\n  return mat;\n};\n\n\n/**\n * Retrieves the column values from the given matrix into the given vector\n * elements.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix supplying the columns.\n * @param {goog.vec.Vec3.AnyType} vec0 The vector to receive column 0.\n * @param {goog.vec.Vec3.AnyType} vec1 The vector to receive column 1.\n * @param {goog.vec.Vec3.AnyType} vec2 The vector to receive column 2.\n */\ngoog.vec.Mat3.getColumns = function(mat, vec0, vec1, vec2) {\n  goog.vec.Mat3.getColumn(mat, 0, vec0);\n  goog.vec.Mat3.getColumn(mat, 1, vec1);\n  goog.vec.Mat3.getColumn(mat, 2, vec2);\n};\n\n\n/**\n * Sets the row values from the supplied values.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix to receive the values.\n * @param {number} row The index of the row to receive the values.\n * @param {number} v0 The value for column 0.\n * @param {number} v1 The value for column 1.\n * @param {number} v2 The value for column 2.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.setRowValues = function(mat, row, v0, v1, v2) {\n  mat[row] = v0;\n  mat[row + 3] = v1;\n  mat[row + 6] = v2;\n  return mat;\n};\n\n\n/**\n * Sets the row values from the supplied vector.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix to receive the row values.\n * @param {number} row The index of the row.\n * @param {goog.vec.Vec3.AnyType} vec The vector containing the values.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.setRow = function(mat, row, vec) {\n  mat[row] = vec[0];\n  mat[row + 3] = vec[1];\n  mat[row + 6] = vec[2];\n  return mat;\n};\n\n\n/**\n * Retrieves the row values into the given vector.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix supplying the values.\n * @param {number} row The index of the row supplying the values.\n * @param {goog.vec.Vec3.AnyType} vec The vector to receive the row.\n * @return {goog.vec.Vec3.AnyType} return vec so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.getRow = function(mat, row, vec) {\n  vec[0] = mat[row];\n  vec[1] = mat[row + 3];\n  vec[2] = mat[row + 6];\n  return vec;\n};\n\n\n/**\n * Sets the rows of the matrix from the supplied vectors.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix to receive the values.\n * @param {goog.vec.Vec3.AnyType} vec0 The values for row 0.\n * @param {goog.vec.Vec3.AnyType} vec1 The values for row 1.\n * @param {goog.vec.Vec3.AnyType} vec2 The values for row 2.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.setRows = function(mat, vec0, vec1, vec2) {\n  goog.vec.Mat3.setRow(mat, 0, vec0);\n  goog.vec.Mat3.setRow(mat, 1, vec1);\n  goog.vec.Mat3.setRow(mat, 2, vec2);\n  return mat;\n};\n\n\n/**\n * Retrieves the rows of the matrix into the supplied vectors.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix to supplying the values.\n * @param {goog.vec.Vec3.AnyType} vec0 The vector to receive row 0.\n * @param {goog.vec.Vec3.AnyType} vec1 The vector to receive row 1.\n * @param {goog.vec.Vec3.AnyType} vec2 The vector to receive row 2.\n */\ngoog.vec.Mat3.getRows = function(mat, vec0, vec1, vec2) {\n  goog.vec.Mat3.getRow(mat, 0, vec0);\n  goog.vec.Mat3.getRow(mat, 1, vec1);\n  goog.vec.Mat3.getRow(mat, 2, vec2);\n};\n\n\n/**\n * Makes the given 3x3 matrix the zero matrix.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix.\n * @return {goog.vec.Mat3.AnyType} return mat so operations can be chained.\n */\ngoog.vec.Mat3.makeZero = function(mat) {\n  mat[0] = 0;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 0;\n  mat[5] = 0;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 0;\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix the identity matrix.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix.\n * @return {goog.vec.Mat3.AnyType} return mat so operations can be chained.\n */\ngoog.vec.Mat3.makeIdentity = function(mat) {\n  mat[0] = 1;\n  mat[1] = 0;\n  mat[2] = 0;\n  mat[3] = 0;\n  mat[4] = 1;\n  mat[5] = 0;\n  mat[6] = 0;\n  mat[7] = 0;\n  mat[8] = 1;\n  return mat;\n};\n\n\n/**\n * Performs a per-component addition of the matrices mat0 and mat1, storing\n * the result into resultMat.\n *\n * @param {goog.vec.Mat3.AnyType} mat0 The first addend.\n * @param {goog.vec.Mat3.AnyType} mat1 The second addend.\n * @param {goog.vec.Mat3.AnyType} resultMat The matrix to\n *     receive the results (may be either mat0 or mat1).\n * @return {goog.vec.Mat3.AnyType} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.addMat = function(mat0, mat1, resultMat) {\n  resultMat[0] = mat0[0] + mat1[0];\n  resultMat[1] = mat0[1] + mat1[1];\n  resultMat[2] = mat0[2] + mat1[2];\n  resultMat[3] = mat0[3] + mat1[3];\n  resultMat[4] = mat0[4] + mat1[4];\n  resultMat[5] = mat0[5] + mat1[5];\n  resultMat[6] = mat0[6] + mat1[6];\n  resultMat[7] = mat0[7] + mat1[7];\n  resultMat[8] = mat0[8] + mat1[8];\n  return resultMat;\n};\n\n\n/**\n * Performs a per-component subtraction of the matrices mat0 and mat1,\n * storing the result into resultMat.\n *\n * @param {goog.vec.Mat3.AnyType} mat0 The minuend.\n * @param {goog.vec.Mat3.AnyType} mat1 The subtrahend.\n * @param {goog.vec.Mat3.AnyType} resultMat The matrix to receive\n *     the results (may be either mat0 or mat1).\n * @return {goog.vec.Mat3.AnyType} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.subMat = function(mat0, mat1, resultMat) {\n  resultMat[0] = mat0[0] - mat1[0];\n  resultMat[1] = mat0[1] - mat1[1];\n  resultMat[2] = mat0[2] - mat1[2];\n  resultMat[3] = mat0[3] - mat1[3];\n  resultMat[4] = mat0[4] - mat1[4];\n  resultMat[5] = mat0[5] - mat1[5];\n  resultMat[6] = mat0[6] - mat1[6];\n  resultMat[7] = mat0[7] - mat1[7];\n  resultMat[8] = mat0[8] - mat1[8];\n  return resultMat;\n};\n\n\n/**\n * Multiplies matrix mat0 with the given scalar, storing the result\n * into resultMat.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix.\n * @param {number} scalar The scalar value to multiple to each element of mat.\n * @param {goog.vec.Mat3.AnyType} resultMat The matrix to receive\n *     the results (may be mat).\n * @return {goog.vec.Mat3.AnyType} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.multScalar = function(mat, scalar, resultMat) {\n  resultMat[0] = mat[0] * scalar;\n  resultMat[1] = mat[1] * scalar;\n  resultMat[2] = mat[2] * scalar;\n  resultMat[3] = mat[3] * scalar;\n  resultMat[4] = mat[4] * scalar;\n  resultMat[5] = mat[5] * scalar;\n  resultMat[6] = mat[6] * scalar;\n  resultMat[7] = mat[7] * scalar;\n  resultMat[8] = mat[8] * scalar;\n  return resultMat;\n};\n\n\n/**\n * Multiplies the two matrices mat0 and mat1 using matrix multiplication,\n * storing the result into resultMat.\n *\n * @param {goog.vec.Mat3.AnyType} mat0 The first (left hand) matrix.\n * @param {goog.vec.Mat3.AnyType} mat1 The second (right hand) matrix.\n * @param {goog.vec.Mat3.AnyType} resultMat The matrix to receive\n *     the results (may be either mat0 or mat1).\n * @return {goog.vec.Mat3.AnyType} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.multMat = function(mat0, mat1, resultMat) {\n  var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2];\n  var a01 = mat0[3], a11 = mat0[4], a21 = mat0[5];\n  var a02 = mat0[6], a12 = mat0[7], a22 = mat0[8];\n\n  var b00 = mat1[0], b10 = mat1[1], b20 = mat1[2];\n  var b01 = mat1[3], b11 = mat1[4], b21 = mat1[5];\n  var b02 = mat1[6], b12 = mat1[7], b22 = mat1[8];\n\n  resultMat[0] = a00 * b00 + a01 * b10 + a02 * b20;\n  resultMat[1] = a10 * b00 + a11 * b10 + a12 * b20;\n  resultMat[2] = a20 * b00 + a21 * b10 + a22 * b20;\n  resultMat[3] = a00 * b01 + a01 * b11 + a02 * b21;\n  resultMat[4] = a10 * b01 + a11 * b11 + a12 * b21;\n  resultMat[5] = a20 * b01 + a21 * b11 + a22 * b21;\n  resultMat[6] = a00 * b02 + a01 * b12 + a02 * b22;\n  resultMat[7] = a10 * b02 + a11 * b12 + a12 * b22;\n  resultMat[8] = a20 * b02 + a21 * b12 + a22 * b22;\n  return resultMat;\n};\n\n\n/**\n * Transposes the given matrix mat storing the result into resultMat.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix to transpose.\n * @param {goog.vec.Mat3.AnyType} resultMat The matrix to receive\n *     the results (may be mat).\n * @return {goog.vec.Mat3.AnyType} return resultMat so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.transpose = function(mat, resultMat) {\n  if (resultMat == mat) {\n    var a10 = mat[1], a20 = mat[2], a21 = mat[5];\n    resultMat[1] = mat[3];\n    resultMat[2] = mat[6];\n    resultMat[3] = a10;\n    resultMat[5] = mat[7];\n    resultMat[6] = a20;\n    resultMat[7] = a21;\n  } else {\n    resultMat[0] = mat[0];\n    resultMat[1] = mat[3];\n    resultMat[2] = mat[6];\n    resultMat[3] = mat[1];\n    resultMat[4] = mat[4];\n    resultMat[5] = mat[7];\n    resultMat[6] = mat[2];\n    resultMat[7] = mat[5];\n    resultMat[8] = mat[8];\n  }\n  return resultMat;\n};\n\n\n/**\n * Computes the inverse of mat0 storing the result into resultMat. If the\n * inverse is defined, this function returns true, false otherwise.\n *\n * @param {goog.vec.Mat3.AnyType} mat0 The matrix to invert.\n * @param {goog.vec.Mat3.AnyType} resultMat The matrix to receive\n *     the result (may be mat0).\n * @return {boolean} True if the inverse is defined. If false is returned,\n *     resultMat is not modified.\n */\ngoog.vec.Mat3.invert = function(mat0, resultMat) {\n  var a00 = mat0[0], a10 = mat0[1], a20 = mat0[2];\n  var a01 = mat0[3], a11 = mat0[4], a21 = mat0[5];\n  var a02 = mat0[6], a12 = mat0[7], a22 = mat0[8];\n\n  var t00 = a11 * a22 - a12 * a21;\n  var t10 = a12 * a20 - a10 * a22;\n  var t20 = a10 * a21 - a11 * a20;\n  var det = a00 * t00 + a01 * t10 + a02 * t20;\n  if (det == 0) {\n    return false;\n  }\n\n  var idet = 1 / det;\n  resultMat[0] = t00 * idet;\n  resultMat[3] = (a02 * a21 - a01 * a22) * idet;\n  resultMat[6] = (a01 * a12 - a02 * a11) * idet;\n\n  resultMat[1] = t10 * idet;\n  resultMat[4] = (a00 * a22 - a02 * a20) * idet;\n  resultMat[7] = (a02 * a10 - a00 * a12) * idet;\n\n  resultMat[2] = t20 * idet;\n  resultMat[5] = (a01 * a20 - a00 * a21) * idet;\n  resultMat[8] = (a00 * a11 - a01 * a10) * idet;\n  return true;\n};\n\n\n/**\n * Returns true if the components of mat0 are equal to the components of mat1.\n *\n * @param {goog.vec.Mat3.AnyType} mat0 The first matrix.\n * @param {goog.vec.Mat3.AnyType} mat1 The second matrix.\n * @return {boolean} True if the the two matrices are equivalent.\n */\ngoog.vec.Mat3.equals = function(mat0, mat1) {\n  return mat0.length == mat1.length && mat0[0] == mat1[0] &&\n      mat0[1] == mat1[1] && mat0[2] == mat1[2] && mat0[3] == mat1[3] &&\n      mat0[4] == mat1[4] && mat0[5] == mat1[5] && mat0[6] == mat1[6] &&\n      mat0[7] == mat1[7] && mat0[8] == mat1[8];\n};\n\n\n/**\n * Transforms the given vector with the given matrix storing the resulting,\n * transformed matrix into resultVec.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix supplying the transformation.\n * @param {goog.vec.Vec3.AnyType} vec The vector to transform.\n * @param {goog.vec.Vec3.AnyType} resultVec The vector to\n *     receive the results (may be vec).\n * @return {goog.vec.Vec3.AnyType} return resultVec so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.multVec3 = function(mat, vec, resultVec) {\n  var x = vec[0], y = vec[1], z = vec[2];\n  resultVec[0] = x * mat[0] + y * mat[3] + z * mat[6];\n  resultVec[1] = x * mat[1] + y * mat[4] + z * mat[7];\n  resultVec[2] = x * mat[2] + y * mat[5] + z * mat[8];\n  return resultVec;\n};\n\n\n/**\n * Makes the given 3x3 matrix a translation matrix with x and y\n * translation values.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix.\n * @param {number} x The translation along the x axis.\n * @param {number} y The translation along the y axis.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat3.makeTranslate = function(mat, x, y) {\n  goog.vec.Mat3.makeIdentity(mat);\n  return goog.vec.Mat3.setColumnValues(mat, 2, x, y, 1);\n};\n\n\n/**\n * Makes the given 3x3 matrix a scale matrix with x, y, and z scale factors.\n *\n * @param {goog.vec.Mat3.AnyType} mat The 3x3 (9-element) matrix\n *     array to receive the new scale matrix.\n * @param {number} x The scale along the x axis.\n * @param {number} y The scale along the y axis.\n * @param {number} z The scale along the z axis.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat3.makeScale = function(mat, x, y, z) {\n  goog.vec.Mat3.makeIdentity(mat);\n  return goog.vec.Mat3.setDiagonalValues(mat, x, y, z);\n};\n\n\n/**\n * Makes the given 3x3 matrix a rotation matrix with the given rotation\n * angle about the axis defined by the vector (ax, ay, az).\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @param {number} ax The x component of the rotation axis.\n * @param {number} ay The y component of the rotation axis.\n * @param {number} az The z component of the rotation axis.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat3.makeRotate = function(mat, angle, ax, ay, az) {\n  var c = Math.cos(angle);\n  var d = 1 - c;\n  var s = Math.sin(angle);\n\n  return goog.vec.Mat3.setFromValues(\n      mat, ax * ax * d + c, ax * ay * d + az * s, ax * az * d - ay * s,\n\n      ax * ay * d - az * s, ay * ay * d + c, ay * az * d + ax * s,\n\n      ax * az * d + ay * s, ay * az * d - ax * s, az * az * d + c);\n};\n\n\n/**\n * Makes the given 3x3 matrix a rotation matrix with the given rotation\n * angle about the X axis.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat3.makeRotateX = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n  return goog.vec.Mat3.setFromValues(mat, 1, 0, 0, 0, c, s, 0, -s, c);\n};\n\n\n/**\n * Makes the given 3x3 matrix a rotation matrix with the given rotation\n * angle about the Y axis.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat3.makeRotateY = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n  return goog.vec.Mat3.setFromValues(mat, c, 0, -s, 0, 1, 0, s, 0, c);\n};\n\n\n/**\n * Makes the given 3x3 matrix a rotation matrix with the given rotation\n * angle about the Z axis.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix.\n * @param {number} angle The rotation angle in radians.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat3.makeRotateZ = function(mat, angle) {\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n  return goog.vec.Mat3.setFromValues(mat, c, s, 0, -s, c, 0, 0, 0, 1);\n};\n\n\n/**\n * Rotate the given matrix by angle about the x,y,z axis.  Equivalent to:\n * goog.vec.Mat3.multMat(\n *     mat,\n *     goog.vec.Mat3.makeRotate(goog.vec.Mat3.create(), angle, x, y, z),\n *     mat);\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix.\n * @param {number} angle The angle in radians.\n * @param {number} x The x component of the rotation axis.\n * @param {number} y The y component of the rotation axis.\n * @param {number} z The z component of the rotation axis.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat3.rotate = function(mat, angle, x, y, z) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2];\n  var m01 = mat[3], m11 = mat[4], m21 = mat[5];\n  var m02 = mat[6], m12 = mat[7], m22 = mat[8];\n\n  var cosAngle = Math.cos(angle);\n  var sinAngle = Math.sin(angle);\n  var diffCosAngle = 1 - cosAngle;\n  var r00 = x * x * diffCosAngle + cosAngle;\n  var r10 = x * y * diffCosAngle + z * sinAngle;\n  var r20 = x * z * diffCosAngle - y * sinAngle;\n\n  var r01 = x * y * diffCosAngle - z * sinAngle;\n  var r11 = y * y * diffCosAngle + cosAngle;\n  var r21 = y * z * diffCosAngle + x * sinAngle;\n\n  var r02 = x * z * diffCosAngle + y * sinAngle;\n  var r12 = y * z * diffCosAngle - x * sinAngle;\n  var r22 = z * z * diffCosAngle + cosAngle;\n\n  return goog.vec.Mat3.setFromValues(\n      mat, m00 * r00 + m01 * r10 + m02 * r20, m10 * r00 + m11 * r10 + m12 * r20,\n      m20 * r00 + m21 * r10 + m22 * r20,\n\n      m00 * r01 + m01 * r11 + m02 * r21, m10 * r01 + m11 * r11 + m12 * r21,\n      m20 * r01 + m21 * r11 + m22 * r21,\n\n      m00 * r02 + m01 * r12 + m02 * r22, m10 * r02 + m11 * r12 + m12 * r22,\n      m20 * r02 + m21 * r12 + m22 * r22);\n};\n\n\n/**\n * Rotate the given matrix by angle about the x axis.  Equivalent to:\n * goog.vec.Mat3.multMat(\n *     mat,\n *     goog.vec.Mat3.makeRotateX(goog.vec.Mat3.create(), angle),\n *     mat);\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat3.rotateX = function(mat, angle) {\n  var m01 = mat[3], m11 = mat[4], m21 = mat[5];\n  var m02 = mat[6], m12 = mat[7], m22 = mat[8];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[3] = m01 * c + m02 * s;\n  mat[4] = m11 * c + m12 * s;\n  mat[5] = m21 * c + m22 * s;\n  mat[6] = m01 * -s + m02 * c;\n  mat[7] = m11 * -s + m12 * c;\n  mat[8] = m21 * -s + m22 * c;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the y axis.  Equivalent to:\n * goog.vec.Mat3.multMat(\n *     mat,\n *     goog.vec.Mat3.makeRotateY(goog.vec.Mat3.create(), angle),\n *     mat);\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat3.rotateY = function(mat, angle) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2];\n  var m02 = mat[6], m12 = mat[7], m22 = mat[8];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = m00 * c + m02 * -s;\n  mat[1] = m10 * c + m12 * -s;\n  mat[2] = m20 * c + m22 * -s;\n  mat[6] = m00 * s + m02 * c;\n  mat[7] = m10 * s + m12 * c;\n  mat[8] = m20 * s + m22 * c;\n\n  return mat;\n};\n\n\n/**\n * Rotate the given matrix by angle about the z axis.  Equivalent to:\n * goog.vec.Mat3.multMat(\n *     mat,\n *     goog.vec.Mat3.makeRotateZ(goog.vec.Mat3.create(), angle),\n *     mat);\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix.\n * @param {number} angle The angle in radians.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat3.rotateZ = function(mat, angle) {\n  var m00 = mat[0], m10 = mat[1], m20 = mat[2];\n  var m01 = mat[3], m11 = mat[4], m21 = mat[5];\n\n  var c = Math.cos(angle);\n  var s = Math.sin(angle);\n\n  mat[0] = m00 * c + m01 * s;\n  mat[1] = m10 * c + m11 * s;\n  mat[2] = m20 * c + m21 * s;\n  mat[3] = m00 * -s + m01 * c;\n  mat[4] = m10 * -s + m11 * c;\n  mat[5] = m20 * -s + m21 * c;\n\n  return mat;\n};\n\n\n/**\n * Makes the given 3x3 matrix a rotation matrix given Euler angles using\n * the ZXZ convention.\n * Given the euler angles [theta1, theta2, theta3], the rotation is defined as\n * rotation = rotation_z(theta1) * rotation_x(theta2) * rotation_z(theta3),\n * with theta1 in [0, 2 * pi], theta2 in [0, pi] and theta3 in [0, 2 * pi].\n * rotation_x(theta) means rotation around the X axis of theta radians.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix.\n * @param {number} theta1 The angle of rotation around the Z axis in radians.\n * @param {number} theta2 The angle of rotation around the X axis in radians.\n * @param {number} theta3 The angle of rotation around the Z axis in radians.\n * @return {goog.vec.Mat3.AnyType} return mat so that operations can be\n *     chained.\n */\ngoog.vec.Mat3.makeEulerZXZ = function(mat, theta1, theta2, theta3) {\n  var c1 = Math.cos(theta1);\n  var s1 = Math.sin(theta1);\n\n  var c2 = Math.cos(theta2);\n  var s2 = Math.sin(theta2);\n\n  var c3 = Math.cos(theta3);\n  var s3 = Math.sin(theta3);\n\n  mat[0] = c1 * c3 - c2 * s1 * s3;\n  mat[1] = c2 * c1 * s3 + c3 * s1;\n  mat[2] = s3 * s2;\n\n  mat[3] = -c1 * s3 - c3 * c2 * s1;\n  mat[4] = c1 * c2 * c3 - s1 * s3;\n  mat[5] = c3 * s2;\n\n  mat[6] = s2 * s1;\n  mat[7] = -c1 * s2;\n  mat[8] = c2;\n\n  return mat;\n};\n\n\n/**\n * Decomposes a rotation matrix into Euler angles using the ZXZ convention so\n * that rotation = rotation_z(theta1) * rotation_x(theta2) * rotation_z(theta3),\n * with theta1 in [0, 2 * pi], theta2 in [0, pi] and theta3 in [0, 2 * pi].\n * rotation_x(theta) means rotation around the X axis of theta radians.\n *\n * @param {goog.vec.Mat3.AnyType} mat The matrix.\n * @param {goog.vec.Vec3.AnyType} euler The ZXZ Euler angles in\n *     radians as [theta1, theta2, theta3].\n * @param {boolean=} opt_theta2IsNegative Whether theta2 is in [-pi, 0] instead\n *     of the default [0, pi].\n * @return {goog.vec.Vec3.AnyType} return euler so that operations can be\n *     chained together.\n */\ngoog.vec.Mat3.toEulerZXZ = function(mat, euler, opt_theta2IsNegative) {\n  // There is an ambiguity in the sign of sinTheta2 because of the sqrt.\n  var sinTheta2 = Math.sqrt(mat[2] * mat[2] + mat[5] * mat[5]);\n\n  // By default we explicitely constrain theta2 to be in [0, pi],\n  // so sinTheta2 is always positive. We can change the behavior and specify\n  // theta2 to be negative in [-pi, 0] with opt_Theta2IsNegative.\n  var signTheta2 = opt_theta2IsNegative ? -1 : 1;\n\n  if (sinTheta2 > goog.vec.EPSILON) {\n    euler[2] = Math.atan2(mat[2] * signTheta2, mat[5] * signTheta2);\n    euler[1] = Math.atan2(sinTheta2 * signTheta2, mat[8]);\n    euler[0] = Math.atan2(mat[6] * signTheta2, -mat[7] * signTheta2);\n  } else {\n    // There is also an arbitrary choice for theta1 = 0 or theta2 = 0 here.\n    // We assume theta1 = 0 as some applications do not allow the camera to roll\n    // (i.e. have theta1 != 0).\n    euler[0] = 0;\n    euler[1] = Math.atan2(sinTheta2 * signTheta2, mat[8]);\n    euler[2] = Math.atan2(mat[1], mat[0]);\n  }\n\n  // Atan2 outputs angles in [-pi, pi] so we bring them back to [0, 2 * pi].\n  euler[0] = (euler[0] + Math.PI * 2) % (Math.PI * 2);\n  euler[2] = (euler[2] + Math.PI * 2) % (Math.PI * 2);\n  // For theta2 we want the angle to be in [0, pi] or [-pi, 0] depending on\n  // signTheta2.\n  euler[1] =\n      ((euler[1] * signTheta2 + Math.PI * 2) % (Math.PI * 2)) * signTheta2;\n\n  return euler;\n};\n","^AK",1579837703000,"^AL",["^AM",["^E?","^AA"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/vec/mat3.js"],"^B6",["^AM",["~$goog.vec.Mat3"]],"^A?",true,"^A@",["^AA","^E?"]],["^ ","^AC",[1579837703000],"^AD","goog.editor.plugins.abstractbubbleplugin.js","^AE",["^AF","goog/editor/plugins/abstractbubbleplugin.js"],"^AG","goog/editor/plugins/abstractbubbleplugin.js","^AH","^AI","^AJ","// Copyright 2005 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Base class for bubble plugins.\n * @author robbyw@google.com (Robby Walker)\n */\n\ngoog.provide('goog.editor.plugins.AbstractBubblePlugin');\n\ngoog.require('goog.array');\ngoog.require('goog.dom');\ngoog.require('goog.dom.NodeType');\ngoog.require('goog.dom.Range');\ngoog.require('goog.dom.TagName');\ngoog.require('goog.dom.classlist');\ngoog.require('goog.editor.Plugin');\ngoog.require('goog.editor.style');\ngoog.require('goog.events');\ngoog.require('goog.events.EventHandler');\ngoog.require('goog.events.EventType');\ngoog.require('goog.events.KeyCodes');\ngoog.require('goog.events.actionEventWrapper');\ngoog.require('goog.functions');\ngoog.require('goog.string.Unicode');\ngoog.require('goog.ui.Component');\ngoog.require('goog.ui.editor.Bubble');\ngoog.require('goog.userAgent');\n\n\n\n/**\n * Base class for bubble plugins. This is used for to connect user behavior\n * in the editor to a goog.ui.editor.Bubble UI element that allows\n * the user to modify the properties of an element on their page (e.g. the alt\n * text of an image tag).\n *\n * Subclasses should override the abstract method getBubbleTargetFromSelection()\n * with code to determine if the current selection should activate the bubble\n * type. The other abstract method createBubbleContents() should be overriden\n * with code to create the inside markup of the bubble.  The base class creates\n * the rest of the bubble.\n *\n * @constructor\n * @extends {goog.editor.Plugin}\n */\ngoog.editor.plugins.AbstractBubblePlugin = function() {\n  goog.editor.plugins.AbstractBubblePlugin.base(this, 'constructor');\n\n  /**\n   * Place to register events the plugin listens to.\n   * @type {goog.events.EventHandler<\n   *     !goog.editor.plugins.AbstractBubblePlugin>}\n   * @protected\n   */\n  this.eventRegister = new goog.events.EventHandler(this);\n\n  /**\n   * Instance factory function that creates a bubble UI component.  If set to a\n   * non-null value, this function will be used to create a bubble instead of\n   * the global factory function.  It takes as parameters the bubble parent\n   * element and the z index to draw the bubble at.\n   * @type {?function(!Element, number): !goog.ui.editor.Bubble}\n   * @private\n   */\n  this.bubbleFactory_ = null;\n};\ngoog.inherits(goog.editor.plugins.AbstractBubblePlugin, goog.editor.Plugin);\n\n\n/**\n * The css class name of option link elements.\n * @type {string}\n * @private\n */\ngoog.editor.plugins.AbstractBubblePlugin.OPTION_LINK_CLASSNAME_ =\n    goog.getCssName('tr_option-link');\n\n\n/**\n * The css class name of link elements.\n * @type {string}\n * @private\n */\ngoog.editor.plugins.AbstractBubblePlugin.LINK_CLASSNAME_ =\n    goog.getCssName('tr_bubble_link');\n\n\n/**\n * A class name to mark elements that should be reachable by keyboard tabbing.\n * @type {string}\n * @private\n */\ngoog.editor.plugins.AbstractBubblePlugin.TABBABLE_CLASSNAME_ =\n    goog.getCssName('tr_bubble_tabbable');\n\n\n/**\n * The constant string used to separate option links.\n * @type {string}\n * @protected\n */\ngoog.editor.plugins.AbstractBubblePlugin.DASH_NBSP_STRING =\n    goog.string.Unicode.NBSP + '-' + goog.string.Unicode.NBSP;\n\n\n/**\n * Default factory function for creating a bubble UI component.\n * @param {!Element} parent The parent element for the bubble.\n * @param {number} zIndex The z index to draw the bubble at.\n * @return {!goog.ui.editor.Bubble} The new bubble component.\n * @private\n */\ngoog.editor.plugins.AbstractBubblePlugin.defaultBubbleFactory_ = function(\n    parent, zIndex) {\n  return new goog.ui.editor.Bubble(parent, zIndex);\n};\n\n\n/**\n * Global factory function that creates a bubble UI component. It takes as\n * parameters the bubble parent element and the z index to draw the bubble at.\n * @type {function(!Element, number): !goog.ui.editor.Bubble}\n * @private\n */\ngoog.editor.plugins.AbstractBubblePlugin.globalBubbleFactory_ =\n    goog.editor.plugins.AbstractBubblePlugin.defaultBubbleFactory_;\n\n\n/**\n * Sets the global bubble factory function.\n * @param {function(!Element, number): !goog.ui.editor.Bubble}\n *     bubbleFactory Function that creates a bubble for the given bubble parent\n *     element and z index.\n */\ngoog.editor.plugins.AbstractBubblePlugin.setBubbleFactory = function(\n    bubbleFactory) {\n  goog.editor.plugins.AbstractBubblePlugin.globalBubbleFactory_ = bubbleFactory;\n};\n\n\n/**\n * Map from field id to shared bubble object.\n * @type {!Object<goog.ui.editor.Bubble>}\n * @private\n */\ngoog.editor.plugins.AbstractBubblePlugin.bubbleMap_ = {};\n\n\n/**\n * The optional parent of the bubble.  If null or not set, we will use the\n * application document. This is useful when you have an editor embedded in\n * a scrolling DIV.\n * @type {Element|undefined}\n * @private\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.bubbleParent_;\n\n\n/**\n * The id of the panel this plugin added to the shared bubble.  Null when\n * this plugin doesn't currently have a panel in a bubble.\n * @type {string?}\n * @private\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.panelId_ = null;\n\n\n/**\n * Whether this bubble should support tabbing through elements. False\n * by default.\n * @type {boolean}\n * @private\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.keyboardNavigationEnabled_ =\n    false;\n\n\n/**\n * Sets the instance bubble factory function.  If set to a non-null value, this\n * function will be used to create a bubble instead of the global factory\n * function.\n * @param {?function(!Element, number): !goog.ui.editor.Bubble} bubbleFactory\n *     Function that creates a bubble for the given bubble parent element and z\n *     index.  Null to reset the factory function.\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.setBubbleFactory = function(\n    bubbleFactory) {\n  this.bubbleFactory_ = bubbleFactory;\n};\n\n\n/**\n * Sets whether the bubble should support tabbing through elements.\n * @param {boolean} keyboardNavigationEnabled\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.enableKeyboardNavigation =\n    function(keyboardNavigationEnabled) {\n  this.keyboardNavigationEnabled_ = keyboardNavigationEnabled;\n};\n\n\n/**\n * Sets the bubble parent.\n * @param {Element} bubbleParent An element where the bubble will be\n *     anchored. If null, we will use the application document. This\n *     is useful when you have an editor embedded in a scrolling div.\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.setBubbleParent = function(\n    bubbleParent) {\n  this.bubbleParent_ = bubbleParent;\n};\n\n\n/**\n * Returns the bubble map.  Subclasses may override to use a separate map.\n * @return {!Object<goog.ui.editor.Bubble>}\n * @protected\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.getBubbleMap = function() {\n  return goog.editor.plugins.AbstractBubblePlugin.bubbleMap_;\n};\n\n\n/**\n * @return {goog.dom.DomHelper} The dom helper for the bubble window.\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.getBubbleDom = function() {\n  return this.dom_;\n};\n\n\n/** @override */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.getTrogClassId =\n    goog.functions.constant('AbstractBubblePlugin');\n\n\n/**\n * Returns the element whose properties the bubble manipulates.\n * @return {Element} The target element.\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.getTargetElement =\n    function() {\n  return this.targetElement_;\n};\n\n\n/** @override */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.handleKeyUp = function(e) {\n  // For example, when an image is selected, pressing any key overwrites\n  // the image and the panel should be hidden.\n  // Therefore we need to track key presses when the bubble is showing.\n  if (this.isVisible()) {\n    this.handleSelectionChange();\n  }\n  return false;\n};\n\n\n/**\n * Pops up a property bubble for the given selection if appropriate and closes\n * open property bubbles if no longer needed.  This should not be overridden.\n * @override\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.handleSelectionChange =\n    function(opt_e, opt_target) {\n  var selectedElement;\n  if (opt_e) {\n    selectedElement = /** @type {Element} */ (opt_e.target);\n  } else if (opt_target) {\n    selectedElement = /** @type {Element} */ (opt_target);\n  } else {\n    var range = this.getFieldObject().getRange();\n    if (range) {\n      var startNode = range.getStartNode();\n      var endNode = range.getEndNode();\n      var startOffset = range.getStartOffset();\n      var endOffset = range.getEndOffset();\n      // Sometimes in IE, the range will be collapsed, but think the end node\n      // and start node are different (although in the same visible position).\n      // In this case, favor the position IE thinks is the start node.\n      if (goog.userAgent.IE && range.isCollapsed() && startNode != endNode) {\n        range = goog.dom.Range.createCaret(startNode, startOffset);\n      }\n      if (startNode.nodeType == goog.dom.NodeType.ELEMENT &&\n          startNode == endNode && startOffset == endOffset - 1) {\n        var element = startNode.childNodes[startOffset];\n        if (element.nodeType == goog.dom.NodeType.ELEMENT) {\n          selectedElement = /** @type {!Element} */ (element);\n        }\n      }\n    }\n    selectedElement = selectedElement || range && range.getContainerElement();\n  }\n  return this.handleSelectionChangeInternal(selectedElement);\n};\n\n\n/**\n * Pops up a property bubble for the given selection if appropriate and closes\n * open property bubbles if no longer needed.\n * @param {Element?} selectedElement The selected element.\n * @return {boolean} Always false, allowing every bubble plugin to handle the\n *     event.\n * @protected\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype\n    .handleSelectionChangeInternal = function(selectedElement) {\n  if (selectedElement) {\n    var bubbleTarget = this.getBubbleTargetFromSelection(selectedElement);\n    if (bubbleTarget) {\n      if (bubbleTarget != this.targetElement_ || !this.panelId_) {\n        // Make sure any existing panel of the same type is closed before\n        // creating a new one.\n        if (this.panelId_) {\n          this.closeBubble();\n        }\n        this.createBubble(bubbleTarget);\n      }\n      return false;\n    }\n  }\n\n  if (this.panelId_) {\n    this.closeBubble();\n  }\n\n  return false;\n};\n\n\n/**\n * Should be overriden by subclasses to return the bubble target element or\n * null if an element of their required type isn't found.\n * @param {Element} selectedElement The target of the selection change event or\n *     the parent container of the current entire selection.\n * @return {Element?} The HTML bubble target element or null if no element of\n *     the required type is not found.\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype\n    .getBubbleTargetFromSelection = goog.abstractMethod;\n\n\n/** @override */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.disable = function(field) {\n  // When the field is made uneditable, dispose of the bubble.  We do this\n  // because the next time the field is made editable again it may be in\n  // a different document / iframe.\n  if (field.isUneditable()) {\n    var bubbleMap = this.getBubbleMap();\n    var bubble = bubbleMap[field.id];\n    if (bubble) {\n      if (field == this.getFieldObject()) {\n        this.closeBubble();\n      }\n      bubble.dispose();\n      delete bubbleMap[field.id];\n    }\n  }\n};\n\n\n/**\n * @return {!goog.ui.editor.Bubble} The shared bubble object for the field this\n *     plugin is registered on.  Creates it if necessary.\n * @private\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.getSharedBubble_ =\n    function() {\n  var bubbleParent = /** @type {!Element} */ (\n      this.bubbleParent_ || this.getFieldObject().getAppWindow().document.body);\n  this.dom_ = goog.dom.getDomHelper(bubbleParent);\n\n  var bubbleMap = this.getBubbleMap();\n  var bubble = bubbleMap[this.getFieldObject().id];\n  if (!bubble) {\n    var factory = this.bubbleFactory_ ||\n        goog.editor.plugins.AbstractBubblePlugin.globalBubbleFactory_;\n    bubble =\n        factory.call(null, bubbleParent, this.getFieldObject().getBaseZindex());\n    bubbleMap[this.getFieldObject().id] = bubble;\n  }\n  return bubble;\n};\n\n\n/**\n * Creates and shows the property bubble.\n * @param {Element} targetElement The target element of the bubble.\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.createBubble = function(\n    targetElement) {\n  var bubble = this.getSharedBubble_();\n  if (!bubble.hasPanelOfType(this.getBubbleType())) {\n    this.targetElement_ = targetElement;\n\n    this.panelId_ = bubble.addPanel(\n        this.getBubbleType(), this.getBubbleTitle(), targetElement,\n        goog.bind(this.createBubbleContents, this),\n        this.shouldPreferBubbleAboveElement());\n    this.eventRegister.listen(\n        bubble, goog.ui.Component.EventType.HIDE, this.handlePanelClosed_);\n\n    this.onShow();\n\n    if (this.keyboardNavigationEnabled_) {\n      this.eventRegister.listen(\n          bubble.getContentElement(), goog.events.EventType.KEYDOWN,\n          this.onBubbleKey_);\n    }\n  }\n};\n\n\n/**\n * @return {string} The type of bubble shown by this plugin.  Usually the tag\n *     name of the element this bubble targets.\n * @protected\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.getBubbleType = function() {\n  return '';\n};\n\n\n/**\n * @return {string} The title for bubble shown by this plugin.  Defaults to no\n *     title.  Should be overridden by subclasses.\n * @protected\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.getBubbleTitle = function() {\n  return '';\n};\n\n\n/**\n * @return {boolean} Whether the bubble should prefer placement above the\n *     target element.\n * @protected\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype\n    .shouldPreferBubbleAboveElement = goog.functions.FALSE;\n\n\n/**\n * Should be overriden by subclasses to add the type specific contents to the\n *     bubble.\n * @param {Element} bubbleContainer The container element of the bubble to\n *     which the contents should be added.\n * @protected\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.createBubbleContents =\n    goog.abstractMethod;\n\n\n/**\n * Register the handler for the target's CLICK event.\n * @param {Element} target The event source element.\n * @param {Function} handler The event handler.\n * @protected\n * @deprecated Use goog.editor.plugins.AbstractBubblePlugin.\n *     registerActionHandler to register click and enter events.\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.registerClickHandler =\n    function(target, handler) {\n  this.registerActionHandler(target, handler);\n};\n\n\n/**\n * Register the handler for the target's CLICK and ENTER key events.\n * @param {Element} target The event source element.\n * @param {Function} handler The event handler.\n * @protected\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.registerActionHandler =\n    function(target, handler) {\n  this.eventRegister.listenWithWrapper(\n      target, goog.events.actionEventWrapper, handler);\n};\n\n\n/**\n * Closes the bubble.\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.closeBubble = function() {\n  if (this.panelId_) {\n    this.getSharedBubble_().removePanel(this.panelId_);\n    this.handlePanelClosed_();\n  }\n};\n\n\n/**\n * Called after the bubble is shown. The default implementation does nothing.\n * Override it to provide your own one.\n * @protected\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.onShow = goog.nullFunction;\n\n\n/**\n * Called when the bubble is closed or hidden. The default implementation does\n * nothing.\n * @protected\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.cleanOnBubbleClose =\n    goog.nullFunction;\n\n\n/**\n * Handles when the bubble panel is closed.  Invoked when the entire bubble is\n * hidden and also directly when the panel is closed manually.\n * @private\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.handlePanelClosed_ =\n    function() {\n  this.targetElement_ = null;\n  this.panelId_ = null;\n  this.eventRegister.removeAll();\n  this.cleanOnBubbleClose();\n};\n\n\n/**\n * In case the keyboard navigation is enabled, this will set focus on the first\n * tabbable element in the bubble when TAB is clicked.\n * @override\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.handleKeyDown = function(e) {\n  if (this.keyboardNavigationEnabled_ && this.isVisible() &&\n      e.keyCode == goog.events.KeyCodes.TAB && !e.shiftKey) {\n    var bubbleEl = this.getSharedBubble_().getContentElement();\n    var tabbable = goog.dom.getElementByClass(\n        goog.editor.plugins.AbstractBubblePlugin.TABBABLE_CLASSNAME_, bubbleEl);\n    if (tabbable) {\n      tabbable.focus();\n      e.preventDefault();\n      return true;\n    }\n  }\n  return false;\n};\n\n\n/**\n * Handles a key event on the bubble. This ensures that the focus loops through\n * the tabbable elements found in the bubble and then the focus is got by the\n * field element.\n * @param {goog.events.BrowserEvent} e The event.\n * @private\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.onBubbleKey_ = function(e) {\n  if (this.isVisible() && e.keyCode == goog.events.KeyCodes.TAB) {\n    var bubbleEl = this.getSharedBubble_().getContentElement();\n    var tabbables = goog.dom.getElementsByClass(\n        goog.editor.plugins.AbstractBubblePlugin.TABBABLE_CLASSNAME_, bubbleEl);\n    var tabbable = e.shiftKey ? tabbables[0] : goog.array.peek(tabbables);\n    var tabbingOutOfBubble = tabbable == e.target;\n    if (tabbingOutOfBubble) {\n      this.getFieldObject().focus();\n      e.preventDefault();\n    }\n  }\n};\n\n\n/**\n * @return {boolean} Whether the bubble is visible.\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.isVisible = function() {\n  return !!this.panelId_;\n};\n\n\n/**\n * Reposition the property bubble.\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.reposition = function() {\n  var bubble = this.getSharedBubble_();\n  if (bubble) {\n    bubble.reposition();\n  }\n};\n\n\n/**\n * Helper method that creates option links (such as edit, test, remove)\n * @param {string} id String id for the span id.\n * @return {Element} The option link element.\n * @protected\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.createLinkOption = function(\n    id) {\n  // Dash plus link are together in a span so we can hide/show them easily\n  return this.dom_.createDom(\n      goog.dom.TagName.SPAN, {\n        id: id,\n        className:\n            goog.editor.plugins.AbstractBubblePlugin.OPTION_LINK_CLASSNAME_\n      },\n      this.dom_.createTextNode(\n          goog.editor.plugins.AbstractBubblePlugin.DASH_NBSP_STRING));\n};\n\n\n/**\n * Helper method that creates a link with text set to linkText and optionally\n * wires up a listener for the CLICK event or the link. The link is navigable by\n * tabs if `enableKeyboardNavigation(true)` was called.\n * @param {string} linkId The id of the link.\n * @param {string} linkText Text of the link.\n * @param {Function=} opt_onClick Optional function to call when the link is\n *     clicked.\n * @param {Element=} opt_container If specified, location to insert link. If no\n *     container is specified, the old link is removed and replaced.\n * @return {Element} The link element.\n * @protected\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.createLink = function(\n    linkId, linkText, opt_onClick, opt_container) {\n  var link = this.createLinkHelper(linkId, linkText, false, opt_container);\n  if (opt_onClick) {\n    this.registerActionHandler(link, opt_onClick);\n  }\n  return link;\n};\n\n\n/**\n * Helper method to create a link to insert into the bubble. The link is\n * navigable by tabs if `enableKeyboardNavigation(true)` was called.\n * @param {string} linkId The id of the link.\n * @param {string} linkText Text of the link.\n * @param {boolean} isAnchor Set to true to create an actual anchor tag\n *     instead of a span.  Actual links are right clickable (e.g. to open in\n *     a new window) and also update window status on hover.\n * @param {Element=} opt_container If specified, location to insert link. If no\n *     container is specified, the old link is removed and replaced.\n * @return {Element} The link element.\n * @protected\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.createLinkHelper = function(\n    linkId, linkText, isAnchor, opt_container) {\n  var link = this.dom_.createDom(\n      isAnchor ? goog.dom.TagName.A : goog.dom.TagName.SPAN,\n      {className: goog.editor.plugins.AbstractBubblePlugin.LINK_CLASSNAME_},\n      linkText);\n  if (this.keyboardNavigationEnabled_) {\n    this.setTabbable(link);\n  }\n  link.setAttribute('role', 'link');\n  this.setupLink(link, linkId, opt_container);\n  goog.editor.style.makeUnselectable(link, this.eventRegister);\n  return link;\n};\n\n\n/**\n * Makes the given element tabbable.\n *\n * <p>Elements created by createLink[Helper] are tabbable even without\n * calling this method. Call it for other elements if needed.\n *\n * <p>If tabindex is not already set in the element, this function sets it to 0.\n * You'll usually want to also call `enableKeyboardNavigation(true)`.\n *\n * @param {!Element} element\n * @protected\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.setTabbable = function(\n    element) {\n  if (!element.hasAttribute('tabindex')) {\n    element.setAttribute('tabindex', 0);\n  }\n  goog.dom.classlist.add(\n      element, goog.editor.plugins.AbstractBubblePlugin.TABBABLE_CLASSNAME_);\n};\n\n\n/**\n * Inserts a link in the given container if it is specified or removes\n * the old link with this id and replaces it with the new link\n * @param {Element} link Html element to insert.\n * @param {string} linkId Id of the link.\n * @param {Element=} opt_container If specified, location to insert link.\n * @protected\n */\ngoog.editor.plugins.AbstractBubblePlugin.prototype.setupLink = function(\n    link, linkId, opt_container) {\n  if (opt_container) {\n    opt_container.appendChild(link);\n  } else {\n    var oldLink = this.dom_.getElement(linkId);\n    if (oldLink) {\n      goog.dom.replaceNode(link, oldLink);\n    }\n  }\n\n  link.id = linkId;\n};\n","^AK",1579837703000,"^AL",["^AM",["^BL","^AN","~$goog.functions","^BC","^BD","^BT","^AA","^BH","^BU","~$goog.editor.Plugin","~$goog.ui.editor.Bubble","~$goog.events.actionEventWrapper","~$goog.string.Unicode","~$goog.editor.style","~$goog.dom.Range","^DH","^AR","^CS","^BJ"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/editor/plugins/abstractbubbleplugin.js"],"^B6",["^AM",["~$goog.editor.plugins.AbstractBubblePlugin"]],"^A?",true,"^A@",["^AA","^AR","^BL","^BD","^F9","^BJ","^BC","^F4","^F8","^CS","^AN","^BU","^DH","^F6","^F3","^F7","^BT","^F5","^BH"]],["^ ","^AC",[1579837703000],"^AD","goog.structs.set.js","^AE",["^AF","goog/structs/set.js"],"^AG","goog/structs/set.js","^AH","^AI","^AJ","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Datastructure: Set.\n *\n * @author arv@google.com (Erik Arvidsson)\n *\n * This class implements a set data structure. Adding and removing is O(1). It\n * supports both object and primitive values. Be careful because you can add\n * both 1 and new Number(1), because these are not the same. You can even add\n * multiple new Number(1) because these are not equal.\n */\n\n\ngoog.provide('goog.structs.Set');\n\ngoog.require('goog.structs');\ngoog.require('goog.structs.Collection');\ngoog.require('goog.structs.Map');\n\n/**\n * A set that can contain both primitives and objects.  Adding and removing\n * elements is O(1).  Primitives are treated as identical if they have the same\n * type and convert to the same string.  Objects are treated as identical only\n * if they are references to the same object.  WARNING: A goog.structs.Set can\n * contain both 1 and (new Number(1)), because they are not the same.  WARNING:\n * Adding (new Number(1)) twice will yield two distinct elements, because they\n * are two different objects.  WARNING: Any object that is added to a\n * goog.structs.Set will be modified!  Because goog.getUid() is used to\n * identify objects, every object in the set will be mutated.\n * @param {Array<T>|Object<?,T>=} opt_values Initial values to start with.\n * @constructor\n * @implements {goog.structs.Collection<T>}\n * @final\n * @template T\n * @deprecated This type is misleading: use ES6 Set instead.\n */\ngoog.structs.Set = function(opt_values) {\n  this.map_ = new goog.structs.Map;\n  if (opt_values) {\n    this.addAll(opt_values);\n  }\n};\n\n/**\n * A function that returns a unique id.\n * @private @const {function(?Object): number}\n */\ngoog.structs.Set.getUid_ = goog.getUid;\n\n\n/**\n * Obtains a unique key for an element of the set.  Primitives will yield the\n * same key if they have the same type and convert to the same string.  Object\n * references will yield the same key only if they refer to the same object.\n * @param {*} val Object or primitive value to get a key for.\n * @return {string} A unique key for this value/object.\n * @private\n */\ngoog.structs.Set.getKey_ = function(val) {\n  var type = typeof val;\n  if (type == 'object' && val || type == 'function') {\n    return 'o' + goog.structs.Set.getUid_(/** @type {Object} */ (val));\n  } else {\n    return type.substr(0, 1) + val;\n  }\n};\n\n\n/**\n * @return {number} The number of elements in the set.\n * @override\n */\ngoog.structs.Set.prototype.getCount = function() {\n  return this.map_.getCount();\n};\n\n\n/**\n * Add a primitive or an object to the set.\n * @param {T} element The primitive or object to add.\n * @override\n */\ngoog.structs.Set.prototype.add = function(element) {\n  this.map_.set(goog.structs.Set.getKey_(element), element);\n};\n\n\n/**\n * Adds all the values in the given collection to this set.\n * @param {Array<T>|goog.structs.Collection<T>|Object<?,T>} col A collection\n *     containing the elements to add.\n */\ngoog.structs.Set.prototype.addAll = function(col) {\n  var values = goog.structs.getValues(col);\n  var l = values.length;\n  for (var i = 0; i < l; i++) {\n    this.add(values[i]);\n  }\n};\n\n\n/**\n * Removes all values in the given collection from this set.\n * @param {Array<T>|goog.structs.Collection<T>|Object<?,T>} col A collection\n *     containing the elements to remove.\n */\ngoog.structs.Set.prototype.removeAll = function(col) {\n  var values = goog.structs.getValues(col);\n  var l = values.length;\n  for (var i = 0; i < l; i++) {\n    this.remove(values[i]);\n  }\n};\n\n\n/**\n * Removes the given element from this set.\n * @param {T} element The primitive or object to remove.\n * @return {boolean} Whether the element was found and removed.\n * @override\n */\ngoog.structs.Set.prototype.remove = function(element) {\n  return this.map_.remove(goog.structs.Set.getKey_(element));\n};\n\n\n/**\n * Removes all elements from this set.\n */\ngoog.structs.Set.prototype.clear = function() {\n  this.map_.clear();\n};\n\n\n/**\n * Tests whether this set is empty.\n * @return {boolean} True if there are no elements in this set.\n */\ngoog.structs.Set.prototype.isEmpty = function() {\n  return this.map_.isEmpty();\n};\n\n\n/**\n * Tests whether this set contains the given element.\n * @param {T} element The primitive or object to test for.\n * @return {boolean} True if this set contains the given element.\n * @override\n */\ngoog.structs.Set.prototype.contains = function(element) {\n  return this.map_.containsKey(goog.structs.Set.getKey_(element));\n};\n\n\n/**\n * Tests whether this set contains all the values in a given collection.\n * Repeated elements in the collection are ignored, e.g.  (new\n * goog.structs.Set([1, 2])).containsAll([1, 1]) is True.\n * @param {goog.structs.Collection<T>|Object} col A collection-like object.\n * @return {boolean} True if the set contains all elements.\n */\ngoog.structs.Set.prototype.containsAll = function(col) {\n  return goog.structs.every(col, this.contains, this);\n};\n\n\n/**\n * Finds all values that are present in both this set and the given collection.\n * @param {Array<S>|Object<?,S>} col A collection.\n * @return {!goog.structs.Set<T|S>} A new set containing all the values\n *     (primitives or objects) present in both this set and the given\n *     collection.\n * @template S\n */\ngoog.structs.Set.prototype.intersection = function(col) {\n  var result = new goog.structs.Set();\n\n  var values = goog.structs.getValues(col);\n  for (var i = 0; i < values.length; i++) {\n    var value = values[i];\n    if (this.contains(value)) {\n      result.add(value);\n    }\n  }\n\n  return result;\n};\n\n\n/**\n * Finds all values that are present in this set and not in the given\n * collection.\n * @param {Array<T>|goog.structs.Collection<T>|Object<?,T>} col A collection.\n * @return {!goog.structs.Set} A new set containing all the values\n *     (primitives or objects) present in this set but not in the given\n *     collection.\n */\ngoog.structs.Set.prototype.difference = function(col) {\n  var result = this.clone();\n  result.removeAll(col);\n  return result;\n};\n\n\n/**\n * Returns an array containing all the elements in this set.\n * @return {!Array<T>} An array containing all the elements in this set.\n */\ngoog.structs.Set.prototype.getValues = function() {\n  return this.map_.getValues();\n};\n\n\n/**\n * Creates a shallow clone of this set.\n * @return {!goog.structs.Set<T>} A new set containing all the same elements as\n *     this set.\n */\ngoog.structs.Set.prototype.clone = function() {\n  return new goog.structs.Set(this);\n};\n\n\n/**\n * Tests whether the given collection consists of the same elements as this set,\n * regardless of order, without repetition.  Primitives are treated as equal if\n * they have the same type and convert to the same string; objects are treated\n * as equal if they are references to the same object.  This operation is O(n).\n * @param {goog.structs.Collection<T>|Object} col A collection.\n * @return {boolean} True if the given collection consists of the same elements\n *     as this set, regardless of order, without repetition.\n */\ngoog.structs.Set.prototype.equals = function(col) {\n  return this.getCount() == goog.structs.getCount(col) && this.isSubsetOf(col);\n};\n\n\n/**\n * Tests whether the given collection contains all the elements in this set.\n * Primitives are treated as equal if they have the same type and convert to the\n * same string; objects are treated as equal if they are references to the same\n * object.  This operation is O(n).\n * @param {goog.structs.Collection<T>|Object} col A collection.\n * @return {boolean} True if this set is a subset of the given collection.\n */\ngoog.structs.Set.prototype.isSubsetOf = function(col) {\n  var colCount = goog.structs.getCount(col);\n  if (this.getCount() > colCount) {\n    return false;\n  }\n  // TODO(user) Find the minimal collection size where the conversion makes\n  // the contains() method faster.\n  if (!(col instanceof goog.structs.Set) && colCount > 5) {\n    // Convert to a goog.structs.Set so that goog.structs.contains runs in\n    // O(1) time instead of O(n) time.\n    col = new goog.structs.Set(col);\n  }\n  return goog.structs.every(\n      this, function(value) { return goog.structs.contains(col, value); });\n};\n\n\n/**\n * Returns an iterator that iterates over the elements in this set.\n * @param {boolean=} opt_keys This argument is ignored.\n * @return {!goog.iter.Iterator} An iterator over the elements in this set.\n */\ngoog.structs.Set.prototype.__iterator__ = function(opt_keys) {\n  return this.map_.__iterator__(false);\n};\n","^AK",1579837703000,"^AL",["^AM",["~$goog.structs.Collection","^DB","^AA","~$goog.structs"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/structs/set.js"],"^B6",["^AM",["~$goog.structs.Set"]],"^A?",true,"^A@",["^AA","^F<","^F;","^DB"]],["^ ","^AC",[1579837703000],"^B?",true,"^AD","goog.useragent.adobereader.js","^AE",["^AF","goog/useragent/adobereader.js"],"^AG","goog/useragent/adobereader.js","^AH","^AI","^AJ","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Detects the Adobe Reader PDF browser plugin.\n *\n * @author chrisn@google.com (Chris Nokleberg)\n * @see ../demos/useragent.html\n */\n\ngoog.module('goog.userAgent.adobeReader');\ngoog.module.declareLegacyNamespace();\n\nvar googString = goog.require('goog.string');\nvar userAgent = goog.require('goog.userAgent');\n\n\nvar version = '';\nif (userAgent.IE) {\n  var detectOnIe = function(classId) {\n    try {\n      new ActiveXObject(classId);\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  };\n  if (detectOnIe('AcroPDF.PDF.1')) {\n    version = '7';\n  } else if (detectOnIe('PDF.PdfCtrl.6')) {\n    version = '6';\n  }\n  // TODO(chrisn): Add detection for previous versions if anyone needs them.\n} else {\n  if (navigator.mimeTypes && navigator.mimeTypes.length > 0) {\n    var mimeType = navigator.mimeTypes['application/pdf'];\n    if (mimeType && mimeType.enabledPlugin) {\n      var description = mimeType.enabledPlugin.description;\n      if (description && description.indexOf('Adobe') != -1) {\n        // Newer plugins do not include the version in the description, so we\n        // default to 7.\n        version = description.indexOf('Version') != -1 ?\n            description.split('Version')[1] :\n            '7';\n      }\n    }\n  }\n}\n\n/**\n * Whether we detect the user has the Adobe Reader browser plugin installed.\n * @type {boolean}\n */\nexports.HAS_READER = !!version;\n\n\n/**\n * The version of the installed Adobe Reader plugin. Versions after 7\n * will all be reported as '7'.\n * @type {string}\n */\nexports.VERSION = version;\n\n\n/**\n * On certain combinations of platform/browser/plugin, a print dialog\n * can be shown for PDF files without a download dialog or making the\n * PDF visible to the user, by loading the PDF into a hidden iframe.\n *\n * Currently this variable is true if Adobe Reader version 6 or later\n * is detected on Windows.\n *\n * @type {boolean}\n */\nexports.SILENT_PRINT =\n    userAgent.WINDOWS && googString.compareVersions(version, '6') >= 0;\n","^AK",1579837703000,"^AL",["^AM",["^BF","^AA","^BH"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/useragent/adobereader.js"],"^B6",["^AM",["~$goog.userAgent.adobeReader"]],"^A?",true,"^A@",["^AA","^BF","^BH"]],["^ ","^AC",[1579837703000],"^AD","goog.locale.scriptToLanguages.js","^AE",["^AF","goog/locale/scriptToLanguages.js"],"^AG","goog/locale/scriptToLanguages.js","^AH","^AI","^AJ","// Copyright 2008 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Script to Languages mapping. Typically, one script is used by\n * many languages of the world. This map captures that information as a mapping\n * from script to array of two letter or three letter language codes.\n *\n * This map is used by goog.locale.genericFontNames for listing\n * font fallbacks for a font family for a locale. That file\n * uses this map in conjunction with goog.locale.genericFontNamesData.\n *\n * Warning: this file is automatically generated from CLDR.\n * Please contact i18n team or change the script and regenerate data.\n * Code location: http://go/generate_genericfontnames.py\n *\n */\n\n// clang-format off\n\n/**\n * Namespace for Script to Languages mapping\n */\ngoog.provide('goog.locale.scriptToLanguages');\n\ngoog.require('goog.locale');\n\n/**\n * The script code to list of language codes map.\n * @type {!Object<string, !Array<string>>}\n */\n\n/* ~!@# genmethods.scriptToLanguages() #@!~ */\ngoog.locale.scriptToLanguages = {\n  'Arab': [\n    'prd',\n    'doi',\n    'lah',\n    'uz',\n    'cjm',\n    'swb',\n    'az',\n    'ps',\n    'ur',\n    'ks',\n    'fa',\n    'ar',\n    'tk',\n    'ku',\n    'tg',\n    'bal',\n    'ha',\n    'ky',\n    'ug',\n    'sd'\n  ],\n  'Armn': ['hy'],\n  'Beng': [\n    'mni',\n    'grt',\n    'bn',\n    'syl',\n    'as',\n    'ril',\n    'ccp'\n  ],\n  'Blis': ['zbl'],\n  'Cans': [\n    'cr',\n    'iu',\n    'cwd',\n    'crk'\n  ],\n  'Cham': ['cja'],\n  'Cher': ['chr'],\n  'Cyrl': [\n    'ab',\n    'rom',\n    'mns',\n    'mdf',\n    'ce',\n    'myv',\n    'ude',\n    'sah',\n    'inh',\n    'uk',\n    'tab',\n    'av',\n    'yrk',\n    'az',\n    'cv',\n    'koi',\n    'ru',\n    'dng',\n    'sel',\n    'tt',\n    'chm',\n    'ady',\n    'tyv',\n    'abq',\n    'kum',\n    'xal',\n    'tg',\n    'cjs',\n    'tk',\n    'be',\n    'kaa',\n    'bg',\n    'kca',\n    'ba',\n    'nog',\n    'krl',\n    'bxr',\n    'kbd',\n    'dar',\n    'krc',\n    'lez',\n    'ttt',\n    'udm',\n    'evn',\n    'kpv',\n    'uz',\n    'kk',\n    'kpy',\n    'kjh',\n    'mn',\n    'gld',\n    'mk',\n    'ckt',\n    'aii',\n    'kv',\n    'ku',\n    'sr',\n    'lbe',\n    'ky',\n    'os'\n  ],\n  'Deva': [\n    'btv',\n    'kfr',\n    'bho',\n    'mr',\n    'bhb',\n    'bjj',\n    'hi',\n    'mag',\n    'mai',\n    'awa',\n    'lif',\n    'xsr',\n    'mwr',\n    'kok',\n    'gon',\n    'hne',\n    'hoc',\n    'gbm',\n    'hoj',\n    'ne',\n    'kru',\n    'ks',\n    'bra',\n    'bft',\n    'new',\n    'bfy',\n    'sd'\n  ],\n  'Ethi': [\n    'byn',\n    'wal',\n    'ti',\n    'tig',\n    'am'\n  ],\n  'Geor': ['ka'],\n  'Grek': ['el'],\n  'Gujr': ['gu'],\n  'Guru': ['pa'],\n  'Hans': [\n    'zh',\n    'za'\n  ],\n  'Hant': ['zh'],\n  'Hebr': [\n    'lad',\n    'yi',\n    'he'\n  ],\n  'Jpan': ['ja'],\n  'Khmr': ['km'],\n  'Knda': [\n    'kn',\n    'tcy'\n  ],\n  'Kore': ['ko'],\n  'Laoo': ['lo'],\n  'Latn': [\n    'gv',\n    'sco',\n    'scn',\n    'mfe',\n    'hnn',\n    'suk',\n    'tkl',\n    'gd',\n    'ga',\n    'gn',\n    'gl',\n    'rom',\n    'hai',\n    'lb',\n    'la',\n    'ln',\n    'tsg',\n    'tr',\n    'ts',\n    'li',\n    'lv',\n    'to',\n    'lt',\n    'lu',\n    'tk',\n    'tg',\n    'fo',\n    'fil',\n    'bya',\n    'bin',\n    'kcg',\n    'ceb',\n    'amo',\n    'yao',\n    'mos',\n    'dyu',\n    'de',\n    'tbw',\n    'da',\n    'fan',\n    'st',\n    'hil',\n    'fon',\n    'efi',\n    'tl',\n    'qu',\n    'uz',\n    'kpe',\n    'ban',\n    'bal',\n    'gor',\n    'tru',\n    'mo',\n    'mdh',\n    'en',\n    'tem',\n    'ee',\n    'tvl',\n    'cr',\n    'eu',\n    'et',\n    'tet',\n    'nbf',\n    'es',\n    'rw',\n    'lut',\n    'kmb',\n    'ast',\n    'sms',\n    'lua',\n    'sus',\n    'smj',\n    'fy',\n    'tmh',\n    'rm',\n    'rn',\n    'ro',\n    'dsb',\n    'sma',\n    'luo',\n    'hsb',\n    'wa',\n    'lg',\n    'wo',\n    'bm',\n    'jv',\n    'men',\n    'bi',\n    'tum',\n    'br',\n    'bs',\n    'smn',\n    'om',\n    'ace',\n    'ilo',\n    'ty',\n    'oc',\n    'srr',\n    'krl',\n    'tw',\n    'nds',\n    'os',\n    'xh',\n    'ch',\n    'co',\n    'nso',\n    'ca',\n    'sn',\n    'eo',\n    'son',\n    'pon',\n    'cy',\n    'cs',\n    'kfo',\n    'fj',\n    'tn',\n    'srn',\n    'pt',\n    'sm',\n    'chk',\n    'bbc',\n    'chm',\n    'lol',\n    'frs',\n    'frr',\n    'chr',\n    'yap',\n    'vi',\n    'kos',\n    'gil',\n    'ak',\n    'pl',\n    'sid',\n    'hr',\n    'ht',\n    'hu',\n    'hmn',\n    'ho',\n    'gag',\n    'buc',\n    'ha',\n    'bug',\n    'gaa',\n    'mg',\n    'fur',\n    'bem',\n    'ibb',\n    'mi',\n    'mh',\n    'war',\n    'mt',\n    'uli',\n    'ms',\n    'sr',\n    'haw',\n    'sq',\n    'aa',\n    've',\n    'af',\n    'gwi',\n    'is',\n    'it',\n    'sv',\n    'ii',\n    'sas',\n    'ik',\n    'tpi',\n    'zu',\n    'ay',\n    'kha',\n    'az',\n    'tzm',\n    'id',\n    'ig',\n    'pap',\n    'nl',\n    'pau',\n    'nn',\n    'no',\n    'na',\n    'nb',\n    'nd',\n    'umb',\n    'ng',\n    'ny',\n    'nap',\n    'gcr',\n    'nyn',\n    'hop',\n    'lis',\n    'so',\n    'nr',\n    'pam',\n    'nv',\n    'kv',\n    'kab',\n    'fr',\n    'nym',\n    'kaj',\n    'rcf',\n    'yo',\n    'snk',\n    'kam',\n    'dgr',\n    'mad',\n    'fi',\n    'mak',\n    'niu',\n    'kg',\n    'pag',\n    'gsw',\n    'ss',\n    'kj',\n    'ki',\n    'min',\n    'sw',\n    'cpe',\n    'su',\n    'kl',\n    'sk',\n    'kr',\n    'kw',\n    'cch',\n    'ku',\n    'sl',\n    'sg',\n    'tiv',\n    'se'\n  ],\n  'Lepc': ['lep'],\n  'Limb': ['lif'],\n  'Mlym': ['ml'],\n  'Mong': [\n    'mnc',\n    'mn'\n  ],\n  'Mymr': [\n    'my',\n    'kht',\n    'shn',\n    'mnw'\n  ],\n  'Nkoo': [\n    'nqo',\n    'emk'\n  ],\n  'Orya': ['or'],\n  'Sinh': ['si'],\n  'Tale': ['tdd'],\n  'Talu': ['khb'],\n  'Taml': [\n    'bfq',\n    'ta'\n  ],\n  'Telu': [\n    'te',\n    'gon',\n    'lmn'\n  ],\n  'Tfng': ['tzm'],\n  'Thaa': ['dv'],\n  'Thai': [\n    'tts',\n    'lwl',\n    'th',\n    'kdt',\n    'lcp'\n  ],\n  'Tibt': [\n    'bo',\n    'dz'\n  ],\n  'Yiii': ['ii'],\n  'und': ['sat']\n};\n/* ~!@# END #@!~ */\n","^AK",1579837703000,"^AL",["^AM",["^AA","~$goog.locale"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/locale/scriptToLanguages.js"],"^B6",["^AM",["~$goog.locale.scriptToLanguages"]],"^A?",true,"^A@",["^AA","^F?"]],["^ ","^AC",[1579837703000],"^AD","goog.positioning.anchoredviewportposition.js","^AE",["^AF","goog/positioning/anchoredviewportposition.js"],"^AG","goog/positioning/anchoredviewportposition.js","^AH","^AI","^AJ","// Copyright 2006 The Closure Library Authors. All Rights Reserved.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//      http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS-IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n/**\n * @fileoverview Anchored viewport positioning class.\n *\n * @author eae@google.com (Emil A Eklund)\n */\n\ngoog.provide('goog.positioning.AnchoredViewportPosition');\n\ngoog.require('goog.positioning');\ngoog.require('goog.positioning.AnchoredPosition');\ngoog.require('goog.positioning.Overflow');\ngoog.require('goog.positioning.OverflowStatus');\n\n\n\n/**\n * Encapsulates a popup position where the popup is anchored at a corner of\n * an element. The corners are swapped if dictated by the viewport. For instance\n * if a popup is anchored with its top left corner to the bottom left corner of\n * the anchor the popup is either displayed below the anchor (as specified) or\n * above it if there's not enough room to display it below.\n *\n * When using this positioning object it's recommended that the movable element\n * be absolutely positioned.\n *\n * @param {Element} anchorElement Element the movable element should be\n *     anchored against.\n * @param {goog.positioning.Corner} corner Corner of anchored element the\n *     movable element should be positioned at.\n * @param {boolean=} opt_adjust Whether the positioning should be adjusted until\n *     the element fits inside the viewport even if that means that the anchored\n *     corners are ignored.\n * @param {goog.math.Box=} opt_overflowConstraint Box object describing the\n *     dimensions in which the movable element could be shown.\n * @constructor\n * @extends {goog.positioning.AnchoredPosition}\n */\ngoog.positioning.AnchoredViewportPosition = function(\n    anchorElement, corner, opt_adjust, opt_overflowConstraint) {\n  goog.positioning.AnchoredPosition.call(this, anchorElement, corner);\n\n  /**\n   * The last resort algorithm to use if the algorithm can't fit inside\n   * the viewport.\n   *\n   * IGNORE = do nothing, just display at the preferred position.\n   *\n   * ADJUST_X | ADJUST_Y = Adjust until the element fits, even if that means\n   * that the anchored corners are ignored.\n   *\n   * @type {number}\n   * @private\n   */\n  this.lastResortOverflow_ = opt_adjust ? (goog.positioning.Overflow.ADJUST_X |\n                                           goog.positioning.Overflow.ADJUST_Y) :\n                                          goog.positioning.Overflow.IGNORE;\n\n  /**\n   * The dimensions in which the movable element could be shown.\n   * @type {goog.math.Box|undefined}\n   * @private\n   */\n  this.overflowConstraint_ = opt_overflowConstraint || undefined;\n};\ngoog.inherits(\n    goog.positioning.AnchoredViewportPosition,\n    goog.positioning.AnchoredPosition);\n\n\n/**\n * @return {goog.math.Box|undefined} The box object describing the\n *     dimensions in which the movable element will be shown.\n */\ngoog.positioning.AnchoredViewportPosition.prototype.getOverflowConstraint =\n    function() {\n  return this.overflowConstraint_;\n};\n\n\n/**\n * @param {goog.math.Box|undefined} overflowConstraint Box object describing the\n *     dimensions in which the movable element could be shown.\n */\ngoog.positioning.AnchoredViewportPosition.prototype.setOverflowConstraint =\n    function(overflowConstraint) {\n  this.overflowConstraint_ = overflowConstraint;\n};\n\n\n/**\n * @return {number} A bitmask for the \"last resort\" overflow.\n */\ngoog.positioning.AnchoredViewportPosition.prototype.getLastResortOverflow =\n    function() {\n  return this.lastResortOverflow_;\n};\n\n\n/**\n * @param {number} lastResortOverflow A bitmask for the \"last resort\" overflow,\n *     if we fail to fit the element on-screen.\n */\ngoog.positioning.AnchoredViewportPosition.prototype.setLastResortOverflow =\n    function(lastResortOverflow) {\n  this.lastResortOverflow_ = lastResortOverflow;\n};\n\n\n/**\n * Repositions the movable element.\n *\n * @param {Element} movableElement Element to position.\n * @param {goog.positioning.Corner} movableCorner Corner of the movable element\n *     that should be positioned adjacent to the anchored element.\n * @param {goog.math.Box=} opt_margin A margin specified in pixels.\n * @param {goog.math.Size=} opt_preferredSize The preferred size of the\n *     movableElement.\n * @override\n */\ngoog.positioning.AnchoredViewportPosition.prototype.reposition = function(\n    movableElement, movableCorner, opt_margin, opt_preferredSize) {\n  var status = goog.positioning.positionAtAnchor(\n      this.element, this.corner, movableElement, movableCorner, null,\n      opt_margin,\n      goog.positioning.Overflow.FAIL_X | goog.positioning.Overflow.FAIL_Y,\n      opt_preferredSize, this.overflowConstraint_);\n\n  // If the desired position is outside the viewport try mirroring the corners\n  // horizontally or vertically.\n  if (status & goog.positioning.OverflowStatus.FAILED) {\n    var cornerFallback = this.adjustCorner(status, this.corner);\n    var movableCornerFallback = this.adjustCorner(status, movableCorner);\n\n    status = goog.positioning.positionAtAnchor(\n        this.element, cornerFallback, movableElement, movableCornerFallback,\n        null, opt_margin,\n        goog.positioning.Overflow.FAIL_X | goog.positioning.Overflow.FAIL_Y,\n        opt_preferredSize, this.overflowConstraint_);\n\n    if (status & goog.positioning.OverflowStatus.FAILED) {\n      // If that also fails, pick the best corner from the two tries,\n      // and adjust the position until it fits.\n      cornerFallback = this.adjustCorner(status, cornerFallback);\n      movableCornerFallback = this.adjustCorner(status, movableCornerFallback);\n\n      goog.positioning.positionAtAnchor(\n          this.element, cornerFallback, movableElement, movableCornerFallback,\n          null, opt_margin, this.getLastResortOverflow(), opt_preferredSize,\n          this.overflowConstraint_);\n    }\n  }\n};\n\n\n/**\n * Adjusts the corner if X or Y positioning failed.\n * @param {number} status The status of the last positionAtAnchor call.\n * @param {goog.positioning.Corner} corner The corner to adjust.\n * @return {goog.positioning.Corner} The adjusted corner.\n * @protected\n */\ngoog.positioning.AnchoredViewportPosition.prototype.adjustCorner = function(\n    status, corner) {\n  if (status & goog.positioning.OverflowStatus.FAILED_HORIZONTAL) {\n    corner = goog.positioning.flipCornerHorizontal(corner);\n  }\n\n  if (status & goog.positioning.OverflowStatus.FAILED_VERTICAL) {\n    corner = goog.positioning.flipCornerVertical(corner);\n  }\n\n  return corner;\n};\n","^AK",1579837703000,"^AL",["^AM",["~$goog.positioning.AnchoredPosition","~$goog.positioning","^AA","~$goog.positioning.Overflow","~$goog.positioning.OverflowStatus"]],"^AS",["^ ","^AT","The Google Closure Library is a collection of JavaScript code\n        designed for use with the Google Closure JavaScript Compiler.\n\n        This non-official distribution was prepared by the ClojureScript\n        team at http://clojure.org/","^AU","^AV","^AW","^AX","^AY","Google Closure Library","^AZ","^A[","^B0","http://code.google.com/p/closure-library/","^B1","^B2","^B3",["^A[","0.0-20191016-6ae1f72f"],"^B4","0.0-20191016-6ae1f72f"],"^B0",["^B5","jar:file:/Users/clojure/.m2/repository/org/clojure/google-closure-library/0.0-20191016-6ae1f72f/google-closure-library-0.0-20191016-6ae1f72f.jar!/goog/positioning/anchoredviewportposition.js"],"^B6",["^AM",["^EQ"]],"^A?",true,"^A@",["^AA","^FB","^FA","^FC","^FD"]]],"~:data-readers",null,"~:shadow.build.classpath/CACHE-TIMESTAMP",1585692398000]